update dev300-m58
[ooovba.git] / writerfilter / documentation / tablesInDoc.txt
blob629e68d755900846edc443e35ee738ad749fbd7d
1 All paragraphs in tables:
3     sprms: 
4            0x2416 (sprmPFInTable)    indicates a paragraph is in a table
5            0x6649 (sprmPTableDepth)  demarks the nesting depth of the paragraph
6            
7 paragraph at nesting depth 1:
8     
9     end of cell:        0x7
10     end of row:         0x7 + sprm 0x2417(sprmFTtp)
12     the end of a row has its own 0x7
13     
14 paragraphs at nesting depth > 1;
16     end of cell:      0xd + sprm 0x244b(sprmPCell)
17     end of row        0xd + sprm 0x244b(sprmPCell) + sprm 0x244c(sprmPRow)
19     the end of a row has its own 0xd
21 Algorithm to detect table structure:
23 Datastructures:
25 RowData<Handle>:
26         int getCellCount()
27             // return number of cells in row
28         Handle getStart(i)
29                // get handle for start of cell i
30         Handle getEnd(i)
31                // get handle for end off cell i
32         Properties getProperties()
33                    // return properties of row
35 TableData<Handle>:
36         void addCell(Handle start, Handle end)
37              // insert cell starting at start and ending at end into the 
38              // current row
39         void endRow(properties)
40              // end current row and save properties for that row, begin new row
41         int getRowCount
42             // return number of rows in table
43         RowData<Handle> getRow(i)
44                         // get data for row i
46 prevTableDepth
47         depth in table hierarchy of previous paragraph
49 curTableDepth
50         depth in table hierarchy of current paragraph
52 bInCell
53         true if current paragraph is in a cell
55 bEndCell
56         true if current paragraph if the last paragraph of a cell
58 bEndRow
59         true if current paragraph is the end of a row
61 paragraphHandle
62           handle for current paragraph
64 initial:
65         create stack of TableData<Handle>
67 final:
68         handle remaining TableData<Handle> on stack
70 creating StreamHandler:
71          push new TableData<Handle> on stack
73 destroying StreamHandler:
74            handle TableData<Handle> on top of stack
75            pop TableData<Handle> from stack
76            
77 StreamHandler::substream:
78          push new TableData<Handle> on stack
79          handle TableData<Handle> on top of stack
80          pop TableData<Handle> from stack
81         
82 starting paragraph group:
83          paragraphHandle = currentHandle;
84          bInCell = false;
85          bCellEnd = false;
86          bRowEnd = false;
88 ending paragraph group:
89        difference = curTableDepth - prevTableDepth
91        if (difference > 0)
92           push difference new TableData<Handle> onto stack
93        else if (difference < 0)
94        {
95             repeat difference times
96             {
97                    handle top of stack
98                    pop stack
99             }
100        }
101        precTableDepth = curTableDepth
103        if (bInCell)
104        {
105           if (handleStart is null)
106              handleStart = paragraphHandle;
107        
108           if (bCellEnd)
109           {
110                 stack.top().addCell(handleStart, paragraphHandle);
111                 clear handleStart
112           }
114           if (bRowEnd)
115           {
116                 stack.top().endRow(properties)
117           }
120 in StreamHandler::props:
121    save properties
123 PropertiesHandler::sprm:
124         sprm 0x6649:
125              save value in curTableDepth
126         sprm 0x2416:
127              bInCell = true
128         sprm 0x244b:
129              bCellEnd = true
130         sprm 0x2417:
131              bRowEnd = true
133 text:
134         0x7:
135                 bCellEnd = true