3 #include <lttv/gtkcustom.h>
5 #include <lttv/mainWindow.h>
6 #include <lttv/gtkTraceSet.h>
8 static void gtk_custom_class_init (GtkCustomClass
*klass
);
9 static void gtk_custom_init (GtkCustom
*custom
);
12 static void gtk_custom_size_request (GtkWidget
*widget
,
13 GtkRequisition
*requisition
);
14 static void gtk_custom_size_allocate (GtkWidget
*widget
,
15 GtkAllocation
*allocation
);
17 void gtk_custom_scroll_value_changed (GtkRange
*range
, gpointer custom
);
20 gtk_custom_get_type (void)
22 static GType custom_type
= 0;
26 static const GTypeInfo custom_info
=
28 sizeof (GtkCustomClass
),
30 NULL
, /* base_finalize */
31 (GClassInitFunc
) gtk_custom_class_init
,
32 NULL
, /* class_finalize */
33 NULL
, /* class_data */
36 (GInstanceInitFunc
) gtk_custom_init
,
37 NULL
, /* value_table */
40 custom_type
= g_type_register_static (GTK_TYPE_PANED
, "GtkCustom",
48 gtk_custom_class_init (GtkCustomClass
*class)
50 GtkWidgetClass
*widget_class
;
52 widget_class
= (GtkWidgetClass
*) class;
54 widget_class
->size_request
= gtk_custom_size_request
;
55 widget_class
->size_allocate
= gtk_custom_size_allocate
;
59 gtk_custom_init (GtkCustom
*custom
)
63 GTK_WIDGET_SET_FLAGS (custom
, GTK_NO_WINDOW
);
64 gtk_widget_set_redraw_on_allocate (GTK_WIDGET (custom
), FALSE
);
66 custom
->first_pane
= NULL
;
67 custom
->last_pane
= NULL
;
68 custom
->focused_pane
= NULL
;
69 custom
->num_children
= 0;
72 // custom->scrollWindow = NULL;
73 // custom->viewport = NULL;
74 custom
->hscrollbar
= NULL
;
78 GtkWidget
* gtk_custom_new ()
80 return GTK_WIDGET (g_object_new (gtk_custom_get_type (), NULL
));
84 void gtk_custom_set_focus (GtkWidget
* widget
, gpointer user_data
)
86 GtkCustom
* custom
= (GtkCustom
*) widget
;
88 if(!custom
->first_pane
) return;
91 pane
= custom
->first_pane
;
93 if((GtkWidget
*)pane
== (GtkWidget
*)user_data
){
94 custom
->focused_pane
= pane
;
97 if(pane
== custom
->last_pane
){
98 custom
->focused_pane
= NULL
;
101 pane
= (GtkPaned
*)pane
->child1
;
105 void gtk_custom_set_adjust(GtkCustom
* custom
, gboolean first_time
)
107 TimeWindow time_window
;
108 TimeInterval
*time_span
;
112 get_time_window(custom
->mw
,&time_window
);
114 time_span
= LTTV_TRACESET_CONTEXT(custom
->mw
->current_tab
->traceset_info
->
115 traceset_context
)->Time_Span
;
117 custom
->hadjust
->lower
= ltt_time_to_double(time_span
->startTime
) *
118 NANOSECONDS_PER_SECOND
;
119 custom
->hadjust
->value
= custom
->hadjust
->lower
;
120 custom
->hadjust
->upper
= ltt_time_to_double(time_span
->endTime
) *
121 NANOSECONDS_PER_SECOND
;
124 /* Page increment of whole visible area */
125 if(custom
->hadjust
== NULL
){
126 g_warning("Insert a viewer first");
130 start
= ltt_time_to_double(time_window
.start_time
) * NANOSECONDS_PER_SECOND
;
131 tmp
= custom
->hadjust
->upper
- custom
->hadjust
->lower
;
133 custom
->hadjust
->page_increment
= ltt_time_to_double(
134 time_window
.time_width
) * NANOSECONDS_PER_SECOND
;
136 if(custom
->hadjust
->page_increment
>= tmp
- range
)
137 custom
->hadjust
->value
= custom
->hadjust
->lower
;
138 if(start
+ custom
->hadjust
->page_increment
>= custom
->hadjust
->upper
- range
)
139 custom
->hadjust
->value
= start
;
141 /* page_size to the whole visible area will take care that the
142 * scroll value + the shown area will never be more than what is
144 custom
->hadjust
->page_size
= custom
->hadjust
->page_increment
;
145 custom
->hadjust
->step_increment
= custom
->hadjust
->page_increment
/ 10;
147 gtk_adjustment_changed (custom
->hadjust
);
150 void gtk_custom_widget_add(GtkCustom
* custom
, GtkWidget
* widget1
)
155 g_return_if_fail(GTK_IS_CUSTOM(custom
));
156 g_object_ref(G_OBJECT(widget1
));
159 if(!custom
->first_pane
){
160 custom
->first_pane
= (GtkPaned
*)gtk_vpaned_new();
161 custom
->last_pane
= custom
->first_pane
;
163 custom
->hscrollbar
= gtk_hscrollbar_new (NULL
);
164 gtk_widget_show(custom
->hscrollbar
);
166 custom
->hadjust
= gtk_range_get_adjustment(GTK_RANGE(custom
->hscrollbar
));
167 gtk_custom_set_adjust(custom
, TRUE
);
169 gtk_range_set_update_policy (GTK_RANGE(custom
->hscrollbar
),
170 GTK_UPDATE_DISCONTINUOUS
);
171 g_signal_connect(G_OBJECT(custom
->hscrollbar
), "value-changed",
172 G_CALLBACK(gtk_custom_scroll_value_changed
), custom
);
174 custom
->vbox
= gtk_vbox_new(FALSE
,0);
175 gtk_widget_show(custom
->vbox
);
177 // custom->viewport = gtk_viewport_new (NULL,NULL);
178 // gtk_widget_show(custom->viewport);
180 // gtk_container_add(GTK_CONTAINER(custom->viewport), (GtkWidget*)custom->vbox);
181 gtk_box_pack_end(GTK_BOX(custom
->vbox
),(GtkWidget
*)custom
->hscrollbar
,FALSE
,FALSE
,0);
182 gtk_box_pack_end(GTK_BOX(custom
->vbox
),(GtkWidget
*)custom
->first_pane
,TRUE
,TRUE
,0);
184 // custom->scrollWindow = gtk_scrolled_window_new (NULL, NULL);
185 // gtk_widget_show(custom->scrollWindow);
186 // gtk_container_add (GTK_CONTAINER (custom->scrollWindow), (GtkWidget*)custom->viewport);
187 // gtk_paned_pack1(GTK_PANED(custom), (GtkWidget*)custom->scrollWindow,FALSE, TRUE);
189 gtk_paned_pack1(GTK_PANED(custom
), (GtkWidget
*)custom
->vbox
,FALSE
, TRUE
);
191 tmpPane
= custom
->last_pane
;
192 custom
->last_pane
= (GtkPaned
*)gtk_vpaned_new();
193 gtk_paned_pack1 (tmpPane
,(GtkWidget
*)custom
->last_pane
, FALSE
,TRUE
);
195 gtk_widget_show((GtkWidget
*)custom
->last_pane
);
197 gtk_paned_pack2 (custom
->last_pane
,widget1
, TRUE
, TRUE
);
198 custom
->focused_pane
= custom
->last_pane
;
199 custom
->num_children
++;
203 void gtk_custom_widget_delete(GtkCustom
* custom
)
205 GtkPaned
* tmp
, *prev
, *next
;
207 if(!custom
->focused_pane
) return;
209 tmp
= (GtkPaned
*)custom
->focused_pane
->child2
; //widget in vpaned
210 g_object_unref(G_OBJECT(tmp
));
212 if(custom
->focused_pane
== custom
->first_pane
&&
213 custom
->focused_pane
== custom
->last_pane
){
214 // gtk_container_remove(GTK_CONTAINER(custom),(GtkWidget*)custom->scrollWindow);
215 gtk_container_remove(GTK_CONTAINER(custom
),(GtkWidget
*)custom
->vbox
);
216 custom
->first_pane
= NULL
;
217 custom
->last_pane
= NULL
;
218 custom
->focused_pane
= NULL
;
219 }else if(custom
->focused_pane
== custom
->first_pane
&&
220 custom
->focused_pane
!= custom
->last_pane
){
221 next
= (GtkPaned
*)custom
->first_pane
->child1
;
222 g_object_ref(G_OBJECT(next
));
223 gtk_container_remove(GTK_CONTAINER(custom
->first_pane
),(GtkWidget
*)next
);
224 gtk_container_remove(GTK_CONTAINER(custom
->vbox
),(GtkWidget
*)custom
->first_pane
);
225 custom
->first_pane
= next
;
226 gtk_box_pack_end(GTK_BOX(custom
->vbox
),(GtkWidget
*)custom
->first_pane
,TRUE
,TRUE
,0);
227 custom
->focused_pane
= custom
->first_pane
;
228 g_object_unref(G_OBJECT(next
));
229 }else if(custom
->focused_pane
!= custom
->first_pane
&&
230 custom
->focused_pane
== custom
->last_pane
){
231 tmp
= custom
->last_pane
;
232 custom
->last_pane
= (GtkPaned
*)gtk_widget_get_parent((GtkWidget
*)custom
->last_pane
);
233 custom
->focused_pane
= custom
->last_pane
;
234 gtk_container_remove(GTK_CONTAINER(custom
->last_pane
),(GtkWidget
*)tmp
);
236 tmp
= custom
->focused_pane
;
237 prev
= (GtkPaned
*)gtk_widget_get_parent((GtkWidget
*)tmp
);
238 next
= (GtkPaned
*)tmp
->child1
;
239 g_object_ref(G_OBJECT(next
));
240 gtk_container_remove(GTK_CONTAINER(custom
->focused_pane
),(GtkWidget
*)next
);
241 gtk_container_remove(GTK_CONTAINER(prev
),(GtkWidget
*)custom
->focused_pane
);
242 gtk_paned_pack1(prev
, (GtkWidget
*)next
, FALSE
, TRUE
);
243 custom
->focused_pane
= next
;
244 g_object_unref(G_OBJECT(next
));
247 custom
->num_children
--;
251 void gtk_custom_widget_move_up(GtkCustom
* custom
)
253 GtkWidget
* upWidget
, *downWidget
;
254 GtkPaned
* prev
,*next
, *prevPrev
;
256 if(custom
->last_pane
== custom
->focused_pane
) return;
259 prev
= (GtkPaned
*)custom
->focused_pane
->child1
;
260 g_object_ref(G_OBJECT(prev
));
261 gtk_container_remove(GTK_CONTAINER(custom
->focused_pane
),(GtkWidget
*)prev
);
263 if(prev
== custom
->last_pane
){
265 custom
->last_pane
= custom
->focused_pane
;
267 prevPrev
= (GtkPaned
*)prev
->child1
;
268 g_object_ref(G_OBJECT(prevPrev
));
269 gtk_container_remove(GTK_CONTAINER(prev
),(GtkWidget
*)prevPrev
);
272 g_object_ref(G_OBJECT(custom
->focused_pane
));
273 if(custom
->first_pane
== custom
->focused_pane
){
274 gtk_container_remove(GTK_CONTAINER(custom
->vbox
),(GtkWidget
*)custom
->focused_pane
);
275 gtk_box_pack_end(GTK_BOX(custom
->vbox
),(GtkWidget
*)prev
,TRUE
,TRUE
,0);
276 custom
->first_pane
= prev
;
278 next
= (GtkPaned
*)gtk_widget_get_parent((GtkWidget
*)custom
->focused_pane
);
279 gtk_container_remove(GTK_CONTAINER(next
),(GtkWidget
*)custom
->focused_pane
);
280 gtk_paned_pack1(GTK_PANED(next
), (GtkWidget
*)prev
, FALSE
,TRUE
);
282 gtk_paned_pack1(GTK_PANED(prev
),(GtkWidget
*)custom
->focused_pane
, FALSE
,TRUE
);
284 gtk_paned_pack1(GTK_PANED(custom
->focused_pane
),(GtkWidget
*)prevPrev
, FALSE
,TRUE
);
286 g_object_unref(G_OBJECT(prev
));
287 if(prevPrev
) g_object_unref(G_OBJECT(prevPrev
));
288 g_object_unref(G_OBJECT(custom
->focused_pane
));
292 void gtk_custom_widget_move_down(GtkCustom
* custom
)
294 GtkWidget
* upWidget
, *downWidget
;
295 GtkPaned
* prev
,*next
, *nextNext
;
297 if(custom
->first_pane
== custom
->focused_pane
) return;
300 next
= (GtkPaned
*)gtk_widget_get_parent((GtkWidget
*)custom
->focused_pane
);
301 g_object_ref(G_OBJECT(next
));
303 if(custom
->last_pane
== custom
->focused_pane
){
305 custom
->last_pane
= next
;
307 prev
= (GtkPaned
*)custom
->focused_pane
->child1
;
308 g_object_ref(G_OBJECT(prev
));
309 gtk_container_remove(GTK_CONTAINER(custom
->focused_pane
),(GtkWidget
*)prev
);
312 g_object_ref(G_OBJECT(custom
->focused_pane
));
313 gtk_container_remove(GTK_CONTAINER(next
),(GtkWidget
*)custom
->focused_pane
);
315 if(next
== custom
->first_pane
){
316 custom
->first_pane
= custom
->focused_pane
;
317 gtk_container_remove(GTK_CONTAINER(custom
->vbox
),(GtkWidget
*)next
);
318 gtk_box_pack_end(GTK_BOX(custom
->vbox
),(GtkWidget
*)custom
->focused_pane
,TRUE
,TRUE
,0);
320 nextNext
= (GtkPaned
*)gtk_widget_get_parent((GtkWidget
*)next
);
321 gtk_container_remove(GTK_CONTAINER(nextNext
),(GtkWidget
*)next
);
322 gtk_paned_pack1(nextNext
, (GtkWidget
*)custom
->focused_pane
, FALSE
, TRUE
);
324 gtk_paned_pack1(custom
->focused_pane
,(GtkWidget
*)next
, FALSE
,TRUE
);
326 gtk_paned_pack1(next
,(GtkWidget
*)prev
, FALSE
,TRUE
);
328 if(prev
)g_object_unref(G_OBJECT(prev
));
329 g_object_unref(G_OBJECT(next
));
330 g_object_unref(G_OBJECT(custom
->focused_pane
));
333 void gtk_custom_scroll_value_changed(GtkRange
*range
, gpointer custom_arg
)
336 GtkCustom
* custom
= (GtkCustom
*)custom_arg
;
337 gdouble value
= gtk_range_get_value(range
);
338 time
= ltt_time_from_double(value
/ NANOSECONDS_PER_SECOND
);
339 set_current_time(custom
->mw
, &time
);
340 g_warning("The current time is second :%d, nanosecond : %d\n", time
.tv_sec
, time
.tv_nsec
);
345 gtk_custom_size_request (GtkWidget
*widget
,
346 GtkRequisition
*requisition
)
348 GtkPaned
*paned
= GTK_PANED (widget
);
349 GtkRequisition child_requisition
;
351 requisition
->width
= 0;
352 requisition
->height
= 0;
354 if (paned
->child1
&& GTK_WIDGET_VISIBLE (paned
->child1
))
356 gtk_widget_size_request (paned
->child1
, &child_requisition
);
358 requisition
->height
= child_requisition
.height
;
359 requisition
->width
= child_requisition
.width
;
362 if (paned
->child2
&& GTK_WIDGET_VISIBLE (paned
->child2
))
364 gtk_widget_size_request (paned
->child2
, &child_requisition
);
366 requisition
->width
= MAX (requisition
->width
, child_requisition
.width
);
367 requisition
->height
+= child_requisition
.height
;
370 requisition
->height
+= GTK_CONTAINER (paned
)->border_width
* 2;
371 requisition
->width
+= GTK_CONTAINER (paned
)->border_width
* 2;
373 if (paned
->child1
&& GTK_WIDGET_VISIBLE (paned
->child1
) &&
374 paned
->child2
&& GTK_WIDGET_VISIBLE (paned
->child2
))
378 gtk_widget_style_get (widget
, "handle_size", &handle_size
, NULL
);
379 requisition
->height
+= handle_size
;
385 gtk_custom_size_allocate (GtkWidget
*widget
,
386 GtkAllocation
*allocation
)
388 GtkPaned
*paned
= GTK_PANED (widget
);
389 gint border_width
= GTK_CONTAINER (paned
)->border_width
;
391 widget
->allocation
= *allocation
;
393 if (paned
->child1
&& GTK_WIDGET_VISIBLE (paned
->child1
) &&
394 paned
->child2
&& GTK_WIDGET_VISIBLE (paned
->child2
))
396 GtkRequisition child1_requisition
;
397 GtkRequisition child2_requisition
;
398 GtkAllocation child1_allocation
;
399 GtkAllocation child2_allocation
;
402 gtk_widget_style_get (widget
, "handle_size", &handle_size
, NULL
);
404 gtk_widget_get_child_requisition (paned
->child1
, &child1_requisition
);
405 gtk_widget_get_child_requisition (paned
->child2
, &child2_requisition
);
407 gtk_paned_compute_position (paned
,
408 MAX (1, widget
->allocation
.height
411 child1_requisition
.height
,
412 child2_requisition
.height
);
414 paned
->handle_pos
.x
= widget
->allocation
.x
+ border_width
;
415 paned
->handle_pos
.y
= widget
->allocation
.y
+ paned
->child1_size
+ border_width
;
416 paned
->handle_pos
.width
= MAX (1, (gint
) widget
->allocation
.width
- 2 * border_width
);
417 paned
->handle_pos
.height
= handle_size
;
419 if (GTK_WIDGET_REALIZED (widget
))
421 if (GTK_WIDGET_MAPPED (widget
))
422 gdk_window_show (paned
->handle
);
423 gdk_window_move_resize (paned
->handle
,
426 paned
->handle_pos
.width
,
430 child1_allocation
.width
= child2_allocation
.width
= MAX (1, (gint
) allocation
->width
- border_width
* 2);
431 child1_allocation
.height
= MAX (1, paned
->child1_size
);
432 child1_allocation
.x
= child2_allocation
.x
= widget
->allocation
.x
+ border_width
;
433 child1_allocation
.y
= widget
->allocation
.y
+ border_width
;
435 child2_allocation
.y
= child1_allocation
.y
+ paned
->child1_size
+ paned
->handle_pos
.height
;
436 child2_allocation
.height
= MAX (1, widget
->allocation
.y
+ widget
->allocation
.height
- child2_allocation
.y
- border_width
);
438 if (GTK_WIDGET_MAPPED (widget
) &&
439 paned
->child1
->allocation
.height
< child1_allocation
.height
)
441 gtk_widget_size_allocate (paned
->child2
, &child2_allocation
);
442 gtk_widget_size_allocate (paned
->child1
, &child1_allocation
);
446 gtk_widget_size_allocate (paned
->child1
, &child1_allocation
);
447 gtk_widget_size_allocate (paned
->child2
, &child2_allocation
);
452 GtkAllocation child_allocation
;
454 if (GTK_WIDGET_REALIZED (widget
))
455 gdk_window_hide (paned
->handle
);
458 gtk_widget_set_child_visible (paned
->child1
, TRUE
);
460 gtk_widget_set_child_visible (paned
->child2
, TRUE
);
462 child_allocation
.x
= widget
->allocation
.x
+ border_width
;
463 child_allocation
.y
= widget
->allocation
.y
+ border_width
;
464 child_allocation
.width
= MAX (1, allocation
->width
- 2 * border_width
);
465 child_allocation
.height
= MAX (1, allocation
->height
- 2 * border_width
);
467 if (paned
->child1
&& GTK_WIDGET_VISIBLE (paned
->child1
))
468 gtk_widget_size_allocate (paned
->child1
, &child_allocation
);
469 else if (paned
->child2
&& GTK_WIDGET_VISIBLE (paned
->child2
))
470 gtk_widget_size_allocate (paned
->child2
, &child_allocation
);