1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef INCLUDED_TABLE_MANAGER_HXX
25 #define INCLUDED_TABLE_MANAGER_HXX
26 
27 #include <resourcemodel/TableData.hxx>
28 #include <resourcemodel/WW8ResourceModel.hxx>
29 #include <doctok/sprmids.hxx>
30 
31 #include <boost/shared_ptr.hpp>
32 #include <stack>
33 #include "util.hxx"
34 #include "TagLogger.hxx"
35 
36 namespace writerfilter
37 {
38 
39 using namespace ::std;
40 
41 template <typename T, typename PropertiesPointer>
42 /**
43    Class to handle events generated by TableManager::resolveCurrentTable
44  */
45 class WRITERFILTER_DLLPUBLIC TableDataHandler
46 {
47 public:
48     typedef boost::shared_ptr<TableDataHandler> Pointer_t;
49 
50     /**
51        Handle start of table.
52 
53        @param nRows   number of rows in the table
54        @param nDepth  depth of the table in surrounding table hierarchy
55        @param pProps  properties of the table
56      */
57     virtual void startTable(
58         unsigned int nRows,
59         unsigned int nDepth,
60         PropertiesPointer pProps ) = 0;
61 
62     /**
63        Handle end of table.
64      */
65     virtual void endTable(
66         const unsigned int nDepth ) = 0;
67 
68     /**
69        Handle start of row.
70 
71        @param nCols    number of columns in the table
72        @param pProps   properties of the row
73      */
74     virtual void startRow(
75         unsigned int nCols,
76         PropertiesPointer pProps ) = 0;
77 
78     /**
79        Handle end of row.
80     */
81     virtual void endRow() = 0;
82 
83     /**
84        Handle start of cell.
85 
86        @param rT     start handle of the cell
87        @param pProps properties of the cell
88     */
89     virtual void startCell(
90         const T & rT,
91         PropertiesPointer pProps ) = 0;
92 
93     /**
94         Handle end of cell.
95 
96         @param rT    end handle of cell
97     */
98     virtual void endCell(
99         const T & rT ) = 0;
100 };
101 
102 template <typename T, typename PropertiesPointer>
103 /**
104    The table manager.
105 
106    This class gets forwarded events from the tokenizer. It gathers the
107    table data and after ending the table generates events for the
108    table structure. The events have to be handles by a TableDataHandler.
109 
110  */
111 class TableManager
112 {
113 #ifdef DEBUG_TABLE
114     TagLogger::Pointer_t mpTableLogger;
115 #endif
116 
117     class TableManagerState
118     {
119         /**
120          properties at the current point in document
121          */
122         PropertiesPointer mpProps;
123 
124         /**
125          properties of the current cell
126          */
127         PropertiesPointer mpCellProps;
128 
129         /**
130          properties of the current row
131          */
132         PropertiesPointer mpRowProps;
133 
134         /**
135          properties of the current table
136          */
137         stack<PropertiesPointer> mTableProps;
138 
139         /**
140          true if at the end of a row
141          */
142         bool mbRowEnd;
143 
144         /**
145          true when in a cell
146          */
147         bool mbInCell;
148 
149         /**
150          true when at the end of a cell
151          */
152         bool mbCellEnd;
153 
154     public:
155 		/**
156 		 Constructor
157 		 */
TableManagerState()158 		TableManagerState()
159 		: mbRowEnd(false), mbInCell(false), mbCellEnd(false)
160 		{
161 		}
162 
~TableManagerState()163         virtual ~TableManagerState()
164         {
165         }
166 
startLevel()167         void startLevel()
168         {
169             PropertiesPointer pProps;
170             mTableProps.push(pProps);
171         }
172 
endLevel()173         void endLevel()
174         {
175             mTableProps.pop();
176         }
177 
178         /**
179          Reset to initial state at beginning of row.
180          */
resetCellSpecifics()181         void resetCellSpecifics()
182         {
183             mbRowEnd = false;
184             mbInCell = false;
185             mbCellEnd = false;
186         }
187 
resetProps()188         void resetProps()
189         {
190             mpProps.reset();
191         }
192 
setProps(PropertiesPointer pProps)193         void setProps(PropertiesPointer pProps)
194         {
195             mpProps = pProps;
196         }
197 
getProps()198         PropertiesPointer getProps()
199         {
200             return mpProps;
201         }
202 
resetCellProps()203         void resetCellProps()
204         {
205             mpCellProps.reset();
206         }
207 
setCellProps(PropertiesPointer pProps)208         void setCellProps(PropertiesPointer pProps)
209         {
210             mpCellProps = pProps;
211         }
212 
getCellProps()213         PropertiesPointer getCellProps()
214         {
215             return mpCellProps;
216         }
217 
resetRowProps()218         void resetRowProps()
219         {
220             mpRowProps.reset();
221         }
222 
setRowProps(PropertiesPointer pProps)223         void setRowProps(PropertiesPointer pProps)
224         {
225             mpRowProps = pProps;
226         }
227 
getRowProps()228         PropertiesPointer getRowProps()
229         {
230             return mpRowProps;
231         }
232 
resetTableProps()233         void resetTableProps()
234         {
235             if (mTableProps.size() > 0)
236                 mTableProps.top().reset();
237         }
238 
setTableProps(PropertiesPointer pProps)239         void setTableProps(PropertiesPointer pProps)
240         {
241             if (mTableProps.size() > 0)
242                 mTableProps.top() = pProps;
243         }
244 
getTableProps()245         PropertiesPointer getTableProps()
246         {
247             PropertiesPointer pResult;
248 
249             if (mTableProps.size() > 0)
250                 pResult = mTableProps.top();
251 
252             return pResult;
253         }
254 
setInCell(bool bInCell)255         void setInCell(bool bInCell)
256         {
257             mbInCell = bInCell;
258         }
259 
isInCell() const260         bool isInCell() const
261         {
262             return mbInCell;
263         }
264 
setCellEnd(bool bCellEnd)265         void setCellEnd(bool bCellEnd)
266         {
267             mbCellEnd = bCellEnd;
268         }
269 
isCellEnd() const270         bool isCellEnd() const
271         {
272             return mbCellEnd;
273         }
274 
setRowEnd(bool bRowEnd)275         void setRowEnd(bool bRowEnd)
276         {
277             mbRowEnd = bRowEnd;
278         }
279 
isRowEnd() const280         bool isRowEnd() const
281         {
282             return mbRowEnd;
283         }
284     };
285 
286     /**
287      handle for the current position in document
288      */
289     T mCurHandle;
290 
291     TableManagerState mState;
292 
293 protected:
getProps()294     PropertiesPointer getProps()
295     {
296         return mState.getProps();
297     }
298 
setProps(PropertiesPointer pProps)299     void setProps(
300         PropertiesPointer pProps )
301     {
302         mState.setProps( pProps );
303     }
304 
resetProps()305     void resetProps()
306     {
307         mState.resetProps();
308     }
309 
getCellProps()310     PropertiesPointer getCellProps()
311     {
312         return mState.getCellProps();
313     }
314 
setCellProps(PropertiesPointer pProps)315     void setCellProps(
316         PropertiesPointer pProps )
317     {
318         mState.setCellProps( pProps );
319     }
320 
resetCellProps()321     void resetCellProps()
322     {
323         mState.resetCellProps();
324     }
325 
getRowProps()326     PropertiesPointer getRowProps()
327     {
328         return mState.getRowProps();
329     }
330 
setRowProps(PropertiesPointer pProps)331     void setRowProps(
332         PropertiesPointer pProps )
333     {
334         mState.setRowProps( pProps );
335     }
336 
resetRowProps()337     void resetRowProps()
338     {
339         mState.resetRowProps();
340     }
341 
setInCell(bool bInCell)342     void setInCell(
343         bool bInCell )
344     {
345         mState.setInCell( bInCell );
346     }
347 
isInCell() const348     bool isInCell() const
349     {
350         return mState.isInCell();
351     }
352 
setCellEnd(bool bCellEnd)353     void setCellEnd(
354         bool bCellEnd )
355     {
356         mState.setCellEnd( bCellEnd );
357     }
358 
isCellEnd() const359     bool isCellEnd() const
360     {
361         return mState.isCellEnd();
362     }
363 
setRowEnd(bool bRowEnd)364     void setRowEnd(
365         bool bRowEnd )
366     {
367         mState.setRowEnd( bRowEnd );
368     }
369 
isRowEnd() const370     bool isRowEnd() const
371     {
372         return mState.isRowEnd();
373     }
374 
getTableProps()375     PropertiesPointer getTableProps()
376     {
377         return mState.getTableProps();
378     }
379 
setTableProps(PropertiesPointer pProps)380     void setTableProps(
381         PropertiesPointer pProps )
382     {
383         mState.setTableProps( pProps );
384     }
385 
resetTableProps()386     void resetTableProps()
387     {
388         mState.resetTableProps();
389     }
390 
getHandle()391     T getHandle()
392     {
393         return mCurHandle;
394     }
395 
setHandle(const T & rHandle)396     void setHandle(
397         const T & rHandle )
398     {
399         mCurHandle = rHandle;
400     }
401 
402 private:
403     typedef boost::shared_ptr<T> T_p;
404 
405     /**
406        depth of the current cell
407     */
408     sal_uInt32 mnTableDepthNew;
409 
410     /**
411         depth of the previous cell
412     */
413     sal_uInt32 mnTableDepth;
414 
415     /**
416        stack of table data
417 
418        for each level of nested tables there is one frame in the stack
419      */
420     stack<typename TableData<T, PropertiesPointer>::Pointer_t > mTableDataStack;
421 
422     typedef typename TableDataHandler<T, PropertiesPointer>::Pointer_t TableDataHandlerPointer_t;
423 
424     /**
425        handler for resolveCurrentTable
426      */
427     TableDataHandlerPointer_t mpTableDataHandler;
428 
429     /**
430        Set flag which indicates the current handle is in a cell.
431      */
432     void inCell();
433 
434     /**
435        Set flag which indicate the current handle is at the end of a cell.
436     */
437     void endCell();
438 
439     /**
440        Set the table depth of the current cell.
441 
442        @param nDepth     the cell depth
443      */
444     void cellDepth(sal_uInt32 nDepth);
445 
446     /**
447        Set flag indication the current handle is at the end of a row.
448     */
449     void endRow();
450 
451     /**
452        Resolve the current table to the TableDataHandler.
453      */
454     void resolveCurrentTable();
455 
456     /**
457      Open a cell at current level.
458      */
459 
460     void openCell(const T & handle, PropertiesPointer pProps);
461 
462     /**
463      Close a cell at current level.
464      */
465     void closeCell(const T & handle);
466 
467     /**
468      Ensure a cell is open at the current level.
469     */
470     void ensureOpenCell(PropertiesPointer pProps);
471 
472 protected:
473 
474     /**
475        Return current table depth.
476      */
getTableDepthNew()477     sal_uInt32 getTableDepthNew() { return mnTableDepthNew; }
478 
479     /**
480        Action to be carried out at the end of the last paragraph of a
481        cell.
482      */
483     virtual void endOfCellAction();
484 
485     /**
486        Action to be carried out at the end of the "table row"
487        paragraph.
488      */
489     virtual void endOfRowAction();
490 
491 
492 public:
493     TableManager();
~TableManager()494     virtual ~TableManager(){}
495 
496     /**
497        Set handler for resolveCurrentTable.
498 
499        @param pTableDataHandler     the handler
500      */
501     void setHandler(TableDataHandlerPointer_t pTableDataHandler);
502 
503     /**
504        Set the current handle.
505 
506        @param rHandle     the handle
507      */
508     virtual void handle(const T & rHandle);
509 
510     /**
511        Start a new table level.
512 
513        A new context is pushed onto the table data stack,
514      */
515     virtual void startLevel();
516 
517     /**
518        End a table level.
519 
520        The current table is resolved and the context is popped from
521        the stack.
522      */
523     virtual void endLevel();
524 
525     /**
526        Handle the start of a paragraph group.
527      */
528     virtual void startParagraphGroup();
529 
530     /**
531        Handle the end of a paragraph group.
532     */
533     virtual void endParagraphGroup();
534 
535     /**
536        Handle an SPRM at current handle.
537 
538        @param rSprm   the SPRM
539      */
540     virtual bool sprm(Sprm & rSprm);
541 
542     /**
543        Handle properties at current handle.
544 
545        @param pProps   the properties
546      */
547     virtual void props(PropertiesPointer pProps);
548 
549     /**
550        Handle occurrence of character 0x7.
551      */
552     virtual void handle0x7();
553 
554     /**
555        Handle 8 bit text at current handle.
556 
557        @param data    array of characters
558        @param len     number of characters to handle
559      */
560     virtual void text(const sal_uInt8 * data, size_t len);
561 
562     /**
563        Handle 16 bit text at current handle.
564 
565        @param data    array of characters
566        @param len     number of characters to handle
567      */
568     virtual void utext(const sal_uInt8 * data, size_t len);
569 
570     /**
571        Handle properties of the current cell.
572 
573        @param pProps   the properties
574      */
575     virtual void cellProps(PropertiesPointer pProps);
576 
577     /**
578        Handle properties of a certain cell in the current row.
579 
580        @param i        index of the cell in the current row
581        @param pProps   the properties
582      */
583     virtual void cellPropsByCell(unsigned int i, PropertiesPointer pProps);
584 
585     /**
586        Handle properties of the current row.
587 
588        @param pProps   the properties
589      */
590     virtual void insertRowProps(PropertiesPointer pProps);
591 
592     /**
593        Handle properties of the current table.
594 
595        @param pProps   the properties
596      */
597     virtual void insertTableProps(PropertiesPointer pProps);
598 
599     /**
600        Return if table manager has detected paragraph to ignore.
601 
602        If this function returns true the current paragraph contains
603        only control information, e.g. end of row.
604      */
605     virtual bool isIgnore() const;
606 
607 
608 #ifdef DEBUG_TABLE
setTagLogger(TagLogger::Pointer_t _tagLogger)609     void setTagLogger(TagLogger::Pointer_t _tagLogger)
610     {
611         mpTableLogger = _tagLogger;
612     }
613 #endif
614 };
615 
616 template <typename T, typename PropertiesPointer>
TableManager()617 TableManager<T, PropertiesPointer>::TableManager()
618 : mnTableDepthNew(0), mnTableDepth(0)
619 {
620     setRowEnd(false);
621     setInCell(false);
622     setCellEnd(false);
623 }
624 
625 template <typename T, typename PropertiesPointer>
cellDepth(sal_uInt32 nDepth)626 void TableManager<T, PropertiesPointer>::cellDepth(sal_uInt32 nDepth)
627 {
628 #ifdef DEBUG_TABLE
629     if (mpTableLogger.get() != NULL)
630     {
631         mpTableLogger->startElement("tablemanager.cellDepth");
632         mpTableLogger->attribute("depth", nDepth);
633         mpTableLogger->endElement("tablemanager.cellDepth");
634     }
635 #endif
636 
637     mnTableDepthNew = nDepth;
638 }
639 
640 template <typename T, typename PropertiesPointer>
inCell()641 void TableManager<T, PropertiesPointer>::inCell()
642 {
643 #ifdef DEBUG_TABLE
644     if (mpTableLogger.get() != NULL)
645         mpTableLogger->element("tablemanager.inCell");
646 #endif
647     setInCell(true);
648 
649     if (mnTableDepthNew < 1)
650         mnTableDepthNew = 1;
651 }
652 
653 template <typename T, typename PropertiesPointer>
endCell()654 void TableManager<T, PropertiesPointer>::endCell()
655 {
656 #ifdef DEBUG_TABLE
657     if (mpTableLogger.get() != NULL)
658         mpTableLogger->element("tablemanager.endCell");
659 #endif
660 
661     setCellEnd(true);
662 }
663 
664 template <typename T, typename PropertiesPointer>
endRow()665 void TableManager<T, PropertiesPointer>::endRow()
666 {
667 #ifdef DEBUG_TABLE
668     if (mpTableLogger.get() != NULL)
669         mpTableLogger->element("tablemanager.endRow");
670 #endif
671 
672     setRowEnd(true);
673 }
674 
675 template <typename T, typename PropertiesPointer>
setHandler(typename TableDataHandler<T,PropertiesPointer>::Pointer_t pTableDataHandler)676 void TableManager<T, PropertiesPointer>::setHandler
677 (typename TableDataHandler<T, PropertiesPointer>::Pointer_t pTableDataHandler)
678 {
679     mpTableDataHandler = pTableDataHandler;
680 }
681 
682 template <typename T, typename PropertiesPointer>
handle(const T & rHandle)683 void TableManager<T, PropertiesPointer>::handle(const T & rHandle)
684 {
685 #ifdef DEBUG_TABLE
686     if (mpTableLogger.get())
687     {
688         mpTableLogger->startElement("tablemanager.handle");
689         mpTableLogger->chars(toString(rHandle));
690         mpTableLogger->endElement("tablemanager.handle");
691     }
692 #endif
693 
694     setHandle(rHandle);
695 }
696 
697 template <typename T, typename PropertiesPointer>
startLevel()698 void TableManager<T, PropertiesPointer>::startLevel()
699 {
700 #ifdef DEBUG_TABLE
701     if (mpTableLogger.get() != NULL)
702     {
703         typename TableData<T, PropertiesPointer>::Pointer_t pTableData;
704 
705         if (mTableDataStack.size() > 0)
706             pTableData = mTableDataStack.top();
707 
708         mpTableLogger->startElement("tablemanager.startLevel");
709         mpTableLogger->attribute("level", mTableDataStack.size());
710 
711         if (pTableData.get() != NULL)
712             mpTableLogger->attribute("openCell",
713                                      pTableData->isCellOpen() ? "yes" : "no");
714 
715         mpTableLogger->endElement("tablemanager.startLevel");
716     }
717 #endif
718 
719     typename TableData<T, PropertiesPointer>::Pointer_t pTableData
720         (new TableData<T, PropertiesPointer>(mTableDataStack.size()));
721 
722     mTableDataStack.push(pTableData);
723     mState.startLevel();
724 }
725 
726 template <typename T, typename PropertiesPointer>
endLevel()727 void TableManager<T, PropertiesPointer>::endLevel()
728 {
729     if (mpTableDataHandler.get() != NULL)
730         resolveCurrentTable();
731 
732     mState.endLevel();
733     mTableDataStack.pop();
734 
735 #ifdef DEBUG_TABLE
736     if (mpTableLogger.get() != NULL)
737     {
738         typename TableData<T, PropertiesPointer>::Pointer_t pTableData;
739 
740         if (mTableDataStack.size() > 0)
741             pTableData = mTableDataStack.top();
742 
743         mpTableLogger->startElement("tablemanager.endLevel");
744         mpTableLogger->attribute("level", mTableDataStack.size());
745 
746         if (pTableData.get() != NULL)
747             mpTableLogger->attribute("openCell",
748                                      pTableData->isCellOpen() ? "yes" : "no");
749 
750         mpTableLogger->endElement("tablemanager.endLevel");
751     }
752 #endif
753 }
754 
755 template <typename T, typename PropertiesPointer>
startParagraphGroup()756 void TableManager<T, PropertiesPointer>::startParagraphGroup()
757 {
758 	mState.resetCellSpecifics();
759     mnTableDepthNew = 0;
760 }
761 
762 template <typename T, typename PropertiesPointer>
endParagraphGroup()763 void TableManager<T, PropertiesPointer>::endParagraphGroup()
764 {
765     sal_Int32 nTableDepthDifference = mnTableDepthNew - mnTableDepth;
766 
767     PropertiesPointer pEmptyProps;
768 
769     while (nTableDepthDifference > 0)
770     {
771         ensureOpenCell(pEmptyProps);
772         startLevel();
773 
774         --nTableDepthDifference;
775     }
776     while (nTableDepthDifference < 0)
777     {
778         endLevel();
779 
780         ++nTableDepthDifference;
781     }
782 
783     mnTableDepth = mnTableDepthNew;
784 
785     if ( mnTableDepth > 0 )
786     {
787         typename TableData< T, PropertiesPointer >::Pointer_t pTableData = mTableDataStack.top();
788 
789         if ( isRowEnd() )
790         {
791             endOfRowAction();
792             pTableData->endRow( getRowProps() );
793             resetRowProps();
794         }
795 
796         else if ( isInCell() )
797         {
798             ensureOpenCell( getCellProps() );
799 
800             if ( isCellEnd() )
801             {
802                 endOfCellAction();
803                 closeCell( getHandle() );
804             }
805         }
806         resetCellProps();
807     }
808 }
809 
810 template <typename T, typename PropertiesPointer>
sprm(Sprm & rSprm)811 bool TableManager<T, PropertiesPointer>::sprm(Sprm & rSprm)
812 {
813     bool bRet = true;
814     switch (rSprm.getId())
815     {
816     case NS_sprm::LN_PTableDepth:
817         {
818             Value::Pointer_t pValue = rSprm.getValue();
819 
820             cellDepth(pValue->getInt());
821         }
822         break;
823     case NS_sprm::LN_PFInTable:
824         inCell();
825         break;
826     case NS_sprm::LN_PCell:
827         endCell();
828         break;
829     case NS_sprm::LN_PFTtp:
830     case NS_sprm::LN_PRow:
831         endRow();
832         break;
833     default:
834         bRet = false;
835     }
836     return bRet;
837 }
838 template <typename T, typename PropertiesPointer>
props(PropertiesPointer pProps)839 void TableManager<T, PropertiesPointer>::props(PropertiesPointer pProps)
840 {
841     setProps(pProps);
842 }
843 
844 template <typename T, typename PropertiesPointer>
handle0x7()845 void TableManager<T, PropertiesPointer>::handle0x7()
846 {
847 #ifdef DEBUG_TABLE
848     if (mpTableLogger.get() != NULL)
849         mpTableLogger->startElement("tablemanager.handle0x7");
850 #endif
851 
852     if (mnTableDepthNew < 1)
853         mnTableDepthNew = 1;
854 
855     if (isInCell())
856         endCell();
857     else
858         endRow();
859 
860 #ifdef DEBUG_TABLE
861     if (mpTableLogger.get() != NULL)
862         mpTableLogger->endElement("tablemanager.handle0x7");
863 #endif
864 }
865 
866 template <typename T, typename PropertiesPointer>
text(const sal_uInt8 * data,size_t len)867 void TableManager<T, PropertiesPointer>::text(const sal_uInt8 * data, size_t len)
868 {
869     // optimization: cell/row end characters are the last characters in a run
870     if (len > 0)
871     {
872         if (data[len - 1] == 0x7)
873             handle0x7();
874     }
875 }
876 
877 template <typename T, typename PropertiesPointer>
utext(const sal_uInt8 * data,size_t len)878 void TableManager<T, PropertiesPointer>::utext(const sal_uInt8 * data, size_t len)
879 {
880     // optimization: cell/row end characters are the last characters in a run
881 
882     if (len > 0)
883     {
884         sal_Unicode nChar = data[(len - 1) * 2] + (data[(len - 1) * 2 + 1] << 8);
885         if (nChar == 0x7)
886             handle0x7();
887     }
888 }
889 
890 template <typename T, typename PropertiesPointer>
cellProps(PropertiesPointer pProps)891 void TableManager<T, PropertiesPointer>::cellProps(PropertiesPointer pProps)
892 {
893 #ifdef DEBUG_TABLE
894     if (mpTableLogger.get() != NULL)
895         mpTableLogger->startElement("tablemanager.cellProps");
896 #endif
897 
898     if(getCellProps().get())
899         getCellProps()->insert( pProps );
900     else
901         setCellProps(pProps);
902 
903 #ifdef DEBUG_TABLE
904     if (mpTableLogger.get() != NULL)
905         mpTableLogger->endElement("tablemanager.cellProps");
906 #endif
907 }
908 
909 template <typename T, typename PropertiesPointer>
cellPropsByCell(unsigned int i,PropertiesPointer pProps)910 void TableManager<T, PropertiesPointer>::cellPropsByCell
911 (unsigned int i, PropertiesPointer pProps)
912 {
913 #ifdef DEBUG_TABLE
914     if (mpTableLogger.get() != NULL)
915         mpTableLogger->startElement("tablemanager.cellPropsByCell");
916 #endif
917 
918     mTableDataStack.top()->insertCellProperties(i, pProps);
919 
920 #ifdef DEBUG_TABLE
921     if (mpTableLogger.get() != NULL)
922         mpTableLogger->endElement("tablemanager.cellPropsByCell");
923 #endif
924 }
925 
926 template <typename T, typename PropertiesPointer>
insertRowProps(PropertiesPointer pProps)927 void TableManager<T, PropertiesPointer>::insertRowProps(PropertiesPointer pProps)
928 {
929 #ifdef DEBUG_TABLE
930     if (mpTableLogger.get() != NULL)
931         mpTableLogger->startElement("tablemanager.insertRowProps");
932 #endif
933 
934     if( getRowProps().get() )
935         getRowProps()->insert( pProps );
936     else
937         setRowProps(pProps);
938 
939 #ifdef DEBUG_TABLE
940     if (mpTableLogger.get() != NULL)
941         mpTableLogger->endElement("tablemanager.insertRowProps");
942 #endif
943 }
944 
945 template <typename T, typename PropertiesPointer>
insertTableProps(PropertiesPointer pProps)946 void TableManager<T, PropertiesPointer>::insertTableProps(PropertiesPointer pProps)
947 {
948 #ifdef DEBUG_TABLE
949     if (mpTableLogger.get() != NULL)
950         mpTableLogger->startElement("tablemanager.insertTableProps");
951 #endif
952 
953     if( getTableProps().get() )
954         getTableProps()->insert( pProps );
955     else
956         setTableProps(pProps);
957 
958 #ifdef DEBUG_TABLE
959     if (mpTableLogger.get() != NULL)
960         mpTableLogger->endElement("tablemanager.insertTableProps");
961 #endif
962 }
963 
964 template <typename T, typename PropertiesPointer>
resolveCurrentTable()965 void TableManager<T, PropertiesPointer>::resolveCurrentTable()
966 {
967 #ifdef DEBUG_TABLE
968     if (mpTableLogger.get() != NULL)
969         mpTableLogger->startElement("tablemanager.resolveCurrentTable");
970 #endif
971 
972     if (mpTableDataHandler.get() != NULL)
973     {
974         typename TableData<T, PropertiesPointer>::Pointer_t
975             pTableData = mTableDataStack.top();
976 
977         const unsigned int nRows = pTableData->getRowCount();
978 
979         mpTableDataHandler->startTable(nRows, pTableData->getDepth(), getTableProps());
980 
981         for (unsigned int nRow = 0; nRow < nRows; ++nRow)
982         {
983             typename RowData<T, PropertiesPointer>::Pointer_t pRowData = pTableData->getRow(nRow);
984 
985             unsigned int nCells = pRowData->getCellCount();
986 
987             mpTableDataHandler->startRow(nCells, pRowData->getProperties());
988 
989             for (unsigned int nCell = 0; nCell < nCells; ++nCell)
990             {
991                 mpTableDataHandler->startCell
992                     (pRowData->getCellStart(nCell),
993                      pRowData->getCellProperties(nCell));
994 
995                 mpTableDataHandler->endCell(pRowData->getCellEnd(nCell));
996             }
997 
998             mpTableDataHandler->endRow();
999         }
1000 
1001         mpTableDataHandler->endTable( pTableData->getDepth() );
1002     }
1003     resetTableProps();
1004 
1005 #ifdef DEBUG_TABLE
1006     if (mpTableLogger.get() != NULL)
1007         mpTableLogger->endElement("tablemanager.resolveCurrentTable");
1008 #endif
1009 }
1010 
1011 template <typename T, typename PropertiesPointer>
endOfCellAction()1012 void TableManager<T, PropertiesPointer>::endOfCellAction()
1013 {
1014 }
1015 
1016 template <typename T, typename PropertiesPointer>
endOfRowAction()1017 void TableManager<T, PropertiesPointer>::endOfRowAction()
1018 {
1019 }
1020 
1021 template <typename T, typename PropertiesPointer>
isIgnore() const1022 bool TableManager<T, PropertiesPointer>::isIgnore() const
1023 {
1024 	return isRowEnd();
1025 }
1026 
1027 template <typename T, typename PropertiesPointer>
openCell(const T & rHandle,PropertiesPointer pProps)1028 void TableManager<T, PropertiesPointer>::openCell
1029 (const T & rHandle, PropertiesPointer pProps)
1030 {
1031 #ifdef DEBUG_TABLE
1032     mpTableLogger->startElement("tablemanager.openCell");
1033     mpTableLogger->chars(toString(rHandle));
1034     mpTableLogger->endElement("tablemanager.openCell");
1035 #endif
1036 
1037     if (mTableDataStack.size() > 0)
1038     {
1039         typename TableData<T, PropertiesPointer>::Pointer_t
1040         pTableData = mTableDataStack.top();
1041 
1042         pTableData->addCell(rHandle, pProps);
1043     }
1044 }
1045 
1046 template <typename T, typename PropertiesPointer>
closeCell(const T & rHandle)1047 void TableManager<T, PropertiesPointer>::closeCell
1048 (const T & rHandle)
1049 {
1050 #ifdef DEBUG_TABLE
1051     mpTableLogger->startElement("tablemanager.closeCell");
1052     mpTableLogger->chars(toString(rHandle));
1053     mpTableLogger->endElement("tablemanager.closeCell");
1054 #endif
1055 
1056     if (mTableDataStack.size() > 0)
1057     {
1058         typename TableData<T, PropertiesPointer>::Pointer_t
1059         pTableData = mTableDataStack.top();
1060 
1061         pTableData->endCell(rHandle);
1062     }
1063 }
1064 
1065 template <typename T, typename PropertiesPointer>
ensureOpenCell(PropertiesPointer pProps)1066 void TableManager<T, PropertiesPointer>::ensureOpenCell(PropertiesPointer pProps)
1067 {
1068 #ifdef DEBUG_TABLE
1069     mpTableLogger->startElement("tablemanager.ensureOpenCell");
1070 #endif
1071 
1072     if (mTableDataStack.size() > 0)
1073     {
1074         typename TableData<T, PropertiesPointer>::Pointer_t
1075         pTableData = mTableDataStack.top();
1076 
1077         if (pTableData.get() != NULL)
1078         {
1079             if (!pTableData->isCellOpen())
1080                 openCell(getHandle(), pProps);
1081             else
1082                 pTableData->insertCellProperties(pProps);
1083         }
1084     }
1085 #ifdef DEBUG_TABLE
1086 	mpTableLogger->endElement("tablemanager.ensureOpenCell");
1087 #endif
1088 }
1089 
1090 }
1091 
1092 #endif // INCLUDED_TABLE_MANAGER_HXX
1093 
1094 /* vim: set noet sw=4 ts=4: */
1095