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/addexistingdirectoriesdlg.cpp

387 lines
12 KiB

/***************************************************************************
-------------------
begin : 12/21/2002
copyright : (C) 2002 by Victor R<EFBFBD>er
email : victor_roeder@gmx.de
***************************************************************************/
/***************************************************************************
* *
* 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 <tqgroupbox.h>
#include <tqlayout.h>
#include <kprogress.h>
#include <tdelocale.h>
#include <tdeio/netaccess.h>
#include <kprocess.h>
#include "autolistviewitems.h"
#include "autosubprojectview.h"
#include "autoprojectwidget.h"
#include "autoprojectpart.h"
#include "kimporticonview.h"
#include "urlutil.h"
#include "addexistingdirectoriesdlg.h"
AddExistingDirectoriesDialog::AddExistingDirectoriesDialog ( AutoProjectPart* part, AutoProjectWidget *widget, SubprojectItem* spitem, TQWidget* parent, const char* name, bool modal, WFlags fl )
: AddExistingDlgBase ( parent, name, modal, fl )
{
setIcon ( SmallIcon ( "fileimport.png" ) );
m_spitem = spitem;
m_part = part;
m_widget = widget;
KFile::Mode mode = KFile::Directory;
// if ( spitem && spitem->type() == ProjectItem::Subproject )
// {
// destStaticLabel->setText ( i18n ( "Subproject:" ) );
// destLabel->setText ( spitem->subdir );
// targetLabel->setText ( i18n ( "none" ) );
// directoryLabel->setText ( i18n ( spitem->path ) );
// }
sourceSelector = new FileSelectorWidget ( part, mode, sourceGroupBox, "source file selector" );
sourceGroupBoxLayout->addWidget ( sourceSelector );
importView = new KImportIconView ( i18n("Drag one or more directories with an existing Makefile.am from the left view and drop it here."), destGroupBox, "destination icon view" );
destGroupBoxLayout->addWidget ( importView );
setIcon ( SmallIcon ( "fileimport.png" ) );
TQWidget::setTabOrder(sourceSelector, addAllButton);
TQWidget::setTabOrder(addAllButton, addSelectedButton);
TQWidget::setTabOrder(addSelectedButton, importView);
TQWidget::setTabOrder(importView, removeAllButton);
TQWidget::setTabOrder(removeAllButton, removeSelectedButton);
TQWidget::setTabOrder(removeSelectedButton, okButton);
TQWidget::setTabOrder(okButton, cancelButton);
sourceSelector->setFocus();
init();
}
AddExistingDirectoriesDialog::~AddExistingDirectoriesDialog()
{
}
void AddExistingDirectoriesDialog::init()
{
progressBar->hide();
importView->setMode ( TDEIconView::Select );
importView->setItemsMovable ( false );
connect ( okButton, TQ_SIGNAL ( clicked () ), this, TQ_SLOT ( slotOk () ) );
connect ( addSelectedButton, TQ_SIGNAL ( clicked () ), this, TQ_SLOT ( slotAddSelected() ) );
connect ( addAllButton, TQ_SIGNAL ( clicked () ), this, TQ_SLOT ( slotAddAll() ) );
connect ( removeSelectedButton, TQ_SIGNAL ( clicked () ), this, TQ_SLOT ( slotRemoveSelected() ) );
connect ( removeAllButton, TQ_SIGNAL ( clicked () ), this, TQ_SLOT ( slotRemoveAll() ) );
connect ( importView, TQ_SIGNAL ( dropped( TQDropEvent* ) ), this, TQ_SLOT ( slotDropped ( TQDropEvent* ) ) );
importView->setSelectionMode ( KFile::Multi );
sourceSelector->setDir ( m_spitem->path );
}
void AddExistingDirectoriesDialog::importItems()
{
if( !importView->items() )
return;
// items added via button or drag 'n drop
KFileItemListIterator itemList ( m_importList );
// items already added to the importView
KFileItemListIterator importedList ( *importView->items() );
TQStringList duplicateList;
importedList.toFirst();
for ( ; importedList.current(); ++importedList )
{
itemList.toFirst();
for ( ; itemList.current(); ++itemList )
{
if ( ( *importedList )->name() == ( *itemList )->name() )
{
m_importList.remove ( ( *itemList ) );
// to avoid that a item is added twice
if ( !duplicateList.remove ( ( *importedList )->name() ) )
{
duplicateList.append ( ( *importedList )->name() );
}
}
}
}
itemList.toFirst();
for ( ; itemList.current(); ++itemList )
{
KURL amURL = itemList.current()->url();
amURL.addPath("Makefile.am");
if (TDEIO::NetAccess::exists(amURL))
{
importView->insertItem ( ( *itemList ) );
}
}
importView->somethingDropped ( true );
m_importList.clear();
importView->update ();
}
void AddExistingDirectoriesDialog::slotOk()
{
if ( importView->items()->count() == 0 ) TQDialog::reject();
KFileItemListIterator items ( *importView->items() );
TQStringList dirs;
for ( ; items.current(); ++items )
{
//if the directory is outside the project directory
// kdDebug( 9020 ) << "dir to add " << items.current()->url().path() << " subproject " << m_spitem->path << endl;
if (items.current()->url().path() != m_spitem->path)
{
//copy
//FIXME: check this after 3.0 release and add a possibility to link, not just copy
TDEProcess proc;
proc << "cp";
proc << "-r";
proc << items.current()->url().path();
proc << m_spitem->path;
proc.start(TDEProcess::Block);
}
dirs << items.current()->name();
}
for (TQStringList::const_iterator it = dirs.begin(); it != dirs.end(); ++it)
{
TQString name = *it;
// Adjust SUBDIRS variable in containing Makefile.am
if (m_spitem->variables["SUBDIRS"].find("$(TOPSUBDIRS)") != -1)
{
TQFile subdirsfile( m_spitem->path + "/subdirs" );
if ( subdirsfile.open( IO_WriteOnly | IO_Append ) )
{
TQTextStream subdirsstream( &subdirsfile );
subdirsstream << name << endl;
subdirsfile.close();
}
}
else if (m_spitem->variables["SUBDIRS"].find("$(AUTODIRS)") != -1)
{
}
else
{
m_spitem->variables["SUBDIRS"] += (" " + name);
TQMap<TQString,TQString> replaceMap;
replaceMap.insert("SUBDIRS", m_spitem->variables["SUBDIRS"]);
AutoProjectTool::addToMakefileam(m_spitem->path + "/Makefile.am", replaceMap);
}
// Create new item in tree view
SubprojectItem *newitem = new SubprojectItem(m_spitem, name);
newitem->subdir = name;
newitem->path = m_spitem->path + "/" + name;
newitem->variables["INCLUDES"] = m_spitem->variables["INCLUDES"];
newitem->setOpen(true);
// Move to the bottom of the list
TQListViewItem *lastItem = m_spitem->firstChild();
while (lastItem->nextSibling())
lastItem = lastItem->nextSibling();
if (lastItem != newitem)
newitem->moveItem(lastItem);
// Create a Makefile in the new subdirectory
TQDir dir( m_spitem->path + "/" + name );
TQFile f( dir.filePath("Makefile.am") );
if (f.exists()) {
m_widget->getSubprojectView()->parse( newitem );
} else {
if (!f.open(IO_WriteOnly)) {
// KMessageBox::sorry(this, i18n("Could not create Makefile.am in subdirectory %1.").arg(name));
continue;
}
TQTextStream stream(&f);
stream << "INCLUDES = " << newitem->variables["INCLUDES"] << endl << "METASOURCES = AUTO" << endl;
f.close();
}
// if !isKDE: add the new sub-proj to configure.in or configure.ac
if ( !m_part->isKDE() ) {
TQString projroot = m_part->projectDirectory() + "/";
TQString subdirectory = dir.path();
TQString relpath = subdirectory.replace(0, projroot.length(),"");
TQString configureFile = m_part->getAutoConfFile(projroot);
TQStringList list = AutoProjectTool::configureinLoadMakefiles(configureFile);
if ( !list.isEmpty() )
{
list.push_back( relpath + "/Makefile" );
AutoProjectTool::configureinSaveMakefiles(configureFile, list);
}
}
m_part->needMakefileCvs();
}
TQDialog::accept();
}
void AddExistingDirectoriesDialog::slotAddSelected()
{
KFileItemListIterator it ( *sourceSelector->dirOperator()->selectedItems() );
for ( ; it.current(); ++it )
{
TQString relPath = URLUtil::extractPathNameRelative(m_part->projectDirectory(), ( *it )->url());
if (relPath[relPath.length()-1] == '/')
relPath = relPath.left(relPath.length()-1);
if ( (relPath.isEmpty()) || (! m_widget->allSubprojects().contains( relPath )) )
{
m_importList.append ( ( *it ) );
}
}
importItems();
}
void AddExistingDirectoriesDialog::slotAddAll()
{
KFileItemListIterator it ( *sourceSelector->dirOperator()->view()->items() );
for ( ; it.current(); ++it )
{
TQString relPath = URLUtil::extractPathNameRelative(m_part->projectDirectory(), ( *it )->url());
if (relPath[relPath.length()-1] == '/')
relPath = relPath.left(relPath.length()-1);
if ( (relPath.isEmpty()) || ( ! m_widget->allSubprojects().contains( relPath )) )
{
m_importList.append ( ( *it ) );
}
}
importItems();
}
void AddExistingDirectoriesDialog::slotRemoveAll()
{
KURL::List deletedFiles;
KFileItemListIterator it ( *importView->items() );
for ( ; it.current(); ++it )
{
kdDebug ( 9020 ) << "AddExistingDirectoriesDialog::slotRemoveAll()" << endl;
//deletedFiles.append ( ( *it )->url() );
if ( (*it ) ) importView->removeItem ( *it );
}
importView->somethingDropped ( false );
importView->viewport()->update();
}
void AddExistingDirectoriesDialog::slotRemoveSelected()
{
KFileItemListIterator items ( *importView->items() );
KFileItemList* selectedList = (KFileItemList*) importView->selectedItems();
KFileItem * deleteItem = 0L;
for ( ; items.current(); ++items )
{
deleteItem = selectedList->first();
while ( deleteItem )
{
if ( deleteItem == ( *items ) )
{
importView->removeItem ( deleteItem );
deleteItem = selectedList->current();
}
else
{
deleteItem = selectedList->next();
}
}
}
if ( importView->items()->count() == 0 ) importView->somethingDropped ( false );
importView->viewport()->update();
}
void AddExistingDirectoriesDialog::slotDropped ( TQDropEvent* ev )
{
kdDebug ( 9020 ) << "AddExistingDirectoriesDialog::dropped()" << endl;
KURL::List urls;
KURLDrag::decode( ev, urls );
KFileItem* item = 0L;
KMimeType::Ptr type = 0L;
for ( KURL::List::Iterator it = urls.begin(); it != urls.end(); ++it )
{
//check if this subproject is already in project
TQString relPath = URLUtil::extractPathNameRelative(m_part->projectDirectory(), *it);
if (relPath[relPath.length()-1] == '/')
relPath = relPath.left(relPath.length()-1);
if ( (relPath.isEmpty()) || ( ! m_widget->allSubprojects().contains( relPath )) )
{
type = KMimeType::findByURL ( ( *it ) );
if ( type->name() != KMimeType::defaultMimeType() )
{
item = new KFileItem ( ( *it ) , type->name(), 0 );
}
else
{
item = new KFileItem ( ( *it ), "inode/directory", 0 );
}
m_importList.append ( item );
}
}
importItems();
}
#include "addexistingdirectoriesdlg.moc"