1 
2 /*
3  * ===========================
4  * VDK Visual Development Kit
5  * Version 2.0.2
6  * May 2002
7  * ===========================
8  *
9  * Copyright (C) 1998, Mario Motta
10  * Developed by Mario Motta <mmotta@guest.net>
11  * Based on ISDataBox
12  * Developed by Ionutz Borcoman <borco@borco-ei.eng.hokudai.ac.jp>
13  * based on  GtkDatabox - An extension to the gtk+ library
14  * Copyright (C) 1998-1999 Roland Bock
15  *
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Library General Public
18  * License as published by the Free Software Foundation; either
19  * version 2 of the License, or (at your option) any later version.
20  *
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Library General Public License for more details.
25  *
26  * You should have received a copy of the GNU Library General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
29  * 02111-1307, USA.
30  */
31 
32 #include <vdk/vdkdatabox.h>
33 #include <stdlib.h>
34 const GtkDataboxCoord zeroCoord = {0,0};
35 const GtkDataboxValue zeroValue = {0.0, 0.0};
36 
VDKDataBox(VDKForm * owner)37 VDKDataBox::VDKDataBox(VDKForm *owner)
38   :VDKObject(owner),
39    Rulers("Rulers", this, true, &VDKDataBox::SetRulers),
40    Scrollbars("Scrollbars", this, true, &VDKDataBox::SetScrollbars),
41    Zoom("Zoom", this, true, &VDKDataBox::SetZoom),
42    TopLeft("TopLeft", this, zeroValue),
43    BottomRight("BottomRight", this, zeroValue),
44    Mark("Mark", this, zeroCoord),
45    Select("Select", this, zeroCoord)
46 {
47   widget = sigwid = gtk_databox_new();
48 
49   gtk_signal_connect (GTK_OBJECT (widget), "gtk_databox_zoomed",
50 			       GTK_SIGNAL_FUNC(&VDKDataBox::_zoomed),
51 					  this);
52   gtk_signal_connect (GTK_OBJECT (widget), "gtk_databox_marked",
53 			  GTK_SIGNAL_FUNC(&VDKDataBox::_marked),
54 					  this);
55   gtk_signal_connect (GTK_OBJECT (widget), "gtk_databox_selection_started",
56 			  GTK_SIGNAL_FUNC(&VDKDataBox::_selectionStarted),
57 					  this);
58   gtk_signal_connect (GTK_OBJECT (widget), "gtk_databox_selection_changed",
59 			  GTK_SIGNAL_FUNC(&VDKDataBox::_selectionChanged),
60 					  this);
61   gtk_signal_connect (GTK_OBJECT (widget), "gtk_databox_selection_stopped",
62 			  GTK_SIGNAL_FUNC(&VDKDataBox::_selectionStoped),
63 					  this);
64   gtk_signal_connect (GTK_OBJECT (widget), "gtk_databox_selection_canceled",
65 			  GTK_SIGNAL_FUNC(&VDKDataBox::_selectionCanceled),
66 					  this);
67   ConnectDefaultSignals();
68 }
69 
~VDKDataBox()70 VDKDataBox::~VDKDataBox()
71 {
72 }
73 
74 void
SetRulers(bool val)75 VDKDataBox::SetRulers(bool val)
76 {
77   if(val)
78     gtk_databox_show_rulers(GTK_DATABOX(widget));
79   else
80     gtk_databox_hide_rulers(GTK_DATABOX(widget));
81 }
82 
83 
84 void
SetScrollbars(bool val)85 VDKDataBox::SetScrollbars(bool val)
86 {
87   if(val)
88     gtk_databox_show_scrollbars(GTK_DATABOX(widget));
89   else
90     gtk_databox_hide_scrollbars(GTK_DATABOX(widget));
91 }
92 
93 void
SetZoom(bool val)94 VDKDataBox::SetZoom(bool val)
95 {
96   if(val)
97     gtk_databox_enable_zoom(GTK_DATABOX(widget));
98   else
99     gtk_databox_disable_zoom(GTK_DATABOX(widget));
100 }
101 
102 GtkDataboxValue
GetValue(GtkDataboxCoord coord)103 VDKDataBox::GetValue(GtkDataboxCoord coord)
104 {
105   GtkDataboxValue ret;
106   gtk_databox_data_get_value(GTK_DATABOX(widget), coord, &ret);
107   return ret;
108 }
109 
110 void
GetExtrema(GtkDataboxValue & min,GtkDataboxValue & max,bool visible)111 VDKDataBox::GetExtrema(GtkDataboxValue& min, GtkDataboxValue& max, bool visible)
112 {
113   if(visible)
114     gtk_databox_data_get_visible_extrema(GTK_DATABOX(widget), &min, &max);
115   else
116     gtk_databox_data_get_extrema(GTK_DATABOX(widget), &min, &max);
117 }
118 
119 void
Rescale()120 VDKDataBox::Rescale()
121 {
122   gtk_databox_rescale(GTK_DATABOX(widget));
123 }
124 
125 void
Rescale(GtkDataboxValue min,GtkDataboxValue max)126 VDKDataBox::Rescale(GtkDataboxValue min, GtkDataboxValue max)
127 {
128   gtk_databox_rescale_with_values(GTK_DATABOX(widget), min, max);
129 }
130 
131 void
Redraw()132 VDKDataBox::Redraw()
133 {
134   gtk_databox_redraw(GTK_DATABOX(widget));
135 }
136 
137 VDKColor*
GetColor(int index)138 VDKDataBox::GetColor(int index)
139 {
140   VDKColor *ret;
141   GdkColor *color;
142 
143   color = (GdkColor*) malloc (sizeof(GdkColor));
144   gtk_databox_data_get_color(GTK_DATABOX(widget), index, color);
145   ret = new VDKColor(this,
146 		     color->red,
147 		     color->green,
148 		     color->blue);
149   free(color);
150 
151   return ret;
152 }
153 
154 void
SetColor(int index,VDKColor * color,bool redraw)155 VDKDataBox::SetColor(int index, VDKColor* color, bool redraw)
156 {
157   GdkColor *tmp = color->Color();
158   gtk_databox_data_set_color(GTK_DATABOX(widget), index, *tmp);
159   if(redraw)
160     Redraw();
161 }
162 
163 gint
RemoveData(gint index)164 VDKDataBox::RemoveData(gint index)
165 {
166   return gtk_databox_data_remove(GTK_DATABOX(widget), index);
167 }
168 
169 gint
RemoveData()170 VDKDataBox::RemoveData()
171 {
172   return gtk_databox_data_remove_all(GTK_DATABOX(widget));
173 }
174 
175 gint
DestroyData(gint index)176 VDKDataBox::DestroyData(gint index)
177 {
178   return gtk_databox_data_destroy(GTK_DATABOX(widget), index);
179 }
180 
181 gint
DestroyData()182 VDKDataBox::DestroyData()
183 {
184   return gtk_databox_data_destroy_all(GTK_DATABOX(widget));
185 }
186 
187 gint
AddXY(guint length,gfloat * X,gfloat * Y,VDKColor * color,GtkDataboxDataType type,guint dotSize)188 VDKDataBox::AddXY(guint length, gfloat *X, gfloat *Y,
189 				 VDKColor *color,
190 				 GtkDataboxDataType type, guint dotSize)
191 {
192   return gtk_databox_data_add_x_y(GTK_DATABOX(widget), length,
193 				  X, Y,
194 				  (GdkColor)*(color->Color()),
195 				  type, dotSize);
196 }
197 
198 gint
AddX(guint length,gfloat * X,guint indexSharedY,VDKColor * color,GtkDataboxDataType type,guint dotSize)199 VDKDataBox::AddX (guint length, gfloat *X, guint indexSharedY, VDKColor *color,
200 				 GtkDataboxDataType type, guint dotSize)
201 {
202   return gtk_databox_data_add_x(GTK_DATABOX(widget), length,
203 				X, indexSharedY,
204 				(GdkColor)*(color->Color()),
205 				type, dotSize);
206 }
207 
208 gint
AddY(guint length,gfloat * Y,guint indexSharedX,VDKColor * color,GtkDataboxDataType type,guint dotSize)209 VDKDataBox::AddY (guint length, gfloat *Y, guint indexSharedX, VDKColor *color,
210 				 GtkDataboxDataType type, guint dotSize)
211 {
212   return gtk_databox_data_add_y(GTK_DATABOX(widget), length,
213 				Y, indexSharedX,
214 				(GdkColor)*(color->Color()),
215 				type, dotSize);
216 }
217 
218 /*****************************
219  * Signal handling functions *
220  *****************************/
221 gint
_zoomed(GtkDatabox *,GtkDataboxValue * top_left,GtkDataboxValue * bottom_right,gpointer gp)222 VDKDataBox::_zoomed(GtkDatabox *,
223 		    GtkDataboxValue *top_left,
224 		    GtkDataboxValue *bottom_right,
225 		    gpointer gp)
226 {
227   g_return_val_if_fail(gp != NULL,TRUE);
228   VDKDataBox *obj = reinterpret_cast<VDKDataBox*>(gp);
229 
230   obj->TopLeft(*top_left);
231   obj->BottomRight(*bottom_right);
232   obj->SignalEmitParent(databox_zoomed_signal);
233   obj->SignalEmitParent("databox_zoomed");
234 
235   return 0;
236 }
237 
238 gint
_marked(GtkDatabox *,GtkDataboxCoord * mark,gpointer gp)239 VDKDataBox::_marked(GtkDatabox *,
240 		    GtkDataboxCoord *mark,
241 		    gpointer gp)
242 {
243   g_return_val_if_fail(gp != NULL,TRUE);
244   VDKDataBox *obj = reinterpret_cast<VDKDataBox*>(gp);
245 
246   obj->Mark(*mark);
247   obj->SignalEmitParent(databox_marked_signal);
248   obj->SignalEmitParent("databox_marked");
249 
250   return 0;
251 }
252 
253 gint
_selectionStarted(GtkDatabox *,GtkDataboxCoord * mark,gpointer gp)254 VDKDataBox::_selectionStarted(GtkDatabox *,
255 			      GtkDataboxCoord *mark,
256 			      gpointer gp)
257 {
258   g_return_val_if_fail(gp != NULL,TRUE);
259   VDKDataBox *obj = reinterpret_cast<VDKDataBox*>(gp);
260 
261   obj->Mark(*mark);
262   obj->SignalEmitParent(databox_selection_started_signal);
263   obj->SignalEmitParent("databox_selection_started");
264 
265   return 0;
266 }
267 
268 gint
_selectionChanged(GtkDatabox *,GtkDataboxCoord * mark,GtkDataboxCoord * select,gpointer gp)269 VDKDataBox::_selectionChanged(GtkDatabox *,
270 			      GtkDataboxCoord *mark,
271 			      GtkDataboxCoord *select,
272 			      gpointer gp)
273 {
274   g_return_val_if_fail(gp != NULL,TRUE);
275   VDKDataBox *obj = reinterpret_cast<VDKDataBox*>(gp);
276 
277   obj->Mark(*mark);
278   obj->Select(*select);
279   obj->SignalEmitParent(databox_selection_changed_signal);
280   obj->SignalEmitParent("databox_selection_changed");
281 
282   return 0;
283 }
284 
285 gint
_selectionStoped(GtkDatabox *,GtkDataboxCoord * mark,GtkDataboxCoord * select,gpointer gp)286 VDKDataBox::_selectionStoped(GtkDatabox *,
287 			     GtkDataboxCoord *mark,
288 			     GtkDataboxCoord *select,
289 			     gpointer gp)
290 {
291   g_return_val_if_fail(gp != NULL,TRUE);
292   VDKDataBox *obj = reinterpret_cast<VDKDataBox*>(gp);
293 
294   obj->Mark(*mark);
295   obj->Select(*select);
296   obj->SignalEmitParent(databox_selection_stopped_signal);
297   obj->SignalEmitParent("databox_selection_stopped");
298 
299   return 0;
300 }
301 
302 gint
_selectionCanceled(GtkDatabox *,gpointer gp)303 VDKDataBox::_selectionCanceled(GtkDatabox *,
304 			       gpointer gp)
305 {
306   g_return_val_if_fail(gp != NULL,TRUE);
307   VDKDataBox *obj = reinterpret_cast<VDKDataBox*>(gp);
308 
309   obj->SignalEmitParent(databox_selection_canceled_signal);
310   obj->SignalEmitParent("databox_selection_canceled");
311 
312   return 0;
313 }
314 /*
315  */
316 void
SetBackground(VDKRgb color,GtkStateType state)317 VDKDataBox::SetBackground(VDKRgb color, GtkStateType state)
318 {
319   if(!widget) return;
320   _setBackground_(GTK_DATABOX(widget)->draw,
321 		  color.red,color.green,color.blue, state);
322 }
323