1 /**
2 * \brief A dockable dialog implementation.
3 *
4 * Author:
5 * Gustav Broberg <broberg@kth.se>
6 *
7 * Copyright (C) 2007 Authors
8 *
9 * Released under GNU GPL. Read the file 'COPYING' for more information.
10 */
13 #ifdef HAVE_CONFIG_H
14 # include <config.h>
15 #endif
17 #include "dock-behavior.h"
18 #include "inkscape.h"
19 #include "desktop.h"
20 #include "interface.h"
21 #include "widgets/icon.h"
22 #include "ui/widget/dock.h"
23 #include "verbs.h"
24 #include "dialog.h"
25 #include "prefs-utils.h"
27 #include <gtkmm/invisible.h>
28 #include <gtkmm/label.h>
29 #include <gtkmm/stock.h>
31 #include <gtk/gtk.h>
33 namespace Inkscape {
34 namespace UI {
35 namespace Dialog {
36 namespace Behavior {
39 DockBehavior::DockBehavior(Dialog& dialog) :
40 Behavior(dialog),
41 _dock_item(*SP_ACTIVE_DESKTOP->getDock(),
42 Inkscape::Verb::get(dialog._verb_num)->get_id(), dialog._title.c_str(),
43 (Inkscape::Verb::get(dialog._verb_num)->get_image() ?
44 Inkscape::Verb::get(dialog._verb_num)->get_image() : ""),
45 static_cast<Widget::DockItem::State>(
46 prefs_get_int_attribute (_dialog._prefs_path, "state",
47 UI::Widget::DockItem::DOCKED_STATE)))
48 {
49 // Connect signals
50 _signal_hide_connection = signal_hide().connect(sigc::mem_fun(*this, &Inkscape::UI::Dialog::Behavior::DockBehavior::_onHide));
51 signal_response().connect(sigc::mem_fun(_dialog, &Inkscape::UI::Dialog::Dialog::on_response));
52 signal_drag_end().connect(sigc::mem_fun(*this, &Inkscape::UI::Dialog::Behavior::DockBehavior::_onDragEnd));
53 }
55 DockBehavior::~DockBehavior()
56 {
57 }
60 Behavior *
61 DockBehavior::create(Dialog& dialog)
62 {
63 return new DockBehavior(dialog);
64 }
67 DockBehavior::operator Gtk::Widget&()
68 {
69 return _dock_item.getWidget();
70 }
72 GtkWidget *
73 DockBehavior::gobj()
74 {
75 return _dock_item.gobj();
76 }
78 Gtk::VBox *
79 DockBehavior::get_vbox()
80 {
81 return _dock_item.get_vbox();
82 }
84 void
85 DockBehavior::present()
86 {
87 bool was_attached = _dock_item.isAttached();
89 _dock_item.present();
91 if (!was_attached)
92 _dialog.read_geometry();
93 }
95 void
96 DockBehavior::hide()
97 {
98 _signal_hide_connection.block();
99 _dock_item.hide();
100 _signal_hide_connection.unblock();
101 }
103 void
104 DockBehavior::show()
105 {
106 _dock_item.show();
107 }
109 void
110 DockBehavior::show_all_children()
111 {
112 get_vbox()->show_all_children();
113 }
115 void
116 DockBehavior::get_position(int& x, int& y)
117 {
118 _dock_item.get_position(x, y);
119 }
121 void
122 DockBehavior::get_size(int& width, int& height)
123 {
124 _dock_item.get_size(width, height);
125 }
127 void
128 DockBehavior::resize(int width, int height)
129 {
130 _dock_item.resize(width, height);
131 }
133 void
134 DockBehavior::move(int x, int y)
135 {
136 _dock_item.move(x, y);
137 }
139 void
140 DockBehavior::set_position(Gtk::WindowPosition position)
141 {
142 _dock_item.set_position(position);
143 }
145 void
146 DockBehavior::set_size_request(int width, int height)
147 {
148 _dock_item.set_size_request(width, height);
149 }
151 void
152 DockBehavior::size_request(Gtk::Requisition& requisition)
153 {
154 _dock_item.size_request(requisition);
155 }
157 void
158 DockBehavior::set_title(Glib::ustring title)
159 {
160 _dock_item.set_title(title);
161 }
163 void
164 DockBehavior::set_response_sensitive(int response_id, bool setting)
165 {
166 if (_response_map[response_id])
167 _response_map[response_id]->set_sensitive(setting);
168 }
170 void
171 DockBehavior::set_sensitive(bool sensitive)
172 {
173 get_vbox()->set_sensitive();
174 }
176 Gtk::Button *
177 DockBehavior::add_button(const Glib::ustring& button_text, int response_id)
178 {
179 Gtk::Button *button = new Gtk::Button(button_text);
180 _addButton(button, response_id);
181 return button;
182 }
184 Gtk::Button *
185 DockBehavior::add_button(const Gtk::StockID& stock_id, int response_id)
186 {
187 Gtk::Button *button = new Gtk::Button(stock_id);
188 _addButton(button, response_id);
189 return button;
190 }
192 void
193 DockBehavior::_addButton(Gtk::Button *button, int response_id)
194 {
195 _dock_item.addButton(button, response_id);
197 if (response_id != 0) {
199 /* Pass the signal_clicked signals onto a our own signal handler that can re-emit them as
200 * signal_response signals
201 */
202 button->signal_clicked().connect(
203 sigc::bind<int>(sigc::mem_fun(*this,
204 &Inkscape::UI::Dialog::Behavior::DockBehavior::_onResponse),
205 response_id));
207 _response_map[response_id] = button;
208 }
209 }
211 void
212 DockBehavior::set_default_response(int response_id)
213 {
214 ResponseMap::iterator widget_found;
215 widget_found = _response_map.find(response_id);
217 if (widget_found != _response_map.end()) {
218 widget_found->second->activate();
219 widget_found->second->property_can_default() = true;
220 widget_found->second->grab_default();
221 }
222 }
225 void
226 DockBehavior::_onHide()
227 {
228 _dialog.save_geometry();
229 prefs_set_int_attribute (_dialog._prefs_path, "state", _dock_item.getPrevState());
230 }
232 void
233 DockBehavior::_onDragEnd(bool)
234 {
235 Widget::DockItem::State prev_state = _dock_item.getPrevState(), state = _dock_item.getState();
237 if (prev_state != state) {
238 prefs_set_int_attribute (_dialog._prefs_path, "state", state);
239 }
240 }
242 void
243 DockBehavior::_onResponse(int response_id)
244 {
245 g_signal_emit_by_name (_dock_item.gobj(), "signal_response", response_id);
246 }
248 void
249 DockBehavior::onHideF12()
250 {
251 _dialog.save_geometry();
252 hide();
253 }
255 void
256 DockBehavior::onShowF12()
257 {
258 present();
259 }
261 void
262 DockBehavior::onShutdown()
263 {
264 prefs_set_int_attribute (_dialog._prefs_path, "state", _dock_item.getPrevState());
265 }
267 void
268 DockBehavior::onDesktopActivated(SPDesktop *desktop)
269 {
270 }
273 /* Signal wrappers */
275 Glib::SignalProxy0<void>
276 DockBehavior::signal_show() { return _dock_item.signal_show(); }
278 Glib::SignalProxy0<void>
279 DockBehavior::signal_hide() { return _dock_item.signal_hide(); }
281 Glib::SignalProxy1<void, int>
282 DockBehavior::signal_response() { return _dock_item.signal_response(); }
284 Glib::SignalProxy1<bool, GdkEventAny *>
285 DockBehavior::signal_delete_event() { return _dock_item.signal_delete_event(); }
287 Glib::SignalProxy0<void>
288 DockBehavior::signal_drag_begin() { return _dock_item.signal_drag_begin(); }
290 Glib::SignalProxy1<void, bool>
291 DockBehavior::signal_drag_end() { return _dock_item.signal_drag_end(); }
294 } // namespace Behavior
295 } // namespace Dialog
296 } // namespace UI
297 } // namespace Inkscape
299 /*
300 Local Variables:
301 mode:c++
302 c-file-style:"stroustrup"
303 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
304 indent-tabs-mode:nil
305 fill-column:99
306 End:
307 */
308 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :