File: figure_common.h

package info (click to toggle)
mysql-workbench 6.3.8%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 113,932 kB
  • ctags: 87,814
  • sloc: ansic: 955,521; cpp: 427,465; python: 59,728; yacc: 59,129; xml: 54,204; sql: 7,091; objc: 965; makefile: 638; sh: 613; java: 237; perl: 30; ruby: 6; php: 1
file content (268 lines) | stat: -rw-r--r-- 9,871 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
/* 
 * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; version 2 of the
 * License.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301  USA
 */
#ifndef _FIGURE_COMMON_H_
#define _FIGURE_COMMON_H_

#include "mdc.h"

#include <algorithm>

#include "wbpublic_public_interface.h"
#include <grts/structs.model.h>

namespace wbfig {

/** Abstract class to be overridden by diagram class which will receive events from various objects in canvas.
 */
class FigureEventHub
{
public:
  virtual bool figure_click(const model_ObjectRef &owner, mdc::CanvasItem *target, 
    const base::Point &point, mdc::MouseButton button, mdc::EventState state)= 0;
  virtual bool figure_double_click(const model_ObjectRef &owner, mdc::CanvasItem *target,
    const base::Point &point, mdc::MouseButton button, mdc::EventState state)= 0;
  virtual bool figure_button_press(const model_ObjectRef &owner, mdc::CanvasItem *target,
    const base::Point &point, mdc::MouseButton button, mdc::EventState state)= 0;
  virtual bool figure_button_release(const model_ObjectRef &owner, mdc::CanvasItem *target,
    const base::Point &point, mdc::MouseButton button, mdc::EventState state)= 0;
  virtual bool figure_enter(const model_ObjectRef &owner, mdc::CanvasItem *target,
    const base::Point &point)= 0;
  virtual bool figure_leave(const model_ObjectRef &owner, mdc::CanvasItem *target,
    const base::Point &point)= 0;
};

class BaseFigure;
  
class WBPUBLICBACKEND_PUBLIC_FUNC Titlebar : public mdc::Box
{
  typedef mdc::Box super;
public:
  Titlebar(mdc::Layer *layer, FigureEventHub *hub, BaseFigure *owner, bool expander);
  virtual ~Titlebar();

  void set_icon(cairo_surface_t *icon);
  void set_title(const std::string &text);
  
  inline const std::string &get_title() const { return _icon_text.get_text(); }

  void set_color(const base::Color &color);
  void set_text_color(const base::Color &color);
  void set_font(const mdc::FontSpec &font);
  const mdc::FontSpec &get_font() { return _icon_text.get_font(); }
  void set_rounded(mdc::CornerMask corners);
  void set_border_color(const base::Color &color);

  void set_expanded(bool flag);
  bool get_expanded();

  virtual void set_auto_sizing(bool flag);

  void auto_size() { _icon_text.auto_size(); }

  boost::signals2::signal<void (bool)>* signal_expand_toggle() { return &_signal_expand_toggle; }

protected:
  FigureEventHub *_hub;
  BaseFigure *_owner;

  mdc::IconTextFigure _icon_text;
  mdc::Button *_expander;

  base::Color _back_color;
  mdc::CornerMask _corners;
  base::Color _border_color;

  boost::signals2::signal<void (bool)> _signal_expand_toggle; 
  
  void expand_toggled();

  virtual void render(mdc::CairoCtx *cr);

