• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • kate
 

kate

kateapp.cpp
00001 /* This file is part of the KDE project
00002    Copyright (C) 2001 Christoph Cullmann <cullmann@kde.org>
00003    Copyright (C) 2002 Joseph Wenninger <jowenn@kde.org>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License version 2 as published by the Free Software Foundation.
00008 
00009    This library is distributed in the hope that it will be useful,
00010    but WITHOUT ANY WARRANTY; without even the implied warranty of
00011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012    Library General Public License for more details.
00013 
00014    You should have received a copy of the GNU Library General Public License
00015    along with this library; see the file COPYING.LIB.  If not, write to
00016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017    Boston, MA 02110-1301, USA.
00018 */
00019 
00020 #include "kateapp.h"
00021 #include "kateapp.moc"
00022 
00023 #include "katedocmanager.h"
00024 #include "katepluginmanager.h"
00025 #include "kateviewmanager.h"
00026 #include "kateappIface.h"
00027 #include "katesession.h"
00028 #include "katemainwindow.h"
00029 
00030 #include "../interfaces/application.h"
00031 
00032 #include <tdeversion.h>
00033 #include <tdecmdlineargs.h>
00034 #include <dcopclient.h>
00035 #include <tdeconfig.h>
00036 #include <twin.h>
00037 #include <ktip.h>
00038 #include <kdebug.h>
00039 #include <klibloader.h>
00040 #include <tdemessagebox.h>
00041 #include <tdelocale.h>
00042 #include <ksimpleconfig.h>
00043 #include <tdestartupinfo.h>
00044 
00045 #include <tqfile.h>
00046 #include <tqtimer.h>
00047 #include <tqdir.h>
00048 #include <tqtextcodec.h>
00049 
00050 #include <stdlib.h>
00051 #include <unistd.h>
00052 #include <sys/types.h>
00053 
00054 KateApp::KateApp (TDECmdLineArgs *args)
00055  : TDEApplication ()
00056  , m_args (args)
00057  , m_shouldExit (false)
00058 {
00059   // Don't handle DCOP requests yet
00060   dcopClient()->suspend();
00061 
00062   // insert right translations for the katepart
00063   TDEGlobal::locale()->insertCatalogue("katepart");
00064 
00065   // some global default
00066   Kate::Document::setFileChangedDialogsActivated (true);
00067 
00068   // application interface
00069   m_application = new Kate::Application (this);
00070 
00071   // doc + project man
00072   m_docManager = new KateDocManager (TQT_TQOBJECT(this));
00073 
00074   // init all normal plugins
00075   m_pluginManager = new KatePluginManager (TQT_TQOBJECT(this));
00076 
00077   // session manager up
00078   m_sessionManager = KateSessionManager::self();
00079 
00080   // application dcop interface
00081   m_obj = new KateAppDCOPIface (this);
00082 
00083   kdDebug()<<"Setting KATE_PID: '"<<getpid()<<"'"<<endl;
00084   ::setenv( "KATE_PID", TQString(TQString("%1").arg(getpid())).latin1(), 1 );
00085 
00086   connect(this, TQT_SIGNAL(aboutToQuit()), this, TQT_SLOT(slotAboutToQuit()));
00087 
00088   // handle restore different
00089   if (isRestored())
00090   {
00091     restoreKate ();
00092   }
00093   else
00094   {
00095     // let us handle our command line args and co ;)
00096     // we can exit here if session chooser decides
00097     if (!startupKate ())
00098     {
00099       m_shouldExit = true;
00100       return;
00101     }
00102   }
00103 
00104   // Ok. We are ready for DCOP requests.
00105   dcopClient()->resume();
00106 }
00107 
00108 KateApp::~KateApp ()
00109 {
00110   delete m_obj;            // cu dcop interface
00111   delete m_pluginManager;  // cu plugin manager
00112   delete m_sessionManager; // delete session manager
00113   delete m_docManager;     // delete document manager. Do this now, or we crash
00114 }
00115 
00116 KateApp *KateApp::self ()
00117 {
00118   return (KateApp *) kapp;
00119 }
00120 
00121 Kate::Application *KateApp::application ()
00122 {
00123   return m_application;
00124 }
00125 
00130 TQString KateApp::kateVersion (bool fullVersion)
00131 {
00132 //   return fullVersion ? TQString ("%1.%2.%3").arg(KDE::versionMajor() - 1).arg(KDE::versionMinor()).arg(KDE::versionRelease())
00133 //            : TQString ("%1.%2").arg(KDE::versionMajor() - 1).arg(KDE::versionMinor());
00137   return fullVersion ? TQString ("2.5.%1").arg(KDE::versionMajor()) : TQString ("%1.%2").arg(2.5);
00138 }
00139 
00140 void KateApp::restoreKate()
00141 {
00142   // restore the nice files ;) we need it
00143   Kate::Document::setOpenErrorDialogsActivated(false);
00144 
00145   // restore last session
00146   sessionManager()->restoreLastSession();
00147   m_docManager->restoreDocumentList(sessionConfig());
00148 
00149   Kate::Document::setOpenErrorDialogsActivated(true);
00150 
00151   // no mainwindow, create one, should not happen, but make sure ;)
00152   if (mainWindows() == 0)
00153     newMainWindow();
00154 
00155   // Do not notify about start there: this makes kicker crazy and kate go to a wrong desktop.
00156   // TDEStartupInfo::setNewStartupId( activeMainWindow(), startupId());
00157 }
00158 
00159 bool KateApp::startupKate()
00160 {
00161   if (m_args->isSet("start"))
00162   {
00163     // the user has specified the session to open. If the session does not exist,
00164     // a new session with the specified name will be created
00165     TQCString sessName = m_args->getOption("start");
00166     int sessId = sessionManager()->getSessionIdFromName(sessName);
00167     if (sessId != KateSessionManager::INVALID_SESSION)
00168     {
00169       sessionManager()->activateSession(sessId);
00170     }
00171     else
00172     {
00173       sessionManager()->newSession(sessName);
00174     }
00175   }
00176   else
00177   {
00178     // check Kate session startup options
00179     int startupOption = sessionManager()->getStartupOption();
00180     if (startupOption == KateSessionManager::STARTUP_NEW)
00181     {
00182       sessionManager()->newSession();
00183     }
00184     else if (startupOption == KateSessionManager::STARTUP_LAST)
00185     {
00186       sessionManager()->restoreLastSession();
00187     }
00188     else // startupOption == KateSessionManager::STARTUP_MANUAL
00189     {
00190       KateSessionChooser *chooser = new KateSessionChooser(NULL);
00191       int result = chooser->exec();
00192       switch (result)
00193       {
00194         case KateSessionChooser::RESULT_OPEN_NEW:
00195           sessionManager()->newSession();
00196           break;
00197 
00198         case KateSessionChooser::RESULT_OPEN_EXISTING:
00199           if (!m_sessionManager->activateSession(chooser->getSelectedSessionId()))
00200           {
00201             // Open a new session in case of error
00202             sessionManager()->newSession();
00203           }
00204           break;
00205 
00206         default: // KateSessionChooser::RESULT_QUIT_KATE:
00207           // Kate will exit now and notify it is done
00208           TDEStartupInfo::appStarted(startupId());
00209           return false;
00210           break;
00211       }
00212       delete chooser;
00213     }
00214   }
00215 
00216   // oh, no mainwindow, create one, should not happen, but make sure ;)
00217   if (mainWindows() == 0)
00218     newMainWindow ();
00219 
00220   // notify about start
00221   TDEStartupInfo::setNewStartupId( activeMainWindow(), startupId());
00222 
00223   TQTextCodec *codec = m_args->isSet("encoding") ? TQTextCodec::codecForName(m_args->getOption("encoding")) : 0;
00224 
00225   bool tempfileSet = TDECmdLineArgs::isTempFileSet();
00226 
00227   Kate::Document::setOpenErrorDialogsActivated (false);
00228   uint id = 0;
00229   for (int z=0; z<m_args->count(); z++)
00230   {
00231     // this file is no local dir, open it, else warn
00232     bool noDir = !m_args->url(z).isLocalFile() || !TQDir (m_args->url(z).path()).exists();
00233 
00234     if (noDir)
00235     {
00236       // open a normal file
00237       if (codec)
00238         id = activeMainWindow()->viewManager()->openURL( m_args->url(z), codec->name(), false, tempfileSet );
00239       else
00240         id = activeMainWindow()->viewManager()->openURL( m_args->url(z), TQString::null, false, tempfileSet );
00241     }
00242     else
00243       KMessageBox::sorry( activeMainWindow(),
00244                           i18n("The file '%1' could not be opened: it is not a normal file, it is a folder.").arg(m_args->url(z).url()) );
00245   }
00246 
00247   Kate::Document::setOpenErrorDialogsActivated (true);
00248 
00249   // handle stdin input
00250   if( m_args->isSet( "stdin" ) )
00251   {
00252     TQTextIStream input(stdin);
00253 
00254     // set chosen codec
00255     if (codec)
00256       input.setCodec (codec);
00257 
00258     TQString line;
00259     TQString text;
00260 
00261     do
00262     {
00263       line = input.readLine();
00264       text.append( line + "\n" );
00265     } while( !line.isNull() );
00266 
00267     openInput (text);
00268   }
00269   else if ( id )
00270     activeMainWindow()->viewManager()->activateView( id );
00271 
00272   if ( activeMainWindow()->viewManager()->viewCount () == 0 )
00273     activeMainWindow()->viewManager()->activateView(m_docManager->firstDocument()->documentNumber());
00274 
00275   int line = 0;
00276   int column = 0;
00277   bool nav = false;
00278 
00279   if (m_args->isSet ("line"))
00280   {
00281     line = m_args->getOption ("line").toInt();
00282     nav = true;
00283   }
00284 
00285   if (m_args->isSet ("column"))
00286   {
00287     column = m_args->getOption ("column").toInt();
00288     nav = true;
00289   }
00290 
00291   if (nav)
00292     activeMainWindow()->viewManager()->activeView ()->setCursorPosition (line, column);
00293 
00294   // show the nice tips
00295   KTipDialog::showTip(activeMainWindow());
00296 
00297   return true;
00298 }
00299 
00300 void KateApp::shutdownKate(KateMainWindow *win)
00301 {
00302   if (!win->queryClose_internal() || !query_session_close())
00303     return;
00304 
00305   // detach the dcopClient
00306   dcopClient()->detach();
00307 
00308   // cu main windows
00309   while (!m_mainWindows.isEmpty())
00310     delete m_mainWindows[0];
00311 
00312   quit();
00313 }
00314 
00315 bool KateApp::query_session_close()
00316 {
00317   bool saveSessions = false;
00318   int switchOption = m_sessionManager->getSwitchOption();
00319   if (switchOption == KateSessionManager::SWITCH_SAVE)
00320   {
00321     saveSessions = true;
00322   }
00323   else if (switchOption == KateSessionManager::SWITCH_ASK)
00324   {
00325     KDialogBase *dlg = new KDialogBase(i18n("Save Sessions"),
00326             KDialogBase::Yes | KDialogBase::No | KDialogBase::Cancel,
00327             KDialogBase::Cancel, KDialogBase::Cancel, NULL, NULL, true, false,
00328             KStdGuiItem::save(), KStdGuiItem::del(), KStdGuiItem::cancel());
00329     bool dontAgain = false;
00330     int res = KMessageBox::createKMessageBox(dlg, TQMessageBox::Warning,
00331                     i18n("<p>Do you want to save the existing sessions?<p>!!NOTE!!"
00332                          "<p>All existing sessions will be removed "
00333                          "if you choose \"Delete\""), TQStringList(),
00334                     i18n("Do not ask again"), &dontAgain, KMessageBox::Notify);
00335     if (res == KDialogBase::Cancel)
00336     {
00337       return false;
00338     }
00339     if (dontAgain)
00340     {
00341       if (res == KDialogBase::No)
00342       {
00343         m_sessionManager->setSwitchOption(KateSessionManager::SWITCH_DISCARD);
00344       }
00345       else
00346       {
00347         m_sessionManager->setSwitchOption(KateSessionManager::SWITCH_SAVE);
00348       }
00349     }
00350     if (res == KDialogBase::Yes)
00351     {
00352       saveSessions = true;
00353     }
00354   }
00355   
00356   if (saveSessions)
00357   {    
00358     m_sessionManager->saveActiveSession();
00359   }
00360   m_sessionManager->saveConfig(saveSessions);
00361   return true;
00362 }
00363 
00364 void KateApp::reparse_config()
00365 {
00366   emit optionsChanged();
00367 }
00368 
00369 KatePluginManager *KateApp::pluginManager()
00370 {
00371   return m_pluginManager;
00372 }
00373 
00374 KateDocManager *KateApp::documentManager ()
00375 {
00376   return m_docManager;
00377 }
00378 
00379 KateSessionManager* KateApp::sessionManager()
00380 {
00381   return m_sessionManager;
00382 }
00383 
00384 bool KateApp::openURL (const KURL &url, const TQString &encoding, bool isTempFile)
00385 {
00386   KateMainWindow *mainWindow = activeMainWindow ();
00387 
00388   if (!mainWindow)
00389     return false;
00390 
00391   TQTextCodec *codec = encoding.isEmpty() ? 0 : TQTextCodec::codecForName(encoding.latin1());
00392 
00393   kdDebug () << "OPEN URL "<< encoding << endl;
00394 
00395   // this file is no local dir, open it, else warn
00396   bool noDir = !url.isLocalFile() || !TQDir (url.path()).exists();
00397 
00398   if (noDir)
00399   {
00400     // open a normal file
00401     if (codec)
00402       mainWindow->viewManager()->openURL( url, codec->name(), true, isTempFile );
00403     else
00404       mainWindow->viewManager()->openURL( url, TQString::null, true, isTempFile );
00405   }
00406   else
00407     KMessageBox::sorry( mainWindow,
00408                         i18n("The file '%1' could not be opened: it is not a normal file, it is a folder.").arg(url.url()) );
00409 
00410   return true;
00411 }
00412 
00413 bool KateApp::setCursor (int line, int column)
00414 {
00415   KateMainWindow *mainWindow = activeMainWindow ();
00416 
00417   if (!mainWindow)
00418     return false;
00419 
00420   mainWindow->viewManager()->activeView ()->setCursorPosition (line, column);
00421 
00422   return true;
00423 }
00424 
00425 bool KateApp::openInput (const TQString &text)
00426 {
00427   activeMainWindow()->viewManager()->openURL( "", "", true );
00428 
00429   if (!activeMainWindow()->viewManager()->activeView ())
00430     return false;
00431 
00432   activeMainWindow()->viewManager()->activeView ()->getDoc()->setText (text);
00433 
00434   return true;
00435 }
00436 
00437 KateMainWindow *KateApp::newMainWindow (TDEConfig *sconfig, const TQString &sgroup)
00438 {
00439   KateMainWindow *mainWindow = new KateMainWindow (sconfig, sgroup);
00440   m_mainWindows.push_back (mainWindow);
00441 
00442   if ((mainWindows() > 1) && m_mainWindows[m_mainWindows.count()-2]->viewManager()->activeView())
00443     mainWindow->viewManager()->activateView ( m_mainWindows[m_mainWindows.count()-2]->viewManager()->activeView()->getDoc()->documentNumber() );
00444   else if ((mainWindows() > 1) && (m_docManager->documents() > 0))
00445     mainWindow->viewManager()->activateView ( (m_docManager->document(m_docManager->documents()-1))->documentNumber() );
00446   else if ((mainWindows() > 1) && (m_docManager->documents() < 1))
00447     mainWindow->viewManager()->openURL ( KURL() );
00448 
00449   mainWindow->show ();
00450 
00451   return mainWindow;
00452 }
00453 
00454 void KateApp::removeMainWindow (KateMainWindow *mainWindow)
00455 {
00456   m_mainWindows.remove (mainWindow);
00457 }
00458 
00459 KateMainWindow *KateApp::activeMainWindow ()
00460 {
00461   if (m_mainWindows.isEmpty())
00462     return 0;
00463 
00464   int n = m_mainWindows.findIndex ((KateMainWindow *)activeWindow());
00465 
00466   if (n < 0)
00467     n=0;
00468 
00469   return m_mainWindows[n];
00470 }
00471 
00472 uint KateApp::mainWindows () const
00473 {
00474   return m_mainWindows.size();
00475 }
00476 
00477 KateMainWindow *KateApp::mainWindow (uint n)
00478 {
00479   if (n < m_mainWindows.size())
00480     return m_mainWindows[n];
00481 
00482   return 0;
00483 }
00484 
00485 // 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

kate

Skip menu "kate"
  • kate
  • libkonq
  • twin
  •   lib
Generated for kate by doxygen 1.7.6.1
This website is maintained by Timothy Pearson.