KDevelop API Documentation

haskellprojectoptionsdlg.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002                           haskellprojectoptionsdlg.cpp  -  description
00003                              -------------------
00004     begin                : Fri Aug 15 2003
00005     copyright            : (C) 2003 by Peter Robinson
00006     email                : listener@thaldyron.com
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 #include <kurlrequester.h>
00018 #include <kservice.h>
00019 #include <kdebug.h>
00020 #include <kmessagebox.h>
00021 #include <klocale.h>
00022 
00023 #include <qlineedit.h>
00024 #include <qcombobox.h>
00025 #include <qregexp.h>
00026 #include <qvalidator.h>
00027 
00028 #include "domutil.h"
00029 #include "kdevcompileroptions.h"
00030 
00031 #include "haskellproject_part.h"
00032 #include "haskellprojectoptionsdlg.h"
00033 
00034 HaskellProjectOptionsDlg::HaskellProjectOptionsDlg( HaskellProjectPart *part, QWidget* parent,
00035                                                const char* name, WFlags fl )
00036     : HaskellProjectOptionsDlgBase( parent, name, fl ),
00037       _part( part )          
00038 {
00039     config_combo->setValidator( new QRegExpValidator( QRegExp( "^\\D.*" ), this ) );
00040 
00041     offers = KTrader::self()->query( "KDevelop/CompilerOptions",
00042                                      "[X-KDevelop-Language] == 'Haskell'" );
00043     insertServicesIntoDlg( offers );
00044 
00045     if ( offers.isEmpty() ) {
00046         options_button->setEnabled(false);
00047     }
00048     
00049     _allConfigs = allBuildConfigs();
00050     config_combo->insertStringList( _allConfigs );
00051 
00052     _dirty = false;
00053 
00054     QDomDocument &dom = *( _part->projectDom() );
00055     _currentConfig = QString::null;
00056     configChanged(DomUtil::readEntry(dom,
00057                                 "/kdevhaskellproject/general/useconfiguration",
00058                                 "default" ) );
00059 }
00060 
00061 HaskellProjectOptionsDlg::~HaskellProjectOptionsDlg()
00062 {
00063 }
00064 
00065 QStringList HaskellProjectOptionsDlg::allBuildConfigs()
00066 {
00067     QDomDocument &dom = *(_part->projectDom());
00068 
00069     QStringList allConfigs;
00070     allConfigs.append("default");
00071 
00072     QDomNode node = dom.documentElement().namedItem("kdevhaskellproject").namedItem("configurations");
00073     QDomElement childEl = node.firstChild().toElement();
00074 
00075     while (!childEl.isNull()) {
00076         QString config = childEl.tagName();
00077         kdDebug() << "Found config " << config << endl;
00078         if (config != "default")
00079             allConfigs.append(config);
00080         childEl = childEl.nextSibling().toElement();
00081     }
00082 
00083     return allConfigs;
00084 }
00085 
00086 void HaskellProjectOptionsDlg::accept()
00087 {
00088     DomUtil::writeEntry(*_part->projectDom(),
00089                         "/kdevhaskellproject/general/useconfiguration",
00090                         _currentConfig);
00091     if (_dirty)
00092     {
00093         saveConfig(_currentConfig);
00094     }
00095 }
00096 
00097 void HaskellProjectOptionsDlg::compiler_box_activated( const QString& )
00098 {
00099     QString exec = currentCompBoxText( _serviceExecs );
00100     exec_edit->setText( exec );
00101 }
00102 
00103 void HaskellProjectOptionsDlg::saveConfig( QString config )
00104 {
00105     QDomDocument dom = *_part->projectDom();
00106     QString prefix = "/kdevhaskellproject/configurations/" + config + "/";
00107 
00108     DomUtil::writeEntry( dom, prefix + "compiler",
00109                          currentCompBoxText( _serviceNames ) );
00110     DomUtil::writeEntry( dom, prefix + "compileroptions", options_edit->text());
00111     DomUtil::writeEntry( dom, prefix + "compilerexec", exec_edit->text() );
00112     DomUtil::writeEntry( dom, prefix + "mainsource",
00113                         mainSourceUrl->url().replace( QRegExp( _part->projectDirectory() +
00114                                                                QString( "/" ) ),"" ) );
00115 }
00116 
00117 void HaskellProjectOptionsDlg::readConfig( QString config )
00118 {
00119     QDomDocument dom = *_part->projectDom();
00120     QString prefix = "/kdevhaskellproject/configurations/" + config + "/";
00121 
00122     QString compiler = DomUtil::readEntry(dom, prefix + "compiler", "");
00123 
00124     if (compiler.isEmpty())
00125     {
00126         offers = KTrader::self()->query("KDevelop/CompilerOptions", "[X-KDevelop-Language] == 'Haskell'");
00127         QValueList<KService::Ptr>::ConstIterator it;
00128         for (it = offers.begin(); it != offers.end(); ++it) {
00129             if ((*it)->property("X-KDevelop-Default").toBool()) {
00130                 compiler = (*it)->name();
00131                 kdDebug() << "compiler is " << compiler << endl;
00132                 break;
00133             }
00134         }
00135     }
00136     setCurrentCompBoxText( compiler, _serviceNames );
00137 
00138     QString exec = DomUtil::readEntry(dom, prefix + "compilerexec", "");
00139     if (exec.isEmpty())
00140       exec = currentCompBoxText( _serviceExecs );
00141     exec_edit->setText(exec);
00142     options_edit->setText(DomUtil::readEntry(dom, prefix + "compileroptions"));
00143     mainSourceUrl->setURL(_part->projectDirectory() + "/"
00144                           + DomUtil::readEntry(dom, prefix + "mainsource") ); 
00145 }
00146 
00147 void HaskellProjectOptionsDlg::configComboTextChanged(const QString &config)
00148 {
00149     bool canAdd = !_allConfigs.contains(config) && !config.contains("/")
00150                   && !config.isEmpty();
00151     bool canRemove = _allConfigs.contains(config) && config != "default";
00152     addconfig_button->setEnabled(canAdd);
00153     removeconfig_button->setEnabled(canRemove);
00154 }
00155 
00156 
00157 void HaskellProjectOptionsDlg::configChanged(const QString &config)
00158 {
00159     if (config == _currentConfig || !_allConfigs.contains(config))
00160         return;
00161 
00162     if (!_currentConfig.isNull() && _dirty)
00163         saveConfig(_currentConfig);
00164 
00165     _currentConfig = config;
00166     readConfig(config);
00167     _dirty = false;
00168 
00169     config_combo->blockSignals(true);
00170     config_combo->setEditText(config);
00171     config_combo->blockSignals(false);
00172 }
00173 
00174 
00175 void HaskellProjectOptionsDlg::configAdded()
00176 {
00177     QString config = config_combo->currentText();
00178 
00179     _allConfigs.append(config);
00180 
00181     config_combo->clear();
00182     config_combo->insertStringList(_allConfigs);
00183     configChanged(config);
00184     setDirty(); // force saving
00185 }
00186 
00187 
00188 void HaskellProjectOptionsDlg::configRemoved()
00189 {
00190     QString config = config_combo->currentText();
00191 
00192     QDomDocument dom = *_part->projectDom();
00193     QDomNode node = dom.documentElement().namedItem( "kdevhaskellproject" ).namedItem("configurations");
00194     node.removeChild(node.namedItem(config));
00195     _allConfigs.remove(config);
00196 
00197     config_combo->clear();
00198     config_combo->insertStringList( _allConfigs );
00199 
00200     _currentConfig = QString::null;
00201     configChanged( "default" );
00202 }
00203 
00204 void HaskellProjectOptionsDlg::optionsButtonClicked( )
00205 {
00206     QString name = currentCompBoxText( _serviceNames );
00207     KDevCompilerOptions *plugin = _part->createCompilerOptions( name );
00208 
00209     if ( plugin ) {
00210         QString flags = plugin->exec(this, options_edit->text());
00211         options_edit->setText(flags);
00212         delete plugin;
00213     }
00214 }
00215 
00216 void HaskellProjectOptionsDlg::setDirty( )
00217 {
00218     _dirty = true;
00219 }
00220 
00221 void HaskellProjectOptionsDlg::setDefaultOptions( )
00222 {
00223     // @todo FIXME!
00224     if (!compiler_box->currentText().isEmpty()) {
00225         options_edit->setText( _part->defaultOptions( compiler_box->currentText() ) );
00226     }
00227 }
00228 
00229 void HaskellProjectOptionsDlg::insertServicesIntoDlg( const QValueList<KService::Ptr> &list )
00230 {
00231     QValueList<KService::Ptr>::ConstIterator it;
00232     for( it = list.begin(); it != list.end(); ++it ) {
00233         compiler_box->insertItem( (*it)->comment() );
00234         _serviceNames << (*it)->name();
00235         _serviceExecs << (*it)->exec();
00236         kdDebug() << "insertStringList item " << (*it)->name() << "," << (*it)->exec() << endl;
00237     }
00238 }
00239 
00240 QString HaskellProjectOptionsDlg::currentCompBoxText( const QStringList &names )
00241 {
00242     if( compiler_box->currentItem() == -1 ) {
00243       return QString::null;
00244     }
00245     else {
00246         return names[compiler_box->currentItem()];
00247       }
00248 }
00249 
00250 
00251 void HaskellProjectOptionsDlg::setCurrentCompBoxText( const QString &str, const QStringList &names)
00252 {
00253     QStringList::ConstIterator it;
00254     int i = 0;
00255     for (it = names.begin(); it != names.end(); ++it) {
00256         if (*it == str) {
00257             compiler_box->setCurrentItem(i);
00258             break;
00259         }
00260         ++i;
00261     }
00262 }
00263 
00264 QString HaskellProjectOptionsDlg::defaultCompiler()
00265 {
00266     KTrader::OfferList offers = KTrader::self()->query("KDevelop/CompilerOptions", "[X-KDevelop-Language] == 'Haskell'");
00267     QValueList<KService::Ptr>::ConstIterator it;
00268     for (it = offers.begin(); it != offers.end(); ++it) {
00269         if ((*it)->property("X-KDevelop-Default").toBool()) {
00270             return (*it)->name();;
00271         }
00272     }
00273     return "";
00274 }
00275 
00276 int HaskellProjectOptionsDlg::itemForText(const QString &str, const QStringList &names)
00277 {
00278     QStringList::ConstIterator it;
00279     int i = 0;
00280     for( it = names.begin(); it != names.end(); ++it ) {
00281         if( *it == str ) {
00282             return i;
00283         }
00284         ++i;
00285     }
00286     return 0;
00287 }
00288 
00289 #include "haskellprojectoptionsdlg.moc"
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Feb 22 09:22:22 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003