Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef INCLUDED_WW8_DOCUMENT_IMPL_HXX
21 : #define INCLUDED_WW8_DOCUMENT_IMPL_HXX
22 :
23 : #include <set>
24 : #include <WW8PieceTable.hxx>
25 : #include <WW8BinTable.hxx>
26 : #include <doctok/resources.hxx>
27 : #include <resourcemodel/WW8ResourceModel.hxx>
28 : #include <PLCF.hxx>
29 : #include <WW8Sttbf.hxx>
30 : #include <XNoteHelper.hxx>
31 :
32 : namespace writerfilter {
33 : namespace doctok
34 : {
35 :
36 : class WW8DocumentImpl;
37 :
38 : /**
39 : A bookmark.
40 : */
41 : class Bookmark : public writerfilter::Reference<Properties>
42 : {
43 : /// bookmark first descriptor
44 : writerfilter::Reference<Properties>::Pointer_t mpBKF;
45 :
46 : /// name of bookmark
47 : OUString mName;
48 :
49 : public:
50 : Bookmark(writerfilter::Reference<Properties>::Pointer_t pBKF,
51 : OUString & rName);
52 :
53 0 : virtual ~Bookmark() {}
54 :
55 : /**
56 : Resolve bookmark to handler.
57 :
58 : @param rHandler handler to send events to
59 : */
60 : virtual void resolve(Properties & rHandler);
61 :
62 : virtual string getType() const;
63 : };
64 :
65 : /**
66 : A helper for bookmarks.
67 : */
68 0 : class BookmarkHelper
69 : {
70 : /// PLCF containing Cps and BKFs for the bookmarks
71 : PLCF<WW8BKF>::Pointer_t mpStartCps;
72 :
73 : /// Cps of the ends of bookmarks
74 : WW8StructBase::Pointer_t mpEndCps;
75 :
76 : /// STTBF containing the names of bookmarks
77 : WW8Sttbf::Pointer_t mpNames;
78 :
79 : /// piece table for converting CPs to FCs
80 : WW8PieceTable::Pointer_t mpPieceTable;
81 :
82 : /// document to insert CpAndFcs to
83 : WW8DocumentImpl * mpDoc;
84 :
85 : /**
86 : Return start CpAndFc for a bookmark.
87 :
88 : @param nPos index of the bookmark
89 : */
90 : CpAndFc getStartCpAndFc(sal_uInt32 nPos);
91 :
92 : /**
93 : Return end CpAndFc for a bookmark.
94 :
95 : @param nPos index of the bookmark
96 : */
97 : CpAndFc getEndCpAndFc(sal_uInt32 nPos);
98 :
99 : /**
100 : Return the name of a bookmark.
101 :
102 : @param nPos index of the bookmark
103 : */
104 : OUString getName(sal_uInt32 nPos);
105 :
106 : /**
107 : Return index of a bookmark.
108 :
109 : @param rCpAndFc CpAndFc of the bookmark
110 : */
111 : sal_uInt32 getIndex(const CpAndFc & rCpAndFc);
112 :
113 : public:
114 : typedef boost::shared_ptr<BookmarkHelper> Pointer_t;
115 :
116 0 : BookmarkHelper(PLCF<WW8BKF>::Pointer_t pStartCps,
117 : WW8StructBase::Pointer_t pEndCps,
118 : WW8Sttbf::Pointer_t pNames,
119 : WW8PieceTable::Pointer_t pPieceTable,
120 : WW8DocumentImpl * pDoc)
121 : : mpStartCps(pStartCps), mpEndCps(pEndCps), mpNames(pNames),
122 0 : mpPieceTable(pPieceTable), mpDoc(pDoc)
123 : {
124 0 : }
125 :
126 : /**
127 : Initialize.
128 :
129 : Inserts CpAndFcs for the bookmark starts and ends into the
130 : document.
131 : */
132 : void init();
133 :
134 : /**
135 : Return BKF of a bookmark.
136 :
137 : @param rCpAndFc CpAndFc of the bookmark
138 : */
139 : writerfilter::Reference<Properties>::Pointer_t getBKF
140 : (const CpAndFc & rCpAndFc);
141 :
142 : /**
143 : Return the name of a bookmark.
144 :
145 : @param rCpAndFc CpAndFc of the bookmark
146 : */
147 : OUString getName(const CpAndFc & rCp);
148 :
149 : /**
150 : Return bookmark.
151 : @param rCpAndFc CpAndFc of the bookmark
152 : */
153 : writerfilter::Reference<Properties>::Pointer_t
154 : getBookmark(const CpAndFc & rCpAndFc);
155 : };
156 :
157 : /**
158 : Helper for shapes.
159 : */
160 0 : class ShapeHelper
161 : {
162 : public:
163 : typedef boost::unordered_map<CpAndFc, WW8FSPA::Pointer_t, CpAndFcHash> Map_t;
164 :
165 : private:
166 : WW8DocumentImpl * mpDoc;
167 : Map_t mMap;
168 :
169 : public:
170 : typedef boost::shared_ptr<ShapeHelper> Pointer_t;
171 : ShapeHelper(PLCF<WW8FSPA>::Pointer_t pPlcspaMom,
172 : PLCF<WW8FSPA>::Pointer_t pPlcspaHdr,
173 : WW8DocumentImpl * pDoc);
174 :
175 : void init();
176 :
177 : writerfilter::Reference<Properties>::Pointer_t
178 : getShape(const CpAndFc & rCpAndFc);
179 :
180 : };
181 :
182 : /**
183 : Helper for fields.
184 : */
185 0 : class FieldHelper
186 : {
187 : public:
188 : typedef boost::unordered_map<CpAndFc, WW8FLD::Pointer_t,
189 : CpAndFcHash> Map_t;
190 :
191 : private:
192 : WW8DocumentImpl * mpDoc;
193 : Map_t mMap;
194 : public:
195 :
196 : typedef boost::shared_ptr<FieldHelper> Pointer_t;
197 : FieldHelper(PLCF<WW8FLD>::Pointer_t pPlcffldMom,
198 : WW8DocumentImpl * pDoc);
199 :
200 : void init();
201 :
202 : writerfilter::Reference<Properties>::Pointer_t
203 : getField(const CpAndFc & rCpAndFc);
204 :
205 : WW8FLD::Pointer_t getWW8FLD(const CpAndFc & rCpAndFc);
206 : };
207 :
208 : /**
209 : Helper for Breaks.
210 : */
211 0 : class BreakHelper
212 : {
213 : public:
214 : typedef boost::unordered_map<CpAndFc, WW8BKD::Pointer_t,
215 : CpAndFcHash> Map_t;
216 : private:
217 : WW8DocumentImpl * mpDoc;
218 : Map_t mMap;
219 : public:
220 : typedef boost::shared_ptr<BreakHelper> Pointer_t;
221 : BreakHelper(PLCF<WW8BKD>::Pointer_t pPlcfbkdMom,
222 : WW8DocumentImpl * pDoc);
223 :
224 : void init();
225 :
226 : writerfilter::Reference<Properties>::Pointer_t
227 : getBreak(const CpAndFc & rCpAndFc);
228 : };
229 :
230 : /**
231 : Implementation class for document.
232 : */
233 0 : class WW8DocumentImpl : public WW8Document
234 : {
235 : /// true if the document is contained in another document
236 : bool bSubDocument;
237 :
238 : /// picture location
239 : sal_uInt32 mfcPicLoc;
240 :
241 : /// true if FFDATA structure is found at offset mfcPicLoc in data stream
242 : bool mbPicIsData;
243 :
244 : /// current field descriptor
245 : WW8FLD::Pointer_t mpFLD;
246 :
247 : /// CpAndFcs in the document where properties change
248 : CpAndFcs mCpAndFcs;
249 :
250 : /// CpAndFc pointing to the start of the document
251 : CpAndFc mCpAndFcStart;
252 :
253 : /// CpAndFc pointing to the end of the document
254 : CpAndFc mCpAndFcEnd;
255 :
256 : /// pointer to the cache of FKPs containing character properties
257 : WW8FKPCache::Pointer_t mpCHPFKPCache;
258 :
259 : /// pointer to the cache of FPKs containing paragraph properties
260 : WW8FKPCache::Pointer_t mpPAPFKPCache;
261 :
262 : /// pointer to the stream containing the whole document
263 : WW8Stream::Pointer_t mpStream;
264 :
265 : /// pointer to the substream of the document containing table like
266 : /// structures
267 : WW8Stream::Pointer_t mpTableStream;
268 :
269 : /// pointer to the substream of the document containing the
270 : /// document contents and formatting information
271 : WW8Stream::Pointer_t mpDocStream;
272 :
273 : /// pointer to the data stream of the document
274 : WW8Stream::Pointer_t mpDataStream;
275 :
276 : /// pointer to the compound object stream of the document
277 : WW8Stream::Pointer_t mpCompObjStream;
278 :
279 : /// pointer to the summayry information stream of the document
280 : WW8Stream::Pointer_t mpSummaryInformationStream;
281 :
282 : /// pointer to the piece table
283 : WW8PieceTable::Pointer_t mpPieceTable;
284 :
285 : /// pointer to the bin table for paragraph properties
286 : WW8BinTable::Pointer_t mpBinTablePAPX;
287 :
288 : /// pointer to the bin table for character properties
289 : WW8BinTable::Pointer_t mpBinTableCHPX;
290 :
291 : /// PLCF containing the section descriptions
292 : PLCF<WW8SED>::Pointer_t mpSEDs;
293 :
294 : /// pointer to the file information block
295 : WW8Fib::Pointer_t mpFib;
296 :
297 : /// pointer to the file information block for post 2000 documents
298 : WW8FibRgFcLcb2000::Pointer_t mpFibRgFcLcb2000;
299 :
300 : /// pointer to the offsets of headers/footers
301 : WW8StructBase::Pointer_t mpHeaderOffsets;
302 :
303 : /// pointer to the helper for footnotes
304 : XNoteHelper<WW8FRD>::Pointer_t mpFootnoteHelper;
305 :
306 : /// pointer to the helper for endnotes
307 : XNoteHelper<WW8FRD>::Pointer_t mpEndnoteHelper;
308 :
309 : /// pointer to the helper for annotations
310 : XNoteHelper<WW8ATRD>::Pointer_t mpAnnotationHelper;
311 :
312 : /// pointer to the helper for bookmarks
313 : BookmarkHelper::Pointer_t mpBookmarkHelper;
314 :
315 : /// pointer to the helper for fields
316 : FieldHelper::Pointer_t mpFieldHelper;
317 :
318 : /// pointer to the helper for shapes
319 : ShapeHelper::Pointer_t mpShapeHelper;
320 :
321 : /// pointer to the helper for breaks
322 : BreakHelper::Pointer_t mpBreakHelper;
323 :
324 :
325 : /// cache for the Cp where main text flow end
326 : CpAndFc mDocumentEndCpAndFc;
327 :
328 : /// cache for the Cp where footnotes section ends
329 : CpAndFc mFootnoteEndCpAndFc;
330 :
331 : /// cache for the Cp where header section ends
332 : CpAndFc mHeaderEndCpAndFc;
333 :
334 : /// cache for the Cp where annotation section ends
335 : CpAndFc mAnnotationEndCpAndFc;
336 :
337 : /// cache for the Cp where endnote section ends
338 : CpAndFc mEndnoteEndCpAndFc;
339 :
340 : /// cache for the Cp where textbox section ends
341 : CpAndFc mTextboxEndCpAndFc;
342 :
343 : /// cache for the Cp where textbox in header section ends
344 : CpAndFc mTextboxHeaderEndCpAndFc;
345 :
346 : /// DffBlock of document
347 : DffBlock::Pointer_t mpDffBlock;
348 :
349 : /// Textbox stories
350 : PLCF<WW8FTXBXS>::Pointer_t mpTextBoxStories;
351 :
352 : bool mbInSection;
353 : bool mbInParagraphGroup;
354 : bool mbInCharacterGroup;
355 :
356 : bool isSpecial(sal_uInt32 nChar);
357 :
358 : WW8Stream::Pointer_t getSubStream(const OUString & sId) const;
359 :
360 : /**
361 : Parse bin table and create CpAndFcs for all points in the
362 : document where properties of the given type change.
363 :
364 : @param rTable bin table to parse
365 : @param eType_ type of CpAndFcs to create
366 : */
367 : void parseBinTableCpAndFcs(WW8BinTable & rTable, PropertyType eType_);
368 :
369 : void startCharacterGroup(Stream & rStream);
370 : void endCharacterGroup(Stream & rStream);
371 : void startParagraphGroup(Stream & rStream);
372 : void endParagraphGroup(Stream & rStream);
373 : void startSectionGroup(Stream & rStream);
374 : void endSectionGroup(Stream & rStream);
375 : void text(Stream & rStream, const sal_uInt8 * data, size_t len);
376 : void utext(Stream & rStream, const sal_uInt8 * data, size_t len);
377 :
378 : public:
379 : WW8DocumentImpl(WW8Stream::Pointer_t rpStream);
380 : WW8DocumentImpl(const WW8DocumentImpl & rSrc,
381 : const CpAndFc & rStart, const CpAndFc & rEnd);
382 : virtual ~WW8DocumentImpl();
383 :
384 : virtual WW8DocumentImpl & Assign(const WW8DocumentImpl & rSrc);
385 :
386 : virtual string getType() const;
387 :
388 : virtual WW8Document::Pointer_t getSubDocument(SubDocumentId nId);
389 : virtual WW8DocumentIterator::Pointer_t getIterator
390 : (const CpAndFc & rCpAndFc);
391 : virtual WW8DocumentIterator::Pointer_t begin();
392 : virtual WW8DocumentIterator::Pointer_t end();
393 :
394 : virtual WW8Stream::Sequence getText(const CpAndFc & rStart);
395 :
396 : /**
397 : Returns the document stream.
398 : */
399 :
400 : WW8Stream::Pointer_t getDocStream() const;
401 :
402 : /**
403 : Returns the data stream.
404 : */
405 : WW8Stream::Pointer_t getDataStream() const;
406 :
407 : /**
408 : Returns distance in bytes to next CpAndFc.
409 :
410 : @param rCpAndFc CpAndFc to start at
411 : */
412 : sal_uInt32 getByteLength(const CpAndFc & rCpAndFc) const;
413 :
414 : /**
415 : Returns first character position in document.
416 : */
417 : const CpAndFc & getFirstCp() const;
418 :
419 : /**
420 : Returns last character position in document.
421 : */
422 : const CpAndFc & getLastCp() const;
423 :
424 : /**
425 : Returns next character position with change in properties.
426 :
427 : @param rCpAndFc position to start at
428 : */
429 : CpAndFc getNextCp(const CpAndFc & rCpAndFc) const;
430 :
431 : /**
432 : Returns previous character position with change in properties.
433 :
434 : @param rCpAndFc position to start at
435 : */
436 : CpAndFc getPrevCp(const CpAndFc & rCpAndFc) const;
437 :
438 : /**
439 : Returns character position where main text flow ends.
440 : */
441 : CpAndFc getDocumentEndCp() const;
442 :
443 : /**
444 : Returns character position where footnotes end.
445 : */
446 : CpAndFc getFootnodeEndCp() const;
447 :
448 : /**
449 : Returns character position where headers end.
450 : */
451 : CpAndFc getHeaderEndCp() const;
452 :
453 : /**
454 : Returns character position where annatations end.
455 : */
456 : CpAndFc getAnnotationEndCp() const;
457 :
458 : /**
459 : Returns character position where endnotes end.
460 : */
461 : CpAndFc getEndnoteEndCp() const;
462 :
463 : /**
464 : Returns character position where textboxes end.
465 : */
466 : CpAndFc getTextboxEndCp() const;
467 :
468 : /**
469 : Returns character positoion where textboxes in headers end.
470 : */
471 : CpAndFc getTextboxHeaderEndCp() const;
472 :
473 : /**
474 : Insert CpAndFc to set of CpAndFcs.
475 :
476 : @param rCpAndFc CpAndFc to insert
477 : */
478 : void insertCpAndFc(const CpAndFc & rCpAndFc);
479 :
480 : /**
481 : Return FKP for certain CpAndFc.
482 :
483 : @param rCpAndFc CpAndFc for which the FKP is looked for
484 : */
485 : WW8FKP::Pointer_t getFKP(const CpAndFc & rCpAndFc);
486 :
487 : /**
488 : Return FKP containing character properties.
489 :
490 : @param nIndex index of FKP to return
491 : @param bComplex true if FKP contains complex FCs
492 : */
493 : WW8FKP::Pointer_t getFKPCHPX(sal_uInt32 nIndex, bool bComplex);
494 :
495 : /**
496 : Return FKP containing paragraph properties.
497 :
498 : @param nIndex index of FKP to return
499 : @param bComplex true if FKP contains complex FCs
500 : */
501 : WW8FKP::Pointer_t getFKPPAPX(sal_uInt32 nIndex, bool bComplex);
502 :
503 : /**
504 : Return property set valid at a certain CpAndFc.
505 :
506 : @param rCpAndFc CpAndFc to look at
507 : */
508 : writerfilter::Reference<Properties>::Pointer_t
509 : getProperties(const CpAndFc & rCpAndFc);
510 :
511 : /**
512 : Return subdocument referenced at a certain point in document.
513 :
514 : @param rCpAndFc CpAndFc where subdocument is referenced
515 : */
516 : writerfilter::Reference<Stream>::Pointer_t
517 : getSubDocument(const CpAndFc & rCpAndFc);
518 :
519 : /**
520 : Return section description at a certain CpAndFc.
521 :
522 : @param rCpAndFc CpAndFc to look at
523 : */
524 : WW8SED * getSED(const CpAndFc & rCpAndFc) const;
525 :
526 : /**
527 : Return reference to list plcs.
528 : */
529 : writerfilter::Reference<Table>::Pointer_t getListTplcs() const;
530 :
531 : /**
532 : Return reference to list table.
533 : */
534 : writerfilter::Reference<Table>::Pointer_t getListTable() const;
535 :
536 : /**
537 : Return reference to table of list level overrides.
538 : */
539 : writerfilter::Reference<Table>::Pointer_t getLFOTable() const;
540 :
541 : /**
542 : Return reference to font table.
543 : */
544 : writerfilter::Reference<Table>::Pointer_t getFontTable() const;
545 :
546 : /**
547 : Return reference to style sheet.
548 : */
549 : writerfilter::Reference<Table>::Pointer_t getStyleSheet() const;
550 :
551 : /**
552 : Return reference to associated data.
553 : */
554 : writerfilter::Reference<Table>::Pointer_t getAssocTable() const;
555 :
556 : /**
557 : Return count of headers/footers.
558 : */
559 : sal_uInt32 getHeaderCount() const;
560 :
561 : /**
562 : Return CpAndFc for a header or footer.
563 :
564 : @param nPos index in the list of headers and footers
565 : */
566 : CpAndFc getHeaderCpAndFc(sal_uInt32 nPos);
567 :
568 : /**
569 : Return subdocument for header/footer.
570 :
571 : @param nPos index in the list of headers and footers
572 : */
573 : writerfilter::Reference<Stream>::Pointer_t getHeader(sal_uInt32 nPos);
574 :
575 : /**
576 : Return count of footnotes.
577 : */
578 : sal_uInt32 getFootnoteCount() const;
579 :
580 : /**
581 : Return subdocument for footnote.
582 :
583 : @param nPos index of the footnote
584 : */
585 : writerfilter::Reference<Stream>::Pointer_t getFootnote(sal_uInt32 nPos);
586 :
587 : /**
588 : Return subdocument for footnote at a certain position in document.
589 :
590 : @param rCpAndFc position in document
591 : */
592 : writerfilter::Reference<Stream>::Pointer_t getFootnote
593 : (const CpAndFc & rCpAndFc);
594 :
595 : /**
596 : Return count of endnotes.
597 : */
598 : sal_uInt32 getEndnoteCount() const;
599 :
600 : /**
601 : Return subdocument for an endnote.
602 :
603 : @param nPos index of the endnote
604 : */
605 : writerfilter::Reference<Stream>::Pointer_t getEndnote(sal_uInt32 nPos);
606 :
607 : /**
608 : Return subdocument for an endnote.
609 :
610 : @param rCpAndFc CpAndFc where endnote is referenced
611 : */
612 : writerfilter::Reference<Stream>::Pointer_t getEndnote
613 : (const CpAndFc & rCpAndFc);
614 :
615 : /**
616 : Return count of annotations.
617 : */
618 : sal_uInt32 getAnnotationCount() const;
619 :
620 : /**
621 : Return subdocument for an annotation.
622 :
623 : @param nPos index of the annotation
624 : */
625 : writerfilter::Reference<Stream>::Pointer_t getAnnotation(sal_uInt32 nPos);
626 :
627 : /**
628 : Return subdocument for an annotation.
629 :
630 : @param rCpAndFc CpAndFc where annotation is referenced
631 : */
632 : writerfilter::Reference<Stream>::Pointer_t getAnnotation
633 : (const CpAndFc & rCpAndFc);
634 :
635 : /**
636 : Return bookmark.
637 :
638 : @param rCpAndFc CpAndFc where bookmark begins or ends
639 : */
640 : writerfilter::Reference<Properties>::Pointer_t
641 : getBookmark(const CpAndFc & rCpAndFc) const;
642 :
643 : /**
644 : Return shape.
645 :
646 : @param rCpAndFc CpAndFc of the shape
647 : */
648 : writerfilter::Reference<Properties>::Pointer_t
649 : getShape(const CpAndFc & rCpAndFc) const;
650 :
651 : writerfilter::Reference<Properties>::Pointer_t
652 : getShape(sal_uInt32 nSpid);
653 :
654 : /**
655 : Return blip.
656 :
657 : @param nBlib number of the blip to return
658 : */
659 : writerfilter::Reference<Properties>::Pointer_t
660 : getBlip(sal_uInt32 nBlib);
661 :
662 : /**
663 : Return break descriptor.
664 :
665 : @param rCpAndFc CpAndFc of the break
666 : */
667 : writerfilter::Reference<Properties>::Pointer_t
668 : getBreak(const CpAndFc & rCpAndFc) const;
669 :
670 :
671 : /**
672 : Return field.
673 :
674 : @param rCpAndFc CpAndFc of the field
675 : */
676 : writerfilter::Reference<Properties>::Pointer_t
677 : getField(const CpAndFc & rCpAndFc) const;
678 :
679 : /**
680 : Return document properties.
681 :
682 : */
683 : writerfilter::Reference<Properties>::Pointer_t
684 : getDocumentProperties() const;
685 :
686 : /**
687 : Return current field descriptor.
688 : */
689 : WW8FLD::Pointer_t getCurrentFLD() const;
690 :
691 : /**
692 : Return stream of text box.
693 :
694 : @param nShpId shape id of text box
695 : */
696 : writerfilter::Reference<Stream>::Pointer_t
697 : getTextboxText(sal_uInt32 nShpId) const;
698 :
699 : /**
700 : Return file character position according to a character
701 : position.
702 :
703 : @param cp the character position
704 : */
705 : Fc cp2fc(const Cp & cp) const;
706 :
707 : /**
708 : Return CpAndFc related to character position.
709 :
710 : @param cp the character position
711 : */
712 : CpAndFc getCpAndFc(const Cp & cp, PropertyType type = PROP_DOC) const;
713 :
714 : /**
715 : Return CpAndFc related to file character position.
716 :
717 : @param fc the file character position
718 : */
719 : CpAndFc getCpAndFc(const Fc & fc, PropertyType type = PROP_DOC) const;
720 :
721 : sal_uInt32 getPicLocation() const;
722 : void setPicLocation(sal_uInt32 fcPicLoc);
723 :
724 : bool isPicData();
725 : void setPicIsData(bool bPicIsData);
726 :
727 : /**
728 : Create events for the document.
729 :
730 : @param rHandler handler to send the events to
731 : */
732 : void resolve(Stream & rHandler);
733 :
734 : /**
735 : Resolve text.
736 :
737 : The text of the given iterator is split at special
738 : characters. Each run of non-special characters is send as one
739 : event. Each run of special characters is send as one event.
740 :
741 : @param pIt iterator whose text is to be resolved
742 : @param rStream handler for the events
743 : */
744 : void resolveText(WW8DocumentIterator::Pointer_t pIt, Stream & rStream);
745 :
746 : /**
747 : Resolve the picture at mfcPicLoc.
748 :
749 : @param rStream
750 : */
751 : void resolvePicture(Stream & rStream);
752 :
753 : /**
754 : Resolve special char.
755 :
756 : @param nChar the special char
757 : @param rStream the stream handler to resolve the special char to
758 : */
759 : void resolveSpecialChar(sal_uInt32 nChar, Stream & rStream);
760 : };
761 :
762 : /**
763 : Implentation class for an iterator in a document.
764 : */
765 : class WW8DocumentIteratorImpl : public WW8DocumentIterator
766 : {
767 : /// pointer to the document
768 : WW8DocumentImpl * mpDocument;
769 :
770 : /// CpAndFc the iterator is pointing to
771 : CpAndFc mCpAndFc;
772 :
773 : public:
774 0 : WW8DocumentIteratorImpl(WW8DocumentImpl * pDocument,
775 : const CpAndFc & rCpAndFc)
776 0 : : mpDocument(pDocument), mCpAndFc(rCpAndFc)
777 : {
778 0 : }
779 :
780 : virtual ~WW8DocumentIteratorImpl();
781 :
782 : /**
783 : Increase the iterator to the next character position.
784 : */
785 : WW8DocumentIterator & operator++();
786 :
787 : /**
788 : Decrease the iterator to the previous character position.
789 : */
790 : WW8DocumentIterator & operator--();
791 :
792 : virtual writerfilter::Reference<Properties>::Pointer_t getProperties()
793 : const;
794 : //void setAttributes(const IAttributeSet & aAttributeSet);
795 :
796 : virtual writerfilter::Reference<Stream>::Pointer_t getSubDocument() const;
797 :
798 : /** Return if the text the iterator points to is complex.
799 :
800 : @attention The definition of a complex run of text in Word is
801 : counter-intuitive: Complex runs use 8-bit encoding for characters,
802 : non-complex ones use 16 bits.
803 : */
804 : bool isComplex() const;
805 : virtual PropertyType getPropertyType() const;
806 :
807 : virtual WW8Stream::Sequence getText();
808 : virtual bool equal(const WW8DocumentIterator & rIt) const;
809 :
810 : virtual string toString() const;
811 : virtual void dump(ostream & o) const;
812 :
813 : /**
814 : Return pointer to the shape at character position the iterator
815 : is pointing to.
816 : */
817 : virtual writerfilter::Reference<Properties>::Pointer_t getShape() const;
818 :
819 : /**
820 : Return pointer to section description at character position the
821 : iterator points to.
822 : */
823 : WW8SED * getSED() const;
824 : };
825 :
826 : /**
827 : Return string for property type.
828 : */
829 : string propertyTypeToString(PropertyType nType);
830 :
831 : }}
832 : #endif // INCLUDED_WW8_DOCUMENT_IMPL_HXX
833 :
834 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|