/*************************************************************************** copyright : (C) 2003-2006 by Robby Stephenson email : robby@periapsis.org ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of version 2 of the GNU General Public License as * * published by the Free Software Foundation; * * * ***************************************************************************/ #include "importdialog.h" #include "document.h" #include "tellico_kernel.h" #include "tellico_debug.h" #include "collection.h" #include "translators/importer.h" #include "translators/tellicoimporter.h" #include "translators/bibteximporter.h" #include "translators/bibtexmlimporter.h" #include "translators/csvimporter.h" #include "translators/xsltimporter.h" #include "translators/audiofileimporter.h" #include "translators/alexandriaimporter.h" #include "translators/freedbimporter.h" #include "translators/risimporter.h" #include "translators/gcfilmsimporter.h" #include "translators/filelistingimporter.h" #include "translators/amcimporter.h" #include "translators/griffithimporter.h" #include "translators/pdfimporter.h" #include "translators/referencerimporter.h" #include "translators/deliciousimporter.h" #include #include #include #include #include #include #include #include // really according to taste or computer speed const unsigned Tellico::Import::Importer::s_stepSize = 20; using Tellico::ImportDialog; ImportDialog::ImportDialog(Import::Format format_, const KURL::List& urls_, TQWidget* parent_, const char* name_) : KDialogBase(parent_, name_, true /*modal*/, i18n("Import Options"), Ok|Cancel), m_coll(0), m_importer(importer(format_, urls_)) { TQWidget* widget = new TQWidget(this); TQVBoxLayout* topLayout = new TQVBoxLayout(widget, 0, spacingHint()); TQButtonGroup* bg = new TQButtonGroup(1, TQt::Horizontal, i18n("Import Options"), widget); topLayout->addWidget(bg, 0); m_radioReplace = new TQRadioButton(i18n("&Replace current collection"), bg); TQWhatsThis::add(m_radioReplace, i18n("Replace the current collection with the contents " "of the imported file.")); m_radioAppend = new TQRadioButton(i18n("A&ppend to current collection"), bg); TQWhatsThis::add(m_radioAppend, i18n("Append the contents of the imported file to the " "current collection. This is only possible when the " "collection types match.")); m_radioMerge = new TQRadioButton(i18n("&Merge with current collection"), bg); TQWhatsThis::add(m_radioMerge, i18n("Merge the contents of the imported file to the " "current collection. This is only possible when the " "collection types match. Entries must match exactly " "in order to be merged.")); if(m_importer->canImport(Kernel::self()->collectionType())) { // append by default? m_radioAppend->setChecked(true); } else { m_radioReplace->setChecked(true); m_radioAppend->setEnabled(false); m_radioMerge->setEnabled(false); } TQWidget* w = m_importer->widget(widget, "importer_widget"); // m_importer->readOptions(TDEGlobal::config()); if(w) { topLayout->addWidget(w, 0); } connect(bg, TQ_SIGNAL(clicked(int)), m_importer, TQ_SLOT(slotActionChanged(int))); topLayout->addStretch(); setMainWidget(widget); KGuiItem ok = KStdGuiItem::ok(); ok.setText(i18n("&Import")); setButtonOK(ok); // want to grab default button action, too // since the importer might do something with widgets, don't just call it, do it after layout is done TQTimer::singleShot(0, this, TQ_SLOT(slotUpdateAction())); } ImportDialog::~ImportDialog() { delete m_importer; m_importer = 0; } Tellico::Data::CollPtr ImportDialog::collection() { if(m_importer && !m_coll) { m_coll = m_importer->collection(); } return m_coll; } TQString ImportDialog::statusMessage() const { return m_importer ? m_importer->statusMessage() : TQString(); } Tellico::Import::Action ImportDialog::action() const { if(m_radioReplace->isChecked()) { return Import::Replace; } else if(m_radioAppend->isChecked()) { return Import::Append; } else { return Import::Merge; } } // static Tellico::Import::Importer* ImportDialog::importer(Import::Format format_, const KURL::List& urls_) { #define CHECK_SIZE if(urls_.size() > 1) kdWarning() << "ImportDialog::importer() - only importing first URL" << endl KURL firstURL = urls_.isEmpty() ? KURL() : urls_[0]; Import::Importer* importer = 0; switch(format_) { case Import::TellicoXML: CHECK_SIZE; importer = new Import::TellicoImporter(firstURL); break; case Import::Bibtex: importer = new Import::BibtexImporter(urls_); break; case Import::Bibtexml: CHECK_SIZE; importer = new Import::BibtexmlImporter(firstURL); break; case Import::CSV: CHECK_SIZE; importer = new Import::CSVImporter(firstURL); break; case Import::XSLT: CHECK_SIZE; importer = new Import::XSLTImporter(firstURL); break; case Import::MODS: CHECK_SIZE; importer = new Import::XSLTImporter(firstURL); { TQString xsltFile = locate("appdata", TQString::fromLatin1("mods2tellico.xsl")); if(!xsltFile.isEmpty()) { KURL u; u.setPath(xsltFile); static_cast(importer)->setXSLTURL(u); } else { kdWarning() << "ImportDialog::importer - unable to find mods2tellico.xml!" << endl; } } break; case Import::AudioFile: CHECK_SIZE; importer = new Import::AudioFileImporter(firstURL); break; case Import::Alexandria: CHECK_SIZE; importer = new Import::AlexandriaImporter(); break; case Import::FreeDB: CHECK_SIZE; importer = new Import::FreeDBImporter(); break; case Import::RIS: importer = new Import::RISImporter(urls_); break; case Import::GCfilms: CHECK_SIZE; importer = new Import::GCfilmsImporter(firstURL); break; case Import::FileListing: CHECK_SIZE; importer = new Import::FileListingImporter(firstURL); break; case Import::AMC: CHECK_SIZE; importer = new Import::AMCImporter(firstURL); break; case Import::Griffith: importer = new Import::GriffithImporter(); break; case Import::PDF: importer = new Import::PDFImporter(urls_); break; case Import::Referencer: CHECK_SIZE; importer = new Import::ReferencerImporter(firstURL); break; case Import::Delicious: CHECK_SIZE; importer = new Import::DeliciousImporter(firstURL); break; case Import::GRS1: myDebug() << "ImportDialog::importer() - GRS1 not implemented" << endl; break; } #ifndef NDEBUG if(!importer) { kdWarning() << "ImportDialog::importer() - importer not created!" << endl; } #endif return importer; #undef CHECK_SIZE } // static TQString ImportDialog::fileFilter(Import::Format format_) { TQString text; switch(format_) { case Import::TellicoXML: text = i18n("*.tc *.bc|Tellico Files (*.tc)") + TQChar('\n'); text += i18n("*.xml|XML Files (*.xml)") + TQChar('\n'); break; case Import::Bibtex: text = i18n("*.bib|Bibtex Files (*.bib)") + TQChar('\n'); break; case Import::CSV: text = i18n("*.csv|CSV Files (*.csv)") + TQChar('\n'); break; case Import::Bibtexml: case Import::XSLT: text = i18n("*.xml|XML Files (*.xml)") + TQChar('\n'); break; case Import::MODS: case Import::Delicious: text = i18n("*.xml|XML Files (*.xml)") + TQChar('\n'); break; case Import::RIS: text = i18n("*.ris|RIS Files (*.ris)") + TQChar('\n'); break; case Import::GCfilms: text = i18n("*.gcs|GCstar Data Files (*.gcs)") + TQChar('\n'); text += i18n("*.gcf|GCfilms Data Files (*.gcf)") + TQChar('\n'); break; case Import::AMC: text = i18n("*.amc|AMC Data Files (*.amc)") + TQChar('\n'); break; case Import::PDF: text = i18n("*.pdf|PDF Files (*.pdf)") + TQChar('\n'); break; case Import::Referencer: text = i18n("*.reflib|Referencer Files (*.reflib)") + TQChar('\n'); break; case Import::AudioFile: case Import::Alexandria: case Import::FreeDB: case Import::FileListing: case Import::GRS1: case Import::Griffith: break; } return text + i18n("*|All Files"); } // audio files are imported by directory // alexandria is a defined location, as is freedb // all others are files Tellico::Import::Target ImportDialog::importTarget(Import::Format format_) { switch(format_) { case Import::AudioFile: case Import::FileListing: return Import::Dir; case Import::Griffith: case Import::Alexandria: case Import::FreeDB: return Import::None; default: return Import::File; } } Tellico::Import::FormatMap ImportDialog::formatMap() { // at one point, these were translated, but after some thought // I decided they were likely to be the same in any language // transliteration is unlikely Import::FormatMap map; map[Import::TellicoXML] = TQString::fromLatin1("Tellico"); map[Import::Bibtex] = TQString::fromLatin1("Bibtex"); map[Import::Bibtexml] = TQString::fromLatin1("Bibtexml"); // map[Import::CSV] = TQString::fromLatin1("CSV"); map[Import::MODS] = TQString::fromLatin1("MODS"); map[Import::RIS] = TQString::fromLatin1("RIS"); map[Import::GCfilms] = TQString::fromLatin1("GCstar"); map[Import::AMC] = TQString::fromLatin1("AMC"); map[Import::Griffith] = TQString::fromLatin1("Griffith"); map[Import::PDF] = TQString::fromLatin1("PDF"); map[Import::Referencer] = TQString::fromLatin1("Referencer"); map[Import::Delicious ] = TQString::fromLatin1("Delicious Library"); return map; } bool ImportDialog::formatImportsText(Import::Format format_) { return format_ != Import::AMC && format_ != Import::Griffith && format_ != Import::PDF; } TQString ImportDialog::startDir(Import::Format format_) { if(format_ == Import::GCfilms) { TQDir dir = TQDir::home(); // able to cd if exists and readable if(dir.cd(TQString::fromLatin1(".local/share/gcfilms/"))) { return dir.absPath(); } } return TQString::fromLatin1(":import"); } void ImportDialog::slotOk() { // some importers, like the CSV importer, can validate their settings if(!m_importer || m_importer->validImport()) { KDialogBase::slotOk(); } else { myLog() << "ImportDialog::slotOk() - not a valid import" << endl; } } void ImportDialog::slotUpdateAction() { // distasteful hack // selectedId() is new in QT 3.2 // m_importer->slotActionChanged(dynamic_cast(m_radioAppend->parentWidget())->selectedId()); TQButtonGroup* bg = static_cast(m_radioAppend->parentWidget()); m_importer->slotActionChanged(bg->id(bg->selected())); } // static Tellico::Data::CollPtr ImportDialog::importURL(Import::Format format_, const KURL& url_) { Import::Importer* imp = importer(format_, url_); Data::CollPtr c = imp->collection(); if(!c && !imp->statusMessage().isEmpty()) { Kernel::self()->sorry(imp->statusMessage()); } delete imp; return c; } #include "importdialog.moc"