summaryrefslogtreecommitdiffstats
path: root/kword/KWDocStruct.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kword/KWDocStruct.cpp')
-rw-r--r--kword/KWDocStruct.cpp1264
1 files changed, 1264 insertions, 0 deletions
diff --git a/kword/KWDocStruct.cpp b/kword/KWDocStruct.cpp
new file mode 100644
index 00000000..f32e4181
--- /dev/null
+++ b/kword/KWDocStruct.cpp
@@ -0,0 +1,1264 @@
+/* This file is part of the KDE project
+ Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+// KWord includes.
+#include "KWDocument.h"
+#include "KWView.h"
+#include "KWCanvas.h"
+#include "KWDocStruct.h"
+#include "KWDocStruct.moc"
+#include "KWTableFrameSet.h"
+#include "KWPartFrameSet.h"
+#include "KWFormulaFrameSet.h"
+#include "KWPictureFrameSet.h"
+#include "KWTextDocument.h"
+
+// KOffice includes.
+#include <KoParagCounter.h>
+#include <KoSpeaker.h>
+
+// KDE includes.
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <klistviewsearchline.h>
+#include <kglobalsettings.h>
+#include <kglobal.h>
+#include <kpixmap.h>
+#include <ktoolbar.h>
+#include <ktoolbarbutton.h>
+
+#include <qlayout.h>
+
+/******************************************************************/
+/* Class: KWOrderedFrameSet */
+/******************************************************************/
+
+KWOrderedFrameSet::KWOrderedFrameSet(KWFrameSet* fs) :
+ m_frameset(fs) { }
+
+KWOrderedFrameSet::KWOrderedFrameSet() :
+ m_frameset(0) { }
+
+bool KWOrderedFrameSet::operator<( KWOrderedFrameSet ofs )
+{
+ if (!m_frameset) return false;
+ KWFrame* frame1 = m_frameset->frame(0);
+ if (!frame1) return false;
+ KWFrameSet* frameset2 = ofs.frameSet();
+ if (!frameset2) return false;
+ KWFrame* frame2 = frameset2->frame(0);
+ if (!frame2) return false;
+ KoPoint p1 = frame1->topLeft();
+ KoPoint p2 = frame2->topLeft();
+ return (p1.y() < p2.y() || (p1.y() == p2.y() && p1.x() < p2.x()));
+}
+
+/******************************************************************/
+/* Class: KWDocDocListViewItem */
+/******************************************************************/
+
+KWDocListViewItem::KWDocListViewItem(QListViewItem* parent, const QString& text)
+ : KListViewItem(parent, text)
+{
+}
+
+KWDocListViewItem::KWDocListViewItem(QListViewItem* parent, QListViewItem* after, const QString& text )
+ :KListViewItem(parent, after, text)
+{
+}
+
+KWDocListViewItem::KWDocListViewItem(QListView* parent, const QString& text)
+ :KListViewItem(parent, text)
+{
+}
+
+void KWDocListViewItem::deleteAllChildren()
+{
+ if ( childCount() > 0 )
+ {
+ QListViewItem *child = firstChild();
+ QListViewItem *delChild;
+
+ while( child )
+ {
+ delChild = child;
+ child = child->nextSibling();
+ delete delChild;
+ }
+ }
+}
+
+KWDocument* KWDocListViewItem::doc()
+{
+ return dynamic_cast<KWDocStructTree *>(listView())->doc();
+}
+
+KWGUI* KWDocListViewItem::gui()
+{
+ return dynamic_cast<KWDocStructTree *>(listView())->gui();
+}
+
+
+/******************************************************************/
+/* Class: KWDocStructParagItem */
+/******************************************************************/
+
+KWDocStructParagItem::KWDocStructParagItem(QListViewItem* parent, const QString& text, KWTextParag* parag )
+ : KWDocListViewItem(parent, text), m_parag(parag)
+{
+}
+
+KWDocStructParagItem::KWDocStructParagItem(QListViewItem* parent, QListViewItem* after,
+ const QString& text, KWTextParag* parag )
+ : KWDocListViewItem(parent, after, text), m_parag(parag)
+{
+}
+
+void KWDocStructParagItem::contextMenu(QListViewItem* item, const QPoint& p, int )
+{
+ if (item == this)
+ {
+ KWTextFrameSet* fs = m_parag->kwTextDocument()->textFrameSet();
+ gui()->getView()->openDocStructurePopupMenu(p, fs, m_parag);
+ }
+}
+
+void KWDocStructParagItem::selectItem()
+{
+ KWTextFrameSet* fs = m_parag->kwTextDocument()->textFrameSet();
+ QPoint iPoint = m_parag->rect().topLeft(); // small bug if a paragraph is cut between two pages.
+ KoPoint dPoint;
+ fs->internalToDocument(iPoint, dPoint);
+ QPoint nPoint = fs->kWordDocument()->zoomPoint(dPoint);
+ gui()->canvasWidget()->scrollToOffset(fs->kWordDocument()->unzoomPoint(nPoint));
+
+}
+
+void KWDocStructParagItem::editItem()
+{
+ gui()->canvasWidget()->editTextFrameSet(m_parag->kwTextDocument()->textFrameSet(), m_parag, 0);
+}
+
+void KWDocStructParagItem::deleteItem()
+{
+ // TODO
+}
+
+void KWDocStructParagItem::editProperties()
+{
+ gui()->canvasWidget()->editTextFrameSet(m_parag->kwTextDocument()->textFrameSet(), m_parag, 0);
+ gui()->getView()->formatParagraph();
+}
+
+void KWDocStructParagItem::speakItem()
+{
+ QString text;
+ KoParagCounter* tmpCounter = m_parag->counter();
+ if (tmpCounter)
+ text = tmpCounter->text(m_parag) + " ";
+ text += m_parag->toString();
+ if (!text.isEmpty()) {
+ kospeaker->queueSpeech(text, m_parag->paragraphFormat()->language(), true);
+ kospeaker->startSpeech();
+ }
+}
+
+
+/******************************************************************/
+/* Class: KWDocStructTextFrameItem */
+/******************************************************************/
+
+KWDocStructTextFrameItem::KWDocStructTextFrameItem(QListViewItem* parent, const QString& text,
+ KWTextFrameSet* frameset, KWFrame* frame)
+ : KWDocListViewItem(parent, text), m_frame(frame), m_frameset(frameset)
+{
+}
+
+KWDocStructTextFrameItem::KWDocStructTextFrameItem(QListViewItem* parent, QListViewItem* after,
+ const QString& text, KWTextFrameSet* frameset, KWFrame* frame)
+ : KWDocListViewItem(parent, after, text), m_frame(frame), m_frameset(frameset)
+{
+}
+
+void KWDocStructTextFrameItem::setupTextParags()
+{
+ // Build a list of pointers to paragraphs.
+ QPtrList<KWTextParag> paragPtrs;
+ paragPtrs.setAutoDelete(false);
+ KoTextParag* textParag = 0;
+ KoTextParag* lastParag = 0;
+ int index = 0;
+ // Get upper left corner of the frame and get coordinates just inside it.
+ KoPoint dPoint = m_frame->topLeft() + KoPoint(2,2);
+ // Get the first paragraph of the frame.
+ m_frameset->findPosition(dPoint, textParag, index);
+ // Get lower right corner of the frame and get coordinate just inside it.
+ dPoint = m_frame->bottomRight() - KoPoint(2,2);
+ // Get the last paragraph of the frame.
+ m_frameset->findPosition(dPoint, lastParag, index);
+ if (lastParag) {
+ while (textParag) {
+ KWTextParag* parag = dynamic_cast<KWTextParag *>(textParag);
+ if (parag) {
+ // Don't display an empty paragraph.
+ QString text = parag->toString().stripWhiteSpace();
+ if ( text.length() > 0)
+ paragPtrs.append(parag);
+ }
+ if (textParag == lastParag)
+ textParag = 0;
+ else
+ textParag = textParag->next();
+ }
+ }
+
+ // Remove deleted paragraphs from the listview.
+ KWDocStructParagItem* item = dynamic_cast<KWDocStructParagItem *>(firstChild());
+ KWDocStructParagItem* delItem;
+ while (item) {
+ delItem = item;
+ item = dynamic_cast<KWDocStructParagItem *>(item->nextSibling());
+ if (paragPtrs.containsRef(delItem->parag()) == 0) delete delItem;
+ }
+
+ // Add new paragraphs to the list or update existing ones.
+ KWDocStructParagItem* after = 0;
+ for (uint j = 0; j < paragPtrs.count(); j++) {
+ KWTextParag* parag = paragPtrs.at(j);
+ QString text = parag->toString().stripWhiteSpace();
+ QString name = text.left(20);
+ KoParagCounter* tmpCounter = parag->counter();
+ if (tmpCounter)
+ name.prepend(tmpCounter->text(parag) + " ");
+ KWDocStructParagItem* child = findTextParagItem(parag);
+ if (child)
+ child->setText(0, name);
+ else {
+ if (after)
+ child = new KWDocStructParagItem(this, after, name, parag);
+ else
+ child = new KWDocStructParagItem(this, name, parag);
+ }
+ after = child;
+ }
+}
+
+void KWDocStructTextFrameItem::contextMenu(QListViewItem* item, const QPoint& p, int )
+{
+ if (item == this)
+ gui()->getView()->openDocStructurePopupMenu(p, m_frameset, 0);
+}
+
+void KWDocStructTextFrameItem::selectItem()
+{
+ gui()->canvasWidget()->scrollToOffset(m_frame->topLeft());
+}
+
+void KWDocStructTextFrameItem::editItem()
+{
+ KoTextParag* parag = 0L;
+ int index = 0;
+ // Get upperleft corner of the frame and get coordinates just inside it.
+ KoPoint dPoint = m_frame->topLeft() + KoPoint(2,2);
+ m_frameset->findPosition(dPoint, parag, index);
+ gui()->canvasWidget()->editTextFrameSet(m_frameset, parag, 0);
+}
+
+void KWDocStructTextFrameItem::deleteItem()
+{
+ gui()->getView()->deleteFrameSet(m_frameset);
+}
+
+void KWDocStructTextFrameItem::editProperties()
+{
+ gui()->canvasWidget()->editFrameProperties(m_frameset);
+}
+
+void KWDocStructTextFrameItem::speakItem()
+{
+ KoTextParag* textParag = 0;
+ KoTextParag* lastParag = 0;
+ int index = 0;
+ // Get upper left corner of the frame and get coordinates just inside it.
+ KoPoint dPoint = m_frame->topLeft() + KoPoint(2,2);
+ // Get the first paragraph of the frame.
+ m_frameset->findPosition(dPoint, textParag, index);
+ // Get lower right corner of the frame and get coordinate just inside it.
+ dPoint = m_frame->bottomRight() - KoPoint(2,2);
+ // Get the last paragraph of the frame.
+ m_frameset->findPosition(dPoint, lastParag, index);
+ bool first = true;
+ if (textParag && lastParag) {
+ while (textParag) {
+ KWTextParag* parag = dynamic_cast<KWTextParag *>(textParag);
+ if (parag) {
+ // Don't speak an empty paragraph.
+ QString text = parag->toString().stripWhiteSpace();
+ if ( text.length() > 0) {
+ kospeaker->queueSpeech(text, parag->paragraphFormat()->language(), first);
+ first = false;
+ }
+ }
+ if (textParag == lastParag)
+ textParag = 0;
+ else
+ textParag = textParag->next();
+ }
+ kospeaker->startSpeech();
+ }
+}
+
+KWDocStructParagItem* KWDocStructTextFrameItem::findTextParagItem(const KWTextParag* parag)
+{
+ if ( childCount() > 0 )
+ {
+ QListViewItem *child = firstChild();
+ while( child )
+ {
+ if (dynamic_cast<KWDocStructParagItem *>(child)->parag() == parag)
+ return dynamic_cast<KWDocStructParagItem *>(child);
+ child = child->nextSibling();
+ }
+ }
+ return 0;
+}
+
+
+/******************************************************************/
+/* Class: KWDocStructTextFrameSetItem */
+/******************************************************************/
+
+KWDocStructTextFrameSetItem::KWDocStructTextFrameSetItem(QListViewItem* parent, const QString& text,
+ KWTextFrameSet* frameset)
+ : KWDocListViewItem(parent, text ), m_frameset(frameset)
+{
+}
+
+KWDocStructTextFrameSetItem::KWDocStructTextFrameSetItem(QListViewItem* parent, QListViewItem* after,
+ const QString& text, KWTextFrameSet* frameset)
+ : KWDocListViewItem(parent, after, text), m_frameset(frameset)
+{
+}
+
+void KWDocStructTextFrameSetItem::setupTextFrames()
+{
+ // TODO: KWTextFrameSet::frame() method returns frames in screen order?
+ // Build a list of frame pointers.
+ QPtrList<KWFrame> framePtrs;
+ framePtrs.setAutoDelete(false);
+ for (uint j = 0; j < m_frameset->frameCount(); j++)
+ framePtrs.append(m_frameset->frame(j));
+
+ // Remove deleted frames from the listview.
+ KWDocStructTextFrameItem* item = dynamic_cast<KWDocStructTextFrameItem *>(firstChild());
+ KWDocStructTextFrameItem* delItem;
+ while (item) {
+ delItem = item;
+ item = dynamic_cast<KWDocStructTextFrameItem *>(item->nextSibling());
+ if (framePtrs.containsRef(delItem->frame()) == 0) delete delItem;
+ }
+
+ // Add new frames to the list or update existing ones.
+ KWDocument* dok = doc();
+ KWDocStructTextFrameItem* after = 0;
+ for (uint j = 0; j < framePtrs.count(); j++)
+ {
+ KWFrame* frame = framePtrs.at(j);
+ QString name;
+ if ( KListViewItem::parent()->firstChild() == this && dok->processingType() == KWDocument::WP )
+ {
+ if ( dok->numColumns() == 1 )
+ name=i18n( "Page %1" ).arg(QString::number(j + 1));
+ else
+ name=i18n( "Column %1" ).arg(QString::number(j + 1));
+ }
+ else
+ name=i18n( "Text Frame %1" ).arg(QString::number(j + 1));
+ KWDocStructTextFrameItem* child = findTextFrameItem(frame);
+ if (child)
+ child->setText(0, name);
+ else {
+ if (after)
+ child = new KWDocStructTextFrameItem(this, after, name, m_frameset, frame);
+ else
+ child = new KWDocStructTextFrameItem(this, name, m_frameset, frame);
+ }
+ child->setupTextParags();
+ after = child;
+ }
+}
+
+void KWDocStructTextFrameSetItem::contextMenu(QListViewItem* item, const QPoint& p, int )
+{
+ if (item == this)
+ gui()->getView()->openDocStructurePopupMenu(p, m_frameset, 0);
+}
+
+void KWDocStructTextFrameSetItem::selectItem()
+{
+ KWFrame* frame = m_frameset->frame(0);
+ if (!frame) return;
+ gui()->canvasWidget()->scrollToOffset(frame->topLeft());
+}
+
+void KWDocStructTextFrameSetItem::editItem()
+{
+ gui()->canvasWidget()->editTextFrameSet(m_frameset, 0L, 0);
+}
+
+void KWDocStructTextFrameSetItem::deleteItem()
+{
+ gui()->getView()->deleteFrameSet(m_frameset);
+}
+
+void KWDocStructTextFrameSetItem::editProperties()
+{
+ gui()->canvasWidget()->editFrameProperties(m_frameset);
+}
+
+void KWDocStructTextFrameSetItem::speakItem()
+{
+ KoTextParag* parag = m_frameset->textDocument()->firstParag();
+ kospeaker->queueSpeech(parag->toString(), parag->paragraphFormat()->language(), true);
+ parag = parag->next();
+ for ( ; parag ; parag = parag->next() )
+ kospeaker->queueSpeech(parag->toString(), parag->paragraphFormat()->language(), false);
+ kospeaker->startSpeech();
+}
+
+KWDocStructTextFrameItem* KWDocStructTextFrameSetItem::findTextFrameItem(const KWFrame* frame)
+{
+ if ( childCount() > 0 )
+ {
+ QListViewItem *child = firstChild();
+ while( child )
+ {
+ if (dynamic_cast<KWDocStructTextFrameItem *>(child)->frame() == frame)
+ return dynamic_cast<KWDocStructTextFrameItem *>(child);
+ child = child->nextSibling();
+ }
+ }
+ return 0;
+}
+
+
+/******************************************************************/
+/* Class: KWDocStructTableItem */
+/******************************************************************/
+
+KWDocStructTableItem::KWDocStructTableItem(QListViewItem* parent, const QString& text,
+ KWTableFrameSet* table)
+ :KWDocListViewItem(parent, text), m_table(table)
+{
+}
+
+KWDocStructTableItem::KWDocStructTableItem(QListViewItem* parent, QListViewItem* after,
+ const QString& text, KWTableFrameSet* table)
+ :KWDocListViewItem(parent, after, text), m_table(table)
+{
+}
+
+void KWDocStructTableItem::setupCells()
+{
+ // TODO: KWTableFrameSet::cell() method returns cells in screen order?
+ // Build a list of cell pointers.
+ QPtrList<KWTextFrameSet> cellPtrs;
+ cellPtrs.setAutoDelete(false);
+ for (uint row = 0; row < m_table->getRows(); ++row)
+ for (uint col = 0; col < m_table->getColumns(); ++ col) {
+ KWTextFrameSet* cell = m_table->cell(row, col);
+ if (cell)
+ cellPtrs.append(cell);
+ }
+
+ // Remove deleted cells from the listview.
+ KWDocStructTextFrameItem* item = dynamic_cast<KWDocStructTextFrameItem *>(firstChild());
+ KWDocStructTextFrameItem* delItem;
+ while (item) {
+ delItem = item;
+ item = dynamic_cast<KWDocStructTextFrameItem *>(item->nextSibling());
+ if (cellPtrs.containsRef(delItem->frameSet()) == 0) delete delItem;
+ }
+
+ // Add new cells to the list or update existing ones.
+ // Note we skip over the frameset and add the frame instead,
+ // as every cell has exactly one frame in the frameset.
+ KWDocStructTextFrameItem* child;
+ KWDocStructTextFrameItem* after = 0;
+ for (uint j = 0; j < cellPtrs.count(); j++)
+ {
+ KWTextFrameSet* cell = cellPtrs.at(j);
+ KWFrame* frame = cell->frame(0);
+ if (frame) {
+ QString name = cell->name();
+ child = findCellItem(cell);
+ if (child)
+ child->setText(0, name);
+ else {
+ if (after)
+ child = new KWDocStructTextFrameItem(this, after, name, cell, frame);
+ else
+ child = new KWDocStructTextFrameItem(this, name, cell, frame);
+ }
+ child->setupTextParags();
+ after = child;
+ }
+ }
+}
+
+void KWDocStructTableItem::contextMenu(QListViewItem* item, const QPoint& p, int )
+{
+ if (item == this)
+ gui()->getView()->openDocStructurePopupMenu(p, m_table, 0);
+}
+
+void KWDocStructTableItem::selectItem()
+{
+ KWFrame* frame = m_table->cell( 0, 0 )->frame( 0 );
+ gui()->canvasWidget()->scrollToOffset(frame->topLeft());
+}
+
+void KWDocStructTableItem::editItem()
+{
+ //activate the first cell
+ gui()->canvasWidget()->editTextFrameSet(m_table->cell(0,0), 0L, 0);
+}
+
+void KWDocStructTableItem::deleteItem()
+{
+ // TODO: The following statement isn't working for some reason.
+ gui()->getView()->deselectAllFrames();
+ gui()->getView()->deleteFrameSet(m_table);
+}
+
+void KWDocStructTableItem::editProperties()
+{
+ gui()->canvasWidget()->editFrameProperties(m_table);
+}
+
+void KWDocStructTableItem::speakItem()
+{
+ bool first = true;
+ for (uint row = 0; row < m_table->getRows(); ++row) {
+ for (uint col = 0; col < m_table->getColumns(); ++ col) {
+ KoTextParag* parag = m_table->cell(row, col)->textDocument()->firstParag();
+ kospeaker->queueSpeech(parag->toString(), parag->paragraphFormat()->language(), first);
+ first = false;
+ parag = parag->next();
+ for ( ; parag ; parag = parag->next() )
+ kospeaker->queueSpeech(parag->toString(), parag->paragraphFormat()->language(), false);
+ }
+ }
+ kospeaker->startSpeech();
+}
+
+KWDocStructTextFrameItem* KWDocStructTableItem::findCellItem(const KWTextFrameSet* cell)
+{
+ if ( childCount() > 0 )
+ {
+ QListViewItem *child = firstChild();
+ while( child )
+ {
+ if (dynamic_cast<KWDocStructTextFrameItem *>(child)->frameSet() == cell)
+ return dynamic_cast<KWDocStructTextFrameItem *>(child);
+ child = child->nextSibling();
+ }
+ }
+ return 0;
+}
+
+
+/******************************************************************/
+/* Class: KWDocStructPictureItem */
+/******************************************************************/
+
+KWDocStructPictureItem::KWDocStructPictureItem(QListViewItem* parent, const QString& text,
+ KWPictureFrameSet* pic)
+ : KWDocListViewItem(parent, text), m_pic(pic)
+{
+}
+
+void KWDocStructPictureItem::contextMenu(QListViewItem* item, const QPoint& p, int )
+{
+ if (item == this)
+ gui()->getView()->openDocStructurePopupMenu(p, m_pic, 0);
+}
+
+
+void KWDocStructPictureItem::selectItem()
+{
+ KWFrame *frame = m_pic->frame(0);
+ gui()->canvasWidget()->scrollToOffset(frame->topLeft() );
+
+}
+
+void KWDocStructPictureItem::editItem()
+{
+ // Pictures cannot be edited. Edit Properties instead.
+ editProperties();
+}
+
+void KWDocStructPictureItem::deleteItem()
+{
+ gui()->getView()->deleteFrameSet(m_pic);
+}
+
+void KWDocStructPictureItem::editProperties()
+{
+ gui()->canvasWidget()->editFrameProperties(m_pic);
+}
+
+/******************************************************************/
+/* Class: KWDocStructFormulaItem */
+/******************************************************************/
+
+KWDocStructFormulaItem::KWDocStructFormulaItem(QListViewItem* parent, const QString& text,
+ KWFormulaFrameSet* form)
+ : KWDocListViewItem(parent, text), m_form(form)
+{
+}
+
+void KWDocStructFormulaItem::contextMenu(QListViewItem* item, const QPoint& p, int )
+{
+ if (item == this)
+ gui()->getView()->openDocStructurePopupMenu(p, m_form, 0);
+}
+
+void KWDocStructFormulaItem::selectItem()
+{
+ KWFrame* frame = m_form->frame( 0 );
+ gui()->canvasWidget()->scrollToOffset(frame->topLeft());
+}
+
+void KWDocStructFormulaItem::editItem()
+{
+ // TODO: Formula has to be selected first to bring it into view. Bug?
+ selectItem();
+ gui()->canvasWidget()->editFrameSet(m_form);
+
+}
+
+void KWDocStructFormulaItem::deleteItem()
+{
+ gui()->getView()->deleteFrameSet(m_form);
+}
+
+void KWDocStructFormulaItem::editProperties()
+{
+ gui()->canvasWidget()->editFrameProperties(m_form);
+}
+
+void KWDocStructFormulaItem::speakItem()
+{
+ // TODO
+}
+
+
+/******************************************************************/
+/* Class: KWDocStructPartItem */
+/******************************************************************/
+
+KWDocStructPartItem::KWDocStructPartItem(QListViewItem* parent, const QString& text,
+ KWPartFrameSet* part)
+ : KWDocListViewItem(parent, text), m_part(part)
+{
+}
+
+void KWDocStructPartItem::contextMenu(QListViewItem* item, const QPoint& p, int )
+{
+ if (item == this)
+ gui()->getView()->openDocStructurePopupMenu(p, m_part, 0);
+}
+
+
+void KWDocStructPartItem::selectItem()
+{
+ KWFrame* frame = m_part->frame(0);
+ gui()->canvasWidget()->scrollToOffset(frame->topLeft());
+}
+
+void KWDocStructPartItem::editItem()
+{
+ // TODO:
+ // part->startEditing();
+ editProperties();
+}
+
+void KWDocStructPartItem::deleteItem()
+{
+ gui()->getView()->deleteFrameSet(m_part);
+}
+
+void KWDocStructPartItem::editProperties()
+{
+ gui()->canvasWidget()->editFrameProperties(m_part);
+}
+
+/******************************************************************/
+/* Class: KWDocStructRootItem */
+/******************************************************************/
+
+KWDocStructRootItem::KWDocStructRootItem(QListView* parent, const QString& text,
+ TypeStructDocItem type )
+ : KWDocListViewItem(parent, text), m_type(type)
+{
+ switch ( type ) {
+ case Arrangement: {
+ setPixmap( 0, KGlobal::iconLoader()->loadIcon( "tree_arrange", KIcon::Small ) );
+ } break;
+ case TextFrames: {
+ setPixmap( 0, KGlobal::iconLoader()->loadIcon( "frame_text", KIcon::Small ) );
+ } break;
+ case FormulaFrames: {
+ setPixmap( 0, KGlobal::iconLoader()->loadIcon( "frame_formula", KIcon::Small ) );
+ }break;
+ case Tables: {
+ setPixmap( 0, KGlobal::iconLoader()->loadIcon( "inline_table", KIcon::Small ) );
+ } break;
+ case Pictures: {
+ setPixmap( 0, KGlobal::iconLoader()->loadIcon( "frame_image", KIcon::Small ) );
+ } break;
+ case Embedded: {
+ setPixmap( 0, KGlobal::iconLoader()->loadIcon( "frame_query", KIcon::Small ) );
+ } break;
+ }
+}
+
+void KWDocStructRootItem::setOpen(bool o)
+{
+ if ( o )
+ {
+ switch (m_type)
+ {
+ case Arrangement:
+ setupArrangement();
+ break;
+ case TextFrames:
+ setupTextFrameSets();
+ break;
+ case FormulaFrames:
+ setupFormulaFrames();
+ break;
+ case Tables:
+ setupTables();
+ break;
+ case Pictures:
+ setupPictures();
+ break;
+ case Embedded:
+ setupEmbedded();
+ break;
+ }
+ }
+ QListViewItem::setOpen(o);
+}
+
+void KWDocStructRootItem::setupArrangement()
+{
+ deleteAllChildren();
+
+ QIntDict<KWDocStructParagItem> parags;
+ parags.setAutoDelete( false );
+
+ KWFrameSet* frameset = 0L;
+ KWTextParag* parag = 0L;
+ KoTextDocument* textdoc = 0L;
+
+ KWDocument* dok = doc();
+ KWDocStructTextFrameSetItem *item = 0L;
+ QString _name;
+
+ for ( int i = dok->frameSetCount() - 1; i >= 0; i-- )
+ {
+ frameset = dok->frameSet( i );
+ if ( frameset->type() == FT_TEXT && frameset->frameSetInfo() == KWFrameSet::FI_BODY && !frameset->groupmanager() && frameset->frameCount()>0)
+ {
+ KWTextFrameSet *tmpParag = dynamic_cast<KWTextFrameSet*> (frameset) ;
+ item = new KWDocStructTextFrameSetItem( this, frameset->name(), tmpParag);
+ textdoc= tmpParag->textDocument();
+ parag = static_cast<KWTextParag *>(textdoc->firstParag());
+ while ( parag )
+ {
+ KoParagCounter *tmpCounter = parag->counter();
+ if (tmpCounter !=0 && (tmpCounter->style() != KoParagCounter::STYLE_NONE) && (tmpCounter->numbering() == KoParagCounter::NUM_CHAPTER) )
+ {
+ int _depth = tmpCounter->depth();
+ if ( _depth == 0 )
+ {
+ if ( item->childCount() == 0 )
+ parags.replace( _depth, new KWDocStructParagItem( item,QString( tmpCounter->text(parag) + " " +parag->string()->toString().mid( 0, parag->string()->length() ) ),parag) );
+ else
+ parags.replace( _depth, new KWDocStructParagItem( item, parags[ _depth ],QString( tmpCounter->text(parag) + " " +parag->string()->toString().mid( 0, parag->string()->length() ) ),parag) );
+ }
+ else
+ {
+ if (parags[ _depth - 1 ]==0)
+ parags.replace( _depth, new KWDocStructParagItem( item,QString( tmpCounter->text(parag) + " " +parag->string()->toString().mid( 0, parag->string()->length() ) ), parag) );
+ else if ( parags[ _depth - 1 ]->childCount() == 0 )
+ parags.replace( _depth, new KWDocStructParagItem( parags[ _depth - 1 ],QString( tmpCounter->text(parag) + " " +parag->string()->toString().mid( 0, parag->string()->length() ) ), parag) );
+ else
+ parags.replace( _depth, new KWDocStructParagItem( parags[ _depth - 1 ], parags[ _depth ],QString( tmpCounter->text(parag) + " " +parag->string()->toString().mid( 0, parag->string()->length() ) ), parag) );
+ }
+ }
+ parag = static_cast<KWTextParag *>(parag->next());
+ }
+ }
+ }
+
+ if ( childCount() == 0 )
+ ( void )new KListViewItem( this, i18n( "Empty" ) );
+
+}
+
+void KWDocStructRootItem::setupTextFrameSets()
+{
+
+ // Delete Empty item from list.
+ QListViewItem* lvItem = firstChild();
+ if (lvItem && (lvItem->text(0) == i18n("Empty"))) delete lvItem;
+
+ // Build a list of framesets ordered by their screen position (top left corner).
+ KWDocument* dok = doc();
+ QValueList<KWOrderedFrameSet> orderedFrameSets;
+ for ( int i = dok->frameSetCount() - 1; i >= 0; i-- ) {
+ KWFrameSet* frameset = dok->frameSet(i);
+ if ( frameset->type() == FT_TEXT && frameset->frameSetInfo() == KWFrameSet::FI_BODY &&
+ !frameset->groupmanager() && frameset->frameCount()>0)
+
+ orderedFrameSets.append(KWOrderedFrameSet(frameset));
+ }
+ qHeapSort(orderedFrameSets);
+
+ // Build a list of frameset pointers from the sorted list.
+ QPtrList<KWTextFrameSet> frameSetPtrs;
+ frameSetPtrs.setAutoDelete(false);
+ for ( uint i = 0; i < orderedFrameSets.count(); i++ )
+ frameSetPtrs.append(dynamic_cast<KWTextFrameSet *>(orderedFrameSets[i].frameSet()));
+
+ // Remove deleted framesets from the listview.
+ KWDocStructTextFrameSetItem* item = dynamic_cast<KWDocStructTextFrameSetItem *>(firstChild());
+ KWDocStructTextFrameSetItem* delItem;
+ while (item) {
+ delItem = item;
+ item = dynamic_cast<KWDocStructTextFrameSetItem *>(item->nextSibling());
+ if (frameSetPtrs.containsRef(delItem->frameSet()) == 0) delete delItem;
+ }
+
+ // Add new framesets to the list or update existing ones.
+ KWDocStructTextFrameSetItem* after = 0L;
+ for ( uint i = 0; i < orderedFrameSets.count(); i++ )
+ {
+ KWTextFrameSet* textFrameset = dynamic_cast<KWTextFrameSet *>(orderedFrameSets[i].frameSet());
+ item = findTextFrameSetItem(textFrameset);
+ if (item)
+ item->setText(0, textFrameset->name());
+ else {
+ if (after)
+ item = new KWDocStructTextFrameSetItem(
+ this, after, textFrameset->name(), textFrameset);
+ else
+ item = new KWDocStructTextFrameSetItem(this, textFrameset->name(), textFrameset);
+ }
+ after = item;
+ item->setupTextFrames();
+ }
+
+ if ( childCount() == 0 )
+ ( void )new KListViewItem( this, i18n( "Empty" ) );
+}
+
+void KWDocStructRootItem::setupFormulaFrames()
+{
+ deleteAllChildren();
+
+ KWFrameSet* frameset = 0L;
+ QString _name;
+ KWDocStructFormulaItem* child;
+ KWDocument* dok = doc();
+
+ for ( int i = dok->frameSetCount() - 1; i >= 0; i-- )
+ {
+ frameset = dok->frameSet( i );
+ if ( frameset->type() == FT_FORMULA &&
+ frameset->frameCount()>0 )
+ {
+ _name=i18n("Formula Frame %1").arg(QString::number(i+1));
+ child = new KWDocStructFormulaItem(this, _name, dynamic_cast<KWFormulaFrameSet*>( frameset ));
+ }
+ }
+
+ if ( childCount() == 0 )
+ ( void )new KListViewItem( this, i18n( "Empty" ) );
+}
+
+void KWDocStructRootItem::setupTables()
+{
+ // Delete Empty item from list.
+ QListViewItem* lvItem = firstChild();
+ if (lvItem && (lvItem->text(0) == i18n("Empty"))) delete lvItem;
+
+ // Build a list of framesets ordered by their screen position (top left corner).
+ KWDocument* dok = doc();
+ QValueList<KWOrderedFrameSet> orderedFrameSets;
+ for ( int i = dok->frameSetCount() - 1; i >= 0; i-- ) {
+ KWFrameSet* frameset = dok->frameSet(i);
+ if ( frameset->type() == FT_TABLE)
+ orderedFrameSets.append(KWOrderedFrameSet(frameset));
+ }
+ qHeapSort(orderedFrameSets);
+
+ // Build a list of table pointers from the sorted list.
+ QPtrList<KWTableFrameSet> frameSetPtrs;
+ frameSetPtrs.setAutoDelete(false);
+ for ( uint i = 0; i < orderedFrameSets.count(); i++ )
+ frameSetPtrs.append(dynamic_cast<KWTableFrameSet *>(orderedFrameSets[i].frameSet()));
+
+ // Remove deleted tables from the listview.
+ KWDocStructTableItem* item = dynamic_cast<KWDocStructTableItem *>(firstChild());
+ KWDocStructTableItem* delItem;
+ while (item) {
+ delItem = item;
+ item = dynamic_cast<KWDocStructTableItem *>(item->nextSibling());
+ if (frameSetPtrs.containsRef(delItem->table()) == 0) delete delItem;
+ }
+
+ // Add new framesets to the list or update existing ones.
+ KWDocStructTableItem* after = 0L;
+ for ( uint i = 0; i < orderedFrameSets.count(); i++ )
+ {
+ KWTableFrameSet* tableFrameset = dynamic_cast<KWTableFrameSet *>(orderedFrameSets[i].frameSet());
+ item = findTableItem(tableFrameset);
+ if (item)
+ item->setText(0, tableFrameset->name());
+ else {
+ if (after)
+ item = new KWDocStructTableItem(
+ this, after, tableFrameset->name(), tableFrameset);
+ else
+ item = new KWDocStructTableItem(this, tableFrameset->name(), tableFrameset);
+ }
+ after = item;
+ item->setupCells();
+ }
+
+ if ( childCount() == 0 )
+ ( void )new KListViewItem( this, i18n( "Empty" ) );
+}
+
+void KWDocStructRootItem::setupPictures()
+{
+ deleteAllChildren();
+
+ KWFrameSet* frameset = 0L;
+ QString _name;
+ KWDocStructPictureItem* child;
+ KWDocument* dok = doc();
+
+ int j = 0;
+ for ( int i = dok->frameSetCount() - 1; i >= 0; i-- )
+ {
+ frameset = dok->frameSet( i );
+ if ( frameset->type() == FT_PICTURE && frameset->frameCount()>0)
+ {
+ _name=i18n("Picture (%1) %2").arg(dynamic_cast<KWPictureFrameSet*>( frameset )->key().filename()).arg(++j);
+ child = new KWDocStructPictureItem(this, _name, dynamic_cast<KWPictureFrameSet*>( frameset ));
+ }
+ }
+
+ if ( childCount() == 0 )
+ ( void )new KListViewItem( this, i18n( "Empty" ) );
+}
+
+void KWDocStructRootItem::setupEmbedded()
+{
+ deleteAllChildren();
+
+ KWFrameSet* frameset = 0L;
+ QString _name;
+ KWDocStructPartItem* child;
+ KWDocument* dok = doc();
+
+ for ( int i = dok->frameSetCount() - 1; i >= 0; i-- )
+ {
+ frameset = dok->frameSet( i );
+ if ( frameset->type() == FT_PART && frameset->frameCount()>0)
+ {
+ // Use the name of the frameset as the entry for the object.
+ _name=frameset->name();
+ child = new KWDocStructPartItem(this, _name, dynamic_cast<KWPartFrameSet*>( frameset ));
+ }
+ }
+
+ if ( childCount() == 0 )
+ ( void )new KListViewItem( this, i18n( "Empty" ) );
+}
+
+KWDocStructTextFrameSetItem* KWDocStructRootItem::findTextFrameSetItem(const KWFrameSet* frameset)
+{
+ if ( childCount() > 0 )
+ {
+ QListViewItem *child = firstChild();
+ while( child )
+ {
+ if (dynamic_cast<KWDocStructTextFrameSetItem *>(child)->frameSet() == frameset)
+ return dynamic_cast<KWDocStructTextFrameSetItem *>(child);
+ child = child->nextSibling();
+ }
+ }
+ return 0;
+}
+
+KWDocStructTableItem* KWDocStructRootItem::findTableItem(const KWFrameSet* frameset)
+{
+ if ( childCount() > 0 )
+ {
+ QListViewItem *child = firstChild();
+ while( child )
+ {
+ if (dynamic_cast<KWDocStructTableItem *>(child)->table() == frameset)
+ return dynamic_cast<KWDocStructTableItem *>(child);
+ child = child->nextSibling();
+ }
+ }
+ return 0;
+}
+
+
+
+/******************************************************************/
+/* Class: KWDocStructTree */
+/******************************************************************/
+
+KWDocStructTree::KWDocStructTree(QWidget* parent, KWDocument* doc, KWGUI* gui)
+ : KListView(parent), m_doc(doc), m_gui(gui)
+{
+ embedded = new KWDocStructRootItem( this, i18n( "Embedded Objects" ), Embedded);
+ formulafrms = new KWDocStructRootItem( this, i18n( "Formula Frames" ), FormulaFrames);
+ tables = new KWDocStructRootItem( this, i18n( "Tables" ), Tables);
+ pictures = new KWDocStructRootItem( this, i18n( "Pictures" ), Pictures);
+ textfrms = new KWDocStructRootItem( this, i18n( "Text Frames/Frame Sets" ), TextFrames);
+ // arrangement = new KWDocStructRootItem( this, i18n( "Arrangement" ), Arrangement);
+
+ addColumn( i18n( "Document Structure" ) );
+ setFullWidth( true );
+
+ connect( this, SIGNAL( doubleClicked(QListViewItem*) ),
+ this, SLOT( slotDoubleClicked(QListViewItem*)) );
+ connect( this, SIGNAL( returnPressed(QListViewItem*) ),
+ this, SLOT( slotReturnPressed(QListViewItem* )) );
+ connect( this, SIGNAL(rightButtonClicked(QListViewItem*, const QPoint&,int)),
+ this, SLOT( slotRightButtonClicked(QListViewItem *, const QPoint&, int)));
+ connect( this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)),
+ this, SLOT(slotContextMenu(KListView*, QListViewItem*, const QPoint&)) );
+}
+
+KWDocStructTree::~KWDocStructTree()
+{
+ delete embedded;
+ delete formulafrms;
+ delete tables;
+ delete pictures;
+ delete textfrms;
+ // delete arrangement;
+}
+
+void KWDocStructTree::setup()
+{
+ setRootIsDecorated( true );
+ setSorting( -1 );
+ refreshTree((int)(TextFrames | FormulaFrames | Tables | Pictures | Embedded));
+}
+
+void KWDocStructTree::refreshTree(int type)
+{
+ // TODO: Saving current position by listview item text doesn't work if an item is renamed.
+ QString curItemText;
+ if (currentItem()) curItemText = currentItem()->text(0);
+ // if(((int)Arrangement) & type)
+ // arrangement->setupArrangement();
+ if(((int)TextFrames) & type)
+ textfrms->setupTextFrameSets();
+ if(((int)FormulaFrames) & type)
+ formulafrms->setupFormulaFrames();
+ if(((int)Tables) & type)
+ tables->setupTables();
+ if(((int)Pictures) & type)
+ pictures->setupPictures();
+ if(((int)Embedded) & type)
+ embedded->setupEmbedded();
+ if (!curItemText.isEmpty()) {
+ QListViewItem* item = findItem(curItemText, 0);
+ if (item) setCurrentItem(item);
+ }
+}
+
+void KWDocStructTree::selectItem()
+{
+ QListViewItem* select = currentItem ();
+ KWDocListViewItem* tmp = dynamic_cast<KWDocListViewItem *>(select);
+ if ( tmp )
+ tmp->selectItem();
+}
+
+void KWDocStructTree::editItem()
+{
+ QListViewItem* select = currentItem();
+ KWDocListViewItem* tmp = dynamic_cast<KWDocListViewItem *>(select);
+ if ( tmp )
+ tmp->editItem();
+}
+
+
+void KWDocStructTree::deleteItem()
+{
+ QListViewItem* select = currentItem();
+ KWDocListViewItem *tmp = dynamic_cast<KWDocListViewItem *>(select);
+ if ( tmp )
+ tmp->deleteItem();
+}
+
+void KWDocStructTree::editProperties()
+{
+ QListViewItem* select = currentItem();
+ KWDocListViewItem* tmp = dynamic_cast<KWDocListViewItem *>(select);
+ if ( tmp )
+ tmp->editProperties();
+}
+
+void KWDocStructTree::speakItem()
+{
+ QListViewItem* select = currentItem();
+ KWDocListViewItem* tmp = dynamic_cast<KWDocListViewItem *>(select);
+ if ( tmp )
+ tmp->speakItem();
+}
+
+void KWDocStructTree::slotContextMenu(KListView* lv, QListViewItem* i, const QPoint& p)
+{
+ if (lv != this)
+ return;
+ KWDocListViewItem *item = dynamic_cast<KWDocListViewItem *>(i);
+ if (item)
+ item->contextMenu(item, p, 0);
+}
+
+void KWDocStructTree::slotRightButtonClicked(QListViewItem* i, const QPoint& p, int)
+{
+ KWDocListViewItem* item = dynamic_cast<KWDocListViewItem *>(i);
+ if (item)
+ item->contextMenu(item, p, 0);
+}
+
+void KWDocStructTree::slotDoubleClicked(QListViewItem* i)
+{
+ KWDocListViewItem* item = dynamic_cast<KWDocListViewItem *>(i);
+ if (item)
+ item->selectItem();
+}
+
+void KWDocStructTree::slotReturnPressed(QListViewItem* i)
+{
+ KWDocListViewItem* item = dynamic_cast<KWDocListViewItem *>(i);
+ if (item) {
+ item->editItem();
+ //return focus to canvas.
+ m_gui->canvasWidget()->setFocus();
+ }
+}
+
+
+/******************************************************************/
+/* Class: KWDocStruct */
+/******************************************************************/
+
+KWDocStruct::KWDocStruct(QWidget* parent, KWDocument* doc, KWGUI* gui)
+ : QWidget(parent), m_doc(doc), m_gui(gui)
+{
+ m_layout = new QVBoxLayout( this );
+
+ KToolBar* searchBar = new KToolBar( this );
+ searchBar->setFlat( true );
+ searchBar->setMovingEnabled( false );
+
+ KToolBarButton* eraseButton = new KToolBarButton( "locationbar_erase", 0, searchBar );
+ m_tree = new KWDocStructTree( this, doc, gui );
+ m_tree->setAlternateBackground( KGlobalSettings::alternateBackgroundColor() );
+ KListViewSearchLine* searchLine = new KListViewSearchLine( searchBar, m_tree );
+ searchBar->setStretchableWidget( searchLine );
+ connect( eraseButton, SIGNAL( clicked() ), searchLine, SLOT( clear() ) );
+
+ m_layout->addWidget(searchBar);
+ m_layout->addWidget(m_tree);
+ m_tree->setup();
+ dirtyTreeTypes = 0;
+}
+
+void KWDocStruct::paintEvent (QPaintEvent* ev)
+{
+ if (dirtyTreeTypes) {
+ m_tree->refreshTree(dirtyTreeTypes);
+ dirtyTreeTypes = 0;
+ }
+ QWidget::paintEvent(ev);
+}
+
+void KWDocStruct::refreshTree(int type)
+{
+ if ((dirtyTreeTypes | type) != dirtyTreeTypes) {
+ dirtyTreeTypes |= type;
+ update();
+ }
+}
+
+void KWDocStruct::refreshEntireTree()
+{
+ refreshTree((int)(TextFrames | FormulaFrames | Tables | Pictures | Embedded));
+}
+
+void KWDocStruct::setFocusHere()
+{
+ if (m_tree)
+ if (m_tree->isVisible()) m_tree->setFocus();
+}
+
+void KWDocStruct::selectItem()
+{
+ m_tree->selectItem();
+}
+
+void KWDocStruct::editItem()
+{
+ m_tree->editItem();
+}
+
+void KWDocStruct::deleteItem()
+{
+ m_tree->deleteItem();
+}
+
+void KWDocStruct::editProperties()
+{
+ m_tree->editProperties();
+}
+
+void KWDocStruct::speakItem()
+{
+ m_tree->speakItem();
+}