8806e97f0be4431f0edfa7e889d0e6198dc50277
1 /**
2 *
3 * \brief Dialog for renaming layers
4 *
5 * Author:
6 * Bryce W. Harrington <bryce@bryceharrington.com>
7 *
8 * Copyright (C) 2004 Bryce Harrington
9 *
10 * Released under GNU GPL. Read the file 'COPYING' for more information
11 */
13 #ifdef HAVE_CONFIG_H
14 # include <config.h>
15 #endif
17 #include <gtkmm/stock.h>
19 #include <glibmm/i18n.h>
20 #include "inkscape.h"
21 #include "desktop.h"
22 #include "document.h"
23 #include "message-stack.h"
24 #include "desktop-handles.h"
25 #include "layer-fns.h"
26 #include "sp-object.h"
28 #include "layer-properties.h"
30 namespace Inkscape {
31 namespace UI {
32 namespace Dialogs {
34 LayerPropertiesDialog::LayerPropertiesDialog()
35 : _strategy(NULL), _desktop(NULL), _layer(NULL)
36 {
37 GtkWidget *dlg = GTK_WIDGET(gobj());
38 g_assert(dlg);
40 Gtk::VBox *mainVBox = get_vbox();
42 // Layer name widgets
43 _layer_name_entry.set_activates_default(true);
44 _layer_name_hbox.pack_end(_layer_name_entry, false, false, 4);
45 _layer_name_label.set_label(_("Layer name:"));
46 _layer_name_hbox.pack_end(_layer_name_label, false, false, 4);
47 mainVBox->pack_start(_layer_name_hbox, false, false, 4);
49 // Buttons
50 _close_button.set_use_stock(true);
51 _close_button.set_label(Gtk::Stock::CANCEL.id);
52 _close_button.set_flags(Gtk::CAN_DEFAULT);
54 _apply_button.set_use_underline(true);
55 _apply_button.set_flags(Gtk::CAN_DEFAULT);
57 _close_button.signal_clicked()
58 .connect(sigc::mem_fun(*this, &LayerPropertiesDialog::_close));
59 _apply_button.signal_clicked()
60 .connect(sigc::mem_fun(*this, &LayerPropertiesDialog::_apply));
62 signal_delete_event().connect(
63 sigc::bind_return(
64 sigc::hide(sigc::mem_fun(*this, &LayerPropertiesDialog::_close)),
65 true
66 )
67 );
69 add_action_widget(_close_button, Gtk::RESPONSE_CLOSE);
70 add_action_widget(_apply_button, Gtk::RESPONSE_APPLY);
72 _apply_button.grab_default();
74 show_all_children();
75 }
77 LayerPropertiesDialog::~LayerPropertiesDialog() {
78 _setDesktop(NULL);
79 _setLayer(NULL);
80 }
82 void LayerPropertiesDialog::_showDialog(LayerPropertiesDialog::Strategy &strategy,
83 SPDesktop *desktop, SPObject *layer)
84 {
85 LayerPropertiesDialog *dialog = new LayerPropertiesDialog();
87 dialog->_strategy = &strategy;
88 dialog->_setDesktop(desktop);
89 dialog->_setLayer(layer);
91 dialog->_strategy->setup(*dialog);
93 dialog->set_modal(true);
94 desktop->setWindowTransient (dialog->gobj());
95 dialog->property_destroy_with_parent() = true;
97 dialog->show();
98 dialog->present();
99 }
101 void
102 LayerPropertiesDialog::_apply()
103 {
104 g_assert(_strategy != NULL);
106 _strategy->perform(*this);
107 sp_document_done(SP_DT_DOCUMENT(SP_ACTIVE_DESKTOP));
109 _close();
110 }
112 void
113 LayerPropertiesDialog::_close()
114 {
115 _setLayer(NULL);
116 _setDesktop(NULL);
117 destroy_();
118 Glib::signal_idle().connect(
119 sigc::bind_return(
120 sigc::bind(sigc::ptr_fun(&::operator delete), this),
121 false
122 )
123 );
124 }
126 void LayerPropertiesDialog::Rename::setup(LayerPropertiesDialog &dialog) {
127 SPDesktop *desktop=dialog._desktop;
128 dialog.set_title(_("Rename Layer"));
129 gchar const *name = desktop->currentLayer()->label();
130 dialog._layer_name_entry.set_text(( name ? name : "" ));
131 dialog._apply_button.set_label(_("_Rename"));
132 }
134 void LayerPropertiesDialog::Rename::perform(LayerPropertiesDialog &dialog) {
135 SPDesktop *desktop=dialog._desktop;
136 Glib::ustring name(dialog._layer_name_entry.get_text());
137 desktop->currentLayer()->setLabel(
138 ( name.empty() ? NULL : (gchar *)name.c_str() )
139 );
140 sp_document_done(SP_DT_DOCUMENT(desktop));
141 // TRANSLATORS: This means "The layer has been renamed"
142 desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Renamed layer"));
143 }
145 void LayerPropertiesDialog::Create::setup(LayerPropertiesDialog &dialog) {
146 dialog.set_title(_("Add Layer"));
147 dialog._layer_name_entry.set_text("");
148 dialog._apply_button.set_label(_("_Add"));
149 }
151 void LayerPropertiesDialog::Create::perform(LayerPropertiesDialog &dialog) {
152 SPDesktop *desktop=dialog._desktop;
153 SPObject *new_layer=Inkscape::create_layer(
154 desktop->currentRoot(), dialog._layer
155 );
156 Glib::ustring name(dialog._layer_name_entry.get_text());
157 if (!name.empty()) {
158 new_layer->setLabel((gchar *)name.c_str());
159 }
160 SP_DT_SELECTION(desktop)->clear();
161 desktop->setCurrentLayer(new_layer);
162 desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("New layer created."));
163 }
165 void LayerPropertiesDialog::_setDesktop(SPDesktop *desktop) {
166 if (desktop) {
167 Inkscape::GC::anchor (desktop);
168 }
169 if (_desktop) {
170 Inkscape::GC::release (_desktop);
171 }
172 _desktop = desktop;
173 }
175 void LayerPropertiesDialog::_setLayer(SPObject *layer) {
176 if (layer) {
177 sp_object_ref(layer, NULL);
178 }
179 if (_layer) {
180 sp_object_unref(_layer, NULL);
181 }
182 _layer = layer;
183 }
185 } // namespace
186 } // namespace
187 } // namespace
190 /*
191 Local Variables:
192 mode:c++
193 c-file-style:"stroustrup"
194 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
195 indent-tabs-mode:nil
196 fill-column:99
197 End:
198 */
199 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :