LCOV - code coverage report
Current view: top level - libreoffice/sc/source/ui/unoobj - cellsuno.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1747 5382 32.5 %
Date: 2012-12-27 Functions: 169 468 36.1 %
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/brshitem.hxx>
      27             : #include <editeng/editeng.hxx>
      28             : #include <editeng/flditem.hxx>
      29             : #include <editeng/justifyitem.hxx>
      30             : #include <svx/fmdpage.hxx>
      31             : #include <editeng/langitem.hxx>
      32             : #include <sfx2/linkmgr.hxx>
      33             : #include <svl/srchitem.hxx>
      34             : #include <svx/unomid.hxx>
      35             : #include <editeng/unoprnms.hxx>
      36             : #include <editeng/unotext.hxx>
      37             : #include <svx/svdpage.hxx>
      38             : #include <sfx2/bindings.hxx>
      39             : #include <svl/zforlist.hxx>
      40             : #include <svl/zformat.hxx>
      41             : #include <comphelper/servicehelper.hxx>
      42             : #include <float.h>              // DBL_MIN
      43             : 
      44             : #include <com/sun/star/awt/XBitmap.hpp>
      45             : #include <com/sun/star/util/CellProtection.hpp>
      46             : #include <com/sun/star/table/CellHoriJustify.hpp>
      47             : #include <com/sun/star/table/CellOrientation.hpp>
      48             : #include <com/sun/star/table/CellVertJustify2.hpp>
      49             : #include <com/sun/star/table/ShadowFormat.hpp>
      50             : #include <com/sun/star/table/TableBorder.hpp>
      51             : #include <com/sun/star/table/BorderLineStyle.hpp>
      52             : #include <com/sun/star/sheet/CellFlags.hpp>
      53             : #include <com/sun/star/sheet/FormulaResult.hpp>
      54             : #include <com/sun/star/beans/PropertyAttribute.hpp>
      55             : #include <com/sun/star/lang/Locale.hpp>
      56             : #include <com/sun/star/beans/TolerantPropertySetResultType.hpp>
      57             : #include <com/sun/star/beans/SetPropertyTolerantFailed.hpp>
      58             : #include <com/sun/star/text/WritingMode2.hpp>
      59             : #include <com/sun/star/text/textfield/Type.hpp>
      60             : 
      61             : #include "autoform.hxx"
      62             : #include "cellmergeoption.hxx"
      63             : #include "cellsuno.hxx"
      64             : #include "cursuno.hxx"
      65             : #include "textuno.hxx"
      66             : #include "editsrc.hxx"
      67             : #include "notesuno.hxx"
      68             : #include "fielduno.hxx"
      69             : #include "docuno.hxx"       // ScTableColumnsObj etc
      70             : #include "datauno.hxx"
      71             : #include "dapiuno.hxx"
      72             : #include "chartuno.hxx"
      73             : #include "fmtuno.hxx"
      74             : #include "miscuno.hxx"
      75             : #include "convuno.hxx"
      76             : #include "srchuno.hxx"
      77             : #include "nameuno.hxx"
      78             : #include "targuno.hxx"
      79             : #include "tokenuno.hxx"
      80             : #include "eventuno.hxx"
      81             : #include "docsh.hxx"
      82             : #include "markdata.hxx"
      83             : #include "patattr.hxx"
      84             : #include "docpool.hxx"
      85             : #include "docfunc.hxx"
      86             : #include "dbdocfun.hxx"
      87             : #include "olinefun.hxx"
      88             : #include "hints.hxx"
      89             : #include "cell.hxx"
      90             : #include "column.hxx"
      91             : #include "undocell.hxx"
      92             : #include "undotab.hxx"
      93             : #include "undoblk.hxx"      // fuer lcl_ApplyBorder - nach docfunc verschieben!
      94             : #include "stlsheet.hxx"
      95             : #include "dbdata.hxx"
      96             : #include "attrib.hxx"
      97             : #include "chartarr.hxx"
      98             : #include "chartlis.hxx"
      99             : #include "drwlayer.hxx"
     100             : #include "printfun.hxx"
     101             : #include "prnsave.hxx"
     102             : #include "tablink.hxx"
     103             : #include "dociter.hxx"
     104             : #include "rangeutl.hxx"
     105             : #include "conditio.hxx"
     106             : #include "validat.hxx"
     107             : #include "sc.hrc"
     108             : #include "brdcst.hxx"
     109             : #include "cellform.hxx"
     110             : #include "globstr.hrc"
     111             : #include "unonames.hxx"
     112             : #include "styleuno.hxx"
     113             : #include "rangeseq.hxx"
     114             : #include "unowids.hxx"
     115             : #include "paramisc.hxx"
     116             : #include "queryentry.hxx"
     117             : #include "formula/errorcodes.hxx"
     118             : #include "unoreflist.hxx"
     119             : #include "formula/grammar.hxx"
     120             : #include "editeng/escpitem.hxx"
     121             : 
     122             : #include <list>
     123             : 
     124             : using namespace com::sun::star;
     125             : 
     126             : //------------------------------------------------------------------------
     127             : 
     128           0 : class ScNamedEntry
     129             : {
     130             :     String  aName;
     131             :     ScRange aRange;
     132             : 
     133             : public:
     134           0 :             ScNamedEntry(const String& rN, const ScRange& rR) :
     135           0 :                 aName(rN), aRange(rR) {}
     136             : 
     137           0 :     const String&   GetName() const     { return aName; }
     138           0 :     const ScRange&  GetRange() const    { return aRange; }
     139             : };
     140             : 
     141             : //------------------------------------------------------------------------
     142             : 
     143             : //  The names in the maps must be sorted according to strcmp!
     144             : //! Instead of Which-ID 0 use special IDs and do not compare via names!
     145             : 
     146             : //  Left/Right/Top/BottomBorder are mapped directly to the core items,
     147             : //  not collected/applied to the borders of a range -> ATTR_BORDER can be used directly
     148             : 
     149        2422 : static const SfxItemPropertySet* lcl_GetCellsPropertySet()
     150             : {
     151             :     static SfxItemPropertyMapEntry aCellsPropertyMap_Impl[] =
     152             :     {
     153           3 :         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
     154           3 :         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
     155           3 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     156           3 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     157           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
     158           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
     159           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
     160           3 :         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
     161           3 :         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
     162           3 :         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
     163           3 :         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
     164           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     165           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     166           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     167           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     168           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     169           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     170           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     171           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     172           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     173           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     174           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     175           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     176           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     177           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     178           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     179           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     180           3 :         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     181           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     182           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     183           3 :         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
     184           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     185           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     186           3 :         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     187           3 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     188           3 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     189           3 :         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
     190           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     191           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     192           3 :         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
     193           3 :         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
     194           3 :         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
     195           3 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     196           3 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     197           3 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     198           3 :         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
     199           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     200           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     201           3 :         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
     202           3 :         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
     203           3 :         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
     204           3 :         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     205           3 :         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     206           3 :         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     207           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     208           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     209           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     210           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     211           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST },
     212           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     213           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
     214           3 :         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
     215           3 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     216           3 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     217           3 :         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
     218           3 :         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
     219           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
     220           3 :         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     221           3 :         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     222           3 :         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
     223           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
     224           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
     225           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
     226           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
     227           3 :         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     228           3 :         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     229           3 :         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     230           3 :         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     231           3 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     232           3 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,     &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     233           3 :         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
     234           3 :         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((sal_Int32*)0), 0, 0 },
     235           3 :         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
     236           3 :         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
     237           3 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
     238           3 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, &getCppuType((table::TableBorder2*)0),   0, 0 | CONVERT_TWIPS },
     239           3 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     240           3 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     241           3 :         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
     242           3 :         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     243           3 :         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     244           3 :         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     245           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((sal_Int32*)0), 0, 0 },
     246           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     247           3 :         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
     248             :         {0,0,0,0,0,0}
     249        2707 :     };
     250        2422 :     static SfxItemPropertySet aCellsPropertySet( aCellsPropertyMap_Impl );
     251        2422 :     return &aCellsPropertySet;
     252             : }
     253             : 
     254             : //  CellRange enthaelt alle Eintraege von Cells, zusaetzlich eigene Eintraege
     255             : //  mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt).
     256             : 
     257        1798 : static const SfxItemPropertySet* lcl_GetRangePropertySet()
     258             : {
     259             :     static SfxItemPropertyMapEntry aRangePropertyMap_Impl[] =
     260             :     {
     261           3 :         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
     262           3 :         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
     263           3 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     264           3 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     265           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
     266           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
     267           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
     268           3 :         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
     269           3 :         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
     270           3 :         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
     271           3 :         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
     272           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     273           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     274           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     275           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     276           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     277           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     278           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     279           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     280           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     281           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     282           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     283           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     284           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     285           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     286           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     287           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     288           3 :         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     289           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     290           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     291           3 :         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
     292           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     293           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     294           3 :         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     295           3 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     296           3 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     297           3 :         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
     298           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     299           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     300           3 :         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
     301           3 :         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
     302           3 :         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
     303           3 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     304           3 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     305           3 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     306           3 :         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
     307           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     308           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     309           3 :         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
     310           3 :         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
     311           3 :         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
     312           3 :         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     313           3 :         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     314           3 :         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     315           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     316           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     317           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     318           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     319           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0),   0, MID_HORJUST_HORJUST },
     320           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     321           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
     322           3 :         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
     323           3 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     324           3 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     325           3 :         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
     326           3 :         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
     327           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
     328           3 :         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     329           3 :         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     330           3 :         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
     331           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
     332           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
     333           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
     334           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
     335           3 :         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     336           3 :         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     337           3 :         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     338           3 :         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     339           3 :         {MAP_CHAR_LEN(SC_UNONAME_POS),      SC_WID_UNO_POS,     &getCppuType((awt::Point*)0),           0 | beans::PropertyAttribute::READONLY, 0 },
     340           3 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     341           3 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,     &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     342           3 :         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
     343           3 :         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((sal_Int32*)0), 0, 0 },
     344           3 :         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
     345           3 :         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
     346           3 :         {MAP_CHAR_LEN(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    &getCppuType((awt::Size*)0),            0 | beans::PropertyAttribute::READONLY, 0 },
     347           3 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
     348           3 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, &getCppuType((table::TableBorder2*)0),   0, 0 | CONVERT_TWIPS },
     349           3 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     350           3 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     351           3 :         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
     352           3 :         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     353           3 :         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     354           3 :         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     355           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((sal_Int32*)0), 0, 0 },
     356           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     357           3 :         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
     358             :         {0,0,0,0,0,0}
     359        2089 :     };
     360        1798 :     static SfxItemPropertySet aRangePropertySet( aRangePropertyMap_Impl );
     361        1798 :     return &aRangePropertySet;
     362             : }
     363             : 
     364             : //  Cell enthaelt alle Eintraege von CellRange, zusaetzlich eigene Eintraege
     365             : //  mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt).
     366             : 
     367          22 : static const SfxItemPropertySet* lcl_GetCellPropertySet()
     368             : {
     369             :     static SfxItemPropertyMapEntry aCellPropertyMap_Impl[] =
     370             :     {
     371           2 :         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
     372           2 :         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
     373           2 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     374           2 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     375           2 :         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
     376           2 :         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
     377           2 :         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
     378           2 :         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
     379           2 :         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
     380           2 :         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
     381           2 :         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
     382           2 :         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     383           2 :         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     384           2 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     385           2 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     386           2 :         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     387           2 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     388           2 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     389           2 :         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     390           2 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     391           2 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     392           2 :         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     393           2 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     394           2 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     395           2 :         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     396           2 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     397           2 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     398           2 :         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     399           2 :         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     400           2 :         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     401           2 :         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
     402           2 :         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     403           2 :         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     404           2 :         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     405           2 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     406           2 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     407           2 :         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
     408           2 :         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     409           2 :         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     410           2 :         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
     411           2 :         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
     412           2 :         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
     413           2 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     414           2 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     415           2 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     416           2 :         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
     417           2 :         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     418           2 :         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     419           2 :         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
     420           2 :         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
     421           2 :         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
     422           2 :         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     423           2 :         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     424           2 :         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     425           2 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     426           2 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     427           2 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     428           2 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     429           2 :         {MAP_CHAR_LEN(SC_UNONAME_FORMLOC),  SC_WID_UNO_FORMLOC, &getCppuType((rtl::OUString*)0),        0, 0 },
     430           2 :         {MAP_CHAR_LEN(SC_UNONAME_FORMRT),   SC_WID_UNO_FORMRT,  &getCppuType((table::CellContentType*)0), 0 | beans::PropertyAttribute::READONLY, 0 },
     431           2 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST },
     432           2 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     433           2 :         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
     434           2 :         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
     435           2 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     436           2 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     437           2 :         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
     438           2 :         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
     439           2 :         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
     440           2 :         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     441           2 :         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     442           2 :         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
     443           2 :         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
     444           2 :         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
     445           2 :         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
     446           2 :         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
     447           2 :         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     448           2 :         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     449           2 :         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     450           2 :         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     451           2 :         {MAP_CHAR_LEN(SC_UNONAME_POS),      SC_WID_UNO_POS,     &getCppuType((awt::Point*)0),           0 | beans::PropertyAttribute::READONLY, 0 },
     452           2 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     453           2 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,     &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     454           2 :         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
     455           2 :         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((sal_Int32*)0), 0, 0 },
     456           2 :         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
     457           2 :         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
     458           2 :         {MAP_CHAR_LEN(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    &getCppuType((awt::Size*)0),            0 | beans::PropertyAttribute::READONLY, 0 },
     459           2 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
     460           2 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, &getCppuType((table::TableBorder2*)0),   0, 0 | CONVERT_TWIPS },
     461           2 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     462           2 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     463           2 :         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
     464           2 :         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     465           2 :         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     466           2 :         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     467           2 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((sal_Int32*)0), 0, 0 },
     468           2 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     469           2 :         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
     470           2 :         {MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_ESCAPEMENT),   EE_CHAR_ESCAPEMENT, &getCppuType((sal_Int32*)0),            0, 0 },
     471             :         {0,0,0,0,0,0}
     472         222 :     };
     473          22 :     static SfxItemPropertySet aCellPropertySet( aCellPropertyMap_Impl );
     474          22 :     return &aCellPropertySet;
     475             : }
     476             : 
     477             : //  Column und Row enthalten alle Eintraege von CellRange, zusaetzlich eigene Eintraege
     478             : //  mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt).
     479             : 
     480           2 : static const SfxItemPropertySet* lcl_GetColumnPropertySet()
     481             : {
     482             :     static SfxItemPropertyMapEntry aColumnPropertyMap_Impl[] =
     483             :     {
     484           1 :         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
     485           1 :         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
     486           1 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     487           1 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     488           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
     489           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
     490           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
     491           1 :         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
     492           1 :         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
     493           1 :         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
     494           1 :         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
     495           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     496           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     497           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     498           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     499           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     500           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     501           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     502           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     503           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     504           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     505           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     506           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     507           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     508           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     509           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     510           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     511           1 :         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     512           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     513           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     514           1 :         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
     515           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     516           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     517           1 :         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     518           1 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     519           1 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     520           1 :         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
     521           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     522           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     523           1 :         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
     524           1 :         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
     525           1 :         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
     526           1 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     527           1 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     528           1 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     529           1 :         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
     530           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     531           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     532           1 :         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
     533           1 :         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
     534           1 :         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
     535           1 :         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     536           1 :         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     537           1 :         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     538           1 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     539           1 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     540           1 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     541           1 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     542           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST },
     543           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     544           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
     545           1 :         {MAP_CHAR_LEN(SC_UNONAME_MANPAGE),  SC_WID_UNO_MANPAGE, &getBooleanCppuType(),                  0, 0 },
     546           1 :         {MAP_CHAR_LEN(SC_UNONAME_NEWPAGE),  SC_WID_UNO_NEWPAGE, &getBooleanCppuType(),                  0, 0 },
     547           1 :         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
     548           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVIS),  SC_WID_UNO_CELLVIS, &getBooleanCppuType(),                  0, 0 },
     549           1 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     550           1 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     551           1 :         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
     552           1 :         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
     553           1 :         {MAP_CHAR_LEN(SC_UNONAME_OWIDTH),   SC_WID_UNO_OWIDTH,  &getBooleanCppuType(),                  0, 0 },
     554           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
     555           1 :         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     556           1 :         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     557           1 :         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
     558           1 :         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
     559           1 :         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
     560           1 :         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
     561           1 :         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
     562           1 :         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     563           1 :         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     564           1 :         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     565           1 :         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     566           1 :         {MAP_CHAR_LEN(SC_UNONAME_POS),      SC_WID_UNO_POS,     &getCppuType((awt::Point*)0),           0 | beans::PropertyAttribute::READONLY, 0 },
     567           1 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     568           1 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     569           1 :         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
     570           1 :         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((sal_Int32*)0), 0, 0 },
     571           1 :         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
     572           1 :         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
     573           1 :         {MAP_CHAR_LEN(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    &getCppuType((awt::Size*)0),            0 | beans::PropertyAttribute::READONLY, 0 },
     574           1 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
     575           1 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, &getCppuType((table::TableBorder2*)0),   0, 0 | CONVERT_TWIPS },
     576           1 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     577           1 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     578           1 :         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
     579           1 :         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     580           1 :         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     581           1 :         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     582           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((sal_Int32*)0), 0, 0 },
     583           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     584           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLWID),  SC_WID_UNO_CELLWID, &getCppuType((sal_Int32*)0),            0, 0 },
     585           1 :         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
     586             :         {0,0,0,0,0,0}
     587         104 :     };
     588           2 :     static SfxItemPropertySet aColumnPropertySet( aColumnPropertyMap_Impl );
     589           2 :     return &aColumnPropertySet;
     590             : }
     591             : 
     592           2 : static const SfxItemPropertySet* lcl_GetRowPropertySet()
     593             : {
     594             :     static SfxItemPropertyMapEntry aRowPropertyMap_Impl[] =
     595             :     {
     596           1 :         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
     597           1 :         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
     598           1 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     599           1 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     600           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
     601           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
     602           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
     603           1 :         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
     604           1 :         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
     605           1 :         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
     606           1 :         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
     607           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     608           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     609           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     610           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     611           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     612           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     613           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     614           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     615           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     616           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     617           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     618           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     619           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     620           1 :         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     621           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     622           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     623           1 :         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     624           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     625           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     626           1 :         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
     627           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     628           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     629           1 :         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     630           1 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     631           1 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     632           1 :         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
     633           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     634           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     635           1 :         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
     636           1 :         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
     637           1 :         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
     638           1 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     639           1 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     640           1 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     641           1 :         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
     642           1 :         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     643           1 :         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     644           1 :         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
     645           1 :         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
     646           1 :         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
     647           1 :         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     648           1 :         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     649           1 :         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     650           1 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     651           1 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     652           1 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     653           1 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     654           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHGT),  SC_WID_UNO_CELLHGT, &getCppuType((sal_Int32*)0),            0, 0 },
     655           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST },
     656           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     657           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
     658           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLFILT), SC_WID_UNO_CELLFILT,&getBooleanCppuType(),                  0, 0 },
     659           1 :         {MAP_CHAR_LEN(SC_UNONAME_MANPAGE),  SC_WID_UNO_MANPAGE, &getBooleanCppuType(),                  0, 0 },
     660           1 :         {MAP_CHAR_LEN(SC_UNONAME_NEWPAGE),  SC_WID_UNO_NEWPAGE, &getBooleanCppuType(),                  0, 0 },
     661           1 :         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
     662           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVIS),  SC_WID_UNO_CELLVIS, &getBooleanCppuType(),                  0, 0 },
     663           1 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     664           1 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     665           1 :         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
     666           1 :         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
     667           1 :         {MAP_CHAR_LEN(SC_UNONAME_OHEIGHT),  SC_WID_UNO_OHEIGHT, &getBooleanCppuType(),                  0, 0 },
     668           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
     669           1 :         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     670           1 :         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     671           1 :         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
     672           1 :         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
     673           1 :         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
     674           1 :         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
     675           1 :         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
     676           1 :         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     677           1 :         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     678           1 :         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     679           1 :         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     680           1 :         {MAP_CHAR_LEN(SC_UNONAME_POS),      SC_WID_UNO_POS,     &getCppuType((awt::Point*)0),           0 | beans::PropertyAttribute::READONLY, 0 },
     681           1 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     682           1 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,     &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     683           1 :         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
     684           1 :         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((sal_Int32*)0), 0, 0 },
     685           1 :         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
     686           1 :         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
     687           1 :         {MAP_CHAR_LEN(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    &getCppuType((awt::Size*)0),            0 | beans::PropertyAttribute::READONLY, 0 },
     688           1 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
     689           1 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, &getCppuType((table::TableBorder2*)0),   0, 0 | CONVERT_TWIPS },
     690           1 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     691           1 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     692           1 :         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
     693           1 :         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     694           1 :         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     695           1 :         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     696           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((sal_Int32*)0), 0, 0 },
     697           1 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     698           1 :         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
     699             :         {0,0,0,0,0,0}
     700         105 :     };
     701           2 :     static SfxItemPropertySet aRowPropertySet( aRowPropertyMap_Impl );
     702           2 :     return &aRowPropertySet;
     703             : }
     704             : 
     705         158 : static const SfxItemPropertySet* lcl_GetSheetPropertySet()
     706             : {
     707             :     static SfxItemPropertyMapEntry aSheetPropertyMap_Impl[] =
     708             :     {
     709           3 :         {MAP_CHAR_LEN(SC_UNONAME_ABSNAME),  SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0),        0 | beans::PropertyAttribute::READONLY, 0 },
     710           3 :         {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(),                  0, 0 },
     711           3 :         {MAP_CHAR_LEN(SC_UNONAME_AUTOPRINT),SC_WID_UNO_AUTOPRINT,&getBooleanCppuType(),                 0, 0 },
     712           3 :         {MAP_CHAR_LEN(SC_UNONAME_BORDCOL),  SC_WID_UNO_BORDCOL, &getCppuType((sal_Int32*)0),            0, 0 },
     713           3 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     714           3 :         {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS },
     715           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND,    &getCppuType((sal_Int32*)0),            0, MID_BACK_COLOR },
     716           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLPRO),  ATTR_PROTECTION,    &getCppuType((util::CellProtection*)0), 0, 0 },
     717           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0),        0, 0 },
     718           3 :         {MAP_CHAR_LEN(SC_UNONAME_CCOLOR),   ATTR_FONT_COLOR,    &getCppuType((sal_Int32*)0),            0, 0 },
     719           3 :         {MAP_CHAR_LEN(SC_UNONAME_COUTL),    ATTR_FONT_CONTOUR,  &getBooleanCppuType(),                  0, 0 },
     720           3 :         {MAP_CHAR_LEN(SC_UNONAME_CCROSS),   ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(),                 0, MID_CROSSED_OUT },
     721           3 :         {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS),  ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0),         0, MID_EMPHASIS },
     722           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFONT),    ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     723           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFCHARS),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     724           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     725           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_CHAR_SET },
     726           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     727           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     728           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_FAMILY },
     729           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFNAME),   ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     730           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME),   ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     731           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME),   ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_FAMILY_NAME },
     732           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFPITCH),  ATTR_FONT,          &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     733           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH),  ATTR_CJK_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     734           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH),  ATTR_CTL_FONT,      &getCppuType((sal_Int16*)0),            0, MID_FONT_PITCH },
     735           3 :         {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE),  ATTR_FONT,          &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     736           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE),  ATTR_CJK_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     737           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE),  ATTR_CTL_FONT,      &getCppuType((rtl::OUString*)0),        0, MID_FONT_STYLE_NAME },
     738           3 :         {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT),  ATTR_FONT_HEIGHT,   &getCppuType((float*)0),                0, MID_FONTHEIGHT | CONVERT_TWIPS },
     739           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT),  ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     740           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT),  ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0),               0, MID_FONTHEIGHT | CONVERT_TWIPS },
     741           3 :         {MAP_CHAR_LEN(SC_UNONAME_CLOCAL),   ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0),         0, MID_LANG_LOCALE },
     742           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL),   ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     743           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL),   ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0),          0, MID_LANG_LOCALE },
     744           3 :         {MAP_CHAR_LEN(SC_UNONAME_COVER),    ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     745           3 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     746           3 :         {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     747           3 :         {MAP_CHAR_LEN(SC_UNONAME_CPOST),    ATTR_FONT_POSTURE,  &getCppuType((awt::FontSlant*)0),       0, MID_POSTURE },
     748           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CPOST),    ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     749           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CPOST),    ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0),     0, MID_POSTURE },
     750           3 :         {MAP_CHAR_LEN(SC_UNONAME_CRELIEF),  ATTR_FONT_RELIEF,   &getCppuType((sal_Int16*)0),            0, MID_RELIEF },
     751           3 :         {MAP_CHAR_LEN(SC_UNONAME_CSHADD),   ATTR_FONT_SHADOWED, &getBooleanCppuType(),                  0, 0 },
     752           3 :         {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE),  ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0),           0, MID_CROSS_OUT },
     753           3 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDER),   ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0),            0, MID_TL_STYLE },
     754           3 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0),            0, MID_TL_COLOR },
     755           3 :         {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(),                  0, MID_TL_HASCOLOR },
     756           3 :         {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT),  ATTR_FONT_WEIGHT,   &getCppuType((float*)0),                0, MID_WEIGHT },
     757           3 :         {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT),  ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     758           3 :         {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT),  ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0),               0, MID_WEIGHT },
     759           3 :         {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(),                  0, 0 },
     760           3 :         {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(),                  0, 0 },
     761           3 :         {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(),                  0, 0 },
     762           3 :         {MAP_CHAR_LEN(SC_UNONAME_CONDFMT),  SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     763           3 :         {MAP_CHAR_LEN(SC_UNONAME_CONDLOC),  SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     764           3 :         {MAP_CHAR_LEN(SC_UNONAME_CONDXML),  SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 },
     765           3 :         {MAP_CHAR_LEN(SC_UNONAME_COPYBACK), SC_WID_UNO_COPYBACK,&getBooleanCppuType(),                  0, 0 },
     766           3 :         {MAP_CHAR_LEN(SC_UNONAME_COPYFORM), SC_WID_UNO_COPYFORM,&getBooleanCppuType(),                  0, 0 },
     767           3 :         {MAP_CHAR_LEN(SC_UNONAME_COPYSTYL), SC_WID_UNO_COPYSTYL,&getBooleanCppuType(),                  0, 0 },
     768           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     769           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR2), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     770           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS },
     771           3 :         {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR2), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS },
     772           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY,   &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST },
     773           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     774           3 :         {MAP_CHAR_LEN(SC_UNONAME_ISACTIVE), SC_WID_UNO_ISACTIVE,&getBooleanCppuType(),                  0, 0 },
     775           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND,    &getBooleanCppuType(),                  0, MID_GRAPHIC_TRANSPARENT },
     776           3 :         {MAP_CHAR_LEN(SC_UNONAME_WRAP),     ATTR_LINEBREAK,     &getBooleanCppuType(),                  0, 0 },
     777           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVIS),  SC_WID_UNO_CELLVIS, &getBooleanCppuType(),                  0, 0 },
     778           3 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER,       &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     779           3 :         {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER2),ATTR_BORDER,      &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS },
     780           3 :         {MAP_CHAR_LEN(SC_UNO_LINKDISPBIT),  SC_WID_UNO_LINKDISPBIT,&getCppuType((uno::Reference<awt::XBitmap>*)0), 0 | beans::PropertyAttribute::READONLY, 0 },
     781           3 :         {MAP_CHAR_LEN(SC_UNO_LINKDISPNAME), SC_WID_UNO_LINKDISPNAME,&getCppuType((rtl::OUString*)0),    0 | beans::PropertyAttribute::READONLY, 0 },
     782           3 :         {MAP_CHAR_LEN(SC_UNONAME_NUMFMT),   ATTR_VALUE_FORMAT,  &getCppuType((sal_Int32*)0),            0, 0 },
     783           3 :         {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 },
     784           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLORI),  ATTR_STACKED,       &getCppuType((table::CellOrientation*)0), 0, 0 },
     785           3 :         {MAP_CHAR_LEN(SC_UNONAME_PAGESTL),  SC_WID_UNO_PAGESTL, &getCppuType((rtl::OUString*)0),        0, 0 },
     786           3 :         {MAP_CHAR_LEN(SC_UNONAME_PADJUST),  ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     787           3 :         {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS },
     788           3 :         {MAP_CHAR_LEN(SC_UNONAME_PINDENT),  ATTR_INDENT,        &getCppuType((sal_Int16*)0),            0, 0 }, //! CONVERT_TWIPS
     789           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE,   &getBooleanCppuType(),                  0, 0 },
     790           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(),                 0, 0 },
     791           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISHANG),  ATTR_HANGPUNCTUATION,&getBooleanCppuType(),                 0, 0 },
     792           3 :         {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE,     &getBooleanCppuType(),                  0, 0 },
     793           3 :         {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY,   &::getCppuType((const sal_Int16*)0),    0, MID_HORJUST_ADJUST },
     794           3 :         {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_L_MARGIN  | CONVERT_TWIPS },
     795           3 :         {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_R_MARGIN  | CONVERT_TWIPS },
     796           3 :         {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN,        &getCppuType((sal_Int32*)0),            0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS },
     797           3 :         {MAP_CHAR_LEN(SC_UNONAME_POS),      SC_WID_UNO_POS,     &getCppuType((awt::Point*)0),           0 | beans::PropertyAttribute::READONLY, 0 },
     798           3 :         {MAP_CHAR_LEN(SC_UNONAME_PRINTBORD),SC_WID_UNO_PRINTBORD,&getBooleanCppuType(),                 0, 0 },
     799           3 :         {MAP_CHAR_LEN(SC_UNONAME_PROTECT),  SC_WID_UNO_PROTECT, &getBooleanCppuType(),                  0, 0 },
     800           3 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER,      &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     801           3 :         {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER2),ATTR_BORDER,     &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS },
     802           3 :         {MAP_CHAR_LEN(SC_UNONAME_ROTANG),   ATTR_ROTATE_VALUE,  &getCppuType((sal_Int32*)0),            0, 0 },
     803           3 :         {MAP_CHAR_LEN(SC_UNONAME_ROTREF),   ATTR_ROTATE_MODE,   &getCppuType((sal_Int32*)0), 0, 0 },
     804           3 :         {MAP_CHAR_LEN(SC_UNONAME_SHADOW),   ATTR_SHADOW,        &getCppuType((table::ShadowFormat*)0),  0, 0 | CONVERT_TWIPS },
     805           3 :         {MAP_CHAR_LEN(SC_UNONAME_SHOWBORD), SC_WID_UNO_SHOWBORD,&getBooleanCppuType(),                  0, 0 },
     806           3 :         {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(),               0, 0 },
     807           3 :         {MAP_CHAR_LEN(SC_UNONAME_SIZE),     SC_WID_UNO_SIZE,    &getCppuType((awt::Size*)0),            0 | beans::PropertyAttribute::READONLY, 0 },
     808           3 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD),  SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0),   0, 0 | CONVERT_TWIPS },
     809           3 :         {MAP_CHAR_LEN(SC_UNONAME_TBLBORD2),  SC_WID_UNO_TBLBORD2, &getCppuType((table::TableBorder2*)0),   0, 0 | CONVERT_TWIPS },
     810           3 :         {MAP_CHAR_LEN(SC_UNONAME_TABLAYOUT),SC_WID_UNO_TABLAYOUT,&getCppuType((sal_Int16*)0),           0, 0 },
     811           3 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER,        &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     812           3 :         {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER2),ATTR_BORDER,       &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS },
     813           3 :         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  ATTR_USERDEF,       &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 },
     814           3 :         {MAP_CHAR_LEN(SC_UNONAME_VALIDAT),  SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     815           3 :         {MAP_CHAR_LEN(SC_UNONAME_VALILOC),  SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     816           3 :         {MAP_CHAR_LEN(SC_UNONAME_VALIXML),  SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 },
     817           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY,   &getCppuType((sal_Int32*)0), 0, 0 },
     818           3 :         {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0),   0, 0 },
     819           3 :         {MAP_CHAR_LEN(SC_UNONAME_WRITING),  ATTR_WRITINGDIR,    &getCppuType((sal_Int16*)0),            0, 0 },
     820           3 :         {MAP_CHAR_LEN(SC_UNONAME_TABCOLOR), SC_WID_UNO_TABCOLOR, &getCppuType((sal_Int32*)0), 0, 0 },
     821           3 :         {MAP_CHAR_LEN(SC_UNO_CODENAME),        SC_WID_UNO_CODENAME, &getCppuType(static_cast< const rtl::OUString * >(0)),    0, 0},
     822           3 :         {MAP_CHAR_LEN(SC_UNO_NAMEDRANGES), SC_WID_UNO_NAMES, &getCppuType((uno::Reference<sheet::XNamedRanges>*)0), 0, 0 },
     823             :         {0,0,0,0,0,0}
     824         500 :     };
     825         158 :     static SfxItemPropertySet aSheetPropertySet( aSheetPropertyMap_Impl );
     826         158 :     return &aSheetPropertySet;
     827             : }
     828             : 
     829           1 : static const SfxItemPropertyMapEntry* lcl_GetEditPropertyMap()
     830             : {
     831             :     static SfxItemPropertyMapEntry aEditPropertyMap_Impl[] =
     832             :     {
     833          46 :         SVX_UNOEDIT_CHAR_PROPERTIES,
     834           1 :         SVX_UNOEDIT_FONT_PROPERTIES,
     835          14 :         SVX_UNOEDIT_PARA_PROPERTIES,
     836           2 :         SVX_UNOEDIT_NUMBERING_PROPERTIE,    // for completeness of service ParagraphProperties
     837           1 :         {MAP_CHAR_LEN(SC_UNONAME_TEXTUSER), EE_CHAR_XMLATTRIBS, &getCppuType((const uno::Reference< container::XNameContainer >*)0), 0, 0},
     838           1 :         {MAP_CHAR_LEN(SC_UNONAME_USERDEF),  EE_PARA_XMLATTRIBS, &getCppuType((const uno::Reference< container::XNameContainer >*)0), 0, 0},
     839             :         {0,0,0,0,0,0}
     840          66 :     };
     841           1 :     return aEditPropertyMap_Impl;
     842             : }
     843           3 : static const SvxItemPropertySet* lcl_GetEditPropertySet()
     844             : {
     845           3 :     static SvxItemPropertySet aEditPropertySet( lcl_GetEditPropertyMap(), SdrObject::GetGlobalDrawObjectItemPool() );
     846           3 :     return &aEditPropertySet;
     847             : }
     848             : 
     849             : //------------------------------------------------------------------------
     850             : 
     851             : using sc::HMMToTwips;
     852             : using sc::TwipsToHMM;
     853             : 
     854             : //------------------------------------------------------------------------
     855             : 
     856             : #define SCCHARPROPERTIES_SERVICE    "com.sun.star.style.CharacterProperties"
     857             : #define SCPARAPROPERTIES_SERVICE    "com.sun.star.style.ParagraphProperties"
     858             : #define SCCELLPROPERTIES_SERVICE    "com.sun.star.table.CellProperties"
     859             : #define SCCELLRANGE_SERVICE         "com.sun.star.table.CellRange"
     860             : #define SCCELL_SERVICE              "com.sun.star.table.Cell"
     861             : #define SCSHEETCELLRANGES_SERVICE   "com.sun.star.sheet.SheetCellRanges"
     862             : #define SCSHEETCELLRANGE_SERVICE    "com.sun.star.sheet.SheetCellRange"
     863             : #define SCSPREADSHEET_SERVICE       "com.sun.star.sheet.Spreadsheet"
     864             : #define SCSHEETCELL_SERVICE         "com.sun.star.sheet.SheetCell"
     865             : 
     866           0 : SC_SIMPLE_SERVICE_INFO( ScCellFormatsEnumeration, "ScCellFormatsEnumeration", "com.sun.star.sheet.CellFormatRangesEnumeration" )
     867           0 : SC_SIMPLE_SERVICE_INFO( ScCellFormatsObj, "ScCellFormatsObj", "com.sun.star.sheet.CellFormatRanges" )
     868           0 : SC_SIMPLE_SERVICE_INFO( ScUniqueCellFormatsEnumeration, "ScUniqueCellFormatsEnumeration", "com.sun.star.sheet.UniqueCellFormatRangesEnumeration" )
     869           0 : SC_SIMPLE_SERVICE_INFO( ScUniqueCellFormatsObj, "ScUniqueCellFormatsObj", "com.sun.star.sheet.UniqueCellFormatRanges" )
     870           0 : SC_SIMPLE_SERVICE_INFO( ScCellRangesBase, "ScCellRangesBase", "stardiv.unknown" )
     871           0 : SC_SIMPLE_SERVICE_INFO( ScCellsEnumeration, "ScCellsEnumeration", "com.sun.star.sheet.CellsEnumeration" )
     872           0 : SC_SIMPLE_SERVICE_INFO( ScCellsObj, "ScCellsObj", "com.sun.star.sheet.Cells" )
     873           0 : SC_SIMPLE_SERVICE_INFO( ScTableColumnObj, "ScTableColumnObj", "com.sun.star.table.TableColumn" )
     874           0 : SC_SIMPLE_SERVICE_INFO( ScTableRowObj, "ScTableRowObj", "com.sun.star.table.TableRow" )
     875             : 
     876             : //------------------------------------------------------------------------
     877             : 
     878             : //! ScLinkListener in anderes File verschieben !!!
     879             : 
     880         164 : ScLinkListener::~ScLinkListener()
     881             : {
     882         164 : }
     883             : 
     884          86 : void ScLinkListener::Notify( SvtBroadcaster&, const SfxHint& rHint )
     885             : {
     886          86 :     aLink.Call( (SfxHint*)&rHint );
     887          86 : }
     888             : 
     889             : //------------------------------------------------------------------------
     890             : 
     891           0 : static void lcl_CopyProperties( beans::XPropertySet& rDest, beans::XPropertySet& rSource )
     892             : {
     893           0 :     uno::Reference<beans::XPropertySetInfo> xInfo(rSource.getPropertySetInfo());
     894           0 :     if (xInfo.is())
     895             :     {
     896           0 :         uno::Sequence<beans::Property> aSeq(xInfo->getProperties());
     897           0 :         const beans::Property* pAry = aSeq.getConstArray();
     898           0 :         sal_uLong nCount = aSeq.getLength();
     899           0 :         for (sal_uLong i=0; i<nCount; i++)
     900             :         {
     901           0 :             rtl::OUString aName(pAry[i].Name);
     902           0 :             rDest.setPropertyValue( aName, rSource.getPropertyValue( aName ) );
     903           0 :         }
     904           0 :     }
     905           0 : }
     906             : 
     907           0 : static SCTAB lcl_FirstTab( const ScRangeList& rRanges )
     908             : {
     909             :     OSL_ENSURE(rRanges.size() >= 1, "was fuer Ranges ?!?!");
     910           0 :     const ScRange* pFirst = rRanges[ 0 ];
     911           0 :     if (pFirst)
     912           0 :         return pFirst->aStart.Tab();
     913             : 
     914           0 :     return 0;   // soll nicht sein
     915             : }
     916             : 
     917           0 : static sal_Bool lcl_WholeSheet( const ScRangeList& rRanges )
     918             : {
     919           0 :     if ( rRanges.size() == 1 )
     920             :     {
     921           0 :         const ScRange* pRange = rRanges[0];
     922           0 :         if ( pRange && pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL &&
     923           0 :                        pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW )
     924           0 :             return sal_True;
     925             :     }
     926           0 :     return false;
     927             : }
     928             : 
     929             : //------------------------------------------------------------------------
     930             : 
     931           2 : static ScSubTotalFunc lcl_SummaryToSubTotal( sheet::GeneralFunction eSummary )
     932             : {
     933             :     ScSubTotalFunc eSubTotal;
     934           2 :     switch (eSummary)
     935             :     {
     936             :         case sheet::GeneralFunction_SUM:
     937           0 :             eSubTotal = SUBTOTAL_FUNC_SUM;
     938           0 :             break;
     939             :         case sheet::GeneralFunction_COUNT:
     940           2 :             eSubTotal = SUBTOTAL_FUNC_CNT2;
     941           2 :             break;
     942             :         case sheet::GeneralFunction_AVERAGE:
     943           0 :             eSubTotal = SUBTOTAL_FUNC_AVE;
     944           0 :             break;
     945             :         case sheet::GeneralFunction_MAX:
     946           0 :             eSubTotal = SUBTOTAL_FUNC_MAX;
     947           0 :             break;
     948             :         case sheet::GeneralFunction_MIN:
     949           0 :             eSubTotal = SUBTOTAL_FUNC_MIN;
     950           0 :             break;
     951             :         case sheet::GeneralFunction_PRODUCT:
     952           0 :             eSubTotal = SUBTOTAL_FUNC_PROD;
     953           0 :             break;
     954             :         case sheet::GeneralFunction_COUNTNUMS:
     955           0 :             eSubTotal = SUBTOTAL_FUNC_CNT;
     956           0 :             break;
     957             :         case sheet::GeneralFunction_STDEV:
     958           0 :             eSubTotal = SUBTOTAL_FUNC_STD;
     959           0 :             break;
     960             :         case sheet::GeneralFunction_STDEVP:
     961           0 :             eSubTotal = SUBTOTAL_FUNC_STDP;
     962           0 :             break;
     963             :         case sheet::GeneralFunction_VAR:
     964           0 :             eSubTotal = SUBTOTAL_FUNC_VAR;
     965           0 :             break;
     966             :         case sheet::GeneralFunction_VARP:
     967           0 :             eSubTotal = SUBTOTAL_FUNC_VARP;
     968           0 :             break;
     969             : 
     970             :         case sheet::GeneralFunction_NONE:
     971             :         case sheet::GeneralFunction_AUTO:
     972             :         default:
     973           0 :             eSubTotal = SUBTOTAL_FUNC_NONE;
     974           0 :             break;
     975             :     }
     976           2 :     return eSubTotal;
     977             : }
     978             : 
     979             : //------------------------------------------------------------------------
     980             : 
     981             : namespace {
     982             : template<typename BorderLineType>
     983           0 : const ::editeng::SvxBorderLine* lcl_getBorderLine(
     984             :         ::editeng::SvxBorderLine& rLine, const BorderLineType& rStruct )
     985             : {
     986             :     // Convert from 1/100mm to Twips.
     987           0 :     if (!SvxBoxItem::LineToSvxLine( rStruct, rLine, true))
     988           0 :         return NULL;
     989             : 
     990           0 :     if ( rLine.GetOutWidth() || rLine.GetInWidth() || rLine.GetDistance() )
     991           0 :         return &rLine;
     992             :     else
     993           0 :         return NULL;
     994             : }
     995             : }
     996             : 
     997           0 : const ::editeng::SvxBorderLine* ScHelperFunctions::GetBorderLine(
     998             :         ::editeng::SvxBorderLine& rLine, const table::BorderLine& rStruct )
     999             : {
    1000           0 :     return lcl_getBorderLine( rLine, rStruct);
    1001             : }
    1002             : 
    1003           0 : const ::editeng::SvxBorderLine* ScHelperFunctions::GetBorderLine(
    1004             :         ::editeng::SvxBorderLine& rLine, const table::BorderLine2& rStruct )
    1005             : {
    1006           0 :     return lcl_getBorderLine( rLine, rStruct);
    1007             : }
    1008             : 
    1009             : 
    1010             : namespace {
    1011             : template<typename TableBorderType>
    1012           0 : void lcl_fillBoxItems( SvxBoxItem& rOuter, SvxBoxInfoItem& rInner, const TableBorderType& rBorder )
    1013             : {
    1014           0 :     ::editeng::SvxBorderLine aLine;
    1015           0 :     rOuter.SetDistance( (sal_uInt16)HMMToTwips( rBorder.Distance ) );
    1016           0 :     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.TopLine ),         BOX_LINE_TOP );
    1017           0 :     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.BottomLine ),      BOX_LINE_BOTTOM );
    1018           0 :     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.LeftLine ),        BOX_LINE_LEFT );
    1019           0 :     rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.RightLine ),       BOX_LINE_RIGHT );
    1020           0 :     rInner.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.HorizontalLine ),  BOXINFO_LINE_HORI );
    1021           0 :     rInner.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.VerticalLine ),    BOXINFO_LINE_VERT );
    1022           0 :     rInner.SetValid( VALID_TOP,      rBorder.IsTopLineValid );
    1023           0 :     rInner.SetValid( VALID_BOTTOM,   rBorder.IsBottomLineValid );
    1024           0 :     rInner.SetValid( VALID_LEFT,     rBorder.IsLeftLineValid );
    1025           0 :     rInner.SetValid( VALID_RIGHT,    rBorder.IsRightLineValid );
    1026           0 :     rInner.SetValid( VALID_HORI,     rBorder.IsHorizontalLineValid );
    1027           0 :     rInner.SetValid( VALID_VERT,     rBorder.IsVerticalLineValid );
    1028           0 :     rInner.SetValid( VALID_DISTANCE, rBorder.IsDistanceValid );
    1029           0 :     rInner.SetTable( sal_True );
    1030           0 : }
    1031             : }
    1032             : 
    1033           0 : void ScHelperFunctions::FillBoxItems( SvxBoxItem& rOuter, SvxBoxInfoItem& rInner, const table::TableBorder& rBorder )
    1034             : {
    1035           0 :     lcl_fillBoxItems( rOuter, rInner, rBorder);
    1036           0 : }
    1037             : 
    1038           0 : void ScHelperFunctions::FillBoxItems( SvxBoxItem& rOuter, SvxBoxInfoItem& rInner, const table::TableBorder2& rBorder )
    1039             : {
    1040           0 :     lcl_fillBoxItems( rOuter, rInner, rBorder);
    1041           0 : }
    1042             : 
    1043             : 
    1044           0 : void ScHelperFunctions::FillBorderLine( table::BorderLine& rStruct, const ::editeng::SvxBorderLine* pLine )
    1045             : {
    1046             :     // Convert from Twips to 1/100mm.
    1047           0 :     table::BorderLine2 aStruct( SvxBoxItem::SvxLineToLine( pLine, true));
    1048           0 :     rStruct = aStruct;
    1049           0 : }
    1050             : 
    1051           0 : void ScHelperFunctions::FillBorderLine( table::BorderLine2& rStruct, const ::editeng::SvxBorderLine* pLine )
    1052             : {
    1053           0 :     rStruct = SvxBoxItem::SvxLineToLine( pLine, true);
    1054           0 : }
    1055             : 
    1056             : 
    1057             : namespace {
    1058             : template<typename TableBorderItem>
    1059           0 : void lcl_fillTableBorder( TableBorderItem& rBorder, const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner,
    1060             :         bool bInvalidateHorVerDist )
    1061             : {
    1062           0 :     ScHelperFunctions::FillBorderLine( rBorder.TopLine,         rOuter.GetTop() );
    1063           0 :     ScHelperFunctions::FillBorderLine( rBorder.BottomLine,      rOuter.GetBottom() );
    1064           0 :     ScHelperFunctions::FillBorderLine( rBorder.LeftLine,        rOuter.GetLeft() );
    1065           0 :     ScHelperFunctions::FillBorderLine( rBorder.RightLine,       rOuter.GetRight() );
    1066           0 :     ScHelperFunctions::FillBorderLine( rBorder.HorizontalLine,  rInner.GetHori() );
    1067           0 :     ScHelperFunctions::FillBorderLine( rBorder.VerticalLine,    rInner.GetVert() );
    1068             : 
    1069           0 :     rBorder.Distance                = rOuter.GetDistance();
    1070           0 :     rBorder.IsTopLineValid          = rInner.IsValid(VALID_TOP);
    1071           0 :     rBorder.IsBottomLineValid       = rInner.IsValid(VALID_BOTTOM);
    1072           0 :     rBorder.IsLeftLineValid         = rInner.IsValid(VALID_LEFT);
    1073           0 :     rBorder.IsRightLineValid        = rInner.IsValid(VALID_RIGHT);
    1074           0 :     rBorder.IsHorizontalLineValid   = !bInvalidateHorVerDist && rInner.IsValid(VALID_HORI);
    1075           0 :     rBorder.IsVerticalLineValid     = !bInvalidateHorVerDist && rInner.IsValid(VALID_VERT);
    1076           0 :     rBorder.IsDistanceValid         = !bInvalidateHorVerDist && rInner.IsValid(VALID_DISTANCE);
    1077           0 : }
    1078             : }
    1079             : 
    1080           0 : void ScHelperFunctions::AssignTableBorderToAny( uno::Any& rAny,
    1081             :         const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner, bool bInvalidateHorVerDist )
    1082             : {
    1083           0 :     table::TableBorder aBorder;
    1084           0 :     lcl_fillTableBorder( aBorder, rOuter, rInner, bInvalidateHorVerDist);
    1085           0 :     rAny <<= aBorder;
    1086           0 : }
    1087             : 
    1088           0 : void ScHelperFunctions::AssignTableBorder2ToAny( uno::Any& rAny,
    1089             :         const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner, bool bInvalidateHorVerDist )
    1090             : {
    1091           0 :     table::TableBorder2 aBorder;
    1092           0 :     lcl_fillTableBorder( aBorder, rOuter, rInner, bInvalidateHorVerDist);
    1093           0 :     rAny <<= aBorder;
    1094           0 : }
    1095             : 
    1096             : //------------------------------------------------------------------------
    1097             : 
    1098             : //! lcl_ApplyBorder nach docfunc verschieben!
    1099             : 
    1100           0 : void ScHelperFunctions::ApplyBorder( ScDocShell* pDocShell, const ScRangeList& rRanges,
    1101             :                         const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner )
    1102             : {
    1103           0 :     ScDocument* pDoc = pDocShell->GetDocument();
    1104           0 :     sal_Bool bUndo(pDoc->IsUndoEnabled());
    1105           0 :     ScDocument* pUndoDoc = NULL;
    1106           0 :     if (bUndo)
    1107           0 :         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
    1108           0 :     size_t nCount = rRanges.size();
    1109           0 :     for (size_t i = 0; i < nCount; ++i)
    1110             :     {
    1111           0 :         ScRange aRange( *rRanges[ i ] );
    1112           0 :         SCTAB nTab = aRange.aStart.Tab();
    1113             : 
    1114           0 :         if (bUndo)
    1115             :         {
    1116           0 :             if ( i==0 )
    1117           0 :                 pUndoDoc->InitUndo( pDoc, nTab, nTab );
    1118             :             else
    1119           0 :                 pUndoDoc->AddUndoTab( nTab, nTab );
    1120           0 :             pDoc->CopyToDocument( aRange, IDF_ATTRIB, false, pUndoDoc );
    1121             :         }
    1122             : 
    1123           0 :         ScMarkData aMark;
    1124           0 :         aMark.SetMarkArea( aRange );
    1125           0 :         aMark.SelectTable( nTab, sal_True );
    1126             : 
    1127           0 :         pDoc->ApplySelectionFrame( aMark, &rOuter, &rInner );
    1128             :         // RowHeight bei Umrandung alleine nicht noetig
    1129           0 :     }
    1130             : 
    1131           0 :     if (bUndo)
    1132             :     {
    1133           0 :         pDocShell->GetUndoManager()->AddUndoAction(
    1134           0 :                 new ScUndoBorder( pDocShell, rRanges, pUndoDoc, rOuter, rInner ) );
    1135             :     }
    1136             : 
    1137           0 :     for (size_t i = 0; i < nCount; ++i )
    1138           0 :         pDocShell->PostPaint( *rRanges[ i ], PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
    1139             : 
    1140           0 :     pDocShell->SetDocumentModified();
    1141           0 : }
    1142             : 
    1143             : //! move lcl_PutDataArray to docfunc?
    1144             : //! merge loop with ScFunctionAccess::callFunction
    1145             : 
    1146           0 : static sal_Bool lcl_PutDataArray( ScDocShell& rDocShell, const ScRange& rRange,
    1147             :                         const uno::Sequence< uno::Sequence<uno::Any> >& aData )
    1148             : {
    1149           0 :     ScDocument* pDoc = rDocShell.GetDocument();
    1150           0 :     SCTAB nTab = rRange.aStart.Tab();
    1151           0 :     SCCOL nStartCol = rRange.aStart.Col();
    1152           0 :     SCROW nStartRow = rRange.aStart.Row();
    1153           0 :     SCCOL nEndCol = rRange.aEnd.Col();
    1154           0 :     SCROW nEndRow = rRange.aEnd.Row();
    1155           0 :     sal_Bool bUndo(pDoc->IsUndoEnabled());
    1156             : 
    1157           0 :     if ( !pDoc->IsBlockEditable( nTab, nStartCol,nStartRow, nEndCol,nEndRow ) )
    1158             :     {
    1159             :         //! error message
    1160           0 :         return false;
    1161             :     }
    1162             : 
    1163           0 :     long nCols = 0;
    1164           0 :     long nRows = aData.getLength();
    1165           0 :     const uno::Sequence<uno::Any>* pArray = aData.getConstArray();
    1166           0 :     if ( nRows )
    1167           0 :         nCols = pArray[0].getLength();
    1168             : 
    1169           0 :     if ( nCols != nEndCol-nStartCol+1 || nRows != nEndRow-nStartRow+1 )
    1170             :     {
    1171             :         //! error message?
    1172           0 :         return false;
    1173             :     }
    1174             : 
    1175           0 :     ScDocument* pUndoDoc = NULL;
    1176           0 :     if ( bUndo )
    1177             :     {
    1178           0 :         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
    1179           0 :         pUndoDoc->InitUndo( pDoc, nTab, nTab );
    1180           0 :         pDoc->CopyToDocument( rRange, IDF_CONTENTS|IDF_NOCAPTIONS, false, pUndoDoc );
    1181             :     }
    1182             : 
    1183           0 :     pDoc->DeleteAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, IDF_CONTENTS );
    1184             : 
    1185           0 :     sal_Bool bError = false;
    1186           0 :     SCROW nDocRow = nStartRow;
    1187           0 :     for (long nRow=0; nRow<nRows; nRow++)
    1188             :     {
    1189           0 :         const uno::Sequence<uno::Any>& rColSeq = pArray[nRow];
    1190           0 :         if ( rColSeq.getLength() == nCols )
    1191             :         {
    1192           0 :             SCCOL nDocCol = nStartCol;
    1193           0 :             const uno::Any* pColArr = rColSeq.getConstArray();
    1194           0 :             for (long nCol=0; nCol<nCols; nCol++)
    1195             :             {
    1196           0 :                 const uno::Any& rElement = pColArr[nCol];
    1197           0 :                 switch( rElement.getValueTypeClass() )
    1198             :                 {
    1199             :                     case uno::TypeClass_VOID:
    1200             :                     {
    1201             :                         // void = "no value"
    1202           0 :                         pDoc->SetError( nDocCol, nDocRow, nTab, NOTAVAILABLE );
    1203             :                     }
    1204           0 :                     break;
    1205             : 
    1206             :                     //  #87871# accept integer types because Basic passes a floating point
    1207             :                     //  variable as byte, short or long if it's an integer number.
    1208             :                     case uno::TypeClass_BYTE:
    1209             :                     case uno::TypeClass_SHORT:
    1210             :                     case uno::TypeClass_UNSIGNED_SHORT:
    1211             :                     case uno::TypeClass_LONG:
    1212             :                     case uno::TypeClass_UNSIGNED_LONG:
    1213             :                     case uno::TypeClass_FLOAT:
    1214             :                     case uno::TypeClass_DOUBLE:
    1215             :                     {
    1216           0 :                         double fVal(0.0);
    1217           0 :                         rElement >>= fVal;
    1218           0 :                         pDoc->SetValue( nDocCol, nDocRow, nTab, fVal );
    1219             :                     }
    1220           0 :                     break;
    1221             : 
    1222             :                     case uno::TypeClass_STRING:
    1223             :                     {
    1224           0 :                         rtl::OUString aUStr;
    1225           0 :                         rElement >>= aUStr;
    1226           0 :                         if ( !aUStr.isEmpty() )
    1227           0 :                             pDoc->PutCell( nDocCol, nDocRow, nTab, new ScStringCell( aUStr ) );
    1228             :                     }
    1229           0 :                     break;
    1230             : 
    1231             :                     // accept Sequence<FormulaToken> for formula cells
    1232             :                     case uno::TypeClass_SEQUENCE:
    1233             :                     {
    1234           0 :                         uno::Sequence< sheet::FormulaToken > aTokens;
    1235           0 :                         if ( rElement >>= aTokens )
    1236             :                         {
    1237           0 :                             ScTokenArray aTokenArray;
    1238           0 :                             ScTokenConversion::ConvertToTokenArray( *pDoc, aTokenArray, aTokens );
    1239           0 :                             ScAddress aPos( nDocCol, nDocRow, nTab );
    1240           0 :                             ScBaseCell* pNewCell = new ScFormulaCell( pDoc, aPos, &aTokenArray );
    1241           0 :                             pDoc->PutCell( aPos, pNewCell );
    1242             :                         }
    1243             :                         else
    1244           0 :                             bError = true;
    1245             :                     }
    1246           0 :                     break;
    1247             : 
    1248             :                     default:
    1249           0 :                         bError = true;      // invalid type
    1250             :                 }
    1251           0 :                 ++nDocCol;
    1252             :             }
    1253             :         }
    1254             :         else
    1255           0 :             bError = sal_True;                          // wrong size
    1256             : 
    1257           0 :         ++nDocRow;
    1258             :     }
    1259             : 
    1260           0 :     sal_Bool bHeight = rDocShell.AdjustRowHeight( nStartRow, nEndRow, nTab );
    1261             : 
    1262           0 :     if ( pUndoDoc )
    1263             :     {
    1264           0 :         ScMarkData aDestMark;
    1265           0 :         aDestMark.SelectOneTable( nTab );
    1266           0 :         rDocShell.GetUndoManager()->AddUndoAction(
    1267             :             new ScUndoPaste(
    1268             :                 &rDocShell, ScRange(nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab),
    1269           0 :                 aDestMark, pUndoDoc, NULL, IDF_CONTENTS, NULL, false));
    1270             :     }
    1271             : 
    1272           0 :     if (!bHeight)
    1273           0 :         rDocShell.PostPaint( rRange, PAINT_GRID );      // AdjustRowHeight may have painted already
    1274             : 
    1275           0 :     rDocShell.SetDocumentModified();
    1276             : 
    1277           0 :     return !bError;
    1278             : }
    1279             : 
    1280           0 : static sal_Bool lcl_PutFormulaArray( ScDocShell& rDocShell, const ScRange& rRange,
    1281             :         const uno::Sequence< uno::Sequence<rtl::OUString> >& aData,
    1282             :         const ::rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar )
    1283             : {
    1284           0 :     ScDocument* pDoc = rDocShell.GetDocument();
    1285           0 :     SCTAB nTab = rRange.aStart.Tab();
    1286           0 :     SCCOL nStartCol = rRange.aStart.Col();
    1287           0 :     SCROW nStartRow = rRange.aStart.Row();
    1288           0 :     SCCOL nEndCol = rRange.aEnd.Col();
    1289           0 :     SCROW nEndRow = rRange.aEnd.Row();
    1290           0 :     sal_Bool bUndo(pDoc->IsUndoEnabled());
    1291             : 
    1292           0 :     if ( !pDoc->IsBlockEditable( nTab, nStartCol,nStartRow, nEndCol,nEndRow ) )
    1293             :     {
    1294             :         //! error message
    1295           0 :         return false;
    1296             :     }
    1297             : 
    1298           0 :     long nCols = 0;
    1299           0 :     long nRows = aData.getLength();
    1300           0 :     const uno::Sequence<rtl::OUString>* pArray = aData.getConstArray();
    1301           0 :     if ( nRows )
    1302           0 :         nCols = pArray[0].getLength();
    1303             : 
    1304           0 :     if ( nCols != nEndCol-nStartCol+1 || nRows != nEndRow-nStartRow+1 )
    1305             :     {
    1306             :         //! error message?
    1307           0 :         return false;
    1308             :     }
    1309             : 
    1310           0 :     ScDocument* pUndoDoc = NULL;
    1311           0 :     if ( bUndo )
    1312             :     {
    1313           0 :         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
    1314           0 :         pUndoDoc->InitUndo( pDoc, nTab, nTab );
    1315           0 :         pDoc->CopyToDocument( rRange, IDF_CONTENTS, false, pUndoDoc );
    1316             :     }
    1317             : 
    1318           0 :     pDoc->DeleteAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, IDF_CONTENTS );
    1319             : 
    1320           0 :     sal_Bool bError = false;
    1321           0 :     SCROW nDocRow = nStartRow;
    1322           0 :     for (long nRow=0; nRow<nRows; nRow++)
    1323             :     {
    1324           0 :         const uno::Sequence<rtl::OUString>& rColSeq = pArray[nRow];
    1325           0 :         if ( rColSeq.getLength() == nCols )
    1326             :         {
    1327           0 :             SCCOL nDocCol = nStartCol;
    1328           0 :             const rtl::OUString* pColArr = rColSeq.getConstArray();
    1329           0 :             for (long nCol=0; nCol<nCols; nCol++)
    1330             :             {
    1331           0 :                 String aText(pColArr[nCol]);
    1332           0 :                 ScAddress aPos( nDocCol, nDocRow, nTab );
    1333           0 :                 ScBaseCell* pNewCell = rDocShell.GetDocFunc().InterpretEnglishString(
    1334           0 :                                                 aPos, aText, rFormulaNmsp, eGrammar );
    1335           0 :                 pDoc->PutCell( aPos, pNewCell );
    1336             : 
    1337           0 :                 ++nDocCol;
    1338           0 :             }
    1339             :         }
    1340             :         else
    1341           0 :             bError = sal_True;                          // wrong size
    1342             : 
    1343           0 :         ++nDocRow;
    1344             :     }
    1345             : 
    1346           0 :     sal_Bool bHeight = rDocShell.AdjustRowHeight( nStartRow, nEndRow, nTab );
    1347             : 
    1348           0 :     if ( pUndoDoc )
    1349             :     {
    1350           0 :         ScMarkData aDestMark;
    1351           0 :         aDestMark.SelectOneTable( nTab );
    1352           0 :         rDocShell.GetUndoManager()->AddUndoAction(
    1353             :             new ScUndoPaste( &rDocShell,
    1354             :                 ScRange(nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab), aDestMark,
    1355           0 :                 pUndoDoc, NULL, IDF_CONTENTS, NULL, false));
    1356             :     }
    1357             : 
    1358           0 :     if (!bHeight)
    1359           0 :         rDocShell.PostPaint( rRange, PAINT_GRID );      // AdjustRowHeight may have painted already
    1360             : 
    1361           0 :     rDocShell.SetDocumentModified();
    1362             : 
    1363           0 :     return !bError;
    1364             : }
    1365             : 
    1366             : //  used in ScCellRangeObj::getFormulaArray and ScCellObj::GetInputString_Impl
    1367           0 : static String lcl_GetInputString( ScDocument* pDoc, const ScAddress& rPosition, sal_Bool bEnglish )
    1368             : {
    1369           0 :     rtl::OUString aVal;
    1370           0 :     if ( pDoc )
    1371             :     {
    1372           0 :         ScBaseCell* pCell = pDoc->GetCell( rPosition );
    1373           0 :         if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE )
    1374             :         {
    1375           0 :             CellType eType = pCell->GetCellType();
    1376           0 :             if ( eType == CELLTYPE_FORMULA )
    1377             :             {
    1378           0 :                 ScFormulaCell* pForm = (ScFormulaCell*)pCell;
    1379           0 :                 pForm->GetFormula( aVal,formula::FormulaGrammar::mapAPItoGrammar( bEnglish, false));
    1380             :             }
    1381             :             else
    1382             :             {
    1383             :                 SvNumberFormatter* pFormatter = bEnglish ? ScGlobal::GetEnglishFormatter() :
    1384           0 :                                                             pDoc->GetFormatTable();
    1385             :                 // Since the English formatter was constructed with
    1386             :                 // LANGUAGE_ENGLISH_US the "General" format has index key 0,
    1387             :                 // we don't have to query.
    1388             :                 sal_uInt32 nNumFmt = bEnglish ?
    1389             :                         0 :
    1390           0 :                         pDoc->GetNumberFormat( rPosition );
    1391             : 
    1392           0 :                 if ( eType == CELLTYPE_EDIT )
    1393             :                 {
    1394             :                     //  GetString an der EditCell macht Leerzeichen aus Umbruechen,
    1395             :                     //  hier werden die Umbrueche aber gebraucht
    1396           0 :                     const EditTextObject* pData = ((ScEditCell*)pCell)->GetData();
    1397           0 :                     if (pData)
    1398             :                     {
    1399           0 :                         EditEngine& rEngine = pDoc->GetEditEngine();
    1400           0 :                         rEngine.SetText( *pData );
    1401           0 :                         aVal = rEngine.GetText( LINEEND_LF );
    1402             :                     }
    1403             :                 }
    1404             :                 else
    1405           0 :                     ScCellFormat::GetInputString( pCell, nNumFmt, aVal, *pFormatter );
    1406             : 
    1407             :                 //  ggf. ein ' davorhaengen wie in ScTabViewShell::UpdateInputHandler
    1408           0 :                 if ( eType == CELLTYPE_STRING || eType == CELLTYPE_EDIT )
    1409             :                 {
    1410             :                     double fDummy;
    1411           0 :                     String aTempString = aVal;
    1412           0 :                     sal_Bool bIsNumberFormat(pFormatter->IsNumberFormat(aTempString, nNumFmt, fDummy));
    1413           0 :                     if ( bIsNumberFormat )
    1414           0 :                         aTempString.Insert('\'',0);
    1415           0 :                     else if ( aTempString.Len() && aTempString.GetChar(0) == '\'' )
    1416             :                     {
    1417             :                         //  if the string starts with a "'", add another one because setFormula
    1418             :                         //  strips one (like text input, except for "text" number formats)
    1419           0 :                         if ( bEnglish || ( pFormatter->GetType(nNumFmt) != NUMBERFORMAT_TEXT ) )
    1420           0 :                             aTempString.Insert('\'',0);
    1421             :                     }
    1422           0 :                     aVal = aTempString;
    1423             :                 }
    1424             :             }
    1425             :         }
    1426             :     }
    1427           0 :     return aVal;
    1428             : }
    1429             : 
    1430             : //------------------------------------------------------------------------
    1431             : 
    1432        1798 : ScCellRangesBase::ScCellRangesBase(ScDocShell* pDocSh, const ScRange& rR) :
    1433        1798 :     pPropSet(lcl_GetCellsPropertySet()),
    1434             :     pDocShell( pDocSh ),
    1435             :     pValueListener( NULL ),
    1436             :     pCurrentFlat( NULL ),
    1437             :     pCurrentDeep( NULL ),
    1438             :     pCurrentDataSet( NULL ),
    1439             :     pNoDfltCurrentDataSet( NULL ),
    1440             :     pMarkData( NULL ),
    1441             :     nObjectId( 0 ),
    1442             :     bChartColAsHdr( false ),
    1443             :     bChartRowAsHdr( false ),
    1444             :     bCursorOnly( false ),
    1445             :     bGotDataChangedHint( false ),
    1446        3596 :     aValueListeners( 0 )
    1447             : {
    1448        1798 :     ScRange aCellRange(rR);
    1449        1798 :     aCellRange.Justify();
    1450        1798 :     aRanges.Append( aCellRange );
    1451             : 
    1452        1798 :     if (pDocShell)  // Null if created with createInstance
    1453             :     {
    1454        1798 :         ScDocument* pDoc = pDocShell->GetDocument();
    1455        1798 :         pDoc->AddUnoObject(*this);
    1456        1798 :         nObjectId = pDoc->GetNewUnoId();
    1457             :     }
    1458        1798 : }
    1459             : 
    1460         199 : ScCellRangesBase::ScCellRangesBase(ScDocShell* pDocSh, const ScRangeList& rR) :
    1461         199 :     pPropSet(lcl_GetCellsPropertySet()),
    1462             :     pDocShell( pDocSh ),
    1463             :     pValueListener( NULL ),
    1464             :     pCurrentFlat( NULL ),
    1465             :     pCurrentDeep( NULL ),
    1466             :     pCurrentDataSet( NULL ),
    1467             :     pNoDfltCurrentDataSet( NULL ),
    1468             :     pMarkData( NULL ),
    1469             :     aRanges( rR ),
    1470             :     nObjectId( 0 ),
    1471             :     bChartColAsHdr( false ),
    1472             :     bChartRowAsHdr( false ),
    1473             :     bCursorOnly( false ),
    1474             :     bGotDataChangedHint( false ),
    1475         398 :     aValueListeners( 0 )
    1476             : {
    1477         199 :     if (pDocShell)  // Null if created with createInstance
    1478             :     {
    1479         199 :         ScDocument* pDoc = pDocShell->GetDocument();
    1480         199 :         pDoc->AddUnoObject(*this);
    1481         199 :         nObjectId = pDoc->GetNewUnoId();
    1482             :     }
    1483         199 : }
    1484             : 
    1485        3986 : ScCellRangesBase::~ScCellRangesBase()
    1486             : {
    1487             :     //  call RemoveUnoObject first, so no notification can happen
    1488             :     //  during ForgetCurrentAttrs
    1489             : 
    1490        1993 :     if (pDocShell)
    1491        1993 :         pDocShell->GetDocument()->RemoveUnoObject(*this);
    1492             : 
    1493        1993 :     ForgetCurrentAttrs();
    1494        1993 :     ForgetMarkData();
    1495             : 
    1496        1993 :     delete pValueListener;
    1497             : 
    1498             :     //! XChartDataChangeEventListener abmelden ??
    1499             :     //! (ChartCollection haelt dann auch dieses Objekt fest!)
    1500        1993 : }
    1501             : 
    1502        5601 : void ScCellRangesBase::ForgetCurrentAttrs()
    1503             : {
    1504        5601 :     delete pCurrentFlat;
    1505        5601 :     delete pCurrentDeep;
    1506        5601 :     delete pCurrentDataSet;
    1507        5601 :     delete pNoDfltCurrentDataSet;
    1508        5601 :     pCurrentFlat = NULL;
    1509        5601 :     pCurrentDeep = NULL;
    1510        5601 :     pCurrentDataSet = NULL;
    1511        5601 :     pNoDfltCurrentDataSet = NULL;
    1512             : 
    1513             :     // #i62483# pMarkData can remain unchanged, is deleted only if the range changes (RefChanged)
    1514        5601 : }
    1515             : 
    1516        2460 : void ScCellRangesBase::ForgetMarkData()
    1517             : {
    1518        2460 :     delete pMarkData;
    1519        2460 :     pMarkData = NULL;
    1520        2460 : }
    1521             : 
    1522         152 : const ScPatternAttr* ScCellRangesBase::GetCurrentAttrsFlat()
    1523             : {
    1524             :     //  get and cache direct cell attributes for this object's range
    1525             : 
    1526         152 :     if ( !pCurrentFlat && pDocShell )
    1527             :     {
    1528           2 :         ScDocument* pDoc = pDocShell->GetDocument();
    1529           2 :         pCurrentFlat = pDoc->CreateSelectionPattern( *GetMarkData(), false );
    1530             :     }
    1531         152 :     return pCurrentFlat;
    1532             : }
    1533             : 
    1534         187 : const ScPatternAttr* ScCellRangesBase::GetCurrentAttrsDeep()
    1535             : {
    1536             :     //  get and cache cell attributes (incl. styles) for this object's range
    1537             : 
    1538         187 :     if ( !pCurrentDeep && pDocShell )
    1539             :     {
    1540         183 :         ScDocument* pDoc = pDocShell->GetDocument();
    1541         183 :         pCurrentDeep = pDoc->CreateSelectionPattern( *GetMarkData(), sal_True );
    1542             :     }
    1543         187 :     return pCurrentDeep;
    1544             : }
    1545             : 
    1546          39 : SfxItemSet* ScCellRangesBase::GetCurrentDataSet(bool bNoDflt)
    1547             : {
    1548          39 :     if(!pCurrentDataSet)
    1549             :     {
    1550          39 :         const ScPatternAttr* pPattern = GetCurrentAttrsDeep();
    1551          39 :         if ( pPattern )
    1552             :         {
    1553             :             //  Dontcare durch Default ersetzen, damit man immer eine Reflection hat
    1554          39 :             pCurrentDataSet = new SfxItemSet( pPattern->GetItemSet() );
    1555          39 :             pNoDfltCurrentDataSet = new SfxItemSet( pPattern->GetItemSet() );
    1556          39 :             pCurrentDataSet->ClearInvalidItems();
    1557             :         }
    1558             :     }
    1559          39 :     return bNoDflt ? pNoDfltCurrentDataSet : pCurrentDataSet;
    1560             : }
    1561             : 
    1562         587 : const ScMarkData* ScCellRangesBase::GetMarkData()
    1563             : {
    1564         587 :     if (!pMarkData)
    1565             :     {
    1566         231 :         pMarkData = new ScMarkData();
    1567         231 :         pMarkData->MarkFromRangeList( aRanges, false );
    1568             :     }
    1569         587 :     return pMarkData;
    1570             : }
    1571             : 
    1572        3141 : void ScCellRangesBase::Notify( SfxBroadcaster&, const SfxHint& rHint )
    1573             : {
    1574        3141 :     if ( rHint.ISA( ScUpdateRefHint ) )
    1575             :     {
    1576           0 :         const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
    1577             : 
    1578           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    1579           0 :         ScRangeList* pUndoRanges = NULL;
    1580           0 :         if ( pDoc->HasUnoRefUndo() )
    1581           0 :             pUndoRanges = new ScRangeList( aRanges );
    1582             : 
    1583           0 :         if ( aRanges.UpdateReference( rRef.GetMode(), pDoc, rRef.GetRange(),
    1584           0 :                                     rRef.GetDx(), rRef.GetDy(), rRef.GetDz() ) )
    1585             :         {
    1586             :             // i#90076; the object "this" was destroyed after calling ScTableSheetObj::getImplementation
    1587             :             // this hack make sure that the object lives a bit longer
    1588           0 :             uno::Reference<uno::XInterface> xInterface((cppu::OWeakObject*)this, uno::UNO_QUERY);
    1589           0 :             if (  rRef.GetMode() == URM_INSDEL
    1590           0 :                && aRanges.size() == 1
    1591           0 :                && ScTableSheetObj::getImplementation( xInterface )
    1592             :                )
    1593             :             {
    1594             :                 // #101755#; the range size of a sheet does not change
    1595           0 :                 ScRange* pR = aRanges.front();
    1596           0 :                 if (pR)
    1597             :                 {
    1598           0 :                     pR->aStart.SetCol(0);
    1599           0 :                     pR->aStart.SetRow(0);
    1600           0 :                     pR->aEnd.SetCol(MAXCOL);
    1601           0 :                     pR->aEnd.SetRow(MAXROW);
    1602             :                 }
    1603             :             }
    1604           0 :             RefChanged();
    1605             : 
    1606             :             // any change of the range address is broadcast to value (modify) listeners
    1607           0 :             if ( !aValueListeners.empty() )
    1608           0 :                 bGotDataChangedHint = sal_True;
    1609             : 
    1610           0 :             if ( pUndoRanges )
    1611           0 :                 pDoc->AddUnoRefChange( nObjectId, *pUndoRanges );
    1612             :         }
    1613             : 
    1614           0 :         delete pUndoRanges;
    1615             :     }
    1616        3141 :     else if ( rHint.ISA( SfxSimpleHint ) )
    1617             :     {
    1618        3141 :         sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
    1619        3141 :         if ( nId == SFX_HINT_DYING )
    1620             :         {
    1621           4 :             ForgetCurrentAttrs();
    1622           4 :             pDocShell = NULL;           // invalid
    1623             : 
    1624           4 :             if ( !aValueListeners.empty() )
    1625             :             {
    1626             :                 //  dispose listeners
    1627             : 
    1628           4 :                 lang::EventObject aEvent;
    1629           4 :                 aEvent.Source.set(static_cast<cppu::OWeakObject*>(this));
    1630           8 :                 for ( sal_uInt16 n=0; n<aValueListeners.size(); n++ )
    1631           4 :                     aValueListeners[n]->disposing( aEvent );
    1632             : 
    1633           4 :                 aValueListeners.clear();
    1634             : 
    1635             :                 //  The listeners can't have the last ref to this, as it's still held
    1636             :                 //  by the DocShell.
    1637             :             }
    1638             :         }
    1639        3137 :         else if ( nId == SFX_HINT_DATACHANGED )
    1640             :         {
    1641             :             // document content changed -> forget cached attributes
    1642        3137 :             ForgetCurrentAttrs();
    1643             : 
    1644        3137 :             if ( bGotDataChangedHint && pDocShell )
    1645             :             {
    1646             :                 //  This object was notified of content changes, so one call
    1647             :                 //  for each listener is generated now.
    1648             :                 //  The calls can't be executed directly because the document's
    1649             :                 //  UNO broadcaster list must not be modified.
    1650             :                 //  Instead, add to the document's list of listener calls,
    1651             :                 //  which will be executed directly after the broadcast of
    1652             :                 //  SFX_HINT_DATACHANGED.
    1653             : 
    1654           0 :                 lang::EventObject aEvent;
    1655           0 :                 aEvent.Source.set((cppu::OWeakObject*)this);
    1656             : 
    1657             :                 // the EventObject holds a Ref to this object until after the listener calls
    1658             : 
    1659           0 :                 ScDocument* pDoc = pDocShell->GetDocument();
    1660           0 :                 for ( sal_uInt16 n=0; n<aValueListeners.size(); n++ )
    1661           0 :                     pDoc->AddUnoListenerCall( aValueListeners[n], aEvent );
    1662             : 
    1663           0 :                 bGotDataChangedHint = false;
    1664             :             }
    1665             :         }
    1666           0 :         else if ( nId == SC_HINT_CALCALL )
    1667             :         {
    1668             :             // broadcast from DoHardRecalc - set bGotDataChangedHint
    1669             :             // (SFX_HINT_DATACHANGED follows separately)
    1670             : 
    1671           0 :             if ( !aValueListeners.empty() )
    1672           0 :                 bGotDataChangedHint = sal_True;
    1673             :         }
    1674             :     }
    1675           0 :     else if ( rHint.ISA( ScUnoRefUndoHint ) )
    1676             :     {
    1677           0 :         const ScUnoRefUndoHint& rUndoHint = static_cast<const ScUnoRefUndoHint&>(rHint);
    1678           0 :         if ( rUndoHint.GetObjectId() == nObjectId )
    1679             :         {
    1680             :             // restore ranges from hint
    1681             : 
    1682           0 :             aRanges = rUndoHint.GetRanges();
    1683             : 
    1684           0 :             RefChanged();
    1685           0 :             if ( !aValueListeners.empty() )
    1686           0 :                 bGotDataChangedHint = sal_True;     // need to broadcast the undo, too
    1687             :         }
    1688             :     }
    1689        3141 : }
    1690             : 
    1691         467 : void ScCellRangesBase::RefChanged()
    1692             : {
    1693             :     //! adjust XChartDataChangeEventListener
    1694             : 
    1695         467 :     if ( pValueListener && !aValueListeners.empty() )
    1696             :     {
    1697           0 :         pValueListener->EndListeningAll();
    1698             : 
    1699           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    1700           0 :         for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i )
    1701           0 :             pDoc->StartListeningArea( *aRanges[ i ], pValueListener );
    1702             :     }
    1703             : 
    1704         467 :     ForgetCurrentAttrs();
    1705         467 :     ForgetMarkData();
    1706         467 : }
    1707             : 
    1708           0 : ScDocument* ScCellRangesBase::GetDocument() const
    1709             : {
    1710           0 :     if (pDocShell)
    1711           0 :         return pDocShell->GetDocument();
    1712             :     else
    1713           0 :         return NULL;
    1714             : }
    1715             : 
    1716           0 : void ScCellRangesBase::InitInsertRange(ScDocShell* pDocSh, const ScRange& rR)
    1717             : {
    1718           0 :     if ( !pDocShell && pDocSh )
    1719             :     {
    1720           0 :         pDocShell = pDocSh;
    1721             : 
    1722           0 :         ScRange aCellRange(rR);
    1723           0 :         aCellRange.Justify();
    1724           0 :         aRanges.RemoveAll();
    1725           0 :         aRanges.Append( aCellRange );
    1726             : 
    1727           0 :         pDocShell->GetDocument()->AddUnoObject(*this);
    1728             : 
    1729           0 :         RefChanged();   // Range im Range-Objekt anpassen
    1730             :     }
    1731           0 : }
    1732             : 
    1733         461 : void ScCellRangesBase::AddRange(const ScRange& rRange, const sal_Bool bMergeRanges)
    1734             : {
    1735         461 :     if (bMergeRanges)
    1736           0 :         aRanges.Join(rRange);
    1737             :     else
    1738         461 :         aRanges.Append(rRange);
    1739         461 :     RefChanged();
    1740         461 : }
    1741             : 
    1742           6 : void ScCellRangesBase::SetNewRange(const ScRange& rNew)
    1743             : {
    1744           6 :     ScRange aCellRange(rNew);
    1745           6 :     aCellRange.Justify();
    1746             : 
    1747           6 :     aRanges.RemoveAll();
    1748           6 :     aRanges.Append( aCellRange );
    1749           6 :     RefChanged();
    1750           6 : }
    1751             : 
    1752           0 : void ScCellRangesBase::SetNewRanges(const ScRangeList& rNew)
    1753             : {
    1754           0 :     aRanges = rNew;
    1755           0 :     RefChanged();
    1756           0 : }
    1757             : 
    1758           0 : void ScCellRangesBase::SetCursorOnly( sal_Bool bSet )
    1759             : {
    1760             :     //  set for a selection object that is created from the cursor position
    1761             :     //  without anything selected (may contain several sheets)
    1762             : 
    1763           0 :     bCursorOnly = bSet;
    1764           0 : }
    1765             : 
    1766         814 : uno::Any SAL_CALL ScCellRangesBase::queryInterface( const uno::Type& rType )
    1767             :                                                 throw(uno::RuntimeException)
    1768             : {
    1769         814 :     SC_QUERYINTERFACE( beans::XPropertySet )
    1770         390 :     SC_QUERYINTERFACE( beans::XMultiPropertySet )
    1771         176 :     SC_QUERYINTERFACE( beans::XTolerantMultiPropertySet )
    1772          22 :     SC_QUERYINTERFACE( beans::XPropertyState )
    1773          22 :     SC_QUERYINTERFACE( sheet::XSheetOperation )
    1774          20 :     SC_QUERYINTERFACE( chart::XChartDataArray )
    1775          20 :     SC_QUERYINTERFACE( chart::XChartData )
    1776          20 :     SC_QUERYINTERFACE( util::XIndent )
    1777          20 :     SC_QUERYINTERFACE( sheet::XCellRangesQuery )
    1778          18 :     SC_QUERYINTERFACE( sheet::XFormulaQuery )
    1779          18 :     SC_QUERYINTERFACE( util::XReplaceable )
    1780          18 :     SC_QUERYINTERFACE( util::XSearchable )
    1781          18 :     SC_QUERYINTERFACE( util::XModifyBroadcaster )
    1782          14 :     SC_QUERYINTERFACE( lang::XServiceInfo )
    1783          14 :     SC_QUERYINTERFACE( lang::XUnoTunnel )
    1784          12 :     SC_QUERYINTERFACE( lang::XTypeProvider )
    1785             : 
    1786           4 :     return OWeakObject::queryInterface( rType );
    1787             : }
    1788             : 
    1789       10480 : void SAL_CALL ScCellRangesBase::acquire() throw()
    1790             : {
    1791       10480 :     OWeakObject::acquire();
    1792       10480 : }
    1793             : 
    1794       10476 : void SAL_CALL ScCellRangesBase::release() throw()
    1795             : {
    1796       10476 :     OWeakObject::release();
    1797       10476 : }
    1798             : 
    1799           0 : uno::Sequence<uno::Type> SAL_CALL ScCellRangesBase::getTypes() throw(uno::RuntimeException)
    1800             : {
    1801           0 :     static uno::Sequence<uno::Type> aTypes;
    1802           0 :     if ( aTypes.getLength() == 0 )
    1803             :     {
    1804           0 :         aTypes.realloc(13);
    1805           0 :         uno::Type* pPtr = aTypes.getArray();
    1806           0 :         pPtr[0] = getCppuType((const uno::Reference<beans::XPropertySet>*)0);
    1807           0 :         pPtr[1] = getCppuType((const uno::Reference<beans::XMultiPropertySet>*)0);
    1808           0 :         pPtr[2] = getCppuType((const uno::Reference<beans::XPropertyState>*)0);
    1809           0 :         pPtr[3] = getCppuType((const uno::Reference<sheet::XSheetOperation>*)0);
    1810           0 :         pPtr[4] = getCppuType((const uno::Reference<chart::XChartDataArray>*)0);
    1811           0 :         pPtr[5] = getCppuType((const uno::Reference<util::XIndent>*)0);
    1812           0 :         pPtr[6] = getCppuType((const uno::Reference<sheet::XCellRangesQuery>*)0);
    1813           0 :         pPtr[7] = getCppuType((const uno::Reference<sheet::XFormulaQuery>*)0);
    1814           0 :         pPtr[8] = getCppuType((const uno::Reference<util::XReplaceable>*)0);
    1815           0 :         pPtr[9] = getCppuType((const uno::Reference<util::XModifyBroadcaster>*)0);
    1816           0 :         pPtr[10]= getCppuType((const uno::Reference<lang::XServiceInfo>*)0);
    1817           0 :         pPtr[11]= getCppuType((const uno::Reference<lang::XUnoTunnel>*)0);
    1818           0 :         pPtr[12]= getCppuType((const uno::Reference<lang::XTypeProvider>*)0);
    1819             :     }
    1820           0 :     return aTypes;
    1821             : }
    1822             : 
    1823             : namespace
    1824             : {
    1825             :     class theScCellRangesBaseImplementationId : public rtl::Static< UnoTunnelIdInit, theScCellRangesBaseImplementationId > {};
    1826             : }
    1827             : 
    1828           0 : uno::Sequence<sal_Int8> SAL_CALL ScCellRangesBase::getImplementationId()
    1829             :                                                     throw(uno::RuntimeException)
    1830             : {
    1831           0 :     return theScCellRangesBaseImplementationId::get().getSeq();
    1832             : }
    1833             : 
    1834             : // ---
    1835             : 
    1836           0 : void ScCellRangesBase::PaintRanges_Impl( sal_uInt16 nPart )
    1837             : {
    1838           0 :     for (size_t i = 0, nCount = aRanges.size(); i < nCount; ++i)
    1839           0 :         pDocShell->PostPaint( *aRanges[ i ], nPart );
    1840           0 : }
    1841             : 
    1842             : // XSheetOperation
    1843             : 
    1844           2 : double SAL_CALL ScCellRangesBase::computeFunction( sheet::GeneralFunction nFunction )
    1845             :                                                 throw(uno::Exception, uno::RuntimeException)
    1846             : {
    1847           2 :     SolarMutexGuard aGuard;
    1848           2 :     ScMarkData aMark(*GetMarkData());
    1849           2 :     aMark.MarkToSimple();
    1850           2 :     if (!aMark.IsMarked())
    1851           2 :         aMark.SetMarkNegative(sal_True);    // um Dummy Position angeben zu koennen
    1852             : 
    1853           2 :     ScAddress aDummy;                   // wenn nicht Marked, ignoriert wegen Negative
    1854             :     double fVal;
    1855           2 :     ScSubTotalFunc eFunc = lcl_SummaryToSubTotal( nFunction );
    1856           2 :     ScDocument* pDoc = pDocShell->GetDocument();
    1857           2 :     if ( !pDoc->GetSelectionFunction( eFunc, aDummy, aMark, fVal ) )
    1858             :     {
    1859           0 :         throw uno::RuntimeException();      //! own exception?
    1860             :     }
    1861             : 
    1862           2 :     return fVal;
    1863             : }
    1864             : 
    1865           0 : void SAL_CALL ScCellRangesBase::clearContents( sal_Int32 nContentFlags ) throw(uno::RuntimeException)
    1866             : {
    1867           0 :     SolarMutexGuard aGuard;
    1868           0 :     if ( !aRanges.empty() )
    1869             :     {
    1870             :         // only for clearContents: EDITATTR is only used if no contents are deleted
    1871           0 :         sal_uInt16 nDelFlags = static_cast< sal_uInt16 >( nContentFlags & IDF_ALL );
    1872           0 :         if ( ( nContentFlags & IDF_EDITATTR ) && ( nContentFlags & IDF_CONTENTS ) == 0 )
    1873           0 :             nDelFlags |= IDF_EDITATTR;
    1874             : 
    1875           0 :         pDocShell->GetDocFunc().DeleteContents( *GetMarkData(), nDelFlags, sal_True, sal_True );
    1876           0 :     }
    1877             :     // sonst ist nichts zu tun
    1878           0 : }
    1879             : 
    1880             : // XPropertyState
    1881             : 
    1882         239 : const SfxItemPropertyMap& ScCellRangesBase::GetItemPropertyMap()
    1883             : {
    1884         239 :     return pPropSet->getPropertyMap();
    1885             : }
    1886             : 
    1887         174 : static void lcl_GetPropertyWhich( const SfxItemPropertySimpleEntry* pEntry,
    1888             :                                                 sal_uInt16& rItemWhich )
    1889             : {
    1890             :     //  Which-ID des betroffenen Items, auch wenn das Item die Property
    1891             :     //  nicht alleine behandeln kann
    1892         174 :     if ( pEntry )
    1893             :     {
    1894         174 :         if ( IsScItemWid( pEntry->nWID ) )
    1895         148 :             rItemWhich = pEntry->nWID;
    1896             :         else
    1897          26 :             switch ( pEntry->nWID )
    1898             :             {
    1899             :                 case SC_WID_UNO_TBLBORD:
    1900             :                 case SC_WID_UNO_TBLBORD2:
    1901           0 :                     rItemWhich = ATTR_BORDER;
    1902           0 :                     break;
    1903             :                 case SC_WID_UNO_CONDFMT:
    1904             :                 case SC_WID_UNO_CONDLOC:
    1905             :                 case SC_WID_UNO_CONDXML:
    1906           2 :                     rItemWhich = ATTR_CONDITIONAL;
    1907           2 :                     break;
    1908             :                 case SC_WID_UNO_VALIDAT:
    1909             :                 case SC_WID_UNO_VALILOC:
    1910             :                 case SC_WID_UNO_VALIXML:
    1911           2 :                     rItemWhich = ATTR_VALIDDATA;
    1912           2 :                     break;
    1913             :             }
    1914             :     }
    1915             : 
    1916         174 : }
    1917             : 
    1918         174 : beans::PropertyState ScCellRangesBase::GetOnePropertyState( sal_uInt16 nItemWhich, const SfxItemPropertySimpleEntry* pEntry )
    1919             : {
    1920         174 :     beans::PropertyState eRet = beans::PropertyState_DIRECT_VALUE;
    1921         174 :     if ( nItemWhich )                   // item wid (from map or special case)
    1922             :     {
    1923             :         //  For items that contain several properties (like background),
    1924             :         //  "ambiguous" is returned too often here
    1925             : 
    1926             :         //  for PropertyState, don't look at styles
    1927         152 :         const ScPatternAttr* pPattern = GetCurrentAttrsFlat();
    1928         152 :         if ( pPattern )
    1929             :         {
    1930         152 :             SfxItemState eState = pPattern->GetItemSet().GetItemState( nItemWhich, false );
    1931             : 
    1932         152 :             if ( nItemWhich == ATTR_VALUE_FORMAT && eState == SFX_ITEM_DEFAULT )
    1933           2 :                 eState = pPattern->GetItemSet().GetItemState( ATTR_LANGUAGE_FORMAT, false );
    1934             : 
    1935         152 :             if ( eState == SFX_ITEM_SET )
    1936           0 :                 eRet = beans::PropertyState_DIRECT_VALUE;
    1937         152 :             else if ( eState == SFX_ITEM_DEFAULT )
    1938         152 :                 eRet = beans::PropertyState_DEFAULT_VALUE;
    1939           0 :             else if ( eState == SFX_ITEM_DONTCARE )
    1940           0 :                 eRet = beans::PropertyState_AMBIGUOUS_VALUE;
    1941             :             else
    1942             :             {
    1943             :                 OSL_FAIL("unbekannter ItemState");
    1944             :             }
    1945             :         }
    1946             :     }
    1947          22 :     else if ( pEntry )
    1948             :     {
    1949          22 :         if ( pEntry->nWID == SC_WID_UNO_CHCOLHDR || pEntry->nWID == SC_WID_UNO_CHROWHDR || pEntry->nWID == SC_WID_UNO_ABSNAME )
    1950           0 :             eRet = beans::PropertyState_DIRECT_VALUE;
    1951          22 :         else if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
    1952             :         {
    1953             :             //  a style is always set, there's no default state
    1954           2 :             const ScStyleSheet* pStyle = pDocShell->GetDocument()->GetSelectionStyle(*GetMarkData());
    1955           2 :             if (pStyle)
    1956           2 :                 eRet = beans::PropertyState_DIRECT_VALUE;
    1957             :             else
    1958           0 :                 eRet = beans::PropertyState_AMBIGUOUS_VALUE;
    1959             :         }
    1960          20 :         else if ( pEntry->nWID == SC_WID_UNO_NUMRULES )
    1961           0 :             eRet = beans::PropertyState_DEFAULT_VALUE;      // numbering rules are always default
    1962             :     }
    1963         174 :     return eRet;
    1964             : }
    1965             : 
    1966           0 : beans::PropertyState SAL_CALL ScCellRangesBase::getPropertyState( const rtl::OUString& aPropertyName )
    1967             :                                 throw(beans::UnknownPropertyException, uno::RuntimeException)
    1968             : {
    1969           0 :     SolarMutexGuard aGuard;
    1970           0 :     if ( aRanges.empty() )
    1971           0 :         throw uno::RuntimeException();
    1972             : 
    1973           0 :     const SfxItemPropertyMap& rMap = GetItemPropertyMap();     // from derived class
    1974           0 :     sal_uInt16 nItemWhich = 0;
    1975           0 :     const SfxItemPropertySimpleEntry* pEntry  = rMap.getByName( aPropertyName );
    1976           0 :     lcl_GetPropertyWhich( pEntry, nItemWhich );
    1977           0 :     return GetOnePropertyState( nItemWhich, pEntry );
    1978             : }
    1979             : 
    1980           0 : uno::Sequence<beans::PropertyState> SAL_CALL ScCellRangesBase::getPropertyStates(
    1981             :                                 const uno::Sequence<rtl::OUString>& aPropertyNames )
    1982             :                             throw(beans::UnknownPropertyException, uno::RuntimeException)
    1983             : {
    1984           0 :     SolarMutexGuard aGuard;
    1985             : 
    1986           0 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    1987             : 
    1988           0 :     uno::Sequence<beans::PropertyState> aRet(aPropertyNames.getLength());
    1989           0 :     beans::PropertyState* pStates = aRet.getArray();
    1990           0 :     for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++)
    1991             :     {
    1992           0 :         sal_uInt16 nItemWhich = 0;
    1993           0 :         const SfxItemPropertySimpleEntry* pEntry  = rPropertyMap.getByName( aPropertyNames[i] );
    1994           0 :         lcl_GetPropertyWhich( pEntry, nItemWhich );
    1995           0 :         pStates[i] = GetOnePropertyState(nItemWhich, pEntry);
    1996             :     }
    1997           0 :     return aRet;
    1998             : }
    1999             : 
    2000           0 : void SAL_CALL ScCellRangesBase::setPropertyToDefault( const rtl::OUString& aPropertyName )
    2001             :                             throw(beans::UnknownPropertyException, uno::RuntimeException)
    2002             : {
    2003           0 :     SolarMutexGuard aGuard;
    2004           0 :     if ( pDocShell )
    2005             :     {
    2006           0 :         const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2007           0 :         sal_uInt16 nItemWhich = 0;
    2008           0 :         const SfxItemPropertySimpleEntry* pEntry  = rPropertyMap.getByName( aPropertyName );
    2009           0 :         lcl_GetPropertyWhich( pEntry, nItemWhich );
    2010           0 :         if ( nItemWhich )               // item wid (from map or special case)
    2011             :         {
    2012           0 :             if ( !aRanges.empty() )     // leer = nichts zu tun
    2013             :             {
    2014             :                 //! Bei Items, die mehrere Properties enthalten (z.B. Hintergrund)
    2015             :                 //! wird hier zuviel zurueckgesetzt
    2016             :                 //! for ATTR_ROTATE_VALUE, also reset ATTR_ORIENTATION?
    2017             : 
    2018             :                 sal_uInt16 aWIDs[3];
    2019           0 :                 aWIDs[0] = nItemWhich;
    2020           0 :                 if ( nItemWhich == ATTR_VALUE_FORMAT )
    2021             :                 {
    2022           0 :                     aWIDs[1] = ATTR_LANGUAGE_FORMAT; // language for number formats
    2023           0 :                     aWIDs[2] = 0;
    2024             :                 }
    2025             :                 else
    2026           0 :                     aWIDs[1] = 0;
    2027           0 :                 pDocShell->GetDocFunc().ClearItems( *GetMarkData(), aWIDs, sal_True );
    2028             :             }
    2029             :         }
    2030           0 :         else if ( pEntry )
    2031             :         {
    2032           0 :             if ( pEntry->nWID == SC_WID_UNO_CHCOLHDR )
    2033           0 :                 bChartColAsHdr = false;
    2034           0 :             else if ( pEntry->nWID == SC_WID_UNO_CHROWHDR )
    2035           0 :                 bChartRowAsHdr = false;
    2036           0 :             else if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
    2037             :             {
    2038           0 :                 String aStyleName( ScGlobal::GetRscString( STR_STYLENAME_STANDARD ) );
    2039           0 :                 pDocShell->GetDocFunc().ApplyStyle( *GetMarkData(), aStyleName, sal_True, sal_True );
    2040             :             }
    2041             :         }
    2042           0 :     }
    2043           0 : }
    2044             : 
    2045           0 : uno::Any SAL_CALL ScCellRangesBase::getPropertyDefault( const rtl::OUString& aPropertyName )
    2046             :                                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
    2047             :                                         uno::RuntimeException)
    2048             : {
    2049             :     //! mit getPropertyValue zusammenfassen
    2050             : 
    2051           0 :     SolarMutexGuard aGuard;
    2052           0 :     uno::Any aAny;
    2053             : 
    2054           0 :     if ( pDocShell )
    2055             :     {
    2056           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    2057           0 :         const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2058           0 :         const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyName );
    2059           0 :         if ( pEntry )
    2060             :         {
    2061           0 :             if ( IsScItemWid( pEntry->nWID ) )
    2062             :             {
    2063           0 :                 const ScPatternAttr* pPattern = pDoc->GetDefPattern();
    2064           0 :                 if ( pPattern )
    2065             :                 {
    2066           0 :                     const SfxItemSet& rSet = pPattern->GetItemSet();
    2067             : 
    2068           0 :                     switch ( pEntry->nWID )     // fuer Item-Spezial-Behandlungen
    2069             :                     {
    2070             :                         case ATTR_VALUE_FORMAT:
    2071             :                             //  default has no language set
    2072           0 :                             aAny <<= (sal_Int32)( ((const SfxUInt32Item&)rSet.Get(pEntry->nWID)).GetValue() );
    2073           0 :                             break;
    2074             :                         case ATTR_INDENT:
    2075             :                             aAny <<= (sal_Int16)( TwipsToHMM(((const SfxUInt16Item&)
    2076           0 :                                             rSet.Get(pEntry->nWID)).GetValue()) );
    2077           0 :                             break;
    2078             :                         default:
    2079           0 :                             pPropSet->getPropertyValue(aPropertyName, rSet, aAny);
    2080             :                     }
    2081             :                 }
    2082             :             }
    2083             :             else
    2084           0 :                 switch ( pEntry->nWID )
    2085             :                 {
    2086             :                     case SC_WID_UNO_CHCOLHDR:
    2087             :                     case SC_WID_UNO_CHROWHDR:
    2088           0 :                         ScUnoHelpFunctions::SetBoolInAny( aAny, false );
    2089           0 :                         break;
    2090             :                     case SC_WID_UNO_CELLSTYL:
    2091             :                         aAny <<= rtl::OUString( ScStyleNameConversion::DisplayToProgrammaticName(
    2092           0 :                                     ScGlobal::GetRscString(STR_STYLENAME_STANDARD), SFX_STYLE_FAMILY_PARA ) );
    2093           0 :                         break;
    2094             :                     case SC_WID_UNO_TBLBORD:
    2095             :                     case SC_WID_UNO_TBLBORD2:
    2096             :                         {
    2097           0 :                             const ScPatternAttr* pPattern = pDoc->GetDefPattern();
    2098           0 :                             if ( pPattern )
    2099             :                             {
    2100           0 :                                 if (pEntry->nWID == SC_WID_UNO_TBLBORD2)
    2101             :                                     ScHelperFunctions::AssignTableBorder2ToAny( aAny,
    2102           0 :                                             (const SvxBoxItem&)pPattern->GetItem(ATTR_BORDER),
    2103           0 :                                             (const SvxBoxInfoItem&)pPattern->GetItem(ATTR_BORDER_INNER) );
    2104             :                                 else
    2105             :                                     ScHelperFunctions::AssignTableBorderToAny( aAny,
    2106           0 :                                             (const SvxBoxItem&)pPattern->GetItem(ATTR_BORDER),
    2107           0 :                                             (const SvxBoxInfoItem&)pPattern->GetItem(ATTR_BORDER_INNER) );
    2108             :                             }
    2109             :                         }
    2110           0 :                         break;
    2111             :                     case SC_WID_UNO_CONDFMT:
    2112             :                     case SC_WID_UNO_CONDLOC:
    2113             :                     case SC_WID_UNO_CONDXML:
    2114             :                         {
    2115           0 :                             sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC );
    2116           0 :                             sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML );
    2117             :                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2118             :                                     pDoc->GetStorageGrammar() :
    2119           0 :                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2120             : 
    2121             :                             aAny <<= uno::Reference<sheet::XSheetConditionalEntries>(
    2122           0 :                                     new ScTableConditionalFormat( pDoc, 0, aRanges[0]->aStart.Tab(), eGrammar ));
    2123             :                         }
    2124           0 :                         break;
    2125             :                     case SC_WID_UNO_VALIDAT:
    2126             :                     case SC_WID_UNO_VALILOC:
    2127             :                     case SC_WID_UNO_VALIXML:
    2128             :                         {
    2129           0 :                             sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC );
    2130           0 :                             sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML );
    2131             :                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2132             :                                     pDoc->GetStorageGrammar() :
    2133           0 :                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2134             : 
    2135             :                             aAny <<= uno::Reference<beans::XPropertySet>(
    2136           0 :                                     new ScTableValidationObj( pDoc, 0, eGrammar ));
    2137             :                         }
    2138           0 :                         break;
    2139             :                     case SC_WID_UNO_NUMRULES:
    2140             :                         {
    2141           0 :                             aAny <<= uno::Reference<container::XIndexReplace>(ScStyleObj::CreateEmptyNumberingRules());
    2142             :                         }
    2143           0 :                         break;
    2144             :                 }
    2145             :         }
    2146             :     }
    2147             : 
    2148           0 :     return aAny;
    2149             : }
    2150             : 
    2151             : // XPropertySet
    2152             : 
    2153          23 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellRangesBase::getPropertySetInfo()
    2154             :                                                         throw(uno::RuntimeException)
    2155             : {
    2156          23 :     SolarMutexGuard aGuard;
    2157             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    2158          23 :         new SfxItemPropertySetInfo( pPropSet->getPropertyMap() ));
    2159          23 :     return aRef;
    2160             : }
    2161             : 
    2162         458 : static void lcl_SetCellProperty( const SfxItemPropertySimpleEntry& rEntry, const uno::Any& rValue,
    2163             :                             ScPatternAttr& rPattern, ScDocument* pDoc,
    2164             :                             sal_uInt16& rFirstItemId, sal_uInt16& rSecondItemId )
    2165             : {
    2166         458 :     rFirstItemId = rEntry.nWID;
    2167         458 :     rSecondItemId = 0;
    2168             : 
    2169         458 :     SfxItemSet& rSet = rPattern.GetItemSet();
    2170         458 :     switch ( rEntry.nWID )
    2171             :     {
    2172             :         case ATTR_VALUE_FORMAT:
    2173             :             {
    2174             :                 // language for number formats
    2175          27 :                 SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
    2176          27 :                 sal_uLong nOldFormat = ((const SfxUInt32Item&)rSet.Get( ATTR_VALUE_FORMAT )).GetValue();
    2177          27 :                 LanguageType eOldLang = ((const SvxLanguageItem&)rSet.Get( ATTR_LANGUAGE_FORMAT )).GetLanguage();
    2178          27 :                 nOldFormat = pFormatter->GetFormatForLanguageIfBuiltIn( nOldFormat, eOldLang );
    2179             : 
    2180          27 :                 sal_Int32 nIntVal = 0;
    2181          27 :                 if ( rValue >>= nIntVal )
    2182             :                 {
    2183          27 :                     sal_uLong nNewFormat = (sal_uLong)nIntVal;
    2184          27 :                     rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) );
    2185             : 
    2186          27 :                     const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewFormat );
    2187             :                     LanguageType eNewLang =
    2188          27 :                         pNewEntry ? pNewEntry->GetLanguage() : LANGUAGE_DONTKNOW;
    2189          27 :                     if ( eNewLang != eOldLang && eNewLang != LANGUAGE_DONTKNOW )
    2190             :                     {
    2191           6 :                         rSet.Put( SvxLanguageItem( eNewLang, ATTR_LANGUAGE_FORMAT ) );
    2192             : 
    2193             :                         // if only language is changed,
    2194             :                         // don't touch number format attribute
    2195           6 :                         sal_uLong nNewMod = nNewFormat % SV_COUNTRY_LANGUAGE_OFFSET;
    2196           6 :                         if ( nNewMod == ( nOldFormat % SV_COUNTRY_LANGUAGE_OFFSET ) &&
    2197             :                              nNewMod <= SV_MAX_ANZ_STANDARD_FORMATE )
    2198             :                         {
    2199           0 :                             rFirstItemId = 0;       // don't use ATTR_VALUE_FORMAT value
    2200             :                         }
    2201             : 
    2202           6 :                         rSecondItemId = ATTR_LANGUAGE_FORMAT;
    2203             :                     }
    2204             :                 }
    2205             :                 else
    2206           0 :                     throw lang::IllegalArgumentException();
    2207             :             }
    2208          27 :             break;
    2209             :         case ATTR_INDENT:
    2210             :             {
    2211           6 :                 sal_Int16 nIntVal = 0;
    2212           6 :                 if ( rValue >>= nIntVal )
    2213           6 :                     rSet.Put( SfxUInt16Item( rEntry.nWID, (sal_uInt16)HMMToTwips(nIntVal) ) );
    2214             :                 else
    2215           0 :                     throw lang::IllegalArgumentException();
    2216             :             }
    2217           6 :             break;
    2218             :         case ATTR_ROTATE_VALUE:
    2219             :             {
    2220           0 :                 sal_Int32 nRotVal = 0;
    2221           0 :                 if ( rValue >>= nRotVal )
    2222             :                 {
    2223             :                     //  stored value is always between 0 and 360 deg.
    2224           0 :                     nRotVal %= 36000;
    2225           0 :                     if ( nRotVal < 0 )
    2226           0 :                         nRotVal += 36000;
    2227             : 
    2228           0 :                     rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, nRotVal ) );
    2229             :                 }
    2230             :                 else
    2231           0 :                     throw lang::IllegalArgumentException();
    2232             :             }
    2233           0 :             break;
    2234             :         case ATTR_STACKED:
    2235             :             {
    2236             :                 table::CellOrientation eOrient;
    2237           0 :                 if( rValue >>= eOrient )
    2238             :                 {
    2239           0 :                     switch( eOrient )
    2240             :                     {
    2241             :                         case table::CellOrientation_STANDARD:
    2242           0 :                             rSet.Put( SfxBoolItem( ATTR_STACKED, false ) );
    2243           0 :                         break;
    2244             :                         case table::CellOrientation_TOPBOTTOM:
    2245           0 :                             rSet.Put( SfxBoolItem( ATTR_STACKED, false ) );
    2246           0 :                             rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 27000 ) );
    2247           0 :                             rSecondItemId = ATTR_ROTATE_VALUE;
    2248           0 :                         break;
    2249             :                         case table::CellOrientation_BOTTOMTOP:
    2250           0 :                             rSet.Put( SfxBoolItem( ATTR_STACKED, false ) );
    2251           0 :                             rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 9000 ) );
    2252           0 :                             rSecondItemId = ATTR_ROTATE_VALUE;
    2253           0 :                         break;
    2254             :                         case table::CellOrientation_STACKED:
    2255           0 :                             rSet.Put( SfxBoolItem( ATTR_STACKED, sal_True ) );
    2256           0 :                         break;
    2257             :                         default:
    2258             :                         {
    2259             :                             // added to avoid warnings
    2260             :                         }
    2261             :                     }
    2262             :                 }
    2263             :             }
    2264           0 :             break;
    2265             :         default:
    2266             :             {
    2267         425 :                 lcl_GetCellsPropertySet()->setPropertyValue(rEntry, rValue, rSet);
    2268             :             }
    2269             :     }
    2270         458 : }
    2271             : 
    2272         217 : void SAL_CALL ScCellRangesBase::setPropertyValue(
    2273             :                         const rtl::OUString& aPropertyName, const uno::Any& aValue )
    2274             :                 throw(beans::UnknownPropertyException, beans::PropertyVetoException,
    2275             :                         lang::IllegalArgumentException, lang::WrappedTargetException,
    2276             :                         uno::RuntimeException)
    2277             : {
    2278         217 :     SolarMutexGuard aGuard;
    2279             : 
    2280         217 :     if ( !pDocShell || aRanges.empty() )
    2281           0 :         throw uno::RuntimeException();
    2282             : 
    2283         217 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2284         217 :     const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyName );
    2285         217 :     if ( !pEntry )
    2286           0 :         throw beans::UnknownPropertyException();
    2287             : 
    2288         217 :     SetOnePropertyValue( pEntry, aValue );
    2289         217 : }
    2290             : 
    2291         252 : void ScCellRangesBase::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    2292             :                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
    2293             : {
    2294         252 :     if ( pEntry )
    2295             :     {
    2296         252 :         if ( IsScItemWid( pEntry->nWID ) )
    2297             :         {
    2298           4 :             if ( !aRanges.empty() )     // leer = nichts zu tun
    2299             :             {
    2300           4 :                 ScDocument* pDoc = pDocShell->GetDocument();
    2301             : 
    2302             :                 //  Fuer Teile von zusammengesetzten Items mit mehreren Properties (z.B. Hintergrund)
    2303             :                 //  muss vorher das alte Item aus dem Dokument geholt werden
    2304             :                 //! Das kann hier aber nicht erkannt werden
    2305             :                 //! -> eigenes Flag im PropertyMap-Eintrag, oder was ???
    2306             :                 //! Item direkt von einzelner Position im Bereich holen?
    2307             :                 //  ClearInvalidItems, damit auf jeden Fall ein Item vom richtigen Typ da ist
    2308             : 
    2309           4 :                 ScPatternAttr aPattern( *GetCurrentAttrsDeep() );
    2310           4 :                 SfxItemSet& rSet = aPattern.GetItemSet();
    2311           4 :                 rSet.ClearInvalidItems();
    2312             : 
    2313             :                 sal_uInt16 nFirstItem, nSecondItem;
    2314           4 :                 lcl_SetCellProperty( *pEntry, aValue, aPattern, pDoc, nFirstItem, nSecondItem );
    2315             : 
    2316         224 :                 for (sal_uInt16 nWhich = ATTR_PATTERN_START; nWhich <= ATTR_PATTERN_END; nWhich++)
    2317         220 :                     if ( nWhich != nFirstItem && nWhich != nSecondItem )
    2318         212 :                         rSet.ClearItem(nWhich);
    2319             : 
    2320           4 :                 pDocShell->GetDocFunc().ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True );
    2321             :             }
    2322             :         }
    2323             :         else        // implemented here
    2324         248 :             switch ( pEntry->nWID )
    2325             :             {
    2326             :                 case EE_CHAR_ESCAPEMENT:    // Specifically for xlsx import
    2327             :                     {
    2328           0 :                         sal_Int32 nValue(0);
    2329           0 :                         aValue >>= nValue;
    2330           0 :                         if( nValue )
    2331             :                         {
    2332           0 :                             size_t n = aRanges.size();
    2333           0 :                             for( size_t i = 0; i < n; i++ )
    2334             :                             {
    2335           0 :                                 ScRange aRange( *aRanges[ i ] );
    2336             :                                 /* TODO: Iterate through the range */
    2337           0 :                                 ScAddress  aAddr = aRange.aStart;
    2338           0 :                                 ScDocument *pDoc = pDocShell->GetDocument();
    2339           0 :                                 ScBaseCell *pCell = pDoc->GetCell( aAddr );
    2340           0 :                                 String aStr( pCell->GetStringData() );
    2341           0 :                                 EditEngine aEngine( pDoc->GetEnginePool() );
    2342             :                                 /* EE_CHAR_ESCAPEMENT seems to be set on the cell _only_ when
    2343             :                                  * there are no other attribs for the cell.
    2344             :                                  * So, it is safe to overwrite the complete attribute set.
    2345             :                                  * If there is a need - getting CellType and processing
    2346             :                                  * the attributes could be considered.
    2347             :                                  */
    2348           0 :                                 SfxItemSet aAttr = aEngine.GetEmptyItemSet();
    2349           0 :                                 aEngine.SetText( aStr );
    2350           0 :                                 if( nValue < 0 )    // Subscript
    2351           0 :                                     aAttr.Put( SvxEscapementItem( SVX_ESCAPEMENT_SUBSCRIPT, EE_CHAR_ESCAPEMENT ) );
    2352             :                                 else                // Superscript
    2353           0 :                                     aAttr.Put( SvxEscapementItem( SVX_ESCAPEMENT_SUPERSCRIPT, EE_CHAR_ESCAPEMENT ) );
    2354           0 :                                 aEngine.QuickSetAttribs( aAttr, ESelection( 0, 0, 0, aStr.Len()));
    2355           0 :                                 pDoc->PutCell( (aRanges[ 0 ])->aStart, new ScEditCell( aEngine.CreateTextObject(), pDoc, NULL ) );
    2356           0 :                             }
    2357             :                         }
    2358             :                     }
    2359           0 :                     break;
    2360             :                 case SC_WID_UNO_CHCOLHDR:
    2361             :                     // chart header flags are set for this object, not stored with document
    2362           0 :                     bChartColAsHdr = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    2363           0 :                     break;
    2364             :                 case SC_WID_UNO_CHROWHDR:
    2365           0 :                     bChartRowAsHdr = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    2366           0 :                     break;
    2367             :                 case SC_WID_UNO_CELLSTYL:
    2368             :                     {
    2369         248 :                         rtl::OUString aStrVal;
    2370         248 :                         aValue >>= aStrVal;
    2371             :                         String aString(ScStyleNameConversion::ProgrammaticToDisplayName(
    2372         248 :                                                             aStrVal, SFX_STYLE_FAMILY_PARA ));
    2373         248 :                         pDocShell->GetDocFunc().ApplyStyle( *GetMarkData(), aString, sal_True, sal_True );
    2374             :                     }
    2375         248 :                     break;
    2376             :                 case SC_WID_UNO_TBLBORD:
    2377             :                     {
    2378           0 :                         table::TableBorder aBorder;
    2379           0 :                         if ( !aRanges.empty() && ( aValue >>= aBorder ) )   // empty = nothing to do
    2380             :                         {
    2381           0 :                             SvxBoxItem aOuter(ATTR_BORDER);
    2382           0 :                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
    2383           0 :                             ScHelperFunctions::FillBoxItems( aOuter, aInner, aBorder );
    2384             : 
    2385           0 :                             ScHelperFunctions::ApplyBorder( pDocShell, aRanges, aOuter, aInner );   //! docfunc
    2386             :                         }
    2387             :                     }
    2388           0 :                     break;
    2389             :                 case SC_WID_UNO_TBLBORD2:
    2390             :                     {
    2391           0 :                         table::TableBorder2 aBorder2;
    2392           0 :                         if ( !aRanges.empty() && ( aValue >>= aBorder2 ) )   // empty = nothing to do
    2393             :                         {
    2394           0 :                             SvxBoxItem aOuter(ATTR_BORDER);
    2395           0 :                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
    2396           0 :                             ScHelperFunctions::FillBoxItems( aOuter, aInner, aBorder2 );
    2397             : 
    2398           0 :                             ScHelperFunctions::ApplyBorder( pDocShell, aRanges, aOuter, aInner );   //! docfunc
    2399             :                         }
    2400             :                     }
    2401           0 :                     break;
    2402             :                 case SC_WID_UNO_CONDFMT:
    2403             :                 case SC_WID_UNO_CONDLOC:
    2404             :                 case SC_WID_UNO_CONDXML:
    2405             :                     {
    2406           0 :                         uno::Reference<sheet::XSheetConditionalEntries> xInterface(aValue, uno::UNO_QUERY);
    2407           0 :                         if ( !aRanges.empty() && xInterface.is() )  // leer = nichts zu tun
    2408             :                         {
    2409             :                             ScTableConditionalFormat* pFormat =
    2410           0 :                                     ScTableConditionalFormat::getImplementation( xInterface );
    2411           0 :                             if (pFormat)
    2412             :                             {
    2413           0 :                                 ScDocument* pDoc = pDocShell->GetDocument();
    2414           0 :                                 sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC );
    2415           0 :                                 sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML );
    2416             :                                 formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2417             :                                        formula::FormulaGrammar::GRAM_UNSPECIFIED :
    2418           0 :                                        formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2419             : 
    2420           0 :                                 ScConditionalFormat* pNew = new ScConditionalFormat( 0, pDoc );    // Index wird beim Einfuegen gesetzt
    2421           0 :                                 pFormat->FillFormat( *pNew, pDoc, eGrammar );
    2422           0 :                                 pNew->AddRange( aRanges );
    2423           0 :                                 SCTAB nTab = aRanges.front()->aStart.Tab();
    2424           0 :                                 pDocShell->GetDocFunc().ReplaceConditionalFormat( 0, pNew, nTab, aRanges );
    2425             :                             }
    2426           0 :                         }
    2427             :                     }
    2428           0 :                     break;
    2429             :                 case SC_WID_UNO_VALIDAT:
    2430             :                 case SC_WID_UNO_VALILOC:
    2431             :                 case SC_WID_UNO_VALIXML:
    2432             :                     {
    2433           0 :                         uno::Reference<beans::XPropertySet> xInterface(aValue, uno::UNO_QUERY);
    2434           0 :                         if ( !aRanges.empty() && xInterface.is() )  // leer = nichts zu tun
    2435             :                         {
    2436             :                             ScTableValidationObj* pValidObj =
    2437           0 :                                     ScTableValidationObj::getImplementation( xInterface );
    2438           0 :                             if (pValidObj)
    2439             :                             {
    2440           0 :                                 ScDocument* pDoc = pDocShell->GetDocument();
    2441           0 :                                 sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC );
    2442           0 :                                 sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML );
    2443             :                                 formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2444             :                                        formula::FormulaGrammar::GRAM_UNSPECIFIED :
    2445           0 :                                        formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2446             : 
    2447             :                                 ScValidationData* pNewData =
    2448           0 :                                         pValidObj->CreateValidationData( pDoc, eGrammar );
    2449           0 :                                 sal_uLong nIndex = pDoc->AddValidationEntry( *pNewData );
    2450           0 :                                 delete pNewData;
    2451             : 
    2452           0 :                                 ScPatternAttr aPattern( pDoc->GetPool() );
    2453           0 :                                 aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALIDDATA, nIndex ) );
    2454           0 :                                 pDocShell->GetDocFunc().ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True );
    2455             :                             }
    2456           0 :                         }
    2457             :                     }
    2458           0 :                     break;
    2459             :                 // SC_WID_UNO_NUMRULES is ignored...
    2460             :             }
    2461             :     }
    2462         252 : }
    2463             : 
    2464          99 : uno::Any SAL_CALL ScCellRangesBase::getPropertyValue( const rtl::OUString& aPropertyName )
    2465             :                 throw(beans::UnknownPropertyException, lang::WrappedTargetException,
    2466             :                         uno::RuntimeException)
    2467             : {
    2468          99 :     SolarMutexGuard aGuard;
    2469             : 
    2470          99 :     if ( !pDocShell || aRanges.empty() )
    2471           0 :         throw uno::RuntimeException();
    2472             : 
    2473          99 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2474          99 :     const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyName );
    2475          99 :     if ( !pEntry )
    2476           0 :         throw beans::UnknownPropertyException();
    2477             : 
    2478          99 :     uno::Any aAny;
    2479          99 :     GetOnePropertyValue( pEntry, aAny );
    2480          99 :     return aAny;
    2481             : }
    2482             : 
    2483          41 : void ScCellRangesBase::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
    2484             :                                                 uno::Any& rAny )
    2485             :                                                 throw(uno::RuntimeException)
    2486             : {
    2487          41 :     if ( pEntry )
    2488             :     {
    2489          41 :         if ( IsScItemWid( pEntry->nWID ) )
    2490             :         {
    2491          39 :             SfxItemSet* pDataSet = GetCurrentDataSet();
    2492          39 :             if ( pDataSet )
    2493             :             {
    2494          39 :                 switch ( pEntry->nWID )     // fuer Item-Spezial-Behandlungen
    2495             :                 {
    2496             :                     case ATTR_VALUE_FORMAT:
    2497             :                         {
    2498          39 :                             ScDocument* pDoc = pDocShell->GetDocument();
    2499             : 
    2500             :                             sal_uLong nOldFormat = ((const SfxUInt32Item&)
    2501          39 :                                     pDataSet->Get( ATTR_VALUE_FORMAT )).GetValue();
    2502             :                             LanguageType eOldLang = ((const SvxLanguageItem&)
    2503          39 :                                     pDataSet->Get( ATTR_LANGUAGE_FORMAT )).GetLanguage();
    2504             :                             nOldFormat = pDoc->GetFormatTable()->
    2505          39 :                                     GetFormatForLanguageIfBuiltIn( nOldFormat, eOldLang );
    2506          39 :                             rAny <<= (sal_Int32)( nOldFormat );
    2507             :                         }
    2508          39 :                         break;
    2509             :                     case ATTR_INDENT:
    2510             :                         rAny <<= (sal_Int16)( TwipsToHMM(((const SfxUInt16Item&)
    2511           0 :                                         pDataSet->Get(pEntry->nWID)).GetValue()) );
    2512           0 :                         break;
    2513             :                     case ATTR_STACKED:
    2514             :                         {
    2515           0 :                             sal_Int32 nRot = ((const SfxInt32Item&)pDataSet->Get(ATTR_ROTATE_VALUE)).GetValue();
    2516           0 :                             sal_Bool bStacked = ((const SfxBoolItem&)pDataSet->Get(pEntry->nWID)).GetValue();
    2517           0 :                             SvxOrientationItem( nRot, bStacked, 0 ).QueryValue( rAny );
    2518             :                         }
    2519           0 :                         break;
    2520             :                     default:
    2521           0 :                         pPropSet->getPropertyValue(*pEntry, *pDataSet, rAny);
    2522             :                 }
    2523             :             }
    2524             :         }
    2525             :         else        // implemented here
    2526           2 :             switch ( pEntry->nWID )
    2527             :             {
    2528             :                 case SC_WID_UNO_CHCOLHDR:
    2529           0 :                     ScUnoHelpFunctions::SetBoolInAny( rAny, bChartColAsHdr );
    2530           0 :                     break;
    2531             :                 case SC_WID_UNO_CHROWHDR:
    2532           0 :                     ScUnoHelpFunctions::SetBoolInAny( rAny, bChartRowAsHdr );
    2533           0 :                     break;
    2534             :                 case SC_WID_UNO_CELLSTYL:
    2535             :                     {
    2536           2 :                         String aStyleName;
    2537           2 :                         const ScStyleSheet* pStyle = pDocShell->GetDocument()->GetSelectionStyle(*GetMarkData());
    2538           2 :                         if (pStyle)
    2539           2 :                             aStyleName = pStyle->GetName();
    2540             :                         rAny <<= rtl::OUString( ScStyleNameConversion::DisplayToProgrammaticName(
    2541           2 :                                                                 aStyleName, SFX_STYLE_FAMILY_PARA ) );
    2542             :                     }
    2543           2 :                     break;
    2544             :                 case SC_WID_UNO_TBLBORD:
    2545             :                 case SC_WID_UNO_TBLBORD2:
    2546             :                     {
    2547             :                         //! loop throgh all ranges
    2548           0 :                         if ( !aRanges.empty() )
    2549             :                         {
    2550           0 :                             const ScRange* pFirst = aRanges[ 0 ];
    2551           0 :                             SvxBoxItem aOuter(ATTR_BORDER);
    2552           0 :                             SvxBoxInfoItem aInner(ATTR_BORDER_INNER);
    2553             : 
    2554           0 :                             ScDocument* pDoc = pDocShell->GetDocument();
    2555           0 :                             ScMarkData aMark;
    2556           0 :                             aMark.SetMarkArea( *pFirst );
    2557           0 :                             aMark.SelectTable( pFirst->aStart.Tab(), sal_True );
    2558           0 :                             pDoc->GetSelectionFrame( aMark, aOuter, aInner );
    2559             : 
    2560           0 :                             if (pEntry->nWID == SC_WID_UNO_TBLBORD2)
    2561           0 :                                 ScHelperFunctions::AssignTableBorder2ToAny( rAny, aOuter, aInner);
    2562             :                             else
    2563           0 :                                 ScHelperFunctions::AssignTableBorderToAny( rAny, aOuter, aInner);
    2564             :                         }
    2565             :                     }
    2566           0 :                     break;
    2567             :                 case SC_WID_UNO_CONDFMT:
    2568             :                 case SC_WID_UNO_CONDLOC:
    2569             :                 case SC_WID_UNO_CONDXML:
    2570             :                     {
    2571           0 :                         const ScPatternAttr* pPattern = GetCurrentAttrsDeep();
    2572           0 :                         if ( pPattern )
    2573             :                         {
    2574           0 :                             ScDocument* pDoc = pDocShell->GetDocument();
    2575           0 :                             sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC );
    2576           0 :                             sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML );
    2577             :                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2578             :                                     pDoc->GetStorageGrammar() :
    2579           0 :                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2580             :                             const std::vector<sal_uInt32>& rIndex = ((const ScCondFormatItem&)
    2581           0 :                                     pPattern->GetItem(ATTR_CONDITIONAL)).GetCondFormatData();
    2582           0 :                             sal_uLong nIndex = 0;
    2583           0 :                             if(!rIndex.empty())
    2584           0 :                                 nIndex = rIndex[0];
    2585             :                             rAny <<= uno::Reference<sheet::XSheetConditionalEntries>(
    2586           0 :                                     new ScTableConditionalFormat( pDoc, nIndex, aRanges.front()->aStart.Tab(), eGrammar ));
    2587             :                         }
    2588             :                     }
    2589           0 :                     break;
    2590             :                 case SC_WID_UNO_VALIDAT:
    2591             :                 case SC_WID_UNO_VALILOC:
    2592             :                 case SC_WID_UNO_VALIXML:
    2593             :                     {
    2594           0 :                         const ScPatternAttr* pPattern = GetCurrentAttrsDeep();
    2595           0 :                         if ( pPattern )
    2596             :                         {
    2597           0 :                             ScDocument* pDoc = pDocShell->GetDocument();
    2598           0 :                             sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC );
    2599           0 :                             sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML );
    2600             :                             formula::FormulaGrammar::Grammar eGrammar = (bXML ?
    2601             :                                     pDoc->GetStorageGrammar() :
    2602           0 :                                    formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML));
    2603             :                             sal_uLong nIndex = ((const SfxUInt32Item&)
    2604           0 :                                     pPattern->GetItem(ATTR_VALIDDATA)).GetValue();
    2605             :                             rAny <<= uno::Reference<beans::XPropertySet>(
    2606           0 :                                     new ScTableValidationObj( pDoc, nIndex, eGrammar ));
    2607             :                         }
    2608             :                     }
    2609           0 :                     break;
    2610             :                 case SC_WID_UNO_NUMRULES:
    2611             :                     {
    2612             :                         // always return empty numbering rules object
    2613           0 :                         rAny <<= uno::Reference<container::XIndexReplace>(ScStyleObj::CreateEmptyNumberingRules());
    2614             :                     }
    2615           0 :                     break;
    2616             :                 case SC_WID_UNO_ABSNAME:
    2617             :                     {
    2618           0 :                         String sRet;
    2619           0 :                         aRanges.Format(sRet, SCR_ABS_3D, pDocShell->GetDocument());
    2620           0 :                         rAny <<= rtl::OUString(sRet);
    2621             :                     }
    2622             :             }
    2623             :     }
    2624          41 : }
    2625             : 
    2626           0 : void SAL_CALL ScCellRangesBase::addPropertyChangeListener( const rtl::OUString& /* aPropertyName */,
    2627             :                             const uno::Reference<beans::XPropertyChangeListener>& /* aListener */)
    2628             :                             throw(beans::UnknownPropertyException,
    2629             :                                     lang::WrappedTargetException, uno::RuntimeException)
    2630             : {
    2631           0 :     SolarMutexGuard aGuard;
    2632           0 :     if ( aRanges.empty() )
    2633           0 :         throw uno::RuntimeException();
    2634             : 
    2635           0 :     OSL_FAIL("not implemented");
    2636           0 : }
    2637             : 
    2638           0 : void SAL_CALL ScCellRangesBase::removePropertyChangeListener( const rtl::OUString& /* aPropertyName */,
    2639             :                             const uno::Reference<beans::XPropertyChangeListener>& /* aListener */)
    2640             :                             throw(beans::UnknownPropertyException,
    2641             :                                     lang::WrappedTargetException, uno::RuntimeException)
    2642             : {
    2643           0 :     SolarMutexGuard aGuard;
    2644           0 :     if ( aRanges.empty() )
    2645           0 :         throw uno::RuntimeException();
    2646             : 
    2647           0 :     OSL_FAIL("not implemented");
    2648           0 : }
    2649             : 
    2650           0 : void SAL_CALL ScCellRangesBase::addVetoableChangeListener( const rtl::OUString&,
    2651             :                             const uno::Reference<beans::XVetoableChangeListener>&)
    2652             :                             throw(beans::UnknownPropertyException,
    2653             :                                 lang::WrappedTargetException, uno::RuntimeException)
    2654             : {
    2655             :     OSL_FAIL("not implemented");
    2656           0 : }
    2657             : 
    2658           0 : void SAL_CALL ScCellRangesBase::removeVetoableChangeListener( const rtl::OUString&,
    2659             :                             const uno::Reference<beans::XVetoableChangeListener>&)
    2660             :                             throw(beans::UnknownPropertyException,
    2661             :                                 lang::WrappedTargetException, uno::RuntimeException)
    2662             : {
    2663             :     OSL_FAIL("not implemented");
    2664           0 : }
    2665             : 
    2666             : // XMultiPropertySet
    2667             : 
    2668          50 : void SAL_CALL ScCellRangesBase::setPropertyValues( const uno::Sequence< rtl::OUString >& aPropertyNames,
    2669             :                                     const uno::Sequence< uno::Any >& aValues )
    2670             :                                 throw (beans::PropertyVetoException,
    2671             :                                     lang::IllegalArgumentException,
    2672             :                                     lang::WrappedTargetException,
    2673             :                                     uno::RuntimeException)
    2674             : {
    2675          50 :     SolarMutexGuard aGuard;
    2676             : 
    2677          50 :     sal_Int32 nCount(aPropertyNames.getLength());
    2678          50 :     sal_Int32 nValues(aValues.getLength());
    2679          50 :     if (nCount != nValues)
    2680           0 :         throw lang::IllegalArgumentException();
    2681             : 
    2682          50 :     if ( pDocShell && nCount )
    2683             :     {
    2684          50 :         const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();      // from derived class
    2685          50 :         const rtl::OUString* pNames = aPropertyNames.getConstArray();
    2686          50 :         const uno::Any* pValues = aValues.getConstArray();
    2687             : 
    2688          50 :         const SfxItemPropertySimpleEntry** pEntryArray = new const SfxItemPropertySimpleEntry*[nCount];
    2689             : 
    2690             :         sal_Int32 i;
    2691         164 :         for(i = 0; i < nCount; i++)
    2692             :         {
    2693             :             // first loop: find all properties in map, but handle only CellStyle
    2694             :             // (CellStyle must be set before any other cell properties)
    2695             : 
    2696         114 :             const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( pNames[i] );
    2697         114 :             pEntryArray[i] = pEntry;
    2698         114 :             if (pEntry)
    2699             :             {
    2700         114 :                 if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
    2701             :                 {
    2702             :                     try
    2703             :                     {
    2704          50 :                         SetOnePropertyValue( pEntry, pValues[i] );
    2705             :                     }
    2706           0 :                     catch ( lang::IllegalArgumentException& )
    2707             :                     {
    2708             :                         OSL_FAIL("exception when setting cell style");     // not supposed to happen
    2709             :                     }
    2710             :                 }
    2711             :             }
    2712             :         }
    2713             : 
    2714          50 :         ScDocument* pDoc = pDocShell->GetDocument();
    2715          50 :         ScPatternAttr* pOldPattern = NULL;
    2716          50 :         ScPatternAttr* pNewPattern = NULL;
    2717             : 
    2718         164 :         for(i = 0; i < nCount; i++)
    2719             :         {
    2720             :             // second loop: handle other properties
    2721             : 
    2722         114 :             const SfxItemPropertySimpleEntry* pEntry = pEntryArray[i];
    2723         114 :             if ( pEntry )
    2724             :             {
    2725         114 :                 if ( IsScItemWid( pEntry->nWID ) )  // can be handled by SfxItemPropertySet
    2726             :                 {
    2727          64 :                     if ( !pOldPattern )
    2728             :                     {
    2729          50 :                         pOldPattern = new ScPatternAttr( *GetCurrentAttrsDeep() );
    2730          50 :                         pOldPattern->GetItemSet().ClearInvalidItems();
    2731          50 :                         pNewPattern = new ScPatternAttr( pDoc->GetPool() );
    2732             :                     }
    2733             : 
    2734             :                     //  collect items in pNewPattern, apply with one call after the loop
    2735             : 
    2736             :                     sal_uInt16 nFirstItem, nSecondItem;
    2737          64 :                     lcl_SetCellProperty( *pEntry, pValues[i], *pOldPattern, pDoc, nFirstItem, nSecondItem );
    2738             : 
    2739             :                     //  put only affected items into new set
    2740          64 :                     if ( nFirstItem )
    2741          64 :                         pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nFirstItem ) );
    2742          64 :                     if ( nSecondItem )
    2743           0 :                         pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nSecondItem ) );
    2744             :                 }
    2745          50 :                 else if ( pEntry->nWID != SC_WID_UNO_CELLSTYL )   // CellStyle is handled above
    2746             :                 {
    2747             :                     //  call virtual method to set a single property
    2748           0 :                     SetOnePropertyValue( pEntry, pValues[i] );
    2749             :                 }
    2750             :             }
    2751             :         }
    2752             : 
    2753          50 :         if ( pNewPattern && !aRanges.empty() )
    2754          50 :             pDocShell->GetDocFunc().ApplyAttributes( *GetMarkData(), *pNewPattern, sal_True, sal_True );
    2755             : 
    2756          50 :         delete pNewPattern;
    2757          50 :         delete pOldPattern;
    2758          50 :         delete[] pEntryArray;
    2759          50 :     }
    2760          50 : }
    2761             : 
    2762           0 : uno::Sequence<uno::Any> SAL_CALL ScCellRangesBase::getPropertyValues(
    2763             :                                 const uno::Sequence< rtl::OUString >& aPropertyNames )
    2764             :                                     throw (uno::RuntimeException)
    2765             : {
    2766           0 :     SolarMutexGuard aGuard;
    2767             : 
    2768           0 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2769             : 
    2770           0 :     uno::Sequence<uno::Any> aRet(aPropertyNames.getLength());
    2771           0 :     uno::Any* pProperties = aRet.getArray();
    2772           0 :     for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++)
    2773             :     {
    2774           0 :         const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyNames[i] );
    2775           0 :         GetOnePropertyValue( pEntry, pProperties[i] );
    2776             :     }
    2777           0 :     return aRet;
    2778             : }
    2779             : 
    2780           0 : void SAL_CALL ScCellRangesBase::addPropertiesChangeListener( const uno::Sequence< rtl::OUString >& /* aPropertyNames */,
    2781             :                                     const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ )
    2782             :                                 throw (uno::RuntimeException)
    2783             : {
    2784             :     OSL_FAIL("not implemented");
    2785           0 : }
    2786             : 
    2787           0 : void SAL_CALL ScCellRangesBase::removePropertiesChangeListener( const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ )
    2788             :                                 throw (uno::RuntimeException)
    2789             : {
    2790             :     OSL_FAIL("not implemented");
    2791           0 : }
    2792             : 
    2793           0 : void SAL_CALL ScCellRangesBase::firePropertiesChangeEvent( const uno::Sequence< rtl::OUString >& /* aPropertyNames */,
    2794             :                                     const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ )
    2795             :                                 throw (uno::RuntimeException)
    2796             : {
    2797             :     OSL_FAIL("not implemented");
    2798           0 : }
    2799             : 
    2800           8 : IMPL_LINK( ScCellRangesBase, ValueListenerHdl, SfxHint*, pHint )
    2801             : {
    2802           8 :     if ( pDocShell && pHint && pHint->ISA( SfxSimpleHint ) &&
    2803           4 :             ((const SfxSimpleHint*)pHint)->GetId() & (SC_HINT_DATACHANGED | SC_HINT_DYING) )
    2804             :     {
    2805             :         //  This may be called several times for a single change, if several formulas
    2806             :         //  in the range are notified. So only a flag is set that is checked when
    2807             :         //  SFX_HINT_DATACHANGED is received.
    2808             : 
    2809           4 :         bGotDataChangedHint = sal_True;
    2810             :     }
    2811           4 :     return 0;
    2812             : }
    2813             : 
    2814             : // XTolerantMultiPropertySet
    2815         146 : uno::Sequence< beans::SetPropertyTolerantFailed > SAL_CALL ScCellRangesBase::setPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames,
    2816             :                                     const uno::Sequence< uno::Any >& aValues )
    2817             :                                     throw (lang::IllegalArgumentException, uno::RuntimeException)
    2818             : {
    2819         146 :     SolarMutexGuard aGuard;
    2820             : 
    2821         146 :     sal_Int32 nCount(aPropertyNames.getLength());
    2822         146 :     sal_Int32 nValues(aValues.getLength());
    2823         146 :     if (nCount != nValues)
    2824           0 :         throw lang::IllegalArgumentException();
    2825             : 
    2826         146 :     if ( pDocShell && nCount )
    2827             :     {
    2828         146 :         uno::Sequence < beans::SetPropertyTolerantFailed > aReturns(nCount);
    2829         146 :         beans::SetPropertyTolerantFailed* pReturns = aReturns.getArray();
    2830             : 
    2831         146 :         const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2832         146 :         const rtl::OUString* pNames = aPropertyNames.getConstArray();
    2833         146 :         const uno::Any* pValues = aValues.getConstArray();
    2834             : 
    2835         146 :         const SfxItemPropertySimpleEntry** pMapArray = new const SfxItemPropertySimpleEntry*[nCount];
    2836             : 
    2837             :         sal_Int32 i;
    2838         824 :         for(i = 0; i < nCount; i++)
    2839             :         {
    2840             :             // first loop: find all properties in map, but handle only CellStyle
    2841             :             // (CellStyle must be set before any other cell properties)
    2842             : 
    2843         678 :             const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( pNames[i] );
    2844         678 :             pMapArray[i] = pEntry;
    2845         678 :             if (pEntry)
    2846             :             {
    2847         636 :                 if ( pEntry->nWID == SC_WID_UNO_CELLSTYL )
    2848             :                 {
    2849             :                     try
    2850             :                     {
    2851          96 :                         SetOnePropertyValue( pEntry, pValues[i] );
    2852             :                     }
    2853           0 :                     catch ( lang::IllegalArgumentException& )
    2854             :                     {
    2855             :                         OSL_FAIL("exception when setting cell style");     // not supposed to happen
    2856             :                     }
    2857             :                 }
    2858             :             }
    2859             :         }
    2860             : 
    2861         146 :         ScDocument* pDoc = pDocShell->GetDocument();
    2862         146 :         ScPatternAttr* pOldPattern = NULL;
    2863         146 :         ScPatternAttr* pNewPattern = NULL;
    2864             : 
    2865         146 :         sal_Int32 nFailed(0);
    2866         824 :         for(i = 0; i < nCount; i++)
    2867             :         {
    2868             :             // second loop: handle other properties
    2869             : 
    2870         678 :             const SfxItemPropertySimpleEntry* pEntry = pMapArray[i];
    2871         678 :             if ( pEntry && ((pEntry->nFlags & beans::PropertyAttribute::READONLY) == 0))
    2872             :             {
    2873         636 :                 if ( IsScItemWid( pEntry->nWID ) )  // can be handled by SfxItemPropertySet
    2874             :                 {
    2875         390 :                     if ( !pOldPattern )
    2876             :                     {
    2877          94 :                         pOldPattern = new ScPatternAttr( *GetCurrentAttrsDeep() );
    2878          94 :                         pOldPattern->GetItemSet().ClearInvalidItems();
    2879          94 :                         pNewPattern = new ScPatternAttr( pDoc->GetPool() );
    2880             :                     }
    2881             : 
    2882             :                     //  collect items in pNewPattern, apply with one call after the loop
    2883             : 
    2884             :                     sal_uInt16 nFirstItem, nSecondItem;
    2885             :                     try
    2886             :                     {
    2887         390 :                         lcl_SetCellProperty( *pEntry, pValues[i], *pOldPattern, pDoc, nFirstItem, nSecondItem );
    2888             : 
    2889             :                         //  put only affected items into new set
    2890         390 :                         if ( nFirstItem )
    2891         390 :                             pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nFirstItem ) );
    2892         390 :                         if ( nSecondItem )
    2893           2 :                             pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nSecondItem ) );
    2894             :                     }
    2895           0 :                     catch ( lang::IllegalArgumentException& )
    2896             :                     {
    2897           0 :                         pReturns[nFailed].Name = pNames[i];
    2898           0 :                         pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::ILLEGAL_ARGUMENT;
    2899             :                     }
    2900             :                 }
    2901         246 :                 else if ( pEntry->nWID != SC_WID_UNO_CELLSTYL )   // CellStyle is handled above
    2902             :                 {
    2903             :                     //  call virtual method to set a single property
    2904             :                     try
    2905             :                     {
    2906         150 :                         SetOnePropertyValue( pEntry, pValues[i] );
    2907             :                     }
    2908           0 :                     catch ( lang::IllegalArgumentException& )
    2909             :                     {
    2910           0 :                         pReturns[nFailed].Name = pNames[i];
    2911           0 :                         pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::ILLEGAL_ARGUMENT;
    2912             :                     }
    2913         636 :                 }
    2914             :             }
    2915             :             else
    2916             :             {
    2917          42 :                 pReturns[nFailed].Name = pNames[i];
    2918          42 :                 if (pEntry)
    2919           0 :                     pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::PROPERTY_VETO;
    2920             :                 else
    2921          42 :                     pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
    2922             :             }
    2923             :         }
    2924             : 
    2925         146 :         if ( pNewPattern && !aRanges.empty() )
    2926          94 :             pDocShell->GetDocFunc().ApplyAttributes( *GetMarkData(), *pNewPattern, sal_True, sal_True );
    2927             : 
    2928         146 :         delete pNewPattern;
    2929         146 :         delete pOldPattern;
    2930         146 :         delete[] pMapArray;
    2931             : 
    2932         146 :         aReturns.realloc(nFailed);
    2933             : 
    2934         146 :         return aReturns;
    2935             :     }
    2936           0 :     return uno::Sequence < beans::SetPropertyTolerantFailed >();
    2937             : }
    2938             : 
    2939           0 : uno::Sequence< beans::GetPropertyTolerantResult > SAL_CALL ScCellRangesBase::getPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames )
    2940             :                                     throw (uno::RuntimeException)
    2941             : {
    2942           0 :     SolarMutexGuard aGuard;
    2943             : 
    2944           0 :     sal_Int32 nCount(aPropertyNames.getLength());
    2945           0 :     uno::Sequence < beans::GetPropertyTolerantResult > aReturns(nCount);
    2946           0 :     beans::GetPropertyTolerantResult* pReturns = aReturns.getArray();
    2947             : 
    2948           0 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2949             : 
    2950           0 :     for(sal_Int32 i = 0; i < nCount; i++)
    2951             :     {
    2952           0 :         const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyNames[i] );
    2953           0 :         if (!pEntry)
    2954             :         {
    2955           0 :             pReturns[i].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
    2956             :         }
    2957             :         else
    2958             :         {
    2959           0 :             sal_uInt16 nItemWhich = 0;
    2960           0 :             lcl_GetPropertyWhich( pEntry, nItemWhich );
    2961           0 :             pReturns[i].State = GetOnePropertyState( nItemWhich, pEntry );
    2962           0 :             GetOnePropertyValue( pEntry, pReturns[i].Value );
    2963           0 :             pReturns[i].Result = beans::TolerantPropertySetResultType::SUCCESS;
    2964             :         }
    2965             :     }
    2966           0 :     return aReturns;
    2967             : }
    2968             : 
    2969           8 : uno::Sequence< beans::GetDirectPropertyTolerantResult > SAL_CALL ScCellRangesBase::getDirectPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames )
    2970             :                                     throw (uno::RuntimeException)
    2971             : {
    2972           8 :     SolarMutexGuard aGuard;
    2973             : 
    2974           8 :     sal_Int32 nCount(aPropertyNames.getLength());
    2975           8 :     uno::Sequence < beans::GetDirectPropertyTolerantResult > aReturns(nCount);
    2976           8 :     beans::GetDirectPropertyTolerantResult* pReturns = aReturns.getArray();
    2977             : 
    2978           8 :     const SfxItemPropertyMap& rPropertyMap = GetItemPropertyMap();     // from derived class
    2979             : 
    2980           8 :     sal_Int32 j = 0;
    2981         182 :     for(sal_Int32 i = 0; i < nCount; i++)
    2982             :     {
    2983         174 :         const SfxItemPropertySimpleEntry* pEntry = rPropertyMap.getByName( aPropertyNames[i] );
    2984         174 :         if (!pEntry)
    2985             :         {
    2986           0 :             pReturns[i].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY;
    2987             :         }
    2988             :         else
    2989             :         {
    2990         174 :             sal_uInt16 nItemWhich = 0;
    2991         174 :             lcl_GetPropertyWhich( pEntry, nItemWhich );
    2992         174 :             pReturns[j].State = GetOnePropertyState( nItemWhich, pEntry );
    2993         174 :             if (pReturns[j].State == beans::PropertyState_DIRECT_VALUE)
    2994             :             {
    2995          22 :                 GetOnePropertyValue( pEntry, pReturns[j].Value );
    2996          22 :                 pReturns[j].Result = beans::TolerantPropertySetResultType::SUCCESS;
    2997          22 :                 pReturns[j].Name = aPropertyNames[i];
    2998          22 :                 ++j;
    2999             :             }
    3000             :         }
    3001             :     }
    3002           8 :     if (j < nCount)
    3003           2 :         aReturns.realloc(j);
    3004           8 :     return aReturns;
    3005             : }
    3006             : 
    3007             : // XIndent
    3008             : 
    3009           0 : void SAL_CALL ScCellRangesBase::decrementIndent() throw(::com::sun::star::uno::RuntimeException)
    3010             : {
    3011           0 :     SolarMutexGuard aGuard;
    3012           0 :     if ( pDocShell && !aRanges.empty() )        // leer = nichts zu tun
    3013             :     {
    3014             :         //#97041#; put only MultiMarked ScMarkData in ChangeIndent
    3015           0 :         ScMarkData aMarkData(*GetMarkData());
    3016           0 :         aMarkData.MarkToMulti();
    3017           0 :         pDocShell->GetDocFunc().ChangeIndent( aMarkData, false, sal_True );
    3018           0 :     }
    3019           0 : }
    3020             : 
    3021           0 : void SAL_CALL ScCellRangesBase::incrementIndent() throw(::com::sun::star::uno::RuntimeException)
    3022             : {
    3023           0 :     SolarMutexGuard aGuard;
    3024           0 :     if ( pDocShell && !aRanges.empty() )        // leer = nichts zu tun
    3025             :     {
    3026             :         //#97041#; put only MultiMarked ScMarkData in ChangeIndent
    3027           0 :         ScMarkData aMarkData(*GetMarkData());
    3028           0 :         aMarkData.MarkToMulti();
    3029           0 :         pDocShell->GetDocFunc().ChangeIndent( aMarkData, sal_True, sal_True );
    3030           0 :     }
    3031           0 : }
    3032             : 
    3033             : // XChartData
    3034             : 
    3035           0 : ScMemChart* ScCellRangesBase::CreateMemChart_Impl() const
    3036             : {
    3037           0 :     if ( pDocShell && !aRanges.empty() )
    3038             :     {
    3039           0 :         ScRangeListRef xChartRanges;
    3040           0 :         if ( aRanges.size() == 1 )
    3041             :         {
    3042             :             //  ganze Tabelle sinnvoll begrenzen (auf belegten Datenbereich)
    3043             :             //  (nur hier, Listener werden auf den ganzen Bereich angemeldet)
    3044             :             //! direkt testen, ob es ein ScTableSheetObj ist?
    3045             : 
    3046           0 :             const ScRange* pRange = aRanges[0];
    3047           0 :             if ( pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL &&
    3048           0 :                  pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW )
    3049             :             {
    3050           0 :                 SCTAB nTab = pRange->aStart.Tab();
    3051             : 
    3052             :                 SCCOL nStartX;
    3053             :                 SCROW nStartY; // Anfang holen
    3054           0 :                 if (!pDocShell->GetDocument()->GetDataStart( nTab, nStartX, nStartY ))
    3055             :                 {
    3056           0 :                     nStartX = 0;
    3057           0 :                     nStartY = 0;
    3058             :                 }
    3059             : 
    3060             :                 SCCOL nEndX;
    3061             :                 SCROW nEndY; // Ende holen
    3062           0 :                 if (!pDocShell->GetDocument()->GetTableArea( nTab, nEndX, nEndY ))
    3063             :                 {
    3064           0 :                     nEndX = 0;
    3065           0 :                     nEndY = 0;
    3066             :                 }
    3067             : 
    3068           0 :                 xChartRanges = new ScRangeList;
    3069           0 :                 xChartRanges->Append( ScRange( nStartX, nStartY, nTab, nEndX, nEndY, nTab ) );
    3070             :             }
    3071             :         }
    3072           0 :         if (!xChartRanges.Is())         //  sonst Ranges direkt uebernehmen
    3073           0 :             xChartRanges = new ScRangeList(aRanges);
    3074           0 :         ScChartArray aArr( pDocShell->GetDocument(), xChartRanges, String() );
    3075             : 
    3076             :         // RowAsHdr = ColHeaders und umgekehrt
    3077           0 :         aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );
    3078             : 
    3079           0 :         return aArr.CreateMemChart();
    3080             :     }
    3081           0 :     return NULL;
    3082             : }
    3083             : 
    3084           0 : uno::Sequence< uno::Sequence<double> > SAL_CALL ScCellRangesBase::getData()
    3085             :                                                 throw(uno::RuntimeException)
    3086             : {
    3087           0 :     SolarMutexGuard aGuard;
    3088           0 :     ScMemChart* pMemChart = CreateMemChart_Impl();
    3089           0 :     if ( pMemChart )
    3090             :     {
    3091           0 :         sal_Int32 nColCount = pMemChart->GetColCount();
    3092           0 :         sal_Int32 nRowCount = static_cast<sal_Int32>(pMemChart->GetRowCount());
    3093             : 
    3094           0 :         uno::Sequence< uno::Sequence<double> > aRowSeq( nRowCount );
    3095           0 :         uno::Sequence<double>* pRowAry = aRowSeq.getArray();
    3096           0 :         for (sal_Int32 nRow = 0; nRow < nRowCount; nRow++)
    3097             :         {
    3098           0 :             uno::Sequence<double> aColSeq( nColCount );
    3099           0 :             double* pColAry = aColSeq.getArray();
    3100           0 :             for (sal_Int32 nCol = 0; nCol < nColCount; nCol++)
    3101           0 :                 pColAry[nCol] = pMemChart->GetData( static_cast<short>(nCol), static_cast<short>(nRow) );
    3102             : 
    3103           0 :             pRowAry[nRow] = aColSeq;
    3104           0 :         }
    3105             : 
    3106           0 :         delete pMemChart;
    3107           0 :         return aRowSeq;
    3108             :     }
    3109             : 
    3110           0 :     return uno::Sequence< uno::Sequence<double> >(0);
    3111             : }
    3112             : 
    3113           0 : ScRangeListRef ScCellRangesBase::GetLimitedChartRanges_Impl( long nDataColumns, long nDataRows ) const
    3114             : {
    3115           0 :     if ( aRanges.size() == 1 )
    3116             :     {
    3117           0 :         const ScRange* pRange = aRanges[0];
    3118           0 :         if ( pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL &&
    3119           0 :              pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW )
    3120             :         {
    3121             :             //  if aRanges is a complete sheet, limit to given size
    3122             : 
    3123           0 :             SCTAB nTab = pRange->aStart.Tab();
    3124             : 
    3125           0 :             long nEndColumn = nDataColumns - 1 + ( bChartColAsHdr ? 1 : 0 );
    3126           0 :             if ( nEndColumn < 0 )
    3127           0 :                 nEndColumn = 0;
    3128           0 :             if ( nEndColumn > MAXCOL )
    3129           0 :                 nEndColumn = MAXCOL;
    3130             : 
    3131           0 :             long nEndRow = nDataRows - 1 + ( bChartRowAsHdr ? 1 : 0 );
    3132           0 :             if ( nEndRow < 0 )
    3133           0 :                 nEndRow = 0;
    3134           0 :             if ( nEndRow > MAXROW )
    3135           0 :                 nEndRow = MAXROW;
    3136             : 
    3137           0 :             ScRangeListRef xChartRanges = new ScRangeList;
    3138           0 :             xChartRanges->Append( ScRange( 0, 0, nTab, (SCCOL)nEndColumn, (SCROW)nEndRow, nTab ) );
    3139           0 :             return xChartRanges;
    3140             :         }
    3141             :     }
    3142             : 
    3143           0 :     return new ScRangeList(aRanges);        // as-is
    3144             : }
    3145             : 
    3146           0 : void SAL_CALL ScCellRangesBase::setData( const uno::Sequence< uno::Sequence<double> >& aData )
    3147             :                                                 throw(uno::RuntimeException)
    3148             : {
    3149           0 :     SolarMutexGuard aGuard;
    3150           0 :     sal_Bool bDone = false;
    3151           0 :     long nRowCount = aData.getLength();
    3152           0 :     long nColCount = nRowCount ? aData[0].getLength() : 0;
    3153           0 :     ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( nColCount, nRowCount );
    3154           0 :     if ( pDocShell && xChartRanges.Is() )
    3155             :     {
    3156           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    3157           0 :         ScChartArray aArr( pDoc, xChartRanges, String() );
    3158           0 :         aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );      // RowAsHdr = ColHeaders
    3159           0 :         const ScChartPositionMap* pPosMap = aArr.GetPositionMap();
    3160           0 :         if (pPosMap)
    3161             :         {
    3162           0 :             if ( pPosMap->GetColCount() == static_cast<SCCOL>(nColCount) &&
    3163           0 :                  pPosMap->GetRowCount() == static_cast<SCROW>(nRowCount) )
    3164             :             {
    3165           0 :                 for (long nRow=0; nRow<nRowCount; nRow++)
    3166             :                 {
    3167           0 :                     const uno::Sequence<double>& rRowSeq = aData[nRow];
    3168           0 :                     const double* pArray = rRowSeq.getConstArray();
    3169           0 :                     nColCount = rRowSeq.getLength();
    3170           0 :                     for (long nCol=0; nCol<nColCount; nCol++)
    3171             :                     {
    3172             :                         const ScAddress* pPos = pPosMap->GetPosition(
    3173           0 :                                 sal::static_int_cast<SCCOL>(nCol),
    3174           0 :                                 sal::static_int_cast<SCROW>(nRow) );
    3175           0 :                         if (pPos)
    3176             :                         {
    3177           0 :                             double fVal = pArray[nCol];
    3178           0 :                             if ( fVal == DBL_MIN )
    3179           0 :                                 pDoc->PutCell( *pPos, NULL );       // empty cell
    3180             :                             else
    3181           0 :                                 pDoc->SetValue( pPos->Col(), pPos->Row(), pPos->Tab(), pArray[nCol] );
    3182             :                         }
    3183             :                     }
    3184             :                 }
    3185             : 
    3186             :                 //! undo
    3187           0 :                 PaintRanges_Impl( PAINT_GRID );
    3188           0 :                 pDocShell->SetDocumentModified();
    3189           0 :                 ForceChartListener_Impl();          // call listeners for this object synchronously
    3190           0 :                 bDone = sal_True;
    3191             :             }
    3192           0 :         }
    3193             :     }
    3194             : 
    3195           0 :     if (!bDone)
    3196           0 :         throw uno::RuntimeException();
    3197           0 : }
    3198             : 
    3199           0 : uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesBase::getRowDescriptions()
    3200             :                                                 throw(uno::RuntimeException)
    3201             : {
    3202           0 :     SolarMutexGuard aGuard;
    3203           0 :     ScMemChart* pMemChart = CreateMemChart_Impl();
    3204           0 :     if ( pMemChart )
    3205             :     {
    3206           0 :         sal_Int32 nRowCount = static_cast<sal_Int32>(pMemChart->GetRowCount());
    3207           0 :         uno::Sequence<rtl::OUString> aSeq( nRowCount );
    3208           0 :         rtl::OUString* pAry = aSeq.getArray();
    3209           0 :         for (sal_Int32 nRow = 0; nRow < nRowCount; nRow++)
    3210           0 :             pAry[nRow] = pMemChart->GetRowText(static_cast<short>(nRow));
    3211             : 
    3212           0 :         delete pMemChart;
    3213           0 :         return aSeq;
    3214             :     }
    3215           0 :     return uno::Sequence<rtl::OUString>(0);
    3216             : }
    3217             : 
    3218           0 : void SAL_CALL ScCellRangesBase::setRowDescriptions(
    3219             :                         const uno::Sequence<rtl::OUString>& aRowDescriptions )
    3220             :                                                 throw(uno::RuntimeException)
    3221             : {
    3222           0 :     SolarMutexGuard aGuard;
    3223           0 :     sal_Bool bDone = false;
    3224           0 :     if ( bChartColAsHdr )
    3225             :     {
    3226           0 :         long nRowCount = aRowDescriptions.getLength();
    3227           0 :         ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( 1, nRowCount );
    3228           0 :         if ( pDocShell && xChartRanges.Is() )
    3229             :         {
    3230           0 :             ScDocument* pDoc = pDocShell->GetDocument();
    3231           0 :             ScChartArray aArr( pDoc, xChartRanges, String() );
    3232           0 :             aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );      // RowAsHdr = ColHeaders
    3233           0 :             const ScChartPositionMap* pPosMap = aArr.GetPositionMap();
    3234           0 :             if (pPosMap)
    3235             :             {
    3236           0 :                 if ( pPosMap->GetRowCount() == static_cast<SCROW>(nRowCount) )
    3237             :                 {
    3238           0 :                     const rtl::OUString* pArray = aRowDescriptions.getConstArray();
    3239           0 :                     for (long nRow=0; nRow<nRowCount; nRow++)
    3240             :                     {
    3241             :                         const ScAddress* pPos = pPosMap->GetRowHeaderPosition(
    3242           0 :                                 static_cast<SCSIZE>(nRow) );
    3243           0 :                         if (pPos)
    3244             :                         {
    3245           0 :                             String aStr = pArray[nRow];
    3246           0 :                             if ( aStr.Len() )
    3247           0 :                                 pDoc->PutCell( *pPos, new ScStringCell( aStr ) );
    3248             :                             else
    3249           0 :                                 pDoc->PutCell( *pPos, NULL );       // empty cell
    3250             :                         }
    3251             :                     }
    3252             : 
    3253             :                     //! undo
    3254           0 :                     PaintRanges_Impl( PAINT_GRID );
    3255           0 :                     pDocShell->SetDocumentModified();
    3256           0 :                     ForceChartListener_Impl();          // call listeners for this object synchronously
    3257           0 :                     bDone = sal_True;
    3258             :                 }
    3259           0 :             }
    3260           0 :         }
    3261             :     }
    3262             : 
    3263           0 :     if (!bDone)
    3264           0 :         throw uno::RuntimeException();
    3265           0 : }
    3266             : 
    3267           0 : uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesBase::getColumnDescriptions()
    3268             :                                                 throw(uno::RuntimeException)
    3269             : {
    3270           0 :     SolarMutexGuard aGuard;
    3271           0 :     ScMemChart* pMemChart = CreateMemChart_Impl();
    3272           0 :     if ( pMemChart )
    3273             :     {
    3274           0 :         sal_Int32 nColCount = pMemChart->GetColCount();
    3275           0 :         uno::Sequence<rtl::OUString> aSeq( nColCount );
    3276           0 :         rtl::OUString* pAry = aSeq.getArray();
    3277           0 :         for (sal_Int32 nCol = 0; nCol < nColCount; nCol++)
    3278           0 :             pAry[nCol] = pMemChart->GetColText(static_cast<short>(nCol));
    3279             : 
    3280           0 :         delete pMemChart;
    3281           0 :         return aSeq;
    3282             :     }
    3283           0 :     return uno::Sequence<rtl::OUString>(0);
    3284             : }
    3285             : 
    3286           0 : void SAL_CALL ScCellRangesBase::setColumnDescriptions(
    3287             :                         const uno::Sequence<rtl::OUString>& aColumnDescriptions )
    3288             :                                                 throw(uno::RuntimeException)
    3289             : {
    3290           0 :     SolarMutexGuard aGuard;
    3291           0 :     sal_Bool bDone = false;
    3292           0 :     if ( bChartRowAsHdr )
    3293             :     {
    3294           0 :         long nColCount = aColumnDescriptions.getLength();
    3295           0 :         ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( nColCount, 1 );
    3296           0 :         if ( pDocShell && xChartRanges.Is() )
    3297             :         {
    3298           0 :             ScDocument* pDoc = pDocShell->GetDocument();
    3299           0 :             ScChartArray aArr( pDoc, xChartRanges, String() );
    3300           0 :             aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr );      // RowAsHdr = ColHeaders
    3301           0 :             const ScChartPositionMap* pPosMap = aArr.GetPositionMap();
    3302           0 :             if (pPosMap)
    3303             :             {
    3304           0 :                 if ( pPosMap->GetColCount() == static_cast<SCCOL>(nColCount) )
    3305             :                 {
    3306           0 :                     const rtl::OUString* pArray = aColumnDescriptions.getConstArray();
    3307           0 :                     for (long nCol=0; nCol<nColCount; nCol++)
    3308             :                     {
    3309             :                         const ScAddress* pPos = pPosMap->GetColHeaderPosition(
    3310           0 :                             sal::static_int_cast<SCCOL>(nCol) );
    3311           0 :                         if (pPos)
    3312             :                         {
    3313           0 :                             String aStr(pArray[nCol]);
    3314           0 :                             if ( aStr.Len() )
    3315           0 :                                 pDoc->PutCell( *pPos, new ScStringCell( aStr ) );
    3316             :                             else
    3317           0 :                                 pDoc->PutCell( *pPos, NULL );       // empty cell
    3318             :                         }
    3319             :                     }
    3320             : 
    3321             :                     //! undo
    3322           0 :                     PaintRanges_Impl( PAINT_GRID );
    3323           0 :                     pDocShell->SetDocumentModified();
    3324           0 :                     ForceChartListener_Impl();          // call listeners for this object synchronously
    3325           0 :                     bDone = sal_True;
    3326             :                 }
    3327           0 :             }
    3328           0 :         }
    3329             :     }
    3330             : 
    3331           0 :     if (!bDone)
    3332           0 :         throw uno::RuntimeException();
    3333           0 : }
    3334             : 
    3335           0 : void ScCellRangesBase::ForceChartListener_Impl()
    3336             : {
    3337             :     //  call Update immediately so the caller to setData etc. can
    3338             :     //  regognize the listener call
    3339             : 
    3340           0 :     if (!pDocShell)
    3341             :         return;
    3342             : 
    3343           0 :     ScChartListenerCollection* pColl = pDocShell->GetDocument()->GetChartListenerCollection();
    3344           0 :     if (!pColl)
    3345             :         return;
    3346             : 
    3347           0 :     ScChartListenerCollection::ListenersType& rListeners = pColl->getListeners();
    3348           0 :     ScChartListenerCollection::ListenersType::iterator it = rListeners.begin(), itEnd = rListeners.end();
    3349           0 :     for (; it != itEnd; ++it)
    3350             :     {
    3351           0 :         ScChartListener* p = it->second;
    3352             :         OSL_ASSERT(p);
    3353           0 :         if (p->GetUnoSource() == static_cast<chart::XChartData*>(this) && p->IsDirty())
    3354           0 :             p->Update();
    3355             :     }
    3356             : }
    3357             : 
    3358           0 : void SAL_CALL ScCellRangesBase::addChartDataChangeEventListener( const uno::Reference<
    3359             :                                     chart::XChartDataChangeEventListener >& aListener )
    3360             :                                 throw(uno::RuntimeException)
    3361             : {
    3362           0 :     SolarMutexGuard aGuard;
    3363           0 :     if ( pDocShell && !aRanges.empty() )
    3364             :     {
    3365             :         //! auf doppelte testen?
    3366             : 
    3367           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    3368           0 :         ScRangeListRef aRangesRef( new ScRangeList(aRanges) );
    3369           0 :         ScChartListenerCollection* pColl = pDoc->GetChartListenerCollection();
    3370           0 :         rtl::OUString aName = pColl->getUniqueName(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("__Uno")));
    3371           0 :         if (aName.isEmpty())
    3372             :             // failed to create unique name.
    3373           0 :             return;
    3374             : 
    3375           0 :         ScChartListener* pListener = new ScChartListener( aName, pDoc, aRangesRef );
    3376           0 :         pListener->SetUno( aListener, this );
    3377           0 :         pColl->insert( pListener );
    3378           0 :         pListener->StartListeningTo();
    3379           0 :     }
    3380             : }
    3381             : 
    3382           0 : void SAL_CALL ScCellRangesBase::removeChartDataChangeEventListener( const uno::Reference<
    3383             :                                     chart::XChartDataChangeEventListener >& aListener )
    3384             :                                 throw(uno::RuntimeException)
    3385             : {
    3386           0 :     SolarMutexGuard aGuard;
    3387           0 :     if ( pDocShell && !aRanges.empty() )
    3388             :     {
    3389           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    3390           0 :         ScChartListenerCollection* pColl = pDoc->GetChartListenerCollection();
    3391           0 :         pColl->FreeUno( aListener, this );
    3392           0 :     }
    3393           0 : }
    3394             : 
    3395           0 : double SAL_CALL ScCellRangesBase::getNotANumber() throw(::com::sun::star::uno::RuntimeException)
    3396             : {
    3397             :     //  im ScChartArray wird DBL_MIN verwendet, weil das Chart es so will
    3398           0 :     return DBL_MIN;
    3399             : }
    3400             : 
    3401           0 : sal_Bool SAL_CALL ScCellRangesBase::isNotANumber( double nNumber ) throw(uno::RuntimeException)
    3402             : {
    3403             :     //  im ScChartArray wird DBL_MIN verwendet, weil das Chart es so will
    3404           0 :     return (nNumber == DBL_MIN);
    3405             : }
    3406             : 
    3407             : // XModifyBroadcaster
    3408             : 
    3409           4 : void SAL_CALL ScCellRangesBase::addModifyListener( const uno::Reference<util::XModifyListener>& aListener )
    3410             :                                 throw(uno::RuntimeException)
    3411             : {
    3412           4 :     SolarMutexGuard aGuard;
    3413           4 :     if ( aRanges.empty() )
    3414           0 :         throw uno::RuntimeException();
    3415             : 
    3416             :     uno::Reference<util::XModifyListener> *pObj =
    3417           4 :             new uno::Reference<util::XModifyListener>( aListener );
    3418           4 :     aValueListeners.push_back( pObj );
    3419             : 
    3420           4 :     if ( aValueListeners.size() == 1 )
    3421             :     {
    3422           4 :         if (!pValueListener)
    3423           4 :             pValueListener = new ScLinkListener( LINK( this, ScCellRangesBase, ValueListenerHdl ) );
    3424             : 
    3425           4 :         ScDocument* pDoc = pDocShell->GetDocument();
    3426           8 :         for ( size_t i = 0, nCount = aRanges.size(); i < nCount; i++)
    3427           4 :             pDoc->StartListeningArea( *aRanges[ i ], pValueListener );
    3428             : 
    3429           4 :         acquire();  // don't lose this object (one ref for all listeners)
    3430           4 :     }
    3431           4 : }
    3432             : 
    3433           0 : void SAL_CALL ScCellRangesBase::removeModifyListener( const uno::Reference<util::XModifyListener>& aListener )
    3434             :                                 throw(uno::RuntimeException)
    3435             : {
    3436             : 
    3437           0 :     SolarMutexGuard aGuard;
    3438           0 :     if ( aRanges.empty() )
    3439           0 :         throw uno::RuntimeException();
    3440             : 
    3441           0 :     acquire();      // in case the listeners have the last ref - released below
    3442             : 
    3443           0 :     sal_uInt16 nCount = aValueListeners.size();
    3444           0 :     for ( sal_uInt16 n=nCount; n--; )
    3445             :     {
    3446           0 :         uno::Reference<util::XModifyListener>& rObj = aValueListeners[n];
    3447           0 :         if ( rObj == aListener )
    3448             :         {
    3449           0 :             aValueListeners.erase( aValueListeners.begin() + n );
    3450             : 
    3451           0 :             if ( aValueListeners.empty() )
    3452             :             {
    3453           0 :                 if (pValueListener)
    3454           0 :                     pValueListener->EndListeningAll();
    3455             : 
    3456           0 :                 release();      // release the ref for the listeners
    3457             :             }
    3458             : 
    3459           0 :             break;
    3460             :         }
    3461             :     }
    3462             : 
    3463           0 :     release();      // might delete this object
    3464           0 : }
    3465             : 
    3466             : // XCellRangesQuery
    3467             : 
    3468           0 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryVisibleCells()
    3469             :                                     throw(uno::RuntimeException)
    3470             : {
    3471           0 :     SolarMutexGuard aGuard;
    3472           0 :     if (pDocShell)
    3473             :     {
    3474             :         //! fuer alle Tabellen getrennt, wenn Markierungen pro Tabelle getrennt sind!
    3475           0 :         SCTAB nTab = lcl_FirstTab(aRanges);
    3476             : 
    3477           0 :         ScMarkData aMarkData(*GetMarkData());
    3478             : 
    3479           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    3480           0 :         SCCOL nCol = 0, nLastCol;
    3481           0 :         while (nCol <= MAXCOL)
    3482             :         {
    3483           0 :             if (pDoc->ColHidden(nCol, nTab, NULL, &nLastCol))
    3484             :                 // hidden columns.  Unselect them.
    3485           0 :                 aMarkData.SetMultiMarkArea(ScRange(nCol, 0, nTab, nLastCol, MAXROW, nTab), false);
    3486             : 
    3487           0 :             nCol = nLastCol + 1;
    3488             :         }
    3489             : 
    3490           0 :         SCROW nRow = 0, nLastRow;
    3491           0 :         while (nRow <= MAXROW)
    3492             :         {
    3493           0 :             if (pDoc->RowHidden(nRow, nTab, NULL, &nLastRow))
    3494             :                 // These rows are hidden.  Unselect them.
    3495           0 :                 aMarkData.SetMultiMarkArea(ScRange(0, nRow, nTab, MAXCOL, nLastRow, nTab), false);
    3496             : 
    3497           0 :             nRow = nLastRow + 1;
    3498             :         }
    3499             : 
    3500           0 :         ScRangeList aNewRanges;
    3501           0 :         aMarkData.FillRangeListWithMarks( &aNewRanges, false );
    3502           0 :         return new ScCellRangesObj( pDocShell, aNewRanges );
    3503             :     }
    3504             : 
    3505           0 :     return NULL;
    3506             : }
    3507             : 
    3508           0 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryEmptyCells()
    3509             :                                     throw(uno::RuntimeException)
    3510             : {
    3511           0 :     SolarMutexGuard aGuard;
    3512           0 :     if (pDocShell)
    3513             :     {
    3514           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    3515             : 
    3516           0 :         ScMarkData aMarkData(*GetMarkData());
    3517             : 
    3518             :         //  belegte Zellen wegmarkieren
    3519           0 :         for (size_t i = 0, nCount = aRanges.size(); i < nCount; ++i)
    3520             :         {
    3521           0 :             ScRange aRange = *aRanges[ i ];
    3522             : 
    3523           0 :             ScCellIterator aIter( pDoc, aRange );
    3524           0 :             ScBaseCell* pCell = aIter.GetFirst();
    3525           0 :             while (pCell)
    3526             :             {
    3527             :                 //  Notizen zaehlen als nicht-leer
    3528           0 :                 if ( !pCell->IsBlank() )
    3529             :                     aMarkData.SetMultiMarkArea(
    3530           0 :                             ScRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() ),
    3531           0 :                             false );
    3532             : 
    3533           0 :                 pCell = aIter.GetNext();
    3534             :             }
    3535             :         }
    3536             : 
    3537           0 :         ScRangeList aNewRanges;
    3538             :         //  IsMultiMarked reicht hier nicht (wird beim deselektieren nicht zurueckgesetzt)
    3539           0 :         if (aMarkData.HasAnyMultiMarks())
    3540           0 :             aMarkData.FillRangeListWithMarks( &aNewRanges, false );
    3541             : 
    3542           0 :         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
    3543             :     }
    3544             : 
    3545           0 :     return NULL;
    3546             : }
    3547             : 
    3548           2 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryContentCells(
    3549             :                                                     sal_Int16 nContentFlags )
    3550             :                                     throw(uno::RuntimeException)
    3551             : {
    3552           2 :     SolarMutexGuard aGuard;
    3553           2 :     if (pDocShell)
    3554             :     {
    3555           2 :         ScDocument* pDoc = pDocShell->GetDocument();
    3556             : 
    3557           2 :         ScMarkData aMarkData;
    3558             : 
    3559             :         //  passende Zellen selektieren
    3560           4 :         for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i )
    3561             :         {
    3562           2 :             ScRange aRange = *aRanges[ i ];
    3563             : 
    3564           2 :             ScCellIterator aIter( pDoc, aRange );
    3565           2 :             ScBaseCell* pCell = aIter.GetFirst();
    3566           6 :             while (pCell)
    3567             :             {
    3568           2 :                 sal_Bool bAdd = false;
    3569           2 :                 switch ( pCell->GetCellType() )
    3570             :                 {
    3571             :                     case CELLTYPE_STRING:
    3572           0 :                         if ( nContentFlags & sheet::CellFlags::STRING )
    3573           0 :                             bAdd = sal_True;
    3574           0 :                         break;
    3575             :                     case CELLTYPE_EDIT:
    3576           0 :                         if ( (nContentFlags & sheet::CellFlags::STRING) || (nContentFlags & sheet::CellFlags::FORMATTED) )
    3577           0 :                             bAdd = sal_True;
    3578           0 :                         break;
    3579             :                     case CELLTYPE_FORMULA:
    3580           0 :                         if ( nContentFlags & sheet::CellFlags::FORMULA )
    3581           0 :                             bAdd = sal_True;
    3582           0 :                         break;
    3583             :                     case CELLTYPE_VALUE:
    3584           2 :                         if ( (nContentFlags & (sheet::CellFlags::VALUE|sheet::CellFlags::DATETIME))
    3585             :                                 == (sheet::CellFlags::VALUE|sheet::CellFlags::DATETIME) )
    3586           0 :                             bAdd = sal_True;
    3587             :                         else
    3588             :                         {
    3589             :                             //  Date/Time Erkennung
    3590             : 
    3591             :                             sal_uLong nIndex = (sal_uLong)((SfxUInt32Item*)pDoc->GetAttr(
    3592           4 :                                         aIter.GetCol(), aIter.GetRow(), aIter.GetTab(),
    3593           4 :                                         ATTR_VALUE_FORMAT ))->GetValue();
    3594           2 :                             short nTyp = pDoc->GetFormatTable()->GetType(nIndex);
    3595           2 :                             if ((nTyp == NUMBERFORMAT_DATE) || (nTyp == NUMBERFORMAT_TIME) ||
    3596             :                                     (nTyp == NUMBERFORMAT_DATETIME))
    3597             :                             {
    3598           0 :                                 if ( nContentFlags & sheet::CellFlags::DATETIME )
    3599           0 :                                     bAdd = sal_True;
    3600             :                             }
    3601             :                             else
    3602             :                             {
    3603           2 :                                 if ( nContentFlags & sheet::CellFlags::VALUE )
    3604           0 :                                     bAdd = sal_True;
    3605             :                             }
    3606             :                         }
    3607           2 :                         break;
    3608             :                     default:
    3609             :                         {
    3610             :                             // added to avoid warnings
    3611             :                         }
    3612             :                 }
    3613             : 
    3614           2 :                 if (bAdd)
    3615             :                     aMarkData.SetMultiMarkArea(
    3616           0 :                             ScRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() ),
    3617           0 :                             sal_True );
    3618             : 
    3619           2 :                 pCell = aIter.GetNext();
    3620             :             }
    3621             : 
    3622             :         }
    3623             : 
    3624           2 :         ScRangeList aNewRanges;
    3625           2 :         if (aMarkData.IsMultiMarked())
    3626           0 :             aMarkData.FillRangeListWithMarks( &aNewRanges, false );
    3627             : 
    3628           2 :         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
    3629             :     }
    3630             : 
    3631           0 :     return NULL;
    3632             : }
    3633             : 
    3634           0 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryFormulaCells(
    3635             :                                                     sal_Int32 nResultFlags )
    3636             :                                     throw(uno::RuntimeException)
    3637             : {
    3638           0 :     SolarMutexGuard aGuard;
    3639           0 :     if (pDocShell)
    3640             :     {
    3641           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    3642             : 
    3643           0 :         ScMarkData aMarkData;
    3644             : 
    3645             :         //  passende Zellen selektieren
    3646           0 :         for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i )
    3647             :         {
    3648           0 :             ScRange aRange = *aRanges[ i ];
    3649             : 
    3650           0 :             ScCellIterator aIter( pDoc, aRange );
    3651           0 :             ScBaseCell* pCell = aIter.GetFirst();
    3652           0 :             while (pCell)
    3653             :             {
    3654           0 :                 if (pCell->GetCellType() == CELLTYPE_FORMULA)
    3655             :                 {
    3656           0 :                     ScFormulaCell* pFCell = (ScFormulaCell*)pCell;
    3657           0 :                     sal_Bool bAdd = false;
    3658           0 :                     if (pFCell->GetErrCode())
    3659             :                     {
    3660           0 :                         if ( nResultFlags & sheet::FormulaResult::ERROR )
    3661           0 :                             bAdd = sal_True;
    3662             :                     }
    3663           0 :                     else if (pFCell->IsValue())
    3664             :                     {
    3665           0 :                         if ( nResultFlags & sheet::FormulaResult::VALUE )
    3666           0 :                             bAdd = sal_True;
    3667             :                     }
    3668             :                     else    // String
    3669             :                     {
    3670           0 :                         if ( nResultFlags & sheet::FormulaResult::STRING )
    3671           0 :                             bAdd = sal_True;
    3672             :                     }
    3673             : 
    3674           0 :                     if (bAdd)
    3675             :                         aMarkData.SetMultiMarkArea(
    3676           0 :                                 ScRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() ),
    3677           0 :                                 sal_True );
    3678             :                 }
    3679             : 
    3680           0 :                 pCell = aIter.GetNext();
    3681             :             }
    3682             :         }
    3683             : 
    3684           0 :         ScRangeList aNewRanges;
    3685           0 :         if (aMarkData.IsMultiMarked())
    3686           0 :             aMarkData.FillRangeListWithMarks( &aNewRanges, false );
    3687             : 
    3688           0 :         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
    3689             :     }
    3690             : 
    3691           0 :     return NULL;
    3692             : }
    3693             : 
    3694           0 : uno::Reference<sheet::XSheetCellRanges> ScCellRangesBase::QueryDifferences_Impl(
    3695             :                         const table::CellAddress& aCompare, sal_Bool bColumnDiff)
    3696             : {
    3697           0 :     if (pDocShell)
    3698             :     {
    3699           0 :         size_t nRangeCount = aRanges.size();
    3700             :         size_t i;
    3701           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    3702           0 :         ScMarkData aMarkData;
    3703             : 
    3704           0 :         SCCOLROW nCmpPos = bColumnDiff ? (SCCOLROW)aCompare.Row : (SCCOLROW)aCompare.Column;
    3705             : 
    3706             :         //  zuerst alles selektieren, wo ueberhaupt etwas in der Vergleichsspalte steht
    3707             :         //  (fuer gleiche Zellen wird die Selektion im zweiten Schritt aufgehoben)
    3708             : 
    3709           0 :         SCTAB nTab = lcl_FirstTab(aRanges); //! fuer alle Tabellen, wenn Markierungen pro Tabelle!
    3710           0 :         ScRange aCmpRange, aCellRange;
    3711           0 :         if (bColumnDiff)
    3712           0 :             aCmpRange = ScRange( 0,nCmpPos,nTab, MAXCOL,nCmpPos,nTab );
    3713             :         else
    3714           0 :             aCmpRange = ScRange( static_cast<SCCOL>(nCmpPos),0,nTab, static_cast<SCCOL>(nCmpPos),MAXROW,nTab );
    3715           0 :         ScCellIterator aCmpIter( pDoc, aCmpRange );
    3716           0 :         ScBaseCell* pCmpCell = aCmpIter.GetFirst();
    3717           0 :         while (pCmpCell)
    3718             :         {
    3719           0 :             if (pCmpCell->GetCellType() != CELLTYPE_NOTE)
    3720             :             {
    3721           0 :                 SCCOLROW nCellPos = bColumnDiff ? static_cast<SCCOLROW>(aCmpIter.GetCol()) : static_cast<SCCOLROW>(aCmpIter.GetRow());
    3722           0 :                 if (bColumnDiff)
    3723             :                     aCellRange = ScRange( static_cast<SCCOL>(nCellPos),0,nTab,
    3724           0 :                             static_cast<SCCOL>(nCellPos),MAXROW,nTab );
    3725             :                 else
    3726           0 :                     aCellRange = ScRange( 0,nCellPos,nTab, MAXCOL,nCellPos,nTab );
    3727             : 
    3728           0 :                 for (i=0; i<nRangeCount; i++)
    3729             :                 {
    3730           0 :                     ScRange aRange( *aRanges[ i ] );
    3731           0 :                     if ( aRange.Intersects( aCellRange ) )
    3732             :                     {
    3733           0 :                         if (bColumnDiff)
    3734             :                         {
    3735           0 :                             aRange.aStart.SetCol(static_cast<SCCOL>(nCellPos));
    3736           0 :                             aRange.aEnd.SetCol(static_cast<SCCOL>(nCellPos));
    3737             :                         }
    3738             :                         else
    3739             :                         {
    3740           0 :                             aRange.aStart.SetRow(nCellPos);
    3741           0 :                             aRange.aEnd.SetRow(nCellPos);
    3742             :                         }
    3743           0 :                         aMarkData.SetMultiMarkArea( aRange );
    3744             :                     }
    3745             :                 }
    3746             :             }
    3747           0 :             pCmpCell = aCmpIter.GetNext();
    3748             :         }
    3749             : 
    3750             :         //  alle nichtleeren Zellen mit der Vergleichsspalte vergleichen und entsprechend
    3751             :         //  selektieren oder aufheben
    3752             : 
    3753           0 :         ScAddress aCmpAddr;
    3754           0 :         for (i=0; i<nRangeCount; i++)
    3755             :         {
    3756           0 :             ScRange aRange( *aRanges[ i ] );
    3757             : 
    3758           0 :             ScCellIterator aIter( pDoc, aRange );
    3759           0 :             ScBaseCell* pCell = aIter.GetFirst();
    3760           0 :             while (pCell)
    3761             :             {
    3762           0 :                 if (bColumnDiff)
    3763           0 :                     aCmpAddr = ScAddress( aIter.GetCol(), nCmpPos, aIter.GetTab() );
    3764             :                 else
    3765           0 :                     aCmpAddr = ScAddress( static_cast<SCCOL>(nCmpPos), aIter.GetRow(), aIter.GetTab() );
    3766           0 :                 const ScBaseCell* pOtherCell = pDoc->GetCell( aCmpAddr );
    3767             : 
    3768           0 :                 ScRange aOneRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() );
    3769           0 :                 if ( !ScBaseCell::CellEqual( pCell, pOtherCell ) )
    3770           0 :                     aMarkData.SetMultiMarkArea( aOneRange );
    3771             :                 else
    3772           0 :                     aMarkData.SetMultiMarkArea( aOneRange, false );     // deselect
    3773             : 
    3774           0 :                 pCell = aIter.GetNext();
    3775             :             }
    3776             :         }
    3777             : 
    3778           0 :         ScRangeList aNewRanges;
    3779           0 :         if (aMarkData.IsMultiMarked())
    3780           0 :             aMarkData.FillRangeListWithMarks( &aNewRanges, false );
    3781             : 
    3782           0 :         return new ScCellRangesObj( pDocShell, aNewRanges );    // aNewRanges kann leer sein
    3783             :     }
    3784           0 :     return NULL;
    3785             : }
    3786             : 
    3787           0 : uno::Reference<sheet::XSheetCellRanges > SAL_CALL ScCellRangesBase::queryColumnDifferences(
    3788             :                             const table::CellAddress& aCompare ) throw(uno::RuntimeException)
    3789             : {
    3790           0 :     SolarMutexGuard aGuard;
    3791           0 :     return QueryDifferences_Impl( aCompare, true );
    3792             : }
    3793             : 
    3794           0 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryRowDifferences(
    3795             :                             const table::CellAddress& aCompare ) throw(uno::RuntimeException)
    3796             : {
    3797           0 :     SolarMutexGuard aGuard;
    3798           0 :     return QueryDifferences_Impl( aCompare, false );
    3799             : }
    3800             : 
    3801           0 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryIntersection(
    3802             :                             const table::CellRangeAddress& aRange ) throw(uno::RuntimeException)
    3803             : {
    3804           0 :     SolarMutexGuard aGuard;
    3805             :     ScRange aMask( (SCCOL)aRange.StartColumn, (SCROW)aRange.StartRow, aRange.Sheet,
    3806           0 :                    (SCCOL)aRange.EndColumn,   (SCROW)aRange.EndRow,   aRange.Sheet );
    3807             : 
    3808           0 :     ScRangeList aNew;
    3809           0 :     for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i )
    3810             :     {
    3811           0 :         ScRange aTemp( *aRanges[ i ] );
    3812           0 :         if ( aTemp.Intersects( aMask ) )
    3813           0 :             aNew.Join( ScRange( Max( aTemp.aStart.Col(), aMask.aStart.Col() ),
    3814             :                                 Max( aTemp.aStart.Row(), aMask.aStart.Row() ),
    3815           0 :                                 Max( aTemp.aStart.Tab(), aMask.aStart.Tab() ),
    3816           0 :                                 Min( aTemp.aEnd.Col(), aMask.aEnd.Col() ),
    3817             :                                 Min( aTemp.aEnd.Row(), aMask.aEnd.Row() ),
    3818           0 :                                 Min( aTemp.aEnd.Tab(), aMask.aEnd.Tab() ) ) );
    3819             :     }
    3820             : 
    3821           0 :     return new ScCellRangesObj( pDocShell, aNew );  // kann leer sein
    3822             : }
    3823             : 
    3824             : // XFormulaQuery
    3825             : 
    3826           0 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryPrecedents(
    3827             :                                 sal_Bool bRecursive ) throw(uno::RuntimeException)
    3828             : {
    3829           0 :     SolarMutexGuard aGuard;
    3830           0 :     if ( pDocShell )
    3831             :     {
    3832           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    3833             : 
    3834           0 :         ScRangeList aNewRanges(aRanges);
    3835             :         sal_Bool bFound;
    3836           0 :         do
    3837             :         {
    3838           0 :             bFound = false;
    3839             : 
    3840             :             //  aMarkData uses aNewRanges, not aRanges, so GetMarkData can't be used
    3841           0 :             ScMarkData aMarkData;
    3842           0 :             aMarkData.MarkFromRangeList( aNewRanges, false );
    3843           0 :             aMarkData.MarkToMulti();        // needed for IsAllMarked
    3844             : 
    3845           0 :             for (size_t nR = 0, nCount = aNewRanges.size(); nR<nCount; ++nR)
    3846             :             {
    3847           0 :                 ScRange aRange( *aNewRanges[ nR] );
    3848           0 :                 ScCellIterator aIter( pDoc, aRange );
    3849           0 :                 ScBaseCell* pCell = aIter.GetFirst();
    3850           0 :                 while (pCell)
    3851             :                 {
    3852           0 :                     if ( pCell->GetCellType() == CELLTYPE_FORMULA )
    3853             :                     {
    3854           0 :                         ScFormulaCell* pFCell = (ScFormulaCell*) pCell;
    3855             : 
    3856           0 :                         ScDetectiveRefIter aRefIter( pFCell );
    3857           0 :                         ScRange aRefRange;
    3858           0 :                         while ( aRefIter.GetNextRef( aRefRange) )
    3859             :                         {
    3860           0 :                             if ( bRecursive && !bFound && !aMarkData.IsAllMarked( aRefRange ) )
    3861           0 :                                 bFound = sal_True;
    3862           0 :                             aMarkData.SetMultiMarkArea( aRefRange, sal_True );
    3863             :                         }
    3864             :                     }
    3865           0 :                     pCell = aIter.GetNext();
    3866             :                 }
    3867             :             }
    3868             : 
    3869           0 :             aMarkData.FillRangeListWithMarks( &aNewRanges, sal_True );
    3870             :         }
    3871             :         while ( bRecursive && bFound );
    3872             : 
    3873           0 :         return new ScCellRangesObj( pDocShell, aNewRanges );
    3874             :     }
    3875             : 
    3876           0 :     return NULL;
    3877             : }
    3878             : 
    3879           0 : uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryDependents(
    3880             :                                 sal_Bool bRecursive ) throw(uno::RuntimeException)
    3881             : {
    3882           0 :     SolarMutexGuard aGuard;
    3883           0 :     if ( pDocShell )
    3884             :     {
    3885           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    3886             : 
    3887           0 :         ScRangeList aNewRanges(aRanges);
    3888             :         sal_Bool bFound;
    3889           0 :         do
    3890             :         {
    3891           0 :             bFound = false;
    3892             : 
    3893             :             //  aMarkData uses aNewRanges, not aRanges, so GetMarkData can't be used
    3894           0 :             ScMarkData aMarkData;
    3895           0 :             aMarkData.MarkFromRangeList( aNewRanges, false );
    3896           0 :             aMarkData.MarkToMulti();        // needed for IsAllMarked
    3897             : 
    3898           0 :             SCTAB nTab = lcl_FirstTab(aNewRanges);              //! alle Tabellen
    3899             : 
    3900           0 :             ScCellIterator aCellIter( pDoc, 0,0, nTab, MAXCOL,MAXROW, nTab );
    3901           0 :             ScBaseCell* pCell = aCellIter.GetFirst();
    3902           0 :             while (pCell)
    3903             :             {
    3904           0 :                 if (pCell->GetCellType() == CELLTYPE_FORMULA)
    3905             :                 {
    3906           0 :                     sal_Bool bMark = false;
    3907           0 :                     ScDetectiveRefIter aIter( (ScFormulaCell*) pCell );
    3908           0 :                     ScRange aRefRange;
    3909           0 :                     while ( aIter.GetNextRef( aRefRange) )
    3910             :                     {
    3911           0 :                         size_t nRangesCount = aNewRanges.size();
    3912           0 :                         for (size_t nR = 0; nR < nRangesCount; ++nR)
    3913             :                         {
    3914           0 :                             ScRange aRange( *aNewRanges[ nR ] );
    3915           0 :                             if (aRange.Intersects(aRefRange))
    3916           0 :                                 bMark = sal_True;                   // von Teil des Ranges abhaengig
    3917             :                         }
    3918             :                     }
    3919           0 :                     if (bMark)
    3920             :                     {
    3921           0 :                         ScRange aCellRange( aCellIter.GetCol(),
    3922             :                                             aCellIter.GetRow(),
    3923           0 :                                             aCellIter.GetTab() );
    3924           0 :                         if ( bRecursive && !bFound && !aMarkData.IsAllMarked( aCellRange ) )
    3925           0 :                             bFound = sal_True;
    3926           0 :                         aMarkData.SetMultiMarkArea( aCellRange, sal_True );
    3927             :                     }
    3928             :                 }
    3929           0 :                 pCell = aCellIter.GetNext();
    3930             :             }
    3931             : 
    3932           0 :             aMarkData.FillRangeListWithMarks( &aNewRanges, sal_True );
    3933             :         }
    3934             :         while ( bRecursive && bFound );
    3935             : 
    3936           0 :         return new ScCellRangesObj( pDocShell, aNewRanges );
    3937             :     }
    3938             : 
    3939           0 :     return NULL;
    3940             : }
    3941             : 
    3942             : // XSearchable
    3943             : 
    3944           0 : uno::Reference<util::XSearchDescriptor> SAL_CALL ScCellRangesBase::createSearchDescriptor()
    3945             :                                                             throw(uno::RuntimeException)
    3946             : {
    3947           0 :     SolarMutexGuard aGuard;
    3948           0 :     return new ScCellSearchObj;
    3949             : }
    3950             : 
    3951           0 : uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangesBase::findAll(
    3952             :                         const uno::Reference<util::XSearchDescriptor>& xDesc )
    3953             :                                                     throw(uno::RuntimeException)
    3954             : {
    3955           0 :     SolarMutexGuard aGuard;
    3956             :     //  Wenn nichts gefunden wird, soll Null zurueckgegeben werden (?)
    3957           0 :     uno::Reference<container::XIndexAccess> xRet;
    3958           0 :     if ( pDocShell && xDesc.is() )
    3959             :     {
    3960           0 :         ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc );
    3961           0 :         if (pSearch)
    3962             :         {
    3963           0 :             SvxSearchItem* pSearchItem = pSearch->GetSearchItem();
    3964           0 :             if (pSearchItem)
    3965             :             {
    3966           0 :                 ScDocument* pDoc = pDocShell->GetDocument();
    3967           0 :                 pSearchItem->SetCommand( SVX_SEARCHCMD_FIND_ALL );
    3968             :                 //  immer nur innerhalb dieses Objekts
    3969           0 :                 pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) );
    3970             : 
    3971           0 :                 ScMarkData aMark(*GetMarkData());
    3972             : 
    3973           0 :                 rtl::OUString aDummyUndo;
    3974           0 :                 ScRangeList aMatchedRanges;
    3975           0 :                 SCCOL nCol = 0;
    3976           0 :                 SCROW nRow = 0;
    3977           0 :                 SCTAB nTab = 0;
    3978             :                 bool bFound = pDoc->SearchAndReplace(
    3979           0 :                     *pSearchItem, nCol, nRow, nTab, aMark, aMatchedRanges, aDummyUndo, NULL);
    3980           0 :                 if (bFound)
    3981             :                 {
    3982             :                     //  bei findAll immer CellRanges, egal wieviel gefunden wurde
    3983           0 :                     xRet.set(new ScCellRangesObj( pDocShell, aMatchedRanges ));
    3984           0 :                 }
    3985             :             }
    3986             :         }
    3987             :     }
    3988           0 :     return xRet;
    3989             : }
    3990             : 
    3991           0 : uno::Reference<uno::XInterface> ScCellRangesBase::Find_Impl(
    3992             :                                     const uno::Reference<util::XSearchDescriptor>& xDesc,
    3993             :                                     const ScAddress* pLastPos )
    3994             : {
    3995           0 :     uno::Reference<uno::XInterface> xRet;
    3996           0 :     if ( pDocShell && xDesc.is() )
    3997             :     {
    3998           0 :         ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc );
    3999           0 :         if (pSearch)
    4000             :         {
    4001           0 :             SvxSearchItem* pSearchItem = pSearch->GetSearchItem();
    4002           0 :             if (pSearchItem)
    4003             :             {
    4004           0 :                 ScDocument* pDoc = pDocShell->GetDocument();
    4005           0 :                 pSearchItem->SetCommand( SVX_SEARCHCMD_FIND );
    4006             :                 //  immer nur innerhalb dieses Objekts
    4007           0 :                 pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) );
    4008             : 
    4009           0 :                 ScMarkData aMark(*GetMarkData());
    4010             : 
    4011             :                 SCCOL nCol;
    4012             :                 SCROW nRow;
    4013             :                 SCTAB nTab;
    4014           0 :                 if (pLastPos)
    4015           0 :                     pLastPos->GetVars( nCol, nRow, nTab );
    4016             :                 else
    4017             :                 {
    4018           0 :                     nTab = lcl_FirstTab(aRanges);   //! mehrere Tabellen?
    4019           0 :                     ScDocument::GetSearchAndReplaceStart( *pSearchItem, nCol, nRow );
    4020             :                 }
    4021             : 
    4022           0 :                 rtl::OUString aDummyUndo;
    4023           0 :                 ScRangeList aMatchedRanges;
    4024             :                 bool bFound = pDoc->SearchAndReplace(
    4025           0 :                     *pSearchItem, nCol, nRow, nTab, aMark, aMatchedRanges, aDummyUndo, NULL);
    4026           0 :                 if (bFound)
    4027             :                 {
    4028           0 :                     ScAddress aFoundPos( nCol, nRow, nTab );
    4029           0 :                     xRet.set((cppu::OWeakObject*) new ScCellObj( pDocShell, aFoundPos ));
    4030           0 :                 }
    4031             :             }
    4032             :         }
    4033             :     }
    4034           0 :     return xRet;
    4035             : }
    4036             : 
    4037           0 : uno::Reference<uno::XInterface> SAL_CALL ScCellRangesBase::findFirst(
    4038             :                         const uno::Reference<util::XSearchDescriptor>& xDesc )
    4039             :                                                 throw(uno::RuntimeException)
    4040             : {
    4041           0 :     SolarMutexGuard aGuard;
    4042           0 :     return Find_Impl( xDesc, NULL );
    4043             : }
    4044             : 
    4045           0 : uno::Reference<uno::XInterface> SAL_CALL ScCellRangesBase::findNext(
    4046             :                         const uno::Reference<uno::XInterface>& xStartAt,
    4047             :                         const uno::Reference<util::XSearchDescriptor >& xDesc )
    4048             :                                                 throw(uno::RuntimeException)
    4049             : {
    4050           0 :     SolarMutexGuard aGuard;
    4051           0 :     if ( xStartAt.is() )
    4052             :     {
    4053           0 :         ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xStartAt );
    4054           0 :         if ( pRangesImp && pRangesImp->GetDocShell() == pDocShell )
    4055             :         {
    4056           0 :             const ScRangeList& rStartRanges = pRangesImp->GetRangeList();
    4057           0 :             if ( rStartRanges.size() == 1 )
    4058             :             {
    4059           0 :                 ScAddress aStartPos = rStartRanges[ 0 ]->aStart;
    4060           0 :                 return Find_Impl( xDesc, &aStartPos );
    4061             :             }
    4062             :         }
    4063             :     }
    4064           0 :     return NULL;
    4065             : }
    4066             : 
    4067             : // XReplaceable
    4068             : 
    4069           0 : uno::Reference<util::XReplaceDescriptor> SAL_CALL ScCellRangesBase::createReplaceDescriptor()
    4070             :                                                 throw(uno::RuntimeException)
    4071             : {
    4072           0 :     SolarMutexGuard aGuard;
    4073           0 :     return new ScCellSearchObj;
    4074             : }
    4075             : 
    4076           0 : sal_Int32 SAL_CALL ScCellRangesBase::replaceAll( const uno::Reference<util::XSearchDescriptor>& xDesc )
    4077             :                                                 throw(uno::RuntimeException)
    4078             : {
    4079           0 :     SolarMutexGuard aGuard;
    4080           0 :     sal_Int32 nReplaced = 0;
    4081           0 :     if ( pDocShell && xDesc.is() )
    4082             :     {
    4083           0 :         ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc );
    4084           0 :         if (pSearch)
    4085             :         {
    4086           0 :             SvxSearchItem* pSearchItem = pSearch->GetSearchItem();
    4087           0 :             if (pSearchItem)
    4088             :             {
    4089           0 :                 ScDocument* pDoc = pDocShell->GetDocument();
    4090           0 :                 sal_Bool bUndo(pDoc->IsUndoEnabled());
    4091           0 :                 pSearchItem->SetCommand( SVX_SEARCHCMD_REPLACE_ALL );
    4092             :                 //  immer nur innerhalb dieses Objekts
    4093           0 :                 pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) );
    4094             : 
    4095           0 :                 ScMarkData aMark(*GetMarkData());
    4096             : 
    4097           0 :                 SCTAB nTabCount = pDoc->GetTableCount();
    4098           0 :                 bool bProtected = !pDocShell->IsEditable();
    4099           0 :                 ScMarkData::iterator itr = aMark.begin(), itrEnd = aMark.end();
    4100           0 :                 for (; itr != itrEnd && *itr < nTabCount; ++itr)
    4101           0 :                     if ( pDoc->IsTabProtected(*itr) )
    4102           0 :                         bProtected = true;
    4103           0 :                 if (bProtected)
    4104             :                 {
    4105             :                     //! Exception, oder was?
    4106             :                 }
    4107             :                 else
    4108             :                 {
    4109           0 :                     SCTAB nTab = aMark.GetFirstSelected();      // bei SearchAndReplace nicht benutzt
    4110           0 :                     SCCOL nCol = 0;
    4111           0 :                     SCROW nRow = 0;
    4112             : 
    4113           0 :                     rtl::OUString aUndoStr;
    4114           0 :                     ScDocument* pUndoDoc = NULL;
    4115           0 :                     if (bUndo)
    4116             :                     {
    4117           0 :                         pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
    4118           0 :                         pUndoDoc->InitUndo( pDoc, nTab, nTab );
    4119             :                     }
    4120           0 :                     itr = aMark.begin();
    4121           0 :                     for (; itr != itrEnd && *itr < nTabCount; ++itr)
    4122           0 :                         if ( *itr != nTab && bUndo)
    4123           0 :                             pUndoDoc->AddUndoTab( *itr, *itr );
    4124           0 :                     ScMarkData* pUndoMark = NULL;
    4125           0 :                     if (bUndo)
    4126           0 :                         pUndoMark = new ScMarkData(aMark);
    4127             : 
    4128           0 :                     bool bFound = false;
    4129           0 :                     if (bUndo)
    4130             :                     {
    4131           0 :                         ScRangeList aMatchedRanges;
    4132             :                         bFound = pDoc->SearchAndReplace(
    4133           0 :                             *pSearchItem, nCol, nRow, nTab, aMark, aMatchedRanges, aUndoStr, pUndoDoc );
    4134             :                     }
    4135           0 :                     if (bFound)
    4136             :                     {
    4137           0 :                         nReplaced = pUndoDoc->GetCellCount();
    4138             : 
    4139           0 :                         pDocShell->GetUndoManager()->AddUndoAction(
    4140             :                             new ScUndoReplace( pDocShell, *pUndoMark, nCol, nRow, nTab,
    4141           0 :                                                         aUndoStr, pUndoDoc, pSearchItem ) );
    4142             : 
    4143           0 :                         pDocShell->PostPaintGridAll();
    4144           0 :                         pDocShell->SetDocumentModified();
    4145             :                     }
    4146             :                     else
    4147             :                     {
    4148           0 :                         delete pUndoDoc;
    4149           0 :                         delete pUndoMark;
    4150             :                         // nReplaced bleibt 0
    4151           0 :                     }
    4152           0 :                 }
    4153             :             }
    4154             :         }
    4155             :     }
    4156           0 :     return nReplaced;
    4157             : }
    4158             : 
    4159             : // XUnoTunnel
    4160             : 
    4161           2 : sal_Int64 SAL_CALL ScCellRangesBase::getSomething(
    4162             :                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
    4163             : {
    4164           4 :     if ( rId.getLength() == 16 &&
    4165           2 :           0 == memcmp( getUnoTunnelId().getConstArray(),
    4166           4 :                                     rId.getConstArray(), 16 ) )
    4167             :     {
    4168           2 :         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
    4169             :     }
    4170           0 :     return 0;
    4171             : }
    4172             : 
    4173             : namespace
    4174             : {
    4175             :     class theScCellRangesBaseUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScCellRangesBaseUnoTunnelId> {};
    4176             : }
    4177             : 
    4178           4 : const uno::Sequence<sal_Int8>& ScCellRangesBase::getUnoTunnelId()
    4179             : {
    4180           4 :     return theScCellRangesBaseUnoTunnelId::get().getSeq();
    4181             : }
    4182             : 
    4183           2 : ScCellRangesBase* ScCellRangesBase::getImplementation( const uno::Reference<uno::XInterface> xObj )
    4184             : {
    4185           2 :     ScCellRangesBase* pRet = NULL;
    4186           2 :     uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
    4187           2 :     if (xUT.is())
    4188           2 :         pRet = reinterpret_cast<ScCellRangesBase*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
    4189           2 :     return pRet;
    4190             : }
    4191             : 
    4192             : //------------------------------------------------------------------------
    4193             : 
    4194             : typedef boost::ptr_vector<ScNamedEntry> ScNamedEntryArr_Impl;
    4195             : 
    4196         398 : struct ScCellRangesObj::Impl
    4197             : {
    4198             :     ScNamedEntryArr_Impl m_aNamedEntries;
    4199             : };
    4200             : 
    4201         199 : ScCellRangesObj::ScCellRangesObj(ScDocShell* pDocSh, const ScRangeList& rR)
    4202             :     : ScCellRangesBase(pDocSh, rR)
    4203         199 :     , m_pImpl(new Impl)
    4204             : {
    4205         199 : }
    4206             : 
    4207         398 : ScCellRangesObj::~ScCellRangesObj()
    4208             : {
    4209         398 : }
    4210             : 
    4211         461 : void ScCellRangesObj::RefChanged()
    4212             : {
    4213         461 :     ScCellRangesBase::RefChanged();
    4214             : 
    4215             :     //  nix weiter...
    4216         461 : }
    4217             : 
    4218         497 : uno::Any SAL_CALL ScCellRangesObj::queryInterface( const uno::Type& rType )
    4219             :                                                 throw(uno::RuntimeException)
    4220             : {
    4221         497 :     SC_QUERYINTERFACE( sheet::XSheetCellRangeContainer )
    4222         302 :     SC_QUERYINTERFACE( sheet::XSheetCellRanges )
    4223         298 :     SC_QUERYINTERFACE( container::XIndexAccess )
    4224         298 :     SC_QUERY_MULTIPLE( container::XElementAccess, container::XIndexAccess )
    4225         298 :     SC_QUERYINTERFACE( container::XEnumerationAccess )
    4226         298 :     SC_QUERYINTERFACE( container::XNameContainer )
    4227         298 :     SC_QUERYINTERFACE( container::XNameReplace )
    4228         298 :     SC_QUERYINTERFACE( container::XNameAccess )
    4229             : 
    4230         298 :     return ScCellRangesBase::queryInterface( rType );
    4231             : }
    4232             : 
    4233        1693 : void SAL_CALL ScCellRangesObj::acquire() throw()
    4234             : {
    4235        1693 :     ScCellRangesBase::acquire();
    4236        1693 : }
    4237             : 
    4238        1693 : void SAL_CALL ScCellRangesObj::release() throw()
    4239             : {
    4240        1693 :     ScCellRangesBase::release();
    4241        1693 : }
    4242             : 
    4243           0 : uno::Sequence<uno::Type> SAL_CALL ScCellRangesObj::getTypes() throw(uno::RuntimeException)
    4244             : {
    4245           0 :     static uno::Sequence<uno::Type> aTypes;
    4246           0 :     if ( aTypes.getLength() == 0 )
    4247             :     {
    4248           0 :         uno::Sequence<uno::Type> aParentTypes(ScCellRangesBase::getTypes());
    4249           0 :         long nParentLen = aParentTypes.getLength();
    4250           0 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    4251             : 
    4252           0 :         aTypes.realloc( nParentLen + 3 );
    4253           0 :         uno::Type* pPtr = aTypes.getArray();
    4254           0 :         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSheetCellRangeContainer>*)0);
    4255           0 :         pPtr[nParentLen + 1] = getCppuType((const uno::Reference<container::XNameContainer>*)0);
    4256           0 :         pPtr[nParentLen + 2] = getCppuType((const uno::Reference<container::XEnumerationAccess>*)0);
    4257             : 
    4258           0 :         for (long i=0; i<nParentLen; i++)
    4259           0 :             pPtr[i] = pParentPtr[i];                // parent types first
    4260             :     }
    4261           0 :     return aTypes;
    4262             : }
    4263             : 
    4264             : namespace
    4265             : {
    4266             :     class theScCellRangesObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScCellRangesObjImplementationId > {};
    4267             : }
    4268             : 
    4269           2 : uno::Sequence<sal_Int8> SAL_CALL ScCellRangesObj::getImplementationId()
    4270             :                                                     throw(uno::RuntimeException)
    4271             : {
    4272           2 :     return theScCellRangesObjImplementationId::get().getSeq();
    4273             : }
    4274             : 
    4275             : // XCellRanges
    4276             : 
    4277           0 : ScCellRangeObj* ScCellRangesObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const
    4278             : {
    4279           0 :     ScDocShell* pDocSh = GetDocShell();
    4280           0 :     const ScRangeList& rRanges = GetRangeList();
    4281           0 :     if ( pDocSh && nIndex >= 0 && nIndex < sal::static_int_cast<sal_Int32>(rRanges.size()) )
    4282             :     {
    4283           0 :         ScRange aRange( *rRanges[ nIndex ] );
    4284           0 :         if ( aRange.aStart == aRange.aEnd )
    4285           0 :             return new ScCellObj( pDocSh, aRange.aStart );
    4286             :         else
    4287           0 :             return new ScCellRangeObj( pDocSh, aRange );
    4288             :     }
    4289             : 
    4290           0 :     return NULL;        // keine DocShell oder falscher Index
    4291             : }
    4292             : 
    4293          98 : uno::Sequence<table::CellRangeAddress> SAL_CALL ScCellRangesObj::getRangeAddresses()
    4294             :                                                     throw(uno::RuntimeException)
    4295             : {
    4296          98 :     SolarMutexGuard aGuard;
    4297          98 :     ScDocShell* pDocSh = GetDocShell();
    4298          98 :     const ScRangeList& rRanges = GetRangeList();
    4299          98 :     size_t nCount = rRanges.size();
    4300          98 :     if ( pDocSh && nCount )
    4301             :     {
    4302          98 :         table::CellRangeAddress aRangeAddress;
    4303          98 :         uno::Sequence<table::CellRangeAddress> aSeq(nCount);
    4304          98 :         table::CellRangeAddress* pAry = aSeq.getArray();
    4305         204 :         for ( size_t i=0; i < nCount; i++)
    4306             :         {
    4307         106 :             ScUnoConversion::FillApiRange( aRangeAddress, *rRanges[ i ] );
    4308         106 :             pAry[i] = aRangeAddress;
    4309             :         }
    4310          98 :         return aSeq;
    4311             :     }
    4312             : 
    4313           0 :     return uno::Sequence<table::CellRangeAddress>(0);   // leer ist moeglich
    4314             : }
    4315             : 
    4316           2 : uno::Reference<container::XEnumerationAccess> SAL_CALL ScCellRangesObj::getCells()
    4317             :                                                     throw(uno::RuntimeException)
    4318             : {
    4319           2 :     SolarMutexGuard aGuard;
    4320             : 
    4321             :     //  getCells with empty range list is possible (no exception),
    4322             :     //  the resulting enumeration just has no elements
    4323             :     //  (same behaviour as a valid range with no cells)
    4324             :     //  This is handled in ScCellsEnumeration ctor.
    4325             : 
    4326           2 :     const ScRangeList& rRanges = GetRangeList();
    4327           2 :     ScDocShell* pDocSh = GetDocShell();
    4328           2 :     if (pDocSh)
    4329           2 :         return new ScCellsObj( pDocSh, rRanges );
    4330           0 :     return NULL;
    4331             : }
    4332             : 
    4333           0 : rtl::OUString SAL_CALL ScCellRangesObj::getRangeAddressesAsString()
    4334             :                                                 throw(uno::RuntimeException)
    4335             : {
    4336           0 :     SolarMutexGuard aGuard;
    4337           0 :     String aString;
    4338           0 :     ScDocShell* pDocSh = GetDocShell();
    4339           0 :     const ScRangeList& rRanges = GetRangeList();
    4340           0 :     if (pDocSh)
    4341           0 :         rRanges.Format( aString, SCA_VALID | SCA_TAB_3D, pDocSh->GetDocument() );
    4342           0 :     return aString;
    4343             : }
    4344             : 
    4345             : // XSheetCellRangeContainer
    4346             : 
    4347         461 : void SAL_CALL ScCellRangesObj::addRangeAddress( const table::CellRangeAddress& rRange,
    4348             :                                     sal_Bool bMergeRanges )
    4349             :                                     throw(::com::sun::star::uno::RuntimeException)
    4350             : {
    4351         461 :     SolarMutexGuard aGuard;
    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         461 :             static_cast<SCTAB>(rRange.Sheet));
    4358         461 :     AddRange(aRange, bMergeRanges);
    4359         461 : }
    4360             : 
    4361           0 : static void lcl_RemoveNamedEntry( ScNamedEntryArr_Impl& rNamedEntries, const ScRange& rRange )
    4362             : {
    4363           0 :     sal_uInt16 nCount = rNamedEntries.size();
    4364           0 :     for ( sal_uInt16 n=nCount; n--; )
    4365           0 :         if ( rNamedEntries[n].GetRange() == rRange )
    4366           0 :             rNamedEntries.erase( rNamedEntries.begin() + n );
    4367           0 : }
    4368             : 
    4369           0 : void SAL_CALL ScCellRangesObj::removeRangeAddress( const table::CellRangeAddress& rRange )
    4370             :                                 throw(::com::sun::star::container::NoSuchElementException,
    4371             :                                     ::com::sun::star::uno::RuntimeException)
    4372             : {
    4373           0 :     SolarMutexGuard aGuard;
    4374           0 :     const ScRangeList& rRanges = GetRangeList();
    4375             : 
    4376           0 :     ScRangeList aSheetRanges;
    4377           0 :     ScRangeList aNotSheetRanges;
    4378           0 :     for (size_t i = 0; i < rRanges.size(); ++i)
    4379             :     {
    4380           0 :         if (rRanges[ i]->aStart.Tab() == rRange.Sheet)
    4381             :         {
    4382           0 :             aSheetRanges.Append( *rRanges[ i ] );
    4383             :         }
    4384             :         else
    4385             :         {
    4386           0 :             aNotSheetRanges.Append( *rRanges[ i ] );
    4387             :         }
    4388             :     }
    4389           0 :     ScMarkData aMarkData;
    4390           0 :     aMarkData.MarkFromRangeList( aSheetRanges, false );
    4391             :     ScRange aRange(static_cast<SCCOL>(rRange.StartColumn),
    4392             :                 static_cast<SCROW>(rRange.StartRow),
    4393             :                 static_cast<SCTAB>(rRange.Sheet),
    4394             :                 static_cast<SCCOL>(rRange.EndColumn),
    4395             :                 static_cast<SCROW>(rRange.EndRow),
    4396           0 :                 static_cast<SCTAB>(rRange.Sheet));
    4397           0 :     if (aMarkData.GetTableSelect( aRange.aStart.Tab() ))
    4398             :     {
    4399           0 :         aMarkData.MarkToMulti();
    4400           0 :         if (aMarkData.IsAllMarked( aRange ) )
    4401             :         {
    4402           0 :             aMarkData.SetMultiMarkArea( aRange, false );
    4403           0 :             lcl_RemoveNamedEntry(m_pImpl->m_aNamedEntries, aRange);
    4404             :         }
    4405             :         else
    4406           0 :             throw container::NoSuchElementException();
    4407             :     }
    4408           0 :     SetNewRanges(aNotSheetRanges);
    4409           0 :     ScRangeList aNew;
    4410           0 :     aMarkData.FillRangeListWithMarks( &aNew, false );
    4411           0 :     for ( size_t j = 0; j < aNew.size(); ++j)
    4412             :     {
    4413           0 :         AddRange(*aNew[ j ], false);
    4414           0 :     }
    4415           0 : }
    4416             : 
    4417           0 : void SAL_CALL ScCellRangesObj::addRangeAddresses( const uno::Sequence<table::CellRangeAddress >& rRanges,
    4418             :                                     sal_Bool bMergeRanges )
    4419             :                                     throw(::com::sun::star::uno::RuntimeException)
    4420             : {
    4421           0 :     SolarMutexGuard aGuard;
    4422           0 :     sal_Int32 nCount(rRanges.getLength());
    4423           0 :     if (nCount)
    4424             :     {
    4425           0 :         const table::CellRangeAddress* pRanges = rRanges.getConstArray();
    4426           0 :         for (sal_Int32 i = 0; i < rRanges.getLength(); i++, pRanges++)
    4427             :         {
    4428             :             ScRange aRange(static_cast<SCCOL>(pRanges->StartColumn),
    4429             :                     static_cast<SCROW>(pRanges->StartRow),
    4430             :                     static_cast<SCTAB>(pRanges->Sheet),
    4431             :                     static_cast<SCCOL>(pRanges->EndColumn),
    4432             :                     static_cast<SCROW>(pRanges->EndRow),
    4433           0 :                     static_cast<SCTAB>(pRanges->Sheet));
    4434           0 :             AddRange(aRange, bMergeRanges);
    4435             :         }
    4436           0 :     }
    4437           0 : }
    4438             : 
    4439           0 : void SAL_CALL ScCellRangesObj::removeRangeAddresses( const uno::Sequence<table::CellRangeAddress >& rRangeSeq )
    4440             :                                 throw(::com::sun::star::container::NoSuchElementException,
    4441             :                                     ::com::sun::star::uno::RuntimeException)
    4442             : {
    4443             :     // use sometimes a better/faster implementation
    4444           0 :     sal_uInt32 nCount(rRangeSeq.getLength());
    4445           0 :     if (nCount)
    4446             :     {
    4447           0 :         const table::CellRangeAddress* pRanges = rRangeSeq.getConstArray();
    4448           0 :         for (sal_uInt32 i=0; i < nCount; ++i, ++pRanges)
    4449             :         {
    4450           0 :             removeRangeAddress(*pRanges);
    4451             :         }
    4452             :     }
    4453           0 : }
    4454             : 
    4455             : // XNameContainer
    4456             : 
    4457           0 : static void lcl_RemoveNamedEntry( ScNamedEntryArr_Impl& rNamedEntries, const String& rName )
    4458             : {
    4459           0 :     sal_uInt16 nCount = rNamedEntries.size();
    4460           0 :     for ( sal_uInt16 n=nCount; n--; )
    4461           0 :         if ( rNamedEntries[n].GetName() == rName )
    4462           0 :             rNamedEntries.erase( rNamedEntries.begin() + n );
    4463           0 : }
    4464             : 
    4465           0 : void SAL_CALL ScCellRangesObj::insertByName( const rtl::OUString& aName, const uno::Any& aElement )
    4466             :                             throw(lang::IllegalArgumentException, container::ElementExistException,
    4467             :                                     lang::WrappedTargetException, uno::RuntimeException)
    4468             : {
    4469           0 :     SolarMutexGuard aGuard;
    4470           0 :     ScDocShell* pDocSh = GetDocShell();
    4471           0 :     sal_Bool bDone = false;
    4472             : 
    4473             :     //! Type of aElement can be some specific interface instead of XInterface
    4474             : 
    4475           0 :     uno::Reference<uno::XInterface> xInterface(aElement, uno::UNO_QUERY);
    4476           0 :     if ( pDocSh && xInterface.is() )
    4477             :     {
    4478           0 :         ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xInterface );
    4479           0 :         if ( pRangesImp && pRangesImp->GetDocShell() == pDocSh )
    4480             :         {
    4481             :             //  if explicit name is given and already existing, throw exception
    4482             : 
    4483           0 :             String aNamStr(aName);
    4484           0 :             if ( aNamStr.Len() )
    4485             :             {
    4486           0 :                 size_t nNamedCount = m_pImpl->m_aNamedEntries.size();
    4487           0 :                 for (size_t n = 0; n < nNamedCount; n++)
    4488             :                 {
    4489           0 :                     if (m_pImpl->m_aNamedEntries[n].GetName() == aNamStr)
    4490           0 :                         throw container::ElementExistException();
    4491             :                 }
    4492             :             }
    4493             : 
    4494           0 :             ScRangeList aNew(GetRangeList());
    4495           0 :             const ScRangeList& rAddRanges = pRangesImp->GetRangeList();
    4496           0 :             size_t nAddCount = rAddRanges.size();
    4497           0 :             for ( size_t i = 0; i < nAddCount; i++ )
    4498           0 :                 aNew.Join( *rAddRanges[ i ] );
    4499           0 :             SetNewRanges(aNew);
    4500           0 :             bDone = sal_True;
    4501             : 
    4502           0 :             if ( !aName.isEmpty() && nAddCount == 1 )
    4503             :             {
    4504             :                 //  if a name is given, also insert into list of named entries
    4505             :                 //  (only possible for a single range)
    4506             :                 //  name is not in m_pImpl->m_aNamedEntries (tested above)
    4507             : 
    4508           0 :                 ScNamedEntry* pEntry = new ScNamedEntry( aNamStr, *rAddRanges[ 0 ] );
    4509           0 :                 m_pImpl->m_aNamedEntries.push_back(pEntry);
    4510           0 :             }
    4511             :         }
    4512             :     }
    4513             : 
    4514           0 :     if (!bDone)
    4515             :     {
    4516             :         //  invalid element - double names are handled above
    4517           0 :         throw lang::IllegalArgumentException();
    4518           0 :     }
    4519           0 : }
    4520             : 
    4521           0 : static sal_Bool lcl_FindRangeByName( const ScRangeList& rRanges, ScDocShell* pDocSh,
    4522             :                             const String& rName, size_t& rIndex )
    4523             : {
    4524           0 :     if (pDocSh)
    4525             :     {
    4526           0 :         String aRangeStr;
    4527           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    4528           0 :         for ( size_t i = 0, nCount = rRanges.size(); i < nCount; i++ )
    4529             :         {
    4530           0 :             rRanges[ i ]->Format( aRangeStr, SCA_VALID | SCA_TAB_3D, pDoc );
    4531           0 :             if ( aRangeStr == rName )
    4532             :             {
    4533           0 :                 rIndex = i;
    4534           0 :                 return sal_True;
    4535             :             }
    4536           0 :         }
    4537             :     }
    4538           0 :     return false;   // nicht gefunden
    4539             : }
    4540             : 
    4541           0 : static sal_Bool lcl_FindRangeOrEntry( const ScNamedEntryArr_Impl& rNamedEntries,
    4542             :                             const ScRangeList& rRanges, ScDocShell* pDocSh,
    4543             :                             const String& rName, ScRange& rFound )
    4544             : {
    4545             :     //  exact range in list?
    4546             : 
    4547           0 :     size_t nIndex = 0;
    4548           0 :     if ( lcl_FindRangeByName( rRanges, pDocSh, rName, nIndex ) )
    4549             :     {
    4550           0 :         rFound = *rRanges[ nIndex ];
    4551           0 :         return true;
    4552             :     }
    4553             : 
    4554             :     //  range contained in selection? (sheet must be specified)
    4555             : 
    4556           0 :     ScRange aCellRange;
    4557           0 :     sal_uInt16 nParse = aCellRange.ParseAny( rName, pDocSh->GetDocument() );
    4558           0 :     if ( ( nParse & ( SCA_VALID | SCA_TAB_3D ) ) == ( SCA_VALID | SCA_TAB_3D ) )
    4559             :     {
    4560           0 :         ScMarkData aMarkData;
    4561           0 :         aMarkData.MarkFromRangeList( rRanges, false );
    4562           0 :         aMarkData.MarkToMulti();        // needed for IsAllMarked
    4563           0 :         if ( aMarkData.IsAllMarked( aCellRange ) )
    4564             :         {
    4565           0 :             rFound = aCellRange;
    4566           0 :             return sal_True;
    4567           0 :         }
    4568             :     }
    4569             : 
    4570             :     //  named entry in this object?
    4571             : 
    4572           0 :     if ( !rNamedEntries.empty() )
    4573             :     {
    4574           0 :         for ( sal_uInt16 n=0; n<rNamedEntries.size(); n++ )
    4575           0 :             if ( rNamedEntries[n].GetName() == rName )
    4576             :             {
    4577             :                 //  test if named entry is contained in rRanges
    4578             : 
    4579           0 :                 const ScRange& rComp = rNamedEntries[n].GetRange();
    4580           0 :                 ScMarkData aMarkData;
    4581           0 :                 aMarkData.MarkFromRangeList( rRanges, false );
    4582           0 :                 aMarkData.MarkToMulti();        // needed for IsAllMarked
    4583           0 :                 if ( aMarkData.IsAllMarked( rComp ) )
    4584             :                 {
    4585           0 :                     rFound = rComp;
    4586           0 :                     return sal_True;
    4587           0 :                 }
    4588             :             }
    4589             :     }
    4590             : 
    4591           0 :     return false;       // not found
    4592             : }
    4593             : 
    4594           0 : void SAL_CALL ScCellRangesObj::removeByName( const rtl::OUString& aName )
    4595             :                                 throw(container::NoSuchElementException,
    4596             :                                     lang::WrappedTargetException, uno::RuntimeException)
    4597             : {
    4598           0 :     SolarMutexGuard aGuard;
    4599           0 :     sal_Bool bDone = false;
    4600           0 :     String aNameStr(aName);
    4601           0 :     ScDocShell* pDocSh = GetDocShell();
    4602           0 :     const ScRangeList& rRanges = GetRangeList();
    4603           0 :     size_t nIndex = 0;
    4604           0 :     if ( lcl_FindRangeByName( rRanges, pDocSh, aNameStr, nIndex ) )
    4605             :     {
    4606             :         //  einzelnen Range weglassen
    4607           0 :         ScRangeList aNew;
    4608           0 :         for ( size_t i = 0, nCount = rRanges.size(); i < nCount; i++ )
    4609           0 :             if (i != nIndex)
    4610           0 :                 aNew.Append( *rRanges[ i ] );
    4611           0 :         SetNewRanges(aNew);
    4612           0 :         bDone = sal_True;
    4613             :     }
    4614           0 :     else if (pDocSh)
    4615             :     {
    4616             :         //  deselect any ranges (parsed or named entry)
    4617           0 :         ScRangeList aDiff;
    4618           0 :         sal_Bool bValid = ( aDiff.Parse( aNameStr, pDocSh->GetDocument() ) & SCA_VALID ) != 0;
    4619           0 :         if (!bValid && !m_pImpl->m_aNamedEntries.empty())
    4620             :         {
    4621           0 :             sal_uInt16 nCount = m_pImpl->m_aNamedEntries.size();
    4622           0 :             for (sal_uInt16 n=0; n<nCount && !bValid; n++)
    4623           0 :                 if (m_pImpl->m_aNamedEntries[n].GetName() == aNameStr)
    4624             :                 {
    4625           0 :                     aDiff.RemoveAll();
    4626           0 :                     aDiff.Append(m_pImpl->m_aNamedEntries[n].GetRange());
    4627           0 :                     bValid = sal_True;
    4628             :                 }
    4629             :         }
    4630           0 :         if ( bValid )
    4631             :         {
    4632           0 :             ScMarkData aMarkData;
    4633           0 :             aMarkData.MarkFromRangeList( rRanges, false );
    4634             : 
    4635           0 :             for ( size_t i = 0, nDiffCount = aDiff.size(); i < nDiffCount; i++ )
    4636             :             {
    4637           0 :                 ScRange* pDiffRange = aDiff[ i ];
    4638           0 :                 if (aMarkData.GetTableSelect( pDiffRange->aStart.Tab() ))
    4639           0 :                     aMarkData.SetMultiMarkArea( *pDiffRange, false );
    4640             :             }
    4641             : 
    4642           0 :             ScRangeList aNew;
    4643           0 :             aMarkData.FillRangeListWithMarks( &aNew, false );
    4644           0 :             SetNewRanges(aNew);
    4645             : 
    4646           0 :             bDone = sal_True;       //! error if range was not selected before?
    4647           0 :         }
    4648             :     }
    4649             : 
    4650           0 :     if (!m_pImpl->m_aNamedEntries.empty())
    4651           0 :         lcl_RemoveNamedEntry(m_pImpl->m_aNamedEntries, aNameStr);
    4652             : 
    4653           0 :     if (!bDone)
    4654           0 :         throw container::NoSuchElementException();      // not found
    4655           0 : }
    4656             : 
    4657             : // XNameReplace
    4658             : 
    4659           0 : void SAL_CALL ScCellRangesObj::replaceByName( const rtl::OUString& aName, const uno::Any& aElement )
    4660             :                             throw(lang::IllegalArgumentException, container::NoSuchElementException,
    4661             :                                     lang::WrappedTargetException, uno::RuntimeException)
    4662             : {
    4663           0 :     SolarMutexGuard aGuard;
    4664             :     //! zusammenfassen?
    4665           0 :     removeByName( aName );
    4666           0 :     insertByName( aName, aElement );
    4667           0 : }
    4668             : 
    4669             : // XNameAccess
    4670             : 
    4671           0 : uno::Any SAL_CALL ScCellRangesObj::getByName( const rtl::OUString& aName )
    4672             :             throw(container::NoSuchElementException,
    4673             :                     lang::WrappedTargetException, uno::RuntimeException)
    4674             : {
    4675           0 :     SolarMutexGuard aGuard;
    4676           0 :     uno::Any aRet;
    4677             : 
    4678           0 :     String aNameStr(aName);
    4679           0 :     ScDocShell* pDocSh = GetDocShell();
    4680           0 :     const ScRangeList& rRanges = GetRangeList();
    4681           0 :     ScRange aRange;
    4682           0 :     if (lcl_FindRangeOrEntry(m_pImpl->m_aNamedEntries, rRanges,
    4683           0 :                 pDocSh, aNameStr, aRange))
    4684             :     {
    4685           0 :         uno::Reference<table::XCellRange> xRange;
    4686           0 :         if ( aRange.aStart == aRange.aEnd )
    4687           0 :             xRange.set(new ScCellObj( pDocSh, aRange.aStart ));
    4688             :         else
    4689           0 :             xRange.set(new ScCellRangeObj( pDocSh, aRange ));
    4690           0 :         aRet <<= xRange;
    4691             :     }
    4692             :     else
    4693           0 :         throw container::NoSuchElementException();
    4694           0 :     return aRet;
    4695             : }
    4696             : 
    4697           0 : static sal_Bool lcl_FindEntryName( const ScNamedEntryArr_Impl& rNamedEntries,
    4698             :                         const ScRange& rRange, String& rName )
    4699             : {
    4700           0 :     sal_uInt16 nCount = rNamedEntries.size();
    4701           0 :     for (sal_uInt16 i=0; i<nCount; i++)
    4702           0 :         if (rNamedEntries[i].GetRange() == rRange)
    4703             :         {
    4704           0 :             rName = rNamedEntries[i].GetName();
    4705           0 :             return sal_True;
    4706             :         }
    4707           0 :     return false;
    4708             : }
    4709             : 
    4710           0 : uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesObj::getElementNames()
    4711             :                                                 throw(uno::RuntimeException)
    4712             : {
    4713           0 :     SolarMutexGuard aGuard;
    4714             : 
    4715           0 :     ScDocShell* pDocSh = GetDocShell();
    4716           0 :     const ScRangeList& rRanges = GetRangeList();
    4717           0 :     if (pDocSh)
    4718             :     {
    4719           0 :         String aRangeStr;
    4720           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    4721           0 :         size_t nCount = rRanges.size();
    4722             : 
    4723           0 :         uno::Sequence<rtl::OUString> aSeq(nCount);
    4724           0 :         rtl::OUString* pAry = aSeq.getArray();
    4725           0 :         for (size_t i=0; i < nCount; i++)
    4726             :         {
    4727             :             //  use given name if for exactly this range, otherwise just format
    4728           0 :             ScRange aRange = *rRanges[ i ];
    4729           0 :             if (m_pImpl->m_aNamedEntries.empty() ||
    4730           0 :                 !lcl_FindEntryName(m_pImpl->m_aNamedEntries, aRange, aRangeStr))
    4731             :             {
    4732           0 :                 aRange.Format( aRangeStr, SCA_VALID | SCA_TAB_3D, pDoc );
    4733             :             }
    4734           0 :             pAry[i] = aRangeStr;
    4735             :         }
    4736           0 :         return aSeq;
    4737             :     }
    4738           0 :     return uno::Sequence<rtl::OUString>(0);
    4739             : }
    4740             : 
    4741           0 : sal_Bool SAL_CALL ScCellRangesObj::hasByName( const rtl::OUString& aName )
    4742             :                                         throw(uno::RuntimeException)
    4743             : {
    4744           0 :     SolarMutexGuard aGuard;
    4745           0 :     String aNameStr(aName);
    4746           0 :     ScDocShell* pDocSh = GetDocShell();
    4747           0 :     const ScRangeList& rRanges = GetRangeList();
    4748           0 :     ScRange aRange;
    4749           0 :     return lcl_FindRangeOrEntry(m_pImpl->m_aNamedEntries, rRanges, pDocSh,
    4750           0 :                 aNameStr, aRange);
    4751             : }
    4752             : 
    4753             : // XEnumerationAccess
    4754             : 
    4755           0 : uno::Reference<container::XEnumeration> SAL_CALL ScCellRangesObj::createEnumeration()
    4756             :                                                     throw(uno::RuntimeException)
    4757             : {
    4758           0 :     SolarMutexGuard aGuard;
    4759           0 :     return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SheetCellRangesEnumeration")));
    4760             : }
    4761             : 
    4762             : // XIndexAccess
    4763             : 
    4764           0 : sal_Int32 SAL_CALL ScCellRangesObj::getCount() throw(uno::RuntimeException)
    4765             : {
    4766           0 :     SolarMutexGuard aGuard;
    4767           0 :     const ScRangeList& rRanges = GetRangeList();
    4768           0 :     return rRanges.size();
    4769             : }
    4770             : 
    4771           0 : uno::Any SAL_CALL ScCellRangesObj::getByIndex( sal_Int32 nIndex )
    4772             :                             throw(lang::IndexOutOfBoundsException,
    4773             :                                     lang::WrappedTargetException, uno::RuntimeException)
    4774             : {
    4775           0 :     SolarMutexGuard aGuard;
    4776           0 :     uno::Reference<table::XCellRange> xRange(GetObjectByIndex_Impl(nIndex));
    4777           0 :     if (xRange.is())
    4778           0 :         return uno::makeAny(xRange);
    4779             :     else
    4780           0 :         throw lang::IndexOutOfBoundsException();
    4781             : }
    4782             : 
    4783           0 : uno::Type SAL_CALL ScCellRangesObj::getElementType() throw(uno::RuntimeException)
    4784             : {
    4785           0 :     SolarMutexGuard aGuard;
    4786           0 :     return getCppuType((uno::Reference<table::XCellRange>*)0);
    4787             : }
    4788             : 
    4789           0 : sal_Bool SAL_CALL ScCellRangesObj::hasElements() throw(uno::RuntimeException)
    4790             : {
    4791           0 :     SolarMutexGuard aGuard;
    4792           0 :     const ScRangeList& rRanges = GetRangeList();
    4793           0 :     return !rRanges.empty();
    4794             : }
    4795             : 
    4796             : // XServiceInfo
    4797             : 
    4798           0 : rtl::OUString SAL_CALL ScCellRangesObj::getImplementationName() throw(uno::RuntimeException)
    4799             : {
    4800           0 :     return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScCellRangesObj" ));
    4801             : }
    4802             : 
    4803           0 : sal_Bool SAL_CALL ScCellRangesObj::supportsService( const rtl::OUString& rServiceName )
    4804             :                                                     throw(uno::RuntimeException)
    4805             : {
    4806           0 :     String aServiceStr(rServiceName);
    4807           0 :     return aServiceStr.EqualsAscii( SCSHEETCELLRANGES_SERVICE ) ||
    4808           0 :            aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) ||
    4809           0 :            aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) ||
    4810           0 :            aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE );
    4811             : }
    4812             : 
    4813           0 : uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesObj::getSupportedServiceNames()
    4814             :                                                     throw(uno::RuntimeException)
    4815             : {
    4816           0 :     uno::Sequence<rtl::OUString> aRet(4);
    4817           0 :     rtl::OUString* pArray = aRet.getArray();
    4818           0 :     pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELLRANGES_SERVICE ));
    4819           0 :     pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLPROPERTIES_SERVICE ));
    4820           0 :     pArray[2] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCHARPROPERTIES_SERVICE ));
    4821           0 :     pArray[3] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCPARAPROPERTIES_SERVICE ));
    4822           0 :     return aRet;
    4823             : }
    4824             : 
    4825             : //------------------------------------------------------------------------
    4826             : 
    4827           0 : uno::Reference<table::XCellRange> ScCellRangeObj::CreateRangeFromDoc( ScDocument* pDoc, const ScRange& rR )
    4828             : {
    4829           0 :     SfxObjectShell* pObjSh = pDoc->GetDocumentShell();
    4830           0 :     if ( pObjSh && pObjSh->ISA(ScDocShell) )
    4831           0 :         return new ScCellRangeObj( (ScDocShell*) pObjSh, rR );
    4832           0 :     return NULL;
    4833             : }
    4834             : 
    4835             : //------------------------------------------------------------------------
    4836             : 
    4837        1798 : ScCellRangeObj::ScCellRangeObj(ScDocShell* pDocSh, const ScRange& rR) :
    4838             :     ScCellRangesBase( pDocSh, rR ),
    4839        1798 :     pRangePropSet( lcl_GetRangePropertySet() ),
    4840        3596 :     aRange( rR )
    4841             : {
    4842        1798 :     aRange.Justify();       // Anfang / Ende richtig
    4843        1798 : }
    4844             : 
    4845        3402 : ScCellRangeObj::~ScCellRangeObj()
    4846             : {
    4847        3402 : }
    4848             : 
    4849           6 : void ScCellRangeObj::RefChanged()
    4850             : {
    4851           6 :     ScCellRangesBase::RefChanged();
    4852             : 
    4853           6 :     const ScRangeList& rRanges = GetRangeList();
    4854             :     OSL_ENSURE(rRanges.size() == 1, "was fuer Ranges ?!?!");
    4855           6 :     if ( !rRanges.empty() )
    4856             :     {
    4857           6 :         const ScRange* pFirst = rRanges[0];
    4858           6 :         aRange = ScRange(*pFirst);
    4859           6 :         aRange.Justify();
    4860             :     }
    4861           6 : }
    4862             : 
    4863        2185 : uno::Any SAL_CALL ScCellRangeObj::queryInterface( const uno::Type& rType )
    4864             :                                                 throw(uno::RuntimeException)
    4865             : {
    4866        2185 :     SC_QUERYINTERFACE( sheet::XCellRangeAddressable )
    4867        2168 :     SC_QUERYINTERFACE( table::XCellRange )
    4868        2060 :     SC_QUERYINTERFACE( sheet::XSheetCellRange )
    4869        2058 :     SC_QUERYINTERFACE( sheet::XArrayFormulaRange )
    4870        2058 :     SC_QUERYINTERFACE( sheet::XArrayFormulaTokens )
    4871        2058 :     SC_QUERYINTERFACE( sheet::XCellRangeData )
    4872        2058 :     SC_QUERYINTERFACE( sheet::XCellRangeFormula )
    4873        2058 :     SC_QUERYINTERFACE( sheet::XMultipleOperation )
    4874        2058 :     SC_QUERYINTERFACE( util::XMergeable )
    4875        2058 :     SC_QUERYINTERFACE( sheet::XCellSeries )
    4876        2058 :     SC_QUERYINTERFACE( table::XAutoFormattable )
    4877        2058 :     SC_QUERYINTERFACE( util::XSortable )
    4878        2058 :     SC_QUERYINTERFACE( sheet::XSheetFilterableEx )
    4879        2058 :     SC_QUERYINTERFACE( sheet::XSheetFilterable )
    4880        2058 :     SC_QUERYINTERFACE( sheet::XSubTotalCalculatable )
    4881        2058 :     SC_QUERYINTERFACE( table::XColumnRowRange )
    4882         518 :     SC_QUERYINTERFACE( util::XImportable )
    4883         518 :     SC_QUERYINTERFACE( sheet::XCellFormatRangesSupplier )
    4884         518 :     SC_QUERYINTERFACE( sheet::XUniqueCellFormatRangesSupplier )
    4885             : 
    4886         516 :     return ScCellRangesBase::queryInterface( rType );
    4887             : }
    4888             : 
    4889        8787 : void SAL_CALL ScCellRangeObj::acquire() throw()
    4890             : {
    4891        8787 :     ScCellRangesBase::acquire();
    4892        8787 : }
    4893             : 
    4894        8783 : void SAL_CALL ScCellRangeObj::release() throw()
    4895             : {
    4896        8783 :     ScCellRangesBase::release();
    4897        8783 : }
    4898             : 
    4899           0 : uno::Sequence<uno::Type> SAL_CALL ScCellRangeObj::getTypes() throw(uno::RuntimeException)
    4900             : {
    4901           0 :     static uno::Sequence<uno::Type> aTypes;
    4902           0 :     if ( aTypes.getLength() == 0 )
    4903             :     {
    4904           0 :         uno::Sequence<uno::Type> aParentTypes(ScCellRangesBase::getTypes());
    4905           0 :         long nParentLen = aParentTypes.getLength();
    4906           0 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    4907             : 
    4908           0 :         aTypes.realloc( nParentLen + 17 );
    4909           0 :         uno::Type* pPtr = aTypes.getArray();
    4910           0 :         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XCellRangeAddressable>*)0);
    4911           0 :         pPtr[nParentLen + 1] = getCppuType((const uno::Reference<sheet::XSheetCellRange>*)0);
    4912           0 :         pPtr[nParentLen + 2] = getCppuType((const uno::Reference<sheet::XArrayFormulaRange>*)0);
    4913           0 :         pPtr[nParentLen + 3] = getCppuType((const uno::Reference<sheet::XArrayFormulaTokens>*)0);
    4914           0 :         pPtr[nParentLen + 4] = getCppuType((const uno::Reference<sheet::XCellRangeData>*)0);
    4915           0 :         pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XCellRangeFormula>*)0);
    4916           0 :         pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XMultipleOperation>*)0);
    4917           0 :         pPtr[nParentLen + 7] = getCppuType((const uno::Reference<util::XMergeable>*)0);
    4918           0 :         pPtr[nParentLen + 8] = getCppuType((const uno::Reference<sheet::XCellSeries>*)0);
    4919           0 :         pPtr[nParentLen + 9] = getCppuType((const uno::Reference<table::XAutoFormattable>*)0);
    4920           0 :         pPtr[nParentLen +10] = getCppuType((const uno::Reference<util::XSortable>*)0);
    4921           0 :         pPtr[nParentLen +11] = getCppuType((const uno::Reference<sheet::XSheetFilterableEx>*)0);
    4922           0 :         pPtr[nParentLen +12] = getCppuType((const uno::Reference<sheet::XSubTotalCalculatable>*)0);
    4923           0 :         pPtr[nParentLen +13] = getCppuType((const uno::Reference<table::XColumnRowRange>*)0);
    4924           0 :         pPtr[nParentLen +14] = getCppuType((const uno::Reference<util::XImportable>*)0);
    4925           0 :         pPtr[nParentLen +15] = getCppuType((const uno::Reference<sheet::XCellFormatRangesSupplier>*)0);
    4926           0 :         pPtr[nParentLen +16] = getCppuType((const uno::Reference<sheet::XUniqueCellFormatRangesSupplier>*)0);
    4927             : 
    4928           0 :         for (long i=0; i<nParentLen; i++)
    4929           0 :             pPtr[i] = pParentPtr[i];                // parent types first
    4930             :     }
    4931           0 :     return aTypes;
    4932             : }
    4933             : 
    4934             : namespace
    4935             : {
    4936             :     class theScCellRangeObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScCellRangeObjImplementationId > {};
    4937             : }
    4938             : 
    4939           2 : uno::Sequence<sal_Int8> SAL_CALL ScCellRangeObj::getImplementationId()
    4940             :                                                     throw(uno::RuntimeException)
    4941             : {
    4942           2 :     return theScCellRangeObjImplementationId::get().getSeq();
    4943             : }
    4944             : 
    4945             : // XCellRange
    4946             : 
    4947             : //  ColumnCount / RowCount sind weggefallen
    4948             : //! werden im Writer fuer Tabellen noch gebraucht ???
    4949             : 
    4950          22 : uno::Reference<table::XCell> ScCellRangeObj::GetCellByPosition_Impl(
    4951             :                                         sal_Int32 nColumn, sal_Int32 nRow )
    4952             :                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
    4953             : {
    4954          22 :     ScDocShell* pDocSh = GetDocShell();
    4955          22 :     if (!pDocSh)
    4956           0 :         throw uno::RuntimeException();
    4957             : 
    4958          22 :     if ( nColumn >= 0 && nRow >= 0 )
    4959             :     {
    4960          22 :         sal_Int32 nPosX = aRange.aStart.Col() + nColumn;
    4961          22 :         sal_Int32 nPosY = aRange.aStart.Row() + nRow;
    4962             : 
    4963          22 :         if ( nPosX <= aRange.aEnd.Col() && nPosY <= aRange.aEnd.Row() )
    4964             :         {
    4965          22 :             ScAddress aNew( (SCCOL)nPosX, (SCROW)nPosY, aRange.aStart.Tab() );
    4966          44 :             return new ScCellObj( pDocSh, aNew );
    4967             :         }
    4968             :     }
    4969             : 
    4970           0 :     throw lang::IndexOutOfBoundsException();
    4971             : }
    4972             : 
    4973           0 : uno::Reference<table::XCell> SAL_CALL ScCellRangeObj::getCellByPosition(
    4974             :                                         sal_Int32 nColumn, sal_Int32 nRow )
    4975             :                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
    4976             : {
    4977           0 :     SolarMutexGuard aGuard;
    4978             : 
    4979           0 :     return GetCellByPosition_Impl(nColumn, nRow);
    4980             : }
    4981             : 
    4982        1608 : uno::Reference<table::XCellRange> SAL_CALL ScCellRangeObj::getCellRangeByPosition(
    4983             :                 sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom )
    4984             :                                     throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
    4985             : {
    4986        1608 :     SolarMutexGuard aGuard;
    4987             : 
    4988        1608 :     ScDocShell* pDocSh = GetDocShell();
    4989        1608 :     if (!pDocSh)
    4990           0 :         throw uno::RuntimeException();
    4991             : 
    4992        1608 :     if ( nLeft >= 0 && nTop >= 0 && nRight >= 0 && nBottom >= 0 )
    4993             :     {
    4994        1608 :         sal_Int32 nStartX = aRange.aStart.Col() + nLeft;
    4995        1608 :         sal_Int32 nStartY = aRange.aStart.Row() + nTop;
    4996        1608 :         sal_Int32 nEndX = aRange.aStart.Col() + nRight;
    4997        1608 :         sal_Int32 nEndY = aRange.aStart.Row() + nBottom;
    4998             : 
    4999        3216 :         if ( nStartX <= nEndX && nEndX <= aRange.aEnd.Col() &&
    5000        1608 :              nStartY <= nEndY && nEndY <= aRange.aEnd.Row() )
    5001             :         {
    5002        1608 :             ScRange aNew( (SCCOL)nStartX, (SCROW)nStartY, aRange.aStart.Tab(),
    5003        3216 :                           (SCCOL)nEndX, (SCROW)nEndY, aRange.aEnd.Tab() );
    5004        3216 :             return new ScCellRangeObj( pDocSh, aNew );
    5005             :         }
    5006             :     }
    5007             : 
    5008        1608 :     throw lang::IndexOutOfBoundsException();
    5009             : }
    5010             : 
    5011           0 : uno::Reference<table::XCellRange> SAL_CALL ScCellRangeObj::getCellRangeByName(
    5012             :                         const rtl::OUString& aName ) throw(uno::RuntimeException)
    5013             : {
    5014           0 :     return getCellRangeByName( aName, ScAddress::detailsOOOa1 );
    5015             : }
    5016             : 
    5017           0 : uno::Reference<table::XCellRange>  ScCellRangeObj::getCellRangeByName(
    5018             :                         const rtl::OUString& aName, const ScAddress::Details& rDetails  ) throw(uno::RuntimeException)
    5019             : {
    5020             :     //  name refers to the whole document (with the range's table as default),
    5021             :     //  valid only if the range is within this range
    5022             : 
    5023           0 :     SolarMutexGuard aGuard;
    5024           0 :     ScDocShell* pDocSh = GetDocShell();
    5025           0 :     if ( pDocSh )
    5026             :     {
    5027           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    5028           0 :         SCTAB nTab = aRange.aStart.Tab();
    5029             : 
    5030           0 :         ScRange aCellRange;
    5031           0 :         sal_Bool bFound = false;
    5032           0 :         String aString(aName);
    5033           0 :         sal_uInt16 nParse = aCellRange.ParseAny( aString, pDoc, rDetails );
    5034           0 :         if ( nParse & SCA_VALID )
    5035             :         {
    5036           0 :             if ( !(nParse & SCA_TAB_3D) )   // keine Tabelle angegeben -> auf dieser Tabelle
    5037             :             {
    5038           0 :                 aCellRange.aStart.SetTab(nTab);
    5039           0 :                 aCellRange.aEnd.SetTab(nTab);
    5040             :             }
    5041           0 :             bFound = sal_True;
    5042             :         }
    5043             :         else
    5044             :         {
    5045           0 :             ScRangeUtil aRangeUtil;
    5046           0 :             if ( aRangeUtil.MakeRangeFromName( aString, pDoc, nTab, aCellRange, RUTL_NAMES ) ||
    5047           0 :                  aRangeUtil.MakeRangeFromName( aString, pDoc, nTab, aCellRange, RUTL_DBASE ) )
    5048           0 :                 bFound = sal_True;
    5049             :         }
    5050             : 
    5051           0 :         if (bFound)         // valid only if within this object's range
    5052             :         {
    5053           0 :             if (!aRange.In(aCellRange))
    5054           0 :                 bFound = false;
    5055             :         }
    5056             : 
    5057           0 :         if (bFound)
    5058             :         {
    5059           0 :             if ( aCellRange.aStart == aCellRange.aEnd )
    5060           0 :                 return new ScCellObj( pDocSh, aCellRange.aStart );
    5061             :             else
    5062           0 :                 return new ScCellRangeObj( pDocSh, aCellRange );
    5063           0 :         }
    5064             :     }
    5065             : 
    5066           0 :     throw uno::RuntimeException();
    5067             : }
    5068             : 
    5069             : // XColumnRowRange
    5070             : 
    5071         123 : uno::Reference<table::XTableColumns> SAL_CALL ScCellRangeObj::getColumns() throw(uno::RuntimeException)
    5072             : {
    5073         123 :     SolarMutexGuard aGuard;
    5074         123 :     ScDocShell* pDocSh = GetDocShell();
    5075         123 :     if (pDocSh)
    5076         123 :         return new ScTableColumnsObj( pDocSh, aRange.aStart.Tab(),
    5077         123 :                                         aRange.aStart.Col(), aRange.aEnd.Col() );
    5078             : 
    5079             :     OSL_FAIL("Dokument ungueltig");
    5080           0 :     return NULL;
    5081             : }
    5082             : 
    5083        1419 : uno::Reference<table::XTableRows> SAL_CALL ScCellRangeObj::getRows() throw(uno::RuntimeException)
    5084             : {
    5085        1419 :     SolarMutexGuard aGuard;
    5086        1419 :     ScDocShell* pDocSh = GetDocShell();
    5087        1419 :     if (pDocSh)
    5088        1419 :         return new ScTableRowsObj( pDocSh, aRange.aStart.Tab(),
    5089        1419 :                                     aRange.aStart.Row(), aRange.aEnd.Row() );
    5090             : 
    5091             :     OSL_FAIL("Dokument ungueltig");
    5092           0 :     return NULL;
    5093             : }
    5094             : 
    5095             : // XAddressableCellRange
    5096             : 
    5097          17 : table::CellRangeAddress SAL_CALL ScCellRangeObj::getRangeAddress() throw(uno::RuntimeException)
    5098             : {
    5099          17 :     SolarMutexGuard aGuard;
    5100          17 :     table::CellRangeAddress aRet;
    5101          17 :     ScUnoConversion::FillApiRange( aRet, aRange );
    5102          17 :     return aRet;
    5103             : }
    5104             : 
    5105             : // XSheetCellRange
    5106             : 
    5107           0 : uno::Reference<sheet::XSpreadsheet> SAL_CALL ScCellRangeObj::getSpreadsheet()
    5108             :                                                 throw(uno::RuntimeException)
    5109             : {
    5110           0 :     SolarMutexGuard aGuard;
    5111           0 :     ScDocShell* pDocSh = GetDocShell();
    5112           0 :     if (pDocSh)
    5113           0 :         return new ScTableSheetObj( pDocSh, aRange.aStart.Tab() );
    5114             : 
    5115             :     OSL_FAIL("Dokument ungueltig");
    5116           0 :     return NULL;
    5117             : }
    5118             : 
    5119             : // XArrayFormulaRange
    5120             : 
    5121           0 : rtl::OUString SAL_CALL ScCellRangeObj::getArrayFormula() throw(uno::RuntimeException)
    5122             : {
    5123           0 :     SolarMutexGuard aGuard;
    5124             : 
    5125             :     //  Matrix-Formel, wenn eindeutig Teil einer Matrix,
    5126             :     //  also wenn Anfang und Ende des Blocks zur selben Matrix gehoeren.
    5127             :     //  Sonst Leerstring.
    5128             : 
    5129           0 :     rtl::OUString aFormula;
    5130           0 :     ScDocShell* pDocSh = GetDocShell();
    5131           0 :     if (pDocSh)
    5132             :     {
    5133           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    5134           0 :         const ScBaseCell* pCell1 = pDoc->GetCell( aRange.aStart );
    5135           0 :         const ScBaseCell* pCell2 = pDoc->GetCell( aRange.aEnd );
    5136           0 :         if ( pCell1 && pCell2 && pCell1->GetCellType() == CELLTYPE_FORMULA &&
    5137           0 :                                  pCell2->GetCellType() == CELLTYPE_FORMULA )
    5138             :         {
    5139           0 :             const ScFormulaCell* pFCell1 = (const ScFormulaCell*)pCell1;
    5140           0 :             const ScFormulaCell* pFCell2 = (const ScFormulaCell*)pCell2;
    5141           0 :             ScAddress aStart1;
    5142           0 :             ScAddress aStart2;
    5143           0 :             if ( pFCell1->GetMatrixOrigin( aStart1 ) && pFCell2->GetMatrixOrigin( aStart2 ) )
    5144             :             {
    5145           0 :                 if ( aStart1 == aStart2 )               // beides dieselbe Matrix
    5146           0 :                     pFCell1->GetFormula( aFormula );    // egal, von welcher Zelle
    5147             :             }
    5148             :         }
    5149             :     }
    5150           0 :     return aFormula;
    5151             : }
    5152             : 
    5153           0 : void ScCellRangeObj::SetArrayFormula_Impl( const rtl::OUString& rFormula,
    5154             :         const rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) throw(uno::RuntimeException)
    5155             : {
    5156           0 :     ScDocShell* pDocSh = GetDocShell();
    5157           0 :     if (pDocSh)
    5158             :     {
    5159           0 :         if ( !rFormula.isEmpty() )
    5160             :         {
    5161           0 :             if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) )
    5162             :             {
    5163             :                 //  don't set array formula for sheet object
    5164           0 :                 throw uno::RuntimeException();
    5165             :             }
    5166             : 
    5167           0 :             pDocSh->GetDocFunc().EnterMatrix( aRange, NULL, NULL, rFormula, sal_True, sal_True, rFormulaNmsp, eGrammar );
    5168             :         }
    5169             :         else
    5170             :         {
    5171             :             //  empty string -> erase array formula
    5172           0 :             ScMarkData aMark;
    5173           0 :             aMark.SetMarkArea( aRange );
    5174           0 :             aMark.SelectTable( aRange.aStart.Tab(), sal_True );
    5175           0 :             pDocSh->GetDocFunc().DeleteContents( aMark, IDF_CONTENTS, sal_True, sal_True );
    5176             :         }
    5177             :     }
    5178           0 : }
    5179             : 
    5180           0 : void SAL_CALL ScCellRangeObj::setArrayFormula( const rtl::OUString& aFormula )
    5181             :                                                 throw(uno::RuntimeException)
    5182             : {
    5183           0 :     SolarMutexGuard aGuard;
    5184             :     // GRAM_PODF_A1 for API compatibility.
    5185           0 :     SetArrayFormula_Impl( aFormula, ::rtl::OUString(), formula::FormulaGrammar::GRAM_PODF_A1);
    5186           0 : }
    5187             : 
    5188           0 : void ScCellRangeObj::SetArrayFormulaWithGrammar( const rtl::OUString& rFormula,
    5189             :         const rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) throw(uno::RuntimeException)
    5190             : {
    5191           0 :     SolarMutexGuard aGuard;
    5192           0 :     SetArrayFormula_Impl( rFormula, rFormulaNmsp, eGrammar);
    5193           0 : }
    5194             : 
    5195             : // XArrayFormulaTokens
    5196             : 
    5197           0 : uno::Sequence<sheet::FormulaToken> SAL_CALL ScCellRangeObj::getArrayTokens() throw(uno::RuntimeException)
    5198             : {
    5199           0 :     SolarMutexGuard aGuard;
    5200             : 
    5201             :     // same cell logic as in getArrayFormula
    5202             : 
    5203           0 :     uno::Sequence<sheet::FormulaToken> aSequence;
    5204           0 :     ScDocShell* pDocSh = GetDocShell();
    5205           0 :     if ( pDocSh )
    5206             :     {
    5207           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    5208           0 :         const ScBaseCell* pCell1 = pDoc->GetCell( aRange.aStart );
    5209           0 :         const ScBaseCell* pCell2 = pDoc->GetCell( aRange.aEnd );
    5210           0 :         if ( pCell1 && pCell2 && pCell1->GetCellType() == CELLTYPE_FORMULA &&
    5211           0 :                                  pCell2->GetCellType() == CELLTYPE_FORMULA )
    5212             :         {
    5213           0 :             const ScFormulaCell* pFCell1 = (const ScFormulaCell*)pCell1;
    5214           0 :             const ScFormulaCell* pFCell2 = (const ScFormulaCell*)pCell2;
    5215           0 :             ScAddress aStart1;
    5216           0 :             ScAddress aStart2;
    5217           0 :             if ( pFCell1->GetMatrixOrigin( aStart1 ) && pFCell2->GetMatrixOrigin( aStart2 ) )
    5218             :             {
    5219           0 :                 if ( aStart1 == aStart2 )
    5220             :                 {
    5221           0 :                     ScTokenArray* pTokenArray = pFCell1->GetCode();
    5222           0 :                     if ( pTokenArray )
    5223           0 :                         (void)ScTokenConversion::ConvertToTokenSequence( *pDoc, aSequence, *pTokenArray );
    5224             :                 }
    5225             :             }
    5226             :         }
    5227             :     }
    5228           0 :     return aSequence;
    5229             : }
    5230             : 
    5231           0 : void SAL_CALL ScCellRangeObj::setArrayTokens( const uno::Sequence<sheet::FormulaToken>& rTokens ) throw(uno::RuntimeException)
    5232             : {
    5233           0 :     SolarMutexGuard aGuard;
    5234           0 :     ScDocShell* pDocSh = GetDocShell();
    5235           0 :     if ( pDocSh )
    5236             :     {
    5237           0 :         if ( rTokens.getLength() )
    5238             :         {
    5239           0 :             if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) )
    5240             :             {
    5241           0 :                 throw uno::RuntimeException();
    5242             :             }
    5243             : 
    5244           0 :             ScDocument* pDoc = pDocSh->GetDocument();
    5245           0 :             ScTokenArray aTokenArray;
    5246           0 :             (void)ScTokenConversion::ConvertToTokenArray( *pDoc, aTokenArray, rTokens );
    5247             : 
    5248             :             // Actually GRAM_PODF_A1 is a don't-care here because of the token
    5249             :             // array being set, it fits with other API compatibility grammars
    5250             :             // though.
    5251           0 :             pDocSh->GetDocFunc().EnterMatrix( aRange, NULL, &aTokenArray, EMPTY_STRING, sal_True, sal_True, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 );
    5252             :         }
    5253             :         else
    5254             :         {
    5255             :             //  empty sequence -> erase array formula
    5256           0 :             ScMarkData aMark;
    5257           0 :             aMark.SetMarkArea( aRange );
    5258           0 :             aMark.SelectTable( aRange.aStart.Tab(), sal_True );
    5259           0 :             pDocSh->GetDocFunc().DeleteContents( aMark, IDF_CONTENTS, sal_True, sal_True );
    5260             :         }
    5261           0 :     }
    5262           0 : }
    5263             : 
    5264             : // XCellRangeData
    5265             : 
    5266           0 : uno::Sequence< uno::Sequence<uno::Any> > SAL_CALL ScCellRangeObj::getDataArray()
    5267             :                                     throw(uno::RuntimeException)
    5268             : {
    5269           0 :     SolarMutexGuard aGuard;
    5270             : 
    5271           0 :     if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) )
    5272             :     {
    5273             :         //  don't create a data array for the sheet
    5274           0 :         throw uno::RuntimeException();
    5275             :     }
    5276             : 
    5277           0 :     ScDocShell* pDocSh = GetDocShell();
    5278           0 :     if (pDocSh)
    5279             :     {
    5280           0 :         uno::Any aAny;
    5281             :         // bAllowNV = TRUE: errors as void
    5282           0 :         if ( ScRangeToSequence::FillMixedArray( aAny, pDocSh->GetDocument(), aRange, sal_True ) )
    5283             :         {
    5284           0 :             uno::Sequence< uno::Sequence<uno::Any> > aSeq;
    5285           0 :             if ( aAny >>= aSeq )
    5286           0 :                 return aSeq;            // success
    5287           0 :         }
    5288             :     }
    5289             : 
    5290           0 :     throw uno::RuntimeException();      // no other exceptions specified
    5291             : }
    5292             : 
    5293           0 : void SAL_CALL ScCellRangeObj::setDataArray(
    5294             :                         const uno::Sequence< uno::Sequence<uno::Any> >& aArray )
    5295             :                                     throw(uno::RuntimeException)
    5296             : {
    5297           0 :     SolarMutexGuard aGuard;
    5298             : 
    5299           0 :     sal_Bool bDone = false;
    5300           0 :     ScDocShell* pDocSh = GetDocShell();
    5301           0 :     if (pDocSh)
    5302             :     {
    5303             :         //! move lcl_PutDataArray to docfunc?
    5304           0 :         bDone = lcl_PutDataArray( *pDocSh, aRange, aArray );
    5305             :     }
    5306             : 
    5307           0 :     if (!bDone)
    5308           0 :         throw uno::RuntimeException();      // no other exceptions specified
    5309           0 : }
    5310             : 
    5311             : // XCellRangeFormula
    5312             : 
    5313           0 : uno::Sequence< uno::Sequence<rtl::OUString> > SAL_CALL ScCellRangeObj::getFormulaArray()
    5314             :                                     throw(uno::RuntimeException)
    5315             : {
    5316           0 :     SolarMutexGuard aGuard;
    5317             : 
    5318           0 :     if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) )
    5319             :     {
    5320             :         //  don't create a data array for the sheet
    5321           0 :         throw uno::RuntimeException();
    5322             :     }
    5323             : 
    5324           0 :     ScDocShell* pDocSh = GetDocShell();
    5325           0 :     if (pDocSh)
    5326             :     {
    5327           0 :         SCCOL nStartCol = aRange.aStart.Col();
    5328           0 :         SCROW nStartRow = aRange.aStart.Row();
    5329           0 :         SCCOL nEndCol = aRange.aEnd.Col();
    5330           0 :         SCROW nEndRow = aRange.aEnd.Row();
    5331           0 :         SCCOL nColCount = nEndCol + 1 - nStartCol;
    5332           0 :         SCROW nRowCount = nEndRow + 1 - nStartRow;
    5333           0 :         SCTAB nTab = aRange.aStart.Tab();
    5334             : 
    5335           0 :         uno::Sequence< uno::Sequence<rtl::OUString> > aRowSeq( nRowCount );
    5336           0 :         uno::Sequence<rtl::OUString>* pRowAry = aRowSeq.getArray();
    5337           0 :         for (SCROW nRowIndex = 0; nRowIndex < nRowCount; nRowIndex++)
    5338             :         {
    5339           0 :             uno::Sequence<rtl::OUString> aColSeq( nColCount );
    5340           0 :             rtl::OUString* pColAry = aColSeq.getArray();
    5341           0 :             for (SCCOL nColIndex = 0; nColIndex < nColCount; nColIndex++)
    5342             :                 pColAry[nColIndex] = lcl_GetInputString( pDocSh->GetDocument(),
    5343           0 :                                     ScAddress( nStartCol+nColIndex, nStartRow+nRowIndex, nTab ), sal_True );
    5344             : 
    5345           0 :             pRowAry[nRowIndex] = aColSeq;
    5346           0 :         }
    5347             : 
    5348           0 :         return aRowSeq;
    5349             :     }
    5350             : 
    5351           0 :     throw uno::RuntimeException();      // no other exceptions specified
    5352             : }
    5353             : 
    5354           0 : void SAL_CALL ScCellRangeObj::setFormulaArray(
    5355             :                         const uno::Sequence< uno::Sequence<rtl::OUString> >& aArray )
    5356             :                                     throw(uno::RuntimeException)
    5357             : {
    5358           0 :     SolarMutexGuard aGuard;
    5359             : 
    5360           0 :     sal_Bool bDone = false;
    5361           0 :     ScDocShell* pDocSh = GetDocShell();
    5362           0 :     if (pDocSh)
    5363             :     {
    5364           0 :         ScExternalRefManager::ApiGuard aExtRefGuard(pDocSh->GetDocument());
    5365             : 
    5366             :         // GRAM_PODF_A1 for API compatibility.
    5367           0 :         bDone = lcl_PutFormulaArray( *pDocSh, aRange, aArray, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 );
    5368             :     }
    5369             : 
    5370           0 :     if (!bDone)
    5371           0 :         throw uno::RuntimeException();      // no other exceptions specified
    5372           0 : }
    5373             : 
    5374             : // XMultipleOperation
    5375             : 
    5376           0 : void SAL_CALL ScCellRangeObj::setTableOperation( const table::CellRangeAddress& aFormulaRange,
    5377             :                                         sheet::TableOperationMode nMode,
    5378             :                                         const table::CellAddress& aColumnCell,
    5379             :                                         const table::CellAddress& aRowCell )
    5380             :                                     throw(uno::RuntimeException)
    5381             : {
    5382           0 :     SolarMutexGuard aGuard;
    5383           0 :     ScDocShell* pDocSh = GetDocShell();
    5384           0 :     if (pDocSh)
    5385             :     {
    5386           0 :         sal_Bool bError = false;
    5387           0 :         ScTabOpParam aParam;
    5388             :         aParam.aRefFormulaCell = ScRefAddress( (SCCOL)aFormulaRange.StartColumn,
    5389             :                                               (SCROW)aFormulaRange.StartRow, aFormulaRange.Sheet,
    5390           0 :                                               false, false, false );
    5391             :         aParam.aRefFormulaEnd  = ScRefAddress( (SCCOL)aFormulaRange.EndColumn,
    5392             :                                               (SCROW)aFormulaRange.EndRow, aFormulaRange.Sheet,
    5393           0 :                                               false, false, false );
    5394             :         aParam.aRefRowCell     = ScRefAddress( (SCCOL)aRowCell.Column,
    5395             :                                               (SCROW)aRowCell.Row, aRowCell.Sheet,
    5396           0 :                                               false, false, false );
    5397             :         aParam.aRefColCell     = ScRefAddress( (SCCOL)aColumnCell.Column,
    5398             :                                               (SCROW)aColumnCell.Row, aColumnCell.Sheet,
    5399           0 :                                               false, false, false );
    5400           0 :         switch (nMode)
    5401             :         {
    5402             :             case sheet::TableOperationMode_COLUMN:
    5403           0 :                 aParam.nMode = 0;
    5404           0 :                 break;
    5405             :             case sheet::TableOperationMode_ROW:
    5406           0 :                 aParam.nMode = 1;
    5407           0 :                 break;
    5408             :             case sheet::TableOperationMode_BOTH:
    5409           0 :                 aParam.nMode = 2;
    5410           0 :                 break;
    5411             :             default:
    5412           0 :                 bError = sal_True;
    5413             :         }
    5414             : 
    5415           0 :         if (!bError)
    5416           0 :             pDocSh->GetDocFunc().TabOp( aRange, NULL, aParam, sal_True, sal_True );
    5417           0 :     }
    5418           0 : }
    5419             : 
    5420             : // XMergeable
    5421             : 
    5422           0 : void SAL_CALL ScCellRangeObj::merge( sal_Bool bMerge ) throw(uno::RuntimeException)
    5423             : {
    5424           0 :     SolarMutexGuard aGuard;
    5425           0 :     ScDocShell* pDocSh = GetDocShell();
    5426           0 :     if ( pDocSh )
    5427             :     {
    5428             :         ScCellMergeOption aMergeOption(
    5429           0 :             aRange.aStart.Col(), aRange.aStart.Row(),
    5430           0 :             aRange.aEnd.Col(), aRange.aEnd.Row(), false);
    5431           0 :         aMergeOption.maTabs.insert(aRange.aStart.Tab());
    5432           0 :         if ( bMerge )
    5433           0 :             pDocSh->GetDocFunc().MergeCells( aMergeOption, false, true, true );
    5434             :         else
    5435           0 :             pDocSh->GetDocFunc().UnmergeCells( aMergeOption, true );
    5436             : 
    5437             :         //! Fehler abfangen?
    5438           0 :     }
    5439           0 : }
    5440             : 
    5441           0 : sal_Bool SAL_CALL ScCellRangeObj::getIsMerged() throw(uno::RuntimeException)
    5442             : {
    5443           0 :     SolarMutexGuard aGuard;
    5444           0 :     ScDocShell* pDocSh = GetDocShell();
    5445           0 :     return pDocSh && pDocSh->GetDocument()->HasAttrib( aRange, HASATTR_MERGED );
    5446             : }
    5447             : 
    5448             : // XCellSeries
    5449             : 
    5450           0 : void SAL_CALL ScCellRangeObj::fillSeries( sheet::FillDirection nFillDirection,
    5451             :                         sheet::FillMode nFillMode, sheet::FillDateMode nFillDateMode,
    5452             :                         double fStep, double fEndValue ) throw(uno::RuntimeException)
    5453             : {
    5454           0 :     SolarMutexGuard aGuard;
    5455           0 :     ScDocShell* pDocSh = GetDocShell();
    5456           0 :     if ( pDocSh )
    5457             :     {
    5458           0 :         sal_Bool bError = false;
    5459             : 
    5460           0 :         FillDir eDir = FILL_TO_BOTTOM;
    5461           0 :         switch (nFillDirection)
    5462             :         {
    5463             :             case sheet::FillDirection_TO_BOTTOM:
    5464           0 :                 eDir = FILL_TO_BOTTOM;
    5465           0 :                 break;
    5466             :             case sheet::FillDirection_TO_RIGHT:
    5467           0 :                 eDir = FILL_TO_RIGHT;
    5468           0 :                 break;
    5469             :             case sheet::FillDirection_TO_TOP:
    5470           0 :                 eDir = FILL_TO_TOP;
    5471           0 :                 break;
    5472             :             case sheet::FillDirection_TO_LEFT:
    5473           0 :                 eDir = FILL_TO_LEFT;
    5474           0 :                 break;
    5475             :             default:
    5476           0 :                 bError = sal_True;
    5477             :         }
    5478             : 
    5479           0 :         FillCmd eCmd = FILL_SIMPLE;
    5480           0 :         switch ( nFillMode )
    5481             :         {
    5482             :             case sheet::FillMode_SIMPLE:
    5483           0 :                 eCmd = FILL_SIMPLE;
    5484           0 :                 break;
    5485             :             case sheet::FillMode_LINEAR:
    5486           0 :                 eCmd = FILL_LINEAR;
    5487           0 :                 break;
    5488             :             case sheet::FillMode_GROWTH:
    5489           0 :                 eCmd = FILL_GROWTH;
    5490           0 :                 break;
    5491             :             case sheet::FillMode_DATE:
    5492           0 :                 eCmd = FILL_DATE;
    5493           0 :                 break;
    5494             :             case sheet::FillMode_AUTO:
    5495           0 :                 eCmd = FILL_AUTO;
    5496           0 :                 break;
    5497             :             default:
    5498           0 :                 bError = sal_True;
    5499             :         }
    5500             : 
    5501           0 :         FillDateCmd eDateCmd = FILL_DAY;
    5502           0 :         switch ( nFillDateMode )
    5503             :         {
    5504             :             case sheet::FillDateMode_FILL_DATE_DAY:
    5505           0 :                 eDateCmd = FILL_DAY;
    5506           0 :                 break;
    5507             :             case sheet::FillDateMode_FILL_DATE_WEEKDAY:
    5508           0 :                 eDateCmd = FILL_WEEKDAY;
    5509           0 :                 break;
    5510             :             case sheet::FillDateMode_FILL_DATE_MONTH:
    5511           0 :                 eDateCmd = FILL_MONTH;
    5512           0 :                 break;
    5513             :             case sheet::FillDateMode_FILL_DATE_YEAR:
    5514           0 :                 eDateCmd = FILL_YEAR;
    5515           0 :                 break;
    5516             :             default:
    5517           0 :                 bError = sal_True;
    5518             :         }
    5519             : 
    5520           0 :         if (!bError)
    5521           0 :             pDocSh->GetDocFunc().FillSeries( aRange, NULL, eDir, eCmd, eDateCmd,
    5522           0 :                                                 MAXDOUBLE, fStep, fEndValue, sal_True, sal_True );
    5523           0 :     }
    5524           0 : }
    5525             : 
    5526           0 : void SAL_CALL ScCellRangeObj::fillAuto( sheet::FillDirection nFillDirection,
    5527             :                                 sal_Int32 nSourceCount ) throw(uno::RuntimeException)
    5528             : {
    5529           0 :     SolarMutexGuard aGuard;
    5530           0 :     ScDocShell* pDocSh = GetDocShell();
    5531           0 :     if ( pDocSh && nSourceCount )
    5532             :     {
    5533           0 :         ScRange aSourceRange(aRange);
    5534           0 :         SCsCOLROW nCount = 0;                   // "Dest-Count"
    5535           0 :         FillDir eDir = FILL_TO_BOTTOM;
    5536           0 :         sal_Bool bError = false;
    5537           0 :         switch (nFillDirection)
    5538             :         {
    5539             :             case sheet::FillDirection_TO_BOTTOM:
    5540           0 :                 aSourceRange.aEnd.SetRow( static_cast<SCROW>( aSourceRange.aStart.Row() + nSourceCount - 1 ) );
    5541           0 :                 nCount = aRange.aEnd.Row() - aSourceRange.aEnd.Row();
    5542           0 :                 eDir = FILL_TO_BOTTOM;
    5543           0 :                 break;
    5544             :             case sheet::FillDirection_TO_RIGHT:
    5545           0 :                 aSourceRange.aEnd.SetCol( static_cast<SCCOL>( aSourceRange.aStart.Col() + nSourceCount - 1 ) );
    5546           0 :                 nCount = aRange.aEnd.Col() - aSourceRange.aEnd.Col();
    5547           0 :                 eDir = FILL_TO_RIGHT;
    5548           0 :                 break;
    5549             :             case sheet::FillDirection_TO_TOP:
    5550           0 :                 aSourceRange.aStart.SetRow( static_cast<SCROW>( aSourceRange.aEnd.Row() - nSourceCount + 1 ) );
    5551           0 :                 nCount = aSourceRange.aStart.Row() - aRange.aStart.Row();
    5552           0 :                 eDir = FILL_TO_TOP;
    5553           0 :                 break;
    5554             :             case sheet::FillDirection_TO_LEFT:
    5555           0 :                 aSourceRange.aStart.SetCol( static_cast<SCCOL>( aSourceRange.aEnd.Col() - nSourceCount + 1 ) );
    5556           0 :                 nCount = aSourceRange.aStart.Col() - aRange.aStart.Col();
    5557           0 :                 eDir = FILL_TO_LEFT;
    5558           0 :                 break;
    5559             :             default:
    5560           0 :                 bError = sal_True;
    5561             :         }
    5562           0 :         if (nCount < 0 || nCount > MAXROW)      // overflow
    5563           0 :             bError = sal_True;
    5564             : 
    5565           0 :         if (!bError)
    5566           0 :             pDocSh->GetDocFunc().FillAuto( aSourceRange, NULL, eDir, nCount, sal_True, sal_True );
    5567           0 :     }
    5568           0 : }
    5569             : 
    5570             : // XAutoFormattable
    5571             : 
    5572           0 : void SAL_CALL ScCellRangeObj::autoFormat( const rtl::OUString& aName )
    5573             :                     throw(lang::IllegalArgumentException, uno::RuntimeException)
    5574             : {
    5575           0 :     SolarMutexGuard aGuard;
    5576           0 :     ScDocShell* pDocSh = GetDocShell();
    5577           0 :     if ( pDocSh )
    5578             :     {
    5579           0 :         ScAutoFormat* pAutoFormat = ScGlobal::GetOrCreateAutoFormat();
    5580           0 :         ScAutoFormat::const_iterator it = pAutoFormat->find(aName);
    5581           0 :         if (it != pAutoFormat->end())
    5582             :         {
    5583           0 :             ScAutoFormat::const_iterator itBeg = pAutoFormat->begin();
    5584           0 :             size_t nIndex = std::distance(itBeg, it);
    5585           0 :             pDocSh->GetDocFunc().AutoFormat(aRange, NULL, nIndex, true, true);
    5586             :         }
    5587             :         else
    5588           0 :             throw lang::IllegalArgumentException();
    5589           0 :     }
    5590           0 : }
    5591             : 
    5592             : // XSortable
    5593             : 
    5594           0 : uno::Sequence<beans::PropertyValue> SAL_CALL ScCellRangeObj::createSortDescriptor()
    5595             :                                                 throw(uno::RuntimeException)
    5596             : {
    5597           0 :     SolarMutexGuard aGuard;
    5598           0 :     ScSortParam aParam;
    5599           0 :     ScDocShell* pDocSh = GetDocShell();
    5600           0 :     if ( pDocSh )
    5601             :     {
    5602             :         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
    5603           0 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
    5604           0 :         if (pData)
    5605             :         {
    5606           0 :             pData->GetSortParam(aParam);
    5607             : 
    5608             :             //  im SortDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5609           0 :             ScRange aDBRange;
    5610           0 :             pData->GetArea(aDBRange);
    5611             :             SCCOLROW nFieldStart = aParam.bByRow ?
    5612           0 :                 static_cast<SCCOLROW>(aDBRange.aStart.Col()) :
    5613           0 :                 static_cast<SCCOLROW>(aDBRange.aStart.Row());
    5614           0 :             for (sal_uInt16 i=0; i<aParam.GetSortKeyCount(); i++)
    5615           0 :                 if ( aParam.maKeyState[i].bDoSort && aParam.maKeyState[i].nField >= nFieldStart )
    5616           0 :                     aParam.maKeyState[i].nField -= nFieldStart;
    5617             :         }
    5618             :     }
    5619             : 
    5620           0 :     uno::Sequence<beans::PropertyValue> aSeq( ScSortDescriptor::GetPropertyCount() );
    5621           0 :     ScSortDescriptor::FillProperties( aSeq, aParam );
    5622           0 :     return aSeq;
    5623             : }
    5624             : 
    5625           0 : void SAL_CALL ScCellRangeObj::sort( const uno::Sequence<beans::PropertyValue>& aDescriptor )
    5626             :                                                 throw(uno::RuntimeException)
    5627             : {
    5628           0 :     SolarMutexGuard aGuard;
    5629           0 :     ScDocShell* pDocSh = GetDocShell();
    5630           0 :     if (pDocSh)
    5631             :     {
    5632             :         sal_uInt16 i;
    5633           0 :         ScSortParam aParam;
    5634           0 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK ); // ggf. Bereich anlegen
    5635           0 :         if (pData)
    5636             :         {
    5637             :             //  alten Einstellungen holen, falls nicht alles neu gesetzt wird
    5638           0 :             pData->GetSortParam(aParam);
    5639             :             SCCOLROW nOldStart = aParam.bByRow ?
    5640           0 :                 static_cast<SCCOLROW>(aRange.aStart.Col()) :
    5641           0 :                 static_cast<SCCOLROW>(aRange.aStart.Row());
    5642           0 :             for (i=0; i<aParam.GetSortKeyCount(); i++)
    5643           0 :                 if ( aParam.maKeyState[i].bDoSort && aParam.maKeyState[i].nField >= nOldStart )
    5644           0 :                     aParam.maKeyState[i].nField -= nOldStart;
    5645             :         }
    5646             : 
    5647           0 :         ScSortDescriptor::FillSortParam( aParam, aDescriptor );
    5648             : 
    5649             :         //  im SortDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5650             :         //  ByRow kann bei FillSortParam umgesetzt worden sein
    5651             :         SCCOLROW nFieldStart = aParam.bByRow ?
    5652           0 :             static_cast<SCCOLROW>(aRange.aStart.Col()) :
    5653           0 :             static_cast<SCCOLROW>(aRange.aStart.Row());
    5654           0 :         for (i=0; i<aParam.GetSortKeyCount(); i++)
    5655           0 :             aParam.maKeyState[i].nField += nFieldStart;
    5656             : 
    5657           0 :         SCTAB nTab = aRange.aStart.Tab();
    5658           0 :         aParam.nCol1 = aRange.aStart.Col();
    5659           0 :         aParam.nRow1 = aRange.aStart.Row();
    5660           0 :         aParam.nCol2 = aRange.aEnd.Col();
    5661           0 :         aParam.nRow2 = aRange.aEnd.Row();
    5662             : 
    5663           0 :         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );       // ggf. Bereich anlegen
    5664             : 
    5665           0 :         ScDBDocFunc aFunc(*pDocSh); // Bereich muss angelegt sein
    5666           0 :         aFunc.Sort( nTab, aParam, sal_True, sal_True, sal_True );
    5667           0 :     }
    5668           0 : }
    5669             : 
    5670             : // XFilterable
    5671             : 
    5672           0 : uno::Reference<sheet::XSheetFilterDescriptor> SAL_CALL ScCellRangeObj::createFilterDescriptor(
    5673             :                                 sal_Bool bEmpty ) throw(uno::RuntimeException)
    5674             : {
    5675           0 :     SolarMutexGuard aGuard;
    5676           0 :     ScDocShell* pDocSh = GetDocShell();
    5677           0 :     ScFilterDescriptor* pNew = new ScFilterDescriptor(pDocSh);
    5678           0 :     if ( !bEmpty && pDocSh )
    5679             :     {
    5680             :         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
    5681           0 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
    5682           0 :         if (pData)
    5683             :         {
    5684           0 :             ScQueryParam aParam;
    5685           0 :             pData->GetQueryParam(aParam);
    5686             :             //  im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5687           0 :             ScRange aDBRange;
    5688           0 :             pData->GetArea(aDBRange);
    5689             :             SCCOLROW nFieldStart = aParam.bByRow ?
    5690           0 :                 static_cast<SCCOLROW>(aDBRange.aStart.Col()) :
    5691           0 :                 static_cast<SCCOLROW>(aDBRange.aStart.Row());
    5692           0 :             SCSIZE nCount = aParam.GetEntryCount();
    5693           0 :             for (SCSIZE i=0; i<nCount; i++)
    5694             :             {
    5695           0 :                 ScQueryEntry& rEntry = aParam.GetEntry(i);
    5696           0 :                 if (rEntry.bDoQuery && rEntry.nField >= nFieldStart)
    5697           0 :                     rEntry.nField -= nFieldStart;
    5698             :             }
    5699           0 :             pNew->SetParam(aParam);
    5700             :         }
    5701             :     }
    5702           0 :     return pNew;
    5703             : }
    5704             : 
    5705           0 : void SAL_CALL ScCellRangeObj::filter( const uno::Reference<sheet::XSheetFilterDescriptor>& xDescriptor )
    5706             :                                                 throw(uno::RuntimeException)
    5707             : {
    5708           0 :     SolarMutexGuard aGuard;
    5709             : 
    5710             :     //  das koennte theoretisch ein fremdes Objekt sein, also nur das
    5711             :     //  oeffentliche XSheetFilterDescriptor Interface benutzen, um
    5712             :     //  die Daten in ein ScFilterDescriptor Objekt zu kopieren:
    5713             :     //! wenn es schon ein ScFilterDescriptor ist, direkt per getImplementation?
    5714             : 
    5715           0 :     ScDocShell* pDocSh = GetDocShell();
    5716           0 :     ScFilterDescriptor aImpl(pDocSh);
    5717           0 :     uno::Reference< sheet::XSheetFilterDescriptor2 > xDescriptor2( xDescriptor, uno::UNO_QUERY );
    5718           0 :     if ( xDescriptor2.is() )
    5719             :     {
    5720           0 :         aImpl.setFilterFields2( xDescriptor2->getFilterFields2() );
    5721             :     }
    5722             :     else
    5723             :     {
    5724           0 :         aImpl.setFilterFields( xDescriptor->getFilterFields() );
    5725             :     }
    5726             :     //  Rest sind jetzt Properties...
    5727             : 
    5728           0 :     uno::Reference<beans::XPropertySet> xPropSet( xDescriptor, uno::UNO_QUERY );
    5729           0 :     if (xPropSet.is())
    5730           0 :         lcl_CopyProperties( aImpl, *(beans::XPropertySet*)xPropSet.get() );
    5731             : 
    5732             :     //
    5733             :     //  ausfuehren...
    5734             :     //
    5735             : 
    5736           0 :     if (pDocSh)
    5737             :     {
    5738           0 :         ScQueryParam aParam = aImpl.GetParam();
    5739             :         //  im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5740             :         SCCOLROW nFieldStart = aParam.bByRow ?
    5741           0 :             static_cast<SCCOLROW>(aRange.aStart.Col()) :
    5742           0 :             static_cast<SCCOLROW>(aRange.aStart.Row());
    5743           0 :         SCSIZE nCount = aParam.GetEntryCount();
    5744           0 :         for (SCSIZE i=0; i<nCount; i++)
    5745             :         {
    5746           0 :             ScQueryEntry& rEntry = aParam.GetEntry(i);
    5747           0 :             if (rEntry.bDoQuery)
    5748             :             {
    5749           0 :                 rEntry.nField += nFieldStart;
    5750             :                 //  Im Dialog wird immer der String angezeigt -> muss zum Wert passen
    5751           0 :                 ScQueryEntry::QueryItemsType& rItems = rEntry.GetQueryItems();
    5752           0 :                 rItems.resize(1);
    5753           0 :                 ScQueryEntry::Item& rItem = rItems.front();
    5754           0 :                 if (rItem.meType != ScQueryEntry::ByString)
    5755             :                 {
    5756             :                     pDocSh->GetDocument()->GetFormatTable()->
    5757           0 :                         GetInputLineString(rItem.mfVal, 0, rItem.maString);
    5758             :                 }
    5759             :             }
    5760             :         }
    5761             : 
    5762           0 :         SCTAB nTab = aRange.aStart.Tab();
    5763           0 :         aParam.nCol1 = aRange.aStart.Col();
    5764           0 :         aParam.nRow1 = aRange.aStart.Row();
    5765           0 :         aParam.nCol2 = aRange.aEnd.Col();
    5766           0 :         aParam.nRow2 = aRange.aEnd.Row();
    5767             : 
    5768           0 :         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );   // ggf. Bereich anlegen
    5769             : 
    5770             :         //! keep source range in filter descriptor
    5771             :         //! if created by createFilterDescriptorByObject ???
    5772             : 
    5773           0 :         ScDBDocFunc aFunc(*pDocSh);
    5774           0 :         aFunc.Query( nTab, aParam, NULL, sal_True, sal_True );  // Bereich muss angelegt sein
    5775           0 :     }
    5776           0 : }
    5777             : 
    5778             : //! get/setAutoFilter als Properties!!!
    5779             : 
    5780             : // XAdvancedFilterSource
    5781             : 
    5782           0 : uno::Reference<sheet::XSheetFilterDescriptor> SAL_CALL ScCellRangeObj::createFilterDescriptorByObject(
    5783             :                         const uno::Reference<sheet::XSheetFilterable>& xObject )
    5784             :                                                 throw(uno::RuntimeException)
    5785             : {
    5786           0 :     SolarMutexGuard aGuard;
    5787             : 
    5788             :     //  this ist hier nicht der Bereich, der gefiltert wird, sondern der
    5789             :     //  Bereich mit der Abfrage...
    5790             : 
    5791           0 :     uno::Reference<sheet::XCellRangeAddressable> xAddr( xObject, uno::UNO_QUERY );
    5792             : 
    5793           0 :     ScDocShell* pDocSh = GetDocShell();
    5794           0 :     if ( pDocSh && xAddr.is() )
    5795             :     {
    5796             :         //! Test, ob xObject im selben Dokument ist
    5797             : 
    5798           0 :         ScFilterDescriptor* pNew = new ScFilterDescriptor(pDocSh);  //! stattdessen vom Objekt?
    5799             : 
    5800           0 :         ScQueryParam aParam = pNew->GetParam();
    5801           0 :         aParam.bHasHeader = sal_True;
    5802             : 
    5803           0 :         table::CellRangeAddress aDataAddress(xAddr->getRangeAddress());
    5804           0 :         aParam.nCol1 = (SCCOL)aDataAddress.StartColumn;
    5805           0 :         aParam.nRow1 = (SCROW)aDataAddress.StartRow;
    5806           0 :         aParam.nCol2 = (SCCOL)aDataAddress.EndColumn;
    5807           0 :         aParam.nRow2 = (SCROW)aDataAddress.EndRow;
    5808           0 :         aParam.nTab  = aDataAddress.Sheet;
    5809             : 
    5810           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    5811             :         sal_Bool bOk = pDoc->CreateQueryParam(
    5812           0 :                             aRange.aStart.Col(), aRange.aStart.Row(),
    5813           0 :                             aRange.aEnd.Col(), aRange.aEnd.Row(),
    5814           0 :                             aRange.aStart.Tab(), aParam );
    5815           0 :         if ( bOk )
    5816             :         {
    5817             :             //  im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5818             :             SCCOLROW nFieldStart = aParam.bByRow ?
    5819             :                 static_cast<SCCOLROW>(aDataAddress.StartColumn) :
    5820           0 :                 static_cast<SCCOLROW>(aDataAddress.StartRow);
    5821           0 :             SCSIZE nCount = aParam.GetEntryCount();
    5822           0 :             for (SCSIZE i=0; i<nCount; i++)
    5823             :             {
    5824           0 :                 ScQueryEntry& rEntry = aParam.GetEntry(i);
    5825           0 :                 if (rEntry.bDoQuery && rEntry.nField >= nFieldStart)
    5826           0 :                     rEntry.nField -= nFieldStart;
    5827             :             }
    5828             : 
    5829           0 :             pNew->SetParam( aParam );
    5830           0 :             return pNew;
    5831             :         }
    5832             :         else
    5833             :         {
    5834           0 :             delete pNew;
    5835           0 :             return NULL;        // ungueltig -> null
    5836           0 :         }
    5837             :     }
    5838             : 
    5839             :     OSL_FAIL("kein Dokument oder kein Bereich");
    5840           0 :     return NULL;
    5841             : }
    5842             : 
    5843             : // XSubTotalSource
    5844             : 
    5845           0 : uno::Reference<sheet::XSubTotalDescriptor> SAL_CALL ScCellRangeObj::createSubTotalDescriptor(
    5846             :                                 sal_Bool bEmpty ) throw(uno::RuntimeException)
    5847             : {
    5848           0 :     SolarMutexGuard aGuard;
    5849           0 :     ScSubTotalDescriptor* pNew = new ScSubTotalDescriptor;
    5850           0 :     ScDocShell* pDocSh = GetDocShell();
    5851           0 :     if ( !bEmpty && pDocSh )
    5852             :     {
    5853             :         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
    5854           0 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
    5855           0 :         if (pData)
    5856             :         {
    5857           0 :             ScSubTotalParam aParam;
    5858           0 :             pData->GetSubTotalParam(aParam);
    5859             :             //  im SubTotalDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5860           0 :             ScRange aDBRange;
    5861           0 :             pData->GetArea(aDBRange);
    5862           0 :             SCCOL nFieldStart = aDBRange.aStart.Col();
    5863           0 :             for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
    5864             :             {
    5865           0 :                 if ( aParam.bGroupActive[i] )
    5866             :                 {
    5867           0 :                     if ( aParam.nField[i] >= nFieldStart )
    5868           0 :                         aParam.nField[i] = sal::static_int_cast<SCCOL>( aParam.nField[i] - nFieldStart );
    5869           0 :                     for (SCCOL j=0; j<aParam.nSubTotals[i]; j++)
    5870           0 :                         if ( aParam.pSubTotals[i][j] >= nFieldStart )
    5871           0 :                             aParam.pSubTotals[i][j] = sal::static_int_cast<SCCOL>( aParam.pSubTotals[i][j] - nFieldStart );
    5872             :                 }
    5873             :             }
    5874           0 :             pNew->SetParam(aParam);
    5875             :         }
    5876             :     }
    5877           0 :     return pNew;
    5878             : }
    5879             : 
    5880           0 : void SAL_CALL ScCellRangeObj::applySubTotals(
    5881             :                 const uno::Reference<sheet::XSubTotalDescriptor>& xDescriptor,
    5882             :                 sal_Bool bReplace ) throw(uno::RuntimeException)
    5883             : {
    5884           0 :     SolarMutexGuard aGuard;
    5885             : 
    5886           0 :     if (!xDescriptor.is()) return;
    5887             : 
    5888           0 :     ScDocShell* pDocSh = GetDocShell();
    5889             :     ScSubTotalDescriptorBase* pImp =
    5890           0 :         ScSubTotalDescriptorBase::getImplementation( xDescriptor );
    5891             : 
    5892           0 :     if (pDocSh && pImp)
    5893             :     {
    5894           0 :         ScSubTotalParam aParam;
    5895           0 :         pImp->GetData(aParam);      // virtuelle Methode der Basisklasse
    5896             : 
    5897             :         //  im SubTotalDescriptor sind die Fields innerhalb des Bereichs gezaehlt
    5898           0 :         SCCOL nFieldStart = aRange.aStart.Col();
    5899           0 :         for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++)
    5900             :         {
    5901           0 :             if ( aParam.bGroupActive[i] )
    5902             :             {
    5903           0 :                 aParam.nField[i] = sal::static_int_cast<SCCOL>( aParam.nField[i] + nFieldStart );
    5904           0 :                 for (SCCOL j=0; j<aParam.nSubTotals[i]; j++)
    5905           0 :                     aParam.pSubTotals[i][j] = sal::static_int_cast<SCCOL>( aParam.pSubTotals[i][j] + nFieldStart );
    5906             :             }
    5907             :         }
    5908             : 
    5909           0 :         aParam.bReplace = bReplace;
    5910             : 
    5911           0 :         SCTAB nTab = aRange.aStart.Tab();
    5912           0 :         aParam.nCol1 = aRange.aStart.Col();
    5913           0 :         aParam.nRow1 = aRange.aStart.Row();
    5914           0 :         aParam.nCol2 = aRange.aEnd.Col();
    5915           0 :         aParam.nRow2 = aRange.aEnd.Row();
    5916             : 
    5917           0 :         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );   // ggf. Bereich anlegen
    5918             : 
    5919           0 :         ScDBDocFunc aFunc(*pDocSh);
    5920           0 :         aFunc.DoSubTotals( nTab, aParam, NULL, sal_True, sal_True );    // Bereich muss angelegt sein
    5921           0 :     }
    5922             : }
    5923             : 
    5924           0 : void SAL_CALL ScCellRangeObj::removeSubTotals() throw(uno::RuntimeException)
    5925             : {
    5926           0 :     SolarMutexGuard aGuard;
    5927             : 
    5928           0 :     ScDocShell* pDocSh = GetDocShell();
    5929           0 :     if (pDocSh)
    5930             :     {
    5931           0 :         ScSubTotalParam aParam;
    5932           0 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
    5933           0 :         if (pData)
    5934           0 :             pData->GetSubTotalParam(aParam);    // auch bei Remove die Feld-Eintraege behalten
    5935             : 
    5936           0 :         aParam.bRemoveOnly = sal_True;
    5937             : 
    5938           0 :         SCTAB nTab = aRange.aStart.Tab();
    5939           0 :         aParam.nCol1 = aRange.aStart.Col();
    5940           0 :         aParam.nRow1 = aRange.aStart.Row();
    5941           0 :         aParam.nCol2 = aRange.aEnd.Col();
    5942           0 :         aParam.nRow2 = aRange.aEnd.Row();
    5943             : 
    5944           0 :         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );   // ggf. Bereich anlegen
    5945             : 
    5946           0 :         ScDBDocFunc aFunc(*pDocSh);
    5947           0 :         aFunc.DoSubTotals( nTab, aParam, NULL, sal_True, sal_True );    // Bereich muss angelegt sein
    5948           0 :     }
    5949           0 : }
    5950             : 
    5951           0 : uno::Sequence<beans::PropertyValue> SAL_CALL ScCellRangeObj::createImportDescriptor( sal_Bool bEmpty )
    5952             :                                                 throw(uno::RuntimeException)
    5953             : {
    5954           0 :     SolarMutexGuard aGuard;
    5955           0 :     ScImportParam aParam;
    5956           0 :     ScDocShell* pDocSh = GetDocShell();
    5957           0 :     if ( !bEmpty && pDocSh )
    5958             :     {
    5959             :         // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich
    5960           0 :         ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK );
    5961           0 :         if (pData)
    5962           0 :             pData->GetImportParam(aParam);
    5963             :     }
    5964             : 
    5965           0 :     uno::Sequence<beans::PropertyValue> aSeq( ScImportDescriptor::GetPropertyCount() );
    5966           0 :     ScImportDescriptor::FillProperties( aSeq, aParam );
    5967           0 :     return aSeq;
    5968             : }
    5969             : 
    5970           0 : void SAL_CALL ScCellRangeObj::doImport( const uno::Sequence<beans::PropertyValue>& aDescriptor )
    5971             :                                             throw(uno::RuntimeException)
    5972             : {
    5973           0 :     SolarMutexGuard aGuard;
    5974           0 :     ScDocShell* pDocSh = GetDocShell();
    5975           0 :     if (pDocSh)
    5976             :     {
    5977           0 :         ScImportParam aParam;
    5978           0 :         ScImportDescriptor::FillImportParam( aParam, aDescriptor );
    5979             : 
    5980           0 :         SCTAB nTab = aRange.aStart.Tab();
    5981           0 :         aParam.nCol1 = aRange.aStart.Col();
    5982           0 :         aParam.nRow1 = aRange.aStart.Row();
    5983           0 :         aParam.nCol2 = aRange.aEnd.Col();
    5984           0 :         aParam.nRow2 = aRange.aEnd.Row();
    5985             : 
    5986             :         //! TODO: could we get passed a valid result set by any means?
    5987             : 
    5988           0 :         pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK );       // ggf. Bereich anlegen
    5989             : 
    5990           0 :         ScDBDocFunc aFunc(*pDocSh);                         // Bereich muss angelegt sein
    5991           0 :         aFunc.DoImport( nTab, aParam, NULL, true );         //! Api-Flag as parameter
    5992           0 :     }
    5993           0 : }
    5994             : 
    5995             : // XCellFormatRangesSupplier
    5996             : 
    5997           0 : uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangeObj::getCellFormatRanges()
    5998             :                                                 throw(uno::RuntimeException)
    5999             : {
    6000           0 :     SolarMutexGuard aGuard;
    6001           0 :     ScDocShell* pDocSh = GetDocShell();
    6002           0 :     if ( pDocSh )
    6003           0 :         return new ScCellFormatsObj( pDocSh, aRange );
    6004           0 :     return NULL;
    6005             : }
    6006             : 
    6007             : // XUniqueCellFormatRangesSupplier
    6008             : 
    6009           2 : uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangeObj::getUniqueCellFormatRanges()
    6010             :                                                 throw(uno::RuntimeException)
    6011             : {
    6012           2 :     SolarMutexGuard aGuard;
    6013           2 :     ScDocShell* pDocSh = GetDocShell();
    6014           2 :     if ( pDocSh )
    6015           2 :         return new ScUniqueCellFormatsObj( pDocSh, aRange );
    6016           0 :     return NULL;
    6017             : }
    6018             : 
    6019             : // XPropertySet erweitert fuer Range-Properties
    6020             : 
    6021          68 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellRangeObj::getPropertySetInfo()
    6022             :                                                         throw(uno::RuntimeException)
    6023             : {
    6024          68 :     SolarMutexGuard aGuard;
    6025             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    6026          68 :         new SfxItemPropertySetInfo( pRangePropSet->getPropertyMap() ));
    6027          68 :     return aRef;
    6028             : }
    6029             : 
    6030          54 : void ScCellRangeObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    6031             :                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
    6032             : {
    6033             :     //  Range has only Position and Size in addition to ScCellRangesBase, both are ReadOnly
    6034             :     //  -> nothing to do here
    6035             : 
    6036          54 :     ScCellRangesBase::SetOnePropertyValue( pEntry, aValue );
    6037          54 : }
    6038             : 
    6039          60 : void ScCellRangeObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
    6040             :                                             uno::Any& rAny )
    6041             :                                                 throw(uno::RuntimeException)
    6042             : {
    6043          60 :     if ( pEntry )
    6044             :     {
    6045          60 :         if ( pEntry->nWID == SC_WID_UNO_POS )
    6046             :         {
    6047          24 :             ScDocShell* pDocSh = GetDocShell();
    6048          24 :             if (pDocSh)
    6049             :             {
    6050             :                 //  GetMMRect converts using HMM_PER_TWIPS, like the DrawingLayer
    6051             :                 Rectangle aMMRect(pDocSh->GetDocument()->GetMMRect(
    6052          24 :                                         aRange.aStart.Col(), aRange.aStart.Row(),
    6053          48 :                                         aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab() ));
    6054          24 :                 awt::Point aPos( aMMRect.Left(), aMMRect.Top() );
    6055          24 :                 rAny <<= aPos;
    6056             :             }
    6057             :         }
    6058          36 :         else if ( pEntry->nWID == SC_WID_UNO_SIZE )
    6059             :         {
    6060          36 :             ScDocShell* pDocSh = GetDocShell();
    6061          36 :             if (pDocSh)
    6062             :             {
    6063             :                 //  GetMMRect converts using HMM_PER_TWIPS, like the DrawingLayer
    6064             :                 Rectangle aMMRect = pDocSh->GetDocument()->GetMMRect(
    6065          36 :                                         aRange.aStart.Col(), aRange.aStart.Row(),
    6066          72 :                                         aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab() );
    6067          36 :                 Size aSize(aMMRect.GetSize());
    6068          36 :                 awt::Size aAwtSize( aSize.Width(), aSize.Height() );
    6069          36 :                 rAny <<= aAwtSize;
    6070             :             }
    6071             :         }
    6072             :         else
    6073           0 :             ScCellRangesBase::GetOnePropertyValue( pEntry, rAny );
    6074             : 
    6075             :     }
    6076          60 : }
    6077             : 
    6078          76 : const SfxItemPropertyMap& ScCellRangeObj::GetItemPropertyMap()
    6079             : {
    6080          76 :     return pRangePropSet->getPropertyMap();
    6081             : }
    6082             : 
    6083             : // XServiceInfo
    6084             : 
    6085           0 : rtl::OUString SAL_CALL ScCellRangeObj::getImplementationName() throw(uno::RuntimeException)
    6086             : {
    6087           0 :     return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScCellRangeObj" ));
    6088             : }
    6089             : 
    6090           0 : sal_Bool SAL_CALL ScCellRangeObj::supportsService( const rtl::OUString& rServiceName )
    6091             :                                                     throw(uno::RuntimeException)
    6092             : {
    6093           0 :     String aServiceStr( rServiceName );
    6094           0 :     return aServiceStr.EqualsAscii( SCSHEETCELLRANGE_SERVICE ) ||
    6095           0 :            aServiceStr.EqualsAscii( SCCELLRANGE_SERVICE ) ||
    6096           0 :            aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) ||
    6097           0 :            aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) ||
    6098           0 :            aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE );
    6099             : }
    6100             : 
    6101           0 : uno::Sequence<rtl::OUString> SAL_CALL ScCellRangeObj::getSupportedServiceNames()
    6102             :                                                     throw(uno::RuntimeException)
    6103             : {
    6104           0 :     uno::Sequence<rtl::OUString> aRet(5);
    6105           0 :     rtl::OUString* pArray = aRet.getArray();
    6106           0 :     pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELLRANGE_SERVICE ));
    6107           0 :     pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLRANGE_SERVICE ));
    6108           0 :     pArray[2] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLPROPERTIES_SERVICE ));
    6109           0 :     pArray[3] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCHARPROPERTIES_SERVICE ));
    6110           0 :     pArray[4] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCPARAPROPERTIES_SERVICE ));
    6111           0 :     return aRet;
    6112             : }
    6113             : 
    6114             : //------------------------------------------------------------------------
    6115             : 
    6116           3 : const SvxItemPropertySet* ScCellObj::GetEditPropertySet()
    6117             : {
    6118           3 :     return lcl_GetEditPropertySet();
    6119             : }
    6120             : 
    6121           0 : const SfxItemPropertyMap& ScCellObj::GetCellPropertyMap()
    6122             : {
    6123           0 :     return lcl_GetCellPropertySet()->getPropertyMap();
    6124             : }
    6125             : 
    6126          22 : ScCellObj::ScCellObj(ScDocShell* pDocSh, const ScAddress& rP) :
    6127             :     ScCellRangeObj( pDocSh, ScRange(rP,rP) ),
    6128          22 :     pCellPropSet( lcl_GetCellPropertySet() ),
    6129             :     aCellPos( rP ),
    6130          44 :     nActionLockCount( 0 )
    6131             : {
    6132             :     //  pUnoText is allocated on demand (GetUnoText)
    6133             :     //  can't be aggregated because getString/setString is handled here
    6134          22 : }
    6135             : 
    6136          14 : SvxUnoText& ScCellObj::GetUnoText()
    6137             : {
    6138          14 :     if (!mxUnoText.is())
    6139             :     {
    6140           3 :         mxUnoText.set(new ScCellTextObj(GetDocShell(), aCellPos));
    6141           3 :         if (nActionLockCount)
    6142             :         {
    6143             :             ScCellEditSource* pEditSource =
    6144           2 :                 static_cast<ScCellEditSource*> (mxUnoText->GetEditSource());
    6145           2 :             if (pEditSource)
    6146           2 :                 pEditSource->SetDoUpdateData(false);
    6147             :         }
    6148             :     }
    6149          14 :     return *mxUnoText;
    6150             : }
    6151             : 
    6152          36 : ScCellObj::~ScCellObj()
    6153             : {
    6154          36 : }
    6155             : 
    6156           0 : void ScCellObj::RefChanged()
    6157             : {
    6158           0 :     ScCellRangeObj::RefChanged();
    6159             : 
    6160           0 :     const ScRangeList& rRanges = GetRangeList();
    6161             :     OSL_ENSURE(rRanges.size() == 1, "was fuer Ranges ?!?!");
    6162           0 :     if ( !rRanges.empty() )
    6163             :     {
    6164           0 :         const ScRange* pFirst = rRanges[ 0 ];
    6165           0 :         aCellPos = pFirst->aStart;
    6166             :     }
    6167           0 : }
    6168             : 
    6169          51 : uno::Any SAL_CALL ScCellObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException)
    6170             : {
    6171          51 :     SC_QUERYINTERFACE( table::XCell )
    6172          51 :     SC_QUERYINTERFACE( table::XCell2 )
    6173          51 :     SC_QUERYINTERFACE( sheet::XFormulaTokens )
    6174          51 :     SC_QUERYINTERFACE( sheet::XCellAddressable )
    6175          47 :     SC_QUERYINTERFACE( text::XText )
    6176          43 :     SC_QUERYINTERFACE( text::XSimpleText )
    6177          43 :     SC_QUERYINTERFACE( text::XTextRange )
    6178          39 :     SC_QUERYINTERFACE( container::XEnumerationAccess )
    6179          39 :     SC_QUERYINTERFACE( container::XElementAccess )
    6180          39 :     SC_QUERYINTERFACE( sheet::XSheetAnnotationAnchor )
    6181          38 :     SC_QUERYINTERFACE( text::XTextFieldsSupplier )
    6182          38 :     SC_QUERYINTERFACE( document::XActionLockable )
    6183             : 
    6184          36 :     return ScCellRangeObj::queryInterface( rType );
    6185             : }
    6186             : 
    6187         183 : void SAL_CALL ScCellObj::acquire() throw()
    6188             : {
    6189         183 :     ScCellRangeObj::acquire();
    6190         183 : }
    6191             : 
    6192         179 : void SAL_CALL ScCellObj::release() throw()
    6193             : {
    6194         179 :     ScCellRangeObj::release();
    6195         179 : }
    6196             : 
    6197           0 : uno::Sequence<uno::Type> SAL_CALL ScCellObj::getTypes() throw(uno::RuntimeException)
    6198             : {
    6199           0 :     static uno::Sequence<uno::Type> aTypes;
    6200           0 :     if ( aTypes.getLength() == 0 )
    6201             :     {
    6202           0 :         uno::Sequence<uno::Type> aParentTypes(ScCellRangeObj::getTypes());
    6203           0 :         long nParentLen = aParentTypes.getLength();
    6204           0 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    6205             : 
    6206           0 :         aTypes.realloc( nParentLen + 9 );
    6207           0 :         uno::Type* pPtr = aTypes.getArray();
    6208           0 :         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<table::XCell>*)0);
    6209           0 :         pPtr[nParentLen + 1] = getCppuType((const uno::Reference<sheet::XCellAddressable>*)0);
    6210           0 :         pPtr[nParentLen + 2] = getCppuType((const uno::Reference<text::XText>*)0);
    6211           0 :         pPtr[nParentLen + 3] = getCppuType((const uno::Reference<container::XEnumerationAccess>*)0);
    6212           0 :         pPtr[nParentLen + 4] = getCppuType((const uno::Reference<sheet::XSheetAnnotationAnchor>*)0);
    6213           0 :         pPtr[nParentLen + 5] = getCppuType((const uno::Reference<text::XTextFieldsSupplier>*)0);
    6214           0 :         pPtr[nParentLen + 6] = getCppuType((const uno::Reference<document::XActionLockable>*)0);
    6215           0 :         pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XFormulaTokens>*)0);
    6216           0 :         pPtr[nParentLen + 8] = getCppuType((const uno::Reference<table::XCell2>*)0);
    6217             : 
    6218           0 :         for (long i=0; i<nParentLen; i++)
    6219           0 :             pPtr[i] = pParentPtr[i];                // parent types first
    6220             :     }
    6221           0 :     return aTypes;
    6222             : }
    6223             : 
    6224             : namespace
    6225             : {
    6226             :     class theScCellObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScCellObjImplementationId > {};
    6227             : }
    6228             : 
    6229           0 : uno::Sequence<sal_Int8> SAL_CALL ScCellObj::getImplementationId() throw(uno::RuntimeException)
    6230             : {
    6231           0 :     return theScCellObjImplementationId::get().getSeq();
    6232             : }
    6233             : 
    6234             : //  Hilfsfunktionen
    6235             : 
    6236           0 : String ScCellObj::GetInputString_Impl(sal_Bool bEnglish) const      // fuer getFormula / FormulaLocal
    6237             : {
    6238           0 :     if (GetDocShell())
    6239           0 :         return lcl_GetInputString( GetDocShell()->GetDocument(), aCellPos, bEnglish );
    6240           0 :     return String();
    6241             : }
    6242             : 
    6243           5 : String ScCellObj::GetOutputString_Impl(ScDocument* pDoc, const ScAddress& aCellPos)
    6244             : {
    6245           5 :     rtl::OUString aVal;
    6246           5 :     if ( pDoc )
    6247             :     {
    6248           5 :         ScBaseCell* pCell = pDoc->GetCell( aCellPos );
    6249           5 :         if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE )
    6250             :         {
    6251           5 :             if ( pCell->GetCellType() == CELLTYPE_EDIT )
    6252             :             {
    6253             :                 //  GetString an der EditCell macht Leerzeichen aus Umbruechen,
    6254             :                 //  hier werden die Umbrueche aber gebraucht
    6255           0 :                 const EditTextObject* pData = ((ScEditCell*)pCell)->GetData();
    6256           0 :                 if (pData)
    6257             :                 {
    6258           0 :                     EditEngine& rEngine = pDoc->GetEditEngine();
    6259           0 :                     rEngine.SetText( *pData );
    6260           0 :                     aVal = rEngine.GetText( LINEEND_LF );
    6261             :                 }
    6262             :                 //  Edit-Zellen auch nicht per NumberFormatter formatieren
    6263             :                 //  (passend zur Ausgabe)
    6264             :             }
    6265             :             else
    6266             :             {
    6267             :                 //  wie in GetString am Dokument (column)
    6268             :                 Color* pColor;
    6269           5 :                 sal_uLong nNumFmt = pDoc->GetNumberFormat( aCellPos );
    6270           5 :                 ScCellFormat::GetString( pCell, nNumFmt, aVal, &pColor, *pDoc->GetFormatTable() );
    6271             :             }
    6272             :         }
    6273             :     }
    6274           5 :     return aVal;
    6275             : }
    6276             : 
    6277           3 : String ScCellObj::GetOutputString_Impl() const
    6278             : {
    6279           3 :     ScDocShell* pDocSh = GetDocShell();
    6280           3 :     String aVal;
    6281           3 :     if ( pDocSh )
    6282           3 :         aVal = GetOutputString_Impl(pDocSh->GetDocument(), aCellPos);
    6283           3 :     return aVal;
    6284             : }
    6285             : 
    6286           1 : void ScCellObj::SetString_Impl(const String& rString, sal_Bool bInterpret, sal_Bool bEnglish)
    6287             : {
    6288           1 :     ScDocShell* pDocSh = GetDocShell();
    6289           1 :     if ( pDocSh )
    6290             :     {
    6291             :         // GRAM_PODF_A1 for API compatibility.
    6292           1 :         (void)pDocSh->GetDocFunc().SetCellText( aCellPos, rString, bInterpret, bEnglish,
    6293           1 :                                                    sal_True, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 );
    6294             :     }
    6295           1 : }
    6296             : 
    6297           1 : double ScCellObj::GetValue_Impl() const
    6298             : {
    6299           1 :     ScDocShell* pDocSh = GetDocShell();
    6300           1 :     if ( pDocSh )
    6301           1 :         return pDocSh->GetDocument()->GetValue( aCellPos );
    6302             : 
    6303           0 :     return 0.0;
    6304             : }
    6305             : 
    6306           0 : void ScCellObj::SetValue_Impl(double fValue)
    6307             : {
    6308           0 :     ScDocShell* pDocSh = GetDocShell();
    6309           0 :     if ( pDocSh )
    6310           0 :         (void)pDocSh->GetDocFunc().PutCell( aCellPos, new ScValueCell(fValue), sal_True );
    6311           0 : }
    6312             : 
    6313             : // only for XML import
    6314             : 
    6315           0 : void ScCellObj::InputEnglishString( const ::rtl::OUString& rText )
    6316             : {
    6317             :     // This is like a mixture of setFormula and property FormulaLocal:
    6318             :     // The cell's number format is checked for "text", a new cell format may be set,
    6319             :     // but all parsing is in English.
    6320             : 
    6321           0 :     ScDocShell* pDocSh = GetDocShell();
    6322           0 :     if ( pDocSh )
    6323             :     {
    6324           0 :         String aString(rText);
    6325           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    6326           0 :         SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
    6327           0 :         sal_uInt32 nOldFormat = pDoc->GetNumberFormat( aCellPos );
    6328           0 :         if ( pFormatter->GetType( nOldFormat ) == NUMBERFORMAT_TEXT )
    6329             :         {
    6330           0 :             SetString_Impl(aString, false, false);      // text cell
    6331             :         }
    6332             :         else
    6333             :         {
    6334           0 :             ScDocFunc &rFunc = pDocSh->GetDocFunc();
    6335           0 :             short nFormatType = 0;
    6336             :             ScBaseCell* pNewCell = rFunc.InterpretEnglishString( aCellPos, aString,
    6337           0 :                                     EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1, &nFormatType );
    6338           0 :             if (pNewCell)
    6339             :             {
    6340           0 :                 if ( ( nOldFormat % SV_COUNTRY_LANGUAGE_OFFSET ) == 0 && nFormatType != 0 )
    6341             :                 {
    6342             :                     // apply a format for the recognized type and the old format's language
    6343           0 :                     sal_uInt32 nNewFormat = ScGlobal::GetStandardFormat( *pFormatter, nOldFormat, nFormatType );
    6344           0 :                     if ( nNewFormat != nOldFormat )
    6345             :                     {
    6346           0 :                         ScPatternAttr aPattern( pDoc->GetPool() );
    6347           0 :                         aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) );
    6348             :                         // ATTR_LANGUAGE_FORMAT remains unchanged
    6349           0 :                         rFunc.ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True );
    6350             :                     }
    6351             :                 }
    6352             :                 // put the cell into the document
    6353             :                 // (after applying the format, so possible formula recalculation already uses the new format)
    6354           0 :                 (void)rFunc.PutCell( aCellPos, pNewCell, sal_True );
    6355             :             }
    6356             :             else
    6357           0 :                 SetString_Impl(aString, false, false);      // no cell from InterpretEnglishString, probably empty string
    6358           0 :         }
    6359             :     }
    6360           0 : }
    6361             : 
    6362             : //  XText
    6363             : 
    6364           2 : uno::Reference<text::XTextCursor> SAL_CALL ScCellObj::createTextCursor()
    6365             :                                                     throw(uno::RuntimeException)
    6366             : {
    6367           2 :     SolarMutexGuard aGuard;
    6368           2 :     return new ScCellTextCursor( *this );
    6369             : }
    6370             : 
    6371           2 : uno::Reference<text::XTextCursor> SAL_CALL ScCellObj::createTextCursorByRange(
    6372             :                                     const uno::Reference<text::XTextRange>& aTextPosition )
    6373             :                                                     throw(uno::RuntimeException)
    6374             : {
    6375           2 :     SolarMutexGuard aGuard;
    6376           2 :     SvxUnoTextCursor* pCursor = new ScCellTextCursor( *this );
    6377           2 :     uno::Reference<text::XTextCursor> xCursor(pCursor);
    6378             : 
    6379           2 :     SvxUnoTextRangeBase* pRange = SvxUnoTextRangeBase::getImplementation( aTextPosition );
    6380           2 :     if(pRange)
    6381           2 :         pCursor->SetSelection( pRange->GetSelection() );
    6382             :     else
    6383             :     {
    6384           0 :         ScCellTextCursor* pOther = ScCellTextCursor::getImplementation( aTextPosition );
    6385           0 :         if(pOther)
    6386           0 :             pCursor->SetSelection( pOther->GetSelection() );
    6387             :         else
    6388           0 :             throw uno::RuntimeException();
    6389             :     }
    6390             : 
    6391           2 :     return xCursor;
    6392             : }
    6393             : 
    6394           3 : rtl::OUString SAL_CALL ScCellObj::getString() throw(uno::RuntimeException)
    6395             : {
    6396           3 :     SolarMutexGuard aGuard;
    6397           3 :     return GetOutputString_Impl();
    6398             : }
    6399             : 
    6400           1 : void SAL_CALL ScCellObj::setString( const rtl::OUString& aText ) throw(uno::RuntimeException)
    6401             : {
    6402           1 :     SolarMutexGuard aGuard;
    6403           1 :     String aString(aText);
    6404           1 :     SetString_Impl(aString, false, false);  // immer Text
    6405             : 
    6406             :     // don't create pUnoText here if not there
    6407           1 :     if (mxUnoText.is())
    6408           0 :         mxUnoText->SetSelection(ESelection( 0,0, 0,aString.Len() ));
    6409           1 : }
    6410             : 
    6411           5 : void SAL_CALL ScCellObj::insertString( const uno::Reference<text::XTextRange>& xRange,
    6412             :                                         const rtl::OUString& aString, sal_Bool bAbsorb )
    6413             :                                     throw(uno::RuntimeException)
    6414             : {
    6415             :     // special handling for ScCellTextCursor is no longer needed,
    6416             :     // SvxUnoText::insertString checks for SvxUnoTextRangeBase instead of SvxUnoTextRange
    6417             : 
    6418           5 :     SolarMutexGuard aGuard;
    6419           5 :     GetUnoText().insertString(xRange, aString, bAbsorb);
    6420           5 : }
    6421             : 
    6422           3 : void SAL_CALL ScCellObj::insertControlCharacter( const uno::Reference<text::XTextRange>& xRange,
    6423             :                                                 sal_Int16 nControlCharacter, sal_Bool bAbsorb )
    6424             :                                     throw(lang::IllegalArgumentException, uno::RuntimeException)
    6425             : {
    6426           3 :     SolarMutexGuard aGuard;
    6427           3 :     GetUnoText().insertControlCharacter(xRange, nControlCharacter, bAbsorb);
    6428           3 : }
    6429             : 
    6430           0 : void SAL_CALL ScCellObj::insertTextContent( const uno::Reference<text::XTextRange >& xRange,
    6431             :                                                 const uno::Reference<text::XTextContent >& xContent,
    6432             :                                                 sal_Bool bAbsorb )
    6433             :                                     throw(lang::IllegalArgumentException, uno::RuntimeException)
    6434             : {
    6435           0 :     SolarMutexGuard aGuard;
    6436           0 :     ScDocShell* pDocSh = GetDocShell();
    6437           0 :     if ( pDocSh && xContent.is() )
    6438             :     {
    6439           0 :         ScEditFieldObj* pCellField = ScEditFieldObj::getImplementation(xContent);
    6440           0 :         SvxUnoTextRangeBase* pTextRange = ScCellTextCursor::getImplementation( xRange );
    6441             : 
    6442           0 :         if ( pCellField && !pCellField->IsInserted() && pTextRange )
    6443             :         {
    6444           0 :             SvxEditSource* pEditSource = pTextRange->GetEditSource();
    6445           0 :             ESelection aSelection(pTextRange->GetSelection());
    6446             : 
    6447           0 :             if (!bAbsorb)
    6448             :             {
    6449             :                 //  nicht ersetzen -> hinten anhaengen
    6450           0 :                 aSelection.Adjust();
    6451           0 :                 aSelection.nStartPara = aSelection.nEndPara;
    6452           0 :                 aSelection.nStartPos  = aSelection.nEndPos;
    6453             :             }
    6454             : 
    6455           0 :             if (pCellField->GetFieldType() == text::textfield::Type::TABLE)
    6456           0 :                 pCellField->setPropertyValue(SC_UNONAME_TABLEPOS, uno::makeAny<sal_Int32>(aCellPos.Tab()));
    6457             : 
    6458           0 :             SvxFieldItem aItem = pCellField->CreateFieldItem();
    6459           0 :             SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder();
    6460           0 :             pForwarder->QuickInsertField( aItem, aSelection );
    6461           0 :             pEditSource->UpdateData();
    6462             : 
    6463             :             //  neue Selektion: ein Zeichen
    6464           0 :             aSelection.Adjust();
    6465           0 :             aSelection.nEndPara = aSelection.nStartPara;
    6466           0 :             aSelection.nEndPos = aSelection.nStartPos + 1;
    6467           0 :             uno::Reference<text::XTextRange> xParent(this);
    6468             :             pCellField->InitDoc(
    6469           0 :                 xParent, new ScCellEditSource(pDocSh, aCellPos), aSelection);
    6470             : 
    6471             :             //  for bAbsorb=FALSE, the new selection must be behind the inserted content
    6472             :             //  (the xml filter relies on this)
    6473           0 :             if (!bAbsorb)
    6474           0 :                 aSelection.nStartPos = aSelection.nEndPos;
    6475             : 
    6476           0 :             pTextRange->SetSelection( aSelection );
    6477             : 
    6478           0 :             return;
    6479             :         }
    6480             :     }
    6481           0 :     GetUnoText().insertTextContent(xRange, xContent, bAbsorb);
    6482             : }
    6483             : 
    6484           0 : void SAL_CALL ScCellObj::removeTextContent( const uno::Reference<text::XTextContent>& xContent )
    6485             :                                 throw(container::NoSuchElementException, uno::RuntimeException)
    6486             : {
    6487           0 :     SolarMutexGuard aGuard;
    6488           0 :     if ( xContent.is() )
    6489             :     {
    6490           0 :         ScEditFieldObj* pCellField = ScEditFieldObj::getImplementation(xContent);
    6491           0 :         if ( pCellField && pCellField->IsInserted() )
    6492             :         {
    6493             :             //! Testen, ob das Feld in dieser Zelle ist
    6494           0 :             pCellField->DeleteField();
    6495           0 :             return;
    6496             :         }
    6497             :     }
    6498           0 :     GetUnoText().removeTextContent(xContent);
    6499             : }
    6500             : 
    6501           0 : uno::Reference<text::XText> SAL_CALL ScCellObj::getText() throw(uno::RuntimeException)
    6502             : {
    6503           0 :     SolarMutexGuard aGuard;
    6504           0 :     return this;
    6505             : }
    6506             : 
    6507           0 : uno::Reference<text::XTextRange> SAL_CALL ScCellObj::getStart() throw(uno::RuntimeException)
    6508             : {
    6509           0 :     SolarMutexGuard aGuard;
    6510           0 :     return GetUnoText().getStart();
    6511             : }
    6512             : 
    6513           2 : uno::Reference<text::XTextRange> SAL_CALL ScCellObj::getEnd() throw(uno::RuntimeException)
    6514             : {
    6515           2 :     SolarMutexGuard aGuard;
    6516           2 :     return GetUnoText().getEnd();
    6517             : }
    6518             : 
    6519           0 : uno::Reference<container::XEnumeration> SAL_CALL ScCellObj::createEnumeration()
    6520             :                                                     throw(uno::RuntimeException)
    6521             : {
    6522           0 :     SolarMutexGuard aGuard;
    6523           0 :     return GetUnoText().createEnumeration();
    6524             : }
    6525             : 
    6526           0 : uno::Type SAL_CALL ScCellObj::getElementType() throw(uno::RuntimeException)
    6527             : {
    6528           0 :     SolarMutexGuard aGuard;
    6529           0 :     return GetUnoText().getElementType();
    6530             : }
    6531             : 
    6532           0 : sal_Bool SAL_CALL ScCellObj::hasElements() throw(uno::RuntimeException)
    6533             : {
    6534           0 :     SolarMutexGuard aGuard;
    6535           0 :     return GetUnoText().hasElements();
    6536             : }
    6537             : 
    6538             : //  XCell
    6539             : 
    6540           0 : rtl::OUString SAL_CALL ScCellObj::getFormula() throw(uno::RuntimeException)
    6541             : {
    6542           0 :     SolarMutexGuard aGuard;
    6543           0 :     return GetInputString_Impl( true /* English */ );
    6544             : }
    6545             : 
    6546           0 : void SAL_CALL ScCellObj::setFormula( const rtl::OUString& aFormula ) throw(uno::RuntimeException)
    6547             : {
    6548           0 :     SolarMutexGuard aGuard;
    6549           0 :     String aString(aFormula);
    6550           0 :     SetString_Impl(aString, sal_True, sal_True); // Interpret as English
    6551           0 : }
    6552             : 
    6553           1 : double SAL_CALL ScCellObj::getValue() throw(uno::RuntimeException)
    6554             : {
    6555           1 :     SolarMutexGuard aGuard;
    6556           1 :     return GetValue_Impl();
    6557             : }
    6558             : 
    6559           0 : void SAL_CALL ScCellObj::setValue( double nValue ) throw(uno::RuntimeException)
    6560             : {
    6561           0 :     SolarMutexGuard aGuard;
    6562           0 :     SetValue_Impl(nValue);
    6563           0 : }
    6564             : 
    6565           0 : void SAL_CALL ScCellObj::setFormulaString( const rtl::OUString& aFormula) throw(uno::RuntimeException)
    6566             : {
    6567           0 :     SolarMutexGuard aGuard;
    6568           0 :     ScDocShell *pDocSh = GetDocShell();
    6569           0 :     if( pDocSh )
    6570             :     {
    6571           0 :         ScFormulaCell* pCell = new ScFormulaCell( pDocSh->GetDocument(), aCellPos );
    6572           0 :         pCell->SetHybridFormula( aFormula, formula::FormulaGrammar::GRAM_NATIVE );
    6573           0 :         pDocSh->GetDocFunc().PutCell( aCellPos, pCell, sal_True );
    6574           0 :     }
    6575           0 : }
    6576           0 : void SAL_CALL ScCellObj::setFormulaResult( double nValue ) throw(uno::RuntimeException)
    6577             : {
    6578           0 :     SolarMutexGuard aGuard;
    6579           0 :     ScDocShell* pDocSh = GetDocShell();
    6580           0 :     if ( pDocSh && pDocSh->GetDocument()->GetCellType( aCellPos ) == CELLTYPE_FORMULA )
    6581             :     {
    6582           0 :         ScFormulaCell* pCell = (ScFormulaCell *)pDocSh->GetDocument()->GetCell( aCellPos );
    6583           0 :         pCell->SetHybridDouble( nValue );
    6584           0 :         pCell->ResetDirty();
    6585           0 :         pCell->ResetChanged();
    6586           0 :     }
    6587           0 : }
    6588             : 
    6589           1 : table::CellContentType SAL_CALL ScCellObj::getType() throw(uno::RuntimeException)
    6590             : {
    6591           1 :     SolarMutexGuard aGuard;
    6592           1 :     table::CellContentType eRet = table::CellContentType_EMPTY;
    6593           1 :     ScDocShell* pDocSh = GetDocShell();
    6594           1 :     if (pDocSh)
    6595             :     {
    6596           1 :         CellType eCalcType = pDocSh->GetDocument()->GetCellType( aCellPos );
    6597           1 :         switch (eCalcType)
    6598             :         {
    6599             :             case CELLTYPE_VALUE:
    6600           1 :                 eRet = table::CellContentType_VALUE;
    6601           1 :                 break;
    6602             :             case CELLTYPE_STRING:
    6603             :             case CELLTYPE_EDIT:
    6604           0 :                 eRet = table::CellContentType_TEXT;
    6605           0 :                 break;
    6606             :             case CELLTYPE_FORMULA:
    6607           0 :                 eRet = table::CellContentType_FORMULA;
    6608           0 :                 break;
    6609             :             default:
    6610           0 :                 eRet = table::CellContentType_EMPTY;
    6611             :         }
    6612             :     }
    6613             :     else
    6614             :     {
    6615             :         OSL_FAIL("keine DocShell");     //! Exception oder so?
    6616             :     }
    6617             : 
    6618           1 :     return eRet;
    6619             : }
    6620             : 
    6621           0 : table::CellContentType ScCellObj::GetResultType_Impl()
    6622             : {
    6623           0 :     ScDocShell* pDocSh = GetDocShell();
    6624           0 :     if ( pDocSh )
    6625             :     {
    6626           0 :         ScBaseCell* pCell = pDocSh->GetDocument()->GetCell(aCellPos);
    6627           0 :         if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA )
    6628             :         {
    6629           0 :             sal_Bool bValue = ((ScFormulaCell*)pCell)->IsValue();
    6630           0 :             return bValue ? table::CellContentType_VALUE : table::CellContentType_TEXT;
    6631             :         }
    6632             :     }
    6633           0 :     return getType();   // wenn keine Formel
    6634             : }
    6635             : 
    6636           0 : sal_Int32 SAL_CALL ScCellObj::getError() throw(uno::RuntimeException)
    6637             : {
    6638           0 :     SolarMutexGuard aGuard;
    6639           0 :     sal_uInt16 nError = 0;
    6640           0 :     ScDocShell* pDocSh = GetDocShell();
    6641           0 :     if (pDocSh)
    6642             :     {
    6643           0 :         ScBaseCell* pCell = pDocSh->GetDocument()->GetCell( aCellPos );
    6644           0 :         if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA )
    6645           0 :             nError = ((ScFormulaCell*)pCell)->GetErrCode();
    6646             :         // sonst bleibt's bei 0
    6647             :     }
    6648             :     else
    6649             :     {
    6650             :         OSL_FAIL("keine DocShell");     //! Exception oder so?
    6651             :     }
    6652             : 
    6653           0 :     return nError;
    6654             : }
    6655             : 
    6656             : // XFormulaTokens
    6657             : 
    6658           0 : uno::Sequence<sheet::FormulaToken> SAL_CALL ScCellObj::getTokens() throw(uno::RuntimeException)
    6659             : {
    6660           0 :     SolarMutexGuard aGuard;
    6661           0 :     uno::Sequence<sheet::FormulaToken> aSequence;
    6662           0 :     ScDocShell* pDocSh = GetDocShell();
    6663           0 :     if ( pDocSh )
    6664             :     {
    6665           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    6666           0 :         ScBaseCell* pCell = pDoc->GetCell( aCellPos );
    6667           0 :         if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA )
    6668             :         {
    6669           0 :             ScTokenArray* pTokenArray = static_cast<ScFormulaCell*>(pCell)->GetCode();
    6670           0 :             if ( pTokenArray )
    6671           0 :                 (void)ScTokenConversion::ConvertToTokenSequence( *pDoc, aSequence, *pTokenArray );
    6672             :         }
    6673             :     }
    6674           0 :     return aSequence;
    6675             : }
    6676             : 
    6677           0 : void SAL_CALL ScCellObj::setTokens( const uno::Sequence<sheet::FormulaToken>& rTokens ) throw(uno::RuntimeException)
    6678             : {
    6679           0 :     SolarMutexGuard aGuard;
    6680           0 :     ScDocShell* pDocSh = GetDocShell();
    6681           0 :     if ( pDocSh )
    6682             :     {
    6683           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    6684           0 :         ScTokenArray aTokenArray;
    6685           0 :         (void)ScTokenConversion::ConvertToTokenArray( *pDoc, aTokenArray, rTokens );
    6686             : 
    6687           0 :         ScBaseCell* pNewCell = new ScFormulaCell( pDoc, aCellPos, &aTokenArray );
    6688           0 :         (void)pDocSh->GetDocFunc().PutCell( aCellPos, pNewCell, sal_True );
    6689           0 :     }
    6690           0 : }
    6691             : 
    6692             : // XCellAddressable
    6693             : 
    6694           0 : table::CellAddress SAL_CALL ScCellObj::getCellAddress() throw(uno::RuntimeException)
    6695             : {
    6696           0 :     SolarMutexGuard aGuard;
    6697           0 :     table::CellAddress aAdr;
    6698           0 :     aAdr.Sheet  = aCellPos.Tab();
    6699           0 :     aAdr.Column = aCellPos.Col();
    6700           0 :     aAdr.Row    = aCellPos.Row();
    6701           0 :     return aAdr;
    6702             : }
    6703             : 
    6704             : // XSheetAnnotationAnchor
    6705             : 
    6706           1 : uno::Reference<sheet::XSheetAnnotation> SAL_CALL ScCellObj::getAnnotation()
    6707             :                                                 throw(uno::RuntimeException)
    6708             : {
    6709           1 :     SolarMutexGuard aGuard;
    6710           1 :     ScDocShell* pDocSh = GetDocShell();
    6711           1 :     if ( pDocSh )
    6712           1 :         return new ScAnnotationObj( pDocSh, aCellPos );
    6713             : 
    6714             :     OSL_FAIL("getAnnotation ohne DocShell");
    6715           0 :     return NULL;
    6716             : }
    6717             : 
    6718             : // XFieldTypesSupplier
    6719             : 
    6720           0 : uno::Reference<container::XEnumerationAccess> SAL_CALL ScCellObj::getTextFields()
    6721             :                                                 throw(uno::RuntimeException)
    6722             : {
    6723           0 :     SolarMutexGuard aGuard;
    6724           0 :     ScDocShell* pDocSh = GetDocShell();
    6725           0 :     if ( pDocSh )
    6726             :     {
    6727           0 :         uno::Reference<text::XTextRange> xContent(this);
    6728           0 :         return new ScCellFieldsObj(xContent, pDocSh, aCellPos);
    6729             :     }
    6730             : 
    6731           0 :     return NULL;
    6732             : }
    6733             : 
    6734           0 : uno::Reference<container::XNameAccess> SAL_CALL ScCellObj::getTextFieldMasters()
    6735             :                                                 throw(uno::RuntimeException)
    6736             : {
    6737             :     //  sowas gibts nicht im Calc (?)
    6738           0 :     return NULL;
    6739             : }
    6740             : 
    6741             : // XPropertySet erweitert fuer Zell-Properties
    6742             : 
    6743          14 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellObj::getPropertySetInfo()
    6744             :                                                         throw(uno::RuntimeException)
    6745             : {
    6746          14 :     SolarMutexGuard aGuard;
    6747             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    6748          14 :         new SfxItemPropertySetInfo( pCellPropSet->getPropertyMap() ));
    6749          14 :     return aRef;
    6750             : }
    6751             : 
    6752           0 : void ScCellObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    6753             :                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
    6754             : {
    6755           0 :     if ( pEntry )
    6756             :     {
    6757           0 :         if ( pEntry->nWID == SC_WID_UNO_FORMLOC )
    6758             :         {
    6759           0 :             rtl::OUString aStrVal;
    6760           0 :             aValue >>= aStrVal;
    6761           0 :             String aString(aStrVal);
    6762           0 :             SetString_Impl(aString, sal_True, false);   // lokal interpretieren
    6763             :         }
    6764           0 :         else if ( pEntry->nWID == SC_WID_UNO_FORMRT )
    6765             :         {
    6766             :             //  Read-Only
    6767             :             //! Exception oder so...
    6768             :         }
    6769             :         else
    6770           0 :             ScCellRangeObj::SetOnePropertyValue( pEntry, aValue );
    6771             :     }
    6772           0 : }
    6773             : 
    6774          13 : void ScCellObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
    6775             :                                         uno::Any& rAny )
    6776             :                                             throw(uno::RuntimeException)
    6777             : {
    6778          13 :     if ( pEntry )
    6779             :     {
    6780          13 :         if ( pEntry->nWID == SC_WID_UNO_FORMLOC )
    6781             :         {
    6782             :             // sal_False = lokal
    6783           0 :             rAny <<= rtl::OUString( GetInputString_Impl(false) );
    6784             :         }
    6785          13 :         else if ( pEntry->nWID == SC_WID_UNO_FORMRT )
    6786             :         {
    6787           0 :             table::CellContentType eType = GetResultType_Impl();
    6788           0 :             rAny <<= eType;
    6789             :         }
    6790             :         else
    6791          13 :             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
    6792             :     }
    6793          13 : }
    6794             : 
    6795          13 : const SfxItemPropertyMap& ScCellObj::GetItemPropertyMap()
    6796             : {
    6797          13 :     return pCellPropSet->getPropertyMap();
    6798             : }
    6799             : 
    6800             : // XServiceInfo
    6801             : 
    6802           0 : rtl::OUString SAL_CALL ScCellObj::getImplementationName() throw(uno::RuntimeException)
    6803             : {
    6804           0 :     return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScCellObj" ));
    6805             : }
    6806             : 
    6807           0 : sal_Bool SAL_CALL ScCellObj::supportsService( const rtl::OUString& rServiceName )
    6808             :                                                     throw(uno::RuntimeException)
    6809             : {
    6810             :     //  CellRange/SheetCellRange are not in SheetCell service description,
    6811             :     //  but ScCellObj is used instead of ScCellRangeObj in CellRanges collections,
    6812             :     //  so it must support them
    6813             : 
    6814           0 :     String aServiceStr(rServiceName);
    6815           0 :     return aServiceStr.EqualsAscii( SCSHEETCELL_SERVICE ) ||
    6816           0 :            aServiceStr.EqualsAscii( SCCELL_SERVICE ) ||
    6817           0 :            aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) ||
    6818           0 :            aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) ||
    6819           0 :            aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE ) ||
    6820           0 :            aServiceStr.EqualsAscii( SCSHEETCELLRANGE_SERVICE ) ||
    6821           0 :            aServiceStr.EqualsAscii( SCCELLRANGE_SERVICE );
    6822             : }
    6823             : 
    6824           0 : uno::Sequence<rtl::OUString> SAL_CALL ScCellObj::getSupportedServiceNames()
    6825             :                                                     throw(uno::RuntimeException)
    6826             : {
    6827           0 :     uno::Sequence<rtl::OUString> aRet(7);
    6828           0 :     rtl::OUString* pArray = aRet.getArray();
    6829           0 :     pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELL_SERVICE ));
    6830           0 :     pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELL_SERVICE ));
    6831           0 :     pArray[2] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLPROPERTIES_SERVICE ));
    6832           0 :     pArray[3] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCHARPROPERTIES_SERVICE ));
    6833           0 :     pArray[4] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCPARAPROPERTIES_SERVICE ));
    6834           0 :     pArray[5] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELLRANGE_SERVICE ));
    6835           0 :     pArray[6] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLRANGE_SERVICE ));
    6836           0 :     return aRet;
    6837             : }
    6838             : 
    6839             : // XActionLockable
    6840             : 
    6841           0 : sal_Bool SAL_CALL ScCellObj::isActionLocked() throw(uno::RuntimeException)
    6842             : {
    6843           0 :     SolarMutexGuard aGuard;
    6844           0 :     return nActionLockCount != 0;
    6845             : }
    6846             : 
    6847           2 : void SAL_CALL ScCellObj::addActionLock() throw(uno::RuntimeException)
    6848             : {
    6849           2 :     SolarMutexGuard aGuard;
    6850           2 :     if (!nActionLockCount)
    6851             :     {
    6852           2 :         if (mxUnoText.is())
    6853             :         {
    6854             :             ScCellEditSource* pEditSource =
    6855           0 :                 static_cast<ScCellEditSource*> (mxUnoText->GetEditSource());
    6856           0 :             if (pEditSource)
    6857           0 :                 pEditSource->SetDoUpdateData(false);
    6858             :         }
    6859             :     }
    6860           2 :     nActionLockCount++;
    6861           2 : }
    6862             : 
    6863           0 : void SAL_CALL ScCellObj::removeActionLock() throw(uno::RuntimeException)
    6864             : {
    6865           0 :     SolarMutexGuard aGuard;
    6866           0 :     if (nActionLockCount > 0)
    6867             :     {
    6868           0 :         nActionLockCount--;
    6869           0 :         if (!nActionLockCount)
    6870             :         {
    6871           0 :             if (mxUnoText.is())
    6872             :             {
    6873             :                 ScCellEditSource* pEditSource =
    6874           0 :                     static_cast<ScCellEditSource*> (mxUnoText->GetEditSource());
    6875           0 :                 if (pEditSource)
    6876             :                 {
    6877           0 :                     pEditSource->SetDoUpdateData(sal_True);
    6878           0 :                     if (pEditSource->IsDirty())
    6879           0 :                         pEditSource->UpdateData();
    6880             :                 }
    6881             :             }
    6882             :         }
    6883           0 :     }
    6884           0 : }
    6885             : 
    6886           0 : void SAL_CALL ScCellObj::setActionLocks( sal_Int16 nLock ) throw(uno::RuntimeException)
    6887             : {
    6888           0 :     SolarMutexGuard aGuard;
    6889           0 :     if (mxUnoText.is())
    6890             :     {
    6891             :         ScCellEditSource* pEditSource =
    6892           0 :             static_cast<ScCellEditSource*> (mxUnoText->GetEditSource());
    6893           0 :         if (pEditSource)
    6894             :         {
    6895           0 :             pEditSource->SetDoUpdateData(nLock == 0);
    6896           0 :             if ((nActionLockCount > 0) && (nLock == 0) && pEditSource->IsDirty())
    6897           0 :                 pEditSource->UpdateData();
    6898             :         }
    6899             :     }
    6900           0 :     nActionLockCount = nLock;
    6901           0 : }
    6902             : 
    6903           0 : sal_Int16 SAL_CALL ScCellObj::resetActionLocks() throw(uno::RuntimeException)
    6904             : {
    6905           0 :     SolarMutexGuard aGuard;
    6906           0 :     sal_uInt16 nRet(nActionLockCount);
    6907           0 :     if (mxUnoText.is())
    6908             :     {
    6909             :         ScCellEditSource* pEditSource =
    6910           0 :             static_cast<ScCellEditSource*> (mxUnoText->GetEditSource());
    6911           0 :         if (pEditSource)
    6912             :         {
    6913           0 :             pEditSource->SetDoUpdateData(sal_True);
    6914           0 :             if (pEditSource->IsDirty())
    6915           0 :                 pEditSource->UpdateData();
    6916             :         }
    6917             :     }
    6918           0 :     nActionLockCount = 0;
    6919           0 :     return nRet;
    6920             : }
    6921             : 
    6922             : //------------------------------------------------------------------------
    6923             : 
    6924         158 : ScTableSheetObj::ScTableSheetObj( ScDocShell* pDocSh, SCTAB nTab ) :
    6925             :     ScCellRangeObj( pDocSh, ScRange(0,0,nTab, MAXCOL,MAXROW,nTab) ),
    6926         158 :     pSheetPropSet(lcl_GetSheetPropertySet())
    6927             : {
    6928         158 : }
    6929             : 
    6930         316 : ScTableSheetObj::~ScTableSheetObj()
    6931             : {
    6932         316 : }
    6933             : 
    6934           0 : void ScTableSheetObj::InitInsertSheet(ScDocShell* pDocSh, SCTAB nTab)
    6935             : {
    6936           0 :     InitInsertRange( pDocSh, ScRange(0,0,nTab, MAXCOL,MAXROW,nTab) );
    6937           0 : }
    6938             : 
    6939         647 : uno::Any SAL_CALL ScTableSheetObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException)
    6940             : {
    6941         647 :     SC_QUERYINTERFACE( sheet::XSpreadsheet )
    6942         532 :     SC_QUERYINTERFACE( container::XNamed )
    6943         494 :     SC_QUERYINTERFACE( sheet::XSheetPageBreak )
    6944         494 :     SC_QUERYINTERFACE( sheet::XCellRangeMovement )
    6945         494 :     SC_QUERYINTERFACE( table::XTableChartsSupplier )
    6946         494 :     SC_QUERYINTERFACE( sheet::XDataPilotTablesSupplier )
    6947         494 :     SC_QUERYINTERFACE( sheet::XScenariosSupplier )
    6948         494 :     SC_QUERYINTERFACE( sheet::XSheetAnnotationsSupplier )
    6949         491 :     SC_QUERYINTERFACE( drawing::XDrawPageSupplier )
    6950         459 :     SC_QUERYINTERFACE( sheet::XPrintAreas )
    6951         457 :     SC_QUERYINTERFACE( sheet::XSheetAuditing )
    6952         457 :     SC_QUERYINTERFACE( sheet::XSheetOutline )
    6953         457 :     SC_QUERYINTERFACE( util::XProtectable )
    6954         455 :     SC_QUERYINTERFACE( sheet::XScenario )
    6955         455 :     SC_QUERYINTERFACE( sheet::XScenarioEnhanced )
    6956         455 :     SC_QUERYINTERFACE( sheet::XSheetLinkable )
    6957         453 :     SC_QUERYINTERFACE( sheet::XExternalSheetName )
    6958         453 :     SC_QUERYINTERFACE( document::XEventsSupplier )
    6959             : 
    6960         453 :     return ScCellRangeObj::queryInterface( rType );
    6961             : }
    6962             : 
    6963        3323 : void SAL_CALL ScTableSheetObj::acquire() throw()
    6964             : {
    6965        3323 :     ScCellRangeObj::acquire();
    6966        3323 : }
    6967             : 
    6968        3323 : void SAL_CALL ScTableSheetObj::release() throw()
    6969             : {
    6970        3323 :     ScCellRangeObj::release();
    6971        3323 : }
    6972             : 
    6973           0 : uno::Sequence<uno::Type> SAL_CALL ScTableSheetObj::getTypes() throw(uno::RuntimeException)
    6974             : {
    6975           0 :     static uno::Sequence<uno::Type> aTypes;
    6976           0 :     if ( aTypes.getLength() == 0 )
    6977             :     {
    6978           0 :         uno::Sequence<uno::Type> aParentTypes = ScCellRangeObj::getTypes();
    6979           0 :         long nParentLen = aParentTypes.getLength();
    6980           0 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    6981             : 
    6982           0 :         aTypes.realloc( nParentLen + 18 );
    6983           0 :         uno::Type* pPtr = aTypes.getArray();
    6984           0 :         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSpreadsheet>*)0);
    6985           0 :         pPtr[nParentLen + 1] = getCppuType((const uno::Reference<container::XNamed>*)0);
    6986           0 :         pPtr[nParentLen + 2] = getCppuType((const uno::Reference<sheet::XSheetPageBreak>*)0);
    6987           0 :         pPtr[nParentLen + 3] = getCppuType((const uno::Reference<sheet::XCellRangeMovement>*)0);
    6988           0 :         pPtr[nParentLen + 4] = getCppuType((const uno::Reference<table::XTableChartsSupplier>*)0);
    6989           0 :         pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XDataPilotTablesSupplier>*)0);
    6990           0 :         pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XScenariosSupplier>*)0);
    6991           0 :         pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XSheetAnnotationsSupplier>*)0);
    6992           0 :         pPtr[nParentLen + 8] = getCppuType((const uno::Reference<drawing::XDrawPageSupplier>*)0);
    6993           0 :         pPtr[nParentLen + 9] = getCppuType((const uno::Reference<sheet::XPrintAreas>*)0);
    6994           0 :         pPtr[nParentLen +10] = getCppuType((const uno::Reference<sheet::XSheetAuditing>*)0);
    6995           0 :         pPtr[nParentLen +11] = getCppuType((const uno::Reference<sheet::XSheetOutline>*)0);
    6996           0 :         pPtr[nParentLen +12] = getCppuType((const uno::Reference<util::XProtectable>*)0);
    6997           0 :         pPtr[nParentLen +13] = getCppuType((const uno::Reference<sheet::XScenario>*)0);
    6998           0 :         pPtr[nParentLen +14] = getCppuType((const uno::Reference<sheet::XScenarioEnhanced>*)0);
    6999           0 :         pPtr[nParentLen +15] = getCppuType((const uno::Reference<sheet::XSheetLinkable>*)0);
    7000           0 :         pPtr[nParentLen +16] = getCppuType((const uno::Reference<sheet::XExternalSheetName>*)0);
    7001           0 :         pPtr[nParentLen +17] = getCppuType((const uno::Reference<document::XEventsSupplier>*)0);
    7002             : 
    7003           0 :         for (long i=0; i<nParentLen; i++)
    7004           0 :             pPtr[i] = pParentPtr[i];                // parent types first
    7005             :     }
    7006           0 :     return aTypes;
    7007             : }
    7008             : 
    7009             : namespace
    7010             : {
    7011             :     class theScTableSheetObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScTableSheetObjImplementationId > {};
    7012             : }
    7013             : 
    7014           2 : uno::Sequence<sal_Int8> SAL_CALL ScTableSheetObj::getImplementationId() throw(uno::RuntimeException)
    7015             : {
    7016           2 :     return theScTableSheetObjImplementationId::get().getSeq();
    7017             : }
    7018             : 
    7019             : //  Hilfsfunktionen
    7020             : 
    7021         410 : SCTAB ScTableSheetObj::GetTab_Impl() const
    7022             : {
    7023         410 :     const ScRangeList& rRanges = GetRangeList();
    7024             :     OSL_ENSURE(rRanges.size() == 1, "was fuer Ranges ?!?!");
    7025         410 :     if ( !rRanges.empty() )
    7026             :     {
    7027         410 :         const ScRange* pFirst = rRanges[ 0 ];
    7028         410 :         return pFirst->aStart.Tab();
    7029             :     }
    7030           0 :     return 0;   // soll nicht sein
    7031             : }
    7032             : 
    7033             : // former XSheet
    7034             : 
    7035           0 : uno::Reference<table::XTableCharts> SAL_CALL ScTableSheetObj::getCharts() throw(uno::RuntimeException)
    7036             : {
    7037           0 :     SolarMutexGuard aGuard;
    7038           0 :     ScDocShell* pDocSh = GetDocShell();
    7039           0 :     if ( pDocSh )
    7040           0 :         return new ScChartsObj( pDocSh, GetTab_Impl() );
    7041             : 
    7042             :     OSL_FAIL("kein Dokument");
    7043           0 :     return NULL;
    7044             : }
    7045             : 
    7046           0 : uno::Reference<sheet::XDataPilotTables> SAL_CALL ScTableSheetObj::getDataPilotTables()
    7047             :                                                 throw(uno::RuntimeException)
    7048             : {
    7049           0 :     SolarMutexGuard aGuard;
    7050           0 :     ScDocShell* pDocSh = GetDocShell();
    7051           0 :     if ( pDocSh )
    7052           0 :         return new ScDataPilotTablesObj( pDocSh, GetTab_Impl() );
    7053             : 
    7054             :     OSL_FAIL("kein Dokument");
    7055           0 :     return NULL;
    7056             : }
    7057             : 
    7058           0 : uno::Reference<sheet::XScenarios> SAL_CALL ScTableSheetObj::getScenarios() throw(uno::RuntimeException)
    7059             : {
    7060           0 :     SolarMutexGuard aGuard;
    7061           0 :     ScDocShell* pDocSh = GetDocShell();
    7062             : 
    7063           0 :     if ( pDocSh )
    7064           0 :         return new ScScenariosObj( pDocSh, GetTab_Impl() );
    7065             : 
    7066             :     OSL_FAIL("kein Dokument");
    7067           0 :     return NULL;
    7068             : }
    7069             : 
    7070           3 : uno::Reference<sheet::XSheetAnnotations> SAL_CALL ScTableSheetObj::getAnnotations()
    7071             :                                                 throw(uno::RuntimeException)
    7072             : {
    7073           3 :     SolarMutexGuard aGuard;
    7074           3 :     ScDocShell* pDocSh = GetDocShell();
    7075             : 
    7076           3 :     if ( pDocSh )
    7077           3 :         return new ScAnnotationsObj( pDocSh, GetTab_Impl() );
    7078             : 
    7079             :     OSL_FAIL("kein Dokument");
    7080           0 :     return NULL;
    7081             : }
    7082             : 
    7083           0 : uno::Reference<table::XCellRange> SAL_CALL ScTableSheetObj::getCellRangeByName(
    7084             :                         const rtl::OUString& rRange ) throw(uno::RuntimeException)
    7085             : {
    7086           0 :     SolarMutexGuard aGuard;
    7087           0 :     return ScCellRangeObj::getCellRangeByName( rRange );
    7088             : }
    7089             : 
    7090           4 : uno::Reference<sheet::XSheetCellCursor> SAL_CALL ScTableSheetObj::createCursor()
    7091             :                                                 throw(uno::RuntimeException)
    7092             : {
    7093           4 :     SolarMutexGuard aGuard;
    7094           4 :     ScDocShell* pDocSh = GetDocShell();
    7095           4 :     if ( pDocSh )
    7096             :     {
    7097             :         //! einzelne Zelle oder ganze Tabelle???????
    7098           4 :         SCTAB nTab = GetTab_Impl();
    7099           4 :         return new ScCellCursorObj( pDocSh, ScRange( 0,0,nTab, MAXCOL,MAXROW,nTab ) );
    7100             :     }
    7101           0 :     return NULL;
    7102             : }
    7103             : 
    7104           2 : uno::Reference<sheet::XSheetCellCursor> SAL_CALL ScTableSheetObj::createCursorByRange(
    7105             :                         const uno::Reference<sheet::XSheetCellRange>& xCellRange )
    7106             :                                                 throw(uno::RuntimeException)
    7107             : {
    7108           2 :     SolarMutexGuard aGuard;
    7109           2 :     ScDocShell* pDocSh = GetDocShell();
    7110           2 :     if ( pDocSh && xCellRange.is() )
    7111             :     {
    7112           2 :         ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xCellRange );
    7113           2 :         if (pRangesImp)
    7114             :         {
    7115           2 :             const ScRangeList& rRanges = pRangesImp->GetRangeList();
    7116             :             OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" );
    7117           2 :             return new ScCellCursorObj( pDocSh, *rRanges[ 0 ] );
    7118             :         }
    7119             :     }
    7120           0 :     return NULL;
    7121             : }
    7122             : 
    7123             : // XSheetCellRange
    7124             : 
    7125           0 : uno::Reference<sheet::XSpreadsheet> SAL_CALL ScTableSheetObj::getSpreadsheet()
    7126             :                                                 throw(uno::RuntimeException)
    7127             : {
    7128           0 :     SolarMutexGuard aGuard;
    7129           0 :     return this;        //!???
    7130             : }
    7131             : 
    7132             : // XCellRange
    7133             : 
    7134          22 : uno::Reference<table::XCell> SAL_CALL ScTableSheetObj::getCellByPosition(
    7135             :                                         sal_Int32 nColumn, sal_Int32 nRow )
    7136             :                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
    7137             : {
    7138          22 :     SolarMutexGuard aGuard;
    7139          22 :     return ScCellRangeObj::GetCellByPosition_Impl(nColumn, nRow);
    7140             : }
    7141             : 
    7142        1608 : uno::Reference<table::XCellRange> SAL_CALL ScTableSheetObj::getCellRangeByPosition(
    7143             :                 sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom )
    7144             :                                 throw(lang::IndexOutOfBoundsException, uno::RuntimeException)
    7145             : {
    7146        1608 :     SolarMutexGuard aGuard;
    7147        1608 :     return ScCellRangeObj::getCellRangeByPosition(nLeft,nTop,nRight,nBottom);
    7148             : }
    7149             : 
    7150           0 : uno::Sequence<sheet::TablePageBreakData> SAL_CALL ScTableSheetObj::getColumnPageBreaks()
    7151             :                                                 throw(uno::RuntimeException)
    7152             : {
    7153           0 :     SolarMutexGuard aGuard;
    7154           0 :     ScDocShell* pDocSh = GetDocShell();
    7155           0 :     if ( pDocSh )
    7156             :     {
    7157           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    7158           0 :         SCTAB nTab = GetTab_Impl();
    7159             : 
    7160           0 :         Size aSize(pDoc->GetPageSize( nTab ));
    7161           0 :         if (aSize.Width() && aSize.Height())        // effektive Groesse schon gesetzt?
    7162           0 :             pDoc->UpdatePageBreaks( nTab );
    7163             :         else
    7164             :         {
    7165             :             //  Umbrueche updaten wie in ScDocShell::PageStyleModified:
    7166           0 :             ScPrintFunc aPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab );
    7167           0 :             aPrintFunc.UpdatePages();
    7168             :         }
    7169             : 
    7170           0 :         SCCOL nCount = 0;
    7171             :         SCCOL nCol;
    7172           0 :         for (nCol=0; nCol<=MAXCOL; nCol++)
    7173           0 :             if (pDoc->HasColBreak(nCol, nTab))
    7174           0 :                 ++nCount;
    7175             : 
    7176           0 :         sheet::TablePageBreakData aData;
    7177           0 :         uno::Sequence<sheet::TablePageBreakData> aSeq(nCount);
    7178           0 :         sheet::TablePageBreakData* pAry = aSeq.getArray();
    7179           0 :         sal_uInt16 nPos = 0;
    7180           0 :         for (nCol=0; nCol<=MAXCOL; nCol++)
    7181             :         {
    7182           0 :             ScBreakType nBreak = pDoc->HasColBreak(nCol, nTab);
    7183           0 :             if (nBreak)
    7184             :             {
    7185           0 :                 aData.Position    = nCol;
    7186           0 :                 aData.ManualBreak = (nBreak & BREAK_MANUAL);
    7187           0 :                 pAry[nPos] = aData;
    7188           0 :                 ++nPos;
    7189             :             }
    7190             :         }
    7191           0 :         return aSeq;
    7192             :     }
    7193           0 :     return uno::Sequence<sheet::TablePageBreakData>(0);
    7194             : }
    7195             : 
    7196           0 : uno::Sequence<sheet::TablePageBreakData> SAL_CALL ScTableSheetObj::getRowPageBreaks()
    7197             :                                                 throw(uno::RuntimeException)
    7198             : {
    7199           0 :     SolarMutexGuard aGuard;
    7200           0 :     ScDocShell* pDocSh = GetDocShell();
    7201           0 :     if ( pDocSh )
    7202             :     {
    7203           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    7204           0 :         SCTAB nTab = GetTab_Impl();
    7205             : 
    7206           0 :         Size aSize(pDoc->GetPageSize( nTab ));
    7207           0 :         if (aSize.Width() && aSize.Height())        // effektive Groesse schon gesetzt?
    7208           0 :             pDoc->UpdatePageBreaks( nTab );
    7209             :         else
    7210             :         {
    7211             :             //  Umbrueche updaten wie in ScDocShell::PageStyleModified:
    7212           0 :             ScPrintFunc aPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab );
    7213           0 :             aPrintFunc.UpdatePages();
    7214             :         }
    7215           0 :         return pDoc->GetRowBreakData(nTab);
    7216             :     }
    7217           0 :     return uno::Sequence<sheet::TablePageBreakData>(0);
    7218             : }
    7219             : 
    7220           0 : void SAL_CALL ScTableSheetObj::removeAllManualPageBreaks() throw(uno::RuntimeException)
    7221             : {
    7222           0 :     SolarMutexGuard aGuard;
    7223           0 :     ScDocShell* pDocSh = GetDocShell();
    7224           0 :     if ( pDocSh )
    7225             :     {
    7226             :         //! docfunc Funktion, auch fuer ScViewFunc::RemoveManualBreaks
    7227             : 
    7228           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    7229           0 :         sal_Bool bUndo (pDoc->IsUndoEnabled());
    7230           0 :         SCTAB nTab = GetTab_Impl();
    7231             : 
    7232           0 :         if (bUndo)
    7233             :         {
    7234           0 :             ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
    7235           0 :             pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True );
    7236           0 :             pDoc->CopyToDocument( 0,0,nTab, MAXCOL,MAXROW,nTab, IDF_NONE, false, pUndoDoc );
    7237           0 :             pDocSh->GetUndoManager()->AddUndoAction(
    7238           0 :                                     new ScUndoRemoveBreaks( pDocSh, nTab, pUndoDoc ) );
    7239             :         }
    7240             : 
    7241           0 :         pDoc->RemoveManualBreaks(nTab);
    7242           0 :         pDoc->UpdatePageBreaks(nTab);
    7243             : 
    7244             :         //? UpdatePageBreakData( sal_True );
    7245           0 :         pDocSh->SetDocumentModified();
    7246           0 :         pDocSh->PostPaint(ScRange(0, 0, nTab, MAXCOL, MAXROW, nTab), PAINT_GRID);
    7247           0 :     }
    7248           0 : }
    7249             : 
    7250             : // XNamed
    7251             : 
    7252          38 : rtl::OUString SAL_CALL ScTableSheetObj::getName() throw(uno::RuntimeException)
    7253             : {
    7254          38 :     SolarMutexGuard aGuard;
    7255          38 :     rtl::OUString aName;
    7256          38 :     ScDocShell* pDocSh = GetDocShell();
    7257          38 :     if ( pDocSh )
    7258          38 :         pDocSh->GetDocument()->GetName( GetTab_Impl(), aName );
    7259          38 :     return aName;
    7260             : }
    7261             : 
    7262           0 : void SAL_CALL ScTableSheetObj::setName( const rtl::OUString& aNewName )
    7263             :                                                 throw(uno::RuntimeException)
    7264             : {
    7265           0 :     SolarMutexGuard aGuard;
    7266           0 :     ScDocShell* pDocSh = GetDocShell();
    7267           0 :     if ( pDocSh )
    7268             :     {
    7269           0 :         String aString(aNewName);
    7270           0 :         pDocSh->GetDocFunc().RenameTable( GetTab_Impl(), aString, sal_True, sal_True );
    7271           0 :     }
    7272           0 : }
    7273             : 
    7274             : // XDrawPageSupplier
    7275             : 
    7276          32 : uno::Reference<drawing::XDrawPage> SAL_CALL ScTableSheetObj::getDrawPage()
    7277             :                                                 throw(uno::RuntimeException)
    7278             : {
    7279          32 :     SolarMutexGuard aGuard;
    7280          32 :     ScDocShell* pDocSh = GetDocShell();
    7281          32 :     if ( pDocSh )
    7282             :     {
    7283          32 :         ScDrawLayer* pDrawLayer = pDocSh->MakeDrawLayer();
    7284             :         OSL_ENSURE(pDrawLayer,"kann Draw-Layer nicht anlegen");
    7285             : 
    7286          32 :         SCTAB nTab = GetTab_Impl();
    7287          32 :         SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
    7288             :         OSL_ENSURE(pPage,"Draw-Page nicht gefunden");
    7289          32 :         if (pPage)
    7290          32 :             return uno::Reference<drawing::XDrawPage> (pPage->getUnoPage(), uno::UNO_QUERY);
    7291             : 
    7292             :         //  Das DrawPage-Objekt meldet sich als Listener am SdrModel an
    7293             :         //  und sollte von dort alle Aktionen mitbekommen
    7294             :     }
    7295           0 :     return NULL;
    7296             : }
    7297             : 
    7298             : // XCellMovement
    7299             : 
    7300           0 : void SAL_CALL ScTableSheetObj::insertCells( const table::CellRangeAddress& rRangeAddress,
    7301             :                                 sheet::CellInsertMode nMode ) throw(uno::RuntimeException)
    7302             : {
    7303           0 :     SolarMutexGuard aGuard;
    7304           0 :     ScDocShell* pDocSh = GetDocShell();
    7305           0 :     if ( pDocSh )
    7306             :     {
    7307           0 :         sal_Bool bDo = sal_True;
    7308           0 :         InsCellCmd eCmd = INS_NONE;
    7309           0 :         switch (nMode)
    7310             :         {
    7311           0 :             case sheet::CellInsertMode_NONE:    bDo = false;            break;
    7312           0 :             case sheet::CellInsertMode_DOWN:    eCmd = INS_CELLSDOWN;   break;
    7313           0 :             case sheet::CellInsertMode_RIGHT:   eCmd = INS_CELLSRIGHT;  break;
    7314           0 :             case sheet::CellInsertMode_ROWS:    eCmd = INS_INSROWS;     break;
    7315           0 :             case sheet::CellInsertMode_COLUMNS: eCmd = INS_INSCOLS;     break;
    7316             :             default:
    7317             :                 OSL_FAIL("insertCells: falscher Mode");
    7318           0 :                 bDo = false;
    7319             :         }
    7320             : 
    7321           0 :         if (bDo)
    7322             :         {
    7323             :             OSL_ENSURE( rRangeAddress.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
    7324           0 :             ScRange aScRange;
    7325           0 :             ScUnoConversion::FillScRange( aScRange, rRangeAddress );
    7326           0 :             pDocSh->GetDocFunc().InsertCells( aScRange, NULL, eCmd, sal_True, sal_True );
    7327             :         }
    7328           0 :     }
    7329           0 : }
    7330             : 
    7331           0 : void SAL_CALL ScTableSheetObj::removeRange( const table::CellRangeAddress& rRangeAddress,
    7332             :                                 sheet::CellDeleteMode nMode ) throw(uno::RuntimeException)
    7333             : {
    7334           0 :     SolarMutexGuard aGuard;
    7335           0 :     ScDocShell* pDocSh = GetDocShell();
    7336           0 :     if ( pDocSh )
    7337             :     {
    7338           0 :         sal_Bool bDo = sal_True;
    7339           0 :         DelCellCmd eCmd = DEL_NONE;
    7340           0 :         switch (nMode)
    7341             :         {
    7342           0 :             case sheet::CellDeleteMode_NONE:     bDo = false;           break;
    7343           0 :             case sheet::CellDeleteMode_UP:       eCmd = DEL_CELLSUP;    break;
    7344           0 :             case sheet::CellDeleteMode_LEFT:     eCmd = DEL_CELLSLEFT;  break;
    7345           0 :             case sheet::CellDeleteMode_ROWS:     eCmd = DEL_DELROWS;    break;
    7346           0 :             case sheet::CellDeleteMode_COLUMNS:  eCmd = DEL_DELCOLS;    break;
    7347             :             default:
    7348             :                 OSL_FAIL("deleteCells: falscher Mode");
    7349           0 :                 bDo = false;
    7350             :         }
    7351             : 
    7352           0 :         if (bDo)
    7353             :         {
    7354             :             OSL_ENSURE( rRangeAddress.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
    7355           0 :             ScRange aScRange;
    7356           0 :             ScUnoConversion::FillScRange( aScRange, rRangeAddress );
    7357           0 :             pDocSh->GetDocFunc().DeleteCells( aScRange, NULL, eCmd, sal_True, sal_True );
    7358             :         }
    7359           0 :     }
    7360           0 : }
    7361             : 
    7362           0 : void SAL_CALL ScTableSheetObj::moveRange( const table::CellAddress& aDestination,
    7363             :                                         const table::CellRangeAddress& aSource )
    7364             :                                         throw(uno::RuntimeException)
    7365             : {
    7366           0 :     SolarMutexGuard aGuard;
    7367           0 :     ScDocShell* pDocSh = GetDocShell();
    7368           0 :     if ( pDocSh )
    7369             :     {
    7370             :         OSL_ENSURE( aSource.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
    7371           0 :         ScRange aSourceRange;
    7372           0 :         ScUnoConversion::FillScRange( aSourceRange, aSource );
    7373           0 :         ScAddress aDestPos( (SCCOL)aDestination.Column, (SCROW)aDestination.Row, aDestination.Sheet );
    7374           0 :         pDocSh->GetDocFunc().MoveBlock( aSourceRange, aDestPos, sal_True, sal_True, sal_True, sal_True );
    7375           0 :     }
    7376           0 : }
    7377             : 
    7378           0 : void SAL_CALL ScTableSheetObj::copyRange( const table::CellAddress& aDestination,
    7379             :                                         const table::CellRangeAddress& aSource )
    7380             :                                         throw(uno::RuntimeException)
    7381             : {
    7382           0 :     SolarMutexGuard aGuard;
    7383           0 :     ScDocShell* pDocSh = GetDocShell();
    7384           0 :     if ( pDocSh )
    7385             :     {
    7386             :         OSL_ENSURE( aSource.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" );
    7387           0 :         ScRange aSourceRange;
    7388           0 :         ScUnoConversion::FillScRange( aSourceRange, aSource );
    7389           0 :         ScAddress aDestPos( (SCCOL)aDestination.Column, (SCROW)aDestination.Row, aDestination.Sheet );
    7390           0 :         pDocSh->GetDocFunc().MoveBlock( aSourceRange, aDestPos, false, sal_True, sal_True, sal_True );
    7391           0 :     }
    7392           0 : }
    7393             : 
    7394             : // XPrintAreas
    7395             : 
    7396           0 : void ScTableSheetObj::PrintAreaUndo_Impl( ScPrintRangeSaver* pOldRanges )
    7397             : {
    7398             :     //  Umbrueche und Undo
    7399             : 
    7400           0 :     ScDocShell* pDocSh = GetDocShell();
    7401           0 :     if ( pDocSh )
    7402             :     {
    7403           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    7404           0 :         sal_Bool bUndo(pDoc->IsUndoEnabled());
    7405           0 :         SCTAB nTab = GetTab_Impl();
    7406             : 
    7407           0 :         ScPrintRangeSaver* pNewRanges = pDoc->CreatePrintRangeSaver();
    7408           0 :         if (bUndo)
    7409             :         {
    7410           0 :             pDocSh->GetUndoManager()->AddUndoAction(
    7411           0 :                         new ScUndoPrintRange( pDocSh, nTab, pOldRanges, pNewRanges ) );
    7412             :         }
    7413             : 
    7414           0 :         ScPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ).UpdatePages();
    7415             : 
    7416           0 :         SfxBindings* pBindings = pDocSh->GetViewBindings();
    7417           0 :         if (pBindings)
    7418           0 :             pBindings->Invalidate( SID_DELETE_PRINTAREA );
    7419             : 
    7420           0 :         pDocSh->SetDocumentModified();
    7421             :     }
    7422             :     else
    7423           0 :         delete pOldRanges;
    7424           0 : }
    7425             : 
    7426           2 : uno::Sequence<table::CellRangeAddress> SAL_CALL ScTableSheetObj::getPrintAreas()
    7427             :                                                 throw(uno::RuntimeException)
    7428             : {
    7429           2 :     SolarMutexGuard aGuard;
    7430           2 :     ScDocShell* pDocSh = GetDocShell();
    7431           2 :     if ( pDocSh )
    7432             :     {
    7433           2 :         ScDocument* pDoc = pDocSh->GetDocument();
    7434           2 :         SCTAB nTab = GetTab_Impl();
    7435           2 :         sal_uInt16 nCount = pDoc->GetPrintRangeCount( nTab );
    7436             : 
    7437           2 :         table::CellRangeAddress aRangeAddress;
    7438           2 :         uno::Sequence<table::CellRangeAddress> aSeq(nCount);
    7439           2 :         table::CellRangeAddress* pAry = aSeq.getArray();
    7440           2 :         for (sal_uInt16 i=0; i<nCount; i++)
    7441             :         {
    7442           0 :             const ScRange* pRange = pDoc->GetPrintRange( nTab, i );
    7443             :             OSL_ENSURE(pRange,"wo ist der Druckbereich");
    7444           0 :             if (pRange)
    7445             :             {
    7446           0 :                 ScUnoConversion::FillApiRange( aRangeAddress, *pRange );
    7447           0 :                 aRangeAddress.Sheet = nTab; // core does not care about sheet index
    7448           0 :                 pAry[i] = aRangeAddress;
    7449             :             }
    7450             :         }
    7451           2 :         return aSeq;
    7452             :     }
    7453           0 :     return uno::Sequence<table::CellRangeAddress>();
    7454             : }
    7455             : 
    7456           0 : void SAL_CALL ScTableSheetObj::setPrintAreas(
    7457             :                     const uno::Sequence<table::CellRangeAddress>& aPrintAreas )
    7458             :                                                 throw(uno::RuntimeException)
    7459             : {
    7460           0 :     SolarMutexGuard aGuard;
    7461           0 :     ScDocShell* pDocSh = GetDocShell();
    7462           0 :     if ( pDocSh )
    7463             :     {
    7464           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    7465           0 :         SCTAB nTab = GetTab_Impl();
    7466             : 
    7467           0 :         ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
    7468             : 
    7469           0 :         sal_uInt16 nCount = (sal_uInt16) aPrintAreas.getLength();
    7470           0 :         pDoc->ClearPrintRanges( nTab );
    7471           0 :         if (nCount)
    7472             :         {
    7473           0 :             ScRange aPrintRange;
    7474           0 :             const table::CellRangeAddress* pAry = aPrintAreas.getConstArray();
    7475           0 :             for (sal_uInt16 i=0; i<nCount; i++)
    7476             :             {
    7477           0 :                 ScUnoConversion::FillScRange( aPrintRange, pAry[i] );
    7478           0 :                 pDoc->AddPrintRange( nTab, aPrintRange );
    7479             :             }
    7480             :         }
    7481             : 
    7482           0 :         PrintAreaUndo_Impl( pOldRanges );   // Undo, Umbrueche, Modified etc.
    7483           0 :     }
    7484           0 : }
    7485             : 
    7486           2 : sal_Bool SAL_CALL ScTableSheetObj::getPrintTitleColumns() throw(uno::RuntimeException)
    7487             : {
    7488           2 :     SolarMutexGuard aGuard;
    7489           2 :     ScDocShell* pDocSh = GetDocShell();
    7490           2 :     if ( pDocSh )
    7491             :     {
    7492           2 :         ScDocument* pDoc = pDocSh->GetDocument();
    7493           2 :         SCTAB nTab = GetTab_Impl();
    7494           2 :         return ( pDoc->GetRepeatColRange(nTab) != NULL );
    7495             :     }
    7496           0 :     return false;
    7497             : }
    7498             : 
    7499           0 : void SAL_CALL ScTableSheetObj::setPrintTitleColumns( sal_Bool bPrintTitleColumns )
    7500             :                                                     throw(uno::RuntimeException)
    7501             : {
    7502           0 :     SolarMutexGuard aGuard;
    7503           0 :     ScDocShell* pDocSh = GetDocShell();
    7504           0 :     if ( pDocSh )
    7505             :     {
    7506           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    7507           0 :         SCTAB nTab = GetTab_Impl();
    7508             : 
    7509           0 :         ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
    7510             : 
    7511           0 :         if ( bPrintTitleColumns )
    7512             :         {
    7513           0 :             if ( !pDoc->GetRepeatColRange( nTab ) )         // keinen bestehenden Bereich veraendern
    7514             :             {
    7515           0 :                 ScRange aNew( 0, 0, nTab, 0, 0, nTab );     // Default
    7516           0 :                 pDoc->SetRepeatColRange( nTab, &aNew );     // einschalten
    7517             :             }
    7518             :         }
    7519             :         else
    7520           0 :             pDoc->SetRepeatColRange( nTab, NULL );          // abschalten
    7521             : 
    7522           0 :         PrintAreaUndo_Impl( pOldRanges );   // Undo, Umbrueche, Modified etc.
    7523             : 
    7524             :         //! zuletzt gesetzten Bereich beim Abschalten merken und beim Einschalten wiederherstellen ???
    7525           0 :     }
    7526           0 : }
    7527             : 
    7528           2 : table::CellRangeAddress SAL_CALL ScTableSheetObj::getTitleColumns() throw(uno::RuntimeException)
    7529             : {
    7530           2 :     SolarMutexGuard aGuard;
    7531           2 :     table::CellRangeAddress aRet;
    7532           2 :     ScDocShell* pDocSh = GetDocShell();
    7533           2 :     if ( pDocSh )
    7534             :     {
    7535           2 :         ScDocument* pDoc = pDocSh->GetDocument();
    7536           2 :         SCTAB nTab = GetTab_Impl();
    7537           2 :         const ScRange* pRange = pDoc->GetRepeatColRange(nTab);
    7538           2 :         if (pRange)
    7539             :         {
    7540           0 :             ScUnoConversion::FillApiRange( aRet, *pRange );
    7541           0 :             aRet.Sheet = nTab; // core does not care about sheet index
    7542             :         }
    7543             :     }
    7544           2 :     return aRet;
    7545             : }
    7546             : 
    7547           0 : void SAL_CALL ScTableSheetObj::setTitleColumns( const table::CellRangeAddress& aTitleColumns )
    7548             :                                                     throw(uno::RuntimeException)
    7549             : {
    7550           0 :     SolarMutexGuard aGuard;
    7551           0 :     ScDocShell* pDocSh = GetDocShell();
    7552           0 :     if ( pDocSh )
    7553             :     {
    7554           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    7555           0 :         SCTAB nTab = GetTab_Impl();
    7556             : 
    7557           0 :         ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
    7558             : 
    7559           0 :         ScRange aNew;
    7560           0 :         ScUnoConversion::FillScRange( aNew, aTitleColumns );
    7561           0 :         pDoc->SetRepeatColRange( nTab, &aNew );     // immer auch einschalten
    7562             : 
    7563           0 :         PrintAreaUndo_Impl( pOldRanges );           // Undo, Umbrueche, Modified etc.
    7564           0 :     }
    7565           0 : }
    7566             : 
    7567           2 : sal_Bool SAL_CALL ScTableSheetObj::getPrintTitleRows() throw(uno::RuntimeException)
    7568             : {
    7569           2 :     SolarMutexGuard aGuard;
    7570           2 :     ScDocShell* pDocSh = GetDocShell();
    7571           2 :     if ( pDocSh )
    7572             :     {
    7573           2 :         ScDocument* pDoc = pDocSh->GetDocument();
    7574           2 :         SCTAB nTab = GetTab_Impl();
    7575           2 :         return ( pDoc->GetRepeatRowRange(nTab) != NULL );
    7576             :     }
    7577           0 :     return false;
    7578             : }
    7579             : 
    7580           0 : void SAL_CALL ScTableSheetObj::setPrintTitleRows( sal_Bool bPrintTitleRows )
    7581             :                                                 throw(uno::RuntimeException)
    7582             : {
    7583           0 :     SolarMutexGuard aGuard;
    7584           0 :     ScDocShell* pDocSh = GetDocShell();
    7585           0 :     if ( pDocSh )
    7586             :     {
    7587           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    7588           0 :         SCTAB nTab = GetTab_Impl();
    7589             : 
    7590           0 :         ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
    7591             : 
    7592           0 :         if ( bPrintTitleRows )
    7593             :         {
    7594           0 :             if ( !pDoc->GetRepeatRowRange( nTab ) )         // keinen bestehenden Bereich veraendern
    7595             :             {
    7596           0 :                 ScRange aNew( 0, 0, nTab, 0, 0, nTab );     // Default
    7597           0 :                 pDoc->SetRepeatRowRange( nTab, &aNew );     // einschalten
    7598             :             }
    7599             :         }
    7600             :         else
    7601           0 :             pDoc->SetRepeatRowRange( nTab, NULL );          // abschalten
    7602             : 
    7603           0 :         PrintAreaUndo_Impl( pOldRanges );   // Undo, Umbrueche, Modified etc.
    7604             : 
    7605             :         //! zuletzt gesetzten Bereich beim Abschalten merken und beim Einschalten wiederherstellen ???
    7606           0 :     }
    7607           0 : }
    7608             : 
    7609           2 : table::CellRangeAddress SAL_CALL ScTableSheetObj::getTitleRows() throw(uno::RuntimeException)
    7610             : {
    7611           2 :     SolarMutexGuard aGuard;
    7612           2 :     table::CellRangeAddress aRet;
    7613           2 :     ScDocShell* pDocSh = GetDocShell();
    7614           2 :     if ( pDocSh )
    7615             :     {
    7616           2 :         ScDocument* pDoc = pDocSh->GetDocument();
    7617           2 :         SCTAB nTab = GetTab_Impl();
    7618           2 :         const ScRange* pRange = pDoc->GetRepeatRowRange(nTab);
    7619           2 :         if (pRange)
    7620             :         {
    7621           0 :             ScUnoConversion::FillApiRange( aRet, *pRange );
    7622           0 :             aRet.Sheet = nTab; // core does not care about sheet index
    7623             :         }
    7624             :     }
    7625           2 :     return aRet;
    7626             : }
    7627             : 
    7628           0 : void SAL_CALL ScTableSheetObj::setTitleRows( const table::CellRangeAddress& aTitleRows )
    7629             :                                                     throw(uno::RuntimeException)
    7630             : {
    7631           0 :     SolarMutexGuard aGuard;
    7632           0 :     ScDocShell* pDocSh = GetDocShell();
    7633           0 :     if ( pDocSh )
    7634             :     {
    7635           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    7636           0 :         SCTAB nTab = GetTab_Impl();
    7637             : 
    7638           0 :         ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
    7639             : 
    7640           0 :         ScRange aNew;
    7641           0 :         ScUnoConversion::FillScRange( aNew, aTitleRows );
    7642           0 :         pDoc->SetRepeatRowRange( nTab, &aNew );     // immer auch einschalten
    7643             : 
    7644           0 :         PrintAreaUndo_Impl( pOldRanges );           // Undo, Umbrueche, Modified etc.
    7645           0 :     }
    7646           0 : }
    7647             : 
    7648             : // XSheetLinkable
    7649             : 
    7650           2 : sheet::SheetLinkMode SAL_CALL ScTableSheetObj::getLinkMode() throw(uno::RuntimeException)
    7651             : {
    7652           2 :     SolarMutexGuard aGuard;
    7653           2 :     sheet::SheetLinkMode eRet = sheet::SheetLinkMode_NONE;
    7654           2 :     ScDocShell* pDocSh = GetDocShell();
    7655           2 :     if ( pDocSh )
    7656             :     {
    7657           2 :         sal_uInt8 nMode = pDocSh->GetDocument()->GetLinkMode( GetTab_Impl() );
    7658           2 :         if ( nMode == SC_LINK_NORMAL )
    7659           0 :             eRet = sheet::SheetLinkMode_NORMAL;
    7660           2 :         else if ( nMode == SC_LINK_VALUE )
    7661           0 :             eRet = sheet::SheetLinkMode_VALUE;
    7662             :     }
    7663           2 :     return eRet;
    7664             : }
    7665             : 
    7666           0 : void SAL_CALL ScTableSheetObj::setLinkMode( sheet::SheetLinkMode nLinkMode )
    7667             :                                                 throw(uno::RuntimeException)
    7668             : {
    7669           0 :     SolarMutexGuard aGuard;
    7670             : 
    7671             :     //! Filter und Options aus altem Link suchen
    7672             : 
    7673           0 :     rtl::OUString aUrl(getLinkUrl());
    7674           0 :     rtl::OUString aSheet(getLinkSheetName());
    7675             : 
    7676           0 :     rtl::OUString aEmpty;
    7677           0 :     link( aUrl, aSheet, aEmpty, aEmpty, nLinkMode );
    7678           0 : }
    7679             : 
    7680           0 : rtl::OUString SAL_CALL ScTableSheetObj::getLinkUrl() throw(uno::RuntimeException)
    7681             : {
    7682           0 :     SolarMutexGuard aGuard;
    7683           0 :     String aFile;
    7684           0 :     ScDocShell* pDocSh = GetDocShell();
    7685           0 :     if ( pDocSh )
    7686           0 :         aFile = pDocSh->GetDocument()->GetLinkDoc( GetTab_Impl() );
    7687           0 :     return aFile;
    7688             : }
    7689             : 
    7690           0 : void SAL_CALL ScTableSheetObj::setLinkUrl( const rtl::OUString& aLinkUrl )
    7691             :                                                 throw(uno::RuntimeException)
    7692             : {
    7693           0 :     SolarMutexGuard aGuard;
    7694             : 
    7695             :     //! Filter und Options aus altem Link suchen
    7696             : 
    7697           0 :     sheet::SheetLinkMode eMode = getLinkMode();
    7698           0 :     rtl::OUString aSheet(getLinkSheetName());
    7699             : 
    7700           0 :     rtl::OUString aEmpty;
    7701           0 :     link( aLinkUrl, aSheet, aEmpty, aEmpty, eMode );
    7702           0 : }
    7703             : 
    7704           0 : rtl::OUString SAL_CALL ScTableSheetObj::getLinkSheetName() throw(uno::RuntimeException)
    7705             : {
    7706           0 :     SolarMutexGuard aGuard;
    7707           0 :     String aSheet;
    7708           0 :     ScDocShell* pDocSh = GetDocShell();
    7709           0 :     if ( pDocSh )
    7710           0 :         aSheet = pDocSh->GetDocument()->GetLinkTab( GetTab_Impl() );
    7711           0 :     return aSheet;
    7712             : }
    7713             : 
    7714           0 : void SAL_CALL ScTableSheetObj::setLinkSheetName( const rtl::OUString& aLinkSheetName )
    7715             :                                                 throw(uno::RuntimeException)
    7716             : {
    7717           0 :     SolarMutexGuard aGuard;
    7718             : 
    7719             :     //! Filter und Options aus altem Link suchen
    7720             : 
    7721           0 :     sheet::SheetLinkMode eMode = getLinkMode();
    7722           0 :     rtl::OUString aUrl(getLinkUrl());
    7723             : 
    7724           0 :     rtl::OUString aEmpty;
    7725           0 :     link( aUrl, aLinkSheetName, aEmpty, aEmpty, eMode );
    7726           0 : }
    7727             : 
    7728           0 : void SAL_CALL ScTableSheetObj::link( const rtl::OUString& aUrl, const rtl::OUString& aSheetName,
    7729             :                         const rtl::OUString& aFilterName, const rtl::OUString& aFilterOptions,
    7730             :                         sheet::SheetLinkMode nMode ) throw(uno::RuntimeException)
    7731             : {
    7732           0 :     SolarMutexGuard aGuard;
    7733           0 :     ScDocShell* pDocSh = GetDocShell();
    7734           0 :     if ( pDocSh )
    7735             :     {
    7736           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    7737           0 :         SCTAB nTab = GetTab_Impl();
    7738             : 
    7739           0 :         rtl::OUString aFileString = aUrl;
    7740           0 :         rtl::OUString aFilterString = aFilterName;
    7741           0 :         rtl::OUString aOptString = aFilterOptions;
    7742           0 :         rtl::OUString aSheetString = aSheetName;
    7743             : 
    7744           0 :         aFileString = ScGlobal::GetAbsDocName( aFileString, pDocSh );
    7745           0 :         if (aFilterString.isEmpty())
    7746           0 :             ScDocumentLoader::GetFilterName( aFileString, aFilterString, aOptString, true, false );
    7747             : 
    7748             :         //  remove application prefix from filter name here, so the filter options
    7749             :         //  aren't reset when the filter name is changed in ScTableLink::DataChanged
    7750           0 :         ScDocumentLoader::RemoveAppPrefix( aFilterString );
    7751             : 
    7752           0 :         sal_uInt8 nLinkMode = SC_LINK_NONE;
    7753           0 :         if ( nMode == sheet::SheetLinkMode_NORMAL )
    7754           0 :             nLinkMode = SC_LINK_NORMAL;
    7755           0 :         else if ( nMode == sheet::SheetLinkMode_VALUE )
    7756           0 :             nLinkMode = SC_LINK_VALUE;
    7757             : 
    7758           0 :         sal_uLong nRefresh = 0;
    7759           0 :         pDoc->SetLink( nTab, nLinkMode, aFileString, aFilterString, aOptString, aSheetString, nRefresh );
    7760             : 
    7761           0 :         pDocSh->UpdateLinks();                  // ggf. Link eintragen oder loeschen
    7762           0 :         SfxBindings* pBindings = pDocSh->GetViewBindings();
    7763           0 :         if (pBindings)
    7764           0 :             pBindings->Invalidate(SID_LINKS);
    7765             : 
    7766             :         //! Undo fuer Link-Daten an der Table
    7767             : 
    7768           0 :         if ( nLinkMode != SC_LINK_NONE && pDoc->IsExecuteLinkEnabled() )        // Link updaten
    7769             :         {
    7770             :             //  Update immer, auch wenn der Link schon da war
    7771             :             //! Update nur fuer die betroffene Tabelle???
    7772             : 
    7773           0 :             sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
    7774           0 :             sal_uInt16 nCount = pLinkManager->GetLinks().size();
    7775           0 :             for ( sal_uInt16 i=0; i<nCount; i++ )
    7776             :             {
    7777           0 :                 ::sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[i];
    7778           0 :                 if (pBase->ISA(ScTableLink))
    7779             :                 {
    7780           0 :                     ScTableLink* pTabLink = (ScTableLink*)pBase;
    7781           0 :                     if ( aFileString.equals(pTabLink->GetFileName()) )
    7782           0 :                         pTabLink->Update();                         // inkl. Paint&Undo
    7783             : 
    7784             :                     //! Der Dateiname sollte nur einmal vorkommen (?)
    7785             :                 }
    7786             :             }
    7787           0 :         }
    7788             : 
    7789             :         //! Notify fuer ScSheetLinkObj Objekte!!!
    7790           0 :     }
    7791           0 : }
    7792             : 
    7793             : // XSheetAuditing
    7794             : 
    7795           0 : sal_Bool SAL_CALL ScTableSheetObj::hideDependents( const table::CellAddress& aPosition )
    7796             :                                                 throw(uno::RuntimeException)
    7797             : {
    7798           0 :     SolarMutexGuard aGuard;
    7799           0 :     ScDocShell* pDocSh = GetDocShell();
    7800           0 :     if ( pDocSh )
    7801             :     {
    7802           0 :         SCTAB nTab = GetTab_Impl();
    7803             :         OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
    7804           0 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    7805           0 :         return pDocSh->GetDocFunc().DetectiveDelSucc( aPos );
    7806             :     }
    7807           0 :     return false;
    7808             : }
    7809             : 
    7810           0 : sal_Bool SAL_CALL ScTableSheetObj::hidePrecedents( const table::CellAddress& aPosition )
    7811             :                                             throw(uno::RuntimeException)
    7812             : {
    7813           0 :     SolarMutexGuard aGuard;
    7814           0 :     ScDocShell* pDocSh = GetDocShell();
    7815           0 :     if ( pDocSh )
    7816             :     {
    7817           0 :         SCTAB nTab = GetTab_Impl();
    7818             :         OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
    7819           0 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    7820           0 :         return pDocSh->GetDocFunc().DetectiveDelPred( aPos );
    7821             :     }
    7822           0 :     return false;
    7823             : }
    7824             : 
    7825           0 : sal_Bool SAL_CALL ScTableSheetObj::showDependents( const table::CellAddress& aPosition )
    7826             :                                             throw(uno::RuntimeException)
    7827             : {
    7828           0 :     SolarMutexGuard aGuard;
    7829           0 :     ScDocShell* pDocSh = GetDocShell();
    7830           0 :     if ( pDocSh )
    7831             :     {
    7832           0 :         SCTAB nTab = GetTab_Impl();
    7833             :         OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
    7834           0 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    7835           0 :         return pDocSh->GetDocFunc().DetectiveAddSucc( aPos );
    7836             :     }
    7837           0 :     return false;
    7838             : }
    7839             : 
    7840           0 : sal_Bool SAL_CALL ScTableSheetObj::showPrecedents( const table::CellAddress& aPosition )
    7841             :                                             throw(uno::RuntimeException)
    7842             : {
    7843           0 :     SolarMutexGuard aGuard;
    7844           0 :     ScDocShell* pDocSh = GetDocShell();
    7845           0 :     if ( pDocSh )
    7846             :     {
    7847           0 :         SCTAB nTab = GetTab_Impl();
    7848             :         OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
    7849           0 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    7850           0 :         return pDocSh->GetDocFunc().DetectiveAddPred( aPos );
    7851             :     }
    7852           0 :     return false;
    7853             : }
    7854             : 
    7855           0 : sal_Bool SAL_CALL ScTableSheetObj::showErrors( const table::CellAddress& aPosition )
    7856             :                                             throw(uno::RuntimeException)
    7857             : {
    7858           0 :     SolarMutexGuard aGuard;
    7859           0 :     ScDocShell* pDocSh = GetDocShell();
    7860           0 :     if ( pDocSh )
    7861             :     {
    7862           0 :         SCTAB nTab = GetTab_Impl();
    7863             :         OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" );
    7864           0 :         ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab );
    7865           0 :         return pDocSh->GetDocFunc().DetectiveAddError( aPos );
    7866             :     }
    7867           0 :     return false;
    7868             : }
    7869             : 
    7870           0 : sal_Bool SAL_CALL ScTableSheetObj::showInvalid() throw(uno::RuntimeException)
    7871             : {
    7872           0 :     SolarMutexGuard aGuard;
    7873           0 :     ScDocShell* pDocSh = GetDocShell();
    7874           0 :     if ( pDocSh )
    7875           0 :         return pDocSh->GetDocFunc().DetectiveMarkInvalid( GetTab_Impl() );
    7876           0 :     return false;
    7877             : }
    7878             : 
    7879           0 : void SAL_CALL ScTableSheetObj::clearArrows() throw(uno::RuntimeException)
    7880             : {
    7881           0 :     SolarMutexGuard aGuard;
    7882           0 :     ScDocShell* pDocSh = GetDocShell();
    7883           0 :     if ( pDocSh )
    7884           0 :         pDocSh->GetDocFunc().DetectiveDelAll( GetTab_Impl() );
    7885           0 : }
    7886             : 
    7887             : // XSheetOutline
    7888             : 
    7889           0 : void SAL_CALL ScTableSheetObj::group( const table::CellRangeAddress& rGroupRange,
    7890             :                                         table::TableOrientation nOrientation )
    7891             :                                     throw(uno::RuntimeException)
    7892             : {
    7893           0 :     SolarMutexGuard aGuard;
    7894           0 :     ScDocShell* pDocSh = GetDocShell();
    7895           0 :     if ( pDocSh )
    7896             :     {
    7897           0 :         sal_Bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS );
    7898           0 :         ScRange aGroupRange;
    7899           0 :         ScUnoConversion::FillScRange( aGroupRange, rGroupRange );
    7900           0 :         ScOutlineDocFunc aFunc(*pDocSh);
    7901           0 :         aFunc.MakeOutline( aGroupRange, bColumns, sal_True, sal_True );
    7902           0 :     }
    7903           0 : }
    7904             : 
    7905           0 : void SAL_CALL ScTableSheetObj::ungroup( const table::CellRangeAddress& rGroupRange,
    7906             :                                         table::TableOrientation nOrientation )
    7907             :                                     throw(uno::RuntimeException)
    7908             : {
    7909           0 :     SolarMutexGuard aGuard;
    7910           0 :     ScDocShell* pDocSh = GetDocShell();
    7911           0 :     if ( pDocSh )
    7912             :     {
    7913           0 :         sal_Bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS );
    7914           0 :         ScRange aGroupRange;
    7915           0 :         ScUnoConversion::FillScRange( aGroupRange, rGroupRange );
    7916           0 :         ScOutlineDocFunc aFunc(*pDocSh);
    7917           0 :         aFunc.RemoveOutline( aGroupRange, bColumns, sal_True, sal_True );
    7918           0 :     }
    7919           0 : }
    7920             : 
    7921           0 : void SAL_CALL ScTableSheetObj::autoOutline( const table::CellRangeAddress& rCellRange )
    7922             :                                     throw(uno::RuntimeException)
    7923             : {
    7924           0 :     SolarMutexGuard aGuard;
    7925           0 :     ScDocShell* pDocSh = GetDocShell();
    7926           0 :     if ( pDocSh )
    7927             :     {
    7928           0 :         ScRange aFormulaRange;
    7929           0 :         ScUnoConversion::FillScRange( aFormulaRange, rCellRange );
    7930           0 :         ScOutlineDocFunc aFunc(*pDocSh);
    7931           0 :         aFunc.AutoOutline( aFormulaRange, sal_True, sal_True );
    7932           0 :     }
    7933           0 : }
    7934             : 
    7935           0 : void SAL_CALL ScTableSheetObj::clearOutline() throw(uno::RuntimeException)
    7936             : {
    7937           0 :     SolarMutexGuard aGuard;
    7938           0 :     ScDocShell* pDocSh = GetDocShell();
    7939           0 :     if ( pDocSh )
    7940             :     {
    7941           0 :         SCTAB nTab = GetTab_Impl();
    7942           0 :         ScOutlineDocFunc aFunc(*pDocSh);
    7943           0 :         aFunc.RemoveAllOutlines( nTab, sal_True, sal_True );
    7944           0 :     }
    7945           0 : }
    7946             : 
    7947           0 : void SAL_CALL ScTableSheetObj::hideDetail( const table::CellRangeAddress& rCellRange )
    7948             :                                             throw(uno::RuntimeException)
    7949             : {
    7950           0 :     SolarMutexGuard aGuard;
    7951           0 :     ScDocShell* pDocSh = GetDocShell();
    7952           0 :     if ( pDocSh )
    7953             :     {
    7954           0 :         ScRange aMarkRange;
    7955           0 :         ScUnoConversion::FillScRange( aMarkRange, rCellRange );
    7956           0 :         ScOutlineDocFunc aFunc(*pDocSh);
    7957           0 :         aFunc.HideMarkedOutlines( aMarkRange, sal_True, sal_True );
    7958           0 :     }
    7959           0 : }
    7960             : 
    7961           0 : void SAL_CALL ScTableSheetObj::showDetail( const table::CellRangeAddress& rCellRange )
    7962             :                                             throw(uno::RuntimeException)
    7963             : {
    7964           0 :     SolarMutexGuard aGuard;
    7965           0 :     ScDocShell* pDocSh = GetDocShell();
    7966           0 :     if ( pDocSh )
    7967             :     {
    7968           0 :         ScRange aMarkRange;
    7969           0 :         ScUnoConversion::FillScRange( aMarkRange, rCellRange );
    7970           0 :         ScOutlineDocFunc aFunc(*pDocSh);
    7971           0 :         aFunc.ShowMarkedOutlines( aMarkRange, sal_True );
    7972           0 :     }
    7973           0 : }
    7974             : 
    7975           0 : void SAL_CALL ScTableSheetObj::showLevel( sal_Int16 nLevel, table::TableOrientation nOrientation )
    7976             :                                             throw(uno::RuntimeException)
    7977             : {
    7978           0 :     SolarMutexGuard aGuard;
    7979           0 :     ScDocShell* pDocSh = GetDocShell();
    7980           0 :     if ( pDocSh )
    7981             :     {
    7982           0 :         sal_Bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS );
    7983           0 :         SCTAB nTab = GetTab_Impl();
    7984           0 :         ScOutlineDocFunc aFunc(*pDocSh);
    7985           0 :         aFunc.SelectLevel( nTab, bColumns, nLevel, sal_True, sal_True, sal_True );
    7986           0 :     }
    7987           0 : }
    7988             : 
    7989             : // XProtectable
    7990             : 
    7991           0 : void SAL_CALL ScTableSheetObj::protect( const rtl::OUString& aPassword )
    7992             :                                             throw(uno::RuntimeException)
    7993             : {
    7994           0 :     SolarMutexGuard aGuard;
    7995           0 :     ScDocShell* pDocSh = GetDocShell();
    7996             :     // #i108245# if already protected, don't change anything
    7997           0 :     if ( pDocSh && !pDocSh->GetDocument()->IsTabProtected( GetTab_Impl() ) )
    7998             :     {
    7999           0 :         String aString(aPassword);
    8000           0 :         pDocSh->GetDocFunc().Protect( GetTab_Impl(), aString, sal_True );
    8001           0 :     }
    8002           0 : }
    8003             : 
    8004           0 : void SAL_CALL ScTableSheetObj::unprotect( const rtl::OUString& aPassword )
    8005             :                             throw(lang::IllegalArgumentException, uno::RuntimeException)
    8006             : {
    8007           0 :     SolarMutexGuard aGuard;
    8008           0 :     ScDocShell* pDocSh = GetDocShell();
    8009           0 :     if ( pDocSh )
    8010             :     {
    8011           0 :         String aString(aPassword);
    8012           0 :         sal_Bool bDone = pDocSh->GetDocFunc().Unprotect( GetTab_Impl(), aString, sal_True );
    8013           0 :         if (!bDone)
    8014           0 :             throw lang::IllegalArgumentException();
    8015           0 :     }
    8016           0 : }
    8017             : 
    8018           2 : sal_Bool SAL_CALL ScTableSheetObj::isProtected() throw(uno::RuntimeException)
    8019             : {
    8020           2 :     SolarMutexGuard aGuard;
    8021           2 :     ScDocShell* pDocSh = GetDocShell();
    8022           2 :     if ( pDocSh )
    8023           2 :         return pDocSh->GetDocument()->IsTabProtected( GetTab_Impl() );
    8024             : 
    8025             :     OSL_FAIL("keine DocShell");     //! Exception oder so?
    8026           0 :     return false;
    8027             : }
    8028             : 
    8029             : // XScenario
    8030             : 
    8031           0 : sal_Bool SAL_CALL ScTableSheetObj::getIsScenario() throw(uno::RuntimeException)
    8032             : {
    8033           0 :     SolarMutexGuard aGuard;
    8034           0 :     ScDocShell* pDocSh = GetDocShell();
    8035           0 :     if ( pDocSh )
    8036           0 :         return pDocSh->GetDocument()->IsScenario( GetTab_Impl() );
    8037             : 
    8038           0 :     return false;
    8039             : }
    8040             : 
    8041           0 : rtl::OUString SAL_CALL ScTableSheetObj::getScenarioComment() throw(uno::RuntimeException)
    8042             : {
    8043           0 :     SolarMutexGuard aGuard;
    8044           0 :     ScDocShell* pDocSh = GetDocShell();
    8045           0 :     if ( pDocSh )
    8046             :     {
    8047           0 :         rtl::OUString aComment;
    8048           0 :         Color  aColor;
    8049             :         sal_uInt16 nFlags;
    8050           0 :         pDocSh->GetDocument()->GetScenarioData( GetTab_Impl(), aComment, aColor, nFlags );
    8051           0 :         return aComment;
    8052             :     }
    8053           0 :     return rtl::OUString();
    8054             : }
    8055             : 
    8056           0 : void SAL_CALL ScTableSheetObj::setScenarioComment( const rtl::OUString& aScenarioComment )
    8057             :                                                 throw(uno::RuntimeException)
    8058             : {
    8059           0 :     SolarMutexGuard aGuard;
    8060           0 :     ScDocShell* pDocSh = GetDocShell();
    8061           0 :     if ( pDocSh )
    8062             :     {
    8063           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    8064           0 :         SCTAB nTab = GetTab_Impl();
    8065             : 
    8066           0 :         rtl::OUString aName;
    8067           0 :         rtl::OUString aComment;
    8068           0 :         Color  aColor;
    8069             :         sal_uInt16 nFlags;
    8070           0 :         pDoc->GetName( nTab, aName );
    8071           0 :         pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8072             : 
    8073           0 :         aComment = String( aScenarioComment );
    8074             : 
    8075           0 :         pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8076           0 :     }
    8077           0 : }
    8078             : 
    8079           0 : void SAL_CALL ScTableSheetObj::addRanges( const uno::Sequence<table::CellRangeAddress>& rScenRanges )
    8080             :                                                 throw(uno::RuntimeException)
    8081             : {
    8082           0 :     SolarMutexGuard aGuard;
    8083           0 :     ScDocShell* pDocSh = GetDocShell();
    8084           0 :     if ( pDocSh )
    8085             :     {
    8086           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    8087           0 :         SCTAB nTab = GetTab_Impl();
    8088             : 
    8089           0 :         if (pDoc->IsScenario(nTab))
    8090             :         {
    8091           0 :             ScMarkData aMarkData;
    8092           0 :             aMarkData.SelectTable( nTab, sal_True );
    8093             : 
    8094           0 :             sal_uInt16 nRangeCount = (sal_uInt16)rScenRanges.getLength();
    8095           0 :             if (nRangeCount)
    8096             :             {
    8097           0 :                 const table::CellRangeAddress* pAry = rScenRanges.getConstArray();
    8098           0 :                 for (sal_uInt16 i=0; i<nRangeCount; i++)
    8099             :                 {
    8100             :                     OSL_ENSURE( pAry[i].Sheet == nTab, "addRanges mit falscher Tab" );
    8101           0 :                     ScRange aOneRange( (SCCOL)pAry[i].StartColumn, (SCROW)pAry[i].StartRow, nTab,
    8102           0 :                                        (SCCOL)pAry[i].EndColumn,   (SCROW)pAry[i].EndRow,   nTab );
    8103             : 
    8104           0 :                     aMarkData.SetMultiMarkArea( aOneRange );
    8105             :                 }
    8106             :             }
    8107             : 
    8108             :             //  Szenario-Ranges sind durch Attribut gekennzeichnet
    8109           0 :             ScPatternAttr aPattern( pDoc->GetPool() );
    8110           0 :             aPattern.GetItemSet().Put( ScMergeFlagAttr( SC_MF_SCENARIO ) );
    8111           0 :             aPattern.GetItemSet().Put( ScProtectionAttr( sal_True ) );
    8112           0 :             pDocSh->GetDocFunc().ApplyAttributes( aMarkData, aPattern, sal_True, sal_True );
    8113             :         }
    8114           0 :     }
    8115           0 : }
    8116             : 
    8117           0 : void SAL_CALL ScTableSheetObj::apply() throw(uno::RuntimeException)
    8118             : {
    8119           0 :     SolarMutexGuard aGuard;
    8120           0 :     ScDocShell* pDocSh = GetDocShell();
    8121           0 :     if ( pDocSh )
    8122             :     {
    8123           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    8124           0 :         SCTAB nTab = GetTab_Impl();
    8125           0 :         rtl::OUString aName;
    8126           0 :         pDoc->GetName( nTab, aName );       // Name dieses Szenarios
    8127             : 
    8128           0 :         SCTAB nDestTab = nTab;
    8129           0 :         while ( nDestTab > 0 && pDoc->IsScenario(nDestTab) )
    8130           0 :             --nDestTab;
    8131             : 
    8132           0 :         if ( !pDoc->IsScenario(nDestTab) )
    8133           0 :             pDocSh->UseScenario( nDestTab, aName );
    8134             : 
    8135             :         //! sonst Fehler oder so
    8136           0 :     }
    8137           0 : }
    8138             : 
    8139             : // XScenarioEnhanced
    8140             : 
    8141           0 : uno::Sequence< table::CellRangeAddress > SAL_CALL ScTableSheetObj::getRanges(  )
    8142             :                                     throw(uno::RuntimeException)
    8143             : {
    8144           0 :     SolarMutexGuard aGuard;
    8145           0 :     ScDocShell* pDocSh = GetDocShell();
    8146           0 :     if ( pDocSh )
    8147             :     {
    8148           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    8149           0 :         SCTAB nTab = GetTab_Impl();
    8150           0 :         const ScRangeList* pRangeList = pDoc->GetScenarioRanges(nTab);
    8151           0 :         if (pRangeList)
    8152             :         {
    8153           0 :             size_t nCount = pRangeList->size();
    8154           0 :             uno::Sequence< table::CellRangeAddress > aRetRanges( nCount );
    8155           0 :             table::CellRangeAddress* pAry = aRetRanges.getArray();
    8156           0 :             for( size_t nIndex = 0; nIndex < nCount; nIndex++ )
    8157             :             {
    8158           0 :                 const ScRange* pRange = (*pRangeList)[nIndex];
    8159           0 :                 pAry->StartColumn = pRange->aStart.Col();
    8160           0 :                 pAry->StartRow = pRange->aStart.Row();
    8161           0 :                 pAry->EndColumn = pRange->aEnd.Col();
    8162           0 :                 pAry->EndRow = pRange->aEnd.Row();
    8163           0 :                 pAry->Sheet = pRange->aStart.Tab();
    8164           0 :                 ++pAry;
    8165             :             }
    8166           0 :             return aRetRanges;
    8167             :         }
    8168             :     }
    8169           0 :     return uno::Sequence< table::CellRangeAddress > ();
    8170             : }
    8171             : 
    8172             : // XExternalSheetName
    8173             : 
    8174           0 : void ScTableSheetObj::setExternalName( const ::rtl::OUString& aUrl, const ::rtl::OUString& aSheetName )
    8175             :     throw (container::ElementExistException, uno::RuntimeException)
    8176             : {
    8177           0 :     SolarMutexGuard aGuard;
    8178           0 :     ScDocShell* pDocSh = GetDocShell();
    8179           0 :     if ( pDocSh )
    8180             :     {
    8181           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    8182           0 :         if ( pDoc )
    8183             :         {
    8184           0 :             const SCTAB nTab = GetTab_Impl();
    8185           0 :             const String aAbsDocName( ScGlobal::GetAbsDocName( aUrl, pDocSh ) );
    8186           0 :             const String aDocTabName( ScGlobal::GetDocTabName( aAbsDocName, aSheetName ) );
    8187           0 :             if ( !pDoc->RenameTab( nTab, aDocTabName, false /*bUpdateRef*/, sal_True /*bExternalDocument*/ ) )
    8188             :             {
    8189           0 :                 throw container::ElementExistException( ::rtl::OUString(), *this );
    8190           0 :             }
    8191             :         }
    8192           0 :     }
    8193           0 : }
    8194             : 
    8195             : // XEventsSupplier
    8196             : 
    8197           0 : uno::Reference<container::XNameReplace> SAL_CALL ScTableSheetObj::getEvents() throw (uno::RuntimeException)
    8198             : {
    8199           0 :     SolarMutexGuard aGuard;
    8200           0 :     ScDocShell* pDocSh = GetDocShell();
    8201           0 :     if ( pDocSh )
    8202           0 :         return new ScSheetEventsObj( pDocSh, GetTab_Impl() );
    8203             : 
    8204           0 :     return NULL;
    8205             : }
    8206             : 
    8207             : // XPropertySet erweitert fuer Sheet-Properties
    8208             : 
    8209         113 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableSheetObj::getPropertySetInfo()
    8210             :                                                         throw(uno::RuntimeException)
    8211             : {
    8212         113 :     SolarMutexGuard aGuard;
    8213             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    8214         113 :         new SfxItemPropertySetInfo( pSheetPropSet->getPropertyMap() ));
    8215         113 :     return aRef;
    8216             : }
    8217             : 
    8218         286 : void ScTableSheetObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    8219             :                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
    8220             : {
    8221         286 :     if ( pEntry )
    8222             :     {
    8223         286 :         if ( IsScItemWid( pEntry->nWID ) )
    8224             :         {
    8225             :             //  for Item WIDs, call ScCellRangesBase directly
    8226           0 :             ScCellRangesBase::SetOnePropertyValue(pEntry, aValue);
    8227           0 :             return;
    8228             :         }
    8229             : 
    8230             :         //  own properties
    8231             : 
    8232         286 :         ScDocShell* pDocSh = GetDocShell();
    8233         286 :         if (!pDocSh)
    8234           0 :             return;                                                 //! Exception oder so?
    8235         286 :         ScDocument* pDoc = pDocSh->GetDocument();
    8236         286 :         SCTAB nTab = GetTab_Impl();
    8237         286 :         ScDocFunc &rFunc = pDocSh->GetDocFunc();
    8238             : 
    8239         286 :         if ( pEntry->nWID == SC_WID_UNO_PAGESTL )
    8240             :         {
    8241          75 :             rtl::OUString aStrVal;
    8242          75 :             aValue >>= aStrVal;
    8243             :             rtl::OUString aNewStr(ScStyleNameConversion::ProgrammaticToDisplayName(
    8244          75 :                                                 aStrVal, SFX_STYLE_FAMILY_PAGE ));
    8245             : 
    8246             :             //! Undo? (auch bei SID_STYLE_APPLY an der View)
    8247             : 
    8248          75 :             if ( pDoc->GetPageStyle( nTab ) != aNewStr )
    8249             :             {
    8250          25 :                 pDoc->SetPageStyle( nTab, aNewStr );
    8251          25 :                 if (!pDoc->IsImportingXML())
    8252             :                 {
    8253          25 :                     ScPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ).UpdatePages();
    8254             : 
    8255          25 :                     SfxBindings* pBindings = pDocSh->GetViewBindings();
    8256          25 :                     if (pBindings)
    8257             :                     {
    8258           0 :                         pBindings->Invalidate( SID_STYLE_FAMILY4 );
    8259           0 :                         pBindings->Invalidate( SID_STATUS_PAGESTYLE );
    8260           0 :                         pBindings->Invalidate( FID_RESET_PRINTZOOM );
    8261           0 :                         pBindings->Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT );
    8262           0 :                         pBindings->Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT );
    8263             :                     }
    8264             :                 }
    8265          25 :                 pDocSh->SetDocumentModified();
    8266          75 :             }
    8267             :         }
    8268         211 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    8269             :         {
    8270          86 :             sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8271          86 :             rFunc.SetTableVisible( nTab, bVis, sal_True );
    8272             :         }
    8273         125 :         else if ( pEntry->nWID == SC_WID_UNO_ISACTIVE )
    8274             :         {
    8275           0 :             if (pDoc->IsScenario(nTab))
    8276           0 :                 pDoc->SetActiveScenario( nTab, ScUnoHelpFunctions::GetBoolFromAny( aValue ) );
    8277             :         }
    8278         125 :         else if ( pEntry->nWID == SC_WID_UNO_BORDCOL )
    8279             :         {
    8280           0 :             if (pDoc->IsScenario(nTab))
    8281             :             {
    8282           0 :                 sal_Int32 nNewColor = 0;
    8283           0 :                 if (aValue >>= nNewColor)
    8284             :                 {
    8285           0 :                     rtl::OUString aName;
    8286           0 :                     rtl::OUString aComment;
    8287           0 :                     Color  aColor;
    8288             :                     sal_uInt16 nFlags;
    8289           0 :                     pDoc->GetName( nTab, aName );
    8290           0 :                     pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8291             : 
    8292           0 :                     aColor = Color(static_cast<sal_uInt32>(nNewColor));
    8293             : 
    8294           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8295             :                 }
    8296             :             }
    8297             :         }
    8298         125 :         else if ( pEntry->nWID == SC_WID_UNO_PROTECT )
    8299             :         {
    8300           0 :             if (pDoc->IsScenario(nTab))
    8301             :             {
    8302           0 :                 rtl::OUString aName;
    8303           0 :                 rtl::OUString aComment;
    8304           0 :                 Color  aColor;
    8305             :                 sal_uInt16 nFlags;
    8306           0 :                 pDoc->GetName( nTab, aName );
    8307           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8308           0 :                 sal_Bool bModify(false);
    8309             : 
    8310           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8311             :                 {
    8312           0 :                     if (!(nFlags & SC_SCENARIO_PROTECT))
    8313             :                     {
    8314           0 :                         nFlags |= SC_SCENARIO_PROTECT;
    8315           0 :                         bModify = sal_True;
    8316             :                     }
    8317             :                 }
    8318             :                 else
    8319             :                 {
    8320           0 :                     if (nFlags & SC_SCENARIO_PROTECT)
    8321             :                     {
    8322           0 :                         nFlags -= SC_SCENARIO_PROTECT;
    8323           0 :                         bModify = sal_True;
    8324             :                     }
    8325             :                 }
    8326             : 
    8327           0 :                 if (bModify)
    8328           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8329             :             }
    8330             :         }
    8331         125 :         else if ( pEntry->nWID == SC_WID_UNO_SHOWBORD )
    8332             :         {
    8333           0 :             if (pDoc->IsScenario(nTab))
    8334             :             {
    8335           0 :                 rtl::OUString aName;
    8336           0 :                 rtl::OUString aComment;
    8337           0 :                 Color  aColor;
    8338             :                 sal_uInt16 nFlags;
    8339           0 :                 pDoc->GetName( nTab, aName );
    8340           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8341           0 :                 sal_Bool bModify(false);
    8342             : 
    8343           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8344             :                 {
    8345           0 :                     if (!(nFlags & SC_SCENARIO_SHOWFRAME))
    8346             :                     {
    8347           0 :                         nFlags |= SC_SCENARIO_SHOWFRAME;
    8348           0 :                         bModify = sal_True;
    8349             :                     }
    8350             :                 }
    8351             :                 else
    8352             :                 {
    8353           0 :                     if (nFlags & SC_SCENARIO_SHOWFRAME)
    8354             :                     {
    8355           0 :                         nFlags -= SC_SCENARIO_SHOWFRAME;
    8356           0 :                         bModify = sal_True;
    8357             :                     }
    8358             :                 }
    8359             : 
    8360           0 :                 if (bModify)
    8361           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8362             :             }
    8363             :         }
    8364         125 :         else if ( pEntry->nWID == SC_WID_UNO_PRINTBORD )
    8365             :         {
    8366           0 :             if (pDoc->IsScenario(nTab))
    8367             :             {
    8368           0 :                 rtl::OUString aName;
    8369           0 :                 rtl::OUString aComment;
    8370           0 :                 Color  aColor;
    8371             :                 sal_uInt16 nFlags;
    8372           0 :                 pDoc->GetName( nTab, aName );
    8373           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8374           0 :                 sal_Bool bModify(false);
    8375             : 
    8376           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8377             :                 {
    8378           0 :                     if (!(nFlags & SC_SCENARIO_PRINTFRAME))
    8379             :                     {
    8380           0 :                         nFlags |= SC_SCENARIO_PRINTFRAME;
    8381           0 :                         bModify = sal_True;
    8382             :                     }
    8383             :                 }
    8384             :                 else
    8385             :                 {
    8386           0 :                     if (nFlags & SC_SCENARIO_PRINTFRAME)
    8387             :                     {
    8388           0 :                         nFlags -= SC_SCENARIO_PRINTFRAME;
    8389           0 :                         bModify = sal_True;
    8390             :                     }
    8391             :                 }
    8392             : 
    8393           0 :                 if (bModify)
    8394           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8395             :             }
    8396             :         }
    8397         125 :         else if ( pEntry->nWID == SC_WID_UNO_COPYBACK )
    8398             :         {
    8399           0 :             if (pDoc->IsScenario(nTab))
    8400             :             {
    8401           0 :                 rtl::OUString aName;
    8402           0 :                 rtl::OUString aComment;
    8403           0 :                 Color  aColor;
    8404             :                 sal_uInt16 nFlags;
    8405           0 :                 pDoc->GetName( nTab, aName );
    8406           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8407           0 :                 sal_Bool bModify(false);
    8408             : 
    8409           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8410             :                 {
    8411           0 :                     if (!(nFlags & SC_SCENARIO_TWOWAY))
    8412             :                     {
    8413           0 :                         nFlags |= SC_SCENARIO_TWOWAY;
    8414           0 :                         bModify = sal_True;
    8415             :                     }
    8416             :                 }
    8417             :                 else
    8418             :                 {
    8419           0 :                     if (nFlags & SC_SCENARIO_TWOWAY)
    8420             :                     {
    8421           0 :                         nFlags -= SC_SCENARIO_TWOWAY;
    8422           0 :                         bModify = sal_True;
    8423             :                     }
    8424             :                 }
    8425             : 
    8426           0 :                 if (bModify)
    8427           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8428             :             }
    8429             :         }
    8430         125 :         else if ( pEntry->nWID == SC_WID_UNO_COPYSTYL )
    8431             :         {
    8432           0 :             if (pDoc->IsScenario(nTab))
    8433             :             {
    8434           0 :                 rtl::OUString aName;
    8435           0 :                 rtl::OUString aComment;
    8436           0 :                 Color  aColor;
    8437             :                 sal_uInt16 nFlags;
    8438           0 :                 pDoc->GetName( nTab, aName );
    8439           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8440           0 :                 sal_Bool bModify(false);
    8441             : 
    8442           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8443             :                 {
    8444           0 :                     if (!(nFlags & SC_SCENARIO_ATTRIB))
    8445             :                     {
    8446           0 :                         nFlags |= SC_SCENARIO_ATTRIB;
    8447           0 :                         bModify = sal_True;
    8448             :                     }
    8449             :                 }
    8450             :                 else
    8451             :                 {
    8452           0 :                     if (nFlags & SC_SCENARIO_ATTRIB)
    8453             :                     {
    8454           0 :                         nFlags -= SC_SCENARIO_ATTRIB;
    8455           0 :                         bModify = sal_True;
    8456             :                     }
    8457             :                 }
    8458             : 
    8459           0 :                 if (bModify)
    8460           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8461             :             }
    8462             :         }
    8463         125 :         else if ( pEntry->nWID == SC_WID_UNO_COPYFORM )
    8464             :         {
    8465           0 :             if (pDoc->IsScenario(nTab))
    8466             :             {
    8467           0 :                 rtl::OUString aName;
    8468           0 :                 rtl::OUString aComment;
    8469           0 :                 Color  aColor;
    8470             :                 sal_uInt16 nFlags;
    8471           0 :                 pDoc->GetName( nTab, aName );
    8472           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8473           0 :                 sal_Bool bModify(false);
    8474             : 
    8475           0 :                 if (ScUnoHelpFunctions::GetBoolFromAny( aValue ))
    8476             :                 {
    8477           0 :                     if (nFlags & SC_SCENARIO_VALUE)
    8478             :                     {
    8479           0 :                         nFlags -= SC_SCENARIO_VALUE;
    8480           0 :                         bModify = sal_True;
    8481             :                     }
    8482             :                 }
    8483             :                 else
    8484             :                 {
    8485           0 :                     if (!(nFlags & SC_SCENARIO_VALUE))
    8486             :                     {
    8487           0 :                         nFlags |= SC_SCENARIO_VALUE;
    8488           0 :                         bModify = sal_True;
    8489             :                     }
    8490             :                 }
    8491             : 
    8492           0 :                 if (bModify)
    8493           0 :                     pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags );
    8494             :             }
    8495             :         }
    8496         125 :         else if ( pEntry->nWID == SC_WID_UNO_TABLAYOUT )
    8497             :         {
    8498          50 :             sal_Int16 nValue = 0;
    8499          50 :             if (aValue >>= nValue)
    8500             :             {
    8501          50 :                 if (nValue == com::sun::star::text::WritingMode2::RL_TB)
    8502           0 :                     rFunc.SetLayoutRTL(nTab, sal_True, sal_True);
    8503             :                 else
    8504          50 :                     rFunc.SetLayoutRTL(nTab, false, sal_True);
    8505             :             }
    8506             :         }
    8507          75 :         else if ( pEntry->nWID == SC_WID_UNO_AUTOPRINT )
    8508             :         {
    8509           0 :             sal_Bool bAutoPrint = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8510           0 :             if (bAutoPrint)
    8511           0 :                 pDoc->SetPrintEntireSheet( nTab ); // clears all print ranges
    8512             :             else
    8513             :             {
    8514           0 :                 if (pDoc->IsPrintEntireSheet( nTab ))
    8515           0 :                     pDoc->ClearPrintRanges( nTab ); // if this flag is true, there are no PrintRanges, so Clear clears only the flag.
    8516             :             }
    8517             :         }
    8518          75 :         else if ( pEntry->nWID == SC_WID_UNO_TABCOLOR )
    8519             :         {
    8520          25 :             sal_Int32 nColor = COL_AUTO;
    8521          25 :             if ( aValue >>= nColor )
    8522             :             {
    8523          25 :                 const Color aColor( static_cast< ColorData >( nColor ) );
    8524          25 :                 if ( pDoc->GetTabBgColor( nTab ) != aColor )
    8525           0 :                     rFunc.SetTabBgColor( nTab, aColor, true, true );
    8526             :             }
    8527             :         }
    8528          50 :         else if ( pEntry->nWID == SC_WID_UNO_CODENAME )
    8529             :         {
    8530          25 :             rtl::OUString aCodeName;
    8531          25 :             if ( pDocSh && ( aValue >>= aCodeName ) )
    8532             :             {
    8533          25 :                 pDocSh->GetDocument()->SetCodeName( GetTab_Impl(), aCodeName );
    8534          25 :             }
    8535             :         }
    8536             :         else
    8537          25 :             ScCellRangeObj::SetOnePropertyValue(pEntry, aValue);        // base class, no Item WID
    8538             :     }
    8539             : }
    8540             : 
    8541           8 : void ScTableSheetObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
    8542             :                                             uno::Any& rAny )
    8543             :                                                 throw(uno::RuntimeException)
    8544             : {
    8545           8 :     if ( pEntry )
    8546             :     {
    8547           8 :         ScDocShell* pDocSh = GetDocShell();
    8548           8 :         if (!pDocSh)
    8549           0 :             throw uno::RuntimeException();
    8550           8 :         ScDocument* pDoc = pDocSh->GetDocument();
    8551           8 :         SCTAB nTab = GetTab_Impl();
    8552             : 
    8553           8 :         if ( pEntry->nWID == SC_WID_UNO_NAMES )
    8554             :         {
    8555           0 :             rAny <<= uno::Reference<sheet::XNamedRanges>(new ScLocalNamedRangesObj(pDocSh, this));
    8556             :         }
    8557           8 :         else if ( pEntry->nWID == SC_WID_UNO_PAGESTL )
    8558             :         {
    8559             :             rAny <<= rtl::OUString( ScStyleNameConversion::DisplayToProgrammaticName(
    8560           2 :                                 pDoc->GetPageStyle( nTab ), SFX_STYLE_FAMILY_PAGE ) );
    8561             :         }
    8562           6 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    8563             :         {
    8564           2 :             sal_Bool bVis = pDoc->IsVisible( nTab );
    8565           2 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bVis );
    8566             :         }
    8567           4 :         else if ( pEntry->nWID == SC_WID_UNO_LINKDISPBIT )
    8568             :         {
    8569             :             //  no target bitmaps for individual entries (would be all equal)
    8570             :             // ScLinkTargetTypeObj::SetLinkTargetBitmap( aAny, SC_LINKTARGETTYPE_SHEET );
    8571             :         }
    8572           4 :         else if ( pEntry->nWID == SC_WID_UNO_LINKDISPNAME )
    8573             :         {
    8574             :             //  LinkDisplayName for hyperlink dialog
    8575           0 :             rAny <<= getName();     // sheet name
    8576             :         }
    8577           4 :         else if ( pEntry->nWID == SC_WID_UNO_ISACTIVE )
    8578             :         {
    8579           0 :             if (pDoc->IsScenario(nTab))
    8580           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, pDoc->IsActiveScenario( nTab ));
    8581             :         }
    8582           4 :         else if ( pEntry->nWID == SC_WID_UNO_BORDCOL )
    8583             :         {
    8584           0 :             if (pDoc->IsScenario(nTab))
    8585             :             {
    8586           0 :                 rtl::OUString aComment;
    8587           0 :                 Color  aColor;
    8588             :                 sal_uInt16 nFlags;
    8589           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8590             : 
    8591           0 :                 rAny <<= static_cast<sal_Int32>(aColor.GetColor());
    8592             :             }
    8593             :         }
    8594           4 :         else if ( pEntry->nWID == SC_WID_UNO_PROTECT )
    8595             :         {
    8596           0 :             if (pDoc->IsScenario(nTab))
    8597             :             {
    8598           0 :                 rtl::OUString aComment;
    8599           0 :                 Color  aColor;
    8600             :                 sal_uInt16 nFlags;
    8601           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8602             : 
    8603           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_PROTECT) != 0 );
    8604             :             }
    8605             :         }
    8606           4 :         else if ( pEntry->nWID == SC_WID_UNO_SHOWBORD )
    8607             :         {
    8608           0 :             if (pDoc->IsScenario(nTab))
    8609             :             {
    8610           0 :                 rtl::OUString aComment;
    8611           0 :                 Color  aColor;
    8612             :                 sal_uInt16 nFlags;
    8613           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8614             : 
    8615           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_SHOWFRAME) != 0 );
    8616             :             }
    8617             :         }
    8618           4 :         else if ( pEntry->nWID == SC_WID_UNO_PRINTBORD )
    8619             :         {
    8620           0 :             if (pDoc->IsScenario(nTab))
    8621             :             {
    8622           0 :                 rtl::OUString aComment;
    8623           0 :                 Color  aColor;
    8624             :                 sal_uInt16 nFlags;
    8625           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8626             : 
    8627           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_PRINTFRAME) != 0 );
    8628             :             }
    8629             :         }
    8630           4 :         else if ( pEntry->nWID == SC_WID_UNO_COPYBACK )
    8631             :         {
    8632           0 :             if (pDoc->IsScenario(nTab))
    8633             :             {
    8634           0 :                 rtl::OUString aComment;
    8635           0 :                 Color  aColor;
    8636             :                 sal_uInt16 nFlags;
    8637           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8638             : 
    8639           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_TWOWAY) != 0 );
    8640             :             }
    8641             :         }
    8642           4 :         else if ( pEntry->nWID == SC_WID_UNO_COPYSTYL )
    8643             :         {
    8644           0 :             if (pDoc->IsScenario(nTab))
    8645             :             {
    8646           0 :                 rtl::OUString aComment;
    8647           0 :                 Color  aColor;
    8648             :                 sal_uInt16 nFlags;
    8649           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8650             : 
    8651           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_ATTRIB) != 0 );
    8652             :             }
    8653             :         }
    8654           4 :         else if ( pEntry->nWID == SC_WID_UNO_COPYFORM )
    8655             :         {
    8656           0 :             if (pDoc->IsScenario(nTab))
    8657             :             {
    8658           0 :                 rtl::OUString aComment;
    8659           0 :                 Color  aColor;
    8660             :                 sal_uInt16 nFlags;
    8661           0 :                 pDoc->GetScenarioData( nTab, aComment, aColor, nFlags );
    8662             : 
    8663           0 :                 ScUnoHelpFunctions::SetBoolInAny( rAny, !(nFlags & SC_SCENARIO_VALUE));
    8664             :             }
    8665             :         }
    8666           4 :         else if ( pEntry->nWID == SC_WID_UNO_TABLAYOUT )
    8667             :         {
    8668           2 :             if (pDoc->IsLayoutRTL(nTab))
    8669           0 :                 rAny <<= sal_Int16(com::sun::star::text::WritingMode2::RL_TB);
    8670             :             else
    8671           2 :                 rAny <<= sal_Int16(com::sun::star::text::WritingMode2::LR_TB);
    8672             :         }
    8673           2 :         else if ( pEntry->nWID == SC_WID_UNO_AUTOPRINT )
    8674             :         {
    8675           0 :             sal_Bool bAutoPrint = pDoc->IsPrintEntireSheet( nTab );
    8676           0 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bAutoPrint );
    8677             :         }
    8678           2 :         else if ( pEntry->nWID == SC_WID_UNO_TABCOLOR )
    8679             :         {
    8680           2 :             rAny <<= sal_Int32(pDoc->GetTabBgColor(nTab).GetColor());
    8681             :         }
    8682           0 :         else if ( pEntry->nWID == SC_WID_UNO_CODENAME )
    8683             :         {
    8684           0 :             rtl::OUString aCodeName;
    8685           0 :             if ( pDocSh )
    8686           0 :                 pDocSh->GetDocument()->GetCodeName( GetTab_Impl(), aCodeName );
    8687           0 :             rAny <<= rtl::OUString( aCodeName );
    8688             :         }
    8689             :         else
    8690           0 :             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
    8691             :     }
    8692           8 : }
    8693             : 
    8694         188 : const SfxItemPropertyMap& ScTableSheetObj::GetItemPropertyMap()
    8695             : {
    8696         188 :     return pSheetPropSet->getPropertyMap();
    8697             : }
    8698             : 
    8699             : // XServiceInfo
    8700             : 
    8701           0 : rtl::OUString SAL_CALL ScTableSheetObj::getImplementationName() throw(uno::RuntimeException)
    8702             : {
    8703           0 :     return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScTableSheetObj" ));
    8704             : }
    8705             : 
    8706           0 : sal_Bool SAL_CALL ScTableSheetObj::supportsService( const rtl::OUString& rServiceName )
    8707             :                                                     throw(uno::RuntimeException)
    8708             : {
    8709           0 :     String aServiceStr( rServiceName );
    8710           0 :     return aServiceStr.EqualsAscii( SCSPREADSHEET_SERVICE ) ||
    8711           0 :            aServiceStr.EqualsAscii( SCSHEETCELLRANGE_SERVICE ) ||
    8712           0 :            aServiceStr.EqualsAscii( SCCELLRANGE_SERVICE ) ||
    8713           0 :            aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) ||
    8714           0 :            aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) ||
    8715           0 :            aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE ) ||
    8716           0 :            aServiceStr.EqualsAscii( SCLINKTARGET_SERVICE );
    8717             : }
    8718             : 
    8719           0 : uno::Sequence<rtl::OUString> SAL_CALL ScTableSheetObj::getSupportedServiceNames()
    8720             :                                                     throw(uno::RuntimeException)
    8721             : {
    8722           0 :     uno::Sequence<rtl::OUString> aRet(7);
    8723           0 :     rtl::OUString* pArray = aRet.getArray();
    8724           0 :     pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSPREADSHEET_SERVICE ));
    8725           0 :     pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELLRANGE_SERVICE ));
    8726           0 :     pArray[2] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLRANGE_SERVICE ));
    8727           0 :     pArray[3] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLPROPERTIES_SERVICE ));
    8728           0 :     pArray[4] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCHARPROPERTIES_SERVICE ));
    8729           0 :     pArray[5] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCPARAPROPERTIES_SERVICE ));
    8730           0 :     pArray[6] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCLINKTARGET_SERVICE ));
    8731           0 :     return aRet;
    8732             : }
    8733             : 
    8734             : // XUnoTunnel
    8735             : 
    8736           0 : sal_Int64 SAL_CALL ScTableSheetObj::getSomething(
    8737             :                 const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException)
    8738             : {
    8739           0 :     if ( rId.getLength() == 16 &&
    8740           0 :           0 == memcmp( getUnoTunnelId().getConstArray(),
    8741           0 :                                     rId.getConstArray(), 16 ) )
    8742             :     {
    8743           0 :         return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this));
    8744             :     }
    8745             : 
    8746           0 :     return ScCellRangeObj::getSomething( rId );
    8747             : }
    8748             : 
    8749             : namespace
    8750             : {
    8751             :     class theScTableSheetObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScTableSheetObjUnoTunnelId> {};
    8752             : }
    8753             : 
    8754           0 : const uno::Sequence<sal_Int8>& ScTableSheetObj::getUnoTunnelId()
    8755             : {
    8756           0 :     return theScTableSheetObjUnoTunnelId::get().getSeq();
    8757             : }
    8758             : 
    8759           0 : ScTableSheetObj* ScTableSheetObj::getImplementation( const uno::Reference<uno::XInterface> xObj )
    8760             : {
    8761           0 :     ScTableSheetObj* pRet = NULL;
    8762           0 :     uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY );
    8763           0 :     if (xUT.is())
    8764           0 :         pRet = reinterpret_cast<ScTableSheetObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId())));
    8765           0 :     return pRet;
    8766             : }
    8767             : 
    8768             : //------------------------------------------------------------------------
    8769             : 
    8770           2 : ScTableColumnObj::ScTableColumnObj( ScDocShell* pDocSh, SCCOL nCol, SCTAB nTab ) :
    8771             :     ScCellRangeObj( pDocSh, ScRange(nCol,0,nTab, nCol,MAXROW,nTab) ),
    8772           2 :     pColPropSet(lcl_GetColumnPropertySet())
    8773             : {
    8774           2 : }
    8775             : 
    8776           4 : ScTableColumnObj::~ScTableColumnObj()
    8777             : {
    8778           4 : }
    8779             : 
    8780           6 : uno::Any SAL_CALL ScTableColumnObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException)
    8781             : {
    8782           6 :     SC_QUERYINTERFACE( container::XNamed )
    8783             : 
    8784           6 :     return ScCellRangeObj::queryInterface( rType );
    8785             : }
    8786             : 
    8787          22 : void SAL_CALL ScTableColumnObj::acquire() throw()
    8788             : {
    8789          22 :     ScCellRangeObj::acquire();
    8790          22 : }
    8791             : 
    8792          22 : void SAL_CALL ScTableColumnObj::release() throw()
    8793             : {
    8794          22 :     ScCellRangeObj::release();
    8795          22 : }
    8796             : 
    8797           0 : uno::Sequence<uno::Type> SAL_CALL ScTableColumnObj::getTypes() throw(uno::RuntimeException)
    8798             : {
    8799           0 :     static uno::Sequence<uno::Type> aTypes;
    8800           0 :     if ( aTypes.getLength() == 0 )
    8801             :     {
    8802           0 :         uno::Sequence<uno::Type> aParentTypes(ScCellRangeObj::getTypes());
    8803           0 :         long nParentLen = aParentTypes.getLength();
    8804           0 :         const uno::Type* pParentPtr = aParentTypes.getConstArray();
    8805             : 
    8806           0 :         aTypes.realloc( nParentLen + 1 );
    8807           0 :         uno::Type* pPtr = aTypes.getArray();
    8808           0 :         pPtr[nParentLen + 0] = getCppuType((const uno::Reference<container::XNamed>*)0);
    8809             : 
    8810           0 :         for (long i=0; i<nParentLen; i++)
    8811           0 :             pPtr[i] = pParentPtr[i];                // parent types first
    8812             :     }
    8813           0 :     return aTypes;
    8814             : }
    8815             : 
    8816             : namespace
    8817             : {
    8818             :     class theScTableColumnObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScTableColumnObjImplementationId > {};
    8819             : }
    8820             : 
    8821           2 : uno::Sequence<sal_Int8> SAL_CALL ScTableColumnObj::getImplementationId() throw(uno::RuntimeException)
    8822             : {
    8823           2 :     return theScTableColumnObjImplementationId::get().getSeq();
    8824             : }
    8825             : 
    8826             : // XNamed
    8827             : 
    8828           0 : rtl::OUString SAL_CALL ScTableColumnObj::getName() throw(uno::RuntimeException)
    8829             : {
    8830           0 :     SolarMutexGuard aGuard;
    8831             : 
    8832           0 :     const ScRange& rRange = GetRange();
    8833             :     OSL_ENSURE(rRange.aStart.Col() == rRange.aEnd.Col(), "too many columns");
    8834           0 :     SCCOL nCol = rRange.aStart.Col();
    8835             : 
    8836           0 :     return ScColToAlpha( nCol );        // from global.hxx
    8837             : }
    8838             : 
    8839           0 : void SAL_CALL ScTableColumnObj::setName( const rtl::OUString& /* aNewName */ )
    8840             :                                                 throw(uno::RuntimeException)
    8841             : {
    8842           0 :     SolarMutexGuard aGuard;
    8843           0 :     throw uno::RuntimeException();      // read-only
    8844             : }
    8845             : 
    8846             : // XPropertySet erweitert fuer Spalten-Properties
    8847             : 
    8848           2 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableColumnObj::getPropertySetInfo()
    8849             :                                                         throw(uno::RuntimeException)
    8850             : {
    8851           2 :     SolarMutexGuard aGuard;
    8852             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    8853           2 :         new SfxItemPropertySetInfo( pColPropSet->getPropertyMap() ));
    8854           2 :     return aRef;
    8855             : }
    8856             : 
    8857           0 : void ScTableColumnObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    8858             :                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
    8859             : {
    8860           0 :     if ( pEntry )
    8861             :     {
    8862           0 :         if ( IsScItemWid( pEntry->nWID ) )
    8863             :         {
    8864             :             //  for Item WIDs, call ScCellRangesBase directly
    8865           0 :             ScCellRangesBase::SetOnePropertyValue(pEntry, aValue);
    8866             :             return;
    8867             :         }
    8868             : 
    8869             :         //  own properties
    8870             : 
    8871           0 :         ScDocShell* pDocSh = GetDocShell();
    8872           0 :         if (!pDocSh)
    8873             :             return;                                                 //! Exception oder so?
    8874           0 :         const ScRange& rRange = GetRange();
    8875             :         OSL_ENSURE(rRange.aStart.Col() == rRange.aEnd.Col(), "zuviele Spalten");
    8876           0 :         SCCOL nCol = rRange.aStart.Col();
    8877           0 :         SCTAB nTab = rRange.aStart.Tab();
    8878           0 :         ScDocFunc &rFunc = pDocSh->GetDocFunc();
    8879             : 
    8880             :         SCCOLROW nColArr[2];
    8881           0 :         nColArr[0] = nColArr[1] = nCol;
    8882             : 
    8883           0 :         if ( pEntry->nWID == SC_WID_UNO_CELLWID )
    8884             :         {
    8885           0 :             sal_Int32 nNewWidth = 0;
    8886           0 :             if ( aValue >>= nNewWidth )
    8887             :             {
    8888             :                 //  property is 1/100mm, column width is twips
    8889           0 :                 nNewWidth = HMMToTwips(nNewWidth);
    8890             :                 rFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab, SC_SIZE_ORIGINAL,
    8891           0 :                                         (sal_uInt16)nNewWidth, sal_True, sal_True );
    8892             :             }
    8893             :         }
    8894           0 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    8895             :         {
    8896           0 :             sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8897           0 :             ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT;
    8898           0 :             rFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab, eMode, 0, sal_True, sal_True );
    8899             :             //  SC_SIZE_DIRECT mit Groesse 0 blendet aus
    8900             :         }
    8901           0 :         else if ( pEntry->nWID == SC_WID_UNO_OWIDTH )
    8902             :         {
    8903           0 :             sal_Bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8904           0 :             if (bOpt)
    8905             :                 rFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab,
    8906           0 :                                         SC_SIZE_OPTIMAL, STD_EXTRA_WIDTH, sal_True, sal_True );
    8907             :             // sal_False bei Spalten momentan ohne Auswirkung
    8908             :         }
    8909           0 :         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE || pEntry->nWID == SC_WID_UNO_MANPAGE )
    8910             :         {
    8911           0 :             sal_Bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    8912           0 :             if (bSet)
    8913           0 :                 rFunc.InsertPageBreak( sal_True, rRange.aStart, sal_True, sal_True, sal_True );
    8914             :             else
    8915           0 :                 rFunc.RemovePageBreak( sal_True, rRange.aStart, sal_True, sal_True, sal_True );
    8916             :         }
    8917             :         else
    8918           0 :             ScCellRangeObj::SetOnePropertyValue(pEntry, aValue);        // base class, no Item WID
    8919             :     }
    8920             : }
    8921             : 
    8922           6 : void ScTableColumnObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
    8923             :                                             uno::Any& rAny )
    8924             :                                                 throw(uno::RuntimeException)
    8925             : {
    8926           6 :     if ( pEntry )
    8927             :     {
    8928           6 :         ScDocShell* pDocSh = GetDocShell();
    8929           6 :         if (!pDocSh)
    8930           0 :             throw uno::RuntimeException();
    8931             : 
    8932           6 :         ScDocument* pDoc = pDocSh->GetDocument();
    8933           6 :         const ScRange& rRange = GetRange();
    8934             :         OSL_ENSURE(rRange.aStart.Col() == rRange.aEnd.Col(), "zuviele Spalten");
    8935           6 :         SCCOL nCol = rRange.aStart.Col();
    8936           6 :         SCTAB nTab = rRange.aStart.Tab();
    8937             : 
    8938           6 :         if ( pEntry->nWID == SC_WID_UNO_CELLWID )
    8939             :         {
    8940             :             // for hidden column, return original height
    8941           2 :             sal_uInt16 nWidth = pDoc->GetOriginalWidth( nCol, nTab );
    8942             :             //  property is 1/100mm, column width is twips
    8943           2 :             nWidth = (sal_uInt16) TwipsToHMM(nWidth);
    8944           2 :             rAny <<= (sal_Int32)( nWidth );
    8945             :         }
    8946           4 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    8947             :         {
    8948           2 :             bool bHidden = pDoc->ColHidden(nCol, nTab);
    8949           2 :             ScUnoHelpFunctions::SetBoolInAny( rAny, !bHidden );
    8950             :         }
    8951           2 :         else if ( pEntry->nWID == SC_WID_UNO_OWIDTH )
    8952             :         {
    8953             :             //! momentan immer gesetzt ??!?!
    8954           0 :             sal_Bool bOpt = !(pDoc->GetColFlags( nCol, nTab ) & CR_MANUALSIZE);
    8955           0 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bOpt );
    8956             :         }
    8957           2 :         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE )
    8958             :         {
    8959           0 :             ScBreakType nBreak = pDoc->HasColBreak(nCol, nTab);
    8960           0 :             ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak );
    8961             :         }
    8962           2 :         else if ( pEntry->nWID == SC_WID_UNO_MANPAGE )
    8963             :         {
    8964           2 :             ScBreakType nBreak = pDoc->HasColBreak(nCol, nTab);
    8965           2 :             ScUnoHelpFunctions::SetBoolInAny(rAny, (nBreak & BREAK_MANUAL));
    8966             :         }
    8967             :         else
    8968           0 :             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
    8969             :     }
    8970           6 : }
    8971             : 
    8972           2 : const SfxItemPropertyMap& ScTableColumnObj::GetItemPropertyMap()
    8973             : {
    8974           2 :     return pColPropSet->getPropertyMap();
    8975             : }
    8976             : 
    8977             : //------------------------------------------------------------------------
    8978             : 
    8979           2 : ScTableRowObj::ScTableRowObj(ScDocShell* pDocSh, SCROW nRow, SCTAB nTab) :
    8980             :     ScCellRangeObj( pDocSh, ScRange(0,nRow,nTab, MAXCOL,nRow,nTab) ),
    8981           2 :     pRowPropSet(lcl_GetRowPropertySet())
    8982             : {
    8983           2 : }
    8984             : 
    8985           4 : ScTableRowObj::~ScTableRowObj()
    8986             : {
    8987           4 : }
    8988             : 
    8989             : // XPropertySet erweitert fuer Zeilen-Properties
    8990             : 
    8991           2 : uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableRowObj::getPropertySetInfo()
    8992             :                                                         throw(uno::RuntimeException)
    8993             : {
    8994           2 :     SolarMutexGuard aGuard;
    8995             :     static uno::Reference<beans::XPropertySetInfo> aRef(
    8996           2 :         new SfxItemPropertySetInfo( pRowPropSet->getPropertyMap() ));
    8997           2 :     return aRef;
    8998             : }
    8999             : 
    9000           0 : void ScTableRowObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue )
    9001             :                                 throw(lang::IllegalArgumentException, uno::RuntimeException)
    9002             : {
    9003           0 :     if ( pEntry )
    9004             :     {
    9005           0 :         if ( IsScItemWid( pEntry->nWID ) )
    9006             :         {
    9007             :             //  for Item WIDs, call ScCellRangesBase directly
    9008           0 :             ScCellRangesBase::SetOnePropertyValue(pEntry, aValue);
    9009             :             return;
    9010             :         }
    9011             : 
    9012             :         //  own properties
    9013             : 
    9014           0 :         ScDocShell* pDocSh = GetDocShell();
    9015           0 :         if (!pDocSh)
    9016             :             return;                                                 //! Exception oder so?
    9017           0 :         ScDocument* pDoc = pDocSh->GetDocument();
    9018           0 :         const ScRange& rRange = GetRange();
    9019             :         OSL_ENSURE(rRange.aStart.Row() == rRange.aEnd.Row(), "zuviele Zeilen");
    9020           0 :         SCROW nRow = rRange.aStart.Row();
    9021           0 :         SCTAB nTab = rRange.aStart.Tab();
    9022           0 :         ScDocFunc &rFunc = pDocSh->GetDocFunc();
    9023             : 
    9024             :         SCCOLROW nRowArr[2];
    9025           0 :         nRowArr[0] = nRowArr[1] = nRow;
    9026             : 
    9027           0 :         if ( pEntry->nWID == SC_WID_UNO_CELLHGT )
    9028             :         {
    9029           0 :             sal_Int32 nNewHeight = 0;
    9030           0 :             if ( aValue >>= nNewHeight )
    9031             :             {
    9032             :                 //  property is 1/100mm, row height is twips
    9033           0 :                 nNewHeight = HMMToTwips(nNewHeight);
    9034             :                 rFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, SC_SIZE_ORIGINAL,
    9035           0 :                                         (sal_uInt16)nNewHeight, sal_True, sal_True );
    9036             :             }
    9037             :         }
    9038           0 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    9039             :         {
    9040           0 :             sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    9041           0 :             ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT;
    9042           0 :             rFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, eMode, 0, sal_True, sal_True );
    9043             :             //  SC_SIZE_DIRECT mit Groesse 0 blendet aus
    9044             :         }
    9045           0 :         else if ( pEntry->nWID == SC_WID_UNO_CELLFILT )
    9046             :         {
    9047           0 :             sal_Bool bFil = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    9048             :             //  SC_SIZE_DIRECT mit Groesse 0 blendet aus
    9049           0 :             pDoc->SetRowFiltered(nRow, nRow, nTab, bFil);
    9050             :         }
    9051           0 :         else if ( pEntry->nWID == SC_WID_UNO_OHEIGHT )
    9052             :         {
    9053           0 :             sal_Bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    9054           0 :             if (bOpt)
    9055           0 :                 rFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, SC_SIZE_OPTIMAL, 0, sal_True, sal_True );
    9056             :             else
    9057             :             {
    9058             :                 //  set current height again manually
    9059           0 :                 sal_uInt16 nHeight = pDoc->GetOriginalHeight( nRow, nTab );
    9060           0 :                 rFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, SC_SIZE_ORIGINAL, nHeight, sal_True, sal_True );
    9061             :             }
    9062             :         }
    9063           0 :         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE || pEntry->nWID == SC_WID_UNO_MANPAGE )
    9064             :         {
    9065           0 :             sal_Bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue );
    9066           0 :             if (bSet)
    9067           0 :                 rFunc.InsertPageBreak( false, rRange.aStart, sal_True, sal_True, sal_True );
    9068             :             else
    9069           0 :                 rFunc.RemovePageBreak( false, rRange.aStart, sal_True, sal_True, sal_True );
    9070             :         }
    9071             :         else
    9072           0 :             ScCellRangeObj::SetOnePropertyValue(pEntry, aValue);        // base class, no Item WID
    9073             :     }
    9074             : }
    9075             : 
    9076           6 : void ScTableRowObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry,
    9077             :                                         uno::Any& rAny )
    9078             :                                                 throw(uno::RuntimeException)
    9079             : {
    9080           6 :     if ( pEntry )
    9081             :     {
    9082           6 :         ScDocShell* pDocSh = GetDocShell();
    9083           6 :         if (!pDocSh)
    9084           0 :             throw uno::RuntimeException();
    9085           6 :         ScDocument* pDoc = pDocSh->GetDocument();
    9086           6 :         const ScRange& rRange = GetRange();
    9087             :         OSL_ENSURE(rRange.aStart.Row() == rRange.aEnd.Row(), "zuviele Zeilen");
    9088           6 :         SCROW nRow = rRange.aStart.Row();
    9089           6 :         SCTAB nTab = rRange.aStart.Tab();
    9090             : 
    9091           6 :         if ( pEntry->nWID == SC_WID_UNO_CELLHGT )
    9092             :         {
    9093             :             // for hidden row, return original height
    9094           2 :             sal_uInt16 nHeight = pDoc->GetOriginalHeight( nRow, nTab );
    9095             :             //  property is 1/100mm, row height is twips
    9096           2 :             nHeight = (sal_uInt16) TwipsToHMM(nHeight);
    9097           2 :             rAny <<= (sal_Int32)( nHeight );
    9098             :         }
    9099           4 :         else if ( pEntry->nWID == SC_WID_UNO_CELLVIS )
    9100             :         {
    9101           0 :             bool bHidden = pDoc->RowHidden(nRow, nTab);
    9102           0 :             ScUnoHelpFunctions::SetBoolInAny( rAny, !bHidden );
    9103             :         }
    9104           4 :         else if ( pEntry->nWID == SC_WID_UNO_CELLFILT )
    9105             :         {
    9106           0 :             bool bVis = pDoc->RowFiltered(nRow, nTab);
    9107           0 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bVis );
    9108             :         }
    9109           4 :         else if ( pEntry->nWID == SC_WID_UNO_OHEIGHT )
    9110             :         {
    9111           2 :             sal_Bool bOpt = !(pDoc->GetRowFlags( nRow, nTab ) & CR_MANUALSIZE);
    9112           2 :             ScUnoHelpFunctions::SetBoolInAny( rAny, bOpt );
    9113             :         }
    9114           2 :         else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE )
    9115             :         {
    9116           0 :             ScBreakType nBreak = pDoc->HasRowBreak(nRow, nTab);
    9117           0 :             ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak );
    9118             :         }
    9119           2 :         else if ( pEntry->nWID == SC_WID_UNO_MANPAGE )
    9120             :         {
    9121           2 :             ScBreakType nBreak = (pDoc->HasRowBreak(nRow, nTab) & BREAK_MANUAL);
    9122           2 :             ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak );
    9123             :         }
    9124             :         else
    9125           0 :             ScCellRangeObj::GetOnePropertyValue(pEntry, rAny);
    9126             :     }
    9127           6 : }
    9128             : 
    9129           2 : const SfxItemPropertyMap& ScTableRowObj::GetItemPropertyMap()
    9130             : {
    9131           2 :     return pRowPropSet->getPropertyMap();
    9132             : }
    9133             : 
    9134             : //------------------------------------------------------------------------
    9135             : 
    9136           2 : ScCellsObj::ScCellsObj(ScDocShell* pDocSh, const ScRangeList& rR) :
    9137             :     pDocShell( pDocSh ),
    9138           2 :     aRanges( rR )
    9139             : {
    9140           2 :     pDocShell->GetDocument()->AddUnoObject(*this);
    9141           2 : }
    9142             : 
    9143           6 : ScCellsObj::~ScCellsObj()
    9144             : {
    9145           2 :     if (pDocShell)
    9146           2 :         pDocShell->GetDocument()->RemoveUnoObject(*this);
    9147           4 : }
    9148             : 
    9149           0 : void ScCellsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9150             : {
    9151           0 :     if ( rHint.ISA( ScUpdateRefHint ) )
    9152             :     {
    9153           0 :         const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
    9154           0 :         aRanges.UpdateReference( rRef.GetMode(), pDocShell->GetDocument(), rRef.GetRange(),
    9155           0 :                                         rRef.GetDx(), rRef.GetDy(), rRef.GetDz() );
    9156             :     }
    9157           0 :     else if ( rHint.ISA( SfxSimpleHint ) &&
    9158           0 :             ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
    9159             :     {
    9160           0 :         pDocShell = NULL;       // ungueltig geworden
    9161             :     }
    9162           0 : }
    9163             : 
    9164             : // XEnumerationAccess
    9165             : 
    9166           2 : uno::Reference<container::XEnumeration> SAL_CALL ScCellsObj::createEnumeration()
    9167             :                                                     throw(uno::RuntimeException)
    9168             : {
    9169           2 :     SolarMutexGuard aGuard;
    9170           2 :     if (pDocShell)
    9171           2 :         return new ScCellsEnumeration( pDocShell, aRanges );
    9172           0 :     return NULL;
    9173             : }
    9174             : 
    9175           0 : uno::Type SAL_CALL ScCellsObj::getElementType() throw(uno::RuntimeException)
    9176             : {
    9177           0 :     SolarMutexGuard aGuard;
    9178           0 :     return getCppuType((uno::Reference<table::XCell>*)0);
    9179             : }
    9180             : 
    9181           0 : sal_Bool SAL_CALL ScCellsObj::hasElements() throw(uno::RuntimeException)
    9182             : {
    9183           0 :     SolarMutexGuard aGuard;
    9184           0 :     sal_Bool bHas = false;
    9185           0 :     if ( pDocShell )
    9186             :     {
    9187             :         //! schneller selber testen?
    9188             : 
    9189           0 :         uno::Reference<container::XEnumeration> xEnum(new ScCellsEnumeration( pDocShell, aRanges ));
    9190           0 :         bHas = xEnum->hasMoreElements();
    9191             :     }
    9192           0 :     return bHas;
    9193             : }
    9194             : 
    9195             : //------------------------------------------------------------------------
    9196             : 
    9197           2 : ScCellsEnumeration::ScCellsEnumeration(ScDocShell* pDocSh, const ScRangeList& rR) :
    9198             :     pDocShell( pDocSh ),
    9199             :     aRanges( rR ),
    9200             :     pMark( NULL ),
    9201           2 :     bAtEnd( false )
    9202             : {
    9203           2 :     ScDocument* pDoc = pDocShell->GetDocument();
    9204           2 :     pDoc->AddUnoObject(*this);
    9205             : 
    9206           2 :     if ( aRanges.empty() )
    9207           2 :         bAtEnd = true;
    9208             :     else
    9209             :     {
    9210           0 :         SCTAB nTab = 0;
    9211           0 :         const ScRange* pFirst = aRanges[ 0 ];
    9212           0 :         if (pFirst)
    9213           0 :             nTab = pFirst->aStart.Tab();
    9214           0 :         aPos = ScAddress(0,0,nTab);
    9215           0 :         CheckPos_Impl();                    // aPos auf erste passende Zelle setzen
    9216             :     }
    9217           2 : }
    9218             : 
    9219           0 : void ScCellsEnumeration::CheckPos_Impl()
    9220             : {
    9221           0 :     if (pDocShell)
    9222             :     {
    9223           0 :         sal_Bool bFound = false;
    9224           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    9225           0 :         ScBaseCell* pCell = pDoc->GetCell(aPos);
    9226           0 :         if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE )
    9227             :         {
    9228           0 :             if (!pMark)
    9229             :             {
    9230           0 :                 pMark = new ScMarkData;
    9231           0 :                 pMark->MarkFromRangeList( aRanges, false );
    9232           0 :                 pMark->MarkToMulti();   // needed for GetNextMarkedCell
    9233             :             }
    9234           0 :             bFound = pMark->IsCellMarked( aPos.Col(), aPos.Row() );
    9235             :         }
    9236           0 :         if (!bFound)
    9237           0 :             Advance_Impl();
    9238             :     }
    9239           0 : }
    9240             : 
    9241           6 : ScCellsEnumeration::~ScCellsEnumeration()
    9242             : {
    9243           2 :     if (pDocShell)
    9244           2 :         pDocShell->GetDocument()->RemoveUnoObject(*this);
    9245           2 :     delete pMark;
    9246           4 : }
    9247             : 
    9248           0 : void ScCellsEnumeration::Advance_Impl()
    9249             : {
    9250             :     OSL_ENSURE(!bAtEnd,"zuviel Advance_Impl");
    9251           0 :     if (!pMark)
    9252             :     {
    9253           0 :         pMark = new ScMarkData;
    9254           0 :         pMark->MarkFromRangeList( aRanges, false );
    9255           0 :         pMark->MarkToMulti();   // needed for GetNextMarkedCell
    9256             :     }
    9257             : 
    9258           0 :     SCCOL nCol = aPos.Col();
    9259           0 :     SCROW nRow = aPos.Row();
    9260           0 :     SCTAB nTab = aPos.Tab();
    9261           0 :     sal_Bool bFound = pDocShell->GetDocument()->GetNextMarkedCell( nCol, nRow, nTab, *pMark );
    9262           0 :     if (bFound)
    9263           0 :         aPos.Set( nCol, nRow, nTab );
    9264             :     else
    9265           0 :         bAtEnd = sal_True;      // kommt nix mehr
    9266           0 : }
    9267             : 
    9268           0 : void ScCellsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9269             : {
    9270           0 :     if ( rHint.ISA( ScUpdateRefHint ) )
    9271             :     {
    9272           0 :         if (pDocShell)
    9273             :         {
    9274           0 :             const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint;
    9275           0 :             aRanges.UpdateReference( rRef.GetMode(), pDocShell->GetDocument(), rRef.GetRange(),
    9276           0 :                                             rRef.GetDx(), rRef.GetDy(), rRef.GetDz() );
    9277             : 
    9278           0 :             delete pMark;       // aus verschobenen Bereichen neu erzeugen
    9279           0 :             pMark = NULL;
    9280             : 
    9281           0 :             if (!bAtEnd)        // aPos anpassen
    9282             :             {
    9283           0 :                 ScRangeList aNew;
    9284           0 :                 aNew.Append(ScRange(aPos));
    9285           0 :                 aNew.UpdateReference( rRef.GetMode(), pDocShell->GetDocument(), rRef.GetRange(),
    9286           0 :                                         rRef.GetDx(), rRef.GetDy(), rRef.GetDz() );
    9287           0 :                 if (aNew.size()==1)
    9288             :                 {
    9289           0 :                     aPos = aNew[ 0 ]->aStart;
    9290           0 :                     CheckPos_Impl();
    9291           0 :                 }
    9292             :             }
    9293             :         }
    9294             :     }
    9295           0 :     else if ( rHint.ISA( SfxSimpleHint ) &&
    9296           0 :             ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
    9297             :     {
    9298           0 :         pDocShell = NULL;       // ungueltig geworden
    9299             :     }
    9300           0 : }
    9301             : 
    9302             : // XEnumeration
    9303             : 
    9304           2 : sal_Bool SAL_CALL ScCellsEnumeration::hasMoreElements() throw(uno::RuntimeException)
    9305             : {
    9306           2 :     SolarMutexGuard aGuard;
    9307           2 :     return !bAtEnd;
    9308             : }
    9309             : 
    9310           0 : uno::Any SAL_CALL ScCellsEnumeration::nextElement() throw(container::NoSuchElementException,
    9311             :                                         lang::WrappedTargetException, uno::RuntimeException)
    9312             : {
    9313           0 :     SolarMutexGuard aGuard;
    9314           0 :     if (pDocShell && !bAtEnd)
    9315             :     {
    9316             :         // Interface-Typ muss zu ScCellsObj::getElementType passen
    9317             : 
    9318           0 :         ScAddress aTempPos(aPos);
    9319           0 :         Advance_Impl();
    9320           0 :         return uno::makeAny(uno::Reference<table::XCell>(new ScCellObj( pDocShell, aTempPos )));
    9321             :     }
    9322             : 
    9323           0 :     throw container::NoSuchElementException();      // no more elements
    9324             : }
    9325             : 
    9326             : //------------------------------------------------------------------------
    9327             : 
    9328           0 : ScCellFormatsObj::ScCellFormatsObj(ScDocShell* pDocSh, const ScRange& rRange) :
    9329             :     pDocShell( pDocSh ),
    9330           0 :     aTotalRange( rRange )
    9331             : {
    9332           0 :     ScDocument* pDoc = pDocShell->GetDocument();
    9333           0 :     pDoc->AddUnoObject(*this);
    9334             : 
    9335             :     OSL_ENSURE( aTotalRange.aStart.Tab() == aTotalRange.aEnd.Tab(), "unterschiedliche Tabellen" );
    9336           0 : }
    9337             : 
    9338           0 : ScCellFormatsObj::~ScCellFormatsObj()
    9339             : {
    9340           0 :     if (pDocShell)
    9341           0 :         pDocShell->GetDocument()->RemoveUnoObject(*this);
    9342           0 : }
    9343             : 
    9344           0 : void ScCellFormatsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9345             : {
    9346           0 :     if ( rHint.ISA( ScUpdateRefHint ) )
    9347             :     {
    9348             :         //! aTotalRange...
    9349             :     }
    9350           0 :     else if ( rHint.ISA( SfxSimpleHint ) &&
    9351           0 :             ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING )
    9352             :     {
    9353           0 :         pDocShell = NULL;       // ungueltig geworden
    9354             :     }
    9355           0 : }
    9356             : 
    9357           0 : ScCellRangeObj* ScCellFormatsObj::GetObjectByIndex_Impl(long nIndex) const
    9358             : {
    9359             :     //! direkt auf die AttrArrays zugreifen !!!!
    9360             : 
    9361           0 :     ScCellRangeObj* pRet = NULL;
    9362           0 :     if (pDocShell)
    9363             :     {
    9364           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    9365           0 :         long nPos = 0;
    9366           0 :         ScAttrRectIterator aIter( pDoc, aTotalRange.aStart.Tab(),
    9367           0 :                                     aTotalRange.aStart.Col(), aTotalRange.aStart.Row(),
    9368           0 :                                     aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() );
    9369             :         SCCOL nCol1, nCol2;
    9370             :         SCROW nRow1, nRow2;
    9371           0 :         while ( aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) )
    9372             :         {
    9373           0 :             if ( nPos == nIndex )
    9374             :             {
    9375           0 :                 SCTAB nTab = aTotalRange.aStart.Tab();
    9376           0 :                 ScRange aNext( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
    9377             : 
    9378           0 :                 if ( aNext.aStart == aNext.aEnd )
    9379           0 :                     pRet = new ScCellObj( pDocShell, aNext.aStart );
    9380             :                 else
    9381           0 :                     pRet = new ScCellRangeObj( pDocShell, aNext );
    9382             :             }
    9383           0 :             ++nPos;
    9384           0 :         }
    9385             :     }
    9386           0 :     return pRet;
    9387             : }
    9388             : 
    9389             : // XIndexAccess
    9390             : 
    9391           0 : sal_Int32 SAL_CALL ScCellFormatsObj::getCount() throw(uno::RuntimeException)
    9392             : {
    9393           0 :     SolarMutexGuard aGuard;
    9394             : 
    9395             :     //! direkt auf die AttrArrays zugreifen !!!!
    9396             : 
    9397           0 :     long nCount = 0;
    9398           0 :     if (pDocShell)
    9399             :     {
    9400           0 :         ScDocument* pDoc = pDocShell->GetDocument();
    9401           0 :         ScAttrRectIterator aIter( pDoc, aTotalRange.aStart.Tab(),
    9402           0 :                                     aTotalRange.aStart.Col(), aTotalRange.aStart.Row(),
    9403           0 :                                     aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() );
    9404             :         SCCOL nCol1, nCol2;
    9405             :         SCROW nRow1, nRow2;
    9406           0 :         while ( aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) )
    9407           0 :             ++nCount;
    9408             :     }
    9409           0 :     return nCount;
    9410             : }
    9411             : 
    9412           0 : uno::Any SAL_CALL ScCellFormatsObj::getByIndex( sal_Int32 nIndex )
    9413             :                             throw(lang::IndexOutOfBoundsException,
    9414             :                                     lang::WrappedTargetException, uno::RuntimeException)
    9415             : {
    9416           0 :     SolarMutexGuard aGuard;
    9417             : 
    9418           0 :     uno::Reference<table::XCellRange> xRange(GetObjectByIndex_Impl(nIndex));
    9419           0 :     if (xRange.is())
    9420           0 :         return uno::makeAny(xRange);
    9421             :     else
    9422           0 :         throw lang::IndexOutOfBoundsException();
    9423             : }
    9424             : 
    9425           0 : uno::Type SAL_CALL ScCellFormatsObj::getElementType() throw(uno::RuntimeException)
    9426             : {
    9427           0 :     SolarMutexGuard aGuard;
    9428           0 :     return getCppuType((uno::Reference<table::XCellRange>*)0);
    9429             : }
    9430             : 
    9431           0 : sal_Bool SAL_CALL ScCellFormatsObj::hasElements() throw(uno::RuntimeException)
    9432             : {
    9433           0 :     SolarMutexGuard aGuard;
    9434           0 :     return ( getCount() != 0 );     //! immer groesser 0 ??
    9435             : }
    9436             : 
    9437             : // XEnumerationAccess
    9438             : 
    9439           0 : uno::Reference<container::XEnumeration> SAL_CALL ScCellFormatsObj::createEnumeration()
    9440             :                                                     throw(uno::RuntimeException)
    9441             : {
    9442           0 :     SolarMutexGuard aGuard;
    9443           0 :     if (pDocShell)
    9444           0 :         return new ScCellFormatsEnumeration( pDocShell, aTotalRange );
    9445           0 :     return NULL;
    9446             : }
    9447             : 
    9448             : //------------------------------------------------------------------------
    9449             : 
    9450           0 : ScCellFormatsEnumeration::ScCellFormatsEnumeration(ScDocShell* pDocSh, const ScRange& rRange) :
    9451             :     pDocShell( pDocSh ),
    9452           0 :     nTab( rRange.aStart.Tab() ),
    9453             :     pIter( NULL ),
    9454             :     bAtEnd( false ),
    9455           0 :     bDirty( false )
    9456             : {
    9457           0 :     ScDocument* pDoc = pDocShell->GetDocument();
    9458           0 :     pDoc->AddUnoObject(*this);
    9459             : 
    9460             :     OSL_ENSURE( rRange.aStart.Tab() == rRange.aEnd.Tab(),
    9461             :                 "CellFormatsEnumeration: unterschiedliche Tabellen" );
    9462             : 
    9463             :     pIter = new ScAttrRectIterator( pDoc, nTab,
    9464           0 :                                     rRange.aStart.Col(), rRange.aStart.Row(),
    9465           0 :                                     rRange.aEnd.Col(), rRange.aEnd.Row() );
    9466           0 :     Advance_Impl();
    9467           0 : }
    9468             : 
    9469           0 : ScCellFormatsEnumeration::~ScCellFormatsEnumeration()
    9470             : {
    9471           0 :     if (pDocShell)
    9472           0 :         pDocShell->GetDocument()->RemoveUnoObject(*this);
    9473           0 :     delete pIter;
    9474           0 : }
    9475             : 
    9476           0 : void ScCellFormatsEnumeration::Advance_Impl()
    9477             : {
    9478             :     OSL_ENSURE(!bAtEnd,"zuviel Advance_Impl");
    9479             : 
    9480           0 :     if ( pIter )
    9481             :     {
    9482           0 :         if ( bDirty )
    9483             :         {
    9484           0 :             pIter->DataChanged();   // AttrArray-Index neu suchen
    9485           0 :             bDirty = false;
    9486             :         }
    9487             : 
    9488             :         SCCOL nCol1, nCol2;
    9489             :         SCROW nRow1, nRow2;
    9490           0 :         if ( pIter->GetNext( nCol1, nCol2, nRow1, nRow2 ) )
    9491           0 :             aNext = ScRange( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
    9492             :         else
    9493           0 :             bAtEnd = sal_True;      // kommt nix mehr
    9494             :     }
    9495             :     else
    9496           0 :         bAtEnd = sal_True;          // Dok weggekommen oder so
    9497           0 : }
    9498             : 
    9499           0 : ScCellRangeObj* ScCellFormatsEnumeration::NextObject_Impl()
    9500             : {
    9501           0 :     ScCellRangeObj* pRet = NULL;
    9502           0 :     if (pDocShell && !bAtEnd)
    9503             :     {
    9504           0 :         if ( aNext.aStart == aNext.aEnd )
    9505           0 :             pRet = new ScCellObj( pDocShell, aNext.aStart );
    9506             :         else
    9507           0 :             pRet = new ScCellRangeObj( pDocShell, aNext );
    9508           0 :         Advance_Impl();
    9509             :     }
    9510           0 :     return pRet;
    9511             : }
    9512             : 
    9513           0 : void ScCellFormatsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9514             : {
    9515           0 :     if ( rHint.ISA( ScUpdateRefHint ) )
    9516             :     {
    9517             :         //! und nun ???
    9518             :     }
    9519           0 :     else if ( rHint.ISA( SfxSimpleHint ) )
    9520             :     {
    9521           0 :         sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
    9522           0 :         if ( nId == SFX_HINT_DYING )
    9523             :         {
    9524           0 :             pDocShell = NULL;                       // ungueltig geworden
    9525           0 :             delete pIter;
    9526           0 :             pIter = NULL;
    9527             :         }
    9528           0 :         else if ( nId == SFX_HINT_DATACHANGED )
    9529             :         {
    9530           0 :             bDirty = sal_True;          // AttrArray-Index evtl. ungueltig geworden
    9531             :         }
    9532             :     }
    9533           0 : }
    9534             : 
    9535             : // XEnumeration
    9536             : 
    9537           0 : sal_Bool SAL_CALL ScCellFormatsEnumeration::hasMoreElements() throw(uno::RuntimeException)
    9538             : {
    9539           0 :     SolarMutexGuard aGuard;
    9540           0 :     return !bAtEnd;
    9541             : }
    9542             : 
    9543           0 : uno::Any SAL_CALL ScCellFormatsEnumeration::nextElement() throw(container::NoSuchElementException,
    9544             :                                         lang::WrappedTargetException, uno::RuntimeException)
    9545             : {
    9546           0 :     SolarMutexGuard aGuard;
    9547             : 
    9548           0 :     if ( bAtEnd || !pDocShell )
    9549           0 :         throw container::NoSuchElementException();      // no more elements
    9550             : 
    9551             :     // Interface-Typ muss zu ScCellFormatsObj::getElementType passen
    9552             : 
    9553           0 :     return uno::makeAny(uno::Reference<table::XCellRange> (NextObject_Impl()));
    9554             : }
    9555             : 
    9556             : //------------------------------------------------------------------------
    9557             : 
    9558           2 : ScUniqueCellFormatsObj::ScUniqueCellFormatsObj(ScDocShell* pDocSh, const ScRange& rRange) :
    9559             :     pDocShell( pDocSh ),
    9560             :     aTotalRange( rRange ),
    9561           2 :     aRangeLists()
    9562             : {
    9563           2 :     pDocShell->GetDocument()->AddUnoObject(*this);
    9564             : 
    9565             :     OSL_ENSURE( aTotalRange.aStart.Tab() == aTotalRange.aEnd.Tab(), "unterschiedliche Tabellen" );
    9566             : 
    9567           2 :     GetObjects_Impl();
    9568           2 : }
    9569             : 
    9570           6 : ScUniqueCellFormatsObj::~ScUniqueCellFormatsObj()
    9571             : {
    9572           2 :     if (pDocShell)
    9573           2 :         pDocShell->GetDocument()->RemoveUnoObject(*this);
    9574           4 : }
    9575             : 
    9576           0 : void ScUniqueCellFormatsObj::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9577             : {
    9578           0 :     if ( rHint.ISA( ScUpdateRefHint ) )
    9579             :     {
    9580             :         //! aTotalRange...
    9581             :     }
    9582           0 :     else if ( rHint.ISA( SfxSimpleHint ) )
    9583             :     {
    9584           0 :         sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
    9585           0 :         if ( nId == SFX_HINT_DYING )
    9586           0 :             pDocShell = NULL;                       // ungueltig geworden
    9587             :     }
    9588           0 : }
    9589             : 
    9590             : //
    9591             : //  Fill the list of formats from the document
    9592             : //
    9593             : 
    9594             : // hash code to access the range lists by ScPatternAttr pointer
    9595             : struct ScPatternHashCode
    9596             : {
    9597           2 :     size_t operator()( const ScPatternAttr* pPattern ) const
    9598             :     {
    9599           2 :         return reinterpret_cast<size_t>(pPattern);
    9600             :     }
    9601             : };
    9602             : 
    9603             : // Hash map to find a range by its start row
    9604             : typedef ::boost::unordered_map< SCROW, ScRange > ScRowRangeHashMap;
    9605             : 
    9606             : typedef ::std::vector<ScRange> ScRangeVector;
    9607             : 
    9608             : // Hash map entry.
    9609             : // The Join method depends on the column-wise order of ScAttrRectIterator
    9610             : class ScUniqueFormatsEntry
    9611             : {
    9612             :     enum EntryState { STATE_EMPTY, STATE_SINGLE, STATE_COMPLEX };
    9613             : 
    9614             :     EntryState          eState;
    9615             :     ScRange             aSingleRange;
    9616             :     ScRowRangeHashMap   aJoinedRanges;      // "active" ranges to be merged
    9617             :     ScRangeVector       aCompletedRanges;   // ranges that will no longer be touched
    9618             :     ScRangeListRef      aReturnRanges;      // result as ScRangeList for further use
    9619             : 
    9620             : public:
    9621           2 :                         ScUniqueFormatsEntry() : eState( STATE_EMPTY ) {}
    9622             :                         ScUniqueFormatsEntry( const ScUniqueFormatsEntry& r ) :
    9623             :                             eState( r.eState ),
    9624             :                             aSingleRange( r.aSingleRange ),
    9625             :                             aJoinedRanges( r.aJoinedRanges ),
    9626             :                             aCompletedRanges( r.aCompletedRanges ),
    9627             :                             aReturnRanges( r.aReturnRanges ) {}
    9628           2 :                         ~ScUniqueFormatsEntry() {}
    9629             : 
    9630             :     void                Join( const ScRange& rNewRange );
    9631             :     const ScRangeList&  GetRanges();
    9632           2 :     void                Clear() { aReturnRanges.Clear(); }  // aJoinedRanges and aCompletedRanges are cleared in GetRanges
    9633             : };
    9634             : 
    9635           2 : void ScUniqueFormatsEntry::Join( const ScRange& rNewRange )
    9636             : {
    9637             :     // Special-case handling for single range
    9638             : 
    9639           2 :     if ( eState == STATE_EMPTY )
    9640             :     {
    9641           2 :         aSingleRange = rNewRange;
    9642           2 :         eState = STATE_SINGLE;
    9643             :         return;
    9644             :     }
    9645           0 :     if ( eState == STATE_SINGLE )
    9646             :     {
    9647           0 :         if ( aSingleRange.aStart.Row() == rNewRange.aStart.Row() &&
    9648           0 :              aSingleRange.aEnd.Row() == rNewRange.aEnd.Row() &&
    9649           0 :              aSingleRange.aEnd.Col() + 1 == rNewRange.aStart.Col() )
    9650             :         {
    9651           0 :             aSingleRange.aEnd.SetCol( rNewRange.aEnd.Col() );
    9652             :             return;     // still a single range
    9653             :         }
    9654             : 
    9655           0 :         SCROW nSingleRow = aSingleRange.aStart.Row();
    9656           0 :         aJoinedRanges.insert( ScRowRangeHashMap::value_type( nSingleRow, aSingleRange ) );
    9657           0 :         eState = STATE_COMPLEX;
    9658             :         // continue normally
    9659             :     }
    9660             : 
    9661             :     // This is called in the order of ScAttrRectIterator results.
    9662             :     // rNewRange can only be joined with an existing entry if it's the same rows, starting in the next column.
    9663             :     // If the old entry for the start row extends to a different end row, or ends in a different column, it
    9664             :     // can be moved to aCompletedRanges because it can't be joined with following iterator results.
    9665             :     // Everything happens within one sheet, so Tab can be ignored.
    9666             : 
    9667           0 :     SCROW nStartRow = rNewRange.aStart.Row();
    9668           0 :     ScRowRangeHashMap::iterator aIter( aJoinedRanges.find( nStartRow ) );       // find the active entry for the start row
    9669           0 :     if ( aIter != aJoinedRanges.end() )
    9670             :     {
    9671           0 :         ScRange& rOldRange = aIter->second;
    9672           0 :         if ( rOldRange.aEnd.Row() == rNewRange.aEnd.Row() &&
    9673           0 :              rOldRange.aEnd.Col() + 1 == rNewRange.aStart.Col() )
    9674             :         {
    9675             :             // extend existing range
    9676           0 :             rOldRange.aEnd.SetCol( rNewRange.aEnd.Col() );
    9677             :         }
    9678             :         else
    9679             :         {
    9680             :             // move old range to aCompletedRanges, keep rNewRange for joining
    9681           0 :             aCompletedRanges.push_back( rOldRange );
    9682           0 :             rOldRange = rNewRange;  // replace in hash map
    9683             :         }
    9684             :     }
    9685             :     else
    9686             :     {
    9687             :         // keep rNewRange for joining
    9688           0 :         aJoinedRanges.insert( ScRowRangeHashMap::value_type( nStartRow, rNewRange ) );
    9689             :     }
    9690             : }
    9691             : 
    9692           2 : const ScRangeList& ScUniqueFormatsEntry::GetRanges()
    9693             : {
    9694           2 :     if ( eState == STATE_SINGLE )
    9695             :     {
    9696           2 :         aReturnRanges = new ScRangeList;
    9697           2 :         aReturnRanges->Append( aSingleRange );
    9698           2 :         return *aReturnRanges;
    9699             :     }
    9700             : 
    9701             :     // move remaining entries from aJoinedRanges to aCompletedRanges
    9702             : 
    9703           0 :     ScRowRangeHashMap::const_iterator aJoinedEnd = aJoinedRanges.end();
    9704           0 :     for ( ScRowRangeHashMap::const_iterator aJoinedIter = aJoinedRanges.begin(); aJoinedIter != aJoinedEnd; ++aJoinedIter )
    9705           0 :         aCompletedRanges.push_back( aJoinedIter->second );
    9706           0 :     aJoinedRanges.clear();
    9707             : 
    9708             :     // sort all ranges for a predictable API result
    9709             : 
    9710           0 :     std::sort( aCompletedRanges.begin(), aCompletedRanges.end() );
    9711             : 
    9712             :     // fill and return ScRangeList
    9713             : 
    9714           0 :     aReturnRanges = new ScRangeList;
    9715           0 :     ScRangeVector::const_iterator aCompEnd( aCompletedRanges.end() );
    9716           0 :     for ( ScRangeVector::const_iterator aCompIter( aCompletedRanges.begin() ); aCompIter != aCompEnd; ++aCompIter )
    9717           0 :         aReturnRanges->Append( *aCompIter );
    9718           0 :     aCompletedRanges.clear();
    9719             : 
    9720           0 :     return *aReturnRanges;
    9721             : }
    9722             : 
    9723             : typedef ::boost::unordered_map< const ScPatternAttr*, ScUniqueFormatsEntry, ScPatternHashCode > ScUniqueFormatsHashMap;
    9724             : 
    9725             : // function object to sort the range lists by start of first range
    9726             : struct ScUniqueFormatsOrder
    9727             : {
    9728           0 :     bool operator()( const ScRangeList& rList1, const ScRangeList& rList2 ) const
    9729             :     {
    9730             :         // all range lists have at least one entry
    9731             :         OSL_ENSURE( rList1.size() > 0 && rList2.size() > 0, "ScUniqueFormatsOrder: empty list" );
    9732             : 
    9733             :         // compare start positions using ScAddress comparison operator
    9734           0 :         return ( rList1[ 0 ]->aStart < rList2[ 0 ]->aStart );
    9735             :     }
    9736             : };
    9737             : 
    9738           2 : void ScUniqueCellFormatsObj::GetObjects_Impl()
    9739             : {
    9740           2 :     if (pDocShell)
    9741             :     {
    9742           2 :         ScDocument* pDoc = pDocShell->GetDocument();
    9743           2 :         SCTAB nTab = aTotalRange.aStart.Tab();
    9744             :         ScAttrRectIterator aIter( pDoc, nTab,
    9745           2 :                                     aTotalRange.aStart.Col(), aTotalRange.aStart.Row(),
    9746           4 :                                     aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() );
    9747             :         SCCOL nCol1, nCol2;
    9748             :         SCROW nRow1, nRow2;
    9749             : 
    9750             :         // Collect the ranges for each format in a hash map, to avoid nested loops
    9751             : 
    9752           2 :         ScUniqueFormatsHashMap aHashMap;
    9753           6 :         while (aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) )
    9754             :         {
    9755           2 :             ScRange aRange( nCol1, nRow1, nTab, nCol2, nRow2, nTab );
    9756           2 :             const ScPatternAttr* pPattern = pDoc->GetPattern(nCol1, nRow1, nTab);
    9757           2 :             aHashMap[pPattern].Join( aRange );
    9758             :         }
    9759             : 
    9760             :         // Fill the vector aRangeLists with the range lists from the hash map
    9761             : 
    9762           2 :         aRangeLists.reserve( aHashMap.size() );
    9763           2 :         ScUniqueFormatsHashMap::iterator aMapIter( aHashMap.begin() );
    9764           2 :         ScUniqueFormatsHashMap::iterator aMapEnd( aHashMap.end() );
    9765           6 :         while ( aMapIter != aMapEnd )
    9766             :         {
    9767           2 :             ScUniqueFormatsEntry& rEntry = aMapIter->second;
    9768           2 :             const ScRangeList& rRanges = rEntry.GetRanges();
    9769           2 :             aRangeLists.push_back( rRanges );       // copy ScRangeList
    9770           2 :             rEntry.Clear();                         // free memory, don't hold both copies of all ranges
    9771           2 :             ++aMapIter;
    9772             :         }
    9773             : 
    9774             :         // Sort the vector by first range's start position, to avoid random shuffling
    9775             :         // due to using the ScPatterAttr pointers
    9776             : 
    9777             :         ScUniqueFormatsOrder aComp;
    9778           2 :         ::std::sort( aRangeLists.begin(), aRangeLists.end(), aComp );
    9779             :     }
    9780           2 : }
    9781             : 
    9782             : // XIndexAccess
    9783             : 
    9784           2 : sal_Int32 SAL_CALL ScUniqueCellFormatsObj::getCount() throw(uno::RuntimeException)
    9785             : {
    9786           2 :     SolarMutexGuard aGuard;
    9787             : 
    9788           2 :     return aRangeLists.size();
    9789             : }
    9790             : 
    9791           2 : uno::Any SAL_CALL ScUniqueCellFormatsObj::getByIndex( sal_Int32 nIndex )
    9792             :                             throw(lang::IndexOutOfBoundsException,
    9793             :                                     lang::WrappedTargetException, uno::RuntimeException)
    9794             : {
    9795           2 :     SolarMutexGuard aGuard;
    9796             : 
    9797           2 :     if(static_cast<sal_uInt32>(nIndex) < aRangeLists.size())
    9798           4 :         return uno::makeAny(uno::Reference<sheet::XSheetCellRangeContainer>(new ScCellRangesObj(pDocShell, aRangeLists[nIndex])));
    9799             :     else
    9800           2 :         throw lang::IndexOutOfBoundsException();
    9801             : }
    9802             : 
    9803           0 : uno::Type SAL_CALL ScUniqueCellFormatsObj::getElementType() throw(uno::RuntimeException)
    9804             : {
    9805           0 :     SolarMutexGuard aGuard;
    9806           0 :     return getCppuType((uno::Reference<sheet::XSheetCellRangeContainer>*)0);
    9807             : }
    9808             : 
    9809           0 : sal_Bool SAL_CALL ScUniqueCellFormatsObj::hasElements() throw(uno::RuntimeException)
    9810             : {
    9811           0 :     SolarMutexGuard aGuard;
    9812           0 :     return ( aRangeLists.size() != 0 );
    9813             : }
    9814             : 
    9815             : // XEnumerationAccess
    9816             : 
    9817           0 : uno::Reference<container::XEnumeration> SAL_CALL ScUniqueCellFormatsObj::createEnumeration()
    9818             :                                                     throw(uno::RuntimeException)
    9819             : {
    9820           0 :     SolarMutexGuard aGuard;
    9821           0 :     if (pDocShell)
    9822           0 :         return new ScUniqueCellFormatsEnumeration( pDocShell, aRangeLists );
    9823           0 :     return NULL;
    9824             : }
    9825             : 
    9826             : //------------------------------------------------------------------------
    9827             : 
    9828           0 : ScUniqueCellFormatsEnumeration::ScUniqueCellFormatsEnumeration(ScDocShell* pDocSh, const ScMyRangeLists& rRangeLists) :
    9829             :     aRangeLists(rRangeLists),
    9830             :     pDocShell( pDocSh ),
    9831           0 :     nCurrentPosition(0)
    9832             : {
    9833           0 :     pDocShell->GetDocument()->AddUnoObject(*this);
    9834           0 : }
    9835             : 
    9836           0 : ScUniqueCellFormatsEnumeration::~ScUniqueCellFormatsEnumeration()
    9837             : {
    9838           0 :     if (pDocShell)
    9839           0 :         pDocShell->GetDocument()->RemoveUnoObject(*this);
    9840           0 : }
    9841             : 
    9842           0 : void ScUniqueCellFormatsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint )
    9843             : {
    9844           0 :     if ( rHint.ISA( ScUpdateRefHint ) )
    9845             :     {
    9846             :         //! und nun ???
    9847             :     }
    9848           0 :     else if ( rHint.ISA( SfxSimpleHint ) )
    9849             :     {
    9850           0 :         sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId();
    9851           0 :         if ( nId == SFX_HINT_DYING )
    9852           0 :             pDocShell = NULL;                       // ungueltig geworden
    9853             :     }
    9854           0 : }
    9855             : 
    9856             : // XEnumeration
    9857             : 
    9858           0 : sal_Bool SAL_CALL ScUniqueCellFormatsEnumeration::hasMoreElements() throw(uno::RuntimeException)
    9859             : {
    9860           0 :     SolarMutexGuard aGuard;
    9861           0 :     return static_cast<sal_uInt32>(nCurrentPosition) < aRangeLists.size();
    9862             : }
    9863             : 
    9864           0 : uno::Any SAL_CALL ScUniqueCellFormatsEnumeration::nextElement() throw(container::NoSuchElementException,
    9865             :                                         lang::WrappedTargetException, uno::RuntimeException)
    9866             : {
    9867           0 :     SolarMutexGuard aGuard;
    9868             : 
    9869           0 :     if ( !hasMoreElements() || !pDocShell )
    9870           0 :         throw container::NoSuchElementException();      // no more elements
    9871             : 
    9872             :     // Interface-Typ muss zu ScCellFormatsObj::getElementType passen
    9873             : 
    9874           0 :     return uno::makeAny(uno::Reference<sheet::XSheetCellRangeContainer>(new ScCellRangesObj(pDocShell, aRangeLists[nCurrentPosition++])));
    9875          15 : }
    9876             : 
    9877             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10