• Skip to content
  • Skip to link menu
KDE 3.5 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

kate

kateviewmanager.cpp

Go to the documentation of this file.
00001 /* This file is part of the KDE project
00002    Copyright (C) 2001 Christoph Cullmann <cullmann@kde.org>
00003    Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
00004    Copyright (C) 2001 Anders Lund <anders.lund@lund.tdcadsl.dk>
00005 
00006    This library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Library General Public
00008    License version 2 as published by the Free Software Foundation.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018    Boston, MA 02110-1301, USA.
00019 */
00020 
00021 //BEGIN Includes
00022 #include "kateviewmanager.h"
00023 #include "kateviewmanager.moc"
00024 
00025 #include "katemainwindow.h"
00026 #include "katedocmanager.h"
00027 #include "kateviewspacecontainer.h"
00028 #include "katetabwidget.h"
00029 
00030 #include <dcopclient.h>
00031 #include <kaction.h>
00032 #include <kcmdlineargs.h>
00033 #include <kdebug.h>
00034 #include <kdiroperator.h>
00035 #include <kdockwidget.h>
00036 #include <kencodingfiledialog.h>
00037 #include <kiconloader.h>
00038 #include <kglobal.h>
00039 #include <klocale.h>
00040 #include <ktoolbar.h>
00041 #include <kmessagebox.h>
00042 #include <ksimpleconfig.h>
00043 #include <kstdaction.h>
00044 #include <kstandarddirs.h>
00045 #include <kglobalsettings.h>
00046 #include <kstdaccel.h>
00047 
00048 #include <ktexteditor/encodinginterface.h>
00049 
00050 #include <qobjectlist.h>
00051 #include <qstringlist.h>
00052 #include <qfileinfo.h>
00053 #include <qtoolbutton.h>
00054 #include <qtooltip.h>
00055 //END Includes
00056 
00057 KateViewManager::KateViewManager (KateMainWindow *parent)
00058  : QObject  (parent),
00059   showFullPath(false), m_mainWindow(parent)
00060 {
00061   // while init
00062   m_init=true;
00063 
00064   // some stuff for the tabwidget
00065   m_mainWindow->tabWidget()->setTabReorderingEnabled( true );
00066 
00067   // important, set them up, as we use them in other methodes
00068   setupActions ();
00069 
00070   guiMergedView=0;
00071 
00072   m_viewManager = new Kate::ViewManager (this);
00073   m_currentContainer=0;
00074  connect(m_mainWindow->tabWidget(),SIGNAL(currentChanged(QWidget*)),this,SLOT(tabChanged(QWidget*)));
00075  slotNewTab();
00076  tabChanged(m_mainWindow->tabWidget()->currentPage());
00077 
00078   // no memleaks
00079   m_viewSpaceContainerList.setAutoDelete(true);
00080 
00081   // init done
00082   m_init=false;
00083 }
00084 
00085 KateViewManager::~KateViewManager ()
00086 {
00087   m_viewSpaceContainerList.setAutoDelete(false);
00088 }
00089 
00090 void KateViewManager::setupActions ()
00091 {
00092   KAction *a;
00093 
00097   a=new KAction ( i18n("New Tab"),"tab_new", 0, this, SLOT(slotNewTab()),
00098                   m_mainWindow->actionCollection(), "view_new_tab" );
00099 
00100   m_closeTab = new KAction ( i18n("Close Current Tab"),"tab_remove",0,this,SLOT(slotCloseTab()),
00101                              m_mainWindow->actionCollection(),"view_close_tab");
00102 
00103   m_activateNextTab
00104       = new KAction( i18n( "Activate Next Tab" ),
00105                      QApplication::reverseLayout() ? KStdAccel::tabPrev() : KStdAccel::tabNext(),
00106                      this, SLOT( activateNextTab() ), m_mainWindow->actionCollection(), "view_next_tab" );
00107 
00108   m_activatePrevTab
00109       = new KAction( i18n( "Activate Previous Tab" ),
00110                      QApplication::reverseLayout() ? KStdAccel::tabNext() : KStdAccel::tabPrev(),
00111                      this, SLOT( activatePrevTab() ), m_mainWindow->actionCollection(), "view_prev_tab" );
00112 
00116   a=new KAction ( i18n("Split Ve&rtical"), "view_right", CTRL+SHIFT+Key_L, this, SLOT(
00117                   slotSplitViewSpaceVert() ), m_mainWindow->actionCollection(), "view_split_vert");
00118 
00119   a->setWhatsThis(i18n("Split the currently active view vertically into two views."));
00120 
00121   a=new KAction ( i18n("Split &Horizontal"), "view_bottom", CTRL+SHIFT+Key_T, this, SLOT(
00122                   slotSplitViewSpaceHoriz() ), m_mainWindow->actionCollection(), "view_split_horiz");
00123 
00124   a->setWhatsThis(i18n("Split the currently active view horizontally into two views."));
00125 
00126   m_closeView = new KAction ( i18n("Cl&ose Current View"), "view_remove", CTRL+SHIFT+Key_R, this,
00127                     SLOT( slotCloseCurrentViewSpace() ), m_mainWindow->actionCollection(),
00128                     "view_close_current_space" );
00129 
00130   m_closeView->setWhatsThis(i18n("Close the currently active splitted view"));
00131 
00132   goNext=new KAction(i18n("Next View"),Key_F8,this,
00133                      SLOT(activateNextView()),m_mainWindow->actionCollection(),"go_next");
00134 
00135   goNext->setWhatsThis(i18n("Make the next split view the active one."));
00136 
00137   goPrev=new KAction(i18n("Previous View"),SHIFT+Key_F8, this, SLOT(activatePrevView()),m_mainWindow->actionCollection(),"go_prev");
00138 
00139   goPrev->setWhatsThis(i18n("Make the previous split view the active one."));
00140 
00144   QToolButton *b = new QToolButton( m_mainWindow->tabWidget() );
00145   connect( b, SIGNAL( clicked() ),
00146              this, SLOT( slotNewTab() ) );
00147   b->setIconSet( SmallIcon( "tab_new" ) );
00148   b->adjustSize();
00149   QToolTip::add(b, i18n("Open a new tab"));
00150   m_mainWindow->tabWidget()->setCornerWidget( b, TopLeft );
00151 
00152   b = m_closeTabButton = new QToolButton( m_mainWindow->tabWidget() );
00153   connect( b, SIGNAL( clicked() ),
00154             this, SLOT( slotCloseTab() ) );
00155   b->setIconSet( SmallIcon( "tab_remove" ) );
00156   b->adjustSize();
00157   QToolTip::add(b, i18n("Close the current tab"));
00158   m_mainWindow->tabWidget()->setCornerWidget( b, TopRight );
00159 }
00160 
00161 void KateViewManager::updateViewSpaceActions ()
00162 {
00163   if (!m_currentContainer) return;
00164 
00165   m_closeView->setEnabled (m_currentContainer->viewSpaceCount() > 1);
00166   goNext->setEnabled (m_currentContainer->viewSpaceCount() > 1);
00167   goPrev->setEnabled (m_currentContainer->viewSpaceCount() > 1);
00168 }
00169 
00170 void KateViewManager::tabChanged(QWidget* widget) {
00171   KateViewSpaceContainer *container=static_cast<KateViewSpaceContainer*>(widget->qt_cast("KateViewSpaceContainer"));
00172   Q_ASSERT(container);
00173   m_currentContainer=container;
00174 
00175   if (container) {
00176     container->reactivateActiveView();
00177 
00178   }
00179 
00180   m_closeTab->setEnabled(m_mainWindow->tabWidget()->count() > 1);
00181   m_activateNextTab->setEnabled(m_mainWindow->tabWidget()->count() > 1);
00182   m_activatePrevTab->setEnabled(m_mainWindow->tabWidget()->count() > 1);
00183   m_closeTabButton->setEnabled (m_mainWindow->tabWidget()->count() > 1);
00184 
00185   updateViewSpaceActions ();
00186 }
00187 
00188 void KateViewManager::slotNewTab()
00189 {
00190   uint documentNumber=0;
00191 
00192   if (m_currentContainer)
00193   {
00194     if (m_currentContainer->activeView())
00195       documentNumber = m_currentContainer->activeView()->getDoc()->documentNumber();
00196   }
00197 
00198   KateViewSpaceContainer *container=new KateViewSpaceContainer (m_mainWindow->tabWidget(), this);
00199   m_viewSpaceContainerList.append(container);
00200   m_mainWindow->tabWidget()->addTab (container, "");
00201 
00202   connect(container,SIGNAL(viewChanged()),this,SIGNAL(viewChanged()));
00203   connect(container,SIGNAL(viewChanged()),m_viewManager,SIGNAL(viewChanged()));
00204 
00205   if (!m_init)
00206   {
00207     container->activateView(documentNumber);
00208     container->setShowFullPath(showFullPath);
00209     m_mainWindow->slotWindowActivated ();
00210   }
00211 }
00212 
00213 void KateViewManager::slotCloseTab()
00214 {
00215   if (m_viewSpaceContainerList.count() <= 1) return;
00216   if (!m_currentContainer) return;
00217 
00218   int pos = m_viewSpaceContainerList.find (m_currentContainer);
00219 
00220   if (pos == -1)
00221     return;
00222 
00223   if (guiMergedView)
00224     m_mainWindow->guiFactory()->removeClient (guiMergedView );
00225 
00226   m_viewSpaceContainerList.remove (pos);
00227 
00228   if ((uint)pos >= m_viewSpaceContainerList.count())
00229     pos = m_viewSpaceContainerList.count()-1;
00230 
00231   tabChanged(m_viewSpaceContainerList.at (pos));
00232 }
00233 
00234 void KateViewManager::activateNextTab()
00235 {
00236   if( m_mainWindow->tabWidget()->count() <= 1 ) return;
00237 
00238   int iTab = m_mainWindow->tabWidget()->currentPageIndex();
00239 
00240   iTab++;
00241 
00242   if( iTab == m_mainWindow->tabWidget()->count() )
00243     iTab = 0;
00244 
00245   m_mainWindow->tabWidget()->setCurrentPage( iTab );
00246 }
00247 
00248 void KateViewManager::activatePrevTab()
00249 {
00250   if( m_mainWindow->tabWidget()->count() <= 1 ) return;
00251 
00252   int iTab = m_mainWindow->tabWidget()->currentPageIndex();
00253 
00254   iTab--;
00255 
00256   if( iTab == -1 )
00257     iTab = m_mainWindow->tabWidget()->count() - 1;
00258 
00259   m_mainWindow->tabWidget()->setCurrentPage( iTab );
00260 }
00261 
00262 void KateViewManager::activateSpace (Kate::View* v)
00263 {
00264   if (m_currentContainer) {
00265     m_currentContainer->activateSpace(v);
00266   }
00267 }
00268 
00269 void KateViewManager::activateView ( Kate::View *view ) {
00270   if (m_currentContainer) {
00271     m_currentContainer->activateView(view);
00272   }
00273 }
00274 
00275 KateViewSpace* KateViewManager::activeViewSpace ()
00276 {
00277   if (m_currentContainer) {
00278     return m_currentContainer->activeViewSpace();
00279   }
00280   return 0L;
00281 }
00282 
00283 Kate::View* KateViewManager::activeView ()
00284 {
00285   if (m_currentContainer) {
00286     return m_currentContainer->activeView();
00287   }
00288   return 0L;
00289 }
00290 
00291 void KateViewManager::setActiveSpace ( KateViewSpace* vs )
00292 {
00293   if (m_currentContainer) {
00294     m_currentContainer->setActiveSpace(vs);
00295   }
00296 
00297 }
00298 
00299 void KateViewManager::setActiveView ( Kate::View* view )
00300 {
00301   if (m_currentContainer) {
00302     m_currentContainer->setActiveView(view);
00303   }
00304 
00305 }
00306 
00307 
00308 void KateViewManager::activateView( uint documentNumber )
00309 {
00310   if (m_currentContainer) {
00311      m_currentContainer->activateView(documentNumber);
00312   }
00313 }
00314 
00315 uint KateViewManager::viewCount ()
00316 {
00317   uint viewCount=0;
00318   for (uint i=0;i<m_viewSpaceContainerList.count();i++) {
00319     viewCount+=m_viewSpaceContainerList.at(i)->viewCount();
00320   }
00321   return viewCount;
00322 
00323 }
00324 
00325 uint KateViewManager::viewSpaceCount ()
00326 {
00327   uint viewSpaceCount=0;
00328   for (uint i=0;i<m_viewSpaceContainerList.count();i++) {
00329     viewSpaceCount+=m_viewSpaceContainerList.at(i)->viewSpaceCount();
00330   }
00331   return viewSpaceCount;
00332 }
00333 
00334 void KateViewManager::setViewActivationBlocked (bool block)
00335 {
00336   for (uint i=0;i<m_viewSpaceContainerList.count();i++)
00337     m_viewSpaceContainerList.at(i)->m_blockViewCreationAndActivation=block;
00338 }
00339 
00340 void KateViewManager::activateNextView()
00341 {
00342   if (m_currentContainer) {
00343     m_currentContainer->activateNextView();
00344   }
00345 }
00346 
00347 void KateViewManager::activatePrevView()
00348 {
00349   if (m_currentContainer) {
00350     m_currentContainer->activatePrevView();
00351   }
00352 }
00353 
00354 void KateViewManager::closeViews(uint documentNumber)
00355 {
00356   for (uint i=0;i<m_viewSpaceContainerList.count();i++) {
00357     m_viewSpaceContainerList.at(i)->closeViews(documentNumber);
00358   }
00359   tabChanged(m_currentContainer);
00360 }
00361 
00362 void KateViewManager::slotDocumentNew ()
00363 {
00364   if (m_currentContainer) m_currentContainer->createView ();
00365 }
00366 
00367 void KateViewManager::slotDocumentOpen ()
00368 {
00369   Kate::View *cv = activeView();
00370 
00371   if (cv) {
00372     KEncodingFileDialog::Result r=KEncodingFileDialog::getOpenURLsAndEncoding(
00373       (cv ? KTextEditor::encodingInterface(cv->document())->encoding() : Kate::Document::defaultEncoding()),
00374        (cv ? cv->document()->url().url() : QString::null),
00375        QString::null,m_mainWindow,i18n("Open File"));
00376 
00377     uint lastID = 0;
00378     for (KURL::List::Iterator i=r.URLs.begin(); i != r.URLs.end(); ++i)
00379       lastID = openURL( *i, r.encoding, false );
00380 
00381     if (lastID > 0)
00382       activateView (lastID);
00383   }
00384 }
00385 
00386 void KateViewManager::slotDocumentClose ()
00387 {
00388   // no active view, do nothing
00389   if (!activeView()) return;
00390 
00391   // prevent close document if only one view alive and the document of
00392   // it is not modified and empty !!!
00393   if ( (KateDocManager::self()->documents() == 1)
00394        && !activeView()->getDoc()->isModified()
00395        && activeView()->getDoc()->url().isEmpty()
00396        && (activeView()->getDoc()->length() == 0) )
00397   {
00398     activeView()->getDoc()->closeURL();
00399     return;
00400   }
00401 
00402   // close document
00403   KateDocManager::self()->closeDocument (activeView()->getDoc());
00404 }
00405 
00406 uint KateViewManager::openURL (const KURL &url, const QString& encoding, bool activate, bool isTempFile )
00407 {
00408   uint id = 0;
00409   Kate::Document *doc = KateDocManager::self()->openURL (url, encoding, &id, isTempFile );
00410 
00411   if (!doc->url().isEmpty())
00412     m_mainWindow->fileOpenRecent->addURL( doc->url() );
00413 
00414   if (activate)
00415     activateView( id );
00416 
00417   return id;
00418 }
00419 
00420 void KateViewManager::openURL (const KURL &url)
00421 {
00422   openURL (url, QString::null);
00423 }
00424 
00425 void KateViewManager::removeViewSpace (KateViewSpace *viewspace)
00426 {
00427   if (m_currentContainer) {
00428     m_currentContainer->removeViewSpace(viewspace);
00429   }
00430 }
00431 
00432 void KateViewManager::slotCloseCurrentViewSpace()
00433 {
00434   if (m_currentContainer) {
00435     m_currentContainer->slotCloseCurrentViewSpace();
00436   }
00437 }
00438 
00439 void KateViewManager::slotSplitViewSpaceVert()
00440 {
00441   if (m_currentContainer) {
00442     m_currentContainer->slotSplitViewSpaceVert();
00443   }
00444 }
00445 
00446 void KateViewManager::slotSplitViewSpaceHoriz()
00447 {
00448   if (m_currentContainer) {
00449     m_currentContainer->slotSplitViewSpaceHoriz();
00450   }
00451 }
00452 
00453 void KateViewManager::setShowFullPath( bool enable )
00454 {
00455   showFullPath=enable;
00456   for (uint i=0;i<m_viewSpaceContainerList.count();i++) {
00457     m_viewSpaceContainerList.at(i)->setShowFullPath(enable);
00458   }
00459   m_mainWindow->slotWindowActivated ();
00460  }
00461 
00465 // FIXME 3.0 - make those config goups more streamlined: "objN:objN..."
00466 void KateViewManager::saveViewConfiguration(KConfig *config,const QString& grp)
00467 {
00468   // Use the same group name for view configuration as usual for sessions.
00469   // (When called by session manager grp is a 1-based index for the main window)
00470   QString group = grp;
00471   bool ok = false;
00472   int n = group.toInt( &ok );
00473   if ( ok )
00474     group = QString( "MainWindow%1" ).arg( n-1 );
00475 
00476   config->setGroup(group);
00477   config->writeEntry("ViewSpaceContainers",m_viewSpaceContainerList.count());
00478   config->writeEntry("Active ViewSpaceContainer", m_mainWindow->tabWidget()->currentPageIndex());
00479   for (uint i=0;i<m_viewSpaceContainerList.count();i++) {
00480     m_viewSpaceContainerList.at(i)->saveViewConfiguration(config,group+QString(":ViewSpaceContainer-%1:").arg(i));
00481   }
00482 }
00483 
00484 void KateViewManager::restoreViewConfiguration (KConfig *config, const QString& grp)
00485 {
00486   // Use the same group name for view configuration as usual for sessions.
00487   // (When called by session manager grp is a 1-based index for the main window)
00488   QString group = grp;
00489   bool ok = false;
00490   int n = group.toInt( &ok );
00491   if ( ok )
00492     group = QString( "MainWindow%1" ).arg( n-1 );
00493 
00494   config->setGroup(group);
00495   uint tabCount=config->readNumEntry("ViewSpaceContainers",0);
00496   int activeOne=config->readNumEntry("Active ViewSpaceContainer",0);
00497   if (tabCount==0) return;
00498   m_viewSpaceContainerList.at(0)->restoreViewConfiguration(config,group+QString(":ViewSpaceContainer-0:"));
00499   for (uint i=1;i<tabCount;i++) {
00500     slotNewTab();
00501     m_viewSpaceContainerList.at(i)->restoreViewConfiguration(config,group+QString(":ViewSpaceContainer-%1:").arg(i));
00502   }
00503 
00504   if (activeOne != m_mainWindow->tabWidget()->currentPageIndex())
00505     m_mainWindow->tabWidget()->setCurrentPage (activeOne);
00506 
00507   updateViewSpaceActions();
00508 }
00509 
00510 KateMainWindow *KateViewManager::mainWindow() {
00511         return m_mainWindow;
00512 }
00513 
00514 // kate: space-indent on; indent-width 2; replace-tabs on;

kate

Skip menu "kate"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members

API Reference

Skip menu "API Reference"
  • kate
Generated for API Reference by doxygen 1.5.9
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal