libyui-gtk  2.44.5
YGFrame.cc
1 /********************************************************************
2  * YaST2-GTK - http://en.opensuse.org/YaST2-GTK *
3  ********************************************************************/
4 
5 #define YUILogComponent "gtk"
6 #include <yui/Libyui_config.h>
7 #include "YGUI.h"
8 #include "YGWidget.h"
9 #include "YGUtils.h"
10 
11 // Instead of traditional looking frames, we use Gnome convention for the
12 // frame's look. That is: don't draw a frame, use bold header and pad the child.
13 #define CHILD_INDENTATION 8
14 
15 class YGBaseFrame : public YGWidget
16 {
17 protected:
18 // a GtkAlignment to set some indentation on the child
19 GtkWidget *m_containee;
20 
21 public:
22  YGBaseFrame (YWidget *ywidget, YWidget *parent)
23  : YGWidget (ywidget, parent,
24  GTK_TYPE_FRAME, "shadow-type", GTK_SHADOW_NONE, NULL)
25  {
26  m_containee = gtk_alignment_new (0, 0, 1, 1);
27  gtk_alignment_set_padding (GTK_ALIGNMENT (m_containee),
28  0, 0, CHILD_INDENTATION, 0);
29  gtk_widget_show (m_containee);
30  gtk_container_add (GTK_CONTAINER (getWidget()), m_containee);
31  }
32 
33  virtual GtkWidget *getContainer()
34  { return m_containee; }
35 };
36 
37 #include "YFrame.h"
38 
39 static GtkWidget *findFirstFocusable (GtkContainer *container)
40 {
41  g_return_val_if_fail (container != NULL, NULL);
42 
43  for (GList *l = gtk_container_get_children (container);
44  l; l = l->next) {
45  if (gtk_widget_get_can_focus (GTK_WIDGET(l->data)))
46  return GTK_WIDGET (l->data);
47  else if (GTK_IS_CONTAINER (l->data)) {
48  GtkWidget *ret = findFirstFocusable (GTK_CONTAINER (l->data));
49  if (ret)
50  return ret;
51  }
52  }
53  return NULL;
54 }
55 
56 extern "C" {
57  static gboolean
58  frame_label_mnemonic_activate (GtkWidget *widget,
59  gboolean group_cycling,
60  GtkContainer *frame_container)
61  {
62  GtkWidget *focusable = findFirstFocusable (frame_container);
63  if (focusable == NULL) {
64  g_warning ("no focusable widgets for mnemonic");
65  return FALSE;
66  } else
67  return gtk_widget_mnemonic_activate (focusable, group_cycling);
68  }
69 }
70 
71 class YGFrame : public YFrame, public YGBaseFrame
72 {
73 public:
74  YGFrame (YWidget *parent, const std::string &label)
75  : YFrame (NULL, label),
76  YGBaseFrame (this, parent)
77  {
78  GtkWidget *label_widget = gtk_label_new_with_mnemonic ("");
79  g_signal_connect (G_OBJECT (label_widget), "mnemonic_activate",
80  G_CALLBACK (frame_label_mnemonic_activate),
81  getWidget());
82  YGUtils::setWidgetFont (GTK_WIDGET (label_widget), PANGO_STYLE_NORMAL,
83  PANGO_WEIGHT_BOLD, PANGO_SCALE_MEDIUM);
84  gtk_widget_show (label_widget);
85  gtk_frame_set_label_widget (GTK_FRAME (getWidget()), label_widget);
86  setLabel (label);
87  }
88 
89  // YFrame
90  virtual void setLabel (const std::string &_str)
91  {
92  GtkWidget *label = gtk_frame_get_label_widget (GTK_FRAME (getWidget()));
93  std::string str (YGUtils::mapKBAccel (_str));
94  gtk_label_set_text_with_mnemonic (GTK_LABEL (label), str.c_str());
95  YFrame::setLabel (_str);
96  }
97 
98  YGWIDGET_IMPL_CONTAINER (YFrame)
99 
100  // YGWidget
101  virtual std::string getDebugLabel() const
102  { return label(); }
103 };
104 
105 
106 YFrame *YGWidgetFactory::createFrame (YWidget *parent, const std::string &label)
107 { return new YGFrame (parent, label); }
108 
109 #include "YCheckBoxFrame.h"
110 
111 class YGCheckBoxFrame : public YCheckBoxFrame, public YGBaseFrame
112 {
113 public:
114  YGCheckBoxFrame (YWidget *parent, const std::string &label, bool checked)
115  : YCheckBoxFrame (NULL, label, checked),
116  YGBaseFrame (this, parent)
117  {
118  GtkWidget *button = gtk_check_button_new_with_mnemonic("");
119  YGUtils::setWidgetFont (gtk_bin_get_child (GTK_BIN (button)), PANGO_STYLE_NORMAL,
120  PANGO_WEIGHT_BOLD, PANGO_SCALE_MEDIUM);
121  gtk_widget_show_all (button);
122  gtk_frame_set_label_widget (GTK_FRAME (getWidget()), button);
123 
124  setLabel (label);
125  setValue (checked);
126  connect (button, "toggled", G_CALLBACK (toggled_cb), this);
127  }
128 
129  // YCheckBoxFrame
130  virtual void setLabel (const std::string &_str)
131  {
132  GtkWidget *button = gtk_frame_get_label_widget (GTK_FRAME (getWidget()));
133  GtkLabel *label = GTK_LABEL (gtk_bin_get_child(GTK_BIN (button)));
134 
135  std::string str (YGUtils::mapKBAccel (_str));
136  gtk_label_set_text_with_mnemonic (label, str.c_str());
137  YCheckBoxFrame::setLabel (_str);
138  }
139 
140  bool value()
141  {
142  GtkWidget *button = gtk_frame_get_label_widget (GTK_FRAME (getWidget()));
143  return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
144  }
145 
146  void setValue (bool value)
147  {
148  BlockEvents (this);
149  GtkWidget *button = gtk_frame_get_label_widget (GTK_FRAME (getWidget()));
150  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), value);
151  }
152 
153  // YGWidget
154  virtual void doSetEnabled (bool enabled)
155  {
156  GtkWidget *frame = getWidget();
157  if (enabled) {
158  gtk_widget_set_sensitive (frame, TRUE);
159  handleChildrenEnablement (value());
160  }
161  else {
162  gtk_widget_set_sensitive (frame, FALSE);
163  YWidget::setChildrenEnabled (false);
164  }
165  YWidget::setEnabled (enabled);
166  }
167 
168  YGWIDGET_IMPL_CONTAINER (YCheckBoxFrame)
169 
170 private:
171  static void toggled_cb (GtkWidget *widget, YGCheckBoxFrame *pThis)
172  {
173  pThis->setEnabled (true);
174  if (pThis->notify())
175  YGUI::ui()->sendEvent (new YWidgetEvent (pThis, YEvent::ValueChanged));
176  }
177 };
178 
179 YCheckBoxFrame *YGWidgetFactory::createCheckBoxFrame (
180  YWidget *parent, const std::string &label, bool checked)
181 { return new YGCheckBoxFrame (parent, label, checked); }
182