summaryrefslogtreecommitdiffstats
path: root/kig/kig/kig.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kig/kig/kig.cpp')
-rw-r--r--kig/kig/kig.cpp308
1 files changed, 308 insertions, 0 deletions
diff --git a/kig/kig/kig.cpp b/kig/kig/kig.cpp
new file mode 100644
index 00000000..2429c843
--- /dev/null
+++ b/kig/kig/kig.cpp
@@ -0,0 +1,308 @@
+/**
+ This file is part of Kig, a KDE program for Interactive Geometry...
+ Copyright (C) 2002 Dominique Devriese <devriese@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
+ USA
+**/
+
+#include "kig.h"
+#include "kig.moc"
+
+#include <qevent.h>
+#include <qtimer.h>
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kedittoolbar.h>
+#include <kfiledialog.h>
+#include <kkeydialog.h>
+#include <klibloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstatusbar.h>
+#include <kstdaction.h>
+#include <ktip.h>
+#include <kurl.h>
+#include <kurldrag.h>
+
+#include <assert.h>
+
+Kig::Kig()
+ : KParts::MainWindow( 0L, "Kig" ), m_part( 0 )
+{
+ // setting the configation file
+ config = new KConfig( "kigrc" );
+ // set the shell's ui resource file
+ setXMLFile("kigui.rc");
+ // then, setup our actions
+ setupActions();
+
+ // this routine will find and load our Part. it finds the Part by
+ // name which is a bad idea usually.. but it's alright in this
+ // case since our Part is made for this Shell
+
+ // we use globalLibrary() because if we use python scripting, then
+ // we need the python symbols to be exported, in order for python to
+ // be able to load its dll modules.. Another part of the problem is
+ // that boost.python fails to link against python ( on Debian at
+ // least ).
+ KLibrary* library = KLibLoader::self()->globalLibrary("libkigpart");
+ KLibFactory* factory = 0;
+ if ( library ) factory = library->factory();
+ if (factory)
+ {
+ // now that the Part is loaded, we cast it to a Part to get
+ // our hands on it
+ m_part = static_cast<KParts::ReadWritePart*>
+ (factory->create(this, "kig_part", "KParts::ReadWritePart" ));
+ if (m_part)
+ {
+ // tell the KParts::MainWindow that this is indeed the main widget
+ setCentralWidget(m_part->widget());
+
+ // and integrate the part's GUI with the shell's
+ createGUI(m_part);
+ // finally show tip-of-day ( if the user wants it :) )
+ QTimer::singleShot( 0, this, SLOT( startupTipOfDay() ) );
+ }
+ }
+ else
+ {
+ // if we couldn't find our Part, we exit since the Shell by
+ // itself can't do anything useful
+ KMessageBox::error(this, i18n( "Could not find the necessary Kig library, check your installation." ) );
+ KApplication::exit();
+ return;
+ }
+
+ // we have drag'n'drop
+ setAcceptDrops(true);
+
+ // save the window settings on exit.
+ setAutoSaveSettings();
+}
+
+Kig::~Kig()
+{
+ m_recentFilesAction->saveEntries(config);
+ delete config;
+}
+
+void Kig::setupActions()
+{
+ KStdAction::openNew(this, SLOT(fileNew()), actionCollection());
+ KStdAction::open(this, SLOT(fileOpen()), actionCollection());
+ KStdAction::quit(this, SLOT(close()), actionCollection());
+
+#ifdef KIG_DONT_USE_NEW_KMAINWINDOW_FEATURES
+ m_toolbarAction = KStdAction::showToolbar(this, SLOT(optionsShowToolbar()), actionCollection());
+ m_statusbarAction = KStdAction::showStatusbar(this, SLOT(optionsShowStatusbar()), actionCollection());
+#else
+ createStandardStatusBarAction();
+ setStandardToolBarMenuEnabled(true);
+#endif
+
+ // FIXME: this (recent files) should be app-wide, not specific to each window...
+ m_recentFilesAction = KStdAction::openRecent(this, SLOT(openURL(const KURL&)), actionCollection());
+ m_recentFilesAction->loadEntries(config);
+
+#if KDE_IS_VERSION( 3, 2, 90 )
+ KStdAction::keyBindings( guiFactory(), SLOT( configureShortcuts() ), actionCollection() );
+#else
+ KStdAction::keyBindings(this, SLOT(optionsConfigureKeys()), actionCollection());
+#endif
+ KStdAction::configureToolbars(this, SLOT(optionsConfigureToolbars()), actionCollection());
+
+ KStdAction::tipOfDay( this, SLOT( tipOfDay() ), actionCollection(), "help_tipofday" );
+}
+
+void Kig::saveProperties(KConfig* config)
+{
+ // the 'config' object points to the session managed
+ // config file. anything you write here will be available
+ // later when this app is restored
+ config->writePathEntry("fileName", m_part->url().path());
+}
+
+void Kig::readProperties(KConfig* config)
+{
+ // the 'config' object points to the session managed
+ // config file. this function is automatically called whenever
+ // the app is being restored. read in here whatever you wrote
+ // in 'saveProperties'
+ load ( KURL(config->readPathEntry("fileName")));
+}
+
+void Kig::load(const KURL& url)
+{
+ // we check for m_part not being 0, because in the case of us not
+ // finding our library, we would otherwise get a crash...
+ if ( m_part && m_part->openURL( url ) ) m_recentFilesAction->addURL( url );
+}
+
+void Kig::fileNew()
+{
+ // this slot is called whenever the File->New menu is selected,
+ // the New shortcut is pressed (usually CTRL+N) or the New toolbar
+ // button is clicked
+
+ // create a new window if we aren't in the "initial state" ( see
+ // the KDE style guide on the file menu stuff...)
+ if ( ! m_part->url().isEmpty() || m_part->isModified() )
+ (new Kig)->show();
+}
+
+void Kig::openURL(const KURL& url)
+{
+ // Called for opening a file by either the KRecentFilesAction or our
+ // own fileOpen() method.
+ // if we are in the "initial state", we open the url in this window:
+ if ( m_part->url().isEmpty() && ! m_part->isModified() )
+ {
+ load( url );
+ }
+ else
+ {
+ // otherwise we open it in a new window...
+ Kig* widget = new Kig;
+ widget->load(url);
+ widget->show();
+ };
+}
+
+void Kig::optionsConfigureKeys()
+{
+#if KDE_IS_VERSION( 3, 2, 90 )
+ assert( false );
+#else
+ KKeyDialog dlg( true, this );
+ dlg.insert( actionCollection() );
+ dlg.insert( m_part->actionCollection() );
+ (void) dlg.configure( true );
+#endif
+}
+
+void Kig::optionsConfigureToolbars()
+{
+ saveMainWindowSettings(KGlobal::config(), "MainWindow");
+
+ // use the standard toolbar editor
+ KEditToolbar dlg(factory());
+ connect(&dlg, SIGNAL(newToolbarConfig()),
+ this, SLOT(applyNewToolbarConfig()));
+ dlg.exec();
+}
+
+void Kig::applyNewToolbarConfig()
+{
+ applyMainWindowSettings(KGlobal::config(), "MainWindow");
+}
+
+bool Kig::queryClose()
+{
+ if (!m_part->isReadWrite() || !m_part->isModified()) return true;
+ switch( KMessageBox::warningYesNoCancel
+ (
+ widget(),
+ i18n("Save changes to document %1?").arg(m_part->url().path()),
+ i18n("Save Changes?"),KStdGuiItem::save(),KStdGuiItem::discard()
+ ))
+ {
+ case KMessageBox::Yes:
+ if (m_part->save()) return true;
+ else return false;
+ break;
+ case KMessageBox::No:
+ return true;
+ break;
+ default: // cancel
+ return false;
+ break;
+ };
+}
+
+void Kig::dragEnterEvent(QDragEnterEvent* e)
+{
+ e->accept(KURLDrag::canDecode(e));
+}
+
+void Kig::dropEvent(QDropEvent* e)
+{
+ KURL::List urls;
+ if ( KURLDrag::decode (e, urls) )
+ {
+ for (KURL::List::iterator u = urls.begin(); u != urls.end(); ++u)
+ {
+ Kig* k = new Kig;
+ k->show();
+ k->load(*u);
+ };
+ };
+}
+
+void Kig::fileOpen()
+{
+ QString formats =
+ i18n( "*.kig *.kigz *.kgeo *.seg|All Supported Files (*.kig *.kigz *.kgeo *.seg)\n"
+ "*.kig|Kig Documents (*.kig)\n"
+ "*.kigz|Compressed Kig Documents (*.kigz)\n"
+ "*.kgeo|KGeo Documents (*.kgeo)\n"
+ "*.seg|KSeg Documents (*.seg)\n"
+ "*.fgeo|Dr. Geo Documents (*.fgeo)\n"
+ "*.fig *.FIG|Cabri Documents (*.fig *.FIG)" );
+
+ // this slot is connected to the KStdAction::open action...
+ QString file_name = KFileDialog::getOpenFileName(":document", formats );
+
+ if (!file_name.isEmpty()) openURL(file_name);
+}
+
+// ifdef's disabled, cause Qt moc doesn't handle ifdef's..
+// #ifdef KIG_DONT_USE_NEW_KMAINWINDOW_FEATURES
+void Kig::optionsShowToolbar()
+{
+#ifdef KIG_DONT_USE_NEW_KMAINWINDOW_FEATURES
+ if (m_toolbarAction->isChecked())
+ toolBar()->show();
+ else
+ toolBar()->hide();
+#else
+ assert( false );
+#endif
+}
+
+void Kig::optionsShowStatusbar()
+{
+#ifdef KIG_DONT_USE_NEW_KMAINWINDOW_FEATURES
+ if (m_statusbarAction->isChecked())
+ statusBar()->show();
+ else
+ statusBar()->hide();
+#else
+ assert( false );
+#endif
+}
+// #endif
+
+void Kig::tipOfDay() {
+ KTipDialog::showTip( "kig/tips", true );
+}
+
+void Kig::startupTipOfDay() {
+ KTipDialog::showTip( "kig/tips" );
+}