LCOV - code coverage report
Current view: top level - sc/source/ui/unoobj - cellsuno.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 4242 5398 78.6 %
Date: 2015-06-13 12:38:46 Functions: 381 472 80.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "scitems.hxx"
      21             : #include <editeng/eeitem.hxx>
      22             : #include <svx/svdpool.hxx>
      23             : 
      24             : #include <svx/algitem.hxx>
      25             : #include <editeng/boxitem.hxx>
      26             : #include <editeng/brushitem.hxx>
      27             : #include <editeng/editeng.hxx>
      28             : #include <editeng/flditem.hxx>
      29             : #include <editeng/justifyitem.hxx>
      30             : #include <editeng/editobj.hxx>
      31             : #include <svx/fmdpage.hxx>
      32             : #include <editeng/langitem.hxx>
      33             : #include <sfx2/linkmgr.hxx>
      34             : #include <svl/srchitem.hxx>
      35             : #include <svl/sharedstringpool.hxx>
      36             : #include <svx/unomid.hxx>
      37             : #include <editeng/unoprnms.hxx>
      38             : #include <editeng/unotext.hxx>
      39             : #include <svx/svdpage.hxx>
      40             : #include <sfx2/bindings.hxx>
      41             : #include <svl/zforlist.hxx>
      42             : #include <svl/zformat.hxx>
      43             : #include <comphelper/servicehelper.hxx>
      44             : #include <cppuhelper/supportsservice.hxx>
      45             : #include <float.h>
      46             : 
      47             : #include <com/sun/star/awt/XBitmap.hpp>
      48             : #include <com/sun/star/util/CellProtection.hpp>
      49             : #include <com/sun/star/table/CellHoriJustify.hpp>
      50             : #include <com/sun/star/table/CellOrientation.hpp>
      51             : #include <com/sun/star/table/CellVertJustify2.hpp>
      52             : #include <com/sun/star/table/ShadowFormat.hpp>
      53             : #include <com/sun/star/table/TableBorder.hpp>
      54             : #include <com/sun/star/table/BorderLineStyle.hpp>
      55             : #include <com/sun/star/sheet/CellFlags.hpp>
      56             : #include <com/sun/star/sheet/FormulaResult.hpp>
      57             : #include <com/sun/star/beans/PropertyAttribute.hpp>
      58             : #include <com/sun/star/lang/Locale.hpp>
      59             : #include <com/sun/star/beans/TolerantPropertySetResultType.hpp>
      60             : #include <com/sun/star/beans/SetPropertyTolerantFailed.hpp>
      61             : #include <com/sun/star/text/WritingMode2.hpp>
      62             : #include <com/sun/star/text/textfield/Type.hpp>
      63             : #include <com/sun/star/sheet/XConditionalFormats.hpp>
      64             : 
      65             : #include "autoform.hxx"
      66             : #include "cellmergeoption.hxx"
      67             : #include "cellsuno.hxx"
      68             : #include "cursuno.hxx"
      69             : #include "textuno.hxx"
      70             : #include "editsrc.hxx"
      71             : #include "notesuno.hxx"
      72             : #include "fielduno.hxx"
      73             : #include "docuno.hxx"
      74             : #include "datauno.hxx"
      75             : #include "dapiuno.hxx"
      76             : #include "chartuno.hxx"
      77             : #include "fmtuno.hxx"
      78             : #include "miscuno.hxx"
      79             : #include "convuno.hxx"
      80             : #include "srchuno.hxx"
      81             : #include "nameuno.hxx"
      82             : #include "targuno.hxx"
      83             : #include "tokenuno.hxx"
      84             : #include "eventuno.hxx"
      85             : #include "docsh.hxx"
      86             : #include "markdata.hxx"
      87             : #include "patattr.hxx"
      88             : #include "docpool.hxx"
      89             : #include "docfunc.hxx"
      90             : #include "dbdocfun.hxx"
      91             : #include "olinefun.hxx"
      92             : #include "hints.hxx"
      93             : #include "formulacell.hxx"
      94             : #include "undocell.hxx"
      95             : #include "undotab.hxx"
      96             : #include "undoblk.hxx"
      97             : #include "stlsheet.hxx"
      98             : #include "dbdata.hxx"
      99             : #include "attrib.hxx"
     100             : #include "chartarr.hxx"
     101             : #include "chartlis.hxx"
     102             : #include "drwlayer.hxx"
     103             : #include "printfun.hxx"
     104             : #include "prnsave.hxx"
     105             : #include "tablink.hxx"
     106             : #include "dociter.hxx"
     107             : #include "rangeutl.hxx"
     108             : #include "conditio.hxx"
     109             : #include "validat.hxx"
     110             : #include "sc.hrc"
     111             : #include "brdcst.hxx"
     112             : #include "cellform.hxx"
     113             : #include "globstr.hrc"
     114             : #include "unonames.hxx"
     115             : #include "styleuno.hxx"
     116             : #include "rangeseq.hxx"
     117             : #include "unowids.hxx"
     118             : #include "paramisc.hxx"
     119             : #include "queryentry.hxx"
     120             : #include <formula/errorcodes.hxx>
     121             : #include "unoreflist.hxx"
     122             : #include <formula/grammar.hxx>
     123             : #include <editeng/escapementitem.hxx>
     124             : #include "stringutil.hxx"
     125             : #include "formulaiter.hxx"
     126             : #include "tokenarray.hxx"
     127             : #include "stylehelper.hxx"
     128             : #include "dputil.hxx"
     129             : #include <sortparam.hxx>
     130             : #include "condformatuno.hxx"
     131             : 
     132             : #include <list>
     133             : #include <boost/scoped_array.hpp>
     134             : #include <boost/scoped_ptr.hpp>
     135             : 
     136             : using namespace com::sun::star;
     137             : 
     138          35 : class ScNamedEntry
     139             : {
     140             :     OUString  aName;
     141             :     ScRange   aRange;
     142             : 
     143             : public:
     144          35 :             ScNamedEntry(const OUString& rN, const ScRange& rR) :
     145          35 :                 aName(rN), aRange(rR) {}
     146             : 
     147         144 :     const OUString& GetName() const     { return aName; }
     148          79 :     const ScRange&  GetRange() const    { return aRange; }
     149             : };
     150             : 
     151             : //  The names in the maps must be sorted according to strcmp!
     152             : //! Instead of Which-ID 0 use special IDs and do not compare via names!
     153             : 
     154             : //  Left/Right/Top/BottomBorder are mapped directly to the core items,
     155             : //  not collected/applied to the borders of a range -> ATTR_BORDER can be used directly
     156             : 
     157       48577 : static const SfxItemPropertySet* lcl_GetCellsPropertySet()
     158             : {
     159             :     static const SfxItemPropertyMapEntry aCellsPropertyMap_Impl[] =
     160             :     {
     161          43 :         {OUString(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, cppu::UnoType<OUString>::get(),        0 | beans::PropertyAttribute::READONLY, 0 },
     162          43 :         {OUString(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,cppu::UnoType<bool>::get(),                  0, 0 },
     163          43 :         {OUString(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     164          43 :         {OUString(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     165          43 :         {OUString(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    cppu::UnoType<sal_Int32>::get(),            0, MID_BACK_COLOR },
     166          43 :         {OUString(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    cppu::UnoType<util::CellProtection>::get(), 0, 0 },
     167          43 :         {OUString(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,cppu::UnoType<OUString>::get(),        0, 0 },
     168          43 :         {OUString(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    cppu::UnoType<sal_Int32>::get(),            0, 0 },
     169          43 :         {OUString(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  cppu::UnoType<bool>::get(),                  0, 0 },
     170          43 :         {OUString(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,cppu::UnoType<bool>::get(),                 0, MID_CROSSED_OUT },
     171          43 :         {OUString(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,cppu::UnoType<sal_Int16>::get(),         0, MID_EMPHASIS },
     172          43 :         {OUString(SC_UNONAME_CFONT),    ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     173          43 :         {OUString(SC_UNONAME_CFCHARS),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     174          43 :         {OUString(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     175          43 :         {OUString(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     176          43 :         {OUString(SC_UNONAME_CFFAMIL),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     177          43 :         {OUString(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     178          43 :         {OUString(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     179          43 :         {OUString(SC_UNONAME_CFNAME),   ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     180          43 :         {OUString(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     181          43 :         {OUString(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     182          43 :         {OUString(SC_UNONAME_CFPITCH),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     183          43 :         {OUString(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     184          43 :         {OUString(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     185          43 :         {OUString(SC_UNONAME_CFSTYLE),  ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     186          43 :         {OUString(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     187          43 :         {OUString(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     188          43 :         {OUString(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   cppu::UnoType<float>::get(),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     189          43 :         {OUString(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     190          43 :         {OUString(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     191          43 :         {OUString(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, cppu::UnoType<lang::Locale>::get(),         0, MID_LANG_LOCALE },
     192          43 :         {OUString(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     193          43 :         {OUString(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     194          43 :         {OUString(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     195          43 :         {OUString(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     196          43 :         {OUString(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     197          43 :         {OUString(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  cppu::UnoType<awt::FontSlant>::get(),       0, MID_POSTURE },
     198          43 :         {OUString(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     199          43 :         {OUString(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     200          43 :         {OUString(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   cppu::UnoType<sal_Int16>::get(),            0, MID_RELIEF },
     201          43 :         {OUString(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, cppu::UnoType<bool>::get(),                  0, 0 },
     202          43 :         {OUString(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,cppu::UnoType<sal_Int16>::get(),           0, MID_CROSS_OUT },
     203          43 :         {OUString(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     204          43 :         {OUString(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     205          43 :         {OUString(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     206          43 :         {OUString(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   cppu::UnoType<float>::get(),                0, MID_WEIGHT },
     207          43 :         {OUString(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     208          43 :         {OUString(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     209          43 :         {OUString(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, cppu::UnoType<bool>::get(),                  0, 0 },
     210          43 :         {OUString(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     211          43 :         {OUString(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     212          43 :         {OUString(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     213          43 :         {OUString(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     214          43 :         {OUString(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     215          43 :         {OUString(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     216          43 :         {OUString(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     217          43 :         {OUString(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     218          43 :         {OUString(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     219          43 :         {OUString(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   cppu::UnoType<table::CellHoriJustify>::get(), 0, MID_HORJUST_HORJUST },
     220          43 :         {OUString(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     221          43 :         {OUString(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    cppu::UnoType<bool>::get(),                  0, MID_GRAPHIC_TRANSPARENT },
     222          43 :         {OUString(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     cppu::UnoType<bool>::get(),                  0, 0 },
     223          43 :         {OUString(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     224          43 :         {OUString(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     225          43 :         {OUString(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     226          43 :         {OUString(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,cppu::UnoType<container::XIndexReplace>::get(), 0, 0 },
     227          43 :         {OUString(SC_UNONAME_CELLORI),  ATTR_STACKED,       cppu::UnoType<table::CellOrientation>::get(), 0, 0 },
     228          43 :         {OUString(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     229          43 :         {OUString(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     230          43 :         {OUString(SC_UNONAME_PINDENT),  ATTR_INDENT,        cppu::UnoType<sal_Int16>::get(),            0, 0 }, //! CONVERT_TWIPS
     231          43 :         {OUString(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   cppu::UnoType<bool>::get(),                  0, 0 },
     232          43 :         {OUString(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,cppu::UnoType<bool>::get(),                 0, 0 },
     233          43 :         {OUString(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,cppu::UnoType<bool>::get(),                 0, 0 },
     234          43 :         {OUString(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     cppu::UnoType<bool>::get(),                  0, 0 },
     235          43 :         {OUString(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     236          43 :         {OUString(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     237          43 :         {OUString(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     238          43 :         {OUString(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     239          43 :         {OUString(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     240          43 :         {OUString(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,     ::cppu::UnoType<table::BorderLine2>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     241          43 :         {OUString(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     242          43 :         {OUString(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     243          43 :         {OUString(SC_UNONAME_SHADOW),   ATTR_SHADOW,        cppu::UnoType<table::ShadowFormat>::get(),  0, 0 | CONVERT_TWIPS },
     244          43 :         {OUString(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, cppu::UnoType<bool>::get(),               0, 0 },
     245          43 :         {OUString(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, cppu::UnoType<table::TableBorder>::get(),   0, 0 | CONVERT_TWIPS },
     246          43 :         {OUString(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, cppu::UnoType<table::TableBorder2>::get(),   0, 0 | CONVERT_TWIPS },
     247          43 :         {OUString(SC_UNONAME_TOPBORDER),ATTR_BORDER,        ::cppu::UnoType<table::BorderLine>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     248          43 :         {OUString(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine2>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     249          43 :         {OUString(SC_UNONAME_USERDEF),  ATTR_USERDEF,       cppu::UnoType<container::XNameContainer>::get(), 0, 0 },
     250          43 :         {OUString(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     251          43 :         {OUString(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     252          43 :         {OUString(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     253          43 :         {OUString(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     254          43 :         {OUString(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     255          43 :         {OUString(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    cppu::UnoType<sal_Int16>::get(),            0, 0 },
     256          43 :         {OUString(SC_UNONAME_HYPERLINK),  ATTR_HYPERLINK, cppu::UnoType<OUString>::get(),        0, 0 },
     257             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     258       52748 :     };
     259       48577 :     static SfxItemPropertySet aCellsPropertySet( aCellsPropertyMap_Impl );
     260       48577 :     return &aCellsPropertySet;
     261             : }
     262             : 
     263             : //  CellRange enthaelt alle Eintraege von Cells, zusaetzlich eigene Eintraege
     264             : //  mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt).
     265             : 
     266       31978 : static const SfxItemPropertySet* lcl_GetRangePropertySet()
     267             : {
     268             :     static const SfxItemPropertyMapEntry aRangePropertyMap_Impl[] =
     269             :     {
     270          43 :         {OUString(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, cppu::UnoType<OUString>::get(),        0 | beans::PropertyAttribute::READONLY, 0 },
     271          43 :         {OUString(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,cppu::UnoType<bool>::get(),                  0, 0 },
     272          43 :         {OUString(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     273          43 :         {OUString(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     274          43 :         {OUString(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    cppu::UnoType<sal_Int32>::get(),            0, MID_BACK_COLOR },
     275          43 :         {OUString(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    cppu::UnoType<util::CellProtection>::get(), 0, 0 },
     276          43 :         {OUString(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,cppu::UnoType<OUString>::get(),        0, 0 },
     277          43 :         {OUString(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    cppu::UnoType<sal_Int32>::get(),            0, 0 },
     278          43 :         {OUString(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  cppu::UnoType<bool>::get(),                  0, 0 },
     279          43 :         {OUString(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,cppu::UnoType<bool>::get(),                 0, MID_CROSSED_OUT },
     280          43 :         {OUString(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,cppu::UnoType<sal_Int16>::get(),         0, MID_EMPHASIS },
     281          43 :         {OUString(SC_UNONAME_CFONT),    ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     282          43 :         {OUString(SC_UNONAME_CFCHARS),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     283          43 :         {OUString(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     284          43 :         {OUString(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     285          43 :         {OUString(SC_UNONAME_CFFAMIL),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     286          43 :         {OUString(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     287          43 :         {OUString(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     288          43 :         {OUString(SC_UNONAME_CFNAME),   ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     289          43 :         {OUString(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     290          43 :         {OUString(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     291          43 :         {OUString(SC_UNONAME_CFPITCH),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     292          43 :         {OUString(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     293          43 :         {OUString(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     294          43 :         {OUString(SC_UNONAME_CFSTYLE),  ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     295          43 :         {OUString(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     296          43 :         {OUString(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     297          43 :         {OUString(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   cppu::UnoType<float>::get(),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     298          43 :         {OUString(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     299          43 :         {OUString(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     300          43 :         {OUString(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, cppu::UnoType<lang::Locale>::get(),         0, MID_LANG_LOCALE },
     301          43 :         {OUString(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     302          43 :         {OUString(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     303          43 :         {OUString(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     304          43 :         {OUString(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     305          43 :         {OUString(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     306          43 :         {OUString(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  cppu::UnoType<awt::FontSlant>::get(),       0, MID_POSTURE },
     307          43 :         {OUString(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     308          43 :         {OUString(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     309          43 :         {OUString(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   cppu::UnoType<sal_Int16>::get(),            0, MID_RELIEF },
     310          43 :         {OUString(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, cppu::UnoType<bool>::get(),                  0, 0 },
     311          43 :         {OUString(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,cppu::UnoType<sal_Int16>::get(),           0, MID_CROSS_OUT },
     312          43 :         {OUString(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     313          43 :         {OUString(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     314          43 :         {OUString(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     315          43 :         {OUString(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   cppu::UnoType<float>::get(),                0, MID_WEIGHT },
     316          43 :         {OUString(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     317          43 :         {OUString(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     318          43 :         {OUString(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, cppu::UnoType<bool>::get(),                  0, 0 },
     319          43 :         {OUString(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     320          43 :         {OUString(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     321          43 :         {OUString(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     322          43 :         {OUString(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     323          43 :         {OUString(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     324          43 :         {OUString(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     325          43 :         {OUString(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     326          43 :         {OUString(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     327          43 :         {OUString(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     328          43 :         {OUString(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   cppu::UnoType<table::CellHoriJustify>::get(),   0, MID_HORJUST_HORJUST },
     329          43 :         {OUString(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     330          43 :         {OUString(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    cppu::UnoType<bool>::get(),                  0, MID_GRAPHIC_TRANSPARENT },
     331          43 :         {OUString(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     cppu::UnoType<bool>::get(),                  0, 0 },
     332          43 :         {OUString(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     333          43 :         {OUString(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     334          43 :         {OUString(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     335          43 :         {OUString(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,cppu::UnoType<container::XIndexReplace>::get(), 0, 0 },
     336          43 :         {OUString(SC_UNONAME_CELLORI),  ATTR_STACKED,       cppu::UnoType<table::CellOrientation>::get(), 0, 0 },
     337          43 :         {OUString(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     338          43 :         {OUString(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     339          43 :         {OUString(SC_UNONAME_PINDENT),  ATTR_INDENT,        cppu::UnoType<sal_Int16>::get(),            0, 0 }, //! CONVERT_TWIPS
     340          43 :         {OUString(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   cppu::UnoType<bool>::get(),                  0, 0 },
     341          43 :         {OUString(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,cppu::UnoType<bool>::get(),                 0, 0 },
     342          43 :         {OUString(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,cppu::UnoType<bool>::get(),                 0, 0 },
     343          43 :         {OUString(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     cppu::UnoType<bool>::get(),                  0, 0 },
     344          43 :         {OUString(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     345          43 :         {OUString(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     346          43 :         {OUString(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     347          43 :         {OUString(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     348          43 :         {OUString(SC_UNONAME_POS),      SC_WID_UNO_POS,     cppu::UnoType<awt::Point>::get(),           0 | beans::PropertyAttribute::READONLY, 0 },
     349          43 :         {OUString(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     350          43 :         {OUString(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,     ::cppu::UnoType<table::BorderLine2>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     351          43 :         {OUString(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     352          43 :         {OUString(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     353          43 :         {OUString(SC_UNONAME_SHADOW),   ATTR_SHADOW,        cppu::UnoType<table::ShadowFormat>::get(),  0, 0 | CONVERT_TWIPS },
     354          43 :         {OUString(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, cppu::UnoType<bool>::get(),               0, 0 },
     355          43 :         {OUString(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    cppu::UnoType<awt::Size>::get(),            0 | beans::PropertyAttribute::READONLY, 0 },
     356          43 :         {OUString(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, cppu::UnoType<table::TableBorder>::get(),   0, 0 | CONVERT_TWIPS },
     357          43 :         {OUString(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, cppu::UnoType<table::TableBorder2>::get(),   0, 0 | CONVERT_TWIPS },
     358          43 :         {OUString(SC_UNONAME_TOPBORDER),ATTR_BORDER,        ::cppu::UnoType<table::BorderLine>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     359          43 :         {OUString(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine2>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     360          43 :         {OUString(SC_UNONAME_USERDEF),  ATTR_USERDEF,       cppu::UnoType<container::XNameContainer>::get(), 0, 0 },
     361          43 :         {OUString(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     362          43 :         {OUString(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     363          43 :         {OUString(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     364          43 :         {OUString(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     365          43 :         {OUString(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     366          43 :         {OUString(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    cppu::UnoType<sal_Int16>::get(),            0, 0 },
     367             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     368       36192 :     };
     369       31978 :     static SfxItemPropertySet aRangePropertySet( aRangePropertyMap_Impl );
     370       31978 :     return &aRangePropertySet;
     371             : }
     372             : 
     373             : //  Cell enthaelt alle Eintraege von CellRange, zusaetzlich eigene Eintraege
     374             : //  mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt).
     375             : 
     376       16640 : static const SfxItemPropertySet* lcl_GetCellPropertySet()
     377             : {
     378             :     static const SfxItemPropertyMapEntry aCellPropertyMap_Impl[] =
     379             :     {
     380          29 :         {OUString(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, cppu::UnoType<OUString>::get(),        0 | beans::PropertyAttribute::READONLY, 0 },
     381          29 :         {OUString(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,cppu::UnoType<bool>::get(),                  0, 0 },
     382          29 :         {OUString(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     383          29 :         {OUString(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     384          29 :         {OUString(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    cppu::UnoType<sal_Int32>::get(),            0, MID_BACK_COLOR },
     385          29 :         {OUString(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    cppu::UnoType<util::CellProtection>::get(), 0, 0 },
     386          29 :         {OUString(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,cppu::UnoType<OUString>::get(),        0, 0 },
     387          29 :         {OUString(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    cppu::UnoType<sal_Int32>::get(),            0, 0 },
     388          29 :         {OUString(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  cppu::UnoType<bool>::get(),                  0, 0 },
     389          29 :         {OUString(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,cppu::UnoType<bool>::get(),                 0, MID_CROSSED_OUT },
     390          29 :         {OUString(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,cppu::UnoType<sal_Int16>::get(),         0, MID_EMPHASIS },
     391          29 :         {OUString(SC_UNONAME_CFONT),    ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     392          29 :         {OUString(SC_UNONAME_CFCHARS),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     393          29 :         {OUString(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     394          29 :         {OUString(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     395          29 :         {OUString(SC_UNONAME_CFFAMIL),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     396          29 :         {OUString(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     397          29 :         {OUString(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     398          29 :         {OUString(SC_UNONAME_CFNAME),   ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     399          29 :         {OUString(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     400          29 :         {OUString(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     401          29 :         {OUString(SC_UNONAME_CFPITCH),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     402          29 :         {OUString(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     403          29 :         {OUString(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     404          29 :         {OUString(SC_UNONAME_CFSTYLE),  ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     405          29 :         {OUString(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     406          29 :         {OUString(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     407          29 :         {OUString(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   cppu::UnoType<float>::get(),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     408          29 :         {OUString(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     409          29 :         {OUString(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     410          29 :         {OUString(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, cppu::UnoType<lang::Locale>::get(),         0, MID_LANG_LOCALE },
     411          29 :         {OUString(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     412          29 :         {OUString(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     413          29 :         {OUString(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     414          29 :         {OUString(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     415          29 :         {OUString(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     416          29 :         {OUString(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  cppu::UnoType<awt::FontSlant>::get(),       0, MID_POSTURE },
     417          29 :         {OUString(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     418          29 :         {OUString(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     419          29 :         {OUString(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   cppu::UnoType<sal_Int16>::get(),            0, MID_RELIEF },
     420          29 :         {OUString(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, cppu::UnoType<bool>::get(),                  0, 0 },
     421          29 :         {OUString(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,cppu::UnoType<sal_Int16>::get(),           0, MID_CROSS_OUT },
     422          29 :         {OUString(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     423          29 :         {OUString(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     424          29 :         {OUString(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     425          29 :         {OUString(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   cppu::UnoType<float>::get(),                0, MID_WEIGHT },
     426          29 :         {OUString(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     427          29 :         {OUString(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     428          29 :         {OUString(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, cppu::UnoType<bool>::get(),                  0, 0 },
     429          29 :         {OUString(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     430          29 :         {OUString(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     431          29 :         {OUString(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     432          29 :         {OUString(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     433          29 :         {OUString(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     434          29 :         {OUString(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     435          29 :         {OUString(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     436          29 :         {OUString(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     437          29 :         {OUString(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     438          29 :         {OUString(SC_UNONAME_FORMLOC),  SC_WID_UNO_FORMLOC, cppu::UnoType<OUString>::get(),        0, 0 },
     439          29 :         {OUString(SC_UNONAME_FORMRT),   SC_WID_UNO_FORMRT,  cppu::UnoType<table::CellContentType>::get(), 0 | beans::PropertyAttribute::READONLY, 0 },
     440          29 :         {OUString(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   cppu::UnoType<table::CellHoriJustify>::get(), 0, MID_HORJUST_HORJUST },
     441          29 :         {OUString(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     442          29 :         {OUString(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    cppu::UnoType<bool>::get(),                  0, MID_GRAPHIC_TRANSPARENT },
     443          29 :         {OUString(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     cppu::UnoType<bool>::get(),                  0, 0 },
     444          29 :         {OUString(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     445          29 :         {OUString(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     446          29 :         {OUString(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     447          29 :         {OUString(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,cppu::UnoType<container::XIndexReplace>::get(), 0, 0 },
     448          29 :         {OUString(SC_UNONAME_CELLORI),  ATTR_STACKED,       cppu::UnoType<table::CellOrientation>::get(), 0, 0 },
     449          29 :         {OUString(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     450          29 :         {OUString(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     451          29 :         {OUString(SC_UNONAME_PINDENT),  ATTR_INDENT,        cppu::UnoType<sal_Int16>::get(),            0, 0 }, //! CONVERT_TWIPS
     452          29 :         {OUString(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   cppu::UnoType<bool>::get(),                  0, 0 },
     453          29 :         {OUString(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,cppu::UnoType<bool>::get(),                 0, 0 },
     454          29 :         {OUString(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,cppu::UnoType<bool>::get(),                 0, 0 },
     455          29 :         {OUString(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     cppu::UnoType<bool>::get(),                  0, 0 },
     456          29 :         {OUString(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     457          29 :         {OUString(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     458          29 :         {OUString(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     459          29 :         {OUString(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     460          29 :         {OUString(SC_UNONAME_POS),      SC_WID_UNO_POS,     cppu::UnoType<awt::Point>::get(),           0 | beans::PropertyAttribute::READONLY, 0 },
     461          29 :         {OUString(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     462          29 :         {OUString(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,     ::cppu::UnoType<table::BorderLine2>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     463          29 :         {OUString(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     464          29 :         {OUString(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     465          29 :         {OUString(SC_UNONAME_SHADOW),   ATTR_SHADOW,        cppu::UnoType<table::ShadowFormat>::get(),  0, 0 | CONVERT_TWIPS },
     466          29 :         {OUString(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, cppu::UnoType<bool>::get(),               0, 0 },
     467          29 :         {OUString(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    cppu::UnoType<awt::Size>::get(),            0 | beans::PropertyAttribute::READONLY, 0 },
     468          29 :         {OUString(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, cppu::UnoType<table::TableBorder>::get(),   0, 0 | CONVERT_TWIPS },
     469          29 :         {OUString(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, cppu::UnoType<table::TableBorder2>::get(),   0, 0 | CONVERT_TWIPS },
     470          29 :         {OUString(SC_UNONAME_TOPBORDER),ATTR_BORDER,        ::cppu::UnoType<table::BorderLine>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     471          29 :         {OUString(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine2>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     472          29 :         {OUString(SC_UNONAME_USERDEF),  ATTR_USERDEF,       cppu::UnoType<container::XNameContainer>::get(), 0, 0 },
     473          29 :         {OUString(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     474          29 :         {OUString(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     475          29 :         {OUString(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     476          29 :         {OUString(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     477          29 :         {OUString(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     478          29 :         {OUString(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    cppu::UnoType<sal_Int16>::get(),            0, 0 },
     479          29 :         {OUString(UNO_NAME_EDIT_CHAR_ESCAPEMENT),   EE_CHAR_ESCAPEMENT, cppu::UnoType<sal_Int32>::get(),            0, 0 },
     480          29 :         {OUString(SC_UNONAME_HYPERLINK),  ATTR_HYPERLINK, cppu::UnoType<OUString>::get(),        0, 0 },
     481             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     482       19598 :     };
     483       16640 :     static SfxItemPropertySet aCellPropertySet( aCellPropertyMap_Impl );
     484       16640 :     return &aCellPropertySet;
     485             : }
     486             : 
     487             : //  Column und Row enthalten alle Eintraege von CellRange, zusaetzlich eigene Eintraege
     488             : //  mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt).
     489             : 
     490        1099 : static const SfxItemPropertySet* lcl_GetColumnPropertySet()
     491             : {
     492             :     static const SfxItemPropertyMapEntry aColumnPropertyMap_Impl[] =
     493             :     {
     494           9 :         {OUString(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, cppu::UnoType<OUString>::get(),        0 | beans::PropertyAttribute::READONLY, 0 },
     495           9 :         {OUString(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,cppu::UnoType<bool>::get(),                  0, 0 },
     496           9 :         {OUString(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     497           9 :         {OUString(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     498           9 :         {OUString(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    cppu::UnoType<sal_Int32>::get(),            0, MID_BACK_COLOR },
     499           9 :         {OUString(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    cppu::UnoType<util::CellProtection>::get(), 0, 0 },
     500           9 :         {OUString(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,cppu::UnoType<OUString>::get(),        0, 0 },
     501           9 :         {OUString(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    cppu::UnoType<sal_Int32>::get(),            0, 0 },
     502           9 :         {OUString(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  cppu::UnoType<bool>::get(),                  0, 0 },
     503           9 :         {OUString(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,cppu::UnoType<bool>::get(),                 0, MID_CROSSED_OUT },
     504           9 :         {OUString(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,cppu::UnoType<sal_Int16>::get(),         0, MID_EMPHASIS },
     505           9 :         {OUString(SC_UNONAME_CFONT),    ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     506           9 :         {OUString(SC_UNONAME_CFCHARS),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     507           9 :         {OUString(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     508           9 :         {OUString(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     509           9 :         {OUString(SC_UNONAME_CFFAMIL),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     510           9 :         {OUString(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     511           9 :         {OUString(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     512           9 :         {OUString(SC_UNONAME_CFNAME),   ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     513           9 :         {OUString(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     514           9 :         {OUString(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     515           9 :         {OUString(SC_UNONAME_CFPITCH),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     516           9 :         {OUString(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     517           9 :         {OUString(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     518           9 :         {OUString(SC_UNONAME_CFSTYLE),  ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     519           9 :         {OUString(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     520           9 :         {OUString(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     521           9 :         {OUString(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   cppu::UnoType<float>::get(),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     522           9 :         {OUString(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     523           9 :         {OUString(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     524           9 :         {OUString(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, cppu::UnoType<lang::Locale>::get(),         0, MID_LANG_LOCALE },
     525           9 :         {OUString(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     526           9 :         {OUString(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     527           9 :         {OUString(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     528           9 :         {OUString(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     529           9 :         {OUString(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     530           9 :         {OUString(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  cppu::UnoType<awt::FontSlant>::get(),       0, MID_POSTURE },
     531           9 :         {OUString(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     532           9 :         {OUString(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     533           9 :         {OUString(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   cppu::UnoType<sal_Int16>::get(),            0, MID_RELIEF },
     534           9 :         {OUString(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, cppu::UnoType<bool>::get(),                  0, 0 },
     535           9 :         {OUString(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,cppu::UnoType<sal_Int16>::get(),           0, MID_CROSS_OUT },
     536           9 :         {OUString(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     537           9 :         {OUString(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     538           9 :         {OUString(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     539           9 :         {OUString(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   cppu::UnoType<float>::get(),                0, MID_WEIGHT },
     540           9 :         {OUString(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     541           9 :         {OUString(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     542           9 :         {OUString(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, cppu::UnoType<bool>::get(),                  0, 0 },
     543           9 :         {OUString(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     544           9 :         {OUString(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     545           9 :         {OUString(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     546           9 :         {OUString(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     547           9 :         {OUString(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     548           9 :         {OUString(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     549           9 :         {OUString(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     550           9 :         {OUString(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     551           9 :         {OUString(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     552           9 :         {OUString(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   cppu::UnoType<table::CellHoriJustify>::get(), 0, MID_HORJUST_HORJUST },
     553           9 :         {OUString(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     554           9 :         {OUString(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    cppu::UnoType<bool>::get(),                  0, MID_GRAPHIC_TRANSPARENT },
     555           9 :         {OUString(SC_UNONAME_MANPAGE),  SC_WID_UNO_MANPAGE, cppu::UnoType<bool>::get(),                  0, 0 },
     556           9 :         {OUString(SC_UNONAME_NEWPAGE),  SC_WID_UNO_NEWPAGE, cppu::UnoType<bool>::get(),                  0, 0 },
     557           9 :         {OUString(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     cppu::UnoType<bool>::get(),                  0, 0 },
     558           9 :         {OUString(SC_UNONAME_CELLVIS),  SC_WID_UNO_CELLVIS, cppu::UnoType<bool>::get(),                  0, 0 },
     559           9 :         {OUString(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     560           9 :         {OUString(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     561           9 :         {OUString(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     562           9 :         {OUString(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,cppu::UnoType<container::XIndexReplace>::get(), 0, 0 },
     563           9 :         {OUString(SC_UNONAME_OWIDTH),   SC_WID_UNO_OWIDTH,  cppu::UnoType<bool>::get(),                  0, 0 },
     564           9 :         {OUString(SC_UNONAME_CELLORI),  ATTR_STACKED,       cppu::UnoType<table::CellOrientation>::get(), 0, 0 },
     565           9 :         {OUString(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     566           9 :         {OUString(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     567           9 :         {OUString(SC_UNONAME_PINDENT),  ATTR_INDENT,        cppu::UnoType<sal_Int16>::get(),            0, 0 }, //! CONVERT_TWIPS
     568           9 :         {OUString(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   cppu::UnoType<bool>::get(),                  0, 0 },
     569           9 :         {OUString(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,cppu::UnoType<bool>::get(),                 0, 0 },
     570           9 :         {OUString(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,cppu::UnoType<bool>::get(),                 0, 0 },
     571           9 :         {OUString(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     cppu::UnoType<bool>::get(),                  0, 0 },
     572           9 :         {OUString(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     573           9 :         {OUString(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     574           9 :         {OUString(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     575           9 :         {OUString(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     576           9 :         {OUString(SC_UNONAME_POS),      SC_WID_UNO_POS,     cppu::UnoType<awt::Point>::get(),           0 | beans::PropertyAttribute::READONLY, 0 },
     577           9 :         {OUString(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     578           9 :         {OUString(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     579           9 :         {OUString(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     580           9 :         {OUString(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     581           9 :         {OUString(SC_UNONAME_SHADOW),   ATTR_SHADOW,        cppu::UnoType<table::ShadowFormat>::get(),  0, 0 | CONVERT_TWIPS },
     582           9 :         {OUString(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, cppu::UnoType<bool>::get(),               0, 0 },
     583           9 :         {OUString(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    cppu::UnoType<awt::Size>::get(),            0 | beans::PropertyAttribute::READONLY, 0 },
     584           9 :         {OUString(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, cppu::UnoType<table::TableBorder>::get(),   0, 0 | CONVERT_TWIPS },
     585           9 :         {OUString(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, cppu::UnoType<table::TableBorder2>::get(),   0, 0 | CONVERT_TWIPS },
     586           9 :         {OUString(SC_UNONAME_TOPBORDER),ATTR_BORDER,        ::cppu::UnoType<table::BorderLine>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     587           9 :         {OUString(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine2>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     588           9 :         {OUString(SC_UNONAME_USERDEF),  ATTR_USERDEF,       cppu::UnoType<container::XNameContainer>::get(), 0, 0 },
     589           9 :         {OUString(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     590           9 :         {OUString(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     591           9 :         {OUString(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     592           9 :         {OUString(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     593           9 :         {OUString(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     594           9 :         {OUString(SC_UNONAME_CELLWID),  SC_WID_UNO_CELLWID, cppu::UnoType<sal_Int32>::get(),            0, 0 },
     595           9 :         {OUString(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    cppu::UnoType<sal_Int16>::get(),            0, 0 },
     596             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     597        2026 :     };
     598        1099 :     static SfxItemPropertySet aColumnPropertySet( aColumnPropertyMap_Impl );
     599        1099 :     return &aColumnPropertySet;
     600             : }
     601             : 
     602         120 : static const SfxItemPropertySet* lcl_GetRowPropertySet()
     603             : {
     604             :     static const SfxItemPropertyMapEntry aRowPropertyMap_Impl[] =
     605             :     {
     606           9 :         {OUString(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, cppu::UnoType<OUString>::get(),        0 | beans::PropertyAttribute::READONLY, 0 },
     607           9 :         {OUString(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,cppu::UnoType<bool>::get(),                  0, 0 },
     608           9 :         {OUString(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     609           9 :         {OUString(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     610           9 :         {OUString(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    cppu::UnoType<sal_Int32>::get(),            0, MID_BACK_COLOR },
     611           9 :         {OUString(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    cppu::UnoType<util::CellProtection>::get(), 0, 0 },
     612           9 :         {OUString(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,cppu::UnoType<OUString>::get(),        0, 0 },
     613           9 :         {OUString(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    cppu::UnoType<sal_Int32>::get(),            0, 0 },
     614           9 :         {OUString(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  cppu::UnoType<bool>::get(),                  0, 0 },
     615           9 :         {OUString(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,cppu::UnoType<bool>::get(),                 0, MID_CROSSED_OUT },
     616           9 :         {OUString(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,cppu::UnoType<sal_Int16>::get(),         0, MID_EMPHASIS },
     617           9 :         {OUString(SC_UNONAME_CFONT),    ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     618           9 :         {OUString(SC_UNONAME_CFCHARS),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     619           9 :         {OUString(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     620           9 :         {OUString(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     621           9 :         {OUString(SC_UNONAME_CFFAMIL),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     622           9 :         {OUString(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     623           9 :         {OUString(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     624           9 :         {OUString(SC_UNONAME_CFNAME),   ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     625           9 :         {OUString(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     626           9 :         {OUString(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     627           9 :         {OUString(SC_UNONAME_CFPITCH),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     628           9 :         {OUString(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     629           9 :         {OUString(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     630           9 :         {OUString(SC_UNONAME_CFSTYLE),  ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     631           9 :         {OUString(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     632           9 :         {OUString(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     633           9 :         {OUString(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   cppu::UnoType<float>::get(),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     634           9 :         {OUString(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     635           9 :         {OUString(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     636           9 :         {OUString(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, cppu::UnoType<lang::Locale>::get(),         0, MID_LANG_LOCALE },
     637           9 :         {OUString(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     638           9 :         {OUString(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     639           9 :         {OUString(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     640           9 :         {OUString(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     641           9 :         {OUString(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     642           9 :         {OUString(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  cppu::UnoType<awt::FontSlant>::get(),       0, MID_POSTURE },
     643           9 :         {OUString(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     644           9 :         {OUString(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     645           9 :         {OUString(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   cppu::UnoType<sal_Int16>::get(),            0, MID_RELIEF },
     646           9 :         {OUString(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, cppu::UnoType<bool>::get(),                  0, 0 },
     647           9 :         {OUString(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,cppu::UnoType<sal_Int16>::get(),           0, MID_CROSS_OUT },
     648           9 :         {OUString(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     649           9 :         {OUString(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     650           9 :         {OUString(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     651           9 :         {OUString(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   cppu::UnoType<float>::get(),                0, MID_WEIGHT },
     652           9 :         {OUString(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     653           9 :         {OUString(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     654           9 :         {OUString(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, cppu::UnoType<bool>::get(),                  0, 0 },
     655           9 :         {OUString(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     656           9 :         {OUString(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     657           9 :         {OUString(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     658           9 :         {OUString(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     659           9 :         {OUString(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     660           9 :         {OUString(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     661           9 :         {OUString(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     662           9 :         {OUString(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     663           9 :         {OUString(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     664           9 :         {OUString(SC_UNONAME_CELLHGT),  SC_WID_UNO_CELLHGT, cppu::UnoType<sal_Int32>::get(),            0, 0 },
     665           9 :         {OUString(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   cppu::UnoType<table::CellHoriJustify>::get(), 0, MID_HORJUST_HORJUST },
     666           9 :         {OUString(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     667           9 :         {OUString(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    cppu::UnoType<bool>::get(),                  0, MID_GRAPHIC_TRANSPARENT },
     668           9 :         {OUString(SC_UNONAME_CELLFILT), SC_WID_UNO_CELLFILT,cppu::UnoType<bool>::get(),                  0, 0 },
     669           9 :         {OUString(SC_UNONAME_MANPAGE),  SC_WID_UNO_MANPAGE, cppu::UnoType<bool>::get(),                  0, 0 },
     670           9 :         {OUString(SC_UNONAME_NEWPAGE),  SC_WID_UNO_NEWPAGE, cppu::UnoType<bool>::get(),                  0, 0 },
     671           9 :         {OUString(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     cppu::UnoType<bool>::get(),                  0, 0 },
     672           9 :         {OUString(SC_UNONAME_CELLVIS),  SC_WID_UNO_CELLVIS, cppu::UnoType<bool>::get(),                  0, 0 },
     673           9 :         {OUString(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     674           9 :         {OUString(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     675           9 :         {OUString(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     676           9 :         {OUString(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,cppu::UnoType<container::XIndexReplace>::get(), 0, 0 },
     677           9 :         {OUString(SC_UNONAME_OHEIGHT),  SC_WID_UNO_OHEIGHT, cppu::UnoType<bool>::get(),                  0, 0 },
     678           9 :         {OUString(SC_UNONAME_CELLORI),  ATTR_STACKED,       cppu::UnoType<table::CellOrientation>::get(), 0, 0 },
     679           9 :         {OUString(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     680           9 :         {OUString(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     681           9 :         {OUString(SC_UNONAME_PINDENT),  ATTR_INDENT,        cppu::UnoType<sal_Int16>::get(),            0, 0 }, //! CONVERT_TWIPS
     682           9 :         {OUString(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   cppu::UnoType<bool>::get(),                  0, 0 },
     683           9 :         {OUString(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,cppu::UnoType<bool>::get(),                 0, 0 },
     684           9 :         {OUString(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,cppu::UnoType<bool>::get(),                 0, 0 },
     685           9 :         {OUString(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     cppu::UnoType<bool>::get(),                  0, 0 },
     686           9 :         {OUString(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     687           9 :         {OUString(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     688           9 :         {OUString(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     689           9 :         {OUString(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     690           9 :         {OUString(SC_UNONAME_POS),      SC_WID_UNO_POS,     cppu::UnoType<awt::Point>::get(),           0 | beans::PropertyAttribute::READONLY, 0 },
     691           9 :         {OUString(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     692           9 :         {OUString(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,     ::cppu::UnoType<table::BorderLine2>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     693           9 :         {OUString(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     694           9 :         {OUString(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     695           9 :         {OUString(SC_UNONAME_SHADOW),   ATTR_SHADOW,        cppu::UnoType<table::ShadowFormat>::get(),  0, 0 | CONVERT_TWIPS },
     696           9 :         {OUString(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, cppu::UnoType<bool>::get(),               0, 0 },
     697           9 :         {OUString(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    cppu::UnoType<awt::Size>::get(),            0 | beans::PropertyAttribute::READONLY, 0 },
     698           9 :         {OUString(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, cppu::UnoType<table::TableBorder>::get(),   0, 0 | CONVERT_TWIPS },
     699           9 :         {OUString(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, cppu::UnoType<table::TableBorder2>::get(),   0, 0 | CONVERT_TWIPS },
     700           9 :         {OUString(SC_UNONAME_TOPBORDER),ATTR_BORDER,        ::cppu::UnoType<table::BorderLine>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     701           9 :         {OUString(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine2>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     702           9 :         {OUString(SC_UNONAME_USERDEF),  ATTR_USERDEF,       cppu::UnoType<container::XNameContainer>::get(), 0, 0 },
     703           9 :         {OUString(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     704           9 :         {OUString(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     705           9 :         {OUString(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     706           9 :         {OUString(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     707           9 :         {OUString(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     708           9 :         {OUString(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    cppu::UnoType<sal_Int16>::get(),            0, 0 },
     709             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     710        1056 :     };
     711         120 :     static SfxItemPropertySet aRowPropertySet( aRowPropertyMap_Impl );
     712         120 :     return &aRowPropertySet;
     713             : }
     714             : 
     715        4593 : static const SfxItemPropertySet* lcl_GetSheetPropertySet()
     716             : {
     717             :     static const SfxItemPropertyMapEntry aSheetPropertyMap_Impl[] =
     718             :     {
     719          43 :         {OUString(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, cppu::UnoType<OUString>::get(),        0 | beans::PropertyAttribute::READONLY, 0 },
     720          43 :         {OUString(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,cppu::UnoType<bool>::get(),                  0, 0 },
     721          43 :         {OUString(SC_UNONAME_AUTOPRINT),SC_WID_UNO_AUTOPRINT,cppu::UnoType<bool>::get(),                 0, 0 },
     722          43 :         {OUString(SC_UNONAME_BORDCOL),  SC_WID_UNO_BORDCOL, cppu::UnoType<sal_Int32>::get(),            0, 0 },
     723          43 :         {OUString(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     724          43 :         {OUString(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     725          43 :         {OUString(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    cppu::UnoType<sal_Int32>::get(),            0, MID_BACK_COLOR },
     726          43 :         {OUString(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    cppu::UnoType<util::CellProtection>::get(), 0, 0 },
     727          43 :         {OUString(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,cppu::UnoType<OUString>::get(),        0, 0 },
     728          43 :         {OUString(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    cppu::UnoType<sal_Int32>::get(),            0, 0 },
     729          43 :         {OUString(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  cppu::UnoType<bool>::get(),                  0, 0 },
     730          43 :         {OUString(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,cppu::UnoType<bool>::get(),                 0, MID_CROSSED_OUT },
     731          43 :         {OUString(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,cppu::UnoType<sal_Int16>::get(),         0, MID_EMPHASIS },
     732          43 :         {OUString(SC_UNONAME_CFONT),    ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     733          43 :         {OUString(SC_UNONAME_CFCHARS),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     734          43 :         {OUString(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     735          43 :         {OUString(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_CHAR_SET },
     736          43 :         {OUString(SC_UNONAME_CFFAMIL),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     737          43 :         {OUString(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     738          43 :         {OUString(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_FAMILY },
     739          43 :         {OUString(SC_UNONAME_CFNAME),   ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     740          43 :         {OUString(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     741          43 :         {OUString(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_FAMILY_NAME },
     742          43 :         {OUString(SC_UNONAME_CFPITCH),  ATTR_FONT,          cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     743          43 :         {OUString(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     744          43 :         {OUString(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      cppu::UnoType<sal_Int16>::get(),            0, MID_FONT_PITCH },
     745          43 :         {OUString(SC_UNONAME_CFSTYLE),  ATTR_FONT,          cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     746          43 :         {OUString(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     747          43 :         {OUString(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      cppu::UnoType<OUString>::get(),        0, MID_FONT_STYLE_NAME },
     748          43 :         {OUString(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   cppu::UnoType<float>::get(),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     749          43 :         {OUString(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     750          43 :         {OUString(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,cppu::UnoType<float>::get(),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     751          43 :         {OUString(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, cppu::UnoType<lang::Locale>::get(),         0, MID_LANG_LOCALE },
     752          43 :         {OUString(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     753          43 :         {OUString(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,cppu::UnoType<lang::Locale>::get(),          0, MID_LANG_LOCALE },
     754          43 :         {OUString(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     755          43 :         {OUString(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     756          43 :         {OUString(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     757          43 :         {OUString(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  cppu::UnoType<awt::FontSlant>::get(),       0, MID_POSTURE },
     758          43 :         {OUString(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     759          43 :         {OUString(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,cppu::UnoType<awt::FontSlant>::get(),     0, MID_POSTURE },
     760          43 :         {OUString(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   cppu::UnoType<sal_Int16>::get(),            0, MID_RELIEF },
     761          43 :         {OUString(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, cppu::UnoType<bool>::get(),                  0, 0 },
     762          43 :         {OUString(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,cppu::UnoType<sal_Int16>::get(),           0, MID_CROSS_OUT },
     763          43 :         {OUString(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int16>::get(),            0, MID_TL_STYLE },
     764          43 :         {OUString(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,cppu::UnoType<sal_Int32>::get(),            0, MID_TL_COLOR },
     765          43 :         {OUString(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,cppu::UnoType<bool>::get(),                  0, MID_TL_HASCOLOR },
     766          43 :         {OUString(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   cppu::UnoType<float>::get(),                0, MID_WEIGHT },
     767          43 :         {OUString(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     768          43 :         {OUString(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,cppu::UnoType<float>::get(),               0, MID_WEIGHT },
     769          43 :         {OUString(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, cppu::UnoType<bool>::get(),                  0, 0 },
     770          43 :         {OUString(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     771          43 :         {OUString(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,cppu::UnoType<bool>::get(),                  0, 0 },
     772          43 :         {OUString(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     773          43 :         {OUString(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     774          43 :         {OUString(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, cppu::UnoType<sheet::XSheetConditionalEntries>::get(), 0, 0 },
     775          43 :         {OUString(SC_UNONAME_COPYBACK), SC_WID_UNO_COPYBACK,cppu::UnoType<bool>::get(),                  0, 0 },
     776          43 :         {OUString(SC_UNONAME_COPYFORM), SC_WID_UNO_COPYFORM,cppu::UnoType<bool>::get(),                  0, 0 },
     777          43 :         {OUString(SC_UNONAME_COPYSTYL), SC_WID_UNO_COPYSTYL,cppu::UnoType<bool>::get(),                  0, 0 },
     778          43 :         {OUString(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     779          43 :         {OUString(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     780          43 :         {OUString(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine>::get(), 0, 0 | CONVERT_TWIPS },
     781          43 :         {OUString(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, ::cppu::UnoType<table::BorderLine2>::get(), 0, 0 | CONVERT_TWIPS },
     782          43 :         {OUString(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   cppu::UnoType<table::CellHoriJustify>::get(), 0, MID_HORJUST_HORJUST },
     783          43 :         {OUString(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     784          43 :         {OUString(SC_UNONAME_ISACTIVE), SC_WID_UNO_ISACTIVE,cppu::UnoType<bool>::get(),                  0, 0 },
     785          43 :         {OUString(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    cppu::UnoType<bool>::get(),                  0, MID_GRAPHIC_TRANSPARENT },
     786          43 :         {OUString(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     cppu::UnoType<bool>::get(),                  0, 0 },
     787          43 :         {OUString(SC_UNONAME_CELLVIS),  SC_WID_UNO_CELLVIS, cppu::UnoType<bool>::get(),                  0, 0 },
     788          43 :         {OUString(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     789          43 :         {OUString(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine2>::get(), 0, LEFT_BORDER | CONVERT_TWIPS },
     790          43 :         {OUString(SC_UNO_LINKDISPBIT),  SC_WID_UNO_LINKDISPBIT,cppu::UnoType<awt::XBitmap>::get(), 0 | beans::PropertyAttribute::READONLY, 0 },
     791          43 :         {OUString(SC_UNO_LINKDISPNAME), SC_WID_UNO_LINKDISPNAME,cppu::UnoType<OUString>::get(),    0 | beans::PropertyAttribute::READONLY, 0 },
     792          43 :         {OUString(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     793          43 :         {OUString(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,cppu::UnoType<container::XIndexReplace>::get(), 0, 0 },
     794          43 :         {OUString(SC_UNONAME_CELLORI),  ATTR_STACKED,       cppu::UnoType<table::CellOrientation>::get(), 0, 0 },
     795          43 :         {OUString(SC_UNONAME_PAGESTL),  SC_WID_UNO_PAGESTL, cppu::UnoType<OUString>::get(),        0, 0 },
     796          43 :         {OUString(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     797          43 :         {OUString(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     798          43 :         {OUString(SC_UNONAME_PINDENT),  ATTR_INDENT,        cppu::UnoType<sal_Int16>::get(),            0, 0 }, //! CONVERT_TWIPS
     799          43 :         {OUString(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   cppu::UnoType<bool>::get(),                  0, 0 },
     800          43 :         {OUString(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,cppu::UnoType<bool>::get(),                 0, 0 },
     801          43 :         {OUString(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,cppu::UnoType<bool>::get(),                 0, 0 },
     802          43 :         {OUString(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     cppu::UnoType<bool>::get(),                  0, 0 },
     803          43 :         {OUString(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   ::cppu::UnoType<sal_Int16>::get(),    0, MID_HORJUST_ADJUST },
     804          43 :         {OUString(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     805          43 :         {OUString(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     806          43 :         {OUString(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        cppu::UnoType<sal_Int32>::get(),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     807          43 :         {OUString(SC_UNONAME_POS),      SC_WID_UNO_POS,     cppu::UnoType<awt::Point>::get(),           0 | beans::PropertyAttribute::READONLY, 0 },
     808          43 :         {OUString(SC_UNONAME_PRINTBORD),SC_WID_UNO_PRINTBORD,cppu::UnoType<bool>::get(),                 0, 0 },
     809          43 :         {OUString(SC_UNONAME_PROTECT),  SC_WID_UNO_PROTECT, cppu::UnoType<bool>::get(),                  0, 0 },
     810          43 :         {OUString(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      ::cppu::UnoType<table::BorderLine>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     811          43 :         {OUString(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,     ::cppu::UnoType<table::BorderLine2>::get(), 0, RIGHT_BORDER | CONVERT_TWIPS },
     812          43 :         {OUString(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  cppu::UnoType<sal_Int32>::get(),            0, 0 },
     813          43 :         {OUString(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     814          43 :         {OUString(SC_UNONAME_SHADOW),   ATTR_SHADOW,        cppu::UnoType<table::ShadowFormat>::get(),  0, 0 | CONVERT_TWIPS },
     815          43 :         {OUString(SC_UNONAME_SHOWBORD), SC_WID_UNO_SHOWBORD,cppu::UnoType<bool>::get(),                  0, 0 },
     816          43 :         {OUString(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, cppu::UnoType<bool>::get(),               0, 0 },
     817          43 :         {OUString(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    cppu::UnoType<awt::Size>::get(),            0 | beans::PropertyAttribute::READONLY, 0 },
     818          43 :         {OUString(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, cppu::UnoType<table::TableBorder>::get(),   0, 0 | CONVERT_TWIPS },
     819          43 :         {OUString(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, cppu::UnoType<table::TableBorder2>::get(),   0, 0 | CONVERT_TWIPS },
     820          43 :         {OUString(SC_UNONAME_TABLAYOUT),SC_WID_UNO_TABLAYOUT,cppu::UnoType<sal_Int16>::get(),           0, 0 },
     821          43 :         {OUString(SC_UNONAME_CONDFORMAT), SC_WID_UNO_CONDFORMAT, cppu::UnoType<sheet::XConditionalFormats>::get(), 0, 0},
     822          43 :         {OUString(SC_UNONAME_TOPBORDER),ATTR_BORDER,        ::cppu::UnoType<table::BorderLine>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     823          43 :         {OUString(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       ::cppu::UnoType<table::BorderLine2>::get(), 0, TOP_BORDER | CONVERT_TWIPS },
     824          43 :         {OUString(SC_UNONAME_USERDEF),  ATTR_USERDEF,       cppu::UnoType<container::XNameContainer>::get(), 0, 0 },
     825          43 :         {OUString(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     826          43 :         {OUString(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     827          43 :         {OUString(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, cppu::UnoType<beans::XPropertySet>::get(), 0, 0 },
     828          43 :         {OUString(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   cppu::UnoType<sal_Int32>::get(), 0, 0 },
     829          43 :         {OUString(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, ::cppu::UnoType<sal_Int32>::get(),   0, 0 },
     830          43 :         {OUString(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    cppu::UnoType<sal_Int16>::get(),            0, 0 },
     831          43 :         {OUString(SC_UNONAME_TABCOLOR), SC_WID_UNO_TABCOLOR, cppu::UnoType<sal_Int32>::get(), 0, 0 },
     832          43 :         {OUString(SC_UNO_CODENAME),        SC_WID_UNO_CODENAME, cppu::UnoType<OUString>::get(),    0, 0},
     833          43 :         {OUString(SC_UNO_NAMEDRANGES), SC_WID_UNO_NAMES, cppu::UnoType<sheet::XNamedRanges>::get(), 0, 0 },
     834             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     835        9581 :     };
     836        4593 :     static SfxItemPropertySet aSheetPropertySet( aSheetPropertyMap_Impl );
     837        4593 :     return &aSheetPropertySet;
     838             : }
     839             : 
     840           4 : static const SfxItemPropertyMapEntry* lcl_GetEditPropertyMap()
     841             : {
     842             :     static const SfxItemPropertyMapEntry aEditPropertyMap_Impl[] =
     843             :     {
     844         200 :         SVX_UNOEDIT_CHAR_PROPERTIES,
     845           4 :         SVX_UNOEDIT_FONT_PROPERTIES,
     846          56 :         SVX_UNOEDIT_PARA_PROPERTIES,
     847           8 :         SVX_UNOEDIT_NUMBERING_PROPERTIE,    // for completeness of service ParagraphProperties
     848           4 :         {OUString(SC_UNONAME_TEXTUSER), EE_CHAR_XMLATTRIBS, cppu::UnoType<container::XNameContainer>::get(), 0, 0},
     849           4 :         {OUString(SC_UNONAME_USERDEF),  EE_PARA_XMLATTRIBS, cppu::UnoType<container::XNameContainer>::get(), 0, 0},
     850             :         { OUString(), 0, css::uno::Type(), 0, 0 }
     851         284 :     };
     852           4 :     return aEditPropertyMap_Impl;
     853             : }
     854          10 : static const SvxItemPropertySet* lcl_GetEditPropertySet()
     855             : {
     856          10 :     static SvxItemPropertySet aEditPropertySet( lcl_GetEditPropertyMap(), SdrObject::GetGlobalDrawObjectItemPool() );
     857          10 :     return &aEditPropertySet;
     858             : }
     859             : 
     860             : using sc::HMMToTwips;
     861             : using sc::TwipsToHMM;
     862             : 
     863             : #define SCCHARPROPERTIES_SERVICE    "com.sun.star.style.CharacterProperties"
     864             : #define SCPARAPROPERTIES_SERVICE    "com.sun.star.style.ParagraphProperties"
     865             : #define SCCELLPROPERTIES_SERVICE    "com.sun.star.table.CellProperties"
     866             : #define SCCELLRANGE_SERVICE         "com.sun.star.table.CellRange"
     867             : #define SCCELL_SERVICE              "com.sun.star.table.Cell"
     868             : #define SCSHEETCELLRANGES_SERVICE   "com.sun.star.sheet.SheetCellRanges"
     869             : #define SCSHEETCELLRANGE_SERVICE    "com.sun.star.sheet.SheetCellRange"
     870             : #define SCSPREADSHEET_SERVICE       "com.sun.star.sheet.Spreadsheet"
     871             : #define SCSHEETCELL_SERVICE         "com.sun.star.sheet.SheetCell"
     872             : 
     873           0 : SC_SIMPLE_SERVICE_INFO( ScCellFormatsEnumeration, "ScCellFormatsEnumeration", "com.sun.star.sheet.CellFormatRangesEnumeration" )
     874           0 : SC_SIMPLE_SERVICE_INFO( ScCellFormatsObj, "ScCellFormatsObj", "com.sun.star.sheet.CellFormatRanges" )
     875           1 : SC_SIMPLE_SERVICE_INFO( ScUniqueCellFormatsEnumeration, "ScUniqueCellFormatsEnumeration", "com.sun.star.sheet.UniqueCellFormatRangesEnumeration" )
     876           1 : SC_SIMPLE_SERVICE_INFO( ScUniqueCellFormatsObj, "ScUniqueCellFormatsObj", "com.sun.star.sheet.UniqueCellFormatRanges" )
     877           0 : SC_SIMPLE_SERVICE_INFO( ScCellRangesBase, "ScCellRangesBase", "stardiv.unknown" )
     878           0 : SC_SIMPLE_SERVICE_INFO( ScCellsEnumeration, "ScCellsEnumeration", "com.sun.star.sheet.CellsEnumeration" )
     879           0 : SC_SIMPLE_SERVICE_INFO( ScCellsObj, "ScCellsObj", "com.sun.star.sheet.Cells" )
     880           0 : SC_SIMPLE_SERVICE_INFO( ScTableColumnObj, "ScTableColumnObj", "com.sun.star.table.TableColumn" )
     881           0 : SC_SIMPLE_SERVICE_INFO( ScTableRowObj, "ScTableRowObj", "com.sun.star.table.TableRow" )
     882             : 
     883             : //! ScLinkListener in anderes File verschieben !!!
     884             : 
     885        8226 : ScLinkListener::~ScLinkListener()
     886             : {
     887        8226 : }
     888             : 
     889         593 : void ScLinkListener::Notify( const SfxHint& rHint )
     890             : {
     891         593 :     aLink.Call( const_cast<SfxHint*>(&rHint) );
     892         593 : }
     893             : 
     894           1 : static void lcl_CopyProperties( beans::XPropertySet& rDest, beans::XPropertySet& rSource )
     895             : {
     896           1 :     uno::Reference<beans::XPropertySetInfo> xInfo(rSource.getPropertySetInfo());
     897           1 :     if (xInfo.is())
     898             :     {
     899           1 :         uno::Sequence<beans::Property> aSeq(xInfo->getProperties());
     900           1 :         const beans::Property* pAry = aSeq.getConstArray();
     901           1 :         sal_uLong nCount = aSeq.getLength();
     902          10 :         for (sal_uLong i=0; i<nCount; i++)
     903             :         {
     904           9 :             OUString aName(pAry[i].Name);
     905           9 :             rDest.setPropertyValue( aName, rSource.getPropertyValue( aName ) );
     906          10 :         }
     907           1 :     }
     908           1 : }
     909             : 
     910          61 : static SCTAB lcl_FirstTab( const ScRangeList& rRanges )
     911             : {
     912             :     OSL_ENSURE(rRanges.size() >= 1, "was fuer Ranges ?!?!");
     913          61 :     const ScRange* pFirst = rRanges[ 0 ];
     914          61 :     if (pFirst)
     915          61 :         return pFirst->aStart.Tab();
     916             : 
     917           0 :     return 0;   // soll nicht sein
     918             : }
     919             : 
     920          79 : static bool lcl_WholeSheet( const ScRangeList& rRanges )
     921             : {
     922          79 :     if ( rRanges.size() == 1 )
     923             :     {
     924          72 :         const ScRange* pRange = rRanges[0];
     925         156 :         if ( pRange && pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL &&
     926          96 :                        pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW )
     927          12 :             return true;
     928             :     }
     929          67 :     return false;
     930             : }
     931             : 
     932             : namespace {
     933             : template<typename BorderLineType>
     934          36 : const ::editeng::SvxBorderLine* lcl_getBorderLine(
     935             :         ::editeng::SvxBorderLine& rLine, const BorderLineType& rStruct )
     936             : {
     937             :     // Convert from 1/100mm to Twips.
     938          36 :     if (!SvxBoxItem::LineToSvxLine( rStruct, rLine, true))
     939          36 :         return NULL;
     940             : 
     941           0 :     if ( rLine.GetOutWidth() || rLine.GetInWidth() || rLine.GetDistance() )
     942           0 :         return &rLine;
     943             :     else
     944           0 :         return NULL;
     945             : }
     946             : }
     947             : 
     948          36 : const ::editeng::SvxBorderLine* ScHelperFunctions::GetBorderLine(
     949             :         ::editeng::SvxBorderLine& rLine, const table::BorderLine& rStruct )
     950             : {
     951          36 :     return lcl_getBorderLine( rLine, rStruct);
     952             : }
     953             : 
     954           0 : const ::editeng::SvxBorderLine* ScHelperFunctions::GetBorderLine(
     955             :         ::editeng::SvxBorderLine& rLine, const table::BorderLine2& rStruct )
     956             : {
     957           0 :     return lcl_getBorderLine( rLine, rStruct);
     958             : }
     959             : 
     960             : namespace {
     961             : template<typename TableBorderType>
     962           6 : void lcl_fillBoxItems( SvxBoxItem& rOuter, SvxBoxInfoItem& rInner, const TableBorderType& rBorder )
     963             : {
     964           6 :     ::editeng::SvxBorderLine aLine;
     965           6 :     rOuter.SetDistance( static_cast<sal_uInt16>(HMMToTwips( rBorder.Distance )) );
     966           6 :     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.TopLine ),         SvxBoxItemLine::TOP );
     967           6 :     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.BottomLine ),      SvxBoxItemLine::BOTTOM );
     968           6 :     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.LeftLine ),        SvxBoxItemLine::LEFT );
     969           6 :     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.RightLine ),       SvxBoxItemLine::RIGHT );
     970           6 :     rInner.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.HorizontalLine ),  SvxBoxInfoItemLine::HORI );
     971           6 :     rInner.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.VerticalLine ),    SvxBoxInfoItemLine::VERT );
     972           6 :     rInner.SetValid( SvxBoxInfoItemValidFlags::TOP,      rBorder.IsTopLineValid );
     973           6 :     rInner.SetValid( SvxBoxInfoItemValidFlags::BOTTOM,   rBorder.IsBottomLineValid );
     974           6 :     rInner.SetValid( SvxBoxInfoItemValidFlags::LEFT,     rBorder.IsLeftLineValid );
     975           6 :     rInner.SetValid( SvxBoxInfoItemValidFlags::RIGHT,    rBorder.IsRightLineValid );
     976           6 :     rInner.SetValid( SvxBoxInfoItemValidFlags::HORI,     rBorder.IsHorizontalLineValid );
     977           6 :     rInner.SetValid( SvxBoxInfoItemValidFlags::VERT,     rBorder.IsVerticalLineValid );
     978           6 :     rInner.SetValid( SvxBoxInfoItemValidFlags::DISTANCE, rBorder.IsDistanceValid );
     979           6 :     rInner.SetTable( true );
     980           6 : }
     981             : }
     982             : 
     983           6 : void ScHelperFunctions::FillBoxItems( SvxBoxItem& rOuter, SvxBoxInfoItem& rInner, const table::TableBorder& rBorder )
     984             : {
     985           6 :     lcl_fillBoxItems( rOuter, rInner, rBorder);
     986           6 : }
     987             : 
     988           0 : void ScHelperFunctions::FillBoxItems( SvxBoxItem& rOuter, SvxBoxInfoItem& rInner, const table::TableBorder2& rBorder )
     989             : {
     990           0 :     lcl_fillBoxItems( rOuter, rInner, rBorder);
     991           0 : }
     992             : 
     993         186 : void ScHelperFunctions::FillBorderLine( table::BorderLine& rStruct, const ::editeng::SvxBorderLine* pLine )
     994             : {
     995             :     // Convert from Twips to 1/100mm.
     996         186 :     table::BorderLine2 aStruct( SvxBoxItem::SvxLineToLine( pLine, true));
     997         186 :     rStruct = aStruct;
     998         186 : }
     999             : 
    1000          90 : void ScHelperFunctions::FillBorderLine( table::BorderLine2& rStruct, const ::editeng::SvxBorderLine* pLine )
    1001             : {
    1002          90 :     rStruct = SvxBoxItem::SvxLineToLine( pLine, true);
    1003          90 : }
    1004             : 
    1005             : namespace {
    1006             : template<typename TableBorderItem>
    1007          46 : void lcl_fillTableBorder( TableBorderItem& rBorder, const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner,
    1008             :         bool bInvalidateHorVerDist )
    1009             : {
    1010          46 :     ScHelperFunctions::FillBorderLine( rBorder.TopLine,         rOuter.GetTop() );
    1011          46 :     ScHelperFunctions::FillBorderLine( rBorder.BottomLine,      rOuter.GetBottom() );
    1012          46 :     ScHelperFunctions::FillBorderLine( rBorder.LeftLine,        rOuter.GetLeft() );
    1013          46 :     ScHelperFunctions::FillBorderLine( rBorder.RightLine,       rOuter.GetRight() );
    1014          46 :     ScHelperFunctions::FillBorderLine( rBorder.HorizontalLine,  rInner.GetHori() );
    1015          46 :     ScHelperFunctions::FillBorderLine( rBorder.VerticalLine,    rInner.GetVert() );
    1016             : 
    1017          46 :     rBorder.Distance                = rOuter.GetDistance();
    1018          46 :     rBorder.IsTopLineValid          = rInner.IsValid(SvxBoxInfoItemValidFlags::TOP);
    1019          46 :     rBorder.IsBottomLineValid       = rInner.IsValid(SvxBoxInfoItemValidFlags::BOTTOM);
    1020          46 :     rBorder.IsLeftLineValid         = rInner.IsValid(SvxBoxInfoItemValidFlags::LEFT);
    1021          46 :     rBorder.IsRightLineValid        = rInner.IsValid(SvxBoxInfoItemValidFlags::RIGHT);
    1022          46 :     rBorder.IsHorizontalLineValid   = !bInvalidateHorVerDist && rInner.IsValid(SvxBoxInfoItemValidFlags::HORI);
    1023          46 :     rBorder.IsVerticalLineValid     = !bInvalidateHorVerDist && rInner.IsValid(SvxBoxInfoItemValidFlags::VERT);
    1024          46 :     rBorder.IsDistanceValid         = !bInvalidateHorVerDist && rInner.IsValid(SvxBoxInfoItemValidFlags::DISTANCE);
    1025          46 : }
    1026             : }
    1027             : 
    1028          31 : void ScHelperFunctions::AssignTableBorderToAny( uno::Any& rAny,
    1029             :         const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner, bool bInvalidateHorVerDist )
    1030             : {
    1031          31 :     table::TableBorder aBorder;
    1032          31 :     lcl_fillTableBorder( aBorder, rOuter, rInner, bInvalidateHorVerDist);
    1033          31 :     rAny <<= aBorder;
    1034          31 : }
    1035             : 
    1036          15 : void ScHelperFunctions::AssignTableBorder2ToAny( uno::Any& rAny,
    1037             :         const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner, bool bInvalidateHorVerDist )
    1038             : {
    1039          15 :     table::TableBorder2 aBorder;
    1040          15 :     lcl_fillTableBorder( aBorder, rOuter, rInner, bInvalidateHorVerDist);
    1041          15 :     rAny <<= aBorder;
    1042          15 : }
    1043             : 
    1044             : //! lcl_ApplyBorder nach docfunc verschieben!
    1045             : 
    1046           4 : void ScHelperFunctions::ApplyBorder( ScDocShell* pDocShell, const ScRangeList& rRanges,
    1047             :                         const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner )
    1048             : {
    1049           4 :     ScDocument& rDoc = pDocShell->GetDocument();
    1050           4 :     bool bUndo(rDoc.IsUndoEnabled());
    1051           4 :     ScDocument* pUndoDoc = NULL;
    1052           4 :     if (bUndo)
    1053           4 :         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
    1054           4 :     size_t nCount = rRanges.size();
    1055           8 :     for (size_t i = 0; i < nCount; ++i)
    1056             :     {
    1057           4 :         ScRange aRange( *rRanges[ i ] );
    1058           4 :         SCTAB nTab = aRange.aStart.Tab();
    1059             : 
    1060           4 :         if (bUndo)
    1061             :         {
    1062           4 :             if ( i==0 )
    1063           4 :                 pUndoDoc->InitUndo( &rDoc, nTab, nTab );
    1064             :             else
    1065           0 :                 pUndoDoc->AddUndoTab( nTab, nTab );
    1066           4 :             rDoc.CopyToDocument( aRange, IDF_ATTRIB, false, pUndoDoc );
    1067             :         }
    1068             : 
    1069           4 :         ScMarkData aMark;
    1070           4 :         aMark.SetMarkArea( aRange );
    1071           4 :         aMark.SelectTable( nTab, true );
    1072             : 
    1073           4 :         rDoc.ApplySelectionFrame( aMark, &rOuter, &rInner );
    1074             :         // RowHeight bei Umrandung alleine nicht noetig
    1075           4 :     }
    1076             : 
    1077           4 :     if (bUndo)
    1078             :     {
    1079           4 :         pDocShell->GetUndoManager()->AddUndoAction(
    1080           4 :                 new ScUndoBorder( pDocShell, rRanges, pUndoDoc, rOuter, rInner ) );
    1081             :     }
    1082             : 
    1083           8 :     for (size_t i = 0; i < nCount; ++i )
    1084           4 :         pDocShell->PostPaint( *rRanges[ i ], PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
    1085             : 
    1086           4 :     pDocShell->SetDocumentModified();
    1087           4 : }
    1088             : 
    1089             : //! move lcl_PutDataArray to docfunc?
    1090             : //! merge loop with ScFunctionAccess::callFunction
    1091             : 
    1092           8 : static bool lcl_PutDataArray( ScDocShell& rDocShell, const ScRange& rRange,
    1093             :                         const uno::Sequence< uno::Sequence<uno::Any> >& aData )
    1094             : {
    1095           8 :     ScDocument& rDoc = rDocShell.GetDocument();
    1096           8 :     SCTAB nTab = rRange.aStart.Tab();
    1097           8 :     SCCOL nStartCol = rRange.aStart.Col();
    1098           8 :     SCROW nStartRow = rRange.aStart.Row();
    1099           8 :     SCCOL nEndCol = rRange.aEnd.Col();
    1100           8 :     SCROW nEndRow = rRange.aEnd.Row();
    1101           8 :     bool bUndo(rDoc.IsUndoEnabled());
    1102             : 
    1103           8 :     if ( !rDoc.IsBlockEditable( nTab, nStartCol,nStartRow, nEndCol,nEndRow ) )
    1104             :     {
    1105             :         //! error message
    1106           0 :         return false;
    1107             :     }
    1108             : 
    1109           8 :     long nCols = 0;
    1110           8 :     long nRows = aData.getLength();
    1111           8 :     const uno::Sequence<uno::Any>* pArray = aData.getConstArray();
    1112           8 :     if ( nRows )
    1113           8 :         nCols = pArray[0].getLength();
    1114             : 
    1115           8 :     if ( nCols != nEndCol-nStartCol+1 || nRows != nEndRow-nStartRow+1 )
    1116             :     {
    1117             :         //! error message?
    1118           0 :         return false;
    1119             :     }
    1120             : 
    1121           8 :     ScDocument* pUndoDoc = NULL;
    1122           8 :     if ( bUndo )
    1123             :     {
    1124           8 :         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
    1125           8 :         pUndoDoc->InitUndo( &rDoc, nTab, nTab );
    1126           8 :         rDoc.CopyToDocument( rRange, IDF_CONTENTS|IDF_NOCAPTIONS, false, pUndoDoc );
    1127             :     }
    1128             : 
    1129           8 :     rDoc.DeleteAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, IDF_CONTENTS );
    1130             : 
    1131           8 :     bool bError = false;
    1132           8 :     SCROW nDocRow = nStartRow;
    1133         416 :     for (long nRow=0; nRow<nRows; nRow++)
    1134             :     {
    1135         408 :         const uno::Sequence<uno::Any>& rColSeq = pArray[nRow];
    1136         408 :         if ( rColSeq.getLength() == nCols )
    1137             :         {
    1138         408 :             SCCOL nDocCol = nStartCol;
    1139         408 :             const uno::Any* pColArr = rColSeq.getConstArray();
    1140       20440 :             for (long nCol=0; nCol<nCols; nCol++)
    1141             :             {
    1142       20032 :                 ScAddress aPos(nDocCol, nDocRow, nTab);
    1143             : 
    1144       20032 :                 const uno::Any& rElement = pColArr[nCol];
    1145       20032 :                 switch( rElement.getValueTypeClass() )
    1146             :                 {
    1147             :                     case uno::TypeClass_VOID:
    1148             :                     {
    1149             :                         // void = "no value"
    1150           0 :                         rDoc.SetError( nDocCol, nDocRow, nTab, NOTAVAILABLE );
    1151             :                     }
    1152           0 :                     break;
    1153             : 
    1154             :                     //  #87871# accept integer types because Basic passes a floating point
    1155             :                     //  variable as byte, short or long if it's an integer number.
    1156             :                     case uno::TypeClass_BYTE:
    1157             :                     case uno::TypeClass_SHORT:
    1158             :                     case uno::TypeClass_UNSIGNED_SHORT:
    1159             :                     case uno::TypeClass_LONG:
    1160             :                     case uno::TypeClass_UNSIGNED_LONG:
    1161             :                     case uno::TypeClass_FLOAT:
    1162             :                     case uno::TypeClass_DOUBLE:
    1163             :                     {
    1164       20032 :                         double fVal(0.0);
    1165       20032 :                         rElement >>= fVal;
    1166       20032 :                         rDoc.SetValue(aPos, fVal);
    1167             :                     }
    1168       20032 :                     break;
    1169             : 
    1170             :                     case uno::TypeClass_STRING:
    1171             :                     {
    1172           0 :                         OUString aUStr;
    1173           0 :                         rElement >>= aUStr;
    1174           0 :                         if ( !aUStr.isEmpty() )
    1175             :                         {
    1176           0 :                             ScSetStringParam aParam;
    1177           0 :                             aParam.setTextInput();
    1178           0 :                             rDoc.SetString(aPos, aUStr, &aParam);
    1179           0 :                         }
    1180             :                     }
    1181           0 :                     break;
    1182             : 
    1183             :                     // accept Sequence<FormulaToken> for formula cells
    1184             :                     case uno::TypeClass_SEQUENCE:
    1185             :                     {
    1186           0 :                         uno::Sequence< sheet::FormulaToken > aTokens;
    1187           0 :                         if ( rElement >>= aTokens )
    1188             :                         {
    1189           0 :                             ScTokenArray aTokenArray;
    1190           0 :                             ScTokenConversion::ConvertToTokenArray( rDoc, aTokenArray, aTokens );
    1191           0 :                             rDoc.SetFormula(aPos, aTokenArray);
    1192             :                         }
    1193             :                         else
    1194           0 :                             bError = true;
    1195             :                     }
    1196           0 :                     break;
    1197             : 
    1198             :                     default:
    1199           0 :                         bError = true;      // invalid type
    1200             :                 }
    1201       20032 :                 ++nDocCol;
    1202             :             }
    1203             :         }
    1204             :         else
    1205           0 :             bError = true;                          // wrong size
    1206             : 
    1207         408 :         ++nDocRow;
    1208             :     }
    1209             : 
    1210           8 :     bool bHeight = rDocShell.AdjustRowHeight( nStartRow, nEndRow, nTab );
    1211             : 
    1212           8 :     if ( pUndoDoc )
    1213             :     {
    1214           8 :         ScMarkData aDestMark;
    1215           8 :         aDestMark.SelectOneTable( nTab );
    1216           8 :         rDocShell.GetUndoManager()->AddUndoAction(
    1217             :             new ScUndoPaste(
    1218             :                 &rDocShell, ScRange(nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab),
    1219           8 :                 aDestMark, pUndoDoc, NULL, IDF_CONTENTS, NULL, false));
    1220             :     }
    1221             : 
    1222           8 :     if (!bHeight)
    1223           8 :         rDocShell.PostPaint( rRange, PAINT_GRID );      // AdjustRowHeight may have painted already
    1224             : 
    1225           8 :     rDocShell.SetDocumentModified();
    1226             : 
    1227           8 :     return !bError;
    1228             : }
    1229             : 
    1230           2 : static bool lcl_PutFormulaArray( ScDocShell& rDocShell, const ScRange& rRange,
    1231             :         const uno::Sequence< uno::Sequence<OUString> >& aData,
    1232             :         const formula::FormulaGrammar::Grammar eGrammar )
    1233             : {
    1234           2 :     ScDocument& rDoc = rDocShell.GetDocument();
    1235           2 :     SCTAB nTab = rRange.aStart.Tab();
    1236           2 :     SCCOL nStartCol = rRange.aStart.Col();
    1237           2 :     SCROW nStartRow = rRange.aStart.Row();
    1238           2 :     SCCOL nEndCol = rRange.aEnd.Col();
    1239           2 :     SCROW nEndRow = rRange.aEnd.Row();
    1240           2 :     bool bUndo(rDoc.IsUndoEnabled());
    1241             : 
    1242           2 :     if ( !rDoc.IsBlockEditable( nTab, nStartCol,nStartRow, nEndCol,nEndRow ) )
    1243             :     {
    1244             :         //! error message
    1245           0 :         return false;
    1246             :     }
    1247             : 
    1248           2 :     long nCols = 0;
    1249           2 :     long nRows = aData.getLength();
    1250           2 :     const uno::Sequence<OUString>* pArray = aData.getConstArray();
    1251           2 :     if ( nRows )
    1252           2 :         nCols = pArray[0].getLength();
    1253             : 
    1254           2 :     if ( nCols != nEndCol-nStartCol+1 || nRows != nEndRow-nStartRow+1 )
    1255             :     {
    1256             :         //! error message?
    1257           0 :         return false;
    1258             :     }
    1259             : 
    1260           2 :     ScDocument* pUndoDoc = NULL;
    1261           2 :     if ( bUndo )
    1262             :     {
    1263           2 :         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
    1264           2 :         pUndoDoc->InitUndo( &rDoc, nTab, nTab );
    1265           2 :         rDoc.CopyToDocument( rRange, IDF_CONTENTS, false, pUndoDoc );
    1266             :     }
    1267             : 
    1268           2 :     rDoc.DeleteAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, IDF_CONTENTS );
    1269             : 
    1270           2 :     bool bError = false;
    1271           2 :     SCROW nDocRow = nStartRow;
    1272          12 :     for (long nRow=0; nRow<nRows; nRow++)
    1273             :     {
    1274          10 :         const uno::Sequence<OUString>& rColSeq = pArray[nRow];
    1275          10 :         if ( rColSeq.getLength() == nCols )
    1276             :         {
    1277          10 :             SCCOL nDocCol = nStartCol;
    1278          10 :             const OUString* pColArr = rColSeq.getConstArray();
    1279          50 :             for (long nCol=0; nCol<nCols; nCol++)
    1280             :             {
    1281          40 :                 OUString aText(pColArr[nCol]);
    1282          40 :                 ScAddress aPos( nDocCol, nDocRow, nTab );
    1283             : 
    1284             :                 ScInputStringType aRes =
    1285             :                     ScStringUtil::parseInputString(
    1286          80 :                         *rDoc.GetFormatTable(), aText, LANGUAGE_ENGLISH_US);
    1287          40 :                 switch (aRes.meType)
    1288             :                 {
    1289             :                     case ScInputStringType::Formula:
    1290           0 :                         rDoc.SetFormula(aPos, aRes.maText, eGrammar);
    1291           0 :                     break;
    1292             :                     case ScInputStringType::Number:
    1293           0 :                         rDoc.SetValue(aPos, aRes.mfValue);
    1294           0 :                     break;
    1295             :                     case ScInputStringType::Text:
    1296           1 :                         rDoc.SetTextCell(aPos, aRes.maText);
    1297           1 :                     break;
    1298             :                     default:
    1299             :                         ;
    1300             :                 }
    1301             : 
    1302          40 :                 ++nDocCol;
    1303          40 :             }
    1304             :         }
    1305             :         else
    1306           0 :             bError = true;                          // wrong size
    1307             : 
    1308          10 :         ++nDocRow;
    1309             :     }
    1310             : 
    1311           2 :     bool bHeight = rDocShell.AdjustRowHeight( nStartRow, nEndRow, nTab );
    1312             : 
    1313           2 :     if ( pUndoDoc )
    1314             :     {
    1315           2 :         ScMarkData aDestMark;
    1316           2 :         aDestMark.SelectOneTable( nTab );
    1317           2 :         rDocShell.GetUndoManager()->AddUndoAction(
    1318             :             new ScUndoPaste( &rDocShell,
    1319             :                 ScRange(nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab), aDestMark,
    1320           2 :                 pUndoDoc, NULL, IDF_CONTENTS, NULL, false));
    1321             :     }
    1322             : 
    1323           2 :     if (!bHeight)
    1324           2 :         rDocShell.PostPaint( rRange, PAINT_GRID );      // AdjustRowHeight may have painted already
    1325             : 
    1326           2 :     rDocShell.SetDocumentModified();
    1327             : 
    1328           2 :     return !bError;
    1329             : }
    1330             : 
    1331             : //  used in ScCellRangeObj::getFormulaArray and ScCellObj::GetInputString_Impl
    1332         226 : static OUString lcl_GetInputString( ScDocument& rDoc, const ScAddress& rPos, bool bEnglish )
    1333             : {
    1334         226 :     ScRefCellValue aCell;
    1335         226 :     aCell.assign(rDoc, rPos);
    1336         226 :     if (aCell.isEmpty())
    1337         111 :         return EMPTY_OUSTRING;
    1338             : 
    1339         230 :     OUString aVal;
    1340             : 
    1341         115 :     CellType eType = aCell.meType;
    1342         115 :     if (eType == CELLTYPE_FORMULA)
    1343             :     {
    1344          61 :         ScFormulaCell* pForm = aCell.mpFormula;
    1345          61 :         pForm->GetFormula( aVal, formula::FormulaGrammar::mapAPItoGrammar( bEnglish, false));
    1346          61 :         return aVal;
    1347             :     }
    1348             : 
    1349             :     SvNumberFormatter* pFormatter = bEnglish ? ScGlobal::GetEnglishFormatter() :
    1350          54 :                                                 rDoc.GetFormatTable();
    1351             :     // Since the English formatter was constructed with
    1352             :     // LANGUAGE_ENGLISH_US the "General" format has index key 0,
    1353             :     // we don't have to query.
    1354          54 :     sal_uInt32 nNumFmt = bEnglish ? 0 : rDoc.GetNumberFormat(rPos);
    1355             : 
    1356          54 :     if (eType == CELLTYPE_EDIT)
    1357             :     {
    1358             :         //  GetString an der EditCell macht Leerzeichen aus Umbruechen,
    1359             :         //  hier werden die Umbrueche aber gebraucht
    1360           0 :         const EditTextObject* pData = aCell.mpEditText;
    1361           0 :         if (pData)
    1362             :         {
    1363           0 :             EditEngine& rEngine = rDoc.GetEditEngine();
    1364           0 :             rEngine.SetText(*pData);
    1365           0 :             aVal = rEngine.GetText(LINEEND_LF);
    1366             :         }
    1367             :     }
    1368             :     else
    1369          54 :         ScCellFormat::GetInputString(aCell, nNumFmt, aVal, *pFormatter, &rDoc);
    1370             : 
    1371             :     //  ggf. ein ' davorhaengen wie in ScTabViewShell::UpdateInputHandler
    1372          54 :     if ( eType == CELLTYPE_STRING || eType == CELLTYPE_EDIT )
    1373             :     {
    1374             :         double fDummy;
    1375          24 :         OUString aTempString = aVal;
    1376          24 :         bool bIsNumberFormat(pFormatter->IsNumberFormat(aTempString, nNumFmt, fDummy));
    1377          24 :         if ( bIsNumberFormat )
    1378           0 :             aTempString = "'" + aTempString;
    1379          24 :         else if ( aTempString.startsWith("'") )
    1380             :         {
    1381             :             //  if the string starts with a "'", add another one because setFormula
    1382             :             //  strips one (like text input, except for "text" number formats)
    1383           0 :             if ( bEnglish || ( pFormatter->GetType(nNumFmt) != css::util::NumberFormat::TEXT ) )
    1384           0 :                 aTempString = "'" + aTempString;
    1385             :         }
    1386          24 :         aVal = aTempString;
    1387             :     }
    1388         280 :     return aVal;
    1389             : }
    1390             : 
    1391       31978 : ScCellRangesBase::ScCellRangesBase(ScDocShell* pDocSh, const ScRange& rR) :
    1392       31978 :     pPropSet(lcl_GetCellsPropertySet()),
    1393             :     pDocShell( pDocSh ),
    1394             :     pValueListener( NULL ),
    1395             :     pCurrentFlat( NULL ),
    1396             :     pCurrentDeep( NULL ),
    1397             :     pCurrentDataSet( NULL ),
    1398             :     pNoDfltCurrentDataSet( NULL ),
    1399             :     pMarkData( NULL ),
    1400             :     nObjectId( 0 ),
    1401             :     bChartColAsHdr( false ),
    1402             :     bChartRowAsHdr( false ),
    1403             :     bCursorOnly( false ),
    1404             :     bGotDataChangedHint( false ),
    1405       63956 :     aValueListeners( 0 )
    1406             : {
    1407             :     // this is a hack to get m_wThis initialized; ideally there would be
    1408             :     // factory functions doing this but there are so many subclasses of this...
    1409       31978 :     ++m_refCount;
    1410             :     {
    1411       63956 :         m_wThis = uno::Reference<uno::XInterface>(
    1412       31978 :                     static_cast<cppu::OWeakObject*>(this));
    1413             :     }
    1414       31978 :     --m_refCount;
    1415             : 
    1416       31978 :     ScRange aCellRange(rR);
    1417       31978 :     aCellRange.Justify();
    1418       31978 :     aRanges.Append( aCellRange );
    1419             : 
    1420       31978 :     if (pDocShell)  // Null if created with createInstance
    1421             :     {
    1422       31977 :         ScDocument& rDoc = pDocShell->GetDocument();
    1423       31977 :         rDoc.AddUnoObject(*this);
    1424       31977 :         nObjectId = rDoc.GetNewUnoId();
    1425             :     }
    1426       31978 : }
    1427             : 
    1428        2042 : ScCellRangesBase::ScCellRangesBase(ScDocShell* pDocSh, const ScRangeList& rR) :
    1429        2042 :     pPropSet(lcl_GetCellsPropertySet()),
    1430             :     pDocShell( pDocSh ),
    1431             :     pValueListener( NULL ),
    1432             :     pCurrentFlat( NULL ),
    1433             :     pCurrentDeep( NULL ),
    1434             :     pCurrentDataSet( NULL ),
    1435             :     pNoDfltCurrentDataSet( NULL ),
    1436             :     pMarkData( NULL ),
    1437             :     aRanges( rR ),
    1438             :     nObjectId( 0 ),
    1439             :     bChartColAsHdr( false ),
    1440             :     bChartRowAsHdr( false ),
    1441             :     bCursorOnly( false ),
    1442             :     bGotDataChangedHint( false ),
    1443        4084 :     aValueListeners( 0 )
    1444             : {
    1445             :     // this is a hack to get m_wThis initialized; ideally there would be
    1446             :     // factory functions doing this but there are so many subclasses of this...
    1447        2042 :     ++m_refCount;
    1448             :     {
    1449        4084 :         m_wThis = uno::Reference<uno::XInterface>(
    1450        2042 :                     static_cast<cppu::OWeakObject*>(this));
    1451             :     }
    1452        2042 :     --m_refCount;
    1453             : 
    1454        2042 :     if (pDocShell)  // Null if created with createInstance
    1455             :     {
    1456        2042 :         ScDocument& rDoc = pDocShell->GetDocument();
    1457        2042 :         rDoc.AddUnoObject(*this);
    1458        2042 :         nObjectId = rDoc.GetNewUnoId();
    1459             :     }
    1460        2042 : }
    1461             : 
    1462       67816 : ScCellRangesBase::~ScCellRangesBase()
    1463             : {
    1464       33908 :     SolarMutexGuard g;
    1465             : 
    1466             :     //  call RemoveUnoObject first, so no notification can happen
    1467             :     //  during ForgetCurrentAttrs
    1468             : 
    1469       33908 :     if (pDocShell)
    1470       30274 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    1471             : 
    1472       33908 :     ForgetCurrentAttrs();
    1473       33908 :     ForgetMarkData();
    1474             : 
    1475       33908 :     delete pValueListener;
    1476             : 
    1477             :     //! XChartDataChangeEventListener abmelden ??
    1478             :     //! (ChartCollection haelt dann auch dieses Objekt fest!)
    1479       33908 : }
    1480             : 
    1481      222946 : void ScCellRangesBase::ForgetCurrentAttrs()
    1482             : {
    1483      222946 :     delete pCurrentFlat;
    1484      222946 :     delete pCurrentDeep;
    1485      222946 :     delete pCurrentDataSet;
    1486      222946 :     delete pNoDfltCurrentDataSet;
    1487      222946 :     pCurrentFlat = NULL;
    1488      222946 :     pCurrentDeep = NULL;
    1489      222946 :     pCurrentDataSet = NULL;
    1490      222946 :     pNoDfltCurrentDataSet = NULL;
    1491             : 
    1492             :     // #i62483# pMarkData can remain unchanged, is deleted only if the range changes (RefChanged)
    1493      222946 : }
    1494             : 
    1495       40276 : void ScCellRangesBase::ForgetMarkData()
    1496             : {
    1497       40276 :     delete pMarkData;
    1498       40276 :     pMarkData = NULL;
    1499       40276 : }
    1500             : 
    1501        7895 : const ScPatternAttr* ScCellRangesBase::GetCurrentAttrsFlat()
    1502             : {
    1503             :     //  get and cache direct cell attributes for this object's range
    1504             : 
    1505        7895 :     if ( !pCurrentFlat && pDocShell )
    1506             :     {
    1507         171 :         ScDocument& rDoc = pDocShell->GetDocument();
    1508         171 :         pCurrentFlat = rDoc.CreateSelectionPattern( *GetMarkData(), false );
    1509             :     }
    1510        7895 :     return pCurrentFlat;
    1511             : }
    1512             : 
    1513        7718 : const ScPatternAttr* ScCellRangesBase::GetCurrentAttrsDeep()
    1514             : {
    1515             :     //  get and cache cell attributes (incl. styles) for this object's range
    1516             : 
    1517        7718 :     if ( !pCurrentDeep && pDocShell )
    1518             :     {
    1519        7221 :         ScDocument& rDoc = pDocShell->GetDocument();
    1520        7221 :         pCurrentDeep = rDoc.CreateSelectionPattern( *GetMarkData(), true );
    1521             :     }
    1522        7718 :     return pCurrentDeep;
    1523             : }
    1524             : 
    1525        9808 : SfxItemSet* ScCellRangesBase::GetCurrentDataSet(bool bNoDflt)
    1526             : {
    1527        9808 :     if(!pCurrentDataSet)
    1528             :     {
    1529        5662 :         const ScPatternAttr* pPattern = GetCurrentAttrsDeep();
    1530        5662 :         if ( pPattern )
    1531             :         {
    1532             :             //  Dontcare durch Default ersetzen, damit man immer eine Reflection hat
    1533        5662 :             pCurrentDataSet = new SfxItemSet( pPattern->GetItemSet() );
    1534        5662 :             pNoDfltCurrentDataSet = new SfxItemSet( pPattern->GetItemSet() );
    1535        5662 :             pCurrentDataSet->ClearInvalidItems();
    1536             :         }
    1537             :     }
    1538        9808 :     return bNoDflt ? pNoDfltCurrentDataSet : pCurrentDataSet;
    1539             : }
    1540             : 
    1541       11235 : const ScMarkData* ScCellRangesBase::GetMarkData()
    1542             : {
    1543       11235 :     if (!pMarkData)
    1544             :     {
    1545        6767 :         pMarkData = new ScMarkData();
    1546        6767 :         pMarkData->MarkFromRangeList( aRanges, false );
    1547             :     }
    1548       11235 :     return pMarkData;
    1549             : }
    1550             : 
    1551      186441 : void ScCellRangesBase::Notify( SfxBroadcaster&, const SfxHint& rHint )
    1552             : {
    1553      186441 :     uno::Reference<uno::XInterface> const xThis(m_wThis);
    1554      186441 :     if (!xThis.is())
    1555             :     {   // fdo#72695: if UNO object is already dead, don't revive it with event
    1556           0 :         if (dynamic_cast<const SfxSimpleHint*>(&rHint) &&
    1557           0 :             SFX_HINT_DYING == static_cast<const SfxSimpleHint&>(rHint).GetId())
    1558             :         {   // if the document dies, must reset to avoid crash in dtor!
    1559           0 :             ForgetCurrentAttrs();
    1560           0 :             pDocShell = nullptr;
    1561             :         }
    1562      186441 :         return;
    1563             :     }
    1564      186441 :     if ( dynamic_cast<const ScUpdateRefHint*>(&rHint) )
    1565             :     {
    1566        1793 :         const ScUpdateRefHint& rRef = static_cast<const ScUpdateRefHint&>(rHint);
    1567             : 
    1568        1793 :         ScDocument& rDoc = pDocShell->GetDocument();
    1569        1793 :         boost::scoped_ptr<ScRangeList> pUndoRanges;
    1570        1793 :         if ( rDoc.HasUnoRefUndo() )
    1571        1085 :             pUndoRanges.reset(new ScRangeList( aRanges ));
    1572             : 
    1573        3586 :         if ( aRanges.UpdateReference( rRef.GetMode(), &rDoc, rRef.GetRange(),
    1574        3586 :                                     rRef.GetDx(), rRef.GetDy(), rRef.GetDz() ) )
    1575             :         {
    1576        3266 :             if (  rRef.GetMode() == URM_INSDEL
    1577        1632 :                && aRanges.size() == 1
    1578        3231 :                && ScTableSheetObj::getImplementation(xThis)
    1579             :                )
    1580             :             {
    1581             :                 // #101755#; the range size of a sheet does not change
    1582         245 :                 ScRange* pR = aRanges.front();
    1583         245 :                 if (pR)
    1584             :                 {
    1585         245 :                     pR->aStart.SetCol(0);
    1586         245 :                     pR->aStart.SetRow(0);
    1587         245 :                     pR->aEnd.SetCol(MAXCOL);
    1588         245 :                     pR->aEnd.SetRow(MAXROW);
    1589             :                 }
    1590             :             }
    1591        1633 :             RefChanged();
    1592             : 
    1593             :             // any change of the range address is broadcast to value (modify) listeners
    1594        1633 :             if ( !aValueListeners.empty() )
    1595           0 :                 bGotDataChangedHint = true;
    1596             : 
    1597        1633 :             if ( pUndoRanges )
    1598         981 :                 rDoc.AddUnoRefChange( nObjectId, *pUndoRanges );
    1599        1793 :         }
    1600             :     }
    1601      184648 :     else if ( dynamic_cast<const SfxSimpleHint*>(&rHint) )
    1602             :     {
    1603      182951 :         sal_uLong nId = static_cast<const SfxSimpleHint&>(rHint).GetId();
    1604      182951 :         if ( nId == SFX_HINT_DYING )
    1605             :         {
    1606        3745 :             ForgetCurrentAttrs();
    1607        3745 :             pDocShell = NULL;           // invalid
    1608             : 
    1609        3745 :             if ( !aValueListeners.empty() )
    1610             :             {
    1611             :                 //  dispose listeners
    1612             : 
    1613           4 :                 lang::EventObject aEvent;
    1614           4 :                 aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
    1615           8 :                 for ( size_t n=0; n<aValueListeners.size(); n++ )
    1616           4 :                     aValueListeners[n]->disposing( aEvent );
    1617             : 
    1618           4 :                 aValueListeners.clear();
    1619             : 
    1620             :                 //  The listeners can't have the last ref to this, as it's still held
    1621             :                 //  by the DocShell.
    1622             :             }
    1623             :         }
    1624      179206 :         else if ( nId == SFX_HINT_DATACHANGED )
    1625             :         {
    1626             :             // document content changed -> forget cached attributes
    1627      178925 :             ForgetCurrentAttrs();
    1628             : 
    1629      178925 :             if ( bGotDataChangedHint && pDocShell )
    1630             :             {
    1631             :                 //  This object was notified of content changes, so one call
    1632             :                 //  for each listener is generated now.
    1633             :                 //  The calls can't be executed directly because the document's
    1634             :                 //  UNO broadcaster list must not be modified.
    1635             :                 //  Instead, add to the document's list of listener calls,
    1636             :                 //  which will be executed directly after the broadcast of
    1637             :                 //  SFX_HINT_DATACHANGED.
    1638             : 
    1639           0 :                 lang::EventObject aEvent;
    1640           0 :                 aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
    1641             : 
    1642             :                 // the EventObject holds a Ref to this object until after the listener calls
    1643             : 
    1644           0 :                 ScDocument& rDoc = pDocShell->GetDocument();
    1645           0 :                 for ( size_t n=0; n<aValueListeners.size(); n++ )
    1646           0 :                     rDoc.AddUnoListenerCall( aValueListeners[n], aEvent );
    1647             : 
    1648           0 :                 bGotDataChangedHint = false;
    1649             :             }
    1650             :         }
    1651         281 :         else if ( nId == SC_HINT_CALCALL )
    1652             :         {
    1653             :             // broadcast from DoHardRecalc - set bGotDataChangedHint
    1654             :             // (SFX_HINT_DATACHANGED follows separately)
    1655             : 
    1656         281 :             if ( !aValueListeners.empty() )
    1657           0 :                 bGotDataChangedHint = true;
    1658      182951 :         }
    1659             :     }
    1660        1697 :     else if ( dynamic_cast<const ScUnoRefUndoHint*>(&rHint) )
    1661             :     {
    1662           0 :         const ScUnoRefUndoHint& rUndoHint = static_cast<const ScUnoRefUndoHint&>(rHint);
    1663           0 :         if ( rUndoHint.GetObjectId() == nObjectId )
    1664             :         {
    1665             :             // restore ranges from hint
    1666             : 
    1667           0 :             aRanges = rUndoHint.GetRanges();
    1668             : 
    1669           0 :             RefChanged();
    1670           0 :             if ( !aValueListeners.empty() )
    1671           0 :                 bGotDataChangedHint = true;     // need to broadcast the undo, too
    1672             :         }
    1673      186441 :     }
    1674             : }
    1675             : 
    1676        6368 : void ScCellRangesBase::RefChanged()
    1677             : {
    1678             :     //! adjust XChartDataChangeEventListener
    1679             : 
    1680        6368 :     if ( pValueListener && !aValueListeners.empty() )
    1681             :     {
    1682           0 :         pValueListener->EndListeningAll();
    1683             : 
    1684           0 :         ScDocument& rDoc = pDocShell->GetDocument();
    1685           0 :         for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i )
    1686           0 :             rDoc.StartListeningArea( *aRanges[ i ], false, pValueListener );
    1687             :     }
    1688             : 
    1689        6368 :     ForgetCurrentAttrs();
    1690        6368 :     ForgetMarkData();
    1691        6368 : }
    1692             : 
    1693           0 : ScDocument* ScCellRangesBase::GetDocument() const
    1694             : {
    1695           0 :     if (pDocShell)
    1696           0 :         return &pDocShell->GetDocument();
    1697             :     else
    1698           0 :         return NULL;
    1699             : }
    1700             : 
    1701           0 : void ScCellRangesBase::InitInsertRange(ScDocShell* pDocSh, const ScRange& rR)
    1702             : {
    1703           0 :     if ( !pDocShell && pDocSh )
    1704             :     {
    1705           0 :         pDocShell = pDocSh;
    1706             : 
    1707           0 :         ScRange aCellRange(rR);
    1708           0 :         aCellRange.Justify();
    1709           0 :         aRanges.RemoveAll();
    1710           0 :         aRanges.Append( aCellRange );
    1711             : 
    1712           0 :         pDocShell->GetDocument().AddUnoObject(*this);
    1713             : 
    1714           0 :         RefChanged();   // Range im Range-Objekt anpassen
    1715             :     }
    1716           0 : }
    1717             : 
    1718        4107 : void ScCellRangesBase::AddRange(const ScRange& rRange, const bool bMergeRanges)
    1719             : {
    1720        4107 :     if (bMergeRanges)
    1721           0 :         aRanges.Join(rRange);
    1722             :     else
    1723        4107 :         aRanges.Append(rRange);
    1724        4107 :     RefChanged();
    1725        4107 : }
    1726             : 
    1727         582 : void ScCellRangesBase::SetNewRange(const ScRange& rNew)
    1728             : {
    1729         582 :     ScRange aCellRange(rNew);
    1730         582 :     aCellRange.Justify();
    1731             : 
    1732         582 :     aRanges.RemoveAll();
    1733         582 :     aRanges.Append( aCellRange );
    1734         582 :     RefChanged();
    1735         582 : }
    1736             : 
    1737          46 : void ScCellRangesBase::SetNewRanges(const ScRangeList& rNew)
    1738             : {
    1739          46 :     aRanges = rNew;
    1740          46 :     RefChanged();
    1741          46 : }
    1742             : 
    1743         881 : void ScCellRangesBase::SetCursorOnly( bool bSet )
    1744             : {
    1745             :     //  set for a selection object that is created from the cursor position
    1746             :     //  without anything selected (may contain several sheets)
    1747             : 
    1748         881 :     bCursorOnly = bSet;
    1749         881 : }
    1750             : 
    1751      264732 : uno::Any SAL_CALL ScCellRangesBase::queryInterface( const uno::Type& rType )
    1752             :                                                 throw(uno::RuntimeException, std::exception)
    1753             : {
    1754      264732 :     SC_QUERYINTERFACE( beans::XPropertySet )
    1755      249079 :     SC_QUERYINTERFACE( beans::XMultiPropertySet )
    1756      246699 :     SC_QUERYINTERFACE( beans::XTolerantMultiPropertySet )
    1757      245061 :     SC_QUERYINTERFACE( beans::XPropertyState )
    1758      244985 :     SC_QUERYINTERFACE( sheet::XSheetOperation )
    1759      244908 :     SC_QUERYINTERFACE( chart::XChartDataArray )
    1760      244905 :     SC_QUERYINTERFACE( chart::XChartData )
    1761      244904 :     SC_QUERYINTERFACE( util::XIndent )
    1762      244901 :     SC_QUERYINTERFACE( sheet::XCellRangesQuery )
    1763      244821 :     SC_QUERYINTERFACE( sheet::XFormulaQuery )
    1764      244818 :     SC_QUERYINTERFACE( util::XReplaceable )
    1765      244794 :     SC_QUERYINTERFACE( util::XSearchable )
    1766      244782 :     SC_QUERYINTERFACE( util::XModifyBroadcaster )
    1767      244776 :     SC_QUERYINTERFACE( lang::XServiceInfo )
    1768      244744 :     SC_QUERYINTERFACE( lang::XUnoTunnel )
    1769      227227 :     SC_QUERYINTERFACE( lang::XTypeProvider )
    1770             : 
    1771      227219 :     return OWeakObject::queryInterface( rType );
    1772             : }
    1773             : 
    1774      891829 : void SAL_CALL ScCellRangesBase::acquire() throw()
    1775             : {
    1776      891829 :     OWeakObject::acquire();
    1777      891829 : }
    1778             : 
    1779      891717 : void SAL_CALL ScCellRangesBase::release() throw()
    1780             : {
    1781      891717 :     OWeakObject::release();
    1782      891717 : }
    1783             : 
    1784           2 : uno::Sequence<uno::Type> SAL_CALL ScCellRangesBase::getTypes() throw(uno::RuntimeException, std::exception)
    1785             : {
    1786           2 :     static uno::Sequence<uno::Type> aTypes;
    1787           2 :     if ( aTypes.getLength() == 0 )
    1788             :     {
    1789           2 :         aTypes.realloc(13);
    1790           2 :         uno::Type* pPtr = aTypes.getArray();
    1791           2 :         pPtr[0] = cppu::UnoType<beans::XPropertySet>::get();
    1792           2 :         pPtr[1] = cppu::UnoType<beans::XMultiPropertySet>::get();
    1793           2 :         pPtr[2] = cppu::UnoType<beans::XPropertyState>::get();
    1794           2 :         pPtr[3] = cppu::UnoType<sheet::XSheetOperation>::get();
    1795           2 :         pPtr[4] = cppu::UnoType<chart::XChartDataArray>::get();
    1796           2 :         pPtr[5] = cppu::UnoType<util::XIndent>::get();
    1797           2 :         pPtr[6] = cppu::UnoType<sheet::XCellRangesQuery>::get();
    1798           2 :         pPtr[7] = cppu::UnoType<sheet::XFormulaQuery>::get();
    1799           2 :         pPtr[8] = cppu::UnoType<util::XReplaceable>::get();
    1800           2 :         pPtr[9] = cppu::UnoType<util::XModifyBroadcaster>::get();
    1801           2 :         pPtr[10]= cppu::UnoType<lang::XServiceInfo>::get();
    1802           2 :         pPtr[11]= cppu::UnoType<lang::XUnoTunnel>::get();
    1803           2 :         pPtr[12]= cppu::UnoType<lang::XTypeProvider>::get();
    1804             :     }
    1805           2 :     return aTypes;
    1806             : }
    1807             : 
    1808           0 : uno::Sequence<sal_Int8> SAL_CALL ScCellRangesBase::getImplementationId()
    1809             :                                                     throw(uno::RuntimeException, std::exception)
    1810             : {
    1811           0 :     return css::uno::Sequence<sal_Int8>();
    1812             : }
    1813             : 
    1814           8 : void ScCellRangesBase::PaintRanges_Impl( sal_uInt16 nPart )
    1815             : {
    1816          31 :     for (size_t i = 0, nCount = aRanges.size(); i < nCount; ++i)
    1817          23 :         pDocShell->PostPaint( *aRanges[ i ], nPart );
    1818           8 : }
    1819             : 
    1820             : // XSheetOperation
    1821             : 
    1822           4 : double SAL_CALL ScCellRangesBase::computeFunction( sheet::GeneralFunction nFunction )
    1823             :     throw(uno::Exception, uno::RuntimeException, std::exception)
    1824             : {
    1825           4 :     SolarMutexGuard aGuard;
    1826           8 :     ScMarkData aMark(*GetMarkData());
    1827           4 :     aMark.MarkToSimple();
    1828           4 :     if (!aMark.IsMarked())
    1829           2 :         aMark.SetMarkNegative(true);    // um Dummy Position angeben zu koennen
    1830             : 
    1831           4 :     ScAddress aDummy;                   // wenn nicht Marked, ignoriert wegen Negative
    1832             :     double fVal;
    1833           4 :     ScSubTotalFunc eFunc = ScDPUtil::toSubTotalFunc(nFunction);
    1834           4 :     ScDocument& rDoc = pDocShell->GetDocument();
    1835           4 :     if ( !rDoc.GetSelectionFunction( eFunc, aDummy, aMark, fVal ) )
    1836             :     {
    1837           0 :         throw uno::RuntimeException();      //! own exception?
    1838             :     }
    1839             : 
    1840           8 :     return fVal;
    1841             : }
    1842             : 
    1843          77 : void SAL_CALL ScCellRangesBase::clearContents( sal_Int32 nContentFlags ) throw(uno::RuntimeException, std::exception)
    1844             : {
    1845          77 :     SolarMutexGuard aGuard;
    1846          77 :     if ( !aRanges.empty() )
    1847             :     {
    1848             :         // only for clearContents: EDITATTR is only used if no contents are deleted
    1849          77 :         InsertDeleteFlags nDelFlags = InsertDeleteFlags::fromInt(nContentFlags) & IDF_ALL;
    1850          77 :         if ( ( nDelFlags & IDF_EDITATTR ) && ( nDelFlags & IDF_CONTENTS ) == IDF_NONE )
    1851           0 :             nDelFlags |= IDF_EDITATTR;
    1852             : 
    1853          77 :         pDocShell->GetDocFunc().DeleteContents( *GetMarkData(), nDelFlags, true, true );
    1854          77 :     }
    1855             :     // sonst ist nichts zu tun
    1856          77 : }
    1857             : 
    1858             : // XPropertyState
    1859             : 
    1860        2696 : const SfxItemPropertyMap& ScCellRangesBase::GetItemPropertyMap()
    1861             : {
    1862        2696 :     return pPropSet->getPropertyMap();
    1863             : }
    1864             : 
    1865        8545 : static void lcl_GetPropertyWhich( const SfxItemPropertySimpleEntry* pEntry,
    1866             :                                                 sal_uInt16& rItemWhich )
    1867             : {
    1868             :     //  Which-ID des betroffenen Items, auch wenn das Item die Property
    1869             :     //  nicht alleine behandeln kann
    1870        8545 :     if ( pEntry )
    1871             :     {
    1872        8545 :         if ( IsScItemWid( pEntry->nWID ) )
    1873        7609 :             rItemWhich = pEntry->nWID;
    1874             :         else
    1875         936 :             switch ( pEntry->nWID )
    1876             :             {
    1877             :                 case SC_WID_UNO_TBLBORD:
    1878             :                 case SC_WID_UNO_TBLBORD2:
    1879          30 :                     rItemWhich = ATTR_BORDER;
    1880          30 :                     break;
    1881             :                 case SC_WID_UNO_CONDFMT:
    1882             :                 case SC_WID_UNO_CONDLOC:
    1883             :                 case SC_WID_UNO_CONDXML:
    1884         128 :                     rItemWhich = ATTR_CONDITIONAL;
    1885         128 :                     break;
    1886             :                 case SC_WID_UNO_VALIDAT:
    1887             :                 case SC_WID_UNO_VALILOC:
    1888             :                 case SC_WID_UNO_VALIXML:
    1889         128 :                     rItemWhich = ATTR_VALIDDATA;
    1890         128 :                     break;
    1891             :             }
    1892             :     }
    1893             : 
    1894        8545 : }
    1895             : 
    1896        8545 : beans::PropertyState ScCellRangesBase::GetOnePropertyState( sal_uInt16 nItemWhich, const SfxItemPropertySimpleEntry* pEntry )
    1897             : {
    1898        8545 :     beans::PropertyState eRet = beans::PropertyState_DIRECT_VALUE;
    1899        8545 :     if ( nItemWhich )                   // item wid (from map or special case)
    1900             :     {
    1901             :         //  For items that contain several properties (like background),
    1902             :         //  "ambiguous" is returned too often here
    1903             : 
    1904             :         //  for PropertyState, don't look at styles
    1905        7895 :         const ScPatternAttr* pPattern = GetCurrentAttrsFlat();
    1906        7895 :         if ( pPattern )
    1907             :         {
    1908        7895 :             SfxItemState eState = pPattern->GetItemSet().GetItemState( nItemWhich, false );
    1909             : 
    1910        7895 :             if ( nItemWhich == ATTR_VALUE_FORMAT && eState == SfxItemState::DEFAULT )
    1911          76 :                 eState = pPattern->GetItemSet().GetItemState( ATTR_LANGUAGE_FORMAT, false );
    1912             : 
    1913        7895 :             if ( eState == SfxItemState::SET )
    1914        1013 :                 eRet = beans::PropertyState_DIRECT_VALUE;
    1915        6882 :             else if ( eState == SfxItemState::DEFAULT )
    1916        6880 :                 eRet = beans::PropertyState_DEFAULT_VALUE;
    1917           2 :             else if ( eState == SfxItemState::DONTCARE )
    1918           2 :                 eRet = beans::PropertyState_AMBIGUOUS_VALUE;
    1919             :             else
    1920             :             {
    1921             :                 OSL_FAIL("unbekannter ItemState");
    1922             :             }
    1923             :         }
    1924             :     }
    1925         650 :     else if ( pEntry )
    1926             :     {
    1927         650 :         if ( pEntry->nWID == SC_WID_UNO_CHCOLHDR || pEntry->nWID == SC_WID_UNO_CHROWHDR || pEntry->nWID == SC_WID_UNO_ABSNAME )
    1928          45 :             eRet = beans::PropertyState_DIRECT_VALUE;
    1929         605 :         else if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
    1930             :         {
    1931             :             //  a style is always set, there's no default state
    1932          98 :             const ScStyleSheet* pStyle = pDocShell->GetDocument().GetSelectionStyle(*GetMarkData());
    1933          98 :             if (pStyle)
    1934          98 :                 eRet = beans::PropertyState_DIRECT_VALUE;
    1935             :             else
    1936           0 :                 eRet = beans::PropertyState_AMBIGUOUS_VALUE;
    1937             :         }
    1938         507 :         else if ( pEntry->nWID == SC_WID_UNO_NUMRULES )
    1939          15 :             eRet = beans::PropertyState_DEFAULT_VALUE;      // numbering rules are always default
    1940             :     }
    1941        8545 :     return eRet;
    1942             : }
    1943             : 
    1944         344 : beans::PropertyState SAL_CALL ScCellRangesBase::getPropertyState( const OUString& aPropertyName )
    1945             :                                 throw(beans::UnknownPropertyException, uno::RuntimeException, std::exception)
    1946             : {
    1947         344 :     SolarMutexGuard aGuard;
    1948         344 :     if ( aRanges.empty() )
    1949           0 :         throw uno::RuntimeException();
    1950             : 
    1951         344 :     const SfxItemPropertyMap& rMap = GetItemPropertyMap();     // from derived class
    1952         344 :     sal_uInt16 nItemWhich = 0;
    1953         344 :     const SfxItemPropertySimpleEntry* pEntry  = rMap.getByName( aPropertyName );
    1954         344 :     lcl_GetPropertyWhich( pEntry, nItemWhich );
    1955         344 :     return GetOnePropertyState( nItemWhich, pEntry );
    1956             : }
    1957             : 
    1958           0 : uno::Sequence<beans::PropertyState> SAL_CALL ScCellRangesBase::getPropertyStates(
    1959             :                                 const uno::Sequence<OUString>& aPropertyNames )
    1960             :                             throw(beans::UnknownPropertyException, uno::RuntimeException, std::exception)
    1961             : {
    1962           0 :     SolarMutexGuard aGuard;
    1963             : 
    1964           0 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    1965             : 
    1966           0 :     uno::Sequence<beans::PropertyState> aRet(aPropertyNames.getLength());
    1967           0 :     beans::PropertyState* pStates = aRet.getArray();
    1968           0 :     for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++)
    1969             :     {
    1970           0 :         sal_uInt16 nItemWhich = 0;
    1971           0 :         const SfxItemPropertySimpleEntry* pEntry  = rPropertyMap.getByName( aPropertyNames[i] );
    1972           0 :         lcl_GetPropertyWhich( pEntry, nItemWhich );
    1973           0 :         pStates[i] = GetOnePropertyState(nItemWhich, pEntry);
    1974             :     }
    1975           0 :     return aRet;
    1976             : }
    1977             : 
    1978           0 : void SAL_CALL ScCellRangesBase::setPropertyToDefault( const OUString& aPropertyName )
    1979             :                             throw(beans::UnknownPropertyException, uno::RuntimeException, std::exception)
    1980             : {
    1981           0 :     SolarMutexGuard aGuard;
    1982           0 :     if ( pDocShell )
    1983             :     {
    1984           0 :         const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    1985           0 :         sal_uInt16 nItemWhich = 0;
    1986           0 :         const SfxItemPropertySimpleEntry* pEntry  = rPropertyMap.getByName( aPropertyName );
    1987           0 :         lcl_GetPropertyWhich( pEntry, nItemWhich );
    1988           0 :         if ( nItemWhich )               // item wid (from map or special case)
    1989             :         {
    1990           0 :             if ( !aRanges.empty() )     // leer = nichts zu tun
    1991             :             {
    1992             :                 //! Bei Items, die mehrere Properties enthalten (z.B. Hintergrund)
    1993             :                 //! wird hier zuviel zurueckgesetzt
    1994             :                 //! for ATTR_ROTATE_VALUE, also reset ATTR_ORIENTATION?
    1995             : 
    1996             :                 sal_uInt16 aWIDs[3];
    1997           0 :                 aWIDs[0] = nItemWhich;
    1998           0 :                 if ( nItemWhich == ATTR_VALUE_FORMAT )
    1999             :                 {
    2000           0 :                     aWIDs[1] = ATTR_LANGUAGE_FORMAT; // language for number formats
    2001           0 :                     aWIDs[2] = 0;
    2002             :                 }
    2003             :                 else
    2004           0 :                     aWIDs[1] = 0;
    2005           0 :                 pDocShell->GetDocFunc().ClearItems( *GetMarkData(), aWIDs, true );
    2006             :             }
    2007             :         }
    2008           0 :         else if ( pEntry )
    2009             :         {
    2010           0 :             if ( pEntry->nWID == SC_WID_UNO_CHCOLHDR )
    2011           0 :                 bChartColAsHdr = false;
    2012           0 :             else if ( pEntry->nWID == SC_WID_UNO_CHROWHDR )
    2013           0 :                 bChartRowAsHdr = false;
    2014           0 :             else if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
    2015             :             {
    2016           0 :                 OUString aStyleName( ScGlobal::GetRscString( STR_STYLENAME_STANDARD ) );
    2017           0 :                 pDocShell->GetDocFunc().ApplyStyle( *GetMarkData(), aStyleName, true, true );
    2018             :             }
    2019             :         }
    2020           0 :     }
    2021           0 : }
    2022             : 
    2023           0 : uno::Any SAL_CALL ScCellRangesBase::getPropertyDefault( const OUString& aPropertyName )
    2024             :                                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
    2025             :                                         uno::RuntimeException, std::exception)
    2026             : {
    2027             :     //! mit getPropertyValue zusammenfassen
    2028             : 
    2029           0 :     SolarMutexGuard aGuard;
    2030           0 :     uno::Any aAny;
    2031             : 
    2032           0 :     if ( pDocShell )
    2033             :     {
    2034           0 :         ScDocument& rDoc = pDocShell->GetDocument();
    2035           0 :         const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2036           0 :         const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyName );
    2037           0 :         if ( pEntry )
    2038             :         {
    2039           0 :             if ( IsScItemWid( pEntry->nWID ) )
    2040             :             {
    2041           0 :                 const ScPatternAttr* pPattern = rDoc.GetDefPattern();
    2042           0 :                 if ( pPattern )
    2043             :                 {
    2044           0 :                     const SfxItemSet& rSet = pPattern->GetItemSet();
    2045             : 
    2046           0 :                     switch ( pEntry->nWID )     // fuer Item-Spezial-Behandlungen
    2047             :                     {
    2048             :                         case ATTR_VALUE_FORMAT:
    2049             :                             //  default has no language set
    2050           0 :                             aAny <<= (sal_Int32)( static_cast<const SfxUInt32Item&>(rSet.Get(pEntry->nWID)).GetValue() );
    2051           0 :                             break;
    2052             :                         case ATTR_INDENT:
    2053           0 :                             aAny <<= (sal_Int16)( TwipsToHMM(static_cast<const SfxUInt16Item&>(
    2054           0 :                                             rSet.Get(pEntry->nWID)).GetValue()) );
    2055           0 :                             break;
    2056             :                         default:
    2057           0 :                             pPropSet->getPropertyValue(aPropertyName, rSet, aAny);
    2058             :                     }
    2059             :                 }
    2060             :             }
    2061             :             else
    2062           0 :                 switch ( pEntry->nWID )
    2063             :                 {
    2064             :                     case SC_WID_UNO_CHCOLHDR:
    2065             :                     case SC_WID_UNO_CHROWHDR:
    2066           0 :                         ScUnoHelpFunctions::SetBoolInAny( aAny, false );
    2067           0 :                         break;
    2068             :                     case SC_WID_UNO_CELLSTYL:
    2069           0 :                         aAny <<= OUString( ScStyleNameConversion::DisplayToProgrammaticName(
    2070           0 :                                     ScGlobal::GetRscString(STR_STYLENAME_STANDARD), SFX_STYLE_FAMILY_PARA ) );
    2071           0 :                         break;
    2072             :                     case SC_WID_UNO_TBLBORD:
    2073             :                     case SC_WID_UNO_TBLBORD2:
    2074             :                         {
    2075           0 :                             const ScPatternAttr* pPattern = rDoc.GetDefPattern();
    2076           0 :                             if ( pPattern )
    2077             :                             {
    2078           0 :                                 if (pEntry->nWID == SC_WID_UNO_TBLBORD2)
    2079             :                                     ScHelperFunctions::AssignTableBorder2ToAny( aAny,
    2080           0 :                                             static_cast<const SvxBoxItem&>(pPattern->GetItem(ATTR_BORDER)),
    2081           0 :                                             static_cast<const SvxBoxInfoItem&>(pPattern->GetItem(ATTR_BORDER_INNER)) );
    2082             :                                 else
    2083             :                                     ScHelperFunctions::AssignTableBorderToAny( aAny,
    2084           0 :                                             static_cast<const SvxBoxItem&>(pPattern->GetItem(ATTR_BORDER)),
    2085           0 :                                             static_cast<const SvxBoxInfoItem&>(pPattern->GetItem(ATTR_BORDER_INNER)) );
    2086             :                             }
    2087             :                         }
    2088           0 :                         break;
    2089             :                     case SC_WID_UNO_CONDFMT:
    2090             :                     case SC_WID_UNO_CONDLOC:
    2091             :                     case SC_WID_UNO_CONDXML:
    2092             :                         {
    2093           0 :                             bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC );
    2094           0 :                             bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML );
    2095             :                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2096             :                                     rDoc.GetStorageGrammar() :
    2097           0 :                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2098             : 
    2099           0 :                             aAny <<= uno::Reference<sheet::XSheetConditionalEntries>(
    2100           0 :                                     new ScTableConditionalFormat( &rDoc, 0, aRanges[0]->aStart.Tab(), eGrammar ));
    2101             :                         }
    2102           0 :                         break;
    2103             :                     case SC_WID_UNO_VALIDAT:
    2104             :                     case SC_WID_UNO_VALILOC:
    2105             :                     case SC_WID_UNO_VALIXML:
    2106             :                         {
    2107           0 :                             bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC );
    2108           0 :                             bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML );
    2109             :                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2110             :                                     rDoc.GetStorageGrammar() :
    2111           0 :                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2112             : 
    2113           0 :                             aAny <<= uno::Reference<beans::XPropertySet>(
    2114           0 :                                     new ScTableValidationObj( &rDoc, 0, eGrammar ));
    2115             :                         }
    2116           0 :                         break;
    2117             :                     case SC_WID_UNO_NUMRULES:
    2118             :                         {
    2119           0 :                             aAny <<= uno::Reference<container::XIndexReplace>(ScStyleObj::CreateEmptyNumberingRules());
    2120             :                         }
    2121           0 :                         break;
    2122             :                 }
    2123             :         }
    2124             :     }
    2125             : 
    2126           0 :     return aAny;
    2127             : }
    2128             : 
    2129             : // XPropertySet
    2130             : 
    2131         252 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellRangesBase::getPropertySetInfo()
    2132             :                                                         throw(uno::RuntimeException, std::exception)
    2133             : {
    2134         252 :     SolarMutexGuard aGuard;
    2135             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    2136         252 :         new SfxItemPropertySetInfo( pPropSet->getPropertyMap() ));
    2137         252 :     return aRef;
    2138             : }
    2139             : 
    2140       15177 : static void lcl_SetCellProperty( const SfxItemPropertySimpleEntry& rEntry, const uno::Any& rValue,
    2141             :                             ScPatternAttr& rPattern, ScDocument &rDoc,
    2142             :                             sal_uInt16& rFirstItemId, sal_uInt16& rSecondItemId )
    2143             : {
    2144       15177 :     rFirstItemId = rEntry.nWID;
    2145       15177 :     rSecondItemId = 0;
    2146             : 
    2147       15177 :     SfxItemSet& rSet = rPattern.GetItemSet();
    2148       15177 :     switch ( rEntry.nWID )
    2149             :     {
    2150             :         case ATTR_VALUE_FORMAT:
    2151             :             {
    2152             :                 // language for number formats
    2153         435 :                 SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
    2154         435 :                 sal_uLong nOldFormat = static_cast<const SfxUInt32Item&>(rSet.Get( ATTR_VALUE_FORMAT )).GetValue();
    2155         435 :                 LanguageType eOldLang = static_cast<const SvxLanguageItem&>(rSet.Get( ATTR_LANGUAGE_FORMAT )).GetLanguage();
    2156         435 :                 nOldFormat = pFormatter->GetFormatForLanguageIfBuiltIn( nOldFormat, eOldLang );
    2157             : 
    2158         435 :                 sal_Int32 nIntVal = 0;
    2159         435 :                 if ( rValue >>= nIntVal )
    2160             :                 {
    2161         435 :                     sal_uLong nNewFormat = (sal_uLong)nIntVal;
    2162         435 :                     rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) );
    2163             : 
    2164         435 :                     const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewFormat );
    2165             :                     LanguageType eNewLang =
    2166         435 :                         pNewEntry ? pNewEntry->GetLanguage() : LANGUAGE_DONTKNOW;
    2167         435 :                     if ( eNewLang != eOldLang && eNewLang != LANGUAGE_DONTKNOW )
    2168             :                     {
    2169          14 :                         rSet.Put( SvxLanguageItem( eNewLang, ATTR_LANGUAGE_FORMAT ) );
    2170             : 
    2171             :                         // if only language is changed,
    2172             :                         // don't touch number format attribute
    2173          14 :                         sal_uLong nNewMod = nNewFormat % SV_COUNTRY_LANGUAGE_OFFSET;
    2174          14 :                         if ( nNewMod == ( nOldFormat % SV_COUNTRY_LANGUAGE_OFFSET ) &&
    2175             :                              nNewMod <= SV_MAX_ANZ_STANDARD_FORMATE )
    2176             :                         {
    2177           0 :                             rFirstItemId = 0;       // don't use ATTR_VALUE_FORMAT value
    2178             :                         }
    2179             : 
    2180          14 :                         rSecondItemId = ATTR_LANGUAGE_FORMAT;
    2181             :                     }
    2182             :                 }
    2183             :                 else
    2184           0 :                     throw lang::IllegalArgumentException();
    2185             :             }
    2186         435 :             break;
    2187             :         case ATTR_INDENT:
    2188             :             {
    2189         130 :                 sal_Int16 nIntVal = 0;
    2190         130 :                 if ( rValue >>= nIntVal )
    2191         130 :                     rSet.Put( SfxUInt16Item( rEntry.nWID, (sal_uInt16)HMMToTwips(nIntVal) ) );
    2192             :                 else
    2193           0 :                     throw lang::IllegalArgumentException();
    2194             :             }
    2195         130 :             break;
    2196             :         case ATTR_ROTATE_VALUE:
    2197             :             {
    2198          26 :                 sal_Int32 nRotVal = 0;
    2199          26 :                 if ( rValue >>= nRotVal )
    2200             :                 {
    2201             :                     //  stored value is always between 0 and 360 deg.
    2202          26 :                     nRotVal %= 36000;
    2203          26 :                     if ( nRotVal < 0 )
    2204           0 :                         nRotVal += 36000;
    2205             : 
    2206          26 :                     rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, nRotVal ) );
    2207             :                 }
    2208             :                 else
    2209           0 :                     throw lang::IllegalArgumentException();
    2210             :             }
    2211          26 :             break;
    2212             :         case ATTR_STACKED:
    2213             :             {
    2214             :                 table::CellOrientation eOrient;
    2215          29 :                 if( rValue >>= eOrient )
    2216             :                 {
    2217          29 :                     switch( eOrient )
    2218             :                     {
    2219             :                         case table::CellOrientation_STANDARD:
    2220          22 :                             rSet.Put( SfxBoolItem( ATTR_STACKED, false ) );
    2221          22 :                         break;
    2222             :                         case table::CellOrientation_TOPBOTTOM:
    2223           5 :                             rSet.Put( SfxBoolItem( ATTR_STACKED, false ) );
    2224           5 :                             rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 27000 ) );
    2225           5 :                             rSecondItemId = ATTR_ROTATE_VALUE;
    2226           5 :                         break;
    2227             :                         case table::CellOrientation_BOTTOMTOP:
    2228           1 :                             rSet.Put( SfxBoolItem( ATTR_STACKED, false ) );
    2229           1 :                             rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 9000 ) );
    2230           1 :                             rSecondItemId = ATTR_ROTATE_VALUE;
    2231           1 :                         break;
    2232             :                         case table::CellOrientation_STACKED:
    2233           1 :                             rSet.Put( SfxBoolItem( ATTR_STACKED, true ) );
    2234           1 :                         break;
    2235             :                         default:
    2236             :                         {
    2237             :                             // added to avoid warnings
    2238             :                         }
    2239             :                     }
    2240             :                 }
    2241             :             }
    2242          29 :             break;
    2243             :         default:
    2244             :             {
    2245       14557 :                 lcl_GetCellsPropertySet()->setPropertyValue(rEntry, rValue, rSet);
    2246             :             }
    2247             :     }
    2248       15114 : }
    2249             : 
    2250        2287 : void SAL_CALL ScCellRangesBase::setPropertyValue(
    2251             :                         const OUString& aPropertyName, const uno::Any& aValue )
    2252             :                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
    2253             :                         lang::IllegalArgumentException, lang::WrappedTargetException,
    2254             :                         uno::RuntimeException, std::exception)
    2255             : {
    2256        2287 :     SolarMutexGuard aGuard;
    2257             : 
    2258        2287 :     if ( !pDocShell || aRanges.empty() )
    2259           0 :         throw uno::RuntimeException();
    2260             : 
    2261        2287 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2262        2287 :     const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyName );
    2263        2287 :     if ( !pEntry )
    2264           0 :         throw beans::UnknownPropertyException();
    2265             : 
    2266        2308 :     SetOnePropertyValue( pEntry, aValue );
    2267        2266 : }
    2268             : 
    2269        2482 : void ScCellRangesBase::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    2270             :     throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    2271             : {
    2272        2482 :     if ( pEntry )
    2273             :     {
    2274        2482 :         if ( IsScItemWid( pEntry->nWID ) )
    2275             :         {
    2276         842 :             if ( !aRanges.empty() )     // leer = nichts zu tun
    2277             :             {
    2278         842 :                 ScDocument& rDoc = pDocShell->GetDocument();
    2279             : 
    2280             :                 //  Fuer Teile von zusammengesetzten Items mit mehreren Properties (z.B. Hintergrund)
    2281             :                 //  muss vorher das alte Item aus dem Dokument geholt werden
    2282             :                 //! Das kann hier aber nicht erkannt werden
    2283             :                 //! -> eigenes Flag im PropertyMap-Eintrag, oder was ???
    2284             :                 //! Item direkt von einzelner Position im Bereich holen?
    2285             :                 //  ClearInvalidItems, damit auf jeden Fall ein Item vom richtigen Typ da ist
    2286             : 
    2287         842 :                 ScPatternAttr aPattern( *GetCurrentAttrsDeep() );
    2288         842 :                 SfxItemSet& rSet = aPattern.GetItemSet();
    2289         842 :                 rSet.ClearInvalidItems();
    2290             : 
    2291             :                 sal_uInt16 nFirstItem, nSecondItem;
    2292         842 :                 lcl_SetCellProperty( *pEntry, aValue, aPattern, rDoc, nFirstItem, nSecondItem );
    2293             : 
    2294       46797 :                 for (sal_uInt16 nWhich = ATTR_PATTERN_START; nWhich <= ATTR_PATTERN_END; nWhich++)
    2295       45976 :                     if ( nWhich != nFirstItem && nWhich != nSecondItem )
    2296       45144 :                         rSet.ClearItem(nWhich);
    2297             : 
    2298         842 :                 pDocShell->GetDocFunc().ApplyAttributes( *GetMarkData(), aPattern, true, true );
    2299             :             }
    2300             :         }
    2301             :         else        // implemented here
    2302        1640 :             switch ( pEntry->nWID )
    2303             :             {
    2304             :                 case EE_CHAR_ESCAPEMENT:    // Specifically for xlsx import
    2305             :                 {
    2306           1 :                     sal_Int32 nValue = 0;
    2307           1 :                     aValue >>= nValue;
    2308           1 :                     if (nValue)
    2309             :                     {
    2310           0 :                         for (size_t i = 0, n = aRanges.size(); i < n; ++i)
    2311             :                         {
    2312           0 :                             ScRange aRange = *aRanges[i];
    2313             : 
    2314             :                             /* TODO: Iterate through the range */
    2315           0 :                             ScAddress aAddr = aRange.aStart;
    2316           0 :                             ScDocument& rDoc = pDocShell->GetDocument();
    2317           0 :                             ScRefCellValue aCell;
    2318           0 :                             aCell.assign(rDoc, aAddr);
    2319             : 
    2320           0 :                             OUString aStr = aCell.getString(&rDoc);
    2321           0 :                             EditEngine aEngine( rDoc.GetEnginePool() );
    2322           0 :                             aEngine.SetEditTextObjectPool(rDoc.GetEditPool());
    2323             : 
    2324             :                             /* EE_CHAR_ESCAPEMENT seems to be set on the cell _only_ when
    2325             :                              * there are no other attribs for the cell.
    2326             :                              * So, it is safe to overwrite the complete attribute set.
    2327             :                              * If there is a need - getting CellType and processing
    2328             :                              * the attributes could be considered.
    2329             :                              */
    2330           0 :                             SfxItemSet aAttr = aEngine.GetEmptyItemSet();
    2331           0 :                             aEngine.SetText(aStr);
    2332           0 :                             if( nValue < 0 )    // Subscript
    2333           0 :                                 aAttr.Put( SvxEscapementItem( SVX_ESCAPEMENT_SUBSCRIPT, EE_CHAR_ESCAPEMENT ) );
    2334             :                             else                // Superscript
    2335           0 :                                 aAttr.Put( SvxEscapementItem( SVX_ESCAPEMENT_SUPERSCRIPT, EE_CHAR_ESCAPEMENT ) );
    2336           0 :                             aEngine.QuickSetAttribs(aAttr, ESelection(0, 0, 0, aStr.getLength()));
    2337             : 
    2338             :                             // The cell will own the text object instance.
    2339           0 :                             rDoc.SetEditText(aRanges[0]->aStart, aEngine.CreateTextObject());
    2340           0 :                         }
    2341             :                     }
    2342             :                 }
    2343           1 :                 break;
    2344             :                 case SC_WID_UNO_CHCOLHDR:
    2345             :                     // chart header flags are set for this object, not stored with document
    2346           6 :                     bChartColAsHdr = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    2347           6 :                     break;
    2348             :                 case SC_WID_UNO_CHROWHDR:
    2349           6 :                     bChartRowAsHdr = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    2350           6 :                     break;
    2351             :                 case SC_WID_UNO_CELLSTYL:
    2352             :                     {
    2353        1577 :                         OUString aStrVal;
    2354        1577 :                         aValue >>= aStrVal;
    2355             :                         OUString aString(ScStyleNameConversion::ProgrammaticToDisplayName(
    2356        3154 :                                                             aStrVal, SFX_STYLE_FAMILY_PARA ));
    2357        3154 :                         pDocShell->GetDocFunc().ApplyStyle( *GetMarkData(), aString, true, true );
    2358             :                     }
    2359        1577 :                     break;
    2360             :                 case SC_WID_UNO_TBLBORD:
    2361             :                     {
    2362           4 :                         table::TableBorder aBorder;
    2363           4 :                         if ( !aRanges.empty() && ( aValue >>= aBorder ) )   // empty = nothing to do
    2364             :                         {
    2365           4 :                             SvxBoxItem aOuter(ATTR_BORDER);
    2366           8 :                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
    2367           4 :                             ScHelperFunctions::FillBoxItems( aOuter, aInner, aBorder );
    2368             : 
    2369           8 :                             ScHelperFunctions::ApplyBorder( pDocShell, aRanges, aOuter, aInner );   //! docfunc
    2370             :                         }
    2371             :                     }
    2372           4 :                     break;
    2373             :                 case SC_WID_UNO_TBLBORD2:
    2374             :                     {
    2375           2 :                         table::TableBorder2 aBorder2;
    2376           2 :                         if ( !aRanges.empty() && ( aValue >>= aBorder2 ) )   // empty = nothing to do
    2377             :                         {
    2378           0 :                             SvxBoxItem aOuter(ATTR_BORDER);
    2379           0 :                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
    2380           0 :                             ScHelperFunctions::FillBoxItems( aOuter, aInner, aBorder2 );
    2381             : 
    2382           0 :                             ScHelperFunctions::ApplyBorder( pDocShell, aRanges, aOuter, aInner );   //! docfunc
    2383             :                         }
    2384             :                     }
    2385           2 :                     break;
    2386             :                 case SC_WID_UNO_CONDFMT:
    2387             :                 case SC_WID_UNO_CONDLOC:
    2388             :                 case SC_WID_UNO_CONDXML:
    2389             :                     {
    2390          16 :                         uno::Reference<sheet::XSheetConditionalEntries> xInterface(aValue, uno::UNO_QUERY);
    2391          16 :                         if ( !aRanges.empty() && xInterface.is() )  // leer = nichts zu tun
    2392             :                         {
    2393             :                             ScTableConditionalFormat* pFormat =
    2394          10 :                                     ScTableConditionalFormat::getImplementation( xInterface );
    2395          10 :                             if (pFormat)
    2396             :                             {
    2397          10 :                                 ScDocument& rDoc = pDocShell->GetDocument();
    2398          10 :                                 bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC );
    2399          10 :                                 bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML );
    2400             :                                 formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2401             :                                        formula::FormulaGrammar::GRAM_UNSPECIFIED :
    2402          10 :                                        formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2403             : 
    2404          10 :                                 SCTAB nTab = aRanges.front()->aStart.Tab();
    2405             :                                 // To remove conditional formats for all cells in aRanges we need to:
    2406             :                                 // Remove conditional format data from cells' attributes
    2407          10 :                                 rDoc.RemoveCondFormatData( aRanges, nTab,  0 );
    2408             :                                 // And also remove ranges from conditional formats list
    2409          20 :                                 for (size_t i = 0; i < aRanges.size(); ++i)
    2410             :                                 {
    2411          10 :                                     rDoc.GetCondFormList( aRanges[i]->aStart.Tab() )->DeleteArea(
    2412          20 :                                         aRanges[i]->aStart.Col(), aRanges[i]->aStart.Row(),
    2413          40 :                                         aRanges[i]->aEnd.Col(), aRanges[i]->aEnd.Row() );
    2414             :                                 }
    2415             : 
    2416             :                                 // Then we can apply new conditional format if there is one
    2417          10 :                                 if (pFormat->getCount())
    2418             :                                 {
    2419           3 :                                     ScConditionalFormat* pNew = new ScConditionalFormat( 0, &rDoc );    // Index wird beim Einfuegen gesetzt
    2420           3 :                                     pFormat->FillFormat( *pNew, &rDoc, eGrammar );
    2421           3 :                                     pNew->SetRange( aRanges );
    2422           3 :                                     pDocShell->GetDocFunc().ReplaceConditionalFormat( 0, pNew, nTab, aRanges );
    2423             :                                 }
    2424             : 
    2425             :                                 // and repaint
    2426          20 :                                 for (size_t i = 0; i < aRanges.size(); ++i)
    2427          10 :                                     pDocShell->PostPaint(*aRanges[i], PAINT_GRID);
    2428          10 :                                 pDocShell->SetDocumentModified();
    2429             :                             }
    2430          16 :                         }
    2431             :                     }
    2432          16 :                     break;
    2433             :                 case SC_WID_UNO_VALIDAT:
    2434             :                 case SC_WID_UNO_VALILOC:
    2435             :                 case SC_WID_UNO_VALIXML:
    2436             :                     {
    2437          22 :                         uno::Reference<beans::XPropertySet> xInterface(aValue, uno::UNO_QUERY);
    2438          22 :                         if ( !aRanges.empty() && xInterface.is() )  // leer = nichts zu tun
    2439             :                         {
    2440             :                             ScTableValidationObj* pValidObj =
    2441          16 :                                     ScTableValidationObj::getImplementation( xInterface );
    2442          16 :                             if (pValidObj)
    2443             :                             {
    2444          16 :                                 ScDocument& rDoc = pDocShell->GetDocument();
    2445          16 :                                 bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC );
    2446          16 :                                 bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML );
    2447             :                                 formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2448             :                                        formula::FormulaGrammar::GRAM_UNSPECIFIED :
    2449          16 :                                        formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2450             : 
    2451             :                                 boost::scoped_ptr<ScValidationData> pNewData(
    2452          16 :                                         pValidObj->CreateValidationData( &rDoc, eGrammar ));
    2453          16 :                                 sal_uLong nIndex = rDoc.AddValidationEntry( *pNewData );
    2454          16 :                                 pNewData.reset();
    2455             : 
    2456          32 :                                 ScPatternAttr aPattern( rDoc.GetPool() );
    2457          16 :                                 aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALIDDATA, nIndex ) );
    2458          32 :                                 pDocShell->GetDocFunc().ApplyAttributes( *GetMarkData(), aPattern, true, true );
    2459             :                             }
    2460          22 :                         }
    2461             :                     }
    2462          22 :                     break;
    2463             :                 // SC_WID_UNO_NUMRULES is ignored...
    2464             :             }
    2465             :     }
    2466        2461 : }
    2467             : 
    2468       13010 : uno::Any SAL_CALL ScCellRangesBase::getPropertyValue( const OUString& aPropertyName )
    2469             :                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
    2470             :                         uno::RuntimeException, std::exception)
    2471             : {
    2472       13010 :     SolarMutexGuard aGuard;
    2473             : 
    2474       13010 :     if ( !pDocShell || aRanges.empty() )
    2475           0 :         throw uno::RuntimeException();
    2476             : 
    2477       13010 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2478       13010 :     const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyName );
    2479       13010 :     if ( !pEntry )
    2480           4 :         throw beans::UnknownPropertyException();
    2481             : 
    2482       13006 :     uno::Any aAny;
    2483       13006 :     GetOnePropertyValue( pEntry, aAny );
    2484       13010 :     return aAny;
    2485             : }
    2486             : 
    2487       10118 : void ScCellRangesBase::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, uno::Any& rAny )
    2488             :     throw(uno::RuntimeException, std::exception)
    2489             : {
    2490       10118 :     if ( pEntry )
    2491             :     {
    2492       10118 :         if ( IsScItemWid( pEntry->nWID ) )
    2493             :         {
    2494        9736 :             SfxItemSet* pDataSet = GetCurrentDataSet();
    2495        9736 :             if ( pDataSet )
    2496             :             {
    2497        9736 :                 switch ( pEntry->nWID )     // fuer Item-Spezial-Behandlungen
    2498             :                 {
    2499             :                     case ATTR_VALUE_FORMAT:
    2500             :                         {
    2501        7785 :                             ScDocument& rDoc = pDocShell->GetDocument();
    2502             : 
    2503             :                             sal_uLong nOldFormat = static_cast<const SfxUInt32Item&>(
    2504        7785 :                                     pDataSet->Get( ATTR_VALUE_FORMAT )).GetValue();
    2505             :                             LanguageType eOldLang = static_cast<const SvxLanguageItem&>(
    2506        7785 :                                     pDataSet->Get( ATTR_LANGUAGE_FORMAT )).GetLanguage();
    2507             :                             nOldFormat = rDoc.GetFormatTable()->
    2508        7785 :                                     GetFormatForLanguageIfBuiltIn( nOldFormat, eOldLang );
    2509        7785 :                             rAny <<= (sal_Int32)( nOldFormat );
    2510             :                         }
    2511        7785 :                         break;
    2512             :                     case ATTR_INDENT:
    2513          98 :                         rAny <<= (sal_Int16)( TwipsToHMM(static_cast<const SfxUInt16Item&>(
    2514          98 :                                         pDataSet->Get(pEntry->nWID)).GetValue()) );
    2515          49 :                         break;
    2516             :                     case ATTR_STACKED:
    2517             :                         {
    2518          58 :                             sal_Int32 nRot = static_cast<const SfxInt32Item&>(pDataSet->Get(ATTR_ROTATE_VALUE)).GetValue();
    2519          58 :                             bool bStacked = static_cast<const SfxBoolItem&>(pDataSet->Get(pEntry->nWID)).GetValue();
    2520          58 :                             SvxOrientationItem( nRot, bStacked, 0 ).QueryValue( rAny );
    2521             :                         }
    2522          58 :                         break;
    2523             :                     default:
    2524        1844 :                         pPropSet->getPropertyValue(*pEntry, *pDataSet, rAny);
    2525             :                 }
    2526             :             }
    2527             :         }
    2528             :         else        // implemented here
    2529         382 :             switch ( pEntry->nWID )
    2530             :             {
    2531             :                 case SC_WID_UNO_CHCOLHDR:
    2532          22 :                     ScUnoHelpFunctions::SetBoolInAny( rAny, bChartColAsHdr );
    2533          22 :                     break;
    2534             :                 case SC_WID_UNO_CHROWHDR:
    2535          22 :                     ScUnoHelpFunctions::SetBoolInAny( rAny, bChartRowAsHdr );
    2536          22 :                     break;
    2537             :                 case SC_WID_UNO_CELLSTYL:
    2538             :                     {
    2539         102 :                         OUString aStyleName;
    2540         102 :                         const ScStyleSheet* pStyle = pDocShell->GetDocument().GetSelectionStyle(*GetMarkData());
    2541         102 :                         if (pStyle)
    2542         102 :                             aStyleName = pStyle->GetName();
    2543         204 :                         rAny <<= OUString( ScStyleNameConversion::DisplayToProgrammaticName(
    2544         204 :                                                                 aStyleName, SFX_STYLE_FAMILY_PARA ) );
    2545             :                     }
    2546         102 :                     break;
    2547             :                 case SC_WID_UNO_TBLBORD:
    2548             :                 case SC_WID_UNO_TBLBORD2:
    2549             :                     {
    2550             :                         //! loop throgh all ranges
    2551          40 :                         if ( !aRanges.empty() )
    2552             :                         {
    2553          40 :                             const ScRange* pFirst = aRanges[ 0 ];
    2554          40 :                             SvxBoxItem aOuter(ATTR_BORDER);
    2555          80 :                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
    2556             : 
    2557          40 :                             ScDocument& rDoc = pDocShell->GetDocument();
    2558          80 :                             ScMarkData aMark;
    2559          40 :                             aMark.SetMarkArea( *pFirst );
    2560          40 :                             aMark.SelectTable( pFirst->aStart.Tab(), true );
    2561          40 :                             rDoc.GetSelectionFrame( aMark, aOuter, aInner );
    2562             : 
    2563          40 :                             if (pEntry->nWID == SC_WID_UNO_TBLBORD2)
    2564          14 :                                 ScHelperFunctions::AssignTableBorder2ToAny( rAny, aOuter, aInner);
    2565             :                             else
    2566          66 :                                 ScHelperFunctions::AssignTableBorderToAny( rAny, aOuter, aInner);
    2567             :                         }
    2568             :                     }
    2569          40 :                     break;
    2570             :                 case SC_WID_UNO_CONDFMT:
    2571             :                 case SC_WID_UNO_CONDLOC:
    2572             :                 case SC_WID_UNO_CONDXML:
    2573             :                     {
    2574          84 :                         const ScPatternAttr* pPattern = GetCurrentAttrsDeep();
    2575          84 :                         if ( pPattern )
    2576             :                         {
    2577          84 :                             ScDocument& rDoc = pDocShell->GetDocument();
    2578          84 :                             bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC );
    2579          84 :                             bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML );
    2580             :                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2581             :                                     rDoc.GetStorageGrammar() :
    2582          84 :                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2583             :                             const std::vector<sal_uInt32>& rIndex = static_cast<const ScCondFormatItem&>(
    2584          84 :                                     pPattern->GetItem(ATTR_CONDITIONAL)).GetCondFormatData();
    2585          84 :                             sal_uLong nIndex = 0;
    2586          84 :                             if(!rIndex.empty())
    2587          24 :                                 nIndex = rIndex[0];
    2588         168 :                             rAny <<= uno::Reference<sheet::XSheetConditionalEntries>(
    2589         168 :                                     new ScTableConditionalFormat( &rDoc, nIndex, aRanges.front()->aStart.Tab(), eGrammar ));
    2590             :                         }
    2591             :                     }
    2592          84 :                     break;
    2593             :                 case SC_WID_UNO_VALIDAT:
    2594             :                 case SC_WID_UNO_VALILOC:
    2595             :                 case SC_WID_UNO_VALIXML:
    2596             :                     {
    2597          75 :                         const ScPatternAttr* pPattern = GetCurrentAttrsDeep();
    2598          75 :                         if ( pPattern )
    2599             :                         {
    2600          75 :                             ScDocument& rDoc = pDocShell->GetDocument();
    2601          75 :                             bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC );
    2602          75 :                             bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML );
    2603             :                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2604             :                                     rDoc.GetStorageGrammar() :
    2605          75 :                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2606             :                             sal_uLong nIndex = static_cast<const SfxUInt32Item&>(
    2607          75 :                                     pPattern->GetItem(ATTR_VALIDDATA)).GetValue();
    2608         150 :                             rAny <<= uno::Reference<beans::XPropertySet>(
    2609         150 :                                     new ScTableValidationObj( &rDoc, nIndex, eGrammar ));
    2610             :                         }
    2611             :                     }
    2612          75 :                     break;
    2613             :                 case SC_WID_UNO_NUMRULES:
    2614             :                     {
    2615             :                         // always return empty numbering rules object
    2616          14 :                         rAny <<= uno::Reference<container::XIndexReplace>(ScStyleObj::CreateEmptyNumberingRules());
    2617             :                     }
    2618          14 :                     break;
    2619             :                 case SC_WID_UNO_ABSNAME:
    2620             :                     {
    2621          15 :                         OUString sRet;
    2622          15 :                         aRanges.Format(sRet, SCR_ABS_3D, &pDocShell->GetDocument());
    2623          15 :                         rAny <<= sRet;
    2624             :                     }
    2625             :             }
    2626             :     }
    2627       10118 : }
    2628             : 
    2629           0 : void SAL_CALL ScCellRangesBase::addPropertyChangeListener( const OUString& /* aPropertyName */,
    2630             :                             const uno::Reference<beans::XPropertyChangeListener>& /* aListener */)
    2631             :                             throw(beans::UnknownPropertyException,
    2632             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2633             : {
    2634           0 :     SolarMutexGuard aGuard;
    2635           0 :     if ( aRanges.empty() )
    2636           0 :         throw uno::RuntimeException();
    2637             : 
    2638           0 :     OSL_FAIL("not implemented");
    2639           0 : }
    2640             : 
    2641           0 : void SAL_CALL ScCellRangesBase::removePropertyChangeListener( const OUString& /* aPropertyName */,
    2642             :                             const uno::Reference<beans::XPropertyChangeListener>& /* aListener */)
    2643             :                             throw(beans::UnknownPropertyException,
    2644             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2645             : {
    2646           0 :     SolarMutexGuard aGuard;
    2647           0 :     if ( aRanges.empty() )
    2648           0 :         throw uno::RuntimeException();
    2649             : 
    2650           0 :     OSL_FAIL("not implemented");
    2651           0 : }
    2652             : 
    2653           0 : void SAL_CALL ScCellRangesBase::addVetoableChangeListener( const OUString&,
    2654             :                             const uno::Reference<beans::XVetoableChangeListener>&)
    2655             :                             throw(beans::UnknownPropertyException,
    2656             :                                 lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2657             : {
    2658             :     OSL_FAIL("not implemented");
    2659           0 : }
    2660             : 
    2661           0 : void SAL_CALL ScCellRangesBase::removeVetoableChangeListener( const OUString&,
    2662             :                             const uno::Reference<beans::XVetoableChangeListener>&)
    2663             :                             throw(beans::UnknownPropertyException,
    2664             :                                 lang::WrappedTargetException, uno::RuntimeException, std::exception)
    2665             : {
    2666             :     OSL_FAIL("not implemented");
    2667           0 : }
    2668             : 
    2669             : // XMultiPropertySet
    2670             : 
    2671          51 : void SAL_CALL ScCellRangesBase::setPropertyValues( const uno::Sequence< OUString >& aPropertyNames,
    2672             :                                     const uno::Sequence< uno::Any >& aValues )
    2673             :                                 throw (beans::PropertyVetoException,
    2674             :                                     lang::IllegalArgumentException,
    2675             :                                     lang::WrappedTargetException,
    2676             :                                     uno::RuntimeException, std::exception)
    2677             : {
    2678          51 :     SolarMutexGuard aGuard;
    2679             : 
    2680          51 :     sal_Int32 nCount(aPropertyNames.getLength());
    2681          51 :     sal_Int32 nValues(aValues.getLength());
    2682          51 :     if (nCount != nValues)
    2683           0 :         throw lang::IllegalArgumentException();
    2684             : 
    2685          51 :     if ( pDocShell && nCount )
    2686             :     {
    2687          51 :         const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();      // from derived class
    2688          51 :         const OUString* pNames = aPropertyNames.getConstArray();
    2689          51 :         const uno::Any* pValues = aValues.getConstArray();
    2690             : 
    2691          51 :         boost::scoped_array<const SfxItemPropertySimpleEntry*> pEntryArray(new const SfxItemPropertySimpleEntry*[nCount]);
    2692             : 
    2693             :         sal_Int32 i;
    2694         664 :         for(i = 0; i < nCount; i++)
    2695             :         {
    2696             :             // first loop: find all properties in map, but handle only CellStyle
    2697             :             // (CellStyle must be set before any other cell properties)
    2698             : 
    2699         613 :             const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( pNames[i] );
    2700         613 :             pEntryArray[i] = pEntry;
    2701         613 :             if (pEntry)
    2702             :             {
    2703         613 :                 if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
    2704             :                 {
    2705             :                     try
    2706             :                     {
    2707          50 :                         SetOnePropertyValue( pEntry, pValues[i] );
    2708             :                     }
    2709           0 :                     catch ( lang::IllegalArgumentException& )
    2710             :                     {
    2711             :                         OSL_FAIL("exception when setting cell style");     // not supposed to happen
    2712             :                     }
    2713             :                 }
    2714             :             }
    2715             :         }
    2716             : 
    2717          51 :         ScDocument& rDoc = pDocShell->GetDocument();
    2718         102 :         boost::scoped_ptr<ScPatternAttr> pOldPattern;
    2719         102 :         boost::scoped_ptr<ScPatternAttr> pNewPattern;
    2720             : 
    2721         534 :         for(i = 0; i < nCount; i++)
    2722             :         {
    2723             :             // second loop: handle other properties
    2724             : 
    2725         503 :             const SfxItemPropertySimpleEntry* pEntry = pEntryArray[i];
    2726         503 :             if ( pEntry )
    2727             :             {
    2728         503 :                 if ( IsScItemWid( pEntry->nWID ) )  // can be handled by SfxItemPropertySet
    2729             :                 {
    2730         453 :                     if ( !pOldPattern )
    2731             :                     {
    2732          51 :                         pOldPattern.reset(new ScPatternAttr( *GetCurrentAttrsDeep() ));
    2733          51 :                         pOldPattern->GetItemSet().ClearInvalidItems();
    2734          51 :                         pNewPattern.reset(new ScPatternAttr( rDoc.GetPool() ));
    2735             :                     }
    2736             : 
    2737             :                     //  collect items in pNewPattern, apply with one call after the loop
    2738             : 
    2739             :                     sal_uInt16 nFirstItem, nSecondItem;
    2740         453 :                     lcl_SetCellProperty( *pEntry, pValues[i], *pOldPattern, rDoc, nFirstItem, nSecondItem );
    2741             : 
    2742             :                     //  put only affected items into new set
    2743         433 :                     if ( nFirstItem )
    2744         433 :                         pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nFirstItem ) );
    2745         433 :                     if ( nSecondItem )
    2746           0 :                         pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nSecondItem ) );
    2747             :                 }
    2748          50 :                 else if ( pEntry->nWID != SC_WID_UNO_CELLSTYL )   // CellStyle is handled above
    2749             :                 {
    2750             :                     //  call virtual method to set a single property
    2751           0 :                     SetOnePropertyValue( pEntry, pValues[i] );
    2752             :                 }
    2753             :             }
    2754             :         }
    2755             : 
    2756          31 :         if ( pNewPattern && !aRanges.empty() )
    2757          82 :             pDocShell->GetDocFunc().ApplyAttributes( *GetMarkData(), *pNewPattern, true, true );
    2758          51 :     }
    2759          31 : }
    2760             : 
    2761           0 : uno::Sequence<uno::Any> SAL_CALL ScCellRangesBase::getPropertyValues(
    2762             :                                 const uno::Sequence< OUString >& aPropertyNames )
    2763             :                                     throw (uno::RuntimeException, std::exception)
    2764             : {
    2765           0 :     SolarMutexGuard aGuard;
    2766             : 
    2767           0 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2768             : 
    2769           0 :     uno::Sequence<uno::Any> aRet(aPropertyNames.getLength());
    2770           0 :     uno::Any* pProperties = aRet.getArray();
    2771           0 :     for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++)
    2772             :     {
    2773           0 :         const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyNames[i] );
    2774           0 :         GetOnePropertyValue( pEntry, pProperties[i] );
    2775             :     }
    2776           0 :     return aRet;
    2777             : }
    2778             : 
    2779           0 : void SAL_CALL ScCellRangesBase::addPropertiesChangeListener( const uno::Sequence< OUString >& /* aPropertyNames */,
    2780             :                                     const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ )
    2781             :                                 throw (uno::RuntimeException, std::exception)
    2782             : {
    2783             :     OSL_FAIL("not implemented");
    2784           0 : }
    2785             : 
    2786           0 : void SAL_CALL ScCellRangesBase::removePropertiesChangeListener( const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ )
    2787             :                                 throw (uno::RuntimeException, std::exception)
    2788             : {
    2789             :     OSL_FAIL("not implemented");
    2790           0 : }
    2791             : 
    2792           0 : void SAL_CALL ScCellRangesBase::firePropertiesChangeEvent( const uno::Sequence< OUString >& /* aPropertyNames */,
    2793             :                                     const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ )
    2794             :                                 throw (uno::RuntimeException, std::exception)
    2795             : {
    2796             :     OSL_FAIL("not implemented");
    2797           0 : }
    2798             : 
    2799           8 : IMPL_LINK( ScCellRangesBase, ValueListenerHdl, SfxHint*, pHint )
    2800             : {
    2801           8 :     if ( pDocShell && pHint && dynamic_cast<const SfxSimpleHint*>(pHint) &&
    2802           4 :             (static_cast<const SfxSimpleHint*>(pHint)->GetId() & SC_HINT_DATACHANGED))
    2803             :     {
    2804             :         //  This may be called several times for a single change, if several formulas
    2805             :         //  in the range are notified. So only a flag is set that is checked when
    2806             :         //  SFX_HINT_DATACHANGED is received.
    2807             : 
    2808           0 :         bGotDataChangedHint = true;
    2809             :     }
    2810           4 :     return 0;
    2811             : }
    2812             : 
    2813             : // XTolerantMultiPropertySet
    2814        1420 : uno::Sequence< beans::SetPropertyTolerantFailed > SAL_CALL ScCellRangesBase::setPropertyValuesTolerant( const uno::Sequence< OUString >& aPropertyNames,
    2815             :                                     const uno::Sequence< uno::Any >& aValues )
    2816             :                                     throw (lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    2817             : {
    2818        1420 :     SolarMutexGuard aGuard;
    2819             : 
    2820        1420 :     sal_Int32 nCount(aPropertyNames.getLength());
    2821        1420 :     sal_Int32 nValues(aValues.getLength());
    2822        1420 :     if (nCount != nValues)
    2823           0 :         throw lang::IllegalArgumentException();
    2824             : 
    2825        1420 :     if ( pDocShell && nCount )
    2826             :     {
    2827        1420 :         uno::Sequence < beans::SetPropertyTolerantFailed > aReturns(nCount);
    2828        1420 :         beans::SetPropertyTolerantFailed* pReturns = aReturns.getArray();
    2829             : 
    2830        1420 :         const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2831        1420 :         const OUString* pNames = aPropertyNames.getConstArray();
    2832        1420 :         const uno::Any* pValues = aValues.getConstArray();
    2833             : 
    2834        2840 :         boost::scoped_array<const SfxItemPropertySimpleEntry*> pMapArray(new const SfxItemPropertySimpleEntry*[nCount]);
    2835             : 
    2836             :         sal_Int32 i;
    2837       17428 :         for(i = 0; i < nCount; i++)
    2838             :         {
    2839             :             // first loop: find all properties in map, but handle only CellStyle
    2840             :             // (CellStyle must be set before any other cell properties)
    2841             : 
    2842       16008 :             const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( pNames[i] );
    2843       16008 :             pMapArray[i] = pEntry;
    2844       16008 :             if (pEntry)
    2845             :             {
    2846       15948 :                 if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
    2847             :                 {
    2848             :                     try
    2849             :                     {
    2850        1089 :                         SetOnePropertyValue( pEntry, pValues[i] );
    2851             :                     }
    2852           0 :                     catch ( lang::IllegalArgumentException& )
    2853             :                     {
    2854             :                         OSL_FAIL("exception when setting cell style");     // not supposed to happen
    2855             :                     }
    2856             :                 }
    2857             :             }
    2858             :         }
    2859             : 
    2860        1420 :         ScDocument& rDoc = pDocShell->GetDocument();
    2861        2840 :         boost::scoped_ptr<ScPatternAttr> pOldPattern;
    2862        2840 :         boost::scoped_ptr<ScPatternAttr> pNewPattern;
    2863             : 
    2864        1420 :         sal_Int32 nFailed(0);
    2865       17428 :         for(i = 0; i < nCount; i++)
    2866             :         {
    2867             :             // second loop: handle other properties
    2868             : 
    2869       16008 :             const SfxItemPropertySimpleEntry* pEntry = pMapArray[i];
    2870       16008 :             if ( pEntry && ((pEntry->nFlags & beans::PropertyAttribute::READONLY) == 0))
    2871             :             {
    2872       15941 :                 if ( IsScItemWid( pEntry->nWID ) )  // can be handled by SfxItemPropertySet
    2873             :                 {
    2874       13882 :                     if ( !pOldPattern )
    2875             :                     {
    2876        1004 :                         pOldPattern.reset(new ScPatternAttr( *GetCurrentAttrsDeep() ));
    2877        1004 :                         pOldPattern->GetItemSet().ClearInvalidItems();
    2878        1004 :                         pNewPattern.reset(new ScPatternAttr( rDoc.GetPool() ));
    2879             :                     }
    2880             : 
    2881             :                     //  collect items in pNewPattern, apply with one call after the loop
    2882             : 
    2883             :                     sal_uInt16 nFirstItem, nSecondItem;
    2884             :                     try
    2885             :                     {
    2886       13882 :                         lcl_SetCellProperty( *pEntry, pValues[i], *pOldPattern, rDoc, nFirstItem, nSecondItem );
    2887             : 
    2888             :                         //  put only affected items into new set
    2889       13860 :                         if ( nFirstItem )
    2890       13860 :                             pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nFirstItem ) );
    2891       13860 :                         if ( nSecondItem )
    2892           9 :                             pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nSecondItem ) );
    2893             :                     }
    2894          44 :                     catch ( lang::IllegalArgumentException& )
    2895             :                     {
    2896          22 :                         pReturns[nFailed].Name = pNames[i];
    2897          22 :                         pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::ILLEGAL_ARGUMENT;
    2898             :                     }
    2899             :                 }
    2900        2059 :                 else if ( pEntry->nWID != SC_WID_UNO_CELLSTYL )   // CellStyle is handled above
    2901             :                 {
    2902             :                     //  call virtual method to set a single property
    2903             :                     try
    2904             :                     {
    2905         970 :                         SetOnePropertyValue( pEntry, pValues[i] );
    2906             :                     }
    2907           0 :                     catch ( lang::IllegalArgumentException& )
    2908             :                     {
    2909           0 :                         pReturns[nFailed].Name = pNames[i];
    2910           0 :                         pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::ILLEGAL_ARGUMENT;
    2911             :                     }
    2912       15941 :                 }
    2913             :             }
    2914             :             else
    2915             :             {
    2916          67 :                 pReturns[nFailed].Name = pNames[i];
    2917          67 :                 if (pEntry)
    2918           7 :                     pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::PROPERTY_VETO;
    2919             :                 else
    2920          60 :                     pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
    2921             :             }
    2922             :         }
    2923             : 
    2924        1420 :         if ( pNewPattern && !aRanges.empty() )
    2925        1004 :             pDocShell->GetDocFunc().ApplyAttributes( *GetMarkData(), *pNewPattern, true, true );
    2926             : 
    2927        1420 :         aReturns.realloc(nFailed);
    2928             : 
    2929        2840 :         return aReturns;
    2930             :     }
    2931           0 :     return uno::Sequence < beans::SetPropertyTolerantFailed >();
    2932             : }
    2933             : 
    2934          11 : uno::Sequence< beans::GetPropertyTolerantResult > SAL_CALL ScCellRangesBase::getPropertyValuesTolerant( const uno::Sequence< OUString >& aPropertyNames )
    2935             :                                     throw (uno::RuntimeException, std::exception)
    2936             : {
    2937          11 :     SolarMutexGuard aGuard;
    2938             : 
    2939          11 :     sal_Int32 nCount(aPropertyNames.getLength());
    2940          11 :     uno::Sequence < beans::GetPropertyTolerantResult > aReturns(nCount);
    2941          11 :     beans::GetPropertyTolerantResult* pReturns = aReturns.getArray();
    2942             : 
    2943          11 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2944             : 
    2945        1102 :     for(sal_Int32 i = 0; i < nCount; i++)
    2946             :     {
    2947        1091 :         const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyNames[i] );
    2948        1091 :         if (!pEntry)
    2949             :         {
    2950           0 :             pReturns[i].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
    2951             :         }
    2952             :         else
    2953             :         {
    2954        1091 :             sal_uInt16 nItemWhich = 0;
    2955        1091 :             lcl_GetPropertyWhich( pEntry, nItemWhich );
    2956        1091 :             pReturns[i].State = GetOnePropertyState( nItemWhich, pEntry );
    2957        1091 :             GetOnePropertyValue( pEntry, pReturns[i].Value );
    2958        1091 :             pReturns[i].Result = beans::TolerantPropertySetResultType::SUCCESS;
    2959             :         }
    2960             :     }
    2961          11 :     return aReturns;
    2962             : }
    2963             : 
    2964         220 : uno::Sequence< beans::GetDirectPropertyTolerantResult > SAL_CALL ScCellRangesBase::getDirectPropertyValuesTolerant( const uno::Sequence< OUString >& aPropertyNames )
    2965             :                                     throw (uno::RuntimeException, std::exception)
    2966             : {
    2967         220 :     SolarMutexGuard aGuard;
    2968             : 
    2969         220 :     sal_Int32 nCount(aPropertyNames.getLength());
    2970         220 :     uno::Sequence < beans::GetDirectPropertyTolerantResult > aReturns(nCount);
    2971         220 :     beans::GetDirectPropertyTolerantResult* pReturns = aReturns.getArray();
    2972             : 
    2973         220 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2974             : 
    2975         220 :     sal_Int32 j = 0;
    2976        7330 :     for(sal_Int32 i = 0; i < nCount; i++)
    2977             :     {
    2978        7110 :         const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyNames[i] );
    2979        7110 :         if (!pEntry)
    2980             :         {
    2981           0 :             pReturns[i].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
    2982             :         }
    2983             :         else
    2984             :         {
    2985        7110 :             sal_uInt16 nItemWhich = 0;
    2986        7110 :             lcl_GetPropertyWhich( pEntry, nItemWhich );
    2987        7110 :             pReturns[j].State = GetOnePropertyState( nItemWhich, pEntry );
    2988        7110 :             if (pReturns[j].State == beans::PropertyState_DIRECT_VALUE)
    2989             :             {
    2990         620 :                 GetOnePropertyValue( pEntry, pReturns[j].Value );
    2991         620 :                 pReturns[j].Result = beans::TolerantPropertySetResultType::SUCCESS;
    2992         620 :                 pReturns[j].Name = aPropertyNames[i];
    2993         620 :                 ++j;
    2994             :             }
    2995             :         }
    2996             :     }
    2997         220 :     if (j < nCount)
    2998          85 :         aReturns.realloc(j);
    2999         220 :     return aReturns;
    3000             : }
    3001             : 
    3002             : // XIndent
    3003             : 
    3004           3 : void SAL_CALL ScCellRangesBase::decrementIndent() throw(::com::sun::star::uno::RuntimeException, std::exception)
    3005             : {
    3006           3 :     SolarMutexGuard aGuard;
    3007           3 :     if ( pDocShell && !aRanges.empty() )        // leer = nichts zu tun
    3008             :     {
    3009             :         //#97041#; put only MultiMarked ScMarkData in ChangeIndent
    3010           3 :         ScMarkData aMarkData(*GetMarkData());
    3011           3 :         aMarkData.MarkToMulti();
    3012           3 :         pDocShell->GetDocFunc().ChangeIndent( aMarkData, false, true );
    3013           3 :     }
    3014           3 : }
    3015             : 
    3016           3 : void SAL_CALL ScCellRangesBase::incrementIndent() throw(::com::sun::star::uno::RuntimeException, std::exception)
    3017             : {
    3018           3 :     SolarMutexGuard aGuard;
    3019           3 :     if ( pDocShell && !aRanges.empty() )        // leer = nichts zu tun
    3020             :     {
    3021             :         //#97041#; put only MultiMarked ScMarkData in ChangeIndent
    3022           3 :         ScMarkData aMarkData(*GetMarkData());
    3023           3 :         aMarkData.MarkToMulti();
    3024           3 :         pDocShell->GetDocFunc().ChangeIndent( aMarkData, true, true );
    3025           3 :     }
    3026           3 : }
    3027             : 
    3028             : // XChartData
    3029             : 
    3030          18 : ScMemChart* ScCellRangesBase::CreateMemChart_Impl() const
    3031             : {
    3032          18 :     if ( pDocShell && !aRanges.empty() )
    3033             :     {
    3034          18 :         ScRangeListRef xChartRanges;
    3035          18 :         if ( aRanges.size() == 1 )
    3036             :         {
    3037             :             //  ganze Tabelle sinnvoll begrenzen (auf belegten Datenbereich)
    3038             :             //  (nur hier, Listener werden auf den ganzen Bereich angemeldet)
    3039             :             //! direkt testen, ob es ein ScTableSheetObj ist?
    3040             : 
    3041           8 :             const ScRange* pRange = aRanges[0];
    3042          24 :             if ( pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL &&
    3043           8 :                  pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW )
    3044             :             {
    3045           0 :                 SCTAB nTab = pRange->aStart.Tab();
    3046             : 
    3047             :                 SCCOL nStartX;
    3048             :                 SCROW nStartY; // Anfang holen
    3049           0 :                 if (!pDocShell->GetDocument().GetDataStart( nTab, nStartX, nStartY ))
    3050             :                 {
    3051           0 :                     nStartX = 0;
    3052           0 :                     nStartY = 0;
    3053             :                 }
    3054             : 
    3055             :                 SCCOL nEndX;
    3056             :                 SCROW nEndY; // Ende holen
    3057           0 :                 if (!pDocShell->GetDocument().GetTableArea( nTab, nEndX, nEndY ))
    3058             :                 {
    3059           0 :                     nEndX = 0;
    3060           0 :                     nEndY = 0;
    3061             :                 }
    3062             : 
    3063           0 :                 xChartRanges = new ScRangeList;
    3064           0 :                 xChartRanges->Append( ScRange( nStartX, nStartY, nTab, nEndX, nEndY, nTab ) );
    3065             :             }
    3066             :         }
    3067          18 :         if (!xChartRanges.Is())         //  sonst Ranges direkt uebernehmen
    3068          18 :             xChartRanges = new ScRangeList(aRanges);
    3069          36 :         ScChartArray aArr( &pDocShell->GetDocument(), xChartRanges, OUString() );
    3070             : 
    3071             :         // RowAsHdr = ColHeaders und umgekehrt
    3072          18 :         aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );
    3073             : 
    3074          36 :         return aArr.CreateMemChart();
    3075             :     }
    3076           0 :     return NULL;
    3077             : }
    3078             : 
    3079           6 : uno::Sequence< uno::Sequence<double> > SAL_CALL ScCellRangesBase::getData()
    3080             :     throw(uno::RuntimeException, std::exception)
    3081             : {
    3082           6 :     SolarMutexGuard aGuard;
    3083          12 :     boost::scoped_ptr<ScMemChart> pMemChart(CreateMemChart_Impl());
    3084           6 :     if ( pMemChart )
    3085             :     {
    3086           6 :         sal_Int32 nColCount = pMemChart->GetColCount();
    3087           6 :         sal_Int32 nRowCount = static_cast<sal_Int32>(pMemChart->GetRowCount());
    3088             : 
    3089           6 :         uno::Sequence< uno::Sequence<double> > aRowSeq( nRowCount );
    3090           6 :         uno::Sequence<double>* pRowAry = aRowSeq.getArray();
    3091          60 :         for (sal_Int32 nRow = 0; nRow < nRowCount; nRow++)
    3092             :         {
    3093          54 :             uno::Sequence<double> aColSeq( nColCount );
    3094          54 :             double* pColAry = aColSeq.getArray();
    3095         148 :             for (sal_Int32 nCol = 0; nCol < nColCount; nCol++)
    3096          94 :                 pColAry[nCol] = pMemChart->GetData( nCol, nRow );
    3097             : 
    3098          54 :             pRowAry[nRow] = aColSeq;
    3099          54 :         }
    3100             : 
    3101           6 :         return aRowSeq;
    3102             :     }
    3103             : 
    3104           6 :     return uno::Sequence< uno::Sequence<double> >(0);
    3105             : }
    3106             : 
    3107           8 : ScRangeListRef ScCellRangesBase::GetLimitedChartRanges_Impl( long nDataColumns, long nDataRows ) const
    3108             : {
    3109           8 :     if ( aRanges.size() == 1 )
    3110             :     {
    3111           3 :         const ScRange* pRange = aRanges[0];
    3112           9 :         if ( pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL &&
    3113           3 :              pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW )
    3114             :         {
    3115             :             //  if aRanges is a complete sheet, limit to given size
    3116             : 
    3117           0 :             SCTAB nTab = pRange->aStart.Tab();
    3118             : 
    3119           0 :             long nEndColumn = nDataColumns - 1 + ( bChartColAsHdr ? 1 : 0 );
    3120           0 :             if ( nEndColumn < 0 )
    3121           0 :                 nEndColumn = 0;
    3122           0 :             if ( nEndColumn > MAXCOL )
    3123           0 :                 nEndColumn = MAXCOL;
    3124             : 
    3125           0 :             long nEndRow = nDataRows - 1 + ( bChartRowAsHdr ? 1 : 0 );
    3126           0 :             if ( nEndRow < 0 )
    3127           0 :                 nEndRow = 0;
    3128           0 :             if ( nEndRow > MAXROW )
    3129           0 :                 nEndRow = MAXROW;
    3130             : 
    3131           0 :             ScRangeListRef xChartRanges = new ScRangeList;
    3132           0 :             xChartRanges->Append( ScRange( 0, 0, nTab, (SCCOL)nEndColumn, (SCROW)nEndRow, nTab ) );
    3133           0 :             return xChartRanges;
    3134             :         }
    3135             :     }
    3136             : 
    3137           8 :     return new ScRangeList(aRanges);        // as-is
    3138             : }
    3139             : 
    3140           4 : void SAL_CALL ScCellRangesBase::setData( const uno::Sequence< uno::Sequence<double> >& aData )
    3141             :                                                 throw(uno::RuntimeException, std::exception)
    3142             : {
    3143           4 :     SolarMutexGuard aGuard;
    3144           4 :     bool bDone = false;
    3145           4 :     long nRowCount = aData.getLength();
    3146           4 :     long nColCount = nRowCount ? aData[0].getLength() : 0;
    3147           8 :     ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( nColCount, nRowCount );
    3148           4 :     if ( pDocShell && xChartRanges.Is() )
    3149             :     {
    3150           4 :         ScDocument& rDoc = pDocShell->GetDocument();
    3151           4 :         ScChartArray aArr( &rDoc, xChartRanges, OUString() );
    3152           4 :         aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );      // RowAsHdr = ColHeaders
    3153           4 :         const ScChartPositionMap* pPosMap = aArr.GetPositionMap();
    3154           4 :         if (pPosMap)
    3155             :         {
    3156           8 :             if ( pPosMap->GetColCount() == static_cast<SCCOL>(nColCount) &&
    3157           4 :                  pPosMap->GetRowCount() == static_cast<SCROW>(nRowCount) )
    3158             :             {
    3159          43 :                 for (long nRow=0; nRow<nRowCount; nRow++)
    3160             :                 {
    3161          39 :                     const uno::Sequence<double>& rRowSeq = aData[nRow];
    3162          39 :                     const double* pArray = rRowSeq.getConstArray();
    3163          39 :                     nColCount = rRowSeq.getLength();
    3164         110 :                     for (long nCol=0; nCol<nColCount; nCol++)
    3165             :                     {
    3166             :                         const ScAddress* pPos = pPosMap->GetPosition(
    3167          71 :                                 sal::static_int_cast<SCCOL>(nCol),
    3168         142 :                                 sal::static_int_cast<SCROW>(nRow) );
    3169          71 :                         if (pPos)
    3170             :                         {
    3171          71 :                             double fVal = pArray[nCol];
    3172          71 :                             if ( fVal == DBL_MIN )
    3173          38 :                                 rDoc.SetEmptyCell(*pPos);
    3174             :                             else
    3175          33 :                                 rDoc.SetValue(*pPos, pArray[nCol]);
    3176             :                         }
    3177             :                     }
    3178             :                 }
    3179             : 
    3180             :                 //! undo
    3181           4 :                 PaintRanges_Impl( PAINT_GRID );
    3182           4 :                 pDocShell->SetDocumentModified();
    3183           4 :                 ForceChartListener_Impl();          // call listeners for this object synchronously
    3184           4 :                 bDone = true;
    3185             :             }
    3186           4 :         }
    3187             :     }
    3188             : 
    3189           4 :     if (!bDone)
    3190           4 :         throw uno::RuntimeException();
    3191           4 : }
    3192             : 
    3193           6 : uno::Sequence<OUString> SAL_CALL ScCellRangesBase::getRowDescriptions()
    3194             :     throw(uno::RuntimeException, std::exception)
    3195             : {
    3196           6 :     SolarMutexGuard aGuard;
    3197          12 :     boost::scoped_ptr<ScMemChart> pMemChart(CreateMemChart_Impl());
    3198           6 :     if ( pMemChart )
    3199             :     {
    3200           6 :         sal_Int32 nRowCount = static_cast<sal_Int32>(pMemChart->GetRowCount());
    3201           6 :         uno::Sequence<OUString> aSeq( nRowCount );
    3202           6 :         OUString* pAry = aSeq.getArray();
    3203          51 :         for (sal_Int32 nRow = 0; nRow < nRowCount; nRow++)
    3204          45 :             pAry[nRow] = pMemChart->GetRowText(nRow);
    3205             : 
    3206           6 :         return aSeq;
    3207             :     }
    3208           6 :     return uno::Sequence<OUString>(0);
    3209             : }
    3210             : 
    3211           2 : void SAL_CALL ScCellRangesBase::setRowDescriptions(
    3212             :                         const uno::Sequence<OUString>& aRowDescriptions )
    3213             :                                                 throw(uno::RuntimeException, std::exception)
    3214             : {
    3215           2 :     SolarMutexGuard aGuard;
    3216           2 :     bool bDone = false;
    3217           2 :     if ( bChartColAsHdr )
    3218             :     {
    3219           2 :         long nRowCount = aRowDescriptions.getLength();
    3220           2 :         ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( 1, nRowCount );
    3221           2 :         if ( pDocShell && xChartRanges.Is() )
    3222             :         {
    3223           2 :             ScDocument& rDoc = pDocShell->GetDocument();
    3224           2 :             ScChartArray aArr( &rDoc, xChartRanges, OUString() );
    3225           2 :             aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );      // RowAsHdr = ColHeaders
    3226           2 :             const ScChartPositionMap* pPosMap = aArr.GetPositionMap();
    3227           2 :             if (pPosMap)
    3228             :             {
    3229           2 :                 if ( pPosMap->GetRowCount() == static_cast<SCROW>(nRowCount) )
    3230             :                 {
    3231           2 :                     const OUString* pArray = aRowDescriptions.getConstArray();
    3232          17 :                     for (long nRow=0; nRow<nRowCount; nRow++)
    3233             :                     {
    3234             :                         const ScAddress* pPos = pPosMap->GetRowHeaderPosition(
    3235          15 :                                 static_cast<SCSIZE>(nRow) );
    3236          15 :                         if (pPos)
    3237             :                         {
    3238          15 :                             const OUString& aStr = pArray[nRow];
    3239          15 :                             if (aStr.isEmpty())
    3240           0 :                                 rDoc.SetEmptyCell(*pPos);
    3241             :                             else
    3242             :                             {
    3243          15 :                                 ScSetStringParam aParam;
    3244          15 :                                 aParam.setTextInput();
    3245          15 :                                 rDoc.SetString(*pPos, aStr, &aParam);
    3246             :                             }
    3247             :                         }
    3248             :                     }
    3249             : 
    3250             :                     //! undo
    3251           2 :                     PaintRanges_Impl( PAINT_GRID );
    3252           2 :                     pDocShell->SetDocumentModified();
    3253           2 :                     ForceChartListener_Impl();          // call listeners for this object synchronously
    3254           2 :                     bDone = true;
    3255             :                 }
    3256           2 :             }
    3257           2 :         }
    3258             :     }
    3259             : 
    3260           2 :     if (!bDone)
    3261           0 :         throw uno::RuntimeException();
    3262           2 : }
    3263             : 
    3264           6 : uno::Sequence<OUString> SAL_CALL ScCellRangesBase::getColumnDescriptions()
    3265             :     throw(uno::RuntimeException, std::exception)
    3266             : {
    3267           6 :     SolarMutexGuard aGuard;
    3268          12 :     boost::scoped_ptr<ScMemChart> pMemChart(CreateMemChart_Impl());
    3269           6 :     if ( pMemChart )
    3270             :     {
    3271           6 :         sal_Int32 nColCount = pMemChart->GetColCount();
    3272           6 :         uno::Sequence<OUString> aSeq( nColCount );
    3273           6 :         OUString* pAry = aSeq.getArray();
    3274          18 :         for (sal_Int32 nCol = 0; nCol < nColCount; nCol++)
    3275          12 :             pAry[nCol] = pMemChart->GetColText(nCol);
    3276             : 
    3277           6 :         return aSeq;
    3278             :     }
    3279           6 :     return uno::Sequence<OUString>(0);
    3280             : }
    3281             : 
    3282           2 : void SAL_CALL ScCellRangesBase::setColumnDescriptions(
    3283             :     const uno::Sequence<OUString>& aColumnDescriptions )
    3284             :         throw(uno::RuntimeException, std::exception)
    3285             : {
    3286           2 :     SolarMutexGuard aGuard;
    3287           2 :     bool bDone = false;
    3288           2 :     if ( bChartRowAsHdr )
    3289             :     {
    3290           2 :         long nColCount = aColumnDescriptions.getLength();
    3291           2 :         ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( nColCount, 1 );
    3292           2 :         if ( pDocShell && xChartRanges.Is() )
    3293             :         {
    3294           2 :             ScDocument& rDoc = pDocShell->GetDocument();
    3295           2 :             ScChartArray aArr( &rDoc, xChartRanges, OUString() );
    3296           2 :             aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );      // RowAsHdr = ColHeaders
    3297           2 :             const ScChartPositionMap* pPosMap = aArr.GetPositionMap();
    3298           2 :             if (pPosMap)
    3299             :             {
    3300           2 :                 if ( pPosMap->GetColCount() == static_cast<SCCOL>(nColCount) )
    3301             :                 {
    3302           2 :                     const OUString* pArray = aColumnDescriptions.getConstArray();
    3303           6 :                     for (long nCol=0; nCol<nColCount; nCol++)
    3304             :                     {
    3305             :                         const ScAddress* pPos = pPosMap->GetColHeaderPosition(
    3306           4 :                             sal::static_int_cast<SCCOL>(nCol) );
    3307           4 :                         if (pPos)
    3308             :                         {
    3309           4 :                             const OUString& aStr = pArray[nCol];
    3310           4 :                             if (aStr.isEmpty())
    3311           0 :                                 rDoc.SetEmptyCell(*pPos);
    3312             :                             else
    3313             :                             {
    3314           4 :                                 ScSetStringParam aParam;
    3315           4 :                                 aParam.setTextInput();
    3316           4 :                                 rDoc.SetString(*pPos, aStr, &aParam);
    3317             :                             }
    3318             :                         }
    3319             :                     }
    3320             : 
    3321             :                     //! undo
    3322           2 :                     PaintRanges_Impl( PAINT_GRID );
    3323           2 :                     pDocShell->SetDocumentModified();
    3324           2 :                     ForceChartListener_Impl();          // call listeners for this object synchronously
    3325           2 :                     bDone = true;
    3326             :                 }
    3327           2 :             }
    3328           2 :         }
    3329             :     }
    3330             : 
    3331           2 :     if (!bDone)
    3332           0 :         throw uno::RuntimeException();
    3333           2 : }
    3334             : 
    3335           8 : void ScCellRangesBase::ForceChartListener_Impl()
    3336             : {
    3337             :     //  call Update immediately so the caller to setData etc. can
    3338             :     //  regognize the listener call
    3339             : 
    3340           8 :     if (!pDocShell)
    3341           0 :         return;
    3342             : 
    3343           8 :     ScChartListenerCollection* pColl = pDocShell->GetDocument().GetChartListenerCollection();
    3344           8 :     if (!pColl)
    3345           0 :         return;
    3346             : 
    3347           8 :     ScChartListenerCollection::ListenersType& rListeners = pColl->getListeners();
    3348           8 :     ScChartListenerCollection::ListenersType::iterator it = rListeners.begin(), itEnd = rListeners.end();
    3349          11 :     for (; it != itEnd; ++it)
    3350             :     {
    3351           3 :         ScChartListener* p = it->second;
    3352             :         OSL_ASSERT(p);
    3353           3 :         if (p->GetUnoSource() == static_cast<chart::XChartData*>(this) && p->IsDirty())
    3354           3 :             p->Update();
    3355             :     }
    3356             : }
    3357             : 
    3358           2 : void SAL_CALL ScCellRangesBase::addChartDataChangeEventListener( const uno::Reference<
    3359             :                                     chart::XChartDataChangeEventListener >& aListener )
    3360             :                                 throw(uno::RuntimeException, std::exception)
    3361             : {
    3362           2 :     SolarMutexGuard aGuard;
    3363           2 :     if ( pDocShell && !aRanges.empty() )
    3364             :     {
    3365             :         //! auf doppelte testen?
    3366             : 
    3367           2 :         ScDocument& rDoc = pDocShell->GetDocument();
    3368           2 :         ScRangeListRef aRangesRef( new ScRangeList(aRanges) );
    3369           2 :         ScChartListenerCollection* pColl = rDoc.GetChartListenerCollection();
    3370           4 :         OUString aName = pColl->getUniqueName(OUString("__Uno"));
    3371           2 :         if (aName.isEmpty())
    3372             :             // failed to create unique name.
    3373           2 :             return;
    3374             : 
    3375           2 :         ScChartListener* pListener = new ScChartListener( aName, &rDoc, aRangesRef );
    3376           2 :         pListener->SetUno( aListener, this );
    3377           2 :         pColl->insert( pListener );
    3378           4 :         pListener->StartListeningTo();
    3379           2 :     }
    3380             : }
    3381             : 
    3382           2 : void SAL_CALL ScCellRangesBase::removeChartDataChangeEventListener( const uno::Reference<
    3383             :                                     chart::XChartDataChangeEventListener >& aListener )
    3384             :     throw (uno::RuntimeException, std::exception)
    3385             : {
    3386           2 :     SolarMutexGuard aGuard;
    3387           2 :     if ( pDocShell && !aRanges.empty() )
    3388             :     {
    3389           2 :         ScDocument& rDoc = pDocShell->GetDocument();
    3390           2 :         ScChartListenerCollection* pColl = rDoc.GetChartListenerCollection();
    3391           2 :         pColl->FreeUno( aListener, this );
    3392           2 :     }
    3393           2 : }
    3394             : 
    3395           1 : double SAL_CALL ScCellRangesBase::getNotANumber() throw(::com::sun::star::uno::RuntimeException, std::exception)
    3396             : {
    3397             :     //  im ScChartArray wird DBL_MIN verwendet, weil das Chart es so will
    3398           1 :     return DBL_MIN;
    3399             : }
    3400             : 
    3401           2 : sal_Bool SAL_CALL ScCellRangesBase::isNotANumber( double nNumber ) throw(uno::RuntimeException, std::exception)
    3402             : {
    3403             :     //  im ScChartArray wird DBL_MIN verwendet, weil das Chart es so will
    3404           2 :     return (nNumber == DBL_MIN);
    3405             : }
    3406             : 
    3407             : // XModifyBroadcaster
    3408             : 
    3409           6 : void SAL_CALL ScCellRangesBase::addModifyListener(const uno::Reference<util::XModifyListener>& aListener)
    3410             :     throw (uno::RuntimeException, std::exception)
    3411             : {
    3412           6 :     SolarMutexGuard aGuard;
    3413           6 :     if ( aRanges.empty() )
    3414           0 :         throw uno::RuntimeException();
    3415             : 
    3416             :     uno::Reference<util::XModifyListener> *pObj =
    3417           6 :             new uno::Reference<util::XModifyListener>( aListener );
    3418           6 :     aValueListeners.push_back( pObj );
    3419             : 
    3420           6 :     if ( aValueListeners.size() == 1 )
    3421             :     {
    3422           6 :         if (!pValueListener)
    3423           6 :             pValueListener = new ScLinkListener( LINK( this, ScCellRangesBase, ValueListenerHdl ) );
    3424             : 
    3425           6 :         ScDocument& rDoc = pDocShell->GetDocument();
    3426          12 :         for ( size_t i = 0, nCount = aRanges.size(); i < nCount; i++)
    3427           6 :             rDoc.StartListeningArea( *aRanges[ i ], false, pValueListener );
    3428             : 
    3429           6 :         acquire();  // don't lose this object (one ref for all listeners)
    3430           6 :     }
    3431           6 : }
    3432             : 
    3433           2 : void SAL_CALL ScCellRangesBase::removeModifyListener( const uno::Reference<util::XModifyListener>& aListener )
    3434             :                                 throw(uno::RuntimeException, std::exception)
    3435             : {
    3436             : 
    3437           2 :     SolarMutexGuard aGuard;
    3438           2 :     if ( aRanges.empty() )
    3439           0 :         throw uno::RuntimeException();
    3440             : 
    3441           2 :     acquire();      // in case the listeners have the last ref - released below
    3442             : 
    3443           2 :     sal_uInt16 nCount = aValueListeners.size();
    3444           4 :     for ( sal_uInt16 n=nCount; n--; )
    3445             :     {
    3446           2 :         uno::Reference<util::XModifyListener>& rObj = aValueListeners[n];
    3447           2 :         if ( rObj == aListener )
    3448             :         {
    3449           2 :             aValueListeners.erase( aValueListeners.begin() + n );
    3450             : 
    3451           2 :             if ( aValueListeners.empty() )
    3452             :             {
    3453           2 :                 if (pValueListener)
    3454           2 :                     pValueListener->EndListeningAll();
    3455             : 
    3456           2 :                 release();      // release the ref for the listeners
    3457             :             }
    3458             : 
    3459           2 :             break;
    3460             :         }
    3461             :     }
    3462             : 
    3463           2 :     release();      // might delete this object
    3464           2 : }
    3465             : 
    3466             : // XCellRangesQuery
    3467             : 
    3468          25 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryVisibleCells()
    3469             :     throw(uno::RuntimeException, std::exception)
    3470             : {
    3471          25 :     SolarMutexGuard aGuard;
    3472          25 :     if (pDocShell)
    3473             :     {
    3474             :         //! fuer alle Tabellen getrennt, wenn Markierungen pro Tabelle getrennt sind!
    3475          25 :         SCTAB nTab = lcl_FirstTab(aRanges);
    3476             : 
    3477          25 :         ScMarkData aMarkData(*GetMarkData());
    3478             : 
    3479          25 :         ScDocument& rDoc = pDocShell->GetDocument();
    3480          25 :         SCCOL nCol = 0, nLastCol;
    3481         107 :         while (nCol <= MAXCOL)
    3482             :         {
    3483          57 :             if (rDoc.ColHidden(nCol, nTab, NULL, &nLastCol))
    3484             :                 // hidden columns.  Unselect them.
    3485          18 :                 aMarkData.SetMultiMarkArea(ScRange(nCol, 0, nTab, nLastCol, MAXROW, nTab), false);
    3486             : 
    3487          57 :             nCol = nLastCol + 1;
    3488             :         }
    3489             : 
    3490          25 :         SCROW nRow = 0, nLastRow;
    3491         104 :         while (nRow <= MAXROW)
    3492             :         {
    3493          54 :             if (rDoc.RowHidden(nRow, nTab, NULL, &nLastRow))
    3494             :                 // These rows are hidden.  Unselect them.
    3495          15 :                 aMarkData.SetMultiMarkArea(ScRange(0, nRow, nTab, MAXCOL, nLastRow, nTab), false);
    3496             : 
    3497          54 :             nRow = nLastRow + 1;
    3498             :         }
    3499             : 
    3500          50 :         ScRangeList aNewRanges;
    3501          25 :         aMarkData.FillRangeListWithMarks( &aNewRanges, false );
    3502          50 :         return new ScCellRangesObj( pDocShell, aNewRanges );
    3503             :     }
    3504             : 
    3505           0 :     return NULL;
    3506             : }
    3507             : 
    3508           3 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryEmptyCells()
    3509             :     throw(uno::RuntimeException, std::exception)
    3510             : {
    3511           3 :     SolarMutexGuard aGuard;
    3512           3 :     if (pDocShell)
    3513             :     {
    3514           3 :         ScDocument& rDoc = pDocShell->GetDocument();
    3515             : 
    3516           3 :         ScMarkData aMarkData(*GetMarkData());
    3517             : 
    3518             :         //  belegte Zellen wegmarkieren
    3519           9 :         for (size_t i = 0, nCount = aRanges.size(); i < nCount; ++i)
    3520             :         {
    3521           6 :             ScRange aRange = *aRanges[ i ];
    3522             : 
    3523           6 :             ScCellIterator aIter( &rDoc, aRange );
    3524          35 :             for (bool bHasCell = aIter.first(); bHasCell; bHasCell = aIter.next())
    3525             :             {
    3526             :                 //  Notizen zaehlen als nicht-leer
    3527          29 :                 if (!aIter.isEmpty())
    3528          29 :                     aMarkData.SetMultiMarkArea(aIter.GetPos(), false);
    3529             :             }
    3530           6 :         }
    3531             : 
    3532           6 :         ScRangeList aNewRanges;
    3533             :         //  IsMultiMarked reicht hier nicht (wird beim deselektieren nicht zurueckgesetzt)
    3534             :         //if (aMarkData.HasAnyMultiMarks()) // #i20044# should be set for all empty range
    3535           3 :         aMarkData.FillRangeListWithMarks( &aNewRanges, false );
    3536             : 
    3537           6 :         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
    3538             :     }
    3539             : 
    3540           0 :     return NULL;
    3541             : }
    3542             : 
    3543          27 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryContentCells(
    3544             :     sal_Int16 nContentFlags )
    3545             :         throw(uno::RuntimeException, std::exception)
    3546             : {
    3547          27 :     SolarMutexGuard aGuard;
    3548          27 :     if (pDocShell)
    3549             :     {
    3550          27 :         ScDocument& rDoc = pDocShell->GetDocument();
    3551             : 
    3552          27 :         ScMarkData aMarkData;
    3553             : 
    3554             :         //  passende Zellen selektieren
    3555          57 :         for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i )
    3556             :         {
    3557          30 :             ScRange aRange = *aRanges[ i ];
    3558             : 
    3559          30 :             ScCellIterator aIter( &rDoc, aRange );
    3560          64 :             for (bool bHasCell = aIter.first(); bHasCell; bHasCell = aIter.next())
    3561             :             {
    3562          34 :                 bool bAdd = false;
    3563          34 :                 switch (aIter.getType())
    3564             :                 {
    3565             :                     case CELLTYPE_STRING:
    3566          22 :                         if ( nContentFlags & sheet::CellFlags::STRING )
    3567           2 :                             bAdd = true;
    3568          22 :                         break;
    3569             :                     case CELLTYPE_EDIT:
    3570           0 :                         if ( (nContentFlags & sheet::CellFlags::STRING) || (nContentFlags & sheet::CellFlags::FORMATTED) )
    3571           0 :                             bAdd = true;
    3572           0 :                         break;
    3573             :                     case CELLTYPE_FORMULA:
    3574           2 :                         if ( nContentFlags & sheet::CellFlags::FORMULA )
    3575           0 :                             bAdd = true;
    3576           2 :                         break;
    3577             :                     case CELLTYPE_VALUE:
    3578          10 :                         if ( (nContentFlags & (sheet::CellFlags::VALUE|sheet::CellFlags::DATETIME))
    3579             :                                 == (sheet::CellFlags::VALUE|sheet::CellFlags::DATETIME) )
    3580           0 :                             bAdd = true;
    3581             :                         else
    3582             :                         {
    3583             :                             //  Date/Time Erkennung
    3584             : 
    3585             :                             sal_uLong nIndex = (sal_uLong)static_cast<const SfxUInt32Item*>(rDoc.GetAttr(
    3586          10 :                                         aIter.GetPos(), ATTR_VALUE_FORMAT))->GetValue();
    3587          10 :                             short nTyp = rDoc.GetFormatTable()->GetType(nIndex);
    3588          10 :                             if ((nTyp == css::util::NumberFormat::DATE) || (nTyp == css::util::NumberFormat::TIME) ||
    3589             :                                     (nTyp == css::util::NumberFormat::DATETIME))
    3590             :                             {
    3591           0 :                                 if ( nContentFlags & sheet::CellFlags::DATETIME )
    3592           0 :                                     bAdd = true;
    3593             :                             }
    3594             :                             else
    3595             :                             {
    3596          10 :                                 if ( nContentFlags & sheet::CellFlags::VALUE )
    3597           6 :                                     bAdd = true;
    3598             :                             }
    3599             :                         }
    3600          10 :                         break;
    3601             :                     default:
    3602             :                         {
    3603             :                             // added to avoid warnings
    3604             :                         }
    3605             :                 }
    3606             : 
    3607          34 :                 if (bAdd)
    3608           8 :                     aMarkData.SetMultiMarkArea(aIter.GetPos(), true);
    3609             :             }
    3610             : 
    3611          30 :         }
    3612             : 
    3613          27 :         ScRangeList aNewRanges;
    3614          27 :         if (aMarkData.IsMultiMarked())
    3615           3 :             aMarkData.FillRangeListWithMarks( &aNewRanges, false );
    3616             : 
    3617          27 :         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
    3618             :     }
    3619             : 
    3620           0 :     return NULL;
    3621             : }
    3622             : 
    3623          49 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryFormulaCells(
    3624             :     sal_Int32 nResultFlags )
    3625             :         throw(uno::RuntimeException, std::exception)
    3626             : {
    3627          49 :     SolarMutexGuard aGuard;
    3628          49 :     if (pDocShell)
    3629             :     {
    3630          49 :         ScDocument& rDoc = pDocShell->GetDocument();
    3631             : 
    3632          49 :         ScMarkData aMarkData;
    3633             : 
    3634             :         //  passende Zellen selektieren
    3635         101 :         for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i )
    3636             :         {
    3637          52 :             ScRange aRange = *aRanges[ i ];
    3638             : 
    3639          52 :             ScCellIterator aIter( &rDoc, aRange );
    3640         472 :             for (bool bHasCell = aIter.first(); bHasCell; bHasCell = aIter.next())
    3641             :             {
    3642         420 :                 if (aIter.getType() == CELLTYPE_FORMULA)
    3643             :                 {
    3644         180 :                     ScFormulaCell* pFCell = aIter.getFormulaCell();
    3645         180 :                     bool bAdd = false;
    3646         180 :                     if (pFCell->GetErrCode())
    3647             :                     {
    3648           0 :                         if ( nResultFlags & sheet::FormulaResult::ERROR )
    3649           0 :                             bAdd = true;
    3650             :                     }
    3651         180 :                     else if (pFCell->IsValue())
    3652             :                     {
    3653         180 :                         if ( nResultFlags & sheet::FormulaResult::VALUE )
    3654         180 :                             bAdd = true;
    3655             :                     }
    3656             :                     else    // String
    3657             :                     {
    3658           0 :                         if ( nResultFlags & sheet::FormulaResult::STRING )
    3659           0 :                             bAdd = true;
    3660             :                     }
    3661             : 
    3662         180 :                     if (bAdd)
    3663         180 :                         aMarkData.SetMultiMarkArea(aIter.GetPos(), true);
    3664             :                 }
    3665             :             }
    3666          52 :         }
    3667             : 
    3668          98 :         ScRangeList aNewRanges;
    3669          49 :         if (aMarkData.IsMultiMarked())
    3670          10 :             aMarkData.FillRangeListWithMarks( &aNewRanges, false );
    3671             : 
    3672          98 :         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
    3673             :     }
    3674             : 
    3675           0 :     return NULL;
    3676             : }
    3677             : 
    3678           8 : uno::Reference<sheet::XSheetCellRanges> ScCellRangesBase::QueryDifferences_Impl(
    3679             :                         const table::CellAddress& aCompare, bool bColumnDiff)
    3680             : {
    3681           8 :     if (pDocShell)
    3682             :     {
    3683           8 :         size_t nRangeCount = aRanges.size();
    3684             :         size_t i;
    3685           8 :         ScDocument& rDoc = pDocShell->GetDocument();
    3686           8 :         ScMarkData aMarkData;
    3687             : 
    3688           8 :         SCCOLROW nCmpPos = bColumnDiff ? (SCCOLROW)aCompare.Row : (SCCOLROW)aCompare.Column;
    3689             : 
    3690             :         //  zuerst alles selektieren, wo ueberhaupt etwas in der Vergleichsspalte steht
    3691             :         //  (fuer gleiche Zellen wird die Selektion im zweiten Schritt aufgehoben)
    3692             : 
    3693           8 :         SCTAB nTab = lcl_FirstTab(aRanges); //! fuer alle Tabellen, wenn Markierungen pro Tabelle!
    3694           8 :         ScRange aCmpRange, aCellRange;
    3695           8 :         if (bColumnDiff)
    3696           4 :             aCmpRange = ScRange( 0,nCmpPos,nTab, MAXCOL,nCmpPos,nTab );
    3697             :         else
    3698           4 :             aCmpRange = ScRange( static_cast<SCCOL>(nCmpPos),0,nTab, static_cast<SCCOL>(nCmpPos),MAXROW,nTab );
    3699          16 :         ScCellIterator aCmpIter( &rDoc, aCmpRange );
    3700          41 :         for (bool bHasCell = aCmpIter.first(); bHasCell; bHasCell = aCmpIter.next())
    3701             :         {
    3702          33 :             SCCOLROW nCellPos = bColumnDiff ? static_cast<SCCOLROW>(aCmpIter.GetPos().Col()) : static_cast<SCCOLROW>(aCmpIter.GetPos().Row());
    3703          33 :             if (bColumnDiff)
    3704          32 :                 aCellRange = ScRange( static_cast<SCCOL>(nCellPos),0,nTab,
    3705          16 :                         static_cast<SCCOL>(nCellPos),MAXROW,nTab );
    3706             :             else
    3707          17 :                 aCellRange = ScRange( 0,nCellPos,nTab, MAXCOL,nCellPos,nTab );
    3708             : 
    3709         126 :             for (i=0; i<nRangeCount; i++)
    3710             :             {
    3711          93 :                 ScRange aRange( *aRanges[ i ] );
    3712          93 :                 if ( aRange.Intersects( aCellRange ) )
    3713             :                 {
    3714          29 :                     if (bColumnDiff)
    3715             :                     {
    3716          12 :                         aRange.aStart.SetCol(static_cast<SCCOL>(nCellPos));
    3717          12 :                         aRange.aEnd.SetCol(static_cast<SCCOL>(nCellPos));
    3718             :                     }
    3719             :                     else
    3720             :                     {
    3721          17 :                         aRange.aStart.SetRow(nCellPos);
    3722          17 :                         aRange.aEnd.SetRow(nCellPos);
    3723             :                     }
    3724          29 :                     aMarkData.SetMultiMarkArea( aRange );
    3725             :                 }
    3726             :             }
    3727             :         }
    3728             : 
    3729             :         //  alle nichtleeren Zellen mit der Vergleichsspalte vergleichen und entsprechend
    3730             :         //  selektieren oder aufheben
    3731             : 
    3732           8 :         ScAddress aCmpAddr;
    3733          22 :         for (i=0; i<nRangeCount; i++)
    3734             :         {
    3735          14 :             ScRange aRange( *aRanges[ i ] );
    3736             : 
    3737          14 :             ScCellIterator aIter( &rDoc, aRange );
    3738          72 :             for (bool bHasCell = aIter.first(); bHasCell; bHasCell = aIter.next())
    3739             :             {
    3740          58 :                 if (bColumnDiff)
    3741          29 :                     aCmpAddr = ScAddress( aIter.GetPos().Col(), nCmpPos, aIter.GetPos().Tab() );
    3742             :                 else
    3743          29 :                     aCmpAddr = ScAddress( static_cast<SCCOL>(nCmpPos), aIter.GetPos().Row(), aIter.GetPos().Tab() );
    3744             : 
    3745          58 :                 ScRange aOneRange(aIter.GetPos());
    3746          58 :                 if (!aIter.equalsWithoutFormat(aCmpAddr))
    3747          13 :                     aMarkData.SetMultiMarkArea( aOneRange );
    3748             :                 else
    3749          45 :                     aMarkData.SetMultiMarkArea( aOneRange, false );     // deselect
    3750             :             }
    3751          14 :         }
    3752             : 
    3753          16 :         ScRangeList aNewRanges;
    3754           8 :         if (aMarkData.IsMultiMarked())
    3755           8 :             aMarkData.FillRangeListWithMarks( &aNewRanges, false );
    3756             : 
    3757          16 :         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
    3758             :     }
    3759           0 :     return NULL;
    3760             : }
    3761             : 
    3762           4 : uno::Reference<sheet::XSheetCellRanges > SAL_CALL ScCellRangesBase::queryColumnDifferences(
    3763             :     const table::CellAddress& aCompare ) throw(uno::RuntimeException, std::exception)
    3764             : {
    3765           4 :     SolarMutexGuard aGuard;
    3766           4 :     return QueryDifferences_Impl( aCompare, true );
    3767             : }
    3768             : 
    3769           4 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryRowDifferences(
    3770             :     const table::CellAddress& aCompare ) throw(uno::RuntimeException, std::exception)
    3771             : {
    3772           4 :     SolarMutexGuard aGuard;
    3773           4 :     return QueryDifferences_Impl( aCompare, false );
    3774             : }
    3775             : 
    3776          25 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryIntersection(
    3777             :                             const table::CellRangeAddress& aRange ) throw(uno::RuntimeException, std::exception)
    3778             : {
    3779          25 :     SolarMutexGuard aGuard;
    3780             :     ScRange aMask( (SCCOL)aRange.StartColumn, (SCROW)aRange.StartRow, aRange.Sheet,
    3781          25 :                    (SCCOL)aRange.EndColumn,   (SCROW)aRange.EndRow,   aRange.Sheet );
    3782             : 
    3783          50 :     ScRangeList aNew;
    3784          53 :     for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i )
    3785             :     {
    3786          28 :         ScRange aTemp( *aRanges[ i ] );
    3787          28 :         if ( aTemp.Intersects( aMask ) )
    3788          52 :             aNew.Join( ScRange( std::max( aTemp.aStart.Col(), aMask.aStart.Col() ),
    3789          52 :                                 std::max( aTemp.aStart.Row(), aMask.aStart.Row() ),
    3790          52 :                                 std::max( aTemp.aStart.Tab(), aMask.aStart.Tab() ),
    3791          52 :                                 std::min( aTemp.aEnd.Col(), aMask.aEnd.Col() ),
    3792          52 :                                 std::min( aTemp.aEnd.Row(), aMask.aEnd.Row() ),
    3793         182 :                                 std::min( aTemp.aEnd.Tab(), aMask.aEnd.Tab() ) ) );
    3794             :     }
    3795             : 
    3796          50 :     return new ScCellRangesObj( pDocShell, aNew );  // kann leer sein
    3797             : }
    3798             : 
    3799             : // XFormulaQuery
    3800             : 
    3801           3 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryPrecedents(
    3802             :     sal_Bool bRecursive ) throw(uno::RuntimeException, std::exception)
    3803             : {
    3804           3 :     SolarMutexGuard aGuard;
    3805           3 :     if ( pDocShell )
    3806             :     {
    3807           3 :         ScDocument& rDoc = pDocShell->GetDocument();
    3808             : 
    3809           3 :         ScRangeList aNewRanges(aRanges);
    3810             :         bool bFound;
    3811           3 :         do
    3812             :         {
    3813           3 :             bFound = false;
    3814             : 
    3815             :             //  aMarkData uses aNewRanges, not aRanges, so GetMarkData can't be used
    3816           3 :             ScMarkData aMarkData;
    3817           3 :             aMarkData.MarkFromRangeList( aNewRanges, false );
    3818           3 :             aMarkData.MarkToMulti();        // needed for IsAllMarked
    3819             : 
    3820           9 :             for (size_t nR = 0, nCount = aNewRanges.size(); nR<nCount; ++nR)
    3821             :             {
    3822           6 :                 ScRange aRange( *aNewRanges[ nR] );
    3823           6 :                 ScCellIterator aIter( &rDoc, aRange );
    3824          36 :                 for (bool bHasCell = aIter.first(); bHasCell; bHasCell = aIter.next())
    3825             :                 {
    3826          30 :                     if (aIter.getType() != CELLTYPE_FORMULA)
    3827          28 :                         continue;
    3828             : 
    3829           2 :                     ScDetectiveRefIter aRefIter(aIter.getFormulaCell());
    3830           2 :                     ScRange aRefRange;
    3831           6 :                     while ( aRefIter.GetNextRef( aRefRange) )
    3832             :                     {
    3833           2 :                         if ( bRecursive && !bFound && !aMarkData.IsAllMarked( aRefRange ) )
    3834           0 :                             bFound = true;
    3835           2 :                         aMarkData.SetMultiMarkArea(aRefRange, true);
    3836             :                     }
    3837             :                 }
    3838           6 :             }
    3839             : 
    3840           3 :             aMarkData.FillRangeListWithMarks( &aNewRanges, true );
    3841             :         }
    3842           0 :         while ( bRecursive && bFound );
    3843             : 
    3844           3 :         return new ScCellRangesObj( pDocShell, aNewRanges );
    3845             :     }
    3846             : 
    3847           0 :     return NULL;
    3848             : }
    3849             : 
    3850           3 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryDependents(
    3851             :     sal_Bool bRecursive ) throw(uno::RuntimeException, std::exception)
    3852             : {
    3853           3 :     SolarMutexGuard aGuard;
    3854           3 :     if ( pDocShell )
    3855             :     {
    3856           3 :         ScDocument& rDoc = pDocShell->GetDocument();
    3857             : 
    3858           3 :         ScRangeList aNewRanges(aRanges);
    3859             :         bool bFound;
    3860           3 :         do
    3861             :         {
    3862           3 :             bFound = false;
    3863             : 
    3864             :             //  aMarkData uses aNewRanges, not aRanges, so GetMarkData can't be used
    3865           3 :             ScMarkData aMarkData;
    3866           3 :             aMarkData.MarkFromRangeList( aNewRanges, false );
    3867           3 :             aMarkData.MarkToMulti();        // needed for IsAllMarked
    3868             : 
    3869           3 :             SCTAB nTab = lcl_FirstTab(aNewRanges);              //! alle Tabellen
    3870             : 
    3871           6 :             ScCellIterator aCellIter( &rDoc, ScRange(0, 0, nTab, MAXCOL, MAXROW, nTab) );
    3872         114 :             for (bool bHasCell = aCellIter.first(); bHasCell; bHasCell = aCellIter.next())
    3873             :             {
    3874         111 :                 if (aCellIter.getType() != CELLTYPE_FORMULA)
    3875         108 :                     continue;
    3876             : 
    3877           3 :                 bool bMark = false;
    3878           3 :                 ScDetectiveRefIter aIter(aCellIter.getFormulaCell());
    3879           3 :                 ScRange aRefRange;
    3880           9 :                 while ( aIter.GetNextRef( aRefRange) )
    3881             :                 {
    3882           3 :                     size_t nRangesCount = aNewRanges.size();
    3883           9 :                     for (size_t nR = 0; nR < nRangesCount; ++nR)
    3884             :                     {
    3885           6 :                         ScRange aRange( *aNewRanges[ nR ] );
    3886           6 :                         if (aRange.Intersects(aRefRange))
    3887           2 :                             bMark = true;                   // von Teil des Ranges abhaengig
    3888             :                     }
    3889             :                 }
    3890           3 :                 if (bMark)
    3891             :                 {
    3892           2 :                     ScRange aCellRange(aCellIter.GetPos());
    3893           2 :                     if ( bRecursive && !bFound && !aMarkData.IsAllMarked( aCellRange ) )
    3894           0 :                         bFound = true;
    3895           2 :                     aMarkData.SetMultiMarkArea(aCellRange, true);
    3896             :                 }
    3897             :             }
    3898             : 
    3899           6 :             aMarkData.FillRangeListWithMarks( &aNewRanges, true );
    3900             :         }
    3901           0 :         while ( bRecursive && bFound );
    3902             : 
    3903           3 :         return new ScCellRangesObj( pDocShell, aNewRanges );
    3904             :     }
    3905             : 
    3906           0 :     return NULL;
    3907             : }
    3908             : 
    3909             : // XSearchable
    3910             : 
    3911          16 : uno::Reference<util::XSearchDescriptor> SAL_CALL ScCellRangesBase::createSearchDescriptor()
    3912             :                                                             throw(uno::RuntimeException, std::exception)
    3913             : {
    3914          16 :     SolarMutexGuard aGuard;
    3915          16 :     return new ScCellSearchObj;
    3916             : }
    3917             : 
    3918          22 : uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangesBase::findAll(
    3919             :                         const uno::Reference<util::XSearchDescriptor>& xDesc )
    3920             :                                                     throw(uno::RuntimeException,
    3921             :                                                           std::exception)
    3922             : {
    3923          22 :     SolarMutexGuard aGuard;
    3924             :     //  Wenn nichts gefunden wird, soll Null zurueckgegeben werden (?)
    3925          22 :     uno::Reference<container::XIndexAccess> xRet;
    3926          22 :     if ( pDocShell && xDesc.is() )
    3927             :     {
    3928          22 :         ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc );
    3929          22 :         if (pSearch)
    3930             :         {
    3931          22 :             SvxSearchItem* pSearchItem = pSearch->GetSearchItem();
    3932          22 :             if (pSearchItem)
    3933             :             {
    3934          22 :                 ScDocument& rDoc = pDocShell->GetDocument();
    3935          22 :                 pSearchItem->SetCommand( SvxSearchCmd::FIND_ALL );
    3936             :                 //  immer nur innerhalb dieses Objekts
    3937          22 :                 pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) );
    3938             : 
    3939          22 :                 ScMarkData aMark(*GetMarkData());
    3940             : 
    3941          44 :                 OUString aDummyUndo;
    3942          44 :                 ScRangeList aMatchedRanges;
    3943          22 :                 SCCOL nCol = 0;
    3944          22 :                 SCROW nRow = 0;
    3945          22 :                 SCTAB nTab = 0;
    3946             :                 bool bFound = rDoc.SearchAndReplace(
    3947          22 :                     *pSearchItem, nCol, nRow, nTab, aMark, aMatchedRanges, aDummyUndo, NULL);
    3948          22 :                 if (bFound)
    3949             :                 {
    3950             :                     //  bei findAll immer CellRanges, egal wieviel gefunden wurde
    3951          18 :                     xRet.set(new ScCellRangesObj( pDocShell, aMatchedRanges ));
    3952          22 :                 }
    3953             :             }
    3954             :         }
    3955             :     }
    3956          22 :     return xRet;
    3957             : }
    3958             : 
    3959          31 : uno::Reference<uno::XInterface> ScCellRangesBase::Find_Impl(
    3960             :                                     const uno::Reference<util::XSearchDescriptor>& xDesc,
    3961             :                                     const ScAddress* pLastPos )
    3962             : {
    3963          31 :     uno::Reference<uno::XInterface> xRet;
    3964          31 :     if ( pDocShell && xDesc.is() )
    3965             :     {
    3966          31 :         ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc );
    3967          31 :         if (pSearch)
    3968             :         {
    3969          31 :             SvxSearchItem* pSearchItem = pSearch->GetSearchItem();
    3970          31 :             if (pSearchItem)
    3971             :             {
    3972          31 :                 ScDocument& rDoc = pDocShell->GetDocument();
    3973          31 :                 pSearchItem->SetCommand( SvxSearchCmd::FIND );
    3974             :                 //  immer nur innerhalb dieses Objekts
    3975          31 :                 pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) );
    3976             : 
    3977          31 :                 ScMarkData aMark(*GetMarkData());
    3978             : 
    3979             :                 SCCOL nCol;
    3980             :                 SCROW nRow;
    3981             :                 SCTAB nTab;
    3982          31 :                 if (pLastPos)
    3983           6 :                     pLastPos->GetVars( nCol, nRow, nTab );
    3984             :                 else
    3985             :                 {
    3986          25 :                     nTab = lcl_FirstTab(aRanges);   //! mehrere Tabellen?
    3987          25 :                     ScDocument::GetSearchAndReplaceStart( *pSearchItem, nCol, nRow );
    3988             :                 }
    3989             : 
    3990          62 :                 OUString aDummyUndo;
    3991          62 :                 ScRangeList aMatchedRanges;
    3992             :                 bool bFound = rDoc.SearchAndReplace(
    3993          31 :                     *pSearchItem, nCol, nRow, nTab, aMark, aMatchedRanges, aDummyUndo, NULL);
    3994          31 :                 if (bFound)
    3995             :                 {
    3996          19 :                     ScAddress aFoundPos( nCol, nRow, nTab );
    3997          19 :                     xRet.set(static_cast<cppu::OWeakObject*>(new ScCellObj( pDocShell, aFoundPos )));
    3998          31 :                 }
    3999             :             }
    4000             :         }
    4001             :     }
    4002          31 :     return xRet;
    4003             : }
    4004             : 
    4005          25 : uno::Reference<uno::XInterface> SAL_CALL ScCellRangesBase::findFirst(
    4006             :                         const uno::Reference<util::XSearchDescriptor>& xDesc )
    4007             :                                                 throw(uno::RuntimeException, std::exception)
    4008             : {
    4009          25 :     SolarMutexGuard aGuard;
    4010          25 :     return Find_Impl( xDesc, NULL );
    4011             : }
    4012             : 
    4013           6 : uno::Reference<uno::XInterface> SAL_CALL ScCellRangesBase::findNext(
    4014             :                         const uno::Reference<uno::XInterface>& xStartAt,
    4015             :                         const uno::Reference<util::XSearchDescriptor >& xDesc )
    4016             :                                                 throw(uno::RuntimeException, std::exception)
    4017             : {
    4018           6 :     SolarMutexGuard aGuard;
    4019           6 :     if ( xStartAt.is() )
    4020             :     {
    4021           6 :         ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xStartAt );
    4022           6 :         if ( pRangesImp && pRangesImp->GetDocShell() == pDocShell )
    4023             :         {
    4024           6 :             const ScRangeList& rStartRanges = pRangesImp->GetRangeList();
    4025           6 :             if ( rStartRanges.size() == 1 )
    4026             :             {
    4027           6 :                 ScAddress aStartPos = rStartRanges[ 0 ]->aStart;
    4028           6 :                 return Find_Impl( xDesc, &aStartPos );
    4029             :             }
    4030             :         }
    4031             :     }
    4032           0 :     return NULL;
    4033             : }
    4034             : 
    4035             : // XReplaceable
    4036             : 
    4037          24 : uno::Reference<util::XReplaceDescriptor> SAL_CALL ScCellRangesBase::createReplaceDescriptor()
    4038             :                                                 throw(uno::RuntimeException, std::exception)
    4039             : {
    4040          24 :     SolarMutexGuard aGuard;
    4041          24 :     return new ScCellSearchObj;
    4042             : }
    4043             : 
    4044          26 : sal_Int32 SAL_CALL ScCellRangesBase::replaceAll( const uno::Reference<util::XSearchDescriptor>& xDesc )
    4045             :                                                 throw(uno::RuntimeException,
    4046             :                                                       std::exception)
    4047             : {
    4048          26 :     SolarMutexGuard aGuard;
    4049          26 :     sal_Int32 nReplaced = 0;
    4050          26 :     if ( pDocShell && xDesc.is() )
    4051             :     {
    4052          26 :         ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc );
    4053          26 :         if (pSearch)
    4054             :         {
    4055          26 :             SvxSearchItem* pSearchItem = pSearch->GetSearchItem();
    4056          26 :             if (pSearchItem)
    4057             :             {
    4058          26 :                 ScDocument& rDoc = pDocShell->GetDocument();
    4059          26 :                 bool bUndo(rDoc.IsUndoEnabled());
    4060          26 :                 pSearchItem->SetCommand( SvxSearchCmd::REPLACE_ALL );
    4061             :                 //  immer nur innerhalb dieses Objekts
    4062          26 :                 pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) );
    4063             : 
    4064          26 :                 ScMarkData aMark(*GetMarkData());
    4065             : 
    4066          26 :                 SCTAB nTabCount = rDoc.GetTableCount();
    4067          26 :                 bool bProtected = !pDocShell->IsEditable();
    4068          26 :                 ScMarkData::iterator itr = aMark.begin(), itrEnd = aMark.end();
    4069          52 :                 for (; itr != itrEnd && *itr < nTabCount; ++itr)
    4070          26 :                     if ( rDoc.IsTabProtected(*itr) )
    4071           0 :                         bProtected = true;
    4072          26 :                 if (bProtected)
    4073             :                 {
    4074             :                     //! Exception, oder was?
    4075             :                 }
    4076             :                 else
    4077             :                 {
    4078          26 :                     SCTAB nTab = aMark.GetFirstSelected();      // bei SearchAndReplace nicht benutzt
    4079          26 :                     SCCOL nCol = 0;
    4080          26 :                     SCROW nRow = 0;
    4081             : 
    4082          26 :                     OUString aUndoStr;
    4083          26 :                     ScDocument* pUndoDoc = NULL;
    4084          26 :                     if (bUndo)
    4085             :                     {
    4086          26 :                         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
    4087          26 :                         pUndoDoc->InitUndo( &rDoc, nTab, nTab );
    4088             :                     }
    4089          26 :                     itr = aMark.begin();
    4090          52 :                     for (; itr != itrEnd && *itr < nTabCount; ++itr)
    4091          26 :                         if ( *itr != nTab && bUndo)
    4092           0 :                             pUndoDoc->AddUndoTab( *itr, *itr );
    4093          52 :                     boost::scoped_ptr<ScMarkData> pUndoMark;
    4094          26 :                     if (bUndo)
    4095          26 :                         pUndoMark.reset(new ScMarkData(aMark));
    4096             : 
    4097          26 :                     bool bFound = false;
    4098          26 :                     if (bUndo)
    4099             :                     {
    4100          26 :                         ScRangeList aMatchedRanges;
    4101             :                         bFound = rDoc.SearchAndReplace(
    4102          26 :                             *pSearchItem, nCol, nRow, nTab, aMark, aMatchedRanges, aUndoStr, pUndoDoc );
    4103             :                     }
    4104          26 :                     if (bFound)
    4105             :                     {
    4106          22 :                         nReplaced = pUndoDoc->GetCellCount();
    4107             : 
    4108          22 :                         pDocShell->GetUndoManager()->AddUndoAction(
    4109             :                             new ScUndoReplace( pDocShell, *pUndoMark, nCol, nRow, nTab,
    4110          22 :                                                         aUndoStr, pUndoDoc, pSearchItem ) );
    4111             : 
    4112          22 :                         pDocShell->PostPaintGridAll();
    4113          22 :                         pDocShell->SetDocumentModified();
    4114             :                     }
    4115             :                     else
    4116             :                     {
    4117           4 :                         delete pUndoDoc;
    4118             :                         // nReplaced bleibt 0
    4119          26 :                     }
    4120          26 :                 }
    4121             :             }
    4122             :         }
    4123             :     }
    4124          26 :     return nReplaced;
    4125             : }
    4126             : 
    4127             : // XUnoTunnel
    4128             : 
    4129       17272 : sal_Int64 SAL_CALL ScCellRangesBase::getSomething(
    4130             :                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException, std::exception)
    4131             : {
    4132       34544 :     if ( rId.getLength() == 16 &&
    4133       17272 :           0 == memcmp( getUnoTunnelId().getConstArray(),
    4134       34544 :                                     rId.getConstArray(), 16 ) )
    4135             :     {
    4136       15896 :         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
    4137             :     }
    4138        1376 :     return 0;
    4139             : }
    4140             : 
    4141             : namespace
    4142             : {
    4143             :     class theScCellRangesBaseUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScCellRangesBaseUnoTunnelId> {};
    4144             : }
    4145             : 
    4146       33170 : const uno::Sequence<sal_Int8>& ScCellRangesBase::getUnoTunnelId()
    4147             : {
    4148       33170 :     return theScCellRangesBaseUnoTunnelId::get().getSeq();
    4149             : }
    4150             : 
    4151       15914 : ScCellRangesBase* ScCellRangesBase::getImplementation(const uno::Reference<uno::XInterface>& rObj)
    4152             : {
    4153       15914 :     ScCellRangesBase* pRet = NULL;
    4154       15914 :     uno::Reference<lang::XUnoTunnel> xUT(rObj, uno::UNO_QUERY);
    4155       15914 :     if (xUT.is())
    4156       15898 :         pRet = reinterpret_cast<ScCellRangesBase*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
    4157       15914 :     return pRet;
    4158             : }
    4159             : 
    4160             : typedef boost::ptr_vector<ScNamedEntry> ScNamedEntryArr_Impl;
    4161             : 
    4162        4083 : struct ScCellRangesObj::Impl
    4163             : {
    4164             :     ScNamedEntryArr_Impl m_aNamedEntries;
    4165             : };
    4166             : 
    4167        2042 : ScCellRangesObj::ScCellRangesObj(ScDocShell* pDocSh, const ScRangeList& rR)
    4168             :     : ScCellRangesBase(pDocSh, rR)
    4169        2042 :     , m_pImpl(new Impl)
    4170             : {
    4171        2042 : }
    4172             : 
    4173        4082 : ScCellRangesObj::~ScCellRangesObj()
    4174             : {
    4175        4082 : }
    4176             : 
    4177        4155 : void ScCellRangesObj::RefChanged()
    4178             : {
    4179        4155 :     ScCellRangesBase::RefChanged();
    4180             : 
    4181             :     //  nix weiter...
    4182        4155 : }
    4183             : 
    4184       13224 : uno::Any SAL_CALL ScCellRangesObj::queryInterface( const uno::Type& rType )
    4185             :                                                 throw(uno::RuntimeException, std::exception)
    4186             : {
    4187       13224 :     SC_QUERYINTERFACE( sheet::XSheetCellRangeContainer )
    4188       11505 :     SC_QUERYINTERFACE( sheet::XSheetCellRanges )
    4189       11338 :     SC_QUERYINTERFACE( container::XIndexAccess )
    4190       11238 :     SC_QUERY_MULTIPLE( container::XElementAccess, container::XIndexAccess )
    4191       11238 :     SC_QUERYINTERFACE( container::XEnumerationAccess )
    4192       11186 :     SC_QUERYINTERFACE( container::XNameContainer )
    4193       11178 :     SC_QUERYINTERFACE( container::XNameReplace )
    4194       11178 :     SC_QUERYINTERFACE( container::XNameAccess )
    4195             : 
    4196       11098 :     return ScCellRangesBase::queryInterface( rType );
    4197             : }
    4198             : 
    4199       40502 : void SAL_CALL ScCellRangesObj::acquire() throw()
    4200             : {
    4201       40502 :     ScCellRangesBase::acquire();
    4202       40502 : }
    4203             : 
    4204       40501 : void SAL_CALL ScCellRangesObj::release() throw()
    4205             : {
    4206       40501 :     ScCellRangesBase::release();
    4207       40501 : }
    4208             : 
    4209           0 : uno::Sequence<uno::Type> SAL_CALL ScCellRangesObj::getTypes() throw(uno::RuntimeException, std::exception)
    4210             : {
    4211           0 :     static uno::Sequence<uno::Type> aTypes;
    4212           0 :     if ( aTypes.getLength() == 0 )
    4213             :     {
    4214           0 :         uno::Sequence<uno::Type> aParentTypes(ScCellRangesBase::getTypes());
    4215           0 :         long nParentLen = aParentTypes.getLength();
    4216           0 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    4217             : 
    4218           0 :         aTypes.realloc( nParentLen + 3 );
    4219           0 :         uno::Type* pPtr = aTypes.getArray();
    4220           0 :         pPtr[nParentLen + 0] = cppu::UnoType<sheet::XSheetCellRangeContainer>::get();
    4221           0 :         pPtr[nParentLen + 1] = cppu::UnoType<container::XNameContainer>::get();
    4222           0 :         pPtr[nParentLen + 2] = cppu::UnoType<container::XEnumerationAccess>::get();
    4223             : 
    4224           0 :         for (long i=0; i<nParentLen; i++)
    4225           0 :             pPtr[i] = pParentPtr[i];                // parent types first
    4226             :     }
    4227           0 :     return aTypes;
    4228             : }
    4229             : 
    4230           0 : uno::Sequence<sal_Int8> SAL_CALL ScCellRangesObj::getImplementationId()
    4231             :                                                     throw(uno::RuntimeException, std::exception)
    4232             : {
    4233           0 :     return css::uno::Sequence<sal_Int8>();
    4234             : }
    4235             : 
    4236             : // XCellRanges
    4237             : 
    4238         479 : ScCellRangeObj* ScCellRangesObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const
    4239             : {
    4240         479 :     ScDocShell* pDocSh = GetDocShell();
    4241         479 :     const ScRangeList& rRanges = GetRangeList();
    4242         479 :     if ( pDocSh && nIndex >= 0 && nIndex < sal::static_int_cast<sal_Int32>(rRanges.size()) )
    4243             :     {
    4244         477 :         ScRange aRange( *rRanges[ nIndex ] );
    4245         477 :         if ( aRange.aStart == aRange.aEnd )
    4246          10 :             return new ScCellObj( pDocSh, aRange.aStart );
    4247             :         else
    4248         467 :             return new ScCellRangeObj( pDocSh, aRange );
    4249             :     }
    4250             : 
    4251           2 :     return NULL;        // keine DocShell oder falscher Index
    4252             : }
    4253             : 
    4254        1196 : uno::Sequence<table::CellRangeAddress> SAL_CALL ScCellRangesObj::getRangeAddresses()
    4255             :                                                     throw(uno::RuntimeException, std::exception)
    4256             : {
    4257        1196 :     SolarMutexGuard aGuard;
    4258        1196 :     ScDocShell* pDocSh = GetDocShell();
    4259        1196 :     const ScRangeList& rRanges = GetRangeList();
    4260        1196 :     size_t nCount = rRanges.size();
    4261        1196 :     if ( pDocSh && nCount )
    4262             :     {
    4263        1193 :         table::CellRangeAddress aRangeAddress;
    4264        1193 :         uno::Sequence<table::CellRangeAddress> aSeq(nCount);
    4265        1193 :         table::CellRangeAddress* pAry = aSeq.getArray();
    4266        3109 :         for ( size_t i=0; i < nCount; i++)
    4267             :         {
    4268        1916 :             ScUnoConversion::FillApiRange( aRangeAddress, *rRanges[ i ] );
    4269        1916 :             pAry[i] = aRangeAddress;
    4270             :         }
    4271        1193 :         return aSeq;
    4272             :     }
    4273             : 
    4274           3 :     return uno::Sequence<table::CellRangeAddress>(0);   // leer ist moeglich
    4275             : }
    4276             : 
    4277          27 : uno::Reference<container::XEnumerationAccess> SAL_CALL ScCellRangesObj::getCells()
    4278             :                                                     throw(uno::RuntimeException, std::exception)
    4279             : {
    4280          27 :     SolarMutexGuard aGuard;
    4281             : 
    4282             :     //  getCells with empty range list is possible (no exception),
    4283             :     //  the resulting enumeration just has no elements
    4284             :     //  (same behaviour as a valid range with no cells)
    4285             :     //  This is handled in ScCellsEnumeration ctor.
    4286             : 
    4287          27 :     const ScRangeList& rRanges = GetRangeList();
    4288          27 :     ScDocShell* pDocSh = GetDocShell();
    4289          27 :     if (pDocSh)
    4290          27 :         return new ScCellsObj( pDocSh, rRanges );
    4291           0 :     return NULL;
    4292             : }
    4293             : 
    4294          33 : OUString SAL_CALL ScCellRangesObj::getRangeAddressesAsString()
    4295             :                                                 throw(uno::RuntimeException, std::exception)
    4296             : {
    4297          33 :     SolarMutexGuard aGuard;
    4298          33 :     OUString aString;
    4299          33 :     ScDocShell* pDocSh = GetDocShell();
    4300          33 :     const ScRangeList& rRanges = GetRangeList();
    4301          33 :     if (pDocSh)
    4302          33 :         rRanges.Format( aString, SCA_VALID | SCA_TAB_3D, &pDocSh->GetDocument() );
    4303          33 :     return aString;
    4304             : }
    4305             : 
    4306             : // XSheetCellRangeContainer
    4307             : 
    4308        4098 : void SAL_CALL ScCellRangesObj::addRangeAddress( const table::CellRangeAddress& rRange,
    4309             :                                     sal_Bool bMergeRanges )
    4310             :                                     throw(::com::sun::star::uno::RuntimeException, std::exception)
    4311             : {
    4312        4098 :     SolarMutexGuard aGuard;
    4313             :     ScRange aRange(static_cast<SCCOL>(rRange.StartColumn),
    4314             :             static_cast<SCROW>(rRange.StartRow),
    4315             :             static_cast<SCTAB>(rRange.Sheet),
    4316             :             static_cast<SCCOL>(rRange.EndColumn),
    4317             :             static_cast<SCROW>(rRange.EndRow),
    4318        4098 :             static_cast<SCTAB>(rRange.Sheet));
    4319        4098 :     AddRange(aRange, bMergeRanges);
    4320        4098 : }
    4321             : 
    4322           8 : static void lcl_RemoveNamedEntry( ScNamedEntryArr_Impl& rNamedEntries, const ScRange& rRange )
    4323             : {
    4324           8 :     sal_uInt16 nCount = rNamedEntries.size();
    4325          26 :     for ( sal_uInt16 n=nCount; n--; )
    4326          10 :         if ( rNamedEntries[n].GetRange() == rRange )
    4327           4 :             rNamedEntries.erase( rNamedEntries.begin() + n );
    4328           8 : }
    4329             : 
    4330           8 : void SAL_CALL ScCellRangesObj::removeRangeAddress( const table::CellRangeAddress& rRange )
    4331             :                                 throw(::com::sun::star::container::NoSuchElementException,
    4332             :                                     ::com::sun::star::uno::RuntimeException, std::exception)
    4333             : {
    4334           8 :     SolarMutexGuard aGuard;
    4335           8 :     const ScRangeList& rRanges = GetRangeList();
    4336             : 
    4337          16 :     ScRangeList aSheetRanges;
    4338          16 :     ScRangeList aNotSheetRanges;
    4339          25 :     for (size_t i = 0; i < rRanges.size(); ++i)
    4340             :     {
    4341          17 :         if (rRanges[ i]->aStart.Tab() == rRange.Sheet)
    4342             :         {
    4343          14 :             aSheetRanges.Append( *rRanges[ i ] );
    4344             :         }
    4345             :         else
    4346             :         {
    4347           3 :             aNotSheetRanges.Append( *rRanges[ i ] );
    4348             :         }
    4349             :     }
    4350          16 :     ScMarkData aMarkData;
    4351           8 :     aMarkData.MarkFromRangeList( aSheetRanges, false );
    4352             :     ScRange aRange(static_cast<SCCOL>(rRange.StartColumn),
    4353             :                 static_cast<SCROW>(rRange.StartRow),
    4354             :                 static_cast<SCTAB>(rRange.Sheet),
    4355             :                 static_cast<SCCOL>(rRange.EndColumn),
    4356             :                 static_cast<SCROW>(rRange.EndRow),
    4357           8 :                 static_cast<SCTAB>(rRange.Sheet));
    4358           8 :     if (aMarkData.GetTableSelect( aRange.aStart.Tab() ))
    4359             :     {
    4360           8 :         aMarkData.MarkToMulti();
    4361           8 :         if (aMarkData.IsAllMarked( aRange ) )
    4362             :         {
    4363           8 :             aMarkData.SetMultiMarkArea( aRange, false );
    4364           8 :             lcl_RemoveNamedEntry(m_pImpl->m_aNamedEntries, aRange);
    4365             :         }
    4366             :         else
    4367           0 :             throw container::NoSuchElementException();
    4368             :     }
    4369           8 :     SetNewRanges(aNotSheetRanges);
    4370          16 :     ScRangeList aNew;
    4371           8 :     aMarkData.FillRangeListWithMarks( &aNew, false );
    4372          14 :     for ( size_t j = 0; j < aNew.size(); ++j)
    4373             :     {
    4374           6 :         AddRange(*aNew[ j ], false);
    4375           8 :     }
    4376           8 : }
    4377             : 
    4378           1 : void SAL_CALL ScCellRangesObj::addRangeAddresses( const uno::Sequence<table::CellRangeAddress >& rRanges,
    4379             :                                     sal_Bool bMergeRanges )
    4380             :                                     throw(::com::sun::star::uno::RuntimeException, std::exception)
    4381             : {
    4382           1 :     SolarMutexGuard aGuard;
    4383           1 :     sal_Int32 nCount(rRanges.getLength());
    4384           1 :     if (nCount)
    4385             :     {
    4386           1 :         const table::CellRangeAddress* pRanges = rRanges.getConstArray();
    4387           4 :         for (sal_Int32 i = 0; i < rRanges.getLength(); i++, pRanges++)
    4388             :         {
    4389             :             ScRange aRange(static_cast<SCCOL>(pRanges->StartColumn),
    4390             :                     static_cast<SCROW>(pRanges->StartRow),
    4391             :                     static_cast<SCTAB>(pRanges->Sheet),
    4392             :                     static_cast<SCCOL>(pRanges->EndColumn),
    4393             :                     static_cast<SCROW>(pRanges->EndRow),
    4394           3 :                     static_cast<SCTAB>(pRanges->Sheet));
    4395           3 :             AddRange(aRange, bMergeRanges);
    4396             :         }
    4397           1 :     }
    4398           1 : }
    4399             : 
    4400           4 : void SAL_CALL ScCellRangesObj::removeRangeAddresses( const uno::Sequence<table::CellRangeAddress >& rRangeSeq )
    4401             :                                 throw(::com::sun::star::container::NoSuchElementException,
    4402             :                                     ::com::sun::star::uno::RuntimeException, std::exception)
    4403             : {
    4404             :     // use sometimes a better/faster implementation
    4405           4 :     sal_uInt32 nCount(rRangeSeq.getLength());
    4406           4 :     if (nCount)
    4407             :     {
    4408           2 :         const table::CellRangeAddress* pRanges = rRangeSeq.getConstArray();
    4409           9 :         for (sal_uInt32 i=0; i < nCount; ++i, ++pRanges)
    4410             :         {
    4411           7 :             removeRangeAddress(*pRanges);
    4412             :         }
    4413             :     }
    4414           4 : }
    4415             : 
    4416             : // XNameContainer
    4417             : 
    4418           4 : static void lcl_RemoveNamedEntry( ScNamedEntryArr_Impl& rNamedEntries, const OUString& rName )
    4419             : {
    4420           4 :     sal_uInt16 nCount = rNamedEntries.size();
    4421          25 :     for ( sal_uInt16 n=nCount; n--; )
    4422          17 :         if ( rNamedEntries[n].GetName() == rName )
    4423           3 :             rNamedEntries.erase( rNamedEntries.begin() + n );
    4424           4 : }
    4425             : 
    4426          37 : void SAL_CALL ScCellRangesObj::insertByName( const OUString& aName, const uno::Any& aElement )
    4427             :                             throw (lang::IllegalArgumentException, container::ElementExistException,
    4428             :                                    lang::WrappedTargetException, uno::RuntimeException,
    4429             :                                    std::exception)
    4430             : {
    4431          37 :     SolarMutexGuard aGuard;
    4432          37 :     ScDocShell* pDocSh = GetDocShell();
    4433          37 :     bool bDone = false;
    4434             : 
    4435             :     //! Type of aElement can be some specific interface instead of XInterface
    4436             : 
    4437          74 :     uno::Reference<uno::XInterface> xInterface(aElement, uno::UNO_QUERY);
    4438          37 :     if ( pDocSh && xInterface.is() )
    4439             :     {
    4440          36 :         ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xInterface );
    4441          36 :         if ( pRangesImp && pRangesImp->GetDocShell() == pDocSh )
    4442             :         {
    4443             :             //  if explicit name is given and already existing, throw exception
    4444             : 
    4445          36 :             OUString aNamStr(aName);
    4446          36 :             if ( !aNamStr.isEmpty() )
    4447             :             {
    4448          36 :                 size_t nNamedCount = m_pImpl->m_aNamedEntries.size();
    4449          98 :                 for (size_t n = 0; n < nNamedCount; n++)
    4450             :                 {
    4451          63 :                     if (m_pImpl->m_aNamedEntries[n].GetName() == aNamStr)
    4452           1 :                         throw container::ElementExistException();
    4453             :                 }
    4454             :             }
    4455             : 
    4456          70 :             ScRangeList aNew(GetRangeList());
    4457          35 :             const ScRangeList& rAddRanges = pRangesImp->GetRangeList();
    4458          35 :             size_t nAddCount = rAddRanges.size();
    4459          70 :             for ( size_t i = 0; i < nAddCount; i++ )
    4460          35 :                 aNew.Join( *rAddRanges[ i ] );
    4461          35 :             SetNewRanges(aNew);
    4462          35 :             bDone = true;
    4463             : 
    4464          35 :             if ( !aName.isEmpty() && nAddCount == 1 )
    4465             :             {
    4466             :                 //  if a name is given, also insert into list of named entries
    4467             :                 //  (only possible for a single range)
    4468             :                 //  name is not in m_pImpl->m_aNamedEntries (tested above)
    4469             : 
    4470          35 :                 ScNamedEntry* pEntry = new ScNamedEntry( aNamStr, *rAddRanges[ 0 ] );
    4471          35 :                 m_pImpl->m_aNamedEntries.push_back(pEntry);
    4472          36 :             }
    4473             :         }
    4474             :     }
    4475             : 
    4476          36 :     if (!bDone)
    4477             :     {
    4478             :         //  invalid element - double names are handled above
    4479           1 :         throw lang::IllegalArgumentException();
    4480          37 :     }
    4481          35 : }
    4482             : 
    4483          13 : static bool lcl_FindRangeByName( const ScRangeList& rRanges, ScDocShell* pDocSh,
    4484             :                             const OUString& rName, size_t& rIndex )
    4485             : {
    4486          13 :     if (pDocSh)
    4487             :     {
    4488          13 :         OUString aRangeStr;
    4489          13 :         ScDocument& rDoc = pDocSh->GetDocument();
    4490          67 :         for ( size_t i = 0, nCount = rRanges.size(); i < nCount; i++ )
    4491             :         {
    4492          54 :             aRangeStr = rRanges[ i ]->Format(SCA_VALID | SCA_TAB_3D, &rDoc);
    4493          54 :             if ( aRangeStr == rName )
    4494             :             {
    4495           0 :                 rIndex = i;
    4496           0 :                 return true;
    4497             :             }
    4498          13 :         }
    4499             :     }
    4500          13 :     return false;   // nicht gefunden
    4501             : }
    4502             : 
    4503           9 : static bool lcl_FindRangeOrEntry( const ScNamedEntryArr_Impl& rNamedEntries,
    4504             :                             const ScRangeList& rRanges, ScDocShell* pDocSh,
    4505             :                             const OUString& rName, ScRange& rFound )
    4506             : {
    4507             :     //  exact range in list?
    4508             : 
    4509           9 :     size_t nIndex = 0;
    4510           9 :     if ( lcl_FindRangeByName( rRanges, pDocSh, rName, nIndex ) )
    4511             :     {
    4512           0 :         rFound = *rRanges[ nIndex ];
    4513           0 :         return true;
    4514             :     }
    4515             : 
    4516             :     //  range contained in selection? (sheet must be specified)
    4517             : 
    4518           9 :     ScRange aCellRange;
    4519           9 :     sal_uInt16 nParse = aCellRange.ParseAny( rName, &pDocSh->GetDocument() );
    4520           9 :     if ( ( nParse & ( SCA_VALID | SCA_TAB_3D ) ) == ( SCA_VALID | SCA_TAB_3D ) )
    4521             :     {
    4522           0 :         ScMarkData aMarkData;
    4523           0 :         aMarkData.MarkFromRangeList( rRanges, false );
    4524           0 :         aMarkData.MarkToMulti();        // needed for IsAllMarked
    4525           0 :         if ( aMarkData.IsAllMarked( aCellRange ) )
    4526             :         {
    4527           0 :             rFound = aCellRange;
    4528           0 :             return true;
    4529           0 :         }
    4530             :     }
    4531             : 
    4532             :     //  named entry in this object?
    4533             : 
    4534           9 :     if ( !rNamedEntries.empty() )
    4535             :     {
    4536          31 :         for ( size_t n=0; n<rNamedEntries.size(); n++ )
    4537          28 :             if ( rNamedEntries[n].GetName() == rName )
    4538             :             {
    4539             :                 //  test if named entry is contained in rRanges
    4540             : 
    4541           6 :                 const ScRange& rComp = rNamedEntries[n].GetRange();
    4542           6 :                 ScMarkData aMarkData;
    4543           6 :                 aMarkData.MarkFromRangeList( rRanges, false );
    4544           6 :                 aMarkData.MarkToMulti();        // needed for IsAllMarked
    4545           6 :                 if ( aMarkData.IsAllMarked( rComp ) )
    4546             :                 {
    4547           6 :                     rFound = rComp;
    4548           6 :                     return true;
    4549           0 :                 }
    4550             :             }
    4551             :     }
    4552             : 
    4553           3 :     return false;       // not found
    4554             : }
    4555             : 
    4556           4 : void SAL_CALL ScCellRangesObj::removeByName( const OUString& aName )
    4557             :                                 throw(container::NoSuchElementException,
    4558             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    4559             : {
    4560           4 :     SolarMutexGuard aGuard;
    4561           4 :     bool bDone = false;
    4562           8 :     OUString aNameStr(aName);
    4563           4 :     ScDocShell* pDocSh = GetDocShell();
    4564           4 :     const ScRangeList& rRanges = GetRangeList();
    4565           4 :     size_t nIndex = 0;
    4566           4 :     if ( lcl_FindRangeByName( rRanges, pDocSh, aNameStr, nIndex ) )
    4567             :     {
    4568             :         //  einzelnen Range weglassen
    4569           0 :         ScRangeList aNew;
    4570           0 :         for ( size_t i = 0, nCount = rRanges.size(); i < nCount; i++ )
    4571           0 :             if (i != nIndex)
    4572           0 :                 aNew.Append( *rRanges[ i ] );
    4573           0 :         SetNewRanges(aNew);
    4574           0 :         bDone = true;
    4575             :     }
    4576           4 :     else if (pDocSh)
    4577             :     {
    4578             :         //  deselect any ranges (parsed or named entry)
    4579           4 :         ScRangeList aDiff;
    4580           4 :         bool bValid = ( aDiff.Parse( aNameStr, &pDocSh->GetDocument() ) & SCA_VALID ) != 0;
    4581           4 :         if (!bValid && !m_pImpl->m_aNamedEntries.empty())
    4582             :         {
    4583           4 :             sal_uInt16 nCount = m_pImpl->m_aNamedEntries.size();
    4584          18 :             for (sal_uInt16 n=0; n<nCount && !bValid; n++)
    4585          14 :                 if (m_pImpl->m_aNamedEntries[n].GetName() == aNameStr)
    4586             :                 {
    4587           3 :                     aDiff.RemoveAll();
    4588           3 :                     aDiff.Append(m_pImpl->m_aNamedEntries[n].GetRange());
    4589           3 :                     bValid = true;
    4590             :                 }
    4591             :         }
    4592           4 :         if ( bValid )
    4593             :         {
    4594           3 :             ScMarkData aMarkData;
    4595           3 :             aMarkData.MarkFromRangeList( rRanges, false );
    4596             : 
    4597           6 :             for ( size_t i = 0, nDiffCount = aDiff.size(); i < nDiffCount; i++ )
    4598             :             {
    4599           3 :                 ScRange* pDiffRange = aDiff[ i ];
    4600           3 :                 if (aMarkData.GetTableSelect( pDiffRange->aStart.Tab() ))
    4601           3 :                     aMarkData.SetMultiMarkArea( *pDiffRange, false );
    4602             :             }
    4603             : 
    4604           6 :             ScRangeList aNew;
    4605           3 :             aMarkData.FillRangeListWithMarks( &aNew, false );
    4606           3 :             SetNewRanges(aNew);
    4607             : 
    4608           6 :             bDone = true;       //! error if range was not selected before?
    4609           4 :         }
    4610             :     }
    4611             : 
    4612           4 :     if (!m_pImpl->m_aNamedEntries.empty())
    4613           4 :         lcl_RemoveNamedEntry(m_pImpl->m_aNamedEntries, aNameStr);
    4614             : 
    4615           4 :     if (!bDone)
    4616           5 :         throw container::NoSuchElementException();      // not found
    4617           3 : }
    4618             : 
    4619             : // XNameReplace
    4620             : 
    4621           2 : void SAL_CALL ScCellRangesObj::replaceByName( const OUString& aName, const uno::Any& aElement )
    4622             :                             throw(lang::IllegalArgumentException, container::NoSuchElementException,
    4623             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    4624             : {
    4625           2 :     SolarMutexGuard aGuard;
    4626             :     //! zusammenfassen?
    4627           2 :     removeByName( aName );
    4628           2 :     insertByName( aName, aElement );
    4629           2 : }
    4630             : 
    4631             : // XNameAccess
    4632             : 
    4633           5 : uno::Any SAL_CALL ScCellRangesObj::getByName( const OUString& aName )
    4634             :             throw(container::NoSuchElementException,
    4635             :                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    4636             : {
    4637           5 :     SolarMutexGuard aGuard;
    4638           5 :     uno::Any aRet;
    4639             : 
    4640          10 :     OUString aNameStr(aName);
    4641           5 :     ScDocShell* pDocSh = GetDocShell();
    4642           5 :     const ScRangeList& rRanges = GetRangeList();
    4643           5 :     ScRange aRange;
    4644          10 :     if (lcl_FindRangeOrEntry(m_pImpl->m_aNamedEntries, rRanges,
    4645           5 :                 pDocSh, aNameStr, aRange))
    4646             :     {
    4647           4 :         uno::Reference<table::XCellRange> xRange;
    4648           4 :         if ( aRange.aStart == aRange.aEnd )
    4649           0 :             xRange.set(new ScCellObj( pDocSh, aRange.aStart ));
    4650             :         else
    4651           4 :             xRange.set(new ScCellRangeObj( pDocSh, aRange ));
    4652           4 :         aRet <<= xRange;
    4653             :     }
    4654             :     else
    4655           1 :         throw container::NoSuchElementException();
    4656           9 :     return aRet;
    4657             : }
    4658             : 
    4659          22 : static bool lcl_FindEntryName( const ScNamedEntryArr_Impl& rNamedEntries,
    4660             :                         const ScRange& rRange, OUString& rName )
    4661             : {
    4662          22 :     sal_uInt16 nCount = rNamedEntries.size();
    4663          60 :     for (sal_uInt16 i=0; i<nCount; i++)
    4664          60 :         if (rNamedEntries[i].GetRange() == rRange)
    4665             :         {
    4666          22 :             rName = rNamedEntries[i].GetName();
    4667          22 :             return true;
    4668             :         }
    4669           0 :     return false;
    4670             : }
    4671             : 
    4672           5 : uno::Sequence<OUString> SAL_CALL ScCellRangesObj::getElementNames()
    4673             :                                                 throw(uno::RuntimeException, std::exception)
    4674             : {
    4675           5 :     SolarMutexGuard aGuard;
    4676             : 
    4677           5 :     ScDocShell* pDocSh = GetDocShell();
    4678           5 :     const ScRangeList& rRanges = GetRangeList();
    4679           5 :     if (pDocSh)
    4680             :     {
    4681           5 :         OUString aRangeStr;
    4682           5 :         ScDocument& rDoc = pDocSh->GetDocument();
    4683           5 :         size_t nCount = rRanges.size();
    4684             : 
    4685          10 :         uno::Sequence<OUString> aSeq(nCount);
    4686           5 :         OUString* pAry = aSeq.getArray();
    4687          27 :         for (size_t i=0; i < nCount; i++)
    4688             :         {
    4689             :             //  use given name if for exactly this range, otherwise just format
    4690          22 :             ScRange aRange = *rRanges[ i ];
    4691          44 :             if (m_pImpl->m_aNamedEntries.empty() ||
    4692          22 :                 !lcl_FindEntryName(m_pImpl->m_aNamedEntries, aRange, aRangeStr))
    4693             :             {
    4694           0 :                 aRangeStr = aRange.Format(SCA_VALID | SCA_TAB_3D, &rDoc);
    4695             :             }
    4696          22 :             pAry[i] = aRangeStr;
    4697             :         }
    4698          10 :         return aSeq;
    4699             :     }
    4700           0 :     return uno::Sequence<OUString>(0);
    4701             : }
    4702             : 
    4703           4 : sal_Bool SAL_CALL ScCellRangesObj::hasByName( const OUString& aName )
    4704             :                                         throw(uno::RuntimeException, std::exception)
    4705             : {
    4706           4 :     SolarMutexGuard aGuard;
    4707           8 :     OUString aNameStr(aName);
    4708           4 :     ScDocShell* pDocSh = GetDocShell();
    4709           4 :     const ScRangeList& rRanges = GetRangeList();
    4710           4 :     ScRange aRange;
    4711           4 :     return lcl_FindRangeOrEntry(m_pImpl->m_aNamedEntries, rRanges, pDocSh,
    4712           8 :                 aNameStr, aRange);
    4713             : }
    4714             : 
    4715             : // XEnumerationAccess
    4716             : 
    4717          52 : uno::Reference<container::XEnumeration> SAL_CALL ScCellRangesObj::createEnumeration()
    4718             :                                                     throw(uno::RuntimeException, std::exception)
    4719             : {
    4720          52 :     SolarMutexGuard aGuard;
    4721          52 :     return new ScIndexEnumeration(this, OUString("com.sun.star.sheet.SheetCellRangesEnumeration"));
    4722             : }
    4723             : 
    4724             : // XIndexAccess
    4725             : 
    4726         517 : sal_Int32 SAL_CALL ScCellRangesObj::getCount() throw(uno::RuntimeException, std::exception)
    4727             : {
    4728         517 :     SolarMutexGuard aGuard;
    4729         517 :     const ScRangeList& rRanges = GetRangeList();
    4730         517 :     return rRanges.size();
    4731             : }
    4732             : 
    4733         479 : uno::Any SAL_CALL ScCellRangesObj::getByIndex( sal_Int32 nIndex )
    4734             :                             throw(lang::IndexOutOfBoundsException,
    4735             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    4736             : {
    4737         479 :     SolarMutexGuard aGuard;
    4738         958 :     uno::Reference<table::XCellRange> xRange(GetObjectByIndex_Impl(nIndex));
    4739         479 :     if (xRange.is())
    4740         954 :         return uno::makeAny(xRange);
    4741             :     else
    4742         481 :         throw lang::IndexOutOfBoundsException();
    4743             : }
    4744             : 
    4745           1 : uno::Type SAL_CALL ScCellRangesObj::getElementType() throw(uno::RuntimeException, std::exception)
    4746             : {
    4747           1 :     SolarMutexGuard aGuard;
    4748           1 :     return cppu::UnoType<table::XCellRange>::get();
    4749             : }
    4750             : 
    4751          49 : sal_Bool SAL_CALL ScCellRangesObj::hasElements() throw(uno::RuntimeException, std::exception)
    4752             : {
    4753          49 :     SolarMutexGuard aGuard;
    4754          49 :     const ScRangeList& rRanges = GetRangeList();
    4755          49 :     return !rRanges.empty();
    4756             : }
    4757             : 
    4758             : // XServiceInfo
    4759           4 : OUString SAL_CALL ScCellRangesObj::getImplementationName() throw(uno::RuntimeException, std::exception)
    4760             : {
    4761           4 :     return OUString( "ScCellRangesObj" );
    4762             : }
    4763             : 
    4764          12 : sal_Bool SAL_CALL ScCellRangesObj::supportsService( const OUString& rServiceName )
    4765             :                                                     throw(uno::RuntimeException, std::exception)
    4766             : {
    4767          12 :     return cppu::supportsService(this, rServiceName);
    4768             : }
    4769             : 
    4770          12 : uno::Sequence<OUString> SAL_CALL ScCellRangesObj::getSupportedServiceNames()
    4771             :                                                     throw(uno::RuntimeException, std::exception)
    4772             : {
    4773          12 :     uno::Sequence<OUString> aRet(4);
    4774          12 :     OUString* pArray = aRet.getArray();
    4775          12 :     pArray[0] = SCSHEETCELLRANGES_SERVICE;
    4776          12 :     pArray[1] = SCCELLPROPERTIES_SERVICE;
    4777          12 :     pArray[2] = SCCHARPROPERTIES_SERVICE;
    4778          12 :     pArray[3] = SCPARAPROPERTIES_SERVICE;
    4779          12 :     return aRet;
    4780             : }
    4781             : 
    4782           0 : uno::Reference<table::XCellRange> ScCellRangeObj::CreateRangeFromDoc( ScDocument* pDoc, const ScRange& rR )
    4783             : {
    4784           0 :     SfxObjectShell* pObjSh = pDoc->GetDocumentShell();
    4785           0 :     if ( pObjSh && pObjSh->ISA(ScDocShell) )
    4786           0 :         return new ScCellRangeObj( static_cast<ScDocShell*>(pObjSh), rR );
    4787           0 :     return NULL;
    4788             : }
    4789             : 
    4790       31978 : ScCellRangeObj::ScCellRangeObj(ScDocShell* pDocSh, const ScRange& rR) :
    4791             :     ScCellRangesBase( pDocSh, rR ),
    4792       31978 :     pRangePropSet( lcl_GetRangePropertySet() ),
    4793       63956 :     aRange( rR )
    4794             : {
    4795       31978 :     aRange.Justify();       // Anfang / Ende richtig
    4796       31978 : }
    4797             : 
    4798       40887 : ScCellRangeObj::~ScCellRangeObj()
    4799             : {
    4800       40887 : }
    4801             : 
    4802        2213 : void ScCellRangeObj::RefChanged()
    4803             : {
    4804        2213 :     ScCellRangesBase::RefChanged();
    4805             : 
    4806        2213 :     const ScRangeList& rRanges = GetRangeList();
    4807             :     OSL_ENSURE(rRanges.size() == 1, "was fuer Ranges ?!?!");
    4808        2213 :     if ( !rRanges.empty() )
    4809             :     {
    4810        2187 :         const ScRange* pFirst = rRanges[0];
    4811        2187 :         aRange = ScRange(*pFirst);
    4812        2187 :         aRange.Justify();
    4813             :     }
    4814        2213 : }
    4815             : 
    4816      245781 : uno::Any SAL_CALL ScCellRangeObj::queryInterface( const uno::Type& rType )
    4817             :                                                 throw(uno::RuntimeException, std::exception)
    4818             : {
    4819      245781 :     SC_QUERYINTERFACE( sheet::XCellRangeAddressable )
    4820      238990 :     SC_QUERYINTERFACE( table::XCellRange )
    4821      229415 :     SC_QUERYINTERFACE( sheet::XSheetCellRange )
    4822      225781 :     SC_QUERYINTERFACE( sheet::XArrayFormulaRange )
    4823      225779 :     SC_QUERYINTERFACE( sheet::XArrayFormulaTokens )
    4824      225779 :     SC_QUERYINTERFACE( sheet::XCellRangeData )
    4825      225755 :     SC_QUERYINTERFACE( sheet::XCellRangeFormula )
    4826      225753 :     SC_QUERYINTERFACE( sheet::XMultipleOperation )
    4827      225752 :     SC_QUERYINTERFACE( util::XMergeable )
    4828      225744 :     SC_QUERYINTERFACE( sheet::XCellSeries )
    4829      225734 :     SC_QUERYINTERFACE( table::XAutoFormattable )
    4830      225734 :     SC_QUERYINTERFACE( util::XSortable )
    4831      225733 :     SC_QUERYINTERFACE( sheet::XSheetFilterableEx )
    4832      225732 :     SC_QUERYINTERFACE( sheet::XSheetFilterable )
    4833      225730 :     SC_QUERYINTERFACE( sheet::XSubTotalCalculatable )
    4834      225724 :     SC_QUERYINTERFACE( table::XColumnRowRange )
    4835      219656 :     SC_QUERYINTERFACE( util::XImportable )
    4836      219653 :     SC_QUERYINTERFACE( sheet::XCellFormatRangesSupplier )
    4837      219650 :     SC_QUERYINTERFACE( sheet::XUniqueCellFormatRangesSupplier )
    4838             : 
    4839      219614 :     return ScCellRangesBase::queryInterface( rType );
    4840             : }
    4841             : 
    4842      783287 : void SAL_CALL ScCellRangeObj::acquire() throw()
    4843             : {
    4844      783287 :     ScCellRangesBase::acquire();
    4845      783287 : }
    4846             : 
    4847      783176 : void SAL_CALL ScCellRangeObj::release() throw()
    4848             : {
    4849      783176 :     ScCellRangesBase::release();
    4850      783176 : }
    4851             : 
    4852           5 : uno::Sequence<uno::Type> SAL_CALL ScCellRangeObj::getTypes() throw(uno::RuntimeException, std::exception)
    4853             : {
    4854           5 :     static uno::Sequence<uno::Type> aTypes;
    4855           5 :     if ( aTypes.getLength() == 0 )
    4856             :     {
    4857           2 :         uno::Sequence<uno::Type> aParentTypes(ScCellRangesBase::getTypes());
    4858           2 :         long nParentLen = aParentTypes.getLength();
    4859           2 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    4860             : 
    4861           2 :         aTypes.realloc( nParentLen + 17 );
    4862           2 :         uno::Type* pPtr = aTypes.getArray();
    4863           2 :         pPtr[nParentLen + 0] = cppu::UnoType<sheet::XCellRangeAddressable>::get();
    4864           2 :         pPtr[nParentLen + 1] = cppu::UnoType<sheet::XSheetCellRange>::get();
    4865           2 :         pPtr[nParentLen + 2] = cppu::UnoType<sheet::XArrayFormulaRange>::get();
    4866           2 :         pPtr[nParentLen + 3] = cppu::UnoType<sheet::XArrayFormulaTokens>::get();
    4867           2 :         pPtr[nParentLen + 4] = cppu::UnoType<sheet::XCellRangeData>::get();
    4868           2 :         pPtr[nParentLen + 5] = cppu::UnoType<sheet::XCellRangeFormula>::get();
    4869           2 :         pPtr[nParentLen + 6] = cppu::UnoType<sheet::XMultipleOperation>::get();
    4870           2 :         pPtr[nParentLen + 7] = cppu::UnoType<util::XMergeable>::get();
    4871           2 :         pPtr[nParentLen + 8] = cppu::UnoType<sheet::XCellSeries>::get();
    4872           2 :         pPtr[nParentLen + 9] = cppu::UnoType<table::XAutoFormattable>::get();
    4873           2 :         pPtr[nParentLen +10] = cppu::UnoType<util::XSortable>::get();
    4874           2 :         pPtr[nParentLen +11] = cppu::UnoType<sheet::XSheetFilterableEx>::get();
    4875           2 :         pPtr[nParentLen +12] = cppu::UnoType<sheet::XSubTotalCalculatable>::get();
    4876           2 :         pPtr[nParentLen +13] = cppu::UnoType<table::XColumnRowRange>::get();
    4877           2 :         pPtr[nParentLen +14] = cppu::UnoType<util::XImportable>::get();
    4878           2 :         pPtr[nParentLen +15] = cppu::UnoType<sheet::XCellFormatRangesSupplier>::get();
    4879           2 :         pPtr[nParentLen +16] = cppu::UnoType<sheet::XUniqueCellFormatRangesSupplier>::get();
    4880             : 
    4881          28 :         for (long i=0; i<nParentLen; i++)
    4882          28 :             pPtr[i] = pParentPtr[i];                // parent types first
    4883             :     }
    4884           5 :     return aTypes;
    4885             : }
    4886             : 
    4887           0 : uno::Sequence<sal_Int8> SAL_CALL ScCellRangeObj::getImplementationId()
    4888             :                                                     throw(uno::RuntimeException, std::exception)
    4889             : {
    4890           0 :     return css::uno::Sequence<sal_Int8>();
    4891             : }
    4892             : 
    4893             : // XCellRange
    4894             : 
    4895             : //  ColumnCount / RowCount sind weggefallen
    4896             : //! werden im Writer fuer Tabellen noch gebraucht ???
    4897             : 
    4898       15142 : uno::Reference<table::XCell> ScCellRangeObj::GetCellByPosition_Impl(
    4899             :                                         sal_Int32 nColumn, sal_Int32 nRow )
    4900             :                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
    4901             : {
    4902       15142 :     ScDocShell* pDocSh = GetDocShell();
    4903       15142 :     if (!pDocSh)
    4904           0 :         throw uno::RuntimeException();
    4905             : 
    4906       15142 :     if ( nColumn >= 0 && nRow >= 0 )
    4907             :     {
    4908       15141 :         sal_Int32 nPosX = aRange.aStart.Col() + nColumn;
    4909       15141 :         sal_Int32 nPosY = aRange.aStart.Row() + nRow;
    4910             : 
    4911       15141 :         if ( nPosX <= aRange.aEnd.Col() && nPosY <= aRange.aEnd.Row() )
    4912             :         {
    4913       15141 :             ScAddress aNew( (SCCOL)nPosX, (SCROW)nPosY, aRange.aStart.Tab() );
    4914       30282 :             return new ScCellObj( pDocSh, aNew );
    4915             :         }
    4916             :     }
    4917             : 
    4918           1 :     throw lang::IndexOutOfBoundsException();
    4919             : }
    4920             : 
    4921        8544 : uno::Reference<table::XCell> SAL_CALL ScCellRangeObj::getCellByPosition(
    4922             :                                         sal_Int32 nColumn, sal_Int32 nRow )
    4923             :                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
    4924             : {
    4925        8544 :     SolarMutexGuard aGuard;
    4926             : 
    4927        8544 :     return GetCellByPosition_Impl(nColumn, nRow);
    4928             : }
    4929             : 
    4930        7429 : uno::Reference<table::XCellRange> SAL_CALL ScCellRangeObj::getCellRangeByPosition(
    4931             :                 sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom )
    4932             :                                     throw(lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
    4933             : {
    4934        7429 :     SolarMutexGuard aGuard;
    4935             : 
    4936        7429 :     ScDocShell* pDocSh = GetDocShell();
    4937        7429 :     if (!pDocSh)
    4938           0 :         throw uno::RuntimeException();
    4939             : 
    4940        7429 :     if ( nLeft >= 0 && nTop >= 0 && nRight >= 0 && nBottom >= 0 )
    4941             :     {
    4942        7428 :         sal_Int32 nStartX = aRange.aStart.Col() + nLeft;
    4943        7428 :         sal_Int32 nStartY = aRange.aStart.Row() + nTop;
    4944        7428 :         sal_Int32 nEndX = aRange.aStart.Col() + nRight;
    4945        7428 :         sal_Int32 nEndY = aRange.aStart.Row() + nBottom;
    4946             : 
    4947       14856 :         if ( nStartX <= nEndX && nEndX <= aRange.aEnd.Col() &&
    4948       14856 :              nStartY <= nEndY && nEndY <= aRange.aEnd.Row() )
    4949             :         {
    4950        7428 :             ScRange aNew( (SCCOL)nStartX, (SCROW)nStartY, aRange.aStart.Tab(),
    4951       14856 :                           (SCCOL)nEndX, (SCROW)nEndY, aRange.aEnd.Tab() );
    4952       14856 :             return new ScCellRangeObj( pDocSh, aNew );
    4953             :         }
    4954             :     }
    4955             : 
    4956        7428 :     throw lang::IndexOutOfBoundsException();
    4957             : }
    4958             : 
    4959          94 : uno::Reference<table::XCellRange> SAL_CALL ScCellRangeObj::getCellRangeByName(
    4960             :                         const OUString& aName ) throw(uno::RuntimeException, std::exception)
    4961             : {
    4962          94 :     return getCellRangeByName( aName, ScAddress::detailsOOOa1 );
    4963             : }
    4964             : 
    4965          94 : uno::Reference<table::XCellRange>  ScCellRangeObj::getCellRangeByName(
    4966             :                         const OUString& aName, const ScAddress::Details& rDetails  ) throw(uno::RuntimeException)
    4967             : {
    4968             :     //  name refers to the whole document (with the range's table as default),
    4969             :     //  valid only if the range is within this range
    4970             : 
    4971          94 :     SolarMutexGuard aGuard;
    4972          94 :     ScDocShell* pDocSh = GetDocShell();
    4973          94 :     if ( pDocSh )
    4974             :     {
    4975          94 :         ScDocument& rDoc = pDocSh->GetDocument();
    4976          94 :         SCTAB nTab = aRange.aStart.Tab();
    4977             : 
    4978          94 :         ScRange aCellRange;
    4979          94 :         bool bFound = false;
    4980          94 :         OUString aString(aName);
    4981          94 :         sal_uInt16 nParse = aCellRange.ParseAny( aString, &rDoc, rDetails );
    4982          94 :         if ( nParse & SCA_VALID )
    4983             :         {
    4984          94 :             if ( !(nParse & SCA_TAB_3D) )   // keine Tabelle angegeben -> auf dieser Tabelle
    4985             :             {
    4986          61 :                 aCellRange.aStart.SetTab(nTab);
    4987          61 :                 aCellRange.aEnd.SetTab(nTab);
    4988             :             }
    4989          94 :             bFound = true;
    4990             :         }
    4991             :         else
    4992             :         {
    4993           0 :             ScRangeUtil aRangeUtil;
    4994           0 :             if ( ScRangeUtil::MakeRangeFromName( aString, &rDoc, nTab, aCellRange, RUTL_NAMES ) ||
    4995           0 :                  ScRangeUtil::MakeRangeFromName( aString, &rDoc, nTab, aCellRange, RUTL_DBASE ) )
    4996           0 :                 bFound = true;
    4997             :         }
    4998             : 
    4999          94 :         if (bFound)         // valid only if within this object's range
    5000             :         {
    5001          94 :             if (!aRange.In(aCellRange))
    5002           0 :                 bFound = false;
    5003             :         }
    5004             : 
    5005          94 :         if (bFound)
    5006             :         {
    5007          94 :             if ( aCellRange.aStart == aCellRange.aEnd )
    5008           4 :                 return new ScCellObj( pDocSh, aCellRange.aStart );
    5009             :             else
    5010          90 :                 return new ScCellRangeObj( pDocSh, aCellRange );
    5011           0 :         }
    5012             :     }
    5013             : 
    5014          94 :     throw uno::RuntimeException();
    5015             : }
    5016             : 
    5017             : // XColumnRowRange
    5018             : 
    5019        1508 : uno::Reference<table::XTableColumns> SAL_CALL ScCellRangeObj::getColumns() throw(uno::RuntimeException, std::exception)
    5020             : {
    5021        1508 :     SolarMutexGuard aGuard;
    5022        1508 :     ScDocShell* pDocSh = GetDocShell();
    5023        1508 :     if (pDocSh)
    5024        1508 :         return new ScTableColumnsObj( pDocSh, aRange.aStart.Tab(),
    5025        1508 :                                         aRange.aStart.Col(), aRange.aEnd.Col() );
    5026             : 
    5027             :     OSL_FAIL("Dokument ungueltig");
    5028           0 :     return NULL;
    5029             : }
    5030             : 
    5031        4101 : uno::Reference<table::XTableRows> SAL_CALL ScCellRangeObj::getRows() throw(uno::RuntimeException, std::exception)
    5032             : {
    5033        4101 :     SolarMutexGuard aGuard;
    5034        4101 :     ScDocShell* pDocSh = GetDocShell();
    5035        4101 :     if (pDocSh)
    5036        4101 :         return new ScTableRowsObj( pDocSh, aRange.aStart.Tab(),
    5037        4101 :                                     aRange.aStart.Row(), aRange.aEnd.Row() );
    5038             : 
    5039             :     OSL_FAIL("Dokument ungueltig");
    5040           0 :     return NULL;
    5041             : }
    5042             : 
    5043             : // XAddressableCellRange
    5044             : 
    5045        7695 : table::CellRangeAddress SAL_CALL ScCellRangeObj::getRangeAddress() throw(uno::RuntimeException, std::exception)
    5046             : {
    5047        7695 :     SolarMutexGuard aGuard;
    5048        7695 :     table::CellRangeAddress aRet;
    5049        7695 :     ScUnoConversion::FillApiRange( aRet, aRange );
    5050        7695 :     return aRet;
    5051             : }
    5052             : 
    5053             : // XSheetCellRange
    5054             : 
    5055        1432 : uno::Reference<sheet::XSpreadsheet> SAL_CALL ScCellRangeObj::getSpreadsheet()
    5056             :                                                 throw(uno::RuntimeException, std::exception)
    5057             : {
    5058        1432 :     SolarMutexGuard aGuard;
    5059        1432 :     ScDocShell* pDocSh = GetDocShell();
    5060        1432 :     if (pDocSh)
    5061        1432 :         return new ScTableSheetObj( pDocSh, aRange.aStart.Tab() );
    5062             : 
    5063             :     OSL_FAIL("Dokument ungueltig");
    5064           0 :     return NULL;
    5065             : }
    5066             : 
    5067             : // XArrayFormulaRange
    5068             : 
    5069           2 : OUString SAL_CALL ScCellRangeObj::getArrayFormula() throw(uno::RuntimeException, std::exception)
    5070             : {
    5071           2 :     SolarMutexGuard aGuard;
    5072             : 
    5073             :     //  Matrix-Formel, wenn eindeutig Teil einer Matrix,
    5074             :     //  also wenn Anfang und Ende des Blocks zur selben Matrix gehoeren.
    5075             :     //  Sonst Leerstring.
    5076             : 
    5077           2 :     ScDocShell* pDocSh = GetDocShell();
    5078           2 :     if (!pDocSh)
    5079           0 :         return EMPTY_OUSTRING;
    5080             : 
    5081           4 :     OUString aFormula;
    5082             : 
    5083           2 :     ScDocument& rDoc = pDocSh->GetDocument();
    5084           4 :     ScRefCellValue aCell1;
    5085           4 :     ScRefCellValue aCell2;
    5086           2 :     aCell1.assign(rDoc, aRange.aStart);
    5087           2 :     aCell2.assign(rDoc, aRange.aEnd);
    5088           2 :     if (aCell1.meType == CELLTYPE_FORMULA && aCell2.meType == CELLTYPE_FORMULA)
    5089             :     {
    5090           1 :         const ScFormulaCell* pFCell1 = aCell1.mpFormula;
    5091           1 :         const ScFormulaCell* pFCell2 = aCell2.mpFormula;
    5092           1 :         ScAddress aStart1;
    5093           1 :         ScAddress aStart2;
    5094           1 :         if (pFCell1->GetMatrixOrigin(aStart1) && pFCell2->GetMatrixOrigin(aStart2))
    5095             :         {
    5096           1 :             if (aStart1 == aStart2)               // beides dieselbe Matrix
    5097           1 :                 pFCell1->GetFormula(aFormula);    // egal, von welcher Zelle
    5098             :         }
    5099             :     }
    5100           4 :     return aFormula;
    5101             : }
    5102             : 
    5103           1 : void ScCellRangeObj::SetArrayFormula_Impl(const OUString& rFormula,
    5104             :     const OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar)
    5105             :         throw (uno::RuntimeException, std::exception)
    5106             : {
    5107           1 :     ScDocShell* pDocSh = GetDocShell();
    5108           1 :     if (pDocSh)
    5109             :     {
    5110           1 :         if ( !rFormula.isEmpty() )
    5111             :         {
    5112           1 :             if ( ScTableSheetObj::getImplementation( static_cast<cppu::OWeakObject*>(this) ) )
    5113             :             {
    5114             :                 //  don't set array formula for sheet object
    5115           0 :                 throw uno::RuntimeException();
    5116             :             }
    5117             : 
    5118           1 :             pDocSh->GetDocFunc().EnterMatrix( aRange, NULL, NULL, rFormula, true, true, rFormulaNmsp, eGrammar );
    5119             :         }
    5120             :         else
    5121             :         {
    5122             :             //  empty string -> erase array formula
    5123           0 :             ScMarkData aMark;
    5124           0 :             aMark.SetMarkArea( aRange );
    5125           0 :             aMark.SelectTable( aRange.aStart.Tab(), true );
    5126           0 :             pDocSh->GetDocFunc().DeleteContents( aMark, IDF_CONTENTS, true, true );
    5127             :         }
    5128             :     }
    5129           1 : }
    5130             : 
    5131           1 : void SAL_CALL ScCellRangeObj::setArrayFormula( const OUString& aFormula )
    5132             :                                                 throw(uno::RuntimeException, std::exception)
    5133             : {
    5134           1 :     SolarMutexGuard aGuard;
    5135             :     // GRAM_PODF_A1 for API compatibility.
    5136           1 :     SetArrayFormula_Impl( aFormula, OUString(), formula::FormulaGrammar::GRAM_PODF_A1);
    5137           1 : }
    5138             : 
    5139             : // XArrayFormulaTokens
    5140           0 : uno::Sequence<sheet::FormulaToken> SAL_CALL ScCellRangeObj::getArrayTokens()
    5141             :     throw (uno::RuntimeException, std::exception)
    5142             : {
    5143           0 :     SolarMutexGuard aGuard;
    5144             : 
    5145             :     // same cell logic as in getArrayFormula
    5146             : 
    5147           0 :     uno::Sequence<sheet::FormulaToken> aSequence;
    5148           0 :     ScDocShell* pDocSh = GetDocShell();
    5149           0 :     if (!pDocSh)
    5150           0 :         return aSequence;
    5151             : 
    5152           0 :     ScDocument& rDoc = pDocSh->GetDocument();
    5153           0 :     ScRefCellValue aCell1;
    5154           0 :     ScRefCellValue aCell2;
    5155           0 :     aCell1.assign(rDoc, aRange.aStart);
    5156           0 :     aCell2.assign(rDoc, aRange.aEnd);
    5157           0 :     if (aCell1.meType == CELLTYPE_FORMULA && aCell2.meType == CELLTYPE_FORMULA)
    5158             :     {
    5159           0 :         const ScFormulaCell* pFCell1 = aCell1.mpFormula;
    5160           0 :         const ScFormulaCell* pFCell2 = aCell2.mpFormula;
    5161           0 :         ScAddress aStart1;
    5162           0 :         ScAddress aStart2;
    5163           0 :         if (pFCell1->GetMatrixOrigin(aStart1) && pFCell2->GetMatrixOrigin(aStart2))
    5164             :         {
    5165           0 :             if (aStart1 == aStart2)
    5166             :             {
    5167           0 :                 const ScTokenArray* pTokenArray = pFCell1->GetCode();
    5168           0 :                 if (pTokenArray)
    5169           0 :                     (void)ScTokenConversion::ConvertToTokenSequence(rDoc, aSequence, *pTokenArray);
    5170             :             }
    5171             :         }
    5172             :     }
    5173             : 
    5174           0 :     return aSequence;
    5175             : }
    5176             : 
    5177           0 : void SAL_CALL ScCellRangeObj::setArrayTokens( const uno::Sequence<sheet::FormulaToken>& rTokens ) throw(uno::RuntimeException, std::exception)
    5178             : {
    5179           0 :     SolarMutexGuard aGuard;
    5180           0 :     ScDocShell* pDocSh = GetDocShell();
    5181           0 :     if ( pDocSh )
    5182             :     {
    5183           0 :         if ( rTokens.getLength() )
    5184             :         {
    5185           0 :             if ( ScTableSheetObj::getImplementation( static_cast<cppu::OWeakObject*>(this) ) )
    5186             :             {
    5187           0 :                 throw uno::RuntimeException();
    5188             :             }
    5189             : 
    5190           0 :             ScDocument& rDoc = pDocSh->GetDocument();
    5191           0 :             ScTokenArray aTokenArray;
    5192           0 :             (void)ScTokenConversion::ConvertToTokenArray( rDoc, aTokenArray, rTokens );
    5193             : 
    5194             :             // Actually GRAM_PODF_A1 is a don't-care here because of the token
    5195             :             // array being set, it fits with other API compatibility grammars
    5196             :             // though.
    5197           0 :             pDocSh->GetDocFunc().EnterMatrix( aRange, NULL, &aTokenArray, EMPTY_OUSTRING, true, true, EMPTY_OUSTRING, formula::FormulaGrammar::GRAM_PODF_A1 );
    5198             :         }
    5199             :         else
    5200             :         {
    5201             :             //  empty sequence -> erase array formula
    5202           0 :             ScMarkData aMark;
    5203           0 :             aMark.SetMarkArea( aRange );
    5204           0 :             aMark.SelectTable( aRange.aStart.Tab(), true );
    5205           0 :             pDocSh->GetDocFunc().DeleteContents( aMark, IDF_CONTENTS, true, true );
    5206             :         }
    5207           0 :     }
    5208           0 : }
    5209             : 
    5210             : // XCellRangeData
    5211             : 
    5212          17 : uno::Sequence< uno::Sequence<uno::Any> > SAL_CALL ScCellRangeObj::getDataArray()
    5213             :                                     throw(uno::RuntimeException, std::exception)
    5214             : {
    5215          17 :     SolarMutexGuard aGuard;
    5216             : 
    5217          17 :     if ( ScTableSheetObj::getImplementation( static_cast<cppu::OWeakObject*>(this) ) )
    5218             :     {
    5219             :         //  don't create a data array for the sheet
    5220           0 :         throw uno::RuntimeException();
    5221             :     }
    5222             : 
    5223          17 :     ScDocShell* pDocSh = GetDocShell();
    5224          17 :     if (pDocSh)
    5225             :     {
    5226          17 :         uno::Any aAny;
    5227             :         // bAllowNV = TRUE: errors as void
    5228          17 :         if ( ScRangeToSequence::FillMixedArray( aAny, &pDocSh->GetDocument(), aRange, true ) )
    5229             :         {
    5230          17 :             uno::Sequence< uno::Sequence<uno::Any> > aSeq;
    5231          17 :             if ( aAny >>= aSeq )
    5232          34 :                 return aSeq;            // success
    5233           0 :         }
    5234             :     }
    5235             : 
    5236          17 :     throw uno::RuntimeException();      // no other exceptions specified
    5237             : }
    5238             : 
    5239           8 : void SAL_CALL ScCellRangeObj::setDataArray(
    5240             :                         const uno::Sequence< uno::Sequence<uno::Any> >& aArray )
    5241             :                                     throw(uno::RuntimeException, std::exception)
    5242             : {
    5243           8 :     SolarMutexGuard aGuard;
    5244             : 
    5245           8 :     bool bDone = false;
    5246           8 :     ScDocShell* pDocSh = GetDocShell();
    5247           8 :     if (pDocSh)
    5248             :     {
    5249             :         //! move lcl_PutDataArray to docfunc?
    5250           8 :         bDone = lcl_PutDataArray( *pDocSh, aRange, aArray );
    5251             :     }
    5252             : 
    5253           8 :     if (!bDone)
    5254           0 :         throw uno::RuntimeException();      // no other exceptions specified
    5255           8 : }
    5256             : 
    5257             : // XCellRangeFormula
    5258             : 
    5259           5 : uno::Sequence< uno::Sequence<OUString> > SAL_CALL ScCellRangeObj::getFormulaArray()
    5260             :                                     throw(uno::RuntimeException, std::exception)
    5261             : {
    5262           5 :     SolarMutexGuard aGuard;
    5263             : 
    5264           5 :     if ( ScTableSheetObj::getImplementation( static_cast<cppu::OWeakObject*>(this) ) )
    5265             :     {
    5266             :         //  don't create a data array for the sheet
    5267           0 :         throw uno::RuntimeException();
    5268             :     }
    5269             : 
    5270           5 :     ScDocShell* pDocSh = GetDocShell();
    5271           5 :     if (pDocSh)
    5272             :     {
    5273           5 :         SCCOL nStartCol = aRange.aStart.Col();
    5274           5 :         SCROW nStartRow = aRange.aStart.Row();
    5275           5 :         SCCOL nEndCol = aRange.aEnd.Col();
    5276           5 :         SCROW nEndRow = aRange.aEnd.Row();
    5277           5 :         SCCOL nColCount = nEndCol + 1 - nStartCol;
    5278           5 :         SCROW nRowCount = nEndRow + 1 - nStartRow;
    5279           5 :         SCTAB nTab = aRange.aStart.Tab();
    5280             : 
    5281           5 :         uno::Sequence< uno::Sequence<OUString> > aRowSeq( nRowCount );
    5282           5 :         uno::Sequence<OUString>* pRowAry = aRowSeq.getArray();
    5283          30 :         for (SCROW nRowIndex = 0; nRowIndex < nRowCount; nRowIndex++)
    5284             :         {
    5285          25 :             uno::Sequence<OUString> aColSeq( nColCount );
    5286          25 :             OUString* pColAry = aColSeq.getArray();
    5287         120 :             for (SCCOL nColIndex = 0; nColIndex < nColCount; nColIndex++)
    5288         190 :                 pColAry[nColIndex] = lcl_GetInputString( pDocSh->GetDocument(),
    5289          95 :                                     ScAddress( nStartCol+nColIndex, nStartRow+nRowIndex, nTab ), true );
    5290             : 
    5291          25 :             pRowAry[nRowIndex] = aColSeq;
    5292          25 :         }
    5293             : 
    5294          10 :         return aRowSeq;
    5295             :     }
    5296             : 
    5297           5 :     throw uno::RuntimeException();      // no other exceptions specified
    5298             : }
    5299             : 
    5300           2 : void SAL_CALL ScCellRangeObj::setFormulaArray(
    5301             :                         const uno::Sequence< uno::Sequence<OUString> >& aArray )
    5302             :                                     throw(uno::RuntimeException, std::exception)
    5303             : {
    5304           2 :     SolarMutexGuard aGuard;
    5305             : 
    5306           2 :     bool bDone = false;
    5307           2 :     ScDocShell* pDocSh = GetDocShell();
    5308           2 :     if (pDocSh)
    5309             :     {
    5310           2 :         ScExternalRefManager::ApiGuard aExtRefGuard(&pDocSh->GetDocument());
    5311             : 
    5312             :         // GRAM_PODF_A1 for API compatibility.
    5313           2 :         bDone = lcl_PutFormulaArray( *pDocSh, aRange, aArray, formula::FormulaGrammar::GRAM_PODF_A1 );
    5314             :     }
    5315             : 
    5316           2 :     if (!bDone)
    5317           0 :         throw uno::RuntimeException();      // no other exceptions specified
    5318           2 : }
    5319             : 
    5320             : // XMultipleOperation
    5321             : 
    5322           3 : void SAL_CALL ScCellRangeObj::setTableOperation( const table::CellRangeAddress& aFormulaRange,
    5323             :                                         sheet::TableOperationMode nMode,
    5324             :                                         const table::CellAddress& aColumnCell,
    5325             :                                         const table::CellAddress& aRowCell )
    5326             :                                     throw(uno::RuntimeException, std::exception)
    5327             : {
    5328           3 :     SolarMutexGuard aGuard;
    5329           3 :     ScDocShell* pDocSh = GetDocShell();
    5330           3 :     if (pDocSh)
    5331             :     {
    5332           3 :         bool bError = false;
    5333           3 :         ScTabOpParam aParam;
    5334           6 :         aParam.aRefFormulaCell = ScRefAddress( (SCCOL)aFormulaRange.StartColumn,
    5335             :                                               (SCROW)aFormulaRange.StartRow, aFormulaRange.Sheet,
    5336           3 :                                               false, false, false );
    5337           6 :         aParam.aRefFormulaEnd  = ScRefAddress( (SCCOL)aFormulaRange.EndColumn,
    5338             :                                               (SCROW)aFormulaRange.EndRow, aFormulaRange.Sheet,
    5339           3 :                                               false, false, false );
    5340           6 :         aParam.aRefRowCell     = ScRefAddress( (SCCOL)aRowCell.Column,
    5341             :                                               (SCROW)aRowCell.Row, aRowCell.Sheet,
    5342           3 :                                               false, false, false );
    5343           6 :         aParam.aRefColCell     = ScRefAddress( (SCCOL)aColumnCell.Column,
    5344             :                                               (SCROW)aColumnCell.Row, aColumnCell.Sheet,
    5345           3 :                                               false, false, false );
    5346             : 
    5347           3 :         switch (nMode)
    5348             :         {
    5349             :             case sheet::TableOperationMode_COLUMN:
    5350           1 :                 aParam.meMode = ScTabOpParam::Column;
    5351           1 :                 break;
    5352             :             case sheet::TableOperationMode_ROW:
    5353           1 :                 aParam.meMode = ScTabOpParam::Row;
    5354           1 :                 break;
    5355             :             case sheet::TableOperationMode_BOTH:
    5356           1 :                 aParam.meMode = ScTabOpParam::Both;
    5357           1 :                 break;
    5358             :             default:
    5359           0 :                 bError = true;
    5360             :         }
    5361             : 
    5362           3 :         if (!bError)
    5363           3 :             pDocSh->GetDocFunc().TabOp( aRange, NULL, aParam, true, true );
    5364           3 :     }
    5365           3 : }
    5366             : 
    5367             : // XMergeable
    5368             : 
    5369          10 : void SAL_CALL ScCellRangeObj::merge( sal_Bool bMerge ) throw(uno::RuntimeException, std::exception)
    5370             : {
    5371          10 :     SolarMutexGuard aGuard;
    5372          10 :     ScDocShell* pDocSh = GetDocShell();
    5373          10 :     if ( pDocSh )
    5374             :     {
    5375             :         ScCellMergeOption aMergeOption(
    5376          10 :             aRange.aStart.Col(), aRange.aStart.Row(),
    5377          20 :             aRange.aEnd.Col(), aRange.aEnd.Row(), false);
    5378          10 :         aMergeOption.maTabs.insert(aRange.aStart.Tab());
    5379          10 :         if ( bMerge )
    5380           5 :             pDocSh->GetDocFunc().MergeCells( aMergeOption, false, true, true );
    5381             :         else
    5382           5 :             pDocSh->GetDocFunc().UnmergeCells( aMergeOption, true );
    5383             : 
    5384             :         //! Fehler abfangen?
    5385          10 :     }
    5386          10 : }
    5387             : 
    5388           4 : sal_Bool SAL_CALL ScCellRangeObj::getIsMerged() throw(uno::RuntimeException, std::exception)
    5389             : {
    5390           4 :     SolarMutexGuard aGuard;
    5391           4 :     ScDocShell* pDocSh = GetDocShell();
    5392           4 :     return pDocSh && pDocSh->GetDocument().HasAttrib( aRange, HASATTR_MERGED );
    5393             : }
    5394             : 
    5395             : // XCellSeries
    5396             : 
    5397          13 : void SAL_CALL ScCellRangeObj::fillSeries( sheet::FillDirection nFillDirection,
    5398             :                         sheet::FillMode nFillMode, sheet::FillDateMode nFillDateMode,
    5399             :                         double fStep, double fEndValue ) throw(uno::RuntimeException, std::exception)
    5400             : {
    5401          13 :     SolarMutexGuard aGuard;
    5402          13 :     ScDocShell* pDocSh = GetDocShell();
    5403          13 :     if ( pDocSh )
    5404             :     {
    5405          13 :         bool bError = false;
    5406             : 
    5407          13 :         FillDir eDir = FILL_TO_BOTTOM;
    5408          13 :         switch (nFillDirection)
    5409             :         {
    5410             :             case sheet::FillDirection_TO_BOTTOM:
    5411           4 :                 eDir = FILL_TO_BOTTOM;
    5412           4 :                 break;
    5413             :             case sheet::FillDirection_TO_RIGHT:
    5414           5 :                 eDir = FILL_TO_RIGHT;
    5415           5 :                 break;
    5416             :             case sheet::FillDirection_TO_TOP:
    5417           2 :                 eDir = FILL_TO_TOP;
    5418           2 :                 break;
    5419             :             case sheet::FillDirection_TO_LEFT:
    5420           2 :                 eDir = FILL_TO_LEFT;
    5421           2 :                 break;
    5422             :             default:
    5423           0 :                 bError = true;
    5424             :         }
    5425             : 
    5426          13 :         FillCmd eCmd = FILL_SIMPLE;
    5427          13 :         switch ( nFillMode )
    5428             :         {
    5429             :             case sheet::FillMode_SIMPLE:
    5430           9 :                 eCmd = FILL_SIMPLE;
    5431           9 :                 break;
    5432             :             case sheet::FillMode_LINEAR:
    5433           2 :                 eCmd = FILL_LINEAR;
    5434           2 :                 break;
    5435             :             case sheet::FillMode_GROWTH:
    5436           2 :                 eCmd = FILL_GROWTH;
    5437           2 :                 break;
    5438             :             case sheet::FillMode_DATE:
    5439           0 :                 eCmd = FILL_DATE;
    5440           0 :                 break;
    5441             :             case sheet::FillMode_AUTO:
    5442           0 :                 eCmd = FILL_AUTO;
    5443           0 :                 break;
    5444             :             default:
    5445           0 :                 bError = true;
    5446             :         }
    5447             : 
    5448          13 :         FillDateCmd eDateCmd = FILL_DAY;
    5449          13 :         switch ( nFillDateMode )
    5450             :         {
    5451             :             case sheet::FillDateMode_FILL_DATE_DAY:
    5452          13 :                 eDateCmd = FILL_DAY;
    5453          13 :                 break;
    5454             :             case sheet::FillDateMode_FILL_DATE_WEEKDAY:
    5455           0 :                 eDateCmd = FILL_WEEKDAY;
    5456           0 :                 break;
    5457             :             case sheet::FillDateMode_FILL_DATE_MONTH:
    5458           0 :                 eDateCmd = FILL_MONTH;
    5459           0 :                 break;
    5460             :             case sheet::FillDateMode_FILL_DATE_YEAR:
    5461           0 :                 eDateCmd = FILL_YEAR;
    5462           0 :                 break;
    5463             :             default:
    5464           0 :                 bError = true;
    5465             :         }
    5466             : 
    5467          13 :         if (!bError)
    5468          13 :             pDocSh->GetDocFunc().FillSeries( aRange, NULL, eDir, eCmd, eDateCmd,
    5469          26 :                                                 MAXDOUBLE, fStep, fEndValue, true, true );
    5470          13 :     }
    5471          13 : }
    5472             : 
    5473           2 : void SAL_CALL ScCellRangeObj::fillAuto( sheet::FillDirection nFillDirection,
    5474             :                                 sal_Int32 nSourceCount ) throw(uno::RuntimeException, std::exception)
    5475             : {
    5476           2 :     SolarMutexGuard aGuard;
    5477           2 :     ScDocShell* pDocSh = GetDocShell();
    5478           2 :     if ( pDocSh && nSourceCount )
    5479             :     {
    5480           2 :         ScRange aSourceRange(aRange);
    5481           2 :         SCsCOLROW nCount = 0;                   // "Dest-Count"
    5482           2 :         FillDir eDir = FILL_TO_BOTTOM;
    5483           2 :         bool bError = false;
    5484           2 :         switch (nFillDirection)
    5485             :         {
    5486             :             case sheet::FillDirection_TO_BOTTOM:
    5487           1 :                 aSourceRange.aEnd.SetRow( static_cast<SCROW>( aSourceRange.aStart.Row() + nSourceCount - 1 ) );
    5488           1 :                 nCount = aRange.aEnd.Row() - aSourceRange.aEnd.Row();
    5489           1 :                 eDir = FILL_TO_BOTTOM;
    5490           1 :                 break;
    5491             :             case sheet::FillDirection_TO_RIGHT:
    5492           1 :                 aSourceRange.aEnd.SetCol( static_cast<SCCOL>( aSourceRange.aStart.Col() + nSourceCount - 1 ) );
    5493           1 :                 nCount = aRange.aEnd.Col() - aSourceRange.aEnd.Col();
    5494           1 :                 eDir = FILL_TO_RIGHT;
    5495           1 :                 break;
    5496             :             case sheet::FillDirection_TO_TOP:
    5497           0 :                 aSourceRange.aStart.SetRow( static_cast<SCROW>( aSourceRange.aEnd.Row() - nSourceCount + 1 ) );
    5498           0 :                 nCount = aSourceRange.aStart.Row() - aRange.aStart.Row();
    5499           0 :                 eDir = FILL_TO_TOP;
    5500           0 :                 break;
    5501             :             case sheet::FillDirection_TO_LEFT:
    5502           0 :                 aSourceRange.aStart.SetCol( static_cast<SCCOL>( aSourceRange.aEnd.Col() - nSourceCount + 1 ) );
    5503           0 :                 nCount = aSourceRange.aStart.Col() - aRange.aStart.Col();
    5504           0 :                 eDir = FILL_TO_LEFT;
    5505           0 :                 break;
    5506             :             default:
    5507           0 :                 bError = true;
    5508             :         }
    5509           2 :         if (nCount < 0 || nCount > MAXROW)      // overflow
    5510           0 :             bError = true;
    5511             : 
    5512           2 :         if (!bError)
    5513           2 :             pDocSh->GetDocFunc().FillAuto( aSourceRange, NULL, eDir, nCount, true, true );
    5514           2 :     }
    5515           2 : }
    5516             : 
    5517             : // XAutoFormattable
    5518             : 
    5519           0 : void SAL_CALL ScCellRangeObj::autoFormat( const OUString& aName )
    5520             :                     throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    5521             : {
    5522           0 :     SolarMutexGuard aGuard;
    5523           0 :     ScDocShell* pDocSh = GetDocShell();
    5524           0 :     if ( pDocSh )
    5525             :     {
    5526           0 :         ScAutoFormat* pAutoFormat = ScGlobal::GetOrCreateAutoFormat();
    5527           0 :         ScAutoFormat::const_iterator it = pAutoFormat->find(aName);
    5528           0 :         if (it != pAutoFormat->end())
    5529             :         {
    5530           0 :             ScAutoFormat::const_iterator itBeg = pAutoFormat->begin();
    5531           0 :             size_t nIndex = std::distance(itBeg, it);
    5532           0 :             pDocSh->GetDocFunc().AutoFormat(aRange, NULL, nIndex, true, true);
    5533             :         }
    5534             :         else
    5535           0 :             throw lang::IllegalArgumentException();
    5536           0 :     }
    5537           0 : }
    5538             : 
    5539             : // XSortable
    5540             : 
    5541           1 : uno::Sequence<beans::PropertyValue> SAL_CALL ScCellRangeObj::createSortDescriptor()
    5542             :                                                 throw(uno::RuntimeException, std::exception)
    5543             : {
    5544           1 :     SolarMutexGuard aGuard;
    5545           2 :     ScSortParam aParam;
    5546           1 :     ScDocShell* pDocSh = GetDocShell();
    5547           1 :     if ( pDocSh )
    5548             :     {
    5549             :         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
    5550           1 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
    5551           1 :         if (pData)
    5552             :         {
    5553           0 :             pData->GetSortParam(aParam);
    5554             : 
    5555             :             //  im SortDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5556           0 :             ScRange aDBRange;
    5557           0 :             pData->GetArea(aDBRange);
    5558             :             SCCOLROW nFieldStart = aParam.bByRow ?
    5559           0 :                 static_cast<SCCOLROW>(aDBRange.aStart.Col()) :
    5560           0 :                 static_cast<SCCOLROW>(aDBRange.aStart.Row());
    5561           0 :             for (sal_uInt16 i=0; i<aParam.GetSortKeyCount(); i++)
    5562           0 :                 if ( aParam.maKeyState[i].bDoSort && aParam.maKeyState[i].nField >= nFieldStart )
    5563           0 :                     aParam.maKeyState[i].nField -= nFieldStart;
    5564             :         }
    5565             :     }
    5566             : 
    5567           1 :     uno::Sequence<beans::PropertyValue> aSeq( ScSortDescriptor::GetPropertyCount() );
    5568           1 :     ScSortDescriptor::FillProperties( aSeq, aParam );
    5569           2 :     return aSeq;
    5570             : }
    5571             : 
    5572           4 : void SAL_CALL ScCellRangeObj::sort( const uno::Sequence<beans::PropertyValue>& aDescriptor )
    5573             :                                                 throw(uno::RuntimeException, std::exception)
    5574             : {
    5575           4 :     SolarMutexGuard aGuard;
    5576           4 :     ScDocShell* pDocSh = GetDocShell();
    5577           4 :     if (pDocSh)
    5578             :     {
    5579             :         sal_uInt16 i;
    5580           4 :         ScSortParam aParam;
    5581           4 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK ); // ggf. Bereich anlegen
    5582           4 :         if (pData)
    5583             :         {
    5584             :             //  alten Einstellungen holen, falls nicht alles neu gesetzt wird
    5585           4 :             pData->GetSortParam(aParam);
    5586             :             SCCOLROW nOldStart = aParam.bByRow ?
    5587           4 :                 static_cast<SCCOLROW>(aRange.aStart.Col()) :
    5588           8 :                 static_cast<SCCOLROW>(aRange.aStart.Row());
    5589          16 :             for (i=0; i<aParam.GetSortKeyCount(); i++)
    5590          12 :                 if ( aParam.maKeyState[i].bDoSort && aParam.maKeyState[i].nField >= nOldStart )
    5591           3 :                     aParam.maKeyState[i].nField -= nOldStart;
    5592             :         }
    5593             : 
    5594           4 :         ScSortDescriptor::FillSortParam( aParam, aDescriptor );
    5595             : 
    5596             :         //  im SortDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5597             :         //  ByRow kann bei FillSortParam umgesetzt worden sein
    5598             :         SCCOLROW nFieldStart = aParam.bByRow ?
    5599           4 :             static_cast<SCCOLROW>(aRange.aStart.Col()) :
    5600           8 :             static_cast<SCCOLROW>(aRange.aStart.Row());
    5601          16 :         for (i=0; i<aParam.GetSortKeyCount(); i++)
    5602          12 :             aParam.maKeyState[i].nField += nFieldStart;
    5603             : 
    5604           4 :         SCTAB nTab = aRange.aStart.Tab();
    5605           4 :         aParam.nCol1 = aRange.aStart.Col();
    5606           4 :         aParam.nRow1 = aRange.aStart.Row();
    5607           4 :         aParam.nCol2 = aRange.aEnd.Col();
    5608           4 :         aParam.nRow2 = aRange.aEnd.Row();
    5609             : 
    5610           4 :         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );       // ggf. Bereich anlegen
    5611             : 
    5612           8 :         ScDBDocFunc aFunc(*pDocSh); // Bereich muss angelegt sein
    5613           8 :         (void)aFunc.Sort( nTab, aParam, true, true, true );
    5614           4 :     }
    5615           4 : }
    5616             : 
    5617             : // XFilterable
    5618             : 
    5619           2 : uno::Reference<sheet::XSheetFilterDescriptor> SAL_CALL ScCellRangeObj::createFilterDescriptor(
    5620             :                                 sal_Bool bEmpty ) throw(uno::RuntimeException, std::exception)
    5621             : {
    5622           2 :     SolarMutexGuard aGuard;
    5623           2 :     ScDocShell* pDocSh = GetDocShell();
    5624           2 :     ScFilterDescriptor* pNew = new ScFilterDescriptor(pDocSh);
    5625           2 :     if ( !bEmpty && pDocSh )
    5626             :     {
    5627             :         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
    5628           0 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
    5629           0 :         if (pData)
    5630             :         {
    5631           0 :             ScQueryParam aParam;
    5632           0 :             pData->GetQueryParam(aParam);
    5633             :             //  im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5634           0 :             ScRange aDBRange;
    5635           0 :             pData->GetArea(aDBRange);
    5636             :             SCCOLROW nFieldStart = aParam.bByRow ?
    5637           0 :                 static_cast<SCCOLROW>(aDBRange.aStart.Col()) :
    5638           0 :                 static_cast<SCCOLROW>(aDBRange.aStart.Row());
    5639           0 :             SCSIZE nCount = aParam.GetEntryCount();
    5640           0 :             for (SCSIZE i=0; i<nCount; i++)
    5641             :             {
    5642           0 :                 ScQueryEntry& rEntry = aParam.GetEntry(i);
    5643           0 :                 if (rEntry.bDoQuery && rEntry.nField >= nFieldStart)
    5644           0 :                     rEntry.nField -= nFieldStart;
    5645             :             }
    5646           0 :             pNew->SetParam(aParam);
    5647             :         }
    5648             :     }
    5649           2 :     return pNew;
    5650             : }
    5651             : 
    5652           1 : void SAL_CALL ScCellRangeObj::filter( const uno::Reference<sheet::XSheetFilterDescriptor>& xDescriptor )
    5653             :                                                 throw(uno::RuntimeException, std::exception)
    5654             : {
    5655           1 :     SolarMutexGuard aGuard;
    5656             : 
    5657             :     //  das koennte theoretisch ein fremdes Objekt sein, also nur das
    5658             :     //  oeffentliche XSheetFilterDescriptor Interface benutzen, um
    5659             :     //  die Daten in ein ScFilterDescriptor Objekt zu kopieren:
    5660             :     //! wenn es schon ein ScFilterDescriptor ist, direkt per getImplementation?
    5661             : 
    5662           1 :     ScDocShell* pDocSh = GetDocShell();
    5663           2 :     ScFilterDescriptor aImpl(pDocSh);
    5664           2 :     uno::Reference< sheet::XSheetFilterDescriptor2 > xDescriptor2( xDescriptor, uno::UNO_QUERY );
    5665           1 :     if ( xDescriptor2.is() )
    5666             :     {
    5667           1 :         aImpl.setFilterFields2( xDescriptor2->getFilterFields2() );
    5668             :     }
    5669             :     else
    5670             :     {
    5671           0 :         aImpl.setFilterFields( xDescriptor->getFilterFields() );
    5672             :     }
    5673             :     //  Rest sind jetzt Properties...
    5674             : 
    5675           2 :     uno::Reference<beans::XPropertySet> xPropSet( xDescriptor, uno::UNO_QUERY );
    5676           1 :     if (xPropSet.is())
    5677           1 :         lcl_CopyProperties( aImpl, *xPropSet.get() );
    5678             : 
    5679             :     //  ausfuehren...
    5680             : 
    5681           1 :     if (pDocSh)
    5682             :     {
    5683           1 :         ScQueryParam aParam = aImpl.GetParam();
    5684             :         //  im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5685             :         SCCOLROW nFieldStart = aParam.bByRow ?
    5686           1 :             static_cast<SCCOLROW>(aRange.aStart.Col()) :
    5687           2 :             static_cast<SCCOLROW>(aRange.aStart.Row());
    5688           1 :         SCSIZE nCount = aParam.GetEntryCount();
    5689           1 :         svl::SharedStringPool& rPool = pDocSh->GetDocument().GetSharedStringPool();
    5690           9 :         for (SCSIZE i=0; i<nCount; i++)
    5691             :         {
    5692           8 :             ScQueryEntry& rEntry = aParam.GetEntry(i);
    5693           8 :             if (rEntry.bDoQuery)
    5694             :             {
    5695           2 :                 rEntry.nField += nFieldStart;
    5696             :                 //  Im Dialog wird immer der String angezeigt -> muss zum Wert passen
    5697           2 :                 ScQueryEntry::QueryItemsType& rItems = rEntry.GetQueryItems();
    5698           2 :                 rItems.resize(1);
    5699           2 :                 ScQueryEntry::Item& rItem = rItems.front();
    5700           2 :                 if (rItem.meType != ScQueryEntry::ByString)
    5701             :                 {
    5702           1 :                     OUString aStr;
    5703           1 :                     pDocSh->GetDocument().GetFormatTable()->GetInputLineString(rItem.mfVal, 0, aStr);
    5704           1 :                     rItem.maString = rPool.intern(aStr);
    5705             :                 }
    5706             :             }
    5707             :         }
    5708             : 
    5709           1 :         SCTAB nTab = aRange.aStart.Tab();
    5710           1 :         aParam.nCol1 = aRange.aStart.Col();
    5711           1 :         aParam.nRow1 = aRange.aStart.Row();
    5712           1 :         aParam.nCol2 = aRange.aEnd.Col();
    5713           1 :         aParam.nRow2 = aRange.aEnd.Row();
    5714             : 
    5715           1 :         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );   // ggf. Bereich anlegen
    5716             : 
    5717             :         //! keep source range in filter descriptor
    5718             :         //! if created by createFilterDescriptorByObject ???
    5719             : 
    5720           2 :         ScDBDocFunc aFunc(*pDocSh);
    5721           2 :         aFunc.Query( nTab, aParam, NULL, true, true );  // Bereich muss angelegt sein
    5722           1 :     }
    5723           1 : }
    5724             : 
    5725             : //! get/setAutoFilter als Properties!!!
    5726             : 
    5727             : // XAdvancedFilterSource
    5728             : 
    5729           1 : uno::Reference<sheet::XSheetFilterDescriptor> SAL_CALL ScCellRangeObj::createFilterDescriptorByObject(
    5730             :                         const uno::Reference<sheet::XSheetFilterable>& xObject )
    5731             :                                                 throw(uno::RuntimeException, std::exception)
    5732             : {
    5733           1 :     SolarMutexGuard aGuard;
    5734             : 
    5735             :     //  this ist hier nicht der Bereich, der gefiltert wird, sondern der
    5736             :     //  Bereich mit der Abfrage...
    5737             : 
    5738           2 :     uno::Reference<sheet::XCellRangeAddressable> xAddr( xObject, uno::UNO_QUERY );
    5739             : 
    5740           1 :     ScDocShell* pDocSh = GetDocShell();
    5741           1 :     if ( pDocSh && xAddr.is() )
    5742             :     {
    5743             :         //! Test, ob xObject im selben Dokument ist
    5744             : 
    5745           1 :         ScFilterDescriptor* pNew = new ScFilterDescriptor(pDocSh);  //! stattdessen vom Objekt?
    5746             : 
    5747           1 :         ScQueryParam aParam = pNew->GetParam();
    5748           1 :         aParam.bHasHeader = true;
    5749             : 
    5750           1 :         table::CellRangeAddress aDataAddress(xAddr->getRangeAddress());
    5751           1 :         aParam.nCol1 = (SCCOL)aDataAddress.StartColumn;
    5752           1 :         aParam.nRow1 = (SCROW)aDataAddress.StartRow;
    5753           1 :         aParam.nCol2 = (SCCOL)aDataAddress.EndColumn;
    5754           1 :         aParam.nRow2 = (SCROW)aDataAddress.EndRow;
    5755           1 :         aParam.nTab  = aDataAddress.Sheet;
    5756             : 
    5757           1 :         ScDocument& rDoc = pDocSh->GetDocument();
    5758             :         bool bOk = rDoc.CreateQueryParam(
    5759           1 :                             aRange.aStart.Col(), aRange.aStart.Row(),
    5760           1 :                             aRange.aEnd.Col(), aRange.aEnd.Row(),
    5761           3 :                             aRange.aStart.Tab(), aParam );
    5762           1 :         if ( bOk )
    5763             :         {
    5764             :             //  im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5765             :             SCCOLROW nFieldStart = aParam.bByRow ?
    5766             :                 static_cast<SCCOLROW>(aDataAddress.StartColumn) :
    5767           1 :                 static_cast<SCCOLROW>(aDataAddress.StartRow);
    5768           1 :             SCSIZE nCount = aParam.GetEntryCount();
    5769           9 :             for (SCSIZE i=0; i<nCount; i++)
    5770             :             {
    5771           8 :                 ScQueryEntry& rEntry = aParam.GetEntry(i);
    5772           8 :                 if (rEntry.bDoQuery && rEntry.nField >= nFieldStart)
    5773           1 :                     rEntry.nField -= nFieldStart;
    5774             :             }
    5775             : 
    5776           1 :             pNew->SetParam( aParam );
    5777           1 :             return pNew;
    5778             :         }
    5779             :         else
    5780             :         {
    5781           0 :             delete pNew;
    5782           0 :             return NULL;        // ungueltig -> null
    5783           1 :         }
    5784             :     }
    5785             : 
    5786             :     OSL_FAIL("kein Dokument oder kein Bereich");
    5787           1 :     return NULL;
    5788             : }
    5789             : 
    5790             : // XSubTotalSource
    5791             : 
    5792           6 : uno::Reference<sheet::XSubTotalDescriptor> SAL_CALL ScCellRangeObj::createSubTotalDescriptor(
    5793             :                                 sal_Bool bEmpty ) throw(uno::RuntimeException, std::exception)
    5794             : {
    5795           6 :     SolarMutexGuard aGuard;
    5796           6 :     ScSubTotalDescriptor* pNew = new ScSubTotalDescriptor;
    5797           6 :     ScDocShell* pDocSh = GetDocShell();
    5798           6 :     if ( !bEmpty && pDocSh )
    5799             :     {
    5800             :         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
    5801           0 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
    5802           0 :         if (pData)
    5803             :         {
    5804           0 :             ScSubTotalParam aParam;
    5805           0 :             pData->GetSubTotalParam(aParam);
    5806             :             //  im SubTotalDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5807           0 :             ScRange aDBRange;
    5808           0 :             pData->GetArea(aDBRange);
    5809           0 :             SCCOL nFieldStart = aDBRange.aStart.Col();
    5810           0 :             for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
    5811             :             {
    5812           0 :                 if ( aParam.bGroupActive[i] )
    5813             :                 {
    5814           0 :                     if ( aParam.nField[i] >= nFieldStart )
    5815           0 :                         aParam.nField[i] = sal::static_int_cast<SCCOL>( aParam.nField[i] - nFieldStart );
    5816           0 :                     for (SCCOL j=0; j<aParam.nSubTotals[i]; j++)
    5817           0 :                         if ( aParam.pSubTotals[i][j] >= nFieldStart )
    5818           0 :                             aParam.pSubTotals[i][j] = sal::static_int_cast<SCCOL>( aParam.pSubTotals[i][j] - nFieldStart );
    5819             :                 }
    5820             :             }
    5821           0 :             pNew->SetParam(aParam);
    5822             :         }
    5823             :     }
    5824           6 :     return pNew;
    5825             : }
    5826             : 
    5827           1 : void SAL_CALL ScCellRangeObj::applySubTotals(
    5828             :     const uno::Reference<sheet::XSubTotalDescriptor>& xDescriptor,
    5829             :     sal_Bool bReplace)
    5830             :     throw (uno::RuntimeException, std::exception)
    5831             : {
    5832           1 :     SolarMutexGuard aGuard;
    5833             : 
    5834           2 :     if (!xDescriptor.is()) return;
    5835             : 
    5836           1 :     ScDocShell* pDocSh = GetDocShell();
    5837             :     ScSubTotalDescriptorBase* pImp =
    5838           1 :         ScSubTotalDescriptorBase::getImplementation( xDescriptor );
    5839             : 
    5840           1 :     if (pDocSh && pImp)
    5841             :     {
    5842           1 :         ScSubTotalParam aParam;
    5843           1 :         pImp->GetData(aParam);      // virtuelle Methode der Basisklasse
    5844             : 
    5845             :         //  im SubTotalDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5846           1 :         SCCOL nFieldStart = aRange.aStart.Col();
    5847           4 :         for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
    5848             :         {
    5849           3 :             if ( aParam.bGroupActive[i] )
    5850             :             {
    5851           1 :                 aParam.nField[i] = sal::static_int_cast<SCCOL>( aParam.nField[i] + nFieldStart );
    5852           2 :                 for (SCCOL j=0; j<aParam.nSubTotals[i]; j++)
    5853           1 :                     aParam.pSubTotals[i][j] = sal::static_int_cast<SCCOL>( aParam.pSubTotals[i][j] + nFieldStart );
    5854             :             }
    5855             :         }
    5856             : 
    5857           1 :         aParam.bReplace = bReplace;
    5858             : 
    5859           1 :         SCTAB nTab = aRange.aStart.Tab();
    5860           1 :         aParam.nCol1 = aRange.aStart.Col();
    5861           1 :         aParam.nRow1 = aRange.aStart.Row();
    5862           1 :         aParam.nCol2 = aRange.aEnd.Col();
    5863           1 :         aParam.nRow2 = aRange.aEnd.Row();
    5864             : 
    5865           1 :         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );   // ggf. Bereich anlegen
    5866             : 
    5867           1 :         ScDBDocFunc aFunc(*pDocSh);
    5868           1 :         aFunc.DoSubTotals( nTab, aParam, NULL, true, true );    // Bereich muss angelegt sein
    5869           1 :     }
    5870             : }
    5871             : 
    5872           1 : void SAL_CALL ScCellRangeObj::removeSubTotals() throw(uno::RuntimeException, std::exception)
    5873             : {
    5874           1 :     SolarMutexGuard aGuard;
    5875             : 
    5876           1 :     ScDocShell* pDocSh = GetDocShell();
    5877           1 :     if (pDocSh)
    5878             :     {
    5879           1 :         ScSubTotalParam aParam;
    5880           1 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
    5881           1 :         if (pData)
    5882           0 :             pData->GetSubTotalParam(aParam);    // auch bei Remove die Feld-Eintraege behalten
    5883             : 
    5884           1 :         aParam.bRemoveOnly = true;
    5885             : 
    5886           1 :         SCTAB nTab = aRange.aStart.Tab();
    5887           1 :         aParam.nCol1 = aRange.aStart.Col();
    5888           1 :         aParam.nRow1 = aRange.aStart.Row();
    5889           1 :         aParam.nCol2 = aRange.aEnd.Col();
    5890           1 :         aParam.nRow2 = aRange.aEnd.Row();
    5891             : 
    5892           1 :         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );   // ggf. Bereich anlegen
    5893             : 
    5894           1 :         ScDBDocFunc aFunc(*pDocSh);
    5895           1 :         aFunc.DoSubTotals( nTab, aParam, NULL, true, true );    // Bereich muss angelegt sein
    5896           1 :     }
    5897           1 : }
    5898             : 
    5899           4 : uno::Sequence<beans::PropertyValue> SAL_CALL ScCellRangeObj::createImportDescriptor( sal_Bool bEmpty )
    5900             :                                                 throw(uno::RuntimeException, std::exception)
    5901             : {
    5902           4 :     SolarMutexGuard aGuard;
    5903           8 :     ScImportParam aParam;
    5904           4 :     ScDocShell* pDocSh = GetDocShell();
    5905           4 :     if ( !bEmpty && pDocSh )
    5906             :     {
    5907             :         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
    5908           3 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
    5909           3 :         if (pData)
    5910           0 :             pData->GetImportParam(aParam);
    5911             :     }
    5912             : 
    5913           4 :     uno::Sequence<beans::PropertyValue> aSeq( ScImportDescriptor::GetPropertyCount() );
    5914           4 :     ScImportDescriptor::FillProperties( aSeq, aParam );
    5915           8 :     return aSeq;
    5916             : }
    5917             : 
    5918           4 : void SAL_CALL ScCellRangeObj::doImport( const uno::Sequence<beans::PropertyValue>& aDescriptor )
    5919             :                                             throw(uno::RuntimeException, std::exception)
    5920             : {
    5921           4 :     SolarMutexGuard aGuard;
    5922           4 :     ScDocShell* pDocSh = GetDocShell();
    5923           4 :     if (pDocSh)
    5924             :     {
    5925           4 :         ScImportParam aParam;
    5926           4 :         ScImportDescriptor::FillImportParam( aParam, aDescriptor );
    5927             : 
    5928           4 :         SCTAB nTab = aRange.aStart.Tab();
    5929           4 :         aParam.nCol1 = aRange.aStart.Col();
    5930           4 :         aParam.nRow1 = aRange.aStart.Row();
    5931           4 :         aParam.nCol2 = aRange.aEnd.Col();
    5932           4 :         aParam.nRow2 = aRange.aEnd.Row();
    5933             : 
    5934             :         //! TODO: could we get passed a valid result set by any means?
    5935             : 
    5936           4 :         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );       // ggf. Bereich anlegen
    5937             : 
    5938           8 :         ScDBDocFunc aFunc(*pDocSh);                         // Bereich muss angelegt sein
    5939           8 :         aFunc.DoImport( nTab, aParam, NULL, true );         //! Api-Flag as parameter
    5940           4 :     }
    5941           4 : }
    5942             : 
    5943             : // XCellFormatRangesSupplier
    5944             : 
    5945           3 : uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangeObj::getCellFormatRanges()
    5946             :                                                 throw(uno::RuntimeException, std::exception)
    5947             : {
    5948           3 :     SolarMutexGuard aGuard;
    5949           3 :     ScDocShell* pDocSh = GetDocShell();
    5950           3 :     if ( pDocSh )
    5951           3 :         return new ScCellFormatsObj( pDocSh, aRange );
    5952           0 :     return NULL;
    5953             : }
    5954             : 
    5955             : // XUniqueCellFormatRangesSupplier
    5956             : 
    5957          36 : uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangeObj::getUniqueCellFormatRanges()
    5958             :                                                 throw(uno::RuntimeException, std::exception)
    5959             : {
    5960          36 :     SolarMutexGuard aGuard;
    5961          36 :     ScDocShell* pDocSh = GetDocShell();
    5962          36 :     if ( pDocSh )
    5963          36 :         return new ScUniqueCellFormatsObj( pDocSh, aRange );
    5964           0 :     return NULL;
    5965             : }
    5966             : 
    5967             : // XPropertySet erweitert fuer Range-Properties
    5968             : 
    5969         752 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellRangeObj::getPropertySetInfo()
    5970             :                                                         throw(uno::RuntimeException, std::exception)
    5971             : {
    5972         752 :     SolarMutexGuard aGuard;
    5973             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    5974         752 :         new SfxItemPropertySetInfo( pRangePropSet->getPropertyMap() ));
    5975         752 :     return aRef;
    5976             : }
    5977             : 
    5978         349 : void ScCellRangeObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    5979             :     throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    5980             : {
    5981             :     //  Range has only Position and Size in addition to ScCellRangesBase, both are ReadOnly
    5982             :     //  -> nothing to do here
    5983             : 
    5984         349 :     ScCellRangesBase::SetOnePropertyValue( pEntry, aValue );
    5985         348 : }
    5986             : 
    5987       11117 : void ScCellRangeObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, uno::Any& rAny )
    5988             :     throw(uno::RuntimeException, std::exception)
    5989             : {
    5990       11117 :     if ( pEntry )
    5991             :     {
    5992       11117 :         if ( pEntry->nWID == SC_WID_UNO_POS )
    5993             :         {
    5994        1188 :             ScDocShell* pDocSh = GetDocShell();
    5995        1188 :             if (pDocSh)
    5996             :             {
    5997             :                 //  GetMMRect converts using HMM_PER_TWIPS, like the DrawingLayer
    5998        1188 :                 Rectangle aMMRect(pDocSh->GetDocument().GetMMRect(
    5999        1188 :                                         aRange.aStart.Col(), aRange.aStart.Row(),
    6000        3564 :                                         aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab() ));
    6001        1188 :                 awt::Point aPos( aMMRect.Left(), aMMRect.Top() );
    6002        1188 :                 rAny <<= aPos;
    6003             :             }
    6004             :         }
    6005        9929 :         else if ( pEntry->nWID == SC_WID_UNO_SIZE )
    6006             :         {
    6007         433 :             ScDocShell* pDocSh = GetDocShell();
    6008         433 :             if (pDocSh)
    6009             :             {
    6010             :                 //  GetMMRect converts using HMM_PER_TWIPS, like the DrawingLayer
    6011         433 :                 Rectangle aMMRect = pDocSh->GetDocument().GetMMRect(
    6012         433 :                                         aRange.aStart.Col(), aRange.aStart.Row(),
    6013        1299 :                                         aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab() );
    6014         433 :                 Size aSize(aMMRect.GetSize());
    6015         433 :                 awt::Size aAwtSize( aSize.Width(), aSize.Height() );
    6016         433 :                 rAny <<= aAwtSize;
    6017             :             }
    6018             :         }
    6019             :         else
    6020        9496 :             ScCellRangesBase::GetOnePropertyValue( pEntry, rAny );
    6021             :     }
    6022       11117 : }
    6023             : 
    6024        1943 : const SfxItemPropertyMap& ScCellRangeObj::GetItemPropertyMap()
    6025             : {
    6026        1943 :     return pRangePropSet->getPropertyMap();
    6027             : }
    6028             : 
    6029             : // XServiceInfo
    6030             : 
    6031           6 : OUString SAL_CALL ScCellRangeObj::getImplementationName() throw(uno::RuntimeException, std::exception)
    6032             : {
    6033           6 :     return OUString( "ScCellRangeObj" );
    6034             : }
    6035             : 
    6036          10 : sal_Bool SAL_CALL ScCellRangeObj::supportsService( const OUString& rServiceName )
    6037             :                                                     throw(uno::RuntimeException, std::exception)
    6038             : {
    6039          10 :     return cppu::supportsService(this, rServiceName);
    6040             : }
    6041             : 
    6042          10 : uno::Sequence<OUString> SAL_CALL ScCellRangeObj::getSupportedServiceNames()
    6043             :                                                     throw(uno::RuntimeException, std::exception)
    6044             : {
    6045          10 :     uno::Sequence<OUString> aRet(5);
    6046          10 :     OUString* pArray = aRet.getArray();
    6047          10 :     pArray[0] = SCSHEETCELLRANGE_SERVICE;
    6048          10 :     pArray[1] = SCCELLRANGE_SERVICE;
    6049          10 :     pArray[2] = SCCELLPROPERTIES_SERVICE;
    6050          10 :     pArray[3] = SCCHARPROPERTIES_SERVICE;
    6051          10 :     pArray[4] = SCPARAPROPERTIES_SERVICE;
    6052          10 :     return aRet;
    6053             : }
    6054             : 
    6055          10 : const SvxItemPropertySet* ScCellObj::GetEditPropertySet()
    6056             : {
    6057          10 :     return lcl_GetEditPropertySet();
    6058             : }
    6059             : 
    6060           0 : const SfxItemPropertyMap& ScCellObj::GetCellPropertyMap()
    6061             : {
    6062           0 :     return lcl_GetCellPropertySet()->getPropertyMap();
    6063             : }
    6064             : 
    6065       16640 : ScCellObj::ScCellObj(ScDocShell* pDocSh, const ScAddress& rP) :
    6066             :     ScCellRangeObj( pDocSh, ScRange(rP,rP) ),
    6067       16640 :     pCellPropSet( lcl_GetCellPropertySet() ),
    6068             :     aCellPos( rP ),
    6069       33280 :     nActionLockCount( 0 )
    6070             : {
    6071             :     //  pUnoText is allocated on demand (GetUnoText)
    6072             :     //  can't be aggregated because getString/setString is handled here
    6073       16640 : }
    6074             : 
    6075          23 : SvxUnoText& ScCellObj::GetUnoText()
    6076             : {
    6077          23 :     if (!mxUnoText.is())
    6078             :     {
    6079          10 :         mxUnoText.set(new ScCellTextObj(GetDocShell(), aCellPos));
    6080          10 :         if (nActionLockCount)
    6081             :         {
    6082             :             ScCellEditSource* pEditSource =
    6083           0 :                 static_cast<ScCellEditSource*> (mxUnoText->GetEditSource());
    6084           0 :             if (pEditSource)
    6085           0 :                 pEditSource->SetDoUpdateData(false);
    6086             :         }
    6087             :     }
    6088          23 :     return *mxUnoText;
    6089             : }
    6090             : 
    6091       33228 : ScCellObj::~ScCellObj()
    6092             : {
    6093       33228 : }
    6094             : 
    6095         838 : void ScCellObj::RefChanged()
    6096             : {
    6097         838 :     ScCellRangeObj::RefChanged();
    6098             : 
    6099         838 :     const ScRangeList& rRanges = GetRangeList();
    6100             :     OSL_ENSURE(rRanges.size() == 1, "was fuer Ranges ?!?!");
    6101         838 :     if ( !rRanges.empty() )
    6102             :     {
    6103         816 :         const ScRange* pFirst = rRanges[ 0 ];
    6104         816 :         aCellPos = pFirst->aStart;
    6105             :     }
    6106         838 : }
    6107             : 
    6108      141353 : uno::Any SAL_CALL ScCellObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException, std::exception)
    6109             : {
    6110      141353 :     SC_QUERYINTERFACE( table::XCell )
    6111      133375 :     SC_QUERYINTERFACE( table::XCell2 )
    6112      133375 :     SC_QUERYINTERFACE( sheet::XFormulaTokens )
    6113      133375 :     SC_QUERYINTERFACE( sheet::XCellAddressable )
    6114      131509 :     SC_QUERYINTERFACE( text::XText )
    6115      130066 :     SC_QUERYINTERFACE( text::XSimpleText )
    6116      129975 :     SC_QUERYINTERFACE( text::XTextRange )
    6117      129802 :     SC_QUERYINTERFACE( container::XEnumerationAccess )
    6118      129800 :     SC_QUERYINTERFACE( container::XElementAccess )
    6119      129798 :     SC_QUERYINTERFACE( sheet::XSheetAnnotationAnchor )
    6120      129788 :     SC_QUERYINTERFACE( text::XTextFieldsSupplier )
    6121      129785 :     SC_QUERYINTERFACE( document::XActionLockable )
    6122             : 
    6123      129784 :     return ScCellRangeObj::queryInterface( rType );
    6124             : }
    6125             : 
    6126      416705 : void SAL_CALL ScCellObj::acquire() throw()
    6127             : {
    6128      416705 :     ScCellRangeObj::acquire();
    6129      416705 : }
    6130             : 
    6131      416679 : void SAL_CALL ScCellObj::release() throw()
    6132             : {
    6133      416679 :     ScCellRangeObj::release();
    6134      416679 : }
    6135             : 
    6136           2 : uno::Sequence<uno::Type> SAL_CALL ScCellObj::getTypes() throw(uno::RuntimeException, std::exception)
    6137             : {
    6138           2 :     static uno::Sequence<uno::Type> aTypes;
    6139           2 :     if ( aTypes.getLength() == 0 )
    6140             :     {
    6141           1 :         uno::Sequence<uno::Type> aParentTypes(ScCellRangeObj::getTypes());
    6142           1 :         long nParentLen = aParentTypes.getLength();
    6143           1 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    6144             : 
    6145           1 :         aTypes.realloc( nParentLen + 9 );
    6146           1 :         uno::Type* pPtr = aTypes.getArray();
    6147           1 :         pPtr[nParentLen + 0] = cppu::UnoType<table::XCell>::get();
    6148           1 :         pPtr[nParentLen + 1] = cppu::UnoType<sheet::XCellAddressable>::get();
    6149           1 :         pPtr[nParentLen + 2] = cppu::UnoType<text::XText>::get();
    6150           1 :         pPtr[nParentLen + 3] = cppu::UnoType<container::XEnumerationAccess>::get();
    6151           1 :         pPtr[nParentLen + 4] = cppu::UnoType<sheet::XSheetAnnotationAnchor>::get();
    6152           1 :         pPtr[nParentLen + 5] = cppu::UnoType<text::XTextFieldsSupplier>::get();
    6153           1 :         pPtr[nParentLen + 6] = cppu::UnoType<document::XActionLockable>::get();
    6154           1 :         pPtr[nParentLen + 7] = cppu::UnoType<sheet::XFormulaTokens>::get();
    6155           1 :         pPtr[nParentLen + 8] = cppu::UnoType<table::XCell2>::get();
    6156             : 
    6157          31 :         for (long i=0; i<nParentLen; i++)
    6158          31 :             pPtr[i] = pParentPtr[i];                // parent types first
    6159             :     }
    6160           2 :     return aTypes;
    6161             : }
    6162             : 
    6163           0 : uno::Sequence<sal_Int8> SAL_CALL ScCellObj::getImplementationId() throw(uno::RuntimeException, std::exception)
    6164             : {
    6165           0 :     return css::uno::Sequence<sal_Int8>();
    6166             : }
    6167             : 
    6168             : //  Hilfsfunktionen
    6169             : 
    6170         131 : OUString ScCellObj::GetInputString_Impl(bool bEnglish) const      // fuer getFormula / FormulaLocal
    6171             : {
    6172         131 :     if (GetDocShell())
    6173         131 :         return lcl_GetInputString( GetDocShell()->GetDocument(), aCellPos, bEnglish );
    6174           0 :     return OUString();
    6175             : }
    6176             : 
    6177        1682 : OUString ScCellObj::GetOutputString_Impl() const
    6178             : {
    6179        1682 :     ScDocShell* pDocSh = GetDocShell();
    6180        1682 :     OUString aVal;
    6181        1682 :     if ( pDocSh )
    6182             :     {
    6183        1682 :         ScDocument& rDoc = pDocSh->GetDocument();
    6184        1682 :         ScRefCellValue aCell;
    6185        1682 :         aCell.assign(rDoc, aCellPos);
    6186             : 
    6187        1682 :         aVal = ScCellFormat::GetOutputString(rDoc, aCellPos, aCell);
    6188             :     }
    6189        1682 :     return aVal;
    6190             : }
    6191             : 
    6192        2046 : void ScCellObj::SetString_Impl(const OUString& rString, bool bInterpret, bool bEnglish)
    6193             : {
    6194        2046 :     ScDocShell* pDocSh = GetDocShell();
    6195        2046 :     if ( pDocSh )
    6196             :     {
    6197             :         // GRAM_PODF_A1 for API compatibility.
    6198        2046 :         (void)pDocSh->GetDocFunc().SetCellText(
    6199        4092 :             aCellPos, rString, bInterpret, bEnglish, true, formula::FormulaGrammar::GRAM_PODF_A1 );
    6200             :     }
    6201        2046 : }
    6202             : 
    6203        2617 : double ScCellObj::GetValue_Impl() const
    6204             : {
    6205        2617 :     ScDocShell* pDocSh = GetDocShell();
    6206        2617 :     if ( pDocSh )
    6207        2617 :         return pDocSh->GetDocument().GetValue( aCellPos );
    6208             : 
    6209           0 :     return 0.0;
    6210             : }
    6211             : 
    6212        3620 : void ScCellObj::SetValue_Impl(double fValue)
    6213             : {
    6214        3620 :     ScDocShell* pDocSh = GetDocShell();
    6215        3620 :     if ( pDocSh )
    6216        3620 :         pDocSh->GetDocFunc().SetValueCell(aCellPos, fValue, false);
    6217        3620 : }
    6218             : 
    6219             : // only for XML import
    6220             : 
    6221        1530 : void ScCellObj::InputEnglishString( const OUString& rText )
    6222             : {
    6223             :     // This is like a mixture of setFormula and property FormulaLocal:
    6224             :     // The cell's number format is checked for "text", a new cell format may be set,
    6225             :     // but all parsing is in English.
    6226             : 
    6227        1530 :     ScDocShell* pDocSh = GetDocShell();
    6228        1530 :     if (!pDocSh)
    6229           0 :         return;
    6230             : 
    6231        1530 :     OUString aString(rText);
    6232        1530 :     ScDocument& rDoc = pDocSh->GetDocument();
    6233        1530 :     SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
    6234        1530 :     sal_uInt32 nOldFormat = rDoc.GetNumberFormat( aCellPos );
    6235        1530 :     if (pFormatter->GetType(nOldFormat) == css::util::NumberFormat::TEXT)
    6236             :     {
    6237           0 :         SetString_Impl(aString, false, false);      // text cell
    6238           0 :         return;
    6239             :     }
    6240             : 
    6241        1530 :     ScDocFunc &rFunc = pDocSh->GetDocFunc();
    6242             : 
    6243             :     ScInputStringType aRes =
    6244        3060 :         ScStringUtil::parseInputString(*pFormatter, aString, LANGUAGE_ENGLISH_US);
    6245             : 
    6246        1530 :     if (aRes.meType != ScInputStringType::Unknown)
    6247             :     {
    6248         386 :         if ((nOldFormat % SV_COUNTRY_LANGUAGE_OFFSET) == 0 && aRes.mnFormatType)
    6249             :         {
    6250             :             // apply a format for the recognized type and the old format's language
    6251           1 :             sal_uInt32 nNewFormat = ScGlobal::GetStandardFormat(*pFormatter, nOldFormat, aRes.mnFormatType);
    6252           1 :             if (nNewFormat != nOldFormat)
    6253             :             {
    6254           0 :                 ScPatternAttr aPattern( rDoc.GetPool() );
    6255           0 :                 aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) );
    6256             :                 // ATTR_LANGUAGE_FORMAT remains unchanged
    6257           0 :                 rFunc.ApplyAttributes( *GetMarkData(), aPattern, true, true );
    6258             :             }
    6259             :         }
    6260             :     }
    6261        1530 :     switch (aRes.meType)
    6262             :     {
    6263             :         case ScInputStringType::Formula:
    6264             :             rFunc.SetFormulaCell(
    6265             :                 aCellPos,
    6266           1 :                 new ScFormulaCell(&rDoc, aCellPos, aRes.maText, formula::FormulaGrammar::GRAM_PODF_A1),
    6267           2 :                 false);
    6268           1 :         break;
    6269             :         case ScInputStringType::Number:
    6270           1 :             rFunc.SetValueCell(aCellPos, aRes.mfValue, false);
    6271           1 :         break;
    6272             :         case ScInputStringType::Text:
    6273         384 :             rFunc.SetStringOrEditCell(aCellPos, aRes.maText, false);
    6274         384 :         break;
    6275             :         default:
    6276        1144 :             SetString_Impl(aString, false, false); // probably empty string
    6277        1530 :     }
    6278             : }
    6279             : 
    6280             : //  XText
    6281             : 
    6282          12 : uno::Reference<text::XTextCursor> SAL_CALL ScCellObj::createTextCursor()
    6283             :                                                     throw(uno::RuntimeException, std::exception)
    6284             : {
    6285          12 :     SolarMutexGuard aGuard;
    6286          12 :     return new ScCellTextCursor( *this );
    6287             : }
    6288             : 
    6289           1 : uno::Reference<text::XTextCursor> SAL_CALL ScCellObj::createTextCursorByRange(
    6290             :                                     const uno::Reference<text::XTextRange>& aTextPosition )
    6291             :                                                     throw(uno::RuntimeException, std::exception)
    6292             : {
    6293           1 :     SolarMutexGuard aGuard;
    6294           1 :     SvxUnoTextCursor* pCursor = new ScCellTextCursor( *this );
    6295           1 :     uno::Reference<text::XTextCursor> xCursor(pCursor);
    6296             : 
    6297           1 :     SvxUnoTextRangeBase* pRange = SvxUnoTextRangeBase::getImplementation( aTextPosition );
    6298           1 :     if(pRange)
    6299           1 :         pCursor->SetSelection( pRange->GetSelection() );
    6300             :     else
    6301             :     {
    6302           0 :         ScCellTextCursor* pOther = ScCellTextCursor::getImplementation( aTextPosition );
    6303           0 :         if(pOther)
    6304           0 :             pCursor->SetSelection( pOther->GetSelection() );
    6305             :         else
    6306           0 :             throw uno::RuntimeException();
    6307             :     }
    6308             : 
    6309           1 :     return xCursor;
    6310             : }
    6311             : 
    6312        1682 : OUString SAL_CALL ScCellObj::getString() throw(uno::RuntimeException, std::exception)
    6313             : {
    6314        1682 :     SolarMutexGuard aGuard;
    6315        1682 :     return GetOutputString_Impl();
    6316             : }
    6317             : 
    6318          34 : void SAL_CALL ScCellObj::setString( const OUString& aText ) throw(uno::RuntimeException, std::exception)
    6319             : {
    6320          34 :     SolarMutexGuard aGuard;
    6321          68 :     OUString aString(aText);
    6322          34 :     SetString_Impl(aString, false, false);  // immer Text
    6323             : 
    6324             :     // don't create pUnoText here if not there
    6325          34 :     if (mxUnoText.is())
    6326          40 :         mxUnoText->SetSelection(ESelection( 0,0, 0,aString.getLength() ));
    6327          34 : }
    6328             : 
    6329           2 : void SAL_CALL ScCellObj::insertString( const uno::Reference<text::XTextRange>& xRange,
    6330             :                                         const OUString& aString, sal_Bool bAbsorb )
    6331             :                                     throw(uno::RuntimeException, std::exception)
    6332             : {
    6333             :     // special handling for ScCellTextCursor is no longer needed,
    6334             :     // SvxUnoText::insertString checks for SvxUnoTextRangeBase instead of SvxUnoTextRange
    6335             : 
    6336           2 :     SolarMutexGuard aGuard;
    6337           2 :     GetUnoText().insertString(xRange, aString, bAbsorb);
    6338           2 : }
    6339             : 
    6340           2 : void SAL_CALL ScCellObj::insertControlCharacter( const uno::Reference<text::XTextRange>& xRange,
    6341             :                                                 sal_Int16 nControlCharacter, sal_Bool bAbsorb )
    6342             :                                     throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    6343             : {
    6344           2 :     SolarMutexGuard aGuard;
    6345           2 :     GetUnoText().insertControlCharacter(xRange, nControlCharacter, bAbsorb);
    6346           2 : }
    6347             : 
    6348           7 : void SAL_CALL ScCellObj::insertTextContent( const uno::Reference<text::XTextRange >& xRange,
    6349             :                                                 const uno::Reference<text::XTextContent >& xContent,
    6350             :                                                 sal_Bool bAbsorb )
    6351             :                                     throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    6352             : {
    6353           7 :     SolarMutexGuard aGuard;
    6354           7 :     ScDocShell* pDocSh = GetDocShell();
    6355           7 :     if ( pDocSh && xContent.is() )
    6356             :     {
    6357           6 :         ScEditFieldObj* pCellField = ScEditFieldObj::getImplementation(xContent);
    6358           6 :         SvxUnoTextRangeBase* pTextRange = ScCellTextCursor::getImplementation( xRange );
    6359             : 
    6360           6 :         if ( pCellField && !pCellField->IsInserted() && pTextRange )
    6361             :         {
    6362           6 :             SvxEditSource* pEditSource = pTextRange->GetEditSource();
    6363           6 :             ESelection aSelection(pTextRange->GetSelection());
    6364             : 
    6365           6 :             if (!bAbsorb)
    6366             :             {
    6367             :                 //  nicht ersetzen -> hinten anhaengen
    6368           2 :                 aSelection.Adjust();
    6369           2 :                 aSelection.nStartPara = aSelection.nEndPara;
    6370           2 :                 aSelection.nStartPos  = aSelection.nEndPos;
    6371             :             }
    6372             : 
    6373           6 :             if (pCellField->GetFieldType() == text::textfield::Type::TABLE)
    6374           0 :                 pCellField->setPropertyValue(SC_UNONAME_TABLEPOS, uno::makeAny<sal_Int32>(aCellPos.Tab()));
    6375             : 
    6376           6 :             SvxFieldItem aItem = pCellField->CreateFieldItem();
    6377           6 :             SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder();
    6378           6 :             pForwarder->QuickInsertField( aItem, aSelection );
    6379           6 :             pEditSource->UpdateData();
    6380             : 
    6381             :             //  neue Selektion: ein Zeichen
    6382           6 :             aSelection.Adjust();
    6383           6 :             aSelection.nEndPara = aSelection.nStartPara;
    6384           6 :             aSelection.nEndPos = aSelection.nStartPos + 1;
    6385          12 :             uno::Reference<text::XTextRange> xParent(this);
    6386             :             pCellField->InitDoc(
    6387           6 :                 xParent, new ScCellEditSource(pDocSh, aCellPos), aSelection);
    6388             : 
    6389             :             //  for bAbsorb=FALSE, the new selection must be behind the inserted content
    6390             :             //  (the xml filter relies on this)
    6391           6 :             if (!bAbsorb)
    6392           2 :                 aSelection.nStartPos = aSelection.nEndPos;
    6393             : 
    6394           6 :             pTextRange->SetSelection( aSelection );
    6395             : 
    6396          18 :             return;
    6397             :         }
    6398             :     }
    6399           2 :     GetUnoText().insertTextContent(xRange, xContent, bAbsorb);
    6400             : }
    6401             : 
    6402           1 : void SAL_CALL ScCellObj::removeTextContent( const uno::Reference<text::XTextContent>& xContent )
    6403             :                                 throw(container::NoSuchElementException, uno::RuntimeException, std::exception)
    6404             : {
    6405           1 :     SolarMutexGuard aGuard;
    6406           1 :     if ( xContent.is() )
    6407             :     {
    6408           1 :         ScEditFieldObj* pCellField = ScEditFieldObj::getImplementation(xContent);
    6409           1 :         if ( pCellField && pCellField->IsInserted() )
    6410             :         {
    6411             :             //! Testen, ob das Feld in dieser Zelle ist
    6412           1 :             pCellField->DeleteField();
    6413           2 :             return;
    6414             :         }
    6415             :     }
    6416           0 :     GetUnoText().removeTextContent(xContent);
    6417             : }
    6418             : 
    6419           4 : uno::Reference<text::XText> SAL_CALL ScCellObj::getText() throw(uno::RuntimeException, std::exception)
    6420             : {
    6421           4 :     SolarMutexGuard aGuard;
    6422           4 :     return this;
    6423             : }
    6424             : 
    6425           1 : uno::Reference<text::XTextRange> SAL_CALL ScCellObj::getStart() throw(uno::RuntimeException, std::exception)
    6426             : {
    6427           1 :     SolarMutexGuard aGuard;
    6428           1 :     return GetUnoText().getStart();
    6429             : }
    6430             : 
    6431           1 : uno::Reference<text::XTextRange> SAL_CALL ScCellObj::getEnd() throw(uno::RuntimeException, std::exception)
    6432             : {
    6433           1 :     SolarMutexGuard aGuard;
    6434           1 :     return GetUnoText().getEnd();
    6435             : }
    6436             : 
    6437           1 : uno::Reference<container::XEnumeration> SAL_CALL ScCellObj::createEnumeration()
    6438             :                                                     throw(uno::RuntimeException, std::exception)
    6439             : {
    6440           1 :     SolarMutexGuard aGuard;
    6441           1 :     return GetUnoText().createEnumeration();
    6442             : }
    6443             : 
    6444           1 : uno::Type SAL_CALL ScCellObj::getElementType() throw(uno::RuntimeException, std::exception)
    6445             : {
    6446           1 :     SolarMutexGuard aGuard;
    6447           1 :     return GetUnoText().getElementType();
    6448             : }
    6449             : 
    6450           1 : sal_Bool SAL_CALL ScCellObj::hasElements() throw(uno::RuntimeException, std::exception)
    6451             : {
    6452           1 :     SolarMutexGuard aGuard;
    6453           1 :     return GetUnoText().hasElements();
    6454             : }
    6455             : 
    6456             : //  XCell
    6457             : 
    6458         121 : OUString SAL_CALL ScCellObj::getFormula() throw(uno::RuntimeException, std::exception)
    6459             : {
    6460         121 :     SolarMutexGuard aGuard;
    6461         121 :     return GetInputString_Impl( true /* English */ );
    6462             : }
    6463             : 
    6464         866 : void SAL_CALL ScCellObj::setFormula( const OUString& aFormula ) throw(uno::RuntimeException, std::exception)
    6465             : {
    6466         866 :     SolarMutexGuard aGuard;
    6467        1732 :     OUString aString(aFormula);
    6468        1732 :     SetString_Impl(aString, true, true); // Interpret as English
    6469         866 : }
    6470             : 
    6471        2617 : double SAL_CALL ScCellObj::getValue() throw(uno::RuntimeException, std::exception)
    6472             : {
    6473        2617 :     SolarMutexGuard aGuard;
    6474        2617 :     return GetValue_Impl();
    6475             : }
    6476             : 
    6477        3620 : void SAL_CALL ScCellObj::setValue( double nValue ) throw(uno::RuntimeException, std::exception)
    6478             : {
    6479        3620 :     SolarMutexGuard aGuard;
    6480        3620 :     SetValue_Impl(nValue);
    6481        3620 : }
    6482             : 
    6483           0 : void SAL_CALL ScCellObj::setFormulaString( const OUString& aFormula) throw(uno::RuntimeException, std::exception)
    6484             : {
    6485           0 :     SolarMutexGuard aGuard;
    6486           0 :     ScDocShell *pDocSh = GetDocShell();
    6487           0 :     if( pDocSh )
    6488             :     {
    6489           0 :         ScFormulaCell* pCell = new ScFormulaCell( &pDocSh->GetDocument(), aCellPos );
    6490           0 :         pCell->SetHybridFormula( aFormula, formula::FormulaGrammar::GRAM_NATIVE );
    6491           0 :         pDocSh->GetDocFunc().SetFormulaCell(aCellPos, pCell, false);
    6492           0 :     }
    6493           0 : }
    6494           0 : void SAL_CALL ScCellObj::setFormulaResult( double nValue ) throw(uno::RuntimeException, std::exception)
    6495             : {
    6496           0 :     SolarMutexGuard aGuard;
    6497           0 :     ScDocShell* pDocSh = GetDocShell();
    6498           0 :     if ( pDocSh && pDocSh->GetDocument().GetCellType( aCellPos ) == CELLTYPE_FORMULA )
    6499             :     {
    6500           0 :         ScFormulaCell* pCell = pDocSh->GetDocument().GetFormulaCell(aCellPos);
    6501           0 :         if (!pCell)
    6502           0 :             return;
    6503           0 :         pCell->SetHybridDouble( nValue );
    6504           0 :         pCell->ResetDirty();
    6505           0 :         pCell->SetChanged(false);
    6506           0 :     }
    6507             : }
    6508             : 
    6509        5661 : table::CellContentType SAL_CALL ScCellObj::getType() throw(uno::RuntimeException, std::exception)
    6510             : {
    6511        5661 :     SolarMutexGuard aGuard;
    6512        5661 :     table::CellContentType eRet = table::CellContentType_EMPTY;
    6513        5661 :     ScDocShell* pDocSh = GetDocShell();
    6514        5661 :     if (pDocSh)
    6515             :     {
    6516        5661 :         CellType eCalcType = pDocSh->GetDocument().GetCellType( aCellPos );
    6517        5661 :         switch (eCalcType)
    6518             :         {
    6519             :             case CELLTYPE_VALUE:
    6520        2555 :                 eRet = table::CellContentType_VALUE;
    6521        2555 :                 break;
    6522             :             case CELLTYPE_STRING:
    6523             :             case CELLTYPE_EDIT:
    6524        1613 :                 eRet = table::CellContentType_TEXT;
    6525        1613 :                 break;
    6526             :             case CELLTYPE_FORMULA:
    6527          65 :                 eRet = table::CellContentType_FORMULA;
    6528          65 :                 break;
    6529             :             default:
    6530        1428 :                 eRet = table::CellContentType_EMPTY;
    6531             :         }
    6532             :     }
    6533             :     else
    6534             :     {
    6535             :         OSL_FAIL("keine DocShell");     //! Exception oder so?
    6536             :     }
    6537             : 
    6538        5661 :     return eRet;
    6539             : }
    6540             : 
    6541          49 : table::CellContentType ScCellObj::GetResultType_Impl()
    6542             : {
    6543          49 :     ScDocShell* pDocSh = GetDocShell();
    6544          49 :     if ( pDocSh )
    6545             :     {
    6546          49 :         ScRefCellValue aCell;
    6547          49 :         aCell.assign(pDocSh->GetDocument(), aCellPos);
    6548          49 :         if (aCell.meType == CELLTYPE_FORMULA)
    6549             :         {
    6550          39 :             bool bValue = aCell.mpFormula->IsValue();
    6551          39 :             return bValue ? table::CellContentType_VALUE : table::CellContentType_TEXT;
    6552          10 :         }
    6553             :     }
    6554          10 :     return getType();   // wenn keine Formel
    6555             : }
    6556             : 
    6557           2 : sal_Int32 SAL_CALL ScCellObj::getError() throw(uno::RuntimeException, std::exception)
    6558             : {
    6559           2 :     SolarMutexGuard aGuard;
    6560           2 :     ScDocShell* pDocSh = GetDocShell();
    6561           2 :     if (!pDocSh)
    6562             :     {
    6563             :         OSL_FAIL("keine DocShell");     //! Exception oder so?
    6564           0 :         return 0;
    6565             :     }
    6566             : 
    6567           2 :     sal_uInt16 nError = 0;
    6568           4 :     ScRefCellValue aCell;
    6569           2 :     aCell.assign(pDocSh->GetDocument(), aCellPos);
    6570           2 :     if (aCell.meType == CELLTYPE_FORMULA)
    6571           1 :         nError = aCell.mpFormula->GetErrCode();
    6572             : 
    6573           4 :     return nError;
    6574             : }
    6575             : 
    6576             : // XFormulaTokens
    6577             : 
    6578           0 : uno::Sequence<sheet::FormulaToken> SAL_CALL ScCellObj::getTokens()
    6579             :     throw (uno::RuntimeException, std::exception)
    6580             : {
    6581           0 :     SolarMutexGuard aGuard;
    6582           0 :     uno::Sequence<sheet::FormulaToken> aSequence;
    6583           0 :     ScDocShell* pDocSh = GetDocShell();
    6584           0 :     if (!pDocSh)
    6585           0 :         return aSequence;
    6586             : 
    6587           0 :     ScDocument& rDoc = pDocSh->GetDocument();
    6588           0 :     ScRefCellValue aCell;
    6589           0 :     aCell.assign(rDoc, aCellPos);
    6590           0 :     if (aCell.meType == CELLTYPE_FORMULA)
    6591             :     {
    6592           0 :         ScTokenArray* pTokenArray = aCell.mpFormula->GetCode();
    6593           0 :         if (pTokenArray)
    6594           0 :             ScTokenConversion::ConvertToTokenSequence(rDoc, aSequence, *pTokenArray);
    6595             :     }
    6596           0 :     return aSequence;
    6597             : }
    6598             : 
    6599           0 : void SAL_CALL ScCellObj::setTokens( const uno::Sequence<sheet::FormulaToken>& rTokens ) throw(uno::RuntimeException, std::exception)
    6600             : {
    6601           0 :     SolarMutexGuard aGuard;
    6602           0 :     ScDocShell* pDocSh = GetDocShell();
    6603           0 :     if ( pDocSh )
    6604             :     {
    6605           0 :         ScDocument& rDoc = pDocSh->GetDocument();
    6606           0 :         ScTokenArray aTokenArray;
    6607           0 :         (void)ScTokenConversion::ConvertToTokenArray( rDoc, aTokenArray, rTokens );
    6608             : 
    6609           0 :         ScFormulaCell* pNewCell = new ScFormulaCell(&rDoc, aCellPos, aTokenArray);
    6610           0 :         (void)pDocSh->GetDocFunc().SetFormulaCell(aCellPos, pNewCell, false);
    6611           0 :     }
    6612           0 : }
    6613             : 
    6614             : // XCellAddressable
    6615             : 
    6616        1869 : table::CellAddress SAL_CALL ScCellObj::getCellAddress() throw(uno::RuntimeException, std::exception)
    6617             : {
    6618        1869 :     SolarMutexGuard aGuard;
    6619        1869 :     table::CellAddress aAdr;
    6620        1869 :     aAdr.Sheet  = aCellPos.Tab();
    6621        1869 :     aAdr.Column = aCellPos.Col();
    6622        1869 :     aAdr.Row    = aCellPos.Row();
    6623        1869 :     return aAdr;
    6624             : }
    6625             : 
    6626             : // XSheetAnnotationAnchor
    6627             : 
    6628          10 : uno::Reference<sheet::XSheetAnnotation> SAL_CALL ScCellObj::getAnnotation()
    6629             :                                                 throw(uno::RuntimeException, std::exception)
    6630             : {
    6631          10 :     SolarMutexGuard aGuard;
    6632          10 :     ScDocShell* pDocSh = GetDocShell();
    6633          10 :     if ( pDocSh )
    6634          10 :         return new ScAnnotationObj( pDocSh, aCellPos );
    6635             : 
    6636             :     OSL_FAIL("getAnnotation ohne DocShell");
    6637           0 :     return NULL;
    6638             : }
    6639             : 
    6640             : // XFieldTypesSupplier
    6641             : 
    6642           4 : uno::Reference<container::XEnumerationAccess> SAL_CALL ScCellObj::getTextFields()
    6643             :                                                 throw(uno::RuntimeException, std::exception)
    6644             : {
    6645           4 :     SolarMutexGuard aGuard;
    6646           4 :     ScDocShell* pDocSh = GetDocShell();
    6647           4 :     if ( pDocSh )
    6648             :     {
    6649           4 :         uno::Reference<text::XTextRange> xContent(this);
    6650           4 :         return new ScCellFieldsObj(xContent, pDocSh, aCellPos);
    6651             :     }
    6652             : 
    6653           0 :     return NULL;
    6654             : }
    6655             : 
    6656           0 : uno::Reference<container::XNameAccess> SAL_CALL ScCellObj::getTextFieldMasters()
    6657             :                                                 throw(uno::RuntimeException, std::exception)
    6658             : {
    6659             :     //  sowas gibts nicht im Calc (?)
    6660           0 :     return NULL;
    6661             : }
    6662             : 
    6663             : // XPropertySet erweitert fuer Zell-Properties
    6664             : 
    6665        1080 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellObj::getPropertySetInfo()
    6666             :                                                         throw(uno::RuntimeException, std::exception)
    6667             : {
    6668        1080 :     SolarMutexGuard aGuard;
    6669             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    6670        1080 :         new SfxItemPropertySetInfo( pCellPropSet->getPropertyMap() ));
    6671        1080 :     return aRef;
    6672             : }
    6673             : 
    6674          49 : void ScCellObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    6675             :                                 throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    6676             : {
    6677          49 :     if ( pEntry )
    6678             :     {
    6679          49 :         if ( pEntry->nWID == SC_WID_UNO_FORMLOC )
    6680             :         {
    6681           2 :             OUString aStrVal;
    6682           2 :             aValue >>= aStrVal;
    6683           4 :             OUString aString(aStrVal);
    6684           4 :             SetString_Impl(aString, true, false);   // lokal interpretieren
    6685             :         }
    6686          47 :         else if ( pEntry->nWID == SC_WID_UNO_FORMRT )
    6687             :         {
    6688             :             //  Read-Only
    6689             :             //! Exception oder so...
    6690             :         }
    6691             :         else
    6692          46 :             ScCellRangeObj::SetOnePropertyValue( pEntry, aValue );
    6693             :     }
    6694          49 : }
    6695             : 
    6696        9260 : void ScCellObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, uno::Any& rAny )
    6697             :     throw(uno::RuntimeException, std::exception)
    6698             : {
    6699        9260 :     if ( pEntry )
    6700             :     {
    6701        9260 :         if ( pEntry->nWID == SC_WID_UNO_FORMLOC )
    6702             :         {
    6703             :             // sal_False = lokal
    6704          10 :             rAny <<= OUString( GetInputString_Impl(false) );
    6705             :         }
    6706        9250 :         else if ( pEntry->nWID == SC_WID_UNO_FORMRT )
    6707             :         {
    6708          49 :             table::CellContentType eType = GetResultType_Impl();
    6709          49 :             rAny <<= eType;
    6710             :         }
    6711             :         else
    6712        9201 :             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
    6713             :     }
    6714        9260 : }
    6715             : 
    6716        8785 : const SfxItemPropertyMap& ScCellObj::GetItemPropertyMap()
    6717             : {
    6718        8785 :     return pCellPropSet->getPropertyMap();
    6719             : }
    6720             : 
    6721             : // XServiceInfo
    6722             : 
    6723          13 : OUString SAL_CALL ScCellObj::getImplementationName() throw(uno::RuntimeException, std::exception)
    6724             : {
    6725          13 :     return OUString( "ScCellObj" );
    6726             : }
    6727             : 
    6728          17 : sal_Bool SAL_CALL ScCellObj::supportsService( const OUString& rServiceName )
    6729             :                                                     throw(uno::RuntimeException, std::exception)
    6730             : {
    6731          17 :     return cppu::supportsService(this, rServiceName);
    6732             : }
    6733             : 
    6734          17 : uno::Sequence<OUString> SAL_CALL ScCellObj::getSupportedServiceNames()
    6735             :                                                     throw(uno::RuntimeException, std::exception)
    6736             : {
    6737          17 :     uno::Sequence<OUString> aRet(7);
    6738          17 :     OUString* pArray = aRet.getArray();
    6739          17 :     pArray[0] = SCSHEETCELL_SERVICE;
    6740          17 :     pArray[1] = SCCELL_SERVICE;
    6741          17 :     pArray[2] = SCCELLPROPERTIES_SERVICE;
    6742          17 :     pArray[3] = SCCHARPROPERTIES_SERVICE;
    6743          17 :     pArray[4] = SCPARAPROPERTIES_SERVICE;
    6744          17 :     pArray[5] = SCSHEETCELLRANGE_SERVICE;
    6745          17 :     pArray[6] = SCCELLRANGE_SERVICE;
    6746          17 :     return aRet;
    6747             : }
    6748             : 
    6749             : // XActionLockable
    6750             : 
    6751           3 : sal_Bool SAL_CALL ScCellObj::isActionLocked() throw(uno::RuntimeException, std::exception)
    6752             : {
    6753           3 :     SolarMutexGuard aGuard;
    6754           3 :     return nActionLockCount != 0;
    6755             : }
    6756             : 
    6757           2 : void SAL_CALL ScCellObj::addActionLock() throw(uno::RuntimeException, std::exception)
    6758             : {
    6759           2 :     SolarMutexGuard aGuard;
    6760           2 :     if (!nActionLockCount)
    6761             :     {
    6762           2 :         if (mxUnoText.is())
    6763             :         {
    6764             :             ScCellEditSource* pEditSource =
    6765           0 :                 static_cast<ScCellEditSource*> (mxUnoText->GetEditSource());
    6766           0 :             if (pEditSource)
    6767           0 :                 pEditSource->SetDoUpdateData(false);
    6768             :         }
    6769             :     }
    6770           2 :     nActionLockCount++;
    6771           2 : }
    6772             : 
    6773           1 : void SAL_CALL ScCellObj::removeActionLock() throw(uno::RuntimeException, std::exception)
    6774             : {
    6775           1 :     SolarMutexGuard aGuard;
    6776           1 :     if (nActionLockCount > 0)
    6777             :     {
    6778           1 :         nActionLockCount--;
    6779           1 :         if (!nActionLockCount)
    6780             :         {
    6781           1 :             if (mxUnoText.is())
    6782             :             {
    6783             :                 ScCellEditSource* pEditSource =
    6784           0 :                     static_cast<ScCellEditSource*> (mxUnoText->GetEditSource());
    6785           0 :                 if (pEditSource)
    6786             :                 {
    6787           0 :                     pEditSource->SetDoUpdateData(true);
    6788           0 :                     if (pEditSource->IsDirty())
    6789           0 :                         pEditSource->UpdateData();
    6790             :                 }
    6791             :             }
    6792             :         }
    6793           1 :     }
    6794           1 : }
    6795             : 
    6796           1 : void SAL_CALL ScCellObj::setActionLocks( sal_Int16 nLock ) throw(uno::RuntimeException, std::exception)
    6797             : {
    6798           1 :     SolarMutexGuard aGuard;
    6799           1 :     if (mxUnoText.is())
    6800             :     {
    6801             :         ScCellEditSource* pEditSource =
    6802           0 :             static_cast<ScCellEditSource*> (mxUnoText->GetEditSource());
    6803           0 :         if (pEditSource)
    6804             :         {
    6805           0 :             pEditSource->SetDoUpdateData(nLock == 0);
    6806           0 :             if ((nActionLockCount > 0) && (nLock == 0) && pEditSource->IsDirty())
    6807           0 :                 pEditSource->UpdateData();
    6808             :         }
    6809             :     }
    6810           1 :     nActionLockCount = nLock;
    6811           1 : }
    6812             : 
    6813           1 : sal_Int16 SAL_CALL ScCellObj::resetActionLocks() throw(uno::RuntimeException, std::exception)
    6814             : {
    6815           1 :     SolarMutexGuard aGuard;
    6816           1 :     sal_uInt16 nRet(nActionLockCount);
    6817           1 :     if (mxUnoText.is())
    6818             :     {
    6819             :         ScCellEditSource* pEditSource =
    6820           0 :             static_cast<ScCellEditSource*> (mxUnoText->GetEditSource());
    6821           0 :         if (pEditSource)
    6822             :         {
    6823           0 :             pEditSource->SetDoUpdateData(true);
    6824           0 :             if (pEditSource->IsDirty())
    6825           0 :                 pEditSource->UpdateData();
    6826             :         }
    6827             :     }
    6828           1 :     nActionLockCount = 0;
    6829           1 :     return nRet;
    6830             : }
    6831             : 
    6832        4593 : ScTableSheetObj::ScTableSheetObj( ScDocShell* pDocSh, SCTAB nTab ) :
    6833             :     ScCellRangeObj( pDocSh, ScRange(0,0,nTab, MAXCOL,MAXROW,nTab) ),
    6834        4593 :     pSheetPropSet(lcl_GetSheetPropertySet())
    6835             : {
    6836        4593 : }
    6837             : 
    6838        9022 : ScTableSheetObj::~ScTableSheetObj()
    6839             : {
    6840        9022 : }
    6841             : 
    6842           0 : void ScTableSheetObj::InitInsertSheet(ScDocShell* pDocSh, SCTAB nTab)
    6843             : {
    6844           0 :     InitInsertRange( pDocSh, ScRange(0,0,nTab, MAXCOL,MAXROW,nTab) );
    6845           0 : }
    6846             : 
    6847       60083 : uno::Any SAL_CALL ScTableSheetObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException, std::exception)
    6848             : {
    6849       60083 :     SC_QUERYINTERFACE( sheet::XSpreadsheet )
    6850       58530 :     SC_QUERYINTERFACE( container::XNamed )
    6851       58026 :     SC_QUERYINTERFACE( sheet::XSheetPageBreak )
    6852       58023 :     SC_QUERYINTERFACE( sheet::XCellRangeMovement )
    6853       58017 :     SC_QUERYINTERFACE( table::XTableChartsSupplier )
    6854       57945 :     SC_QUERYINTERFACE( sheet::XDataPilotTablesSupplier )
    6855       57904 :     SC_QUERYINTERFACE( sheet::XScenariosSupplier )
    6856       57903 :     SC_QUERYINTERFACE( sheet::XSheetAnnotationsSupplier )
    6857       57890 :     SC_QUERYINTERFACE( drawing::XDrawPageSupplier )
    6858       57273 :     SC_QUERYINTERFACE( sheet::XPrintAreas )
    6859       57236 :     SC_QUERYINTERFACE( sheet::XSheetAuditing )
    6860       57235 :     SC_QUERYINTERFACE( sheet::XSheetOutline )
    6861       57214 :     SC_QUERYINTERFACE( util::XProtectable )
    6862       57181 :     SC_QUERYINTERFACE( sheet::XScenario )
    6863       57181 :     SC_QUERYINTERFACE( sheet::XScenarioEnhanced )
    6864       57181 :     SC_QUERYINTERFACE( sheet::XSheetLinkable )
    6865       57146 :     SC_QUERYINTERFACE( sheet::XExternalSheetName )
    6866       57146 :     SC_QUERYINTERFACE( document::XEventsSupplier )
    6867             : 
    6868       57146 :     return ScCellRangeObj::queryInterface( rType );
    6869             : }
    6870             : 
    6871      185914 : void SAL_CALL ScTableSheetObj::acquire() throw()
    6872             : {
    6873      185914 :     ScCellRangeObj::acquire();
    6874      185914 : }
    6875             : 
    6876      185832 : void SAL_CALL ScTableSheetObj::release() throw()
    6877             : {
    6878      185832 :     ScCellRangeObj::release();
    6879      185832 : }
    6880             : 
    6881           4 : uno::Sequence<uno::Type> SAL_CALL ScTableSheetObj::getTypes() throw(uno::RuntimeException, std::exception)
    6882             : {
    6883           4 :     static uno::Sequence<uno::Type> aTypes;
    6884           4 :     if ( aTypes.getLength() == 0 )
    6885             :     {
    6886           2 :         uno::Sequence<uno::Type> aParentTypes = ScCellRangeObj::getTypes();
    6887           2 :         long nParentLen = aParentTypes.getLength();
    6888           2 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    6889             : 
    6890           2 :         aTypes.realloc( nParentLen + 18 );
    6891           2 :         uno::Type* pPtr = aTypes.getArray();
    6892           2 :         pPtr[nParentLen + 0] = cppu::UnoType<sheet::XSpreadsheet>::get();
    6893           2 :         pPtr[nParentLen + 1] = cppu::UnoType<container::XNamed>::get();
    6894           2 :         pPtr[nParentLen + 2] = cppu::UnoType<sheet::XSheetPageBreak>::get();
    6895           2 :         pPtr[nParentLen + 3] = cppu::UnoType<sheet::XCellRangeMovement>::get();
    6896           2 :         pPtr[nParentLen + 4] = cppu::UnoType<table::XTableChartsSupplier>::get();
    6897           2 :         pPtr[nParentLen + 5] = cppu::UnoType<sheet::XDataPilotTablesSupplier>::get();
    6898           2 :         pPtr[nParentLen + 6] = cppu::UnoType<sheet::XScenariosSupplier>::get();
    6899           2 :         pPtr[nParentLen + 7] = cppu::UnoType<sheet::XSheetAnnotationsSupplier>::get();
    6900           2 :         pPtr[nParentLen + 8] = cppu::UnoType<drawing::XDrawPageSupplier>::get();
    6901           2 :         pPtr[nParentLen + 9] = cppu::UnoType<sheet::XPrintAreas>::get();
    6902           2 :         pPtr[nParentLen +10] = cppu::UnoType<sheet::XSheetAuditing>::get();
    6903           2 :         pPtr[nParentLen +11] = cppu::UnoType<sheet::XSheetOutline>::get();
    6904           2 :         pPtr[nParentLen +12] = cppu::UnoType<util::XProtectable>::get();
    6905           2 :         pPtr[nParentLen +13] = cppu::UnoType<sheet::XScenario>::get();
    6906           2 :         pPtr[nParentLen +14] = cppu::UnoType<sheet::XScenarioEnhanced>::get();
    6907           2 :         pPtr[nParentLen +15] = cppu::UnoType<sheet::XSheetLinkable>::get();
    6908           2 :         pPtr[nParentLen +16] = cppu::UnoType<sheet::XExternalSheetName>::get();
    6909           2 :         pPtr[nParentLen +17] = cppu::UnoType<document::XEventsSupplier>::get();
    6910             : 
    6911          62 :         for (long i=0; i<nParentLen; i++)
    6912          62 :             pPtr[i] = pParentPtr[i];                // parent types first
    6913             :     }
    6914           4 :     return aTypes;
    6915             : }
    6916             : 
    6917           0 : uno::Sequence<sal_Int8> SAL_CALL ScTableSheetObj::getImplementationId() throw(uno::RuntimeException, std::exception)
    6918             : {
    6919           0 :     return css::uno::Sequence<sal_Int8>();
    6920             : }
    6921             : 
    6922             : //  Hilfsfunktionen
    6923             : 
    6924        8781 : SCTAB ScTableSheetObj::GetTab_Impl() const
    6925             : {
    6926        8781 :     const ScRangeList& rRanges = GetRangeList();
    6927             :     OSL_ENSURE(rRanges.size() == 1, "was fuer Ranges ?!?!");
    6928        8781 :     if ( !rRanges.empty() )
    6929             :     {
    6930        8781 :         const ScRange* pFirst = rRanges[ 0 ];
    6931        8781 :         return pFirst->aStart.Tab();
    6932             :     }
    6933           0 :     return 0;   // soll nicht sein
    6934             : }
    6935             : 
    6936             : // former XSheet
    6937             : 
    6938          72 : uno::Reference<table::XTableCharts> SAL_CALL ScTableSheetObj::getCharts() throw(uno::RuntimeException, std::exception)
    6939             : {
    6940          72 :     SolarMutexGuard aGuard;
    6941          72 :     ScDocShell* pDocSh = GetDocShell();
    6942          72 :     if ( pDocSh )
    6943          72 :         return new ScChartsObj( pDocSh, GetTab_Impl() );
    6944             : 
    6945             :     OSL_FAIL("kein Dokument");
    6946           0 :     return NULL;
    6947             : }
    6948             : 
    6949          48 : uno::Reference<sheet::XDataPilotTables> SAL_CALL ScTableSheetObj::getDataPilotTables()
    6950             :                                                 throw(uno::RuntimeException, std::exception)
    6951             : {
    6952          48 :     SolarMutexGuard aGuard;
    6953          48 :     ScDocShell* pDocSh = GetDocShell();
    6954          48 :     if ( pDocSh )
    6955          48 :         return new ScDataPilotTablesObj( pDocSh, GetTab_Impl() );
    6956             : 
    6957             :     OSL_FAIL("kein Dokument");
    6958           0 :     return NULL;
    6959             : }
    6960             : 
    6961           2 : uno::Reference<sheet::XScenarios> SAL_CALL ScTableSheetObj::getScenarios() throw(uno::RuntimeException, std::exception)
    6962             : {
    6963           2 :     SolarMutexGuard aGuard;
    6964           2 :     ScDocShell* pDocSh = GetDocShell();
    6965             : 
    6966           2 :     if ( pDocSh )
    6967           2 :         return new ScScenariosObj( pDocSh, GetTab_Impl() );
    6968             : 
    6969             :     OSL_FAIL("kein Dokument");
    6970           0 :     return NULL;
    6971             : }
    6972             : 
    6973          13 : uno::Reference<sheet::XSheetAnnotations> SAL_CALL ScTableSheetObj::getAnnotations()
    6974             :                                                 throw(uno::RuntimeException, std::exception)
    6975             : {
    6976          13 :     SolarMutexGuard aGuard;
    6977          13 :     ScDocShell* pDocSh = GetDocShell();
    6978             : 
    6979          13 :     if ( pDocSh )
    6980          13 :         return new ScAnnotationsObj( pDocSh, GetTab_Impl() );
    6981             : 
    6982             :     OSL_FAIL("kein Dokument");
    6983           0 :     return NULL;
    6984             : }
    6985             : 
    6986          93 : uno::Reference<table::XCellRange> SAL_CALL ScTableSheetObj::getCellRangeByName(
    6987             :                         const OUString& rRange ) throw(uno::RuntimeException, std::exception)
    6988             : {
    6989          93 :     SolarMutexGuard aGuard;
    6990          93 :     return ScCellRangeObj::getCellRangeByName( rRange );
    6991             : }
    6992             : 
    6993          83 : uno::Reference<sheet::XSheetCellCursor> SAL_CALL ScTableSheetObj::createCursor()
    6994             :                                                 throw(uno::RuntimeException, std::exception)
    6995             : {
    6996          83 :     SolarMutexGuard aGuard;
    6997          83 :     ScDocShell* pDocSh = GetDocShell();
    6998          83 :     if ( pDocSh )
    6999             :     {
    7000             :         //! einzelne Zelle oder ganze Tabelle???????
    7001          83 :         SCTAB nTab = GetTab_Impl();
    7002          83 :         return new ScCellCursorObj( pDocSh, ScRange( 0,0,nTab, MAXCOL,MAXROW,nTab ) );
    7003             :     }
    7004           0 :     return NULL;
    7005             : }
    7006             : 
    7007         420 : uno::Reference<sheet::XSheetCellCursor> SAL_CALL ScTableSheetObj::createCursorByRange(
    7008             :                         const uno::Reference<sheet::XSheetCellRange>& xCellRange )
    7009             :                                                 throw(uno::RuntimeException, std::exception)
    7010             : {
    7011         420 :     SolarMutexGuard aGuard;
    7012         420 :     ScDocShell* pDocSh = GetDocShell();
    7013         420 :     if ( pDocSh && xCellRange.is() )
    7014             :     {
    7015         420 :         ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xCellRange );
    7016         420 :         if (pRangesImp)
    7017             :         {
    7018         420 :             const ScRangeList& rRanges = pRangesImp->GetRangeList();
    7019             :             OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" );
    7020         420 :             return new ScCellCursorObj( pDocSh, *rRanges[ 0 ] );
    7021             :         }
    7022             :     }
    7023           0 :     return NULL;
    7024             : }
    7025             : 
    7026             : // XSheetCellRange
    7027             : 
    7028        1786 : uno::Reference<sheet::XSpreadsheet> SAL_CALL ScTableSheetObj::getSpreadsheet()
    7029             :                                                 throw(uno::RuntimeException, std::exception)
    7030             : {
    7031        1786 :     SolarMutexGuard aGuard;
    7032        1786 :     return this;        //!???
    7033             : }
    7034             : 
    7035             : // XCellRange
    7036             : 
    7037        6598 : uno::Reference<table::XCell> SAL_CALL ScTableSheetObj::getCellByPosition(
    7038             :                                         sal_Int32 nColumn, sal_Int32 nRow )
    7039             :                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
    7040             : {
    7041        6598 :     SolarMutexGuard aGuard;
    7042        6598 :     return ScCellRangeObj::GetCellByPosition_Impl(nColumn, nRow);
    7043             : }
    7044             : 
    7045        7379 : uno::Reference<table::XCellRange> SAL_CALL ScTableSheetObj::getCellRangeByPosition(
    7046             :                 sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom )
    7047             :                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException, std::exception)
    7048             : {
    7049        7379 :     SolarMutexGuard aGuard;
    7050        7379 :     return ScCellRangeObj::getCellRangeByPosition(nLeft,nTop,nRight,nBottom);
    7051             : }
    7052             : 
    7053           6 : uno::Sequence<sheet::TablePageBreakData> SAL_CALL ScTableSheetObj::getColumnPageBreaks()
    7054             :                                                 throw(uno::RuntimeException, std::exception)
    7055             : {
    7056           6 :     SolarMutexGuard aGuard;
    7057           6 :     ScDocShell* pDocSh = GetDocShell();
    7058           6 :     if ( pDocSh )
    7059             :     {
    7060           6 :         ScDocument& rDoc = pDocSh->GetDocument();
    7061           6 :         SCTAB nTab = GetTab_Impl();
    7062             : 
    7063           6 :         Size aSize(rDoc.GetPageSize( nTab ));
    7064           6 :         if (aSize.Width() && aSize.Height())        // effektive Groesse schon gesetzt?
    7065           6 :             rDoc.UpdatePageBreaks( nTab );
    7066             :         else
    7067             :         {
    7068             :             //  Umbrueche updaten wie in ScDocShell::PageStyleModified:
    7069           0 :             ScPrintFunc aPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab );
    7070           0 :             aPrintFunc.UpdatePages();
    7071             :         }
    7072             : 
    7073           6 :         SCCOL nCount = 0;
    7074             :         SCCOL nCol;
    7075        6150 :         for (nCol=0; nCol<=MAXCOL; nCol++)
    7076        6144 :             if (rDoc.HasColBreak(nCol, nTab))
    7077          16 :                 ++nCount;
    7078             : 
    7079           6 :         sheet::TablePageBreakData aData;
    7080           6 :         uno::Sequence<sheet::TablePageBreakData> aSeq(nCount);
    7081           6 :         sheet::TablePageBreakData* pAry = aSeq.getArray();
    7082           6 :         sal_uInt16 nPos = 0;
    7083        6150 :         for (nCol=0; nCol<=MAXCOL; nCol++)
    7084             :         {
    7085        6144 :             ScBreakType nBreak = rDoc.HasColBreak(nCol, nTab);
    7086        6144 :             if (nBreak)
    7087             :             {
    7088          16 :                 aData.Position    = nCol;
    7089          16 :                 aData.ManualBreak = (nBreak & BREAK_MANUAL);
    7090          16 :                 pAry[nPos] = aData;
    7091          16 :                 ++nPos;
    7092             :             }
    7093             :         }
    7094           6 :         return aSeq;
    7095             :     }
    7096           0 :     return uno::Sequence<sheet::TablePageBreakData>(0);
    7097             : }
    7098             : 
    7099           6 : uno::Sequence<sheet::TablePageBreakData> SAL_CALL ScTableSheetObj::getRowPageBreaks()
    7100             :                                                 throw(uno::RuntimeException, std::exception)
    7101             : {
    7102           6 :     SolarMutexGuard aGuard;
    7103           6 :     ScDocShell* pDocSh = GetDocShell();
    7104           6 :     if ( pDocSh )
    7105             :     {
    7106           6 :         ScDocument& rDoc = pDocSh->GetDocument();
    7107           6 :         SCTAB nTab = GetTab_Impl();
    7108             : 
    7109           6 :         Size aSize(rDoc.GetPageSize( nTab ));
    7110           6 :         if (aSize.Width() && aSize.Height())        // effektive Groesse schon gesetzt?
    7111           5 :             rDoc.UpdatePageBreaks( nTab );
    7112             :         else
    7113             :         {
    7114             :             //  Umbrueche updaten wie in ScDocShell::PageStyleModified:
    7115           1 :             ScPrintFunc aPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab );
    7116           1 :             aPrintFunc.UpdatePages();
    7117             :         }
    7118           6 :         return rDoc.GetRowBreakData(nTab);
    7119             :     }
    7120           0 :     return uno::Sequence<sheet::TablePageBreakData>(0);
    7121             : }
    7122             : 
    7123           0 : void SAL_CALL ScTableSheetObj::removeAllManualPageBreaks() throw(uno::RuntimeException, std::exception)
    7124             : {
    7125           0 :     SolarMutexGuard aGuard;
    7126           0 :     ScDocShell* pDocSh = GetDocShell();
    7127           0 :     if ( pDocSh )
    7128             :     {
    7129             :         //! docfunc Funktion, auch fuer ScViewFunc::RemoveManualBreaks
    7130             : 
    7131           0 :         ScDocument& rDoc = pDocSh->GetDocument();
    7132           0 :         bool bUndo (rDoc.IsUndoEnabled());
    7133           0 :         SCTAB nTab = GetTab_Impl();
    7134             : 
    7135           0 :         if (bUndo)
    7136             :         {
    7137           0 :             ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
    7138           0 :             pUndoDoc->InitUndo( &rDoc, nTab, nTab, true, true );
    7139           0 :             rDoc.CopyToDocument( 0,0,nTab, MAXCOL,MAXROW,nTab, IDF_NONE, false, pUndoDoc );
    7140           0 :             pDocSh->GetUndoManager()->AddUndoAction(
    7141           0 :                                     new ScUndoRemoveBreaks( pDocSh, nTab, pUndoDoc ) );
    7142             :         }
    7143             : 
    7144           0 :         rDoc.RemoveManualBreaks(nTab);
    7145           0 :         rDoc.UpdatePageBreaks(nTab);
    7146             : 
    7147             :         //? UpdatePageBreakData( sal_True );
    7148           0 :         pDocSh->SetDocumentModified();
    7149           0 :         pDocSh->PostPaint(ScRange(0, 0, nTab, MAXCOL, MAXROW, nTab), PAINT_GRID);
    7150           0 :     }
    7151           0 : }
    7152             : 
    7153             : // XNamed
    7154             : 
    7155         502 : OUString SAL_CALL ScTableSheetObj::getName() throw(uno::RuntimeException, std::exception)
    7156             : {
    7157         502 :     SolarMutexGuard aGuard;
    7158         502 :     OUString aName;
    7159         502 :     ScDocShell* pDocSh = GetDocShell();
    7160         502 :     if ( pDocSh )
    7161         502 :         pDocSh->GetDocument().GetName( GetTab_Impl(), aName );
    7162         502 :     return aName;
    7163             : }
    7164             : 
    7165          15 : void SAL_CALL ScTableSheetObj::setName( const OUString& aNewName )
    7166             :                                                 throw(uno::RuntimeException, std::exception)
    7167             : {
    7168          15 :     SolarMutexGuard aGuard;
    7169          15 :     ScDocShell* pDocSh = GetDocShell();
    7170          15 :     if ( pDocSh )
    7171             :     {
    7172          15 :         OUString aString(aNewName);
    7173          15 :         pDocSh->GetDocFunc().RenameTable( GetTab_Impl(), aString, true, true );
    7174          15 :     }
    7175          15 : }
    7176             : 
    7177             : // XDrawPageSupplier
    7178             : 
    7179         617 : uno::Reference<drawing::XDrawPage> SAL_CALL ScTableSheetObj::getDrawPage()
    7180             :                                                 throw(uno::RuntimeException, std::exception)
    7181             : {
    7182         617 :     SolarMutexGuard aGuard;
    7183         617 :     ScDocShell* pDocSh = GetDocShell();
    7184         617 :     if ( pDocSh )
    7185             :     {
    7186         617 :         ScDrawLayer* pDrawLayer = pDocSh->MakeDrawLayer();
    7187             :         OSL_ENSURE(pDrawLayer,"kann Draw-Layer nicht anlegen");
    7188             : 
    7189         617 :         SCTAB nTab = GetTab_Impl();
    7190         617 :         SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
    7191             :         OSL_ENSURE(pPage,"Draw-Page nicht gefunden");
    7192         617 :         if (pPage)
    7193         617 :             return uno::Reference<drawing::XDrawPage> (pPage->getUnoPage(), uno::UNO_QUERY);
    7194             : 
    7195             :         //  Das DrawPage-Objekt meldet sich als Listener am SdrModel an
    7196             :         //  und sollte von dort alle Aktionen mitbekommen
    7197             :     }
    7198           0 :     return NULL;
    7199             : }
    7200             : 
    7201             : // XCellMovement
    7202             : 
    7203           1 : void SAL_CALL ScTableSheetObj::insertCells( const table::CellRangeAddress& rRangeAddress,
    7204             :                                 sheet::CellInsertMode nMode ) throw(uno::RuntimeException, std::exception)
    7205             : {
    7206           1 :     SolarMutexGuard aGuard;
    7207           1 :     ScDocShell* pDocSh = GetDocShell();
    7208           1 :     if ( pDocSh )
    7209             :     {
    7210           1 :         bool bDo = true;
    7211           1 :         InsCellCmd eCmd = INS_NONE;
    7212           1 :         switch (nMode)
    7213             :         {
    7214           0 :             case sheet::CellInsertMode_NONE:    bDo = false;                break;
    7215           0 :             case sheet::CellInsertMode_DOWN:    eCmd = INS_CELLSDOWN;       break;
    7216           1 :             case sheet::CellInsertMode_RIGHT:   eCmd = INS_CELLSRIGHT;      break;
    7217           0 :             case sheet::CellInsertMode_ROWS:    eCmd = INS_INSROWS_BEFORE;  break;
    7218           0 :             case sheet::CellInsertMode_COLUMNS: eCmd = INS_INSCOLS_BEFORE;  break;
    7219             :             default:
    7220             :                 OSL_FAIL("insertCells: falscher Mode");
    7221           0 :                 bDo = false;
    7222             :         }
    7223             : 
    7224           1 :         if (bDo)
    7225             :         {
    7226             :             OSL_ENSURE( rRangeAddress.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
    7227           1 :             ScRange aScRange;
    7228           1 :             ScUnoConversion::FillScRange( aScRange, rRangeAddress );
    7229           1 :             pDocSh->GetDocFunc().InsertCells( aScRange, NULL, eCmd, true, true );
    7230             :         }
    7231           1 :     }
    7232           1 : }
    7233             : 
    7234           3 : void SAL_CALL ScTableSheetObj::removeRange( const table::CellRangeAddress& rRangeAddress,
    7235             :                                 sheet::CellDeleteMode nMode ) throw(uno::RuntimeException, std::exception)
    7236             : {
    7237           3 :     SolarMutexGuard aGuard;
    7238           3 :     ScDocShell* pDocSh = GetDocShell();
    7239           3 :     if ( pDocSh )
    7240             :     {
    7241           3 :         bool bDo = true;
    7242           3 :         DelCellCmd eCmd = DEL_NONE;
    7243           3 :         switch (nMode)
    7244             :         {
    7245           0 :             case sheet::CellDeleteMode_NONE:     bDo = false;           break;
    7246           1 :             case sheet::CellDeleteMode_UP:       eCmd = DEL_CELLSUP;    break;
    7247           2 :             case sheet::CellDeleteMode_LEFT:     eCmd = DEL_CELLSLEFT;  break;
    7248           0 :             case sheet::CellDeleteMode_ROWS:     eCmd = DEL_DELROWS;    break;
    7249           0 :             case sheet::CellDeleteMode_COLUMNS:  eCmd = DEL_DELCOLS;    break;
    7250             :             default:
    7251             :                 OSL_FAIL("deleteCells: falscher Mode");
    7252           0 :                 bDo = false;
    7253             :         }
    7254             : 
    7255           3 :         if (bDo)
    7256             :         {
    7257             :             OSL_ENSURE( rRangeAddress.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
    7258           3 :             ScRange aScRange;
    7259           3 :             ScUnoConversion::FillScRange( aScRange, rRangeAddress );
    7260           3 :             pDocSh->GetDocFunc().DeleteCells( aScRange, NULL, eCmd, true, true );
    7261             :         }
    7262           3 :     }
    7263           3 : }
    7264             : 
    7265           1 : void SAL_CALL ScTableSheetObj::moveRange( const table::CellAddress& aDestination,
    7266             :                                         const table::CellRangeAddress& aSource )
    7267             :                                         throw(uno::RuntimeException, std::exception)
    7268             : {
    7269           1 :     SolarMutexGuard aGuard;
    7270           1 :     ScDocShell* pDocSh = GetDocShell();
    7271           1 :     if ( pDocSh )
    7272             :     {
    7273             :         OSL_ENSURE( aSource.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
    7274           1 :         ScRange aSourceRange;
    7275           1 :         ScUnoConversion::FillScRange( aSourceRange, aSource );
    7276           1 :         ScAddress aDestPos( (SCCOL)aDestination.Column, (SCROW)aDestination.Row, aDestination.Sheet );
    7277           1 :         pDocSh->GetDocFunc().MoveBlock( aSourceRange, aDestPos, true, true, true, true );
    7278           1 :     }
    7279           1 : }
    7280             : 
    7281           1 : void SAL_CALL ScTableSheetObj::copyRange( const table::CellAddress& aDestination,
    7282             :                                         const table::CellRangeAddress& aSource )
    7283             :                                         throw(uno::RuntimeException, std::exception)
    7284             : {
    7285           1 :     SolarMutexGuard aGuard;
    7286           1 :     ScDocShell* pDocSh = GetDocShell();
    7287           1 :     if ( pDocSh )
    7288             :     {
    7289             :         OSL_ENSURE( aSource.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
    7290           1 :         ScRange aSourceRange;
    7291           1 :         ScUnoConversion::FillScRange( aSourceRange, aSource );
    7292           1 :         ScAddress aDestPos( (SCCOL)aDestination.Column, (SCROW)aDestination.Row, aDestination.Sheet );
    7293           1 :         pDocSh->GetDocFunc().MoveBlock( aSourceRange, aDestPos, false, true, true, true );
    7294           1 :     }
    7295           1 : }
    7296             : 
    7297             : // XPrintAreas
    7298             : 
    7299           6 : void ScTableSheetObj::PrintAreaUndo_Impl( ScPrintRangeSaver* pOldRanges )
    7300             : {
    7301             :     //  Umbrueche und Undo
    7302           6 :     ScDocShell* pDocSh = GetDocShell();
    7303             : 
    7304           6 :     if(pDocSh)
    7305             :     {
    7306           6 :         ScDocument& rDoc = pDocSh->GetDocument();
    7307           6 :         const bool bUndo(rDoc.IsUndoEnabled());
    7308           6 :         const SCTAB nTab(GetTab_Impl());
    7309             : 
    7310           6 :         if(bUndo)
    7311             :         {
    7312           2 :             pDocSh->GetUndoManager()->AddUndoAction(
    7313             :                 new ScUndoPrintRange(
    7314             :                     pDocSh,
    7315             :                     nTab,
    7316             :                     pOldRanges,
    7317           2 :                     rDoc.CreatePrintRangeSaver())); // create new ranges
    7318             : 
    7319             :             // #i120105# ownership of old ranges has changed, mark as consumed
    7320           2 :             pOldRanges = 0;
    7321             :         }
    7322             : 
    7323           6 :         ScPrintFunc(pDocSh, pDocSh->GetPrinter(), nTab).UpdatePages();
    7324           6 :         SfxBindings* pBindings = pDocSh->GetViewBindings();
    7325             : 
    7326           6 :         if(pBindings)
    7327             :         {
    7328           2 :             pBindings->Invalidate(SID_DELETE_PRINTAREA);
    7329             :         }
    7330             : 
    7331           6 :         pDocSh->SetDocumentModified();
    7332             :     }
    7333             : 
    7334             :     // #i120105# pOldRanges not used, need to cleanup
    7335           6 :     delete pOldRanges;
    7336           6 : }
    7337             : 
    7338          33 : uno::Sequence<table::CellRangeAddress> SAL_CALL ScTableSheetObj::getPrintAreas()
    7339             :                                                 throw(uno::RuntimeException, std::exception)
    7340             : {
    7341          33 :     SolarMutexGuard aGuard;
    7342          33 :     ScDocShell* pDocSh = GetDocShell();
    7343          33 :     if ( pDocSh )
    7344             :     {
    7345          33 :         ScDocument& rDoc = pDocSh->GetDocument();
    7346          33 :         SCTAB nTab = GetTab_Impl();
    7347          33 :         sal_uInt16 nCount = rDoc.GetPrintRangeCount( nTab );
    7348             : 
    7349          33 :         table::CellRangeAddress aRangeAddress;
    7350          33 :         uno::Sequence<table::CellRangeAddress> aSeq(nCount);
    7351          33 :         table::CellRangeAddress* pAry = aSeq.getArray();
    7352          33 :         for (sal_uInt16 i=0; i<nCount; i++)
    7353             :         {
    7354           0 :             const ScRange* pRange = rDoc.GetPrintRange( nTab, i );
    7355             :             OSL_ENSURE(pRange,"wo ist der Druckbereich");
    7356           0 :             if (pRange)
    7357             :             {
    7358           0 :                 ScUnoConversion::FillApiRange( aRangeAddress, *pRange );
    7359           0 :                 aRangeAddress.Sheet = nTab; // core does not care about sheet index
    7360           0 :                 pAry[i] = aRangeAddress;
    7361             :             }
    7362             :         }
    7363          33 :         return aSeq;
    7364             :     }
    7365           0 :     return uno::Sequence<table::CellRangeAddress>();
    7366             : }
    7367             : 
    7368           0 : void SAL_CALL ScTableSheetObj::setPrintAreas(
    7369             :                     const uno::Sequence<table::CellRangeAddress>& aPrintAreas )
    7370             :                                                 throw(uno::RuntimeException, std::exception)
    7371             : {
    7372           0 :     SolarMutexGuard aGuard;
    7373           0 :     ScDocShell* pDocSh = GetDocShell();
    7374           0 :     if ( pDocSh )
    7375             :     {
    7376           0 :         ScPrintRangeSaver* pOldRanges = NULL;
    7377           0 :         ScDocument& rDoc = pDocSh->GetDocument();
    7378           0 :         SCTAB nTab = GetTab_Impl();
    7379             : 
    7380           0 :         if ( rDoc.IsUndoEnabled() )
    7381           0 :             pOldRanges = rDoc.CreatePrintRangeSaver();
    7382             : 
    7383           0 :         sal_uInt16 nCount = (sal_uInt16) aPrintAreas.getLength();
    7384           0 :         rDoc.ClearPrintRanges( nTab );
    7385           0 :         if (nCount)
    7386             :         {
    7387           0 :             ScRange aPrintRange;
    7388           0 :             const table::CellRangeAddress* pAry = aPrintAreas.getConstArray();
    7389           0 :             for (sal_uInt16 i=0; i<nCount; i++)
    7390             :             {
    7391           0 :                 ScUnoConversion::FillScRange( aPrintRange, pAry[i] );
    7392           0 :                 rDoc.AddPrintRange( nTab, aPrintRange );
    7393             :             }
    7394             :         }
    7395             : 
    7396           0 :         if ( rDoc.IsUndoEnabled() )
    7397           0 :             PrintAreaUndo_Impl( pOldRanges );   // Undo, Umbrueche, Modified etc.
    7398           0 :     }
    7399           0 : }
    7400             : 
    7401          34 : sal_Bool SAL_CALL ScTableSheetObj::getPrintTitleColumns() throw(uno::RuntimeException, std::exception)
    7402             : {
    7403          34 :     SolarMutexGuard aGuard;
    7404          34 :     ScDocShell* pDocSh = GetDocShell();
    7405          34 :     if ( pDocSh )
    7406             :     {
    7407          34 :         ScDocument& rDoc = pDocSh->GetDocument();
    7408          34 :         SCTAB nTab = GetTab_Impl();
    7409          34 :         return ( rDoc.GetRepeatColRange(nTab) != NULL );
    7410             :     }
    7411           0 :     return false;
    7412             : }
    7413             : 
    7414           1 : void SAL_CALL ScTableSheetObj::setPrintTitleColumns( sal_Bool bPrintTitleColumns )
    7415             :                                                     throw(uno::RuntimeException, std::exception)
    7416             : {
    7417           1 :     SolarMutexGuard aGuard;
    7418           1 :     ScDocShell* pDocSh = GetDocShell();
    7419           1 :     if ( pDocSh )
    7420             :     {
    7421           1 :         ScDocument& rDoc = pDocSh->GetDocument();
    7422           1 :         SCTAB nTab = GetTab_Impl();
    7423             : 
    7424           1 :         ScPrintRangeSaver* pOldRanges = rDoc.CreatePrintRangeSaver();
    7425             : 
    7426           1 :         if ( bPrintTitleColumns )
    7427             :         {
    7428           1 :             if ( !rDoc.GetRepeatColRange( nTab ) )         // keinen bestehenden Bereich veraendern
    7429             :             {
    7430           1 :                 ScRange aNew( 0, 0, nTab, 0, 0, nTab );     // Default
    7431           1 :                 rDoc.SetRepeatColRange( nTab, &aNew );     // einschalten
    7432             :             }
    7433             :         }
    7434             :         else
    7435           0 :             rDoc.SetRepeatColRange( nTab, NULL );          // abschalten
    7436             : 
    7437           1 :         PrintAreaUndo_Impl( pOldRanges );   // Undo, Umbrueche, Modified etc.
    7438             : 
    7439             :         //! zuletzt gesetzten Bereich beim Abschalten merken und beim Einschalten wiederherstellen ???
    7440           1 :     }
    7441           1 : }
    7442             : 
    7443          33 : table::CellRangeAddress SAL_CALL ScTableSheetObj::getTitleColumns() throw(uno::RuntimeException, std::exception)
    7444             : {
    7445          33 :     SolarMutexGuard aGuard;
    7446          33 :     table::CellRangeAddress aRet;
    7447          33 :     ScDocShell* pDocSh = GetDocShell();
    7448          33 :     if ( pDocSh )
    7449             :     {
    7450          33 :         ScDocument& rDoc = pDocSh->GetDocument();
    7451          33 :         SCTAB nTab = GetTab_Impl();
    7452          33 :         const ScRange* pRange = rDoc.GetRepeatColRange(nTab);
    7453          33 :         if (pRange)
    7454             :         {
    7455           0 :             ScUnoConversion::FillApiRange( aRet, *pRange );
    7456           0 :             aRet.Sheet = nTab; // core does not care about sheet index
    7457             :         }
    7458             :     }
    7459          33 :     return aRet;
    7460             : }
    7461             : 
    7462           0 : void SAL_CALL ScTableSheetObj::setTitleColumns( const table::CellRangeAddress& aTitleColumns )
    7463             :                                                     throw(uno::RuntimeException, std::exception)
    7464             : {
    7465           0 :     SolarMutexGuard aGuard;
    7466           0 :     ScDocShell* pDocSh = GetDocShell();
    7467           0 :     if ( pDocSh )
    7468             :     {
    7469           0 :         ScDocument& rDoc = pDocSh->GetDocument();
    7470           0 :         SCTAB nTab = GetTab_Impl();
    7471             : 
    7472           0 :         ScPrintRangeSaver* pOldRanges = rDoc.CreatePrintRangeSaver();
    7473             : 
    7474           0 :         ScRange aNew;
    7475           0 :         ScUnoConversion::FillScRange( aNew, aTitleColumns );
    7476           0 :         rDoc.SetRepeatColRange( nTab, &aNew );     // immer auch einschalten
    7477             : 
    7478           0 :         PrintAreaUndo_Impl( pOldRanges );           // Undo, Umbrueche, Modified etc.
    7479           0 :     }
    7480           0 : }
    7481             : 
    7482          36 : sal_Bool SAL_CALL ScTableSheetObj::getPrintTitleRows() throw(uno::RuntimeException, std::exception)
    7483             : {
    7484          36 :     SolarMutexGuard aGuard;
    7485          36 :     ScDocShell* pDocSh = GetDocShell();
    7486          36 :     if ( pDocSh )
    7487             :     {
    7488          36 :         ScDocument& rDoc = pDocSh->GetDocument();
    7489          36 :         SCTAB nTab = GetTab_Impl();
    7490          36 :         return ( rDoc.GetRepeatRowRange(nTab) != NULL );
    7491             :     }
    7492           0 :     return false;
    7493             : }
    7494             : 
    7495           3 : void SAL_CALL ScTableSheetObj::setPrintTitleRows( sal_Bool bPrintTitleRows )
    7496             :                                                 throw(uno::RuntimeException, std::exception)
    7497             : {
    7498           3 :     SolarMutexGuard aGuard;
    7499           3 :     ScDocShell* pDocSh = GetDocShell();
    7500           3 :     if ( pDocSh )
    7501             :     {
    7502           3 :         ScDocument& rDoc = pDocSh->GetDocument();
    7503           3 :         SCTAB nTab = GetTab_Impl();
    7504             : 
    7505           3 :         ScPrintRangeSaver* pOldRanges = rDoc.CreatePrintRangeSaver();
    7506             : 
    7507           3 :         if ( bPrintTitleRows )
    7508             :         {
    7509           3 :             if ( !rDoc.GetRepeatRowRange( nTab ) )         // keinen bestehenden Bereich veraendern
    7510             :             {
    7511           3 :                 ScRange aNew( 0, 0, nTab, 0, 0, nTab );     // Default
    7512           3 :                 rDoc.SetRepeatRowRange( nTab, &aNew );     // einschalten
    7513             :             }
    7514             :         }
    7515             :         else
    7516           0 :             rDoc.SetRepeatRowRange( nTab, NULL );          // abschalten
    7517             : 
    7518           3 :         PrintAreaUndo_Impl( pOldRanges );   // Undo, Umbrueche, Modified etc.
    7519             : 
    7520             :         //! zuletzt gesetzten Bereich beim Abschalten merken und beim Einschalten wiederherstellen ???
    7521           3 :     }
    7522           3 : }
    7523             : 
    7524          33 : table::CellRangeAddress SAL_CALL ScTableSheetObj::getTitleRows() throw(uno::RuntimeException, std::exception)
    7525             : {
    7526          33 :     SolarMutexGuard aGuard;
    7527          33 :     table::CellRangeAddress aRet;
    7528          33 :     ScDocShell* pDocSh = GetDocShell();
    7529          33 :     if ( pDocSh )
    7530             :     {
    7531          33 :         ScDocument& rDoc = pDocSh->GetDocument();
    7532          33 :         SCTAB nTab = GetTab_Impl();
    7533          33 :         const ScRange* pRange = rDoc.GetRepeatRowRange(nTab);
    7534          33 :         if (pRange)
    7535             :         {
    7536           0 :             ScUnoConversion::FillApiRange( aRet, *pRange );
    7537           0 :             aRet.Sheet = nTab; // core does not care about sheet index
    7538             :         }
    7539             :     }
    7540          33 :     return aRet;
    7541             : }
    7542             : 
    7543           2 : void SAL_CALL ScTableSheetObj::setTitleRows( const table::CellRangeAddress& aTitleRows )
    7544             :                                                     throw(uno::RuntimeException, std::exception)
    7545             : {
    7546           2 :     SolarMutexGuard aGuard;
    7547           2 :     ScDocShell* pDocSh = GetDocShell();
    7548           2 :     if ( pDocSh )
    7549             :     {
    7550           2 :         ScDocument& rDoc = pDocSh->GetDocument();
    7551           2 :         SCTAB nTab = GetTab_Impl();
    7552             : 
    7553           2 :         ScPrintRangeSaver* pOldRanges = rDoc.CreatePrintRangeSaver();
    7554             : 
    7555           2 :         ScRange aNew;
    7556           2 :         ScUnoConversion::FillScRange( aNew, aTitleRows );
    7557           2 :         rDoc.SetRepeatRowRange( nTab, &aNew );     // immer auch einschalten
    7558             : 
    7559           2 :         PrintAreaUndo_Impl( pOldRanges );           // Undo, Umbrueche, Modified etc.
    7560           2 :     }
    7561           2 : }
    7562             : 
    7563             : // XSheetLinkable
    7564             : 
    7565          33 : sheet::SheetLinkMode SAL_CALL ScTableSheetObj::getLinkMode() throw(uno::RuntimeException, std::exception)
    7566             : {
    7567          33 :     SolarMutexGuard aGuard;
    7568          33 :     sheet::SheetLinkMode eRet = sheet::SheetLinkMode_NONE;
    7569          33 :     ScDocShell* pDocSh = GetDocShell();
    7570          33 :     if ( pDocSh )
    7571             :     {
    7572          33 :         sal_uInt8 nMode = pDocSh->GetDocument().GetLinkMode( GetTab_Impl() );
    7573          33 :         if ( nMode == SC_LINK_NORMAL )
    7574           0 :             eRet = sheet::SheetLinkMode_NORMAL;
    7575          33 :         else if ( nMode == SC_LINK_VALUE )
    7576           0 :             eRet = sheet::SheetLinkMode_VALUE;
    7577             :     }
    7578          33 :     return eRet;
    7579             : }
    7580             : 
    7581           0 : void SAL_CALL ScTableSheetObj::setLinkMode( sheet::SheetLinkMode nLinkMode )
    7582             :                                                 throw(uno::RuntimeException, std::exception)
    7583             : {
    7584           0 :     SolarMutexGuard aGuard;
    7585             : 
    7586             :     //! Filter und Options aus altem Link suchen
    7587             : 
    7588           0 :     OUString aUrl(getLinkUrl());
    7589           0 :     OUString aSheet(getLinkSheetName());
    7590             : 
    7591           0 :     OUString aEmpty;
    7592           0 :     link( aUrl, aSheet, aEmpty, aEmpty, nLinkMode );
    7593           0 : }
    7594             : 
    7595           0 : OUString SAL_CALL ScTableSheetObj::getLinkUrl() throw(uno::RuntimeException, std::exception)
    7596             : {
    7597           0 :     SolarMutexGuard aGuard;
    7598           0 :     OUString aFile;
    7599           0 :     ScDocShell* pDocSh = GetDocShell();
    7600           0 :     if ( pDocSh )
    7601           0 :         aFile = pDocSh->GetDocument().GetLinkDoc( GetTab_Impl() );
    7602           0 :     return aFile;
    7603             : }
    7604             : 
    7605           0 : void SAL_CALL ScTableSheetObj::setLinkUrl( const OUString& aLinkUrl )
    7606             :                                                 throw(uno::RuntimeException, std::exception)
    7607             : {
    7608           0 :     SolarMutexGuard aGuard;
    7609             : 
    7610             :     //! Filter und Options aus altem Link suchen
    7611             : 
    7612           0 :     sheet::SheetLinkMode eMode = getLinkMode();
    7613           0 :     OUString aSheet(getLinkSheetName());
    7614             : 
    7615           0 :     OUString aEmpty;
    7616           0 :     link( aLinkUrl, aSheet, aEmpty, aEmpty, eMode );
    7617           0 : }
    7618             : 
    7619           0 : OUString SAL_CALL ScTableSheetObj::getLinkSheetName() throw(uno::RuntimeException, std::exception)
    7620             : {
    7621           0 :     SolarMutexGuard aGuard;
    7622           0 :     OUString aSheet;
    7623           0 :     ScDocShell* pDocSh = GetDocShell();
    7624           0 :     if ( pDocSh )
    7625           0 :         aSheet = pDocSh->GetDocument().GetLinkTab( GetTab_Impl() );
    7626           0 :     return aSheet;
    7627             : }
    7628             : 
    7629           0 : void SAL_CALL ScTableSheetObj::setLinkSheetName( const OUString& aLinkSheetName )
    7630             :                                                 throw(uno::RuntimeException, std::exception)
    7631             : {
    7632           0 :     SolarMutexGuard aGuard;
    7633             : 
    7634             :     //! Filter und Options aus altem Link suchen
    7635             : 
    7636           0 :     sheet::SheetLinkMode eMode = getLinkMode();
    7637           0 :     OUString aUrl(getLinkUrl());
    7638             : 
    7639           0 :     OUString aEmpty;
    7640           0 :     link( aUrl, aLinkSheetName, aEmpty, aEmpty, eMode );
    7641           0 : }
    7642             : 
    7643           2 : void SAL_CALL ScTableSheetObj::link( const OUString& aUrl, const OUString& aSheetName,
    7644             :                         const OUString& aFilterName, const OUString& aFilterOptions,
    7645             :                         sheet::SheetLinkMode nMode ) throw(uno::RuntimeException, std::exception)
    7646             : {
    7647           2 :     SolarMutexGuard aGuard;
    7648           2 :     ScDocShell* pDocSh = GetDocShell();
    7649           2 :     if ( pDocSh )
    7650             :     {
    7651           2 :         ScDocument& rDoc = pDocSh->GetDocument();
    7652           2 :         SCTAB nTab = GetTab_Impl();
    7653             : 
    7654           2 :         OUString aFileString = aUrl;
    7655           4 :         OUString aFilterString = aFilterName;
    7656           4 :         OUString aOptString = aFilterOptions;
    7657           4 :         OUString aSheetString = aSheetName;
    7658             : 
    7659           2 :         aFileString = ScGlobal::GetAbsDocName( aFileString, pDocSh );
    7660           2 :         if (aFilterString.isEmpty())
    7661           2 :             ScDocumentLoader::GetFilterName( aFileString, aFilterString, aOptString, true, false );
    7662             : 
    7663             :         //  remove application prefix from filter name here, so the filter options
    7664             :         //  aren't reset when the filter name is changed in ScTableLink::DataChanged
    7665           2 :         ScDocumentLoader::RemoveAppPrefix( aFilterString );
    7666             : 
    7667           2 :         sal_uInt8 nLinkMode = SC_LINK_NONE;
    7668           2 :         if ( nMode == sheet::SheetLinkMode_NORMAL )
    7669           0 :             nLinkMode = SC_LINK_NORMAL;
    7670           2 :         else if ( nMode == sheet::SheetLinkMode_VALUE )
    7671           2 :             nLinkMode = SC_LINK_VALUE;
    7672             : 
    7673           2 :         sal_uLong nRefresh = 0;
    7674           2 :         rDoc.SetLink( nTab, nLinkMode, aFileString, aFilterString, aOptString, aSheetString, nRefresh );
    7675             : 
    7676           2 :         pDocSh->UpdateLinks();                  // ggf. Link eintragen oder loeschen
    7677           2 :         SfxBindings* pBindings = pDocSh->GetViewBindings();
    7678           2 :         if (pBindings)
    7679           2 :             pBindings->Invalidate(SID_LINKS);
    7680             : 
    7681             :         //! Undo fuer Link-Daten an der Table
    7682             : 
    7683           2 :         if ( nLinkMode != SC_LINK_NONE && rDoc.IsExecuteLinkEnabled() )        // Link updaten
    7684             :         {
    7685             :             //  Update immer, auch wenn der Link schon da war
    7686             :             //! Update nur fuer die betroffene Tabelle???
    7687             : 
    7688           2 :             sfx2::LinkManager* pLinkManager = rDoc.GetLinkManager();
    7689           2 :             sal_uInt16 nCount = pLinkManager->GetLinks().size();
    7690           4 :             for ( sal_uInt16 i=0; i<nCount; i++ )
    7691             :             {
    7692           2 :                 ::sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[i];
    7693           2 :                 if (pBase->ISA(ScTableLink))
    7694             :                 {
    7695           2 :                     ScTableLink* pTabLink = static_cast<ScTableLink*>(pBase);
    7696           2 :                     if ( aFileString.equals(pTabLink->GetFileName()) )
    7697           2 :                         pTabLink->Update();                         // inkl. Paint&Undo
    7698             : 
    7699             :                     //! Der Dateiname sollte nur einmal vorkommen (?)
    7700             :                 }
    7701             :             }
    7702           2 :         }
    7703             : 
    7704             :         //! Notify fuer ScSheetLinkObj Objekte!!!
    7705           2 :     }
    7706           2 : }
    7707             : 
    7708             : // XSheetAuditing
    7709             : 
    7710           0 : sal_Bool SAL_CALL ScTableSheetObj::hideDependents( const table::CellAddress& aPosition )
    7711             :                                                 throw(uno::RuntimeException, std::exception)
    7712             : {
    7713           0 :     SolarMutexGuard aGuard;
    7714           0 :     ScDocShell* pDocSh = GetDocShell();
    7715           0 :     if ( pDocSh )
    7716             :     {
    7717           0 :         SCTAB nTab = GetTab_Impl();
    7718             :         OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
    7719           0 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    7720           0 :         return pDocSh->GetDocFunc().DetectiveDelSucc( aPos );
    7721             :     }
    7722           0 :     return false;
    7723             : }
    7724             : 
    7725           0 : sal_Bool SAL_CALL ScTableSheetObj::hidePrecedents( const table::CellAddress& aPosition )
    7726             :                                             throw(uno::RuntimeException, std::exception)
    7727             : {
    7728           0 :     SolarMutexGuard aGuard;
    7729           0 :     ScDocShell* pDocSh = GetDocShell();
    7730           0 :     if ( pDocSh )
    7731             :     {
    7732           0 :         SCTAB nTab = GetTab_Impl();
    7733             :         OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
    7734           0 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    7735           0 :         return pDocSh->GetDocFunc().DetectiveDelPred( aPos );
    7736             :     }
    7737           0 :     return false;
    7738             : }
    7739             : 
    7740           0 : sal_Bool SAL_CALL ScTableSheetObj::showDependents( const table::CellAddress& aPosition )
    7741             :                                             throw(uno::RuntimeException, std::exception)
    7742             : {
    7743           0 :     SolarMutexGuard aGuard;
    7744           0 :     ScDocShell* pDocSh = GetDocShell();
    7745           0 :     if ( pDocSh )
    7746             :     {
    7747           0 :         SCTAB nTab = GetTab_Impl();
    7748             :         OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
    7749           0 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    7750           0 :         return pDocSh->GetDocFunc().DetectiveAddSucc( aPos );
    7751             :     }
    7752           0 :     return false;
    7753             : }
    7754             : 
    7755           1 : sal_Bool SAL_CALL ScTableSheetObj::showPrecedents( const table::CellAddress& aPosition )
    7756             :                                             throw(uno::RuntimeException, std::exception)
    7757             : {
    7758           1 :     SolarMutexGuard aGuard;
    7759           1 :     ScDocShell* pDocSh = GetDocShell();
    7760           1 :     if ( pDocSh )
    7761             :     {
    7762           1 :         SCTAB nTab = GetTab_Impl();
    7763             :         OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
    7764           1 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    7765           1 :         return pDocSh->GetDocFunc().DetectiveAddPred( aPos );
    7766             :     }
    7767           0 :     return false;
    7768             : }
    7769             : 
    7770           0 : sal_Bool SAL_CALL ScTableSheetObj::showErrors( const table::CellAddress& aPosition )
    7771             :                                             throw(uno::RuntimeException, std::exception)
    7772             : {
    7773           0 :     SolarMutexGuard aGuard;
    7774           0 :     ScDocShell* pDocSh = GetDocShell();
    7775           0 :     if ( pDocSh )
    7776             :     {
    7777           0 :         SCTAB nTab = GetTab_Impl();
    7778             :         OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
    7779           0 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    7780           0 :         return pDocSh->GetDocFunc().DetectiveAddError( aPos );
    7781             :     }
    7782           0 :     return false;
    7783             : }
    7784             : 
    7785           0 : sal_Bool SAL_CALL ScTableSheetObj::showInvalid() throw(uno::RuntimeException, std::exception)
    7786             : {
    7787           0 :     SolarMutexGuard aGuard;
    7788           0 :     ScDocShell* pDocSh = GetDocShell();
    7789           0 :     if ( pDocSh )
    7790           0 :         return pDocSh->GetDocFunc().DetectiveMarkInvalid( GetTab_Impl() );
    7791           0 :     return false;
    7792             : }
    7793             : 
    7794           0 : void SAL_CALL ScTableSheetObj::clearArrows() throw(uno::RuntimeException, std::exception)
    7795             : {
    7796           0 :     SolarMutexGuard aGuard;
    7797           0 :     ScDocShell* pDocSh = GetDocShell();
    7798           0 :     if ( pDocSh )
    7799           0 :         pDocSh->GetDocFunc().DetectiveDelAll( GetTab_Impl() );
    7800           0 : }
    7801             : 
    7802             : // XSheetOutline
    7803             : 
    7804           8 : void SAL_CALL ScTableSheetObj::group( const table::CellRangeAddress& rGroupRange,
    7805             :                                         table::TableOrientation nOrientation )
    7806             :                                     throw (uno::RuntimeException,
    7807             :                                            std::exception)
    7808             : {
    7809           8 :     SolarMutexGuard aGuard;
    7810           8 :     ScDocShell* pDocSh = GetDocShell();
    7811           8 :     if ( pDocSh )
    7812             :     {
    7813           8 :         bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS );
    7814           8 :         ScRange aGroupRange;
    7815           8 :         ScUnoConversion::FillScRange( aGroupRange, rGroupRange );
    7816           8 :         ScOutlineDocFunc aFunc(*pDocSh);
    7817           8 :         aFunc.MakeOutline( aGroupRange, bColumns, true, true );
    7818           8 :     }
    7819           8 : }
    7820             : 
    7821           4 : void SAL_CALL ScTableSheetObj::ungroup( const table::CellRangeAddress& rGroupRange,
    7822             :                                         table::TableOrientation nOrientation )
    7823             :                                     throw (uno::RuntimeException,
    7824             :                                            std::exception)
    7825             : {
    7826           4 :     SolarMutexGuard aGuard;
    7827           4 :     ScDocShell* pDocSh = GetDocShell();
    7828           4 :     if ( pDocSh )
    7829             :     {
    7830           4 :         bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS );
    7831           4 :         ScRange aGroupRange;
    7832           4 :         ScUnoConversion::FillScRange( aGroupRange, rGroupRange );
    7833           4 :         ScOutlineDocFunc aFunc(*pDocSh);
    7834           4 :         aFunc.RemoveOutline( aGroupRange, bColumns, true, true );
    7835           4 :     }
    7836           4 : }
    7837             : 
    7838           1 : void SAL_CALL ScTableSheetObj::autoOutline( const table::CellRangeAddress& rCellRange )
    7839             :     throw(uno::RuntimeException, std::exception)
    7840             : {
    7841           1 :     SolarMutexGuard aGuard;
    7842           1 :     ScDocShell* pDocSh = GetDocShell();
    7843           1 :     if ( pDocSh )
    7844             :     {
    7845           1 :         ScRange aFormulaRange;
    7846           1 :         ScUnoConversion::FillScRange( aFormulaRange, rCellRange );
    7847           1 :         ScOutlineDocFunc aFunc(*pDocSh);
    7848           1 :         aFunc.AutoOutline( aFormulaRange, true );
    7849           1 :     }
    7850           1 : }
    7851             : 
    7852           7 : void SAL_CALL ScTableSheetObj::clearOutline()
    7853             :     throw(uno::RuntimeException, std::exception)
    7854             : {
    7855           7 :     SolarMutexGuard aGuard;
    7856           7 :     ScDocShell* pDocSh = GetDocShell();
    7857           7 :     if ( pDocSh )
    7858             :     {
    7859           7 :         SCTAB nTab = GetTab_Impl();
    7860           7 :         ScOutlineDocFunc aFunc(*pDocSh);
    7861           7 :         aFunc.RemoveAllOutlines( nTab, true );
    7862           7 :     }
    7863           7 : }
    7864             : 
    7865          13 : void SAL_CALL ScTableSheetObj::hideDetail( const table::CellRangeAddress& rCellRange )
    7866             :     throw(uno::RuntimeException, std::exception)
    7867             : {
    7868          13 :     SolarMutexGuard aGuard;
    7869          13 :     ScDocShell* pDocSh = GetDocShell();
    7870          13 :     if ( pDocSh )
    7871             :     {
    7872          13 :         ScRange aMarkRange;
    7873          13 :         ScUnoConversion::FillScRange( aMarkRange, rCellRange );
    7874          13 :         ScOutlineDocFunc aFunc(*pDocSh);
    7875          13 :         aFunc.HideMarkedOutlines( aMarkRange, true );
    7876          13 :     }
    7877          13 : }
    7878             : 
    7879          10 : void SAL_CALL ScTableSheetObj::showDetail( const table::CellRangeAddress& rCellRange )
    7880             :     throw(uno::RuntimeException, std::exception)
    7881             : {
    7882          10 :     SolarMutexGuard aGuard;
    7883          10 :     ScDocShell* pDocSh = GetDocShell();
    7884          10 :     if ( pDocSh )
    7885             :     {
    7886          10 :         ScRange aMarkRange;
    7887          10 :         ScUnoConversion::FillScRange( aMarkRange, rCellRange );
    7888          10 :         ScOutlineDocFunc aFunc(*pDocSh);
    7889          10 :         aFunc.ShowMarkedOutlines( aMarkRange, true );
    7890          10 :     }
    7891          10 : }
    7892             : 
    7893           1 : void SAL_CALL ScTableSheetObj::showLevel( sal_Int16 nLevel, table::TableOrientation nOrientation )
    7894             :     throw(uno::RuntimeException, std::exception)
    7895             : {
    7896           1 :     SolarMutexGuard aGuard;
    7897           1 :     ScDocShell* pDocSh = GetDocShell();
    7898           1 :     if ( pDocSh )
    7899             :     {
    7900           1 :         bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS );
    7901           1 :         SCTAB nTab = GetTab_Impl();
    7902           1 :         ScOutlineDocFunc aFunc(*pDocSh);
    7903           1 :         aFunc.SelectLevel( nTab, bColumns, nLevel, true, true );
    7904           1 :     }
    7905           1 : }
    7906             : 
    7907             : // XProtectable
    7908             : 
    7909           0 : void SAL_CALL ScTableSheetObj::protect( const OUString& aPassword )
    7910             :                                             throw(uno::RuntimeException, std::exception)
    7911             : {
    7912           0 :     SolarMutexGuard aGuard;
    7913           0 :     ScDocShell* pDocSh = GetDocShell();
    7914             :     // #i108245# if already protected, don't change anything
    7915           0 :     if ( pDocSh && !pDocSh->GetDocument().IsTabProtected( GetTab_Impl() ) )
    7916             :     {
    7917           0 :         OUString aString(aPassword);
    7918           0 :         pDocSh->GetDocFunc().Protect( GetTab_Impl(), aString, true );
    7919           0 :     }
    7920           0 : }
    7921             : 
    7922           0 : void SAL_CALL ScTableSheetObj::unprotect( const OUString& aPassword )
    7923             :                             throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    7924             : {
    7925           0 :     SolarMutexGuard aGuard;
    7926           0 :     ScDocShell* pDocSh = GetDocShell();
    7927           0 :     if ( pDocSh )
    7928             :     {
    7929           0 :         OUString aString(aPassword);
    7930           0 :         bool bDone = pDocSh->GetDocFunc().Unprotect( GetTab_Impl(), aString, true );
    7931           0 :         if (!bDone)
    7932           0 :             throw lang::IllegalArgumentException();
    7933           0 :     }
    7934           0 : }
    7935             : 
    7936          33 : sal_Bool SAL_CALL ScTableSheetObj::isProtected() throw(uno::RuntimeException, std::exception)
    7937             : {
    7938          33 :     SolarMutexGuard aGuard;
    7939          33 :     ScDocShell* pDocSh = GetDocShell();
    7940          33 :     if ( pDocSh )
    7941          33 :         return pDocSh->GetDocument().IsTabProtected( GetTab_Impl() );
    7942             : 
    7943             :     OSL_FAIL("keine DocShell");     //! Exception oder so?
    7944           0 :     return false;
    7945             : }
    7946             : 
    7947             : // XScenario
    7948             : 
    7949           0 : sal_Bool SAL_CALL ScTableSheetObj::getIsScenario() throw(uno::RuntimeException, std::exception)
    7950             : {
    7951           0 :     SolarMutexGuard aGuard;
    7952           0 :     ScDocShell* pDocSh = GetDocShell();
    7953           0 :     if ( pDocSh )
    7954           0 :         return pDocSh->GetDocument().IsScenario( GetTab_Impl() );
    7955             : 
    7956           0 :     return false;
    7957             : }
    7958             : 
    7959           0 : OUString SAL_CALL ScTableSheetObj::getScenarioComment() throw(uno::RuntimeException, std::exception)
    7960             : {
    7961           0 :     SolarMutexGuard aGuard;
    7962           0 :     ScDocShell* pDocSh = GetDocShell();
    7963           0 :     if ( pDocSh )
    7964             :     {
    7965           0 :         OUString aComment;
    7966           0 :         Color  aColor;
    7967             :         sal_uInt16 nFlags;
    7968           0 :         pDocSh->GetDocument().GetScenarioData( GetTab_Impl(), aComment, aColor, nFlags );
    7969           0 :         return aComment;
    7970             :     }
    7971           0 :     return OUString();
    7972             : }
    7973             : 
    7974           0 : void SAL_CALL ScTableSheetObj::setScenarioComment( const OUString& aScenarioComment )
    7975             :                                                 throw(uno::RuntimeException, std::exception)
    7976             : {
    7977           0 :     SolarMutexGuard aGuard;
    7978           0 :     ScDocShell* pDocSh = GetDocShell();
    7979           0 :     if ( pDocSh )
    7980             :     {
    7981           0 :         ScDocument& rDoc = pDocSh->GetDocument();
    7982           0 :         SCTAB nTab = GetTab_Impl();
    7983             : 
    7984           0 :         OUString aName;
    7985           0 :         OUString aComment;
    7986           0 :         Color  aColor;
    7987             :         sal_uInt16 nFlags;
    7988           0 :         rDoc.GetName( nTab, aName );
    7989           0 :         rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    7990             : 
    7991           0 :         aComment = aScenarioComment;
    7992             : 
    7993           0 :         pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    7994           0 :     }
    7995           0 : }
    7996             : 
    7997           0 : void SAL_CALL ScTableSheetObj::addRanges( const uno::Sequence<table::CellRangeAddress>& rScenRanges )
    7998             :                                                 throw(uno::RuntimeException, std::exception)
    7999             : {
    8000           0 :     SolarMutexGuard aGuard;
    8001           0 :     ScDocShell* pDocSh = GetDocShell();
    8002           0 :     if ( pDocSh )
    8003             :     {
    8004           0 :         ScDocument& rDoc = pDocSh->GetDocument();
    8005           0 :         SCTAB nTab = GetTab_Impl();
    8006             : 
    8007           0 :         if (rDoc.IsScenario(nTab))
    8008             :         {
    8009           0 :             ScMarkData aMarkData;
    8010           0 :             aMarkData.SelectTable( nTab, true );
    8011             : 
    8012           0 :             sal_uInt16 nRangeCount = (sal_uInt16)rScenRanges.getLength();
    8013           0 :             if (nRangeCount)
    8014             :             {
    8015           0 :                 const table::CellRangeAddress* pAry = rScenRanges.getConstArray();
    8016           0 :                 for (sal_uInt16 i=0; i<nRangeCount; i++)
    8017             :                 {
    8018             :                     OSL_ENSURE( pAry[i].Sheet == nTab, "addRanges mit falscher Tab" );
    8019           0 :                     ScRange aOneRange( (SCCOL)pAry[i].StartColumn, (SCROW)pAry[i].StartRow, nTab,
    8020           0 :                                        (SCCOL)pAry[i].EndColumn,   (SCROW)pAry[i].EndRow,   nTab );
    8021             : 
    8022           0 :                     aMarkData.SetMultiMarkArea( aOneRange );
    8023             :                 }
    8024             :             }
    8025             : 
    8026             :             //  Szenario-Ranges sind durch Attribut gekennzeichnet
    8027           0 :             ScPatternAttr aPattern( rDoc.GetPool() );
    8028           0 :             aPattern.GetItemSet().Put( ScMergeFlagAttr( SC_MF_SCENARIO ) );
    8029           0 :             aPattern.GetItemSet().Put( ScProtectionAttr( true ) );
    8030           0 :             pDocSh->GetDocFunc().ApplyAttributes( aMarkData, aPattern, true, true );
    8031             :         }
    8032           0 :     }
    8033           0 : }
    8034             : 
    8035           0 : void SAL_CALL ScTableSheetObj::apply() throw(uno::RuntimeException, std::exception)
    8036             : {
    8037           0 :     SolarMutexGuard aGuard;
    8038           0 :     ScDocShell* pDocSh = GetDocShell();
    8039           0 :     if ( pDocSh )
    8040             :     {
    8041           0 :         ScDocument& rDoc = pDocSh->GetDocument();
    8042           0 :         SCTAB nTab = GetTab_Impl();
    8043           0 :         OUString aName;
    8044           0 :         rDoc.GetName( nTab, aName );       // Name dieses Szenarios
    8045             : 
    8046           0 :         SCTAB nDestTab = nTab;
    8047           0 :         while ( nDestTab > 0 && rDoc.IsScenario(nDestTab) )
    8048           0 :             --nDestTab;
    8049             : 
    8050           0 :         if ( !rDoc.IsScenario(nDestTab) )
    8051           0 :             pDocSh->UseScenario( nDestTab, aName );
    8052             : 
    8053             :         //! sonst Fehler oder so
    8054           0 :     }
    8055           0 : }
    8056             : 
    8057             : // XScenarioEnhanced
    8058             : 
    8059           0 : uno::Sequence< table::CellRangeAddress > SAL_CALL ScTableSheetObj::getRanges(  )
    8060             :                                     throw(uno::RuntimeException, std::exception)
    8061             : {
    8062           0 :     SolarMutexGuard aGuard;
    8063           0 :     ScDocShell* pDocSh = GetDocShell();
    8064           0 :     if ( pDocSh )
    8065             :     {
    8066           0 :         ScDocument& rDoc = pDocSh->GetDocument();
    8067           0 :         SCTAB nTab = GetTab_Impl();
    8068           0 :         const ScRangeList* pRangeList = rDoc.GetScenarioRanges(nTab);
    8069           0 :         if (pRangeList)
    8070             :         {
    8071           0 :             size_t nCount = pRangeList->size();
    8072           0 :             uno::Sequence< table::CellRangeAddress > aRetRanges( nCount );
    8073           0 :             table::CellRangeAddress* pAry = aRetRanges.getArray();
    8074           0 :             for( size_t nIndex = 0; nIndex < nCount; nIndex++ )
    8075             :             {
    8076           0 :                 const ScRange* pRange = (*pRangeList)[nIndex];
    8077           0 :                 pAry->StartColumn = pRange->aStart.Col();
    8078           0 :                 pAry->StartRow = pRange->aStart.Row();
    8079           0 :                 pAry->EndColumn = pRange->aEnd.Col();
    8080           0 :                 pAry->EndRow = pRange->aEnd.Row();
    8081           0 :                 pAry->Sheet = pRange->aStart.Tab();
    8082           0 :                 ++pAry;
    8083             :             }
    8084           0 :             return aRetRanges;
    8085             :         }
    8086             :     }
    8087           0 :     return uno::Sequence< table::CellRangeAddress > ();
    8088             : }
    8089             : 
    8090             : // XExternalSheetName
    8091             : 
    8092           0 : void ScTableSheetObj::setExternalName( const OUString& aUrl, const OUString& aSheetName )
    8093             :     throw (container::ElementExistException, uno::RuntimeException, std::exception)
    8094             : {
    8095           0 :     SolarMutexGuard aGuard;
    8096           0 :     ScDocShell* pDocSh = GetDocShell();
    8097           0 :     if ( pDocSh )
    8098             :     {
    8099           0 :         ScDocument& rDoc = pDocSh->GetDocument();
    8100           0 :         const SCTAB nTab = GetTab_Impl();
    8101           0 :         const OUString aAbsDocName( ScGlobal::GetAbsDocName( aUrl, pDocSh ) );
    8102           0 :         const OUString aDocTabName( ScGlobal::GetDocTabName( aAbsDocName, aSheetName ) );
    8103           0 :         if ( !rDoc.RenameTab( nTab, aDocTabName, false /*bUpdateRef*/, true /*bExternalDocument*/ ) )
    8104             :         {
    8105           0 :             throw container::ElementExistException( OUString(), *this );
    8106           0 :         }
    8107           0 :     }
    8108           0 : }
    8109             : 
    8110             : // XEventsSupplier
    8111             : 
    8112           0 : uno::Reference<container::XNameReplace> SAL_CALL ScTableSheetObj::getEvents() throw (uno::RuntimeException, std::exception)
    8113             : {
    8114           0 :     SolarMutexGuard aGuard;
    8115           0 :     ScDocShell* pDocSh = GetDocShell();
    8116           0 :     if ( pDocSh )
    8117           0 :         return new ScSheetEventsObj( pDocSh, GetTab_Impl() );
    8118             : 
    8119           0 :     return NULL;
    8120             : }
    8121             : 
    8122             : // XPropertySet erweitert fuer Sheet-Properties
    8123             : 
    8124         729 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableSheetObj::getPropertySetInfo()
    8125             :                                                         throw(uno::RuntimeException, std::exception)
    8126             : {
    8127         729 :     SolarMutexGuard aGuard;
    8128             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    8129         729 :         new SfxItemPropertySetInfo( pSheetPropSet->getPropertyMap() ));
    8130         729 :     return aRef;
    8131             : }
    8132             : 
    8133        1905 : void ScTableSheetObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    8134             :     throw(lang::IllegalArgumentException, uno::RuntimeException,
    8135             :           std::exception)
    8136             : {
    8137        1905 :     if ( pEntry )
    8138             :     {
    8139        1905 :         if ( IsScItemWid( pEntry->nWID ) )
    8140             :         {
    8141             :             //  for Item WIDs, call ScCellRangesBase directly
    8142           0 :             ScCellRangesBase::SetOnePropertyValue(pEntry, aValue);
    8143           0 :             return;
    8144             :         }
    8145             : 
    8146             :         //  own properties
    8147             : 
    8148        1905 :         ScDocShell* pDocSh = GetDocShell();
    8149        1905 :         if (!pDocSh)
    8150           0 :             return;                                                 //! Exception oder so?
    8151        1905 :         ScDocument& rDoc = pDocSh->GetDocument();
    8152        1905 :         SCTAB nTab = GetTab_Impl();
    8153        1905 :         ScDocFunc &rFunc = pDocSh->GetDocFunc();
    8154             : 
    8155        1905 :         if ( pEntry->nWID == SC_WID_UNO_PAGESTL )
    8156             :         {
    8157         328 :             OUString aStrVal;
    8158         328 :             aValue >>= aStrVal;
    8159             :             OUString aNewStr(ScStyleNameConversion::ProgrammaticToDisplayName(
    8160         656 :                                                 aStrVal, SFX_STYLE_FAMILY_PAGE ));
    8161             : 
    8162             :             //! Undo? (auch bei SID_STYLE_APPLY an der View)
    8163             : 
    8164         328 :             if ( rDoc.GetPageStyle( nTab ) != aNewStr )
    8165             :             {
    8166          41 :                 rDoc.SetPageStyle( nTab, aNewStr );
    8167          41 :                 if (!rDoc.IsImportingXML())
    8168             :                 {
    8169           2 :                     ScPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ).UpdatePages();
    8170             : 
    8171           2 :                     SfxBindings* pBindings = pDocSh->GetViewBindings();
    8172           2 :                     if (pBindings)
    8173             :                     {
    8174           2 :                         pBindings->Invalidate( SID_STYLE_FAMILY4 );
    8175           2 :                         pBindings->Invalidate( SID_STATUS_PAGESTYLE );
    8176           2 :                         pBindings->Invalidate( FID_RESET_PRINTZOOM );
    8177           2 :                         pBindings->Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT );
    8178           2 :                         pBindings->Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT );
    8179             :                     }
    8180             :                 }
    8181          41 :                 pDocSh->SetDocumentModified();
    8182         328 :             }
    8183             :         }
    8184        1577 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    8185             :         {
    8186         747 :             bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8187         747 :             rFunc.SetTableVisible( nTab, bVis, true );
    8188             :         }
    8189         830 :         else if ( pEntry->nWID == SC_WID_UNO_ISACTIVE )
    8190             :         {
    8191           0 :             if (rDoc.IsScenario(nTab))
    8192           0 :                 rDoc.SetActiveScenario( nTab, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
    8193             :         }
    8194         830 :         else if ( pEntry->nWID == SC_WID_UNO_BORDCOL )
    8195             :         {
    8196           0 :             if (rDoc.IsScenario(nTab))
    8197             :             {
    8198           0 :                 sal_Int32 nNewColor = 0;
    8199           0 :                 if (aValue >>= nNewColor)
    8200             :                 {
    8201           0 :                     OUString aName;
    8202           0 :                     OUString aComment;
    8203           0 :                     Color  aColor;
    8204             :                     sal_uInt16 nFlags;
    8205           0 :                     rDoc.GetName( nTab, aName );
    8206           0 :                     rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8207             : 
    8208           0 :                     aColor = Color(static_cast<sal_uInt32>(nNewColor));
    8209             : 
    8210           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8211             :                 }
    8212             :             }
    8213             :         }
    8214         830 :         else if ( pEntry->nWID == SC_WID_UNO_PROTECT )
    8215             :         {
    8216           0 :             if (rDoc.IsScenario(nTab))
    8217             :             {
    8218           0 :                 OUString aName;
    8219           0 :                 OUString aComment;
    8220           0 :                 Color  aColor;
    8221             :                 sal_uInt16 nFlags;
    8222           0 :                 rDoc.GetName( nTab, aName );
    8223           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8224           0 :                 bool bModify(false);
    8225             : 
    8226           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8227             :                 {
    8228           0 :                     if (!(nFlags & SC_SCENARIO_PROTECT))
    8229             :                     {
    8230           0 :                         nFlags |= SC_SCENARIO_PROTECT;
    8231           0 :                         bModify = true;
    8232             :                     }
    8233             :                 }
    8234             :                 else
    8235             :                 {
    8236           0 :                     if (nFlags & SC_SCENARIO_PROTECT)
    8237             :                     {
    8238           0 :                         nFlags -= SC_SCENARIO_PROTECT;
    8239           0 :                         bModify = true;
    8240             :                     }
    8241             :                 }
    8242             : 
    8243           0 :                 if (bModify)
    8244           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8245             :             }
    8246             :         }
    8247         830 :         else if ( pEntry->nWID == SC_WID_UNO_SHOWBORD )
    8248             :         {
    8249           0 :             if (rDoc.IsScenario(nTab))
    8250             :             {
    8251           0 :                 OUString aName;
    8252           0 :                 OUString aComment;
    8253           0 :                 Color  aColor;
    8254             :                 sal_uInt16 nFlags;
    8255           0 :                 rDoc.GetName( nTab, aName );
    8256           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8257           0 :                 bool bModify(false);
    8258             : 
    8259           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8260             :                 {
    8261           0 :                     if (!(nFlags & SC_SCENARIO_SHOWFRAME))
    8262             :                     {
    8263           0 :                         nFlags |= SC_SCENARIO_SHOWFRAME;
    8264           0 :                         bModify = true;
    8265             :                     }
    8266             :                 }
    8267             :                 else
    8268             :                 {
    8269           0 :                     if (nFlags & SC_SCENARIO_SHOWFRAME)
    8270             :                     {
    8271           0 :                         nFlags -= SC_SCENARIO_SHOWFRAME;
    8272           0 :                         bModify = true;
    8273             :                     }
    8274             :                 }
    8275             : 
    8276           0 :                 if (bModify)
    8277           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8278             :             }
    8279             :         }
    8280         830 :         else if ( pEntry->nWID == SC_WID_UNO_PRINTBORD )
    8281             :         {
    8282           0 :             if (rDoc.IsScenario(nTab))
    8283             :             {
    8284           0 :                 OUString aName;
    8285           0 :                 OUString aComment;
    8286           0 :                 Color  aColor;
    8287             :                 sal_uInt16 nFlags;
    8288           0 :                 rDoc.GetName( nTab, aName );
    8289           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8290           0 :                 bool bModify(false);
    8291             : 
    8292           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8293             :                 {
    8294           0 :                     if (!(nFlags & SC_SCENARIO_PRINTFRAME))
    8295             :                     {
    8296           0 :                         nFlags |= SC_SCENARIO_PRINTFRAME;
    8297           0 :                         bModify = true;
    8298             :                     }
    8299             :                 }
    8300             :                 else
    8301             :                 {
    8302           0 :                     if (nFlags & SC_SCENARIO_PRINTFRAME)
    8303             :                     {
    8304           0 :                         nFlags -= SC_SCENARIO_PRINTFRAME;
    8305           0 :                         bModify = true;
    8306             :                     }
    8307             :                 }
    8308             : 
    8309           0 :                 if (bModify)
    8310           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8311             :             }
    8312             :         }
    8313         830 :         else if ( pEntry->nWID == SC_WID_UNO_COPYBACK )
    8314             :         {
    8315           0 :             if (rDoc.IsScenario(nTab))
    8316             :             {
    8317           0 :                 OUString aName;
    8318           0 :                 OUString aComment;
    8319           0 :                 Color  aColor;
    8320             :                 sal_uInt16 nFlags;
    8321           0 :                 rDoc.GetName( nTab, aName );
    8322           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8323           0 :                 bool bModify(false);
    8324             : 
    8325           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8326             :                 {
    8327           0 :                     if (!(nFlags & SC_SCENARIO_TWOWAY))
    8328             :                     {
    8329           0 :                         nFlags |= SC_SCENARIO_TWOWAY;
    8330           0 :                         bModify = true;
    8331             :                     }
    8332             :                 }
    8333             :                 else
    8334             :                 {
    8335           0 :                     if (nFlags & SC_SCENARIO_TWOWAY)
    8336             :                     {
    8337           0 :                         nFlags -= SC_SCENARIO_TWOWAY;
    8338           0 :                         bModify = true;
    8339             :                     }
    8340             :                 }
    8341             : 
    8342           0 :                 if (bModify)
    8343           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8344             :             }
    8345             :         }
    8346         830 :         else if ( pEntry->nWID == SC_WID_UNO_COPYSTYL )
    8347             :         {
    8348           0 :             if (rDoc.IsScenario(nTab))
    8349             :             {
    8350           0 :                 OUString aName;
    8351           0 :                 OUString aComment;
    8352           0 :                 Color  aColor;
    8353             :                 sal_uInt16 nFlags;
    8354           0 :                 rDoc.GetName( nTab, aName );
    8355           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8356           0 :                 bool bModify(false);
    8357             : 
    8358           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8359             :                 {
    8360           0 :                     if (!(nFlags & SC_SCENARIO_ATTRIB))
    8361             :                     {
    8362           0 :                         nFlags |= SC_SCENARIO_ATTRIB;
    8363           0 :                         bModify = true;
    8364             :                     }
    8365             :                 }
    8366             :                 else
    8367             :                 {
    8368           0 :                     if (nFlags & SC_SCENARIO_ATTRIB)
    8369             :                     {
    8370           0 :                         nFlags -= SC_SCENARIO_ATTRIB;
    8371           0 :                         bModify = true;
    8372             :                     }
    8373             :                 }
    8374             : 
    8375           0 :                 if (bModify)
    8376           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8377             :             }
    8378             :         }
    8379         830 :         else if ( pEntry->nWID == SC_WID_UNO_COPYFORM )
    8380             :         {
    8381           0 :             if (rDoc.IsScenario(nTab))
    8382             :             {
    8383           0 :                 OUString aName;
    8384           0 :                 OUString aComment;
    8385           0 :                 Color  aColor;
    8386             :                 sal_uInt16 nFlags;
    8387           0 :                 rDoc.GetName( nTab, aName );
    8388           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8389           0 :                 bool bModify(false);
    8390             : 
    8391           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8392             :                 {
    8393           0 :                     if (nFlags & SC_SCENARIO_VALUE)
    8394             :                     {
    8395           0 :                         nFlags -= SC_SCENARIO_VALUE;
    8396           0 :                         bModify = true;
    8397             :                     }
    8398             :                 }
    8399             :                 else
    8400             :                 {
    8401           0 :                     if (!(nFlags & SC_SCENARIO_VALUE))
    8402             :                     {
    8403           0 :                         nFlags |= SC_SCENARIO_VALUE;
    8404           0 :                         bModify = true;
    8405             :                     }
    8406             :                 }
    8407             : 
    8408           0 :                 if (bModify)
    8409           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8410             :             }
    8411             :         }
    8412         830 :         else if ( pEntry->nWID == SC_WID_UNO_TABLAYOUT )
    8413             :         {
    8414         291 :             sal_Int16 nValue = 0;
    8415         291 :             if (aValue >>= nValue)
    8416             :             {
    8417         291 :                 if (nValue == com::sun::star::text::WritingMode2::RL_TB)
    8418           2 :                     rFunc.SetLayoutRTL(nTab, true, true);
    8419             :                 else
    8420         289 :                     rFunc.SetLayoutRTL(nTab, false, true);
    8421             :             }
    8422             :         }
    8423         539 :         else if ( pEntry->nWID == SC_WID_UNO_AUTOPRINT )
    8424             :         {
    8425           0 :             bool bAutoPrint = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8426           0 :             if (bAutoPrint)
    8427           0 :                 rDoc.SetPrintEntireSheet( nTab ); // clears all print ranges
    8428             :             else
    8429             :             {
    8430           0 :                 if (rDoc.IsPrintEntireSheet( nTab ))
    8431           0 :                     rDoc.ClearPrintRanges( nTab ); // if this flag is true, there are no PrintRanges, so Clear clears only the flag.
    8432             :             }
    8433             :         }
    8434         539 :         else if ( pEntry->nWID == SC_WID_UNO_TABCOLOR )
    8435             :         {
    8436         268 :             sal_Int32 nColor = COL_AUTO;
    8437         268 :             if ( aValue >>= nColor )
    8438             :             {
    8439         268 :                 const Color aColor( static_cast< ColorData >( nColor ) );
    8440         268 :                 if ( rDoc.GetTabBgColor( nTab ) != aColor )
    8441          20 :                     rFunc.SetTabBgColor( nTab, aColor, true, true );
    8442             :             }
    8443             :         }
    8444         271 :         else if ( pEntry->nWID == SC_WID_UNO_CODENAME )
    8445             :         {
    8446         269 :             OUString aCodeName;
    8447         269 :             if ( pDocSh && ( aValue >>= aCodeName ) )
    8448             :             {
    8449         269 :                 pDocSh->GetDocument().SetCodeName( GetTab_Impl(), aCodeName );
    8450         269 :             }
    8451             :         }
    8452           2 :         else if (pEntry->nWID == SC_WID_UNO_CONDFORMAT)
    8453             :         {
    8454           0 :             uno::Reference<sheet::XConditionalFormats> xCondFormat;
    8455           0 :             if (aValue >>= xCondFormat)
    8456             :             {
    8457             :                 // how to set the format correctly
    8458           0 :             }
    8459             :         }
    8460             :         else
    8461           2 :             ScCellRangeObj::SetOnePropertyValue(pEntry, aValue);        // base class, no Item WID
    8462             :     }
    8463             : }
    8464             : 
    8465        2605 : void ScTableSheetObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
    8466             :                                             uno::Any& rAny )
    8467             :     throw(uno::RuntimeException,
    8468             :           std::exception)
    8469             : {
    8470        2605 :     if ( pEntry )
    8471             :     {
    8472        2605 :         ScDocShell* pDocSh = GetDocShell();
    8473        2605 :         if (!pDocSh)
    8474           0 :             throw uno::RuntimeException();
    8475        2605 :         ScDocument& rDoc = pDocSh->GetDocument();
    8476        2605 :         SCTAB nTab = GetTab_Impl();
    8477             : 
    8478        2605 :         if ( pEntry->nWID == SC_WID_UNO_NAMES )
    8479             :         {
    8480           0 :             rAny <<= uno::Reference<sheet::XNamedRanges>(new ScLocalNamedRangesObj(pDocSh, this));
    8481             :         }
    8482        2605 :         else if ( pEntry->nWID == SC_WID_UNO_PAGESTL )
    8483             :         {
    8484         186 :             rAny <<= OUString( ScStyleNameConversion::DisplayToProgrammaticName(
    8485          93 :                                 rDoc.GetPageStyle( nTab ), SFX_STYLE_FAMILY_PAGE ) );
    8486             :         }
    8487        2512 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    8488             :         {
    8489          46 :             bool bVis = rDoc.IsVisible( nTab );
    8490          46 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bVis );
    8491             :         }
    8492        2466 :         else if ( pEntry->nWID == SC_WID_UNO_LINKDISPBIT )
    8493             :         {
    8494             :             //  no target bitmaps for individual entries (would be all equal)
    8495             :             // ScLinkTargetTypeObj::SetLinkTargetBitmap( aAny, SC_LINKTARGETTYPE_SHEET );
    8496             :         }
    8497        2466 :         else if ( pEntry->nWID == SC_WID_UNO_LINKDISPNAME )
    8498             :         {
    8499             :             //  LinkDisplayName for hyperlink dialog
    8500           0 :             rAny <<= getName();     // sheet name
    8501             :         }
    8502        2466 :         else if ( pEntry->nWID == SC_WID_UNO_ISACTIVE )
    8503             :         {
    8504           0 :             if (rDoc.IsScenario(nTab))
    8505           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, rDoc.IsActiveScenario( nTab ));
    8506             :         }
    8507        2466 :         else if ( pEntry->nWID == SC_WID_UNO_BORDCOL )
    8508             :         {
    8509           0 :             if (rDoc.IsScenario(nTab))
    8510             :             {
    8511           0 :                 OUString aComment;
    8512           0 :                 Color  aColor;
    8513             :                 sal_uInt16 nFlags;
    8514           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8515             : 
    8516           0 :                 rAny <<= static_cast<sal_Int32>(aColor.GetColor());
    8517             :             }
    8518             :         }
    8519        2466 :         else if ( pEntry->nWID == SC_WID_UNO_PROTECT )
    8520             :         {
    8521           0 :             if (rDoc.IsScenario(nTab))
    8522             :             {
    8523           0 :                 OUString aComment;
    8524           0 :                 Color  aColor;
    8525             :                 sal_uInt16 nFlags;
    8526           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8527             : 
    8528           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_PROTECT) != 0 );
    8529             :             }
    8530             :         }
    8531        2466 :         else if ( pEntry->nWID == SC_WID_UNO_SHOWBORD )
    8532             :         {
    8533           0 :             if (rDoc.IsScenario(nTab))
    8534             :             {
    8535           0 :                 OUString aComment;
    8536           0 :                 Color  aColor;
    8537             :                 sal_uInt16 nFlags;
    8538           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8539             : 
    8540           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_SHOWFRAME) != 0 );
    8541             :             }
    8542             :         }
    8543        2466 :         else if ( pEntry->nWID == SC_WID_UNO_PRINTBORD )
    8544             :         {
    8545           0 :             if (rDoc.IsScenario(nTab))
    8546             :             {
    8547           0 :                 OUString aComment;
    8548           0 :                 Color  aColor;
    8549             :                 sal_uInt16 nFlags;
    8550           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8551             : 
    8552           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_PRINTFRAME) != 0 );
    8553             :             }
    8554             :         }
    8555        2466 :         else if ( pEntry->nWID == SC_WID_UNO_COPYBACK )
    8556             :         {
    8557           0 :             if (rDoc.IsScenario(nTab))
    8558             :             {
    8559           0 :                 OUString aComment;
    8560           0 :                 Color  aColor;
    8561             :                 sal_uInt16 nFlags;
    8562           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8563             : 
    8564           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_TWOWAY) != 0 );
    8565             :             }
    8566             :         }
    8567        2466 :         else if ( pEntry->nWID == SC_WID_UNO_COPYSTYL )
    8568             :         {
    8569           0 :             if (rDoc.IsScenario(nTab))
    8570             :             {
    8571           0 :                 OUString aComment;
    8572           0 :                 Color  aColor;
    8573             :                 sal_uInt16 nFlags;
    8574           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8575             : 
    8576           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_ATTRIB) != 0 );
    8577             :             }
    8578             :         }
    8579        2466 :         else if ( pEntry->nWID == SC_WID_UNO_COPYFORM )
    8580             :         {
    8581           0 :             if (rDoc.IsScenario(nTab))
    8582             :             {
    8583           0 :                 OUString aComment;
    8584           0 :                 Color  aColor;
    8585             :                 sal_uInt16 nFlags;
    8586           0 :                 rDoc.GetScenarioData( nTab, aComment, aColor, nFlags );
    8587             : 
    8588           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, !(nFlags & SC_SCENARIO_VALUE));
    8589             :             }
    8590             :         }
    8591        2466 :         else if ( pEntry->nWID == SC_WID_UNO_TABLAYOUT )
    8592             :         {
    8593          41 :             if (rDoc.IsLayoutRTL(nTab))
    8594           4 :                 rAny <<= sal_Int16(com::sun::star::text::WritingMode2::RL_TB);
    8595             :             else
    8596          37 :                 rAny <<= sal_Int16(com::sun::star::text::WritingMode2::LR_TB);
    8597             :         }
    8598        2425 :         else if ( pEntry->nWID == SC_WID_UNO_AUTOPRINT )
    8599             :         {
    8600           0 :             bool bAutoPrint = rDoc.IsPrintEntireSheet( nTab );
    8601           0 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bAutoPrint );
    8602             :         }
    8603        2425 :         else if ( pEntry->nWID == SC_WID_UNO_TABCOLOR )
    8604             :         {
    8605          33 :             rAny <<= sal_Int32(rDoc.GetTabBgColor(nTab).GetColor());
    8606             :         }
    8607        2392 :         else if ( pEntry->nWID == SC_WID_UNO_CODENAME )
    8608             :         {
    8609        2380 :             OUString aCodeName;
    8610        2380 :             if ( pDocSh )
    8611        2380 :                 pDocSh->GetDocument().GetCodeName( GetTab_Impl(), aCodeName );
    8612        2380 :             rAny <<= OUString( aCodeName );
    8613             :         }
    8614          12 :         else if (pEntry->nWID == SC_WID_UNO_CONDFORMAT)
    8615             :         {
    8616           7 :             rAny <<= uno::Reference<sheet::XConditionalFormats>(new ScCondFormatsObj(pDocSh, nTab));
    8617             :         }
    8618             :         else
    8619           5 :             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
    8620             :     }
    8621        2605 : }
    8622             : 
    8623        3796 : const SfxItemPropertyMap& ScTableSheetObj::GetItemPropertyMap()
    8624             : {
    8625        3796 :     return pSheetPropSet->getPropertyMap();
    8626             : }
    8627             : 
    8628             : // XServiceInfo
    8629             : 
    8630           0 : OUString SAL_CALL ScTableSheetObj::getImplementationName() throw(uno::RuntimeException, std::exception)
    8631             : {
    8632           0 :     return OUString( "ScTableSheetObj" );
    8633             : }
    8634             : 
    8635           0 : sal_Bool SAL_CALL ScTableSheetObj::supportsService( const OUString& rServiceName )
    8636             :                                                     throw(uno::RuntimeException, std::exception)
    8637             : {
    8638           0 :     return cppu::supportsService(this, rServiceName);
    8639             : }
    8640             : 
    8641           0 : uno::Sequence<OUString> SAL_CALL ScTableSheetObj::getSupportedServiceNames()
    8642             :                                                     throw(uno::RuntimeException, std::exception)
    8643             : {
    8644           0 :     uno::Sequence<OUString> aRet(7);
    8645           0 :     OUString* pArray = aRet.getArray();
    8646           0 :     pArray[0] = SCSPREADSHEET_SERVICE;
    8647           0 :     pArray[1] = SCSHEETCELLRANGE_SERVICE;
    8648           0 :     pArray[2] = SCCELLRANGE_SERVICE;
    8649           0 :     pArray[3] = SCCELLPROPERTIES_SERVICE;
    8650           0 :     pArray[4] = SCCHARPROPERTIES_SERVICE;
    8651           0 :     pArray[5] = SCPARAPROPERTIES_SERVICE;
    8652           0 :     pArray[6] = SCLINKTARGET_SERVICE;
    8653           0 :     return aRet;
    8654             : }
    8655             : 
    8656             : // XUnoTunnel
    8657             : 
    8658        4598 : sal_Int64 SAL_CALL ScTableSheetObj::getSomething(
    8659             :                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException, std::exception)
    8660             : {
    8661        9196 :     if ( rId.getLength() == 16 &&
    8662        4598 :           0 == memcmp( getUnoTunnelId().getConstArray(),
    8663        9196 :                                     rId.getConstArray(), 16 ) )
    8664             :     {
    8665         245 :         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
    8666             :     }
    8667             : 
    8668        4353 :     return ScCellRangeObj::getSomething( rId );
    8669             : }
    8670             : 
    8671             : namespace
    8672             : {
    8673             :     class theScTableSheetObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScTableSheetObjUnoTunnelId> {};
    8674             : }
    8675             : 
    8676        6219 : const uno::Sequence<sal_Int8>& ScTableSheetObj::getUnoTunnelId()
    8677             : {
    8678        6219 :     return theScTableSheetObjUnoTunnelId::get().getSeq();
    8679             : }
    8680             : 
    8681        1621 : ScTableSheetObj* ScTableSheetObj::getImplementation(const uno::Reference<uno::XInterface>& rObj)
    8682             : {
    8683        1621 :     ScTableSheetObj* pRet = NULL;
    8684        1621 :     uno::Reference<lang::XUnoTunnel> xUT(rObj, uno::UNO_QUERY);
    8685        1621 :     if (xUT.is())
    8686        1621 :         pRet = reinterpret_cast<ScTableSheetObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
    8687        1621 :     return pRet;
    8688             : }
    8689             : 
    8690        1099 : ScTableColumnObj::ScTableColumnObj( ScDocShell* pDocSh, SCCOL nCol, SCTAB nTab ) :
    8691             :     ScCellRangeObj( pDocSh, ScRange(nCol,0,nTab, nCol,MAXROW,nTab) ),
    8692        1099 :     pColPropSet(lcl_GetColumnPropertySet())
    8693             : {
    8694        1099 : }
    8695             : 
    8696        2198 : ScTableColumnObj::~ScTableColumnObj()
    8697             : {
    8698        2198 : }
    8699             : 
    8700        2333 : uno::Any SAL_CALL ScTableColumnObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException, std::exception)
    8701             : {
    8702        2333 :     SC_QUERYINTERFACE( container::XNamed )
    8703             : 
    8704        2333 :     return ScCellRangeObj::queryInterface( rType );
    8705             : }
    8706             : 
    8707       10133 : void SAL_CALL ScTableColumnObj::acquire() throw()
    8708             : {
    8709       10133 :     ScCellRangeObj::acquire();
    8710       10133 : }
    8711             : 
    8712       10133 : void SAL_CALL ScTableColumnObj::release() throw()
    8713             : {
    8714       10133 :     ScCellRangeObj::release();
    8715       10133 : }
    8716             : 
    8717           0 : uno::Sequence<uno::Type> SAL_CALL ScTableColumnObj::getTypes() throw(uno::RuntimeException, std::exception)
    8718             : {
    8719           0 :     static uno::Sequence<uno::Type> aTypes;
    8720           0 :     if ( aTypes.getLength() == 0 )
    8721             :     {
    8722           0 :         uno::Sequence<uno::Type> aParentTypes(ScCellRangeObj::getTypes());
    8723           0 :         long nParentLen = aParentTypes.getLength();
    8724           0 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    8725             : 
    8726           0 :         aTypes.realloc( nParentLen + 1 );
    8727           0 :         uno::Type* pPtr = aTypes.getArray();
    8728           0 :         pPtr[nParentLen + 0] = cppu::UnoType<container::XNamed>::get();
    8729             : 
    8730           0 :         for (long i=0; i<nParentLen; i++)
    8731           0 :             pPtr[i] = pParentPtr[i];                // parent types first
    8732             :     }
    8733           0 :     return aTypes;
    8734             : }
    8735             : 
    8736           0 : uno::Sequence<sal_Int8> SAL_CALL ScTableColumnObj::getImplementationId() throw(uno::RuntimeException, std::exception)
    8737             : {
    8738           0 :     return css::uno::Sequence<sal_Int8>();
    8739             : }
    8740             : 
    8741             : // XNamed
    8742             : 
    8743           0 : OUString SAL_CALL ScTableColumnObj::getName() throw(uno::RuntimeException, std::exception)
    8744             : {
    8745           0 :     SolarMutexGuard aGuard;
    8746             : 
    8747           0 :     const ScRange& rRange = GetRange();
    8748             :     OSL_ENSURE(rRange.aStart.Col() == rRange.aEnd.Col(), "too many columns");
    8749           0 :     SCCOL nCol = rRange.aStart.Col();
    8750             : 
    8751           0 :     return ScColToAlpha( nCol );        // from global.hxx
    8752             : }
    8753             : 
    8754           0 : void SAL_CALL ScTableColumnObj::setName( const OUString& /* aNewName */ )
    8755             :                                                 throw(uno::RuntimeException, std::exception)
    8756             : {
    8757           0 :     SolarMutexGuard aGuard;
    8758           0 :     throw uno::RuntimeException();      // read-only
    8759             : }
    8760             : 
    8761             : // XPropertySet erweitert fuer Spalten-Properties
    8762             : 
    8763          40 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableColumnObj::getPropertySetInfo()
    8764             :                                                         throw(uno::RuntimeException, std::exception)
    8765             : {
    8766          40 :     SolarMutexGuard aGuard;
    8767             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    8768          40 :         new SfxItemPropertySetInfo( pColPropSet->getPropertyMap() ));
    8769          40 :     return aRef;
    8770             : }
    8771             : 
    8772           4 : void ScTableColumnObj::SetOnePropertyValue(const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue)
    8773             :     throw(lang::IllegalArgumentException, uno::RuntimeException,
    8774             :           std::exception)
    8775             : {
    8776           4 :     if ( pEntry )
    8777             :     {
    8778           4 :         if ( IsScItemWid( pEntry->nWID ) )
    8779             :         {
    8780             :             //  for Item WIDs, call ScCellRangesBase directly
    8781           0 :             ScCellRangesBase::SetOnePropertyValue(pEntry, aValue);
    8782           0 :             return;
    8783             :         }
    8784             : 
    8785             :         //  own properties
    8786             : 
    8787           4 :         ScDocShell* pDocSh = GetDocShell();
    8788           4 :         if (!pDocSh)
    8789           0 :             return;                                                 //! Exception oder so?
    8790           4 :         const ScRange& rRange = GetRange();
    8791             :         OSL_ENSURE(rRange.aStart.Col() == rRange.aEnd.Col(), "zuviele Spalten");
    8792           4 :         SCCOL nCol = rRange.aStart.Col();
    8793           4 :         SCTAB nTab = rRange.aStart.Tab();
    8794           4 :         ScDocFunc &rFunc = pDocSh->GetDocFunc();
    8795             : 
    8796           4 :         std::vector<sc::ColRowSpan> aColArr(1, sc::ColRowSpan(nCol,nCol));
    8797             : 
    8798           4 :         if ( pEntry->nWID == SC_WID_UNO_CELLWID )
    8799             :         {
    8800           0 :             sal_Int32 nNewWidth = 0;
    8801           0 :             if ( aValue >>= nNewWidth )
    8802             :             {
    8803             :                 //  property is 1/100mm, column width is twips
    8804           0 :                 nNewWidth = HMMToTwips(nNewWidth);
    8805             :                 rFunc.SetWidthOrHeight(
    8806           0 :                     true, aColArr, nTab, SC_SIZE_ORIGINAL, (sal_uInt16)nNewWidth, true, true);
    8807             :             }
    8808             :         }
    8809           4 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    8810             :         {
    8811           0 :             bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8812           0 :             ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT;
    8813           0 :             rFunc.SetWidthOrHeight(true, aColArr, nTab, eMode, 0, true, true);
    8814             :             //  SC_SIZE_DIRECT mit Groesse 0 blendet aus
    8815             :         }
    8816           4 :         else if ( pEntry->nWID == SC_WID_UNO_OWIDTH )
    8817             :         {
    8818           2 :             bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8819           2 :             if (bOpt)
    8820             :                 rFunc.SetWidthOrHeight(
    8821           2 :                     true, aColArr, nTab, SC_SIZE_OPTIMAL, STD_EXTRA_WIDTH, true, true);
    8822             :             // sal_False bei Spalten momentan ohne Auswirkung
    8823             :         }
    8824           2 :         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE || pEntry->nWID == SC_WID_UNO_MANPAGE )
    8825             :         {
    8826           2 :             bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8827           2 :             if (bSet)
    8828           1 :                 rFunc.InsertPageBreak( true, rRange.aStart, true, true, true );
    8829             :             else
    8830           1 :                 rFunc.RemovePageBreak( true, rRange.aStart, true, true, true );
    8831             :         }
    8832             :         else
    8833           0 :             ScCellRangeObj::SetOnePropertyValue(pEntry, aValue);        // base class, no Item WID
    8834             :     }
    8835             : }
    8836             : 
    8837         122 : void ScTableColumnObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, uno::Any& rAny )
    8838             :     throw(uno::RuntimeException, std::exception)
    8839             : {
    8840         122 :     if ( pEntry )
    8841             :     {
    8842         122 :         ScDocShell* pDocSh = GetDocShell();
    8843         122 :         if (!pDocSh)
    8844           0 :             throw uno::RuntimeException();
    8845             : 
    8846         122 :         ScDocument& rDoc = pDocSh->GetDocument();
    8847         122 :         const ScRange& rRange = GetRange();
    8848             :         OSL_ENSURE(rRange.aStart.Col() == rRange.aEnd.Col(), "zuviele Spalten");
    8849         122 :         SCCOL nCol = rRange.aStart.Col();
    8850         122 :         SCTAB nTab = rRange.aStart.Tab();
    8851             : 
    8852         122 :         if ( pEntry->nWID == SC_WID_UNO_CELLWID )
    8853             :         {
    8854             :             // for hidden column, return original height
    8855          40 :             sal_uInt16 nWidth = rDoc.GetOriginalWidth( nCol, nTab );
    8856             :             //  property is 1/100mm, column width is twips
    8857          40 :             nWidth = (sal_uInt16) TwipsToHMM(nWidth);
    8858          40 :             rAny <<= (sal_Int32)( nWidth );
    8859             :         }
    8860          82 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    8861             :         {
    8862          40 :             bool bHidden = rDoc.ColHidden(nCol, nTab);
    8863          40 :             ScUnoHelpFunctions::SetBoolInAny( rAny, !bHidden );
    8864             :         }
    8865          42 :         else if ( pEntry->nWID == SC_WID_UNO_OWIDTH )
    8866             :         {
    8867             :             //! momentan immer gesetzt ??!?!
    8868           0 :             bool bOpt = !(rDoc.GetColFlags( nCol, nTab ) & CR_MANUALSIZE);
    8869           0 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bOpt );
    8870             :         }
    8871          42 :         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE )
    8872             :         {
    8873           2 :             ScBreakType nBreak = rDoc.HasColBreak(nCol, nTab);
    8874           2 :             ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak != BREAK_NONE );
    8875             :         }
    8876          40 :         else if ( pEntry->nWID == SC_WID_UNO_MANPAGE )
    8877             :         {
    8878          40 :             ScBreakType nBreak = rDoc.HasColBreak(nCol, nTab);
    8879          40 :             ScUnoHelpFunctions::SetBoolInAny(rAny, (nBreak & BREAK_MANUAL) != 0);
    8880             :         }
    8881             :         else
    8882           0 :             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
    8883             :     }
    8884         122 : }
    8885             : 
    8886          46 : const SfxItemPropertyMap& ScTableColumnObj::GetItemPropertyMap()
    8887             : {
    8888          46 :     return pColPropSet->getPropertyMap();
    8889             : }
    8890             : 
    8891         120 : ScTableRowObj::ScTableRowObj(ScDocShell* pDocSh, SCROW nRow, SCTAB nTab) :
    8892             :     ScCellRangeObj( pDocSh, ScRange(0,nRow,nTab, MAXCOL,nRow,nTab) ),
    8893         120 :     pRowPropSet(lcl_GetRowPropertySet())
    8894             : {
    8895         120 : }
    8896             : 
    8897         240 : ScTableRowObj::~ScTableRowObj()
    8898             : {
    8899         240 : }
    8900             : 
    8901             : // XPropertySet erweitert fuer Zeilen-Properties
    8902             : 
    8903          62 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableRowObj::getPropertySetInfo()
    8904             :                                                         throw(uno::RuntimeException, std::exception)
    8905             : {
    8906          62 :     SolarMutexGuard aGuard;
    8907             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    8908          62 :         new SfxItemPropertySetInfo( pRowPropSet->getPropertyMap() ));
    8909          62 :     return aRef;
    8910             : }
    8911             : 
    8912           4 : void ScTableRowObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    8913             :     throw(lang::IllegalArgumentException, uno::RuntimeException, std::exception)
    8914             : {
    8915           4 :     if ( pEntry )
    8916             :     {
    8917           4 :         if ( IsScItemWid( pEntry->nWID ) )
    8918             :         {
    8919             :             //  for Item WIDs, call ScCellRangesBase directly
    8920           0 :             ScCellRangesBase::SetOnePropertyValue(pEntry, aValue);
    8921           0 :             return;
    8922             :         }
    8923             : 
    8924             :         //  own properties
    8925             : 
    8926           4 :         ScDocShell* pDocSh = GetDocShell();
    8927           4 :         if (!pDocSh)
    8928           0 :             return;                                                 //! Exception oder so?
    8929           4 :         ScDocument& rDoc = pDocSh->GetDocument();
    8930           4 :         const ScRange& rRange = GetRange();
    8931             :         OSL_ENSURE(rRange.aStart.Row() == rRange.aEnd.Row(), "zuviele Zeilen");
    8932           4 :         SCROW nRow = rRange.aStart.Row();
    8933           4 :         SCTAB nTab = rRange.aStart.Tab();
    8934           4 :         ScDocFunc &rFunc = pDocSh->GetDocFunc();
    8935             : 
    8936           4 :         std::vector<sc::ColRowSpan> aRowArr(1, sc::ColRowSpan(nRow,nRow));
    8937             : 
    8938           4 :         if ( pEntry->nWID == SC_WID_UNO_CELLHGT )
    8939             :         {
    8940           0 :             sal_Int32 nNewHeight = 0;
    8941           0 :             if ( aValue >>= nNewHeight )
    8942             :             {
    8943             :                 //  property is 1/100mm, row height is twips
    8944           0 :                 nNewHeight = HMMToTwips(nNewHeight);
    8945             :                 rFunc.SetWidthOrHeight(
    8946           0 :                     false, aRowArr, nTab, SC_SIZE_ORIGINAL, (sal_uInt16)nNewHeight, true, true);
    8947             :             }
    8948             :         }
    8949           4 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    8950             :         {
    8951           2 :             bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8952           2 :             ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT;
    8953           2 :             rFunc.SetWidthOrHeight(false, aRowArr, nTab, eMode, 0, true, true);
    8954             :             //  SC_SIZE_DIRECT mit Groesse 0 blendet aus
    8955             :         }
    8956           2 :         else if ( pEntry->nWID == SC_WID_UNO_CELLFILT )
    8957             :         {
    8958           0 :             bool bFil = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8959             :             //  SC_SIZE_DIRECT mit Groesse 0 blendet aus
    8960           0 :             rDoc.SetRowFiltered(nRow, nRow, nTab, bFil);
    8961             :         }
    8962           2 :         else if ( pEntry->nWID == SC_WID_UNO_OHEIGHT )
    8963             :         {
    8964           0 :             bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8965           0 :             if (bOpt)
    8966           0 :                 rFunc.SetWidthOrHeight(false, aRowArr, nTab, SC_SIZE_OPTIMAL, 0, true, true);
    8967             :             else
    8968             :             {
    8969             :                 //  set current height again manually
    8970           0 :                 sal_uInt16 nHeight = rDoc.GetOriginalHeight( nRow, nTab );
    8971           0 :                 rFunc.SetWidthOrHeight(false, aRowArr, nTab, SC_SIZE_ORIGINAL, nHeight, true, true);
    8972             :             }
    8973             :         }
    8974           2 :         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE || pEntry->nWID == SC_WID_UNO_MANPAGE )
    8975             :         {
    8976           2 :             bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8977           2 :             if (bSet)
    8978           1 :                 rFunc.InsertPageBreak( false, rRange.aStart, true, true, true );
    8979             :             else
    8980           1 :                 rFunc.RemovePageBreak( false, rRange.aStart, true, true, true );
    8981             :         }
    8982             :         else
    8983           0 :             ScCellRangeObj::SetOnePropertyValue(pEntry, aValue);        // base class, no Item WID
    8984             :     }
    8985             : }
    8986             : 
    8987         197 : void ScTableRowObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, uno::Any& rAny )
    8988             :     throw(uno::RuntimeException, std::exception)
    8989             : {
    8990         197 :     if ( pEntry )
    8991             :     {
    8992         197 :         ScDocShell* pDocSh = GetDocShell();
    8993         197 :         if (!pDocSh)
    8994           0 :             throw uno::RuntimeException();
    8995         197 :         ScDocument& rDoc = pDocSh->GetDocument();
    8996         197 :         const ScRange& rRange = GetRange();
    8997             :         OSL_ENSURE(rRange.aStart.Row() == rRange.aEnd.Row(), "zuviele Zeilen");
    8998         197 :         SCROW nRow = rRange.aStart.Row();
    8999         197 :         SCTAB nTab = rRange.aStart.Tab();
    9000             : 
    9001         197 :         if ( pEntry->nWID == SC_WID_UNO_CELLHGT )
    9002             :         {
    9003             :             // for hidden row, return original height
    9004          62 :             sal_uInt16 nHeight = rDoc.GetOriginalHeight( nRow, nTab );
    9005             :             //  property is 1/100mm, row height is twips
    9006          62 :             nHeight = (sal_uInt16) TwipsToHMM(nHeight);
    9007          62 :             rAny <<= (sal_Int32)( nHeight );
    9008             :         }
    9009         135 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    9010             :         {
    9011           9 :             bool bHidden = rDoc.RowHidden(nRow, nTab);
    9012           9 :             ScUnoHelpFunctions::SetBoolInAny( rAny, !bHidden );
    9013             :         }
    9014         126 :         else if ( pEntry->nWID == SC_WID_UNO_CELLFILT )
    9015             :         {
    9016           0 :             bool bVis = rDoc.RowFiltered(nRow, nTab);
    9017           0 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bVis );
    9018             :         }
    9019         126 :         else if ( pEntry->nWID == SC_WID_UNO_OHEIGHT )
    9020             :         {
    9021          62 :             bool bOpt = !(rDoc.GetRowFlags( nRow, nTab ) & CR_MANUALSIZE);
    9022          62 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bOpt );
    9023             :         }
    9024          64 :         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE )
    9025             :         {
    9026           2 :             ScBreakType nBreak = rDoc.HasRowBreak(nRow, nTab);
    9027           2 :             ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak != BREAK_NONE );
    9028             :         }
    9029          62 :         else if ( pEntry->nWID == SC_WID_UNO_MANPAGE )
    9030             :         {
    9031          62 :             bool bBreak = (rDoc.HasRowBreak(nRow, nTab) & BREAK_MANUAL) != 0;
    9032          62 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bBreak );
    9033             :         }
    9034             :         else
    9035           0 :             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
    9036             :     }
    9037         197 : }
    9038             : 
    9039          77 : const SfxItemPropertyMap& ScTableRowObj::GetItemPropertyMap()
    9040             : {
    9041          77 :     return pRowPropSet->getPropertyMap();
    9042             : }
    9043             : 
    9044          27 : ScCellsObj::ScCellsObj(ScDocShell* pDocSh, const ScRangeList& rR) :
    9045             :     pDocShell( pDocSh ),
    9046          27 :     aRanges( rR )
    9047             : {
    9048          27 :     pDocShell->GetDocument().AddUnoObject(*this);
    9049          27 : }
    9050             : 
    9051          81 : ScCellsObj::~ScCellsObj()
    9052             : {
    9053          27 :     SolarMutexGuard g;
    9054             : 
    9055          27 :     if (pDocShell)
    9056          23 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    9057          54 : }
    9058             : 
    9059           8 : void ScCellsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9060             : {
    9061           8 :     if ( dynamic_cast<const ScUpdateRefHint*>(&rHint) )
    9062             :     {
    9063           0 :         const ScUpdateRefHint& rRef = static_cast<const ScUpdateRefHint&>(rHint);
    9064           0 :         aRanges.UpdateReference( rRef.GetMode(), &pDocShell->GetDocument(), rRef.GetRange(),
    9065           0 :                                         rRef.GetDx(), rRef.GetDy(), rRef.GetDz() );
    9066             :     }
    9067          16 :     else if ( dynamic_cast<const SfxSimpleHint*>(&rHint) &&
    9068           8 :             static_cast<const SfxSimpleHint&>(rHint).GetId() == SFX_HINT_DYING )
    9069             :     {
    9070           4 :         pDocShell = NULL;       // ungueltig geworden
    9071             :     }
    9072           8 : }
    9073             : 
    9074             : // XEnumerationAccess
    9075             : 
    9076          26 : uno::Reference<container::XEnumeration> SAL_CALL ScCellsObj::createEnumeration()
    9077             :                                                     throw(uno::RuntimeException, std::exception)
    9078             : {
    9079          26 :     SolarMutexGuard aGuard;
    9080          26 :     if (pDocShell)
    9081          26 :         return new ScCellsEnumeration( pDocShell, aRanges );
    9082           0 :     return NULL;
    9083             : }
    9084             : 
    9085           1 : uno::Type SAL_CALL ScCellsObj::getElementType() throw(uno::RuntimeException, std::exception)
    9086             : {
    9087           1 :     SolarMutexGuard aGuard;
    9088           1 :     return cppu::UnoType<table::XCell>::get();
    9089             : }
    9090             : 
    9091           1 : sal_Bool SAL_CALL ScCellsObj::hasElements() throw(uno::RuntimeException, std::exception)
    9092             : {
    9093           1 :     SolarMutexGuard aGuard;
    9094           1 :     bool bHas = false;
    9095           1 :     if ( pDocShell )
    9096             :     {
    9097             :         //! schneller selber testen?
    9098             : 
    9099           1 :         uno::Reference<container::XEnumeration> xEnum(new ScCellsEnumeration( pDocShell, aRanges ));
    9100           1 :         bHas = xEnum->hasMoreElements();
    9101             :     }
    9102           1 :     return bHas;
    9103             : }
    9104             : 
    9105          27 : ScCellsEnumeration::ScCellsEnumeration(ScDocShell* pDocSh, const ScRangeList& rR) :
    9106             :     pDocShell( pDocSh ),
    9107             :     aRanges( rR ),
    9108             :     pMark( NULL ),
    9109          27 :     bAtEnd( false )
    9110             : {
    9111          27 :     ScDocument& rDoc = pDocShell->GetDocument();
    9112          27 :     rDoc.AddUnoObject(*this);
    9113             : 
    9114          27 :     if ( aRanges.empty() )
    9115           0 :         bAtEnd = true;
    9116             :     else
    9117             :     {
    9118          27 :         SCTAB nTab = 0;
    9119          27 :         const ScRange* pFirst = aRanges[ 0 ];
    9120          27 :         if (pFirst)
    9121          27 :             nTab = pFirst->aStart.Tab();
    9122          27 :         aPos = ScAddress(0,0,nTab);
    9123          27 :         CheckPos_Impl();                    // aPos auf erste passende Zelle setzen
    9124             :     }
    9125          27 : }
    9126             : 
    9127          27 : void ScCellsEnumeration::CheckPos_Impl()
    9128             : {
    9129          27 :     if (!pDocShell)
    9130          27 :         return;
    9131             : 
    9132          27 :     bool bFound = false;
    9133          27 :     ScDocument& rDoc = pDocShell->GetDocument();
    9134          27 :     ScRefCellValue aCell;
    9135          27 :     aCell.assign(rDoc, aPos);
    9136          27 :     if (!aCell.isEmpty())
    9137             :     {
    9138          27 :         if (!pMark)
    9139             :         {
    9140          27 :             pMark = new ScMarkData;
    9141          27 :             pMark->MarkFromRangeList(aRanges, false);
    9142          27 :             pMark->MarkToMulti();   // needed for GetNextMarkedCell
    9143             :         }
    9144          27 :         bFound = pMark->IsCellMarked(aPos.Col(), aPos.Row());
    9145             :     }
    9146          27 :     if (!bFound)
    9147          24 :         Advance_Impl();
    9148             : }
    9149             : 
    9150          81 : ScCellsEnumeration::~ScCellsEnumeration()
    9151             : {
    9152          27 :     SolarMutexGuard g;
    9153             : 
    9154          27 :     if (pDocShell)
    9155          24 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    9156          27 :     delete pMark;
    9157          54 : }
    9158             : 
    9159          25 : void ScCellsEnumeration::Advance_Impl()
    9160             : {
    9161             :     OSL_ENSURE(!bAtEnd,"zuviel Advance_Impl");
    9162          25 :     if (!pMark)
    9163             :     {
    9164           0 :         pMark = new ScMarkData;
    9165           0 :         pMark->MarkFromRangeList( aRanges, false );
    9166           0 :         pMark->MarkToMulti();   // needed for GetNextMarkedCell
    9167             :     }
    9168             : 
    9169          25 :     SCCOL nCol = aPos.Col();
    9170          25 :     SCROW nRow = aPos.Row();
    9171          25 :     SCTAB nTab = aPos.Tab();
    9172          25 :     bool bFound = pDocShell->GetDocument().GetNextMarkedCell( nCol, nRow, nTab, *pMark );
    9173          25 :     if (bFound)
    9174           1 :         aPos.Set( nCol, nRow, nTab );
    9175             :     else
    9176          24 :         bAtEnd = true;      // kommt nix mehr
    9177          25 : }
    9178             : 
    9179           7 : void ScCellsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9180             : {
    9181           7 :     const ScUpdateRefHint* pRefHint = dynamic_cast<const ScUpdateRefHint*>(&rHint);
    9182           7 :     if ( pRefHint )
    9183             :     {
    9184           0 :         if (pDocShell)
    9185             :         {
    9186           0 :             aRanges.UpdateReference( pRefHint->GetMode(), &pDocShell->GetDocument(), pRefHint->GetRange(),
    9187           0 :                                      pRefHint->GetDx(), pRefHint->GetDy(), pRefHint->GetDz() );
    9188             : 
    9189           0 :             delete pMark;       // aus verschobenen Bereichen neu erzeugen
    9190           0 :             pMark = NULL;
    9191             : 
    9192           0 :             if (!bAtEnd)        // aPos anpassen
    9193             :             {
    9194           0 :                 ScRangeList aNew;
    9195           0 :                 aNew.Append(ScRange(aPos));
    9196           0 :                 aNew.UpdateReference( pRefHint->GetMode(), &pDocShell->GetDocument(), pRefHint->GetRange(),
    9197           0 :                                       pRefHint->GetDx(), pRefHint->GetDy(), pRefHint->GetDz() );
    9198           0 :                 if (aNew.size()==1)
    9199             :                 {
    9200           0 :                     aPos = aNew[ 0 ]->aStart;
    9201           0 :                     CheckPos_Impl();
    9202           0 :                 }
    9203             :             }
    9204             :         }
    9205             :     }
    9206          14 :     else if ( dynamic_cast<const SfxSimpleHint*>(&rHint) &&
    9207           7 :               static_cast<const SfxSimpleHint&>(rHint).GetId() == SFX_HINT_DYING )
    9208             :     {
    9209           3 :         pDocShell = NULL;       // ungueltig geworden
    9210             :     }
    9211           7 : }
    9212             : 
    9213             : // XEnumeration
    9214             : 
    9215          27 : sal_Bool SAL_CALL ScCellsEnumeration::hasMoreElements() throw(uno::RuntimeException, std::exception)
    9216             : {
    9217          27 :     SolarMutexGuard aGuard;
    9218          27 :     return !bAtEnd;
    9219             : }
    9220             : 
    9221           2 : uno::Any SAL_CALL ScCellsEnumeration::nextElement() throw(container::NoSuchElementException,
    9222             :                                         lang::WrappedTargetException, uno::RuntimeException, std::exception)
    9223             : {
    9224           2 :     SolarMutexGuard aGuard;
    9225           2 :     if (pDocShell && !bAtEnd)
    9226             :     {
    9227             :         // Interface-Typ muss zu ScCellsObj::getElementType passen
    9228             : 
    9229           1 :         ScAddress aTempPos(aPos);
    9230           1 :         Advance_Impl();
    9231           2 :         return uno::makeAny(uno::Reference<table::XCell>(new ScCellObj( pDocShell, aTempPos )));
    9232             :     }
    9233             : 
    9234           1 :     throw container::NoSuchElementException();      // no more elements
    9235             : }
    9236             : 
    9237           3 : ScCellFormatsObj::ScCellFormatsObj(ScDocShell* pDocSh, const ScRange& rRange) :
    9238             :     pDocShell( pDocSh ),
    9239           3 :     aTotalRange( rRange )
    9240             : {
    9241           3 :     ScDocument& rDoc = pDocShell->GetDocument();
    9242           3 :     rDoc.AddUnoObject(*this);
    9243             : 
    9244             :     OSL_ENSURE( aTotalRange.aStart.Tab() == aTotalRange.aEnd.Tab(), "unterschiedliche Tabellen" );
    9245           3 : }
    9246             : 
    9247           9 : ScCellFormatsObj::~ScCellFormatsObj()
    9248             : {
    9249           3 :     SolarMutexGuard g;
    9250             : 
    9251           3 :     if (pDocShell)
    9252           0 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    9253           6 : }
    9254             : 
    9255           8 : void ScCellFormatsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9256             : {
    9257           8 :     if ( dynamic_cast<const ScUpdateRefHint*>(&rHint) )
    9258             :     {
    9259             :         //! aTotalRange...
    9260             :     }
    9261          14 :     else if ( dynamic_cast<const SfxSimpleHint*>(&rHint) &&
    9262           8 :               static_cast<const SfxSimpleHint&>(rHint).GetId() == SFX_HINT_DYING )
    9263             :     {
    9264           3 :         pDocShell = NULL;       // ungueltig geworden
    9265             :     }
    9266           8 : }
    9267             : 
    9268           5 : ScCellRangeObj* ScCellFormatsObj::GetObjectByIndex_Impl(long nIndex) const
    9269             : {
    9270             :     //! direkt auf die AttrArrays zugreifen !!!!
    9271             : 
    9272           5 :     ScCellRangeObj* pRet = NULL;
    9273           5 :     if (pDocShell)
    9274             :     {
    9275           5 :         ScDocument& rDoc = pDocShell->GetDocument();
    9276           5 :         long nPos = 0;
    9277           5 :         ScAttrRectIterator aIter( &rDoc, aTotalRange.aStart.Tab(),
    9278           5 :                                     aTotalRange.aStart.Col(), aTotalRange.aStart.Row(),
    9279          15 :                                     aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() );
    9280             :         SCCOL nCol1, nCol2;
    9281             :         SCROW nRow1, nRow2;
    9282          15 :         while ( aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) )
    9283             :         {
    9284           5 :             if ( nPos == nIndex )
    9285             :             {
    9286           4 :                 SCTAB nTab = aTotalRange.aStart.Tab();
    9287           4 :                 ScRange aNext( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
    9288             : 
    9289           4 :                 if ( aNext.aStart == aNext.aEnd )
    9290           0 :                     pRet = new ScCellObj( pDocShell, aNext.aStart );
    9291             :                 else
    9292           4 :                     pRet = new ScCellRangeObj( pDocShell, aNext );
    9293             :             }
    9294           5 :             ++nPos;
    9295           5 :         }
    9296             :     }
    9297           5 :     return pRet;
    9298             : }
    9299             : 
    9300             : // XIndexAccess
    9301             : 
    9302           3 : sal_Int32 SAL_CALL ScCellFormatsObj::getCount() throw(uno::RuntimeException, std::exception)
    9303             : {
    9304           3 :     SolarMutexGuard aGuard;
    9305             : 
    9306             :     //! direkt auf die AttrArrays zugreifen !!!!
    9307             : 
    9308           3 :     long nCount = 0;
    9309           3 :     if (pDocShell)
    9310             :     {
    9311           3 :         ScDocument& rDoc = pDocShell->GetDocument();
    9312           3 :         ScAttrRectIterator aIter( &rDoc, aTotalRange.aStart.Tab(),
    9313           3 :                                     aTotalRange.aStart.Col(), aTotalRange.aStart.Row(),
    9314           9 :                                     aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() );
    9315             :         SCCOL nCol1, nCol2;
    9316             :         SCROW nRow1, nRow2;
    9317           9 :         while ( aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) )
    9318           6 :             ++nCount;
    9319             :     }
    9320           3 :     return nCount;
    9321             : }
    9322             : 
    9323           5 : uno::Any SAL_CALL ScCellFormatsObj::getByIndex( sal_Int32 nIndex )
    9324             :                             throw(lang::IndexOutOfBoundsException,
    9325             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    9326             : {
    9327           5 :     SolarMutexGuard aGuard;
    9328             : 
    9329          10 :     uno::Reference<table::XCellRange> xRange(GetObjectByIndex_Impl(nIndex));
    9330           5 :     if (xRange.is())
    9331           8 :         return uno::makeAny(xRange);
    9332             :     else
    9333           6 :         throw lang::IndexOutOfBoundsException();
    9334             : }
    9335             : 
    9336           1 : uno::Type SAL_CALL ScCellFormatsObj::getElementType() throw(uno::RuntimeException, std::exception)
    9337             : {
    9338           1 :     SolarMutexGuard aGuard;
    9339           1 :     return cppu::UnoType<table::XCellRange>::get();
    9340             : }
    9341             : 
    9342           1 : sal_Bool SAL_CALL ScCellFormatsObj::hasElements() throw(uno::RuntimeException, std::exception)
    9343             : {
    9344           1 :     SolarMutexGuard aGuard;
    9345           1 :     return ( getCount() != 0 );     //! immer groesser 0 ??
    9346             : }
    9347             : 
    9348             : // XEnumerationAccess
    9349             : 
    9350           2 : uno::Reference<container::XEnumeration> SAL_CALL ScCellFormatsObj::createEnumeration()
    9351             :                                                     throw(uno::RuntimeException, std::exception)
    9352             : {
    9353           2 :     SolarMutexGuard aGuard;
    9354           2 :     if (pDocShell)
    9355           2 :         return new ScCellFormatsEnumeration( pDocShell, aTotalRange );
    9356           0 :     return NULL;
    9357             : }
    9358             : 
    9359           2 : ScCellFormatsEnumeration::ScCellFormatsEnumeration(ScDocShell* pDocSh, const ScRange& rRange) :
    9360             :     pDocShell( pDocSh ),
    9361           2 :     nTab( rRange.aStart.Tab() ),
    9362             :     pIter( NULL ),
    9363             :     bAtEnd( false ),
    9364           4 :     bDirty( false )
    9365             : {
    9366           2 :     ScDocument& rDoc = pDocShell->GetDocument();
    9367           2 :     rDoc.AddUnoObject(*this);
    9368             : 
    9369             :     OSL_ENSURE( rRange.aStart.Tab() == rRange.aEnd.Tab(),
    9370             :                 "CellFormatsEnumeration: unterschiedliche Tabellen" );
    9371             : 
    9372             :     pIter = new ScAttrRectIterator( &rDoc, nTab,
    9373           4 :                                     rRange.aStart.Col(), rRange.aStart.Row(),
    9374           4 :                                     rRange.aEnd.Col(), rRange.aEnd.Row() );
    9375           2 :     Advance_Impl();
    9376           2 : }
    9377             : 
    9378           6 : ScCellFormatsEnumeration::~ScCellFormatsEnumeration()
    9379             : {
    9380           2 :     SolarMutexGuard g;
    9381             : 
    9382           2 :     if (pDocShell)
    9383           0 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    9384           2 :     delete pIter;
    9385           4 : }
    9386             : 
    9387           3 : void ScCellFormatsEnumeration::Advance_Impl()
    9388             : {
    9389             :     OSL_ENSURE(!bAtEnd,"zuviel Advance_Impl");
    9390             : 
    9391           3 :     if ( pIter )
    9392             :     {
    9393           3 :         if ( bDirty )
    9394             :         {
    9395           0 :             pIter->DataChanged();   // AttrArray-Index neu suchen
    9396           0 :             bDirty = false;
    9397             :         }
    9398             : 
    9399             :         SCCOL nCol1, nCol2;
    9400             :         SCROW nRow1, nRow2;
    9401           3 :         if ( pIter->GetNext( nCol1, nCol2, nRow1, nRow2 ) )
    9402           2 :             aNext = ScRange( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
    9403             :         else
    9404           1 :             bAtEnd = true;      // kommt nix mehr
    9405             :     }
    9406             :     else
    9407           0 :         bAtEnd = true;          // Dok weggekommen oder so
    9408           3 : }
    9409             : 
    9410           1 : ScCellRangeObj* ScCellFormatsEnumeration::NextObject_Impl()
    9411             : {
    9412           1 :     ScCellRangeObj* pRet = NULL;
    9413           1 :     if (pDocShell && !bAtEnd)
    9414             :     {
    9415           1 :         if ( aNext.aStart == aNext.aEnd )
    9416           0 :             pRet = new ScCellObj( pDocShell, aNext.aStart );
    9417             :         else
    9418           1 :             pRet = new ScCellRangeObj( pDocShell, aNext );
    9419           1 :         Advance_Impl();
    9420             :     }
    9421           1 :     return pRet;
    9422             : }
    9423             : 
    9424           2 : void ScCellFormatsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9425             : {
    9426           2 :     if ( dynamic_cast<const ScUpdateRefHint*>(&rHint) )
    9427             :     {
    9428             :         //! und nun ???
    9429             :     }
    9430           2 :     else if ( dynamic_cast<const SfxSimpleHint*>(&rHint) )
    9431             :     {
    9432           2 :         sal_uLong nId = static_cast<const SfxSimpleHint&>(rHint).GetId();
    9433           2 :         if ( nId == SFX_HINT_DYING )
    9434             :         {
    9435           2 :             pDocShell = NULL;                       // ungueltig geworden
    9436           2 :             delete pIter;
    9437           2 :             pIter = NULL;
    9438             :         }
    9439           0 :         else if ( nId == SFX_HINT_DATACHANGED )
    9440             :         {
    9441           0 :             bDirty = true;          // AttrArray-Index evtl. ungueltig geworden
    9442             :         }
    9443             :     }
    9444           2 : }
    9445             : 
    9446             : // XEnumeration
    9447             : 
    9448           2 : sal_Bool SAL_CALL ScCellFormatsEnumeration::hasMoreElements() throw(uno::RuntimeException, std::exception)
    9449             : {
    9450           2 :     SolarMutexGuard aGuard;
    9451           2 :     return !bAtEnd;
    9452             : }
    9453             : 
    9454           2 : uno::Any SAL_CALL ScCellFormatsEnumeration::nextElement() throw(container::NoSuchElementException,
    9455             :                                         lang::WrappedTargetException, uno::RuntimeException, std::exception)
    9456             : {
    9457           2 :     SolarMutexGuard aGuard;
    9458             : 
    9459           2 :     if ( bAtEnd || !pDocShell )
    9460           1 :         throw container::NoSuchElementException();      // no more elements
    9461             : 
    9462             :     // Interface-Typ muss zu ScCellFormatsObj::getElementType passen
    9463             : 
    9464           1 :     return uno::makeAny(uno::Reference<table::XCellRange> (NextObject_Impl()));
    9465             : }
    9466             : 
    9467          36 : ScUniqueCellFormatsObj::ScUniqueCellFormatsObj(ScDocShell* pDocSh, const ScRange& rRange) :
    9468             :     pDocShell( pDocSh ),
    9469             :     aTotalRange( rRange ),
    9470          36 :     aRangeLists()
    9471             : {
    9472          36 :     pDocShell->GetDocument().AddUnoObject(*this);
    9473             : 
    9474             :     OSL_ENSURE( aTotalRange.aStart.Tab() == aTotalRange.aEnd.Tab(), "unterschiedliche Tabellen" );
    9475             : 
    9476          36 :     GetObjects_Impl();
    9477          36 : }
    9478             : 
    9479         108 : ScUniqueCellFormatsObj::~ScUniqueCellFormatsObj()
    9480             : {
    9481          36 :     SolarMutexGuard g;
    9482             : 
    9483          36 :     if (pDocShell)
    9484          33 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    9485          72 : }
    9486             : 
    9487           3 : void ScUniqueCellFormatsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9488             : {
    9489           3 :     if ( dynamic_cast<const ScUpdateRefHint*>(&rHint) )
    9490             :     {
    9491             :         //! aTotalRange...
    9492             :     }
    9493           3 :     else if ( dynamic_cast<const SfxSimpleHint*>(&rHint) )
    9494             :     {
    9495           3 :         sal_uLong nId = static_cast<const SfxSimpleHint&>(rHint).GetId();
    9496           3 :         if ( nId == SFX_HINT_DYING )
    9497           3 :             pDocShell = NULL;                       // ungueltig geworden
    9498             :     }
    9499           3 : }
    9500             : 
    9501             : //  Fill the list of formats from the document
    9502             : 
    9503             : // hash code to access the range lists by ScPatternAttr pointer
    9504             : struct ScPatternHashCode
    9505             : {
    9506         183 :     size_t operator()( const ScPatternAttr* pPattern ) const
    9507             :     {
    9508         183 :         return reinterpret_cast<size_t>(pPattern);
    9509             :     }
    9510             : };
    9511             : 
    9512             : // Hash map to find a range by its start row
    9513             : typedef std::unordered_map< SCROW, ScRange > ScRowRangeHashMap;
    9514             : 
    9515             : typedef std::vector<ScRange> ScRangeVector;
    9516             : 
    9517             : // Hash map entry.
    9518             : // The Join method depends on the column-wise order of ScAttrRectIterator
    9519             : class ScUniqueFormatsEntry
    9520             : {
    9521             :     enum EntryState { STATE_EMPTY, STATE_SINGLE, STATE_COMPLEX };
    9522             : 
    9523             :     EntryState          eState;
    9524             :     ScRange             aSingleRange;
    9525             :     ScRowRangeHashMap   aJoinedRanges;      // "active" ranges to be merged
    9526             :     ScRangeVector       aCompletedRanges;   // ranges that will no longer be touched
    9527             :     ScRangeListRef      aReturnRanges;      // result as ScRangeList for further use
    9528             : 
    9529             : public:
    9530          92 :                         ScUniqueFormatsEntry() : eState( STATE_EMPTY ) {}
    9531          92 :                         ~ScUniqueFormatsEntry() {}
    9532             : 
    9533             :     void                Join( const ScRange& rNewRange );
    9534             :     const ScRangeList&  GetRanges();
    9535          92 :     void                Clear() { aReturnRanges.Clear(); }  // aJoinedRanges and aCompletedRanges are cleared in GetRanges
    9536             : };
    9537             : 
    9538         183 : void ScUniqueFormatsEntry::Join( const ScRange& rNewRange )
    9539             : {
    9540             :     // Special-case handling for single range
    9541             : 
    9542         183 :     if ( eState == STATE_EMPTY )
    9543             :     {
    9544          92 :         aSingleRange = rNewRange;
    9545          92 :         eState = STATE_SINGLE;
    9546         197 :         return;
    9547             :     }
    9548          91 :     if ( eState == STATE_SINGLE )
    9549             :     {
    9550          78 :         if ( aSingleRange.aStart.Row() == rNewRange.aStart.Row() &&
    9551          43 :              aSingleRange.aEnd.Row() == rNewRange.aEnd.Row() &&
    9552          13 :              aSingleRange.aEnd.Col() + 1 == rNewRange.aStart.Col() )
    9553             :         {
    9554          13 :             aSingleRange.aEnd.SetCol( rNewRange.aEnd.Col() );
    9555          13 :             return;     // still a single range
    9556             :         }
    9557             : 
    9558          17 :         SCROW nSingleRow = aSingleRange.aStart.Row();
    9559          17 :         aJoinedRanges.insert( ScRowRangeHashMap::value_type( nSingleRow, aSingleRange ) );
    9560          17 :         eState = STATE_COMPLEX;
    9561             :         // continue normally
    9562             :     }
    9563             : 
    9564             :     // This is called in the order of ScAttrRectIterator results.
    9565             :     // rNewRange can only be joined with an existing entry if it's the same rows, starting in the next column.
    9566             :     // If the old entry for the start row extends to a different end row, or ends in a different column, it
    9567             :     // can be moved to aCompletedRanges because it can't be joined with following iterator results.
    9568             :     // Everything happens within one sheet, so Tab can be ignored.
    9569             : 
    9570          78 :     SCROW nStartRow = rNewRange.aStart.Row();
    9571          78 :     ScRowRangeHashMap::iterator aIter( aJoinedRanges.find( nStartRow ) );       // find the active entry for the start row
    9572          78 :     if ( aIter != aJoinedRanges.end() )
    9573             :     {
    9574          58 :         ScRange& rOldRange = aIter->second;
    9575          72 :         if ( rOldRange.aEnd.Row() == rNewRange.aEnd.Row() &&
    9576          14 :              rOldRange.aEnd.Col() + 1 == rNewRange.aStart.Col() )
    9577             :         {
    9578             :             // extend existing range
    9579           1 :             rOldRange.aEnd.SetCol( rNewRange.aEnd.Col() );
    9580             :         }
    9581             :         else
    9582             :         {
    9583             :             // move old range to aCompletedRanges, keep rNewRange for joining
    9584          57 :             aCompletedRanges.push_back( rOldRange );
    9585          57 :             rOldRange = rNewRange;  // replace in hash map
    9586             :         }
    9587             :     }
    9588             :     else
    9589             :     {
    9590             :         // keep rNewRange for joining
    9591          20 :         aJoinedRanges.insert( ScRowRangeHashMap::value_type( nStartRow, rNewRange ) );
    9592             :     }
    9593             : }
    9594             : 
    9595          92 : const ScRangeList& ScUniqueFormatsEntry::GetRanges()
    9596             : {
    9597          92 :     if ( eState == STATE_SINGLE )
    9598             :     {
    9599          75 :         aReturnRanges = new ScRangeList;
    9600          75 :         aReturnRanges->Append( aSingleRange );
    9601          75 :         return *aReturnRanges;
    9602             :     }
    9603             : 
    9604             :     // move remaining entries from aJoinedRanges to aCompletedRanges
    9605             : 
    9606          17 :     ScRowRangeHashMap::const_iterator aJoinedEnd = aJoinedRanges.end();
    9607          54 :     for ( ScRowRangeHashMap::const_iterator aJoinedIter = aJoinedRanges.begin(); aJoinedIter != aJoinedEnd; ++aJoinedIter )
    9608          37 :         aCompletedRanges.push_back( aJoinedIter->second );
    9609          17 :     aJoinedRanges.clear();
    9610             : 
    9611             :     // sort all ranges for a predictable API result
    9612             : 
    9613          17 :     std::sort( aCompletedRanges.begin(), aCompletedRanges.end() );
    9614             : 
    9615             :     // fill and return ScRangeList
    9616             : 
    9617          17 :     aReturnRanges = new ScRangeList;
    9618          17 :     ScRangeVector::const_iterator aCompEnd( aCompletedRanges.end() );
    9619         111 :     for ( ScRangeVector::const_iterator aCompIter( aCompletedRanges.begin() ); aCompIter != aCompEnd; ++aCompIter )
    9620          94 :         aReturnRanges->Append( *aCompIter );
    9621          17 :     aCompletedRanges.clear();
    9622             : 
    9623          17 :     return *aReturnRanges;
    9624             : }
    9625             : 
    9626             : typedef std::unordered_map< const ScPatternAttr*, ScUniqueFormatsEntry, ScPatternHashCode > ScUniqueFormatsHashMap;
    9627             : 
    9628             : // function object to sort the range lists by start of first range
    9629             : struct ScUniqueFormatsOrder
    9630             : {
    9631         135 :     bool operator()( const ScRangeList& rList1, const ScRangeList& rList2 ) const
    9632             :     {
    9633             :         // all range lists have at least one entry
    9634             :         OSL_ENSURE( rList1.size() > 0 && rList2.size() > 0, "ScUniqueFormatsOrder: empty list" );
    9635             : 
    9636             :         // compare start positions using ScAddress comparison operator
    9637         135 :         return ( rList1[ 0 ]->aStart < rList2[ 0 ]->aStart );
    9638             :     }
    9639             : };
    9640             : 
    9641          36 : void ScUniqueCellFormatsObj::GetObjects_Impl()
    9642             : {
    9643          36 :     if (pDocShell)
    9644             :     {
    9645          36 :         ScDocument& rDoc = pDocShell->GetDocument();
    9646          36 :         SCTAB nTab = aTotalRange.aStart.Tab();
    9647             :         ScAttrRectIterator aIter( &rDoc, nTab,
    9648          36 :                                     aTotalRange.aStart.Col(), aTotalRange.aStart.Row(),
    9649          72 :                                     aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() );
    9650             :         SCCOL nCol1, nCol2;
    9651             :         SCROW nRow1, nRow2;
    9652             : 
    9653             :         // Collect the ranges for each format in a hash map, to avoid nested loops
    9654             : 
    9655          72 :         ScUniqueFormatsHashMap aHashMap;
    9656         255 :         while (aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) )
    9657             :         {
    9658         183 :             ScRange aRange( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
    9659         183 :             const ScPatternAttr* pPattern = rDoc.GetPattern(nCol1, nRow1, nTab);
    9660         183 :             aHashMap[pPattern].Join( aRange );
    9661             :         }
    9662             : 
    9663             :         // Fill the vector aRangeLists with the range lists from the hash map
    9664             : 
    9665          36 :         aRangeLists.reserve( aHashMap.size() );
    9666          36 :         ScUniqueFormatsHashMap::iterator aMapIter( aHashMap.begin() );
    9667          36 :         ScUniqueFormatsHashMap::iterator aMapEnd( aHashMap.end() );
    9668         164 :         while ( aMapIter != aMapEnd )
    9669             :         {
    9670          92 :             ScUniqueFormatsEntry& rEntry = aMapIter->second;
    9671          92 :             const ScRangeList& rRanges = rEntry.GetRanges();
    9672          92 :             aRangeLists.push_back( rRanges );       // copy ScRangeList
    9673          92 :             rEntry.Clear();                         // free memory, don't hold both copies of all ranges
    9674          92 :             ++aMapIter;
    9675             :         }
    9676             : 
    9677             :         // Sort the vector by first range's start position, to avoid random shuffling
    9678             :         // due to using the ScPatterAttr pointers
    9679             : 
    9680             :         ScUniqueFormatsOrder aComp;
    9681          72 :         ::std::sort( aRangeLists.begin(), aRangeLists.end(), aComp );
    9682             :     }
    9683          36 : }
    9684             : 
    9685             : // XIndexAccess
    9686             : 
    9687          35 : sal_Int32 SAL_CALL ScUniqueCellFormatsObj::getCount() throw(uno::RuntimeException, std::exception)
    9688             : {
    9689          35 :     SolarMutexGuard aGuard;
    9690             : 
    9691          35 :     return aRangeLists.size();
    9692             : }
    9693             : 
    9694          88 : uno::Any SAL_CALL ScUniqueCellFormatsObj::getByIndex( sal_Int32 nIndex )
    9695             :                             throw(lang::IndexOutOfBoundsException,
    9696             :                                     lang::WrappedTargetException, uno::RuntimeException, std::exception)
    9697             : {
    9698          88 :     SolarMutexGuard aGuard;
    9699             : 
    9700          88 :     if(static_cast<sal_uInt32>(nIndex) < aRangeLists.size())
    9701         174 :         return uno::makeAny(uno::Reference<sheet::XSheetCellRangeContainer>(new ScCellRangesObj(pDocShell, aRangeLists[nIndex])));
    9702             :     else
    9703          87 :         throw lang::IndexOutOfBoundsException();
    9704             : }
    9705             : 
    9706           1 : uno::Type SAL_CALL ScUniqueCellFormatsObj::getElementType() throw(uno::RuntimeException, std::exception)
    9707             : {
    9708           1 :     SolarMutexGuard aGuard;
    9709           1 :     return cppu::UnoType<sheet::XSheetCellRangeContainer>::get();
    9710             : }
    9711             : 
    9712           1 : sal_Bool SAL_CALL ScUniqueCellFormatsObj::hasElements() throw(uno::RuntimeException, std::exception)
    9713             : {
    9714           1 :     SolarMutexGuard aGuard;
    9715           1 :     return ( aRangeLists.size() != 0 );
    9716             : }
    9717             : 
    9718             : // XEnumerationAccess
    9719             : 
    9720           2 : uno::Reference<container::XEnumeration> SAL_CALL ScUniqueCellFormatsObj::createEnumeration()
    9721             :                                                     throw(uno::RuntimeException, std::exception)
    9722             : {
    9723           2 :     SolarMutexGuard aGuard;
    9724           2 :     if (pDocShell)
    9725           2 :         return new ScUniqueCellFormatsEnumeration( pDocShell, aRangeLists );
    9726           0 :     return NULL;
    9727             : }
    9728             : 
    9729           2 : ScUniqueCellFormatsEnumeration::ScUniqueCellFormatsEnumeration(ScDocShell* pDocSh, const ScMyRangeLists& rRangeLists) :
    9730             :     aRangeLists(rRangeLists),
    9731             :     pDocShell( pDocSh ),
    9732           2 :     nCurrentPosition(0)
    9733             : {
    9734           2 :     pDocShell->GetDocument().AddUnoObject(*this);
    9735           2 : }
    9736             : 
    9737           6 : ScUniqueCellFormatsEnumeration::~ScUniqueCellFormatsEnumeration()
    9738             : {
    9739           2 :     SolarMutexGuard g;
    9740             : 
    9741           2 :     if (pDocShell)
    9742           0 :         pDocShell->GetDocument().RemoveUnoObject(*this);
    9743           4 : }
    9744             : 
    9745           2 : void ScUniqueCellFormatsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9746             : {
    9747           2 :     if ( dynamic_cast<const ScUpdateRefHint*>(&rHint) )
    9748             :     {
    9749             :         //! und nun ???
    9750             :     }
    9751           2 :     else if ( dynamic_cast<const SfxSimpleHint*>(&rHint) )
    9752             :     {
    9753           2 :         sal_uLong nId = static_cast<const SfxSimpleHint&>(rHint).GetId();
    9754           2 :         if ( nId == SFX_HINT_DYING )
    9755           2 :             pDocShell = NULL;                       // ungueltig geworden
    9756             :     }
    9757           2 : }
    9758             : 
    9759             : // XEnumeration
    9760             : 
    9761          10 : sal_Bool SAL_CALL ScUniqueCellFormatsEnumeration::hasMoreElements() throw(uno::RuntimeException, std::exception)
    9762             : {
    9763          10 :     SolarMutexGuard aGuard;
    9764          10 :     return static_cast<sal_uInt32>(nCurrentPosition) < aRangeLists.size();
    9765             : }
    9766             : 
    9767           5 : uno::Any SAL_CALL ScUniqueCellFormatsEnumeration::nextElement() throw(container::NoSuchElementException,
    9768             :                                         lang::WrappedTargetException, uno::RuntimeException, std::exception)
    9769             : {
    9770           5 :     SolarMutexGuard aGuard;
    9771             : 
    9772           5 :     if ( !hasMoreElements() || !pDocShell )
    9773           1 :         throw container::NoSuchElementException();      // no more elements
    9774             : 
    9775             :     // Interface-Typ muss zu ScCellFormatsObj::getElementType passen
    9776             : 
    9777           4 :     return uno::makeAny(uno::Reference<sheet::XSheetCellRangeContainer>(new ScCellRangesObj(pDocShell, aRangeLists[nCurrentPosition++])));
    9778         156 : }
    9779             : 
    9780             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11