~valavanisalex/ubuntu/oneiric/inkscape/inkscape_0.48.1-2ubuntu4

« back to all changes in this revision

Viewing changes to src/ui/widget/dock.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Kees Cook, Kees Cook, Ted Gould
  • Date: 2008-02-10 14:20:16 UTC
  • mfrom: (1.1.6 upstream)
  • Revision ID: james.westby@ubuntu.com-20080210142016-vcnb2zqyhszu0xvb
Tags: 0.46~pre1-0ubuntu1
[ Kees Cook ]
* debian/control:
  - add libgtkspell-dev build-dep to gain GtkSpell features (LP: #183547).
  - update Standards version (no changes needed).
  - add Vcs and Homepage fields.
  - switch to new python-lxml dep.
* debian/{control,rules}: switch from dpatch to quilt for more sanity.
* debian/patches/20_fix_glib_and_gxx43_ftbfs.patch:
  - merged against upstream fixes.
  - added additional fixes for newly written code.
* debian/rules: enable parallel building.

[ Ted Gould ]
* Updating POTFILES.in to make it so things build correctly.
* debian/control:
  - add ImageMagick++ and libboost-dev to build-deps

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/**
 
2
 * \brief A desktop dock pane to dock dialogs.
 
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
 */
 
11
 
 
12
#include "inkscape.h"
 
13
#include "prefs-utils.h"
 
14
#include "desktop.h"
 
15
 
 
16
#include "dock.h"
 
17
 
 
18
#include <gtkmm/adjustment.h>
 
19
 
 
20
namespace Inkscape {
 
21
namespace UI {
 
22
namespace Widget {
 
23
 
 
24
namespace {
 
25
 
 
26
void hideCallback(GtkObject */*object*/, gpointer dock_ptr)
 
27
{
 
28
    g_return_if_fail( dock_ptr != NULL );
 
29
 
 
30
    Dock *dock = (Dock *)dock_ptr;
 
31
    dock->hide();
 
32
}
 
33
 
 
34
void unhideCallback(GtkObject */*object*/, gpointer dock_ptr)
 
35
{
 
36
    g_return_if_fail( dock_ptr != NULL );
 
37
 
 
38
    Dock *dock = (Dock *)dock_ptr;
 
39
    dock->show();
 
40
}
 
41
 
 
42
}
 
43
 
 
44
const int Dock::_default_empty_width = 0;
 
45
const int Dock::_default_dock_bar_width = 36;
 
46
 
 
47
 
 
48
Dock::Dock(Gtk::Orientation orientation)
 
49
    : _gdl_dock (GDL_DOCK (gdl_dock_new())),
 
50
      _gdl_dock_bar (GDL_DOCK_BAR (gdl_dock_bar_new(GDL_DOCK(_gdl_dock)))),
 
51
      _scrolled_window (Gtk::manage(new Gtk::ScrolledWindow))
 
52
{
 
53
    gdl_dock_bar_set_orientation(_gdl_dock_bar, static_cast<GtkOrientation>(orientation));
 
54
 
 
55
    switch (orientation) {
 
56
        case Gtk::ORIENTATION_VERTICAL:
 
57
            _dock_box = Gtk::manage(new Gtk::HBox());
 
58
            _paned = Gtk::manage(new Gtk::VPaned());
 
59
            break;
 
60
        case Gtk::ORIENTATION_HORIZONTAL:
 
61
            _dock_box = Gtk::manage(new Gtk::VBox());
 
62
            _paned = Gtk::manage(new Gtk::HPaned());
 
63
    }
 
64
 
 
65
    _scrolled_window->add(*_dock_box);
 
66
    _scrolled_window->set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
 
67
 
 
68
    _paned->pack1(*Glib::wrap(GTK_WIDGET(_gdl_dock)), false, false);
 
69
    _paned->pack2(_filler, true, false);
 
70
 
 
71
    _dock_box->pack_start(*_paned, Gtk::PACK_EXPAND_WIDGET);
 
72
    _dock_box->pack_end(*Gtk::manage(Glib::wrap(GTK_WIDGET(_gdl_dock_bar))), Gtk::PACK_SHRINK);
 
73
    _dock_box->get_parent()->set_resize_mode(Gtk::RESIZE_PARENT);
 
74
 
 
75
    _scrolled_window->set_size_request(0);
 
76
 
 
77
    GdlSwitcherStyle gdl_switcher_style =
 
78
        static_cast<GdlSwitcherStyle>(prefs_get_int_attribute_limited("options.dock", "switcherstyle",
 
79
                                                                      GDL_SWITCHER_STYLE_BOTH, 0, 4));
 
80
 
 
81
    g_object_set (GDL_DOCK_OBJECT(_gdl_dock)->master,
 
82
                  "switcher-style", gdl_switcher_style,
 
83
                  "expand-direction", GDL_DOCK_EXPANSION_DIRECTION_DOWN,
 
84
                  NULL);
 
85
 
 
86
    GdlDockBarStyle gdl_dock_bar_style =
 
87
        static_cast<GdlDockBarStyle>(prefs_get_int_attribute_limited("options.dock", "dockbarstyle",
 
88
                                                                     GDL_DOCK_BAR_BOTH, 0, 3));
 
89
 
 
90
    gdl_dock_bar_set_style(_gdl_dock_bar, gdl_dock_bar_style);
 
91
 
 
92
    g_signal_connect(G_OBJECT(INKSCAPE), "dialogs_hide", G_CALLBACK(hideCallback), (void *)this);
 
93
    g_signal_connect(G_OBJECT(INKSCAPE), "dialogs_unhide", G_CALLBACK(unhideCallback), (void *)this);
 
94
 
 
95
    g_signal_connect(_paned->gobj(), "button-press-event", G_CALLBACK(_on_paned_button_event), (void *)this);
 
96
    g_signal_connect(_paned->gobj(), "button-release-event", G_CALLBACK(_on_paned_button_event), (void *)this);
 
97
 
 
98
    signal_layout_changed().connect(sigc::mem_fun(*this, &Inkscape::UI::Widget::Dock::_onLayoutChanged));
 
99
}
 
100
 
 
101
Dock::~Dock()
 
102
{
 
103
    g_free(_gdl_dock);
 
104
    g_free(_gdl_dock_bar);
 
105
}
 
106
 
 
107
void
 
108
Dock::addItem(DockItem& item, DockItem::Placement placement)
 
109
{
 
110
    _dock_items.push_back(&item);
 
111
    gdl_dock_add_item(_gdl_dock, GDL_DOCK_ITEM(item.gobj()), (GdlDockPlacement)placement);
 
112
 
 
113
    // FIXME: This is a hack to prevent the dock from expanding the main window, this can't be done
 
114
    // initially as the paned doesn't exist.
 
115
    if (Gtk::Paned *paned = getParentPaned()) {
 
116
        paned->set_resize_mode(Gtk::RESIZE_QUEUE);
 
117
    }
 
118
}
 
119
 
 
120
Gtk::Widget&
 
121
Dock::getWidget()
 
122
{
 
123
     return *_scrolled_window;
 
124
}
 
125
 
 
126
Gtk::Paned *
 
127
Dock::getParentPaned()
 
128
{
 
129
    g_return_val_if_fail(_dock_box, 0);
 
130
    Gtk::Container *parent = getWidget().get_parent();
 
131
    return (parent != 0 ? dynamic_cast<Gtk::Paned *>(parent) : 0);
 
132
}
 
133
 
 
134
 
 
135
Gtk::Paned *
 
136
Dock::getPaned()
 
137
{
 
138
    return _paned;
 
139
}
 
140
 
 
141
GtkWidget *
 
142
Dock::getGdlWidget()
 
143
{
 
144
    return GTK_WIDGET(_gdl_dock);
 
145
}
 
146
 
 
147
bool
 
148
Dock::isEmpty() const
 
149
{
 
150
    std::list<const DockItem *>::const_iterator
 
151
        i = _dock_items.begin(),
 
152
        e = _dock_items.end();
 
153
 
 
154
    for (; i != e; ++i) {
 
155
        if ((*i)->getState() == DockItem::DOCKED_STATE) {
 
156
            return false;
 
157
        }
 
158
    }
 
159
 
 
160
    return true;
 
161
}
 
162
 
 
163
bool
 
164
Dock::hasIconifiedItems() const
 
165
{
 
166
    std::list<const DockItem *>::const_iterator
 
167
        i = _dock_items.begin(),
 
168
        e = _dock_items.end();
 
169
 
 
170
    for (; i != e; ++i) {
 
171
        if ((*i)->isIconified()) {
 
172
            return true;
 
173
        }
 
174
    }
 
175
 
 
176
    return false;
 
177
}
 
178
 
 
179
void
 
180
Dock::hide()
 
181
{
 
182
    getWidget().hide();
 
183
}
 
184
 
 
185
void
 
186
Dock::show()
 
187
{
 
188
    getWidget().show();
 
189
}
 
190
 
 
191
void
 
192
Dock::toggleDockable(int width, int height)
 
193
{
 
194
    static int prev_horizontal_position, prev_vertical_position;
 
195
 
 
196
    Gtk::Paned *parent_paned = getParentPaned();
 
197
 
 
198
    if (width > 0 && height > 0) {
 
199
        prev_horizontal_position = parent_paned->get_position();
 
200
        prev_vertical_position = _paned->get_position();
 
201
 
 
202
        if (getWidget().get_width() < width)
 
203
            parent_paned->set_position(parent_paned->get_width() - width);
 
204
 
 
205
        if (_paned->get_position() < height)
 
206
            _paned->set_position(height);
 
207
 
 
208
    } else {
 
209
        parent_paned->set_position(prev_horizontal_position);
 
210
        _paned->set_position(prev_vertical_position);
 
211
    }
 
212
 
 
213
}
 
214
 
 
215
void
 
216
Dock::scrollToItem(DockItem& item)
 
217
{
 
218
    int item_x, item_y;
 
219
    item.getWidget().translate_coordinates(getWidget(), 0, 0, item_x, item_y);
 
220
 
 
221
    int dock_height = getWidget().get_height(), item_height = item.getWidget().get_height();
 
222
    double vadjustment = _scrolled_window->get_vadjustment()->get_value();
 
223
 
 
224
    if (item_y < 0)
 
225
        _scrolled_window->get_vadjustment()->set_value(vadjustment + item_y);
 
226
    else if (item_y + item_height > dock_height)
 
227
        _scrolled_window->get_vadjustment()->set_value(
 
228
            vadjustment + ((item_y + item_height) - dock_height));
 
229
}
 
230
 
 
231
Glib::SignalProxy0<void>
 
232
Dock::signal_layout_changed()
 
233
{
 
234
    return Glib::SignalProxy0<void>(Glib::wrap(GTK_WIDGET(_gdl_dock)),
 
235
                                    &_signal_layout_changed_proxy);
 
236
}
 
237
 
 
238
void
 
239
Dock::_onLayoutChanged()
 
240
{
 
241
    if (isEmpty()) {
 
242
        if (hasIconifiedItems()) {
 
243
            _scrolled_window->set_size_request(_default_dock_bar_width);
 
244
        } else {
 
245
            _scrolled_window->set_size_request(_default_empty_width);
 
246
        }
 
247
 
 
248
        getParentPaned()->set_position(INT_MAX);
 
249
    } else {
 
250
        // unset any forced size requests
 
251
        _paned->get_child1()->set_size_request(-1, -1);
 
252
        _scrolled_window->set_size_request(-1);
 
253
    }
 
254
}
 
255
 
 
256
void
 
257
Dock::_onPanedButtonEvent(GdkEventButton *event)
 
258
{
 
259
    if (event->button == 1 && event->type == GDK_BUTTON_PRESS)
 
260
        /* unset size request when starting a drag */
 
261
        _paned->get_child1()->set_size_request(-1, -1);
 
262
}
 
263
 
 
264
gboolean
 
265
Dock::_on_paned_button_event(GtkWidget */*widget*/, GdkEventButton *event, gpointer user_data)
 
266
{
 
267
    if (Dock *dock = static_cast<Dock *>(user_data))
 
268
        dock->_onPanedButtonEvent(event);
 
269
 
 
270
    return FALSE;
 
271
}
 
272
 
 
273
const Glib::SignalProxyInfo
 
274
Dock::_signal_layout_changed_proxy =
 
275
{
 
276
    "layout-changed",
 
277
    (GCallback) &Glib::SignalProxyNormal::slot0_void_callback,
 
278
    (GCallback) &Glib::SignalProxyNormal::slot0_void_callback
 
279
};
 
280
 
 
281
 
 
282
} // namespace Widget
 
283
} // namespace UI
 
284
} // namespace Inkscape
 
285
 
 
286
 
 
287
/*
 
288
  Local Variables:
 
289
  mode:c++
 
290
  c-file-style:"stroustrup"
 
291
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
 
292
  indent-tabs-mode:nil
 
293
  fill-column:99
 
294
  End:
 
295
*/
 
296
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99