xref: /trunk/main/sc/source/ui/unoobj/cellsuno.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sc.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir #include "scitems.hxx"
33*cdf0e10cSrcweir #include <editeng/eeitem.hxx>
34*cdf0e10cSrcweir #include <svx/svdpool.hxx>
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir #include <svx/algitem.hxx>
37*cdf0e10cSrcweir #include <editeng/boxitem.hxx>
38*cdf0e10cSrcweir #include <editeng/brshitem.hxx>
39*cdf0e10cSrcweir #include <editeng/editeng.hxx>
40*cdf0e10cSrcweir #include <editeng/flditem.hxx>
41*cdf0e10cSrcweir #include <svx/fmdpage.hxx>
42*cdf0e10cSrcweir #include <editeng/langitem.hxx>
43*cdf0e10cSrcweir #include <sfx2/linkmgr.hxx>
44*cdf0e10cSrcweir #include <svl/srchitem.hxx>
45*cdf0e10cSrcweir #include <svx/unomid.hxx>
46*cdf0e10cSrcweir #include <editeng/unoprnms.hxx>
47*cdf0e10cSrcweir #include <editeng/unotext.hxx>
48*cdf0e10cSrcweir #include <svx/svdpage.hxx>
49*cdf0e10cSrcweir #include <sfx2/bindings.hxx>
50*cdf0e10cSrcweir #include <svl/zforlist.hxx>
51*cdf0e10cSrcweir #include <svl/zformat.hxx>
52*cdf0e10cSrcweir #include <rtl/uuid.h>
53*cdf0e10cSrcweir #include <float.h>              // DBL_MIN
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir #include <com/sun/star/awt/XBitmap.hpp>
56*cdf0e10cSrcweir #include <com/sun/star/util/CellProtection.hpp>
57*cdf0e10cSrcweir #include <com/sun/star/table/CellHoriJustify.hpp>
58*cdf0e10cSrcweir #include <com/sun/star/table/CellOrientation.hpp>
59*cdf0e10cSrcweir #include <com/sun/star/table/CellVertJustify.hpp>
60*cdf0e10cSrcweir #include <com/sun/star/table/ShadowFormat.hpp>
61*cdf0e10cSrcweir #include <com/sun/star/table/TableBorder.hpp>
62*cdf0e10cSrcweir #include <com/sun/star/sheet/CellFlags.hpp>
63*cdf0e10cSrcweir #include <com/sun/star/sheet/FormulaResult.hpp>
64*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyAttribute.hpp>
65*cdf0e10cSrcweir #include <com/sun/star/lang/Locale.hpp>
66*cdf0e10cSrcweir #include <com/sun/star/beans/TolerantPropertySetResultType.hpp>
67*cdf0e10cSrcweir #include <com/sun/star/beans/SetPropertyTolerantFailed.hpp>
68*cdf0e10cSrcweir #include <com/sun/star/text/WritingMode2.hpp>
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir #include "autoform.hxx"
71*cdf0e10cSrcweir #include "cellsuno.hxx"
72*cdf0e10cSrcweir #include "cursuno.hxx"
73*cdf0e10cSrcweir #include "textuno.hxx"
74*cdf0e10cSrcweir #include "editsrc.hxx"
75*cdf0e10cSrcweir #include "notesuno.hxx"
76*cdf0e10cSrcweir #include "fielduno.hxx"
77*cdf0e10cSrcweir #include "docuno.hxx"       // ScTableColumnsObj etc
78*cdf0e10cSrcweir #include "datauno.hxx"
79*cdf0e10cSrcweir #include "dapiuno.hxx"
80*cdf0e10cSrcweir #include "chartuno.hxx"
81*cdf0e10cSrcweir #include "fmtuno.hxx"
82*cdf0e10cSrcweir #include "miscuno.hxx"
83*cdf0e10cSrcweir #include "convuno.hxx"
84*cdf0e10cSrcweir #include "srchuno.hxx"
85*cdf0e10cSrcweir #include "targuno.hxx"
86*cdf0e10cSrcweir #include "tokenuno.hxx"
87*cdf0e10cSrcweir #include "eventuno.hxx"
88*cdf0e10cSrcweir #include "docsh.hxx"
89*cdf0e10cSrcweir #include "markdata.hxx"
90*cdf0e10cSrcweir #include "patattr.hxx"
91*cdf0e10cSrcweir #include "docpool.hxx"
92*cdf0e10cSrcweir #include "docfunc.hxx"
93*cdf0e10cSrcweir #include "dbdocfun.hxx"
94*cdf0e10cSrcweir #include "olinefun.hxx"
95*cdf0e10cSrcweir #include "hints.hxx"
96*cdf0e10cSrcweir #include "cell.hxx"
97*cdf0e10cSrcweir #include "undocell.hxx"
98*cdf0e10cSrcweir #include "undotab.hxx"
99*cdf0e10cSrcweir #include "undoblk.hxx"      // fuer lcl_ApplyBorder - nach docfunc verschieben!
100*cdf0e10cSrcweir #include "stlsheet.hxx"
101*cdf0e10cSrcweir #include "dbcolect.hxx"
102*cdf0e10cSrcweir #include "attrib.hxx"
103*cdf0e10cSrcweir #include "chartarr.hxx"
104*cdf0e10cSrcweir #include "chartlis.hxx"
105*cdf0e10cSrcweir #include "drwlayer.hxx"
106*cdf0e10cSrcweir #include "printfun.hxx"
107*cdf0e10cSrcweir #include "prnsave.hxx"
108*cdf0e10cSrcweir #include "tablink.hxx"
109*cdf0e10cSrcweir #include "dociter.hxx"
110*cdf0e10cSrcweir #include "rangeutl.hxx"
111*cdf0e10cSrcweir #include "conditio.hxx"
112*cdf0e10cSrcweir #include "validat.hxx"
113*cdf0e10cSrcweir #include "sc.hrc"
114*cdf0e10cSrcweir #include "brdcst.hxx"
115*cdf0e10cSrcweir #include "unoguard.hxx"
116*cdf0e10cSrcweir #include "cellform.hxx"
117*cdf0e10cSrcweir #include "globstr.hrc"
118*cdf0e10cSrcweir #include "unonames.hxx"
119*cdf0e10cSrcweir #include "styleuno.hxx"
120*cdf0e10cSrcweir #include "rangeseq.hxx"
121*cdf0e10cSrcweir #include "unowids.hxx"
122*cdf0e10cSrcweir #include "paramisc.hxx"
123*cdf0e10cSrcweir #include "formula/errorcodes.hxx"
124*cdf0e10cSrcweir #include "unoreflist.hxx"
125*cdf0e10cSrcweir #include "formula/grammar.hxx"
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir #include <list>
128*cdf0e10cSrcweir 
129*cdf0e10cSrcweir using namespace com::sun::star;
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir //------------------------------------------------------------------------
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir class ScNamedEntry
135*cdf0e10cSrcweir {
136*cdf0e10cSrcweir     String  aName;
137*cdf0e10cSrcweir     ScRange aRange;
138*cdf0e10cSrcweir 
139*cdf0e10cSrcweir public:
140*cdf0e10cSrcweir             ScNamedEntry(const String& rN, const ScRange& rR) :
141*cdf0e10cSrcweir                 aName(rN), aRange(rR) {}
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir     const String&   GetName() const     { return aName; }
144*cdf0e10cSrcweir     const ScRange&  GetRange() const    { return aRange; }
145*cdf0e10cSrcweir };
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir //------------------------------------------------------------------------
149*cdf0e10cSrcweir 
150*cdf0e10cSrcweir //  Die Namen in den Maps muessen (nach strcmp) sortiert sein!
151*cdf0e10cSrcweir //! statt Which-ID 0 special IDs verwenden, und nicht ueber Namen vergleichen !!!!!!!!!
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir //  Left/Right/Top/BottomBorder are mapped directly to the core items,
154*cdf0e10cSrcweir //  not collected/applied to the borders of a range -> ATTR_BORDER can be used directly
155*cdf0e10cSrcweir 
156*cdf0e10cSrcweir const SfxItemPropertySet* lcl_GetCellsPropertySet()
157*cdf0e10cSrcweir {
158*cdf0e10cSrcweir     static SfxItemPropertyMapEntry aCellsPropertyMap_Impl[] =
159*cdf0e10cSrcweir     {
160*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
161*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
162*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
163*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
164*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
165*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
166*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
167*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
168*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
169*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
170*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
171*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
172*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
173*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
174*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
175*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
176*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
177*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
178*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
179*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
180*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
181*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
182*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
183*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
184*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
185*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
186*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
187*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
188*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
189*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
190*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
191*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
192*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
193*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
194*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
195*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
196*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
197*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
198*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
199*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
200*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
201*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
202*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
203*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
204*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
205*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
206*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
207*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
208*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
209*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
210*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
211*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
212*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
213*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
214*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
215*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST },
216*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
217*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
218*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
219*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
220*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
221*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
222*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
223*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
224*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
225*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
226*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
227*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
228*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
229*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
230*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
231*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
232*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
233*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
234*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
235*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
236*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
237*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
238*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
239*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
240*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
241*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
242*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
243*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
244*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
245*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
246*cdf0e10cSrcweir         {0,0,0,0,0,0}
247*cdf0e10cSrcweir     };
248*cdf0e10cSrcweir     static SfxItemPropertySet aCellsPropertySet( aCellsPropertyMap_Impl );
249*cdf0e10cSrcweir     return &aCellsPropertySet;
250*cdf0e10cSrcweir }
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir //  CellRange enthaelt alle Eintraege von Cells, zusaetzlich eigene Eintraege
253*cdf0e10cSrcweir //  mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt).
254*cdf0e10cSrcweir 
255*cdf0e10cSrcweir const SfxItemPropertySet* lcl_GetRangePropertySet()
256*cdf0e10cSrcweir {
257*cdf0e10cSrcweir     static SfxItemPropertyMapEntry aRangePropertyMap_Impl[] =
258*cdf0e10cSrcweir     {
259*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
260*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
261*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
262*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
263*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
264*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
265*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
266*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
267*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
268*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
269*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
270*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
271*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
272*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
273*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
274*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
275*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
276*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
277*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
278*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
279*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
280*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
281*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
282*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
283*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
284*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
285*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
286*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
287*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
288*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
289*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
290*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
291*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
292*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
293*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
294*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
295*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
296*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
297*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
298*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
299*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
300*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
301*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
302*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
303*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
304*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
305*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
306*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
307*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
308*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
309*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
310*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
311*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
312*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
313*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
314*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0),   0, MID_HORJUST_HORJUST },
315*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
316*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
317*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
318*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
319*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
320*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
321*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
322*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
323*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
324*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
325*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
326*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
327*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
328*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
329*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
330*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
331*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
332*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_POS),      SC_WID_UNO_POS,     &getCppuType((awt::Point*)0),           0 | beans::PropertyAttribute::READONLY, 0 },
333*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
334*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
335*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
336*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
337*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
338*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    &getCppuType((awt::Size*)0),            0 | beans::PropertyAttribute::READONLY, 0 },
339*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
340*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
341*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
342*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
343*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
344*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
345*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
346*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
347*cdf0e10cSrcweir         {0,0,0,0,0,0}
348*cdf0e10cSrcweir     };
349*cdf0e10cSrcweir     static SfxItemPropertySet aRangePropertySet( aRangePropertyMap_Impl );
350*cdf0e10cSrcweir     return &aRangePropertySet;
351*cdf0e10cSrcweir }
352*cdf0e10cSrcweir 
353*cdf0e10cSrcweir //  Cell enthaelt alle Eintraege von CellRange, zusaetzlich eigene Eintraege
354*cdf0e10cSrcweir //  mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt).
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir const SfxItemPropertySet* lcl_GetCellPropertySet()
357*cdf0e10cSrcweir {
358*cdf0e10cSrcweir     static SfxItemPropertyMapEntry aCellPropertyMap_Impl[] =
359*cdf0e10cSrcweir     {
360*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
361*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
362*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
363*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
364*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
365*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
366*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
367*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
368*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
369*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
370*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
371*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
372*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
373*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
374*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
375*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
376*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
377*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
378*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
379*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
380*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
381*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
382*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
383*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
384*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
385*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
386*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
387*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
388*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
389*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
390*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
391*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
392*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
393*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
394*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
395*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
396*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
397*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
398*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
399*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
400*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
401*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
402*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
403*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
404*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
405*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
406*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
407*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
408*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
409*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
410*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
411*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
412*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
413*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
414*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
415*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_FORMLOC),  SC_WID_UNO_FORMLOC, &getCppuType((rtl::OUString*)0),        0, 0 },
416*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_FORMRT),   SC_WID_UNO_FORMRT,  &getCppuType((table::CellContentType*)0), 0 | beans::PropertyAttribute::READONLY, 0 },
417*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST },
418*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
419*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
420*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
421*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
422*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
423*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
424*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
425*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
426*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
427*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
428*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
429*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
430*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
431*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
432*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
433*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
434*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
435*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_POS),      SC_WID_UNO_POS,     &getCppuType((awt::Point*)0),           0 | beans::PropertyAttribute::READONLY, 0 },
436*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
437*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
438*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
439*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
440*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
441*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    &getCppuType((awt::Size*)0),            0 | beans::PropertyAttribute::READONLY, 0 },
442*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
443*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
444*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
445*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
446*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
447*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
448*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
449*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
450*cdf0e10cSrcweir         {0,0,0,0,0,0}
451*cdf0e10cSrcweir     };
452*cdf0e10cSrcweir     static SfxItemPropertySet aCellPropertySet( aCellPropertyMap_Impl );
453*cdf0e10cSrcweir     return &aCellPropertySet;
454*cdf0e10cSrcweir }
455*cdf0e10cSrcweir 
456*cdf0e10cSrcweir //  Column und Row enthalten alle Eintraege von CellRange, zusaetzlich eigene Eintraege
457*cdf0e10cSrcweir //  mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt).
458*cdf0e10cSrcweir 
459*cdf0e10cSrcweir const SfxItemPropertySet* lcl_GetColumnPropertySet()
460*cdf0e10cSrcweir {
461*cdf0e10cSrcweir     static SfxItemPropertyMapEntry aColumnPropertyMap_Impl[] =
462*cdf0e10cSrcweir     {
463*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
464*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
465*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
466*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
467*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
468*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
469*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
470*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
471*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
472*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
473*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
474*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
475*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
476*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
477*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
478*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
479*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
480*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
481*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
482*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
483*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
484*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
485*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
486*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
487*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
488*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
489*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
490*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
491*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
492*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
493*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
494*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
495*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
496*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
497*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
498*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
499*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
500*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
501*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
502*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
503*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
504*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
505*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
506*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
507*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
508*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
509*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
510*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
511*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
512*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
513*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
514*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
515*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
516*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
517*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
518*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST },
519*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
520*cdf0e10cSrcweir //      {MAP_CHAR_LEN(SC_UNONAME_CELLFILT), SC_WID_UNO_CELLFILT,&getBooleanCppuType(),                  0, 0 },
521*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_MANPAGE),  SC_WID_UNO_MANPAGE, &getBooleanCppuType(),                  0, 0 },
522*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NEWPAGE),  SC_WID_UNO_NEWPAGE, &getBooleanCppuType(),                  0, 0 },
523*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
524*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLVIS),  SC_WID_UNO_CELLVIS, &getBooleanCppuType(),                  0, 0 },
525*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
526*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
527*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
528*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_OWIDTH),   SC_WID_UNO_OWIDTH,  &getBooleanCppuType(),                  0, 0 },
529*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
530*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
531*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
532*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
533*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
534*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
535*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
536*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
537*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
538*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
539*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
540*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
541*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_POS),      SC_WID_UNO_POS,     &getCppuType((awt::Point*)0),           0 | beans::PropertyAttribute::READONLY, 0 },
542*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
543*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
544*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
545*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
546*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
547*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    &getCppuType((awt::Size*)0),            0 | beans::PropertyAttribute::READONLY, 0 },
548*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
549*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
550*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
551*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
552*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
553*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
554*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
555*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLWID),  SC_WID_UNO_CELLWID, &getCppuType((sal_Int32*)0),            0, 0 },
556*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
557*cdf0e10cSrcweir         {0,0,0,0,0,0}
558*cdf0e10cSrcweir     };
559*cdf0e10cSrcweir     static SfxItemPropertySet aColumnPropertySet( aColumnPropertyMap_Impl );
560*cdf0e10cSrcweir     return &aColumnPropertySet;
561*cdf0e10cSrcweir }
562*cdf0e10cSrcweir 
563*cdf0e10cSrcweir const SfxItemPropertySet* lcl_GetRowPropertySet()
564*cdf0e10cSrcweir {
565*cdf0e10cSrcweir     static SfxItemPropertyMapEntry aRowPropertyMap_Impl[] =
566*cdf0e10cSrcweir     {
567*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
568*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
569*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
570*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
571*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
572*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
573*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
574*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
575*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
576*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
577*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
578*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
579*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
580*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
581*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
582*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
583*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
584*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
585*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
586*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
587*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
588*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
589*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
590*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
591*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
592*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
593*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
594*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
595*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
596*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
597*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
598*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
599*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
600*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
601*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
602*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
603*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
604*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
605*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
606*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
607*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
608*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
609*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
610*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
611*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
612*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
613*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
614*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
615*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
616*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
617*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
618*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
619*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
620*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
621*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
622*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLHGT),  SC_WID_UNO_CELLHGT, &getCppuType((sal_Int32*)0),            0, 0 },
623*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST },
624*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
625*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLFILT), SC_WID_UNO_CELLFILT,&getBooleanCppuType(),                  0, 0 },
626*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_MANPAGE),  SC_WID_UNO_MANPAGE, &getBooleanCppuType(),                  0, 0 },
627*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NEWPAGE),  SC_WID_UNO_NEWPAGE, &getBooleanCppuType(),                  0, 0 },
628*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
629*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLVIS),  SC_WID_UNO_CELLVIS, &getBooleanCppuType(),                  0, 0 },
630*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
631*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
632*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
633*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_OHEIGHT),  SC_WID_UNO_OHEIGHT, &getBooleanCppuType(),                  0, 0 },
634*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
635*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
636*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
637*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
638*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
639*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
640*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
641*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
642*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
643*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
644*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
645*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
646*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_POS),      SC_WID_UNO_POS,     &getCppuType((awt::Point*)0),           0 | beans::PropertyAttribute::READONLY, 0 },
647*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
648*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
649*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
650*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
651*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
652*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    &getCppuType((awt::Size*)0),            0 | beans::PropertyAttribute::READONLY, 0 },
653*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
654*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
655*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
656*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
657*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
658*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
659*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
660*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
661*cdf0e10cSrcweir         {0,0,0,0,0,0}
662*cdf0e10cSrcweir     };
663*cdf0e10cSrcweir     static SfxItemPropertySet aRowPropertySet( aRowPropertyMap_Impl );
664*cdf0e10cSrcweir     return &aRowPropertySet;
665*cdf0e10cSrcweir }
666*cdf0e10cSrcweir 
667*cdf0e10cSrcweir const SfxItemPropertySet* lcl_GetSheetPropertySet()
668*cdf0e10cSrcweir {
669*cdf0e10cSrcweir     static SfxItemPropertyMapEntry aSheetPropertyMap_Impl[] =
670*cdf0e10cSrcweir     {
671*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
672*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
673*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_AUTOPRINT),SC_WID_UNO_AUTOPRINT,&getBooleanCppuType(),                 0, 0 },
674*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_BORDCOL),  SC_WID_UNO_BORDCOL, &getCppuType((sal_Int32*)0),            0, 0 },
675*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
676*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
677*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
678*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
679*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
680*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
681*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
682*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
683*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
684*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
685*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
686*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
687*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
688*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
689*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
690*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
691*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
692*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
693*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
694*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
695*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
696*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
697*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
698*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
699*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
700*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
701*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
702*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
703*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
704*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
705*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
706*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
707*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
708*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
709*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
710*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
711*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
712*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
713*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
714*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
715*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
716*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
717*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
718*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
719*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
720*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
721*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
722*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
723*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
724*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
725*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
726*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COPYBACK), SC_WID_UNO_COPYBACK,&getBooleanCppuType(),                  0, 0 },
727*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COPYFORM), SC_WID_UNO_COPYFORM,&getBooleanCppuType(),                  0, 0 },
728*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_COPYSTYL), SC_WID_UNO_COPYSTYL,&getBooleanCppuType(),                  0, 0 },
729*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
730*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
731*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST },
732*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ISACTIVE), SC_WID_UNO_ISACTIVE,&getBooleanCppuType(),                  0, 0 },
733*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
734*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
735*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLVIS),  SC_WID_UNO_CELLVIS, &getBooleanCppuType(),                  0, 0 },
736*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
737*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_LINKDISPBIT),  SC_WID_UNO_LINKDISPBIT,&getCppuType((uno::Reference<awt::XBitmap>*)0), 0 | beans::PropertyAttribute::READONLY, 0 },
738*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_LINKDISPNAME), SC_WID_UNO_LINKDISPNAME,&getCppuType((rtl::OUString*)0),    0 | beans::PropertyAttribute::READONLY, 0 },
739*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
740*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
741*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
742*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PAGESTL),  SC_WID_UNO_PAGESTL, &getCppuType((rtl::OUString*)0),        0, 0 },
743*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
744*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
745*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
746*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
747*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
748*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
749*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
750*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
751*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
752*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
753*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
754*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_POS),      SC_WID_UNO_POS,     &getCppuType((awt::Point*)0),           0 | beans::PropertyAttribute::READONLY, 0 },
755*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PRINTBORD),SC_WID_UNO_PRINTBORD,&getBooleanCppuType(),                 0, 0 },
756*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_PROTECT),  SC_WID_UNO_PROTECT, &getBooleanCppuType(),                  0, 0 },
757*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
758*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
759*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
760*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
761*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHOWBORD), SC_WID_UNO_SHOWBORD,&getBooleanCppuType(),                  0, 0 },
762*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
763*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    &getCppuType((awt::Size*)0),            0 | beans::PropertyAttribute::READONLY, 0 },
764*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
765*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TABLAYOUT),SC_WID_UNO_TABLAYOUT,&getCppuType((sal_Int16*)0),           0, 0 },
766*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
767*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
768*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
769*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
770*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
771*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((table::CellVertJustify*)0), 0, 0 },
772*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
773*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TABCOLOR), SC_WID_UNO_TABCOLOR, &getCppuType((sal_Int32*)0), 0, 0 },
774*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNO_CODENAME),        SC_WID_UNO_CODENAME, &getCppuType(static_cast< const rtl::OUString * >(0)),    0, 0},
775*cdf0e10cSrcweir         {0,0,0,0,0,0}
776*cdf0e10cSrcweir     };
777*cdf0e10cSrcweir     static SfxItemPropertySet aSheetPropertySet( aSheetPropertyMap_Impl );
778*cdf0e10cSrcweir     return &aSheetPropertySet;
779*cdf0e10cSrcweir }
780*cdf0e10cSrcweir 
781*cdf0e10cSrcweir const SfxItemPropertyMapEntry* lcl_GetEditPropertyMap()
782*cdf0e10cSrcweir {
783*cdf0e10cSrcweir     static SfxItemPropertyMapEntry aEditPropertyMap_Impl[] =
784*cdf0e10cSrcweir     {
785*cdf0e10cSrcweir         SVX_UNOEDIT_CHAR_PROPERTIES,
786*cdf0e10cSrcweir         SVX_UNOEDIT_FONT_PROPERTIES,
787*cdf0e10cSrcweir         SVX_UNOEDIT_PARA_PROPERTIES,
788*cdf0e10cSrcweir         SVX_UNOEDIT_NUMBERING_PROPERTIE,    // for completeness of service ParagraphProperties
789*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_TEXTUSER), EE_CHAR_XMLATTRIBS, &getCppuType((const uno::Reference< container::XNameContainer >*)0), 0, 0},
790*cdf0e10cSrcweir         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  EE_PARA_XMLATTRIBS, &getCppuType((const uno::Reference< container::XNameContainer >*)0), 0, 0},
791*cdf0e10cSrcweir         {0,0,0,0,0,0}
792*cdf0e10cSrcweir     };
793*cdf0e10cSrcweir     return aEditPropertyMap_Impl;
794*cdf0e10cSrcweir }
795*cdf0e10cSrcweir const SvxItemPropertySet* lcl_GetEditPropertySet()
796*cdf0e10cSrcweir {
797*cdf0e10cSrcweir     static SvxItemPropertySet aEditPropertySet( lcl_GetEditPropertyMap(), SdrObject::GetGlobalDrawObjectItemPool() );
798*cdf0e10cSrcweir     return &aEditPropertySet;
799*cdf0e10cSrcweir }
800*cdf0e10cSrcweir 
801*cdf0e10cSrcweir 
802*cdf0e10cSrcweir //------------------------------------------------------------------------
803*cdf0e10cSrcweir 
804*cdf0e10cSrcweir //! diese Funktionen in einen allgemeinen Header verschieben
805*cdf0e10cSrcweir inline long TwipsToHMM(long nTwips) { return (nTwips * 127 + 36) / 72; }
806*cdf0e10cSrcweir inline long HMMToTwips(long nHMM)   { return (nHMM * 72 + 63) / 127; }
807*cdf0e10cSrcweir 
808*cdf0e10cSrcweir //------------------------------------------------------------------------
809*cdf0e10cSrcweir 
810*cdf0e10cSrcweir #define SCCHARPROPERTIES_SERVICE    "com.sun.star.style.CharacterProperties"
811*cdf0e10cSrcweir #define SCPARAPROPERTIES_SERVICE    "com.sun.star.style.ParagraphProperties"
812*cdf0e10cSrcweir #define SCCELLPROPERTIES_SERVICE    "com.sun.star.table.CellProperties"
813*cdf0e10cSrcweir #define SCCELLRANGE_SERVICE         "com.sun.star.table.CellRange"
814*cdf0e10cSrcweir #define SCCELL_SERVICE              "com.sun.star.table.Cell"
815*cdf0e10cSrcweir #define SCSHEETCELLRANGES_SERVICE   "com.sun.star.sheet.SheetCellRanges"
816*cdf0e10cSrcweir #define SCSHEETCELLRANGE_SERVICE    "com.sun.star.sheet.SheetCellRange"
817*cdf0e10cSrcweir #define SCSPREADSHEET_SERVICE       "com.sun.star.sheet.Spreadsheet"
818*cdf0e10cSrcweir #define SCSHEETCELL_SERVICE         "com.sun.star.sheet.SheetCell"
819*cdf0e10cSrcweir 
820*cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScCellFormatsEnumeration, "ScCellFormatsEnumeration", "com.sun.star.sheet.CellFormatRangesEnumeration" )
821*cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScCellFormatsObj, "ScCellFormatsObj", "com.sun.star.sheet.CellFormatRanges" )
822*cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScUniqueCellFormatsEnumeration, "ScUniqueCellFormatsEnumeration", "com.sun.star.sheet.UniqueCellFormatRangesEnumeration" )
823*cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScUniqueCellFormatsObj, "ScUniqueCellFormatsObj", "com.sun.star.sheet.UniqueCellFormatRanges" )
824*cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScCellRangesBase, "ScCellRangesBase", "stardiv.unknown" )
825*cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScCellsEnumeration, "ScCellsEnumeration", "com.sun.star.sheet.CellsEnumeration" )
826*cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScCellsObj, "ScCellsObj", "com.sun.star.sheet.Cells" )
827*cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScTableColumnObj, "ScTableColumnObj", "com.sun.star.table.TableColumn" )
828*cdf0e10cSrcweir SC_SIMPLE_SERVICE_INFO( ScTableRowObj, "ScTableRowObj", "com.sun.star.table.TableRow" )
829*cdf0e10cSrcweir 
830*cdf0e10cSrcweir //------------------------------------------------------------------------
831*cdf0e10cSrcweir 
832*cdf0e10cSrcweir SV_IMPL_PTRARR( XModifyListenerArr_Impl, XModifyListenerPtr );
833*cdf0e10cSrcweir SV_IMPL_PTRARR( ScNamedEntryArr_Impl, ScNamedEntryPtr );
834*cdf0e10cSrcweir 
835*cdf0e10cSrcweir //------------------------------------------------------------------------
836*cdf0e10cSrcweir 
837*cdf0e10cSrcweir //! ScLinkListener in anderes File verschieben !!!
838*cdf0e10cSrcweir 
839*cdf0e10cSrcweir ScLinkListener::~ScLinkListener()
840*cdf0e10cSrcweir {
841*cdf0e10cSrcweir }
842*cdf0e10cSrcweir 
843*cdf0e10cSrcweir void ScLinkListener::Notify( SvtBroadcaster&, const SfxHint& rHint )
844*cdf0e10cSrcweir {
845*cdf0e10cSrcweir     aLink.Call( (SfxHint*)&rHint );
846*cdf0e10cSrcweir }
847*cdf0e10cSrcweir 
848*cdf0e10cSrcweir //------------------------------------------------------------------------
849*cdf0e10cSrcweir 
850*cdf0e10cSrcweir void lcl_CopyProperties( beans::XPropertySet& rDest, beans::XPropertySet& rSource )
851*cdf0e10cSrcweir {
852*cdf0e10cSrcweir     uno::Reference<beans::XPropertySetInfo> xInfo(rSource.getPropertySetInfo());
853*cdf0e10cSrcweir     if (xInfo.is())
854*cdf0e10cSrcweir     {
855*cdf0e10cSrcweir         uno::Sequence<beans::Property> aSeq(xInfo->getProperties());
856*cdf0e10cSrcweir         const beans::Property* pAry = aSeq.getConstArray();
857*cdf0e10cSrcweir         sal_uLong nCount = aSeq.getLength();
858*cdf0e10cSrcweir         for (sal_uLong i=0; i<nCount; i++)
859*cdf0e10cSrcweir         {
860*cdf0e10cSrcweir             rtl::OUString aName(pAry[i].Name);
861*cdf0e10cSrcweir             rDest.setPropertyValue( aName, rSource.getPropertyValue( aName ) );
862*cdf0e10cSrcweir         }
863*cdf0e10cSrcweir     }
864*cdf0e10cSrcweir }
865*cdf0e10cSrcweir 
866*cdf0e10cSrcweir SCTAB lcl_FirstTab( const ScRangeList& rRanges )
867*cdf0e10cSrcweir {
868*cdf0e10cSrcweir     DBG_ASSERT(rRanges.Count() >= 1, "was fuer Ranges ?!?!");
869*cdf0e10cSrcweir     const ScRange* pFirst = rRanges.GetObject(0);
870*cdf0e10cSrcweir     if (pFirst)
871*cdf0e10cSrcweir         return pFirst->aStart.Tab();
872*cdf0e10cSrcweir 
873*cdf0e10cSrcweir     return 0;   // soll nicht sein
874*cdf0e10cSrcweir }
875*cdf0e10cSrcweir 
876*cdf0e10cSrcweir sal_Bool lcl_WholeSheet( const ScRangeList& rRanges )
877*cdf0e10cSrcweir {
878*cdf0e10cSrcweir     if ( rRanges.Count() == 1 )
879*cdf0e10cSrcweir     {
880*cdf0e10cSrcweir         ScRange* pRange = rRanges.GetObject(0);
881*cdf0e10cSrcweir         if ( pRange && pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL &&
882*cdf0e10cSrcweir                        pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW )
883*cdf0e10cSrcweir             return sal_True;
884*cdf0e10cSrcweir     }
885*cdf0e10cSrcweir     return sal_False;
886*cdf0e10cSrcweir }
887*cdf0e10cSrcweir 
888*cdf0e10cSrcweir //------------------------------------------------------------------------
889*cdf0e10cSrcweir 
890*cdf0e10cSrcweir ScSubTotalFunc lcl_SummaryToSubTotal( sheet::GeneralFunction eSummary )
891*cdf0e10cSrcweir {
892*cdf0e10cSrcweir     ScSubTotalFunc eSubTotal;
893*cdf0e10cSrcweir     switch (eSummary)
894*cdf0e10cSrcweir     {
895*cdf0e10cSrcweir         case sheet::GeneralFunction_SUM:
896*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_SUM;
897*cdf0e10cSrcweir             break;
898*cdf0e10cSrcweir         case sheet::GeneralFunction_COUNT:
899*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_CNT2;
900*cdf0e10cSrcweir             break;
901*cdf0e10cSrcweir         case sheet::GeneralFunction_AVERAGE:
902*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_AVE;
903*cdf0e10cSrcweir             break;
904*cdf0e10cSrcweir         case sheet::GeneralFunction_MAX:
905*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_MAX;
906*cdf0e10cSrcweir             break;
907*cdf0e10cSrcweir         case sheet::GeneralFunction_MIN:
908*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_MIN;
909*cdf0e10cSrcweir             break;
910*cdf0e10cSrcweir         case sheet::GeneralFunction_PRODUCT:
911*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_PROD;
912*cdf0e10cSrcweir             break;
913*cdf0e10cSrcweir         case sheet::GeneralFunction_COUNTNUMS:
914*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_CNT;
915*cdf0e10cSrcweir             break;
916*cdf0e10cSrcweir         case sheet::GeneralFunction_STDEV:
917*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_STD;
918*cdf0e10cSrcweir             break;
919*cdf0e10cSrcweir         case sheet::GeneralFunction_STDEVP:
920*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_STDP;
921*cdf0e10cSrcweir             break;
922*cdf0e10cSrcweir         case sheet::GeneralFunction_VAR:
923*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_VAR;
924*cdf0e10cSrcweir             break;
925*cdf0e10cSrcweir         case sheet::GeneralFunction_VARP:
926*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_VARP;
927*cdf0e10cSrcweir             break;
928*cdf0e10cSrcweir 
929*cdf0e10cSrcweir         case sheet::GeneralFunction_NONE:
930*cdf0e10cSrcweir         case sheet::GeneralFunction_AUTO:
931*cdf0e10cSrcweir         default:
932*cdf0e10cSrcweir             eSubTotal = SUBTOTAL_FUNC_NONE;
933*cdf0e10cSrcweir             break;
934*cdf0e10cSrcweir     }
935*cdf0e10cSrcweir     return eSubTotal;
936*cdf0e10cSrcweir }
937*cdf0e10cSrcweir 
938*cdf0e10cSrcweir //------------------------------------------------------------------------
939*cdf0e10cSrcweir 
940*cdf0e10cSrcweir const SvxBorderLine* ScHelperFunctions::GetBorderLine( SvxBorderLine& rLine, const table::BorderLine& rStruct )
941*cdf0e10cSrcweir {
942*cdf0e10cSrcweir     //  Calc braucht Twips, im Uno-Struct sind 1/100mm
943*cdf0e10cSrcweir 
944*cdf0e10cSrcweir     rLine.SetOutWidth( (sal_uInt16)HMMToTwips( rStruct.OuterLineWidth ) );
945*cdf0e10cSrcweir     rLine.SetInWidth(  (sal_uInt16)HMMToTwips( rStruct.InnerLineWidth ) );
946*cdf0e10cSrcweir     rLine.SetDistance( (sal_uInt16)HMMToTwips( rStruct.LineDistance ) );
947*cdf0e10cSrcweir     rLine.SetColor( ColorData( rStruct.Color ) );
948*cdf0e10cSrcweir 
949*cdf0e10cSrcweir     if ( rLine.GetOutWidth() || rLine.GetInWidth() || rLine.GetDistance() )
950*cdf0e10cSrcweir         return &rLine;
951*cdf0e10cSrcweir     else
952*cdf0e10cSrcweir         return NULL;
953*cdf0e10cSrcweir }
954*cdf0e10cSrcweir 
955*cdf0e10cSrcweir void ScHelperFunctions::FillBoxItems( SvxBoxItem& rOuter, SvxBoxInfoItem& rInner, const table::TableBorder& rBorder )
956*cdf0e10cSrcweir {
957*cdf0e10cSrcweir     SvxBorderLine aLine;
958*cdf0e10cSrcweir     rOuter.SetDistance( (sal_uInt16)HMMToTwips( rBorder.Distance ) );
959*cdf0e10cSrcweir     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.TopLine ),     BOX_LINE_TOP );
960*cdf0e10cSrcweir     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.BottomLine ),      BOX_LINE_BOTTOM );
961*cdf0e10cSrcweir     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.LeftLine ),        BOX_LINE_LEFT );
962*cdf0e10cSrcweir     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.RightLine ),       BOX_LINE_RIGHT );
963*cdf0e10cSrcweir     rInner.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.HorizontalLine ),  BOXINFO_LINE_HORI );
964*cdf0e10cSrcweir     rInner.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.VerticalLine ),    BOXINFO_LINE_VERT );
965*cdf0e10cSrcweir     rInner.SetValid( VALID_TOP,      rBorder.IsTopLineValid );
966*cdf0e10cSrcweir     rInner.SetValid( VALID_BOTTOM,   rBorder.IsBottomLineValid );
967*cdf0e10cSrcweir     rInner.SetValid( VALID_LEFT,     rBorder.IsLeftLineValid );
968*cdf0e10cSrcweir     rInner.SetValid( VALID_RIGHT,    rBorder.IsRightLineValid );
969*cdf0e10cSrcweir     rInner.SetValid( VALID_HORI,     rBorder.IsHorizontalLineValid );
970*cdf0e10cSrcweir     rInner.SetValid( VALID_VERT,     rBorder.IsVerticalLineValid );
971*cdf0e10cSrcweir     rInner.SetValid( VALID_DISTANCE, rBorder.IsDistanceValid );
972*cdf0e10cSrcweir     rInner.SetTable( sal_True );
973*cdf0e10cSrcweir }
974*cdf0e10cSrcweir 
975*cdf0e10cSrcweir void ScHelperFunctions::FillBorderLine( table::BorderLine& rStruct, const SvxBorderLine* pLine )
976*cdf0e10cSrcweir {
977*cdf0e10cSrcweir     if (pLine)
978*cdf0e10cSrcweir     {
979*cdf0e10cSrcweir         rStruct.Color          = pLine->GetColor().GetColor();
980*cdf0e10cSrcweir         rStruct.InnerLineWidth = (sal_Int16)TwipsToHMM( pLine->GetInWidth() );
981*cdf0e10cSrcweir         rStruct.OuterLineWidth = (sal_Int16)TwipsToHMM( pLine->GetOutWidth() );
982*cdf0e10cSrcweir         rStruct.LineDistance   = (sal_Int16)TwipsToHMM( pLine->GetDistance() );
983*cdf0e10cSrcweir     }
984*cdf0e10cSrcweir     else
985*cdf0e10cSrcweir         rStruct.Color = rStruct.InnerLineWidth =
986*cdf0e10cSrcweir             rStruct.OuterLineWidth = rStruct.LineDistance = 0;
987*cdf0e10cSrcweir }
988*cdf0e10cSrcweir 
989*cdf0e10cSrcweir void ScHelperFunctions::FillTableBorder( table::TableBorder& rBorder,
990*cdf0e10cSrcweir                             const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner )
991*cdf0e10cSrcweir {
992*cdf0e10cSrcweir     ScHelperFunctions::FillBorderLine( rBorder.TopLine,         rOuter.GetTop() );
993*cdf0e10cSrcweir     ScHelperFunctions::FillBorderLine( rBorder.BottomLine,      rOuter.GetBottom() );
994*cdf0e10cSrcweir     ScHelperFunctions::FillBorderLine( rBorder.LeftLine,        rOuter.GetLeft() );
995*cdf0e10cSrcweir     ScHelperFunctions::FillBorderLine( rBorder.RightLine,       rOuter.GetRight() );
996*cdf0e10cSrcweir     ScHelperFunctions::FillBorderLine( rBorder.HorizontalLine,  rInner.GetHori() );
997*cdf0e10cSrcweir     ScHelperFunctions::FillBorderLine( rBorder.VerticalLine,    rInner.GetVert() );
998*cdf0e10cSrcweir 
999*cdf0e10cSrcweir     rBorder.Distance                = rOuter.GetDistance();
1000*cdf0e10cSrcweir     rBorder.IsTopLineValid          = rInner.IsValid(VALID_TOP);
1001*cdf0e10cSrcweir     rBorder.IsBottomLineValid       = rInner.IsValid(VALID_BOTTOM);
1002*cdf0e10cSrcweir     rBorder.IsLeftLineValid         = rInner.IsValid(VALID_LEFT);
1003*cdf0e10cSrcweir     rBorder.IsRightLineValid        = rInner.IsValid(VALID_RIGHT);
1004*cdf0e10cSrcweir     rBorder.IsHorizontalLineValid   = rInner.IsValid(VALID_HORI);
1005*cdf0e10cSrcweir     rBorder.IsVerticalLineValid     = rInner.IsValid(VALID_VERT);
1006*cdf0e10cSrcweir     rBorder.IsDistanceValid         = rInner.IsValid(VALID_DISTANCE);
1007*cdf0e10cSrcweir }
1008*cdf0e10cSrcweir 
1009*cdf0e10cSrcweir //------------------------------------------------------------------------
1010*cdf0e10cSrcweir 
1011*cdf0e10cSrcweir //! lcl_ApplyBorder nach docfunc verschieben!
1012*cdf0e10cSrcweir 
1013*cdf0e10cSrcweir void ScHelperFunctions::ApplyBorder( ScDocShell* pDocShell, const ScRangeList& rRanges,
1014*cdf0e10cSrcweir                         const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner )
1015*cdf0e10cSrcweir {
1016*cdf0e10cSrcweir     ScDocument* pDoc = pDocShell->GetDocument();
1017*cdf0e10cSrcweir     sal_Bool bUndo(pDoc->IsUndoEnabled());
1018*cdf0e10cSrcweir     ScDocument* pUndoDoc = NULL;
1019*cdf0e10cSrcweir     if (bUndo)
1020*cdf0e10cSrcweir         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1021*cdf0e10cSrcweir     sal_uLong nCount = rRanges.Count();
1022*cdf0e10cSrcweir     sal_uLong i;
1023*cdf0e10cSrcweir     for (i=0; i<nCount; i++)
1024*cdf0e10cSrcweir     {
1025*cdf0e10cSrcweir         ScRange aRange(*rRanges.GetObject(i));
1026*cdf0e10cSrcweir         SCTAB nTab = aRange.aStart.Tab();
1027*cdf0e10cSrcweir 
1028*cdf0e10cSrcweir         if (bUndo)
1029*cdf0e10cSrcweir         {
1030*cdf0e10cSrcweir             if ( i==0 )
1031*cdf0e10cSrcweir                 pUndoDoc->InitUndo( pDoc, nTab, nTab );
1032*cdf0e10cSrcweir             else
1033*cdf0e10cSrcweir                 pUndoDoc->AddUndoTab( nTab, nTab );
1034*cdf0e10cSrcweir             pDoc->CopyToDocument( aRange, IDF_ATTRIB, sal_False, pUndoDoc );
1035*cdf0e10cSrcweir         }
1036*cdf0e10cSrcweir 
1037*cdf0e10cSrcweir         ScMarkData aMark;
1038*cdf0e10cSrcweir         aMark.SetMarkArea( aRange );
1039*cdf0e10cSrcweir         aMark.SelectTable( nTab, sal_True );
1040*cdf0e10cSrcweir 
1041*cdf0e10cSrcweir         pDoc->ApplySelectionFrame( aMark, &rOuter, &rInner );
1042*cdf0e10cSrcweir         // RowHeight bei Umrandung alleine nicht noetig
1043*cdf0e10cSrcweir     }
1044*cdf0e10cSrcweir 
1045*cdf0e10cSrcweir     if (bUndo)
1046*cdf0e10cSrcweir     {
1047*cdf0e10cSrcweir         pDocShell->GetUndoManager()->AddUndoAction(
1048*cdf0e10cSrcweir                 new ScUndoBorder( pDocShell, rRanges, pUndoDoc, rOuter, rInner ) );
1049*cdf0e10cSrcweir     }
1050*cdf0e10cSrcweir 
1051*cdf0e10cSrcweir     for (i=0; i<nCount; i++)
1052*cdf0e10cSrcweir         pDocShell->PostPaint( *rRanges.GetObject(i), PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
1053*cdf0e10cSrcweir 
1054*cdf0e10cSrcweir     pDocShell->SetDocumentModified();
1055*cdf0e10cSrcweir }
1056*cdf0e10cSrcweir 
1057*cdf0e10cSrcweir //! move lcl_PutDataArray to docfunc?
1058*cdf0e10cSrcweir //! merge loop with ScFunctionAccess::callFunction
1059*cdf0e10cSrcweir 
1060*cdf0e10cSrcweir sal_Bool lcl_PutDataArray( ScDocShell& rDocShell, const ScRange& rRange,
1061*cdf0e10cSrcweir                         const uno::Sequence< uno::Sequence<uno::Any> >& aData )
1062*cdf0e10cSrcweir {
1063*cdf0e10cSrcweir //  sal_Bool bApi = sal_True;
1064*cdf0e10cSrcweir 
1065*cdf0e10cSrcweir     ScDocument* pDoc = rDocShell.GetDocument();
1066*cdf0e10cSrcweir     SCTAB nTab = rRange.aStart.Tab();
1067*cdf0e10cSrcweir     SCCOL nStartCol = rRange.aStart.Col();
1068*cdf0e10cSrcweir     SCROW nStartRow = rRange.aStart.Row();
1069*cdf0e10cSrcweir     SCCOL nEndCol = rRange.aEnd.Col();
1070*cdf0e10cSrcweir     SCROW nEndRow = rRange.aEnd.Row();
1071*cdf0e10cSrcweir     sal_Bool bUndo(pDoc->IsUndoEnabled());
1072*cdf0e10cSrcweir 
1073*cdf0e10cSrcweir     if ( !pDoc->IsBlockEditable( nTab, nStartCol,nStartRow, nEndCol,nEndRow ) )
1074*cdf0e10cSrcweir     {
1075*cdf0e10cSrcweir         //! error message
1076*cdf0e10cSrcweir         return sal_False;
1077*cdf0e10cSrcweir     }
1078*cdf0e10cSrcweir 
1079*cdf0e10cSrcweir     long nCols = 0;
1080*cdf0e10cSrcweir     long nRows = aData.getLength();
1081*cdf0e10cSrcweir     const uno::Sequence<uno::Any>* pArray = aData.getConstArray();
1082*cdf0e10cSrcweir     if ( nRows )
1083*cdf0e10cSrcweir         nCols = pArray[0].getLength();
1084*cdf0e10cSrcweir 
1085*cdf0e10cSrcweir     if ( nCols != nEndCol-nStartCol+1 || nRows != nEndRow-nStartRow+1 )
1086*cdf0e10cSrcweir     {
1087*cdf0e10cSrcweir         //! error message?
1088*cdf0e10cSrcweir         return sal_False;
1089*cdf0e10cSrcweir     }
1090*cdf0e10cSrcweir 
1091*cdf0e10cSrcweir     ScDocument* pUndoDoc = NULL;
1092*cdf0e10cSrcweir     if ( bUndo )
1093*cdf0e10cSrcweir     {
1094*cdf0e10cSrcweir         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1095*cdf0e10cSrcweir         pUndoDoc->InitUndo( pDoc, nTab, nTab );
1096*cdf0e10cSrcweir         pDoc->CopyToDocument( rRange, IDF_CONTENTS|IDF_NOCAPTIONS, sal_False, pUndoDoc );
1097*cdf0e10cSrcweir     }
1098*cdf0e10cSrcweir 
1099*cdf0e10cSrcweir     pDoc->DeleteAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, IDF_CONTENTS );
1100*cdf0e10cSrcweir 
1101*cdf0e10cSrcweir     /*  #164410# Use double allocation, which will speed up import filters
1102*cdf0e10cSrcweir         using XCellRangeData::setDataArray() significantly. */
1103*cdf0e10cSrcweir     bool bDoubleAlloc = ScColumn::bDoubleAlloc;
1104*cdf0e10cSrcweir     ScColumn::bDoubleAlloc = true;
1105*cdf0e10cSrcweir 
1106*cdf0e10cSrcweir     sal_Bool bError = sal_False;
1107*cdf0e10cSrcweir     SCROW nDocRow = nStartRow;
1108*cdf0e10cSrcweir     for (long nRow=0; nRow<nRows; nRow++)
1109*cdf0e10cSrcweir     {
1110*cdf0e10cSrcweir         const uno::Sequence<uno::Any>& rColSeq = pArray[nRow];
1111*cdf0e10cSrcweir         if ( rColSeq.getLength() == nCols )
1112*cdf0e10cSrcweir         {
1113*cdf0e10cSrcweir             SCCOL nDocCol = nStartCol;
1114*cdf0e10cSrcweir             const uno::Any* pColArr = rColSeq.getConstArray();
1115*cdf0e10cSrcweir             for (long nCol=0; nCol<nCols; nCol++)
1116*cdf0e10cSrcweir             {
1117*cdf0e10cSrcweir                 const uno::Any& rElement = pColArr[nCol];
1118*cdf0e10cSrcweir                 switch( rElement.getValueTypeClass() )
1119*cdf0e10cSrcweir                 {
1120*cdf0e10cSrcweir                     case uno::TypeClass_VOID:
1121*cdf0e10cSrcweir                     {
1122*cdf0e10cSrcweir                         // void = "no value"
1123*cdf0e10cSrcweir                         pDoc->SetError( nDocCol, nDocRow, nTab, NOTAVAILABLE );
1124*cdf0e10cSrcweir                     }
1125*cdf0e10cSrcweir                     break;
1126*cdf0e10cSrcweir 
1127*cdf0e10cSrcweir                     //  #87871# accept integer types because Basic passes a floating point
1128*cdf0e10cSrcweir                     //  variable as byte, short or long if it's an integer number.
1129*cdf0e10cSrcweir                     case uno::TypeClass_BYTE:
1130*cdf0e10cSrcweir                     case uno::TypeClass_SHORT:
1131*cdf0e10cSrcweir                     case uno::TypeClass_UNSIGNED_SHORT:
1132*cdf0e10cSrcweir                     case uno::TypeClass_LONG:
1133*cdf0e10cSrcweir                     case uno::TypeClass_UNSIGNED_LONG:
1134*cdf0e10cSrcweir                     case uno::TypeClass_FLOAT:
1135*cdf0e10cSrcweir                     case uno::TypeClass_DOUBLE:
1136*cdf0e10cSrcweir                     {
1137*cdf0e10cSrcweir                         double fVal(0.0);
1138*cdf0e10cSrcweir                         rElement >>= fVal;
1139*cdf0e10cSrcweir                         pDoc->SetValue( nDocCol, nDocRow, nTab, fVal );
1140*cdf0e10cSrcweir                     }
1141*cdf0e10cSrcweir                     break;
1142*cdf0e10cSrcweir 
1143*cdf0e10cSrcweir                     case uno::TypeClass_STRING:
1144*cdf0e10cSrcweir                     {
1145*cdf0e10cSrcweir                         rtl::OUString aUStr;
1146*cdf0e10cSrcweir                         rElement >>= aUStr;
1147*cdf0e10cSrcweir                         if ( aUStr.getLength() )
1148*cdf0e10cSrcweir                             pDoc->PutCell( nDocCol, nDocRow, nTab, new ScStringCell( aUStr ) );
1149*cdf0e10cSrcweir                     }
1150*cdf0e10cSrcweir                     break;
1151*cdf0e10cSrcweir 
1152*cdf0e10cSrcweir                     // accept Sequence<FormulaToken> for formula cells
1153*cdf0e10cSrcweir                     case uno::TypeClass_SEQUENCE:
1154*cdf0e10cSrcweir                     {
1155*cdf0e10cSrcweir                         uno::Sequence< sheet::FormulaToken > aTokens;
1156*cdf0e10cSrcweir                         if ( rElement >>= aTokens )
1157*cdf0e10cSrcweir                         {
1158*cdf0e10cSrcweir                             ScTokenArray aTokenArray;
1159*cdf0e10cSrcweir                             ScTokenConversion::ConvertToTokenArray( *pDoc, aTokenArray, aTokens );
1160*cdf0e10cSrcweir                             ScAddress aPos( nDocCol, nDocRow, nTab );
1161*cdf0e10cSrcweir                             ScBaseCell* pNewCell = new ScFormulaCell( pDoc, aPos, &aTokenArray );
1162*cdf0e10cSrcweir                             pDoc->PutCell( aPos, pNewCell );
1163*cdf0e10cSrcweir                         }
1164*cdf0e10cSrcweir                         else
1165*cdf0e10cSrcweir                             bError = true;
1166*cdf0e10cSrcweir                     }
1167*cdf0e10cSrcweir                     break;
1168*cdf0e10cSrcweir 
1169*cdf0e10cSrcweir                     default:
1170*cdf0e10cSrcweir                         bError = true;      // invalid type
1171*cdf0e10cSrcweir                 }
1172*cdf0e10cSrcweir 
1173*cdf0e10cSrcweir                 ++nDocCol;
1174*cdf0e10cSrcweir             }
1175*cdf0e10cSrcweir         }
1176*cdf0e10cSrcweir         else
1177*cdf0e10cSrcweir             bError = sal_True;                          // wrong size
1178*cdf0e10cSrcweir 
1179*cdf0e10cSrcweir         ++nDocRow;
1180*cdf0e10cSrcweir     }
1181*cdf0e10cSrcweir     ScColumn::bDoubleAlloc = bDoubleAlloc;
1182*cdf0e10cSrcweir 
1183*cdf0e10cSrcweir     sal_Bool bHeight = rDocShell.AdjustRowHeight( nStartRow, nEndRow, nTab );
1184*cdf0e10cSrcweir 
1185*cdf0e10cSrcweir     if ( pUndoDoc )
1186*cdf0e10cSrcweir     {
1187*cdf0e10cSrcweir         ScMarkData aDestMark;
1188*cdf0e10cSrcweir         aDestMark.SelectOneTable( nTab );
1189*cdf0e10cSrcweir         rDocShell.GetUndoManager()->AddUndoAction(
1190*cdf0e10cSrcweir             new ScUndoPaste( &rDocShell,
1191*cdf0e10cSrcweir                 nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab, aDestMark,
1192*cdf0e10cSrcweir                 pUndoDoc, NULL, IDF_CONTENTS, NULL,NULL,NULL,NULL, sal_False ) );
1193*cdf0e10cSrcweir     }
1194*cdf0e10cSrcweir 
1195*cdf0e10cSrcweir     if (!bHeight)
1196*cdf0e10cSrcweir         rDocShell.PostPaint( rRange, PAINT_GRID );      // AdjustRowHeight may have painted already
1197*cdf0e10cSrcweir 
1198*cdf0e10cSrcweir     rDocShell.SetDocumentModified();
1199*cdf0e10cSrcweir 
1200*cdf0e10cSrcweir     return !bError;
1201*cdf0e10cSrcweir }
1202*cdf0e10cSrcweir 
1203*cdf0e10cSrcweir sal_Bool lcl_PutFormulaArray( ScDocShell& rDocShell, const ScRange& rRange,
1204*cdf0e10cSrcweir         const uno::Sequence< uno::Sequence<rtl::OUString> >& aData,
1205*cdf0e10cSrcweir         const ::rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar )
1206*cdf0e10cSrcweir {
1207*cdf0e10cSrcweir //  sal_Bool bApi = sal_True;
1208*cdf0e10cSrcweir 
1209*cdf0e10cSrcweir     ScDocument* pDoc = rDocShell.GetDocument();
1210*cdf0e10cSrcweir     SCTAB nTab = rRange.aStart.Tab();
1211*cdf0e10cSrcweir     SCCOL nStartCol = rRange.aStart.Col();
1212*cdf0e10cSrcweir     SCROW nStartRow = rRange.aStart.Row();
1213*cdf0e10cSrcweir     SCCOL nEndCol = rRange.aEnd.Col();
1214*cdf0e10cSrcweir     SCROW nEndRow = rRange.aEnd.Row();
1215*cdf0e10cSrcweir     sal_Bool bUndo(pDoc->IsUndoEnabled());
1216*cdf0e10cSrcweir 
1217*cdf0e10cSrcweir     if ( !pDoc->IsBlockEditable( nTab, nStartCol,nStartRow, nEndCol,nEndRow ) )
1218*cdf0e10cSrcweir     {
1219*cdf0e10cSrcweir         //! error message
1220*cdf0e10cSrcweir         return sal_False;
1221*cdf0e10cSrcweir     }
1222*cdf0e10cSrcweir 
1223*cdf0e10cSrcweir     long nCols = 0;
1224*cdf0e10cSrcweir     long nRows = aData.getLength();
1225*cdf0e10cSrcweir     const uno::Sequence<rtl::OUString>* pArray = aData.getConstArray();
1226*cdf0e10cSrcweir     if ( nRows )
1227*cdf0e10cSrcweir         nCols = pArray[0].getLength();
1228*cdf0e10cSrcweir 
1229*cdf0e10cSrcweir     if ( nCols != nEndCol-nStartCol+1 || nRows != nEndRow-nStartRow+1 )
1230*cdf0e10cSrcweir     {
1231*cdf0e10cSrcweir         //! error message?
1232*cdf0e10cSrcweir         return sal_False;
1233*cdf0e10cSrcweir     }
1234*cdf0e10cSrcweir 
1235*cdf0e10cSrcweir     ScDocument* pUndoDoc = NULL;
1236*cdf0e10cSrcweir     if ( bUndo )
1237*cdf0e10cSrcweir     {
1238*cdf0e10cSrcweir         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1239*cdf0e10cSrcweir         pUndoDoc->InitUndo( pDoc, nTab, nTab );
1240*cdf0e10cSrcweir         pDoc->CopyToDocument( rRange, IDF_CONTENTS, sal_False, pUndoDoc );
1241*cdf0e10cSrcweir     }
1242*cdf0e10cSrcweir 
1243*cdf0e10cSrcweir     pDoc->DeleteAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, IDF_CONTENTS );
1244*cdf0e10cSrcweir 
1245*cdf0e10cSrcweir     ScDocFunc aFunc( rDocShell );       // for InterpretEnglishString
1246*cdf0e10cSrcweir 
1247*cdf0e10cSrcweir     sal_Bool bError = sal_False;
1248*cdf0e10cSrcweir     SCROW nDocRow = nStartRow;
1249*cdf0e10cSrcweir     for (long nRow=0; nRow<nRows; nRow++)
1250*cdf0e10cSrcweir     {
1251*cdf0e10cSrcweir         const uno::Sequence<rtl::OUString>& rColSeq = pArray[nRow];
1252*cdf0e10cSrcweir         if ( rColSeq.getLength() == nCols )
1253*cdf0e10cSrcweir         {
1254*cdf0e10cSrcweir             SCCOL nDocCol = nStartCol;
1255*cdf0e10cSrcweir             const rtl::OUString* pColArr = rColSeq.getConstArray();
1256*cdf0e10cSrcweir             for (long nCol=0; nCol<nCols; nCol++)
1257*cdf0e10cSrcweir             {
1258*cdf0e10cSrcweir                 String aText(pColArr[nCol]);
1259*cdf0e10cSrcweir                 ScAddress aPos( nDocCol, nDocRow, nTab );
1260*cdf0e10cSrcweir                 ScBaseCell* pNewCell = aFunc.InterpretEnglishString( aPos, aText, rFormulaNmsp, eGrammar );
1261*cdf0e10cSrcweir                 pDoc->PutCell( aPos, pNewCell );
1262*cdf0e10cSrcweir 
1263*cdf0e10cSrcweir                 ++nDocCol;
1264*cdf0e10cSrcweir             }
1265*cdf0e10cSrcweir         }
1266*cdf0e10cSrcweir         else
1267*cdf0e10cSrcweir             bError = sal_True;                          // wrong size
1268*cdf0e10cSrcweir 
1269*cdf0e10cSrcweir         ++nDocRow;
1270*cdf0e10cSrcweir     }
1271*cdf0e10cSrcweir 
1272*cdf0e10cSrcweir     sal_Bool bHeight = rDocShell.AdjustRowHeight( nStartRow, nEndRow, nTab );
1273*cdf0e10cSrcweir 
1274*cdf0e10cSrcweir     if ( pUndoDoc )
1275*cdf0e10cSrcweir     {
1276*cdf0e10cSrcweir         ScMarkData aDestMark;
1277*cdf0e10cSrcweir         aDestMark.SelectOneTable( nTab );
1278*cdf0e10cSrcweir         rDocShell.GetUndoManager()->AddUndoAction(
1279*cdf0e10cSrcweir             new ScUndoPaste( &rDocShell,
1280*cdf0e10cSrcweir                 nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab, aDestMark,
1281*cdf0e10cSrcweir                 pUndoDoc, NULL, IDF_CONTENTS, NULL,NULL,NULL,NULL, sal_False ) );
1282*cdf0e10cSrcweir     }
1283*cdf0e10cSrcweir 
1284*cdf0e10cSrcweir     if (!bHeight)
1285*cdf0e10cSrcweir         rDocShell.PostPaint( rRange, PAINT_GRID );      // AdjustRowHeight may have painted already
1286*cdf0e10cSrcweir 
1287*cdf0e10cSrcweir     rDocShell.SetDocumentModified();
1288*cdf0e10cSrcweir 
1289*cdf0e10cSrcweir     return !bError;
1290*cdf0e10cSrcweir }
1291*cdf0e10cSrcweir 
1292*cdf0e10cSrcweir //  used in ScCellRangeObj::getFormulaArray and ScCellObj::GetInputString_Impl
1293*cdf0e10cSrcweir String lcl_GetInputString( ScDocument* pDoc, const ScAddress& rPosition, sal_Bool bEnglish )
1294*cdf0e10cSrcweir {
1295*cdf0e10cSrcweir     String aVal;
1296*cdf0e10cSrcweir     if ( pDoc )
1297*cdf0e10cSrcweir     {
1298*cdf0e10cSrcweir         ScBaseCell* pCell = pDoc->GetCell( rPosition );
1299*cdf0e10cSrcweir         if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE )
1300*cdf0e10cSrcweir         {
1301*cdf0e10cSrcweir             CellType eType = pCell->GetCellType();
1302*cdf0e10cSrcweir             if ( eType == CELLTYPE_FORMULA )
1303*cdf0e10cSrcweir             {
1304*cdf0e10cSrcweir                 ScFormulaCell* pForm = (ScFormulaCell*)pCell;
1305*cdf0e10cSrcweir                 pForm->GetFormula( aVal,formula::FormulaGrammar::mapAPItoGrammar( bEnglish, false));
1306*cdf0e10cSrcweir             }
1307*cdf0e10cSrcweir             else
1308*cdf0e10cSrcweir             {
1309*cdf0e10cSrcweir                 SvNumberFormatter* pFormatter = bEnglish ? ScGlobal::GetEnglishFormatter() :
1310*cdf0e10cSrcweir                                                             pDoc->GetFormatTable();
1311*cdf0e10cSrcweir                 // Since the English formatter was constructed with
1312*cdf0e10cSrcweir                 // LANGUAGE_ENGLISH_US the "General" format has index key 0,
1313*cdf0e10cSrcweir                 // we don't have to query.
1314*cdf0e10cSrcweir                 sal_uInt32 nNumFmt = bEnglish ?
1315*cdf0e10cSrcweir //                      pFormatter->GetStandardIndex(LANGUAGE_ENGLISH_US) :
1316*cdf0e10cSrcweir                         0 :
1317*cdf0e10cSrcweir                         pDoc->GetNumberFormat( rPosition );
1318*cdf0e10cSrcweir 
1319*cdf0e10cSrcweir                 if ( eType == CELLTYPE_EDIT )
1320*cdf0e10cSrcweir                 {
1321*cdf0e10cSrcweir                     //  GetString an der EditCell macht Leerzeichen aus Umbruechen,
1322*cdf0e10cSrcweir                     //  hier werden die Umbrueche aber gebraucht
1323*cdf0e10cSrcweir                     const EditTextObject* pData = ((ScEditCell*)pCell)->GetData();
1324*cdf0e10cSrcweir                     if (pData)
1325*cdf0e10cSrcweir                     {
1326*cdf0e10cSrcweir                         EditEngine& rEngine = pDoc->GetEditEngine();
1327*cdf0e10cSrcweir                         rEngine.SetText( *pData );
1328*cdf0e10cSrcweir                         aVal = rEngine.GetText( LINEEND_LF );
1329*cdf0e10cSrcweir                     }
1330*cdf0e10cSrcweir                 }
1331*cdf0e10cSrcweir                 else
1332*cdf0e10cSrcweir                     ScCellFormat::GetInputString( pCell, nNumFmt, aVal, *pFormatter );
1333*cdf0e10cSrcweir 
1334*cdf0e10cSrcweir                 //  ggf. ein ' davorhaengen wie in ScTabViewShell::UpdateInputHandler
1335*cdf0e10cSrcweir                 if ( eType == CELLTYPE_STRING || eType == CELLTYPE_EDIT )
1336*cdf0e10cSrcweir                 {
1337*cdf0e10cSrcweir                     double fDummy;
1338*cdf0e10cSrcweir                     sal_Bool bIsNumberFormat(pFormatter->IsNumberFormat(aVal, nNumFmt, fDummy));
1339*cdf0e10cSrcweir                     if ( bIsNumberFormat )
1340*cdf0e10cSrcweir                         aVal.Insert('\'',0);
1341*cdf0e10cSrcweir                     else if ( aVal.Len() && aVal.GetChar(0) == '\'' )
1342*cdf0e10cSrcweir                     {
1343*cdf0e10cSrcweir                         //  if the string starts with a "'", add another one because setFormula
1344*cdf0e10cSrcweir                         //  strips one (like text input, except for "text" number formats)
1345*cdf0e10cSrcweir                         if ( bEnglish || ( pFormatter->GetType(nNumFmt) != NUMBERFORMAT_TEXT ) )
1346*cdf0e10cSrcweir                             aVal.Insert('\'',0);
1347*cdf0e10cSrcweir                     }
1348*cdf0e10cSrcweir                 }
1349*cdf0e10cSrcweir             }
1350*cdf0e10cSrcweir         }
1351*cdf0e10cSrcweir     }
1352*cdf0e10cSrcweir     return aVal;
1353*cdf0e10cSrcweir }
1354*cdf0e10cSrcweir 
1355*cdf0e10cSrcweir //------------------------------------------------------------------------
1356*cdf0e10cSrcweir 
1357*cdf0e10cSrcweir // Default-ctor fuer SMART_REFLECTION Krempel
1358*cdf0e10cSrcweir ScCellRangesBase::ScCellRangesBase() :
1359*cdf0e10cSrcweir     pPropSet(lcl_GetCellsPropertySet()),
1360*cdf0e10cSrcweir     pDocShell( NULL ),
1361*cdf0e10cSrcweir     pValueListener( NULL ),
1362*cdf0e10cSrcweir     pCurrentFlat( NULL ),
1363*cdf0e10cSrcweir     pCurrentDeep( NULL ),
1364*cdf0e10cSrcweir     pCurrentDataSet( NULL ),
1365*cdf0e10cSrcweir     pNoDfltCurrentDataSet( NULL ),
1366*cdf0e10cSrcweir     pMarkData( NULL ),
1367*cdf0e10cSrcweir     nObjectId( 0 ),
1368*cdf0e10cSrcweir     bChartColAsHdr( sal_False ),
1369*cdf0e10cSrcweir     bChartRowAsHdr( sal_False ),
1370*cdf0e10cSrcweir     bCursorOnly( sal_False ),
1371*cdf0e10cSrcweir     bGotDataChangedHint( sal_False ),
1372*cdf0e10cSrcweir     aValueListeners( 0 )
1373*cdf0e10cSrcweir {
1374*cdf0e10cSrcweir }
1375*cdf0e10cSrcweir 
1376*cdf0e10cSrcweir ScCellRangesBase::ScCellRangesBase(ScDocShell* pDocSh, const ScRange& rR) :
1377*cdf0e10cSrcweir     pPropSet(lcl_GetCellsPropertySet()),
1378*cdf0e10cSrcweir     pDocShell( pDocSh ),
1379*cdf0e10cSrcweir     pValueListener( NULL ),
1380*cdf0e10cSrcweir     pCurrentFlat( NULL ),
1381*cdf0e10cSrcweir     pCurrentDeep( NULL ),
1382*cdf0e10cSrcweir     pCurrentDataSet( NULL ),
1383*cdf0e10cSrcweir     pNoDfltCurrentDataSet( NULL ),
1384*cdf0e10cSrcweir     pMarkData( NULL ),
1385*cdf0e10cSrcweir     nObjectId( 0 ),
1386*cdf0e10cSrcweir     bChartColAsHdr( sal_False ),
1387*cdf0e10cSrcweir     bChartRowAsHdr( sal_False ),
1388*cdf0e10cSrcweir     bCursorOnly( sal_False ),
1389*cdf0e10cSrcweir     bGotDataChangedHint( sal_False ),
1390*cdf0e10cSrcweir     aValueListeners( 0 )
1391*cdf0e10cSrcweir {
1392*cdf0e10cSrcweir     ScRange aCellRange(rR);
1393*cdf0e10cSrcweir     aCellRange.Justify();
1394*cdf0e10cSrcweir     aRanges.Append( aCellRange );
1395*cdf0e10cSrcweir 
1396*cdf0e10cSrcweir     if (pDocShell)  // Null if created with createInstance
1397*cdf0e10cSrcweir     {
1398*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
1399*cdf0e10cSrcweir         pDoc->AddUnoObject(*this);
1400*cdf0e10cSrcweir         nObjectId = pDoc->GetNewUnoId();
1401*cdf0e10cSrcweir     }
1402*cdf0e10cSrcweir }
1403*cdf0e10cSrcweir 
1404*cdf0e10cSrcweir ScCellRangesBase::ScCellRangesBase(ScDocShell* pDocSh, const ScRangeList& rR) :
1405*cdf0e10cSrcweir     pPropSet(lcl_GetCellsPropertySet()),
1406*cdf0e10cSrcweir     pDocShell( pDocSh ),
1407*cdf0e10cSrcweir     pValueListener( NULL ),
1408*cdf0e10cSrcweir     pCurrentFlat( NULL ),
1409*cdf0e10cSrcweir     pCurrentDeep( NULL ),
1410*cdf0e10cSrcweir     pCurrentDataSet( NULL ),
1411*cdf0e10cSrcweir     pNoDfltCurrentDataSet( NULL ),
1412*cdf0e10cSrcweir     pMarkData( NULL ),
1413*cdf0e10cSrcweir     aRanges( rR ),
1414*cdf0e10cSrcweir     nObjectId( 0 ),
1415*cdf0e10cSrcweir     bChartColAsHdr( sal_False ),
1416*cdf0e10cSrcweir     bChartRowAsHdr( sal_False ),
1417*cdf0e10cSrcweir     bCursorOnly( sal_False ),
1418*cdf0e10cSrcweir     bGotDataChangedHint( sal_False ),
1419*cdf0e10cSrcweir     aValueListeners( 0 )
1420*cdf0e10cSrcweir {
1421*cdf0e10cSrcweir     if (pDocShell)  // Null if created with createInstance
1422*cdf0e10cSrcweir     {
1423*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
1424*cdf0e10cSrcweir         pDoc->AddUnoObject(*this);
1425*cdf0e10cSrcweir         nObjectId = pDoc->GetNewUnoId();
1426*cdf0e10cSrcweir     }
1427*cdf0e10cSrcweir }
1428*cdf0e10cSrcweir 
1429*cdf0e10cSrcweir ScCellRangesBase::~ScCellRangesBase()
1430*cdf0e10cSrcweir {
1431*cdf0e10cSrcweir     //  #107294# call RemoveUnoObject first, so no notification can happen
1432*cdf0e10cSrcweir     //  during ForgetCurrentAttrs
1433*cdf0e10cSrcweir 
1434*cdf0e10cSrcweir     if (pDocShell)
1435*cdf0e10cSrcweir         pDocShell->GetDocument()->RemoveUnoObject(*this);
1436*cdf0e10cSrcweir 
1437*cdf0e10cSrcweir     ForgetCurrentAttrs();
1438*cdf0e10cSrcweir     ForgetMarkData();
1439*cdf0e10cSrcweir 
1440*cdf0e10cSrcweir     delete pValueListener;
1441*cdf0e10cSrcweir 
1442*cdf0e10cSrcweir     //! XChartDataChangeEventListener abmelden ??
1443*cdf0e10cSrcweir     //! (ChartCollection haelt dann auch dieses Objekt fest!)
1444*cdf0e10cSrcweir }
1445*cdf0e10cSrcweir 
1446*cdf0e10cSrcweir void ScCellRangesBase::ForgetCurrentAttrs()
1447*cdf0e10cSrcweir {
1448*cdf0e10cSrcweir     delete pCurrentFlat;
1449*cdf0e10cSrcweir     delete pCurrentDeep;
1450*cdf0e10cSrcweir     delete pCurrentDataSet;
1451*cdf0e10cSrcweir     delete pNoDfltCurrentDataSet;
1452*cdf0e10cSrcweir     pCurrentFlat = NULL;
1453*cdf0e10cSrcweir     pCurrentDeep = NULL;
1454*cdf0e10cSrcweir     pCurrentDataSet = NULL;
1455*cdf0e10cSrcweir     pNoDfltCurrentDataSet = NULL;
1456*cdf0e10cSrcweir 
1457*cdf0e10cSrcweir     // #i62483# pMarkData can remain unchanged, is deleted only if the range changes (RefChanged)
1458*cdf0e10cSrcweir }
1459*cdf0e10cSrcweir 
1460*cdf0e10cSrcweir void ScCellRangesBase::ForgetMarkData()
1461*cdf0e10cSrcweir {
1462*cdf0e10cSrcweir     delete pMarkData;
1463*cdf0e10cSrcweir     pMarkData = NULL;
1464*cdf0e10cSrcweir }
1465*cdf0e10cSrcweir 
1466*cdf0e10cSrcweir const ScPatternAttr* ScCellRangesBase::GetCurrentAttrsFlat()
1467*cdf0e10cSrcweir {
1468*cdf0e10cSrcweir     //  get and cache direct cell attributes for this object's range
1469*cdf0e10cSrcweir 
1470*cdf0e10cSrcweir     if ( !pCurrentFlat && pDocShell )
1471*cdf0e10cSrcweir     {
1472*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
1473*cdf0e10cSrcweir         pCurrentFlat = pDoc->CreateSelectionPattern( *GetMarkData(), sal_False );
1474*cdf0e10cSrcweir     }
1475*cdf0e10cSrcweir     return pCurrentFlat;
1476*cdf0e10cSrcweir }
1477*cdf0e10cSrcweir 
1478*cdf0e10cSrcweir const ScPatternAttr* ScCellRangesBase::GetCurrentAttrsDeep()
1479*cdf0e10cSrcweir {
1480*cdf0e10cSrcweir     //  get and cache cell attributes (incl. styles) for this object's range
1481*cdf0e10cSrcweir 
1482*cdf0e10cSrcweir     if ( !pCurrentDeep && pDocShell )
1483*cdf0e10cSrcweir     {
1484*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
1485*cdf0e10cSrcweir         pCurrentDeep = pDoc->CreateSelectionPattern( *GetMarkData(), sal_True );
1486*cdf0e10cSrcweir     }
1487*cdf0e10cSrcweir     return pCurrentDeep;
1488*cdf0e10cSrcweir }
1489*cdf0e10cSrcweir 
1490*cdf0e10cSrcweir SfxItemSet* ScCellRangesBase::GetCurrentDataSet(bool bNoDflt)
1491*cdf0e10cSrcweir {
1492*cdf0e10cSrcweir     if(!pCurrentDataSet)
1493*cdf0e10cSrcweir     {
1494*cdf0e10cSrcweir         const ScPatternAttr* pPattern = GetCurrentAttrsDeep();
1495*cdf0e10cSrcweir         if ( pPattern )
1496*cdf0e10cSrcweir         {
1497*cdf0e10cSrcweir             //  Dontcare durch Default ersetzen, damit man immer eine Reflection hat
1498*cdf0e10cSrcweir             pCurrentDataSet = new SfxItemSet( pPattern->GetItemSet() );
1499*cdf0e10cSrcweir             pNoDfltCurrentDataSet = new SfxItemSet( pPattern->GetItemSet() );
1500*cdf0e10cSrcweir             pCurrentDataSet->ClearInvalidItems();
1501*cdf0e10cSrcweir         }
1502*cdf0e10cSrcweir     }
1503*cdf0e10cSrcweir     return bNoDflt ? pNoDfltCurrentDataSet : pCurrentDataSet;
1504*cdf0e10cSrcweir }
1505*cdf0e10cSrcweir 
1506*cdf0e10cSrcweir const ScMarkData* ScCellRangesBase::GetMarkData()
1507*cdf0e10cSrcweir {
1508*cdf0e10cSrcweir     if (!pMarkData)
1509*cdf0e10cSrcweir     {
1510*cdf0e10cSrcweir         pMarkData = new ScMarkData();
1511*cdf0e10cSrcweir         pMarkData->MarkFromRangeList( aRanges, sal_False );
1512*cdf0e10cSrcweir     }
1513*cdf0e10cSrcweir     return pMarkData;
1514*cdf0e10cSrcweir }
1515*cdf0e10cSrcweir 
1516*cdf0e10cSrcweir void ScCellRangesBase::Notify( SfxBroadcaster&, const SfxHint& rHint )
1517*cdf0e10cSrcweir {
1518*cdf0e10cSrcweir     if ( rHint.ISA( ScUpdateRefHint ) )
1519*cdf0e10cSrcweir     {
1520*cdf0e10cSrcweir         const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
1521*cdf0e10cSrcweir 
1522*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
1523*cdf0e10cSrcweir         ScRangeList* pUndoRanges = NULL;
1524*cdf0e10cSrcweir         if ( pDoc->HasUnoRefUndo() )
1525*cdf0e10cSrcweir             pUndoRanges = new ScRangeList( aRanges );
1526*cdf0e10cSrcweir 
1527*cdf0e10cSrcweir         if ( aRanges.UpdateReference( rRef.GetMode(), pDoc, rRef.GetRange(),
1528*cdf0e10cSrcweir                                     rRef.GetDx(), rRef.GetDy(), rRef.GetDz() ) )
1529*cdf0e10cSrcweir         {
1530*cdf0e10cSrcweir             if (rRef.GetMode() == URM_INSDEL &&
1531*cdf0e10cSrcweir                 aRanges.Count() == 1 &&
1532*cdf0e10cSrcweir                 ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ))
1533*cdf0e10cSrcweir             {
1534*cdf0e10cSrcweir                 // #101755#; the range size of a sheet does not change
1535*cdf0e10cSrcweir                 ScRange* pR = aRanges.First();
1536*cdf0e10cSrcweir                 if (pR)
1537*cdf0e10cSrcweir                 {
1538*cdf0e10cSrcweir                     pR->aStart.SetCol(0);
1539*cdf0e10cSrcweir                     pR->aStart.SetRow(0);
1540*cdf0e10cSrcweir                     pR->aEnd.SetCol(MAXCOL);
1541*cdf0e10cSrcweir                     pR->aEnd.SetRow(MAXROW);
1542*cdf0e10cSrcweir                 }
1543*cdf0e10cSrcweir             }
1544*cdf0e10cSrcweir             RefChanged();
1545*cdf0e10cSrcweir 
1546*cdf0e10cSrcweir             // #129050# any change of the range address is broadcast to value (modify) listeners
1547*cdf0e10cSrcweir             if ( aValueListeners.Count() )
1548*cdf0e10cSrcweir                 bGotDataChangedHint = sal_True;
1549*cdf0e10cSrcweir 
1550*cdf0e10cSrcweir             if ( pUndoRanges )
1551*cdf0e10cSrcweir                 pDoc->AddUnoRefChange( nObjectId, *pUndoRanges );
1552*cdf0e10cSrcweir         }
1553*cdf0e10cSrcweir 
1554*cdf0e10cSrcweir         delete pUndoRanges;
1555*cdf0e10cSrcweir     }
1556*cdf0e10cSrcweir     else if ( rHint.ISA( SfxSimpleHint ) )
1557*cdf0e10cSrcweir     {
1558*cdf0e10cSrcweir         sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
1559*cdf0e10cSrcweir         if ( nId == SFX_HINT_DYING )
1560*cdf0e10cSrcweir         {
1561*cdf0e10cSrcweir             ForgetCurrentAttrs();
1562*cdf0e10cSrcweir             pDocShell = NULL;           // invalid
1563*cdf0e10cSrcweir 
1564*cdf0e10cSrcweir             if ( aValueListeners.Count() != 0 )
1565*cdf0e10cSrcweir             {
1566*cdf0e10cSrcweir                 //  dispose listeners
1567*cdf0e10cSrcweir 
1568*cdf0e10cSrcweir                 lang::EventObject aEvent;
1569*cdf0e10cSrcweir                 aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
1570*cdf0e10cSrcweir                 for ( sal_uInt16 n=0; n<aValueListeners.Count(); n++ )
1571*cdf0e10cSrcweir                     (*aValueListeners[n])->disposing( aEvent );
1572*cdf0e10cSrcweir 
1573*cdf0e10cSrcweir                 aValueListeners.DeleteAndDestroy( 0, aValueListeners.Count() );
1574*cdf0e10cSrcweir 
1575*cdf0e10cSrcweir                 //  The listeners can't have the last ref to this, as it's still held
1576*cdf0e10cSrcweir                 //  by the DocShell.
1577*cdf0e10cSrcweir             }
1578*cdf0e10cSrcweir         }
1579*cdf0e10cSrcweir         else if ( nId == SFX_HINT_DATACHANGED )
1580*cdf0e10cSrcweir         {
1581*cdf0e10cSrcweir             // document content changed -> forget cached attributes
1582*cdf0e10cSrcweir             ForgetCurrentAttrs();
1583*cdf0e10cSrcweir 
1584*cdf0e10cSrcweir             if ( bGotDataChangedHint && pDocShell )
1585*cdf0e10cSrcweir             {
1586*cdf0e10cSrcweir                 //  This object was notified of content changes, so one call
1587*cdf0e10cSrcweir                 //  for each listener is generated now.
1588*cdf0e10cSrcweir                 //  The calls can't be executed directly because the document's
1589*cdf0e10cSrcweir                 //  UNO broadcaster list must not be modified.
1590*cdf0e10cSrcweir                 //  Instead, add to the document's list of listener calls,
1591*cdf0e10cSrcweir                 //  which will be executed directly after the broadcast of
1592*cdf0e10cSrcweir                 //  SFX_HINT_DATACHANGED.
1593*cdf0e10cSrcweir 
1594*cdf0e10cSrcweir                 lang::EventObject aEvent;
1595*cdf0e10cSrcweir                 aEvent.Source.set((cppu::OWeakObject*)this);
1596*cdf0e10cSrcweir 
1597*cdf0e10cSrcweir                 // the EventObject holds a Ref to this object until after the listener calls
1598*cdf0e10cSrcweir 
1599*cdf0e10cSrcweir                 ScDocument* pDoc = pDocShell->GetDocument();
1600*cdf0e10cSrcweir                 for ( sal_uInt16 n=0; n<aValueListeners.Count(); n++ )
1601*cdf0e10cSrcweir                     pDoc->AddUnoListenerCall( *aValueListeners[n], aEvent );
1602*cdf0e10cSrcweir 
1603*cdf0e10cSrcweir                 bGotDataChangedHint = sal_False;
1604*cdf0e10cSrcweir             }
1605*cdf0e10cSrcweir         }
1606*cdf0e10cSrcweir         else if ( nId == SC_HINT_CALCALL )
1607*cdf0e10cSrcweir         {
1608*cdf0e10cSrcweir             // broadcast from DoHardRecalc - set bGotDataChangedHint
1609*cdf0e10cSrcweir             // (SFX_HINT_DATACHANGED follows separately)
1610*cdf0e10cSrcweir 
1611*cdf0e10cSrcweir             if ( aValueListeners.Count() )
1612*cdf0e10cSrcweir                 bGotDataChangedHint = sal_True;
1613*cdf0e10cSrcweir         }
1614*cdf0e10cSrcweir     }
1615*cdf0e10cSrcweir     else if ( rHint.ISA( ScUnoRefUndoHint ) )
1616*cdf0e10cSrcweir     {
1617*cdf0e10cSrcweir         const ScUnoRefUndoHint& rUndoHint = static_cast<const ScUnoRefUndoHint&>(rHint);
1618*cdf0e10cSrcweir         if ( rUndoHint.GetObjectId() == nObjectId )
1619*cdf0e10cSrcweir         {
1620*cdf0e10cSrcweir             // restore ranges from hint
1621*cdf0e10cSrcweir 
1622*cdf0e10cSrcweir             aRanges = rUndoHint.GetRanges();
1623*cdf0e10cSrcweir 
1624*cdf0e10cSrcweir             RefChanged();
1625*cdf0e10cSrcweir             if ( aValueListeners.Count() )
1626*cdf0e10cSrcweir                 bGotDataChangedHint = sal_True;     // need to broadcast the undo, too
1627*cdf0e10cSrcweir         }
1628*cdf0e10cSrcweir     }
1629*cdf0e10cSrcweir }
1630*cdf0e10cSrcweir 
1631*cdf0e10cSrcweir void ScCellRangesBase::RefChanged()
1632*cdf0e10cSrcweir {
1633*cdf0e10cSrcweir     //! adjust XChartDataChangeEventListener
1634*cdf0e10cSrcweir 
1635*cdf0e10cSrcweir     if ( pValueListener && aValueListeners.Count() != 0 )
1636*cdf0e10cSrcweir     {
1637*cdf0e10cSrcweir         pValueListener->EndListeningAll();
1638*cdf0e10cSrcweir 
1639*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
1640*cdf0e10cSrcweir         sal_uLong nCount = aRanges.Count();
1641*cdf0e10cSrcweir         for (sal_uLong i=0; i<nCount; i++)
1642*cdf0e10cSrcweir             pDoc->StartListeningArea( *aRanges.GetObject(i), pValueListener );
1643*cdf0e10cSrcweir     }
1644*cdf0e10cSrcweir 
1645*cdf0e10cSrcweir     ForgetCurrentAttrs();
1646*cdf0e10cSrcweir     ForgetMarkData();
1647*cdf0e10cSrcweir }
1648*cdf0e10cSrcweir 
1649*cdf0e10cSrcweir ScDocument* ScCellRangesBase::GetDocument() const
1650*cdf0e10cSrcweir {
1651*cdf0e10cSrcweir     if (pDocShell)
1652*cdf0e10cSrcweir         return pDocShell->GetDocument();
1653*cdf0e10cSrcweir     else
1654*cdf0e10cSrcweir         return NULL;
1655*cdf0e10cSrcweir }
1656*cdf0e10cSrcweir 
1657*cdf0e10cSrcweir void ScCellRangesBase::InitInsertRange(ScDocShell* pDocSh, const ScRange& rR)
1658*cdf0e10cSrcweir {
1659*cdf0e10cSrcweir     if ( !pDocShell && pDocSh )
1660*cdf0e10cSrcweir     {
1661*cdf0e10cSrcweir         pDocShell = pDocSh;
1662*cdf0e10cSrcweir 
1663*cdf0e10cSrcweir         ScRange aCellRange(rR);
1664*cdf0e10cSrcweir         aCellRange.Justify();
1665*cdf0e10cSrcweir         aRanges.RemoveAll();
1666*cdf0e10cSrcweir         aRanges.Append( aCellRange );
1667*cdf0e10cSrcweir 
1668*cdf0e10cSrcweir         pDocShell->GetDocument()->AddUnoObject(*this);
1669*cdf0e10cSrcweir 
1670*cdf0e10cSrcweir         RefChanged();   // Range im Range-Objekt anpassen
1671*cdf0e10cSrcweir     }
1672*cdf0e10cSrcweir }
1673*cdf0e10cSrcweir 
1674*cdf0e10cSrcweir void ScCellRangesBase::AddRange(const ScRange& rRange, const sal_Bool bMergeRanges)
1675*cdf0e10cSrcweir {
1676*cdf0e10cSrcweir     if (bMergeRanges)
1677*cdf0e10cSrcweir         aRanges.Join(rRange);
1678*cdf0e10cSrcweir     else
1679*cdf0e10cSrcweir         aRanges.Append(rRange);
1680*cdf0e10cSrcweir     RefChanged();
1681*cdf0e10cSrcweir }
1682*cdf0e10cSrcweir 
1683*cdf0e10cSrcweir void ScCellRangesBase::SetNewRange(const ScRange& rNew)
1684*cdf0e10cSrcweir {
1685*cdf0e10cSrcweir     ScRange aCellRange(rNew);
1686*cdf0e10cSrcweir     aCellRange.Justify();
1687*cdf0e10cSrcweir 
1688*cdf0e10cSrcweir     aRanges.RemoveAll();
1689*cdf0e10cSrcweir     aRanges.Append( aCellRange );
1690*cdf0e10cSrcweir     RefChanged();
1691*cdf0e10cSrcweir }
1692*cdf0e10cSrcweir 
1693*cdf0e10cSrcweir void ScCellRangesBase::SetNewRanges(const ScRangeList& rNew)
1694*cdf0e10cSrcweir {
1695*cdf0e10cSrcweir     aRanges = rNew;
1696*cdf0e10cSrcweir     RefChanged();
1697*cdf0e10cSrcweir }
1698*cdf0e10cSrcweir 
1699*cdf0e10cSrcweir void ScCellRangesBase::SetCursorOnly( sal_Bool bSet )
1700*cdf0e10cSrcweir {
1701*cdf0e10cSrcweir     //  set for a selection object that is created from the cursor position
1702*cdf0e10cSrcweir     //  without anything selected (may contain several sheets)
1703*cdf0e10cSrcweir 
1704*cdf0e10cSrcweir     bCursorOnly = bSet;
1705*cdf0e10cSrcweir }
1706*cdf0e10cSrcweir 
1707*cdf0e10cSrcweir uno::Any SAL_CALL ScCellRangesBase::queryInterface( const uno::Type& rType )
1708*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
1709*cdf0e10cSrcweir {
1710*cdf0e10cSrcweir     SC_QUERYINTERFACE( beans::XPropertySet )
1711*cdf0e10cSrcweir     SC_QUERYINTERFACE( beans::XMultiPropertySet )
1712*cdf0e10cSrcweir     SC_QUERYINTERFACE( beans::XTolerantMultiPropertySet )
1713*cdf0e10cSrcweir     SC_QUERYINTERFACE( beans::XPropertyState )
1714*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetOperation )
1715*cdf0e10cSrcweir     SC_QUERYINTERFACE( chart::XChartDataArray )
1716*cdf0e10cSrcweir     SC_QUERYINTERFACE( chart::XChartData )
1717*cdf0e10cSrcweir     SC_QUERYINTERFACE( util::XIndent )
1718*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XCellRangesQuery )
1719*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XFormulaQuery )
1720*cdf0e10cSrcweir     SC_QUERYINTERFACE( util::XReplaceable )
1721*cdf0e10cSrcweir     SC_QUERYINTERFACE( util::XSearchable )
1722*cdf0e10cSrcweir     SC_QUERYINTERFACE( util::XModifyBroadcaster )
1723*cdf0e10cSrcweir     SC_QUERYINTERFACE( lang::XServiceInfo )
1724*cdf0e10cSrcweir     SC_QUERYINTERFACE( lang::XUnoTunnel )
1725*cdf0e10cSrcweir     SC_QUERYINTERFACE( lang::XTypeProvider )
1726*cdf0e10cSrcweir 
1727*cdf0e10cSrcweir     return OWeakObject::queryInterface( rType );
1728*cdf0e10cSrcweir }
1729*cdf0e10cSrcweir 
1730*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::acquire() throw()
1731*cdf0e10cSrcweir {
1732*cdf0e10cSrcweir     OWeakObject::acquire();
1733*cdf0e10cSrcweir }
1734*cdf0e10cSrcweir 
1735*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::release() throw()
1736*cdf0e10cSrcweir {
1737*cdf0e10cSrcweir     OWeakObject::release();
1738*cdf0e10cSrcweir }
1739*cdf0e10cSrcweir 
1740*cdf0e10cSrcweir uno::Sequence<uno::Type> SAL_CALL ScCellRangesBase::getTypes() throw(uno::RuntimeException)
1741*cdf0e10cSrcweir {
1742*cdf0e10cSrcweir     static uno::Sequence<uno::Type> aTypes;
1743*cdf0e10cSrcweir     if ( aTypes.getLength() == 0 )
1744*cdf0e10cSrcweir     {
1745*cdf0e10cSrcweir         aTypes.realloc(13);
1746*cdf0e10cSrcweir         uno::Type* pPtr = aTypes.getArray();
1747*cdf0e10cSrcweir         pPtr[0] = getCppuType((const uno::Reference<beans::XPropertySet>*)0);
1748*cdf0e10cSrcweir         pPtr[1] = getCppuType((const uno::Reference<beans::XMultiPropertySet>*)0);
1749*cdf0e10cSrcweir         pPtr[2] = getCppuType((const uno::Reference<beans::XPropertyState>*)0);
1750*cdf0e10cSrcweir         pPtr[3] = getCppuType((const uno::Reference<sheet::XSheetOperation>*)0);
1751*cdf0e10cSrcweir         pPtr[4] = getCppuType((const uno::Reference<chart::XChartDataArray>*)0);
1752*cdf0e10cSrcweir         pPtr[5] = getCppuType((const uno::Reference<util::XIndent>*)0);
1753*cdf0e10cSrcweir         pPtr[6] = getCppuType((const uno::Reference<sheet::XCellRangesQuery>*)0);
1754*cdf0e10cSrcweir         pPtr[7] = getCppuType((const uno::Reference<sheet::XFormulaQuery>*)0);
1755*cdf0e10cSrcweir         pPtr[8] = getCppuType((const uno::Reference<util::XReplaceable>*)0);
1756*cdf0e10cSrcweir         pPtr[9] = getCppuType((const uno::Reference<util::XModifyBroadcaster>*)0);
1757*cdf0e10cSrcweir         pPtr[10]= getCppuType((const uno::Reference<lang::XServiceInfo>*)0);
1758*cdf0e10cSrcweir         pPtr[11]= getCppuType((const uno::Reference<lang::XUnoTunnel>*)0);
1759*cdf0e10cSrcweir         pPtr[12]= getCppuType((const uno::Reference<lang::XTypeProvider>*)0);
1760*cdf0e10cSrcweir     }
1761*cdf0e10cSrcweir     return aTypes;
1762*cdf0e10cSrcweir }
1763*cdf0e10cSrcweir 
1764*cdf0e10cSrcweir uno::Sequence<sal_Int8> SAL_CALL ScCellRangesBase::getImplementationId()
1765*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
1766*cdf0e10cSrcweir {
1767*cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId;
1768*cdf0e10cSrcweir     if( aId.getLength() == 0 )
1769*cdf0e10cSrcweir     {
1770*cdf0e10cSrcweir         aId.realloc( 16 );
1771*cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
1772*cdf0e10cSrcweir     }
1773*cdf0e10cSrcweir     return aId;
1774*cdf0e10cSrcweir }
1775*cdf0e10cSrcweir 
1776*cdf0e10cSrcweir // ---
1777*cdf0e10cSrcweir 
1778*cdf0e10cSrcweir void ScCellRangesBase::PaintRanges_Impl( sal_uInt16 nPart )
1779*cdf0e10cSrcweir {
1780*cdf0e10cSrcweir     sal_uLong nCount = aRanges.Count();
1781*cdf0e10cSrcweir     for (sal_uLong i=0; i<nCount; i++)
1782*cdf0e10cSrcweir         pDocShell->PostPaint( *aRanges.GetObject(i), nPart );
1783*cdf0e10cSrcweir }
1784*cdf0e10cSrcweir 
1785*cdf0e10cSrcweir // XSheetOperation
1786*cdf0e10cSrcweir 
1787*cdf0e10cSrcweir double SAL_CALL ScCellRangesBase::computeFunction( sheet::GeneralFunction nFunction )
1788*cdf0e10cSrcweir                                                 throw(uno::Exception, uno::RuntimeException)
1789*cdf0e10cSrcweir {
1790*cdf0e10cSrcweir     ScUnoGuard aGuard;
1791*cdf0e10cSrcweir     ScMarkData aMark(*GetMarkData());
1792*cdf0e10cSrcweir     aMark.MarkToSimple();
1793*cdf0e10cSrcweir     if (!aMark.IsMarked())
1794*cdf0e10cSrcweir         aMark.SetMarkNegative(sal_True);    // um Dummy Position angeben zu koennen
1795*cdf0e10cSrcweir 
1796*cdf0e10cSrcweir     ScAddress aDummy;                   // wenn nicht Marked, ignoriert wegen Negative
1797*cdf0e10cSrcweir     double fVal;
1798*cdf0e10cSrcweir     ScSubTotalFunc eFunc = lcl_SummaryToSubTotal( nFunction );
1799*cdf0e10cSrcweir     ScDocument* pDoc = pDocShell->GetDocument();
1800*cdf0e10cSrcweir     if ( !pDoc->GetSelectionFunction( eFunc, aDummy, aMark, fVal ) )
1801*cdf0e10cSrcweir     {
1802*cdf0e10cSrcweir         throw uno::RuntimeException();      //! own exception?
1803*cdf0e10cSrcweir     }
1804*cdf0e10cSrcweir 
1805*cdf0e10cSrcweir     return fVal;
1806*cdf0e10cSrcweir }
1807*cdf0e10cSrcweir 
1808*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::clearContents( sal_Int32 nContentFlags ) throw(uno::RuntimeException)
1809*cdf0e10cSrcweir {
1810*cdf0e10cSrcweir     ScUnoGuard aGuard;
1811*cdf0e10cSrcweir     if ( aRanges.Count() )
1812*cdf0e10cSrcweir     {
1813*cdf0e10cSrcweir         // only for clearContents: EDITATTR is only used if no contents are deleted
1814*cdf0e10cSrcweir         sal_uInt16 nDelFlags = static_cast< sal_uInt16 >( nContentFlags & IDF_ALL );
1815*cdf0e10cSrcweir         if ( ( nContentFlags & IDF_EDITATTR ) && ( nContentFlags & IDF_CONTENTS ) == 0 )
1816*cdf0e10cSrcweir             nDelFlags |= IDF_EDITATTR;
1817*cdf0e10cSrcweir 
1818*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocShell);
1819*cdf0e10cSrcweir         aFunc.DeleteContents( *GetMarkData(), nDelFlags, sal_True, sal_True );
1820*cdf0e10cSrcweir     }
1821*cdf0e10cSrcweir     // sonst ist nichts zu tun
1822*cdf0e10cSrcweir }
1823*cdf0e10cSrcweir 
1824*cdf0e10cSrcweir // XPropertyState
1825*cdf0e10cSrcweir 
1826*cdf0e10cSrcweir const SfxItemPropertyMap* ScCellRangesBase::GetItemPropertyMap()
1827*cdf0e10cSrcweir {
1828*cdf0e10cSrcweir     return pPropSet->getPropertyMap();
1829*cdf0e10cSrcweir }
1830*cdf0e10cSrcweir 
1831*cdf0e10cSrcweir void lcl_GetPropertyWhich( const SfxItemPropertySimpleEntry* pEntry,
1832*cdf0e10cSrcweir                                                 sal_uInt16& rItemWhich )
1833*cdf0e10cSrcweir {
1834*cdf0e10cSrcweir     //  Which-ID des betroffenen Items, auch wenn das Item die Property
1835*cdf0e10cSrcweir     //  nicht alleine behandeln kann
1836*cdf0e10cSrcweir     if ( pEntry )
1837*cdf0e10cSrcweir     {
1838*cdf0e10cSrcweir         if ( IsScItemWid( pEntry->nWID ) )
1839*cdf0e10cSrcweir             rItemWhich = pEntry->nWID;
1840*cdf0e10cSrcweir         else
1841*cdf0e10cSrcweir             switch ( pEntry->nWID )
1842*cdf0e10cSrcweir             {
1843*cdf0e10cSrcweir                 case SC_WID_UNO_TBLBORD:
1844*cdf0e10cSrcweir                     rItemWhich = ATTR_BORDER;
1845*cdf0e10cSrcweir                     break;
1846*cdf0e10cSrcweir                 case SC_WID_UNO_CONDFMT:
1847*cdf0e10cSrcweir                 case SC_WID_UNO_CONDLOC:
1848*cdf0e10cSrcweir                 case SC_WID_UNO_CONDXML:
1849*cdf0e10cSrcweir                     rItemWhich = ATTR_CONDITIONAL;
1850*cdf0e10cSrcweir                     break;
1851*cdf0e10cSrcweir                 case SC_WID_UNO_VALIDAT:
1852*cdf0e10cSrcweir                 case SC_WID_UNO_VALILOC:
1853*cdf0e10cSrcweir                 case SC_WID_UNO_VALIXML:
1854*cdf0e10cSrcweir                     rItemWhich = ATTR_VALIDDATA;
1855*cdf0e10cSrcweir                     break;
1856*cdf0e10cSrcweir             }
1857*cdf0e10cSrcweir     }
1858*cdf0e10cSrcweir 
1859*cdf0e10cSrcweir }
1860*cdf0e10cSrcweir 
1861*cdf0e10cSrcweir beans::PropertyState ScCellRangesBase::GetOnePropertyState( sal_uInt16 nItemWhich, const SfxItemPropertySimpleEntry* pEntry )
1862*cdf0e10cSrcweir {
1863*cdf0e10cSrcweir     beans::PropertyState eRet = beans::PropertyState_DIRECT_VALUE;
1864*cdf0e10cSrcweir     if ( nItemWhich )                   // item wid (from map or special case)
1865*cdf0e10cSrcweir     {
1866*cdf0e10cSrcweir         //  For items that contain several properties (like background),
1867*cdf0e10cSrcweir         //  "ambiguous" is returned too often here
1868*cdf0e10cSrcweir 
1869*cdf0e10cSrcweir         //  for PropertyState, don't look at styles
1870*cdf0e10cSrcweir         const ScPatternAttr* pPattern = GetCurrentAttrsFlat();
1871*cdf0e10cSrcweir         if ( pPattern )
1872*cdf0e10cSrcweir         {
1873*cdf0e10cSrcweir             SfxItemState eState = pPattern->GetItemSet().GetItemState( nItemWhich, sal_False );
1874*cdf0e10cSrcweir 
1875*cdf0e10cSrcweir //           //  if no rotate value is set, look at orientation
1876*cdf0e10cSrcweir //           //! also for a fixed value of 0 (in case orientation is ambiguous)?
1877*cdf0e10cSrcweir //           if ( nItemWhich == ATTR_ROTATE_VALUE && eState == SFX_ITEM_DEFAULT )
1878*cdf0e10cSrcweir //               eState = pPattern->GetItemSet().GetItemState( ATTR_ORIENTATION, sal_False );
1879*cdf0e10cSrcweir 
1880*cdf0e10cSrcweir             if ( nItemWhich == ATTR_VALUE_FORMAT && eState == SFX_ITEM_DEFAULT )
1881*cdf0e10cSrcweir                 eState = pPattern->GetItemSet().GetItemState( ATTR_LANGUAGE_FORMAT, sal_False );
1882*cdf0e10cSrcweir 
1883*cdf0e10cSrcweir             if ( eState == SFX_ITEM_SET )
1884*cdf0e10cSrcweir                 eRet = beans::PropertyState_DIRECT_VALUE;
1885*cdf0e10cSrcweir             else if ( eState == SFX_ITEM_DEFAULT )
1886*cdf0e10cSrcweir                 eRet = beans::PropertyState_DEFAULT_VALUE;
1887*cdf0e10cSrcweir             else if ( eState == SFX_ITEM_DONTCARE )
1888*cdf0e10cSrcweir                 eRet = beans::PropertyState_AMBIGUOUS_VALUE;
1889*cdf0e10cSrcweir             else
1890*cdf0e10cSrcweir             {
1891*cdf0e10cSrcweir                 DBG_ERROR("unbekannter ItemState");
1892*cdf0e10cSrcweir             }
1893*cdf0e10cSrcweir         }
1894*cdf0e10cSrcweir     }
1895*cdf0e10cSrcweir     else if ( pEntry )
1896*cdf0e10cSrcweir     {
1897*cdf0e10cSrcweir         if ( pEntry->nWID == SC_WID_UNO_CHCOLHDR || pEntry->nWID == SC_WID_UNO_CHROWHDR || pEntry->nWID == SC_WID_UNO_ABSNAME )
1898*cdf0e10cSrcweir             eRet = beans::PropertyState_DIRECT_VALUE;
1899*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
1900*cdf0e10cSrcweir         {
1901*cdf0e10cSrcweir             //  a style is always set, there's no default state
1902*cdf0e10cSrcweir             const ScStyleSheet* pStyle = pDocShell->GetDocument()->GetSelectionStyle(*GetMarkData());
1903*cdf0e10cSrcweir             if (pStyle)
1904*cdf0e10cSrcweir                 eRet = beans::PropertyState_DIRECT_VALUE;
1905*cdf0e10cSrcweir             else
1906*cdf0e10cSrcweir                 eRet = beans::PropertyState_AMBIGUOUS_VALUE;
1907*cdf0e10cSrcweir         }
1908*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_NUMRULES )
1909*cdf0e10cSrcweir             eRet = beans::PropertyState_DEFAULT_VALUE;      // numbering rules are always default
1910*cdf0e10cSrcweir     }
1911*cdf0e10cSrcweir     return eRet;
1912*cdf0e10cSrcweir }
1913*cdf0e10cSrcweir 
1914*cdf0e10cSrcweir beans::PropertyState SAL_CALL ScCellRangesBase::getPropertyState( const rtl::OUString& aPropertyName )
1915*cdf0e10cSrcweir                                 throw(beans::UnknownPropertyException, uno::RuntimeException)
1916*cdf0e10cSrcweir {
1917*cdf0e10cSrcweir     ScUnoGuard aGuard;
1918*cdf0e10cSrcweir     if ( aRanges.Count() == 0 )
1919*cdf0e10cSrcweir         throw uno::RuntimeException();
1920*cdf0e10cSrcweir 
1921*cdf0e10cSrcweir     const SfxItemPropertyMap* pMap = GetItemPropertyMap();     // from derived class
1922*cdf0e10cSrcweir     sal_uInt16 nItemWhich = 0;
1923*cdf0e10cSrcweir     const SfxItemPropertySimpleEntry* pEntry  = pMap->getByName( aPropertyName );
1924*cdf0e10cSrcweir     lcl_GetPropertyWhich( pEntry, nItemWhich );
1925*cdf0e10cSrcweir     return GetOnePropertyState( nItemWhich, pEntry );
1926*cdf0e10cSrcweir }
1927*cdf0e10cSrcweir 
1928*cdf0e10cSrcweir uno::Sequence<beans::PropertyState> SAL_CALL ScCellRangesBase::getPropertyStates(
1929*cdf0e10cSrcweir                                 const uno::Sequence<rtl::OUString>& aPropertyNames )
1930*cdf0e10cSrcweir                             throw(beans::UnknownPropertyException, uno::RuntimeException)
1931*cdf0e10cSrcweir {
1932*cdf0e10cSrcweir     ScUnoGuard aGuard;
1933*cdf0e10cSrcweir 
1934*cdf0e10cSrcweir     const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap();     // from derived class
1935*cdf0e10cSrcweir 
1936*cdf0e10cSrcweir     uno::Sequence<beans::PropertyState> aRet(aPropertyNames.getLength());
1937*cdf0e10cSrcweir     beans::PropertyState* pStates = aRet.getArray();
1938*cdf0e10cSrcweir     for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++)
1939*cdf0e10cSrcweir     {
1940*cdf0e10cSrcweir         sal_uInt16 nItemWhich = 0;
1941*cdf0e10cSrcweir         const SfxItemPropertySimpleEntry* pEntry  = pPropertyMap->getByName( aPropertyNames[i] );
1942*cdf0e10cSrcweir         lcl_GetPropertyWhich( pEntry, nItemWhich );
1943*cdf0e10cSrcweir         pStates[i] = GetOnePropertyState(nItemWhich, pEntry);
1944*cdf0e10cSrcweir     }
1945*cdf0e10cSrcweir     return aRet;
1946*cdf0e10cSrcweir }
1947*cdf0e10cSrcweir 
1948*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::setPropertyToDefault( const rtl::OUString& aPropertyName )
1949*cdf0e10cSrcweir                             throw(beans::UnknownPropertyException, uno::RuntimeException)
1950*cdf0e10cSrcweir {
1951*cdf0e10cSrcweir     ScUnoGuard aGuard;
1952*cdf0e10cSrcweir     if ( pDocShell )
1953*cdf0e10cSrcweir     {
1954*cdf0e10cSrcweir         const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap();     // from derived class
1955*cdf0e10cSrcweir         sal_uInt16 nItemWhich = 0;
1956*cdf0e10cSrcweir         const SfxItemPropertySimpleEntry* pEntry  = pPropertyMap->getByName( aPropertyName );
1957*cdf0e10cSrcweir         lcl_GetPropertyWhich( pEntry, nItemWhich );
1958*cdf0e10cSrcweir         if ( nItemWhich )               // item wid (from map or special case)
1959*cdf0e10cSrcweir         {
1960*cdf0e10cSrcweir             if ( aRanges.Count() )      // leer = nichts zu tun
1961*cdf0e10cSrcweir             {
1962*cdf0e10cSrcweir                 ScDocFunc aFunc(*pDocShell);
1963*cdf0e10cSrcweir 
1964*cdf0e10cSrcweir                 //! Bei Items, die mehrere Properties enthalten (z.B. Hintergrund)
1965*cdf0e10cSrcweir                 //! wird hier zuviel zurueckgesetzt
1966*cdf0e10cSrcweir 
1967*cdf0e10cSrcweir //               //! for ATTR_ROTATE_VALUE, also reset ATTR_ORIENTATION?
1968*cdf0e10cSrcweir 
1969*cdf0e10cSrcweir                 sal_uInt16 aWIDs[3];
1970*cdf0e10cSrcweir                 aWIDs[0] = nItemWhich;
1971*cdf0e10cSrcweir                 if ( nItemWhich == ATTR_VALUE_FORMAT )
1972*cdf0e10cSrcweir                 {
1973*cdf0e10cSrcweir                     aWIDs[1] = ATTR_LANGUAGE_FORMAT;    // #67847# language for number formats
1974*cdf0e10cSrcweir                     aWIDs[2] = 0;
1975*cdf0e10cSrcweir                 }
1976*cdf0e10cSrcweir                 else
1977*cdf0e10cSrcweir                     aWIDs[1] = 0;
1978*cdf0e10cSrcweir                 aFunc.ClearItems( *GetMarkData(), aWIDs, sal_True );
1979*cdf0e10cSrcweir             }
1980*cdf0e10cSrcweir         }
1981*cdf0e10cSrcweir         else if ( pEntry )
1982*cdf0e10cSrcweir         {
1983*cdf0e10cSrcweir             if ( pEntry->nWID == SC_WID_UNO_CHCOLHDR )
1984*cdf0e10cSrcweir                 bChartColAsHdr = sal_False;
1985*cdf0e10cSrcweir             else if ( pEntry->nWID == SC_WID_UNO_CHROWHDR )
1986*cdf0e10cSrcweir                 bChartRowAsHdr = sal_False;
1987*cdf0e10cSrcweir             else if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
1988*cdf0e10cSrcweir             {
1989*cdf0e10cSrcweir                 ScDocFunc aFunc(*pDocShell);
1990*cdf0e10cSrcweir                 aFunc.ApplyStyle( *GetMarkData(), ScGlobal::GetRscString(STR_STYLENAME_STANDARD), sal_True, sal_True );
1991*cdf0e10cSrcweir             }
1992*cdf0e10cSrcweir         }
1993*cdf0e10cSrcweir     }
1994*cdf0e10cSrcweir }
1995*cdf0e10cSrcweir 
1996*cdf0e10cSrcweir uno::Any SAL_CALL ScCellRangesBase::getPropertyDefault( const rtl::OUString& aPropertyName )
1997*cdf0e10cSrcweir                                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
1998*cdf0e10cSrcweir                                         uno::RuntimeException)
1999*cdf0e10cSrcweir {
2000*cdf0e10cSrcweir     //! mit getPropertyValue zusammenfassen
2001*cdf0e10cSrcweir 
2002*cdf0e10cSrcweir     ScUnoGuard aGuard;
2003*cdf0e10cSrcweir     uno::Any aAny;
2004*cdf0e10cSrcweir 
2005*cdf0e10cSrcweir     if ( pDocShell )
2006*cdf0e10cSrcweir     {
2007*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
2008*cdf0e10cSrcweir         const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap();     // from derived class
2009*cdf0e10cSrcweir         const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyName );
2010*cdf0e10cSrcweir         if ( pEntry )
2011*cdf0e10cSrcweir         {
2012*cdf0e10cSrcweir             if ( IsScItemWid( pEntry->nWID ) )
2013*cdf0e10cSrcweir             {
2014*cdf0e10cSrcweir                 const ScPatternAttr* pPattern = pDoc->GetDefPattern();
2015*cdf0e10cSrcweir                 if ( pPattern )
2016*cdf0e10cSrcweir                 {
2017*cdf0e10cSrcweir                     const SfxItemSet& rSet = pPattern->GetItemSet();
2018*cdf0e10cSrcweir 
2019*cdf0e10cSrcweir                     switch ( pEntry->nWID )     // fuer Item-Spezial-Behandlungen
2020*cdf0e10cSrcweir                     {
2021*cdf0e10cSrcweir                         case ATTR_VALUE_FORMAT:
2022*cdf0e10cSrcweir                             //  default has no language set
2023*cdf0e10cSrcweir                             aAny <<= (sal_Int32)( ((const SfxUInt32Item&)rSet.Get(pEntry->nWID)).GetValue() );
2024*cdf0e10cSrcweir                             break;
2025*cdf0e10cSrcweir                         case ATTR_INDENT:
2026*cdf0e10cSrcweir                             aAny <<= (sal_Int16)( TwipsToHMM(((const SfxUInt16Item&)
2027*cdf0e10cSrcweir                                             rSet.Get(pEntry->nWID)).GetValue()) );
2028*cdf0e10cSrcweir                             break;
2029*cdf0e10cSrcweir                         default:
2030*cdf0e10cSrcweir                             pPropSet->getPropertyValue(aPropertyName, rSet, aAny);
2031*cdf0e10cSrcweir                     }
2032*cdf0e10cSrcweir                 }
2033*cdf0e10cSrcweir             }
2034*cdf0e10cSrcweir             else
2035*cdf0e10cSrcweir                 switch ( pEntry->nWID )
2036*cdf0e10cSrcweir                 {
2037*cdf0e10cSrcweir                     case SC_WID_UNO_CHCOLHDR:
2038*cdf0e10cSrcweir                     case SC_WID_UNO_CHROWHDR:
2039*cdf0e10cSrcweir                         ScUnoHelpFunctions::SetBoolInAny( aAny, sal_False );
2040*cdf0e10cSrcweir                         break;
2041*cdf0e10cSrcweir                     case SC_WID_UNO_CELLSTYL:
2042*cdf0e10cSrcweir                         aAny <<= rtl::OUString( ScStyleNameConversion::DisplayToProgrammaticName(
2043*cdf0e10cSrcweir                                     ScGlobal::GetRscString(STR_STYLENAME_STANDARD), SFX_STYLE_FAMILY_PARA ) );
2044*cdf0e10cSrcweir                         break;
2045*cdf0e10cSrcweir                     case SC_WID_UNO_TBLBORD:
2046*cdf0e10cSrcweir                         {
2047*cdf0e10cSrcweir                             const ScPatternAttr* pPattern = pDoc->GetDefPattern();
2048*cdf0e10cSrcweir                             if ( pPattern )
2049*cdf0e10cSrcweir                             {
2050*cdf0e10cSrcweir                                 table::TableBorder aBorder;
2051*cdf0e10cSrcweir                                 ScHelperFunctions::FillTableBorder( aBorder,
2052*cdf0e10cSrcweir                                         (const SvxBoxItem&)pPattern->GetItem(ATTR_BORDER),
2053*cdf0e10cSrcweir                                         (const SvxBoxInfoItem&)pPattern->GetItem(ATTR_BORDER_INNER) );
2054*cdf0e10cSrcweir                                 aAny <<= aBorder;
2055*cdf0e10cSrcweir                             }
2056*cdf0e10cSrcweir                         }
2057*cdf0e10cSrcweir                         break;
2058*cdf0e10cSrcweir                     case SC_WID_UNO_CONDFMT:
2059*cdf0e10cSrcweir                     case SC_WID_UNO_CONDLOC:
2060*cdf0e10cSrcweir                     case SC_WID_UNO_CONDXML:
2061*cdf0e10cSrcweir                         {
2062*cdf0e10cSrcweir                             sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC );
2063*cdf0e10cSrcweir                             sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML );
2064*cdf0e10cSrcweir                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
2065*cdf0e10cSrcweir                                     pDoc->GetStorageGrammar() :
2066*cdf0e10cSrcweir                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
2067*cdf0e10cSrcweir 
2068*cdf0e10cSrcweir                             aAny <<= uno::Reference<sheet::XSheetConditionalEntries>(
2069*cdf0e10cSrcweir                                     new ScTableConditionalFormat( pDoc, 0, eGrammar ));
2070*cdf0e10cSrcweir                         }
2071*cdf0e10cSrcweir                         break;
2072*cdf0e10cSrcweir                     case SC_WID_UNO_VALIDAT:
2073*cdf0e10cSrcweir                     case SC_WID_UNO_VALILOC:
2074*cdf0e10cSrcweir                     case SC_WID_UNO_VALIXML:
2075*cdf0e10cSrcweir                         {
2076*cdf0e10cSrcweir                             sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC );
2077*cdf0e10cSrcweir                             sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML );
2078*cdf0e10cSrcweir                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
2079*cdf0e10cSrcweir                                     pDoc->GetStorageGrammar() :
2080*cdf0e10cSrcweir                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
2081*cdf0e10cSrcweir 
2082*cdf0e10cSrcweir                             aAny <<= uno::Reference<beans::XPropertySet>(
2083*cdf0e10cSrcweir                                     new ScTableValidationObj( pDoc, 0, eGrammar ));
2084*cdf0e10cSrcweir                         }
2085*cdf0e10cSrcweir                         break;
2086*cdf0e10cSrcweir                     case SC_WID_UNO_NUMRULES:
2087*cdf0e10cSrcweir                         {
2088*cdf0e10cSrcweir                             aAny <<= uno::Reference<container::XIndexReplace>(ScStyleObj::CreateEmptyNumberingRules());
2089*cdf0e10cSrcweir                         }
2090*cdf0e10cSrcweir                         break;
2091*cdf0e10cSrcweir                 }
2092*cdf0e10cSrcweir         }
2093*cdf0e10cSrcweir     }
2094*cdf0e10cSrcweir 
2095*cdf0e10cSrcweir     return aAny;
2096*cdf0e10cSrcweir }
2097*cdf0e10cSrcweir 
2098*cdf0e10cSrcweir // XPropertySet
2099*cdf0e10cSrcweir 
2100*cdf0e10cSrcweir uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellRangesBase::getPropertySetInfo()
2101*cdf0e10cSrcweir                                                         throw(uno::RuntimeException)
2102*cdf0e10cSrcweir {
2103*cdf0e10cSrcweir     ScUnoGuard aGuard;
2104*cdf0e10cSrcweir     static uno::Reference<beans::XPropertySetInfo> aRef(
2105*cdf0e10cSrcweir         new SfxItemPropertySetInfo( pPropSet->getPropertyMap() ));
2106*cdf0e10cSrcweir     return aRef;
2107*cdf0e10cSrcweir }
2108*cdf0e10cSrcweir 
2109*cdf0e10cSrcweir 
2110*cdf0e10cSrcweir void lcl_SetCellProperty( const SfxItemPropertySimpleEntry& rEntry, const uno::Any& rValue,
2111*cdf0e10cSrcweir                             ScPatternAttr& rPattern, ScDocument* pDoc,
2112*cdf0e10cSrcweir                             sal_uInt16& rFirstItemId, sal_uInt16& rSecondItemId )
2113*cdf0e10cSrcweir {
2114*cdf0e10cSrcweir     rFirstItemId = rEntry.nWID;
2115*cdf0e10cSrcweir     rSecondItemId = 0;
2116*cdf0e10cSrcweir 
2117*cdf0e10cSrcweir     SfxItemSet& rSet = rPattern.GetItemSet();
2118*cdf0e10cSrcweir     switch ( rEntry.nWID )
2119*cdf0e10cSrcweir     {
2120*cdf0e10cSrcweir         case ATTR_VALUE_FORMAT:
2121*cdf0e10cSrcweir             {
2122*cdf0e10cSrcweir                 // #67847# language for number formats
2123*cdf0e10cSrcweir                 SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
2124*cdf0e10cSrcweir                 sal_uLong nOldFormat = ((const SfxUInt32Item&)rSet.Get( ATTR_VALUE_FORMAT )).GetValue();
2125*cdf0e10cSrcweir                 LanguageType eOldLang = ((const SvxLanguageItem&)rSet.Get( ATTR_LANGUAGE_FORMAT )).GetLanguage();
2126*cdf0e10cSrcweir                 nOldFormat = pFormatter->GetFormatForLanguageIfBuiltIn( nOldFormat, eOldLang );
2127*cdf0e10cSrcweir 
2128*cdf0e10cSrcweir                 sal_Int32 nIntVal = 0;
2129*cdf0e10cSrcweir                 if ( rValue >>= nIntVal )
2130*cdf0e10cSrcweir                 {
2131*cdf0e10cSrcweir                     sal_uLong nNewFormat = (sal_uLong)nIntVal;
2132*cdf0e10cSrcweir                     rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) );
2133*cdf0e10cSrcweir 
2134*cdf0e10cSrcweir                     const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewFormat );
2135*cdf0e10cSrcweir                     LanguageType eNewLang =
2136*cdf0e10cSrcweir                         pNewEntry ? pNewEntry->GetLanguage() : LANGUAGE_DONTKNOW;
2137*cdf0e10cSrcweir                     if ( eNewLang != eOldLang && eNewLang != LANGUAGE_DONTKNOW )
2138*cdf0e10cSrcweir                     {
2139*cdf0e10cSrcweir                         rSet.Put( SvxLanguageItem( eNewLang, ATTR_LANGUAGE_FORMAT ) );
2140*cdf0e10cSrcweir 
2141*cdf0e10cSrcweir                         // #40606# if only language is changed,
2142*cdf0e10cSrcweir                         // don't touch number format attribute
2143*cdf0e10cSrcweir                         sal_uLong nNewMod = nNewFormat % SV_COUNTRY_LANGUAGE_OFFSET;
2144*cdf0e10cSrcweir                         if ( nNewMod == ( nOldFormat % SV_COUNTRY_LANGUAGE_OFFSET ) &&
2145*cdf0e10cSrcweir                              nNewMod <= SV_MAX_ANZ_STANDARD_FORMATE )
2146*cdf0e10cSrcweir                         {
2147*cdf0e10cSrcweir                             rFirstItemId = 0;       // don't use ATTR_VALUE_FORMAT value
2148*cdf0e10cSrcweir                         }
2149*cdf0e10cSrcweir 
2150*cdf0e10cSrcweir                         rSecondItemId = ATTR_LANGUAGE_FORMAT;
2151*cdf0e10cSrcweir                     }
2152*cdf0e10cSrcweir                 }
2153*cdf0e10cSrcweir                 else
2154*cdf0e10cSrcweir                     throw lang::IllegalArgumentException();
2155*cdf0e10cSrcweir             }
2156*cdf0e10cSrcweir             break;
2157*cdf0e10cSrcweir         case ATTR_INDENT:
2158*cdf0e10cSrcweir             {
2159*cdf0e10cSrcweir                 sal_Int16 nIntVal = 0;
2160*cdf0e10cSrcweir                 if ( rValue >>= nIntVal )
2161*cdf0e10cSrcweir                     rSet.Put( SfxUInt16Item( rEntry.nWID, (sal_uInt16)HMMToTwips(nIntVal) ) );
2162*cdf0e10cSrcweir                 else
2163*cdf0e10cSrcweir                     throw lang::IllegalArgumentException();
2164*cdf0e10cSrcweir             }
2165*cdf0e10cSrcweir             break;
2166*cdf0e10cSrcweir         case ATTR_ROTATE_VALUE:
2167*cdf0e10cSrcweir             {
2168*cdf0e10cSrcweir                 sal_Int32 nRotVal = 0;
2169*cdf0e10cSrcweir                 if ( rValue >>= nRotVal )
2170*cdf0e10cSrcweir                 {
2171*cdf0e10cSrcweir                     //  stored value is always between 0 and 360 deg.
2172*cdf0e10cSrcweir                     nRotVal %= 36000;
2173*cdf0e10cSrcweir                     if ( nRotVal < 0 )
2174*cdf0e10cSrcweir                         nRotVal += 36000;
2175*cdf0e10cSrcweir 
2176*cdf0e10cSrcweir                     rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, nRotVal ) );
2177*cdf0e10cSrcweir                 }
2178*cdf0e10cSrcweir                 else
2179*cdf0e10cSrcweir                     throw lang::IllegalArgumentException();
2180*cdf0e10cSrcweir             }
2181*cdf0e10cSrcweir             break;
2182*cdf0e10cSrcweir         case ATTR_STACKED:
2183*cdf0e10cSrcweir             {
2184*cdf0e10cSrcweir                 table::CellOrientation eOrient;
2185*cdf0e10cSrcweir                 if( rValue >>= eOrient )
2186*cdf0e10cSrcweir                 {
2187*cdf0e10cSrcweir                     switch( eOrient )
2188*cdf0e10cSrcweir                     {
2189*cdf0e10cSrcweir                         case table::CellOrientation_STANDARD:
2190*cdf0e10cSrcweir                             rSet.Put( SfxBoolItem( ATTR_STACKED, sal_False ) );
2191*cdf0e10cSrcweir                         break;
2192*cdf0e10cSrcweir                         case table::CellOrientation_TOPBOTTOM:
2193*cdf0e10cSrcweir                             rSet.Put( SfxBoolItem( ATTR_STACKED, sal_False ) );
2194*cdf0e10cSrcweir                             rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 27000 ) );
2195*cdf0e10cSrcweir                             rSecondItemId = ATTR_ROTATE_VALUE;
2196*cdf0e10cSrcweir                         break;
2197*cdf0e10cSrcweir                         case table::CellOrientation_BOTTOMTOP:
2198*cdf0e10cSrcweir                             rSet.Put( SfxBoolItem( ATTR_STACKED, sal_False ) );
2199*cdf0e10cSrcweir                             rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 9000 ) );
2200*cdf0e10cSrcweir                             rSecondItemId = ATTR_ROTATE_VALUE;
2201*cdf0e10cSrcweir                         break;
2202*cdf0e10cSrcweir                         case table::CellOrientation_STACKED:
2203*cdf0e10cSrcweir                             rSet.Put( SfxBoolItem( ATTR_STACKED, sal_True ) );
2204*cdf0e10cSrcweir                         break;
2205*cdf0e10cSrcweir                         default:
2206*cdf0e10cSrcweir                         {
2207*cdf0e10cSrcweir                             // added to avoid warnings
2208*cdf0e10cSrcweir                         }
2209*cdf0e10cSrcweir                     }
2210*cdf0e10cSrcweir                 }
2211*cdf0e10cSrcweir             }
2212*cdf0e10cSrcweir             break;
2213*cdf0e10cSrcweir         default:
2214*cdf0e10cSrcweir             {
2215*cdf0e10cSrcweir                 lcl_GetCellsPropertySet()->setPropertyValue(rEntry, rValue, rSet);
2216*cdf0e10cSrcweir             }
2217*cdf0e10cSrcweir     }
2218*cdf0e10cSrcweir }
2219*cdf0e10cSrcweir 
2220*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::setPropertyValue(
2221*cdf0e10cSrcweir                         const rtl::OUString& aPropertyName, const uno::Any& aValue )
2222*cdf0e10cSrcweir                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
2223*cdf0e10cSrcweir                         lang::IllegalArgumentException, lang::WrappedTargetException,
2224*cdf0e10cSrcweir                         uno::RuntimeException)
2225*cdf0e10cSrcweir {
2226*cdf0e10cSrcweir     ScUnoGuard aGuard;
2227*cdf0e10cSrcweir 
2228*cdf0e10cSrcweir     if ( !pDocShell || aRanges.Count() == 0 )
2229*cdf0e10cSrcweir         throw uno::RuntimeException();
2230*cdf0e10cSrcweir 
2231*cdf0e10cSrcweir     const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap();     // from derived class
2232*cdf0e10cSrcweir     const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyName );
2233*cdf0e10cSrcweir     if ( !pEntry )
2234*cdf0e10cSrcweir         throw beans::UnknownPropertyException();
2235*cdf0e10cSrcweir 
2236*cdf0e10cSrcweir     SetOnePropertyValue( pEntry, aValue );
2237*cdf0e10cSrcweir }
2238*cdf0e10cSrcweir 
2239*cdf0e10cSrcweir void ScCellRangesBase::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
2240*cdf0e10cSrcweir                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
2241*cdf0e10cSrcweir {
2242*cdf0e10cSrcweir     if ( pEntry )
2243*cdf0e10cSrcweir     {
2244*cdf0e10cSrcweir         if ( IsScItemWid( pEntry->nWID ) )
2245*cdf0e10cSrcweir         {
2246*cdf0e10cSrcweir             if ( aRanges.Count() )      // leer = nichts zu tun
2247*cdf0e10cSrcweir             {
2248*cdf0e10cSrcweir                 ScDocument* pDoc = pDocShell->GetDocument();
2249*cdf0e10cSrcweir                 ScDocFunc aFunc(*pDocShell);
2250*cdf0e10cSrcweir 
2251*cdf0e10cSrcweir                 //  Fuer Teile von zusammengesetzten Items mit mehreren Properties (z.B. Hintergrund)
2252*cdf0e10cSrcweir                 //  muss vorher das alte Item aus dem Dokument geholt werden
2253*cdf0e10cSrcweir                 //! Das kann hier aber nicht erkannt werden
2254*cdf0e10cSrcweir                 //! -> eigenes Flag im PropertyMap-Eintrag, oder was ???
2255*cdf0e10cSrcweir                 //! Item direkt von einzelner Position im Bereich holen?
2256*cdf0e10cSrcweir                 //  ClearInvalidItems, damit auf jeden Fall ein Item vom richtigen Typ da ist
2257*cdf0e10cSrcweir 
2258*cdf0e10cSrcweir                 ScPatternAttr aPattern( *GetCurrentAttrsDeep() );
2259*cdf0e10cSrcweir                 SfxItemSet& rSet = aPattern.GetItemSet();
2260*cdf0e10cSrcweir                 rSet.ClearInvalidItems();
2261*cdf0e10cSrcweir 
2262*cdf0e10cSrcweir                 sal_uInt16 nFirstItem, nSecondItem;
2263*cdf0e10cSrcweir                 lcl_SetCellProperty( *pEntry, aValue, aPattern, pDoc, nFirstItem, nSecondItem );
2264*cdf0e10cSrcweir 
2265*cdf0e10cSrcweir                 for (sal_uInt16 nWhich = ATTR_PATTERN_START; nWhich <= ATTR_PATTERN_END; nWhich++)
2266*cdf0e10cSrcweir                     if ( nWhich != nFirstItem && nWhich != nSecondItem )
2267*cdf0e10cSrcweir                         rSet.ClearItem(nWhich);
2268*cdf0e10cSrcweir 
2269*cdf0e10cSrcweir                 aFunc.ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True );
2270*cdf0e10cSrcweir             }
2271*cdf0e10cSrcweir         }
2272*cdf0e10cSrcweir         else        // implemented here
2273*cdf0e10cSrcweir             switch ( pEntry->nWID )
2274*cdf0e10cSrcweir             {
2275*cdf0e10cSrcweir                 case SC_WID_UNO_CHCOLHDR:
2276*cdf0e10cSrcweir                     // chart header flags are set for this object, not stored with document
2277*cdf0e10cSrcweir                     bChartColAsHdr = ScUnoHelpFunctions::GetBoolFromAny( aValue );
2278*cdf0e10cSrcweir                     break;
2279*cdf0e10cSrcweir                 case SC_WID_UNO_CHROWHDR:
2280*cdf0e10cSrcweir                     bChartRowAsHdr = ScUnoHelpFunctions::GetBoolFromAny( aValue );
2281*cdf0e10cSrcweir                     break;
2282*cdf0e10cSrcweir                 case SC_WID_UNO_CELLSTYL:
2283*cdf0e10cSrcweir                     {
2284*cdf0e10cSrcweir                         rtl::OUString aStrVal;
2285*cdf0e10cSrcweir                         aValue >>= aStrVal;
2286*cdf0e10cSrcweir                         String aString(ScStyleNameConversion::ProgrammaticToDisplayName(
2287*cdf0e10cSrcweir                                                             aStrVal, SFX_STYLE_FAMILY_PARA ));
2288*cdf0e10cSrcweir                         ScDocFunc aFunc(*pDocShell);
2289*cdf0e10cSrcweir                         aFunc.ApplyStyle( *GetMarkData(), aString, sal_True, sal_True );
2290*cdf0e10cSrcweir                     }
2291*cdf0e10cSrcweir                     break;
2292*cdf0e10cSrcweir                 case SC_WID_UNO_TBLBORD:
2293*cdf0e10cSrcweir                     {
2294*cdf0e10cSrcweir                         table::TableBorder aBorder;
2295*cdf0e10cSrcweir                         if ( aRanges.Count() && ( aValue >>= aBorder ) )    // empty = nothing to do
2296*cdf0e10cSrcweir                         {
2297*cdf0e10cSrcweir                             SvxBoxItem aOuter(ATTR_BORDER);
2298*cdf0e10cSrcweir                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
2299*cdf0e10cSrcweir                             ScHelperFunctions::FillBoxItems( aOuter, aInner, aBorder );
2300*cdf0e10cSrcweir 
2301*cdf0e10cSrcweir                             ScHelperFunctions::ApplyBorder( pDocShell, aRanges, aOuter, aInner );   //! docfunc
2302*cdf0e10cSrcweir                         }
2303*cdf0e10cSrcweir                     }
2304*cdf0e10cSrcweir                     break;
2305*cdf0e10cSrcweir                 case SC_WID_UNO_CONDFMT:
2306*cdf0e10cSrcweir                 case SC_WID_UNO_CONDLOC:
2307*cdf0e10cSrcweir                 case SC_WID_UNO_CONDXML:
2308*cdf0e10cSrcweir                     {
2309*cdf0e10cSrcweir                         uno::Reference<sheet::XSheetConditionalEntries> xInterface(aValue, uno::UNO_QUERY);
2310*cdf0e10cSrcweir                         if ( aRanges.Count() && xInterface.is() )   // leer = nichts zu tun
2311*cdf0e10cSrcweir                         {
2312*cdf0e10cSrcweir                             ScTableConditionalFormat* pFormat =
2313*cdf0e10cSrcweir                                     ScTableConditionalFormat::getImplementation( xInterface );
2314*cdf0e10cSrcweir                             if (pFormat)
2315*cdf0e10cSrcweir                             {
2316*cdf0e10cSrcweir                                 ScDocument* pDoc = pDocShell->GetDocument();
2317*cdf0e10cSrcweir                                 sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC );
2318*cdf0e10cSrcweir                                 sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML );
2319*cdf0e10cSrcweir                                 formula::FormulaGrammar::Grammar eGrammar = (bXML ?
2320*cdf0e10cSrcweir                                        formula::FormulaGrammar::GRAM_UNSPECIFIED :
2321*cdf0e10cSrcweir                                        formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
2322*cdf0e10cSrcweir 
2323*cdf0e10cSrcweir                                 ScConditionalFormat aNew( 0, pDoc );    // Index wird beim Einfuegen gesetzt
2324*cdf0e10cSrcweir                                 pFormat->FillFormat( aNew, pDoc, eGrammar );
2325*cdf0e10cSrcweir                                 sal_uLong nIndex = pDoc->AddCondFormat( aNew );
2326*cdf0e10cSrcweir 
2327*cdf0e10cSrcweir                                 ScDocFunc aFunc(*pDocShell);
2328*cdf0e10cSrcweir 
2329*cdf0e10cSrcweir                                 ScPatternAttr aPattern( pDoc->GetPool() );
2330*cdf0e10cSrcweir                                 aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_CONDITIONAL, nIndex ) );
2331*cdf0e10cSrcweir                                 aFunc.ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True );
2332*cdf0e10cSrcweir                             }
2333*cdf0e10cSrcweir                         }
2334*cdf0e10cSrcweir                     }
2335*cdf0e10cSrcweir                     break;
2336*cdf0e10cSrcweir                 case SC_WID_UNO_VALIDAT:
2337*cdf0e10cSrcweir                 case SC_WID_UNO_VALILOC:
2338*cdf0e10cSrcweir                 case SC_WID_UNO_VALIXML:
2339*cdf0e10cSrcweir                     {
2340*cdf0e10cSrcweir                         uno::Reference<beans::XPropertySet> xInterface(aValue, uno::UNO_QUERY);
2341*cdf0e10cSrcweir                         if ( aRanges.Count() && xInterface.is() )   // leer = nichts zu tun
2342*cdf0e10cSrcweir                         {
2343*cdf0e10cSrcweir                             ScTableValidationObj* pValidObj =
2344*cdf0e10cSrcweir                                     ScTableValidationObj::getImplementation( xInterface );
2345*cdf0e10cSrcweir                             if (pValidObj)
2346*cdf0e10cSrcweir                             {
2347*cdf0e10cSrcweir                                 ScDocument* pDoc = pDocShell->GetDocument();
2348*cdf0e10cSrcweir                                 sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC );
2349*cdf0e10cSrcweir                                 sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML );
2350*cdf0e10cSrcweir                                 formula::FormulaGrammar::Grammar eGrammar = (bXML ?
2351*cdf0e10cSrcweir                                        formula::FormulaGrammar::GRAM_UNSPECIFIED :
2352*cdf0e10cSrcweir                                        formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
2353*cdf0e10cSrcweir 
2354*cdf0e10cSrcweir                                 ScValidationData* pNewData =
2355*cdf0e10cSrcweir                                         pValidObj->CreateValidationData( pDoc, eGrammar );
2356*cdf0e10cSrcweir                                 sal_uLong nIndex = pDoc->AddValidationEntry( *pNewData );
2357*cdf0e10cSrcweir                                 delete pNewData;
2358*cdf0e10cSrcweir 
2359*cdf0e10cSrcweir                                 ScDocFunc aFunc(*pDocShell);
2360*cdf0e10cSrcweir 
2361*cdf0e10cSrcweir                                 ScPatternAttr aPattern( pDoc->GetPool() );
2362*cdf0e10cSrcweir                                 aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALIDDATA, nIndex ) );
2363*cdf0e10cSrcweir                                 aFunc.ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True );
2364*cdf0e10cSrcweir                             }
2365*cdf0e10cSrcweir                         }
2366*cdf0e10cSrcweir                     }
2367*cdf0e10cSrcweir                     break;
2368*cdf0e10cSrcweir                 // SC_WID_UNO_NUMRULES is ignored...
2369*cdf0e10cSrcweir             }
2370*cdf0e10cSrcweir     }
2371*cdf0e10cSrcweir }
2372*cdf0e10cSrcweir 
2373*cdf0e10cSrcweir uno::Any SAL_CALL ScCellRangesBase::getPropertyValue( const rtl::OUString& aPropertyName )
2374*cdf0e10cSrcweir                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
2375*cdf0e10cSrcweir                         uno::RuntimeException)
2376*cdf0e10cSrcweir {
2377*cdf0e10cSrcweir     ScUnoGuard aGuard;
2378*cdf0e10cSrcweir 
2379*cdf0e10cSrcweir     if ( !pDocShell || aRanges.Count() == 0 )
2380*cdf0e10cSrcweir         throw uno::RuntimeException();
2381*cdf0e10cSrcweir 
2382*cdf0e10cSrcweir     const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap();     // from derived class
2383*cdf0e10cSrcweir     const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyName );
2384*cdf0e10cSrcweir     if ( !pEntry )
2385*cdf0e10cSrcweir         throw beans::UnknownPropertyException();
2386*cdf0e10cSrcweir 
2387*cdf0e10cSrcweir     uno::Any aAny;
2388*cdf0e10cSrcweir     GetOnePropertyValue( pEntry, aAny );
2389*cdf0e10cSrcweir     return aAny;
2390*cdf0e10cSrcweir }
2391*cdf0e10cSrcweir 
2392*cdf0e10cSrcweir void ScCellRangesBase::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
2393*cdf0e10cSrcweir                                                 uno::Any& rAny )
2394*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
2395*cdf0e10cSrcweir {
2396*cdf0e10cSrcweir     if ( pEntry )
2397*cdf0e10cSrcweir     {
2398*cdf0e10cSrcweir         if ( IsScItemWid( pEntry->nWID ) )
2399*cdf0e10cSrcweir         {
2400*cdf0e10cSrcweir             SfxItemSet* pDataSet = GetCurrentDataSet();
2401*cdf0e10cSrcweir             if ( pDataSet )
2402*cdf0e10cSrcweir             {
2403*cdf0e10cSrcweir                 switch ( pEntry->nWID )     // fuer Item-Spezial-Behandlungen
2404*cdf0e10cSrcweir                 {
2405*cdf0e10cSrcweir                     case ATTR_VALUE_FORMAT:
2406*cdf0e10cSrcweir                         {
2407*cdf0e10cSrcweir                             ScDocument* pDoc = pDocShell->GetDocument();
2408*cdf0e10cSrcweir 
2409*cdf0e10cSrcweir                             sal_uLong nOldFormat = ((const SfxUInt32Item&)
2410*cdf0e10cSrcweir                                     pDataSet->Get( ATTR_VALUE_FORMAT )).GetValue();
2411*cdf0e10cSrcweir                             LanguageType eOldLang = ((const SvxLanguageItem&)
2412*cdf0e10cSrcweir                                     pDataSet->Get( ATTR_LANGUAGE_FORMAT )).GetLanguage();
2413*cdf0e10cSrcweir                             nOldFormat = pDoc->GetFormatTable()->
2414*cdf0e10cSrcweir                                     GetFormatForLanguageIfBuiltIn( nOldFormat, eOldLang );
2415*cdf0e10cSrcweir                             rAny <<= (sal_Int32)( nOldFormat );
2416*cdf0e10cSrcweir                         }
2417*cdf0e10cSrcweir                         break;
2418*cdf0e10cSrcweir                     case ATTR_INDENT:
2419*cdf0e10cSrcweir                         rAny <<= (sal_Int16)( TwipsToHMM(((const SfxUInt16Item&)
2420*cdf0e10cSrcweir                                         pDataSet->Get(pEntry->nWID)).GetValue()) );
2421*cdf0e10cSrcweir                         break;
2422*cdf0e10cSrcweir                     case ATTR_STACKED:
2423*cdf0e10cSrcweir                         {
2424*cdf0e10cSrcweir                             sal_Int32 nRot = ((const SfxInt32Item&)pDataSet->Get(ATTR_ROTATE_VALUE)).GetValue();
2425*cdf0e10cSrcweir                             sal_Bool bStacked = ((const SfxBoolItem&)pDataSet->Get(pEntry->nWID)).GetValue();
2426*cdf0e10cSrcweir                             SvxOrientationItem( nRot, bStacked, 0 ).QueryValue( rAny );
2427*cdf0e10cSrcweir                         }
2428*cdf0e10cSrcweir                         break;
2429*cdf0e10cSrcweir                     default:
2430*cdf0e10cSrcweir                         pPropSet->getPropertyValue(*pEntry, *pDataSet, rAny);
2431*cdf0e10cSrcweir                 }
2432*cdf0e10cSrcweir             }
2433*cdf0e10cSrcweir         }
2434*cdf0e10cSrcweir         else        // implemented here
2435*cdf0e10cSrcweir             switch ( pEntry->nWID )
2436*cdf0e10cSrcweir             {
2437*cdf0e10cSrcweir                 case SC_WID_UNO_CHCOLHDR:
2438*cdf0e10cSrcweir                     ScUnoHelpFunctions::SetBoolInAny( rAny, bChartColAsHdr );
2439*cdf0e10cSrcweir                     break;
2440*cdf0e10cSrcweir                 case SC_WID_UNO_CHROWHDR:
2441*cdf0e10cSrcweir                     ScUnoHelpFunctions::SetBoolInAny( rAny, bChartRowAsHdr );
2442*cdf0e10cSrcweir                     break;
2443*cdf0e10cSrcweir                 case SC_WID_UNO_CELLSTYL:
2444*cdf0e10cSrcweir                     {
2445*cdf0e10cSrcweir                         String aStyleName;
2446*cdf0e10cSrcweir                         const ScStyleSheet* pStyle = pDocShell->GetDocument()->GetSelectionStyle(*GetMarkData());
2447*cdf0e10cSrcweir                         if (pStyle)
2448*cdf0e10cSrcweir                             aStyleName = pStyle->GetName();
2449*cdf0e10cSrcweir                         rAny <<= rtl::OUString( ScStyleNameConversion::DisplayToProgrammaticName(
2450*cdf0e10cSrcweir                                                                 aStyleName, SFX_STYLE_FAMILY_PARA ) );
2451*cdf0e10cSrcweir                     }
2452*cdf0e10cSrcweir                     break;
2453*cdf0e10cSrcweir                 case SC_WID_UNO_TBLBORD:
2454*cdf0e10cSrcweir                     {
2455*cdf0e10cSrcweir                         //! loop throgh all ranges
2456*cdf0e10cSrcweir                         const ScRange* pFirst = aRanges.GetObject(0);
2457*cdf0e10cSrcweir                         if (pFirst)
2458*cdf0e10cSrcweir                         {
2459*cdf0e10cSrcweir                             SvxBoxItem aOuter(ATTR_BORDER);
2460*cdf0e10cSrcweir                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
2461*cdf0e10cSrcweir 
2462*cdf0e10cSrcweir                             ScDocument* pDoc = pDocShell->GetDocument();
2463*cdf0e10cSrcweir                             ScMarkData aMark;
2464*cdf0e10cSrcweir                             aMark.SetMarkArea( *pFirst );
2465*cdf0e10cSrcweir                             aMark.SelectTable( pFirst->aStart.Tab(), sal_True );
2466*cdf0e10cSrcweir                             pDoc->GetSelectionFrame( aMark, aOuter, aInner );
2467*cdf0e10cSrcweir 
2468*cdf0e10cSrcweir                             table::TableBorder aBorder;
2469*cdf0e10cSrcweir                             ScHelperFunctions::FillTableBorder( aBorder, aOuter, aInner );
2470*cdf0e10cSrcweir                             rAny <<= aBorder;
2471*cdf0e10cSrcweir                         }
2472*cdf0e10cSrcweir                     }
2473*cdf0e10cSrcweir                     break;
2474*cdf0e10cSrcweir                 case SC_WID_UNO_CONDFMT:
2475*cdf0e10cSrcweir                 case SC_WID_UNO_CONDLOC:
2476*cdf0e10cSrcweir                 case SC_WID_UNO_CONDXML:
2477*cdf0e10cSrcweir                     {
2478*cdf0e10cSrcweir                         const ScPatternAttr* pPattern = GetCurrentAttrsDeep();
2479*cdf0e10cSrcweir                         if ( pPattern )
2480*cdf0e10cSrcweir                         {
2481*cdf0e10cSrcweir                             ScDocument* pDoc = pDocShell->GetDocument();
2482*cdf0e10cSrcweir                             sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC );
2483*cdf0e10cSrcweir                             sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML );
2484*cdf0e10cSrcweir                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
2485*cdf0e10cSrcweir                                     pDoc->GetStorageGrammar() :
2486*cdf0e10cSrcweir                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
2487*cdf0e10cSrcweir                             sal_uLong nIndex = ((const SfxUInt32Item&)
2488*cdf0e10cSrcweir                                     pPattern->GetItem(ATTR_CONDITIONAL)).GetValue();
2489*cdf0e10cSrcweir                             rAny <<= uno::Reference<sheet::XSheetConditionalEntries>(
2490*cdf0e10cSrcweir                                     new ScTableConditionalFormat( pDoc, nIndex, eGrammar ));
2491*cdf0e10cSrcweir                         }
2492*cdf0e10cSrcweir                     }
2493*cdf0e10cSrcweir                     break;
2494*cdf0e10cSrcweir                 case SC_WID_UNO_VALIDAT:
2495*cdf0e10cSrcweir                 case SC_WID_UNO_VALILOC:
2496*cdf0e10cSrcweir                 case SC_WID_UNO_VALIXML:
2497*cdf0e10cSrcweir                     {
2498*cdf0e10cSrcweir                         const ScPatternAttr* pPattern = GetCurrentAttrsDeep();
2499*cdf0e10cSrcweir                         if ( pPattern )
2500*cdf0e10cSrcweir                         {
2501*cdf0e10cSrcweir                             ScDocument* pDoc = pDocShell->GetDocument();
2502*cdf0e10cSrcweir                             sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC );
2503*cdf0e10cSrcweir                             sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML );
2504*cdf0e10cSrcweir                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
2505*cdf0e10cSrcweir                                     pDoc->GetStorageGrammar() :
2506*cdf0e10cSrcweir                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
2507*cdf0e10cSrcweir                             sal_uLong nIndex = ((const SfxUInt32Item&)
2508*cdf0e10cSrcweir                                     pPattern->GetItem(ATTR_VALIDDATA)).GetValue();
2509*cdf0e10cSrcweir                             rAny <<= uno::Reference<beans::XPropertySet>(
2510*cdf0e10cSrcweir                                     new ScTableValidationObj( pDoc, nIndex, eGrammar ));
2511*cdf0e10cSrcweir                         }
2512*cdf0e10cSrcweir                     }
2513*cdf0e10cSrcweir                     break;
2514*cdf0e10cSrcweir                 case SC_WID_UNO_NUMRULES:
2515*cdf0e10cSrcweir                     {
2516*cdf0e10cSrcweir                         // always return empty numbering rules object
2517*cdf0e10cSrcweir                         rAny <<= uno::Reference<container::XIndexReplace>(ScStyleObj::CreateEmptyNumberingRules());
2518*cdf0e10cSrcweir                     }
2519*cdf0e10cSrcweir                     break;
2520*cdf0e10cSrcweir                 case SC_WID_UNO_ABSNAME:
2521*cdf0e10cSrcweir                     {
2522*cdf0e10cSrcweir                         String sRet;
2523*cdf0e10cSrcweir                         aRanges.Format(sRet, SCR_ABS_3D, pDocShell->GetDocument());
2524*cdf0e10cSrcweir                         rAny <<= rtl::OUString(sRet);
2525*cdf0e10cSrcweir                     }
2526*cdf0e10cSrcweir             }
2527*cdf0e10cSrcweir     }
2528*cdf0e10cSrcweir }
2529*cdf0e10cSrcweir 
2530*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::addPropertyChangeListener( const rtl::OUString& /* aPropertyName */,
2531*cdf0e10cSrcweir                             const uno::Reference<beans::XPropertyChangeListener>& /* aListener */)
2532*cdf0e10cSrcweir                             throw(beans::UnknownPropertyException,
2533*cdf0e10cSrcweir                                     lang::WrappedTargetException, uno::RuntimeException)
2534*cdf0e10cSrcweir {
2535*cdf0e10cSrcweir     ScUnoGuard aGuard;
2536*cdf0e10cSrcweir     if ( aRanges.Count() == 0 )
2537*cdf0e10cSrcweir         throw uno::RuntimeException();
2538*cdf0e10cSrcweir 
2539*cdf0e10cSrcweir     DBG_ERROR("not implemented");
2540*cdf0e10cSrcweir }
2541*cdf0e10cSrcweir 
2542*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::removePropertyChangeListener( const rtl::OUString& /* aPropertyName */,
2543*cdf0e10cSrcweir                             const uno::Reference<beans::XPropertyChangeListener>& /* aListener */)
2544*cdf0e10cSrcweir                             throw(beans::UnknownPropertyException,
2545*cdf0e10cSrcweir                                     lang::WrappedTargetException, uno::RuntimeException)
2546*cdf0e10cSrcweir {
2547*cdf0e10cSrcweir     ScUnoGuard aGuard;
2548*cdf0e10cSrcweir     if ( aRanges.Count() == 0 )
2549*cdf0e10cSrcweir         throw uno::RuntimeException();
2550*cdf0e10cSrcweir 
2551*cdf0e10cSrcweir     DBG_ERROR("not implemented");
2552*cdf0e10cSrcweir }
2553*cdf0e10cSrcweir 
2554*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::addVetoableChangeListener( const rtl::OUString&,
2555*cdf0e10cSrcweir                             const uno::Reference<beans::XVetoableChangeListener>&)
2556*cdf0e10cSrcweir                             throw(beans::UnknownPropertyException,
2557*cdf0e10cSrcweir                                 lang::WrappedTargetException, uno::RuntimeException)
2558*cdf0e10cSrcweir {
2559*cdf0e10cSrcweir     DBG_ERROR("not implemented");
2560*cdf0e10cSrcweir }
2561*cdf0e10cSrcweir 
2562*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::removeVetoableChangeListener( const rtl::OUString&,
2563*cdf0e10cSrcweir                             const uno::Reference<beans::XVetoableChangeListener>&)
2564*cdf0e10cSrcweir                             throw(beans::UnknownPropertyException,
2565*cdf0e10cSrcweir                                 lang::WrappedTargetException, uno::RuntimeException)
2566*cdf0e10cSrcweir {
2567*cdf0e10cSrcweir     DBG_ERROR("not implemented");
2568*cdf0e10cSrcweir }
2569*cdf0e10cSrcweir 
2570*cdf0e10cSrcweir // XMultiPropertySet
2571*cdf0e10cSrcweir 
2572*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::setPropertyValues( const uno::Sequence< rtl::OUString >& aPropertyNames,
2573*cdf0e10cSrcweir                                     const uno::Sequence< uno::Any >& aValues )
2574*cdf0e10cSrcweir                                 throw (beans::PropertyVetoException,
2575*cdf0e10cSrcweir                                     lang::IllegalArgumentException,
2576*cdf0e10cSrcweir                                     lang::WrappedTargetException,
2577*cdf0e10cSrcweir                                     uno::RuntimeException)
2578*cdf0e10cSrcweir {
2579*cdf0e10cSrcweir     ScUnoGuard aGuard;
2580*cdf0e10cSrcweir 
2581*cdf0e10cSrcweir     sal_Int32 nCount(aPropertyNames.getLength());
2582*cdf0e10cSrcweir     sal_Int32 nValues(aValues.getLength());
2583*cdf0e10cSrcweir     if (nCount != nValues)
2584*cdf0e10cSrcweir         throw lang::IllegalArgumentException();
2585*cdf0e10cSrcweir 
2586*cdf0e10cSrcweir     if ( pDocShell && nCount )
2587*cdf0e10cSrcweir     {
2588*cdf0e10cSrcweir         const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap();      // from derived class
2589*cdf0e10cSrcweir         const rtl::OUString* pNames = aPropertyNames.getConstArray();
2590*cdf0e10cSrcweir         const uno::Any* pValues = aValues.getConstArray();
2591*cdf0e10cSrcweir 
2592*cdf0e10cSrcweir         const SfxItemPropertySimpleEntry** pEntryArray = new const SfxItemPropertySimpleEntry*[nCount];
2593*cdf0e10cSrcweir 
2594*cdf0e10cSrcweir         sal_Int32 i;
2595*cdf0e10cSrcweir         for(i = 0; i < nCount; i++)
2596*cdf0e10cSrcweir         {
2597*cdf0e10cSrcweir             // first loop: find all properties in map, but handle only CellStyle
2598*cdf0e10cSrcweir             // (CellStyle must be set before any other cell properties)
2599*cdf0e10cSrcweir 
2600*cdf0e10cSrcweir             const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( pNames[i] );
2601*cdf0e10cSrcweir             pEntryArray[i] = pEntry;
2602*cdf0e10cSrcweir             if (pEntry)
2603*cdf0e10cSrcweir             {
2604*cdf0e10cSrcweir                 if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
2605*cdf0e10cSrcweir                 {
2606*cdf0e10cSrcweir                     try
2607*cdf0e10cSrcweir                     {
2608*cdf0e10cSrcweir                         SetOnePropertyValue( pEntry, pValues[i] );
2609*cdf0e10cSrcweir                     }
2610*cdf0e10cSrcweir                     catch ( lang::IllegalArgumentException& )
2611*cdf0e10cSrcweir                     {
2612*cdf0e10cSrcweir                         DBG_ERROR("exception when setting cell style");     // not supposed to happen
2613*cdf0e10cSrcweir                     }
2614*cdf0e10cSrcweir                 }
2615*cdf0e10cSrcweir             }
2616*cdf0e10cSrcweir         }
2617*cdf0e10cSrcweir 
2618*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
2619*cdf0e10cSrcweir         ScPatternAttr* pOldPattern = NULL;
2620*cdf0e10cSrcweir         ScPatternAttr* pNewPattern = NULL;
2621*cdf0e10cSrcweir 
2622*cdf0e10cSrcweir         for(i = 0; i < nCount; i++)
2623*cdf0e10cSrcweir         {
2624*cdf0e10cSrcweir             // second loop: handle other properties
2625*cdf0e10cSrcweir 
2626*cdf0e10cSrcweir             const SfxItemPropertySimpleEntry* pEntry = pEntryArray[i];
2627*cdf0e10cSrcweir             if ( pEntry )
2628*cdf0e10cSrcweir             {
2629*cdf0e10cSrcweir                 if ( IsScItemWid( pEntry->nWID ) )  // can be handled by SfxItemPropertySet
2630*cdf0e10cSrcweir                 {
2631*cdf0e10cSrcweir                     if ( !pOldPattern )
2632*cdf0e10cSrcweir                     {
2633*cdf0e10cSrcweir                         pOldPattern = new ScPatternAttr( *GetCurrentAttrsDeep() );
2634*cdf0e10cSrcweir                         pOldPattern->GetItemSet().ClearInvalidItems();
2635*cdf0e10cSrcweir                         pNewPattern = new ScPatternAttr( pDoc->GetPool() );
2636*cdf0e10cSrcweir                     }
2637*cdf0e10cSrcweir 
2638*cdf0e10cSrcweir                     //  collect items in pNewPattern, apply with one call after the loop
2639*cdf0e10cSrcweir 
2640*cdf0e10cSrcweir                     sal_uInt16 nFirstItem, nSecondItem;
2641*cdf0e10cSrcweir                     lcl_SetCellProperty( *pEntry, pValues[i], *pOldPattern, pDoc, nFirstItem, nSecondItem );
2642*cdf0e10cSrcweir 
2643*cdf0e10cSrcweir                     //  put only affected items into new set
2644*cdf0e10cSrcweir                     if ( nFirstItem )
2645*cdf0e10cSrcweir                         pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nFirstItem ) );
2646*cdf0e10cSrcweir                     if ( nSecondItem )
2647*cdf0e10cSrcweir                         pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nSecondItem ) );
2648*cdf0e10cSrcweir                 }
2649*cdf0e10cSrcweir                 else if ( pEntry->nWID != SC_WID_UNO_CELLSTYL )   // CellStyle is handled above
2650*cdf0e10cSrcweir                 {
2651*cdf0e10cSrcweir                     //  call virtual method to set a single property
2652*cdf0e10cSrcweir                     SetOnePropertyValue( pEntry, pValues[i] );
2653*cdf0e10cSrcweir                 }
2654*cdf0e10cSrcweir             }
2655*cdf0e10cSrcweir         }
2656*cdf0e10cSrcweir 
2657*cdf0e10cSrcweir         if ( pNewPattern && aRanges.Count() )
2658*cdf0e10cSrcweir         {
2659*cdf0e10cSrcweir             ScDocFunc aFunc(*pDocShell);
2660*cdf0e10cSrcweir             aFunc.ApplyAttributes( *GetMarkData(), *pNewPattern, sal_True, sal_True );
2661*cdf0e10cSrcweir         }
2662*cdf0e10cSrcweir 
2663*cdf0e10cSrcweir         delete pNewPattern;
2664*cdf0e10cSrcweir         delete pOldPattern;
2665*cdf0e10cSrcweir         delete[] pEntryArray;
2666*cdf0e10cSrcweir     }
2667*cdf0e10cSrcweir }
2668*cdf0e10cSrcweir 
2669*cdf0e10cSrcweir uno::Sequence<uno::Any> SAL_CALL ScCellRangesBase::getPropertyValues(
2670*cdf0e10cSrcweir                                 const uno::Sequence< rtl::OUString >& aPropertyNames )
2671*cdf0e10cSrcweir                                     throw (uno::RuntimeException)
2672*cdf0e10cSrcweir {
2673*cdf0e10cSrcweir     ScUnoGuard aGuard;
2674*cdf0e10cSrcweir 
2675*cdf0e10cSrcweir     const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap();     // from derived class
2676*cdf0e10cSrcweir 
2677*cdf0e10cSrcweir     uno::Sequence<uno::Any> aRet(aPropertyNames.getLength());
2678*cdf0e10cSrcweir     uno::Any* pProperties = aRet.getArray();
2679*cdf0e10cSrcweir     for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++)
2680*cdf0e10cSrcweir     {
2681*cdf0e10cSrcweir         const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyNames[i] );
2682*cdf0e10cSrcweir         GetOnePropertyValue( pEntry, pProperties[i] );
2683*cdf0e10cSrcweir     }
2684*cdf0e10cSrcweir     return aRet;
2685*cdf0e10cSrcweir }
2686*cdf0e10cSrcweir 
2687*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::addPropertiesChangeListener( const uno::Sequence< rtl::OUString >& /* aPropertyNames */,
2688*cdf0e10cSrcweir                                     const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ )
2689*cdf0e10cSrcweir                                 throw (uno::RuntimeException)
2690*cdf0e10cSrcweir {
2691*cdf0e10cSrcweir     DBG_ERROR("not implemented");
2692*cdf0e10cSrcweir }
2693*cdf0e10cSrcweir 
2694*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::removePropertiesChangeListener( const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ )
2695*cdf0e10cSrcweir                                 throw (uno::RuntimeException)
2696*cdf0e10cSrcweir {
2697*cdf0e10cSrcweir     DBG_ERROR("not implemented");
2698*cdf0e10cSrcweir }
2699*cdf0e10cSrcweir 
2700*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::firePropertiesChangeEvent( const uno::Sequence< rtl::OUString >& /* aPropertyNames */,
2701*cdf0e10cSrcweir                                     const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ )
2702*cdf0e10cSrcweir                                 throw (uno::RuntimeException)
2703*cdf0e10cSrcweir {
2704*cdf0e10cSrcweir     DBG_ERROR("not implemented");
2705*cdf0e10cSrcweir }
2706*cdf0e10cSrcweir 
2707*cdf0e10cSrcweir IMPL_LINK( ScCellRangesBase, ValueListenerHdl, SfxHint*, pHint )
2708*cdf0e10cSrcweir {
2709*cdf0e10cSrcweir     if ( pDocShell && pHint && pHint->ISA( SfxSimpleHint ) &&
2710*cdf0e10cSrcweir             ((const SfxSimpleHint*)pHint)->GetId() & (SC_HINT_DATACHANGED | SC_HINT_DYING) )
2711*cdf0e10cSrcweir     {
2712*cdf0e10cSrcweir         //  This may be called several times for a single change, if several formulas
2713*cdf0e10cSrcweir         //  in the range are notified. So only a flag is set that is checked when
2714*cdf0e10cSrcweir         //  SFX_HINT_DATACHANGED is received.
2715*cdf0e10cSrcweir 
2716*cdf0e10cSrcweir         bGotDataChangedHint = sal_True;
2717*cdf0e10cSrcweir     }
2718*cdf0e10cSrcweir     return 0;
2719*cdf0e10cSrcweir }
2720*cdf0e10cSrcweir 
2721*cdf0e10cSrcweir // XTolerantMultiPropertySet
2722*cdf0e10cSrcweir uno::Sequence< beans::SetPropertyTolerantFailed > SAL_CALL ScCellRangesBase::setPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames,
2723*cdf0e10cSrcweir                                     const uno::Sequence< uno::Any >& aValues )
2724*cdf0e10cSrcweir                                     throw (lang::IllegalArgumentException, uno::RuntimeException)
2725*cdf0e10cSrcweir {
2726*cdf0e10cSrcweir     ScUnoGuard aGuard;
2727*cdf0e10cSrcweir 
2728*cdf0e10cSrcweir     sal_Int32 nCount(aPropertyNames.getLength());
2729*cdf0e10cSrcweir     sal_Int32 nValues(aValues.getLength());
2730*cdf0e10cSrcweir     if (nCount != nValues)
2731*cdf0e10cSrcweir         throw lang::IllegalArgumentException();
2732*cdf0e10cSrcweir 
2733*cdf0e10cSrcweir     if ( pDocShell && nCount )
2734*cdf0e10cSrcweir     {
2735*cdf0e10cSrcweir         uno::Sequence < beans::SetPropertyTolerantFailed > aReturns(nCount);
2736*cdf0e10cSrcweir         beans::SetPropertyTolerantFailed* pReturns = aReturns.getArray();
2737*cdf0e10cSrcweir 
2738*cdf0e10cSrcweir         const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap();     // from derived class
2739*cdf0e10cSrcweir         const rtl::OUString* pNames = aPropertyNames.getConstArray();
2740*cdf0e10cSrcweir         const uno::Any* pValues = aValues.getConstArray();
2741*cdf0e10cSrcweir 
2742*cdf0e10cSrcweir         const SfxItemPropertySimpleEntry** pMapArray = new const SfxItemPropertySimpleEntry*[nCount];
2743*cdf0e10cSrcweir 
2744*cdf0e10cSrcweir         sal_Int32 i;
2745*cdf0e10cSrcweir         for(i = 0; i < nCount; i++)
2746*cdf0e10cSrcweir         {
2747*cdf0e10cSrcweir             // first loop: find all properties in map, but handle only CellStyle
2748*cdf0e10cSrcweir             // (CellStyle must be set before any other cell properties)
2749*cdf0e10cSrcweir 
2750*cdf0e10cSrcweir             const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( pNames[i] );
2751*cdf0e10cSrcweir             pMapArray[i] = pEntry;
2752*cdf0e10cSrcweir             if (pEntry)
2753*cdf0e10cSrcweir             {
2754*cdf0e10cSrcweir                 if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
2755*cdf0e10cSrcweir                 {
2756*cdf0e10cSrcweir                     try
2757*cdf0e10cSrcweir                     {
2758*cdf0e10cSrcweir                         SetOnePropertyValue( pEntry, pValues[i] );
2759*cdf0e10cSrcweir                     }
2760*cdf0e10cSrcweir                     catch ( lang::IllegalArgumentException& )
2761*cdf0e10cSrcweir                     {
2762*cdf0e10cSrcweir                         DBG_ERROR("exception when setting cell style");     // not supposed to happen
2763*cdf0e10cSrcweir                     }
2764*cdf0e10cSrcweir                 }
2765*cdf0e10cSrcweir             }
2766*cdf0e10cSrcweir         }
2767*cdf0e10cSrcweir 
2768*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
2769*cdf0e10cSrcweir         ScPatternAttr* pOldPattern = NULL;
2770*cdf0e10cSrcweir         ScPatternAttr* pNewPattern = NULL;
2771*cdf0e10cSrcweir 
2772*cdf0e10cSrcweir         sal_Int32 nFailed(0);
2773*cdf0e10cSrcweir         for(i = 0; i < nCount; i++)
2774*cdf0e10cSrcweir         {
2775*cdf0e10cSrcweir             // second loop: handle other properties
2776*cdf0e10cSrcweir 
2777*cdf0e10cSrcweir             const SfxItemPropertySimpleEntry* pEntry = pMapArray[i];
2778*cdf0e10cSrcweir             if ( pEntry && ((pEntry->nFlags & beans::PropertyAttribute::READONLY) == 0))
2779*cdf0e10cSrcweir             {
2780*cdf0e10cSrcweir                 if ( IsScItemWid( pEntry->nWID ) )  // can be handled by SfxItemPropertySet
2781*cdf0e10cSrcweir                 {
2782*cdf0e10cSrcweir                     if ( !pOldPattern )
2783*cdf0e10cSrcweir                     {
2784*cdf0e10cSrcweir                         pOldPattern = new ScPatternAttr( *GetCurrentAttrsDeep() );
2785*cdf0e10cSrcweir                         pOldPattern->GetItemSet().ClearInvalidItems();
2786*cdf0e10cSrcweir                         pNewPattern = new ScPatternAttr( pDoc->GetPool() );
2787*cdf0e10cSrcweir                     }
2788*cdf0e10cSrcweir 
2789*cdf0e10cSrcweir                     //  collect items in pNewPattern, apply with one call after the loop
2790*cdf0e10cSrcweir 
2791*cdf0e10cSrcweir                     sal_uInt16 nFirstItem, nSecondItem;
2792*cdf0e10cSrcweir                     try
2793*cdf0e10cSrcweir                     {
2794*cdf0e10cSrcweir                         lcl_SetCellProperty( *pEntry, pValues[i], *pOldPattern, pDoc, nFirstItem, nSecondItem );
2795*cdf0e10cSrcweir 
2796*cdf0e10cSrcweir                         //  put only affected items into new set
2797*cdf0e10cSrcweir                         if ( nFirstItem )
2798*cdf0e10cSrcweir                             pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nFirstItem ) );
2799*cdf0e10cSrcweir                         if ( nSecondItem )
2800*cdf0e10cSrcweir                             pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nSecondItem ) );
2801*cdf0e10cSrcweir                     }
2802*cdf0e10cSrcweir                     catch ( lang::IllegalArgumentException& )
2803*cdf0e10cSrcweir                     {
2804*cdf0e10cSrcweir                         pReturns[nFailed].Name = pNames[i];
2805*cdf0e10cSrcweir                         pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::ILLEGAL_ARGUMENT;
2806*cdf0e10cSrcweir                     }
2807*cdf0e10cSrcweir                 }
2808*cdf0e10cSrcweir                 else if ( pEntry->nWID != SC_WID_UNO_CELLSTYL )   // CellStyle is handled above
2809*cdf0e10cSrcweir                 {
2810*cdf0e10cSrcweir                     //  call virtual method to set a single property
2811*cdf0e10cSrcweir                     try
2812*cdf0e10cSrcweir                     {
2813*cdf0e10cSrcweir                         SetOnePropertyValue( pEntry, pValues[i] );
2814*cdf0e10cSrcweir                     }
2815*cdf0e10cSrcweir                     catch ( lang::IllegalArgumentException& )
2816*cdf0e10cSrcweir                     {
2817*cdf0e10cSrcweir                         pReturns[nFailed].Name = pNames[i];
2818*cdf0e10cSrcweir                         pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::ILLEGAL_ARGUMENT;
2819*cdf0e10cSrcweir                     }
2820*cdf0e10cSrcweir                 }
2821*cdf0e10cSrcweir             }
2822*cdf0e10cSrcweir             else
2823*cdf0e10cSrcweir             {
2824*cdf0e10cSrcweir                 pReturns[nFailed].Name = pNames[i];
2825*cdf0e10cSrcweir                 if (pEntry)
2826*cdf0e10cSrcweir                     pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::PROPERTY_VETO;
2827*cdf0e10cSrcweir                 else
2828*cdf0e10cSrcweir                     pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
2829*cdf0e10cSrcweir             }
2830*cdf0e10cSrcweir         }
2831*cdf0e10cSrcweir 
2832*cdf0e10cSrcweir         if ( pNewPattern && aRanges.Count() )
2833*cdf0e10cSrcweir         {
2834*cdf0e10cSrcweir             ScDocFunc aFunc(*pDocShell);
2835*cdf0e10cSrcweir             aFunc.ApplyAttributes( *GetMarkData(), *pNewPattern, sal_True, sal_True );
2836*cdf0e10cSrcweir         }
2837*cdf0e10cSrcweir 
2838*cdf0e10cSrcweir         delete pNewPattern;
2839*cdf0e10cSrcweir         delete pOldPattern;
2840*cdf0e10cSrcweir         delete[] pMapArray;
2841*cdf0e10cSrcweir 
2842*cdf0e10cSrcweir         aReturns.realloc(nFailed);
2843*cdf0e10cSrcweir 
2844*cdf0e10cSrcweir         return aReturns;
2845*cdf0e10cSrcweir     }
2846*cdf0e10cSrcweir     return uno::Sequence < beans::SetPropertyTolerantFailed >();
2847*cdf0e10cSrcweir }
2848*cdf0e10cSrcweir 
2849*cdf0e10cSrcweir uno::Sequence< beans::GetPropertyTolerantResult > SAL_CALL ScCellRangesBase::getPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames )
2850*cdf0e10cSrcweir                                     throw (uno::RuntimeException)
2851*cdf0e10cSrcweir {
2852*cdf0e10cSrcweir     ScUnoGuard aGuard;
2853*cdf0e10cSrcweir 
2854*cdf0e10cSrcweir     sal_Int32 nCount(aPropertyNames.getLength());
2855*cdf0e10cSrcweir     uno::Sequence < beans::GetPropertyTolerantResult > aReturns(nCount);
2856*cdf0e10cSrcweir     beans::GetPropertyTolerantResult* pReturns = aReturns.getArray();
2857*cdf0e10cSrcweir 
2858*cdf0e10cSrcweir     const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap();     // from derived class
2859*cdf0e10cSrcweir 
2860*cdf0e10cSrcweir     for(sal_Int32 i = 0; i < nCount; i++)
2861*cdf0e10cSrcweir     {
2862*cdf0e10cSrcweir         const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyNames[i] );
2863*cdf0e10cSrcweir         if (!pEntry)
2864*cdf0e10cSrcweir         {
2865*cdf0e10cSrcweir             pReturns[i].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
2866*cdf0e10cSrcweir         }
2867*cdf0e10cSrcweir         else
2868*cdf0e10cSrcweir         {
2869*cdf0e10cSrcweir             sal_uInt16 nItemWhich = 0;
2870*cdf0e10cSrcweir             lcl_GetPropertyWhich( pEntry, nItemWhich );
2871*cdf0e10cSrcweir             pReturns[i].State = GetOnePropertyState( nItemWhich, pEntry );
2872*cdf0e10cSrcweir             GetOnePropertyValue( pEntry, pReturns[i].Value );
2873*cdf0e10cSrcweir             pReturns[i].Result = beans::TolerantPropertySetResultType::SUCCESS;
2874*cdf0e10cSrcweir         }
2875*cdf0e10cSrcweir     }
2876*cdf0e10cSrcweir     return aReturns;
2877*cdf0e10cSrcweir }
2878*cdf0e10cSrcweir 
2879*cdf0e10cSrcweir uno::Sequence< beans::GetDirectPropertyTolerantResult > SAL_CALL ScCellRangesBase::getDirectPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames )
2880*cdf0e10cSrcweir                                     throw (uno::RuntimeException)
2881*cdf0e10cSrcweir {
2882*cdf0e10cSrcweir     ScUnoGuard aGuard;
2883*cdf0e10cSrcweir 
2884*cdf0e10cSrcweir     sal_Int32 nCount(aPropertyNames.getLength());
2885*cdf0e10cSrcweir     uno::Sequence < beans::GetDirectPropertyTolerantResult > aReturns(nCount);
2886*cdf0e10cSrcweir     beans::GetDirectPropertyTolerantResult* pReturns = aReturns.getArray();
2887*cdf0e10cSrcweir 
2888*cdf0e10cSrcweir     const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap();     // from derived class
2889*cdf0e10cSrcweir 
2890*cdf0e10cSrcweir     sal_Int32 j = 0;
2891*cdf0e10cSrcweir     for(sal_Int32 i = 0; i < nCount; i++)
2892*cdf0e10cSrcweir     {
2893*cdf0e10cSrcweir         const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyNames[i] );
2894*cdf0e10cSrcweir         if (!pEntry)
2895*cdf0e10cSrcweir         {
2896*cdf0e10cSrcweir             pReturns[i].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
2897*cdf0e10cSrcweir         }
2898*cdf0e10cSrcweir         else
2899*cdf0e10cSrcweir         {
2900*cdf0e10cSrcweir             sal_uInt16 nItemWhich = 0;
2901*cdf0e10cSrcweir             lcl_GetPropertyWhich( pEntry, nItemWhich );
2902*cdf0e10cSrcweir             pReturns[j].State = GetOnePropertyState( nItemWhich, pEntry );
2903*cdf0e10cSrcweir             if (pReturns[j].State == beans::PropertyState_DIRECT_VALUE)
2904*cdf0e10cSrcweir             {
2905*cdf0e10cSrcweir                 GetOnePropertyValue( pEntry, pReturns[j].Value );
2906*cdf0e10cSrcweir                 pReturns[j].Result = beans::TolerantPropertySetResultType::SUCCESS;
2907*cdf0e10cSrcweir                 pReturns[j].Name = aPropertyNames[i];
2908*cdf0e10cSrcweir                 ++j;
2909*cdf0e10cSrcweir             }
2910*cdf0e10cSrcweir         }
2911*cdf0e10cSrcweir     }
2912*cdf0e10cSrcweir     if (j < nCount)
2913*cdf0e10cSrcweir         aReturns.realloc(j);
2914*cdf0e10cSrcweir     return aReturns;
2915*cdf0e10cSrcweir }
2916*cdf0e10cSrcweir 
2917*cdf0e10cSrcweir // XIndent
2918*cdf0e10cSrcweir 
2919*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::decrementIndent() throw(::com::sun::star::uno::RuntimeException)
2920*cdf0e10cSrcweir {
2921*cdf0e10cSrcweir     ScUnoGuard aGuard;
2922*cdf0e10cSrcweir     if ( pDocShell && aRanges.Count() )     // leer = nichts zu tun
2923*cdf0e10cSrcweir     {
2924*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocShell);
2925*cdf0e10cSrcweir         //#97041#; put only MultiMarked ScMarkData in ChangeIndent
2926*cdf0e10cSrcweir         ScMarkData aMarkData(*GetMarkData());
2927*cdf0e10cSrcweir         aMarkData.MarkToMulti();
2928*cdf0e10cSrcweir         aFunc.ChangeIndent( aMarkData, sal_False, sal_True );
2929*cdf0e10cSrcweir     }
2930*cdf0e10cSrcweir }
2931*cdf0e10cSrcweir 
2932*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::incrementIndent() throw(::com::sun::star::uno::RuntimeException)
2933*cdf0e10cSrcweir {
2934*cdf0e10cSrcweir     ScUnoGuard aGuard;
2935*cdf0e10cSrcweir     if ( pDocShell && aRanges.Count() )     // leer = nichts zu tun
2936*cdf0e10cSrcweir     {
2937*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocShell);
2938*cdf0e10cSrcweir         //#97041#; put only MultiMarked ScMarkData in ChangeIndent
2939*cdf0e10cSrcweir         ScMarkData aMarkData(*GetMarkData());
2940*cdf0e10cSrcweir         aMarkData.MarkToMulti();
2941*cdf0e10cSrcweir         aFunc.ChangeIndent( aMarkData, sal_True, sal_True );
2942*cdf0e10cSrcweir     }
2943*cdf0e10cSrcweir }
2944*cdf0e10cSrcweir 
2945*cdf0e10cSrcweir // XChartData
2946*cdf0e10cSrcweir 
2947*cdf0e10cSrcweir ScMemChart* ScCellRangesBase::CreateMemChart_Impl() const
2948*cdf0e10cSrcweir {
2949*cdf0e10cSrcweir     if ( pDocShell && aRanges.Count() )
2950*cdf0e10cSrcweir     {
2951*cdf0e10cSrcweir         ScRangeListRef xChartRanges;
2952*cdf0e10cSrcweir         if ( aRanges.Count() == 1 )
2953*cdf0e10cSrcweir         {
2954*cdf0e10cSrcweir             //  ganze Tabelle sinnvoll begrenzen (auf belegten Datenbereich)
2955*cdf0e10cSrcweir             //  (nur hier, Listener werden auf den ganzen Bereich angemeldet)
2956*cdf0e10cSrcweir             //! direkt testen, ob es ein ScTableSheetObj ist?
2957*cdf0e10cSrcweir 
2958*cdf0e10cSrcweir             ScRange* pRange = aRanges.GetObject(0);
2959*cdf0e10cSrcweir             if ( pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL &&
2960*cdf0e10cSrcweir                  pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW )
2961*cdf0e10cSrcweir             {
2962*cdf0e10cSrcweir                 SCTAB nTab = pRange->aStart.Tab();
2963*cdf0e10cSrcweir 
2964*cdf0e10cSrcweir                 SCCOL nStartX;
2965*cdf0e10cSrcweir                 SCROW nStartY; // Anfang holen
2966*cdf0e10cSrcweir                 if (!pDocShell->GetDocument()->GetDataStart( nTab, nStartX, nStartY ))
2967*cdf0e10cSrcweir                 {
2968*cdf0e10cSrcweir                     nStartX = 0;
2969*cdf0e10cSrcweir                     nStartY = 0;
2970*cdf0e10cSrcweir                 }
2971*cdf0e10cSrcweir 
2972*cdf0e10cSrcweir                 SCCOL nEndX;
2973*cdf0e10cSrcweir                 SCROW nEndY; // Ende holen
2974*cdf0e10cSrcweir                 if (!pDocShell->GetDocument()->GetTableArea( nTab, nEndX, nEndY ))
2975*cdf0e10cSrcweir                 {
2976*cdf0e10cSrcweir                     nEndX = 0;
2977*cdf0e10cSrcweir                     nEndY = 0;
2978*cdf0e10cSrcweir                 }
2979*cdf0e10cSrcweir 
2980*cdf0e10cSrcweir                 xChartRanges = new ScRangeList;
2981*cdf0e10cSrcweir                 xChartRanges->Append( ScRange( nStartX, nStartY, nTab, nEndX, nEndY, nTab ) );
2982*cdf0e10cSrcweir             }
2983*cdf0e10cSrcweir         }
2984*cdf0e10cSrcweir         if (!xChartRanges.Is())         //  sonst Ranges direkt uebernehmen
2985*cdf0e10cSrcweir             xChartRanges = new ScRangeList(aRanges);
2986*cdf0e10cSrcweir         ScChartArray aArr( pDocShell->GetDocument(), xChartRanges, String() );
2987*cdf0e10cSrcweir 
2988*cdf0e10cSrcweir         // RowAsHdr = ColHeaders und umgekehrt
2989*cdf0e10cSrcweir         aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );
2990*cdf0e10cSrcweir 
2991*cdf0e10cSrcweir         return aArr.CreateMemChart();
2992*cdf0e10cSrcweir     }
2993*cdf0e10cSrcweir     return NULL;
2994*cdf0e10cSrcweir }
2995*cdf0e10cSrcweir 
2996*cdf0e10cSrcweir uno::Sequence< uno::Sequence<double> > SAL_CALL ScCellRangesBase::getData()
2997*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
2998*cdf0e10cSrcweir {
2999*cdf0e10cSrcweir     ScUnoGuard aGuard;
3000*cdf0e10cSrcweir     ScMemChart* pMemChart = CreateMemChart_Impl();
3001*cdf0e10cSrcweir     if ( pMemChart )
3002*cdf0e10cSrcweir     {
3003*cdf0e10cSrcweir         sal_Int32 nColCount = pMemChart->GetColCount();
3004*cdf0e10cSrcweir         sal_Int32 nRowCount = static_cast<sal_Int32>(pMemChart->GetRowCount());
3005*cdf0e10cSrcweir 
3006*cdf0e10cSrcweir         uno::Sequence< uno::Sequence<double> > aRowSeq( nRowCount );
3007*cdf0e10cSrcweir         uno::Sequence<double>* pRowAry = aRowSeq.getArray();
3008*cdf0e10cSrcweir         for (sal_Int32 nRow = 0; nRow < nRowCount; nRow++)
3009*cdf0e10cSrcweir         {
3010*cdf0e10cSrcweir             uno::Sequence<double> aColSeq( nColCount );
3011*cdf0e10cSrcweir             double* pColAry = aColSeq.getArray();
3012*cdf0e10cSrcweir             for (sal_Int32 nCol = 0; nCol < nColCount; nCol++)
3013*cdf0e10cSrcweir                 pColAry[nCol] = pMemChart->GetData( static_cast<short>(nCol), static_cast<short>(nRow) );
3014*cdf0e10cSrcweir 
3015*cdf0e10cSrcweir             pRowAry[nRow] = aColSeq;
3016*cdf0e10cSrcweir         }
3017*cdf0e10cSrcweir 
3018*cdf0e10cSrcweir         delete pMemChart;
3019*cdf0e10cSrcweir         return aRowSeq;
3020*cdf0e10cSrcweir     }
3021*cdf0e10cSrcweir 
3022*cdf0e10cSrcweir     return uno::Sequence< uno::Sequence<double> >(0);
3023*cdf0e10cSrcweir }
3024*cdf0e10cSrcweir 
3025*cdf0e10cSrcweir ScRangeListRef ScCellRangesBase::GetLimitedChartRanges_Impl( long nDataColumns, long nDataRows ) const
3026*cdf0e10cSrcweir {
3027*cdf0e10cSrcweir     if ( aRanges.Count() == 1 )
3028*cdf0e10cSrcweir     {
3029*cdf0e10cSrcweir         ScRange* pRange = aRanges.GetObject(0);
3030*cdf0e10cSrcweir         if ( pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL &&
3031*cdf0e10cSrcweir              pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW )
3032*cdf0e10cSrcweir         {
3033*cdf0e10cSrcweir             //  if aRanges is a complete sheet, limit to given size
3034*cdf0e10cSrcweir 
3035*cdf0e10cSrcweir             SCTAB nTab = pRange->aStart.Tab();
3036*cdf0e10cSrcweir 
3037*cdf0e10cSrcweir             long nEndColumn = nDataColumns - 1 + ( bChartColAsHdr ? 1 : 0 );
3038*cdf0e10cSrcweir             if ( nEndColumn < 0 )
3039*cdf0e10cSrcweir                 nEndColumn = 0;
3040*cdf0e10cSrcweir             if ( nEndColumn > MAXCOL )
3041*cdf0e10cSrcweir                 nEndColumn = MAXCOL;
3042*cdf0e10cSrcweir 
3043*cdf0e10cSrcweir             long nEndRow = nDataRows - 1 + ( bChartRowAsHdr ? 1 : 0 );
3044*cdf0e10cSrcweir             if ( nEndRow < 0 )
3045*cdf0e10cSrcweir                 nEndRow = 0;
3046*cdf0e10cSrcweir             if ( nEndRow > MAXROW )
3047*cdf0e10cSrcweir                 nEndRow = MAXROW;
3048*cdf0e10cSrcweir 
3049*cdf0e10cSrcweir             ScRangeListRef xChartRanges = new ScRangeList;
3050*cdf0e10cSrcweir             xChartRanges->Append( ScRange( 0, 0, nTab, (SCCOL)nEndColumn, (SCROW)nEndRow, nTab ) );
3051*cdf0e10cSrcweir             return xChartRanges;
3052*cdf0e10cSrcweir         }
3053*cdf0e10cSrcweir     }
3054*cdf0e10cSrcweir 
3055*cdf0e10cSrcweir     return new ScRangeList(aRanges);        // as-is
3056*cdf0e10cSrcweir }
3057*cdf0e10cSrcweir 
3058*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::setData( const uno::Sequence< uno::Sequence<double> >& aData )
3059*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
3060*cdf0e10cSrcweir {
3061*cdf0e10cSrcweir     ScUnoGuard aGuard;
3062*cdf0e10cSrcweir     sal_Bool bDone = sal_False;
3063*cdf0e10cSrcweir     long nRowCount = aData.getLength();
3064*cdf0e10cSrcweir     long nColCount = nRowCount ? aData[0].getLength() : 0;
3065*cdf0e10cSrcweir     ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( nColCount, nRowCount );
3066*cdf0e10cSrcweir     if ( pDocShell && xChartRanges.Is() )
3067*cdf0e10cSrcweir     {
3068*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3069*cdf0e10cSrcweir         ScChartArray aArr( pDoc, xChartRanges, String() );
3070*cdf0e10cSrcweir         aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );      // RowAsHdr = ColHeaders
3071*cdf0e10cSrcweir         const ScChartPositionMap* pPosMap = aArr.GetPositionMap();
3072*cdf0e10cSrcweir         if (pPosMap)
3073*cdf0e10cSrcweir         {
3074*cdf0e10cSrcweir             if ( pPosMap->GetColCount() == static_cast<SCCOL>(nColCount) &&
3075*cdf0e10cSrcweir                  pPosMap->GetRowCount() == static_cast<SCROW>(nRowCount) )
3076*cdf0e10cSrcweir             {
3077*cdf0e10cSrcweir                 for (long nRow=0; nRow<nRowCount; nRow++)
3078*cdf0e10cSrcweir                 {
3079*cdf0e10cSrcweir                     const uno::Sequence<double>& rRowSeq = aData[nRow];
3080*cdf0e10cSrcweir                     const double* pArray = rRowSeq.getConstArray();
3081*cdf0e10cSrcweir                     nColCount = rRowSeq.getLength();
3082*cdf0e10cSrcweir                     for (long nCol=0; nCol<nColCount; nCol++)
3083*cdf0e10cSrcweir                     {
3084*cdf0e10cSrcweir                         const ScAddress* pPos = pPosMap->GetPosition(
3085*cdf0e10cSrcweir                                 sal::static_int_cast<SCCOL>(nCol),
3086*cdf0e10cSrcweir                                 sal::static_int_cast<SCROW>(nRow) );
3087*cdf0e10cSrcweir                         if (pPos)
3088*cdf0e10cSrcweir                         {
3089*cdf0e10cSrcweir                             double fVal = pArray[nCol];
3090*cdf0e10cSrcweir                             if ( fVal == DBL_MIN )
3091*cdf0e10cSrcweir                                 pDoc->PutCell( *pPos, NULL );       // empty cell
3092*cdf0e10cSrcweir                             else
3093*cdf0e10cSrcweir                                 pDoc->SetValue( pPos->Col(), pPos->Row(), pPos->Tab(), pArray[nCol] );
3094*cdf0e10cSrcweir                         }
3095*cdf0e10cSrcweir                     }
3096*cdf0e10cSrcweir                 }
3097*cdf0e10cSrcweir 
3098*cdf0e10cSrcweir                 //! undo
3099*cdf0e10cSrcweir                 PaintRanges_Impl( PAINT_GRID );
3100*cdf0e10cSrcweir                 pDocShell->SetDocumentModified();
3101*cdf0e10cSrcweir                 ForceChartListener_Impl();          // call listeners for this object synchronously
3102*cdf0e10cSrcweir                 bDone = sal_True;
3103*cdf0e10cSrcweir             }
3104*cdf0e10cSrcweir         }
3105*cdf0e10cSrcweir     }
3106*cdf0e10cSrcweir 
3107*cdf0e10cSrcweir     if (!bDone)
3108*cdf0e10cSrcweir         throw uno::RuntimeException();
3109*cdf0e10cSrcweir }
3110*cdf0e10cSrcweir 
3111*cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesBase::getRowDescriptions()
3112*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
3113*cdf0e10cSrcweir {
3114*cdf0e10cSrcweir     ScUnoGuard aGuard;
3115*cdf0e10cSrcweir     ScMemChart* pMemChart = CreateMemChart_Impl();
3116*cdf0e10cSrcweir     if ( pMemChart )
3117*cdf0e10cSrcweir     {
3118*cdf0e10cSrcweir         sal_Int32 nRowCount = static_cast<sal_Int32>(pMemChart->GetRowCount());
3119*cdf0e10cSrcweir         uno::Sequence<rtl::OUString> aSeq( nRowCount );
3120*cdf0e10cSrcweir         rtl::OUString* pAry = aSeq.getArray();
3121*cdf0e10cSrcweir         for (sal_Int32 nRow = 0; nRow < nRowCount; nRow++)
3122*cdf0e10cSrcweir             pAry[nRow] = pMemChart->GetRowText(static_cast<short>(nRow));
3123*cdf0e10cSrcweir 
3124*cdf0e10cSrcweir         delete pMemChart;
3125*cdf0e10cSrcweir         return aSeq;
3126*cdf0e10cSrcweir     }
3127*cdf0e10cSrcweir     return uno::Sequence<rtl::OUString>(0);
3128*cdf0e10cSrcweir }
3129*cdf0e10cSrcweir 
3130*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::setRowDescriptions(
3131*cdf0e10cSrcweir                         const uno::Sequence<rtl::OUString>& aRowDescriptions )
3132*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
3133*cdf0e10cSrcweir {
3134*cdf0e10cSrcweir     ScUnoGuard aGuard;
3135*cdf0e10cSrcweir     sal_Bool bDone = sal_False;
3136*cdf0e10cSrcweir     if ( bChartColAsHdr )
3137*cdf0e10cSrcweir     {
3138*cdf0e10cSrcweir         long nRowCount = aRowDescriptions.getLength();
3139*cdf0e10cSrcweir         ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( 1, nRowCount );
3140*cdf0e10cSrcweir         if ( pDocShell && xChartRanges.Is() )
3141*cdf0e10cSrcweir         {
3142*cdf0e10cSrcweir             ScDocument* pDoc = pDocShell->GetDocument();
3143*cdf0e10cSrcweir             ScChartArray aArr( pDoc, xChartRanges, String() );
3144*cdf0e10cSrcweir             aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );      // RowAsHdr = ColHeaders
3145*cdf0e10cSrcweir             const ScChartPositionMap* pPosMap = aArr.GetPositionMap();
3146*cdf0e10cSrcweir             if (pPosMap)
3147*cdf0e10cSrcweir             {
3148*cdf0e10cSrcweir                 if ( pPosMap->GetRowCount() == static_cast<SCROW>(nRowCount) )
3149*cdf0e10cSrcweir                 {
3150*cdf0e10cSrcweir                     const rtl::OUString* pArray = aRowDescriptions.getConstArray();
3151*cdf0e10cSrcweir                     for (long nRow=0; nRow<nRowCount; nRow++)
3152*cdf0e10cSrcweir                     {
3153*cdf0e10cSrcweir                         const ScAddress* pPos = pPosMap->GetRowHeaderPosition(
3154*cdf0e10cSrcweir                                 static_cast<SCSIZE>(nRow) );
3155*cdf0e10cSrcweir                         if (pPos)
3156*cdf0e10cSrcweir                         {
3157*cdf0e10cSrcweir                             String aStr = pArray[nRow];
3158*cdf0e10cSrcweir                             if ( aStr.Len() )
3159*cdf0e10cSrcweir                                 pDoc->PutCell( *pPos, new ScStringCell( aStr ) );
3160*cdf0e10cSrcweir                             else
3161*cdf0e10cSrcweir                                 pDoc->PutCell( *pPos, NULL );       // empty cell
3162*cdf0e10cSrcweir                         }
3163*cdf0e10cSrcweir                     }
3164*cdf0e10cSrcweir 
3165*cdf0e10cSrcweir                     //! undo
3166*cdf0e10cSrcweir                     PaintRanges_Impl( PAINT_GRID );
3167*cdf0e10cSrcweir                     pDocShell->SetDocumentModified();
3168*cdf0e10cSrcweir                     ForceChartListener_Impl();          // call listeners for this object synchronously
3169*cdf0e10cSrcweir                     bDone = sal_True;
3170*cdf0e10cSrcweir                 }
3171*cdf0e10cSrcweir             }
3172*cdf0e10cSrcweir         }
3173*cdf0e10cSrcweir     }
3174*cdf0e10cSrcweir 
3175*cdf0e10cSrcweir     if (!bDone)
3176*cdf0e10cSrcweir         throw uno::RuntimeException();
3177*cdf0e10cSrcweir }
3178*cdf0e10cSrcweir 
3179*cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesBase::getColumnDescriptions()
3180*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
3181*cdf0e10cSrcweir {
3182*cdf0e10cSrcweir     ScUnoGuard aGuard;
3183*cdf0e10cSrcweir     ScMemChart* pMemChart = CreateMemChart_Impl();
3184*cdf0e10cSrcweir     if ( pMemChart )
3185*cdf0e10cSrcweir     {
3186*cdf0e10cSrcweir         sal_Int32 nColCount = pMemChart->GetColCount();
3187*cdf0e10cSrcweir         uno::Sequence<rtl::OUString> aSeq( nColCount );
3188*cdf0e10cSrcweir         rtl::OUString* pAry = aSeq.getArray();
3189*cdf0e10cSrcweir         for (sal_Int32 nCol = 0; nCol < nColCount; nCol++)
3190*cdf0e10cSrcweir             pAry[nCol] = pMemChart->GetColText(static_cast<short>(nCol));
3191*cdf0e10cSrcweir 
3192*cdf0e10cSrcweir         delete pMemChart;
3193*cdf0e10cSrcweir         return aSeq;
3194*cdf0e10cSrcweir     }
3195*cdf0e10cSrcweir     return uno::Sequence<rtl::OUString>(0);
3196*cdf0e10cSrcweir }
3197*cdf0e10cSrcweir 
3198*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::setColumnDescriptions(
3199*cdf0e10cSrcweir                         const uno::Sequence<rtl::OUString>& aColumnDescriptions )
3200*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
3201*cdf0e10cSrcweir {
3202*cdf0e10cSrcweir     ScUnoGuard aGuard;
3203*cdf0e10cSrcweir     sal_Bool bDone = sal_False;
3204*cdf0e10cSrcweir     if ( bChartRowAsHdr )
3205*cdf0e10cSrcweir     {
3206*cdf0e10cSrcweir         long nColCount = aColumnDescriptions.getLength();
3207*cdf0e10cSrcweir         ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( nColCount, 1 );
3208*cdf0e10cSrcweir         if ( pDocShell && xChartRanges.Is() )
3209*cdf0e10cSrcweir         {
3210*cdf0e10cSrcweir             ScDocument* pDoc = pDocShell->GetDocument();
3211*cdf0e10cSrcweir             ScChartArray aArr( pDoc, xChartRanges, String() );
3212*cdf0e10cSrcweir             aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );      // RowAsHdr = ColHeaders
3213*cdf0e10cSrcweir             const ScChartPositionMap* pPosMap = aArr.GetPositionMap();
3214*cdf0e10cSrcweir             if (pPosMap)
3215*cdf0e10cSrcweir             {
3216*cdf0e10cSrcweir                 if ( pPosMap->GetColCount() == static_cast<SCCOL>(nColCount) )
3217*cdf0e10cSrcweir                 {
3218*cdf0e10cSrcweir                     const rtl::OUString* pArray = aColumnDescriptions.getConstArray();
3219*cdf0e10cSrcweir                     for (long nCol=0; nCol<nColCount; nCol++)
3220*cdf0e10cSrcweir                     {
3221*cdf0e10cSrcweir                         const ScAddress* pPos = pPosMap->GetColHeaderPosition(
3222*cdf0e10cSrcweir                             sal::static_int_cast<SCCOL>(nCol) );
3223*cdf0e10cSrcweir                         if (pPos)
3224*cdf0e10cSrcweir                         {
3225*cdf0e10cSrcweir                             String aStr(pArray[nCol]);
3226*cdf0e10cSrcweir                             if ( aStr.Len() )
3227*cdf0e10cSrcweir                                 pDoc->PutCell( *pPos, new ScStringCell( aStr ) );
3228*cdf0e10cSrcweir                             else
3229*cdf0e10cSrcweir                                 pDoc->PutCell( *pPos, NULL );       // empty cell
3230*cdf0e10cSrcweir                         }
3231*cdf0e10cSrcweir                     }
3232*cdf0e10cSrcweir 
3233*cdf0e10cSrcweir                     //! undo
3234*cdf0e10cSrcweir                     PaintRanges_Impl( PAINT_GRID );
3235*cdf0e10cSrcweir                     pDocShell->SetDocumentModified();
3236*cdf0e10cSrcweir                     ForceChartListener_Impl();          // call listeners for this object synchronously
3237*cdf0e10cSrcweir                     bDone = sal_True;
3238*cdf0e10cSrcweir                 }
3239*cdf0e10cSrcweir             }
3240*cdf0e10cSrcweir         }
3241*cdf0e10cSrcweir     }
3242*cdf0e10cSrcweir 
3243*cdf0e10cSrcweir     if (!bDone)
3244*cdf0e10cSrcweir         throw uno::RuntimeException();
3245*cdf0e10cSrcweir }
3246*cdf0e10cSrcweir 
3247*cdf0e10cSrcweir void ScCellRangesBase::ForceChartListener_Impl()
3248*cdf0e10cSrcweir {
3249*cdf0e10cSrcweir     //  call Update immediately so the caller to setData etc. can
3250*cdf0e10cSrcweir     //  regognize the listener call
3251*cdf0e10cSrcweir 
3252*cdf0e10cSrcweir     if ( pDocShell )
3253*cdf0e10cSrcweir     {
3254*cdf0e10cSrcweir         ScChartListenerCollection* pColl = pDocShell->GetDocument()->GetChartListenerCollection();
3255*cdf0e10cSrcweir         if ( pColl )
3256*cdf0e10cSrcweir         {
3257*cdf0e10cSrcweir             sal_uInt16 nCollCount = pColl->GetCount();
3258*cdf0e10cSrcweir             for ( sal_uInt16 nIndex = 0; nIndex < nCollCount; nIndex++ )
3259*cdf0e10cSrcweir             {
3260*cdf0e10cSrcweir                 ScChartListener* pChartListener = (ScChartListener*)pColl->At(nIndex);
3261*cdf0e10cSrcweir                 if ( pChartListener &&
3262*cdf0e10cSrcweir                         pChartListener->GetUnoSource() == static_cast<chart::XChartData*>(this) &&
3263*cdf0e10cSrcweir                         pChartListener->IsDirty() )
3264*cdf0e10cSrcweir                     pChartListener->Update();
3265*cdf0e10cSrcweir             }
3266*cdf0e10cSrcweir         }
3267*cdf0e10cSrcweir     }
3268*cdf0e10cSrcweir }
3269*cdf0e10cSrcweir 
3270*cdf0e10cSrcweir String lcl_UniqueName( ScStrCollection& rColl, const String& rPrefix )
3271*cdf0e10cSrcweir {
3272*cdf0e10cSrcweir     long nNumber = 1;
3273*cdf0e10cSrcweir     sal_uInt16 nCollCount = rColl.GetCount();
3274*cdf0e10cSrcweir     while (sal_True)
3275*cdf0e10cSrcweir     {
3276*cdf0e10cSrcweir         String aName(rPrefix);
3277*cdf0e10cSrcweir         aName += String::CreateFromInt32( nNumber );
3278*cdf0e10cSrcweir         sal_Bool bFound = sal_False;
3279*cdf0e10cSrcweir         for (sal_uInt16 i=0; i<nCollCount; i++)
3280*cdf0e10cSrcweir             if ( rColl[i]->GetString() == aName )
3281*cdf0e10cSrcweir             {
3282*cdf0e10cSrcweir                 bFound = sal_True;
3283*cdf0e10cSrcweir                 break;
3284*cdf0e10cSrcweir             }
3285*cdf0e10cSrcweir         if (!bFound)
3286*cdf0e10cSrcweir             return aName;
3287*cdf0e10cSrcweir         ++nNumber;
3288*cdf0e10cSrcweir     }
3289*cdf0e10cSrcweir }
3290*cdf0e10cSrcweir 
3291*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::addChartDataChangeEventListener( const uno::Reference<
3292*cdf0e10cSrcweir                                     chart::XChartDataChangeEventListener >& aListener )
3293*cdf0e10cSrcweir                                 throw(uno::RuntimeException)
3294*cdf0e10cSrcweir {
3295*cdf0e10cSrcweir     ScUnoGuard aGuard;
3296*cdf0e10cSrcweir     if ( pDocShell && aRanges.Count() )
3297*cdf0e10cSrcweir     {
3298*cdf0e10cSrcweir         //! auf doppelte testen?
3299*cdf0e10cSrcweir 
3300*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3301*cdf0e10cSrcweir         ScRangeListRef aRangesRef( new ScRangeList(aRanges) );
3302*cdf0e10cSrcweir         ScChartListenerCollection* pColl = pDoc->GetChartListenerCollection();
3303*cdf0e10cSrcweir         String aName(lcl_UniqueName( *pColl,
3304*cdf0e10cSrcweir                         String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("__Uno")) ));
3305*cdf0e10cSrcweir         ScChartListener* pListener = new ScChartListener( aName, pDoc, aRangesRef );
3306*cdf0e10cSrcweir         pListener->SetUno( aListener, this );
3307*cdf0e10cSrcweir         pColl->Insert( pListener );
3308*cdf0e10cSrcweir         pListener->StartListeningTo();
3309*cdf0e10cSrcweir     }
3310*cdf0e10cSrcweir }
3311*cdf0e10cSrcweir 
3312*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::removeChartDataChangeEventListener( const uno::Reference<
3313*cdf0e10cSrcweir                                     chart::XChartDataChangeEventListener >& aListener )
3314*cdf0e10cSrcweir                                 throw(uno::RuntimeException)
3315*cdf0e10cSrcweir {
3316*cdf0e10cSrcweir     ScUnoGuard aGuard;
3317*cdf0e10cSrcweir     if ( pDocShell && aRanges.Count() )
3318*cdf0e10cSrcweir     {
3319*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3320*cdf0e10cSrcweir         ScChartListenerCollection* pColl = pDoc->GetChartListenerCollection();
3321*cdf0e10cSrcweir         pColl->FreeUno( aListener, this );
3322*cdf0e10cSrcweir     }
3323*cdf0e10cSrcweir }
3324*cdf0e10cSrcweir 
3325*cdf0e10cSrcweir double SAL_CALL ScCellRangesBase::getNotANumber() throw(::com::sun::star::uno::RuntimeException)
3326*cdf0e10cSrcweir {
3327*cdf0e10cSrcweir     //  im ScChartArray wird DBL_MIN verwendet, weil das Chart es so will
3328*cdf0e10cSrcweir     return DBL_MIN;
3329*cdf0e10cSrcweir }
3330*cdf0e10cSrcweir 
3331*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellRangesBase::isNotANumber( double nNumber ) throw(uno::RuntimeException)
3332*cdf0e10cSrcweir {
3333*cdf0e10cSrcweir     //  im ScChartArray wird DBL_MIN verwendet, weil das Chart es so will
3334*cdf0e10cSrcweir     return (nNumber == DBL_MIN);
3335*cdf0e10cSrcweir }
3336*cdf0e10cSrcweir 
3337*cdf0e10cSrcweir // XModifyBroadcaster
3338*cdf0e10cSrcweir 
3339*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::addModifyListener( const uno::Reference<util::XModifyListener>& aListener )
3340*cdf0e10cSrcweir                                 throw(uno::RuntimeException)
3341*cdf0e10cSrcweir {
3342*cdf0e10cSrcweir     ScUnoGuard aGuard;
3343*cdf0e10cSrcweir     if ( aRanges.Count() == 0 )
3344*cdf0e10cSrcweir         throw uno::RuntimeException();
3345*cdf0e10cSrcweir 
3346*cdf0e10cSrcweir     uno::Reference<util::XModifyListener> *pObj =
3347*cdf0e10cSrcweir             new uno::Reference<util::XModifyListener>( aListener );
3348*cdf0e10cSrcweir     aValueListeners.Insert( pObj, aValueListeners.Count() );
3349*cdf0e10cSrcweir 
3350*cdf0e10cSrcweir     if ( aValueListeners.Count() == 1 )
3351*cdf0e10cSrcweir     {
3352*cdf0e10cSrcweir         if (!pValueListener)
3353*cdf0e10cSrcweir             pValueListener = new ScLinkListener( LINK( this, ScCellRangesBase, ValueListenerHdl ) );
3354*cdf0e10cSrcweir 
3355*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3356*cdf0e10cSrcweir         sal_uLong nCount = aRanges.Count();
3357*cdf0e10cSrcweir         for (sal_uLong i=0; i<nCount; i++)
3358*cdf0e10cSrcweir             pDoc->StartListeningArea( *aRanges.GetObject(i), pValueListener );
3359*cdf0e10cSrcweir 
3360*cdf0e10cSrcweir         acquire();  // don't lose this object (one ref for all listeners)
3361*cdf0e10cSrcweir     }
3362*cdf0e10cSrcweir }
3363*cdf0e10cSrcweir 
3364*cdf0e10cSrcweir void SAL_CALL ScCellRangesBase::removeModifyListener( const uno::Reference<util::XModifyListener>& aListener )
3365*cdf0e10cSrcweir                                 throw(uno::RuntimeException)
3366*cdf0e10cSrcweir {
3367*cdf0e10cSrcweir 
3368*cdf0e10cSrcweir     ScUnoGuard aGuard;
3369*cdf0e10cSrcweir     if ( aRanges.Count() == 0 )
3370*cdf0e10cSrcweir         throw uno::RuntimeException();
3371*cdf0e10cSrcweir 
3372*cdf0e10cSrcweir     acquire();      // in case the listeners have the last ref - released below
3373*cdf0e10cSrcweir 
3374*cdf0e10cSrcweir     sal_uInt16 nCount = aValueListeners.Count();
3375*cdf0e10cSrcweir     for ( sal_uInt16 n=nCount; n--; )
3376*cdf0e10cSrcweir     {
3377*cdf0e10cSrcweir         uno::Reference<util::XModifyListener> *pObj = aValueListeners[n];
3378*cdf0e10cSrcweir         if ( *pObj == aListener )
3379*cdf0e10cSrcweir         {
3380*cdf0e10cSrcweir             aValueListeners.DeleteAndDestroy( n );
3381*cdf0e10cSrcweir 
3382*cdf0e10cSrcweir             if ( aValueListeners.Count() == 0 )
3383*cdf0e10cSrcweir             {
3384*cdf0e10cSrcweir                 if (pValueListener)
3385*cdf0e10cSrcweir                     pValueListener->EndListeningAll();
3386*cdf0e10cSrcweir 
3387*cdf0e10cSrcweir                 release();      // release the ref for the listeners
3388*cdf0e10cSrcweir             }
3389*cdf0e10cSrcweir 
3390*cdf0e10cSrcweir             break;
3391*cdf0e10cSrcweir         }
3392*cdf0e10cSrcweir     }
3393*cdf0e10cSrcweir 
3394*cdf0e10cSrcweir     release();      // might delete this object
3395*cdf0e10cSrcweir }
3396*cdf0e10cSrcweir 
3397*cdf0e10cSrcweir // XCellRangesQuery
3398*cdf0e10cSrcweir 
3399*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryVisibleCells()
3400*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
3401*cdf0e10cSrcweir {
3402*cdf0e10cSrcweir     ScUnoGuard aGuard;
3403*cdf0e10cSrcweir     if (pDocShell)
3404*cdf0e10cSrcweir     {
3405*cdf0e10cSrcweir         //! fuer alle Tabellen getrennt, wenn Markierungen pro Tabelle getrennt sind!
3406*cdf0e10cSrcweir         SCTAB nTab = lcl_FirstTab(aRanges);
3407*cdf0e10cSrcweir 
3408*cdf0e10cSrcweir         ScMarkData aMarkData(*GetMarkData());
3409*cdf0e10cSrcweir 
3410*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3411*cdf0e10cSrcweir         SCCOL nCol = 0, nLastCol;
3412*cdf0e10cSrcweir         while (nCol <= MAXCOL)
3413*cdf0e10cSrcweir         {
3414*cdf0e10cSrcweir             if (pDoc->ColHidden(nCol, nTab, nLastCol))
3415*cdf0e10cSrcweir                 // hidden columns.  Unselect them.
3416*cdf0e10cSrcweir                 aMarkData.SetMultiMarkArea(ScRange(nCol, 0, nTab, nLastCol, MAXROW, nTab), false);
3417*cdf0e10cSrcweir 
3418*cdf0e10cSrcweir             nCol = nLastCol + 1;
3419*cdf0e10cSrcweir         }
3420*cdf0e10cSrcweir 
3421*cdf0e10cSrcweir         SCROW nRow = 0, nLastRow;
3422*cdf0e10cSrcweir         while (nRow <= MAXROW)
3423*cdf0e10cSrcweir         {
3424*cdf0e10cSrcweir             if (pDoc->RowHidden(nRow, nTab, nLastRow))
3425*cdf0e10cSrcweir                 // These rows are hidden.  Unselect them.
3426*cdf0e10cSrcweir                 aMarkData.SetMultiMarkArea(ScRange(0, nRow, nTab, MAXCOL, nLastRow, nTab), false);
3427*cdf0e10cSrcweir 
3428*cdf0e10cSrcweir             nRow = nLastRow + 1;
3429*cdf0e10cSrcweir         }
3430*cdf0e10cSrcweir 
3431*cdf0e10cSrcweir         ScRangeList aNewRanges;
3432*cdf0e10cSrcweir         aMarkData.FillRangeListWithMarks( &aNewRanges, sal_False );
3433*cdf0e10cSrcweir         return new ScCellRangesObj( pDocShell, aNewRanges );
3434*cdf0e10cSrcweir     }
3435*cdf0e10cSrcweir 
3436*cdf0e10cSrcweir     return NULL;
3437*cdf0e10cSrcweir }
3438*cdf0e10cSrcweir 
3439*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryEmptyCells()
3440*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
3441*cdf0e10cSrcweir {
3442*cdf0e10cSrcweir     ScUnoGuard aGuard;
3443*cdf0e10cSrcweir     if (pDocShell)
3444*cdf0e10cSrcweir     {
3445*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3446*cdf0e10cSrcweir 
3447*cdf0e10cSrcweir         ScMarkData aMarkData(*GetMarkData());
3448*cdf0e10cSrcweir 
3449*cdf0e10cSrcweir         //  belegte Zellen wegmarkieren
3450*cdf0e10cSrcweir         sal_uLong nCount = aRanges.Count();
3451*cdf0e10cSrcweir         for (sal_uLong i=0; i<nCount; i++)
3452*cdf0e10cSrcweir         {
3453*cdf0e10cSrcweir             ScRange aRange = *aRanges.GetObject(i);
3454*cdf0e10cSrcweir 
3455*cdf0e10cSrcweir             ScCellIterator aIter( pDoc, aRange );
3456*cdf0e10cSrcweir             ScBaseCell* pCell = aIter.GetFirst();
3457*cdf0e10cSrcweir             while (pCell)
3458*cdf0e10cSrcweir             {
3459*cdf0e10cSrcweir                 //  Notizen zaehlen als nicht-leer
3460*cdf0e10cSrcweir                 if ( !pCell->IsBlank() )
3461*cdf0e10cSrcweir                     aMarkData.SetMultiMarkArea(
3462*cdf0e10cSrcweir                             ScRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() ),
3463*cdf0e10cSrcweir                             sal_False );
3464*cdf0e10cSrcweir 
3465*cdf0e10cSrcweir                 pCell = aIter.GetNext();
3466*cdf0e10cSrcweir             }
3467*cdf0e10cSrcweir         }
3468*cdf0e10cSrcweir 
3469*cdf0e10cSrcweir         ScRangeList aNewRanges;
3470*cdf0e10cSrcweir         //  IsMultiMarked reicht hier nicht (wird beim deselektieren nicht zurueckgesetzt)
3471*cdf0e10cSrcweir         if (aMarkData.HasAnyMultiMarks())
3472*cdf0e10cSrcweir             aMarkData.FillRangeListWithMarks( &aNewRanges, sal_False );
3473*cdf0e10cSrcweir 
3474*cdf0e10cSrcweir         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
3475*cdf0e10cSrcweir     }
3476*cdf0e10cSrcweir 
3477*cdf0e10cSrcweir     return NULL;
3478*cdf0e10cSrcweir }
3479*cdf0e10cSrcweir 
3480*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryContentCells(
3481*cdf0e10cSrcweir                                                     sal_Int16 nContentFlags )
3482*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
3483*cdf0e10cSrcweir {
3484*cdf0e10cSrcweir     ScUnoGuard aGuard;
3485*cdf0e10cSrcweir     if (pDocShell)
3486*cdf0e10cSrcweir     {
3487*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3488*cdf0e10cSrcweir 
3489*cdf0e10cSrcweir         ScMarkData aMarkData;
3490*cdf0e10cSrcweir 
3491*cdf0e10cSrcweir         //  passende Zellen selektieren
3492*cdf0e10cSrcweir         sal_uLong nCount = aRanges.Count();
3493*cdf0e10cSrcweir         for (sal_uLong i=0; i<nCount; i++)
3494*cdf0e10cSrcweir         {
3495*cdf0e10cSrcweir             ScRange aRange = *aRanges.GetObject(i);
3496*cdf0e10cSrcweir 
3497*cdf0e10cSrcweir             ScCellIterator aIter( pDoc, aRange );
3498*cdf0e10cSrcweir             ScBaseCell* pCell = aIter.GetFirst();
3499*cdf0e10cSrcweir             while (pCell)
3500*cdf0e10cSrcweir             {
3501*cdf0e10cSrcweir                 sal_Bool bAdd = sal_False;
3502*cdf0e10cSrcweir                 if ( pCell->HasNote() && ( nContentFlags & sheet::CellFlags::ANNOTATION ) )
3503*cdf0e10cSrcweir                     bAdd = sal_True;
3504*cdf0e10cSrcweir                 else
3505*cdf0e10cSrcweir                     switch ( pCell->GetCellType() )
3506*cdf0e10cSrcweir                     {
3507*cdf0e10cSrcweir                         case CELLTYPE_STRING:
3508*cdf0e10cSrcweir                             if ( nContentFlags & sheet::CellFlags::STRING )
3509*cdf0e10cSrcweir                                 bAdd = sal_True;
3510*cdf0e10cSrcweir                             break;
3511*cdf0e10cSrcweir                         case CELLTYPE_EDIT:
3512*cdf0e10cSrcweir                             if ( (nContentFlags & sheet::CellFlags::STRING) || (nContentFlags & sheet::CellFlags::FORMATTED) )
3513*cdf0e10cSrcweir                                 bAdd = sal_True;
3514*cdf0e10cSrcweir                             break;
3515*cdf0e10cSrcweir                         case CELLTYPE_FORMULA:
3516*cdf0e10cSrcweir                             if ( nContentFlags & sheet::CellFlags::FORMULA )
3517*cdf0e10cSrcweir                                 bAdd = sal_True;
3518*cdf0e10cSrcweir                             break;
3519*cdf0e10cSrcweir                         case CELLTYPE_VALUE:
3520*cdf0e10cSrcweir                             if ( (nContentFlags & (sheet::CellFlags::VALUE|sheet::CellFlags::DATETIME))
3521*cdf0e10cSrcweir                                     == (sheet::CellFlags::VALUE|sheet::CellFlags::DATETIME) )
3522*cdf0e10cSrcweir                                 bAdd = sal_True;
3523*cdf0e10cSrcweir                             else
3524*cdf0e10cSrcweir                             {
3525*cdf0e10cSrcweir                                 //  Date/Time Erkennung
3526*cdf0e10cSrcweir 
3527*cdf0e10cSrcweir                                 sal_uLong nIndex = (sal_uLong)((SfxUInt32Item*)pDoc->GetAttr(
3528*cdf0e10cSrcweir                                         aIter.GetCol(), aIter.GetRow(), aIter.GetTab(),
3529*cdf0e10cSrcweir                                         ATTR_VALUE_FORMAT ))->GetValue();
3530*cdf0e10cSrcweir                                 short nTyp = pDoc->GetFormatTable()->GetType(nIndex);
3531*cdf0e10cSrcweir                                 if ((nTyp == NUMBERFORMAT_DATE) || (nTyp == NUMBERFORMAT_TIME) ||
3532*cdf0e10cSrcweir                                     (nTyp == NUMBERFORMAT_DATETIME))
3533*cdf0e10cSrcweir                                 {
3534*cdf0e10cSrcweir                                     if ( nContentFlags & sheet::CellFlags::DATETIME )
3535*cdf0e10cSrcweir                                         bAdd = sal_True;
3536*cdf0e10cSrcweir                                 }
3537*cdf0e10cSrcweir                                 else
3538*cdf0e10cSrcweir                                 {
3539*cdf0e10cSrcweir                                     if ( nContentFlags & sheet::CellFlags::VALUE )
3540*cdf0e10cSrcweir                                         bAdd = sal_True;
3541*cdf0e10cSrcweir                                 }
3542*cdf0e10cSrcweir                             }
3543*cdf0e10cSrcweir                             break;
3544*cdf0e10cSrcweir                         default:
3545*cdf0e10cSrcweir                         {
3546*cdf0e10cSrcweir                             // added to avoid warnings
3547*cdf0e10cSrcweir                         }
3548*cdf0e10cSrcweir                     }
3549*cdf0e10cSrcweir 
3550*cdf0e10cSrcweir                 if (bAdd)
3551*cdf0e10cSrcweir                     aMarkData.SetMultiMarkArea(
3552*cdf0e10cSrcweir                             ScRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() ),
3553*cdf0e10cSrcweir                             sal_True );
3554*cdf0e10cSrcweir 
3555*cdf0e10cSrcweir                 pCell = aIter.GetNext();
3556*cdf0e10cSrcweir             }
3557*cdf0e10cSrcweir         }
3558*cdf0e10cSrcweir 
3559*cdf0e10cSrcweir         ScRangeList aNewRanges;
3560*cdf0e10cSrcweir         if (aMarkData.IsMultiMarked())
3561*cdf0e10cSrcweir             aMarkData.FillRangeListWithMarks( &aNewRanges, sal_False );
3562*cdf0e10cSrcweir 
3563*cdf0e10cSrcweir         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
3564*cdf0e10cSrcweir     }
3565*cdf0e10cSrcweir 
3566*cdf0e10cSrcweir     return NULL;
3567*cdf0e10cSrcweir }
3568*cdf0e10cSrcweir 
3569*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryFormulaCells(
3570*cdf0e10cSrcweir                                                     sal_Int32 nResultFlags )
3571*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
3572*cdf0e10cSrcweir {
3573*cdf0e10cSrcweir     ScUnoGuard aGuard;
3574*cdf0e10cSrcweir     if (pDocShell)
3575*cdf0e10cSrcweir     {
3576*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3577*cdf0e10cSrcweir 
3578*cdf0e10cSrcweir         ScMarkData aMarkData;
3579*cdf0e10cSrcweir 
3580*cdf0e10cSrcweir         //  passende Zellen selektieren
3581*cdf0e10cSrcweir         sal_uLong nCount = aRanges.Count();
3582*cdf0e10cSrcweir         for (sal_uLong i=0; i<nCount; i++)
3583*cdf0e10cSrcweir         {
3584*cdf0e10cSrcweir             ScRange aRange = *aRanges.GetObject(i);
3585*cdf0e10cSrcweir 
3586*cdf0e10cSrcweir             ScCellIterator aIter( pDoc, aRange );
3587*cdf0e10cSrcweir             ScBaseCell* pCell = aIter.GetFirst();
3588*cdf0e10cSrcweir             while (pCell)
3589*cdf0e10cSrcweir             {
3590*cdf0e10cSrcweir                 if (pCell->GetCellType() == CELLTYPE_FORMULA)
3591*cdf0e10cSrcweir                 {
3592*cdf0e10cSrcweir                     ScFormulaCell* pFCell = (ScFormulaCell*)pCell;
3593*cdf0e10cSrcweir                     sal_Bool bAdd = sal_False;
3594*cdf0e10cSrcweir                     if (pFCell->GetErrCode())
3595*cdf0e10cSrcweir                     {
3596*cdf0e10cSrcweir                         if ( nResultFlags & sheet::FormulaResult::ERROR )
3597*cdf0e10cSrcweir                             bAdd = sal_True;
3598*cdf0e10cSrcweir                     }
3599*cdf0e10cSrcweir                     else if (pFCell->IsValue())
3600*cdf0e10cSrcweir                     {
3601*cdf0e10cSrcweir                         if ( nResultFlags & sheet::FormulaResult::VALUE )
3602*cdf0e10cSrcweir                             bAdd = sal_True;
3603*cdf0e10cSrcweir                     }
3604*cdf0e10cSrcweir                     else    // String
3605*cdf0e10cSrcweir                     {
3606*cdf0e10cSrcweir                         if ( nResultFlags & sheet::FormulaResult::STRING )
3607*cdf0e10cSrcweir                             bAdd = sal_True;
3608*cdf0e10cSrcweir                     }
3609*cdf0e10cSrcweir 
3610*cdf0e10cSrcweir                     if (bAdd)
3611*cdf0e10cSrcweir                         aMarkData.SetMultiMarkArea(
3612*cdf0e10cSrcweir                                 ScRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() ),
3613*cdf0e10cSrcweir                                 sal_True );
3614*cdf0e10cSrcweir                 }
3615*cdf0e10cSrcweir 
3616*cdf0e10cSrcweir                 pCell = aIter.GetNext();
3617*cdf0e10cSrcweir             }
3618*cdf0e10cSrcweir         }
3619*cdf0e10cSrcweir 
3620*cdf0e10cSrcweir         ScRangeList aNewRanges;
3621*cdf0e10cSrcweir         if (aMarkData.IsMultiMarked())
3622*cdf0e10cSrcweir             aMarkData.FillRangeListWithMarks( &aNewRanges, sal_False );
3623*cdf0e10cSrcweir 
3624*cdf0e10cSrcweir         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
3625*cdf0e10cSrcweir     }
3626*cdf0e10cSrcweir 
3627*cdf0e10cSrcweir     return NULL;
3628*cdf0e10cSrcweir }
3629*cdf0e10cSrcweir 
3630*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellRanges> ScCellRangesBase::QueryDifferences_Impl(
3631*cdf0e10cSrcweir                         const table::CellAddress& aCompare, sal_Bool bColumnDiff)
3632*cdf0e10cSrcweir {
3633*cdf0e10cSrcweir     if (pDocShell)
3634*cdf0e10cSrcweir     {
3635*cdf0e10cSrcweir         sal_uLong nRangeCount = aRanges.Count();
3636*cdf0e10cSrcweir         sal_uLong i;
3637*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3638*cdf0e10cSrcweir         ScMarkData aMarkData;
3639*cdf0e10cSrcweir 
3640*cdf0e10cSrcweir         SCCOLROW nCmpPos = bColumnDiff ? (SCCOLROW)aCompare.Row : (SCCOLROW)aCompare.Column;
3641*cdf0e10cSrcweir 
3642*cdf0e10cSrcweir         //  zuerst alles selektieren, wo ueberhaupt etwas in der Vergleichsspalte steht
3643*cdf0e10cSrcweir         //  (fuer gleiche Zellen wird die Selektion im zweiten Schritt aufgehoben)
3644*cdf0e10cSrcweir 
3645*cdf0e10cSrcweir         SCTAB nTab = lcl_FirstTab(aRanges); //! fuer alle Tabellen, wenn Markierungen pro Tabelle!
3646*cdf0e10cSrcweir         ScRange aCmpRange, aCellRange;
3647*cdf0e10cSrcweir         if (bColumnDiff)
3648*cdf0e10cSrcweir             aCmpRange = ScRange( 0,nCmpPos,nTab, MAXCOL,nCmpPos,nTab );
3649*cdf0e10cSrcweir         else
3650*cdf0e10cSrcweir             aCmpRange = ScRange( static_cast<SCCOL>(nCmpPos),0,nTab, static_cast<SCCOL>(nCmpPos),MAXROW,nTab );
3651*cdf0e10cSrcweir         ScCellIterator aCmpIter( pDoc, aCmpRange );
3652*cdf0e10cSrcweir         ScBaseCell* pCmpCell = aCmpIter.GetFirst();
3653*cdf0e10cSrcweir         while (pCmpCell)
3654*cdf0e10cSrcweir         {
3655*cdf0e10cSrcweir             if (pCmpCell->GetCellType() != CELLTYPE_NOTE)
3656*cdf0e10cSrcweir             {
3657*cdf0e10cSrcweir                 SCCOLROW nCellPos = bColumnDiff ? static_cast<SCCOLROW>(aCmpIter.GetCol()) : static_cast<SCCOLROW>(aCmpIter.GetRow());
3658*cdf0e10cSrcweir                 if (bColumnDiff)
3659*cdf0e10cSrcweir                     aCellRange = ScRange( static_cast<SCCOL>(nCellPos),0,nTab,
3660*cdf0e10cSrcweir                             static_cast<SCCOL>(nCellPos),MAXROW,nTab );
3661*cdf0e10cSrcweir                 else
3662*cdf0e10cSrcweir                     aCellRange = ScRange( 0,nCellPos,nTab, MAXCOL,nCellPos,nTab );
3663*cdf0e10cSrcweir 
3664*cdf0e10cSrcweir                 for (i=0; i<nRangeCount; i++)
3665*cdf0e10cSrcweir                 {
3666*cdf0e10cSrcweir                     ScRange aRange(*aRanges.GetObject(i));
3667*cdf0e10cSrcweir                     if ( aRange.Intersects( aCellRange ) )
3668*cdf0e10cSrcweir                     {
3669*cdf0e10cSrcweir                         if (bColumnDiff)
3670*cdf0e10cSrcweir                         {
3671*cdf0e10cSrcweir                             aRange.aStart.SetCol(static_cast<SCCOL>(nCellPos));
3672*cdf0e10cSrcweir                             aRange.aEnd.SetCol(static_cast<SCCOL>(nCellPos));
3673*cdf0e10cSrcweir                         }
3674*cdf0e10cSrcweir                         else
3675*cdf0e10cSrcweir                         {
3676*cdf0e10cSrcweir                             aRange.aStart.SetRow(nCellPos);
3677*cdf0e10cSrcweir                             aRange.aEnd.SetRow(nCellPos);
3678*cdf0e10cSrcweir                         }
3679*cdf0e10cSrcweir                         aMarkData.SetMultiMarkArea( aRange );
3680*cdf0e10cSrcweir                     }
3681*cdf0e10cSrcweir                 }
3682*cdf0e10cSrcweir             }
3683*cdf0e10cSrcweir             pCmpCell = aCmpIter.GetNext();
3684*cdf0e10cSrcweir         }
3685*cdf0e10cSrcweir 
3686*cdf0e10cSrcweir         //  alle nichtleeren Zellen mit der Vergleichsspalte vergleichen und entsprechend
3687*cdf0e10cSrcweir         //  selektieren oder aufheben
3688*cdf0e10cSrcweir 
3689*cdf0e10cSrcweir         ScAddress aCmpAddr;
3690*cdf0e10cSrcweir         for (i=0; i<nRangeCount; i++)
3691*cdf0e10cSrcweir         {
3692*cdf0e10cSrcweir             ScRange aRange(*aRanges.GetObject(i));
3693*cdf0e10cSrcweir 
3694*cdf0e10cSrcweir             ScCellIterator aIter( pDoc, aRange );
3695*cdf0e10cSrcweir             ScBaseCell* pCell = aIter.GetFirst();
3696*cdf0e10cSrcweir             while (pCell)
3697*cdf0e10cSrcweir             {
3698*cdf0e10cSrcweir                 if (bColumnDiff)
3699*cdf0e10cSrcweir                     aCmpAddr = ScAddress( aIter.GetCol(), nCmpPos, aIter.GetTab() );
3700*cdf0e10cSrcweir                 else
3701*cdf0e10cSrcweir                     aCmpAddr = ScAddress( static_cast<SCCOL>(nCmpPos), aIter.GetRow(), aIter.GetTab() );
3702*cdf0e10cSrcweir                 const ScBaseCell* pOtherCell = pDoc->GetCell( aCmpAddr );
3703*cdf0e10cSrcweir 
3704*cdf0e10cSrcweir                 ScRange aOneRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() );
3705*cdf0e10cSrcweir                 if ( !ScBaseCell::CellEqual( pCell, pOtherCell ) )
3706*cdf0e10cSrcweir                     aMarkData.SetMultiMarkArea( aOneRange );
3707*cdf0e10cSrcweir                 else
3708*cdf0e10cSrcweir                     aMarkData.SetMultiMarkArea( aOneRange, sal_False );     // deselect
3709*cdf0e10cSrcweir 
3710*cdf0e10cSrcweir                 pCell = aIter.GetNext();
3711*cdf0e10cSrcweir             }
3712*cdf0e10cSrcweir         }
3713*cdf0e10cSrcweir 
3714*cdf0e10cSrcweir         ScRangeList aNewRanges;
3715*cdf0e10cSrcweir         if (aMarkData.IsMultiMarked())
3716*cdf0e10cSrcweir             aMarkData.FillRangeListWithMarks( &aNewRanges, sal_False );
3717*cdf0e10cSrcweir 
3718*cdf0e10cSrcweir         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
3719*cdf0e10cSrcweir     }
3720*cdf0e10cSrcweir     return NULL;
3721*cdf0e10cSrcweir }
3722*cdf0e10cSrcweir 
3723*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellRanges > SAL_CALL ScCellRangesBase::queryColumnDifferences(
3724*cdf0e10cSrcweir                             const table::CellAddress& aCompare ) throw(uno::RuntimeException)
3725*cdf0e10cSrcweir {
3726*cdf0e10cSrcweir     ScUnoGuard aGuard;
3727*cdf0e10cSrcweir     return QueryDifferences_Impl( aCompare, sal_True );
3728*cdf0e10cSrcweir }
3729*cdf0e10cSrcweir 
3730*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryRowDifferences(
3731*cdf0e10cSrcweir                             const table::CellAddress& aCompare ) throw(uno::RuntimeException)
3732*cdf0e10cSrcweir {
3733*cdf0e10cSrcweir     ScUnoGuard aGuard;
3734*cdf0e10cSrcweir     return QueryDifferences_Impl( aCompare, sal_False );
3735*cdf0e10cSrcweir }
3736*cdf0e10cSrcweir 
3737*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryIntersection(
3738*cdf0e10cSrcweir                             const table::CellRangeAddress& aRange ) throw(uno::RuntimeException)
3739*cdf0e10cSrcweir {
3740*cdf0e10cSrcweir     ScUnoGuard aGuard;
3741*cdf0e10cSrcweir     ScRange aMask( (SCCOL)aRange.StartColumn, (SCROW)aRange.StartRow, aRange.Sheet,
3742*cdf0e10cSrcweir                    (SCCOL)aRange.EndColumn,   (SCROW)aRange.EndRow,   aRange.Sheet );
3743*cdf0e10cSrcweir 
3744*cdf0e10cSrcweir     ScRangeList aNew;
3745*cdf0e10cSrcweir     sal_uLong nCount = aRanges.Count();
3746*cdf0e10cSrcweir     for (sal_uLong i=0; i<nCount; i++)
3747*cdf0e10cSrcweir     {
3748*cdf0e10cSrcweir         ScRange aTemp(*aRanges.GetObject(i));
3749*cdf0e10cSrcweir         if ( aTemp.Intersects( aMask ) )
3750*cdf0e10cSrcweir             aNew.Join( ScRange( Max( aTemp.aStart.Col(), aMask.aStart.Col() ),
3751*cdf0e10cSrcweir                                 Max( aTemp.aStart.Row(), aMask.aStart.Row() ),
3752*cdf0e10cSrcweir                                 Max( aTemp.aStart.Tab(), aMask.aStart.Tab() ),
3753*cdf0e10cSrcweir                                 Min( aTemp.aEnd.Col(), aMask.aEnd.Col() ),
3754*cdf0e10cSrcweir                                 Min( aTemp.aEnd.Row(), aMask.aEnd.Row() ),
3755*cdf0e10cSrcweir                                 Min( aTemp.aEnd.Tab(), aMask.aEnd.Tab() ) ) );
3756*cdf0e10cSrcweir     }
3757*cdf0e10cSrcweir 
3758*cdf0e10cSrcweir     return new ScCellRangesObj( pDocShell, aNew );  // kann leer sein
3759*cdf0e10cSrcweir }
3760*cdf0e10cSrcweir 
3761*cdf0e10cSrcweir // XFormulaQuery
3762*cdf0e10cSrcweir 
3763*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryPrecedents(
3764*cdf0e10cSrcweir                                 sal_Bool bRecursive ) throw(uno::RuntimeException)
3765*cdf0e10cSrcweir {
3766*cdf0e10cSrcweir     ScUnoGuard aGuard;
3767*cdf0e10cSrcweir     if ( pDocShell )
3768*cdf0e10cSrcweir     {
3769*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3770*cdf0e10cSrcweir 
3771*cdf0e10cSrcweir         ScRangeList aNewRanges(aRanges);
3772*cdf0e10cSrcweir         sal_Bool bFound;
3773*cdf0e10cSrcweir         do
3774*cdf0e10cSrcweir         {
3775*cdf0e10cSrcweir             bFound = sal_False;
3776*cdf0e10cSrcweir 
3777*cdf0e10cSrcweir             //  #97205# aMarkData uses aNewRanges, not aRanges, so GetMarkData can't be used
3778*cdf0e10cSrcweir             ScMarkData aMarkData;
3779*cdf0e10cSrcweir             aMarkData.MarkFromRangeList( aNewRanges, sal_False );
3780*cdf0e10cSrcweir             aMarkData.MarkToMulti();        // needed for IsAllMarked
3781*cdf0e10cSrcweir 
3782*cdf0e10cSrcweir             sal_uLong nCount = aNewRanges.Count();
3783*cdf0e10cSrcweir             for (sal_uLong nR=0; nR<nCount; nR++)
3784*cdf0e10cSrcweir             {
3785*cdf0e10cSrcweir                 ScRange aRange(*aNewRanges.GetObject(nR));
3786*cdf0e10cSrcweir                 ScCellIterator aIter( pDoc, aRange );
3787*cdf0e10cSrcweir                 ScBaseCell* pCell = aIter.GetFirst();
3788*cdf0e10cSrcweir                 while (pCell)
3789*cdf0e10cSrcweir                 {
3790*cdf0e10cSrcweir                     if ( pCell->GetCellType() == CELLTYPE_FORMULA )
3791*cdf0e10cSrcweir                     {
3792*cdf0e10cSrcweir                         ScFormulaCell* pFCell = (ScFormulaCell*) pCell;
3793*cdf0e10cSrcweir 
3794*cdf0e10cSrcweir                         ScDetectiveRefIter aRefIter( pFCell );
3795*cdf0e10cSrcweir                         ScRange aRefRange;
3796*cdf0e10cSrcweir                         while ( aRefIter.GetNextRef( aRefRange) )
3797*cdf0e10cSrcweir                         {
3798*cdf0e10cSrcweir                             if ( bRecursive && !bFound && !aMarkData.IsAllMarked( aRefRange ) )
3799*cdf0e10cSrcweir                                 bFound = sal_True;
3800*cdf0e10cSrcweir                             aMarkData.SetMultiMarkArea( aRefRange, sal_True );
3801*cdf0e10cSrcweir                         }
3802*cdf0e10cSrcweir                     }
3803*cdf0e10cSrcweir                     pCell = aIter.GetNext();
3804*cdf0e10cSrcweir                 }
3805*cdf0e10cSrcweir             }
3806*cdf0e10cSrcweir 
3807*cdf0e10cSrcweir             aMarkData.FillRangeListWithMarks( &aNewRanges, sal_True );
3808*cdf0e10cSrcweir         }
3809*cdf0e10cSrcweir         while ( bRecursive && bFound );
3810*cdf0e10cSrcweir 
3811*cdf0e10cSrcweir         return new ScCellRangesObj( pDocShell, aNewRanges );
3812*cdf0e10cSrcweir     }
3813*cdf0e10cSrcweir 
3814*cdf0e10cSrcweir     return NULL;
3815*cdf0e10cSrcweir }
3816*cdf0e10cSrcweir 
3817*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryDependents(
3818*cdf0e10cSrcweir                                 sal_Bool bRecursive ) throw(uno::RuntimeException)
3819*cdf0e10cSrcweir {
3820*cdf0e10cSrcweir     ScUnoGuard aGuard;
3821*cdf0e10cSrcweir     if ( pDocShell )
3822*cdf0e10cSrcweir     {
3823*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
3824*cdf0e10cSrcweir 
3825*cdf0e10cSrcweir         ScRangeList aNewRanges(aRanges);
3826*cdf0e10cSrcweir         sal_Bool bFound;
3827*cdf0e10cSrcweir         do
3828*cdf0e10cSrcweir         {
3829*cdf0e10cSrcweir             bFound = sal_False;
3830*cdf0e10cSrcweir             sal_uLong nRangesCount = aNewRanges.Count();
3831*cdf0e10cSrcweir 
3832*cdf0e10cSrcweir             //  #97205# aMarkData uses aNewRanges, not aRanges, so GetMarkData can't be used
3833*cdf0e10cSrcweir             ScMarkData aMarkData;
3834*cdf0e10cSrcweir             aMarkData.MarkFromRangeList( aNewRanges, sal_False );
3835*cdf0e10cSrcweir             aMarkData.MarkToMulti();        // needed for IsAllMarked
3836*cdf0e10cSrcweir 
3837*cdf0e10cSrcweir             SCTAB nTab = lcl_FirstTab(aNewRanges);              //! alle Tabellen
3838*cdf0e10cSrcweir 
3839*cdf0e10cSrcweir             ScCellIterator aCellIter( pDoc, 0,0, nTab, MAXCOL,MAXROW, nTab );
3840*cdf0e10cSrcweir             ScBaseCell* pCell = aCellIter.GetFirst();
3841*cdf0e10cSrcweir             while (pCell)
3842*cdf0e10cSrcweir             {
3843*cdf0e10cSrcweir                 if (pCell->GetCellType() == CELLTYPE_FORMULA)
3844*cdf0e10cSrcweir                 {
3845*cdf0e10cSrcweir                     sal_Bool bMark = sal_False;
3846*cdf0e10cSrcweir                     ScDetectiveRefIter aIter( (ScFormulaCell*) pCell );
3847*cdf0e10cSrcweir                     ScRange aRefRange;
3848*cdf0e10cSrcweir                     while ( aIter.GetNextRef( aRefRange) )
3849*cdf0e10cSrcweir                     {
3850*cdf0e10cSrcweir                         for (sal_uLong nR=0; nR<nRangesCount; nR++)
3851*cdf0e10cSrcweir                         {
3852*cdf0e10cSrcweir                             ScRange aRange(*aNewRanges.GetObject(nR));
3853*cdf0e10cSrcweir                             if (aRange.Intersects(aRefRange))
3854*cdf0e10cSrcweir                                 bMark = sal_True;                   // von Teil des Ranges abhaengig
3855*cdf0e10cSrcweir                         }
3856*cdf0e10cSrcweir                     }
3857*cdf0e10cSrcweir                     if (bMark)
3858*cdf0e10cSrcweir                     {
3859*cdf0e10cSrcweir                         ScRange aCellRange( aCellIter.GetCol(),
3860*cdf0e10cSrcweir                                             aCellIter.GetRow(),
3861*cdf0e10cSrcweir                                             aCellIter.GetTab() );
3862*cdf0e10cSrcweir                         if ( bRecursive && !bFound && !aMarkData.IsAllMarked( aCellRange ) )
3863*cdf0e10cSrcweir                             bFound = sal_True;
3864*cdf0e10cSrcweir                         aMarkData.SetMultiMarkArea( aCellRange, sal_True );
3865*cdf0e10cSrcweir                     }
3866*cdf0e10cSrcweir                 }
3867*cdf0e10cSrcweir                 pCell = aCellIter.GetNext();
3868*cdf0e10cSrcweir             }
3869*cdf0e10cSrcweir 
3870*cdf0e10cSrcweir             aMarkData.FillRangeListWithMarks( &aNewRanges, sal_True );
3871*cdf0e10cSrcweir         }
3872*cdf0e10cSrcweir         while ( bRecursive && bFound );
3873*cdf0e10cSrcweir 
3874*cdf0e10cSrcweir         return new ScCellRangesObj( pDocShell, aNewRanges );
3875*cdf0e10cSrcweir     }
3876*cdf0e10cSrcweir 
3877*cdf0e10cSrcweir     return NULL;
3878*cdf0e10cSrcweir }
3879*cdf0e10cSrcweir 
3880*cdf0e10cSrcweir // XSearchable
3881*cdf0e10cSrcweir 
3882*cdf0e10cSrcweir uno::Reference<util::XSearchDescriptor> SAL_CALL ScCellRangesBase::createSearchDescriptor()
3883*cdf0e10cSrcweir                                                             throw(uno::RuntimeException)
3884*cdf0e10cSrcweir {
3885*cdf0e10cSrcweir     ScUnoGuard aGuard;
3886*cdf0e10cSrcweir     return new ScCellSearchObj;
3887*cdf0e10cSrcweir }
3888*cdf0e10cSrcweir 
3889*cdf0e10cSrcweir uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangesBase::findAll(
3890*cdf0e10cSrcweir                         const uno::Reference<util::XSearchDescriptor>& xDesc )
3891*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
3892*cdf0e10cSrcweir {
3893*cdf0e10cSrcweir     //  Wenn nichts gefunden wird, soll Null zurueckgegeben werden (?)
3894*cdf0e10cSrcweir     uno::Reference<container::XIndexAccess> xRet;
3895*cdf0e10cSrcweir     if ( pDocShell && xDesc.is() )
3896*cdf0e10cSrcweir     {
3897*cdf0e10cSrcweir         ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc );
3898*cdf0e10cSrcweir         if (pSearch)
3899*cdf0e10cSrcweir         {
3900*cdf0e10cSrcweir             SvxSearchItem* pSearchItem = pSearch->GetSearchItem();
3901*cdf0e10cSrcweir             if (pSearchItem)
3902*cdf0e10cSrcweir             {
3903*cdf0e10cSrcweir                 ScDocument* pDoc = pDocShell->GetDocument();
3904*cdf0e10cSrcweir                 pSearchItem->SetCommand( SVX_SEARCHCMD_FIND_ALL );
3905*cdf0e10cSrcweir                 //  immer nur innerhalb dieses Objekts
3906*cdf0e10cSrcweir                 pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) );
3907*cdf0e10cSrcweir 
3908*cdf0e10cSrcweir                 ScMarkData aMark(*GetMarkData());
3909*cdf0e10cSrcweir 
3910*cdf0e10cSrcweir                 String aDummyUndo;
3911*cdf0e10cSrcweir                 SCCOL nCol = 0;
3912*cdf0e10cSrcweir                 SCROW nRow = 0;
3913*cdf0e10cSrcweir                 SCTAB nTab = 0;
3914*cdf0e10cSrcweir                 sal_Bool bFound = pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab,
3915*cdf0e10cSrcweir                                                         aMark, aDummyUndo, NULL );
3916*cdf0e10cSrcweir                 if (bFound)
3917*cdf0e10cSrcweir                 {
3918*cdf0e10cSrcweir                     ScRangeList aNewRanges;
3919*cdf0e10cSrcweir                     aMark.FillRangeListWithMarks( &aNewRanges, sal_True );
3920*cdf0e10cSrcweir                     //  bei findAll immer CellRanges, egal wieviel gefunden wurde
3921*cdf0e10cSrcweir                     xRet.set(new ScCellRangesObj( pDocShell, aNewRanges ));
3922*cdf0e10cSrcweir                 }
3923*cdf0e10cSrcweir             }
3924*cdf0e10cSrcweir         }
3925*cdf0e10cSrcweir     }
3926*cdf0e10cSrcweir     return xRet;
3927*cdf0e10cSrcweir }
3928*cdf0e10cSrcweir 
3929*cdf0e10cSrcweir uno::Reference<uno::XInterface> ScCellRangesBase::Find_Impl(
3930*cdf0e10cSrcweir                                     const uno::Reference<util::XSearchDescriptor>& xDesc,
3931*cdf0e10cSrcweir                                     const ScAddress* pLastPos )
3932*cdf0e10cSrcweir {
3933*cdf0e10cSrcweir     uno::Reference<uno::XInterface> xRet;
3934*cdf0e10cSrcweir     if ( pDocShell && xDesc.is() )
3935*cdf0e10cSrcweir     {
3936*cdf0e10cSrcweir         ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc );
3937*cdf0e10cSrcweir         if (pSearch)
3938*cdf0e10cSrcweir         {
3939*cdf0e10cSrcweir             SvxSearchItem* pSearchItem = pSearch->GetSearchItem();
3940*cdf0e10cSrcweir             if (pSearchItem)
3941*cdf0e10cSrcweir             {
3942*cdf0e10cSrcweir                 ScDocument* pDoc = pDocShell->GetDocument();
3943*cdf0e10cSrcweir                 pSearchItem->SetCommand( SVX_SEARCHCMD_FIND );
3944*cdf0e10cSrcweir                 //  immer nur innerhalb dieses Objekts
3945*cdf0e10cSrcweir                 pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) );
3946*cdf0e10cSrcweir 
3947*cdf0e10cSrcweir                 ScMarkData aMark(*GetMarkData());
3948*cdf0e10cSrcweir 
3949*cdf0e10cSrcweir                 SCCOL nCol;
3950*cdf0e10cSrcweir                 SCROW nRow;
3951*cdf0e10cSrcweir                 SCTAB nTab;
3952*cdf0e10cSrcweir                 if (pLastPos)
3953*cdf0e10cSrcweir                     pLastPos->GetVars( nCol, nRow, nTab );
3954*cdf0e10cSrcweir                 else
3955*cdf0e10cSrcweir                 {
3956*cdf0e10cSrcweir                     nTab = lcl_FirstTab(aRanges);   //! mehrere Tabellen?
3957*cdf0e10cSrcweir                     ScDocument::GetSearchAndReplaceStart( *pSearchItem, nCol, nRow );
3958*cdf0e10cSrcweir                 }
3959*cdf0e10cSrcweir 
3960*cdf0e10cSrcweir                 String aDummyUndo;
3961*cdf0e10cSrcweir                 sal_Bool bFound = pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab,
3962*cdf0e10cSrcweir                                                         aMark, aDummyUndo, NULL );
3963*cdf0e10cSrcweir                 if (bFound)
3964*cdf0e10cSrcweir                 {
3965*cdf0e10cSrcweir                     ScAddress aFoundPos( nCol, nRow, nTab );
3966*cdf0e10cSrcweir                     xRet.set((cppu::OWeakObject*) new ScCellObj( pDocShell, aFoundPos ));
3967*cdf0e10cSrcweir                 }
3968*cdf0e10cSrcweir             }
3969*cdf0e10cSrcweir         }
3970*cdf0e10cSrcweir     }
3971*cdf0e10cSrcweir     return xRet;
3972*cdf0e10cSrcweir }
3973*cdf0e10cSrcweir 
3974*cdf0e10cSrcweir uno::Reference<uno::XInterface> SAL_CALL ScCellRangesBase::findFirst(
3975*cdf0e10cSrcweir                         const uno::Reference<util::XSearchDescriptor>& xDesc )
3976*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
3977*cdf0e10cSrcweir {
3978*cdf0e10cSrcweir     ScUnoGuard aGuard;
3979*cdf0e10cSrcweir     return Find_Impl( xDesc, NULL );
3980*cdf0e10cSrcweir }
3981*cdf0e10cSrcweir 
3982*cdf0e10cSrcweir uno::Reference<uno::XInterface> SAL_CALL ScCellRangesBase::findNext(
3983*cdf0e10cSrcweir                         const uno::Reference<uno::XInterface>& xStartAt,
3984*cdf0e10cSrcweir                         const uno::Reference<util::XSearchDescriptor >& xDesc )
3985*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
3986*cdf0e10cSrcweir {
3987*cdf0e10cSrcweir     ScUnoGuard aGuard;
3988*cdf0e10cSrcweir     if ( xStartAt.is() )
3989*cdf0e10cSrcweir     {
3990*cdf0e10cSrcweir         ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xStartAt );
3991*cdf0e10cSrcweir         if ( pRangesImp && pRangesImp->GetDocShell() == pDocShell )
3992*cdf0e10cSrcweir         {
3993*cdf0e10cSrcweir             const ScRangeList& rStartRanges = pRangesImp->GetRangeList();
3994*cdf0e10cSrcweir             if ( rStartRanges.Count() == 1 )
3995*cdf0e10cSrcweir             {
3996*cdf0e10cSrcweir                 ScAddress aStartPos = rStartRanges.GetObject(0)->aStart;
3997*cdf0e10cSrcweir                 return Find_Impl( xDesc, &aStartPos );
3998*cdf0e10cSrcweir             }
3999*cdf0e10cSrcweir         }
4000*cdf0e10cSrcweir     }
4001*cdf0e10cSrcweir     return NULL;
4002*cdf0e10cSrcweir }
4003*cdf0e10cSrcweir 
4004*cdf0e10cSrcweir // XReplaceable
4005*cdf0e10cSrcweir 
4006*cdf0e10cSrcweir uno::Reference<util::XReplaceDescriptor> SAL_CALL ScCellRangesBase::createReplaceDescriptor()
4007*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
4008*cdf0e10cSrcweir {
4009*cdf0e10cSrcweir     ScUnoGuard aGuard;
4010*cdf0e10cSrcweir     return new ScCellSearchObj;
4011*cdf0e10cSrcweir }
4012*cdf0e10cSrcweir 
4013*cdf0e10cSrcweir sal_Int32 SAL_CALL ScCellRangesBase::replaceAll( const uno::Reference<util::XSearchDescriptor>& xDesc )
4014*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
4015*cdf0e10cSrcweir {
4016*cdf0e10cSrcweir     ScUnoGuard aGuard;
4017*cdf0e10cSrcweir     sal_Int32 nReplaced = 0;
4018*cdf0e10cSrcweir     if ( pDocShell && xDesc.is() )
4019*cdf0e10cSrcweir     {
4020*cdf0e10cSrcweir         ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc );
4021*cdf0e10cSrcweir         if (pSearch)
4022*cdf0e10cSrcweir         {
4023*cdf0e10cSrcweir             SvxSearchItem* pSearchItem = pSearch->GetSearchItem();
4024*cdf0e10cSrcweir             if (pSearchItem)
4025*cdf0e10cSrcweir             {
4026*cdf0e10cSrcweir                 ScDocument* pDoc = pDocShell->GetDocument();
4027*cdf0e10cSrcweir                 sal_Bool bUndo(pDoc->IsUndoEnabled());
4028*cdf0e10cSrcweir                 pSearchItem->SetCommand( SVX_SEARCHCMD_REPLACE_ALL );
4029*cdf0e10cSrcweir                 //  immer nur innerhalb dieses Objekts
4030*cdf0e10cSrcweir                 pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) );
4031*cdf0e10cSrcweir 
4032*cdf0e10cSrcweir                 ScMarkData aMark(*GetMarkData());
4033*cdf0e10cSrcweir 
4034*cdf0e10cSrcweir                 SCTAB nTabCount = pDoc->GetTableCount();
4035*cdf0e10cSrcweir                 sal_Bool bProtected = !pDocShell->IsEditable();
4036*cdf0e10cSrcweir                 for (SCTAB i=0; i<nTabCount; i++)
4037*cdf0e10cSrcweir                     if ( aMark.GetTableSelect(i) && pDoc->IsTabProtected(i) )
4038*cdf0e10cSrcweir                         bProtected = sal_True;
4039*cdf0e10cSrcweir                 if (bProtected)
4040*cdf0e10cSrcweir                 {
4041*cdf0e10cSrcweir                     //! Exception, oder was?
4042*cdf0e10cSrcweir                 }
4043*cdf0e10cSrcweir                 else
4044*cdf0e10cSrcweir                 {
4045*cdf0e10cSrcweir                     SCTAB nTab = aMark.GetFirstSelected();      // bei SearchAndReplace nicht benutzt
4046*cdf0e10cSrcweir                     SCCOL nCol = 0;
4047*cdf0e10cSrcweir                     SCROW nRow = 0;
4048*cdf0e10cSrcweir 
4049*cdf0e10cSrcweir                     String aUndoStr;
4050*cdf0e10cSrcweir                     ScDocument* pUndoDoc = NULL;
4051*cdf0e10cSrcweir                     if (bUndo)
4052*cdf0e10cSrcweir                     {
4053*cdf0e10cSrcweir                         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
4054*cdf0e10cSrcweir                         pUndoDoc->InitUndo( pDoc, nTab, nTab );
4055*cdf0e10cSrcweir                     }
4056*cdf0e10cSrcweir                     for (SCTAB i=0; i<nTabCount; i++)
4057*cdf0e10cSrcweir                         if ( aMark.GetTableSelect(i) && i != nTab && bUndo)
4058*cdf0e10cSrcweir                             pUndoDoc->AddUndoTab( i, i );
4059*cdf0e10cSrcweir                     ScMarkData* pUndoMark = NULL;
4060*cdf0e10cSrcweir                     if (bUndo)
4061*cdf0e10cSrcweir                         pUndoMark = new ScMarkData(aMark);
4062*cdf0e10cSrcweir 
4063*cdf0e10cSrcweir                     sal_Bool bFound(sal_False);
4064*cdf0e10cSrcweir                     if (bUndo)
4065*cdf0e10cSrcweir                         bFound = pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab,
4066*cdf0e10cSrcweir                                                             aMark, aUndoStr, pUndoDoc );
4067*cdf0e10cSrcweir                     if (bFound)
4068*cdf0e10cSrcweir                     {
4069*cdf0e10cSrcweir                         nReplaced = pUndoDoc->GetCellCount();
4070*cdf0e10cSrcweir 
4071*cdf0e10cSrcweir                         pDocShell->GetUndoManager()->AddUndoAction(
4072*cdf0e10cSrcweir                             new ScUndoReplace( pDocShell, *pUndoMark, nCol, nRow, nTab,
4073*cdf0e10cSrcweir                                                         aUndoStr, pUndoDoc, pSearchItem ) );
4074*cdf0e10cSrcweir 
4075*cdf0e10cSrcweir                         pDocShell->PostPaintGridAll();
4076*cdf0e10cSrcweir                         pDocShell->SetDocumentModified();
4077*cdf0e10cSrcweir                     }
4078*cdf0e10cSrcweir                     else
4079*cdf0e10cSrcweir                     {
4080*cdf0e10cSrcweir                         delete pUndoDoc;
4081*cdf0e10cSrcweir                         delete pUndoMark;
4082*cdf0e10cSrcweir                         // nReplaced bleibt 0
4083*cdf0e10cSrcweir                     }
4084*cdf0e10cSrcweir                 }
4085*cdf0e10cSrcweir             }
4086*cdf0e10cSrcweir         }
4087*cdf0e10cSrcweir     }
4088*cdf0e10cSrcweir     return nReplaced;
4089*cdf0e10cSrcweir }
4090*cdf0e10cSrcweir 
4091*cdf0e10cSrcweir // XUnoTunnel
4092*cdf0e10cSrcweir 
4093*cdf0e10cSrcweir sal_Int64 SAL_CALL ScCellRangesBase::getSomething(
4094*cdf0e10cSrcweir                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
4095*cdf0e10cSrcweir {
4096*cdf0e10cSrcweir     if ( rId.getLength() == 16 &&
4097*cdf0e10cSrcweir           0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
4098*cdf0e10cSrcweir                                     rId.getConstArray(), 16 ) )
4099*cdf0e10cSrcweir     {
4100*cdf0e10cSrcweir         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
4101*cdf0e10cSrcweir     }
4102*cdf0e10cSrcweir     return 0;
4103*cdf0e10cSrcweir }
4104*cdf0e10cSrcweir 
4105*cdf0e10cSrcweir // static
4106*cdf0e10cSrcweir const uno::Sequence<sal_Int8>& ScCellRangesBase::getUnoTunnelId()
4107*cdf0e10cSrcweir {
4108*cdf0e10cSrcweir     static uno::Sequence<sal_Int8> * pSeq = 0;
4109*cdf0e10cSrcweir     if( !pSeq )
4110*cdf0e10cSrcweir     {
4111*cdf0e10cSrcweir         osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
4112*cdf0e10cSrcweir         if( !pSeq )
4113*cdf0e10cSrcweir         {
4114*cdf0e10cSrcweir             static uno::Sequence< sal_Int8 > aSeq( 16 );
4115*cdf0e10cSrcweir             rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
4116*cdf0e10cSrcweir             pSeq = &aSeq;
4117*cdf0e10cSrcweir         }
4118*cdf0e10cSrcweir     }
4119*cdf0e10cSrcweir     return *pSeq;
4120*cdf0e10cSrcweir }
4121*cdf0e10cSrcweir 
4122*cdf0e10cSrcweir // static
4123*cdf0e10cSrcweir ScCellRangesBase* ScCellRangesBase::getImplementation( const uno::Reference<uno::XInterface> xObj )
4124*cdf0e10cSrcweir {
4125*cdf0e10cSrcweir     ScCellRangesBase* pRet = NULL;
4126*cdf0e10cSrcweir     uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
4127*cdf0e10cSrcweir     if (xUT.is())
4128*cdf0e10cSrcweir         pRet = reinterpret_cast<ScCellRangesBase*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
4129*cdf0e10cSrcweir     return pRet;
4130*cdf0e10cSrcweir }
4131*cdf0e10cSrcweir 
4132*cdf0e10cSrcweir //------------------------------------------------------------------------
4133*cdf0e10cSrcweir 
4134*cdf0e10cSrcweir ScCellRangesObj::ScCellRangesObj(ScDocShell* pDocSh, const ScRangeList& rR) :
4135*cdf0e10cSrcweir     ScCellRangesBase( pDocSh, rR )
4136*cdf0e10cSrcweir {
4137*cdf0e10cSrcweir }
4138*cdf0e10cSrcweir 
4139*cdf0e10cSrcweir ScCellRangesObj::~ScCellRangesObj()
4140*cdf0e10cSrcweir {
4141*cdf0e10cSrcweir }
4142*cdf0e10cSrcweir 
4143*cdf0e10cSrcweir void ScCellRangesObj::RefChanged()
4144*cdf0e10cSrcweir {
4145*cdf0e10cSrcweir     ScCellRangesBase::RefChanged();
4146*cdf0e10cSrcweir 
4147*cdf0e10cSrcweir     //  nix weiter...
4148*cdf0e10cSrcweir }
4149*cdf0e10cSrcweir 
4150*cdf0e10cSrcweir uno::Any SAL_CALL ScCellRangesObj::queryInterface( const uno::Type& rType )
4151*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
4152*cdf0e10cSrcweir {
4153*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetCellRangeContainer )
4154*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetCellRanges )
4155*cdf0e10cSrcweir     SC_QUERYINTERFACE( container::XIndexAccess )
4156*cdf0e10cSrcweir     SC_QUERY_MULTIPLE( container::XElementAccess, container::XIndexAccess )
4157*cdf0e10cSrcweir     SC_QUERYINTERFACE( container::XEnumerationAccess )
4158*cdf0e10cSrcweir     SC_QUERYINTERFACE( container::XNameContainer )
4159*cdf0e10cSrcweir     SC_QUERYINTERFACE( container::XNameReplace )
4160*cdf0e10cSrcweir     SC_QUERYINTERFACE( container::XNameAccess )
4161*cdf0e10cSrcweir 
4162*cdf0e10cSrcweir     return ScCellRangesBase::queryInterface( rType );
4163*cdf0e10cSrcweir }
4164*cdf0e10cSrcweir 
4165*cdf0e10cSrcweir void SAL_CALL ScCellRangesObj::acquire() throw()
4166*cdf0e10cSrcweir {
4167*cdf0e10cSrcweir     ScCellRangesBase::acquire();
4168*cdf0e10cSrcweir }
4169*cdf0e10cSrcweir 
4170*cdf0e10cSrcweir void SAL_CALL ScCellRangesObj::release() throw()
4171*cdf0e10cSrcweir {
4172*cdf0e10cSrcweir     ScCellRangesBase::release();
4173*cdf0e10cSrcweir }
4174*cdf0e10cSrcweir 
4175*cdf0e10cSrcweir uno::Sequence<uno::Type> SAL_CALL ScCellRangesObj::getTypes() throw(uno::RuntimeException)
4176*cdf0e10cSrcweir {
4177*cdf0e10cSrcweir     static uno::Sequence<uno::Type> aTypes;
4178*cdf0e10cSrcweir     if ( aTypes.getLength() == 0 )
4179*cdf0e10cSrcweir     {
4180*cdf0e10cSrcweir         uno::Sequence<uno::Type> aParentTypes(ScCellRangesBase::getTypes());
4181*cdf0e10cSrcweir         long nParentLen = aParentTypes.getLength();
4182*cdf0e10cSrcweir         const uno::Type* pParentPtr = aParentTypes.getConstArray();
4183*cdf0e10cSrcweir 
4184*cdf0e10cSrcweir         aTypes.realloc( nParentLen + 3 );
4185*cdf0e10cSrcweir         uno::Type* pPtr = aTypes.getArray();
4186*cdf0e10cSrcweir         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSheetCellRangeContainer>*)0);
4187*cdf0e10cSrcweir         pPtr[nParentLen + 1] = getCppuType((const uno::Reference<container::XNameContainer>*)0);
4188*cdf0e10cSrcweir         pPtr[nParentLen + 2] = getCppuType((const uno::Reference<container::XEnumerationAccess>*)0);
4189*cdf0e10cSrcweir 
4190*cdf0e10cSrcweir         for (long i=0; i<nParentLen; i++)
4191*cdf0e10cSrcweir             pPtr[i] = pParentPtr[i];                // parent types first
4192*cdf0e10cSrcweir     }
4193*cdf0e10cSrcweir     return aTypes;
4194*cdf0e10cSrcweir }
4195*cdf0e10cSrcweir 
4196*cdf0e10cSrcweir uno::Sequence<sal_Int8> SAL_CALL ScCellRangesObj::getImplementationId()
4197*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
4198*cdf0e10cSrcweir {
4199*cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId;
4200*cdf0e10cSrcweir     if( aId.getLength() == 0 )
4201*cdf0e10cSrcweir     {
4202*cdf0e10cSrcweir         aId.realloc( 16 );
4203*cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
4204*cdf0e10cSrcweir     }
4205*cdf0e10cSrcweir     return aId;
4206*cdf0e10cSrcweir }
4207*cdf0e10cSrcweir 
4208*cdf0e10cSrcweir // XCellRanges
4209*cdf0e10cSrcweir 
4210*cdf0e10cSrcweir ScCellRangeObj* ScCellRangesObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const
4211*cdf0e10cSrcweir {
4212*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4213*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4214*cdf0e10cSrcweir     if ( pDocSh && nIndex >= 0 && nIndex < sal::static_int_cast<sal_Int32>(rRanges.Count()) )
4215*cdf0e10cSrcweir     {
4216*cdf0e10cSrcweir         ScRange aRange(*rRanges.GetObject(nIndex));
4217*cdf0e10cSrcweir         if ( aRange.aStart == aRange.aEnd )
4218*cdf0e10cSrcweir             return new ScCellObj( pDocSh, aRange.aStart );
4219*cdf0e10cSrcweir         else
4220*cdf0e10cSrcweir             return new ScCellRangeObj( pDocSh, aRange );
4221*cdf0e10cSrcweir     }
4222*cdf0e10cSrcweir 
4223*cdf0e10cSrcweir     return NULL;        // keine DocShell oder falscher Index
4224*cdf0e10cSrcweir }
4225*cdf0e10cSrcweir 
4226*cdf0e10cSrcweir uno::Sequence<table::CellRangeAddress> SAL_CALL ScCellRangesObj::getRangeAddresses()
4227*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
4228*cdf0e10cSrcweir {
4229*cdf0e10cSrcweir     ScUnoGuard aGuard;
4230*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4231*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4232*cdf0e10cSrcweir     sal_uLong nCount = rRanges.Count();
4233*cdf0e10cSrcweir     if ( pDocSh && nCount )
4234*cdf0e10cSrcweir     {
4235*cdf0e10cSrcweir         table::CellRangeAddress aRangeAddress;
4236*cdf0e10cSrcweir         uno::Sequence<table::CellRangeAddress> aSeq(nCount);
4237*cdf0e10cSrcweir         table::CellRangeAddress* pAry = aSeq.getArray();
4238*cdf0e10cSrcweir         for (sal_uInt32 i=0; i<nCount; i++)
4239*cdf0e10cSrcweir         {
4240*cdf0e10cSrcweir             ScUnoConversion::FillApiRange( aRangeAddress, *rRanges.GetObject(i) );
4241*cdf0e10cSrcweir             pAry[i] = aRangeAddress;
4242*cdf0e10cSrcweir         }
4243*cdf0e10cSrcweir         return aSeq;
4244*cdf0e10cSrcweir     }
4245*cdf0e10cSrcweir 
4246*cdf0e10cSrcweir     return uno::Sequence<table::CellRangeAddress>(0);   // leer ist moeglich
4247*cdf0e10cSrcweir }
4248*cdf0e10cSrcweir 
4249*cdf0e10cSrcweir uno::Reference<container::XEnumerationAccess> SAL_CALL ScCellRangesObj::getCells()
4250*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
4251*cdf0e10cSrcweir {
4252*cdf0e10cSrcweir     ScUnoGuard aGuard;
4253*cdf0e10cSrcweir 
4254*cdf0e10cSrcweir     //  getCells with empty range list is possible (no exception),
4255*cdf0e10cSrcweir     //  the resulting enumeration just has no elements
4256*cdf0e10cSrcweir     //  (same behaviour as a valid range with no cells)
4257*cdf0e10cSrcweir     //  This is handled in ScCellsEnumeration ctor.
4258*cdf0e10cSrcweir 
4259*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4260*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4261*cdf0e10cSrcweir     if (pDocSh)
4262*cdf0e10cSrcweir         return new ScCellsObj( pDocSh, rRanges );
4263*cdf0e10cSrcweir     return NULL;
4264*cdf0e10cSrcweir }
4265*cdf0e10cSrcweir 
4266*cdf0e10cSrcweir rtl::OUString SAL_CALL ScCellRangesObj::getRangeAddressesAsString()
4267*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
4268*cdf0e10cSrcweir {
4269*cdf0e10cSrcweir     ScUnoGuard aGuard;
4270*cdf0e10cSrcweir     String aString;
4271*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4272*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4273*cdf0e10cSrcweir     if (pDocSh)
4274*cdf0e10cSrcweir         rRanges.Format( aString, SCA_VALID | SCA_TAB_3D, pDocSh->GetDocument() );
4275*cdf0e10cSrcweir     return aString;
4276*cdf0e10cSrcweir }
4277*cdf0e10cSrcweir 
4278*cdf0e10cSrcweir // XSheetCellRangeContainer
4279*cdf0e10cSrcweir 
4280*cdf0e10cSrcweir void SAL_CALL ScCellRangesObj::addRangeAddress( const table::CellRangeAddress& rRange,
4281*cdf0e10cSrcweir                                     sal_Bool bMergeRanges )
4282*cdf0e10cSrcweir                                     throw(::com::sun::star::uno::RuntimeException)
4283*cdf0e10cSrcweir {
4284*cdf0e10cSrcweir     ScUnoGuard aGuard;
4285*cdf0e10cSrcweir     ScRange aRange(static_cast<SCCOL>(rRange.StartColumn),
4286*cdf0e10cSrcweir             static_cast<SCROW>(rRange.StartRow),
4287*cdf0e10cSrcweir             static_cast<SCTAB>(rRange.Sheet),
4288*cdf0e10cSrcweir             static_cast<SCCOL>(rRange.EndColumn),
4289*cdf0e10cSrcweir             static_cast<SCROW>(rRange.EndRow),
4290*cdf0e10cSrcweir             static_cast<SCTAB>(rRange.Sheet));
4291*cdf0e10cSrcweir     AddRange(aRange, bMergeRanges);
4292*cdf0e10cSrcweir }
4293*cdf0e10cSrcweir 
4294*cdf0e10cSrcweir void lcl_RemoveNamedEntry( ScNamedEntryArr_Impl& rNamedEntries, const ScRange& rRange )
4295*cdf0e10cSrcweir {
4296*cdf0e10cSrcweir     sal_uInt16 nCount = rNamedEntries.Count();
4297*cdf0e10cSrcweir     for ( sal_uInt16 n=nCount; n--; )
4298*cdf0e10cSrcweir         if ( rNamedEntries[n]->GetRange() == rRange )
4299*cdf0e10cSrcweir             rNamedEntries.DeleteAndDestroy( n );
4300*cdf0e10cSrcweir }
4301*cdf0e10cSrcweir 
4302*cdf0e10cSrcweir void SAL_CALL ScCellRangesObj::removeRangeAddress( const table::CellRangeAddress& rRange )
4303*cdf0e10cSrcweir                                 throw(::com::sun::star::container::NoSuchElementException,
4304*cdf0e10cSrcweir                                     ::com::sun::star::uno::RuntimeException)
4305*cdf0e10cSrcweir {
4306*cdf0e10cSrcweir     ScUnoGuard aGuard;
4307*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4308*cdf0e10cSrcweir 
4309*cdf0e10cSrcweir     ScRangeList aSheetRanges;
4310*cdf0e10cSrcweir     ScRangeList aNotSheetRanges;
4311*cdf0e10cSrcweir     for (sal_uInt32 i = 0; i < rRanges.Count(); ++i)
4312*cdf0e10cSrcweir     {
4313*cdf0e10cSrcweir         if (rRanges.GetObject(i)->aStart.Tab() == rRange.Sheet)
4314*cdf0e10cSrcweir         {
4315*cdf0e10cSrcweir             aSheetRanges.Append(*rRanges.GetObject(i));
4316*cdf0e10cSrcweir         }
4317*cdf0e10cSrcweir         else
4318*cdf0e10cSrcweir         {
4319*cdf0e10cSrcweir             aNotSheetRanges.Append(*rRanges.GetObject(i));
4320*cdf0e10cSrcweir         }
4321*cdf0e10cSrcweir     }
4322*cdf0e10cSrcweir     ScMarkData aMarkData;
4323*cdf0e10cSrcweir     aMarkData.MarkFromRangeList( aSheetRanges, sal_False );
4324*cdf0e10cSrcweir     ScRange aRange(static_cast<SCCOL>(rRange.StartColumn),
4325*cdf0e10cSrcweir                 static_cast<SCROW>(rRange.StartRow),
4326*cdf0e10cSrcweir                 static_cast<SCTAB>(rRange.Sheet),
4327*cdf0e10cSrcweir                 static_cast<SCCOL>(rRange.EndColumn),
4328*cdf0e10cSrcweir                 static_cast<SCROW>(rRange.EndRow),
4329*cdf0e10cSrcweir                 static_cast<SCTAB>(rRange.Sheet));
4330*cdf0e10cSrcweir     if (aMarkData.GetTableSelect( aRange.aStart.Tab() ))
4331*cdf0e10cSrcweir     {
4332*cdf0e10cSrcweir         aMarkData.MarkToMulti();
4333*cdf0e10cSrcweir         if (aMarkData.IsAllMarked( aRange ) )
4334*cdf0e10cSrcweir         {
4335*cdf0e10cSrcweir             aMarkData.SetMultiMarkArea( aRange, sal_False );
4336*cdf0e10cSrcweir             lcl_RemoveNamedEntry(aNamedEntries, aRange);
4337*cdf0e10cSrcweir         }
4338*cdf0e10cSrcweir         else
4339*cdf0e10cSrcweir             throw container::NoSuchElementException();
4340*cdf0e10cSrcweir     }
4341*cdf0e10cSrcweir     SetNewRanges(aNotSheetRanges);
4342*cdf0e10cSrcweir     ScRangeList aNew;
4343*cdf0e10cSrcweir     aMarkData.FillRangeListWithMarks( &aNew, sal_False );
4344*cdf0e10cSrcweir     for (sal_uInt32 j = 0; j < aNew.Count(); ++j)
4345*cdf0e10cSrcweir     {
4346*cdf0e10cSrcweir         AddRange(*aNew.GetObject(j), sal_False);
4347*cdf0e10cSrcweir     }
4348*cdf0e10cSrcweir }
4349*cdf0e10cSrcweir 
4350*cdf0e10cSrcweir void SAL_CALL ScCellRangesObj::addRangeAddresses( const uno::Sequence<table::CellRangeAddress >& rRanges,
4351*cdf0e10cSrcweir                                     sal_Bool bMergeRanges )
4352*cdf0e10cSrcweir                                     throw(::com::sun::star::uno::RuntimeException)
4353*cdf0e10cSrcweir {
4354*cdf0e10cSrcweir     ScUnoGuard aGuard;
4355*cdf0e10cSrcweir     sal_Int32 nCount(rRanges.getLength());
4356*cdf0e10cSrcweir     if (nCount)
4357*cdf0e10cSrcweir     {
4358*cdf0e10cSrcweir         const table::CellRangeAddress* pRanges = rRanges.getConstArray();
4359*cdf0e10cSrcweir         for (sal_Int32 i = 0; i < rRanges.getLength(); i++, pRanges++)
4360*cdf0e10cSrcweir         {
4361*cdf0e10cSrcweir             ScRange aRange(static_cast<SCCOL>(pRanges->StartColumn),
4362*cdf0e10cSrcweir                     static_cast<SCROW>(pRanges->StartRow),
4363*cdf0e10cSrcweir                     static_cast<SCTAB>(pRanges->Sheet),
4364*cdf0e10cSrcweir                     static_cast<SCCOL>(pRanges->EndColumn),
4365*cdf0e10cSrcweir                     static_cast<SCROW>(pRanges->EndRow),
4366*cdf0e10cSrcweir                     static_cast<SCTAB>(pRanges->Sheet));
4367*cdf0e10cSrcweir             AddRange(aRange, bMergeRanges);
4368*cdf0e10cSrcweir         }
4369*cdf0e10cSrcweir     }
4370*cdf0e10cSrcweir }
4371*cdf0e10cSrcweir 
4372*cdf0e10cSrcweir void SAL_CALL ScCellRangesObj::removeRangeAddresses( const uno::Sequence<table::CellRangeAddress >& rRangeSeq )
4373*cdf0e10cSrcweir                                 throw(::com::sun::star::container::NoSuchElementException,
4374*cdf0e10cSrcweir                                     ::com::sun::star::uno::RuntimeException)
4375*cdf0e10cSrcweir {
4376*cdf0e10cSrcweir     // with this implementation not needed
4377*cdf0e10cSrcweir //  ScUnoGuard aGuard;
4378*cdf0e10cSrcweir 
4379*cdf0e10cSrcweir 
4380*cdf0e10cSrcweir     // use sometimes a better/faster implementation
4381*cdf0e10cSrcweir     sal_uInt32 nCount(rRangeSeq.getLength());
4382*cdf0e10cSrcweir     if (nCount)
4383*cdf0e10cSrcweir     {
4384*cdf0e10cSrcweir         const table::CellRangeAddress* pRanges = rRangeSeq.getConstArray();
4385*cdf0e10cSrcweir         for (sal_uInt32 i=0; i < nCount; ++i, ++pRanges)
4386*cdf0e10cSrcweir         {
4387*cdf0e10cSrcweir             removeRangeAddress(*pRanges);
4388*cdf0e10cSrcweir         }
4389*cdf0e10cSrcweir     }
4390*cdf0e10cSrcweir }
4391*cdf0e10cSrcweir 
4392*cdf0e10cSrcweir // XNameContainer
4393*cdf0e10cSrcweir 
4394*cdf0e10cSrcweir void lcl_RemoveNamedEntry( ScNamedEntryArr_Impl& rNamedEntries, const String& rName )
4395*cdf0e10cSrcweir {
4396*cdf0e10cSrcweir     sal_uInt16 nCount = rNamedEntries.Count();
4397*cdf0e10cSrcweir     for ( sal_uInt16 n=nCount; n--; )
4398*cdf0e10cSrcweir         if ( rNamedEntries[n]->GetName() == rName )
4399*cdf0e10cSrcweir             rNamedEntries.DeleteAndDestroy( n );
4400*cdf0e10cSrcweir }
4401*cdf0e10cSrcweir 
4402*cdf0e10cSrcweir void SAL_CALL ScCellRangesObj::insertByName( const rtl::OUString& aName, const uno::Any& aElement )
4403*cdf0e10cSrcweir                             throw(lang::IllegalArgumentException, container::ElementExistException,
4404*cdf0e10cSrcweir                                     lang::WrappedTargetException, uno::RuntimeException)
4405*cdf0e10cSrcweir {
4406*cdf0e10cSrcweir     ScUnoGuard aGuard;
4407*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4408*cdf0e10cSrcweir     sal_Bool bDone = sal_False;
4409*cdf0e10cSrcweir 
4410*cdf0e10cSrcweir     //! Type of aElement can be some specific interface instead of XInterface
4411*cdf0e10cSrcweir 
4412*cdf0e10cSrcweir     uno::Reference<uno::XInterface> xInterface(aElement, uno::UNO_QUERY);
4413*cdf0e10cSrcweir     if ( pDocSh && xInterface.is() )
4414*cdf0e10cSrcweir     {
4415*cdf0e10cSrcweir         ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xInterface );
4416*cdf0e10cSrcweir         if ( pRangesImp && pRangesImp->GetDocShell() == pDocSh )
4417*cdf0e10cSrcweir         {
4418*cdf0e10cSrcweir             //  if explicit name is given and already existing, throw exception
4419*cdf0e10cSrcweir 
4420*cdf0e10cSrcweir             String aNamStr(aName);
4421*cdf0e10cSrcweir             if ( aNamStr.Len() )
4422*cdf0e10cSrcweir             {
4423*cdf0e10cSrcweir                 sal_uInt16 nNamedCount = aNamedEntries.Count();
4424*cdf0e10cSrcweir                 for (sal_uInt16 n=0; n<nNamedCount; n++)
4425*cdf0e10cSrcweir                     if ( aNamedEntries[n]->GetName() == aNamStr )
4426*cdf0e10cSrcweir                         throw container::ElementExistException();
4427*cdf0e10cSrcweir             }
4428*cdf0e10cSrcweir 
4429*cdf0e10cSrcweir             ScRangeList aNew(GetRangeList());
4430*cdf0e10cSrcweir             const ScRangeList& rAddRanges = pRangesImp->GetRangeList();
4431*cdf0e10cSrcweir             sal_uLong nAddCount = rAddRanges.Count();
4432*cdf0e10cSrcweir             for (sal_uLong i=0; i<nAddCount; i++)
4433*cdf0e10cSrcweir                 aNew.Join( *rAddRanges.GetObject(i) );
4434*cdf0e10cSrcweir             SetNewRanges(aNew);
4435*cdf0e10cSrcweir             bDone = sal_True;
4436*cdf0e10cSrcweir 
4437*cdf0e10cSrcweir             if ( aName.getLength() && nAddCount == 1 )
4438*cdf0e10cSrcweir             {
4439*cdf0e10cSrcweir                 //  if a name is given, also insert into list of named entries
4440*cdf0e10cSrcweir                 //  (only possible for a single range)
4441*cdf0e10cSrcweir                 //  name is not in aNamedEntries (tested above)
4442*cdf0e10cSrcweir 
4443*cdf0e10cSrcweir                 ScNamedEntry* pEntry = new ScNamedEntry( aNamStr, *rAddRanges.GetObject(0) );
4444*cdf0e10cSrcweir                 aNamedEntries.Insert( pEntry, aNamedEntries.Count() );
4445*cdf0e10cSrcweir             }
4446*cdf0e10cSrcweir         }
4447*cdf0e10cSrcweir     }
4448*cdf0e10cSrcweir 
4449*cdf0e10cSrcweir     if (!bDone)
4450*cdf0e10cSrcweir     {
4451*cdf0e10cSrcweir         //  invalid element - double names are handled above
4452*cdf0e10cSrcweir         throw lang::IllegalArgumentException();
4453*cdf0e10cSrcweir     }
4454*cdf0e10cSrcweir }
4455*cdf0e10cSrcweir 
4456*cdf0e10cSrcweir sal_Bool lcl_FindRangeByName( const ScRangeList& rRanges, ScDocShell* pDocSh,
4457*cdf0e10cSrcweir                             const String& rName, sal_uLong& rIndex )
4458*cdf0e10cSrcweir {
4459*cdf0e10cSrcweir     if (pDocSh)
4460*cdf0e10cSrcweir     {
4461*cdf0e10cSrcweir         String aRangeStr;
4462*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
4463*cdf0e10cSrcweir         sal_uLong nCount = rRanges.Count();
4464*cdf0e10cSrcweir         for (sal_uLong i=0; i<nCount; i++)
4465*cdf0e10cSrcweir         {
4466*cdf0e10cSrcweir             rRanges.GetObject(i)->Format( aRangeStr, SCA_VALID | SCA_TAB_3D, pDoc );
4467*cdf0e10cSrcweir             if ( aRangeStr == rName )
4468*cdf0e10cSrcweir             {
4469*cdf0e10cSrcweir                 rIndex = i;
4470*cdf0e10cSrcweir                 return sal_True;
4471*cdf0e10cSrcweir             }
4472*cdf0e10cSrcweir         }
4473*cdf0e10cSrcweir     }
4474*cdf0e10cSrcweir     return sal_False;   // nicht gefunden
4475*cdf0e10cSrcweir }
4476*cdf0e10cSrcweir 
4477*cdf0e10cSrcweir sal_Bool lcl_FindRangeOrEntry( const ScNamedEntryArr_Impl& rNamedEntries,
4478*cdf0e10cSrcweir                             const ScRangeList& rRanges, ScDocShell* pDocSh,
4479*cdf0e10cSrcweir                             const String& rName, ScRange& rFound )
4480*cdf0e10cSrcweir {
4481*cdf0e10cSrcweir     //  exact range in list?
4482*cdf0e10cSrcweir 
4483*cdf0e10cSrcweir     sal_uLong nIndex = 0;
4484*cdf0e10cSrcweir     if ( lcl_FindRangeByName( rRanges, pDocSh, rName, nIndex ) )
4485*cdf0e10cSrcweir     {
4486*cdf0e10cSrcweir         rFound = *rRanges.GetObject(nIndex);
4487*cdf0e10cSrcweir         return sal_True;
4488*cdf0e10cSrcweir     }
4489*cdf0e10cSrcweir 
4490*cdf0e10cSrcweir     //  range contained in selection? (sheet must be specified)
4491*cdf0e10cSrcweir 
4492*cdf0e10cSrcweir     ScRange aCellRange;
4493*cdf0e10cSrcweir     sal_uInt16 nParse = aCellRange.ParseAny( rName, pDocSh->GetDocument() );
4494*cdf0e10cSrcweir     if ( ( nParse & ( SCA_VALID | SCA_TAB_3D ) ) == ( SCA_VALID | SCA_TAB_3D ) )
4495*cdf0e10cSrcweir     {
4496*cdf0e10cSrcweir         ScMarkData aMarkData;
4497*cdf0e10cSrcweir         aMarkData.MarkFromRangeList( rRanges, sal_False );
4498*cdf0e10cSrcweir         aMarkData.MarkToMulti();        // needed for IsAllMarked
4499*cdf0e10cSrcweir         if ( aMarkData.IsAllMarked( aCellRange ) )
4500*cdf0e10cSrcweir         {
4501*cdf0e10cSrcweir             rFound = aCellRange;
4502*cdf0e10cSrcweir             return sal_True;
4503*cdf0e10cSrcweir         }
4504*cdf0e10cSrcweir     }
4505*cdf0e10cSrcweir 
4506*cdf0e10cSrcweir     //  named entry in this object?
4507*cdf0e10cSrcweir 
4508*cdf0e10cSrcweir     if ( rNamedEntries.Count() )
4509*cdf0e10cSrcweir     {
4510*cdf0e10cSrcweir         for ( sal_uInt16 n=0; n<rNamedEntries.Count(); n++ )
4511*cdf0e10cSrcweir             if ( rNamedEntries[n]->GetName() == rName )
4512*cdf0e10cSrcweir             {
4513*cdf0e10cSrcweir                 //  test if named entry is contained in rRanges
4514*cdf0e10cSrcweir 
4515*cdf0e10cSrcweir                 const ScRange& rComp = rNamedEntries[n]->GetRange();
4516*cdf0e10cSrcweir                 ScMarkData aMarkData;
4517*cdf0e10cSrcweir                 aMarkData.MarkFromRangeList( rRanges, sal_False );
4518*cdf0e10cSrcweir                 aMarkData.MarkToMulti();        // needed for IsAllMarked
4519*cdf0e10cSrcweir                 if ( aMarkData.IsAllMarked( rComp ) )
4520*cdf0e10cSrcweir                 {
4521*cdf0e10cSrcweir                     rFound = rComp;
4522*cdf0e10cSrcweir                     return sal_True;
4523*cdf0e10cSrcweir                 }
4524*cdf0e10cSrcweir             }
4525*cdf0e10cSrcweir     }
4526*cdf0e10cSrcweir 
4527*cdf0e10cSrcweir     return sal_False;       // not found
4528*cdf0e10cSrcweir }
4529*cdf0e10cSrcweir 
4530*cdf0e10cSrcweir void SAL_CALL ScCellRangesObj::removeByName( const rtl::OUString& aName )
4531*cdf0e10cSrcweir                                 throw(container::NoSuchElementException,
4532*cdf0e10cSrcweir                                     lang::WrappedTargetException, uno::RuntimeException)
4533*cdf0e10cSrcweir {
4534*cdf0e10cSrcweir     ScUnoGuard aGuard;
4535*cdf0e10cSrcweir     sal_Bool bDone = sal_False;
4536*cdf0e10cSrcweir     String aNameStr(aName);
4537*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4538*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4539*cdf0e10cSrcweir     sal_uLong nIndex = 0;
4540*cdf0e10cSrcweir     if ( lcl_FindRangeByName( rRanges, pDocSh, aNameStr, nIndex ) )
4541*cdf0e10cSrcweir     {
4542*cdf0e10cSrcweir         //  einzelnen Range weglassen
4543*cdf0e10cSrcweir         ScRangeList aNew;
4544*cdf0e10cSrcweir         sal_uLong nCount = rRanges.Count();
4545*cdf0e10cSrcweir         for (sal_uLong i=0; i<nCount; i++)
4546*cdf0e10cSrcweir             if (i != nIndex)
4547*cdf0e10cSrcweir                 aNew.Append( *rRanges.GetObject(i) );
4548*cdf0e10cSrcweir         SetNewRanges(aNew);
4549*cdf0e10cSrcweir         bDone = sal_True;
4550*cdf0e10cSrcweir     }
4551*cdf0e10cSrcweir     else if (pDocSh)
4552*cdf0e10cSrcweir     {
4553*cdf0e10cSrcweir         //  deselect any ranges (parsed or named entry)
4554*cdf0e10cSrcweir         ScRangeList aDiff;
4555*cdf0e10cSrcweir         sal_Bool bValid = ( aDiff.Parse( aNameStr, pDocSh->GetDocument() ) & SCA_VALID ) != 0;
4556*cdf0e10cSrcweir         if ( !bValid && aNamedEntries.Count() )
4557*cdf0e10cSrcweir         {
4558*cdf0e10cSrcweir             sal_uInt16 nCount = aNamedEntries.Count();
4559*cdf0e10cSrcweir             for (sal_uInt16 n=0; n<nCount && !bValid; n++)
4560*cdf0e10cSrcweir                 if (aNamedEntries[n]->GetName() == aNameStr)
4561*cdf0e10cSrcweir                 {
4562*cdf0e10cSrcweir                     aDiff.RemoveAll();
4563*cdf0e10cSrcweir                     aDiff.Append( aNamedEntries[n]->GetRange() );
4564*cdf0e10cSrcweir                     bValid = sal_True;
4565*cdf0e10cSrcweir                 }
4566*cdf0e10cSrcweir         }
4567*cdf0e10cSrcweir         if ( bValid )
4568*cdf0e10cSrcweir         {
4569*cdf0e10cSrcweir             ScMarkData aMarkData;
4570*cdf0e10cSrcweir             aMarkData.MarkFromRangeList( rRanges, sal_False );
4571*cdf0e10cSrcweir 
4572*cdf0e10cSrcweir             sal_uLong nDiffCount = aDiff.Count();
4573*cdf0e10cSrcweir             for (sal_uLong i=0; i<nDiffCount; i++)
4574*cdf0e10cSrcweir             {
4575*cdf0e10cSrcweir                 ScRange* pDiffRange = aDiff.GetObject(i);
4576*cdf0e10cSrcweir                 if (aMarkData.GetTableSelect( pDiffRange->aStart.Tab() ))
4577*cdf0e10cSrcweir                     aMarkData.SetMultiMarkArea( *pDiffRange, sal_False );
4578*cdf0e10cSrcweir             }
4579*cdf0e10cSrcweir 
4580*cdf0e10cSrcweir             ScRangeList aNew;
4581*cdf0e10cSrcweir             aMarkData.FillRangeListWithMarks( &aNew, sal_False );
4582*cdf0e10cSrcweir             SetNewRanges(aNew);
4583*cdf0e10cSrcweir 
4584*cdf0e10cSrcweir             bDone = sal_True;       //! error if range was not selected before?
4585*cdf0e10cSrcweir         }
4586*cdf0e10cSrcweir     }
4587*cdf0e10cSrcweir 
4588*cdf0e10cSrcweir     if (aNamedEntries.Count())
4589*cdf0e10cSrcweir         lcl_RemoveNamedEntry( aNamedEntries, aNameStr );    //  remove named entry
4590*cdf0e10cSrcweir 
4591*cdf0e10cSrcweir     if (!bDone)
4592*cdf0e10cSrcweir         throw container::NoSuchElementException();      // not found
4593*cdf0e10cSrcweir }
4594*cdf0e10cSrcweir 
4595*cdf0e10cSrcweir // XNameReplace
4596*cdf0e10cSrcweir 
4597*cdf0e10cSrcweir void SAL_CALL ScCellRangesObj::replaceByName( const rtl::OUString& aName, const uno::Any& aElement )
4598*cdf0e10cSrcweir                             throw(lang::IllegalArgumentException, container::NoSuchElementException,
4599*cdf0e10cSrcweir                                     lang::WrappedTargetException, uno::RuntimeException)
4600*cdf0e10cSrcweir {
4601*cdf0e10cSrcweir     ScUnoGuard aGuard;
4602*cdf0e10cSrcweir     //! zusammenfassen?
4603*cdf0e10cSrcweir     removeByName( aName );
4604*cdf0e10cSrcweir     insertByName( aName, aElement );
4605*cdf0e10cSrcweir }
4606*cdf0e10cSrcweir 
4607*cdf0e10cSrcweir // XNameAccess
4608*cdf0e10cSrcweir 
4609*cdf0e10cSrcweir uno::Any SAL_CALL ScCellRangesObj::getByName( const rtl::OUString& aName )
4610*cdf0e10cSrcweir             throw(container::NoSuchElementException,
4611*cdf0e10cSrcweir                     lang::WrappedTargetException, uno::RuntimeException)
4612*cdf0e10cSrcweir {
4613*cdf0e10cSrcweir     ScUnoGuard aGuard;
4614*cdf0e10cSrcweir     uno::Any aRet;
4615*cdf0e10cSrcweir 
4616*cdf0e10cSrcweir     String aNameStr(aName);
4617*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4618*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4619*cdf0e10cSrcweir     ScRange aRange;
4620*cdf0e10cSrcweir     if ( lcl_FindRangeOrEntry( aNamedEntries, rRanges, pDocSh, aNameStr, aRange ) )
4621*cdf0e10cSrcweir     {
4622*cdf0e10cSrcweir         uno::Reference<table::XCellRange> xRange;
4623*cdf0e10cSrcweir         if ( aRange.aStart == aRange.aEnd )
4624*cdf0e10cSrcweir             xRange.set(new ScCellObj( pDocSh, aRange.aStart ));
4625*cdf0e10cSrcweir         else
4626*cdf0e10cSrcweir             xRange.set(new ScCellRangeObj( pDocSh, aRange ));
4627*cdf0e10cSrcweir         aRet <<= xRange;
4628*cdf0e10cSrcweir     }
4629*cdf0e10cSrcweir     else
4630*cdf0e10cSrcweir         throw container::NoSuchElementException();
4631*cdf0e10cSrcweir     return aRet;
4632*cdf0e10cSrcweir }
4633*cdf0e10cSrcweir 
4634*cdf0e10cSrcweir sal_Bool lcl_FindEntryName( const ScNamedEntryArr_Impl& rNamedEntries,
4635*cdf0e10cSrcweir                         const ScRange& rRange, String& rName )
4636*cdf0e10cSrcweir {
4637*cdf0e10cSrcweir     sal_uInt16 nCount = rNamedEntries.Count();
4638*cdf0e10cSrcweir     for (sal_uInt16 i=0; i<nCount; i++)
4639*cdf0e10cSrcweir         if (rNamedEntries[i]->GetRange() == rRange)
4640*cdf0e10cSrcweir         {
4641*cdf0e10cSrcweir             rName = rNamedEntries[i]->GetName();
4642*cdf0e10cSrcweir             return sal_True;
4643*cdf0e10cSrcweir         }
4644*cdf0e10cSrcweir     return sal_False;
4645*cdf0e10cSrcweir }
4646*cdf0e10cSrcweir 
4647*cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesObj::getElementNames()
4648*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
4649*cdf0e10cSrcweir {
4650*cdf0e10cSrcweir     ScUnoGuard aGuard;
4651*cdf0e10cSrcweir 
4652*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4653*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4654*cdf0e10cSrcweir     if (pDocSh)
4655*cdf0e10cSrcweir     {
4656*cdf0e10cSrcweir         String aRangeStr;
4657*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
4658*cdf0e10cSrcweir         sal_uLong nCount = rRanges.Count();
4659*cdf0e10cSrcweir 
4660*cdf0e10cSrcweir         uno::Sequence<rtl::OUString> aSeq(nCount);
4661*cdf0e10cSrcweir         rtl::OUString* pAry = aSeq.getArray();
4662*cdf0e10cSrcweir         for (sal_uLong i=0; i<nCount; i++)
4663*cdf0e10cSrcweir         {
4664*cdf0e10cSrcweir             //  use given name if for exactly this range, otherwise just format
4665*cdf0e10cSrcweir             ScRange aRange = *rRanges.GetObject(i);
4666*cdf0e10cSrcweir             if ( !aNamedEntries.Count() || !lcl_FindEntryName( aNamedEntries, aRange, aRangeStr ) )
4667*cdf0e10cSrcweir                 aRange.Format( aRangeStr, SCA_VALID | SCA_TAB_3D, pDoc );
4668*cdf0e10cSrcweir             pAry[i] = aRangeStr;
4669*cdf0e10cSrcweir         }
4670*cdf0e10cSrcweir         return aSeq;
4671*cdf0e10cSrcweir     }
4672*cdf0e10cSrcweir     return uno::Sequence<rtl::OUString>(0);
4673*cdf0e10cSrcweir }
4674*cdf0e10cSrcweir 
4675*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellRangesObj::hasByName( const rtl::OUString& aName )
4676*cdf0e10cSrcweir                                         throw(uno::RuntimeException)
4677*cdf0e10cSrcweir {
4678*cdf0e10cSrcweir     ScUnoGuard aGuard;
4679*cdf0e10cSrcweir     String aNameStr(aName);
4680*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4681*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4682*cdf0e10cSrcweir     ScRange aRange;
4683*cdf0e10cSrcweir     return lcl_FindRangeOrEntry( aNamedEntries, rRanges, pDocSh, aNameStr, aRange );
4684*cdf0e10cSrcweir }
4685*cdf0e10cSrcweir 
4686*cdf0e10cSrcweir // XEnumerationAccess
4687*cdf0e10cSrcweir 
4688*cdf0e10cSrcweir uno::Reference<container::XEnumeration> SAL_CALL ScCellRangesObj::createEnumeration()
4689*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
4690*cdf0e10cSrcweir {
4691*cdf0e10cSrcweir     ScUnoGuard aGuard;
4692*cdf0e10cSrcweir     return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SheetCellRangesEnumeration")));
4693*cdf0e10cSrcweir }
4694*cdf0e10cSrcweir 
4695*cdf0e10cSrcweir // XIndexAccess
4696*cdf0e10cSrcweir 
4697*cdf0e10cSrcweir sal_Int32 SAL_CALL ScCellRangesObj::getCount() throw(uno::RuntimeException)
4698*cdf0e10cSrcweir {
4699*cdf0e10cSrcweir     ScUnoGuard aGuard;
4700*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4701*cdf0e10cSrcweir     return rRanges.Count();
4702*cdf0e10cSrcweir }
4703*cdf0e10cSrcweir 
4704*cdf0e10cSrcweir uno::Any SAL_CALL ScCellRangesObj::getByIndex( sal_Int32 nIndex )
4705*cdf0e10cSrcweir                             throw(lang::IndexOutOfBoundsException,
4706*cdf0e10cSrcweir                                     lang::WrappedTargetException, uno::RuntimeException)
4707*cdf0e10cSrcweir {
4708*cdf0e10cSrcweir     ScUnoGuard aGuard;
4709*cdf0e10cSrcweir     uno::Reference<table::XCellRange> xRange(GetObjectByIndex_Impl(nIndex));
4710*cdf0e10cSrcweir     if (xRange.is())
4711*cdf0e10cSrcweir         return uno::makeAny(xRange);
4712*cdf0e10cSrcweir     else
4713*cdf0e10cSrcweir         throw lang::IndexOutOfBoundsException();
4714*cdf0e10cSrcweir //    return uno::Any();
4715*cdf0e10cSrcweir }
4716*cdf0e10cSrcweir 
4717*cdf0e10cSrcweir uno::Type SAL_CALL ScCellRangesObj::getElementType() throw(uno::RuntimeException)
4718*cdf0e10cSrcweir {
4719*cdf0e10cSrcweir     ScUnoGuard aGuard;
4720*cdf0e10cSrcweir     return getCppuType((uno::Reference<table::XCellRange>*)0);
4721*cdf0e10cSrcweir }
4722*cdf0e10cSrcweir 
4723*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellRangesObj::hasElements() throw(uno::RuntimeException)
4724*cdf0e10cSrcweir {
4725*cdf0e10cSrcweir     ScUnoGuard aGuard;
4726*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4727*cdf0e10cSrcweir     return rRanges.Count() != 0;
4728*cdf0e10cSrcweir }
4729*cdf0e10cSrcweir 
4730*cdf0e10cSrcweir // XServiceInfo
4731*cdf0e10cSrcweir 
4732*cdf0e10cSrcweir rtl::OUString SAL_CALL ScCellRangesObj::getImplementationName() throw(uno::RuntimeException)
4733*cdf0e10cSrcweir {
4734*cdf0e10cSrcweir     return rtl::OUString::createFromAscii( "ScCellRangesObj" );
4735*cdf0e10cSrcweir }
4736*cdf0e10cSrcweir 
4737*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellRangesObj::supportsService( const rtl::OUString& rServiceName )
4738*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
4739*cdf0e10cSrcweir {
4740*cdf0e10cSrcweir     String aServiceStr(rServiceName);
4741*cdf0e10cSrcweir     return aServiceStr.EqualsAscii( SCSHEETCELLRANGES_SERVICE ) ||
4742*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) ||
4743*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) ||
4744*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE );
4745*cdf0e10cSrcweir }
4746*cdf0e10cSrcweir 
4747*cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesObj::getSupportedServiceNames()
4748*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
4749*cdf0e10cSrcweir {
4750*cdf0e10cSrcweir     uno::Sequence<rtl::OUString> aRet(4);
4751*cdf0e10cSrcweir     rtl::OUString* pArray = aRet.getArray();
4752*cdf0e10cSrcweir     pArray[0] = rtl::OUString::createFromAscii( SCSHEETCELLRANGES_SERVICE );
4753*cdf0e10cSrcweir     pArray[1] = rtl::OUString::createFromAscii( SCCELLPROPERTIES_SERVICE );
4754*cdf0e10cSrcweir     pArray[2] = rtl::OUString::createFromAscii( SCCHARPROPERTIES_SERVICE );
4755*cdf0e10cSrcweir     pArray[3] = rtl::OUString::createFromAscii( SCPARAPROPERTIES_SERVICE );
4756*cdf0e10cSrcweir     return aRet;
4757*cdf0e10cSrcweir }
4758*cdf0e10cSrcweir 
4759*cdf0e10cSrcweir //------------------------------------------------------------------------
4760*cdf0e10cSrcweir 
4761*cdf0e10cSrcweir // static
4762*cdf0e10cSrcweir uno::Reference<table::XCellRange> ScCellRangeObj::CreateRangeFromDoc( ScDocument* pDoc, const ScRange& rR )
4763*cdf0e10cSrcweir {
4764*cdf0e10cSrcweir     SfxObjectShell* pObjSh = pDoc->GetDocumentShell();
4765*cdf0e10cSrcweir     if ( pObjSh && pObjSh->ISA(ScDocShell) )
4766*cdf0e10cSrcweir         return new ScCellRangeObj( (ScDocShell*) pObjSh, rR );
4767*cdf0e10cSrcweir     return NULL;
4768*cdf0e10cSrcweir }
4769*cdf0e10cSrcweir 
4770*cdf0e10cSrcweir //------------------------------------------------------------------------
4771*cdf0e10cSrcweir 
4772*cdf0e10cSrcweir ScCellRangeObj::ScCellRangeObj(ScDocShell* pDocSh, const ScRange& rR) :
4773*cdf0e10cSrcweir     ScCellRangesBase( pDocSh, rR ),
4774*cdf0e10cSrcweir     pRangePropSet( lcl_GetRangePropertySet() ),
4775*cdf0e10cSrcweir     aRange( rR )
4776*cdf0e10cSrcweir {
4777*cdf0e10cSrcweir     aRange.Justify();       // Anfang / Ende richtig
4778*cdf0e10cSrcweir }
4779*cdf0e10cSrcweir 
4780*cdf0e10cSrcweir ScCellRangeObj::~ScCellRangeObj()
4781*cdf0e10cSrcweir {
4782*cdf0e10cSrcweir }
4783*cdf0e10cSrcweir 
4784*cdf0e10cSrcweir void ScCellRangeObj::RefChanged()
4785*cdf0e10cSrcweir {
4786*cdf0e10cSrcweir     ScCellRangesBase::RefChanged();
4787*cdf0e10cSrcweir 
4788*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
4789*cdf0e10cSrcweir     DBG_ASSERT(rRanges.Count() == 1, "was fuer Ranges ?!?!");
4790*cdf0e10cSrcweir     const ScRange* pFirst = rRanges.GetObject(0);
4791*cdf0e10cSrcweir     if (pFirst)
4792*cdf0e10cSrcweir     {
4793*cdf0e10cSrcweir         aRange = *pFirst;
4794*cdf0e10cSrcweir         aRange.Justify();
4795*cdf0e10cSrcweir     }
4796*cdf0e10cSrcweir }
4797*cdf0e10cSrcweir 
4798*cdf0e10cSrcweir uno::Any SAL_CALL ScCellRangeObj::queryInterface( const uno::Type& rType )
4799*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
4800*cdf0e10cSrcweir {
4801*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XCellRangeAddressable )
4802*cdf0e10cSrcweir     SC_QUERYINTERFACE( table::XCellRange )
4803*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetCellRange )
4804*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XArrayFormulaRange )
4805*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XArrayFormulaTokens )
4806*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XCellRangeData )
4807*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XCellRangeFormula )
4808*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XMultipleOperation )
4809*cdf0e10cSrcweir     SC_QUERYINTERFACE( util::XMergeable )
4810*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XCellSeries )
4811*cdf0e10cSrcweir     SC_QUERYINTERFACE( table::XAutoFormattable )
4812*cdf0e10cSrcweir     SC_QUERYINTERFACE( util::XSortable )
4813*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetFilterableEx )
4814*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetFilterable )
4815*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSubTotalCalculatable )
4816*cdf0e10cSrcweir     SC_QUERYINTERFACE( table::XColumnRowRange )
4817*cdf0e10cSrcweir     SC_QUERYINTERFACE( util::XImportable )
4818*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XCellFormatRangesSupplier )
4819*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XUniqueCellFormatRangesSupplier )
4820*cdf0e10cSrcweir 
4821*cdf0e10cSrcweir     return ScCellRangesBase::queryInterface( rType );
4822*cdf0e10cSrcweir }
4823*cdf0e10cSrcweir 
4824*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::acquire() throw()
4825*cdf0e10cSrcweir {
4826*cdf0e10cSrcweir     ScCellRangesBase::acquire();
4827*cdf0e10cSrcweir }
4828*cdf0e10cSrcweir 
4829*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::release() throw()
4830*cdf0e10cSrcweir {
4831*cdf0e10cSrcweir     ScCellRangesBase::release();
4832*cdf0e10cSrcweir }
4833*cdf0e10cSrcweir 
4834*cdf0e10cSrcweir uno::Sequence<uno::Type> SAL_CALL ScCellRangeObj::getTypes() throw(uno::RuntimeException)
4835*cdf0e10cSrcweir {
4836*cdf0e10cSrcweir     static uno::Sequence<uno::Type> aTypes;
4837*cdf0e10cSrcweir     if ( aTypes.getLength() == 0 )
4838*cdf0e10cSrcweir     {
4839*cdf0e10cSrcweir         uno::Sequence<uno::Type> aParentTypes(ScCellRangesBase::getTypes());
4840*cdf0e10cSrcweir         long nParentLen = aParentTypes.getLength();
4841*cdf0e10cSrcweir         const uno::Type* pParentPtr = aParentTypes.getConstArray();
4842*cdf0e10cSrcweir 
4843*cdf0e10cSrcweir         aTypes.realloc( nParentLen + 17 );
4844*cdf0e10cSrcweir         uno::Type* pPtr = aTypes.getArray();
4845*cdf0e10cSrcweir         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XCellRangeAddressable>*)0);
4846*cdf0e10cSrcweir         pPtr[nParentLen + 1] = getCppuType((const uno::Reference<sheet::XSheetCellRange>*)0);
4847*cdf0e10cSrcweir         pPtr[nParentLen + 2] = getCppuType((const uno::Reference<sheet::XArrayFormulaRange>*)0);
4848*cdf0e10cSrcweir         pPtr[nParentLen + 3] = getCppuType((const uno::Reference<sheet::XArrayFormulaTokens>*)0);
4849*cdf0e10cSrcweir         pPtr[nParentLen + 4] = getCppuType((const uno::Reference<sheet::XCellRangeData>*)0);
4850*cdf0e10cSrcweir         pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XCellRangeFormula>*)0);
4851*cdf0e10cSrcweir         pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XMultipleOperation>*)0);
4852*cdf0e10cSrcweir         pPtr[nParentLen + 7] = getCppuType((const uno::Reference<util::XMergeable>*)0);
4853*cdf0e10cSrcweir         pPtr[nParentLen + 8] = getCppuType((const uno::Reference<sheet::XCellSeries>*)0);
4854*cdf0e10cSrcweir         pPtr[nParentLen + 9] = getCppuType((const uno::Reference<table::XAutoFormattable>*)0);
4855*cdf0e10cSrcweir         pPtr[nParentLen +10] = getCppuType((const uno::Reference<util::XSortable>*)0);
4856*cdf0e10cSrcweir         pPtr[nParentLen +11] = getCppuType((const uno::Reference<sheet::XSheetFilterableEx>*)0);
4857*cdf0e10cSrcweir         pPtr[nParentLen +12] = getCppuType((const uno::Reference<sheet::XSubTotalCalculatable>*)0);
4858*cdf0e10cSrcweir         pPtr[nParentLen +13] = getCppuType((const uno::Reference<table::XColumnRowRange>*)0);
4859*cdf0e10cSrcweir         pPtr[nParentLen +14] = getCppuType((const uno::Reference<util::XImportable>*)0);
4860*cdf0e10cSrcweir         pPtr[nParentLen +15] = getCppuType((const uno::Reference<sheet::XCellFormatRangesSupplier>*)0);
4861*cdf0e10cSrcweir         pPtr[nParentLen +16] = getCppuType((const uno::Reference<sheet::XUniqueCellFormatRangesSupplier>*)0);
4862*cdf0e10cSrcweir 
4863*cdf0e10cSrcweir         for (long i=0; i<nParentLen; i++)
4864*cdf0e10cSrcweir             pPtr[i] = pParentPtr[i];                // parent types first
4865*cdf0e10cSrcweir     }
4866*cdf0e10cSrcweir     return aTypes;
4867*cdf0e10cSrcweir }
4868*cdf0e10cSrcweir 
4869*cdf0e10cSrcweir uno::Sequence<sal_Int8> SAL_CALL ScCellRangeObj::getImplementationId()
4870*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
4871*cdf0e10cSrcweir {
4872*cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId;
4873*cdf0e10cSrcweir     if( aId.getLength() == 0 )
4874*cdf0e10cSrcweir     {
4875*cdf0e10cSrcweir         aId.realloc( 16 );
4876*cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
4877*cdf0e10cSrcweir     }
4878*cdf0e10cSrcweir     return aId;
4879*cdf0e10cSrcweir }
4880*cdf0e10cSrcweir 
4881*cdf0e10cSrcweir // XCellRange
4882*cdf0e10cSrcweir 
4883*cdf0e10cSrcweir //  ColumnCount / RowCount sind weggefallen
4884*cdf0e10cSrcweir //! werden im Writer fuer Tabellen noch gebraucht ???
4885*cdf0e10cSrcweir 
4886*cdf0e10cSrcweir uno::Reference<table::XCell> ScCellRangeObj::GetCellByPosition_Impl(
4887*cdf0e10cSrcweir                                         sal_Int32 nColumn, sal_Int32 nRow )
4888*cdf0e10cSrcweir                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
4889*cdf0e10cSrcweir {
4890*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4891*cdf0e10cSrcweir     if (!pDocSh)
4892*cdf0e10cSrcweir         throw uno::RuntimeException();
4893*cdf0e10cSrcweir 
4894*cdf0e10cSrcweir     if ( nColumn >= 0 && nRow >= 0 )
4895*cdf0e10cSrcweir     {
4896*cdf0e10cSrcweir         sal_Int32 nPosX = aRange.aStart.Col() + nColumn;
4897*cdf0e10cSrcweir         sal_Int32 nPosY = aRange.aStart.Row() + nRow;
4898*cdf0e10cSrcweir 
4899*cdf0e10cSrcweir         if ( nPosX <= aRange.aEnd.Col() && nPosY <= aRange.aEnd.Row() )
4900*cdf0e10cSrcweir         {
4901*cdf0e10cSrcweir             ScAddress aNew( (SCCOL)nPosX, (SCROW)nPosY, aRange.aStart.Tab() );
4902*cdf0e10cSrcweir             return new ScCellObj( pDocSh, aNew );
4903*cdf0e10cSrcweir         }
4904*cdf0e10cSrcweir     }
4905*cdf0e10cSrcweir 
4906*cdf0e10cSrcweir     throw lang::IndexOutOfBoundsException();
4907*cdf0e10cSrcweir //    return NULL;
4908*cdf0e10cSrcweir }
4909*cdf0e10cSrcweir 
4910*cdf0e10cSrcweir uno::Reference<table::XCell> SAL_CALL ScCellRangeObj::getCellByPosition(
4911*cdf0e10cSrcweir                                         sal_Int32 nColumn, sal_Int32 nRow )
4912*cdf0e10cSrcweir                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
4913*cdf0e10cSrcweir {
4914*cdf0e10cSrcweir     ScUnoGuard aGuard;
4915*cdf0e10cSrcweir 
4916*cdf0e10cSrcweir     return GetCellByPosition_Impl(nColumn, nRow);
4917*cdf0e10cSrcweir }
4918*cdf0e10cSrcweir 
4919*cdf0e10cSrcweir uno::Reference<table::XCellRange> SAL_CALL ScCellRangeObj::getCellRangeByPosition(
4920*cdf0e10cSrcweir                 sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom )
4921*cdf0e10cSrcweir                                     throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
4922*cdf0e10cSrcweir {
4923*cdf0e10cSrcweir     ScUnoGuard aGuard;
4924*cdf0e10cSrcweir 
4925*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4926*cdf0e10cSrcweir     if (!pDocSh)
4927*cdf0e10cSrcweir         throw uno::RuntimeException();
4928*cdf0e10cSrcweir 
4929*cdf0e10cSrcweir     if ( nLeft >= 0 && nTop >= 0 && nRight >= 0 && nBottom >= 0 )
4930*cdf0e10cSrcweir     {
4931*cdf0e10cSrcweir         sal_Int32 nStartX = aRange.aStart.Col() + nLeft;
4932*cdf0e10cSrcweir         sal_Int32 nStartY = aRange.aStart.Row() + nTop;
4933*cdf0e10cSrcweir         sal_Int32 nEndX = aRange.aStart.Col() + nRight;
4934*cdf0e10cSrcweir         sal_Int32 nEndY = aRange.aStart.Row() + nBottom;
4935*cdf0e10cSrcweir 
4936*cdf0e10cSrcweir         if ( nStartX <= nEndX && nEndX <= aRange.aEnd.Col() &&
4937*cdf0e10cSrcweir              nStartY <= nEndY && nEndY <= aRange.aEnd.Row() )
4938*cdf0e10cSrcweir         {
4939*cdf0e10cSrcweir             ScRange aNew( (SCCOL)nStartX, (SCROW)nStartY, aRange.aStart.Tab(),
4940*cdf0e10cSrcweir                           (SCCOL)nEndX, (SCROW)nEndY, aRange.aEnd.Tab() );
4941*cdf0e10cSrcweir             return new ScCellRangeObj( pDocSh, aNew );
4942*cdf0e10cSrcweir         }
4943*cdf0e10cSrcweir     }
4944*cdf0e10cSrcweir 
4945*cdf0e10cSrcweir     throw lang::IndexOutOfBoundsException();
4946*cdf0e10cSrcweir //    return NULL;
4947*cdf0e10cSrcweir }
4948*cdf0e10cSrcweir 
4949*cdf0e10cSrcweir 
4950*cdf0e10cSrcweir uno::Reference<table::XCellRange> SAL_CALL ScCellRangeObj::getCellRangeByName(
4951*cdf0e10cSrcweir                         const rtl::OUString& aName ) throw(uno::RuntimeException)
4952*cdf0e10cSrcweir {
4953*cdf0e10cSrcweir     return getCellRangeByName( aName, ScAddress::detailsOOOa1 );
4954*cdf0e10cSrcweir }
4955*cdf0e10cSrcweir 
4956*cdf0e10cSrcweir uno::Reference<table::XCellRange>  ScCellRangeObj::getCellRangeByName(
4957*cdf0e10cSrcweir                         const rtl::OUString& aName, const ScAddress::Details& rDetails  ) throw(uno::RuntimeException)
4958*cdf0e10cSrcweir {
4959*cdf0e10cSrcweir     //  name refers to the whole document (with the range's table as default),
4960*cdf0e10cSrcweir     //  valid only if the range is within this range
4961*cdf0e10cSrcweir 
4962*cdf0e10cSrcweir     ScUnoGuard aGuard;
4963*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
4964*cdf0e10cSrcweir     if ( pDocSh )
4965*cdf0e10cSrcweir     {
4966*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
4967*cdf0e10cSrcweir         SCTAB nTab = aRange.aStart.Tab();
4968*cdf0e10cSrcweir 
4969*cdf0e10cSrcweir         ScRange aCellRange;
4970*cdf0e10cSrcweir         sal_Bool bFound = sal_False;
4971*cdf0e10cSrcweir         String aString(aName);
4972*cdf0e10cSrcweir         sal_uInt16 nParse = aCellRange.ParseAny( aString, pDoc, rDetails );
4973*cdf0e10cSrcweir         if ( nParse & SCA_VALID )
4974*cdf0e10cSrcweir         {
4975*cdf0e10cSrcweir             if ( !(nParse & SCA_TAB_3D) )   // keine Tabelle angegeben -> auf dieser Tabelle
4976*cdf0e10cSrcweir             {
4977*cdf0e10cSrcweir                 aCellRange.aStart.SetTab(nTab);
4978*cdf0e10cSrcweir                 aCellRange.aEnd.SetTab(nTab);
4979*cdf0e10cSrcweir             }
4980*cdf0e10cSrcweir             bFound = sal_True;
4981*cdf0e10cSrcweir         }
4982*cdf0e10cSrcweir         else
4983*cdf0e10cSrcweir         {
4984*cdf0e10cSrcweir             ScRangeUtil aRangeUtil;
4985*cdf0e10cSrcweir             if ( aRangeUtil.MakeRangeFromName( aString, pDoc, nTab, aCellRange, RUTL_NAMES ) ||
4986*cdf0e10cSrcweir                  aRangeUtil.MakeRangeFromName( aString, pDoc, nTab, aCellRange, RUTL_DBASE ) )
4987*cdf0e10cSrcweir                 bFound = sal_True;
4988*cdf0e10cSrcweir         }
4989*cdf0e10cSrcweir 
4990*cdf0e10cSrcweir         if (bFound)         // valid only if within this object's range
4991*cdf0e10cSrcweir         {
4992*cdf0e10cSrcweir             if (!aRange.In(aCellRange))
4993*cdf0e10cSrcweir                 bFound = sal_False;
4994*cdf0e10cSrcweir         }
4995*cdf0e10cSrcweir 
4996*cdf0e10cSrcweir         if (bFound)
4997*cdf0e10cSrcweir         {
4998*cdf0e10cSrcweir             if ( aCellRange.aStart == aCellRange.aEnd )
4999*cdf0e10cSrcweir                 return new ScCellObj( pDocSh, aCellRange.aStart );
5000*cdf0e10cSrcweir             else
5001*cdf0e10cSrcweir                 return new ScCellRangeObj( pDocSh, aCellRange );
5002*cdf0e10cSrcweir         }
5003*cdf0e10cSrcweir     }
5004*cdf0e10cSrcweir 
5005*cdf0e10cSrcweir     throw uno::RuntimeException();
5006*cdf0e10cSrcweir //    return NULL;
5007*cdf0e10cSrcweir }
5008*cdf0e10cSrcweir 
5009*cdf0e10cSrcweir // XColumnRowRange
5010*cdf0e10cSrcweir 
5011*cdf0e10cSrcweir uno::Reference<table::XTableColumns> SAL_CALL ScCellRangeObj::getColumns() throw(uno::RuntimeException)
5012*cdf0e10cSrcweir {
5013*cdf0e10cSrcweir     ScUnoGuard aGuard;
5014*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5015*cdf0e10cSrcweir     if (pDocSh)
5016*cdf0e10cSrcweir         return new ScTableColumnsObj( pDocSh, aRange.aStart.Tab(),
5017*cdf0e10cSrcweir                                         aRange.aStart.Col(), aRange.aEnd.Col() );
5018*cdf0e10cSrcweir 
5019*cdf0e10cSrcweir     DBG_ERROR("Dokument ungueltig");
5020*cdf0e10cSrcweir     return NULL;
5021*cdf0e10cSrcweir }
5022*cdf0e10cSrcweir 
5023*cdf0e10cSrcweir uno::Reference<table::XTableRows> SAL_CALL ScCellRangeObj::getRows() throw(uno::RuntimeException)
5024*cdf0e10cSrcweir {
5025*cdf0e10cSrcweir     ScUnoGuard aGuard;
5026*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5027*cdf0e10cSrcweir     if (pDocSh)
5028*cdf0e10cSrcweir         return new ScTableRowsObj( pDocSh, aRange.aStart.Tab(),
5029*cdf0e10cSrcweir                                     aRange.aStart.Row(), aRange.aEnd.Row() );
5030*cdf0e10cSrcweir 
5031*cdf0e10cSrcweir     DBG_ERROR("Dokument ungueltig");
5032*cdf0e10cSrcweir     return NULL;
5033*cdf0e10cSrcweir }
5034*cdf0e10cSrcweir 
5035*cdf0e10cSrcweir // XAddressableCellRange
5036*cdf0e10cSrcweir 
5037*cdf0e10cSrcweir table::CellRangeAddress SAL_CALL ScCellRangeObj::getRangeAddress() throw(uno::RuntimeException)
5038*cdf0e10cSrcweir {
5039*cdf0e10cSrcweir     ScUnoGuard aGuard;
5040*cdf0e10cSrcweir     table::CellRangeAddress aRet;
5041*cdf0e10cSrcweir     ScUnoConversion::FillApiRange( aRet, aRange );
5042*cdf0e10cSrcweir     return aRet;
5043*cdf0e10cSrcweir }
5044*cdf0e10cSrcweir 
5045*cdf0e10cSrcweir // XSheetCellRange
5046*cdf0e10cSrcweir 
5047*cdf0e10cSrcweir uno::Reference<sheet::XSpreadsheet> SAL_CALL ScCellRangeObj::getSpreadsheet()
5048*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
5049*cdf0e10cSrcweir {
5050*cdf0e10cSrcweir     ScUnoGuard aGuard;
5051*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5052*cdf0e10cSrcweir     if (pDocSh)
5053*cdf0e10cSrcweir         return new ScTableSheetObj( pDocSh, aRange.aStart.Tab() );
5054*cdf0e10cSrcweir 
5055*cdf0e10cSrcweir     DBG_ERROR("Dokument ungueltig");
5056*cdf0e10cSrcweir     return NULL;
5057*cdf0e10cSrcweir }
5058*cdf0e10cSrcweir 
5059*cdf0e10cSrcweir // XArrayFormulaRange
5060*cdf0e10cSrcweir 
5061*cdf0e10cSrcweir rtl::OUString SAL_CALL ScCellRangeObj::getArrayFormula() throw(uno::RuntimeException)
5062*cdf0e10cSrcweir {
5063*cdf0e10cSrcweir     ScUnoGuard aGuard;
5064*cdf0e10cSrcweir 
5065*cdf0e10cSrcweir     //  Matrix-Formel, wenn eindeutig Teil einer Matrix,
5066*cdf0e10cSrcweir     //  also wenn Anfang und Ende des Blocks zur selben Matrix gehoeren.
5067*cdf0e10cSrcweir     //  Sonst Leerstring.
5068*cdf0e10cSrcweir 
5069*cdf0e10cSrcweir     String aFormula;
5070*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5071*cdf0e10cSrcweir     if (pDocSh)
5072*cdf0e10cSrcweir     {
5073*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
5074*cdf0e10cSrcweir         const ScBaseCell* pCell1 = pDoc->GetCell( aRange.aStart );
5075*cdf0e10cSrcweir         const ScBaseCell* pCell2 = pDoc->GetCell( aRange.aEnd );
5076*cdf0e10cSrcweir         if ( pCell1 && pCell2 && pCell1->GetCellType() == CELLTYPE_FORMULA &&
5077*cdf0e10cSrcweir                                  pCell2->GetCellType() == CELLTYPE_FORMULA )
5078*cdf0e10cSrcweir         {
5079*cdf0e10cSrcweir             const ScFormulaCell* pFCell1 = (const ScFormulaCell*)pCell1;
5080*cdf0e10cSrcweir             const ScFormulaCell* pFCell2 = (const ScFormulaCell*)pCell2;
5081*cdf0e10cSrcweir             ScAddress aStart1;
5082*cdf0e10cSrcweir             ScAddress aStart2;
5083*cdf0e10cSrcweir             if ( pFCell1->GetMatrixOrigin( aStart1 ) && pFCell2->GetMatrixOrigin( aStart2 ) )
5084*cdf0e10cSrcweir             {
5085*cdf0e10cSrcweir                 if ( aStart1 == aStart2 )               // beides dieselbe Matrix
5086*cdf0e10cSrcweir                     pFCell1->GetFormula( aFormula );    // egal, von welcher Zelle
5087*cdf0e10cSrcweir             }
5088*cdf0e10cSrcweir         }
5089*cdf0e10cSrcweir     }
5090*cdf0e10cSrcweir     return aFormula;
5091*cdf0e10cSrcweir }
5092*cdf0e10cSrcweir 
5093*cdf0e10cSrcweir void ScCellRangeObj::SetArrayFormula_Impl( const rtl::OUString& rFormula,
5094*cdf0e10cSrcweir         const rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) throw(uno::RuntimeException)
5095*cdf0e10cSrcweir {
5096*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5097*cdf0e10cSrcweir     if (pDocSh)
5098*cdf0e10cSrcweir     {
5099*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
5100*cdf0e10cSrcweir         if ( rFormula.getLength() )
5101*cdf0e10cSrcweir         {
5102*cdf0e10cSrcweir             if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) )
5103*cdf0e10cSrcweir             {
5104*cdf0e10cSrcweir                 //  #74681# don't set array formula for sheet object
5105*cdf0e10cSrcweir                 throw uno::RuntimeException();
5106*cdf0e10cSrcweir             }
5107*cdf0e10cSrcweir 
5108*cdf0e10cSrcweir             aFunc.EnterMatrix( aRange, NULL, NULL, rFormula, sal_True, sal_True, rFormulaNmsp, eGrammar );
5109*cdf0e10cSrcweir         }
5110*cdf0e10cSrcweir         else
5111*cdf0e10cSrcweir         {
5112*cdf0e10cSrcweir             //  empty string -> erase array formula
5113*cdf0e10cSrcweir             ScMarkData aMark;
5114*cdf0e10cSrcweir             aMark.SetMarkArea( aRange );
5115*cdf0e10cSrcweir             aMark.SelectTable( aRange.aStart.Tab(), sal_True );
5116*cdf0e10cSrcweir             aFunc.DeleteContents( aMark, IDF_CONTENTS, sal_True, sal_True );
5117*cdf0e10cSrcweir         }
5118*cdf0e10cSrcweir     }
5119*cdf0e10cSrcweir }
5120*cdf0e10cSrcweir 
5121*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::setArrayFormula( const rtl::OUString& aFormula )
5122*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
5123*cdf0e10cSrcweir {
5124*cdf0e10cSrcweir     ScUnoGuard aGuard;
5125*cdf0e10cSrcweir     // GRAM_PODF_A1 for API compatibility.
5126*cdf0e10cSrcweir     SetArrayFormula_Impl( aFormula, ::rtl::OUString(), formula::FormulaGrammar::GRAM_PODF_A1);
5127*cdf0e10cSrcweir }
5128*cdf0e10cSrcweir 
5129*cdf0e10cSrcweir void ScCellRangeObj::SetArrayFormulaWithGrammar( const rtl::OUString& rFormula,
5130*cdf0e10cSrcweir         const rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) throw(uno::RuntimeException)
5131*cdf0e10cSrcweir {
5132*cdf0e10cSrcweir     ScUnoGuard aGuard;
5133*cdf0e10cSrcweir     SetArrayFormula_Impl( rFormula, rFormulaNmsp, eGrammar);
5134*cdf0e10cSrcweir }
5135*cdf0e10cSrcweir 
5136*cdf0e10cSrcweir // XArrayFormulaTokens
5137*cdf0e10cSrcweir 
5138*cdf0e10cSrcweir uno::Sequence<sheet::FormulaToken> SAL_CALL ScCellRangeObj::getArrayTokens() throw(uno::RuntimeException)
5139*cdf0e10cSrcweir {
5140*cdf0e10cSrcweir     ScUnoGuard aGuard;
5141*cdf0e10cSrcweir 
5142*cdf0e10cSrcweir     // same cell logic as in getArrayFormula
5143*cdf0e10cSrcweir 
5144*cdf0e10cSrcweir     uno::Sequence<sheet::FormulaToken> aSequence;
5145*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5146*cdf0e10cSrcweir     if ( pDocSh )
5147*cdf0e10cSrcweir     {
5148*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
5149*cdf0e10cSrcweir         const ScBaseCell* pCell1 = pDoc->GetCell( aRange.aStart );
5150*cdf0e10cSrcweir         const ScBaseCell* pCell2 = pDoc->GetCell( aRange.aEnd );
5151*cdf0e10cSrcweir         if ( pCell1 && pCell2 && pCell1->GetCellType() == CELLTYPE_FORMULA &&
5152*cdf0e10cSrcweir                                  pCell2->GetCellType() == CELLTYPE_FORMULA )
5153*cdf0e10cSrcweir         {
5154*cdf0e10cSrcweir             const ScFormulaCell* pFCell1 = (const ScFormulaCell*)pCell1;
5155*cdf0e10cSrcweir             const ScFormulaCell* pFCell2 = (const ScFormulaCell*)pCell2;
5156*cdf0e10cSrcweir             ScAddress aStart1;
5157*cdf0e10cSrcweir             ScAddress aStart2;
5158*cdf0e10cSrcweir             if ( pFCell1->GetMatrixOrigin( aStart1 ) && pFCell2->GetMatrixOrigin( aStart2 ) )
5159*cdf0e10cSrcweir             {
5160*cdf0e10cSrcweir                 if ( aStart1 == aStart2 )
5161*cdf0e10cSrcweir                 {
5162*cdf0e10cSrcweir                     ScTokenArray* pTokenArray = pFCell1->GetCode();
5163*cdf0e10cSrcweir                     if ( pTokenArray )
5164*cdf0e10cSrcweir                         (void)ScTokenConversion::ConvertToTokenSequence( *pDoc, aSequence, *pTokenArray );
5165*cdf0e10cSrcweir                 }
5166*cdf0e10cSrcweir             }
5167*cdf0e10cSrcweir         }
5168*cdf0e10cSrcweir     }
5169*cdf0e10cSrcweir     return aSequence;
5170*cdf0e10cSrcweir }
5171*cdf0e10cSrcweir 
5172*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::setArrayTokens( const uno::Sequence<sheet::FormulaToken>& rTokens ) throw(uno::RuntimeException)
5173*cdf0e10cSrcweir {
5174*cdf0e10cSrcweir     ScUnoGuard aGuard;
5175*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5176*cdf0e10cSrcweir     if ( pDocSh )
5177*cdf0e10cSrcweir     {
5178*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
5179*cdf0e10cSrcweir         if ( rTokens.getLength() )
5180*cdf0e10cSrcweir         {
5181*cdf0e10cSrcweir             if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) )
5182*cdf0e10cSrcweir             {
5183*cdf0e10cSrcweir                 throw uno::RuntimeException();
5184*cdf0e10cSrcweir             }
5185*cdf0e10cSrcweir 
5186*cdf0e10cSrcweir             ScDocument* pDoc = pDocSh->GetDocument();
5187*cdf0e10cSrcweir             ScTokenArray aTokenArray;
5188*cdf0e10cSrcweir             (void)ScTokenConversion::ConvertToTokenArray( *pDoc, aTokenArray, rTokens );
5189*cdf0e10cSrcweir 
5190*cdf0e10cSrcweir             // Actually GRAM_PODF_A1 is a don't-care here because of the token
5191*cdf0e10cSrcweir             // array being set, it fits with other API compatibility grammars
5192*cdf0e10cSrcweir             // though.
5193*cdf0e10cSrcweir             aFunc.EnterMatrix( aRange, NULL, &aTokenArray, EMPTY_STRING, sal_True, sal_True, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 );
5194*cdf0e10cSrcweir         }
5195*cdf0e10cSrcweir         else
5196*cdf0e10cSrcweir         {
5197*cdf0e10cSrcweir             //  empty sequence -> erase array formula
5198*cdf0e10cSrcweir             ScMarkData aMark;
5199*cdf0e10cSrcweir             aMark.SetMarkArea( aRange );
5200*cdf0e10cSrcweir             aMark.SelectTable( aRange.aStart.Tab(), sal_True );
5201*cdf0e10cSrcweir             aFunc.DeleteContents( aMark, IDF_CONTENTS, sal_True, sal_True );
5202*cdf0e10cSrcweir         }
5203*cdf0e10cSrcweir     }
5204*cdf0e10cSrcweir }
5205*cdf0e10cSrcweir 
5206*cdf0e10cSrcweir // XCellRangeData
5207*cdf0e10cSrcweir 
5208*cdf0e10cSrcweir uno::Sequence< uno::Sequence<uno::Any> > SAL_CALL ScCellRangeObj::getDataArray()
5209*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
5210*cdf0e10cSrcweir {
5211*cdf0e10cSrcweir     ScUnoGuard aGuard;
5212*cdf0e10cSrcweir 
5213*cdf0e10cSrcweir     if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) )
5214*cdf0e10cSrcweir     {
5215*cdf0e10cSrcweir         //  don't create a data array for the sheet
5216*cdf0e10cSrcweir         throw uno::RuntimeException();
5217*cdf0e10cSrcweir     }
5218*cdf0e10cSrcweir 
5219*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5220*cdf0e10cSrcweir     if (pDocSh)
5221*cdf0e10cSrcweir     {
5222*cdf0e10cSrcweir         uno::Any aAny;
5223*cdf0e10cSrcweir         // bAllowNV = TRUE: errors as void
5224*cdf0e10cSrcweir         if ( ScRangeToSequence::FillMixedArray( aAny, pDocSh->GetDocument(), aRange, sal_True ) )
5225*cdf0e10cSrcweir         {
5226*cdf0e10cSrcweir             uno::Sequence< uno::Sequence<uno::Any> > aSeq;
5227*cdf0e10cSrcweir             if ( aAny >>= aSeq )
5228*cdf0e10cSrcweir                 return aSeq;            // success
5229*cdf0e10cSrcweir         }
5230*cdf0e10cSrcweir     }
5231*cdf0e10cSrcweir 
5232*cdf0e10cSrcweir     throw uno::RuntimeException();      // no other exceptions specified
5233*cdf0e10cSrcweir //    return uno::Sequence< uno::Sequence<uno::Any> >(0);
5234*cdf0e10cSrcweir }
5235*cdf0e10cSrcweir 
5236*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::setDataArray(
5237*cdf0e10cSrcweir                         const uno::Sequence< uno::Sequence<uno::Any> >& aArray )
5238*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
5239*cdf0e10cSrcweir {
5240*cdf0e10cSrcweir     ScUnoGuard aGuard;
5241*cdf0e10cSrcweir 
5242*cdf0e10cSrcweir     sal_Bool bDone = sal_False;
5243*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5244*cdf0e10cSrcweir     if (pDocSh)
5245*cdf0e10cSrcweir     {
5246*cdf0e10cSrcweir         //! move lcl_PutDataArray to docfunc?
5247*cdf0e10cSrcweir         bDone = lcl_PutDataArray( *pDocSh, aRange, aArray );
5248*cdf0e10cSrcweir     }
5249*cdf0e10cSrcweir 
5250*cdf0e10cSrcweir     if (!bDone)
5251*cdf0e10cSrcweir         throw uno::RuntimeException();      // no other exceptions specified
5252*cdf0e10cSrcweir }
5253*cdf0e10cSrcweir 
5254*cdf0e10cSrcweir // XCellRangeFormula
5255*cdf0e10cSrcweir 
5256*cdf0e10cSrcweir uno::Sequence< uno::Sequence<rtl::OUString> > SAL_CALL ScCellRangeObj::getFormulaArray()
5257*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
5258*cdf0e10cSrcweir {
5259*cdf0e10cSrcweir     ScUnoGuard aGuard;
5260*cdf0e10cSrcweir 
5261*cdf0e10cSrcweir     if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) )
5262*cdf0e10cSrcweir     {
5263*cdf0e10cSrcweir         //  don't create a data array for the sheet
5264*cdf0e10cSrcweir         throw uno::RuntimeException();
5265*cdf0e10cSrcweir     }
5266*cdf0e10cSrcweir 
5267*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5268*cdf0e10cSrcweir     if (pDocSh)
5269*cdf0e10cSrcweir     {
5270*cdf0e10cSrcweir         SCCOL nStartCol = aRange.aStart.Col();
5271*cdf0e10cSrcweir         SCROW nStartRow = aRange.aStart.Row();
5272*cdf0e10cSrcweir         SCCOL nEndCol = aRange.aEnd.Col();
5273*cdf0e10cSrcweir         SCROW nEndRow = aRange.aEnd.Row();
5274*cdf0e10cSrcweir         SCCOL nColCount = nEndCol + 1 - nStartCol;
5275*cdf0e10cSrcweir         SCROW nRowCount = nEndRow + 1 - nStartRow;
5276*cdf0e10cSrcweir         SCTAB nTab = aRange.aStart.Tab();
5277*cdf0e10cSrcweir 
5278*cdf0e10cSrcweir         uno::Sequence< uno::Sequence<rtl::OUString> > aRowSeq( nRowCount );
5279*cdf0e10cSrcweir         uno::Sequence<rtl::OUString>* pRowAry = aRowSeq.getArray();
5280*cdf0e10cSrcweir         for (SCROW nRowIndex = 0; nRowIndex < nRowCount; nRowIndex++)
5281*cdf0e10cSrcweir         {
5282*cdf0e10cSrcweir             uno::Sequence<rtl::OUString> aColSeq( nColCount );
5283*cdf0e10cSrcweir             rtl::OUString* pColAry = aColSeq.getArray();
5284*cdf0e10cSrcweir             for (SCCOL nColIndex = 0; nColIndex < nColCount; nColIndex++)
5285*cdf0e10cSrcweir                 pColAry[nColIndex] = lcl_GetInputString( pDocSh->GetDocument(),
5286*cdf0e10cSrcweir                                     ScAddress( nStartCol+nColIndex, nStartRow+nRowIndex, nTab ), sal_True );
5287*cdf0e10cSrcweir 
5288*cdf0e10cSrcweir             pRowAry[nRowIndex] = aColSeq;
5289*cdf0e10cSrcweir         }
5290*cdf0e10cSrcweir 
5291*cdf0e10cSrcweir         return aRowSeq;
5292*cdf0e10cSrcweir     }
5293*cdf0e10cSrcweir 
5294*cdf0e10cSrcweir     throw uno::RuntimeException();      // no other exceptions specified
5295*cdf0e10cSrcweir //    return uno::Sequence< uno::Sequence<rtl::OUString> >(0);
5296*cdf0e10cSrcweir }
5297*cdf0e10cSrcweir 
5298*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::setFormulaArray(
5299*cdf0e10cSrcweir                         const uno::Sequence< uno::Sequence<rtl::OUString> >& aArray )
5300*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
5301*cdf0e10cSrcweir {
5302*cdf0e10cSrcweir     ScUnoGuard aGuard;
5303*cdf0e10cSrcweir 
5304*cdf0e10cSrcweir     sal_Bool bDone = sal_False;
5305*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5306*cdf0e10cSrcweir     if (pDocSh)
5307*cdf0e10cSrcweir     {
5308*cdf0e10cSrcweir         ScExternalRefManager::ApiGuard aExtRefGuard(pDocSh->GetDocument());
5309*cdf0e10cSrcweir 
5310*cdf0e10cSrcweir         // GRAM_PODF_A1 for API compatibility.
5311*cdf0e10cSrcweir         bDone = lcl_PutFormulaArray( *pDocSh, aRange, aArray, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 );
5312*cdf0e10cSrcweir     }
5313*cdf0e10cSrcweir 
5314*cdf0e10cSrcweir     if (!bDone)
5315*cdf0e10cSrcweir         throw uno::RuntimeException();      // no other exceptions specified
5316*cdf0e10cSrcweir }
5317*cdf0e10cSrcweir 
5318*cdf0e10cSrcweir // XMultipleOperation
5319*cdf0e10cSrcweir 
5320*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::setTableOperation( const table::CellRangeAddress& aFormulaRange,
5321*cdf0e10cSrcweir                                         sheet::TableOperationMode nMode,
5322*cdf0e10cSrcweir                                         const table::CellAddress& aColumnCell,
5323*cdf0e10cSrcweir                                         const table::CellAddress& aRowCell )
5324*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
5325*cdf0e10cSrcweir {
5326*cdf0e10cSrcweir     ScUnoGuard aGuard;
5327*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5328*cdf0e10cSrcweir     if (pDocSh)
5329*cdf0e10cSrcweir     {
5330*cdf0e10cSrcweir         sal_Bool bError = sal_False;
5331*cdf0e10cSrcweir         ScTabOpParam aParam;
5332*cdf0e10cSrcweir         aParam.aRefFormulaCell = ScRefAddress( (SCCOL)aFormulaRange.StartColumn,
5333*cdf0e10cSrcweir                                               (SCROW)aFormulaRange.StartRow, aFormulaRange.Sheet,
5334*cdf0e10cSrcweir                                               sal_False, sal_False, sal_False );
5335*cdf0e10cSrcweir         aParam.aRefFormulaEnd  = ScRefAddress( (SCCOL)aFormulaRange.EndColumn,
5336*cdf0e10cSrcweir                                               (SCROW)aFormulaRange.EndRow, aFormulaRange.Sheet,
5337*cdf0e10cSrcweir                                               sal_False, sal_False, sal_False );
5338*cdf0e10cSrcweir         aParam.aRefRowCell     = ScRefAddress( (SCCOL)aRowCell.Column,
5339*cdf0e10cSrcweir                                               (SCROW)aRowCell.Row, aRowCell.Sheet,
5340*cdf0e10cSrcweir                                               sal_False, sal_False, sal_False );
5341*cdf0e10cSrcweir         aParam.aRefColCell     = ScRefAddress( (SCCOL)aColumnCell.Column,
5342*cdf0e10cSrcweir                                               (SCROW)aColumnCell.Row, aColumnCell.Sheet,
5343*cdf0e10cSrcweir                                               sal_False, sal_False, sal_False );
5344*cdf0e10cSrcweir         switch (nMode)
5345*cdf0e10cSrcweir         {
5346*cdf0e10cSrcweir             case sheet::TableOperationMode_COLUMN:
5347*cdf0e10cSrcweir                 aParam.nMode = 0;
5348*cdf0e10cSrcweir                 break;
5349*cdf0e10cSrcweir             case sheet::TableOperationMode_ROW:
5350*cdf0e10cSrcweir                 aParam.nMode = 1;
5351*cdf0e10cSrcweir                 break;
5352*cdf0e10cSrcweir             case sheet::TableOperationMode_BOTH:
5353*cdf0e10cSrcweir                 aParam.nMode = 2;
5354*cdf0e10cSrcweir                 break;
5355*cdf0e10cSrcweir             default:
5356*cdf0e10cSrcweir                 bError = sal_True;
5357*cdf0e10cSrcweir         }
5358*cdf0e10cSrcweir 
5359*cdf0e10cSrcweir         if (!bError)
5360*cdf0e10cSrcweir         {
5361*cdf0e10cSrcweir             ScDocFunc aFunc(*pDocSh);
5362*cdf0e10cSrcweir             aFunc.TabOp( aRange, NULL, aParam, sal_True, sal_True );
5363*cdf0e10cSrcweir         }
5364*cdf0e10cSrcweir     }
5365*cdf0e10cSrcweir }
5366*cdf0e10cSrcweir 
5367*cdf0e10cSrcweir // XMergeable
5368*cdf0e10cSrcweir 
5369*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::merge( sal_Bool bMerge ) throw(uno::RuntimeException)
5370*cdf0e10cSrcweir {
5371*cdf0e10cSrcweir     ScUnoGuard aGuard;
5372*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5373*cdf0e10cSrcweir     if ( pDocSh )
5374*cdf0e10cSrcweir     {
5375*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
5376*cdf0e10cSrcweir         if ( bMerge )
5377*cdf0e10cSrcweir             aFunc.MergeCells( aRange, sal_False, sal_True, sal_True );
5378*cdf0e10cSrcweir         else
5379*cdf0e10cSrcweir             aFunc.UnmergeCells( aRange, sal_True, sal_True );
5380*cdf0e10cSrcweir 
5381*cdf0e10cSrcweir         //! Fehler abfangen?
5382*cdf0e10cSrcweir     }
5383*cdf0e10cSrcweir }
5384*cdf0e10cSrcweir 
5385*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellRangeObj::getIsMerged() throw(uno::RuntimeException)
5386*cdf0e10cSrcweir {
5387*cdf0e10cSrcweir     ScUnoGuard aGuard;
5388*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5389*cdf0e10cSrcweir     return pDocSh && pDocSh->GetDocument()->HasAttrib( aRange, HASATTR_MERGED );
5390*cdf0e10cSrcweir }
5391*cdf0e10cSrcweir 
5392*cdf0e10cSrcweir // XCellSeries
5393*cdf0e10cSrcweir 
5394*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::fillSeries( sheet::FillDirection nFillDirection,
5395*cdf0e10cSrcweir                         sheet::FillMode nFillMode, sheet::FillDateMode nFillDateMode,
5396*cdf0e10cSrcweir                         double fStep, double fEndValue ) throw(uno::RuntimeException)
5397*cdf0e10cSrcweir {
5398*cdf0e10cSrcweir     ScUnoGuard aGuard;
5399*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5400*cdf0e10cSrcweir     if ( pDocSh )
5401*cdf0e10cSrcweir     {
5402*cdf0e10cSrcweir         sal_Bool bError = sal_False;
5403*cdf0e10cSrcweir 
5404*cdf0e10cSrcweir         FillDir eDir = FILL_TO_BOTTOM;
5405*cdf0e10cSrcweir         switch (nFillDirection)
5406*cdf0e10cSrcweir         {
5407*cdf0e10cSrcweir             case sheet::FillDirection_TO_BOTTOM:
5408*cdf0e10cSrcweir                 eDir = FILL_TO_BOTTOM;
5409*cdf0e10cSrcweir                 break;
5410*cdf0e10cSrcweir             case sheet::FillDirection_TO_RIGHT:
5411*cdf0e10cSrcweir                 eDir = FILL_TO_RIGHT;
5412*cdf0e10cSrcweir                 break;
5413*cdf0e10cSrcweir             case sheet::FillDirection_TO_TOP:
5414*cdf0e10cSrcweir                 eDir = FILL_TO_TOP;
5415*cdf0e10cSrcweir                 break;
5416*cdf0e10cSrcweir             case sheet::FillDirection_TO_LEFT:
5417*cdf0e10cSrcweir                 eDir = FILL_TO_LEFT;
5418*cdf0e10cSrcweir                 break;
5419*cdf0e10cSrcweir             default:
5420*cdf0e10cSrcweir                 bError = sal_True;
5421*cdf0e10cSrcweir         }
5422*cdf0e10cSrcweir 
5423*cdf0e10cSrcweir         FillCmd eCmd = FILL_SIMPLE;
5424*cdf0e10cSrcweir         switch ( nFillMode )
5425*cdf0e10cSrcweir         {
5426*cdf0e10cSrcweir             case sheet::FillMode_SIMPLE:
5427*cdf0e10cSrcweir                 eCmd = FILL_SIMPLE;
5428*cdf0e10cSrcweir                 break;
5429*cdf0e10cSrcweir             case sheet::FillMode_LINEAR:
5430*cdf0e10cSrcweir                 eCmd = FILL_LINEAR;
5431*cdf0e10cSrcweir                 break;
5432*cdf0e10cSrcweir             case sheet::FillMode_GROWTH:
5433*cdf0e10cSrcweir                 eCmd = FILL_GROWTH;
5434*cdf0e10cSrcweir                 break;
5435*cdf0e10cSrcweir             case sheet::FillMode_DATE:
5436*cdf0e10cSrcweir                 eCmd = FILL_DATE;
5437*cdf0e10cSrcweir                 break;
5438*cdf0e10cSrcweir             case sheet::FillMode_AUTO:
5439*cdf0e10cSrcweir                 eCmd = FILL_AUTO;
5440*cdf0e10cSrcweir                 break;
5441*cdf0e10cSrcweir             default:
5442*cdf0e10cSrcweir                 bError = sal_True;
5443*cdf0e10cSrcweir         }
5444*cdf0e10cSrcweir 
5445*cdf0e10cSrcweir         FillDateCmd eDateCmd = FILL_DAY;
5446*cdf0e10cSrcweir         switch ( nFillDateMode )
5447*cdf0e10cSrcweir         {
5448*cdf0e10cSrcweir             case sheet::FillDateMode_FILL_DATE_DAY:
5449*cdf0e10cSrcweir                 eDateCmd = FILL_DAY;
5450*cdf0e10cSrcweir                 break;
5451*cdf0e10cSrcweir             case sheet::FillDateMode_FILL_DATE_WEEKDAY:
5452*cdf0e10cSrcweir                 eDateCmd = FILL_WEEKDAY;
5453*cdf0e10cSrcweir                 break;
5454*cdf0e10cSrcweir             case sheet::FillDateMode_FILL_DATE_MONTH:
5455*cdf0e10cSrcweir                 eDateCmd = FILL_MONTH;
5456*cdf0e10cSrcweir                 break;
5457*cdf0e10cSrcweir             case sheet::FillDateMode_FILL_DATE_YEAR:
5458*cdf0e10cSrcweir                 eDateCmd = FILL_YEAR;
5459*cdf0e10cSrcweir                 break;
5460*cdf0e10cSrcweir             default:
5461*cdf0e10cSrcweir                 bError = sal_True;
5462*cdf0e10cSrcweir         }
5463*cdf0e10cSrcweir 
5464*cdf0e10cSrcweir         if (!bError)
5465*cdf0e10cSrcweir         {
5466*cdf0e10cSrcweir             ScDocFunc aFunc(*pDocSh);
5467*cdf0e10cSrcweir             aFunc.FillSeries( aRange, NULL, eDir, eCmd, eDateCmd,
5468*cdf0e10cSrcweir                                 MAXDOUBLE, fStep, fEndValue, sal_True, sal_True );
5469*cdf0e10cSrcweir         }
5470*cdf0e10cSrcweir     }
5471*cdf0e10cSrcweir }
5472*cdf0e10cSrcweir 
5473*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::fillAuto( sheet::FillDirection nFillDirection,
5474*cdf0e10cSrcweir                                 sal_Int32 nSourceCount ) throw(uno::RuntimeException)
5475*cdf0e10cSrcweir {
5476*cdf0e10cSrcweir     ScUnoGuard aGuard;
5477*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5478*cdf0e10cSrcweir     if ( pDocSh && nSourceCount )
5479*cdf0e10cSrcweir     {
5480*cdf0e10cSrcweir         ScRange aSourceRange(aRange);
5481*cdf0e10cSrcweir         SCsCOLROW nCount = 0;                   // "Dest-Count"
5482*cdf0e10cSrcweir         FillDir eDir = FILL_TO_BOTTOM;
5483*cdf0e10cSrcweir         sal_Bool bError = sal_False;
5484*cdf0e10cSrcweir         switch (nFillDirection)
5485*cdf0e10cSrcweir         {
5486*cdf0e10cSrcweir             case sheet::FillDirection_TO_BOTTOM:
5487*cdf0e10cSrcweir                 aSourceRange.aEnd.SetRow( static_cast<SCROW>( aSourceRange.aStart.Row() + nSourceCount - 1 ) );
5488*cdf0e10cSrcweir                 nCount = aRange.aEnd.Row() - aSourceRange.aEnd.Row();
5489*cdf0e10cSrcweir                 eDir = FILL_TO_BOTTOM;
5490*cdf0e10cSrcweir                 break;
5491*cdf0e10cSrcweir             case sheet::FillDirection_TO_RIGHT:
5492*cdf0e10cSrcweir                 aSourceRange.aEnd.SetCol( static_cast<SCCOL>( aSourceRange.aStart.Col() + nSourceCount - 1 ) );
5493*cdf0e10cSrcweir                 nCount = aRange.aEnd.Col() - aSourceRange.aEnd.Col();
5494*cdf0e10cSrcweir                 eDir = FILL_TO_RIGHT;
5495*cdf0e10cSrcweir                 break;
5496*cdf0e10cSrcweir             case sheet::FillDirection_TO_TOP:
5497*cdf0e10cSrcweir                 aSourceRange.aStart.SetRow( static_cast<SCROW>( aSourceRange.aEnd.Row() - nSourceCount + 1 ) );
5498*cdf0e10cSrcweir                 nCount = aSourceRange.aStart.Row() - aRange.aStart.Row();
5499*cdf0e10cSrcweir                 eDir = FILL_TO_TOP;
5500*cdf0e10cSrcweir                 break;
5501*cdf0e10cSrcweir             case sheet::FillDirection_TO_LEFT:
5502*cdf0e10cSrcweir                 aSourceRange.aStart.SetCol( static_cast<SCCOL>( aSourceRange.aEnd.Col() - nSourceCount + 1 ) );
5503*cdf0e10cSrcweir                 nCount = aSourceRange.aStart.Col() - aRange.aStart.Col();
5504*cdf0e10cSrcweir                 eDir = FILL_TO_LEFT;
5505*cdf0e10cSrcweir                 break;
5506*cdf0e10cSrcweir             default:
5507*cdf0e10cSrcweir                 bError = sal_True;
5508*cdf0e10cSrcweir         }
5509*cdf0e10cSrcweir         if (nCount < 0 || nCount > MAXROW)      // overflow
5510*cdf0e10cSrcweir             bError = sal_True;
5511*cdf0e10cSrcweir 
5512*cdf0e10cSrcweir         if (!bError)
5513*cdf0e10cSrcweir         {
5514*cdf0e10cSrcweir             ScDocFunc aFunc(*pDocSh);
5515*cdf0e10cSrcweir             aFunc.FillAuto( aSourceRange, NULL, eDir, nCount, sal_True, sal_True );
5516*cdf0e10cSrcweir         }
5517*cdf0e10cSrcweir     }
5518*cdf0e10cSrcweir }
5519*cdf0e10cSrcweir 
5520*cdf0e10cSrcweir // XAutoFormattable
5521*cdf0e10cSrcweir 
5522*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::autoFormat( const rtl::OUString& aName )
5523*cdf0e10cSrcweir                     throw(lang::IllegalArgumentException, uno::RuntimeException)
5524*cdf0e10cSrcweir {
5525*cdf0e10cSrcweir     ScUnoGuard aGuard;
5526*cdf0e10cSrcweir     ScAutoFormat* pAutoFormat = ScGlobal::GetAutoFormat();
5527*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5528*cdf0e10cSrcweir     if ( pDocSh && pAutoFormat )
5529*cdf0e10cSrcweir     {
5530*cdf0e10cSrcweir         String aNameString(aName);
5531*cdf0e10cSrcweir         sal_uInt16 nCount = pAutoFormat->GetCount();
5532*cdf0e10cSrcweir         sal_uInt16 nIndex;
5533*cdf0e10cSrcweir         String aCompare;
5534*cdf0e10cSrcweir         for (nIndex=0; nIndex<nCount; nIndex++)
5535*cdf0e10cSrcweir         {
5536*cdf0e10cSrcweir             (*pAutoFormat)[nIndex]->GetName(aCompare);
5537*cdf0e10cSrcweir             if ( aCompare == aNameString )                      //! Case-insensitiv ???
5538*cdf0e10cSrcweir                 break;
5539*cdf0e10cSrcweir         }
5540*cdf0e10cSrcweir         if (nIndex<nCount)
5541*cdf0e10cSrcweir         {
5542*cdf0e10cSrcweir             ScDocFunc aFunc(*pDocSh);
5543*cdf0e10cSrcweir             aFunc.AutoFormat( aRange, NULL, nIndex, sal_True, sal_True );
5544*cdf0e10cSrcweir         }
5545*cdf0e10cSrcweir         else
5546*cdf0e10cSrcweir             throw lang::IllegalArgumentException();
5547*cdf0e10cSrcweir     }
5548*cdf0e10cSrcweir }
5549*cdf0e10cSrcweir 
5550*cdf0e10cSrcweir // XSortable
5551*cdf0e10cSrcweir 
5552*cdf0e10cSrcweir uno::Sequence<beans::PropertyValue> SAL_CALL ScCellRangeObj::createSortDescriptor()
5553*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
5554*cdf0e10cSrcweir {
5555*cdf0e10cSrcweir     ScUnoGuard aGuard;
5556*cdf0e10cSrcweir     ScSortParam aParam;
5557*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5558*cdf0e10cSrcweir     if ( pDocSh )
5559*cdf0e10cSrcweir     {
5560*cdf0e10cSrcweir         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
5561*cdf0e10cSrcweir         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
5562*cdf0e10cSrcweir         if (pData)
5563*cdf0e10cSrcweir         {
5564*cdf0e10cSrcweir             pData->GetSortParam(aParam);
5565*cdf0e10cSrcweir 
5566*cdf0e10cSrcweir             //  im SortDescriptor sind die Fields innerhalb des Bereichs gezaehlt
5567*cdf0e10cSrcweir             ScRange aDBRange;
5568*cdf0e10cSrcweir             pData->GetArea(aDBRange);
5569*cdf0e10cSrcweir             SCCOLROW nFieldStart = aParam.bByRow ?
5570*cdf0e10cSrcweir                 static_cast<SCCOLROW>(aDBRange.aStart.Col()) :
5571*cdf0e10cSrcweir                 static_cast<SCCOLROW>(aDBRange.aStart.Row());
5572*cdf0e10cSrcweir             for (sal_uInt16 i=0; i<MAXSORT; i++)
5573*cdf0e10cSrcweir                 if ( aParam.bDoSort[i] && aParam.nField[i] >= nFieldStart )
5574*cdf0e10cSrcweir                     aParam.nField[i] -= nFieldStart;
5575*cdf0e10cSrcweir         }
5576*cdf0e10cSrcweir     }
5577*cdf0e10cSrcweir 
5578*cdf0e10cSrcweir     uno::Sequence<beans::PropertyValue> aSeq( ScSortDescriptor::GetPropertyCount() );
5579*cdf0e10cSrcweir     ScSortDescriptor::FillProperties( aSeq, aParam );
5580*cdf0e10cSrcweir     return aSeq;
5581*cdf0e10cSrcweir }
5582*cdf0e10cSrcweir 
5583*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::sort( const uno::Sequence<beans::PropertyValue>& aDescriptor )
5584*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
5585*cdf0e10cSrcweir {
5586*cdf0e10cSrcweir     ScUnoGuard aGuard;
5587*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5588*cdf0e10cSrcweir     if (pDocSh)
5589*cdf0e10cSrcweir     {
5590*cdf0e10cSrcweir         sal_uInt16 i;
5591*cdf0e10cSrcweir         ScSortParam aParam;
5592*cdf0e10cSrcweir         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK ); // ggf. Bereich anlegen
5593*cdf0e10cSrcweir         if (pData)
5594*cdf0e10cSrcweir         {
5595*cdf0e10cSrcweir             //  alten Einstellungen holen, falls nicht alles neu gesetzt wird
5596*cdf0e10cSrcweir             pData->GetSortParam(aParam);
5597*cdf0e10cSrcweir             SCCOLROW nOldStart = aParam.bByRow ?
5598*cdf0e10cSrcweir                 static_cast<SCCOLROW>(aRange.aStart.Col()) :
5599*cdf0e10cSrcweir                 static_cast<SCCOLROW>(aRange.aStart.Row());
5600*cdf0e10cSrcweir             for (i=0; i<MAXSORT; i++)
5601*cdf0e10cSrcweir                 if ( aParam.bDoSort[i] && aParam.nField[i] >= nOldStart )
5602*cdf0e10cSrcweir                     aParam.nField[i] -= nOldStart;
5603*cdf0e10cSrcweir         }
5604*cdf0e10cSrcweir 
5605*cdf0e10cSrcweir         ScSortDescriptor::FillSortParam( aParam, aDescriptor );
5606*cdf0e10cSrcweir 
5607*cdf0e10cSrcweir         //  im SortDescriptor sind die Fields innerhalb des Bereichs gezaehlt
5608*cdf0e10cSrcweir         //  ByRow kann bei FillSortParam umgesetzt worden sein
5609*cdf0e10cSrcweir         SCCOLROW nFieldStart = aParam.bByRow ?
5610*cdf0e10cSrcweir             static_cast<SCCOLROW>(aRange.aStart.Col()) :
5611*cdf0e10cSrcweir             static_cast<SCCOLROW>(aRange.aStart.Row());
5612*cdf0e10cSrcweir         for (i=0; i<MAXSORT; i++)
5613*cdf0e10cSrcweir             aParam.nField[i] += nFieldStart;
5614*cdf0e10cSrcweir 
5615*cdf0e10cSrcweir         SCTAB nTab = aRange.aStart.Tab();
5616*cdf0e10cSrcweir         aParam.nCol1 = aRange.aStart.Col();
5617*cdf0e10cSrcweir         aParam.nRow1 = aRange.aStart.Row();
5618*cdf0e10cSrcweir         aParam.nCol2 = aRange.aEnd.Col();
5619*cdf0e10cSrcweir         aParam.nRow2 = aRange.aEnd.Row();
5620*cdf0e10cSrcweir 
5621*cdf0e10cSrcweir         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );       // ggf. Bereich anlegen
5622*cdf0e10cSrcweir 
5623*cdf0e10cSrcweir         ScDBDocFunc aFunc(*pDocSh);                         // Bereich muss angelegt sein
5624*cdf0e10cSrcweir         aFunc.Sort( nTab, aParam, sal_True, sal_True, sal_True );
5625*cdf0e10cSrcweir     }
5626*cdf0e10cSrcweir }
5627*cdf0e10cSrcweir 
5628*cdf0e10cSrcweir // XFilterable
5629*cdf0e10cSrcweir 
5630*cdf0e10cSrcweir uno::Reference<sheet::XSheetFilterDescriptor> SAL_CALL ScCellRangeObj::createFilterDescriptor(
5631*cdf0e10cSrcweir                                 sal_Bool bEmpty ) throw(uno::RuntimeException)
5632*cdf0e10cSrcweir {
5633*cdf0e10cSrcweir     ScUnoGuard aGuard;
5634*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5635*cdf0e10cSrcweir     ScFilterDescriptor* pNew = new ScFilterDescriptor(pDocSh);
5636*cdf0e10cSrcweir     if ( !bEmpty && pDocSh )
5637*cdf0e10cSrcweir     {
5638*cdf0e10cSrcweir         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
5639*cdf0e10cSrcweir         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
5640*cdf0e10cSrcweir         if (pData)
5641*cdf0e10cSrcweir         {
5642*cdf0e10cSrcweir             ScQueryParam aParam;
5643*cdf0e10cSrcweir             pData->GetQueryParam(aParam);
5644*cdf0e10cSrcweir             //  im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
5645*cdf0e10cSrcweir             ScRange aDBRange;
5646*cdf0e10cSrcweir             pData->GetArea(aDBRange);
5647*cdf0e10cSrcweir             SCCOLROW nFieldStart = aParam.bByRow ?
5648*cdf0e10cSrcweir                 static_cast<SCCOLROW>(aDBRange.aStart.Col()) :
5649*cdf0e10cSrcweir                 static_cast<SCCOLROW>(aDBRange.aStart.Row());
5650*cdf0e10cSrcweir             SCSIZE nCount = aParam.GetEntryCount();
5651*cdf0e10cSrcweir             for (SCSIZE i=0; i<nCount; i++)
5652*cdf0e10cSrcweir             {
5653*cdf0e10cSrcweir                 ScQueryEntry& rEntry = aParam.GetEntry(i);
5654*cdf0e10cSrcweir                 if (rEntry.bDoQuery && rEntry.nField >= nFieldStart)
5655*cdf0e10cSrcweir                     rEntry.nField -= nFieldStart;
5656*cdf0e10cSrcweir             }
5657*cdf0e10cSrcweir             pNew->SetParam(aParam);
5658*cdf0e10cSrcweir         }
5659*cdf0e10cSrcweir     }
5660*cdf0e10cSrcweir     return pNew;
5661*cdf0e10cSrcweir }
5662*cdf0e10cSrcweir 
5663*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::filter( const uno::Reference<sheet::XSheetFilterDescriptor>& xDescriptor )
5664*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
5665*cdf0e10cSrcweir {
5666*cdf0e10cSrcweir     ScUnoGuard aGuard;
5667*cdf0e10cSrcweir 
5668*cdf0e10cSrcweir     //  das koennte theoretisch ein fremdes Objekt sein, also nur das
5669*cdf0e10cSrcweir     //  oeffentliche XSheetFilterDescriptor Interface benutzen, um
5670*cdf0e10cSrcweir     //  die Daten in ein ScFilterDescriptor Objekt zu kopieren:
5671*cdf0e10cSrcweir     //! wenn es schon ein ScFilterDescriptor ist, direkt per getImplementation?
5672*cdf0e10cSrcweir 
5673*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5674*cdf0e10cSrcweir     ScFilterDescriptor aImpl(pDocSh);
5675*cdf0e10cSrcweir     uno::Reference< sheet::XSheetFilterDescriptor2 > xDescriptor2( xDescriptor, uno::UNO_QUERY );
5676*cdf0e10cSrcweir     if ( xDescriptor2.is() )
5677*cdf0e10cSrcweir     {
5678*cdf0e10cSrcweir         aImpl.setFilterFields2( xDescriptor2->getFilterFields2() );
5679*cdf0e10cSrcweir     }
5680*cdf0e10cSrcweir     else
5681*cdf0e10cSrcweir     {
5682*cdf0e10cSrcweir         aImpl.setFilterFields( xDescriptor->getFilterFields() );
5683*cdf0e10cSrcweir     }
5684*cdf0e10cSrcweir     //  Rest sind jetzt Properties...
5685*cdf0e10cSrcweir 
5686*cdf0e10cSrcweir     uno::Reference<beans::XPropertySet> xPropSet( xDescriptor, uno::UNO_QUERY );
5687*cdf0e10cSrcweir     if (xPropSet.is())
5688*cdf0e10cSrcweir         lcl_CopyProperties( aImpl, *(beans::XPropertySet*)xPropSet.get() );
5689*cdf0e10cSrcweir 
5690*cdf0e10cSrcweir     //
5691*cdf0e10cSrcweir     //  ausfuehren...
5692*cdf0e10cSrcweir     //
5693*cdf0e10cSrcweir 
5694*cdf0e10cSrcweir     if (pDocSh)
5695*cdf0e10cSrcweir     {
5696*cdf0e10cSrcweir         ScQueryParam aParam = aImpl.GetParam();
5697*cdf0e10cSrcweir         //  im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
5698*cdf0e10cSrcweir         SCCOLROW nFieldStart = aParam.bByRow ?
5699*cdf0e10cSrcweir             static_cast<SCCOLROW>(aRange.aStart.Col()) :
5700*cdf0e10cSrcweir             static_cast<SCCOLROW>(aRange.aStart.Row());
5701*cdf0e10cSrcweir         SCSIZE nCount = aParam.GetEntryCount();
5702*cdf0e10cSrcweir         for (SCSIZE i=0; i<nCount; i++)
5703*cdf0e10cSrcweir         {
5704*cdf0e10cSrcweir             ScQueryEntry& rEntry = aParam.GetEntry(i);
5705*cdf0e10cSrcweir             if (rEntry.bDoQuery)
5706*cdf0e10cSrcweir             {
5707*cdf0e10cSrcweir                 rEntry.nField += nFieldStart;
5708*cdf0e10cSrcweir                 //  Im Dialog wird immer der String angezeigt -> muss zum Wert passen
5709*cdf0e10cSrcweir                 if ( !rEntry.bQueryByString )
5710*cdf0e10cSrcweir                     pDocSh->GetDocument()->GetFormatTable()->
5711*cdf0e10cSrcweir                         GetInputLineString( rEntry.nVal, 0, *rEntry.pStr );
5712*cdf0e10cSrcweir             }
5713*cdf0e10cSrcweir         }
5714*cdf0e10cSrcweir 
5715*cdf0e10cSrcweir         SCTAB nTab = aRange.aStart.Tab();
5716*cdf0e10cSrcweir         aParam.nCol1 = aRange.aStart.Col();
5717*cdf0e10cSrcweir         aParam.nRow1 = aRange.aStart.Row();
5718*cdf0e10cSrcweir         aParam.nCol2 = aRange.aEnd.Col();
5719*cdf0e10cSrcweir         aParam.nRow2 = aRange.aEnd.Row();
5720*cdf0e10cSrcweir 
5721*cdf0e10cSrcweir         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );   // ggf. Bereich anlegen
5722*cdf0e10cSrcweir 
5723*cdf0e10cSrcweir         //! keep source range in filter descriptor
5724*cdf0e10cSrcweir         //! if created by createFilterDescriptorByObject ???
5725*cdf0e10cSrcweir 
5726*cdf0e10cSrcweir         ScDBDocFunc aFunc(*pDocSh);
5727*cdf0e10cSrcweir         aFunc.Query( nTab, aParam, NULL, sal_True, sal_True );  // Bereich muss angelegt sein
5728*cdf0e10cSrcweir     }
5729*cdf0e10cSrcweir }
5730*cdf0e10cSrcweir 
5731*cdf0e10cSrcweir //! get/setAutoFilter als Properties!!!
5732*cdf0e10cSrcweir 
5733*cdf0e10cSrcweir // XAdvancedFilterSource
5734*cdf0e10cSrcweir 
5735*cdf0e10cSrcweir uno::Reference<sheet::XSheetFilterDescriptor> SAL_CALL ScCellRangeObj::createFilterDescriptorByObject(
5736*cdf0e10cSrcweir                         const uno::Reference<sheet::XSheetFilterable>& xObject )
5737*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
5738*cdf0e10cSrcweir {
5739*cdf0e10cSrcweir     ScUnoGuard aGuard;
5740*cdf0e10cSrcweir 
5741*cdf0e10cSrcweir     //  this ist hier nicht der Bereich, der gefiltert wird, sondern der
5742*cdf0e10cSrcweir     //  Bereich mit der Abfrage...
5743*cdf0e10cSrcweir 
5744*cdf0e10cSrcweir     uno::Reference<sheet::XCellRangeAddressable> xAddr( xObject, uno::UNO_QUERY );
5745*cdf0e10cSrcweir 
5746*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5747*cdf0e10cSrcweir     if ( pDocSh && xAddr.is() )
5748*cdf0e10cSrcweir     {
5749*cdf0e10cSrcweir         //! Test, ob xObject im selben Dokument ist
5750*cdf0e10cSrcweir 
5751*cdf0e10cSrcweir         ScFilterDescriptor* pNew = new ScFilterDescriptor(pDocSh);  //! stattdessen vom Objekt?
5752*cdf0e10cSrcweir         //XSheetFilterDescriptorRef xNew = xObject->createFilterDescriptor(sal_True);
5753*cdf0e10cSrcweir 
5754*cdf0e10cSrcweir         ScQueryParam aParam = pNew->GetParam();
5755*cdf0e10cSrcweir         aParam.bHasHeader = sal_True;
5756*cdf0e10cSrcweir 
5757*cdf0e10cSrcweir         table::CellRangeAddress aDataAddress(xAddr->getRangeAddress());
5758*cdf0e10cSrcweir         aParam.nCol1 = (SCCOL)aDataAddress.StartColumn;
5759*cdf0e10cSrcweir         aParam.nRow1 = (SCROW)aDataAddress.StartRow;
5760*cdf0e10cSrcweir         aParam.nCol2 = (SCCOL)aDataAddress.EndColumn;
5761*cdf0e10cSrcweir         aParam.nRow2 = (SCROW)aDataAddress.EndRow;
5762*cdf0e10cSrcweir         aParam.nTab  = aDataAddress.Sheet;
5763*cdf0e10cSrcweir 
5764*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
5765*cdf0e10cSrcweir         sal_Bool bOk = pDoc->CreateQueryParam(
5766*cdf0e10cSrcweir                             aRange.aStart.Col(), aRange.aStart.Row(),
5767*cdf0e10cSrcweir                             aRange.aEnd.Col(), aRange.aEnd.Row(),
5768*cdf0e10cSrcweir                             aRange.aStart.Tab(), aParam );
5769*cdf0e10cSrcweir         if ( bOk )
5770*cdf0e10cSrcweir         {
5771*cdf0e10cSrcweir             //  im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
5772*cdf0e10cSrcweir             SCCOLROW nFieldStart = aParam.bByRow ?
5773*cdf0e10cSrcweir                 static_cast<SCCOLROW>(aDataAddress.StartColumn) :
5774*cdf0e10cSrcweir                 static_cast<SCCOLROW>(aDataAddress.StartRow);
5775*cdf0e10cSrcweir             SCSIZE nCount = aParam.GetEntryCount();
5776*cdf0e10cSrcweir             for (SCSIZE i=0; i<nCount; i++)
5777*cdf0e10cSrcweir             {
5778*cdf0e10cSrcweir                 ScQueryEntry& rEntry = aParam.GetEntry(i);
5779*cdf0e10cSrcweir                 if (rEntry.bDoQuery && rEntry.nField >= nFieldStart)
5780*cdf0e10cSrcweir                     rEntry.nField -= nFieldStart;
5781*cdf0e10cSrcweir             }
5782*cdf0e10cSrcweir 
5783*cdf0e10cSrcweir             pNew->SetParam( aParam );
5784*cdf0e10cSrcweir             return pNew;
5785*cdf0e10cSrcweir         }
5786*cdf0e10cSrcweir         else
5787*cdf0e10cSrcweir         {
5788*cdf0e10cSrcweir             delete pNew;
5789*cdf0e10cSrcweir             return NULL;        // ungueltig -> null
5790*cdf0e10cSrcweir         }
5791*cdf0e10cSrcweir     }
5792*cdf0e10cSrcweir 
5793*cdf0e10cSrcweir     DBG_ERROR("kein Dokument oder kein Bereich");
5794*cdf0e10cSrcweir     return NULL;
5795*cdf0e10cSrcweir }
5796*cdf0e10cSrcweir 
5797*cdf0e10cSrcweir // XSubTotalSource
5798*cdf0e10cSrcweir 
5799*cdf0e10cSrcweir uno::Reference<sheet::XSubTotalDescriptor> SAL_CALL ScCellRangeObj::createSubTotalDescriptor(
5800*cdf0e10cSrcweir                                 sal_Bool bEmpty ) throw(uno::RuntimeException)
5801*cdf0e10cSrcweir {
5802*cdf0e10cSrcweir     ScUnoGuard aGuard;
5803*cdf0e10cSrcweir     ScSubTotalDescriptor* pNew = new ScSubTotalDescriptor;
5804*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5805*cdf0e10cSrcweir     if ( !bEmpty && pDocSh )
5806*cdf0e10cSrcweir     {
5807*cdf0e10cSrcweir         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
5808*cdf0e10cSrcweir         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
5809*cdf0e10cSrcweir         if (pData)
5810*cdf0e10cSrcweir         {
5811*cdf0e10cSrcweir             ScSubTotalParam aParam;
5812*cdf0e10cSrcweir             pData->GetSubTotalParam(aParam);
5813*cdf0e10cSrcweir             //  im SubTotalDescriptor sind die Fields innerhalb des Bereichs gezaehlt
5814*cdf0e10cSrcweir             ScRange aDBRange;
5815*cdf0e10cSrcweir             pData->GetArea(aDBRange);
5816*cdf0e10cSrcweir             SCCOL nFieldStart = aDBRange.aStart.Col();
5817*cdf0e10cSrcweir             for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
5818*cdf0e10cSrcweir             {
5819*cdf0e10cSrcweir                 if ( aParam.bGroupActive[i] )
5820*cdf0e10cSrcweir                 {
5821*cdf0e10cSrcweir                     if ( aParam.nField[i] >= nFieldStart )
5822*cdf0e10cSrcweir                         aParam.nField[i] = sal::static_int_cast<SCCOL>( aParam.nField[i] - nFieldStart );
5823*cdf0e10cSrcweir                     for (SCCOL j=0; j<aParam.nSubTotals[i]; j++)
5824*cdf0e10cSrcweir                         if ( aParam.pSubTotals[i][j] >= nFieldStart )
5825*cdf0e10cSrcweir                             aParam.pSubTotals[i][j] = sal::static_int_cast<SCCOL>( aParam.pSubTotals[i][j] - nFieldStart );
5826*cdf0e10cSrcweir                 }
5827*cdf0e10cSrcweir             }
5828*cdf0e10cSrcweir             pNew->SetParam(aParam);
5829*cdf0e10cSrcweir         }
5830*cdf0e10cSrcweir     }
5831*cdf0e10cSrcweir     return pNew;
5832*cdf0e10cSrcweir }
5833*cdf0e10cSrcweir 
5834*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::applySubTotals(
5835*cdf0e10cSrcweir                 const uno::Reference<sheet::XSubTotalDescriptor>& xDescriptor,
5836*cdf0e10cSrcweir                 sal_Bool bReplace ) throw(uno::RuntimeException)
5837*cdf0e10cSrcweir {
5838*cdf0e10cSrcweir     ScUnoGuard aGuard;
5839*cdf0e10cSrcweir 
5840*cdf0e10cSrcweir     if (!xDescriptor.is()) return;
5841*cdf0e10cSrcweir 
5842*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5843*cdf0e10cSrcweir     ScSubTotalDescriptorBase* pImp =
5844*cdf0e10cSrcweir         ScSubTotalDescriptorBase::getImplementation( xDescriptor );
5845*cdf0e10cSrcweir 
5846*cdf0e10cSrcweir     if (pDocSh && pImp)
5847*cdf0e10cSrcweir     {
5848*cdf0e10cSrcweir         ScSubTotalParam aParam;
5849*cdf0e10cSrcweir         pImp->GetData(aParam);      // virtuelle Methode der Basisklasse
5850*cdf0e10cSrcweir 
5851*cdf0e10cSrcweir         //  im SubTotalDescriptor sind die Fields innerhalb des Bereichs gezaehlt
5852*cdf0e10cSrcweir         SCCOL nFieldStart = aRange.aStart.Col();
5853*cdf0e10cSrcweir         for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
5854*cdf0e10cSrcweir         {
5855*cdf0e10cSrcweir             if ( aParam.bGroupActive[i] )
5856*cdf0e10cSrcweir             {
5857*cdf0e10cSrcweir                 aParam.nField[i] = sal::static_int_cast<SCCOL>( aParam.nField[i] + nFieldStart );
5858*cdf0e10cSrcweir                 for (SCCOL j=0; j<aParam.nSubTotals[i]; j++)
5859*cdf0e10cSrcweir                     aParam.pSubTotals[i][j] = sal::static_int_cast<SCCOL>( aParam.pSubTotals[i][j] + nFieldStart );
5860*cdf0e10cSrcweir             }
5861*cdf0e10cSrcweir         }
5862*cdf0e10cSrcweir 
5863*cdf0e10cSrcweir         aParam.bReplace = bReplace;
5864*cdf0e10cSrcweir 
5865*cdf0e10cSrcweir         SCTAB nTab = aRange.aStart.Tab();
5866*cdf0e10cSrcweir         aParam.nCol1 = aRange.aStart.Col();
5867*cdf0e10cSrcweir         aParam.nRow1 = aRange.aStart.Row();
5868*cdf0e10cSrcweir         aParam.nCol2 = aRange.aEnd.Col();
5869*cdf0e10cSrcweir         aParam.nRow2 = aRange.aEnd.Row();
5870*cdf0e10cSrcweir 
5871*cdf0e10cSrcweir         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );   // ggf. Bereich anlegen
5872*cdf0e10cSrcweir 
5873*cdf0e10cSrcweir         ScDBDocFunc aFunc(*pDocSh);
5874*cdf0e10cSrcweir         aFunc.DoSubTotals( nTab, aParam, NULL, sal_True, sal_True );    // Bereich muss angelegt sein
5875*cdf0e10cSrcweir     }
5876*cdf0e10cSrcweir }
5877*cdf0e10cSrcweir 
5878*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::removeSubTotals() throw(uno::RuntimeException)
5879*cdf0e10cSrcweir {
5880*cdf0e10cSrcweir     ScUnoGuard aGuard;
5881*cdf0e10cSrcweir 
5882*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5883*cdf0e10cSrcweir     if (pDocSh)
5884*cdf0e10cSrcweir     {
5885*cdf0e10cSrcweir         ScSubTotalParam aParam;
5886*cdf0e10cSrcweir         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
5887*cdf0e10cSrcweir         if (pData)
5888*cdf0e10cSrcweir             pData->GetSubTotalParam(aParam);    // auch bei Remove die Feld-Eintraege behalten
5889*cdf0e10cSrcweir 
5890*cdf0e10cSrcweir         aParam.bRemoveOnly = sal_True;
5891*cdf0e10cSrcweir 
5892*cdf0e10cSrcweir         SCTAB nTab = aRange.aStart.Tab();
5893*cdf0e10cSrcweir         aParam.nCol1 = aRange.aStart.Col();
5894*cdf0e10cSrcweir         aParam.nRow1 = aRange.aStart.Row();
5895*cdf0e10cSrcweir         aParam.nCol2 = aRange.aEnd.Col();
5896*cdf0e10cSrcweir         aParam.nRow2 = aRange.aEnd.Row();
5897*cdf0e10cSrcweir 
5898*cdf0e10cSrcweir         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );   // ggf. Bereich anlegen
5899*cdf0e10cSrcweir 
5900*cdf0e10cSrcweir         ScDBDocFunc aFunc(*pDocSh);
5901*cdf0e10cSrcweir         aFunc.DoSubTotals( nTab, aParam, NULL, sal_True, sal_True );    // Bereich muss angelegt sein
5902*cdf0e10cSrcweir     }
5903*cdf0e10cSrcweir }
5904*cdf0e10cSrcweir 
5905*cdf0e10cSrcweir uno::Sequence<beans::PropertyValue> SAL_CALL ScCellRangeObj::createImportDescriptor( sal_Bool bEmpty )
5906*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
5907*cdf0e10cSrcweir {
5908*cdf0e10cSrcweir     ScUnoGuard aGuard;
5909*cdf0e10cSrcweir     ScImportParam aParam;
5910*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5911*cdf0e10cSrcweir     if ( !bEmpty && pDocSh )
5912*cdf0e10cSrcweir     {
5913*cdf0e10cSrcweir         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
5914*cdf0e10cSrcweir         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
5915*cdf0e10cSrcweir         if (pData)
5916*cdf0e10cSrcweir             pData->GetImportParam(aParam);
5917*cdf0e10cSrcweir     }
5918*cdf0e10cSrcweir 
5919*cdf0e10cSrcweir     uno::Sequence<beans::PropertyValue> aSeq( ScImportDescriptor::GetPropertyCount() );
5920*cdf0e10cSrcweir     ScImportDescriptor::FillProperties( aSeq, aParam );
5921*cdf0e10cSrcweir     return aSeq;
5922*cdf0e10cSrcweir }
5923*cdf0e10cSrcweir 
5924*cdf0e10cSrcweir void SAL_CALL ScCellRangeObj::doImport( const uno::Sequence<beans::PropertyValue>& aDescriptor )
5925*cdf0e10cSrcweir                                             throw(uno::RuntimeException)
5926*cdf0e10cSrcweir {
5927*cdf0e10cSrcweir     ScUnoGuard aGuard;
5928*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5929*cdf0e10cSrcweir     if (pDocSh)
5930*cdf0e10cSrcweir     {
5931*cdf0e10cSrcweir         ScImportParam aParam;
5932*cdf0e10cSrcweir         ScImportDescriptor::FillImportParam( aParam, aDescriptor );
5933*cdf0e10cSrcweir 
5934*cdf0e10cSrcweir         SCTAB nTab = aRange.aStart.Tab();
5935*cdf0e10cSrcweir         aParam.nCol1 = aRange.aStart.Col();
5936*cdf0e10cSrcweir         aParam.nRow1 = aRange.aStart.Row();
5937*cdf0e10cSrcweir         aParam.nCol2 = aRange.aEnd.Col();
5938*cdf0e10cSrcweir         aParam.nRow2 = aRange.aEnd.Row();
5939*cdf0e10cSrcweir 
5940*cdf0e10cSrcweir         //! TODO: could we get passed a valid result set by any means?
5941*cdf0e10cSrcweir 
5942*cdf0e10cSrcweir         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );       // ggf. Bereich anlegen
5943*cdf0e10cSrcweir 
5944*cdf0e10cSrcweir         ScDBDocFunc aFunc(*pDocSh);                         // Bereich muss angelegt sein
5945*cdf0e10cSrcweir         aFunc.DoImport( nTab, aParam, NULL, sal_True );         //! Api-Flag as parameter
5946*cdf0e10cSrcweir     }
5947*cdf0e10cSrcweir }
5948*cdf0e10cSrcweir 
5949*cdf0e10cSrcweir // XCellFormatRangesSupplier
5950*cdf0e10cSrcweir 
5951*cdf0e10cSrcweir uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangeObj::getCellFormatRanges()
5952*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
5953*cdf0e10cSrcweir {
5954*cdf0e10cSrcweir     ScUnoGuard aGuard;
5955*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5956*cdf0e10cSrcweir     if ( pDocSh )
5957*cdf0e10cSrcweir         return new ScCellFormatsObj( pDocSh, aRange );
5958*cdf0e10cSrcweir     return NULL;
5959*cdf0e10cSrcweir }
5960*cdf0e10cSrcweir 
5961*cdf0e10cSrcweir // XUniqueCellFormatRangesSupplier
5962*cdf0e10cSrcweir 
5963*cdf0e10cSrcweir uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangeObj::getUniqueCellFormatRanges()
5964*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
5965*cdf0e10cSrcweir {
5966*cdf0e10cSrcweir     ScUnoGuard aGuard;
5967*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
5968*cdf0e10cSrcweir     if ( pDocSh )
5969*cdf0e10cSrcweir         return new ScUniqueCellFormatsObj( pDocSh, aRange );
5970*cdf0e10cSrcweir     return NULL;
5971*cdf0e10cSrcweir }
5972*cdf0e10cSrcweir 
5973*cdf0e10cSrcweir // XPropertySet erweitert fuer Range-Properties
5974*cdf0e10cSrcweir 
5975*cdf0e10cSrcweir uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellRangeObj::getPropertySetInfo()
5976*cdf0e10cSrcweir                                                         throw(uno::RuntimeException)
5977*cdf0e10cSrcweir {
5978*cdf0e10cSrcweir     ScUnoGuard aGuard;
5979*cdf0e10cSrcweir     static uno::Reference<beans::XPropertySetInfo> aRef(
5980*cdf0e10cSrcweir         new SfxItemPropertySetInfo( pRangePropSet->getPropertyMap() ));
5981*cdf0e10cSrcweir     return aRef;
5982*cdf0e10cSrcweir }
5983*cdf0e10cSrcweir 
5984*cdf0e10cSrcweir void ScCellRangeObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
5985*cdf0e10cSrcweir                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
5986*cdf0e10cSrcweir {
5987*cdf0e10cSrcweir     //  Range has only Position and Size in addition to ScCellRangesBase, both are ReadOnly
5988*cdf0e10cSrcweir     //  -> nothing to do here
5989*cdf0e10cSrcweir 
5990*cdf0e10cSrcweir     ScCellRangesBase::SetOnePropertyValue( pEntry, aValue );
5991*cdf0e10cSrcweir }
5992*cdf0e10cSrcweir 
5993*cdf0e10cSrcweir void ScCellRangeObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
5994*cdf0e10cSrcweir                                             uno::Any& rAny )
5995*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
5996*cdf0e10cSrcweir {
5997*cdf0e10cSrcweir     if ( pEntry )
5998*cdf0e10cSrcweir     {
5999*cdf0e10cSrcweir         if ( pEntry->nWID == SC_WID_UNO_POS )
6000*cdf0e10cSrcweir         {
6001*cdf0e10cSrcweir             ScDocShell* pDocSh = GetDocShell();
6002*cdf0e10cSrcweir             if (pDocSh)
6003*cdf0e10cSrcweir             {
6004*cdf0e10cSrcweir                 //  GetMMRect converts using HMM_PER_TWIPS, like the DrawingLayer
6005*cdf0e10cSrcweir                 Rectangle aMMRect(pDocSh->GetDocument()->GetMMRect(
6006*cdf0e10cSrcweir                                         aRange.aStart.Col(), aRange.aStart.Row(),
6007*cdf0e10cSrcweir                                         aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab() ));
6008*cdf0e10cSrcweir                 awt::Point aPos( aMMRect.Left(), aMMRect.Top() );
6009*cdf0e10cSrcweir                 rAny <<= aPos;
6010*cdf0e10cSrcweir             }
6011*cdf0e10cSrcweir         }
6012*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_SIZE )
6013*cdf0e10cSrcweir         {
6014*cdf0e10cSrcweir             ScDocShell* pDocSh = GetDocShell();
6015*cdf0e10cSrcweir             if (pDocSh)
6016*cdf0e10cSrcweir             {
6017*cdf0e10cSrcweir                 //  GetMMRect converts using HMM_PER_TWIPS, like the DrawingLayer
6018*cdf0e10cSrcweir                 Rectangle aMMRect = pDocSh->GetDocument()->GetMMRect(
6019*cdf0e10cSrcweir                                         aRange.aStart.Col(), aRange.aStart.Row(),
6020*cdf0e10cSrcweir                                         aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab() );
6021*cdf0e10cSrcweir                 Size aSize(aMMRect.GetSize());
6022*cdf0e10cSrcweir                 awt::Size aAwtSize( aSize.Width(), aSize.Height() );
6023*cdf0e10cSrcweir                 rAny <<= aAwtSize;
6024*cdf0e10cSrcweir             }
6025*cdf0e10cSrcweir         }
6026*cdf0e10cSrcweir         else
6027*cdf0e10cSrcweir             ScCellRangesBase::GetOnePropertyValue( pEntry, rAny );
6028*cdf0e10cSrcweir 
6029*cdf0e10cSrcweir     }
6030*cdf0e10cSrcweir }
6031*cdf0e10cSrcweir 
6032*cdf0e10cSrcweir const SfxItemPropertyMap* ScCellRangeObj::GetItemPropertyMap()
6033*cdf0e10cSrcweir {
6034*cdf0e10cSrcweir     return pRangePropSet->getPropertyMap();
6035*cdf0e10cSrcweir }
6036*cdf0e10cSrcweir 
6037*cdf0e10cSrcweir // XServiceInfo
6038*cdf0e10cSrcweir 
6039*cdf0e10cSrcweir rtl::OUString SAL_CALL ScCellRangeObj::getImplementationName() throw(uno::RuntimeException)
6040*cdf0e10cSrcweir {
6041*cdf0e10cSrcweir     return rtl::OUString::createFromAscii( "ScCellRangeObj" );
6042*cdf0e10cSrcweir }
6043*cdf0e10cSrcweir 
6044*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellRangeObj::supportsService( const rtl::OUString& rServiceName )
6045*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
6046*cdf0e10cSrcweir {
6047*cdf0e10cSrcweir     String aServiceStr( rServiceName );
6048*cdf0e10cSrcweir     return aServiceStr.EqualsAscii( SCSHEETCELLRANGE_SERVICE ) ||
6049*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCELLRANGE_SERVICE ) ||
6050*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) ||
6051*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) ||
6052*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE );
6053*cdf0e10cSrcweir }
6054*cdf0e10cSrcweir 
6055*cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL ScCellRangeObj::getSupportedServiceNames()
6056*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
6057*cdf0e10cSrcweir {
6058*cdf0e10cSrcweir     uno::Sequence<rtl::OUString> aRet(5);
6059*cdf0e10cSrcweir     rtl::OUString* pArray = aRet.getArray();
6060*cdf0e10cSrcweir     pArray[0] = rtl::OUString::createFromAscii( SCSHEETCELLRANGE_SERVICE );
6061*cdf0e10cSrcweir     pArray[1] = rtl::OUString::createFromAscii( SCCELLRANGE_SERVICE );
6062*cdf0e10cSrcweir     pArray[2] = rtl::OUString::createFromAscii( SCCELLPROPERTIES_SERVICE );
6063*cdf0e10cSrcweir     pArray[3] = rtl::OUString::createFromAscii( SCCHARPROPERTIES_SERVICE );
6064*cdf0e10cSrcweir     pArray[4] = rtl::OUString::createFromAscii( SCPARAPROPERTIES_SERVICE );
6065*cdf0e10cSrcweir     return aRet;
6066*cdf0e10cSrcweir }
6067*cdf0e10cSrcweir 
6068*cdf0e10cSrcweir //------------------------------------------------------------------------
6069*cdf0e10cSrcweir 
6070*cdf0e10cSrcweir const SvxItemPropertySet* ScCellObj::GetEditPropertySet()      // static
6071*cdf0e10cSrcweir {
6072*cdf0e10cSrcweir     return lcl_GetEditPropertySet();
6073*cdf0e10cSrcweir }
6074*cdf0e10cSrcweir const SfxItemPropertyMap* ScCellObj::GetCellPropertyMap()
6075*cdf0e10cSrcweir {
6076*cdf0e10cSrcweir     return lcl_GetCellPropertySet()->getPropertyMap();
6077*cdf0e10cSrcweir }
6078*cdf0e10cSrcweir 
6079*cdf0e10cSrcweir ScCellObj::ScCellObj(ScDocShell* pDocSh, const ScAddress& rP) :
6080*cdf0e10cSrcweir     ScCellRangeObj( pDocSh, ScRange(rP,rP) ),
6081*cdf0e10cSrcweir     pUnoText( NULL ),
6082*cdf0e10cSrcweir     pCellPropSet( lcl_GetCellPropertySet() ),
6083*cdf0e10cSrcweir     aCellPos( rP ),
6084*cdf0e10cSrcweir     nActionLockCount( 0 )
6085*cdf0e10cSrcweir {
6086*cdf0e10cSrcweir     //  pUnoText is allocated on demand (GetUnoText)
6087*cdf0e10cSrcweir     //  can't be aggregated because getString/setString is handled here
6088*cdf0e10cSrcweir }
6089*cdf0e10cSrcweir 
6090*cdf0e10cSrcweir SvxUnoText& ScCellObj::GetUnoText()
6091*cdf0e10cSrcweir {
6092*cdf0e10cSrcweir     if (!pUnoText)
6093*cdf0e10cSrcweir     {
6094*cdf0e10cSrcweir         pUnoText = new ScCellTextObj( GetDocShell(), aCellPos );
6095*cdf0e10cSrcweir         pUnoText->acquire();
6096*cdf0e10cSrcweir         if (nActionLockCount)
6097*cdf0e10cSrcweir         {
6098*cdf0e10cSrcweir             ScSharedCellEditSource* pEditSource =
6099*cdf0e10cSrcweir                 static_cast<ScSharedCellEditSource*> (pUnoText->GetEditSource());
6100*cdf0e10cSrcweir             if (pEditSource)
6101*cdf0e10cSrcweir                 pEditSource->SetDoUpdateData(sal_False);
6102*cdf0e10cSrcweir         }
6103*cdf0e10cSrcweir     }
6104*cdf0e10cSrcweir     return *pUnoText;
6105*cdf0e10cSrcweir }
6106*cdf0e10cSrcweir 
6107*cdf0e10cSrcweir ScCellObj::~ScCellObj()
6108*cdf0e10cSrcweir {
6109*cdf0e10cSrcweir     if (pUnoText)
6110*cdf0e10cSrcweir         pUnoText->release();
6111*cdf0e10cSrcweir }
6112*cdf0e10cSrcweir 
6113*cdf0e10cSrcweir void ScCellObj::RefChanged()
6114*cdf0e10cSrcweir {
6115*cdf0e10cSrcweir     ScCellRangeObj::RefChanged();
6116*cdf0e10cSrcweir 
6117*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
6118*cdf0e10cSrcweir     DBG_ASSERT(rRanges.Count() == 1, "was fuer Ranges ?!?!");
6119*cdf0e10cSrcweir     const ScRange* pFirst = rRanges.GetObject(0);
6120*cdf0e10cSrcweir     if (pFirst)
6121*cdf0e10cSrcweir         aCellPos = pFirst->aStart;
6122*cdf0e10cSrcweir }
6123*cdf0e10cSrcweir 
6124*cdf0e10cSrcweir uno::Any SAL_CALL ScCellObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException)
6125*cdf0e10cSrcweir {
6126*cdf0e10cSrcweir     SC_QUERYINTERFACE( table::XCell )
6127*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XFormulaTokens )
6128*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XCellAddressable )
6129*cdf0e10cSrcweir     SC_QUERYINTERFACE( text::XText )
6130*cdf0e10cSrcweir     SC_QUERYINTERFACE( text::XSimpleText )
6131*cdf0e10cSrcweir     SC_QUERYINTERFACE( text::XTextRange )
6132*cdf0e10cSrcweir     SC_QUERYINTERFACE( container::XEnumerationAccess )
6133*cdf0e10cSrcweir     SC_QUERYINTERFACE( container::XElementAccess )
6134*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetAnnotationAnchor )
6135*cdf0e10cSrcweir     SC_QUERYINTERFACE( text::XTextFieldsSupplier )
6136*cdf0e10cSrcweir     SC_QUERYINTERFACE( document::XActionLockable )
6137*cdf0e10cSrcweir 
6138*cdf0e10cSrcweir     return ScCellRangeObj::queryInterface( rType );
6139*cdf0e10cSrcweir }
6140*cdf0e10cSrcweir 
6141*cdf0e10cSrcweir void SAL_CALL ScCellObj::acquire() throw()
6142*cdf0e10cSrcweir {
6143*cdf0e10cSrcweir     ScCellRangeObj::acquire();
6144*cdf0e10cSrcweir }
6145*cdf0e10cSrcweir 
6146*cdf0e10cSrcweir void SAL_CALL ScCellObj::release() throw()
6147*cdf0e10cSrcweir {
6148*cdf0e10cSrcweir     ScCellRangeObj::release();
6149*cdf0e10cSrcweir }
6150*cdf0e10cSrcweir 
6151*cdf0e10cSrcweir uno::Sequence<uno::Type> SAL_CALL ScCellObj::getTypes() throw(uno::RuntimeException)
6152*cdf0e10cSrcweir {
6153*cdf0e10cSrcweir     static uno::Sequence<uno::Type> aTypes;
6154*cdf0e10cSrcweir     if ( aTypes.getLength() == 0 )
6155*cdf0e10cSrcweir     {
6156*cdf0e10cSrcweir         uno::Sequence<uno::Type> aParentTypes(ScCellRangeObj::getTypes());
6157*cdf0e10cSrcweir         long nParentLen = aParentTypes.getLength();
6158*cdf0e10cSrcweir         const uno::Type* pParentPtr = aParentTypes.getConstArray();
6159*cdf0e10cSrcweir 
6160*cdf0e10cSrcweir         aTypes.realloc( nParentLen + 8 );
6161*cdf0e10cSrcweir         uno::Type* pPtr = aTypes.getArray();
6162*cdf0e10cSrcweir         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<table::XCell>*)0);
6163*cdf0e10cSrcweir         pPtr[nParentLen + 1] = getCppuType((const uno::Reference<sheet::XCellAddressable>*)0);
6164*cdf0e10cSrcweir         pPtr[nParentLen + 2] = getCppuType((const uno::Reference<text::XText>*)0);
6165*cdf0e10cSrcweir         pPtr[nParentLen + 3] = getCppuType((const uno::Reference<container::XEnumerationAccess>*)0);
6166*cdf0e10cSrcweir         pPtr[nParentLen + 4] = getCppuType((const uno::Reference<sheet::XSheetAnnotationAnchor>*)0);
6167*cdf0e10cSrcweir         pPtr[nParentLen + 5] = getCppuType((const uno::Reference<text::XTextFieldsSupplier>*)0);
6168*cdf0e10cSrcweir         pPtr[nParentLen + 6] = getCppuType((const uno::Reference<document::XActionLockable>*)0);
6169*cdf0e10cSrcweir         pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XFormulaTokens>*)0);
6170*cdf0e10cSrcweir 
6171*cdf0e10cSrcweir         for (long i=0; i<nParentLen; i++)
6172*cdf0e10cSrcweir             pPtr[i] = pParentPtr[i];                // parent types first
6173*cdf0e10cSrcweir     }
6174*cdf0e10cSrcweir     return aTypes;
6175*cdf0e10cSrcweir }
6176*cdf0e10cSrcweir 
6177*cdf0e10cSrcweir uno::Sequence<sal_Int8> SAL_CALL ScCellObj::getImplementationId() throw(uno::RuntimeException)
6178*cdf0e10cSrcweir {
6179*cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId;
6180*cdf0e10cSrcweir     if( aId.getLength() == 0 )
6181*cdf0e10cSrcweir     {
6182*cdf0e10cSrcweir         aId.realloc( 16 );
6183*cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
6184*cdf0e10cSrcweir     }
6185*cdf0e10cSrcweir     return aId;
6186*cdf0e10cSrcweir }
6187*cdf0e10cSrcweir 
6188*cdf0e10cSrcweir //  Hilfsfunktionen
6189*cdf0e10cSrcweir 
6190*cdf0e10cSrcweir String ScCellObj::GetInputString_Impl(sal_Bool bEnglish) const      // fuer getFormula / FormulaLocal
6191*cdf0e10cSrcweir {
6192*cdf0e10cSrcweir     if (GetDocShell())
6193*cdf0e10cSrcweir         return lcl_GetInputString( GetDocShell()->GetDocument(), aCellPos, bEnglish );
6194*cdf0e10cSrcweir     return String();
6195*cdf0e10cSrcweir }
6196*cdf0e10cSrcweir 
6197*cdf0e10cSrcweir String ScCellObj::GetOutputString_Impl(ScDocument* pDoc, const ScAddress& aCellPos)
6198*cdf0e10cSrcweir {
6199*cdf0e10cSrcweir     String aVal;
6200*cdf0e10cSrcweir     if ( pDoc )
6201*cdf0e10cSrcweir     {
6202*cdf0e10cSrcweir         ScBaseCell* pCell = pDoc->GetCell( aCellPos );
6203*cdf0e10cSrcweir         if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE )
6204*cdf0e10cSrcweir         {
6205*cdf0e10cSrcweir             if ( pCell->GetCellType() == CELLTYPE_EDIT )
6206*cdf0e10cSrcweir             {
6207*cdf0e10cSrcweir                 //  GetString an der EditCell macht Leerzeichen aus Umbruechen,
6208*cdf0e10cSrcweir                 //  hier werden die Umbrueche aber gebraucht
6209*cdf0e10cSrcweir                 const EditTextObject* pData = ((ScEditCell*)pCell)->GetData();
6210*cdf0e10cSrcweir                 if (pData)
6211*cdf0e10cSrcweir                 {
6212*cdf0e10cSrcweir                     EditEngine& rEngine = pDoc->GetEditEngine();
6213*cdf0e10cSrcweir                     rEngine.SetText( *pData );
6214*cdf0e10cSrcweir                     aVal = rEngine.GetText( LINEEND_LF );
6215*cdf0e10cSrcweir                 }
6216*cdf0e10cSrcweir                 //  Edit-Zellen auch nicht per NumberFormatter formatieren
6217*cdf0e10cSrcweir                 //  (passend zur Ausgabe)
6218*cdf0e10cSrcweir             }
6219*cdf0e10cSrcweir             else
6220*cdf0e10cSrcweir             {
6221*cdf0e10cSrcweir                 //  wie in GetString am Dokument (column)
6222*cdf0e10cSrcweir                 Color* pColor;
6223*cdf0e10cSrcweir                 sal_uLong nNumFmt = pDoc->GetNumberFormat( aCellPos );
6224*cdf0e10cSrcweir                 ScCellFormat::GetString( pCell, nNumFmt, aVal, &pColor, *pDoc->GetFormatTable() );
6225*cdf0e10cSrcweir             }
6226*cdf0e10cSrcweir         }
6227*cdf0e10cSrcweir     }
6228*cdf0e10cSrcweir     return aVal;
6229*cdf0e10cSrcweir }
6230*cdf0e10cSrcweir 
6231*cdf0e10cSrcweir String ScCellObj::GetOutputString_Impl() const
6232*cdf0e10cSrcweir {
6233*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6234*cdf0e10cSrcweir     String aVal;
6235*cdf0e10cSrcweir     if ( pDocSh )
6236*cdf0e10cSrcweir         aVal = GetOutputString_Impl(pDocSh->GetDocument(), aCellPos);
6237*cdf0e10cSrcweir     return aVal;
6238*cdf0e10cSrcweir }
6239*cdf0e10cSrcweir 
6240*cdf0e10cSrcweir void ScCellObj::SetString_Impl(const String& rString, sal_Bool bInterpret, sal_Bool bEnglish)
6241*cdf0e10cSrcweir {
6242*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6243*cdf0e10cSrcweir     if ( pDocSh )
6244*cdf0e10cSrcweir     {
6245*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
6246*cdf0e10cSrcweir         // GRAM_PODF_A1 for API compatibility.
6247*cdf0e10cSrcweir         (void)aFunc.SetCellText( aCellPos, rString, bInterpret, bEnglish, sal_True, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 );
6248*cdf0e10cSrcweir     }
6249*cdf0e10cSrcweir }
6250*cdf0e10cSrcweir 
6251*cdf0e10cSrcweir double ScCellObj::GetValue_Impl() const
6252*cdf0e10cSrcweir {
6253*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6254*cdf0e10cSrcweir     if ( pDocSh )
6255*cdf0e10cSrcweir         return pDocSh->GetDocument()->GetValue( aCellPos );
6256*cdf0e10cSrcweir 
6257*cdf0e10cSrcweir     return 0.0;
6258*cdf0e10cSrcweir }
6259*cdf0e10cSrcweir 
6260*cdf0e10cSrcweir void ScCellObj::SetValue_Impl(double fValue)
6261*cdf0e10cSrcweir {
6262*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6263*cdf0e10cSrcweir     if ( pDocSh )
6264*cdf0e10cSrcweir     {
6265*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
6266*cdf0e10cSrcweir         (void)aFunc.PutCell( aCellPos, new ScValueCell(fValue), sal_True );
6267*cdf0e10cSrcweir     }
6268*cdf0e10cSrcweir }
6269*cdf0e10cSrcweir 
6270*cdf0e10cSrcweir // only for XML import
6271*cdf0e10cSrcweir 
6272*cdf0e10cSrcweir void ScCellObj::SetFormulaResultString( const ::rtl::OUString& rResult )
6273*cdf0e10cSrcweir {
6274*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6275*cdf0e10cSrcweir     if ( pDocSh )
6276*cdf0e10cSrcweir     {
6277*cdf0e10cSrcweir         ScBaseCell* pCell = pDocSh->GetDocument()->GetCell( aCellPos );
6278*cdf0e10cSrcweir         if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA )
6279*cdf0e10cSrcweir             ((ScFormulaCell*)pCell)->SetHybridString( rResult );
6280*cdf0e10cSrcweir     }
6281*cdf0e10cSrcweir }
6282*cdf0e10cSrcweir 
6283*cdf0e10cSrcweir void ScCellObj::SetFormulaResultDouble( double fResult )
6284*cdf0e10cSrcweir {
6285*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6286*cdf0e10cSrcweir     if ( pDocSh )
6287*cdf0e10cSrcweir     {
6288*cdf0e10cSrcweir         ScBaseCell* pCell = pDocSh->GetDocument()->GetCell( aCellPos );
6289*cdf0e10cSrcweir         if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA )
6290*cdf0e10cSrcweir             ((ScFormulaCell*)pCell)->SetHybridDouble( fResult );
6291*cdf0e10cSrcweir     }
6292*cdf0e10cSrcweir }
6293*cdf0e10cSrcweir 
6294*cdf0e10cSrcweir void ScCellObj::SetFormulaWithGrammar( const ::rtl::OUString& rFormula,
6295*cdf0e10cSrcweir         const ::rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar )
6296*cdf0e10cSrcweir {
6297*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6298*cdf0e10cSrcweir     if ( pDocSh )
6299*cdf0e10cSrcweir     {
6300*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
6301*cdf0e10cSrcweir         aFunc.SetCellText( aCellPos, rFormula, sal_True, sal_True, sal_True, rFormulaNmsp, eGrammar);
6302*cdf0e10cSrcweir     }
6303*cdf0e10cSrcweir }
6304*cdf0e10cSrcweir 
6305*cdf0e10cSrcweir void ScCellObj::InputEnglishString( const ::rtl::OUString& rText )
6306*cdf0e10cSrcweir {
6307*cdf0e10cSrcweir     // This is like a mixture of setFormula and property FormulaLocal:
6308*cdf0e10cSrcweir     // The cell's number format is checked for "text", a new cell format may be set,
6309*cdf0e10cSrcweir     // but all parsing is in English.
6310*cdf0e10cSrcweir 
6311*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6312*cdf0e10cSrcweir     if ( pDocSh )
6313*cdf0e10cSrcweir     {
6314*cdf0e10cSrcweir         String aString(rText);
6315*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
6316*cdf0e10cSrcweir         SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
6317*cdf0e10cSrcweir         sal_uInt32 nOldFormat = pDoc->GetNumberFormat( aCellPos );
6318*cdf0e10cSrcweir         if ( pFormatter->GetType( nOldFormat ) == NUMBERFORMAT_TEXT )
6319*cdf0e10cSrcweir         {
6320*cdf0e10cSrcweir             SetString_Impl(aString, sal_False, sal_False);      // text cell
6321*cdf0e10cSrcweir         }
6322*cdf0e10cSrcweir         else
6323*cdf0e10cSrcweir         {
6324*cdf0e10cSrcweir             ScDocFunc aFunc(*pDocSh);
6325*cdf0e10cSrcweir             short nFormatType = 0;
6326*cdf0e10cSrcweir             ScBaseCell* pNewCell = aFunc.InterpretEnglishString( aCellPos, aString,
6327*cdf0e10cSrcweir                                     EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1, &nFormatType );
6328*cdf0e10cSrcweir             if (pNewCell)
6329*cdf0e10cSrcweir             {
6330*cdf0e10cSrcweir                 if ( ( nOldFormat % SV_COUNTRY_LANGUAGE_OFFSET ) == 0 && nFormatType != 0 )
6331*cdf0e10cSrcweir                 {
6332*cdf0e10cSrcweir                     // apply a format for the recognized type and the old format's language
6333*cdf0e10cSrcweir                     sal_uInt32 nNewFormat = ScGlobal::GetStandardFormat( *pFormatter, nOldFormat, nFormatType );
6334*cdf0e10cSrcweir                     if ( nNewFormat != nOldFormat )
6335*cdf0e10cSrcweir                     {
6336*cdf0e10cSrcweir                         ScPatternAttr aPattern( pDoc->GetPool() );
6337*cdf0e10cSrcweir                         aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) );
6338*cdf0e10cSrcweir                         // ATTR_LANGUAGE_FORMAT remains unchanged
6339*cdf0e10cSrcweir                         aFunc.ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True );
6340*cdf0e10cSrcweir                     }
6341*cdf0e10cSrcweir                 }
6342*cdf0e10cSrcweir                 // put the cell into the document
6343*cdf0e10cSrcweir                 // (after applying the format, so possible formula recalculation already uses the new format)
6344*cdf0e10cSrcweir                 (void)aFunc.PutCell( aCellPos, pNewCell, sal_True );
6345*cdf0e10cSrcweir             }
6346*cdf0e10cSrcweir             else
6347*cdf0e10cSrcweir                 SetString_Impl(aString, sal_False, sal_False);      // no cell from InterpretEnglishString, probably empty string
6348*cdf0e10cSrcweir         }
6349*cdf0e10cSrcweir     }
6350*cdf0e10cSrcweir }
6351*cdf0e10cSrcweir 
6352*cdf0e10cSrcweir //  XText
6353*cdf0e10cSrcweir 
6354*cdf0e10cSrcweir uno::Reference<text::XTextCursor> SAL_CALL ScCellObj::createTextCursor()
6355*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
6356*cdf0e10cSrcweir {
6357*cdf0e10cSrcweir     ScUnoGuard aGuard;
6358*cdf0e10cSrcweir     return new ScCellTextCursor( *this );
6359*cdf0e10cSrcweir }
6360*cdf0e10cSrcweir 
6361*cdf0e10cSrcweir uno::Reference<text::XTextCursor> SAL_CALL ScCellObj::createTextCursorByRange(
6362*cdf0e10cSrcweir                                     const uno::Reference<text::XTextRange>& aTextPosition )
6363*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
6364*cdf0e10cSrcweir {
6365*cdf0e10cSrcweir     ScUnoGuard aGuard;
6366*cdf0e10cSrcweir     SvxUnoTextCursor* pCursor = new ScCellTextCursor( *this );
6367*cdf0e10cSrcweir     uno::Reference<text::XTextCursor> xCursor(pCursor);
6368*cdf0e10cSrcweir 
6369*cdf0e10cSrcweir     SvxUnoTextRangeBase* pRange = SvxUnoTextRangeBase::getImplementation( aTextPosition );
6370*cdf0e10cSrcweir     if(pRange)
6371*cdf0e10cSrcweir         pCursor->SetSelection( pRange->GetSelection() );
6372*cdf0e10cSrcweir     else
6373*cdf0e10cSrcweir     {
6374*cdf0e10cSrcweir         ScCellTextCursor* pOther = ScCellTextCursor::getImplementation( aTextPosition );
6375*cdf0e10cSrcweir         if(pOther)
6376*cdf0e10cSrcweir             pCursor->SetSelection( pOther->GetSelection() );
6377*cdf0e10cSrcweir         else
6378*cdf0e10cSrcweir             throw uno::RuntimeException();
6379*cdf0e10cSrcweir     }
6380*cdf0e10cSrcweir 
6381*cdf0e10cSrcweir     return xCursor;
6382*cdf0e10cSrcweir }
6383*cdf0e10cSrcweir 
6384*cdf0e10cSrcweir rtl::OUString SAL_CALL ScCellObj::getString() throw(uno::RuntimeException)
6385*cdf0e10cSrcweir {
6386*cdf0e10cSrcweir     ScUnoGuard aGuard;
6387*cdf0e10cSrcweir     return GetOutputString_Impl();
6388*cdf0e10cSrcweir }
6389*cdf0e10cSrcweir 
6390*cdf0e10cSrcweir void SAL_CALL ScCellObj::setString( const rtl::OUString& aText ) throw(uno::RuntimeException)
6391*cdf0e10cSrcweir {
6392*cdf0e10cSrcweir     ScUnoGuard aGuard;
6393*cdf0e10cSrcweir     String aString(aText);
6394*cdf0e10cSrcweir     SetString_Impl(aString, sal_False, sal_False);  // immer Text
6395*cdf0e10cSrcweir 
6396*cdf0e10cSrcweir     // don't create pUnoText here if not there
6397*cdf0e10cSrcweir     if (pUnoText)
6398*cdf0e10cSrcweir         pUnoText->SetSelection(ESelection( 0,0, 0,aString.Len() ));
6399*cdf0e10cSrcweir }
6400*cdf0e10cSrcweir 
6401*cdf0e10cSrcweir void SAL_CALL ScCellObj::insertString( const uno::Reference<text::XTextRange>& xRange,
6402*cdf0e10cSrcweir                                         const rtl::OUString& aString, sal_Bool bAbsorb )
6403*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
6404*cdf0e10cSrcweir {
6405*cdf0e10cSrcweir     // special handling for ScCellTextCursor is no longer needed,
6406*cdf0e10cSrcweir     // SvxUnoText::insertString checks for SvxUnoTextRangeBase instead of SvxUnoTextRange
6407*cdf0e10cSrcweir 
6408*cdf0e10cSrcweir     ScUnoGuard aGuard;
6409*cdf0e10cSrcweir     GetUnoText().insertString(xRange, aString, bAbsorb);
6410*cdf0e10cSrcweir }
6411*cdf0e10cSrcweir 
6412*cdf0e10cSrcweir void SAL_CALL ScCellObj::insertControlCharacter( const uno::Reference<text::XTextRange>& xRange,
6413*cdf0e10cSrcweir                                                 sal_Int16 nControlCharacter, sal_Bool bAbsorb )
6414*cdf0e10cSrcweir                                     throw(lang::IllegalArgumentException, uno::RuntimeException)
6415*cdf0e10cSrcweir {
6416*cdf0e10cSrcweir     ScUnoGuard aGuard;
6417*cdf0e10cSrcweir     GetUnoText().insertControlCharacter(xRange, nControlCharacter, bAbsorb);
6418*cdf0e10cSrcweir }
6419*cdf0e10cSrcweir 
6420*cdf0e10cSrcweir void SAL_CALL ScCellObj::insertTextContent( const uno::Reference<text::XTextRange >& xRange,
6421*cdf0e10cSrcweir                                                 const uno::Reference<text::XTextContent >& xContent,
6422*cdf0e10cSrcweir                                                 sal_Bool bAbsorb )
6423*cdf0e10cSrcweir                                     throw(lang::IllegalArgumentException, uno::RuntimeException)
6424*cdf0e10cSrcweir {
6425*cdf0e10cSrcweir     ScUnoGuard aGuard;
6426*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6427*cdf0e10cSrcweir     if ( pDocSh && xContent.is() )
6428*cdf0e10cSrcweir     {
6429*cdf0e10cSrcweir         ScCellFieldObj* pCellField = ScCellFieldObj::getImplementation( xContent );
6430*cdf0e10cSrcweir         SvxUnoTextRangeBase* pTextRange = ScCellTextCursor::getImplementation( xRange );
6431*cdf0e10cSrcweir 
6432*cdf0e10cSrcweir #if 0
6433*cdf0e10cSrcweir         if (!pTextRange)
6434*cdf0e10cSrcweir             pTextRange = SvxUnoTextRangeBase::getImplementation( xRange );
6435*cdf0e10cSrcweir 
6436*cdf0e10cSrcweir         //! bei SvxUnoTextRange testen, ob in passendem Objekt !!!
6437*cdf0e10cSrcweir #endif
6438*cdf0e10cSrcweir 
6439*cdf0e10cSrcweir         if ( pCellField && !pCellField->IsInserted() && pTextRange )
6440*cdf0e10cSrcweir         {
6441*cdf0e10cSrcweir             SvxEditSource* pEditSource = pTextRange->GetEditSource();
6442*cdf0e10cSrcweir             ESelection aSelection(pTextRange->GetSelection());
6443*cdf0e10cSrcweir 
6444*cdf0e10cSrcweir             if (!bAbsorb)
6445*cdf0e10cSrcweir             {
6446*cdf0e10cSrcweir                 //  nicht ersetzen -> hinten anhaengen
6447*cdf0e10cSrcweir                 aSelection.Adjust();
6448*cdf0e10cSrcweir                 aSelection.nStartPara = aSelection.nEndPara;
6449*cdf0e10cSrcweir                 aSelection.nStartPos  = aSelection.nEndPos;
6450*cdf0e10cSrcweir             }
6451*cdf0e10cSrcweir 
6452*cdf0e10cSrcweir             SvxFieldItem aItem(pCellField->CreateFieldItem());
6453*cdf0e10cSrcweir 
6454*cdf0e10cSrcweir             SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder();
6455*cdf0e10cSrcweir             pForwarder->QuickInsertField( aItem, aSelection );
6456*cdf0e10cSrcweir             pEditSource->UpdateData();
6457*cdf0e10cSrcweir 
6458*cdf0e10cSrcweir             //  neue Selektion: ein Zeichen
6459*cdf0e10cSrcweir             aSelection.Adjust();
6460*cdf0e10cSrcweir             aSelection.nEndPara = aSelection.nStartPara;
6461*cdf0e10cSrcweir             aSelection.nEndPos = aSelection.nStartPos + 1;
6462*cdf0e10cSrcweir             pCellField->InitDoc( pDocSh, aCellPos, aSelection );
6463*cdf0e10cSrcweir 
6464*cdf0e10cSrcweir             //  #91431# for bAbsorb=sal_False, the new selection must be behind the inserted content
6465*cdf0e10cSrcweir             //  (the xml filter relies on this)
6466*cdf0e10cSrcweir             if (!bAbsorb)
6467*cdf0e10cSrcweir                 aSelection.nStartPos = aSelection.nEndPos;
6468*cdf0e10cSrcweir 
6469*cdf0e10cSrcweir             pTextRange->SetSelection( aSelection );
6470*cdf0e10cSrcweir 
6471*cdf0e10cSrcweir             return;
6472*cdf0e10cSrcweir         }
6473*cdf0e10cSrcweir     }
6474*cdf0e10cSrcweir     GetUnoText().insertTextContent(xRange, xContent, bAbsorb);
6475*cdf0e10cSrcweir }
6476*cdf0e10cSrcweir 
6477*cdf0e10cSrcweir void SAL_CALL ScCellObj::removeTextContent( const uno::Reference<text::XTextContent>& xContent )
6478*cdf0e10cSrcweir                                 throw(container::NoSuchElementException, uno::RuntimeException)
6479*cdf0e10cSrcweir {
6480*cdf0e10cSrcweir     ScUnoGuard aGuard;
6481*cdf0e10cSrcweir     if ( xContent.is() )
6482*cdf0e10cSrcweir     {
6483*cdf0e10cSrcweir         ScCellFieldObj* pCellField = ScCellFieldObj::getImplementation( xContent );
6484*cdf0e10cSrcweir         if ( pCellField && pCellField->IsInserted() )
6485*cdf0e10cSrcweir         {
6486*cdf0e10cSrcweir             //! Testen, ob das Feld in dieser Zelle ist
6487*cdf0e10cSrcweir             pCellField->DeleteField();
6488*cdf0e10cSrcweir             return;
6489*cdf0e10cSrcweir         }
6490*cdf0e10cSrcweir     }
6491*cdf0e10cSrcweir     GetUnoText().removeTextContent(xContent);
6492*cdf0e10cSrcweir }
6493*cdf0e10cSrcweir 
6494*cdf0e10cSrcweir uno::Reference<text::XText> SAL_CALL ScCellObj::getText() throw(uno::RuntimeException)
6495*cdf0e10cSrcweir {
6496*cdf0e10cSrcweir     ScUnoGuard aGuard;
6497*cdf0e10cSrcweir     return this;
6498*cdf0e10cSrcweir }
6499*cdf0e10cSrcweir 
6500*cdf0e10cSrcweir uno::Reference<text::XTextRange> SAL_CALL ScCellObj::getStart() throw(uno::RuntimeException)
6501*cdf0e10cSrcweir {
6502*cdf0e10cSrcweir     ScUnoGuard aGuard;
6503*cdf0e10cSrcweir     return GetUnoText().getStart();
6504*cdf0e10cSrcweir }
6505*cdf0e10cSrcweir 
6506*cdf0e10cSrcweir uno::Reference<text::XTextRange> SAL_CALL ScCellObj::getEnd() throw(uno::RuntimeException)
6507*cdf0e10cSrcweir {
6508*cdf0e10cSrcweir     ScUnoGuard aGuard;
6509*cdf0e10cSrcweir     return GetUnoText().getEnd();
6510*cdf0e10cSrcweir }
6511*cdf0e10cSrcweir 
6512*cdf0e10cSrcweir uno::Reference<container::XEnumeration> SAL_CALL ScCellObj::createEnumeration()
6513*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
6514*cdf0e10cSrcweir {
6515*cdf0e10cSrcweir     ScUnoGuard aGuard;
6516*cdf0e10cSrcweir     return GetUnoText().createEnumeration();
6517*cdf0e10cSrcweir }
6518*cdf0e10cSrcweir 
6519*cdf0e10cSrcweir uno::Type SAL_CALL ScCellObj::getElementType() throw(uno::RuntimeException)
6520*cdf0e10cSrcweir {
6521*cdf0e10cSrcweir     ScUnoGuard aGuard;
6522*cdf0e10cSrcweir     return GetUnoText().getElementType();
6523*cdf0e10cSrcweir }
6524*cdf0e10cSrcweir 
6525*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellObj::hasElements() throw(uno::RuntimeException)
6526*cdf0e10cSrcweir {
6527*cdf0e10cSrcweir     ScUnoGuard aGuard;
6528*cdf0e10cSrcweir     return GetUnoText().hasElements();
6529*cdf0e10cSrcweir }
6530*cdf0e10cSrcweir 
6531*cdf0e10cSrcweir //  XCell
6532*cdf0e10cSrcweir 
6533*cdf0e10cSrcweir rtl::OUString SAL_CALL ScCellObj::getFormula() throw(uno::RuntimeException)
6534*cdf0e10cSrcweir {
6535*cdf0e10cSrcweir     ScUnoGuard aGuard;
6536*cdf0e10cSrcweir     //  sal_True = englisch
6537*cdf0e10cSrcweir     return GetInputString_Impl(sal_True);
6538*cdf0e10cSrcweir }
6539*cdf0e10cSrcweir 
6540*cdf0e10cSrcweir void SAL_CALL ScCellObj::setFormula( const rtl::OUString& aFormula ) throw(uno::RuntimeException)
6541*cdf0e10cSrcweir {
6542*cdf0e10cSrcweir     ScUnoGuard aGuard;
6543*cdf0e10cSrcweir     String aString(aFormula);
6544*cdf0e10cSrcweir     SetString_Impl(aString, sal_True, sal_True);    // englisch interpretieren
6545*cdf0e10cSrcweir }
6546*cdf0e10cSrcweir 
6547*cdf0e10cSrcweir double SAL_CALL ScCellObj::getValue() throw(uno::RuntimeException)
6548*cdf0e10cSrcweir {
6549*cdf0e10cSrcweir     ScUnoGuard aGuard;
6550*cdf0e10cSrcweir     return GetValue_Impl();
6551*cdf0e10cSrcweir }
6552*cdf0e10cSrcweir 
6553*cdf0e10cSrcweir void SAL_CALL ScCellObj::setValue( double nValue ) throw(uno::RuntimeException)
6554*cdf0e10cSrcweir {
6555*cdf0e10cSrcweir     ScUnoGuard aGuard;
6556*cdf0e10cSrcweir     SetValue_Impl(nValue);
6557*cdf0e10cSrcweir }
6558*cdf0e10cSrcweir 
6559*cdf0e10cSrcweir table::CellContentType SAL_CALL ScCellObj::getType() throw(uno::RuntimeException)
6560*cdf0e10cSrcweir {
6561*cdf0e10cSrcweir     ScUnoGuard aGuard;
6562*cdf0e10cSrcweir     table::CellContentType eRet = table::CellContentType_EMPTY;
6563*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6564*cdf0e10cSrcweir     if (pDocSh)
6565*cdf0e10cSrcweir     {
6566*cdf0e10cSrcweir         CellType eCalcType = pDocSh->GetDocument()->GetCellType( aCellPos );
6567*cdf0e10cSrcweir         switch (eCalcType)
6568*cdf0e10cSrcweir         {
6569*cdf0e10cSrcweir             case CELLTYPE_VALUE:
6570*cdf0e10cSrcweir                 eRet = table::CellContentType_VALUE;
6571*cdf0e10cSrcweir                 break;
6572*cdf0e10cSrcweir             case CELLTYPE_STRING:
6573*cdf0e10cSrcweir             case CELLTYPE_EDIT:
6574*cdf0e10cSrcweir                 eRet = table::CellContentType_TEXT;
6575*cdf0e10cSrcweir                 break;
6576*cdf0e10cSrcweir             case CELLTYPE_FORMULA:
6577*cdf0e10cSrcweir                 eRet = table::CellContentType_FORMULA;
6578*cdf0e10cSrcweir                 break;
6579*cdf0e10cSrcweir             default:
6580*cdf0e10cSrcweir                 eRet = table::CellContentType_EMPTY;
6581*cdf0e10cSrcweir         }
6582*cdf0e10cSrcweir     }
6583*cdf0e10cSrcweir     else
6584*cdf0e10cSrcweir     {
6585*cdf0e10cSrcweir         DBG_ERROR("keine DocShell");        //! Exception oder so?
6586*cdf0e10cSrcweir     }
6587*cdf0e10cSrcweir 
6588*cdf0e10cSrcweir     return eRet;
6589*cdf0e10cSrcweir }
6590*cdf0e10cSrcweir 
6591*cdf0e10cSrcweir table::CellContentType ScCellObj::GetResultType_Impl()
6592*cdf0e10cSrcweir {
6593*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6594*cdf0e10cSrcweir     if ( pDocSh )
6595*cdf0e10cSrcweir     {
6596*cdf0e10cSrcweir         ScBaseCell* pCell = pDocSh->GetDocument()->GetCell(aCellPos);
6597*cdf0e10cSrcweir         if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA )
6598*cdf0e10cSrcweir         {
6599*cdf0e10cSrcweir             sal_Bool bValue = ((ScFormulaCell*)pCell)->IsValue();
6600*cdf0e10cSrcweir             return bValue ? table::CellContentType_VALUE : table::CellContentType_TEXT;
6601*cdf0e10cSrcweir         }
6602*cdf0e10cSrcweir     }
6603*cdf0e10cSrcweir     return getType();   // wenn keine Formel
6604*cdf0e10cSrcweir }
6605*cdf0e10cSrcweir 
6606*cdf0e10cSrcweir sal_Int32 SAL_CALL ScCellObj::getError() throw(uno::RuntimeException)
6607*cdf0e10cSrcweir {
6608*cdf0e10cSrcweir     ScUnoGuard aGuard;
6609*cdf0e10cSrcweir     sal_uInt16 nError = 0;
6610*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6611*cdf0e10cSrcweir     if (pDocSh)
6612*cdf0e10cSrcweir     {
6613*cdf0e10cSrcweir         ScBaseCell* pCell = pDocSh->GetDocument()->GetCell( aCellPos );
6614*cdf0e10cSrcweir         if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA )
6615*cdf0e10cSrcweir             nError = ((ScFormulaCell*)pCell)->GetErrCode();
6616*cdf0e10cSrcweir         // sonst bleibt's bei 0
6617*cdf0e10cSrcweir     }
6618*cdf0e10cSrcweir     else
6619*cdf0e10cSrcweir     {
6620*cdf0e10cSrcweir         DBG_ERROR("keine DocShell");        //! Exception oder so?
6621*cdf0e10cSrcweir     }
6622*cdf0e10cSrcweir 
6623*cdf0e10cSrcweir     return nError;
6624*cdf0e10cSrcweir }
6625*cdf0e10cSrcweir 
6626*cdf0e10cSrcweir // XFormulaTokens
6627*cdf0e10cSrcweir 
6628*cdf0e10cSrcweir uno::Sequence<sheet::FormulaToken> SAL_CALL ScCellObj::getTokens() throw(uno::RuntimeException)
6629*cdf0e10cSrcweir {
6630*cdf0e10cSrcweir     ScUnoGuard aGuard;
6631*cdf0e10cSrcweir     uno::Sequence<sheet::FormulaToken> aSequence;
6632*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6633*cdf0e10cSrcweir     if ( pDocSh )
6634*cdf0e10cSrcweir     {
6635*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
6636*cdf0e10cSrcweir         ScBaseCell* pCell = pDoc->GetCell( aCellPos );
6637*cdf0e10cSrcweir         if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA )
6638*cdf0e10cSrcweir         {
6639*cdf0e10cSrcweir             ScTokenArray* pTokenArray = static_cast<ScFormulaCell*>(pCell)->GetCode();
6640*cdf0e10cSrcweir             if ( pTokenArray )
6641*cdf0e10cSrcweir                 (void)ScTokenConversion::ConvertToTokenSequence( *pDoc, aSequence, *pTokenArray );
6642*cdf0e10cSrcweir         }
6643*cdf0e10cSrcweir     }
6644*cdf0e10cSrcweir     return aSequence;
6645*cdf0e10cSrcweir }
6646*cdf0e10cSrcweir 
6647*cdf0e10cSrcweir void SAL_CALL ScCellObj::setTokens( const uno::Sequence<sheet::FormulaToken>& rTokens ) throw(uno::RuntimeException)
6648*cdf0e10cSrcweir {
6649*cdf0e10cSrcweir     ScUnoGuard aGuard;
6650*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6651*cdf0e10cSrcweir     if ( pDocSh )
6652*cdf0e10cSrcweir     {
6653*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
6654*cdf0e10cSrcweir         ScTokenArray aTokenArray;
6655*cdf0e10cSrcweir         (void)ScTokenConversion::ConvertToTokenArray( *pDoc, aTokenArray, rTokens );
6656*cdf0e10cSrcweir 
6657*cdf0e10cSrcweir         ScDocFunc aFunc( *pDocSh );
6658*cdf0e10cSrcweir         ScBaseCell* pNewCell = new ScFormulaCell( pDoc, aCellPos, &aTokenArray );
6659*cdf0e10cSrcweir         (void)aFunc.PutCell( aCellPos, pNewCell, sal_True );
6660*cdf0e10cSrcweir     }
6661*cdf0e10cSrcweir }
6662*cdf0e10cSrcweir 
6663*cdf0e10cSrcweir // XCellAddressable
6664*cdf0e10cSrcweir 
6665*cdf0e10cSrcweir table::CellAddress SAL_CALL ScCellObj::getCellAddress() throw(uno::RuntimeException)
6666*cdf0e10cSrcweir {
6667*cdf0e10cSrcweir     ScUnoGuard aGuard;
6668*cdf0e10cSrcweir     table::CellAddress aAdr;
6669*cdf0e10cSrcweir     aAdr.Sheet  = aCellPos.Tab();
6670*cdf0e10cSrcweir     aAdr.Column = aCellPos.Col();
6671*cdf0e10cSrcweir     aAdr.Row    = aCellPos.Row();
6672*cdf0e10cSrcweir     return aAdr;
6673*cdf0e10cSrcweir }
6674*cdf0e10cSrcweir 
6675*cdf0e10cSrcweir // XSheetAnnotationAnchor
6676*cdf0e10cSrcweir 
6677*cdf0e10cSrcweir uno::Reference<sheet::XSheetAnnotation> SAL_CALL ScCellObj::getAnnotation()
6678*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
6679*cdf0e10cSrcweir {
6680*cdf0e10cSrcweir     ScUnoGuard aGuard;
6681*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6682*cdf0e10cSrcweir     if ( pDocSh )
6683*cdf0e10cSrcweir         return new ScAnnotationObj( pDocSh, aCellPos );
6684*cdf0e10cSrcweir 
6685*cdf0e10cSrcweir     DBG_ERROR("getAnnotation ohne DocShell");
6686*cdf0e10cSrcweir     return NULL;
6687*cdf0e10cSrcweir }
6688*cdf0e10cSrcweir 
6689*cdf0e10cSrcweir // XFieldTypesSupplier
6690*cdf0e10cSrcweir 
6691*cdf0e10cSrcweir uno::Reference<container::XEnumerationAccess> SAL_CALL ScCellObj::getTextFields()
6692*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
6693*cdf0e10cSrcweir {
6694*cdf0e10cSrcweir     ScUnoGuard aGuard;
6695*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
6696*cdf0e10cSrcweir     if ( pDocSh )
6697*cdf0e10cSrcweir         return new ScCellFieldsObj( pDocSh, aCellPos );
6698*cdf0e10cSrcweir 
6699*cdf0e10cSrcweir     return NULL;
6700*cdf0e10cSrcweir }
6701*cdf0e10cSrcweir 
6702*cdf0e10cSrcweir uno::Reference<container::XNameAccess> SAL_CALL ScCellObj::getTextFieldMasters()
6703*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
6704*cdf0e10cSrcweir {
6705*cdf0e10cSrcweir     //  sowas gibts nicht im Calc (?)
6706*cdf0e10cSrcweir     return NULL;
6707*cdf0e10cSrcweir }
6708*cdf0e10cSrcweir 
6709*cdf0e10cSrcweir // XPropertySet erweitert fuer Zell-Properties
6710*cdf0e10cSrcweir 
6711*cdf0e10cSrcweir uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellObj::getPropertySetInfo()
6712*cdf0e10cSrcweir                                                         throw(uno::RuntimeException)
6713*cdf0e10cSrcweir {
6714*cdf0e10cSrcweir     ScUnoGuard aGuard;
6715*cdf0e10cSrcweir     static uno::Reference<beans::XPropertySetInfo> aRef(
6716*cdf0e10cSrcweir         new SfxItemPropertySetInfo( pCellPropSet->getPropertyMap() ));
6717*cdf0e10cSrcweir     return aRef;
6718*cdf0e10cSrcweir }
6719*cdf0e10cSrcweir 
6720*cdf0e10cSrcweir void ScCellObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
6721*cdf0e10cSrcweir                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
6722*cdf0e10cSrcweir {
6723*cdf0e10cSrcweir     if ( pEntry )
6724*cdf0e10cSrcweir     {
6725*cdf0e10cSrcweir         if ( pEntry->nWID == SC_WID_UNO_FORMLOC )
6726*cdf0e10cSrcweir         {
6727*cdf0e10cSrcweir             rtl::OUString aStrVal;
6728*cdf0e10cSrcweir             aValue >>= aStrVal;
6729*cdf0e10cSrcweir             String aString(aStrVal);
6730*cdf0e10cSrcweir             SetString_Impl(aString, sal_True, sal_False);   // lokal interpretieren
6731*cdf0e10cSrcweir         }
6732*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_FORMRT )
6733*cdf0e10cSrcweir         {
6734*cdf0e10cSrcweir             //  Read-Only
6735*cdf0e10cSrcweir             //! Exception oder so...
6736*cdf0e10cSrcweir         }
6737*cdf0e10cSrcweir         else
6738*cdf0e10cSrcweir             ScCellRangeObj::SetOnePropertyValue( pEntry, aValue );
6739*cdf0e10cSrcweir     }
6740*cdf0e10cSrcweir }
6741*cdf0e10cSrcweir 
6742*cdf0e10cSrcweir void ScCellObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
6743*cdf0e10cSrcweir                                         uno::Any& rAny )
6744*cdf0e10cSrcweir                                             throw(uno::RuntimeException)
6745*cdf0e10cSrcweir {
6746*cdf0e10cSrcweir     if ( pEntry )
6747*cdf0e10cSrcweir     {
6748*cdf0e10cSrcweir         if ( pEntry->nWID == SC_WID_UNO_FORMLOC )
6749*cdf0e10cSrcweir         {
6750*cdf0e10cSrcweir             // sal_False = lokal
6751*cdf0e10cSrcweir             rAny <<= rtl::OUString( GetInputString_Impl(sal_False) );
6752*cdf0e10cSrcweir         }
6753*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_FORMRT )
6754*cdf0e10cSrcweir         {
6755*cdf0e10cSrcweir             table::CellContentType eType = GetResultType_Impl();
6756*cdf0e10cSrcweir             rAny <<= eType;
6757*cdf0e10cSrcweir         }
6758*cdf0e10cSrcweir         else
6759*cdf0e10cSrcweir             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
6760*cdf0e10cSrcweir     }
6761*cdf0e10cSrcweir }
6762*cdf0e10cSrcweir 
6763*cdf0e10cSrcweir const SfxItemPropertyMap* ScCellObj::GetItemPropertyMap()
6764*cdf0e10cSrcweir {
6765*cdf0e10cSrcweir     return pCellPropSet->getPropertyMap();
6766*cdf0e10cSrcweir }
6767*cdf0e10cSrcweir 
6768*cdf0e10cSrcweir // XServiceInfo
6769*cdf0e10cSrcweir 
6770*cdf0e10cSrcweir rtl::OUString SAL_CALL ScCellObj::getImplementationName() throw(uno::RuntimeException)
6771*cdf0e10cSrcweir {
6772*cdf0e10cSrcweir     return rtl::OUString::createFromAscii( "ScCellObj" );
6773*cdf0e10cSrcweir }
6774*cdf0e10cSrcweir 
6775*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellObj::supportsService( const rtl::OUString& rServiceName )
6776*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
6777*cdf0e10cSrcweir {
6778*cdf0e10cSrcweir     //  CellRange/SheetCellRange are not in SheetCell service description,
6779*cdf0e10cSrcweir     //  but ScCellObj is used instead of ScCellRangeObj in CellRanges collections,
6780*cdf0e10cSrcweir     //  so it must support them
6781*cdf0e10cSrcweir 
6782*cdf0e10cSrcweir     String aServiceStr(rServiceName);
6783*cdf0e10cSrcweir     return aServiceStr.EqualsAscii( SCSHEETCELL_SERVICE ) ||
6784*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCELL_SERVICE ) ||
6785*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) ||
6786*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) ||
6787*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE ) ||
6788*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCSHEETCELLRANGE_SERVICE ) ||
6789*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCELLRANGE_SERVICE );
6790*cdf0e10cSrcweir }
6791*cdf0e10cSrcweir 
6792*cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL ScCellObj::getSupportedServiceNames()
6793*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
6794*cdf0e10cSrcweir {
6795*cdf0e10cSrcweir     uno::Sequence<rtl::OUString> aRet(7);
6796*cdf0e10cSrcweir     rtl::OUString* pArray = aRet.getArray();
6797*cdf0e10cSrcweir     pArray[0] = rtl::OUString::createFromAscii( SCSHEETCELL_SERVICE );
6798*cdf0e10cSrcweir     pArray[1] = rtl::OUString::createFromAscii( SCCELL_SERVICE );
6799*cdf0e10cSrcweir     pArray[2] = rtl::OUString::createFromAscii( SCCELLPROPERTIES_SERVICE );
6800*cdf0e10cSrcweir     pArray[3] = rtl::OUString::createFromAscii( SCCHARPROPERTIES_SERVICE );
6801*cdf0e10cSrcweir     pArray[4] = rtl::OUString::createFromAscii( SCPARAPROPERTIES_SERVICE );
6802*cdf0e10cSrcweir     pArray[5] = rtl::OUString::createFromAscii( SCSHEETCELLRANGE_SERVICE );
6803*cdf0e10cSrcweir     pArray[6] = rtl::OUString::createFromAscii( SCCELLRANGE_SERVICE );
6804*cdf0e10cSrcweir     return aRet;
6805*cdf0e10cSrcweir }
6806*cdf0e10cSrcweir 
6807*cdf0e10cSrcweir // XActionLockable
6808*cdf0e10cSrcweir 
6809*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellObj::isActionLocked() throw(uno::RuntimeException)
6810*cdf0e10cSrcweir {
6811*cdf0e10cSrcweir     ScUnoGuard aGuard;
6812*cdf0e10cSrcweir     return nActionLockCount != 0;
6813*cdf0e10cSrcweir }
6814*cdf0e10cSrcweir 
6815*cdf0e10cSrcweir void SAL_CALL ScCellObj::addActionLock() throw(uno::RuntimeException)
6816*cdf0e10cSrcweir {
6817*cdf0e10cSrcweir     ScUnoGuard aGuard;
6818*cdf0e10cSrcweir     if (!nActionLockCount)
6819*cdf0e10cSrcweir     {
6820*cdf0e10cSrcweir         if (pUnoText)
6821*cdf0e10cSrcweir         {
6822*cdf0e10cSrcweir             ScSharedCellEditSource* pEditSource =
6823*cdf0e10cSrcweir                 static_cast<ScSharedCellEditSource*> (pUnoText->GetEditSource());
6824*cdf0e10cSrcweir             if (pEditSource)
6825*cdf0e10cSrcweir                 pEditSource->SetDoUpdateData(sal_False);
6826*cdf0e10cSrcweir         }
6827*cdf0e10cSrcweir     }
6828*cdf0e10cSrcweir     nActionLockCount++;
6829*cdf0e10cSrcweir }
6830*cdf0e10cSrcweir 
6831*cdf0e10cSrcweir void SAL_CALL ScCellObj::removeActionLock() throw(uno::RuntimeException)
6832*cdf0e10cSrcweir {
6833*cdf0e10cSrcweir     ScUnoGuard aGuard;
6834*cdf0e10cSrcweir     if (nActionLockCount > 0)
6835*cdf0e10cSrcweir     {
6836*cdf0e10cSrcweir         nActionLockCount--;
6837*cdf0e10cSrcweir         if (!nActionLockCount)
6838*cdf0e10cSrcweir         {
6839*cdf0e10cSrcweir             if (pUnoText)
6840*cdf0e10cSrcweir             {
6841*cdf0e10cSrcweir                 ScSharedCellEditSource* pEditSource =
6842*cdf0e10cSrcweir                     static_cast<ScSharedCellEditSource*> (pUnoText->GetEditSource());
6843*cdf0e10cSrcweir                 if (pEditSource)
6844*cdf0e10cSrcweir                 {
6845*cdf0e10cSrcweir                     pEditSource->SetDoUpdateData(sal_True);
6846*cdf0e10cSrcweir                     if (pEditSource->IsDirty())
6847*cdf0e10cSrcweir                         pEditSource->UpdateData();
6848*cdf0e10cSrcweir                 }
6849*cdf0e10cSrcweir             }
6850*cdf0e10cSrcweir         }
6851*cdf0e10cSrcweir     }
6852*cdf0e10cSrcweir }
6853*cdf0e10cSrcweir 
6854*cdf0e10cSrcweir void SAL_CALL ScCellObj::setActionLocks( sal_Int16 nLock ) throw(uno::RuntimeException)
6855*cdf0e10cSrcweir {
6856*cdf0e10cSrcweir     ScUnoGuard aGuard;
6857*cdf0e10cSrcweir     if (pUnoText)
6858*cdf0e10cSrcweir     {
6859*cdf0e10cSrcweir         ScSharedCellEditSource* pEditSource =
6860*cdf0e10cSrcweir             static_cast<ScSharedCellEditSource*> (pUnoText->GetEditSource());
6861*cdf0e10cSrcweir         if (pEditSource)
6862*cdf0e10cSrcweir         {
6863*cdf0e10cSrcweir             pEditSource->SetDoUpdateData(nLock == 0);
6864*cdf0e10cSrcweir             if ((nActionLockCount > 0) && (nLock == 0) && pEditSource->IsDirty())
6865*cdf0e10cSrcweir                 pEditSource->UpdateData();
6866*cdf0e10cSrcweir         }
6867*cdf0e10cSrcweir     }
6868*cdf0e10cSrcweir     nActionLockCount = nLock;
6869*cdf0e10cSrcweir }
6870*cdf0e10cSrcweir 
6871*cdf0e10cSrcweir sal_Int16 SAL_CALL ScCellObj::resetActionLocks() throw(uno::RuntimeException)
6872*cdf0e10cSrcweir {
6873*cdf0e10cSrcweir     ScUnoGuard aGuard;
6874*cdf0e10cSrcweir     sal_uInt16 nRet(nActionLockCount);
6875*cdf0e10cSrcweir     if (pUnoText)
6876*cdf0e10cSrcweir     {
6877*cdf0e10cSrcweir         ScSharedCellEditSource* pEditSource =
6878*cdf0e10cSrcweir             static_cast<ScSharedCellEditSource*> (pUnoText->GetEditSource());
6879*cdf0e10cSrcweir         if (pEditSource)
6880*cdf0e10cSrcweir         {
6881*cdf0e10cSrcweir             pEditSource->SetDoUpdateData(sal_True);
6882*cdf0e10cSrcweir             if (pEditSource->IsDirty())
6883*cdf0e10cSrcweir                 pEditSource->UpdateData();
6884*cdf0e10cSrcweir         }
6885*cdf0e10cSrcweir     }
6886*cdf0e10cSrcweir     nActionLockCount = 0;
6887*cdf0e10cSrcweir     return nRet;
6888*cdf0e10cSrcweir }
6889*cdf0e10cSrcweir 
6890*cdf0e10cSrcweir //------------------------------------------------------------------------
6891*cdf0e10cSrcweir 
6892*cdf0e10cSrcweir ScTableSheetObj::ScTableSheetObj( ScDocShell* pDocSh, SCTAB nTab ) :
6893*cdf0e10cSrcweir     ScCellRangeObj( pDocSh, ScRange(0,0,nTab, MAXCOL,MAXROW,nTab) ),
6894*cdf0e10cSrcweir     pSheetPropSet(lcl_GetSheetPropertySet())
6895*cdf0e10cSrcweir {
6896*cdf0e10cSrcweir }
6897*cdf0e10cSrcweir 
6898*cdf0e10cSrcweir ScTableSheetObj::~ScTableSheetObj()
6899*cdf0e10cSrcweir {
6900*cdf0e10cSrcweir }
6901*cdf0e10cSrcweir 
6902*cdf0e10cSrcweir void ScTableSheetObj::InitInsertSheet(ScDocShell* pDocSh, SCTAB nTab)
6903*cdf0e10cSrcweir {
6904*cdf0e10cSrcweir     InitInsertRange( pDocSh, ScRange(0,0,nTab, MAXCOL,MAXROW,nTab) );
6905*cdf0e10cSrcweir }
6906*cdf0e10cSrcweir 
6907*cdf0e10cSrcweir uno::Any SAL_CALL ScTableSheetObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException)
6908*cdf0e10cSrcweir {
6909*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSpreadsheet )
6910*cdf0e10cSrcweir     SC_QUERYINTERFACE( container::XNamed )
6911*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetPageBreak )
6912*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XCellRangeMovement )
6913*cdf0e10cSrcweir     SC_QUERYINTERFACE( table::XTableChartsSupplier )
6914*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XDataPilotTablesSupplier )
6915*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XScenariosSupplier )
6916*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetAnnotationsSupplier )
6917*cdf0e10cSrcweir     SC_QUERYINTERFACE( drawing::XDrawPageSupplier )
6918*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XPrintAreas )
6919*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetAuditing )
6920*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetOutline )
6921*cdf0e10cSrcweir     SC_QUERYINTERFACE( util::XProtectable )
6922*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XScenario )
6923*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XScenarioEnhanced )
6924*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XSheetLinkable )
6925*cdf0e10cSrcweir     SC_QUERYINTERFACE( sheet::XExternalSheetName )
6926*cdf0e10cSrcweir     SC_QUERYINTERFACE( document::XEventsSupplier )
6927*cdf0e10cSrcweir 
6928*cdf0e10cSrcweir     return ScCellRangeObj::queryInterface( rType );
6929*cdf0e10cSrcweir }
6930*cdf0e10cSrcweir 
6931*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::acquire() throw()
6932*cdf0e10cSrcweir {
6933*cdf0e10cSrcweir     ScCellRangeObj::acquire();
6934*cdf0e10cSrcweir }
6935*cdf0e10cSrcweir 
6936*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::release() throw()
6937*cdf0e10cSrcweir {
6938*cdf0e10cSrcweir     ScCellRangeObj::release();
6939*cdf0e10cSrcweir }
6940*cdf0e10cSrcweir 
6941*cdf0e10cSrcweir uno::Sequence<uno::Type> SAL_CALL ScTableSheetObj::getTypes() throw(uno::RuntimeException)
6942*cdf0e10cSrcweir {
6943*cdf0e10cSrcweir     static uno::Sequence<uno::Type> aTypes;
6944*cdf0e10cSrcweir     if ( aTypes.getLength() == 0 )
6945*cdf0e10cSrcweir     {
6946*cdf0e10cSrcweir         uno::Sequence<uno::Type> aParentTypes = ScCellRangeObj::getTypes();
6947*cdf0e10cSrcweir         long nParentLen = aParentTypes.getLength();
6948*cdf0e10cSrcweir         const uno::Type* pParentPtr = aParentTypes.getConstArray();
6949*cdf0e10cSrcweir 
6950*cdf0e10cSrcweir         aTypes.realloc( nParentLen + 18 );
6951*cdf0e10cSrcweir         uno::Type* pPtr = aTypes.getArray();
6952*cdf0e10cSrcweir         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSpreadsheet>*)0);
6953*cdf0e10cSrcweir         pPtr[nParentLen + 1] = getCppuType((const uno::Reference<container::XNamed>*)0);
6954*cdf0e10cSrcweir         pPtr[nParentLen + 2] = getCppuType((const uno::Reference<sheet::XSheetPageBreak>*)0);
6955*cdf0e10cSrcweir         pPtr[nParentLen + 3] = getCppuType((const uno::Reference<sheet::XCellRangeMovement>*)0);
6956*cdf0e10cSrcweir         pPtr[nParentLen + 4] = getCppuType((const uno::Reference<table::XTableChartsSupplier>*)0);
6957*cdf0e10cSrcweir         pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XDataPilotTablesSupplier>*)0);
6958*cdf0e10cSrcweir         pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XScenariosSupplier>*)0);
6959*cdf0e10cSrcweir         pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XSheetAnnotationsSupplier>*)0);
6960*cdf0e10cSrcweir         pPtr[nParentLen + 8] = getCppuType((const uno::Reference<drawing::XDrawPageSupplier>*)0);
6961*cdf0e10cSrcweir         pPtr[nParentLen + 9] = getCppuType((const uno::Reference<sheet::XPrintAreas>*)0);
6962*cdf0e10cSrcweir         pPtr[nParentLen +10] = getCppuType((const uno::Reference<sheet::XSheetAuditing>*)0);
6963*cdf0e10cSrcweir         pPtr[nParentLen +11] = getCppuType((const uno::Reference<sheet::XSheetOutline>*)0);
6964*cdf0e10cSrcweir         pPtr[nParentLen +12] = getCppuType((const uno::Reference<util::XProtectable>*)0);
6965*cdf0e10cSrcweir         pPtr[nParentLen +13] = getCppuType((const uno::Reference<sheet::XScenario>*)0);
6966*cdf0e10cSrcweir         pPtr[nParentLen +14] = getCppuType((const uno::Reference<sheet::XScenarioEnhanced>*)0);
6967*cdf0e10cSrcweir         pPtr[nParentLen +15] = getCppuType((const uno::Reference<sheet::XSheetLinkable>*)0);
6968*cdf0e10cSrcweir         pPtr[nParentLen +16] = getCppuType((const uno::Reference<sheet::XExternalSheetName>*)0);
6969*cdf0e10cSrcweir         pPtr[nParentLen +17] = getCppuType((const uno::Reference<document::XEventsSupplier>*)0);
6970*cdf0e10cSrcweir 
6971*cdf0e10cSrcweir         for (long i=0; i<nParentLen; i++)
6972*cdf0e10cSrcweir             pPtr[i] = pParentPtr[i];                // parent types first
6973*cdf0e10cSrcweir     }
6974*cdf0e10cSrcweir     return aTypes;
6975*cdf0e10cSrcweir }
6976*cdf0e10cSrcweir 
6977*cdf0e10cSrcweir uno::Sequence<sal_Int8> SAL_CALL ScTableSheetObj::getImplementationId() throw(uno::RuntimeException)
6978*cdf0e10cSrcweir {
6979*cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId;
6980*cdf0e10cSrcweir     if( aId.getLength() == 0 )
6981*cdf0e10cSrcweir     {
6982*cdf0e10cSrcweir         aId.realloc( 16 );
6983*cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
6984*cdf0e10cSrcweir     }
6985*cdf0e10cSrcweir     return aId;
6986*cdf0e10cSrcweir }
6987*cdf0e10cSrcweir 
6988*cdf0e10cSrcweir //  Hilfsfunktionen
6989*cdf0e10cSrcweir 
6990*cdf0e10cSrcweir SCTAB ScTableSheetObj::GetTab_Impl() const
6991*cdf0e10cSrcweir {
6992*cdf0e10cSrcweir     const ScRangeList& rRanges = GetRangeList();
6993*cdf0e10cSrcweir     DBG_ASSERT(rRanges.Count() == 1, "was fuer Ranges ?!?!");
6994*cdf0e10cSrcweir     const ScRange* pFirst = rRanges.GetObject(0);
6995*cdf0e10cSrcweir     if (pFirst)
6996*cdf0e10cSrcweir         return pFirst->aStart.Tab();
6997*cdf0e10cSrcweir 
6998*cdf0e10cSrcweir     return 0;   // soll nicht sein
6999*cdf0e10cSrcweir }
7000*cdf0e10cSrcweir 
7001*cdf0e10cSrcweir // former XSheet
7002*cdf0e10cSrcweir 
7003*cdf0e10cSrcweir uno::Reference<table::XTableCharts> SAL_CALL ScTableSheetObj::getCharts() throw(uno::RuntimeException)
7004*cdf0e10cSrcweir {
7005*cdf0e10cSrcweir     ScUnoGuard aGuard;
7006*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7007*cdf0e10cSrcweir     if ( pDocSh )
7008*cdf0e10cSrcweir         return new ScChartsObj( pDocSh, GetTab_Impl() );
7009*cdf0e10cSrcweir 
7010*cdf0e10cSrcweir     DBG_ERROR("kein Dokument");
7011*cdf0e10cSrcweir     return NULL;
7012*cdf0e10cSrcweir }
7013*cdf0e10cSrcweir 
7014*cdf0e10cSrcweir uno::Reference<sheet::XDataPilotTables> SAL_CALL ScTableSheetObj::getDataPilotTables()
7015*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7016*cdf0e10cSrcweir {
7017*cdf0e10cSrcweir     ScUnoGuard aGuard;
7018*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7019*cdf0e10cSrcweir     if ( pDocSh )
7020*cdf0e10cSrcweir         return new ScDataPilotTablesObj( pDocSh, GetTab_Impl() );
7021*cdf0e10cSrcweir 
7022*cdf0e10cSrcweir     DBG_ERROR("kein Dokument");
7023*cdf0e10cSrcweir     return NULL;
7024*cdf0e10cSrcweir }
7025*cdf0e10cSrcweir 
7026*cdf0e10cSrcweir uno::Reference<sheet::XScenarios> SAL_CALL ScTableSheetObj::getScenarios() throw(uno::RuntimeException)
7027*cdf0e10cSrcweir {
7028*cdf0e10cSrcweir     ScUnoGuard aGuard;
7029*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7030*cdf0e10cSrcweir 
7031*cdf0e10cSrcweir     if ( pDocSh )
7032*cdf0e10cSrcweir         return new ScScenariosObj( pDocSh, GetTab_Impl() );
7033*cdf0e10cSrcweir 
7034*cdf0e10cSrcweir     DBG_ERROR("kein Dokument");
7035*cdf0e10cSrcweir     return NULL;
7036*cdf0e10cSrcweir }
7037*cdf0e10cSrcweir 
7038*cdf0e10cSrcweir uno::Reference<sheet::XSheetAnnotations> SAL_CALL ScTableSheetObj::getAnnotations()
7039*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7040*cdf0e10cSrcweir {
7041*cdf0e10cSrcweir     ScUnoGuard aGuard;
7042*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7043*cdf0e10cSrcweir 
7044*cdf0e10cSrcweir     if ( pDocSh )
7045*cdf0e10cSrcweir         return new ScAnnotationsObj( pDocSh, GetTab_Impl() );
7046*cdf0e10cSrcweir 
7047*cdf0e10cSrcweir     DBG_ERROR("kein Dokument");
7048*cdf0e10cSrcweir     return NULL;
7049*cdf0e10cSrcweir }
7050*cdf0e10cSrcweir 
7051*cdf0e10cSrcweir uno::Reference<table::XCellRange> SAL_CALL ScTableSheetObj::getCellRangeByName(
7052*cdf0e10cSrcweir                         const rtl::OUString& rRange ) throw(uno::RuntimeException)
7053*cdf0e10cSrcweir {
7054*cdf0e10cSrcweir     ScUnoGuard aGuard;
7055*cdf0e10cSrcweir     return ScCellRangeObj::getCellRangeByName( rRange );
7056*cdf0e10cSrcweir }
7057*cdf0e10cSrcweir 
7058*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellCursor> SAL_CALL ScTableSheetObj::createCursor()
7059*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7060*cdf0e10cSrcweir {
7061*cdf0e10cSrcweir     ScUnoGuard aGuard;
7062*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7063*cdf0e10cSrcweir     if ( pDocSh )
7064*cdf0e10cSrcweir     {
7065*cdf0e10cSrcweir         //! einzelne Zelle oder ganze Tabelle???????
7066*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7067*cdf0e10cSrcweir         return new ScCellCursorObj( pDocSh, ScRange( 0,0,nTab, MAXCOL,MAXROW,nTab ) );
7068*cdf0e10cSrcweir     }
7069*cdf0e10cSrcweir     return NULL;
7070*cdf0e10cSrcweir }
7071*cdf0e10cSrcweir 
7072*cdf0e10cSrcweir uno::Reference<sheet::XSheetCellCursor> SAL_CALL ScTableSheetObj::createCursorByRange(
7073*cdf0e10cSrcweir                         const uno::Reference<sheet::XSheetCellRange>& xCellRange )
7074*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7075*cdf0e10cSrcweir {
7076*cdf0e10cSrcweir     ScUnoGuard aGuard;
7077*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7078*cdf0e10cSrcweir     if ( pDocSh && xCellRange.is() )
7079*cdf0e10cSrcweir     {
7080*cdf0e10cSrcweir         ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xCellRange );
7081*cdf0e10cSrcweir         if (pRangesImp)
7082*cdf0e10cSrcweir         {
7083*cdf0e10cSrcweir             const ScRangeList& rRanges = pRangesImp->GetRangeList();
7084*cdf0e10cSrcweir             DBG_ASSERT( rRanges.Count() == 1, "Range? Ranges?" );
7085*cdf0e10cSrcweir             return new ScCellCursorObj( pDocSh, *rRanges.GetObject(0) );
7086*cdf0e10cSrcweir         }
7087*cdf0e10cSrcweir     }
7088*cdf0e10cSrcweir     return NULL;
7089*cdf0e10cSrcweir }
7090*cdf0e10cSrcweir 
7091*cdf0e10cSrcweir // XSheetCellRange
7092*cdf0e10cSrcweir 
7093*cdf0e10cSrcweir uno::Reference<sheet::XSpreadsheet> SAL_CALL ScTableSheetObj::getSpreadsheet()
7094*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7095*cdf0e10cSrcweir {
7096*cdf0e10cSrcweir     ScUnoGuard aGuard;
7097*cdf0e10cSrcweir     return this;        //!???
7098*cdf0e10cSrcweir }
7099*cdf0e10cSrcweir 
7100*cdf0e10cSrcweir // XCellRange
7101*cdf0e10cSrcweir 
7102*cdf0e10cSrcweir uno::Reference<table::XCell> SAL_CALL ScTableSheetObj::getCellByPosition(
7103*cdf0e10cSrcweir                                         sal_Int32 nColumn, sal_Int32 nRow )
7104*cdf0e10cSrcweir                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
7105*cdf0e10cSrcweir {
7106*cdf0e10cSrcweir     ScUnoGuard aGuard;
7107*cdf0e10cSrcweir     return ScCellRangeObj::GetCellByPosition_Impl(nColumn, nRow);
7108*cdf0e10cSrcweir }
7109*cdf0e10cSrcweir 
7110*cdf0e10cSrcweir uno::Reference<table::XCellRange> SAL_CALL ScTableSheetObj::getCellRangeByPosition(
7111*cdf0e10cSrcweir                 sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom )
7112*cdf0e10cSrcweir                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
7113*cdf0e10cSrcweir {
7114*cdf0e10cSrcweir     ScUnoGuard aGuard;
7115*cdf0e10cSrcweir     return ScCellRangeObj::getCellRangeByPosition(nLeft,nTop,nRight,nBottom);
7116*cdf0e10cSrcweir }
7117*cdf0e10cSrcweir 
7118*cdf0e10cSrcweir uno::Sequence<sheet::TablePageBreakData> SAL_CALL ScTableSheetObj::getColumnPageBreaks()
7119*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7120*cdf0e10cSrcweir {
7121*cdf0e10cSrcweir     ScUnoGuard aGuard;
7122*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7123*cdf0e10cSrcweir     if ( pDocSh )
7124*cdf0e10cSrcweir     {
7125*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7126*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7127*cdf0e10cSrcweir 
7128*cdf0e10cSrcweir         Size aSize(pDoc->GetPageSize( nTab ));
7129*cdf0e10cSrcweir         if (aSize.Width() && aSize.Height())        // effektive Groesse schon gesetzt?
7130*cdf0e10cSrcweir             pDoc->UpdatePageBreaks( nTab );
7131*cdf0e10cSrcweir         else
7132*cdf0e10cSrcweir         {
7133*cdf0e10cSrcweir             //  Umbrueche updaten wie in ScDocShell::PageStyleModified:
7134*cdf0e10cSrcweir             ScPrintFunc aPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab );
7135*cdf0e10cSrcweir             aPrintFunc.UpdatePages();
7136*cdf0e10cSrcweir         }
7137*cdf0e10cSrcweir 
7138*cdf0e10cSrcweir         SCCOL nCount = 0;
7139*cdf0e10cSrcweir         SCCOL nCol;
7140*cdf0e10cSrcweir         for (nCol=0; nCol<=MAXCOL; nCol++)
7141*cdf0e10cSrcweir             if (pDoc->HasColBreak(nCol, nTab))
7142*cdf0e10cSrcweir                 ++nCount;
7143*cdf0e10cSrcweir 
7144*cdf0e10cSrcweir         sheet::TablePageBreakData aData;
7145*cdf0e10cSrcweir         uno::Sequence<sheet::TablePageBreakData> aSeq(nCount);
7146*cdf0e10cSrcweir         sheet::TablePageBreakData* pAry = aSeq.getArray();
7147*cdf0e10cSrcweir         sal_uInt16 nPos = 0;
7148*cdf0e10cSrcweir         for (nCol=0; nCol<=MAXCOL; nCol++)
7149*cdf0e10cSrcweir         {
7150*cdf0e10cSrcweir             ScBreakType nBreak = pDoc->HasColBreak(nCol, nTab);
7151*cdf0e10cSrcweir             if (nBreak)
7152*cdf0e10cSrcweir             {
7153*cdf0e10cSrcweir                 aData.Position    = nCol;
7154*cdf0e10cSrcweir                 aData.ManualBreak = (nBreak & BREAK_MANUAL);
7155*cdf0e10cSrcweir                 pAry[nPos] = aData;
7156*cdf0e10cSrcweir                 ++nPos;
7157*cdf0e10cSrcweir             }
7158*cdf0e10cSrcweir         }
7159*cdf0e10cSrcweir         return aSeq;
7160*cdf0e10cSrcweir     }
7161*cdf0e10cSrcweir     return uno::Sequence<sheet::TablePageBreakData>(0);
7162*cdf0e10cSrcweir }
7163*cdf0e10cSrcweir 
7164*cdf0e10cSrcweir uno::Sequence<sheet::TablePageBreakData> SAL_CALL ScTableSheetObj::getRowPageBreaks()
7165*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7166*cdf0e10cSrcweir {
7167*cdf0e10cSrcweir     ScUnoGuard aGuard;
7168*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7169*cdf0e10cSrcweir     if ( pDocSh )
7170*cdf0e10cSrcweir     {
7171*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7172*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7173*cdf0e10cSrcweir 
7174*cdf0e10cSrcweir         Size aSize(pDoc->GetPageSize( nTab ));
7175*cdf0e10cSrcweir         if (aSize.Width() && aSize.Height())        // effektive Groesse schon gesetzt?
7176*cdf0e10cSrcweir             pDoc->UpdatePageBreaks( nTab );
7177*cdf0e10cSrcweir         else
7178*cdf0e10cSrcweir         {
7179*cdf0e10cSrcweir             //  Umbrueche updaten wie in ScDocShell::PageStyleModified:
7180*cdf0e10cSrcweir             ScPrintFunc aPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab );
7181*cdf0e10cSrcweir             aPrintFunc.UpdatePages();
7182*cdf0e10cSrcweir         }
7183*cdf0e10cSrcweir         return pDoc->GetRowBreakData(nTab);
7184*cdf0e10cSrcweir     }
7185*cdf0e10cSrcweir     return uno::Sequence<sheet::TablePageBreakData>(0);
7186*cdf0e10cSrcweir }
7187*cdf0e10cSrcweir 
7188*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::removeAllManualPageBreaks() throw(uno::RuntimeException)
7189*cdf0e10cSrcweir {
7190*cdf0e10cSrcweir     ScUnoGuard aGuard;
7191*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7192*cdf0e10cSrcweir     if ( pDocSh )
7193*cdf0e10cSrcweir     {
7194*cdf0e10cSrcweir         //! docfunc Funktion, auch fuer ScViewFunc::RemoveManualBreaks
7195*cdf0e10cSrcweir 
7196*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7197*cdf0e10cSrcweir         sal_Bool bUndo (pDoc->IsUndoEnabled());
7198*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7199*cdf0e10cSrcweir 
7200*cdf0e10cSrcweir         if (bUndo)
7201*cdf0e10cSrcweir         {
7202*cdf0e10cSrcweir             ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
7203*cdf0e10cSrcweir             pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True );
7204*cdf0e10cSrcweir             pDoc->CopyToDocument( 0,0,nTab, MAXCOL,MAXROW,nTab, IDF_NONE, sal_False, pUndoDoc );
7205*cdf0e10cSrcweir             pDocSh->GetUndoManager()->AddUndoAction(
7206*cdf0e10cSrcweir                                     new ScUndoRemoveBreaks( pDocSh, nTab, pUndoDoc ) );
7207*cdf0e10cSrcweir         }
7208*cdf0e10cSrcweir 
7209*cdf0e10cSrcweir         pDoc->RemoveManualBreaks(nTab);
7210*cdf0e10cSrcweir         pDoc->UpdatePageBreaks(nTab);
7211*cdf0e10cSrcweir 
7212*cdf0e10cSrcweir         //? UpdatePageBreakData( sal_True );
7213*cdf0e10cSrcweir         pDocSh->SetDocumentModified();
7214*cdf0e10cSrcweir         pDocSh->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
7215*cdf0e10cSrcweir     }
7216*cdf0e10cSrcweir }
7217*cdf0e10cSrcweir 
7218*cdf0e10cSrcweir // XNamed
7219*cdf0e10cSrcweir 
7220*cdf0e10cSrcweir rtl::OUString SAL_CALL ScTableSheetObj::getName() throw(uno::RuntimeException)
7221*cdf0e10cSrcweir {
7222*cdf0e10cSrcweir     ScUnoGuard aGuard;
7223*cdf0e10cSrcweir     String aName;
7224*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7225*cdf0e10cSrcweir     if ( pDocSh )
7226*cdf0e10cSrcweir         pDocSh->GetDocument()->GetName( GetTab_Impl(), aName );
7227*cdf0e10cSrcweir     return aName;
7228*cdf0e10cSrcweir }
7229*cdf0e10cSrcweir 
7230*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::setName( const rtl::OUString& aNewName )
7231*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7232*cdf0e10cSrcweir {
7233*cdf0e10cSrcweir     ScUnoGuard aGuard;
7234*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7235*cdf0e10cSrcweir     if ( pDocSh )
7236*cdf0e10cSrcweir     {
7237*cdf0e10cSrcweir         String aString(aNewName);
7238*cdf0e10cSrcweir         ScDocFunc aFunc( *pDocSh );
7239*cdf0e10cSrcweir         aFunc.RenameTable( GetTab_Impl(), aString, sal_True, sal_True );
7240*cdf0e10cSrcweir     }
7241*cdf0e10cSrcweir }
7242*cdf0e10cSrcweir 
7243*cdf0e10cSrcweir // XDrawPageSupplier
7244*cdf0e10cSrcweir 
7245*cdf0e10cSrcweir uno::Reference<drawing::XDrawPage> SAL_CALL ScTableSheetObj::getDrawPage()
7246*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7247*cdf0e10cSrcweir {
7248*cdf0e10cSrcweir     ScUnoGuard aGuard;
7249*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7250*cdf0e10cSrcweir     if ( pDocSh )
7251*cdf0e10cSrcweir     {
7252*cdf0e10cSrcweir         ScDrawLayer* pDrawLayer = pDocSh->MakeDrawLayer();
7253*cdf0e10cSrcweir         DBG_ASSERT(pDrawLayer,"kann Draw-Layer nicht anlegen");
7254*cdf0e10cSrcweir 
7255*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7256*cdf0e10cSrcweir         SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
7257*cdf0e10cSrcweir         DBG_ASSERT(pPage,"Draw-Page nicht gefunden");
7258*cdf0e10cSrcweir         if (pPage)
7259*cdf0e10cSrcweir             return uno::Reference<drawing::XDrawPage> (pPage->getUnoPage(), uno::UNO_QUERY);
7260*cdf0e10cSrcweir 
7261*cdf0e10cSrcweir         //  Das DrawPage-Objekt meldet sich als Listener am SdrModel an
7262*cdf0e10cSrcweir         //  und sollte von dort alle Aktionen mitbekommen
7263*cdf0e10cSrcweir     }
7264*cdf0e10cSrcweir     return NULL;
7265*cdf0e10cSrcweir }
7266*cdf0e10cSrcweir 
7267*cdf0e10cSrcweir // XCellMovement
7268*cdf0e10cSrcweir 
7269*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::insertCells( const table::CellRangeAddress& rRangeAddress,
7270*cdf0e10cSrcweir                                 sheet::CellInsertMode nMode ) throw(uno::RuntimeException)
7271*cdf0e10cSrcweir {
7272*cdf0e10cSrcweir     ScUnoGuard aGuard;
7273*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7274*cdf0e10cSrcweir     if ( pDocSh )
7275*cdf0e10cSrcweir     {
7276*cdf0e10cSrcweir         sal_Bool bDo = sal_True;
7277*cdf0e10cSrcweir         InsCellCmd eCmd = INS_NONE;
7278*cdf0e10cSrcweir         switch (nMode)
7279*cdf0e10cSrcweir         {
7280*cdf0e10cSrcweir             case sheet::CellInsertMode_NONE:    bDo = sal_False;            break;
7281*cdf0e10cSrcweir             case sheet::CellInsertMode_DOWN:    eCmd = INS_CELLSDOWN;   break;
7282*cdf0e10cSrcweir             case sheet::CellInsertMode_RIGHT:   eCmd = INS_CELLSRIGHT;  break;
7283*cdf0e10cSrcweir             case sheet::CellInsertMode_ROWS:    eCmd = INS_INSROWS;     break;
7284*cdf0e10cSrcweir             case sheet::CellInsertMode_COLUMNS: eCmd = INS_INSCOLS;     break;
7285*cdf0e10cSrcweir             default:
7286*cdf0e10cSrcweir                 DBG_ERROR("insertCells: falscher Mode");
7287*cdf0e10cSrcweir                 bDo = sal_False;
7288*cdf0e10cSrcweir         }
7289*cdf0e10cSrcweir 
7290*cdf0e10cSrcweir         if (bDo)
7291*cdf0e10cSrcweir         {
7292*cdf0e10cSrcweir             DBG_ASSERT( rRangeAddress.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
7293*cdf0e10cSrcweir             ScRange aScRange;
7294*cdf0e10cSrcweir             ScUnoConversion::FillScRange( aScRange, rRangeAddress );
7295*cdf0e10cSrcweir             ScDocFunc aFunc(*pDocSh);
7296*cdf0e10cSrcweir             aFunc.InsertCells( aScRange, NULL, eCmd, sal_True, sal_True );
7297*cdf0e10cSrcweir         }
7298*cdf0e10cSrcweir     }
7299*cdf0e10cSrcweir }
7300*cdf0e10cSrcweir 
7301*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::removeRange( const table::CellRangeAddress& rRangeAddress,
7302*cdf0e10cSrcweir                                 sheet::CellDeleteMode nMode ) throw(uno::RuntimeException)
7303*cdf0e10cSrcweir {
7304*cdf0e10cSrcweir     ScUnoGuard aGuard;
7305*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7306*cdf0e10cSrcweir     if ( pDocSh )
7307*cdf0e10cSrcweir     {
7308*cdf0e10cSrcweir         sal_Bool bDo = sal_True;
7309*cdf0e10cSrcweir         DelCellCmd eCmd = DEL_NONE;
7310*cdf0e10cSrcweir         switch (nMode)
7311*cdf0e10cSrcweir         {
7312*cdf0e10cSrcweir             case sheet::CellDeleteMode_NONE:     bDo = sal_False;           break;
7313*cdf0e10cSrcweir             case sheet::CellDeleteMode_UP:       eCmd = DEL_CELLSUP;    break;
7314*cdf0e10cSrcweir             case sheet::CellDeleteMode_LEFT:     eCmd = DEL_CELLSLEFT;  break;
7315*cdf0e10cSrcweir             case sheet::CellDeleteMode_ROWS:     eCmd = DEL_DELROWS;    break;
7316*cdf0e10cSrcweir             case sheet::CellDeleteMode_COLUMNS:  eCmd = DEL_DELCOLS;    break;
7317*cdf0e10cSrcweir             default:
7318*cdf0e10cSrcweir                 DBG_ERROR("deleteCells: falscher Mode");
7319*cdf0e10cSrcweir                 bDo = sal_False;
7320*cdf0e10cSrcweir         }
7321*cdf0e10cSrcweir 
7322*cdf0e10cSrcweir         if (bDo)
7323*cdf0e10cSrcweir         {
7324*cdf0e10cSrcweir             DBG_ASSERT( rRangeAddress.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
7325*cdf0e10cSrcweir             ScRange aScRange;
7326*cdf0e10cSrcweir             ScUnoConversion::FillScRange( aScRange, rRangeAddress );
7327*cdf0e10cSrcweir             ScDocFunc aFunc(*pDocSh);
7328*cdf0e10cSrcweir             aFunc.DeleteCells( aScRange, NULL, eCmd, sal_True, sal_True );
7329*cdf0e10cSrcweir         }
7330*cdf0e10cSrcweir     }
7331*cdf0e10cSrcweir }
7332*cdf0e10cSrcweir 
7333*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::moveRange( const table::CellAddress& aDestination,
7334*cdf0e10cSrcweir                                         const table::CellRangeAddress& aSource )
7335*cdf0e10cSrcweir                                         throw(uno::RuntimeException)
7336*cdf0e10cSrcweir {
7337*cdf0e10cSrcweir     ScUnoGuard aGuard;
7338*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7339*cdf0e10cSrcweir     if ( pDocSh )
7340*cdf0e10cSrcweir     {
7341*cdf0e10cSrcweir         DBG_ASSERT( aSource.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
7342*cdf0e10cSrcweir         ScRange aSourceRange;
7343*cdf0e10cSrcweir         ScUnoConversion::FillScRange( aSourceRange, aSource );
7344*cdf0e10cSrcweir         ScAddress aDestPos( (SCCOL)aDestination.Column, (SCROW)aDestination.Row, aDestination.Sheet );
7345*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7346*cdf0e10cSrcweir         aFunc.MoveBlock( aSourceRange, aDestPos, sal_True, sal_True, sal_True, sal_True );
7347*cdf0e10cSrcweir     }
7348*cdf0e10cSrcweir }
7349*cdf0e10cSrcweir 
7350*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::copyRange( const table::CellAddress& aDestination,
7351*cdf0e10cSrcweir                                         const table::CellRangeAddress& aSource )
7352*cdf0e10cSrcweir                                         throw(uno::RuntimeException)
7353*cdf0e10cSrcweir {
7354*cdf0e10cSrcweir     ScUnoGuard aGuard;
7355*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7356*cdf0e10cSrcweir     if ( pDocSh )
7357*cdf0e10cSrcweir     {
7358*cdf0e10cSrcweir         DBG_ASSERT( aSource.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
7359*cdf0e10cSrcweir         ScRange aSourceRange;
7360*cdf0e10cSrcweir         ScUnoConversion::FillScRange( aSourceRange, aSource );
7361*cdf0e10cSrcweir         ScAddress aDestPos( (SCCOL)aDestination.Column, (SCROW)aDestination.Row, aDestination.Sheet );
7362*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7363*cdf0e10cSrcweir         aFunc.MoveBlock( aSourceRange, aDestPos, sal_False, sal_True, sal_True, sal_True );
7364*cdf0e10cSrcweir     }
7365*cdf0e10cSrcweir }
7366*cdf0e10cSrcweir 
7367*cdf0e10cSrcweir // XPrintAreas
7368*cdf0e10cSrcweir 
7369*cdf0e10cSrcweir void ScTableSheetObj::PrintAreaUndo_Impl( ScPrintRangeSaver* pOldRanges )
7370*cdf0e10cSrcweir {
7371*cdf0e10cSrcweir     //  Umbrueche und Undo
7372*cdf0e10cSrcweir 
7373*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7374*cdf0e10cSrcweir     if ( pDocSh )
7375*cdf0e10cSrcweir     {
7376*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7377*cdf0e10cSrcweir         sal_Bool bUndo(pDoc->IsUndoEnabled());
7378*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7379*cdf0e10cSrcweir 
7380*cdf0e10cSrcweir         ScPrintRangeSaver* pNewRanges = pDoc->CreatePrintRangeSaver();
7381*cdf0e10cSrcweir         if (bUndo)
7382*cdf0e10cSrcweir         {
7383*cdf0e10cSrcweir             pDocSh->GetUndoManager()->AddUndoAction(
7384*cdf0e10cSrcweir                         new ScUndoPrintRange( pDocSh, nTab, pOldRanges, pNewRanges ) );
7385*cdf0e10cSrcweir         }
7386*cdf0e10cSrcweir 
7387*cdf0e10cSrcweir         ScPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ).UpdatePages();
7388*cdf0e10cSrcweir 
7389*cdf0e10cSrcweir         SfxBindings* pBindings = pDocSh->GetViewBindings();
7390*cdf0e10cSrcweir         if (pBindings)
7391*cdf0e10cSrcweir             pBindings->Invalidate( SID_DELETE_PRINTAREA );
7392*cdf0e10cSrcweir 
7393*cdf0e10cSrcweir         pDocSh->SetDocumentModified();
7394*cdf0e10cSrcweir     }
7395*cdf0e10cSrcweir     else
7396*cdf0e10cSrcweir         delete pOldRanges;
7397*cdf0e10cSrcweir }
7398*cdf0e10cSrcweir 
7399*cdf0e10cSrcweir uno::Sequence<table::CellRangeAddress> SAL_CALL ScTableSheetObj::getPrintAreas()
7400*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7401*cdf0e10cSrcweir {
7402*cdf0e10cSrcweir     ScUnoGuard aGuard;
7403*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7404*cdf0e10cSrcweir     if ( pDocSh )
7405*cdf0e10cSrcweir     {
7406*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7407*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7408*cdf0e10cSrcweir         sal_uInt16 nCount = pDoc->GetPrintRangeCount( nTab );
7409*cdf0e10cSrcweir 
7410*cdf0e10cSrcweir         table::CellRangeAddress aRangeAddress;
7411*cdf0e10cSrcweir         uno::Sequence<table::CellRangeAddress> aSeq(nCount);
7412*cdf0e10cSrcweir         table::CellRangeAddress* pAry = aSeq.getArray();
7413*cdf0e10cSrcweir         for (sal_uInt16 i=0; i<nCount; i++)
7414*cdf0e10cSrcweir         {
7415*cdf0e10cSrcweir             const ScRange* pRange = pDoc->GetPrintRange( nTab, i );
7416*cdf0e10cSrcweir             DBG_ASSERT(pRange,"wo ist der Druckbereich");
7417*cdf0e10cSrcweir             if (pRange)
7418*cdf0e10cSrcweir             {
7419*cdf0e10cSrcweir                 ScUnoConversion::FillApiRange( aRangeAddress, *pRange );
7420*cdf0e10cSrcweir                 aRangeAddress.Sheet = nTab; // core does not care about sheet index
7421*cdf0e10cSrcweir                 pAry[i] = aRangeAddress;
7422*cdf0e10cSrcweir             }
7423*cdf0e10cSrcweir         }
7424*cdf0e10cSrcweir         return aSeq;
7425*cdf0e10cSrcweir     }
7426*cdf0e10cSrcweir     return uno::Sequence<table::CellRangeAddress>();
7427*cdf0e10cSrcweir }
7428*cdf0e10cSrcweir 
7429*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::setPrintAreas(
7430*cdf0e10cSrcweir                     const uno::Sequence<table::CellRangeAddress>& aPrintAreas )
7431*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7432*cdf0e10cSrcweir {
7433*cdf0e10cSrcweir     ScUnoGuard aGuard;
7434*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7435*cdf0e10cSrcweir     if ( pDocSh )
7436*cdf0e10cSrcweir     {
7437*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7438*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7439*cdf0e10cSrcweir 
7440*cdf0e10cSrcweir         ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
7441*cdf0e10cSrcweir 
7442*cdf0e10cSrcweir         sal_uInt16 nCount = (sal_uInt16) aPrintAreas.getLength();
7443*cdf0e10cSrcweir         pDoc->ClearPrintRanges( nTab );
7444*cdf0e10cSrcweir         if (nCount)
7445*cdf0e10cSrcweir         {
7446*cdf0e10cSrcweir             ScRange aPrintRange;
7447*cdf0e10cSrcweir             const table::CellRangeAddress* pAry = aPrintAreas.getConstArray();
7448*cdf0e10cSrcweir             for (sal_uInt16 i=0; i<nCount; i++)
7449*cdf0e10cSrcweir             {
7450*cdf0e10cSrcweir                 ScUnoConversion::FillScRange( aPrintRange, pAry[i] );
7451*cdf0e10cSrcweir                 pDoc->AddPrintRange( nTab, aPrintRange );
7452*cdf0e10cSrcweir             }
7453*cdf0e10cSrcweir         }
7454*cdf0e10cSrcweir 
7455*cdf0e10cSrcweir         PrintAreaUndo_Impl( pOldRanges );   // Undo, Umbrueche, Modified etc.
7456*cdf0e10cSrcweir     }
7457*cdf0e10cSrcweir }
7458*cdf0e10cSrcweir 
7459*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::getPrintTitleColumns() throw(uno::RuntimeException)
7460*cdf0e10cSrcweir {
7461*cdf0e10cSrcweir     ScUnoGuard aGuard;
7462*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7463*cdf0e10cSrcweir     if ( pDocSh )
7464*cdf0e10cSrcweir     {
7465*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7466*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7467*cdf0e10cSrcweir         return ( pDoc->GetRepeatColRange(nTab) != NULL );
7468*cdf0e10cSrcweir     }
7469*cdf0e10cSrcweir     return sal_False;
7470*cdf0e10cSrcweir }
7471*cdf0e10cSrcweir 
7472*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::setPrintTitleColumns( sal_Bool bPrintTitleColumns )
7473*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
7474*cdf0e10cSrcweir {
7475*cdf0e10cSrcweir     ScUnoGuard aGuard;
7476*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7477*cdf0e10cSrcweir     if ( pDocSh )
7478*cdf0e10cSrcweir     {
7479*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7480*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7481*cdf0e10cSrcweir 
7482*cdf0e10cSrcweir         ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
7483*cdf0e10cSrcweir 
7484*cdf0e10cSrcweir         if ( bPrintTitleColumns )
7485*cdf0e10cSrcweir         {
7486*cdf0e10cSrcweir             if ( !pDoc->GetRepeatColRange( nTab ) )         // keinen bestehenden Bereich veraendern
7487*cdf0e10cSrcweir             {
7488*cdf0e10cSrcweir                 ScRange aNew( 0, 0, nTab, 0, 0, nTab );     // Default
7489*cdf0e10cSrcweir                 pDoc->SetRepeatColRange( nTab, &aNew );     // einschalten
7490*cdf0e10cSrcweir             }
7491*cdf0e10cSrcweir         }
7492*cdf0e10cSrcweir         else
7493*cdf0e10cSrcweir             pDoc->SetRepeatColRange( nTab, NULL );          // abschalten
7494*cdf0e10cSrcweir 
7495*cdf0e10cSrcweir         PrintAreaUndo_Impl( pOldRanges );   // Undo, Umbrueche, Modified etc.
7496*cdf0e10cSrcweir 
7497*cdf0e10cSrcweir         //! zuletzt gesetzten Bereich beim Abschalten merken und beim Einschalten wiederherstellen ???
7498*cdf0e10cSrcweir     }
7499*cdf0e10cSrcweir }
7500*cdf0e10cSrcweir 
7501*cdf0e10cSrcweir table::CellRangeAddress SAL_CALL ScTableSheetObj::getTitleColumns() throw(uno::RuntimeException)
7502*cdf0e10cSrcweir {
7503*cdf0e10cSrcweir     ScUnoGuard aGuard;
7504*cdf0e10cSrcweir     table::CellRangeAddress aRet;
7505*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7506*cdf0e10cSrcweir     if ( pDocSh )
7507*cdf0e10cSrcweir     {
7508*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7509*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7510*cdf0e10cSrcweir         const ScRange* pRange = pDoc->GetRepeatColRange(nTab);
7511*cdf0e10cSrcweir         if (pRange)
7512*cdf0e10cSrcweir         {
7513*cdf0e10cSrcweir             ScUnoConversion::FillApiRange( aRet, *pRange );
7514*cdf0e10cSrcweir             aRet.Sheet = nTab; // core does not care about sheet index
7515*cdf0e10cSrcweir         }
7516*cdf0e10cSrcweir     }
7517*cdf0e10cSrcweir     return aRet;
7518*cdf0e10cSrcweir }
7519*cdf0e10cSrcweir 
7520*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::setTitleColumns( const table::CellRangeAddress& aTitleColumns )
7521*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
7522*cdf0e10cSrcweir {
7523*cdf0e10cSrcweir     ScUnoGuard aGuard;
7524*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7525*cdf0e10cSrcweir     if ( pDocSh )
7526*cdf0e10cSrcweir     {
7527*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7528*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7529*cdf0e10cSrcweir 
7530*cdf0e10cSrcweir         ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
7531*cdf0e10cSrcweir 
7532*cdf0e10cSrcweir         ScRange aNew;
7533*cdf0e10cSrcweir         ScUnoConversion::FillScRange( aNew, aTitleColumns );
7534*cdf0e10cSrcweir         pDoc->SetRepeatColRange( nTab, &aNew );     // immer auch einschalten
7535*cdf0e10cSrcweir 
7536*cdf0e10cSrcweir         PrintAreaUndo_Impl( pOldRanges );           // Undo, Umbrueche, Modified etc.
7537*cdf0e10cSrcweir     }
7538*cdf0e10cSrcweir }
7539*cdf0e10cSrcweir 
7540*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::getPrintTitleRows() throw(uno::RuntimeException)
7541*cdf0e10cSrcweir {
7542*cdf0e10cSrcweir     ScUnoGuard aGuard;
7543*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7544*cdf0e10cSrcweir     if ( pDocSh )
7545*cdf0e10cSrcweir     {
7546*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7547*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7548*cdf0e10cSrcweir         return ( pDoc->GetRepeatRowRange(nTab) != NULL );
7549*cdf0e10cSrcweir     }
7550*cdf0e10cSrcweir     return sal_False;
7551*cdf0e10cSrcweir }
7552*cdf0e10cSrcweir 
7553*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::setPrintTitleRows( sal_Bool bPrintTitleRows )
7554*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7555*cdf0e10cSrcweir {
7556*cdf0e10cSrcweir     ScUnoGuard aGuard;
7557*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7558*cdf0e10cSrcweir     if ( pDocSh )
7559*cdf0e10cSrcweir     {
7560*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7561*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7562*cdf0e10cSrcweir 
7563*cdf0e10cSrcweir         ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
7564*cdf0e10cSrcweir 
7565*cdf0e10cSrcweir         if ( bPrintTitleRows )
7566*cdf0e10cSrcweir         {
7567*cdf0e10cSrcweir             if ( !pDoc->GetRepeatRowRange( nTab ) )         // keinen bestehenden Bereich veraendern
7568*cdf0e10cSrcweir             {
7569*cdf0e10cSrcweir                 ScRange aNew( 0, 0, nTab, 0, 0, nTab );     // Default
7570*cdf0e10cSrcweir                 pDoc->SetRepeatRowRange( nTab, &aNew );     // einschalten
7571*cdf0e10cSrcweir             }
7572*cdf0e10cSrcweir         }
7573*cdf0e10cSrcweir         else
7574*cdf0e10cSrcweir             pDoc->SetRepeatRowRange( nTab, NULL );          // abschalten
7575*cdf0e10cSrcweir 
7576*cdf0e10cSrcweir         PrintAreaUndo_Impl( pOldRanges );   // Undo, Umbrueche, Modified etc.
7577*cdf0e10cSrcweir 
7578*cdf0e10cSrcweir         //! zuletzt gesetzten Bereich beim Abschalten merken und beim Einschalten wiederherstellen ???
7579*cdf0e10cSrcweir     }
7580*cdf0e10cSrcweir }
7581*cdf0e10cSrcweir 
7582*cdf0e10cSrcweir table::CellRangeAddress SAL_CALL ScTableSheetObj::getTitleRows() throw(uno::RuntimeException)
7583*cdf0e10cSrcweir {
7584*cdf0e10cSrcweir     ScUnoGuard aGuard;
7585*cdf0e10cSrcweir     table::CellRangeAddress aRet;
7586*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7587*cdf0e10cSrcweir     if ( pDocSh )
7588*cdf0e10cSrcweir     {
7589*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7590*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7591*cdf0e10cSrcweir         const ScRange* pRange = pDoc->GetRepeatRowRange(nTab);
7592*cdf0e10cSrcweir         if (pRange)
7593*cdf0e10cSrcweir         {
7594*cdf0e10cSrcweir             ScUnoConversion::FillApiRange( aRet, *pRange );
7595*cdf0e10cSrcweir             aRet.Sheet = nTab; // core does not care about sheet index
7596*cdf0e10cSrcweir         }
7597*cdf0e10cSrcweir     }
7598*cdf0e10cSrcweir     return aRet;
7599*cdf0e10cSrcweir }
7600*cdf0e10cSrcweir 
7601*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::setTitleRows( const table::CellRangeAddress& aTitleRows )
7602*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
7603*cdf0e10cSrcweir {
7604*cdf0e10cSrcweir     ScUnoGuard aGuard;
7605*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7606*cdf0e10cSrcweir     if ( pDocSh )
7607*cdf0e10cSrcweir     {
7608*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7609*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7610*cdf0e10cSrcweir 
7611*cdf0e10cSrcweir         ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
7612*cdf0e10cSrcweir 
7613*cdf0e10cSrcweir         ScRange aNew;
7614*cdf0e10cSrcweir         ScUnoConversion::FillScRange( aNew, aTitleRows );
7615*cdf0e10cSrcweir         pDoc->SetRepeatRowRange( nTab, &aNew );     // immer auch einschalten
7616*cdf0e10cSrcweir 
7617*cdf0e10cSrcweir         PrintAreaUndo_Impl( pOldRanges );           // Undo, Umbrueche, Modified etc.
7618*cdf0e10cSrcweir     }
7619*cdf0e10cSrcweir }
7620*cdf0e10cSrcweir 
7621*cdf0e10cSrcweir // XSheetLinkable
7622*cdf0e10cSrcweir 
7623*cdf0e10cSrcweir sheet::SheetLinkMode SAL_CALL ScTableSheetObj::getLinkMode() throw(uno::RuntimeException)
7624*cdf0e10cSrcweir {
7625*cdf0e10cSrcweir     ScUnoGuard aGuard;
7626*cdf0e10cSrcweir     sheet::SheetLinkMode eRet = sheet::SheetLinkMode_NONE;
7627*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7628*cdf0e10cSrcweir     if ( pDocSh )
7629*cdf0e10cSrcweir     {
7630*cdf0e10cSrcweir         sal_uInt8 nMode = pDocSh->GetDocument()->GetLinkMode( GetTab_Impl() );
7631*cdf0e10cSrcweir         if ( nMode == SC_LINK_NORMAL )
7632*cdf0e10cSrcweir             eRet = sheet::SheetLinkMode_NORMAL;
7633*cdf0e10cSrcweir         else if ( nMode == SC_LINK_VALUE )
7634*cdf0e10cSrcweir             eRet = sheet::SheetLinkMode_VALUE;
7635*cdf0e10cSrcweir     }
7636*cdf0e10cSrcweir     return eRet;
7637*cdf0e10cSrcweir }
7638*cdf0e10cSrcweir 
7639*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::setLinkMode( sheet::SheetLinkMode nLinkMode )
7640*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7641*cdf0e10cSrcweir {
7642*cdf0e10cSrcweir     ScUnoGuard aGuard;
7643*cdf0e10cSrcweir 
7644*cdf0e10cSrcweir     //! Filter und Options aus altem Link suchen
7645*cdf0e10cSrcweir 
7646*cdf0e10cSrcweir     rtl::OUString aUrl(getLinkUrl());
7647*cdf0e10cSrcweir     rtl::OUString aSheet(getLinkSheetName());
7648*cdf0e10cSrcweir 
7649*cdf0e10cSrcweir     rtl::OUString aEmpty;
7650*cdf0e10cSrcweir     link( aUrl, aSheet, aEmpty, aEmpty, nLinkMode );
7651*cdf0e10cSrcweir }
7652*cdf0e10cSrcweir 
7653*cdf0e10cSrcweir rtl::OUString SAL_CALL ScTableSheetObj::getLinkUrl() throw(uno::RuntimeException)
7654*cdf0e10cSrcweir {
7655*cdf0e10cSrcweir     ScUnoGuard aGuard;
7656*cdf0e10cSrcweir     String aFile;
7657*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7658*cdf0e10cSrcweir     if ( pDocSh )
7659*cdf0e10cSrcweir         aFile = pDocSh->GetDocument()->GetLinkDoc( GetTab_Impl() );
7660*cdf0e10cSrcweir     return aFile;
7661*cdf0e10cSrcweir }
7662*cdf0e10cSrcweir 
7663*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::setLinkUrl( const rtl::OUString& aLinkUrl )
7664*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7665*cdf0e10cSrcweir {
7666*cdf0e10cSrcweir     ScUnoGuard aGuard;
7667*cdf0e10cSrcweir 
7668*cdf0e10cSrcweir     //! Filter und Options aus altem Link suchen
7669*cdf0e10cSrcweir 
7670*cdf0e10cSrcweir     sheet::SheetLinkMode eMode = getLinkMode();
7671*cdf0e10cSrcweir     rtl::OUString aSheet(getLinkSheetName());
7672*cdf0e10cSrcweir 
7673*cdf0e10cSrcweir     rtl::OUString aEmpty;
7674*cdf0e10cSrcweir     link( aLinkUrl, aSheet, aEmpty, aEmpty, eMode );
7675*cdf0e10cSrcweir }
7676*cdf0e10cSrcweir 
7677*cdf0e10cSrcweir rtl::OUString SAL_CALL ScTableSheetObj::getLinkSheetName() throw(uno::RuntimeException)
7678*cdf0e10cSrcweir {
7679*cdf0e10cSrcweir     ScUnoGuard aGuard;
7680*cdf0e10cSrcweir     String aSheet;
7681*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7682*cdf0e10cSrcweir     if ( pDocSh )
7683*cdf0e10cSrcweir         aSheet = pDocSh->GetDocument()->GetLinkTab( GetTab_Impl() );
7684*cdf0e10cSrcweir     return aSheet;
7685*cdf0e10cSrcweir }
7686*cdf0e10cSrcweir 
7687*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::setLinkSheetName( const rtl::OUString& aLinkSheetName )
7688*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7689*cdf0e10cSrcweir {
7690*cdf0e10cSrcweir     ScUnoGuard aGuard;
7691*cdf0e10cSrcweir 
7692*cdf0e10cSrcweir     //! Filter und Options aus altem Link suchen
7693*cdf0e10cSrcweir 
7694*cdf0e10cSrcweir     sheet::SheetLinkMode eMode = getLinkMode();
7695*cdf0e10cSrcweir     rtl::OUString aUrl(getLinkUrl());
7696*cdf0e10cSrcweir 
7697*cdf0e10cSrcweir     rtl::OUString aEmpty;
7698*cdf0e10cSrcweir     link( aUrl, aLinkSheetName, aEmpty, aEmpty, eMode );
7699*cdf0e10cSrcweir }
7700*cdf0e10cSrcweir 
7701*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::link( const rtl::OUString& aUrl, const rtl::OUString& aSheetName,
7702*cdf0e10cSrcweir                         const rtl::OUString& aFilterName, const rtl::OUString& aFilterOptions,
7703*cdf0e10cSrcweir                         sheet::SheetLinkMode nMode ) throw(uno::RuntimeException)
7704*cdf0e10cSrcweir {
7705*cdf0e10cSrcweir     ScUnoGuard aGuard;
7706*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7707*cdf0e10cSrcweir     if ( pDocSh )
7708*cdf0e10cSrcweir     {
7709*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
7710*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7711*cdf0e10cSrcweir 
7712*cdf0e10cSrcweir         String aFileString   (aUrl);
7713*cdf0e10cSrcweir         String aFilterString (aFilterName);
7714*cdf0e10cSrcweir         String aOptString    (aFilterOptions);
7715*cdf0e10cSrcweir         String aSheetString  (aSheetName);
7716*cdf0e10cSrcweir 
7717*cdf0e10cSrcweir         aFileString = ScGlobal::GetAbsDocName( aFileString, pDocSh );
7718*cdf0e10cSrcweir         if ( !aFilterString.Len() )
7719*cdf0e10cSrcweir             ScDocumentLoader::GetFilterName( aFileString, aFilterString, aOptString, sal_True, sal_False );
7720*cdf0e10cSrcweir 
7721*cdf0e10cSrcweir         //  remove application prefix from filter name here, so the filter options
7722*cdf0e10cSrcweir         //  aren't reset when the filter name is changed in ScTableLink::DataChanged
7723*cdf0e10cSrcweir         ScDocumentLoader::RemoveAppPrefix( aFilterString );
7724*cdf0e10cSrcweir 
7725*cdf0e10cSrcweir         sal_uInt8 nLinkMode = SC_LINK_NONE;
7726*cdf0e10cSrcweir         if ( nMode == sheet::SheetLinkMode_NORMAL )
7727*cdf0e10cSrcweir             nLinkMode = SC_LINK_NORMAL;
7728*cdf0e10cSrcweir         else if ( nMode == sheet::SheetLinkMode_VALUE )
7729*cdf0e10cSrcweir             nLinkMode = SC_LINK_VALUE;
7730*cdf0e10cSrcweir 
7731*cdf0e10cSrcweir         sal_uLong nRefresh = 0;
7732*cdf0e10cSrcweir         pDoc->SetLink( nTab, nLinkMode, aFileString, aFilterString, aOptString, aSheetString, nRefresh );
7733*cdf0e10cSrcweir 
7734*cdf0e10cSrcweir         pDocSh->UpdateLinks();                  // ggf. Link eintragen oder loeschen
7735*cdf0e10cSrcweir         SfxBindings* pBindings = pDocSh->GetViewBindings();
7736*cdf0e10cSrcweir         if (pBindings)
7737*cdf0e10cSrcweir             pBindings->Invalidate(SID_LINKS);
7738*cdf0e10cSrcweir 
7739*cdf0e10cSrcweir         //! Undo fuer Link-Daten an der Table
7740*cdf0e10cSrcweir 
7741*cdf0e10cSrcweir         if ( nLinkMode != SC_LINK_NONE && pDoc->IsExecuteLinkEnabled() )        // Link updaten
7742*cdf0e10cSrcweir         {
7743*cdf0e10cSrcweir             //  Update immer, auch wenn der Link schon da war
7744*cdf0e10cSrcweir             //! Update nur fuer die betroffene Tabelle???
7745*cdf0e10cSrcweir 
7746*cdf0e10cSrcweir             sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
7747*cdf0e10cSrcweir             sal_uInt16 nCount = pLinkManager->GetLinks().Count();
7748*cdf0e10cSrcweir             for ( sal_uInt16 i=0; i<nCount; i++ )
7749*cdf0e10cSrcweir             {
7750*cdf0e10cSrcweir                 ::sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[i];
7751*cdf0e10cSrcweir                 if (pBase->ISA(ScTableLink))
7752*cdf0e10cSrcweir                 {
7753*cdf0e10cSrcweir                     ScTableLink* pTabLink = (ScTableLink*)pBase;
7754*cdf0e10cSrcweir                     if ( pTabLink->GetFileName() == aFileString )
7755*cdf0e10cSrcweir                         pTabLink->Update();                         // inkl. Paint&Undo
7756*cdf0e10cSrcweir 
7757*cdf0e10cSrcweir                     //! Der Dateiname sollte nur einmal vorkommen (?)
7758*cdf0e10cSrcweir                 }
7759*cdf0e10cSrcweir             }
7760*cdf0e10cSrcweir         }
7761*cdf0e10cSrcweir 
7762*cdf0e10cSrcweir         //! Notify fuer ScSheetLinkObj Objekte!!!
7763*cdf0e10cSrcweir     }
7764*cdf0e10cSrcweir }
7765*cdf0e10cSrcweir 
7766*cdf0e10cSrcweir // XSheetAuditing
7767*cdf0e10cSrcweir 
7768*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::hideDependents( const table::CellAddress& aPosition )
7769*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
7770*cdf0e10cSrcweir {
7771*cdf0e10cSrcweir     ScUnoGuard aGuard;
7772*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7773*cdf0e10cSrcweir     if ( pDocSh )
7774*cdf0e10cSrcweir     {
7775*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7776*cdf0e10cSrcweir         DBG_ASSERT( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
7777*cdf0e10cSrcweir         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
7778*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7779*cdf0e10cSrcweir         return aFunc.DetectiveDelSucc( aPos );
7780*cdf0e10cSrcweir     }
7781*cdf0e10cSrcweir     return sal_False;
7782*cdf0e10cSrcweir }
7783*cdf0e10cSrcweir 
7784*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::hidePrecedents( const table::CellAddress& aPosition )
7785*cdf0e10cSrcweir                                             throw(uno::RuntimeException)
7786*cdf0e10cSrcweir {
7787*cdf0e10cSrcweir     ScUnoGuard aGuard;
7788*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7789*cdf0e10cSrcweir     if ( pDocSh )
7790*cdf0e10cSrcweir     {
7791*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7792*cdf0e10cSrcweir         DBG_ASSERT( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
7793*cdf0e10cSrcweir         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
7794*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7795*cdf0e10cSrcweir         return aFunc.DetectiveDelPred( aPos );
7796*cdf0e10cSrcweir     }
7797*cdf0e10cSrcweir     return sal_False;
7798*cdf0e10cSrcweir }
7799*cdf0e10cSrcweir 
7800*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::showDependents( const table::CellAddress& aPosition )
7801*cdf0e10cSrcweir                                             throw(uno::RuntimeException)
7802*cdf0e10cSrcweir {
7803*cdf0e10cSrcweir     ScUnoGuard aGuard;
7804*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7805*cdf0e10cSrcweir     if ( pDocSh )
7806*cdf0e10cSrcweir     {
7807*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7808*cdf0e10cSrcweir         DBG_ASSERT( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
7809*cdf0e10cSrcweir         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
7810*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7811*cdf0e10cSrcweir         return aFunc.DetectiveAddSucc( aPos );
7812*cdf0e10cSrcweir     }
7813*cdf0e10cSrcweir     return sal_False;
7814*cdf0e10cSrcweir }
7815*cdf0e10cSrcweir 
7816*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::showPrecedents( const table::CellAddress& aPosition )
7817*cdf0e10cSrcweir                                             throw(uno::RuntimeException)
7818*cdf0e10cSrcweir {
7819*cdf0e10cSrcweir     ScUnoGuard aGuard;
7820*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7821*cdf0e10cSrcweir     if ( pDocSh )
7822*cdf0e10cSrcweir     {
7823*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7824*cdf0e10cSrcweir         DBG_ASSERT( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
7825*cdf0e10cSrcweir         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
7826*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7827*cdf0e10cSrcweir         return aFunc.DetectiveAddPred( aPos );
7828*cdf0e10cSrcweir     }
7829*cdf0e10cSrcweir     return sal_False;
7830*cdf0e10cSrcweir }
7831*cdf0e10cSrcweir 
7832*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::showErrors( const table::CellAddress& aPosition )
7833*cdf0e10cSrcweir                                             throw(uno::RuntimeException)
7834*cdf0e10cSrcweir {
7835*cdf0e10cSrcweir     ScUnoGuard aGuard;
7836*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7837*cdf0e10cSrcweir     if ( pDocSh )
7838*cdf0e10cSrcweir     {
7839*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7840*cdf0e10cSrcweir         DBG_ASSERT( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
7841*cdf0e10cSrcweir         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
7842*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7843*cdf0e10cSrcweir         return aFunc.DetectiveAddError( aPos );
7844*cdf0e10cSrcweir     }
7845*cdf0e10cSrcweir     return sal_False;
7846*cdf0e10cSrcweir }
7847*cdf0e10cSrcweir 
7848*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::showInvalid() throw(uno::RuntimeException)
7849*cdf0e10cSrcweir {
7850*cdf0e10cSrcweir     ScUnoGuard aGuard;
7851*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7852*cdf0e10cSrcweir     if ( pDocSh )
7853*cdf0e10cSrcweir     {
7854*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7855*cdf0e10cSrcweir         return aFunc.DetectiveMarkInvalid( GetTab_Impl() );
7856*cdf0e10cSrcweir     }
7857*cdf0e10cSrcweir     return sal_False;
7858*cdf0e10cSrcweir }
7859*cdf0e10cSrcweir 
7860*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::clearArrows() throw(uno::RuntimeException)
7861*cdf0e10cSrcweir {
7862*cdf0e10cSrcweir     ScUnoGuard aGuard;
7863*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7864*cdf0e10cSrcweir     if ( pDocSh )
7865*cdf0e10cSrcweir     {
7866*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7867*cdf0e10cSrcweir         aFunc.DetectiveDelAll( GetTab_Impl() );
7868*cdf0e10cSrcweir     }
7869*cdf0e10cSrcweir }
7870*cdf0e10cSrcweir 
7871*cdf0e10cSrcweir // XSheetOutline
7872*cdf0e10cSrcweir 
7873*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::group( const table::CellRangeAddress& rGroupRange,
7874*cdf0e10cSrcweir                                         table::TableOrientation nOrientation )
7875*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
7876*cdf0e10cSrcweir {
7877*cdf0e10cSrcweir     ScUnoGuard aGuard;
7878*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7879*cdf0e10cSrcweir     if ( pDocSh )
7880*cdf0e10cSrcweir     {
7881*cdf0e10cSrcweir         sal_Bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS );
7882*cdf0e10cSrcweir         ScRange aGroupRange;
7883*cdf0e10cSrcweir         ScUnoConversion::FillScRange( aGroupRange, rGroupRange );
7884*cdf0e10cSrcweir         ScOutlineDocFunc aFunc(*pDocSh);
7885*cdf0e10cSrcweir         aFunc.MakeOutline( aGroupRange, bColumns, sal_True, sal_True );
7886*cdf0e10cSrcweir     }
7887*cdf0e10cSrcweir }
7888*cdf0e10cSrcweir 
7889*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::ungroup( const table::CellRangeAddress& rGroupRange,
7890*cdf0e10cSrcweir                                         table::TableOrientation nOrientation )
7891*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
7892*cdf0e10cSrcweir {
7893*cdf0e10cSrcweir     ScUnoGuard aGuard;
7894*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7895*cdf0e10cSrcweir     if ( pDocSh )
7896*cdf0e10cSrcweir     {
7897*cdf0e10cSrcweir         sal_Bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS );
7898*cdf0e10cSrcweir         ScRange aGroupRange;
7899*cdf0e10cSrcweir         ScUnoConversion::FillScRange( aGroupRange, rGroupRange );
7900*cdf0e10cSrcweir         ScOutlineDocFunc aFunc(*pDocSh);
7901*cdf0e10cSrcweir         aFunc.RemoveOutline( aGroupRange, bColumns, sal_True, sal_True );
7902*cdf0e10cSrcweir     }
7903*cdf0e10cSrcweir }
7904*cdf0e10cSrcweir 
7905*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::autoOutline( const table::CellRangeAddress& rCellRange )
7906*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
7907*cdf0e10cSrcweir {
7908*cdf0e10cSrcweir     ScUnoGuard aGuard;
7909*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7910*cdf0e10cSrcweir     if ( pDocSh )
7911*cdf0e10cSrcweir     {
7912*cdf0e10cSrcweir         ScRange aFormulaRange;
7913*cdf0e10cSrcweir         ScUnoConversion::FillScRange( aFormulaRange, rCellRange );
7914*cdf0e10cSrcweir         ScOutlineDocFunc aFunc(*pDocSh);
7915*cdf0e10cSrcweir         aFunc.AutoOutline( aFormulaRange, sal_True, sal_True );
7916*cdf0e10cSrcweir     }
7917*cdf0e10cSrcweir }
7918*cdf0e10cSrcweir 
7919*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::clearOutline() throw(uno::RuntimeException)
7920*cdf0e10cSrcweir {
7921*cdf0e10cSrcweir     ScUnoGuard aGuard;
7922*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7923*cdf0e10cSrcweir     if ( pDocSh )
7924*cdf0e10cSrcweir     {
7925*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7926*cdf0e10cSrcweir         ScOutlineDocFunc aFunc(*pDocSh);
7927*cdf0e10cSrcweir         aFunc.RemoveAllOutlines( nTab, sal_True, sal_True );
7928*cdf0e10cSrcweir     }
7929*cdf0e10cSrcweir }
7930*cdf0e10cSrcweir 
7931*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::hideDetail( const table::CellRangeAddress& rCellRange )
7932*cdf0e10cSrcweir                                             throw(uno::RuntimeException)
7933*cdf0e10cSrcweir {
7934*cdf0e10cSrcweir     ScUnoGuard aGuard;
7935*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7936*cdf0e10cSrcweir     if ( pDocSh )
7937*cdf0e10cSrcweir     {
7938*cdf0e10cSrcweir         ScRange aMarkRange;
7939*cdf0e10cSrcweir         ScUnoConversion::FillScRange( aMarkRange, rCellRange );
7940*cdf0e10cSrcweir         ScOutlineDocFunc aFunc(*pDocSh);
7941*cdf0e10cSrcweir         aFunc.HideMarkedOutlines( aMarkRange, sal_True, sal_True );
7942*cdf0e10cSrcweir     }
7943*cdf0e10cSrcweir }
7944*cdf0e10cSrcweir 
7945*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::showDetail( const table::CellRangeAddress& rCellRange )
7946*cdf0e10cSrcweir                                             throw(uno::RuntimeException)
7947*cdf0e10cSrcweir {
7948*cdf0e10cSrcweir     ScUnoGuard aGuard;
7949*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7950*cdf0e10cSrcweir     if ( pDocSh )
7951*cdf0e10cSrcweir     {
7952*cdf0e10cSrcweir         ScRange aMarkRange;
7953*cdf0e10cSrcweir         ScUnoConversion::FillScRange( aMarkRange, rCellRange );
7954*cdf0e10cSrcweir         ScOutlineDocFunc aFunc(*pDocSh);
7955*cdf0e10cSrcweir         aFunc.ShowMarkedOutlines( aMarkRange, sal_True, sal_True );
7956*cdf0e10cSrcweir     }
7957*cdf0e10cSrcweir }
7958*cdf0e10cSrcweir 
7959*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::showLevel( sal_Int16 nLevel, table::TableOrientation nOrientation )
7960*cdf0e10cSrcweir                                             throw(uno::RuntimeException)
7961*cdf0e10cSrcweir {
7962*cdf0e10cSrcweir     ScUnoGuard aGuard;
7963*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7964*cdf0e10cSrcweir     if ( pDocSh )
7965*cdf0e10cSrcweir     {
7966*cdf0e10cSrcweir         sal_Bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS );
7967*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
7968*cdf0e10cSrcweir         ScOutlineDocFunc aFunc(*pDocSh);
7969*cdf0e10cSrcweir         aFunc.SelectLevel( nTab, bColumns, nLevel, sal_True, sal_True, sal_True );
7970*cdf0e10cSrcweir     }
7971*cdf0e10cSrcweir }
7972*cdf0e10cSrcweir 
7973*cdf0e10cSrcweir // XProtectable
7974*cdf0e10cSrcweir 
7975*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::protect( const rtl::OUString& aPassword )
7976*cdf0e10cSrcweir                                             throw(uno::RuntimeException)
7977*cdf0e10cSrcweir {
7978*cdf0e10cSrcweir     ScUnoGuard aGuard;
7979*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7980*cdf0e10cSrcweir     // #i108245# if already protected, don't change anything
7981*cdf0e10cSrcweir     if ( pDocSh && !pDocSh->GetDocument()->IsTabProtected( GetTab_Impl() ) )
7982*cdf0e10cSrcweir     {
7983*cdf0e10cSrcweir         String aString(aPassword);
7984*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7985*cdf0e10cSrcweir         aFunc.Protect( GetTab_Impl(), aString, sal_True );
7986*cdf0e10cSrcweir     }
7987*cdf0e10cSrcweir }
7988*cdf0e10cSrcweir 
7989*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::unprotect( const rtl::OUString& aPassword )
7990*cdf0e10cSrcweir                             throw(lang::IllegalArgumentException, uno::RuntimeException)
7991*cdf0e10cSrcweir {
7992*cdf0e10cSrcweir     ScUnoGuard aGuard;
7993*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
7994*cdf0e10cSrcweir     if ( pDocSh )
7995*cdf0e10cSrcweir     {
7996*cdf0e10cSrcweir         String aString(aPassword);
7997*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
7998*cdf0e10cSrcweir         sal_Bool bDone = aFunc.Unprotect( GetTab_Impl(), aString, sal_True );
7999*cdf0e10cSrcweir         if (!bDone)
8000*cdf0e10cSrcweir             throw lang::IllegalArgumentException();
8001*cdf0e10cSrcweir     }
8002*cdf0e10cSrcweir }
8003*cdf0e10cSrcweir 
8004*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::isProtected() throw(uno::RuntimeException)
8005*cdf0e10cSrcweir {
8006*cdf0e10cSrcweir     ScUnoGuard aGuard;
8007*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
8008*cdf0e10cSrcweir     if ( pDocSh )
8009*cdf0e10cSrcweir         return pDocSh->GetDocument()->IsTabProtected( GetTab_Impl() );
8010*cdf0e10cSrcweir 
8011*cdf0e10cSrcweir     DBG_ERROR("keine DocShell");        //! Exception oder so?
8012*cdf0e10cSrcweir     return sal_False;
8013*cdf0e10cSrcweir }
8014*cdf0e10cSrcweir 
8015*cdf0e10cSrcweir // XScenario
8016*cdf0e10cSrcweir 
8017*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::getIsScenario() throw(uno::RuntimeException)
8018*cdf0e10cSrcweir {
8019*cdf0e10cSrcweir     ScUnoGuard aGuard;
8020*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
8021*cdf0e10cSrcweir     if ( pDocSh )
8022*cdf0e10cSrcweir         return pDocSh->GetDocument()->IsScenario( GetTab_Impl() );
8023*cdf0e10cSrcweir 
8024*cdf0e10cSrcweir     return sal_False;
8025*cdf0e10cSrcweir }
8026*cdf0e10cSrcweir 
8027*cdf0e10cSrcweir rtl::OUString SAL_CALL ScTableSheetObj::getScenarioComment() throw(uno::RuntimeException)
8028*cdf0e10cSrcweir {
8029*cdf0e10cSrcweir     ScUnoGuard aGuard;
8030*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
8031*cdf0e10cSrcweir     if ( pDocSh )
8032*cdf0e10cSrcweir     {
8033*cdf0e10cSrcweir         String aComment;
8034*cdf0e10cSrcweir         Color  aColor;
8035*cdf0e10cSrcweir         sal_uInt16 nFlags;
8036*cdf0e10cSrcweir         pDocSh->GetDocument()->GetScenarioData( GetTab_Impl(), aComment, aColor, nFlags );
8037*cdf0e10cSrcweir         return aComment;
8038*cdf0e10cSrcweir     }
8039*cdf0e10cSrcweir     return rtl::OUString();
8040*cdf0e10cSrcweir }
8041*cdf0e10cSrcweir 
8042*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::setScenarioComment( const rtl::OUString& aScenarioComment )
8043*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
8044*cdf0e10cSrcweir {
8045*cdf0e10cSrcweir     ScUnoGuard aGuard;
8046*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
8047*cdf0e10cSrcweir     if ( pDocSh )
8048*cdf0e10cSrcweir     {
8049*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
8050*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
8051*cdf0e10cSrcweir 
8052*cdf0e10cSrcweir         String aName;
8053*cdf0e10cSrcweir         String aComment;
8054*cdf0e10cSrcweir         Color  aColor;
8055*cdf0e10cSrcweir         sal_uInt16 nFlags;
8056*cdf0e10cSrcweir         pDoc->GetName( nTab, aName );
8057*cdf0e10cSrcweir         pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8058*cdf0e10cSrcweir 
8059*cdf0e10cSrcweir         aComment = String( aScenarioComment );
8060*cdf0e10cSrcweir 
8061*cdf0e10cSrcweir         pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
8062*cdf0e10cSrcweir     }
8063*cdf0e10cSrcweir }
8064*cdf0e10cSrcweir 
8065*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::addRanges( const uno::Sequence<table::CellRangeAddress>& rScenRanges )
8066*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
8067*cdf0e10cSrcweir {
8068*cdf0e10cSrcweir     ScUnoGuard aGuard;
8069*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
8070*cdf0e10cSrcweir     if ( pDocSh )
8071*cdf0e10cSrcweir     {
8072*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
8073*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
8074*cdf0e10cSrcweir 
8075*cdf0e10cSrcweir         if (pDoc->IsScenario(nTab))
8076*cdf0e10cSrcweir         {
8077*cdf0e10cSrcweir             ScMarkData aMarkData;
8078*cdf0e10cSrcweir             aMarkData.SelectTable( nTab, sal_True );
8079*cdf0e10cSrcweir 
8080*cdf0e10cSrcweir             sal_uInt16 nRangeCount = (sal_uInt16)rScenRanges.getLength();
8081*cdf0e10cSrcweir             if (nRangeCount)
8082*cdf0e10cSrcweir             {
8083*cdf0e10cSrcweir                 const table::CellRangeAddress* pAry = rScenRanges.getConstArray();
8084*cdf0e10cSrcweir                 for (sal_uInt16 i=0; i<nRangeCount; i++)
8085*cdf0e10cSrcweir                 {
8086*cdf0e10cSrcweir                     DBG_ASSERT( pAry[i].Sheet == nTab, "addRanges mit falscher Tab" );
8087*cdf0e10cSrcweir                     ScRange aOneRange( (SCCOL)pAry[i].StartColumn, (SCROW)pAry[i].StartRow, nTab,
8088*cdf0e10cSrcweir                                        (SCCOL)pAry[i].EndColumn,   (SCROW)pAry[i].EndRow,   nTab );
8089*cdf0e10cSrcweir 
8090*cdf0e10cSrcweir                     aMarkData.SetMultiMarkArea( aOneRange );
8091*cdf0e10cSrcweir                 }
8092*cdf0e10cSrcweir             }
8093*cdf0e10cSrcweir 
8094*cdf0e10cSrcweir             //  Szenario-Ranges sind durch Attribut gekennzeichnet
8095*cdf0e10cSrcweir             ScPatternAttr aPattern( pDoc->GetPool() );
8096*cdf0e10cSrcweir             aPattern.GetItemSet().Put( ScMergeFlagAttr( SC_MF_SCENARIO ) );
8097*cdf0e10cSrcweir             aPattern.GetItemSet().Put( ScProtectionAttr( sal_True ) );
8098*cdf0e10cSrcweir             ScDocFunc aFunc(*pDocSh);
8099*cdf0e10cSrcweir             aFunc.ApplyAttributes( aMarkData, aPattern, sal_True, sal_True );
8100*cdf0e10cSrcweir         }
8101*cdf0e10cSrcweir 
8102*cdf0e10cSrcweir         // don't use. We should use therefor a private interface, so we can also set the flags.
8103*cdf0e10cSrcweir /*      else if (nTab > 0 && pDoc->IsImportingXML()) // make this sheet as an scenario and only if it is not the first sheet and only if it is ImportingXML,
8104*cdf0e10cSrcweir             // because than no UNDO and repaint is necessary.
8105*cdf0e10cSrcweir         {
8106*cdf0e10cSrcweir             sal_uInt16 nRangeCount = (sal_uInt16)rScenRanges.getLength();
8107*cdf0e10cSrcweir             if (nRangeCount)
8108*cdf0e10cSrcweir             {
8109*cdf0e10cSrcweir                 pDoc->SetScenario( nTab, sal_True );
8110*cdf0e10cSrcweir 
8111*cdf0e10cSrcweir                 // default flags
8112*cdf0e10cSrcweir                 Color aColor( COL_LIGHTGRAY );  // Default
8113*cdf0e10cSrcweir                 sal_uInt16 nFlags = SC_SCENARIO_SHOWFRAME | SC_SCENARIO_PRINTFRAME | SC_SCENARIO_TWOWAY;
8114*cdf0e10cSrcweir                 String aComment;
8115*cdf0e10cSrcweir 
8116*cdf0e10cSrcweir                 pDoc->SetScenarioData( nTab, aComment, aColor, nFlags );
8117*cdf0e10cSrcweir                 const table::CellRangeAddress* pAry = rScenRanges.getConstArray();
8118*cdf0e10cSrcweir                 for (sal_uInt16 i=0; i<nRangeCount; i++)
8119*cdf0e10cSrcweir                 {
8120*cdf0e10cSrcweir                     DBG_ASSERT( pAry[i].Sheet == nTab, "addRanges mit falscher Tab" );
8121*cdf0e10cSrcweir                     pDoc->ApplyFlagsTab( (sal_uInt16)pAry[i].StartColumn, (sal_uInt16)pAry[i].StartRow,
8122*cdf0e10cSrcweir                             (sal_uInt16)pAry[i].EndColumn, (sal_uInt16)pAry[i].EndRow, nTab, SC_MF_SCENARIO );
8123*cdf0e10cSrcweir                 }
8124*cdf0e10cSrcweir                 pDoc->SetActiveScenario( nTab, sal_True );
8125*cdf0e10cSrcweir 
8126*cdf0e10cSrcweir                 // set to next visible tab
8127*cdf0e10cSrcweir                 sal_uInt16 j = nTab - 1;
8128*cdf0e10cSrcweir                 sal_Bool bFinished = sal_False;
8129*cdf0e10cSrcweir                 while (j < nTab && !bFinished)
8130*cdf0e10cSrcweir                 {
8131*cdf0e10cSrcweir                     if (pDoc->IsVisible(j))
8132*cdf0e10cSrcweir                     {
8133*cdf0e10cSrcweir                         pDoc->SetVisibleTab(j);
8134*cdf0e10cSrcweir                         bFinished = sal_True;
8135*cdf0e10cSrcweir                     }
8136*cdf0e10cSrcweir                     else
8137*cdf0e10cSrcweir                         --j;
8138*cdf0e10cSrcweir                 }
8139*cdf0e10cSrcweir 
8140*cdf0e10cSrcweir                 ScDocFunc aFunc(*pDocSh);
8141*cdf0e10cSrcweir                 aFunc.SetTableVisible( nTab, sal_False, sal_True );
8142*cdf0e10cSrcweir             }
8143*cdf0e10cSrcweir         }*/
8144*cdf0e10cSrcweir     }
8145*cdf0e10cSrcweir }
8146*cdf0e10cSrcweir 
8147*cdf0e10cSrcweir void SAL_CALL ScTableSheetObj::apply() throw(uno::RuntimeException)
8148*cdf0e10cSrcweir {
8149*cdf0e10cSrcweir     ScUnoGuard aGuard;
8150*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
8151*cdf0e10cSrcweir     if ( pDocSh )
8152*cdf0e10cSrcweir     {
8153*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
8154*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
8155*cdf0e10cSrcweir         String aName;
8156*cdf0e10cSrcweir         pDoc->GetName( nTab, aName );       // Name dieses Szenarios
8157*cdf0e10cSrcweir 
8158*cdf0e10cSrcweir         SCTAB nDestTab = nTab;
8159*cdf0e10cSrcweir         while ( nDestTab > 0 && pDoc->IsScenario(nDestTab) )
8160*cdf0e10cSrcweir             --nDestTab;
8161*cdf0e10cSrcweir 
8162*cdf0e10cSrcweir         if ( !pDoc->IsScenario(nDestTab) )
8163*cdf0e10cSrcweir             pDocSh->UseScenario( nDestTab, aName );
8164*cdf0e10cSrcweir 
8165*cdf0e10cSrcweir         //! sonst Fehler oder so
8166*cdf0e10cSrcweir     }
8167*cdf0e10cSrcweir }
8168*cdf0e10cSrcweir 
8169*cdf0e10cSrcweir // XScenarioEnhanced
8170*cdf0e10cSrcweir 
8171*cdf0e10cSrcweir uno::Sequence< table::CellRangeAddress > SAL_CALL ScTableSheetObj::getRanges(  )
8172*cdf0e10cSrcweir                                     throw(uno::RuntimeException)
8173*cdf0e10cSrcweir {
8174*cdf0e10cSrcweir     ScUnoGuard aGuard;
8175*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
8176*cdf0e10cSrcweir     if ( pDocSh )
8177*cdf0e10cSrcweir     {
8178*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
8179*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
8180*cdf0e10cSrcweir         const ScRangeList* pRangeList = pDoc->GetScenarioRanges(nTab);
8181*cdf0e10cSrcweir         if (pRangeList)
8182*cdf0e10cSrcweir         {
8183*cdf0e10cSrcweir             sal_Int32 nCount = pRangeList->Count();
8184*cdf0e10cSrcweir             uno::Sequence< table::CellRangeAddress > aRetRanges(nCount);
8185*cdf0e10cSrcweir             table::CellRangeAddress* pAry = aRetRanges.getArray();
8186*cdf0e10cSrcweir             for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
8187*cdf0e10cSrcweir             {
8188*cdf0e10cSrcweir                 const ScRange* pRange = pRangeList->GetObject( nIndex );
8189*cdf0e10cSrcweir                 pAry->StartColumn = pRange->aStart.Col();
8190*cdf0e10cSrcweir                 pAry->StartRow = pRange->aStart.Row();
8191*cdf0e10cSrcweir                 pAry->EndColumn = pRange->aEnd.Col();
8192*cdf0e10cSrcweir                 pAry->EndRow = pRange->aEnd.Row();
8193*cdf0e10cSrcweir                 pAry->Sheet = pRange->aStart.Tab();
8194*cdf0e10cSrcweir                 ++pAry;
8195*cdf0e10cSrcweir             }
8196*cdf0e10cSrcweir             return aRetRanges;
8197*cdf0e10cSrcweir         }
8198*cdf0e10cSrcweir     }
8199*cdf0e10cSrcweir     return uno::Sequence< table::CellRangeAddress > ();
8200*cdf0e10cSrcweir }
8201*cdf0e10cSrcweir 
8202*cdf0e10cSrcweir // XExternalSheetName
8203*cdf0e10cSrcweir 
8204*cdf0e10cSrcweir void ScTableSheetObj::setExternalName( const ::rtl::OUString& aUrl, const ::rtl::OUString& aSheetName )
8205*cdf0e10cSrcweir     throw (container::ElementExistException, uno::RuntimeException)
8206*cdf0e10cSrcweir {
8207*cdf0e10cSrcweir     ScUnoGuard aGuard;
8208*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
8209*cdf0e10cSrcweir     if ( pDocSh )
8210*cdf0e10cSrcweir     {
8211*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
8212*cdf0e10cSrcweir         if ( pDoc )
8213*cdf0e10cSrcweir         {
8214*cdf0e10cSrcweir             const SCTAB nTab = GetTab_Impl();
8215*cdf0e10cSrcweir             const String aAbsDocName( ScGlobal::GetAbsDocName( aUrl, pDocSh ) );
8216*cdf0e10cSrcweir             const String aDocTabName( ScGlobal::GetDocTabName( aAbsDocName, aSheetName ) );
8217*cdf0e10cSrcweir             if ( !pDoc->RenameTab( nTab, aDocTabName, sal_False /*bUpdateRef*/, sal_True /*bExternalDocument*/ ) )
8218*cdf0e10cSrcweir             {
8219*cdf0e10cSrcweir                 throw container::ElementExistException( ::rtl::OUString(), *this );
8220*cdf0e10cSrcweir             }
8221*cdf0e10cSrcweir         }
8222*cdf0e10cSrcweir     }
8223*cdf0e10cSrcweir }
8224*cdf0e10cSrcweir 
8225*cdf0e10cSrcweir // XEventsSupplier
8226*cdf0e10cSrcweir 
8227*cdf0e10cSrcweir uno::Reference<container::XNameReplace> SAL_CALL ScTableSheetObj::getEvents() throw (uno::RuntimeException)
8228*cdf0e10cSrcweir {
8229*cdf0e10cSrcweir     ScUnoGuard aGuard;
8230*cdf0e10cSrcweir     ScDocShell* pDocSh = GetDocShell();
8231*cdf0e10cSrcweir     if ( pDocSh )
8232*cdf0e10cSrcweir         return new ScSheetEventsObj( pDocSh, GetTab_Impl() );
8233*cdf0e10cSrcweir 
8234*cdf0e10cSrcweir     return NULL;
8235*cdf0e10cSrcweir }
8236*cdf0e10cSrcweir 
8237*cdf0e10cSrcweir // XPropertySet erweitert fuer Sheet-Properties
8238*cdf0e10cSrcweir 
8239*cdf0e10cSrcweir uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableSheetObj::getPropertySetInfo()
8240*cdf0e10cSrcweir                                                         throw(uno::RuntimeException)
8241*cdf0e10cSrcweir {
8242*cdf0e10cSrcweir     ScUnoGuard aGuard;
8243*cdf0e10cSrcweir     static uno::Reference<beans::XPropertySetInfo> aRef(
8244*cdf0e10cSrcweir         new SfxItemPropertySetInfo( pSheetPropSet->getPropertyMap() ));
8245*cdf0e10cSrcweir     return aRef;
8246*cdf0e10cSrcweir }
8247*cdf0e10cSrcweir 
8248*cdf0e10cSrcweir void ScTableSheetObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
8249*cdf0e10cSrcweir                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
8250*cdf0e10cSrcweir {
8251*cdf0e10cSrcweir     if ( pEntry )
8252*cdf0e10cSrcweir     {
8253*cdf0e10cSrcweir         if ( IsScItemWid( pEntry->nWID ) )
8254*cdf0e10cSrcweir         {
8255*cdf0e10cSrcweir             //  for Item WIDs, call ScCellRangesBase directly
8256*cdf0e10cSrcweir             ScCellRangesBase::SetOnePropertyValue(pEntry, aValue);
8257*cdf0e10cSrcweir             return;
8258*cdf0e10cSrcweir         }
8259*cdf0e10cSrcweir 
8260*cdf0e10cSrcweir         //  own properties
8261*cdf0e10cSrcweir 
8262*cdf0e10cSrcweir         ScDocShell* pDocSh = GetDocShell();
8263*cdf0e10cSrcweir         if (!pDocSh)
8264*cdf0e10cSrcweir             return;                                                 //! Exception oder so?
8265*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
8266*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
8267*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
8268*cdf0e10cSrcweir 
8269*cdf0e10cSrcweir         if ( pEntry->nWID == SC_WID_UNO_PAGESTL )
8270*cdf0e10cSrcweir         {
8271*cdf0e10cSrcweir             rtl::OUString aStrVal;
8272*cdf0e10cSrcweir             aValue >>= aStrVal;
8273*cdf0e10cSrcweir             String aNewStr(ScStyleNameConversion::ProgrammaticToDisplayName(
8274*cdf0e10cSrcweir                                                 aStrVal, SFX_STYLE_FAMILY_PAGE ));
8275*cdf0e10cSrcweir 
8276*cdf0e10cSrcweir             //! Undo? (auch bei SID_STYLE_APPLY an der View)
8277*cdf0e10cSrcweir 
8278*cdf0e10cSrcweir             if ( pDoc->GetPageStyle( nTab ) != aNewStr )
8279*cdf0e10cSrcweir             {
8280*cdf0e10cSrcweir                 pDoc->SetPageStyle( nTab, aNewStr );
8281*cdf0e10cSrcweir                 if (!pDoc->IsImportingXML())
8282*cdf0e10cSrcweir                 {
8283*cdf0e10cSrcweir                     ScPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ).UpdatePages();
8284*cdf0e10cSrcweir 
8285*cdf0e10cSrcweir                     SfxBindings* pBindings = pDocSh->GetViewBindings();
8286*cdf0e10cSrcweir                     if (pBindings)
8287*cdf0e10cSrcweir                     {
8288*cdf0e10cSrcweir                         pBindings->Invalidate( SID_STYLE_FAMILY4 );
8289*cdf0e10cSrcweir                         pBindings->Invalidate( SID_STATUS_PAGESTYLE );
8290*cdf0e10cSrcweir                         pBindings->Invalidate( FID_RESET_PRINTZOOM );
8291*cdf0e10cSrcweir                         pBindings->Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT );
8292*cdf0e10cSrcweir                         pBindings->Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT );
8293*cdf0e10cSrcweir                     }
8294*cdf0e10cSrcweir                 }
8295*cdf0e10cSrcweir                 pDocSh->SetDocumentModified();
8296*cdf0e10cSrcweir             }
8297*cdf0e10cSrcweir         }
8298*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
8299*cdf0e10cSrcweir         {
8300*cdf0e10cSrcweir             sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
8301*cdf0e10cSrcweir             aFunc.SetTableVisible( nTab, bVis, sal_True );
8302*cdf0e10cSrcweir         }
8303*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_ISACTIVE )
8304*cdf0e10cSrcweir         {
8305*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8306*cdf0e10cSrcweir                 pDoc->SetActiveScenario( nTab, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
8307*cdf0e10cSrcweir         }
8308*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_BORDCOL )
8309*cdf0e10cSrcweir         {
8310*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8311*cdf0e10cSrcweir             {
8312*cdf0e10cSrcweir                 sal_Int32 nNewColor = 0;
8313*cdf0e10cSrcweir                 if (aValue >>= nNewColor)
8314*cdf0e10cSrcweir                 {
8315*cdf0e10cSrcweir                     String aName;
8316*cdf0e10cSrcweir                     String aComment;
8317*cdf0e10cSrcweir                     Color  aColor;
8318*cdf0e10cSrcweir                     sal_uInt16 nFlags;
8319*cdf0e10cSrcweir                     pDoc->GetName( nTab, aName );
8320*cdf0e10cSrcweir                     pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8321*cdf0e10cSrcweir 
8322*cdf0e10cSrcweir                     aColor = Color(static_cast<sal_uInt32>(nNewColor));
8323*cdf0e10cSrcweir 
8324*cdf0e10cSrcweir                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
8325*cdf0e10cSrcweir                 }
8326*cdf0e10cSrcweir             }
8327*cdf0e10cSrcweir         }
8328*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_PROTECT )
8329*cdf0e10cSrcweir         {
8330*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8331*cdf0e10cSrcweir             {
8332*cdf0e10cSrcweir                 String aName;
8333*cdf0e10cSrcweir                 String aComment;
8334*cdf0e10cSrcweir                 Color  aColor;
8335*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8336*cdf0e10cSrcweir                 pDoc->GetName( nTab, aName );
8337*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8338*cdf0e10cSrcweir                 sal_Bool bModify(sal_False);
8339*cdf0e10cSrcweir 
8340*cdf0e10cSrcweir                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
8341*cdf0e10cSrcweir                 {
8342*cdf0e10cSrcweir                     if (!(nFlags & SC_SCENARIO_PROTECT))
8343*cdf0e10cSrcweir                     {
8344*cdf0e10cSrcweir                         nFlags |= SC_SCENARIO_PROTECT;
8345*cdf0e10cSrcweir                         bModify = sal_True;
8346*cdf0e10cSrcweir                     }
8347*cdf0e10cSrcweir                 }
8348*cdf0e10cSrcweir                 else
8349*cdf0e10cSrcweir                 {
8350*cdf0e10cSrcweir                     if (nFlags & SC_SCENARIO_PROTECT)
8351*cdf0e10cSrcweir                     {
8352*cdf0e10cSrcweir                         nFlags -= SC_SCENARIO_PROTECT;
8353*cdf0e10cSrcweir                         bModify = sal_True;
8354*cdf0e10cSrcweir                     }
8355*cdf0e10cSrcweir                 }
8356*cdf0e10cSrcweir 
8357*cdf0e10cSrcweir                 if (bModify)
8358*cdf0e10cSrcweir                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
8359*cdf0e10cSrcweir             }
8360*cdf0e10cSrcweir         }
8361*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_SHOWBORD )
8362*cdf0e10cSrcweir         {
8363*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8364*cdf0e10cSrcweir             {
8365*cdf0e10cSrcweir                 String aName;
8366*cdf0e10cSrcweir                 String aComment;
8367*cdf0e10cSrcweir                 Color  aColor;
8368*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8369*cdf0e10cSrcweir                 pDoc->GetName( nTab, aName );
8370*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8371*cdf0e10cSrcweir                 sal_Bool bModify(sal_False);
8372*cdf0e10cSrcweir 
8373*cdf0e10cSrcweir                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
8374*cdf0e10cSrcweir                 {
8375*cdf0e10cSrcweir                     if (!(nFlags & SC_SCENARIO_SHOWFRAME))
8376*cdf0e10cSrcweir                     {
8377*cdf0e10cSrcweir                         nFlags |= SC_SCENARIO_SHOWFRAME;
8378*cdf0e10cSrcweir                         bModify = sal_True;
8379*cdf0e10cSrcweir                     }
8380*cdf0e10cSrcweir                 }
8381*cdf0e10cSrcweir                 else
8382*cdf0e10cSrcweir                 {
8383*cdf0e10cSrcweir                     if (nFlags & SC_SCENARIO_SHOWFRAME)
8384*cdf0e10cSrcweir                     {
8385*cdf0e10cSrcweir                         nFlags -= SC_SCENARIO_SHOWFRAME;
8386*cdf0e10cSrcweir                         bModify = sal_True;
8387*cdf0e10cSrcweir                     }
8388*cdf0e10cSrcweir                 }
8389*cdf0e10cSrcweir 
8390*cdf0e10cSrcweir                 if (bModify)
8391*cdf0e10cSrcweir                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
8392*cdf0e10cSrcweir             }
8393*cdf0e10cSrcweir         }
8394*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_PRINTBORD )
8395*cdf0e10cSrcweir         {
8396*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8397*cdf0e10cSrcweir             {
8398*cdf0e10cSrcweir                 String aName;
8399*cdf0e10cSrcweir                 String aComment;
8400*cdf0e10cSrcweir                 Color  aColor;
8401*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8402*cdf0e10cSrcweir                 pDoc->GetName( nTab, aName );
8403*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8404*cdf0e10cSrcweir                 sal_Bool bModify(sal_False);
8405*cdf0e10cSrcweir 
8406*cdf0e10cSrcweir                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
8407*cdf0e10cSrcweir                 {
8408*cdf0e10cSrcweir                     if (!(nFlags & SC_SCENARIO_PRINTFRAME))
8409*cdf0e10cSrcweir                     {
8410*cdf0e10cSrcweir                         nFlags |= SC_SCENARIO_PRINTFRAME;
8411*cdf0e10cSrcweir                         bModify = sal_True;
8412*cdf0e10cSrcweir                     }
8413*cdf0e10cSrcweir                 }
8414*cdf0e10cSrcweir                 else
8415*cdf0e10cSrcweir                 {
8416*cdf0e10cSrcweir                     if (nFlags & SC_SCENARIO_PRINTFRAME)
8417*cdf0e10cSrcweir                     {
8418*cdf0e10cSrcweir                         nFlags -= SC_SCENARIO_PRINTFRAME;
8419*cdf0e10cSrcweir                         bModify = sal_True;
8420*cdf0e10cSrcweir                     }
8421*cdf0e10cSrcweir                 }
8422*cdf0e10cSrcweir 
8423*cdf0e10cSrcweir                 if (bModify)
8424*cdf0e10cSrcweir                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
8425*cdf0e10cSrcweir             }
8426*cdf0e10cSrcweir         }
8427*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_COPYBACK )
8428*cdf0e10cSrcweir         {
8429*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8430*cdf0e10cSrcweir             {
8431*cdf0e10cSrcweir                 String aName;
8432*cdf0e10cSrcweir                 String aComment;
8433*cdf0e10cSrcweir                 Color  aColor;
8434*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8435*cdf0e10cSrcweir                 pDoc->GetName( nTab, aName );
8436*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8437*cdf0e10cSrcweir                 sal_Bool bModify(sal_False);
8438*cdf0e10cSrcweir 
8439*cdf0e10cSrcweir                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
8440*cdf0e10cSrcweir                 {
8441*cdf0e10cSrcweir                     if (!(nFlags & SC_SCENARIO_TWOWAY))
8442*cdf0e10cSrcweir                     {
8443*cdf0e10cSrcweir                         nFlags |= SC_SCENARIO_TWOWAY;
8444*cdf0e10cSrcweir                         bModify = sal_True;
8445*cdf0e10cSrcweir                     }
8446*cdf0e10cSrcweir                 }
8447*cdf0e10cSrcweir                 else
8448*cdf0e10cSrcweir                 {
8449*cdf0e10cSrcweir                     if (nFlags & SC_SCENARIO_TWOWAY)
8450*cdf0e10cSrcweir                     {
8451*cdf0e10cSrcweir                         nFlags -= SC_SCENARIO_TWOWAY;
8452*cdf0e10cSrcweir                         bModify = sal_True;
8453*cdf0e10cSrcweir                     }
8454*cdf0e10cSrcweir                 }
8455*cdf0e10cSrcweir 
8456*cdf0e10cSrcweir                 if (bModify)
8457*cdf0e10cSrcweir                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
8458*cdf0e10cSrcweir             }
8459*cdf0e10cSrcweir         }
8460*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_COPYSTYL )
8461*cdf0e10cSrcweir         {
8462*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8463*cdf0e10cSrcweir             {
8464*cdf0e10cSrcweir                 String aName;
8465*cdf0e10cSrcweir                 String aComment;
8466*cdf0e10cSrcweir                 Color  aColor;
8467*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8468*cdf0e10cSrcweir                 pDoc->GetName( nTab, aName );
8469*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8470*cdf0e10cSrcweir                 sal_Bool bModify(sal_False);
8471*cdf0e10cSrcweir 
8472*cdf0e10cSrcweir                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
8473*cdf0e10cSrcweir                 {
8474*cdf0e10cSrcweir                     if (!(nFlags & SC_SCENARIO_ATTRIB))
8475*cdf0e10cSrcweir                     {
8476*cdf0e10cSrcweir                         nFlags |= SC_SCENARIO_ATTRIB;
8477*cdf0e10cSrcweir                         bModify = sal_True;
8478*cdf0e10cSrcweir                     }
8479*cdf0e10cSrcweir                 }
8480*cdf0e10cSrcweir                 else
8481*cdf0e10cSrcweir                 {
8482*cdf0e10cSrcweir                     if (nFlags & SC_SCENARIO_ATTRIB)
8483*cdf0e10cSrcweir                     {
8484*cdf0e10cSrcweir                         nFlags -= SC_SCENARIO_ATTRIB;
8485*cdf0e10cSrcweir                         bModify = sal_True;
8486*cdf0e10cSrcweir                     }
8487*cdf0e10cSrcweir                 }
8488*cdf0e10cSrcweir 
8489*cdf0e10cSrcweir                 if (bModify)
8490*cdf0e10cSrcweir                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
8491*cdf0e10cSrcweir             }
8492*cdf0e10cSrcweir         }
8493*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_COPYFORM )
8494*cdf0e10cSrcweir         {
8495*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8496*cdf0e10cSrcweir             {
8497*cdf0e10cSrcweir                 String aName;
8498*cdf0e10cSrcweir                 String aComment;
8499*cdf0e10cSrcweir                 Color  aColor;
8500*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8501*cdf0e10cSrcweir                 pDoc->GetName( nTab, aName );
8502*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8503*cdf0e10cSrcweir                 sal_Bool bModify(sal_False);
8504*cdf0e10cSrcweir 
8505*cdf0e10cSrcweir                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
8506*cdf0e10cSrcweir                 {
8507*cdf0e10cSrcweir                     if (nFlags & SC_SCENARIO_VALUE)
8508*cdf0e10cSrcweir                     {
8509*cdf0e10cSrcweir                         nFlags -= SC_SCENARIO_VALUE;
8510*cdf0e10cSrcweir                         bModify = sal_True;
8511*cdf0e10cSrcweir                     }
8512*cdf0e10cSrcweir                 }
8513*cdf0e10cSrcweir                 else
8514*cdf0e10cSrcweir                 {
8515*cdf0e10cSrcweir                     if (!(nFlags & SC_SCENARIO_VALUE))
8516*cdf0e10cSrcweir                     {
8517*cdf0e10cSrcweir                         nFlags |= SC_SCENARIO_VALUE;
8518*cdf0e10cSrcweir                         bModify = sal_True;
8519*cdf0e10cSrcweir                     }
8520*cdf0e10cSrcweir                 }
8521*cdf0e10cSrcweir 
8522*cdf0e10cSrcweir                 if (bModify)
8523*cdf0e10cSrcweir                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
8524*cdf0e10cSrcweir             }
8525*cdf0e10cSrcweir         }
8526*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_TABLAYOUT )
8527*cdf0e10cSrcweir         {
8528*cdf0e10cSrcweir             sal_Int16 nValue = 0;
8529*cdf0e10cSrcweir             if (aValue >>= nValue)
8530*cdf0e10cSrcweir             {
8531*cdf0e10cSrcweir                 if (nValue == com::sun::star::text::WritingMode2::RL_TB)
8532*cdf0e10cSrcweir                     aFunc.SetLayoutRTL(nTab, sal_True, sal_True);
8533*cdf0e10cSrcweir                 else
8534*cdf0e10cSrcweir                     aFunc.SetLayoutRTL(nTab, sal_False, sal_True);
8535*cdf0e10cSrcweir             }
8536*cdf0e10cSrcweir         }
8537*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_AUTOPRINT )
8538*cdf0e10cSrcweir         {
8539*cdf0e10cSrcweir             sal_Bool bAutoPrint = ScUnoHelpFunctions::GetBoolFromAny( aValue );
8540*cdf0e10cSrcweir             if (bAutoPrint)
8541*cdf0e10cSrcweir                 pDoc->SetPrintEntireSheet( nTab ); // clears all print ranges
8542*cdf0e10cSrcweir             else
8543*cdf0e10cSrcweir             {
8544*cdf0e10cSrcweir                 if (pDoc->IsPrintEntireSheet( nTab ))
8545*cdf0e10cSrcweir                     pDoc->ClearPrintRanges( nTab ); // if this flag is true, there are no PrintRanges, so Clear clears only the flag.
8546*cdf0e10cSrcweir             }
8547*cdf0e10cSrcweir         }
8548*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_TABCOLOR )
8549*cdf0e10cSrcweir         {
8550*cdf0e10cSrcweir             sal_Int32 nColor = COL_AUTO;
8551*cdf0e10cSrcweir             if (aValue >>= nColor)
8552*cdf0e10cSrcweir             {
8553*cdf0e10cSrcweir                 if (static_cast<ColorData>(nColor) != COL_AUTO)
8554*cdf0e10cSrcweir                     pDoc->SetTabBgColor(nTab, Color(static_cast<ColorData>(nColor)));
8555*cdf0e10cSrcweir             }
8556*cdf0e10cSrcweir         }
8557*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CODENAME )
8558*cdf0e10cSrcweir         {
8559*cdf0e10cSrcweir             rtl::OUString aCodeName;
8560*cdf0e10cSrcweir             if ( pDocSh && ( aValue >>= aCodeName ) )
8561*cdf0e10cSrcweir             {
8562*cdf0e10cSrcweir                 pDocSh->GetDocument()->SetCodeName( GetTab_Impl(), aCodeName );
8563*cdf0e10cSrcweir             }
8564*cdf0e10cSrcweir         }
8565*cdf0e10cSrcweir         else
8566*cdf0e10cSrcweir             ScCellRangeObj::SetOnePropertyValue(pEntry, aValue);        // base class, no Item WID
8567*cdf0e10cSrcweir     }
8568*cdf0e10cSrcweir }
8569*cdf0e10cSrcweir 
8570*cdf0e10cSrcweir void ScTableSheetObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
8571*cdf0e10cSrcweir                                             uno::Any& rAny )
8572*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
8573*cdf0e10cSrcweir {
8574*cdf0e10cSrcweir     if ( pEntry )
8575*cdf0e10cSrcweir     {
8576*cdf0e10cSrcweir         ScDocShell* pDocSh = GetDocShell();
8577*cdf0e10cSrcweir         if (!pDocSh)
8578*cdf0e10cSrcweir             throw uno::RuntimeException();
8579*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
8580*cdf0e10cSrcweir         SCTAB nTab = GetTab_Impl();
8581*cdf0e10cSrcweir 
8582*cdf0e10cSrcweir         if ( pEntry->nWID == SC_WID_UNO_PAGESTL )
8583*cdf0e10cSrcweir         {
8584*cdf0e10cSrcweir             rAny <<= rtl::OUString( ScStyleNameConversion::DisplayToProgrammaticName(
8585*cdf0e10cSrcweir                                 pDoc->GetPageStyle( nTab ), SFX_STYLE_FAMILY_PAGE ) );
8586*cdf0e10cSrcweir         }
8587*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
8588*cdf0e10cSrcweir         {
8589*cdf0e10cSrcweir             sal_Bool bVis = pDoc->IsVisible( nTab );
8590*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny( rAny, bVis );
8591*cdf0e10cSrcweir         }
8592*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_LINKDISPBIT )
8593*cdf0e10cSrcweir         {
8594*cdf0e10cSrcweir             //  no target bitmaps for individual entries (would be all equal)
8595*cdf0e10cSrcweir             // ScLinkTargetTypeObj::SetLinkTargetBitmap( aAny, SC_LINKTARGETTYPE_SHEET );
8596*cdf0e10cSrcweir         }
8597*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_LINKDISPNAME )
8598*cdf0e10cSrcweir         {
8599*cdf0e10cSrcweir             //  LinkDisplayName for hyperlink dialog
8600*cdf0e10cSrcweir             rAny <<= getName();     // sheet name
8601*cdf0e10cSrcweir         }
8602*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_ISACTIVE )
8603*cdf0e10cSrcweir         {
8604*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8605*cdf0e10cSrcweir                 ScUnoHelpFunctions::SetBoolInAny( rAny, pDoc->IsActiveScenario( nTab ));
8606*cdf0e10cSrcweir         }
8607*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_BORDCOL )
8608*cdf0e10cSrcweir         {
8609*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8610*cdf0e10cSrcweir             {
8611*cdf0e10cSrcweir                 String aComment;
8612*cdf0e10cSrcweir                 Color  aColor;
8613*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8614*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8615*cdf0e10cSrcweir 
8616*cdf0e10cSrcweir                 rAny <<= static_cast<sal_Int32>(aColor.GetColor());
8617*cdf0e10cSrcweir             }
8618*cdf0e10cSrcweir         }
8619*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_PROTECT )
8620*cdf0e10cSrcweir         {
8621*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8622*cdf0e10cSrcweir             {
8623*cdf0e10cSrcweir                 String aComment;
8624*cdf0e10cSrcweir                 Color  aColor;
8625*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8626*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8627*cdf0e10cSrcweir 
8628*cdf0e10cSrcweir                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_PROTECT) != 0 );
8629*cdf0e10cSrcweir             }
8630*cdf0e10cSrcweir         }
8631*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_SHOWBORD )
8632*cdf0e10cSrcweir         {
8633*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8634*cdf0e10cSrcweir             {
8635*cdf0e10cSrcweir                 String aComment;
8636*cdf0e10cSrcweir                 Color  aColor;
8637*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8638*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8639*cdf0e10cSrcweir 
8640*cdf0e10cSrcweir                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_SHOWFRAME) != 0 );
8641*cdf0e10cSrcweir             }
8642*cdf0e10cSrcweir         }
8643*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_PRINTBORD )
8644*cdf0e10cSrcweir         {
8645*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8646*cdf0e10cSrcweir             {
8647*cdf0e10cSrcweir                 String aComment;
8648*cdf0e10cSrcweir                 Color  aColor;
8649*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8650*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8651*cdf0e10cSrcweir 
8652*cdf0e10cSrcweir                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_PRINTFRAME) != 0 );
8653*cdf0e10cSrcweir             }
8654*cdf0e10cSrcweir         }
8655*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_COPYBACK )
8656*cdf0e10cSrcweir         {
8657*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8658*cdf0e10cSrcweir             {
8659*cdf0e10cSrcweir                 String aComment;
8660*cdf0e10cSrcweir                 Color  aColor;
8661*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8662*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8663*cdf0e10cSrcweir 
8664*cdf0e10cSrcweir                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_TWOWAY) != 0 );
8665*cdf0e10cSrcweir             }
8666*cdf0e10cSrcweir         }
8667*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_COPYSTYL )
8668*cdf0e10cSrcweir         {
8669*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8670*cdf0e10cSrcweir             {
8671*cdf0e10cSrcweir                 String aComment;
8672*cdf0e10cSrcweir                 Color  aColor;
8673*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8674*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8675*cdf0e10cSrcweir 
8676*cdf0e10cSrcweir                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_ATTRIB) != 0 );
8677*cdf0e10cSrcweir             }
8678*cdf0e10cSrcweir         }
8679*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_COPYFORM )
8680*cdf0e10cSrcweir         {
8681*cdf0e10cSrcweir             if (pDoc->IsScenario(nTab))
8682*cdf0e10cSrcweir             {
8683*cdf0e10cSrcweir                 String aComment;
8684*cdf0e10cSrcweir                 Color  aColor;
8685*cdf0e10cSrcweir                 sal_uInt16 nFlags;
8686*cdf0e10cSrcweir                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
8687*cdf0e10cSrcweir 
8688*cdf0e10cSrcweir                 ScUnoHelpFunctions::SetBoolInAny( rAny, !(nFlags & SC_SCENARIO_VALUE));
8689*cdf0e10cSrcweir             }
8690*cdf0e10cSrcweir         }
8691*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_TABLAYOUT )
8692*cdf0e10cSrcweir         {
8693*cdf0e10cSrcweir             if (pDoc->IsLayoutRTL(nTab))
8694*cdf0e10cSrcweir                 rAny <<= sal_Int16(com::sun::star::text::WritingMode2::RL_TB);
8695*cdf0e10cSrcweir             else
8696*cdf0e10cSrcweir                 rAny <<= sal_Int16(com::sun::star::text::WritingMode2::LR_TB);
8697*cdf0e10cSrcweir         }
8698*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_AUTOPRINT )
8699*cdf0e10cSrcweir         {
8700*cdf0e10cSrcweir             sal_Bool bAutoPrint = pDoc->IsPrintEntireSheet( nTab );
8701*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny( rAny, bAutoPrint );
8702*cdf0e10cSrcweir         }
8703*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_TABCOLOR )
8704*cdf0e10cSrcweir         {
8705*cdf0e10cSrcweir             rAny <<= sal_Int32(pDoc->GetTabBgColor(nTab).GetColor());
8706*cdf0e10cSrcweir         }
8707*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CODENAME )
8708*cdf0e10cSrcweir         {
8709*cdf0e10cSrcweir             String aCodeName;
8710*cdf0e10cSrcweir             if ( pDocSh )
8711*cdf0e10cSrcweir                 pDocSh->GetDocument()->GetCodeName( GetTab_Impl(), aCodeName );
8712*cdf0e10cSrcweir             rAny <<= rtl::OUString( aCodeName );
8713*cdf0e10cSrcweir         }
8714*cdf0e10cSrcweir         else
8715*cdf0e10cSrcweir             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
8716*cdf0e10cSrcweir     }
8717*cdf0e10cSrcweir }
8718*cdf0e10cSrcweir 
8719*cdf0e10cSrcweir const SfxItemPropertyMap* ScTableSheetObj::GetItemPropertyMap()
8720*cdf0e10cSrcweir {
8721*cdf0e10cSrcweir     return pSheetPropSet->getPropertyMap();
8722*cdf0e10cSrcweir }
8723*cdf0e10cSrcweir 
8724*cdf0e10cSrcweir // XServiceInfo
8725*cdf0e10cSrcweir 
8726*cdf0e10cSrcweir rtl::OUString SAL_CALL ScTableSheetObj::getImplementationName() throw(uno::RuntimeException)
8727*cdf0e10cSrcweir {
8728*cdf0e10cSrcweir     return rtl::OUString::createFromAscii( "ScTableSheetObj" );
8729*cdf0e10cSrcweir }
8730*cdf0e10cSrcweir 
8731*cdf0e10cSrcweir sal_Bool SAL_CALL ScTableSheetObj::supportsService( const rtl::OUString& rServiceName )
8732*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
8733*cdf0e10cSrcweir {
8734*cdf0e10cSrcweir     String aServiceStr( rServiceName );
8735*cdf0e10cSrcweir     return aServiceStr.EqualsAscii( SCSPREADSHEET_SERVICE ) ||
8736*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCSHEETCELLRANGE_SERVICE ) ||
8737*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCELLRANGE_SERVICE ) ||
8738*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) ||
8739*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) ||
8740*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE ) ||
8741*cdf0e10cSrcweir            aServiceStr.EqualsAscii( SCLINKTARGET_SERVICE );
8742*cdf0e10cSrcweir }
8743*cdf0e10cSrcweir 
8744*cdf0e10cSrcweir uno::Sequence<rtl::OUString> SAL_CALL ScTableSheetObj::getSupportedServiceNames()
8745*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
8746*cdf0e10cSrcweir {
8747*cdf0e10cSrcweir     uno::Sequence<rtl::OUString> aRet(7);
8748*cdf0e10cSrcweir     rtl::OUString* pArray = aRet.getArray();
8749*cdf0e10cSrcweir     pArray[0] = rtl::OUString::createFromAscii( SCSPREADSHEET_SERVICE );
8750*cdf0e10cSrcweir     pArray[1] = rtl::OUString::createFromAscii( SCSHEETCELLRANGE_SERVICE );
8751*cdf0e10cSrcweir     pArray[2] = rtl::OUString::createFromAscii( SCCELLRANGE_SERVICE );
8752*cdf0e10cSrcweir     pArray[3] = rtl::OUString::createFromAscii( SCCELLPROPERTIES_SERVICE );
8753*cdf0e10cSrcweir     pArray[4] = rtl::OUString::createFromAscii( SCCHARPROPERTIES_SERVICE );
8754*cdf0e10cSrcweir     pArray[5] = rtl::OUString::createFromAscii( SCPARAPROPERTIES_SERVICE );
8755*cdf0e10cSrcweir     pArray[6] = rtl::OUString::createFromAscii( SCLINKTARGET_SERVICE );
8756*cdf0e10cSrcweir     return aRet;
8757*cdf0e10cSrcweir }
8758*cdf0e10cSrcweir 
8759*cdf0e10cSrcweir // XUnoTunnel
8760*cdf0e10cSrcweir 
8761*cdf0e10cSrcweir sal_Int64 SAL_CALL ScTableSheetObj::getSomething(
8762*cdf0e10cSrcweir                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
8763*cdf0e10cSrcweir {
8764*cdf0e10cSrcweir     if ( rId.getLength() == 16 &&
8765*cdf0e10cSrcweir           0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
8766*cdf0e10cSrcweir                                     rId.getConstArray(), 16 ) )
8767*cdf0e10cSrcweir     {
8768*cdf0e10cSrcweir         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
8769*cdf0e10cSrcweir     }
8770*cdf0e10cSrcweir 
8771*cdf0e10cSrcweir     return ScCellRangeObj::getSomething( rId );
8772*cdf0e10cSrcweir }
8773*cdf0e10cSrcweir 
8774*cdf0e10cSrcweir // static
8775*cdf0e10cSrcweir const uno::Sequence<sal_Int8>& ScTableSheetObj::getUnoTunnelId()
8776*cdf0e10cSrcweir {
8777*cdf0e10cSrcweir     static uno::Sequence<sal_Int8> * pSeq = 0;
8778*cdf0e10cSrcweir     if( !pSeq )
8779*cdf0e10cSrcweir     {
8780*cdf0e10cSrcweir         osl::Guard< osl::Mutex > aGuard( osl::Mutex::getGlobalMutex() );
8781*cdf0e10cSrcweir         if( !pSeq )
8782*cdf0e10cSrcweir         {
8783*cdf0e10cSrcweir             static uno::Sequence< sal_Int8 > aSeq( 16 );
8784*cdf0e10cSrcweir             rtl_createUuid( (sal_uInt8*)aSeq.getArray(), 0, sal_True );
8785*cdf0e10cSrcweir             pSeq = &aSeq;
8786*cdf0e10cSrcweir         }
8787*cdf0e10cSrcweir     }
8788*cdf0e10cSrcweir     return *pSeq;
8789*cdf0e10cSrcweir }
8790*cdf0e10cSrcweir 
8791*cdf0e10cSrcweir // static
8792*cdf0e10cSrcweir ScTableSheetObj* ScTableSheetObj::getImplementation( const uno::Reference<uno::XInterface> xObj )
8793*cdf0e10cSrcweir {
8794*cdf0e10cSrcweir     ScTableSheetObj* pRet = NULL;
8795*cdf0e10cSrcweir     uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
8796*cdf0e10cSrcweir     if (xUT.is())
8797*cdf0e10cSrcweir         pRet = reinterpret_cast<ScTableSheetObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
8798*cdf0e10cSrcweir     return pRet;
8799*cdf0e10cSrcweir }
8800*cdf0e10cSrcweir 
8801*cdf0e10cSrcweir //------------------------------------------------------------------------
8802*cdf0e10cSrcweir 
8803*cdf0e10cSrcweir ScTableColumnObj::ScTableColumnObj( ScDocShell* pDocSh, SCCOL nCol, SCTAB nTab ) :
8804*cdf0e10cSrcweir     ScCellRangeObj( pDocSh, ScRange(nCol,0,nTab, nCol,MAXROW,nTab) ),
8805*cdf0e10cSrcweir     pColPropSet(lcl_GetColumnPropertySet())
8806*cdf0e10cSrcweir {
8807*cdf0e10cSrcweir }
8808*cdf0e10cSrcweir 
8809*cdf0e10cSrcweir ScTableColumnObj::~ScTableColumnObj()
8810*cdf0e10cSrcweir {
8811*cdf0e10cSrcweir }
8812*cdf0e10cSrcweir 
8813*cdf0e10cSrcweir uno::Any SAL_CALL ScTableColumnObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException)
8814*cdf0e10cSrcweir {
8815*cdf0e10cSrcweir     SC_QUERYINTERFACE( container::XNamed )
8816*cdf0e10cSrcweir 
8817*cdf0e10cSrcweir     return ScCellRangeObj::queryInterface( rType );
8818*cdf0e10cSrcweir }
8819*cdf0e10cSrcweir 
8820*cdf0e10cSrcweir void SAL_CALL ScTableColumnObj::acquire() throw()
8821*cdf0e10cSrcweir {
8822*cdf0e10cSrcweir     ScCellRangeObj::acquire();
8823*cdf0e10cSrcweir }
8824*cdf0e10cSrcweir 
8825*cdf0e10cSrcweir void SAL_CALL ScTableColumnObj::release() throw()
8826*cdf0e10cSrcweir {
8827*cdf0e10cSrcweir     ScCellRangeObj::release();
8828*cdf0e10cSrcweir }
8829*cdf0e10cSrcweir 
8830*cdf0e10cSrcweir uno::Sequence<uno::Type> SAL_CALL ScTableColumnObj::getTypes() throw(uno::RuntimeException)
8831*cdf0e10cSrcweir {
8832*cdf0e10cSrcweir     static uno::Sequence<uno::Type> aTypes;
8833*cdf0e10cSrcweir     if ( aTypes.getLength() == 0 )
8834*cdf0e10cSrcweir     {
8835*cdf0e10cSrcweir         uno::Sequence<uno::Type> aParentTypes(ScCellRangeObj::getTypes());
8836*cdf0e10cSrcweir         long nParentLen = aParentTypes.getLength();
8837*cdf0e10cSrcweir         const uno::Type* pParentPtr = aParentTypes.getConstArray();
8838*cdf0e10cSrcweir 
8839*cdf0e10cSrcweir         aTypes.realloc( nParentLen + 1 );
8840*cdf0e10cSrcweir         uno::Type* pPtr = aTypes.getArray();
8841*cdf0e10cSrcweir         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<container::XNamed>*)0);
8842*cdf0e10cSrcweir 
8843*cdf0e10cSrcweir         for (long i=0; i<nParentLen; i++)
8844*cdf0e10cSrcweir             pPtr[i] = pParentPtr[i];                // parent types first
8845*cdf0e10cSrcweir     }
8846*cdf0e10cSrcweir     return aTypes;
8847*cdf0e10cSrcweir }
8848*cdf0e10cSrcweir 
8849*cdf0e10cSrcweir uno::Sequence<sal_Int8> SAL_CALL ScTableColumnObj::getImplementationId() throw(uno::RuntimeException)
8850*cdf0e10cSrcweir {
8851*cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId;
8852*cdf0e10cSrcweir     if( aId.getLength() == 0 )
8853*cdf0e10cSrcweir     {
8854*cdf0e10cSrcweir         aId.realloc( 16 );
8855*cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)aId.getArray(), 0, sal_True );
8856*cdf0e10cSrcweir     }
8857*cdf0e10cSrcweir     return aId;
8858*cdf0e10cSrcweir }
8859*cdf0e10cSrcweir 
8860*cdf0e10cSrcweir // XNamed
8861*cdf0e10cSrcweir 
8862*cdf0e10cSrcweir rtl::OUString SAL_CALL ScTableColumnObj::getName() throw(uno::RuntimeException)
8863*cdf0e10cSrcweir {
8864*cdf0e10cSrcweir     ScUnoGuard aGuard;
8865*cdf0e10cSrcweir 
8866*cdf0e10cSrcweir     const ScRange& rRange = GetRange();
8867*cdf0e10cSrcweir     DBG_ASSERT(rRange.aStart.Col() == rRange.aEnd.Col(), "too many columns");
8868*cdf0e10cSrcweir     SCCOL nCol = rRange.aStart.Col();
8869*cdf0e10cSrcweir 
8870*cdf0e10cSrcweir     return ScColToAlpha( nCol );        // from global.hxx
8871*cdf0e10cSrcweir }
8872*cdf0e10cSrcweir 
8873*cdf0e10cSrcweir void SAL_CALL ScTableColumnObj::setName( const rtl::OUString& /* aNewName */ )
8874*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
8875*cdf0e10cSrcweir {
8876*cdf0e10cSrcweir     ScUnoGuard aGuard;
8877*cdf0e10cSrcweir     throw uno::RuntimeException();      // read-only
8878*cdf0e10cSrcweir }
8879*cdf0e10cSrcweir 
8880*cdf0e10cSrcweir // XPropertySet erweitert fuer Spalten-Properties
8881*cdf0e10cSrcweir 
8882*cdf0e10cSrcweir uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableColumnObj::getPropertySetInfo()
8883*cdf0e10cSrcweir                                                         throw(uno::RuntimeException)
8884*cdf0e10cSrcweir {
8885*cdf0e10cSrcweir     ScUnoGuard aGuard;
8886*cdf0e10cSrcweir     static uno::Reference<beans::XPropertySetInfo> aRef(
8887*cdf0e10cSrcweir         new SfxItemPropertySetInfo( pColPropSet->getPropertyMap() ));
8888*cdf0e10cSrcweir     return aRef;
8889*cdf0e10cSrcweir }
8890*cdf0e10cSrcweir 
8891*cdf0e10cSrcweir void ScTableColumnObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
8892*cdf0e10cSrcweir                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
8893*cdf0e10cSrcweir {
8894*cdf0e10cSrcweir     if ( pEntry )
8895*cdf0e10cSrcweir     {
8896*cdf0e10cSrcweir         if ( IsScItemWid( pEntry->nWID ) )
8897*cdf0e10cSrcweir         {
8898*cdf0e10cSrcweir             //  for Item WIDs, call ScCellRangesBase directly
8899*cdf0e10cSrcweir             ScCellRangesBase::SetOnePropertyValue(pEntry, aValue);
8900*cdf0e10cSrcweir             return;
8901*cdf0e10cSrcweir         }
8902*cdf0e10cSrcweir 
8903*cdf0e10cSrcweir         //  own properties
8904*cdf0e10cSrcweir 
8905*cdf0e10cSrcweir         ScDocShell* pDocSh = GetDocShell();
8906*cdf0e10cSrcweir         if (!pDocSh)
8907*cdf0e10cSrcweir             return;                                                 //! Exception oder so?
8908*cdf0e10cSrcweir         const ScRange& rRange = GetRange();
8909*cdf0e10cSrcweir         DBG_ASSERT(rRange.aStart.Col() == rRange.aEnd.Col(), "zuviele Spalten");
8910*cdf0e10cSrcweir         SCCOL nCol = rRange.aStart.Col();
8911*cdf0e10cSrcweir         SCTAB nTab = rRange.aStart.Tab();
8912*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
8913*cdf0e10cSrcweir 
8914*cdf0e10cSrcweir         SCCOLROW nColArr[2];
8915*cdf0e10cSrcweir         nColArr[0] = nColArr[1] = nCol;
8916*cdf0e10cSrcweir 
8917*cdf0e10cSrcweir         if ( pEntry->nWID == SC_WID_UNO_CELLWID )
8918*cdf0e10cSrcweir         {
8919*cdf0e10cSrcweir             sal_Int32 nNewWidth = 0;
8920*cdf0e10cSrcweir             if ( aValue >>= nNewWidth )
8921*cdf0e10cSrcweir             {
8922*cdf0e10cSrcweir                 //  property is 1/100mm, column width is twips
8923*cdf0e10cSrcweir                 nNewWidth = HMMToTwips(nNewWidth);
8924*cdf0e10cSrcweir                 aFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab, SC_SIZE_ORIGINAL,
8925*cdf0e10cSrcweir                                         (sal_uInt16)nNewWidth, sal_True, sal_True );
8926*cdf0e10cSrcweir             }
8927*cdf0e10cSrcweir         }
8928*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
8929*cdf0e10cSrcweir         {
8930*cdf0e10cSrcweir             sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
8931*cdf0e10cSrcweir             ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT;
8932*cdf0e10cSrcweir             aFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab, eMode, 0, sal_True, sal_True );
8933*cdf0e10cSrcweir             //  SC_SIZE_DIRECT mit Groesse 0 blendet aus
8934*cdf0e10cSrcweir         }
8935*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_OWIDTH )
8936*cdf0e10cSrcweir         {
8937*cdf0e10cSrcweir             sal_Bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue );
8938*cdf0e10cSrcweir             if (bOpt)
8939*cdf0e10cSrcweir                 aFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab,
8940*cdf0e10cSrcweir                                         SC_SIZE_OPTIMAL, STD_EXTRA_WIDTH, sal_True, sal_True );
8941*cdf0e10cSrcweir             // sal_False bei Spalten momentan ohne Auswirkung
8942*cdf0e10cSrcweir         }
8943*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE || pEntry->nWID == SC_WID_UNO_MANPAGE )
8944*cdf0e10cSrcweir         {
8945*cdf0e10cSrcweir             sal_Bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue );
8946*cdf0e10cSrcweir             if (bSet)
8947*cdf0e10cSrcweir                 aFunc.InsertPageBreak( sal_True, rRange.aStart, sal_True, sal_True, sal_True );
8948*cdf0e10cSrcweir             else
8949*cdf0e10cSrcweir                 aFunc.RemovePageBreak( sal_True, rRange.aStart, sal_True, sal_True, sal_True );
8950*cdf0e10cSrcweir         }
8951*cdf0e10cSrcweir         else
8952*cdf0e10cSrcweir             ScCellRangeObj::SetOnePropertyValue(pEntry, aValue);        // base class, no Item WID
8953*cdf0e10cSrcweir     }
8954*cdf0e10cSrcweir }
8955*cdf0e10cSrcweir 
8956*cdf0e10cSrcweir void ScTableColumnObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
8957*cdf0e10cSrcweir                                             uno::Any& rAny )
8958*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
8959*cdf0e10cSrcweir {
8960*cdf0e10cSrcweir     if ( pEntry )
8961*cdf0e10cSrcweir     {
8962*cdf0e10cSrcweir         ScDocShell* pDocSh = GetDocShell();
8963*cdf0e10cSrcweir         if (!pDocSh)
8964*cdf0e10cSrcweir             throw uno::RuntimeException();
8965*cdf0e10cSrcweir 
8966*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
8967*cdf0e10cSrcweir         const ScRange& rRange = GetRange();
8968*cdf0e10cSrcweir         DBG_ASSERT(rRange.aStart.Col() == rRange.aEnd.Col(), "zuviele Spalten");
8969*cdf0e10cSrcweir         SCCOL nCol = rRange.aStart.Col();
8970*cdf0e10cSrcweir         SCTAB nTab = rRange.aStart.Tab();
8971*cdf0e10cSrcweir 
8972*cdf0e10cSrcweir         if ( pEntry->nWID == SC_WID_UNO_CELLWID )
8973*cdf0e10cSrcweir         {
8974*cdf0e10cSrcweir             // for hidden column, return original height
8975*cdf0e10cSrcweir             sal_uInt16 nWidth = pDoc->GetOriginalWidth( nCol, nTab );
8976*cdf0e10cSrcweir             //  property is 1/100mm, column width is twips
8977*cdf0e10cSrcweir             nWidth = (sal_uInt16) TwipsToHMM(nWidth);
8978*cdf0e10cSrcweir             rAny <<= (sal_Int32)( nWidth );
8979*cdf0e10cSrcweir         }
8980*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
8981*cdf0e10cSrcweir         {
8982*cdf0e10cSrcweir             SCCOL nDummy;
8983*cdf0e10cSrcweir             bool bHidden = pDoc->ColHidden(nCol, nTab, nDummy);
8984*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny( rAny, !bHidden );
8985*cdf0e10cSrcweir         }
8986*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_OWIDTH )
8987*cdf0e10cSrcweir         {
8988*cdf0e10cSrcweir             //! momentan immer gesetzt ??!?!
8989*cdf0e10cSrcweir             sal_Bool bOpt = !(pDoc->GetColFlags( nCol, nTab ) & CR_MANUALSIZE);
8990*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny( rAny, bOpt );
8991*cdf0e10cSrcweir         }
8992*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE )
8993*cdf0e10cSrcweir         {
8994*cdf0e10cSrcweir             ScBreakType nBreak = pDoc->HasColBreak(nCol, nTab);
8995*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak );
8996*cdf0e10cSrcweir         }
8997*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_MANPAGE )
8998*cdf0e10cSrcweir         {
8999*cdf0e10cSrcweir             ScBreakType nBreak = pDoc->HasColBreak(nCol, nTab);
9000*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny(rAny, (nBreak & BREAK_MANUAL));
9001*cdf0e10cSrcweir         }
9002*cdf0e10cSrcweir         else
9003*cdf0e10cSrcweir             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
9004*cdf0e10cSrcweir     }
9005*cdf0e10cSrcweir }
9006*cdf0e10cSrcweir 
9007*cdf0e10cSrcweir const SfxItemPropertyMap* ScTableColumnObj::GetItemPropertyMap()
9008*cdf0e10cSrcweir {
9009*cdf0e10cSrcweir     return pColPropSet->getPropertyMap();
9010*cdf0e10cSrcweir }
9011*cdf0e10cSrcweir 
9012*cdf0e10cSrcweir //------------------------------------------------------------------------
9013*cdf0e10cSrcweir 
9014*cdf0e10cSrcweir ScTableRowObj::ScTableRowObj(ScDocShell* pDocSh, SCROW nRow, SCTAB nTab) :
9015*cdf0e10cSrcweir     ScCellRangeObj( pDocSh, ScRange(0,nRow,nTab, MAXCOL,nRow,nTab) ),
9016*cdf0e10cSrcweir     pRowPropSet(lcl_GetRowPropertySet())
9017*cdf0e10cSrcweir {
9018*cdf0e10cSrcweir }
9019*cdf0e10cSrcweir 
9020*cdf0e10cSrcweir ScTableRowObj::~ScTableRowObj()
9021*cdf0e10cSrcweir {
9022*cdf0e10cSrcweir }
9023*cdf0e10cSrcweir 
9024*cdf0e10cSrcweir // XPropertySet erweitert fuer Zeilen-Properties
9025*cdf0e10cSrcweir 
9026*cdf0e10cSrcweir uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableRowObj::getPropertySetInfo()
9027*cdf0e10cSrcweir                                                         throw(uno::RuntimeException)
9028*cdf0e10cSrcweir {
9029*cdf0e10cSrcweir     ScUnoGuard aGuard;
9030*cdf0e10cSrcweir     static uno::Reference<beans::XPropertySetInfo> aRef(
9031*cdf0e10cSrcweir         new SfxItemPropertySetInfo( pRowPropSet->getPropertyMap() ));
9032*cdf0e10cSrcweir     return aRef;
9033*cdf0e10cSrcweir }
9034*cdf0e10cSrcweir 
9035*cdf0e10cSrcweir void ScTableRowObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
9036*cdf0e10cSrcweir                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
9037*cdf0e10cSrcweir {
9038*cdf0e10cSrcweir     if ( pEntry )
9039*cdf0e10cSrcweir     {
9040*cdf0e10cSrcweir         if ( IsScItemWid( pEntry->nWID ) )
9041*cdf0e10cSrcweir         {
9042*cdf0e10cSrcweir             //  for Item WIDs, call ScCellRangesBase directly
9043*cdf0e10cSrcweir             ScCellRangesBase::SetOnePropertyValue(pEntry, aValue);
9044*cdf0e10cSrcweir             return;
9045*cdf0e10cSrcweir         }
9046*cdf0e10cSrcweir 
9047*cdf0e10cSrcweir         //  own properties
9048*cdf0e10cSrcweir 
9049*cdf0e10cSrcweir         ScDocShell* pDocSh = GetDocShell();
9050*cdf0e10cSrcweir         if (!pDocSh)
9051*cdf0e10cSrcweir             return;                                                 //! Exception oder so?
9052*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
9053*cdf0e10cSrcweir         const ScRange& rRange = GetRange();
9054*cdf0e10cSrcweir         DBG_ASSERT(rRange.aStart.Row() == rRange.aEnd.Row(), "zuviele Zeilen");
9055*cdf0e10cSrcweir         SCROW nRow = rRange.aStart.Row();
9056*cdf0e10cSrcweir         SCTAB nTab = rRange.aStart.Tab();
9057*cdf0e10cSrcweir         ScDocFunc aFunc(*pDocSh);
9058*cdf0e10cSrcweir 
9059*cdf0e10cSrcweir         SCCOLROW nRowArr[2];
9060*cdf0e10cSrcweir         nRowArr[0] = nRowArr[1] = nRow;
9061*cdf0e10cSrcweir 
9062*cdf0e10cSrcweir         if ( pEntry->nWID == SC_WID_UNO_CELLHGT )
9063*cdf0e10cSrcweir         {
9064*cdf0e10cSrcweir             sal_Int32 nNewHeight = 0;
9065*cdf0e10cSrcweir             if ( aValue >>= nNewHeight )
9066*cdf0e10cSrcweir             {
9067*cdf0e10cSrcweir                 //  property is 1/100mm, row height is twips
9068*cdf0e10cSrcweir                 nNewHeight = HMMToTwips(nNewHeight);
9069*cdf0e10cSrcweir                 aFunc.SetWidthOrHeight( sal_False, 1, nRowArr, nTab, SC_SIZE_ORIGINAL,
9070*cdf0e10cSrcweir                                         (sal_uInt16)nNewHeight, sal_True, sal_True );
9071*cdf0e10cSrcweir             }
9072*cdf0e10cSrcweir         }
9073*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
9074*cdf0e10cSrcweir         {
9075*cdf0e10cSrcweir             sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
9076*cdf0e10cSrcweir             ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT;
9077*cdf0e10cSrcweir             aFunc.SetWidthOrHeight( sal_False, 1, nRowArr, nTab, eMode, 0, sal_True, sal_True );
9078*cdf0e10cSrcweir             //  SC_SIZE_DIRECT mit Groesse 0 blendet aus
9079*cdf0e10cSrcweir         }
9080*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CELLFILT )
9081*cdf0e10cSrcweir         {
9082*cdf0e10cSrcweir             sal_Bool bFil = ScUnoHelpFunctions::GetBoolFromAny( aValue );
9083*cdf0e10cSrcweir //          ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT;
9084*cdf0e10cSrcweir //          aFunc.SetWidthOrHeight( sal_False, 1, nRowArr, nTab, eMode, 0, sal_True, sal_True );
9085*cdf0e10cSrcweir             //  SC_SIZE_DIRECT mit Groesse 0 blendet aus
9086*cdf0e10cSrcweir             pDoc->SetRowFiltered(nRow, nRow, nTab, bFil);
9087*cdf0e10cSrcweir         }
9088*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_OHEIGHT )
9089*cdf0e10cSrcweir         {
9090*cdf0e10cSrcweir             sal_Bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue );
9091*cdf0e10cSrcweir             if (bOpt)
9092*cdf0e10cSrcweir                 aFunc.SetWidthOrHeight( sal_False, 1, nRowArr, nTab, SC_SIZE_OPTIMAL, 0, sal_True, sal_True );
9093*cdf0e10cSrcweir             else
9094*cdf0e10cSrcweir             {
9095*cdf0e10cSrcweir                 //  set current height again manually
9096*cdf0e10cSrcweir                 sal_uInt16 nHeight = pDoc->GetOriginalHeight( nRow, nTab );
9097*cdf0e10cSrcweir                 aFunc.SetWidthOrHeight( sal_False, 1, nRowArr, nTab, SC_SIZE_ORIGINAL, nHeight, sal_True, sal_True );
9098*cdf0e10cSrcweir             }
9099*cdf0e10cSrcweir         }
9100*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE || pEntry->nWID == SC_WID_UNO_MANPAGE )
9101*cdf0e10cSrcweir         {
9102*cdf0e10cSrcweir             sal_Bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue );
9103*cdf0e10cSrcweir             if (bSet)
9104*cdf0e10cSrcweir                 aFunc.InsertPageBreak( sal_False, rRange.aStart, sal_True, sal_True, sal_True );
9105*cdf0e10cSrcweir             else
9106*cdf0e10cSrcweir                 aFunc.RemovePageBreak( sal_False, rRange.aStart, sal_True, sal_True, sal_True );
9107*cdf0e10cSrcweir         }
9108*cdf0e10cSrcweir         else
9109*cdf0e10cSrcweir             ScCellRangeObj::SetOnePropertyValue(pEntry, aValue);        // base class, no Item WID
9110*cdf0e10cSrcweir     }
9111*cdf0e10cSrcweir }
9112*cdf0e10cSrcweir 
9113*cdf0e10cSrcweir void ScTableRowObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
9114*cdf0e10cSrcweir                                         uno::Any& rAny )
9115*cdf0e10cSrcweir                                                 throw(uno::RuntimeException)
9116*cdf0e10cSrcweir {
9117*cdf0e10cSrcweir     if ( pEntry )
9118*cdf0e10cSrcweir     {
9119*cdf0e10cSrcweir         ScDocShell* pDocSh = GetDocShell();
9120*cdf0e10cSrcweir         if (!pDocSh)
9121*cdf0e10cSrcweir             throw uno::RuntimeException();
9122*cdf0e10cSrcweir         ScDocument* pDoc = pDocSh->GetDocument();
9123*cdf0e10cSrcweir         const ScRange& rRange = GetRange();
9124*cdf0e10cSrcweir         DBG_ASSERT(rRange.aStart.Row() == rRange.aEnd.Row(), "zuviele Zeilen");
9125*cdf0e10cSrcweir         SCROW nRow = rRange.aStart.Row();
9126*cdf0e10cSrcweir         SCTAB nTab = rRange.aStart.Tab();
9127*cdf0e10cSrcweir 
9128*cdf0e10cSrcweir         if ( pEntry->nWID == SC_WID_UNO_CELLHGT )
9129*cdf0e10cSrcweir         {
9130*cdf0e10cSrcweir             // for hidden row, return original height
9131*cdf0e10cSrcweir             sal_uInt16 nHeight = pDoc->GetOriginalHeight( nRow, nTab );
9132*cdf0e10cSrcweir             //  property is 1/100mm, row height is twips
9133*cdf0e10cSrcweir             nHeight = (sal_uInt16) TwipsToHMM(nHeight);
9134*cdf0e10cSrcweir             rAny <<= (sal_Int32)( nHeight );
9135*cdf0e10cSrcweir         }
9136*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
9137*cdf0e10cSrcweir         {
9138*cdf0e10cSrcweir             SCROW nDummy;
9139*cdf0e10cSrcweir             bool bHidden = pDoc->RowHidden(nRow, nTab, nDummy);
9140*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny( rAny, !bHidden );
9141*cdf0e10cSrcweir         }
9142*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_CELLFILT )
9143*cdf0e10cSrcweir         {
9144*cdf0e10cSrcweir             bool bVis = pDoc->RowFiltered(nRow, nTab);
9145*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny( rAny, bVis );
9146*cdf0e10cSrcweir         }
9147*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_OHEIGHT )
9148*cdf0e10cSrcweir         {
9149*cdf0e10cSrcweir             sal_Bool bOpt = !(pDoc->GetRowFlags( nRow, nTab ) & CR_MANUALSIZE);
9150*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny( rAny, bOpt );
9151*cdf0e10cSrcweir         }
9152*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE )
9153*cdf0e10cSrcweir         {
9154*cdf0e10cSrcweir             ScBreakType nBreak = pDoc->HasRowBreak(nRow, nTab);
9155*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak );
9156*cdf0e10cSrcweir         }
9157*cdf0e10cSrcweir         else if ( pEntry->nWID == SC_WID_UNO_MANPAGE )
9158*cdf0e10cSrcweir         {
9159*cdf0e10cSrcweir             ScBreakType nBreak = (pDoc->HasRowBreak(nRow, nTab) & BREAK_MANUAL);
9160*cdf0e10cSrcweir             ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak );
9161*cdf0e10cSrcweir         }
9162*cdf0e10cSrcweir         else
9163*cdf0e10cSrcweir             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
9164*cdf0e10cSrcweir     }
9165*cdf0e10cSrcweir }
9166*cdf0e10cSrcweir 
9167*cdf0e10cSrcweir const SfxItemPropertyMap* ScTableRowObj::GetItemPropertyMap()
9168*cdf0e10cSrcweir {
9169*cdf0e10cSrcweir     return pRowPropSet->getPropertyMap();
9170*cdf0e10cSrcweir }
9171*cdf0e10cSrcweir 
9172*cdf0e10cSrcweir //------------------------------------------------------------------------
9173*cdf0e10cSrcweir 
9174*cdf0e10cSrcweir ScCellsObj::ScCellsObj(ScDocShell* pDocSh, const ScRangeList& rR) :
9175*cdf0e10cSrcweir     pDocShell( pDocSh ),
9176*cdf0e10cSrcweir     aRanges( rR )
9177*cdf0e10cSrcweir {
9178*cdf0e10cSrcweir     pDocShell->GetDocument()->AddUnoObject(*this);
9179*cdf0e10cSrcweir }
9180*cdf0e10cSrcweir 
9181*cdf0e10cSrcweir ScCellsObj::~ScCellsObj()
9182*cdf0e10cSrcweir {
9183*cdf0e10cSrcweir     if (pDocShell)
9184*cdf0e10cSrcweir         pDocShell->GetDocument()->RemoveUnoObject(*this);
9185*cdf0e10cSrcweir }
9186*cdf0e10cSrcweir 
9187*cdf0e10cSrcweir void ScCellsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
9188*cdf0e10cSrcweir {
9189*cdf0e10cSrcweir     if ( rHint.ISA( ScUpdateRefHint ) )
9190*cdf0e10cSrcweir     {
9191*cdf0e10cSrcweir         const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
9192*cdf0e10cSrcweir         aRanges.UpdateReference( rRef.GetMode(), pDocShell->GetDocument(), rRef.GetRange(),
9193*cdf0e10cSrcweir                                         rRef.GetDx(), rRef.GetDy(), rRef.GetDz() );
9194*cdf0e10cSrcweir     }
9195*cdf0e10cSrcweir     else if ( rHint.ISA( SfxSimpleHint ) &&
9196*cdf0e10cSrcweir             ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
9197*cdf0e10cSrcweir     {
9198*cdf0e10cSrcweir         pDocShell = NULL;       // ungueltig geworden
9199*cdf0e10cSrcweir     }
9200*cdf0e10cSrcweir }
9201*cdf0e10cSrcweir 
9202*cdf0e10cSrcweir // XEnumerationAccess
9203*cdf0e10cSrcweir 
9204*cdf0e10cSrcweir uno::Reference<container::XEnumeration> SAL_CALL ScCellsObj::createEnumeration()
9205*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
9206*cdf0e10cSrcweir {
9207*cdf0e10cSrcweir     ScUnoGuard aGuard;
9208*cdf0e10cSrcweir     if (pDocShell)
9209*cdf0e10cSrcweir         return new ScCellsEnumeration( pDocShell, aRanges );
9210*cdf0e10cSrcweir     return NULL;
9211*cdf0e10cSrcweir }
9212*cdf0e10cSrcweir 
9213*cdf0e10cSrcweir uno::Type SAL_CALL ScCellsObj::getElementType() throw(uno::RuntimeException)
9214*cdf0e10cSrcweir {
9215*cdf0e10cSrcweir     ScUnoGuard aGuard;
9216*cdf0e10cSrcweir     return getCppuType((uno::Reference<table::XCell>*)0);
9217*cdf0e10cSrcweir }
9218*cdf0e10cSrcweir 
9219*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellsObj::hasElements() throw(uno::RuntimeException)
9220*cdf0e10cSrcweir {
9221*cdf0e10cSrcweir     ScUnoGuard aGuard;
9222*cdf0e10cSrcweir     sal_Bool bHas = sal_False;
9223*cdf0e10cSrcweir     if ( pDocShell )
9224*cdf0e10cSrcweir     {
9225*cdf0e10cSrcweir         //! schneller selber testen?
9226*cdf0e10cSrcweir 
9227*cdf0e10cSrcweir         uno::Reference<container::XEnumeration> xEnum(new ScCellsEnumeration( pDocShell, aRanges ));
9228*cdf0e10cSrcweir         bHas = xEnum->hasMoreElements();
9229*cdf0e10cSrcweir     }
9230*cdf0e10cSrcweir     return bHas;
9231*cdf0e10cSrcweir }
9232*cdf0e10cSrcweir 
9233*cdf0e10cSrcweir //------------------------------------------------------------------------
9234*cdf0e10cSrcweir 
9235*cdf0e10cSrcweir ScCellsEnumeration::ScCellsEnumeration(ScDocShell* pDocSh, const ScRangeList& rR) :
9236*cdf0e10cSrcweir     pDocShell( pDocSh ),
9237*cdf0e10cSrcweir     aRanges( rR ),
9238*cdf0e10cSrcweir     pMark( NULL ),
9239*cdf0e10cSrcweir     bAtEnd( sal_False )
9240*cdf0e10cSrcweir {
9241*cdf0e10cSrcweir     ScDocument* pDoc = pDocShell->GetDocument();
9242*cdf0e10cSrcweir     pDoc->AddUnoObject(*this);
9243*cdf0e10cSrcweir 
9244*cdf0e10cSrcweir     if ( aRanges.Count() == 0 )
9245*cdf0e10cSrcweir         bAtEnd = sal_True;
9246*cdf0e10cSrcweir     else
9247*cdf0e10cSrcweir     {
9248*cdf0e10cSrcweir         SCTAB nTab = 0;
9249*cdf0e10cSrcweir         const ScRange* pFirst = aRanges.GetObject(0);
9250*cdf0e10cSrcweir         if (pFirst)
9251*cdf0e10cSrcweir             nTab = pFirst->aStart.Tab();
9252*cdf0e10cSrcweir         aPos = ScAddress(0,0,nTab);
9253*cdf0e10cSrcweir         CheckPos_Impl();                    // aPos auf erste passende Zelle setzen
9254*cdf0e10cSrcweir     }
9255*cdf0e10cSrcweir }
9256*cdf0e10cSrcweir 
9257*cdf0e10cSrcweir void ScCellsEnumeration::CheckPos_Impl()
9258*cdf0e10cSrcweir {
9259*cdf0e10cSrcweir     if (pDocShell)
9260*cdf0e10cSrcweir     {
9261*cdf0e10cSrcweir         sal_Bool bFound = sal_False;
9262*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
9263*cdf0e10cSrcweir         ScBaseCell* pCell = pDoc->GetCell(aPos);
9264*cdf0e10cSrcweir         if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE )
9265*cdf0e10cSrcweir         {
9266*cdf0e10cSrcweir             if (!pMark)
9267*cdf0e10cSrcweir             {
9268*cdf0e10cSrcweir                 pMark = new ScMarkData;
9269*cdf0e10cSrcweir                 pMark->MarkFromRangeList( aRanges, sal_False );
9270*cdf0e10cSrcweir                 pMark->MarkToMulti();   // needed for GetNextMarkedCell
9271*cdf0e10cSrcweir             }
9272*cdf0e10cSrcweir             bFound = pMark->IsCellMarked( aPos.Col(), aPos.Row() );
9273*cdf0e10cSrcweir         }
9274*cdf0e10cSrcweir         if (!bFound)
9275*cdf0e10cSrcweir             Advance_Impl();
9276*cdf0e10cSrcweir     }
9277*cdf0e10cSrcweir }
9278*cdf0e10cSrcweir 
9279*cdf0e10cSrcweir ScCellsEnumeration::~ScCellsEnumeration()
9280*cdf0e10cSrcweir {
9281*cdf0e10cSrcweir     if (pDocShell)
9282*cdf0e10cSrcweir         pDocShell->GetDocument()->RemoveUnoObject(*this);
9283*cdf0e10cSrcweir     delete pMark;
9284*cdf0e10cSrcweir }
9285*cdf0e10cSrcweir 
9286*cdf0e10cSrcweir void ScCellsEnumeration::Advance_Impl()
9287*cdf0e10cSrcweir {
9288*cdf0e10cSrcweir     DBG_ASSERT(!bAtEnd,"zuviel Advance_Impl");
9289*cdf0e10cSrcweir     if (!pMark)
9290*cdf0e10cSrcweir     {
9291*cdf0e10cSrcweir         pMark = new ScMarkData;
9292*cdf0e10cSrcweir         pMark->MarkFromRangeList( aRanges, sal_False );
9293*cdf0e10cSrcweir         pMark->MarkToMulti();   // needed for GetNextMarkedCell
9294*cdf0e10cSrcweir     }
9295*cdf0e10cSrcweir 
9296*cdf0e10cSrcweir     SCCOL nCol = aPos.Col();
9297*cdf0e10cSrcweir     SCROW nRow = aPos.Row();
9298*cdf0e10cSrcweir     SCTAB nTab = aPos.Tab();
9299*cdf0e10cSrcweir     sal_Bool bFound = pDocShell->GetDocument()->GetNextMarkedCell( nCol, nRow, nTab, *pMark );
9300*cdf0e10cSrcweir     if (bFound)
9301*cdf0e10cSrcweir         aPos.Set( nCol, nRow, nTab );
9302*cdf0e10cSrcweir     else
9303*cdf0e10cSrcweir         bAtEnd = sal_True;      // kommt nix mehr
9304*cdf0e10cSrcweir }
9305*cdf0e10cSrcweir 
9306*cdf0e10cSrcweir void ScCellsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint )
9307*cdf0e10cSrcweir {
9308*cdf0e10cSrcweir     if ( rHint.ISA( ScUpdateRefHint ) )
9309*cdf0e10cSrcweir     {
9310*cdf0e10cSrcweir         if (pDocShell)
9311*cdf0e10cSrcweir         {
9312*cdf0e10cSrcweir             const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
9313*cdf0e10cSrcweir             aRanges.UpdateReference( rRef.GetMode(), pDocShell->GetDocument(), rRef.GetRange(),
9314*cdf0e10cSrcweir                                             rRef.GetDx(), rRef.GetDy(), rRef.GetDz() );
9315*cdf0e10cSrcweir 
9316*cdf0e10cSrcweir             delete pMark;       // aus verschobenen Bereichen neu erzeugen
9317*cdf0e10cSrcweir             pMark = NULL;
9318*cdf0e10cSrcweir 
9319*cdf0e10cSrcweir             if (!bAtEnd)        // aPos anpassen
9320*cdf0e10cSrcweir             {
9321*cdf0e10cSrcweir                 ScRangeList aNew;
9322*cdf0e10cSrcweir                 aNew.Append(ScRange(aPos));
9323*cdf0e10cSrcweir                 aNew.UpdateReference( rRef.GetMode(), pDocShell->GetDocument(), rRef.GetRange(),
9324*cdf0e10cSrcweir                                         rRef.GetDx(), rRef.GetDy(), rRef.GetDz() );
9325*cdf0e10cSrcweir                 if (aNew.Count()==1)
9326*cdf0e10cSrcweir                 {
9327*cdf0e10cSrcweir                     aPos = aNew.GetObject(0)->aStart;
9328*cdf0e10cSrcweir                     CheckPos_Impl();
9329*cdf0e10cSrcweir                 }
9330*cdf0e10cSrcweir             }
9331*cdf0e10cSrcweir         }
9332*cdf0e10cSrcweir     }
9333*cdf0e10cSrcweir     else if ( rHint.ISA( SfxSimpleHint ) &&
9334*cdf0e10cSrcweir             ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
9335*cdf0e10cSrcweir     {
9336*cdf0e10cSrcweir         pDocShell = NULL;       // ungueltig geworden
9337*cdf0e10cSrcweir     }
9338*cdf0e10cSrcweir }
9339*cdf0e10cSrcweir 
9340*cdf0e10cSrcweir // XEnumeration
9341*cdf0e10cSrcweir 
9342*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellsEnumeration::hasMoreElements() throw(uno::RuntimeException)
9343*cdf0e10cSrcweir {
9344*cdf0e10cSrcweir     ScUnoGuard aGuard;
9345*cdf0e10cSrcweir     return !bAtEnd;
9346*cdf0e10cSrcweir }
9347*cdf0e10cSrcweir 
9348*cdf0e10cSrcweir uno::Any SAL_CALL ScCellsEnumeration::nextElement() throw(container::NoSuchElementException,
9349*cdf0e10cSrcweir                                         lang::WrappedTargetException, uno::RuntimeException)
9350*cdf0e10cSrcweir {
9351*cdf0e10cSrcweir     ScUnoGuard aGuard;
9352*cdf0e10cSrcweir     if (pDocShell && !bAtEnd)
9353*cdf0e10cSrcweir     {
9354*cdf0e10cSrcweir         // Interface-Typ muss zu ScCellsObj::getElementType passen
9355*cdf0e10cSrcweir 
9356*cdf0e10cSrcweir         ScAddress aTempPos(aPos);
9357*cdf0e10cSrcweir         Advance_Impl();
9358*cdf0e10cSrcweir         return uno::makeAny(uno::Reference<table::XCell>(new ScCellObj( pDocShell, aTempPos )));
9359*cdf0e10cSrcweir     }
9360*cdf0e10cSrcweir 
9361*cdf0e10cSrcweir     throw container::NoSuchElementException();      // no more elements
9362*cdf0e10cSrcweir //    return uno::Any();
9363*cdf0e10cSrcweir }
9364*cdf0e10cSrcweir 
9365*cdf0e10cSrcweir //------------------------------------------------------------------------
9366*cdf0e10cSrcweir 
9367*cdf0e10cSrcweir ScCellFormatsObj::ScCellFormatsObj(ScDocShell* pDocSh, const ScRange& rRange) :
9368*cdf0e10cSrcweir     pDocShell( pDocSh ),
9369*cdf0e10cSrcweir     aTotalRange( rRange )
9370*cdf0e10cSrcweir {
9371*cdf0e10cSrcweir     ScDocument* pDoc = pDocShell->GetDocument();
9372*cdf0e10cSrcweir     pDoc->AddUnoObject(*this);
9373*cdf0e10cSrcweir 
9374*cdf0e10cSrcweir     DBG_ASSERT( aTotalRange.aStart.Tab() == aTotalRange.aEnd.Tab(), "unterschiedliche Tabellen" );
9375*cdf0e10cSrcweir }
9376*cdf0e10cSrcweir 
9377*cdf0e10cSrcweir ScCellFormatsObj::~ScCellFormatsObj()
9378*cdf0e10cSrcweir {
9379*cdf0e10cSrcweir     if (pDocShell)
9380*cdf0e10cSrcweir         pDocShell->GetDocument()->RemoveUnoObject(*this);
9381*cdf0e10cSrcweir }
9382*cdf0e10cSrcweir 
9383*cdf0e10cSrcweir void ScCellFormatsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
9384*cdf0e10cSrcweir {
9385*cdf0e10cSrcweir     if ( rHint.ISA( ScUpdateRefHint ) )
9386*cdf0e10cSrcweir     {
9387*cdf0e10cSrcweir         //! aTotalRange...
9388*cdf0e10cSrcweir     }
9389*cdf0e10cSrcweir     else if ( rHint.ISA( SfxSimpleHint ) &&
9390*cdf0e10cSrcweir             ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
9391*cdf0e10cSrcweir     {
9392*cdf0e10cSrcweir         pDocShell = NULL;       // ungueltig geworden
9393*cdf0e10cSrcweir     }
9394*cdf0e10cSrcweir }
9395*cdf0e10cSrcweir 
9396*cdf0e10cSrcweir ScCellRangeObj* ScCellFormatsObj::GetObjectByIndex_Impl(long nIndex) const
9397*cdf0e10cSrcweir {
9398*cdf0e10cSrcweir     //! direkt auf die AttrArrays zugreifen !!!!
9399*cdf0e10cSrcweir 
9400*cdf0e10cSrcweir     ScCellRangeObj* pRet = NULL;
9401*cdf0e10cSrcweir     if (pDocShell)
9402*cdf0e10cSrcweir     {
9403*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
9404*cdf0e10cSrcweir         long nPos = 0;
9405*cdf0e10cSrcweir         ScAttrRectIterator aIter( pDoc, aTotalRange.aStart.Tab(),
9406*cdf0e10cSrcweir                                     aTotalRange.aStart.Col(), aTotalRange.aStart.Row(),
9407*cdf0e10cSrcweir                                     aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() );
9408*cdf0e10cSrcweir         SCCOL nCol1, nCol2;
9409*cdf0e10cSrcweir         SCROW nRow1, nRow2;
9410*cdf0e10cSrcweir         while ( aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) )
9411*cdf0e10cSrcweir         {
9412*cdf0e10cSrcweir             if ( nPos == nIndex )
9413*cdf0e10cSrcweir             {
9414*cdf0e10cSrcweir                 SCTAB nTab = aTotalRange.aStart.Tab();
9415*cdf0e10cSrcweir                 ScRange aNext( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
9416*cdf0e10cSrcweir 
9417*cdf0e10cSrcweir                 if ( aNext.aStart == aNext.aEnd )
9418*cdf0e10cSrcweir                     pRet = new ScCellObj( pDocShell, aNext.aStart );
9419*cdf0e10cSrcweir                 else
9420*cdf0e10cSrcweir                     pRet = new ScCellRangeObj( pDocShell, aNext );
9421*cdf0e10cSrcweir             }
9422*cdf0e10cSrcweir             ++nPos;
9423*cdf0e10cSrcweir         }
9424*cdf0e10cSrcweir     }
9425*cdf0e10cSrcweir     return pRet;
9426*cdf0e10cSrcweir }
9427*cdf0e10cSrcweir 
9428*cdf0e10cSrcweir // XIndexAccess
9429*cdf0e10cSrcweir 
9430*cdf0e10cSrcweir sal_Int32 SAL_CALL ScCellFormatsObj::getCount() throw(uno::RuntimeException)
9431*cdf0e10cSrcweir {
9432*cdf0e10cSrcweir     ScUnoGuard aGuard;
9433*cdf0e10cSrcweir 
9434*cdf0e10cSrcweir     //! direkt auf die AttrArrays zugreifen !!!!
9435*cdf0e10cSrcweir 
9436*cdf0e10cSrcweir     long nCount = 0;
9437*cdf0e10cSrcweir     if (pDocShell)
9438*cdf0e10cSrcweir     {
9439*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
9440*cdf0e10cSrcweir         ScAttrRectIterator aIter( pDoc, aTotalRange.aStart.Tab(),
9441*cdf0e10cSrcweir                                     aTotalRange.aStart.Col(), aTotalRange.aStart.Row(),
9442*cdf0e10cSrcweir                                     aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() );
9443*cdf0e10cSrcweir         SCCOL nCol1, nCol2;
9444*cdf0e10cSrcweir         SCROW nRow1, nRow2;
9445*cdf0e10cSrcweir         while ( aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) )
9446*cdf0e10cSrcweir             ++nCount;
9447*cdf0e10cSrcweir     }
9448*cdf0e10cSrcweir     return nCount;
9449*cdf0e10cSrcweir }
9450*cdf0e10cSrcweir 
9451*cdf0e10cSrcweir uno::Any SAL_CALL ScCellFormatsObj::getByIndex( sal_Int32 nIndex )
9452*cdf0e10cSrcweir                             throw(lang::IndexOutOfBoundsException,
9453*cdf0e10cSrcweir                                     lang::WrappedTargetException, uno::RuntimeException)
9454*cdf0e10cSrcweir {
9455*cdf0e10cSrcweir     ScUnoGuard aGuard;
9456*cdf0e10cSrcweir 
9457*cdf0e10cSrcweir     uno::Reference<table::XCellRange> xRange(GetObjectByIndex_Impl(nIndex));
9458*cdf0e10cSrcweir     if (xRange.is())
9459*cdf0e10cSrcweir         return uno::makeAny(xRange);
9460*cdf0e10cSrcweir     else
9461*cdf0e10cSrcweir         throw lang::IndexOutOfBoundsException();
9462*cdf0e10cSrcweir //    return uno::Any();
9463*cdf0e10cSrcweir }
9464*cdf0e10cSrcweir 
9465*cdf0e10cSrcweir uno::Type SAL_CALL ScCellFormatsObj::getElementType() throw(uno::RuntimeException)
9466*cdf0e10cSrcweir {
9467*cdf0e10cSrcweir     ScUnoGuard aGuard;
9468*cdf0e10cSrcweir     return getCppuType((uno::Reference<table::XCellRange>*)0);
9469*cdf0e10cSrcweir }
9470*cdf0e10cSrcweir 
9471*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellFormatsObj::hasElements() throw(uno::RuntimeException)
9472*cdf0e10cSrcweir {
9473*cdf0e10cSrcweir     ScUnoGuard aGuard;
9474*cdf0e10cSrcweir     return ( getCount() != 0 );     //! immer groesser 0 ??
9475*cdf0e10cSrcweir }
9476*cdf0e10cSrcweir 
9477*cdf0e10cSrcweir // XEnumerationAccess
9478*cdf0e10cSrcweir 
9479*cdf0e10cSrcweir uno::Reference<container::XEnumeration> SAL_CALL ScCellFormatsObj::createEnumeration()
9480*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
9481*cdf0e10cSrcweir {
9482*cdf0e10cSrcweir     ScUnoGuard aGuard;
9483*cdf0e10cSrcweir     if (pDocShell)
9484*cdf0e10cSrcweir         return new ScCellFormatsEnumeration( pDocShell, aTotalRange );
9485*cdf0e10cSrcweir     return NULL;
9486*cdf0e10cSrcweir }
9487*cdf0e10cSrcweir 
9488*cdf0e10cSrcweir //------------------------------------------------------------------------
9489*cdf0e10cSrcweir 
9490*cdf0e10cSrcweir ScCellFormatsEnumeration::ScCellFormatsEnumeration(ScDocShell* pDocSh, const ScRange& rRange) :
9491*cdf0e10cSrcweir     pDocShell( pDocSh ),
9492*cdf0e10cSrcweir     nTab( rRange.aStart.Tab() ),
9493*cdf0e10cSrcweir     pIter( NULL ),
9494*cdf0e10cSrcweir     bAtEnd( sal_False ),
9495*cdf0e10cSrcweir     bDirty( sal_False )
9496*cdf0e10cSrcweir {
9497*cdf0e10cSrcweir     ScDocument* pDoc = pDocShell->GetDocument();
9498*cdf0e10cSrcweir     pDoc->AddUnoObject(*this);
9499*cdf0e10cSrcweir 
9500*cdf0e10cSrcweir     DBG_ASSERT( rRange.aStart.Tab() == rRange.aEnd.Tab(),
9501*cdf0e10cSrcweir                 "CellFormatsEnumeration: unterschiedliche Tabellen" );
9502*cdf0e10cSrcweir 
9503*cdf0e10cSrcweir     pIter = new ScAttrRectIterator( pDoc, nTab,
9504*cdf0e10cSrcweir                                     rRange.aStart.Col(), rRange.aStart.Row(),
9505*cdf0e10cSrcweir                                     rRange.aEnd.Col(), rRange.aEnd.Row() );
9506*cdf0e10cSrcweir     Advance_Impl();
9507*cdf0e10cSrcweir }
9508*cdf0e10cSrcweir 
9509*cdf0e10cSrcweir ScCellFormatsEnumeration::~ScCellFormatsEnumeration()
9510*cdf0e10cSrcweir {
9511*cdf0e10cSrcweir     if (pDocShell)
9512*cdf0e10cSrcweir         pDocShell->GetDocument()->RemoveUnoObject(*this);
9513*cdf0e10cSrcweir     delete pIter;
9514*cdf0e10cSrcweir }
9515*cdf0e10cSrcweir 
9516*cdf0e10cSrcweir void ScCellFormatsEnumeration::Advance_Impl()
9517*cdf0e10cSrcweir {
9518*cdf0e10cSrcweir     DBG_ASSERT(!bAtEnd,"zuviel Advance_Impl");
9519*cdf0e10cSrcweir 
9520*cdf0e10cSrcweir     if ( pIter )
9521*cdf0e10cSrcweir     {
9522*cdf0e10cSrcweir         if ( bDirty )
9523*cdf0e10cSrcweir         {
9524*cdf0e10cSrcweir             pIter->DataChanged();   // AttrArray-Index neu suchen
9525*cdf0e10cSrcweir             bDirty = sal_False;
9526*cdf0e10cSrcweir         }
9527*cdf0e10cSrcweir 
9528*cdf0e10cSrcweir         SCCOL nCol1, nCol2;
9529*cdf0e10cSrcweir         SCROW nRow1, nRow2;
9530*cdf0e10cSrcweir         if ( pIter->GetNext( nCol1, nCol2, nRow1, nRow2 ) )
9531*cdf0e10cSrcweir             aNext = ScRange( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
9532*cdf0e10cSrcweir         else
9533*cdf0e10cSrcweir             bAtEnd = sal_True;      // kommt nix mehr
9534*cdf0e10cSrcweir     }
9535*cdf0e10cSrcweir     else
9536*cdf0e10cSrcweir         bAtEnd = sal_True;          // Dok weggekommen oder so
9537*cdf0e10cSrcweir }
9538*cdf0e10cSrcweir 
9539*cdf0e10cSrcweir ScCellRangeObj* ScCellFormatsEnumeration::NextObject_Impl()
9540*cdf0e10cSrcweir {
9541*cdf0e10cSrcweir     ScCellRangeObj* pRet = NULL;
9542*cdf0e10cSrcweir     if (pDocShell && !bAtEnd)
9543*cdf0e10cSrcweir     {
9544*cdf0e10cSrcweir         if ( aNext.aStart == aNext.aEnd )
9545*cdf0e10cSrcweir             pRet = new ScCellObj( pDocShell, aNext.aStart );
9546*cdf0e10cSrcweir         else
9547*cdf0e10cSrcweir             pRet = new ScCellRangeObj( pDocShell, aNext );
9548*cdf0e10cSrcweir         Advance_Impl();
9549*cdf0e10cSrcweir     }
9550*cdf0e10cSrcweir     return pRet;
9551*cdf0e10cSrcweir }
9552*cdf0e10cSrcweir 
9553*cdf0e10cSrcweir void ScCellFormatsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint )
9554*cdf0e10cSrcweir {
9555*cdf0e10cSrcweir     if ( rHint.ISA( ScUpdateRefHint ) )
9556*cdf0e10cSrcweir     {
9557*cdf0e10cSrcweir         //! und nun ???
9558*cdf0e10cSrcweir     }
9559*cdf0e10cSrcweir     else if ( rHint.ISA( SfxSimpleHint ) )
9560*cdf0e10cSrcweir     {
9561*cdf0e10cSrcweir         sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
9562*cdf0e10cSrcweir         if ( nId == SFX_HINT_DYING )
9563*cdf0e10cSrcweir         {
9564*cdf0e10cSrcweir             pDocShell = NULL;                       // ungueltig geworden
9565*cdf0e10cSrcweir             delete pIter;
9566*cdf0e10cSrcweir             pIter = NULL;
9567*cdf0e10cSrcweir         }
9568*cdf0e10cSrcweir         else if ( nId == SFX_HINT_DATACHANGED )
9569*cdf0e10cSrcweir         {
9570*cdf0e10cSrcweir             bDirty = sal_True;          // AttrArray-Index evtl. ungueltig geworden
9571*cdf0e10cSrcweir         }
9572*cdf0e10cSrcweir     }
9573*cdf0e10cSrcweir }
9574*cdf0e10cSrcweir 
9575*cdf0e10cSrcweir // XEnumeration
9576*cdf0e10cSrcweir 
9577*cdf0e10cSrcweir sal_Bool SAL_CALL ScCellFormatsEnumeration::hasMoreElements() throw(uno::RuntimeException)
9578*cdf0e10cSrcweir {
9579*cdf0e10cSrcweir     ScUnoGuard aGuard;
9580*cdf0e10cSrcweir     return !bAtEnd;
9581*cdf0e10cSrcweir }
9582*cdf0e10cSrcweir 
9583*cdf0e10cSrcweir uno::Any SAL_CALL ScCellFormatsEnumeration::nextElement() throw(container::NoSuchElementException,
9584*cdf0e10cSrcweir                                         lang::WrappedTargetException, uno::RuntimeException)
9585*cdf0e10cSrcweir {
9586*cdf0e10cSrcweir     ScUnoGuard aGuard;
9587*cdf0e10cSrcweir 
9588*cdf0e10cSrcweir     if ( bAtEnd || !pDocShell )
9589*cdf0e10cSrcweir         throw container::NoSuchElementException();      // no more elements
9590*cdf0e10cSrcweir 
9591*cdf0e10cSrcweir     // Interface-Typ muss zu ScCellFormatsObj::getElementType passen
9592*cdf0e10cSrcweir 
9593*cdf0e10cSrcweir     return uno::makeAny(uno::Reference<table::XCellRange> (NextObject_Impl()));
9594*cdf0e10cSrcweir }
9595*cdf0e10cSrcweir 
9596*cdf0e10cSrcweir //------------------------------------------------------------------------
9597*cdf0e10cSrcweir 
9598*cdf0e10cSrcweir ScUniqueCellFormatsObj::ScUniqueCellFormatsObj(ScDocShell* pDocSh, const ScRange& rRange) :
9599*cdf0e10cSrcweir     pDocShell( pDocSh ),
9600*cdf0e10cSrcweir     aTotalRange( rRange ),
9601*cdf0e10cSrcweir     aRangeLists()
9602*cdf0e10cSrcweir {
9603*cdf0e10cSrcweir     pDocShell->GetDocument()->AddUnoObject(*this);
9604*cdf0e10cSrcweir 
9605*cdf0e10cSrcweir     DBG_ASSERT( aTotalRange.aStart.Tab() == aTotalRange.aEnd.Tab(), "unterschiedliche Tabellen" );
9606*cdf0e10cSrcweir 
9607*cdf0e10cSrcweir     GetObjects_Impl();
9608*cdf0e10cSrcweir }
9609*cdf0e10cSrcweir 
9610*cdf0e10cSrcweir ScUniqueCellFormatsObj::~ScUniqueCellFormatsObj()
9611*cdf0e10cSrcweir {
9612*cdf0e10cSrcweir     if (pDocShell)
9613*cdf0e10cSrcweir         pDocShell->GetDocument()->RemoveUnoObject(*this);
9614*cdf0e10cSrcweir }
9615*cdf0e10cSrcweir 
9616*cdf0e10cSrcweir void ScUniqueCellFormatsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
9617*cdf0e10cSrcweir {
9618*cdf0e10cSrcweir     if ( rHint.ISA( ScUpdateRefHint ) )
9619*cdf0e10cSrcweir     {
9620*cdf0e10cSrcweir         //! aTotalRange...
9621*cdf0e10cSrcweir     }
9622*cdf0e10cSrcweir     else if ( rHint.ISA( SfxSimpleHint ) )
9623*cdf0e10cSrcweir     {
9624*cdf0e10cSrcweir         sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
9625*cdf0e10cSrcweir         if ( nId == SFX_HINT_DYING )
9626*cdf0e10cSrcweir             pDocShell = NULL;                       // ungueltig geworden
9627*cdf0e10cSrcweir     }
9628*cdf0e10cSrcweir }
9629*cdf0e10cSrcweir 
9630*cdf0e10cSrcweir //
9631*cdf0e10cSrcweir //  Fill the list of formats from the document
9632*cdf0e10cSrcweir //
9633*cdf0e10cSrcweir 
9634*cdf0e10cSrcweir // hash code to access the range lists by ScPatternAttr pointer
9635*cdf0e10cSrcweir struct ScPatternHashCode
9636*cdf0e10cSrcweir {
9637*cdf0e10cSrcweir     size_t operator()( const ScPatternAttr* pPattern ) const
9638*cdf0e10cSrcweir     {
9639*cdf0e10cSrcweir         return reinterpret_cast<size_t>(pPattern);
9640*cdf0e10cSrcweir     }
9641*cdf0e10cSrcweir };
9642*cdf0e10cSrcweir 
9643*cdf0e10cSrcweir // Hash map to find a range by its start row
9644*cdf0e10cSrcweir typedef ::std::hash_map< SCROW, ScRange > ScRowRangeHashMap;
9645*cdf0e10cSrcweir 
9646*cdf0e10cSrcweir typedef ::std::vector<ScRange> ScRangeVector;
9647*cdf0e10cSrcweir 
9648*cdf0e10cSrcweir // Hash map entry.
9649*cdf0e10cSrcweir // The Join method depends on the column-wise order of ScAttrRectIterator
9650*cdf0e10cSrcweir class ScUniqueFormatsEntry
9651*cdf0e10cSrcweir {
9652*cdf0e10cSrcweir     enum EntryState { STATE_EMPTY, STATE_SINGLE, STATE_COMPLEX };
9653*cdf0e10cSrcweir 
9654*cdf0e10cSrcweir     EntryState          eState;
9655*cdf0e10cSrcweir     ScRange             aSingleRange;
9656*cdf0e10cSrcweir     ScRowRangeHashMap   aJoinedRanges;      // "active" ranges to be merged
9657*cdf0e10cSrcweir     ScRangeVector       aCompletedRanges;   // ranges that will no longer be touched
9658*cdf0e10cSrcweir     ScRangeListRef      aReturnRanges;      // result as ScRangeList for further use
9659*cdf0e10cSrcweir 
9660*cdf0e10cSrcweir public:
9661*cdf0e10cSrcweir                         ScUniqueFormatsEntry() : eState( STATE_EMPTY ) {}
9662*cdf0e10cSrcweir                         ScUniqueFormatsEntry( const ScUniqueFormatsEntry& r ) :
9663*cdf0e10cSrcweir                             eState( r.eState ),
9664*cdf0e10cSrcweir                             aSingleRange( r.aSingleRange ),
9665*cdf0e10cSrcweir                             aJoinedRanges( r.aJoinedRanges ),
9666*cdf0e10cSrcweir                             aCompletedRanges( r.aCompletedRanges ),
9667*cdf0e10cSrcweir                             aReturnRanges( r.aReturnRanges ) {}
9668*cdf0e10cSrcweir                         ~ScUniqueFormatsEntry() {}
9669*cdf0e10cSrcweir 
9670*cdf0e10cSrcweir     void                Join( const ScRange& rNewRange );
9671*cdf0e10cSrcweir     const ScRangeList&  GetRanges();
9672*cdf0e10cSrcweir     void                Clear() { aReturnRanges.Clear(); }  // aJoinedRanges and aCompletedRanges are cleared in GetRanges
9673*cdf0e10cSrcweir };
9674*cdf0e10cSrcweir 
9675*cdf0e10cSrcweir void ScUniqueFormatsEntry::Join( const ScRange& rNewRange )
9676*cdf0e10cSrcweir {
9677*cdf0e10cSrcweir     // Special-case handling for single range
9678*cdf0e10cSrcweir 
9679*cdf0e10cSrcweir     if ( eState == STATE_EMPTY )
9680*cdf0e10cSrcweir     {
9681*cdf0e10cSrcweir         aSingleRange = rNewRange;
9682*cdf0e10cSrcweir         eState = STATE_SINGLE;
9683*cdf0e10cSrcweir         return;
9684*cdf0e10cSrcweir     }
9685*cdf0e10cSrcweir     if ( eState == STATE_SINGLE )
9686*cdf0e10cSrcweir     {
9687*cdf0e10cSrcweir         if ( aSingleRange.aStart.Row() == rNewRange.aStart.Row() &&
9688*cdf0e10cSrcweir              aSingleRange.aEnd.Row() == rNewRange.aEnd.Row() &&
9689*cdf0e10cSrcweir              aSingleRange.aEnd.Col() + 1 == rNewRange.aStart.Col() )
9690*cdf0e10cSrcweir         {
9691*cdf0e10cSrcweir             aSingleRange.aEnd.SetCol( rNewRange.aEnd.Col() );
9692*cdf0e10cSrcweir             return;     // still a single range
9693*cdf0e10cSrcweir         }
9694*cdf0e10cSrcweir 
9695*cdf0e10cSrcweir         SCROW nSingleRow = aSingleRange.aStart.Row();
9696*cdf0e10cSrcweir         aJoinedRanges.insert( ScRowRangeHashMap::value_type( nSingleRow, aSingleRange ) );
9697*cdf0e10cSrcweir         eState = STATE_COMPLEX;
9698*cdf0e10cSrcweir         // continue normally
9699*cdf0e10cSrcweir     }
9700*cdf0e10cSrcweir 
9701*cdf0e10cSrcweir     // This is called in the order of ScAttrRectIterator results.
9702*cdf0e10cSrcweir     // rNewRange can only be joined with an existing entry if it's the same rows, starting in the next column.
9703*cdf0e10cSrcweir     // If the old entry for the start row extends to a different end row, or ends in a different column, it
9704*cdf0e10cSrcweir     // can be moved to aCompletedRanges because it can't be joined with following iterator results.
9705*cdf0e10cSrcweir     // Everything happens within one sheet, so Tab can be ignored.
9706*cdf0e10cSrcweir 
9707*cdf0e10cSrcweir     SCROW nStartRow = rNewRange.aStart.Row();
9708*cdf0e10cSrcweir     ScRowRangeHashMap::iterator aIter( aJoinedRanges.find( nStartRow ) );       // find the active entry for the start row
9709*cdf0e10cSrcweir     if ( aIter != aJoinedRanges.end() )
9710*cdf0e10cSrcweir     {
9711*cdf0e10cSrcweir         ScRange& rOldRange = aIter->second;
9712*cdf0e10cSrcweir         if ( rOldRange.aEnd.Row() == rNewRange.aEnd.Row() &&
9713*cdf0e10cSrcweir              rOldRange.aEnd.Col() + 1 == rNewRange.aStart.Col() )
9714*cdf0e10cSrcweir         {
9715*cdf0e10cSrcweir             // extend existing range
9716*cdf0e10cSrcweir             rOldRange.aEnd.SetCol( rNewRange.aEnd.Col() );
9717*cdf0e10cSrcweir         }
9718*cdf0e10cSrcweir         else
9719*cdf0e10cSrcweir         {
9720*cdf0e10cSrcweir             // move old range to aCompletedRanges, keep rNewRange for joining
9721*cdf0e10cSrcweir             aCompletedRanges.push_back( rOldRange );
9722*cdf0e10cSrcweir             rOldRange = rNewRange;  // replace in hash map
9723*cdf0e10cSrcweir         }
9724*cdf0e10cSrcweir     }
9725*cdf0e10cSrcweir     else
9726*cdf0e10cSrcweir     {
9727*cdf0e10cSrcweir         // keep rNewRange for joining
9728*cdf0e10cSrcweir         aJoinedRanges.insert( ScRowRangeHashMap::value_type( nStartRow, rNewRange ) );
9729*cdf0e10cSrcweir     }
9730*cdf0e10cSrcweir }
9731*cdf0e10cSrcweir 
9732*cdf0e10cSrcweir const ScRangeList& ScUniqueFormatsEntry::GetRanges()
9733*cdf0e10cSrcweir {
9734*cdf0e10cSrcweir     if ( eState == STATE_SINGLE )
9735*cdf0e10cSrcweir     {
9736*cdf0e10cSrcweir         aReturnRanges = new ScRangeList;
9737*cdf0e10cSrcweir         aReturnRanges->Append( aSingleRange );
9738*cdf0e10cSrcweir         return *aReturnRanges;
9739*cdf0e10cSrcweir     }
9740*cdf0e10cSrcweir 
9741*cdf0e10cSrcweir     // move remaining entries from aJoinedRanges to aCompletedRanges
9742*cdf0e10cSrcweir 
9743*cdf0e10cSrcweir     ScRowRangeHashMap::const_iterator aJoinedEnd = aJoinedRanges.end();
9744*cdf0e10cSrcweir     for ( ScRowRangeHashMap::const_iterator aJoinedIter = aJoinedRanges.begin(); aJoinedIter != aJoinedEnd; ++aJoinedIter )
9745*cdf0e10cSrcweir         aCompletedRanges.push_back( aJoinedIter->second );
9746*cdf0e10cSrcweir     aJoinedRanges.clear();
9747*cdf0e10cSrcweir 
9748*cdf0e10cSrcweir     // sort all ranges for a predictable API result
9749*cdf0e10cSrcweir 
9750*cdf0e10cSrcweir     std::sort( aCompletedRanges.begin(), aCompletedRanges.end() );
9751*cdf0e10cSrcweir 
9752*cdf0e10cSrcweir     // fill and return ScRangeList
9753*cdf0e10cSrcweir 
9754*cdf0e10cSrcweir     aReturnRanges = new ScRangeList;
9755*cdf0e10cSrcweir     ScRangeVector::const_iterator aCompEnd( aCompletedRanges.end() );
9756*cdf0e10cSrcweir     for ( ScRangeVector::const_iterator aCompIter( aCompletedRanges.begin() ); aCompIter != aCompEnd; ++aCompIter )
9757*cdf0e10cSrcweir         aReturnRanges->Append( *aCompIter );
9758*cdf0e10cSrcweir     aCompletedRanges.clear();
9759*cdf0e10cSrcweir 
9760*cdf0e10cSrcweir     return *aReturnRanges;
9761*cdf0e10cSrcweir }
9762*cdf0e10cSrcweir 
9763*cdf0e10cSrcweir typedef ::std::hash_map< const ScPatternAttr*, ScUniqueFormatsEntry, ScPatternHashCode > ScUniqueFormatsHashMap;
9764*cdf0e10cSrcweir 
9765*cdf0e10cSrcweir // function object to sort the range lists by start of first range
9766*cdf0e10cSrcweir struct ScUniqueFormatsOrder
9767*cdf0e10cSrcweir {
9768*cdf0e10cSrcweir     bool operator()( const ScRangeList& rList1, const ScRangeList& rList2 ) const
9769*cdf0e10cSrcweir     {
9770*cdf0e10cSrcweir         // all range lists have at least one entry
9771*cdf0e10cSrcweir         DBG_ASSERT( rList1.Count() > 0 && rList2.Count() > 0, "ScUniqueFormatsOrder: empty list" );
9772*cdf0e10cSrcweir 
9773*cdf0e10cSrcweir         // compare start positions using ScAddress comparison operator
9774*cdf0e10cSrcweir         return ( rList1.GetObject(0)->aStart < rList2.GetObject(0)->aStart );
9775*cdf0e10cSrcweir     }
9776*cdf0e10cSrcweir };
9777*cdf0e10cSrcweir 
9778*cdf0e10cSrcweir void ScUniqueCellFormatsObj::GetObjects_Impl()
9779*cdf0e10cSrcweir {
9780*cdf0e10cSrcweir     if (pDocShell)
9781*cdf0e10cSrcweir     {
9782*cdf0e10cSrcweir         ScDocument* pDoc = pDocShell->GetDocument();
9783*cdf0e10cSrcweir         SCTAB nTab = aTotalRange.aStart.Tab();
9784*cdf0e10cSrcweir         ScAttrRectIterator aIter( pDoc, nTab,
9785*cdf0e10cSrcweir                                     aTotalRange.aStart.Col(), aTotalRange.aStart.Row(),
9786*cdf0e10cSrcweir                                     aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() );
9787*cdf0e10cSrcweir         SCCOL nCol1, nCol2;
9788*cdf0e10cSrcweir         SCROW nRow1, nRow2;
9789*cdf0e10cSrcweir 
9790*cdf0e10cSrcweir         // Collect the ranges for each format in a hash map, to avoid nested loops
9791*cdf0e10cSrcweir 
9792*cdf0e10cSrcweir         ScUniqueFormatsHashMap aHashMap;
9793*cdf0e10cSrcweir         while (aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) )
9794*cdf0e10cSrcweir         {
9795*cdf0e10cSrcweir             ScRange aRange( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
9796*cdf0e10cSrcweir             const ScPatternAttr* pPattern = pDoc->GetPattern(nCol1, nRow1, nTab);
9797*cdf0e10cSrcweir             aHashMap[pPattern].Join( aRange );
9798*cdf0e10cSrcweir         }
9799*cdf0e10cSrcweir 
9800*cdf0e10cSrcweir         // Fill the vector aRangeLists with the range lists from the hash map
9801*cdf0e10cSrcweir 
9802*cdf0e10cSrcweir         aRangeLists.reserve( aHashMap.size() );
9803*cdf0e10cSrcweir         ScUniqueFormatsHashMap::iterator aMapIter( aHashMap.begin() );
9804*cdf0e10cSrcweir         ScUniqueFormatsHashMap::iterator aMapEnd( aHashMap.end() );
9805*cdf0e10cSrcweir         while ( aMapIter != aMapEnd )
9806*cdf0e10cSrcweir         {
9807*cdf0e10cSrcweir             ScUniqueFormatsEntry& rEntry = aMapIter->second;
9808*cdf0e10cSrcweir             const ScRangeList& rRanges = rEntry.GetRanges();
9809*cdf0e10cSrcweir             aRangeLists.push_back( rRanges );       // copy ScRangeList
9810*cdf0e10cSrcweir             rEntry.Clear();                         // free memory, don't hold both copies of all ranges
9811*cdf0e10cSrcweir             ++aMapIter;
9812*cdf0e10cSrcweir         }
9813*cdf0e10cSrcweir 
9814*cdf0e10cSrcweir         // Sort the vector by first range's start position, to avoid random shuffling
9815*cdf0e10cSrcweir         // due to using the ScPatterAttr pointers
9816*cdf0e10cSrcweir 
9817*cdf0e10cSrcweir         ScUniqueFormatsOrder aComp;
9818*cdf0e10cSrcweir         ::std::sort( aRangeLists.begin(), aRangeLists.end(), aComp );
9819*cdf0e10cSrcweir     }
9820*cdf0e10cSrcweir }
9821*cdf0e10cSrcweir 
9822*cdf0e10cSrcweir // XIndexAccess
9823*cdf0e10cSrcweir 
9824*cdf0e10cSrcweir sal_Int32 SAL_CALL ScUniqueCellFormatsObj::getCount() throw(uno::RuntimeException)
9825*cdf0e10cSrcweir {
9826*cdf0e10cSrcweir     ScUnoGuard aGuard;
9827*cdf0e10cSrcweir 
9828*cdf0e10cSrcweir     return aRangeLists.size();
9829*cdf0e10cSrcweir }
9830*cdf0e10cSrcweir 
9831*cdf0e10cSrcweir uno::Any SAL_CALL ScUniqueCellFormatsObj::getByIndex( sal_Int32 nIndex )
9832*cdf0e10cSrcweir                             throw(lang::IndexOutOfBoundsException,
9833*cdf0e10cSrcweir                                     lang::WrappedTargetException, uno::RuntimeException)
9834*cdf0e10cSrcweir {
9835*cdf0e10cSrcweir     ScUnoGuard aGuard;
9836*cdf0e10cSrcweir 
9837*cdf0e10cSrcweir     if(static_cast<sal_uInt32>(nIndex) < aRangeLists.size())
9838*cdf0e10cSrcweir         return uno::makeAny(uno::Reference<sheet::XSheetCellRangeContainer>(new ScCellRangesObj(pDocShell, aRangeLists[nIndex])));
9839*cdf0e10cSrcweir     else
9840*cdf0e10cSrcweir         throw lang::IndexOutOfBoundsException();
9841*cdf0e10cSrcweir //    return uno::Any();
9842*cdf0e10cSrcweir }
9843*cdf0e10cSrcweir 
9844*cdf0e10cSrcweir uno::Type SAL_CALL ScUniqueCellFormatsObj::getElementType() throw(uno::RuntimeException)
9845*cdf0e10cSrcweir {
9846*cdf0e10cSrcweir     ScUnoGuard aGuard;
9847*cdf0e10cSrcweir     return getCppuType((uno::Reference<sheet::XSheetCellRangeContainer>*)0);
9848*cdf0e10cSrcweir }
9849*cdf0e10cSrcweir 
9850*cdf0e10cSrcweir sal_Bool SAL_CALL ScUniqueCellFormatsObj::hasElements() throw(uno::RuntimeException)
9851*cdf0e10cSrcweir {
9852*cdf0e10cSrcweir     ScUnoGuard aGuard;
9853*cdf0e10cSrcweir     return ( aRangeLists.size() != 0 );
9854*cdf0e10cSrcweir }
9855*cdf0e10cSrcweir 
9856*cdf0e10cSrcweir // XEnumerationAccess
9857*cdf0e10cSrcweir 
9858*cdf0e10cSrcweir uno::Reference<container::XEnumeration> SAL_CALL ScUniqueCellFormatsObj::createEnumeration()
9859*cdf0e10cSrcweir                                                     throw(uno::RuntimeException)
9860*cdf0e10cSrcweir {
9861*cdf0e10cSrcweir     ScUnoGuard aGuard;
9862*cdf0e10cSrcweir     if (pDocShell)
9863*cdf0e10cSrcweir         return new ScUniqueCellFormatsEnumeration( pDocShell, aRangeLists );
9864*cdf0e10cSrcweir     return NULL;
9865*cdf0e10cSrcweir }
9866*cdf0e10cSrcweir 
9867*cdf0e10cSrcweir //------------------------------------------------------------------------
9868*cdf0e10cSrcweir 
9869*cdf0e10cSrcweir ScUniqueCellFormatsEnumeration::ScUniqueCellFormatsEnumeration(ScDocShell* pDocSh, const ScMyRangeLists& rRangeLists) :
9870*cdf0e10cSrcweir     aRangeLists(rRangeLists),
9871*cdf0e10cSrcweir     pDocShell( pDocSh ),
9872*cdf0e10cSrcweir     nCurrentPosition(0)
9873*cdf0e10cSrcweir {
9874*cdf0e10cSrcweir     pDocShell->GetDocument()->AddUnoObject(*this);
9875*cdf0e10cSrcweir }
9876*cdf0e10cSrcweir 
9877*cdf0e10cSrcweir ScUniqueCellFormatsEnumeration::~ScUniqueCellFormatsEnumeration()
9878*cdf0e10cSrcweir {
9879*cdf0e10cSrcweir     if (pDocShell)
9880*cdf0e10cSrcweir         pDocShell->GetDocument()->RemoveUnoObject(*this);
9881*cdf0e10cSrcweir }
9882*cdf0e10cSrcweir 
9883*cdf0e10cSrcweir void ScUniqueCellFormatsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint )
9884*cdf0e10cSrcweir {
9885*cdf0e10cSrcweir     if ( rHint.ISA( ScUpdateRefHint ) )
9886*cdf0e10cSrcweir     {
9887*cdf0e10cSrcweir         //! und nun ???
9888*cdf0e10cSrcweir     }
9889*cdf0e10cSrcweir     else if ( rHint.ISA( SfxSimpleHint ) )
9890*cdf0e10cSrcweir     {
9891*cdf0e10cSrcweir         sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
9892*cdf0e10cSrcweir         if ( nId == SFX_HINT_DYING )
9893*cdf0e10cSrcweir             pDocShell = NULL;                       // ungueltig geworden
9894*cdf0e10cSrcweir     }
9895*cdf0e10cSrcweir }
9896*cdf0e10cSrcweir 
9897*cdf0e10cSrcweir // XEnumeration
9898*cdf0e10cSrcweir 
9899*cdf0e10cSrcweir sal_Bool SAL_CALL ScUniqueCellFormatsEnumeration::hasMoreElements() throw(uno::RuntimeException)
9900*cdf0e10cSrcweir {
9901*cdf0e10cSrcweir     ScUnoGuard aGuard;
9902*cdf0e10cSrcweir     return static_cast<sal_uInt32>(nCurrentPosition) < aRangeLists.size();
9903*cdf0e10cSrcweir }
9904*cdf0e10cSrcweir 
9905*cdf0e10cSrcweir uno::Any SAL_CALL ScUniqueCellFormatsEnumeration::nextElement() throw(container::NoSuchElementException,
9906*cdf0e10cSrcweir                                         lang::WrappedTargetException, uno::RuntimeException)
9907*cdf0e10cSrcweir {
9908*cdf0e10cSrcweir     ScUnoGuard aGuard;
9909*cdf0e10cSrcweir 
9910*cdf0e10cSrcweir     if ( !hasMoreElements() || !pDocShell )
9911*cdf0e10cSrcweir         throw container::NoSuchElementException();      // no more elements
9912*cdf0e10cSrcweir 
9913*cdf0e10cSrcweir     // Interface-Typ muss zu ScCellFormatsObj::getElementType passen
9914*cdf0e10cSrcweir 
9915*cdf0e10cSrcweir     return uno::makeAny(uno::Reference<sheet::XSheetCellRangeContainer>(new ScCellRangesObj(pDocShell, aRangeLists[nCurrentPosition++])));
9916*cdf0e10cSrcweir }
9917*cdf0e10cSrcweir 
9918*cdf0e10cSrcweir 
9919