kate Library API Documentation

kateviewmanager.cpp

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., 59 Temple Place - Suite 330,
00018    Boston, MA 02111-1307, 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 
00029 #include <dcopclient.h>
00030 #include <kaction.h>
00031 #include <kcmdlineargs.h>
00032 #include <kdebug.h>
00033 #include <kdiroperator.h>
00034 #include <kdockwidget.h>
00035 #include <kencodingfiledialog.h>
00036 #include <kiconloader.h>
00037 #include <kglobal.h>
00038 #include <klocale.h>
00039 #include <ktoolbar.h>
00040 #include <kmessagebox.h>
00041 #include <ksimpleconfig.h>
00042 #include <kstdaction.h>
00043 #include <kstandarddirs.h>
00044 #include <kglobalsettings.h>
00045 #include <kstdaccel.h>
00046 
00047 #include <ktexteditor/encodinginterface.h>
00048 
00049 #include <qobjectlist.h>
00050 #include <qstringlist.h>
00051 #include <qfileinfo.h>
00052 #include <qtoolbutton.h>
00053 #include <qtooltip.h>
00054 //END Includes
00055 
00056 KateViewManager::KateViewManager (KateMainWindow *parent)
00057  : QObject  (parent),
00058   showFullPath(false), m_mainWindow(parent)
00059 {
00060   // while init
00061   m_init=true;
00062 
00063   // some stuff for the tabwidget
00064   m_mainWindow->tabWidget()->setTabReorderingEnabled( true );
00065 
00066   // important, set them up, as we use them in other methodes
00067   setupActions ();
00068 
00069   guiMergedView=0;
00070 
00071   m_viewManager = new Kate::ViewManager (this);
00072   m_currentContainer=0;
00073  connect(m_mainWindow->tabWidget(),SIGNAL(currentChanged(QWidget*)),this,SLOT(tabChanged(QWidget*)));
00074  slotNewTab();
00075  tabChanged(m_mainWindow->tabWidget()->currentPage());
00076 
00077   // no memleaks
00078   m_viewSpaceContainerList.setAutoDelete(true);
00079 
00080   // init done
00081   m_init=false;
00082 }
00083 
00084 KateViewManager::~KateViewManager ()
00085 {
00086   m_viewSpaceContainerList.setAutoDelete(false);
00087 }
00088 
00089 void KateViewManager::setupActions ()
00090 {
00091   KAction *a;
00092 
00096   a=new KAction ( i18n("New Tab"),"tab_new", 0, this, SLOT(slotNewTab()),
00097                   m_mainWindow->actionCollection(), "view_new_tab" );
00098 
00099   m_closeTab = new KAction ( i18n("Close Current Tab"),"tab_remove",0,this,SLOT(slotCloseTab()),
00100                              m_mainWindow->actionCollection(),"view_close_tab");
00101 
00102   m_activateNextTab
00103       = new KAction( i18n( "Activate Next Tab" ),
00104                      QApplication::reverseLayout() ? KStdAccel::tabPrev() : KStdAccel::tabNext(),
00105                      this, SLOT( activateNextTab() ), m_mainWindow->actionCollection(), "view_next_tab" );
00106 
00107   m_activatePrevTab
00108       = new KAction( i18n( "Activate Previous Tab" ),
00109                      QApplication::reverseLayout() ? KStdAccel::tabNext() : KStdAccel::tabPrev(),
00110                      this, SLOT( activatePrevTab() ), m_mainWindow->actionCollection(), "view_prev_tab" );
00111 
00115   a=new KAction ( i18n("Split Ve&rtical"), "view_right", CTRL+SHIFT+Key_L, this, SLOT(
00116                   slotSplitViewSpaceVert() ), m_mainWindow->actionCollection(), "view_split_vert");
00117 
00118   a->setWhatsThis(i18n("Split the currently active view vertically into two views."));
00119 
00120   a=new KAction ( i18n("Split &Horizontal"), "view_bottom", CTRL+SHIFT+Key_T, this, SLOT(
00121                   slotSplitViewSpaceHoriz() ), m_mainWindow->actionCollection(), "view_split_horiz");
00122 
00123   a->setWhatsThis(i18n("Split the currently active view horizontally into two views."));
00124 
00125   m_closeView = new KAction ( i18n("Cl&ose Current View"), "view_remove", CTRL+SHIFT+Key_R, this,
00126                     SLOT( slotCloseCurrentViewSpace() ), m_mainWindow->actionCollection(),
00127                     "view_close_current_space" );
00128 
00129   m_closeView->setWhatsThis(i18n("Close the currently active splitted view"));
00130 
00131   goNext=new KAction(i18n("Next View"),Key_F8,this,
00132                      SLOT(activateNextView()),m_mainWindow->actionCollection(),"go_next");
00133 
00134   goNext->setWhatsThis(i18n("Make the next split view the active one."));
00135 
00136   goPrev=new KAction(i18n("Previous View"),SHIFT+Key_F8, this, SLOT(activatePrevView()),m_mainWindow->actionCollection(),"go_prev");
00137 
00138   goPrev->setWhatsThis(i18n("Make the previous split view the active one."));
00139 
00143   QToolButton *b = new QToolButton( m_mainWindow->tabWidget() );
00144   connect( b, SIGNAL( clicked() ),
00145              this, SLOT( slotNewTab() ) );
00146   b->setIconSet( SmallIcon( "tab_new" ) );
00147   b->adjustSize();
00148   QToolTip::add(b, i18n("Open a new tab"));
00149   m_mainWindow->tabWidget()->setCornerWidget( b, TopLeft );
00150 
00151   b = m_closeTabButton = new QToolButton( m_mainWindow->tabWidget() );
00152   connect( b, SIGNAL( clicked() ),
00153             this, SLOT( slotCloseTab() ) );
00154   b->setIconSet( SmallIcon( "tab_remove" ) );
00155   b->adjustSize();
00156   QToolTip::add(b, i18n("Close the current tab"));
00157   m_mainWindow->tabWidget()->setCornerWidget( b, TopRight );
00158 }
00159 
00160 void KateViewManager::updateViewSpaceActions ()
00161 {
00162   if (!m_currentContainer) return;
00163 
00164   m_closeView->setEnabled (m_currentContainer->viewSpaceCount() > 1);
00165   goNext->setEnabled (m_currentContainer->viewSpaceCount() > 1);
00166   goPrev->setEnabled (m_currentContainer->viewSpaceCount() > 1);
00167 }
00168 
00169 void KateViewManager::tabChanged(QWidget* widget) {
00170   KateViewSpaceContainer *container=static_cast<KateViewSpaceContainer*>(widget->qt_cast("KateViewSpaceContainer"));
00171   Q_ASSERT(container);
00172   m_currentContainer=container;
00173 
00174   if (container) {
00175     container->reactivateActiveView();
00176 
00177   }
00178 
00179   m_closeTab->setEnabled(m_mainWindow->tabWidget()->count() > 1);
00180   m_activateNextTab->setEnabled(m_mainWindow->tabWidget()->count() > 1);
00181   m_activatePrevTab->setEnabled(m_mainWindow->tabWidget()->count() > 1);
00182   m_closeTabButton->setEnabled (m_mainWindow->tabWidget()->count() > 1);
00183 
00184   updateViewSpaceActions ();
00185 }
00186 
00187 void KateViewManager::slotNewTab()
00188 {
00189   uint documentNumber=0;
00190   if (m_currentContainer) {
00191     if (m_currentContainer->activeView()) documentNumber=m_currentContainer->activeView()->getDoc()->documentNumber();
00192   }
00193   KateViewSpaceContainer *container=new KateViewSpaceContainer (m_mainWindow->tabWidget(), this);
00194   m_viewSpaceContainerList.append(container);
00195   m_mainWindow->tabWidget()->addTab (container, "");
00196   Q_ASSERT (m_currentContainer==container);
00197   container->installEventFilter(this);
00198   connect(container,SIGNAL(viewChanged()),this,SIGNAL(viewChanged()));
00199   connect(container,SIGNAL(viewChanged()),m_viewManager,SIGNAL(viewChanged()));
00200   if (!m_init) {
00201     container->activateView(documentNumber);
00202     container->setShowFullPath(showFullPath);
00203     m_mainWindow->slotWindowActivated ();
00204   }
00205 }
00206 
00207 void KateViewManager::slotCloseTab()
00208 {
00209   if (m_viewSpaceContainerList.count() <= 1) return;
00210   if (!m_currentContainer) return;
00211 
00212   int pos = m_viewSpaceContainerList.find (m_currentContainer);
00213 
00214   if (pos == -1)
00215     return;
00216 
00217   if (guiMergedView)
00218     m_mainWindow->guiFactory()->removeClient (guiMergedView );
00219 
00220   m_viewSpaceContainerList.remove (pos);
00221 
00222   if ((uint)pos >= m_viewSpaceContainerList.count())
00223     pos = m_viewSpaceContainerList.count()-1;
00224 
00225   tabChanged(m_viewSpaceContainerList.at (pos));
00226 }
00227 
00228 void KateViewManager::activateNextTab()
00229 {
00230   if( m_mainWindow->tabWidget()->count() <= 1 ) return;
00231 
00232   int iTab = m_mainWindow->tabWidget()->currentPageIndex();
00233 
00234   iTab++;
00235 
00236   if( iTab == m_mainWindow->tabWidget()->count() )
00237     iTab = 0;
00238 
00239   m_mainWindow->tabWidget()->setCurrentPage( iTab );
00240 }
00241 
00242 void KateViewManager::activatePrevTab()
00243 {
00244   if( m_mainWindow->tabWidget()->count() <= 1 ) return;
00245 
00246   int iTab = m_mainWindow->tabWidget()->currentPageIndex();
00247 
00248   iTab--;
00249 
00250   if( iTab == -1 )
00251     iTab = m_mainWindow->tabWidget()->count() - 1;
00252 
00253   m_mainWindow->tabWidget()->setCurrentPage( iTab );
00254 }
00255 
00256 bool KateViewManager::eventFilter(QObject *o,QEvent *e) {
00257   if (e->type()==QEvent::CaptionChange) {
00258     m_mainWindow->tabWidget()->updateCaptionInView(static_cast<QWidget*>(o),static_cast<QWidget*>(o)->caption());
00259   }
00260   return false;
00261 }
00262 
00263 void KateViewManager::activateSpace (Kate::View* v)
00264 {
00265   if (m_currentContainer) {
00266     m_currentContainer->activateSpace(v);
00267   }
00268 }
00269 
00270 void KateViewManager::activateView ( Kate::View *view ) {
00271   if (m_currentContainer) {
00272     m_currentContainer->activateView(view);
00273   }
00274 }
00275 
00276 
00277 KateViewSpace* KateViewManager::activeViewSpace ()
00278 {
00279   if (m_currentContainer) {
00280     return m_currentContainer->activeViewSpace();
00281   }
00282   return 0L;
00283 }
00284 
00285 Kate::View* KateViewManager::activeView ()
00286 {
00287   if (m_currentContainer) {
00288     return m_currentContainer->activeView();
00289   }
00290   return 0L;
00291 }
00292 
00293 void KateViewManager::setActiveSpace ( KateViewSpace* vs )
00294 {
00295   if (m_currentContainer) {
00296     m_currentContainer->setActiveSpace(vs);
00297   }
00298 
00299 }
00300 
00301 void KateViewManager::setActiveView ( Kate::View* view )
00302 {
00303   if (m_currentContainer) {
00304     m_currentContainer->setActiveView(view);
00305   }
00306 
00307 }
00308 
00309 
00310 void KateViewManager::activateView( uint documentNumber )
00311 {
00312   if (m_currentContainer) {
00313      m_currentContainer->activateView(documentNumber);
00314   }
00315 }
00316 
00317 uint KateViewManager::viewCount ()
00318 {
00319   uint viewCount=0;
00320   for (uint i=0;i<m_viewSpaceContainerList.count();i++) {
00321     viewCount+=m_viewSpaceContainerList.at(i)->viewCount();
00322   }
00323   return viewCount;
00324 
00325 }
00326 
00327 uint KateViewManager::viewSpaceCount ()
00328 {
00329   uint viewSpaceCount=0;
00330   for (uint i=0;i<m_viewSpaceContainerList.count();i++) {
00331     viewSpaceCount+=m_viewSpaceContainerList.at(i)->viewSpaceCount();
00332   }
00333   return viewSpaceCount;
00334 }
00335 
00336 void KateViewManager::setViewActivationBlocked (bool block)
00337 {
00338   for (uint i=0;i<m_viewSpaceContainerList.count();i++)
00339     m_viewSpaceContainerList.at(i)->m_blockViewCreationAndActivation=block;
00340 }
00341 
00342 void KateViewManager::activateNextView()
00343 {
00344   if (m_currentContainer) {
00345     m_currentContainer->activateNextView();
00346   }
00347 }
00348 
00349 void KateViewManager::activatePrevView()
00350 {
00351   if (m_currentContainer) {
00352     m_currentContainer->activatePrevView();
00353   }
00354 }
00355 
00356 void KateViewManager::closeViews(uint documentNumber)
00357 {
00358   for (uint i=0;i<m_viewSpaceContainerList.count();i++) {
00359     m_viewSpaceContainerList.at(i)->closeViews(documentNumber);
00360   }
00361   tabChanged(m_currentContainer);
00362 }
00363 
00364 void KateViewManager::slotDocumentNew ()
00365 {
00366   if (m_currentContainer) m_currentContainer->createView ();
00367 }
00368 
00369 void KateViewManager::slotDocumentOpen ()
00370 {
00371   Kate::View *cv = activeView();
00372 
00373   if (cv) {
00374     KEncodingFileDialog::Result r=KEncodingFileDialog::getOpenURLsAndEncoding(
00375       (cv ? KTextEditor::encodingInterface(cv->document())->encoding() : Kate::Document::defaultEncoding()),
00376        (cv ? cv->document()->url().url() : QString::null),
00377        QString::null,m_mainWindow,i18n("Open File"));
00378 
00379     uint lastID = 0;
00380     for (KURL::List::Iterator i=r.URLs.begin(); i != r.URLs.end(); ++i)
00381       lastID = openURL( *i, r.encoding, false );
00382 
00383     if (lastID > 0)
00384       activateView (lastID);
00385   }
00386 }
00387 
00388 void KateViewManager::slotDocumentClose ()
00389 {
00390   // no active view, do nothing
00391   if (!activeView()) return;
00392 
00393   // prevent close document if only one view alive and the document of
00394   // it is not modified and empty !!!
00395   if ( (KateDocManager::self()->documents() == 1)
00396        && !activeView()->getDoc()->isModified()
00397        && activeView()->getDoc()->url().isEmpty()
00398        && (activeView()->getDoc()->length() == 0) )
00399   {
00400     activeView()->getDoc()->closeURL();
00401     return;
00402   }
00403 
00404   // close document
00405   KateDocManager::self()->closeDocument (activeView()->getDoc());
00406 }
00407 
00408 uint KateViewManager::openURL (const KURL &url, const QString& encoding, bool activate)
00409 {
00410   uint id = 0;
00411   Kate::Document *doc = KateDocManager::self()->openURL (url, encoding, &id);
00412 
00413   if (!doc->url().isEmpty())
00414     m_mainWindow->fileOpenRecent->addURL( doc->url() );
00415 
00416   if (activate)
00417     activateView( id );
00418 
00419   return id;
00420 }
00421 
00422 void KateViewManager::openURL (const KURL &url)
00423 {
00424   openURL (url, QString::null);
00425 }
00426 
00427 void KateViewManager::removeViewSpace (KateViewSpace *viewspace)
00428 {
00429   if (m_currentContainer) {
00430     m_currentContainer->removeViewSpace(viewspace);
00431   }
00432 }
00433 
00434 void KateViewManager::slotCloseCurrentViewSpace()
00435 {
00436   if (m_currentContainer) {
00437     m_currentContainer->slotCloseCurrentViewSpace();
00438   }
00439 }
00440 
00441 void KateViewManager::slotSplitViewSpaceVert()
00442 {
00443   if (m_currentContainer) {
00444     m_currentContainer->slotSplitViewSpaceVert();
00445   }
00446 }
00447 
00448 void KateViewManager::slotSplitViewSpaceHoriz()
00449 {
00450   if (m_currentContainer) {
00451     m_currentContainer->slotSplitViewSpaceHoriz();
00452   }
00453 }
00454 
00455 void KateViewManager::setShowFullPath( bool enable )
00456 {
00457   showFullPath=enable;
00458   for (uint i=0;i<m_viewSpaceContainerList.count();i++) {
00459     m_viewSpaceContainerList.at(i)->setShowFullPath(enable);
00460   }
00461   m_mainWindow->slotWindowActivated ();
00462  }
00463 
00468 void KateViewManager::saveViewConfiguration(KConfig *config,const QString& group)
00469 {
00470   config->setGroup(group);
00471   config->writeEntry("ViewSpaceContainers",m_viewSpaceContainerList.count());
00472   config->writeEntry("Active ViewSpaceContainer", m_mainWindow->tabWidget()->currentPageIndex());
00473   for (uint i=0;i<m_viewSpaceContainerList.count();i++) {
00474     m_viewSpaceContainerList.at(i)->saveViewConfiguration(config,group+QString(":ViewSpaceContainer-%1:").arg(i));
00475   }
00476 }
00477 
00478 void KateViewManager::restoreViewConfiguration (KConfig *config, const QString& group)
00479 {
00480   config->setGroup(group);
00481   uint tabCount=config->readNumEntry("ViewSpaceContainers",0);
00482   int activeOne=config->readNumEntry("Active ViewSpaceContainer",0);
00483   if (tabCount==0) return;
00484   m_viewSpaceContainerList.at(0)->restoreViewConfiguration(config,group+QString(":ViewSpaceContainer-0:"));
00485   for (uint i=1;i<tabCount;i++) {
00486     slotNewTab();
00487     m_viewSpaceContainerList.at(i)->restoreViewConfiguration(config,group+QString(":ViewSpaceContainer-%1:").arg(i));
00488   }
00489 
00490   if (activeOne != m_mainWindow->tabWidget()->currentPageIndex())
00491     m_mainWindow->tabWidget()->setCurrentPage (activeOne);
00492 
00493   updateViewSpaceActions();
00494 }
00495 
00496 KateMainWindow *KateViewManager::mainWindow() {
00497         return m_mainWindow;
00498 }
00499 
00500 // kate: space-indent on; indent-width 2; replace-tabs on;
KDE Logo
This file is part of the documentation for kate Library Version 3.4.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Nov 4 00:48:31 2005 by doxygen 1.4.4 written by Dimitri van Heesch, © 1997-2003