00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
00056
00057 KateViewManager::KateViewManager (KateMainWindow *parent)
00058 : QObject (parent),
00059 showFullPath(false), m_mainWindow(parent)
00060 {
00061
00062 m_init=true;
00063
00064
00065 m_mainWindow->tabWidget()->setTabReorderingEnabled( true );
00066
00067
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
00079 m_viewSpaceContainerList.setAutoDelete(true);
00080
00081
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
00389 if (!activeView()) return;
00390
00391
00392
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
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
00466 void KateViewManager::saveViewConfiguration(KConfig *config,const QString& grp)
00467 {
00468
00469
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
00487
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