5 #define YUILogComponent "gtk"
6 #include <yui/Libyui_config.h>
10 #include "ygtkratiobox.h"
14 #define DEFAULT_BORDER 6
15 #define LABEL_WIDGET_SPACING 4
21 typedef std::pair <GObject *, gulong> Handler;
22 std::list <Handler> m_handlers;
23 void connectSignal (GObject *
object,
const char *name,
24 GCallback callback, gpointer data,
bool after)
28 handler = g_signal_connect_after (
object, name, callback, data);
30 handler = g_signal_connect (
object, name, callback, data);
32 Handler h (
object, handler);
33 m_handlers.push_back (h);
37 for (std::list <Handler>::const_iterator it = m_handlers.begin();
38 it != m_handlers.end(); it++) {
39 const Handler &h = *it;
40 g_signal_handler_block (h.first, h.second);
45 for (std::list <Handler>::const_iterator it = m_handlers.begin();
46 it != m_handlers.end(); it++) {
47 const Handler &h = *it;
48 g_signal_handler_unblock (h.first, h.second);
55 static void min_size_cb (guint *min_width, guint *min_height, gpointer pData);
57 YGWidget::YGWidget(YWidget *ywidget, YWidget *yparent,
58 GType type,
const char *property_name, ...)
62 va_start (args, property_name);
63 GtkWidget* gtkwidget = GTK_WIDGET (g_object_new_valist (type, property_name, args));
64 construct (ywidget, yparent, gtkwidget, property_name, args);
69 YGWidget::YGWidget(YWidget *ywidget, YWidget *yparent,
70 GtkWidget *gtkwidget,
const char *property_name, ...)
74 va_start (args, property_name);
75 construct (ywidget, yparent, gtkwidget, property_name, args);
80 void YGWidget::construct (YWidget *ywidget, YWidget *yparent,
81 GtkWidget *gtkwidget,
const char *property_name, va_list args)
85 m_adj_size = ygtk_adj_size_new();
86 g_object_ref_sink (G_OBJECT (m_adj_size));
87 gtk_widget_show (m_adj_size);
88 gtk_container_add (GTK_CONTAINER (m_adj_size), m_widget);
89 ygtk_adj_size_set_min_cb (YGTK_ADJ_SIZE (m_adj_size), min_size_cb,
this);
90 gtk_widget_show (m_widget);
93 setBorder (DEFAULT_BORDER / 2);
95 ywidget->setWidgetRep ((
void *)
this);
97 ywidget->setParent (yparent);
98 yparent->addChild (ywidget);
103 YGWidget::~YGWidget()
107 if (YGUI::ui()->eventPendingFor (m_ywidget))
108 YGUI::ui()->m_event_handler.consumePendingEvent();
112 static void foreach_child_cb (GtkWidget *child, GtkContainer *container)
113 { gtk_container_remove (container, child); }
115 if (GTK_IS_CONTAINER (m_widget))
116 gtk_container_foreach (GTK_CONTAINER (m_widget),
117 (GtkCallback) inner::foreach_child_cb, m_widget);
119 gtk_widget_destroy (m_adj_size);
120 g_object_unref (G_OBJECT (m_adj_size));
123 YGWidget *YGWidget::get (YWidget *ywidget)
126 return (
YGWidget *) ywidget->widgetRep();
129 bool YGWidget::doSetKeyboardFocus()
131 gtk_widget_grab_focus (getWidget());
132 return gtk_widget_is_focus (getWidget());
135 void YGWidget::doSetEnabled (
bool enabled)
137 gtk_widget_set_sensitive (getLayout(), enabled);
140 void YGWidget::doSetUseBoldFont (
bool useBold)
142 PangoWeight weight = useBold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL;
143 YGUtils::setWidgetFont (getWidget(), PANGO_STYLE_NORMAL, weight, PANGO_SCALE_MEDIUM);
146 void YGWidget::doAddChild (YWidget *ychild, GtkWidget *container)
148 GtkWidget *child = YGWidget::get (ychild)->getLayout();
149 gtk_container_add (GTK_CONTAINER (container), child);
152 void YGWidget::doRemoveChild (YWidget *ychild, GtkWidget *container)
160 if (!ychild->beingDestroyed()) {
161 GtkWidget *child = YGWidget::get (ychild)->getLayout();
162 gtk_container_remove (GTK_CONTAINER (container), child);
166 int YGWidget::doPreferredSize (YUIDimension dimension)
170 gtk_widget_get_preferred_size (m_adj_size, &req, NULL);
171 return dimension == YD_HORIZ ? req.width : req.height;
174 void min_size_cb (guint *min_width, guint *min_height, gpointer pData)
177 *min_width = pThis->getMinSize (YD_HORIZ);
178 *min_height = pThis->getMinSize (YD_VERT);
181 #include "ygtkfixed.h"
183 void YGWidget::doSetSize (
int width,
int height)
185 GtkWidget *parent = 0;
186 if (m_ywidget->parent())
187 parent = YGWidget::get (m_ywidget->parent())->getWidget();
189 if (parent && YGTK_IS_FIXED (parent))
190 ygtk_fixed_set_child_size (YGTK_FIXED (parent), m_adj_size, width, height);
193 void YGWidget::emitEvent (YEvent::EventReason reason, EventFlags flags)
197 static gboolean dispatchEvent (gpointer data)
199 YWidgetEvent *
event = (YWidgetEvent *) data;
200 if (!YGUI::ui()->eventPendingFor (event->widget()))
201 YGUI::ui()->sendEvent (event);
206 if (reason == YEvent::ContextMenuActivated && !m_ywidget->notifyContextMenu())
208 if (flags & IGNORE_NOTIFY_EVENT || m_ywidget->notify()) {
209 YWidgetEvent *
event =
new YWidgetEvent (m_ywidget, reason);
210 if (flags & DELAY_EVENT)
211 g_timeout_add (250, inner::dispatchEvent, event);
212 else if (!(flags & IF_NOT_PENDING_EVENT) || !YGUI::ui()->eventPendingFor (m_ywidget))
213 YGUI::ui()->sendEvent (event);
217 void YGWidget::connect (gpointer
object,
const char *name, GCallback callback, gpointer data,
222 m_signals->connectSignal (G_OBJECT (
object), name, callback, data, after);
225 void YGWidget::blockSignals()
226 {
if (m_signals) m_signals->block(); }
227 void YGWidget::unblockSignals()
228 {
if (m_signals) m_signals->unblock(); }
230 void YGWidget::setBorder (
unsigned int border)
231 { gtk_container_set_border_width (GTK_CONTAINER (m_adj_size), border); }
235 YGLabeledWidget::YGLabeledWidget (YWidget *ywidget, YWidget *parent,
236 const std::string &label_text, YUIDimension label_ori,
237 GtkWidget *gtkwidget,
const char *property_name, ...)
239 gtkwidget,
"spacing", LABEL_WIDGET_SPACING, NULL)
244 va_start (args, property_name);
249 m_label = gtk_label_new (
"");
252 gtk_widget_set_halign (m_label, GTK_ALIGN_START);
253 gtk_widget_set_valign (m_label, GTK_ALIGN_CENTER);
257 gtk_widget_show (m_label);
258 gtk_widget_show (m_field);
261 doSetLabel (label_text);
264 gtk_box_pack_start (GTK_BOX (m_widget), m_label, FALSE, TRUE, 0);
265 gtk_box_pack_start (GTK_BOX (m_widget), m_field, TRUE, TRUE, 0);
266 m_orientation = label_ori;
270 YGLabeledWidget::YGLabeledWidget (YWidget *ywidget, YWidget *parent,
271 const std::string &label_text, YUIDimension label_ori,
272 GType type,
const char *property_name, ...)
274 YGTK_VBOX_NEW(0),
"spacing", LABEL_WIDGET_SPACING, NULL)
278 va_start (args, property_name);
279 m_field = GTK_WIDGET (g_object_new_valist (type, property_name, args));
283 m_label = gtk_label_new (
"");
286 gtk_widget_set_halign (m_label, GTK_ALIGN_START);
287 gtk_widget_set_valign (m_label, GTK_ALIGN_CENTER);
291 gtk_widget_show (m_label);
292 gtk_widget_show (m_field);
295 doSetLabel (label_text);
298 gtk_box_pack_start (GTK_BOX (m_widget), m_label, FALSE, TRUE, 0);
299 gtk_box_pack_start (GTK_BOX (m_widget), m_field, TRUE, TRUE, 0);
300 m_orientation = label_ori;
303 void YGLabeledWidget::setLabelVisible (
bool show)
306 gtk_widget_show (m_label);
308 gtk_widget_hide (m_label);
311 void YGLabeledWidget::setBuddy (GtkWidget *widget)
313 gtk_label_set_mnemonic_widget (GTK_LABEL (m_label), widget);
316 void YGLabeledWidget::doSetLabel (
const std::string &label)
318 if (!label.empty()) {
319 std::string str (YGUtils::mapKBAccel (label));
323 const gchar *last = g_utf8_find_prev_char (str.c_str(), str.c_str() + str.length());
324 gunichar last_char = g_utf8_get_char (last);
325 if (g_unichar_isalpha (last_char)) {
326 bool reverse =
false;
327 if (gtk_widget_get_direction (m_label) == GTK_TEXT_DIR_RTL &&
328 pango_find_base_dir (str.c_str(), -1) == PANGO_DIRECTION_LTR)
331 int i = reverse ? 0 : str.length();
332 str.insert (i, 1,
':');
336 gtk_label_set_text (GTK_LABEL (m_label), str.c_str());
337 gtk_label_set_use_underline (GTK_LABEL (m_label), TRUE);
339 setLabelVisible (!label.empty());
343 #define MAX_SCROLL_WIDTH 120
345 YGScrolledWidget::YGScrolledWidget (YWidget *ywidget, YWidget *parent,
346 GType type,
const char *property_name, ...)
348 GTK_TYPE_SCROLLED_WINDOW,
"shadow-type", GTK_SHADOW_IN, NULL)
351 va_start (args, property_name);
352 construct(type, property_name, args);
354 setLabelVisible (
false);
357 YGScrolledWidget::YGScrolledWidget (YWidget *ywidget, YWidget *parent,
358 const std::string &label_text, YUIDimension label_ori,
359 GType type,
const char *property_name, ...)
361 GTK_TYPE_SCROLLED_WINDOW,
"shadow-type", GTK_SHADOW_IN, NULL)
364 va_start (args, property_name);
365 construct(type, property_name, args);
369 void YGScrolledWidget::construct (GType type,
const char *property_name,
372 m_widget = GTK_WIDGET (g_object_new_valist (type, property_name, args));
375 setPolicy (GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
376 gtk_container_add (GTK_CONTAINER (YGLabeledWidget::getWidget()), m_widget);
377 gtk_widget_show (m_widget);
380 void YGScrolledWidget::setPolicy (GtkPolicyType hpolicy, GtkPolicyType vpolicy)
382 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (YGLabeledWidget::getWidget()),