You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kwordquiz/src/kwordquizdoc.cpp

491 lines
14 KiB

/***************************************************************************
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"