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 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26
27 #include <iostream>
28 #include <set>
29 #include <stdio.h>
30 #include "WW8TableInfo.hxx"
31 #include "fmtfsize.hxx"
32 #include "attributeoutputbase.hxx"
33 #include "swtable.hxx"
34 #include "frmfmt.hxx"
35 #include "pam.hxx"
36 #include "ndtxt.hxx"
37 #include "dbgoutsw.hxx"
38
39 namespace ww8
40 {
41
42 // WW8TableNodeInfoInner
43
WW8TableNodeInfoInner(WW8TableNodeInfo * pParent)44 WW8TableNodeInfoInner::WW8TableNodeInfoInner(WW8TableNodeInfo * pParent)
45 : mpParent(pParent)
46 , mnCell(0)
47 , mnRow(0)
48 , mnShadowsBefore(0)
49 , mnShadowsAfter(0)
50 , mbEndOfLine(false)
51 , mbEndOfCell(false)
52 , mbFirstInTable(false)
53 , mbVertMerge(false)
54 , mpTableBox(NULL)
55 , mpTable(NULL)
56 {
57 }
58
~WW8TableNodeInfoInner()59 WW8TableNodeInfoInner::~WW8TableNodeInfoInner()
60 {
61 }
62
setDepth(sal_uInt32 nDepth)63 void WW8TableNodeInfoInner::setDepth(sal_uInt32 nDepth)
64 {
65 mnDepth = nDepth;
66 }
67
setCell(sal_uInt32 nCell)68 void WW8TableNodeInfoInner::setCell(sal_uInt32 nCell)
69 {
70 mnCell = nCell;
71 }
72
setRow(sal_uInt32 nRow)73 void WW8TableNodeInfoInner::setRow(sal_uInt32 nRow)
74 {
75 mnRow = nRow;
76 }
77
setShadowsBefore(sal_uInt32 nShadowsBefore)78 void WW8TableNodeInfoInner::setShadowsBefore(sal_uInt32 nShadowsBefore)
79 {
80 mnShadowsBefore = nShadowsBefore;
81 }
82
setShadowsAfter(sal_uInt32 nShadowsAfter)83 void WW8TableNodeInfoInner::setShadowsAfter(sal_uInt32 nShadowsAfter)
84 {
85 mnShadowsAfter = nShadowsAfter;
86 }
87
setEndOfLine(bool bEndOfLine)88 void WW8TableNodeInfoInner::setEndOfLine(bool bEndOfLine)
89 {
90 mbEndOfLine = bEndOfLine;
91 }
92
setEndOfCell(bool bEndOfCell)93 void WW8TableNodeInfoInner::setEndOfCell(bool bEndOfCell)
94 {
95 mbEndOfCell = bEndOfCell;
96 }
97
setFirstInTable(bool bFirstInTable)98 void WW8TableNodeInfoInner::setFirstInTable(bool bFirstInTable)
99 {
100 mbFirstInTable = bFirstInTable;
101 }
102
setVertMerge(bool bVertMerge)103 void WW8TableNodeInfoInner::setVertMerge(bool bVertMerge)
104
105 {
106 mbVertMerge = bVertMerge;
107 }
108
setTableBox(const SwTableBox * pTableBox)109 void WW8TableNodeInfoInner::setTableBox(const SwTableBox * pTableBox)
110 {
111 mpTableBox = pTableBox;
112 }
113
setTable(const SwTable * pTable)114 void WW8TableNodeInfoInner::setTable(const SwTable * pTable)
115 {
116 mpTable = pTable;
117 }
118
setRect(const SwRect & rRect)119 void WW8TableNodeInfoInner::setRect(const SwRect & rRect)
120 {
121 maRect = rRect;
122 }
123
getDepth() const124 sal_uInt32 WW8TableNodeInfoInner::getDepth() const
125 {
126 return mnDepth;
127 }
128
getCell() const129 sal_uInt32 WW8TableNodeInfoInner::getCell() const
130 {
131 return mnCell;
132 }
133
getRow() const134 sal_uInt32 WW8TableNodeInfoInner::getRow() const
135 {
136 return mnRow;
137 }
138
getShadowsBefore() const139 sal_uInt32 WW8TableNodeInfoInner::getShadowsBefore() const
140 {
141 return mnShadowsBefore;
142 }
143
getShadowsAfter() const144 sal_uInt32 WW8TableNodeInfoInner::getShadowsAfter() const
145 {
146 return mnShadowsAfter;
147 }
148
isEndOfCell() const149 bool WW8TableNodeInfoInner::isEndOfCell() const
150 {
151 return mbEndOfCell;
152 }
153
isEndOfLine() const154 bool WW8TableNodeInfoInner::isEndOfLine() const
155 {
156 return mbEndOfLine;
157 }
158
isFirstInTable() const159 bool WW8TableNodeInfoInner::isFirstInTable() const
160 {
161 return mbFirstInTable;
162 }
163
getNode() const164 const SwNode * WW8TableNodeInfoInner::getNode() const
165 {
166 const SwNode * pResult = NULL;
167
168 if (mpParent != NULL)
169 pResult = mpParent->getNode();
170
171 return pResult;
172 }
173
getTableBoxesOfRow()174 TableBoxVectorPtr WW8TableNodeInfoInner::getTableBoxesOfRow()
175 {
176 TableBoxVectorPtr pResult(new TableBoxVector);
177
178 WW8TableCellGrid::Pointer_t pCellGrid =
179 mpParent->getParent()->getCellGridForTable(getTable(), false);
180
181 if (pCellGrid.get() == NULL)
182 {
183 const SwTableLine * pTabLine = getTableBox()->GetUpper();
184 const SwTableBoxes & rTblBoxes = pTabLine->GetTabBoxes();
185
186 sal_uInt8 nBoxes = rTblBoxes.Count();
187 for ( sal_uInt8 n = 0; n < nBoxes; n++ )
188 {
189 pResult->push_back(rTblBoxes[n]);
190 }
191 }
192 else
193 pResult = pCellGrid->getTableBoxesOfRow(this);
194
195 return pResult;
196 }
197
getGridColsOfRow(AttributeOutputBase & rBase)198 GridColsPtr WW8TableNodeInfoInner::getGridColsOfRow(AttributeOutputBase & rBase)
199 {
200 GridColsPtr pResult(new GridCols);
201 WidthsPtr pWidths(getWidthsOfRow());
202
203 const SwFrmFmt *pFmt = getTable()->GetFrmFmt();
204 ASSERT(pFmt,"Impossible");
205 if (!pFmt)
206 return pResult;
207
208 const SwFmtFrmSize &rSize = pFmt->GetFrmSize();
209 unsigned long nTblSz = static_cast<unsigned long>(rSize.GetWidth());
210
211 sal_uInt32 nPageSize = 0;
212 bool bRelBoxSize = false;
213
214 rBase.GetTablePageSize
215 ( this, nPageSize, bRelBoxSize );
216
217 SwTwips nSz = 0;
218 Widths::const_iterator aWidthsEnd = pWidths->end();
219 for ( Widths::const_iterator aIt = pWidths->begin();
220 aIt != aWidthsEnd;
221 aIt++)
222 {
223 nSz += *aIt;
224 SwTwips nCalc = nSz;
225 if ( bRelBoxSize )
226 nCalc = ( nCalc * nPageSize ) / nTblSz;
227
228 pResult->push_back( nCalc );
229 }
230
231 return pResult;
232 }
233
getWidthsOfRow()234 WidthsPtr WW8TableNodeInfoInner::getWidthsOfRow()
235 {
236 WidthsPtr pWidths;
237
238 WW8TableCellGrid::Pointer_t pCellGrid =
239 mpParent->getParent()->getCellGridForTable(getTable(), false);
240
241 if (pCellGrid.get() == NULL)
242 {
243 const SwTableBox * pTabBox = getTableBox();
244 const SwTableLine * pTabLine = pTabBox->GetUpper();
245 const SwTableBoxes & rTabBoxes = pTabLine->GetTabBoxes();
246
247 pWidths = WidthsPtr(new Widths);
248 // number of cell written
249 sal_uInt32 nBoxes = rTabBoxes.Count();
250 if ( nBoxes > MAXTABLECELLS )
251 nBoxes = MAXTABLECELLS;
252
253 for (sal_uInt32 n = 0; n < nBoxes; n++)
254 {
255 const SwFrmFmt* pBoxFmt = rTabBoxes[ n ]->GetFrmFmt();
256 const SwFmtFrmSize& rLSz = pBoxFmt->GetFrmSize();
257
258 pWidths->push_back(rLSz.GetWidth());
259 }
260 }
261 else
262 pWidths = pCellGrid->getWidthsOfRow(this);
263
264 return pWidths;
265 }
266
getRowSpansOfRow()267 RowSpansPtr WW8TableNodeInfoInner::getRowSpansOfRow()
268 {
269 RowSpansPtr pResult(new RowSpans);
270
271 WW8TableCellGrid::Pointer_t pCellGrid =
272 mpParent->getParent()->getCellGridForTable(getTable(), false);
273
274 if (pCellGrid.get() == NULL)
275 {
276 const SwTableBox * pTabBox = getTableBox();
277 const SwTableLine * pTabLine = pTabBox->GetUpper();
278 const SwTableBoxes & rTabBoxes = pTabLine->GetTabBoxes();
279
280 sal_uInt32 nBoxes = rTabBoxes.Count();
281 if (nBoxes > MAXTABLECELLS)
282 nBoxes = MAXTABLECELLS;
283
284 for (sal_uInt32 n = 0; n < nBoxes; ++n)
285 {
286 pResult->push_back(rTabBoxes[n]->getRowSpan());
287 }
288 }
289 else
290 pResult = pCellGrid->getRowSpansOfRow(this);
291
292 return pResult;
293 }
294
getTableBox() const295 const SwTableBox * WW8TableNodeInfoInner::getTableBox() const
296 {
297 return mpTableBox;
298 }
299
getTable() const300 const SwTable * WW8TableNodeInfoInner::getTable() const
301 {
302 return mpTable;
303 }
304
getRect() const305 const SwRect & WW8TableNodeInfoInner::getRect() const
306 {
307 return maRect;
308 }
309
toString() const310 string WW8TableNodeInfoInner::toString() const
311 {
312 static char buffer[256];
313 snprintf(buffer, sizeof(buffer),
314 "<tableinner depth=\"%" SAL_PRIuUINT32 "\""
315 " cell=\"%" SAL_PRIuUINT32 "\""
316 " row=\"%" SAL_PRIuUINT32 "\""
317 " endOfCell=\"%s\""
318 " endOfLine=\"%s\""
319 " shadowsBefore=\"%" SAL_PRIuUINT32 "\""
320 " shadowsAfter=\"%" SAL_PRIuUINT32 "\""
321 " vertMerge=\"%s\"/>",
322 mnDepth, mnCell, mnRow,
323 mbEndOfCell ? "yes" : "no",
324 mbEndOfLine ? "yes" : "no",
325 mnShadowsBefore,
326 mnShadowsAfter,
327 mbVertMerge ? "yes" : "no");
328
329 return string(buffer);
330 }
331 // WW8TableTextNodeInfo
332
WW8TableNodeInfo(WW8TableInfo * pParent,const SwNode * pNode)333 WW8TableNodeInfo::WW8TableNodeInfo(WW8TableInfo * pParent,
334 const SwNode * pNode)
335 : mpParent(pParent),
336 mnDepth(0),
337 mpNode(pNode),
338 mpNext(NULL),
339 mpNextNode(NULL)
340 {
341 }
342
~WW8TableNodeInfo()343 WW8TableNodeInfo::~WW8TableNodeInfo()
344 {
345 }
346
toString() const347 ::std::string WW8TableNodeInfo::toString() const
348 {
349 static char buffer[1024];
350 snprintf(buffer, sizeof(buffer),
351 "<tableNodeInfo p=\"%p\" depth=\"%" SAL_PRIuUINT32 "\">"
352 ,this, getDepth());
353
354 ::std::string sResult(buffer);
355
356 Inners_t::const_iterator aIt(mInners.begin());
357 Inners_t::const_iterator aEnd(mInners.end());
358
359 while (aIt != aEnd)
360 {
361 WW8TableNodeInfoInner::Pointer_t pInner = aIt->second;
362 sResult += pInner->toString();
363
364 aIt++;
365 }
366 #ifdef DEBUG
367 sResult += dbg_out(*mpNode);
368 #endif
369 sResult += "</tableNodeInfo>";
370
371 return sResult;
372 }
setDepth(sal_uInt32 nDepth)373 void WW8TableNodeInfo::setDepth(sal_uInt32 nDepth)
374 {
375 mnDepth = nDepth;
376
377 Inners_t::iterator aIt = mInners.find(mnDepth);
378
379 if (aIt == mInners.end())
380 mInners[mnDepth] = WW8TableNodeInfoInner::Pointer_t(new WW8TableNodeInfoInner(this));
381
382 mInners[mnDepth]->setDepth(mnDepth);
383 }
384
setEndOfLine(bool bEndOfLine)385 void WW8TableNodeInfo::setEndOfLine(bool bEndOfLine)
386 {
387 WW8TableNodeInfoInner::Pointer_t pInner = getInnerForDepth(mnDepth);
388 pInner->setEndOfLine(bEndOfLine);
389
390 #ifdef DEBUG
391 ::std::clog << "<endOfLine depth=\"" << mnDepth << "\">"
392 << toString() << "</endOfLine>" << ::std::endl;
393 #endif
394 }
395
setEndOfCell(bool bEndOfCell)396 void WW8TableNodeInfo::setEndOfCell(bool bEndOfCell)
397 {
398 WW8TableNodeInfoInner::Pointer_t pInner = getInnerForDepth(mnDepth);
399 pInner->setEndOfCell(bEndOfCell);
400
401 #ifdef DEBUG
402 ::std::clog << "<endOfCell depth=\"" << mnDepth << "\">"
403 << toString() << "</endOfCell>" << ::std::endl;
404 #endif
405 }
406
setFirstInTable(bool bFirstInTable)407 void WW8TableNodeInfo::setFirstInTable(bool bFirstInTable)
408 {
409 WW8TableNodeInfoInner::Pointer_t pInner = getInnerForDepth(mnDepth);
410
411 pInner->setFirstInTable(bFirstInTable);
412
413 #ifdef DEBUG
414 ::std::clog << "<firstInTable depth=\"" << mnDepth << "\">"
415 << toString() << "</firstInTable>" << ::std::endl;
416 #endif
417 }
418
setVertMerge(bool bVertMerge)419 void WW8TableNodeInfo::setVertMerge(bool bVertMerge)
420 {
421 WW8TableNodeInfoInner::Pointer_t pInner = getInnerForDepth(mnDepth);
422
423 pInner->setVertMerge(bVertMerge);
424
425
426 #ifdef DEBUG
427 ::std::clog << "<vertMerge depth=\"" << mnDepth << "\">"
428 << toString() << "</vertMerge>" << ::std::endl;
429 #endif
430 }
431
setTableBox(const SwTableBox * pTableBox)432 void WW8TableNodeInfo::setTableBox(const SwTableBox * pTableBox)
433 {
434 getInnerForDepth(mnDepth)->setTableBox(pTableBox);
435 }
436
setTable(const SwTable * pTable)437 void WW8TableNodeInfo::setTable(const SwTable * pTable)
438 {
439 getInnerForDepth(mnDepth)->setTable(pTable);
440 }
441
setNext(WW8TableNodeInfo * pNext)442 void WW8TableNodeInfo::setNext(WW8TableNodeInfo * pNext)
443 {
444 mpNext = pNext;
445
446 #ifdef DEBUG
447 ::std::clog << "<setnext><from>" << toString() << "</from><to>"
448 << pNext->toString() << "</to></setnext>"
449 << ::std::endl;
450 #endif
451 }
452
setNextNode(const SwNode * pNode)453 void WW8TableNodeInfo::setNextNode(const SwNode * pNode)
454 {
455 mpNextNode = pNode;
456 }
457
setRect(const SwRect & rRect)458 void WW8TableNodeInfo::setRect(const SwRect & rRect)
459 {
460 getInnerForDepth(mnDepth)->setRect(rRect);
461 }
462
setCell(sal_uInt32 nCell)463 void WW8TableNodeInfo::setCell(sal_uInt32 nCell)
464 {
465 getInnerForDepth(mnDepth)->setCell(nCell);
466 }
467
setRow(sal_uInt32 nRow)468 void WW8TableNodeInfo::setRow(sal_uInt32 nRow)
469 {
470 getInnerForDepth(mnDepth)->setRow(nRow);
471 }
472
setShadowsBefore(sal_uInt32 nShadowsBefore)473 void WW8TableNodeInfo::setShadowsBefore(sal_uInt32 nShadowsBefore)
474 {
475 getInnerForDepth(mnDepth)->setShadowsBefore(nShadowsBefore);
476 }
477
setShadowsAfter(sal_uInt32 nShadowsAfter)478 void WW8TableNodeInfo::setShadowsAfter(sal_uInt32 nShadowsAfter)
479 {
480 getInnerForDepth(mnDepth)->setShadowsAfter(nShadowsAfter);
481 }
482
getParent() const483 WW8TableInfo * WW8TableNodeInfo::getParent() const
484 {
485 return mpParent;
486 }
487
getDepth() const488 sal_uInt32 WW8TableNodeInfo::getDepth() const
489 {
490 if (mInners.size() > 0)
491 return mInners.begin()->second->getDepth();
492
493 return mnDepth;
494 }
495
getNode() const496 const SwNode * WW8TableNodeInfo::getNode() const
497 {
498 return mpNode;
499 }
500
getTableBox() const501 const SwTableBox * WW8TableNodeInfo::getTableBox() const
502 {
503 return getInnerForDepth(mnDepth)->getTableBox();
504 }
505
getTable() const506 const SwTable * WW8TableNodeInfo::getTable() const
507 {
508 return getInnerForDepth(mnDepth)->getTable();
509 }
510
getNext() const511 WW8TableNodeInfo * WW8TableNodeInfo::getNext() const
512 {
513 return mpNext;
514 }
515
getNextNode() const516 const SwNode * WW8TableNodeInfo::getNextNode() const
517 {
518 return mpNextNode;
519 }
520
getRect() const521 const SwRect & WW8TableNodeInfo::getRect() const
522 {
523 return getInnerForDepth(mnDepth)->getRect();
524 }
525
isEndOfLine() const526 bool WW8TableNodeInfo::isEndOfLine() const
527 {
528 return getInnerForDepth(mnDepth)->isEndOfLine();
529 }
530
isEndOfCell() const531 bool WW8TableNodeInfo::isEndOfCell() const
532 {
533 return getInnerForDepth(mnDepth)->isEndOfCell();
534 }
535
getCell() const536 sal_uInt32 WW8TableNodeInfo::getCell() const
537 {
538 return getInnerForDepth(mnDepth)->getCell();
539 }
540
getRow() const541 sal_uInt32 WW8TableNodeInfo::getRow() const
542 {
543 return getInnerForDepth(mnDepth)->getRow();
544 }
545
getInners() const546 const ww8::WW8TableNodeInfo::Inners_t & WW8TableNodeInfo::getInners() const
547 {
548 return mInners;
549 }
550
getFirstInner() const551 const WW8TableNodeInfoInner::Pointer_t WW8TableNodeInfo::getFirstInner() const
552 {
553 WW8TableNodeInfoInner::Pointer_t pResult;
554
555 if (mInners.size() > 0)
556 pResult = mInners.begin()->second;
557
558 return pResult;
559 }
560
getInnerForDepth(sal_uInt32 nDepth) const561 const WW8TableNodeInfoInner::Pointer_t WW8TableNodeInfo::getInnerForDepth(sal_uInt32 nDepth) const
562 {
563 WW8TableNodeInfoInner::Pointer_t pResult;
564
565 Inners_t::const_iterator aIt = mInners.find(nDepth);
566 if (aIt != mInners.end())
567 {
568 pResult = aIt->second;
569 }
570
571 return pResult;
572 }
573
574 // WW8TableInfo
575
WW8TableInfo()576 WW8TableInfo::WW8TableInfo()
577 {
578 }
579
~WW8TableInfo()580 WW8TableInfo::~WW8TableInfo()
581 {
582 }
583
584 WW8TableNodeInfo *
processSwTableByLayout(const SwTable * pTable)585 WW8TableInfo::processSwTableByLayout(const SwTable * pTable)
586 {
587 SwTableCellInfo aTableCellInfo(pTable);
588 WW8TableNodeInfo * pPrev = NULL;
589
590 while (aTableCellInfo.getNext())
591 {
592 SwRect aRect = aTableCellInfo.getRect();
593
594 #ifdef DEBUG
595 static char sBuffer[1024];
596 ::std::clog << "<CellFrm>" << ::std::endl;
597
598 snprintf(sBuffer, sizeof(sBuffer),
599 "<rect top=\"%ld\" bottom=\"%ld\" left=\"%ld\" right=\"%ld\"/>",
600 aRect.Top(), aRect.Bottom(), aRect.Left(), aRect.Right());
601 ::std::clog << sBuffer << ::std::endl;
602 #endif
603 const SwTableBox * pTableBox = aTableCellInfo.getTableBox();
604 const SwStartNode * pSttNd = pTableBox->GetSttNd();
605
606 if (pSttNd != NULL)
607 {
608 SwPaM aPam(*pSttNd, 0);
609
610 bool bDone = false;
611 do
612 {
613 SwNode & rNode = aPam.GetPoint()->nNode.GetNode();
614
615 insertTableNodeInfo(&rNode, pTable, pTableBox, 0, 0, 1, & aRect);
616
617 if (rNode.IsEndNode())
618 {
619 SwEndNode * pEndNode = rNode.GetEndNode();
620 SwStartNode * pTmpSttNd = pEndNode->StartOfSectionNode();
621
622 if (pTmpSttNd == pSttNd)
623 bDone = true;
624 }
625
626 aPam.GetPoint()->nNode++;
627 }
628 while (!bDone);
629 }
630
631 #ifdef DEBUG
632 ::std::clog << "</CellFrm>" << ::std::endl;
633 #endif
634 }
635
636 pPrev = reorderByLayout(pTable);
637
638 return pPrev;
639 }
640
processSwTable(const SwTable * pTable)641 void WW8TableInfo::processSwTable(const SwTable * pTable)
642 {
643 #ifdef DEBUG
644 ::std::clog << "<processSwTable>" << ::std::endl;
645 #endif
646
647 WW8TableNodeInfo * pPrev = NULL;
648
649 SwFrmFmt * pFrmFmt = pTable->GetFrmFmt();
650 if (pFrmFmt != NULL && pTable->IsTblComplex())
651 {
652 pPrev = processSwTableByLayout(pTable);
653
654 #ifdef DEBUG
655 WW8TableCellGrid::Pointer_t pCellGrid(getCellGridForTable(pTable));
656 ::std::clog << pCellGrid->toString() << ::std::endl;
657 #endif
658 }
659 else
660 {
661 const SwTableLines & rLines = pTable->GetTabLines();
662
663 for (sal_uInt16 n = 0; n < rLines.Count(); n++)
664 {
665 const SwTableLine * pLine = rLines[n];
666
667 pPrev = processTableLine(pTable, pLine, n, 1, pPrev);
668 }
669
670 }
671
672 if (pPrev != NULL)
673 {
674 SwTableNode * pTableNode = pTable->GetTableNode();
675 SwEndNode * pEndNode = pTableNode->EndOfSectionNode();
676
677 pPrev->setNextNode(pEndNode);
678 }
679 #ifdef DEBUG
680 ::std::clog << "</processSwTable>" << ::std::endl;
681 #endif
682 }
683
684 WW8TableNodeInfo *
processTableLine(const SwTable * pTable,const SwTableLine * pTableLine,sal_uInt32 nRow,sal_uInt32 nDepth,WW8TableNodeInfo * pPrev)685 WW8TableInfo::processTableLine(const SwTable * pTable,
686 const SwTableLine * pTableLine,
687 sal_uInt32 nRow,
688 sal_uInt32 nDepth, WW8TableNodeInfo * pPrev)
689 {
690 #ifdef DEBUG
691 ::std::clog << "<processTableLine row=\"" << nRow << "\" depth=\""
692 << nDepth << "\">" << ::std::endl;
693 #endif
694
695 const SwTableBoxes & rBoxes = pTableLine->GetTabBoxes();
696
697 WW8TableNodeInfo::Pointer_t pTextNodeInfo;
698
699 for (sal_uInt16 n = 0; n < rBoxes.Count(); n++)
700 {
701 const SwTableBox * pBox = rBoxes[n];
702
703 pPrev = processTableBox(pTable, pBox, nRow, n, nDepth, n == rBoxes.Count() - 1, pPrev);
704 }
705
706 #ifdef DEBUG
707 ::std::clog << "</processTableLine>" << ::std::endl;
708 #endif
709
710 return pPrev;
711 }
712
713 WW8TableNodeInfo::Pointer_t
processTableBoxLines(const SwTableBox * pBox,const SwTable * pTable,const SwTableBox * pBoxToSet,sal_uInt32 nRow,sal_uInt32 nCell,sal_uInt32 nDepth)714 WW8TableInfo::processTableBoxLines(const SwTableBox * pBox,
715 const SwTable * pTable,
716 const SwTableBox * pBoxToSet,
717 sal_uInt32 nRow,
718 sal_uInt32 nCell,
719 sal_uInt32 nDepth)
720 {
721 #ifdef DEBUG
722 ::std::clog << "<processTableBoxLines depth=\"" << nDepth
723 << "\" row=\"" << nRow << "\" cell=\"" << nCell << "\">" << ::std::endl;
724 #endif
725
726 const SwTableLines & rLines = pBox->GetTabLines();
727 WW8TableNodeInfo::Pointer_t pNodeInfo;
728
729 if (rLines.Count() > 0)
730 {
731 for (sal_uInt32 n = 0; n < rLines.Count(); n++)
732 {
733 const SwTableLine * pLine = rLines[n];
734 const SwTableBoxes & rBoxes = pLine->GetTabBoxes();
735
736 for (sal_uInt16 nBox = 0; nBox < rBoxes.Count(); nBox++)
737 pNodeInfo = processTableBoxLines(rBoxes[nBox], pTable, pBoxToSet, nRow, nCell, nDepth);
738 }
739 }
740 else
741 {
742 const SwStartNode * pSttNd = pBox->GetSttNd();
743 const SwEndNode * pEndNd = pSttNd->EndOfSectionNode();
744 SwPaM aPaM(*pSttNd, 0);
745 SwPaM aEndPaM(*pEndNd, 0);
746
747 bool bDone = false;
748 while (!bDone)
749 {
750 SwNode & rNode = aPaM.GetPoint()->nNode.GetNode();
751
752 pNodeInfo = insertTableNodeInfo(&rNode, pTable, pBoxToSet, nRow, nCell, nDepth);
753
754 if (aPaM.GetPoint()->nNode == aEndPaM.GetPoint()->nNode)
755 bDone = true;
756 else
757 aPaM.GetPoint()->nNode++;
758 }
759 }
760
761 #ifdef DEBUG
762 ::std::clog << "</processTableBoxLines>" << ::std::endl;
763 #endif
764
765 return pNodeInfo;
766 }
767
768 WW8TableNodeInfo *
processTableBox(const SwTable * pTable,const SwTableBox * pBox,sal_uInt32 nRow,sal_uInt32 nCell,sal_uInt32 nDepth,bool bEndOfLine,WW8TableNodeInfo * pPrev)769 WW8TableInfo::processTableBox(const SwTable * pTable,
770 const SwTableBox * pBox,
771 sal_uInt32 nRow,
772 sal_uInt32 nCell,
773 sal_uInt32 nDepth,
774 bool bEndOfLine,
775 WW8TableNodeInfo * pPrev)
776 {
777 #ifdef DEBUG
778 ::std::clog << "<processTableBox row=\"" << nRow << "\" cell=\"" << nCell
779 << "\" depth=\"" << nDepth << "\">" << ::std::endl;
780 #endif
781
782 WW8TableNodeInfo::Pointer_t pNodeInfo;
783 const SwTableLines & rLines = pBox->GetTabLines();
784 const SwStartNode * pSttNd = pBox->GetSttNd();
785 WW8TableNodeInfo::Pointer_t pEndOfCellInfo;
786
787 if (rLines.Count() > 0)
788 {
789 pNodeInfo = processTableBoxLines(pBox, pTable, pBox, nRow, nCell, nDepth);
790 pNodeInfo->setEndOfCell(true);
791 if (bEndOfLine)
792 pNodeInfo->setEndOfLine(true);
793
794 for (sal_uInt32 n = 0; n < rLines.Count(); n++)
795 {
796 const SwTableLine * pLine = rLines[n];
797
798 pPrev = processTableLine(pTable, pLine, n, 1, pPrev);
799 }
800 }
801 else
802 {
803 SwPaM aPaM(*pSttNd, 0);
804
805 bool bDone = false;
806 sal_uInt32 nDepthInsideCell = 0;
807
808 do
809 {
810 SwNode & rNode = aPaM.GetPoint()->nNode.GetNode();
811
812 if (rNode.IsStartNode())
813 {
814 if (nDepthInsideCell > 0)
815 pEndOfCellInfo.reset();
816
817 nDepthInsideCell++;
818 }
819
820 pNodeInfo = insertTableNodeInfo(&rNode, pTable, pBox, nRow, nCell, nDepth);
821
822 if (pPrev != NULL)
823 pPrev->setNext(pNodeInfo.get());
824
825 pPrev = pNodeInfo.get();
826
827 if (nDepthInsideCell == 1 && rNode.IsTxtNode())
828 pEndOfCellInfo = pNodeInfo;
829
830 if (rNode.IsEndNode())
831 {
832 nDepthInsideCell--;
833
834 if (nDepthInsideCell == 0 && pEndOfCellInfo.get() == NULL)
835 pEndOfCellInfo = pNodeInfo;
836
837 SwEndNode * pEndNode = rNode.GetEndNode( );
838 SwStartNode * pTmpSttNd = pEndNode->StartOfSectionNode();
839 if (pTmpSttNd == pSttNd)
840 bDone = true;
841 }
842
843 aPaM.GetPoint()->nNode++;
844 }
845 while (!bDone);
846
847 if (pEndOfCellInfo.get() != NULL)
848 {
849 pEndOfCellInfo->setEndOfCell(true);
850
851 if (bEndOfLine)
852 pEndOfCellInfo->setEndOfLine(true);
853 }
854 }
855
856 #ifdef DEBUG
857 ::std::clog << "</processTableBox>" << ::std::endl;
858 #endif
859
860 return pPrev;
861 }
862
insertTableNodeInfo(const SwNode * pNode,const SwTable * pTable,const SwTableBox * pTableBox,sal_uInt32 nRow,sal_uInt32 nCell,sal_uInt32 nDepth,SwRect * pRect)863 WW8TableNodeInfo::Pointer_t WW8TableInfo::insertTableNodeInfo
864 (const SwNode * pNode,
865 const SwTable * pTable,
866 const SwTableBox * pTableBox,
867 sal_uInt32 nRow,
868 sal_uInt32 nCell,
869 sal_uInt32 nDepth,
870 SwRect * pRect)
871 {
872 WW8TableNodeInfo::Pointer_t pNodeInfo = getTableNodeInfo(pNode);
873
874 if (pNodeInfo.get() == NULL)
875 {
876 pNodeInfo =
877 WW8TableNodeInfo::Pointer_t(new WW8TableNodeInfo(this, pNode));
878 mMap.insert(Map_t::value_type(pNode, pNodeInfo));
879 }
880
881 pNodeInfo->setDepth(nDepth + pNodeInfo->getDepth());
882
883 pNodeInfo->setTable(pTable);
884 pNodeInfo->setTableBox(pTableBox);
885
886 pNodeInfo->setCell(nCell);
887 pNodeInfo->setRow(nRow);
888
889 if (pNode->IsTxtNode())
890 {
891 FirstInTableMap_t::const_iterator aIt = mFirstInTableMap.find(pTable);
892 if (aIt == mFirstInTableMap.end())
893 {
894 mFirstInTableMap[pTable] = pNode;
895 pNodeInfo->setFirstInTable(true);
896 }
897 }
898
899 if (pRect)
900 {
901 WW8TableCellGrid::Pointer_t pCellGrid = getCellGridForTable(pTable);
902
903 pCellGrid->insert(*pRect, pNodeInfo.get());
904 pNodeInfo->setRect(*pRect);
905 }
906
907 #ifdef DEBUG
908 ::std::clog << pNodeInfo->toString() << ::std::endl;
909 #endif
910
911 return pNodeInfo;
912 }
913
getCellGridForTable(const SwTable * pTable,bool bCreate)914 WW8TableCellGrid::Pointer_t WW8TableInfo::getCellGridForTable
915 (const SwTable * pTable, bool bCreate)
916 {
917 WW8TableCellGrid::Pointer_t pResult;
918 CellGridMap_t::iterator aIt = mCellGridMap.find(pTable);
919
920 if (aIt == mCellGridMap.end())
921 {
922 if (bCreate)
923 {
924 pResult = WW8TableCellGrid::Pointer_t(new WW8TableCellGrid);
925 mCellGridMap[pTable] = pResult;
926 }
927 }
928 else
929 pResult = mCellGridMap[pTable];
930
931 return pResult;
932 }
933
getTableNodeInfo(const SwNode * pNode)934 WW8TableNodeInfo::Pointer_t WW8TableInfo::getTableNodeInfo
935 (const SwNode * pNode)
936 {
937 WW8TableNodeInfo::Pointer_t pResult;
938 Map_t::iterator aIt = mMap.find(pNode);
939
940 if (aIt != mMap.end())
941 pResult = (*aIt).second;
942
943 return pResult;
944 }
945
getNextNode(const SwNode * pNode)946 const SwNode * WW8TableInfo::getNextNode(const SwNode * pNode)
947 {
948 const SwNode * pResult = NULL;
949
950 WW8TableNodeInfo::Pointer_t pNodeInfo = getTableNodeInfo(pNode);
951
952 if (pNodeInfo.get() != NULL)
953 {
954 WW8TableNodeInfo * pNextInfo = pNodeInfo->getNext();
955
956 if (pNextInfo != NULL)
957 pResult = pNextInfo->getNode();
958 else
959 {
960 const SwNode * pNextNode = pNodeInfo->getNextNode();
961
962 if (pNextNode != NULL)
963 pResult = pNextNode;
964 }
965 }
966
967 return pResult;
968 }
969
operator <(const WW8TableNodeInfo & rInfo) const970 bool WW8TableNodeInfo::operator < (const WW8TableNodeInfo & rInfo) const
971 {
972 bool bRet = false;
973
974 if (rInfo.mpNode != NULL)
975 {
976 if (mpNode == NULL)
977 {
978 bRet = true;
979 }
980 else
981 {
982 if (mpNode->GetIndex() < rInfo.mpNode->GetIndex())
983 bRet = true;
984 }
985 }
986
987 return bRet;
988 }
989
operator <(const CellInfo & aCellInfo) const990 bool CellInfo::operator < (const CellInfo & aCellInfo) const
991 {
992 bool aRet = false;
993
994 if (top() < aCellInfo.top())
995 aRet = true;
996 else if (top() == aCellInfo.top())
997 {
998 if (left() < aCellInfo.left())
999 aRet = true;
1000 else if (left() == aCellInfo.left())
1001 {
1002 if (width() < aCellInfo.width())
1003 aRet = true;
1004 else if (width() == aCellInfo.width())
1005 {
1006 if (height() < aCellInfo.height())
1007 aRet = true;
1008 else if (height() == aCellInfo.height())
1009 {
1010 if (aCellInfo.getTableNodeInfo() != NULL)
1011 {
1012 if (m_pNodeInfo == NULL)
1013 aRet = true;
1014 else
1015 {
1016 aRet = *m_pNodeInfo < *aCellInfo.getTableNodeInfo();
1017 }
1018 }
1019 }
1020 }
1021 }
1022 }
1023
1024 return aRet;
1025 }
1026
toString() const1027 ::std::string CellInfo::toString() const
1028 {
1029 static char sBuffer[256];
1030
1031 snprintf(sBuffer, sizeof(sBuffer),
1032 "<cellinfo left=\"%ld\""
1033 " right=\"%ld\""
1034 " top=\"%ld\""
1035 " bottom=\"%ld\""
1036 " node=\"%p\"/>",
1037 left(),
1038 right(),
1039 top(),
1040 bottom(),
1041 m_pNodeInfo);
1042
1043 return sBuffer;
1044 }
1045
reorderByLayout(const SwTable * pTable)1046 WW8TableNodeInfo * WW8TableInfo::reorderByLayout(const SwTable * pTable)
1047 {
1048 WW8TableNodeInfo * pPrev = NULL;
1049 WW8TableCellGrid::Pointer_t pCellGrid = getCellGridForTable(pTable);
1050
1051 #ifdef DEBUG
1052 ::std::clog << pCellGrid->toString() << ::std::endl;
1053 #endif
1054
1055 pCellGrid->addShadowCells();
1056 pPrev = pCellGrid->connectCells();
1057
1058 return pPrev;
1059 }
1060
WW8TableCellGrid()1061 WW8TableCellGrid::WW8TableCellGrid()
1062 {
1063 }
1064
~WW8TableCellGrid()1065 WW8TableCellGrid::~WW8TableCellGrid()
1066 {
1067 }
1068
getRow(long nTop,bool bCreate)1069 WW8TableCellGridRow::Pointer_t WW8TableCellGrid::getRow(long nTop, bool bCreate)
1070 {
1071 WW8TableCellGridRow::Pointer_t pResult;
1072
1073 RowTops_t::iterator aIt = m_aRowTops.find(nTop);
1074
1075 if (aIt == m_aRowTops.end())
1076 {
1077 if (bCreate)
1078 {
1079 pResult = WW8TableCellGridRow::Pointer_t(new WW8TableCellGridRow);
1080 m_aRows[nTop] = pResult;
1081 m_aRowTops.insert(nTop);
1082 }
1083 }
1084 else
1085 pResult = m_aRows[nTop];
1086
1087 return pResult;
1088 }
1089
getRowTopsBegin() const1090 WW8TableCellGrid::RowTops_t::const_iterator WW8TableCellGrid::getRowTopsBegin() const
1091 {
1092 return m_aRowTops.begin();
1093 }
1094
getRowTopsEnd() const1095 WW8TableCellGrid::RowTops_t::const_iterator WW8TableCellGrid::getRowTopsEnd() const
1096 {
1097 return m_aRowTops.end();
1098 }
1099
getCellsBegin(long nTop)1100 CellInfoMultiSet::const_iterator WW8TableCellGrid::getCellsBegin(long nTop)
1101 {
1102 return getRow(nTop)->begin();
1103 }
1104
getCellsEnd(long nTop)1105 CellInfoMultiSet::const_iterator WW8TableCellGrid::getCellsEnd(long nTop)
1106 {
1107 return getRow(nTop)->end();
1108 }
1109
insert(const SwRect & rRect,WW8TableNodeInfo * pNodeInfo,unsigned long * pFmtFrmWidth)1110 void WW8TableCellGrid::insert(const SwRect & rRect,
1111 WW8TableNodeInfo * pNodeInfo,
1112 unsigned long * pFmtFrmWidth)
1113 {
1114 CellInfo aCellInfo(rRect, pNodeInfo);
1115
1116 if (pFmtFrmWidth != NULL)
1117 aCellInfo.setFmtFrmWidth(*pFmtFrmWidth);
1118
1119 WW8TableCellGridRow::Pointer_t pRow = getRow(rRect.Top());
1120 pRow->insert(aCellInfo);
1121 }
1122
addShadowCells()1123 void WW8TableCellGrid::addShadowCells()
1124 {
1125 #ifdef DEBUG
1126 ::std::clog << "<addShadowCells>" << ::std::endl;
1127 #endif
1128
1129 RowTops_t::const_iterator aTopsIt = getRowTopsBegin();
1130
1131 while (aTopsIt != getRowTopsEnd())
1132 {
1133 #ifdef DEBUG
1134 long nTop = *aTopsIt;
1135 (void) nTop;
1136 #endif
1137 CellInfoMultiSet::const_iterator aCellIt = getCellsBegin(*aTopsIt);
1138 CellInfoMultiSet::const_iterator aCellEndIt = getCellsEnd(*aTopsIt);
1139
1140 RowSpansPtr pRowSpans(new RowSpans);
1141
1142 bool bBeginningOfCell = true;
1143 bool bVertMerge = false;
1144 SwRect aRect = aCellIt->getRect();
1145 long nRowSpan = 1;
1146 while (aCellIt != aCellEndIt)
1147 {
1148 WW8TableNodeInfo * pNodeInfo = aCellIt->getTableNodeInfo();
1149
1150 if (bBeginningOfCell)
1151 {
1152 RowTops_t::const_iterator aRowSpanIt(aTopsIt);
1153 aRowSpanIt++;
1154
1155 if (aRowSpanIt != getRowTopsEnd() &&
1156 *aRowSpanIt < aCellIt->bottom())
1157 {
1158 aRect.Top(*aRowSpanIt);
1159 unsigned long nFmtFrmWidth = aCellIt->getFmtFrmWidth();
1160 insert(aRect, NULL, &nFmtFrmWidth);
1161
1162 bVertMerge = true;
1163 }
1164 else
1165 bVertMerge = false;
1166
1167 nRowSpan = 1;
1168 while (aRowSpanIt != getRowTopsEnd() &&
1169 *aRowSpanIt < aCellIt->bottom())
1170 {
1171 aRowSpanIt++;
1172 nRowSpan++;
1173 }
1174
1175 if (pNodeInfo != NULL)
1176 pRowSpans->push_back(nRowSpan);
1177 else
1178 pRowSpans->push_back(-nRowSpan);
1179 }
1180
1181 if (pNodeInfo != NULL)
1182 {
1183 pNodeInfo->setVertMerge(bVertMerge);
1184 }
1185
1186 aCellIt++;
1187
1188 bBeginningOfCell = (aRect.Left() != aCellIt->left());
1189 aRect = aCellIt->getRect();
1190 }
1191
1192 WW8TableCellGridRow::Pointer_t pRow = getRow(*aTopsIt);
1193 if (pRow.get() != NULL)
1194 pRow->setRowSpans(pRowSpans);
1195
1196 aTopsIt++;
1197 }
1198 #ifdef DEBUG
1199 ::std::clog << "</addShadowCells>" << ::std::endl;
1200 #endif
1201 }
1202
connectCells()1203 WW8TableNodeInfo * WW8TableCellGrid::connectCells()
1204 {
1205 RowTops_t::const_iterator aTopsIt = getRowTopsBegin();
1206 sal_uInt32 nRow = 0;
1207 WW8TableNodeInfo * pLastNodeInfo = NULL;
1208
1209 while (aTopsIt != getRowTopsEnd())
1210 {
1211 CellInfoMultiSet::const_iterator aCellIt = getCellsBegin(*aTopsIt);
1212 CellInfoMultiSet::const_iterator aCellEndIt = getCellsEnd(*aTopsIt);
1213 GridColsPtr pWidths(new Widths);
1214 TableBoxVectorPtr pTableBoxes(new TableBoxVector);
1215
1216 sal_uInt32 nShadows = 0;
1217 sal_uInt32 nCell = 0;
1218 bool bBeginningOfCell = true;
1219 WW8TableNodeInfo * pEndOfCellInfo = NULL;
1220 sal_uInt32 nDepthInCell = 0;
1221 while (aCellIt != aCellEndIt)
1222 {
1223 long nCellX = aCellIt->left();
1224 WW8TableNodeInfo * pNodeInfo = aCellIt->getTableNodeInfo();
1225 if (pNodeInfo != NULL)
1226 {
1227 const SwNode * pNode = pNodeInfo->getNode();
1228
1229 if (pNode->IsStartNode())
1230 {
1231 nDepthInCell++;
1232 pEndOfCellInfo = NULL;
1233 }
1234
1235 if (nDepthInCell == 1 && pNode->IsTxtNode())
1236 pEndOfCellInfo = pNodeInfo;
1237
1238 pNodeInfo->setShadowsBefore(nShadows);
1239 pNodeInfo->setCell(nCell);
1240 pNodeInfo->setRow(nRow);
1241 if (pLastNodeInfo != NULL)
1242 {
1243 pLastNodeInfo->setNext(pNodeInfo);
1244 pLastNodeInfo->setNextNode(pNode);
1245 }
1246 pLastNodeInfo = pNodeInfo;
1247 nShadows = 0;
1248
1249 if (pNode->IsEndNode())
1250 {
1251 nDepthInCell--;
1252
1253 if (nDepthInCell == 0 && pEndOfCellInfo == NULL)
1254 pEndOfCellInfo = pNodeInfo;
1255 }
1256 }
1257 else
1258 {
1259 nShadows++;
1260 }
1261
1262 if (bBeginningOfCell)
1263 {
1264 pWidths->push_back(aCellIt->getFmtFrmWidth());
1265
1266 if (pNodeInfo != NULL)
1267 pTableBoxes->push_back(pNodeInfo->getTableBox());
1268 else
1269 pTableBoxes->push_back(NULL);
1270 }
1271
1272 aCellIt++;
1273 bBeginningOfCell = false;
1274
1275 if (aCellIt != aCellEndIt && aCellIt->left() != nCellX)
1276 {
1277 nCell++;
1278 bBeginningOfCell = true;
1279
1280 if (pEndOfCellInfo != NULL)
1281 {
1282 pEndOfCellInfo->setEndOfCell(true);
1283 }
1284
1285 pEndOfCellInfo = NULL;
1286 }
1287 }
1288
1289 pLastNodeInfo->setShadowsAfter(nShadows);
1290
1291 if (pEndOfCellInfo == NULL)
1292 {
1293 pEndOfCellInfo = pLastNodeInfo;
1294 }
1295
1296 pEndOfCellInfo->setEndOfCell(true);
1297 pLastNodeInfo->setEndOfLine(true);
1298
1299 WW8TableCellGridRow::Pointer_t pRow(getRow(*aTopsIt));
1300 pRow->setTableBoxVector(pTableBoxes);
1301 pRow->setWidths(pWidths);
1302
1303 nShadows = 0;
1304
1305 aTopsIt++;
1306 nRow++;
1307 }
1308
1309 return pLastNodeInfo;
1310 }
1311
toString()1312 string WW8TableCellGrid::toString()
1313 {
1314 string sResult = "<WW8TableCellGrid>";
1315
1316 RowTops_t::const_iterator aTopsIt = getRowTopsBegin();
1317 static char sBuffer[1024];
1318 while (aTopsIt != getRowTopsEnd())
1319 {
1320 sprintf(sBuffer, "<row y=\"%ld\">", *aTopsIt);
1321 sResult += sBuffer;
1322
1323 CellInfoMultiSet::const_iterator aCellIt = getCellsBegin(*aTopsIt);
1324 CellInfoMultiSet::const_iterator aCellsEnd = getCellsEnd(*aTopsIt);
1325
1326 while (aCellIt != aCellsEnd)
1327 {
1328 snprintf(sBuffer, sizeof(sBuffer), "<cellInfo top=\"%ld\" bottom=\"%ld\" left=\"%ld\" right=\"%ld\">",
1329 aCellIt->top(), aCellIt->bottom(), aCellIt->left(), aCellIt->right());
1330 sResult += sBuffer;
1331
1332 WW8TableNodeInfo * pInfo = aCellIt->getTableNodeInfo();
1333 if (pInfo != NULL)
1334 sResult += pInfo->toString();
1335 else
1336 sResult += "<shadow/>\n";
1337
1338 sResult += "</cellInfo>\n";
1339 aCellIt++;
1340 }
1341
1342 WW8TableCellGridRow::Pointer_t pRow = getRow(*aTopsIt);
1343 WidthsPtr pWidths = pRow->getWidths();
1344 if( bool(pWidths))
1345 {
1346 sResult += "<widths>";
1347
1348 Widths::const_iterator aItEnd = pWidths->end();
1349 for (Widths::const_iterator aIt = pWidths->begin();
1350 aIt != aItEnd;
1351 aIt++)
1352 {
1353 if (aIt != pWidths->begin())
1354 sResult += ", ";
1355
1356 snprintf(sBuffer, sizeof(sBuffer), "%" SAL_PRIxUINT32 "", *aIt);
1357 sResult += sBuffer;
1358 }
1359
1360 sResult += "</widths>";
1361 }
1362
1363 RowSpansPtr pRowSpans = pRow->getRowSpans();
1364 if (pRowSpans.get() != NULL)
1365 {
1366 sResult += "<rowspans>";
1367
1368 RowSpans::const_iterator aItEnd = pRowSpans->end();
1369 for (RowSpans::const_iterator aIt = pRowSpans->begin();
1370 aIt != aItEnd;
1371 aIt++)
1372 {
1373 if (aIt != pRowSpans->begin())
1374 sResult += ", ";
1375
1376 snprintf(sBuffer, sizeof(sBuffer), "%" SAL_PRIxUINT32 "", *aIt);
1377 sResult += sBuffer;
1378 }
1379
1380 sResult += "</rowspans>";
1381 }
1382
1383 sResult += "</row>\n";
1384 aTopsIt++;
1385 }
1386
1387 sResult += "</WW8TableCellGrid>\n";
1388
1389 return sResult;
1390 }
1391
getTableBoxesOfRow(WW8TableNodeInfoInner * pNodeInfoInner)1392 TableBoxVectorPtr WW8TableCellGrid::getTableBoxesOfRow
1393 (WW8TableNodeInfoInner * pNodeInfoInner)
1394 {
1395 TableBoxVectorPtr pResult;
1396 WW8TableCellGridRow::Pointer_t pRow =
1397 getRow(pNodeInfoInner->getRect().Top(), false);
1398
1399 if (pRow.get() != NULL)
1400 {
1401 pResult = pRow->getTableBoxVector();
1402 }
1403
1404 return pResult;
1405 }
1406
getWidthsOfRow(WW8TableNodeInfoInner * pNodeInfoInner)1407 WidthsPtr WW8TableCellGrid::getWidthsOfRow
1408 (WW8TableNodeInfoInner * pNodeInfoInner)
1409 {
1410 GridColsPtr pResult;
1411
1412 WW8TableCellGridRow::Pointer_t pRow =
1413 getRow(pNodeInfoInner->getRect().Top(), false);
1414
1415 if (pRow.get() != NULL)
1416 {
1417 pResult = pRow->getWidths();
1418 }
1419
1420 return pResult;
1421 }
1422
getRowSpansOfRow(WW8TableNodeInfoInner * pNodeInfoInner)1423 RowSpansPtr WW8TableCellGrid::getRowSpansOfRow
1424 (WW8TableNodeInfoInner * pNodeInfoInner)
1425 {
1426 RowSpansPtr pResult;
1427
1428 WW8TableCellGridRow::Pointer_t pRow =
1429 getRow(pNodeInfoInner->getRect().Top(), false);
1430
1431 if (pRow.get() != NULL)
1432 {
1433 pResult = pRow->getRowSpans();
1434 }
1435
1436 return pResult;
1437 }
1438
WW8TableCellGridRow()1439 WW8TableCellGridRow::WW8TableCellGridRow()
1440 : m_pCellInfos(new CellInfoMultiSet)
1441 {
1442 }
1443
~WW8TableCellGridRow()1444 WW8TableCellGridRow::~WW8TableCellGridRow()
1445 {
1446 }
1447
insert(const CellInfo & rCellInfo)1448 void WW8TableCellGridRow::insert(const CellInfo & rCellInfo)
1449 {
1450 m_pCellInfos->insert(rCellInfo);
1451
1452 #ifdef DEBUG
1453 ::std::clog << "<gridRowInsert>"
1454 << rCellInfo.toString()
1455 << "</gridRowInsert>"
1456 << ::std::endl;
1457 #endif
1458 }
1459
begin() const1460 CellInfoMultiSet::const_iterator WW8TableCellGridRow::begin() const
1461 {
1462 return m_pCellInfos->begin();
1463 }
1464
end() const1465 CellInfoMultiSet::const_iterator WW8TableCellGridRow::end() const
1466 {
1467 return m_pCellInfos->end();
1468 }
1469
setTableBoxVector(TableBoxVectorPtr pTableBoxVector)1470 void WW8TableCellGridRow::setTableBoxVector(TableBoxVectorPtr pTableBoxVector)
1471 {
1472 m_pTableBoxVector = pTableBoxVector;
1473 }
1474
setWidths(WidthsPtr pWidths)1475 void WW8TableCellGridRow::setWidths(WidthsPtr pWidths)
1476 {
1477 m_pWidths = pWidths;
1478 }
1479
setRowSpans(RowSpansPtr pRowSpans)1480 void WW8TableCellGridRow::setRowSpans(RowSpansPtr pRowSpans)
1481 {
1482 m_pRowSpans = pRowSpans;
1483 }
1484
getTableBoxVector() const1485 TableBoxVectorPtr WW8TableCellGridRow::getTableBoxVector() const
1486 {
1487 return m_pTableBoxVector;
1488 }
1489
getWidths() const1490 WidthsPtr WW8TableCellGridRow::getWidths() const
1491 {
1492 return m_pWidths;
1493 }
1494
getRowSpans() const1495 RowSpansPtr WW8TableCellGridRow::getRowSpans() const
1496 {
1497 return m_pRowSpans;
1498 }
1499
CellInfo(const SwRect & aRect,WW8TableNodeInfo * pNodeInfo)1500 CellInfo::CellInfo(const SwRect & aRect, WW8TableNodeInfo * pNodeInfo)
1501 : m_aRect(aRect), m_pNodeInfo(pNodeInfo), m_nFmtFrmWidth(0)
1502 {
1503 if (pNodeInfo != NULL)
1504 {
1505 const SwTableBox * pBox = pNodeInfo->getTableBox();
1506 const SwFrmFmt * pFrmFmt = pBox->GetFrmFmt();
1507 const SwFmtFrmSize & rSize = pFrmFmt->GetFrmSize();
1508
1509 m_nFmtFrmWidth = rSize.GetWidth();
1510 }
1511 }
1512
1513 }
1514