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 x_create_input (Dlg_head
*h
, widget_data parent
, WInput
*in
)
281 GtkWidget
*gnome_entry
;
284 /* The widget might have been initialized manually.
285 * Look in gscreen.c for an example
287 if (in
->widget
.wdata
)
290 #ifdef USE_GNOME_ENTRY
291 gnome_entry
= gnome_entry_new (in
->widget
.tkname
);
293 entry
= GTK_ENTRY (gnome_entry
= gtk_entry_new ());
294 gtk_entry_set_visibility (entry
, !in
->is_password
);
296 gtk_widget_show (gnome_entry
);
297 in
->widget
.wdata
= (widget_data
) gnome_entry
;
299 #ifdef USE_GNOME_ENTRY
300 entry
= GTK_ENTRY (gnome_entry_gtk_entry (GNOME_ENTRY (gnome_entry
)));
302 gtk_entry_set_text (entry
, in
->buffer
);
303 gtk_editable_select_region (GTK_EDITABLE (entry
), 0, -1);
304 gtk_entry_set_position (entry
, in
->point
);
306 gtk_signal_connect (GTK_OBJECT (entry
), "button_press_event",
307 GTK_SIGNAL_FUNC (entry_click
), in
);
309 gtk_signal_connect (GTK_OBJECT (entry
), "button_release_event",
310 GTK_SIGNAL_FUNC (entry_release
), in
);
315 x_update_input (WInput
*in
)
317 GnomeEntry
*gnome_entry
;
322 /* If the widget has not been initialized yet (done by WIDGET_INIT) */
323 if (!in
->widget
.wdata
)
326 #ifdef USE_GNOME_ENTRY
327 gnome_entry
= GNOME_ENTRY (in
->widget
.wdata
);
328 entry
= GTK_ENTRY (gnome_entry_gtk_entry (gnome_entry
));
330 entry
= GTK_ENTRY (in
->widget
.wdata
);
333 if (in
->first
== -1){
334 gtk_editable_select_region (GTK_EDITABLE (entry
), 0, 0);
338 text
= gtk_entry_get_text (GTK_ENTRY (entry
));
340 if (text
&& strcmp (text
, in
->buffer
)){
341 gtk_entry_set_text (entry
, in
->buffer
);
345 if (GTK_EDITABLE (entry
)->current_pos
!= in
->point
){
346 gtk_entry_set_position (entry
, in
->point
);
351 #ifdef USE_GNOME_ENTRY
352 gtk_widget_draw (GTK_WIDGET (gnome_entry
), NULL
);
354 gtk_widget_draw (GTK_WIDGET (entry
), NULL
);
356 gtk_editable_changed (GTK_EDITABLE (entry
));
357 gtk_widget_queue_draw (GTK_WIDGET (entry
));
363 listbox_pull (widget_data data
)
365 return GTK_BIN (data
)->child
;
369 x_listbox_select_nth (WListbox
*l
, int nth
)
377 if (!l
->widget
.wdata
)
381 clist
= GTK_CLIST (listbox_pull (l
->widget
.wdata
));
383 gtk_clist_select_row (clist
, nth
, 0);
384 if (gtk_clist_row_is_visible (clist
, nth
) != GTK_VISIBILITY_FULL
)
385 gtk_clist_moveto (clist
, nth
, 0, 0.5, 0.0);
391 x_listbox_delete_nth (WListbox
*l
, int nth
)
393 gtk_clist_remove (GTK_CLIST (listbox_pull (l
->widget
.wdata
)), nth
);
397 listbox_select (GtkWidget
*widget
, int row
, int column
, GdkEvent
*event
, WListbox
*l
)
399 Dlg_head
*h
= l
->widget
.parent
;
406 listbox_select_by_number (l
, row
);
414 if (event
->type
== GDK_2BUTTON_PRESS
){
416 case listbox_nothing
:
421 h
->ret_value
= B_ENTER
;
426 if ((*l
->cback
)(l
) == listbox_finish
){
433 /* Send an artificial DLG_POST_KEY */
434 if (event
->type
== GDK_BUTTON_PRESS
)
435 (*l
->widget
.parent
->callback
)(l
->widget
.parent
, 0, DLG_POST_KEY
);
441 x_create_listbox (Dlg_head
*h
, widget_data parent
, WListbox
*l
)
443 GtkWidget
*listbox
, *sw
;
448 listbox
= gtk_clist_new (1);
449 sw
= gtk_scrolled_window_new (NULL
, NULL
);
450 gtk_container_add (GTK_CONTAINER (sw
), listbox
);
452 gtk_clist_set_selection_mode (GTK_CLIST (listbox
), GTK_SELECTION_BROWSE
);
453 gtk_widget_size_request (listbox
, &req
);
454 gtk_widget_set_usize (listbox
, req
.width
, req
.height
+ 20*8);
455 gtk_signal_connect (GTK_OBJECT (listbox
), "select_row",
456 GTK_SIGNAL_FUNC (listbox_select
), l
);
457 l
->widget
.wdata
= (widget_data
) sw
;
458 gtk_widget_show (listbox
);
460 g_warning ("FIXME: actually compute the real size of the listbox");
463 for (p
= l
->list
, i
= 0; i
< l
->count
; i
++, p
= p
->next
){
467 gtk_clist_append (GTK_CLIST (listbox
), text
);
469 x_listbox_select_nth (l
, l
->pos
);
474 x_list_insert (WListbox
*l
, WLEntry
*p
, WLEntry
*e
)
479 if (!l
->widget
.wdata
)
482 for (i
= 0; i
< l
->count
; i
++){
490 printf ("x_list_insert: should not happen!\n");
494 gtk_clist_append (GTK_CLIST (listbox_pull (l
->widget
.wdata
)), text
);
499 x_create_label (Dlg_head
*g
, widget_data parent
, WLabel
*l
)
506 label
= gtk_label_new (l
->widget
.tkname
);
508 label
= gtk_label_new ("");
510 label
= gtk_label_new (l
->text
);
511 gtk_widget_show (label
);
512 l
->widget
.wdata
= (widget_data
) label
;
518 x_label_set_text (WLabel
*label
, char *text
)
520 if (label
->widget
.wdata
)
521 gtk_label_set (GTK_LABEL (label
->widget
.wdata
), text
);
526 buttonbar_clicked (GtkWidget
*widget
, WButtonBar
*bb
)
528 GtkBox
*box
= GTK_BOX (widget
->parent
);
529 GList
*children
= box
->children
;
532 /* Find out which button we are (number) */
533 for (i
= 0; children
; children
= children
->next
, i
++){
534 if (((GtkBoxChild
*)children
->data
)->widget
== widget
){
535 if (bb
->labels
[i
].function
)
536 (*bb
->labels
[i
].function
)(bb
->labels
[i
].data
);
540 printf ("Mhm, should not happen or The Cow is out\n");
544 x_create_buttonbar (Dlg_head
*h
, widget_data parent
, WButtonBar
*bb
)
549 hbox
= gtk_hbox_new (0, 0);
551 for (i
= 0; i
< 10; i
++){
555 g_snprintf (buffer
, sizeof (buffer
), "F%d %s", i
+1, bb
->labels
[i
].text
? bb
->labels
[i
].text
: " ");
556 b
= (GtkButton
*) gtk_button_new_with_label (buffer
);
557 gtk_signal_connect (GTK_OBJECT (b
), "clicked",
558 GTK_SIGNAL_FUNC (buttonbar_clicked
), bb
);
559 gtk_widget_show (GTK_WIDGET (b
));
560 gtk_box_pack_start_defaults (GTK_BOX (hbox
), (GtkWidget
*)b
);
562 gtk_widget_show (hbox
);
564 bb
->widget
.wdata
= (widget_data
) hbox
;
569 x_redefine_label (WButtonBar
*bb
, int idx
)
572 GtkBox
*box
= GTK_BOX (bb
->widget
.wdata
);
573 GtkBoxChild
*bc
= (GtkBoxChild
*)g_list_nth (box
->children
, idx
)->data
;
574 GtkButton
*button
= GTK_BUTTON (bc
->widget
);
575 GtkWidget
*label
= gtk_label_new (bb
->labels
[idx
].text
);
577 gtk_widget_show (label
);
578 gtk_container_remove (GTK_CONTAINER (button
), button
->child
);
579 gtk_container_add (GTK_CONTAINER (button
), label
);
585 x_create_gauge (Dlg_head
*h
, widget_data parent
, WGauge
*g
)
589 pbar
= gtk_progress_bar_new ();
590 gtk_widget_show (pbar
);
591 g
->widget
.wdata
= (widget_data
) pbar
;
597 x_gauge_show (WGauge
*g
)
599 gtk_widget_show (GTK_WIDGET (g
->widget
.wdata
));
603 x_gauge_set_value (WGauge
*g
, int max
, int current
)
605 gtk_progress_bar_update (GTK_PROGRESS_BAR (g
->widget
.wdata
), ((gfloat
) current
/ (gfloat
) max
));