summaryrefslogtreecommitdiffstats
path: root/src/simplemainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/simplemainwindow.cpp')
-rw-r--r--src/simplemainwindow.cpp1011
1 files changed, 1011 insertions, 0 deletions
diff --git a/src/simplemainwindow.cpp b/src/simplemainwindow.cpp
new file mode 100644
index 00000000..5b5e0345
--- /dev/null
+++ b/src/simplemainwindow.cpp
@@ -0,0 +1,1011 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library General Public *
+ * License along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+#include "simplemainwindow.h"
+
+#include <qtextedit.h>
+
+#include <kaction.h>
+#include <kstdaction.h>
+#include <kparts/part.h>
+#include <kpopupmenu.h>
+#include <kmenubar.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kedittoolbar.h>
+#include <ktexteditor/view.h>
+#include <ktexteditor/document.h>
+#include <kapplication.h>
+#include <kurldrag.h>
+#include <kconfig.h>
+
+#include <ddockwindow.h>
+#include <dtabwidget.h>
+#include <profile.h>
+#include <profileengine.h>
+#include <designer.h>
+#include <kdevproject.h>
+#include <urlutil.h>
+
+#include "api.h"
+#include "core.h"
+#include "plugincontroller.h"
+#include "mainwindowshare.h"
+#include "shellextension.h"
+#include "partcontroller.h"
+#include "statusbar.h"
+#include "documentationpart.h"
+#include "toplevel.h"
+#include "projectmanager.h"
+#include "editorproxy.h"
+#include "multibuffer.h"
+
+SimpleMainWindow::SimpleMainWindow(QWidget* parent, const char *name)
+ :DMainWindow(parent, name)
+{
+ resize(800, 600); // starts kdevelop at 800x600 the first time
+ m_mainWindowShare = new MainWindowShare(this);
+
+ connect(m_bottomDock, SIGNAL(hidden()), this, SLOT(raiseEditor()));
+ connect(m_leftDock, SIGNAL(hidden()), this, SLOT(raiseEditor()));
+ connect(m_rightDock, SIGNAL(hidden()), this, SLOT(raiseEditor()));
+}
+
+SimpleMainWindow::~ SimpleMainWindow( )
+{
+ TopLevel::invalidateInstance( this );
+}
+
+void SimpleMainWindow::init()
+{
+ actionCollection()->setHighlightingEnabled( true );
+ setStandardToolBarMenuEnabled( true );
+ setXMLFile(ShellExtension::getInstance()->xmlFile());
+
+ createFramework();
+ createActions();
+ new KDevStatusBar(this);
+
+ setAcceptDrops(true);
+
+ createGUI(0);
+
+ m_mainWindowShare->init();
+ setupWindowMenu();
+ menuBar()->setEnabled( false );
+
+ //FIXME: this checks only for global offers which is not quite correct because
+ //a profile can offer core plugins and no global plugins.
+ if ( PluginController::getInstance()->engine().allOffers(ProfileEngine::Global).isEmpty() )
+ {
+ KMessageBox::sorry( this, i18n("Unable to find plugins, KDevelop will not work"
+ " properly.\nPlease make sure "
+ "that KDevelop is installed in your KDE directory; otherwise, you have "
+ "to add KDevelop's installation "
+ "path to the environment variable KDEDIRS and run kbuildsycoca. Restart "
+ "KDevelop afterwards.\n"
+ "Example for BASH users:\nexport KDEDIRS=/path/to/kdevelop:$KDEDIRS && kbuildsycoca"),
+ i18n("Could Not Find Plugins") );
+ }
+
+ connect(Core::getInstance(), SIGNAL(coreInitialized()), this, SLOT(slotCoreInitialized()));
+ connect(Core::getInstance(), SIGNAL(projectOpened()), this, SLOT(projectOpened()));
+ connect(Core::getInstance(), SIGNAL(projectClosed()), this, SLOT(projectClosed()));
+ connect(Core::getInstance(), SIGNAL(contextMenu(QPopupMenu *, const Context *)),
+ this, SLOT(contextMenu(QPopupMenu *, const Context *)));
+ connect(PartController::getInstance(), SIGNAL(partURLChanged(KParts::ReadOnlyPart *)),
+ this, SLOT(slotPartURLChanged(KParts::ReadOnlyPart * )));
+ connect(PartController::getInstance(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(activePartChanged(KParts::Part*)));
+
+ connect(PartController::getInstance(),
+ SIGNAL(documentChangedState(const KURL &, DocumentState)),
+ this, SLOT(documentChangedState(const KURL&, DocumentState)));
+
+ loadSettings();
+}
+
+void SimpleMainWindow::dragEnterEvent( QDragEnterEvent *event )
+{
+ event->accept(KURLDrag::canDecode(event));
+}
+
+void SimpleMainWindow::dropEvent( QDropEvent *event )
+{
+ slotDropEvent(event);
+}
+
+void SimpleMainWindow::slotDropEvent( QDropEvent *event )
+{
+ KURL::List list;
+ if ( !KURLDrag::decode( event, list ) ) return;
+
+ KURL::List::Iterator it = list.begin();
+ while( it != list.end() )
+ {
+ kdDebug(9000) << "drop url:" << *it << endl;
+ PartController::getInstance()->editDocument( *it );
+ ++it;
+ }
+}
+
+void SimpleMainWindow::contextMenu(QPopupMenu *popupMenu, const Context *context)
+{
+ int cont = context->type();
+ m_splitURLs.clear();
+ if (cont == Context::EditorContext)
+ {
+ KURL url = static_cast<const EditorContext*>(context)->url();
+ QWidget *w = widgetForURL(url);
+ if (w && m_widgetTabs[w] && m_widgetTabs[w]->count() > 1)
+ {
+ m_splitURLs.append(url);
+ m_splitHor1->plug(popupMenu);
+ m_splitVer1->plug(popupMenu);
+ popupMenu->insertSeparator();
+ }
+ }
+ else if (cont == Context::FileContext)
+ {
+ if (PartController::getInstance()->openURLs().count() > 0)
+ {
+ KURL::List urls = static_cast<const FileContext*>(context)->urls();
+ KURL::List::ConstIterator it = urls.begin();
+ while ( it != urls.end() )
+ {
+ if ( !URLUtil::isDirectory( *it ) )
+ {
+ m_splitURLs.append( *it );
+ }
+ ++it;
+ }
+
+ if ( m_splitURLs.isEmpty() ) return;
+
+ bool isOpen = true;
+ for (KURL::List::const_iterator it = m_splitURLs.begin(); it != m_splitURLs.end(); ++it)
+ {
+ if (!PartController::getInstance()->openURLs().contains(*it) && (*it).isValid())
+ {
+ isOpen = false;
+ break;
+ }
+ }
+
+ if ( (isOpen && PartController::getInstance()->openURLs().count() == 1) ||
+ (m_splitURLs.count() == 1 && !(*m_splitURLs.begin()).isValid() ) )
+ {
+ return;
+ }
+
+ popupMenu->insertSeparator();
+ if (isOpen)
+ {
+ m_splitHor1->plug(popupMenu);
+ m_splitVer1->plug(popupMenu);
+ }
+ else
+ {
+ m_splitHor2->plug(popupMenu);
+ m_splitVer2->plug(popupMenu);
+ }
+ }
+ }
+}
+
+void SimpleMainWindow::embedPartView(QWidget *view, const QString &title, const QString &/*toolTip*/)
+{
+ kdDebug() << "SimpleMainWindow::embedPartView: " << view << endl;
+ if (!view )
+ return;
+
+ QString shortName = title;
+ shortName = shortName.right( shortName.length() - (shortName.findRev('/') +1));
+
+ addWidget(view, title);
+ view->show();
+}
+
+void SimpleMainWindow::embedSelectView(QWidget *view, const QString &title, const QString &/*toolTip*/)
+{
+ embedView( DDockWindow::Left, view, title );
+}
+
+void SimpleMainWindow::embedOutputView(QWidget *view, const QString &title, const QString &/*toolTip*/)
+{
+ embedView( DDockWindow::Bottom, view, title );
+}
+
+void SimpleMainWindow::embedSelectViewRight(QWidget *view, const QString &title, const QString &/*toolTip*/)
+{
+ embedView( DDockWindow::Right, view, title );
+}
+
+void SimpleMainWindow::embedView( DDockWindow::Position pos, QWidget * view, const QString & title )
+{
+ if ( !hasDockWidget( view ) )
+ {
+ DDockWindow::Position position = recallToolViewPosition( view->name(), pos );
+ addDockWidget(position, view, title);
+ }
+}
+
+DDockWindow::Position SimpleMainWindow::recallToolViewPosition( const QString & name, DDockWindow::Position defaultPos )
+{
+ KConfig * config = kapp->config();
+ config->setGroup( "DToolDockPosition" );
+
+ QString position = config->readEntry( name );
+
+ if ( name == "unknown" )
+ {
+ kdDebug() << name << endl;
+ }
+
+ if ( position == "DockLeft" ) return DDockWindow::Left;
+ if ( position == "DockRight" ) return DDockWindow::Right;
+ if ( position == "DockBottom" ) return DDockWindow::Bottom;
+
+ return defaultPos;
+}
+
+void SimpleMainWindow::rememberToolViewPosition( const QString & name, DDockWindow::Position pos )
+{
+ KConfig * config = kapp->config();
+ config->setGroup( "DToolDockPosition" );
+
+ QString position = "unknown";
+
+ switch( pos )
+ {
+ case DDockWindow::Left:
+ position = "DockLeft";
+ break;
+ case DDockWindow::Right:
+ position = "DockRight";
+ break;
+ case DDockWindow::Bottom:
+ position = "DockBottom";
+ break;
+ default: ;
+ }
+
+ config->writeEntry( name, position );
+}
+
+
+void SimpleMainWindow::removeView(QWidget *view)
+{
+ if (!view)
+ return;
+
+ //try to remove it from all parts of main window
+ //@fixme This method needs to be divided in two - one for docks and one for part views
+ if (hasDockWidget(view))
+ {
+ rememberToolViewPosition( view->name(), dockWidgetPosition(view) );
+ removeDockWidget(view);
+ }
+ else
+ removeWidget(view);
+}
+
+void SimpleMainWindow::setViewAvailable(QWidget *pView, bool bEnabled)
+{
+ DDockWindow *dock;
+ if (hasDockWidget(pView))
+ dock = toolWindow(dockWidgetPosition(pView));
+ else
+ return;
+
+ bEnabled ? dock->showWidget(pView) : dock->hideWidget(pView);
+}
+
+void SimpleMainWindow::raiseView(QWidget *view)
+{
+ //adymo: a workaround to make editor wrappers work:
+ //editor view is passed to this function but the ui library knows only
+ //of its parent which is an editor wrapper, simply replacing the view
+ //by its wrapper helps here
+ if (view->parent())
+ kdDebug() << view->parent()->className() << endl;
+ if (view->parent() && (view->parent()->isA("EditorWrapper") || view->parent()->isA("MultiBuffer")))
+ {
+// kdDebug() << "parent is editor wrapper: " <<
+// static_cast<EditorWrapper*>(view->parent()) << endl;
+ view = (QWidget*)view->parent();
+ }
+
+ if (hasDockWidget(view))
+ {
+ DDockWindow *dock = toolWindow(dockWidgetPosition(view));
+ dock->raiseWidget(view);
+ }
+ else if (m_widgets.contains(view) && m_widgetTabs.contains(view))
+ m_widgetTabs[view]->showPage(view);
+}
+
+void SimpleMainWindow::lowerView(QWidget * view)
+{
+ if (!hasDockWidget(view))
+ return;
+
+ DDockWindow *dock = toolWindow(dockWidgetPosition(view));
+ dock->lowerWidget(view);
+}
+
+void SimpleMainWindow::loadSettings()
+{
+ KConfig *config = kapp->config();
+
+ ProjectManager::getInstance()->loadSettings();
+ applyMainWindowSettings(config, "SimpleMainWindow");
+
+ Core::setupShourtcutTips();
+}
+
+void SimpleMainWindow::saveSettings( )
+{
+ KConfig *config = kapp->config();
+
+ ProjectManager::getInstance()->saveSettings();
+ saveMainWindowSettings(config, "SimpleMainWindow");
+
+ QMap<QWidget*, DDockWindow::Position>::iterator it = m_docks.begin();
+ while ( it != m_docks.end() )
+ {
+ if ( !strcmp(it.key()->name(), "unnamed") )
+ {
+ kdError() << "Toolviews must have a name : " << it.key() << endl;
+ }
+
+ rememberToolViewPosition( it.key()->name(), it.data() );
+ ++it;
+ }
+
+ DMainWindow::saveSettings();
+}
+
+void SimpleMainWindow::setCurrentDocumentCaption( const QString &caption )
+{
+ if( !PartController::getInstance()->activePart() ) return;
+
+ if (QWidget *widget = EditorProxy::getInstance()->topWidgetForPart(PartController::getInstance()->activePart()))
+ {
+ widget->setCaption(caption);
+ }
+}
+
+KMainWindow *SimpleMainWindow::main()
+{
+ return this;
+}
+
+void SimpleMainWindow::createFramework()
+{
+ PartController::createInstance( this );
+
+ connect(PartController::getInstance(), SIGNAL(activePartChanged(KParts::Part*)),
+ this, SLOT(createGUI(KParts::Part*)));
+}
+
+void SimpleMainWindow::createActions()
+{
+ m_raiseEditor = new KAction(i18n("Raise &Editor"), ALT+Key_C,
+ this, SLOT(raiseEditor()), actionCollection(), "raise_editor");
+ m_raiseEditor->setToolTip(i18n("Raise editor"));
+ m_raiseEditor->setWhatsThis(i18n("<b>Raise editor</b><p>Focuses the editor."));
+
+ m_lowerAllDocks = new KAction(i18n("Lower All Docks"), CTRL+SHIFT+Key_C,
+ this, SLOT(lowerAllDocks()), actionCollection(), "lower_all_docks");
+
+ new KAction(i18n("Switch to next TabWidget"), 0, this,
+ SLOT(switchToNextTabWidget()), actionCollection(), "switch_to_next_tabwidget" );
+
+ m_splitHor = new KAction(i18n("Split &Horizontal"), CTRL+SHIFT+Key_T,
+ this, SLOT(slotSplitHorizontalBase()), actionCollection(), "split_h");
+ m_splitHor->setIcon("view_top_bottom");
+
+ m_splitVer = new KAction(i18n("Split &Vertical"), CTRL+SHIFT+Key_L,
+ this, SLOT(slotSplitVerticalBase()), actionCollection(), "split_v");
+ m_splitVer->setIcon("view_left_right");
+
+ m_splitHor1 = new KAction(i18n("Split &Horizontal"), 0,
+ this, SLOT(slotSplitHorizontal()), actionCollection(), "split_h1");
+ m_splitHor1->setIcon("view_top_bottom");
+
+ m_splitVer1 = new KAction(i18n("Split &Vertical"), 0,
+ this, SLOT(slotSplitVertical()), actionCollection(), "split_v1");
+ m_splitVer1->setIcon("view_left_right");
+
+ m_splitHor2 = new KAction(i18n("Split &Horizontal and Open"), 0,
+ this, SLOT(slotSplitHorizontal()), actionCollection(), "split_h2");
+ m_splitHor2->setIcon("view_top_bottom");
+
+ m_splitVer2 = new KAction(i18n("Split &Vertical and Open"), 0,
+ this, SLOT(slotSplitVertical()), actionCollection(), "split_v2");
+ m_splitVer2->setIcon("view_left_right");
+
+ m_raiseLeftDock = new KAction(i18n("Switch Left Dock"), CTRL+SHIFT+ALT+Key_L,
+ this, SLOT(raiseLeftDock()), actionCollection(), "switch_left_dock");
+
+ m_raiseRightDock = new KAction(i18n("Switch Right Dock"), CTRL+SHIFT+ALT+Key_R,
+ this, SLOT(raiseRightDock()), actionCollection(), "switch_right_dock");
+
+ m_raiseBottomDock = new KAction(i18n("Switch Bottom Dock"), CTRL+SHIFT+ALT+Key_B,
+ this, SLOT(raiseBottomDock()), actionCollection(), "switch_bottom_dock");
+
+ KStdAction::configureToolbars(this, SLOT(configureToolbars()),
+ actionCollection(), "set_configure_toolbars");
+
+ m_mainWindowShare->createActions();
+
+ connect(m_mainWindowShare, SIGNAL(gotoNextWindow()), this, SLOT(gotoNextWindow()));
+ connect(m_mainWindowShare, SIGNAL(gotoPreviousWindow()), this, SLOT(gotoPreviousWindow()));
+ connect(m_mainWindowShare, SIGNAL(gotoFirstWindow()), this, SLOT(gotoFirstWindow()));
+ connect(m_mainWindowShare, SIGNAL(gotoLastWindow()), this, SLOT(gotoLastWindow()));
+}
+
+void SimpleMainWindow::raiseEditor()
+{
+ kdDebug() << "SimpleMainWindow::raiseEditor" << endl;
+ KDevPartController *partcontroller = API::getInstance()->partController();
+ if (partcontroller->activePart() && partcontroller->activePart()->widget())
+ partcontroller->activePart()->widget()->setFocus();
+}
+
+void SimpleMainWindow::gotoNextWindow()
+{
+ if (m_bottomDock->isActive())
+ m_bottomDock->selectNextWidget();
+ else if (m_rightDock->isActive())
+ m_rightDock->selectNextWidget();
+ else if (m_leftDock->isActive())
+ m_leftDock->selectNextWidget();
+ else
+ {
+ if ((m_activeTabWidget->currentPageIndex() + 1) < m_activeTabWidget->count())
+ m_activeTabWidget->setCurrentPage(m_activeTabWidget->currentPageIndex() + 1);
+ else
+ m_activeTabWidget->setCurrentPage(0);
+ }
+}
+
+void SimpleMainWindow::gotoPreviousWindow()
+{
+ if (m_bottomDock->isActive())
+ m_bottomDock->selectPrevWidget();
+ else if (m_rightDock->isActive())
+ m_rightDock->selectPrevWidget();
+ else if (m_leftDock->isActive())
+ m_leftDock->selectPrevWidget();
+ else
+ {
+ if ((m_activeTabWidget->currentPageIndex() - 1) >= 0)
+ m_activeTabWidget->setCurrentPage(m_activeTabWidget->currentPageIndex() - 1);
+ else
+ m_activeTabWidget->setCurrentPage(m_activeTabWidget->count() - 1);
+ }
+}
+
+void SimpleMainWindow::gotoFirstWindow()
+{
+ //@TODO: Implement me
+}
+
+void SimpleMainWindow::gotoLastWindow()
+{
+ //@TODO: implement me
+}
+
+void SimpleMainWindow::slotCoreInitialized()
+{
+ menuBar()->setEnabled(true);
+}
+
+void SimpleMainWindow::projectOpened()
+{
+ setCaption(QString::null);
+}
+
+void SimpleMainWindow::slotPartURLChanged(KParts::ReadOnlyPart *part)
+{
+ if (QWidget *widget = EditorProxy::getInstance()->topWidgetForPart(part))
+ {
+ kdDebug() << "new caption for widget: " << part->url().fileName() << endl;
+ widget->setCaption(part->url().fileName());
+ }
+ //do smth with caption: ro_part->url().fileName()
+}
+
+void SimpleMainWindow::documentChangedState(const KURL &url, DocumentState state)
+{
+ QWidget * widget = EditorProxy::getInstance()->topWidgetForPart(
+ PartController::getInstance()->partForURL(url));
+ kdDebug() << "SimpleMainWindow::documentChangedState: " << widget << endl;
+ if (widget)
+ {
+ //calculate the icon size if showTabIcons is false
+ //this is necessary to avoid tab resizing by setIcon() call
+ int isize = 16;
+ if (m_activeTabWidget && !m_showIconsOnTabs)
+ {
+ isize = m_activeTabWidget->fontMetrics().height() - 1;
+ isize = isize > 16 ? 16 : isize;
+ }
+ switch (state)
+ {
+ // we should probably restore the original icon instead of just using "kdevelop",
+ // but I have never seen any other icon in use so this should do for now
+ case Clean:
+ if (m_showIconsOnTabs)
+ widget->setIcon(SmallIcon("kdevelop", isize));
+ else
+ widget->setIcon(QPixmap());
+ break;
+ case Modified:
+ widget->setIcon(SmallIcon("filesave", isize));
+ break;
+ case Dirty:
+ widget->setIcon(SmallIcon("revert", isize));
+ break;
+ case DirtyAndModified:
+ widget->setIcon(SmallIcon("stop", isize));
+ break;
+ }
+ }
+ setCaption(url.url());
+}
+
+void SimpleMainWindow::closeTab()
+{
+// actionCollection()->action("file_close")->activate();
+ if (sender()->isA("QToolButton") && sender()->parent()->isA("DTabWidget"))
+ {
+ DTabWidget *tab = (DTabWidget*)sender()->parent();
+ if (tab && tab->currentPage())
+ closeTab(tab->currentPage());
+ }
+}
+
+void SimpleMainWindow::tabContext(QWidget *w, const QPoint &p)
+{
+ DTabWidget *tabWidget = static_cast<DTabWidget*>(const_cast<QObject*>(sender()));
+ if (!tabWidget)
+ return;
+
+ KPopupMenu tabMenu;
+ tabMenu.insertTitle(tabWidget->tabLabel(w));
+
+ //Find the document on whose tab the user clicked
+ m_currentTabURL = QString::null;
+ QPtrListIterator<KParts::Part> it(*PartController::getInstance()->parts());
+ while (KParts::Part* part = it.current())
+ {
+ QWidget *top_widget = EditorProxy::getInstance()->topWidgetForPart(part);
+ if (top_widget == w)
+ {
+ if (KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(part))
+ {
+ m_currentTabURL = ro_part->url();
+ tabMenu.insertItem(i18n("Close"), 0);
+
+ if (PartController::getInstance()->parts()->count() > 1)
+ tabMenu.insertItem(i18n("Close All Others"), 4);
+
+ if( KParts::ReadWritePart * rw_part = dynamic_cast<KParts::ReadWritePart*>( ro_part ) )
+ {
+ if( rw_part->isModified() ) tabMenu.insertItem( i18n("Save"),1);
+ tabMenu.insertItem( i18n("Reload"),2);
+ }
+
+ if (dynamic_cast<HTMLDocumentationPart*>(ro_part))
+ {
+ tabMenu.insertItem(i18n("Duplicate"), 3);
+ break;
+ }
+
+ //Create the file context
+ KURL::List list;
+ list << m_currentTabURL;
+ FileContext context( list );
+ Core::getInstance()->fillContextMenu(&tabMenu, &context);
+ }
+ break;
+ }
+ ++it;
+ }
+
+ connect(&tabMenu, SIGNAL(activated(int)), this, SLOT(tabContextActivated(int)));
+ tabMenu.exec(p);
+}
+
+void SimpleMainWindow::tabContextActivated(int id)
+{
+ if(m_currentTabURL.isEmpty())
+ return;
+
+ switch(id)
+ {
+ case 0:
+ PartController::getInstance()->closeFile(m_currentTabURL);
+ break;
+ case 1:
+ PartController::getInstance()->saveFile(m_currentTabURL);
+ break;
+ case 2:
+ PartController::getInstance()->reloadFile(m_currentTabURL);
+ break;
+ case 3:
+ PartController::getInstance()->showDocument(m_currentTabURL, true);
+ break;
+ case 4:
+ PartController::getInstance()->closeAllOthers(m_currentTabURL);
+ break;
+ default:
+ break;
+ }
+}
+
+void SimpleMainWindow::configureToolbars()
+{
+ saveMainWindowSettings(KGlobal::config(), "SimpleMainWindow");
+ KEditToolbar dlg(factory());
+ connect(&dlg, SIGNAL(newToolbarConfig()), this, SLOT(slotNewToolbarConfig()));
+ dlg.exec();
+}
+
+void SimpleMainWindow::slotNewToolbarConfig()
+{
+// setupWindowMenu();
+ m_mainWindowShare->slotGUICreated(PartController::getInstance()->activePart());
+ applyMainWindowSettings(KGlobal::config(), "SimpleMainWindow");
+}
+
+bool SimpleMainWindow::queryClose()
+{
+ saveSettings();
+ return Core::getInstance()->queryClose();
+}
+
+bool SimpleMainWindow::queryExit()
+{
+ return true;
+}
+
+void SimpleMainWindow::setupWindowMenu()
+{
+ // get the xmlgui created one instead
+ m_windowMenu = static_cast<QPopupMenu*>(main()->child("window", "KPopupMenu"));
+
+ if (!m_windowMenu)
+ {
+ kdDebug(9000) << "Couldn't find the XMLGUI window menu. Creating new." << endl;
+
+ m_windowMenu = new QPopupMenu(main(), "window");
+ menuBar()->insertItem(i18n("&Window"), m_windowMenu);
+ }
+
+ actionCollection()->action("file_close")->plug(m_windowMenu);
+ actionCollection()->action("file_close_all")->plug(m_windowMenu);
+ actionCollection()->action("file_closeother")->plug(m_windowMenu);
+
+ QObject::connect(m_windowMenu, SIGNAL(activated(int)), this, SLOT(openURL(int)));
+ QObject::connect(m_windowMenu, SIGNAL(aboutToShow()), this, SLOT(fillWindowMenu()));
+}
+
+void SimpleMainWindow::openURL(int w)
+{
+ QValueList<QPair<int, KURL> >::ConstIterator it = m_windowList.begin();
+ while (it != m_windowList.end())
+ {
+ if ((*it).first == w)
+ {
+ KURL url((*it).second);
+ if (!url.isEmpty())
+ {
+ PartController::getInstance()->editDocument(url);
+ return;
+ }
+ }
+ ++it;
+ }
+}
+
+void SimpleMainWindow::fillWindowMenu()
+{
+ // clear menu
+ QValueList< QPair< int, KURL > >::ConstIterator it = m_windowList.begin();
+ while (it != m_windowList.end())
+ {
+ m_windowMenu->removeItem( (*it).first );
+ ++it;
+ }
+
+ int temp = 0;
+
+ QMap<QString, KURL> map;
+ QStringList string_list;
+ KURL::List list = PartController::getInstance()->openURLs();
+ KURL::List::Iterator itt = list.begin();
+ while (itt != list.end())
+ {
+ map[(*itt).fileName()] = *itt;
+ string_list.append((*itt).fileName());
+ ++itt;
+ }
+ string_list.sort();
+
+ list.clear();
+ for(uint i = 0; i != string_list.size(); ++i)
+ list.append(map[string_list[i]]);
+
+ itt = list.begin();
+ int i = 0;
+
+ if (list.count() > 0)
+ m_windowList << qMakePair(m_windowMenu->insertSeparator(), KURL());
+
+ while (itt != list.end())
+ {
+ temp = m_windowMenu->insertItem( i < 10 ? QString("&%1 %2").arg(i).arg((*itt).fileName()) : (*itt).fileName() );
+ m_windowList << qMakePair(temp, *itt);
+ ++i;
+ ++itt;
+ }
+}
+
+void SimpleMainWindow::slotSplitVertical()
+{
+ DTabWidget *tab = splitVertical();
+ openDocumentsAfterSplit(tab);
+}
+
+void SimpleMainWindow::slotSplitHorizontal()
+{
+ DTabWidget *tab = splitHorizontal();
+ openDocumentsAfterSplit(tab);
+}
+
+void SimpleMainWindow::slotSplitVerticalBase()
+{
+ if (KParts::ReadOnlyPart *ro_part = activePartForSplitting())
+ {
+ m_splitURLs << ro_part->url();
+ slotSplitVertical();
+ }
+}
+
+KParts::ReadOnlyPart *SimpleMainWindow::activePartForSplitting()
+{
+ if (PartController::getInstance()->openURLs().count() < 2)
+ return 0;
+ m_splitURLs.clear();
+ KParts::ReadOnlyPart *ro_part =
+ dynamic_cast<KParts::ReadOnlyPart*>(PartController::getInstance()->activePart());
+ return ro_part;
+}
+
+void SimpleMainWindow::slotSplitHorizontalBase()
+{
+ if (KParts::ReadOnlyPart *ro_part = activePartForSplitting())
+ {
+ m_splitURLs << ro_part->url();
+ slotSplitHorizontal();
+ }
+}
+
+void SimpleMainWindow::openDocumentsAfterSplit(DTabWidget *tab)
+{
+ if (m_splitURLs.count() > 0)
+ {
+ for (KURL::List::const_iterator it = m_splitURLs.begin(); it != m_splitURLs.end(); ++it)
+ {
+ KParts::ReadOnlyPart *part = PartController::getInstance()->partForURL(*it);
+ if (!part)
+ PartController::getInstance()->editDocument(*it);
+ else
+ {
+ PartController::getInstance()->activatePart( part );
+ QWidget *inTab = widgetForURL(*it);
+ if (inTab)
+ {
+ DTabWidget *oldTab = m_widgetTabs[inTab];
+ QString title = oldTab->tabLabel(inTab);
+ removeWidget(inTab);
+ addWidget(tab, inTab, title);
+ }
+ }
+ }
+ m_splitURLs.clear();
+ }
+}
+
+QWidget *SimpleMainWindow::widgetForURL(KURL url)
+{
+ KParts::ReadOnlyPart *part = PartController::getInstance()->partForURL(url);
+ return widgetInTab( part ? part->widget() : 0 );
+}
+
+QWidget *SimpleMainWindow::widgetInTab(QWidget *w)
+{
+ QWidget *inTab = 0;
+ if (w && w->parent() && w->parent()->isA("EditorProxy"))
+ inTab = (QWidget*)w->parent();
+ else if (w && w->parent() && w->parent()->isA("MultiBuffer")
+ && w->parent()->parent() && w->parent()->parent()->isA("EditorProxy"))
+ inTab = (QWidget*)w->parent()->parent();
+ else if (w && w->parent() && w->parent()->isA("MultiBuffer"))
+ inTab = (QWidget*)w->parent();
+ else
+ inTab = w;
+ return inTab;
+}
+
+void SimpleMainWindow::closeTab(QWidget *w)
+{
+ const QPtrList<KParts::Part> *partlist = PartController::getInstance()->parts();
+ QPtrListIterator<KParts::Part> it(*partlist);
+ while (KParts::Part* part = it.current())
+ {
+ QWidget *widget = EditorProxy::getInstance()->topWidgetForPart(part);
+ if (widget && widget == w)
+ {
+ // weirdness beyond weirdness.. sometimes the active view is an embedded splitter with two files
+ // so we check if the widget is a multibuffer, in which case we let it decide what part to close
+ if (MultiBuffer * mb = dynamic_cast<MultiBuffer*>( widget ) )
+ {
+ PartController::getInstance()->closePart( mb->activeBuffer() );
+ }
+ else
+ {
+ PartController::getInstance()->closePart(part);
+ }
+ return;
+ }
+ ++it;
+ }
+}
+
+void SimpleMainWindow::activePartChanged(KParts::Part *part)
+{
+ if (!part)
+ return;
+ QWidget *w = part->widget();
+ kdDebug() << "active part widget is : " << w << endl;
+ QWidget *inTab = widgetInTab(w);
+ if (m_widgetTabs[inTab] != 0)
+ {
+ kdDebug() << " setting m_activeTabWidget " << endl;
+ m_activeTabWidget = m_widgetTabs[inTab];
+ }
+}
+
+void SimpleMainWindow::createGUI(KParts::Part *part) {
+ if ( !part )
+ setCaption( QString::null );
+ DMainWindow::createGUI(part);
+
+ m_mainWindowShare->slotGUICreated( part );
+}
+
+void SimpleMainWindow::raiseBottomDock()
+{
+ raiseDock(m_bottomDock);
+}
+
+void SimpleMainWindow::raiseLeftDock()
+{
+ raiseDock(m_leftDock);
+}
+
+void SimpleMainWindow::raiseRightDock()
+{
+ raiseDock(m_rightDock);
+}
+
+void SimpleMainWindow::raiseDock(DDockWindow *dock)
+{
+ dock->selectLastWidget();
+}
+
+void SimpleMainWindow::lowerAllDocks()
+{
+ m_bottomDock->lowerWidget( m_bottomDock->currentWidget() );
+ m_leftDock->lowerWidget( m_leftDock->currentWidget() );
+ m_rightDock->lowerWidget( m_rightDock->currentWidget() );
+}
+
+void SimpleMainWindow::switchToNextTabWidget()
+{
+ QValueList<DTabWidget*> tabWidgets = m_widgetTabs.values();
+
+ if ( tabWidgets.count() < 2 ) return;
+
+ QValueList<DTabWidget*> reduced;
+ QValueList<DTabWidget*>::iterator it = tabWidgets.begin();
+ while ( it != tabWidgets.end() )
+ {
+ if ( !reduced.contains( *it ) )
+ {
+ reduced << *it;
+ }
+ ++it;
+ }
+
+ it = reduced.begin();
+ while ( it != reduced.end() )
+ {
+ if ( *it == m_activeTabWidget )
+ {
+ if ( ++it != reduced.end() )
+ {
+ if ( (*it)->currentPage() )
+ (*it)->currentPage()->setFocus();
+ }
+ else
+ {
+ if ( (*reduced.begin())->currentPage() )
+ (*reduced.begin())->currentPage()->setFocus();
+ }
+ return;
+ }
+ ++it;
+ }
+}
+
+void SimpleMainWindow::setCaption(const QString &caption)
+{
+ kdDebug(9000) << k_funcinfo << endl;
+
+ bool modified = false;
+ if ( !caption.isEmpty() )
+ {
+ KURL url( caption );
+ DocumentState const state = PartController::getInstance()->documentState( url );
+ modified = ( state == Modified || state == DirtyAndModified );
+ }
+
+ KDevProject *project = API::getInstance()->project();
+ if (project)
+ {
+ QString projectname = project->projectName();
+
+ QString suffix(".kdevelop");
+ if (projectname.endsWith(suffix))
+ projectname.truncate(projectname.length() - suffix.length());
+
+ if (!caption.isEmpty())
+ DMainWindow::setCaption(projectname + " - " + caption, modified);
+ else
+ DMainWindow::setCaption(projectname, modified);
+ }
+ else
+ DMainWindow::setCaption(caption, modified);
+}
+
+void SimpleMainWindow::projectClosed()
+{
+ DMainWindow::setCaption(QString::null);
+}
+
+#include "simplemainwindow.moc"
+
+// kate: space-indent on; indent-width 4; tab-width 4; replace-tabs on