From: Carsten Niehaus Date: Sun, 3 Jul 2005 19:55:50 +0000 (+0000) Subject: Adding the first version of KdeEduGlossary. This class will be shared by X-Git-Tag: v3.4.90~21 X-Git-Url: https://git.rmz.fi/?a=commitdiff_plain;h=efa64b629986fc0b39d9e843a0bcde85fe646592;p=libqmvoc.git Adding the first version of KdeEduGlossary. This class will be shared by Kalzium and KStars, at least. Currently, we have three classes: GlossaryDialog: The dialog, derived from KDialogBase GlossaryItem: An item, consists of a name, the content potentially references and pictures, stored as QStringLists. Glossary: This class stores and manages the items. It also has the xml-parser. svn path=/trunk/KDE/kdeedu/libkdeedu/; revision=431277 --- diff --git a/kdeeduui/Makefile.am b/kdeeduui/Makefile.am index eacfe52..0b4d034 100644 --- a/kdeeduui/Makefile.am +++ b/kdeeduui/Makefile.am @@ -5,9 +5,10 @@ lib_LTLIBRARIES = libkdeeduui.la libkdeeduui_la_SOURCES = \ kedusimpleentrydlg.cpp kedusimpleentrydlgForm.ui + kdeeduglossary.cpp -libkdeeduui_la_LDFLAGS = $(all_libraries) -no-undefined -version-info 3:0:2 -libkdeeduui_la_LIBADD = $(LIB_KDECORE) +libkdeeduui_la_LDFLAGS = $(all_libraries) -no-undefined -version-info 3:5:0 +libkdeeduui_la_LIBADD = $(LIB_KDECORE) $(LIB_KIO) $(LIB_KDEUI) $(LIB_KHTML) METASOURCES = AUTO diff --git a/kdeeduui/kdeeduglossary.cpp b/kdeeduui/kdeeduglossary.cpp new file mode 100644 index 0000000..0f06479 --- /dev/null +++ b/kdeeduui/kdeeduglossary.cpp @@ -0,0 +1,356 @@ +/*************************************************************************** + * * + * 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 "glossarydialog.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +bool Glossary::loadLayout( QDomDocument &questionDocument, const QString& path, const QString& filename ) +{ + KURL url; + url.setPath( path ); + url.setFileName( filename ); + + QFile layoutFile( url.path() ); + + if (!layoutFile.exists()) + kdDebug() << "no such file: " << layoutFile.name() << endl; +//X +//X //TODO really needed? +//X if (!layoutFile.open(IO_ReadOnly)) +//X return false; +//X +//X ///Check if document is well-formed +//X if (!questionDocument.setContent(&layoutFile)) +//X { +//X kdDebug() << "wrong xml" << endl; +//X layoutFile.close(); +//X return false; +//X } +//X layoutFile.close(); + + return true; +} + +QValueList Glossary::readItems( QDomDocument &itemDocument ) +{ + QValueList list; + +//X QDomNodeList itemList; +//X QDomNodeList refNodeList; +//X QDomElement itemElement; +//X QStringList reflist; +//X +//X itemList = itemDocument.elementsByTagName( "item" ); +//X +//X const uint num = itemList.count(); +//X for ( uint i = 0; i < num; ++i ) +//X { +//X reflist.clear(); +//X KnowledgeItem *item = new KnowledgeItem(); +//X +//X itemElement = ( const QDomElement& ) itemList.item( i ).toElement(); +//X +//X QDomNode nameNode = itemElement.namedItem( "name" ); +//X QDomNode descNode = itemElement.namedItem( "desc" ); +//X QDomElement refNode = ( const QDomElement& ) itemElement.namedItem( "references" ).toElement(); +//X +//X QString desc = descNode.toElement().text(); +//X desc.replace("[img]", m_picbasestring ); +//X desc.replace("[/img]", "\" />" ); +//X desc.replace("[b]", "" ); +//X desc.replace("[/b]", "" ); +//X desc.replace("[i]", "" ); +//X desc.replace("[/i]", "" ); +//X +//X // kdDebug() << desc << endl; +//X +//X item->setName( i18n( nameNode.toElement( ).text().utf8() ) ); +//X item->setDesc( i18n( desc.utf8() ) ); +//X refNodeList = refNode.elementsByTagName( "refitem" ); +//X for ( uint it = 0; it < refNodeList.count(); it++ ) +//X { +//X reflist << i18n( refNodeList.item( it ).toElement().text().utf8() ); +//X } +//X reflist.sort(); +//X item->setRef( reflist ); +//X +//X list.append( item ); +//X } +//X +//X return list; +} + + + +GlossaryDialog::GlossaryDialog( QWidget *parent, const char *name) + : KDialogBase( Plain, i18n( "Glossary" ), Close, Close, parent, name, false ) +{ +//X QString baseHtml = KGlobal::dirs()->findResourceDir("data", "kalzium/data/" ); +//X baseHtml.append("kalzium/data/"); +//X baseHtml.append("bg.jpg"); +//X +//X m_picbasestring = KGlobal::dirs()->findResourceDir("data", "kalzium/data/" ); +//X m_picbasestring.append("kalzium/data/knowledgepics/"); +//X m_picbasestring.prepend( ""); +//X +//X QVBoxLayout *vbox = new QVBoxLayout( plainPage(), 0, KDialog::spacingHint() ); +//X vbox->activate(); +//X +//X QHBoxLayout *hbox = new QHBoxLayout( 0L, 0, KDialog::spacingHint() ); +//X hbox->activate(); +//X +//X QToolButton *clear = new QToolButton( plainPage() ); +//X clear->setIconSet( SmallIconSet( "locationbar_erase" ) ); +//X hbox->addWidget( clear ); +//X +//X QLabel *lbl = new QLabel( plainPage() ); +//X lbl->setText( i18n( "Search:" ) ); +//X hbox->addWidget( lbl ); +//X +//X m_search = new KListViewSearchLine( plainPage(), 0, "search-line" ); +//X hbox->addWidget( m_search ); +//X vbox->addLayout( hbox ); +//X setFocusProxy(m_search); +//X +//X QSplitter *vs = new QSplitter( plainPage() ); +//X vbox->addWidget( vs ); +//X +//X m_glosstree = new KListView( vs, "treeview" ); +//X m_glosstree->addColumn( "entries" ); +//X m_glosstree->header()->hide(); +//X m_glosstree->setFullWidth( true ); +//X m_glosstree->setRootIsDecorated( true ); +//X +//X m_search->setListView( m_glosstree ); +//X +//X m_htmlpart = new KHTMLPart( vs, "html-part" ); +//X +//X m_actionCollection = new KActionCollection(this); +//X KStdAction::quit(this, SLOT(slotClose()), m_actionCollection); +//X +//X QDomDocument doc( "foo" ); +//X QString filename = "knowledge.xml"; +//X +//X if ( loadLayout( doc, filename ) ) +//X m_itemList = readItems( doc ); +//X +//X QDomDocument doc2( "foo" ); +//X filename = "tools.xml"; +//X +//X if ( loadLayout( doc2, filename ) ) +//X m_toolList = readTools( doc2 ); +//X +//X populateTree(); +//X +//X connect( m_htmlpart->browserExtension(), SIGNAL( openURLRequestDelayed( const KURL &, const KParts::URLArgs & ) ), this, SLOT( displayItem( const KURL &, const KParts::URLArgs & ) ) ); +//X connect( m_glosstree, SIGNAL(clicked( QListViewItem * )), this, SLOT(slotClicked( QListViewItem * ))); +//X connect( clear, SIGNAL(clicked()), m_search, SLOT(clear())); +//X +//X resize( 550, 400 ); +} + +GlossaryDialog::~GlossaryDialog() +{ +} + +void GlossaryDialog::keyPressEvent(QKeyEvent* e) +{ + if (e->key() == Qt::Key_Return) { + e->ignore(); + } + KDialogBase::keyPressEvent(e); +} + +void GlossaryDialog::displayItem( const KURL& url, const KParts::URLArgs& ) +{ +//X // using the "host" part of a kurl as reference +//X QString myurl = url.host().lower(); +//X m_search->setText( "" ); +//X m_search->updateSearch( "" ); +//X QListViewItem *found = 0; +//X QListViewItemIterator it( m_glosstree ); +//X QListViewItem *item; +//X while ( it.current() ) +//X { +//X item = it.current(); +//X if ( item->text(0).lower() == myurl ) +//X { +//X found = item; +//X break; +//X } +//X ++it; +//X } +//X slotClicked( found ); +} + +void GlossaryDialog::populateTree() +{ +//X QValueList::iterator it = m_itemList.begin(); +//X const QValueList::iterator itEnd = m_itemList.end(); +//X +//X QListViewItem *main = new QListViewItem( m_glosstree, i18n( "Main Glossary" ) ); +//X main->setExpandable( true ); +//X main->setSelectable( false ); +//X for ( ; it != itEnd ; ++it ) +//X { +//X QChar thisletter = ( *it )->name().upper()[0]; +//X QListViewItem *thisletteritem = findTreeWithLetter( thisletter, main ); +//X if ( !thisletteritem ) +//X { +//X thisletteritem = new QListViewItem( main, thisletter ); +//X thisletteritem->setExpandable( true ); +//X thisletteritem->setSelectable( false ); +//X } +//X new QListViewItem( thisletteritem, ( *it )->name() ); +//X } +//X main->sort(); +//X +//X QValueList::iterator itTools = m_toolList.begin(); +//X const QValueList::iterator itEndTools = m_toolList.end(); +//X +//X QListViewItem *maintools = new QListViewItem( m_glosstree, i18n( "Tools" ) ); +//X maintools->setExpandable( true ); +//X maintools->setSelectable( false ); +//X for ( ; itTools != itEndTools ; ++itTools ) +//X { +//X new QListViewItem( maintools, ( *itTools )->name() ); +//X } +//X maintools->sort(); + +} + +QListViewItem* GlossaryDialog::findTreeWithLetter( const QChar& l, QListViewItem* i ) +{ + QListViewItem *it = i->firstChild(); + while ( it ) + { + if ( it->text(0)[0] == l ) + return it; + it = it->nextSibling(); + } + return 0; +} + +void GlossaryDialog::slotClicked( QListViewItem *item ) +{ +//X if ( !item ) +//X return; +//X +//X QString html = m_htmlbasestring; +//X +//X /** +//X * The next lines are searching for the correct KnowledgeItem +//X * in the m_itemList. When it is found the HTML will be +//X * generated +//X */ +//X QValueList::iterator it = m_itemList.begin(); +//X const QValueList::iterator itEnd = m_itemList.end(); +//X bool found = false; +//X KnowledgeItem *i = 0; +//X while ( !found && it != itEnd ) +//X { +//X if ( ( *it )->name() == item->text( 0 ) ) +//X { +//X i = *it; +//X found = true; +//X } +//X ++it; +//X } +//X if ( found && i ) +//X { +//X html += i->toHtml() + ""; +//X m_htmlpart->begin(); +//X m_htmlpart->write( html ); +//X m_htmlpart->end(); +//X return; +//X } +//X +//X QValueList::iterator itTools = m_toolList.begin(); +//X const QValueList::iterator itEndTools = m_toolList.end(); +//X ToolItem *iTools = 0; +//X while ( !found && itTools != itEndTools ) +//X { +//X if ( ( *itTools )->name() == item->text( 0 ) ) +//X { +//X iTools = *itTools; +//X found = true; +//X } +//X ++itTools; +//X } +//X if ( found && iTools ) +//X { +//X html += iTools->toHtml() + ""; +//X m_htmlpart->begin(); +//X m_htmlpart->write( html ); +//X m_htmlpart->end(); +//X } +} + +void GlossaryDialog::slotClose() +{ + emit closed(); + accept(); +} + +QString GlossaryItem::toHtml() const +{ +//X QString code = "

