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/ktouch/src/ktouchlecture.cpp

301 lines
11 KiB

/***************************************************************************
* ktouchlecture.cpp *
* ----------------- *
* Copyright (C) 2000 by Håvard Frøiland, 2003 by Andreas Nicolai *
* ghorwin@users.sourceforge.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 "ktouchlecture.h"
#include <tqfile.h>
#include <tqtextstream.h>
#include <tqstringlist.h>
#include <tqdom.h>
#include <kdebug.h>
#include <tdelocale.h>
#include <tdetempfile.h>
#include <tdeio/netaccess.h>
bool KTouchLecture::load(TQWidget * window, const KURL& url) {
// Ok, first download the contents as usual using the TDEIO lib
// File is only downloaded if not local, otherwise it's just opened
TQString target;
bool result = false;
if (TDEIO::NetAccess::download(url, target, window)) {
// Ok, that was successful, store the lectureURL and read the file
TQFile infile(target);
if ( !infile.open( IO_ReadOnly ) ) {
TDEIO::NetAccess::removeTempFile(target);
return false; // Bugger it... couldn't open it...
}
TQTextStream in( &infile );
result = readLecture(in);
};
TDEIO::NetAccess::removeTempFile(target);
return result;
}
// ----------------------------------------------------------------------------
bool KTouchLecture::loadXML(TQWidget * window, const KURL& url) {
// Ok, first download the contents as usual using the TDEIO lib
// File is only downloaded if not local, otherwise it's just opened
TQString target;
bool result = false;
if (TDEIO::NetAccess::download(url, target, window)) {
// Ok, that was successful, store the lectureURL and read the file
TQFile infile(target);
if ( !infile.open( IO_ReadOnly ) ) {
TDEIO::NetAccess::removeTempFile(target);
return false; // Bugger it... couldn't open it...
}
TQDomDocument doc;
doc.setContent( &infile );
result = readLecture(doc);
}
TDEIO::NetAccess::removeTempFile(target);
return result;
}
// ----------------------------------------------------------------------------
bool KTouchLecture::saveXML(TQWidget * window, const KURL& url) const {
// create the XML document
TQDomDocument doc;
writeLecture(doc);
// and save it
TQString tmpFile;
KTempFile *temp=0;
if (url.isLocalFile())
tmpFile=url.path(); // for local files the path is sufficient
else {
temp=new KTempFile; // for remote files create a temporary file first
temp->setAutoDelete(true); // so we don't have to delete the file ourselves
tmpFile=temp->name();
}
TQFile outfile(tmpFile);
if ( !outfile.open( IO_WriteOnly ) ) {
if (temp) delete temp;
// kdDebug() << "Error creating lecture file!" << endl;
return false;
};
TQTextStream out( &outfile );
out << doc.toString();
outfile.close();
// if we have a temporary file, we still need to upload it
if (temp) {
TDEIO::NetAccess::upload(tmpFile, url, window);
delete temp;
}
return true;
}
// ----------------------------------------------------------------------------
void KTouchLecture::createDefault() {
m_lectureData.clear(); // remove everything else
m_title = i18n("A default lecture...");
m_fontSuggestions = "Monospace";
KTouchLevelData miniLevel; // create the level which is by default a mini-level
m_lectureData.push_back( miniLevel );
}
// ----------------------------------------------------------------------------
const KTouchLevelData& KTouchLecture::level(unsigned int levelNum) const {
if (levelNum>=m_lectureData.size())
levelNum=0;
return m_lectureData[levelNum];
}
// ----------------------------------------------------------------------------
bool KTouchLecture::readLecture(TQTextStream& in) {
//kdDebug() << "[KTouchLecture::loadLecture] Reading lecture file '" << lectureURL.url() << "'!" << endl;
TQString line;
// remove everything else
m_lectureData.clear();
// now loop until end of file is reached and break down the textfile into several strings containing the levels
TQStringList slist;
TQString current_level = TQString(); // used to store the current level data
line = in.readLine();
bool in_level = false;
while (!in.atEnd() && !line.isNull()) {
// only consider non-empty lines
if (!line.isEmpty()) {
// lecture title?
if (line.find("# Title:") == 0)
m_title = line.right(line.length() - 8).stripWhiteSpace();
else if (line[0]!='#' || line.find("# Comment:")!=-1) {
// ok, after all those comment lines, we finally found the beginn of a level
in_level = true;
current_level += line + '\n';
}
else if (in_level) {
// ok, a new comment found, if we were reading a level, store it
slist.append(current_level);
current_level = TQString();
in_level = false;
}
}
line = in.readLine();
};
if (!current_level.isEmpty() && in_level)
slist.append(current_level);
//kdDebug() << "Levels read = " << slist.count() << endl;
// now read all the levels
for (TQStringList::Iterator it = slist.begin(); it!=slist.end(); ++it) {
// create new level
KTouchLevelData level;
TQTextStream t(&(*it), IO_ReadOnly);
// try to read it
if (!level.readLevel(t)) {
// uh oh, error while reading level data
createDefault();
return false;
};
// add it (object will be deleted by the list)
m_lectureData.push_back(level);
}
if (m_lectureData.size()>1)
return true; // all ok
else {
// Hmm, no levels in the file. So we create our default mini level and report an error.
createDefault();
return false;
};
}
// ----------------------------------------------------------------------------
bool KTouchLecture::readLecture(TQDomDocument& doc) {
TQString line;
m_lectureData.clear(); // clean current data
// retrieve the title
TQDomNodeList entries = doc.elementsByTagName("Title");
if (entries.count() >= 1) m_title = entries.item(0).firstChild().nodeValue();
else m_title = i18n("untitled lecture");
// retrieve the comment
entries = doc.elementsByTagName("Comment");
if (entries.count() >= 1)
m_comment = entries.item(0).firstChild().nodeValue();
// retrieve the font suggestion
entries = doc.elementsByTagName("FontSuggestions");
if (entries.count() >= 1)
m_fontSuggestions = entries.item(0).firstChild().nodeValue();
// retrieve the levels
entries = doc.elementsByTagName("Level");
for (unsigned int i=0; i<entries.count(); ++i) {
KTouchLevelData level;
level.readLevel(entries.item(i));
m_lectureData.push_back(level);
}
if (m_lectureData.size()>0)
return true; // all ok
else {
// Hmm, no levels in the file. So we create our default mini level and report an error.
createDefault();
return false;
};
}
// ----------------------------------------------------------------------------
void KTouchLecture::writeLecture(TQDomDocument& doc) const {
TQDomElement root = doc.createElement( "KTouchLecture" );
doc.appendChild(root);
// Store title and ensure that the file contains a title!
TQDomElement title = doc.createElement("Title");
TQDomText titleText;
if (m_title.isEmpty()) titleText = doc.createTextNode( i18n("untitled lecture") );
else titleText = doc.createTextNode(m_title);
title.appendChild(titleText);
root.appendChild(title);
// Store comment if given
if (!m_comment.isEmpty()) {
TQDomElement comment = doc.createElement("Comment");
TQDomText commentText = doc.createTextNode(m_comment);
comment.appendChild(commentText);
root.appendChild(comment);
}
// Store font suggestion if given
if (!m_fontSuggestions.isEmpty()) {
TQDomElement font = doc.createElement("FontSuggestions");
TQDomText fontText = doc.createTextNode(m_fontSuggestions);
font.appendChild(fontText);
root.appendChild(font);
}
// Store levels
TQDomElement levels = doc.createElement("Levels");
root.appendChild(levels);
for (TQValueVector<KTouchLevelData>::const_iterator it=m_lectureData.begin();
it!=m_lectureData.end(); ++it)
{
it->writeLevel(doc, levels);
}
}
// ----------------------------------------------------------------------------
// OLD and deprecated stuff
/*
bool KTouchLecture::save(TQWidget * window, const KURL& url) const {
TQString tmpFile;
KTempFile *temp=0;
if (url.isLocalFile())
tmpFile=url.path(); // for local files the path is sufficient
else {
temp=new KTempFile; // for remote files create a temporary file first
temp->setAutoDelete(true); // so we don't have to delete the file ourselves
tmpFile=temp->name();
}
TQFile outfile(tmpFile);
if ( !outfile.open( IO_WriteOnly ) ) {
if (temp) delete temp;
// kdDebug() << "Error creating lecture file!" << endl;
return false;
};
TQTextStream out( &outfile );
writeLecture(out);
// TODO : check stream status to see if save worked
outfile.close();
// if we have a temporary file, we still need to upload it
if (temp) {
TDEIO::NetAccess::upload(tmpFile, url, window);
delete temp;
}
return true;
}
// ----------------------------------------------------------------------------
void KTouchLecture::writeLecture(TQTextStream& out) const {
out << "###################################### " << endl;
out << "# # " << endl;
out << "# Training lecture file for KTouch # " << endl;
out << "# # " << endl;
out << "###################################### " << endl << endl;
out << "# Title: " << m_title << endl;
out << endl;
int levelCounter=0;
for (TQValueVector<KTouchLevelData>::const_iterator it=m_lectureData.begin(); it!=m_lectureData.end(); ++it) {
out << "################################" << endl;
out << "# Level: " << ++levelCounter << endl;
out << "# " << endl;
it->writeLevel(out);
};
out << endl;
}
// ----------------------------------------------------------------------------
*/