KDevelop API Documentation

removetargetdlg.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002                              -------------------
00003     begin                : 21.11.2002
00004     copyright            : (C) 2002 by Victor Röder
00005     email                : victor_roeder@gmx.de
00006  ***************************************************************************/
00007 
00008 /***************************************************************************
00009  *                                                                         *
00010  *   This program is free software; you can redistribute it and/or modify  *
00011  *   it under the terms of the GNU General Public License as published by  *
00012  *   the Free Software Foundation; either version 2 of the License, or     *
00013  *   (at your option) any later version.                                   *
00014  *                                                                         *
00015  ***************************************************************************/
00016 
00017 #include "removetargetdlg.h"
00018 
00019 #include <qapplication.h>
00020 #include <qcheckbox.h>
00021 #include <qgroupbox.h>
00022 #include <qfile.h>
00023 #include <qlabel.h>
00024 #include <qlayout.h>
00025 #include <qpushbutton.h>
00026 #include <qregexp.h>
00027 
00028 #include <kbuttonbox.h>
00029 #include <kdebug.h>
00030 #include <kdialog.h>
00031 #include <klistbox.h>
00032 #include <kprogress.h>
00033 #include <ksqueezedtextlabel.h>
00034 #include <klocale.h>
00035 
00036 #include "autolistviewitems.h"
00037 
00038 #include "misc.h"
00039 
00040 #include "autoprojectpart.h"
00041 #include "autoprojectwidget.h"
00042 
00043 
00044 RemoveTargetDialog::RemoveTargetDialog( AutoProjectWidget *widget, AutoProjectPart* part, SubprojectItem *spitem,
00045                     TargetItem *titem, QWidget* parent, const char* name )
00046   : RemoveTargetDlgBase ( parent, name, true, 0 )
00047 {
00048     removeLabel->setText ( i18n ( "Do you really want to remove <b>%1</b><br>with <b>all files</b> that are attached to it<br>and <b>all dependencies</b>?" ).arg ( titem->name ) );
00049     directoryLabel->setText ( spitem->path );
00050     
00051     if ( titem->name.isEmpty() )
00052         targetLabel->setText ( i18n ( "%1 in %2" ).arg ( titem->primary ).arg ( titem->prefix ) );
00053     else
00054         targetLabel->setText ( titem->name );
00055     
00056     connect ( removeButton, SIGNAL ( clicked() ), this, SLOT ( accept() ) );
00057     connect ( cancelButton, SIGNAL ( clicked() ), this, SLOT ( reject() ) );
00058 
00059     setIcon ( SmallIcon ( "editdelete" ) );
00060 
00061     progressBar->hide();
00062 
00063     m_spitem = spitem;
00064     m_titem = titem;
00065     m_widget = widget;
00066     m_part = part;
00067 
00068     //kdDebug ( 9000 ) << "+++++ " << titem->primary << " " << titem->prefix << " " << titem->name << endl;
00069 
00070     init();
00071 }
00072 
00073 
00074 RemoveTargetDialog::~RemoveTargetDialog()
00075 {
00076 }
00077 
00078 void RemoveTargetDialog::init()
00079 {
00080     QPtrList <SubprojectItem> subprojectItems = m_widget->allSubprojectItems();
00081 
00082     TargetItem* titem = 0;
00083 
00084     for ( SubprojectItem* spitem = subprojectItems.first(); spitem; spitem = subprojectItems.next() )
00085     {
00086         if ( m_titem->name.isEmpty() )
00087             break;
00088 
00089         for ( titem = spitem->targets.first(); titem; titem = spitem->targets.next() )
00090         {
00091             if ( m_titem->name == titem->name )
00092                 continue;
00093 
00094             if ( titem->primary == "LTLIBRARIES" || titem->primary == "PROGRAMS" 
00095                 || titem->primary == "LIBRARIES"  || titem->primary == "JAVA" )
00096             {
00097                 QString canonname = AutoProjectTool::canonicalize ( titem->name );
00098 
00099                 if ( spitem->variables[canonname + "_LIBADD"].contains ( m_titem->name ) > 0 ||
00100                     spitem->variables[canonname + "_LDADD"].contains ( m_titem->name ) > 0 )
00101                 {
00102                     dependencyListBox->insertItem ( SmallIcon ( "target_kdevelop" ), spitem->path + " (" + titem->name + ")" );
00103 
00104                     dependentSubprojects.append ( spitem );
00105                 }
00106             }
00107         }
00108     }
00109 
00110     if ( dependencyListBox->count() == 0 )
00111         dependencyListBox->insertItem ( i18n("no dependency", "<none>") );
00112 }
00113 
00114 void RemoveTargetDialog::accept ()
00115 {
00116     progressBar->show();
00117     progressBar->setFormat ( i18n ( "Removing Target... %p%" ) );
00118 
00119     qApp->processEvents();
00120 
00121     QString canonname = AutoProjectTool::canonicalize ( m_titem->name );
00122     QString varname = m_titem->prefix + "_" + m_titem->primary;
00123 
00124     SubprojectItem* spitem = 0;
00125     TargetItem* titem = 0;
00126 
00127     QMap <QString, QString> removeMap;
00128     QMap <QString, QString> replaceMap;
00129 
00130     // Remove dependencies to other targets first (stored by init() in 'dependentTargets')
00131     for ( spitem = dependentSubprojects.first(); spitem; spitem = dependentSubprojects.next() )
00132     {
00133         for ( titem = spitem->targets.first(); titem; titem = spitem->targets.next() )
00134         {
00135             QString curVarname;
00136             QString curCanonname = AutoProjectTool::canonicalize ( titem->name );
00137             QStringList dependencies;
00138 
00139             if ( spitem->variables[curCanonname + "_LIBADD"].contains ( m_titem->name ) )
00140                 curVarname = curCanonname + "_LIBADD";
00141             else
00142                 curVarname = curCanonname + "_LDADD";
00143 
00144             dependencies = QStringList::split(QRegExp("[ \t\n]"), spitem->variables[curVarname]);
00145 
00146             //QStringList::Iterator it = dependencies.begin();
00147 
00148             for ( uint i = 0; i < dependencies.size(); ++i )
00149             {
00150                 QString s = dependencies[i];
00151                 if ( s.contains ( m_titem->name ) > 0 )
00152                     dependencies.remove ( s );
00153             }
00154 
00155             // if we removed the last entry of "blabla_LDADD" or "blabla_LIBADD", remove the complete line
00156             if ( dependencies.count() == 0 )
00157             {
00158                 removeMap.insert ( curVarname, "" );
00159 
00160                 AutoProjectTool::removeFromMakefileam ( spitem->path + "/Makefile.am", removeMap );
00161 
00162                 removeMap.clear();
00163             }
00164             else
00165             {
00166                 spitem->variables[curVarname] = dependencies.join ( " " );
00167 
00168                 replaceMap.insert ( curVarname, spitem->variables[curVarname] );
00169 
00170                 AutoProjectTool::modifyMakefileam ( spitem->path + "/Makefile.am", replaceMap );
00171 
00172                 replaceMap.clear();
00173             }
00174         }
00175     }
00176 
00177     // handling am_edit stuff
00178     if ( m_titem->primary == "KDEICON" )
00179         removeMap.insert ( "KDE_ICON", "" );
00180     else if ( m_titem->primary == "KDEDOCS" )
00181         removeMap.insert ( "KDE_DOCS", "" );
00182     else
00183     {
00184         // if we have bin_PROGRAMS = [target to be deleted] [other target]
00185         // delete only the [target to be deleted], not the whole line!
00186         QStringList targets = QStringList::split(QRegExp("[ \t\n]"), m_spitem->variables[varname]);
00187         
00188         if ( targets.count() > 1 )
00189         {
00190             targets.remove ( m_titem->name );
00191             m_spitem->variables[varname] = targets.join ( " " );
00192             replaceMap.insert ( varname, m_spitem->variables[varname] );
00193             AutoProjectTool::modifyMakefileam ( m_spitem->path + "/Makefile.am", replaceMap );
00194             replaceMap.clear();
00195         }
00196         else
00197         {
00198             removeMap.insert ( varname, m_titem->name );
00199         }
00200     }
00201         
00202     // if we have no such line containing blabla_SOURCES, blabla_LDFLAGS, etc.
00203     // they are ignored
00204     removeMap.insert ( canonname + "_SOURCES", "" );
00205 
00206     if ( m_titem->primary == "PROGRAMS" || m_titem->primary == "LTLIBRARIES" )
00207     {
00208         removeMap.insert ( canonname + "_LDFLAGS", "" );
00209         removeMap.insert ( canonname + "_DEPENDENCIES", "" );
00210         removeMap.insert ( canonname + "_LDADD", "" );
00211         removeMap.insert ( canonname + "_LIBADD", "" );
00212     }
00213 
00214     AutoProjectTool::removeFromMakefileam ( m_spitem->path + "/Makefile.am", removeMap );
00215 
00216     removeMap.clear();
00217 
00218     // if we have another "blabla_PROGRAMS" or "blabla_LTLIBRARIES" target in the same subproject
00219     // check if it has an empty "blabla_LIBADD"-entry
00220     if ( m_titem->primary == "PROGRAMS" || m_titem->primary == "LTLIBRARIES" )
00221     {
00222         for ( titem = m_spitem->targets.first(); titem; titem = m_spitem->targets.next() )
00223         {
00224             //kdDebug (9000) << "******** " << m_spitem->subdir << endl;
00225             if ( titem->primary == "PROGRAMS" || titem->primary == "LTLIBRARIES" )
00226             {
00227                 QString curCanonname = AutoProjectTool::canonicalize ( titem->name );
00228 
00229                 if ( m_spitem->variables[curCanonname + "_LIBADD"].isEmpty() )
00230                 {
00231                     removeMap.insert ( curCanonname + "_LIBADD", "" );
00232 
00233                     //kdDebug (9000) << "Removing from " << m_spitem->subdir << " " << curCanonname << "_LIBADD" << endl;
00234 
00235                     AutoProjectTool::removeFromMakefileam ( m_spitem->path + "/Makefile.am", removeMap );
00236 
00237                     removeMap.clear();
00238                 }
00239             }
00240         }
00241     }
00242 
00243 
00244     progressBar->setTotalSteps ( m_titem->sources.count() );
00245 
00246     QStringList fileList;
00247 
00248     for ( FileItem* fitem = m_titem->sources.first(); fitem; fitem = m_titem->sources.next() )
00249     {
00250         if (removeCheckBox->isChecked())
00251         {
00252             // before removing the files, check if they are mentioned in "noinst_HEADERS = blabla1.h blabla2.h"
00253             QStringList noInstHeaders = QStringList::split ( QRegExp ( "[ \t\n]" ), m_spitem->variables["noinst_HEADERS"] );
00254             
00255             if ( noInstHeaders.contains ( fitem->name ) )
00256             {
00257                 noInstHeaders.remove ( fitem->name );
00258                 
00259                 m_spitem->variables["noinst_HEADERS"] = noInstHeaders.join ( " " );
00260                 replaceMap.insert ( "noinst_HEADERS",  m_spitem->variables["noinst_HEADERS"] );
00261                 AutoProjectTool::modifyMakefileam ( m_spitem->path + "/Makefile.am", replaceMap );
00262                 replaceMap.clear();
00263             }
00264             
00265             QFile::remove(m_spitem->path + "/" + fitem->name);
00266         }
00267         
00268         fileList.append ( m_spitem->path.mid ( m_part->projectDirectory().length() + 1 ) + "/" + fitem->name );
00269 
00270         qApp->processEvents();
00271 
00272         progressBar->setValue ( progressBar->value() + 1 );
00273     }
00274 
00275     m_widget->emitRemovedFiles ( fileList );
00276 
00277     m_spitem->targets.remove ( m_titem );
00278 
00279 
00280     QDialog::accept();
00281 }
KDE Logo
This file is part of the documentation for KDevelop Version 3.1.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 00:03:40 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003