Code

convert almost all libnrtype to Geom::
[inkscape.git] / src / ui / dialog / panel-dialog.h
index 4efc8862280cbbd35c3a72486f590854021218c0..eebd323d6a54ed6ff252c5fd4295ad68de1e7fa2 100644 (file)
@@ -29,29 +29,41 @@ namespace Inkscape {
 namespace UI {
 namespace Dialog {
 
-/* local desktop event handlers */
-static void handle_activate_desktop(Inkscape::Application *, SPDesktop *, void *);
-static void handle_deactivate_desktop(Inkscape::Application *, SPDesktop *, void *);
+class PanelDialogBase {
+public:
+    PanelDialogBase(Panel &panel, char const */*prefs_path*/, int const /*verb_num*/,
+                    Glib::ustring const &/*apply_label*/) :
+      _panel (panel) { }
 
-struct PanelDialogBase {
-    virtual void present() =0;
-    virtual Panel &getPanel() =0;
+    virtual void present() = 0;
     virtual ~PanelDialogBase() {}
 
-private:
-    virtual void _propagateDocumentReplaced(SPDesktop* desktop, SPDocument *document) =0;
-    virtual void _propagateDesktopActivated(Inkscape::Application *, SPDesktop *) =0;
-    virtual void _propagateDesktopDeactivated(Inkscape::Application *, SPDesktop *) =0;
+    virtual Panel &getPanel() { return _panel; }
+
+protected:
+    static void handle_deactivate_desktop(Inkscape::Application *application, SPDesktop *desktop, void *data) {
+        g_return_if_fail(data != NULL);
+        static_cast<PanelDialogBase *>(data)->_propagateDesktopDeactivated(application, desktop);
+    }
+
+    static void _handle_activate_desktop(Inkscape::Application *application, SPDesktop *desktop, void *data) {
+        g_return_if_fail(data != NULL);
+        static_cast<PanelDialogBase *>(data)->_propagateDesktopActivated(application, desktop);
+    }
+
+    inline virtual void _propagateDocumentReplaced(SPDesktop* desktop, SPDocument *document);
+    inline virtual void _propagateDesktopActivated(Inkscape::Application *, SPDesktop *);
+    inline virtual void _propagateDesktopDeactivated(Inkscape::Application *, SPDesktop *);
 
-    friend void handle_activate_desktop(Inkscape::Application *, SPDesktop *, void *);
-    friend void handle_deactivate_desktop(Inkscape::Application *, SPDesktop *, void *);
+    Panel &_panel;
+    sigc::connection _document_replaced_connection;
 };
 
 template <typename Behavior>
 class PanelDialog : public PanelDialogBase, public Inkscape::UI::Dialog::Dialog {
 
 public:
-    PanelDialog(Panel &contents, char const *prefs_path, int const verb_num, 
+    PanelDialog(Panel &contents, char const *prefs_path, int const verb_num,
                 Glib::ustring const &apply_label);
 
     virtual ~PanelDialog() {}
@@ -59,32 +71,72 @@ public:
     template <typename T>
     static PanelDialog<Behavior> *create();
 
-    virtual void present();
-
-    Panel &getPanel() { return _panel; }
+    inline virtual void present();
 
 private:
-    void _propagateDocumentReplaced(SPDesktop* desktop, SPDocument *document);
-    void _propagateDesktopActivated(Inkscape::Application *, SPDesktop *);
-    void _propagateDesktopDeactivated(Inkscape::Application *, SPDesktop *);
-
-    Panel &_panel;
-    sigc::connection _document_replaced_connection;
+    inline void _presentDialog();
 
     PanelDialog();  // no constructor without params
     PanelDialog(PanelDialog<Behavior> const &d);                      // no copy
     PanelDialog<Behavior>& operator=(PanelDialog<Behavior> const &d); // no assign
+};
+
+
+template <>
+class PanelDialog<Behavior::FloatingBehavior> :
+        public PanelDialogBase, public Inkscape::UI::Dialog::Dialog {
+
+public:
+    inline PanelDialog(Panel &contents, char const *prefs_path, int const verb_num,
+                       Glib::ustring const &apply_label);
+
+    virtual ~PanelDialog() {}
 
+    template <typename T>
+    static PanelDialog<Behavior::FloatingBehavior> *create();
+
+    inline virtual void present();
+
+private:
+    PanelDialog();  // no constructor without params
+    PanelDialog(PanelDialog<Behavior::FloatingBehavior> const &d); // no copy
+    PanelDialog<Behavior::FloatingBehavior>&
+    operator=(PanelDialog<Behavior::FloatingBehavior> const &d);   // no assign
 };
 
+
+
+void
+PanelDialogBase::_propagateDocumentReplaced(SPDesktop *desktop, SPDocument *document)
+{
+    _panel.signalDocumentReplaced().emit(desktop, document);
+}
+
+void
+PanelDialogBase::_propagateDesktopActivated(Inkscape::Application *application, SPDesktop *desktop)
+{
+    _document_replaced_connection =
+        desktop->connectDocumentReplaced(sigc::mem_fun(*this, &PanelDialogBase::_propagateDocumentReplaced));
+    _panel.signalActivateDesktop().emit(application, desktop);
+}
+
+void
+PanelDialogBase::_propagateDesktopDeactivated(Inkscape::Application *application, SPDesktop *desktop)
+{
+    _document_replaced_connection.disconnect();
+    _panel.signalDeactiveDesktop().emit(application, desktop);
+}
+
+
 template <typename B>
-PanelDialog<B>::PanelDialog(Panel &panel, char const *prefs_path, int const verb_num, Glib::ustring const &apply_label) :
-    Dialog(&B::create, prefs_path, verb_num, apply_label),
-    _panel (panel)
+PanelDialog<B>::PanelDialog(Panel &panel, char const *prefs_path, int const verb_num,
+                            Glib::ustring const &apply_label) :
+    PanelDialogBase(panel, prefs_path, verb_num, apply_label),
+    Dialog(&B::create, prefs_path, verb_num, apply_label)
 {
     Gtk::VBox *vbox = get_vbox();
     _panel.signalResponse().connect(sigc::mem_fun(*this, &PanelDialog::_handleResponse));
-    _panel.signalPresent().connect(sigc::mem_fun(*this, &PanelDialog::present));
+    _panel.signalPresent().connect(sigc::mem_fun(*this, &PanelDialog::_presentDialog));
 
     vbox->pack_start(_panel, true, true, 0);
 
@@ -92,7 +144,7 @@ PanelDialog<B>::PanelDialog(Panel &panel, char const *prefs_path, int const verb
 
     _propagateDesktopActivated(INKSCAPE, desktop);
 
-    _document_replaced_connection = 
+    _document_replaced_connection =
         desktop->connectDocumentReplaced(sigc::mem_fun(*this, &PanelDialog::_propagateDocumentReplaced));
 
     if (prefs_get_int_attribute ("dialogs", "showclose", 0) || !apply_label.empty()) {
@@ -115,69 +167,73 @@ PanelDialog<B>::create()
     return new PanelDialog<B>(panel, panel.getPrefsPath(), panel.getVerb(), panel.getApplyLabel());
 }
 
-/** 
- * Specialize factory method for panel dialogs with floating behavior in order to make them work as
- * singletons, i.e. allow them track the current active desktop.
- */
-template <> template <typename P>
-PanelDialog<Behavior::FloatingBehavior> *
-PanelDialog<Behavior::FloatingBehavior>::create()
-{
-    Panel &panel = P::getInstance();
-    PanelDialog<Behavior::FloatingBehavior> *instance = 
-        new PanelDialog<Behavior::FloatingBehavior>(panel, panel.getPrefsPath(), 
-                                                    panel.getVerb(), panel.getApplyLabel());
-
-    g_signal_connect(G_OBJECT(INKSCAPE), "activate_desktop", G_CALLBACK(handle_activate_desktop), instance);
-    g_signal_connect(G_OBJECT(INKSCAPE), "deactivate_desktop", G_CALLBACK(handle_deactivate_desktop), instance);
-
-    return instance;
-}
-
 template <typename B>
 void
 PanelDialog<B>::present()
 {
-    Dialog::present();
+    _panel.present(); 
 }
 
 template <typename B>
 void
-PanelDialog<B>::_propagateDocumentReplaced(SPDesktop *desktop, SPDocument *document)
+PanelDialog<B>::_presentDialog()
 {
-    _panel.signalDocumentReplaced().emit(desktop, document);
+    Dialog::present(); 
 }
 
-template <typename B>
-void
-PanelDialog<B>::_propagateDesktopActivated(Inkscape::Application *application, SPDesktop *desktop)
+PanelDialog<Behavior::FloatingBehavior>::PanelDialog(Panel &panel, char const *prefs_path,
+                                                     int const verb_num, Glib::ustring const &apply_label) :
+    PanelDialogBase(panel, prefs_path, verb_num, apply_label),
+    Dialog(&Behavior::FloatingBehavior::create, prefs_path, verb_num, apply_label)
 {
-    _document_replaced_connection = 
+    Gtk::VBox *vbox = get_vbox();
+    _panel.signalResponse().connect(sigc::mem_fun(*this, &PanelDialog::_handleResponse));
+
+    vbox->pack_start(_panel, true, true, 0);
+
+    SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+
+    _propagateDesktopActivated(INKSCAPE, desktop);
+
+    _document_replaced_connection =
         desktop->connectDocumentReplaced(sigc::mem_fun(*this, &PanelDialog::_propagateDocumentReplaced));
-    _panel.signalActivateDesktop().emit(application, desktop);
+
+    if (prefs_get_int_attribute ("dialogs", "showclose", 0) || !apply_label.empty()) {
+        // TODO: make the order of buttons obey the global preference
+        if (!apply_label.empty()) {
+            panel.addResponseButton(apply_label, Gtk::RESPONSE_APPLY);
+            panel.setDefaultResponse(Gtk::RESPONSE_APPLY);
+        }
+        panel.addResponseButton(Gtk::Stock::CLOSE, Gtk::RESPONSE_CLOSE);
+    }
+
+    show_all_children();
 }
 
-template <typename B>
 void
-PanelDialog<B>::_propagateDesktopDeactivated(Inkscape::Application *application, SPDesktop *desktop)
-{
-    _document_replaced_connection.disconnect();
-    _panel.signalDeactiveDesktop().emit(application, desktop);
+PanelDialog<Behavior::FloatingBehavior>::present()
+{ 
+    Dialog::present();
+    _panel.present();
 }
 
-
-static void
-handle_activate_desktop(Inkscape::Application *application, SPDesktop *desktop, void *data)
+/**
+ * Specialize factory method for panel dialogs with floating behavior in order to make them work as
+ * singletons, i.e. allow them track the current active desktop.
+ */
+template <typename P>
+PanelDialog<Behavior::FloatingBehavior> *
+PanelDialog<Behavior::FloatingBehavior>::create()
 {
-    g_return_if_fail(data != NULL);
-    static_cast<PanelDialogBase *>(data)->_propagateDesktopActivated(application, desktop);
-}
+    Panel &panel = P::getInstance();
+    PanelDialog<Behavior::FloatingBehavior> *instance =
+        new PanelDialog<Behavior::FloatingBehavior>(panel, panel.getPrefsPath(),
+                                                    panel.getVerb(), panel.getApplyLabel());
 
-static void
-handle_deactivate_desktop(Inkscape::Application *application, SPDesktop *desktop, void *data)
-{
-    g_return_if_fail(data != NULL);
-    static_cast<PanelDialogBase *>(data)->_propagateDesktopDeactivated(application, desktop);
+    g_signal_connect(G_OBJECT(INKSCAPE), "activate_desktop", G_CALLBACK(_handle_activate_desktop), instance);
+    g_signal_connect(G_OBJECT(INKSCAPE), "deactivate_desktop", G_CALLBACK(handle_deactivate_desktop), instance);
+
+    return instance;
 }
 
 } // namespace Dialog