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., 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 <tdeaction.h> 00032 #include <tdecmdlineargs.h> 00033 #include <kdebug.h> 00034 #include <tdediroperator.h> 00035 #include <kdockwidget.h> 00036 #include <kencodingfiledialog.h> 00037 #include <kiconloader.h> 00038 #include <tdeglobal.h> 00039 #include <tdelocale.h> 00040 #include <tdetoolbar.h> 00041 #include <tdemessagebox.h> 00042 #include <ksimpleconfig.h> 00043 #include <kstdaction.h> 00044 #include <kstandarddirs.h> 00045 #include <tdeglobalsettings.h> 00046 #include <tdestdaccel.h> 00047 00048 #include <tdetexteditor/encodinginterface.h> 00049 00050 #include <tqobjectlist.h> 00051 #include <tqstringlist.h> 00052 #include <tqfileinfo.h> 00053 #include <tqtoolbutton.h> 00054 #include <tqtooltip.h> 00055 //END Includes 00056 00057 KateViewManager::KateViewManager (KateMainWindow *parent) 00058 : TQObject (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(),TQT_SIGNAL(currentChanged(TQWidget*)),this,TQT_SLOT(tabChanged(TQWidget*))); 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 TDEAction *a; 00093 00097 a=new TDEAction ( i18n("New Tab"),"tab_new", 0, TQT_TQOBJECT(this), TQT_SLOT(slotNewTab()), 00098 m_mainWindow->actionCollection(), "view_new_tab" ); 00099 00100 m_closeTab = new TDEAction ( i18n("Close Current Tab"),"tab_remove",0,TQT_TQOBJECT(this),TQT_SLOT(slotCloseTab()), 00101 m_mainWindow->actionCollection(),"view_close_tab"); 00102 00103 m_activateNextTab 00104 = new TDEAction( i18n( "Activate Next Tab" ), 00105 TQApplication::reverseLayout() ? TDEStdAccel::tabPrev() : TDEStdAccel::tabNext(), 00106 TQT_TQOBJECT(this), TQT_SLOT( activateNextTab() ), m_mainWindow->actionCollection(), "view_next_tab" ); 00107 00108 m_activatePrevTab 00109 = new TDEAction( i18n( "Activate Previous Tab" ), 00110 TQApplication::reverseLayout() ? TDEStdAccel::tabNext() : TDEStdAccel::tabPrev(), 00111 TQT_TQOBJECT(this), TQT_SLOT( activatePrevTab() ), m_mainWindow->actionCollection(), "view_prev_tab" ); 00112 00116 a=new TDEAction ( i18n("Split Ve&rtical"), "view_right", CTRL+SHIFT+Key_L, TQT_TQOBJECT(this), TQT_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 TDEAction ( i18n("Split &Horizontal"), "view_bottom", CTRL+SHIFT+Key_T, TQT_TQOBJECT(this), TQT_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 TDEAction ( i18n("Cl&ose Current View"), "view_remove", CTRL+SHIFT+Key_R, TQT_TQOBJECT(this), 00127 TQT_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 TDEAction(i18n("Next View"),Key_F8,TQT_TQOBJECT(this), 00133 TQT_SLOT(activateNextView()),m_mainWindow->actionCollection(),"go_next"); 00134 00135 goNext->setWhatsThis(i18n("Make the next split view the active one.")); 00136 00137 goPrev=new TDEAction(i18n("Previous View"),SHIFT+Key_F8, TQT_TQOBJECT(this), TQT_SLOT(activatePrevView()),m_mainWindow->actionCollection(),"go_prev"); 00138 00139 goPrev->setWhatsThis(i18n("Make the previous split view the active one.")); 00140 00144 TQToolButton *b = new TQToolButton( m_mainWindow->tabWidget() ); 00145 connect( b, TQT_SIGNAL( clicked() ), 00146 this, TQT_SLOT( slotNewTab() ) ); 00147 b->setIconSet( SmallIcon( "tab_new" ) ); 00148 b->adjustSize(); 00149 TQToolTip::add(b, i18n("Open a new tab")); 00150 m_mainWindow->tabWidget()->setCornerWidget( b, TopLeft ); 00151 00152 b = m_closeTabButton = new TQToolButton( m_mainWindow->tabWidget() ); 00153 connect( b, TQT_SIGNAL( clicked() ), 00154 this, TQT_SLOT( slotCloseTab() ) ); 00155 b->setIconSet( SmallIcon( "tab_remove" ) ); 00156 b->adjustSize(); 00157 TQToolTip::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(TQWidget* widget) { 00171 KateViewSpaceContainer *container=static_cast<KateViewSpaceContainer*>(widget->tqt_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,TQT_SIGNAL(viewChanged()),this,TQT_SIGNAL(viewChanged())); 00203 connect(container,TQT_SIGNAL(viewChanged()),m_viewManager,TQT_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() : TQString::null), 00375 TQString::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 TQString& 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, TQString::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(TDEConfig *config,const TQString& 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 TQString group = grp; 00471 bool ok = false; 00472 int n = group.toInt( &ok ); 00473 if ( ok ) 00474 group = TQString( "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+TQString(":ViewSpaceContainer-%1:").arg(i)); 00481 } 00482 } 00483 00484 void KateViewManager::restoreViewConfiguration (TDEConfig *config, const TQString& 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 TQString group = grp; 00489 bool ok = false; 00490 int n = group.toInt( &ok ); 00491 if ( ok ) 00492 group = TQString( "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+TQString(":ViewSpaceContainer-0:")); 00499 for (uint i=1;i<tabCount;i++) { 00500 slotNewTab(); 00501 m_viewSpaceContainerList.at(i)->restoreViewConfiguration(config,group+TQString(":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;