You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdevelop/buildtools/autotools/addsubprojectdlg.cpp

199 lines
6.5 KiB

/***************************************************************************
* Copyright (C) 2001 by Bernd Gehrmann *
* bernd@kdevelop.org *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "addsubprojectdlg.h"
#include <qlabel.h>
#include <qlayout.h>
#include <qpushbutton.h>
#include <qstringlist.h>
#include <qtextstream.h>
#include <kbuttonbox.h>
#include <kdebug.h>
#include <kfiledialog.h>
#include <kiconloader.h>
#include <klineedit.h>
#include <kmessagebox.h>
#include "autolistviewitems.h"
#include "kdevmakefrontend.h"
#include "misc.h"
#include "autoprojectpart.h"
#include "autosubprojectview.h"
AddSubprojectDialog::AddSubprojectDialog(AutoProjectPart *part, AutoSubprojectView *view,
SubprojectItem *item, QWidget *parent, const char *name)
: AddSubprojectDlgBase(parent, name, true)
{
setIcon(SmallIcon("folder_new.png"));
connect( createButton, SIGNAL(clicked()), this, SLOT(accept()) );
connect( cancelButton, SIGNAL(clicked()), this, SLOT(reject()) );
m_subProject = item;
m_subprojectView = view;
m_part = part;
}
AddSubprojectDialog::~AddSubprojectDialog()
{}
void AddSubprojectDialog::accept()
{
QString name = spEdit->text().stripWhiteSpace();
if (name.isEmpty()) {
KMessageBox::sorry(this, i18n("You have to give the subproject a name."));
return;
}
QListViewItem *childItem = m_subProject->firstChild();
while (childItem) {
if (name == static_cast<SubprojectItem*>(childItem)->subdir) {
KMessageBox::sorry(this, i18n("A subproject with this name already exists."));
return;
}
childItem = childItem->nextSibling();
}
#if 0
// check for config.status
if( !QFileInfo(m_part->projectDirectory(), "config.status").exists() ){
KMessageBox::sorry(this, i18n("There is no config.status in the project root directory. Run 'Configure' first"));
QDialog::accept();
return;
}
#endif
QDir dir( m_subProject->path );
QFileInfo file( dir, name );
if( file.exists() && !file.isDir() ) {
KMessageBox::sorry(this, i18n("A file named %1 already exists.").arg(name));
QDialog::accept();
return;
} else if( file.isDir() ) {
if( KMessageBox::warningContinueCancel(this,
i18n("A subdirectory %1 already exists. "
"Do you wish to add it as a subproject?").arg(name))
== KMessageBox::Cancel ){
QDialog::accept();
return;
}
} else if (!dir.mkdir(name)) {
KMessageBox::sorry(this, i18n("Could not create subdirectory %1.").arg(name));
QDialog::accept();
return;
}
if(!dir.cd(name)) {
KMessageBox::sorry(this, i18n("Could not access the subdirectory %1.").arg(name));
QDialog::accept();
return;
}
// Adjust SUBDIRS variable in containing Makefile.am
if (m_subProject->variables["SUBDIRS"].find("$(TOPSUBDIRS)") != -1)
{
QFile subdirsfile( m_subProject->path + "/subdirs" );
if ( subdirsfile.open( IO_WriteOnly | IO_Append ) )
{
QTextStream subdirsstream( &subdirsfile );
subdirsstream << name << endl;
subdirsfile.close();
}
}
else if (m_subProject->variables["SUBDIRS"].find("$(AUTODIRS)") != -1)
{
}
else
{
m_subProject->variables["SUBDIRS"] += (" " + name);
QMap<QString,QString> replaceMap;
replaceMap.insert("SUBDIRS", m_subProject->variables["SUBDIRS"]);
AutoProjectTool::addToMakefileam(m_subProject->path + "/Makefile.am", replaceMap);
}
// Create new item in tree view
SubprojectItem *newitem = new SubprojectItem(m_subProject, name);
newitem->subdir = name;
newitem->path = m_subProject->path + "/" + name;
newitem->variables["INCLUDES"] = m_subProject->variables["INCLUDES"];
newitem->setOpen(true);
// Move to the bottom of the list
QListViewItem *lastItem = m_subProject->firstChild();
while (lastItem->nextSibling())
lastItem = lastItem->nextSibling();
if (lastItem != newitem)
newitem->moveItem(lastItem);
// Create a Makefile in the new subdirectory
QFile f( dir.filePath("Makefile.am") );
if (f.exists()) {
m_subprojectView->parse( newitem );
} else {
if (!f.open(IO_WriteOnly)) {
KMessageBox::sorry(this, i18n("Could not create Makefile.am in subdirectory %1.").arg(name));
return;
}
QTextStream stream(&f);
stream << "INCLUDES = " << newitem->variables["INCLUDES"] << endl << "METASOURCES = AUTO" << endl;
f.close();
}
// if !isKDE: add the new sub-proj to configure.in
if ( !m_part->isKDE() ) {
QString projroot = m_part->projectDirectory() + "/";
QString subdirectory = dir.path();
QString relpath = subdirectory.replace(0, projroot.length(),"");
QString configureFile = m_part->getAutoConfFile(projroot);
QStringList list = AutoProjectTool::configureinLoadMakefiles(configureFile);
if ( !list.isEmpty() )
{
list.push_back( relpath + "/Makefile" );
AutoProjectTool::configureinSaveMakefiles(configureFile, list);
}
}
#if 0
QString relmakefile = (m_subProject->path + "/" + name + "/Makefile").mid(m_part->projectDirectory().length()+1);
kdDebug(9020) << "Relative makefile path: " << relmakefile << endl;
QString cmdline = "cd ";
cmdline += KProcess::quote(m_part->projectDirectory());
cmdline += " && automake ";
cmdline += KProcess::quote(relmakefile);
cmdline += " && CONFIG_HEADERS=config.h CONFIG_FILES=";
cmdline += KProcess::quote(relmakefile);
cmdline += " ./config.status";
m_part->makeFrontend()->queueCommand( m_part->projectDirectory(), cmdline );
m_part->makeFrontend()->queueCommand( m_part->projectDirectory(), m_part->configureCommand() );
#endif
m_part->needMakefileCvs();
QDialog::accept();
}
#include "addsubprojectdlg.moc"