diff options
Diffstat (limited to 'kwordquiz/src/kwordquizdoc.cpp')
-rw-r--r-- | kwordquiz/src/kwordquizdoc.cpp | 490 |
1 files changed, 490 insertions, 0 deletions
diff --git a/kwordquiz/src/kwordquizdoc.cpp b/kwordquiz/src/kwordquizdoc.cpp new file mode 100644 index 00000000..6666bbc8 --- /dev/null +++ b/kwordquiz/src/kwordquizdoc.cpp @@ -0,0 +1,490 @@ +/*************************************************************************** + kwordquizdoc.cpp - description + ------------------- + begin : Wed Jul 24 20:12:30 PDT 2002 + copyright : (C) 2002 by Peter Hedlund + email : peter.hedlund@kdemail.net + ***************************************************************************/ + +/*************************************************************************** + * * + * 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 files for Qt + +// include files for KDE +#include <klocale.h> +#include <kmessagebox.h> +#include <kio/netaccess.h> +#include "keduvocdata.h" + +// application specific includes +#include "kwordquizdoc.h" +#include "kwordquiz.h" +#include "kvtmlwriter.h" +#include "version.h" +#include "paukerreader.h" +#include "wqlreader.h" +#include "wqlwriter.h" +#include "prefs.h" + +//QList<KWordQuizView> *KWordQuizDoc::pViewList = 0L; +//KWordQuizView *KWordQuizDoc::m_view; + +KWordQuizDoc::KWordQuizDoc(QWidget *parent, const char *name) : QObject(parent, name) +{ + connect(KDirWatch::self(), SIGNAL(dirty(const QString& )), this, SLOT(slotModifiedOnDisk(const QString& ))); + /* if(!pViewList) + { + pViewList = new QList<KWordQuizView>(); + } + + pViewList->setAutoDelete(true);*/ +} + +KWordQuizDoc::~KWordQuizDoc() +{} + +void KWordQuizDoc::addView(KWordQuizView *view) +{ + //pViewList->append(view); + m_view = view; +} + +void KWordQuizDoc::removeView(KWordQuizView *view) +{ + // m_view = Null; + // pViewList->remove(view); +} +void KWordQuizDoc::setURL(const KURL &url) +{ + doc_url=url; +} + +const KURL& KWordQuizDoc::URL() const +{ + return doc_url; +} + +void KWordQuizDoc::slotUpdateAllViews(KWordQuizView *sender) +{ + //m_view->repaint(); + /*KWordQuizView *w; + if(pViewList) + { + for(w=pViewList->first(); w!=0; w=pViewList->next()) + { + if(w!=sender) + w->repaint(); + } + }*/ + +} + +void KWordQuizDoc::setModified(bool _m) +{ + modified=_m; + if (modified) + { + // + } + else + { + // + } +} + +bool KWordQuizDoc::saveModified() +{ + bool completed=true; + + if(modified) + { + KWordQuizApp *win=(KWordQuizApp *) parent(); + int want_save = KMessageBox::warningYesNoCancel(win, + i18n("The current file has been modified.\n" + "Do you want to save it?"), + i18n("Warning"),KStdGuiItem::save(),KStdGuiItem::discard()); + switch(want_save) + { + case KMessageBox::Yes: + if (doc_url.fileName() == i18n("Untitled")) + { + completed = win->saveAsFileName(); + } + else + { + completed = saveDocument(URL()); + }; + + break; + + case KMessageBox::No: + setModified(false); + completed=true; + break; + + case KMessageBox::Cancel: + completed=false; + break; + + default: + completed=false; + break; + } + } + + return completed; +} + +void KWordQuizDoc::closeDocument() +{ + deleteContents(); +} + +bool KWordQuizDoc::newDocument() +{ + modified=false; + doc_url.setFileName(i18n("Untitled")); + return true; +} + +bool KWordQuizDoc::openDocument(const KURL& url, bool append, int index) +{ + QString tmpfile; + if (KIO::NetAccess::download( url, tmpfile, 0 )) + { + QFile file(tmpfile); + if (!file.open(IO_ReadOnly)) + { + KMessageBox::error(0, i18n("<qt>Cannot open file<br><b>%1</b></qt>").arg(url.path())); + return false; + } + + if (append) + doc_url.setFileName(i18n("Untitled")); //To invoke Save As..., + else + doc_url = url; + + QTable* g = m_view; + g->setUpdatesEnabled(false); + + int i = 0; + if (append && index > 0) + i = g->numRows(); + + if (url.path().right(7) == ".xml.gz") + { + doc_url.setFileName(i18n("Untitled"));//To invoke Save As..., since we don't have save support for this format + PaukerData * paukerDoc = new PaukerData; + PaukerDataItemList dataList = paukerDoc->parse(tmpfile); + if (!dataList.isEmpty()) + { + g->setNumRows(dataList.count() + i); + QString s; + PaukerDataItemList::ConstIterator end(dataList.end()); + for(PaukerDataItemList::ConstIterator dataIt = dataList.begin(); dataIt != end; ++dataIt) + { + s = (*dataIt).frontSide(); + if (!s.isEmpty()) + g->setText(i, 0, s); //calling setText only when there actually is text helps with sorting + s = (*dataIt).backSide(); + if (!s.isEmpty()) + g->setText(i, 1, s); + i++; + } + } + } + + if (url.path().right(6) == ".kvtml") + { + KEduVocData * kvtmldoc = new KEduVocData; + KEduVocDataItemList dataList = kvtmldoc->parse(tmpfile); + if (!dataList.isEmpty()) + { + if ((uint) kvtmldoc->numRows() > dataList.count()) + g->setNumRows(kvtmldoc->numRows() + i); + else + g->setNumRows(dataList.count() + i); + + if (!append) + { + g->horizontalHeader()->setLabel(0, kvtmldoc->language(0)); + g->horizontalHeader()->setLabel(1, kvtmldoc->language(1)); + g->setColumnWidth(0, kvtmldoc->colWidth(0)); + g->setColumnWidth(1, kvtmldoc->colWidth(1)); + } + QString s; + KEduVocDataItemList::ConstIterator end(dataList.end()); + for(KEduVocDataItemList::ConstIterator dataIt = dataList.begin(); dataIt != end; ++dataIt) + { + s = (*dataIt).originalText(); + if (!s.isEmpty()) + g->setText(i, 0, s); //calling setText only when there actually is text helps with sorting + s = (*dataIt).translatedText(); + if (!s.isEmpty()) + g->setText(i, 1, s); + i++; + } + } + } + + if (url.path().right(4) == ".wql") + { + WqlReader * wqldoc = new WqlReader; + KWqlDataItemList dataList = wqldoc->parse(tmpfile); + if (!dataList.isEmpty()) + { + if ((uint) wqldoc->numRows() > dataList.count()) + g->setNumRows(wqldoc->numRows() + i); + else + g->setNumRows(dataList.count() + i); + + if (!append) + { + g->horizontalHeader()->setLabel(0, wqldoc->language(0)); + g->horizontalHeader()->setLabel(1, wqldoc->language(1)); + g->setColumnWidth(0, wqldoc->colWidth(0)); + g->setColumnWidth(1, wqldoc->colWidth(1)); + g->setFont(wqldoc->font()); + g->setCurrentCell(wqldoc->startRow(), wqldoc->startCol()); + g->selectCells(wqldoc->startRow(), wqldoc->startCol(), wqldoc->endRow(), wqldoc->endCol()); + Prefs::setSpecialCharacters(wqldoc->specialCharacters()); + } + QString s; + KWqlDataItemList::ConstIterator end(dataList.end()); + for(KWqlDataItemList::ConstIterator dataIt = dataList.begin(); dataIt != end; ++dataIt) + { + s = (*dataIt).frontText(); + if (!s.isEmpty()) + g->setText(i, 0, s); //calling setText only when there actually is text helps with sorting + s = (*dataIt).backText(); + if (!s.isEmpty()) + g->setText(i, 1, s); + g->setRowHeight(i, (*dataIt).rowHeight()); + i++; + } + } + } + + if (url.path().right(4) == ".csv") + { + QTextStream ts(&file); + ts.setEncoding(QTextStream::UnicodeUTF8); + + QString f = ts.read(); + QStringList fl = QStringList::split('\n', f, true); + g->setNumRows(fl.count() - 1 + i); + + QStringList sl = QStringList::split(",", fl[0], true); + + if (!append) + { + if (!sl[0].isEmpty()) + g->horizontalHeader()->setLabel(0, sl[0]); + if (!sl[1].isEmpty()) + g->horizontalHeader()->setLabel(1, sl[1]); + } + + for(int j = 1; j < fl.count(); j++) + { + QStringList sl = QStringList::split(",", fl[j], true); + if (!sl[0].isEmpty()) + g->setText(i + j - 1, 0, sl[0]); + if (!sl[1].isEmpty()) + g->setText(i + j - 1, 1, sl[1]); + } + } + + file.close(); + KIO::NetAccess::removeTempFile( tmpfile ); + + //Apply word wrap to cell with text + QTableItem* itm; + for (int r = 0; r <= g->numRows() -1; ++r) + { + itm = g->item(r, 0); + if (itm != 0) + itm->setWordWrap(true); + itm = g->item(r, 1); + if (itm != 0) + itm->setWordWrap(true); + } + + g->setUpdatesEnabled(true); + g->repaintContents(); + } + modified=false; + if (append) + modified = true; + + return true; +} + +bool KWordQuizDoc::saveDocument(const KURL& url, const char *format /*=0*/) +{ + + QFile file(url.path()); + if (!file.open(IO_WriteOnly)) + { + KMessageBox::error(0, i18n("<qt>Cannot write to file<br><b>%1</b></qt>") + .arg(url.path())); + //if (filename == fname) + // filename = ""; + return false; + } + + QTable* g = m_view; + QString s = ""; + int w = 0; + + if (url.path().right(6) == ".kvtml") + { + file.close(); + KVTMLWriter writer(&file); + writer.addHeader(QString("kwordquiz %1").arg(KWQ_VERSION), 2, g->numRows(), url.fileName()); + writer.addFirstItem(g->horizontalHeader()->label(0), g->columnWidth(0), g->text(w, 0), g->horizontalHeader()->label(1), g->columnWidth(1), g->text(w, 1)); + w++; + int r = g->numRows(); + while (w < r) + { + writer.addItem(g->text(w, 0), g->text(w, 1)); + w++; + } + } + + if (url.path().right(4) == ".wql") + { + file.close(); + WqlWriter writer(&file); + writer.writeFont(g->font()); + writer.writeCharacters(Prefs::specialCharacters()); + writer.writeGridInfo(g->verticalHeader()->width(), g->columnWidth(0), g->columnWidth(1), g->numRows()); + if (g->numSelections() > 0) + { + QTableSelection qts = g->selection(0); + writer.writeSelection(qts.leftCol(), qts.topRow(), qts.rightCol(), qts.bottomRow()); + } + else + { + writer.writeSelection(g->currentColumn(), g->currentRow(), g->currentColumn(), g->currentRow()); + } + writer.writeFirstItem(g->horizontalHeader()->label(0), g->horizontalHeader()->label(1)); + int r = g->numRows(); + while (w < r) + { + writer.writeItem(g->text(w, 0), g->text(w, 1), g->rowHeight(w)); + w++; + } + } + + if (url.path().right(4) == ".csv") + { + QTextStream ts(&file); + ts.setEncoding(QTextStream::UnicodeUTF8); + ts << g->horizontalHeader()->label(0) << "," << g->horizontalHeader()->label(1) << endl; + + int i = 0; + int r = g->numRows(); + while (i < r) + { + ts << g->text(i, 0) << "," << g->text(i, 1) << endl; + i++; + } + } + + if (url.path().right(5) == ".html") + { + QString cw1 = "width: " + QString::number(g->columnWidth(0)) + "; "; + QString cw2 = "width: " + QString::number(g->columnWidth(1)) + "; "; + + QString fn = "font-family: '" + g->font().family() + "'; "; + QString fs = "font-size: " + QString::number(g->font().pointSize()) + "pt; "; + QString fb; + QString fi; + + if (g->font().bold()) + fb = "font-weight: bold; "; + else + fb = "font-weight: normal; "; + + if (g->font().italic()) + fi = "font-style: italic; "; + else + fi = "font-style: normal; "; + + QString hstyle0 = "style=\"text-align: right; width: " + QString::number(g->verticalHeader()->sectionSize(0)) + "; font-size: 12pt; background-color: darkgray\""; + QString hstyle1 = "style=\"" + cw1 + "font-size: 12pt; background-color: darkgray\""; + QString hstyle2 = "style=\"" + cw2 + "font-size: 12pt; background-color: darkgray\""; + + QString style1 = "style=\"" + cw1 + fn + fs + fb + fi + "background-color: white\""; + QString style2 = "style=\"" + cw2 + fn + fs + fb + fi + "background-color: white\""; + + QTextStream ts(&file); + ts.setEncoding(QTextStream::UnicodeUTF8); + + ts << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">" << endl; + ts << "<html>" << endl; + ts << "<head>" << endl; + ts << "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">" << endl; + + ts << "<title>" << url.fileName() << "</title>" << endl; + ts << "</head>" << endl; + ts << "<body>" << endl; + + ts << "<table cols=\"3\" border=\"0\" cellspacing=\"1\" cellpadding=\"2\" bgcolor=\"silver\">" << endl; + + ts << "<tr height=" << QString::number(g->horizontalHeader()->height()) << ">" << endl; + ts << "<td " << hstyle0 << "></td>" << endl; + ts << "<td " << hstyle1 << "><p>" << g->horizontalHeader()->label(0) << "</p></td>" << endl; + ts << "<td " << hstyle2 << "><p>" + g->horizontalHeader()->label(1) << "</p></td>" << endl; + ts << "</tr>" << endl; + + int i = 0; + int r = g->numRows(); + while (i < r) + { + ts << "<tr height=" << QString::number(g->rowHeight(i)) << ">" << endl; + ts << "<td " << hstyle0 << "><p>" << QString::number(i + 1) << "</p></td>" << endl; + ts << "<td " << style1 << "><p>" << g->text(i, 0) << "</p></td>" << endl; + ts << "<td " << style2 << "><p>" << g->text(i, 1) << "</p></td>" << endl; + ts << "</tr>" << endl; + i++; + } + + ts << "</table>" << endl; + ts << "</body>" << endl; + ts << "</html>" << endl; + } + + if (url.path().right(5) != ".html") + { + doc_url = url; + setModified(false); + } + return true; +} + +void KWordQuizDoc::deleteContents() +{ +} + +void KWordQuizDoc::slotModifiedOnDisk( const QString & path) +{ + /*@todo this code doesn't work very well. Have to look in more detail on how Kate does it. + if (doc_url.path() == path) + { + QString str = i18n("The file %1 was changed (modified) on disc by another program!\n\n").arg(doc_url.fileName()); + int i = KMessageBox::warningYesNoCancel(0, str + i18n("Do you want to reload the modified file? Data loss may occur."),QString::null,i18n("Reload"),i18n("Do Not Reload")); + if ( i == KMessageBox::Yes) + openDocument(doc_url); + } + */ +} + +#include "kwordquizdoc.moc" |