diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-10 00:18:25 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-10 00:18:25 +0000 |
commit | f21e5792b5084f5d008bf46f6316030c6dfb31e5 (patch) | |
tree | d51583b36aa1672bac78d98a682cdc330df27e4d /src/softwareimporters.cpp | |
download | basket-f21e5792b5084f5d008bf46f6316030c6dfb31e5.tar.gz basket-f21e5792b5084f5d008bf46f6316030c6dfb31e5.zip |
Add author-abandoned basket application
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/basket@1072339 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src/softwareimporters.cpp')
-rw-r--r-- | src/softwareimporters.cpp | 696 |
1 files changed, 696 insertions, 0 deletions
diff --git a/src/softwareimporters.cpp b/src/softwareimporters.cpp new file mode 100644 index 0000000..9f276c7 --- /dev/null +++ b/src/softwareimporters.cpp @@ -0,0 +1,696 @@ +/*************************************************************************** + * Copyright (C) 2003 by Sébastien Laoût * + * slaout@linux62.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. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include <qstring.h> +#include <qdir.h> +#include <kstandarddirs.h> +#include <klocale.h> +#include <kfiledialog.h> +#include <qptrstack.h> +#include <qlayout.h> +#include <qvbuttongroup.h> +#include <qradiobutton.h> +#include <kmessagebox.h> +#include <qtextedit.h> + +#include "softwareimporters.h" +#include "basket.h" +#include "basketfactory.h" +#include "notefactory.h" +#include "global.h" +#include "bnpview.h" +#include "xmlwork.h" +#include "tools.h" + +/** class TreeImportDialog: */ + +TreeImportDialog::TreeImportDialog(QWidget *parent) + : KDialogBase(KDialogBase::Swallow, i18n("Import Hierarchy"), KDialogBase::Ok | KDialogBase::Cancel, + KDialogBase::Ok, parent, /*name=*/"ImportHierarchy", /*modal=*/true, /*separator=*/false) +{ + QWidget *page = new QWidget(this); + QVBoxLayout *topLayout = new QVBoxLayout(page, /*margin=*/0, spacingHint()); + + m_choices = new QVButtonGroup(i18n("How to Import the Notes?"), page); + new QRadioButton(i18n("&Keep original hierarchy (all notes in separate baskets)"), m_choices); + new QRadioButton(i18n("&First level notes in separate baskets"), m_choices); + new QRadioButton(i18n("&All notes in one basket"), m_choices); + m_choices->setButton(0); + topLayout->addWidget(m_choices); + topLayout->addStretch(10); + + setMainWidget(page); +} + +TreeImportDialog::~TreeImportDialog() +{ +} + +int TreeImportDialog::choice() +{ + return m_choices->selectedId(); +} + +/** class TextFileImportDialog: */ + +TextFileImportDialog::TextFileImportDialog(QWidget *parent) + : KDialogBase(KDialogBase::Swallow, i18n("Import Text File"), KDialogBase::Ok | KDialogBase::Cancel, + KDialogBase::Ok, parent, /*name=*/"ImportTextFile", /*modal=*/true, /*separator=*/false) +{ + QWidget *page = new QWidget(this); + QVBoxLayout *topLayout = new QVBoxLayout(page, /*margin=*/0, spacingHint()); + + m_choices = new QVButtonGroup(i18n("Format of the Text File"), page); + new QRadioButton(i18n("Notes separated by an &empty line"), m_choices); + new QRadioButton(i18n("One ¬e per line"), m_choices); + new QRadioButton(i18n("Notes begin with a &dash (-)"), m_choices); + new QRadioButton(i18n("Notes begin with a &star (*)"), m_choices); + m_anotherSeparator = new QRadioButton(i18n("&Use another separator:"), m_choices); + + QWidget *indentedTextEdit = new QWidget(m_choices); + QHBoxLayout *hLayout = new QHBoxLayout(indentedTextEdit, /*margin=*/0, spacingHint()); + hLayout->addSpacing(20); + m_customSeparator = new QTextEdit(indentedTextEdit); + m_customSeparator->setTextFormat(Qt::PlainText); + hLayout->addWidget(m_customSeparator); + m_choices->insertChild(indentedTextEdit); + + new QRadioButton(i18n("&All in one note"), m_choices); + m_choices->setButton(0); + topLayout->addWidget(m_choices); + + connect( m_customSeparator, SIGNAL(textChanged()), this, SLOT(customSeparatorChanged()) ); + + setMainWidget(page); +} + +TextFileImportDialog::~TextFileImportDialog() +{ +} + +QString TextFileImportDialog::separator() +{ + switch (m_choices->selectedId()) { + default: + case 0: return "\n\n"; + case 1: return "\n"; + case 2: return "\n-"; + case 3: return "\n*"; + case 4: return m_customSeparator->text(); + case 5: return ""; + } +} + +void TextFileImportDialog::customSeparatorChanged() +{ + if (!m_anotherSeparator->isOn()) + m_anotherSeparator->toggle(); +} + +/** namespace SoftwareImporters: */ + +QString SoftwareImporters::fromICS(const QString &ics) +{ + QString result = ics; + + // Remove escaped '\' characters and append the text to the body + int pos = 0; + while ( (pos = result.find('\\', pos)) != -1 ) { + if ((uint)pos == result.length() - 1) // End of string + break; + if (result[pos+1] == 'n') { + result.replace(pos, 2, '\n'); + } else if (result[pos+1] == 'r') { + result.replace(pos, 2, '\r'); + } else if (result[pos+1] == 't') { + result.replace(pos, 2, '\t'); + } else if (result[pos] == '\\') { + result.remove(pos, 1); // Take care of "\\", "\,", "\;" and other escaped characters I haven't noticed + ++pos; + } + } + + return result; +} + +QString SoftwareImporters::fromTomboy(QString tomboy) +{ + // The first line is the note title, and we already have it, so we remove it (yes, that's pretty stupid to duplicate it in the content...): + tomboy = tomboy.mid(tomboy.find("\n")).stripWhiteSpace(); + + // Font styles and decorations: + tomboy.replace("<bold>", "<b>"); + tomboy.replace("</bold>", "</b>"); + tomboy.replace("<italic>", "<i>"); + tomboy.replace("</italic>", "</i>"); + tomboy.replace("<strikethrough>", "<span style='text-decoration: line-through'>"); + tomboy.replace("</strikethrough>", "</span>"); + + // Highlight not supported by QTextEdit: + tomboy.replace("<highlight>", "<span style='color:#ff0080'>"); + tomboy.replace("</highlight>", "</span>"); + + // Font sizes: + tomboy.replace("<size:small>", "<span style='font-size: 7pt'>"); + tomboy.replace("</size:small>", "</span>"); + tomboy.replace("<size:large>", "<span style='font-size: 16pt'>"); + tomboy.replace("</size:large>", "</span>"); + tomboy.replace("<size:huge>", "<span style='font-size: 20pt'>"); + tomboy.replace("</size:huge>", "</span>"); + + // Internal links to other notes aren't supported yet by BasKet Note Pads: + tomboy.replace("<link:internal>", ""); + tomboy.replace("</link:internal>", ""); + + // In the Tomboy file, new lines are "\n" and not "<br>": + tomboy.replace("\n", "<br>\n"); + + // Preserve consecutive spaces: + return "<html><head><meta name=\"qrichtext\" content=\"1\" /></head><body>" + tomboy + "</body></html>"; +} + +Note* SoftwareImporters::insertTitledNote(Basket *parent, const QString &title, const QString &content, Qt::TextFormat format/* = Qt::PlainText*/, Note *parentNote/* = 0*/) +{ + Note *nGroup = new Note(parent); + + Note *nTitle = NoteFactory::createNoteText(title, parent); + nTitle->addState(Tag::stateForId("title")); + + Note *nContent; + if (format == Qt::PlainText) + nContent = NoteFactory::createNoteText(content, parent); + else + nContent = NoteFactory::createNoteHtml(content, parent); + + if (parentNote == 0) + parentNote = parent->firstNote(); // In the first column! + parent->insertNote(nGroup, parentNote, Note::BottomColumn, QPoint(), /*animate=*/false); + parent->insertNote(nTitle, nGroup, Note::BottomColumn, QPoint(), /*animate=*/false); + parent->insertNote(nContent, nTitle, Note::BottomInsert, QPoint(), /*animate=*/false); + + return nGroup; +} + +void SoftwareImporters::finishImport(Basket *basket) +{ + // Unselect the last inserted group: + basket->unselectAll(); + + // Focus the FIRST note (the last inserted note is currently focused!): + basket->setFocusedNote(basket->firstNoteShownInStack()); + + // Relayout every notes at theire new place and simulate a load animation (because already loaded just after the creation). + // Without a relayouting, notes on the bottom would comes from the top (because they were inserted on top) and clutter the animation load: + basket->relayoutNotes(/*animate=*/false); + basket->animateLoad(); + basket->save(); +} + + + +void SoftwareImporters::importKJots() +{ + QString dirPath = locateLocal("appdata","") + "/../kjots/"; // I think the assumption is good + QDir dir(dirPath, QString::null, QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::NoSymLinks); + + QStringList list = dir.entryList(); + if (list.isEmpty()) + return; + + BasketFactory::newBasket(/*icon=*/"kjots", /*name=*/i18n("From KJots"), /*backgroundImage=*/"", /*backgroundColor=*/QColor(), /*textColor=*/QColor(), /*templateName=*/"1column", /*createIn=*/0); + Basket *kjotsBasket = Global::bnpView->currentBasket(); + + for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { // For each file + QFile file(dirPath + *it); + if (file.open(IO_ReadOnly)) { + QTextStream stream(&file); + stream.setEncoding(QTextStream::Locale); + QString buf = stream.readLine(); + + // IT IS A NOTEBOOK FILE, AT THE VERION 0.6.x and older: + if ( !buf.isNull() && buf.left(9) == "\\NewEntry") { + + // First create a basket for it: + BasketFactory::newBasket(/*icon=*/"kjots", /*name=*/KURL(file.name()).fileName(), /*backgroundImage=*/"", /*backgroundColor=*/QColor(), /*textColor=*/QColor(), /*templateName=*/"1column", /*createIn=*/kjotsBasket); + Basket *basket = Global::bnpView->currentBasket(); + basket->load(); + + QString title, body; + bool haveAnEntry = false; + while (1) { + if (buf.left(9) == "\\NewEntry") { + if (haveAnEntry) // Do not add note the first time + insertTitledNote(basket, title, Tools::stripEndWhiteSpaces(body)); + title = buf.mid(10, buf.length()); // Problem : basket will be saved + body = ""; // New note will then be created // EACH time a note is imported + haveAnEntry = true; + } else if (buf.left(3) != "\\ID") { // Don't care of the ID + // Remove escaped '\' characters and append the text to the body + int pos = 0; + while ( (pos = buf.find('\\', pos)) != -1 ) + if (buf[++pos] == '\\') + buf.remove(pos, 1); + body.append(buf + "\n"); + } + buf = stream.readLine(); + if (buf.isNull()) // OEF + break; + } + // Add the ending note (there isn't any other "\\NewEntry" to do it): + if (haveAnEntry) + insertTitledNote(basket, title, Tools::stripEndWhiteSpaces(body)); + finishImport(basket); + + // IT IS A NOTEBOOK XML FILE, AT THE VERION 0.7.0 and later: + } else if ( (*it).endsWith(".book") /*&& !buf.isNull() && (buf.left(2) == "<!" / *<!DOCTYPE...* / || buf.left(2) == "<?" / *<?xml...* /)*/) { + + QDomDocument *doc = XMLWork::openFile("KJots", dirPath + *it); + if (doc == 0) + continue; + + QString bookTitle = XMLWork::getElementText(doc->documentElement(), "KJotsBook/Title"); + + // First create a basket for it: + BasketFactory::newBasket(/*icon=*/"kjots", /*name=*/bookTitle, /*backgroundImage=*/"", /*backgroundColor=*/QColor(), /*textColor=*/QColor(), /*templateName=*/"1column", /*createIn=*/kjotsBasket); + Basket *basket = Global::bnpView->currentBasket(); + basket->load(); + + QDomElement docElem = XMLWork::getElement(doc->documentElement(), "KJotsBook"); + for ( QDomNode n = docElem.firstChild(); !n.isNull(); n = n.nextSibling() ) { + QDomElement e = n.toElement(); + if ( (!e.isNull()) && e.tagName() == "KJotsPage" ) + insertTitledNote(basket, XMLWork::getElementText(e, "Title"), XMLWork::getElementText(e, "Text")); + } + finishImport(basket); + + } + + file.close(); + } + } +} + +void SoftwareImporters::importKNotes() +{ + QString dirPath = locateLocal("appdata","") + "/../knotes/"; // I thing the assumption is good + QDir dir(dirPath, QString::null, QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::NoSymLinks); + + QStringList list = dir.entryList(); + for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { // For each file + if ( ! (*it).endsWith(".ics") ) // Don't process *.ics~ and otehr files + continue; + QFile file(dirPath + *it); + if (file.open(IO_ReadOnly)) { + QTextStream stream(&file); + stream.setEncoding(QTextStream::UnicodeUTF8); + + // First create a basket for it: + BasketFactory::newBasket(/*icon=*/"knotes", /*name=*/i18n("From KNotes"), /*backgroundImage=*/"", /*backgroundColor=*/QColor(), /*textColor=*/QColor(), /*templateName=*/"1column", /*createIn=*/0); + Basket *basket = Global::bnpView->currentBasket(); + basket->load(); + + bool inVJournal = false; + bool inDescription = false; + bool isRichText = false; + QString title, body; + QString buf; + while (1) { + buf = stream.readLine(); + if (buf.isNull()) // OEF + break; + + if ( !buf.isNull() && buf == "BEGIN:VJOURNAL") { + inVJournal = true; + } else if (inVJournal && buf.startsWith("SUMMARY:")) { + title = buf.mid(8, buf.length()); + } else if (inVJournal && buf.startsWith("DESCRIPTION:")) { + body = buf.mid(12, buf.length()); + inDescription = true; + } else if (inDescription && buf.startsWith(" ")) { + body += buf.mid(1, buf.length()); + } else if (buf.startsWith("X-KDE-KNotes-RichText:")) { + isRichText = XMLWork::trueOrFalse(buf.mid(22, buf.length() - 22).stripWhiteSpace(), "false"); + } else if (buf == "END:VJOURNAL") { + insertTitledNote(basket, fromICS(title), fromICS(body), (isRichText ? Qt::RichText : Qt::PlainText)); + inVJournal = false; + inDescription = false; + isRichText = false; + title = ""; + body = ""; + } else + inDescription = false; + } + + // Bouh : duplicate code + // In case of unvalide ICAL file! + if ( ! body.isEmpty() ) // Add the ending note + insertTitledNote(basket, fromICS(title), fromICS(body), (isRichText ? Qt::RichText : Qt::PlainText)); + file.close(); + finishImport(basket); + } + } +} + +void SoftwareImporters::importStickyNotes() +{ + // Sticky Notes file is usually located in ~/.gnome2/stickynotes_applet + // We will search all directories in "~/" that contain "gnome" in the name, + // and will search for "stickynotes_applet" file (that should be XML file with <stickynotes> root. + QDir dir(QDir::home().absPath(), QString::null, QDir::Name | QDir::IgnoreCase, + QDir::Dirs | QDir::NoSymLinks | QDir::Hidden); + QStringList founds; + + QStringList list = dir.entryList(); + for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { // For each folder + if ( (*it).contains("gnome", false) ) { + QString fullPath = QDir::home().absPath() + "/" + (*it) + "/stickynotes_applet"; + if (dir.exists(fullPath)) + founds += fullPath; + } + } + + for ( QStringList::Iterator it = founds.begin(); it != founds.end(); ++it ) { // For each file + QFile file(*it); + QDomDocument *doc = XMLWork::openFile("stickynotes", *it); + if (doc == 0) + continue; + + // First create a basket for it: + BasketFactory::newBasket(/*icon=*/"gnome", /*name=*/i18n("From Sticky Notes"), /*backgroundImage=*/"", /*backgroundColor=*/QColor(), /*textColor=*/QColor(), /*templateName=*/"1column", /*createIn=*/0); + Basket *basket = Global::bnpView->currentBasket(); + basket->load(); + + QDomElement docElem = doc->documentElement(); + for ( QDomNode n = docElem.firstChild(); !n.isNull(); n = n.nextSibling() ) { + QDomElement e = n.toElement(); + if ( (!e.isNull()) && e.tagName() == "note" ) + insertTitledNote(basket, e.attribute("title"), e.text()); + } + finishImport(basket); + } +} + + + +// TODO: FIXME: Code duplicated from notecontent.cpp but with UTF-8 encoding. +// TODO: FIXME: Later, merge! +QString loadUtf8FileToString(const QString &fileName) +{ + QFile file(fileName); + if (file.open(IO_ReadOnly)) { + QTextStream stream(&file); + stream.setEncoding(QTextStream::UnicodeUTF8); + QString text; + text = stream.read(); + file.close(); + return text; + } else + return ""; +} + + +void SoftwareImporters::importTomboy() +{ + QString dirPath = QDir::home().absPath() + "/.tomboy/"; // I thing the assumption is good + QDir dir(dirPath, QString::null, QDir::Name | QDir::IgnoreCase, QDir::Files | QDir::NoSymLinks); + + Basket *basket = 0; // Create the basket ONLY if we found at least one note to add! + + QStringList list = dir.entryList(); + for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { // For each file + if ( ! (*it).endsWith(".note") ) + continue; + QDomDocument *doc = XMLWork::openFile("note", dirPath + *it); + if (doc == 0) + continue; + + if (basket == 0) { + // First create a basket for it: + BasketFactory::newBasket(/*icon=*/"tomboy", /*name=*/i18n("From Tomboy"), /*backgroundImage=*/"", /*backgroundColor=*/QColor(), /*textColor=*/QColor(), /*templateName=*/"1column", /*createIn=*/0); + basket = Global::bnpView->currentBasket(); + basket->load(); + } + + QDomElement docElem = doc->documentElement(); + QString title = XMLWork::getElementText(docElem, "title"); + + // DOES NOT REALLY WORKS: + //QDomElement contentElement = XMLWork::getElement(docElem, "text/note-content"); + //QString content = XMLWork::innerXml(contentElement); + + // Isolate "<note-content version="0.1">CONTENT</note-content>"! + QString xml = loadUtf8FileToString(dirPath + *it); + xml = xml.mid(xml.find("<note-content ")); + xml = xml.mid(xml.find(">") + 1); + xml = xml.mid(0, xml.find("</note-content>")); + + if (!title.isEmpty() && !/*content*/xml.isEmpty()) + insertTitledNote(basket, title, fromTomboy(xml/*content*/), Qt::RichText); + } + + if (basket) + finishImport(basket); +} + +void SoftwareImporters::importTextFile() +{ + QString fileName = KFileDialog::getOpenFileName(":ImportTextFile", "*|All files"); + if (fileName.isEmpty()) + return; + + TextFileImportDialog dialog; + if (dialog.exec() == QDialog::Rejected) + return; + QString separator = dialog.separator(); + + QFile file(fileName); + if (file.open(IO_ReadOnly)) { + QTextStream stream(&file); + stream.setEncoding(QTextStream::Locale); + QString content = stream.read(); + QStringList list = (separator.isEmpty() + ? QStringList(content) + : QStringList::split(separator, content, /*allowEmptyEntries=*/false) + ); + + // First create a basket for it: + QString title = i18n("From TextFile.txt", "From %1").arg(KURL(fileName).fileName()); + BasketFactory::newBasket(/*icon=*/"txt", title, /*backgroundImage=*/"", /*backgroundColor=*/QColor(), /*textColor=*/QColor(), /*templateName=*/"1column", /*createIn=*/0); + Basket *basket = Global::bnpView->currentBasket(); + basket->load(); + + // Import every notes: + for (QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { + Note *note = NoteFactory::createNoteFromText((*it).stripWhiteSpace(), basket); + basket->insertNote(note, basket->firstNote(), Note::BottomColumn, QPoint(), /*animate=*/false); + } + + // Finish the export: + finishImport(basket); + } +} + +/** @author Petri Damsten <petri.damsten@iki.fi> + */ +void SoftwareImporters::importKnowIt() +{ + KURL url = KFileDialog::getOpenURL(":ImportKnowIt", + "*.kno|KnowIt files\n*|All files"); + if (!url.isEmpty()) + { + QFile file(url.path()); + QFileInfo info(url.path()); + Basket* basket = 0; + QPtrStack<Basket> baskets; + QString text; + int hierarchy = 0; + + TreeImportDialog dialog; + if (dialog.exec() == QDialog::Rejected) + return; + + hierarchy = dialog.choice(); + + BasketFactory::newBasket(/*icon=*/"knowit", + /*name=*/info.baseName(), + /*backgroundImage=*/"", + /*backgroundColor=*/QColor(), + /*textColor=*/QColor(), + /*templateName=*/"1column", + /*createIn=*/0); + basket = Global::bnpView->currentBasket(); + basket->load(); + baskets.push(basket); + + if(file.open(IO_ReadOnly)) + { + QTextStream stream(&file); + uint level = 0; + QString name; + QString line; + QStringList links; + QStringList descriptions; + + stream.setEncoding(QTextStream::UnicodeUTF8); + while(1) + { + line = stream.readLine(); + + if(line.startsWith("\\NewEntry") || + line.startsWith("\\CurrentEntry") || stream.atEnd()) + { + while(level + 1 < baskets.count()) + baskets.pop(); + if(level + 1 > baskets.count()) + baskets.push(basket); + + if(!name.isEmpty()) + { + if((level == 0 && hierarchy == 1) || + (hierarchy == 0)) + { + BasketFactory::newBasket(/*icon=*/"knowit", + /*name=*/name, + /*backgroundImage=*/"", + /*backgroundColor=*/QColor(), + /*textColor=*/QColor(), + /*templateName=*/"1column", + /*createIn=*/baskets.top()); + basket = Global::bnpView->currentBasket(); + basket->load(); + } + + if(!text.stripWhiteSpace().isEmpty() || + hierarchy == 2 || + (hierarchy == 1 && level > 0)) + { + insertTitledNote(basket, name, text, Qt::RichText); + } + for(uint j = 0; j < links.count(); ++j) + { + Note* link; + if(descriptions.count() < j+1 || descriptions[j].isEmpty()) + link = NoteFactory::createNoteLink(links[j], basket); + else + link = NoteFactory::createNoteLink(links[j], + descriptions[j], basket); + basket->insertCreatedNote(link); + } + finishImport(basket); + } + if(stream.atEnd()) + break; + + int i = line.find("Entry") + 6; + int n = line.find(' ', i); + level = line.mid(i, n - i).toInt(); + name = line.mid(n+1); + text = ""; + links.clear(); + descriptions.clear(); + } + else if(line.startsWith("\\Link")) + { + links.append(line.mid(6)); + } + else if(line.startsWith("\\Descr")) + { + while(descriptions.count() < links.count() - 1) + descriptions.append(""); + descriptions.append(line.mid(7)); + } + else + { + text += line + "\n"; + } + } + file.close(); + } + } +} + +void SoftwareImporters::importTuxCards() +{ + QString fileName = KFileDialog::getOpenFileName(":ImportTuxCards", "*|All files"); + if (fileName.isEmpty()) + return; + + TreeImportDialog dialog; + if (dialog.exec() == QDialog::Rejected) + return; + + int hierarchy = dialog.choice(); + + QDomDocument *document = XMLWork::openFile("tuxcards_data_file"/*"InformationCollection"*/, fileName); + if (document == 0) { + KMessageBox::error(0, i18n("Can not import that file. It is either corrupted or not a TuxCards file."), i18n("Bad File Format")); + return; + } + + QDomElement collection = document->documentElement(); + int remainingHierarchy = (hierarchy == 0 ? 65000 : 3 - hierarchy); + importTuxCardsNode(collection, /*parentBasket=*/0, /*parentNote=*/0, remainingHierarchy); +} + +// TODO: <InformationElement isOpen="true" isEncripted="false" + +void SoftwareImporters::importTuxCardsNode(const QDomElement &element, Basket *parentBasket, Note *parentNote, int remainingHierarchy) +{ + for (QDomNode n = element.firstChild(); !n.isNull(); n = n.nextSibling()) { + QDomElement e = n.toElement(); + if (e.isNull() || e.tagName() != "InformationElement") // Cannot handle that! + continue; + + QString icon = e.attribute("iconFileName"); + QString name = XMLWork::getElementText(e, "Description"); + QString content = XMLWork::getElementText(e, "Information"); + bool isRichText = (e.attribute("informationFormat") == "RTF"); + bool isEncrypted = (e.attribute("isEncripted") == "true"); + if (icon.isEmpty() || icon == "none") + icon = "tuxcards"; + Note *nContent; + + if (isEncrypted) { + KMessageBox::information(0, i18n("A note is encrypted. The importer does not yet support encrypted notes. Please remove the encryption with TuxCards and re-import the file."), i18n("Encrypted Notes not Supported Yet")); + isRichText = true; + content = i18n("<font color='red'><b>Encrypted note.</b><br>The importer do not support encrypted notes yet. Please remove the encryption with TuxCards and re-import the file.</font>"); + } + + if (remainingHierarchy > 0) { + BasketFactory::newBasket(icon, name, /*backgroundImage=*/"", /*backgroundColor=*/QColor(), /*textColor=*/QColor(), /*templateName=*/"1column", parentBasket); + Basket *basket = Global::bnpView->currentBasket(); + basket->load(); + + if (isRichText) + nContent = NoteFactory::createNoteHtml(content, basket); + else + nContent = NoteFactory::createNoteText(content, basket); + basket->insertNote(nContent, basket->firstNote(), Note::BottomColumn, QPoint(), /*animate=*/false); + + importTuxCardsNode(e, basket, 0, remainingHierarchy - 1); + finishImport(basket); + } else { + Note *nGroup = insertTitledNote(parentBasket, name, content, (isRichText ? Qt::RichText : Qt::PlainText), parentNote); + importTuxCardsNode(e, parentBasket, nGroup, remainingHierarchy - 1); + } + } +} + +#include "softwareimporters.moc" |