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 : #include <list>
21 : #include <utility>
22 : #include <vector>
23 :
24 : #include <svx/svxids.hrc>
25 : #include <editeng/memberids.hrc>
26 : #include <float.h>
27 : #include <swtypes.hxx>
28 : #include <cmdid.h>
29 : #include <unotbl.hxx>
30 : #include <unostyle.hxx>
31 : #include <section.hxx>
32 : #include <unocrsr.hxx>
33 : #include <svx/unomid.hxx>
34 : #include <hints.hxx>
35 : #include <swtblfmt.hxx>
36 : #include <doc.hxx>
37 : #include <IDocumentUndoRedo.hxx>
38 : #include <IDocumentContentOperations.hxx>
39 : #include <IDocumentFieldsAccess.hxx>
40 : #include <IDocumentState.hxx>
41 : #include <shellres.hxx>
42 : #include <docary.hxx>
43 : #include <ndole.hxx>
44 : #include <frame.hxx>
45 : #include <vcl/svapp.hxx>
46 : #include <fmtfsize.hxx>
47 : #include <tblafmt.hxx>
48 : #include <tabcol.hxx>
49 : #include <cellatr.hxx>
50 : #include <fmtpdsc.hxx>
51 : #include <pagedesc.hxx>
52 : #include <viewsh.hxx>
53 : #include <tabfrm.hxx>
54 : #include <redline.hxx>
55 : #include <unoport.hxx>
56 : #include <unoprnms.hxx>
57 : #include <unocrsrhelper.hxx>
58 : #include <com/sun/star/text/WrapTextMode.hpp>
59 : #include <com/sun/star/text/TextContentAnchorType.hpp>
60 : #include <com/sun/star/text/TableColumnSeparator.hpp>
61 : #include <com/sun/star/text/XTextSection.hpp>
62 : #include <com/sun/star/table/ShadowFormat.hpp>
63 : #include <com/sun/star/table/TableBorder.hpp>
64 : #include <com/sun/star/table/TableBorder2.hpp>
65 : #include <com/sun/star/table/BorderLine2.hpp>
66 : #include <com/sun/star/table/BorderLineStyle.hpp>
67 : #include <com/sun/star/table/TableBorderDistances.hpp>
68 : #include <com/sun/star/style/PageStyleLayout.hpp>
69 : #include <com/sun/star/style/BreakType.hpp>
70 : #include <com/sun/star/style/GraphicLocation.hpp>
71 : #include <com/sun/star/beans/PropertyAttribute.hpp>
72 : #include <com/sun/star/chart/XChartDataChangeEventListener.hpp>
73 : #include <com/sun/star/chart/ChartDataChangeEvent.hpp>
74 : #include <com/sun/star/chart2/data/XDataSequence.hpp>
75 : #include <com/sun/star/chart2/data/XLabeledDataSequence.hpp>
76 : #include <com/sun/star/table/CellContentType.hpp>
77 : #include <unotextrange.hxx>
78 : #include <unotextcursor.hxx>
79 : #include <unoparagraph.hxx>
80 : #include <svl/zforlist.hxx>
81 : #include <editeng/formatbreakitem.hxx>
82 : #include <editeng/shaditem.hxx>
83 : #include <editeng/lrspitem.hxx>
84 : #include <editeng/ulspitem.hxx>
85 : #include <fmtornt.hxx>
86 : #include <editeng/keepitem.hxx>
87 : #include <fmtlsplt.hxx>
88 : #include <swundo.hxx>
89 : #include <osl/mutex.hxx>
90 : #include <SwStyleNameMapper.hxx>
91 : #include <frmatr.hxx>
92 : #include <crsskip.hxx>
93 : #include <unochart.hxx>
94 : #include <sortopt.hxx>
95 : #include <rtl/math.hxx>
96 : #include <editeng/frmdiritem.hxx>
97 : #include <switerator.hxx>
98 : #include <comphelper/servicehelper.hxx>
99 : #include <comphelper/string.hxx>
100 : #include <cppuhelper/supportsservice.hxx>
101 : #include <comphelper/sequenceashashmap.hxx>
102 : #include <swtable.hxx>
103 :
104 : using namespace ::com::sun::star;
105 : using ::editeng::SvxBorderLine;
106 :
107 : #define UNO_TABLE_COLUMN_SUM 10000
108 :
109 4 : static void lcl_SendChartEvent(::cppu::OWeakObject & rSource,
110 : ::cppu::OInterfaceContainerHelper & rListeners)
111 : {
112 : //TODO: find appropriate settings of the Event
113 4 : chart::ChartDataChangeEvent event;
114 4 : event.Source = & rSource;
115 4 : event.Type = chart::ChartDataChangeType_ALL;
116 4 : event.StartColumn = 0;
117 4 : event.EndColumn = 1;
118 4 : event.StartRow = 0;
119 4 : event.EndRow = 1;
120 : rListeners.notifyEach(
121 4 : & chart::XChartDataChangeEventListener::chartDataChanged, event);
122 4 : }
123 :
124 6648 : static void lcl_SendChartEvent(::cppu::OWeakObject & rSource,
125 : ::cppu::OMultiTypeInterfaceContainerHelper & rListeners)
126 : {
127 : ::cppu::OInterfaceContainerHelper *const pContainer(rListeners.getContainer(
128 6648 : cppu::UnoType<chart::XChartDataChangeEventListener>::get()));
129 6648 : if (pContainer)
130 : {
131 4 : lcl_SendChartEvent(rSource, *pContainer);
132 : }
133 6648 : }
134 :
135 6408 : static bool lcl_LineToSvxLine(const table::BorderLine& rLine, SvxBorderLine& rSvxLine)
136 : {
137 6408 : rSvxLine.SetColor(Color(rLine.Color));
138 :
139 : rSvxLine.GuessLinesWidths( table::BorderLineStyle::NONE,
140 6408 : convertMm100ToTwip( rLine.OuterLineWidth ),
141 6408 : convertMm100ToTwip( rLine.InnerLineWidth ),
142 19224 : convertMm100ToTwip( rLine.LineDistance ) );
143 :
144 6408 : bool bRet = rLine.InnerLineWidth > 0 || rLine.OuterLineWidth > 0;
145 6408 : return bRet;
146 : }
147 :
148 2336 : static void lcl_SetSpecialProperty(SwFrmFmt* pFmt,
149 : const SfxItemPropertySimpleEntry* pEntry,
150 : const uno::Any& aValue)
151 : throw (lang::IllegalArgumentException,
152 : uno::RuntimeException)
153 : {
154 : // special treatment for "non-items"
155 2336 : switch(pEntry->nWID)
156 : {
157 : case FN_TABLE_HEADLINE_REPEAT:
158 : case FN_TABLE_HEADLINE_COUNT:
159 : {
160 1064 : SwTable* pTable = SwTable::FindTable( pFmt );
161 : {
162 1064 : UnoActionContext aAction(pFmt->GetDoc());
163 1064 : if( pEntry->nWID == FN_TABLE_HEADLINE_REPEAT)
164 : {
165 2 : bool bVal = *(sal_Bool*)aValue.getValue();
166 2 : pFmt->GetDoc()->SetRowsToRepeat( *pTable, bVal ? 1 : 0 );
167 : }
168 : else
169 : {
170 1062 : sal_Int32 nRepeat = 0;
171 1062 : aValue >>= nRepeat;
172 1062 : if( nRepeat >= 0 && nRepeat < USHRT_MAX )
173 1062 : pFmt->GetDoc()->SetRowsToRepeat( *pTable, (sal_uInt16) nRepeat );
174 1064 : }
175 : }
176 : }
177 1064 : break;
178 :
179 : case FN_TABLE_IS_RELATIVE_WIDTH:
180 : case FN_TABLE_WIDTH:
181 : case FN_TABLE_RELATIVE_WIDTH:
182 : {
183 1214 : SwFmtFrmSize aSz( pFmt->GetFrmSize() );
184 1214 : if(FN_TABLE_WIDTH == pEntry->nWID)
185 : {
186 928 : sal_Int32 nWidth = 0;
187 928 : aValue >>= nWidth;
188 928 : aSz.SetWidthPercent(0);
189 928 : aSz.SetWidth ( convertMm100ToTwip ( nWidth ) );
190 : }
191 286 : else if(FN_TABLE_RELATIVE_WIDTH == pEntry->nWID)
192 : {
193 148 : sal_Int16 nSet = 0;
194 148 : aValue >>= nSet;
195 148 : if(nSet && nSet <=100)
196 148 : aSz.SetWidthPercent( (sal_uInt8)nSet );
197 : }
198 138 : else if(FN_TABLE_IS_RELATIVE_WIDTH == pEntry->nWID)
199 : {
200 138 : bool bPercent = *(sal_Bool*)aValue.getValue();
201 138 : if(!bPercent)
202 2 : aSz.SetWidthPercent(0);
203 : else
204 : {
205 136 : lang::IllegalArgumentException aExcept;
206 136 : aExcept.Message = "relative width cannot be switched on with this property";
207 136 : throw aExcept;
208 : }
209 : }
210 1214 : pFmt->GetDoc()->SetAttr(aSz, *pFmt);
211 : }
212 1078 : break;
213 :
214 : case RES_PAGEDESC:
215 : {
216 58 : OUString sPageStyle;
217 58 : aValue >>= sPageStyle;
218 58 : const SwPageDesc* pDesc = 0;
219 58 : if (!sPageStyle.isEmpty())
220 : {
221 58 : SwStyleNameMapper::FillUIName(sPageStyle, sPageStyle, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, true );
222 58 : pDesc = SwPageDesc::GetByName(*pFmt->GetDoc(), sPageStyle);
223 : }
224 116 : SwFmtPageDesc aDesc( pDesc );
225 116 : pFmt->GetDoc()->SetAttr(aDesc, *pFmt);
226 : }
227 58 : break;
228 :
229 : default:
230 0 : throw lang::IllegalArgumentException();
231 : }
232 2200 : }
233 :
234 504 : static uno::Any lcl_GetSpecialProperty(SwFrmFmt* pFmt, const SfxItemPropertySimpleEntry* pEntry )
235 : {
236 504 : uno::Any aRet;
237 504 : switch(pEntry->nWID)
238 : {
239 : case FN_TABLE_HEADLINE_REPEAT:
240 : case FN_TABLE_HEADLINE_COUNT:
241 : {
242 4 : SwTable* pTable = SwTable::FindTable( pFmt );
243 4 : const sal_uInt16 nRepeat = pTable->GetRowsToRepeat();
244 4 : if(pEntry->nWID == FN_TABLE_HEADLINE_REPEAT)
245 : {
246 4 : sal_Bool bTemp = nRepeat > 0;
247 4 : aRet.setValue(&bTemp, ::getCppuBooleanType());
248 : }
249 : else
250 0 : aRet <<= (sal_Int32)nRepeat;
251 : }
252 4 : break;
253 :
254 : case FN_TABLE_WIDTH:
255 : case FN_TABLE_IS_RELATIVE_WIDTH:
256 : case FN_TABLE_RELATIVE_WIDTH:
257 : {
258 488 : const SwFmtFrmSize& rSz = pFmt->GetFrmSize();
259 488 : if(FN_TABLE_WIDTH == pEntry->nWID)
260 108 : rSz.QueryValue(aRet, MID_FRMSIZE_WIDTH|CONVERT_TWIPS);
261 380 : else if(FN_TABLE_RELATIVE_WIDTH == pEntry->nWID)
262 14 : rSz.QueryValue(aRet, MID_FRMSIZE_REL_WIDTH);
263 : else
264 : {
265 366 : sal_Bool bTemp = 0 != rSz.GetWidthPercent();
266 366 : aRet.setValue(&bTemp, ::getBooleanCppuType());
267 : }
268 : }
269 488 : break;
270 :
271 : case RES_PAGEDESC:
272 : {
273 4 : const SfxItemSet& rSet = pFmt->GetAttrSet();
274 : const SfxPoolItem* pItem;
275 4 : OUString sPDesc;
276 4 : if(SfxItemState::SET == rSet.GetItemState(RES_PAGEDESC, false, &pItem))
277 : {
278 2 : const SwPageDesc* pDsc = ((const SwFmtPageDesc*)pItem)->GetPageDesc();
279 2 : if(pDsc)
280 : {
281 2 : sPDesc = SwStyleNameMapper::GetProgName(pDsc->GetName(), nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC );
282 : }
283 : }
284 4 : aRet <<= sPDesc;
285 : }
286 4 : break;
287 :
288 : case RES_ANCHOR :
289 0 : aRet <<= text::TextContentAnchorType_AT_PARAGRAPH;
290 0 : break;
291 :
292 : case FN_UNO_ANCHOR_TYPES :
293 : {
294 4 : uno::Sequence<text::TextContentAnchorType> aTypes(1);
295 4 : text::TextContentAnchorType* pArray = aTypes.getArray();
296 4 : pArray[0] = text::TextContentAnchorType_AT_PARAGRAPH;
297 4 : aRet <<= aTypes;
298 : }
299 4 : break;
300 :
301 : case FN_UNO_WRAP :
302 : {
303 0 : aRet <<= text::WrapTextMode_NONE;
304 : }
305 0 : break;
306 :
307 : case FN_PARAM_LINK_DISPLAY_NAME :
308 0 : aRet <<= pFmt->GetName();
309 0 : break;
310 :
311 : case FN_UNO_REDLINE_NODE_START:
312 : case FN_UNO_REDLINE_NODE_END:
313 : {
314 4 : SwTable* pTable = SwTable::FindTable( pFmt );
315 4 : SwNode* pTblNode = pTable->GetTableNode();
316 4 : if(FN_UNO_REDLINE_NODE_END == pEntry->nWID)
317 2 : pTblNode = pTblNode->EndOfSectionNode();
318 4 : const SwRedlineTbl& rRedTbl = pFmt->GetDoc()->getIDocumentRedlineAccess().GetRedlineTbl();
319 4 : for(size_t nRed = 0; nRed < rRedTbl.size(); ++nRed)
320 : {
321 0 : const SwRangeRedline* pRedline = rRedTbl[nRed];
322 0 : const SwNode& rRedPointNode = pRedline->GetNode(true);
323 0 : const SwNode& rRedMarkNode = pRedline->GetNode(false);
324 0 : if(&rRedPointNode == pTblNode || &rRedMarkNode == pTblNode)
325 : {
326 0 : const SwNode& rStartOfRedline = SwNodeIndex(rRedPointNode) <= SwNodeIndex(rRedMarkNode) ?
327 0 : rRedPointNode : rRedMarkNode;
328 0 : bool bIsStart = &rStartOfRedline == pTblNode;
329 0 : aRet <<= SwXRedlinePortion::CreateRedlineProperties(*pRedline, bIsStart);
330 0 : break;
331 : }
332 : }
333 : }
334 4 : break;
335 : }
336 504 : return aRet;
337 : }
338 :
339 : /** get position of a cell with a given name
340 : *
341 : * If everything was OK, the indices for column and row are changed (both >= 0).
342 : * In case of errors, at least one of them is < 0.
343 : *
344 : * Also since the implementations of tables does not really have columns using
345 : * this function is appropriate only for tables that are not complex (i.e.
346 : * where IsTblComplex() returns false).
347 : *
348 : * @param rCellName e.g. A1..Z1, a1..z1, AA1..AZ1, Aa1..Az1, BA1..BZ1, Ba1..Bz1, ...
349 : * @param [IN,OUT] rColumn (0-based)
350 : * @param [IN,OUT] rRow (0-based)
351 : */
352 : //TODO: potential for throwing proper exceptions instead of having every caller to check for errors
353 8 : void sw_GetCellPosition(const OUString &rCellName,
354 : sal_Int32 &rColumn, sal_Int32 &rRow)
355 : {
356 8 : rColumn = rRow = -1; // default return values indicating failure
357 8 : const sal_Int32 nLen = rCellName.getLength();
358 8 : if (nLen)
359 : {
360 8 : sal_Int32 nRowPos = 0;
361 24 : while (nRowPos<nLen)
362 : {
363 16 : if (rCellName[nRowPos]>='0' && rCellName[nRowPos]<='9')
364 : {
365 8 : break;
366 : }
367 8 : ++nRowPos;
368 : }
369 8 : if (nRowPos>0 && nRowPos<nLen)
370 : {
371 8 : sal_Int32 nColIdx = 0;
372 16 : for (sal_Int32 i = 0; i < nRowPos; ++i)
373 : {
374 8 : nColIdx *= 52;
375 8 : if (i < nRowPos - 1)
376 0 : ++nColIdx;
377 8 : const sal_Unicode cChar = rCellName[i];
378 8 : if ('A' <= cChar && cChar <= 'Z')
379 8 : nColIdx += cChar - 'A';
380 0 : else if ('a' <= cChar && cChar <= 'z')
381 0 : nColIdx += 26 + cChar - 'a';
382 : else
383 : {
384 0 : nColIdx = -1; // sth failed
385 0 : break;
386 : }
387 : }
388 :
389 8 : rColumn = nColIdx;
390 8 : rRow = rCellName.copy(nRowPos).toInt32() - 1; // - 1 because indices ought to be 0 based
391 : }
392 : }
393 : OSL_ENSURE( rColumn >= 0 && rRow >= 0, "failed to get column or row index" );
394 8 : }
395 :
396 : /** compare position of two cells (check rows first)
397 : *
398 : * @note this function probably also make sense only
399 : * for cell names of non-complex tables
400 : *
401 : * @param rCellName1 e.g. "A1" (non-empty string with valid cell name)
402 : * @param rCellName2 e.g. "A1" (non-empty string with valid cell name)
403 : * @return -1 if cell_1 < cell_2; 0 if both cells are equal; +1 if cell_1 > cell_2
404 : */
405 0 : int sw_CompareCellsByRowFirst( const OUString &rCellName1, const OUString &rCellName2 )
406 : {
407 0 : sal_Int32 nCol1 = -1, nRow1 = -1, nCol2 = -1, nRow2 = -1;
408 0 : sw_GetCellPosition( rCellName1, nCol1, nRow1 );
409 0 : sw_GetCellPosition( rCellName2, nCol2, nRow2 );
410 :
411 0 : if (nRow1 < nRow2 || (nRow1 == nRow2 && nCol1 < nCol2))
412 0 : return -1;
413 0 : else if (nCol1 == nCol2 && nRow1 == nRow2)
414 0 : return 0;
415 : else
416 0 : return +1;
417 : }
418 :
419 : /** compare position of two cells (check columns first)
420 : *
421 : * @note this function probably also make sense only
422 : * for cell names of non-complex tables
423 : *
424 : * @param rCellName1 e.g. "A1" (non-empty string with valid cell name)
425 : * @param rCellName2 e.g. "A1" (non-empty string with valid cell name)
426 : * @return -1 if cell_1 < cell_2; 0 if both cells are equal; +1 if cell_1 > cell_2
427 : */
428 0 : int sw_CompareCellsByColFirst( const OUString &rCellName1, const OUString &rCellName2 )
429 : {
430 0 : sal_Int32 nCol1 = -1, nRow1 = -1, nCol2 = -1, nRow2 = -1;
431 0 : sw_GetCellPosition( rCellName1, nCol1, nRow1 );
432 0 : sw_GetCellPosition( rCellName2, nCol2, nRow2 );
433 :
434 0 : if (nCol1 < nCol2 || (nCol1 == nCol2 && nRow1 < nRow2))
435 0 : return -1;
436 0 : else if (nRow1 == nRow2 && nCol1 == nCol2)
437 0 : return 0;
438 : else
439 0 : return +1;
440 : }
441 :
442 : /** compare position of two cell ranges
443 : *
444 : * @note this function probably also make sense only
445 : * for cell names of non-complex tables
446 : *
447 : * @param rRange1StartCell e.g. "A1" (non-empty string with valid cell name)
448 : * @param rRange1EndCell e.g. "A1" (non-empty string with valid cell name)
449 : * @param rRange2StartCell e.g. "A1" (non-empty string with valid cell name)
450 : * @param rRange2EndCell e.g. "A1" (non-empty string with valid cell name)
451 : * @param bCmpColsFirst if <true> position in columns will be compared first before rows
452 : *
453 : * @return -1 if cell_range_1 < cell_range_2; 0 if both cell ranges are equal; +1 if cell_range_1 > cell_range_2
454 : */
455 0 : int sw_CompareCellRanges(
456 : const OUString &rRange1StartCell, const OUString &rRange1EndCell,
457 : const OUString &rRange2StartCell, const OUString &rRange2EndCell,
458 : bool bCmpColsFirst )
459 : {
460 : int (*pCompareCells)( const OUString &, const OUString & ) =
461 0 : bCmpColsFirst ? &sw_CompareCellsByColFirst : &sw_CompareCellsByRowFirst;
462 :
463 0 : int nCmpResStartCells = pCompareCells( rRange1StartCell, rRange2StartCell );
464 0 : if ((-1 == nCmpResStartCells ) ||
465 0 : ( 0 == nCmpResStartCells &&
466 0 : -1 == pCompareCells( rRange1EndCell, rRange2EndCell ) ))
467 0 : return -1;
468 0 : else if (0 == nCmpResStartCells &&
469 0 : 0 == pCompareCells( rRange1EndCell, rRange2EndCell ))
470 0 : return 0;
471 : else
472 0 : return +1;
473 : }
474 :
475 : /** get cell name at a specified coordinate
476 : *
477 : * @param nColumn column index (0-based)
478 : * @param nRow row index (0-based)
479 : * @return the cell name
480 : */
481 21414 : OUString sw_GetCellName( sal_Int32 nColumn, sal_Int32 nRow )
482 : {
483 : #if OSL_DEBUG_LEVEL > 0
484 : {
485 : sal_Int32 nCol, nRow2;
486 : sw_GetCellPosition( OUString("z1"), nCol, nRow2);
487 : OSL_ENSURE( nCol == 51, "sw_GetCellPosition failed" );
488 : sw_GetCellPosition( OUString("AA1"), nCol, nRow2);
489 : OSL_ENSURE( nCol == 52, "sw_GetCellPosition failed" );
490 : sw_GetCellPosition( OUString("AB1"), nCol, nRow2);
491 : OSL_ENSURE( nCol == 53, "sw_GetCellPosition failed" );
492 : sw_GetCellPosition( OUString("BB1"), nCol, nRow2);
493 : OSL_ENSURE( nCol == 105, "sw_GetCellPosition failed" );
494 : }
495 : #endif
496 :
497 21414 : if (nColumn < 0 || nRow < 0)
498 0 : return OUString();
499 21414 : OUString sCellName;
500 21414 : sw_GetTblBoxColStr( static_cast< sal_uInt16 >(nColumn), sCellName );
501 21414 : return sCellName + OUString::number( nRow + 1 );
502 : }
503 :
504 : /** Find the top left or bottom right corner box in given table.
505 : Consider nested lines when finding the box.
506 :
507 : @param rTableLines the table
508 : @param i_bTopLeft if true, find top left box, otherwise find bottom
509 : right box
510 : */
511 76 : const SwTableBox* lcl_FindCornerTableBox(const SwTableLines& rTableLines, const bool i_bTopLeft)
512 : {
513 76 : bool bFirst = true;
514 76 : const SwTableBox* pBox = 0;
515 76 : do
516 : {
517 76 : const SwTableLines& rLines(bFirst ? rTableLines : pBox->GetTabLines());
518 76 : bFirst = false;
519 : OSL_ASSERT(rLines.size() != 0);
520 76 : if (!rLines.empty())
521 : {
522 76 : const SwTableLine* pLine(i_bTopLeft ? rLines.front() : rLines.back());
523 : OSL_ASSERT(pLine);
524 76 : const SwTableBoxes& rBoxes(pLine->GetTabBoxes());
525 : OSL_ASSERT(rBoxes.size() != 0);
526 76 : pBox = i_bTopLeft ? rBoxes.front() : rBoxes.back();
527 : OSL_ASSERT(pBox);
528 : }
529 : else
530 : {
531 0 : pBox = 0;
532 : }
533 76 : } while (pBox && !pBox->GetSttNd());
534 76 : return pBox;
535 : }
536 :
537 : /** cleanup order in a range
538 : *
539 : * Sorts the input to a uniform format. I.e. for the four possible representation
540 : * A1:C5, C5:A1, A5:C1, C1:A5
541 : * the result will be always A1:C5.
542 : *
543 : * @param [IN,OUT] rCell1 cell name (will be modified to upper-left corner), e.g. "A1" (non-empty string with valid cell name)
544 : * @param [IN,OUT] rCell2 cell name (will be modified to lower-right corner), e.g. "A1" (non-empty string with valid cell name)
545 : */
546 0 : void sw_NormalizeRange(OUString &rCell1, OUString &rCell2)
547 : {
548 0 : sal_Int32 nCol1 = -1, nRow1 = -1, nCol2 = -1, nRow2 = -1;
549 0 : sw_GetCellPosition( rCell1, nCol1, nRow1 );
550 0 : sw_GetCellPosition( rCell2, nCol2, nRow2 );
551 0 : if (nCol2 < nCol1 || nRow2 < nRow1)
552 : {
553 0 : rCell1 = sw_GetCellName( std::min(nCol1, nCol2), std::min(nRow1, nRow2) );
554 0 : rCell2 = sw_GetCellName( std::max(nCol1, nCol2), std::max(nRow1, nRow2) );
555 : }
556 0 : }
557 :
558 22 : void SwRangeDescriptor::Normalize()
559 : {
560 22 : if (nTop > nBottom)
561 : {
562 0 : sal_Int32 nTmp = nTop;
563 0 : nTop = nBottom;
564 0 : nBottom = nTmp;
565 : }
566 22 : if (nLeft > nRight)
567 : {
568 0 : sal_Int32 nTmp = nLeft;
569 0 : nLeft = nRight;
570 0 : nRight = nTmp;
571 : }
572 22 : }
573 :
574 21384 : static SwXCell* lcl_CreateXCell(SwFrmFmt* pFmt, sal_Int32 nColumn, sal_Int32 nRow)
575 : {
576 21384 : SwXCell* pXCell = 0;
577 21384 : const OUString sCellName = sw_GetCellName(nColumn, nRow);
578 21384 : SwTable* pTable = SwTable::FindTable( pFmt );
579 21384 : SwTableBox* pBox = (SwTableBox*)pTable->GetTblBox( sCellName );
580 21384 : if(pBox)
581 : {
582 21382 : pXCell = SwXCell::CreateXCell(pFmt, pBox, pTable);
583 : }
584 21384 : return pXCell;
585 : }
586 :
587 60 : static void lcl_InspectLines(SwTableLines& rLines, std::vector<OUString*>& rAllNames)
588 : {
589 192 : for( size_t i = 0; i < rLines.size(); ++i )
590 : {
591 132 : SwTableLine* pLine = rLines[i];
592 132 : SwTableBoxes& rBoxes = pLine->GetTabBoxes();
593 818 : for(size_t j = 0; j < rBoxes.size(); ++j)
594 : {
595 686 : SwTableBox* pBox = rBoxes[j];
596 686 : if(!pBox->GetName().isEmpty() && pBox->getRowSpan() > 0 )
597 686 : rAllNames.push_back( new OUString(pBox->GetName()) );
598 686 : SwTableLines& rBoxLines = pBox->GetTabLines();
599 686 : if(!rBoxLines.empty())
600 : {
601 0 : lcl_InspectLines(rBoxLines, rAllNames);
602 : }
603 : }
604 : }
605 60 : }
606 :
607 786 : static void lcl_FormatTable(SwFrmFmt* pTblFmt)
608 : {
609 786 : SwIterator<SwFrm,SwFmt> aIter( *pTblFmt );
610 1500 : for( SwFrm* pFrm = aIter.First(); pFrm; pFrm = aIter.Next() )
611 : {
612 : // mba: no TYPEINFO for SwTabFrm
613 714 : if( pFrm->IsTabFrm() )
614 : {
615 714 : if(pFrm->IsValid())
616 602 : pFrm->InvalidatePos();
617 714 : ((SwTabFrm*)pFrm)->SetONECalcLowers();
618 714 : ((SwTabFrm*)pFrm)->Calc();
619 : }
620 786 : }
621 786 : }
622 :
623 42 : static void lcl_CrsrSelect(SwPaM& rCrsr, bool bExpand)
624 : {
625 42 : if(bExpand)
626 : {
627 10 : if(!rCrsr.HasMark())
628 10 : rCrsr.SetMark();
629 : }
630 32 : else if(rCrsr.HasMark())
631 4 : rCrsr.DeleteMark();
632 42 : }
633 :
634 36 : static void lcl_GetTblSeparators(uno::Any& rRet, SwTable* pTable, SwTableBox* pBox, bool bRow)
635 : {
636 36 : SwTabCols aCols;
637 36 : aCols.SetLeftMin ( 0 );
638 36 : aCols.SetLeft ( 0 );
639 36 : aCols.SetRight ( UNO_TABLE_COLUMN_SUM );
640 36 : aCols.SetRightMax( UNO_TABLE_COLUMN_SUM );
641 :
642 36 : pTable->GetTabCols( aCols, pBox, false, bRow );
643 :
644 36 : const size_t nSepCount = aCols.Count();
645 72 : uno::Sequence< text::TableColumnSeparator> aColSeq(nSepCount);
646 36 : text::TableColumnSeparator* pArray = aColSeq.getArray();
647 36 : bool bError = false;
648 158 : for(size_t i = 0; i < nSepCount; ++i)
649 : {
650 122 : pArray[i].Position = static_cast< sal_Int16 >(aCols[i]);
651 122 : pArray[i].IsVisible = !aCols.IsHidden(i);
652 122 : if(!bRow && !pArray[i].IsVisible)
653 : {
654 0 : bError = true;
655 0 : break;
656 : }
657 : }
658 36 : if(!bError)
659 72 : rRet.setValue(&aColSeq, ::getCppuType((uno::Sequence< text::TableColumnSeparator>*)0));
660 :
661 36 : }
662 :
663 5354 : static void lcl_SetTblSeparators(const uno::Any& rVal, SwTable* pTable, SwTableBox* pBox, bool bRow, SwDoc* pDoc)
664 : {
665 5354 : SwTabCols aOldCols;
666 :
667 5354 : aOldCols.SetLeftMin ( 0 );
668 5354 : aOldCols.SetLeft ( 0 );
669 5354 : aOldCols.SetRight ( UNO_TABLE_COLUMN_SUM );
670 5354 : aOldCols.SetRightMax( UNO_TABLE_COLUMN_SUM );
671 :
672 5354 : pTable->GetTabCols( aOldCols, pBox, false, bRow );
673 5354 : const size_t nOldCount = aOldCols.Count();
674 : // there is no use in setting tab cols if there is only one column
675 5354 : if( !nOldCount )
676 6104 : return;
677 :
678 : const uno::Sequence< text::TableColumnSeparator>* pSepSeq =
679 4604 : (uno::Sequence< text::TableColumnSeparator>*) rVal.getValue();
680 4604 : if(pSepSeq && static_cast<size_t>(pSepSeq->getLength()) == nOldCount)
681 : {
682 4604 : SwTabCols aCols(aOldCols);
683 4604 : bool bError = false;
684 4604 : const text::TableColumnSeparator* pArray = pSepSeq->getConstArray();
685 4604 : long nLastValue = 0;
686 : //sal_Int32 nTblWidth = aCols.GetRight() - aCols.GetLeft();
687 14160 : for(size_t i = 0; i < nOldCount; ++i)
688 : {
689 9560 : aCols[i] = pArray[i].Position;
690 28676 : if(pArray[i].IsVisible == (aCols.IsHidden(i) ? 1 : 0) ||
691 19112 : (!bRow && aCols.IsHidden(i)) ||
692 28672 : aCols[i] < nLastValue ||
693 9556 : UNO_TABLE_COLUMN_SUM < aCols[i] )
694 : {
695 4 : bError = true;
696 4 : break;
697 : }
698 9556 : nLastValue = aCols[i];
699 : }
700 4604 : if(!bError)
701 : {
702 4600 : pDoc->SetTabCols(*pTable, aCols, aOldCols, pBox, bRow );
703 4604 : }
704 4604 : }
705 : }
706 :
707 64 : static inline OUString lcl_getString( SwXCell &rCell )
708 : {
709 : // getString is a member function of the base class...
710 64 : return rCell.getString();
711 : }
712 :
713 : /* non UNO function call to set string in SwXCell */
714 238 : void sw_setString( SwXCell &rCell, const OUString &rTxt,
715 : bool bKeepNumberFmt = false )
716 : {
717 238 : if(rCell.IsValid())
718 : {
719 238 : SwFrmFmt* pBoxFmt = rCell.pBox->ClaimFrmFmt();
720 238 : pBoxFmt->LockModify();
721 238 : pBoxFmt->ResetFmtAttr( RES_BOXATR_FORMULA );
722 238 : pBoxFmt->ResetFmtAttr( RES_BOXATR_VALUE );
723 238 : if (!bKeepNumberFmt)
724 94 : pBoxFmt->SetFmtAttr( SwTblBoxNumFormat(NUMBERFORMAT_TEXT) );
725 238 : pBoxFmt->UnlockModify();
726 : }
727 238 : rCell.SwXText::setString(rTxt);
728 238 : }
729 :
730 : /* non UNO function call to get value from SwXCell */
731 192 : double sw_getValue( SwXCell &rCell )
732 : {
733 : double fRet;
734 192 : if(rCell.IsValid() && !rCell.getString().isEmpty())
735 132 : fRet = rCell.pBox->GetFrmFmt()->GetTblBoxValue().GetValue();
736 : else
737 60 : ::rtl::math::setNan( &fRet );
738 192 : return fRet;
739 : }
740 :
741 : /* non UNO function call to set value in SwXCell */
742 144 : void sw_setValue( SwXCell &rCell, double nVal )
743 : {
744 144 : if(rCell.IsValid())
745 : {
746 : // first this text (maybe) needs to be deleted
747 144 : sal_uLong nNdPos = rCell.pBox->IsValidNumTxtNd( true );
748 144 : if(ULONG_MAX != nNdPos)
749 144 : sw_setString( rCell, OUString(), true ); // sal_True == keep number format
750 144 : SwDoc* pDoc = rCell.GetDoc();
751 144 : UnoActionContext aAction(pDoc);
752 144 : SwFrmFmt* pBoxFmt = rCell.pBox->ClaimFrmFmt();
753 288 : SfxItemSet aSet(pDoc->GetAttrPool(), RES_BOXATR_FORMAT, RES_BOXATR_VALUE);
754 : const SfxPoolItem* pItem;
755 :
756 : //!! do we need to set a new number format? Yes, if
757 : // - there is no current number format
758 : // - the current number format is not a number format according to the number formatter, but rather a text format
759 : // - the current number format is not even a valid number formatter number format, but rather Writer's own 'special' text number format
760 288 : if(SfxItemState::SET != pBoxFmt->GetAttrSet().GetItemState(RES_BOXATR_FORMAT, true, &pItem)
761 60 : || pDoc->GetNumberFormatter()->IsTextFormat(((SwTblBoxNumFormat*)pItem)->GetValue())
762 204 : || ((SwTblBoxNumFormat*)pItem)->GetValue() == NUMBERFORMAT_TEXT)
763 : {
764 134 : aSet.Put(SwTblBoxNumFormat(0));
765 : }
766 :
767 288 : SwTblBoxValue aVal(nVal);
768 144 : aSet.Put(aVal);
769 144 : pDoc->SetTblBoxFormulaAttrs( *rCell.pBox, aSet );
770 : // update table
771 288 : SwTableFmlUpdate aTblUpdate( SwTable::FindTable( rCell.GetFrmFmt() ));
772 288 : pDoc->getIDocumentFieldsAccess().UpdateTblFlds( &aTblUpdate );
773 : }
774 144 : }
775 :
776 119344 : TYPEINIT1(SwXCell, SwClient);
777 :
778 22002 : SwXCell::SwXCell(SwFrmFmt* pTblFmt, SwTableBox* pBx, size_t const nPos) :
779 : SwXText(pTblFmt->GetDoc(), CURSOR_TBLTEXT),
780 : SwClient(pTblFmt),
781 22002 : m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TABLE_CELL)),
782 : pBox(pBx),
783 : pStartNode(0),
784 44004 : nFndPos(nPos)
785 : {
786 22002 : }
787 :
788 0 : SwXCell::SwXCell(SwFrmFmt* pTblFmt, const SwStartNode& rStartNode) :
789 : SwXText(pTblFmt->GetDoc(), CURSOR_TBLTEXT),
790 : SwClient(pTblFmt),
791 0 : m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TABLE_CELL)),
792 : pBox(0),
793 : pStartNode(&rStartNode),
794 0 : nFndPos(NOTFOUND)
795 : {
796 0 : }
797 :
798 44004 : SwXCell::~SwXCell()
799 : {
800 44004 : }
801 :
802 : namespace
803 : {
804 : class theSwXCellUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSwXCellUnoTunnelId > {};
805 : }
806 :
807 974 : const uno::Sequence< sal_Int8 > & SwXCell::getUnoTunnelId()
808 : {
809 974 : return theSwXCellUnoTunnelId::get().getSeq();
810 : }
811 :
812 974 : sal_Int64 SAL_CALL SwXCell::getSomething( const uno::Sequence< sal_Int8 >& rId )
813 : throw(uno::RuntimeException, std::exception)
814 : {
815 1948 : if( rId.getLength() == 16
816 2922 : && 0 == memcmp( getUnoTunnelId().getConstArray(),
817 1948 : rId.getConstArray(), 16 ) )
818 : {
819 0 : return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
820 : }
821 : else
822 974 : return SwXText::getSomething(rId);
823 : }
824 :
825 0 : uno::Sequence< uno::Type > SAL_CALL SwXCell::getTypes( ) throw(uno::RuntimeException, std::exception)
826 : {
827 0 : static uno::Sequence< uno::Type > aRetTypes;
828 0 : if(!aRetTypes.getLength())
829 : {
830 0 : aRetTypes = SwXCellBaseClass::getTypes();
831 0 : uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
832 :
833 0 : long nIndex = aRetTypes.getLength();
834 : aRetTypes.realloc(
835 0 : aRetTypes.getLength() +
836 0 : aTextTypes.getLength());
837 :
838 0 : uno::Type* pRetTypes = aRetTypes.getArray();
839 :
840 0 : const uno::Type* pTextTypes = aTextTypes.getConstArray();
841 0 : for(long nPos = 0; nPos <aTextTypes.getLength(); nPos++)
842 0 : pRetTypes[nIndex++] = pTextTypes[nPos];
843 : }
844 0 : return aRetTypes;
845 : }
846 :
847 0 : uno::Sequence< sal_Int8 > SAL_CALL SwXCell::getImplementationId( ) throw(uno::RuntimeException, std::exception)
848 : {
849 0 : return css::uno::Sequence<sal_Int8>();
850 : }
851 :
852 289342 : void SAL_CALL SwXCell::acquire( ) throw()
853 : {
854 289342 : SwXCellBaseClass::acquire();
855 289342 : }
856 :
857 289342 : void SAL_CALL SwXCell::release( ) throw()
858 : {
859 289342 : SwXCellBaseClass::release();
860 289342 : }
861 :
862 53496 : uno::Any SAL_CALL SwXCell::queryInterface( const uno::Type& aType )
863 : throw (uno::RuntimeException, std::exception)
864 : {
865 53496 : uno::Any aRet = SwXCellBaseClass::queryInterface(aType);
866 53496 : if(aRet.getValueType() == ::getCppuVoidType())
867 32004 : aRet = SwXText::queryInterface(aType);
868 53496 : return aRet;
869 : }
870 :
871 1002 : const SwStartNode *SwXCell::GetStartNode() const
872 : {
873 1002 : const SwStartNode *pSttNd = 0;
874 :
875 1002 : if( pStartNode || ((SwXCell *)this)->IsValid() )
876 1002 : pSttNd = pStartNode ? pStartNode : pBox->GetSttNd();
877 :
878 1002 : return pSttNd;
879 : }
880 :
881 : uno::Reference< text::XTextCursor >
882 644 : SwXCell::CreateCursor() throw (uno::RuntimeException)
883 : {
884 644 : return createTextCursor();
885 : }
886 :
887 206760 : bool SwXCell::IsValid() const
888 : {
889 : // FIXME: this is now a const method, to make SwXText::IsValid invisible
890 : // but the const_cast here are still ridiculous. TODO: find a better way.
891 206760 : SwFrmFmt* pTblFmt = pBox ? GetFrmFmt() : 0;
892 206760 : if(!pTblFmt)
893 : {
894 0 : const_cast<SwXCell*>(this)->pBox = 0;
895 : }
896 : else
897 : {
898 206760 : SwTable* pTable = SwTable::FindTable( pTblFmt );
899 : SwTableBox const*const pFoundBox =
900 206760 : const_cast<SwXCell*>(this)->FindBox(pTable, pBox);
901 206760 : if (!pFoundBox)
902 : {
903 0 : const_cast<SwXCell*>(this)->pBox = 0;
904 : }
905 : }
906 206760 : return 0 != pBox;
907 : }
908 :
909 8 : OUString SwXCell::getFormula(void) throw( uno::RuntimeException, std::exception )
910 : {
911 8 : SolarMutexGuard aGuard;
912 8 : OUString sRet;
913 8 : if(IsValid())
914 : {
915 8 : SwTblBoxFormula aFormula( pBox->GetFrmFmt()->GetTblBoxFormula() );
916 8 : SwTable* pTable = SwTable::FindTable( GetFrmFmt() );
917 8 : aFormula.PtrToBoxNm( pTable );
918 8 : sRet = aFormula.GetFormula();
919 : }
920 8 : return sRet;
921 : }
922 :
923 : ///@see sw_setValue (TODO: seems to be copy and paste programming here)
924 0 : void SwXCell::setFormula(const OUString& rFormula) throw( uno::RuntimeException, std::exception )
925 : {
926 0 : SolarMutexGuard aGuard;
927 0 : if(IsValid())
928 : {
929 : // first this text (maybe) needs to be deleted
930 0 : sal_uInt32 nNdPos = pBox->IsValidNumTxtNd( true );
931 0 : if(USHRT_MAX == nNdPos)
932 0 : sw_setString( *this, OUString(), true );
933 0 : OUString sFml(comphelper::string::stripStart(rFormula, ' '));
934 0 : if( !sFml.isEmpty() && '=' == sFml[0] )
935 0 : sFml = sFml.copy( 1 );
936 0 : SwTblBoxFormula aFml( sFml );
937 0 : SwDoc* pMyDoc = GetDoc();
938 0 : UnoActionContext aAction(pMyDoc);
939 0 : SfxItemSet aSet(pMyDoc->GetAttrPool(), RES_BOXATR_FORMAT, RES_BOXATR_FORMULA);
940 : const SfxPoolItem* pItem;
941 0 : SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
942 0 : if(SfxItemState::SET != pBoxFmt->GetAttrSet().GetItemState(RES_BOXATR_FORMAT, true, &pItem)
943 0 : || pMyDoc->GetNumberFormatter()->IsTextFormat(((SwTblBoxNumFormat*)pItem)->GetValue()))
944 : {
945 0 : aSet.Put(SwTblBoxNumFormat(0));
946 : }
947 0 : aSet.Put(aFml);
948 0 : GetDoc()->SetTblBoxFormulaAttrs( *pBox, aSet );
949 : // update table
950 0 : SwTableFmlUpdate aTblUpdate( SwTable::FindTable( GetFrmFmt() ));
951 0 : pMyDoc->getIDocumentFieldsAccess().UpdateTblFlds( &aTblUpdate );
952 0 : }
953 0 : }
954 :
955 128 : double SwXCell::getValue(void) throw( uno::RuntimeException, std::exception )
956 : {
957 128 : SolarMutexGuard aGuard;
958 :
959 128 : double const fRet = sw_getValue( *this );
960 : // #i112652# a table cell may contain NaN as a value, do not filter that
961 128 : return fRet;
962 : }
963 :
964 80 : void SwXCell::setValue(double rValue) throw( uno::RuntimeException, std::exception )
965 : {
966 80 : SolarMutexGuard aGuard;
967 80 : sw_setValue( *this, rValue );
968 80 : }
969 :
970 0 : table::CellContentType SwXCell::getType(void) throw( uno::RuntimeException, std::exception )
971 : {
972 0 : SolarMutexGuard aGuard;
973 :
974 0 : table::CellContentType nRes = table::CellContentType_EMPTY;
975 0 : sal_uInt32 nNdPos = pBox->IsFormulaOrValueBox();
976 0 : switch (nNdPos)
977 : {
978 0 : case 0 : nRes = table::CellContentType_TEXT; break;
979 0 : case USHRT_MAX : nRes = table::CellContentType_EMPTY; break;
980 0 : case RES_BOXATR_VALUE : nRes = table::CellContentType_VALUE; break;
981 0 : case RES_BOXATR_FORMULA : nRes = table::CellContentType_FORMULA; break;
982 : default :
983 : OSL_FAIL( "unexpected case" );
984 : }
985 0 : return nRes;
986 : }
987 :
988 30 : void SwXCell::setString(const OUString& aString) throw( uno::RuntimeException, std::exception )
989 : {
990 30 : SolarMutexGuard aGuard;
991 30 : sw_setString( *this, aString );
992 30 : }
993 :
994 0 : sal_Int32 SwXCell::getError(void) throw( uno::RuntimeException, std::exception )
995 : {
996 0 : SolarMutexGuard aGuard;
997 0 : OUString sContent = getString();
998 0 : return sal_Int32(sContent.equals(SwViewShell::GetShellRes()->aCalc_Error));
999 : }
1000 :
1001 31506 : uno::Reference< text::XTextCursor > SwXCell::createTextCursor(void) throw( uno::RuntimeException, std::exception )
1002 : {
1003 31506 : SolarMutexGuard aGuard;
1004 31506 : uno::Reference< text::XTextCursor > aRef;
1005 31506 : if(pStartNode || IsValid())
1006 : {
1007 31506 : const SwStartNode* pSttNd = pStartNode ? pStartNode : pBox->GetSttNd();
1008 31506 : SwPosition aPos(*pSttNd);
1009 : SwXTextCursor *const pXCursor =
1010 31506 : new SwXTextCursor(*GetDoc(), this, CURSOR_TBLTEXT, aPos);
1011 31506 : SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor();
1012 31506 : pUnoCrsr->Move(fnMoveForward, fnGoNode);
1013 31506 : aRef = static_cast<text::XWordCursor*>(pXCursor);
1014 : }
1015 : else
1016 0 : throw uno::RuntimeException();
1017 31506 : return aRef;
1018 : }
1019 :
1020 1928 : uno::Reference< text::XTextCursor > SwXCell::createTextCursorByRange(const uno::Reference< text::XTextRange > & xTextPosition)
1021 : throw( uno::RuntimeException, std::exception )
1022 : {
1023 1928 : SolarMutexGuard aGuard;
1024 1928 : uno::Reference< text::XTextCursor > aRef;
1025 3856 : SwUnoInternalPaM aPam(*GetDoc());
1026 3856 : if ((pStartNode || IsValid())
1027 3856 : && ::sw::XTextRangeToSwPaM(aPam, xTextPosition))
1028 : {
1029 1928 : const SwStartNode* pSttNd = pStartNode ? pStartNode : pBox->GetSttNd();
1030 : // skip sections
1031 1928 : SwStartNode* p1 = aPam.GetNode().StartOfSectionNode();
1032 3856 : while(p1->IsSectionNode())
1033 0 : p1 = p1->StartOfSectionNode();
1034 :
1035 1928 : if( p1 == pSttNd )
1036 : {
1037 : aRef = static_cast<text::XWordCursor*>(
1038 1928 : new SwXTextCursor(*GetDoc(), this, CURSOR_TBLTEXT,
1039 1928 : *aPam.GetPoint(), aPam.GetMark()));
1040 : }
1041 : }
1042 : else
1043 0 : throw uno::RuntimeException();
1044 3856 : return aRef;
1045 : }
1046 :
1047 4 : uno::Reference< beans::XPropertySetInfo > SwXCell::getPropertySetInfo(void) throw( uno::RuntimeException, std::exception )
1048 : {
1049 4 : static uno::Reference< beans::XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
1050 4 : return xRef;
1051 : }
1052 :
1053 164980 : void SwXCell::setPropertyValue(const OUString& rPropertyName, const uno::Any& aValue)
1054 : throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1055 : {
1056 164980 : SolarMutexGuard aGuard;
1057 164980 : if(IsValid())
1058 : {
1059 : // Hack to support hidden property to transfer textDirection
1060 164980 : if ( rPropertyName == "FRMDirection" )
1061 : {
1062 66 : SvxFrameDirection eDir = FRMDIR_ENVIRONMENT;
1063 66 : sal_Int16 nNum = 0;
1064 66 : aValue >>= nNum;
1065 : OSL_TRACE("FRMDirection val %d", nNum );
1066 66 : switch (nNum)
1067 : {
1068 : case 0:
1069 64 : eDir = FRMDIR_HORI_LEFT_TOP;
1070 64 : break;
1071 : case 1:
1072 0 : eDir = FRMDIR_HORI_RIGHT_TOP;
1073 0 : break;
1074 : case 2:
1075 2 : eDir = FRMDIR_VERT_TOP_RIGHT;
1076 2 : break;
1077 : default:
1078 : OSL_FAIL( "unknown direction code, maybe it's a bitfield");
1079 : }
1080 66 : SvxFrameDirectionItem aItem( eDir, RES_FRAMEDIR);
1081 66 : pBox->GetFrmFmt()->SetFmtAttr(aItem);
1082 : }
1083 164914 : else if ( rPropertyName == "TableRedlineParams" )
1084 : {
1085 : // Get the table row properties
1086 12 : uno::Sequence< beans::PropertyValue > tableCellProperties;
1087 12 : tableCellProperties = aValue.get< uno::Sequence< beans::PropertyValue > >();
1088 24 : comphelper::SequenceAsHashMap aPropMap( tableCellProperties );
1089 24 : OUString sRedlineType;
1090 24 : uno::Any sRedlineTypeValue;
1091 12 : sRedlineTypeValue = aPropMap.getUnpackedValueOrDefault("RedlineType", sRedlineTypeValue);
1092 12 : if( sRedlineTypeValue >>= sRedlineType )
1093 : {
1094 : // Create a 'Table Cell Redline' object
1095 12 : SwUnoCursorHelper::makeTableCellRedline( *pBox, sRedlineType, tableCellProperties);
1096 : }
1097 : else
1098 : {
1099 0 : throw beans::UnknownPropertyException("No redline type property: ", static_cast < cppu::OWeakObject * > ( this ) );
1100 12 : }
1101 : }
1102 : else
1103 : {
1104 : const SfxItemPropertySimpleEntry* pEntry =
1105 164902 : m_pPropSet->getPropertyMap().getByName(rPropertyName);
1106 164902 : if( !pEntry )
1107 : {
1108 30744 : beans::UnknownPropertyException aEx;
1109 30744 : aEx.Message = rPropertyName;
1110 30744 : throw( aEx );
1111 : }
1112 134158 : if( pEntry->nWID == FN_UNO_CELL_ROW_SPAN )
1113 : {
1114 246 : sal_Int32 nRowSpan = 0;
1115 246 : if( aValue >>= nRowSpan )
1116 246 : pBox->setRowSpan( nRowSpan );
1117 : }
1118 : else
1119 : {
1120 133912 : SwFrmFmt* pBoxFmt = pBox->ClaimFrmFmt();
1121 133912 : SwAttrSet aSet(pBoxFmt->GetAttrSet());
1122 133912 : m_pPropSet->setPropertyValue(rPropertyName, aValue, aSet);
1123 133912 : pBoxFmt->GetDoc()->SetAttr(aSet, *pBoxFmt);
1124 : }
1125 : }
1126 164980 : }
1127 134236 : }
1128 :
1129 890 : uno::Any SwXCell::getPropertyValue(const OUString& rPropertyName)
1130 : throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1131 : {
1132 890 : SolarMutexGuard aGuard;
1133 890 : uno::Any aRet;
1134 890 : if(IsValid())
1135 : {
1136 : const SfxItemPropertySimpleEntry* pEntry =
1137 890 : m_pPropSet->getPropertyMap().getByName(rPropertyName);
1138 890 : if( !pEntry )
1139 : {
1140 0 : beans::UnknownPropertyException aEx;
1141 0 : aEx.Message = rPropertyName;
1142 0 : throw( aEx );
1143 : }
1144 890 : switch( pEntry->nWID )
1145 : {
1146 : case FN_UNO_CELL_ROW_SPAN:
1147 0 : aRet <<= pBox->getRowSpan();
1148 0 : break;
1149 : case FN_UNO_TEXT_SECTION:
1150 : {
1151 6 : SwFrmFmt* pTblFmt = GetFrmFmt();
1152 6 : SwTable* pTable = SwTable::FindTable( pTblFmt );
1153 6 : SwTableNode* pTblNode = pTable->GetTableNode();
1154 6 : SwSectionNode* pSectionNode = pTblNode->FindSectionNode();
1155 6 : if(pSectionNode)
1156 : {
1157 0 : const SwSection& rSect = pSectionNode->GetSection();
1158 : uno::Reference< text::XTextSection > xSect =
1159 0 : SwXTextSections::GetObject( *rSect.GetFmt() );
1160 0 : aRet <<= xSect;
1161 : }
1162 : }
1163 6 : break;
1164 : case FN_UNO_CELL_NAME:
1165 8 : aRet <<= pBox->GetName();
1166 8 : break;
1167 : case FN_UNO_REDLINE_NODE_START:
1168 : case FN_UNO_REDLINE_NODE_END:
1169 : {
1170 : //redline can only be returned if it's a living object
1171 20 : aRet = SwXText::getPropertyValue(rPropertyName);
1172 : }
1173 20 : break;
1174 : default:
1175 : {
1176 856 : const SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
1177 856 : const SwAttrSet& rSet = pBoxFmt->GetAttrSet();
1178 856 : m_pPropSet->getPropertyValue(rPropertyName, rSet, aRet);
1179 : }
1180 : }
1181 : }
1182 890 : return aRet;
1183 : }
1184 :
1185 0 : void SwXCell::addPropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1186 : {
1187 : OSL_FAIL("not implemented");
1188 0 : }
1189 :
1190 0 : void SwXCell::removePropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1191 : {
1192 : OSL_FAIL("not implemented");
1193 0 : }
1194 :
1195 0 : void SwXCell::addVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1196 : {
1197 : OSL_FAIL("not implemented");
1198 0 : }
1199 :
1200 0 : void SwXCell::removeVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1201 : {
1202 : OSL_FAIL("not implemented");
1203 0 : }
1204 :
1205 5872 : uno::Reference< container::XEnumeration > SwXCell::createEnumeration(void) throw( uno::RuntimeException, std::exception )
1206 : {
1207 5872 : SolarMutexGuard aGuard;
1208 5872 : uno::Reference< container::XEnumeration > aRef;
1209 5872 : if(IsValid())
1210 : {
1211 5872 : const SwStartNode* pSttNd = pBox->GetSttNd();
1212 5872 : SwPosition aPos(*pSttNd);
1213 : ::std::unique_ptr<SwUnoCrsr> pUnoCursor(
1214 11744 : GetDoc()->CreateUnoCrsr(aPos, false));
1215 5872 : pUnoCursor->Move(fnMoveForward, fnGoNode);
1216 :
1217 : // remember table and start node for later travelling
1218 : // (used in export of tables in tables)
1219 5872 : SwTable const*const pTable( & pSttNd->FindTableNode()->GetTable() );
1220 : SwXParagraphEnumeration *const pEnum =
1221 : new SwXParagraphEnumeration(this, std::move(pUnoCursor), CURSOR_TBLTEXT,
1222 5872 : pSttNd, pTable);
1223 :
1224 11744 : aRef = pEnum;
1225 : }
1226 5872 : return aRef;
1227 : }
1228 :
1229 2 : uno::Type SAL_CALL SwXCell::getElementType(void) throw( uno::RuntimeException, std::exception )
1230 : {
1231 2 : return cppu::UnoType<text::XTextRange>::get();
1232 : }
1233 :
1234 2 : sal_Bool SwXCell::hasElements(void) throw( uno::RuntimeException, std::exception )
1235 : {
1236 2 : return sal_True;
1237 : }
1238 :
1239 178 : void SwXCell::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
1240 : {
1241 178 : ClientModify(this, pOld, pNew);
1242 178 : }
1243 :
1244 22960 : SwXCell* SwXCell::CreateXCell(SwFrmFmt* pTblFmt, SwTableBox* pBox, SwTable *pTable )
1245 : {
1246 22960 : SwXCell* pRet = 0;
1247 22960 : if(pTblFmt && pBox)
1248 : {
1249 22960 : if( !pTable )
1250 1554 : pTable = SwTable::FindTable( pTblFmt );
1251 22960 : SwTableSortBoxes::const_iterator it = pTable->GetTabSortBoxes().find( pBox );
1252 :
1253 : // if the box exists, then return a cell
1254 22960 : if( it != pTable->GetTabSortBoxes().end() )
1255 : {
1256 22960 : size_t const nPos = it - pTable->GetTabSortBoxes().begin();
1257 22960 : SwIterator<SwXCell,SwFmt> aIter( *pTblFmt );
1258 22960 : SwXCell* pXCell = aIter.First();
1259 55426 : while( pXCell )
1260 : {
1261 : // is there already a proper cell?
1262 10464 : if(pXCell->GetTblBox() == pBox)
1263 958 : break;
1264 9506 : pXCell = aIter.Next();
1265 : }
1266 : // otherwise create it
1267 22960 : if(!pXCell)
1268 : {
1269 22002 : pXCell = new SwXCell(pTblFmt, pBox, nPos);
1270 : }
1271 22960 : pRet = pXCell;
1272 : }
1273 : }
1274 22960 : return pRet;
1275 : }
1276 :
1277 : /** search if a box exists in a table
1278 : *
1279 : * @param pTable the table to search in
1280 : * @param pBox2 box model to find
1281 : * @return the box if existent in pTable, 0 (!!!) if not found
1282 : */
1283 206760 : SwTableBox* SwXCell::FindBox(SwTable* pTable, SwTableBox* pBox2)
1284 : {
1285 : // check if nFndPos happens to point to the right table box
1286 413519 : if( nFndPos < pTable->GetTabSortBoxes().size() &&
1287 206759 : pBox2 == pTable->GetTabSortBoxes()[ nFndPos ] )
1288 206758 : return pBox2;
1289 :
1290 : // if not, seek the entry (and return, if successful)
1291 2 : SwTableSortBoxes::const_iterator it = pTable->GetTabSortBoxes().find( pBox2 );
1292 2 : if( it != pTable->GetTabSortBoxes().end() )
1293 : {
1294 2 : nFndPos = it - pTable->GetTabSortBoxes().begin();
1295 2 : return pBox2;
1296 : }
1297 :
1298 : // box not found: reset nFndPos pointer
1299 0 : nFndPos = NOTFOUND;
1300 0 : return 0;
1301 : }
1302 :
1303 0 : OUString SwXCell::getImplementationName(void) throw( uno::RuntimeException, std::exception )
1304 : {
1305 0 : return OUString("SwXCell");
1306 : }
1307 :
1308 2 : sal_Bool SwXCell::supportsService(const OUString& rServiceName) throw( uno::RuntimeException, std::exception )
1309 : {
1310 2 : return cppu::supportsService(this, rServiceName);
1311 : }
1312 :
1313 2 : uno::Sequence< OUString > SwXCell::getSupportedServiceNames(void) throw( uno::RuntimeException, std::exception )
1314 : {
1315 2 : uno::Sequence< OUString > aRet(1);
1316 2 : OUString* pArray = aRet.getArray();
1317 2 : pArray[0] = "com.sun.star.text.CellProperties";
1318 2 : return aRet;
1319 : }
1320 :
1321 0 : OUString SwXTextTableRow::getImplementationName(void) throw( uno::RuntimeException, std::exception )
1322 : {
1323 0 : return OUString("SwXTextTableRow");
1324 : }
1325 :
1326 2 : sal_Bool SwXTextTableRow::supportsService(const OUString& rServiceName) throw( uno::RuntimeException, std::exception )
1327 : {
1328 2 : return cppu::supportsService(this, rServiceName);
1329 : }
1330 :
1331 2 : uno::Sequence< OUString > SwXTextTableRow::getSupportedServiceNames(void) throw( uno::RuntimeException, std::exception )
1332 : {
1333 2 : uno::Sequence< OUString > aRet(1);
1334 2 : OUString* pArray = aRet.getArray();
1335 2 : pArray[0] = "com.sun.star.text.TextTableRow";
1336 2 : return aRet;
1337 : }
1338 10910 : TYPEINIT1(SwXTextTableRow, SwClient);
1339 :
1340 5406 : SwXTextTableRow::SwXTextTableRow(SwFrmFmt* pFmt, SwTableLine* pLn) :
1341 : SwClient(pFmt),
1342 5406 : m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE_ROW)),
1343 10812 : pLine(pLn)
1344 : {
1345 5406 : }
1346 :
1347 10812 : SwXTextTableRow::~SwXTextTableRow()
1348 : {
1349 10812 : }
1350 :
1351 38 : uno::Reference< beans::XPropertySetInfo > SwXTextTableRow::getPropertySetInfo(void) throw( uno::RuntimeException, std::exception )
1352 : {
1353 38 : static uno::Reference< beans::XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
1354 38 : return xRef;
1355 : }
1356 :
1357 16634 : void SwXTextTableRow::setPropertyValue(const OUString& rPropertyName, const uno::Any& aValue)
1358 : throw (beans::UnknownPropertyException,
1359 : beans::PropertyVetoException,
1360 : lang::IllegalArgumentException,
1361 : lang::WrappedTargetException,
1362 : uno::RuntimeException,
1363 : std::exception)
1364 : {
1365 16634 : SolarMutexGuard aGuard;
1366 16634 : SwFrmFmt* pFmt = GetFrmFmt();
1367 16634 : if(pFmt)
1368 : {
1369 16634 : SwTable* pTable = SwTable::FindTable( pFmt );
1370 16634 : SwTableLine* pLn = SwXTextTableRow::FindLine(pTable, pLine);
1371 16634 : if(pLn)
1372 : {
1373 : // Check for a specific property
1374 16634 : if ( rPropertyName == "TableRedlineParams" )
1375 : {
1376 : // Get the table row properties
1377 56 : uno::Sequence< beans::PropertyValue > tableRowProperties;
1378 56 : tableRowProperties = aValue.get< uno::Sequence< beans::PropertyValue > >();
1379 112 : comphelper::SequenceAsHashMap aPropMap( tableRowProperties );
1380 112 : OUString sRedlineType;
1381 112 : uno::Any sRedlineTypeValue;
1382 56 : sRedlineTypeValue = aPropMap.getUnpackedValueOrDefault("RedlineType", sRedlineTypeValue);
1383 56 : if( sRedlineTypeValue >>= sRedlineType )
1384 : {
1385 : // Create a 'Table Row Redline' object
1386 56 : SwUnoCursorHelper::makeTableRowRedline( *pLn, sRedlineType, tableRowProperties);
1387 : }
1388 : else
1389 : {
1390 0 : throw beans::UnknownPropertyException("No redline type property: ", static_cast < cppu::OWeakObject * > ( this ) );
1391 56 : }
1392 : }
1393 : else
1394 : {
1395 : const SfxItemPropertySimpleEntry* pEntry =
1396 16578 : m_pPropSet->getPropertyMap().getByName(rPropertyName);
1397 16578 : SwDoc* pDoc = pFmt->GetDoc();
1398 16578 : if (!pEntry)
1399 0 : throw beans::UnknownPropertyException("Unknown property: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1400 16578 : if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
1401 0 : throw beans::PropertyVetoException("Property is read-only: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1402 :
1403 16578 : switch(pEntry->nWID)
1404 : {
1405 : case FN_UNO_ROW_HEIGHT:
1406 : case FN_UNO_ROW_AUTO_HEIGHT:
1407 : {
1408 2644 : SwFmtFrmSize aFrmSize(pLn->GetFrmFmt()->GetFrmSize());
1409 2644 : if(FN_UNO_ROW_AUTO_HEIGHT== pEntry->nWID)
1410 : {
1411 6 : bool bSet = *(sal_Bool*)aValue.getValue();
1412 6 : aFrmSize.SetHeightSizeType(bSet ? ATT_VAR_SIZE : ATT_FIX_SIZE);
1413 : }
1414 : else
1415 : {
1416 2638 : sal_Int32 nHeight = 0;
1417 2638 : aValue >>= nHeight;
1418 2638 : Size aSz(aFrmSize.GetSize());
1419 2638 : aSz.Height() = convertMm100ToTwip(nHeight);
1420 2638 : aFrmSize.SetSize(aSz);
1421 : }
1422 2644 : pDoc->SetAttr(aFrmSize, *pLn->ClaimFrmFmt());
1423 : }
1424 2644 : break;
1425 :
1426 : case FN_UNO_TABLE_COLUMN_SEPARATORS:
1427 : {
1428 5352 : UnoActionContext aContext(pDoc);
1429 5352 : SwTable* pTable2 = SwTable::FindTable( pFmt );
1430 5352 : lcl_SetTblSeparators(aValue, pTable2, pLine->GetTabBoxes()[0], true, pDoc);
1431 : }
1432 5352 : break;
1433 :
1434 : default:
1435 : {
1436 8582 : SwFrmFmt* pLnFmt = pLn->ClaimFrmFmt();
1437 8582 : SwAttrSet aSet(pLnFmt->GetAttrSet());
1438 8582 : m_pPropSet->setPropertyValue(*pEntry, aValue, aSet);
1439 8582 : pDoc->SetAttr(aSet, *pLnFmt);
1440 : }
1441 : }
1442 : }
1443 : }
1444 16634 : }
1445 16632 : }
1446 :
1447 162 : uno::Any SwXTextTableRow::getPropertyValue(const OUString& rPropertyName) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1448 : {
1449 162 : SolarMutexGuard aGuard;
1450 162 : uno::Any aRet;
1451 162 : SwFrmFmt* pFmt = GetFrmFmt();
1452 162 : if(pFmt)
1453 : {
1454 162 : SwTable* pTable = SwTable::FindTable( pFmt );
1455 162 : SwTableLine* pLn = SwXTextTableRow::FindLine(pTable, pLine);
1456 162 : if(pLn)
1457 : {
1458 : const SfxItemPropertySimpleEntry* pEntry =
1459 162 : m_pPropSet->getPropertyMap().getByName(rPropertyName);
1460 162 : if (!pEntry)
1461 0 : throw beans::UnknownPropertyException("Unknown property: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1462 :
1463 162 : switch(pEntry->nWID)
1464 : {
1465 : case FN_UNO_ROW_HEIGHT:
1466 : case FN_UNO_ROW_AUTO_HEIGHT:
1467 : {
1468 32 : const SwFmtFrmSize& rSize = pLn->GetFrmFmt()->GetFrmSize();
1469 32 : if(FN_UNO_ROW_AUTO_HEIGHT== pEntry->nWID)
1470 : {
1471 14 : sal_Bool bTmp = ATT_VAR_SIZE == rSize.GetHeightSizeType();
1472 14 : aRet.setValue(&bTmp, ::getCppuBooleanType());
1473 : }
1474 : else
1475 18 : aRet <<= (sal_Int32)(convertTwipToMm100(rSize.GetSize().Height()));
1476 : }
1477 32 : break;
1478 :
1479 : case FN_UNO_TABLE_COLUMN_SEPARATORS:
1480 : {
1481 32 : lcl_GetTblSeparators(aRet, pTable, pLine->GetTabBoxes()[0], true);
1482 : }
1483 32 : break;
1484 :
1485 : default:
1486 : {
1487 98 : const SwAttrSet& rSet = pLn->GetFrmFmt()->GetAttrSet();
1488 98 : m_pPropSet->getPropertyValue(*pEntry, rSet, aRet);
1489 : }
1490 : }
1491 : }
1492 : }
1493 162 : return aRet;
1494 : }
1495 :
1496 0 : void SwXTextTableRow::addPropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1497 : {
1498 : OSL_FAIL("not implemented");
1499 0 : }
1500 :
1501 0 : void SwXTextTableRow::removePropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1502 : {
1503 : OSL_FAIL("not implemented");
1504 0 : }
1505 :
1506 0 : void SwXTextTableRow::addVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1507 : {
1508 : OSL_FAIL("not implemented");
1509 0 : }
1510 :
1511 0 : void SwXTextTableRow::removeVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1512 : {
1513 : OSL_FAIL("not implemented");
1514 0 : }
1515 :
1516 6 : void SwXTextTableRow::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
1517 : {
1518 6 : ClientModify(this, pOld, pNew);
1519 6 : }
1520 :
1521 16796 : SwTableLine* SwXTextTableRow::FindLine(SwTable* pTable, SwTableLine* pLine)
1522 : {
1523 16796 : SwTableLine* pRet = 0;
1524 16796 : SwTableLines &rLines = pTable->GetTabLines();
1525 592638 : for(size_t i = 0; i < rLines.size(); ++i)
1526 592638 : if(rLines[i] == pLine)
1527 : {
1528 16796 : pRet = pLine;
1529 16796 : break;
1530 : }
1531 16796 : return pRet;
1532 : }
1533 :
1534 : // SwXTextTableCursor
1535 :
1536 0 : OUString SwXTextTableCursor::getImplementationName(void) throw( uno::RuntimeException, std::exception )
1537 : {
1538 0 : return OUString("SwXTextTableCursor");
1539 : }
1540 :
1541 6 : sal_Bool SwXTextTableCursor::supportsService(const OUString& rServiceName) throw( uno::RuntimeException, std::exception )
1542 : {
1543 6 : return cppu::supportsService(this, rServiceName);
1544 : }
1545 :
1546 160 : IMPLEMENT_FORWARD_XINTERFACE2(SwXTextTableCursor,SwXTextTableCursor_Base,OTextCursorHelper)
1547 0 : const SwPaM* SwXTextTableCursor::GetPaM() const { return GetCrsr(); }
1548 0 : SwPaM* SwXTextTableCursor::GetPaM() { return GetCrsr(); }
1549 0 : const SwDoc* SwXTextTableCursor::GetDoc() const { return GetFrmFmt()->GetDoc(); }
1550 0 : SwDoc* SwXTextTableCursor::GetDoc() { return GetFrmFmt()->GetDoc(); }
1551 0 : const SwUnoCrsr* SwXTextTableCursor::GetCrsr() const { return (SwUnoCrsr*)aCrsrDepend.GetRegisteredIn(); }
1552 654 : SwUnoCrsr* SwXTextTableCursor::GetCrsr() { return (SwUnoCrsr*)aCrsrDepend.GetRegisteredIn(); }
1553 :
1554 6 : uno::Sequence< OUString > SwXTextTableCursor::getSupportedServiceNames(void) throw( uno::RuntimeException, std::exception )
1555 : {
1556 6 : uno::Sequence< OUString > aRet(1);
1557 6 : OUString* pArray = aRet.getArray();
1558 6 : pArray[0] = "com.sun.star.text.TextTableCursor";
1559 6 : return aRet;
1560 : }
1561 :
1562 12 : SwXTextTableCursor::SwXTextTableCursor(SwFrmFmt* pFmt, SwTableBox* pBox) :
1563 : SwClient(pFmt),
1564 : aCrsrDepend(this, 0),
1565 12 : m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE_CURSOR))
1566 : {
1567 12 : SwDoc* pDoc = pFmt->GetDoc();
1568 12 : const SwStartNode* pSttNd = pBox->GetSttNd();
1569 12 : SwPosition aPos(*pSttNd);
1570 12 : SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(aPos, true);
1571 12 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
1572 12 : pUnoCrsr->Add(&aCrsrDepend);
1573 12 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1574 12 : rTblCrsr.MakeBoxSels();
1575 12 : }
1576 :
1577 0 : SwXTextTableCursor::SwXTextTableCursor(SwFrmFmt& rTableFmt, const SwTableCursor* pTableSelection) :
1578 : SwClient(&rTableFmt),
1579 : aCrsrDepend(this, 0),
1580 0 : m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE_CURSOR))
1581 : {
1582 0 : SwUnoCrsr* pUnoCrsr = pTableSelection->GetDoc()->CreateUnoCrsr(*pTableSelection->GetPoint(), true);
1583 0 : if(pTableSelection->HasMark())
1584 : {
1585 0 : pUnoCrsr->SetMark();
1586 0 : *pUnoCrsr->GetMark() = *pTableSelection->GetMark();
1587 : }
1588 0 : const SwSelBoxes& rBoxes = pTableSelection->GetSelectedBoxes();
1589 0 : SwTableCursor& rTableCrsr = dynamic_cast<SwTableCursor&>(*pUnoCrsr);
1590 0 : for (size_t i = 0; i < rBoxes.size(); i++)
1591 : {
1592 0 : rTableCrsr.InsertBox( *rBoxes[i] );
1593 : }
1594 :
1595 0 : pUnoCrsr->Add(&aCrsrDepend);
1596 0 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1597 0 : rTblCrsr.MakeBoxSels();
1598 0 : }
1599 :
1600 36 : SwXTextTableCursor::~SwXTextTableCursor()
1601 : {
1602 12 : SolarMutexGuard aGuard;
1603 12 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1604 12 : delete pUnoCrsr;
1605 24 : }
1606 :
1607 14 : OUString SwXTextTableCursor::getRangeName()
1608 : throw (uno::RuntimeException, std::exception)
1609 : {
1610 14 : SolarMutexGuard aGuard;
1611 14 : OUString aRet;
1612 14 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1613 14 : SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
1614 : //!! see also SwChartDataSequence::getSourceRangeRepresentation
1615 14 : if (pTblCrsr)
1616 : {
1617 14 : pTblCrsr->MakeBoxSels();
1618 14 : const SwStartNode* pNode = pTblCrsr->GetPoint()->nNode.GetNode().FindTableBoxStartNode();
1619 14 : const SwTable* pTable = SwTable::FindTable( GetFrmFmt() );
1620 14 : const SwTableBox* pEndBox = pTable->GetTblBox( pNode->GetIndex());
1621 14 : aRet = pEndBox->GetName();
1622 :
1623 14 : if(pTblCrsr->HasMark())
1624 : {
1625 0 : pNode = pTblCrsr->GetMark()->nNode.GetNode().FindTableBoxStartNode();
1626 0 : const SwTableBox* pStartBox = pTable->GetTblBox( pNode->GetIndex());
1627 0 : if(pEndBox != pStartBox)
1628 : {
1629 : // need to switch start and end?
1630 0 : if (*pTblCrsr->GetPoint() < *pTblCrsr->GetMark())
1631 : {
1632 0 : const SwTableBox* pTmpBox = pStartBox;
1633 0 : pStartBox = pEndBox;
1634 0 : pEndBox = pTmpBox;
1635 : }
1636 :
1637 0 : aRet = pStartBox->GetName() + ":" + pEndBox->GetName();
1638 : }
1639 : }
1640 : }
1641 14 : return aRet;
1642 : }
1643 :
1644 6 : sal_Bool SwXTextTableCursor::gotoCellByName(const OUString& sCellName, sal_Bool Expand)
1645 : throw( uno::RuntimeException, std::exception )
1646 : {
1647 6 : SolarMutexGuard aGuard;
1648 6 : bool bRet = false;
1649 6 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1650 6 : if(pUnoCrsr)
1651 : {
1652 6 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1653 6 : lcl_CrsrSelect(rTblCrsr, Expand);
1654 6 : bRet = rTblCrsr.GotoTblBox(sCellName);
1655 : }
1656 6 : return bRet;
1657 : }
1658 :
1659 4 : sal_Bool SwXTextTableCursor::goLeft(sal_Int16 Count, sal_Bool Expand) throw( uno::RuntimeException, std::exception )
1660 : {
1661 4 : SolarMutexGuard aGuard;
1662 4 : bool bRet = false;
1663 4 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1664 4 : if(pUnoCrsr)
1665 : {
1666 4 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1667 4 : lcl_CrsrSelect(rTblCrsr, Expand);
1668 4 : bRet = rTblCrsr.Left(Count, CRSR_SKIP_CHARS, false, false);
1669 : }
1670 4 : return bRet;
1671 : }
1672 :
1673 4 : sal_Bool SwXTextTableCursor::goRight(sal_Int16 Count, sal_Bool Expand) throw( uno::RuntimeException, std::exception )
1674 : {
1675 4 : SolarMutexGuard aGuard;
1676 4 : bool bRet = false;
1677 4 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1678 4 : if(pUnoCrsr)
1679 : {
1680 4 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1681 4 : lcl_CrsrSelect(rTblCrsr, Expand);
1682 4 : bRet = rTblCrsr.Right(Count, CRSR_SKIP_CHARS, false, false);
1683 : }
1684 4 : return bRet;
1685 : }
1686 :
1687 4 : sal_Bool SwXTextTableCursor::goUp(sal_Int16 Count, sal_Bool Expand) throw( uno::RuntimeException, std::exception )
1688 : {
1689 4 : SolarMutexGuard aGuard;
1690 4 : bool bRet = false;
1691 4 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1692 4 : if(pUnoCrsr)
1693 : {
1694 4 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1695 4 : lcl_CrsrSelect(rTblCrsr, Expand);
1696 4 : bRet = rTblCrsr.UpDown(true, Count, 0, 0);
1697 : }
1698 4 : return bRet;
1699 : }
1700 :
1701 2 : sal_Bool SwXTextTableCursor::goDown(sal_Int16 Count, sal_Bool Expand) throw( uno::RuntimeException, std::exception )
1702 : {
1703 2 : SolarMutexGuard aGuard;
1704 2 : bool bRet = false;
1705 2 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1706 2 : if(pUnoCrsr)
1707 : {
1708 2 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1709 2 : lcl_CrsrSelect(rTblCrsr, Expand);
1710 2 : bRet = rTblCrsr.UpDown(false, Count, 0, 0);
1711 : }
1712 2 : return bRet;
1713 : }
1714 :
1715 8 : void SwXTextTableCursor::gotoStart(sal_Bool Expand) throw( uno::RuntimeException, std::exception )
1716 : {
1717 8 : SolarMutexGuard aGuard;
1718 8 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1719 8 : if(pUnoCrsr)
1720 : {
1721 8 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1722 8 : lcl_CrsrSelect(rTblCrsr, Expand);
1723 8 : rTblCrsr.MoveTable(fnTableCurr, fnTableStart);
1724 8 : }
1725 8 : }
1726 :
1727 14 : void SwXTextTableCursor::gotoEnd(sal_Bool Expand) throw( uno::RuntimeException, std::exception )
1728 : {
1729 14 : SolarMutexGuard aGuard;
1730 14 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1731 14 : if(pUnoCrsr)
1732 : {
1733 14 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1734 14 : lcl_CrsrSelect(rTblCrsr, Expand);
1735 14 : rTblCrsr.MoveTable(fnTableCurr, fnTableEnd);
1736 14 : }
1737 14 : }
1738 :
1739 6 : sal_Bool SwXTextTableCursor::mergeRange()
1740 : throw (uno::RuntimeException, std::exception)
1741 : {
1742 6 : SolarMutexGuard aGuard;
1743 6 : bool bRet = false;
1744 6 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1745 6 : if(pUnoCrsr)
1746 : {
1747 : {
1748 : // The Actions need to be revoked here
1749 6 : UnoActionRemoveContext aRemoveContext(pUnoCrsr->GetDoc());
1750 : }
1751 6 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1752 6 : rTblCrsr.MakeBoxSels();
1753 :
1754 : {
1755 6 : UnoActionContext aContext(pUnoCrsr->GetDoc());
1756 6 : bRet = TBLMERGE_OK == rTblCrsr.GetDoc()->MergeTbl(rTblCrsr);
1757 6 : if(bRet)
1758 : {
1759 6 : size_t nCount = rTblCrsr.GetSelectedBoxesCount();
1760 20 : while (nCount--)
1761 : {
1762 8 : rTblCrsr.DeleteBox(nCount);
1763 : }
1764 6 : }
1765 : }
1766 6 : rTblCrsr.MakeBoxSels();
1767 : }
1768 6 : return bRet;
1769 : }
1770 :
1771 4 : sal_Bool SwXTextTableCursor::splitRange(sal_Int16 Count, sal_Bool Horizontal)
1772 : throw (uno::RuntimeException, std::exception)
1773 : {
1774 4 : SolarMutexGuard aGuard;
1775 4 : if (Count <= 0)
1776 0 : throw uno::RuntimeException("Illegal first argument: needs to be > 0", static_cast < cppu::OWeakObject * > ( this ) );
1777 4 : bool bRet = false;
1778 4 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1779 4 : if(pUnoCrsr)
1780 : {
1781 : {
1782 : // here, all actions need to be revoked
1783 4 : UnoActionRemoveContext aRemoveContext(pUnoCrsr->GetDoc());
1784 : }
1785 4 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1786 4 : rTblCrsr.MakeBoxSels();
1787 : {
1788 4 : UnoActionContext aContext(pUnoCrsr->GetDoc());
1789 : bRet = rTblCrsr.GetDoc()->SplitTbl(
1790 4 : rTblCrsr.GetSelectedBoxes(), !Horizontal, Count);
1791 : }
1792 4 : rTblCrsr.MakeBoxSels();
1793 : }
1794 4 : return bRet;
1795 : }
1796 :
1797 302 : uno::Reference< beans::XPropertySetInfo > SwXTextTableCursor::getPropertySetInfo(void) throw( uno::RuntimeException, std::exception )
1798 : {
1799 302 : static uno::Reference< beans::XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
1800 302 : return xRef;
1801 : }
1802 :
1803 186 : void SwXTextTableCursor::setPropertyValue(const OUString& rPropertyName, const uno::Any& aValue)
1804 : throw (beans::UnknownPropertyException,
1805 : beans::PropertyVetoException,
1806 : lang::IllegalArgumentException,
1807 : lang::WrappedTargetException,
1808 : uno::RuntimeException,
1809 : std::exception)
1810 : {
1811 186 : SolarMutexGuard aGuard;
1812 186 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1813 186 : if(pUnoCrsr)
1814 : {
1815 186 : SwStartNode* pSttNode = pUnoCrsr->GetNode().StartOfSectionNode();
1816 186 : const SwTableNode* pTblNode = pSttNode->FindTableNode();
1817 186 : lcl_FormatTable((SwFrmFmt*)pTblNode->GetTable().GetFrmFmt());
1818 186 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1819 : const SfxItemPropertySimpleEntry* pEntry =
1820 186 : m_pPropSet->getPropertyMap().getByName(rPropertyName);
1821 186 : if(pEntry)
1822 : {
1823 186 : if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
1824 0 : throw beans::PropertyVetoException("Property is read-only: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1825 186 : rTblCrsr.MakeBoxSels();
1826 186 : SwDoc* pDoc = pUnoCrsr->GetDoc();
1827 186 : switch(pEntry->nWID )
1828 : {
1829 : case FN_UNO_TABLE_CELL_BACKGROUND:
1830 : {
1831 0 : SvxBrushItem aBrush( RES_BACKGROUND );
1832 0 : pDoc->GetBoxAttr( *pUnoCrsr, aBrush );
1833 0 : aBrush.PutValue(aValue, pEntry->nMemberId);
1834 0 : pDoc->SetBoxAttr( *pUnoCrsr, aBrush );
1835 :
1836 : }
1837 0 : break;
1838 : case RES_BOXATR_FORMAT:
1839 : {
1840 0 : SfxUInt32Item aNumberFormat(RES_BOXATR_FORMAT);
1841 0 : aNumberFormat.PutValue(aValue, 0);
1842 0 : pDoc->SetBoxAttr( *pUnoCrsr, aNumberFormat);
1843 : }
1844 0 : break;
1845 : case FN_UNO_PARA_STYLE:
1846 0 : SwUnoCursorHelper::SetTxtFmtColl(aValue, *pUnoCrsr);
1847 0 : break;
1848 : default:
1849 : {
1850 186 : SfxItemSet aItemSet( pDoc->GetAttrPool(), pEntry->nWID, pEntry->nWID );
1851 186 : SwUnoCursorHelper::GetCrsrAttr(rTblCrsr.GetSelRing(),
1852 186 : aItemSet);
1853 :
1854 186 : if (!SwUnoCursorHelper::SetCursorPropertyValue(
1855 186 : *pEntry, aValue, rTblCrsr.GetSelRing(), aItemSet))
1856 : {
1857 184 : m_pPropSet->setPropertyValue(*pEntry, aValue, aItemSet);
1858 : }
1859 184 : SwUnoCursorHelper::SetCrsrAttr(rTblCrsr.GetSelRing(),
1860 186 : aItemSet, nsSetAttrMode::SETATTR_DEFAULT, true);
1861 : }
1862 : }
1863 : }
1864 : else
1865 0 : throw beans::UnknownPropertyException("Unknown property: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1866 186 : }
1867 184 : }
1868 :
1869 390 : uno::Any SwXTextTableCursor::getPropertyValue(const OUString& rPropertyName)
1870 : throw (beans::UnknownPropertyException,
1871 : lang::WrappedTargetException,
1872 : uno::RuntimeException,
1873 : std::exception)
1874 : {
1875 390 : SolarMutexGuard aGuard;
1876 390 : uno::Any aRet;
1877 390 : SwUnoCrsr* pUnoCrsr = GetCrsr();
1878 390 : if(pUnoCrsr)
1879 : {
1880 390 : SwStartNode* pSttNode = pUnoCrsr->GetNode().StartOfSectionNode();
1881 390 : const SwTableNode* pTblNode = pSttNode->FindTableNode();
1882 390 : lcl_FormatTable((SwFrmFmt*)pTblNode->GetTable().GetFrmFmt());
1883 390 : SwUnoTableCrsr& rTblCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
1884 : const SfxItemPropertySimpleEntry* pEntry =
1885 390 : m_pPropSet->getPropertyMap().getByName(rPropertyName);
1886 390 : if(pEntry)
1887 : {
1888 390 : rTblCrsr.MakeBoxSels();
1889 390 : switch(pEntry->nWID )
1890 : {
1891 : case FN_UNO_TABLE_CELL_BACKGROUND:
1892 : {
1893 0 : SvxBrushItem aBrush( RES_BACKGROUND );
1894 0 : if (rTblCrsr.GetDoc()->GetBoxAttr( *pUnoCrsr, aBrush ))
1895 0 : aBrush.QueryValue(aRet, pEntry->nMemberId);
1896 :
1897 : }
1898 0 : break;
1899 : case RES_BOXATR_FORMAT:
1900 : // TODO: GetAttr for table selections in a Doc is missing
1901 : OSL_FAIL("not implemented");
1902 0 : break;
1903 : case FN_UNO_PARA_STYLE:
1904 : {
1905 : SwFmtColl *const pFmt =
1906 0 : SwUnoCursorHelper::GetCurTxtFmtColl(*pUnoCrsr, false);
1907 0 : OUString sRet;
1908 0 : if(pFmt)
1909 0 : sRet = pFmt->GetName();
1910 0 : aRet <<= sRet;
1911 : }
1912 0 : break;
1913 : default:
1914 : {
1915 390 : SfxItemSet aSet(rTblCrsr.GetDoc()->GetAttrPool(),
1916 : RES_CHRATR_BEGIN, RES_FRMATR_END -1,
1917 : RES_UNKNOWNATR_CONTAINER, RES_UNKNOWNATR_CONTAINER,
1918 390 : 0L);
1919 390 : SwUnoCursorHelper::GetCrsrAttr(rTblCrsr.GetSelRing(),
1920 390 : aSet);
1921 390 : m_pPropSet->getPropertyValue(*pEntry, aSet, aRet);
1922 : }
1923 : }
1924 : }
1925 : else
1926 0 : throw beans::UnknownPropertyException("Unknown property: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
1927 : }
1928 390 : return aRet;
1929 : }
1930 :
1931 0 : void SwXTextTableCursor::addPropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1932 : {
1933 : OSL_FAIL("not implemented");
1934 0 : }
1935 :
1936 0 : void SwXTextTableCursor::removePropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1937 : {
1938 : OSL_FAIL("not implemented");
1939 0 : }
1940 :
1941 0 : void SwXTextTableCursor::addVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1942 : {
1943 : OSL_FAIL("not implemented");
1944 0 : }
1945 :
1946 0 : void SwXTextTableCursor::removeVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
1947 : {
1948 : OSL_FAIL("not implemented");
1949 0 : }
1950 :
1951 8 : void SwXTextTableCursor::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
1952 : {
1953 8 : ClientModify(this, pOld, pNew);
1954 8 : }
1955 :
1956 2248 : class SwXTextTable::Impl
1957 : {
1958 : private:
1959 : ::osl::Mutex m_Mutex; // just for OInterfaceContainerHelper
1960 :
1961 : public:
1962 : uno::WeakReference<uno::XInterface> m_wThis;
1963 : ::cppu::OMultiTypeInterfaceContainerHelper m_Listeners;
1964 :
1965 2248 : Impl() : m_Listeners(m_Mutex) { }
1966 : };
1967 :
1968 : class SwTableProperties_Impl
1969 : {
1970 : SwUnoCursorHelper::SwAnyMapHelper aAnyMap;
1971 : public:
1972 : SwTableProperties_Impl();
1973 : ~SwTableProperties_Impl();
1974 :
1975 : void SetProperty(sal_uInt16 nWhichId, sal_uInt16 nMemberId, const uno::Any& aVal);
1976 : bool GetProperty(sal_uInt16 nWhichId, sal_uInt16 nMemberId, const uno::Any*& rpAny);
1977 :
1978 : void ApplyTblAttr(const SwTable& rTbl, SwDoc& rDoc);
1979 : };
1980 :
1981 196 : SwTableProperties_Impl::SwTableProperties_Impl()
1982 : {
1983 196 : }
1984 :
1985 196 : SwTableProperties_Impl::~SwTableProperties_Impl()
1986 : {
1987 196 : }
1988 :
1989 2 : void SwTableProperties_Impl::SetProperty(sal_uInt16 nWhichId, sal_uInt16 nMemberId, const uno::Any& rVal)
1990 : {
1991 2 : aAnyMap.SetValue( nWhichId, nMemberId, rVal );
1992 2 : }
1993 :
1994 3612 : bool SwTableProperties_Impl::GetProperty(sal_uInt16 nWhichId, sal_uInt16 nMemberId, const uno::Any*& rpAny )
1995 : {
1996 3612 : return aAnyMap.FillValue( nWhichId, nMemberId, rpAny );
1997 : }
1998 :
1999 172 : void SwTableProperties_Impl::ApplyTblAttr(const SwTable& rTbl, SwDoc& rDoc)
2000 : {
2001 172 : SfxItemSet aSet(rDoc.GetAttrPool(),
2002 : RES_LAYOUT_SPLIT, RES_LAYOUT_SPLIT,
2003 : RES_BACKGROUND, RES_BACKGROUND,
2004 : RES_FRM_SIZE, RES_UL_SPACE,
2005 : RES_HORI_ORIENT, RES_HORI_ORIENT,
2006 : RES_BREAK, RES_BREAK,
2007 : RES_KEEP, RES_KEEP,
2008 : RES_SHADOW, RES_SHADOW,
2009 : RES_PAGEDESC, RES_PAGEDESC,
2010 : 0
2011 172 : );
2012 : const uno::Any* pRepHead;
2013 172 : const SwFrmFmt &rFrmFmt = *rTbl.GetFrmFmt();
2014 172 : if(GetProperty(FN_TABLE_HEADLINE_REPEAT, 0xff, pRepHead ))
2015 : {
2016 0 : bool bVal = *(sal_Bool*)pRepHead->getValue();
2017 0 : ((SwTable&)rTbl).SetRowsToRepeat( bVal ? 1 : 0 ); // TODO: MULTIHEADER
2018 : }
2019 :
2020 172 : const uno::Any* pBackColor = 0;
2021 172 : GetProperty(RES_BACKGROUND, MID_BACK_COLOR, pBackColor );
2022 172 : const uno::Any* pBackTrans = 0;
2023 172 : GetProperty(RES_BACKGROUND, MID_GRAPHIC_TRANSPARENT, pBackTrans );
2024 172 : const uno::Any* pGrLoc = 0;
2025 172 : GetProperty(RES_BACKGROUND, MID_GRAPHIC_POSITION, pGrLoc );
2026 172 : const uno::Any* pGrURL = 0;
2027 172 : GetProperty(RES_BACKGROUND, MID_GRAPHIC_URL, pGrURL );
2028 172 : const uno::Any* pGrFilter = 0;
2029 172 : GetProperty(RES_BACKGROUND, MID_GRAPHIC_FILTER, pGrFilter );
2030 :
2031 172 : if(pBackColor||pBackTrans||pGrURL||pGrFilter||pGrLoc)
2032 : {
2033 2 : SvxBrushItem aBrush(rFrmFmt.makeBackgroundBrushItem());
2034 2 : if(pBackColor)
2035 2 : aBrush.PutValue(*pBackColor, MID_BACK_COLOR);
2036 2 : if(pBackTrans)
2037 0 : aBrush.PutValue(*pBackTrans, MID_GRAPHIC_TRANSPARENT);
2038 2 : if(pGrURL)
2039 0 : aBrush.PutValue(*pGrURL, MID_GRAPHIC_URL);
2040 2 : if(pGrFilter)
2041 0 : aBrush.PutValue(*pGrFilter, MID_GRAPHIC_FILTER);
2042 2 : if(pGrLoc)
2043 0 : aBrush.PutValue(*pGrLoc, MID_GRAPHIC_POSITION);
2044 2 : aSet.Put(aBrush);
2045 : }
2046 :
2047 172 : bool bPutBreak = true;
2048 : const uno::Any* pPage;
2049 172 : if(GetProperty(FN_UNO_PAGE_STYLE, 0, pPage) || GetProperty(RES_PAGEDESC, 0xff, pPage))
2050 : {
2051 0 : OUString sPageStyle;
2052 0 : (*pPage) >>= sPageStyle;
2053 0 : if (!sPageStyle.isEmpty())
2054 : {
2055 0 : SwStyleNameMapper::FillUIName(sPageStyle, sPageStyle, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, true );
2056 0 : const SwPageDesc* pDesc = SwPageDesc::GetByName(rDoc, sPageStyle);
2057 0 : if(pDesc)
2058 : {
2059 0 : SwFmtPageDesc aDesc( pDesc );
2060 : const uno::Any* pPgNo;
2061 0 : if(GetProperty(RES_PAGEDESC, MID_PAGEDESC_PAGENUMOFFSET, pPgNo ))
2062 : {
2063 0 : sal_Int16 nTmp = 0;
2064 0 : (*pPgNo) >>= nTmp;
2065 0 : aDesc.SetNumOffset( nTmp );
2066 : }
2067 0 : aSet.Put(aDesc);
2068 0 : bPutBreak = false;
2069 : }
2070 :
2071 0 : }
2072 : }
2073 : const uno::Any* pBreak;
2074 172 : if(bPutBreak && GetProperty(RES_BREAK, 0, pBreak))
2075 : {
2076 0 : SvxFmtBreakItem aBreak ( rFrmFmt.GetBreak() );
2077 0 : aBreak.PutValue(*pBreak, 0);
2078 0 : aSet.Put(aBreak);
2079 : }
2080 : const uno::Any* pShadow;
2081 172 : if(GetProperty(RES_SHADOW, 0, pShadow))
2082 : {
2083 0 : SvxShadowItem aShd ( rFrmFmt.GetShadow() );
2084 0 : aShd.PutValue(*pShadow, CONVERT_TWIPS);
2085 0 : aSet.Put(aShd);
2086 : }
2087 : const uno::Any* pKeep;
2088 172 : if(GetProperty(RES_KEEP, 0, pKeep))
2089 : {
2090 0 : SvxFmtKeepItem aKeep( rFrmFmt.GetKeep() );
2091 0 : aKeep.PutValue(*pKeep, 0);
2092 0 : aSet.Put(aKeep);
2093 : }
2094 :
2095 : const uno::Any* pHOrient;
2096 172 : if(GetProperty(RES_HORI_ORIENT, MID_HORIORIENT_ORIENT, pHOrient))
2097 : {
2098 0 : SwFmtHoriOrient aOrient ( rFrmFmt.GetHoriOrient() );
2099 0 : ((SfxPoolItem&)aOrient).PutValue(*pHOrient, MID_HORIORIENT_ORIENT|CONVERT_TWIPS);
2100 0 : aSet.Put(aOrient);
2101 : }
2102 :
2103 172 : const uno::Any* pSzRel = 0;
2104 172 : GetProperty(FN_TABLE_IS_RELATIVE_WIDTH, 0xff, pSzRel );
2105 172 : const uno::Any* pRelWidth = 0;
2106 172 : GetProperty(FN_TABLE_RELATIVE_WIDTH, 0xff, pRelWidth);
2107 172 : const uno::Any* pWidth = 0;
2108 172 : GetProperty(FN_TABLE_WIDTH, 0xff, pWidth );
2109 :
2110 172 : bool bPutSize = pWidth != 0;
2111 344 : SwFmtFrmSize aSz( ATT_VAR_SIZE);
2112 172 : if(pWidth)
2113 : {
2114 0 : ((SfxPoolItem&)aSz).PutValue(*pWidth, MID_FRMSIZE_WIDTH);
2115 0 : bPutSize = true;
2116 : }
2117 172 : bool bTemp = pSzRel ? *(sal_Bool*)pSzRel->getValue() : sal_False;
2118 172 : if(pSzRel && bTemp && pRelWidth)
2119 : {
2120 0 : ((SfxPoolItem&)aSz).PutValue(*pRelWidth, MID_FRMSIZE_REL_WIDTH|CONVERT_TWIPS);
2121 0 : bPutSize = true;
2122 : }
2123 172 : if(bPutSize)
2124 : {
2125 0 : if(!aSz.GetWidth())
2126 0 : aSz.SetWidth(MINLAY);
2127 0 : aSet.Put(aSz);
2128 : }
2129 172 : const uno::Any* pL = 0;
2130 172 : GetProperty(RES_LR_SPACE, MID_L_MARGIN|CONVERT_TWIPS, pL);
2131 172 : const uno::Any* pR = 0;
2132 172 : GetProperty(RES_LR_SPACE, MID_R_MARGIN|CONVERT_TWIPS, pR);
2133 172 : if(pL||pR)
2134 : {
2135 0 : SvxLRSpaceItem aLR ( rFrmFmt.GetLRSpace() );
2136 0 : if(pL)
2137 0 : ((SfxPoolItem&)aLR).PutValue(*pL, MID_L_MARGIN|CONVERT_TWIPS);
2138 0 : if(pR)
2139 0 : ((SfxPoolItem&)aLR).PutValue(*pR, MID_R_MARGIN|CONVERT_TWIPS);
2140 0 : aSet.Put(aLR);
2141 : }
2142 172 : const uno::Any* pU = 0;
2143 172 : GetProperty(RES_UL_SPACE, MID_UP_MARGIN|CONVERT_TWIPS, pU);
2144 172 : const uno::Any* pLo = 0;
2145 172 : GetProperty(RES_UL_SPACE, MID_LO_MARGIN|CONVERT_TWIPS, pLo);
2146 172 : if(pU||pLo)
2147 : {
2148 0 : SvxULSpaceItem aUL ( rFrmFmt.GetULSpace() );
2149 0 : if(pU)
2150 0 : ((SfxPoolItem&)aUL).PutValue(*pU, MID_UP_MARGIN|CONVERT_TWIPS);
2151 0 : if(pLo)
2152 0 : ((SfxPoolItem&)aUL).PutValue(*pLo, MID_LO_MARGIN|CONVERT_TWIPS);
2153 0 : aSet.Put(aUL);
2154 : }
2155 : const::uno::Any* pSplit;
2156 172 : if(GetProperty(RES_LAYOUT_SPLIT, 0, pSplit ))
2157 : {
2158 0 : bool bTmp = *(sal_Bool*)pSplit->getValue();
2159 0 : SwFmtLayoutSplit aSp(bTmp);
2160 0 : aSet.Put(aSp);
2161 : }
2162 :
2163 172 : if(aSet.Count())
2164 : {
2165 2 : rDoc.SetAttr( aSet, *rTbl.GetFrmFmt() );
2166 172 : }
2167 172 : }
2168 :
2169 : namespace
2170 : {
2171 : class theSwXTextTableUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSwXTextTableUnoTunnelId > {};
2172 : }
2173 :
2174 1392 : const uno::Sequence< sal_Int8 > & SwXTextTable::getUnoTunnelId()
2175 : {
2176 1392 : return theSwXTextTableUnoTunnelId::get().getSeq();
2177 : }
2178 :
2179 1246 : sal_Int64 SAL_CALL SwXTextTable::getSomething( const uno::Sequence< sal_Int8 >& rId )
2180 : throw(uno::RuntimeException, std::exception)
2181 : {
2182 2492 : if( rId.getLength() == 16
2183 3738 : && 0 == memcmp( getUnoTunnelId().getConstArray(),
2184 2492 : rId.getConstArray(), 16 ) )
2185 : {
2186 138 : return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
2187 : }
2188 1108 : return 0;
2189 : }
2190 :
2191 111303 : TYPEINIT1(SwXTextTable, SwClient)
2192 :
2193 196 : SwXTextTable::SwXTextTable()
2194 196 : : m_pImpl(new Impl)
2195 : ,
2196 196 : m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE)),
2197 196 : pTableProps(new SwTableProperties_Impl),
2198 : bIsDescriptor(true),
2199 : nRows(2),
2200 : nColumns(2),
2201 : bFirstRowAsLabel(false),
2202 784 : bFirstColumnAsLabel(false)
2203 : {
2204 196 : }
2205 :
2206 2052 : SwXTextTable::SwXTextTable(SwFrmFmt& rFrmFmt)
2207 : : SwClient( &rFrmFmt )
2208 2052 : , m_pImpl(new Impl)
2209 : ,
2210 2052 : m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE)),
2211 : pTableProps(0),
2212 : bIsDescriptor(false),
2213 : nRows(0),
2214 : nColumns(0),
2215 : bFirstRowAsLabel(false),
2216 6156 : bFirstColumnAsLabel(false)
2217 : {
2218 2052 : }
2219 :
2220 6744 : SwXTextTable::~SwXTextTable()
2221 : {
2222 2248 : delete pTableProps;
2223 4496 : }
2224 :
2225 : uno::Reference<text::XTextTable>
2226 2258 : SwXTextTable::CreateXTextTable(SwFrmFmt *const pFrmFmt)
2227 : {
2228 2258 : uno::Reference<text::XTextTable> xTable;
2229 2258 : if (pFrmFmt)
2230 : {
2231 2062 : xTable.set(pFrmFmt->GetXObject(), uno::UNO_QUERY); // cached?
2232 : }
2233 2258 : if (!xTable.is())
2234 : {
2235 : SwXTextTable *const pNew(
2236 2248 : (pFrmFmt) ? new SwXTextTable(*pFrmFmt) : new SwXTextTable());
2237 2248 : xTable.set(pNew);
2238 2248 : if (pFrmFmt)
2239 : {
2240 2052 : pFrmFmt->SetXObject(xTable);
2241 : }
2242 : // need a permanent Reference to initialize m_wThis
2243 2248 : pNew->m_pImpl->m_wThis = xTable;
2244 : }
2245 2258 : return xTable;
2246 : }
2247 :
2248 162 : void SwXTextTable::initialize(sal_Int32 nR, sal_Int32 nC) throw( uno::RuntimeException, std::exception )
2249 : {
2250 162 : if(!bIsDescriptor || nR <= 0 || nC <= 0 || nR >= USHRT_MAX || nC >= USHRT_MAX )
2251 0 : throw uno::RuntimeException();
2252 : else
2253 : {
2254 162 : nRows = (sal_uInt16)nR;
2255 162 : nColumns = (sal_uInt16)nC;
2256 : }
2257 162 : }
2258 :
2259 1098 : uno::Reference< table::XTableRows > SwXTextTable::getRows(void) throw( uno::RuntimeException, std::exception )
2260 : {
2261 1098 : SolarMutexGuard aGuard;
2262 1098 : uno::Reference< table::XTableRows > xRet;
2263 1098 : if (SwFrmFmt* pFmt = GetFrmFmt())
2264 : {
2265 1098 : SwXTableRows* pRows = SwIterator<SwXTableRows,SwFmt>::FirstElement(*pFmt);
2266 1098 : if (!pRows)
2267 1098 : pRows = new SwXTableRows(*pFmt);
2268 1098 : xRet = pRows;
2269 : }
2270 1098 : if (!xRet.is())
2271 0 : throw uno::RuntimeException();
2272 1098 : return xRet;
2273 : }
2274 :
2275 8 : uno::Reference< table::XTableColumns > SwXTextTable::getColumns(void) throw( uno::RuntimeException, std::exception )
2276 : {
2277 8 : SolarMutexGuard aGuard;
2278 8 : uno::Reference< table::XTableColumns > xRet;
2279 8 : if (SwFrmFmt* pFmt = GetFrmFmt())
2280 : {
2281 8 : SwXTableColumns* pCols = SwIterator<SwXTableColumns,SwFmt>::FirstElement(*pFmt);
2282 8 : if (!pCols)
2283 8 : pCols = new SwXTableColumns(*pFmt);
2284 8 : xRet = pCols;
2285 : }
2286 8 : if (!xRet.is())
2287 0 : throw uno::RuntimeException();
2288 8 : return xRet;
2289 : }
2290 :
2291 652 : uno::Reference< table::XCell > SwXTextTable::getCellByName(const OUString& sCellName) throw( uno::RuntimeException, std::exception )
2292 : {
2293 652 : SolarMutexGuard aGuard;
2294 652 : uno::Reference< table::XCell > xRet;
2295 652 : SwFrmFmt* pFmt = GetFrmFmt();
2296 652 : if(pFmt)
2297 : {
2298 652 : SwTable* pTable = SwTable::FindTable( pFmt );
2299 652 : SwTableBox* pBox = (SwTableBox*)pTable->GetTblBox( sCellName );
2300 652 : if(pBox)
2301 : {
2302 652 : xRet = SwXCell::CreateXCell(pFmt, pBox);
2303 : }
2304 : }
2305 : else
2306 0 : throw uno::RuntimeException();
2307 652 : return xRet;
2308 : }
2309 :
2310 60 : uno::Sequence< OUString > SwXTextTable::getCellNames(void) throw( uno::RuntimeException, std::exception )
2311 : {
2312 60 : SolarMutexGuard aGuard;
2313 60 : SwFrmFmt* pFmt = GetFrmFmt();
2314 60 : if(pFmt)
2315 : {
2316 60 : SwTable* pTable = SwTable::FindTable( pFmt );
2317 : // exists at the table and at all boxes
2318 60 : SwTableLines& rTblLines = pTable->GetTabLines();
2319 60 : std::vector<OUString*> aAllNames;
2320 60 : lcl_InspectLines(rTblLines, aAllNames);
2321 120 : uno::Sequence< OUString > aRet( static_cast<sal_Int32>(aAllNames.size()) );
2322 60 : OUString* pArray = aRet.getArray();
2323 746 : for( size_t i = 0; i < aAllNames.size(); ++i)
2324 : {
2325 686 : pArray[i] = *aAllNames[i];
2326 686 : delete aAllNames[i];
2327 : }
2328 120 : return aRet;
2329 : }
2330 0 : return uno::Sequence< OUString >();
2331 : }
2332 :
2333 12 : uno::Reference< text::XTextTableCursor > SwXTextTable::createCursorByCellName(const OUString& sCellName)
2334 : throw (uno::RuntimeException, std::exception)
2335 : {
2336 12 : SolarMutexGuard aGuard;
2337 12 : uno::Reference< text::XTextTableCursor > xRet;
2338 12 : SwFrmFmt* pFmt = GetFrmFmt();
2339 12 : if(pFmt)
2340 : {
2341 12 : SwTable* pTable = SwTable::FindTable( pFmt );
2342 12 : SwTableBox* pBox = (SwTableBox*)pTable->GetTblBox( sCellName );
2343 12 : if(pBox && pBox->getRowSpan() > 0 )
2344 : {
2345 12 : xRet = new SwXTextTableCursor(pFmt, pBox);
2346 : }
2347 : }
2348 12 : if(!xRet.is())
2349 0 : throw uno::RuntimeException();
2350 12 : return xRet;
2351 : }
2352 :
2353 172 : void SwXTextTable::attachToRange(const uno::Reference< text::XTextRange > & xTextRange)
2354 : throw( lang::IllegalArgumentException, uno::RuntimeException )
2355 : {
2356 : // attachToRange must only be called once
2357 172 : if(!bIsDescriptor) /* already attached ? */
2358 0 : throw uno::RuntimeException("SwXTextTable: already attached to range.", static_cast < cppu::OWeakObject * > ( this ) );
2359 :
2360 172 : uno::Reference<XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
2361 172 : SwXTextRange* pRange = 0;
2362 172 : OTextCursorHelper* pCursor = 0;
2363 172 : if(xRangeTunnel.is())
2364 : {
2365 : pRange = reinterpret_cast< SwXTextRange * >(
2366 172 : sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
2367 : pCursor = reinterpret_cast< OTextCursorHelper * >(
2368 172 : sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
2369 : }
2370 172 : SwDoc* pDoc = pRange ? (SwDoc*)pRange->GetDoc() : pCursor ? (SwDoc*)pCursor->GetDoc() : 0;
2371 172 : if(pDoc && nRows && nColumns)
2372 : {
2373 172 : SwUnoInternalPaM aPam(*pDoc);
2374 : // this now needs to return TRUE
2375 172 : ::sw::XTextRangeToSwPaM(aPam, xTextRange);
2376 :
2377 : {
2378 172 : UnoActionContext aCont( pDoc );
2379 :
2380 172 : pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_EMPTY, NULL);
2381 172 : const SwTable *pTable = 0;
2382 172 : if( 0 != aPam.Start()->nContent.GetIndex() )
2383 : {
2384 0 : pDoc->getIDocumentContentOperations().SplitNode(*aPam.Start(), false );
2385 : }
2386 : //TODO: if it is the last paragraph than add another one!
2387 172 : if( aPam.HasMark() )
2388 : {
2389 0 : pDoc->getIDocumentContentOperations().DeleteAndJoin(aPam);
2390 0 : aPam.DeleteMark();
2391 : }
2392 : pTable = pDoc->InsertTable( SwInsertTableOptions( tabopts::HEADLINE | tabopts::DEFAULT_BORDER | tabopts::SPLIT_LAYOUT, 0 ),
2393 172 : *aPam.GetPoint(),
2394 : nRows,
2395 : nColumns,
2396 344 : text::HoriOrientation::FULL );
2397 172 : if(pTable)
2398 : {
2399 : // here, the properties of the descriptor need to be analyzed
2400 172 : pTableProps->ApplyTblAttr(*pTable, *pDoc);
2401 172 : SwFrmFmt* pTblFmt = pTable->GetFrmFmt();
2402 172 : lcl_FormatTable( pTblFmt );
2403 :
2404 172 : pTblFmt->Add(this);
2405 172 : if(!m_sTableName.isEmpty())
2406 : {
2407 4 : sal_uInt16 nIndex = 1;
2408 4 : OUString sTmpNameIndex(m_sTableName);
2409 8 : while(pDoc->FindTblFmtByName( sTmpNameIndex, true ) && nIndex < USHRT_MAX)
2410 : {
2411 0 : sTmpNameIndex = m_sTableName + OUString::number(nIndex++);
2412 : }
2413 4 : pDoc->SetTableName( *pTblFmt, sTmpNameIndex);
2414 : }
2415 :
2416 : const::uno::Any* pName;
2417 172 : if(pTableProps->GetProperty(FN_UNO_TABLE_NAME, 0, pName))
2418 : {
2419 0 : OUString sTmp;
2420 0 : (*pName) >>= sTmp;
2421 0 : setName(sTmp);
2422 : }
2423 172 : bIsDescriptor = false;
2424 172 : DELETEZ(pTableProps);
2425 : }
2426 172 : pDoc->GetIDocumentUndoRedo().EndUndo( UNDO_END, NULL );
2427 172 : }
2428 : }
2429 : else
2430 0 : throw lang::IllegalArgumentException();
2431 172 : }
2432 :
2433 172 : void SwXTextTable::attach(const uno::Reference< text::XTextRange > & xTextRange)
2434 : throw( lang::IllegalArgumentException, uno::RuntimeException, std::exception )
2435 : {
2436 172 : SolarMutexGuard aGuard;
2437 172 : attachToRange( xTextRange );
2438 172 : }
2439 :
2440 1070 : uno::Reference< text::XTextRange > SwXTextTable::getAnchor(void)
2441 : throw( uno::RuntimeException, std::exception )
2442 : {
2443 1070 : SolarMutexGuard aGuard;
2444 1070 : SwFrmFmt* pFmt = GetFrmFmt();
2445 1070 : if(!pFmt)
2446 0 : throw uno::RuntimeException();
2447 1070 : uno::Reference< text::XTextRange > xRet = new SwXTextRange(*pFmt);
2448 1070 : return xRet;
2449 : }
2450 :
2451 8 : void SwXTextTable::dispose(void) throw( uno::RuntimeException, std::exception )
2452 : {
2453 8 : SolarMutexGuard aGuard;
2454 8 : SwFrmFmt* pFmt = GetFrmFmt();
2455 8 : if(pFmt)
2456 : {
2457 8 : SwTable* pTable = SwTable::FindTable( pFmt );
2458 8 : SwTableSortBoxes& rBoxes = pTable->GetTabSortBoxes();
2459 8 : SwSelBoxes aSelBoxes;
2460 176 : for(SwTableSortBoxes::const_iterator it = rBoxes.begin(); it != rBoxes.end(); ++it )
2461 168 : aSelBoxes.insert( *it );
2462 8 : pFmt->GetDoc()->DeleteRowCol(aSelBoxes);
2463 : }
2464 : else
2465 0 : throw uno::RuntimeException();
2466 8 : }
2467 :
2468 4 : void SAL_CALL SwXTextTable::addEventListener(
2469 : const uno::Reference<lang::XEventListener> & xListener)
2470 : throw (uno::RuntimeException, std::exception)
2471 : {
2472 : // no need to lock here as m_pImpl is const and container threadsafe
2473 4 : m_pImpl->m_Listeners.addInterface(
2474 8 : cppu::UnoType<lang::XEventListener>::get(), xListener);
2475 4 : }
2476 :
2477 2 : void SAL_CALL SwXTextTable::removeEventListener(
2478 : const uno::Reference< lang::XEventListener > & xListener)
2479 : throw (uno::RuntimeException, std::exception)
2480 : {
2481 : // no need to lock here as m_pImpl is const and container threadsafe
2482 2 : m_pImpl->m_Listeners.removeInterface(
2483 4 : cppu::UnoType<lang::XEventListener>::get(), xListener);
2484 2 : }
2485 :
2486 21008 : uno::Reference< table::XCell > SwXTextTable::getCellByPosition(sal_Int32 nColumn, sal_Int32 nRow)
2487 : throw( uno::RuntimeException, lang::IndexOutOfBoundsException, std::exception )
2488 : {
2489 21008 : SolarMutexGuard aGuard;
2490 21008 : uno::Reference< table::XCell > aRef;
2491 21008 : SwFrmFmt* pFmt = GetFrmFmt();
2492 : // sheet is unimportant
2493 21008 : if(nColumn >= 0 && nRow >= 0 && nColumn < USHRT_MAX && nRow < USHRT_MAX && pFmt)
2494 : {
2495 21006 : SwXCell* pXCell = lcl_CreateXCell(pFmt, nColumn, nRow);
2496 21006 : if(pXCell)
2497 21004 : aRef = pXCell;
2498 : }
2499 21008 : if(!aRef.is())
2500 4 : throw lang::IndexOutOfBoundsException();
2501 21008 : return aRef;
2502 : }
2503 :
2504 10 : uno::Reference< table::XCellRange > SwXTextTable::GetRangeByName(SwFrmFmt* pFmt, SwTable* pTable,
2505 : const OUString& rTLName, const OUString& rBRName,
2506 : SwRangeDescriptor& rDesc)
2507 : {
2508 10 : SolarMutexGuard aGuard;
2509 10 : uno::Reference< table::XCellRange > aRef;
2510 10 : const SwTableBox* pTLBox = pTable->GetTblBox( rTLName );
2511 10 : if(pTLBox)
2512 : {
2513 : // invalidate all actions
2514 10 : UnoActionRemoveContext aRemoveContext(pFmt->GetDoc());
2515 10 : const SwStartNode* pSttNd = pTLBox->GetSttNd();
2516 20 : SwPosition aPos(*pSttNd);
2517 : // set cursor to the upper-left cell of the range
2518 10 : SwUnoCrsr* pUnoCrsr = pFmt->GetDoc()->CreateUnoCrsr(aPos, true);
2519 10 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
2520 10 : pUnoCrsr->SetRemainInSection( false );
2521 10 : const SwTableBox* pBRBox = pTable->GetTblBox( rBRName );
2522 10 : if(pBRBox)
2523 : {
2524 10 : pUnoCrsr->SetMark();
2525 10 : pUnoCrsr->GetPoint()->nNode = *pBRBox->GetSttNd();
2526 10 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
2527 10 : SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
2528 10 : pCrsr->MakeBoxSels();
2529 : // pUnoCrsr will be provided and will not be deleted
2530 10 : SwXCellRange* pCellRange = new SwXCellRange(pUnoCrsr, *pFmt, rDesc);
2531 10 : aRef = pCellRange;
2532 : }
2533 : else
2534 10 : delete pUnoCrsr;
2535 : }
2536 10 : return aRef;
2537 : }
2538 :
2539 10 : uno::Reference< table::XCellRange > SwXTextTable::getCellRangeByPosition(sal_Int32 nLeft, sal_Int32 nTop,
2540 : sal_Int32 nRight, sal_Int32 nBottom)
2541 : throw (uno::RuntimeException,
2542 : lang::IndexOutOfBoundsException,
2543 : std::exception)
2544 : {
2545 10 : SolarMutexGuard aGuard;
2546 10 : uno::Reference< table::XCellRange > aRef;
2547 10 : SwFrmFmt* pFmt = GetFrmFmt();
2548 10 : if(pFmt && nRight < USHRT_MAX && nBottom < USHRT_MAX &&
2549 10 : nLeft <= nRight && nTop <= nBottom &&
2550 8 : nLeft >= 0 && nRight >= 0 && nTop >= 0 && nBottom >= 0 )
2551 : {
2552 8 : SwTable* pTable = SwTable::FindTable( pFmt );
2553 8 : if(!pTable->IsTblComplex())
2554 : {
2555 : SwRangeDescriptor aDesc;
2556 8 : aDesc.nTop = nTop;
2557 8 : aDesc.nBottom = nBottom;
2558 8 : aDesc.nLeft = nLeft;
2559 8 : aDesc.nRight = nRight;
2560 8 : const OUString sTLName = sw_GetCellName(aDesc.nLeft, aDesc.nTop);
2561 16 : const OUString sBRName = sw_GetCellName(aDesc.nRight, aDesc.nBottom);
2562 :
2563 : // please note that according to the 'if' statement at the begin
2564 : // sTLName:sBRName already denotes the normalized range string
2565 :
2566 16 : aRef = GetRangeByName(pFmt, pTable, sTLName, sBRName, aDesc);
2567 : }
2568 : }
2569 10 : if(!aRef.is())
2570 2 : throw lang::IndexOutOfBoundsException();
2571 10 : return aRef;
2572 : }
2573 :
2574 2 : uno::Reference< table::XCellRange > SwXTextTable::getCellRangeByName(const OUString& sRange)
2575 : throw (uno::RuntimeException, std::exception)
2576 : {
2577 2 : SolarMutexGuard aGuard;
2578 2 : uno::Reference< table::XCellRange > aRef;
2579 2 : SwFrmFmt* pFmt = GetFrmFmt();
2580 2 : if(pFmt)
2581 : {
2582 2 : SwTable* pTable = SwTable::FindTable( pFmt );
2583 2 : if(!pTable->IsTblComplex())
2584 : {
2585 2 : sal_Int32 nPos = 0;
2586 2 : const OUString sTLName(sRange.getToken(0, ':', nPos));
2587 4 : const OUString sBRName(sRange.getToken(0, ':', nPos));
2588 2 : if(sTLName.isEmpty() || sBRName.isEmpty())
2589 0 : throw uno::RuntimeException();
2590 : SwRangeDescriptor aDesc;
2591 2 : aDesc.nTop = aDesc.nLeft = aDesc.nBottom = aDesc.nRight = -1;
2592 2 : sw_GetCellPosition(sTLName, aDesc.nLeft, aDesc.nTop );
2593 2 : sw_GetCellPosition(sBRName, aDesc.nRight, aDesc.nBottom );
2594 :
2595 : // we should normalize the range now (e.g. A5:C1 will become A1:C5)
2596 : // since (depending on what is done later) it will be troublesome
2597 : // elsewhere when the cursor in the implementation does not
2598 : // point to the top-left and bottom-right cells
2599 2 : aDesc.Normalize();
2600 :
2601 4 : aRef = GetRangeByName(pFmt, pTable, sTLName, sBRName, aDesc);
2602 : }
2603 : }
2604 2 : if(!aRef.is())
2605 0 : throw uno::RuntimeException();
2606 2 : return aRef;
2607 : }
2608 :
2609 4 : uno::Sequence< uno::Sequence< uno::Any > > SAL_CALL SwXTextTable::getDataArray()
2610 : throw (uno::RuntimeException, std::exception)
2611 : {
2612 : // see SwXTextTable::getData(...) also
2613 :
2614 4 : SolarMutexGuard aGuard;
2615 4 : const sal_uInt16 nRowCount = getRowCount();
2616 4 : const sal_uInt16 nColCount = getColumnCount();
2617 4 : if(!nRowCount || !nColCount)
2618 : {
2619 0 : uno::RuntimeException aRuntime;
2620 0 : aRuntime.Message = "Table too complex";
2621 0 : throw aRuntime;
2622 : }
2623 4 : SwFrmFmt* pFmt = GetFrmFmt();
2624 4 : uno::Sequence< uno::Sequence< uno::Any > > aRowSeq(nRowCount);
2625 4 : if(pFmt)
2626 : {
2627 4 : uno::Sequence< uno::Any > * pRowArray = aRowSeq.getArray();
2628 28 : for(sal_uInt16 nRow = 0; nRow < nRowCount; nRow++)
2629 : {
2630 24 : uno::Sequence< uno::Any > aColSeq(nColCount);
2631 24 : uno::Any * pColArray = aColSeq.getArray();
2632 48 : uno::Reference< table::XCell > xCellRef;
2633 72 : for(sal_uInt16 nCol = 0; nCol < nColCount; nCol++)
2634 : {
2635 48 : SwXCell* pXCell = lcl_CreateXCell(pFmt, nCol, nRow);
2636 : //! keep (additional) reference to object to prevent implicit destruction
2637 : //! in following UNO calls (when object will get referenced)
2638 48 : xCellRef = pXCell;
2639 48 : SwTableBox * pBox = pXCell ? pXCell->GetTblBox() : 0;
2640 48 : if(!pBox)
2641 : {
2642 0 : throw uno::RuntimeException();
2643 : }
2644 : else
2645 : {
2646 : // check if table box value item is set
2647 48 : SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
2648 48 : bool bIsNum = pBoxFmt->GetItemState( RES_BOXATR_VALUE, false ) == SfxItemState::SET;
2649 48 : if(!bIsNum)
2650 24 : pColArray[nCol] <<= lcl_getString(*pXCell);
2651 : else
2652 24 : pColArray[nCol] <<= sw_getValue(*pXCell);
2653 : }
2654 : }
2655 24 : pRowArray[nRow] = aColSeq;
2656 24 : }
2657 : }
2658 : else
2659 0 : throw uno::RuntimeException();
2660 4 : return aRowSeq;
2661 : }
2662 :
2663 4 : void SAL_CALL SwXTextTable::setDataArray(
2664 : const uno::Sequence< uno::Sequence< uno::Any > >& rArray )
2665 : throw (uno::RuntimeException, std::exception)
2666 : {
2667 : // see SwXTextTable::setData(...) also
2668 :
2669 4 : SolarMutexGuard aGuard;
2670 4 : const sal_uInt16 nRowCount = getRowCount();
2671 4 : const sal_uInt16 nColCount = getColumnCount();
2672 :
2673 4 : SwFrmFmt* pFmt = GetFrmFmt();
2674 4 : if(pFmt)
2675 : {
2676 4 : SwTable* pTable = SwTable::FindTable( pFmt );
2677 4 : if(pTable->IsTblComplex())
2678 : {
2679 0 : uno::RuntimeException aRuntime;
2680 0 : aRuntime.Message = "Table too complex";
2681 0 : throw aRuntime;
2682 : }
2683 :
2684 4 : if(rArray.getLength() != nRowCount)
2685 : {
2686 0 : throw uno::RuntimeException();
2687 : }
2688 4 : const uno::Sequence< uno::Any >* pRowArray = rArray.getConstArray();
2689 28 : for(sal_uInt16 nRow = 0; nRow < nRowCount; nRow++)
2690 : {
2691 24 : const uno::Sequence< uno::Any >& rColSeq = pRowArray[nRow];
2692 24 : if(rColSeq.getLength() != nColCount)
2693 : {
2694 0 : throw uno::RuntimeException();
2695 : }
2696 24 : const uno::Any * pColArray = rColSeq.getConstArray();
2697 24 : uno::Reference< table::XCell > xCellRef;
2698 72 : for(sal_uInt16 nCol = 0; nCol < nColCount; nCol++)
2699 : {
2700 48 : SwXCell* pXCell = lcl_CreateXCell(pFmt, nCol, nRow);
2701 : //! keep (additional) reference to object to prevent implicit destruction
2702 : //! in following UNO calls (when object will get referenced)
2703 48 : xCellRef = pXCell;
2704 48 : SwTableBox * pBox = pXCell ? pXCell->GetTblBox() : 0;
2705 48 : if(!pBox)
2706 : {
2707 0 : throw uno::RuntimeException();
2708 : }
2709 : else
2710 : {
2711 48 : const uno::Any &rAny = pColArray[nCol];
2712 48 : if (uno::TypeClass_STRING == rAny.getValueTypeClass())
2713 24 : sw_setString( *pXCell, *(OUString *) rAny.getValue() );
2714 : else
2715 : {
2716 24 : double d = 0;
2717 : // #i20067# don't throw exception just do nothing if
2718 : // there is no value set
2719 24 : if( (rAny >>= d) )
2720 24 : sw_setValue( *pXCell, d );
2721 : else
2722 0 : sw_setString( *pXCell, OUString(), true );
2723 :
2724 : }
2725 : }
2726 : }
2727 24 : }
2728 4 : }
2729 4 : }
2730 :
2731 8 : uno::Sequence< uno::Sequence< double > > SwXTextTable::getData(void)
2732 : throw( uno::RuntimeException, std::exception )
2733 : {
2734 8 : SolarMutexGuard aGuard;
2735 8 : const sal_uInt16 nRowCount = getRowCount();
2736 8 : const sal_uInt16 nColCount = getColumnCount();
2737 8 : if(!nRowCount || !nColCount)
2738 : {
2739 0 : uno::RuntimeException aRuntime;
2740 0 : aRuntime.Message = "Table too complex";
2741 0 : throw aRuntime;
2742 : }
2743 :
2744 8 : SwFrmFmt* pFmt = GetFrmFmt();
2745 8 : uno::Sequence< uno::Sequence< double > > aRowSeq(bFirstRowAsLabel ? nRowCount - 1 : nRowCount);
2746 8 : if(pFmt)
2747 : {
2748 8 : uno::Sequence< double >* pArray = aRowSeq.getArray();
2749 :
2750 8 : const sal_uInt16 nRowStart = bFirstRowAsLabel ? 1 : 0;
2751 48 : for(sal_uInt16 nRow = nRowStart; nRow < nRowCount; nRow++)
2752 : {
2753 40 : uno::Sequence< double > aColSeq(bFirstColumnAsLabel ? nColCount - 1 : nColCount);
2754 40 : double* pColArray = aColSeq.getArray();
2755 40 : const sal_uInt16 nColStart = bFirstColumnAsLabel ? 1 : 0;
2756 80 : for(sal_uInt16 nCol = nColStart; nCol < nColCount; nCol++)
2757 : {
2758 40 : uno::Reference< table::XCell > xCell = getCellByPosition(nCol, nRow);
2759 40 : if(!xCell.is())
2760 : {
2761 0 : throw uno::RuntimeException();
2762 : }
2763 40 : pColArray[nCol - nColStart] = xCell->getValue();
2764 40 : }
2765 40 : pArray[nRow - nRowStart] = aColSeq;
2766 40 : }
2767 : }
2768 : else
2769 0 : throw uno::RuntimeException();
2770 8 : return aRowSeq;
2771 : }
2772 :
2773 6 : void SwXTextTable::setData(const uno::Sequence< uno::Sequence< double > >& rData)
2774 : throw( uno::RuntimeException, std::exception )
2775 : {
2776 6 : SolarMutexGuard aGuard;
2777 6 : const sal_uInt16 nRowCount = getRowCount();
2778 6 : const sal_uInt16 nColCount = getColumnCount();
2779 6 : bool bChanged = false;
2780 :
2781 6 : if(!nRowCount || !nColCount)
2782 : {
2783 0 : uno::RuntimeException aRuntime;
2784 0 : aRuntime.Message = "Table too complex";
2785 0 : throw aRuntime;
2786 : }
2787 :
2788 6 : SwFrmFmt* pFmt = GetFrmFmt();
2789 6 : if(pFmt )
2790 : {
2791 6 : const sal_uInt16 nRowStart = bFirstRowAsLabel ? 1 : 0;
2792 6 : if(rData.getLength() < nRowCount - nRowStart)
2793 : {
2794 0 : throw uno::RuntimeException();
2795 : }
2796 6 : const uno::Sequence< double >* pRowArray = rData.getConstArray();
2797 36 : for(sal_uInt16 nRow = nRowStart; nRow < nRowCount; nRow++)
2798 : {
2799 30 : const uno::Sequence< double >& rColSeq = pRowArray[nRow - nRowStart];
2800 30 : const sal_uInt16 nColStart = bFirstColumnAsLabel ? 1 : 0;
2801 30 : if(rColSeq.getLength() < nColCount - nColStart)
2802 : {
2803 0 : throw uno::RuntimeException();
2804 : }
2805 30 : const double * pColArray = rColSeq.getConstArray();
2806 60 : for(sal_uInt16 nCol = nColStart; nCol < nColCount; nCol++)
2807 : {
2808 30 : uno::Reference< table::XCell > xCell = getCellByPosition(nCol, nRow);
2809 30 : if(!xCell.is())
2810 : {
2811 0 : throw uno::RuntimeException();
2812 : }
2813 30 : xCell->setValue(pColArray[nCol - nColStart]);
2814 30 : bChanged=true;
2815 30 : }
2816 : }
2817 6 : if ( bChanged )
2818 : {
2819 6 : lcl_SendChartEvent(*this, m_pImpl->m_Listeners);
2820 : }
2821 6 : }
2822 6 : }
2823 :
2824 6 : uno::Sequence< OUString > SwXTextTable::getRowDescriptions(void) throw( uno::RuntimeException, std::exception )
2825 : {
2826 6 : SolarMutexGuard aGuard;
2827 6 : const sal_uInt16 nRowCount = getRowCount();
2828 6 : if(!nRowCount)
2829 : {
2830 0 : uno::RuntimeException aRuntime;
2831 0 : aRuntime.Message = "Table too complex";
2832 0 : throw aRuntime;
2833 : }
2834 6 : uno::Sequence< OUString > aRet(bFirstColumnAsLabel ? nRowCount - 1 : nRowCount);
2835 :
2836 6 : SwFrmFmt* pFmt = GetFrmFmt();
2837 6 : if(pFmt)
2838 : {
2839 6 : OUString* pArray = aRet.getArray();
2840 6 : if(bFirstColumnAsLabel)
2841 : {
2842 6 : const sal_uInt16 nStart = bFirstRowAsLabel ? 1 : 0;
2843 36 : for(sal_uInt16 i = nStart; i < nRowCount; i++)
2844 : {
2845 30 : uno::Reference< table::XCell > xCell = getCellByPosition(0, i);
2846 30 : if(!xCell.is())
2847 : {
2848 : //exception ...
2849 0 : break;
2850 : }
2851 60 : uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
2852 30 : pArray[i - nStart] = xText->getString();
2853 30 : }
2854 : }
2855 : else
2856 : {
2857 : OSL_FAIL("Where do these labels come from?");
2858 : }
2859 : }
2860 : else
2861 0 : throw uno::RuntimeException();
2862 6 : return aRet;
2863 : }
2864 :
2865 2 : void SwXTextTable::setRowDescriptions(const uno::Sequence< OUString >& rRowDesc) throw( uno::RuntimeException, std::exception )
2866 : {
2867 2 : SolarMutexGuard aGuard;
2868 2 : SwFrmFmt* pFmt = GetFrmFmt();
2869 2 : if(pFmt)
2870 : {
2871 2 : const sal_uInt16 nRowCount = getRowCount();
2872 2 : if(!nRowCount || rRowDesc.getLength() < (bFirstRowAsLabel ? nRowCount - 1 : nRowCount))
2873 : {
2874 0 : throw uno::RuntimeException();
2875 : }
2876 2 : const OUString* pArray = rRowDesc.getConstArray();
2877 2 : if(bFirstColumnAsLabel)
2878 : {
2879 2 : const sal_uInt16 nStart = bFirstRowAsLabel ? 1 : 0;
2880 12 : for(sal_uInt16 i = nStart; i < nRowCount; i++)
2881 : {
2882 10 : uno::Reference< table::XCell > xCell = getCellByPosition(0, i);
2883 10 : if(!xCell.is())
2884 : {
2885 0 : throw uno::RuntimeException();
2886 : }
2887 20 : uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
2888 10 : xText->setString(pArray[i - nStart]);
2889 10 : }
2890 : }
2891 : else
2892 : {
2893 : OSL_FAIL("Where to put theses labels?");
2894 : }
2895 : }
2896 : else
2897 0 : throw uno::RuntimeException();
2898 2 : }
2899 :
2900 6 : uno::Sequence< OUString > SwXTextTable::getColumnDescriptions(void)
2901 : throw( uno::RuntimeException, std::exception )
2902 : {
2903 6 : SolarMutexGuard aGuard;
2904 6 : const sal_uInt16 nColCount = getColumnCount();
2905 6 : if(!nColCount)
2906 : {
2907 0 : uno::RuntimeException aRuntime;
2908 0 : aRuntime.Message = "Table too complex";
2909 0 : throw aRuntime;
2910 : }
2911 6 : uno::Sequence< OUString > aRet(bFirstRowAsLabel ? nColCount - 1 : nColCount);
2912 6 : SwFrmFmt* pFmt = GetFrmFmt();
2913 6 : if(pFmt)
2914 : {
2915 6 : OUString* pArray = aRet.getArray();
2916 6 : if(bFirstRowAsLabel)
2917 : {
2918 6 : const sal_uInt16 nStart = bFirstColumnAsLabel ? 1 : 0;
2919 12 : for(sal_uInt16 i = nStart; i < nColCount; i++)
2920 : {
2921 6 : uno::Reference< table::XCell > xCell = getCellByPosition(i, 0);
2922 6 : if(!xCell.is())
2923 : {
2924 0 : throw uno::RuntimeException();
2925 : }
2926 12 : uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
2927 :
2928 6 : pArray[i - nStart] = xText->getString();
2929 6 : }
2930 : }
2931 : else
2932 : {
2933 : OSL_FAIL("Where do these labels come from?");
2934 : }
2935 : }
2936 : else
2937 0 : throw uno::RuntimeException();
2938 6 : return aRet;
2939 : }
2940 :
2941 2 : void SwXTextTable::setColumnDescriptions(const uno::Sequence< OUString >& rColumnDesc) throw( uno::RuntimeException, std::exception )
2942 : {
2943 2 : SolarMutexGuard aGuard;
2944 2 : const sal_uInt16 nColCount = getColumnCount();
2945 2 : if(!nColCount)
2946 : {
2947 0 : uno::RuntimeException aRuntime;
2948 0 : aRuntime.Message = "Table too complex";
2949 0 : throw aRuntime;
2950 : }
2951 2 : SwFrmFmt* pFmt = GetFrmFmt();
2952 2 : if(pFmt)
2953 : {
2954 2 : const OUString* pArray = rColumnDesc.getConstArray();
2955 2 : if(bFirstRowAsLabel && rColumnDesc.getLength() >= nColCount - (bFirstColumnAsLabel ? 1 : 0))
2956 : {
2957 2 : const sal_uInt16 nStart = bFirstColumnAsLabel ? 1 : 0;
2958 4 : for(sal_uInt16 i = nStart; i < nColCount; i++)
2959 : {
2960 2 : uno::Reference< table::XCell > xCell = getCellByPosition(i, 0);
2961 2 : if(!xCell.is())
2962 : {
2963 0 : throw uno::RuntimeException();
2964 : }
2965 4 : uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
2966 2 : xText->setString(pArray[i - nStart]);
2967 2 : }
2968 : }
2969 : else
2970 : {
2971 : OSL_FAIL("Where do these labels come from?");
2972 : }
2973 : }
2974 : else
2975 0 : throw uno::RuntimeException();
2976 2 : }
2977 :
2978 4 : void SAL_CALL SwXTextTable::addChartDataChangeEventListener(
2979 : const uno::Reference<chart::XChartDataChangeEventListener> & xListener)
2980 : throw (uno::RuntimeException, std::exception)
2981 : {
2982 : // no need to lock here as m_pImpl is const and container threadsafe
2983 4 : m_pImpl->m_Listeners.addInterface(
2984 8 : cppu::UnoType<chart::XChartDataChangeEventListener>::get(), xListener);
2985 4 : }
2986 :
2987 4 : void SAL_CALL SwXTextTable::removeChartDataChangeEventListener(
2988 : const uno::Reference<chart::XChartDataChangeEventListener> & xListener)
2989 : throw (uno::RuntimeException, std::exception)
2990 : {
2991 : // no need to lock here as m_pImpl is const and container threadsafe
2992 4 : m_pImpl->m_Listeners.removeInterface(
2993 8 : cppu::UnoType<chart::XChartDataChangeEventListener>::get(), xListener);
2994 4 : }
2995 :
2996 4 : sal_Bool SwXTextTable::isNotANumber(double nNumber) throw( uno::RuntimeException, std::exception )
2997 : {
2998 : // We use DBL_MIN because starcalc does (which uses it because chart
2999 : // wants it that way!)
3000 4 : return ( nNumber == DBL_MIN );
3001 : }
3002 :
3003 2 : double SwXTextTable::getNotANumber(void) throw( uno::RuntimeException, std::exception )
3004 : {
3005 : // We use DBL_MIN because starcalc does (which uses it because chart
3006 : // wants it that way!)
3007 2 : return DBL_MIN;
3008 : }
3009 :
3010 2 : uno::Sequence< beans::PropertyValue > SwXTextTable::createSortDescriptor(void)
3011 : throw( uno::RuntimeException, std::exception )
3012 : {
3013 2 : SolarMutexGuard aGuard;
3014 :
3015 2 : return SwUnoCursorHelper::CreateSortDescriptor(true);
3016 : }
3017 :
3018 8 : void SwXTextTable::sort(const uno::Sequence< beans::PropertyValue >& rDescriptor)
3019 : throw (uno::RuntimeException, std::exception)
3020 : {
3021 8 : SolarMutexGuard aGuard;
3022 16 : SwSortOptions aSortOpt;
3023 8 : SwFrmFmt* pFmt = GetFrmFmt();
3024 16 : if(pFmt &&
3025 8 : SwUnoCursorHelper::ConvertSortProperties(rDescriptor, aSortOpt))
3026 : {
3027 8 : SwTable* pTable = SwTable::FindTable( pFmt );
3028 8 : SwSelBoxes aBoxes;
3029 8 : const SwTableSortBoxes& rTBoxes = pTable->GetTabSortBoxes();
3030 104 : for (size_t n = 0; n < rTBoxes.size(); ++n)
3031 : {
3032 96 : SwTableBox* pBox = rTBoxes[ n ];
3033 96 : aBoxes.insert( pBox );
3034 : }
3035 16 : UnoActionContext aContext( pFmt->GetDoc() );
3036 16 : pFmt->GetDoc()->SortTbl(aBoxes, aSortOpt);
3037 8 : }
3038 8 : }
3039 :
3040 0 : void SwXTextTable::autoFormat(const OUString& sAutoFmtName)
3041 : throw (lang::IllegalArgumentException, uno::RuntimeException,
3042 : std::exception)
3043 : {
3044 0 : SolarMutexGuard aGuard;
3045 0 : SwFrmFmt* pFmt = GetFrmFmt();
3046 0 : if(pFmt)
3047 : {
3048 0 : SwTable* pTable = SwTable::FindTable( pFmt );
3049 0 : if(!pTable->IsTblComplex())
3050 : {
3051 0 : SwTableAutoFmtTbl aAutoFmtTbl;
3052 0 : aAutoFmtTbl.Load();
3053 0 : for (size_t i = aAutoFmtTbl.size(); i;)
3054 0 : if( sAutoFmtName == aAutoFmtTbl[ --i ].GetName() )
3055 : {
3056 0 : SwSelBoxes aBoxes;
3057 0 : const SwTableSortBoxes& rTBoxes = pTable->GetTabSortBoxes();
3058 0 : for (size_t n = 0; n < rTBoxes.size(); ++n)
3059 : {
3060 0 : SwTableBox* pBox = rTBoxes[ n ];
3061 0 : aBoxes.insert( pBox );
3062 : }
3063 0 : UnoActionContext aContext( pFmt->GetDoc() );
3064 0 : pFmt->GetDoc()->SetTableAutoFmt( aBoxes, aAutoFmtTbl[i] );
3065 0 : break;
3066 0 : }
3067 : }
3068 : }
3069 : else
3070 0 : throw uno::RuntimeException();
3071 0 : }
3072 :
3073 118 : uno::Reference< beans::XPropertySetInfo > SwXTextTable::getPropertySetInfo(void) throw( uno::RuntimeException, std::exception )
3074 : {
3075 118 : static uno::Reference< beans::XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
3076 118 : return xRef;
3077 : }
3078 :
3079 14258 : void SwXTextTable::setPropertyValue(const OUString& rPropertyName, const uno::Any& aValue)
3080 : throw(beans::UnknownPropertyException, beans::PropertyVetoException,
3081 : lang::IllegalArgumentException, lang::WrappedTargetException,
3082 : uno::RuntimeException, std::exception)
3083 : {
3084 14258 : SolarMutexGuard aGuard;
3085 14258 : SwFrmFmt* pFmt = GetFrmFmt();
3086 14258 : if(!aValue.hasValue())
3087 0 : throw lang::IllegalArgumentException();
3088 : const SfxItemPropertySimpleEntry* pEntry =
3089 14258 : m_pPropSet->getPropertyMap().getByName(rPropertyName);
3090 14258 : if( !pEntry )
3091 4412 : throw lang::IllegalArgumentException();
3092 9846 : if(pFmt)
3093 : {
3094 9844 : if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
3095 8 : throw beans::PropertyVetoException("Property is read-only: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
3096 :
3097 9836 : if(0xFF == pEntry->nMemberId)
3098 : {
3099 2336 : lcl_SetSpecialProperty(pFmt, pEntry, aValue);
3100 : }
3101 : else
3102 : {
3103 7500 : switch(pEntry->nWID)
3104 : {
3105 : case FN_UNO_TABLE_NAME :
3106 : {
3107 0 : OUString sName;
3108 0 : aValue >>= sName;
3109 0 : setName( sName );
3110 : }
3111 0 : break;
3112 :
3113 : case FN_UNO_RANGE_ROW_LABEL:
3114 : {
3115 14 : bool bTmp = *(sal_Bool*)aValue.getValue();
3116 14 : if(bFirstRowAsLabel != bTmp)
3117 : {
3118 14 : lcl_SendChartEvent(*this, m_pImpl->m_Listeners);
3119 14 : bFirstRowAsLabel = bTmp;
3120 : }
3121 : }
3122 14 : break;
3123 :
3124 : case FN_UNO_RANGE_COL_LABEL:
3125 : {
3126 14 : bool bTmp = *(sal_Bool*)aValue.getValue();
3127 14 : if(bFirstColumnAsLabel != bTmp)
3128 : {
3129 14 : lcl_SendChartEvent(*this, m_pImpl->m_Listeners);
3130 14 : bFirstColumnAsLabel = bTmp;
3131 : }
3132 : }
3133 14 : break;
3134 :
3135 : case FN_UNO_TABLE_BORDER:
3136 : case FN_UNO_TABLE_BORDER2:
3137 : {
3138 1072 : table::TableBorder oldBorder;
3139 1072 : table::TableBorder2 aBorder;
3140 1072 : SvxBorderLine aTopLine;
3141 1072 : SvxBorderLine aBottomLine;
3142 1072 : SvxBorderLine aLeftLine;
3143 1072 : SvxBorderLine aRightLine;
3144 1072 : SvxBorderLine aHoriLine;
3145 1072 : SvxBorderLine aVertLine;
3146 1072 : if (aValue >>= oldBorder)
3147 : {
3148 1068 : aBorder.IsTopLineValid = oldBorder.IsTopLineValid;
3149 1068 : aBorder.IsBottomLineValid = oldBorder.IsBottomLineValid;
3150 1068 : aBorder.IsLeftLineValid = oldBorder.IsLeftLineValid;
3151 1068 : aBorder.IsRightLineValid = oldBorder.IsRightLineValid;
3152 1068 : aBorder.IsHorizontalLineValid = oldBorder.IsHorizontalLineValid;
3153 1068 : aBorder.IsVerticalLineValid = oldBorder.IsVerticalLineValid;
3154 1068 : aBorder.Distance = oldBorder.Distance;
3155 1068 : aBorder.IsDistanceValid = oldBorder.IsDistanceValid;
3156 : lcl_LineToSvxLine(
3157 1068 : oldBorder.TopLine, aTopLine);
3158 : lcl_LineToSvxLine(
3159 1068 : oldBorder.BottomLine, aBottomLine);
3160 : lcl_LineToSvxLine(
3161 1068 : oldBorder.LeftLine, aLeftLine);
3162 : lcl_LineToSvxLine(
3163 1068 : oldBorder.RightLine, aRightLine);
3164 : lcl_LineToSvxLine(
3165 1068 : oldBorder.HorizontalLine, aHoriLine);
3166 : lcl_LineToSvxLine(
3167 1068 : oldBorder.VerticalLine, aVertLine);
3168 : }
3169 4 : else if (aValue >>= aBorder)
3170 : {
3171 : SvxBoxItem::LineToSvxLine(
3172 4 : aBorder.TopLine, aTopLine, true);
3173 : SvxBoxItem::LineToSvxLine(
3174 4 : aBorder.BottomLine, aBottomLine, true);
3175 : SvxBoxItem::LineToSvxLine(
3176 4 : aBorder.LeftLine, aLeftLine, true);
3177 : SvxBoxItem::LineToSvxLine(
3178 4 : aBorder.RightLine, aRightLine, true);
3179 : SvxBoxItem::LineToSvxLine(
3180 4 : aBorder.HorizontalLine, aHoriLine, true);
3181 : SvxBoxItem::LineToSvxLine(
3182 4 : aBorder.VerticalLine, aVertLine, true);
3183 : }
3184 : else
3185 : {
3186 1062 : break; // something else
3187 : }
3188 1072 : SwDoc* pDoc = pFmt->GetDoc();
3189 1072 : SwFrm* pFrm = SwIterator<SwFrm,SwFmt>::FirstElement( *pFmt );
3190 : // tables without layout (invisible header/footer?)
3191 1072 : if (!pFrm)
3192 : {
3193 1062 : break;
3194 : }
3195 10 : lcl_FormatTable(pFmt);
3196 10 : SwTable* pTable = SwTable::FindTable( pFmt );
3197 10 : SwTableLines &rLines = pTable->GetTabLines();
3198 :
3199 : // invalidate all actions
3200 10 : UnoActionRemoveContext aRemoveContext(pDoc);
3201 10 : const SwTableBox* pTLBox = lcl_FindCornerTableBox(rLines, true);
3202 10 : const SwStartNode* pSttNd = pTLBox->GetSttNd();
3203 20 : SwPosition aPos(*pSttNd);
3204 : // set cursor to top left cell
3205 10 : SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(aPos, true);
3206 10 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
3207 10 : pUnoCrsr->SetRemainInSection( false );
3208 :
3209 10 : const SwTableBox* pBRBox = lcl_FindCornerTableBox(rLines, false);
3210 10 : pUnoCrsr->SetMark();
3211 10 : pUnoCrsr->GetPoint()->nNode = *pBRBox->GetSttNd();
3212 10 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
3213 10 : SwUnoTableCrsr& rCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
3214 10 : rCrsr.MakeBoxSels();
3215 :
3216 10 : SfxItemSet aSet(pDoc->GetAttrPool(),
3217 : RES_BOX, RES_BOX,
3218 : SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
3219 20 : 0);
3220 :
3221 20 : SvxBoxItem aBox( RES_BOX );
3222 20 : SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
3223 :
3224 10 : aBox.SetLine(aTopLine.isEmpty() ? 0 : &aTopLine, BOX_LINE_TOP);
3225 10 : aBoxInfo.SetValid(VALID_TOP, aBorder.IsTopLineValid);
3226 :
3227 10 : aBox.SetLine(aBottomLine.isEmpty() ? 0 : &aBottomLine, BOX_LINE_BOTTOM);
3228 10 : aBoxInfo.SetValid(VALID_BOTTOM, aBorder.IsBottomLineValid);
3229 :
3230 10 : aBox.SetLine(aLeftLine.isEmpty() ? 0 : &aLeftLine, BOX_LINE_LEFT);
3231 10 : aBoxInfo.SetValid(VALID_LEFT, aBorder.IsLeftLineValid);
3232 :
3233 10 : aBox.SetLine(aRightLine.isEmpty() ? 0 : &aRightLine, BOX_LINE_RIGHT);
3234 10 : aBoxInfo.SetValid(VALID_RIGHT, aBorder.IsRightLineValid);
3235 :
3236 10 : aBoxInfo.SetLine(aHoriLine.isEmpty() ? 0 : &aHoriLine, BOXINFO_LINE_HORI);
3237 10 : aBoxInfo.SetValid(VALID_HORI, aBorder.IsHorizontalLineValid);
3238 :
3239 10 : aBoxInfo.SetLine(aVertLine.isEmpty() ? 0 : &aVertLine, BOXINFO_LINE_VERT);
3240 10 : aBoxInfo.SetValid(VALID_VERT, aBorder.IsVerticalLineValid);
3241 :
3242 10 : aBox.SetDistance((sal_uInt16)convertMm100ToTwip(aBorder.Distance));
3243 10 : aBoxInfo.SetValid(VALID_DISTANCE, aBorder.IsDistanceValid);
3244 :
3245 10 : aSet.Put(aBox);
3246 10 : aSet.Put(aBoxInfo);
3247 :
3248 10 : pDoc->SetTabBorders(rCrsr, aSet);
3249 20 : delete pUnoCrsr;
3250 : }
3251 10 : break;
3252 :
3253 : case FN_UNO_TABLE_BORDER_DISTANCES:
3254 : {
3255 1062 : table::TableBorderDistances aTableBorderDistances;
3256 2124 : if( !(aValue >>= aTableBorderDistances) ||
3257 1062 : (!aTableBorderDistances.IsLeftDistanceValid &&
3258 0 : !aTableBorderDistances.IsRightDistanceValid &&
3259 0 : !aTableBorderDistances.IsTopDistanceValid &&
3260 0 : !aTableBorderDistances.IsBottomDistanceValid ))
3261 0 : break;
3262 :
3263 1062 : const sal_uInt16 nLeftDistance = convertMm100ToTwip(aTableBorderDistances.LeftDistance);
3264 1062 : const sal_uInt16 nRightDistance = convertMm100ToTwip(aTableBorderDistances.RightDistance);
3265 1062 : const sal_uInt16 nTopDistance = convertMm100ToTwip(aTableBorderDistances.TopDistance);
3266 1062 : const sal_uInt16 nBottomDistance = convertMm100ToTwip(aTableBorderDistances.BottomDistance);
3267 1062 : SwDoc* pDoc = pFmt->GetDoc();
3268 1062 : SwTable* pTable = SwTable::FindTable( pFmt );
3269 1062 : SwTableLines &rLines = pTable->GetTabLines();
3270 1062 : pDoc->GetIDocumentUndoRedo().StartUndo(UNDO_START, NULL);
3271 6424 : for(size_t i = 0; i < rLines.size(); ++i)
3272 : {
3273 5362 : SwTableLine* pLine = rLines[i];
3274 5362 : SwTableBoxes& rBoxes = pLine->GetTabBoxes();
3275 20302 : for(size_t k = 0; k < rBoxes.size(); ++k)
3276 : {
3277 14940 : SwTableBox* pBox = rBoxes[k];
3278 14940 : const SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
3279 14940 : const SvxBoxItem& rBox = pBoxFmt->GetBox();
3280 14940 : if(
3281 14940 : (aTableBorderDistances.IsLeftDistanceValid && nLeftDistance != rBox.GetDistance( BOX_LINE_LEFT )) ||
3282 804 : (aTableBorderDistances.IsRightDistanceValid && nRightDistance != rBox.GetDistance( BOX_LINE_RIGHT )) ||
3283 29880 : (aTableBorderDistances.IsTopDistanceValid && nTopDistance != rBox.GetDistance( BOX_LINE_TOP )) ||
3284 684 : (aTableBorderDistances.IsBottomDistanceValid && nBottomDistance != rBox.GetDistance( BOX_LINE_BOTTOM )))
3285 : {
3286 14256 : SvxBoxItem aSetBox( rBox );
3287 14256 : SwFrmFmt* pSetBoxFmt = pBox->ClaimFrmFmt();
3288 14256 : if( aTableBorderDistances.IsLeftDistanceValid )
3289 14256 : aSetBox.SetDistance( nLeftDistance, BOX_LINE_LEFT );
3290 14256 : if( aTableBorderDistances.IsRightDistanceValid )
3291 14256 : aSetBox.SetDistance( nRightDistance, BOX_LINE_RIGHT );
3292 14256 : if( aTableBorderDistances.IsTopDistanceValid )
3293 14256 : aSetBox.SetDistance( nTopDistance, BOX_LINE_TOP );
3294 14256 : if( aTableBorderDistances.IsBottomDistanceValid )
3295 14256 : aSetBox.SetDistance( nBottomDistance, BOX_LINE_BOTTOM );
3296 14256 : pDoc->SetAttr( aSetBox, *pSetBoxFmt );
3297 : }
3298 : }
3299 : }
3300 1062 : pDoc->GetIDocumentUndoRedo().EndUndo(UNDO_END, NULL);
3301 : }
3302 1062 : break;
3303 :
3304 : case FN_UNO_TABLE_COLUMN_SEPARATORS:
3305 : {
3306 2 : UnoActionContext aContext(pFmt->GetDoc());
3307 2 : SwTable* pTable = SwTable::FindTable( pFmt );
3308 2 : lcl_SetTblSeparators(aValue, pTable, pTable->GetTabLines()[0]->GetTabBoxes()[0], false, pFmt->GetDoc());
3309 : }
3310 2 : break;
3311 :
3312 0 : case FN_UNO_TABLE_COLUMN_RELATIVE_SUM:/*_readonly_*/ break;
3313 :
3314 : default:
3315 : {
3316 5336 : SwAttrSet aSet(pFmt->GetAttrSet());
3317 5336 : m_pPropSet->setPropertyValue(*pEntry, aValue, aSet);
3318 5336 : pFmt->GetDoc()->SetAttr(aSet, *pFmt);
3319 : }
3320 : }
3321 : }
3322 : }
3323 2 : else if(bIsDescriptor)
3324 : {
3325 2 : pTableProps->SetProperty( pEntry->nWID, pEntry->nMemberId, aValue);
3326 : }
3327 : else
3328 0 : throw uno::RuntimeException();
3329 9702 : }
3330 :
3331 640 : uno::Any SwXTextTable::getPropertyValue(const OUString& rPropertyName)
3332 : throw (beans::UnknownPropertyException,
3333 : lang::WrappedTargetException,
3334 : uno::RuntimeException,
3335 : std::exception)
3336 : {
3337 640 : SolarMutexGuard aGuard;
3338 640 : uno::Any aRet;
3339 640 : SwFrmFmt* pFmt = GetFrmFmt();
3340 : const SfxItemPropertySimpleEntry* pEntry =
3341 640 : m_pPropSet->getPropertyMap().getByName(rPropertyName);
3342 :
3343 640 : if (!pEntry)
3344 0 : throw beans::UnknownPropertyException("Unknown property: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
3345 :
3346 640 : if(pFmt)
3347 : {
3348 640 : if(0xFF == pEntry->nMemberId)
3349 : {
3350 504 : aRet = lcl_GetSpecialProperty(pFmt, pEntry );
3351 : }
3352 : else
3353 : {
3354 136 : switch(pEntry->nWID)
3355 : {
3356 : case FN_UNO_TABLE_NAME:
3357 : {
3358 0 : aRet <<= getName();
3359 : }
3360 0 : break;
3361 :
3362 : case FN_UNO_ANCHOR_TYPES:
3363 : case FN_UNO_TEXT_WRAP:
3364 : case FN_UNO_ANCHOR_TYPE:
3365 : ::sw::GetDefaultTextContentValue(
3366 8 : aRet, OUString(), pEntry->nWID);
3367 8 : break;
3368 :
3369 : case FN_UNO_RANGE_ROW_LABEL:
3370 : {
3371 6 : sal_Bool bTemp = bFirstRowAsLabel;
3372 6 : aRet.setValue(&bTemp, ::getCppuBooleanType());
3373 : }
3374 6 : break;
3375 :
3376 : case FN_UNO_RANGE_COL_LABEL:
3377 : {
3378 6 : sal_Bool bTemp = bFirstColumnAsLabel;
3379 6 : aRet.setValue(&bTemp, ::getCppuBooleanType());
3380 : }
3381 6 : break;
3382 :
3383 : case FN_UNO_TABLE_BORDER:
3384 : case FN_UNO_TABLE_BORDER2:
3385 : {
3386 28 : SwDoc* pDoc = pFmt->GetDoc();
3387 28 : SwFrm* pFrm = SwIterator<SwFrm,SwFmt>::FirstElement( *pFmt );
3388 : // tables without layout (invisible header/footer?)
3389 28 : if (!pFrm)
3390 : {
3391 0 : break;
3392 : }
3393 28 : lcl_FormatTable(pFmt);
3394 28 : SwTable* pTable = SwTable::FindTable( pFmt );
3395 28 : SwTableLines &rLines = pTable->GetTabLines();
3396 :
3397 : // invalidate all actions
3398 28 : UnoActionRemoveContext aRemoveContext(pDoc);
3399 28 : const SwTableBox* pTLBox = lcl_FindCornerTableBox(rLines, true);
3400 28 : const SwStartNode* pSttNd = pTLBox->GetSttNd();
3401 56 : SwPosition aPos(*pSttNd);
3402 : // set cursor to top left cell
3403 28 : SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(aPos, true);
3404 28 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
3405 28 : pUnoCrsr->SetRemainInSection( false );
3406 :
3407 28 : const SwTableBox* pBRBox = lcl_FindCornerTableBox(rLines, false);
3408 28 : pUnoCrsr->SetMark();
3409 28 : const SwStartNode* pLastNd = pBRBox->GetSttNd();
3410 28 : pUnoCrsr->GetPoint()->nNode = *pLastNd;
3411 :
3412 28 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
3413 28 : SwUnoTableCrsr& rCrsr = dynamic_cast<SwUnoTableCrsr&>(*pUnoCrsr);
3414 28 : rCrsr.MakeBoxSels();
3415 :
3416 28 : SfxItemSet aSet(pDoc->GetAttrPool(),
3417 : RES_BOX, RES_BOX,
3418 : SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
3419 56 : 0);
3420 28 : aSet.Put(SvxBoxInfoItem( SID_ATTR_BORDER_INNER ));
3421 28 : pDoc->GetTabBorders(rCrsr, aSet);
3422 : const SvxBoxInfoItem& rBoxInfoItem =
3423 28 : (const SvxBoxInfoItem&)aSet.Get(SID_ATTR_BORDER_INNER);
3424 28 : const SvxBoxItem& rBox = (const SvxBoxItem&)aSet.Get(RES_BOX);
3425 :
3426 28 : if (FN_UNO_TABLE_BORDER == pEntry->nWID)
3427 : {
3428 14 : table::TableBorder aTableBorder;
3429 14 : aTableBorder.TopLine = SvxBoxItem::SvxLineToLine(rBox.GetTop(), true);
3430 14 : aTableBorder.IsTopLineValid = rBoxInfoItem.IsValid(VALID_TOP);
3431 14 : aTableBorder.BottomLine = SvxBoxItem::SvxLineToLine(rBox.GetBottom(), true);
3432 14 : aTableBorder.IsBottomLineValid = rBoxInfoItem.IsValid(VALID_BOTTOM);
3433 14 : aTableBorder.LeftLine = SvxBoxItem::SvxLineToLine(rBox.GetLeft(), true);
3434 14 : aTableBorder.IsLeftLineValid = rBoxInfoItem.IsValid(VALID_LEFT);
3435 14 : aTableBorder.RightLine = SvxBoxItem::SvxLineToLine(rBox.GetRight(), true);
3436 14 : aTableBorder.IsRightLineValid = rBoxInfoItem.IsValid(VALID_RIGHT );
3437 14 : aTableBorder.HorizontalLine = SvxBoxItem::SvxLineToLine(rBoxInfoItem.GetHori(), true);
3438 14 : aTableBorder.IsHorizontalLineValid = rBoxInfoItem.IsValid(VALID_HORI);
3439 14 : aTableBorder.VerticalLine = SvxBoxItem::SvxLineToLine(rBoxInfoItem.GetVert(), true);
3440 14 : aTableBorder.IsVerticalLineValid = rBoxInfoItem.IsValid(VALID_VERT);
3441 14 : aTableBorder.Distance = convertTwipToMm100( rBox.GetDistance() );
3442 14 : aTableBorder.IsDistanceValid = rBoxInfoItem.IsValid(VALID_DISTANCE);
3443 14 : aRet <<= aTableBorder;
3444 : }
3445 : else
3446 : {
3447 14 : table::TableBorder2 aTableBorder;
3448 14 : aTableBorder.TopLine = SvxBoxItem::SvxLineToLine(rBox.GetTop(), true);
3449 14 : aTableBorder.IsTopLineValid = rBoxInfoItem.IsValid(VALID_TOP);
3450 14 : aTableBorder.BottomLine = SvxBoxItem::SvxLineToLine(rBox.GetBottom(), true);
3451 14 : aTableBorder.IsBottomLineValid = rBoxInfoItem.IsValid(VALID_BOTTOM);
3452 14 : aTableBorder.LeftLine = SvxBoxItem::SvxLineToLine(rBox.GetLeft(), true);
3453 14 : aTableBorder.IsLeftLineValid = rBoxInfoItem.IsValid(VALID_LEFT);
3454 14 : aTableBorder.RightLine = SvxBoxItem::SvxLineToLine(rBox.GetRight(), true);
3455 14 : aTableBorder.IsRightLineValid = rBoxInfoItem.IsValid(VALID_RIGHT );
3456 14 : aTableBorder.HorizontalLine = SvxBoxItem::SvxLineToLine(rBoxInfoItem.GetHori(), true);
3457 14 : aTableBorder.IsHorizontalLineValid = rBoxInfoItem.IsValid(VALID_HORI);
3458 14 : aTableBorder.VerticalLine = SvxBoxItem::SvxLineToLine(rBoxInfoItem.GetVert(), true);
3459 14 : aTableBorder.IsVerticalLineValid = rBoxInfoItem.IsValid(VALID_VERT);
3460 14 : aTableBorder.Distance = convertTwipToMm100( rBox.GetDistance() );
3461 14 : aTableBorder.IsDistanceValid = rBoxInfoItem.IsValid(VALID_DISTANCE);
3462 14 : aRet <<= aTableBorder;
3463 : }
3464 56 : delete pUnoCrsr;
3465 : }
3466 28 : break;
3467 :
3468 : case FN_UNO_TABLE_BORDER_DISTANCES :
3469 : {
3470 0 : table::TableBorderDistances aTableBorderDistances( 0, sal_True, 0, sal_True, 0, sal_True, 0, sal_True ) ;
3471 0 : SwTable* pTable = SwTable::FindTable( pFmt );
3472 0 : const SwTableLines &rLines = pTable->GetTabLines();
3473 0 : bool bFirst = true;
3474 0 : sal_uInt16 nLeftDistance = 0;
3475 0 : sal_uInt16 nRightDistance = 0;
3476 0 : sal_uInt16 nTopDistance = 0;
3477 0 : sal_uInt16 nBottomDistance = 0;
3478 :
3479 0 : for(size_t i = 0; i < rLines.size(); ++i)
3480 : {
3481 0 : const SwTableLine* pLine = rLines[i];
3482 0 : const SwTableBoxes& rBoxes = pLine->GetTabBoxes();
3483 0 : for(size_t k = 0; k < rBoxes.size(); ++k)
3484 : {
3485 0 : const SwTableBox* pBox = rBoxes[k];
3486 0 : SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
3487 0 : const SvxBoxItem& rBox = pBoxFmt->GetBox();
3488 0 : if( bFirst )
3489 : {
3490 0 : nLeftDistance = convertTwipToMm100( rBox.GetDistance( BOX_LINE_LEFT ));
3491 0 : nRightDistance = convertTwipToMm100( rBox.GetDistance( BOX_LINE_RIGHT ));
3492 0 : nTopDistance = convertTwipToMm100( rBox.GetDistance( BOX_LINE_TOP ));
3493 0 : nBottomDistance = convertTwipToMm100( rBox.GetDistance( BOX_LINE_BOTTOM ));
3494 0 : bFirst = false;
3495 : }
3496 : else
3497 : {
3498 0 : if( aTableBorderDistances.IsLeftDistanceValid &&
3499 0 : nLeftDistance != convertTwipToMm100( rBox.GetDistance( BOX_LINE_LEFT )))
3500 0 : aTableBorderDistances.IsLeftDistanceValid = sal_False;
3501 0 : if( aTableBorderDistances.IsRightDistanceValid &&
3502 0 : nRightDistance != convertTwipToMm100( rBox.GetDistance( BOX_LINE_RIGHT )))
3503 0 : aTableBorderDistances.IsRightDistanceValid = sal_False;
3504 0 : if( aTableBorderDistances.IsTopDistanceValid &&
3505 0 : nTopDistance != convertTwipToMm100( rBox.GetDistance( BOX_LINE_TOP )))
3506 0 : aTableBorderDistances.IsTopDistanceValid = sal_False;
3507 0 : if( aTableBorderDistances.IsBottomDistanceValid &&
3508 0 : nBottomDistance != convertTwipToMm100( rBox.GetDistance( BOX_LINE_BOTTOM )))
3509 0 : aTableBorderDistances.IsBottomDistanceValid = sal_False;
3510 : }
3511 :
3512 : }
3513 0 : if( !aTableBorderDistances.IsLeftDistanceValid &&
3514 0 : !aTableBorderDistances.IsRightDistanceValid &&
3515 0 : !aTableBorderDistances.IsTopDistanceValid &&
3516 0 : !aTableBorderDistances.IsBottomDistanceValid )
3517 0 : break;
3518 : }
3519 0 : if( aTableBorderDistances.IsLeftDistanceValid)
3520 0 : aTableBorderDistances.LeftDistance = nLeftDistance;
3521 0 : if( aTableBorderDistances.IsRightDistanceValid)
3522 0 : aTableBorderDistances.RightDistance = nRightDistance;
3523 0 : if( aTableBorderDistances.IsTopDistanceValid)
3524 0 : aTableBorderDistances.TopDistance = nTopDistance;
3525 0 : if( aTableBorderDistances.IsBottomDistanceValid)
3526 0 : aTableBorderDistances.BottomDistance = nBottomDistance;
3527 :
3528 0 : aRet <<= aTableBorderDistances;
3529 : }
3530 0 : break;
3531 :
3532 : case FN_UNO_TABLE_COLUMN_SEPARATORS:
3533 : {
3534 4 : SwTable* pTable = SwTable::FindTable( pFmt );
3535 4 : lcl_GetTblSeparators(aRet, pTable, pTable->GetTabLines()[0]->GetTabBoxes()[0], false);
3536 : }
3537 4 : break;
3538 :
3539 : case FN_UNO_TABLE_COLUMN_RELATIVE_SUM:
3540 4 : aRet <<= (sal_Int16) UNO_TABLE_COLUMN_SUM;
3541 4 : break;
3542 :
3543 : case RES_ANCHOR:
3544 : // AnchorType is readonly and might be void (no return value)
3545 0 : break;
3546 :
3547 : case FN_UNO_TEXT_SECTION:
3548 : {
3549 4 : SwTable* pTable = SwTable::FindTable( pFmt );
3550 4 : SwTableNode* pTblNode = pTable->GetTableNode();
3551 4 : SwSectionNode* pSectionNode = pTblNode->FindSectionNode();
3552 4 : if(pSectionNode)
3553 : {
3554 0 : const SwSection& rSect = pSectionNode->GetSection();
3555 : uno::Reference< text::XTextSection > xSect =
3556 0 : SwXTextSections::GetObject( *rSect.GetFmt() );
3557 0 : aRet <<= xSect;
3558 : }
3559 : }
3560 4 : break;
3561 :
3562 : default:
3563 : {
3564 76 : const SwAttrSet& rSet = pFmt->GetAttrSet();
3565 76 : m_pPropSet->getPropertyValue(*pEntry, rSet, aRet);
3566 : }
3567 : }
3568 : }
3569 : }
3570 0 : else if(bIsDescriptor)
3571 : {
3572 0 : const uno::Any* pAny = 0;
3573 0 : if(!pTableProps->GetProperty(pEntry->nWID, pEntry->nMemberId, pAny))
3574 0 : throw lang::IllegalArgumentException();
3575 0 : else if(pAny)
3576 0 : aRet = *pAny;
3577 : }
3578 : else
3579 0 : throw uno::RuntimeException();
3580 640 : return aRet;
3581 : }
3582 :
3583 0 : void SwXTextTable::addPropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
3584 : {
3585 : OSL_FAIL("not implemented");
3586 0 : }
3587 :
3588 0 : void SwXTextTable::removePropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
3589 : {
3590 : OSL_FAIL("not implemented");
3591 0 : }
3592 :
3593 0 : void SwXTextTable::addVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
3594 : {
3595 : OSL_FAIL("not implemented");
3596 0 : }
3597 :
3598 0 : void SwXTextTable::removeVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
3599 : {
3600 : OSL_FAIL("not implemented");
3601 0 : }
3602 :
3603 6 : OUString SwXTextTable::getName(void) throw( uno::RuntimeException, std::exception )
3604 : {
3605 6 : SolarMutexGuard aGuard;
3606 6 : SwFrmFmt* pFmt = GetFrmFmt();
3607 6 : if(!pFmt && !bIsDescriptor)
3608 0 : throw uno::RuntimeException();
3609 6 : if(pFmt)
3610 : {
3611 6 : return pFmt->GetName();
3612 : }
3613 0 : return m_sTableName;
3614 : }
3615 :
3616 8 : void SwXTextTable::setName(const OUString& rName) throw( uno::RuntimeException, std::exception )
3617 : {
3618 8 : SolarMutexGuard aGuard;
3619 8 : SwFrmFmt* pFmt = GetFrmFmt();
3620 20 : if((!pFmt && !bIsDescriptor) ||
3621 16 : rName.isEmpty() ||
3622 24 : rName.indexOf('.')>=0 ||
3623 8 : rName.indexOf(' ')>=0 )
3624 0 : throw uno::RuntimeException();
3625 :
3626 8 : if(pFmt)
3627 : {
3628 4 : const OUString aOldName( pFmt->GetName() );
3629 : SwFrmFmt* pTmpFmt;
3630 4 : const SwFrmFmts* pTbl = pFmt->GetDoc()->GetTblFrmFmts();
3631 12 : for( size_t i = pTbl->size(); i; )
3632 24 : if( !( pTmpFmt = (*pTbl)[ --i ] )->IsDefault() &&
3633 24 : pTmpFmt->GetName() == rName &&
3634 0 : pFmt->GetDoc()->IsUsed( *pTmpFmt ))
3635 : {
3636 0 : throw uno::RuntimeException();
3637 : }
3638 :
3639 4 : pFmt->SetName( rName );
3640 :
3641 : SwStartNode *pStNd;
3642 8 : SwNodeIndex aIdx( *pFmt->GetDoc()->GetNodes().GetEndOfAutotext().StartOfSectionNode(), 1 );
3643 8 : while ( 0 != (pStNd = aIdx.GetNode().GetStartNode()) )
3644 : {
3645 0 : ++aIdx;
3646 0 : SwNode *const pNd = & aIdx.GetNode();
3647 0 : if ( pNd->IsOLENode() &&
3648 0 : aOldName == ((SwOLENode*)pNd)->GetChartTblName() )
3649 : {
3650 0 : ((SwOLENode*)pNd)->SetChartTblName( rName );
3651 :
3652 0 : ((SwOLENode*)pNd)->GetOLEObj();
3653 :
3654 0 : SwTable* pTable = SwTable::FindTable( pFmt );
3655 : //TL_CHART2: chart needs to be notfied about name changes
3656 0 : pFmt->GetDoc()->UpdateCharts( pTable->GetFrmFmt()->GetName() );
3657 : }
3658 0 : aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 );
3659 : }
3660 8 : pFmt->GetDoc()->getIDocumentState().SetModified();
3661 : }
3662 : else
3663 4 : m_sTableName = rName;
3664 8 : }
3665 :
3666 30 : sal_uInt16 SwXTextTable::getRowCount(void)
3667 : {
3668 30 : SolarMutexGuard aGuard;
3669 30 : sal_uInt16 nRet = 0;
3670 30 : SwFrmFmt* pFmt = GetFrmFmt();
3671 30 : if(pFmt)
3672 : {
3673 30 : SwTable* pTable = SwTable::FindTable( pFmt );
3674 30 : if(!pTable->IsTblComplex())
3675 : {
3676 30 : nRet = pTable->GetTabLines().size();
3677 : }
3678 : }
3679 30 : return nRet;
3680 : }
3681 :
3682 30 : sal_uInt16 SwXTextTable::getColumnCount(void)
3683 : {
3684 30 : SolarMutexGuard aGuard;
3685 30 : SwFrmFmt* pFmt = GetFrmFmt();
3686 30 : sal_uInt16 nRet = 0;
3687 30 : if(pFmt)
3688 : {
3689 30 : SwTable* pTable = SwTable::FindTable( pFmt );
3690 30 : if(!pTable->IsTblComplex())
3691 : {
3692 30 : SwTableLines& rLines = pTable->GetTabLines();
3693 30 : SwTableLine* pLine = rLines.front();
3694 30 : nRet = pLine->GetTabBoxes().size();
3695 : }
3696 : }
3697 30 : return nRet;
3698 : }
3699 :
3700 6695 : void SwXTextTable::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
3701 : {
3702 6776 : if(pOld && pOld->Which() == RES_REMOVE_UNO_OBJECT &&
3703 81 : (void*)GetRegisteredIn() == ((SwPtrMsgPoolItem *)pOld)->pObject )
3704 81 : ((SwModify*)GetRegisteredIn())->Remove(this);
3705 : else
3706 6614 : ClientModify(this, pOld, pNew);
3707 6695 : if(!GetRegisteredIn())
3708 : {
3709 81 : uno::Reference<uno::XInterface> const xThis(m_pImpl->m_wThis);
3710 81 : if (!xThis.is())
3711 : { // fdo#72695: if UNO object is already dead, don't revive it with event
3712 6695 : return;
3713 : }
3714 162 : lang::EventObject const ev(xThis);
3715 162 : m_pImpl->m_Listeners.disposeAndClear(ev);
3716 : }
3717 : else
3718 : {
3719 6614 : lcl_SendChartEvent(*this, m_pImpl->m_Listeners);
3720 : }
3721 : }
3722 :
3723 0 : OUString SAL_CALL SwXTextTable::getImplementationName(void) throw( uno::RuntimeException, std::exception )
3724 : {
3725 0 : return OUString("SwXTextTable");
3726 : }
3727 :
3728 64 : sal_Bool SwXTextTable::supportsService(const OUString& rServiceName) throw( uno::RuntimeException, std::exception )
3729 : {
3730 64 : return cppu::supportsService(this, rServiceName);
3731 : }
3732 :
3733 64 : uno::Sequence< OUString > SwXTextTable::getSupportedServiceNames(void) throw( uno::RuntimeException, std::exception )
3734 : {
3735 64 : uno::Sequence< OUString > aRet(4);
3736 64 : OUString* pArr = aRet.getArray();
3737 64 : pArr[0] = "com.sun.star.document.LinkTarget";
3738 64 : pArr[1] = "com.sun.star.text.TextTable";
3739 64 : pArr[2] = "com.sun.star.text.TextContent";
3740 64 : pArr[2] = "com.sun.star.text.TextSortable";
3741 64 : return aRet;
3742 : }
3743 :
3744 : namespace
3745 : {
3746 : class theSwXCellRangeUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSwXCellRangeUnoTunnelId > {};
3747 : }
3748 :
3749 0 : const uno::Sequence< sal_Int8 > & SwXCellRange::getUnoTunnelId()
3750 : {
3751 0 : return theSwXCellRangeUnoTunnelId::get().getSeq();
3752 : }
3753 :
3754 0 : sal_Int64 SAL_CALL SwXCellRange::getSomething( const uno::Sequence< sal_Int8 >& rId )
3755 : throw(uno::RuntimeException, std::exception)
3756 : {
3757 0 : if( rId.getLength() == 16
3758 0 : && 0 == memcmp( getUnoTunnelId().getConstArray(),
3759 0 : rId.getConstArray(), 16 ) )
3760 : {
3761 0 : return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
3762 : }
3763 0 : return 0;
3764 : }
3765 :
3766 888 : TYPEINIT1(SwXCellRange, SwClient);
3767 :
3768 6 : OUString SwXCellRange::getImplementationName(void) throw( uno::RuntimeException, std::exception )
3769 : {
3770 6 : return OUString("SwXCellRange");
3771 : }
3772 :
3773 10 : sal_Bool SwXCellRange::supportsService(const OUString& rServiceName) throw( uno::RuntimeException, std::exception )
3774 : {
3775 10 : return cppu::supportsService(this, rServiceName);
3776 : }
3777 :
3778 10 : uno::Sequence< OUString > SwXCellRange::getSupportedServiceNames(void) throw( uno::RuntimeException, std::exception )
3779 : {
3780 10 : uno::Sequence< OUString > aRet(7);
3781 10 : OUString* pArray = aRet.getArray();
3782 10 : pArray[0] = "com.sun.star.text.CellRange";
3783 10 : pArray[1] = "com.sun.star.style.CharacterProperties";
3784 10 : pArray[2] = "com.sun.star.style.CharacterPropertiesAsian";
3785 10 : pArray[3] = "com.sun.star.style.CharacterPropertiesComplex";
3786 10 : pArray[4] = "com.sun.star.style.ParagraphProperties";
3787 10 : pArray[5] = "com.sun.star.style.ParagraphPropertiesAsian";
3788 10 : pArray[6] = "com.sun.star.style.ParagraphPropertiesComplex";
3789 10 : return aRet;
3790 : }
3791 :
3792 14 : SwXCellRange::SwXCellRange(SwUnoCrsr* pCrsr, SwFrmFmt& rFrmFmt,
3793 : SwRangeDescriptor& rDesc)
3794 : : SwClient(&rFrmFmt)
3795 : , aCursorDepend(this, pCrsr)
3796 : , m_ChartListeners(m_Mutex)
3797 : ,
3798 : aRgDesc(rDesc),
3799 14 : m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TABLE_RANGE)),
3800 : pTblCrsr(pCrsr),
3801 : bFirstRowAsLabel(false),
3802 28 : bFirstColumnAsLabel(false)
3803 : {
3804 14 : aRgDesc.Normalize();
3805 14 : }
3806 :
3807 42 : SwXCellRange::~SwXCellRange()
3808 : {
3809 14 : SolarMutexGuard aGuard;
3810 14 : delete pTblCrsr;
3811 28 : }
3812 :
3813 124 : uno::Reference< table::XCell > SwXCellRange::getCellByPosition(sal_Int32 nColumn, sal_Int32 nRow)
3814 : throw( uno::RuntimeException, lang::IndexOutOfBoundsException, std::exception )
3815 : {
3816 124 : SolarMutexGuard aGuard;
3817 124 : uno::Reference< table::XCell > aRet;
3818 124 : SwFrmFmt* pFmt = GetFrmFmt();
3819 124 : if(pFmt)
3820 : {
3821 368 : if(nColumn >= 0 && nRow >= 0 &&
3822 368 : getColumnCount() > nColumn && getRowCount() > nRow )
3823 : {
3824 : SwXCell* pXCell = lcl_CreateXCell(pFmt,
3825 122 : aRgDesc.nLeft + nColumn, aRgDesc.nTop + nRow);
3826 122 : if(pXCell)
3827 122 : aRet = pXCell;
3828 : }
3829 : }
3830 124 : if(!aRet.is())
3831 2 : throw lang::IndexOutOfBoundsException();
3832 124 : return aRet;
3833 : }
3834 :
3835 6 : uno::Reference< table::XCellRange > SwXCellRange::getCellRangeByPosition(
3836 : sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom)
3837 : throw (uno::RuntimeException, lang::IndexOutOfBoundsException,
3838 : std::exception)
3839 : {
3840 6 : SolarMutexGuard aGuard;
3841 6 : uno::Reference< table::XCellRange > aRet;
3842 6 : SwFrmFmt* pFmt = GetFrmFmt();
3843 12 : if(pFmt && getColumnCount() > nRight && getRowCount() > nBottom &&
3844 6 : nLeft <= nRight && nTop <= nBottom
3845 12 : && nLeft >= 0 && nRight >= 0 && nTop >= 0 && nBottom >= 0 )
3846 : {
3847 4 : SwTable* pTable = SwTable::FindTable( pFmt );
3848 4 : if(!pTable->IsTblComplex())
3849 : {
3850 : SwRangeDescriptor aNewDesc;
3851 4 : aNewDesc.nTop = nTop + aRgDesc.nTop;
3852 4 : aNewDesc.nBottom = nBottom + aRgDesc.nTop;
3853 4 : aNewDesc.nLeft = nLeft + aRgDesc.nLeft;
3854 4 : aNewDesc.nRight = nRight + aRgDesc.nLeft;
3855 4 : aNewDesc.Normalize();
3856 4 : const OUString sTLName = sw_GetCellName(aNewDesc.nLeft, aNewDesc.nTop);
3857 8 : const OUString sBRName = sw_GetCellName(aNewDesc.nRight, aNewDesc.nBottom);
3858 4 : const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
3859 4 : if(pTLBox)
3860 : {
3861 : // invalidate all actions
3862 4 : UnoActionRemoveContext aRemoveContext(pFmt->GetDoc());
3863 4 : const SwStartNode* pSttNd = pTLBox->GetSttNd();
3864 8 : SwPosition aPos(*pSttNd);
3865 : // set cursor in the upper-left cell of the range
3866 4 : SwUnoCrsr* pUnoCrsr = pFmt->GetDoc()->CreateUnoCrsr(aPos, true);
3867 4 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
3868 4 : pUnoCrsr->SetRemainInSection( false );
3869 4 : const SwTableBox* pBRBox = pTable->GetTblBox( sBRName );
3870 4 : if(pBRBox)
3871 : {
3872 4 : pUnoCrsr->SetMark();
3873 4 : pUnoCrsr->GetPoint()->nNode = *pBRBox->GetSttNd();
3874 4 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
3875 4 : SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
3876 4 : pCrsr->MakeBoxSels();
3877 : // pUnoCrsr will be provided and will not be deleted
3878 4 : SwXCellRange* pCellRange = new SwXCellRange(pUnoCrsr, *pFmt, aNewDesc);
3879 4 : aRet = pCellRange;
3880 : }
3881 : else
3882 4 : delete pUnoCrsr;
3883 4 : }
3884 : }
3885 : }
3886 6 : if(!aRet.is())
3887 2 : throw lang::IndexOutOfBoundsException();
3888 6 : return aRet;
3889 : }
3890 :
3891 2 : uno::Reference< table::XCellRange > SwXCellRange::getCellRangeByName(const OUString& rRange)
3892 : throw( uno::RuntimeException, std::exception )
3893 : {
3894 2 : SolarMutexGuard aGuard;
3895 2 : sal_Int32 nPos = 0;
3896 4 : const OUString sTLName(rRange.getToken(0, ':', nPos));
3897 4 : const OUString sBRName(rRange.getToken(0, ':', nPos));
3898 2 : if(sTLName.isEmpty() || sBRName.isEmpty())
3899 0 : throw uno::RuntimeException();
3900 : SwRangeDescriptor aDesc;
3901 2 : aDesc.nTop = aDesc.nLeft = aDesc.nBottom = aDesc.nRight = -1;
3902 2 : sw_GetCellPosition( sTLName, aDesc.nLeft, aDesc.nTop );
3903 2 : sw_GetCellPosition( sBRName, aDesc.nRight, aDesc.nBottom );
3904 2 : aDesc.Normalize();
3905 : return getCellRangeByPosition(aDesc.nLeft - aRgDesc.nLeft, aDesc.nTop - aRgDesc.nTop,
3906 4 : aDesc.nRight - aRgDesc.nLeft, aDesc.nBottom - aRgDesc.nTop);
3907 : }
3908 :
3909 310 : uno::Reference< beans::XPropertySetInfo > SwXCellRange::getPropertySetInfo(void) throw( uno::RuntimeException, std::exception )
3910 : {
3911 310 : static uno::Reference< beans::XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
3912 310 : return xRef;
3913 : }
3914 :
3915 146 : void SwXCellRange::setPropertyValue(const OUString& rPropertyName, const uno::Any& aValue)
3916 : throw (beans::UnknownPropertyException,
3917 : beans::PropertyVetoException,
3918 : lang::IllegalArgumentException,
3919 : lang::WrappedTargetException,
3920 : uno::RuntimeException,
3921 : std::exception)
3922 : {
3923 146 : SolarMutexGuard aGuard;
3924 146 : SwFrmFmt* pFmt = GetFrmFmt();
3925 146 : if(pFmt)
3926 : {
3927 : const SfxItemPropertySimpleEntry* pEntry =
3928 146 : m_pPropSet->getPropertyMap().getByName(rPropertyName);
3929 146 : if(pEntry)
3930 : {
3931 146 : if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
3932 0 : throw beans::PropertyVetoException("Property is read-only: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
3933 :
3934 146 : SwDoc* pDoc = pTblCrsr->GetDoc();
3935 : {
3936 : // remove actions to enable box selection
3937 146 : UnoActionRemoveContext aRemoveContext(pDoc);
3938 : }
3939 146 : SwUnoTableCrsr& rCrsr = dynamic_cast<SwUnoTableCrsr&>(*pTblCrsr);
3940 146 : rCrsr.MakeBoxSels();
3941 146 : switch(pEntry->nWID )
3942 : {
3943 : case FN_UNO_TABLE_CELL_BACKGROUND:
3944 : {
3945 0 : SvxBrushItem aBrush( RES_BACKGROUND );
3946 0 : pDoc->GetBoxAttr( *pTblCrsr, aBrush );
3947 0 : ((SfxPoolItem&)aBrush).PutValue(aValue, pEntry->nMemberId);
3948 0 : pDoc->SetBoxAttr( *pTblCrsr, aBrush );
3949 :
3950 : }
3951 0 : break;
3952 : case RES_BOX :
3953 : {
3954 0 : SfxItemSet aSet(pDoc->GetAttrPool(),
3955 : RES_BOX, RES_BOX,
3956 : SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
3957 0 : 0);
3958 0 : SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
3959 0 : aBoxInfo.SetValid(0xff, false);
3960 0 : sal_uInt8 nValid = 0;
3961 0 : switch(pEntry->nMemberId & ~CONVERT_TWIPS)
3962 : {
3963 0 : case LEFT_BORDER : nValid = VALID_LEFT; break;
3964 0 : case RIGHT_BORDER: nValid = VALID_RIGHT; break;
3965 0 : case TOP_BORDER : nValid = VALID_TOP; break;
3966 0 : case BOTTOM_BORDER: nValid = VALID_BOTTOM; break;
3967 : case LEFT_BORDER_DISTANCE :
3968 : case RIGHT_BORDER_DISTANCE:
3969 : case TOP_BORDER_DISTANCE :
3970 : case BOTTOM_BORDER_DISTANCE:
3971 0 : nValid = VALID_DISTANCE;
3972 0 : break;
3973 : }
3974 0 : aBoxInfo.SetValid(nValid, true);
3975 :
3976 0 : aSet.Put(aBoxInfo);
3977 0 : pDoc->GetTabBorders(rCrsr, aSet);
3978 :
3979 0 : aSet.Put(aBoxInfo);
3980 0 : SvxBoxItem aBoxItem((const SvxBoxItem&)aSet.Get(RES_BOX));
3981 0 : ((SfxPoolItem&)aBoxItem).PutValue(aValue, pEntry->nMemberId);
3982 0 : aSet.Put(aBoxItem);
3983 0 : pDoc->SetTabBorders( *pTblCrsr, aSet );
3984 : }
3985 0 : break;
3986 : case RES_BOXATR_FORMAT:
3987 : {
3988 0 : SfxUInt32Item aNumberFormat(RES_BOXATR_FORMAT);
3989 0 : ((SfxPoolItem&)aNumberFormat).PutValue(aValue, 0);
3990 0 : pDoc->SetBoxAttr(rCrsr, aNumberFormat);
3991 : }
3992 0 : break;
3993 : case FN_UNO_RANGE_ROW_LABEL:
3994 : {
3995 0 : bool bTmp = *(sal_Bool*)aValue.getValue();
3996 0 : if(bFirstRowAsLabel != bTmp)
3997 : {
3998 0 : lcl_SendChartEvent(*this, m_ChartListeners);
3999 0 : bFirstRowAsLabel = bTmp;
4000 : }
4001 : }
4002 0 : break;
4003 : case FN_UNO_RANGE_COL_LABEL:
4004 : {
4005 0 : bool bTmp = *(sal_Bool*)aValue.getValue();
4006 0 : if(bFirstColumnAsLabel != bTmp)
4007 : {
4008 0 : lcl_SendChartEvent(*this, m_ChartListeners);
4009 0 : bFirstColumnAsLabel = bTmp;
4010 : }
4011 : }
4012 0 : break;
4013 : default:
4014 : {
4015 146 : SfxItemSet aItemSet( pDoc->GetAttrPool(), pEntry->nWID, pEntry->nWID );
4016 146 : SwUnoCursorHelper::GetCrsrAttr(rCrsr.GetSelRing(),
4017 146 : aItemSet);
4018 :
4019 146 : if (!SwUnoCursorHelper::SetCursorPropertyValue(
4020 146 : *pEntry, aValue, rCrsr.GetSelRing(), aItemSet))
4021 : {
4022 144 : m_pPropSet->setPropertyValue(*pEntry, aValue, aItemSet);
4023 : }
4024 146 : SwUnoCursorHelper::SetCrsrAttr(rCrsr.GetSelRing(),
4025 146 : aItemSet, nsSetAttrMode::SETATTR_DEFAULT, true);
4026 : }
4027 : }
4028 : }
4029 : else
4030 0 : throw beans::UnknownPropertyException("Unknown property: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
4031 146 : }
4032 146 : }
4033 :
4034 298 : uno::Any SwXCellRange::getPropertyValue(const OUString& rPropertyName)
4035 : throw (beans::UnknownPropertyException,
4036 : lang::WrappedTargetException,
4037 : uno::RuntimeException,
4038 : std::exception)
4039 : {
4040 298 : SolarMutexGuard aGuard;
4041 298 : uno::Any aRet;
4042 298 : SwFrmFmt* pFmt = GetFrmFmt();
4043 298 : if(pFmt)
4044 : {
4045 : const SfxItemPropertySimpleEntry* pEntry =
4046 298 : m_pPropSet->getPropertyMap().getByName(rPropertyName);
4047 298 : if(pEntry)
4048 : {
4049 298 : switch(pEntry->nWID )
4050 : {
4051 : case FN_UNO_TABLE_CELL_BACKGROUND:
4052 : {
4053 0 : SvxBrushItem aBrush( RES_BACKGROUND );
4054 0 : if(pTblCrsr->GetDoc()->GetBoxAttr( *pTblCrsr, aBrush ))
4055 0 : aBrush.QueryValue(aRet, pEntry->nMemberId);
4056 :
4057 : }
4058 0 : break;
4059 : case RES_BOX :
4060 : {
4061 0 : SwDoc* pDoc = pTblCrsr->GetDoc();
4062 0 : SfxItemSet aSet(pDoc->GetAttrPool(),
4063 : RES_BOX, RES_BOX,
4064 : SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
4065 0 : 0);
4066 0 : aSet.Put(SvxBoxInfoItem( SID_ATTR_BORDER_INNER ));
4067 0 : pDoc->GetTabBorders(*pTblCrsr, aSet);
4068 0 : const SvxBoxItem& rBoxItem = ((const SvxBoxItem&)aSet.Get(RES_BOX));
4069 0 : rBoxItem.QueryValue(aRet, pEntry->nMemberId);
4070 : }
4071 0 : break;
4072 : case RES_BOXATR_FORMAT:
4073 : OSL_FAIL("not implemented");
4074 0 : break;
4075 : case FN_UNO_PARA_STYLE:
4076 : {
4077 : SwFmtColl *const pTmpFmt =
4078 0 : SwUnoCursorHelper::GetCurTxtFmtColl(*pTblCrsr, false);
4079 0 : OUString sRet;
4080 0 : if(pFmt)
4081 0 : sRet = pTmpFmt->GetName();
4082 0 : aRet <<= sRet;
4083 : }
4084 0 : break;
4085 : case FN_UNO_RANGE_ROW_LABEL:
4086 : {
4087 0 : sal_Bool bTemp = bFirstRowAsLabel;
4088 0 : aRet.setValue(&bTemp, ::getCppuBooleanType());
4089 : }
4090 0 : break;
4091 : case FN_UNO_RANGE_COL_LABEL:
4092 : {
4093 0 : sal_Bool bTemp = bFirstColumnAsLabel;
4094 0 : aRet.setValue(&bTemp, ::getCppuBooleanType());
4095 : }
4096 0 : break;
4097 : default:
4098 : {
4099 298 : SfxItemSet aSet(pTblCrsr->GetDoc()->GetAttrPool(),
4100 : RES_CHRATR_BEGIN, RES_FRMATR_END -1,
4101 : RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
4102 : RES_UNKNOWNATR_CONTAINER, RES_UNKNOWNATR_CONTAINER,
4103 298 : 0L);
4104 : // first look at the attributes of the cursor
4105 298 : SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pTblCrsr);
4106 298 : SwUnoCursorHelper::GetCrsrAttr(pCrsr->GetSelRing(), aSet);
4107 298 : m_pPropSet->getPropertyValue(*pEntry, aSet, aRet);
4108 : }
4109 : }
4110 : }
4111 : else
4112 0 : throw beans::UnknownPropertyException("Unknown property: " + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
4113 : }
4114 298 : return aRet;
4115 : }
4116 :
4117 0 : void SwXCellRange::addPropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
4118 : {
4119 : OSL_FAIL("not implemented");
4120 0 : }
4121 :
4122 0 : void SwXCellRange::removePropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
4123 : {
4124 : OSL_FAIL("not implemented");
4125 0 : }
4126 :
4127 0 : void SwXCellRange::addVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
4128 : {
4129 : OSL_FAIL("not implemented");
4130 0 : }
4131 :
4132 0 : void SwXCellRange::removeVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
4133 : {
4134 : OSL_FAIL("not implemented");
4135 0 : }
4136 :
4137 0 : void SwXCellRange::GetDataSequence(
4138 : uno::Sequence< uno::Any > *pAnySeq, //-> first pointer != 0 is used
4139 : uno::Sequence< OUString > *pTxtSeq, //-> as output sequence
4140 : uno::Sequence< double > *pDblSeq, //-> (previous data gets overwritten)
4141 : bool bForceNumberResults ) //-> when 'true' requires to make an
4142 : // extra effort to return a value different
4143 : // from 0 even if the cell is formatted to text
4144 : throw (uno::RuntimeException)
4145 : {
4146 0 : SolarMutexGuard aGuard;
4147 :
4148 : // compare to SwXCellRange::getDataArray (note different return types though)
4149 :
4150 0 : const sal_uInt16 nRowCount = getRowCount();
4151 0 : const sal_uInt16 nColCount = getColumnCount();
4152 :
4153 0 : if(!nRowCount || !nColCount)
4154 : {
4155 0 : uno::RuntimeException aRuntime;
4156 0 : aRuntime.Message = "Table too complex";
4157 0 : throw aRuntime;
4158 : }
4159 :
4160 0 : sal_Int32 nSize = nRowCount * nColCount;
4161 0 : if (pAnySeq)
4162 0 : pAnySeq->realloc( nSize );
4163 0 : else if (pTxtSeq)
4164 0 : pTxtSeq->realloc( nSize );
4165 0 : else if (pDblSeq)
4166 0 : pDblSeq->realloc( nSize );
4167 : else
4168 : {
4169 : OSL_FAIL( "argument missing" );
4170 0 : return;
4171 : }
4172 0 : uno::Any *pAnyData = pAnySeq ? pAnySeq->getArray() : 0;
4173 0 : OUString *pTxtData = pTxtSeq ? pTxtSeq->getArray() : 0;
4174 0 : double *pDblData = pDblSeq ? pDblSeq->getArray() : 0;
4175 :
4176 0 : sal_Int32 nDtaCnt = 0;
4177 0 : SwFrmFmt* pFmt = GetFrmFmt();
4178 0 : if(pFmt)
4179 : {
4180 : double fNan;
4181 0 : ::rtl::math::setNan( & fNan );
4182 :
4183 0 : uno::Reference< table::XCell > xCellRef;
4184 0 : for(sal_uInt16 nRow = 0; nRow < nRowCount; nRow++)
4185 : {
4186 0 : for(sal_uInt16 nCol = 0; nCol < nColCount; nCol++)
4187 : {
4188 : SwXCell * pXCell = lcl_CreateXCell(pFmt,
4189 : aRgDesc.nLeft + nCol,
4190 0 : aRgDesc.nTop + nRow);
4191 : //! keep (additional) reference to object to prevent implicit destruction
4192 : //! in following UNO calls (when object will get referenced)
4193 0 : xCellRef = pXCell;
4194 0 : SwTableBox * pBox = pXCell ? pXCell->GetTblBox() : 0;
4195 0 : if(!pBox)
4196 : {
4197 0 : throw uno::RuntimeException();
4198 : }
4199 : else
4200 : {
4201 0 : if (pAnyData)
4202 : {
4203 : // check if table box value item is set
4204 0 : bool bIsNum = pBox->GetFrmFmt()->GetItemState( RES_BOXATR_VALUE, false ) == SfxItemState::SET;
4205 0 : if (!bIsNum)
4206 0 : pAnyData[nDtaCnt++] <<= lcl_getString(*pXCell);
4207 : else
4208 0 : pAnyData[nDtaCnt++] <<= sw_getValue(*pXCell);
4209 : }
4210 0 : else if (pTxtData)
4211 0 : pTxtData[nDtaCnt++] = lcl_getString(*pXCell);
4212 0 : else if (pDblData)
4213 : {
4214 0 : double fVal = fNan;
4215 0 : if (!bForceNumberResults || table::CellContentType_TEXT != pXCell->getType())
4216 0 : fVal = sw_getValue(*pXCell);
4217 : else
4218 : {
4219 : OSL_ENSURE( table::CellContentType_TEXT == pXCell->getType(),
4220 : "this branch of 'if' is only for text formatted cells" );
4221 :
4222 : // now we'll try to get a useful numerical value
4223 : // from the text in the cell...
4224 :
4225 : sal_uInt32 nFIndex;
4226 0 : SvNumberFormatter* pNumFormatter = pTblCrsr->GetDoc()->GetNumberFormatter();
4227 :
4228 : // look for SwTblBoxNumFormat value in parents as well
4229 : const SfxPoolItem* pItem;
4230 0 : SwFrmFmt *pBoxFmt = pXCell->GetTblBox()->GetFrmFmt();
4231 0 : SfxItemState eState = pBoxFmt->GetAttrSet().GetItemState(RES_BOXATR_FORMAT, true, &pItem);
4232 :
4233 0 : if (eState == SfxItemState::SET)
4234 : {
4235 : // please note that the language of the numberformat
4236 : // is implicitly coded into the below value as well
4237 0 : nFIndex = ((SwTblBoxNumFormat*)pItem)->GetValue();
4238 :
4239 : // since the current value indicates a text format but the call
4240 : // to 'IsNumberFormat' below won't work for text formats
4241 : // we need to get rid of the part that indicates the text format.
4242 : // According to ER this can be done like this:
4243 0 : nFIndex -= (nFIndex % SV_COUNTRY_LANGUAGE_OFFSET);
4244 : }
4245 : else
4246 : {
4247 : // system language is probably not the best possible choice
4248 : // but since we have to guess anyway (because the language of at
4249 : // the text is NOT the one used for the number format!)
4250 : // it is at least conform to to what is used in
4251 : // SwTableShell::Execute when
4252 : // SID_ATTR_NUMBERFORMAT_VALUE is set...
4253 0 : LanguageType eLang = LANGUAGE_SYSTEM;
4254 0 : nFIndex = pNumFormatter->GetStandardIndex( eLang );
4255 : }
4256 :
4257 : double fTmp;
4258 0 : if (pNumFormatter->IsNumberFormat( lcl_getString(*pXCell), nFIndex, fTmp ))
4259 0 : fVal = fTmp;
4260 : }
4261 0 : pDblData[nDtaCnt++] = fVal;
4262 : }
4263 : else {
4264 : OSL_FAIL( "output sequence missing" );
4265 : }
4266 : }
4267 : }
4268 0 : }
4269 : }
4270 : OSL_ENSURE( nDtaCnt == nSize, "size mismatch. Invalid cell range?" );
4271 0 : if (pAnySeq)
4272 0 : pAnySeq->realloc( nDtaCnt );
4273 0 : else if (pTxtSeq)
4274 0 : pTxtSeq->realloc( nDtaCnt );
4275 0 : else if (pDblSeq)
4276 0 : pDblSeq->realloc( nDtaCnt );
4277 : }
4278 :
4279 : ///@see SwXCellRange::getData
4280 : ///@see SwXCellRange::GetDataSequence
4281 4 : uno::Sequence< uno::Sequence< uno::Any > > SAL_CALL SwXCellRange::getDataArray()
4282 : throw (uno::RuntimeException, std::exception)
4283 : {
4284 4 : SolarMutexGuard aGuard;
4285 4 : const sal_uInt16 nRowCount = getRowCount();
4286 4 : const sal_uInt16 nColCount = getColumnCount();
4287 :
4288 4 : if(!nRowCount || !nColCount)
4289 : {
4290 0 : uno::RuntimeException aRuntime;
4291 0 : aRuntime.Message = "Table too complex";
4292 0 : throw aRuntime;
4293 : }
4294 4 : uno::Sequence< uno::Sequence< uno::Any > > aRowSeq(nRowCount);
4295 4 : SwFrmFmt* pFmt = GetFrmFmt();
4296 4 : if(pFmt)
4297 : {
4298 4 : uno::Sequence< uno::Any >* pRowArray = aRowSeq.getArray();
4299 4 : uno::Reference< table::XCell > xCellRef;
4300 24 : for(sal_uInt16 nRow = 0; nRow < nRowCount; nRow++)
4301 : {
4302 20 : uno::Sequence< uno::Any > aColSeq(nColCount);
4303 20 : uno::Any * pColArray = aColSeq.getArray();
4304 100 : for(sal_uInt16 nCol = 0; nCol < nColCount; nCol++)
4305 : {
4306 : SwXCell * pXCell = lcl_CreateXCell(pFmt,
4307 : aRgDesc.nLeft + nCol,
4308 80 : aRgDesc.nTop + nRow);
4309 : //! keep (additional) reference to object to prevent implicit destruction
4310 : //! in following UNO calls (when object will get referenced)
4311 80 : xCellRef = pXCell;
4312 80 : SwTableBox * pBox = pXCell ? pXCell->GetTblBox() : 0;
4313 80 : if(!pBox)
4314 : {
4315 0 : throw uno::RuntimeException();
4316 : }
4317 : else
4318 : {
4319 : // check if table box value item is set
4320 80 : SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
4321 80 : bool bIsNum = pBoxFmt->GetItemState( RES_BOXATR_VALUE, false ) == SfxItemState::SET;
4322 80 : if(!bIsNum)
4323 40 : pColArray[nCol] <<= lcl_getString(*pXCell);
4324 : else
4325 40 : pColArray[nCol] <<= sw_getValue(*pXCell);
4326 : }
4327 : }
4328 20 : pRowArray[nRow] = aColSeq;
4329 24 : }
4330 : }
4331 4 : return aRowSeq;
4332 : }
4333 :
4334 : ///@see SwXCellRange::setData
4335 4 : void SAL_CALL SwXCellRange::setDataArray(
4336 : const uno::Sequence< uno::Sequence< uno::Any > >& rArray )
4337 : throw (uno::RuntimeException, std::exception)
4338 : {
4339 4 : SolarMutexGuard aGuard;
4340 4 : const sal_uInt16 nRowCount = getRowCount();
4341 4 : const sal_uInt16 nColCount = getColumnCount();
4342 4 : if(!nRowCount || !nColCount)
4343 : {
4344 0 : uno::RuntimeException aRuntime;
4345 0 : aRuntime.Message = "Table too complex";
4346 0 : throw aRuntime;
4347 : }
4348 4 : SwFrmFmt* pFmt = GetFrmFmt();
4349 4 : if(pFmt )
4350 : {
4351 4 : if(rArray.getLength() != nRowCount)
4352 : {
4353 0 : throw uno::RuntimeException();
4354 : }
4355 4 : const uno::Sequence< uno::Any >* pRowArray = rArray.getConstArray();
4356 24 : for(sal_uInt16 nRow = 0; nRow < nRowCount; nRow++)
4357 : {
4358 20 : const uno::Sequence< uno::Any >& rColSeq = pRowArray[nRow];
4359 20 : if(rColSeq.getLength() != nColCount)
4360 : {
4361 0 : throw uno::RuntimeException();
4362 : }
4363 20 : const uno::Any * pColArray = rColSeq.getConstArray();
4364 20 : uno::Reference< table::XCell > xCellRef;
4365 100 : for(sal_uInt16 nCol = 0; nCol < nColCount; nCol++)
4366 : {
4367 : SwXCell * pXCell = lcl_CreateXCell(pFmt,
4368 : aRgDesc.nLeft + nCol,
4369 80 : aRgDesc.nTop + nRow);
4370 : //! keep (additional) reference to object to prevent implicit destruction
4371 : //! in following UNO calls (when object will get referenced)
4372 80 : xCellRef = pXCell;
4373 80 : SwTableBox * pBox = pXCell ? pXCell->GetTblBox() : 0;
4374 80 : if(!pBox)
4375 : {
4376 0 : throw uno::RuntimeException();
4377 : }
4378 : else
4379 : {
4380 80 : const uno::Any &rAny = pColArray[nCol];
4381 80 : if (uno::TypeClass_STRING == rAny.getValueTypeClass())
4382 40 : sw_setString( *pXCell, *(OUString *) rAny.getValue() );
4383 : else
4384 : {
4385 40 : double d = 0;
4386 : // #i20067# don't throw exception just do nothing if
4387 : // there is no value set
4388 40 : if( (rAny >>= d) )
4389 40 : sw_setValue( *pXCell, d );
4390 : else
4391 0 : sw_setString( *pXCell, OUString(), true );
4392 : }
4393 : }
4394 : }
4395 20 : }
4396 4 : }
4397 4 : }
4398 :
4399 4 : uno::Sequence< uno::Sequence< double > > SwXCellRange::getData(void) throw( uno::RuntimeException, std::exception )
4400 : {
4401 4 : SolarMutexGuard aGuard;
4402 4 : const sal_uInt16 nRowCount = getRowCount();
4403 4 : const sal_uInt16 nColCount = getColumnCount();
4404 :
4405 4 : if(!nRowCount || !nColCount)
4406 : {
4407 0 : uno::RuntimeException aRuntime;
4408 0 : aRuntime.Message = "Table too complex";
4409 0 : throw aRuntime;
4410 : }
4411 4 : uno::Sequence< uno::Sequence< double > > aRowSeq(bFirstRowAsLabel ? nRowCount - 1 : nRowCount);
4412 4 : SwFrmFmt* pFmt = GetFrmFmt();
4413 4 : if(pFmt)
4414 : {
4415 4 : uno::Sequence< double >* pRowArray = aRowSeq.getArray();
4416 :
4417 4 : const sal_uInt16 nRowStart = bFirstRowAsLabel ? 1 : 0;
4418 24 : for(sal_uInt16 nRow = nRowStart; nRow < nRowCount; nRow++)
4419 : {
4420 20 : uno::Sequence< double > aColSeq(bFirstColumnAsLabel ? nColCount - 1 : nColCount);
4421 20 : double * pArray = aColSeq.getArray();
4422 20 : const sal_uInt16 nColStart = bFirstColumnAsLabel ? 1 : 0;
4423 100 : for(sal_uInt16 nCol = nColStart; nCol < nColCount; nCol++)
4424 : {
4425 80 : uno::Reference< table::XCell > xCell = getCellByPosition(nCol, nRow);
4426 80 : if(!xCell.is())
4427 : {
4428 0 : throw uno::RuntimeException();
4429 : }
4430 80 : pArray[nCol - nColStart] = xCell->getValue();
4431 80 : }
4432 20 : pRowArray[nRow - nRowStart] = aColSeq;
4433 20 : }
4434 : }
4435 4 : return aRowSeq;
4436 : }
4437 :
4438 2 : void SwXCellRange::setData(const uno::Sequence< uno::Sequence< double > >& rData)
4439 : throw( uno::RuntimeException, std::exception )
4440 : {
4441 2 : SolarMutexGuard aGuard;
4442 2 : const sal_uInt16 nRowCount = getRowCount();
4443 2 : const sal_uInt16 nColCount = getColumnCount();
4444 2 : if(!nRowCount || !nColCount)
4445 : {
4446 0 : uno::RuntimeException aRuntime;
4447 0 : aRuntime.Message = "Table too complex";
4448 0 : throw aRuntime;
4449 : }
4450 2 : SwFrmFmt* pFmt = GetFrmFmt();
4451 2 : if(pFmt )
4452 : {
4453 2 : const sal_uInt16 nRowStart = bFirstRowAsLabel ? 1 : 0;
4454 2 : if(rData.getLength() < nRowCount - nRowStart)
4455 : {
4456 0 : throw uno::RuntimeException();
4457 : }
4458 2 : const uno::Sequence< double >* pRowArray = rData.getConstArray();
4459 12 : for(sal_uInt16 nRow = nRowStart; nRow < nRowCount; nRow++)
4460 : {
4461 10 : const uno::Sequence< double >& rColSeq = pRowArray[nRow - nRowStart];
4462 10 : const sal_uInt16 nColStart = bFirstColumnAsLabel ? 1 : 0;
4463 10 : if(rColSeq.getLength() < nColCount - nColStart)
4464 : {
4465 0 : throw uno::RuntimeException();
4466 : }
4467 10 : const double * pColArray = rColSeq.getConstArray();
4468 50 : for(sal_uInt16 nCol = nColStart; nCol < nColCount; nCol++)
4469 : {
4470 40 : uno::Reference< table::XCell > xCell = getCellByPosition(nCol, nRow);
4471 40 : if(!xCell.is())
4472 : {
4473 0 : throw uno::RuntimeException();
4474 : }
4475 40 : xCell->setValue(pColArray[nCol - nColStart]);
4476 40 : }
4477 : }
4478 2 : }
4479 2 : }
4480 :
4481 : ///@see SwXTextTable::getRowDescriptions (TODO: seems to be copy and paste programming here)
4482 4 : uno::Sequence< OUString > SwXCellRange::getRowDescriptions(void)
4483 : throw( uno::RuntimeException, std::exception )
4484 : {
4485 4 : SolarMutexGuard aGuard;
4486 4 : const sal_uInt16 nRowCount = getRowCount();
4487 4 : if(!nRowCount)
4488 : {
4489 0 : uno::RuntimeException aRuntime;
4490 0 : aRuntime.Message = "Table too complex";
4491 0 : throw aRuntime;
4492 : }
4493 4 : uno::Sequence< OUString > aRet(bFirstColumnAsLabel ? nRowCount - 1 : nRowCount);
4494 4 : SwFrmFmt* pFmt = GetFrmFmt();
4495 4 : if(pFmt)
4496 : {
4497 4 : OUString* pArray = aRet.getArray();
4498 4 : if(bFirstColumnAsLabel)
4499 : {
4500 0 : const sal_uInt16 nStart = bFirstRowAsLabel ? 1 : 0;
4501 0 : for(sal_uInt16 i = nStart; i < nRowCount; i++)
4502 : {
4503 0 : uno::Reference< table::XCell > xCell = getCellByPosition(0, i);
4504 0 : if(!xCell.is())
4505 : {
4506 0 : throw uno::RuntimeException();
4507 : }
4508 0 : uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
4509 0 : pArray[i - nStart] = xText->getString();
4510 0 : }
4511 : }
4512 : else
4513 : {
4514 : OSL_FAIL("Where do these labels come from?");
4515 : }
4516 : }
4517 : else
4518 0 : throw uno::RuntimeException();
4519 4 : return aRet;
4520 : }
4521 :
4522 : ///@see SwXTextTable::setRowDescriptions (TODO: seems to be copy and paste programming here)
4523 0 : void SwXCellRange::setRowDescriptions(const uno::Sequence< OUString >& rRowDesc)
4524 : throw( uno::RuntimeException, std::exception )
4525 : {
4526 0 : SolarMutexGuard aGuard;
4527 0 : SwFrmFmt* pFmt = GetFrmFmt();
4528 0 : if(pFmt)
4529 : {
4530 0 : const sal_uInt16 nRowCount = getRowCount();
4531 0 : if(!nRowCount || rRowDesc.getLength() < (bFirstRowAsLabel ? nRowCount - 1 : nRowCount))
4532 : {
4533 0 : throw uno::RuntimeException();
4534 : }
4535 0 : const OUString* pArray = rRowDesc.getConstArray();
4536 0 : if(bFirstColumnAsLabel)
4537 : {
4538 0 : const sal_uInt16 nStart = bFirstRowAsLabel ? 1 : 0;
4539 0 : for(sal_uInt16 i = nStart; i < nRowCount; i++)
4540 : {
4541 0 : uno::Reference< table::XCell > xCell = getCellByPosition(0, i);
4542 0 : if(!xCell.is())
4543 : {
4544 0 : throw uno::RuntimeException();
4545 : }
4546 0 : uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
4547 0 : xText->setString(pArray[i - nStart]);
4548 0 : }
4549 : }
4550 : else
4551 : {
4552 : OSL_FAIL("Where to put theses labels?");
4553 : }
4554 0 : }
4555 0 : }
4556 :
4557 : ///@see SwXTextTable::setColumnDescriptions (TODO: seems to be copy and paste programming here)
4558 4 : uno::Sequence< OUString > SwXCellRange::getColumnDescriptions(void)
4559 : throw( uno::RuntimeException, std::exception )
4560 : {
4561 4 : SolarMutexGuard aGuard;
4562 4 : const sal_uInt16 nColCount = getColumnCount();
4563 4 : if(!nColCount)
4564 : {
4565 0 : uno::RuntimeException aRuntime;
4566 0 : aRuntime.Message = "Table too complex";
4567 0 : throw aRuntime;
4568 : }
4569 4 : uno::Sequence< OUString > aRet(bFirstRowAsLabel ? nColCount - 1 : nColCount);
4570 4 : SwFrmFmt* pFmt = GetFrmFmt();
4571 4 : if(pFmt)
4572 : {
4573 4 : OUString* pArray = aRet.getArray();
4574 4 : if(bFirstRowAsLabel)
4575 : {
4576 0 : const sal_uInt16 nStart = bFirstColumnAsLabel ? 1 : 0;
4577 0 : for(sal_uInt16 i = nStart; i < nColCount; i++)
4578 : {
4579 0 : uno::Reference< table::XCell > xCell = getCellByPosition(i, 0);
4580 0 : if(!xCell.is())
4581 : {
4582 0 : throw uno::RuntimeException();
4583 : }
4584 0 : uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
4585 0 : pArray[i - nStart] = xText->getString();
4586 0 : }
4587 : }
4588 : else
4589 : {
4590 : OSL_FAIL("Where do these labels come from?");
4591 : }
4592 : }
4593 : else
4594 0 : throw uno::RuntimeException();
4595 4 : return aRet;
4596 : }
4597 :
4598 : ///@see SwXTextTable::setColumnDescriptions (TODO: seems to be copy and paste programming here)
4599 0 : void SwXCellRange::setColumnDescriptions(const uno::Sequence< OUString >& ColumnDesc)
4600 : throw( uno::RuntimeException, std::exception )
4601 : {
4602 0 : SolarMutexGuard aGuard;
4603 0 : const sal_uInt16 nColCount = getColumnCount();
4604 0 : SwFrmFmt* pFmt = GetFrmFmt();
4605 0 : if(pFmt)
4606 : {
4607 0 : const OUString* pArray = ColumnDesc.getConstArray();
4608 0 : if(bFirstRowAsLabel && ColumnDesc.getLength() >= nColCount - (bFirstColumnAsLabel ? 1 : 0))
4609 : {
4610 0 : const sal_uInt16 nStart = bFirstColumnAsLabel ? 1 : 0;
4611 0 : for(sal_uInt16 i = nStart; i < nColCount; i++)
4612 : {
4613 0 : uno::Reference< table::XCell > xCell = getCellByPosition(i, 0);
4614 0 : if(!xCell.is())
4615 : {
4616 0 : throw uno::RuntimeException();
4617 : }
4618 0 : uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
4619 :
4620 0 : xText->setString(pArray[i - nStart]);
4621 0 : }
4622 : }
4623 : else
4624 : {
4625 : OSL_FAIL("Where to put theses labels?");
4626 : }
4627 0 : }
4628 0 : }
4629 :
4630 0 : void SAL_CALL SwXCellRange::addChartDataChangeEventListener(
4631 : const uno::Reference<chart::XChartDataChangeEventListener> & xListener)
4632 : throw (uno::RuntimeException, std::exception)
4633 : {
4634 : // no need to lock here as m_pImpl is const and container threadsafe
4635 0 : m_ChartListeners.addInterface(xListener);
4636 0 : }
4637 :
4638 0 : void SAL_CALL SwXCellRange::removeChartDataChangeEventListener(
4639 : const uno::Reference<chart::XChartDataChangeEventListener> & xListener)
4640 : throw (uno::RuntimeException, std::exception)
4641 : {
4642 : // no need to lock here as m_pImpl is const and container threadsafe
4643 0 : m_ChartListeners.removeInterface(xListener);
4644 0 : }
4645 :
4646 0 : sal_Bool SwXCellRange::isNotANumber(double /*fNumber*/) throw( uno::RuntimeException, std::exception )
4647 : {
4648 : OSL_FAIL("not implemented");
4649 0 : return sal_False;
4650 : }
4651 :
4652 0 : double SwXCellRange::getNotANumber(void) throw( uno::RuntimeException, std::exception )
4653 : {
4654 : OSL_FAIL("not implemented");
4655 0 : return 0.;
4656 : }
4657 :
4658 0 : uno::Sequence< beans::PropertyValue > SwXCellRange::createSortDescriptor(void) throw( uno::RuntimeException, std::exception )
4659 : {
4660 0 : SolarMutexGuard aGuard;
4661 :
4662 0 : return SwUnoCursorHelper::CreateSortDescriptor(true);
4663 : }
4664 :
4665 0 : void SAL_CALL SwXCellRange::sort(const uno::Sequence< beans::PropertyValue >& rDescriptor)
4666 : throw (uno::RuntimeException,
4667 : std::exception)
4668 : {
4669 0 : SolarMutexGuard aGuard;
4670 0 : SwSortOptions aSortOpt;
4671 0 : SwFrmFmt* pFmt = GetFrmFmt();
4672 0 : if(pFmt &&
4673 0 : SwUnoCursorHelper::ConvertSortProperties(rDescriptor, aSortOpt))
4674 : {
4675 0 : SwUnoTableCrsr& rTableCrsr = dynamic_cast<SwUnoTableCrsr&>(*pTblCrsr);
4676 0 : rTableCrsr.MakeBoxSels();
4677 0 : UnoActionContext aContext( pFmt->GetDoc() );
4678 0 : pFmt->GetDoc()->SortTbl(rTableCrsr.GetSelectedBoxes(), aSortOpt);
4679 0 : }
4680 0 : }
4681 :
4682 146 : sal_uInt16 SwXCellRange::getColumnCount(void)
4683 : {
4684 146 : return static_cast< sal_uInt16 >(aRgDesc.nRight - aRgDesc.nLeft + 1);
4685 : }
4686 :
4687 146 : sal_uInt16 SwXCellRange::getRowCount(void)
4688 : {
4689 146 : return static_cast< sal_uInt16 >(aRgDesc.nBottom - aRgDesc.nTop + 1);
4690 : }
4691 :
4692 0 : const SwUnoCrsr* SwXCellRange::GetTblCrsr() const
4693 : {
4694 0 : const SwUnoCrsr* pRet = 0;
4695 0 : SwFrmFmt* pFmt = GetFrmFmt();
4696 0 : if(pFmt)
4697 0 : pRet = pTblCrsr;
4698 0 : return pRet;
4699 : }
4700 :
4701 14 : void SwXCellRange::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
4702 : {
4703 14 : ClientModify(this, pOld, pNew );
4704 14 : if(!GetRegisteredIn() || !aCursorDepend.GetRegisteredIn())
4705 : {
4706 : /*
4707 : * Not sure if this will cause a memory leak - this pTblCrsr
4708 : * is deleted in SwDoc and segfaults here when deleted again
4709 : * if(!aCursorDepend.GetRegisteredIn())
4710 : delete pTblCrsr;
4711 : */
4712 14 : pTblCrsr = 0;
4713 14 : lang::EventObject const ev(static_cast< ::cppu::OWeakObject&>(*this));
4714 14 : m_ChartListeners.disposeAndClear(ev);
4715 : }
4716 : else
4717 : {
4718 0 : lcl_SendChartEvent(*this, m_ChartListeners);
4719 : }
4720 14 : }
4721 :
4722 : // SwXTableRows
4723 :
4724 0 : OUString SwXTableRows::getImplementationName(void) throw( uno::RuntimeException, std::exception )
4725 : {
4726 0 : return OUString("SwXTableRows");
4727 : }
4728 :
4729 0 : sal_Bool SwXTableRows::supportsService(const OUString& rServiceName) throw( uno::RuntimeException, std::exception )
4730 : {
4731 0 : return cppu::supportsService(this, rServiceName);
4732 : }
4733 :
4734 0 : uno::Sequence< OUString > SwXTableRows::getSupportedServiceNames(void) throw( uno::RuntimeException, std::exception )
4735 : {
4736 0 : uno::Sequence< OUString > aRet(1);
4737 0 : OUString* pArray = aRet.getArray();
4738 0 : pArray[0] = "com.sun.star.text.TableRows";
4739 0 : return aRet;
4740 : }
4741 63288 : TYPEINIT1(SwXTableRows, SwClient);
4742 :
4743 1098 : SwXTableRows::SwXTableRows(SwFrmFmt& rFrmFmt) :
4744 1098 : SwClient(&rFrmFmt)
4745 : {
4746 1098 : }
4747 :
4748 2196 : SwXTableRows::~SwXTableRows()
4749 : {
4750 2196 : }
4751 :
4752 6432 : sal_Int32 SwXTableRows::getCount(void) throw( uno::RuntimeException, std::exception )
4753 : {
4754 6432 : SolarMutexGuard aGuard;
4755 6432 : sal_Int32 nRet = 0;
4756 6432 : SwFrmFmt* pFrmFmt = GetFrmFmt();
4757 6432 : if(!pFrmFmt)
4758 0 : throw uno::RuntimeException();
4759 : else
4760 : {
4761 6432 : SwTable* pTable = SwTable::FindTable( pFrmFmt );
4762 6432 : nRet = pTable->GetTabLines().size();
4763 : }
4764 6432 : return nRet;
4765 : }
4766 :
4767 : ///@see SwXCell::CreateXCell (TODO: seems to be copy and paste programming here)
4768 5410 : uno::Any SwXTableRows::getByIndex(sal_Int32 nIndex)
4769 : throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
4770 : {
4771 5410 : SolarMutexGuard aGuard;
4772 5410 : uno::Any aRet;
4773 5410 : SwFrmFmt* pFrmFmt = GetFrmFmt();
4774 5410 : if(!pFrmFmt || nIndex < 0 )
4775 0 : throw lang::IndexOutOfBoundsException();
4776 : else
4777 : {
4778 5410 : SwTable* pTable = SwTable::FindTable( pFrmFmt );
4779 5410 : if( pTable->GetTabLines().size() > static_cast<size_t>(nIndex))
4780 : {
4781 5408 : SwTableLine* pLine = pTable->GetTabLines()[nIndex];
4782 5408 : SwIterator<SwXTextTableRow,SwFmt> aIter( *pFrmFmt );
4783 5408 : SwXTextTableRow* pXRow = aIter.First();
4784 10820 : while( pXRow )
4785 : {
4786 : // is there already a proper cell?
4787 6 : if(pXRow->GetTblRow() == pLine)
4788 2 : break;
4789 4 : pXRow = aIter.Next();
4790 : }
4791 : // otherwise create it
4792 5408 : if(!pXRow)
4793 5406 : pXRow = new SwXTextTableRow(pFrmFmt, pLine);
4794 : uno::Reference< beans::XPropertySet > xRet =
4795 10816 : (beans::XPropertySet*)pXRow;
4796 10816 : aRet.setValue(&xRet, cppu::UnoType<beans::XPropertySet>::get());
4797 : }
4798 : else
4799 2 : throw lang::IndexOutOfBoundsException();
4800 : }
4801 5410 : return aRet;
4802 : }
4803 :
4804 2 : uno::Type SAL_CALL SwXTableRows::getElementType(void) throw( uno::RuntimeException, std::exception )
4805 : {
4806 2 : return cppu::UnoType<beans::XPropertySet>::get();
4807 : }
4808 :
4809 2 : sal_Bool SwXTableRows::hasElements(void) throw( uno::RuntimeException, std::exception )
4810 : {
4811 2 : SolarMutexGuard aGuard;
4812 2 : SwFrmFmt* pFrmFmt = GetFrmFmt();
4813 2 : if(!pFrmFmt)
4814 0 : throw uno::RuntimeException();
4815 : // a table always has rows
4816 2 : return sal_True;
4817 : }
4818 :
4819 4 : void SwXTableRows::insertByIndex(sal_Int32 nIndex, sal_Int32 nCount)
4820 : throw (uno::RuntimeException, std::exception)
4821 : {
4822 4 : SolarMutexGuard aGuard;
4823 4 : if (nCount == 0)
4824 2 : return;
4825 4 : SwFrmFmt* pFrmFmt = GetFrmFmt();
4826 4 : if(!pFrmFmt)
4827 0 : throw uno::RuntimeException();
4828 : else
4829 : {
4830 4 : SwTable* pTable = SwTable::FindTable( pFrmFmt );
4831 4 : if(!pTable->IsTblComplex())
4832 : {
4833 4 : const size_t nRowCount = pTable->GetTabLines().size();
4834 4 : if (nCount <= 0 || !(0 <= nIndex && static_cast<size_t>(nIndex) <= nRowCount))
4835 : {
4836 2 : uno::RuntimeException aExcept;
4837 2 : aExcept.Message = "Illegal arguments";
4838 2 : throw aExcept;
4839 : }
4840 :
4841 2 : const OUString sTLName = sw_GetCellName(0, nIndex);
4842 2 : const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
4843 2 : bool bAppend = false;
4844 2 : if(!pTLBox)
4845 : {
4846 0 : bAppend = true;
4847 : // to append at the end the cursor must be in the last line
4848 0 : SwTableLines& rLines = pTable->GetTabLines();
4849 0 : SwTableLine* pLine = rLines.back();
4850 0 : SwTableBoxes& rBoxes = pLine->GetTabBoxes();
4851 0 : pTLBox = rBoxes.front();
4852 : }
4853 2 : if(pTLBox)
4854 : {
4855 2 : const SwStartNode* pSttNd = pTLBox->GetSttNd();
4856 2 : SwPosition aPos(*pSttNd);
4857 : // set cursor to the upper-left cell of the range
4858 4 : UnoActionContext aAction(pFrmFmt->GetDoc());
4859 2 : SwUnoCrsr* pUnoCrsr = pFrmFmt->GetDoc()->CreateUnoCrsr(aPos, true);
4860 2 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
4861 :
4862 : {
4863 : // remove actions
4864 2 : UnoActionRemoveContext aRemoveContext(pUnoCrsr->GetDoc());
4865 : }
4866 :
4867 2 : pFrmFmt->GetDoc()->InsertRow(*pUnoCrsr, (sal_uInt16)nCount, bAppend);
4868 4 : delete pUnoCrsr;
4869 2 : }
4870 : }
4871 4 : }
4872 : }
4873 :
4874 4 : void SwXTableRows::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount)
4875 : throw (uno::RuntimeException, std::exception)
4876 : {
4877 4 : SolarMutexGuard aGuard;
4878 4 : if (nCount == 0)
4879 2 : return;
4880 4 : SwFrmFmt* pFrmFmt = GetFrmFmt();
4881 4 : if(!pFrmFmt || nIndex < 0 || nCount <=0 )
4882 2 : throw uno::RuntimeException();
4883 : else
4884 : {
4885 2 : bool bSuccess = false;
4886 2 : SwTable* pTable = SwTable::FindTable( pFrmFmt );
4887 2 : if(!pTable->IsTblComplex())
4888 : {
4889 2 : OUString sTLName = sw_GetCellName(0, nIndex);
4890 2 : const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
4891 2 : if(pTLBox)
4892 : {
4893 : {
4894 : // invalidate all actions
4895 2 : UnoActionRemoveContext aRemoveContext(pFrmFmt->GetDoc());
4896 : }
4897 2 : const SwStartNode* pSttNd = pTLBox->GetSttNd();
4898 2 : SwPosition aPos(*pSttNd);
4899 : // set cursor to the upper-left cell of the range
4900 2 : SwUnoCrsr* pUnoCrsr = pFrmFmt->GetDoc()->CreateUnoCrsr(aPos, true);
4901 2 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
4902 2 : pUnoCrsr->SetRemainInSection( false );
4903 4 : const OUString sBLName = sw_GetCellName(0, nIndex + nCount - 1);
4904 2 : const SwTableBox* pBLBox = pTable->GetTblBox( sBLName );
4905 2 : if(pBLBox)
4906 : {
4907 2 : pUnoCrsr->SetMark();
4908 2 : pUnoCrsr->GetPoint()->nNode = *pBLBox->GetSttNd();
4909 2 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
4910 : SwUnoTableCrsr* pCrsr =
4911 2 : dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
4912 2 : pCrsr->MakeBoxSels();
4913 : { // these braces are important
4914 2 : UnoActionContext aAction(pFrmFmt->GetDoc());
4915 2 : pFrmFmt->GetDoc()->DeleteRow(*pUnoCrsr);
4916 2 : delete pUnoCrsr;
4917 2 : bSuccess = true;
4918 : }
4919 : {
4920 : // invalidate all actions
4921 2 : UnoActionRemoveContext aRemoveContext(pFrmFmt->GetDoc());
4922 : }
4923 2 : }
4924 2 : }
4925 : }
4926 2 : if(!bSuccess)
4927 : {
4928 0 : uno::RuntimeException aExcept;
4929 0 : aExcept.Message = "Illegal arguments";
4930 0 : throw aExcept;
4931 : }
4932 4 : }
4933 : }
4934 :
4935 6 : void SwXTableRows::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
4936 : {
4937 6 : ClientModify(this, pOld, pNew);
4938 6 : }
4939 :
4940 : // SwXTableColumns
4941 :
4942 0 : OUString SwXTableColumns::getImplementationName(void) throw( uno::RuntimeException, std::exception )
4943 : {
4944 0 : return OUString("SwXTableColumns");
4945 : }
4946 :
4947 0 : sal_Bool SwXTableColumns::supportsService(const OUString& rServiceName) throw( uno::RuntimeException, std::exception )
4948 : {
4949 0 : return cppu::supportsService(this, rServiceName);
4950 : }
4951 :
4952 0 : uno::Sequence< OUString > SwXTableColumns::getSupportedServiceNames(void) throw( uno::RuntimeException, std::exception )
4953 : {
4954 0 : uno::Sequence< OUString > aRet(1);
4955 0 : OUString* pArray = aRet.getArray();
4956 0 : pArray[0] = "com.sun.star.text.TableColumns";
4957 0 : return aRet;
4958 : }
4959 :
4960 34 : TYPEINIT1(SwXTableColumns, SwClient);
4961 :
4962 8 : SwXTableColumns::SwXTableColumns(SwFrmFmt& rFrmFmt) :
4963 8 : SwClient(&rFrmFmt)
4964 : {
4965 8 : }
4966 :
4967 16 : SwXTableColumns::~SwXTableColumns()
4968 : {
4969 16 : }
4970 :
4971 8 : sal_Int32 SwXTableColumns::getCount(void) throw( uno::RuntimeException, std::exception )
4972 : {
4973 8 : SolarMutexGuard aGuard;
4974 8 : sal_Int32 nRet = 0;
4975 8 : SwFrmFmt* pFrmFmt = GetFrmFmt();
4976 8 : if(!pFrmFmt)
4977 0 : throw uno::RuntimeException();
4978 : else
4979 : {
4980 8 : SwTable* pTable = SwTable::FindTable( pFrmFmt );
4981 8 : if(!pTable->IsTblComplex())
4982 : {
4983 8 : SwTableLines& rLines = pTable->GetTabLines();
4984 8 : SwTableLine* pLine = rLines.front();
4985 8 : nRet = pLine->GetTabBoxes().size();
4986 : }
4987 : }
4988 8 : return nRet;
4989 : }
4990 :
4991 8 : uno::Any SwXTableColumns::getByIndex(sal_Int32 nIndex)
4992 : throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException, std::exception )
4993 : {
4994 8 : SolarMutexGuard aGuard;
4995 16 : uno::Reference< uno::XInterface > xRet;
4996 8 : SwFrmFmt* pFrmFmt = GetFrmFmt();
4997 8 : if(!pFrmFmt)
4998 0 : throw uno::RuntimeException();
4999 : else
5000 : {
5001 8 : size_t nCount = 0;
5002 8 : SwTable* pTable = SwTable::FindTable( pFrmFmt );
5003 8 : if(!pTable->IsTblComplex())
5004 : {
5005 8 : SwTableLines& rLines = pTable->GetTabLines();
5006 8 : SwTableLine* pLine = rLines.front();
5007 8 : nCount = pLine->GetTabBoxes().size();
5008 : }
5009 8 : if(nIndex < 0 || nCount <= static_cast<size_t>(nIndex))
5010 2 : throw lang::IndexOutOfBoundsException();
5011 6 : xRet = uno::Reference<uno::XInterface>(); //!! writer tables do not have columns !!
5012 : }
5013 14 : return uno::Any(&xRet, cppu::UnoType<uno::XInterface>::get());
5014 : }
5015 :
5016 2 : uno::Type SAL_CALL SwXTableColumns::getElementType(void) throw( uno::RuntimeException, std::exception )
5017 : {
5018 2 : return cppu::UnoType<uno::XInterface>::get();
5019 : }
5020 :
5021 2 : sal_Bool SwXTableColumns::hasElements(void) throw( uno::RuntimeException, std::exception )
5022 : {
5023 2 : SolarMutexGuard aGuard;
5024 2 : SwFrmFmt* pFrmFmt = GetFrmFmt();
5025 2 : if(!pFrmFmt)
5026 0 : throw uno::RuntimeException();
5027 2 : return sal_True;
5028 : }
5029 :
5030 : ///@see SwXTableRows::insertByIndex (TODO: seems to be copy and paste programming here)
5031 0 : void SwXTableColumns::insertByIndex(sal_Int32 nIndex, sal_Int32 nCount)
5032 : throw (uno::RuntimeException, std::exception)
5033 : {
5034 0 : SolarMutexGuard aGuard;
5035 0 : if (nCount == 0)
5036 0 : return;
5037 0 : SwFrmFmt* pFrmFmt = GetFrmFmt();
5038 0 : if(!pFrmFmt)
5039 0 : throw uno::RuntimeException();
5040 : else
5041 : {
5042 0 : SwTable* pTable = SwTable::FindTable( pFrmFmt );
5043 0 : if(!pTable->IsTblComplex())
5044 : {
5045 0 : SwTableLines& rLines = pTable->GetTabLines();
5046 0 : SwTableLine* pLine = rLines.front();
5047 0 : const size_t nColCount = pLine->GetTabBoxes().size();
5048 0 : if (nCount <= 0 || !(0 <= nIndex && static_cast<size_t>(nIndex) <= nColCount))
5049 : {
5050 0 : uno::RuntimeException aExcept;
5051 0 : aExcept.Message = "Illegal arguments";
5052 0 : throw aExcept;
5053 : }
5054 :
5055 0 : const OUString sTLName = sw_GetCellName(nIndex, 0);
5056 0 : const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
5057 0 : bool bAppend = false;
5058 0 : if(!pTLBox)
5059 : {
5060 0 : bAppend = true;
5061 : // to append at the end the cursor must be in the last line
5062 0 : SwTableBoxes& rBoxes = pLine->GetTabBoxes();
5063 0 : pTLBox = rBoxes.back();
5064 : }
5065 0 : if(pTLBox)
5066 : {
5067 0 : const SwStartNode* pSttNd = pTLBox->GetSttNd();
5068 0 : SwPosition aPos(*pSttNd);
5069 0 : UnoActionContext aAction(pFrmFmt->GetDoc());
5070 0 : SwUnoCrsr* pUnoCrsr = pFrmFmt->GetDoc()->CreateUnoCrsr(aPos, true);
5071 0 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
5072 :
5073 : {
5074 : // remove actions
5075 0 : UnoActionRemoveContext aRemoveContext(pUnoCrsr->GetDoc());
5076 : }
5077 :
5078 0 : pFrmFmt->GetDoc()->InsertCol(*pUnoCrsr, (sal_uInt16)nCount, bAppend);
5079 0 : delete pUnoCrsr;
5080 0 : }
5081 : }
5082 0 : }
5083 : }
5084 :
5085 : ///@see SwXTableRows::removeByIndex (TODO: seems to be copy and paste programming here)
5086 0 : void SwXTableColumns::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount)
5087 : throw (uno::RuntimeException, std::exception)
5088 : {
5089 0 : SolarMutexGuard aGuard;
5090 0 : if (nCount == 0)
5091 0 : return;
5092 0 : SwFrmFmt* pFrmFmt = GetFrmFmt();
5093 0 : if(!pFrmFmt|| nIndex < 0 || nCount <=0 )
5094 0 : throw uno::RuntimeException();
5095 : else
5096 : {
5097 0 : bool bSuccess = false;
5098 0 : SwTable* pTable = SwTable::FindTable( pFrmFmt );
5099 0 : if(!pTable->IsTblComplex())
5100 : {
5101 0 : const OUString sTLName = sw_GetCellName(nIndex, 0);
5102 0 : const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
5103 0 : if(pTLBox)
5104 : {
5105 : {
5106 : // invalidate all actions
5107 0 : UnoActionRemoveContext aRemoveContext(pFrmFmt->GetDoc());
5108 : }
5109 0 : const SwStartNode* pSttNd = pTLBox->GetSttNd();
5110 0 : SwPosition aPos(*pSttNd);
5111 : // set cursor to the upper-left cell of the range
5112 0 : SwUnoCrsr* pUnoCrsr = pFrmFmt->GetDoc()->CreateUnoCrsr(aPos, true);
5113 0 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
5114 0 : pUnoCrsr->SetRemainInSection( false );
5115 0 : const OUString sTRName = sw_GetCellName(nIndex + nCount - 1, 0);
5116 0 : const SwTableBox* pTRBox = pTable->GetTblBox( sTRName );
5117 0 : if(pTRBox)
5118 : {
5119 0 : pUnoCrsr->SetMark();
5120 0 : pUnoCrsr->GetPoint()->nNode = *pTRBox->GetSttNd();
5121 0 : pUnoCrsr->Move( fnMoveForward, fnGoNode );
5122 : SwUnoTableCrsr* pCrsr =
5123 0 : dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
5124 0 : pCrsr->MakeBoxSels();
5125 : { // these braces are important
5126 0 : UnoActionContext aAction(pFrmFmt->GetDoc());
5127 0 : pFrmFmt->GetDoc()->DeleteCol(*pUnoCrsr);
5128 0 : delete pUnoCrsr;
5129 0 : bSuccess = true;
5130 : }
5131 : {
5132 : // invalidate all actions
5133 0 : UnoActionRemoveContext aRemoveContext(pFrmFmt->GetDoc());
5134 : }
5135 0 : }
5136 0 : }
5137 : }
5138 0 : if(!bSuccess)
5139 : {
5140 0 : uno::RuntimeException aExcept;
5141 0 : aExcept.Message = "Illegal arguments";
5142 0 : throw aExcept;
5143 : }
5144 0 : }
5145 : }
5146 :
5147 4 : void SwXTableColumns::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
5148 : {
5149 4 : ClientModify(this, pOld, pNew);
5150 274 : }
5151 :
5152 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|