90
89
get_pos (GnomeCmdCombo *combo, gint *x, gint *y, gint *height, gint *width)
94
GtkScrolledWindow *popup;
97
GtkRequisition list_requisition;
98
gboolean show_hscroll = FALSE;
99
gboolean show_vscroll = FALSE;
107
widget = GTK_WIDGET(combo);
108
popup = GTK_SCROLLED_WINDOW (combo->popup);
109
popwin = GTK_BIN (combo->popwin);
111
gdk_window_get_origin (combo->entry->window, x, y);
112
real_height = MIN (combo->entry->requisition.height,
113
combo->entry->allocation.height);
115
avail_height = gdk_screen_height () - *y;
117
gtk_widget_size_request (combo->list, &list_requisition);
118
min_height = MIN (list_requisition.height,
119
popup->vscrollbar->requisition.height);
120
if (!GTK_CLIST (combo->list)->rows)
121
list_requisition.height += EMPTY_LIST_HEIGHT;
123
alloc_width = (widget->allocation.width -
124
2 * popwin->child->style->xthickness -
125
2 * GTK_CONTAINER (popwin->child)->border_width -
126
2 * GTK_CONTAINER (combo->popup)->border_width -
127
2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width -
128
2 * GTK_BIN (popup)->child->style->xthickness) + 100;
130
work_height = (2 * popwin->child->style->ythickness +
131
2 * GTK_CONTAINER (popwin->child)->border_width +
132
2 * GTK_CONTAINER (combo->popup)->border_width +
133
2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width +
134
2 * GTK_BIN (popup)->child->style->xthickness)+20;
91
GtkWidget *widget = GTK_WIDGET(combo);
92
GtkScrolledWindow *popup = GTK_SCROLLED_WINDOW (combo->popup);
93
GtkBin *popwin = GTK_BIN (combo->popwin);
96
GtkRequisition list_requisition;
97
gboolean show_hscroll = FALSE;
98
gboolean show_vscroll = FALSE;
106
gdk_window_get_origin (combo->entry->window, x, y);
107
real_height = MIN (combo->entry->requisition.height, combo->entry->allocation.height);
109
avail_height = gdk_screen_height () - *y;
111
gtk_widget_size_request (combo->list, &list_requisition);
112
min_height = MIN (list_requisition.height, popup->vscrollbar->requisition.height);
113
if (!GTK_CLIST (combo->list)->rows)
114
list_requisition.height += EMPTY_LIST_HEIGHT;
116
alloc_width = (widget->allocation.width -
117
2 * popwin->child->style->xthickness -
118
2 * GTK_CONTAINER (popwin->child)->border_width -
119
2 * GTK_CONTAINER (combo->popup)->border_width -
120
2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width -
121
2 * GTK_BIN (popup)->child->style->xthickness) + 100;
123
work_height = (2 * popwin->child->style->ythickness +
124
2 * GTK_CONTAINER (popwin->child)->border_width +
125
2 * GTK_CONTAINER (combo->popup)->border_width +
126
2 * GTK_CONTAINER (GTK_BIN (popup)->child)->border_width +
127
2 * GTK_BIN (popup)->child->style->xthickness)+20;
138
old_width = alloc_width;
139
old_height = work_height;
142
alloc_width < list_requisition.width)
144
work_height += popup->hscrollbar->requisition.height +
145
GTK_SCROLLED_WINDOW_GET_CLASS
146
(combo->popup)->scrollbar_spacing;
150
work_height + list_requisition.height > avail_height)
152
if (work_height + min_height > avail_height &&
153
*y - real_height > avail_height)
155
*y -= (work_height + list_requisition.height + real_height);
159
popup->vscrollbar->requisition.width +
160
GTK_SCROLLED_WINDOW_GET_CLASS
161
(combo->popup)->scrollbar_spacing;
131
old_width = alloc_width;
132
old_height = work_height;
134
if (!show_hscroll && alloc_width < list_requisition.width)
136
work_height += popup->hscrollbar->requisition.height +
137
GTK_SCROLLED_WINDOW_GET_CLASS
138
(combo->popup)->scrollbar_spacing;
141
if (!show_vscroll && work_height + list_requisition.height > avail_height)
143
if (work_height + min_height > avail_height &&
144
*y - real_height > avail_height)
146
*y -= (work_height + list_requisition.height + real_height);
150
popup->vscrollbar->requisition.width +
151
GTK_SCROLLED_WINDOW_GET_CLASS
152
(combo->popup)->scrollbar_spacing;
164
155
} while (old_width != alloc_width || old_height != work_height);
166
*width = widget->allocation.width;
171
*height = avail_height;
173
*height = work_height + list_requisition.height;
157
*width = widget->allocation.width;
162
*height = avail_height;
164
*height = work_height + list_requisition.height;
181
172
gnome_cmd_combo_popup_list (GnomeCmdCombo *combo)
183
gint height, width, x, y;
185
get_pos (combo, &x, &y, &height, &width);
187
gtk_widget_set_uposition (combo->popwin, x, y);
188
gtk_widget_set_usize (combo->popwin, width, height);
189
gtk_widget_realize (combo->popwin);
190
gdk_window_resize (combo->popwin->window, width, height);
191
gtk_widget_show (combo->popwin);
174
gint height, width, x, y;
176
get_pos (combo, &x, &y, &height, &width);
178
gtk_widget_set_uposition (combo->popwin, x, y);
179
gtk_widget_set_usize (combo->popwin, width, height);
180
gtk_widget_realize (combo->popwin);
181
gdk_window_resize (combo->popwin->window, width, height);
182
gtk_widget_show (combo->popwin);
198
186
/*******************************
200
188
*******************************/
203
191
on_popup_button_release (GtkWidget *button,
204
GnomeCmdCombo *combo)
192
GnomeCmdCombo *combo)
206
if (combo->is_popped) {
207
gtk_widget_hide (combo->popwin);
208
combo->is_popped = FALSE;
211
gnome_cmd_combo_popup_list (combo);
212
combo->is_popped = TRUE;
194
if (combo->is_popped) {
195
gtk_widget_hide (combo->popwin);
196
combo->is_popped = FALSE;
199
gnome_cmd_combo_popup_list (combo);
200
combo->is_popped = TRUE;
220
208
on_list_key_press (GtkWidget *widget, GdkEventKey *event, GnomeCmdCombo *combo)
222
if (event->keyval == GDK_Escape) {
223
gtk_widget_hide (combo->popwin);
224
combo->is_popped = FALSE;
210
if (event->keyval == GDK_Escape) {
211
gtk_widget_hide (combo->popwin);
212
combo->is_popped = FALSE;
233
221
on_popwin_button_released (GtkWidget *button,
234
GdkEventButton *event,
235
GnomeCmdCombo *combo)
222
GdkEventButton *event,
223
GnomeCmdCombo *combo)
239
if (!event) return FALSE;
240
if (event->button != 1) return FALSE;
242
// Check to see if we clicked inside the popwin
243
child = gtk_get_event_widget ((GdkEvent*) event);
244
while (child && child != (combo->popwin))
245
child = child->parent;
247
if (child != combo->popwin) {
248
// We clicked outside the popwin
249
gtk_widget_hide (combo->popwin);
250
combo->is_popped = FALSE;
227
if (!event) return FALSE;
228
if (event->button != 1) return FALSE;
230
// Check to see if we clicked inside the popwin
231
child = gtk_get_event_widget ((GdkEvent*) event);
232
while (child && child != (combo->popwin))
233
child = child->parent;
235
if (child != combo->popwin) {
236
// We clicked outside the popwin
237
gtk_widget_hide (combo->popwin);
238
combo->is_popped = FALSE;
259
247
on_popwin_keypress (GtkWidget *widget, GdkEventKey *event, GnomeCmdCombo *combo)
261
if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter) {
265
row = GTK_CLIST (combo->list)->focus_row;
266
if (row < 0) return TRUE;
268
data = gtk_clist_get_row_data (GTK_CLIST (combo->list), row);
269
gtk_signal_emit (GTK_OBJECT (combo), combo_signals[ITEM_SELECTED], data);
249
if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter) {
253
row = GTK_CLIST (combo->list)->focus_row;
254
if (row < 0) return TRUE;
256
data = gtk_clist_get_row_data (GTK_CLIST (combo->list), row);
257
gtk_signal_emit (GTK_OBJECT (combo), combo_signals[ITEM_SELECTED], data);
279
267
on_list_button_press (GtkCList *clist, GdkEventButton *event, GnomeCmdCombo *combo)
283
if (clist->clist_window != event->window)
286
row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (clist), event->x, event->y);
290
if (row != clist->focus_row) {
291
gtk_clist_select_row (clist, row, 0);
292
clist->focus_row = row;
295
gtk_signal_emit_stop_by_name (GTK_OBJECT (clist), "button-press-event");
271
if (clist->clist_window != event->window)
274
row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (clist), event->x, event->y);
278
if (row != clist->focus_row) {
279
gtk_clist_select_row (clist, row, 0);
280
clist->focus_row = row;
283
gtk_signal_emit_stop_by_name (GTK_OBJECT (clist), "button-press-event");
302
290
on_list_button_release (GtkCList *clist, GdkEventButton *event, GnomeCmdCombo *combo)
306
row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (clist), event->x, event->y);
308
if (clist->focus_row >= 0 && clist->focus_row == row) {
309
gpointer data = gtk_clist_get_row_data (clist, clist->focus_row);
310
gtk_signal_emit (GTK_OBJECT (combo), combo_signals[ITEM_SELECTED], data);
320
on_popwin_show (GtkWidget *widget,
321
GnomeCmdCombo *combo)
323
gtk_grab_add (combo->popwin);
324
gtk_widget_grab_focus (combo->list);
329
on_popwin_hide (GtkWidget *widget,
330
GnomeCmdCombo *combo)
332
gtk_grab_remove (combo->popwin);
333
gtk_signal_emit (GTK_OBJECT (combo), combo_signals[POPWIN_HIDDEN]);
292
gint row = gnome_cmd_clist_get_row (GNOME_CMD_CLIST (clist), event->x, event->y);
294
if (clist->focus_row >= 0 && clist->focus_row == row) {
295
gpointer data = gtk_clist_get_row_data (clist, clist->focus_row);
296
gtk_signal_emit (GTK_OBJECT (combo), combo_signals[ITEM_SELECTED], data);
306
on_popwin_show (GtkWidget *widget, GnomeCmdCombo *combo)
308
gtk_grab_add (combo->popwin);
309
gtk_widget_grab_focus (combo->list);
314
on_popwin_hide (GtkWidget *widget, GnomeCmdCombo *combo)
316
gtk_grab_remove (combo->popwin);
317
gtk_signal_emit (GTK_OBJECT (combo), combo_signals[POPWIN_HIDDEN]);
342
326
destroy (GtkObject *combo)
344
if (GTK_OBJECT_CLASS (parent_class)->destroy)
345
(*GTK_OBJECT_CLASS (parent_class)->destroy) (combo);
328
if (GTK_OBJECT_CLASS (parent_class)->destroy)
329
(*GTK_OBJECT_CLASS (parent_class)->destroy) (combo);
350
334
class_init (GnomeCmdComboClass *klass)
352
GtkObjectClass *object_class;
353
GtkWidgetClass *widget_class;
355
parent_class = gtk_type_class (gtk_hbox_get_type ());
356
object_class = (GtkObjectClass *) klass;
357
widget_class = (GtkWidgetClass *) klass;
359
combo_signals[ITEM_SELECTED] =
360
gtk_signal_new ("item_selected",
362
G_OBJECT_CLASS_TYPE (object_class),
363
GTK_SIGNAL_OFFSET (GnomeCmdComboClass, item_selected),
364
gtk_marshal_NONE__POINTER,
366
1, GTK_TYPE_POINTER);
368
combo_signals[POPWIN_HIDDEN] =
369
gtk_signal_new ("popwin_hidden",
371
G_OBJECT_CLASS_TYPE (object_class),
372
GTK_SIGNAL_OFFSET (GnomeCmdComboClass, popwin_hidden),
373
gtk_marshal_NONE__NONE,
377
object_class->destroy = destroy;
378
widget_class->size_allocate = size_allocate;
379
klass->item_selected = gnome_cmd_combo_item_selected;
380
klass->popwin_hidden = NULL;
336
GtkObjectClass *object_class;
337
GtkWidgetClass *widget_class;
339
parent_class = gtk_type_class (gtk_hbox_get_type ());
340
object_class = (GtkObjectClass *) klass;
341
widget_class = (GtkWidgetClass *) klass;
343
combo_signals[ITEM_SELECTED] =
344
gtk_signal_new ("item_selected",
346
G_OBJECT_CLASS_TYPE (object_class),
347
GTK_SIGNAL_OFFSET (GnomeCmdComboClass, item_selected),
348
gtk_marshal_NONE__POINTER,
350
1, GTK_TYPE_POINTER);
352
combo_signals[POPWIN_HIDDEN] =
353
gtk_signal_new ("popwin_hidden",
355
G_OBJECT_CLASS_TYPE (object_class),
356
GTK_SIGNAL_OFFSET (GnomeCmdComboClass, popwin_hidden),
357
gtk_marshal_NONE__NONE,
361
object_class->destroy = destroy;
362
widget_class->size_allocate = size_allocate;
363
klass->item_selected = gnome_cmd_combo_item_selected;
364
klass->popwin_hidden = NULL;
384
369
init (GnomeCmdCombo *combo)
388
GtkWidget *event_box;
391
combo->value_in_list = 0;
392
combo->ok_if_empty = 1;
393
combo->highest_pixmap = 20;
394
combo->widest_pixmap = 20;
395
combo->is_popped = FALSE;
397
combo->entry = gtk_entry_new ();
398
gtk_widget_ref (combo->entry);
399
gtk_object_set_data_full (GTK_OBJECT (combo),
400
"entry", combo->entry,
401
(GtkDestroyNotify) gtk_widget_unref);
402
gtk_widget_show (combo->entry);
403
gtk_widget_set_usize (combo->entry, 60, -1);
404
gtk_entry_set_editable (GTK_ENTRY (combo->entry), FALSE);
405
GTK_WIDGET_UNSET_FLAGS (combo->entry, GTK_CAN_FOCUS);
407
combo->button = gtk_button_new ();
408
gtk_widget_ref (combo->button);
409
gtk_button_set_relief (GTK_BUTTON (combo->button), gnome_cmd_data_get_button_relief ());
410
gtk_object_set_data_full (GTK_OBJECT (combo),
411
"button", combo->button,
412
(GtkDestroyNotify) gtk_widget_unref);
413
gtk_widget_show (combo->button);
415
arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
416
gtk_widget_ref (arrow);
417
gtk_object_set_data_full (GTK_OBJECT (combo),
419
(GtkDestroyNotify) gtk_widget_unref);
420
gtk_widget_show (arrow);
422
gtk_container_add (GTK_CONTAINER (combo->button), arrow);
423
gtk_box_pack_start (GTK_BOX (combo), combo->entry, TRUE, TRUE, 0);
424
gtk_box_pack_end (GTK_BOX (combo), combo->button, FALSE, FALSE, 0);
426
/* connect button signals */
428
GTK_OBJECT (combo->button), "clicked",
429
(GtkSignalFunc) on_popup_button_release, combo);
431
combo->popwin = gtk_window_new (GTK_WINDOW_POPUP);
432
gtk_widget_ref (combo->popwin);
433
gtk_object_set_data_full (GTK_OBJECT (combo),
434
"popwin", combo->popwin,
435
(GtkDestroyNotify) gtk_widget_unref);
436
gtk_window_set_policy (GTK_WINDOW (combo->popwin), 1, 1, 0);
438
gtk_widget_set_events (combo->popwin, GDK_KEY_PRESS_MASK);
439
gtk_widget_set_events (combo->popwin, GDK_BUTTON_PRESS_MASK);
441
/* connect popupwin signals */
443
GTK_OBJECT (combo->popwin), "button-release-event",
444
GTK_SIGNAL_FUNC (on_popwin_button_released), combo);
446
GTK_OBJECT (combo->popwin), "key-press-event",
447
GTK_SIGNAL_FUNC (on_popwin_keypress), combo);
449
GTK_OBJECT (combo->popwin), "show",
450
GTK_SIGNAL_FUNC (on_popwin_show), combo);
452
GTK_OBJECT (combo->popwin), "hide",
453
GTK_SIGNAL_FUNC (on_popwin_hide), combo);
455
event_box = gtk_event_box_new ();
456
gtk_widget_ref (event_box);
457
gtk_object_set_data_full (GTK_OBJECT (combo),
458
"event_box", event_box,
459
(GtkDestroyNotify) gtk_widget_unref);
460
gtk_container_add (GTK_CONTAINER (combo->popwin), event_box);
461
gtk_widget_show (event_box);
462
gtk_widget_realize (event_box);
464
cursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW);
465
gdk_window_set_cursor (event_box->window, cursor);
466
gdk_cursor_destroy (cursor);
468
frame = gtk_frame_new (NULL);
469
gtk_widget_ref (frame);
470
gtk_object_set_data_full (GTK_OBJECT (combo),
472
(GtkDestroyNotify) gtk_widget_unref);
473
gtk_container_add (GTK_CONTAINER (event_box), frame);
474
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
475
gtk_widget_show (frame);
477
combo->popup = gtk_scrolled_window_new (NULL, NULL);
478
gtk_widget_ref (combo->popup);
479
gtk_object_set_data_full (GTK_OBJECT (combo),
480
"combo->popup", combo->popup,
481
(GtkDestroyNotify) gtk_widget_unref);
482
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (combo->popup),
483
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
484
GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (combo->popup)->hscrollbar, GTK_CAN_FOCUS);
485
GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (combo->popup)->vscrollbar, GTK_CAN_FOCUS);
486
gtk_container_add (GTK_CONTAINER (frame), combo->popup);
487
gtk_widget_show (combo->popup);
373
GtkWidget *event_box;
376
combo->value_in_list = 0;
377
combo->ok_if_empty = 1;
378
combo->highest_pixmap = 20;
379
combo->widest_pixmap = 20;
380
combo->is_popped = FALSE;
382
combo->entry = gtk_entry_new ();
383
gtk_widget_ref (combo->entry);
384
gtk_object_set_data_full (GTK_OBJECT (combo), "entry", combo->entry, (GtkDestroyNotify) gtk_widget_unref);
385
gtk_widget_show (combo->entry);
386
gtk_widget_set_usize (combo->entry, 60, -1);
387
gtk_entry_set_editable (GTK_ENTRY (combo->entry), FALSE);
388
GTK_WIDGET_UNSET_FLAGS (combo->entry, GTK_CAN_FOCUS);
390
combo->button = gtk_button_new ();
391
gtk_widget_ref (combo->button);
392
gtk_button_set_relief (GTK_BUTTON (combo->button), gnome_cmd_data_get_button_relief ());
393
gtk_object_set_data_full (GTK_OBJECT (combo), "button", combo->button, (GtkDestroyNotify) gtk_widget_unref);
394
gtk_widget_show (combo->button);
396
arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT);
397
gtk_widget_ref (arrow);
398
gtk_object_set_data_full (GTK_OBJECT (combo), "arrow", arrow, (GtkDestroyNotify) gtk_widget_unref);
399
gtk_widget_show (arrow);
401
gtk_container_add (GTK_CONTAINER (combo->button), arrow);
402
gtk_box_pack_start (GTK_BOX (combo), combo->entry, TRUE, TRUE, 0);
403
gtk_box_pack_end (GTK_BOX (combo), combo->button, FALSE, FALSE, 0);
405
/* connect button signals */
406
gtk_signal_connect (GTK_OBJECT (combo->button), "clicked", (GtkSignalFunc) on_popup_button_release, combo);
408
combo->popwin = gtk_window_new (GTK_WINDOW_POPUP);
409
gtk_widget_ref (combo->popwin);
410
gtk_object_set_data_full (GTK_OBJECT (combo), "popwin", combo->popwin, (GtkDestroyNotify) gtk_widget_unref);
411
gtk_window_set_policy (GTK_WINDOW (combo->popwin), 1, 1, 0);
413
gtk_widget_set_events (combo->popwin, GDK_KEY_PRESS_MASK);
414
gtk_widget_set_events (combo->popwin, GDK_BUTTON_PRESS_MASK);
416
/* connect popupwin signals */
417
gtk_signal_connect (GTK_OBJECT (combo->popwin), "button-release-event", GTK_SIGNAL_FUNC (on_popwin_button_released), combo);
418
gtk_signal_connect (GTK_OBJECT (combo->popwin), "key-press-event", GTK_SIGNAL_FUNC (on_popwin_keypress), combo);
419
gtk_signal_connect (GTK_OBJECT (combo->popwin), "show", GTK_SIGNAL_FUNC (on_popwin_show), combo);
420
gtk_signal_connect (GTK_OBJECT (combo->popwin), "hide", GTK_SIGNAL_FUNC (on_popwin_hide), combo);
422
event_box = gtk_event_box_new ();
423
gtk_widget_ref (event_box);
424
gtk_object_set_data_full (GTK_OBJECT (combo),"event_box", event_box, (GtkDestroyNotify) gtk_widget_unref);
425
gtk_container_add (GTK_CONTAINER (combo->popwin), event_box);
426
gtk_widget_show (event_box);
427
gtk_widget_realize (event_box);
429
cursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW);
430
gdk_window_set_cursor (event_box->window, cursor);
431
gdk_cursor_destroy (cursor);
433
frame = gtk_frame_new (NULL);
434
gtk_widget_ref (frame);
435
gtk_object_set_data_full (GTK_OBJECT (combo), "frame", frame, (GtkDestroyNotify) gtk_widget_unref);
436
gtk_container_add (GTK_CONTAINER (event_box), frame);
437
gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_OUT);
438
gtk_widget_show (frame);
440
combo->popup = gtk_scrolled_window_new (NULL, NULL);
441
gtk_widget_ref (combo->popup);
442
gtk_object_set_data_full (GTK_OBJECT (combo),"combo->popup", combo->popup, (GtkDestroyNotify) gtk_widget_unref);
443
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (combo->popup), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
444
GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (combo->popup)->hscrollbar, GTK_CAN_FOCUS);
445
GTK_WIDGET_UNSET_FLAGS (GTK_SCROLLED_WINDOW (combo->popup)->vscrollbar, GTK_CAN_FOCUS);
446
gtk_container_add (GTK_CONTAINER (frame), combo->popup);
447
gtk_widget_show (combo->popup);
492
451
/***********************************
493
452
* Public functions
494
453
***********************************/
497
456
gnome_cmd_combo_get_type (void)
499
static guint combo_type = 0;
458
static guint combo_type = 0;
503
static const GtkTypeInfo combo_info =
506
sizeof (GnomeCmdCombo),
507
sizeof (GnomeCmdComboClass),
508
(GtkClassInitFunc) class_init,
509
(GtkObjectInitFunc) init,
510
/* reserved_1 */ NULL,
511
/* reserved_2 */ NULL,
512
(GtkClassInitFunc) NULL,
514
combo_type = gtk_type_unique (gtk_hbox_get_type (), &combo_info);
462
static const GtkTypeInfo combo_info =
465
sizeof (GnomeCmdCombo),
466
sizeof (GnomeCmdComboClass),
467
(GtkClassInitFunc) class_init,
468
(GtkObjectInitFunc) init,
469
/* reserved_1 */ NULL,
470
/* reserved_2 */ NULL,
471
(GtkClassInitFunc) NULL,
473
combo_type = gtk_type_unique (gtk_hbox_get_type (), &combo_info);
520
480
gnome_cmd_combo_new (gint num_cols, gint text_col, gchar **col_titles)
522
GnomeCmdCombo *combo = gtk_type_new (gnome_cmd_combo_get_type ());
524
combo->text_col = text_col;
525
combo->sel_data = NULL;
526
combo->sel_text = NULL;
529
combo->list = gnome_cmd_clist_new_with_titles (num_cols, col_titles);
531
combo->list = gnome_cmd_clist_new (num_cols);
533
gtk_widget_ref (combo->list);
534
gtk_object_set_data_full (GTK_OBJECT (combo),
535
"combo->list", combo->list,
536
(GtkDestroyNotify) gtk_widget_unref);
538
/* We'll use enter notify events to figure out when to transfer
539
* the grab to the list
541
gtk_container_add (GTK_CONTAINER (combo->popup), combo->list);
542
gtk_widget_show (combo->list);
544
/* connect list signals */
546
GTK_OBJECT (combo->list), "button-press-event",
547
GTK_SIGNAL_FUNC (on_list_button_press), combo);
549
GTK_OBJECT (combo->list), "button-release-event",
550
GTK_SIGNAL_FUNC (on_list_button_release), combo);
552
GTK_OBJECT (combo->list), "key-press-event",
553
GTK_SIGNAL_FUNC (on_list_key_press), combo);
555
return GTK_WIDGET (combo);
482
GnomeCmdCombo *combo = gtk_type_new (gnome_cmd_combo_get_type ());
484
combo->text_col = text_col;
485
combo->sel_data = NULL;
486
combo->sel_text = NULL;
489
combo->list = gnome_cmd_clist_new_with_titles (num_cols, col_titles);
491
combo->list = gnome_cmd_clist_new (num_cols);
493
gtk_widget_ref (combo->list);
494
gtk_object_set_data_full (GTK_OBJECT (combo), "combo->list", combo->list, (GtkDestroyNotify) gtk_widget_unref);
496
/* We'll use enter notify events to figure out when to transfer
497
* the grab to the list
499
gtk_container_add (GTK_CONTAINER (combo->popup), combo->list);
500
gtk_widget_show (combo->list);
502
/* connect list signals */
503
gtk_signal_connect (GTK_OBJECT (combo->list), "button-press-event", GTK_SIGNAL_FUNC (on_list_button_press), combo);
504
gtk_signal_connect (GTK_OBJECT (combo->list), "button-release-event", GTK_SIGNAL_FUNC (on_list_button_release), combo);
505
gtk_signal_connect (GTK_OBJECT (combo->list), "key-press-event", GTK_SIGNAL_FUNC (on_list_key_press), combo);
507
return GTK_WIDGET (combo);
560
512
gnome_cmd_combo_clear (GnomeCmdCombo *combo)
562
gtk_clist_clear (GTK_CLIST (combo->list));
514
gtk_clist_clear (GTK_CLIST (combo->list));
567
519
gnome_cmd_combo_append (GnomeCmdCombo *combo, gchar **text, gpointer data)
571
g_return_val_if_fail (GNOME_CMD_IS_COMBO (combo), -1);
572
g_return_val_if_fail (text != NULL, -1);
574
row = gtk_clist_append (GTK_CLIST (combo->list), text);
575
gtk_clist_set_row_data (GTK_CLIST (combo->list), row, data);
523
g_return_val_if_fail (GNOME_CMD_IS_COMBO (combo), -1);
524
g_return_val_if_fail (text != NULL, -1);
526
row = gtk_clist_append (GTK_CLIST (combo->list), text);
527
gtk_clist_set_row_data (GTK_CLIST (combo->list), row, data);
582
534
gnome_cmd_combo_insert (GnomeCmdCombo *combo, gchar **text, gpointer data)
586
g_return_val_if_fail (GNOME_CMD_IS_COMBO (combo), -1);
587
g_return_val_if_fail (text != NULL, -1);
589
row = gtk_clist_insert (GTK_CLIST (combo->list), 0, text);
590
gtk_clist_set_row_data (GTK_CLIST (combo->list), row, data);
538
g_return_val_if_fail (GNOME_CMD_IS_COMBO (combo), -1);
539
g_return_val_if_fail (text != NULL, -1);
541
row = gtk_clist_insert (GTK_CLIST (combo->list), 0, text);
542
gtk_clist_set_row_data (GTK_CLIST (combo->list), row, data);
597
549
gnome_cmd_combo_set_pixmap (GnomeCmdCombo *combo,
600
GnomeCmdPixmap *pixmap)
552
GnomeCmdPixmap *pixmap)
602
g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
603
g_return_if_fail (pixmap != NULL);
605
gtk_clist_set_pixmap (GTK_CLIST (combo->list), row, col, pixmap->pixmap, pixmap->mask);
606
if (pixmap->height > combo->highest_pixmap) {
607
gtk_clist_set_row_height (GTK_CLIST (combo->list), pixmap->height);
608
combo->highest_pixmap = pixmap->height;
610
if (pixmap->width > combo->widest_pixmap) {
611
gtk_clist_set_column_width (GTK_CLIST (combo->list), 0, pixmap->width);
612
combo->widest_pixmap = pixmap->width;
554
g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
555
g_return_if_fail (pixmap != NULL);
557
gtk_clist_set_pixmap (GTK_CLIST (combo->list), row, col, pixmap->pixmap, pixmap->mask);
558
if (pixmap->height > combo->highest_pixmap) {
559
gtk_clist_set_row_height (GTK_CLIST (combo->list), pixmap->height);
560
combo->highest_pixmap = pixmap->height;
562
if (pixmap->width > combo->widest_pixmap) {
563
gtk_clist_set_column_width (GTK_CLIST (combo->list), 0, pixmap->width);
564
combo->widest_pixmap = pixmap->width;
618
570
gnome_cmd_combo_select_text (GnomeCmdCombo *combo, const gchar *text)
620
g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
621
g_return_if_fail (text != NULL);
572
g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
573
g_return_if_fail (text != NULL);
623
gtk_entry_set_text (GTK_ENTRY (combo->entry), text);
575
gtk_entry_set_text (GTK_ENTRY (combo->entry), text);
628
gnome_cmd_combo_select_data (GnomeCmdCombo *combo,
580
gnome_cmd_combo_select_data (GnomeCmdCombo *combo, gpointer data)
634
g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
636
clist = GTK_CLIST (combo->list);
637
row = gtk_clist_find_row_from_data (clist, data);
639
if (gtk_clist_get_text (clist, row, combo->text_col, &combo->sel_text)) {
640
combo->sel_data = data;
641
gtk_entry_set_text (GTK_ENTRY (combo->entry), combo->sel_text);
642
gtk_clist_select_row (GTK_CLIST (combo->list), row, 0);
585
g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
587
clist = GTK_CLIST (combo->list);
588
row = gtk_clist_find_row_from_data (clist, data);
590
if (gtk_clist_get_text (clist, row, combo->text_col, &combo->sel_text)) {
591
combo->sel_data = data;
592
gtk_entry_set_text (GTK_ENTRY (combo->entry), combo->sel_text);
593
gtk_clist_select_row (GTK_CLIST (combo->list), row, 0);
648
599
gnome_cmd_combo_update_style (GnomeCmdCombo *combo)
650
gtk_widget_set_style (combo->entry, list_style);
651
gnome_cmd_clist_update_style (GNOME_CMD_CLIST (combo->list));
601
gtk_widget_set_style (combo->entry, list_style);
602
gnome_cmd_clist_update_style (GNOME_CMD_CLIST (combo->list));
656
607
gnome_cmd_combo_item_selected (GnomeCmdCombo *combo, gpointer data)
660
g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
662
gtk_widget_hide (combo->popwin);
663
combo->is_popped = FALSE;
665
row = gtk_clist_find_row_from_data (GTK_CLIST (combo->list), data);
667
if (gtk_clist_get_text (GTK_CLIST (combo->list), row, combo->text_col, &combo->sel_text)) {
668
combo->sel_data = data;
669
gtk_entry_set_text (GTK_ENTRY (combo->entry), combo->sel_text);
611
g_return_if_fail (GNOME_CMD_IS_COMBO (combo));
613
gtk_widget_hide (combo->popwin);
614
combo->is_popped = FALSE;
616
row = gtk_clist_find_row_from_data (GTK_CLIST (combo->list), data);
618
if (gtk_clist_get_text (GTK_CLIST (combo->list), row, combo->text_col, &combo->sel_text)) {
619
combo->sel_data = data;
620
gtk_entry_set_text (GTK_ENTRY (combo->entry), combo->sel_text);
675
626
gnome_cmd_combo_get_selected_data (GnomeCmdCombo *combo)
677
g_return_val_if_fail (GNOME_CMD_IS_COMBO (combo), NULL);
628
g_return_val_if_fail (GNOME_CMD_IS_COMBO (combo), NULL);
679
return combo->sel_data;
630
return combo->sel_data;
684
635
gnome_cmd_combo_get_selected_text (GnomeCmdCombo *combo)
686
g_return_val_if_fail (GNOME_CMD_IS_COMBO (combo), NULL);
688
return combo->sel_text;
637
g_return_val_if_fail (GNOME_CMD_IS_COMBO (combo), NULL);
639
return combo->sel_text;