2 * Widgets for the GNOME edition of the Midnight Commander
4 * Copyright (C) 1997 The Free Software Foundation
6 * Author: Miguel de Icaza (miguel@gnu.org)
20 get_gtk_widget (Widget_Item
*p
)
22 GtkWidget
*w
= GTK_WIDGET (p
->widget
->wdata
);
24 if (GNOME_IS_ENTRY (w
))
25 return (gnome_entry_gtk_entry ((GnomeEntry
*)(w
)));
27 return (GTK_WIDGET (p
->widget
->wdata
));
31 x_dialog_stop (Dlg_head
*h
)
33 if (h
->grided
& DLG_GNOME_APP
)
39 x_focus_widget (Widget_Item
*p
)
41 GtkWidget
*w
= get_gtk_widget (p
);
43 gtk_widget_grab_focus (w
);
47 x_unfocus_widget (Widget_Item
*p
)
49 GtkWidget
*w
= get_gtk_widget (p
);
50 GtkWidget
*toplevel
= gtk_widget_get_toplevel (w
);
52 /* Only happens if the widget is not yet added to its container */
53 /* I am not yet sure why this happens */
54 if (GTK_IS_WINDOW (toplevel
))
55 gtk_window_set_focus (GTK_WINDOW (gtk_widget_get_toplevel (w
)), NULL
);
59 x_destroy_cmd (void *w
)
61 Widget
*widget
= (Widget
*) w
;
65 gtk_widget_destroy (GTK_WIDGET(widget
->wdata
));
70 gbutton_callback (GtkWidget
*w
, void *data
)
73 Dlg_head
*h
= (Dlg_head
*) b
->widget
.parent
;
77 stop
= (*b
->callback
)(b
->action
, b
->callback_data
);
79 if (!b
->callback
|| stop
){
80 h
->ret_value
= b
->action
;
86 stock_from_text (char *text
)
90 if ( g_strcasecmp (text
, _("ok")) == 0)
91 stock
= GNOME_STOCK_BUTTON_OK
;
92 else if ( g_strcasecmp (text
, _("cancel")) == 0)
93 stock
= GNOME_STOCK_BUTTON_CANCEL
;
94 else if ( g_strcasecmp (text
, _("help")) == 0)
95 stock
= GNOME_STOCK_BUTTON_HELP
;
96 else if ( g_strcasecmp (text
, _("yes")) == 0)
97 stock
= GNOME_STOCK_BUTTON_YES
;
98 else if ( g_strcasecmp (text
, _("no")) == 0)
99 stock
= GNOME_STOCK_BUTTON_NO
;
100 else if ( g_strcasecmp (text
, _("exit")) == 0)
101 stock
= GNOME_STOCK_BUTTON_CLOSE
;
102 else if ( g_strcasecmp (text
, _("abort")) == 0)
103 stock
= GNOME_STOCK_BUTTON_CANCEL
;
111 x_create_button (Dlg_head
*h
, widget_data parent
, WButton
*b
)
117 stock
= stock_from_text (b
->text
);
120 button
= gnome_stock_button (stock
);
122 button
= gtk_button_new_with_label (b
->text
);
124 if (b
->flags
== DEFPUSH_BUTTON
){
125 GTK_WIDGET_SET_FLAGS (button
, GTK_CAN_DEFAULT
);
126 gtk_widget_grab_default (button
);
128 gtk_widget_show (button
);
129 tag
= gtk_signal_connect (GTK_OBJECT(button
), "clicked", (GtkSignalFunc
) gbutton_callback
, b
);
130 gtk_object_set_data (GTK_OBJECT (button
), "click-signal-tag", (void *) tag
);
131 b
->widget
.wdata
= (widget_data
) button
;
137 x_set_text (GtkWidget
*w
, gpointer data
)
139 if (!GTK_IS_LABEL (w
))
141 gtk_label_set (GTK_LABEL(w
), data
);
145 x_button_set (WButton
*b
, char *text
)
147 GtkWidget
*button
= GTK_WIDGET (b
->widget
.wdata
);
149 gtk_container_foreach (GTK_CONTAINER (button
), x_set_text
, text
);
155 x_radio_focus_item (WRadio
*radio
)
157 GList
*children
= GTK_BOX (radio
->widget
.wdata
)->children
;
160 for (i
= 0; i
< radio
->count
; i
++){
161 if (i
== radio
->pos
){
162 GtkBoxChild
*bc
= (GtkBoxChild
*) children
->data
;
164 gtk_widget_grab_focus (GTK_WIDGET (bc
->widget
));
167 children
= children
->next
;
172 x_radio_toggle (WRadio
*radio
)
174 GList
*children
= GTK_BOX (radio
->widget
.wdata
)->children
;
177 for (i
= 0; i
< radio
->count
; i
++){
178 GtkBoxChild
*bc
= (GtkBoxChild
*) children
->data
;
180 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (bc
->widget
), (i
== radio
->sel
) ? 1 : 0);
181 children
= children
->next
;
186 radio_toggle (GtkObject
*object
, WRadio
*r
)
188 int idx
= (int) gtk_object_get_data (object
, "index");
190 if (!GTK_TOGGLE_BUTTON (object
)->active
)
193 g_return_if_fail (idx
!= 0);
199 remove_hotkey (char *text
)
201 char *t
= g_strdup (text
);
202 char *p
= strchr (t
,'&');
211 x_create_radio (Dlg_head
*h
, widget_data parent
, WRadio
*r
)
216 vbox
= gtk_vbox_new (0, 0);
217 for (i
= 0; i
< r
->count
; i
++){
218 char *text
= remove_hotkey (_(r
->texts
[i
]));
221 w
= gtk_radio_button_new_with_label (NULL
, text
);
222 r
->first_gtk_radio
= w
;
224 w
= gtk_radio_button_new_with_label_from_widget (r
->first_gtk_radio
, text
);
227 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w
), (i
== r
->sel
));
228 gtk_signal_connect (GTK_OBJECT (w
), "toggled", GTK_SIGNAL_FUNC (radio_toggle
), r
);
229 gtk_object_set_data (GTK_OBJECT (w
), "index", (void *) (i
+1));
230 gtk_box_pack_start_defaults (GTK_BOX (vbox
), w
);
232 gtk_widget_show_all (vbox
);
234 r
->widget
.wdata
= (widget_data
) vbox
;
240 x_check_changed (GtkToggleButton
*t
, WCheck
*c
)
243 c
->state
^= C_CHANGE
;
248 x_create_check (Dlg_head
*h
, widget_data parent
, WCheck
*c
)
252 w
= gtk_check_button_new_with_label (c
->text
);
253 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w
), (c
->state
& C_BOOL
));
254 gtk_signal_connect (GTK_OBJECT (w
), "toggled", GTK_SIGNAL_FUNC (x_check_changed
), c
);
256 c
->widget
.wdata
= (widget_data
) w
;
262 entry_click (GtkWidget
*widget
, GdkEvent
*event
, WInput
*in
)
264 dlg_select_widget (in
->widget
.parent
, in
);
269 entry_release (GtkEditable
*entry
, GdkEvent
*event
, WInput
*in
)
271 in
->point
= entry
->current_pos
;
272 in
->mark
= (entry
->current_pos
== entry
->selection_start_pos
) ?
273 entry
->selection_end_pos
: entry
->selection_start_pos
;
274 if (in
->point
!= in
->mark
)
279 wentry_changed (GtkEditable
*editable
, WInput
*in
)
281 char *text
= gtk_entry_get_text (GTK_ENTRY (editable
));
283 assign_text (in
, text
);
284 input_set_point (in
, editable
->current_pos
);
288 x_create_input (Dlg_head
*h
, widget_data parent
, WInput
*in
)
290 GtkWidget
*gnome_entry
;
293 /* The widget might have been initialized manually.
294 * Look in gscreen.c for an example
296 if (in
->widget
.wdata
)
299 #ifdef USE_GNOME_ENTRY
300 gnome_entry
= gnome_entry_new (in
->widget
.tkname
);
302 entry
= GTK_ENTRY (gnome_entry
= gtk_entry_new ());
303 gtk_entry_set_visibility (entry
, !in
->is_password
);
305 gtk_widget_show (gnome_entry
);
306 in
->widget
.wdata
= (widget_data
) gnome_entry
;
308 #ifdef USE_GNOME_ENTRY
309 entry
= GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (gnome_entry
)));
311 gtk_entry_set_text (entry
, in
->buffer
);
312 gtk_editable_select_region (GTK_EDITABLE (entry
), 0, -1);
313 gtk_entry_set_position (entry
, in
->point
);
315 gtk_signal_connect (GTK_OBJECT (entry
), "button_press_event",
316 GTK_SIGNAL_FUNC (entry_click
), in
);
318 gtk_signal_connect (GTK_OBJECT (entry
), "button_release_event",
319 GTK_SIGNAL_FUNC (entry_release
), in
);
321 gtk_signal_connect (GTK_OBJECT (entry
), "changed",
322 GTK_SIGNAL_FUNC (wentry_changed
), in
);
327 x_update_input (WInput
*in
)
329 #ifdef USE_GNOME_ENTRY
330 GnomeEntry
*gnome_entry
;
336 /* If the widget has not been initialized yet (done by WIDGET_INIT) */
337 if (!in
->widget
.wdata
)
340 #ifdef USE_GNOME_ENTRY
341 gnome_entry
= GNOME_ENTRY (in
->widget
.wdata
);
342 entry
= GTK_ENTRY (gnome_entry_gtk_entry (gnome_entry
));
344 entry
= GTK_ENTRY (in
->widget
.wdata
);
347 /* Block the signal handler */
348 gtk_signal_handler_block_by_func (
350 GTK_SIGNAL_FUNC(wentry_changed
), in
);
352 /* Do the actual work */
353 if (in
->first
== -1){
354 gtk_editable_select_region (GTK_EDITABLE (entry
), 0, 0);
358 text
= gtk_entry_get_text (GTK_ENTRY (entry
));
360 if (text
&& strcmp (text
, in
->buffer
)){
361 gtk_entry_set_text (entry
, in
->buffer
);
365 if (GTK_EDITABLE (entry
)->current_pos
!= in
->point
){
366 gtk_entry_set_position (entry
, in
->point
);
371 #ifdef USE_GNOME_ENTRY
372 gtk_widget_draw (GTK_WIDGET (gnome_entry
), NULL
);
374 gtk_widget_draw (GTK_WIDGET (entry
), NULL
);
376 gtk_editable_changed (GTK_EDITABLE (entry
));
377 gtk_widget_queue_draw (GTK_WIDGET (entry
));
380 /* Unblock the signal handler */
381 gtk_signal_handler_unblock_by_func (
383 GTK_SIGNAL_FUNC(wentry_changed
), in
);
388 listbox_pull (widget_data data
)
390 return GTK_BIN (data
)->child
;
394 x_listbox_select_nth (WListbox
*l
, int nth
)
402 if (!l
->widget
.wdata
)
406 clist
= GTK_CLIST (listbox_pull (l
->widget
.wdata
));
408 gtk_clist_select_row (clist
, nth
, 0);
409 if (gtk_clist_row_is_visible (clist
, nth
) != GTK_VISIBILITY_FULL
)
410 gtk_clist_moveto (clist
, nth
, 0, 0.5, 0.0);
416 x_listbox_delete_nth (WListbox
*l
, int nth
)
418 gtk_clist_remove (GTK_CLIST (listbox_pull (l
->widget
.wdata
)), nth
);
422 listbox_select (GtkWidget
*widget
, int row
, int column
, GdkEvent
*event
, WListbox
*l
)
424 Dlg_head
*h
= l
->widget
.parent
;
431 listbox_select_by_number (l
, row
);
439 if (event
->type
== GDK_2BUTTON_PRESS
){
441 case listbox_nothing
:
446 h
->ret_value
= B_ENTER
;
451 if ((*l
->cback
)(l
) == listbox_finish
){
458 /* Send an artificial DLG_POST_KEY */
459 if (event
->type
== GDK_BUTTON_PRESS
)
460 (*l
->widget
.parent
->callback
)(l
->widget
.parent
, 0, DLG_POST_KEY
);
466 x_create_listbox (Dlg_head
*h
, widget_data parent
, WListbox
*l
)
468 GtkWidget
*listbox
, *sw
;
473 listbox
= gtk_clist_new (1);
474 sw
= gtk_scrolled_window_new (NULL
, NULL
);
475 gtk_container_add (GTK_CONTAINER (sw
), listbox
);
477 gtk_clist_set_selection_mode (GTK_CLIST (listbox
), GTK_SELECTION_BROWSE
);
478 gtk_widget_size_request (listbox
, &req
);
479 gtk_widget_set_usize (listbox
, req
.width
, req
.height
+ 20*8);
480 gtk_signal_connect (GTK_OBJECT (listbox
), "select_row",
481 GTK_SIGNAL_FUNC (listbox_select
), l
);
482 l
->widget
.wdata
= (widget_data
) sw
;
483 gtk_widget_show (listbox
);
485 g_warning ("FIXME: actually compute the real size of the listbox");
488 for (p
= l
->list
, i
= 0; i
< l
->count
; i
++, p
= p
->next
){
492 gtk_clist_append (GTK_CLIST (listbox
), text
);
494 x_listbox_select_nth (l
, l
->pos
);
499 x_list_insert (WListbox
*l
, WLEntry
*p
, WLEntry
*e
)
504 if (!l
->widget
.wdata
)
507 for (i
= 0; i
< l
->count
; i
++){
515 printf ("x_list_insert: should not happen!\n");
519 gtk_clist_append (GTK_CLIST (listbox_pull (l
->widget
.wdata
)), text
);
524 x_create_label (Dlg_head
*g
, widget_data parent
, WLabel
*l
)
531 label
= gtk_label_new (l
->widget
.tkname
);
533 label
= gtk_label_new ("");
535 label
= gtk_label_new (l
->text
);
536 gtk_widget_show (label
);
537 l
->widget
.wdata
= (widget_data
) label
;
543 x_label_set_text (WLabel
*label
, char *text
)
545 if (label
->widget
.wdata
)
546 gtk_label_set (GTK_LABEL (label
->widget
.wdata
), text
);
552 buttonbar_clicked (GtkWidget
*widget
, WButtonBar
*bb
)
554 GtkBox
*box
= GTK_BOX (widget
->parent
);
555 GList
*children
= box
->children
;
558 /* Find out which button we are (number) */
559 for (i
= 0; children
; children
= children
->next
, i
++){
560 if (((GtkBoxChild
*)children
->data
)->widget
== widget
){
561 if (bb
->labels
[i
].function
)
562 (*bb
->labels
[i
].function
)(bb
->labels
[i
].data
);
566 printf ("Mhm, should not happen or The Cow is out\n");
571 x_create_buttonbar (Dlg_head
*h
, widget_data parent
, WButtonBar
*bb
)
578 hbox
= gtk_hbox_new (0, 0);
580 for (i
= 0; i
< 10; i
++){
584 g_snprintf (buffer
, sizeof (buffer
), "F%d %s", i
+1, bb
->labels
[i
].text
? bb
->labels
[i
].text
: " ");
585 b
= (GtkButton
*) gtk_button_new_with_label (buffer
);
586 gtk_signal_connect (GTK_OBJECT (b
), "clicked",
587 GTK_SIGNAL_FUNC (buttonbar_clicked
), bb
);
588 gtk_widget_show (GTK_WIDGET (b
));
589 gtk_box_pack_start_defaults (GTK_BOX (hbox
), (GtkWidget
*)b
);
591 gtk_widget_show (hbox
);
593 bb
->widget
.wdata
= (widget_data
) hbox
;
598 x_redefine_label (WButtonBar
*bb
, int idx
)
601 GtkBox
*box
= GTK_BOX (bb
->widget
.wdata
);
602 GtkBoxChild
*bc
= (GtkBoxChild
*)g_list_nth (box
->children
, idx
)->data
;
603 GtkButton
*button
= GTK_BUTTON (bc
->widget
);
604 GtkWidget
*label
= gtk_label_new (bb
->labels
[idx
].text
);
606 gtk_widget_show (label
);
607 gtk_container_remove (GTK_CONTAINER (button
), button
->child
);
608 gtk_container_add (GTK_CONTAINER (button
), label
);
614 x_create_gauge (Dlg_head
*h
, widget_data parent
, WGauge
*g
)
618 pbar
= gtk_progress_bar_new ();
619 gtk_widget_show (pbar
);
620 g
->widget
.wdata
= (widget_data
) pbar
;
626 x_gauge_show (WGauge
*g
)
628 gtk_widget_show (GTK_WIDGET (g
->widget
.wdata
));
632 x_gauge_set_value (WGauge
*g
, int max
, int current
)
634 gtk_progress_bar_update (GTK_PROGRESS_BAR (g
->widget
.wdata
), ((gfloat
) current
/ (gfloat
) max
));