summaryrefslogtreecommitdiffstats
path: root/buildtools/autotools/addexistingfilesdlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'buildtools/autotools/addexistingfilesdlg.cpp')
-rw-r--r--buildtools/autotools/addexistingfilesdlg.cpp451
1 files changed, 451 insertions, 0 deletions
diff --git a/buildtools/autotools/addexistingfilesdlg.cpp b/buildtools/autotools/addexistingfilesdlg.cpp
new file mode 100644
index 00000000..00f3e61b
--- /dev/null
+++ b/buildtools/autotools/addexistingfilesdlg.cpp
@@ -0,0 +1,451 @@
+/***************************************************************************
+ -------------------
+ begin : Frag' mich was leichteres
+ copyright : (C) 2002 by Victor Rder
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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. *
+ * *
+ ***************************************************************************/
+
+/** Here resides the Import-existing-files-dialog of the Automake Manager (a KDevelop build tool part) **/
+
+#include <qapplication.h>
+#include <qgroupbox.h>
+#include <qlabel.h>
+//#include <qlistbox.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qpixmap.h>
+
+#include <kdebug.h>
+#include <kfileview.h>
+#include <kguiitem.h>
+#include <kprogress.h>
+#include <kprocess.h>
+#include <kurldrag.h>
+#include <kmessagebox.h>
+#include <kmimetype.h>
+#include <kiconview.h>
+#include <ksqueezedtextlabel.h>
+
+#include "urlutil.h"
+
+#include "autolistviewitems.h"
+
+#include "autoprojectwidget.h"
+#include "autoprojectpart.h"
+
+#include "kimporticonview.h"
+
+#include "addexistingfilesdlg.h"
+
+/*
+ * Constructs a AddExistingFilesDialog which is a child of 'parent', with the
+ * name 'name' and widget flags set to 'f'.
+ *
+ * The dialog will by default be modeless, unless you set 'modal' to
+ * TRUE to construct a modal dialog.
+ */
+
+AddExistingFilesDialog::AddExistingFilesDialog ( AutoProjectPart* part, AutoProjectWidget *widget, SubprojectItem* spitem, TargetItem* titem, QWidget* parent, const char* name, bool modal, WFlags fl )
+ : AddExistingDlgBase ( parent, name, modal, fl )
+{
+ m_spitem = spitem;
+ m_titem = titem;
+
+ m_part = part;
+ m_widget = widget;
+
+ KFile::Mode mode = KFile::Files;
+
+ if ( titem && spitem && titem->type() == ProjectItem::Target && spitem->type() == ProjectItem::Subproject )
+ {
+
+ if ( titem->name.isEmpty() )
+ {
+ QString target = i18n ( "%1 in %2" ).arg ( titem->primary ).arg ( titem->prefix );
+ targetLabel->setText ( target );
+ }
+ else
+ {
+ targetLabel->setText ( titem->name );
+ }
+ directoryLabel->setText ( spitem->path );
+ }
+
+ sourceSelector = new FileSelectorWidget ( m_part, mode, sourceGroupBox, "source file selector" );
+ sourceGroupBoxLayout->addWidget ( sourceSelector );
+
+ importView = new KImportIconView ( i18n ( "Drag one or more files from the left view and drop it here." ), destGroupBox, "destination icon view" );
+ destGroupBoxLayout->addWidget ( importView );
+ //destGroupBoxLayout->setStretchFactor(dir, 2);
+
+ QWidget::setTabOrder(sourceSelector, addAllButton);
+ QWidget::setTabOrder(addAllButton, addSelectedButton);
+ QWidget::setTabOrder(addSelectedButton, importView);
+ QWidget::setTabOrder(importView, removeAllButton);
+ QWidget::setTabOrder(removeAllButton, removeSelectedButton);
+ QWidget::setTabOrder(removeSelectedButton, okButton);
+ QWidget::setTabOrder(okButton, cancelButton);
+
+ sourceSelector->setFocus();
+
+ setIcon ( SmallIcon ( "fileimport.png" ) );
+
+ init();
+}
+
+
+/*
+ * Destroys the object and frees any allocated resources
+ */
+AddExistingFilesDialog::~AddExistingFilesDialog()
+{
+ // no need to delete child widgets, Qt does it all for me
+}
+
+
+// void AddExistingFilesDialog::resizeEvent ( QResizeEvent* ev )
+// {
+// AddExistingDlgBase::resizeEvent ( ev );
+// //importView->update();
+// }
+
+
+void AddExistingFilesDialog::init()
+{
+ progressBar->hide();
+
+ importView->setMode ( KIconView::Select );
+ importView->setItemsMovable ( false );
+
+ connect ( okButton, SIGNAL ( clicked () ), this, SLOT ( slotOk () ) );
+
+ connect ( addSelectedButton, SIGNAL ( clicked () ), this, SLOT ( slotAddSelected() ) );
+ connect ( addAllButton, SIGNAL ( clicked () ), this, SLOT ( slotAddAll() ) );
+ connect ( removeSelectedButton, SIGNAL ( clicked () ), this, SLOT ( slotRemoveSelected() ) );
+ connect ( removeAllButton, SIGNAL ( clicked () ), this, SLOT ( slotRemoveAll() ) );
+
+ connect ( importView, SIGNAL ( dropped( QDropEvent* ) ), this, SLOT ( slotDropped ( QDropEvent* ) ) );
+
+ importView->setSelectionMode ( KFile::Multi );
+
+ Q_ASSERT( m_spitem );
+ sourceSelector->setDir ( m_spitem->path );
+}
+
+void AddExistingFilesDialog::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() );
+
+ QListViewItem* child = m_titem->firstChild();
+
+ QStringList duplicateList;
+
+ while ( child )
+ {
+ FileItem* curItem = static_cast<FileItem*> ( child );
+
+ itemList.toFirst();
+
+ for ( ; itemList.current(); ++itemList )
+ {
+ if ( ( *itemList )->name() == curItem->name )
+ {
+ duplicateList.append ( ( *itemList )->name() );
+ m_importList.remove ( ( *itemList ) );
+ }
+ }
+
+ child = child->nextSibling();
+ }
+
+ 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() );
+ }
+ }
+ }
+ }
+
+ if ( duplicateList.count() > 0 )
+ {
+ if ( KMessageBox::warningContinueCancelList ( this, i18n (
+ "The following file(s) already exist(s) in the target!\n"
+ "Press Continue to import only the new files.\n"
+ "Press Cancel to abort the complete import." ),
+ duplicateList, "Warning", KGuiItem ( i18n ( "Continue" ) ) ) == KMessageBox::Cancel )
+ {
+ m_importList.clear();
+ return;
+ }
+ }
+
+ itemList.toFirst();
+
+ for ( ; itemList.current(); ++itemList )
+ {
+ if ( !( *itemList )->isDir() )
+ {
+ importView->insertItem ( ( *itemList ) );
+ }
+ }
+
+ importView->somethingDropped ( true );
+
+ m_importList.clear();
+
+ importView->update ();
+}
+
+void AddExistingFilesDialog::slotOk()
+{
+ if ( importView->items()->count() == 0 ) QDialog::reject();
+
+ progressBar->show();
+ progressBar->setFormat ( i18n ( "Importing... %p%" ) );
+
+ qApp->processEvents();
+
+ KFileItemListIterator items ( *importView->items() );
+
+ // contains at the end only the imported files outside the subproject directory
+ KFileItemList outsideList;
+
+ QStringList stringList;
+
+ for ( ; items.current(); ++items )
+ {
+ // kdDebug ( 9020 ) << " **** " << ( *items )->url().directory() << "***** " << m_spitem->path << endl;
+ if ( ( *items )->url().directory() != m_spitem->path )
+ {
+ stringList.append ( ( *items )->name() );
+ outsideList.append ( ( *items ) );
+ }
+ }
+
+ progressBar->setTotalSteps ( outsideList.count() + importView->items()->count() );
+
+ if ( outsideList.count() > 0 )
+ {
+ if ( KMessageBox::questionYesNoList ( this, i18n (
+ "The following file(s) are not in the Subproject directory.\n"
+ "Press Link to add the files by creating symbolic links.\n"
+ "Press Copy to copy the files into the directory." ),
+ stringList, i18n("Warning"), KGuiItem ( i18n ( "Link (recommended)" ) ), KGuiItem ( i18n ( "Copy (not recommended)" ) ) ) == KMessageBox::No )
+ {
+ // Copy files into the Subproject directory
+ KFileItemListIterator it ( outsideList ) ;
+
+ for ( ; it.current(); ++it )
+ {
+ KProcess proc;
+
+ proc << "cp";
+ proc << ( *it )->url().path();
+ proc << m_spitem->path;
+ proc.start(KProcess::DontCare);
+
+ progressBar->setValue ( progressBar->value() + 1 );
+ }
+ }
+ else
+ {
+ // Link them into the Subproject directory
+ KFileItemListIterator it ( outsideList ) ;
+
+ for ( ; it.current(); ++it )
+ {
+ KProcess proc;
+
+ proc << "ln";
+ proc << "-s";
+ proc << URLUtil::relativePathToFile( m_spitem->path, ( *it )->url().path() );
+ proc << m_spitem->path;
+ proc.start(KProcess::DontCare);
+
+ progressBar->setValue ( progressBar->value() + 1 );
+ }
+ }
+ }
+
+ items.toFirst();
+
+ QString canontargetname = AutoProjectTool::canonicalize ( m_titem->name );
+ QString varname;
+ if( m_titem->primary == "PROGRAMS" || m_titem->primary == "LIBRARIES" || m_titem->primary == "LTLIBRARIES" )
+ varname = canontargetname + "_SOURCES";
+ else
+ varname = m_titem->prefix + "_" + m_titem->primary;
+
+ QMap<QString,QString> replaceMap;
+ FileItem* fitem = 0L;
+ QStringList fileList;
+
+ for ( ; items.current(); ++items )
+ {
+ m_spitem->variables [ varname ] += ( " " + ( *items )->name() );
+ replaceMap.insert ( varname, m_spitem->variables [ varname ] );
+
+ fitem = m_widget->createFileItem ( ( *items )->name(), m_spitem );
+ m_titem->sources.append ( fitem );
+ m_titem->insertItem ( fitem );
+
+ fileList.append ( m_spitem->path.mid ( m_part->projectDirectory().length() + 1 ) + "/" + ( *items )->name() );
+
+ progressBar->setValue ( progressBar->value() + 1 );
+ }
+
+ m_widget->emitAddedFiles ( fileList );
+
+ AutoProjectTool::addToMakefileam ( m_spitem->path + "/Makefile.am", replaceMap );
+
+ QDialog::accept();
+
+}
+
+void AddExistingFilesDialog::slotAddSelected()
+{
+ KFileItemListIterator it ( *sourceSelector->dirOperator()->selectedItems() );
+
+ for ( ; it.current(); ++it )
+ {
+ if ( ( *it )->url().isLocalFile() ) // maybe unnecessary
+ {
+ m_importList.append ( ( *it ) );
+ }
+ }
+
+ importItems();
+}
+
+
+void AddExistingFilesDialog::slotAddAll()
+{
+ KFileItemListIterator it ( *sourceSelector->dirOperator()->view()->items() );
+
+ for ( ; it.current(); ++it )
+ {
+ if ( ( *it )->url().isLocalFile() ) // maybe unnecessary
+ {
+ m_importList.append ( ( *it ) );
+ }
+ }
+
+ importItems();
+}
+
+void AddExistingFilesDialog::slotRemoveAll()
+{
+ KURL::List deletedFiles;
+ KFileItemListIterator it ( *importView->items() );
+
+ for ( ; it.current(); ++it )
+ {
+ kdDebug ( 9020 ) << "AddExistingFilesDialog::slotRemoveAll()" << endl;
+ //deletedFiles.append ( ( *it )->url() );
+ if ( (*it ) ) importView->removeItem ( *it );
+ }
+
+ importView->somethingDropped ( false );
+
+ importView->viewport()->update();
+}
+
+void AddExistingFilesDialog::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 AddExistingFilesDialog::slotDropped ( QDropEvent* ev )
+{
+ kdDebug ( 9020 ) << "AddExistingFilesDialog::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 )
+ {
+ if ( ( *it ).isLocalFile() ) // maybe unnecessary
+ {
+ type = KMimeType::findByURL ( ( *it ) );
+
+ if ( type->name() != KMimeType::defaultMimeType() )
+ {
+ item = new KFileItem ( ( *it ) , type->name(), 0 );
+ }
+ else
+ {
+ // take a text-file-icon instead of the ugly question-mark-icon
+ item = new KFileItem ( ( *it ), "text/plain", 0 );
+ }
+
+ m_importList.append ( item );
+ }
+ }
+
+ importItems();
+}
+
+#include "addexistingfilesdlg.moc"