Code

188fc6fb1ad0ec75fba34573b92d84f39997e6d6
[inkscape.git] / src / ui / dialog / dock-behavior.cpp
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();
103 void
104 DockBehavior::show() 
105
106     _dock_item.show();
109 void 
110 DockBehavior::show_all_children()
112     get_vbox()->show_all_children();
115 void 
116 DockBehavior::get_position(int& x, int& y)
117
118     _dock_item.get_position(x, y);
121 void 
122 DockBehavior::get_size(int& width, int& height)
123
124     _dock_item.get_size(width, height);
127 void
128 DockBehavior::resize(int width, int height) 
130     _dock_item.resize(width, height);
133 void
134 DockBehavior::move(int x, int y)
136     _dock_item.move(x, y);
139 void
140 DockBehavior::set_position(Gtk::WindowPosition position)
142     _dock_item.set_position(position);
145 void
146 DockBehavior::set_size_request(int width, int height)
148     _dock_item.set_size_request(width, height);
151 void 
152 DockBehavior::size_request(Gtk::Requisition& requisition)
153
154     _dock_item.size_request(requisition);
157 void
158 DockBehavior::set_title(Glib::ustring title)
160     _dock_item.set_title(title);
163 void
164 DockBehavior::set_response_sensitive(int response_id, bool setting)
166     if (_response_map[response_id])
167         _response_map[response_id]->set_sensitive(setting);
170 void
171 DockBehavior::set_sensitive(bool sensitive)
173     get_vbox()->set_sensitive();
176 Gtk::Button * 
177 DockBehavior::add_button(const Glib::ustring& button_text, int response_id)
179     Gtk::Button *button = new Gtk::Button(button_text);
180     _addButton(button, response_id);
181     return button;
184 Gtk::Button *
185 DockBehavior::add_button(const Gtk::StockID& stock_id, int response_id)
187     Gtk::Button *button = new Gtk::Button(stock_id);
188     _addButton(button, response_id);
189     return button;
192 void
193 DockBehavior::_addButton(Gtk::Button *button, int response_id)
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     }
211 void
212 DockBehavior::set_default_response(int response_id)
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     }
225 void
226 DockBehavior::_onHide()
228     _dialog.save_geometry();
229     prefs_set_int_attribute (_dialog._prefs_path, "state", _dock_item.getPrevState());
232 void
233 DockBehavior::_onDragEnd(bool)
235     Widget::DockItem::State prev_state = _dock_item.getPrevState(), state = _dock_item.getState();
236     
237     if (prev_state != state) {
238         prefs_set_int_attribute (_dialog._prefs_path, "state", state);
239     }
242 void
243 DockBehavior::_onResponse(int response_id)
245     g_signal_emit_by_name (_dock_item.gobj(), "signal_response", response_id);
248 void
249 DockBehavior::onHideF12()
251     _dialog.save_geometry();
252     hide();
255 void
256 DockBehavior::onShowF12()
258     present();
261 void
262 DockBehavior::onShutdown()
264     prefs_set_int_attribute (_dialog._prefs_path, "state", _dock_item.getPrevState());
267 void
268 DockBehavior::onDesktopActivated(SPDesktop *desktop)
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 :