00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "kateprojectmanager.h"
00020 #include "kateprojectmanager.moc"
00021
00022 #include "kateapp.h"
00023 #include "katemainwindow.h"
00024
00025 #include <kconfig.h>
00026 #include <kcombobox.h>
00027 #include <kdialogbase.h>
00028 #include <kurlrequester.h>
00029 #include <klineedit.h>
00030 #include <klocale.h>
00031 #include <kmessagebox.h>
00032 #include <kfiledialog.h>
00033
00034 #include <qfile.h>
00035 #include <qlayout.h>
00036 #include <qlabel.h>
00037
00038 KateProjectManager::KateProjectManager (QObject *parent) : QObject (parent)
00039 {
00040 m_projects.setAutoDelete (true);
00041 m_projectManager = new Kate::ProjectManager (this);
00042 setupPluginList ();
00043 }
00044
00045 KateProjectManager::~KateProjectManager()
00046 {
00047 while (!m_projects.isEmpty())
00048 {
00049 close (m_projects.at(m_projects.count()-1), true);
00050 }
00051
00052 m_pluginList.setAutoDelete(true);
00053 m_pluginList.clear();
00054 }
00055
00056 void KateProjectManager::setupPluginList ()
00057 {
00058 QValueList<KService::Ptr> traderList= KTrader::self()->query("Kate/ProjectPlugin");
00059
00060 KTrader::OfferList::Iterator it(traderList.begin());
00061 for( ; it != traderList.end(); ++it)
00062 {
00063 KService::Ptr ptr = (*it);
00064
00065 QString pVersion = ptr->property("X-Kate-Version").toString();
00066
00067 if ((pVersion >= "2.2") && (pVersion <= KATE_VERSION))
00068 {
00069 ProjectPluginInfo *info=new ProjectPluginInfo;
00070
00071 info->service = ptr;
00072 info->projectType=info->service->property("X-Kate-ProjectType").toString();
00073
00074 m_pluginList.append(info);
00075 }
00076 }
00077 }
00078
00079 void KateProjectManager::setCurrentProject (Kate::Project *project)
00080 {
00081 m_currentProject = project;
00082
00083 emit m_projectManager->projectChanged ();
00084 }
00085
00086 Kate::Project *KateProjectManager::create (const QString &type, const QString &name, const QString &filename)
00087 {
00088 KConfig *c = new KConfig (filename, false, false);
00089
00090 c->setGroup("Project File");
00091 c->writeEntry ("Type", type);
00092 c->writeEntry ("Name", name);
00093 c->sync ();
00094
00095 delete c;
00096
00097 return open (filename);
00098 }
00099
00100 Kate::Project *KateProjectManager::open (const QString &filename)
00101 {
00102
00103 for (uint z=0; z < m_projects.count(); z++)
00104 if (m_projects.at(z)->fileName() == filename)
00105 return 0;
00106
00107 KateInternalProjectData *data = new KateInternalProjectData ();
00108 data->proMan = this;
00109 data->fileName = filename;
00110
00111 Kate::Project *project = new Kate::Project ((void *) data);
00112
00113 m_projects.append (project);
00114
00115 emit m_projectManager->projectCreated (project);
00116
00117 return project;
00118 }
00119
00120 bool KateProjectManager::close (Kate::Project *project, bool force)
00121 {
00122 if (project)
00123 {
00124 if (project->close() || force)
00125 {
00126 uint id = project->projectNumber ();
00127 int n = m_projects.findRef (project);
00128
00129 if (n >= 0)
00130 {
00131 if (Kate::pluginViewInterface(project->plugin()))
00132 {
00133 for (uint i=0; i< ((KateApp*)parent())->mainWindows(); i++)
00134 {
00135 Kate::pluginViewInterface(project->plugin())->removeView(((KateApp*)parent())->mainWindow(i));
00136 }
00137 }
00138
00139 m_projects.remove (n);
00140
00141 emit m_projectManager->projectDeleted (id);
00142
00143 return true;
00144 }
00145 }
00146 }
00147
00148 return false;
00149 }
00150
00151 Kate::Project *KateProjectManager::project (uint n)
00152 {
00153 if (n >= m_projects.count())
00154 return 0;
00155
00156 return m_projects.at(n);
00157 }
00158
00159 uint KateProjectManager::projects ()
00160 {
00161 return m_projects.count ();
00162 }
00163
00164 Kate::ProjectPlugin *KateProjectManager::createPlugin (Kate::Project *project)
00165 {
00166 ProjectPluginInfo *def = 0;
00167 ProjectPluginInfo *info = 0;
00168
00169 for (uint i=0; i<m_pluginList.count(); i++)
00170 {
00171 if (m_pluginList.at(i)->projectType == project->type())
00172 {
00173 info = m_pluginList.at(i);
00174 break;
00175 }
00176 else if (m_pluginList.at(i)->projectType == QString ("Default"))
00177 def = m_pluginList.at(i);
00178 }
00179
00180 if (!info)
00181 info = def;
00182
00183 return Kate::createProjectPlugin (QFile::encodeName(info->service->library()), project);
00184 }
00185
00186 void KateProjectManager::enableProjectGUI (Kate::Project *project, KateMainWindow *win)
00187 {
00188 if (!project->plugin()) return;
00189 if (!Kate::pluginViewInterface(project->plugin())) return;
00190
00191 Kate::pluginViewInterface(project->plugin())->addView(win->mainWindow());
00192 }
00193
00194 void KateProjectManager::disableProjectGUI (Kate::Project *project, KateMainWindow *win)
00195 {
00196 if (!project->plugin()) return;
00197 if (!Kate::pluginViewInterface(project->plugin())) return;
00198
00199 Kate::pluginViewInterface(project->plugin())->removeView(win->mainWindow());
00200 }
00201
00202 ProjectInfo *KateProjectManager::newProjectDialog (QWidget *parent)
00203 {
00204 ProjectInfo *info = 0;
00205
00206 KateProjectDialogNew* dlg = new KateProjectDialogNew (parent, this);
00207
00208 int n = dlg->exec();
00209
00210 if (n)
00211 {
00212 info = new ProjectInfo ();
00213 info->type = dlg->type;
00214 info->name = dlg->name;
00215 info->fileName = dlg->fileName;
00216 }
00217
00218 delete dlg;
00219 return info;
00220 }
00221
00222 QStringList KateProjectManager::pluginStringList ()
00223 {
00224 QStringList list;
00225
00226 for (uint i=0; i<m_pluginList.count(); i++)
00227 list.push_back (m_pluginList.at(i)->projectType);
00228
00229 return list;
00230 }
00231
00232 bool KateProjectManager::queryCloseAll ()
00233 {
00234 for (uint z=0; z < m_projects.count(); z++)
00235 if (!m_projects.at(z)->queryClose())
00236 return false;
00237
00238 return true;
00239 }
00240
00241 bool KateProjectManager::closeAll ()
00242 {
00243 while (!m_projects.isEmpty())
00244 {
00245 if (!close(m_projects.at(m_projects.count()-1)))
00246 return false;
00247 }
00248
00249 return true;
00250 }
00251
00252 void KateProjectManager::saveProjectList (class KConfig *config)
00253 {
00254 QString prevGrp=config->group();
00255 config->setGroup ("Open Projects");
00256
00257 config->writeEntry ("Count", m_projects.count());
00258
00259 for (uint z=0; z < m_projects.count(); z++)
00260 config->writeEntry( QString("Project %1").arg(z), m_projects.at(z)->fileName() );
00261
00262 config->setGroup(prevGrp);
00263 }
00264
00265 void KateProjectManager::restoreProjectList (class KConfig *config)
00266 {
00267 config->setGroup ("Open Projects");
00268
00269 int count = config->readNumEntry("Count");
00270
00271 int i = 0;
00272 while ((i < count) && config->hasKey(QString("Project %1").arg(i)))
00273 {
00274 QString fn = config->readEntry( QString("Project %1").arg( i ) );
00275
00276 if ( !fn.isEmpty() )
00277 open (fn);
00278
00279 i++;
00280 }
00281 }
00282
00283
00284
00285
00286
00287 KateProjectDialogNew::KateProjectDialogNew (QWidget *parent, KateProjectManager *projectMan) : KDialogBase (parent, "project_new", true, i18n ("New Project"), KDialogBase::Ok|KDialogBase::Cancel)
00288 {
00289 m_projectMan = projectMan;
00290
00291 QWidget *page = new QWidget( this );
00292 setMainWidget(page);
00293
00294 QGridLayout *grid = new QGridLayout (page, 3, 2, 0, spacingHint());
00295
00296 grid->addWidget (new QLabel (i18n("Project type:"), page), 0, 0);
00297 m_typeCombo = new KComboBox (page);
00298 grid->addWidget (m_typeCombo, 0, 1);
00299
00300 m_typeCombo->insertStringList (m_projectMan->pluginStringList ());
00301
00302 grid->addWidget (new QLabel (i18n("Project name:"), page), 1, 0);
00303 m_nameEdit = new KLineEdit (page);
00304 grid->addWidget (m_nameEdit, 1, 1);
00305 connect( m_nameEdit, SIGNAL( textChanged ( const QString & )),this,SLOT(slotTextChanged()));
00306 grid->addWidget (new QLabel (i18n("Project file:"), page), 2, 0);
00307 m_urlRequester = new KURLRequester (page);
00308 grid->addWidget (m_urlRequester, 2, 1);
00309 m_nameEdit->setFocus();
00310
00311 m_urlRequester->setMode (KFile::LocalOnly);
00312 m_urlRequester->fileDialog()->setOperationMode (KFileDialog::Saving);
00313 m_urlRequester->setFilter (QString ("*.kateproject|")
00314 + i18n("Kate Project Files") + QString (" (*.kateproject)"));
00315 connect( m_urlRequester->lineEdit(), SIGNAL( textChanged ( const QString & )),this,SLOT(slotTextChanged()));
00316 slotTextChanged();
00317 }
00318
00319 KateProjectDialogNew::~KateProjectDialogNew ()
00320 {
00321 }
00322
00323 void KateProjectDialogNew::slotTextChanged()
00324 {
00325 enableButtonOK( !m_urlRequester->lineEdit()->text().isEmpty() && !m_nameEdit->text().isEmpty());
00326 }
00327
00328 int KateProjectDialogNew::exec()
00329 {
00330 int n = 0;
00331
00332 while ((n = KDialogBase::exec()))
00333 {
00334 type = m_typeCombo->currentText ();
00335 name = m_nameEdit->text ();
00336 fileName = m_urlRequester->url ();
00337
00338 if (!name.isEmpty() && !fileName.isEmpty())
00339 break;
00340 else
00341 KMessageBox::sorry (this, i18n ("You must enter a project name and file"));
00342 }
00343
00344 if (!fileName.endsWith (".kateproject"))
00345 fileName.append (".kateproject");
00346
00347 return n;
00348 }