00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
00028
#include <kcmdlineargs.h>
00029
#include <dcopclient.h>
00030
#include <kconfig.h>
00031
#include <kwin.h>
00032
#include <ktip.h>
00033
#include <kdebug.h>
00034
#include <klibloader.h>
00035
#include <kmessagebox.h>
00036
#include <klocale.h>
00037
#include <ksimpleconfig.h>
00038
00039
#include <kio/netaccess.h>
00040
00041
#include <qfile.h>
00042
#include <qtimer.h>
00043
#include <kmdidefines.h>
00044
00045 KConfig *KateApp::m_sessionConfig = 0;
00046
00047 KateApp::KateApp (
bool forcedNewProcess,
bool oldState)
00048 : KUniqueApplication (true,true,true)
00049 , m_firstStart (true)
00050 , m_initPlugin (0)
00051 , m_doNotInitialize (0)
00052 , m_restoreGUIMode (KMdi::UndefinedMode)
00053 {
00054
00055
if (isRestored())
00056 {
00057 m_sessionConfig = sessionConfig ();
00058 m_sessionConfigDelete =
false;
00059 }
00060
else
00061 {
00062 m_sessionConfig =
new KSimpleConfig (
"katesessionrc",
false);
00063 m_sessionConfigDelete =
true;
00064 }
00065
00066
00067 kapp->dcopClient()->suspend();
00068
00069 m_mainWindows.setAutoDelete (
false);
00070
00071
00072
00073
if (forcedNewProcess)
00074 {
00075 config()->setGroup(
"KDE");
00076 config()->writeEntry(
"MultipleInstances",oldState);
00077 config()->sync();
00078 }
00079
00080
00081 m_application =
new Kate::Application (
this);
00082
00083
00084 m_initPluginManager =
new Kate::InitPluginManager (
this);
00085
00086
00087 m_obj =
new KateAppDCOPIface (
this);
00088
00089
00090 KGlobal::locale()->insertCatalogue(
"katepart");
00091
00092
00093 m_docManager =
new KateDocManager (
this);
00094 m_projectManager =
new KateProjectManager (
this);
00095
00096
00097 m_pluginManager =
new KatePluginManager (
this);
00098
00099 KCmdLineArgs* args = KCmdLineArgs::parsedArgs();
00100
00101
if (args->isSet(
"initplugin"))
00102 {
00103 QString pluginName=args->getOption(
"initplugin");
00104
00105 m_initURL=args->url(0);
00106
00107 m_initPlugin= static_cast<Kate::InitPlugin*>(Kate::createPlugin (QFile::encodeName(pluginName), (
Kate::Application *)kapp)->qt_cast(
"Kate::InitPlugin"));
00108
00109 m_initPlugin->activate(args->url(0));
00110
00111 m_doNotInitialize=m_initPlugin->actionsKateShouldNotPerformOnRealStartup();
00112
00113 kdDebug(13001)<<
"********************loading init plugin in app constructor"<<endl;
00114 }
00115
00116
00117 kapp->dcopClient()->resume();
00118
00119
00120 QTimer::singleShot(10,
this,SLOT(callOnEventLoopEnter()));
00121 }
00122
00123 KateApp::~KateApp ()
00124 {
00125
00126
delete m_obj;
00127
00128
00129
delete m_pluginManager;
00130
00131
00132
delete m_projectManager;
00133
00134
00135
delete m_docManager;
00136
00137
00138
if (m_sessionConfigDelete)
00139
delete m_sessionConfig;
00140 }
00141
00142
void KateApp::callOnEventLoopEnter()
00143 {
00144 emit onEventLoopEnter();
00145 disconnect(
this,SIGNAL(onEventLoopEnter()),0,0);
00146 emit m_application->onEventLoopEnter();
00147 disconnect(m_application,SIGNAL(onEventLoopEnter()),0,0);
00148
00149 kdDebug(13001)<<
"callOnEventLoopEnter(): "<<kapp->loopLevel()<<
"*****************************"<<endl;
00150 }
00151
00152
void KateApp::performInit(
const QString &libname,
const KURL &url)
00153 {
00154
if (m_initPlugin)
00155 m_oldInitLib=m_initLib;
00156
else
00157 m_oldInitLib=QString::null;
00158
00159 m_initURL=url;
00160 m_initLib=libname;
00161
00162 QTimer::singleShot(0,
this,SLOT(performInit()));
00163 }
00164
00165
void KateApp::performInit()
00166 {
00167
if (( m_oldInitLib.isNull()) || (m_oldInitLib!=m_initLib))
00168 {
00169
delete m_initPlugin;
00170 m_initPlugin=0;
00171
00172
if (!m_oldInitLib.isNull())
00173 KLibLoader::self()->unloadLibrary(m_oldInitLib.latin1());
00174
00175 m_initPlugin = static_cast<Kate::InitPlugin*>(Kate::createPlugin (QFile::encodeName(m_initLib), (
Kate::Application *)kapp)->qt_cast(
"Kate::InitPlugin"));
00176 }
00177
00178 m_initPlugin->activate(m_initURL);
00179 m_initPlugin->initKate();
00180 }
00181
00182 Kate::InitPlugin *KateApp::initPlugin()
const
00183
{
00184
return m_initPlugin;
00185 }
00186
00187 KURL KateApp::initScript()
const {
return m_initURL;}
00188
00189
int KateApp::newInstance()
00190 {
00191
if (m_firstStart)
00192 {
00193
00194
if ( restoringSession() )
00195 {
00196
00197 m_projectManager->restoreProjectList (sessionConfig());
00198 m_docManager->restoreDocumentList (sessionConfig());
00199
00200
for (
int n=1; KMainWindow::canBeRestored(n); n++)
00201 {
00202 KateMainWindow *win=newMainWindow(
false);
00203 win->restore ( n,
true );
00204 }
00205 }
00206
else
00207 {
00208 config()->setGroup(
"General");
00209
00210
00211
if (config()->readBoolEntry(
"Restore Projects",
false))
00212 m_projectManager->restoreProjectList (kateSessionConfig ());
00213
00214
00215
if (config()->readBoolEntry(
"Restore Documents",
false))
00216 m_docManager->restoreDocumentList (kateSessionConfig ());
00217
00218 KateMainWindow *win=newMainWindow(
false);
00219
00220
00221 config()->setGroup(
"General");
00222
if (config()->readBoolEntry(
"Restore Window Configuration",
false))
00223 win->readProperties (kateSessionConfig ());
00224
00225 win->show ();
00226 }
00227 }
00228
00229
00230
if (mainWindows() == 0)
00231 newMainWindow ();
00232
00233 KCmdLineArgs* args = KCmdLineArgs::parsedArgs();
00234
00235
if (!m_firstStart && args->isSet (
"w"))
00236 newMainWindow ();
00237
00238
if (!m_firstStart)
00239 raiseCurrentMainWindow ();
00240
00241 kdDebug(13001)<<
"******************************************** loop depth"<<kapp->loopLevel()<<endl;
00242
00243
if (m_firstStart && m_initPlugin)
00244 {
00245 m_initPlugin->initKate();
00246 kdDebug(13001)<<
"***************************** INIT PLUGIN ON FIRST START"<<endl;
00247 }
00248
else if (args->isSet(
"initplugin"))
00249 {
00250 kdDebug(13001)<<
"***************************** INIT PLUGIN ON ANY START"<<endl;
00251 performInit(args->getOption(
"initplugin"),args->url(0));
00252 }
00253
else
00254 {
00255 Kate::Document::setOpenErrorDialogsActivated (
false);
00256
for (
int z=0; z<args->count(); z++)
00257 {
00258 QString mime = KIO::NetAccess::mimetype( args->url(z), m_mainWindows.first() );
00259
00260
if (mime !=
"inode/directory")
00261 {
00262
if (mime ==
"application/x-kate-project")
00263 m_mainWindows.first()->openProject ( args->url(z).path() );
00264
else
00265 m_mainWindows.first()->kateViewManager()->openURL( args->url(z) );
00266 }
00267
else
00268 KMessageBox::sorry( m_mainWindows.first(), i18n(
"The file '%1' could not be opened: it is not a normal file, it is a folder.").arg(args->url(z).url()) );
00269 }
00270 Kate::Document::setOpenErrorDialogsActivated (
true);
00271
00272
if ( m_mainWindows.first()->kateViewManager()->viewCount () == 0 )
00273 m_mainWindows.first()->kateViewManager()->activateView(m_docManager->firstDocument()->documentNumber());
00274
00275
int line = 0;
00276
int column = 0;
00277
bool nav =
false;
00278
00279
if (args->isSet (
"line"))
00280 {
00281 line = args->getOption (
"line").toInt();
00282 nav =
true;
00283 }
00284
00285
if (args->isSet (
"column"))
00286 {
00287 column = args->getOption (
"column").toInt();
00288 nav =
true;
00289 }
00290
00291
if (nav)
00292 m_mainWindows.first()->kateViewManager()->activeView ()->setCursorPosition (line, column);
00293 }
00294
00295
if (m_firstStart)
00296 {
00297
00298 m_firstStart =
false;
00299
00300
00301 KTipDialog::showTip(m_mainWindows.first());
00302 }
00303
00304
return 0;
00305 }
00306
00307 KateMainWindow *KateApp::newMainWindow ()
00308 {
00309
return newMainWindow (
true);
00310 }
00311
00312 KateMainWindow *KateApp::newMainWindow (
bool visible)
00313 {
00314
if (KateMainWindow::defaultMode==KMdi::UndefinedMode)
00315 {
00316 KConfig *cfg=kapp->config();
00317
00318 QString grp=cfg->group();
00319
00320 cfg->setGroup(
"General");
00321 KateMainWindow::defaultMode = (KMdi::MdiMode) cfg->readNumEntry(
"DefaultGUIMode", KMdi::IDEAlMode);
00322
00323
00324
if ((KateMainWindow::defaultMode != KMdi::IDEAlMode) && (KateMainWindow::defaultMode != KMdi::TabPageMode))
00325 KateMainWindow::defaultMode = KMdi::IDEAlMode;
00326
00327 cfg->setGroup(grp);
00328 }
00329 KateMainWindow *mainWindow =
new KateMainWindow (m_docManager, m_pluginManager, m_projectManager,
00330 (m_restoreGUIMode==KMdi::UndefinedMode)?KateMainWindow::defaultMode:m_restoreGUIMode);
00331 m_mainWindows.append (mainWindow);
00332
00333
if ((mainWindows() > 1) && m_mainWindows.at(m_mainWindows.count()-2)->kateViewManager()->activeView())
00334 mainWindow->kateViewManager()->activateView ( m_mainWindows.at(m_mainWindows.count()-2)->kateViewManager()->activeView()->getDoc()->documentNumber() );
00335
else if ((mainWindows() > 1) && (m_docManager->documents() > 0))
00336 mainWindow->kateViewManager()->activateView ( (m_docManager->document(m_docManager->documents()-1))->documentNumber() );
00337
else if ((mainWindows() > 1) && (m_docManager->documents() < 1))
00338 mainWindow->kateViewManager()->openURL ( KURL() );
00339
00340
if (visible)
00341 mainWindow->show ();
00342
00343
if (!m_firstStart)
00344 {
00345 mainWindow->raise();
00346 KWin::activateWindow (mainWindow->winId());
00347 }
00348
00349
return mainWindow;
00350 }
00351
00352
void KateApp::removeMainWindow (KateMainWindow *mainWindow)
00353 {
00354 m_mainWindows.remove (mainWindow);
00355 }
00356
00357
void KateApp::openURL (
const QString &name)
00358 {
00359
int n = m_mainWindows.find ((KateMainWindow *)activeWindow());
00360
00361
if (n < 0)
00362 n=0;
00363
00364 m_mainWindows.at(n)->kateViewManager()->openURL (KURL(name));
00365
00366 m_mainWindows.at(n)->raise();
00367 KWin::activateWindow (m_mainWindows.at(n)->winId());
00368 }
00369
00370 KateMainWindow *KateApp::activeKateMainWindow ()
00371 {
00372
if (m_mainWindows.isEmpty())
00373
return 0;
00374
00375
int n = m_mainWindows.find ((KateMainWindow *)activeWindow());
00376
00377
if (n < 0)
00378 n=0;
00379
00380
return m_mainWindows.at(n);
00381 }
00382
00383 Kate::MainWindow *KateApp::activeMainWindow ()
00384 {
00385
if (!activeKateMainWindow())
00386
return 0;
00387
00388
return activeKateMainWindow()->mainWindow();
00389 }
00390
00391
void KateApp::raiseCurrentMainWindow ()
00392 {
00393
if (!activeKateMainWindow())
00394
return;
00395
00396 activeKateMainWindow()->raise();
00397 KWin::activateWindow (activeKateMainWindow()->winId());
00398 }