summaryrefslogtreecommitdiffstats
path: root/src/application/editor.cpp
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-01-16 02:36:01 +0000
committermental <mental@users.sourceforge.net>2006-01-16 02:36:01 +0000
commit179fa413b047bede6e32109e2ce82437c5fb8d34 (patch)
treea5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/application/editor.cpp
downloadinkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz
inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/application/editor.cpp')
-rw-r--r--src/application/editor.cpp416
1 files changed, 416 insertions, 0 deletions
diff --git a/src/application/editor.cpp b/src/application/editor.cpp
new file mode 100644
index 000000000..6c3dbf896
--- /dev/null
+++ b/src/application/editor.cpp
@@ -0,0 +1,416 @@
+/** \file
+ * \brief Editor Implementation class declaration for Inkscape. This
+ * singleton class implements much of the functionality of the former
+ * 'inkscape' object and its services and signals.
+ *
+ * Authors:
+ * Bryce W. Harrington <bryce@bryceharrington.org>
+ * Derek P. Moore <derekm@hackunix.org>
+ * Ralf Stephan <ralf@ark.in-berlin.de>
+ *
+ * Copyright (C) 2004-2005 Authors
+ *
+ * Released under GNU GPL. Read the file 'COPYING' for more information.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/*
+ TODO: Replace SPDocument with the new Inkscape::Document
+ TODO: Change 'desktop's to 'view*'s
+ TODO: Add derivation from Inkscape::Application::RunMode
+*/
+
+
+#include "path-prefix.h"
+#include "io/sys.h"
+#include "sp-object-repr.h"
+#include <desktop-handles.h>
+#include "document.h"
+#include "sp-namedview.h"
+#include "event-context.h"
+#include "sp-guide.h"
+#include "selection.h"
+#include "editor.h"
+#include "application/application.h"
+#include "preferences.h"
+#include "ui/view/edit-widget.h"
+
+namespace Inkscape {
+namespace NSApplication {
+
+static Editor *_instance = 0;
+static void *_window;
+
+Editor*
+Editor::create (gint argc, char **argv)
+{
+ if (_instance == 0)
+ {
+ _instance = new Editor (argc, argv);
+ _instance->init();
+ }
+ return _instance;
+}
+
+Editor::Editor (gint argc, char **argv)
+: _documents (0),
+ _desktops (0),
+ _argv0 (argv[0]),
+ _dialogs_toggle (true)
+
+{
+ sp_object_type_register ("sodipodi:namedview", SP_TYPE_NAMEDVIEW);
+ sp_object_type_register ("sodipodi:guide", SP_TYPE_GUIDE);
+
+ Inkscape::Preferences::load();
+}
+
+bool
+Editor::init()
+{
+ // Load non-local template until we have everything right
+ // This code formerly lived in file.cpp
+ //
+ gchar const *tmpl = g_build_filename ((INKSCAPE_TEMPLATESDIR), "default.svg", NULL);
+ bool have_default = Inkscape::IO::file_test (tmpl, G_FILE_TEST_IS_REGULAR);
+ SPDocument *doc = sp_document_new (have_default? tmpl:0, true, true);
+ g_return_val_if_fail (doc != 0, false);
+ Inkscape::UI::View::EditWidget *ew = new Inkscape::UI::View::EditWidget (doc);
+ sp_document_unref (doc);
+ _window = ew->getWindow();
+ return ew != 0;
+}
+
+Editor::~Editor()
+{
+}
+
+/// Returns the Window representation of this application object
+void*
+Editor::getWindow()
+{
+ return _window;
+}
+
+/// Returns the active document
+SPDocument*
+Editor::getActiveDocument()
+{
+ if (getActiveDesktop()) {
+ return SP_DT_DOCUMENT (getActiveDesktop());
+ }
+
+ return NULL;
+}
+
+void
+Editor::addDocument (SPDocument *doc)
+{
+ g_assert (!g_slist_find (_instance->_documents, doc));
+ _instance->_documents = g_slist_append (_instance->_documents, doc);
+}
+
+void
+Editor::removeDocument (SPDocument *doc)
+{
+ g_assert (g_slist_find (_instance->_documents, doc));
+ _instance->_documents = g_slist_remove (_instance->_documents, doc);
+}
+
+SPDesktop*
+Editor::createDesktop (SPDocument* doc)
+{
+ g_assert (doc != 0);
+ (new Inkscape::UI::View::EditWidget (doc))->present();
+ sp_document_unref (doc);
+ SPDesktop *dt = getActiveDesktop();
+ reactivateDesktop (dt);
+ return dt;
+}
+
+/// Returns the currently active desktop
+SPDesktop*
+Editor::getActiveDesktop()
+{
+ if (_instance->_desktops == NULL) {
+ return NULL;
+ }
+
+ return (SPDesktop *) _instance->_desktops->data;
+}
+
+/// Add desktop to list of desktops
+void
+Editor::addDesktop (SPDesktop *dt)
+{
+ g_return_if_fail (dt != 0);
+ g_assert (!g_slist_find (_instance->_desktops, dt));
+
+ _instance->_desktops = g_slist_append (_instance->_desktops, dt);
+
+ if (isDesktopActive (dt)) {
+ _instance->_desktop_activated_signal.emit (dt);
+ _instance->_event_context_set_signal.emit (SP_DT_EVENTCONTEXT (dt));
+ _instance->_selection_set_signal.emit (SP_DT_SELECTION (dt));
+ _instance->_selection_changed_signal.emit (SP_DT_SELECTION (dt));
+ }
+}
+
+/// Remove desktop from list of desktops
+void
+Editor::removeDesktop (SPDesktop *dt)
+{
+ g_return_if_fail (dt != 0);
+ g_assert (g_slist_find (_instance->_desktops, dt));
+
+ if (dt == _instance->_desktops->data) { // is it the active desktop?
+ _instance->_desktop_deactivated_signal.emit (dt);
+ if (_instance->_desktops->next != 0) {
+ SPDesktop * new_desktop = (SPDesktop *) _instance->_desktops->next->data;
+ _instance->_desktops = g_slist_remove (_instance->_desktops, new_desktop);
+ _instance->_desktops = g_slist_prepend (_instance->_desktops, new_desktop);
+ _instance->_desktop_activated_signal.emit (new_desktop);
+ _instance->_event_context_set_signal.emit (SP_DT_EVENTCONTEXT (new_desktop));
+ _instance->_selection_set_signal.emit (SP_DT_SELECTION (new_desktop));
+ _instance->_selection_changed_signal.emit (SP_DT_SELECTION (new_desktop));
+ } else {
+ _instance->_event_context_set_signal.emit (0);
+ if (SP_DT_SELECTION(dt))
+ SP_DT_SELECTION(dt)->clear();
+ }
+ }
+
+ _instance->_desktops = g_slist_remove (_instance->_desktops, dt);
+
+ // if this was the last desktop, shut down the program
+ if (_instance->_desktops == NULL) {
+ _instance->_shutdown_signal.emit();
+ Inkscape::NSApplication::Application::exit();
+ }
+}
+
+void
+Editor::activateDesktop (SPDesktop* dt)
+{
+ g_assert (dt != 0);
+ if (isDesktopActive (dt))
+ return;
+
+ g_assert (g_slist_find (_instance->_desktops, dt));
+ SPDesktop *curr = (SPDesktop*)_instance->_desktops->data;
+ _instance->_desktop_deactivated_signal.emit (curr);
+
+ _instance->_desktops = g_slist_remove (_instance->_desktops, dt);
+ _instance->_desktops = g_slist_prepend (_instance->_desktops, dt);
+
+ _instance->_desktop_activated_signal.emit (dt);
+ _instance->_event_context_set_signal.emit (SP_DT_EVENTCONTEXT(dt));
+ _instance->_selection_set_signal.emit (SP_DT_SELECTION(dt));
+ _instance->_selection_changed_signal.emit (SP_DT_SELECTION(dt));
+}
+
+void
+Editor::reactivateDesktop (SPDesktop* dt)
+{
+ g_assert (dt != 0);
+ if (isDesktopActive(dt))
+ _instance->_desktop_activated_signal.emit (dt);
+}
+
+bool
+Editor::isDuplicatedView (SPDesktop* dt)
+{
+ SPDocument const* document = dt->doc();
+ if (!document) {
+ return false;
+ }
+ for ( GSList *iter = _instance->_desktops ; iter ; iter = iter->next ) {
+ SPDesktop *other_desktop=(SPDesktop *)iter->data;
+ SPDocument *other_document=other_desktop->doc();
+ if ( other_document == document && other_desktop != dt ) {
+ return true;
+ }
+ }
+ return false;
+}
+
+ /// Returns the event context
+//SPEventContext*
+//Editor::getEventContext()
+//{
+// if (getActiveDesktop()) {
+// return SP_DT_EVENTCONTEXT (getActiveDesktop());
+// }
+//
+// return NULL;
+//}
+
+
+void
+Editor::selectionModified (Inkscape::Selection* sel, guint flags)
+{
+ g_return_if_fail (sel != NULL);
+ if (isDesktopActive (sel->desktop()))
+ _instance->_selection_modified_signal.emit (sel, flags);
+}
+
+void
+Editor::selectionChanged (Inkscape::Selection* sel)
+{
+ g_return_if_fail (sel != NULL);
+ if (isDesktopActive (sel->desktop()))
+ _instance->_selection_changed_signal.emit (sel);
+}
+
+void
+Editor::subSelectionChanged (SPDesktop* dt)
+{
+ g_return_if_fail (dt != NULL);
+ if (isDesktopActive (dt))
+ _instance->_subselection_changed_signal.emit (dt);
+}
+
+void
+Editor::selectionSet (Inkscape::Selection* sel)
+{
+ g_return_if_fail (sel != NULL);
+ if (isDesktopActive (sel->desktop())) {
+ _instance->_selection_set_signal.emit (sel);
+ _instance->_selection_changed_signal.emit (sel);
+ }
+}
+
+void
+Editor::eventContextSet (SPEventContext* ec)
+{
+ g_return_if_fail (ec != NULL);
+ g_return_if_fail (SP_IS_EVENT_CONTEXT (ec));
+ if (isDesktopActive (ec->desktop))
+ _instance->_event_context_set_signal.emit (ec);
+}
+
+void
+Editor::hideDialogs()
+{
+ _instance->_dialogs_hidden_signal.emit();
+ _instance->_dialogs_toggle = false;
+}
+
+void
+Editor::unhideDialogs()
+{
+ _instance->_dialogs_unhidden_signal.emit();
+ _instance->_dialogs_toggle = true;
+}
+
+void
+Editor::toggleDialogs()
+{
+ if (_dialogs_toggle) {
+ hideDialogs();
+ } else {
+ unhideDialogs();
+ }
+}
+
+void
+Editor::refreshDisplay()
+{
+ // TODO
+}
+
+void
+Editor::exit()
+{
+ //emit shutdown signal so that dialogs could remember layout
+ _shutdown_signal.emit();
+ Inkscape::Preferences::save();
+}
+
+//==================================================================
+
+sigc::connection
+Editor::connectSelectionModified
+(const sigc::slot<void, Inkscape::Selection*, guint> &slot)
+{
+ return _instance->_selection_modified_signal.connect (slot);
+}
+
+sigc::connection
+Editor::connectSelectionChanged
+(const sigc::slot<void, Inkscape::Selection*> &slot)
+{
+ return _instance->_selection_changed_signal.connect (slot);
+}
+
+sigc::connection
+Editor::connectSubselectionChanged (const sigc::slot<void, SPDesktop*> &slot)
+{
+ return _instance->_subselection_changed_signal.connect (slot);
+}
+
+sigc::connection
+Editor::connectSelectionSet (const sigc::slot<void, Inkscape::Selection*> &slot)
+{
+ return _instance->_selection_set_signal.connect (slot);
+}
+
+sigc::connection
+Editor::connectEventContextSet (const sigc::slot<void, SPEventContext*> &slot)
+{
+ return _instance->_event_context_set_signal.connect (slot);
+}
+
+sigc::connection
+Editor::connectDesktopActivated (const sigc::slot<void, SPDesktop*> &slot)
+{
+ return _instance->_desktop_activated_signal.connect (slot);
+}
+
+sigc::connection
+Editor::connectDesktopDeactivated (const sigc::slot<void, SPDesktop*> &slot)
+{
+ return _instance->_desktop_deactivated_signal.connect (slot);
+}
+
+sigc::connection
+Editor::connectShutdown (const sigc::slot<void> &slot)
+{
+ return _instance->_shutdown_signal.connect (slot);
+}
+
+sigc::connection
+Editor::connectDialogsHidden (const sigc::slot<void> &slot)
+{
+ return _instance->_dialogs_hidden_signal.connect (slot);
+}
+
+sigc::connection
+Editor::connectDialogsUnhidden (const sigc::slot<void> &slot)
+{
+ return _instance->_dialogs_unhidden_signal.connect (slot);
+}
+
+sigc::connection
+Editor::connectExternalChange (const sigc::slot<void> &slot)
+{
+ return _instance->_external_change_signal.connect (slot);
+}
+
+
+} // namespace NSApplication
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :