libyui-gtk-pkg  2.43.5
ygtkpkgquerycombo.cc
1 
2 /********************************************************************
3  * YaST2-GTK - http://en.opensuse.org/YaST2-GTK *
4  ********************************************************************/
5 /* YGtkPkgQueryCombo, an umbrella for any group of QueryWidget widgets */
6 // check the header file for information about this widget
7 
8 /*
9  Textdomain "gtk-pkg"
10  */
11 
12 #define YUILogComponent "gtk-pkg"
13 #include "YGi18n.h"
14 #include "config.h"
15 #include "YGUtils.h"
16 #include "ygtkpkgquerycombo.h"
17 #include <gtk/gtk.h>
18 
20  GtkWidget *vbox, *combo, *content;
21  Factory *factory;
22  YGtkPkgQueryWidget *child;
23 
24  Impl (Factory *factory) : factory (factory), child (NULL) {}
25 
26  ~Impl()
27  { delete child; }
28 };
29 
30 static void set_child (YGtkPkgQueryCombo *pThis, int index)
31 {
32  if (pThis->impl->child)
33  delete pThis->impl->child;
34  YGtkPkgQueryWidget *child = pThis->impl->factory->createQueryWidget (pThis, index);
35  pThis->impl->child = child;
36  child->setListener (pThis->listener);
37 
38  GtkWidget *cur_child = gtk_bin_get_child (GTK_BIN (pThis->impl->content));
39  if (cur_child)
40  gtk_container_remove (GTK_CONTAINER (pThis->impl->content), cur_child);
41  gtk_container_add (GTK_CONTAINER (pThis->impl->content), child->getWidget());
42  gtk_widget_grab_focus (child->getWidget());
43 }
44 
45 static void combo_changed_cb (GtkComboBox *combo, YGtkPkgQueryCombo *pThis)
46 {
47  Ypp::Busy busy (0);
48  set_child (pThis, gtk_combo_box_get_active (combo));
49  pThis->notify();
50 }
51 
52 YGtkPkgQueryCombo::YGtkPkgQueryCombo (Factory *factory)
53 : impl (new Impl (factory))
54 {
55  impl->combo = gtk_combo_box_text_new();
56  gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (impl->combo),
57  YGUtils::empty_row_is_separator_cb, GINT_TO_POINTER (0), NULL);
58  g_signal_connect_after (G_OBJECT (impl->combo), "changed",
59  G_CALLBACK (combo_changed_cb), this);
60  impl->content = gtk_event_box_new();
61  impl->vbox = gtk_vbox_new (FALSE, 0);
62  gtk_box_pack_start (GTK_BOX (impl->vbox), impl->combo, FALSE, TRUE, 0);
63  gtk_box_pack_start (GTK_BOX (impl->vbox), impl->content, TRUE, TRUE, 0);
64 }
65 
66 YGtkPkgQueryCombo::~YGtkPkgQueryCombo()
67 { delete impl; }
68 
69 GtkWidget *YGtkPkgQueryCombo::getWidget()
70 { return impl->vbox; }
71 
72 void YGtkPkgQueryCombo::add (const char *title)
73 {
74  GtkComboBoxText *combo = GTK_COMBO_BOX_TEXT (impl->combo);
75  gtk_combo_box_text_append (combo, NULL, title);
76 }
77 
78 void YGtkPkgQueryCombo::setActive (int index)
79 {
80  GtkComboBox *combo = GTK_COMBO_BOX (impl->combo);
81  if (gtk_combo_box_get_active (combo) != index) {
82  g_signal_handlers_block_by_func (combo, (gpointer) combo_changed_cb, this);
83  gtk_combo_box_set_active (combo, index);
84  g_signal_handlers_unblock_by_func (combo, (gpointer) combo_changed_cb, this);
85  set_child (this, index);
86  }
87 }
88 
89 bool YGtkPkgQueryCombo::begsUpdate()
90 { return impl->child->begsUpdate(); }
91 
92 void YGtkPkgQueryCombo::updateList (Ypp::List list)
93 { return impl->child->updateList (list); }
94 
95 void YGtkPkgQueryCombo::clearSelection()
96 { return impl->child->clearSelection(); }
97 
98 bool YGtkPkgQueryCombo::writeQuery (Ypp::PoolQuery &query)
99 { return impl->child->writeQuery (query); }
100 
101 void YGtkPkgQueryCombo::setListener (Listener *listener)
102 {
103  YGtkPkgQueryWidget::setListener (listener);
104  if (impl->child)
105  impl->child->setListener (listener);
106 }
107 
108 GtkWidget *YGtkPkgQueryCombo::createToolbox()
109 { return impl->child->createToolbox(); }
110