kword

KWDocStruct.cpp
1/* This file is part of the KDE project
2 Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20// KWord includes.
21#include "KWDocument.h"
22#include "KWView.h"
23#include "KWCanvas.h"
24#include "KWDocStruct.h"
25#include "KWDocStruct.moc"
26#include "KWTableFrameSet.h"
27#include "KWPartFrameSet.h"
28#include "KWFormulaFrameSet.h"
29#include "KWPictureFrameSet.h"
30#include "KWTextDocument.h"
31
32// KOffice includes.
33#include <KoParagCounter.h>
34#include <KoSpeaker.h>
35
36// KDE includes.
37#include <tdelocale.h>
38#include <kiconloader.h>
39#include <kdebug.h>
40#include <tdelistviewsearchline.h>
41#include <tdeglobalsettings.h>
42#include <tdeglobal.h>
43#include <kpixmap.h>
44#include <tdetoolbar.h>
45#include <tdetoolbarbutton.h>
46
47#include <tqlayout.h>
48
49/******************************************************************/
50/* Class: KWOrderedFrameSet */
51/******************************************************************/
52
53KWOrderedFrameSet::KWOrderedFrameSet(KWFrameSet* fs) :
54 m_frameset(fs) { }
55
56KWOrderedFrameSet::KWOrderedFrameSet() :
57 m_frameset(0) { }
58
59bool KWOrderedFrameSet::operator<( KWOrderedFrameSet ofs )
60{
61 if (!m_frameset) return false;
62 KWFrame* frame1 = m_frameset->frame(0);
63 if (!frame1) return false;
64 KWFrameSet* frameset2 = ofs.frameSet();
65 if (!frameset2) return false;
66 KWFrame* frame2 = frameset2->frame(0);
67 if (!frame2) return false;
68 KoPoint p1 = frame1->topLeft();
69 KoPoint p2 = frame2->topLeft();
70 return (p1.y() < p2.y() || (p1.y() == p2.y() && p1.x() < p2.x()));
71}
72
73/******************************************************************/
74/* Class: KWDocDocListViewItem */
75/******************************************************************/
76
77KWDocListViewItem::KWDocListViewItem(TQListViewItem* parent, const TQString& text)
78 : TDEListViewItem(parent, text)
79{
80}
81
82KWDocListViewItem::KWDocListViewItem(TQListViewItem* parent, TQListViewItem* after, const TQString& text )
83 :TDEListViewItem(parent, after, text)
84{
85}
86
87KWDocListViewItem::KWDocListViewItem(TQListView* parent, const TQString& text)
88 :TDEListViewItem(parent, text)
89{
90}
91
92void KWDocListViewItem::deleteAllChildren()
93{
94 if ( childCount() > 0 )
95 {
96 TQListViewItem *child = firstChild();
97 TQListViewItem *delChild;
98
99 while( child )
100 {
101 delChild = child;
102 child = child->nextSibling();
103 delete delChild;
104 }
105 }
106}
107
108KWDocument* KWDocListViewItem::doc()
109{
110 return dynamic_cast<KWDocStructTree *>(listView())->doc();
111}
112
113KWGUI* KWDocListViewItem::gui()
114{
115 return dynamic_cast<KWDocStructTree *>(listView())->gui();
116}
117
118
119/******************************************************************/
120/* Class: KWDocStructParagItem */
121/******************************************************************/
122
123KWDocStructParagItem::KWDocStructParagItem(TQListViewItem* parent, const TQString& text, KWTextParag* parag )
124 : KWDocListViewItem(parent, text), m_parag(parag)
125{
126}
127
128KWDocStructParagItem::KWDocStructParagItem(TQListViewItem* parent, TQListViewItem* after,
129 const TQString& text, KWTextParag* parag )
130 : KWDocListViewItem(parent, after, text), m_parag(parag)
131{
132}
133
134void KWDocStructParagItem::contextMenu(TQListViewItem* item, const TQPoint& p, int )
135{
136 if (item == this)
137 {
138 KWTextFrameSet* fs = m_parag->kwTextDocument()->textFrameSet();
139 gui()->getView()->openDocStructurePopupMenu(p, fs, m_parag);
140 }
141}
142
143void KWDocStructParagItem::selectItem()
144{
145 KWTextFrameSet* fs = m_parag->kwTextDocument()->textFrameSet();
146 TQPoint iPoint = m_parag->rect().topLeft(); // small bug if a paragraph is cut between two pages.
147 KoPoint dPoint;
148 fs->internalToDocument(iPoint, dPoint);
149 TQPoint nPoint = fs->kWordDocument()->zoomPoint(dPoint);
150 gui()->canvasWidget()->scrollToOffset(fs->kWordDocument()->unzoomPoint(nPoint));
151
152}
153
154void KWDocStructParagItem::editItem()
155{
156 gui()->canvasWidget()->editTextFrameSet(m_parag->kwTextDocument()->textFrameSet(), m_parag, 0);
157}
158
159void KWDocStructParagItem::deleteItem()
160{
161 // TODO
162}
163
164void KWDocStructParagItem::editProperties()
165{
166 gui()->canvasWidget()->editTextFrameSet(m_parag->kwTextDocument()->textFrameSet(), m_parag, 0);
167 gui()->getView()->formatParagraph();
168}
169
170void KWDocStructParagItem::speakItem()
171{
172 TQString text;
173 KoParagCounter* tmpCounter = m_parag->counter();
174 if (tmpCounter)
175 text = tmpCounter->text(m_parag) + " ";
176 text += m_parag->toString();
177 if (!text.isEmpty()) {
178 kospeaker->queueSpeech(text, m_parag->paragraphFormat()->language(), true);
179 kospeaker->startSpeech();
180 }
181}
182
183
184/******************************************************************/
185/* Class: KWDocStructTextFrameItem */
186/******************************************************************/
187
188KWDocStructTextFrameItem::KWDocStructTextFrameItem(TQListViewItem* parent, const TQString& text,
189 KWTextFrameSet* frameset, KWFrame* frame)
190 : KWDocListViewItem(parent, text), m_frame(frame), m_frameset(frameset)
191{
192}
193
194KWDocStructTextFrameItem::KWDocStructTextFrameItem(TQListViewItem* parent, TQListViewItem* after,
195 const TQString& text, KWTextFrameSet* frameset, KWFrame* frame)
196 : KWDocListViewItem(parent, after, text), m_frame(frame), m_frameset(frameset)
197{
198}
199
200void KWDocStructTextFrameItem::setupTextParags()
201{
202 // Build a list of pointers to paragraphs.
203 TQPtrList<KWTextParag> paragPtrs;
204 paragPtrs.setAutoDelete(false);
205 KoTextParag* textParag = 0;
206 KoTextParag* lastParag = 0;
207 int index = 0;
208 // Get upper left corner of the frame and get coordinates just inside it.
209 KoPoint dPoint = m_frame->topLeft() + KoPoint(2,2);
210 // Get the first paragraph of the frame.
211 m_frameset->findPosition(dPoint, textParag, index);
212 // Get lower right corner of the frame and get coordinate just inside it.
213 dPoint = m_frame->bottomRight() - KoPoint(2,2);
214 // Get the last paragraph of the frame.
215 m_frameset->findPosition(dPoint, lastParag, index);
216 if (lastParag) {
217 while (textParag) {
218 KWTextParag* parag = dynamic_cast<KWTextParag *>(textParag);
219 if (parag) {
220 // Don't display an empty paragraph.
221 TQString text = parag->toString().stripWhiteSpace();
222 if ( text.length() > 0)
223 paragPtrs.append(parag);
224 }
225 if (textParag == lastParag)
226 textParag = 0;
227 else
228 textParag = textParag->next();
229 }
230 }
231
232 // Remove deleted paragraphs from the listview.
233 KWDocStructParagItem* item = dynamic_cast<KWDocStructParagItem *>(firstChild());
234 KWDocStructParagItem* delItem;
235 while (item) {
236 delItem = item;
237 item = dynamic_cast<KWDocStructParagItem *>(item->nextSibling());
238 if (paragPtrs.containsRef(delItem->parag()) == 0) delete delItem;
239 }
240
241 // Add new paragraphs to the list or update existing ones.
242 KWDocStructParagItem* after = 0;
243 for (uint j = 0; j < paragPtrs.count(); j++) {
244 KWTextParag* parag = paragPtrs.at(j);
245 TQString text = parag->toString().stripWhiteSpace();
246 TQString name = text.left(20);
247 KoParagCounter* tmpCounter = parag->counter();
248 if (tmpCounter)
249 name.prepend(tmpCounter->text(parag) + " ");
250 KWDocStructParagItem* child = findTextParagItem(parag);
251 if (child)
252 child->setText(0, name);
253 else {
254 if (after)
255 child = new KWDocStructParagItem(this, after, name, parag);
256 else
257 child = new KWDocStructParagItem(this, name, parag);
258 }
259 after = child;
260 }
261}
262
263void KWDocStructTextFrameItem::contextMenu(TQListViewItem* item, const TQPoint& p, int )
264{
265 if (item == this)
266 gui()->getView()->openDocStructurePopupMenu(p, m_frameset, 0);
267}
268
269void KWDocStructTextFrameItem::selectItem()
270{
271 gui()->canvasWidget()->scrollToOffset(m_frame->topLeft());
272}
273
274void KWDocStructTextFrameItem::editItem()
275{
276 KoTextParag* parag = 0L;
277 int index = 0;
278 // Get upperleft corner of the frame and get coordinates just inside it.
279 KoPoint dPoint = m_frame->topLeft() + KoPoint(2,2);
280 m_frameset->findPosition(dPoint, parag, index);
281 gui()->canvasWidget()->editTextFrameSet(m_frameset, parag, 0);
282}
283
284void KWDocStructTextFrameItem::deleteItem()
285{
286 gui()->getView()->deleteFrameSet(m_frameset);
287}
288
289void KWDocStructTextFrameItem::editProperties()
290{
291 gui()->canvasWidget()->editFrameProperties(m_frameset);
292}
293
294void KWDocStructTextFrameItem::speakItem()
295{
296 KoTextParag* textParag = 0;
297 KoTextParag* lastParag = 0;
298 int index = 0;
299 // Get upper left corner of the frame and get coordinates just inside it.
300 KoPoint dPoint = m_frame->topLeft() + KoPoint(2,2);
301 // Get the first paragraph of the frame.
302 m_frameset->findPosition(dPoint, textParag, index);
303 // Get lower right corner of the frame and get coordinate just inside it.
304 dPoint = m_frame->bottomRight() - KoPoint(2,2);
305 // Get the last paragraph of the frame.
306 m_frameset->findPosition(dPoint, lastParag, index);
307 bool first = true;
308 if (textParag && lastParag) {
309 while (textParag) {
310 KWTextParag* parag = dynamic_cast<KWTextParag *>(textParag);
311 if (parag) {
312 // Don't speak an empty paragraph.
313 TQString text = parag->toString().stripWhiteSpace();
314 if ( text.length() > 0) {
315 kospeaker->queueSpeech(text, parag->paragraphFormat()->language(), first);
316 first = false;
317 }
318 }
319 if (textParag == lastParag)
320 textParag = 0;
321 else
322 textParag = textParag->next();
323 }
324 kospeaker->startSpeech();
325 }
326}
327
328KWDocStructParagItem* KWDocStructTextFrameItem::findTextParagItem(const KWTextParag* parag)
329{
330 if ( childCount() > 0 )
331 {
332 TQListViewItem *child = firstChild();
333 while( child )
334 {
335 if (dynamic_cast<KWDocStructParagItem *>(child)->parag() == parag)
336 return dynamic_cast<KWDocStructParagItem *>(child);
337 child = child->nextSibling();
338 }
339 }
340 return 0;
341}
342
343
344/******************************************************************/
345/* Class: KWDocStructTextFrameSetItem */
346/******************************************************************/
347
348KWDocStructTextFrameSetItem::KWDocStructTextFrameSetItem(TQListViewItem* parent, const TQString& text,
349 KWTextFrameSet* frameset)
350 : KWDocListViewItem(parent, text ), m_frameset(frameset)
351{
352}
353
354KWDocStructTextFrameSetItem::KWDocStructTextFrameSetItem(TQListViewItem* parent, TQListViewItem* after,
355 const TQString& text, KWTextFrameSet* frameset)
356 : KWDocListViewItem(parent, after, text), m_frameset(frameset)
357{
358}
359
360void KWDocStructTextFrameSetItem::setupTextFrames()
361{
362 // TODO: KWTextFrameSet::frame() method returns frames in screen order?
363 // Build a list of frame pointers.
364 TQPtrList<KWFrame> framePtrs;
365 framePtrs.setAutoDelete(false);
366 for (uint j = 0; j < m_frameset->frameCount(); j++)
367 framePtrs.append(m_frameset->frame(j));
368
369 // Remove deleted frames from the listview.
370 KWDocStructTextFrameItem* item = dynamic_cast<KWDocStructTextFrameItem *>(firstChild());
371 KWDocStructTextFrameItem* delItem;
372 while (item) {
373 delItem = item;
374 item = dynamic_cast<KWDocStructTextFrameItem *>(item->nextSibling());
375 if (framePtrs.containsRef(delItem->frame()) == 0) delete delItem;
376 }
377
378 // Add new frames to the list or update existing ones.
379 KWDocument* dok = doc();
380 KWDocStructTextFrameItem* after = 0;
381 for (uint j = 0; j < framePtrs.count(); j++)
382 {
383 KWFrame* frame = framePtrs.at(j);
384 TQString name;
385 if ( TDEListViewItem::parent()->firstChild() == this && dok->processingType() == KWDocument::WP )
386 {
387 if ( dok->numColumns() == 1 )
388 name=i18n( "Page %1" ).arg(TQString::number(j + 1));
389 else
390 name=i18n( "Column %1" ).arg(TQString::number(j + 1));
391 }
392 else
393 name=i18n( "Text Frame %1" ).arg(TQString::number(j + 1));
394 KWDocStructTextFrameItem* child = findTextFrameItem(frame);
395 if (child)
396 child->setText(0, name);
397 else {
398 if (after)
399 child = new KWDocStructTextFrameItem(this, after, name, m_frameset, frame);
400 else
401 child = new KWDocStructTextFrameItem(this, name, m_frameset, frame);
402 }
403 child->setupTextParags();
404 after = child;
405 }
406}
407
408void KWDocStructTextFrameSetItem::contextMenu(TQListViewItem* item, const TQPoint& p, int )
409{
410 if (item == this)
411 gui()->getView()->openDocStructurePopupMenu(p, m_frameset, 0);
412}
413
414void KWDocStructTextFrameSetItem::selectItem()
415{
416 KWFrame* frame = m_frameset->frame(0);
417 if (!frame) return;
418 gui()->canvasWidget()->scrollToOffset(frame->topLeft());
419}
420
421void KWDocStructTextFrameSetItem::editItem()
422{
423 gui()->canvasWidget()->editTextFrameSet(m_frameset, 0L, 0);
424}
425
426void KWDocStructTextFrameSetItem::deleteItem()
427{
428 gui()->getView()->deleteFrameSet(m_frameset);
429}
430
431void KWDocStructTextFrameSetItem::editProperties()
432{
433 gui()->canvasWidget()->editFrameProperties(m_frameset);
434}
435
436void KWDocStructTextFrameSetItem::speakItem()
437{
438 KoTextParag* parag = m_frameset->textDocument()->firstParag();
439 kospeaker->queueSpeech(parag->toString(), parag->paragraphFormat()->language(), true);
440 parag = parag->next();
441 for ( ; parag ; parag = parag->next() )
442 kospeaker->queueSpeech(parag->toString(), parag->paragraphFormat()->language(), false);
443 kospeaker->startSpeech();
444}
445
446KWDocStructTextFrameItem* KWDocStructTextFrameSetItem::findTextFrameItem(const KWFrame* frame)
447{
448 if ( childCount() > 0 )
449 {
450 TQListViewItem *child = firstChild();
451 while( child )
452 {
453 if (dynamic_cast<KWDocStructTextFrameItem *>(child)->frame() == frame)
454 return dynamic_cast<KWDocStructTextFrameItem *>(child);
455 child = child->nextSibling();
456 }
457 }
458 return 0;
459}
460
461
462/******************************************************************/
463/* Class: KWDocStructTableItem */
464/******************************************************************/
465
466KWDocStructTableItem::KWDocStructTableItem(TQListViewItem* parent, const TQString& text,
467 KWTableFrameSet* table)
468 :KWDocListViewItem(parent, text), m_table(table)
469{
470}
471
472KWDocStructTableItem::KWDocStructTableItem(TQListViewItem* parent, TQListViewItem* after,
473 const TQString& text, KWTableFrameSet* table)
474 :KWDocListViewItem(parent, after, text), m_table(table)
475{
476}
477
478void KWDocStructTableItem::setupCells()
479{
480 // TODO: KWTableFrameSet::cell() method returns cells in screen order?
481 // Build a list of cell pointers.
482 TQPtrList<KWTextFrameSet> cellPtrs;
483 cellPtrs.setAutoDelete(false);
484 for (uint row = 0; row < m_table->getRows(); ++row)
485 for (uint col = 0; col < m_table->getColumns(); ++ col) {
486 KWTextFrameSet* cell = m_table->cell(row, col);
487 if (cell)
488 cellPtrs.append(cell);
489 }
490
491 // Remove deleted cells from the listview.
492 KWDocStructTextFrameItem* item = dynamic_cast<KWDocStructTextFrameItem *>(firstChild());
493 KWDocStructTextFrameItem* delItem;
494 while (item) {
495 delItem = item;
496 item = dynamic_cast<KWDocStructTextFrameItem *>(item->nextSibling());
497 if (cellPtrs.containsRef(delItem->frameSet()) == 0) delete delItem;
498 }
499
500 // Add new cells to the list or update existing ones.
501 // Note we skip over the frameset and add the frame instead,
502 // as every cell has exactly one frame in the frameset.
503 KWDocStructTextFrameItem* child;
504 KWDocStructTextFrameItem* after = 0;
505 for (uint j = 0; j < cellPtrs.count(); j++)
506 {
507 KWTextFrameSet* cell = cellPtrs.at(j);
508 KWFrame* frame = cell->frame(0);
509 if (frame) {
510 TQString name = cell->name();
511 child = findCellItem(cell);
512 if (child)
513 child->setText(0, name);
514 else {
515 if (after)
516 child = new KWDocStructTextFrameItem(this, after, name, cell, frame);
517 else
518 child = new KWDocStructTextFrameItem(this, name, cell, frame);
519 }
520 child->setupTextParags();
521 after = child;
522 }
523 }
524}
525
526void KWDocStructTableItem::contextMenu(TQListViewItem* item, const TQPoint& p, int )
527{
528 if (item == this)
529 gui()->getView()->openDocStructurePopupMenu(p, m_table, 0);
530}
531
532void KWDocStructTableItem::selectItem()
533{
534 KWFrame* frame = m_table->cell( 0, 0 )->frame( 0 );
535 gui()->canvasWidget()->scrollToOffset(frame->topLeft());
536}
537
538void KWDocStructTableItem::editItem()
539{
540 //activate the first cell
541 gui()->canvasWidget()->editTextFrameSet(m_table->cell(0,0), 0L, 0);
542}
543
544void KWDocStructTableItem::deleteItem()
545{
546 // TODO: The following statement isn't working for some reason.
547 gui()->getView()->deselectAllFrames();
548 gui()->getView()->deleteFrameSet(m_table);
549}
550
551void KWDocStructTableItem::editProperties()
552{
553 gui()->canvasWidget()->editFrameProperties(m_table);
554}
555
556void KWDocStructTableItem::speakItem()
557{
558 bool first = true;
559 for (uint row = 0; row < m_table->getRows(); ++row) {
560 for (uint col = 0; col < m_table->getColumns(); ++ col) {
561 KoTextParag* parag = m_table->cell(row, col)->textDocument()->firstParag();
562 kospeaker->queueSpeech(parag->toString(), parag->paragraphFormat()->language(), first);
563 first = false;
564 parag = parag->next();
565 for ( ; parag ; parag = parag->next() )
566 kospeaker->queueSpeech(parag->toString(), parag->paragraphFormat()->language(), false);
567 }
568 }
569 kospeaker->startSpeech();
570}
571
572KWDocStructTextFrameItem* KWDocStructTableItem::findCellItem(const KWTextFrameSet* cell)
573{
574 if ( childCount() > 0 )
575 {
576 TQListViewItem *child = firstChild();
577 while( child )
578 {
579 if (dynamic_cast<KWDocStructTextFrameItem *>(child)->frameSet() == cell)
580 return dynamic_cast<KWDocStructTextFrameItem *>(child);
581 child = child->nextSibling();
582 }
583 }
584 return 0;
585}
586
587
588/******************************************************************/
589/* Class: KWDocStructPictureItem */
590/******************************************************************/
591
592KWDocStructPictureItem::KWDocStructPictureItem(TQListViewItem* parent, const TQString& text,
593 KWPictureFrameSet* pic)
594 : KWDocListViewItem(parent, text), m_pic(pic)
595{
596}
597
598void KWDocStructPictureItem::contextMenu(TQListViewItem* item, const TQPoint& p, int )
599{
600 if (item == this)
601 gui()->getView()->openDocStructurePopupMenu(p, m_pic, 0);
602}
603
604
605void KWDocStructPictureItem::selectItem()
606{
607 KWFrame *frame = m_pic->frame(0);
608 gui()->canvasWidget()->scrollToOffset(frame->topLeft() );
609
610}
611
612void KWDocStructPictureItem::editItem()
613{
614 // Pictures cannot be edited. Edit Properties instead.
615 editProperties();
616}
617
618void KWDocStructPictureItem::deleteItem()
619{
620 gui()->getView()->deleteFrameSet(m_pic);
621}
622
623void KWDocStructPictureItem::editProperties()
624{
625 gui()->canvasWidget()->editFrameProperties(m_pic);
626}
627
628/******************************************************************/
629/* Class: KWDocStructFormulaItem */
630/******************************************************************/
631
632KWDocStructFormulaItem::KWDocStructFormulaItem(TQListViewItem* parent, const TQString& text,
633 KWFormulaFrameSet* form)
634 : KWDocListViewItem(parent, text), m_form(form)
635{
636}
637
638void KWDocStructFormulaItem::contextMenu(TQListViewItem* item, const TQPoint& p, int )
639{
640 if (item == this)
641 gui()->getView()->openDocStructurePopupMenu(p, m_form, 0);
642}
643
644void KWDocStructFormulaItem::selectItem()
645{
646 KWFrame* frame = m_form->frame( 0 );
647 gui()->canvasWidget()->scrollToOffset(frame->topLeft());
648}
649
650void KWDocStructFormulaItem::editItem()
651{
652 // TODO: Formula has to be selected first to bring it into view. Bug?
653 selectItem();
654 gui()->canvasWidget()->editFrameSet(m_form);
655
656}
657
658void KWDocStructFormulaItem::deleteItem()
659{
660 gui()->getView()->deleteFrameSet(m_form);
661}
662
663void KWDocStructFormulaItem::editProperties()
664{
665 gui()->canvasWidget()->editFrameProperties(m_form);
666}
667
668void KWDocStructFormulaItem::speakItem()
669{
670 // TODO
671}
672
673
674/******************************************************************/
675/* Class: KWDocStructPartItem */
676/******************************************************************/
677
678KWDocStructPartItem::KWDocStructPartItem(TQListViewItem* parent, const TQString& text,
679 KWPartFrameSet* part)
680 : KWDocListViewItem(parent, text), m_part(part)
681{
682}
683
684void KWDocStructPartItem::contextMenu(TQListViewItem* item, const TQPoint& p, int )
685{
686 if (item == this)
687 gui()->getView()->openDocStructurePopupMenu(p, m_part, 0);
688}
689
690
691void KWDocStructPartItem::selectItem()
692{
693 KWFrame* frame = m_part->frame(0);
694 gui()->canvasWidget()->scrollToOffset(frame->topLeft());
695}
696
697void KWDocStructPartItem::editItem()
698{
699 // TODO:
700 // part->startEditing();
701 editProperties();
702}
703
704void KWDocStructPartItem::deleteItem()
705{
706 gui()->getView()->deleteFrameSet(m_part);
707}
708
709void KWDocStructPartItem::editProperties()
710{
711 gui()->canvasWidget()->editFrameProperties(m_part);
712}
713
714/******************************************************************/
715/* Class: KWDocStructRootItem */
716/******************************************************************/
717
718KWDocStructRootItem::KWDocStructRootItem(TQListView* parent, const TQString& text,
719 TypeStructDocItem type )
720 : KWDocListViewItem(parent, text), m_type(type)
721{
722 switch ( type ) {
723 case Arrangement: {
724 setPixmap( 0, TDEGlobal::iconLoader()->loadIcon( "tree_arrange", TDEIcon::Small ) );
725 } break;
726 case TextFrames: {
727 setPixmap( 0, TDEGlobal::iconLoader()->loadIcon( "frame_text", TDEIcon::Small ) );
728 } break;
729 case FormulaFrames: {
730 setPixmap( 0, TDEGlobal::iconLoader()->loadIcon( "frame_formula", TDEIcon::Small ) );
731 }break;
732 case Tables: {
733 setPixmap( 0, TDEGlobal::iconLoader()->loadIcon( "inline_table", TDEIcon::Small ) );
734 } break;
735 case Pictures: {
736 setPixmap( 0, TDEGlobal::iconLoader()->loadIcon( "frame_image", TDEIcon::Small ) );
737 } break;
738 case Embedded: {
739 setPixmap( 0, TDEGlobal::iconLoader()->loadIcon( "frame_query", TDEIcon::Small ) );
740 } break;
741 }
742}
743
744void KWDocStructRootItem::setOpen(bool o)
745{
746 if ( o )
747 {
748 switch (m_type)
749 {
750 case Arrangement:
751 setupArrangement();
752 break;
753 case TextFrames:
754 setupTextFrameSets();
755 break;
756 case FormulaFrames:
757 setupFormulaFrames();
758 break;
759 case Tables:
760 setupTables();
761 break;
762 case Pictures:
763 setupPictures();
764 break;
765 case Embedded:
766 setupEmbedded();
767 break;
768 }
769 }
770 TQListViewItem::setOpen(o);
771}
772
773void KWDocStructRootItem::setupArrangement()
774{
775 deleteAllChildren();
776
777 TQIntDict<KWDocStructParagItem> parags;
778 parags.setAutoDelete( false );
779
780 KWFrameSet* frameset = 0L;
781 KWTextParag* parag = 0L;
782 KoTextDocument* textdoc = 0L;
783
784 KWDocument* dok = doc();
785 KWDocStructTextFrameSetItem *item = 0L;
786 TQString _name;
787
788 for ( int i = dok->frameSetCount() - 1; i >= 0; i-- )
789 {
790 frameset = dok->frameSet( i );
791 if ( frameset->type() == FT_TEXT && frameset->frameSetInfo() == KWFrameSet::FI_BODY && !frameset->groupmanager() && frameset->frameCount()>0)
792 {
793 KWTextFrameSet *tmpParag = dynamic_cast<KWTextFrameSet*> (frameset) ;
794 item = new KWDocStructTextFrameSetItem( this, frameset->name(), tmpParag);
795 textdoc= tmpParag->textDocument();
796 parag = static_cast<KWTextParag *>(textdoc->firstParag());
797 while ( parag )
798 {
799 KoParagCounter *tmpCounter = parag->counter();
800 if (tmpCounter !=0 && (tmpCounter->style() != KoParagCounter::STYLE_NONE) && (tmpCounter->numbering() == KoParagCounter::NUM_CHAPTER) )
801 {
802 int _depth = tmpCounter->depth();
803 if ( _depth == 0 )
804 {
805 if ( item->childCount() == 0 )
806 parags.replace( _depth, new KWDocStructParagItem( item,TQString( tmpCounter->text(parag) + " " +parag->string()->toString().mid( 0, parag->string()->length() ) ),parag) );
807 else
808 parags.replace( _depth, new KWDocStructParagItem( item, parags[ _depth ],TQString( tmpCounter->text(parag) + " " +parag->string()->toString().mid( 0, parag->string()->length() ) ),parag) );
809 }
810 else
811 {
812 if (parags[ _depth - 1 ]==0)
813 parags.replace( _depth, new KWDocStructParagItem( item,TQString( tmpCounter->text(parag) + " " +parag->string()->toString().mid( 0, parag->string()->length() ) ), parag) );
814 else if ( parags[ _depth - 1 ]->childCount() == 0 )
815 parags.replace( _depth, new KWDocStructParagItem( parags[ _depth - 1 ],TQString( tmpCounter->text(parag) + " " +parag->string()->toString().mid( 0, parag->string()->length() ) ), parag) );
816 else
817 parags.replace( _depth, new KWDocStructParagItem( parags[ _depth - 1 ], parags[ _depth ],TQString( tmpCounter->text(parag) + " " +parag->string()->toString().mid( 0, parag->string()->length() ) ), parag) );
818 }
819 }
820 parag = static_cast<KWTextParag *>(parag->next());
821 }
822 }
823 }
824
825 if ( childCount() == 0 )
826 ( void )new TDEListViewItem( this, i18n( "Empty" ) );
827
828}
829
830void KWDocStructRootItem::setupTextFrameSets()
831{
832
833 // Delete Empty item from list.
834 TQListViewItem* lvItem = firstChild();
835 if (lvItem && (lvItem->text(0) == i18n("Empty"))) delete lvItem;
836
837 // Build a list of framesets ordered by their screen position (top left corner).
838 KWDocument* dok = doc();
839 TQValueList<KWOrderedFrameSet> orderedFrameSets;
840 for ( int i = dok->frameSetCount() - 1; i >= 0; i-- ) {
841 KWFrameSet* frameset = dok->frameSet(i);
842 if ( frameset->type() == FT_TEXT && frameset->frameSetInfo() == KWFrameSet::FI_BODY &&
843 !frameset->groupmanager() && frameset->frameCount()>0)
844
845 orderedFrameSets.append(KWOrderedFrameSet(frameset));
846 }
847 qHeapSort(orderedFrameSets);
848
849 // Build a list of frameset pointers from the sorted list.
850 TQPtrList<KWTextFrameSet> frameSetPtrs;
851 frameSetPtrs.setAutoDelete(false);
852 for ( uint i = 0; i < orderedFrameSets.count(); i++ )
853 frameSetPtrs.append(dynamic_cast<KWTextFrameSet *>(orderedFrameSets[i].frameSet()));
854
855 // Remove deleted framesets from the listview.
856 KWDocStructTextFrameSetItem* item = dynamic_cast<KWDocStructTextFrameSetItem *>(firstChild());
857 KWDocStructTextFrameSetItem* delItem;
858 while (item) {
859 delItem = item;
860 item = dynamic_cast<KWDocStructTextFrameSetItem *>(item->nextSibling());
861 if (frameSetPtrs.containsRef(delItem->frameSet()) == 0) delete delItem;
862 }
863
864 // Add new framesets to the list or update existing ones.
865 KWDocStructTextFrameSetItem* after = 0L;
866 for ( uint i = 0; i < orderedFrameSets.count(); i++ )
867 {
868 KWTextFrameSet* textFrameset = dynamic_cast<KWTextFrameSet *>(orderedFrameSets[i].frameSet());
869 item = findTextFrameSetItem(textFrameset);
870 if (item)
871 item->setText(0, textFrameset->name());
872 else {
873 if (after)
874 item = new KWDocStructTextFrameSetItem(
875 this, after, textFrameset->name(), textFrameset);
876 else
877 item = new KWDocStructTextFrameSetItem(this, textFrameset->name(), textFrameset);
878 }
879 after = item;
880 item->setupTextFrames();
881 }
882
883 if ( childCount() == 0 )
884 ( void )new TDEListViewItem( this, i18n( "Empty" ) );
885}
886
887void KWDocStructRootItem::setupFormulaFrames()
888{
889 deleteAllChildren();
890
891 KWFrameSet* frameset = 0L;
892 TQString _name;
893 KWDocStructFormulaItem* child;
894 KWDocument* dok = doc();
895
896 for ( int i = dok->frameSetCount() - 1; i >= 0; i-- )
897 {
898 frameset = dok->frameSet( i );
899 if ( frameset->type() == FT_FORMULA &&
900 frameset->frameCount()>0 )
901 {
902 _name=i18n("Formula Frame %1").arg(TQString::number(i+1));
903 child = new KWDocStructFormulaItem(this, _name, dynamic_cast<KWFormulaFrameSet*>( frameset ));
904 }
905 }
906
907 if ( childCount() == 0 )
908 ( void )new TDEListViewItem( this, i18n( "Empty" ) );
909}
910
911void KWDocStructRootItem::setupTables()
912{
913 // Delete Empty item from list.
914 TQListViewItem* lvItem = firstChild();
915 if (lvItem && (lvItem->text(0) == i18n("Empty"))) delete lvItem;
916
917 // Build a list of framesets ordered by their screen position (top left corner).
918 KWDocument* dok = doc();
919 TQValueList<KWOrderedFrameSet> orderedFrameSets;
920 for ( int i = dok->frameSetCount() - 1; i >= 0; i-- ) {
921 KWFrameSet* frameset = dok->frameSet(i);
922 if ( frameset->type() == FT_TABLE)
923 orderedFrameSets.append(KWOrderedFrameSet(frameset));
924 }
925 qHeapSort(orderedFrameSets);
926
927 // Build a list of table pointers from the sorted list.
928 TQPtrList<KWTableFrameSet> frameSetPtrs;
929 frameSetPtrs.setAutoDelete(false);
930 for ( uint i = 0; i < orderedFrameSets.count(); i++ )
931 frameSetPtrs.append(dynamic_cast<KWTableFrameSet *>(orderedFrameSets[i].frameSet()));
932
933 // Remove deleted tables from the listview.
934 KWDocStructTableItem* item = dynamic_cast<KWDocStructTableItem *>(firstChild());
935 KWDocStructTableItem* delItem;
936 while (item) {
937 delItem = item;
938 item = dynamic_cast<KWDocStructTableItem *>(item->nextSibling());
939 if (frameSetPtrs.containsRef(delItem->table()) == 0) delete delItem;
940 }
941
942 // Add new framesets to the list or update existing ones.
943 KWDocStructTableItem* after = 0L;
944 for ( uint i = 0; i < orderedFrameSets.count(); i++ )
945 {
946 KWTableFrameSet* tableFrameset = dynamic_cast<KWTableFrameSet *>(orderedFrameSets[i].frameSet());
947 item = findTableItem(tableFrameset);
948 if (item)
949 item->setText(0, tableFrameset->name());
950 else {
951 if (after)
952 item = new KWDocStructTableItem(
953 this, after, tableFrameset->name(), tableFrameset);
954 else
955 item = new KWDocStructTableItem(this, tableFrameset->name(), tableFrameset);
956 }
957 after = item;
958 item->setupCells();
959 }
960
961 if ( childCount() == 0 )
962 ( void )new TDEListViewItem( this, i18n( "Empty" ) );
963}
964
965void KWDocStructRootItem::setupPictures()
966{
967 deleteAllChildren();
968
969 KWFrameSet* frameset = 0L;
970 TQString _name;
971 KWDocStructPictureItem* child;
972 KWDocument* dok = doc();
973
974 int j = 0;
975 for ( int i = dok->frameSetCount() - 1; i >= 0; i-- )
976 {
977 frameset = dok->frameSet( i );
978 if ( frameset->type() == FT_PICTURE && frameset->frameCount()>0)
979 {
980 _name=i18n("Picture (%1) %2").arg(dynamic_cast<KWPictureFrameSet*>( frameset )->key().filename()).arg(++j);
981 child = new KWDocStructPictureItem(this, _name, dynamic_cast<KWPictureFrameSet*>( frameset ));
982 }
983 }
984
985 if ( childCount() == 0 )
986 ( void )new TDEListViewItem( this, i18n( "Empty" ) );
987}
988
989void KWDocStructRootItem::setupEmbedded()
990{
991 deleteAllChildren();
992
993 KWFrameSet* frameset = 0L;
994 TQString _name;
995 KWDocStructPartItem* child;
996 KWDocument* dok = doc();
997
998 for ( int i = dok->frameSetCount() - 1; i >= 0; i-- )
999 {
1000 frameset = dok->frameSet( i );
1001 if ( frameset->type() == FT_PART && frameset->frameCount()>0)
1002 {
1003 // Use the name of the frameset as the entry for the object.
1004 _name=frameset->name();
1005 child = new KWDocStructPartItem(this, _name, dynamic_cast<KWPartFrameSet*>( frameset ));
1006 }
1007 }
1008
1009 if ( childCount() == 0 )
1010 ( void )new TDEListViewItem( this, i18n( "Empty" ) );
1011}
1012
1013KWDocStructTextFrameSetItem* KWDocStructRootItem::findTextFrameSetItem(const KWFrameSet* frameset)
1014{
1015 if ( childCount() > 0 )
1016 {
1017 TQListViewItem *child = firstChild();
1018 while( child )
1019 {
1020 if (dynamic_cast<KWDocStructTextFrameSetItem *>(child)->frameSet() == frameset)
1021 return dynamic_cast<KWDocStructTextFrameSetItem *>(child);
1022 child = child->nextSibling();
1023 }
1024 }
1025 return 0;
1026}
1027
1028KWDocStructTableItem* KWDocStructRootItem::findTableItem(const KWFrameSet* frameset)
1029{
1030 if ( childCount() > 0 )
1031 {
1032 TQListViewItem *child = firstChild();
1033 while( child )
1034 {
1035 if (dynamic_cast<KWDocStructTableItem *>(child)->table() == frameset)
1036 return dynamic_cast<KWDocStructTableItem *>(child);
1037 child = child->nextSibling();
1038 }
1039 }
1040 return 0;
1041}
1042
1043
1044
1045/******************************************************************/
1046/* Class: KWDocStructTree */
1047/******************************************************************/
1048
1049KWDocStructTree::KWDocStructTree(TQWidget* parent, KWDocument* doc, KWGUI* gui)
1050 : TDEListView(parent), m_doc(doc), m_gui(gui)
1051{
1052 embedded = new KWDocStructRootItem( this, i18n( "Embedded Objects" ), Embedded);
1053 formulafrms = new KWDocStructRootItem( this, i18n( "Formula Frames" ), FormulaFrames);
1054 tables = new KWDocStructRootItem( this, i18n( "Tables" ), Tables);
1055 pictures = new KWDocStructRootItem( this, i18n( "Pictures" ), Pictures);
1056 textfrms = new KWDocStructRootItem( this, i18n( "Text Frames/Frame Sets" ), TextFrames);
1057 // arrangement = new KWDocStructRootItem( this, i18n( "Arrangement" ), Arrangement);
1058
1059 addColumn( i18n( "Document Structure" ) );
1060 setFullWidth( true );
1061
1062 connect( this, TQ_SIGNAL( doubleClicked(TQListViewItem*) ),
1063 this, TQ_SLOT( slotDoubleClicked(TQListViewItem*)) );
1064 connect( this, TQ_SIGNAL( returnPressed(TQListViewItem*) ),
1065 this, TQ_SLOT( slotReturnPressed(TQListViewItem* )) );
1066 connect( this, TQ_SIGNAL(rightButtonClicked(TQListViewItem*, const TQPoint&,int)),
1067 this, TQ_SLOT( slotRightButtonClicked(TQListViewItem *, const TQPoint&, int)));
1068 connect( this, TQ_SIGNAL(contextMenu(TDEListView*, TQListViewItem*, const TQPoint&)),
1069 this, TQ_SLOT(slotContextMenu(TDEListView*, TQListViewItem*, const TQPoint&)) );
1070}
1071
1072KWDocStructTree::~KWDocStructTree()
1073{
1074 delete embedded;
1075 delete formulafrms;
1076 delete tables;
1077 delete pictures;
1078 delete textfrms;
1079 // delete arrangement;
1080}
1081
1082void KWDocStructTree::setup()
1083{
1084 setRootIsDecorated( true );
1085 setSorting( -1 );
1086 refreshTree((int)(TextFrames | FormulaFrames | Tables | Pictures | Embedded));
1087}
1088
1089void KWDocStructTree::refreshTree(int type)
1090{
1091 // TODO: Saving current position by listview item text doesn't work if an item is renamed.
1092 TQString curItemText;
1093 if (currentItem()) curItemText = currentItem()->text(0);
1094 // if(((int)Arrangement) & type)
1095 // arrangement->setupArrangement();
1096 if(((int)TextFrames) & type)
1097 textfrms->setupTextFrameSets();
1098 if(((int)FormulaFrames) & type)
1099 formulafrms->setupFormulaFrames();
1100 if(((int)Tables) & type)
1101 tables->setupTables();
1102 if(((int)Pictures) & type)
1103 pictures->setupPictures();
1104 if(((int)Embedded) & type)
1105 embedded->setupEmbedded();
1106 if (!curItemText.isEmpty()) {
1107 TQListViewItem* item = findItem(curItemText, 0);
1108 if (item) setCurrentItem(item);
1109 }
1110}
1111
1112void KWDocStructTree::selectItem()
1113{
1114 TQListViewItem* select = currentItem ();
1115 KWDocListViewItem* tmp = dynamic_cast<KWDocListViewItem *>(select);
1116 if ( tmp )
1117 tmp->selectItem();
1118}
1119
1120void KWDocStructTree::editItem()
1121{
1122 TQListViewItem* select = currentItem();
1123 KWDocListViewItem* tmp = dynamic_cast<KWDocListViewItem *>(select);
1124 if ( tmp )
1125 tmp->editItem();
1126}
1127
1128
1129void KWDocStructTree::deleteItem()
1130{
1131 TQListViewItem* select = currentItem();
1132 KWDocListViewItem *tmp = dynamic_cast<KWDocListViewItem *>(select);
1133 if ( tmp )
1134 tmp->deleteItem();
1135}
1136
1137void KWDocStructTree::editProperties()
1138{
1139 TQListViewItem* select = currentItem();
1140 KWDocListViewItem* tmp = dynamic_cast<KWDocListViewItem *>(select);
1141 if ( tmp )
1142 tmp->editProperties();
1143}
1144
1145void KWDocStructTree::speakItem()
1146{
1147 TQListViewItem* select = currentItem();
1148 KWDocListViewItem* tmp = dynamic_cast<KWDocListViewItem *>(select);
1149 if ( tmp )
1150 tmp->speakItem();
1151}
1152
1153void KWDocStructTree::slotContextMenu(TDEListView* lv, TQListViewItem* i, const TQPoint& p)
1154{
1155 if (lv != this)
1156 return;
1157 KWDocListViewItem *item = dynamic_cast<KWDocListViewItem *>(i);
1158 if (item)
1159 item->contextMenu(item, p, 0);
1160}
1161
1162void KWDocStructTree::slotRightButtonClicked(TQListViewItem* i, const TQPoint& p, int)
1163{
1164 KWDocListViewItem* item = dynamic_cast<KWDocListViewItem *>(i);
1165 if (item)
1166 item->contextMenu(item, p, 0);
1167}
1168
1169void KWDocStructTree::slotDoubleClicked(TQListViewItem* i)
1170{
1171 KWDocListViewItem* item = dynamic_cast<KWDocListViewItem *>(i);
1172 if (item)
1173 item->selectItem();
1174}
1175
1176void KWDocStructTree::slotReturnPressed(TQListViewItem* i)
1177{
1178 KWDocListViewItem* item = dynamic_cast<KWDocListViewItem *>(i);
1179 if (item) {
1180 item->editItem();
1181 //return focus to canvas.
1182 m_gui->canvasWidget()->setFocus();
1183 }
1184}
1185
1186
1187/******************************************************************/
1188/* Class: KWDocStruct */
1189/******************************************************************/
1190
1191KWDocStruct::KWDocStruct(TQWidget* parent, KWDocument* doc, KWGUI* gui)
1192 : TQWidget(parent), m_doc(doc), m_gui(gui)
1193{
1194 m_layout = new TQVBoxLayout( this );
1195
1196 TDEToolBar* searchBar = new TDEToolBar( this );
1197 searchBar->setFlat( true );
1198 searchBar->setMovingEnabled( false );
1199
1200 TDEToolBarButton* eraseButton = new TDEToolBarButton( "locationbar_erase", 0, searchBar );
1201 m_tree = new KWDocStructTree( this, doc, gui );
1202 m_tree->setAlternateBackground( TDEGlobalSettings::alternateBackgroundColor() );
1203 TDEListViewSearchLine* searchLine = new TDEListViewSearchLine( searchBar, m_tree );
1204 searchBar->setStretchableWidget( searchLine );
1205 connect( eraseButton, TQ_SIGNAL( clicked() ), searchLine, TQ_SLOT( clear() ) );
1206
1207 m_layout->addWidget(searchBar);
1208 m_layout->addWidget(m_tree);
1209 m_tree->setup();
1210 dirtyTreeTypes = 0;
1211}
1212
1213void KWDocStruct::paintEvent (TQPaintEvent* ev)
1214{
1215 if (dirtyTreeTypes) {
1216 m_tree->refreshTree(dirtyTreeTypes);
1217 dirtyTreeTypes = 0;
1218 }
1219 TQWidget::paintEvent(ev);
1220}
1221
1222void KWDocStruct::refreshTree(int type)
1223{
1224 if ((dirtyTreeTypes | type) != dirtyTreeTypes) {
1225 dirtyTreeTypes |= type;
1226 update();
1227 }
1228}
1229
1230void KWDocStruct::refreshEntireTree()
1231{
1232 refreshTree((int)(TextFrames | FormulaFrames | Tables | Pictures | Embedded));
1233}
1234
1235void KWDocStruct::setFocusHere()
1236{
1237 if (m_tree)
1238 if (m_tree->isVisible()) m_tree->setFocus();
1239}
1240
1241void KWDocStruct::selectItem()
1242{
1243 m_tree->selectItem();
1244}
1245
1246void KWDocStruct::editItem()
1247{
1248 m_tree->editItem();
1249}
1250
1251void KWDocStruct::deleteItem()
1252{
1253 m_tree->deleteItem();
1254}
1255
1256void KWDocStruct::editProperties()
1257{
1258 m_tree->editProperties();
1259}
1260
1261void KWDocStruct::speakItem()
1262{
1263 m_tree->speakItem();
1264}
Class: KWFrameSet Base type, a frameset holds content as well as frames to show that content.
Definition KWFrameSet.h:62
virtual FrameSetType type() const
The type of frameset.
Definition KWFrameSet.h:76
unsigned int frameCount() const
Get number of child frames.
Definition KWFrameSet.h:163
KWTableFrameSet * groupmanager() const
returns the groupManager this frameset belongs to.
Definition KWFrameSet.h:408
KWFrame * frame(unsigned int _num) const
get a frame by number
TQString name() const
get/set frameset name. For tables in particular, this must be unique
Definition KWFrameSet.h:428
Info frameSetInfo() const
Returns the type of TextFrameSet this is.
Definition KWFrameSet.h:95
This class represents a single frame.
Definition KWFrame.h:68
Provides a way to sort framesets using a TQValueList based on their top left corner.
Definition KWDocStruct.h:43
A frameset that contains an embedded object (a KWDocumentChild)
This class implements tables by acting as the manager for the frame(set)s which make up the table cel...
KWTextFrameSet * textFrameSet() const
Return the text frameset in which this document is.
Class: KWTextFrameSet Contains text (KoTextObject) and frames to display that text.
KWFrame * internalToDocument(const KoPoint &relPoint, KoPoint &dPoint) const
Convert the in the internal qtextdoc coordinates (in layout units) into a point in the document coord...
This class extends KoTextParag for KWord-specific formatting stuff, custom items, loading and saving.
Definition KWTextParag.h:41