summaryrefslogtreecommitdiffstats
path: root/src/mainwindowshare.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainwindowshare.cpp')
-rw-r--r--src/mainwindowshare.cpp451
1 files changed, 451 insertions, 0 deletions
diff --git a/src/mainwindowshare.cpp b/src/mainwindowshare.cpp
new file mode 100644
index 00000000..4dcb17c9
--- /dev/null
+++ b/src/mainwindowshare.cpp
@@ -0,0 +1,451 @@
+/***************************************************************************
+ mainwindowshare.cpp - shared stuff of the main widgets
+ -------------------
+ begin : 19 Dec 2002
+ copyright : (C) 2002 by Falk Brettschneider
+ email : falk@kdevelop.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. *
+ * *
+ ***************************************************************************/
+
+#include <qcheckbox.h>
+#include <qvbox.h>
+#include <qbuttongroup.h>
+#include <qradiobutton.h>
+#include <qdir.h>
+#include <qregexp.h>
+
+#include <kxmlguiclient.h>
+#include <kaction.h>
+#include <kaboutdata.h>
+#include <kstdaction.h>
+#include <kapplication.h>
+#include <klocale.h>
+#include <kstatusbar.h>
+#include <kparts/mainwindow.h>
+#include <kdialogbase.h>
+#include <kconfig.h>
+#include <kkeydialog.h>
+#include <kmenubar.h>
+#include <kedittoolbar.h>
+#include <kbugreport.h>
+#include <kurlrequester.h>
+#include <kpopupmenu.h>
+#include <kiconloader.h>
+
+#include <ktexteditor/document.h>
+#include <ktexteditor/view.h>
+#include <ktexteditor/configinterface.h>
+#include <kparts/partmanager.h>
+#include <kdeversion.h>
+#include <kdebug.h>
+#include <knotifydialog.h>
+
+
+#include <config.h>
+
+#include "partcontroller.h"
+#include "projectmanager.h"
+#include "core.h"
+#include "api.h"
+#include "kdevmakefrontend.h"
+#include "toplevel.h"
+#include "plugincontroller.h"
+
+#include "kdevplugininfo.h"
+
+#include "mainwindowshare.h"
+
+#include "shellextension.h"
+
+using namespace MainWindowUtils;
+
+MainWindowShare::MainWindowShare(QObject* pParent, const char* name)
+ :QObject(pParent, name)
+ ,m_toggleMainToolbar(0L)
+ ,m_toggleBuildToolbar(0L)
+ ,m_toggleViewToolbar(0L)
+ ,m_toggleBrowserToolbar(0L)
+ ,m_toggleStatusbar(0L)
+ ,m_stopProcesses(0L)
+{
+ m_pMainWnd = (KParts::MainWindow*)pParent;
+}
+
+void MainWindowShare::init()
+{
+ connect(Core::getInstance(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)));
+
+ connect( m_pMainWnd->actionCollection(), SIGNAL( actionStatusText( const QString & ) ),
+ this, SLOT( slotActionStatusText( const QString & ) ) );
+}
+
+void MainWindowShare::slotActionStatusText( const QString &text )
+{
+// kdDebug(9000) << "MainWindowShare::slotActionStatusText() - " << text << endl;
+
+ if ( ! m_pMainWnd ) return;
+
+ KStatusBar * statusBar = m_pMainWnd->statusBar();
+
+ if ( ! statusBar ) return;
+
+ statusBar->message( text );
+}
+
+void MainWindowShare::createActions()
+{
+ ProjectManager::getInstance()->createActions( m_pMainWnd->actionCollection() );
+
+ KStdAction::quit(this->parent(), SLOT(close()), m_pMainWnd->actionCollection());
+
+ KAction* action;
+
+ m_stopProcesses = new KToolBarPopupAction( i18n( "&Stop" ), "stop",
+ Key_Escape, this, SLOT(slotStopButtonPressed()),
+ m_pMainWnd->actionCollection(), "stop_processes" );
+ m_stopProcesses->setToolTip(i18n("Stop"));
+ m_stopProcesses->setWhatsThis(i18n("<b>Stop</b><p>Stops all running processes (like building process, grep command, etc.). When placed onto a toolbar provides a popup menu to choose a process to stop."));
+ m_stopProcesses->setEnabled( false );
+ connect(m_stopProcesses->popupMenu(), SIGNAL(aboutToShow()),
+ this, SLOT(slotStopMenuAboutToShow()));
+ connect(m_stopProcesses->popupMenu(), SIGNAL(activated(int)),
+ this, SLOT(slotStopPopupActivated(int)));
+
+ connect( Core::getInstance(), SIGNAL(activeProcessChanged(KDevPlugin*, bool)),
+ this, SLOT(slotActiveProcessChanged(KDevPlugin*, bool)) );
+
+ action = KStdAction::showMenubar(
+ this, SLOT(slotShowMenuBar()),
+ m_pMainWnd->actionCollection(), "settings_show_menubar" );
+ action->setToolTip(beautifyToolTip(action->text()));
+ action->setWhatsThis(QString("<b>%1</b><p>%2").arg(beautifyToolTip(action->text())).arg(i18n("Lets you switch the menubar on/off.")));
+
+ action = KStdAction::keyBindings(
+ this, SLOT(slotKeyBindings()),
+ m_pMainWnd->actionCollection(), "settings_configure_shortcuts" );
+ action->setToolTip(beautifyToolTip(action->text()));
+ action->setWhatsThis(QString("<b>%1</b><p>%2").arg(beautifyToolTip(action->text())).arg(i18n("Lets you configure shortcut keys.")));
+
+ action = KStdAction::configureToolbars(
+ this, SLOT(slotConfigureToolbars()),
+ m_pMainWnd->actionCollection(), "settings_configure_toolbars" );
+ action->setToolTip(beautifyToolTip(action->text()));
+ action->setWhatsThis(QString("<b>%1</b><p>%2").arg(beautifyToolTip(action->text())).arg(i18n("Lets you configure toolbars.")));
+
+ action = KStdAction::configureNotifications(
+ this, SLOT(slotConfigureNotifications()),
+ m_pMainWnd->actionCollection(), "settings_configure_notifications" );
+ action->setToolTip(beautifyToolTip(action->text()));
+ action->setWhatsThis(QString("<b>%1</b><p>%2").arg(beautifyToolTip(action->text())).arg(i18n("Lets you configure system notifications.")));
+
+ action = KStdAction::preferences(this, SLOT(slotSettings()),
+ m_pMainWnd->actionCollection(), "settings_configure" );
+ action->setToolTip( i18n( "Configure KDevelop" ) );
+ action->setWhatsThis(QString("<b>%1</b><p>%2").arg(i18n( "Configure KDevelop" )).arg(i18n("Lets you customize KDevelop.")));
+
+ m_toggleStatusbar = KStdAction::showToolbar(this, SLOT(slotToggleStatusbar()),m_pMainWnd->actionCollection(), "settings_statusbar");
+ m_toggleStatusbar->setText(i18n("Show &Statusbar"));
+ m_toggleStatusbar->setToolTip( i18n("Show statusbar") );
+ m_toggleStatusbar->setWhatsThis(i18n("<b>Show statusbar</b><p>Hides or shows the statusbar."));
+
+ action = new KAction( i18n("&Next Window"), ALT+Key_Right, this, SIGNAL(gotoNextWindow()),m_pMainWnd->actionCollection(), "view_next_window");
+ action->setToolTip( i18n("Next window") );
+ action->setWhatsThis(i18n("<b>Next window</b><p>Switches to the next window."));
+
+ action = new KAction( i18n("&Previous Window"), ALT+Key_Left, this, SIGNAL(gotoPreviousWindow()),m_pMainWnd->actionCollection(), "view_previous_window");
+ action->setToolTip( i18n("Previous window") );
+ action->setWhatsThis(i18n("<b>Previous window</b><p>Switches to the previous window."));
+
+ action = new KAction( i18n("&Last Accessed Window"), ALT+Key_Up, this, SIGNAL(gotoLastWindow()), m_pMainWnd->actionCollection(), "view_last_window");
+ action->setToolTip( i18n("Last accessed window") );
+ action->setWhatsThis(i18n("<b>Last accessed window</b><p>Switches to the last viewed window (Hold the Alt key pressed and walk on by repeating the Up key)."));
+
+ action = new KAction( i18n("&First Accessed Window"), ALT+Key_Down, this, SIGNAL(gotoFirstWindow()), m_pMainWnd->actionCollection(), "view_first_window");
+ action->setToolTip( i18n("First accessed window") );
+ action->setWhatsThis(i18n("<b>First accessed window</b><p>Switches to the first accessed window (Hold the Alt key pressed and walk on by repeating the Down key)."));
+
+ action = new KAction( i18n("Configure Plugins..."), SmallIconSet("configure"), 0, PluginController::getInstance(), SLOT(selectPlugins()), m_pMainWnd->actionCollection(), "settings_configure_plugins" );
+
+ m_configureEditorAction = new KAction( i18n("Configure &Editor..."), SmallIconSet("configure"), 0, this, SLOT( slotConfigureEditors() ), m_pMainWnd->actionCollection(), "settings_configure_editors");
+ m_configureEditorAction->setToolTip( i18n("Configure editor settings") );
+ m_configureEditorAction->setWhatsThis(i18n("<b>Configure editor</b><p>Opens editor configuration dialog."));
+ m_configureEditorAction->setEnabled( false );
+
+ KDevPartController * partController = API::getInstance()->partController();
+ connect( partController, SIGNAL(activePartChanged(KParts::Part*)), this, SLOT(slotActivePartChanged(KParts::Part* )) );
+}
+
+void MainWindowShare::slotReportBug()
+{
+ KBugReport a(m_pMainWnd, true, KGlobal::instance()->aboutData() );
+ a.exec();
+}
+
+void MainWindowShare::slotToggleMainToolbar()
+{
+ if (m_toggleMainToolbar->isChecked())
+ m_pMainWnd->toolBar("mainToolBar")->show();
+ else
+ m_pMainWnd->toolBar("mainToolBar")->hide();
+}
+
+void MainWindowShare::slotToggleBuildToolbar()
+{
+ if (m_toggleBuildToolbar->isChecked())
+ m_pMainWnd->toolBar("buildToolBar")->show();
+ else
+ m_pMainWnd->toolBar("buildToolBar")->hide();
+}
+
+void MainWindowShare::slotToggleViewToolbar()
+{
+ if (m_toggleViewToolbar->isChecked())
+ m_pMainWnd->toolBar("viewToolBar")->show();
+ else
+ m_pMainWnd->toolBar("viewToolBar")->hide();
+}
+
+void MainWindowShare::slotToggleBrowserToolbar()
+{
+ if (m_toggleBrowserToolbar->isChecked())
+ m_pMainWnd->toolBar("browserToolBar")->show();
+ else
+ m_pMainWnd->toolBar("browserToolBar")->hide();
+}
+
+void MainWindowShare::slotToggleStatusbar()
+{
+ KStatusBar* sb = (KStatusBar*) m_pMainWnd->statusBar();
+ if (m_toggleStatusbar->isChecked())
+ sb->show();
+ else
+ sb->hide();
+}
+
+void MainWindowShare::slotStopButtonPressed()
+{
+ Core::getInstance()->doEmitStopButtonPressed();
+}
+
+void MainWindowShare::slotActiveProcessChanged( KDevPlugin* plugin, bool active )
+{
+ if ( !plugin )
+ return;
+
+ if ( active ) {
+ activeProcesses.append( plugin );
+ } else {
+ activeProcesses.removeRef( plugin );
+ }
+ m_stopProcesses->setEnabled( !activeProcesses.isEmpty() );
+}
+
+void MainWindowShare::slotStopPopupActivated( int id )
+{
+ KDevPlugin* plugin = activeProcesses.at( id );
+ if ( plugin && plugin->info()->genericName() == m_stopProcesses->popupMenu()->text( id ) ) {
+ Core::getInstance()->doEmitStopButtonPressed( plugin );
+ return;
+ } else {
+ // oops... list has changed in the meantime
+ QString str = m_stopProcesses->popupMenu()->text( id );
+ for ( plugin = activeProcesses.first(); plugin; plugin = activeProcesses.next() ) {
+ if ( plugin->info()->genericName() == str ) {
+ Core::getInstance()->doEmitStopButtonPressed( plugin );
+ return;
+ }
+ }
+ }
+}
+
+void MainWindowShare::slotStopMenuAboutToShow()
+{
+ QPopupMenu* popup = m_stopProcesses->popupMenu();
+ popup->clear();
+
+ int i = 0;
+ for ( KDevPlugin* plugin = activeProcesses.first(); plugin; plugin = activeProcesses.next() ) {
+ popup->insertItem( plugin->info()->genericName(), i++ );
+ }
+}
+
+void MainWindowShare::slotShowMenuBar()
+{
+ if (m_pMainWnd->menuBar()->isVisible()) {
+ m_pMainWnd->menuBar()->hide();
+ } else {
+ m_pMainWnd->menuBar()->show();
+ }
+ m_pMainWnd->saveMainWindowSettings( KGlobal::config(), "Mainwindow" );
+}
+
+void MainWindowShare::slotConfigureNotifications()
+{
+ KNotifyDialog::configure(m_pMainWnd, "Notification Configuration Dialog");
+}
+
+void MainWindowShare::slotSettings()
+{
+ KDialogBase dlg(KDialogBase::IconList, i18n("Configure KDevelop"),
+ KDialogBase::Help|KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, m_pMainWnd,
+ "customization dialog");
+ dlg.setHelp("setup");
+
+ ShellExtension::getInstance()->createGlobalSettingsPage(&dlg);
+
+ KConfig* config = kapp->config();
+
+ config->setGroup("Global Settings Dialog");
+ int height = config->readNumEntry( "Height", 600 );
+ int width = config->readNumEntry( "Width", 800 );
+
+ dlg.resize( width, height );
+
+ Core::getInstance()->doEmitConfigWidget(&dlg);
+ dlg.exec();
+
+ config->setGroup("Global Settings Dialog");
+ config->writeEntry( "Height", dlg.size().height() );
+ config->writeEntry( "Width", dlg.size().width() );
+
+ if ( dlg.result() != QDialog::Rejected )
+ ShellExtension::getInstance()->acceptGlobalSettingsPage(&dlg);
+}
+
+void MainWindowShare::slotConfigureEditors()
+{
+ kdDebug(9000) << " *** MainWindowShare::slotConfigureEditors()" << endl;
+
+ KDevPartController * partController = API::getInstance()->partController();
+ KParts::Part * part = partController->activePart();
+
+ KTextEditor::ConfigInterface * conf = dynamic_cast<KTextEditor::ConfigInterface*>( part );
+ if ( ! conf )
+ {
+ kdDebug(9000) << "*** No KTextEditor::ConfigInterface for part!" << endl;
+ return;
+ }
+
+ // show the modal config dialog for this part if it has a ConfigInterface
+ conf->configDialog();
+ conf->writeConfig();
+
+}
+
+void MainWindowShare::slotGUICreated( KParts::Part * part )
+{
+// kdDebug(9000) << "MainWindowShare::slotGUICreated()" << endl;
+
+ if ( ! part ) return;
+
+ // disable configuration entry if created part is not an editor
+ if ( ! dynamic_cast<KTextEditor::ConfigInterface *>( part ) )
+ {
+ m_configureEditorAction->setEnabled( false );
+ return;
+ }
+
+ m_configureEditorAction->setEnabled( true );
+
+ // remove the part's merged menu entry
+ KAction * action = part->action("set_confdlg"); // name from katepartui.rc
+ if ( action )
+ {
+ kdDebug(9000) << " *** found \"set_confdlg\" action - unplugging" << endl;
+ action->unplugAll();
+ }
+
+ if ( KAction * action = part->action("file_save") )
+ {
+ kdDebug(9000) << " *** found \"file_save\" action - disconnecting" << endl;
+ disconnect( action, SIGNAL(activated()), 0, 0 );
+ connect( action, SIGNAL(activated()), PartController::getInstance(), SLOT(slotSave()) );
+ }
+
+ if ( KAction * action = part->action("file_reload") )
+ {
+ kdDebug(9000) << " *** found \"file_reload\" action - disconnecting" << endl;
+ disconnect( action, SIGNAL(activated()), 0, 0 );
+ connect( action, SIGNAL(activated()), PartController::getInstance(), SLOT(slotReload()) );
+ }
+}
+
+// called when OK ar Apply is clicked in the EditToolbar Dialog
+void MainWindowShare::slotNewToolbarConfig()
+{
+ // replug actionlists here...
+
+ m_pMainWnd->applyMainWindowSettings( KGlobal::config(), "Mainwindow" );
+
+// PartController::getInstance()->reinstallPopups();
+}
+
+void MainWindowShare::slotKeyBindings()
+{
+ KKeyDialog dlg( false, m_pMainWnd );
+ QPtrList<KXMLGUIClient> clients = m_pMainWnd->guiFactory()->clients();
+ for( QPtrListIterator<KXMLGUIClient> it( clients );
+ it.current(); ++it ) {
+ dlg.insert( (*it)->actionCollection() );
+ }
+ if ( dlg.configure() == KKeyDialog::Accepted )
+ {
+ // this is needed for when we have multiple embedded kateparts and change one of them.
+ // it also needs to be done to their views, as they too have actioncollections to update
+ if( const QPtrList<KParts::Part> * partlist = PartController::getInstance()->parts() )
+ {
+ QPtrListIterator<KParts::Part> it( *partlist );
+ while ( KParts::Part* part = it.current() )
+ {
+ if ( KTextEditor::Document * doc = dynamic_cast<KTextEditor::Document*>( part ) )
+ {
+ doc->reloadXML();
+
+ QPtrList<KTextEditor::View> const & list = doc->views();
+ QPtrListIterator<KTextEditor::View> itt( list );
+ while( KTextEditor::View * view = itt.current() )
+ {
+ view->reloadXML();
+ ++itt;
+ }
+ }
+ ++it;
+ }
+ }
+ Core::setupShourtcutTips();
+ }
+}
+
+void MainWindowShare::slotConfigureToolbars()
+{
+ m_pMainWnd->saveMainWindowSettings( KGlobal::config(), "Mainwindow" );
+ KEditToolbar dlg( m_pMainWnd->factory() );
+ connect(&dlg, SIGNAL(newToolbarConfig()), this, SLOT(slotNewToolbarConfig()));
+ dlg.exec();
+}
+
+void MainWindowShare::contextMenu(QPopupMenu* popup, const Context *)
+{
+ if ( m_pMainWnd->menuBar()->isVisible() )
+ return;
+
+ int id = popup->insertItem( i18n("Show &Menubar"), m_pMainWnd->menuBar(), SLOT(show()) );
+ popup->setWhatsThis(id, i18n("<b>Show menubar</b><p>Lets you switch the menubar on/off."));
+}
+
+void MainWindowShare::slotActivePartChanged( KParts::Part * part )
+{
+ m_configureEditorAction->setEnabled( part && dynamic_cast<KTextEditor::Document*>(part) );
+}
+
+#include "mainwindowshare.moc"
+//kate: space-indent on; indent-width 4;