/*************************************************************************** ------------------- begin : Frag' mich was leichteres copyright : (C) 2002 by Victor Rder 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. * * * ***************************************************************************/ /** Here resides the Import-existing-files-dialog of the Automake Manager (a KDevelop build tool part) **/ #include #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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 'tqparent', 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, TQWidget* tqparent, const char* name, bool modal, WFlags fl ) : AddExistingDlgBase ( tqparent, 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() ) { TQString 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); 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(); setIcon ( SmallIcon ( "fileimport.png" ) ); init(); } /* * Destroys the object and frees any allocated resources */ AddExistingFilesDialog::~AddExistingFilesDialog() { // no need to delete child widgets, TQt does it all for me } // void AddExistingFilesDialog::resizeEvent ( TQResizeEvent* ev ) // { // AddExistingDlgBase::resizeEvent ( ev ); // //importView->update(); // } void AddExistingFilesDialog::init() { progressBar->hide(); importView->setMode ( KIconView::Select ); importView->setItemsMovable ( false ); connect ( okButton, TQT_SIGNAL ( clicked () ), this, TQT_SLOT ( slotOk () ) ); connect ( addSelectedButton, TQT_SIGNAL ( clicked () ), this, TQT_SLOT ( slotAddSelected() ) ); connect ( addAllButton, TQT_SIGNAL ( clicked () ), this, TQT_SLOT ( slotAddAll() ) ); connect ( removeSelectedButton, TQT_SIGNAL ( clicked () ), this, TQT_SLOT ( slotRemoveSelected() ) ); connect ( removeAllButton, TQT_SIGNAL ( clicked () ), this, TQT_SLOT ( slotRemoveAll() ) ); connect ( importView, TQT_SIGNAL ( dropped( TQDropEvent* ) ), this, TQT_SLOT ( slotDropped ( TQDropEvent* ) ) ); 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() ); TQListViewItem* child = m_titem->firstChild(); TQStringList duplicateList; while ( child ) { FileItem* curItem = static_cast ( 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 ) TQDialog::reject(); progressBar->show(); progressBar->setFormat ( i18n ( "Importing... %p%" ) ); tqApp->processEvents(); KFileItemListIterator items ( *importView->items() ); // contains at the end only the imported files outside the subproject directory KFileItemList outsideList; TQStringList 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(); TQString canontargetname = AutoProjectTool::canonicalize ( m_titem->name ); TQString 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; TQMap replaceMap; FileItem* fitem = 0L; TQStringList 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 ); TQDialog::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 ( TQDropEvent* 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"