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
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
00055
00056 KateViewManager::KateViewManager (KateMainWindow *parent)
00057 : QObject (parent),
00058 showFullPath(false), m_mainWindow(parent)
00059 {
00060
00061 m_init=true;
00062
00063
00064 m_mainWindow->tabWidget()->setTabReorderingEnabled( true );
00065
00066
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
00078 m_viewSpaceContainerList.setAutoDelete(true);
00079
00080
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
00391 if (!activeView()) return;
00392
00393
00394
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
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