summaryrefslogtreecommitdiff
path: root/sw/source/core/unocore/unotbl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/unocore/unotbl.cxx')
-rw-r--r--sw/source/core/unocore/unotbl.cxx5455
1 files changed, 5455 insertions, 0 deletions
diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
new file mode 100644
index 000000000000..856d5e0b44bb
--- /dev/null
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -0,0 +1,5455 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+
+// STL includes
+#include <list>
+
+#include <svx/svxids.hrc>
+#include <editeng/memberids.hrc>
+#include <float.h> // for DBL_MIN
+#include <swtypes.hxx>
+#include <cmdid.h>
+#include <unotbl.hxx>
+#include <unostyle.hxx>
+#include <section.hxx>
+#include <unocrsr.hxx>
+#include <svx/unomid.hxx>
+#include <hints.hxx>
+#include <swtblfmt.hxx>
+#include <doc.hxx>
+#include <shellres.hxx>
+#include <docary.hxx>
+#include <ndole.hxx>
+#include <frame.hxx>
+#include <vcl/svapp.hxx>
+#include <fmtfsize.hxx>
+#include <tblafmt.hxx>
+#include <tabcol.hxx>
+#include <cellatr.hxx>
+#include <fmtpdsc.hxx>
+#include <pagedesc.hxx>
+#define _SVSTDARR_STRINGS
+#include <svl/svstdarr.hxx>
+#include <viewsh.hxx>
+#include <tabfrm.hxx>
+#include <redline.hxx>
+#include <unoredline.hxx>
+#include <unoprnms.hxx>
+#include <unocrsrhelper.hxx>
+#include <com/sun/star/text/WrapTextMode.hpp>
+#include <com/sun/star/text/TextContentAnchorType.hpp>
+#include <com/sun/star/text/TableColumnSeparator.hpp>
+#include <com/sun/star/text/XTextSection.hpp>
+#include <com/sun/star/table/ShadowFormat.hpp>
+#include <com/sun/star/table/TableBorder.hpp>
+#include <com/sun/star/table/TableBorderDistances.hpp>
+#include <com/sun/star/style/PageStyleLayout.hpp>
+#include <com/sun/star/style/BreakType.hpp>
+#include <com/sun/star/style/GraphicLocation.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/chart/XChartDataChangeEventListener.hpp>
+#include <com/sun/star/chart/ChartDataChangeEvent.hpp>
+#include <com/sun/star/chart2/data/XDataSequence.hpp>
+#include <com/sun/star/chart2/data/XLabeledDataSequence.hpp>
+#include <com/sun/star/table/CellContentType.hpp>
+#include <unotbl.hxx>
+#include <unotextrange.hxx>
+#include <unotextcursor.hxx>
+#include <unoparagraph.hxx>
+#include <svl/zforlist.hxx> // SvNumberFormatter
+#include <editeng/brkitem.hxx>
+#include <editeng/shaditem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <editeng/ulspitem.hxx>
+#include <fmtornt.hxx>
+#include <editeng/keepitem.hxx>
+#include <fmtlsplt.hxx>
+#include <swundo.hxx>
+#include <vos/mutex.hxx>
+#include <SwStyleNameMapper.hxx>
+#include <frmatr.hxx>
+#include <crsskip.hxx>
+#include <unochart.hxx>
+#include <sortopt.hxx>
+#include <rtl/math.hxx>
+
+
+using namespace ::com::sun::star;
+using ::rtl::OUString;
+
+
+//-----------------------------------------------------------------------------
+// from swtable.cxx
+extern void lcl_GetTblBoxColStr( sal_uInt16 nCol, String& rNm );
+
+#define UNO_TABLE_COLUMN_SUM 10000
+
+/* -----------------17.07.98 15:47-------------------
+ *
+ * --------------------------------------------------*/
+table::BorderLine lcl_SvxLineToLine(const SvxBorderLine* pLine)
+{
+ table::BorderLine aLine;
+ if(pLine)
+ {
+ aLine.Color = pLine->GetColor().GetColor() ;
+ aLine.InnerLineWidth = TWIP_TO_MM100_UNSIGNED( pLine->GetInWidth() );
+ aLine.OuterLineWidth = TWIP_TO_MM100_UNSIGNED( pLine->GetOutWidth() );
+ aLine.LineDistance = TWIP_TO_MM100_UNSIGNED( pLine->GetDistance() );
+ }
+ else
+ aLine.Color = aLine.InnerLineWidth = aLine.OuterLineWidth = aLine.LineDistance = 0;
+ return aLine;
+}
+/* -----------------17.07.98 15:52-------------------
+ *
+ * --------------------------------------------------*/
+sal_Bool lcl_LineToSvxLine(const table::BorderLine& rLine, SvxBorderLine& rSvxLine)
+{
+ rSvxLine.SetColor( Color(rLine.Color));
+ rSvxLine.SetInWidth( MM100_TO_TWIP( rLine.InnerLineWidth ) );
+ rSvxLine.SetOutWidth(MM100_TO_TWIP( rLine.OuterLineWidth ) );
+ rSvxLine.SetDistance(MM100_TO_TWIP( rLine.LineDistance ) );
+ sal_Bool bRet = rLine.InnerLineWidth > 0 || rLine.OuterLineWidth > 0;
+ return bRet;
+}
+/* -----------------11.12.98 14:22-------------------
+ *
+ * --------------------------------------------------*/
+void lcl_SetSpecialProperty(SwFrmFmt* pFmt, const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue)
+ throw (lang::IllegalArgumentException)
+{
+ //Sonderbehandlung fuer "Nicht-Items"
+ switch(pEntry->nWID)
+ {
+ case FN_TABLE_HEADLINE_REPEAT:
+ case FN_TABLE_HEADLINE_COUNT:
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ {
+ UnoActionContext aAction(pFmt->GetDoc());
+ if( pEntry->nWID == FN_TABLE_HEADLINE_REPEAT)
+ {
+ sal_Bool bVal = *(sal_Bool*)aValue.getValue();
+ pFmt->GetDoc()->SetRowsToRepeat( *pTable, bVal ? 1 : 0 );
+ }
+ else
+ {
+ sal_Int32 nRepeat = 0;
+ aValue >>= nRepeat;
+ if( nRepeat >= 0 && nRepeat < USHRT_MAX )
+ pFmt->GetDoc()->SetRowsToRepeat( *pTable, (USHORT) nRepeat );
+ }
+ }
+ }
+ break;
+ case FN_TABLE_IS_RELATIVE_WIDTH:
+ case FN_TABLE_WIDTH:
+ case FN_TABLE_RELATIVE_WIDTH:
+ {
+ sal_Int32 nWidth = 0;
+ SwFmtFrmSize aSz( pFmt->GetFrmSize() );
+ if(FN_TABLE_WIDTH == pEntry->nWID)
+ {
+ aValue >>= nWidth;
+ aSz.SetWidthPercent(0);
+ aSz.SetWidth ( MM100_TO_TWIP ( nWidth ) );
+ }
+ else if(FN_TABLE_RELATIVE_WIDTH == pEntry->nWID)
+ {
+ sal_Int16 nSet = 0;
+ aValue >>= nSet;
+ if(nSet && nSet <=100)
+ aSz.SetWidthPercent( (BYTE)nSet );
+ }
+ else if(FN_TABLE_IS_RELATIVE_WIDTH == pEntry->nWID)
+ {
+ sal_Bool bPercent = *(sal_Bool*)aValue.getValue();
+ if(!bPercent)
+ aSz.SetWidthPercent(0);
+ else
+ {
+ lang::IllegalArgumentException aExcept;
+ aExcept.Message = C2U("relative width cannot be switched on with this property");
+ throw aExcept;
+ }
+ }
+ pFmt->GetDoc()->SetAttr(aSz, *pFmt);
+ }
+ break;
+ case RES_PAGEDESC:
+ {
+ OUString uTemp;
+ aValue >>= uTemp;
+ String sPageStyle = uTemp;
+ const SwPageDesc* pDesc = 0;
+ if(sPageStyle.Len())
+ {
+ SwStyleNameMapper::FillUIName(sPageStyle, sPageStyle, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, sal_True );
+ pDesc = ::GetPageDescByName_Impl(*pFmt->GetDoc(), sPageStyle);
+ }
+ SwFmtPageDesc aDesc( pDesc );
+ pFmt->GetDoc()->SetAttr(aDesc, *pFmt);
+ }
+ break;
+ default:
+ throw lang::IllegalArgumentException();
+ }
+}
+
+/* -----------------27.04.98 08:50-------------------
+ *
+ * --------------------------------------------------*/
+uno::Any lcl_GetSpecialProperty(SwFrmFmt* pFmt, const SfxItemPropertySimpleEntry* pEntry )
+{
+ uno::Any aRet;
+ switch(pEntry->nWID)
+ {
+ case FN_TABLE_HEADLINE_REPEAT:
+ case FN_TABLE_HEADLINE_COUNT:
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ USHORT nRepeat = pTable->GetRowsToRepeat();
+ if(pEntry->nWID == FN_TABLE_HEADLINE_REPEAT)
+ {
+ BOOL bTemp = nRepeat > 0;
+ aRet.setValue(&bTemp, ::getCppuBooleanType());
+ }
+ else
+ aRet <<= (sal_Int32)nRepeat;
+ }
+ break;
+ case FN_TABLE_WIDTH:
+ case FN_TABLE_IS_RELATIVE_WIDTH:
+ case FN_TABLE_RELATIVE_WIDTH:
+ {
+ const SwFmtFrmSize& rSz = pFmt->GetFrmSize();
+ if(FN_TABLE_WIDTH == pEntry->nWID)
+ rSz.QueryValue(aRet, MID_FRMSIZE_WIDTH|CONVERT_TWIPS);
+ else if(FN_TABLE_RELATIVE_WIDTH == pEntry->nWID)
+ rSz.QueryValue(aRet, MID_FRMSIZE_REL_WIDTH);
+ else
+ {
+ BOOL bTemp = 0 != rSz.GetWidthPercent();
+ aRet.setValue(&bTemp, ::getBooleanCppuType());
+ }
+ }
+ break;
+ case RES_PAGEDESC:
+ {
+ const SfxItemSet& rSet = pFmt->GetAttrSet();
+ const SfxPoolItem* pItem;
+ String sPDesc;
+ if(SFX_ITEM_SET == rSet.GetItemState(RES_PAGEDESC, sal_False, &pItem))
+ {
+ const SwPageDesc* pDsc = ((const SwFmtPageDesc*)pItem)->GetPageDesc();
+ if(pDsc)
+ {
+ sPDesc = SwStyleNameMapper::GetProgName(pDsc->GetName(), nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC );
+ }
+ }
+ aRet <<= OUString(sPDesc);
+ }
+ break;
+ case RES_ANCHOR :
+ aRet <<= text::TextContentAnchorType_AT_PARAGRAPH;
+ break;
+ case FN_UNO_ANCHOR_TYPES :
+ {
+ uno::Sequence<text::TextContentAnchorType> aTypes(1);
+ text::TextContentAnchorType* pArray = aTypes.getArray();
+ pArray[0] = text::TextContentAnchorType_AT_PARAGRAPH;
+ aRet <<= aTypes;
+ }
+ break;
+ case FN_UNO_WRAP :
+ {
+ aRet <<= text::WrapTextMode_NONE;
+ }
+ break;
+ case FN_PARAM_LINK_DISPLAY_NAME :
+ aRet <<= OUString(pFmt->GetName());
+ break;
+ case FN_UNO_REDLINE_NODE_START:
+ case FN_UNO_REDLINE_NODE_END:
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ SwNode* pTblNode = pTable->GetTableNode();
+ if(FN_UNO_REDLINE_NODE_END == pEntry->nWID)
+ pTblNode = pTblNode->EndOfSectionNode();
+ const SwRedlineTbl& rRedTbl = pFmt->GetDoc()->GetRedlineTbl();
+ for(USHORT nRed = 0; nRed < rRedTbl.Count(); nRed++)
+ {
+ const SwRedline* pRedline = rRedTbl[nRed];
+ const SwNode* pRedPointNode = pRedline->GetNode(TRUE);
+ const SwNode* pRedMarkNode = pRedline->GetNode(FALSE);
+ if(pRedPointNode == pTblNode || pRedMarkNode == pTblNode)
+ {
+ const SwNode* pStartOfRedline = SwNodeIndex(*pRedPointNode) <= SwNodeIndex(*pRedMarkNode) ?
+ pRedPointNode : pRedMarkNode;
+ BOOL bIsStart = pStartOfRedline == pTblNode;
+ aRet <<= SwXRedlinePortion::CreateRedlineProperties(*pRedline, bIsStart);
+ break;
+ }
+ }
+ }
+ break;
+ }
+ return aRet;
+}
+/* -----------------19.10.05 08:32-------------------
+ *
+ * --------------------------------------------------*/
+
+
+// returns the position for the cell with the specified name
+// (note that the indices rColumn and rRow are 0 based here)
+// Also since the implementations of tables does not really have
+// columns using this function is appropriate only for tables
+// that are not complex (i.e. where IsTblComplex() returns false).
+//
+// returns: both indices for column and row (all >= 0) if everything was Ok.
+// At least one value < 0 if sth was wrong.
+//
+// Sample for naming scheme of cell in a single row (in groups a 26):
+// A1..Z1, a1..z1, AA1..AZ1, Aa1..Az1, BA1..BZ1, Ba1..Bz1, ...
+void lcl_GetCellPosition( const String &rCellName,
+ sal_Int32 &rColumn, sal_Int32 &rRow)
+{
+ rColumn = rRow = -1; // default return values indicating failure
+ xub_StrLen nLen = rCellName.Len();
+ if (nLen)
+ {
+ const sal_Unicode *pBuf = rCellName.GetBuffer();
+ const sal_Unicode *pEnd = pBuf + nLen;
+ while (pBuf < pEnd && !('0' <= *pBuf && *pBuf <= '9'))
+ ++pBuf;
+ // start of number found?
+ if (pBuf < pEnd && ('0' <= *pBuf && *pBuf <= '9'))
+ {
+ String aColTxt( rCellName.GetBuffer(), static_cast< xub_StrLen >(pBuf - rCellName.GetBuffer()) );
+ String aRowTxt( pBuf, static_cast< xub_StrLen >(rCellName.GetBuffer() + nLen - pBuf) );
+ if (aColTxt.Len() && aRowTxt.Len())
+ {
+ sal_Int32 nColIdx = 0;
+ sal_Int32 nLength = aColTxt.Len();
+ for (xub_StrLen i = 0; i < nLength; ++i)
+ {
+ nColIdx = 52 * nColIdx;
+ if (i < nLength - 1)
+ ++nColIdx;
+ sal_Unicode cChar = aColTxt.GetBuffer()[i];
+ if ('A' <= cChar && cChar <= 'Z')
+ nColIdx = nColIdx + (cChar - 'A');
+ else if ('a' <= cChar && cChar <= 'z')
+ nColIdx = nColIdx + (26 + cChar - 'a');
+ else
+ {
+ nColIdx = -1; // sth failed
+ break;
+ }
+ }
+
+ rColumn = nColIdx;
+ rRow = aRowTxt.ToInt32() - 1; // - 1 because indices ought to be 0 based
+ }
+ }
+ }
+#if OSL_DEBUG_LEVEL > 1
+ DBG_ASSERT( rColumn != -1 && rRow != -1, "failed to get column or row index" );
+#endif
+}
+
+
+// arguments: must be non-empty strings with valid cell names
+//
+// returns: -1 if first cell < second cell
+// 0 if both cells are equal
+// +1 if the first cell > second cell
+//
+// Note: this function probably also make sense only
+// for cell names of non-complex tables
+int lcl_CompareCellsByRowFirst( const String &rCellName1, const String &rCellName2 )
+{
+ sal_Int32 nCol1 = -1, nRow1 = -1, nCol2 = -1, nRow2 = -1;
+ lcl_GetCellPosition( rCellName1, nCol1, nRow1 );
+ lcl_GetCellPosition( rCellName2, nCol2, nRow2 );
+
+ if (nRow1 < nRow2 || (nRow1 == nRow2 && nCol1 < nCol2))
+ return -1;
+ else if (nCol1 == nCol2 && nRow1 == nRow2)
+ return 0;
+ else
+ return +1;
+}
+
+
+// arguments: must be non-empty strings with valid cell names
+//
+// returns: -1 if first cell < second cell
+// 0 if both cells are equal
+// +1 if the first cell > second cell
+//
+// Note: this function probably also make sense only
+// for cell names of non-complex tables
+int lcl_CompareCellsByColFirst( const String &rCellName1, const String &rCellName2 )
+{
+ sal_Int32 nCol1 = -1, nRow1 = -1, nCol2 = -1, nRow2 = -1;
+ lcl_GetCellPosition( rCellName1, nCol1, nRow1 );
+ lcl_GetCellPosition( rCellName2, nCol2, nRow2 );
+
+ if (nCol1 < nCol2 || (nCol1 == nCol2 && nRow1 < nRow2))
+ return -1;
+ else if (nRow1 == nRow2 && nCol1 == nCol2)
+ return 0;
+ else
+ return +1;
+}
+
+
+// arguments: must be non-empty strings with valid cell names
+//
+// returns: -1 if first cell range < second cell range
+// 0 if both cell ranges are identical
+// +1 if the first cell range > second cell range
+//
+// Note: this function probably also make sense only
+// for cell names of non-complex tables
+int lcl_CompareCellRanges(
+ const String &rRange1StartCell, const String &rRange1EndCell,
+ const String &rRange2StartCell, const String &rRange2EndCell,
+ sal_Bool bCmpColsFirst )
+{
+ int (*pCompareCells)( const String &, const String & ) =
+ bCmpColsFirst ? &lcl_CompareCellsByColFirst : &lcl_CompareCellsByRowFirst;
+
+ int nCmpResStartCells = pCompareCells( rRange1StartCell, rRange2StartCell );
+ if ((-1 == nCmpResStartCells ) ||
+ ( 0 == nCmpResStartCells &&
+ -1 == pCompareCells( rRange1EndCell, rRange2EndCell ) ))
+ return -1;
+ else if (0 == nCmpResStartCells &&
+ 0 == pCompareCells( rRange1EndCell, rRange2EndCell ))
+ return 0;
+ else
+ return +1;
+}
+
+
+/* -----------------25.06.98 08:32-------------------
+ *
+ * --------------------------------------------------*/
+
+// returns the cell name for the cell at the specified position
+// (note that the indices nColumn and nRow are 0 based here)
+String lcl_GetCellName( sal_Int32 nColumn, sal_Int32 nRow )
+{
+#if OSL_DEBUG_LEVEL > 1
+ {
+ sal_Int32 nCol, nRow2;
+ lcl_GetCellPosition( String::CreateFromAscii("z1"), nCol, nRow2);
+ DBG_ASSERT( nCol == 51, "lcl_GetCellPosition failed" );
+ lcl_GetCellPosition( String::CreateFromAscii("AA1"), nCol, nRow2);
+ DBG_ASSERT( nCol == 52, "lcl_GetCellPosition failed" );
+ lcl_GetCellPosition( String::CreateFromAscii("AB1"), nCol, nRow2);
+ DBG_ASSERT( nCol == 53, "lcl_GetCellPosition failed" );
+ lcl_GetCellPosition( String::CreateFromAscii("BB1"), nCol, nRow2);
+ DBG_ASSERT( nCol == 105, "lcl_GetCellPosition failed" );
+ }
+#endif
+
+ String sCellName;
+ if (nColumn < 0 || nRow < 0)
+ return sCellName;
+ lcl_GetTblBoxColStr( static_cast< USHORT >(nColumn), sCellName );
+ sCellName += String::CreateFromInt32( nRow + 1 );
+ return sCellName;
+}
+
+/** Find the top left or bottom right corner box in given table.
+ Consider nested lines when finding the box.
+
+ @param i_pTable the table
+
+ @param i_bTopLeft if true, find top left box, otherwise find bottom
+ right box
+ */
+
+const SwTableBox* lcl_FindCornerTableBox(const SwTableLines& rTableLines, const bool i_bTopLeft)
+{
+ bool bFirst = true;
+ const SwTableBox* pBox = 0;
+ do
+ {
+ const SwTableLines& rLines(bFirst ? rTableLines : pBox->GetTabLines());
+ bFirst = false;
+ OSL_ASSERT(rLines.Count() != 0);
+ if (rLines.Count() != 0)
+ {
+ const SwTableLine* pLine(rLines[i_bTopLeft ? 0 : rLines.Count() - 1]);
+ OSL_ASSERT(pLine);
+ const SwTableBoxes& rBoxes(pLine->GetTabBoxes());
+ OSL_ASSERT(rBoxes.Count() != 0);
+ pBox = rBoxes[i_bTopLeft ? 0 : rBoxes.Count() - 1];
+ OSL_ASSERT(pBox);
+ }
+ else
+ {
+ pBox = 0;
+ }
+ } while (pBox && !pBox->GetSttNd());
+ return pBox;
+}
+
+/* -----------------21.11.05 14:46-------------------
+
+ --------------------------------------------------*/
+// start cell should be in the upper-left corner of the range and
+// end cell in the lower-right.
+// I.e. from the four possible representation
+// A1:C5, C5:A1, A5:C1, C1:A5
+// only A1:C5 is the one to use
+void lcl_NormalizeRange(
+ String &rCell1, // will hold the upper-left cell of the range upon return
+ String &rCell2 ) // will hold the lower-right cell of the range upon return
+{
+ sal_Int32 nCol1 = -1, nRow1 = -1, nCol2 = -1, nRow2 = -1;
+ lcl_GetCellPosition( rCell1, nCol1, nRow1 );
+ lcl_GetCellPosition( rCell2, nCol2, nRow2 );
+ if (nCol2 < nCol1 || nRow2 < nRow1)
+ {
+ rCell1 = lcl_GetCellName( Min(nCol1, nCol2), Min(nRow1, nRow2) );
+ rCell2 = lcl_GetCellName( Max(nCol1, nCol2), Max(nRow1, nRow2) );
+ }
+
+}
+
+void SwRangeDescriptor::Normalize()
+{
+ if (nTop > nBottom)
+ {
+ sal_Int32 nTmp = nTop;
+ nTop = nBottom;
+ nBottom = nTmp;
+ }
+ if (nLeft > nRight)
+ {
+ sal_Int32 nTmp = nLeft;
+ nLeft = nRight;
+ nRight = nTmp;
+ }
+}
+
+
+/* -----------------25.06.98 08:32-------------------
+ *
+ * --------------------------------------------------*/
+SwXCell* lcl_CreateXCell(SwFrmFmt* pFmt, sal_Int32 nColumn, sal_Int32 nRow)
+{
+ SwXCell* pXCell = 0;
+ String sCellName = lcl_GetCellName(nColumn, nRow);
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ SwTableBox* pBox = (SwTableBox*)pTable->GetTblBox( sCellName );
+ if(pBox)
+ {
+ pXCell = SwXCell::CreateXCell(pFmt, pBox, pTable);
+ }
+ return pXCell;
+}
+/* -----------------20.07.98 12:35-------------------
+ *
+ * --------------------------------------------------*/
+void lcl_InspectLines(SwTableLines& rLines, SvStrings& rAllNames)
+{
+ for( sal_uInt16 i = 0; i < rLines.Count(); i++ )
+ {
+ SwTableLine* pLine = rLines[i];
+ SwTableBoxes& rBoxes = pLine->GetTabBoxes();
+ for(sal_uInt16 j = 0; j < rBoxes.Count(); j++)
+ {
+ SwTableBox* pBox = rBoxes[j];
+ if(pBox->GetName().Len() && pBox->getRowSpan() > 0 )
+ rAllNames.Insert(new String(pBox->GetName()), rAllNames.Count());
+ SwTableLines& rBoxLines = pBox->GetTabLines();
+ if(rBoxLines.Count())
+ {
+ lcl_InspectLines(rBoxLines, rAllNames);
+ }
+ }
+ }
+}
+/* -----------------02.10.98 15:55-------------------
+ *
+ * --------------------------------------------------*/
+void lcl_FormatTable(SwFrmFmt* pTblFmt)
+{
+ SwClientIter aIter( *pTblFmt );
+ for( SwClient* pC = aIter.First( TYPE( SwFrm ));
+ pC; pC = aIter.Next() )
+ {
+ if( ((SwFrm*)pC)->IsTabFrm() )
+ {
+ if(((SwFrm*)pC)->IsValid())
+ ((SwFrm*)pC)->InvalidatePos();
+ ((SwTabFrm*)pC)->SetONECalcLowers();
+ ((SwTabFrm*)pC)->Calc();
+ }
+ }
+}
+/* -----------------20.07.98 13:15-------------------
+ *
+ * --------------------------------------------------*/
+void lcl_CrsrSelect(SwPaM* pCrsr, sal_Bool bExpand)
+{
+ if(bExpand)
+ {
+ if(!pCrsr->HasMark())
+ pCrsr->SetMark();
+ }
+ else if(pCrsr->HasMark())
+ pCrsr->DeleteMark();
+
+}
+/* -----------------17.07.98 14:36-------------------
+ *
+ * --------------------------------------------------*/
+void lcl_GetTblSeparators(uno::Any& rRet, SwTable* pTable, SwTableBox* pBox, sal_Bool bRow)
+{
+ SwTabCols aCols;
+ aCols.SetLeftMin ( 0 );
+ aCols.SetLeft ( 0 );
+ aCols.SetRight ( UNO_TABLE_COLUMN_SUM );
+ aCols.SetRightMax( UNO_TABLE_COLUMN_SUM );
+
+ pTable->GetTabCols( aCols, pBox, sal_False, bRow );
+
+ sal_uInt16 nSepCount = aCols.Count();
+ uno::Sequence< text::TableColumnSeparator> aColSeq(nSepCount);
+ text::TableColumnSeparator* pArray = aColSeq.getArray();
+ sal_Bool bError = sal_False;
+ for(sal_uInt16 i = 0; i < nSepCount; i++)
+ {
+ pArray[i].Position = static_cast< sal_Int16 >(aCols[i]);
+ pArray[i].IsVisible = !aCols.IsHidden(i);
+ if(!bRow && !pArray[i].IsVisible)
+ {
+ bError = sal_True;
+ break;
+ }
+ }
+ if(!bError)
+ rRet.setValue(&aColSeq, ::getCppuType((uno::Sequence< text::TableColumnSeparator>*)0));
+
+}
+/* -----------------17.07.98 14:36-------------------
+ *
+ * --------------------------------------------------*/
+void lcl_SetTblSeparators(const uno::Any& rVal, SwTable* pTable, SwTableBox* pBox, sal_Bool bRow, SwDoc* pDoc)
+{
+ SwTabCols aOldCols;
+
+ aOldCols.SetLeftMin ( 0 );
+ aOldCols.SetLeft ( 0 );
+ aOldCols.SetRight ( UNO_TABLE_COLUMN_SUM );
+ aOldCols.SetRightMax( UNO_TABLE_COLUMN_SUM );
+
+ pTable->GetTabCols( aOldCols, pBox, sal_False, bRow );
+ sal_uInt16 nOldCount = aOldCols.Count();
+ //there's no use in setting tab cols if there's only one column
+ if( !nOldCount )
+ return;
+
+ const uno::Sequence< text::TableColumnSeparator>* pSepSeq =
+ (uno::Sequence< text::TableColumnSeparator>*) rVal.getValue();
+ if(pSepSeq && pSepSeq->getLength() == nOldCount)
+ {
+ SwTabCols aCols(aOldCols);
+ sal_Bool bError = sal_False;
+ const text::TableColumnSeparator* pArray = pSepSeq->getConstArray();
+ sal_Int32 nLastValue = 0;
+ //sal_Int32 nTblWidth = aCols.GetRight() - aCols.GetLeft();
+ for(sal_uInt16 i = 0; i < nOldCount; i++)
+ {
+ aCols[i] = pArray[i].Position;
+ if(pArray[i].IsVisible == aCols.IsHidden(i) ||
+ (!bRow && aCols.IsHidden(i)) ||
+ long(aCols[i] - long(nLastValue)) < 0 ||
+ UNO_TABLE_COLUMN_SUM < aCols[i] )
+ {
+ bError = sal_True;
+ break;
+ }
+ nLastValue = aCols[i];
+ }
+ if(!bError)
+ {
+ pDoc->SetTabCols(*pTable, aCols, aOldCols, pBox, bRow );
+ }
+ }
+}
+/* -----------------30.04.02 08:00-------------------
+ *
+ * --------------------------------------------------*/
+inline rtl::OUString lcl_getString( SwXCell &rCell )
+{
+ // getString is a member function of the base class...
+ return rCell.getString();
+}
+/* -----------------30.04.02 08:00-------------------
+ * non UNO function call to set string in SwXCell
+ * --------------------------------------------------*/
+void lcl_setString( SwXCell &rCell, const rtl::OUString &rTxt,
+ BOOL bKeepNumberFmt )
+{
+ if(rCell.IsValid())
+ {
+ SwFrmFmt* pBoxFmt = rCell.pBox->ClaimFrmFmt();
+ pBoxFmt->LockModify();
+ pBoxFmt->ResetFmtAttr( RES_BOXATR_FORMULA );
+ pBoxFmt->ResetFmtAttr( RES_BOXATR_VALUE );
+ if (!bKeepNumberFmt)
+ pBoxFmt->SetFmtAttr( SwTblBoxNumFormat(NUMBERFORMAT_TEXT) );
+ pBoxFmt->UnlockModify();
+ }
+ rCell.SwXText::setString(rTxt);
+}
+/* -----------------30.04.02 08:00-------------------
+ * non UNO function call to get value from SwXCell
+ * --------------------------------------------------*/
+double lcl_getValue( SwXCell &rCell )
+{
+ double fRet;
+ if(rCell.IsValid() && rCell.getString().getLength()!=0)
+ fRet = rCell.pBox->GetFrmFmt()->GetTblBoxValue().GetValue();
+ else
+ ::rtl::math::setNan( &fRet );
+ return fRet;
+}
+/* -----------------30.04.02 08:00-------------------
+ * non UNO function call to set value in SwXCell
+ * --------------------------------------------------*/
+void lcl_setValue( SwXCell &rCell, double nVal )
+{
+ if(rCell.IsValid())
+ {
+ // Der Text mu? zunaechst (vielleicht) geloescht werden
+ ULONG nNdPos = rCell.pBox->IsValidNumTxtNd( sal_True );
+ if(ULONG_MAX != nNdPos)
+ lcl_setString( rCell, OUString(), TRUE ); // TRUE == keep number format
+ SwDoc* pDoc = rCell.GetDoc();
+ UnoActionContext aAction(pDoc);
+ SwFrmFmt* pBoxFmt = rCell.pBox->ClaimFrmFmt();
+ SfxItemSet aSet(pDoc->GetAttrPool(), RES_BOXATR_FORMAT, RES_BOXATR_VALUE);
+ const SfxPoolItem* pItem;
+
+ //!! do we need to set a new number format? Yes, if
+ // - there is no current number format
+ // - the current number format is not a number format according to the number formatter, but rather a text format
+ // - the current number format is not even a valid number formatter number format, but rather Writer's own 'special' text number format
+ if(SFX_ITEM_SET != pBoxFmt->GetAttrSet().GetItemState(RES_BOXATR_FORMAT, sal_True, &pItem)
+ || pDoc->GetNumberFormatter()->IsTextFormat(((SwTblBoxNumFormat*)pItem)->GetValue())
+ || ((SwTblBoxNumFormat*)pItem)->GetValue() == NUMBERFORMAT_TEXT)
+ {
+ aSet.Put(SwTblBoxNumFormat(0));
+ }
+
+ SwTblBoxValue aVal(nVal);
+ aSet.Put(aVal);
+ pDoc->SetTblBoxFormulaAttrs( *rCell.pBox, aSet );
+ //Tabelle aktualisieren
+ SwTableFmlUpdate aTblUpdate( SwTable::FindTable( rCell.GetFrmFmt() ));
+ pDoc->UpdateTblFlds( &aTblUpdate );
+ }
+}
+/******************************************************************
+ * SwXCell
+ ******************************************************************/
+TYPEINIT1(SwXCell, SwClient);
+/*-- 11.12.98 10:56:23---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXCell::SwXCell(SwFrmFmt* pTblFmt, SwTableBox* pBx, sal_uInt16 nPos ) :
+ SwXText(pTblFmt->GetDoc(), CURSOR_TBLTEXT),
+ SwClient(pTblFmt),
+ m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TABLE_CELL)),
+ pBox(pBx),
+ pStartNode(0),
+ nFndPos(nPos)
+{
+}
+/* -----------------------------09.08.00 15:59--------------------------------
+
+ ---------------------------------------------------------------------------*/
+SwXCell::SwXCell(SwFrmFmt* pTblFmt, const SwStartNode& rStartNode) :
+ SwXText(pTblFmt->GetDoc(), CURSOR_TBLTEXT),
+ SwClient(pTblFmt),
+ m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TABLE_CELL)),
+ pBox(0),
+ pStartNode(&rStartNode),
+ nFndPos(USHRT_MAX)
+{
+}
+
+/*-- 11.12.98 10:56:24---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXCell::~SwXCell()
+{
+
+}
+/* -----------------------------10.03.00 18:02--------------------------------
+
+ ---------------------------------------------------------------------------*/
+const uno::Sequence< sal_Int8 > & SwXCell::getUnoTunnelId()
+{
+ static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
+ return aSeq;
+}
+/* -----------------------------10.03.00 18:04--------------------------------
+
+ ---------------------------------------------------------------------------*/
+sal_Int64 SAL_CALL SwXCell::getSomething( const uno::Sequence< sal_Int8 >& rId )
+ throw(uno::RuntimeException)
+{
+ if( rId.getLength() == 16
+ && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
+ rId.getConstArray(), 16 ) )
+ {
+ return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
+ }
+ else
+ return SwXText::getSomething(rId);
+}
+/* -----------------------------18.05.00 10:18--------------------------------
+
+ ---------------------------------------------------------------------------*/
+uno::Sequence< uno::Type > SAL_CALL SwXCell::getTypes( ) throw(uno::RuntimeException)
+{
+ static uno::Sequence< uno::Type > aRetTypes;
+ if(!aRetTypes.getLength())
+ {
+ aRetTypes = SwXCellBaseClass::getTypes();
+ uno::Sequence< uno::Type > aTextTypes = SwXText::getTypes();
+
+ long nIndex = aRetTypes.getLength();
+ aRetTypes.realloc(
+ aRetTypes.getLength() +
+ aTextTypes.getLength());
+
+ uno::Type* pRetTypes = aRetTypes.getArray();
+
+ const uno::Type* pTextTypes = aTextTypes.getConstArray();
+ for(long nPos = 0; nPos <aTextTypes.getLength(); nPos++)
+ pRetTypes[nIndex++] = pTextTypes[nPos];
+ }
+ return aRetTypes;
+}
+/* -----------------------------18.05.00 10:18--------------------------------
+
+ ---------------------------------------------------------------------------*/
+uno::Sequence< sal_Int8 > SAL_CALL SwXCell::getImplementationId( ) throw(uno::RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ static uno::Sequence< sal_Int8 > aId( 16 );
+ static sal_Bool bInit = sal_False;
+ if(!bInit)
+ {
+ rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
+ bInit = sal_True;
+ }
+ return aId;
+}
+/* -----------------------------18.05.00 10:18--------------------------------
+
+ ---------------------------------------------------------------------------*/
+void SAL_CALL SwXCell::acquire( ) throw()
+{
+ SwXCellBaseClass::acquire();
+}
+/* -----------------------------18.05.00 10:18--------------------------------
+
+ ---------------------------------------------------------------------------*/
+void SAL_CALL SwXCell::release( ) throw()
+{
+ SwXCellBaseClass::release();
+}
+/* -----------------------------18.05.00 10:23--------------------------------
+
+ ---------------------------------------------------------------------------*/
+uno::Any SAL_CALL SwXCell::queryInterface( const uno::Type& aType )
+ throw (uno::RuntimeException)
+{
+ uno::Any aRet = SwXCellBaseClass::queryInterface(aType);
+ if(aRet.getValueType() == ::getCppuVoidType())
+ aRet = SwXText::queryInterface(aType);
+ return aRet;
+}
+/*-- 11.12.98 10:56:24---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+const SwStartNode *SwXCell::GetStartNode() const
+{
+ const SwStartNode *pSttNd = 0;
+
+ if( pStartNode || ((SwXCell *)this)->IsValid() )
+ pSttNd = pStartNode ? pStartNode : pBox->GetSttNd();
+
+ return pSttNd;
+}
+
+uno::Reference< text::XTextCursor >
+SwXCell::CreateCursor() throw (uno::RuntimeException)
+{
+ return createTextCursor();
+}
+/*-- 11.12.98 10:56:24---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+bool SwXCell::IsValid() const
+{
+ // FIXME: this is now a const method, to make SwXText::IsValid invisible
+ // but the const_cast here are still ridiculous. TODO: find a better way.
+ SwFrmFmt* pTblFmt = pBox ? GetFrmFmt() : 0;
+ if(!pTblFmt)
+ {
+ const_cast<SwXCell*>(this)->pBox = 0;
+ }
+ else
+ {
+ SwTable* pTable = SwTable::FindTable( pTblFmt );
+ SwTableBox const*const pFoundBox =
+ const_cast<SwXCell*>(this)->FindBox(pTable, pBox);
+ if (!pFoundBox)
+ {
+ const_cast<SwXCell*>(this)->pBox = 0;
+ }
+ }
+ return 0 != pBox;
+}
+/*-- 11.12.98 10:56:25---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+OUString SwXCell::getFormula(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ OUString sRet;
+ if(IsValid())
+ {
+ SwTblBoxFormula aFormula( pBox->GetFrmFmt()->GetTblBoxFormula() );
+ SwTable* pTable = SwTable::FindTable( GetFrmFmt() );
+ aFormula.PtrToBoxNm( pTable );
+ sRet = aFormula.GetFormula();
+ }
+ return sRet;
+}
+/*-- 11.12.98 10:56:26---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCell::setFormula(const OUString& rFormula) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ if(IsValid())
+ {
+ // Der Text mu? zunaechst (vielleicht) geloescht werden
+ sal_uInt32 nNdPos = pBox->IsValidNumTxtNd( sal_True );
+ if(USHRT_MAX == nNdPos)
+ lcl_setString( *this, OUString(), TRUE );
+ String sFml(rFormula);
+ if( sFml.EraseLeadingChars().Len() && '=' == sFml.GetChar( 0 ) )
+ sFml.Erase( 0, 1 );
+ SwTblBoxFormula aFml( sFml );
+ SwDoc* pMyDoc = GetDoc();
+ UnoActionContext aAction(pMyDoc);
+ SfxItemSet aSet(pMyDoc->GetAttrPool(), RES_BOXATR_FORMAT, RES_BOXATR_FORMULA);
+ const SfxPoolItem* pItem;
+ SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
+ if(SFX_ITEM_SET != pBoxFmt->GetAttrSet().GetItemState(RES_BOXATR_FORMAT, sal_True, &pItem)
+ || pMyDoc->GetNumberFormatter()->IsTextFormat(((SwTblBoxNumFormat*)pItem)->GetValue()))
+ {
+ aSet.Put(SwTblBoxNumFormat(0));
+ }
+ aSet.Put(aFml);
+ GetDoc()->SetTblBoxFormulaAttrs( *pBox, aSet );
+ //Tabelle aktualisieren
+ SwTableFmlUpdate aTblUpdate( SwTable::FindTable( GetFrmFmt() ));
+ pMyDoc->UpdateTblFlds( &aTblUpdate );
+ }
+}
+/*-- 11.12.98 10:56:26---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+double SwXCell::getValue(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+
+ double const fRet = lcl_getValue( *this );
+ // #i112652# a table cell may contain NaN as a value, do not filter that
+ return fRet;
+}
+/*-- 11.12.98 10:56:26---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCell::setValue(double rValue) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ lcl_setValue( *this, rValue );
+}
+/*-- 11.12.98 10:56:26---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+table::CellContentType SwXCell::getType(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+
+ table::CellContentType nRes = table::CellContentType_EMPTY;
+ sal_uInt32 nNdPos = pBox->IsFormulaOrValueBox();
+ switch (nNdPos)
+ {
+ case 0 : nRes = table::CellContentType_TEXT; break;
+ case USHRT_MAX : nRes = table::CellContentType_EMPTY; break;
+ case RES_BOXATR_VALUE : nRes = table::CellContentType_VALUE; break;
+ case RES_BOXATR_FORMULA : nRes = table::CellContentType_FORMULA; break;
+ default :
+ DBG_ERROR( "unexpected case" );
+ }
+ return nRes;
+}
+/* -----------------27.04.99 12:06-------------------
+ *
+ * --------------------------------------------------*/
+void SwXCell::setString(const OUString& aString) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ lcl_setString( *this, aString );
+}
+
+/*-- 11.12.98 10:56:27---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Int32 SwXCell::getError(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ OUString sContent = getString();
+ return sContent.equals(ViewShell::GetShellRes()->aCalc_Error);
+}
+/*-- 11.12.98 10:56:28---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< text::XTextCursor > SwXCell::createTextCursor(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< text::XTextCursor > aRef;
+ if(pStartNode || IsValid())
+ {
+ const SwStartNode* pSttNd = pStartNode ? pStartNode : pBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ SwXTextCursor *const pXCursor =
+ new SwXTextCursor(*GetDoc(), this, CURSOR_TBLTEXT, aPos);
+ SwUnoCrsr *const pUnoCrsr = pXCursor->GetCursor();
+ pUnoCrsr->Move(fnMoveForward, fnGoNode);
+ aRef = static_cast<text::XWordCursor*>(pXCursor);
+// // no Cursor in protected sections
+// SwCrsrSaveState aSave( *pUnoCrsr );
+// if(pUnoCrsr->IsInProtectTable( sal_True ) ||
+// pUnoCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_TOGGLE | nsSwCursorSelOverFlags::SELOVER_CHANGEPOS ))
+// throw( uno::RuntimeException() );
+ }
+ else
+ throw uno::RuntimeException();
+ return aRef;
+}
+/*-- 11.12.98 10:56:28---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< text::XTextCursor > SwXCell::createTextCursorByRange(const uno::Reference< text::XTextRange > & xTextPosition)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< text::XTextCursor > aRef;
+ SwUnoInternalPaM aPam(*GetDoc());
+ if ((pStartNode || IsValid())
+ && ::sw::XTextRangeToSwPaM(aPam, xTextPosition))
+ {
+ const SwStartNode* pSttNd = pStartNode ? pStartNode : pBox->GetSttNd();
+ //skip sections
+ SwStartNode* p1 = aPam.GetNode()->StartOfSectionNode();
+ while(p1->IsSectionNode())
+ p1 = p1->StartOfSectionNode();
+
+ if( p1 == pSttNd )
+ {
+ aRef = static_cast<text::XWordCursor*>(
+ new SwXTextCursor(*GetDoc(), this, CURSOR_TBLTEXT,
+ *aPam.GetPoint(), aPam.GetMark()));
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ return aRef;
+}
+/*-- 11.12.98 10:56:33---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< beans::XPropertySetInfo > SwXCell::getPropertySetInfo(void) throw( uno::RuntimeException )
+{
+ static uno::Reference< beans::XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
+ return xRef;
+}
+/*-- 11.12.98 10:56:34---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCell::setPropertyValue(const OUString& rPropertyName, const uno::Any& aValue)
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ if(IsValid())
+ {
+ const SfxItemPropertySimpleEntry* pEntry =
+ m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ if( !pEntry )
+ {
+ beans::UnknownPropertyException aEx;
+ aEx.Message = rPropertyName;
+ throw( aEx );
+ }
+ if( pEntry->nWID == FN_UNO_CELL_ROW_SPAN )
+ {
+ sal_Int32 nRowSpan = 0;
+ if( aValue >>= nRowSpan )
+ pBox->setRowSpan( nRowSpan );
+ }
+ else
+ {
+ SwFrmFmt* pBoxFmt = pBox->ClaimFrmFmt();
+ SwAttrSet aSet(pBoxFmt->GetAttrSet());
+ m_pPropSet->setPropertyValue(rPropertyName, aValue, aSet);
+ pBoxFmt->GetDoc()->SetAttr(aSet, *pBoxFmt);
+ }
+ }
+}
+/*-- 11.12.98 10:56:34---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Any SwXCell::getPropertyValue(const OUString& rPropertyName)
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Any aRet;
+ if(IsValid())
+ {
+ const SfxItemPropertySimpleEntry* pEntry =
+ m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ if( !pEntry )
+ {
+ beans::UnknownPropertyException aEx;
+ aEx.Message = rPropertyName;
+ throw( aEx );
+ }
+ switch( pEntry->nWID )
+ {
+ case FN_UNO_CELL_ROW_SPAN:
+ aRet <<= pBox->getRowSpan();
+ break;
+ case FN_UNO_TEXT_SECTION:
+ {
+ SwFrmFmt* pTblFmt = GetFrmFmt();
+ SwTable* pTable = SwTable::FindTable( pTblFmt );
+ SwTableNode* pTblNode = pTable->GetTableNode();
+ SwSectionNode* pSectionNode = pTblNode->FindSectionNode();
+ if(pSectionNode)
+ {
+ const SwSection& rSect = pSectionNode->GetSection();
+ uno::Reference< text::XTextSection > xSect =
+ SwXTextSections::GetObject( *rSect.GetFmt() );
+ aRet <<= xSect;
+ }
+ }
+ break;
+ case FN_UNO_CELL_NAME:
+ aRet <<= OUString ( pBox->GetName() );
+ break;
+ case FN_UNO_REDLINE_NODE_START:
+ case FN_UNO_REDLINE_NODE_END:
+ {
+ //redline can only be returned if it's a living object
+ aRet = SwXText::getPropertyValue(rPropertyName);
+ }
+ break;
+ default:
+ {
+ const SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
+ const SwAttrSet& rSet = pBoxFmt->GetAttrSet();
+ m_pPropSet->getPropertyValue(rPropertyName, rSet, aRet);
+ }
+ }
+ }
+ return aRet;
+}
+/*-- 11.12.98 10:56:35---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCell::addPropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 10:56:35---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCell::removePropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 10:56:36---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCell::addVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 10:56:36---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCell::removeVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 10:56:37---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< container::XEnumeration > SwXCell::createEnumeration(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< container::XEnumeration > aRef;
+ if(IsValid())
+ {
+ const SwStartNode* pSttNd = pBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ ::std::auto_ptr<SwUnoCrsr> pUnoCursor(
+ GetDoc()->CreateUnoCrsr(aPos, sal_False));
+ pUnoCursor->Move(fnMoveForward, fnGoNode);
+
+ // remember table and start node for later travelling
+ // (used in export of tables in tables)
+ SwTable const*const pTable( & pSttNd->FindTableNode()->GetTable() );
+ SwXParagraphEnumeration *const pEnum =
+ new SwXParagraphEnumeration(this, pUnoCursor, CURSOR_TBLTEXT,
+ pSttNd, pTable);
+
+ aRef = pEnum;
+// // no Cursor in protected sections
+// SwCrsrSaveState aSave( *pUnoCrsr );
+// if(pUnoCrsr->IsInProtectTable( sal_True ) ||
+// pUnoCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_TOGGLE | nsSwCursorSelOverFlags::SELOVER_CHANGEPOS ))
+// throw( uno::RuntimeException() );
+ }
+ return aRef;
+}
+/*-- 11.12.98 10:56:38---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Type SAL_CALL SwXCell::getElementType(void) throw( uno::RuntimeException )
+{
+ return ::getCppuType((const uno::Reference<text::XTextRange>*)0);
+
+}
+/*-- 11.12.98 10:56:38---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwXCell::hasElements(void) throw( uno::RuntimeException )
+{
+ return sal_True;
+}
+/*-- 11.12.98 10:56:37---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCell::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+}
+/* -----------------12.06.98 07:54-------------------
+ *
+ * --------------------------------------------------*/
+SwXCell* SwXCell::CreateXCell(SwFrmFmt* pTblFmt, SwTableBox* pBox, SwTable *pTable )
+{
+ SwXCell* pRet = 0;
+ if(pTblFmt && pBox)
+ {
+ if( !pTable )
+ pTable = SwTable::FindTable( pTblFmt );
+ sal_uInt16 nPos = USHRT_MAX;
+ SwTableBox* pFoundBox =
+ pTable->GetTabSortBoxes().Seek_Entry( pBox, &nPos ) ? pBox : NULL;
+
+ //wenn es die Box gibt, dann wird auch eine Zelle zurueckgegeben
+ if(pFoundBox)
+ {
+ SwClientIter aIter( *pTblFmt );
+ SwXCell* pXCell = (SwXCell*)aIter.
+ First( TYPE( SwXCell ));
+ while( pXCell )
+ {
+ // gibt es eine passende Zelle bereits?
+ if(pXCell->GetTblBox() == pBox)
+ break;
+ pXCell = (SwXCell*)aIter.Next();
+ }
+ //sonst anlegen
+ if(!pXCell)
+ pXCell = new SwXCell(pTblFmt, pBox, nPos );
+ pRet = pXCell;
+ }
+ }
+ return pRet;
+}
+/* -----------------12.06.98 07:37-------------------
+ * exitstiert die Box in der angegebenen Tabelle?
+ * --------------------------------------------------*/
+SwTableBox* SwXCell::FindBox(SwTable* pTable, SwTableBox* pBox2)
+{
+ // check if nFndPos happens to point to the right table box
+ if( nFndPos < pTable->GetTabSortBoxes().Count() &&
+ pBox2 == pTable->GetTabSortBoxes()[ nFndPos ] )
+ return pBox2;
+
+ // if not, seek the entry (and return, if successful)
+ if( pTable->GetTabSortBoxes().Seek_Entry( pBox2, &nFndPos ))
+ return pBox2;
+
+ // box not found: reset nFndPos pointer
+ nFndPos = USHRT_MAX;
+ return 0;
+}
+/* -----------------------------19.04.00 15:20--------------------------------
+
+ ---------------------------------------------------------------------------*/
+OUString SwXCell::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXCell");
+}
+/* -----------------------------19.04.00 15:20--------------------------------
+
+ ---------------------------------------------------------------------------*/
+BOOL SwXCell::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ String sServiceName(rServiceName);
+ return sServiceName.EqualsAscii("com.sun.star.text.CellProperties");
+}
+/* -----------------------------19.04.00 15:20--------------------------------
+
+ ---------------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXCell::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(1);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.text.CellProperties");
+ return aRet;
+}
+
+/******************************************************************
+ * SwXTextTableRow
+ ******************************************************************/
+/* -----------------------------19.04.00 15:20--------------------------------
+
+ ---------------------------------------------------------------------------*/
+OUString SwXTextTableRow::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXTextTableRow");
+}
+/* -----------------------------19.04.00 15:20--------------------------------
+
+ ---------------------------------------------------------------------------*/
+BOOL SwXTextTableRow::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ return C2U("com.sun.star.text.TextTableRow") == rServiceName;
+}
+/* -----------------------------19.04.00 15:20--------------------------------
+
+ ---------------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXTextTableRow::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(1);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.text.TextTableRow");
+ return aRet;
+}
+TYPEINIT1(SwXTextTableRow, SwClient);
+/*-- 11.12.98 12:04:44---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXTextTableRow::SwXTextTableRow(SwFrmFmt* pFmt, SwTableLine* pLn) :
+ SwClient(pFmt),
+ m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE_ROW)),
+ pLine(pLn)
+{
+
+}
+/*-- 11.12.98 12:04:45---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXTextTableRow::~SwXTextTableRow()
+{
+
+}
+/*-- 11.12.98 12:04:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< beans::XPropertySetInfo > SwXTextTableRow::getPropertySetInfo(void) throw( uno::RuntimeException )
+{
+ static uno::Reference< beans::XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
+ return xRef;
+}
+/*-- 11.12.98 12:04:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableRow::setPropertyValue(const OUString& rPropertyName,
+ const uno::Any& aValue)
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ SwTableLine* pLn = SwXTextTableRow::FindLine(pTable, pLine);
+ if(pLn)
+ {
+ const SfxItemPropertySimpleEntry* pEntry =
+ m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ SwDoc* pDoc = pFmt->GetDoc();
+ if (!pEntry)
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
+ throw beans::PropertyVetoException( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+
+ switch(pEntry->nWID)
+ {
+ case FN_UNO_ROW_HEIGHT:
+ case FN_UNO_ROW_AUTO_HEIGHT:
+ {
+ SwFmtFrmSize aFrmSize(pLn->GetFrmFmt()->GetFrmSize());
+ if(FN_UNO_ROW_AUTO_HEIGHT== pEntry->nWID)
+ {
+ sal_Bool bSet = *(sal_Bool*)aValue.getValue();
+ aFrmSize.SetHeightSizeType(bSet ? ATT_VAR_SIZE : ATT_FIX_SIZE);
+ }
+ else
+ {
+ sal_Int32 nHeight = 0;
+ aValue >>= nHeight;
+ Size aSz(aFrmSize.GetSize());
+ aSz.Height() = MM100_TO_TWIP(nHeight);
+ aFrmSize.SetSize(aSz);
+ }
+ pDoc->SetAttr(aFrmSize, *pLn->ClaimFrmFmt());
+ }
+ break;
+ case FN_UNO_TABLE_COLUMN_SEPARATORS:
+ {
+ UnoActionContext aContext(pDoc);
+ SwTable* pTable2 = SwTable::FindTable( pFmt );
+ lcl_SetTblSeparators(aValue, pTable2, pLine->GetTabBoxes()[0], sal_True, pDoc);
+ }
+ break;
+ default:
+ {
+ SwFrmFmt* pLnFmt = pLn->ClaimFrmFmt();
+ SwAttrSet aSet(pLnFmt->GetAttrSet());
+ m_pPropSet->setPropertyValue(*pEntry, aValue, aSet);
+ pDoc->SetAttr(aSet, *pLnFmt);
+ }
+ }
+ }
+ }
+}
+/*-- 11.12.98 12:04:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Any SwXTextTableRow::getPropertyValue(const OUString& rPropertyName) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Any aRet;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ SwTableLine* pLn = SwXTextTableRow::FindLine(pTable, pLine);
+ if(pLn)
+ {
+ const SfxItemPropertySimpleEntry* pEntry =
+ m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ if (!pEntry)
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+
+ switch(pEntry->nWID)
+ {
+ case FN_UNO_ROW_HEIGHT:
+ case FN_UNO_ROW_AUTO_HEIGHT:
+ {
+ const SwFmtFrmSize& rSize = pLn->GetFrmFmt()->GetFrmSize();
+ if(FN_UNO_ROW_AUTO_HEIGHT== pEntry->nWID)
+ {
+ BOOL bTmp = ATT_VAR_SIZE == rSize.GetHeightSizeType();
+ aRet.setValue(&bTmp, ::getCppuBooleanType());
+ }
+ else
+ aRet <<= (sal_Int32)(TWIP_TO_MM100(rSize.GetSize().Height()));
+ }
+ break;
+ case FN_UNO_TABLE_COLUMN_SEPARATORS:
+ {
+ lcl_GetTblSeparators(aRet, pTable, pLine->GetTabBoxes()[0], sal_True);
+ }
+ break;
+ default:
+ {
+ const SwAttrSet& rSet = pLn->GetFrmFmt()->GetAttrSet();
+ m_pPropSet->getPropertyValue(*pEntry, rSet, aRet);
+ }
+ }
+ }
+ }
+ return aRet;
+}
+/*-- 11.12.98 12:04:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableRow::addPropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:04:48---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableRow::removePropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:04:48---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableRow::addVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:04:49---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableRow::removeVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:04:49---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableRow::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+}
+/*-- 11.12.98 12:04:50---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwTableLine* SwXTextTableRow::FindLine(SwTable* pTable, SwTableLine* pLine)
+{
+ SwTableLine* pRet = 0;
+ SwTableLines &rLines = pTable->GetTabLines();
+ for(sal_uInt16 i = 0; i < rLines.Count(); i++)
+ if(rLines.GetObject(i) == pLine)
+ {
+ pRet = pLine;
+ break;
+ }
+ return pRet;
+}
+
+/******************************************************************
+ * SwXTextTableCursor
+ ******************************************************************/
+/* -----------------------------19.04.00 15:21--------------------------------
+
+ ---------------------------------------------------------------------------*/
+OUString SwXTextTableCursor::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXTextTableCursor");
+}
+/* -----------------------------19.04.00 15:21--------------------------------
+
+ ---------------------------------------------------------------------------*/
+BOOL SwXTextTableCursor::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ return C2U("com.sun.star.text.TextTableCursor") == rServiceName;
+}
+// -----------------------------------------------------------------------------
+IMPLEMENT_FORWARD_XINTERFACE2(SwXTextTableCursor,SwXTextTableCursor_Base,OTextCursorHelper)
+const SwPaM* SwXTextTableCursor::GetPaM() const { return GetCrsr(); }
+SwPaM* SwXTextTableCursor::GetPaM() { return GetCrsr(); }
+const SwDoc* SwXTextTableCursor::GetDoc() const { return GetFrmFmt()->GetDoc(); }
+SwDoc* SwXTextTableCursor::GetDoc() { return GetFrmFmt()->GetDoc(); }
+const SwUnoCrsr* SwXTextTableCursor::GetCrsr() const { return (SwUnoCrsr*)aCrsrDepend.GetRegisteredIn(); }
+SwUnoCrsr* SwXTextTableCursor::GetCrsr() { return (SwUnoCrsr*)aCrsrDepend.GetRegisteredIn(); }
+/* -----------------------------19.04.00 15:21--------------------------------
+
+ ---------------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXTextTableCursor::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(1);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.text.TextTableCursor");
+ return aRet;
+}
+
+/*-- 11.12.98 12:16:13---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXTextTableCursor::SwXTextTableCursor(SwFrmFmt* pFmt, SwTableBox* pBox) :
+ SwClient(pFmt),
+ aCrsrDepend(this, 0),
+ m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE_CURSOR))
+{
+ SwDoc* pDoc = pFmt->GetDoc();
+ const SwStartNode* pSttNd = pBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(aPos, sal_True);
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ pUnoCrsr->Add(&aCrsrDepend);
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pTblCrsr->MakeBoxSels();
+}
+/*-- 11.12.98 12:16:14---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXTextTableCursor::SwXTextTableCursor(SwFrmFmt& rTableFmt, const SwTableCursor* pTableSelection) :
+ SwClient(&rTableFmt),
+ aCrsrDepend(this, 0),
+ m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE_CURSOR))
+{
+ SwUnoCrsr* pUnoCrsr = pTableSelection->GetDoc()->CreateUnoCrsr(*pTableSelection->GetPoint(), sal_True);
+ if(pTableSelection->HasMark())
+ {
+ pUnoCrsr->SetMark();
+ *pUnoCrsr->GetMark() = *pTableSelection->GetMark();
+ }
+ const SwSelBoxes& rBoxes = pTableSelection->GetBoxes();
+ SwTableCursor* pTableCrsr = dynamic_cast<SwTableCursor*>(pUnoCrsr);
+ for(sal_uInt16 i = 0; i < rBoxes.Count(); i++)
+ pTableCrsr->InsertBox( *rBoxes.GetObject(i) );
+
+ pUnoCrsr->Add(&aCrsrDepend);
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pTblCrsr->MakeBoxSels();
+}
+/*-- 11.12.98 12:16:14---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXTextTableCursor::~SwXTextTableCursor()
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ delete pUnoCrsr;
+}
+/*-- 11.12.98 12:16:15---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+OUString SwXTextTableCursor::getRangeName(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ OUString aRet;
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+
+ //!! see also SwChartDataSequence::getSourceRangeRepresentation
+ if(pUnoCrsr)
+ {
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pTblCrsr->MakeBoxSels();
+ const SwStartNode* pNode = pTblCrsr->GetPoint()->nNode.GetNode().FindTableBoxStartNode();
+ const SwTable* pTable = SwTable::FindTable( GetFrmFmt() );
+ const SwTableBox* pEndBox = pTable->GetTblBox( pNode->GetIndex());
+ String aTmp( pEndBox->GetName() );
+
+ if(pTblCrsr->HasMark())
+ {
+ pNode = pTblCrsr->GetMark()->nNode.GetNode().FindTableBoxStartNode();
+ const SwTableBox* pStartBox = pTable->GetTblBox( pNode->GetIndex());
+ if(pEndBox != pStartBox)
+ {
+ // need to switch start and end?
+ if (*pTblCrsr->GetPoint() < *pTblCrsr->GetMark())
+ {
+ const SwTableBox* pTmpBox = pStartBox;
+ pStartBox = pEndBox;
+ pEndBox = pTmpBox;
+ }
+
+ aTmp = pStartBox->GetName();
+ aTmp += ':';
+ aTmp += pEndBox->GetName();
+ }
+ }
+ aRet = aTmp;
+ }
+ return aRet;
+}
+/*-- 11.12.98 12:16:15---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwXTextTableCursor::gotoCellByName(const OUString& CellName, sal_Bool Expand)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Bool bRet = sal_False;
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ lcl_CrsrSelect( pTblCrsr, Expand );
+ String sCellName(CellName);
+ bRet = pTblCrsr->GotoTblBox(sCellName);
+ }
+ return bRet;
+}
+/*-- 11.12.98 12:16:15---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwXTextTableCursor::goLeft(sal_Int16 Count, sal_Bool Expand) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Bool bRet = sal_False;
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ lcl_CrsrSelect( pTblCrsr, Expand );
+ bRet = pTblCrsr->Left( Count,CRSR_SKIP_CHARS, FALSE, FALSE);
+ }
+ return bRet;
+}
+/*-- 11.12.98 12:16:15---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwXTextTableCursor::goRight(sal_Int16 Count, sal_Bool Expand) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Bool bRet = sal_False;
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ lcl_CrsrSelect( pTblCrsr, Expand );
+ bRet = pTblCrsr->Right( Count, CRSR_SKIP_CHARS, FALSE, FALSE);
+ }
+ return bRet;
+}
+/*-- 11.12.98 12:16:16---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwXTextTableCursor::goUp(sal_Int16 Count, sal_Bool Expand) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Bool bRet = sal_False;
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ lcl_CrsrSelect( pTblCrsr, Expand );
+ bRet = pTblCrsr->UpDown(sal_True, Count, 0, 0);
+ }
+ return bRet;
+}
+/*-- 11.12.98 12:16:16---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwXTextTableCursor::goDown(sal_Int16 Count, sal_Bool Expand) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Bool bRet = sal_False;
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ lcl_CrsrSelect( pTblCrsr, Expand );
+ bRet = pTblCrsr->UpDown(sal_False, Count, 0, 0);
+ }
+ return bRet;
+}
+/*-- 11.12.98 12:16:16---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableCursor::gotoStart(sal_Bool Expand) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ lcl_CrsrSelect( pTblCrsr, Expand );
+ pTblCrsr->MoveTable(fnTableCurr, fnTableStart);
+ }
+}
+/*-- 11.12.98 12:16:16---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableCursor::gotoEnd(sal_Bool Expand) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ lcl_CrsrSelect( pTblCrsr, Expand );
+ pTblCrsr->MoveTable(fnTableCurr, fnTableEnd);
+ }
+}
+/*-- 11.12.98 12:16:16---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwXTextTableCursor::mergeRange(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Bool bRet = sal_False;
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ {
+ // hier muessen die Actions aufgehoben werden
+ UnoActionRemoveContext aRemoveContext(pUnoCrsr->GetDoc());
+ }
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pTblCrsr->MakeBoxSels();
+
+ {
+ UnoActionContext aContext(pUnoCrsr->GetDoc());
+ bRet = TBLMERGE_OK == pTblCrsr->GetDoc()->MergeTbl(*pTblCrsr);
+ if(bRet)
+ {
+ USHORT nCount = pTblCrsr->GetBoxesCount();
+ while(nCount--)
+ pTblCrsr->DeleteBox(nCount);
+ }
+ }
+ pTblCrsr->MakeBoxSels();
+ }
+ return bRet;
+}
+/*-- 11.12.98 12:16:16---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwXTextTableCursor::splitRange(sal_Int16 Count, sal_Bool Horizontal) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ if (Count <= 0)
+ throw uno::RuntimeException( OUString( RTL_CONSTASCII_USTRINGPARAM( "Illegal first argument: needs to be > 0" ) ), static_cast < cppu::OWeakObject * > ( this ) );
+ sal_Bool bRet = sal_False;
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ {
+ // hier muessen die Actions aufgehoben werden
+ UnoActionRemoveContext aRemoveContext(pUnoCrsr->GetDoc());
+ }
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pTblCrsr->MakeBoxSels();
+ {
+ UnoActionContext aContext(pUnoCrsr->GetDoc());
+ bRet = pTblCrsr->GetDoc()->SplitTbl( pTblCrsr->GetBoxes(), !Horizontal, Count );
+ }
+ pTblCrsr->MakeBoxSels();
+ }
+ return bRet;
+}
+/*-- 11.12.98 12:16:17---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< beans::XPropertySetInfo > SwXTextTableCursor::getPropertySetInfo(void) throw( uno::RuntimeException )
+{
+ static uno::Reference< beans::XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
+ return xRef;
+}
+/*-- 11.12.98 12:16:17---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableCursor::setPropertyValue(const OUString& rPropertyName,
+ const uno::Any& aValue)
+ throw( beans::UnknownPropertyException,
+ beans::PropertyVetoException,
+ lang::IllegalArgumentException,
+ lang::WrappedTargetException,
+ uno::RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ SwStartNode* pSttNode = pUnoCrsr->GetNode()->StartOfSectionNode();
+ const SwTableNode* pTblNode = pSttNode->FindTableNode();
+ lcl_FormatTable((SwFrmFmt*)pTblNode->GetTable().GetFrmFmt());
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ const SfxItemPropertySimpleEntry* pEntry =
+ m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ if(pEntry)
+ {
+ if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
+ throw beans::PropertyVetoException( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ pTblCrsr->MakeBoxSels();
+ SwDoc* pDoc = pUnoCrsr->GetDoc();
+ switch(pEntry->nWID )
+ {
+ case FN_UNO_TABLE_CELL_BACKGROUND:
+ {
+ SvxBrushItem aBrush( RES_BACKGROUND );
+ pDoc->GetBoxAttr( *pUnoCrsr, aBrush );
+ aBrush.PutValue(aValue, pEntry->nMemberId);
+ pDoc->SetBoxAttr( *pUnoCrsr, aBrush );
+
+ }
+ break;
+ case RES_BOXATR_FORMAT:
+ {
+ SfxUInt32Item aNumberFormat(RES_BOXATR_FORMAT);
+ aNumberFormat.PutValue(aValue, 0);
+ pDoc->SetBoxAttr( *pUnoCrsr, aNumberFormat);
+ }
+ break;
+ case FN_UNO_PARA_STYLE:
+ SwUnoCursorHelper::SetTxtFmtColl(aValue, *pUnoCrsr);
+ break;
+ default:
+ {
+ SfxItemSet aItemSet( pDoc->GetAttrPool(), pEntry->nWID, pEntry->nWID );
+ SwUnoCursorHelper::GetCrsrAttr(pTblCrsr->GetSelRing(),
+ aItemSet);
+
+ if (!SwUnoCursorHelper::SetCursorPropertyValue(
+ *pEntry, aValue, pTblCrsr->GetSelRing(), aItemSet))
+ {
+ m_pPropSet->setPropertyValue(*pEntry, aValue, aItemSet);
+ }
+ SwUnoCursorHelper::SetCrsrAttr(pTblCrsr->GetSelRing(),
+ aItemSet, nsSetAttrMode::SETATTR_DEFAULT, true);
+ }
+ }
+ }
+ else
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ }
+}
+/*-- 11.12.98 12:16:17---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Any SwXTextTableCursor::getPropertyValue(const OUString& rPropertyName)
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Any aRet;
+ SwUnoCrsr* pUnoCrsr = GetCrsr();
+ if(pUnoCrsr)
+ {
+ SwStartNode* pSttNode = pUnoCrsr->GetNode()->StartOfSectionNode();
+ const SwTableNode* pTblNode = pSttNode->FindTableNode();
+ lcl_FormatTable((SwFrmFmt*)pTblNode->GetTable().GetFrmFmt());
+ SwUnoTableCrsr* pTblCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ const SfxItemPropertySimpleEntry* pEntry =
+ m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ if(pEntry)
+ {
+ pTblCrsr->MakeBoxSels();
+ switch(pEntry->nWID )
+ {
+ case FN_UNO_TABLE_CELL_BACKGROUND:
+ {
+ SvxBrushItem aBrush( RES_BACKGROUND );
+ if(pTblCrsr->GetDoc()->GetBoxAttr( *pUnoCrsr, aBrush ))
+ aBrush.QueryValue(aRet, pEntry->nMemberId);
+
+ }
+ break;
+ case RES_BOXATR_FORMAT:
+ //GetAttr fuer Tabellenselektion am Doc fehlt noch
+ DBG_WARNING("not implemented");
+ break;
+ case FN_UNO_PARA_STYLE:
+ {
+ SwFmtColl *const pFmt =
+ SwUnoCursorHelper::GetCurTxtFmtColl(*pUnoCrsr, FALSE);
+ OUString sRet;
+ if(pFmt)
+ sRet = pFmt->GetName();
+ aRet <<= sRet;
+ }
+ break;
+ default:
+ {
+ SfxItemSet aSet(pTblCrsr->GetDoc()->GetAttrPool(),
+ RES_CHRATR_BEGIN, RES_FRMATR_END -1,
+ RES_UNKNOWNATR_CONTAINER, RES_UNKNOWNATR_CONTAINER,
+ 0L);
+ // erstmal die Attribute des Cursors
+ SwUnoCursorHelper::GetCrsrAttr(pTblCrsr->GetSelRing(),
+ aSet);
+ m_pPropSet->getPropertyValue(*pEntry, aSet, aRet);
+ }
+ }
+ }
+ else
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ }
+ return aRet;
+}
+/*-- 11.12.98 12:16:18---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableCursor::addPropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:16:18---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableCursor::removePropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:16:18---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableCursor::addVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:16:19---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableCursor::removeVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:16:19---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTableCursor::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+}
+/******************************************************************
+ * SwXTextTable
+ ******************************************************************/
+/****************************************************************************
+ Tabellenbeschreibung
+****************************************************************************/
+
+class SwTableProperties_Impl
+{
+ SwUnoCursorHelper::SwAnyMapHelper aAnyMap;
+public:
+ SwTableProperties_Impl();
+ ~SwTableProperties_Impl();
+
+ void SetProperty(USHORT nWhichId, USHORT nMemberId, const uno::Any& aVal);
+ sal_Bool GetProperty(USHORT nWhichId, USHORT nMemberId, const uno::Any*& rpAny);
+
+ void ApplyTblAttr(const SwTable& rTbl, SwDoc& rDoc);
+};
+
+/* -----------------22.06.98 09:43-------------------
+ *
+ * --------------------------------------------------*/
+SwTableProperties_Impl::SwTableProperties_Impl()
+{
+}
+/* -----------------22.06.98 09:51-------------------
+ *
+ * --------------------------------------------------*/
+SwTableProperties_Impl::~SwTableProperties_Impl()
+{
+}
+/* -----------------22.06.98 09:51-------------------
+ *
+ * --------------------------------------------------*/
+void SwTableProperties_Impl::SetProperty(USHORT nWhichId, USHORT nMemberId, const uno::Any& rVal)
+{
+ aAnyMap.SetValue( nWhichId, nMemberId, rVal );
+}
+/* -----------------22.06.98 09:51-------------------
+ *
+ * --------------------------------------------------*/
+
+sal_Bool SwTableProperties_Impl::GetProperty(USHORT nWhichId, USHORT nMemberId, const uno::Any*& rpAny )
+{
+ return aAnyMap.FillValue( nWhichId, nMemberId, rpAny );
+}
+/* -----------------13.01.99 15:42-------------------
+ *
+ * --------------------------------------------------*/
+void SwTableProperties_Impl::ApplyTblAttr(const SwTable& rTbl, SwDoc& rDoc)
+{
+ SfxItemSet aSet(rDoc.GetAttrPool(),
+ RES_LAYOUT_SPLIT, RES_LAYOUT_SPLIT,
+ RES_BACKGROUND, RES_BACKGROUND,
+ RES_FRM_SIZE, RES_UL_SPACE,
+ RES_HORI_ORIENT, RES_HORI_ORIENT,
+ RES_BREAK, RES_BREAK,
+ RES_KEEP, RES_KEEP,
+ RES_SHADOW, RES_SHADOW,
+ RES_PAGEDESC, RES_PAGEDESC,
+ 0
+ );
+ const uno::Any* pRepHead;
+ const SwFrmFmt &rFrmFmt = *rTbl.GetFrmFmt();
+ if(GetProperty(FN_TABLE_HEADLINE_REPEAT, 0xff, pRepHead ))
+ {
+ sal_Bool bVal = *(sal_Bool*)pRepHead->getValue();
+ ((SwTable&)rTbl).SetRowsToRepeat( bVal ? 1 : 0 ); // TODO MULTIHEADER
+ }
+
+ const uno::Any* pBackColor = 0;
+ GetProperty(RES_BACKGROUND, MID_BACK_COLOR, pBackColor );
+ const uno::Any* pBackTrans = 0;
+ GetProperty(RES_BACKGROUND, MID_GRAPHIC_TRANSPARENT, pBackTrans );
+ const uno::Any* pGrLoc = 0;
+ GetProperty(RES_BACKGROUND, MID_GRAPHIC_POSITION, pGrLoc );
+ const uno::Any* pGrURL = 0;
+ GetProperty(RES_BACKGROUND, MID_GRAPHIC_URL, pGrURL );
+ const uno::Any* pGrFilter = 0;
+ GetProperty(RES_BACKGROUND, MID_GRAPHIC_FILTER, pGrFilter );
+
+ if(pBackColor||pBackTrans||pGrURL||pGrFilter||pGrLoc)
+ {
+ SvxBrushItem aBrush ( rFrmFmt.GetBackground() );
+ if(pBackColor)
+ aBrush.PutValue(*pBackColor, MID_BACK_COLOR);
+ if(pBackTrans)
+ aBrush.PutValue(*pBackTrans, MID_GRAPHIC_TRANSPARENT);
+ if(pGrURL)
+ aBrush.PutValue(*pGrURL, MID_GRAPHIC_URL);
+ if(pGrFilter)
+ aBrush.PutValue(*pGrFilter, MID_GRAPHIC_FILTER);
+ if(pGrLoc)
+ aBrush.PutValue(*pGrLoc, MID_GRAPHIC_POSITION);
+ aSet.Put(aBrush);
+ }
+
+ sal_Bool bPutBreak = sal_True;
+ const uno::Any* pPage;
+ if(GetProperty(FN_UNO_PAGE_STYLE, 0, pPage) || GetProperty(RES_PAGEDESC, 0xff, pPage))
+ {
+ OUString uTmp;
+ (*pPage) >>= uTmp;
+ String sPageStyle = uTmp;
+ if(sPageStyle.Len())
+ {
+ SwStyleNameMapper::FillUIName(sPageStyle, sPageStyle, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, sal_True );
+ const SwPageDesc* pDesc = ::GetPageDescByName_Impl(rDoc, sPageStyle);
+ if(pDesc)
+ {
+ SwFmtPageDesc aDesc( pDesc );
+ const uno::Any* pPgNo;
+ if(GetProperty(RES_PAGEDESC, MID_PAGEDESC_PAGENUMOFFSET, pPgNo ))
+ {
+ INT16 nTmp = 0;
+ (*pPgNo) >>= nTmp;
+ aDesc.SetNumOffset( nTmp );
+ }
+ aSet.Put(aDesc);
+ bPutBreak = sal_False;
+ }
+
+ }
+ }
+ const uno::Any* pBreak;
+ if(bPutBreak && GetProperty(RES_BREAK, 0, pBreak))
+ {
+ SvxFmtBreakItem aBreak ( rFrmFmt.GetBreak() );
+ aBreak.PutValue(*pBreak, 0);
+ aSet.Put(aBreak);
+ }
+ const uno::Any* pShadow;
+ if(GetProperty(RES_SHADOW, 0, pShadow))
+ {
+ SvxShadowItem aShd ( rFrmFmt.GetShadow() );
+ aShd.PutValue(*pShadow, CONVERT_TWIPS);
+ aSet.Put(aShd);
+ }
+ const uno::Any* pKeep;
+ if(GetProperty(RES_KEEP, 0, pKeep))
+ {
+ SvxFmtKeepItem aKeep( rFrmFmt.GetKeep() );
+ aKeep.PutValue(*pKeep, 0);
+ aSet.Put(aKeep);
+ }
+
+ sal_Bool bFullAlign = sal_True;
+ const uno::Any* pHOrient;
+ if(GetProperty(RES_HORI_ORIENT, MID_HORIORIENT_ORIENT, pHOrient))
+ {
+ SwFmtHoriOrient aOrient ( rFrmFmt.GetHoriOrient() );
+ ((SfxPoolItem&)aOrient).PutValue(*pHOrient, MID_HORIORIENT_ORIENT|CONVERT_TWIPS);
+ bFullAlign = (aOrient.GetHoriOrient() == text::HoriOrientation::FULL);
+ aSet.Put(aOrient);
+ }
+
+
+ const uno::Any* pSzRel = 0;
+ GetProperty(FN_TABLE_IS_RELATIVE_WIDTH, 0xff, pSzRel );
+ const uno::Any* pRelWidth = 0;
+ GetProperty(FN_TABLE_RELATIVE_WIDTH, 0xff, pRelWidth);
+ const uno::Any* pWidth = 0;
+ GetProperty(FN_TABLE_WIDTH, 0xff, pWidth );
+
+ sal_Bool bPutSize = pWidth != 0;
+ SwFmtFrmSize aSz( ATT_VAR_SIZE);
+ if(pWidth)
+ {
+ ((SfxPoolItem&)aSz).PutValue(*pWidth, MID_FRMSIZE_WIDTH);
+ bPutSize = sal_True;
+ }
+ sal_Bool bTemp = pSzRel ? *(sal_Bool*)pSzRel->getValue() : FALSE;
+ if(pSzRel && bTemp && pRelWidth)
+ {
+ ((SfxPoolItem&)aSz).PutValue(*pRelWidth, MID_FRMSIZE_REL_WIDTH|CONVERT_TWIPS);
+ bPutSize = sal_True;
+ }
+ if(bPutSize)
+ {
+ if(!aSz.GetWidth())
+ aSz.SetWidth(MINLAY);
+ aSet.Put(aSz);
+ }
+ const uno::Any* pL = 0;
+ GetProperty(RES_LR_SPACE, MID_L_MARGIN|CONVERT_TWIPS, pL);
+ const uno::Any* pR = 0;
+ GetProperty(RES_LR_SPACE, MID_R_MARGIN|CONVERT_TWIPS, pR);
+ if(pL||pR)
+ {
+ SvxLRSpaceItem aLR ( rFrmFmt.GetLRSpace() );
+ if(pL)
+ ((SfxPoolItem&)aLR).PutValue(*pL, MID_L_MARGIN|CONVERT_TWIPS);
+ if(pR)
+ ((SfxPoolItem&)aLR).PutValue(*pR, MID_R_MARGIN|CONVERT_TWIPS);
+ aSet.Put(aLR);
+ }
+ const uno::Any* pU = 0;
+ GetProperty(RES_UL_SPACE, MID_UP_MARGIN|CONVERT_TWIPS, pU);
+ const uno::Any* pLo = 0;
+ GetProperty(RES_UL_SPACE, MID_LO_MARGIN|CONVERT_TWIPS, pLo);
+ if(pU||pLo)
+ {
+ SvxULSpaceItem aUL ( rFrmFmt.GetULSpace() );
+ if(pU)
+ ((SfxPoolItem&)aUL).PutValue(*pU, MID_UP_MARGIN|CONVERT_TWIPS);
+ if(pLo)
+ ((SfxPoolItem&)aUL).PutValue(*pLo, MID_LO_MARGIN|CONVERT_TWIPS);
+ aSet.Put(aUL);
+ }
+ const::uno::Any* pSplit;
+ if(GetProperty(RES_LAYOUT_SPLIT, 0, pSplit ))
+ {
+ sal_Bool bTmp = *(sal_Bool*)pSplit->getValue();
+ SwFmtLayoutSplit aSp(bTmp);
+ aSet.Put(aSp);
+ }
+
+ //TODO: folgende Propertiers noch impl.
+// FN_UNO_RANGE_ROW_LABEL
+// FN_UNO_RANGE_COL_LABEL
+// FN_UNO_TABLE_BORDER
+
+ if(aSet.Count())
+ {
+ rDoc.SetAttr( aSet, *rTbl.GetFrmFmt() );
+ }
+}
+/* -----------------------------10.03.00 18:02--------------------------------
+
+ ---------------------------------------------------------------------------*/
+const uno::Sequence< sal_Int8 > & SwXTextTable::getUnoTunnelId()
+{
+ static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
+ return aSeq;
+}
+/* -----------------------------10.03.00 18:04--------------------------------
+
+ ---------------------------------------------------------------------------*/
+sal_Int64 SAL_CALL SwXTextTable::getSomething( const uno::Sequence< sal_Int8 >& rId )
+ throw(uno::RuntimeException)
+{
+ if( rId.getLength() == 16
+ && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
+ rId.getConstArray(), 16 ) )
+ {
+ return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
+ }
+ return 0;
+}
+/*-- 11.12.98 12:42:43---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+TYPEINIT1(SwXTextTable, SwClient)
+
+/*-- 11.12.98 12:42:43---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXTextTable::SwXTextTable() :
+ aLstnrCntnr( (text::XTextTable*)this),
+ aChartLstnrCntnr( (text::XTextTable*)this),
+ m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE)),
+ pTableProps(new SwTableProperties_Impl),
+ bIsDescriptor(sal_True),
+ nRows(2),
+ nColumns(2),
+ bFirstRowAsLabel(sal_False),
+ bFirstColumnAsLabel(sal_False)
+{
+
+}
+/*-- 11.12.98 12:42:44---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXTextTable::SwXTextTable(SwFrmFmt& rFrmFmt) :
+ SwClient( &rFrmFmt ),
+ aLstnrCntnr( (text::XTextTable*)this),
+ aChartLstnrCntnr( (text::XTextTable*)this),
+ m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_TABLE)),
+ pTableProps(0),
+ bIsDescriptor(sal_False),
+ nRows(0),
+ nColumns(0),
+ bFirstRowAsLabel(sal_False),
+ bFirstColumnAsLabel(sal_False)
+{
+
+}
+/*-- 11.12.98 12:42:44---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXTextTable::~SwXTextTable()
+{
+ delete pTableProps;
+}
+/*-- 11.12.98 12:42:44---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::initialize(sal_Int32 nR, sal_Int32 nC) throw( uno::RuntimeException )
+{
+ if(!bIsDescriptor || nR <= 0 || nC <= 0 || nR >= USHRT_MAX || nC >= USHRT_MAX )
+ throw uno::RuntimeException();
+ else
+ {
+ nRows = (sal_uInt16)nR;
+ nColumns = (sal_uInt16)nC;
+ }
+}
+/*-- 11.12.98 12:42:45---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< table::XTableRows > SwXTextTable::getRows(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< table::XTableRows > xRet;
+ if (SwFrmFmt* pFmt = GetFrmFmt())
+ {
+ SwXTableRows* pRows = (SwXTableRows*)SwClientIter(*pFmt).
+ First(TYPE(SwXTableRows));
+ if (!pRows)
+ pRows = new SwXTableRows(*pFmt);
+ xRet = pRows;
+ }
+ if (!xRet.is())
+ throw uno::RuntimeException();
+ return xRet;
+}
+/*-- 11.12.98 12:42:45---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< table::XTableColumns > SwXTextTable::getColumns(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< table::XTableColumns > xRet;
+ if (SwFrmFmt* pFmt = GetFrmFmt())
+ {
+ SwXTableColumns* pCols = (SwXTableColumns*)SwClientIter(*pFmt).
+ First(TYPE(SwXTableColumns));
+ if (!pCols)
+ pCols = new SwXTableColumns(*pFmt);
+ xRet = pCols;
+ }
+ if (!xRet.is())
+ throw uno::RuntimeException();
+ return xRet;
+}
+/*-- 11.12.98 12:42:45---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< table::XCell > SwXTextTable::getCellByName(const OUString& CellName) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< table::XCell > xRet;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ String sCellName(CellName);
+ SwTableBox* pBox = (SwTableBox*)pTable->GetTblBox( sCellName );
+ if(pBox)
+ {
+ xRet = SwXCell::CreateXCell(pFmt, pBox);
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ return xRet;
+}
+/*-- 11.12.98 12:42:45---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXTextTable::getCellNames(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ // gibts an der Tabelle und an allen Boxen
+ SwTableLines& rTblLines = pTable->GetTabLines();
+ SvStrings aAllNames;
+ lcl_InspectLines(rTblLines, aAllNames);
+ uno::Sequence< OUString > aRet(aAllNames.Count());
+ OUString* pArray = aRet.getArray();
+ for(sal_uInt16 i = aAllNames.Count(); i; i--)
+ {
+ String* pObject = aAllNames.GetObject(i-1);
+ pArray[i - 1] = *pObject;
+ aAllNames.Remove(i - 1);
+ delete pObject;
+ }
+ return aRet;
+ }
+ return uno::Sequence< OUString >();
+}
+/*-- 11.12.98 12:42:45---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< text::XTextTableCursor > SwXTextTable::createCursorByCellName(const OUString& CellName)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< text::XTextTableCursor > xRet;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ String sCellName(CellName);
+ SwTableBox* pBox = (SwTableBox*)pTable->GetTblBox( sCellName );
+ if(pBox && pBox->getRowSpan() > 0 )
+ {
+ xRet = new SwXTextTableCursor(pFmt, pBox);
+ }
+ }
+ if(!xRet.is())
+ throw uno::RuntimeException();
+ return xRet;
+}
+/* -----------------18.02.99 13:36-------------------
+ *
+ * --------------------------------------------------*/
+void SwXTextTable::attachToRange(const uno::Reference< text::XTextRange > & xTextRange)
+ throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ // attachToRange must only be called once
+ if(!bIsDescriptor) /* already attached ? */
+ throw uno::RuntimeException( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "SwXTextTable: already attached to range." ) ), static_cast < cppu::OWeakObject * > ( this ) );
+
+ uno::Reference<XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY);
+ SwXTextRange* pRange = 0;
+ OTextCursorHelper* pCursor = 0;
+ if(xRangeTunnel.is())
+ {
+ pRange = reinterpret_cast< SwXTextRange * >(
+ sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( SwXTextRange::getUnoTunnelId()) ));
+ pCursor = reinterpret_cast< OTextCursorHelper * >(
+ sal::static_int_cast< sal_IntPtr >( xRangeTunnel->getSomething( OTextCursorHelper::getUnoTunnelId()) ));
+ }
+ SwDoc* pDoc = pRange ? (SwDoc*)pRange->GetDoc() : pCursor ? (SwDoc*)pCursor->GetDoc() : 0;
+ if(pDoc && nRows && nColumns)
+ {
+ SwUnoInternalPaM aPam(*pDoc);
+ //das muss jetzt sal_True liefern
+ ::sw::XTextRangeToSwPaM(aPam, xTextRange);
+
+ {
+ UnoActionContext aCont( pDoc );
+
+ pDoc->StartUndo(UNDO_EMPTY, NULL);
+ const SwTable *pTable = 0;
+ if( 0 != aPam.Start()->nContent.GetIndex() )
+ {
+ pDoc->SplitNode(*aPam.Start(), false );
+ }
+ //TODO: wenn es der letzte Absatz ist, dann muss noch ein Absatz angehaengt werden!
+ if( aPam.HasMark() )
+ {
+ pDoc->DeleteAndJoin(aPam);
+ aPam.DeleteMark();
+ }
+ pTable = pDoc->InsertTable( SwInsertTableOptions( tabopts::HEADLINE | tabopts::DEFAULT_BORDER | tabopts::SPLIT_LAYOUT, 0 ),
+ *aPam.GetPoint(),
+ nRows,
+ nColumns,
+ text::HoriOrientation::FULL );
+ if(pTable)
+ {
+ // hier muessen die Properties des Descriptors ausgewertet werden
+ pTableProps->ApplyTblAttr(*pTable, *pDoc);
+ SwFrmFmt* pTblFmt = pTable->GetFrmFmt();
+ SwClientIter aIter( *pTblFmt );
+ for( SwClient* pC = aIter.First( TYPE( SwFrm ));
+ pC; pC = aIter.Next() )
+ {
+ if( ((SwFrm*)pC)->IsTabFrm() )
+ {
+ if(((SwFrm*)pC)->IsValid())
+ ((SwFrm*)pC)->InvalidatePos();
+ ((SwTabFrm*)pC)->SetONECalcLowers();
+ ((SwTabFrm*)pC)->Calc();
+ }
+ }
+
+ pTblFmt->Add(this);
+ if(m_sTableName.Len())
+ {
+ sal_uInt16 nIndex = 1;
+ const String sTmpName(m_sTableName);
+ String sTmpNameIndex(sTmpName);
+ while(pDoc->FindTblFmtByName( sTmpNameIndex, sal_True ) && nIndex < USHRT_MAX)
+ {
+ sTmpNameIndex = sTmpName;
+ sTmpNameIndex += nIndex++;
+ }
+ pDoc->SetTableName( *pTblFmt, sTmpNameIndex);
+ }
+
+ const::uno::Any* pName;
+ if(pTableProps->GetProperty(FN_UNO_TABLE_NAME, 0, pName))
+ {
+ OUString sTmp;
+ (*pName) >>= sTmp;
+ setName(sTmp);
+ }
+ bIsDescriptor = sal_False;
+ DELETEZ(pTableProps);
+ }
+ pDoc->EndUndo( UNDO_END, NULL );
+ }
+
+ }
+ else
+ throw lang::IllegalArgumentException();
+}
+/*-- 11.12.98 12:42:45---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::attach(const uno::Reference< text::XTextRange > & xTextRange)
+ throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ attachToRange( xTextRange );
+}
+/*-- 11.12.98 12:42:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< text::XTextRange > SwXTextTable::getAnchor(void)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(!pFmt)
+ throw uno::RuntimeException();
+ uno::Reference< text::XTextRange > xRet = new SwXTextRange(*pFmt);
+ return xRet;
+}
+/*-- 11.12.98 12:42:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::dispose(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ SwTableSortBoxes& rBoxes = pTable->GetTabSortBoxes();
+ SwSelBoxes aSelBoxes;
+ aSelBoxes.Insert(rBoxes.GetData(), rBoxes.Count());
+ pFmt->GetDoc()->DeleteRowCol(aSelBoxes);
+ }
+ else
+ throw uno::RuntimeException();
+}
+/*-- 11.12.98 12:42:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::addEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
+{
+ if(!GetRegisteredIn())
+ throw uno::RuntimeException();
+ aLstnrCntnr.AddListener(aListener);
+}
+/*-- 11.12.98 12:42:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::removeEventListener(const uno::Reference< lang::XEventListener > & aListener) throw( uno::RuntimeException )
+{
+ if(!GetRegisteredIn() || !aLstnrCntnr.RemoveListener(aListener))
+ throw uno::RuntimeException();
+}
+/*-- 11.12.98 12:42:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< table::XCell > SwXTextTable::getCellByPosition(sal_Int32 nColumn, sal_Int32 nRow)
+ throw( uno::RuntimeException, lang::IndexOutOfBoundsException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< table::XCell > aRef;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ // Sheet interessiert nicht
+ if(nColumn >= 0 && nRow >= 0 && nColumn < USHRT_MAX && nRow < USHRT_MAX && pFmt)
+ {
+ SwXCell* pXCell = lcl_CreateXCell(pFmt, nColumn, nRow);
+ if(pXCell)
+ aRef = pXCell;
+ }
+ if(!aRef.is())
+ throw lang::IndexOutOfBoundsException();
+ return aRef;
+
+}
+/* -----------------11.12.98 13:26-------------------
+ *
+ * --------------------------------------------------*/
+uno::Reference< table::XCellRange > SwXTextTable::GetRangeByName(SwFrmFmt* pFmt, SwTable* pTable,
+ const String& rTLName, const String& rBRName,
+ SwRangeDescriptor& rDesc)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< table::XCellRange > aRef;
+ String sTLName(rTLName);
+ String sBRName(rBRName);
+ const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
+ if(pTLBox)
+ {
+ // hier muessen die Actions aufgehoben werden
+ UnoActionRemoveContext aRemoveContext(pFmt->GetDoc());
+ const SwStartNode* pSttNd = pTLBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ // Cursor in die obere linke Zelle des Ranges setzen
+ SwUnoCrsr* pUnoCrsr = pFmt->GetDoc()->CreateUnoCrsr(aPos, sal_True);
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ pUnoCrsr->SetRemainInSection( sal_False );
+ const SwTableBox* pBRBox = pTable->GetTblBox( sBRName );
+ if(pBRBox)
+ {
+ pUnoCrsr->SetMark();
+ pUnoCrsr->GetPoint()->nNode = *pBRBox->GetSttNd();
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pCrsr->MakeBoxSels();
+ // pUnoCrsr wird uebergeben und nicht geloescht
+ SwXCellRange* pCellRange = new SwXCellRange(pUnoCrsr, *pFmt, rDesc);
+ aRef = pCellRange;
+ }
+ else
+ delete pUnoCrsr;
+ }
+ return aRef;
+}
+/*-- 11.12.98 12:42:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< table::XCellRange > SwXTextTable::getCellRangeByPosition(sal_Int32 nLeft, sal_Int32 nTop,
+ sal_Int32 nRight, sal_Int32 nBottom)
+ throw( uno::RuntimeException, lang::IndexOutOfBoundsException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< table::XCellRange > aRef;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt && nRight < USHRT_MAX && nBottom < USHRT_MAX &&
+ nLeft <= nRight && nTop <= nBottom &&
+ nLeft >= 0 && nRight >= 0 && nTop >= 0 && nBottom >= 0 )
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ if(!pTable->IsTblComplex())
+ {
+ SwRangeDescriptor aDesc;
+ aDesc.nTop = nTop;
+ aDesc.nBottom = nBottom;
+ aDesc.nLeft = nLeft;
+ aDesc.nRight = nRight;
+ String sTLName = lcl_GetCellName(aDesc.nLeft, aDesc.nTop);
+ String sBRName = lcl_GetCellName(aDesc.nRight, aDesc.nBottom);
+
+ // please note that according to the 'if' statement at the begin
+ // sTLName:sBRName already denotes the normalized range string
+
+ aRef = GetRangeByName(pFmt, pTable, sTLName, sBRName, aDesc);
+ }
+ }
+ if(!aRef.is())
+ throw lang::IndexOutOfBoundsException();
+ return aRef;
+}
+/*-- 11.12.98 12:42:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< table::XCellRange > SwXTextTable::getCellRangeByName(const OUString& aRange)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< table::XCellRange > aRef;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ if(!pTable->IsTblComplex())
+ {
+ String sRange(aRange);
+ String sTLName(sRange.GetToken(0, ':'));
+ String sBRName(sRange.GetToken(1, ':'));
+ if(!sTLName.Len() || !sBRName.Len())
+ throw uno::RuntimeException();
+ SwRangeDescriptor aDesc;
+ aDesc.nTop = aDesc.nLeft = aDesc.nBottom = aDesc.nRight = -1;
+ lcl_GetCellPosition(sTLName, aDesc.nLeft, aDesc.nTop );
+ lcl_GetCellPosition(sBRName, aDesc.nRight, aDesc.nBottom );
+
+ // we should normalize the range now (e.g. A5:C1 will become A1:C5)
+ // since (depending on what is done later) it will be troublesome
+ // elsewhere when the cursor in the implementation does not
+ // point to the top-left and bottom-right cells
+ aDesc.Normalize();
+
+ aRef = GetRangeByName(pFmt, pTable, sTLName, sBRName, aDesc);
+ }
+ }
+ if(!aRef.is())
+ throw uno::RuntimeException();
+ return aRef;
+}
+/*-- 29.04.02 11:42:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< uno::Sequence< uno::Any > > SAL_CALL SwXTextTable::getDataArray()
+ throw (uno::RuntimeException)
+{
+ // see SwXTextTable::getData(...) also
+
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRowCount = getRowCount();
+ sal_Int16 nColCount = getColumnCount();
+ if(!nRowCount || !nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ SwFrmFmt* pFmt = GetFrmFmt();
+ uno::Sequence< uno::Sequence< uno::Any > > aRowSeq(nRowCount);
+ if(pFmt)
+ {
+ uno::Sequence< uno::Any > * pRowArray = aRowSeq.getArray();
+ for(sal_uInt16 nRow = 0; nRow < nRowCount; nRow++)
+ {
+ uno::Sequence< uno::Any > aColSeq(nColCount);
+ uno::Any * pColArray = aColSeq.getArray();
+ uno::Reference< table::XCell > xCellRef;
+ for(sal_uInt16 nCol = 0; nCol < nColCount; nCol++)
+ {
+ SwXCell* pXCell = lcl_CreateXCell(pFmt, nCol, nRow);
+ //! keep (additional) reference to object to prevent implicit destruction
+ //! in following UNO calls (when object will get referenced)
+ xCellRef = pXCell;
+ SwTableBox * pBox = pXCell ? pXCell->GetTblBox() : 0;
+ if(!pBox)
+ {
+ throw uno::RuntimeException();
+ }
+ else
+ {
+ // check if table box value item is set
+ SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
+ BOOL bIsNum = pBoxFmt->GetItemState( RES_BOXATR_VALUE, FALSE ) == SFX_ITEM_SET;
+ //const SfxPoolItem* pItem;
+ //SwDoc* pDoc = pXCell->GetDoc();
+ //BOOL bIsText = (SFX_ITEM_SET != pBoxFmt->GetAttrSet().GetItemState(RES_BOXATR_FORMAT, sal_True, &pItem)
+ // || pDoc->GetNumberFormatter()->IsTextFormat(((SwTblBoxNumFormat*)pItem)->GetValue())
+ // || ((SwTblBoxNumFormat*)pItem)->GetValue() == NUMBERFORMAT_TEXT);
+
+ if(!bIsNum/*bIsText*/)
+ pColArray[nCol] <<= lcl_getString(*pXCell);
+ else
+ pColArray[nCol] <<= lcl_getValue(*pXCell);
+ }
+ }
+ pRowArray[nRow] = aColSeq;
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ return aRowSeq;
+}
+/*-- 29.04.02 11:42:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SAL_CALL SwXTextTable::setDataArray(
+ const uno::Sequence< uno::Sequence< uno::Any > >& rArray )
+ throw (uno::RuntimeException)
+{
+ // see SwXTextTable::setData(...) also
+
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRowCount = getRowCount();
+ sal_Int16 nColCount = getColumnCount();
+
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ if(pTable->IsTblComplex())
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+
+ if(rArray.getLength() != nRowCount)
+ {
+ throw uno::RuntimeException();
+ }
+ const uno::Sequence< uno::Any >* pRowArray = rArray.getConstArray();
+ for(sal_uInt16 nRow = 0; nRow < nRowCount; nRow++)
+ {
+ const uno::Sequence< uno::Any >& rColSeq = pRowArray[nRow];
+ if(rColSeq.getLength() != nColCount)
+ {
+ throw uno::RuntimeException();
+ }
+ const uno::Any * pColArray = rColSeq.getConstArray();
+ uno::Reference< table::XCell > xCellRef;
+ for(sal_uInt16 nCol = 0; nCol < nColCount; nCol++)
+ {
+ SwXCell* pXCell = lcl_CreateXCell(pFmt, nCol, nRow);
+ //! keep (additional) reference to object to prevent implicit destruction
+ //! in following UNO calls (when object will get referenced)
+ xCellRef = pXCell;
+ SwTableBox * pBox = pXCell ? pXCell->GetTblBox() : 0;
+ if(!pBox)
+ {
+ throw uno::RuntimeException();
+ }
+ else
+ {
+ const uno::Any &rAny = pColArray[nCol];
+ if (uno::TypeClass_STRING == rAny.getValueTypeClass())
+ lcl_setString( *pXCell, *(rtl::OUString *) rAny.getValue() );
+ else
+ {
+ double d = 0;
+ // #i20067# don't throw exception just do nothing if
+ // there is no value set
+ if( (rAny >>= d) )
+ lcl_setValue( *pXCell, d );
+ else
+ lcl_setString( *pXCell, OUString(), TRUE );
+
+ }
+ }
+ }
+ }
+ }
+}
+/*-- 11.12.98 12:42:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< uno::Sequence< double > > SwXTextTable::getData(void)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRowCount = getRowCount();
+ sal_Int16 nColCount = getColumnCount();
+ if(!nRowCount || !nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ //
+ SwFrmFmt* pFmt = GetFrmFmt();
+ uno::Sequence< uno::Sequence< double > > aRowSeq(bFirstRowAsLabel ? nRowCount - 1 : nRowCount);
+ if(pFmt)
+ {
+ uno::Sequence< double >* pArray = aRowSeq.getArray();
+
+ sal_uInt16 nRowStart = bFirstRowAsLabel ? 1 : 0;
+ for(sal_uInt16 nRow = nRowStart; nRow < nRowCount; nRow++)
+ {
+ uno::Sequence< double > aColSeq(bFirstColumnAsLabel ? nColCount - 1 : nColCount);
+ double* pColArray = aColSeq.getArray();
+ sal_uInt16 nColStart = bFirstColumnAsLabel ? 1 : 0;
+ for(sal_uInt16 nCol = nColStart; nCol < nColCount; nCol++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(nCol, nRow);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ pColArray[nCol - nColStart] = xCell->getValue();
+ }
+ pArray[nRow - nRowStart] = aColSeq;
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ return aRowSeq;
+}
+/*-- 11.12.98 12:42:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::setData(const uno::Sequence< uno::Sequence< double > >& rData)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRowCount = getRowCount();
+ sal_Int16 nColCount = getColumnCount();
+ sal_Bool bChanged = sal_False;
+
+ if(!nRowCount || !nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt )
+ {
+ sal_uInt16 nRowStart = bFirstRowAsLabel ? 1 : 0;
+ if(rData.getLength() < nRowCount - nRowStart)
+ {
+ throw uno::RuntimeException();
+ }
+ const uno::Sequence< double >* pRowArray = rData.getConstArray();
+ for(sal_uInt16 nRow = nRowStart; nRow < nRowCount; nRow++)
+ {
+ const uno::Sequence< double >& rColSeq = pRowArray[nRow - nRowStart];
+ sal_uInt16 nColStart = bFirstColumnAsLabel ? 1 : 0;
+ if(rColSeq.getLength() < nColCount - nColStart)
+ {
+ throw uno::RuntimeException();
+ }
+ const double * pColArray = rColSeq.getConstArray();
+ for(sal_uInt16 nCol = nColStart; nCol < nColCount; nCol++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(nCol, nRow);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ xCell->setValue(pColArray[nCol - nColStart]);
+ bChanged=sal_True;
+ }
+ }
+ if ( bChanged )
+ aChartLstnrCntnr.ChartDataChanged();
+ }
+}
+/*-- 11.12.98 12:42:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXTextTable::getRowDescriptions(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRowCount = getRowCount();
+ if(!nRowCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ uno::Sequence< OUString > aRet(bFirstColumnAsLabel ? nRowCount - 1 : nRowCount);
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ OUString* pArray = aRet.getArray();
+ if(bFirstColumnAsLabel)
+ {
+ sal_uInt16 nStart = bFirstRowAsLabel ? 1 : 0;
+ for(sal_uInt16 i = nStart; i < nRowCount; i++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(0, i);
+ if(!xCell.is())
+ {
+ //exception ...
+ break;
+ }
+ uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
+ pArray[i - nStart] = xText->getString();
+ }
+ }
+ else
+ {
+ DBG_ERROR("Wo kommen die Labels her?");
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+}
+/*-- 11.12.98 12:42:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::setRowDescriptions(const uno::Sequence< OUString >& rRowDesc) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ sal_Int16 nRowCount = getRowCount();
+ if(!nRowCount || rRowDesc.getLength() < (bFirstRowAsLabel ? nRowCount - 1 : nRowCount))
+ {
+ throw uno::RuntimeException();
+ }
+ const OUString* pArray = rRowDesc.getConstArray();
+ if(bFirstColumnAsLabel)
+ {
+ sal_uInt16 nStart = bFirstRowAsLabel ? 1 : 0;
+ for(sal_uInt16 i = nStart; i < nRowCount; i++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(0, i);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
+ xText->setString(pArray[i - nStart]);
+ }
+ }
+ else
+ {
+ DBG_ERROR("Wohin mit den Labels?");
+ }
+ }
+ else
+ throw uno::RuntimeException();
+}
+/*-- 11.12.98 12:42:48---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXTextTable::getColumnDescriptions(void)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nColCount = getColumnCount();
+ if(!nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ uno::Sequence< OUString > aRet(bFirstRowAsLabel ? nColCount - 1 : nColCount);
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ OUString* pArray = aRet.getArray();
+ if(bFirstRowAsLabel)
+ {
+ sal_uInt16 nStart = bFirstColumnAsLabel ? 1 : 0;
+ for(sal_uInt16 i = nStart; i < nColCount; i++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(i, 0);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
+
+ pArray[i - nStart] = xText->getString();
+ }
+ }
+ else
+ {
+ DBG_ERROR("Wo kommen die Labels her?");
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+}
+/*-- 11.12.98 12:42:48---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::setColumnDescriptions(const uno::Sequence< OUString >& rColumnDesc) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nColCount = getColumnCount();
+ if(!nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ const OUString* pArray = rColumnDesc.getConstArray();
+ if(bFirstRowAsLabel && rColumnDesc.getLength() >= nColCount - bFirstColumnAsLabel ? 1 : 0)
+ {
+ sal_uInt16 nStart = bFirstColumnAsLabel ? 1 : 0;
+ for(sal_uInt16 i = nStart; i < nColCount; i++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(i, 0);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
+ xText->setString(pArray[i - nStart]);
+ }
+ }
+ else
+ {
+ DBG_ERROR("Wo kommen die Labels her?");
+ }
+ }
+ else
+ throw uno::RuntimeException();
+}
+/*-- 11.12.98 12:42:48---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::addChartDataChangeEventListener(
+ const uno::Reference< chart::XChartDataChangeEventListener > & aListener)
+ throw( uno::RuntimeException )
+{
+ if(!GetRegisteredIn())
+ throw uno::RuntimeException();
+ aChartLstnrCntnr.AddListener(aListener.get());
+}
+/*-- 11.12.98 12:42:48---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::removeChartDataChangeEventListener(
+ const uno::Reference< chart::XChartDataChangeEventListener > & aListener)
+ throw( uno::RuntimeException )
+{
+ if(!GetRegisteredIn() || !aChartLstnrCntnr.RemoveListener(aListener.get()))
+ throw uno::RuntimeException();
+}
+/* -----------------08.03.99 15:33-------------------
+ *
+ * --------------------------------------------------*/
+sal_Bool SwXTextTable::isNotANumber(double nNumber) throw( uno::RuntimeException )
+{
+ // We use DBL_MIN because starcalc does (which uses it because chart
+ // wants it that way!)
+ return ( nNumber == DBL_MIN );
+}
+/* -----------------08.03.99 15:34-------------------
+ *
+ * --------------------------------------------------*/
+double SwXTextTable::getNotANumber(void) throw( uno::RuntimeException )
+{
+ // We use DBL_MIN because starcalc does (which uses it because chart
+ // wants it that way!)
+ return DBL_MIN;
+}
+/*-- 11.12.98 12:42:48---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< beans::PropertyValue > SwXTextTable::createSortDescriptor(void)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+
+ return SwUnoCursorHelper::CreateSortDescriptor(true);
+}
+/*-- 11.12.98 12:42:49---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::sort(const uno::Sequence< beans::PropertyValue >& rDescriptor)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwSortOptions aSortOpt;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt &&
+ SwUnoCursorHelper::ConvertSortProperties(rDescriptor, aSortOpt))
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ SwSelBoxes aBoxes;
+ const SwTableSortBoxes& rTBoxes = pTable->GetTabSortBoxes();
+ for( sal_uInt16 n = 0; n < rTBoxes.Count(); ++n )
+ {
+ SwTableBox* pBox = rTBoxes[ n ];
+ aBoxes.Insert( pBox );
+ }
+ UnoActionContext aContext( pFmt->GetDoc() );
+ pFmt->GetDoc()->SortTbl(aBoxes, aSortOpt);
+ }
+}
+/*-- 11.12.98 12:42:49---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::autoFormat(const OUString& aName) throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ if(!pTable->IsTblComplex())
+ {
+
+ String sAutoFmtName(aName);
+ SwTableAutoFmtTbl aAutoFmtTbl;
+ aAutoFmtTbl.Load();
+ for( sal_uInt16 i = aAutoFmtTbl.Count(); i; )
+ if( sAutoFmtName == aAutoFmtTbl[ --i ]->GetName() )
+ {
+ SwSelBoxes aBoxes;
+ const SwTableSortBoxes& rTBoxes = pTable->GetTabSortBoxes();
+ for( sal_uInt16 n = 0; n < rTBoxes.Count(); ++n )
+ {
+ SwTableBox* pBox = rTBoxes[ n ];
+ aBoxes.Insert( pBox );
+ }
+ UnoActionContext aContext( pFmt->GetDoc() );
+ pFmt->GetDoc()->SetTableAutoFmt( aBoxes, *aAutoFmtTbl[i] );
+ break;
+ }
+ }
+ }
+ else
+ throw uno::RuntimeException();
+}
+/*-- 11.12.98 12:42:49---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< beans::XPropertySetInfo > SwXTextTable::getPropertySetInfo(void) throw( uno::RuntimeException )
+{
+ static uno::Reference< beans::XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
+ return xRef;
+}
+/*-- 11.12.98 12:42:50---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::setPropertyValue(const OUString& rPropertyName,
+ const uno::Any& aValue)
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException,
+ lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(!aValue.hasValue())
+ throw lang::IllegalArgumentException();
+ const SfxItemPropertySimpleEntry* pEntry =
+ m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ if( !pEntry )
+ throw lang::IllegalArgumentException();
+ if(pFmt)
+ {
+ if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
+ throw beans::PropertyVetoException( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+
+ if(0xFF == pEntry->nMemberId)
+ {
+ lcl_SetSpecialProperty(pFmt, pEntry, aValue);
+ }
+ else
+ {
+ switch(pEntry->nWID)
+ {
+ case UNO_NAME_TABLE_NAME :
+ {
+ ::rtl::OUString sName;
+ aValue >>= sName;
+ setName( sName );
+ }
+ break;
+ case FN_UNO_RANGE_ROW_LABEL:
+ {
+ sal_Bool bTmp = *(sal_Bool*)aValue.getValue();
+ if(bFirstRowAsLabel != bTmp)
+ {
+ aChartLstnrCntnr.ChartDataChanged();
+ bFirstRowAsLabel = bTmp;
+ }
+ }
+ break;
+ case FN_UNO_RANGE_COL_LABEL:
+ {
+ sal_Bool bTmp = *(sal_Bool*)aValue.getValue();
+ if(bFirstColumnAsLabel != bTmp)
+ {
+ aChartLstnrCntnr.ChartDataChanged();
+ bFirstColumnAsLabel = bTmp;
+ }
+ }
+ break;
+ case FN_UNO_TABLE_BORDER:
+ {
+ const table::TableBorder* pBorder =
+ (const table::TableBorder* )aValue.getValue();
+ if(aValue.getValueType() == ::getCppuType((const table::TableBorder* )0)
+ && pBorder)
+ {
+ SwDoc* pDoc = pFmt->GetDoc();
+ SwClientIter aIter( *pFmt );
+ //Tabellen ohne Layout (unsichtbare Header/Footer )
+ if(0 != aIter.First( TYPE( SwFrm )))
+ {
+ lcl_FormatTable(pFmt);
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ SwTableLines &rLines = pTable->GetTabLines();
+
+
+ // hier muessen die Actions aufgehoben werden
+ UnoActionRemoveContext aRemoveContext(pDoc);
+ const SwTableBox* pTLBox = lcl_FindCornerTableBox(rLines, true);
+ const SwStartNode* pSttNd = pTLBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ // Cursor in die obere linke Zelle des Ranges setzen
+ SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(aPos, sal_True);
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ pUnoCrsr->SetRemainInSection( sal_False );
+
+
+
+ const SwTableBox* pBRBox = lcl_FindCornerTableBox(rLines, false);
+ pUnoCrsr->SetMark();
+ pUnoCrsr->GetPoint()->nNode = *pBRBox->GetSttNd();
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pCrsr->MakeBoxSels();
+
+ SfxItemSet aSet(pDoc->GetAttrPool(),
+ RES_BOX, RES_BOX,
+ SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
+ 0);
+
+ SvxBoxItem aBox( RES_BOX );
+ SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
+ SvxBorderLine aLine;
+
+ sal_Bool bSet = lcl_LineToSvxLine(pBorder->TopLine, aLine);
+ aBox.SetLine(bSet ? &aLine : 0, BOX_LINE_TOP);
+ aBoxInfo.SetValid(VALID_TOP, pBorder->IsTopLineValid);
+
+ bSet = lcl_LineToSvxLine(pBorder->BottomLine, aLine);
+ aBox.SetLine(bSet ? &aLine : 0, BOX_LINE_BOTTOM);
+ aBoxInfo.SetValid(VALID_BOTTOM, pBorder->IsBottomLineValid);
+
+ bSet = lcl_LineToSvxLine(pBorder->LeftLine, aLine);
+ aBox.SetLine(bSet ? &aLine : 0, BOX_LINE_LEFT);
+ aBoxInfo.SetValid(VALID_LEFT, pBorder->IsLeftLineValid);
+
+ bSet = lcl_LineToSvxLine(pBorder->RightLine, aLine);
+ aBox.SetLine(bSet ? &aLine : 0, BOX_LINE_RIGHT);
+ aBoxInfo.SetValid(VALID_RIGHT, pBorder->IsRightLineValid);
+
+ bSet = lcl_LineToSvxLine(pBorder->HorizontalLine, aLine);
+ aBoxInfo.SetLine(bSet ? &aLine : 0, BOXINFO_LINE_HORI);
+ aBoxInfo.SetValid(VALID_HORI, pBorder->IsHorizontalLineValid);
+
+ bSet = lcl_LineToSvxLine(pBorder->VerticalLine, aLine);
+ aBoxInfo.SetLine(bSet ? &aLine : 0, BOXINFO_LINE_VERT);
+ aBoxInfo.SetValid(VALID_VERT, pBorder->IsVerticalLineValid);
+
+ aBox.SetDistance((sal_uInt16)MM100_TO_TWIP(pBorder->Distance));
+ aBoxInfo.SetValid(VALID_DISTANCE, pBorder->IsDistanceValid);
+
+ aSet.Put(aBox);
+ aSet.Put(aBoxInfo);
+
+ pDoc->SetTabBorders(*pCrsr, aSet);
+ delete pUnoCrsr;
+ }
+ }
+ }
+ break;
+ case FN_UNO_TABLE_BORDER_DISTANCES:
+ {
+ table::TableBorderDistances aTableBorderDistances;
+ if( !(aValue >>= aTableBorderDistances) ||
+ (!aTableBorderDistances.IsLeftDistanceValid &&
+ !aTableBorderDistances.IsRightDistanceValid &&
+ !aTableBorderDistances.IsTopDistanceValid &&
+ !aTableBorderDistances.IsBottomDistanceValid ))
+ break;
+
+ USHORT nLeftDistance = MM100_TO_TWIP_UNSIGNED( aTableBorderDistances.LeftDistance);
+ USHORT nRightDistance = MM100_TO_TWIP_UNSIGNED( aTableBorderDistances.RightDistance);
+ USHORT nTopDistance = MM100_TO_TWIP_UNSIGNED( aTableBorderDistances.TopDistance);
+ USHORT nBottomDistance = MM100_TO_TWIP_UNSIGNED( aTableBorderDistances.BottomDistance);
+ SwDoc* pDoc = pFmt->GetDoc();
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ SwTableLines &rLines = pTable->GetTabLines();
+ pDoc->StartUndo(UNDO_START, NULL);
+ for(sal_uInt16 i = 0; i < rLines.Count(); i++)
+ {
+ SwTableLine* pLine = rLines.GetObject(i);
+ SwTableBoxes& rBoxes = pLine->GetTabBoxes();
+ for(sal_uInt16 k = 0; k < rBoxes.Count(); k++)
+ {
+ SwTableBox* pBox = rBoxes.GetObject(k);
+ const SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
+ const SvxBoxItem& rBox = pBoxFmt->GetBox();
+ if(
+ (aTableBorderDistances.IsLeftDistanceValid && nLeftDistance != rBox.GetDistance( BOX_LINE_LEFT )) ||
+ (aTableBorderDistances.IsRightDistanceValid && nRightDistance != rBox.GetDistance( BOX_LINE_RIGHT )) ||
+ (aTableBorderDistances.IsTopDistanceValid && nTopDistance != rBox.GetDistance( BOX_LINE_TOP )) ||
+ (aTableBorderDistances.IsBottomDistanceValid && nBottomDistance != rBox.GetDistance( BOX_LINE_BOTTOM )))
+ {
+ SvxBoxItem aSetBox( rBox );
+ SwFrmFmt* pSetBoxFmt = pBox->ClaimFrmFmt();
+ if( aTableBorderDistances.IsLeftDistanceValid )
+ aSetBox.SetDistance( nLeftDistance, BOX_LINE_LEFT );
+ if( aTableBorderDistances.IsRightDistanceValid )
+ aSetBox.SetDistance( nRightDistance, BOX_LINE_RIGHT );
+ if( aTableBorderDistances.IsTopDistanceValid )
+ aSetBox.SetDistance( nTopDistance, BOX_LINE_TOP );
+ if( aTableBorderDistances.IsBottomDistanceValid )
+ aSetBox.SetDistance( nBottomDistance, BOX_LINE_BOTTOM );
+ pDoc->SetAttr( aSetBox, *pSetBoxFmt );
+ }
+ }
+ }
+ pDoc->EndUndo(UNDO_END, NULL);
+ }
+ break;
+ case FN_UNO_TABLE_COLUMN_SEPARATORS:
+ {
+ UnoActionContext aContext(pFmt->GetDoc());
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ lcl_SetTblSeparators(aValue, pTable, pTable->GetTabLines()[0]->GetTabBoxes()[0], sal_False, pFmt->GetDoc());
+ }
+ break;
+ case FN_UNO_TABLE_COLUMN_RELATIVE_SUM:/*_readonly_*/ break;
+ default:
+ {
+ SwAttrSet aSet(pFmt->GetAttrSet());
+ m_pPropSet->setPropertyValue(*pEntry, aValue, aSet);
+ pFmt->GetDoc()->SetAttr(aSet, *pFmt);
+ }
+ }
+ }
+ }
+ else if(bIsDescriptor)
+ {
+ String aPropertyName(rPropertyName);
+ pTableProps->SetProperty( pEntry->nWID, pEntry->nMemberId, aValue);
+ }
+ else
+ throw uno::RuntimeException();
+}
+/*-- 11.12.98 12:42:51---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Any SwXTextTable::getPropertyValue(const OUString& rPropertyName) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Any aRet;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ const SfxItemPropertySimpleEntry* pEntry =
+ m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ if(pFmt)
+ {
+ if (!pEntry)
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+
+ if(0xFF == pEntry->nMemberId)
+ {
+ aRet = lcl_GetSpecialProperty(pFmt, pEntry );
+ }
+ else
+ {
+ switch(pEntry->nWID)
+ {
+ case UNO_NAME_TABLE_NAME:
+ {
+ aRet <<= getName();
+ }
+ break;
+ case FN_UNO_ANCHOR_TYPES:
+ case FN_UNO_TEXT_WRAP:
+ case FN_UNO_ANCHOR_TYPE:
+ ::sw::GetDefaultTextContentValue(
+ aRet, OUString(), pEntry->nWID);
+ break;
+ case FN_UNO_RANGE_ROW_LABEL:
+ {
+ sal_Bool bTemp = bFirstRowAsLabel;
+ aRet.setValue(&bTemp, ::getCppuBooleanType());
+ }
+ break;
+ case FN_UNO_RANGE_COL_LABEL:
+ {
+ sal_Bool bTemp = bFirstColumnAsLabel;
+ aRet.setValue(&bTemp, ::getCppuBooleanType());
+ }
+ break;
+ case FN_UNO_TABLE_BORDER:
+ {
+ SwDoc* pDoc = pFmt->GetDoc();
+ SwClientIter aIter( *pFmt );
+ //Tabellen ohne Layout (unsichtbare Header/Footer )
+ if(0 != aIter.First( TYPE( SwFrm )))
+ {
+ lcl_FormatTable(pFmt);
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ SwTableLines &rLines = pTable->GetTabLines();
+
+ // hier muessen die Actions aufgehoben werden
+ UnoActionRemoveContext aRemoveContext(pDoc);
+ const SwTableBox* pTLBox = lcl_FindCornerTableBox(rLines, true);
+ const SwStartNode* pSttNd = pTLBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ // Cursor in die obere linke Zelle des Ranges setzen
+ SwUnoCrsr* pUnoCrsr = pDoc->CreateUnoCrsr(aPos, sal_True);
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ pUnoCrsr->SetRemainInSection( sal_False );
+
+ const SwTableBox* pBRBox = lcl_FindCornerTableBox(rLines, false);
+ pUnoCrsr->SetMark();
+ const SwStartNode* pLastNd = pBRBox->GetSttNd();
+ pUnoCrsr->GetPoint()->nNode = *pLastNd;
+
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pCrsr->MakeBoxSels();
+
+ SfxItemSet aSet(pDoc->GetAttrPool(),
+ RES_BOX, RES_BOX,
+ SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
+ 0);
+ aSet.Put(SvxBoxInfoItem( SID_ATTR_BORDER_INNER ));
+ pDoc->GetTabBorders(*pCrsr, aSet);
+ const SvxBoxInfoItem& rBoxInfoItem = (const SvxBoxInfoItem&)aSet.Get(SID_ATTR_BORDER_INNER);
+ const SvxBoxItem& rBox = (const SvxBoxItem&)aSet.Get(RES_BOX);
+
+ table::TableBorder aTableBorder;
+ aTableBorder.TopLine = lcl_SvxLineToLine(rBox.GetTop());
+ aTableBorder.IsTopLineValid = rBoxInfoItem.IsValid(VALID_TOP);
+ aTableBorder.BottomLine = lcl_SvxLineToLine(rBox.GetBottom());
+ aTableBorder.IsBottomLineValid = rBoxInfoItem.IsValid(VALID_BOTTOM);
+ aTableBorder.LeftLine = lcl_SvxLineToLine(rBox.GetLeft());
+ aTableBorder.IsLeftLineValid = rBoxInfoItem.IsValid(VALID_LEFT);
+ aTableBorder.RightLine = lcl_SvxLineToLine(rBox.GetRight());
+ aTableBorder.IsRightLineValid = rBoxInfoItem.IsValid(VALID_RIGHT );
+ aTableBorder.HorizontalLine = lcl_SvxLineToLine(rBoxInfoItem.GetHori());
+ aTableBorder.IsHorizontalLineValid = rBoxInfoItem.IsValid(VALID_HORI);
+ aTableBorder.VerticalLine = lcl_SvxLineToLine(rBoxInfoItem.GetVert());
+ aTableBorder.IsVerticalLineValid = rBoxInfoItem.IsValid(VALID_VERT);
+ aTableBorder.Distance = TWIP_TO_MM100_UNSIGNED( rBox.GetDistance() );
+ aTableBorder.IsDistanceValid = rBoxInfoItem.IsValid(VALID_DISTANCE);
+ aRet.setValue(&aTableBorder, ::getCppuType((const table::TableBorder*)0));
+ delete pUnoCrsr;
+ }
+ }
+ break;
+ case FN_UNO_TABLE_BORDER_DISTANCES :
+ {
+ table::TableBorderDistances aTableBorderDistances( 0, sal_True, 0, sal_True, 0, sal_True, 0, sal_True ) ;
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ const SwTableLines &rLines = pTable->GetTabLines();
+ bool bFirst = true;
+ USHORT nLeftDistance = 0;
+ USHORT nRightDistance = 0;
+ USHORT nTopDistance = 0;
+ USHORT nBottomDistance = 0;
+
+ for(sal_uInt16 i = 0; i < rLines.Count(); i++)
+ {
+ const SwTableLine* pLine = rLines.GetObject(i);
+ const SwTableBoxes& rBoxes = pLine->GetTabBoxes();
+ for(sal_uInt16 k = 0; k < rBoxes.Count(); k++)
+ {
+ const SwTableBox* pBox = rBoxes.GetObject(k);
+ SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
+ const SvxBoxItem& rBox = pBoxFmt->GetBox();
+ if( bFirst )
+ {
+ nLeftDistance = TWIP_TO_MM100_UNSIGNED( rBox.GetDistance( BOX_LINE_LEFT ));
+ nRightDistance = TWIP_TO_MM100_UNSIGNED( rBox.GetDistance( BOX_LINE_RIGHT ));
+ nTopDistance = TWIP_TO_MM100_UNSIGNED( rBox.GetDistance( BOX_LINE_TOP ));
+ nBottomDistance = TWIP_TO_MM100_UNSIGNED( rBox.GetDistance( BOX_LINE_BOTTOM ));
+ bFirst = false;
+ }
+ else
+ {
+ if( aTableBorderDistances.IsLeftDistanceValid &&
+ nLeftDistance != TWIP_TO_MM100_UNSIGNED( rBox.GetDistance( BOX_LINE_LEFT )))
+ aTableBorderDistances.IsLeftDistanceValid = sal_False;
+ if( aTableBorderDistances.IsRightDistanceValid &&
+ nRightDistance != TWIP_TO_MM100_UNSIGNED( rBox.GetDistance( BOX_LINE_RIGHT )))
+ aTableBorderDistances.IsRightDistanceValid = sal_False;
+ if( aTableBorderDistances.IsTopDistanceValid &&
+ nTopDistance != TWIP_TO_MM100_UNSIGNED( rBox.GetDistance( BOX_LINE_TOP )))
+ aTableBorderDistances.IsTopDistanceValid = sal_False;
+ if( aTableBorderDistances.IsBottomDistanceValid &&
+ nBottomDistance != TWIP_TO_MM100_UNSIGNED( rBox.GetDistance( BOX_LINE_BOTTOM )))
+ aTableBorderDistances.IsBottomDistanceValid = sal_False;
+ }
+
+ }
+ if( !aTableBorderDistances.IsLeftDistanceValid &&
+ !aTableBorderDistances.IsRightDistanceValid &&
+ !aTableBorderDistances.IsTopDistanceValid &&
+ !aTableBorderDistances.IsBottomDistanceValid )
+ break;
+ }
+ if( aTableBorderDistances.IsLeftDistanceValid)
+ aTableBorderDistances.LeftDistance = nLeftDistance;
+ if( aTableBorderDistances.IsRightDistanceValid)
+ aTableBorderDistances.RightDistance = nRightDistance;
+ if( aTableBorderDistances.IsTopDistanceValid)
+ aTableBorderDistances.TopDistance = nTopDistance;
+ if( aTableBorderDistances.IsBottomDistanceValid)
+ aTableBorderDistances.BottomDistance = nBottomDistance;
+
+ aRet <<= aTableBorderDistances;
+ }
+ break;
+ case FN_UNO_TABLE_COLUMN_SEPARATORS:
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ lcl_GetTblSeparators(aRet, pTable, pTable->GetTabLines()[0]->GetTabBoxes()[0], sal_False);
+ }
+ break;
+ case FN_UNO_TABLE_COLUMN_RELATIVE_SUM:
+ aRet <<= (INT16) UNO_TABLE_COLUMN_SUM;
+ break;
+ case RES_ANCHOR:
+ //AnchorType ist readonly und maybevoid und wird nicht geliefert
+ break;
+ case FN_UNO_TEXT_SECTION:
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ SwTableNode* pTblNode = pTable->GetTableNode();
+ SwSectionNode* pSectionNode = pTblNode->FindSectionNode();
+ if(pSectionNode)
+ {
+ const SwSection& rSect = pSectionNode->GetSection();
+ uno::Reference< text::XTextSection > xSect =
+ SwXTextSections::GetObject( *rSect.GetFmt() );
+ aRet <<= xSect;
+ }
+ }
+ break;
+ default:
+ {
+ const SwAttrSet& rSet = pFmt->GetAttrSet();
+ m_pPropSet->getPropertyValue(*pEntry, rSet, aRet);
+ }
+ }
+ }
+ }
+ else if(bIsDescriptor)
+ {
+ const uno::Any* pAny = 0;
+ String aPropertyName(rPropertyName);
+ if(!pTableProps->GetProperty(pEntry->nWID, pEntry->nMemberId, pAny))
+ throw lang::IllegalArgumentException();
+ else if(pAny)
+ aRet = *pAny;
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+}
+/*-- 11.12.98 12:42:51---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::addPropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:42:52---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::removePropertyChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:42:58---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::addVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:42:58---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::removeVetoableChangeListener(const OUString& /*rPropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 12:42:58---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+OUString SwXTextTable::getName(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ String sRet;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(!pFmt && !bIsDescriptor)
+ throw uno::RuntimeException();
+ if(pFmt)
+ {
+ sRet = pFmt->GetName();
+ }
+ else
+ sRet = m_sTableName;
+ return sRet;
+}
+/*-- 11.12.98 12:42:59---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::setName(const OUString& rName) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ String sNewTblName(rName);
+ if((!pFmt && !bIsDescriptor) ||
+ !sNewTblName.Len() ||
+ STRING_NOTFOUND != sNewTblName.Search('.') ||
+ STRING_NOTFOUND != sNewTblName.Search(' ') )
+ throw uno::RuntimeException();
+
+ if(pFmt)
+ {
+ const String aOldName( pFmt->GetName() );
+ sal_Bool bNameFound = sal_False;
+ SwFrmFmt* pTmpFmt;
+ const SwFrmFmts* pTbl = pFmt->GetDoc()->GetTblFrmFmts();
+ for( sal_uInt16 i = pTbl->Count(); i; )
+ if( !( pTmpFmt = (*pTbl)[ --i ] )->IsDefault() &&
+ pTmpFmt->GetName() == sNewTblName &&
+ pFmt->GetDoc()->IsUsed( *pTmpFmt ))
+ {
+ bNameFound = sal_True;
+ break;
+ }
+
+ if(bNameFound)
+ {
+ throw uno::RuntimeException();
+ }
+ pFmt->SetName( sNewTblName );
+
+
+ SwStartNode *pStNd;
+ SwNodeIndex aIdx( *pFmt->GetDoc()->GetNodes().GetEndOfAutotext().StartOfSectionNode(), 1 );
+ while ( 0 != (pStNd = aIdx.GetNode().GetStartNode()) )
+ {
+ aIdx++;
+ SwNode *pNd = pFmt->GetDoc()->GetNodes()[aIdx];
+ if ( pNd->IsOLENode() &&
+ aOldName == ((SwOLENode*)pNd)->GetChartTblName() )
+ {
+ ((SwOLENode*)pNd)->SetChartTblName( sNewTblName );
+
+ ((SwOLENode*)pNd)->GetOLEObj();
+
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ //TL_CHART2: chart needs to be notfied about name changes
+ pFmt->GetDoc()->UpdateCharts( pTable->GetFrmFmt()->GetName() );
+ }
+ aIdx.Assign( *pStNd->EndOfSectionNode(), + 1 );
+ }
+ pFmt->GetDoc()->SetModified();
+ }
+ else
+ m_sTableName = sNewTblName;
+}
+/*-----------------11.02.98 09:58-------------------
+
+--------------------------------------------------*/
+sal_uInt16 SwXTextTable::getRowCount(void)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRet = 0;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ if(!pTable->IsTblComplex())
+ {
+ nRet = pTable->GetTabLines().Count();
+ }
+ }
+ return nRet;
+}
+/*-----------------11.02.98 09:58-------------------
+
+--------------------------------------------------*/
+sal_uInt16 SwXTextTable::getColumnCount(void)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ sal_Int16 nRet = 0;
+ if(pFmt)
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ if(!pTable->IsTblComplex())
+ {
+ SwTableLines& rLines = pTable->GetTabLines();
+ SwTableLine* pLine = rLines.GetObject(0);
+ nRet = pLine->GetTabBoxes().Count();
+ }
+ }
+ return nRet;
+}
+/*-- 11.12.98 12:42:59---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTextTable::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ if(pOld && pOld->Which() == RES_REMOVE_UNO_OBJECT &&
+ (void*)GetRegisteredIn() == ((SwPtrMsgPoolItem *)pOld)->pObject )
+ ((SwModify*)GetRegisteredIn())->Remove(this);
+ else
+ ClientModify(this, pOld, pNew);
+ if(!GetRegisteredIn())
+ {
+ aLstnrCntnr.Disposing();
+ aChartLstnrCntnr.Disposing();
+ }
+ else
+ aChartLstnrCntnr.ChartDataChanged();
+}
+/* -----------------25.10.99 15:12-------------------
+
+ --------------------------------------------------*/
+OUString SAL_CALL SwXTextTable::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXTextTable");
+}
+/* -----------------25.10.99 15:12-------------------
+
+ --------------------------------------------------*/
+sal_Bool SwXTextTable::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ String sServiceName(rServiceName);
+ return (sServiceName.EqualsAscii("com.sun.star.document.LinkTarget") ||
+ sServiceName.EqualsAscii("com.sun.star.text.TextTable") ||
+ sServiceName.EqualsAscii("com.sun.star.text.TextContent") ||
+ sServiceName.EqualsAscii("com.sun.star.text.TextSortable"));
+}
+/* -----------------25.10.99 15:12-------------------
+
+ --------------------------------------------------*/
+uno::Sequence< OUString > SwXTextTable::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(4);
+ OUString* pArr = aRet.getArray();
+ pArr[0] = C2U("com.sun.star.document.LinkTarget");
+ pArr[1] = C2U("com.sun.star.text.TextTable");
+ pArr[2] = C2U("com.sun.star.text.TextContent");
+ pArr[2] = C2U("com.sun.star.text.TextSortable");
+ return aRet;
+}
+
+/******************************************************************
+ *
+ ******************************************************************/
+/* -----------------------------10.03.00 18:02--------------------------------
+
+ ---------------------------------------------------------------------------*/
+const uno::Sequence< sal_Int8 > & SwXCellRange::getUnoTunnelId()
+{
+ static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
+ return aSeq;
+}
+/* -----------------------------10.03.00 18:04--------------------------------
+
+ ---------------------------------------------------------------------------*/
+sal_Int64 SAL_CALL SwXCellRange::getSomething( const uno::Sequence< sal_Int8 >& rId )
+ throw(uno::RuntimeException)
+{
+ if( rId.getLength() == 16
+ && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
+ rId.getConstArray(), 16 ) )
+ {
+ return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
+ }
+ return 0;
+}
+/* -----------------28.04.98 10:29-------------------
+ *
+ * --------------------------------------------------*/
+TYPEINIT1(SwXCellRange, SwClient);
+/* -----------------------------19.04.00 15:21--------------------------------
+
+ ---------------------------------------------------------------------------*/
+OUString SwXCellRange::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXCellRange");
+}
+/* -----------------------------19.04.00 15:21--------------------------------
+
+ ---------------------------------------------------------------------------*/
+BOOL SwXCellRange::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ return
+ rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.text.CellRange" ) ) ||
+ rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.style.CharacterProperties" ) ) ||
+ rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.style.CharacterPropertiesAsian" ) ) ||
+ rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.style.CharacterPropertiesComplex") ) ||
+ rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.style.ParagraphProperties" ) ) ||
+ rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.style.ParagraphPropertiesAsian" ) ) ||
+ rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( "com.sun.star.style.ParagraphPropertiesComplex" ) );
+}
+/* -----------------------------19.04.00 15:21--------------------------------
+
+ ---------------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXCellRange::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(7);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.text.CellRange");
+ pArray[1] = C2U("com.sun.star.style.CharacterProperties");
+ pArray[2] = C2U("com.sun.star.style.CharacterPropertiesAsian");
+ pArray[3] = C2U("com.sun.star.style.CharacterPropertiesComplex");
+ pArray[4] = C2U("com.sun.star.style.ParagraphProperties");
+ pArray[5] = C2U("com.sun.star.style.ParagraphPropertiesAsian");
+ pArray[6] = C2U("com.sun.star.style.ParagraphPropertiesComplex");
+ return aRet;
+}
+
+/*-- 11.12.98 14:27:33---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXCellRange::SwXCellRange(SwUnoCrsr* pCrsr, SwFrmFmt& rFrmFmt,
+ SwRangeDescriptor& rDesc)
+ :
+ SwClient(&rFrmFmt),
+ aCursorDepend(this, pCrsr),
+ aChartLstnrCntnr((cppu::OWeakObject*)this),
+ aRgDesc(rDesc),
+ m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TABLE_RANGE)),
+ pTblCrsr(pCrsr),
+ bFirstRowAsLabel(sal_False),
+ bFirstColumnAsLabel(sal_False)
+{
+ aRgDesc.Normalize();
+}
+/*-- 11.12.98 14:27:33---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXCellRange::~SwXCellRange()
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ delete pTblCrsr;
+}
+/*-- 11.12.98 14:27:34---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< table::XCell > SwXCellRange::getCellByPosition(sal_Int32 nColumn, sal_Int32 nRow)
+ throw( uno::RuntimeException, lang::IndexOutOfBoundsException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< table::XCell > aRet;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ if(nColumn >= 0 && nRow >= 0 &&
+ getColumnCount() > nColumn && getRowCount() > nRow )
+ {
+ SwXCell* pXCell = lcl_CreateXCell(pFmt,
+ aRgDesc.nLeft + nColumn, aRgDesc.nTop + nRow);
+ if(pXCell)
+ aRet = pXCell;
+ }
+ }
+ if(!aRet.is())
+ throw lang::IndexOutOfBoundsException();
+ return aRet;
+}
+/*-- 11.12.98 14:27:34---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< table::XCellRange > SwXCellRange::getCellRangeByPosition(
+ sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom)
+ throw( uno::RuntimeException, lang::IndexOutOfBoundsException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< table::XCellRange > aRet;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt && getColumnCount() > nRight && getRowCount() > nBottom &&
+ nLeft <= nRight && nTop <= nBottom
+ && nLeft >= 0 && nRight >= 0 && nTop >= 0 && nBottom >= 0 )
+ {
+ SwTable* pTable = SwTable::FindTable( pFmt );
+ if(!pTable->IsTblComplex())
+ {
+ SwRangeDescriptor aNewDesc;
+ aNewDesc.nTop = nTop + aRgDesc.nTop;
+ aNewDesc.nBottom = nBottom + aRgDesc.nTop;
+ aNewDesc.nLeft = nLeft + aRgDesc.nLeft;
+ aNewDesc.nRight = nRight + aRgDesc.nLeft;
+ aNewDesc.Normalize();
+ String sTLName = lcl_GetCellName(aNewDesc.nLeft, aNewDesc.nTop);
+ String sBRName = lcl_GetCellName(aNewDesc.nRight, aNewDesc.nBottom);
+ const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
+ if(pTLBox)
+ {
+ // hier muessen die Actions aufgehoben
+ UnoActionRemoveContext aRemoveContext(pFmt->GetDoc());
+ const SwStartNode* pSttNd = pTLBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ // Cursor in die obere linke Zelle des Ranges setzen
+ SwUnoCrsr* pUnoCrsr = pFmt->GetDoc()->CreateUnoCrsr(aPos, sal_True);
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ pUnoCrsr->SetRemainInSection( sal_False );
+ const SwTableBox* pBRBox = pTable->GetTblBox( sBRName );
+ if(pBRBox)
+ {
+ pUnoCrsr->SetMark();
+ pUnoCrsr->GetPoint()->nNode = *pBRBox->GetSttNd();
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pCrsr->MakeBoxSels();
+ // pUnoCrsr wird uebergeben und nicht geloescht
+ SwXCellRange* pCellRange = new SwXCellRange(pUnoCrsr, *pFmt, aNewDesc);
+ aRet = pCellRange;
+ }
+ else
+ delete pUnoCrsr;
+ }
+ }
+ }
+ if(!aRet.is())
+ throw lang::IndexOutOfBoundsException();
+ return aRet;
+
+}
+/*-- 11.12.98 14:27:34---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< table::XCellRange > SwXCellRange::getCellRangeByName(const OUString& rRange)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ String sRange(rRange);
+ String sTLName(sRange.GetToken(0, ':'));
+ String sBRName(sRange.GetToken(1, ':'));
+ if(!sTLName.Len() || !sBRName.Len())
+ throw uno::RuntimeException();
+ SwRangeDescriptor aDesc;
+ aDesc.nTop = aDesc.nLeft = aDesc.nBottom = aDesc.nRight = -1;
+ lcl_GetCellPosition( sTLName, aDesc.nLeft, aDesc.nTop );
+ lcl_GetCellPosition( sBRName, aDesc.nRight, aDesc.nBottom );
+ aDesc.Normalize();
+ return getCellRangeByPosition(aDesc.nLeft - aRgDesc.nLeft, aDesc.nTop - aRgDesc.nTop,
+ aDesc.nRight - aRgDesc.nLeft, aDesc.nBottom - aRgDesc.nTop);
+}
+/*-- 11.12.98 14:27:35---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< beans::XPropertySetInfo > SwXCellRange::getPropertySetInfo(void) throw( uno::RuntimeException )
+{
+ static uno::Reference< beans::XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
+ return xRef;
+}
+/*-- 11.12.98 14:27:35---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::setPropertyValue(const OUString& rPropertyName,
+ const uno::Any& aValue) throw( beans::UnknownPropertyException,
+ beans::PropertyVetoException, lang::IllegalArgumentException,
+ lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ /* ASK OLIVER
+ lcl_FormatTable(pFmt);*/
+ const SfxItemPropertySimpleEntry* pEntry =
+ m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ if(pEntry)
+ {
+ if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
+ throw beans::PropertyVetoException( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+
+ SwDoc* pDoc = pTblCrsr->GetDoc();
+ {
+ // remove actions to enable box selection
+ UnoActionRemoveContext aRemoveContext(pDoc);
+ }
+ SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pTblCrsr);
+ pCrsr->MakeBoxSels();
+ switch(pEntry->nWID )
+ {
+ case FN_UNO_TABLE_CELL_BACKGROUND:
+ {
+ SvxBrushItem aBrush( RES_BACKGROUND );
+ pDoc->GetBoxAttr( *pTblCrsr, aBrush );
+ ((SfxPoolItem&)aBrush).PutValue(aValue, pEntry->nMemberId);
+ pDoc->SetBoxAttr( *pTblCrsr, aBrush );
+
+ }
+ break;
+ case RES_BOX :
+ {
+ SfxItemSet aSet(pDoc->GetAttrPool(),
+ RES_BOX, RES_BOX,
+ SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
+ 0);
+ SvxBoxInfoItem aBoxInfo( SID_ATTR_BORDER_INNER );
+ aBoxInfo.SetValid(0xff, FALSE);
+ BYTE nValid = 0;
+ switch(pEntry->nMemberId & ~CONVERT_TWIPS)
+ {
+ case LEFT_BORDER : nValid = VALID_LEFT; break;
+ case RIGHT_BORDER: nValid = VALID_RIGHT; break;
+ case TOP_BORDER : nValid = VALID_TOP; break;
+ case BOTTOM_BORDER: nValid = VALID_BOTTOM; break;
+ case LEFT_BORDER_DISTANCE :
+ case RIGHT_BORDER_DISTANCE:
+ case TOP_BORDER_DISTANCE :
+ case BOTTOM_BORDER_DISTANCE:
+ nValid = VALID_DISTANCE;
+ break;
+ }
+ aBoxInfo.SetValid(nValid, TRUE);
+
+
+ aSet.Put(aBoxInfo);
+ pDoc->GetTabBorders(*pCrsr, aSet);
+
+ aSet.Put(aBoxInfo);
+ SvxBoxItem aBoxItem((const SvxBoxItem&)aSet.Get(RES_BOX));
+ ((SfxPoolItem&)aBoxItem).PutValue(aValue, pEntry->nMemberId);
+ aSet.Put(aBoxItem);
+ pDoc->SetTabBorders( *pTblCrsr, aSet );
+ }
+ break;
+ case RES_BOXATR_FORMAT:
+ {
+ SfxUInt32Item aNumberFormat(RES_BOXATR_FORMAT);
+ ((SfxPoolItem&)aNumberFormat).PutValue(aValue, 0);
+ pDoc->SetBoxAttr( *pCrsr, aNumberFormat);
+ }
+ break;
+ case FN_UNO_RANGE_ROW_LABEL:
+ {
+ sal_Bool bTmp = *(sal_Bool*)aValue.getValue();
+ if(bFirstRowAsLabel != bTmp)
+ {
+ aChartLstnrCntnr.ChartDataChanged();
+ bFirstRowAsLabel = bTmp;
+ }
+ }
+ break;
+ case FN_UNO_RANGE_COL_LABEL:
+ {
+ sal_Bool bTmp = *(sal_Bool*)aValue.getValue();
+ if(bFirstColumnAsLabel != bTmp)
+ {
+ aChartLstnrCntnr.ChartDataChanged();
+ bFirstColumnAsLabel = bTmp;
+ }
+ }
+ break;
+ default:
+ {
+ SfxItemSet aItemSet( pDoc->GetAttrPool(), pEntry->nWID, pEntry->nWID );
+ SwUnoCursorHelper::GetCrsrAttr(pCrsr->GetSelRing(),
+ aItemSet);
+
+ if (!SwUnoCursorHelper::SetCursorPropertyValue(
+ *pEntry, aValue, pCrsr->GetSelRing(), aItemSet))
+ {
+ m_pPropSet->setPropertyValue(*pEntry, aValue, aItemSet);
+ }
+ SwUnoCursorHelper::SetCrsrAttr(pCrsr->GetSelRing(),
+ aItemSet, nsSetAttrMode::SETATTR_DEFAULT, true);
+ }
+ }
+ }
+ else
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ }
+}
+/*-- 11.12.98 14:27:35---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Any SwXCellRange::getPropertyValue(const OUString& rPropertyName) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Any aRet;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ /* ASK OLIVER
+ lcl_FormatTable(pFmt);*/
+ const SfxItemPropertySimpleEntry* pEntry =
+ m_pPropSet->getPropertyMap()->getByName(rPropertyName);
+ if(pEntry)
+ {
+ switch(pEntry->nWID )
+ {
+ case FN_UNO_TABLE_CELL_BACKGROUND:
+ {
+ SvxBrushItem aBrush( RES_BACKGROUND );
+ if(pTblCrsr->GetDoc()->GetBoxAttr( *pTblCrsr, aBrush ))
+ aBrush.QueryValue(aRet, pEntry->nMemberId);
+
+ }
+ break;
+ case RES_BOX :
+ {
+ SwDoc* pDoc = pTblCrsr->GetDoc();
+ SfxItemSet aSet(pDoc->GetAttrPool(),
+ RES_BOX, RES_BOX,
+ SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
+ 0);
+ aSet.Put(SvxBoxInfoItem( SID_ATTR_BORDER_INNER ));
+ pDoc->GetTabBorders(*pTblCrsr, aSet);
+ const SvxBoxItem& rBoxItem = ((const SvxBoxItem&)aSet.Get(RES_BOX));
+ rBoxItem.QueryValue(aRet, pEntry->nMemberId);
+ }
+ break;
+ case RES_BOXATR_FORMAT:
+ //GetAttr fuer Tabellenselektion am Doc fehlt noch
+ DBG_WARNING("not implemented");
+ break;
+ case FN_UNO_PARA_STYLE:
+ {
+ SwFmtColl *const pTmpFmt =
+ SwUnoCursorHelper::GetCurTxtFmtColl(*pTblCrsr, FALSE);
+ OUString sRet;
+ if(pFmt)
+ sRet = pTmpFmt->GetName();
+ aRet <<= sRet;
+ }
+ break;
+ case FN_UNO_RANGE_ROW_LABEL:
+ {
+ sal_Bool bTemp = bFirstRowAsLabel;
+ aRet.setValue(&bTemp, ::getCppuBooleanType());
+ }
+ break;
+ case FN_UNO_RANGE_COL_LABEL:
+ {
+ sal_Bool bTemp = bFirstColumnAsLabel;
+ aRet.setValue(&bTemp, ::getCppuBooleanType());
+ }
+ break;
+ default:
+ {
+ SfxItemSet aSet(pTblCrsr->GetDoc()->GetAttrPool(),
+ RES_CHRATR_BEGIN, RES_FRMATR_END -1,
+ RES_TXTATR_UNKNOWN_CONTAINER, RES_TXTATR_UNKNOWN_CONTAINER,
+ RES_UNKNOWNATR_CONTAINER, RES_UNKNOWNATR_CONTAINER,
+ 0L);
+ // erstmal die Attribute des Cursors
+ SwUnoTableCrsr* pCrsr = dynamic_cast<SwUnoTableCrsr*>(pTblCrsr);
+ SwUnoCursorHelper::GetCrsrAttr(pCrsr->GetSelRing(), aSet);
+ m_pPropSet->getPropertyValue(*pEntry, aSet, aRet);
+ }
+ }
+ }
+ else
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropertyName, static_cast < cppu::OWeakObject * > ( this ) );
+ }
+ return aRet;
+}
+/*-- 11.12.98 14:27:35---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::addPropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 14:27:35---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::removePropertyChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XPropertyChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 14:27:36---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::addVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+/*-- 11.12.98 14:27:36---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::removeVetoableChangeListener(const OUString& /*PropertyName*/, const uno::Reference< beans::XVetoableChangeListener > & /*aListener*/) throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+/*-----------------------------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+
+void SwXCellRange::GetDataSequence(
+ uno::Sequence< uno::Any > *pAnySeq, //-> first pointer != 0 is used
+ uno::Sequence< OUString > *pTxtSeq, //-> as output sequence
+ uno::Sequence< double > *pDblSeq, //-> (previous data gets overwritten)
+ sal_Bool bForceNumberResults ) //-> when 'true' requires to make an
+ // extra effort to return a value different
+ // from 0 even if the cell is formatted to text
+ throw (uno::RuntimeException)
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+
+ // compare to SwXCellRange::getDataArray (note different return types though)
+
+ sal_Int16 nRowCount = getRowCount();
+ sal_Int16 nColCount = getColumnCount();
+ //
+ if(!nRowCount || !nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+
+ sal_Int32 nSize = nRowCount * nColCount;
+ if (pAnySeq)
+ pAnySeq->realloc( nSize );
+ else if (pTxtSeq)
+ pTxtSeq->realloc( nSize );
+ else if (pDblSeq)
+ pDblSeq->realloc( nSize );
+ else
+ {
+ DBG_ERROR( "argument missing" );
+ return;
+ }
+ uno::Any *pAnyData = pAnySeq ? pAnySeq->getArray() : 0;
+ OUString *pTxtData = pTxtSeq ? pTxtSeq->getArray() : 0;
+ double *pDblData = pDblSeq ? pDblSeq->getArray() : 0;
+
+ sal_Int32 nDtaCnt = 0;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ double fNan;
+ ::rtl::math::setNan( & fNan );
+
+ uno::Reference< table::XCell > xCellRef;
+ for(sal_uInt16 nRow = 0; nRow < nRowCount; nRow++)
+ {
+ for(sal_uInt16 nCol = 0; nCol < nColCount; nCol++)
+ {
+ SwXCell * pXCell = lcl_CreateXCell(pFmt,
+ aRgDesc.nLeft + nCol,
+ aRgDesc.nTop + nRow);
+ //! keep (additional) reference to object to prevent implicit destruction
+ //! in following UNO calls (when object will get referenced)
+ xCellRef = pXCell;
+ SwTableBox * pBox = pXCell ? pXCell->GetTblBox() : 0;
+ if(!pBox)
+ {
+ throw uno::RuntimeException();
+ }
+ else
+ {
+ if (pAnyData)
+ {
+ // check if table box value item is set
+ BOOL bIsNum = pBox->GetFrmFmt()->GetItemState( RES_BOXATR_VALUE, FALSE ) == SFX_ITEM_SET;
+ //ULONG nNdPos = pBox->IsValidNumTxtNd( sal_True );
+ if (!bIsNum/* && ULONG_MAX == nNdPos*/)
+ pAnyData[nDtaCnt++] <<= lcl_getString(*pXCell);
+ else
+ pAnyData[nDtaCnt++] <<= lcl_getValue(*pXCell);
+ }
+ else if (pTxtData)
+ pTxtData[nDtaCnt++] = lcl_getString(*pXCell);
+ else if (pDblData)
+ {
+ double fVal = fNan;
+ if (!bForceNumberResults || table::CellContentType_TEXT != pXCell->getType())
+ fVal = lcl_getValue(*pXCell);
+ else
+ {
+ DBG_ASSERT( table::CellContentType_TEXT == pXCell->getType(),
+ "this branch of 'if' is only for text formatted cells" );
+
+ // now we'll try to get a useful numerical value
+ // from the text in the cell...
+
+ sal_uInt32 nFIndex;
+ SvNumberFormatter* pNumFormatter = pTblCrsr->GetDoc()->GetNumberFormatter();
+
+ // look for SwTblBoxNumFormat value in parents as well
+ const SfxPoolItem* pItem;
+ SwFrmFmt *pBoxFmt = pXCell->GetTblBox()->GetFrmFmt();
+ SfxItemState eState = pBoxFmt->GetAttrSet().GetItemState(RES_BOXATR_FORMAT, sal_True, &pItem);
+
+ if (eState == SFX_ITEM_SET)
+ {
+ // please note that the language of the numberformat
+ // is implicitly coded into the below value as well
+ nFIndex = ((SwTblBoxNumFormat*)pItem)->GetValue();
+
+ // since the current value indicates a text format but the call
+ // to 'IsNumberFormat' below won't work for text formats
+ // we need to get rid of the part that indicates the text format.
+ // According to ER this can be done like this:
+ nFIndex -= (nFIndex % SV_COUNTRY_LANGUAGE_OFFSET);
+ }
+ else
+ {
+ // system language is probably not the best possible choice
+ // but since we have to guess anyway (because the language of at
+ // the text is NOT the one used for the number format!)
+ // it is at least conform to to what is used in
+ // SwTableShell::Execute when
+ // SID_ATTR_NUMBERFORMAT_VALUE is set...
+ LanguageType eLang = LANGUAGE_SYSTEM;
+ nFIndex = pNumFormatter->GetStandardIndex( eLang );
+ }
+
+ OUString aTxt( lcl_getString(*pXCell) );
+ double fTmp;
+ if (pNumFormatter->IsNumberFormat( aTxt, nFIndex, fTmp ))
+ fVal = fTmp;
+ }
+ pDblData[nDtaCnt++] = fVal;
+ }
+ else {
+ DBG_ERROR( "output sequence missing" );
+ }
+ }
+ }
+ }
+ }
+ DBG_ASSERT( nDtaCnt == nSize, "size mismatch. Invalid cell range?" );
+ if (pAnySeq)
+ pAnySeq->realloc( nDtaCnt );
+ else if (pTxtSeq)
+ pTxtSeq->realloc( nDtaCnt );
+ else if (pDblSeq)
+ pDblSeq->realloc( nDtaCnt );
+}
+
+/*-- 29.04.02 11:42:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< uno::Sequence< uno::Any > > SAL_CALL SwXCellRange::getDataArray()
+ throw (uno::RuntimeException)
+{
+ // see SwXCellRange::getData also
+ // also see SwXCellRange::GetDataSequence
+
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRowCount = getRowCount();
+ sal_Int16 nColCount = getColumnCount();
+ //
+ if(!nRowCount || !nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ uno::Sequence< uno::Sequence< uno::Any > > aRowSeq(nRowCount);
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ uno::Sequence< uno::Any >* pRowArray = aRowSeq.getArray();
+ uno::Reference< table::XCell > xCellRef;
+ for(sal_uInt16 nRow = 0; nRow < nRowCount; nRow++)
+ {
+ uno::Sequence< uno::Any > aColSeq(nColCount);
+ uno::Any * pColArray = aColSeq.getArray();
+ for(sal_uInt16 nCol = 0; nCol < nColCount; nCol++)
+ {
+ SwXCell * pXCell = lcl_CreateXCell(pFmt,
+ aRgDesc.nLeft + nCol,
+ aRgDesc.nTop + nRow);
+ //! keep (additional) reference to object to prevent implicit destruction
+ //! in following UNO calls (when object will get referenced)
+ xCellRef = pXCell;
+ SwTableBox * pBox = pXCell ? pXCell->GetTblBox() : 0;
+ if(!pBox)
+ {
+ throw uno::RuntimeException();
+ }
+ else
+ {
+ // check if table box value item is set
+ SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
+ BOOL bIsNum = pBoxFmt->GetItemState( RES_BOXATR_VALUE, FALSE ) == SFX_ITEM_SET;
+ //const SfxPoolItem* pItem;
+ //SwDoc* pDoc = pXCell->GetDoc();
+ //BOOL bIsText = (SFX_ITEM_SET != pBoxFmt->GetAttrSet().GetItemState(RES_BOXATR_FORMAT, sal_True, &pItem)
+ // || pDoc->GetNumberFormatter()->IsTextFormat(((SwTblBoxNumFormat*)pItem)->GetValue())
+ // || ((SwTblBoxNumFormat*)pItem)->GetValue() == NUMBERFORMAT_TEXT);
+
+ if(!bIsNum/*bIsText*/)
+ pColArray[nCol] <<= lcl_getString(*pXCell);
+ else
+ pColArray[nCol] <<= lcl_getValue(*pXCell);
+ }
+ }
+ pRowArray[nRow] = aColSeq;
+ }
+ }
+ return aRowSeq;
+}
+/*-- 29.04.02 11:42:47---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SAL_CALL SwXCellRange::setDataArray(
+ const uno::Sequence< uno::Sequence< uno::Any > >& rArray )
+ throw (uno::RuntimeException)
+{
+ // see SwXCellRange::setData also
+
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRowCount = getRowCount();
+ sal_Int16 nColCount = getColumnCount();
+ if(!nRowCount || !nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt )
+ {
+ if(rArray.getLength() != nRowCount)
+ {
+ throw uno::RuntimeException();
+ }
+ const uno::Sequence< uno::Any >* pRowArray = rArray.getConstArray();
+ for(sal_uInt16 nRow = 0; nRow < nRowCount; nRow++)
+ {
+ const uno::Sequence< uno::Any >& rColSeq = pRowArray[nRow];
+ if(rColSeq.getLength() != nColCount)
+ {
+ throw uno::RuntimeException();
+ }
+ const uno::Any * pColArray = rColSeq.getConstArray();
+ uno::Reference< table::XCell > xCellRef;
+ for(sal_uInt16 nCol = 0; nCol < nColCount; nCol++)
+ {
+ SwXCell * pXCell = lcl_CreateXCell(pFmt,
+ aRgDesc.nLeft + nCol,
+ aRgDesc.nTop + nRow);
+ //! keep (additional) reference to object to prevent implicit destruction
+ //! in following UNO calls (when object will get referenced)
+ xCellRef = pXCell;
+ SwTableBox * pBox = pXCell ? pXCell->GetTblBox() : 0;
+ if(!pBox)
+ {
+ throw uno::RuntimeException();
+ }
+ else
+ {
+ const uno::Any &rAny = pColArray[nCol];
+ if (uno::TypeClass_STRING == rAny.getValueTypeClass())
+ lcl_setString( *pXCell, *(rtl::OUString *) rAny.getValue() );
+ else
+ {
+ double d = 0;
+ // #i20067# don't throw exception just do nothing if
+ // there is no value set
+ if( (rAny >>= d) )
+ lcl_setValue( *pXCell, d );
+ else
+ lcl_setString( *pXCell, OUString(), TRUE );
+ }
+ }
+ }
+ }
+ }
+}
+/*-- 11.12.98 14:27:36---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< uno::Sequence< double > > SwXCellRange::getData(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRowCount = getRowCount();
+ sal_Int16 nColCount = getColumnCount();
+ //
+ if(!nRowCount || !nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ uno::Sequence< uno::Sequence< double > > aRowSeq(bFirstRowAsLabel ? nRowCount - 1 : nRowCount);
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ uno::Sequence< double >* pRowArray = aRowSeq.getArray();
+
+ sal_uInt16 nRowStart = bFirstRowAsLabel ? 1 : 0;
+ for(sal_uInt16 nRow = nRowStart; nRow < nRowCount; nRow++)
+ {
+ uno::Sequence< double > aColSeq(bFirstColumnAsLabel ? nColCount - 1 : nColCount);
+ double * pArray = aColSeq.getArray();
+ sal_uInt16 nColStart = bFirstColumnAsLabel ? 1 : 0;
+ for(sal_uInt16 nCol = nColStart; nCol < nColCount; nCol++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(nCol, nRow);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ pArray[nCol - nColStart] = xCell->getValue();
+ }
+ pRowArray[nRow - nRowStart] = aColSeq;
+ }
+ }
+ return aRowSeq;
+}
+/*-- 11.12.98 14:27:37---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::setData(const uno::Sequence< uno::Sequence< double > >& rData)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRowCount = getRowCount();
+ sal_Int16 nColCount = getColumnCount();
+ if(!nRowCount || !nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt )
+ {
+ sal_uInt16 nRowStart = bFirstRowAsLabel ? 1 : 0;
+ if(rData.getLength() < nRowCount - nRowStart)
+ {
+ throw uno::RuntimeException();
+ }
+ const uno::Sequence< double >* pRowArray = rData.getConstArray();
+ for(sal_uInt16 nRow = nRowStart; nRow < nRowCount; nRow++)
+ {
+ const uno::Sequence< double >& rColSeq = pRowArray[nRow - nRowStart];
+ sal_uInt16 nColStart = bFirstColumnAsLabel ? 1 : 0;
+ if(rColSeq.getLength() < nColCount - nColStart)
+ {
+ throw uno::RuntimeException();
+ }
+ const double * pColArray = rColSeq.getConstArray();
+ for(sal_uInt16 nCol = nColStart; nCol < nColCount; nCol++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(nCol, nRow);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ xCell->setValue(pColArray[nCol - nColStart]);
+ }
+ }
+ }
+}
+/*-- 11.12.98 14:27:37---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXCellRange::getRowDescriptions(void)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nRowCount = getRowCount();
+ if(!nRowCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ uno::Sequence< OUString > aRet(bFirstColumnAsLabel ? nRowCount - 1 : nRowCount);
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ OUString* pArray = aRet.getArray();
+ if(bFirstColumnAsLabel)
+ {
+ sal_uInt16 nStart = bFirstRowAsLabel ? 1 : 0;
+ for(sal_uInt16 i = nStart; i < nRowCount; i++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(0, i);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
+ pArray[i - nStart] = xText->getString();
+ }
+ }
+ else
+ {
+ DBG_ERROR("Wo kommen die Labels her?");
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+}
+/*-- 11.12.98 14:27:37---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::setRowDescriptions(const uno::Sequence< OUString >& rRowDesc)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ sal_Int16 nRowCount = getRowCount();
+ if(!nRowCount || rRowDesc.getLength() < bFirstRowAsLabel ? nRowCount - 1 : nRowCount)
+ {
+ throw uno::RuntimeException();
+ }
+ const OUString* pArray = rRowDesc.getConstArray();
+ if(bFirstColumnAsLabel)
+ {
+ sal_uInt16 nStart = bFirstRowAsLabel ? 1 : 0;
+ for(sal_uInt16 i = nStart; i < nRowCount; i++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(0, i);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
+ xText->setString(pArray[i - nStart]);
+ }
+ }
+ else
+ {
+ DBG_ERROR("Wohin mit den Labels?");
+ }
+ }
+}
+/*-- 11.12.98 14:27:37---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXCellRange::getColumnDescriptions(void)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nColCount = getColumnCount();
+ if(!nColCount)
+ {
+ uno::RuntimeException aRuntime;
+ aRuntime.Message = C2U("Table too complex");
+ throw aRuntime;
+ }
+ uno::Sequence< OUString > aRet(bFirstRowAsLabel ? nColCount - 1 : nColCount);
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ OUString* pArray = aRet.getArray();
+ if(bFirstRowAsLabel)
+ {
+ sal_uInt16 nStart = bFirstColumnAsLabel ? 1 : 0;
+ for(sal_uInt16 i = nStart; i < nColCount; i++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(i, 0);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
+ pArray[i - nStart] = xText->getString();
+ }
+ }
+ else
+ {
+ DBG_ERROR("Wo kommen die Labels her?");
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+}
+/*-- 11.12.98 14:27:37---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::setColumnDescriptions(const uno::Sequence< OUString >& ColumnDesc)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int16 nColCount = getColumnCount();
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ {
+ const OUString* pArray = ColumnDesc.getConstArray();
+ if(bFirstRowAsLabel && ColumnDesc.getLength() >= nColCount - bFirstColumnAsLabel ? 1 : 0)
+ {
+ sal_uInt16 nStart = bFirstColumnAsLabel ? 1 : 0;
+ for(sal_uInt16 i = nStart; i < nColCount; i++)
+ {
+ uno::Reference< table::XCell > xCell = getCellByPosition(i, 0);
+ if(!xCell.is())
+ {
+ throw uno::RuntimeException();
+ }
+ uno::Reference< text::XText > xText(xCell, uno::UNO_QUERY);
+
+ xText->setString(pArray[i - nStart]);
+ }
+ }
+ else
+ {
+ DBG_ERROR("Wo kommen die Labels her?");
+ }
+ }
+}
+/*-- 11.12.98 14:27:38---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::addChartDataChangeEventListener(const uno::Reference< chart::XChartDataChangeEventListener > & aListener) throw( uno::RuntimeException )
+{
+ if(!GetRegisteredIn())
+ throw uno::RuntimeException();
+ aChartLstnrCntnr.AddListener(aListener.get());
+}
+/*-- 11.12.98 14:27:38---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::removeChartDataChangeEventListener(const uno::Reference< chart::XChartDataChangeEventListener > & aListener) throw( uno::RuntimeException )
+{
+ if(!GetRegisteredIn() || !aChartLstnrCntnr.RemoveListener(aListener.get()))
+ throw uno::RuntimeException();
+}
+/* -----------------08.03.99 15:36-------------------
+ *
+ * --------------------------------------------------*/
+sal_Bool SwXCellRange::isNotANumber(double /*fNumber*/) throw( uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+ return sal_False;
+
+}
+/* -----------------08.03.99 15:36-------------------
+ *
+ * --------------------------------------------------*/
+double SwXCellRange::getNotANumber(void) throw( uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+ return 0.;
+}
+/*-- 11.12.98 14:27:38---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< beans::PropertyValue > SwXCellRange::createSortDescriptor(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+
+ return SwUnoCursorHelper::CreateSortDescriptor(true);
+}
+/*-- 11.12.98 14:27:39---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SAL_CALL SwXCellRange::sort(const uno::Sequence< beans::PropertyValue >& rDescriptor)
+ throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwSortOptions aSortOpt;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt &&
+ SwUnoCursorHelper::ConvertSortProperties(rDescriptor, aSortOpt))
+ {
+ SwUnoTableCrsr* pTableCrsr = dynamic_cast<SwUnoTableCrsr*>(pTblCrsr);
+ pTableCrsr->MakeBoxSels();
+ UnoActionContext aContext( pFmt->GetDoc() );
+ pFmt->GetDoc()->SortTbl(pTableCrsr->GetBoxes(), aSortOpt);
+ }
+}
+/* -----------------27.04.98 16:54-------------------
+ *
+ * --------------------------------------------------*/
+sal_uInt16 SwXCellRange::getColumnCount(void)
+{
+ return static_cast< sal_uInt16 >(aRgDesc.nRight - aRgDesc.nLeft + 1);
+}
+/* -----------------27.04.98 16:54-------------------
+ *
+ * --------------------------------------------------*/
+sal_uInt16 SwXCellRange::getRowCount(void)
+{
+ return static_cast< sal_uInt16 >(aRgDesc.nBottom - aRgDesc.nTop + 1);
+}
+/* -----------------------------05.06.01 09:19--------------------------------
+
+ ---------------------------------------------------------------------------*/
+const SwUnoCrsr* SwXCellRange::GetTblCrsr() const
+{
+ const SwUnoCrsr* pRet = 0;
+ SwFrmFmt* pFmt = GetFrmFmt();
+ if(pFmt)
+ pRet = pTblCrsr;
+ return pRet;
+}
+
+/*-- 11.12.98 14:27:39---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXCellRange::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew );
+ if(!GetRegisteredIn() || !aCursorDepend.GetRegisteredIn())
+ {
+ /*
+ * Not sure if this will cause a memory leak - this pTblCrsr
+ * is deleted in SwDoc and GPFs here when deleted again
+ * if(!aCursorDepend.GetRegisteredIn())
+ delete pTblCrsr;
+ */
+ pTblCrsr = 0;
+ aChartLstnrCntnr.Disposing();
+ }
+ else
+ aChartLstnrCntnr.ChartDataChanged();
+}
+/******************************************************************
+ * SwXTableRows
+ ******************************************************************/
+/* -----------------------------19.04.00 15:22--------------------------------
+
+ ---------------------------------------------------------------------------*/
+OUString SwXTableRows::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXTableRows");
+}
+/* -----------------------------19.04.00 15:22--------------------------------
+
+ ---------------------------------------------------------------------------*/
+BOOL SwXTableRows::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ return C2U("com.sun.star.text.TableRows") == rServiceName;
+}
+/* -----------------------------19.04.00 15:22--------------------------------
+
+ ---------------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXTableRows::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(1);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.text.TableRows");
+ return aRet;
+}
+TYPEINIT1(SwXTableRows, SwClient);
+/*-- 03.02.99 07:37:41---------------------------------------------------
+ -----------------------------------------------------------------------*/
+SwXTableRows::SwXTableRows(SwFrmFmt& rFrmFmt) :
+ SwClient(&rFrmFmt)
+{
+}
+/*-- 03.02.99 07:37:41---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXTableRows::~SwXTableRows()
+{
+}
+/*-- 03.02.99 07:37:41---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Int32 SwXTableRows::getCount(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int32 nRet = 0;
+ SwFrmFmt* pFrmFmt = GetFrmFmt();
+ if(!pFrmFmt)
+ throw uno::RuntimeException();
+ else
+ {
+ SwTable* pTable = SwTable::FindTable( pFrmFmt );
+ nRet = pTable->GetTabLines().Count();
+ }
+ return nRet;
+}
+/*-- 03.02.99 07:37:41---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Any SwXTableRows::getByIndex(sal_Int32 nIndex)
+ throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Any aRet;
+ SwFrmFmt* pFrmFmt = GetFrmFmt();
+ if(!pFrmFmt || nIndex < 0 )
+ throw lang::IndexOutOfBoundsException();
+ else
+ {
+ SwTable* pTable = SwTable::FindTable( pFrmFmt );
+ if(pTable->GetTabLines().Count() > nIndex)
+ {
+ SwTableLine* pLine = pTable->GetTabLines().GetObject((sal_uInt16)nIndex);
+ SwClientIter aIter( *pFrmFmt );
+ SwXTextTableRow* pXRow = (SwXTextTableRow*)aIter.
+ First( TYPE( SwXTextTableRow ));
+ while( pXRow )
+ {
+ // gibt es eine passende Zelle bereits?
+ if(pXRow->GetTblRow() == pLine)
+ break;
+ pXRow = (SwXTextTableRow*)aIter.Next();
+ }
+ //sonst anlegen
+ if(!pXRow)
+ pXRow = new SwXTextTableRow(pFrmFmt, pLine);
+ uno::Reference< beans::XPropertySet > xRet =
+ (beans::XPropertySet*)pXRow;
+ aRet.setValue(&xRet, ::getCppuType((const uno::Reference<beans::XPropertySet>*)0));
+ }
+ else
+ throw lang::IndexOutOfBoundsException();
+ }
+ return aRet;
+}
+/*-- 03.02.99 07:37:42---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Type SAL_CALL SwXTableRows::getElementType(void) throw( uno::RuntimeException )
+{
+ return ::getCppuType((const uno::Reference<beans::XPropertySet>*)0);
+}
+/*-- 03.02.99 07:37:42---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwXTableRows::hasElements(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFrmFmt = GetFrmFmt();
+ if(!pFrmFmt)
+ throw uno::RuntimeException();
+ //es gibt keine Tabelle ohne Zeilen
+ return sal_True;
+}
+/*-- 03.02.99 07:37:42---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTableRows::insertByIndex(sal_Int32 nIndex, sal_Int32 nCount) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ if (nCount == 0)
+ return;
+ SwFrmFmt* pFrmFmt = GetFrmFmt();
+ if(!pFrmFmt)
+ throw uno::RuntimeException();
+ else
+ {
+ SwTable* pTable = SwTable::FindTable( pFrmFmt );
+ if(!pTable->IsTblComplex())
+ {
+ sal_uInt16 nRowCount = pTable->GetTabLines().Count();
+ if (nCount <= 0 || !(0 <= nIndex && nIndex <= nRowCount))
+ {
+ uno::RuntimeException aExcept;
+ aExcept.Message = C2U("Illegal arguments");
+ throw aExcept;
+ }
+
+ String sTLName = lcl_GetCellName(0, nIndex);
+ const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
+ sal_Bool bAppend = sal_False;
+ if(!pTLBox)
+ {
+ bAppend = sal_True;
+ // am Ende anfuegen, dazu muss der Cursor in die letzte Zeile!
+ SwTableLines& rLines = pTable->GetTabLines();
+ SwTableLine* pLine = rLines.GetObject(rLines.Count() -1);
+ SwTableBoxes& rBoxes = pLine->GetTabBoxes();
+ pTLBox = rBoxes.GetObject(0);
+ }
+ if(pTLBox)
+ {
+ const SwStartNode* pSttNd = pTLBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ // Cursor in die obere linke Zelle des Ranges setzen
+ UnoActionContext aAction(pFrmFmt->GetDoc());
+ SwUnoCrsr* pUnoCrsr = pFrmFmt->GetDoc()->CreateUnoCrsr(aPos, sal_True);
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+
+ {
+ // remove actions
+ UnoActionRemoveContext aRemoveContext(pUnoCrsr->GetDoc());
+ }
+
+ pFrmFmt->GetDoc()->InsertRow(*pUnoCrsr, (sal_uInt16)nCount, bAppend);
+ delete pUnoCrsr;
+ }
+ }
+ }
+}
+/*-- 03.02.99 07:37:43---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTableRows::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ if (nCount == 0)
+ return;
+ SwFrmFmt* pFrmFmt = GetFrmFmt();
+ if(!pFrmFmt || nIndex < 0 || nCount <=0 )
+ throw uno::RuntimeException();
+ else
+ {
+ BOOL bSuccess = FALSE;
+ SwTable* pTable = SwTable::FindTable( pFrmFmt );
+ if(!pTable->IsTblComplex())
+ {
+ String sTLName = lcl_GetCellName(0, nIndex);
+ const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
+ if(pTLBox)
+ {
+ {
+ // hier muessen die Actions aufgehoben werden
+ UnoActionRemoveContext aRemoveContext(pFrmFmt->GetDoc());
+ }
+ const SwStartNode* pSttNd = pTLBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ // Cursor in die obere linke Zelle des Ranges setzen
+ SwUnoCrsr* pUnoCrsr = pFrmFmt->GetDoc()->CreateUnoCrsr(aPos, sal_True);
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ pUnoCrsr->SetRemainInSection( sal_False );
+ String sBLName = lcl_GetCellName(0, nIndex + nCount - 1);
+ const SwTableBox* pBLBox = pTable->GetTblBox( sBLName );
+ if(pBLBox)
+ {
+ pUnoCrsr->SetMark();
+ pUnoCrsr->GetPoint()->nNode = *pBLBox->GetSttNd();
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ SwUnoTableCrsr* pCrsr =
+ dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pCrsr->MakeBoxSels();
+ { // Die Klammer ist wichtig
+ UnoActionContext aAction(pFrmFmt->GetDoc());
+ pFrmFmt->GetDoc()->DeleteRow(*pUnoCrsr);
+ delete pUnoCrsr;
+ bSuccess = TRUE;
+ }
+ {
+ // hier muessen die Actions aufgehoben werden
+ UnoActionRemoveContext aRemoveContext(pFrmFmt->GetDoc());
+ }
+ }
+ }
+ }
+ if(!bSuccess)
+ {
+ uno::RuntimeException aExcept;
+ aExcept.Message = C2U("Illegal arguments");
+ throw aExcept;
+ }
+ }
+}
+/*-- 03.02.99 07:37:43---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTableRows::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+}
+
+/******************************************************************
+ * SwXTableColumns
+ ******************************************************************/
+/* -----------------------------19.04.00 15:23--------------------------------
+
+ ---------------------------------------------------------------------------*/
+OUString SwXTableColumns::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXTableColumns");
+}
+/* -----------------------------19.04.00 15:23--------------------------------
+
+ ---------------------------------------------------------------------------*/
+BOOL SwXTableColumns::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ return C2U("com.sun.star.text.TableColumns") == rServiceName;
+}
+/* -----------------------------19.04.00 15:23--------------------------------
+
+ ---------------------------------------------------------------------------*/
+uno::Sequence< OUString > SwXTableColumns::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(1);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.text.TableColumns");
+ return aRet;
+}
+TYPEINIT1(SwXTableColumns, SwClient);
+/*-- 03.02.99 07:37:41---------------------------------------------------
+ -----------------------------------------------------------------------*/
+SwXTableColumns::SwXTableColumns(SwFrmFmt& rFrmFmt) :
+ SwClient(&rFrmFmt)
+{
+}
+/*-- 03.02.99 07:37:41---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SwXTableColumns::~SwXTableColumns()
+{
+}
+/*-- 03.02.99 07:37:41---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Int32 SwXTableColumns::getCount(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ sal_Int32 nRet = 0;
+ SwFrmFmt* pFrmFmt = GetFrmFmt();
+ if(!pFrmFmt)
+ throw uno::RuntimeException();
+ else
+ {
+ SwTable* pTable = SwTable::FindTable( pFrmFmt );
+ if(!pTable->IsTblComplex())
+ {
+ SwTableLines& rLines = pTable->GetTabLines();
+ SwTableLine* pLine = rLines.GetObject(0);
+ nRet = pLine->GetTabBoxes().Count();
+ }
+ }
+ return nRet;
+}
+/*-- 03.02.99 07:37:41---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Any SwXTableColumns::getByIndex(sal_Int32 nIndex)
+ throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ uno::Reference< uno::XInterface > xRet;
+ SwFrmFmt* pFrmFmt = GetFrmFmt();
+ if(!pFrmFmt)
+ throw uno::RuntimeException();
+ else
+ {
+ USHORT nCount = 0;
+ SwTable* pTable = SwTable::FindTable( pFrmFmt );
+ if(!pTable->IsTblComplex())
+ {
+ SwTableLines& rLines = pTable->GetTabLines();
+ SwTableLine* pLine = rLines.GetObject(0);
+ nCount = pLine->GetTabBoxes().Count();
+ }
+ if(nCount <= nIndex || nIndex < 0)
+ throw lang::IndexOutOfBoundsException();
+ xRet = uno::Reference<uno::XInterface>(); //!! writer tables do not have columns !!
+ }
+ return uno::Any(&xRet, ::getCppuType((const uno::Reference<uno::XInterface>*)0));
+}
+/*-- 03.02.99 07:37:42---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+
+uno::Type SAL_CALL SwXTableColumns::getElementType(void) throw( uno::RuntimeException )
+{
+ return ::getCppuType((uno::Reference<uno::XInterface>*)0);
+}
+/*-- 03.02.99 07:37:42---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+sal_Bool SwXTableColumns::hasElements(void) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ SwFrmFmt* pFrmFmt = GetFrmFmt();
+ if(!pFrmFmt)
+ throw uno::RuntimeException();
+ return sal_True;
+}
+/*-- 03.02.99 07:37:42---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTableColumns::insertByIndex(sal_Int32 nIndex, sal_Int32 nCount) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ if (nCount == 0)
+ return;
+ SwFrmFmt* pFrmFmt = GetFrmFmt();
+ if(!pFrmFmt)
+ throw uno::RuntimeException();
+ else
+ {
+ SwTable* pTable = SwTable::FindTable( pFrmFmt );
+ if(!pTable->IsTblComplex())
+ {
+ SwTableLines& rLines = pTable->GetTabLines();
+ SwTableLine* pLine = rLines.GetObject(0);
+ sal_uInt16 nColCount = pLine->GetTabBoxes().Count();
+ if (nCount <= 0 || !(0 <= nIndex && nIndex <= nColCount))
+ {
+ uno::RuntimeException aExcept;
+ aExcept.Message = C2U("Illegal arguments");
+ throw aExcept;
+ }
+
+ String sTLName = lcl_GetCellName(nIndex, 0);
+ const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
+ sal_Bool bAppend = sal_False;
+ if(!pTLBox)
+ {
+ bAppend = sal_True;
+ // am Ende anfuegen, dazu muss der Cursor in die letzte Spalte!
+ SwTableBoxes& rBoxes = pLine->GetTabBoxes();
+ pTLBox = rBoxes.GetObject(rBoxes.Count() - 1);
+ }
+ if(pTLBox)
+ {
+ const SwStartNode* pSttNd = pTLBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ UnoActionContext aAction(pFrmFmt->GetDoc());
+ SwUnoCrsr* pUnoCrsr = pFrmFmt->GetDoc()->CreateUnoCrsr(aPos, sal_True);
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+
+ {
+ // remove actions
+ UnoActionRemoveContext aRemoveContext(pUnoCrsr->GetDoc());
+ }
+
+ pFrmFmt->GetDoc()->InsertCol(*pUnoCrsr, (sal_uInt16)nCount, bAppend);
+ delete pUnoCrsr;
+ }
+ }
+ }
+}
+/*-- 03.02.99 07:37:43---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTableColumns::removeByIndex(sal_Int32 nIndex, sal_Int32 nCount) throw( uno::RuntimeException )
+{
+ vos::OGuard aGuard(Application::GetSolarMutex());
+ if (nCount == 0)
+ return;
+ SwFrmFmt* pFrmFmt = GetFrmFmt();
+ if(!pFrmFmt|| nIndex < 0 || nCount <=0 )
+ throw uno::RuntimeException();
+ else
+ {
+ BOOL bSuccess = FALSE;
+ SwTable* pTable = SwTable::FindTable( pFrmFmt );
+ if(!pTable->IsTblComplex())
+ {
+ String sTLName = lcl_GetCellName(nIndex, 0);
+ const SwTableBox* pTLBox = pTable->GetTblBox( sTLName );
+ if(pTLBox)
+ {
+ {
+ // hier muessen die Actions aufgehoben werden
+ UnoActionRemoveContext aRemoveContext(pFrmFmt->GetDoc());
+ }
+ const SwStartNode* pSttNd = pTLBox->GetSttNd();
+ SwPosition aPos(*pSttNd);
+ // Cursor in die obere linke Zelle des Ranges setzen
+ SwUnoCrsr* pUnoCrsr = pFrmFmt->GetDoc()->CreateUnoCrsr(aPos, sal_True);
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ pUnoCrsr->SetRemainInSection( sal_False );
+ String sTRName = lcl_GetCellName(nIndex + nCount - 1, 0);
+ const SwTableBox* pTRBox = pTable->GetTblBox( sTRName );
+ if(pTRBox)
+ {
+ pUnoCrsr->SetMark();
+ pUnoCrsr->GetPoint()->nNode = *pTRBox->GetSttNd();
+ pUnoCrsr->Move( fnMoveForward, fnGoNode );
+ SwUnoTableCrsr* pCrsr =
+ dynamic_cast<SwUnoTableCrsr*>(pUnoCrsr);
+ pCrsr->MakeBoxSels();
+ { // Die Klammer ist wichtig
+ UnoActionContext aAction(pFrmFmt->GetDoc());
+ pFrmFmt->GetDoc()->DeleteCol(*pUnoCrsr);
+ delete pUnoCrsr;
+ bSuccess = TRUE;
+ }
+ {
+ // hier muessen die Actions aufgehoben werden
+ UnoActionRemoveContext aRemoveContext(pFrmFmt->GetDoc());
+ }
+ }
+ }
+ }
+ if(!bSuccess)
+ {
+ uno::RuntimeException aExcept;
+ aExcept.Message = C2U("Illegal arguments");
+ throw aExcept;
+ }
+ }
+}
+/*-- 03.02.99 07:37:43---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SwXTableColumns::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+}
+/* -----------------------------22.09.00 11:11--------------------------------
+
+ ---------------------------------------------------------------------------*/
+void SwChartEventListenerContainer::ChartDataChanged()
+{
+ if(pListenerArr)
+ {
+ //TODO: find appropriate settings of the Event
+ lang::EventObject aObj(pxParent);
+ chart::ChartDataChangeEvent aEvent;
+ aEvent.Type = chart::ChartDataChangeType_ALL;
+ aEvent.StartColumn = 0;
+ aEvent.EndColumn = 1;
+ aEvent.StartRow = 0;
+ aEvent.EndRow = 1;
+
+ for(sal_uInt16 i = 0; i < pListenerArr->Count(); i++)
+ {
+ try
+ {
+ XEventListenerPtr pElem = pListenerArr->GetObject(i);
+ uno::Reference<lang::XEventListener> xEventListener = *pElem;
+ uno::Reference<chart::XChartDataChangeEventListener> xChartEventListener = (chart::XChartDataChangeEventListener*)(*pElem).get();
+ xChartEventListener->chartDataChanged( aEvent );
+ }
+ catch(uno::Exception const &)
+ {
+ }
+ }
+ }
+}
+
+///////////////////////////////////////////////////////////////////////////
+