  virtual bool on_click(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_double_click(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_button_press(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_button_release(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_enter(mdc::CanvasItem *target, const base::Point &point);
  virtual bool on_leave(mdc::CanvasItem *target, const base::Point &point);
};


class WBPUBLICBACKEND_PUBLIC_FUNC CaptionFigure : public mdc::TextFigure
{
  typedef mdc::TextFigure super;
  
  FigureEventHub *_hub; 
  model_Object *_owner_object;

  virtual bool on_click(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_double_click(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_button_press(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_button_release(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_enter(mdc::CanvasItem *target, const base::Point &point);
  virtual bool on_leave(mdc::CanvasItem *target, const base::Point &point);

public:
  CaptionFigure(mdc::Layer *layer, FigureEventHub *hub, model_Object *owner);
};



class WBPUBLICBACKEND_PUBLIC_FUNC FigureItem : public mdc::IconTextFigure
{
  typedef mdc::IconTextFigure super;

  FigureEventHub *_hub; 
  BaseFigure *_owner;
  
  std::string _object_id;
  bool _dirty;

  virtual bool on_click(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_double_click(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_button_press(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_button_release(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_enter(mdc::CanvasItem *target, const base::Point &point);
  virtual bool on_leave(mdc::CanvasItem *target, const base::Point &point);
  
  virtual void draw_state(mdc::CairoCtx *cr);
  virtual base::Point get_intersection_with_line_to(const base::Point &p);
  virtual base::Rect get_root_bounds() const;

public:
  FigureItem(mdc::Layer *layer, FigureEventHub *hub, BaseFigure *owner);

  std::string get_id() { return _object_id; }
  void set_id(const std::string &id) { _object_id= id; }
  void set_dirty(bool flag= true) { _dirty= flag; }
  bool get_dirty() { return _dirty; }
};


class WBPUBLICBACKEND_PUBLIC_FUNC BaseFigure : public mdc::Box
{
  typedef mdc::Box super;

public:
  typedef std::list<FigureItem*> ItemList;

  // default implementation just sets background color
  virtual void unset_color();
  virtual void set_color(const base::Color &color);

  virtual void set_title_font(const mdc::FontSpec &font) {}
  virtual void set_content_font(const mdc::FontSpec &font);
  
  virtual void highlight(const base::Color *color= 0);
  virtual void unhighlight();

  virtual void set_allow_manual_resizing(bool flag);

  boost::signals2::signal<void (base::Rect)>* signal_interactive_resize() { return &_signal_interactive_resize; }

  boost::signals2::signal<void (FigureItem*)>* signal_item_added() { return &_signal_item_added; }

  virtual void toggle(bool flag) {}
  virtual void set_state_drawing(bool flag);
  
  model_ObjectRef represented_object() { return model_ObjectRef(_represented_object); }

  bool in_user_resize() const { return _resizing; }
  
protected:
  BaseFigure(mdc::Layer *layer, FigureEventHub *hub, const model_ObjectRef &object);

  FigureEventHub *_hub;
  model_Object *_represented_object;
  
  boost::signals2::signal<void (base::Rect)> _signal_interactive_resize;
  boost::signals2::signal<void (FigureItem*)> _signal_item_added;

  base::Rect _initial_bounds;
  mdc::FontSpec _content_font;
  bool _manual_resizing;
  bool _resizing;

  void invalidate_min_sizes();
  static void invalidate_min_sizes(mdc::CanvasItem *item);
  
  typedef boost::function<FigureItem* (mdc::Layer*, FigureEventHub*)> CreateItemSlot;
  typedef boost::function<void (FigureItem*)> UpdateItemSlot;

  virtual ItemList::iterator begin_sync(mdc::Box &box, ItemList &list);
  virtual ItemList::iterator sync_next(mdc::Box &box, ItemList &list,
                               ItemList::iterator iter,
                               const std::string &id,
                               cairo_surface_t *icon,
                               const std::string &text,
                               const CreateItemSlot &create_item= CreateItemSlot(),
                               const UpdateItemSlot &update_item= UpdateItemSlot());
  

  virtual void end_sync(mdc::Box &box, ItemList &list, ItemList::iterator iter);

  virtual bool on_click(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_double_click(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_button_press(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_button_release(mdc::CanvasItem *target, const base::Point &point,
    mdc::MouseButton button, mdc::EventState state);
  virtual bool on_enter(mdc::CanvasItem *target, const base::Point &point);
  virtual bool on_leave(mdc::CanvasItem *target, const base::Point &point);
  
  virtual bool on_drag_handle(mdc::ItemHandle *handle, const base::Point &pos, bool dragging);
};

  
class WBPUBLICBACKEND_PUBLIC_FUNC ShrinkableBox : public mdc::Box
{
  typedef mdc::Box super;
  
  int _limit_item_count;
  int _hidden_item_count;
  float _visible_part_size;
  bool _manual_resizing;
  
  virtual void render(mdc::CairoCtx *cr);
  virtual void resize_to(const base::Size &size);
public:
  ShrinkableBox(mdc::Layer *layer, mdc::Box::Orientation orientation);
  virtual base::Size calc_min_size();
  
  void set_item_count_limit(int limit);
  
  void set_allow_manual_resizing(bool flag);
};
  
};

#endif /* _FIGURE_COMMON_H_ */