kate Library API Documentation

katedocmanager.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., 59 Temple Place - Suite 330,
00017    Boston, MA 02111-1307, USA.
00018 */
00019 
00020 #include "katedocmanager.h"
00021 #include "katedocmanager.moc"
00022 #include "kateapp.h"
00023 #include "katemainwindow.h"
00024 #include "kateviewmanager.h"
00025 #include "katedocmanageriface.h"
00026 
00027 #include <kate/view.h>
00028 
00029 #include <kparts/factory.h>
00030 
00031 #include <klocale.h>
00032 #include <kdebug.h>
00033 #include <kconfig.h>
00034 #include <kapplication.h>
00035 #include <klibloader.h>
00036 
00037 #include <qtextcodec.h>
00038 #include <qprogressdialog.h>
00039 #include <kmessagebox.h>
00040 #include <kencodingfiledialog.h>
00041 #include <ktexteditor/encodinginterface.h>
00042 
00043 KateDocManager::KateDocManager (QObject *parent) : QObject (parent)
00044 {
00045   m_factory = (KParts::Factory *) KLibLoader::self()->factory ("libkatepart");
00046 
00047   m_documentManager = new Kate::DocumentManager (this);
00048   m_docList.setAutoDelete(true);
00049   m_docDict.setAutoDelete(false);
00050   m_docInfos.setAutoDelete(true);
00051 
00052   m_dcop = new KateDocManagerDCOPIface (this);
00053 
00054   createDoc ();
00055 }
00056 
00057 KateDocManager::~KateDocManager ()
00058 {
00059   delete m_dcop;
00060 }
00061 
00062 Kate::Document *KateDocManager::createDoc ()
00063 {
00064   KTextEditor::Document *doc = (KTextEditor::Document *) m_factory->createPart (0, "", this, "", "KTextEditor::Document");
00065   
00066   m_docList.append((Kate::Document *)doc);
00067   m_docDict.insert (doc->documentNumber(), (Kate::Document *)doc);
00068   m_docInfos.insert (doc, new KateDocumentInfo ());
00069 
00070   if (m_docList.count() < 2)
00071     ((Kate::Document *)doc)->readConfig(kapp->config());
00072 
00073   emit documentCreated ((Kate::Document *)doc);
00074   emit m_documentManager->documentCreated ((Kate::Document *)doc);
00075 
00076   connect(doc,SIGNAL(modifiedOnDisc(Kate::Document *, bool, unsigned char)),this,SLOT(slotModifiedOnDisc(Kate::Document *, bool, unsigned char)));
00077 
00078   return (Kate::Document *)doc;
00079 }
00080 
00081 void KateDocManager::deleteDoc (Kate::Document *doc)
00082 {
00083   uint id = doc->documentNumber();
00084   uint activeId = 0;
00085   if (m_currentDoc)
00086     activeId = m_currentDoc->documentNumber ();
00087 
00088   if (m_docList.count() < 2)
00089     doc->writeConfig(kapp->config());
00090 
00091   m_docInfos.remove (doc);
00092   m_docDict.remove (id);
00093   m_docList.remove (doc);
00094 
00095   emit documentDeleted (id);
00096   emit m_documentManager->documentDeleted (id);
00097 
00098   // ohh, current doc was deleted
00099   if (activeId == id)
00100   {
00101     // special case of documentChanged, no longer any doc here !
00102     m_currentDoc = 0;
00103     
00104     emit documentChanged ();
00105     emit m_documentManager->documentChanged ();
00106   }
00107 }
00108 
00109 Kate::Document *KateDocManager::document (uint n)
00110 {
00111   return m_docList.at(n);
00112 }
00113 
00114 Kate::Document *KateDocManager::activeDocument ()
00115 {
00116   return m_currentDoc;
00117 }
00118 
00119 void KateDocManager::setActiveDocument (Kate::Document *doc)
00120 {
00121   if (!doc)
00122     return;
00123 
00124   if (m_currentDoc && (m_currentDoc->documentNumber() == doc->documentNumber()))
00125     return;
00126 
00127   m_currentDoc = doc;
00128   
00129   emit documentChanged ();
00130   emit m_documentManager->documentChanged ();
00131 }
00132 
00133 Kate::Document *KateDocManager::firstDocument ()
00134 {
00135   return m_docList.first();
00136 }
00137 
00138 Kate::Document *KateDocManager::nextDocument ()
00139 {
00140   return m_docList.next();
00141 }
00142 
00143 Kate::Document *KateDocManager::documentWithID (uint id)
00144 {
00145   return m_docDict[id];
00146 }
00147 
00148 const KateDocumentInfo *KateDocManager::documentInfo (Kate::Document *doc)
00149 {
00150   return m_docInfos[doc];
00151 }
00152 
00153 int KateDocManager::findDocument (Kate::Document *doc)
00154 {
00155   return m_docList.find (doc);
00156 }
00157 
00158 uint KateDocManager::documents ()
00159 {
00160   return m_docList.count ();
00161 }
00162 
00163 int KateDocManager::findDocument ( KURL url )
00164 {
00165   QPtrListIterator<Kate::Document> it(m_docList);
00166 
00167   for (; it.current(); ++it)
00168   {
00169     if ( it.current()->url() == url)
00170       return it.current()->documentNumber();
00171   }
00172   return -1;
00173 }
00174 
00175 Kate::Document *KateDocManager::findDocumentByUrl( KURL url )
00176 {
00177   for (QPtrListIterator<Kate::Document> it(m_docList); it.current(); ++it)
00178   {
00179     if ( it.current()->url() == url)
00180       return it.current();
00181   }
00182   
00183   return 0L;
00184 }
00185 
00186 bool KateDocManager::isOpen(KURL url)
00187 {
00188   // return just if we found some document with this url
00189   return findDocumentByUrl (url) != 0;
00190 }
00191 
00192 Kate::Document *KateDocManager::openURL (const KURL& url,const QString &encoding, uint *id)
00193 {
00194   // special handling if still only the first initial doc is there
00195   if (!documentList().isEmpty() && (documentList().count() == 1) && (!documentList().at(0)->isModified() && documentList().at(0)->url().isEmpty()))
00196   {
00197     Kate::Document* doc = documentList().getFirst();
00198 
00199     doc->setEncoding(encoding.isNull() ? Kate::Document::defaultEncoding() : encoding);
00200 
00201     doc->openURL (url);
00202 
00203     if (id)
00204       *id=doc->documentNumber();
00205 
00206     emit initialDocumentReplaced();
00207 
00208     return doc;
00209  }
00210 
00211   Kate::Document *doc = findDocumentByUrl (url);
00212   if ( !doc )
00213   {
00214     doc = (Kate::Document *)createDoc ();
00215 
00216     doc->setEncoding(encoding.isNull() ? Kate::Document::defaultEncoding() : encoding);
00217 
00218     doc->openURL(url);
00219   }
00220   
00221   if (id)
00222     *id=doc->documentNumber();
00223 
00224   return doc;
00225 }
00226 
00227 bool KateDocManager::closeDocument(class Kate::Document *doc)
00228 {
00229   if (!doc) return false;
00230 
00231   if (!doc->closeURL()) return false;
00232 
00233   QPtrList<Kate::View> closeList;
00234   uint documentNumber = doc->documentNumber();
00235 
00236   for (uint i=0; i < ((KateApp *)kapp)->mainWindows (); i++ )
00237   {
00238      ((KateApp *)kapp)->kateMainWindow(i)->kateViewManager()->closeViews(documentNumber);
00239   }
00240 
00241   deleteDoc (doc);
00242 
00243   return true;
00244 }
00245 
00246 bool KateDocManager::closeDocument(uint n)
00247 {
00248   return closeDocument(document(n));
00249 }
00250 
00251 bool KateDocManager::closeDocumentWithID(uint id)
00252 {
00253   return closeDocument(documentWithID(id));
00254 }
00255 
00256 bool KateDocManager::closeAllDocuments()
00257 {
00258   bool res = true;
00259 
00260   while (!m_docList.isEmpty() && res)
00261     if (! closeDocument(m_docList.at(0)) )
00262       res = false;
00263 
00264   return res;
00265 }
00266 
00267 bool KateDocManager::queryCloseDocuments(KateMainWindow *w)
00268 {  
00269   Kate::Document  *doc;
00270   for (QPtrListIterator<Kate::Document> it(m_docList); (doc=it.current())!=0; ++it)
00271   {
00272     if (doc->url().isEmpty() && doc->isModified())
00273     {
00274       int msgres=KMessageBox::warningYesNoCancel( w,
00275                   i18n("<p>The document '%1' has been modified, but not saved."
00276                        "<p>Do you want to keep it?").arg( doc->docName() ),
00277                     i18n("Unsaved Document") );
00278   
00279       if (msgres==KMessageBox::Cancel)
00280         return false;
00281       
00282       if (msgres==KMessageBox::Yes)
00283       {
00284         KEncodingFileDialog::Result r=KEncodingFileDialog::getSaveURLAndEncoding(
00285               KTextEditor::encodingInterface(doc)->encoding(),QString::null,QString::null,w,i18n("Save As"));
00286 
00287         doc->setEncoding( r.encoding );
00288         
00289         if (!r.URLs.isEmpty())
00290         {
00291           KURL tmp = r.URLs.first();
00292           
00293           if ( !doc->saveAs( tmp ) )
00294             return false;
00295         }
00296         else
00297           return false;
00298       }
00299     }
00300     else
00301     {
00302       if (!doc->queryClose())
00303         return false;
00304     }
00305   }
00306   
00307   return true;
00308 }
00309 
00310 
00311 void KateDocManager::saveDocumentList (KConfig* config)
00312 {
00313   QString prevGrp=config->group();
00314   config->setGroup ("Open Documents");
00315   QString grp = config->group();
00316 
00317   config->writeEntry ("Count", m_docList.count());
00318 
00319   int i=0;
00320   for ( Kate::Document *doc = m_docList.first(); doc; doc = m_docList.next() )
00321   {
00322     config->setGroup(QString("Document %1").arg(i));
00323     doc->writeSessionConfig(config);
00324     config->setGroup(grp);
00325 
00326     i++;
00327   }
00328   
00329   config->setGroup(prevGrp);
00330 }
00331 
00332 void KateDocManager::restoreDocumentList (KConfig* config)
00333 {
00334   QString prevGrp=config->group();
00335   config->setGroup ("Open Documents");
00336   QString grp = config->group();
00337 
00338   int count = config->readNumEntry("Count");
00339 
00340   QProgressDialog *pd=new QProgressDialog(
00341         i18n("Reopening files from the last session..."),
00342         QString::null,
00343         count,
00344         0,
00345         "openprog");
00346 
00347   bool first = true;
00348   for (int i=0; i < count; i++)
00349   {
00350     config->setGroup(QString("Document %1").arg(i));
00351     Kate::Document *doc = 0;
00352     
00353     if (first)
00354     {
00355       first = false;
00356       doc = document (0);
00357     }
00358     else
00359       doc = createDoc ();
00360   
00361     doc->readSessionConfig(config);
00362     config->setGroup (grp);
00363 
00364     pd->setProgress(pd->progress()+1);
00365     kapp->processEvents();
00366   }
00367 
00368   delete pd;
00369 
00370   config->setGroup(prevGrp);
00371 }
00372 
00373 void KateDocManager::slotModifiedOnDisc (Kate::Document *doc, bool b, unsigned char reason)
00374 {
00375   if (m_docInfos[doc])
00376   {
00377     m_docInfos[doc]->modifiedOnDisc = b;
00378     m_docInfos[doc]->modifiedOnDiscReason = reason;
00379   }
00380 }
KDE Logo
This file is part of the documentation for kate Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Mon Aug 16 14:44:15 2004 by doxygen 1.3.6 written by Dimitri van Heesch, © 1997-2003