" + m_name + "

" + m_desc; +//X +//X // QString pic_path = locate("data", "kalzium/data/knowledgepics/"); +//X if ( !m_ref.isEmpty() ) +//X { +//X QString refcode = parseReferences(); +//X code += refcode; +//X } +//X return code; +} + +QString KnowledgeItem::parseReferences() const +{ +//X QString htmlcode = "

" + i18n( "References" ) + "

"; +//X +//X bool first = true; +//X for ( uint i = 0; i < m_ref.size(); i++ ) +//X { +//X if ( !first ) +//X htmlcode += "
"; +//X else +//X first = false; +//X htmlcode += QString( "%2" ).arg( m_ref[i], m_ref[i] ); +//X } +//X +//X return htmlcode; +} + + +#include "kdeeduglossary.moc" diff --git a/kdeeduui/kdeeduglossary.h b/kdeeduui/kdeeduglossary.h new file mode 100644 index 0000000..7f5aeaa --- /dev/null +++ b/kdeeduui/kdeeduglossary.h @@ -0,0 +1,199 @@ +#ifndef KDEEDUGLOSSARY_H +#define KDEEDUGLOSSARY_H +/*************************************************************************** + + copyright : (C) 2005 by Carsten Niehaus + email : cniehaus@kde.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. * + * * + ***************************************************************************/ + + +#include +#include + +class QChar; +class QDomDocument; +class QListViewItem; +class KListView; +class KListViewSearchLine; +class KActionCollection; +class GlossaryItem; + +/** + * @class Glossary + * @author Carsten Niehaus + * + * This class stores all items to be displayed. It also + * has access-methods to the items + */ +class Glossary +{ + public: + Glossary(){}; + ~Glossary(){}; + + /** + * add the item @p item to the glossary + */ + void addItem( GlossaryItem* item ){ + m_itemlist.append( item ); + } + + /** + * clear the Glossary + */ + void clear(){ + m_itemlist.clear(); + } + + /** + * Every glossary can have a name. It will be + * set to @p name + */ + void setName( const QString& name ){ + m_name = name; + } + + /** + * @returns the name of the glossary + */ + QString name()const{ + return m_name; + } + + /** + * @param path The path where to look for the file + * @param filename The file to be loaded + * @return true if the file was successfully loaded + */ + bool loadLayout( QDomDocument&, const QString& path, const QString& filename ); + + private: + QValueList readItems( QDomDocument &itemDocument ); + + QValueList m_itemlist; + + QString m_name; +}; + +/** + * @class GlossaryItem + * @author Carsten Niehaus + * + * A GlossaryItem stores the information of the content of + * the item and its name. Furthermore, every item can have + * a number of pictures or references associated to it. + * These are stored as QStringLists. + */ +class GlossaryItem +{ + public: + GlossaryItem(); + ~GlossaryItem(); + + void setName( const QString& s ){ + m_name = s; + } + + void setDesc( const QString& s){ + m_desc = s; + } + + void setRef( const QStringList& s){ + m_ref = s; + } + + void setPictures( const QString& s ){ + m_pic = s; + } + + QString name() const { + return m_name; + } + + QString desc() const { + return m_desc; + } + + QStringList ref() const { + return m_ref; + } + + QStringList pictures() const { + return m_pic; + } + + /** + * @return the formated HTML code for current item. + **/ + QString toHtml() const; + + /** + * This method parses the references. + * @return the HTML code with the references as HTML links + */ + QString parseReferences() const; + + private: + QString m_name; + QString m_desc; + QStringList m_ref; + QStringList m_pic; +}; + +class GlossaryDialog : public KDialogBase +{ + Q_OBJECT + + public: + GlossaryDialog( QWidget *parent=0, const char *name=0); + ~GlossaryDialog(); + + void keyPressEvent(QKeyEvent*); + + /** + * sets the glossary + */ + void setGlossary( const Glossary& glossary ){ + m_glossary = glossary; + } + + private: + Glossary m_glossary; + + KHTMLPart *m_htmlpart; + QString m_htmlbasestring; + QString m_picbasestring; + KListView *m_glosstree; + + KActionCollection* m_actionCollection; + + void populateTree(); + QListViewItem* findTreeWithLetter( const QChar&, QListViewItem* ); + + KListViewSearchLine *m_search; + + private slots: + void slotClicked( QListViewItem * ); + /** + * The user clicked on a href. Emit the corresponding item + */ + void displayItem( const KURL& url, const KParts::URLArgs& args ); + + protected slots: + virtual void slotClose(); + + signals: + void closed(); +}; + +#endif // KDEEDUGLOSSARY_H +