KDevelop API Documentation

languages/cpp/createpcsdialog.cpp

Go to the documentation of this file.
00001 /*************************************************************************** 00002 * Copyright (C) 2003 by Roberto Raggi * 00003 * roberto@kdevelop.org * 00004 * * 00005 * This program is free software; you can redistribute it and/or modify * 00006 * it under the terms of the GNU General Public License as published by * 00007 * the Free Software Foundation; either version 2 of the License, or * 00008 * (at your option) any later version. * 00009 * * 00010 ***************************************************************************/ 00011 00012 #include "createpcsdialog.h" 00013 #include "createpcsdialog.moc" 00014 #include "driver.h" 00015 #include "tag_creator.h" 00016 #include "cppsupportpart.h" 00017 00018 #include <catalog.h> 00019 #include <kdevpcsimporter.h> 00020 #include <kdevcoderepository.h> 00021 00022 #include <kparts/componentfactory.h> 00023 00024 #include <ktrader.h> 00025 #include <kdebug.h> 00026 #include <klibloader.h> 00027 #include <klistbox.h> 00028 #include <kiconloader.h> 00029 #include <klistview.h> 00030 #include <kapplication.h> 00031 #include <kinstance.h> 00032 #include <kstandarddirs.h> 00033 00034 #include <qprogressbar.h> 00035 #include <qheader.h> 00036 #include <qlabel.h> 00037 #include <qprocess.h> 00038 #include <qregexp.h> 00039 #include <qlayout.h> 00040 00041 #include <stdlib.h> 00042 #include <unistd.h> 00043 00044 class CreatePCSDialog::RppDriver: public Driver 00045 { 00046 public: 00047 RppDriver( Catalog* c ) 00048 : catalog( c ) 00049 { 00050 setup(); 00051 } 00052 00053 virtual ~RppDriver() 00054 { 00055 #if 0 00056 TagCreator::destroyDocumentation(); 00057 #endif 00058 } 00059 00060 #if 0 00061 void addDocDirectory( const QString& dir ) 00062 { 00063 m_docDirectoryList.append( dir ); 00064 TagCreator::setDocumentationDirectories( m_docDirectoryList ); 00065 } 00066 #endif 00067 00068 void fileParsed( const QString& fileName ) 00069 { 00071 00072 #if 0 00073 QValueList<Problem> l = problems( fileName ); 00074 QValueList<Problem>::Iterator it = l.begin(); 00075 while( it != l.end() ){ 00076 const Problem& p = *it; 00077 ++it; 00078 } 00079 #endif 00080 00081 TranslationUnitAST::Node ast = takeTranslationUnit( fileName ); 00082 00083 TagCreator w( fileName, catalog ); 00084 w.parseTranslationUnit( ast.get() ); 00085 00086 //if( !isResolveDependencesEnabled() ) 00087 // removeAllMacrosInFile( fileName ); 00088 } 00089 00090 // setup the preprocessor 00091 // code provided by Reginald Stadlbauer <reggie@trolltech.com> 00092 void setup() 00093 { 00094 QProcess proc; 00095 proc.addArgument( "gcc" ); 00096 proc.addArgument( "-print-file-name=include" ); 00097 if ( !proc.start() ) { 00099 return; 00100 } 00101 00102 while ( proc.isRunning() ) 00103 usleep( 1 ); 00104 00105 QString gccLibPath = proc.readStdout(); 00106 gccLibPath = gccLibPath.replace( QRegExp("[\r\n]"), "" ); 00107 addIncludePath( gccLibPath ); 00108 //addIncludePath( "/usr/include/g++-3" ); 00109 //addIncludePath( "/usr/include/g++" ); 00110 proc.clearArguments(); 00111 proc.addArgument( "gcc" ); 00112 proc.addArgument( "-E" ); 00113 proc.addArgument( "-dM" ); 00114 proc.addArgument( "-ansi" ); 00115 proc.addArgument( "-" ); 00116 00117 if ( !proc.start() ) { 00119 return; 00120 } 00121 00122 while ( !proc.isRunning() ) 00123 usleep( 1 ); 00124 proc.closeStdin(); 00125 while ( proc.isRunning() ) 00126 usleep( 1 ); 00127 00128 while ( proc.canReadLineStdout() ) { 00129 QString l = proc.readLineStdout(); 00130 QStringList lst = QStringList::split( ' ', l ); 00131 if ( lst.count() != 3 ) 00132 continue; 00133 00134 addMacro( Macro( lst[1], lst[2] ) ); 00135 } 00136 addMacro( Macro( "__cplusplus", "1" ) ); 00137 } 00138 00139 private: 00140 Catalog* catalog; 00141 #if 0 00142 QStringList m_docDirectoryList; 00143 #endif 00144 }; 00145 00146 00147 class PCSListViewItem: public KListViewItem 00148 { 00149 public: 00150 PCSListViewItem( KService::Ptr ptr, KDevPCSImporter* importer, QListViewItem* parent ) 00151 : KListViewItem( parent ), m_importer( importer ) { init( ptr ); } 00152 PCSListViewItem( KService::Ptr ptr, KDevPCSImporter* importer, QListView* parent ) 00153 : KListViewItem( parent ), m_importer( importer ) { init( ptr ); } 00154 00155 ~PCSListViewItem() 00156 { 00157 delete( m_importer ); 00158 m_importer = 0; 00159 } 00160 00161 void init( KService::Ptr ptr ) 00162 { 00163 setText( 0, ptr->comment() ); 00164 setPixmap( 0, SmallIcon(ptr->icon()) ); 00165 } 00166 00167 KDevPCSImporter* importer() { return m_importer; } 00168 00169 private: 00170 KDevPCSImporter* m_importer; 00171 }; 00172 00173 CreatePCSDialog::CreatePCSDialog(CppSupportPart* part, QWidget* parent, const char* name, bool modal, WFlags fl) 00174 : CreatePCSDialogBase(parent,name, modal,fl), m_part( part ) 00175 { 00176 m_settings = 0; 00177 importerListView->header()->hide(); 00178 00179 KTrader::OfferList lst = KTrader::self()->query( "KDevelop/PCSImporter" ); 00180 kdDebug(9007) << "====================> found " << lst.size() << " importers" << endl; 00181 00182 for( KTrader::OfferList::Iterator it=lst.begin(); it!=lst.end(); ++it ) 00183 { 00184 KService::Ptr ptr = *it; 00185 00186 int error = 0; 00187 KDevPCSImporter* importer = KParts::ComponentFactory::createInstanceFromService<KDevPCSImporter>( ptr, this, ptr->name().latin1(), QStringList(), &error ); 00188 if( importer ){ 00189 new PCSListViewItem( ptr, importer, importerListView ); 00190 } 00191 } 00192 00193 setNextEnabled( page, false ); 00194 00195 QHBoxLayout* hbox = new QHBoxLayout( settingsPage ); 00196 hbox->setAutoAdd( true ); 00197 00198 if ( importerListView->firstChild() ) 00199 { 00200 importerListView->setSelected( importerListView->firstChild(), true ); 00201 setNextEnabled( page, true ); 00202 } 00203 } 00204 00205 CreatePCSDialog::~CreatePCSDialog() 00206 { 00207 } 00208 00209 /*$SPECIALIZATION$*/ 00210 void CreatePCSDialog::back() 00211 { 00212 QWizard::back(); 00213 } 00214 00215 void CreatePCSDialog::next() 00216 { 00217 QWizard::next(); 00218 } 00219 00220 void CreatePCSDialog::reject() 00221 { 00222 QWizard::reject(); 00223 } 00224 00225 void CreatePCSDialog::accept() 00226 { 00227 QWizard::accept(); 00228 } 00229 00230 void CreatePCSDialog::slotSelected( const QString & ) 00231 { 00232 if( currentPage() == settingsPage ) { 00233 if( m_settings ) 00234 delete( m_settings ); 00235 00236 KDevPCSImporter* importer = static_cast<PCSListViewItem*>( importerListView->selectedItem() )->importer(); 00237 m_settings = importer->createSettingsPage( settingsPage ); 00238 setNextEnabled( currentPage(), false ); 00239 setHelpEnabled( currentPage(), false ); 00240 connect( m_settings, SIGNAL(enabled(int)), this, SLOT(setNextPageEnabled(int)) ); 00241 00242 if( m_settings ) 00243 setHelpEnabled( m_settings, false ); 00244 m_settings->show(); 00245 } else if( currentPage() == finalPage ) { 00246 setBackEnabled( currentPage(), false ); 00247 setNextEnabled( currentPage(), false ); 00248 00249 KDevPCSImporter* importer = static_cast<PCSListViewItem*>( importerListView->selectedItem() )->importer(); 00250 QStringList fileList = importer->fileList(); 00251 progressBar->setTotalSteps( fileList.size() ); 00252 progressBar->setPercentageVisible( true ); 00253 int n = 0; 00254 00255 KStandardDirs *dirs = m_part->instance()->dirs(); 00256 00257 QString dbName = dirs->saveLocation( "data", "kdevcppsupport/pcs" ) + "/" + importer->dbName() + ".db"; 00258 kdDebug(9007) << "================================> dbName = " << dbName << endl; 00259 00260 m_part->removeCatalog( dbName ); 00261 00262 Catalog* c = new Catalog(); 00263 c->open( dbName ); 00264 c->addIndex( "kind" ); 00265 c->addIndex( "name" ); 00266 c->addIndex( "scope" ); 00267 c->addIndex( "fileName" ); 00268 00269 RppDriver driver( c ); 00270 for( QStringList::Iterator it=fileList.begin(); it!=fileList.end(); ++it ) 00271 { 00272 //kdDebug(9007) << "==========> parsing: " << *it << endl; 00273 progressBar->setProgress( ++n ); 00274 currentFile->setText( *it ); 00275 driver.parseFile( *it ); 00276 kapp->processEvents(); 00277 } 00278 00279 currentFile->setText( "" ); 00280 m_part->addCatalog( c ); 00281 00282 setFinishEnabled( currentPage(), true ); 00283 } 00284 } 00285 00286 void CreatePCSDialog::setNextPageEnabled( int enabled ) 00287 { 00288 setNextEnabled( currentPage(), enabled ); 00289 } 00290 00291 void CreatePCSDialog::slotSelectionChanged( QListViewItem * item ) 00292 { 00293 setNextPageEnabled( item != 0 ); 00294 }
KDE Logo
This file is part of the documentation for KDevelop Version 3.0.4.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Oct 19 08:01:42 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003