fix i18nc typo in last commit
[kdeaccessibility.git] / ksayit / src / doctreeviewimpl.cpp
blobd2273fb6dca5459bda05723760962134d7ce1832
1 //
2 // C++ Implementation: doctreeviewimpl
3 //
4 // Description:
5 //
6 //
7 // Author: Robert Vogl <voglrobe@lapislazuli>, (C) 2004
8 //
9 // Copyright: See COPYING file that comes with this distribution
12 #include <stdlib.h> // getenv
14 // Qt includes
15 #include <QtCore/QFile>
16 #include <QtGui/QWidget>
17 #include <QtCore/QTextStream>
18 #include <Qt3Support/Q3CString>
19 #include <QtCore/QRegExp>
20 #include <QtCore/QDateTime>
21 #include <QtGui/QColor>
22 #include <Qt3Support/Q3ListView>
23 #include <QtGui/QContextMenuEvent>
25 //KDE includes
26 #include <kdebug.h>
27 #include <kglobal.h>
28 #include <klocale.h>
29 #include <kfiledialog.h>
30 #include <kmessagebox.h>
31 #include <kinputdialog.h>
33 // App specific includes
34 #include "doctreeviewimpl.h"
35 #include "contextmenuhandler.h"
36 #include "parasaxparser.h"
37 #include "docbookclasses.h"
39 //////////////////////////////////////
40 // TreeView Implementation
41 //////////////////////////////////////
42 DocTreeViewImpl::DocTreeViewImpl(QWidget* parent, const char* name, Qt::WFlags fl)
43 : DocTreeView(parent, name, fl)
45 m_rootItem = NULL;
46 m_url = KUrl();
47 // the hidden formated id to set a sort order
48 listView->setSorting(3, true);
49 listView->setColumnText(0, i18n("Chapter"));
50 listView->setColumnText(1, i18n("Info"));
51 listView->setColumnText(2, i18n("Page"));
52 listView->setColumnText(3, "");
53 listView->setResizeMode( K3ListView::NoColumn );
54 listView->setColumnWidthMode(0, K3ListView::Maximum );
55 listView->setColumnWidthMode(1, K3ListView::Maximum );
56 listView->setColumnWidthMode(2, K3ListView::Maximum );
57 listView->setColumnWidthMode(3, K3ListView::Manual );
58 listView->setColumnWidth(3, 0);
59 listView->setAlternateBackground( QColor(230, 230, 240) );
60 listView->setSelectionModeExt( K3ListView::Single );
62 m_idCounter = KSayItGlobal::item_initial_id;
63 m_stopped = false;
64 m_currentItem = m_rootItem;
65 m_parasaxparser = ParaSaxParser::Instance();
66 m_editMode = false;
67 m_changedContent.clear();
69 m_contextmenuhandler = NULL;
70 m_contextmenu = NULL;
74 DocTreeViewImpl::~DocTreeViewImpl()
76 if ( m_rootItem )
77 delete m_rootItem;
78 delete m_parasaxparser;
79 if ( m_contextmenuhandler )
80 delete m_contextmenuhandler;
84 void DocTreeViewImpl::enableContextMenus( bool enabled )
86 if ( enabled ){
87 m_contextmenuhandler = new ContextMenuHandler(this, "contextmenuhandler");
88 } else {
89 if ( m_contextmenuhandler )
90 delete m_contextmenuhandler;
91 m_contextmenuhandler = NULL;
96 void DocTreeViewImpl::clear()
98 kDebug(100200) << "DocTreeViewImpl::clear()";
99 m_url = KUrl();
100 m_domTree.clear();
102 if ( m_rootItem )
103 delete m_rootItem;
105 // inform BookmarkHandler
107 emit signalSetBookmarkFilename( QString() );
109 listView->clear();
110 m_rootItem = new RobDocument( listView, i18n("unnamed") );
111 m_idCounter = KSayItGlobal::item_initial_id;
112 m_stopped = false;
113 m_currentItem = static_cast<ListViewInterface*>(m_rootItem);
117 void DocTreeViewImpl::createEmptyDocument()
119 kDebug(100200) << "DocTreeViewImpl::createEmptyDocument()";
120 // create empty document
121 QByteArray data;
122 QTextStream wrapped(data, QIODevice::ReadWrite);
123 wrapped.setEncoding(QTextStream::UnicodeUTF8);
125 wrapped << "<?xml version=\"1.0\" ?>" << endl;
126 wrapped << "<!--" << endl;
127 wrapped << "!DOCTYPE book PUBLIC \"-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN\" \"dtd/kdex.dtd\"" << endl;
128 wrapped << "-->" << endl;
130 QString header(data);
131 m_parasaxparser->setProcessingInstruction( header );
133 wrapped << "<book>" << endl;
134 wrapped << "<bookinfo>" << endl;
135 wrapped << "<title><![CDATA[" << i18n("Empty Document") << "]]></title>" << endl;
136 wrapped << "<authorgroup>" << endl;
137 wrapped << "<author>" << endl;
138 wrapped << "<firstname>KSayIt</firstname>" << endl;
139 wrapped << "<surname>Wrapper</surname>" << endl;
140 wrapped << "</author>" << endl;
141 wrapped << "</authorgroup>" << endl;
142 wrapped << "<copyright>" << endl;
143 wrapped << "<year>2005</year>" << endl;
144 wrapped << "<holder>Robert Vogl</holder>" << endl;
145 wrapped << "</copyright>" << endl;
146 wrapped << "</bookinfo>" << endl;
147 wrapped << "<chapter>" << endl;
148 wrapped << "<title><![CDATA[" << i18n("Untitled") << "]]></title>" << endl;
149 wrapped << "<para>" << endl;
150 wrapped << "";
151 wrapped << "</para>" << endl;
152 wrapped << "</chapter>" << endl;
153 wrapped << "</book>" << endl;
155 if ( !m_domTree.setContent( data ) ){
156 kDebug(100200) << "Kein gueltiges Dokument!!";
158 // inform BookmarkHandler
159 emit signalSetBookmarkFilename( i18n("Untitled") );
161 QDomElement root = m_domTree.documentElement();
162 QDomNode node;
163 if( root.tagName().toLower() == "book" ){ // DocBook
164 parseBook(root , m_rootItem); // we parse only ONE Book
167 // Initial view
168 m_currentItem = static_cast<ListViewInterface*>( listView->lastItem() );
169 listView->setSelected( m_currentItem, true );
170 listView->ensureItemVisible( m_currentItem );
171 slotItemClicked( m_currentItem );
175 void DocTreeViewImpl::openFile(const KUrl &url)
177 kDebug(100200) << "DocTreeViewImpl::openFile(" << url.path() << ")";
179 m_url = url;
180 // open file
181 QString err;
182 QFile file( url.path() );
183 if( !file.open(QIODevice::ReadOnly) ){
184 err = i18n("Unable to open File.");
185 // throw(err);
186 kDebug() << err;
187 } else {
188 // check document
189 if( m_domTree.setContent(&file) ){
190 // extract Header
191 file.reset();
192 QString header = QString();
193 QString line;
194 int offset;
195 line = file.readLine();
196 while( !file.atEnd() && (offset = line.find("<book", 0, false)) < 0 ){
197 header += line;
198 line = file.readLine();
200 file.close();
201 header += line.left( offset );
202 kDebug(100200) << "### Header: "<< header;
203 m_parasaxparser->setProcessingInstruction( header );
204 // inform BookmarkHandler about the opened file
205 emit signalSetBookmarkFilename( url.fileName() );
206 } else {
207 // File is not a valid XML-File. Wrap it
208 file.reset();
209 QByteArray data;
210 QTextStream wrapped(data, QIODevice::ReadWrite);
211 wrapped.setEncoding(QTextStream::UnicodeUTF8);
213 wrapped << "<?xml version=\"1.0\" ?>" << endl;
214 wrapped << "<!--" << endl;
215 wrapped << "!DOCTYPE book PUBLIC \"-//KDE//DTD DocBook XML V4.2-Based Variant V1.1//EN\" \"dtd/kdex.dtd\"" << endl;
216 wrapped << "-->" << endl;
218 QString header(data);
219 kDebug(100200) << "Header (Wrapper): "<< header;
220 m_parasaxparser->setProcessingInstruction( header );
222 wrapped << "<book>" << endl;
223 wrapped << "<bookinfo>" << endl;
224 wrapped << "<title><![CDATA[" << url.path() << "]]></title>" << endl;
225 wrapped << "<authorgroup>" << endl;
226 wrapped << "<author>" << endl;
227 wrapped << "<firstname>KSayIt</firstname>" << endl;
228 wrapped << "<surname>Wrapper</surname>" << endl;
229 wrapped << "</author>" << endl;
230 wrapped << "</authorgroup>" << endl;
231 wrapped << "<copyright>" << endl;
232 wrapped << "<year>2005</year>" << endl;
233 wrapped << "<holder>Robert Vogl</holder>" << endl;
234 wrapped << "</copyright>" << endl;
235 wrapped << "</bookinfo>" << endl;
236 wrapped << "<chapter>" << endl;
237 wrapped << "<title><![CDATA[" << i18n("Plain File") << "]]></title>" << endl;
238 wrapped << "<para><![CDATA[";
239 wrapped << QString( file.readAll() );
240 wrapped << "]]></para>" << endl;
241 wrapped << "</chapter>" << endl;
242 wrapped << "</book>" << endl;
243 file.close();
245 // Try again
246 if (!m_domTree.setContent(data)){
247 err = i18n("Failed wrapping the file into XML.");
248 kDebug() << err;
249 // throw(err);
251 emit signalSetBookmarkFilename( i18n("Plain File") );
254 // check if correct document type
255 QDomElement root = m_domTree.documentElement();
256 if( root.tagName().toLower() == "book" ){ // DocBook
257 parseBook(root , m_rootItem); // we parse only ONE Book
258 // Initial view
259 listView->setSelected( m_rootItem, true );
260 slotItemClicked( m_rootItem );
261 } else {
262 err = i18n("The file is of type %1, 'book' expected.", root.tagName() );
263 // throw(err);
264 kDebug() << err;
270 void DocTreeViewImpl::saveFile()
272 kDebug(100200) << "DocTreeViewImpl::saveFile()";
274 makeCurrentNodePersistent();
276 QString err;
278 if ( m_url.isEmpty() ){ // file has no name, ask user
279 QString usershome( getenv("HOME") );
280 m_url = KFileDialog::getSaveUrl(usershome, "*.docbook", this, i18n("Save File"));
282 if ( m_url.isEmpty() ) // dialog cancelled
283 return;
284 if ( !m_url.isValid() ){
285 err = i18n("The given URL is invalid. Try 'File save as...' instead.");
286 kDebug() << err;
287 // throw( err );
288 } else {
289 if ( m_url.isLocalFile() ){
290 QFile file( m_url.path() );
291 if ( !file.open(QIODevice::WriteOnly) ){
292 err = i18n("Unable open file to write.");
293 kDebug() << err;
294 // throw( err );
295 } else {
296 QTextStream out(&file);
297 out.setEncoding(QTextStream::UnicodeUTF8);
298 m_domTree.save( out, 0 );
299 m_rootItem->setText(0, m_url.path() );
300 file.close();
301 // inform BookmarkHandler
302 emit signalChangeBookmarkFilename( m_url.fileName() );
303 slotItemClicked( m_currentItem );
305 } else {
306 err = i18n("Save operation currently works on local files only.");
307 kDebug() << err;
308 // throw( err );
314 void DocTreeViewImpl::saveFileAs()
316 kDebug(100200) << "DocTreeViewImpl::saveFileAs()";
317 QString err;
319 makeCurrentNodePersistent();
321 m_url = KFileDialog::getSaveUrl(QString(), "*.docbook", this, i18n("Save File As"));
322 if ( m_url.isEmpty() ) // dialog cancelled
323 return;
324 if ( !m_url.isValid() ){
325 err = i18n("The given URL is invalid.");
326 kDebug() << err;
327 // throw( err );
328 } else {
329 if ( m_url.isLocalFile() ){
330 QFile file( m_url.path() );
331 if ( !file.open(QIODevice::WriteOnly) ){
332 err = i18n("Unable open file to write.");
333 kDebug() << err;
334 // throw( err );
335 } else {
336 QTextStream out(&file);
337 out.setEncoding(QTextStream::UnicodeUTF8);
338 m_domTree.save( out, 0 );
339 m_rootItem->setText(0, m_url.path() );
340 file.close();
341 // inform BookmarkHandler
342 emit signalChangeBookmarkFilename( m_url.fileName() );
343 slotItemClicked( m_currentItem );
345 } else {
346 err = i18n("Save operation currently works on local files only.");
347 kDebug() << err;
348 // throw( err );
354 void DocTreeViewImpl::setEditMode(bool mode)
356 m_editMode = mode;
357 if ( (m_currentItem->isEditable()) && mode ){
358 emit signalEnableTextedit( true );
359 slotItemClicked( m_currentItem );
360 return;
363 makeCurrentNodePersistent();
364 slotItemClicked( m_currentItem );
366 emit signalEnableTextedit( false );
370 QString DocTreeViewImpl::selectItemByID(const QString &ID, const QString title)
372 kDebug(100200) << "DocTreeViewImpl::selectItemByID(" << ID << ")";
374 if ( ID.isNull() )
375 return QString();
377 QString err = QString();
380 * Search on structure (URL)
381 * e.g. 1=RobDokument|1=BookInfo|1=KeywordSet|2=Keyword
383 QStringList partList;
384 partList = ID.split( "|");
385 QStringList::Iterator it = partList.begin();
386 it++; // skip first element (always RobDocument)
387 int childNum = 0;
388 QString childType = QString();
389 ListViewInterface *item = m_rootItem;
390 bool hit = false;
392 for (; it!=partList.end(); ++it){
393 kDebug(100200) << "Part: " << (*it);
394 if ( !item )
395 break; // expected item does not exist
396 item = static_cast<ListViewInterface*>( item->firstChild() );
397 if ( item ){
398 childNum = ((*it).section('=', 0, 0)).toInt();
399 childType = (*it).section('=', 1, 1);
400 for (int i=1; i<childNum; i++){
401 item = static_cast<ListViewInterface*>( item->nextSibling() );
402 if ( !item )
403 break; // expected item does not exist
405 if ( !item )
406 break; // expected item does not exist
407 QString type = item->getXmlContextName();
408 if ( childType != item->getXmlContextName() )
409 break; // structure has been changed
413 if ( item ){
414 QString itemTitle = getItemTitle( item );
415 if ( title.left(itemTitle.length()) == itemTitle )
416 // Title made unique by KDE by appending "(2)", "(3)"...
417 hit = true;
420 if ( !hit ){
422 * Not found, search on title
424 // walk trough the entire tree and try to find an item
425 // with the given title.
426 item = NULL;
427 Q3ListViewItemIterator sit( m_rootItem );
428 QString itemTitle = QString();
429 while ( sit.current() ) {
430 item = static_cast<ListViewInterface*>(sit.current());
431 if ( !item )
432 break; // expected item does not exist
433 itemTitle = getItemTitle( item );
434 if ( title.left(itemTitle.length()) == itemTitle ){
435 hit = true;
436 err = i18n("Maybe the structure of the document has been changed. Please check if this bookmark is still valid.");
437 break;
439 ++sit;
443 // still not found => Failure
444 if ( !hit ){
445 err = i18n("Bookmark not found. Maybe the file content or the bookmark URL has been changed.");
446 return err;
449 // show
450 if ( item->isEditable() )
451 makeCurrentNodePersistent();
453 listView->setSelected( item, true );
454 listView->ensureItemVisible(item );
455 slotItemClicked( item );
456 return err;
460 void DocTreeViewImpl::slotItemClicked(Q3ListViewItem *item)
462 kDebug(100200) << "DocTreeViewImpl::slotItemClicked()";
464 if ( item != m_currentItem ){
465 makeCurrentNodePersistent();
468 if ( item ){
469 m_currentItem = static_cast<ListViewInterface*>(item);
470 QString str=QString();
471 QTextStream msg(&str, QIODevice::ReadWrite);
472 msg.setEncoding(QTextStream::UnicodeUTF8);
474 // check if item has a child and check state
475 // of Edit Mode.
476 bool editable = (m_currentItem->isEditable()) && m_editMode;
478 emit signalEnableTextedit( editable );
479 recursiveTextCollector( m_currentItem, msg, !editable );
480 emit signalContentChanged( str );
482 // Create Bookmark-ID depending on the location of the item
483 // within the tree
484 QString idstring = QString();
485 QTextStream id(&idstring, QIODevice::ReadWrite);
486 id.setEncoding(QTextStream::UnicodeUTF8);
487 id << "1=RobDocument";
488 recursiveBuildItemIdentifier( m_currentItem, id );
490 // inform the Bookmark Manager about the new item.
491 QString title = getItemTitle( m_currentItem );
492 emit signalNotifyBookmarkManager(idstring, title);
497 void DocTreeViewImpl::recursiveBuildItemIdentifier(ListViewInterface* item, QTextStream &idstring)
499 kDebug(100200) << "DocTreeViewImpl::recursiveBuildItemIdentifier()";
501 if ( !item )
502 return;
504 // 1. Do we have a parent (=parentItem)?
505 // If no -> return, if yes -> recursive call
506 ListViewInterface *parentItem = NULL;
507 parentItem = static_cast<ListViewInterface*>( item->parent() );
508 if ( parentItem ){
509 recursiveBuildItemIdentifier( parentItem, idstring );
510 } else {
511 // break recursion
512 return;
515 // 2. Which child of the parentItem are we? Append no. to idstring.
516 int childno = 0;
517 QString itemID = item->text(3);
518 ListViewInterface *i = static_cast<ListViewInterface*>( parentItem->firstChild() );
519 while( i ){
520 childno++;
521 if ( i->text(3) == itemID )
522 break;
523 i = static_cast<ListViewInterface*>( i->nextSibling() );
525 idstring << "|" << childno;
527 // 3. Who are we? Append ID to idstring.
528 QString itemType = item->getXmlContextName();
529 idstring << "=" << itemType;
533 QString DocTreeViewImpl::getItemTitle( ListViewInterface *item )
535 if ( !item )
536 return QString();
538 QString col0 = item->text(0);
539 QString title= QString();
540 if ( col0 == i18n("Paragraph") ){
541 title = (item->getData()).left(32);
542 // canonify string
543 title.replace( QRegExp("^( |\t|\n)+"), "");
544 title.replace( QRegExp("( |\t|\n)$+"), "");
545 } else {
546 title = col0.left(32);
548 return title;
552 void DocTreeViewImpl::recursiveTextCollector(ListViewInterface* item, QTextStream &msg, bool header)
554 kDebug(100200) << "DocTreeViewImpl::recursiveTextCollector()";
556 QString text;
557 if ( header ){
558 // if header==true get Headers
559 msg << item->getRTFHeader();
560 text = item->getRTFData();
561 } else {
562 // get raw data (Edit Mode)
563 text = item->getRawData();
565 if ( !text.isNull() )
566 msg << text;
568 // check if current item has a child
569 ListViewInterface *i = static_cast<ListViewInterface*>(item->firstChild());
571 while( i ){
572 recursiveTextCollector( i, msg, header );
573 i = static_cast<ListViewInterface*>(i->nextSibling());
578 void DocTreeViewImpl::sayActiveNodeAndChilds()
580 kDebug(100200) << "DocTreeViewImpl::sayActiveNodeAndChilds()";
582 m_stopped = false;
583 if ( !(m_currentItem->firstChild()) ){
584 // current item has no childs. It may be changed.
585 makeCurrentNodePersistent();
588 recursiveSayNodes( m_currentItem );
589 emit signalAllNodesProcessed();
593 void DocTreeViewImpl::recursiveSayNodes(ListViewInterface* item)
595 kDebug(100200) << "DocTreeViewImpl::recursiveSayNodes()";
597 QString str;
598 QTextStream msg(&str, QIODevice::ReadWrite);
599 msg.setEncoding(QTextStream::UnicodeUTF8);
601 // write Text of item (heading)
602 msg << item->getHeader();
604 // get data of current item
605 msg << item->getData() << "\n" << endl;
607 // request say task
608 if ( !m_stopped ){
609 emit signalSetText( str );
610 } else {
611 return;
614 // check if current item has a child
615 ListViewInterface *i = static_cast<ListViewInterface*>(item->firstChild());
616 while( i ){
617 recursiveSayNodes( i );
618 i = static_cast<ListViewInterface*>(i->nextSibling());
623 void DocTreeViewImpl::stop()
625 kDebug(100200) << "DocTreeViewImpl::stop()";
626 m_stopped = true;
630 void DocTreeViewImpl::setNodeContent(QString &text)
632 kDebug(100200) << "DocTreeViewImpl::setNodeContent()";
633 m_changedContent = text;
637 void DocTreeViewImpl::makeCurrentNodePersistent()
639 kDebug(100200) << "DocTreeViewImpl::slotMakeCurrentNodePersistent()";
640 if ( m_changedContent.isNull() )
641 return; // no changes were happen
643 // TODO: Exceptions not supported.
644 // try{
645 m_currentItem->setData(m_changedContent, m_domTree);
646 m_changedContent.clear();
647 // }
648 // catch(QString err){
649 // KMessageBox::error( this, err, i18n("XML-Error") );
650 // m_changedContent.clear();
651 // }
655 void DocTreeViewImpl::contextMenuEvent(QContextMenuEvent *e)
657 kDebug(100200) << "DocTreeViewImpl::contextMenuEvent()";
659 if ( !m_currentItem )
660 return;
662 m_contextmenu = m_contextmenuhandler->getPopupMenu( m_currentItem );
663 if ( !m_contextmenu )
664 return;
666 m_contextmenu->exec( e->globalPos() );
670 /******************************************
671 * Context-Menu functions
672 ******************************************/
674 void DocTreeViewImpl::slotRenameItem()
676 kDebug(100200) << "DocTreeViewImpl::slotRenameItem()";
678 if (!m_currentItem)
679 return;
681 // get node of current TreeView item
682 QDomNode thisNode = QDomNode();
683 NodeList_type list;
684 list.clear();
685 m_currentItem->getNodes( list );
686 thisNode = list.front();
688 if ( thisNode.isNull() )
689 return;
691 bool responseOK;
692 QString newname;
693 newname = KInputDialog::getText(
694 i18n("Rename Item"),
695 i18n("Please enter the new name of the item:"),
696 m_currentItem->text(0),
697 &responseOK,
698 this/*,
699 "queryNewItemName" */
701 if ( !responseOK )
702 return;
704 // new Title element
705 QDomElement newTitle = m_domTree.createElement("Title");
706 QDomText textOfTitle = m_domTree.createTextNode(newname);
707 newTitle.appendChild( textOfTitle );
709 // find Title-element, a child of thisNode
710 QDomNode oldTitle = thisNode.firstChild();
711 while( !oldTitle.isNull() ){
712 if( oldTitle.isElement() && oldTitle.nodeName().toLower()=="title" ){
713 // replace node
714 thisNode.replaceChild(newTitle, oldTitle);
715 break;
717 oldTitle = oldTitle.nextSibling();
720 // update TreeView
721 m_currentItem->setText(0, newname);
725 void DocTreeViewImpl::slotDeleteItem()
727 kDebug(100200) << "DocTreeViewImpl::slotDeleteItem()";
729 ListViewInterface *itemToDelete = m_currentItem;
730 ListViewInterface *parentItem = NULL;
731 parentItem = static_cast<ListViewInterface*>(itemToDelete->parent());
732 if ( !parentItem )
733 return; // delete only items with parent
735 // remove DOM nodes
736 QDomNode parentNode;
737 NodeList_type nodes;
738 NodeList_type::iterator it;
739 nodes.clear();
740 itemToDelete->getNodes( nodes );
741 for ( it=nodes.begin(); it!=nodes.end(); ++it ){
742 parentNode = (*it).parentNode();
743 if ( !parentNode.isNull() ){
744 kDebug(100200) << "remove node...";
745 parentNode.removeChild( *it );
749 // try to delete bookmark
750 QString url=QString();
751 QTextStream id(&url, QIODevice::ReadWrite);
752 id.setEncoding(QTextStream::UnicodeUTF8);
753 id << "ksayit://1=RobDocument";
754 recursiveBuildItemIdentifier( itemToDelete, id );
755 QString title = getItemTitle( itemToDelete );
756 emit signalDeleteBookmark( url, title );
758 // remove TreeView item
759 delete itemToDelete;
761 // reindex entire remaining tree
762 ListViewInterface *item = NULL;
763 m_idCounter = KSayItGlobal::item_initial_id;
764 Q3ListViewItemIterator itr( m_rootItem );
765 while ( itr.current() ) {
766 item = static_cast<ListViewInterface*>(itr.current());
767 item->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
768 ++itr;
771 // show
772 m_rootItem->sort();
773 listView->setSelected( parentItem, true );
774 listView->ensureItemVisible( parentItem );
775 slotItemClicked( parentItem );
779 void DocTreeViewImpl::slotNewBookInfo()
781 if ( m_currentItem->getXmlContextName() == "RobDocument" ){
782 int newIndex = newIndexFirstChild();
783 Overview *overview = new Overview( m_currentItem, NULL, i18n("Overview") );
784 overview->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
786 NodeList_type list;
787 list.clear();
788 m_currentItem->getNodes( list );
789 QDomElement parentElement = (list.front()).toElement();
790 QDomNode newNode;
791 if ( parentElement.isElement() ){
792 QDomElement newChild = m_domTree.createElement("BookInfo");
793 newNode = parentElement.appendChild( newChild );
796 if ( !newNode.isNull() ){
797 list.clear();
798 list.push_back( newNode );
799 overview->setNodes( list );
800 m_contextmenuhandler->registerPopupMenu( overview );
803 m_rootItem->sort();
806 void DocTreeViewImpl::slotNewChapter()
808 if ( m_currentItem->getXmlContextName() == "RobDocument" ){
809 int newIndex = newIndexLastChild();
810 Chapter *chapter = new Chapter( m_currentItem, NULL, i18n("Chapter") );
811 chapter->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
812 chapter->setText(0, i18n("New Chapter Title") );
814 // New Dom Element
815 NodeList_type list;
816 list.clear();
817 m_currentItem->getNodes( list );
818 QDomElement parentElement = (list.front()).toElement();
819 QDomNode newNode;
820 if ( parentElement.isElement() ){
821 QDomElement newChild = m_domTree.createElement("Chapter");
822 QDomElement newTitle = m_domTree.createElement("Title");
823 QDomText textOfTitle = m_domTree.createTextNode( i18n("New Chapter Title") );
825 newTitle.appendChild( textOfTitle );
826 newChild.appendChild( newTitle );
827 newNode = parentElement.appendChild( newChild );
830 if ( !newNode.isNull() ){
831 list.clear();
832 list.push_back( newNode );
833 chapter->setNodes( list );
834 m_contextmenuhandler->registerPopupMenu( chapter );
837 m_rootItem->sort();
840 void DocTreeViewImpl::slotNewKeywordSet()
842 if ( m_currentItem->getXmlContextName() == "BookInfo" ){
843 // New TreeView item
844 int newIndex = newIndexFirstChild();
845 KeywordSet *keywordset = new KeywordSet(m_currentItem, NULL, i18n("Keywords"));
846 keywordset->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
848 // New Dom Element
849 NodeList_type list;
850 list.clear();
851 m_currentItem->getNodes( list );
852 QDomElement parentElement = (list.front()).toElement();
853 QDomNode newNode;
854 if ( parentElement.isElement() ){
855 QDomElement newChild = m_domTree.createElement("KeywordSet");
856 newNode = parentElement.appendChild( newChild );
859 if ( !newNode.isNull() ){
860 list.clear();
861 list.push_back( newNode );
862 keywordset->setNodes( list );
863 m_contextmenuhandler->registerPopupMenu( keywordset );
866 m_rootItem->sort();
869 void DocTreeViewImpl::slotNewKeyword()
871 if ( m_currentItem->getXmlContextName() == "KeywordSet" ){
872 // New TreeView item
873 int newIndex = newIndexLastChild();
874 Keyword *keyword = new Keyword(m_currentItem, NULL, i18n("Keyword"));
875 keyword->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
876 keyword->setText(0, i18n("New Keyword") );
878 // New Dom Element
879 NodeList_type list;
880 list.clear();
881 m_currentItem->getNodes( list );
882 QDomElement parentElement = (list.front()).toElement();
883 QDomNode newNode;
884 QDomText newText;
885 if ( parentElement.isElement() ){
886 QDomElement newChild = m_domTree.createElement("Keyword");
887 newText = m_domTree.createTextNode( i18n("New Keyword") );
888 newChild.appendChild( newText );
889 newNode = parentElement.appendChild( newChild );
892 if ( !newText.isNull() ){
893 list.clear();
894 list.push_back( newText );
895 keyword->setNodes( list );
896 m_contextmenuhandler->registerPopupMenu( keyword );
899 m_rootItem->sort();
902 void DocTreeViewImpl::slotNewAbstract()
904 if ( m_currentItem->getXmlContextName() == "BookInfo" ){
905 // New TreeView item
906 int newIndex = newIndexLastChild();
907 Abstract *abstract = new Abstract(m_currentItem, NULL, i18n("Abstract"));
908 abstract->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
910 // New Dom Element
911 NodeList_type list;
912 list.clear();
913 m_currentItem->getNodes( list );
914 QDomElement parentElement = (list.front()).toElement();
915 QDomNode newNode;
916 if ( parentElement.isElement() ){
917 QDomElement newAbstract = m_domTree.createElement("Abstract");
918 // QDomElement newPara = m_domTree.createElement("Para");
919 // newAbstract.appendChild( newPara );
920 newNode = parentElement.appendChild( newAbstract );
923 if ( !newNode.isNull() ){
924 list.clear();
925 list.push_back( newNode );
926 abstract->setNodes( list );
927 m_contextmenuhandler->registerPopupMenu( abstract );
929 // add a new Para-Element
930 ListViewInterface *backup = m_currentItem;
931 m_currentItem = abstract;
932 slotNewParagraph();
933 m_currentItem = backup;
935 m_rootItem->sort();
938 void DocTreeViewImpl::slotNewAuthorGroup()
940 if ( m_currentItem->getXmlContextName() == "BookInfo" ){
941 // New TreeView item
942 int newIndex = newIndexFirstChild();
943 AuthorGroup *authorgroup = new AuthorGroup(m_currentItem, NULL, i18n("Author(s)"));
944 authorgroup->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
946 // New Dom Element
947 NodeList_type list;
948 list.clear();
949 m_currentItem->getNodes( list );
950 QDomElement parentElement = (list.front()).toElement();
951 QDomNode newNode;
952 if ( parentElement.isElement() ){
953 QDomElement newAuthorGroup = m_domTree.createElement("AuthorGroup");
954 newNode = parentElement.appendChild( newAuthorGroup );
957 if ( !newNode.isNull() ){
958 list.clear();
959 list.push_back( newNode );
960 authorgroup->setNodes( list );
961 m_contextmenuhandler->registerPopupMenu( authorgroup );
963 // add a new Author-Element
964 ListViewInterface *backup = m_currentItem;
965 m_currentItem = authorgroup;
966 slotNewAuthor();
967 m_currentItem = backup;
969 m_rootItem->sort();
972 void DocTreeViewImpl::slotNewAuthor()
974 if ( m_currentItem->getXmlContextName() == "AuthorGroup" ){
975 // New TreeView item
976 int newIndex = newIndexLastChild();
977 Author *author = new Author(m_currentItem);
978 author->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
979 author->setText(0, i18n("Author") );
980 author->setText(1, i18n("Firstname Surname") );
982 // New Dom Element
983 NodeList_type list;
984 list.clear();
985 m_currentItem->getNodes( list );
986 QDomElement parentElement = (list.front()).toElement();
987 QDomText firstname = QDomText();
988 QDomText surname = QDomText();
990 if ( parentElement.isElement() ){
991 QDomElement newAuthor = m_domTree.createElement("Author");
992 QDomElement newFirstname = m_domTree.createElement("Firstname");
993 firstname = m_domTree.createTextNode( i18n("Firstname") );
994 newFirstname.appendChild( firstname );
996 QDomElement newSurname = m_domTree.createElement("Surname");
997 surname = m_domTree.createTextNode( i18n("Surname") );
998 newSurname.appendChild( surname );
1000 newAuthor.appendChild( newFirstname );
1001 newAuthor.appendChild( newSurname );
1003 parentElement.appendChild( newAuthor );
1006 if ( ! (firstname.isNull() || surname.isNull()) ){
1007 list.clear();
1008 list.push_back( firstname );
1009 list.push_back( surname );
1010 author->setNodes( list );
1011 m_contextmenuhandler->registerPopupMenu( author );
1014 m_rootItem->sort();
1017 void DocTreeViewImpl::slotNewDate()
1019 if ( m_currentItem->getXmlContextName() == "BookInfo" ){
1020 // New TreeView item
1021 int newIndex = newIndexLastChild();
1022 Date *date = new Date(m_currentItem, NULL, i18n("Date"));
1023 date->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
1024 // get current date
1025 QString today;
1026 today = KGlobal::locale()->formatDate(QDate::currentDate(Qt::LocalTime), KLocale::ShortDate);
1027 date->setText( 1, today);
1029 // New Dom Element
1030 NodeList_type list;
1031 list.clear();
1032 m_currentItem->getNodes( list );
1033 QDomElement parentElement = (list.front()).toElement();
1034 QDomText dateToday;
1035 if ( parentElement.isElement() ){
1036 QDomElement newDate = m_domTree.createElement("Date");
1037 dateToday = m_domTree.createTextNode( today );
1038 newDate.appendChild( dateToday );
1039 parentElement.appendChild( newDate );
1042 if ( !dateToday.isNull() ){
1043 list.clear();
1044 list.push_back( dateToday );
1045 date->setNodes( list );
1046 m_contextmenuhandler->registerPopupMenu( date );
1049 m_rootItem->sort();
1052 void DocTreeViewImpl::slotNewReleaseInfo()
1054 if ( m_currentItem->getXmlContextName() == "BookInfo" ){
1055 // New TreeView item
1056 int newIndex = newIndexLastChild();
1057 ReleaseInfo *relinfo = new ReleaseInfo(m_currentItem, NULL, i18n("Release"));
1058 relinfo->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
1059 relinfo->setText( 1, "0.0.0" );
1061 // New Dom Element
1062 NodeList_type list;
1063 list.clear();
1064 m_currentItem->getNodes( list );
1065 QDomElement parentElement = (list.front()).toElement();
1066 QDomText releaseText;
1067 if ( parentElement.isElement() ){
1068 QDomElement newRelease = m_domTree.createElement("ReleaseInfo");
1069 releaseText = m_domTree.createTextNode("0.0.0");
1070 newRelease.appendChild( releaseText );
1071 parentElement.appendChild( newRelease );
1074 if ( !releaseText.isNull() ){
1075 list.clear();
1076 list.push_back( releaseText );
1077 relinfo->setNodes( list );
1078 m_contextmenuhandler->registerPopupMenu( relinfo );
1081 m_rootItem->sort();
1084 void DocTreeViewImpl::slotNewTitle()
1089 void DocTreeViewImpl::slotNewParagraph()
1091 // Create Null element
1092 QDomElement parentElement = QDomElement();
1094 NodeList_type list;
1095 list.clear();
1096 m_currentItem->getNodes( list );
1097 parentElement = (list.front()).toElement();
1099 if ( parentElement.isNull() )
1100 return;
1102 // New TreeView item
1103 int newIndex = newIndexLastChild();
1104 Para *para = new Para(m_currentItem, NULL, i18n("Paragraph"));
1105 para->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
1107 // New Dom Element
1108 QDomNode newNode;
1109 if ( parentElement.isElement() ){
1110 QDomElement newChild = m_domTree.createElement("Para");
1111 newNode = parentElement.appendChild( newChild );
1114 if ( !newNode.isNull() ){
1115 list.clear();
1116 list.push_back( newNode );
1117 para->setNodes( list );
1118 m_contextmenuhandler->registerPopupMenu( para );
1120 m_rootItem->sort();
1123 void DocTreeViewImpl::slotNewSection_1()
1125 if ( m_currentItem->getXmlContextName() == "Chapter" ){
1126 int newIndex = newIndexLastChild();
1127 Sect1 *sect1 = new Sect1(m_currentItem, NULL, i18n("Section Level 1"));
1128 sect1->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
1130 // New Dom Element
1131 NodeList_type list;
1132 list.clear();
1133 m_currentItem->getNodes( list );
1134 QDomElement parentElement = (list.front()).toElement();
1135 QDomNode newNode;
1136 if ( parentElement.isElement() ){
1137 QDomElement newSect = m_domTree.createElement("Sect1");
1138 QDomElement newTitle = m_domTree.createElement("Title");
1139 QDomText textOfTitle = m_domTree.createTextNode( i18n("New Section Title") );
1141 newTitle.appendChild( textOfTitle );
1142 newSect.appendChild( newTitle );
1143 newNode = parentElement.appendChild( newSect );
1146 if ( !newNode.isNull() ){
1147 list.clear();
1148 list.push_back( newNode );
1149 sect1->setNodes( list );
1150 m_contextmenuhandler->registerPopupMenu( sect1 );
1153 m_rootItem->sort();
1156 void DocTreeViewImpl::slotNewSection_2()
1158 if ( m_currentItem->getXmlContextName() == "Sect1" ){
1159 int newIndex = newIndexLastChild();
1160 Sect2 *sect2 = new Sect2(m_currentItem, NULL, i18n("Section Level 2"));
1161 sect2->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
1163 // New Dom Element
1164 NodeList_type list;
1165 list.clear();
1166 m_currentItem->getNodes( list );
1167 QDomElement parentElement = (list.front()).toElement();
1168 QDomNode newNode;
1169 if ( parentElement.isElement() ){
1170 QDomElement newSect = m_domTree.createElement("Sect2");
1171 QDomElement newTitle = m_domTree.createElement("Title");
1172 QDomText textOfTitle = m_domTree.createTextNode( i18n("New Section Title") );
1174 newTitle.appendChild( textOfTitle );
1175 newSect.appendChild( newTitle );
1176 newNode = parentElement.appendChild( newSect );
1179 if ( !newNode.isNull() ){
1180 list.clear();
1181 list.push_back( newNode );
1182 sect2->setNodes( list );
1183 m_contextmenuhandler->registerPopupMenu( sect2 );
1186 m_rootItem->sort();
1189 void DocTreeViewImpl::slotNewSection_3()
1191 if ( m_currentItem->getXmlContextName() == "Sect2" ){
1192 int newIndex = newIndexLastChild();
1193 Sect3 *sect3 = new Sect3(m_currentItem, NULL, i18n("Section Level 3"));
1194 sect3->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
1196 // New Dom Element
1197 NodeList_type list;
1198 list.clear();
1199 m_currentItem->getNodes( list );
1200 QDomElement parentElement = (list.front()).toElement();
1201 QDomNode newNode;
1202 if ( parentElement.isElement() ){
1203 QDomElement newSect = m_domTree.createElement("Sect3");
1204 QDomElement newTitle = m_domTree.createElement("Title");
1205 QDomText textOfTitle = m_domTree.createTextNode( i18n("New Section Title") );
1207 newTitle.appendChild( textOfTitle );
1208 newSect.appendChild( newTitle );
1209 newNode = parentElement.appendChild( newSect );
1212 if ( !newNode.isNull() ){
1213 list.clear();
1214 list.push_back( newNode );
1215 sect3->setNodes( list );
1216 m_contextmenuhandler->registerPopupMenu( sect3 );
1219 m_rootItem->sort();
1222 void DocTreeViewImpl::slotNewSection_4()
1224 if ( m_currentItem->getXmlContextName() == "Sect3" ){
1225 int newIndex = newIndexLastChild();
1226 Sect4 *sect4 = new Sect4(m_currentItem, NULL, i18n("Section Level 4"));
1227 sect4->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
1229 // New Dom Element
1230 NodeList_type list;
1231 list.clear();
1232 m_currentItem->getNodes( list );
1233 QDomElement parentElement = (list.front()).toElement();
1234 QDomNode newNode;
1235 if ( parentElement.isElement() ){
1236 QDomElement newSect = m_domTree.createElement("Sect4");
1237 QDomElement newTitle = m_domTree.createElement("Title");
1238 QDomText textOfTitle = m_domTree.createTextNode( i18n("New Section Title") );
1240 newTitle.appendChild( textOfTitle );
1241 newSect.appendChild( newTitle );
1242 newNode = parentElement.appendChild( newSect );
1245 if ( !newNode.isNull() ){
1246 list.clear();
1247 list.push_back( newNode );
1248 sect4->setNodes( list );
1249 m_contextmenuhandler->registerPopupMenu( sect4 );
1252 m_rootItem->sort();
1255 void DocTreeViewImpl::slotNewSection_5()
1257 if ( m_currentItem->getXmlContextName() == "Sect4" ){
1258 int newIndex = newIndexLastChild();
1259 Sect5 *sect5 = new Sect5(m_currentItem, NULL, i18n("Section Level 5"));
1260 sect5->setText(3, QString("%1").arg(newIndex).rightJustified(8,'0') );
1262 // New Dom Element
1263 NodeList_type list;
1264 list.clear();
1265 m_currentItem->getNodes( list );
1266 QDomElement parentElement = (list.front()).toElement();
1267 QDomNode newNode;
1268 if ( parentElement.isElement() ){
1269 QDomElement newSect = m_domTree.createElement("Sect5");
1270 QDomElement newTitle = m_domTree.createElement("Title");
1271 QDomText textOfTitle = m_domTree.createTextNode( i18n("New Section Title") );
1273 newTitle.appendChild( textOfTitle );
1274 newSect.appendChild( newTitle );
1275 newNode = parentElement.appendChild( newSect );
1278 if ( !newNode.isNull() ){
1279 list.clear();
1280 list.push_back( newNode );
1281 sect5->setNodes( list );
1282 m_contextmenuhandler->registerPopupMenu( sect5 );
1285 m_rootItem->sort();
1288 int DocTreeViewImpl::newIndexFirstChild()
1290 kDebug(100200) << "DocTreeViewImpl::newIndexFirstChild()";
1292 int currentIndex = (m_currentItem->text(3)).toInt();
1294 // walk trough the entire tree and increment all
1295 // indices greater than currentIndex
1296 ListViewInterface *item = NULL;
1297 int itemIndex;
1298 Q3ListViewItemIterator it( m_rootItem );
1299 while ( it.current() ) {
1300 item = static_cast<ListViewInterface*>(it.current());
1301 itemIndex = (item->text(3)).toInt();
1302 if ( itemIndex > currentIndex ){
1303 item->setText(3, QString("%1").arg(itemIndex+1).rightJustified(8,'0') );;
1305 ++it;
1308 m_idCounter++;
1309 currentIndex += 1;
1310 return currentIndex;
1314 int DocTreeViewImpl::newIndexLastChild()
1316 kDebug(100200) << "DocTreeViewImpl::newIndexLastChild()";
1318 // find highest index of the subtree with
1319 // m_currentItem as root
1320 int lastIndex = 0;
1321 findHighestIndex( m_currentItem, lastIndex );
1322 kDebug(100200) << "Letzter Index: " << lastIndex;
1324 // walk trough the entire tree and increment all
1325 // indices greater than lastIndex
1326 int itemIndex;
1327 ListViewInterface *item;
1328 Q3ListViewItemIterator it( m_rootItem );
1329 while ( it.current() ) {
1330 item = static_cast<ListViewInterface*>(it.current());
1331 itemIndex = (item->text(3)).toInt();
1332 if ( itemIndex > lastIndex ){
1333 item->setText(3, QString("%1").arg(itemIndex+1).rightJustified(8,'0') );
1335 ++it;
1338 m_idCounter++;
1339 lastIndex += 1;
1340 return lastIndex;
1344 void DocTreeViewImpl::findHighestIndex(ListViewInterface* item, int &index)
1346 int currentIndex = (item->text(3)).toInt();
1347 index = currentIndex > index ? currentIndex : index;
1349 ListViewInterface *i = static_cast<ListViewInterface*>(item->firstChild());
1350 while( i ){
1351 findHighestIndex(i, index);
1352 i = static_cast<ListViewInterface*>(i->nextSibling());
1358 /******************************************
1359 * XML-Parser functions
1360 ******************************************/
1362 // DocBook parser
1364 void DocTreeViewImpl::parseBook(const QDomElement &element, ListViewInterface *item)
1366 kDebug(100200) << "+++ entering parseBook()";
1367 item->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1368 // register node
1369 NodeList_type nodelist;
1370 nodelist.clear();
1371 nodelist.push_back(element);
1372 item->setNodes( nodelist );
1373 // register Popup menu
1374 m_contextmenuhandler->registerPopupMenu( item );
1376 // TODO: Attributes Id, Lang
1378 // Elements (parse BookInfo before Chapter)
1379 QDomNode node = element.firstChild();
1380 while( !node.isNull() ){
1381 if( node.isElement() && node.nodeName().toLower()=="bookinfo" ){
1382 parseBookInfo( node.toElement(), item );
1383 break;
1385 node = node.nextSibling();
1387 node = element.firstChild();
1388 while( !node.isNull() ){
1389 if ( node.isElement() && node.nodeName().toLower()=="chapter" ){
1390 parseChapter( node.toElement(), item );
1392 node = node.nextSibling();
1394 kDebug(100200) << "--- leaving parseBook()";
1398 void DocTreeViewImpl::parseBookInfo(const QDomElement &element, ListViewInterface *item)
1400 kDebug(100200) << "+++ entering parseBookInfo()";
1402 Overview *overview = new Overview(item, NULL, i18n("Overview"));
1403 overview->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1404 // register node
1405 NodeList_type list;
1406 list.clear();
1407 list.push_back( element );
1408 overview->setNodes(list);
1409 // register Popup menu
1410 m_contextmenuhandler->registerPopupMenu( overview );
1412 QDomText data;
1413 QDomNode node = element.firstChild();
1414 // fixed order
1415 while( !node.isNull() ){
1416 if( node.isElement() && node.nodeName().toLower()=="title" ){
1417 data = node.firstChild().toText();
1418 if( !data.isNull() ){
1419 item->setText( 0, data.nodeValue() ); // assign title to RootItem
1420 break;
1423 node = node.nextSibling();
1425 node = element.firstChild();
1426 while( !node.isNull() ){
1427 if ( node.isElement() && node.nodeName().toLower()=="authorgroup" ){
1428 parseAuthorGroup( node.toElement(), overview );
1430 node = node.nextSibling();
1432 node = element.firstChild();
1433 while( !node.isNull() ){
1434 if ( node.isElement() && node.nodeName().toLower()=="date" ){
1435 data = node.firstChild().toText();
1436 if( !data.isNull() ){
1437 Date *date = new Date(overview, NULL, i18n("Date"));
1438 date->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1439 date->setText( 1, data.nodeValue() );
1440 // register node
1441 list.clear();
1442 list.push_back( data );
1443 date->setNodes(list);
1444 // register Popup menu
1445 m_contextmenuhandler->registerPopupMenu( date );
1448 node = node.nextSibling();
1450 node = element.firstChild();
1451 while( !node.isNull() ){
1452 if ( node.isElement() && node.nodeName().toLower()=="releaseinfo" ){
1453 data = node.firstChild().toText();
1454 if( !data.isNull() ){
1455 ReleaseInfo *relinfo = new ReleaseInfo(overview, NULL, i18n("Release"));
1456 relinfo->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1457 relinfo->setText( 1, data.nodeValue() );
1458 // register node
1459 list.clear();
1460 list.push_back( data );
1461 relinfo->setNodes( list );
1462 // register Popup menu
1463 m_contextmenuhandler->registerPopupMenu( relinfo );
1466 node = node.nextSibling();
1468 node = element.firstChild();
1469 while( !node.isNull() ){
1470 if ( node.isElement() && node.nodeName().toLower()=="keywordset" ){
1471 parseKeywordSet( node.toElement(), overview );
1473 node = node.nextSibling();
1475 node = element.firstChild();
1476 while( !node.isNull() ){
1477 if ( node.isElement() && node.nodeName().toLower()=="abstract" ){
1478 parseAbstract( node.toElement(), overview );
1480 node = node.nextSibling();
1482 kDebug(100200) << "--- leaving parseBookInfo()";
1486 void DocTreeViewImpl::parseAuthorGroup(const QDomElement &element, ListViewInterface *item)
1488 kDebug(100200) << "+++ entering parseAuthorGroup()";
1490 // item = overview
1491 AuthorGroup *authorgroup = new AuthorGroup(item, NULL, i18n("Author(s)"));
1492 authorgroup->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1493 // register node
1494 NodeList_type list;
1495 list.clear();
1496 list.push_back( element );
1497 authorgroup->setNodes( list );
1498 // register Popup menu
1499 m_contextmenuhandler->registerPopupMenu( authorgroup );
1501 QDomNode node = element.firstChild();
1502 while( !node.isNull() ){
1503 if( node.isElement() && node.nodeName().toLower()=="author" ){
1504 parseAuthor( node.toElement(), authorgroup );
1506 node = node.nextSibling();
1508 kDebug(100200) << "--- leaving parseAuthorGroup()";
1512 void DocTreeViewImpl::parseAuthor(const QDomElement &element, ListViewInterface *item)
1514 kDebug(100200) << "+++ entering parseAuthor()";
1516 // item = authorgroup
1517 QDomText data;
1518 QDomText firstname = QDomText();
1519 QDomText surname = QDomText();
1520 QString s_firstname = QString();
1521 QString s_surname = QString();
1523 Author *author = new Author(item);
1524 author->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1526 QDomNode node = element.firstChild();
1527 while( !node.isNull() ){
1528 if( node.isElement() && node.nodeName().toLower()=="firstname" ){
1529 data = node.firstChild().toText();
1530 if( !data.isNull() ){
1531 s_firstname = data.nodeValue();
1532 firstname = data;
1534 } else if ( node.isElement() && node.nodeName().toLower()=="surname" ){
1535 data = node.firstChild().toText();
1536 if( !data.isNull() ){
1537 s_surname = data.nodeValue();
1538 surname = data;
1541 node = node.nextSibling();
1543 // register nodes
1544 NodeList_type list;
1545 list.clear();
1546 list.push_back( firstname );
1547 list.push_back( surname );
1548 author->setNodes( list );
1549 // register Popup menu
1550 m_contextmenuhandler->registerPopupMenu( author );
1552 author->setText(0, i18n("Author") );
1553 author->setText(1, s_firstname + ' ' + s_surname);
1555 kDebug(100200) << "--- leaving parseAuthor()";
1559 void DocTreeViewImpl::parseKeywordSet(const QDomElement &element, ListViewInterface *item)
1561 kDebug(100200) << "+++ entering parseKeywordSet()";
1563 // item = overview
1564 KeywordSet *keywordset = new KeywordSet(item, NULL, i18n("Keywords"));
1565 keywordset->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1566 // register node
1567 NodeList_type list;
1568 list.clear();
1569 list.push_back( element );
1570 keywordset->setNodes( list );
1571 // register Popup menu
1572 m_contextmenuhandler->registerPopupMenu( keywordset );
1574 QDomText data;
1575 QDomNode node = element.firstChild();
1576 while( !node.isNull() ){
1577 if( node.isElement() && node.nodeName().toLower()=="keyword" ){
1578 data = node.firstChild().toText();
1579 if( !data.isNull() ){
1580 Keyword *keyword = new Keyword(keywordset);
1581 keyword->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1582 keyword->setText(0, data.nodeValue() );
1583 // register node
1584 list.clear();
1585 list.push_back( data );
1586 keyword->setNodes( list );
1587 // register Popup menu
1588 m_contextmenuhandler->registerPopupMenu( keyword );
1591 node = node.nextSibling();
1593 kDebug(100200) << "--- leaving parseKeywordSet()";
1597 void DocTreeViewImpl::parseAbstract(const QDomElement &element, ListViewInterface *item)
1599 kDebug(100200) << "+++ entering parseAbstract()";
1601 // item = overview
1602 QDomText data;
1603 Abstract *abstract = new Abstract(item, NULL, i18n("Abstract"));
1604 abstract->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1605 // register node
1606 NodeList_type list;
1607 list.clear();
1608 list.push_back( element );
1609 abstract->setNodes( list );
1610 // register Popup menu
1611 m_contextmenuhandler->registerPopupMenu( abstract );
1613 QDomNode node = element.firstChild();
1614 while( !node.isNull() ){
1615 if( node.isElement() && node.nodeName().toLower()=="para" ){
1616 parsePara( node.toElement(), abstract );
1618 node = node.nextSibling();
1620 kDebug(100200) << "--- leaving parseAbstract()";
1624 void DocTreeViewImpl::parseChapter(const QDomElement &element, ListViewInterface *item)
1626 kDebug(100200) << "+++ entering parseChapter()";
1628 QDomText data;
1629 Chapter *chapter = new Chapter(item, NULL, i18n("Chapter"));
1630 chapter->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1631 // register node
1632 NodeList_type list;
1633 list.clear();
1634 list.push_back( element );
1635 chapter->setNodes( list );
1636 // register Popup menu
1637 m_contextmenuhandler->registerPopupMenu( chapter );
1639 QDomNode node = element.firstChild();
1640 while( !node.isNull() ){
1641 if( node.isElement() && node.nodeName().toLower()=="title" ){
1642 data = node.firstChild().toText();
1643 if( !data.isNull() ){
1644 chapter->setText( 0, data.nodeValue() );
1646 } else if ( node.isElement() && node.nodeName().toLower()=="para" ){
1647 parsePara( node.toElement(), chapter );
1648 } else if ( node.isElement() && node.nodeName().toLower()=="sect1" ){
1649 parseSect1( node.toElement(), chapter );
1651 node = node.nextSibling();
1653 kDebug(100200) << "--- leaving parseChapter()";
1657 void DocTreeViewImpl::parseSect1(const QDomElement &element, ListViewInterface *item)
1659 kDebug(100200) << "+++ entering parseSect1()";
1661 QDomText data;
1662 Sect1 *sect1 = new Sect1(item, NULL, i18n("Section Level 1"));
1663 sect1->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1664 // register node
1665 NodeList_type list;
1666 list.clear();
1667 list.push_back( element );
1668 sect1->setNodes( list );
1669 // register Popup menu
1670 m_contextmenuhandler->registerPopupMenu( sect1 );
1672 QDomNode node = element.firstChild();
1673 while( !node.isNull() ){
1674 if( node.isElement() && node.nodeName().toLower()=="title" ){
1675 data = node.firstChild().toText();
1676 if( !data.isNull() ){
1677 sect1->setText( 0, data.nodeValue() );
1679 } else if ( node.isElement() && node.nodeName().toLower()=="para" ){
1680 parsePara( node.toElement(), sect1 );
1681 } else if ( node.isElement() && node.nodeName().toLower()=="sect2" ){
1682 parseSect2( node.toElement(), sect1 );
1684 node = node.nextSibling();
1686 kDebug(100200) << "--- leaving parseSect1()";
1690 void DocTreeViewImpl::parseSect2(const QDomElement &element, ListViewInterface *item)
1692 kDebug(100200) << "+++ entering parseSect2()";
1694 QDomText data;
1695 Sect2 *sect2 = new Sect2(item, NULL, i18n("Section Level 2"));
1696 sect2->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1697 // register node
1698 NodeList_type list;
1699 list.clear();
1700 list.push_back( element );
1701 sect2->setNodes( list );
1702 // register Popup menu
1703 m_contextmenuhandler->registerPopupMenu( sect2 );
1705 QDomNode node = element.firstChild();
1706 while( !node.isNull() ){
1707 if( node.isElement() && node.nodeName().toLower()=="title" ){
1708 data = node.firstChild().toText();
1709 if( !data.isNull() ){
1710 sect2->setText( 0, data.nodeValue() );
1712 } else if ( node.isElement() && node.nodeName().toLower()=="para" ){
1713 parsePara( node.toElement(), sect2 );
1714 } else if ( node.isElement() && node.nodeName().toLower()=="sect3" ){
1715 parseSect3( node.toElement(), sect2 );
1717 node = node.nextSibling();
1719 kDebug(100200) << "--- leaving parseSect2()";
1723 void DocTreeViewImpl::parseSect3(const QDomElement &element, ListViewInterface *item)
1725 kDebug(100200) << "+++ entering parseSect3()";
1727 QDomText data;
1728 Sect3 *sect3 = new Sect3(item, NULL, i18n("Section Level 3"));
1729 sect3->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1730 // register node
1731 NodeList_type list;
1732 list.clear();
1733 list.push_back( element );
1734 sect3->setNodes( list );
1735 // register Popup menu
1736 m_contextmenuhandler->registerPopupMenu( sect3 );
1738 QDomNode node = element.firstChild();
1739 while( !node.isNull() ){
1740 if( node.isElement() && node.nodeName().toLower()=="title" ){
1741 data = node.firstChild().toText();
1742 if( !data.isNull() ){
1743 sect3->setText( 0, data.nodeValue() );
1745 } else if ( node.isElement() && node.nodeName().toLower()=="para" ){
1746 parsePara( node.toElement(), sect3 );
1747 } else if ( node.isElement() && node.nodeName().toLower()=="sect4" ){
1748 parseSect4( node.toElement(), sect3 );
1750 node = node.nextSibling();
1752 kDebug(100200) << "--- leaving parseSect3()";
1756 void DocTreeViewImpl::parseSect4(const QDomElement &element, ListViewInterface *item)
1758 kDebug(100200) << "+++ entering parseSect4()";
1760 QDomText data;
1761 Sect4 *sect4 = new Sect4(item, NULL, i18n("Section Level 4"));
1762 sect4->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1763 // register node
1764 NodeList_type list;
1765 list.clear();
1766 list.push_back( element );
1767 sect4->setNodes( list );
1768 // register Popup menu
1769 m_contextmenuhandler->registerPopupMenu( sect4 );
1771 QDomNode node = element.firstChild();
1772 while( !node.isNull() ){
1773 if( node.isElement() && node.nodeName().toLower()=="title" ){
1774 data = node.firstChild().toText();
1775 if( !data.isNull() ){
1776 sect4->setText( 0, data.nodeValue() );
1778 } else if ( node.isElement() && node.nodeName().toLower()=="para" ){
1779 parsePara( node.toElement(), sect4 );
1780 } else if ( node.isElement() && node.nodeName().toLower()=="sect5" ){
1781 parseSect5( node.toElement(), sect4 );
1783 node = node.nextSibling();
1785 kDebug(100200) << "--- leaving parseSect4()";
1789 void DocTreeViewImpl::parseSect5(const QDomElement &element, ListViewInterface *item)
1791 kDebug(100200) << "+++ entering parseSect5()";
1793 QDomText data;
1794 Sect5 *sect5 = new Sect5(item, NULL, i18n("Section Level 4"));
1795 sect5->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1796 // register node
1797 NodeList_type list;
1798 list.clear();
1799 list.push_back( element );
1800 sect5->setNodes( list );
1801 // register Popup menu
1802 m_contextmenuhandler->registerPopupMenu( sect5 );
1804 QDomNode node = element.firstChild();
1805 while( !node.isNull() ){
1806 if( node.isElement() && node.nodeName().toLower()=="title" ){
1807 data = node.firstChild().toText();
1808 if( !data.isNull() ){
1809 sect5->setText( 0, data.nodeValue() );
1811 } else if ( node.isElement() && node.nodeName().toLower()=="para" ){
1812 parsePara( node.toElement(), sect5 );
1814 node = node.nextSibling();
1816 kDebug(100200) << "--- leaving parseSect5()";
1820 void DocTreeViewImpl::parsePara(const QDomElement &element, ListViewInterface *item)
1822 kDebug(100200) << "+++ entering parsePara()";
1824 Para *para = new Para(item, NULL, i18n("Paragraph"));
1825 para->setText(3, QString("%1").arg(++m_idCounter).rightJustified(8,'0') );
1826 // register node
1827 NodeList_type list;
1828 list.clear();
1829 list.push_back( element );
1830 para->setNodes( list );
1831 // register Popup menu
1832 m_contextmenuhandler->registerPopupMenu( para );
1834 kDebug(100200) << "--- leaving parsePara()";