/*************************************************************************** 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 TQt // include files for KDE #include #include #include #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" //TQList *KWordQuizDoc::pViewList = 0L; //KWordQuizView *KWordQuizDoc::m_view; KWordQuizDoc::KWordQuizDoc(TQWidget *parent, const char *name) : TQObject(parent, name) { connect(KDirWatch::self(), TQT_SIGNAL(dirty(const TQString& )), this, TQT_SLOT(slotModifiedOnDisk(const TQString& ))); /* if(!pViewList) { pViewList = new TQList(); } 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) { TQString tmpfile; if (TDEIO::NetAccess::download( url, tmpfile, 0 )) { TQFile file(tmpfile); if (!file.open(IO_ReadOnly)) { KMessageBox::error(0, i18n("Cannot open file
%1
").arg(url.path())); return false; } if (append) doc_url.setFileName(i18n("Untitled")); //To invoke Save As..., else doc_url = url; TQTable* 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); TQString 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)); } TQString 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()); } TQString 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") { TQTextStream ts(&file); ts.setEncoding(TQTextStream::UnicodeUTF8); TQString f = ts.read(); TQStringList fl = TQStringList::split('\n', f, true); g->setNumRows(fl.count() - 1 + i); TQStringList sl = TQStringList::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++) { TQStringList sl = TQStringList::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(); TDEIO::NetAccess::removeTempFile( tmpfile ); //Apply word wrap to cell with text TQTableItem* 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*/) { TQFile file(url.path()); if (!file.open(IO_WriteOnly)) { KMessageBox::error(0, i18n("Cannot write to file
%1
") .arg(url.path())); //if (filename == fname) // filename = ""; return false; } TQTable* g = m_view; TQString s = ""; int w = 0; if (url.path().right(6) == ".kvtml") { file.close(); KVTMLWriter writer(&file); writer.addHeader(TQString("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) { TQTableSelection 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") { TQTextStream ts(&file); ts.setEncoding(TQTextStream::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") { TQString cw1 = "width: " + TQString::number(g->columnWidth(0)) + "; "; TQString cw2 = "width: " + TQString::number(g->columnWidth(1)) + "; "; TQString fn = "font-family: '" + g->font().family() + "'; "; TQString fs = "font-size: " + TQString::number(g->font().pointSize()) + "pt; "; TQString fb; TQString 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; "; TQString hstyle0 = "style=\"text-align: right; width: " + TQString::number(g->verticalHeader()->sectionSize(0)) + "; font-size: 12pt; background-color: darkgray\""; TQString hstyle1 = "style=\"" + cw1 + "font-size: 12pt; background-color: darkgray\""; TQString hstyle2 = "style=\"" + cw2 + "font-size: 12pt; background-color: darkgray\""; TQString style1 = "style=\"" + cw1 + fn + fs + fb + fi + "background-color: white\""; TQString style2 = "style=\"" + cw2 + fn + fs + fb + fi + "background-color: white\""; TQTextStream ts(&file); ts.setEncoding(TQTextStream::UnicodeUTF8); ts << "" << endl; ts << "" << endl; ts << "" << endl; ts << "" << endl; ts << "" << url.fileName() << "" << endl; ts << "" << endl; ts << "" << endl; ts << "" << endl; ts << "" << endl; ts << "" << endl; ts << "" << endl; ts << "" << endl; ts << "" << endl; int i = 0; int r = g->numRows(); while (i < r) { ts << "" << endl; ts << "" << endl; ts << "" << endl; ts << "" << endl; ts << "" << endl; i++; } ts << "

" << g->horizontalHeader()->label(0) << "

" + g->horizontalHeader()->label(1) << "

" << TQString::number(i + 1) << "

" << g->text(i, 0) << "

" << g->text(i, 1) << "

" << endl; ts << "" << endl; ts << "" << endl; } if (url.path().right(5) != ".html") { doc_url = url; setModified(false); } return true; } void KWordQuizDoc::deleteContents() { } void KWordQuizDoc::slotModifiedOnDisk( const TQString & 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) { TQString 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."),TQString(),i18n("Reload"),i18n("Do Not Reload")); if ( i == KMessageBox::Yes) openDocument(doc_url); } */ } #include "kwordquizdoc.moc"