diff options
author | Michael Stahl <mstahl@redhat.com> | 2012-01-28 20:52:27 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2012-01-28 20:52:27 +0100 |
commit | f457a7fdbb4400f34844af0492dc32d2f3623c95 (patch) | |
tree | 9e9f67205cd5b72f1031721273e1534a3a1e5b0f /sc/source/ui/unoobj | |
parent | 2601b25912a2ed05ed8d009bca40aa8b479f39d8 (diff) |
replace obsolete "master" branch with README that points at new repoHEADmaster-deletedmaster
Diffstat (limited to 'sc/source/ui/unoobj')
48 files changed, 0 insertions, 48551 deletions
diff --git a/sc/source/ui/unoobj/ChartRangeSelectionListener.cxx b/sc/source/ui/unoobj/ChartRangeSelectionListener.cxx deleted file mode 100644 index e7d4e6a18..000000000 --- a/sc/source/ui/unoobj/ChartRangeSelectionListener.cxx +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "ChartRangeSelectionListener.hxx" - -#include <com/sun/star/chart2/data/XRangeHighlighter.hpp> - -#include <sfx2/viewfrm.hxx> -#include "tabvwsh.hxx" -#include "unonames.hxx" -#include "miscuno.hxx" - -using namespace ::com::sun::star; - -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::rtl::OUString; - -SC_SIMPLE_SERVICE_INFO( ScChartRangeSelectionListener, "ScChartRangeSelectionListener", - SC_SERVICENAME_CHRANGEHILIGHT ) - -ScChartRangeSelectionListener::ScChartRangeSelectionListener( ScTabViewShell * pViewShell ) : - ScChartRangeSelectionListener_Base( m_aMutex ), - m_pViewShell( pViewShell ) -{} - -ScChartRangeSelectionListener::~ScChartRangeSelectionListener() -{} - -// ____ XModifyListener ____ -void SAL_CALL ScChartRangeSelectionListener::selectionChanged( const lang::EventObject& aEvent ) - throw (uno::RuntimeException) -{ - Reference< chart2::data::XRangeHighlighter > xRangeHighlighter( aEvent.Source, uno::UNO_QUERY ); - if( xRangeHighlighter.is()) - { - Sequence< chart2::data::HighlightedRange > aRanges( xRangeHighlighter->getSelectedRanges()); - - // search the view on which the chart is active - - if( m_pViewShell ) - { - m_pViewShell->DoChartSelection( aRanges ); - } - } -} - -// ____ XEventListener ____ -void SAL_CALL ScChartRangeSelectionListener::disposing( const lang::EventObject& /*Source*/ ) - throw (uno::RuntimeException) -{ -} - -// ____ WeakComponentImplHelperBase ____ -void SAL_CALL ScChartRangeSelectionListener::disposing() -{ - m_pViewShell = 0; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/addruno.cxx b/sc/source/ui/unoobj/addruno.cxx deleted file mode 100644 index 029be6720..000000000 --- a/sc/source/ui/unoobj/addruno.cxx +++ /dev/null @@ -1,330 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <com/sun/star/table/CellAddress.hpp> -#include <com/sun/star/table/CellRangeAddress.hpp> - -#include <svl/itemprop.hxx> -#include <vcl/svapp.hxx> - -#include "docsh.hxx" -#include "unonames.hxx" -#include "miscuno.hxx" -#include "convuno.hxx" -#include "addruno.hxx" - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -ScAddressConversionObj::ScAddressConversionObj(ScDocShell* pDocSh, sal_Bool bForRange) : - pDocShell( pDocSh ), - nRefSheet( 0 ), - bIsRange( bForRange ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScAddressConversionObj::~ScAddressConversionObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScAddressConversionObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // invalid - } -} - -sal_Bool ScAddressConversionObj::ParseUIString( const String& rUIString, ::formula::FormulaGrammar::AddressConvention eConv ) -{ - if (!pDocShell) - return false; - - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Bool bSuccess = false; - if ( bIsRange ) - { - sal_uInt16 nResult = aRange.ParseAny( rUIString, pDoc, eConv ); - if ( nResult & SCA_VALID ) - { - if ( ( nResult & SCA_TAB_3D ) == 0 ) - aRange.aStart.SetTab( static_cast<SCTAB>(nRefSheet) ); - if ( ( nResult & SCA_TAB2_3D ) == 0 ) - aRange.aEnd.SetTab( aRange.aStart.Tab() ); - // different sheets are not supported in CellRangeAddress - if ( aRange.aStart.Tab() == aRange.aEnd.Tab() ) - bSuccess = sal_True; - } - } - else - { - sal_uInt16 nResult = aRange.aStart.Parse( rUIString, pDoc, eConv ); - if ( nResult & SCA_VALID ) - { - if ( ( nResult & SCA_TAB_3D ) == 0 ) - aRange.aStart.SetTab( static_cast<SCTAB>(nRefSheet) ); - bSuccess = sal_True; - } - } - return bSuccess; -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScAddressConversionObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( bIsRange ) - { - static SfxItemPropertyMapEntry aPropertyMap[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ADDRESS), 0, &getCppuType((table::CellRangeAddress*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PERSREPR), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_XLA1REPR), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_REFSHEET), 0, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_UIREPR), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_XLA1REPR), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - static uno::Reference<beans::XPropertySetInfo> aRef(new SfxItemPropertySetInfo( aPropertyMap )); - return aRef; - } - else - { - static SfxItemPropertyMapEntry aPropertyMap[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ADDRESS), 0, &getCppuType((table::CellAddress*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PERSREPR), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_XLA1REPR), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_REFSHEET), 0, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_UIREPR), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_XLA1REPR), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - static uno::Reference<beans::XPropertySetInfo> aRef(new SfxItemPropertySetInfo( aPropertyMap )); - return aRef; - } -} - -void SAL_CALL ScAddressConversionObj::setPropertyValue( const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - if ( !pDocShell ) - throw uno::RuntimeException(); - - sal_Bool bSuccess = false; - String aNameStr(aPropertyName); - if ( aNameStr.EqualsAscii( SC_UNONAME_ADDRESS ) ) - { - // read the cell/range address from API struct - if ( bIsRange ) - { - table::CellRangeAddress aRangeAddress; - if ( aValue >>= aRangeAddress ) - { - ScUnoConversion::FillScRange( aRange, aRangeAddress ); - bSuccess = sal_True; - } - } - else - { - table::CellAddress aCellAddress; - if ( aValue >>= aCellAddress ) - { - ScUnoConversion::FillScAddress( aRange.aStart, aCellAddress ); - bSuccess = sal_True; - } - } - } - else if ( aNameStr.EqualsAscii( SC_UNONAME_REFSHEET ) ) - { - // set the reference sheet - sal_Int32 nIntVal = 0; - if ( aValue >>= nIntVal ) - { - nRefSheet = nIntVal; - bSuccess = sal_True; - } - } - else if ( aNameStr.EqualsAscii( SC_UNONAME_UIREPR ) ) - { - // parse the UI representation string - rtl::OUString sRepresentation; - if (aValue >>= sRepresentation) - { - String aUIString = sRepresentation; - bSuccess = ParseUIString( aUIString ); - } - } - else if ( aNameStr.EqualsAscii( SC_UNONAME_PERSREPR ) || aNameStr.EqualsAscii( SC_UNONAME_XLA1REPR ) ) - { - ::formula::FormulaGrammar::AddressConvention aConv = aNameStr.EqualsAscii( SC_UNONAME_PERSREPR ) ? - ::formula::FormulaGrammar::CONV_OOO : ::formula::FormulaGrammar::CONV_XL_A1; - - // parse the file format string - rtl::OUString sRepresentation; - if (aValue >>= sRepresentation) - { - String aUIString(sRepresentation); - - // cell or range: strip a single "." at the start - if ( aUIString.GetChar(0) == (sal_Unicode) '.' ) - aUIString.Erase( 0, 1 ); - - if ( bIsRange ) - { - // range: also strip a "." after the last colon - sal_Int32 nColon = rtl::OUString(aUIString).lastIndexOf( (sal_Unicode) ':' ); - if ( nColon >= 0 && nColon < aUIString.Len() - 1 && - aUIString.GetChar((xub_StrLen)nColon+1) == (sal_Unicode) '.' ) - aUIString.Erase( (xub_StrLen)nColon+1, 1 ); - } - - // parse the rest like a UI string - bSuccess = ParseUIString( aUIString, aConv ); - } - } - else - throw beans::UnknownPropertyException(); - - if ( !bSuccess ) - throw lang::IllegalArgumentException(); -} - -uno::Any SAL_CALL ScAddressConversionObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - if ( !pDocShell ) - throw uno::RuntimeException(); - - ScDocument* pDoc = pDocShell->GetDocument(); - uno::Any aRet; - - String aNameStr(aPropertyName); - if ( aNameStr.EqualsAscii( SC_UNONAME_ADDRESS ) ) - { - if ( bIsRange ) - { - table::CellRangeAddress aRangeAddress; - ScUnoConversion::FillApiRange( aRangeAddress, aRange ); - aRet <<= aRangeAddress; - } - else - { - table::CellAddress aCellAddress; - ScUnoConversion::FillApiAddress( aCellAddress, aRange.aStart ); - aRet <<= aCellAddress; - } - } - else if ( aNameStr.EqualsAscii( SC_UNONAME_REFSHEET ) ) - { - aRet <<= nRefSheet; - } - else if ( aNameStr.EqualsAscii( SC_UNONAME_UIREPR ) ) - { - // generate UI representation string - include sheet only if different from ref sheet - String aFormatStr; - sal_uInt16 nFlags = SCA_VALID; - if ( aRange.aStart.Tab() != nRefSheet ) - nFlags |= SCA_TAB_3D; - if ( bIsRange ) - aRange.Format( aFormatStr, nFlags, pDoc ); - else - aRange.aStart.Format( aFormatStr, nFlags, pDoc ); - aRet <<= rtl::OUString( aFormatStr ); - } - else if ( aNameStr.EqualsAscii( SC_UNONAME_PERSREPR ) || aNameStr.EqualsAscii( SC_UNONAME_XLA1REPR ) ) - { - ::formula::FormulaGrammar::AddressConvention eConv = aNameStr.EqualsAscii( SC_UNONAME_PERSREPR ) ? - ::formula::FormulaGrammar::CONV_OOO : ::formula::FormulaGrammar::CONV_XL_A1; - - // generate file format string - always include sheet - String aFormatStr; - aRange.aStart.Format( aFormatStr, SCA_VALID | SCA_TAB_3D, pDoc, eConv ); - if ( bIsRange ) - { - // manually concatenate range so both parts always have the sheet name - aFormatStr.Append( (sal_Unicode) ':' ); - String aSecond; - sal_uInt16 nFlags = SCA_VALID; - if( eConv != ::formula::FormulaGrammar::CONV_XL_A1 ) - nFlags |= SCA_TAB_3D; - aRange.aEnd.Format( aSecond, SCA_VALID | SCA_TAB_3D, pDoc, eConv ); - aFormatStr.Append( aSecond ); - } - aRet <<= rtl::OUString( aFormatStr ); - } - else - throw beans::UnknownPropertyException(); - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScAddressConversionObj ) - -// lang::XServiceInfo - -rtl::OUString SAL_CALL ScAddressConversionObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScAddressConversionObj" )); -} - -sal_Bool SAL_CALL ScAddressConversionObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr( rServiceName ); - return aServiceStr.EqualsAscii( bIsRange ? SC_SERVICENAME_RANGEADDRESS - : SC_SERVICENAME_CELLADDRESS ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScAddressConversionObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(1); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = bIsRange ? rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_SERVICENAME_RANGEADDRESS)) - : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_SERVICENAME_CELLADDRESS)); - return aRet; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/afmtuno.cxx b/sc/source/ui/unoobj/afmtuno.cxx deleted file mode 100644 index 307192cc9..000000000 --- a/sc/source/ui/unoobj/afmtuno.cxx +++ /dev/null @@ -1,877 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include "scitems.hxx" -#include <editeng/memberids.hrc> -#include <tools/shl.hxx> -#include <svl/poolitem.hxx> -#include <vcl/svapp.hxx> -#include <svx/unomid.hxx> -#include "unowids.hxx" -#include <comphelper/servicehelper.hxx> -#include <com/sun/star/table/BorderLine.hpp> -#include <com/sun/star/table/CellVertJustify2.hpp> -#include <com/sun/star/table/ShadowLocation.hpp> -#include <com/sun/star/table/TableBorder.hpp> -#include <com/sun/star/table/ShadowFormat.hpp> -#include <com/sun/star/table/CellRangeAddress.hpp> -#include <com/sun/star/table/CellContentType.hpp> -#include <com/sun/star/table/TableOrientation.hpp> -#include <com/sun/star/table/CellHoriJustify.hpp> -#include <com/sun/star/util/SortField.hpp> -#include <com/sun/star/util/SortFieldType.hpp> -#include <com/sun/star/table/CellOrientation.hpp> -#include <com/sun/star/table/CellAddress.hpp> -#include <com/sun/star/awt/SimpleFontMetric.hpp> -#include <com/sun/star/awt/FontWeight.hpp> -#include <com/sun/star/awt/FontSlant.hpp> -#include <com/sun/star/awt/CharSet.hpp> -#include <com/sun/star/awt/FontDescriptor.hpp> -#include <com/sun/star/awt/FontWidth.hpp> -#include <com/sun/star/awt/XFont.hpp> -#include <com/sun/star/awt/FontType.hpp> -#include <com/sun/star/awt/FontUnderline.hpp> -#include <com/sun/star/awt/FontStrikeout.hpp> -#include <com/sun/star/awt/FontFamily.hpp> -#include <com/sun/star/awt/FontPitch.hpp> - -#include "afmtuno.hxx" -#include "miscuno.hxx" -#include "autoform.hxx" -#include "scdll.hxx" -#include "unonames.hxx" -#include "cellsuno.hxx" - -using namespace ::com::sun::star; - -//------------------------------------------------------------------------ - -// ein AutoFormat hat immer 16 Eintraege -#define SC_AF_FIELD_COUNT 16 - -//------------------------------------------------------------------------ - -// AutoFormat-Map nur fuer PropertySetInfo, ohne Which-IDs - -const SfxItemPropertyMapEntry* lcl_GetAutoFormatMap() -{ - static SfxItemPropertyMapEntry aAutoFormatMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_INCBACK), 0, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_INCBORD), 0, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_INCFONT), 0, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_INCJUST), 0, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_INCNUM), 0, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_INCWIDTH), 0, &::getBooleanCppuType(), 0, 0 }, - {0,0,0,0,0,0} - }; - return aAutoFormatMap_Impl; -} - -//! Zahlformat (String/Language) ??? (in XNumberFormat nur ReadOnly) -//! table::TableBorder ??!? - -const SfxItemPropertyMapEntry* lcl_GetAutoFieldMap() -{ - static SfxItemPropertyMapEntry aAutoFieldMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND, &::getCppuType((const sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CCOLOR), ATTR_FONT_COLOR, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COUTL), ATTR_FONT_CONTOUR, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCROSS), ATTR_FONT_CROSSEDOUT, &::getBooleanCppuType(), 0, MID_CROSSED_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CFONT), ATTR_FONT, &::getCppuType((const sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFCHARS), ATTR_FONT, &::getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS), ATTR_CJK_FONT, &::getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS), ATTR_CTL_FONT, &::getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL), ATTR_FONT, &::getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL), ATTR_CJK_FONT, &::getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL), ATTR_CTL_FONT, &::getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFNAME), ATTR_FONT, &::getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME), ATTR_CJK_FONT, &::getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME), ATTR_CTL_FONT, &::getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CFPITCH), ATTR_FONT, &::getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH), ATTR_CJK_FONT, &::getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH), ATTR_CTL_FONT, &::getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE), ATTR_FONT, &::getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE), ATTR_CJK_FONT, &::getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE), ATTR_CTL_FONT, &::getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT), ATTR_FONT_HEIGHT, &::getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT), ATTR_CJK_FONT_HEIGHT, &::getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT), ATTR_CTL_FONT_HEIGHT, &::getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_COVER), ATTR_FONT_OVERLINE, &::getCppuType((const sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_CPOST), ATTR_FONT_POSTURE, &::getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CPOST), ATTR_CJK_FONT_POSTURE, &::getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CPOST), ATTR_CTL_FONT_POSTURE, &::getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNONAME_CSHADD), ATTR_FONT_SHADOWED, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TBLBORD), SC_WID_UNO_TBLBORD, &::getCppuType((table::TableBorder*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDER), ATTR_FONT_UNDERLINE, &::getCppuType((const sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT), ATTR_FONT_WEIGHT, &::getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT), ATTR_CJK_FONT_WEIGHT, &::getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT), ATTR_CTL_FONT_WEIGHT, &::getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY, &::getCppuType((const table::CellHoriJustify*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND, &::getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(SC_UNONAME_WRAP), ATTR_LINEBREAK, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLORI), ATTR_STACKED, &::getCppuType((const table::CellOrientation*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN, &::getCppuType((const sal_Int32*)0), 0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN, &::getCppuType((const sal_Int32*)0), 0, MID_MARGIN_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN, &::getCppuType((const sal_Int32*)0), 0, MID_MARGIN_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN, &::getCppuType((const sal_Int32*)0), 0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_ROTANG), ATTR_ROTATE_VALUE, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ROTREF), ATTR_ROTATE_MODE, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - return aAutoFieldMap_Impl; -} - -//------------------------------------------------------------------------ - -#define SCAUTOFORMATSOBJ_SERVICE "com.sun.star.sheet.TableAutoFormats" - -SC_SIMPLE_SERVICE_INFO( ScAutoFormatFieldObj, "ScAutoFormatFieldObj", "com.sun.star.sheet.TableAutoFormatField" ) -SC_SIMPLE_SERVICE_INFO( ScAutoFormatObj, "ScAutoFormatObj", "com.sun.star.sheet.TableAutoFormat" ) -SC_SIMPLE_SERVICE_INFO( ScAutoFormatsObj, "ScAutoFormatsObj", SCAUTOFORMATSOBJ_SERVICE ) - -//------------------------------------------------------------------------ - -sal_Bool lcl_FindAutoFormatIndex( const ScAutoFormat& rFormats, const String& rName, sal_uInt16& rOutIndex ) -{ - String aEntryName; - sal_uInt16 nCount = rFormats.GetCount(); - for( sal_uInt16 nPos=0; nPos<nCount; nPos++ ) - { - ScAutoFormatData* pEntry = rFormats[nPos]; - pEntry->GetName( aEntryName ); - if ( aEntryName == rName ) - { - rOutIndex = nPos; - return sal_True; - } - } - return false; // is nich -} - -//------------------------------------------------------------------------ - -ScAutoFormatsObj::ScAutoFormatsObj() -{ - //! Dieses Objekt darf es nur einmal geben, und es muss an den Auto-Format-Daten - //! bekannt sein, damit Aenderungen gebroadcasted werden koennen -} - -ScAutoFormatsObj::~ScAutoFormatsObj() -{ -} - -// stuff for exService_... - -uno::Reference<uno::XInterface> SAL_CALL ScAutoFormatsObj_CreateInstance( - const uno::Reference<lang::XMultiServiceFactory>& ) -{ - SolarMutexGuard aGuard; - ScDLL::Init(); - static uno::Reference< uno::XInterface > xInst((::cppu::OWeakObject*) new ScAutoFormatsObj); - return xInst; -} - -rtl::OUString ScAutoFormatsObj::getImplementationName_Static() -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "stardiv.StarCalc.ScAutoFormatsObj" )); -} - -uno::Sequence<rtl::OUString> ScAutoFormatsObj::getSupportedServiceNames_Static() -{ - uno::Sequence<rtl::OUString> aRet(1); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCAUTOFORMATSOBJ_SERVICE )); - return aRet; -} - -// XTableAutoFormats - -ScAutoFormatObj* ScAutoFormatsObj::GetObjectByIndex_Impl(sal_uInt16 nIndex) -{ - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats && nIndex < pFormats->GetCount()) - return new ScAutoFormatObj(nIndex); - - return NULL; // falscher Index -} - -ScAutoFormatObj* ScAutoFormatsObj::GetObjectByName_Impl(const rtl::OUString& aName) -{ - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats) - { - String aString(aName); - sal_uInt16 nIndex; - if (lcl_FindAutoFormatIndex( *pFormats, aString, nIndex )) - return GetObjectByIndex_Impl(nIndex); - } - return NULL; -} - -// container::XNameContainer - -void SAL_CALL ScAutoFormatsObj::insertByName( const rtl::OUString& aName, const uno::Any& aElement ) - throw(lang::IllegalArgumentException, container::ElementExistException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - // Reflection muss nicht uno::XInterface sein, kann auch irgendein Interface sein... - uno::Reference< uno::XInterface > xInterface(aElement, uno::UNO_QUERY); - if ( xInterface.is() ) - { - ScAutoFormatObj* pFormatObj = ScAutoFormatObj::getImplementation( xInterface ); - if ( pFormatObj && !pFormatObj->IsInserted() ) // noch nicht eingefuegt? - { - String aNameStr(aName); - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - - sal_uInt16 nDummy; - if (pFormats && !lcl_FindAutoFormatIndex( *pFormats, aNameStr, nDummy )) - { - ScAutoFormatData* pNew = new ScAutoFormatData(); - pNew->SetName( aNameStr ); - - if (pFormats->Insert( pNew )) - { - //! Notify fuer andere Objekte - pFormats->Save(); // sofort speichern - - sal_uInt16 nNewIndex; - if (lcl_FindAutoFormatIndex( *pFormats, aNameStr, nNewIndex )) - { - pFormatObj->InitFormat( nNewIndex ); // kann jetzt benutzt werden - bDone = sal_True; - } - } - else - { - delete pNew; - OSL_FAIL("AutoFormat konnte nicht eingefuegt werden"); - throw uno::RuntimeException(); - } - } - else - { - throw container::ElementExistException(); - } - } - } - - if (!bDone) - { - // other errors are handled above - throw lang::IllegalArgumentException(); - } -} - -void SAL_CALL ScAutoFormatsObj::replaceByName( const rtl::OUString& aName, const uno::Any& aElement ) - throw(lang::IllegalArgumentException, container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - //! zusammenfassen? - removeByName( aName ); - insertByName( aName, aElement ); -} - -void SAL_CALL ScAutoFormatsObj::removeByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameStr(aName); - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - - sal_uInt16 nIndex; - if (pFormats && lcl_FindAutoFormatIndex( *pFormats, aNameStr, nIndex )) - { - pFormats->AtFree( nIndex ); - - //! Notify fuer andere Objekte - pFormats->Save(); // sofort speichern - } - else - { - throw container::NoSuchElementException(); - } -} - -// container::XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScAutoFormatsObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.TableAutoFormatEnumeration"))); -} - -// container::XIndexAccess - -sal_Int32 SAL_CALL ScAutoFormatsObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats) - return pFormats->GetCount(); - - return 0; -} - -uno::Any SAL_CALL ScAutoFormatsObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< container::XNamed > xFormat(GetObjectByIndex_Impl((sal_uInt16)nIndex)); - if (!xFormat.is()) - throw lang::IndexOutOfBoundsException(); - return uno::makeAny(xFormat); -} - -uno::Type SAL_CALL ScAutoFormatsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ::getCppuType((const uno::Reference< container::XNamed >*)0); // muss zu getByIndex passen -} - -sal_Bool SAL_CALL ScAutoFormatsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// container::XNameAccess - -uno::Any SAL_CALL ScAutoFormatsObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< container::XNamed > xFormat(GetObjectByName_Impl(aName)); - if (!xFormat.is()) - throw container::NoSuchElementException(); - return uno::makeAny(xFormat); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScAutoFormatsObj::getElementNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats) - { - String aName; - sal_uInt16 nCount = pFormats->GetCount(); - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pAry = aSeq.getArray(); - for (sal_uInt16 i=0; i<nCount; i++) - { - (*pFormats)[i]->GetName(aName); - pAry[i] = aName; - } - return aSeq; - } - return uno::Sequence<rtl::OUString>(0); -} - -sal_Bool SAL_CALL ScAutoFormatsObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats) - { - String aString(aName); - sal_uInt16 nDummy; - return lcl_FindAutoFormatIndex( *pFormats, aString, nDummy ); - } - return false; -} - -//------------------------------------------------------------------------ - -ScAutoFormatObj::ScAutoFormatObj(sal_uInt16 nIndex) : - aPropSet( lcl_GetAutoFormatMap() ), - nFormatIndex( nIndex ) -{ - //! Listening !!! -} - -ScAutoFormatObj::~ScAutoFormatObj() -{ - // Wenn ein AutoFormat-Objekt losgelassen wird, werden eventuelle Aenderungen - // gespeichert, damit sie z.B. im Writer sichtbar sind - - if (IsInserted()) - { - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if ( pFormats && pFormats->IsSaveLater() ) - pFormats->Save(); - - // Save() setzt SaveLater Flag zurueck - } -} - -void ScAutoFormatObj::InitFormat( sal_uInt16 nNewIndex ) -{ - OSL_ENSURE( nFormatIndex == SC_AFMTOBJ_INVALID, "ScAutoFormatObj::InitFormat mehrfach" ); - nFormatIndex = nNewIndex; - //! Listening !!! -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScAutoFormatObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScAutoFormatObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScAutoFormatObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScAutoFormatObj::getUnoTunnelId() -{ - return theScAutoFormatObjUnoTunnelId::get().getSeq(); -} - -ScAutoFormatObj* ScAutoFormatObj::getImplementation( - const uno::Reference<uno::XInterface> xObj ) -{ - ScAutoFormatObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScAutoFormatObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -void ScAutoFormatObj::Notify( SfxBroadcaster& /* rBC */, const SfxHint& /* rHint */ ) -{ - // spaeter... -} - -// XTableAutoFormat - -ScAutoFormatFieldObj* ScAutoFormatObj::GetObjectByIndex_Impl(sal_uInt16 nIndex) -{ - if ( IsInserted() && nIndex < SC_AF_FIELD_COUNT ) - return new ScAutoFormatFieldObj( nFormatIndex, nIndex ); - - return NULL; -} - -// container::XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScAutoFormatObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.TableAutoFormatEnumeration"))); -} - -// container::XIndexAccess - -sal_Int32 SAL_CALL ScAutoFormatObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (IsInserted()) - return SC_AF_FIELD_COUNT; // immer 16 Elemente - else - return 0; -} - -uno::Any SAL_CALL ScAutoFormatObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( nIndex < 0 || nIndex >= getCount() ) - throw lang::IndexOutOfBoundsException(); - - if (IsInserted()) - return uno::makeAny(uno::Reference< beans::XPropertySet >(GetObjectByIndex_Impl((sal_uInt16)nIndex))); - return uno::Any(); -} - -uno::Type SAL_CALL ScAutoFormatObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); // muss zu getByIndex passen -} - -sal_Bool SAL_CALL ScAutoFormatObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// container::XNamed - -rtl::OUString SAL_CALL ScAutoFormatObj::getName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount()) - { - String aName; - (*pFormats)[nFormatIndex]->GetName(aName); - return aName; - } - return rtl::OUString(); -} - -void SAL_CALL ScAutoFormatObj::setName( const rtl::OUString& aNewName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNewString(aNewName); - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - - sal_uInt16 nDummy; - if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount() && - !lcl_FindAutoFormatIndex( *pFormats, aNewString, nDummy )) - { - ScAutoFormatData* pData = (*pFormats)[nFormatIndex]; - OSL_ENSURE(pData,"AutoFormat Daten nicht da"); - - ScAutoFormatData* pNew = new ScAutoFormatData(*pData); - pNew->SetName( aNewString ); - - pFormats->AtFree( nFormatIndex ); - if (pFormats->Insert( pNew )) - { - nFormatIndex = pFormats->IndexOf( pNew ); // ist evtl. anders einsortiert... - - //! Notify fuer andere Objekte - pFormats->SetSaveLater(sal_True); - } - else - { - delete pNew; - OSL_FAIL("AutoFormat konnte nicht eingefuegt werden"); - nFormatIndex = 0; //! alter Index ist ungueltig - } - } - else - { - // not inserted or name exists - throw uno::RuntimeException(); - } -} - -// beans::XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScAutoFormatObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference< beans::XPropertySetInfo > aRef(new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScAutoFormatObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount()) - { - ScAutoFormatData* pData = (*pFormats)[nFormatIndex]; - OSL_ENSURE(pData,"AutoFormat Daten nicht da"); - - String aPropString(aPropertyName); - sal_Bool bBool = sal_Bool(); - if (aPropString.EqualsAscii( SC_UNONAME_INCBACK ) && (aValue >>= bBool)) - pData->SetIncludeBackground( bBool ); - else if (aPropString.EqualsAscii( SC_UNONAME_INCBORD ) && (aValue >>= bBool)) - pData->SetIncludeFrame( bBool ); - else if (aPropString.EqualsAscii( SC_UNONAME_INCFONT ) && (aValue >>= bBool)) - pData->SetIncludeFont( bBool ); - else if (aPropString.EqualsAscii( SC_UNONAME_INCJUST ) && (aValue >>= bBool)) - pData->SetIncludeJustify( bBool ); - else if (aPropString.EqualsAscii( SC_UNONAME_INCNUM ) && (aValue >>= bBool)) - pData->SetIncludeValueFormat( bBool ); - else if (aPropString.EqualsAscii( SC_UNONAME_INCWIDTH ) && (aValue >>= bBool)) - pData->SetIncludeWidthHeight( bBool ); - - // else Fehler - - //! Notify fuer andere Objekte - pFormats->SetSaveLater(sal_True); - } -} - -uno::Any SAL_CALL ScAutoFormatObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aAny; - - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - if (pFormats && IsInserted() && nFormatIndex < pFormats->GetCount()) - { - ScAutoFormatData* pData = (*pFormats)[nFormatIndex]; - OSL_ENSURE(pData,"AutoFormat Daten nicht da"); - - sal_Bool bValue; - sal_Bool bError = false; - - String aPropString(aPropertyName); - if (aPropString.EqualsAscii( SC_UNONAME_INCBACK )) - bValue = pData->GetIncludeBackground(); - else if (aPropString.EqualsAscii( SC_UNONAME_INCBORD )) - bValue = pData->GetIncludeFrame(); - else if (aPropString.EqualsAscii( SC_UNONAME_INCFONT )) - bValue = pData->GetIncludeFont(); - else if (aPropString.EqualsAscii( SC_UNONAME_INCJUST )) - bValue = pData->GetIncludeJustify(); - else if (aPropString.EqualsAscii( SC_UNONAME_INCNUM )) - bValue = pData->GetIncludeValueFormat(); - else if (aPropString.EqualsAscii( SC_UNONAME_INCWIDTH )) - bValue = pData->GetIncludeWidthHeight(); - else - bError = sal_True; // unbekannte Property - - if (!bError) - aAny <<= bValue; - } - - return aAny; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScAutoFormatObj ) - -//------------------------------------------------------------------------ - -ScAutoFormatFieldObj::ScAutoFormatFieldObj(sal_uInt16 nFormat, sal_uInt16 nField) : - aPropSet( lcl_GetAutoFieldMap() ), - nFormatIndex( nFormat ), - nFieldIndex( nField ) -{ - //! Listening !!! -} - -ScAutoFormatFieldObj::~ScAutoFormatFieldObj() -{ -} - -void ScAutoFormatFieldObj::Notify( SfxBroadcaster& /* rBC */, const SfxHint& /* rHint */ ) -{ - // spaeter... -} - -// beans::XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScAutoFormatFieldObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference< beans::XPropertySetInfo > aRef(new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScAutoFormatFieldObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - const SfxItemPropertySimpleEntry* pEntry = - aPropSet.getPropertyMap()->getByName( aPropertyName ); - - if ( pEntry && pEntry->nWID && pFormats && nFormatIndex < pFormats->GetCount() ) - { - ScAutoFormatData* pData = (*pFormats)[nFormatIndex]; - - if ( IsScItemWid( pEntry->nWID ) ) - { - if( const SfxPoolItem* pItem = pData->GetItem( nFieldIndex, pEntry->nWID ) ) - { - sal_Bool bDone = false; - - switch( pEntry->nWID ) - { - case ATTR_STACKED: - { - table::CellOrientation eOrient; - if( aValue >>= eOrient ) - { - switch( eOrient ) - { - case table::CellOrientation_STANDARD: - pData->PutItem( nFieldIndex, SfxBoolItem( ATTR_STACKED, false ) ); - break; - case table::CellOrientation_TOPBOTTOM: - pData->PutItem( nFieldIndex, SfxBoolItem( ATTR_STACKED, false ) ); - pData->PutItem( nFieldIndex, SfxInt32Item( ATTR_ROTATE_VALUE, 27000 ) ); - break; - case table::CellOrientation_BOTTOMTOP: - pData->PutItem( nFieldIndex, SfxBoolItem( ATTR_STACKED, false ) ); - pData->PutItem( nFieldIndex, SfxInt32Item( ATTR_ROTATE_VALUE, 9000 ) ); - break; - case table::CellOrientation_STACKED: - pData->PutItem( nFieldIndex, SfxBoolItem( ATTR_STACKED, sal_True ) ); - break; - default: - { - // added to avoid warnings - } - } - bDone = sal_True; - } - } - break; - default: - SfxPoolItem* pNewItem = pItem->Clone(); - bDone = pNewItem->PutValue( aValue, pEntry->nMemberId ); - if (bDone) - pData->PutItem( nFieldIndex, *pNewItem ); - delete pNewItem; - } - - if (bDone) - //! Notify fuer andere Objekte? - pFormats->SetSaveLater(sal_True); - } - } - else - { - switch (pEntry->nWID) - { - case SC_WID_UNO_TBLBORD: - { - table::TableBorder aBorder; - if ( aValue >>= aBorder ) // empty = nothing to do - { - SvxBoxItem aOuter(ATTR_BORDER); - SvxBoxInfoItem aInner(ATTR_BORDER_INNER); - ScHelperFunctions::FillBoxItems( aOuter, aInner, aBorder ); - pData->PutItem( nFieldIndex, aOuter ); - - //! Notify fuer andere Objekte? - pFormats->SetSaveLater(sal_True); - } - } - break; - } - } - } -} - -uno::Any SAL_CALL ScAutoFormatFieldObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aVal; - - ScAutoFormat* pFormats = ScGlobal::GetAutoFormat(); - const SfxItemPropertySimpleEntry* pEntry = - aPropSet.getPropertyMap()->getByName( aPropertyName ); - - if ( pEntry && pEntry->nWID && pFormats && nFormatIndex < pFormats->GetCount() ) - { - const ScAutoFormatData* pData = (*pFormats)[nFormatIndex]; - - if ( IsScItemWid( pEntry->nWID ) ) - { - if( const SfxPoolItem* pItem = pData->GetItem( nFieldIndex, pEntry->nWID ) ) - { - switch( pEntry->nWID ) - { - case ATTR_STACKED: - { - const SfxInt32Item* pRotItem = (const SfxInt32Item*)pData->GetItem( nFieldIndex, ATTR_ROTATE_VALUE ); - sal_Int32 nRot = pRotItem ? pRotItem->GetValue() : 0; - sal_Bool bStacked = ((const SfxBoolItem*)pItem)->GetValue(); - SvxOrientationItem( nRot, bStacked, 0 ).QueryValue( aVal ); - } - break; - default: - pItem->QueryValue( aVal, pEntry->nMemberId ); - } - } - } - else - { - switch (pEntry->nWID) - { - case SC_WID_UNO_TBLBORD: - { - const SfxPoolItem* pItem = pData->GetItem(nFieldIndex, ATTR_BORDER); - if (pItem) - { - SvxBoxItem aOuter(*(static_cast<const SvxBoxItem*>(pItem))); - SvxBoxInfoItem aInner(ATTR_BORDER_INNER); - - table::TableBorder aBorder; - ScHelperFunctions::FillTableBorder( aBorder, aOuter, aInner ); - aVal <<= aBorder; - } - } - break; - } - } - } - - return aVal; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScAutoFormatFieldObj ) - -//------------------------------------------------------------------------ - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/appluno.cxx b/sc/source/ui/unoobj/appluno.cxx deleted file mode 100644 index a57d3ae05..000000000 --- a/sc/source/ui/unoobj/appluno.cxx +++ /dev/null @@ -1,953 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "appluno.hxx" -#include "sal/types.h" -#include <osl/diagnose.h> -#include <cppuhelper/factory.hxx> - -#include <sfx2/app.hxx> -#include <sfx2/sfxmodelfactory.hxx> -#include "afmtuno.hxx" -#include "funcuno.hxx" -#include "filtuno.hxx" -#include "miscuno.hxx" -#include "scmod.hxx" -#include "appoptio.hxx" -#include "inputopt.hxx" -#include "printopt.hxx" -#include "userlist.hxx" -#include "sc.hrc" // VAR_ARGS -#include "unonames.hxx" -#include "funcdesc.hxx" -#include <com/sun/star/sheet/FunctionArgument.hpp> - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -// Calc document -extern uno::Sequence< rtl::OUString > SAL_CALL ScDocument_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScDocument_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScDocument_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr, const sal_uInt64 _nCreationFlags ) throw( uno::Exception ); - -// Calc XML import -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLImport_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLImport_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLImport_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLImport_Meta_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLImport_Meta_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLImport_Meta_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLImport_Styles_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLImport_Styles_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLImport_Styles_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLImport_Content_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLImport_Content_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLImport_Content_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLImport_Settings_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLImport_Settings_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLImport_Settings_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); - -// Calc XML export -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLOOoExport_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Meta_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLOOoExport_Meta_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Meta_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Styles_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLOOoExport_Styles_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Styles_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Content_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLOOoExport_Content_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Content_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOOoExport_Settings_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLOOoExport_Settings_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOOoExport_Settings_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); - -// Calc XML Oasis export -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLOasisExport_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Meta_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLOasisExport_Meta_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Meta_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Styles_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLOasisExport_Styles_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Styles_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Content_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLOasisExport_Content_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Content_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); -extern uno::Sequence< rtl::OUString > SAL_CALL ScXMLOasisExport_Settings_getSupportedServiceNames() throw(); -extern rtl::OUString SAL_CALL ScXMLOasisExport_Settings_getImplementationName() throw(); -extern uno::Reference< uno::XInterface > SAL_CALL ScXMLOasisExport_Settings_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & rSMgr ) throw( uno::Exception ); - -//------------------------------------------------------------------------ - -// Anzahl der Funktionen, die als zuletzt benutzt gespeichert werden -//! Define mit funcpage.hxx und dwfunctr.hxx zusammenfassen !!! -#define LRU_MAX 10 - -// Spezial-Werte fuer Zoom -//! irgendwo zentral -#define SC_ZOOMVAL_OPTIMAL (-1) -#define SC_ZOOMVAL_WHOLEPAGE (-2) -#define SC_ZOOMVAL_PAGEWIDTH (-3) - -// Anzahl der PropertyValues in einer Function-Description -#define SC_FUNCDESC_PROPCOUNT 5 - -//------------------------------------------------------------------------ - -// alles ohne Which-ID, Map nur fuer PropertySetInfo - -static const SfxItemPropertyMapEntry* lcl_GetSettingsPropertyMap() -{ - static SfxItemPropertyMapEntry aSettingsPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_DOAUTOCP), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ENTERED), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_EXPREF), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_EXTFMT), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_LINKUPD), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_MARKHDR), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_METRIC), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_MOVEDIR), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_MOVESEL), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_PRALLSH), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_PREMPTY), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_RANGEFIN), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_SCALE), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_STBFUNC), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ULISTS), 0, &getCppuType((uno::Sequence<rtl::OUString>*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_PRMETRICS),0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_USETABCOL),0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_REPLWARN), 0, &getBooleanCppuType(), 0, 0}, - {0,0,0,0,0,0} - }; - return aSettingsPropertyMap_Impl; -} - -//------------------------------------------------------------------------ - -#define SCFUNCTIONLISTOBJ_SERVICE "com.sun.star.sheet.FunctionDescriptions" -#define SCRECENTFUNCTIONSOBJ_SERVICE "com.sun.star.sheet.RecentFunctions" -#define SCSPREADSHEETSETTINGS_SERVICE "com.sun.star.sheet.GlobalSheetSettings" - -SC_SIMPLE_SERVICE_INFO( ScFunctionListObj, "ScFunctionListObj", SCFUNCTIONLISTOBJ_SERVICE ) -SC_SIMPLE_SERVICE_INFO( ScRecentFunctionsObj, "ScRecentFunctionsObj", SCRECENTFUNCTIONSOBJ_SERVICE ) -SC_SIMPLE_SERVICE_INFO( ScSpreadsheetSettings, "ScSpreadsheetSettings", SCSPREADSHEETSETTINGS_SERVICE ) - -//------------------------------------------------------------------------ - -extern "C" { - -SAL_DLLPUBLIC_EXPORT void * SAL_CALL sc_component_getFactory( - const sal_Char * pImplName, void * pServiceManager, void * /* pRegistryKey */ ) -{ - if (!pServiceManager) - return NULL; - - uno::Reference<lang::XSingleServiceFactory> xFactory; - rtl::OUString aImpl(rtl::OUString::createFromAscii(pImplName)); - - if ( aImpl == ScSpreadsheetSettings::getImplementationName_Static() ) - xFactory.set(cppu::createOneInstanceFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScSpreadsheetSettings::getImplementationName_Static(), - ScSpreadsheetSettings_CreateInstance, - ScSpreadsheetSettings::getSupportedServiceNames_Static() )); - - if ( aImpl == ScRecentFunctionsObj::getImplementationName_Static() ) - xFactory.set(cppu::createOneInstanceFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScRecentFunctionsObj::getImplementationName_Static(), - ScRecentFunctionsObj_CreateInstance, - ScRecentFunctionsObj::getSupportedServiceNames_Static() )); - - if ( aImpl == ScFunctionListObj::getImplementationName_Static() ) - xFactory.set(cppu::createOneInstanceFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScFunctionListObj::getImplementationName_Static(), - ScFunctionListObj_CreateInstance, - ScFunctionListObj::getSupportedServiceNames_Static() )); - - if ( aImpl == ScAutoFormatsObj::getImplementationName_Static() ) - xFactory.set(cppu::createOneInstanceFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScAutoFormatsObj::getImplementationName_Static(), - ScAutoFormatsObj_CreateInstance, - ScAutoFormatsObj::getSupportedServiceNames_Static() )); - - if ( aImpl == ScFunctionAccess::getImplementationName_Static() ) - xFactory.set(cppu::createOneInstanceFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScFunctionAccess::getImplementationName_Static(), - ScFunctionAccess_CreateInstance, - ScFunctionAccess::getSupportedServiceNames_Static() )); - - if ( aImpl == ScFilterOptionsObj::getImplementationName_Static() ) - xFactory.set(cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScFilterOptionsObj::getImplementationName_Static(), - ScFilterOptionsObj_CreateInstance, - ScFilterOptionsObj::getSupportedServiceNames_Static() )); - - if ( aImpl == ScXMLImport_getImplementationName() ) - xFactory.set(cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLImport_getImplementationName(), - ScXMLImport_createInstance, - ScXMLImport_getSupportedServiceNames() )); - - if ( aImpl == ScXMLImport_Meta_getImplementationName() ) - xFactory.set(cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLImport_Meta_getImplementationName(), - ScXMLImport_Meta_createInstance, - ScXMLImport_Meta_getSupportedServiceNames() )); - - if ( aImpl == ScXMLImport_Styles_getImplementationName() ) - xFactory.set(cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLImport_Styles_getImplementationName(), - ScXMLImport_Styles_createInstance, - ScXMLImport_Styles_getSupportedServiceNames() )); - - if ( aImpl == ScXMLImport_Content_getImplementationName() ) - xFactory.set(cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLImport_Content_getImplementationName(), - ScXMLImport_Content_createInstance, - ScXMLImport_Content_getSupportedServiceNames() )); - - if ( aImpl == ScXMLImport_Settings_getImplementationName() ) - xFactory.set(cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLImport_Settings_getImplementationName(), - ScXMLImport_Settings_createInstance, - ScXMLImport_Settings_getSupportedServiceNames() )); - - if ( aImpl == ScXMLOOoExport_getImplementationName() ) - xFactory = cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLOOoExport_getImplementationName(), - ScXMLOOoExport_createInstance, - ScXMLOOoExport_getSupportedServiceNames() ); - - if ( aImpl == ScXMLOOoExport_Meta_getImplementationName() ) - xFactory = cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLOOoExport_Meta_getImplementationName(), - ScXMLOOoExport_Meta_createInstance, - ScXMLOOoExport_Meta_getSupportedServiceNames() ); - - if ( aImpl == ScXMLOOoExport_Styles_getImplementationName() ) - xFactory = cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLOOoExport_Styles_getImplementationName(), - ScXMLOOoExport_Styles_createInstance, - ScXMLOOoExport_Styles_getSupportedServiceNames() ); - - if ( aImpl == ScXMLOOoExport_Content_getImplementationName() ) - xFactory = cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLOOoExport_Content_getImplementationName(), - ScXMLOOoExport_Content_createInstance, - ScXMLOOoExport_Content_getSupportedServiceNames() ); - - if ( aImpl == ScXMLOOoExport_Settings_getImplementationName() ) - xFactory = cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLOOoExport_Settings_getImplementationName(), - ScXMLOOoExport_Settings_createInstance, - ScXMLOOoExport_Settings_getSupportedServiceNames() ); - - if ( aImpl == ScXMLOasisExport_getImplementationName() ) - xFactory = cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLOasisExport_getImplementationName(), - ScXMLOasisExport_createInstance, - ScXMLOasisExport_getSupportedServiceNames() ); - if ( aImpl == ScXMLOasisExport_Meta_getImplementationName() ) - xFactory = cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLOasisExport_Meta_getImplementationName(), - ScXMLOasisExport_Meta_createInstance, - ScXMLOasisExport_Meta_getSupportedServiceNames() ); - if ( aImpl == ScXMLOasisExport_Styles_getImplementationName() ) - xFactory = cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLOasisExport_Styles_getImplementationName(), - ScXMLOasisExport_Styles_createInstance, - ScXMLOasisExport_Styles_getSupportedServiceNames() ); - if ( aImpl == ScXMLOasisExport_Content_getImplementationName() ) - xFactory = cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLOasisExport_Content_getImplementationName(), - ScXMLOasisExport_Content_createInstance, - ScXMLOasisExport_Content_getSupportedServiceNames() ); - if ( aImpl == ScXMLOasisExport_Settings_getImplementationName() ) - xFactory = cppu::createSingleFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScXMLOasisExport_Settings_getImplementationName(), - ScXMLOasisExport_Settings_createInstance, - ScXMLOasisExport_Settings_getSupportedServiceNames() ); - - if ( aImpl == ScDocument_getImplementationName() ) - xFactory.set(sfx2::createSfxModelFactory( - reinterpret_cast<lang::XMultiServiceFactory*>(pServiceManager), - ScDocument_getImplementationName(), - ScDocument_createInstance, - ScDocument_getSupportedServiceNames() )); - - void* pRet = NULL; - if (xFactory.is()) - { - xFactory->acquire(); - pRet = xFactory.get(); - } - return pRet; -} - -} // extern C - -//------------------------------------------------------------------------ - -ScSpreadsheetSettings::ScSpreadsheetSettings() : - aPropSet( lcl_GetSettingsPropertyMap() ) -{ -} - -ScSpreadsheetSettings::~ScSpreadsheetSettings() -{ -} - -uno::Reference<uno::XInterface> SAL_CALL ScSpreadsheetSettings_CreateInstance( - const uno::Reference<lang::XMultiServiceFactory>& /* rSMgr */ ) -{ - SolarMutexGuard aGuard; - ScDLL::Init(); - static uno::Reference<uno::XInterface> xInst((cppu::OWeakObject*)new ScSpreadsheetSettings()); - return xInst; -} - -rtl::OUString ScSpreadsheetSettings::getImplementationName_Static() -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "stardiv.StarCalc.ScSpreadsheetSettings" )); -} - -uno::Sequence<rtl::OUString> ScSpreadsheetSettings::getSupportedServiceNames_Static() -{ - uno::Sequence<rtl::OUString> aRet(1); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSPREADSHEETSETTINGS_SERVICE )); - return aRet; -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScSpreadsheetSettings::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScSpreadsheetSettings::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aPropertyName); - - ScModule* pScMod = SC_MOD(); - ScAppOptions aAppOpt(pScMod->GetAppOptions()); - ScInputOptions aInpOpt(pScMod->GetInputOptions()); - sal_Bool bSaveApp = false; - sal_Bool bSaveInp = false; - // print options aren't loaded until needed - - if (aString.EqualsAscii( SC_UNONAME_DOAUTOCP )) - { - aAppOpt.SetAutoComplete( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bSaveApp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_ENTERED )) - { - aInpOpt.SetEnterEdit( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bSaveInp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_EXPREF )) - { - aInpOpt.SetExpandRefs( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bSaveInp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_EXTFMT )) - { - aInpOpt.SetExtendFormat( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bSaveInp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_LINKUPD )) - { - aAppOpt.SetLinkMode( (ScLkUpdMode) ScUnoHelpFunctions::GetInt16FromAny( aValue ) ); - bSaveApp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_MARKHDR )) - { - aInpOpt.SetMarkHeader( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bSaveInp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_MOVESEL )) - { - aInpOpt.SetMoveSelection( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bSaveInp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_RANGEFIN )) - { - aInpOpt.SetRangeFinder( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bSaveInp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_USETABCOL )) - { - aInpOpt.SetUseTabCol( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bSaveInp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_PRMETRICS )) - { - aInpOpt.SetTextWysiwyg( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bSaveInp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_REPLWARN )) - { - aInpOpt.SetReplaceCellsWarn( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bSaveInp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_METRIC )) - { - aAppOpt.SetAppMetric( (FieldUnit) ScUnoHelpFunctions::GetInt16FromAny( aValue ) ); - bSaveApp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_MOVEDIR )) - { - aInpOpt.SetMoveDir( ScUnoHelpFunctions::GetInt16FromAny( aValue ) ); - bSaveInp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_SCALE )) - { - short nVal = ScUnoHelpFunctions::GetInt16FromAny( aValue ); - if ( nVal < 0 ) - { - SvxZoomType eType = SVX_ZOOM_PERCENT; - switch (nVal) - { - case SC_ZOOMVAL_OPTIMAL: eType = SVX_ZOOM_OPTIMAL; break; - case SC_ZOOMVAL_WHOLEPAGE: eType = SVX_ZOOM_WHOLEPAGE; break; - case SC_ZOOMVAL_PAGEWIDTH: eType = SVX_ZOOM_PAGEWIDTH; break; - } - aAppOpt.SetZoomType( eType ); - } - else if ( nVal >= MINZOOM && nVal <= MAXZOOM ) - { - aAppOpt.SetZoom( nVal ); - aAppOpt.SetZoomType( SVX_ZOOM_PERCENT ); - } - bSaveApp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_STBFUNC )) - { - aAppOpt.SetStatusFunc( ScUnoHelpFunctions::GetInt16FromAny( aValue ) ); - bSaveApp = sal_True; - } - else if (aString.EqualsAscii( SC_UNONAME_ULISTS )) - { - ScUserList* pUserList = ScGlobal::GetUserList(); - uno::Sequence<rtl::OUString> aSeq; - if ( pUserList && ( aValue >>= aSeq ) ) - { - // es wird direkt die "lebende" Liste veraendert, - // mehr tut ScGlobal::SetUserList auch nicht - - pUserList->clear(); // alle Eintraege raus - sal_uInt16 nCount = (sal_uInt16)aSeq.getLength(); - const rtl::OUString* pAry = aSeq.getConstArray(); - for (sal_uInt16 i=0; i<nCount; i++) - { - String aEntry = pAry[i]; - ScUserListData* pData = new ScUserListData(aEntry); - pUserList->push_back(pData); - } - bSaveApp = sal_True; // Liste wird mit den App-Optionen gespeichert - } - } - else if (aString.EqualsAscii( SC_UNONAME_PRALLSH )) - { - ScPrintOptions aPrintOpt(pScMod->GetPrintOptions()); - aPrintOpt.SetAllSheets( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - pScMod->SetPrintOptions( aPrintOpt ); - } - else if (aString.EqualsAscii( SC_UNONAME_PREMPTY )) - { - ScPrintOptions aPrintOpt(pScMod->GetPrintOptions()); - aPrintOpt.SetSkipEmpty( !ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); // reversed - pScMod->SetPrintOptions( aPrintOpt ); - SFX_APP()->Broadcast( SfxSimpleHint( SID_SCPRINTOPTIONS ) ); // update previews - } - - if ( bSaveApp ) - pScMod->SetAppOptions( aAppOpt ); - if ( bSaveInp ) - pScMod->SetInputOptions( aInpOpt ); -} - -uno::Any SAL_CALL ScSpreadsheetSettings::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString = aPropertyName; - uno::Any aRet; - - ScModule* pScMod = SC_MOD(); - ScAppOptions aAppOpt = pScMod->GetAppOptions(); - ScInputOptions aInpOpt = pScMod->GetInputOptions(); - // print options aren't loaded until needed - - if (aString.EqualsAscii( SC_UNONAME_DOAUTOCP )) ScUnoHelpFunctions::SetBoolInAny( aRet, aAppOpt.GetAutoComplete() ); - else if (aString.EqualsAscii( SC_UNONAME_ENTERED )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetEnterEdit() ); - else if (aString.EqualsAscii( SC_UNONAME_EXPREF )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetExpandRefs() ); - else if (aString.EqualsAscii( SC_UNONAME_EXTFMT )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetExtendFormat() ); - else if (aString.EqualsAscii( SC_UNONAME_LINKUPD )) aRet <<= (sal_Int16) aAppOpt.GetLinkMode(); - else if (aString.EqualsAscii( SC_UNONAME_MARKHDR )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetMarkHeader() ); - else if (aString.EqualsAscii( SC_UNONAME_MOVESEL )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetMoveSelection() ); - else if (aString.EqualsAscii( SC_UNONAME_RANGEFIN )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetRangeFinder() ); - else if (aString.EqualsAscii( SC_UNONAME_USETABCOL )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetUseTabCol() ); - else if (aString.EqualsAscii( SC_UNONAME_PRMETRICS )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetTextWysiwyg() ); - else if (aString.EqualsAscii( SC_UNONAME_REPLWARN )) ScUnoHelpFunctions::SetBoolInAny( aRet, aInpOpt.GetReplaceCellsWarn() ); - else if (aString.EqualsAscii( SC_UNONAME_METRIC )) aRet <<= (sal_Int16) aAppOpt.GetAppMetric(); - else if (aString.EqualsAscii( SC_UNONAME_MOVEDIR )) aRet <<= (sal_Int16) aInpOpt.GetMoveDir(); - else if (aString.EqualsAscii( SC_UNONAME_STBFUNC )) aRet <<= (sal_Int16) aAppOpt.GetStatusFunc(); - else if (aString.EqualsAscii( SC_UNONAME_SCALE )) - { - sal_Int16 nZoomVal = 0; - switch ( aAppOpt.GetZoomType() ) - { - case SVX_ZOOM_PERCENT: nZoomVal = aAppOpt.GetZoom(); break; - case SVX_ZOOM_OPTIMAL: nZoomVal = SC_ZOOMVAL_OPTIMAL; break; - case SVX_ZOOM_WHOLEPAGE: nZoomVal = SC_ZOOMVAL_WHOLEPAGE; break; - case SVX_ZOOM_PAGEWIDTH: nZoomVal = SC_ZOOMVAL_PAGEWIDTH; break; - default: - { - // added to avoid warnings - } - } - aRet <<= (sal_Int16) nZoomVal; - } - else if (aString.EqualsAscii( SC_UNONAME_ULISTS )) - { - ScUserList* pUserList = ScGlobal::GetUserList(); - if (pUserList) - { - size_t nCount = pUserList->size(); - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pAry = aSeq.getArray(); - for (size_t i=0; i<nCount; ++i) - { - String aEntry((*pUserList)[i]->GetString()); - pAry[i] = aEntry; - } - aRet <<= aSeq; - } - } - else if (aString.EqualsAscii( SC_UNONAME_PRALLSH )) - ScUnoHelpFunctions::SetBoolInAny( aRet, pScMod->GetPrintOptions().GetAllSheets() ); - else if (aString.EqualsAscii( SC_UNONAME_PREMPTY )) - ScUnoHelpFunctions::SetBoolInAny( aRet, !pScMod->GetPrintOptions().GetSkipEmpty() ); // reversed - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScSpreadsheetSettings ) - -//------------------------------------------------------------------------ - -ScRecentFunctionsObj::ScRecentFunctionsObj() -{ -} - -ScRecentFunctionsObj::~ScRecentFunctionsObj() -{ -} - -// stuff for exService_... - -uno::Reference<uno::XInterface> SAL_CALL ScRecentFunctionsObj_CreateInstance( - const uno::Reference<lang::XMultiServiceFactory>& /* rSMgr */ ) -{ - SolarMutexGuard aGuard; - ScDLL::Init(); - static uno::Reference<uno::XInterface> xInst((cppu::OWeakObject*)new ScRecentFunctionsObj()); - return xInst; -} - -rtl::OUString ScRecentFunctionsObj::getImplementationName_Static() -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "stardiv.StarCalc.ScRecentFunctionsObj" )); -} - -uno::Sequence<rtl::OUString> ScRecentFunctionsObj::getSupportedServiceNames_Static() -{ - uno::Sequence<rtl::OUString> aRet(1); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCRECENTFUNCTIONSOBJ_SERVICE )); - return aRet; -} - -// XRecentFunctions - -uno::Sequence<sal_Int32> SAL_CALL ScRecentFunctionsObj::getRecentFunctionIds() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScAppOptions& rOpt = SC_MOD()->GetAppOptions(); - sal_uInt16 nCount = rOpt.GetLRUFuncListCount(); - const sal_uInt16* pFuncs = rOpt.GetLRUFuncList(); - if (pFuncs) - { - uno::Sequence<sal_Int32> aSeq(nCount); - sal_Int32* pAry = aSeq.getArray(); - for (sal_uInt16 i=0; i<nCount; i++) - pAry[i] = pFuncs[i]; - return aSeq; - } - return uno::Sequence<sal_Int32>(0); -} - -void SAL_CALL ScRecentFunctionsObj::setRecentFunctionIds( - const uno::Sequence<sal_Int32>& aRecentFunctionIds ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = (sal_uInt16) Min( aRecentFunctionIds.getLength(), (sal_Int32) LRU_MAX ); - const sal_Int32* pAry = aRecentFunctionIds.getConstArray(); - - sal_uInt16* pFuncs = nCount ? new sal_uInt16[nCount] : NULL; - for (sal_uInt16 i=0; i<nCount; i++) - pFuncs[i] = (sal_uInt16)pAry[i]; //! auf gueltige Werte testen? - - ScModule* pScMod = SC_MOD(); - ScAppOptions aNewOpts(pScMod->GetAppOptions()); - aNewOpts.SetLRUFuncList(pFuncs, nCount); - pScMod->SetAppOptions(aNewOpts); - - pScMod->RecentFunctionsChanged(); // update function list child window - - delete[] pFuncs; -} - -sal_Int32 SAL_CALL ScRecentFunctionsObj::getMaxRecentFunctions() throw(uno::RuntimeException) -{ - return LRU_MAX; -} - -//------------------------------------------------------------------------ - -ScFunctionListObj::ScFunctionListObj() -{ -} - -ScFunctionListObj::~ScFunctionListObj() -{ -} - -// stuff for exService_... - -uno::Reference<uno::XInterface> SAL_CALL ScFunctionListObj_CreateInstance( - const uno::Reference<lang::XMultiServiceFactory>& /* rSMgr */ ) -{ - SolarMutexGuard aGuard; - ScDLL::Init(); - static uno::Reference<uno::XInterface> xInst((cppu::OWeakObject*)new ScFunctionListObj()); - return xInst; -} - -rtl::OUString ScFunctionListObj::getImplementationName_Static() -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "stardiv.StarCalc.ScFunctionListObj" )); -} - -uno::Sequence<rtl::OUString> ScFunctionListObj::getSupportedServiceNames_Static() -{ - uno::Sequence<rtl::OUString> aRet(1); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCFUNCTIONLISTOBJ_SERVICE )); - return aRet; -} - - -static void lcl_FillSequence( uno::Sequence<beans::PropertyValue>& rSequence, const ScFuncDesc& rDesc ) -{ - rDesc.initArgumentInfo(); // full argument info is needed - - OSL_ENSURE( rSequence.getLength() == SC_FUNCDESC_PROPCOUNT, "Falscher Count" ); - - beans::PropertyValue* pArray = rSequence.getArray(); - - pArray[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ID )); - pArray[0].Value <<= (sal_Int32) rDesc.nFIndex; - - pArray[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_CATEGORY )); - pArray[1].Value <<= (sal_Int32) rDesc.nCategory; - - pArray[2].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_NAME )); - if (rDesc.pFuncName) - pArray[2].Value <<= rtl::OUString( *rDesc.pFuncName ); - - pArray[3].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_DESCRIPTION )); - if (rDesc.pFuncDesc) - pArray[3].Value <<= rtl::OUString( *rDesc.pFuncDesc ); - - pArray[4].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ARGUMENTS )); - if (rDesc.ppDefArgNames && rDesc.ppDefArgDescs && rDesc.pDefArgFlags ) - { - sal_uInt16 nCount = rDesc.nArgCount; - if (nCount >= VAR_ARGS) - nCount -= VAR_ARGS - 1; - sal_uInt16 nSeqCount = rDesc.GetSuppressedArgCount(); - if (nSeqCount >= VAR_ARGS) - nSeqCount -= VAR_ARGS - 1; - - if (nSeqCount) - { - uno::Sequence<sheet::FunctionArgument> aArgSeq(nSeqCount); - sheet::FunctionArgument* pArgAry = aArgSeq.getArray(); - for (sal_uInt16 i=0, j=0; i<nCount; i++) - { - if (!rDesc.pDefArgFlags[i].bSuppress) - { - String aArgName; - if (rDesc.ppDefArgNames[i]) aArgName = *rDesc.ppDefArgNames[i]; - String aArgDesc; - if (rDesc.ppDefArgDescs[i]) aArgDesc = *rDesc.ppDefArgDescs[i]; - sheet::FunctionArgument aArgument; - aArgument.Name = aArgName; - aArgument.Description = aArgDesc; - aArgument.IsOptional = rDesc.pDefArgFlags[i].bOptional; - pArgAry[j++] = aArgument; - } - } - pArray[4].Value <<= aArgSeq; - } - } -} - -// XFunctionDescriptions - -uno::Sequence<beans::PropertyValue> SAL_CALL ScFunctionListObj::getById( sal_Int32 nId ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList(); - if ( pFuncList ) - { - sal_uInt16 nCount = (sal_uInt16)pFuncList->GetCount(); - for (sal_uInt16 nIndex=0; nIndex<nCount; nIndex++) - { - const ScFuncDesc* pDesc = pFuncList->GetFunction(nIndex); - if ( pDesc && pDesc->nFIndex == nId ) - { - uno::Sequence<beans::PropertyValue> aSeq( SC_FUNCDESC_PROPCOUNT ); - lcl_FillSequence( aSeq, *pDesc ); - return aSeq; - } - } - - throw lang::IllegalArgumentException(); // not found - } - else - throw uno::RuntimeException(); // should not happen -} - -// XNameAccess - -uno::Any SAL_CALL ScFunctionListObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ::rtl::OUString aNameStr(aName); - const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList(); - if ( pFuncList ) - { - sal_uInt16 nCount = (sal_uInt16)pFuncList->GetCount(); - for (sal_uInt16 nIndex=0; nIndex<nCount; nIndex++) - { - const ScFuncDesc* pDesc = pFuncList->GetFunction(nIndex); - //! Case-insensitiv ??? - if ( pDesc && pDesc->pFuncName && aNameStr == *pDesc->pFuncName ) - { - uno::Sequence<beans::PropertyValue> aSeq( SC_FUNCDESC_PROPCOUNT ); - lcl_FillSequence( aSeq, *pDesc ); - return uno::makeAny(aSeq); - } - } - - throw container::NoSuchElementException(); // not found - } - else - throw uno::RuntimeException(); // should not happen -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScFunctionListObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Int32 nCount = 0; - const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList(); - if ( pFuncList ) - nCount = static_cast<sal_Int32>(pFuncList->GetCount()); - return nCount; -} - -uno::Any SAL_CALL ScFunctionListObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList(); - if ( pFuncList ) - { - if ( nIndex >= 0 && nIndex < (sal_Int32)pFuncList->GetCount() ) - { - const ScFuncDesc* pDesc = pFuncList->GetFunction(nIndex); - if ( pDesc ) - { - uno::Sequence<beans::PropertyValue> aSeq( SC_FUNCDESC_PROPCOUNT ); - lcl_FillSequence( aSeq, *pDesc ); - return uno::makeAny(aSeq); - } - } - - throw lang::IndexOutOfBoundsException(); // illegal index - } - else - throw uno::RuntimeException(); // should not happen -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScFunctionListObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.FunctionDescriptionEnumeration"))); -} - -// XElementAccess - -uno::Type SAL_CALL ScFunctionListObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Sequence<beans::PropertyValue>*)0); -} - -sal_Bool SAL_CALL ScFunctionListObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() > 0 ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScFunctionListObj::getElementNames() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList(); - if ( pFuncList ) - { - sal_uInt32 nCount = pFuncList->GetCount(); - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pAry = aSeq.getArray(); - for (sal_uInt32 nIndex=0; nIndex<nCount; ++nIndex) - { - const ScFuncDesc* pDesc = pFuncList->GetFunction(nIndex); - if ( pDesc && pDesc->pFuncName ) - pAry[nIndex] = *pDesc->pFuncName; - } - return aSeq; - } - return uno::Sequence<rtl::OUString>(0); -} - -sal_Bool SAL_CALL ScFunctionListObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScFunctionList* pFuncList = ScGlobal::GetStarCalcFunctionList(); - if ( pFuncList ) - { - sal_uInt32 nCount = pFuncList->GetCount(); - for (sal_uInt32 nIndex=0; nIndex<nCount; ++nIndex) - { - const ScFuncDesc* pDesc = pFuncList->GetFunction(nIndex); - //! Case-insensitiv ??? - if ( pDesc && pDesc->pFuncName && aName == *pDesc->pFuncName ) - return sal_True; - } - } - return false; -} - -//------------------------------------------------------------------------ - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/celllistsource.cxx b/sc/source/ui/unoobj/celllistsource.cxx deleted file mode 100644 index b686147c9..000000000 --- a/sc/source/ui/unoobj/celllistsource.cxx +++ /dev/null @@ -1,451 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" -#include "celllistsource.hxx" -#include <tools/debug.hxx> -#include <com/sun/star/text/XTextRange.hpp> -#include <com/sun/star/sheet/XCellRangeAddressable.hpp> -#include <com/sun/star/util/XModifyBroadcaster.hpp> -#include <com/sun/star/container/XIndexAccess.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/beans/NamedValue.hpp> - -//......................................................................... -namespace calc -{ -//......................................................................... - -#define PROP_HANDLE_RANGE_ADDRESS 1 - - using namespace ::com::sun::star::uno; - using namespace ::com::sun::star::lang; - using namespace ::com::sun::star::table; - using namespace ::com::sun::star::text; - using namespace ::com::sun::star::sheet; - using namespace ::com::sun::star::container; - using namespace ::com::sun::star::beans; - using namespace ::com::sun::star::util; - using namespace ::com::sun::star::form::binding; - - //===================================================================== - //= OCellListSource - //===================================================================== - DBG_NAME( OCellListSource ) - //--------------------------------------------------------------------- -#ifdef DBG_UTIL - const char* OCellListSource::checkConsistency_static( const void* _pThis ) - { - return static_cast< const OCellListSource* >( _pThis )->checkConsistency( ); - } - - const char* OCellListSource::checkConsistency( ) const - { - const char* pAssertion = NULL; - - // TODO: place any checks here to ensure consistency of this instance - - return pAssertion; - } -#endif - - //--------------------------------------------------------------------- - OCellListSource::OCellListSource( const Reference< XSpreadsheetDocument >& _rxDocument ) - :OCellListSource_Base( m_aMutex ) - ,OCellListSource_PBase( OCellListSource_Base::rBHelper ) - ,m_xDocument( _rxDocument ) - ,m_aListEntryListeners( m_aMutex ) - ,m_bInitialized( false ) - { - DBG_CTOR( OCellListSource, checkConsistency_static ); - - OSL_PRECOND( m_xDocument.is(), "OCellListSource::OCellListSource: invalid document!" ); - - // register our property at the base class - CellRangeAddress aInitialPropValue; - registerPropertyNoMember( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "CellRange" )), - PROP_HANDLE_RANGE_ADDRESS, - PropertyAttribute::BOUND | PropertyAttribute::READONLY, - ::getCppuType( &aInitialPropValue ), - &aInitialPropValue - ); - } - - //--------------------------------------------------------------------- - OCellListSource::~OCellListSource( ) - { - if ( !OCellListSource_Base::rBHelper.bDisposed ) - { - acquire(); // prevent duplicate dtor - dispose(); - } - - DBG_DTOR( OCellListSource, checkConsistency_static ); - } - - //-------------------------------------------------------------------- - IMPLEMENT_FORWARD_XINTERFACE2( OCellListSource, OCellListSource_Base, OCellListSource_PBase ) - - //-------------------------------------------------------------------- - IMPLEMENT_FORWARD_XTYPEPROVIDER2( OCellListSource, OCellListSource_Base, OCellListSource_PBase ) - - //-------------------------------------------------------------------- - void SAL_CALL OCellListSource::disposing() - { - ::osl::MutexGuard aGuard( m_aMutex ); - DBG_CHKTHIS( OCellListSource, checkConsistency_static ); - - Reference<XModifyBroadcaster> xBroadcaster( m_xRange, UNO_QUERY ); - if ( xBroadcaster.is() ) - { - xBroadcaster->removeModifyListener( this ); - } - - EventObject aDisposeEvent( *this ); - m_aListEntryListeners.disposeAndClear( aDisposeEvent ); - - WeakAggComponentImplHelperBase::disposing(); - - // TODO: clean up here whatever you need to clean up (e.g. revoking listeners etc.) - } - - //-------------------------------------------------------------------- - Reference< XPropertySetInfo > SAL_CALL OCellListSource::getPropertySetInfo( ) throw(RuntimeException) - { - DBG_CHKTHIS( OCellListSource, checkConsistency_static ); - return createPropertySetInfo( getInfoHelper() ) ; - } - - //-------------------------------------------------------------------- - ::cppu::IPropertyArrayHelper& SAL_CALL OCellListSource::getInfoHelper() - { - return *OCellListSource_PABase::getArrayHelper(); - } - - //-------------------------------------------------------------------- - ::cppu::IPropertyArrayHelper* OCellListSource::createArrayHelper( ) const - { - Sequence< Property > aProps; - describeProperties( aProps ); - return new ::cppu::OPropertyArrayHelper(aProps); - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellListSource::getFastPropertyValue( Any& _rValue, sal_Int32 _nHandle ) const - { - DBG_CHKTHIS( OCellListSource, checkConsistency_static ); - OSL_ENSURE( _nHandle == PROP_HANDLE_RANGE_ADDRESS, "OCellListSource::getFastPropertyValue: invalid handle!" ); - // we only have this one property .... - (void)_nHandle; // avoid warning in product version - - _rValue <<= getRangeAddress( ); - } - - //-------------------------------------------------------------------- - void OCellListSource::checkDisposed( ) const SAL_THROW( ( DisposedException ) ) - { - if ( OCellListSource_Base::rBHelper.bInDispose || OCellListSource_Base::rBHelper.bDisposed ) - throw DisposedException(); - // TODO: is it worth having an error message here? - } - - //-------------------------------------------------------------------- - void OCellListSource::checkInitialized() SAL_THROW( ( RuntimeException ) ) - { - if ( !m_bInitialized ) - throw RuntimeException(); - // TODO: error message - } - - //-------------------------------------------------------------------- - ::rtl::OUString SAL_CALL OCellListSource::getImplementationName( ) throw (RuntimeException) - { - return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.sheet.OCellListSource" ) ); - } - - //-------------------------------------------------------------------- - sal_Bool SAL_CALL OCellListSource::supportsService( const ::rtl::OUString& _rServiceName ) throw (RuntimeException) - { - Sequence< ::rtl::OUString > aSupportedServices( getSupportedServiceNames() ); - const ::rtl::OUString* pLookup = aSupportedServices.getConstArray(); - const ::rtl::OUString* pLookupEnd = aSupportedServices.getConstArray() + aSupportedServices.getLength(); - while ( pLookup != pLookupEnd ) - if ( *pLookup++ == _rServiceName ) - return sal_True; - - return false; - } - - //-------------------------------------------------------------------- - Sequence< ::rtl::OUString > SAL_CALL OCellListSource::getSupportedServiceNames( ) throw (RuntimeException) - { - Sequence< ::rtl::OUString > aServices( 2 ); - aServices[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.table.CellRangeListSource" ) ); - aServices[ 1 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.binding.ListEntrySource" ) ); - return aServices; - } - - //-------------------------------------------------------------------- - CellRangeAddress OCellListSource::getRangeAddress( ) const - { - OSL_PRECOND( m_xRange.is(), "OCellListSource::getRangeAddress: invalid range!" ); - - CellRangeAddress aAddress; - Reference< XCellRangeAddressable > xRangeAddress( m_xRange, UNO_QUERY ); - if ( xRangeAddress.is() ) - aAddress = xRangeAddress->getRangeAddress( ); - return aAddress; - } - - //-------------------------------------------------------------------- - ::rtl::OUString OCellListSource::getCellTextContent_noCheck( sal_Int32 _nRangeRelativeColumn, sal_Int32 _nRangeRelativeRow ) - { - OSL_PRECOND( m_xRange.is(), "OCellListSource::getRangeAddress: invalid range!" ); - Reference< XTextRange > xCellText; - if ( m_xRange.is() ) - xCellText.set(xCellText.query( m_xRange->getCellByPosition( _nRangeRelativeColumn, _nRangeRelativeRow ) )); - - ::rtl::OUString sText; - if ( xCellText.is() ) - sText = xCellText->getString(); - return sText; - } - - //-------------------------------------------------------------------- - sal_Int32 SAL_CALL OCellListSource::getListEntryCount( ) throw (RuntimeException) - { - ::osl::MutexGuard aGuard( m_aMutex ); - DBG_CHKTHIS( OCellListSource, checkConsistency_static ); - checkDisposed(); - checkInitialized(); - - CellRangeAddress aAddress( getRangeAddress( ) ); - return aAddress.EndRow - aAddress.StartRow + 1; - } - - //-------------------------------------------------------------------- - ::rtl::OUString SAL_CALL OCellListSource::getListEntry( sal_Int32 _nPosition ) throw (IndexOutOfBoundsException, RuntimeException) - { - ::osl::MutexGuard aGuard( m_aMutex ); - DBG_CHKTHIS( OCellListSource, checkConsistency_static ); - checkDisposed(); - checkInitialized(); - - if ( _nPosition >= getListEntryCount() ) - throw IndexOutOfBoundsException(); - - return getCellTextContent_noCheck( 0, _nPosition ); - } - - //-------------------------------------------------------------------- - Sequence< ::rtl::OUString > SAL_CALL OCellListSource::getAllListEntries( ) throw (RuntimeException) - { - ::osl::MutexGuard aGuard( m_aMutex ); - DBG_CHKTHIS( OCellListSource, checkConsistency_static ); - checkDisposed(); - checkInitialized(); - - Sequence< ::rtl::OUString > aAllEntries( getListEntryCount() ); - ::rtl::OUString* pAllEntries = aAllEntries.getArray(); - for ( sal_Int32 i = 0; i < aAllEntries.getLength(); ++i ) - { - *pAllEntries++ = getCellTextContent_noCheck( 0, i ); - } - - return aAllEntries; - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellListSource::addListEntryListener( const Reference< XListEntryListener >& _rxListener ) throw (NullPointerException, RuntimeException) - { - ::osl::MutexGuard aGuard( m_aMutex ); - DBG_CHKTHIS( OCellListSource, checkConsistency_static ); - checkDisposed(); - checkInitialized(); - - if ( !_rxListener.is() ) - throw NullPointerException(); - - m_aListEntryListeners.addInterface( _rxListener ); - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellListSource::removeListEntryListener( const Reference< XListEntryListener >& _rxListener ) throw (NullPointerException, RuntimeException) - { - ::osl::MutexGuard aGuard( m_aMutex ); - DBG_CHKTHIS( OCellListSource, checkConsistency_static ); - checkDisposed(); - checkInitialized(); - - if ( !_rxListener.is() ) - throw NullPointerException(); - - m_aListEntryListeners.removeInterface( _rxListener ); - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellListSource::modified( const EventObject& /* aEvent */ ) throw (RuntimeException) - { - DBG_CHKTHIS( OCellListSource, checkConsistency_static ); - - notifyModified(); - } - - //-------------------------------------------------------------------- - void OCellListSource::notifyModified() - { - EventObject aEvent; - aEvent.Source.set(*this); - - ::cppu::OInterfaceIteratorHelper aIter( m_aListEntryListeners ); - while ( aIter.hasMoreElements() ) - { - try - { - static_cast< XListEntryListener* >( aIter.next() )->allEntriesChanged( aEvent ); - } - catch( const RuntimeException& ) - { - // silent this - } - catch( const Exception& ) - { - OSL_FAIL( "OCellListSource::notifyModified: caught a (non-runtime) exception!" ); - } - } - - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellListSource::disposing( const EventObject& aEvent ) throw (RuntimeException) - { - DBG_CHKTHIS( OCellListSource, checkConsistency_static ); - - Reference<XInterface> xRangeInt( m_xRange, UNO_QUERY ); - if ( xRangeInt == aEvent.Source ) - { - // release references to range object - m_xRange.clear(); - } - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellListSource::initialize( const Sequence< Any >& _rArguments ) throw (Exception, RuntimeException) - { - if ( m_bInitialized ) - throw Exception(); - // TODO: error message - - // get the cell address - CellRangeAddress aRangeAddress; - sal_Bool bFoundAddress = false; - - const Any* pLoop = _rArguments.getConstArray(); - const Any* pLoopEnd = _rArguments.getConstArray() + _rArguments.getLength(); - for ( ; ( pLoop != pLoopEnd ) && !bFoundAddress; ++pLoop ) - { - NamedValue aValue; - if ( *pLoop >>= aValue ) - { - if ( aValue.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "CellRange" ) ) ) - { - if ( aValue.Value >>= aRangeAddress ) - bFoundAddress = sal_True; - } - } - } - - if ( !bFoundAddress ) - // TODO: error message - throw Exception(); - - // determine the range we're bound to - try - { - if ( m_xDocument.is() ) - { - // first the sheets collection - Reference< XIndexAccess > xSheets(m_xDocument->getSheets( ), UNO_QUERY); - OSL_ENSURE( xSheets.is(), "OCellListSource::initialize: could not retrieve the sheets!" ); - - if ( xSheets.is() ) - { - // the concrete sheet - Reference< XCellRange > xSheet(xSheets->getByIndex( aRangeAddress.Sheet ), UNO_QUERY); - OSL_ENSURE( xSheet.is(), "OCellListSource::initialize: NULL sheet, but no exception!" ); - - // the concrete cell - if ( xSheet.is() ) - { - m_xRange.set(xSheet->getCellRangeByPosition( - aRangeAddress.StartColumn, aRangeAddress.StartRow, - aRangeAddress.EndColumn, aRangeAddress.EndRow)); - OSL_ENSURE( Reference< XCellRangeAddressable >( m_xRange, UNO_QUERY ).is(), "OCellListSource::initialize: either NULL range, or cell without address access!" ); - } - } - } - } - catch( const Exception& ) - { - OSL_FAIL( "OCellListSource::initialize: caught an exception while retrieving the cell object!" ); - } - - - if ( !m_xRange.is() ) - throw Exception(); - // TODO error message - - Reference<XModifyBroadcaster> xBroadcaster( m_xRange, UNO_QUERY ); - if ( xBroadcaster.is() ) - { - xBroadcaster->addModifyListener( this ); - } - - // TODO: add as XEventListener to the cell range, so we get notified when it dies, - // and can dispose ourself then - - // TODO: somehow add as listener so we get notified when the address of the cell range changes - // We need to forward this as change in our CellRange property to our property change listeners - - // TODO: somehow add as listener to the cells in the range, so that we get notified - // when their content changes. We need to forward this to our list entry listeners then - - // TODO: somehow add as listener so that we get notified of insertions and removals of rows in our - // range. In this case, we need to fire a change in our CellRange property, and additionally - // notify our XListEntryListeners - - m_bInitialized = sal_True; - } - -//......................................................................... -} // namespace calc -//......................................................................... - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/celllistsource.hxx b/sc/source/ui/unoobj/celllistsource.hxx deleted file mode 100644 index 0b8807f61..000000000 --- a/sc/source/ui/unoobj/celllistsource.hxx +++ /dev/null @@ -1,178 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef SC_CELLLISTSOURCE_HXX -#define SC_CELLLISTSOURCE_HXX - -#include <com/sun/star/form/binding/XListEntrySource.hpp> -#include <cppuhelper/compbase4.hxx> -#include <comphelper/propertycontainer.hxx> -#include <comphelper/uno3.hxx> -#include <comphelper/broadcasthelper.hxx> -#include <comphelper/proparrhlp.hxx> -#include <com/sun/star/table/XCellRange.hpp> -#include <com/sun/star/table/CellRangeAddress.hpp> -#include <com/sun/star/sheet/XSpreadsheetDocument.hpp> -#include <com/sun/star/lang/DisposedException.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/lang/XInitialization.hpp> -#include <com/sun/star/util/XModifyListener.hpp> - - -//......................................................................... -namespace calc -{ -//......................................................................... - - //===================================================================== - //= OCellListSource - //===================================================================== - class OCellListSource; - // the base for our interfaces - typedef ::cppu::WeakAggComponentImplHelper4 < ::com::sun::star::form::binding::XListEntrySource - , ::com::sun::star::util::XModifyListener - , ::com::sun::star::lang::XServiceInfo - , ::com::sun::star::lang::XInitialization - > OCellListSource_Base; - // the base for the property handling - typedef ::comphelper::OPropertyContainer OCellListSource_PBase; - // the second base for property handling - typedef ::comphelper::OPropertyArrayUsageHelper< OCellListSource > - OCellListSource_PABase; - - class OCellListSource :public ::comphelper::OBaseMutex - ,public OCellListSource_Base // order matters! before OCellListSource_PBase, so rBHelper gets initialized - ,public OCellListSource_PBase - ,public OCellListSource_PABase - { - private: - ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheetDocument > - m_xDocument; /// the document where our cell lives - ::com::sun::star::uno::Reference< ::com::sun::star::table::XCellRange > - m_xRange; /// the range of cells we're bound to - ::cppu::OInterfaceContainerHelper - m_aListEntryListeners; /// our listeners - sal_Bool m_bInitialized; /// has XInitialization::initialize been called? - - public: - OCellListSource( - const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheetDocument >& _rxDocument - ); - - using OCellListSource_PBase::getFastPropertyValue; - - protected: - ~OCellListSource( ); - - protected: - // XInterface - DECLARE_XINTERFACE() - - // XTypeProvider - DECLARE_XTYPEPROVIDER() - - // XListEntrySource - virtual sal_Int32 SAL_CALL getListEntryCount( ) throw (::com::sun::star::uno::RuntimeException); - virtual ::rtl::OUString SAL_CALL getListEntry( sal_Int32 Position ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getAllListEntries( ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL addListEntryListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XListEntryListener >& Listener ) throw (::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL removeListEntryListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XListEntryListener >& Listener ) throw (::com::sun::star::lang::NullPointerException, ::com::sun::star::uno::RuntimeException); - - // OComponentHelper/XComponent - virtual void SAL_CALL disposing(); - - // XServiceInfo - virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException); - virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException); - - // XPropertySet - virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); - - // OPropertySetHelper - virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); - virtual void SAL_CALL getFastPropertyValue( ::com::sun::star::uno::Any& _rValue, sal_Int32 _nHandle ) const; - - // ::comphelper::OPropertyArrayUsageHelper - virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; - - // XModifyListener - virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& aEvent ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); - - // XInitialization - virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); - - private: - void checkDisposed( ) const - SAL_THROW( ( ::com::sun::star::lang::DisposedException ) ); - void checkInitialized() - SAL_THROW( ( ::com::sun::star::uno::RuntimeException ) ); - - /** retrieves the actual address of our cell range - @precond - our m_xRange is not <NULL/> - */ - ::com::sun::star::table::CellRangeAddress - getRangeAddress( ) const; - - /** retrievs the text of a cell within our range - @param _nRangeRelativeColumn - the relative column index of the cell within our range - @param _nRangeRelativeRow - the relative row index of the cell within our range - @precond - our m_xRange is not <NULL/> - */ - ::rtl::OUString - getCellTextContent_noCheck( - sal_Int32 _nRangeRelativeColumn, - sal_Int32 _nRangeRelativeRow - ); - - void notifyModified(); - - private: - OCellListSource(); // never implemented - OCellListSource( const OCellListSource& ); // never implemented - OCellListSource& operator=( const OCellListSource& ); // never implemented - -#ifdef DBG_UTIL - private: - static const char* checkConsistency_static( const void* _pThis ); - const char* checkConsistency( ) const; -#endif - }; - -//......................................................................... -} // namespace calc -//......................................................................... - -#endif // SC_CELLLISTSOURCE_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx deleted file mode 100644 index e9304b8e3..000000000 --- a/sc/source/ui/unoobj/cellsuno.cxx +++ /dev/null @@ -1,9844 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "scitems.hxx" -#include <editeng/eeitem.hxx> -#include <svx/svdpool.hxx> - -#include <svx/algitem.hxx> -#include <editeng/boxitem.hxx> -#include <editeng/brshitem.hxx> -#include <editeng/editeng.hxx> -#include <editeng/flditem.hxx> -#include <editeng/justifyitem.hxx> -#include <svx/fmdpage.hxx> -#include <editeng/langitem.hxx> -#include <sfx2/linkmgr.hxx> -#include <svl/srchitem.hxx> -#include <svx/unomid.hxx> -#include <editeng/unoprnms.hxx> -#include <editeng/unotext.hxx> -#include <svx/svdpage.hxx> -#include <sfx2/bindings.hxx> -#include <svl/zforlist.hxx> -#include <svl/zformat.hxx> -#include <comphelper/servicehelper.hxx> -#include <float.h> // DBL_MIN - -#include <com/sun/star/awt/XBitmap.hpp> -#include <com/sun/star/util/CellProtection.hpp> -#include <com/sun/star/table/CellHoriJustify.hpp> -#include <com/sun/star/table/CellOrientation.hpp> -#include <com/sun/star/table/CellVertJustify2.hpp> -#include <com/sun/star/table/ShadowFormat.hpp> -#include <com/sun/star/table/TableBorder.hpp> -#include <com/sun/star/table/BorderLine2.hpp> -#include <com/sun/star/sheet/CellFlags.hpp> -#include <com/sun/star/sheet/FormulaResult.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/lang/Locale.hpp> -#include <com/sun/star/beans/TolerantPropertySetResultType.hpp> -#include <com/sun/star/beans/SetPropertyTolerantFailed.hpp> -#include <com/sun/star/text/WritingMode2.hpp> - -#include "autoform.hxx" -#include "cellmergeoption.hxx" -#include "cellsuno.hxx" -#include "cursuno.hxx" -#include "textuno.hxx" -#include "editsrc.hxx" -#include "notesuno.hxx" -#include "fielduno.hxx" -#include "docuno.hxx" // ScTableColumnsObj etc -#include "datauno.hxx" -#include "dapiuno.hxx" -#include "chartuno.hxx" -#include "fmtuno.hxx" -#include "miscuno.hxx" -#include "convuno.hxx" -#include "srchuno.hxx" -#include "targuno.hxx" -#include "tokenuno.hxx" -#include "eventuno.hxx" -#include "docsh.hxx" -#include "markdata.hxx" -#include "patattr.hxx" -#include "docpool.hxx" -#include "docfunc.hxx" -#include "dbdocfun.hxx" -#include "olinefun.hxx" -#include "hints.hxx" -#include "cell.hxx" -#include "undocell.hxx" -#include "undotab.hxx" -#include "undoblk.hxx" // fuer lcl_ApplyBorder - nach docfunc verschieben! -#include "stlsheet.hxx" -#include "dbdata.hxx" -#include "attrib.hxx" -#include "chartarr.hxx" -#include "chartlis.hxx" -#include "drwlayer.hxx" -#include "printfun.hxx" -#include "prnsave.hxx" -#include "tablink.hxx" -#include "dociter.hxx" -#include "rangeutl.hxx" -#include "conditio.hxx" -#include "validat.hxx" -#include "sc.hrc" -#include "brdcst.hxx" -#include "cellform.hxx" -#include "globstr.hrc" -#include "unonames.hxx" -#include "styleuno.hxx" -#include "rangeseq.hxx" -#include "unowids.hxx" -#include "paramisc.hxx" -#include "formula/errorcodes.hxx" -#include "unoreflist.hxx" -#include "formula/grammar.hxx" -#include "editeng/escpitem.hxx" - -#include <list> - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -class ScNamedEntry -{ - String aName; - ScRange aRange; - -public: - ScNamedEntry(const String& rN, const ScRange& rR) : - aName(rN), aRange(rR) {} - - const String& GetName() const { return aName; } - const ScRange& GetRange() const { return aRange; } -}; - -//------------------------------------------------------------------------ - -// Die Namen in den Maps muessen (nach strcmp) sortiert sein! -//! statt Which-ID 0 special IDs verwenden, und nicht ueber Namen vergleichen !!!!!!!!! - -// Left/Right/Top/BottomBorder are mapped directly to the core items, -// not collected/applied to the borders of a range -> ATTR_BORDER can be used directly - -const SfxItemPropertySet* lcl_GetCellsPropertySet() -{ - static SfxItemPropertyMapEntry aCellsPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ABSNAME), SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND, &getCppuType((sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CELLPRO), ATTR_PROTECTION, &getCppuType((util::CellProtection*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCOLOR), ATTR_FONT_COLOR, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COUTL), ATTR_FONT_CONTOUR, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCROSS), ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(), 0, MID_CROSSED_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS), ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0), 0, MID_EMPHASIS }, - {MAP_CHAR_LEN(SC_UNONAME_CFONT), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFCHARS), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFNAME), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CFPITCH), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT), ATTR_FONT_HEIGHT, &getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT), ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT), ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CLOCAL), ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL), ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL), ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNONAME_COVER), ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CPOST), ATTR_FONT_POSTURE, &getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CPOST), ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CPOST), ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNONAME_CRELIEF), ATTR_FONT_RELIEF, &getCppuType((sal_Int16*)0), 0, MID_RELIEF }, - {MAP_CHAR_LEN(SC_UNONAME_CSHADD), ATTR_FONT_SHADOWED, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE), ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0), 0, MID_CROSS_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDER), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT), ATTR_FONT_WEIGHT, &getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT), ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT), ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDFMT), SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDLOC), SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDXML), SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY, &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND, &getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(SC_UNONAME_WRAP), ATTR_LINEBREAK, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_NUMFMT), ATTR_VALUE_FORMAT, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLORI), ATTR_STACKED, &getCppuType((table::CellOrientation*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PADJUST), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PINDENT), ATTR_INDENT, &getCppuType((sal_Int16*)0), 0, 0 }, //! CONVERT_TWIPS - {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHANG), ATTR_HANGPUNCTUATION,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_ROTANG), ATTR_ROTATE_VALUE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ROTREF), ATTR_ROTATE_MODE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SHADOW), ATTR_SHADOW, &getCppuType((table::ShadowFormat*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TBLBORD), SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_USERDEF), ATTR_USERDEF, &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIDAT), SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALILOC), SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIXML), SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_WRITING), ATTR_WRITINGDIR, &getCppuType((sal_Int16*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aCellsPropertySet( aCellsPropertyMap_Impl ); - return &aCellsPropertySet; -} - -// CellRange enthaelt alle Eintraege von Cells, zusaetzlich eigene Eintraege -// mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt). - -const SfxItemPropertySet* lcl_GetRangePropertySet() -{ - static SfxItemPropertyMapEntry aRangePropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ABSNAME), SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND, &getCppuType((sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CELLPRO), ATTR_PROTECTION, &getCppuType((util::CellProtection*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCOLOR), ATTR_FONT_COLOR, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COUTL), ATTR_FONT_CONTOUR, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCROSS), ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(), 0, MID_CROSSED_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS), ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0), 0, MID_EMPHASIS }, - {MAP_CHAR_LEN(SC_UNONAME_CFONT), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFCHARS), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFNAME), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CFPITCH), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT), ATTR_FONT_HEIGHT, &getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT), ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT), ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CLOCAL), ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL), ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL), ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNONAME_COVER), ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CPOST), ATTR_FONT_POSTURE, &getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CPOST), ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CPOST), ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNONAME_CRELIEF), ATTR_FONT_RELIEF, &getCppuType((sal_Int16*)0), 0, MID_RELIEF }, - {MAP_CHAR_LEN(SC_UNONAME_CSHADD), ATTR_FONT_SHADOWED, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE), ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0), 0, MID_CROSS_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDER), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT), ATTR_FONT_WEIGHT, &getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT), ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT), ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDFMT), SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDLOC), SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDXML), SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY, &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND, &getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(SC_UNONAME_WRAP), ATTR_LINEBREAK, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_NUMFMT), ATTR_VALUE_FORMAT, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLORI), ATTR_STACKED, &getCppuType((table::CellOrientation*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PADJUST), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PINDENT), ATTR_INDENT, &getCppuType((sal_Int16*)0), 0, 0 }, //! CONVERT_TWIPS - {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHANG), ATTR_HANGPUNCTUATION,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_POS), SC_WID_UNO_POS, &getCppuType((awt::Point*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_ROTANG), ATTR_ROTATE_VALUE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ROTREF), ATTR_ROTATE_MODE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SHADOW), ATTR_SHADOW, &getCppuType((table::ShadowFormat*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SIZE), SC_WID_UNO_SIZE, &getCppuType((awt::Size*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TBLBORD), SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_USERDEF), ATTR_USERDEF, &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIDAT), SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALILOC), SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIXML), SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_WRITING), ATTR_WRITINGDIR, &getCppuType((sal_Int16*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aRangePropertySet( aRangePropertyMap_Impl ); - return &aRangePropertySet; -} - -// Cell enthaelt alle Eintraege von CellRange, zusaetzlich eigene Eintraege -// mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt). - -const SfxItemPropertySet* lcl_GetCellPropertySet() -{ - static SfxItemPropertyMapEntry aCellPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ABSNAME), SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND, &getCppuType((sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CELLPRO), ATTR_PROTECTION, &getCppuType((util::CellProtection*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCOLOR), ATTR_FONT_COLOR, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COUTL), ATTR_FONT_CONTOUR, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCROSS), ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(), 0, MID_CROSSED_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS), ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0), 0, MID_EMPHASIS }, - {MAP_CHAR_LEN(SC_UNONAME_CFONT), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFCHARS), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFNAME), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CFPITCH), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT), ATTR_FONT_HEIGHT, &getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT), ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT), ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CLOCAL), ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL), ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL), ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNONAME_COVER), ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CPOST), ATTR_FONT_POSTURE, &getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CPOST), ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CPOST), ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNONAME_CRELIEF), ATTR_FONT_RELIEF, &getCppuType((sal_Int16*)0), 0, MID_RELIEF }, - {MAP_CHAR_LEN(SC_UNONAME_CSHADD), ATTR_FONT_SHADOWED, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE), ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0), 0, MID_CROSS_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDER), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT), ATTR_FONT_WEIGHT, &getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT), ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT), ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDFMT), SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDLOC), SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDXML), SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_FORMLOC), SC_WID_UNO_FORMLOC, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_FORMRT), SC_WID_UNO_FORMRT, &getCppuType((table::CellContentType*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY, &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND, &getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(SC_UNONAME_WRAP), ATTR_LINEBREAK, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_NUMFMT), ATTR_VALUE_FORMAT, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLORI), ATTR_STACKED, &getCppuType((table::CellOrientation*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PADJUST), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PINDENT), ATTR_INDENT, &getCppuType((sal_Int16*)0), 0, 0 }, //! CONVERT_TWIPS - {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHANG), ATTR_HANGPUNCTUATION,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_POS), SC_WID_UNO_POS, &getCppuType((awt::Point*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_ROTANG), ATTR_ROTATE_VALUE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ROTREF), ATTR_ROTATE_MODE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SHADOW), ATTR_SHADOW, &getCppuType((table::ShadowFormat*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SIZE), SC_WID_UNO_SIZE, &getCppuType((awt::Size*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TBLBORD), SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_USERDEF), ATTR_USERDEF, &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIDAT), SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALILOC), SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIXML), SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_WRITING), ATTR_WRITINGDIR, &getCppuType((sal_Int16*)0), 0, 0 }, - {MAP_CHAR_LEN(UNO_NAME_EDIT_CHAR_ESCAPEMENT), EE_CHAR_ESCAPEMENT, &getCppuType((sal_Int32*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aCellPropertySet( aCellPropertyMap_Impl ); - return &aCellPropertySet; -} - -// Column und Row enthalten alle Eintraege von CellRange, zusaetzlich eigene Eintraege -// mit Which-ID 0 (werden nur fuer getPropertySetInfo benoetigt). - -const SfxItemPropertySet* lcl_GetColumnPropertySet() -{ - static SfxItemPropertyMapEntry aColumnPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ABSNAME), SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND, &getCppuType((sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CELLPRO), ATTR_PROTECTION, &getCppuType((util::CellProtection*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCOLOR), ATTR_FONT_COLOR, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COUTL), ATTR_FONT_CONTOUR, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCROSS), ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(), 0, MID_CROSSED_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS), ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0), 0, MID_EMPHASIS }, - {MAP_CHAR_LEN(SC_UNONAME_CFONT), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFCHARS), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFNAME), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CFPITCH), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT), ATTR_FONT_HEIGHT, &getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT), ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT), ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CLOCAL), ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL), ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL), ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNONAME_COVER), ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CPOST), ATTR_FONT_POSTURE, &getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CPOST), ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CPOST), ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNONAME_CRELIEF), ATTR_FONT_RELIEF, &getCppuType((sal_Int16*)0), 0, MID_RELIEF }, - {MAP_CHAR_LEN(SC_UNONAME_CSHADD), ATTR_FONT_SHADOWED, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE), ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0), 0, MID_CROSS_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDER), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT), ATTR_FONT_WEIGHT, &getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT), ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT), ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDFMT), SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDLOC), SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDXML), SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY, &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND, &getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(SC_UNONAME_MANPAGE), SC_WID_UNO_MANPAGE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NEWPAGE), SC_WID_UNO_NEWPAGE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_WRAP), ATTR_LINEBREAK, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVIS), SC_WID_UNO_CELLVIS, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_NUMFMT), ATTR_VALUE_FORMAT, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_OWIDTH), SC_WID_UNO_OWIDTH, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLORI), ATTR_STACKED, &getCppuType((table::CellOrientation*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PADJUST), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PINDENT), ATTR_INDENT, &getCppuType((sal_Int16*)0), 0, 0 }, //! CONVERT_TWIPS - {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHANG), ATTR_HANGPUNCTUATION,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_POS), SC_WID_UNO_POS, &getCppuType((awt::Point*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_ROTANG), ATTR_ROTATE_VALUE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ROTREF), ATTR_ROTATE_MODE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SHADOW), ATTR_SHADOW, &getCppuType((table::ShadowFormat*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SIZE), SC_WID_UNO_SIZE, &getCppuType((awt::Size*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TBLBORD), SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_USERDEF), ATTR_USERDEF, &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIDAT), SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALILOC), SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIXML), SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLWID), SC_WID_UNO_CELLWID, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_WRITING), ATTR_WRITINGDIR, &getCppuType((sal_Int16*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aColumnPropertySet( aColumnPropertyMap_Impl ); - return &aColumnPropertySet; -} - -const SfxItemPropertySet* lcl_GetRowPropertySet() -{ - static SfxItemPropertyMapEntry aRowPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ABSNAME), SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND, &getCppuType((sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CELLPRO), ATTR_PROTECTION, &getCppuType((util::CellProtection*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCOLOR), ATTR_FONT_COLOR, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COUTL), ATTR_FONT_CONTOUR, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCROSS), ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(), 0, MID_CROSSED_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS), ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0), 0, MID_EMPHASIS }, - {MAP_CHAR_LEN(SC_UNONAME_CFONT), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFCHARS), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFNAME), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CFPITCH), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT), ATTR_FONT_HEIGHT, &getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT), ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT), ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CLOCAL), ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL), ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL), ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNONAME_COVER), ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CPOST), ATTR_FONT_POSTURE, &getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CPOST), ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CPOST), ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNONAME_CRELIEF), ATTR_FONT_RELIEF, &getCppuType((sal_Int16*)0), 0, MID_RELIEF }, - {MAP_CHAR_LEN(SC_UNONAME_CSHADD), ATTR_FONT_SHADOWED, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE), ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0), 0, MID_CROSS_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDER), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT), ATTR_FONT_WEIGHT, &getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT), ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT), ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDFMT), SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDLOC), SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDXML), SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHGT), SC_WID_UNO_CELLHGT, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY, &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND, &getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(SC_UNONAME_CELLFILT), SC_WID_UNO_CELLFILT,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_MANPAGE), SC_WID_UNO_MANPAGE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NEWPAGE), SC_WID_UNO_NEWPAGE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_WRAP), ATTR_LINEBREAK, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVIS), SC_WID_UNO_CELLVIS, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_NUMFMT), ATTR_VALUE_FORMAT, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_OHEIGHT), SC_WID_UNO_OHEIGHT, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLORI), ATTR_STACKED, &getCppuType((table::CellOrientation*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PADJUST), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PINDENT), ATTR_INDENT, &getCppuType((sal_Int16*)0), 0, 0 }, //! CONVERT_TWIPS - {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHANG), ATTR_HANGPUNCTUATION,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_POS), SC_WID_UNO_POS, &getCppuType((awt::Point*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_ROTANG), ATTR_ROTATE_VALUE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ROTREF), ATTR_ROTATE_MODE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SHADOW), ATTR_SHADOW, &getCppuType((table::ShadowFormat*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SIZE), SC_WID_UNO_SIZE, &getCppuType((awt::Size*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TBLBORD), SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_USERDEF), ATTR_USERDEF, &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIDAT), SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALILOC), SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIXML), SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_WRITING), ATTR_WRITINGDIR, &getCppuType((sal_Int16*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aRowPropertySet( aRowPropertyMap_Impl ); - return &aRowPropertySet; -} - -const SfxItemPropertySet* lcl_GetSheetPropertySet() -{ - static SfxItemPropertyMapEntry aSheetPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ABSNAME), SC_WID_UNO_ABSNAME, &getCppuType((rtl::OUString*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_AUTOPRINT),SC_WID_UNO_AUTOPRINT,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_BORDCOL), SC_WID_UNO_BORDCOL, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND, &getCppuType((sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CELLPRO), ATTR_PROTECTION, &getCppuType((util::CellProtection*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLSTYL), SC_WID_UNO_CELLSTYL,&getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCOLOR), ATTR_FONT_COLOR, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COUTL), ATTR_FONT_CONTOUR, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCROSS), ATTR_FONT_CROSSEDOUT,&getBooleanCppuType(), 0, MID_CROSSED_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS), ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0), 0, MID_EMPHASIS }, - {MAP_CHAR_LEN(SC_UNONAME_CFONT), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFCHARS), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFNAME), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CFPITCH), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT), ATTR_FONT_HEIGHT, &getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT), ATTR_CJK_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT), ATTR_CTL_FONT_HEIGHT,&getCppuType((float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CLOCAL), ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL), ATTR_CJK_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL), ATTR_CTL_FONT_LANGUAGE,&getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNONAME_COVER), ATTR_FONT_OVERLINE, &getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CPOST), ATTR_FONT_POSTURE, &getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CPOST), ATTR_CJK_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CPOST), ATTR_CTL_FONT_POSTURE,&getCppuType((awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNONAME_CRELIEF), ATTR_FONT_RELIEF, &getCppuType((sal_Int16*)0), 0, MID_RELIEF }, - {MAP_CHAR_LEN(SC_UNONAME_CSHADD), ATTR_FONT_SHADOWED, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE), ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0), 0, MID_CROSS_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDER), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT), ATTR_FONT_WEIGHT, &getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT), ATTR_CJK_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT), ATTR_CTL_FONT_WEIGHT,&getCppuType((float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHCOLHDR), SC_WID_UNO_CHCOLHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CHROWHDR), SC_WID_UNO_CHROWHDR,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDFMT), SC_WID_UNO_CONDFMT, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDLOC), SC_WID_UNO_CONDLOC, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CONDXML), SC_WID_UNO_CONDXML, &getCppuType((uno::Reference<sheet::XSheetConditionalEntries>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COPYBACK), SC_WID_UNO_COPYBACK,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COPYFORM), SC_WID_UNO_COPYFORM,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COPYSTYL), SC_WID_UNO_COPYSTYL,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine2*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY, &getCppuType((table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ISACTIVE), SC_WID_UNO_ISACTIVE,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND, &getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(SC_UNONAME_WRAP), ATTR_LINEBREAK, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVIS), SC_WID_UNO_CELLVIS, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, LEFT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_LINKDISPBIT), SC_WID_UNO_LINKDISPBIT,&getCppuType((uno::Reference<awt::XBitmap>*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNO_LINKDISPNAME), SC_WID_UNO_LINKDISPNAME,&getCppuType((rtl::OUString*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NUMFMT), ATTR_VALUE_FORMAT, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLORI), ATTR_STACKED, &getCppuType((table::CellOrientation*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PAGESTL), SC_WID_UNO_PAGESTL, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PADJUST), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PINDENT), ATTR_INDENT, &getCppuType((sal_Int16*)0), 0, 0 }, //! CONVERT_TWIPS - {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHANG), ATTR_HANGPUNCTUATION,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN, &getCppuType((sal_Int32*)0), 0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_POS), SC_WID_UNO_POS, &getCppuType((awt::Point*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PRINTBORD),SC_WID_UNO_PRINTBORD,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PROTECT), SC_WID_UNO_PROTECT, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, RIGHT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_ROTANG), ATTR_ROTATE_VALUE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ROTREF), ATTR_ROTATE_MODE, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SHADOW), ATTR_SHADOW, &getCppuType((table::ShadowFormat*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_SHOWBORD), SC_WID_UNO_SHOWBORD,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SIZE), SC_WID_UNO_SIZE, &getCppuType((awt::Size*)0), 0 | beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TBLBORD), SC_WID_UNO_TBLBORD, &getCppuType((table::TableBorder*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_TABLAYOUT),SC_WID_UNO_TABLAYOUT,&getCppuType((sal_Int16*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine2*)0), 0, TOP_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_USERDEF), ATTR_USERDEF, &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIDAT), SC_WID_UNO_VALIDAT, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALILOC), SC_WID_UNO_VALILOC, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VALIXML), SC_WID_UNO_VALIXML, &getCppuType((uno::Reference<beans::XPropertySet>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_WRITING), ATTR_WRITINGDIR, &getCppuType((sal_Int16*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TABCOLOR), SC_WID_UNO_TABCOLOR, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_CODENAME), SC_WID_UNO_CODENAME, &getCppuType(static_cast< const rtl::OUString * >(0)), 0, 0}, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aSheetPropertySet( aSheetPropertyMap_Impl ); - return &aSheetPropertySet; -} - -const SfxItemPropertyMapEntry* lcl_GetEditPropertyMap() -{ - static SfxItemPropertyMapEntry aEditPropertyMap_Impl[] = - { - SVX_UNOEDIT_CHAR_PROPERTIES, - SVX_UNOEDIT_FONT_PROPERTIES, - SVX_UNOEDIT_PARA_PROPERTIES, - SVX_UNOEDIT_NUMBERING_PROPERTIE, // for completeness of service ParagraphProperties - {MAP_CHAR_LEN(SC_UNONAME_TEXTUSER), EE_CHAR_XMLATTRIBS, &getCppuType((const uno::Reference< container::XNameContainer >*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_USERDEF), EE_PARA_XMLATTRIBS, &getCppuType((const uno::Reference< container::XNameContainer >*)0), 0, 0}, - {0,0,0,0,0,0} - }; - return aEditPropertyMap_Impl; -} -const SvxItemPropertySet* lcl_GetEditPropertySet() -{ - static SvxItemPropertySet aEditPropertySet( lcl_GetEditPropertyMap(), SdrObject::GetGlobalDrawObjectItemPool() ); - return &aEditPropertySet; -} - -//------------------------------------------------------------------------ - -//! diese Funktionen in einen allgemeinen Header verschieben -inline long TwipsToHMM(long nTwips) { return (nTwips * 127 + 36) / 72; } -inline long HMMToTwips(long nHMM) { return (nHMM * 72 + 63) / 127; } - -//------------------------------------------------------------------------ - -#define SCCHARPROPERTIES_SERVICE "com.sun.star.style.CharacterProperties" -#define SCPARAPROPERTIES_SERVICE "com.sun.star.style.ParagraphProperties" -#define SCCELLPROPERTIES_SERVICE "com.sun.star.table.CellProperties" -#define SCCELLRANGE_SERVICE "com.sun.star.table.CellRange" -#define SCCELL_SERVICE "com.sun.star.table.Cell" -#define SCSHEETCELLRANGES_SERVICE "com.sun.star.sheet.SheetCellRanges" -#define SCSHEETCELLRANGE_SERVICE "com.sun.star.sheet.SheetCellRange" -#define SCSPREADSHEET_SERVICE "com.sun.star.sheet.Spreadsheet" -#define SCSHEETCELL_SERVICE "com.sun.star.sheet.SheetCell" - -SC_SIMPLE_SERVICE_INFO( ScCellFormatsEnumeration, "ScCellFormatsEnumeration", "com.sun.star.sheet.CellFormatRangesEnumeration" ) -SC_SIMPLE_SERVICE_INFO( ScCellFormatsObj, "ScCellFormatsObj", "com.sun.star.sheet.CellFormatRanges" ) -SC_SIMPLE_SERVICE_INFO( ScUniqueCellFormatsEnumeration, "ScUniqueCellFormatsEnumeration", "com.sun.star.sheet.UniqueCellFormatRangesEnumeration" ) -SC_SIMPLE_SERVICE_INFO( ScUniqueCellFormatsObj, "ScUniqueCellFormatsObj", "com.sun.star.sheet.UniqueCellFormatRanges" ) -SC_SIMPLE_SERVICE_INFO( ScCellRangesBase, "ScCellRangesBase", "stardiv.unknown" ) -SC_SIMPLE_SERVICE_INFO( ScCellsEnumeration, "ScCellsEnumeration", "com.sun.star.sheet.CellsEnumeration" ) -SC_SIMPLE_SERVICE_INFO( ScCellsObj, "ScCellsObj", "com.sun.star.sheet.Cells" ) -SC_SIMPLE_SERVICE_INFO( ScTableColumnObj, "ScTableColumnObj", "com.sun.star.table.TableColumn" ) -SC_SIMPLE_SERVICE_INFO( ScTableRowObj, "ScTableRowObj", "com.sun.star.table.TableRow" ) - -//------------------------------------------------------------------------ - -SV_IMPL_PTRARR( XModifyListenerArr_Impl, XModifyListenerPtr ); -SV_IMPL_PTRARR( ScNamedEntryArr_Impl, ScNamedEntryPtr ); - -//------------------------------------------------------------------------ - -//! ScLinkListener in anderes File verschieben !!! - -ScLinkListener::~ScLinkListener() -{ -} - -void ScLinkListener::Notify( SvtBroadcaster&, const SfxHint& rHint ) -{ - aLink.Call( (SfxHint*)&rHint ); -} - -//------------------------------------------------------------------------ - -void lcl_CopyProperties( beans::XPropertySet& rDest, beans::XPropertySet& rSource ) -{ - uno::Reference<beans::XPropertySetInfo> xInfo(rSource.getPropertySetInfo()); - if (xInfo.is()) - { - uno::Sequence<beans::Property> aSeq(xInfo->getProperties()); - const beans::Property* pAry = aSeq.getConstArray(); - sal_uLong nCount = aSeq.getLength(); - for (sal_uLong i=0; i<nCount; i++) - { - rtl::OUString aName(pAry[i].Name); - rDest.setPropertyValue( aName, rSource.getPropertyValue( aName ) ); - } - } -} - -SCTAB lcl_FirstTab( const ScRangeList& rRanges ) -{ - OSL_ENSURE(rRanges.size() >= 1, "was fuer Ranges ?!?!"); - const ScRange* pFirst = rRanges[ 0 ]; - if (pFirst) - return pFirst->aStart.Tab(); - - return 0; // soll nicht sein -} - -sal_Bool lcl_WholeSheet( const ScRangeList& rRanges ) -{ - if ( rRanges.size() == 1 ) - { - const ScRange* pRange = rRanges[0]; - if ( pRange && pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL && - pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW ) - return sal_True; - } - return false; -} - -//------------------------------------------------------------------------ - -ScSubTotalFunc lcl_SummaryToSubTotal( sheet::GeneralFunction eSummary ) -{ - ScSubTotalFunc eSubTotal; - switch (eSummary) - { - case sheet::GeneralFunction_SUM: - eSubTotal = SUBTOTAL_FUNC_SUM; - break; - case sheet::GeneralFunction_COUNT: - eSubTotal = SUBTOTAL_FUNC_CNT2; - break; - case sheet::GeneralFunction_AVERAGE: - eSubTotal = SUBTOTAL_FUNC_AVE; - break; - case sheet::GeneralFunction_MAX: - eSubTotal = SUBTOTAL_FUNC_MAX; - break; - case sheet::GeneralFunction_MIN: - eSubTotal = SUBTOTAL_FUNC_MIN; - break; - case sheet::GeneralFunction_PRODUCT: - eSubTotal = SUBTOTAL_FUNC_PROD; - break; - case sheet::GeneralFunction_COUNTNUMS: - eSubTotal = SUBTOTAL_FUNC_CNT; - break; - case sheet::GeneralFunction_STDEV: - eSubTotal = SUBTOTAL_FUNC_STD; - break; - case sheet::GeneralFunction_STDEVP: - eSubTotal = SUBTOTAL_FUNC_STDP; - break; - case sheet::GeneralFunction_VAR: - eSubTotal = SUBTOTAL_FUNC_VAR; - break; - case sheet::GeneralFunction_VARP: - eSubTotal = SUBTOTAL_FUNC_VARP; - break; - - case sheet::GeneralFunction_NONE: - case sheet::GeneralFunction_AUTO: - default: - eSubTotal = SUBTOTAL_FUNC_NONE; - break; - } - return eSubTotal; -} - -//------------------------------------------------------------------------ - -const ::editeng::SvxBorderLine* ScHelperFunctions::GetBorderLine( ::editeng::SvxBorderLine& rLine, const table::BorderLine& rStruct ) -{ - // Calc needs Twips, and there are 1/100mm in the Uno structure - const table::BorderLine2& rBorder2 = static_cast< const table::BorderLine2& >( rStruct ); - rLine.SetStyle( ::editeng::SvxBorderStyle( rBorder2.LineStyle ) ); - rLine.GuessLinesWidths( rLine.GetStyle(), - (sal_uInt16)HMMToTwips( rStruct.OuterLineWidth ), - (sal_uInt16)HMMToTwips( rStruct.InnerLineWidth ), - (sal_uInt16)HMMToTwips( rStruct.LineDistance ) ); - rLine.SetColor( ColorData( rStruct.Color ) ); - - if ( rLine.GetOutWidth() || rLine.GetInWidth() || rLine.GetDistance() ) - return &rLine; - else - return NULL; -} - -void ScHelperFunctions::FillBoxItems( SvxBoxItem& rOuter, SvxBoxInfoItem& rInner, const table::TableBorder& rBorder ) -{ - ::editeng::SvxBorderLine aLine; - rOuter.SetDistance( (sal_uInt16)HMMToTwips( rBorder.Distance ) ); - rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.TopLine ), BOX_LINE_TOP ); - rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.BottomLine ), BOX_LINE_BOTTOM ); - rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.LeftLine ), BOX_LINE_LEFT ); - rOuter.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.RightLine ), BOX_LINE_RIGHT ); - rInner.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.HorizontalLine ), BOXINFO_LINE_HORI ); - rInner.SetLine( ScHelperFunctions::GetBorderLine( aLine, rBorder.VerticalLine ), BOXINFO_LINE_VERT ); - rInner.SetValid( VALID_TOP, rBorder.IsTopLineValid ); - rInner.SetValid( VALID_BOTTOM, rBorder.IsBottomLineValid ); - rInner.SetValid( VALID_LEFT, rBorder.IsLeftLineValid ); - rInner.SetValid( VALID_RIGHT, rBorder.IsRightLineValid ); - rInner.SetValid( VALID_HORI, rBorder.IsHorizontalLineValid ); - rInner.SetValid( VALID_VERT, rBorder.IsVerticalLineValid ); - rInner.SetValid( VALID_DISTANCE, rBorder.IsDistanceValid ); - rInner.SetTable( sal_True ); -} - -void ScHelperFunctions::FillBorderLine( table::BorderLine& rStruct, const ::editeng::SvxBorderLine* pLine ) -{ - if (pLine) - { - rStruct.Color = pLine->GetColor().GetColor(); - rStruct.InnerLineWidth = (sal_Int16)TwipsToHMM( pLine->GetInWidth() ); - rStruct.OuterLineWidth = (sal_Int16)TwipsToHMM( pLine->GetOutWidth() ); - rStruct.LineDistance = (sal_Int16)TwipsToHMM( pLine->GetDistance() ); - } - else - rStruct.Color = rStruct.InnerLineWidth = - rStruct.OuterLineWidth = rStruct.LineDistance = 0; -} - -void ScHelperFunctions::FillTableBorder( table::TableBorder& rBorder, - const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner ) -{ - ScHelperFunctions::FillBorderLine( rBorder.TopLine, rOuter.GetTop() ); - ScHelperFunctions::FillBorderLine( rBorder.BottomLine, rOuter.GetBottom() ); - ScHelperFunctions::FillBorderLine( rBorder.LeftLine, rOuter.GetLeft() ); - ScHelperFunctions::FillBorderLine( rBorder.RightLine, rOuter.GetRight() ); - ScHelperFunctions::FillBorderLine( rBorder.HorizontalLine, rInner.GetHori() ); - ScHelperFunctions::FillBorderLine( rBorder.VerticalLine, rInner.GetVert() ); - - rBorder.Distance = rOuter.GetDistance(); - rBorder.IsTopLineValid = rInner.IsValid(VALID_TOP); - rBorder.IsBottomLineValid = rInner.IsValid(VALID_BOTTOM); - rBorder.IsLeftLineValid = rInner.IsValid(VALID_LEFT); - rBorder.IsRightLineValid = rInner.IsValid(VALID_RIGHT); - rBorder.IsHorizontalLineValid = rInner.IsValid(VALID_HORI); - rBorder.IsVerticalLineValid = rInner.IsValid(VALID_VERT); - rBorder.IsDistanceValid = rInner.IsValid(VALID_DISTANCE); -} - -//------------------------------------------------------------------------ - -//! lcl_ApplyBorder nach docfunc verschieben! - -void ScHelperFunctions::ApplyBorder( ScDocShell* pDocShell, const ScRangeList& rRanges, - const SvxBoxItem& rOuter, const SvxBoxInfoItem& rInner ) -{ - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Bool bUndo(pDoc->IsUndoEnabled()); - ScDocument* pUndoDoc = NULL; - if (bUndo) - pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - size_t nCount = rRanges.size(); - for (size_t i = 0; i < nCount; ++i) - { - ScRange aRange( *rRanges[ i ] ); - SCTAB nTab = aRange.aStart.Tab(); - - if (bUndo) - { - if ( i==0 ) - pUndoDoc->InitUndo( pDoc, nTab, nTab ); - else - pUndoDoc->AddUndoTab( nTab, nTab ); - pDoc->CopyToDocument( aRange, IDF_ATTRIB, false, pUndoDoc ); - } - - ScMarkData aMark; - aMark.SetMarkArea( aRange ); - aMark.SelectTable( nTab, sal_True ); - - pDoc->ApplySelectionFrame( aMark, &rOuter, &rInner ); - // RowHeight bei Umrandung alleine nicht noetig - } - - if (bUndo) - { - pDocShell->GetUndoManager()->AddUndoAction( - new ScUndoBorder( pDocShell, rRanges, pUndoDoc, rOuter, rInner ) ); - } - - for (size_t i = 0; i < nCount; ++i ) - pDocShell->PostPaint( *rRanges[ i ], PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE ); - - pDocShell->SetDocumentModified(); -} - -//! move lcl_PutDataArray to docfunc? -//! merge loop with ScFunctionAccess::callFunction - -sal_Bool lcl_PutDataArray( ScDocShell& rDocShell, const ScRange& rRange, - const uno::Sequence< uno::Sequence<uno::Any> >& aData ) -{ - ScDocument* pDoc = rDocShell.GetDocument(); - SCTAB nTab = rRange.aStart.Tab(); - SCCOL nStartCol = rRange.aStart.Col(); - SCROW nStartRow = rRange.aStart.Row(); - SCCOL nEndCol = rRange.aEnd.Col(); - SCROW nEndRow = rRange.aEnd.Row(); - sal_Bool bUndo(pDoc->IsUndoEnabled()); - - if ( !pDoc->IsBlockEditable( nTab, nStartCol,nStartRow, nEndCol,nEndRow ) ) - { - //! error message - return false; - } - - long nCols = 0; - long nRows = aData.getLength(); - const uno::Sequence<uno::Any>* pArray = aData.getConstArray(); - if ( nRows ) - nCols = pArray[0].getLength(); - - if ( nCols != nEndCol-nStartCol+1 || nRows != nEndRow-nStartRow+1 ) - { - //! error message? - return false; - } - - ScDocument* pUndoDoc = NULL; - if ( bUndo ) - { - pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - pUndoDoc->InitUndo( pDoc, nTab, nTab ); - pDoc->CopyToDocument( rRange, IDF_CONTENTS|IDF_NOCAPTIONS, false, pUndoDoc ); - } - - pDoc->DeleteAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, IDF_CONTENTS ); - - sal_Bool bError = false; - SCROW nDocRow = nStartRow; - for (long nRow=0; nRow<nRows; nRow++) - { - const uno::Sequence<uno::Any>& rColSeq = pArray[nRow]; - if ( rColSeq.getLength() == nCols ) - { - SCCOL nDocCol = nStartCol; - const uno::Any* pColArr = rColSeq.getConstArray(); - for (long nCol=0; nCol<nCols; nCol++) - { - const uno::Any& rElement = pColArr[nCol]; - uno::TypeClass eElemClass = rElement.getValueTypeClass(); - if ( eElemClass == uno::TypeClass_VOID ) - { - // void = "no value" - pDoc->SetError( nDocCol, nDocRow, nTab, NOTAVAILABLE ); - } - else if ( eElemClass == uno::TypeClass_BYTE || - eElemClass == uno::TypeClass_SHORT || - eElemClass == uno::TypeClass_UNSIGNED_SHORT || - eElemClass == uno::TypeClass_LONG || - eElemClass == uno::TypeClass_UNSIGNED_LONG || - eElemClass == uno::TypeClass_FLOAT || - eElemClass == uno::TypeClass_DOUBLE ) - { - // accept integer types because Basic passes a floating point - // variable as byte, short or long if it's an integer number. - double fVal(0.0); - rElement >>= fVal; - pDoc->SetValue( nDocCol, nDocRow, nTab, fVal ); - } - else if ( eElemClass == uno::TypeClass_STRING ) - { - rtl::OUString aUStr; - rElement >>= aUStr; - if ( aUStr.getLength() ) - pDoc->PutCell( nDocCol, nDocRow, nTab, new ScStringCell( aUStr ) ); - } - else - bError = sal_True; // invalid type - - ++nDocCol; - } - } - else - bError = sal_True; // wrong size - - ++nDocRow; - } - - sal_Bool bHeight = rDocShell.AdjustRowHeight( nStartRow, nEndRow, nTab ); - - if ( pUndoDoc ) - { - ScMarkData aDestMark; - aDestMark.SelectOneTable( nTab ); - rDocShell.GetUndoManager()->AddUndoAction( - new ScUndoPaste( &rDocShell, - nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab, aDestMark, - pUndoDoc, NULL, IDF_CONTENTS, NULL,NULL,NULL,NULL, false ) ); - } - - if (!bHeight) - rDocShell.PostPaint( rRange, PAINT_GRID ); // AdjustRowHeight may have painted already - - rDocShell.SetDocumentModified(); - - return !bError; -} - -sal_Bool lcl_PutFormulaArray( ScDocShell& rDocShell, const ScRange& rRange, - const uno::Sequence< uno::Sequence<rtl::OUString> >& aData, - const ::rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) -{ - ScDocument* pDoc = rDocShell.GetDocument(); - SCTAB nTab = rRange.aStart.Tab(); - SCCOL nStartCol = rRange.aStart.Col(); - SCROW nStartRow = rRange.aStart.Row(); - SCCOL nEndCol = rRange.aEnd.Col(); - SCROW nEndRow = rRange.aEnd.Row(); - sal_Bool bUndo(pDoc->IsUndoEnabled()); - - if ( !pDoc->IsBlockEditable( nTab, nStartCol,nStartRow, nEndCol,nEndRow ) ) - { - //! error message - return false; - } - - long nCols = 0; - long nRows = aData.getLength(); - const uno::Sequence<rtl::OUString>* pArray = aData.getConstArray(); - if ( nRows ) - nCols = pArray[0].getLength(); - - if ( nCols != nEndCol-nStartCol+1 || nRows != nEndRow-nStartRow+1 ) - { - //! error message? - return false; - } - - ScDocument* pUndoDoc = NULL; - if ( bUndo ) - { - pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - pUndoDoc->InitUndo( pDoc, nTab, nTab ); - pDoc->CopyToDocument( rRange, IDF_CONTENTS, false, pUndoDoc ); - } - - pDoc->DeleteAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, IDF_CONTENTS ); - - ScDocFunc aFunc( rDocShell ); // for InterpretEnglishString - - sal_Bool bError = false; - SCROW nDocRow = nStartRow; - for (long nRow=0; nRow<nRows; nRow++) - { - const uno::Sequence<rtl::OUString>& rColSeq = pArray[nRow]; - if ( rColSeq.getLength() == nCols ) - { - SCCOL nDocCol = nStartCol; - const rtl::OUString* pColArr = rColSeq.getConstArray(); - for (long nCol=0; nCol<nCols; nCol++) - { - String aText(pColArr[nCol]); - ScAddress aPos( nDocCol, nDocRow, nTab ); - ScBaseCell* pNewCell = aFunc.InterpretEnglishString( aPos, aText, rFormulaNmsp, eGrammar ); - pDoc->PutCell( aPos, pNewCell ); - - ++nDocCol; - } - } - else - bError = sal_True; // wrong size - - ++nDocRow; - } - - sal_Bool bHeight = rDocShell.AdjustRowHeight( nStartRow, nEndRow, nTab ); - - if ( pUndoDoc ) - { - ScMarkData aDestMark; - aDestMark.SelectOneTable( nTab ); - rDocShell.GetUndoManager()->AddUndoAction( - new ScUndoPaste( &rDocShell, - nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab, aDestMark, - pUndoDoc, NULL, IDF_CONTENTS, NULL,NULL,NULL,NULL, false ) ); - } - - if (!bHeight) - rDocShell.PostPaint( rRange, PAINT_GRID ); // AdjustRowHeight may have painted already - - rDocShell.SetDocumentModified(); - - return !bError; -} - -// used in ScCellRangeObj::getFormulaArray and ScCellObj::GetInputString_Impl -String lcl_GetInputString( ScDocument* pDoc, const ScAddress& rPosition, sal_Bool bEnglish ) -{ - String aVal; - if ( pDoc ) - { - ScBaseCell* pCell = pDoc->GetCell( rPosition ); - if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE ) - { - CellType eType = pCell->GetCellType(); - if ( eType == CELLTYPE_FORMULA ) - { - ScFormulaCell* pForm = (ScFormulaCell*)pCell; - pForm->GetFormula( aVal,formula::FormulaGrammar::mapAPItoGrammar( bEnglish, false)); - } - else - { - SvNumberFormatter* pFormatter = bEnglish ? ScGlobal::GetEnglishFormatter() : - pDoc->GetFormatTable(); - // Since the English formatter was constructed with - // LANGUAGE_ENGLISH_US the "General" format has index key 0, - // we don't have to query. - sal_uInt32 nNumFmt = bEnglish ? - 0 : - pDoc->GetNumberFormat( rPosition ); - - if ( eType == CELLTYPE_EDIT ) - { - // GetString an der EditCell macht Leerzeichen aus Umbruechen, - // hier werden die Umbrueche aber gebraucht - const EditTextObject* pData = ((ScEditCell*)pCell)->GetData(); - if (pData) - { - EditEngine& rEngine = pDoc->GetEditEngine(); - rEngine.SetText( *pData ); - aVal = rEngine.GetText( LINEEND_LF ); - } - } - else - ScCellFormat::GetInputString( pCell, nNumFmt, aVal, *pFormatter ); - - // ggf. ein ' davorhaengen wie in ScTabViewShell::UpdateInputHandler - if ( eType == CELLTYPE_STRING || eType == CELLTYPE_EDIT ) - { - double fDummy; - sal_Bool bIsNumberFormat(pFormatter->IsNumberFormat(aVal, nNumFmt, fDummy)); - if ( bIsNumberFormat ) - aVal.Insert('\'',0); - else if ( aVal.Len() && aVal.GetChar(0) == '\'' ) - { - // if the string starts with a "'", add another one because setFormula - // strips one (like text input, except for "text" number formats) - if ( bEnglish || ( pFormatter->GetType(nNumFmt) != NUMBERFORMAT_TEXT ) ) - aVal.Insert('\'',0); - } - } - } - } - } - return aVal; -} - -//------------------------------------------------------------------------ - -ScCellRangesBase::ScCellRangesBase(ScDocShell* pDocSh, const ScRange& rR) : - pPropSet(lcl_GetCellsPropertySet()), - pDocShell( pDocSh ), - pValueListener( NULL ), - pCurrentFlat( NULL ), - pCurrentDeep( NULL ), - pCurrentDataSet( NULL ), - pNoDfltCurrentDataSet( NULL ), - pMarkData( NULL ), - nObjectId( 0 ), - bChartColAsHdr( false ), - bChartRowAsHdr( false ), - bCursorOnly( false ), - bGotDataChangedHint( false ), - aValueListeners( 0 ) -{ - ScRange aCellRange(rR); - aCellRange.Justify(); - aRanges.Append( aCellRange ); - - if (pDocShell) // Null if created with createInstance - { - ScDocument* pDoc = pDocShell->GetDocument(); - pDoc->AddUnoObject(*this); - nObjectId = pDoc->GetNewUnoId(); - } -} - -ScCellRangesBase::ScCellRangesBase(ScDocShell* pDocSh, const ScRangeList& rR) : - pPropSet(lcl_GetCellsPropertySet()), - pDocShell( pDocSh ), - pValueListener( NULL ), - pCurrentFlat( NULL ), - pCurrentDeep( NULL ), - pCurrentDataSet( NULL ), - pNoDfltCurrentDataSet( NULL ), - pMarkData( NULL ), - aRanges( rR ), - nObjectId( 0 ), - bChartColAsHdr( false ), - bChartRowAsHdr( false ), - bCursorOnly( false ), - bGotDataChangedHint( false ), - aValueListeners( 0 ) -{ - if (pDocShell) // Null if created with createInstance - { - ScDocument* pDoc = pDocShell->GetDocument(); - pDoc->AddUnoObject(*this); - nObjectId = pDoc->GetNewUnoId(); - } -} - -ScCellRangesBase::~ScCellRangesBase() -{ - // call RemoveUnoObject first, so no notification can happen - // during ForgetCurrentAttrs - - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); - - ForgetCurrentAttrs(); - ForgetMarkData(); - - delete pValueListener; - - //! XChartDataChangeEventListener abmelden ?? - //! (ChartCollection haelt dann auch dieses Objekt fest!) -} - -void ScCellRangesBase::ForgetCurrentAttrs() -{ - delete pCurrentFlat; - delete pCurrentDeep; - delete pCurrentDataSet; - delete pNoDfltCurrentDataSet; - pCurrentFlat = NULL; - pCurrentDeep = NULL; - pCurrentDataSet = NULL; - pNoDfltCurrentDataSet = NULL; - - // #i62483# pMarkData can remain unchanged, is deleted only if the range changes (RefChanged) -} - -void ScCellRangesBase::ForgetMarkData() -{ - delete pMarkData; - pMarkData = NULL; -} - -const ScPatternAttr* ScCellRangesBase::GetCurrentAttrsFlat() -{ - // get and cache direct cell attributes for this object's range - - if ( !pCurrentFlat && pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - pCurrentFlat = pDoc->CreateSelectionPattern( *GetMarkData(), false ); - } - return pCurrentFlat; -} - -const ScPatternAttr* ScCellRangesBase::GetCurrentAttrsDeep() -{ - // get and cache cell attributes (incl. styles) for this object's range - - if ( !pCurrentDeep && pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - pCurrentDeep = pDoc->CreateSelectionPattern( *GetMarkData(), sal_True ); - } - return pCurrentDeep; -} - -SfxItemSet* ScCellRangesBase::GetCurrentDataSet(bool bNoDflt) -{ - if(!pCurrentDataSet) - { - const ScPatternAttr* pPattern = GetCurrentAttrsDeep(); - if ( pPattern ) - { - // Dontcare durch Default ersetzen, damit man immer eine Reflection hat - pCurrentDataSet = new SfxItemSet( pPattern->GetItemSet() ); - pNoDfltCurrentDataSet = new SfxItemSet( pPattern->GetItemSet() ); - pCurrentDataSet->ClearInvalidItems(); - } - } - return bNoDflt ? pNoDfltCurrentDataSet : pCurrentDataSet; -} - -const ScMarkData* ScCellRangesBase::GetMarkData() -{ - if (!pMarkData) - { - pMarkData = new ScMarkData(); - pMarkData->MarkFromRangeList( aRanges, false ); - } - return pMarkData; -} - -void ScCellRangesBase::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint; - - ScDocument* pDoc = pDocShell->GetDocument(); - ScRangeList* pUndoRanges = NULL; - if ( pDoc->HasUnoRefUndo() ) - pUndoRanges = new ScRangeList( aRanges ); - - if ( aRanges.UpdateReference( rRef.GetMode(), pDoc, rRef.GetRange(), - rRef.GetDx(), rRef.GetDy(), rRef.GetDz() ) ) - { - // i#90076; the object "this" was destroyed after calling ScTableSheetObj::getImplementation - // this hack make sure that the object lives a bit longer - uno::Reference<uno::XInterface> xInterface((cppu::OWeakObject*)this, uno::UNO_QUERY); - if ( rRef.GetMode() == URM_INSDEL - && aRanges.size() == 1 - && ScTableSheetObj::getImplementation( xInterface ) - ) - { - // #101755#; the range size of a sheet does not change - ScRange* pR = aRanges.front(); - if (pR) - { - pR->aStart.SetCol(0); - pR->aStart.SetRow(0); - pR->aEnd.SetCol(MAXCOL); - pR->aEnd.SetRow(MAXROW); - } - } - RefChanged(); - - // any change of the range address is broadcast to value (modify) listeners - if ( aValueListeners.Count() ) - bGotDataChangedHint = sal_True; - - if ( pUndoRanges ) - pDoc->AddUnoRefChange( nObjectId, *pUndoRanges ); - } - - delete pUndoRanges; - } - else if ( rHint.ISA( SfxSimpleHint ) ) - { - sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); - if ( nId == SFX_HINT_DYING ) - { - ForgetCurrentAttrs(); - pDocShell = NULL; // invalid - - if ( aValueListeners.Count() != 0 ) - { - // dispose listeners - - lang::EventObject aEvent; - aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); - for ( sal_uInt16 n=0; n<aValueListeners.Count(); n++ ) - (*aValueListeners[n])->disposing( aEvent ); - - aValueListeners.DeleteAndDestroy( 0, aValueListeners.Count() ); - - // The listeners can't have the last ref to this, as it's still held - // by the DocShell. - } - } - else if ( nId == SFX_HINT_DATACHANGED ) - { - // document content changed -> forget cached attributes - ForgetCurrentAttrs(); - - if ( bGotDataChangedHint && pDocShell ) - { - // This object was notified of content changes, so one call - // for each listener is generated now. - // The calls can't be executed directly because the document's - // UNO broadcaster list must not be modified. - // Instead, add to the document's list of listener calls, - // which will be executed directly after the broadcast of - // SFX_HINT_DATACHANGED. - - lang::EventObject aEvent; - aEvent.Source.set((cppu::OWeakObject*)this); - - // the EventObject holds a Ref to this object until after the listener calls - - ScDocument* pDoc = pDocShell->GetDocument(); - for ( sal_uInt16 n=0; n<aValueListeners.Count(); n++ ) - pDoc->AddUnoListenerCall( *aValueListeners[n], aEvent ); - - bGotDataChangedHint = false; - } - } - else if ( nId == SC_HINT_CALCALL ) - { - // broadcast from DoHardRecalc - set bGotDataChangedHint - // (SFX_HINT_DATACHANGED follows separately) - - if ( aValueListeners.Count() ) - bGotDataChangedHint = sal_True; - } - } - else if ( rHint.ISA( ScUnoRefUndoHint ) ) - { - const ScUnoRefUndoHint& rUndoHint = static_cast<const ScUnoRefUndoHint&>(rHint); - if ( rUndoHint.GetObjectId() == nObjectId ) - { - // restore ranges from hint - - aRanges = rUndoHint.GetRanges(); - - RefChanged(); - if ( aValueListeners.Count() ) - bGotDataChangedHint = sal_True; // need to broadcast the undo, too - } - } -} - -void ScCellRangesBase::RefChanged() -{ - //! adjust XChartDataChangeEventListener - - if ( pValueListener && aValueListeners.Count() != 0 ) - { - pValueListener->EndListeningAll(); - - ScDocument* pDoc = pDocShell->GetDocument(); - for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i ) - pDoc->StartListeningArea( *aRanges[ i ], pValueListener ); - } - - ForgetCurrentAttrs(); - ForgetMarkData(); -} - -ScDocument* ScCellRangesBase::GetDocument() const -{ - if (pDocShell) - return pDocShell->GetDocument(); - else - return NULL; -} - -void ScCellRangesBase::InitInsertRange(ScDocShell* pDocSh, const ScRange& rR) -{ - if ( !pDocShell && pDocSh ) - { - pDocShell = pDocSh; - - ScRange aCellRange(rR); - aCellRange.Justify(); - aRanges.RemoveAll(); - aRanges.Append( aCellRange ); - - pDocShell->GetDocument()->AddUnoObject(*this); - - RefChanged(); // Range im Range-Objekt anpassen - } -} - -void ScCellRangesBase::AddRange(const ScRange& rRange, const sal_Bool bMergeRanges) -{ - if (bMergeRanges) - aRanges.Join(rRange); - else - aRanges.Append(rRange); - RefChanged(); -} - -void ScCellRangesBase::SetNewRange(const ScRange& rNew) -{ - ScRange aCellRange(rNew); - aCellRange.Justify(); - - aRanges.RemoveAll(); - aRanges.Append( aCellRange ); - RefChanged(); -} - -void ScCellRangesBase::SetNewRanges(const ScRangeList& rNew) -{ - aRanges = rNew; - RefChanged(); -} - -void ScCellRangesBase::SetCursorOnly( sal_Bool bSet ) -{ - // set for a selection object that is created from the cursor position - // without anything selected (may contain several sheets) - - bCursorOnly = bSet; -} - -uno::Any SAL_CALL ScCellRangesBase::queryInterface( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( beans::XPropertySet ) - SC_QUERYINTERFACE( beans::XMultiPropertySet ) - SC_QUERYINTERFACE( beans::XTolerantMultiPropertySet ) - SC_QUERYINTERFACE( beans::XPropertyState ) - SC_QUERYINTERFACE( sheet::XSheetOperation ) - SC_QUERYINTERFACE( chart::XChartDataArray ) - SC_QUERYINTERFACE( chart::XChartData ) - SC_QUERYINTERFACE( util::XIndent ) - SC_QUERYINTERFACE( sheet::XCellRangesQuery ) - SC_QUERYINTERFACE( sheet::XFormulaQuery ) - SC_QUERYINTERFACE( util::XReplaceable ) - SC_QUERYINTERFACE( util::XSearchable ) - SC_QUERYINTERFACE( util::XModifyBroadcaster ) - SC_QUERYINTERFACE( lang::XServiceInfo ) - SC_QUERYINTERFACE( lang::XUnoTunnel ) - SC_QUERYINTERFACE( lang::XTypeProvider ) - - return OWeakObject::queryInterface( rType ); -} - -void SAL_CALL ScCellRangesBase::acquire() throw() -{ - OWeakObject::acquire(); -} - -void SAL_CALL ScCellRangesBase::release() throw() -{ - OWeakObject::release(); -} - -uno::Sequence<uno::Type> SAL_CALL ScCellRangesBase::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - aTypes.realloc(13); - uno::Type* pPtr = aTypes.getArray(); - pPtr[0] = getCppuType((const uno::Reference<beans::XPropertySet>*)0); - pPtr[1] = getCppuType((const uno::Reference<beans::XMultiPropertySet>*)0); - pPtr[2] = getCppuType((const uno::Reference<beans::XPropertyState>*)0); - pPtr[3] = getCppuType((const uno::Reference<sheet::XSheetOperation>*)0); - pPtr[4] = getCppuType((const uno::Reference<chart::XChartDataArray>*)0); - pPtr[5] = getCppuType((const uno::Reference<util::XIndent>*)0); - pPtr[6] = getCppuType((const uno::Reference<sheet::XCellRangesQuery>*)0); - pPtr[7] = getCppuType((const uno::Reference<sheet::XFormulaQuery>*)0); - pPtr[8] = getCppuType((const uno::Reference<util::XReplaceable>*)0); - pPtr[9] = getCppuType((const uno::Reference<util::XModifyBroadcaster>*)0); - pPtr[10]= getCppuType((const uno::Reference<lang::XServiceInfo>*)0); - pPtr[11]= getCppuType((const uno::Reference<lang::XUnoTunnel>*)0); - pPtr[12]= getCppuType((const uno::Reference<lang::XTypeProvider>*)0); - } - return aTypes; -} - -namespace -{ - class theScCellRangesBaseImplementationId : public rtl::Static< UnoTunnelIdInit, theScCellRangesBaseImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScCellRangesBase::getImplementationId() - throw(uno::RuntimeException) -{ - return theScCellRangesBaseImplementationId::get().getSeq(); -} - -// --- - -void ScCellRangesBase::PaintRanges_Impl( sal_uInt16 nPart ) -{ - for (size_t i = 0, nCount = aRanges.size(); i < nCount; ++i) - pDocShell->PostPaint( *aRanges[ i ], nPart ); -} - -// XSheetOperation - -double SAL_CALL ScCellRangesBase::computeFunction( sheet::GeneralFunction nFunction ) - throw(uno::Exception, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScMarkData aMark(*GetMarkData()); - aMark.MarkToSimple(); - if (!aMark.IsMarked()) - aMark.SetMarkNegative(sal_True); // um Dummy Position angeben zu koennen - - ScAddress aDummy; // wenn nicht Marked, ignoriert wegen Negative - double fVal; - ScSubTotalFunc eFunc = lcl_SummaryToSubTotal( nFunction ); - ScDocument* pDoc = pDocShell->GetDocument(); - if ( !pDoc->GetSelectionFunction( eFunc, aDummy, aMark, fVal ) ) - { - throw uno::RuntimeException(); //! own exception? - } - - return fVal; -} - -void SAL_CALL ScCellRangesBase::clearContents( sal_Int32 nContentFlags ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( !aRanges.empty() ) - { - // only for clearContents: EDITATTR is only used if no contents are deleted - sal_uInt16 nDelFlags = static_cast< sal_uInt16 >( nContentFlags & IDF_ALL ); - if ( ( nContentFlags & IDF_EDITATTR ) && ( nContentFlags & IDF_CONTENTS ) == 0 ) - nDelFlags |= IDF_EDITATTR; - - ScDocFunc aFunc(*pDocShell); - aFunc.DeleteContents( *GetMarkData(), nDelFlags, sal_True, sal_True ); - } - // sonst ist nichts zu tun -} - -// XPropertyState - -const SfxItemPropertyMap* ScCellRangesBase::GetItemPropertyMap() -{ - return pPropSet->getPropertyMap(); -} - -void lcl_GetPropertyWhich( const SfxItemPropertySimpleEntry* pEntry, - sal_uInt16& rItemWhich ) -{ - // Which-ID des betroffenen Items, auch wenn das Item die Property - // nicht alleine behandeln kann - if ( pEntry ) - { - if ( IsScItemWid( pEntry->nWID ) ) - rItemWhich = pEntry->nWID; - else - switch ( pEntry->nWID ) - { - case SC_WID_UNO_TBLBORD: - rItemWhich = ATTR_BORDER; - break; - case SC_WID_UNO_CONDFMT: - case SC_WID_UNO_CONDLOC: - case SC_WID_UNO_CONDXML: - rItemWhich = ATTR_CONDITIONAL; - break; - case SC_WID_UNO_VALIDAT: - case SC_WID_UNO_VALILOC: - case SC_WID_UNO_VALIXML: - rItemWhich = ATTR_VALIDDATA; - break; - } - } - -} - -beans::PropertyState ScCellRangesBase::GetOnePropertyState( sal_uInt16 nItemWhich, const SfxItemPropertySimpleEntry* pEntry ) -{ - beans::PropertyState eRet = beans::PropertyState_DIRECT_VALUE; - if ( nItemWhich ) // item wid (from map or special case) - { - // For items that contain several properties (like background), - // "ambiguous" is returned too often here - - // for PropertyState, don't look at styles - const ScPatternAttr* pPattern = GetCurrentAttrsFlat(); - if ( pPattern ) - { - SfxItemState eState = pPattern->GetItemSet().GetItemState( nItemWhich, false ); - - if ( nItemWhich == ATTR_VALUE_FORMAT && eState == SFX_ITEM_DEFAULT ) - eState = pPattern->GetItemSet().GetItemState( ATTR_LANGUAGE_FORMAT, false ); - - if ( eState == SFX_ITEM_SET ) - eRet = beans::PropertyState_DIRECT_VALUE; - else if ( eState == SFX_ITEM_DEFAULT ) - eRet = beans::PropertyState_DEFAULT_VALUE; - else if ( eState == SFX_ITEM_DONTCARE ) - eRet = beans::PropertyState_AMBIGUOUS_VALUE; - else - { - OSL_FAIL("unbekannter ItemState"); - } - } - } - else if ( pEntry ) - { - if ( pEntry->nWID == SC_WID_UNO_CHCOLHDR || pEntry->nWID == SC_WID_UNO_CHROWHDR || pEntry->nWID == SC_WID_UNO_ABSNAME ) - eRet = beans::PropertyState_DIRECT_VALUE; - else if ( pEntry->nWID == SC_WID_UNO_CELLSTYL ) - { - // a style is always set, there's no default state - const ScStyleSheet* pStyle = pDocShell->GetDocument()->GetSelectionStyle(*GetMarkData()); - if (pStyle) - eRet = beans::PropertyState_DIRECT_VALUE; - else - eRet = beans::PropertyState_AMBIGUOUS_VALUE; - } - else if ( pEntry->nWID == SC_WID_UNO_NUMRULES ) - eRet = beans::PropertyState_DEFAULT_VALUE; // numbering rules are always default - } - return eRet; -} - -beans::PropertyState SAL_CALL ScCellRangesBase::getPropertyState( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( aRanges.empty() ) - throw uno::RuntimeException(); - - const SfxItemPropertyMap* pMap = GetItemPropertyMap(); // from derived class - sal_uInt16 nItemWhich = 0; - const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( aPropertyName ); - lcl_GetPropertyWhich( pEntry, nItemWhich ); - return GetOnePropertyState( nItemWhich, pEntry ); -} - -uno::Sequence<beans::PropertyState> SAL_CALL ScCellRangesBase::getPropertyStates( - const uno::Sequence<rtl::OUString>& aPropertyNames ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap(); // from derived class - - uno::Sequence<beans::PropertyState> aRet(aPropertyNames.getLength()); - beans::PropertyState* pStates = aRet.getArray(); - for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++) - { - sal_uInt16 nItemWhich = 0; - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyNames[i] ); - lcl_GetPropertyWhich( pEntry, nItemWhich ); - pStates[i] = GetOnePropertyState(nItemWhich, pEntry); - } - return aRet; -} - -void SAL_CALL ScCellRangesBase::setPropertyToDefault( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell ) - { - const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap(); // from derived class - sal_uInt16 nItemWhich = 0; - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyName ); - lcl_GetPropertyWhich( pEntry, nItemWhich ); - if ( nItemWhich ) // item wid (from map or special case) - { - if ( !aRanges.empty() ) // leer = nichts zu tun - { - ScDocFunc aFunc(*pDocShell); - - //! Bei Items, die mehrere Properties enthalten (z.B. Hintergrund) - //! wird hier zuviel zurueckgesetzt - -// //! for ATTR_ROTATE_VALUE, also reset ATTR_ORIENTATION? - - sal_uInt16 aWIDs[3]; - aWIDs[0] = nItemWhich; - if ( nItemWhich == ATTR_VALUE_FORMAT ) - { - aWIDs[1] = ATTR_LANGUAGE_FORMAT; // language for number formats - aWIDs[2] = 0; - } - else - aWIDs[1] = 0; - aFunc.ClearItems( *GetMarkData(), aWIDs, sal_True ); - } - } - else if ( pEntry ) - { - if ( pEntry->nWID == SC_WID_UNO_CHCOLHDR ) - bChartColAsHdr = false; - else if ( pEntry->nWID == SC_WID_UNO_CHROWHDR ) - bChartRowAsHdr = false; - else if ( pEntry->nWID == SC_WID_UNO_CELLSTYL ) - { - ScDocFunc aFunc(*pDocShell); - aFunc.ApplyStyle( *GetMarkData(), ScGlobal::GetRscString(STR_STYLENAME_STANDARD), sal_True, sal_True ); - } - } - } -} - -uno::Any SAL_CALL ScCellRangesBase::getPropertyDefault( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - //! mit getPropertyValue zusammenfassen - - SolarMutexGuard aGuard; - uno::Any aAny; - - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap(); // from derived class - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyName ); - if ( pEntry ) - { - if ( IsScItemWid( pEntry->nWID ) ) - { - const ScPatternAttr* pPattern = pDoc->GetDefPattern(); - if ( pPattern ) - { - const SfxItemSet& rSet = pPattern->GetItemSet(); - - switch ( pEntry->nWID ) // fuer Item-Spezial-Behandlungen - { - case ATTR_VALUE_FORMAT: - // default has no language set - aAny <<= (sal_Int32)( ((const SfxUInt32Item&)rSet.Get(pEntry->nWID)).GetValue() ); - break; - case ATTR_INDENT: - aAny <<= (sal_Int16)( TwipsToHMM(((const SfxUInt16Item&) - rSet.Get(pEntry->nWID)).GetValue()) ); - break; - default: - pPropSet->getPropertyValue(aPropertyName, rSet, aAny); - } - } - } - else - switch ( pEntry->nWID ) - { - case SC_WID_UNO_CHCOLHDR: - case SC_WID_UNO_CHROWHDR: - ScUnoHelpFunctions::SetBoolInAny( aAny, false ); - break; - case SC_WID_UNO_CELLSTYL: - aAny <<= rtl::OUString( ScStyleNameConversion::DisplayToProgrammaticName( - ScGlobal::GetRscString(STR_STYLENAME_STANDARD), SFX_STYLE_FAMILY_PARA ) ); - break; - case SC_WID_UNO_TBLBORD: - { - const ScPatternAttr* pPattern = pDoc->GetDefPattern(); - if ( pPattern ) - { - table::TableBorder aBorder; - ScHelperFunctions::FillTableBorder( aBorder, - (const SvxBoxItem&)pPattern->GetItem(ATTR_BORDER), - (const SvxBoxInfoItem&)pPattern->GetItem(ATTR_BORDER_INNER) ); - aAny <<= aBorder; - } - } - break; - case SC_WID_UNO_CONDFMT: - case SC_WID_UNO_CONDLOC: - case SC_WID_UNO_CONDXML: - { - sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC ); - sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML ); - formula::FormulaGrammar::Grammar eGrammar = (bXML ? - pDoc->GetStorageGrammar() : - formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML)); - - aAny <<= uno::Reference<sheet::XSheetConditionalEntries>( - new ScTableConditionalFormat( pDoc, 0, eGrammar )); - } - break; - case SC_WID_UNO_VALIDAT: - case SC_WID_UNO_VALILOC: - case SC_WID_UNO_VALIXML: - { - sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC ); - sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML ); - formula::FormulaGrammar::Grammar eGrammar = (bXML ? - pDoc->GetStorageGrammar() : - formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML)); - - aAny <<= uno::Reference<beans::XPropertySet>( - new ScTableValidationObj( pDoc, 0, eGrammar )); - } - break; - case SC_WID_UNO_NUMRULES: - { - aAny <<= uno::Reference<container::XIndexReplace>(ScStyleObj::CreateEmptyNumberingRules()); - } - break; - } - } - } - - return aAny; -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellRangesBase::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( pPropSet->getPropertyMap() )); - return aRef; -} - -void lcl_SetCellProperty( const SfxItemPropertySimpleEntry& rEntry, const uno::Any& rValue, - ScPatternAttr& rPattern, ScDocument* pDoc, - sal_uInt16& rFirstItemId, sal_uInt16& rSecondItemId ) -{ - rFirstItemId = rEntry.nWID; - rSecondItemId = 0; - - SfxItemSet& rSet = rPattern.GetItemSet(); - switch ( rEntry.nWID ) - { - case ATTR_VALUE_FORMAT: - { - // language for number formats - SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); - sal_uLong nOldFormat = ((const SfxUInt32Item&)rSet.Get( ATTR_VALUE_FORMAT )).GetValue(); - LanguageType eOldLang = ((const SvxLanguageItem&)rSet.Get( ATTR_LANGUAGE_FORMAT )).GetLanguage(); - nOldFormat = pFormatter->GetFormatForLanguageIfBuiltIn( nOldFormat, eOldLang ); - - sal_Int32 nIntVal = 0; - if ( rValue >>= nIntVal ) - { - sal_uLong nNewFormat = (sal_uLong)nIntVal; - rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) ); - - const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewFormat ); - LanguageType eNewLang = - pNewEntry ? pNewEntry->GetLanguage() : LANGUAGE_DONTKNOW; - if ( eNewLang != eOldLang && eNewLang != LANGUAGE_DONTKNOW ) - { - rSet.Put( SvxLanguageItem( eNewLang, ATTR_LANGUAGE_FORMAT ) ); - - // if only language is changed, - // don't touch number format attribute - sal_uLong nNewMod = nNewFormat % SV_COUNTRY_LANGUAGE_OFFSET; - if ( nNewMod == ( nOldFormat % SV_COUNTRY_LANGUAGE_OFFSET ) && - nNewMod <= SV_MAX_ANZ_STANDARD_FORMATE ) - { - rFirstItemId = 0; // don't use ATTR_VALUE_FORMAT value - } - - rSecondItemId = ATTR_LANGUAGE_FORMAT; - } - } - else - throw lang::IllegalArgumentException(); - } - break; - case ATTR_INDENT: - { - sal_Int16 nIntVal = 0; - if ( rValue >>= nIntVal ) - rSet.Put( SfxUInt16Item( rEntry.nWID, (sal_uInt16)HMMToTwips(nIntVal) ) ); - else - throw lang::IllegalArgumentException(); - } - break; - case ATTR_ROTATE_VALUE: - { - sal_Int32 nRotVal = 0; - if ( rValue >>= nRotVal ) - { - // stored value is always between 0 and 360 deg. - nRotVal %= 36000; - if ( nRotVal < 0 ) - nRotVal += 36000; - - rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, nRotVal ) ); - } - else - throw lang::IllegalArgumentException(); - } - break; - case ATTR_STACKED: - { - table::CellOrientation eOrient; - if( rValue >>= eOrient ) - { - switch( eOrient ) - { - case table::CellOrientation_STANDARD: - rSet.Put( SfxBoolItem( ATTR_STACKED, false ) ); - break; - case table::CellOrientation_TOPBOTTOM: - rSet.Put( SfxBoolItem( ATTR_STACKED, false ) ); - rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 27000 ) ); - rSecondItemId = ATTR_ROTATE_VALUE; - break; - case table::CellOrientation_BOTTOMTOP: - rSet.Put( SfxBoolItem( ATTR_STACKED, false ) ); - rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 9000 ) ); - rSecondItemId = ATTR_ROTATE_VALUE; - break; - case table::CellOrientation_STACKED: - rSet.Put( SfxBoolItem( ATTR_STACKED, sal_True ) ); - break; - default: - { - // added to avoid warnings - } - } - } - } - break; - default: - { - lcl_GetCellsPropertySet()->setPropertyValue(rEntry, rValue, rSet); - } - } -} - -void SAL_CALL ScCellRangesBase::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( !pDocShell || aRanges.empty() ) - throw uno::RuntimeException(); - - const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap(); // from derived class - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyName ); - if ( !pEntry ) - throw beans::UnknownPropertyException(); - - SetOnePropertyValue( pEntry, aValue ); -} - -void ScCellRangesBase::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - if ( pEntry ) - { - if ( IsScItemWid( pEntry->nWID ) ) - { - if ( !aRanges.empty() ) // leer = nichts zu tun - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDocFunc aFunc(*pDocShell); - - // Fuer Teile von zusammengesetzten Items mit mehreren Properties (z.B. Hintergrund) - // muss vorher das alte Item aus dem Dokument geholt werden - //! Das kann hier aber nicht erkannt werden - //! -> eigenes Flag im PropertyMap-Eintrag, oder was ??? - //! Item direkt von einzelner Position im Bereich holen? - // ClearInvalidItems, damit auf jeden Fall ein Item vom richtigen Typ da ist - - ScPatternAttr aPattern( *GetCurrentAttrsDeep() ); - SfxItemSet& rSet = aPattern.GetItemSet(); - rSet.ClearInvalidItems(); - - sal_uInt16 nFirstItem, nSecondItem; - lcl_SetCellProperty( *pEntry, aValue, aPattern, pDoc, nFirstItem, nSecondItem ); - - for (sal_uInt16 nWhich = ATTR_PATTERN_START; nWhich <= ATTR_PATTERN_END; nWhich++) - if ( nWhich != nFirstItem && nWhich != nSecondItem ) - rSet.ClearItem(nWhich); - - aFunc.ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True ); - } - } - else // implemented here - switch ( pEntry->nWID ) - { - case EE_CHAR_ESCAPEMENT: // Specifically for xlsx import - { - sal_Int32 nValue(0); - aValue >>= nValue; - if( nValue ) - { - size_t n = aRanges.size(); - for( size_t i = 0; i < n; i++ ) - { - ScRange aRange( *aRanges[ i ] ); - /* TODO: Iterate through the range */ - ScAddress aAddr = aRange.aStart; - ScDocument *pDoc = pDocShell->GetDocument(); - ScBaseCell *pCell = pDoc->GetCell( aAddr ); - String aStr( pCell->GetStringData() ); - EditEngine aEngine( pDoc->GetEnginePool() ); - /* EE_CHAR_ESCAPEMENT seems to be set on the cell _only_ when - * there are no other attribs for the cell. - * So, it is safe to overwrite the complete attribute set. - * If there is a need - getting CellType and processing - * the attributes could be considered. - */ - SfxItemSet aAttr = aEngine.GetEmptyItemSet(); - aEngine.SetText( aStr ); - if( nValue < 0 ) // Subscript - aAttr.Put( SvxEscapementItem( SVX_ESCAPEMENT_SUBSCRIPT, EE_CHAR_ESCAPEMENT ) ); - else // Superscript - aAttr.Put( SvxEscapementItem( SVX_ESCAPEMENT_SUPERSCRIPT, EE_CHAR_ESCAPEMENT ) ); - aEngine.QuickSetAttribs( aAttr, ESelection( 0, 0, 0, aStr.Len())); - pDoc->PutCell( (aRanges[ 0 ])->aStart, new ScEditCell( aEngine.CreateTextObject(), pDoc, NULL ) ); - } - } - } - break; - case SC_WID_UNO_CHCOLHDR: - // chart header flags are set for this object, not stored with document - bChartColAsHdr = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - break; - case SC_WID_UNO_CHROWHDR: - bChartRowAsHdr = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - break; - case SC_WID_UNO_CELLSTYL: - { - rtl::OUString aStrVal; - aValue >>= aStrVal; - String aString(ScStyleNameConversion::ProgrammaticToDisplayName( - aStrVal, SFX_STYLE_FAMILY_PARA )); - ScDocFunc aFunc(*pDocShell); - aFunc.ApplyStyle( *GetMarkData(), aString, sal_True, sal_True ); - } - break; - case SC_WID_UNO_TBLBORD: - { - table::TableBorder aBorder; - if ( !aRanges.empty() && ( aValue >>= aBorder ) ) // empty = nothing to do - { - SvxBoxItem aOuter(ATTR_BORDER); - SvxBoxInfoItem aInner(ATTR_BORDER_INNER); - ScHelperFunctions::FillBoxItems( aOuter, aInner, aBorder ); - - ScHelperFunctions::ApplyBorder( pDocShell, aRanges, aOuter, aInner ); //! docfunc - } - } - break; - case SC_WID_UNO_CONDFMT: - case SC_WID_UNO_CONDLOC: - case SC_WID_UNO_CONDXML: - { - uno::Reference<sheet::XSheetConditionalEntries> xInterface(aValue, uno::UNO_QUERY); - if ( !aRanges.empty() && xInterface.is() ) // leer = nichts zu tun - { - ScTableConditionalFormat* pFormat = - ScTableConditionalFormat::getImplementation( xInterface ); - if (pFormat) - { - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC ); - sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML ); - formula::FormulaGrammar::Grammar eGrammar = (bXML ? - formula::FormulaGrammar::GRAM_UNSPECIFIED : - formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML)); - - ScConditionalFormat aNew( 0, pDoc ); // Index wird beim Einfuegen gesetzt - pFormat->FillFormat( aNew, pDoc, eGrammar ); - ScRangeListRef pRanges = new ScRangeList( aRanges ); - aNew.AddRangeInfo( pRanges ); - sal_uLong nIndex = pDoc->AddCondFormat( aNew ); - - ScDocFunc aFunc(*pDocShell); - - ScPatternAttr aPattern( pDoc->GetPool() ); - aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_CONDITIONAL, nIndex ) ); - aFunc.ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True ); - } - } - } - break; - case SC_WID_UNO_VALIDAT: - case SC_WID_UNO_VALILOC: - case SC_WID_UNO_VALIXML: - { - uno::Reference<beans::XPropertySet> xInterface(aValue, uno::UNO_QUERY); - if ( !aRanges.empty() && xInterface.is() ) // leer = nichts zu tun - { - ScTableValidationObj* pValidObj = - ScTableValidationObj::getImplementation( xInterface ); - if (pValidObj) - { - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC ); - sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML ); - formula::FormulaGrammar::Grammar eGrammar = (bXML ? - formula::FormulaGrammar::GRAM_UNSPECIFIED : - formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML)); - - ScValidationData* pNewData = - pValidObj->CreateValidationData( pDoc, eGrammar ); - sal_uLong nIndex = pDoc->AddValidationEntry( *pNewData ); - delete pNewData; - - ScDocFunc aFunc(*pDocShell); - - ScPatternAttr aPattern( pDoc->GetPool() ); - aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALIDDATA, nIndex ) ); - aFunc.ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True ); - } - } - } - break; - // SC_WID_UNO_NUMRULES is ignored... - } - } -} - -uno::Any SAL_CALL ScCellRangesBase::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( !pDocShell || aRanges.empty() ) - throw uno::RuntimeException(); - - const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap(); // from derived class - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyName ); - if ( !pEntry ) - throw beans::UnknownPropertyException(); - - uno::Any aAny; - GetOnePropertyValue( pEntry, aAny ); - return aAny; -} - -void ScCellRangesBase::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, - uno::Any& rAny ) - throw(uno::RuntimeException) -{ - if ( pEntry ) - { - if ( IsScItemWid( pEntry->nWID ) ) - { - SfxItemSet* pDataSet = GetCurrentDataSet(); - if ( pDataSet ) - { - switch ( pEntry->nWID ) // fuer Item-Spezial-Behandlungen - { - case ATTR_VALUE_FORMAT: - { - ScDocument* pDoc = pDocShell->GetDocument(); - - sal_uLong nOldFormat = ((const SfxUInt32Item&) - pDataSet->Get( ATTR_VALUE_FORMAT )).GetValue(); - LanguageType eOldLang = ((const SvxLanguageItem&) - pDataSet->Get( ATTR_LANGUAGE_FORMAT )).GetLanguage(); - nOldFormat = pDoc->GetFormatTable()-> - GetFormatForLanguageIfBuiltIn( nOldFormat, eOldLang ); - rAny <<= (sal_Int32)( nOldFormat ); - } - break; - case ATTR_INDENT: - rAny <<= (sal_Int16)( TwipsToHMM(((const SfxUInt16Item&) - pDataSet->Get(pEntry->nWID)).GetValue()) ); - break; - case ATTR_STACKED: - { - sal_Int32 nRot = ((const SfxInt32Item&)pDataSet->Get(ATTR_ROTATE_VALUE)).GetValue(); - sal_Bool bStacked = ((const SfxBoolItem&)pDataSet->Get(pEntry->nWID)).GetValue(); - SvxOrientationItem( nRot, bStacked, 0 ).QueryValue( rAny ); - } - break; - default: - pPropSet->getPropertyValue(*pEntry, *pDataSet, rAny); - } - } - } - else // implemented here - switch ( pEntry->nWID ) - { - case SC_WID_UNO_CHCOLHDR: - ScUnoHelpFunctions::SetBoolInAny( rAny, bChartColAsHdr ); - break; - case SC_WID_UNO_CHROWHDR: - ScUnoHelpFunctions::SetBoolInAny( rAny, bChartRowAsHdr ); - break; - case SC_WID_UNO_CELLSTYL: - { - String aStyleName; - const ScStyleSheet* pStyle = pDocShell->GetDocument()->GetSelectionStyle(*GetMarkData()); - if (pStyle) - aStyleName = pStyle->GetName(); - rAny <<= rtl::OUString( ScStyleNameConversion::DisplayToProgrammaticName( - aStyleName, SFX_STYLE_FAMILY_PARA ) ); - } - break; - case SC_WID_UNO_TBLBORD: - { - //! loop throgh all ranges - if ( !aRanges.empty() ) - { - const ScRange* pFirst = aRanges[ 0 ]; - SvxBoxItem aOuter(ATTR_BORDER); - SvxBoxInfoItem aInner(ATTR_BORDER_INNER); - - ScDocument* pDoc = pDocShell->GetDocument(); - ScMarkData aMark; - aMark.SetMarkArea( *pFirst ); - aMark.SelectTable( pFirst->aStart.Tab(), sal_True ); - pDoc->GetSelectionFrame( aMark, aOuter, aInner ); - - table::TableBorder aBorder; - ScHelperFunctions::FillTableBorder( aBorder, aOuter, aInner ); - rAny <<= aBorder; - } - } - break; - case SC_WID_UNO_CONDFMT: - case SC_WID_UNO_CONDLOC: - case SC_WID_UNO_CONDXML: - { - const ScPatternAttr* pPattern = GetCurrentAttrsDeep(); - if ( pPattern ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_CONDLOC ); - sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_CONDXML ); - formula::FormulaGrammar::Grammar eGrammar = (bXML ? - pDoc->GetStorageGrammar() : - formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML)); - sal_uLong nIndex = ((const SfxUInt32Item&) - pPattern->GetItem(ATTR_CONDITIONAL)).GetValue(); - rAny <<= uno::Reference<sheet::XSheetConditionalEntries>( - new ScTableConditionalFormat( pDoc, nIndex, eGrammar )); - } - } - break; - case SC_WID_UNO_VALIDAT: - case SC_WID_UNO_VALILOC: - case SC_WID_UNO_VALIXML: - { - const ScPatternAttr* pPattern = GetCurrentAttrsDeep(); - if ( pPattern ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Bool bEnglish = ( pEntry->nWID != SC_WID_UNO_VALILOC ); - sal_Bool bXML = ( pEntry->nWID == SC_WID_UNO_VALIXML ); - formula::FormulaGrammar::Grammar eGrammar = (bXML ? - pDoc->GetStorageGrammar() : - formula::FormulaGrammar::mapAPItoGrammar( bEnglish, bXML)); - sal_uLong nIndex = ((const SfxUInt32Item&) - pPattern->GetItem(ATTR_VALIDDATA)).GetValue(); - rAny <<= uno::Reference<beans::XPropertySet>( - new ScTableValidationObj( pDoc, nIndex, eGrammar )); - } - } - break; - case SC_WID_UNO_NUMRULES: - { - // always return empty numbering rules object - rAny <<= uno::Reference<container::XIndexReplace>(ScStyleObj::CreateEmptyNumberingRules()); - } - break; - case SC_WID_UNO_ABSNAME: - { - String sRet; - aRanges.Format(sRet, SCR_ABS_3D, pDocShell->GetDocument()); - rAny <<= rtl::OUString(sRet); - } - } - } -} - -void SAL_CALL ScCellRangesBase::addPropertyChangeListener( const rtl::OUString& /* aPropertyName */, - const uno::Reference<beans::XPropertyChangeListener>& /* aListener */) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( aRanges.empty() ) - throw uno::RuntimeException(); - - OSL_FAIL("not implemented"); -} - -void SAL_CALL ScCellRangesBase::removePropertyChangeListener( const rtl::OUString& /* aPropertyName */, - const uno::Reference<beans::XPropertyChangeListener>& /* aListener */) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( aRanges.empty() ) - throw uno::RuntimeException(); - - OSL_FAIL("not implemented"); -} - -void SAL_CALL ScCellRangesBase::addVetoableChangeListener( const rtl::OUString&, - const uno::Reference<beans::XVetoableChangeListener>&) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL("not implemented"); -} - -void SAL_CALL ScCellRangesBase::removeVetoableChangeListener( const rtl::OUString&, - const uno::Reference<beans::XVetoableChangeListener>&) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL("not implemented"); -} - -// XMultiPropertySet - -void SAL_CALL ScCellRangesBase::setPropertyValues( const uno::Sequence< rtl::OUString >& aPropertyNames, - const uno::Sequence< uno::Any >& aValues ) - throw (beans::PropertyVetoException, - lang::IllegalArgumentException, - lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Int32 nCount(aPropertyNames.getLength()); - sal_Int32 nValues(aValues.getLength()); - if (nCount != nValues) - throw lang::IllegalArgumentException(); - - if ( pDocShell && nCount ) - { - const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap(); // from derived class - const rtl::OUString* pNames = aPropertyNames.getConstArray(); - const uno::Any* pValues = aValues.getConstArray(); - - const SfxItemPropertySimpleEntry** pEntryArray = new const SfxItemPropertySimpleEntry*[nCount]; - - sal_Int32 i; - for(i = 0; i < nCount; i++) - { - // first loop: find all properties in map, but handle only CellStyle - // (CellStyle must be set before any other cell properties) - - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( pNames[i] ); - pEntryArray[i] = pEntry; - if (pEntry) - { - if ( pEntry->nWID == SC_WID_UNO_CELLSTYL ) - { - try - { - SetOnePropertyValue( pEntry, pValues[i] ); - } - catch ( lang::IllegalArgumentException& ) - { - OSL_FAIL("exception when setting cell style"); // not supposed to happen - } - } - } - } - - ScDocument* pDoc = pDocShell->GetDocument(); - ScPatternAttr* pOldPattern = NULL; - ScPatternAttr* pNewPattern = NULL; - - for(i = 0; i < nCount; i++) - { - // second loop: handle other properties - - const SfxItemPropertySimpleEntry* pEntry = pEntryArray[i]; - if ( pEntry ) - { - if ( IsScItemWid( pEntry->nWID ) ) // can be handled by SfxItemPropertySet - { - if ( !pOldPattern ) - { - pOldPattern = new ScPatternAttr( *GetCurrentAttrsDeep() ); - pOldPattern->GetItemSet().ClearInvalidItems(); - pNewPattern = new ScPatternAttr( pDoc->GetPool() ); - } - - // collect items in pNewPattern, apply with one call after the loop - - sal_uInt16 nFirstItem, nSecondItem; - lcl_SetCellProperty( *pEntry, pValues[i], *pOldPattern, pDoc, nFirstItem, nSecondItem ); - - // put only affected items into new set - if ( nFirstItem ) - pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nFirstItem ) ); - if ( nSecondItem ) - pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nSecondItem ) ); - } - else if ( pEntry->nWID != SC_WID_UNO_CELLSTYL ) // CellStyle is handled above - { - // call virtual method to set a single property - SetOnePropertyValue( pEntry, pValues[i] ); - } - } - } - - if ( pNewPattern && !aRanges.empty() ) - { - ScDocFunc aFunc(*pDocShell); - aFunc.ApplyAttributes( *GetMarkData(), *pNewPattern, sal_True, sal_True ); - } - - delete pNewPattern; - delete pOldPattern; - delete[] pEntryArray; - } -} - -uno::Sequence<uno::Any> SAL_CALL ScCellRangesBase::getPropertyValues( - const uno::Sequence< rtl::OUString >& aPropertyNames ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap(); // from derived class - - uno::Sequence<uno::Any> aRet(aPropertyNames.getLength()); - uno::Any* pProperties = aRet.getArray(); - for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++) - { - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyNames[i] ); - GetOnePropertyValue( pEntry, pProperties[i] ); - } - return aRet; -} - -void SAL_CALL ScCellRangesBase::addPropertiesChangeListener( const uno::Sequence< rtl::OUString >& /* aPropertyNames */, - const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ ) - throw (uno::RuntimeException) -{ - OSL_FAIL("not implemented"); -} - -void SAL_CALL ScCellRangesBase::removePropertiesChangeListener( const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ ) - throw (uno::RuntimeException) -{ - OSL_FAIL("not implemented"); -} - -void SAL_CALL ScCellRangesBase::firePropertiesChangeEvent( const uno::Sequence< rtl::OUString >& /* aPropertyNames */, - const uno::Reference< beans::XPropertiesChangeListener >& /* xListener */ ) - throw (uno::RuntimeException) -{ - OSL_FAIL("not implemented"); -} - -IMPL_LINK( ScCellRangesBase, ValueListenerHdl, SfxHint*, pHint ) -{ - if ( pDocShell && pHint && pHint->ISA( SfxSimpleHint ) && - ((const SfxSimpleHint*)pHint)->GetId() & (SC_HINT_DATACHANGED | SC_HINT_DYING) ) - { - // This may be called several times for a single change, if several formulas - // in the range are notified. So only a flag is set that is checked when - // SFX_HINT_DATACHANGED is received. - - bGotDataChangedHint = sal_True; - } - return 0; -} - -// XTolerantMultiPropertySet -uno::Sequence< beans::SetPropertyTolerantFailed > SAL_CALL ScCellRangesBase::setPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames, - const uno::Sequence< uno::Any >& aValues ) - throw (lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Int32 nCount(aPropertyNames.getLength()); - sal_Int32 nValues(aValues.getLength()); - if (nCount != nValues) - throw lang::IllegalArgumentException(); - - if ( pDocShell && nCount ) - { - uno::Sequence < beans::SetPropertyTolerantFailed > aReturns(nCount); - beans::SetPropertyTolerantFailed* pReturns = aReturns.getArray(); - - const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap(); // from derived class - const rtl::OUString* pNames = aPropertyNames.getConstArray(); - const uno::Any* pValues = aValues.getConstArray(); - - const SfxItemPropertySimpleEntry** pMapArray = new const SfxItemPropertySimpleEntry*[nCount]; - - sal_Int32 i; - for(i = 0; i < nCount; i++) - { - // first loop: find all properties in map, but handle only CellStyle - // (CellStyle must be set before any other cell properties) - - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( pNames[i] ); - pMapArray[i] = pEntry; - if (pEntry) - { - if ( pEntry->nWID == SC_WID_UNO_CELLSTYL ) - { - try - { - SetOnePropertyValue( pEntry, pValues[i] ); - } - catch ( lang::IllegalArgumentException& ) - { - OSL_FAIL("exception when setting cell style"); // not supposed to happen - } - } - } - } - - ScDocument* pDoc = pDocShell->GetDocument(); - ScPatternAttr* pOldPattern = NULL; - ScPatternAttr* pNewPattern = NULL; - - sal_Int32 nFailed(0); - for(i = 0; i < nCount; i++) - { - // second loop: handle other properties - - const SfxItemPropertySimpleEntry* pEntry = pMapArray[i]; - if ( pEntry && ((pEntry->nFlags & beans::PropertyAttribute::READONLY) == 0)) - { - if ( IsScItemWid( pEntry->nWID ) ) // can be handled by SfxItemPropertySet - { - if ( !pOldPattern ) - { - pOldPattern = new ScPatternAttr( *GetCurrentAttrsDeep() ); - pOldPattern->GetItemSet().ClearInvalidItems(); - pNewPattern = new ScPatternAttr( pDoc->GetPool() ); - } - - // collect items in pNewPattern, apply with one call after the loop - - sal_uInt16 nFirstItem, nSecondItem; - try - { - lcl_SetCellProperty( *pEntry, pValues[i], *pOldPattern, pDoc, nFirstItem, nSecondItem ); - - // put only affected items into new set - if ( nFirstItem ) - pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nFirstItem ) ); - if ( nSecondItem ) - pNewPattern->GetItemSet().Put( pOldPattern->GetItemSet().Get( nSecondItem ) ); - } - catch ( lang::IllegalArgumentException& ) - { - pReturns[nFailed].Name = pNames[i]; - pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::ILLEGAL_ARGUMENT; - } - } - else if ( pEntry->nWID != SC_WID_UNO_CELLSTYL ) // CellStyle is handled above - { - // call virtual method to set a single property - try - { - SetOnePropertyValue( pEntry, pValues[i] ); - } - catch ( lang::IllegalArgumentException& ) - { - pReturns[nFailed].Name = pNames[i]; - pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::ILLEGAL_ARGUMENT; - } - } - } - else - { - pReturns[nFailed].Name = pNames[i]; - if (pEntry) - pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::PROPERTY_VETO; - else - pReturns[nFailed++].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY; - } - } - - if ( pNewPattern && !aRanges.empty() ) - { - ScDocFunc aFunc(*pDocShell); - aFunc.ApplyAttributes( *GetMarkData(), *pNewPattern, sal_True, sal_True ); - } - - delete pNewPattern; - delete pOldPattern; - delete[] pMapArray; - - aReturns.realloc(nFailed); - - return aReturns; - } - return uno::Sequence < beans::SetPropertyTolerantFailed >(); -} - -uno::Sequence< beans::GetPropertyTolerantResult > SAL_CALL ScCellRangesBase::getPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Int32 nCount(aPropertyNames.getLength()); - uno::Sequence < beans::GetPropertyTolerantResult > aReturns(nCount); - beans::GetPropertyTolerantResult* pReturns = aReturns.getArray(); - - const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap(); // from derived class - - for(sal_Int32 i = 0; i < nCount; i++) - { - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyNames[i] ); - if (!pEntry) - { - pReturns[i].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY; - } - else - { - sal_uInt16 nItemWhich = 0; - lcl_GetPropertyWhich( pEntry, nItemWhich ); - pReturns[i].State = GetOnePropertyState( nItemWhich, pEntry ); - GetOnePropertyValue( pEntry, pReturns[i].Value ); - pReturns[i].Result = beans::TolerantPropertySetResultType::SUCCESS; - } - } - return aReturns; -} - -uno::Sequence< beans::GetDirectPropertyTolerantResult > SAL_CALL ScCellRangesBase::getDirectPropertyValuesTolerant( const uno::Sequence< ::rtl::OUString >& aPropertyNames ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Int32 nCount(aPropertyNames.getLength()); - uno::Sequence < beans::GetDirectPropertyTolerantResult > aReturns(nCount); - beans::GetDirectPropertyTolerantResult* pReturns = aReturns.getArray(); - - const SfxItemPropertyMap* pPropertyMap = GetItemPropertyMap(); // from derived class - - sal_Int32 j = 0; - for(sal_Int32 i = 0; i < nCount; i++) - { - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( aPropertyNames[i] ); - if (!pEntry) - { - pReturns[i].Result = beans::TolerantPropertySetResultType::UNKNOWN_PROPERTY; - } - else - { - sal_uInt16 nItemWhich = 0; - lcl_GetPropertyWhich( pEntry, nItemWhich ); - pReturns[j].State = GetOnePropertyState( nItemWhich, pEntry ); - if (pReturns[j].State == beans::PropertyState_DIRECT_VALUE) - { - GetOnePropertyValue( pEntry, pReturns[j].Value ); - pReturns[j].Result = beans::TolerantPropertySetResultType::SUCCESS; - pReturns[j].Name = aPropertyNames[i]; - ++j; - } - } - } - if (j < nCount) - aReturns.realloc(j); - return aReturns; -} - -// XIndent - -void SAL_CALL ScCellRangesBase::decrementIndent() throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell && !aRanges.empty() ) // leer = nichts zu tun - { - ScDocFunc aFunc(*pDocShell); - //#97041#; put only MultiMarked ScMarkData in ChangeIndent - ScMarkData aMarkData(*GetMarkData()); - aMarkData.MarkToMulti(); - aFunc.ChangeIndent( aMarkData, false, sal_True ); - } -} - -void SAL_CALL ScCellRangesBase::incrementIndent() throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell && !aRanges.empty() ) // leer = nichts zu tun - { - ScDocFunc aFunc(*pDocShell); - //#97041#; put only MultiMarked ScMarkData in ChangeIndent - ScMarkData aMarkData(*GetMarkData()); - aMarkData.MarkToMulti(); - aFunc.ChangeIndent( aMarkData, sal_True, sal_True ); - } -} - -// XChartData - -ScMemChart* ScCellRangesBase::CreateMemChart_Impl() const -{ - if ( pDocShell && !aRanges.empty() ) - { - ScRangeListRef xChartRanges; - if ( aRanges.size() == 1 ) - { - // ganze Tabelle sinnvoll begrenzen (auf belegten Datenbereich) - // (nur hier, Listener werden auf den ganzen Bereich angemeldet) - //! direkt testen, ob es ein ScTableSheetObj ist? - - const ScRange* pRange = aRanges[0]; - if ( pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL && - pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW ) - { - SCTAB nTab = pRange->aStart.Tab(); - - SCCOL nStartX; - SCROW nStartY; // Anfang holen - if (!pDocShell->GetDocument()->GetDataStart( nTab, nStartX, nStartY )) - { - nStartX = 0; - nStartY = 0; - } - - SCCOL nEndX; - SCROW nEndY; // Ende holen - if (!pDocShell->GetDocument()->GetTableArea( nTab, nEndX, nEndY )) - { - nEndX = 0; - nEndY = 0; - } - - xChartRanges = new ScRangeList; - xChartRanges->Append( ScRange( nStartX, nStartY, nTab, nEndX, nEndY, nTab ) ); - } - } - if (!xChartRanges.Is()) // sonst Ranges direkt uebernehmen - xChartRanges = new ScRangeList(aRanges); - ScChartArray aArr( pDocShell->GetDocument(), xChartRanges, String() ); - - // RowAsHdr = ColHeaders und umgekehrt - aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr ); - - return aArr.CreateMemChart(); - } - return NULL; -} - -uno::Sequence< uno::Sequence<double> > SAL_CALL ScCellRangesBase::getData() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScMemChart* pMemChart = CreateMemChart_Impl(); - if ( pMemChart ) - { - sal_Int32 nColCount = pMemChart->GetColCount(); - sal_Int32 nRowCount = static_cast<sal_Int32>(pMemChart->GetRowCount()); - - uno::Sequence< uno::Sequence<double> > aRowSeq( nRowCount ); - uno::Sequence<double>* pRowAry = aRowSeq.getArray(); - for (sal_Int32 nRow = 0; nRow < nRowCount; nRow++) - { - uno::Sequence<double> aColSeq( nColCount ); - double* pColAry = aColSeq.getArray(); - for (sal_Int32 nCol = 0; nCol < nColCount; nCol++) - pColAry[nCol] = pMemChart->GetData( static_cast<short>(nCol), static_cast<short>(nRow) ); - - pRowAry[nRow] = aColSeq; - } - - delete pMemChart; - return aRowSeq; - } - - return uno::Sequence< uno::Sequence<double> >(0); -} - -ScRangeListRef ScCellRangesBase::GetLimitedChartRanges_Impl( long nDataColumns, long nDataRows ) const -{ - if ( aRanges.size() == 1 ) - { - const ScRange* pRange = aRanges[0]; - if ( pRange->aStart.Col() == 0 && pRange->aEnd.Col() == MAXCOL && - pRange->aStart.Row() == 0 && pRange->aEnd.Row() == MAXROW ) - { - // if aRanges is a complete sheet, limit to given size - - SCTAB nTab = pRange->aStart.Tab(); - - long nEndColumn = nDataColumns - 1 + ( bChartColAsHdr ? 1 : 0 ); - if ( nEndColumn < 0 ) - nEndColumn = 0; - if ( nEndColumn > MAXCOL ) - nEndColumn = MAXCOL; - - long nEndRow = nDataRows - 1 + ( bChartRowAsHdr ? 1 : 0 ); - if ( nEndRow < 0 ) - nEndRow = 0; - if ( nEndRow > MAXROW ) - nEndRow = MAXROW; - - ScRangeListRef xChartRanges = new ScRangeList; - xChartRanges->Append( ScRange( 0, 0, nTab, (SCCOL)nEndColumn, (SCROW)nEndRow, nTab ) ); - return xChartRanges; - } - } - - return new ScRangeList(aRanges); // as-is -} - -void SAL_CALL ScCellRangesBase::setData( const uno::Sequence< uno::Sequence<double> >& aData ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - long nRowCount = aData.getLength(); - long nColCount = nRowCount ? aData[0].getLength() : 0; - ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( nColCount, nRowCount ); - if ( pDocShell && xChartRanges.Is() ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScChartArray aArr( pDoc, xChartRanges, String() ); - aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr ); // RowAsHdr = ColHeaders - const ScChartPositionMap* pPosMap = aArr.GetPositionMap(); - if (pPosMap) - { - if ( pPosMap->GetColCount() == static_cast<SCCOL>(nColCount) && - pPosMap->GetRowCount() == static_cast<SCROW>(nRowCount) ) - { - for (long nRow=0; nRow<nRowCount; nRow++) - { - const uno::Sequence<double>& rRowSeq = aData[nRow]; - const double* pArray = rRowSeq.getConstArray(); - nColCount = rRowSeq.getLength(); - for (long nCol=0; nCol<nColCount; nCol++) - { - const ScAddress* pPos = pPosMap->GetPosition( - sal::static_int_cast<SCCOL>(nCol), - sal::static_int_cast<SCROW>(nRow) ); - if (pPos) - { - double fVal = pArray[nCol]; - if ( fVal == DBL_MIN ) - pDoc->PutCell( *pPos, NULL ); // empty cell - else - pDoc->SetValue( pPos->Col(), pPos->Row(), pPos->Tab(), pArray[nCol] ); - } - } - } - - //! undo - PaintRanges_Impl( PAINT_GRID ); - pDocShell->SetDocumentModified(); - ForceChartListener_Impl(); // call listeners for this object synchronously - bDone = sal_True; - } - } - } - - if (!bDone) - throw uno::RuntimeException(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesBase::getRowDescriptions() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScMemChart* pMemChart = CreateMemChart_Impl(); - if ( pMemChart ) - { - sal_Int32 nRowCount = static_cast<sal_Int32>(pMemChart->GetRowCount()); - uno::Sequence<rtl::OUString> aSeq( nRowCount ); - rtl::OUString* pAry = aSeq.getArray(); - for (sal_Int32 nRow = 0; nRow < nRowCount; nRow++) - pAry[nRow] = pMemChart->GetRowText(static_cast<short>(nRow)); - - delete pMemChart; - return aSeq; - } - return uno::Sequence<rtl::OUString>(0); -} - -void SAL_CALL ScCellRangesBase::setRowDescriptions( - const uno::Sequence<rtl::OUString>& aRowDescriptions ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if ( bChartColAsHdr ) - { - long nRowCount = aRowDescriptions.getLength(); - ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( 1, nRowCount ); - if ( pDocShell && xChartRanges.Is() ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScChartArray aArr( pDoc, xChartRanges, String() ); - aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr ); // RowAsHdr = ColHeaders - const ScChartPositionMap* pPosMap = aArr.GetPositionMap(); - if (pPosMap) - { - if ( pPosMap->GetRowCount() == static_cast<SCROW>(nRowCount) ) - { - const rtl::OUString* pArray = aRowDescriptions.getConstArray(); - for (long nRow=0; nRow<nRowCount; nRow++) - { - const ScAddress* pPos = pPosMap->GetRowHeaderPosition( - static_cast<SCSIZE>(nRow) ); - if (pPos) - { - String aStr = pArray[nRow]; - if ( aStr.Len() ) - pDoc->PutCell( *pPos, new ScStringCell( aStr ) ); - else - pDoc->PutCell( *pPos, NULL ); // empty cell - } - } - - //! undo - PaintRanges_Impl( PAINT_GRID ); - pDocShell->SetDocumentModified(); - ForceChartListener_Impl(); // call listeners for this object synchronously - bDone = sal_True; - } - } - } - } - - if (!bDone) - throw uno::RuntimeException(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesBase::getColumnDescriptions() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScMemChart* pMemChart = CreateMemChart_Impl(); - if ( pMemChart ) - { - sal_Int32 nColCount = pMemChart->GetColCount(); - uno::Sequence<rtl::OUString> aSeq( nColCount ); - rtl::OUString* pAry = aSeq.getArray(); - for (sal_Int32 nCol = 0; nCol < nColCount; nCol++) - pAry[nCol] = pMemChart->GetColText(static_cast<short>(nCol)); - - delete pMemChart; - return aSeq; - } - return uno::Sequence<rtl::OUString>(0); -} - -void SAL_CALL ScCellRangesBase::setColumnDescriptions( - const uno::Sequence<rtl::OUString>& aColumnDescriptions ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if ( bChartRowAsHdr ) - { - long nColCount = aColumnDescriptions.getLength(); - ScRangeListRef xChartRanges = GetLimitedChartRanges_Impl( nColCount, 1 ); - if ( pDocShell && xChartRanges.Is() ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScChartArray aArr( pDoc, xChartRanges, String() ); - aArr.SetHeaders( bChartRowAsHdr, bChartColAsHdr ); // RowAsHdr = ColHeaders - const ScChartPositionMap* pPosMap = aArr.GetPositionMap(); - if (pPosMap) - { - if ( pPosMap->GetColCount() == static_cast<SCCOL>(nColCount) ) - { - const rtl::OUString* pArray = aColumnDescriptions.getConstArray(); - for (long nCol=0; nCol<nColCount; nCol++) - { - const ScAddress* pPos = pPosMap->GetColHeaderPosition( - sal::static_int_cast<SCCOL>(nCol) ); - if (pPos) - { - String aStr(pArray[nCol]); - if ( aStr.Len() ) - pDoc->PutCell( *pPos, new ScStringCell( aStr ) ); - else - pDoc->PutCell( *pPos, NULL ); // empty cell - } - } - - //! undo - PaintRanges_Impl( PAINT_GRID ); - pDocShell->SetDocumentModified(); - ForceChartListener_Impl(); // call listeners for this object synchronously - bDone = sal_True; - } - } - } - } - - if (!bDone) - throw uno::RuntimeException(); -} - -void ScCellRangesBase::ForceChartListener_Impl() -{ - // call Update immediately so the caller to setData etc. can - // regognize the listener call - - if ( pDocShell ) - { - ScChartListenerCollection* pColl = pDocShell->GetDocument()->GetChartListenerCollection(); - if ( pColl ) - { - sal_uInt16 nCollCount = pColl->GetCount(); - for ( sal_uInt16 nIndex = 0; nIndex < nCollCount; nIndex++ ) - { - ScChartListener* pChartListener = (ScChartListener*)pColl->At(nIndex); - if ( pChartListener && - pChartListener->GetUnoSource() == static_cast<chart::XChartData*>(this) && - pChartListener->IsDirty() ) - pChartListener->Update(); - } - } - } -} - -String lcl_UniqueName( ScStrCollection& rColl, const String& rPrefix ) -{ - long nNumber = 1; - sal_uInt16 nCollCount = rColl.GetCount(); - while (sal_True) - { - String aName(rPrefix); - aName += String::CreateFromInt32( nNumber ); - sal_Bool bFound = false; - for (sal_uInt16 i=0; i<nCollCount; i++) - if ( rColl[i]->GetString() == aName ) - { - bFound = sal_True; - break; - } - if (!bFound) - return aName; - ++nNumber; - } -} - -void SAL_CALL ScCellRangesBase::addChartDataChangeEventListener( const uno::Reference< - chart::XChartDataChangeEventListener >& aListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell && !aRanges.empty() ) - { - //! auf doppelte testen? - - ScDocument* pDoc = pDocShell->GetDocument(); - ScRangeListRef aRangesRef( new ScRangeList(aRanges) ); - ScChartListenerCollection* pColl = pDoc->GetChartListenerCollection(); - String aName(lcl_UniqueName( *pColl, - String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("__Uno")) )); - ScChartListener* pListener = new ScChartListener( aName, pDoc, aRangesRef ); - pListener->SetUno( aListener, this ); - pColl->Insert( pListener ); - pListener->StartListeningTo(); - } -} - -void SAL_CALL ScCellRangesBase::removeChartDataChangeEventListener( const uno::Reference< - chart::XChartDataChangeEventListener >& aListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell && !aRanges.empty() ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScChartListenerCollection* pColl = pDoc->GetChartListenerCollection(); - pColl->FreeUno( aListener, this ); - } -} - -double SAL_CALL ScCellRangesBase::getNotANumber() throw(::com::sun::star::uno::RuntimeException) -{ - // im ScChartArray wird DBL_MIN verwendet, weil das Chart es so will - return DBL_MIN; -} - -sal_Bool SAL_CALL ScCellRangesBase::isNotANumber( double nNumber ) throw(uno::RuntimeException) -{ - // im ScChartArray wird DBL_MIN verwendet, weil das Chart es so will - return (nNumber == DBL_MIN); -} - -// XModifyBroadcaster - -void SAL_CALL ScCellRangesBase::addModifyListener( const uno::Reference<util::XModifyListener>& aListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( aRanges.empty() ) - throw uno::RuntimeException(); - - uno::Reference<util::XModifyListener> *pObj = - new uno::Reference<util::XModifyListener>( aListener ); - aValueListeners.Insert( pObj, aValueListeners.Count() ); - - if ( aValueListeners.Count() == 1 ) - { - if (!pValueListener) - pValueListener = new ScLinkListener( LINK( this, ScCellRangesBase, ValueListenerHdl ) ); - - ScDocument* pDoc = pDocShell->GetDocument(); - for ( size_t i = 0, nCount = aRanges.size(); i < nCount; i++) - pDoc->StartListeningArea( *aRanges[ i ], pValueListener ); - - acquire(); // don't lose this object (one ref for all listeners) - } -} - -void SAL_CALL ScCellRangesBase::removeModifyListener( const uno::Reference<util::XModifyListener>& aListener ) - throw(uno::RuntimeException) -{ - - SolarMutexGuard aGuard; - if ( aRanges.empty() ) - throw uno::RuntimeException(); - - acquire(); // in case the listeners have the last ref - released below - - sal_uInt16 nCount = aValueListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<util::XModifyListener> *pObj = aValueListeners[n]; - if ( *pObj == aListener ) - { - aValueListeners.DeleteAndDestroy( n ); - - if ( aValueListeners.Count() == 0 ) - { - if (pValueListener) - pValueListener->EndListeningAll(); - - release(); // release the ref for the listeners - } - - break; - } - } - - release(); // might delete this object -} - -// XCellRangesQuery - -uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryVisibleCells() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - //! fuer alle Tabellen getrennt, wenn Markierungen pro Tabelle getrennt sind! - SCTAB nTab = lcl_FirstTab(aRanges); - - ScMarkData aMarkData(*GetMarkData()); - - ScDocument* pDoc = pDocShell->GetDocument(); - SCCOL nCol = 0, nLastCol; - while (nCol <= MAXCOL) - { - if (pDoc->ColHidden(nCol, nTab, NULL, &nLastCol)) - // hidden columns. Unselect them. - aMarkData.SetMultiMarkArea(ScRange(nCol, 0, nTab, nLastCol, MAXROW, nTab), false); - - nCol = nLastCol + 1; - } - - SCROW nRow = 0, nLastRow; - while (nRow <= MAXROW) - { - if (pDoc->RowHidden(nRow, nTab, NULL, &nLastRow)) - // These rows are hidden. Unselect them. - aMarkData.SetMultiMarkArea(ScRange(0, nRow, nTab, MAXCOL, nLastRow, nTab), false); - - nRow = nLastRow + 1; - } - - ScRangeList aNewRanges; - aMarkData.FillRangeListWithMarks( &aNewRanges, false ); - return new ScCellRangesObj( pDocShell, aNewRanges ); - } - - return NULL; -} - -uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryEmptyCells() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - - ScMarkData aMarkData(*GetMarkData()); - - // belegte Zellen wegmarkieren - for (size_t i = 0, nCount = aRanges.size(); i < nCount; ++i) - { - ScRange aRange = *aRanges[ i ]; - - ScCellIterator aIter( pDoc, aRange ); - ScBaseCell* pCell = aIter.GetFirst(); - while (pCell) - { - // Notizen zaehlen als nicht-leer - if ( !pCell->IsBlank() ) - aMarkData.SetMultiMarkArea( - ScRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() ), - false ); - - pCell = aIter.GetNext(); - } - } - - ScRangeList aNewRanges; - // IsMultiMarked reicht hier nicht (wird beim deselektieren nicht zurueckgesetzt) - if (aMarkData.HasAnyMultiMarks()) - aMarkData.FillRangeListWithMarks( &aNewRanges, false ); - - return new ScCellRangesObj( pDocShell, aNewRanges ); // aNewRanges kann leer sein - } - - return NULL; -} - -uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryContentCells( - sal_Int16 nContentFlags ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - - ScMarkData aMarkData; - - // passende Zellen selektieren - for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i ) - { - ScRange aRange = *aRanges[ i ]; - - ScCellIterator aIter( pDoc, aRange ); - ScBaseCell* pCell = aIter.GetFirst(); - while (pCell) - { - sal_Bool bAdd = false; - if ( pCell->HasNote() && ( nContentFlags & sheet::CellFlags::ANNOTATION ) ) - bAdd = sal_True; - else - switch ( pCell->GetCellType() ) - { - case CELLTYPE_STRING: - if ( nContentFlags & sheet::CellFlags::STRING ) - bAdd = sal_True; - break; - case CELLTYPE_EDIT: - if ( (nContentFlags & sheet::CellFlags::STRING) || (nContentFlags & sheet::CellFlags::FORMATTED) ) - bAdd = sal_True; - break; - case CELLTYPE_FORMULA: - if ( nContentFlags & sheet::CellFlags::FORMULA ) - bAdd = sal_True; - break; - case CELLTYPE_VALUE: - if ( (nContentFlags & (sheet::CellFlags::VALUE|sheet::CellFlags::DATETIME)) - == (sheet::CellFlags::VALUE|sheet::CellFlags::DATETIME) ) - bAdd = sal_True; - else - { - // Date/Time Erkennung - - sal_uLong nIndex = (sal_uLong)((SfxUInt32Item*)pDoc->GetAttr( - aIter.GetCol(), aIter.GetRow(), aIter.GetTab(), - ATTR_VALUE_FORMAT ))->GetValue(); - short nTyp = pDoc->GetFormatTable()->GetType(nIndex); - if ((nTyp == NUMBERFORMAT_DATE) || (nTyp == NUMBERFORMAT_TIME) || - (nTyp == NUMBERFORMAT_DATETIME)) - { - if ( nContentFlags & sheet::CellFlags::DATETIME ) - bAdd = sal_True; - } - else - { - if ( nContentFlags & sheet::CellFlags::VALUE ) - bAdd = sal_True; - } - } - break; - default: - { - // added to avoid warnings - } - } - - if (bAdd) - aMarkData.SetMultiMarkArea( - ScRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() ), - sal_True ); - - pCell = aIter.GetNext(); - } - } - - ScRangeList aNewRanges; - if (aMarkData.IsMultiMarked()) - aMarkData.FillRangeListWithMarks( &aNewRanges, false ); - - return new ScCellRangesObj( pDocShell, aNewRanges ); // aNewRanges kann leer sein - } - - return NULL; -} - -uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryFormulaCells( - sal_Int32 nResultFlags ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - - ScMarkData aMarkData; - - // passende Zellen selektieren - for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i ) - { - ScRange aRange = *aRanges[ i ]; - - ScCellIterator aIter( pDoc, aRange ); - ScBaseCell* pCell = aIter.GetFirst(); - while (pCell) - { - if (pCell->GetCellType() == CELLTYPE_FORMULA) - { - ScFormulaCell* pFCell = (ScFormulaCell*)pCell; - sal_Bool bAdd = false; - if (pFCell->GetErrCode()) - { - if ( nResultFlags & sheet::FormulaResult::ERROR ) - bAdd = sal_True; - } - else if (pFCell->IsValue()) - { - if ( nResultFlags & sheet::FormulaResult::VALUE ) - bAdd = sal_True; - } - else // String - { - if ( nResultFlags & sheet::FormulaResult::STRING ) - bAdd = sal_True; - } - - if (bAdd) - aMarkData.SetMultiMarkArea( - ScRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() ), - sal_True ); - } - - pCell = aIter.GetNext(); - } - } - - ScRangeList aNewRanges; - if (aMarkData.IsMultiMarked()) - aMarkData.FillRangeListWithMarks( &aNewRanges, false ); - - return new ScCellRangesObj( pDocShell, aNewRanges ); // aNewRanges kann leer sein - } - - return NULL; -} - -uno::Reference<sheet::XSheetCellRanges> ScCellRangesBase::QueryDifferences_Impl( - const table::CellAddress& aCompare, sal_Bool bColumnDiff) -{ - if (pDocShell) - { - size_t nRangeCount = aRanges.size(); - size_t i; - ScDocument* pDoc = pDocShell->GetDocument(); - ScMarkData aMarkData; - - SCCOLROW nCmpPos = bColumnDiff ? (SCCOLROW)aCompare.Row : (SCCOLROW)aCompare.Column; - - // zuerst alles selektieren, wo ueberhaupt etwas in der Vergleichsspalte steht - // (fuer gleiche Zellen wird die Selektion im zweiten Schritt aufgehoben) - - SCTAB nTab = lcl_FirstTab(aRanges); //! fuer alle Tabellen, wenn Markierungen pro Tabelle! - ScRange aCmpRange, aCellRange; - if (bColumnDiff) - aCmpRange = ScRange( 0,nCmpPos,nTab, MAXCOL,nCmpPos,nTab ); - else - aCmpRange = ScRange( static_cast<SCCOL>(nCmpPos),0,nTab, static_cast<SCCOL>(nCmpPos),MAXROW,nTab ); - ScCellIterator aCmpIter( pDoc, aCmpRange ); - ScBaseCell* pCmpCell = aCmpIter.GetFirst(); - while (pCmpCell) - { - if (pCmpCell->GetCellType() != CELLTYPE_NOTE) - { - SCCOLROW nCellPos = bColumnDiff ? static_cast<SCCOLROW>(aCmpIter.GetCol()) : static_cast<SCCOLROW>(aCmpIter.GetRow()); - if (bColumnDiff) - aCellRange = ScRange( static_cast<SCCOL>(nCellPos),0,nTab, - static_cast<SCCOL>(nCellPos),MAXROW,nTab ); - else - aCellRange = ScRange( 0,nCellPos,nTab, MAXCOL,nCellPos,nTab ); - - for (i=0; i<nRangeCount; i++) - { - ScRange aRange( *aRanges[ i ] ); - if ( aRange.Intersects( aCellRange ) ) - { - if (bColumnDiff) - { - aRange.aStart.SetCol(static_cast<SCCOL>(nCellPos)); - aRange.aEnd.SetCol(static_cast<SCCOL>(nCellPos)); - } - else - { - aRange.aStart.SetRow(nCellPos); - aRange.aEnd.SetRow(nCellPos); - } - aMarkData.SetMultiMarkArea( aRange ); - } - } - } - pCmpCell = aCmpIter.GetNext(); - } - - // alle nichtleeren Zellen mit der Vergleichsspalte vergleichen und entsprechend - // selektieren oder aufheben - - ScAddress aCmpAddr; - for (i=0; i<nRangeCount; i++) - { - ScRange aRange( *aRanges[ i ] ); - - ScCellIterator aIter( pDoc, aRange ); - ScBaseCell* pCell = aIter.GetFirst(); - while (pCell) - { - if (bColumnDiff) - aCmpAddr = ScAddress( aIter.GetCol(), nCmpPos, aIter.GetTab() ); - else - aCmpAddr = ScAddress( static_cast<SCCOL>(nCmpPos), aIter.GetRow(), aIter.GetTab() ); - const ScBaseCell* pOtherCell = pDoc->GetCell( aCmpAddr ); - - ScRange aOneRange( aIter.GetCol(), aIter.GetRow(), aIter.GetTab() ); - if ( !ScBaseCell::CellEqual( pCell, pOtherCell ) ) - aMarkData.SetMultiMarkArea( aOneRange ); - else - aMarkData.SetMultiMarkArea( aOneRange, false ); // deselect - - pCell = aIter.GetNext(); - } - } - - ScRangeList aNewRanges; - if (aMarkData.IsMultiMarked()) - aMarkData.FillRangeListWithMarks( &aNewRanges, false ); - - return new ScCellRangesObj( pDocShell, aNewRanges ); // aNewRanges kann leer sein - } - return NULL; -} - -uno::Reference<sheet::XSheetCellRanges > SAL_CALL ScCellRangesBase::queryColumnDifferences( - const table::CellAddress& aCompare ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return QueryDifferences_Impl( aCompare, true ); -} - -uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryRowDifferences( - const table::CellAddress& aCompare ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return QueryDifferences_Impl( aCompare, false ); -} - -uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryIntersection( - const table::CellRangeAddress& aRange ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRange aMask( (SCCOL)aRange.StartColumn, (SCROW)aRange.StartRow, aRange.Sheet, - (SCCOL)aRange.EndColumn, (SCROW)aRange.EndRow, aRange.Sheet ); - - ScRangeList aNew; - for ( size_t i = 0, nCount = aRanges.size(); i < nCount; ++i ) - { - ScRange aTemp( *aRanges[ i ] ); - if ( aTemp.Intersects( aMask ) ) - aNew.Join( ScRange( Max( aTemp.aStart.Col(), aMask.aStart.Col() ), - Max( aTemp.aStart.Row(), aMask.aStart.Row() ), - Max( aTemp.aStart.Tab(), aMask.aStart.Tab() ), - Min( aTemp.aEnd.Col(), aMask.aEnd.Col() ), - Min( aTemp.aEnd.Row(), aMask.aEnd.Row() ), - Min( aTemp.aEnd.Tab(), aMask.aEnd.Tab() ) ) ); - } - - return new ScCellRangesObj( pDocShell, aNew ); // kann leer sein -} - -// XFormulaQuery - -uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryPrecedents( - sal_Bool bRecursive ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - - ScRangeList aNewRanges(aRanges); - sal_Bool bFound; - do - { - bFound = false; - - // aMarkData uses aNewRanges, not aRanges, so GetMarkData can't be used - ScMarkData aMarkData; - aMarkData.MarkFromRangeList( aNewRanges, false ); - aMarkData.MarkToMulti(); // needed for IsAllMarked - - for (size_t nR = 0, nCount = aNewRanges.size(); nR<nCount; ++nR) - { - ScRange aRange( *aNewRanges[ nR] ); - ScCellIterator aIter( pDoc, aRange ); - ScBaseCell* pCell = aIter.GetFirst(); - while (pCell) - { - if ( pCell->GetCellType() == CELLTYPE_FORMULA ) - { - ScFormulaCell* pFCell = (ScFormulaCell*) pCell; - - ScDetectiveRefIter aRefIter( pFCell ); - ScRange aRefRange; - while ( aRefIter.GetNextRef( aRefRange) ) - { - if ( bRecursive && !bFound && !aMarkData.IsAllMarked( aRefRange ) ) - bFound = sal_True; - aMarkData.SetMultiMarkArea( aRefRange, sal_True ); - } - } - pCell = aIter.GetNext(); - } - } - - aMarkData.FillRangeListWithMarks( &aNewRanges, sal_True ); - } - while ( bRecursive && bFound ); - - return new ScCellRangesObj( pDocShell, aNewRanges ); - } - - return NULL; -} - -uno::Reference<sheet::XSheetCellRanges> SAL_CALL ScCellRangesBase::queryDependents( - sal_Bool bRecursive ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - - ScRangeList aNewRanges(aRanges); - sal_Bool bFound; - do - { - bFound = false; - - // aMarkData uses aNewRanges, not aRanges, so GetMarkData can't be used - ScMarkData aMarkData; - aMarkData.MarkFromRangeList( aNewRanges, false ); - aMarkData.MarkToMulti(); // needed for IsAllMarked - - SCTAB nTab = lcl_FirstTab(aNewRanges); //! alle Tabellen - - ScCellIterator aCellIter( pDoc, 0,0, nTab, MAXCOL,MAXROW, nTab ); - ScBaseCell* pCell = aCellIter.GetFirst(); - while (pCell) - { - if (pCell->GetCellType() == CELLTYPE_FORMULA) - { - sal_Bool bMark = false; - ScDetectiveRefIter aIter( (ScFormulaCell*) pCell ); - ScRange aRefRange; - while ( aIter.GetNextRef( aRefRange) ) - { - size_t nRangesCount = aNewRanges.size(); - for (size_t nR = 0; nR < nRangesCount; ++nR) - { - ScRange aRange( *aNewRanges[ nR ] ); - if (aRange.Intersects(aRefRange)) - bMark = sal_True; // von Teil des Ranges abhaengig - } - } - if (bMark) - { - ScRange aCellRange( aCellIter.GetCol(), - aCellIter.GetRow(), - aCellIter.GetTab() ); - if ( bRecursive && !bFound && !aMarkData.IsAllMarked( aCellRange ) ) - bFound = sal_True; - aMarkData.SetMultiMarkArea( aCellRange, sal_True ); - } - } - pCell = aCellIter.GetNext(); - } - - aMarkData.FillRangeListWithMarks( &aNewRanges, sal_True ); - } - while ( bRecursive && bFound ); - - return new ScCellRangesObj( pDocShell, aNewRanges ); - } - - return NULL; -} - -// XSearchable - -uno::Reference<util::XSearchDescriptor> SAL_CALL ScCellRangesBase::createSearchDescriptor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScCellSearchObj; -} - -uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangesBase::findAll( - const uno::Reference<util::XSearchDescriptor>& xDesc ) - throw(uno::RuntimeException) -{ - // Wenn nichts gefunden wird, soll Null zurueckgegeben werden (?) - uno::Reference<container::XIndexAccess> xRet; - if ( pDocShell && xDesc.is() ) - { - ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc ); - if (pSearch) - { - SvxSearchItem* pSearchItem = pSearch->GetSearchItem(); - if (pSearchItem) - { - ScDocument* pDoc = pDocShell->GetDocument(); - pSearchItem->SetCommand( SVX_SEARCHCMD_FIND_ALL ); - // immer nur innerhalb dieses Objekts - pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) ); - - ScMarkData aMark(*GetMarkData()); - - String aDummyUndo; - SCCOL nCol = 0; - SCROW nRow = 0; - SCTAB nTab = 0; - sal_Bool bFound = pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab, - aMark, aDummyUndo, NULL ); - if (bFound) - { - ScRangeList aNewRanges; - aMark.FillRangeListWithMarks( &aNewRanges, sal_True ); - // bei findAll immer CellRanges, egal wieviel gefunden wurde - xRet.set(new ScCellRangesObj( pDocShell, aNewRanges )); - } - } - } - } - return xRet; -} - -uno::Reference<uno::XInterface> ScCellRangesBase::Find_Impl( - const uno::Reference<util::XSearchDescriptor>& xDesc, - const ScAddress* pLastPos ) -{ - uno::Reference<uno::XInterface> xRet; - if ( pDocShell && xDesc.is() ) - { - ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc ); - if (pSearch) - { - SvxSearchItem* pSearchItem = pSearch->GetSearchItem(); - if (pSearchItem) - { - ScDocument* pDoc = pDocShell->GetDocument(); - pSearchItem->SetCommand( SVX_SEARCHCMD_FIND ); - // immer nur innerhalb dieses Objekts - pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) ); - - ScMarkData aMark(*GetMarkData()); - - SCCOL nCol; - SCROW nRow; - SCTAB nTab; - if (pLastPos) - pLastPos->GetVars( nCol, nRow, nTab ); - else - { - nTab = lcl_FirstTab(aRanges); //! mehrere Tabellen? - ScDocument::GetSearchAndReplaceStart( *pSearchItem, nCol, nRow ); - } - - String aDummyUndo; - sal_Bool bFound = pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab, - aMark, aDummyUndo, NULL ); - if (bFound) - { - ScAddress aFoundPos( nCol, nRow, nTab ); - xRet.set((cppu::OWeakObject*) new ScCellObj( pDocShell, aFoundPos )); - } - } - } - } - return xRet; -} - -uno::Reference<uno::XInterface> SAL_CALL ScCellRangesBase::findFirst( - const uno::Reference<util::XSearchDescriptor>& xDesc ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return Find_Impl( xDesc, NULL ); -} - -uno::Reference<uno::XInterface> SAL_CALL ScCellRangesBase::findNext( - const uno::Reference<uno::XInterface>& xStartAt, - const uno::Reference<util::XSearchDescriptor >& xDesc ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( xStartAt.is() ) - { - ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xStartAt ); - if ( pRangesImp && pRangesImp->GetDocShell() == pDocShell ) - { - const ScRangeList& rStartRanges = pRangesImp->GetRangeList(); - if ( rStartRanges.size() == 1 ) - { - ScAddress aStartPos = rStartRanges[ 0 ]->aStart; - return Find_Impl( xDesc, &aStartPos ); - } - } - } - return NULL; -} - -// XReplaceable - -uno::Reference<util::XReplaceDescriptor> SAL_CALL ScCellRangesBase::createReplaceDescriptor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScCellSearchObj; -} - -sal_Int32 SAL_CALL ScCellRangesBase::replaceAll( const uno::Reference<util::XSearchDescriptor>& xDesc ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Int32 nReplaced = 0; - if ( pDocShell && xDesc.is() ) - { - ScCellSearchObj* pSearch = ScCellSearchObj::getImplementation( xDesc ); - if (pSearch) - { - SvxSearchItem* pSearchItem = pSearch->GetSearchItem(); - if (pSearchItem) - { - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Bool bUndo(pDoc->IsUndoEnabled()); - pSearchItem->SetCommand( SVX_SEARCHCMD_REPLACE_ALL ); - // immer nur innerhalb dieses Objekts - pSearchItem->SetSelection( !lcl_WholeSheet(aRanges) ); - - ScMarkData aMark(*GetMarkData()); - - SCTAB nTabCount = pDoc->GetTableCount(); - bool bProtected = !pDocShell->IsEditable(); - ScMarkData::iterator itr = aMark.begin(), itrEnd = aMark.end(); - for (; itr != itrEnd && *itr < nTabCount; ++itr) - if ( pDoc->IsTabProtected(*itr) ) - bProtected = true; - if (bProtected) - { - //! Exception, oder was? - } - else - { - SCTAB nTab = aMark.GetFirstSelected(); // bei SearchAndReplace nicht benutzt - SCCOL nCol = 0; - SCROW nRow = 0; - - String aUndoStr; - ScDocument* pUndoDoc = NULL; - if (bUndo) - { - pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - pUndoDoc->InitUndo( pDoc, nTab, nTab ); - } - itr = aMark.begin(); - for (; itr != itrEnd && *itr < nTabCount; ++itr) - if ( *itr != nTab && bUndo) - pUndoDoc->AddUndoTab( *itr, *itr ); - ScMarkData* pUndoMark = NULL; - if (bUndo) - pUndoMark = new ScMarkData(aMark); - - sal_Bool bFound(false); - if (bUndo) - bFound = pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab, - aMark, aUndoStr, pUndoDoc ); - if (bFound) - { - nReplaced = pUndoDoc->GetCellCount(); - - pDocShell->GetUndoManager()->AddUndoAction( - new ScUndoReplace( pDocShell, *pUndoMark, nCol, nRow, nTab, - aUndoStr, pUndoDoc, pSearchItem ) ); - - pDocShell->PostPaintGridAll(); - pDocShell->SetDocumentModified(); - } - else - { - delete pUndoDoc; - delete pUndoMark; - // nReplaced bleibt 0 - } - } - } - } - } - return nReplaced; -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScCellRangesBase::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScCellRangesBaseUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScCellRangesBaseUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScCellRangesBase::getUnoTunnelId() -{ - return theScCellRangesBaseUnoTunnelId::get().getSeq(); -} - -ScCellRangesBase* ScCellRangesBase::getImplementation( const uno::Reference<uno::XInterface> xObj ) -{ - ScCellRangesBase* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScCellRangesBase*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -//------------------------------------------------------------------------ - -ScCellRangesObj::ScCellRangesObj(ScDocShell* pDocSh, const ScRangeList& rR) : - ScCellRangesBase( pDocSh, rR ) -{ -} - -ScCellRangesObj::~ScCellRangesObj() -{ -} - -void ScCellRangesObj::RefChanged() -{ - ScCellRangesBase::RefChanged(); - - // nix weiter... -} - -uno::Any SAL_CALL ScCellRangesObj::queryInterface( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( sheet::XSheetCellRangeContainer ) - SC_QUERYINTERFACE( sheet::XSheetCellRanges ) - SC_QUERYINTERFACE( container::XIndexAccess ) - SC_QUERY_MULTIPLE( container::XElementAccess, container::XIndexAccess ) - SC_QUERYINTERFACE( container::XEnumerationAccess ) - SC_QUERYINTERFACE( container::XNameContainer ) - SC_QUERYINTERFACE( container::XNameReplace ) - SC_QUERYINTERFACE( container::XNameAccess ) - - return ScCellRangesBase::queryInterface( rType ); -} - -void SAL_CALL ScCellRangesObj::acquire() throw() -{ - ScCellRangesBase::acquire(); -} - -void SAL_CALL ScCellRangesObj::release() throw() -{ - ScCellRangesBase::release(); -} - -uno::Sequence<uno::Type> SAL_CALL ScCellRangesObj::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - uno::Sequence<uno::Type> aParentTypes(ScCellRangesBase::getTypes()); - long nParentLen = aParentTypes.getLength(); - const uno::Type* pParentPtr = aParentTypes.getConstArray(); - - aTypes.realloc( nParentLen + 3 ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSheetCellRangeContainer>*)0); - pPtr[nParentLen + 1] = getCppuType((const uno::Reference<container::XNameContainer>*)0); - pPtr[nParentLen + 2] = getCppuType((const uno::Reference<container::XEnumerationAccess>*)0); - - for (long i=0; i<nParentLen; i++) - pPtr[i] = pParentPtr[i]; // parent types first - } - return aTypes; -} - -namespace -{ - class theScCellRangesObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScCellRangesObjImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScCellRangesObj::getImplementationId() - throw(uno::RuntimeException) -{ - return theScCellRangesObjImplementationId::get().getSeq(); -} - -// XCellRanges - -ScCellRangeObj* ScCellRangesObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const -{ - ScDocShell* pDocSh = GetDocShell(); - const ScRangeList& rRanges = GetRangeList(); - if ( pDocSh && nIndex >= 0 && nIndex < sal::static_int_cast<sal_Int32>(rRanges.size()) ) - { - ScRange aRange( *rRanges[ nIndex ] ); - if ( aRange.aStart == aRange.aEnd ) - return new ScCellObj( pDocSh, aRange.aStart ); - else - return new ScCellRangeObj( pDocSh, aRange ); - } - - return NULL; // keine DocShell oder falscher Index -} - -uno::Sequence<table::CellRangeAddress> SAL_CALL ScCellRangesObj::getRangeAddresses() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - const ScRangeList& rRanges = GetRangeList(); - size_t nCount = rRanges.size(); - if ( pDocSh && nCount ) - { - table::CellRangeAddress aRangeAddress; - uno::Sequence<table::CellRangeAddress> aSeq(nCount); - table::CellRangeAddress* pAry = aSeq.getArray(); - for ( size_t i=0; i < nCount; i++) - { - ScUnoConversion::FillApiRange( aRangeAddress, *rRanges[ i ] ); - pAry[i] = aRangeAddress; - } - return aSeq; - } - - return uno::Sequence<table::CellRangeAddress>(0); // leer ist moeglich -} - -uno::Reference<container::XEnumerationAccess> SAL_CALL ScCellRangesObj::getCells() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - // getCells with empty range list is possible (no exception), - // the resulting enumeration just has no elements - // (same behaviour as a valid range with no cells) - // This is handled in ScCellsEnumeration ctor. - - const ScRangeList& rRanges = GetRangeList(); - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - return new ScCellsObj( pDocSh, rRanges ); - return NULL; -} - -rtl::OUString SAL_CALL ScCellRangesObj::getRangeAddressesAsString() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString; - ScDocShell* pDocSh = GetDocShell(); - const ScRangeList& rRanges = GetRangeList(); - if (pDocSh) - rRanges.Format( aString, SCA_VALID | SCA_TAB_3D, pDocSh->GetDocument() ); - return aString; -} - -// XSheetCellRangeContainer - -void SAL_CALL ScCellRangesObj::addRangeAddress( const table::CellRangeAddress& rRange, - sal_Bool bMergeRanges ) - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRange aRange(static_cast<SCCOL>(rRange.StartColumn), - static_cast<SCROW>(rRange.StartRow), - static_cast<SCTAB>(rRange.Sheet), - static_cast<SCCOL>(rRange.EndColumn), - static_cast<SCROW>(rRange.EndRow), - static_cast<SCTAB>(rRange.Sheet)); - AddRange(aRange, bMergeRanges); -} - -void lcl_RemoveNamedEntry( ScNamedEntryArr_Impl& rNamedEntries, const ScRange& rRange ) -{ - sal_uInt16 nCount = rNamedEntries.Count(); - for ( sal_uInt16 n=nCount; n--; ) - if ( rNamedEntries[n]->GetRange() == rRange ) - rNamedEntries.DeleteAndDestroy( n ); -} - -void SAL_CALL ScCellRangesObj::removeRangeAddress( const table::CellRangeAddress& rRange ) - throw(::com::sun::star::container::NoSuchElementException, - ::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - - ScRangeList aSheetRanges; - ScRangeList aNotSheetRanges; - for (size_t i = 0; i < rRanges.size(); ++i) - { - if (rRanges[ i]->aStart.Tab() == rRange.Sheet) - { - aSheetRanges.Append( *rRanges[ i ] ); - } - else - { - aNotSheetRanges.Append( *rRanges[ i ] ); - } - } - ScMarkData aMarkData; - aMarkData.MarkFromRangeList( aSheetRanges, false ); - ScRange aRange(static_cast<SCCOL>(rRange.StartColumn), - static_cast<SCROW>(rRange.StartRow), - static_cast<SCTAB>(rRange.Sheet), - static_cast<SCCOL>(rRange.EndColumn), - static_cast<SCROW>(rRange.EndRow), - static_cast<SCTAB>(rRange.Sheet)); - if (aMarkData.GetTableSelect( aRange.aStart.Tab() )) - { - aMarkData.MarkToMulti(); - if (aMarkData.IsAllMarked( aRange ) ) - { - aMarkData.SetMultiMarkArea( aRange, false ); - lcl_RemoveNamedEntry(aNamedEntries, aRange); - } - else - throw container::NoSuchElementException(); - } - SetNewRanges(aNotSheetRanges); - ScRangeList aNew; - aMarkData.FillRangeListWithMarks( &aNew, false ); - for ( size_t j = 0; j < aNew.size(); ++j) - { - AddRange(*aNew[ j ], false); - } -} - -void SAL_CALL ScCellRangesObj::addRangeAddresses( const uno::Sequence<table::CellRangeAddress >& rRanges, - sal_Bool bMergeRanges ) - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Int32 nCount(rRanges.getLength()); - if (nCount) - { - const table::CellRangeAddress* pRanges = rRanges.getConstArray(); - for (sal_Int32 i = 0; i < rRanges.getLength(); i++, pRanges++) - { - ScRange aRange(static_cast<SCCOL>(pRanges->StartColumn), - static_cast<SCROW>(pRanges->StartRow), - static_cast<SCTAB>(pRanges->Sheet), - static_cast<SCCOL>(pRanges->EndColumn), - static_cast<SCROW>(pRanges->EndRow), - static_cast<SCTAB>(pRanges->Sheet)); - AddRange(aRange, bMergeRanges); - } - } -} - -void SAL_CALL ScCellRangesObj::removeRangeAddresses( const uno::Sequence<table::CellRangeAddress >& rRangeSeq ) - throw(::com::sun::star::container::NoSuchElementException, - ::com::sun::star::uno::RuntimeException) -{ - // use sometimes a better/faster implementation - sal_uInt32 nCount(rRangeSeq.getLength()); - if (nCount) - { - const table::CellRangeAddress* pRanges = rRangeSeq.getConstArray(); - for (sal_uInt32 i=0; i < nCount; ++i, ++pRanges) - { - removeRangeAddress(*pRanges); - } - } -} - -// XNameContainer - -void lcl_RemoveNamedEntry( ScNamedEntryArr_Impl& rNamedEntries, const String& rName ) -{ - sal_uInt16 nCount = rNamedEntries.Count(); - for ( sal_uInt16 n=nCount; n--; ) - if ( rNamedEntries[n]->GetName() == rName ) - rNamedEntries.DeleteAndDestroy( n ); -} - -void SAL_CALL ScCellRangesObj::insertByName( const rtl::OUString& aName, const uno::Any& aElement ) - throw(lang::IllegalArgumentException, container::ElementExistException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - sal_Bool bDone = false; - - //! Type of aElement can be some specific interface instead of XInterface - - uno::Reference<uno::XInterface> xInterface(aElement, uno::UNO_QUERY); - if ( pDocSh && xInterface.is() ) - { - ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xInterface ); - if ( pRangesImp && pRangesImp->GetDocShell() == pDocSh ) - { - // if explicit name is given and already existing, throw exception - - String aNamStr(aName); - if ( aNamStr.Len() ) - { - sal_uInt16 nNamedCount = aNamedEntries.Count(); - for (sal_uInt16 n=0; n<nNamedCount; n++) - if ( aNamedEntries[n]->GetName() == aNamStr ) - throw container::ElementExistException(); - } - - ScRangeList aNew(GetRangeList()); - const ScRangeList& rAddRanges = pRangesImp->GetRangeList(); - size_t nAddCount = rAddRanges.size(); - for ( size_t i = 0; i < nAddCount; i++ ) - aNew.Join( *rAddRanges[ i ] ); - SetNewRanges(aNew); - bDone = sal_True; - - if ( aName.getLength() && nAddCount == 1 ) - { - // if a name is given, also insert into list of named entries - // (only possible for a single range) - // name is not in aNamedEntries (tested above) - - ScNamedEntry* pEntry = new ScNamedEntry( aNamStr, *rAddRanges[ 0 ] ); - aNamedEntries.Insert( pEntry, aNamedEntries.Count() ); - } - } - } - - if (!bDone) - { - // invalid element - double names are handled above - throw lang::IllegalArgumentException(); - } -} - -sal_Bool lcl_FindRangeByName( const ScRangeList& rRanges, ScDocShell* pDocSh, - const String& rName, size_t& rIndex ) -{ - if (pDocSh) - { - String aRangeStr; - ScDocument* pDoc = pDocSh->GetDocument(); - for ( size_t i = 0, nCount = rRanges.size(); i < nCount; i++ ) - { - rRanges[ i ]->Format( aRangeStr, SCA_VALID | SCA_TAB_3D, pDoc ); - if ( aRangeStr == rName ) - { - rIndex = i; - return sal_True; - } - } - } - return false; // nicht gefunden -} - -sal_Bool lcl_FindRangeOrEntry( const ScNamedEntryArr_Impl& rNamedEntries, - const ScRangeList& rRanges, ScDocShell* pDocSh, - const String& rName, ScRange& rFound ) -{ - // exact range in list? - - size_t nIndex = 0; - if ( lcl_FindRangeByName( rRanges, pDocSh, rName, nIndex ) ) - { - rFound = *rRanges[ nIndex ]; - return true; - } - - // range contained in selection? (sheet must be specified) - - ScRange aCellRange; - sal_uInt16 nParse = aCellRange.ParseAny( rName, pDocSh->GetDocument() ); - if ( ( nParse & ( SCA_VALID | SCA_TAB_3D ) ) == ( SCA_VALID | SCA_TAB_3D ) ) - { - ScMarkData aMarkData; - aMarkData.MarkFromRangeList( rRanges, false ); - aMarkData.MarkToMulti(); // needed for IsAllMarked - if ( aMarkData.IsAllMarked( aCellRange ) ) - { - rFound = aCellRange; - return sal_True; - } - } - - // named entry in this object? - - if ( rNamedEntries.Count() ) - { - for ( sal_uInt16 n=0; n<rNamedEntries.Count(); n++ ) - if ( rNamedEntries[n]->GetName() == rName ) - { - // test if named entry is contained in rRanges - - const ScRange& rComp = rNamedEntries[n]->GetRange(); - ScMarkData aMarkData; - aMarkData.MarkFromRangeList( rRanges, false ); - aMarkData.MarkToMulti(); // needed for IsAllMarked - if ( aMarkData.IsAllMarked( rComp ) ) - { - rFound = rComp; - return sal_True; - } - } - } - - return false; // not found -} - -void SAL_CALL ScCellRangesObj::removeByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - String aNameStr(aName); - ScDocShell* pDocSh = GetDocShell(); - const ScRangeList& rRanges = GetRangeList(); - size_t nIndex = 0; - if ( lcl_FindRangeByName( rRanges, pDocSh, aNameStr, nIndex ) ) - { - // einzelnen Range weglassen - ScRangeList aNew; - for ( size_t i = 0, nCount = rRanges.size(); i < nCount; i++ ) - if (i != nIndex) - aNew.Append( *rRanges[ i ] ); - SetNewRanges(aNew); - bDone = sal_True; - } - else if (pDocSh) - { - // deselect any ranges (parsed or named entry) - ScRangeList aDiff; - sal_Bool bValid = ( aDiff.Parse( aNameStr, pDocSh->GetDocument() ) & SCA_VALID ) != 0; - if ( !bValid && aNamedEntries.Count() ) - { - sal_uInt16 nCount = aNamedEntries.Count(); - for (sal_uInt16 n=0; n<nCount && !bValid; n++) - if (aNamedEntries[n]->GetName() == aNameStr) - { - aDiff.RemoveAll(); - aDiff.Append( aNamedEntries[n]->GetRange() ); - bValid = sal_True; - } - } - if ( bValid ) - { - ScMarkData aMarkData; - aMarkData.MarkFromRangeList( rRanges, false ); - - for ( size_t i = 0, nDiffCount = aDiff.size(); i < nDiffCount; i++ ) - { - ScRange* pDiffRange = aDiff[ i ]; - if (aMarkData.GetTableSelect( pDiffRange->aStart.Tab() )) - aMarkData.SetMultiMarkArea( *pDiffRange, false ); - } - - ScRangeList aNew; - aMarkData.FillRangeListWithMarks( &aNew, false ); - SetNewRanges(aNew); - - bDone = sal_True; //! error if range was not selected before? - } - } - - if (aNamedEntries.Count()) - lcl_RemoveNamedEntry( aNamedEntries, aNameStr ); // remove named entry - - if (!bDone) - throw container::NoSuchElementException(); // not found -} - -// XNameReplace - -void SAL_CALL ScCellRangesObj::replaceByName( const rtl::OUString& aName, const uno::Any& aElement ) - throw(lang::IllegalArgumentException, container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - //! zusammenfassen? - removeByName( aName ); - insertByName( aName, aElement ); -} - -// XNameAccess - -uno::Any SAL_CALL ScCellRangesObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aRet; - - String aNameStr(aName); - ScDocShell* pDocSh = GetDocShell(); - const ScRangeList& rRanges = GetRangeList(); - ScRange aRange; - if ( lcl_FindRangeOrEntry( aNamedEntries, rRanges, pDocSh, aNameStr, aRange ) ) - { - uno::Reference<table::XCellRange> xRange; - if ( aRange.aStart == aRange.aEnd ) - xRange.set(new ScCellObj( pDocSh, aRange.aStart )); - else - xRange.set(new ScCellRangeObj( pDocSh, aRange )); - aRet <<= xRange; - } - else - throw container::NoSuchElementException(); - return aRet; -} - -sal_Bool lcl_FindEntryName( const ScNamedEntryArr_Impl& rNamedEntries, - const ScRange& rRange, String& rName ) -{ - sal_uInt16 nCount = rNamedEntries.Count(); - for (sal_uInt16 i=0; i<nCount; i++) - if (rNamedEntries[i]->GetRange() == rRange) - { - rName = rNamedEntries[i]->GetName(); - return sal_True; - } - return false; -} - -uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesObj::getElementNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - ScDocShell* pDocSh = GetDocShell(); - const ScRangeList& rRanges = GetRangeList(); - if (pDocSh) - { - String aRangeStr; - ScDocument* pDoc = pDocSh->GetDocument(); - size_t nCount = rRanges.size(); - - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pAry = aSeq.getArray(); - for (size_t i=0; i < nCount; i++) - { - // use given name if for exactly this range, otherwise just format - ScRange aRange = *rRanges[ i ]; - if ( !aNamedEntries.Count() || !lcl_FindEntryName( aNamedEntries, aRange, aRangeStr ) ) - aRange.Format( aRangeStr, SCA_VALID | SCA_TAB_3D, pDoc ); - pAry[i] = aRangeStr; - } - return aSeq; - } - return uno::Sequence<rtl::OUString>(0); -} - -sal_Bool SAL_CALL ScCellRangesObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameStr(aName); - ScDocShell* pDocSh = GetDocShell(); - const ScRangeList& rRanges = GetRangeList(); - ScRange aRange; - return lcl_FindRangeOrEntry( aNamedEntries, rRanges, pDocSh, aNameStr, aRange ); -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScCellRangesObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SheetCellRangesEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScCellRangesObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - return rRanges.size(); -} - -uno::Any SAL_CALL ScCellRangesObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<table::XCellRange> xRange(GetObjectByIndex_Impl(nIndex)); - if (xRange.is()) - return uno::makeAny(xRange); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScCellRangesObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<table::XCellRange>*)0); -} - -sal_Bool SAL_CALL ScCellRangesObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - return !rRanges.empty(); -} - -// XServiceInfo - -rtl::OUString SAL_CALL ScCellRangesObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScCellRangesObj" )); -} - -sal_Bool SAL_CALL ScCellRangesObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr(rServiceName); - return aServiceStr.EqualsAscii( SCSHEETCELLRANGES_SERVICE ) || - aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) || - aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) || - aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScCellRangesObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(4); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELLRANGES_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLPROPERTIES_SERVICE )); - pArray[2] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCHARPROPERTIES_SERVICE )); - pArray[3] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCPARAPROPERTIES_SERVICE )); - return aRet; -} - -//------------------------------------------------------------------------ - -uno::Reference<table::XCellRange> ScCellRangeObj::CreateRangeFromDoc( ScDocument* pDoc, const ScRange& rR ) -{ - SfxObjectShell* pObjSh = pDoc->GetDocumentShell(); - if ( pObjSh && pObjSh->ISA(ScDocShell) ) - return new ScCellRangeObj( (ScDocShell*) pObjSh, rR ); - return NULL; -} - -//------------------------------------------------------------------------ - -ScCellRangeObj::ScCellRangeObj(ScDocShell* pDocSh, const ScRange& rR) : - ScCellRangesBase( pDocSh, rR ), - pRangePropSet( lcl_GetRangePropertySet() ), - aRange( rR ) -{ - aRange.Justify(); // Anfang / Ende richtig -} - -ScCellRangeObj::~ScCellRangeObj() -{ -} - -void ScCellRangeObj::RefChanged() -{ - ScCellRangesBase::RefChanged(); - - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE(rRanges.size() == 1, "was fuer Ranges ?!?!"); - if ( !rRanges.empty() ) - { - const ScRange* pFirst = rRanges[0]; - aRange = ScRange(*pFirst); - aRange.Justify(); - } -} - -uno::Any SAL_CALL ScCellRangeObj::queryInterface( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( sheet::XCellRangeAddressable ) - SC_QUERYINTERFACE( table::XCellRange ) - SC_QUERYINTERFACE( sheet::XSheetCellRange ) - SC_QUERYINTERFACE( sheet::XArrayFormulaRange ) - SC_QUERYINTERFACE( sheet::XArrayFormulaTokens ) - SC_QUERYINTERFACE( sheet::XCellRangeData ) - SC_QUERYINTERFACE( sheet::XCellRangeFormula ) - SC_QUERYINTERFACE( sheet::XMultipleOperation ) - SC_QUERYINTERFACE( util::XMergeable ) - SC_QUERYINTERFACE( sheet::XCellSeries ) - SC_QUERYINTERFACE( table::XAutoFormattable ) - SC_QUERYINTERFACE( util::XSortable ) - SC_QUERYINTERFACE( sheet::XSheetFilterableEx ) - SC_QUERYINTERFACE( sheet::XSheetFilterable ) - SC_QUERYINTERFACE( sheet::XSubTotalCalculatable ) - SC_QUERYINTERFACE( table::XColumnRowRange ) - SC_QUERYINTERFACE( util::XImportable ) - SC_QUERYINTERFACE( sheet::XCellFormatRangesSupplier ) - SC_QUERYINTERFACE( sheet::XUniqueCellFormatRangesSupplier ) - - return ScCellRangesBase::queryInterface( rType ); -} - -void SAL_CALL ScCellRangeObj::acquire() throw() -{ - ScCellRangesBase::acquire(); -} - -void SAL_CALL ScCellRangeObj::release() throw() -{ - ScCellRangesBase::release(); -} - -uno::Sequence<uno::Type> SAL_CALL ScCellRangeObj::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - uno::Sequence<uno::Type> aParentTypes(ScCellRangesBase::getTypes()); - long nParentLen = aParentTypes.getLength(); - const uno::Type* pParentPtr = aParentTypes.getConstArray(); - - aTypes.realloc( nParentLen + 17 ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XCellRangeAddressable>*)0); - pPtr[nParentLen + 1] = getCppuType((const uno::Reference<sheet::XSheetCellRange>*)0); - pPtr[nParentLen + 2] = getCppuType((const uno::Reference<sheet::XArrayFormulaRange>*)0); - pPtr[nParentLen + 3] = getCppuType((const uno::Reference<sheet::XArrayFormulaTokens>*)0); - pPtr[nParentLen + 4] = getCppuType((const uno::Reference<sheet::XCellRangeData>*)0); - pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XCellRangeFormula>*)0); - pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XMultipleOperation>*)0); - pPtr[nParentLen + 7] = getCppuType((const uno::Reference<util::XMergeable>*)0); - pPtr[nParentLen + 8] = getCppuType((const uno::Reference<sheet::XCellSeries>*)0); - pPtr[nParentLen + 9] = getCppuType((const uno::Reference<table::XAutoFormattable>*)0); - pPtr[nParentLen +10] = getCppuType((const uno::Reference<util::XSortable>*)0); - pPtr[nParentLen +11] = getCppuType((const uno::Reference<sheet::XSheetFilterableEx>*)0); - pPtr[nParentLen +12] = getCppuType((const uno::Reference<sheet::XSubTotalCalculatable>*)0); - pPtr[nParentLen +13] = getCppuType((const uno::Reference<table::XColumnRowRange>*)0); - pPtr[nParentLen +14] = getCppuType((const uno::Reference<util::XImportable>*)0); - pPtr[nParentLen +15] = getCppuType((const uno::Reference<sheet::XCellFormatRangesSupplier>*)0); - pPtr[nParentLen +16] = getCppuType((const uno::Reference<sheet::XUniqueCellFormatRangesSupplier>*)0); - - for (long i=0; i<nParentLen; i++) - pPtr[i] = pParentPtr[i]; // parent types first - } - return aTypes; -} - -namespace -{ - class theScCellRangeObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScCellRangeObjImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScCellRangeObj::getImplementationId() - throw(uno::RuntimeException) -{ - return theScCellRangeObjImplementationId::get().getSeq(); -} - -// XCellRange - -// ColumnCount / RowCount sind weggefallen -//! werden im Writer fuer Tabellen noch gebraucht ??? - -uno::Reference<table::XCell> ScCellRangeObj::GetCellByPosition_Impl( - sal_Int32 nColumn, sal_Int32 nRow ) - throw(lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - ScDocShell* pDocSh = GetDocShell(); - if (!pDocSh) - throw uno::RuntimeException(); - - if ( nColumn >= 0 && nRow >= 0 ) - { - sal_Int32 nPosX = aRange.aStart.Col() + nColumn; - sal_Int32 nPosY = aRange.aStart.Row() + nRow; - - if ( nPosX <= aRange.aEnd.Col() && nPosY <= aRange.aEnd.Row() ) - { - ScAddress aNew( (SCCOL)nPosX, (SCROW)nPosY, aRange.aStart.Tab() ); - return new ScCellObj( pDocSh, aNew ); - } - } - - throw lang::IndexOutOfBoundsException(); -} - -uno::Reference<table::XCell> SAL_CALL ScCellRangeObj::getCellByPosition( - sal_Int32 nColumn, sal_Int32 nRow ) - throw(lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - return GetCellByPosition_Impl(nColumn, nRow); -} - -uno::Reference<table::XCellRange> SAL_CALL ScCellRangeObj::getCellRangeByPosition( - sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom ) - throw(lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - ScDocShell* pDocSh = GetDocShell(); - if (!pDocSh) - throw uno::RuntimeException(); - - if ( nLeft >= 0 && nTop >= 0 && nRight >= 0 && nBottom >= 0 ) - { - sal_Int32 nStartX = aRange.aStart.Col() + nLeft; - sal_Int32 nStartY = aRange.aStart.Row() + nTop; - sal_Int32 nEndX = aRange.aStart.Col() + nRight; - sal_Int32 nEndY = aRange.aStart.Row() + nBottom; - - if ( nStartX <= nEndX && nEndX <= aRange.aEnd.Col() && - nStartY <= nEndY && nEndY <= aRange.aEnd.Row() ) - { - ScRange aNew( (SCCOL)nStartX, (SCROW)nStartY, aRange.aStart.Tab(), - (SCCOL)nEndX, (SCROW)nEndY, aRange.aEnd.Tab() ); - return new ScCellRangeObj( pDocSh, aNew ); - } - } - - throw lang::IndexOutOfBoundsException(); -} - -uno::Reference<table::XCellRange> SAL_CALL ScCellRangeObj::getCellRangeByName( - const rtl::OUString& aName ) throw(uno::RuntimeException) -{ - return getCellRangeByName( aName, ScAddress::detailsOOOa1 ); -} - -uno::Reference<table::XCellRange> ScCellRangeObj::getCellRangeByName( - const rtl::OUString& aName, const ScAddress::Details& rDetails ) throw(uno::RuntimeException) -{ - // name refers to the whole document (with the range's table as default), - // valid only if the range is within this range - - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = aRange.aStart.Tab(); - - ScRange aCellRange; - sal_Bool bFound = false; - String aString(aName); - sal_uInt16 nParse = aCellRange.ParseAny( aString, pDoc, rDetails ); - if ( nParse & SCA_VALID ) - { - if ( !(nParse & SCA_TAB_3D) ) // keine Tabelle angegeben -> auf dieser Tabelle - { - aCellRange.aStart.SetTab(nTab); - aCellRange.aEnd.SetTab(nTab); - } - bFound = sal_True; - } - else - { - ScRangeUtil aRangeUtil; - if ( aRangeUtil.MakeRangeFromName( aString, pDoc, nTab, aCellRange, RUTL_NAMES ) || - aRangeUtil.MakeRangeFromName( aString, pDoc, nTab, aCellRange, RUTL_DBASE ) ) - bFound = sal_True; - } - - if (bFound) // valid only if within this object's range - { - if (!aRange.In(aCellRange)) - bFound = false; - } - - if (bFound) - { - if ( aCellRange.aStart == aCellRange.aEnd ) - return new ScCellObj( pDocSh, aCellRange.aStart ); - else - return new ScCellRangeObj( pDocSh, aCellRange ); - } - } - - throw uno::RuntimeException(); -} - -// XColumnRowRange - -uno::Reference<table::XTableColumns> SAL_CALL ScCellRangeObj::getColumns() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - return new ScTableColumnsObj( pDocSh, aRange.aStart.Tab(), - aRange.aStart.Col(), aRange.aEnd.Col() ); - - OSL_FAIL("Dokument ungueltig"); - return NULL; -} - -uno::Reference<table::XTableRows> SAL_CALL ScCellRangeObj::getRows() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - return new ScTableRowsObj( pDocSh, aRange.aStart.Tab(), - aRange.aStart.Row(), aRange.aEnd.Row() ); - - OSL_FAIL("Dokument ungueltig"); - return NULL; -} - -// XAddressableCellRange - -table::CellRangeAddress SAL_CALL ScCellRangeObj::getRangeAddress() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellRangeAddress aRet; - ScUnoConversion::FillApiRange( aRet, aRange ); - return aRet; -} - -// XSheetCellRange - -uno::Reference<sheet::XSpreadsheet> SAL_CALL ScCellRangeObj::getSpreadsheet() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - return new ScTableSheetObj( pDocSh, aRange.aStart.Tab() ); - - OSL_FAIL("Dokument ungueltig"); - return NULL; -} - -// XArrayFormulaRange - -rtl::OUString SAL_CALL ScCellRangeObj::getArrayFormula() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - // Matrix-Formel, wenn eindeutig Teil einer Matrix, - // also wenn Anfang und Ende des Blocks zur selben Matrix gehoeren. - // Sonst Leerstring. - - String aFormula; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - ScDocument* pDoc = pDocSh->GetDocument(); - const ScBaseCell* pCell1 = pDoc->GetCell( aRange.aStart ); - const ScBaseCell* pCell2 = pDoc->GetCell( aRange.aEnd ); - if ( pCell1 && pCell2 && pCell1->GetCellType() == CELLTYPE_FORMULA && - pCell2->GetCellType() == CELLTYPE_FORMULA ) - { - const ScFormulaCell* pFCell1 = (const ScFormulaCell*)pCell1; - const ScFormulaCell* pFCell2 = (const ScFormulaCell*)pCell2; - ScAddress aStart1; - ScAddress aStart2; - if ( pFCell1->GetMatrixOrigin( aStart1 ) && pFCell2->GetMatrixOrigin( aStart2 ) ) - { - if ( aStart1 == aStart2 ) // beides dieselbe Matrix - pFCell1->GetFormula( aFormula ); // egal, von welcher Zelle - } - } - } - return aFormula; -} - -void ScCellRangeObj::SetArrayFormula_Impl( const rtl::OUString& rFormula, - const rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) throw(uno::RuntimeException) -{ - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - ScDocFunc aFunc(*pDocSh); - if ( rFormula.getLength() ) - { - if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) ) - { - // don't set array formula for sheet object - throw uno::RuntimeException(); - } - - aFunc.EnterMatrix( aRange, NULL, NULL, rFormula, sal_True, sal_True, rFormulaNmsp, eGrammar ); - } - else - { - // empty string -> erase array formula - ScMarkData aMark; - aMark.SetMarkArea( aRange ); - aMark.SelectTable( aRange.aStart.Tab(), sal_True ); - aFunc.DeleteContents( aMark, IDF_CONTENTS, sal_True, sal_True ); - } - } -} - -void SAL_CALL ScCellRangeObj::setArrayFormula( const rtl::OUString& aFormula ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // GRAM_PODF_A1 for API compatibility. - SetArrayFormula_Impl( aFormula, ::rtl::OUString(), formula::FormulaGrammar::GRAM_PODF_A1); -} - -void ScCellRangeObj::SetArrayFormulaWithGrammar( const rtl::OUString& rFormula, - const rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SetArrayFormula_Impl( rFormula, rFormulaNmsp, eGrammar); -} - -// XArrayFormulaTokens - -uno::Sequence<sheet::FormulaToken> SAL_CALL ScCellRangeObj::getArrayTokens() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - // same cell logic as in getArrayFormula - - uno::Sequence<sheet::FormulaToken> aSequence; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - const ScBaseCell* pCell1 = pDoc->GetCell( aRange.aStart ); - const ScBaseCell* pCell2 = pDoc->GetCell( aRange.aEnd ); - if ( pCell1 && pCell2 && pCell1->GetCellType() == CELLTYPE_FORMULA && - pCell2->GetCellType() == CELLTYPE_FORMULA ) - { - const ScFormulaCell* pFCell1 = (const ScFormulaCell*)pCell1; - const ScFormulaCell* pFCell2 = (const ScFormulaCell*)pCell2; - ScAddress aStart1; - ScAddress aStart2; - if ( pFCell1->GetMatrixOrigin( aStart1 ) && pFCell2->GetMatrixOrigin( aStart2 ) ) - { - if ( aStart1 == aStart2 ) - { - ScTokenArray* pTokenArray = pFCell1->GetCode(); - if ( pTokenArray ) - (void)ScTokenConversion::ConvertToTokenSequence( *pDoc, aSequence, *pTokenArray ); - } - } - } - } - return aSequence; -} - -void SAL_CALL ScCellRangeObj::setArrayTokens( const uno::Sequence<sheet::FormulaToken>& rTokens ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocFunc aFunc(*pDocSh); - if ( rTokens.getLength() ) - { - if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) ) - { - throw uno::RuntimeException(); - } - - ScDocument* pDoc = pDocSh->GetDocument(); - ScTokenArray aTokenArray; - (void)ScTokenConversion::ConvertToTokenArray( *pDoc, aTokenArray, rTokens ); - - // Actually GRAM_PODF_A1 is a don't-care here because of the token - // array being set, it fits with other API compatibility grammars - // though. - aFunc.EnterMatrix( aRange, NULL, &aTokenArray, EMPTY_STRING, sal_True, sal_True, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 ); - } - else - { - // empty sequence -> erase array formula - ScMarkData aMark; - aMark.SetMarkArea( aRange ); - aMark.SelectTable( aRange.aStart.Tab(), sal_True ); - aFunc.DeleteContents( aMark, IDF_CONTENTS, sal_True, sal_True ); - } - } -} - -// XCellRangeData - -uno::Sequence< uno::Sequence<uno::Any> > SAL_CALL ScCellRangeObj::getDataArray() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) ) - { - // don't create a data array for the sheet - throw uno::RuntimeException(); - } - - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - uno::Any aAny; - // bAllowNV = TRUE: errors as void - if ( ScRangeToSequence::FillMixedArray( aAny, pDocSh->GetDocument(), aRange, sal_True ) ) - { - uno::Sequence< uno::Sequence<uno::Any> > aSeq; - if ( aAny >>= aSeq ) - return aSeq; // success - } - } - - throw uno::RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScCellRangeObj::setDataArray( - const uno::Sequence< uno::Sequence<uno::Any> >& aArray ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Bool bDone = false; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - //! move lcl_PutDataArray to docfunc? - bDone = lcl_PutDataArray( *pDocSh, aRange, aArray ); - } - - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -// XCellRangeFormula - -uno::Sequence< uno::Sequence<rtl::OUString> > SAL_CALL ScCellRangeObj::getFormulaArray() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( ScTableSheetObj::getImplementation( (cppu::OWeakObject*)this ) ) - { - // don't create a data array for the sheet - throw uno::RuntimeException(); - } - - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - SCCOL nStartCol = aRange.aStart.Col(); - SCROW nStartRow = aRange.aStart.Row(); - SCCOL nEndCol = aRange.aEnd.Col(); - SCROW nEndRow = aRange.aEnd.Row(); - SCCOL nColCount = nEndCol + 1 - nStartCol; - SCROW nRowCount = nEndRow + 1 - nStartRow; - SCTAB nTab = aRange.aStart.Tab(); - - uno::Sequence< uno::Sequence<rtl::OUString> > aRowSeq( nRowCount ); - uno::Sequence<rtl::OUString>* pRowAry = aRowSeq.getArray(); - for (SCROW nRowIndex = 0; nRowIndex < nRowCount; nRowIndex++) - { - uno::Sequence<rtl::OUString> aColSeq( nColCount ); - rtl::OUString* pColAry = aColSeq.getArray(); - for (SCCOL nColIndex = 0; nColIndex < nColCount; nColIndex++) - pColAry[nColIndex] = lcl_GetInputString( pDocSh->GetDocument(), - ScAddress( nStartCol+nColIndex, nStartRow+nRowIndex, nTab ), sal_True ); - - pRowAry[nRowIndex] = aColSeq; - } - - return aRowSeq; - } - - throw uno::RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScCellRangeObj::setFormulaArray( - const uno::Sequence< uno::Sequence<rtl::OUString> >& aArray ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Bool bDone = false; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - ScExternalRefManager::ApiGuard aExtRefGuard(pDocSh->GetDocument()); - - // GRAM_PODF_A1 for API compatibility. - bDone = lcl_PutFormulaArray( *pDocSh, aRange, aArray, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 ); - } - - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -// XMultipleOperation - -void SAL_CALL ScCellRangeObj::setTableOperation( const table::CellRangeAddress& aFormulaRange, - sheet::TableOperationMode nMode, - const table::CellAddress& aColumnCell, - const table::CellAddress& aRowCell ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - sal_Bool bError = false; - ScTabOpParam aParam; - aParam.aRefFormulaCell = ScRefAddress( (SCCOL)aFormulaRange.StartColumn, - (SCROW)aFormulaRange.StartRow, aFormulaRange.Sheet, - false, false, false ); - aParam.aRefFormulaEnd = ScRefAddress( (SCCOL)aFormulaRange.EndColumn, - (SCROW)aFormulaRange.EndRow, aFormulaRange.Sheet, - false, false, false ); - aParam.aRefRowCell = ScRefAddress( (SCCOL)aRowCell.Column, - (SCROW)aRowCell.Row, aRowCell.Sheet, - false, false, false ); - aParam.aRefColCell = ScRefAddress( (SCCOL)aColumnCell.Column, - (SCROW)aColumnCell.Row, aColumnCell.Sheet, - false, false, false ); - switch (nMode) - { - case sheet::TableOperationMode_COLUMN: - aParam.nMode = 0; - break; - case sheet::TableOperationMode_ROW: - aParam.nMode = 1; - break; - case sheet::TableOperationMode_BOTH: - aParam.nMode = 2; - break; - default: - bError = sal_True; - } - - if (!bError) - { - ScDocFunc aFunc(*pDocSh); - aFunc.TabOp( aRange, NULL, aParam, sal_True, sal_True ); - } - } -} - -// XMergeable - -void SAL_CALL ScCellRangeObj::merge( sal_Bool bMerge ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocFunc aFunc(*pDocSh); - ScCellMergeOption aMergeOption( - aRange.aStart.Col(), aRange.aStart.Row(), - aRange.aEnd.Col(), aRange.aEnd.Row(), false); - aMergeOption.maTabs.insert(aRange.aStart.Tab()); - if ( bMerge ) - aFunc.MergeCells( aMergeOption, false, true, true ); - else - aFunc.UnmergeCells( aMergeOption, true, true ); - - //! Fehler abfangen? - } -} - -sal_Bool SAL_CALL ScCellRangeObj::getIsMerged() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - return pDocSh && pDocSh->GetDocument()->HasAttrib( aRange, HASATTR_MERGED ); -} - -// XCellSeries - -void SAL_CALL ScCellRangeObj::fillSeries( sheet::FillDirection nFillDirection, - sheet::FillMode nFillMode, sheet::FillDateMode nFillDateMode, - double fStep, double fEndValue ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - sal_Bool bError = false; - - FillDir eDir = FILL_TO_BOTTOM; - switch (nFillDirection) - { - case sheet::FillDirection_TO_BOTTOM: - eDir = FILL_TO_BOTTOM; - break; - case sheet::FillDirection_TO_RIGHT: - eDir = FILL_TO_RIGHT; - break; - case sheet::FillDirection_TO_TOP: - eDir = FILL_TO_TOP; - break; - case sheet::FillDirection_TO_LEFT: - eDir = FILL_TO_LEFT; - break; - default: - bError = sal_True; - } - - FillCmd eCmd = FILL_SIMPLE; - switch ( nFillMode ) - { - case sheet::FillMode_SIMPLE: - eCmd = FILL_SIMPLE; - break; - case sheet::FillMode_LINEAR: - eCmd = FILL_LINEAR; - break; - case sheet::FillMode_GROWTH: - eCmd = FILL_GROWTH; - break; - case sheet::FillMode_DATE: - eCmd = FILL_DATE; - break; - case sheet::FillMode_AUTO: - eCmd = FILL_AUTO; - break; - default: - bError = sal_True; - } - - FillDateCmd eDateCmd = FILL_DAY; - switch ( nFillDateMode ) - { - case sheet::FillDateMode_FILL_DATE_DAY: - eDateCmd = FILL_DAY; - break; - case sheet::FillDateMode_FILL_DATE_WEEKDAY: - eDateCmd = FILL_WEEKDAY; - break; - case sheet::FillDateMode_FILL_DATE_MONTH: - eDateCmd = FILL_MONTH; - break; - case sheet::FillDateMode_FILL_DATE_YEAR: - eDateCmd = FILL_YEAR; - break; - default: - bError = sal_True; - } - - if (!bError) - { - ScDocFunc aFunc(*pDocSh); - aFunc.FillSeries( aRange, NULL, eDir, eCmd, eDateCmd, - MAXDOUBLE, fStep, fEndValue, sal_True, sal_True ); - } - } -} - -void SAL_CALL ScCellRangeObj::fillAuto( sheet::FillDirection nFillDirection, - sal_Int32 nSourceCount ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh && nSourceCount ) - { - ScRange aSourceRange(aRange); - SCsCOLROW nCount = 0; // "Dest-Count" - FillDir eDir = FILL_TO_BOTTOM; - sal_Bool bError = false; - switch (nFillDirection) - { - case sheet::FillDirection_TO_BOTTOM: - aSourceRange.aEnd.SetRow( static_cast<SCROW>( aSourceRange.aStart.Row() + nSourceCount - 1 ) ); - nCount = aRange.aEnd.Row() - aSourceRange.aEnd.Row(); - eDir = FILL_TO_BOTTOM; - break; - case sheet::FillDirection_TO_RIGHT: - aSourceRange.aEnd.SetCol( static_cast<SCCOL>( aSourceRange.aStart.Col() + nSourceCount - 1 ) ); - nCount = aRange.aEnd.Col() - aSourceRange.aEnd.Col(); - eDir = FILL_TO_RIGHT; - break; - case sheet::FillDirection_TO_TOP: - aSourceRange.aStart.SetRow( static_cast<SCROW>( aSourceRange.aEnd.Row() - nSourceCount + 1 ) ); - nCount = aSourceRange.aStart.Row() - aRange.aStart.Row(); - eDir = FILL_TO_TOP; - break; - case sheet::FillDirection_TO_LEFT: - aSourceRange.aStart.SetCol( static_cast<SCCOL>( aSourceRange.aEnd.Col() - nSourceCount + 1 ) ); - nCount = aSourceRange.aStart.Col() - aRange.aStart.Col(); - eDir = FILL_TO_LEFT; - break; - default: - bError = sal_True; - } - if (nCount < 0 || nCount > MAXROW) // overflow - bError = sal_True; - - if (!bError) - { - ScDocFunc aFunc(*pDocSh); - aFunc.FillAuto( aSourceRange, NULL, eDir, nCount, sal_True, sal_True ); - } - } -} - -// XAutoFormattable - -void SAL_CALL ScCellRangeObj::autoFormat( const rtl::OUString& aName ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAutoFormat* pAutoFormat = ScGlobal::GetAutoFormat(); - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh && pAutoFormat ) - { - String aNameString(aName); - sal_uInt16 nCount = pAutoFormat->GetCount(); - sal_uInt16 nIndex; - String aCompare; - for (nIndex=0; nIndex<nCount; nIndex++) - { - (*pAutoFormat)[nIndex]->GetName(aCompare); - if ( aCompare == aNameString ) //! Case-insensitiv ??? - break; - } - if (nIndex<nCount) - { - ScDocFunc aFunc(*pDocSh); - aFunc.AutoFormat( aRange, NULL, nIndex, sal_True, sal_True ); - } - else - throw lang::IllegalArgumentException(); - } -} - -// XSortable - -uno::Sequence<beans::PropertyValue> SAL_CALL ScCellRangeObj::createSortDescriptor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSortParam aParam; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich - ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK ); - if (pData) - { - pData->GetSortParam(aParam); - - // im SortDescriptor sind die Fields innerhalb des Bereichs gezaehlt - ScRange aDBRange; - pData->GetArea(aDBRange); - SCCOLROW nFieldStart = aParam.bByRow ? - static_cast<SCCOLROW>(aDBRange.aStart.Col()) : - static_cast<SCCOLROW>(aDBRange.aStart.Row()); - for (sal_uInt16 i=0; i<MAXSORT; i++) - if ( aParam.bDoSort[i] && aParam.nField[i] >= nFieldStart ) - aParam.nField[i] -= nFieldStart; - } - } - - uno::Sequence<beans::PropertyValue> aSeq( ScSortDescriptor::GetPropertyCount() ); - ScSortDescriptor::FillProperties( aSeq, aParam ); - return aSeq; -} - -void SAL_CALL ScCellRangeObj::sort( const uno::Sequence<beans::PropertyValue>& aDescriptor ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - sal_uInt16 i; - ScSortParam aParam; - ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK ); // ggf. Bereich anlegen - if (pData) - { - // alten Einstellungen holen, falls nicht alles neu gesetzt wird - pData->GetSortParam(aParam); - SCCOLROW nOldStart = aParam.bByRow ? - static_cast<SCCOLROW>(aRange.aStart.Col()) : - static_cast<SCCOLROW>(aRange.aStart.Row()); - for (i=0; i<MAXSORT; i++) - if ( aParam.bDoSort[i] && aParam.nField[i] >= nOldStart ) - aParam.nField[i] -= nOldStart; - } - - ScSortDescriptor::FillSortParam( aParam, aDescriptor ); - - // im SortDescriptor sind die Fields innerhalb des Bereichs gezaehlt - // ByRow kann bei FillSortParam umgesetzt worden sein - SCCOLROW nFieldStart = aParam.bByRow ? - static_cast<SCCOLROW>(aRange.aStart.Col()) : - static_cast<SCCOLROW>(aRange.aStart.Row()); - for (i=0; i<MAXSORT; i++) - aParam.nField[i] += nFieldStart; - - SCTAB nTab = aRange.aStart.Tab(); - aParam.nCol1 = aRange.aStart.Col(); - aParam.nRow1 = aRange.aStart.Row(); - aParam.nCol2 = aRange.aEnd.Col(); - aParam.nRow2 = aRange.aEnd.Row(); - - pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK ); // ggf. Bereich anlegen - - ScDBDocFunc aFunc(*pDocSh); // Bereich muss angelegt sein - aFunc.Sort( nTab, aParam, sal_True, sal_True, sal_True ); - } -} - -// XFilterable - -uno::Reference<sheet::XSheetFilterDescriptor> SAL_CALL ScCellRangeObj::createFilterDescriptor( - sal_Bool bEmpty ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - ScFilterDescriptor* pNew = new ScFilterDescriptor(pDocSh); - if ( !bEmpty && pDocSh ) - { - // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich - ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK ); - if (pData) - { - ScQueryParam aParam; - pData->GetQueryParam(aParam); - // im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt - ScRange aDBRange; - pData->GetArea(aDBRange); - SCCOLROW nFieldStart = aParam.bByRow ? - static_cast<SCCOLROW>(aDBRange.aStart.Col()) : - static_cast<SCCOLROW>(aDBRange.aStart.Row()); - SCSIZE nCount = aParam.GetEntryCount(); - for (SCSIZE i=0; i<nCount; i++) - { - ScQueryEntry& rEntry = aParam.GetEntry(i); - if (rEntry.bDoQuery && rEntry.nField >= nFieldStart) - rEntry.nField -= nFieldStart; - } - pNew->SetParam(aParam); - } - } - return pNew; -} - -void SAL_CALL ScCellRangeObj::filter( const uno::Reference<sheet::XSheetFilterDescriptor>& xDescriptor ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - // das koennte theoretisch ein fremdes Objekt sein, also nur das - // oeffentliche XSheetFilterDescriptor Interface benutzen, um - // die Daten in ein ScFilterDescriptor Objekt zu kopieren: - //! wenn es schon ein ScFilterDescriptor ist, direkt per getImplementation? - - ScDocShell* pDocSh = GetDocShell(); - ScFilterDescriptor aImpl(pDocSh); - uno::Reference< sheet::XSheetFilterDescriptor2 > xDescriptor2( xDescriptor, uno::UNO_QUERY ); - if ( xDescriptor2.is() ) - { - aImpl.setFilterFields2( xDescriptor2->getFilterFields2() ); - } - else - { - aImpl.setFilterFields( xDescriptor->getFilterFields() ); - } - // Rest sind jetzt Properties... - - uno::Reference<beans::XPropertySet> xPropSet( xDescriptor, uno::UNO_QUERY ); - if (xPropSet.is()) - lcl_CopyProperties( aImpl, *(beans::XPropertySet*)xPropSet.get() ); - - // - // ausfuehren... - // - - if (pDocSh) - { - ScQueryParam aParam = aImpl.GetParam(); - // im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt - SCCOLROW nFieldStart = aParam.bByRow ? - static_cast<SCCOLROW>(aRange.aStart.Col()) : - static_cast<SCCOLROW>(aRange.aStart.Row()); - SCSIZE nCount = aParam.GetEntryCount(); - for (SCSIZE i=0; i<nCount; i++) - { - ScQueryEntry& rEntry = aParam.GetEntry(i); - if (rEntry.bDoQuery) - { - rEntry.nField += nFieldStart; - // Im Dialog wird immer der String angezeigt -> muss zum Wert passen - if ( !rEntry.bQueryByString ) - pDocSh->GetDocument()->GetFormatTable()-> - GetInputLineString( rEntry.nVal, 0, *rEntry.pStr ); - } - } - - SCTAB nTab = aRange.aStart.Tab(); - aParam.nCol1 = aRange.aStart.Col(); - aParam.nRow1 = aRange.aStart.Row(); - aParam.nCol2 = aRange.aEnd.Col(); - aParam.nRow2 = aRange.aEnd.Row(); - - pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK ); // ggf. Bereich anlegen - - //! keep source range in filter descriptor - //! if created by createFilterDescriptorByObject ??? - - ScDBDocFunc aFunc(*pDocSh); - aFunc.Query( nTab, aParam, NULL, sal_True, sal_True ); // Bereich muss angelegt sein - } -} - -//! get/setAutoFilter als Properties!!! - -// XAdvancedFilterSource - -uno::Reference<sheet::XSheetFilterDescriptor> SAL_CALL ScCellRangeObj::createFilterDescriptorByObject( - const uno::Reference<sheet::XSheetFilterable>& xObject ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - // this ist hier nicht der Bereich, der gefiltert wird, sondern der - // Bereich mit der Abfrage... - - uno::Reference<sheet::XCellRangeAddressable> xAddr( xObject, uno::UNO_QUERY ); - - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh && xAddr.is() ) - { - //! Test, ob xObject im selben Dokument ist - - ScFilterDescriptor* pNew = new ScFilterDescriptor(pDocSh); //! stattdessen vom Objekt? - - ScQueryParam aParam = pNew->GetParam(); - aParam.bHasHeader = sal_True; - - table::CellRangeAddress aDataAddress(xAddr->getRangeAddress()); - aParam.nCol1 = (SCCOL)aDataAddress.StartColumn; - aParam.nRow1 = (SCROW)aDataAddress.StartRow; - aParam.nCol2 = (SCCOL)aDataAddress.EndColumn; - aParam.nRow2 = (SCROW)aDataAddress.EndRow; - aParam.nTab = aDataAddress.Sheet; - - ScDocument* pDoc = pDocSh->GetDocument(); - sal_Bool bOk = pDoc->CreateQueryParam( - aRange.aStart.Col(), aRange.aStart.Row(), - aRange.aEnd.Col(), aRange.aEnd.Row(), - aRange.aStart.Tab(), aParam ); - if ( bOk ) - { - // im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt - SCCOLROW nFieldStart = aParam.bByRow ? - static_cast<SCCOLROW>(aDataAddress.StartColumn) : - static_cast<SCCOLROW>(aDataAddress.StartRow); - SCSIZE nCount = aParam.GetEntryCount(); - for (SCSIZE i=0; i<nCount; i++) - { - ScQueryEntry& rEntry = aParam.GetEntry(i); - if (rEntry.bDoQuery && rEntry.nField >= nFieldStart) - rEntry.nField -= nFieldStart; - } - - pNew->SetParam( aParam ); - return pNew; - } - else - { - delete pNew; - return NULL; // ungueltig -> null - } - } - - OSL_FAIL("kein Dokument oder kein Bereich"); - return NULL; -} - -// XSubTotalSource - -uno::Reference<sheet::XSubTotalDescriptor> SAL_CALL ScCellRangeObj::createSubTotalDescriptor( - sal_Bool bEmpty ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSubTotalDescriptor* pNew = new ScSubTotalDescriptor; - ScDocShell* pDocSh = GetDocShell(); - if ( !bEmpty && pDocSh ) - { - // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich - ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK ); - if (pData) - { - ScSubTotalParam aParam; - pData->GetSubTotalParam(aParam); - // im SubTotalDescriptor sind die Fields innerhalb des Bereichs gezaehlt - ScRange aDBRange; - pData->GetArea(aDBRange); - SCCOL nFieldStart = aDBRange.aStart.Col(); - for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++) - { - if ( aParam.bGroupActive[i] ) - { - if ( aParam.nField[i] >= nFieldStart ) - aParam.nField[i] = sal::static_int_cast<SCCOL>( aParam.nField[i] - nFieldStart ); - for (SCCOL j=0; j<aParam.nSubTotals[i]; j++) - if ( aParam.pSubTotals[i][j] >= nFieldStart ) - aParam.pSubTotals[i][j] = sal::static_int_cast<SCCOL>( aParam.pSubTotals[i][j] - nFieldStart ); - } - } - pNew->SetParam(aParam); - } - } - return pNew; -} - -void SAL_CALL ScCellRangeObj::applySubTotals( - const uno::Reference<sheet::XSubTotalDescriptor>& xDescriptor, - sal_Bool bReplace ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if (!xDescriptor.is()) return; - - ScDocShell* pDocSh = GetDocShell(); - ScSubTotalDescriptorBase* pImp = - ScSubTotalDescriptorBase::getImplementation( xDescriptor ); - - if (pDocSh && pImp) - { - ScSubTotalParam aParam; - pImp->GetData(aParam); // virtuelle Methode der Basisklasse - - // im SubTotalDescriptor sind die Fields innerhalb des Bereichs gezaehlt - SCCOL nFieldStart = aRange.aStart.Col(); - for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++) - { - if ( aParam.bGroupActive[i] ) - { - aParam.nField[i] = sal::static_int_cast<SCCOL>( aParam.nField[i] + nFieldStart ); - for (SCCOL j=0; j<aParam.nSubTotals[i]; j++) - aParam.pSubTotals[i][j] = sal::static_int_cast<SCCOL>( aParam.pSubTotals[i][j] + nFieldStart ); - } - } - - aParam.bReplace = bReplace; - - SCTAB nTab = aRange.aStart.Tab(); - aParam.nCol1 = aRange.aStart.Col(); - aParam.nRow1 = aRange.aStart.Row(); - aParam.nCol2 = aRange.aEnd.Col(); - aParam.nRow2 = aRange.aEnd.Row(); - - pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK ); // ggf. Bereich anlegen - - ScDBDocFunc aFunc(*pDocSh); - aFunc.DoSubTotals( nTab, aParam, NULL, sal_True, sal_True ); // Bereich muss angelegt sein - } -} - -void SAL_CALL ScCellRangeObj::removeSubTotals() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - ScSubTotalParam aParam; - ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK ); - if (pData) - pData->GetSubTotalParam(aParam); // auch bei Remove die Feld-Eintraege behalten - - aParam.bRemoveOnly = sal_True; - - SCTAB nTab = aRange.aStart.Tab(); - aParam.nCol1 = aRange.aStart.Col(); - aParam.nRow1 = aRange.aStart.Row(); - aParam.nCol2 = aRange.aEnd.Col(); - aParam.nRow2 = aRange.aEnd.Row(); - - pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK ); // ggf. Bereich anlegen - - ScDBDocFunc aFunc(*pDocSh); - aFunc.DoSubTotals( nTab, aParam, NULL, sal_True, sal_True ); // Bereich muss angelegt sein - } -} - -uno::Sequence<beans::PropertyValue> SAL_CALL ScCellRangeObj::createImportDescriptor( sal_Bool bEmpty ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScImportParam aParam; - ScDocShell* pDocSh = GetDocShell(); - if ( !bEmpty && pDocSh ) - { - // DB-Bereich anlegen erst beim Ausfuehren, per API immer genau den Bereich - ScDBData* pData = pDocSh->GetDBData( aRange, SC_DB_OLD, SC_DBSEL_FORCE_MARK ); - if (pData) - pData->GetImportParam(aParam); - } - - uno::Sequence<beans::PropertyValue> aSeq( ScImportDescriptor::GetPropertyCount() ); - ScImportDescriptor::FillProperties( aSeq, aParam ); - return aSeq; -} - -void SAL_CALL ScCellRangeObj::doImport( const uno::Sequence<beans::PropertyValue>& aDescriptor ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - ScImportParam aParam; - ScImportDescriptor::FillImportParam( aParam, aDescriptor ); - - SCTAB nTab = aRange.aStart.Tab(); - aParam.nCol1 = aRange.aStart.Col(); - aParam.nRow1 = aRange.aStart.Row(); - aParam.nCol2 = aRange.aEnd.Col(); - aParam.nRow2 = aRange.aEnd.Row(); - - //! TODO: could we get passed a valid result set by any means? - uno::Reference< sdbc::XResultSet > xResultSet; - - pDocSh->GetDBData( aRange, SC_DB_MAKE, SC_DBSEL_FORCE_MARK ); // ggf. Bereich anlegen - - ScDBDocFunc aFunc(*pDocSh); // Bereich muss angelegt sein - aFunc.DoImport( nTab, aParam, xResultSet, NULL, sal_True, false ); //! Api-Flag als Parameter - } -} - -// XCellFormatRangesSupplier - -uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangeObj::getCellFormatRanges() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - return new ScCellFormatsObj( pDocSh, aRange ); - return NULL; -} - -// XUniqueCellFormatRangesSupplier - -uno::Reference<container::XIndexAccess> SAL_CALL ScCellRangeObj::getUniqueCellFormatRanges() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - return new ScUniqueCellFormatsObj( pDocSh, aRange ); - return NULL; -} - -// XPropertySet erweitert fuer Range-Properties - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellRangeObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( pRangePropSet->getPropertyMap() )); - return aRef; -} - -void ScCellRangeObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - // Range has only Position and Size in addition to ScCellRangesBase, both are ReadOnly - // -> nothing to do here - - ScCellRangesBase::SetOnePropertyValue( pEntry, aValue ); -} - -void ScCellRangeObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, - uno::Any& rAny ) - throw(uno::RuntimeException) -{ - if ( pEntry ) - { - if ( pEntry->nWID == SC_WID_UNO_POS ) - { - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - // GetMMRect converts using HMM_PER_TWIPS, like the DrawingLayer - Rectangle aMMRect(pDocSh->GetDocument()->GetMMRect( - aRange.aStart.Col(), aRange.aStart.Row(), - aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab() )); - awt::Point aPos( aMMRect.Left(), aMMRect.Top() ); - rAny <<= aPos; - } - } - else if ( pEntry->nWID == SC_WID_UNO_SIZE ) - { - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - // GetMMRect converts using HMM_PER_TWIPS, like the DrawingLayer - Rectangle aMMRect = pDocSh->GetDocument()->GetMMRect( - aRange.aStart.Col(), aRange.aStart.Row(), - aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab() ); - Size aSize(aMMRect.GetSize()); - awt::Size aAwtSize( aSize.Width(), aSize.Height() ); - rAny <<= aAwtSize; - } - } - else - ScCellRangesBase::GetOnePropertyValue( pEntry, rAny ); - - } -} - -const SfxItemPropertyMap* ScCellRangeObj::GetItemPropertyMap() -{ - return pRangePropSet->getPropertyMap(); -} - -// XServiceInfo - -rtl::OUString SAL_CALL ScCellRangeObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScCellRangeObj" )); -} - -sal_Bool SAL_CALL ScCellRangeObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr( rServiceName ); - return aServiceStr.EqualsAscii( SCSHEETCELLRANGE_SERVICE ) || - aServiceStr.EqualsAscii( SCCELLRANGE_SERVICE ) || - aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) || - aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) || - aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScCellRangeObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(5); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELLRANGE_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLRANGE_SERVICE )); - pArray[2] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLPROPERTIES_SERVICE )); - pArray[3] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCHARPROPERTIES_SERVICE )); - pArray[4] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCPARAPROPERTIES_SERVICE )); - return aRet; -} - -//------------------------------------------------------------------------ - -const SvxItemPropertySet* ScCellObj::GetEditPropertySet() -{ - return lcl_GetEditPropertySet(); -} -const SfxItemPropertyMap* ScCellObj::GetCellPropertyMap() -{ - return lcl_GetCellPropertySet()->getPropertyMap(); -} - -ScCellObj::ScCellObj(ScDocShell* pDocSh, const ScAddress& rP) : - ScCellRangeObj( pDocSh, ScRange(rP,rP) ), - pUnoText( NULL ), - pCellPropSet( lcl_GetCellPropertySet() ), - aCellPos( rP ), - nActionLockCount( 0 ) -{ - // pUnoText is allocated on demand (GetUnoText) - // can't be aggregated because getString/setString is handled here -} - -SvxUnoText& ScCellObj::GetUnoText() -{ - if (!pUnoText) - { - pUnoText = new ScCellTextObj( GetDocShell(), aCellPos ); - pUnoText->acquire(); - if (nActionLockCount) - { - ScSharedCellEditSource* pEditSource = - static_cast<ScSharedCellEditSource*> (pUnoText->GetEditSource()); - if (pEditSource) - pEditSource->SetDoUpdateData(false); - } - } - return *pUnoText; -} - -ScCellObj::~ScCellObj() -{ - if (pUnoText) - pUnoText->release(); -} - -void ScCellObj::RefChanged() -{ - ScCellRangeObj::RefChanged(); - - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE(rRanges.size() == 1, "was fuer Ranges ?!?!"); - if ( !rRanges.empty() ) - { - const ScRange* pFirst = rRanges[ 0 ]; - aCellPos = pFirst->aStart; - } -} - -uno::Any SAL_CALL ScCellObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( table::XCell ) - SC_QUERYINTERFACE( table::XCell2 ) - SC_QUERYINTERFACE( sheet::XFormulaTokens ) - SC_QUERYINTERFACE( sheet::XCellAddressable ) - SC_QUERYINTERFACE( text::XText ) - SC_QUERYINTERFACE( text::XSimpleText ) - SC_QUERYINTERFACE( text::XTextRange ) - SC_QUERYINTERFACE( container::XEnumerationAccess ) - SC_QUERYINTERFACE( container::XElementAccess ) - SC_QUERYINTERFACE( sheet::XSheetAnnotationAnchor ) - SC_QUERYINTERFACE( text::XTextFieldsSupplier ) - SC_QUERYINTERFACE( document::XActionLockable ) - - return ScCellRangeObj::queryInterface( rType ); -} - -void SAL_CALL ScCellObj::acquire() throw() -{ - ScCellRangeObj::acquire(); -} - -void SAL_CALL ScCellObj::release() throw() -{ - ScCellRangeObj::release(); -} - -uno::Sequence<uno::Type> SAL_CALL ScCellObj::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - uno::Sequence<uno::Type> aParentTypes(ScCellRangeObj::getTypes()); - long nParentLen = aParentTypes.getLength(); - const uno::Type* pParentPtr = aParentTypes.getConstArray(); - - aTypes.realloc( nParentLen + 9 ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[nParentLen + 0] = getCppuType((const uno::Reference<table::XCell>*)0); - pPtr[nParentLen + 1] = getCppuType((const uno::Reference<sheet::XCellAddressable>*)0); - pPtr[nParentLen + 2] = getCppuType((const uno::Reference<text::XText>*)0); - pPtr[nParentLen + 3] = getCppuType((const uno::Reference<container::XEnumerationAccess>*)0); - pPtr[nParentLen + 4] = getCppuType((const uno::Reference<sheet::XSheetAnnotationAnchor>*)0); - pPtr[nParentLen + 5] = getCppuType((const uno::Reference<text::XTextFieldsSupplier>*)0); - pPtr[nParentLen + 6] = getCppuType((const uno::Reference<document::XActionLockable>*)0); - pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XFormulaTokens>*)0); - pPtr[nParentLen + 8] = getCppuType((const uno::Reference<table::XCell2>*)0); - - for (long i=0; i<nParentLen; i++) - pPtr[i] = pParentPtr[i]; // parent types first - } - return aTypes; -} - -namespace -{ - class theScCellObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScCellObjImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScCellObj::getImplementationId() throw(uno::RuntimeException) -{ - return theScCellObjImplementationId::get().getSeq(); -} - -// Hilfsfunktionen - -String ScCellObj::GetInputString_Impl(sal_Bool bEnglish) const // fuer getFormula / FormulaLocal -{ - if (GetDocShell()) - return lcl_GetInputString( GetDocShell()->GetDocument(), aCellPos, bEnglish ); - return String(); -} - -String ScCellObj::GetOutputString_Impl(ScDocument* pDoc, const ScAddress& aCellPos) -{ - String aVal; - if ( pDoc ) - { - ScBaseCell* pCell = pDoc->GetCell( aCellPos ); - if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE ) - { - if ( pCell->GetCellType() == CELLTYPE_EDIT ) - { - // GetString an der EditCell macht Leerzeichen aus Umbruechen, - // hier werden die Umbrueche aber gebraucht - const EditTextObject* pData = ((ScEditCell*)pCell)->GetData(); - if (pData) - { - EditEngine& rEngine = pDoc->GetEditEngine(); - rEngine.SetText( *pData ); - aVal = rEngine.GetText( LINEEND_LF ); - } - // Edit-Zellen auch nicht per NumberFormatter formatieren - // (passend zur Ausgabe) - } - else - { - // wie in GetString am Dokument (column) - Color* pColor; - sal_uLong nNumFmt = pDoc->GetNumberFormat( aCellPos ); - ScCellFormat::GetString( pCell, nNumFmt, aVal, &pColor, *pDoc->GetFormatTable() ); - } - } - } - return aVal; -} - -String ScCellObj::GetOutputString_Impl() const -{ - ScDocShell* pDocSh = GetDocShell(); - String aVal; - if ( pDocSh ) - aVal = GetOutputString_Impl(pDocSh->GetDocument(), aCellPos); - return aVal; -} - -void ScCellObj::SetString_Impl(const String& rString, sal_Bool bInterpret, sal_Bool bEnglish) -{ - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocFunc aFunc(*pDocSh); - // GRAM_PODF_A1 for API compatibility. - (void)aFunc.SetCellText( aCellPos, rString, bInterpret, bEnglish, sal_True, EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1 ); - } -} - -double ScCellObj::GetValue_Impl() const -{ - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - return pDocSh->GetDocument()->GetValue( aCellPos ); - - return 0.0; -} - -void ScCellObj::SetValue_Impl(double fValue) -{ - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocFunc aFunc(*pDocSh); - (void)aFunc.PutCell( aCellPos, new ScValueCell(fValue), sal_True ); - } -} - -// only for XML import - -void ScCellObj::SetFormulaResultString( const ::rtl::OUString& rResult ) -{ - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScBaseCell* pCell = pDocSh->GetDocument()->GetCell( aCellPos ); - if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA ) - ((ScFormulaCell*)pCell)->SetHybridString( rResult ); - } -} - -void ScCellObj::SetFormulaResultDouble( double fResult ) -{ - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScBaseCell* pCell = pDocSh->GetDocument()->GetCell( aCellPos ); - if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA ) - ((ScFormulaCell*)pCell)->SetHybridDouble( fResult ); - } -} - -void ScCellObj::SetFormulaWithGrammar( const ::rtl::OUString& rFormula, - const ::rtl::OUString& rFormulaNmsp, const formula::FormulaGrammar::Grammar eGrammar ) -{ - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocFunc aFunc(*pDocSh); - aFunc.SetCellText( aCellPos, rFormula, sal_True, sal_True, sal_True, rFormulaNmsp, eGrammar); - } -} - -void ScCellObj::InputEnglishString( const ::rtl::OUString& rText ) -{ - // This is like a mixture of setFormula and property FormulaLocal: - // The cell's number format is checked for "text", a new cell format may be set, - // but all parsing is in English. - - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - String aString(rText); - ScDocument* pDoc = pDocSh->GetDocument(); - SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); - sal_uInt32 nOldFormat = pDoc->GetNumberFormat( aCellPos ); - if ( pFormatter->GetType( nOldFormat ) == NUMBERFORMAT_TEXT ) - { - SetString_Impl(aString, false, false); // text cell - } - else - { - ScDocFunc aFunc(*pDocSh); - short nFormatType = 0; - ScBaseCell* pNewCell = aFunc.InterpretEnglishString( aCellPos, aString, - EMPTY_STRING, formula::FormulaGrammar::GRAM_PODF_A1, &nFormatType ); - if (pNewCell) - { - if ( ( nOldFormat % SV_COUNTRY_LANGUAGE_OFFSET ) == 0 && nFormatType != 0 ) - { - // apply a format for the recognized type and the old format's language - sal_uInt32 nNewFormat = ScGlobal::GetStandardFormat( *pFormatter, nOldFormat, nFormatType ); - if ( nNewFormat != nOldFormat ) - { - ScPatternAttr aPattern( pDoc->GetPool() ); - aPattern.GetItemSet().Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) ); - // ATTR_LANGUAGE_FORMAT remains unchanged - aFunc.ApplyAttributes( *GetMarkData(), aPattern, sal_True, sal_True ); - } - } - // put the cell into the document - // (after applying the format, so possible formula recalculation already uses the new format) - (void)aFunc.PutCell( aCellPos, pNewCell, sal_True ); - } - else - SetString_Impl(aString, false, false); // no cell from InterpretEnglishString, probably empty string - } - } -} - -// XText - -uno::Reference<text::XTextCursor> SAL_CALL ScCellObj::createTextCursor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScCellTextCursor( *this ); -} - -uno::Reference<text::XTextCursor> SAL_CALL ScCellObj::createTextCursorByRange( - const uno::Reference<text::XTextRange>& aTextPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SvxUnoTextCursor* pCursor = new ScCellTextCursor( *this ); - uno::Reference<text::XTextCursor> xCursor(pCursor); - - SvxUnoTextRangeBase* pRange = SvxUnoTextRangeBase::getImplementation( aTextPosition ); - if(pRange) - pCursor->SetSelection( pRange->GetSelection() ); - else - { - ScCellTextCursor* pOther = ScCellTextCursor::getImplementation( aTextPosition ); - if(pOther) - pCursor->SetSelection( pOther->GetSelection() ); - else - throw uno::RuntimeException(); - } - - return xCursor; -} - -rtl::OUString SAL_CALL ScCellObj::getString() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetOutputString_Impl(); -} - -void SAL_CALL ScCellObj::setString( const rtl::OUString& aText ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aText); - SetString_Impl(aString, false, false); // immer Text - - // don't create pUnoText here if not there - if (pUnoText) - pUnoText->SetSelection(ESelection( 0,0, 0,aString.Len() )); -} - -void SAL_CALL ScCellObj::insertString( const uno::Reference<text::XTextRange>& xRange, - const rtl::OUString& aString, sal_Bool bAbsorb ) - throw(uno::RuntimeException) -{ - // special handling for ScCellTextCursor is no longer needed, - // SvxUnoText::insertString checks for SvxUnoTextRangeBase instead of SvxUnoTextRange - - SolarMutexGuard aGuard; - GetUnoText().insertString(xRange, aString, bAbsorb); -} - -void SAL_CALL ScCellObj::insertControlCharacter( const uno::Reference<text::XTextRange>& xRange, - sal_Int16 nControlCharacter, sal_Bool bAbsorb ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetUnoText().insertControlCharacter(xRange, nControlCharacter, bAbsorb); -} - -void SAL_CALL ScCellObj::insertTextContent( const uno::Reference<text::XTextRange >& xRange, - const uno::Reference<text::XTextContent >& xContent, - sal_Bool bAbsorb ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh && xContent.is() ) - { - ScCellFieldObj* pCellField = ScCellFieldObj::getImplementation( xContent ); - SvxUnoTextRangeBase* pTextRange = ScCellTextCursor::getImplementation( xRange ); - - if ( pCellField && !pCellField->IsInserted() && pTextRange ) - { - SvxEditSource* pEditSource = pTextRange->GetEditSource(); - ESelection aSelection(pTextRange->GetSelection()); - - if (!bAbsorb) - { - // nicht ersetzen -> hinten anhaengen - aSelection.Adjust(); - aSelection.nStartPara = aSelection.nEndPara; - aSelection.nStartPos = aSelection.nEndPos; - } - - SvxFieldItem aItem(pCellField->CreateFieldItem()); - - SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder(); - pForwarder->QuickInsertField( aItem, aSelection ); - pEditSource->UpdateData(); - - // neue Selektion: ein Zeichen - aSelection.Adjust(); - aSelection.nEndPara = aSelection.nStartPara; - aSelection.nEndPos = aSelection.nStartPos + 1; - pCellField->InitDoc( pDocSh, aCellPos, aSelection ); - - // for bAbsorb=FALSE, the new selection must be behind the inserted content - // (the xml filter relies on this) - if (!bAbsorb) - aSelection.nStartPos = aSelection.nEndPos; - - pTextRange->SetSelection( aSelection ); - - return; - } - } - GetUnoText().insertTextContent(xRange, xContent, bAbsorb); -} - -void SAL_CALL ScCellObj::removeTextContent( const uno::Reference<text::XTextContent>& xContent ) - throw(container::NoSuchElementException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( xContent.is() ) - { - ScCellFieldObj* pCellField = ScCellFieldObj::getImplementation( xContent ); - if ( pCellField && pCellField->IsInserted() ) - { - //! Testen, ob das Feld in dieser Zelle ist - pCellField->DeleteField(); - return; - } - } - GetUnoText().removeTextContent(xContent); -} - -uno::Reference<text::XText> SAL_CALL ScCellObj::getText() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return this; -} - -uno::Reference<text::XTextRange> SAL_CALL ScCellObj::getStart() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getStart(); -} - -uno::Reference<text::XTextRange> SAL_CALL ScCellObj::getEnd() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getEnd(); -} - -uno::Reference<container::XEnumeration> SAL_CALL ScCellObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().createEnumeration(); -} - -uno::Type SAL_CALL ScCellObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getElementType(); -} - -sal_Bool SAL_CALL ScCellObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().hasElements(); -} - -// XCell - -rtl::OUString SAL_CALL ScCellObj::getFormula() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // TRUE = englisch - return GetInputString_Impl(true); -} - -void SAL_CALL ScCellObj::setFormula( const rtl::OUString& aFormula ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aFormula); - SetString_Impl(aString, sal_True, sal_True); // englisch interpretieren -} - -double SAL_CALL ScCellObj::getValue() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetValue_Impl(); -} - -void SAL_CALL ScCellObj::setValue( double nValue ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SetValue_Impl(nValue); -} - -void SAL_CALL ScCellObj::setFormulaString( const rtl::OUString& aFormula) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell *pDocSh = GetDocShell(); - if( pDocSh ) - { - ScDocFunc aFunc( *pDocSh ); - ScFormulaCell* pCell = new ScFormulaCell( pDocSh->GetDocument(), aCellPos ); - pCell->SetHybridFormula( aFormula, formula::FormulaGrammar::GRAM_NATIVE ); - aFunc.PutCell( aCellPos, pCell, sal_True ); - } -} -void SAL_CALL ScCellObj::setFormulaResult( double nValue ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh && pDocSh->GetDocument()->GetCellType( aCellPos ) == CELLTYPE_FORMULA ) - { - ScFormulaCell* pCell = (ScFormulaCell *)pDocSh->GetDocument()->GetCell( aCellPos ); - pCell->SetHybridDouble( nValue ); - pCell->ResetDirty(); - pCell->ResetChanged(); - } -} - -table::CellContentType SAL_CALL ScCellObj::getType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellContentType eRet = table::CellContentType_EMPTY; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - CellType eCalcType = pDocSh->GetDocument()->GetCellType( aCellPos ); - switch (eCalcType) - { - case CELLTYPE_VALUE: - eRet = table::CellContentType_VALUE; - break; - case CELLTYPE_STRING: - case CELLTYPE_EDIT: - eRet = table::CellContentType_TEXT; - break; - case CELLTYPE_FORMULA: - eRet = table::CellContentType_FORMULA; - break; - default: - eRet = table::CellContentType_EMPTY; - } - } - else - { - OSL_FAIL("keine DocShell"); //! Exception oder so? - } - - return eRet; -} - -table::CellContentType ScCellObj::GetResultType_Impl() -{ - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScBaseCell* pCell = pDocSh->GetDocument()->GetCell(aCellPos); - if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA ) - { - sal_Bool bValue = ((ScFormulaCell*)pCell)->IsValue(); - return bValue ? table::CellContentType_VALUE : table::CellContentType_TEXT; - } - } - return getType(); // wenn keine Formel -} - -sal_Int32 SAL_CALL ScCellObj::getError() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nError = 0; - ScDocShell* pDocSh = GetDocShell(); - if (pDocSh) - { - ScBaseCell* pCell = pDocSh->GetDocument()->GetCell( aCellPos ); - if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA ) - nError = ((ScFormulaCell*)pCell)->GetErrCode(); - // sonst bleibt's bei 0 - } - else - { - OSL_FAIL("keine DocShell"); //! Exception oder so? - } - - return nError; -} - -// XFormulaTokens - -uno::Sequence<sheet::FormulaToken> SAL_CALL ScCellObj::getTokens() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Sequence<sheet::FormulaToken> aSequence; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - ScBaseCell* pCell = pDoc->GetCell( aCellPos ); - if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA ) - { - ScTokenArray* pTokenArray = static_cast<ScFormulaCell*>(pCell)->GetCode(); - if ( pTokenArray ) - (void)ScTokenConversion::ConvertToTokenSequence( *pDoc, aSequence, *pTokenArray ); - } - } - return aSequence; -} - -void SAL_CALL ScCellObj::setTokens( const uno::Sequence<sheet::FormulaToken>& rTokens ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - ScTokenArray aTokenArray; - (void)ScTokenConversion::ConvertToTokenArray( *pDoc, aTokenArray, rTokens ); - - ScDocFunc aFunc( *pDocSh ); - ScBaseCell* pNewCell = new ScFormulaCell( pDoc, aCellPos, &aTokenArray ); - (void)aFunc.PutCell( aCellPos, pNewCell, sal_True ); - } -} - -// XCellAddressable - -table::CellAddress SAL_CALL ScCellObj::getCellAddress() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellAddress aAdr; - aAdr.Sheet = aCellPos.Tab(); - aAdr.Column = aCellPos.Col(); - aAdr.Row = aCellPos.Row(); - return aAdr; -} - -// XSheetAnnotationAnchor - -uno::Reference<sheet::XSheetAnnotation> SAL_CALL ScCellObj::getAnnotation() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - return new ScAnnotationObj( pDocSh, aCellPos ); - - OSL_FAIL("getAnnotation ohne DocShell"); - return NULL; -} - -// XFieldTypesSupplier - -uno::Reference<container::XEnumerationAccess> SAL_CALL ScCellObj::getTextFields() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - return new ScCellFieldsObj( pDocSh, aCellPos ); - - return NULL; -} - -uno::Reference<container::XNameAccess> SAL_CALL ScCellObj::getTextFieldMasters() - throw(uno::RuntimeException) -{ - // sowas gibts nicht im Calc (?) - return NULL; -} - -// XPropertySet erweitert fuer Zell-Properties - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( pCellPropSet->getPropertyMap() )); - return aRef; -} - -void ScCellObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - if ( pEntry ) - { - if ( pEntry->nWID == SC_WID_UNO_FORMLOC ) - { - rtl::OUString aStrVal; - aValue >>= aStrVal; - String aString(aStrVal); - SetString_Impl(aString, sal_True, false); // lokal interpretieren - } - else if ( pEntry->nWID == SC_WID_UNO_FORMRT ) - { - // Read-Only - //! Exception oder so... - } - else - ScCellRangeObj::SetOnePropertyValue( pEntry, aValue ); - } -} - -void ScCellObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, - uno::Any& rAny ) - throw(uno::RuntimeException) -{ - if ( pEntry ) - { - if ( pEntry->nWID == SC_WID_UNO_FORMLOC ) - { - // sal_False = lokal - rAny <<= rtl::OUString( GetInputString_Impl(false) ); - } - else if ( pEntry->nWID == SC_WID_UNO_FORMRT ) - { - table::CellContentType eType = GetResultType_Impl(); - rAny <<= eType; - } - else - ScCellRangeObj::GetOnePropertyValue(pEntry, rAny); - } -} - -const SfxItemPropertyMap* ScCellObj::GetItemPropertyMap() -{ - return pCellPropSet->getPropertyMap(); -} - -// XServiceInfo - -rtl::OUString SAL_CALL ScCellObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScCellObj" )); -} - -sal_Bool SAL_CALL ScCellObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - // CellRange/SheetCellRange are not in SheetCell service description, - // but ScCellObj is used instead of ScCellRangeObj in CellRanges collections, - // so it must support them - - String aServiceStr(rServiceName); - return aServiceStr.EqualsAscii( SCSHEETCELL_SERVICE ) || - aServiceStr.EqualsAscii( SCCELL_SERVICE ) || - aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) || - aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) || - aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE ) || - aServiceStr.EqualsAscii( SCSHEETCELLRANGE_SERVICE ) || - aServiceStr.EqualsAscii( SCCELLRANGE_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScCellObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(7); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELL_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELL_SERVICE )); - pArray[2] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLPROPERTIES_SERVICE )); - pArray[3] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCHARPROPERTIES_SERVICE )); - pArray[4] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCPARAPROPERTIES_SERVICE )); - pArray[5] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELLRANGE_SERVICE )); - pArray[6] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLRANGE_SERVICE )); - return aRet; -} - -// XActionLockable - -sal_Bool SAL_CALL ScCellObj::isActionLocked() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return nActionLockCount != 0; -} - -void SAL_CALL ScCellObj::addActionLock() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!nActionLockCount) - { - if (pUnoText) - { - ScSharedCellEditSource* pEditSource = - static_cast<ScSharedCellEditSource*> (pUnoText->GetEditSource()); - if (pEditSource) - pEditSource->SetDoUpdateData(false); - } - } - nActionLockCount++; -} - -void SAL_CALL ScCellObj::removeActionLock() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (nActionLockCount > 0) - { - nActionLockCount--; - if (!nActionLockCount) - { - if (pUnoText) - { - ScSharedCellEditSource* pEditSource = - static_cast<ScSharedCellEditSource*> (pUnoText->GetEditSource()); - if (pEditSource) - { - pEditSource->SetDoUpdateData(sal_True); - if (pEditSource->IsDirty()) - pEditSource->UpdateData(); - } - } - } - } -} - -void SAL_CALL ScCellObj::setActionLocks( sal_Int16 nLock ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pUnoText) - { - ScSharedCellEditSource* pEditSource = - static_cast<ScSharedCellEditSource*> (pUnoText->GetEditSource()); - if (pEditSource) - { - pEditSource->SetDoUpdateData(nLock == 0); - if ((nActionLockCount > 0) && (nLock == 0) && pEditSource->IsDirty()) - pEditSource->UpdateData(); - } - } - nActionLockCount = nLock; -} - -sal_Int16 SAL_CALL ScCellObj::resetActionLocks() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nRet(nActionLockCount); - if (pUnoText) - { - ScSharedCellEditSource* pEditSource = - static_cast<ScSharedCellEditSource*> (pUnoText->GetEditSource()); - if (pEditSource) - { - pEditSource->SetDoUpdateData(sal_True); - if (pEditSource->IsDirty()) - pEditSource->UpdateData(); - } - } - nActionLockCount = 0; - return nRet; -} - -//------------------------------------------------------------------------ - -ScTableSheetObj::ScTableSheetObj( ScDocShell* pDocSh, SCTAB nTab ) : - ScCellRangeObj( pDocSh, ScRange(0,0,nTab, MAXCOL,MAXROW,nTab) ), - pSheetPropSet(lcl_GetSheetPropertySet()) -{ -} - -ScTableSheetObj::~ScTableSheetObj() -{ -} - -void ScTableSheetObj::InitInsertSheet(ScDocShell* pDocSh, SCTAB nTab) -{ - InitInsertRange( pDocSh, ScRange(0,0,nTab, MAXCOL,MAXROW,nTab) ); -} - -uno::Any SAL_CALL ScTableSheetObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( sheet::XSpreadsheet ) - SC_QUERYINTERFACE( container::XNamed ) - SC_QUERYINTERFACE( sheet::XSheetPageBreak ) - SC_QUERYINTERFACE( sheet::XCellRangeMovement ) - SC_QUERYINTERFACE( table::XTableChartsSupplier ) - SC_QUERYINTERFACE( sheet::XDataPilotTablesSupplier ) - SC_QUERYINTERFACE( sheet::XScenariosSupplier ) - SC_QUERYINTERFACE( sheet::XSheetAnnotationsSupplier ) - SC_QUERYINTERFACE( drawing::XDrawPageSupplier ) - SC_QUERYINTERFACE( sheet::XPrintAreas ) - SC_QUERYINTERFACE( sheet::XSheetAuditing ) - SC_QUERYINTERFACE( sheet::XSheetOutline ) - SC_QUERYINTERFACE( util::XProtectable ) - SC_QUERYINTERFACE( sheet::XScenario ) - SC_QUERYINTERFACE( sheet::XScenarioEnhanced ) - SC_QUERYINTERFACE( sheet::XSheetLinkable ) - SC_QUERYINTERFACE( sheet::XExternalSheetName ) - SC_QUERYINTERFACE( document::XEventsSupplier ) - - return ScCellRangeObj::queryInterface( rType ); -} - -void SAL_CALL ScTableSheetObj::acquire() throw() -{ - ScCellRangeObj::acquire(); -} - -void SAL_CALL ScTableSheetObj::release() throw() -{ - ScCellRangeObj::release(); -} - -uno::Sequence<uno::Type> SAL_CALL ScTableSheetObj::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - uno::Sequence<uno::Type> aParentTypes = ScCellRangeObj::getTypes(); - long nParentLen = aParentTypes.getLength(); - const uno::Type* pParentPtr = aParentTypes.getConstArray(); - - aTypes.realloc( nParentLen + 18 ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSpreadsheet>*)0); - pPtr[nParentLen + 1] = getCppuType((const uno::Reference<container::XNamed>*)0); - pPtr[nParentLen + 2] = getCppuType((const uno::Reference<sheet::XSheetPageBreak>*)0); - pPtr[nParentLen + 3] = getCppuType((const uno::Reference<sheet::XCellRangeMovement>*)0); - pPtr[nParentLen + 4] = getCppuType((const uno::Reference<table::XTableChartsSupplier>*)0); - pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XDataPilotTablesSupplier>*)0); - pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XScenariosSupplier>*)0); - pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XSheetAnnotationsSupplier>*)0); - pPtr[nParentLen + 8] = getCppuType((const uno::Reference<drawing::XDrawPageSupplier>*)0); - pPtr[nParentLen + 9] = getCppuType((const uno::Reference<sheet::XPrintAreas>*)0); - pPtr[nParentLen +10] = getCppuType((const uno::Reference<sheet::XSheetAuditing>*)0); - pPtr[nParentLen +11] = getCppuType((const uno::Reference<sheet::XSheetOutline>*)0); - pPtr[nParentLen +12] = getCppuType((const uno::Reference<util::XProtectable>*)0); - pPtr[nParentLen +13] = getCppuType((const uno::Reference<sheet::XScenario>*)0); - pPtr[nParentLen +14] = getCppuType((const uno::Reference<sheet::XScenarioEnhanced>*)0); - pPtr[nParentLen +15] = getCppuType((const uno::Reference<sheet::XSheetLinkable>*)0); - pPtr[nParentLen +16] = getCppuType((const uno::Reference<sheet::XExternalSheetName>*)0); - pPtr[nParentLen +17] = getCppuType((const uno::Reference<document::XEventsSupplier>*)0); - - for (long i=0; i<nParentLen; i++) - pPtr[i] = pParentPtr[i]; // parent types first - } - return aTypes; -} - -namespace -{ - class theScTableSheetObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScTableSheetObjImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScTableSheetObj::getImplementationId() throw(uno::RuntimeException) -{ - return theScTableSheetObjImplementationId::get().getSeq(); -} - -// Hilfsfunktionen - -SCTAB ScTableSheetObj::GetTab_Impl() const -{ - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE(rRanges.size() == 1, "was fuer Ranges ?!?!"); - if ( !rRanges.empty() ) - { - const ScRange* pFirst = rRanges[ 0 ]; - return pFirst->aStart.Tab(); - } - return 0; // soll nicht sein -} - -// former XSheet - -uno::Reference<table::XTableCharts> SAL_CALL ScTableSheetObj::getCharts() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - return new ScChartsObj( pDocSh, GetTab_Impl() ); - - OSL_FAIL("kein Dokument"); - return NULL; -} - -uno::Reference<sheet::XDataPilotTables> SAL_CALL ScTableSheetObj::getDataPilotTables() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - return new ScDataPilotTablesObj( pDocSh, GetTab_Impl() ); - - OSL_FAIL("kein Dokument"); - return NULL; -} - -uno::Reference<sheet::XScenarios> SAL_CALL ScTableSheetObj::getScenarios() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - - if ( pDocSh ) - return new ScScenariosObj( pDocSh, GetTab_Impl() ); - - OSL_FAIL("kein Dokument"); - return NULL; -} - -uno::Reference<sheet::XSheetAnnotations> SAL_CALL ScTableSheetObj::getAnnotations() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - - if ( pDocSh ) - return new ScAnnotationsObj( pDocSh, GetTab_Impl() ); - - OSL_FAIL("kein Dokument"); - return NULL; -} - -uno::Reference<table::XCellRange> SAL_CALL ScTableSheetObj::getCellRangeByName( - const rtl::OUString& rRange ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ScCellRangeObj::getCellRangeByName( rRange ); -} - -uno::Reference<sheet::XSheetCellCursor> SAL_CALL ScTableSheetObj::createCursor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - //! einzelne Zelle oder ganze Tabelle??????? - SCTAB nTab = GetTab_Impl(); - return new ScCellCursorObj( pDocSh, ScRange( 0,0,nTab, MAXCOL,MAXROW,nTab ) ); - } - return NULL; -} - -uno::Reference<sheet::XSheetCellCursor> SAL_CALL ScTableSheetObj::createCursorByRange( - const uno::Reference<sheet::XSheetCellRange>& xCellRange ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh && xCellRange.is() ) - { - ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xCellRange ); - if (pRangesImp) - { - const ScRangeList& rRanges = pRangesImp->GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - return new ScCellCursorObj( pDocSh, *rRanges[ 0 ] ); - } - } - return NULL; -} - -// XSheetCellRange - -uno::Reference<sheet::XSpreadsheet> SAL_CALL ScTableSheetObj::getSpreadsheet() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return this; //!??? -} - -// XCellRange - -uno::Reference<table::XCell> SAL_CALL ScTableSheetObj::getCellByPosition( - sal_Int32 nColumn, sal_Int32 nRow ) - throw(lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ScCellRangeObj::GetCellByPosition_Impl(nColumn, nRow); -} - -uno::Reference<table::XCellRange> SAL_CALL ScTableSheetObj::getCellRangeByPosition( - sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom ) - throw(lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ScCellRangeObj::getCellRangeByPosition(nLeft,nTop,nRight,nBottom); -} - -uno::Sequence<sheet::TablePageBreakData> SAL_CALL ScTableSheetObj::getColumnPageBreaks() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - Size aSize(pDoc->GetPageSize( nTab )); - if (aSize.Width() && aSize.Height()) // effektive Groesse schon gesetzt? - pDoc->UpdatePageBreaks( nTab ); - else - { - // Umbrueche updaten wie in ScDocShell::PageStyleModified: - ScPrintFunc aPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ); - aPrintFunc.UpdatePages(); - } - - SCCOL nCount = 0; - SCCOL nCol; - for (nCol=0; nCol<=MAXCOL; nCol++) - if (pDoc->HasColBreak(nCol, nTab)) - ++nCount; - - sheet::TablePageBreakData aData; - uno::Sequence<sheet::TablePageBreakData> aSeq(nCount); - sheet::TablePageBreakData* pAry = aSeq.getArray(); - sal_uInt16 nPos = 0; - for (nCol=0; nCol<=MAXCOL; nCol++) - { - ScBreakType nBreak = pDoc->HasColBreak(nCol, nTab); - if (nBreak) - { - aData.Position = nCol; - aData.ManualBreak = (nBreak & BREAK_MANUAL); - pAry[nPos] = aData; - ++nPos; - } - } - return aSeq; - } - return uno::Sequence<sheet::TablePageBreakData>(0); -} - -uno::Sequence<sheet::TablePageBreakData> SAL_CALL ScTableSheetObj::getRowPageBreaks() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - Size aSize(pDoc->GetPageSize( nTab )); - if (aSize.Width() && aSize.Height()) // effektive Groesse schon gesetzt? - pDoc->UpdatePageBreaks( nTab ); - else - { - // Umbrueche updaten wie in ScDocShell::PageStyleModified: - ScPrintFunc aPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ); - aPrintFunc.UpdatePages(); - } - return pDoc->GetRowBreakData(nTab); - } - return uno::Sequence<sheet::TablePageBreakData>(0); -} - -void SAL_CALL ScTableSheetObj::removeAllManualPageBreaks() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - //! docfunc Funktion, auch fuer ScViewFunc::RemoveManualBreaks - - ScDocument* pDoc = pDocSh->GetDocument(); - sal_Bool bUndo (pDoc->IsUndoEnabled()); - SCTAB nTab = GetTab_Impl(); - - if (bUndo) - { - ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); - pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True ); - pDoc->CopyToDocument( 0,0,nTab, MAXCOL,MAXROW,nTab, IDF_NONE, false, pUndoDoc ); - pDocSh->GetUndoManager()->AddUndoAction( - new ScUndoRemoveBreaks( pDocSh, nTab, pUndoDoc ) ); - } - - pDoc->RemoveManualBreaks(nTab); - pDoc->UpdatePageBreaks(nTab); - - //? UpdatePageBreakData( sal_True ); - pDocSh->SetDocumentModified(); - pDocSh->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID ); - } -} - -// XNamed - -rtl::OUString SAL_CALL ScTableSheetObj::getName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aName; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - pDocSh->GetDocument()->GetName( GetTab_Impl(), aName ); - return aName; -} - -void SAL_CALL ScTableSheetObj::setName( const rtl::OUString& aNewName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - String aString(aNewName); - ScDocFunc aFunc( *pDocSh ); - aFunc.RenameTable( GetTab_Impl(), aString, sal_True, sal_True ); - } -} - -// XDrawPageSupplier - -uno::Reference<drawing::XDrawPage> SAL_CALL ScTableSheetObj::getDrawPage() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDrawLayer* pDrawLayer = pDocSh->MakeDrawLayer(); - OSL_ENSURE(pDrawLayer,"kann Draw-Layer nicht anlegen"); - - SCTAB nTab = GetTab_Impl(); - SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); - OSL_ENSURE(pPage,"Draw-Page nicht gefunden"); - if (pPage) - return uno::Reference<drawing::XDrawPage> (pPage->getUnoPage(), uno::UNO_QUERY); - - // Das DrawPage-Objekt meldet sich als Listener am SdrModel an - // und sollte von dort alle Aktionen mitbekommen - } - return NULL; -} - -// XCellMovement - -void SAL_CALL ScTableSheetObj::insertCells( const table::CellRangeAddress& rRangeAddress, - sheet::CellInsertMode nMode ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - sal_Bool bDo = sal_True; - InsCellCmd eCmd = INS_NONE; - switch (nMode) - { - case sheet::CellInsertMode_NONE: bDo = false; break; - case sheet::CellInsertMode_DOWN: eCmd = INS_CELLSDOWN; break; - case sheet::CellInsertMode_RIGHT: eCmd = INS_CELLSRIGHT; break; - case sheet::CellInsertMode_ROWS: eCmd = INS_INSROWS; break; - case sheet::CellInsertMode_COLUMNS: eCmd = INS_INSCOLS; break; - default: - OSL_FAIL("insertCells: falscher Mode"); - bDo = false; - } - - if (bDo) - { - OSL_ENSURE( rRangeAddress.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" ); - ScRange aScRange; - ScUnoConversion::FillScRange( aScRange, rRangeAddress ); - ScDocFunc aFunc(*pDocSh); - aFunc.InsertCells( aScRange, NULL, eCmd, sal_True, sal_True ); - } - } -} - -void SAL_CALL ScTableSheetObj::removeRange( const table::CellRangeAddress& rRangeAddress, - sheet::CellDeleteMode nMode ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - sal_Bool bDo = sal_True; - DelCellCmd eCmd = DEL_NONE; - switch (nMode) - { - case sheet::CellDeleteMode_NONE: bDo = false; break; - case sheet::CellDeleteMode_UP: eCmd = DEL_CELLSUP; break; - case sheet::CellDeleteMode_LEFT: eCmd = DEL_CELLSLEFT; break; - case sheet::CellDeleteMode_ROWS: eCmd = DEL_DELROWS; break; - case sheet::CellDeleteMode_COLUMNS: eCmd = DEL_DELCOLS; break; - default: - OSL_FAIL("deleteCells: falscher Mode"); - bDo = false; - } - - if (bDo) - { - OSL_ENSURE( rRangeAddress.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" ); - ScRange aScRange; - ScUnoConversion::FillScRange( aScRange, rRangeAddress ); - ScDocFunc aFunc(*pDocSh); - aFunc.DeleteCells( aScRange, NULL, eCmd, sal_True, sal_True ); - } - } -} - -void SAL_CALL ScTableSheetObj::moveRange( const table::CellAddress& aDestination, - const table::CellRangeAddress& aSource ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - OSL_ENSURE( aSource.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" ); - ScRange aSourceRange; - ScUnoConversion::FillScRange( aSourceRange, aSource ); - ScAddress aDestPos( (SCCOL)aDestination.Column, (SCROW)aDestination.Row, aDestination.Sheet ); - ScDocFunc aFunc(*pDocSh); - aFunc.MoveBlock( aSourceRange, aDestPos, sal_True, sal_True, sal_True, sal_True ); - } -} - -void SAL_CALL ScTableSheetObj::copyRange( const table::CellAddress& aDestination, - const table::CellRangeAddress& aSource ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - OSL_ENSURE( aSource.Sheet == GetTab_Impl(), "falsche Tabelle in CellRangeAddress" ); - ScRange aSourceRange; - ScUnoConversion::FillScRange( aSourceRange, aSource ); - ScAddress aDestPos( (SCCOL)aDestination.Column, (SCROW)aDestination.Row, aDestination.Sheet ); - ScDocFunc aFunc(*pDocSh); - aFunc.MoveBlock( aSourceRange, aDestPos, false, sal_True, sal_True, sal_True ); - } -} - -// XPrintAreas - -void ScTableSheetObj::PrintAreaUndo_Impl( ScPrintRangeSaver* pOldRanges ) -{ - // Umbrueche und Undo - - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - sal_Bool bUndo(pDoc->IsUndoEnabled()); - SCTAB nTab = GetTab_Impl(); - - ScPrintRangeSaver* pNewRanges = pDoc->CreatePrintRangeSaver(); - if (bUndo) - { - pDocSh->GetUndoManager()->AddUndoAction( - new ScUndoPrintRange( pDocSh, nTab, pOldRanges, pNewRanges ) ); - } - - ScPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ).UpdatePages(); - - SfxBindings* pBindings = pDocSh->GetViewBindings(); - if (pBindings) - pBindings->Invalidate( SID_DELETE_PRINTAREA ); - - pDocSh->SetDocumentModified(); - } - else - delete pOldRanges; -} - -uno::Sequence<table::CellRangeAddress> SAL_CALL ScTableSheetObj::getPrintAreas() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - sal_uInt16 nCount = pDoc->GetPrintRangeCount( nTab ); - - table::CellRangeAddress aRangeAddress; - uno::Sequence<table::CellRangeAddress> aSeq(nCount); - table::CellRangeAddress* pAry = aSeq.getArray(); - for (sal_uInt16 i=0; i<nCount; i++) - { - const ScRange* pRange = pDoc->GetPrintRange( nTab, i ); - OSL_ENSURE(pRange,"wo ist der Druckbereich"); - if (pRange) - { - ScUnoConversion::FillApiRange( aRangeAddress, *pRange ); - aRangeAddress.Sheet = nTab; // core does not care about sheet index - pAry[i] = aRangeAddress; - } - } - return aSeq; - } - return uno::Sequence<table::CellRangeAddress>(); -} - -void SAL_CALL ScTableSheetObj::setPrintAreas( - const uno::Sequence<table::CellRangeAddress>& aPrintAreas ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver(); - - sal_uInt16 nCount = (sal_uInt16) aPrintAreas.getLength(); - pDoc->ClearPrintRanges( nTab ); - if (nCount) - { - ScRange aPrintRange; - const table::CellRangeAddress* pAry = aPrintAreas.getConstArray(); - for (sal_uInt16 i=0; i<nCount; i++) - { - ScUnoConversion::FillScRange( aPrintRange, pAry[i] ); - pDoc->AddPrintRange( nTab, aPrintRange ); - } - } - - PrintAreaUndo_Impl( pOldRanges ); // Undo, Umbrueche, Modified etc. - } -} - -sal_Bool SAL_CALL ScTableSheetObj::getPrintTitleColumns() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - return ( pDoc->GetRepeatColRange(nTab) != NULL ); - } - return false; -} - -void SAL_CALL ScTableSheetObj::setPrintTitleColumns( sal_Bool bPrintTitleColumns ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver(); - - if ( bPrintTitleColumns ) - { - if ( !pDoc->GetRepeatColRange( nTab ) ) // keinen bestehenden Bereich veraendern - { - ScRange aNew( 0, 0, nTab, 0, 0, nTab ); // Default - pDoc->SetRepeatColRange( nTab, &aNew ); // einschalten - } - } - else - pDoc->SetRepeatColRange( nTab, NULL ); // abschalten - - PrintAreaUndo_Impl( pOldRanges ); // Undo, Umbrueche, Modified etc. - - //! zuletzt gesetzten Bereich beim Abschalten merken und beim Einschalten wiederherstellen ??? - } -} - -table::CellRangeAddress SAL_CALL ScTableSheetObj::getTitleColumns() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellRangeAddress aRet; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - const ScRange* pRange = pDoc->GetRepeatColRange(nTab); - if (pRange) - { - ScUnoConversion::FillApiRange( aRet, *pRange ); - aRet.Sheet = nTab; // core does not care about sheet index - } - } - return aRet; -} - -void SAL_CALL ScTableSheetObj::setTitleColumns( const table::CellRangeAddress& aTitleColumns ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver(); - - ScRange aNew; - ScUnoConversion::FillScRange( aNew, aTitleColumns ); - pDoc->SetRepeatColRange( nTab, &aNew ); // immer auch einschalten - - PrintAreaUndo_Impl( pOldRanges ); // Undo, Umbrueche, Modified etc. - } -} - -sal_Bool SAL_CALL ScTableSheetObj::getPrintTitleRows() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - return ( pDoc->GetRepeatRowRange(nTab) != NULL ); - } - return false; -} - -void SAL_CALL ScTableSheetObj::setPrintTitleRows( sal_Bool bPrintTitleRows ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver(); - - if ( bPrintTitleRows ) - { - if ( !pDoc->GetRepeatRowRange( nTab ) ) // keinen bestehenden Bereich veraendern - { - ScRange aNew( 0, 0, nTab, 0, 0, nTab ); // Default - pDoc->SetRepeatRowRange( nTab, &aNew ); // einschalten - } - } - else - pDoc->SetRepeatRowRange( nTab, NULL ); // abschalten - - PrintAreaUndo_Impl( pOldRanges ); // Undo, Umbrueche, Modified etc. - - //! zuletzt gesetzten Bereich beim Abschalten merken und beim Einschalten wiederherstellen ??? - } -} - -table::CellRangeAddress SAL_CALL ScTableSheetObj::getTitleRows() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellRangeAddress aRet; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - const ScRange* pRange = pDoc->GetRepeatRowRange(nTab); - if (pRange) - { - ScUnoConversion::FillApiRange( aRet, *pRange ); - aRet.Sheet = nTab; // core does not care about sheet index - } - } - return aRet; -} - -void SAL_CALL ScTableSheetObj::setTitleRows( const table::CellRangeAddress& aTitleRows ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver(); - - ScRange aNew; - ScUnoConversion::FillScRange( aNew, aTitleRows ); - pDoc->SetRepeatRowRange( nTab, &aNew ); // immer auch einschalten - - PrintAreaUndo_Impl( pOldRanges ); // Undo, Umbrueche, Modified etc. - } -} - -// XSheetLinkable - -sheet::SheetLinkMode SAL_CALL ScTableSheetObj::getLinkMode() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sheet::SheetLinkMode eRet = sheet::SheetLinkMode_NONE; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - sal_uInt8 nMode = pDocSh->GetDocument()->GetLinkMode( GetTab_Impl() ); - if ( nMode == SC_LINK_NORMAL ) - eRet = sheet::SheetLinkMode_NORMAL; - else if ( nMode == SC_LINK_VALUE ) - eRet = sheet::SheetLinkMode_VALUE; - } - return eRet; -} - -void SAL_CALL ScTableSheetObj::setLinkMode( sheet::SheetLinkMode nLinkMode ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! Filter und Options aus altem Link suchen - - rtl::OUString aUrl(getLinkUrl()); - rtl::OUString aSheet(getLinkSheetName()); - - rtl::OUString aEmpty; - link( aUrl, aSheet, aEmpty, aEmpty, nLinkMode ); -} - -rtl::OUString SAL_CALL ScTableSheetObj::getLinkUrl() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aFile; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - aFile = pDocSh->GetDocument()->GetLinkDoc( GetTab_Impl() ); - return aFile; -} - -void SAL_CALL ScTableSheetObj::setLinkUrl( const rtl::OUString& aLinkUrl ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! Filter und Options aus altem Link suchen - - sheet::SheetLinkMode eMode = getLinkMode(); - rtl::OUString aSheet(getLinkSheetName()); - - rtl::OUString aEmpty; - link( aLinkUrl, aSheet, aEmpty, aEmpty, eMode ); -} - -rtl::OUString SAL_CALL ScTableSheetObj::getLinkSheetName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aSheet; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - aSheet = pDocSh->GetDocument()->GetLinkTab( GetTab_Impl() ); - return aSheet; -} - -void SAL_CALL ScTableSheetObj::setLinkSheetName( const rtl::OUString& aLinkSheetName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! Filter und Options aus altem Link suchen - - sheet::SheetLinkMode eMode = getLinkMode(); - rtl::OUString aUrl(getLinkUrl()); - - rtl::OUString aEmpty; - link( aUrl, aLinkSheetName, aEmpty, aEmpty, eMode ); -} - -void SAL_CALL ScTableSheetObj::link( const rtl::OUString& aUrl, const rtl::OUString& aSheetName, - const rtl::OUString& aFilterName, const rtl::OUString& aFilterOptions, - sheet::SheetLinkMode nMode ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - String aFileString (aUrl); - String aFilterString (aFilterName); - String aOptString (aFilterOptions); - String aSheetString (aSheetName); - - aFileString = ScGlobal::GetAbsDocName( aFileString, pDocSh ); - if ( !aFilterString.Len() ) - ScDocumentLoader::GetFilterName( aFileString, aFilterString, aOptString, sal_True, false ); - - // remove application prefix from filter name here, so the filter options - // aren't reset when the filter name is changed in ScTableLink::DataChanged - ScDocumentLoader::RemoveAppPrefix( aFilterString ); - - sal_uInt8 nLinkMode = SC_LINK_NONE; - if ( nMode == sheet::SheetLinkMode_NORMAL ) - nLinkMode = SC_LINK_NORMAL; - else if ( nMode == sheet::SheetLinkMode_VALUE ) - nLinkMode = SC_LINK_VALUE; - - sal_uLong nRefresh = 0; - pDoc->SetLink( nTab, nLinkMode, aFileString, aFilterString, aOptString, aSheetString, nRefresh ); - - pDocSh->UpdateLinks(); // ggf. Link eintragen oder loeschen - SfxBindings* pBindings = pDocSh->GetViewBindings(); - if (pBindings) - pBindings->Invalidate(SID_LINKS); - - //! Undo fuer Link-Daten an der Table - - if ( nLinkMode != SC_LINK_NONE && pDoc->IsExecuteLinkEnabled() ) // Link updaten - { - // Update immer, auch wenn der Link schon da war - //! Update nur fuer die betroffene Tabelle??? - - sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager(); - sal_uInt16 nCount = pLinkManager->GetLinks().Count(); - for ( sal_uInt16 i=0; i<nCount; i++ ) - { - ::sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[i]; - if (pBase->ISA(ScTableLink)) - { - ScTableLink* pTabLink = (ScTableLink*)pBase; - if ( pTabLink->GetFileName() == aFileString ) - pTabLink->Update(); // inkl. Paint&Undo - - //! Der Dateiname sollte nur einmal vorkommen (?) - } - } - } - - //! Notify fuer ScSheetLinkObj Objekte!!! - } -} - -// XSheetAuditing - -sal_Bool SAL_CALL ScTableSheetObj::hideDependents( const table::CellAddress& aPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - SCTAB nTab = GetTab_Impl(); - OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" ); - ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab ); - ScDocFunc aFunc(*pDocSh); - return aFunc.DetectiveDelSucc( aPos ); - } - return false; -} - -sal_Bool SAL_CALL ScTableSheetObj::hidePrecedents( const table::CellAddress& aPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - SCTAB nTab = GetTab_Impl(); - OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" ); - ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab ); - ScDocFunc aFunc(*pDocSh); - return aFunc.DetectiveDelPred( aPos ); - } - return false; -} - -sal_Bool SAL_CALL ScTableSheetObj::showDependents( const table::CellAddress& aPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - SCTAB nTab = GetTab_Impl(); - OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" ); - ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab ); - ScDocFunc aFunc(*pDocSh); - return aFunc.DetectiveAddSucc( aPos ); - } - return false; -} - -sal_Bool SAL_CALL ScTableSheetObj::showPrecedents( const table::CellAddress& aPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - SCTAB nTab = GetTab_Impl(); - OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" ); - ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab ); - ScDocFunc aFunc(*pDocSh); - return aFunc.DetectiveAddPred( aPos ); - } - return false; -} - -sal_Bool SAL_CALL ScTableSheetObj::showErrors( const table::CellAddress& aPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - SCTAB nTab = GetTab_Impl(); - OSL_ENSURE( aPosition.Sheet == nTab, "falsche Tabelle in CellAddress" ); - ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab ); - ScDocFunc aFunc(*pDocSh); - return aFunc.DetectiveAddError( aPos ); - } - return false; -} - -sal_Bool SAL_CALL ScTableSheetObj::showInvalid() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocFunc aFunc(*pDocSh); - return aFunc.DetectiveMarkInvalid( GetTab_Impl() ); - } - return false; -} - -void SAL_CALL ScTableSheetObj::clearArrows() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocFunc aFunc(*pDocSh); - aFunc.DetectiveDelAll( GetTab_Impl() ); - } -} - -// XSheetOutline - -void SAL_CALL ScTableSheetObj::group( const table::CellRangeAddress& rGroupRange, - table::TableOrientation nOrientation ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - sal_Bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS ); - ScRange aGroupRange; - ScUnoConversion::FillScRange( aGroupRange, rGroupRange ); - ScOutlineDocFunc aFunc(*pDocSh); - aFunc.MakeOutline( aGroupRange, bColumns, sal_True, sal_True ); - } -} - -void SAL_CALL ScTableSheetObj::ungroup( const table::CellRangeAddress& rGroupRange, - table::TableOrientation nOrientation ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - sal_Bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS ); - ScRange aGroupRange; - ScUnoConversion::FillScRange( aGroupRange, rGroupRange ); - ScOutlineDocFunc aFunc(*pDocSh); - aFunc.RemoveOutline( aGroupRange, bColumns, sal_True, sal_True ); - } -} - -void SAL_CALL ScTableSheetObj::autoOutline( const table::CellRangeAddress& rCellRange ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScRange aFormulaRange; - ScUnoConversion::FillScRange( aFormulaRange, rCellRange ); - ScOutlineDocFunc aFunc(*pDocSh); - aFunc.AutoOutline( aFormulaRange, sal_True, sal_True ); - } -} - -void SAL_CALL ScTableSheetObj::clearOutline() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - SCTAB nTab = GetTab_Impl(); - ScOutlineDocFunc aFunc(*pDocSh); - aFunc.RemoveAllOutlines( nTab, sal_True, sal_True ); - } -} - -void SAL_CALL ScTableSheetObj::hideDetail( const table::CellRangeAddress& rCellRange ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScRange aMarkRange; - ScUnoConversion::FillScRange( aMarkRange, rCellRange ); - ScOutlineDocFunc aFunc(*pDocSh); - aFunc.HideMarkedOutlines( aMarkRange, sal_True, sal_True ); - } -} - -void SAL_CALL ScTableSheetObj::showDetail( const table::CellRangeAddress& rCellRange ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScRange aMarkRange; - ScUnoConversion::FillScRange( aMarkRange, rCellRange ); - ScOutlineDocFunc aFunc(*pDocSh); - aFunc.ShowMarkedOutlines( aMarkRange, sal_True, sal_True ); - } -} - -void SAL_CALL ScTableSheetObj::showLevel( sal_Int16 nLevel, table::TableOrientation nOrientation ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - sal_Bool bColumns = ( nOrientation == table::TableOrientation_COLUMNS ); - SCTAB nTab = GetTab_Impl(); - ScOutlineDocFunc aFunc(*pDocSh); - aFunc.SelectLevel( nTab, bColumns, nLevel, sal_True, sal_True, sal_True ); - } -} - -// XProtectable - -void SAL_CALL ScTableSheetObj::protect( const rtl::OUString& aPassword ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - // #i108245# if already protected, don't change anything - if ( pDocSh && !pDocSh->GetDocument()->IsTabProtected( GetTab_Impl() ) ) - { - String aString(aPassword); - ScDocFunc aFunc(*pDocSh); - aFunc.Protect( GetTab_Impl(), aString, sal_True ); - } -} - -void SAL_CALL ScTableSheetObj::unprotect( const rtl::OUString& aPassword ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - String aString(aPassword); - ScDocFunc aFunc(*pDocSh); - sal_Bool bDone = aFunc.Unprotect( GetTab_Impl(), aString, sal_True ); - if (!bDone) - throw lang::IllegalArgumentException(); - } -} - -sal_Bool SAL_CALL ScTableSheetObj::isProtected() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - return pDocSh->GetDocument()->IsTabProtected( GetTab_Impl() ); - - OSL_FAIL("keine DocShell"); //! Exception oder so? - return false; -} - -// XScenario - -sal_Bool SAL_CALL ScTableSheetObj::getIsScenario() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - return pDocSh->GetDocument()->IsScenario( GetTab_Impl() ); - - return false; -} - -rtl::OUString SAL_CALL ScTableSheetObj::getScenarioComment() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDocSh->GetDocument()->GetScenarioData( GetTab_Impl(), aComment, aColor, nFlags ); - return aComment; - } - return rtl::OUString(); -} - -void SAL_CALL ScTableSheetObj::setScenarioComment( const rtl::OUString& aScenarioComment ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - String aName; - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetName( nTab, aName ); - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - - aComment = String( aScenarioComment ); - - pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags ); - } -} - -void SAL_CALL ScTableSheetObj::addRanges( const uno::Sequence<table::CellRangeAddress>& rScenRanges ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - if (pDoc->IsScenario(nTab)) - { - ScMarkData aMarkData; - aMarkData.SelectTable( nTab, sal_True ); - - sal_uInt16 nRangeCount = (sal_uInt16)rScenRanges.getLength(); - if (nRangeCount) - { - const table::CellRangeAddress* pAry = rScenRanges.getConstArray(); - for (sal_uInt16 i=0; i<nRangeCount; i++) - { - OSL_ENSURE( pAry[i].Sheet == nTab, "addRanges mit falscher Tab" ); - ScRange aOneRange( (SCCOL)pAry[i].StartColumn, (SCROW)pAry[i].StartRow, nTab, - (SCCOL)pAry[i].EndColumn, (SCROW)pAry[i].EndRow, nTab ); - - aMarkData.SetMultiMarkArea( aOneRange ); - } - } - - // Szenario-Ranges sind durch Attribut gekennzeichnet - ScPatternAttr aPattern( pDoc->GetPool() ); - aPattern.GetItemSet().Put( ScMergeFlagAttr( SC_MF_SCENARIO ) ); - aPattern.GetItemSet().Put( ScProtectionAttr( sal_True ) ); - ScDocFunc aFunc(*pDocSh); - aFunc.ApplyAttributes( aMarkData, aPattern, sal_True, sal_True ); - } - } -} - -void SAL_CALL ScTableSheetObj::apply() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - String aName; - pDoc->GetName( nTab, aName ); // Name dieses Szenarios - - SCTAB nDestTab = nTab; - while ( nDestTab > 0 && pDoc->IsScenario(nDestTab) ) - --nDestTab; - - if ( !pDoc->IsScenario(nDestTab) ) - pDocSh->UseScenario( nDestTab, aName ); - - //! sonst Fehler oder so - } -} - -// XScenarioEnhanced - -uno::Sequence< table::CellRangeAddress > SAL_CALL ScTableSheetObj::getRanges( ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - const ScRangeList* pRangeList = pDoc->GetScenarioRanges(nTab); - if (pRangeList) - { - size_t nCount = pRangeList->size(); - uno::Sequence< table::CellRangeAddress > aRetRanges( nCount ); - table::CellRangeAddress* pAry = aRetRanges.getArray(); - for( size_t nIndex = 0; nIndex < nCount; nIndex++ ) - { - const ScRange* pRange = (*pRangeList)[nIndex]; - pAry->StartColumn = pRange->aStart.Col(); - pAry->StartRow = pRange->aStart.Row(); - pAry->EndColumn = pRange->aEnd.Col(); - pAry->EndRow = pRange->aEnd.Row(); - pAry->Sheet = pRange->aStart.Tab(); - ++pAry; - } - return aRetRanges; - } - } - return uno::Sequence< table::CellRangeAddress > (); -} - -// XExternalSheetName - -void ScTableSheetObj::setExternalName( const ::rtl::OUString& aUrl, const ::rtl::OUString& aSheetName ) - throw (container::ElementExistException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - if ( pDoc ) - { - const SCTAB nTab = GetTab_Impl(); - const String aAbsDocName( ScGlobal::GetAbsDocName( aUrl, pDocSh ) ); - const String aDocTabName( ScGlobal::GetDocTabName( aAbsDocName, aSheetName ) ); - if ( !pDoc->RenameTab( nTab, aDocTabName, false /*bUpdateRef*/, sal_True /*bExternalDocument*/ ) ) - { - throw container::ElementExistException( ::rtl::OUString(), *this ); - } - } - } -} - -// XEventsSupplier - -uno::Reference<container::XNameReplace> SAL_CALL ScTableSheetObj::getEvents() throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - return new ScSheetEventsObj( pDocSh, GetTab_Impl() ); - - return NULL; -} - -// XPropertySet erweitert fuer Sheet-Properties - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableSheetObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( pSheetPropSet->getPropertyMap() )); - return aRef; -} - -void ScTableSheetObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - if ( pEntry ) - { - if ( IsScItemWid( pEntry->nWID ) ) - { - // for Item WIDs, call ScCellRangesBase directly - ScCellRangesBase::SetOnePropertyValue(pEntry, aValue); - return; - } - - // own properties - - ScDocShell* pDocSh = GetDocShell(); - if (!pDocSh) - return; //! Exception oder so? - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - ScDocFunc aFunc(*pDocSh); - - if ( pEntry->nWID == SC_WID_UNO_PAGESTL ) - { - rtl::OUString aStrVal; - aValue >>= aStrVal; - String aNewStr(ScStyleNameConversion::ProgrammaticToDisplayName( - aStrVal, SFX_STYLE_FAMILY_PAGE )); - - //! Undo? (auch bei SID_STYLE_APPLY an der View) - - if ( pDoc->GetPageStyle( nTab ) != aNewStr ) - { - pDoc->SetPageStyle( nTab, aNewStr ); - if (!pDoc->IsImportingXML()) - { - ScPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ).UpdatePages(); - - SfxBindings* pBindings = pDocSh->GetViewBindings(); - if (pBindings) - { - pBindings->Invalidate( SID_STYLE_FAMILY4 ); - pBindings->Invalidate( SID_STATUS_PAGESTYLE ); - pBindings->Invalidate( FID_RESET_PRINTZOOM ); - pBindings->Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT ); - pBindings->Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT ); - } - } - pDocSh->SetDocumentModified(); - } - } - else if ( pEntry->nWID == SC_WID_UNO_CELLVIS ) - { - sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - aFunc.SetTableVisible( nTab, bVis, sal_True ); - } - else if ( pEntry->nWID == SC_WID_UNO_ISACTIVE ) - { - if (pDoc->IsScenario(nTab)) - pDoc->SetActiveScenario( nTab, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - } - else if ( pEntry->nWID == SC_WID_UNO_BORDCOL ) - { - if (pDoc->IsScenario(nTab)) - { - sal_Int32 nNewColor = 0; - if (aValue >>= nNewColor) - { - String aName; - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetName( nTab, aName ); - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - - aColor = Color(static_cast<sal_uInt32>(nNewColor)); - - pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags ); - } - } - } - else if ( pEntry->nWID == SC_WID_UNO_PROTECT ) - { - if (pDoc->IsScenario(nTab)) - { - String aName; - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetName( nTab, aName ); - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - sal_Bool bModify(false); - - if (ScUnoHelpFunctions::GetBoolFromAny( aValue )) - { - if (!(nFlags & SC_SCENARIO_PROTECT)) - { - nFlags |= SC_SCENARIO_PROTECT; - bModify = sal_True; - } - } - else - { - if (nFlags & SC_SCENARIO_PROTECT) - { - nFlags -= SC_SCENARIO_PROTECT; - bModify = sal_True; - } - } - - if (bModify) - pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_SHOWBORD ) - { - if (pDoc->IsScenario(nTab)) - { - String aName; - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetName( nTab, aName ); - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - sal_Bool bModify(false); - - if (ScUnoHelpFunctions::GetBoolFromAny( aValue )) - { - if (!(nFlags & SC_SCENARIO_SHOWFRAME)) - { - nFlags |= SC_SCENARIO_SHOWFRAME; - bModify = sal_True; - } - } - else - { - if (nFlags & SC_SCENARIO_SHOWFRAME) - { - nFlags -= SC_SCENARIO_SHOWFRAME; - bModify = sal_True; - } - } - - if (bModify) - pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_PRINTBORD ) - { - if (pDoc->IsScenario(nTab)) - { - String aName; - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetName( nTab, aName ); - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - sal_Bool bModify(false); - - if (ScUnoHelpFunctions::GetBoolFromAny( aValue )) - { - if (!(nFlags & SC_SCENARIO_PRINTFRAME)) - { - nFlags |= SC_SCENARIO_PRINTFRAME; - bModify = sal_True; - } - } - else - { - if (nFlags & SC_SCENARIO_PRINTFRAME) - { - nFlags -= SC_SCENARIO_PRINTFRAME; - bModify = sal_True; - } - } - - if (bModify) - pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_COPYBACK ) - { - if (pDoc->IsScenario(nTab)) - { - String aName; - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetName( nTab, aName ); - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - sal_Bool bModify(false); - - if (ScUnoHelpFunctions::GetBoolFromAny( aValue )) - { - if (!(nFlags & SC_SCENARIO_TWOWAY)) - { - nFlags |= SC_SCENARIO_TWOWAY; - bModify = sal_True; - } - } - else - { - if (nFlags & SC_SCENARIO_TWOWAY) - { - nFlags -= SC_SCENARIO_TWOWAY; - bModify = sal_True; - } - } - - if (bModify) - pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_COPYSTYL ) - { - if (pDoc->IsScenario(nTab)) - { - String aName; - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetName( nTab, aName ); - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - sal_Bool bModify(false); - - if (ScUnoHelpFunctions::GetBoolFromAny( aValue )) - { - if (!(nFlags & SC_SCENARIO_ATTRIB)) - { - nFlags |= SC_SCENARIO_ATTRIB; - bModify = sal_True; - } - } - else - { - if (nFlags & SC_SCENARIO_ATTRIB) - { - nFlags -= SC_SCENARIO_ATTRIB; - bModify = sal_True; - } - } - - if (bModify) - pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_COPYFORM ) - { - if (pDoc->IsScenario(nTab)) - { - String aName; - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetName( nTab, aName ); - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - sal_Bool bModify(false); - - if (ScUnoHelpFunctions::GetBoolFromAny( aValue )) - { - if (nFlags & SC_SCENARIO_VALUE) - { - nFlags -= SC_SCENARIO_VALUE; - bModify = sal_True; - } - } - else - { - if (!(nFlags & SC_SCENARIO_VALUE)) - { - nFlags |= SC_SCENARIO_VALUE; - bModify = sal_True; - } - } - - if (bModify) - pDocSh->ModifyScenario( nTab, aName, aComment, aColor, nFlags ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_TABLAYOUT ) - { - sal_Int16 nValue = 0; - if (aValue >>= nValue) - { - if (nValue == com::sun::star::text::WritingMode2::RL_TB) - aFunc.SetLayoutRTL(nTab, sal_True, sal_True); - else - aFunc.SetLayoutRTL(nTab, false, sal_True); - } - } - else if ( pEntry->nWID == SC_WID_UNO_AUTOPRINT ) - { - sal_Bool bAutoPrint = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - if (bAutoPrint) - pDoc->SetPrintEntireSheet( nTab ); // clears all print ranges - else - { - if (pDoc->IsPrintEntireSheet( nTab )) - pDoc->ClearPrintRanges( nTab ); // if this flag is true, there are no PrintRanges, so Clear clears only the flag. - } - } - else if ( pEntry->nWID == SC_WID_UNO_TABCOLOR ) - { - sal_Int32 nColor = COL_AUTO; - if (aValue >>= nColor) - { - if (static_cast<ColorData>(nColor) != COL_AUTO) - pDoc->SetTabBgColor(nTab, Color(static_cast<ColorData>(nColor))); - } - } - else if ( pEntry->nWID == SC_WID_UNO_CODENAME ) - { - rtl::OUString aCodeName; - if ( pDocSh && ( aValue >>= aCodeName ) ) - { - pDocSh->GetDocument()->SetCodeName( GetTab_Impl(), aCodeName ); - } - } - else - ScCellRangeObj::SetOnePropertyValue(pEntry, aValue); // base class, no Item WID - } -} - -void ScTableSheetObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, - uno::Any& rAny ) - throw(uno::RuntimeException) -{ - if ( pEntry ) - { - ScDocShell* pDocSh = GetDocShell(); - if (!pDocSh) - throw uno::RuntimeException(); - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = GetTab_Impl(); - - if ( pEntry->nWID == SC_WID_UNO_PAGESTL ) - { - rAny <<= rtl::OUString( ScStyleNameConversion::DisplayToProgrammaticName( - pDoc->GetPageStyle( nTab ), SFX_STYLE_FAMILY_PAGE ) ); - } - else if ( pEntry->nWID == SC_WID_UNO_CELLVIS ) - { - sal_Bool bVis = pDoc->IsVisible( nTab ); - ScUnoHelpFunctions::SetBoolInAny( rAny, bVis ); - } - else if ( pEntry->nWID == SC_WID_UNO_LINKDISPBIT ) - { - // no target bitmaps for individual entries (would be all equal) - // ScLinkTargetTypeObj::SetLinkTargetBitmap( aAny, SC_LINKTARGETTYPE_SHEET ); - } - else if ( pEntry->nWID == SC_WID_UNO_LINKDISPNAME ) - { - // LinkDisplayName for hyperlink dialog - rAny <<= getName(); // sheet name - } - else if ( pEntry->nWID == SC_WID_UNO_ISACTIVE ) - { - if (pDoc->IsScenario(nTab)) - ScUnoHelpFunctions::SetBoolInAny( rAny, pDoc->IsActiveScenario( nTab )); - } - else if ( pEntry->nWID == SC_WID_UNO_BORDCOL ) - { - if (pDoc->IsScenario(nTab)) - { - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - - rAny <<= static_cast<sal_Int32>(aColor.GetColor()); - } - } - else if ( pEntry->nWID == SC_WID_UNO_PROTECT ) - { - if (pDoc->IsScenario(nTab)) - { - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - - ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_PROTECT) != 0 ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_SHOWBORD ) - { - if (pDoc->IsScenario(nTab)) - { - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - - ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_SHOWFRAME) != 0 ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_PRINTBORD ) - { - if (pDoc->IsScenario(nTab)) - { - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - - ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_PRINTFRAME) != 0 ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_COPYBACK ) - { - if (pDoc->IsScenario(nTab)) - { - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - - ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_TWOWAY) != 0 ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_COPYSTYL ) - { - if (pDoc->IsScenario(nTab)) - { - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - - ScUnoHelpFunctions::SetBoolInAny( rAny, (nFlags & SC_SCENARIO_ATTRIB) != 0 ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_COPYFORM ) - { - if (pDoc->IsScenario(nTab)) - { - String aComment; - Color aColor; - sal_uInt16 nFlags; - pDoc->GetScenarioData( nTab, aComment, aColor, nFlags ); - - ScUnoHelpFunctions::SetBoolInAny( rAny, !(nFlags & SC_SCENARIO_VALUE)); - } - } - else if ( pEntry->nWID == SC_WID_UNO_TABLAYOUT ) - { - if (pDoc->IsLayoutRTL(nTab)) - rAny <<= sal_Int16(com::sun::star::text::WritingMode2::RL_TB); - else - rAny <<= sal_Int16(com::sun::star::text::WritingMode2::LR_TB); - } - else if ( pEntry->nWID == SC_WID_UNO_AUTOPRINT ) - { - sal_Bool bAutoPrint = pDoc->IsPrintEntireSheet( nTab ); - ScUnoHelpFunctions::SetBoolInAny( rAny, bAutoPrint ); - } - else if ( pEntry->nWID == SC_WID_UNO_TABCOLOR ) - { - rAny <<= sal_Int32(pDoc->GetTabBgColor(nTab).GetColor()); - } - else if ( pEntry->nWID == SC_WID_UNO_CODENAME ) - { - String aCodeName; - if ( pDocSh ) - pDocSh->GetDocument()->GetCodeName( GetTab_Impl(), aCodeName ); - rAny <<= rtl::OUString( aCodeName ); - } - else - ScCellRangeObj::GetOnePropertyValue(pEntry, rAny); - } -} - -const SfxItemPropertyMap* ScTableSheetObj::GetItemPropertyMap() -{ - return pSheetPropSet->getPropertyMap(); -} - -// XServiceInfo - -rtl::OUString SAL_CALL ScTableSheetObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScTableSheetObj" )); -} - -sal_Bool SAL_CALL ScTableSheetObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr( rServiceName ); - return aServiceStr.EqualsAscii( SCSPREADSHEET_SERVICE ) || - aServiceStr.EqualsAscii( SCSHEETCELLRANGE_SERVICE ) || - aServiceStr.EqualsAscii( SCCELLRANGE_SERVICE ) || - aServiceStr.EqualsAscii( SCCELLPROPERTIES_SERVICE ) || - aServiceStr.EqualsAscii( SCCHARPROPERTIES_SERVICE ) || - aServiceStr.EqualsAscii( SCPARAPROPERTIES_SERVICE ) || - aServiceStr.EqualsAscii( SCLINKTARGET_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScTableSheetObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(7); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSPREADSHEET_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELLRANGE_SERVICE )); - pArray[2] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLRANGE_SERVICE )); - pArray[3] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLPROPERTIES_SERVICE )); - pArray[4] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCHARPROPERTIES_SERVICE )); - pArray[5] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCPARAPROPERTIES_SERVICE )); - pArray[6] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCLINKTARGET_SERVICE )); - return aRet; -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScTableSheetObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - - return ScCellRangeObj::getSomething( rId ); -} - -namespace -{ - class theScTableSheetObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScTableSheetObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScTableSheetObj::getUnoTunnelId() -{ - return theScTableSheetObjUnoTunnelId::get().getSeq(); -} - -ScTableSheetObj* ScTableSheetObj::getImplementation( const uno::Reference<uno::XInterface> xObj ) -{ - ScTableSheetObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScTableSheetObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -//------------------------------------------------------------------------ - -ScTableColumnObj::ScTableColumnObj( ScDocShell* pDocSh, SCCOL nCol, SCTAB nTab ) : - ScCellRangeObj( pDocSh, ScRange(nCol,0,nTab, nCol,MAXROW,nTab) ), - pColPropSet(lcl_GetColumnPropertySet()) -{ -} - -ScTableColumnObj::~ScTableColumnObj() -{ -} - -uno::Any SAL_CALL ScTableColumnObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( container::XNamed ) - - return ScCellRangeObj::queryInterface( rType ); -} - -void SAL_CALL ScTableColumnObj::acquire() throw() -{ - ScCellRangeObj::acquire(); -} - -void SAL_CALL ScTableColumnObj::release() throw() -{ - ScCellRangeObj::release(); -} - -uno::Sequence<uno::Type> SAL_CALL ScTableColumnObj::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - uno::Sequence<uno::Type> aParentTypes(ScCellRangeObj::getTypes()); - long nParentLen = aParentTypes.getLength(); - const uno::Type* pParentPtr = aParentTypes.getConstArray(); - - aTypes.realloc( nParentLen + 1 ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[nParentLen + 0] = getCppuType((const uno::Reference<container::XNamed>*)0); - - for (long i=0; i<nParentLen; i++) - pPtr[i] = pParentPtr[i]; // parent types first - } - return aTypes; -} - -namespace -{ - class theScTableColumnObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScTableColumnObjImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScTableColumnObj::getImplementationId() throw(uno::RuntimeException) -{ - return theScTableColumnObjImplementationId::get().getSeq(); -} - -// XNamed - -rtl::OUString SAL_CALL ScTableColumnObj::getName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - const ScRange& rRange = GetRange(); - OSL_ENSURE(rRange.aStart.Col() == rRange.aEnd.Col(), "too many columns"); - SCCOL nCol = rRange.aStart.Col(); - - return ScColToAlpha( nCol ); // from global.hxx -} - -void SAL_CALL ScTableColumnObj::setName( const rtl::OUString& /* aNewName */ ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - throw uno::RuntimeException(); // read-only -} - -// XPropertySet erweitert fuer Spalten-Properties - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableColumnObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( pColPropSet->getPropertyMap() )); - return aRef; -} - -void ScTableColumnObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - if ( pEntry ) - { - if ( IsScItemWid( pEntry->nWID ) ) - { - // for Item WIDs, call ScCellRangesBase directly - ScCellRangesBase::SetOnePropertyValue(pEntry, aValue); - return; - } - - // own properties - - ScDocShell* pDocSh = GetDocShell(); - if (!pDocSh) - return; //! Exception oder so? - const ScRange& rRange = GetRange(); - OSL_ENSURE(rRange.aStart.Col() == rRange.aEnd.Col(), "zuviele Spalten"); - SCCOL nCol = rRange.aStart.Col(); - SCTAB nTab = rRange.aStart.Tab(); - ScDocFunc aFunc(*pDocSh); - - SCCOLROW nColArr[2]; - nColArr[0] = nColArr[1] = nCol; - - if ( pEntry->nWID == SC_WID_UNO_CELLWID ) - { - sal_Int32 nNewWidth = 0; - if ( aValue >>= nNewWidth ) - { - // property is 1/100mm, column width is twips - nNewWidth = HMMToTwips(nNewWidth); - aFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab, SC_SIZE_ORIGINAL, - (sal_uInt16)nNewWidth, sal_True, sal_True ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_CELLVIS ) - { - sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT; - aFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab, eMode, 0, sal_True, sal_True ); - // SC_SIZE_DIRECT mit Groesse 0 blendet aus - } - else if ( pEntry->nWID == SC_WID_UNO_OWIDTH ) - { - sal_Bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - if (bOpt) - aFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab, - SC_SIZE_OPTIMAL, STD_EXTRA_WIDTH, sal_True, sal_True ); - // sal_False bei Spalten momentan ohne Auswirkung - } - else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE || pEntry->nWID == SC_WID_UNO_MANPAGE ) - { - sal_Bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - if (bSet) - aFunc.InsertPageBreak( sal_True, rRange.aStart, sal_True, sal_True, sal_True ); - else - aFunc.RemovePageBreak( sal_True, rRange.aStart, sal_True, sal_True, sal_True ); - } - else - ScCellRangeObj::SetOnePropertyValue(pEntry, aValue); // base class, no Item WID - } -} - -void ScTableColumnObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, - uno::Any& rAny ) - throw(uno::RuntimeException) -{ - if ( pEntry ) - { - ScDocShell* pDocSh = GetDocShell(); - if (!pDocSh) - throw uno::RuntimeException(); - - ScDocument* pDoc = pDocSh->GetDocument(); - const ScRange& rRange = GetRange(); - OSL_ENSURE(rRange.aStart.Col() == rRange.aEnd.Col(), "zuviele Spalten"); - SCCOL nCol = rRange.aStart.Col(); - SCTAB nTab = rRange.aStart.Tab(); - - if ( pEntry->nWID == SC_WID_UNO_CELLWID ) - { - // for hidden column, return original height - sal_uInt16 nWidth = pDoc->GetOriginalWidth( nCol, nTab ); - // property is 1/100mm, column width is twips - nWidth = (sal_uInt16) TwipsToHMM(nWidth); - rAny <<= (sal_Int32)( nWidth ); - } - else if ( pEntry->nWID == SC_WID_UNO_CELLVIS ) - { - bool bHidden = pDoc->ColHidden(nCol, nTab); - ScUnoHelpFunctions::SetBoolInAny( rAny, !bHidden ); - } - else if ( pEntry->nWID == SC_WID_UNO_OWIDTH ) - { - //! momentan immer gesetzt ??!?! - sal_Bool bOpt = !(pDoc->GetColFlags( nCol, nTab ) & CR_MANUALSIZE); - ScUnoHelpFunctions::SetBoolInAny( rAny, bOpt ); - } - else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE ) - { - ScBreakType nBreak = pDoc->HasColBreak(nCol, nTab); - ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak ); - } - else if ( pEntry->nWID == SC_WID_UNO_MANPAGE ) - { - ScBreakType nBreak = pDoc->HasColBreak(nCol, nTab); - ScUnoHelpFunctions::SetBoolInAny(rAny, (nBreak & BREAK_MANUAL)); - } - else - ScCellRangeObj::GetOnePropertyValue(pEntry, rAny); - } -} - -const SfxItemPropertyMap* ScTableColumnObj::GetItemPropertyMap() -{ - return pColPropSet->getPropertyMap(); -} - -//------------------------------------------------------------------------ - -ScTableRowObj::ScTableRowObj(ScDocShell* pDocSh, SCROW nRow, SCTAB nTab) : - ScCellRangeObj( pDocSh, ScRange(0,nRow,nTab, MAXCOL,nRow,nTab) ), - pRowPropSet(lcl_GetRowPropertySet()) -{ -} - -ScTableRowObj::~ScTableRowObj() -{ -} - -// XPropertySet erweitert fuer Zeilen-Properties - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableRowObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( pRowPropSet->getPropertyMap() )); - return aRef; -} - -void ScTableRowObj::SetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, const uno::Any& aValue ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - if ( pEntry ) - { - if ( IsScItemWid( pEntry->nWID ) ) - { - // for Item WIDs, call ScCellRangesBase directly - ScCellRangesBase::SetOnePropertyValue(pEntry, aValue); - return; - } - - // own properties - - ScDocShell* pDocSh = GetDocShell(); - if (!pDocSh) - return; //! Exception oder so? - ScDocument* pDoc = pDocSh->GetDocument(); - const ScRange& rRange = GetRange(); - OSL_ENSURE(rRange.aStart.Row() == rRange.aEnd.Row(), "zuviele Zeilen"); - SCROW nRow = rRange.aStart.Row(); - SCTAB nTab = rRange.aStart.Tab(); - ScDocFunc aFunc(*pDocSh); - - SCCOLROW nRowArr[2]; - nRowArr[0] = nRowArr[1] = nRow; - - if ( pEntry->nWID == SC_WID_UNO_CELLHGT ) - { - sal_Int32 nNewHeight = 0; - if ( aValue >>= nNewHeight ) - { - // property is 1/100mm, row height is twips - nNewHeight = HMMToTwips(nNewHeight); - aFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, SC_SIZE_ORIGINAL, - (sal_uInt16)nNewHeight, sal_True, sal_True ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_CELLVIS ) - { - sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT; - aFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, eMode, 0, sal_True, sal_True ); - // SC_SIZE_DIRECT mit Groesse 0 blendet aus - } - else if ( pEntry->nWID == SC_WID_UNO_CELLFILT ) - { - sal_Bool bFil = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - // SC_SIZE_DIRECT mit Groesse 0 blendet aus - pDoc->SetRowFiltered(nRow, nRow, nTab, bFil); - } - else if ( pEntry->nWID == SC_WID_UNO_OHEIGHT ) - { - sal_Bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - if (bOpt) - aFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, SC_SIZE_OPTIMAL, 0, sal_True, sal_True ); - else - { - // set current height again manually - sal_uInt16 nHeight = pDoc->GetOriginalHeight( nRow, nTab ); - aFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, SC_SIZE_ORIGINAL, nHeight, sal_True, sal_True ); - } - } - else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE || pEntry->nWID == SC_WID_UNO_MANPAGE ) - { - sal_Bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - if (bSet) - aFunc.InsertPageBreak( false, rRange.aStart, sal_True, sal_True, sal_True ); - else - aFunc.RemovePageBreak( false, rRange.aStart, sal_True, sal_True, sal_True ); - } - else - ScCellRangeObj::SetOnePropertyValue(pEntry, aValue); // base class, no Item WID - } -} - -void ScTableRowObj::GetOnePropertyValue( const SfxItemPropertySimpleEntry* pEntry, - uno::Any& rAny ) - throw(uno::RuntimeException) -{ - if ( pEntry ) - { - ScDocShell* pDocSh = GetDocShell(); - if (!pDocSh) - throw uno::RuntimeException(); - ScDocument* pDoc = pDocSh->GetDocument(); - const ScRange& rRange = GetRange(); - OSL_ENSURE(rRange.aStart.Row() == rRange.aEnd.Row(), "zuviele Zeilen"); - SCROW nRow = rRange.aStart.Row(); - SCTAB nTab = rRange.aStart.Tab(); - - if ( pEntry->nWID == SC_WID_UNO_CELLHGT ) - { - // for hidden row, return original height - sal_uInt16 nHeight = pDoc->GetOriginalHeight( nRow, nTab ); - // property is 1/100mm, row height is twips - nHeight = (sal_uInt16) TwipsToHMM(nHeight); - rAny <<= (sal_Int32)( nHeight ); - } - else if ( pEntry->nWID == SC_WID_UNO_CELLVIS ) - { - bool bHidden = pDoc->RowHidden(nRow, nTab); - ScUnoHelpFunctions::SetBoolInAny( rAny, !bHidden ); - } - else if ( pEntry->nWID == SC_WID_UNO_CELLFILT ) - { - bool bVis = pDoc->RowFiltered(nRow, nTab); - ScUnoHelpFunctions::SetBoolInAny( rAny, bVis ); - } - else if ( pEntry->nWID == SC_WID_UNO_OHEIGHT ) - { - sal_Bool bOpt = !(pDoc->GetRowFlags( nRow, nTab ) & CR_MANUALSIZE); - ScUnoHelpFunctions::SetBoolInAny( rAny, bOpt ); - } - else if ( pEntry->nWID == SC_WID_UNO_NEWPAGE ) - { - ScBreakType nBreak = pDoc->HasRowBreak(nRow, nTab); - ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak ); - } - else if ( pEntry->nWID == SC_WID_UNO_MANPAGE ) - { - ScBreakType nBreak = (pDoc->HasRowBreak(nRow, nTab) & BREAK_MANUAL); - ScUnoHelpFunctions::SetBoolInAny( rAny, nBreak ); - } - else - ScCellRangeObj::GetOnePropertyValue(pEntry, rAny); - } -} - -const SfxItemPropertyMap* ScTableRowObj::GetItemPropertyMap() -{ - return pRowPropSet->getPropertyMap(); -} - -//------------------------------------------------------------------------ - -ScCellsObj::ScCellsObj(ScDocShell* pDocSh, const ScRangeList& rR) : - pDocShell( pDocSh ), - aRanges( rR ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScCellsObj::~ScCellsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScCellsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint; - aRanges.UpdateReference( rRef.GetMode(), pDocShell->GetDocument(), rRef.GetRange(), - rRef.GetDx(), rRef.GetDy(), rRef.GetDz() ); - } - else if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScCellsObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return new ScCellsEnumeration( pDocShell, aRanges ); - return NULL; -} - -uno::Type SAL_CALL ScCellsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<table::XCell>*)0); -} - -sal_Bool SAL_CALL ScCellsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bHas = false; - if ( pDocShell ) - { - //! schneller selber testen? - - uno::Reference<container::XEnumeration> xEnum(new ScCellsEnumeration( pDocShell, aRanges )); - bHas = xEnum->hasMoreElements(); - } - return bHas; -} - -//------------------------------------------------------------------------ - -ScCellsEnumeration::ScCellsEnumeration(ScDocShell* pDocSh, const ScRangeList& rR) : - pDocShell( pDocSh ), - aRanges( rR ), - pMark( NULL ), - bAtEnd( false ) -{ - ScDocument* pDoc = pDocShell->GetDocument(); - pDoc->AddUnoObject(*this); - - if ( aRanges.empty() ) - bAtEnd = true; - else - { - SCTAB nTab = 0; - const ScRange* pFirst = aRanges[ 0 ]; - if (pFirst) - nTab = pFirst->aStart.Tab(); - aPos = ScAddress(0,0,nTab); - CheckPos_Impl(); // aPos auf erste passende Zelle setzen - } -} - -void ScCellsEnumeration::CheckPos_Impl() -{ - if (pDocShell) - { - sal_Bool bFound = false; - ScDocument* pDoc = pDocShell->GetDocument(); - ScBaseCell* pCell = pDoc->GetCell(aPos); - if ( pCell && pCell->GetCellType() != CELLTYPE_NOTE ) - { - if (!pMark) - { - pMark = new ScMarkData; - pMark->MarkFromRangeList( aRanges, false ); - pMark->MarkToMulti(); // needed for GetNextMarkedCell - } - bFound = pMark->IsCellMarked( aPos.Col(), aPos.Row() ); - } - if (!bFound) - Advance_Impl(); - } -} - -ScCellsEnumeration::~ScCellsEnumeration() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); - delete pMark; -} - -void ScCellsEnumeration::Advance_Impl() -{ - OSL_ENSURE(!bAtEnd,"zuviel Advance_Impl"); - if (!pMark) - { - pMark = new ScMarkData; - pMark->MarkFromRangeList( aRanges, false ); - pMark->MarkToMulti(); // needed for GetNextMarkedCell - } - - SCCOL nCol = aPos.Col(); - SCROW nRow = aPos.Row(); - SCTAB nTab = aPos.Tab(); - sal_Bool bFound = pDocShell->GetDocument()->GetNextMarkedCell( nCol, nRow, nTab, *pMark ); - if (bFound) - aPos.Set( nCol, nRow, nTab ); - else - bAtEnd = sal_True; // kommt nix mehr -} - -void ScCellsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - if (pDocShell) - { - const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint; - aRanges.UpdateReference( rRef.GetMode(), pDocShell->GetDocument(), rRef.GetRange(), - rRef.GetDx(), rRef.GetDy(), rRef.GetDz() ); - - delete pMark; // aus verschobenen Bereichen neu erzeugen - pMark = NULL; - - if (!bAtEnd) // aPos anpassen - { - ScRangeList aNew; - aNew.Append(ScRange(aPos)); - aNew.UpdateReference( rRef.GetMode(), pDocShell->GetDocument(), rRef.GetRange(), - rRef.GetDx(), rRef.GetDy(), rRef.GetDz() ); - if (aNew.size()==1) - { - aPos = aNew[ 0 ]->aStart; - CheckPos_Impl(); - } - } - } - } - else if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XEnumeration - -sal_Bool SAL_CALL ScCellsEnumeration::hasMoreElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return !bAtEnd; -} - -uno::Any SAL_CALL ScCellsEnumeration::nextElement() throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell && !bAtEnd) - { - // Interface-Typ muss zu ScCellsObj::getElementType passen - - ScAddress aTempPos(aPos); - Advance_Impl(); - return uno::makeAny(uno::Reference<table::XCell>(new ScCellObj( pDocShell, aTempPos ))); - } - - throw container::NoSuchElementException(); // no more elements -} - -//------------------------------------------------------------------------ - -ScCellFormatsObj::ScCellFormatsObj(ScDocShell* pDocSh, const ScRange& rRange) : - pDocShell( pDocSh ), - aTotalRange( rRange ) -{ - ScDocument* pDoc = pDocShell->GetDocument(); - pDoc->AddUnoObject(*this); - - OSL_ENSURE( aTotalRange.aStart.Tab() == aTotalRange.aEnd.Tab(), "unterschiedliche Tabellen" ); -} - -ScCellFormatsObj::~ScCellFormatsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScCellFormatsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - //! aTotalRange... - } - else if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -ScCellRangeObj* ScCellFormatsObj::GetObjectByIndex_Impl(long nIndex) const -{ - //! direkt auf die AttrArrays zugreifen !!!! - - ScCellRangeObj* pRet = NULL; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - long nPos = 0; - ScAttrRectIterator aIter( pDoc, aTotalRange.aStart.Tab(), - aTotalRange.aStart.Col(), aTotalRange.aStart.Row(), - aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() ); - SCCOL nCol1, nCol2; - SCROW nRow1, nRow2; - while ( aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) ) - { - if ( nPos == nIndex ) - { - SCTAB nTab = aTotalRange.aStart.Tab(); - ScRange aNext( nCol1, nRow1, nTab, nCol2, nRow2, nTab ); - - if ( aNext.aStart == aNext.aEnd ) - pRet = new ScCellObj( pDocShell, aNext.aStart ); - else - pRet = new ScCellRangeObj( pDocShell, aNext ); - } - ++nPos; - } - } - return pRet; -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScCellFormatsObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! direkt auf die AttrArrays zugreifen !!!! - - long nCount = 0; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScAttrRectIterator aIter( pDoc, aTotalRange.aStart.Tab(), - aTotalRange.aStart.Col(), aTotalRange.aStart.Row(), - aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() ); - SCCOL nCol1, nCol2; - SCROW nRow1, nRow2; - while ( aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) ) - ++nCount; - } - return nCount; -} - -uno::Any SAL_CALL ScCellFormatsObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<table::XCellRange> xRange(GetObjectByIndex_Impl(nIndex)); - if (xRange.is()) - return uno::makeAny(xRange); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScCellFormatsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<table::XCellRange>*)0); -} - -sal_Bool SAL_CALL ScCellFormatsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); //! immer groesser 0 ?? -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScCellFormatsObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return new ScCellFormatsEnumeration( pDocShell, aTotalRange ); - return NULL; -} - -//------------------------------------------------------------------------ - -ScCellFormatsEnumeration::ScCellFormatsEnumeration(ScDocShell* pDocSh, const ScRange& rRange) : - pDocShell( pDocSh ), - nTab( rRange.aStart.Tab() ), - pIter( NULL ), - bAtEnd( false ), - bDirty( false ) -{ - ScDocument* pDoc = pDocShell->GetDocument(); - pDoc->AddUnoObject(*this); - - OSL_ENSURE( rRange.aStart.Tab() == rRange.aEnd.Tab(), - "CellFormatsEnumeration: unterschiedliche Tabellen" ); - - pIter = new ScAttrRectIterator( pDoc, nTab, - rRange.aStart.Col(), rRange.aStart.Row(), - rRange.aEnd.Col(), rRange.aEnd.Row() ); - Advance_Impl(); -} - -ScCellFormatsEnumeration::~ScCellFormatsEnumeration() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); - delete pIter; -} - -void ScCellFormatsEnumeration::Advance_Impl() -{ - OSL_ENSURE(!bAtEnd,"zuviel Advance_Impl"); - - if ( pIter ) - { - if ( bDirty ) - { - pIter->DataChanged(); // AttrArray-Index neu suchen - bDirty = false; - } - - SCCOL nCol1, nCol2; - SCROW nRow1, nRow2; - if ( pIter->GetNext( nCol1, nCol2, nRow1, nRow2 ) ) - aNext = ScRange( nCol1, nRow1, nTab, nCol2, nRow2, nTab ); - else - bAtEnd = sal_True; // kommt nix mehr - } - else - bAtEnd = sal_True; // Dok weggekommen oder so -} - -ScCellRangeObj* ScCellFormatsEnumeration::NextObject_Impl() -{ - ScCellRangeObj* pRet = NULL; - if (pDocShell && !bAtEnd) - { - if ( aNext.aStart == aNext.aEnd ) - pRet = new ScCellObj( pDocShell, aNext.aStart ); - else - pRet = new ScCellRangeObj( pDocShell, aNext ); - Advance_Impl(); - } - return pRet; -} - -void ScCellFormatsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - //! und nun ??? - } - else if ( rHint.ISA( SfxSimpleHint ) ) - { - sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); - if ( nId == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - delete pIter; - pIter = NULL; - } - else if ( nId == SFX_HINT_DATACHANGED ) - { - bDirty = sal_True; // AttrArray-Index evtl. ungueltig geworden - } - } -} - -// XEnumeration - -sal_Bool SAL_CALL ScCellFormatsEnumeration::hasMoreElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return !bAtEnd; -} - -uno::Any SAL_CALL ScCellFormatsEnumeration::nextElement() throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( bAtEnd || !pDocShell ) - throw container::NoSuchElementException(); // no more elements - - // Interface-Typ muss zu ScCellFormatsObj::getElementType passen - - return uno::makeAny(uno::Reference<table::XCellRange> (NextObject_Impl())); -} - -//------------------------------------------------------------------------ - -ScUniqueCellFormatsObj::ScUniqueCellFormatsObj(ScDocShell* pDocSh, const ScRange& rRange) : - pDocShell( pDocSh ), - aTotalRange( rRange ), - aRangeLists() -{ - pDocShell->GetDocument()->AddUnoObject(*this); - - OSL_ENSURE( aTotalRange.aStart.Tab() == aTotalRange.aEnd.Tab(), "unterschiedliche Tabellen" ); - - GetObjects_Impl(); -} - -ScUniqueCellFormatsObj::~ScUniqueCellFormatsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScUniqueCellFormatsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - //! aTotalRange... - } - else if ( rHint.ISA( SfxSimpleHint ) ) - { - sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); - if ( nId == SFX_HINT_DYING ) - pDocShell = NULL; // ungueltig geworden - } -} - -// -// Fill the list of formats from the document -// - -// hash code to access the range lists by ScPatternAttr pointer -struct ScPatternHashCode -{ - size_t operator()( const ScPatternAttr* pPattern ) const - { - return reinterpret_cast<size_t>(pPattern); - } -}; - -// Hash map to find a range by its start row -typedef ::boost::unordered_map< SCROW, ScRange > ScRowRangeHashMap; - -typedef ::std::vector<ScRange> ScRangeVector; - -// Hash map entry. -// The Join method depends on the column-wise order of ScAttrRectIterator -class ScUniqueFormatsEntry -{ - enum EntryState { STATE_EMPTY, STATE_SINGLE, STATE_COMPLEX }; - - EntryState eState; - ScRange aSingleRange; - ScRowRangeHashMap aJoinedRanges; // "active" ranges to be merged - ScRangeVector aCompletedRanges; // ranges that will no longer be touched - ScRangeListRef aReturnRanges; // result as ScRangeList for further use - -public: - ScUniqueFormatsEntry() : eState( STATE_EMPTY ) {} - ScUniqueFormatsEntry( const ScUniqueFormatsEntry& r ) : - eState( r.eState ), - aSingleRange( r.aSingleRange ), - aJoinedRanges( r.aJoinedRanges ), - aCompletedRanges( r.aCompletedRanges ), - aReturnRanges( r.aReturnRanges ) {} - ~ScUniqueFormatsEntry() {} - - void Join( const ScRange& rNewRange ); - const ScRangeList& GetRanges(); - void Clear() { aReturnRanges.Clear(); } // aJoinedRanges and aCompletedRanges are cleared in GetRanges -}; - -void ScUniqueFormatsEntry::Join( const ScRange& rNewRange ) -{ - // Special-case handling for single range - - if ( eState == STATE_EMPTY ) - { - aSingleRange = rNewRange; - eState = STATE_SINGLE; - return; - } - if ( eState == STATE_SINGLE ) - { - if ( aSingleRange.aStart.Row() == rNewRange.aStart.Row() && - aSingleRange.aEnd.Row() == rNewRange.aEnd.Row() && - aSingleRange.aEnd.Col() + 1 == rNewRange.aStart.Col() ) - { - aSingleRange.aEnd.SetCol( rNewRange.aEnd.Col() ); - return; // still a single range - } - - SCROW nSingleRow = aSingleRange.aStart.Row(); - aJoinedRanges.insert( ScRowRangeHashMap::value_type( nSingleRow, aSingleRange ) ); - eState = STATE_COMPLEX; - // continue normally - } - - // This is called in the order of ScAttrRectIterator results. - // rNewRange can only be joined with an existing entry if it's the same rows, starting in the next column. - // If the old entry for the start row extends to a different end row, or ends in a different column, it - // can be moved to aCompletedRanges because it can't be joined with following iterator results. - // Everything happens within one sheet, so Tab can be ignored. - - SCROW nStartRow = rNewRange.aStart.Row(); - ScRowRangeHashMap::iterator aIter( aJoinedRanges.find( nStartRow ) ); // find the active entry for the start row - if ( aIter != aJoinedRanges.end() ) - { - ScRange& rOldRange = aIter->second; - if ( rOldRange.aEnd.Row() == rNewRange.aEnd.Row() && - rOldRange.aEnd.Col() + 1 == rNewRange.aStart.Col() ) - { - // extend existing range - rOldRange.aEnd.SetCol( rNewRange.aEnd.Col() ); - } - else - { - // move old range to aCompletedRanges, keep rNewRange for joining - aCompletedRanges.push_back( rOldRange ); - rOldRange = rNewRange; // replace in hash map - } - } - else - { - // keep rNewRange for joining - aJoinedRanges.insert( ScRowRangeHashMap::value_type( nStartRow, rNewRange ) ); - } -} - -const ScRangeList& ScUniqueFormatsEntry::GetRanges() -{ - if ( eState == STATE_SINGLE ) - { - aReturnRanges = new ScRangeList; - aReturnRanges->Append( aSingleRange ); - return *aReturnRanges; - } - - // move remaining entries from aJoinedRanges to aCompletedRanges - - ScRowRangeHashMap::const_iterator aJoinedEnd = aJoinedRanges.end(); - for ( ScRowRangeHashMap::const_iterator aJoinedIter = aJoinedRanges.begin(); aJoinedIter != aJoinedEnd; ++aJoinedIter ) - aCompletedRanges.push_back( aJoinedIter->second ); - aJoinedRanges.clear(); - - // sort all ranges for a predictable API result - - std::sort( aCompletedRanges.begin(), aCompletedRanges.end() ); - - // fill and return ScRangeList - - aReturnRanges = new ScRangeList; - ScRangeVector::const_iterator aCompEnd( aCompletedRanges.end() ); - for ( ScRangeVector::const_iterator aCompIter( aCompletedRanges.begin() ); aCompIter != aCompEnd; ++aCompIter ) - aReturnRanges->Append( *aCompIter ); - aCompletedRanges.clear(); - - return *aReturnRanges; -} - -typedef ::boost::unordered_map< const ScPatternAttr*, ScUniqueFormatsEntry, ScPatternHashCode > ScUniqueFormatsHashMap; - -// function object to sort the range lists by start of first range -struct ScUniqueFormatsOrder -{ - bool operator()( const ScRangeList& rList1, const ScRangeList& rList2 ) const - { - // all range lists have at least one entry - OSL_ENSURE( rList1.size() > 0 && rList2.size() > 0, "ScUniqueFormatsOrder: empty list" ); - - // compare start positions using ScAddress comparison operator - return ( rList1[ 0 ]->aStart < rList2[ 0 ]->aStart ); - } -}; - -void ScUniqueCellFormatsObj::GetObjects_Impl() -{ - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - SCTAB nTab = aTotalRange.aStart.Tab(); - ScAttrRectIterator aIter( pDoc, nTab, - aTotalRange.aStart.Col(), aTotalRange.aStart.Row(), - aTotalRange.aEnd.Col(), aTotalRange.aEnd.Row() ); - SCCOL nCol1, nCol2; - SCROW nRow1, nRow2; - - // Collect the ranges for each format in a hash map, to avoid nested loops - - ScUniqueFormatsHashMap aHashMap; - while (aIter.GetNext( nCol1, nCol2, nRow1, nRow2 ) ) - { - ScRange aRange( nCol1, nRow1, nTab, nCol2, nRow2, nTab ); - const ScPatternAttr* pPattern = pDoc->GetPattern(nCol1, nRow1, nTab); - aHashMap[pPattern].Join( aRange ); - } - - // Fill the vector aRangeLists with the range lists from the hash map - - aRangeLists.reserve( aHashMap.size() ); - ScUniqueFormatsHashMap::iterator aMapIter( aHashMap.begin() ); - ScUniqueFormatsHashMap::iterator aMapEnd( aHashMap.end() ); - while ( aMapIter != aMapEnd ) - { - ScUniqueFormatsEntry& rEntry = aMapIter->second; - const ScRangeList& rRanges = rEntry.GetRanges(); - aRangeLists.push_back( rRanges ); // copy ScRangeList - rEntry.Clear(); // free memory, don't hold both copies of all ranges - ++aMapIter; - } - - // Sort the vector by first range's start position, to avoid random shuffling - // due to using the ScPatterAttr pointers - - ScUniqueFormatsOrder aComp; - ::std::sort( aRangeLists.begin(), aRangeLists.end(), aComp ); - } -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScUniqueCellFormatsObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - return aRangeLists.size(); -} - -uno::Any SAL_CALL ScUniqueCellFormatsObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if(static_cast<sal_uInt32>(nIndex) < aRangeLists.size()) - return uno::makeAny(uno::Reference<sheet::XSheetCellRangeContainer>(new ScCellRangesObj(pDocShell, aRangeLists[nIndex]))); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScUniqueCellFormatsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<sheet::XSheetCellRangeContainer>*)0); -} - -sal_Bool SAL_CALL ScUniqueCellFormatsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( aRangeLists.size() != 0 ); -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScUniqueCellFormatsObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return new ScUniqueCellFormatsEnumeration( pDocShell, aRangeLists ); - return NULL; -} - -//------------------------------------------------------------------------ - -ScUniqueCellFormatsEnumeration::ScUniqueCellFormatsEnumeration(ScDocShell* pDocSh, const ScMyRangeLists& rRangeLists) : - aRangeLists(rRangeLists), - pDocShell( pDocSh ), - nCurrentPosition(0) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScUniqueCellFormatsEnumeration::~ScUniqueCellFormatsEnumeration() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScUniqueCellFormatsEnumeration::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - //! und nun ??? - } - else if ( rHint.ISA( SfxSimpleHint ) ) - { - sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); - if ( nId == SFX_HINT_DYING ) - pDocShell = NULL; // ungueltig geworden - } -} - -// XEnumeration - -sal_Bool SAL_CALL ScUniqueCellFormatsEnumeration::hasMoreElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return static_cast<sal_uInt32>(nCurrentPosition) < aRangeLists.size(); -} - -uno::Any SAL_CALL ScUniqueCellFormatsEnumeration::nextElement() throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( !hasMoreElements() || !pDocShell ) - throw container::NoSuchElementException(); // no more elements - - // Interface-Typ muss zu ScCellFormatsObj::getElementType passen - - return uno::makeAny(uno::Reference<sheet::XSheetCellRangeContainer>(new ScCellRangesObj(pDocShell, aRangeLists[nCurrentPosition++]))); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/cellvaluebinding.cxx b/sc/source/ui/unoobj/cellvaluebinding.cxx deleted file mode 100644 index 9e6305258..000000000 --- a/sc/source/ui/unoobj/cellvaluebinding.cxx +++ /dev/null @@ -1,665 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" -#include "cellvaluebinding.hxx" -#include <tools/debug.hxx> -#include <rtl/math.hxx> -#include <com/sun/star/table/XCellRange.hpp> -#include <com/sun/star/sheet/XCellAddressable.hpp> -#include <com/sun/star/sheet/XCellRangeData.hpp> -#include <com/sun/star/container/XIndexAccess.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/beans/NamedValue.hpp> -#include <com/sun/star/util/XNumberFormatsSupplier.hpp> -#include <com/sun/star/util/XNumberFormatTypes.hpp> -#include <com/sun/star/util/NumberFormat.hpp> - -//......................................................................... -namespace calc -{ -//......................................................................... - -#define PROP_HANDLE_BOUND_CELL 1 - - using namespace ::com::sun::star::uno; - using namespace ::com::sun::star::lang; - using namespace ::com::sun::star::table; - using namespace ::com::sun::star::text; - using namespace ::com::sun::star::sheet; - using namespace ::com::sun::star::container; - using namespace ::com::sun::star::beans; - using namespace ::com::sun::star::util; - using namespace ::com::sun::star::form::binding; - - //===================================================================== - //= OCellValueBinding - //===================================================================== - DBG_NAME( OCellValueBinding ) - //--------------------------------------------------------------------- -#ifdef DBG_UTIL - const char* OCellValueBinding::checkConsistency_static( const void* _pThis ) - { - return static_cast< const OCellValueBinding* >( _pThis )->checkConsistency( ); - } - - const char* OCellValueBinding::checkConsistency( ) const - { - const char* pAssertion = NULL; - if ( m_xCellText.is() && !m_xCell.is() ) - // there are places (e.g. getSupportedTypes) which rely on the fact - // that m_xCellText.is() implies m_xCell.is() - pAssertion = "cell references inconsistent!"; - - // TODO: place any additional checks here to ensure consistency of this instance - return pAssertion; - } -#endif - - //--------------------------------------------------------------------- - OCellValueBinding::OCellValueBinding( const Reference< XSpreadsheetDocument >& _rxDocument, sal_Bool _bListPos ) - :OCellValueBinding_Base( m_aMutex ) - ,OCellValueBinding_PBase( OCellValueBinding_Base::rBHelper ) - ,m_xDocument( _rxDocument ) - ,m_aModifyListeners( m_aMutex ) - ,m_bInitialized( false ) - ,m_bListPos( _bListPos ) - { - DBG_CTOR( OCellValueBinding, checkConsistency_static ); - - // register our property at the base class - CellAddress aInitialPropValue; - registerPropertyNoMember( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "BoundCell" )), - PROP_HANDLE_BOUND_CELL, - PropertyAttribute::BOUND | PropertyAttribute::READONLY, - ::getCppuType( &aInitialPropValue ), - &aInitialPropValue - ); - - // TODO: implement a ReadOnly property as required by the service, - // which probably maps to the cell being locked - } - - //--------------------------------------------------------------------- - OCellValueBinding::~OCellValueBinding( ) - { - if ( !OCellValueBinding_Base::rBHelper.bDisposed ) - { - acquire(); // prevent duplicate dtor - dispose(); - } - - DBG_DTOR( OCellValueBinding, checkConsistency_static ); - } - - //-------------------------------------------------------------------- - IMPLEMENT_FORWARD_XINTERFACE2( OCellValueBinding, OCellValueBinding_Base, OCellValueBinding_PBase ) - - //-------------------------------------------------------------------- - IMPLEMENT_FORWARD_XTYPEPROVIDER2( OCellValueBinding, OCellValueBinding_Base, OCellValueBinding_PBase ) - - //-------------------------------------------------------------------- - void SAL_CALL OCellValueBinding::disposing() - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - - Reference<XModifyBroadcaster> xBroadcaster( m_xCell, UNO_QUERY ); - if ( xBroadcaster.is() ) - { - xBroadcaster->removeModifyListener( this ); - } - - WeakAggComponentImplHelperBase::disposing(); - - // TODO: clean up here whatever you need to clean up (e.g. deregister as XEventListener - // for the cell) - } - - //-------------------------------------------------------------------- - Reference< XPropertySetInfo > SAL_CALL OCellValueBinding::getPropertySetInfo( ) throw(RuntimeException) - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - return createPropertySetInfo( getInfoHelper() ) ; - } - - //-------------------------------------------------------------------- - ::cppu::IPropertyArrayHelper& SAL_CALL OCellValueBinding::getInfoHelper() - { - return *OCellValueBinding_PABase::getArrayHelper(); - } - - //-------------------------------------------------------------------- - ::cppu::IPropertyArrayHelper* OCellValueBinding::createArrayHelper( ) const - { - Sequence< Property > aProps; - describeProperties( aProps ); - return new ::cppu::OPropertyArrayHelper(aProps); - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellValueBinding::getFastPropertyValue( Any& _rValue, sal_Int32 _nHandle ) const - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - OSL_ENSURE( _nHandle == PROP_HANDLE_BOUND_CELL, "OCellValueBinding::getFastPropertyValue: invalid handle!" ); - // we only have this one property .... - (void)_nHandle; // avoid warning in product version - - _rValue.clear(); - Reference< XCellAddressable > xCellAddress( m_xCell, UNO_QUERY ); - if ( xCellAddress.is() ) - _rValue <<= xCellAddress->getCellAddress( ); - } - - //-------------------------------------------------------------------- - Sequence< Type > SAL_CALL OCellValueBinding::getSupportedValueTypes( ) throw (RuntimeException) - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - checkDisposed( ); - checkInitialized( ); - - sal_Int32 nCount = m_xCellText.is() ? 3 : m_xCell.is() ? 1 : 0; - if ( m_bListPos ) - ++nCount; - - Sequence< Type > aTypes( nCount ); - if ( m_xCell.is() ) - { - // an XCell can be used to set/get "double" values - aTypes[0] = ::getCppuType( static_cast< double* >( NULL ) ); - if ( m_xCellText.is() ) - { - // an XTextRange can be used to set/get "string" values - aTypes[1] = ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) ); - // and additionally, we use it to handle booleans - aTypes[2] = ::getCppuType( static_cast< sal_Bool* >( NULL ) ); - } - - // add sal_Int32 only if constructed as ListPositionCellBinding - if ( m_bListPos ) - aTypes[nCount-1] = ::getCppuType( static_cast< sal_Int32* >( NULL ) ); - } - - return aTypes; - } - - //-------------------------------------------------------------------- - sal_Bool SAL_CALL OCellValueBinding::supportsType( const Type& aType ) throw (RuntimeException) - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - checkDisposed( ); - checkInitialized( ); - - // look up in our sequence - Sequence< Type > aSupportedTypes( getSupportedValueTypes() ); - const Type* pTypes = aSupportedTypes.getConstArray(); - const Type* pTypesEnd = aSupportedTypes.getConstArray() + aSupportedTypes.getLength(); - while ( pTypes != pTypesEnd ) - if ( aType.equals( *pTypes++ ) ) - return sal_True; - - return false; - } - - //-------------------------------------------------------------------- - Any SAL_CALL OCellValueBinding::getValue( const Type& aType ) throw (IncompatibleTypesException, RuntimeException) - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - checkDisposed( ); - checkInitialized( ); - checkValueType( aType ); - - Any aReturn; - switch ( aType.getTypeClass() ) - { - case TypeClass_STRING: - OSL_ENSURE( m_xCellText.is(), "OCellValueBinding::getValue: don't have a text!" ); - if ( m_xCellText.is() ) - aReturn <<= m_xCellText->getString(); - else - aReturn <<= ::rtl::OUString(); - break; - - case TypeClass_BOOLEAN: - OSL_ENSURE( m_xCell.is(), "OCellValueBinding::getValue: don't have a double value supplier!" ); - if ( m_xCell.is() ) - { - // check if the cell has a numeric value (this might go into a helper function): - - sal_Bool bHasValue = false; - CellContentType eCellType = m_xCell->getType(); - if ( eCellType == CellContentType_VALUE ) - bHasValue = sal_True; - else if ( eCellType == CellContentType_FORMULA ) - { - // check if the formula result is a value - if ( m_xCell->getError() == 0 ) - { - Reference<XPropertySet> xProp( m_xCell, UNO_QUERY ); - if ( xProp.is() ) - { - CellContentType eResultType; - if ( (xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "FormulaResultType" )) ) >>= eResultType) && eResultType == CellContentType_VALUE ) - bHasValue = sal_True; - } - } - } - - if ( bHasValue ) - { - // 0 is "unchecked", any other value is "checked", regardless of number format - double nCellValue = m_xCell->getValue(); - sal_Bool bBoolValue = ( nCellValue != 0.0 ); - aReturn <<= bBoolValue; - } - // empty cells, text cells and text or error formula results: leave return value empty - } - break; - - case TypeClass_DOUBLE: - OSL_ENSURE( m_xCell.is(), "OCellValueBinding::getValue: don't have a double value supplier!" ); - if ( m_xCell.is() ) - aReturn <<= m_xCell->getValue(); - else - aReturn <<= (double)0; - break; - - case TypeClass_LONG: - OSL_ENSURE( m_xCell.is(), "OCellValueBinding::getValue: don't have a double value supplier!" ); - if ( m_xCell.is() ) - { - // The list position value in the cell is 1-based. - // We subtract 1 from any cell value (no special handling for 0 or negative values). - - sal_Int32 nValue = (sal_Int32) rtl::math::approxFloor( m_xCell->getValue() ); - --nValue; - - aReturn <<= nValue; - } - else - aReturn <<= (sal_Int32)0; - break; - - default: - OSL_FAIL( "OCellValueBinding::getValue: unreachable code!" ); - // a type other than double and string should never have survived the checkValueType - // above - } - return aReturn; - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellValueBinding::setValue( const Any& aValue ) throw (IncompatibleTypesException, NoSupportException, RuntimeException) - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - checkDisposed( ); - checkInitialized( ); - if ( aValue.hasValue() ) - checkValueType( aValue.getValueType() ); - - switch ( aValue.getValueType().getTypeClass() ) - { - case TypeClass_STRING: - { - OSL_ENSURE( m_xCellText.is(), "OCellValueBinding::setValue: don't have a text!" ); - - ::rtl::OUString sText; - aValue >>= sText; - if ( m_xCellText.is() ) - m_xCellText->setString( sText ); - } - break; - - case TypeClass_BOOLEAN: - { - OSL_ENSURE( m_xCell.is(), "OCellValueBinding::setValue: don't have a double value supplier!" ); - - // boolean is stored as values 0 or 1 - // TODO: set the number format to boolean if no format is set? - - sal_Bool bValue( false ); - aValue >>= bValue; - double nCellValue = bValue ? 1.0 : 0.0; - - if ( m_xCell.is() ) - m_xCell->setValue( nCellValue ); - - setBooleanFormat(); - } - break; - - case TypeClass_DOUBLE: - { - OSL_ENSURE( m_xCell.is(), "OCellValueBinding::setValue: don't have a double value supplier!" ); - - double nValue = 0; - aValue >>= nValue; - if ( m_xCell.is() ) - m_xCell->setValue( nValue ); - } - break; - - case TypeClass_LONG: - { - OSL_ENSURE( m_xCell.is(), "OCellValueBinding::setValue: don't have a double value supplier!" ); - - sal_Int32 nValue = 0; - aValue >>= nValue; // list index from control layer (0-based) - ++nValue; // the list position value in the cell is 1-based - if ( m_xCell.is() ) - m_xCell->setValue( nValue ); - } - break; - - case TypeClass_VOID: - { - // #N/A error value can only be set using XCellRangeData - - Reference<XCellRangeData> xData( m_xCell, UNO_QUERY ); - OSL_ENSURE( xData.is(), "OCellValueBinding::setValue: don't have XCellRangeData!" ); - if ( xData.is() ) - { - Sequence<Any> aInner(1); // one empty element - Sequence< Sequence<Any> > aOuter( &aInner, 1 ); // one row - xData->setDataArray( aOuter ); - } - } - break; - - default: - OSL_FAIL( "OCellValueBinding::setValue: unreachable code!" ); - // a type other than double and string should never have survived the checkValueType - // above - } - } - //-------------------------------------------------------------------- - void OCellValueBinding::setBooleanFormat() - { - // set boolean number format if not already set - - ::rtl::OUString sPropName( RTL_CONSTASCII_USTRINGPARAM( "NumberFormat" ) ); - Reference<XPropertySet> xCellProp( m_xCell, UNO_QUERY ); - Reference<XNumberFormatsSupplier> xSupplier( m_xDocument, UNO_QUERY ); - if ( xSupplier.is() && xCellProp.is() ) - { - Reference<XNumberFormats> xFormats(xSupplier->getNumberFormats()); - Reference<XNumberFormatTypes> xTypes( xFormats, UNO_QUERY ); - if ( xTypes.is() ) - { - Locale aLocale; - sal_Bool bWasBoolean = false; - - sal_Int32 nOldIndex = ::comphelper::getINT32( xCellProp->getPropertyValue( sPropName ) ); - Reference<XPropertySet> xOldFormat; - try - { - xOldFormat.set(xFormats->getByKey( nOldIndex )); - } - catch ( Exception& ) - { - // non-existing format - can happen, use defaults - } - if ( xOldFormat.is() ) - { - // use the locale of the existing format - xOldFormat->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "Locale" )) ) >>= aLocale; - - sal_Int16 nOldType = ::comphelper::getINT16( - xOldFormat->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "Type" )) ) ); - if ( nOldType & NumberFormat::LOGICAL ) - bWasBoolean = sal_True; - } - - if ( !bWasBoolean ) - { - sal_Int32 nNewIndex = xTypes->getStandardFormat( NumberFormat::LOGICAL, aLocale ); - xCellProp->setPropertyValue( sPropName, makeAny( nNewIndex ) ); - } - } - } - } - - //-------------------------------------------------------------------- - void OCellValueBinding::checkDisposed( ) const SAL_THROW( ( DisposedException ) ) - { - if ( OCellValueBinding_Base::rBHelper.bInDispose || OCellValueBinding_Base::rBHelper.bDisposed ) - throw DisposedException(); - // TODO: is it worth having an error message here? - } - - //-------------------------------------------------------------------- - void OCellValueBinding::checkInitialized() SAL_THROW( ( RuntimeException ) ) - { - if ( !m_bInitialized ) - throw RuntimeException(); - // TODO: error message - } - - //-------------------------------------------------------------------- - void OCellValueBinding::checkValueType( const Type& _rType ) const SAL_THROW( ( IncompatibleTypesException ) ) - { - OCellValueBinding* pNonConstThis = const_cast< OCellValueBinding* >( this ); - if ( !pNonConstThis->supportsType( _rType ) ) - { - ::rtl::OUString sMessage( RTL_CONSTASCII_USTRINGPARAM( "The given type (" ) ); - sMessage += _rType.getTypeName(); - sMessage += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ") is not supported by this binding." ) ); - // TODO: localize this error message - - throw IncompatibleTypesException( sMessage, *pNonConstThis ); - // TODO: alternatively use a type converter service for this? - } - } - - //-------------------------------------------------------------------- - ::rtl::OUString SAL_CALL OCellValueBinding::getImplementationName( ) throw (RuntimeException) - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - - return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.sheet.OCellValueBinding" ) ); - } - - //-------------------------------------------------------------------- - sal_Bool SAL_CALL OCellValueBinding::supportsService( const ::rtl::OUString& _rServiceName ) throw (RuntimeException) - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - - Sequence< ::rtl::OUString > aSupportedServices( getSupportedServiceNames() ); - const ::rtl::OUString* pLookup = aSupportedServices.getConstArray(); - const ::rtl::OUString* pLookupEnd = aSupportedServices.getConstArray() + aSupportedServices.getLength(); - while ( pLookup != pLookupEnd ) - if ( *pLookup++ == _rServiceName ) - return sal_True; - - return false; - } - - //-------------------------------------------------------------------- - Sequence< ::rtl::OUString > SAL_CALL OCellValueBinding::getSupportedServiceNames( ) throw (RuntimeException) - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - - Sequence< ::rtl::OUString > aServices( m_bListPos ? 3 : 2 ); - aServices[ 0 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.table.CellValueBinding" ) ); - aServices[ 1 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.form.binding.ValueBinding" ) ); - if ( m_bListPos ) - aServices[ 2 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.table.ListPositionCellBinding" ) ); - return aServices; - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellValueBinding::addModifyListener( const Reference< XModifyListener >& _rxListener ) throw (RuntimeException) - { - if ( _rxListener.is() ) - m_aModifyListeners.addInterface( _rxListener ); - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellValueBinding::removeModifyListener( const Reference< XModifyListener >& _rxListener ) throw (RuntimeException) - { - if ( _rxListener.is() ) - m_aModifyListeners.removeInterface( _rxListener ); - } - - //-------------------------------------------------------------------- - void OCellValueBinding::notifyModified() - { - EventObject aEvent; - aEvent.Source.set(*this); - - ::cppu::OInterfaceIteratorHelper aIter( m_aModifyListeners ); - while ( aIter.hasMoreElements() ) - { - try - { - static_cast< XModifyListener* >( aIter.next() )->modified( aEvent ); - } - catch( const RuntimeException& ) - { - // silent this - } - catch( const Exception& ) - { - OSL_FAIL( "OCellValueBinding::notifyModified: caught a (non-runtime) exception!" ); - } - } - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellValueBinding::modified( const EventObject& /* aEvent */ ) throw (RuntimeException) - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - - notifyModified(); - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellValueBinding::disposing( const EventObject& aEvent ) throw (RuntimeException) - { - DBG_CHKTHIS( OCellValueBinding, checkConsistency_static ); - - Reference<XInterface> xCellInt( m_xCell, UNO_QUERY ); - if ( xCellInt == aEvent.Source ) - { - // release references to cell object - m_xCell.clear(); - m_xCellText.clear(); - } - } - - //-------------------------------------------------------------------- - void SAL_CALL OCellValueBinding::initialize( const Sequence< Any >& _rArguments ) throw (Exception, RuntimeException) - { - if ( m_bInitialized ) - throw Exception(); - // TODO: error message - - // get the cell address - CellAddress aAddress; - sal_Bool bFoundAddress = false; - - const Any* pLoop = _rArguments.getConstArray(); - const Any* pLoopEnd = _rArguments.getConstArray() + _rArguments.getLength(); - for ( ; ( pLoop != pLoopEnd ) && !bFoundAddress; ++pLoop ) - { - NamedValue aValue; - if ( *pLoop >>= aValue ) - { - if ( aValue.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "BoundCell" ) ) ) - { - if ( aValue.Value >>= aAddress ) - bFoundAddress = sal_True; - } - } - } - - if ( !bFoundAddress ) - // TODO: error message - throw Exception(); - - // get the cell object - try - { - // first the sheets collection - Reference< XIndexAccess > xSheets; - if ( m_xDocument.is() ) - xSheets.set(xSheets.query( m_xDocument->getSheets( ) )); - OSL_ENSURE( xSheets.is(), "OCellValueBinding::initialize: could not retrieve the sheets!" ); - - if ( xSheets.is() ) - { - // the concrete sheet - Reference< XCellRange > xSheet(xSheets->getByIndex( aAddress.Sheet ), UNO_QUERY); - OSL_ENSURE( xSheet.is(), "OCellValueBinding::initialize: NULL sheet, but no exception!" ); - - // the concrete cell - if ( xSheet.is() ) - { - m_xCell.set(xSheet->getCellByPosition( aAddress.Column, aAddress.Row )); - Reference< XCellAddressable > xAddressAccess( m_xCell, UNO_QUERY ); - OSL_ENSURE( xAddressAccess.is(), "OCellValueBinding::initialize: either NULL cell, or cell without address access!" ); - } - } - } - catch( const Exception& ) - { - OSL_FAIL( "OCellValueBinding::initialize: caught an exception while retrieving the cell object!" ); - } - - if ( !m_xCell.is() ) - throw Exception(); - // TODO error message - - m_xCellText.set(m_xCellText.query( m_xCell )); - - Reference<XModifyBroadcaster> xBroadcaster( m_xCell, UNO_QUERY ); - if ( xBroadcaster.is() ) - { - xBroadcaster->addModifyListener( this ); - } - - // TODO: add as XEventListener to the cell, so we get notified when it dies, - // and can dispose ourself then - - // TODO: somehow add as listener so we get notified when the address of the cell changes - // We need to forward this as change in our BoundCell property to our property change listeners - - // TODO: be an XModifyBroadcaster, so that changes in our cell can be notified - // to the BindableValue which is/will be bound to this instance. - - m_bInitialized = sal_True; - // TODO: place your code here - } - - -//......................................................................... -} // namespace calc -//......................................................................... - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/cellvaluebinding.hxx b/sc/source/ui/unoobj/cellvaluebinding.hxx deleted file mode 100644 index 012c11ece..000000000 --- a/sc/source/ui/unoobj/cellvaluebinding.hxx +++ /dev/null @@ -1,174 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef SC_CELLVALUEBINDING_HXX -#define SC_CELLVALUEBINDING_HXX - -#include <com/sun/star/form/binding/XValueBinding.hpp> -#include <com/sun/star/util/XModifyBroadcaster.hpp> -#include <cppuhelper/compbase5.hxx> -#include <comphelper/propertycontainer.hxx> -#include <comphelper/uno3.hxx> -#include <comphelper/broadcasthelper.hxx> -#include <comphelper/proparrhlp.hxx> -#include <com/sun/star/table/XCell.hpp> -#include <com/sun/star/table/CellAddress.hpp> -#include <com/sun/star/sheet/XSpreadsheetDocument.hpp> -#include <com/sun/star/text/XTextRange.hpp> -#include <com/sun/star/lang/DisposedException.hpp> -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/lang/XInitialization.hpp> - - -//......................................................................... -namespace calc -{ -//......................................................................... - - //===================================================================== - //= OCellValueBinding - //===================================================================== - class OCellValueBinding; - // the base for our interfaces - typedef ::cppu::WeakAggComponentImplHelper5 < ::com::sun::star::form::binding::XValueBinding - , ::com::sun::star::lang::XServiceInfo - , ::com::sun::star::util::XModifyBroadcaster - , ::com::sun::star::util::XModifyListener - , ::com::sun::star::lang::XInitialization - > OCellValueBinding_Base; - // the base for the property handling - typedef ::comphelper::OPropertyContainer OCellValueBinding_PBase; - // the second base for property handling - typedef ::comphelper::OPropertyArrayUsageHelper< OCellValueBinding > - OCellValueBinding_PABase; - - class OCellValueBinding :public ::comphelper::OBaseMutex - ,public OCellValueBinding_Base // order matters! before OCellValueBinding_PBase, so rBHelper gets initialized - ,public OCellValueBinding_PBase - ,public OCellValueBinding_PABase - { - private: - ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheetDocument > - m_xDocument; /// the document where our cell lives - ::com::sun::star::uno::Reference< ::com::sun::star::table::XCell > - m_xCell; /// the cell we're bound to, for double value access - ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > - m_xCellText; /// the cell we're bound to, for text access - ::cppu::OInterfaceContainerHelper - m_aModifyListeners; /// our modify listeners - sal_Bool m_bInitialized; /// has XInitialization::initialize been called? - sal_Bool m_bListPos; /// constructed as ListPositionCellBinding? - - public: - OCellValueBinding( - const ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheetDocument >& _rxDocument, - sal_Bool _bListPos - ); - - using OCellValueBinding_PBase::getFastPropertyValue; - - protected: - ~OCellValueBinding( ); - - protected: - // XInterface - DECLARE_XINTERFACE() - - // XTypeProvider - DECLARE_XTYPEPROVIDER() - - // XValueBinding - virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getSupportedValueTypes( ) throw (::com::sun::star::uno::RuntimeException); - virtual sal_Bool SAL_CALL supportsType( const ::com::sun::star::uno::Type& aType ) throw (::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Any SAL_CALL getValue( const ::com::sun::star::uno::Type& aType ) throw (::com::sun::star::form::binding::IncompatibleTypesException, ::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL setValue( const ::com::sun::star::uno::Any& aValue ) throw (::com::sun::star::form::binding::IncompatibleTypesException, ::com::sun::star::lang::NoSupportException, ::com::sun::star::uno::RuntimeException); - - // OComponentHelper/XComponent - virtual void SAL_CALL disposing(); - - // XServiceInfo - virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException); - virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException); - virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException); - - // XPropertySet - virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); - - // OPropertySetHelper - virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); - virtual void SAL_CALL getFastPropertyValue( ::com::sun::star::uno::Any& _rValue, sal_Int32 _nHandle ) const; - - // ::comphelper::OPropertyArrayUsageHelper - virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; - - // XModifyBroadcaster - virtual void SAL_CALL addModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL removeModifyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XModifyListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); - - // XModifyListener - virtual void SAL_CALL modified( const ::com::sun::star::lang::EventObject& aEvent ) throw (::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); - - // XInitialization - virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); - - private: - void checkDisposed( ) const - SAL_THROW( ( ::com::sun::star::lang::DisposedException ) ); - void checkValueType( const ::com::sun::star::uno::Type& _rType ) const - SAL_THROW( ( ::com::sun::star::form::binding::IncompatibleTypesException ) ); - void checkInitialized() - SAL_THROW( ( ::com::sun::star::uno::RuntimeException ) ); - - /** notifies our modify listeners - @precond - our mutex is <em>not</em> locked - */ - void notifyModified(); - - void setBooleanFormat(); - - private: - OCellValueBinding(); // never implemented - OCellValueBinding( const OCellValueBinding& ); // never implemented - OCellValueBinding& operator=( const OCellValueBinding& ); // never implemented - -#ifdef DBG_UTIL - private: - static const char* checkConsistency_static( const void* _pThis ); - const char* checkConsistency( ) const; -#endif - }; - -//......................................................................... -} // namespace calc -//......................................................................... - -#endif // SC_CELLVALUEBINDING_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/chart2uno.cxx b/sc/source/ui/unoobj/chart2uno.cxx deleted file mode 100644 index 609c920ec..000000000 --- a/sc/source/ui/unoobj/chart2uno.cxx +++ /dev/null @@ -1,3601 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "chart2uno.hxx" -#include "miscuno.hxx" -#include "document.hxx" -#include "cell.hxx" -#include "chartpos.hxx" -#include "unonames.hxx" -#include "globstr.hrc" -#include "convuno.hxx" -#include "rangeutl.hxx" -#include "hints.hxx" -#include "unoreflist.hxx" -#include "compiler.hxx" -#include "reftokenhelper.hxx" -#include "chartlis.hxx" -#include "stlalgorithm.hxx" - -#include <sfx2/objsh.hxx> -#include <tools/table.hxx> -#include <vcl/svapp.hxx> - -#include <com/sun/star/beans/UnknownPropertyException.hpp> -#include <com/sun/star/sheet/XSpreadsheetDocument.hpp> -#include <com/sun/star/table/XCellRange.hpp> -#include <com/sun/star/table/CellAddress.hpp> -#include <com/sun/star/text/XText.hpp> -#include <comphelper/extract.hxx> -#include <comphelper/processfactory.hxx> - -#include <vector> -#include <list> -#include <rtl/math.hxx> - -SC_SIMPLE_SERVICE_INFO( ScChart2DataProvider, "ScChart2DataProvider", - "com.sun.star.chart2.data.DataProvider") -SC_SIMPLE_SERVICE_INFO( ScChart2DataSource, "ScChart2DataSource", - "com.sun.star.chart2.data.DataSource") -SC_SIMPLE_SERVICE_INFO( ScChart2DataSequence, "ScChart2DataSequence", - "com.sun.star.chart2.data.DataSequence") -#if USE_CHART2_EMPTYDATASEQUENCE -SC_SIMPLE_SERVICE_INFO( ScChart2EmptyDataSequence, "ScChart2EmptyDataSequence", - "com.sun.star.chart2.data.DataSequence") -#endif - -using namespace ::com::sun::star; -using namespace ::formula; -using ::rtl::OUString; -using ::rtl::OUStringBuffer; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::Reference; -using ::std::auto_ptr; -using ::std::vector; -using ::std::list; -using ::std::distance; -using ::std::unary_function; -using ::boost::shared_ptr; - -namespace -{ -const SfxItemPropertyMapEntry* lcl_GetDataProviderPropertyMap() -{ - static SfxItemPropertyMapEntry aDataProviderPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_INCLUDEHIDDENCELLS), 0, &getBooleanCppuType(), 0, 0 }, - {0,0,0,0,0,0} - }; - return aDataProviderPropertyMap_Impl; -} - -const SfxItemPropertyMapEntry* lcl_GetDataSequencePropertyMap() -{ - static SfxItemPropertyMapEntry aDataSequencePropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_HIDDENVALUES), 0, &getCppuType((uno::Sequence<sal_Int32>*)0 ), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ROLE), 0, &getCppuType((::com::sun::star::chart2::data::DataSequenceRole*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_INCLUDEHIDDENCELLS), 0, &getBooleanCppuType(), 0, 0 }, - {0,0,0,0,0,0} - }; - return aDataSequencePropertyMap_Impl; -} - -template< typename T > -::com::sun::star::uno::Sequence< T > lcl_VectorToSequence( - const ::std::vector< T > & rCont ) -{ - ::com::sun::star::uno::Sequence< T > aResult( rCont.size()); - ::std::copy( rCont.begin(), rCont.end(), aResult.getArray()); - return aResult; -} - -struct lcl_appendTableNumber : public ::std::unary_function< SCTAB, void > -{ - lcl_appendTableNumber( ::rtl::OUStringBuffer & rBuffer ) : - m_rBuffer( rBuffer ) - {} - void operator() ( SCTAB nTab ) - { - // there is no append with SCTAB or sal_Int16 - m_rBuffer.append( static_cast< sal_Int32 >( nTab )); - m_rBuffer.append( sal_Unicode( ' ' )); - } -private: - ::rtl::OUStringBuffer & m_rBuffer; -}; - -::rtl::OUString lcl_createTableNumberList( const ::std::list< SCTAB > & rTableList ) -{ - ::rtl::OUStringBuffer aBuffer; - ::std::for_each( rTableList.begin(), rTableList.end(), lcl_appendTableNumber( aBuffer )); - // remove last trailing ' ' - if( aBuffer.getLength() > 0 ) - aBuffer.setLength( aBuffer.getLength() - 1 ); - return aBuffer.makeStringAndClear(); -} - -uno::Reference< frame::XModel > lcl_GetXModel( ScDocument * pDoc ) -{ - uno::Reference< frame::XModel > xModel; - SfxObjectShell * pObjSh( pDoc ? pDoc->GetDocumentShell() : 0 ); - if( pObjSh ) - xModel.set( pObjSh->GetModel()); - return xModel; -} - -uno::Reference< sheet::XSpreadsheetDocument > lcl_GetSpreadSheetDocument( ScDocument * pDoc ) -{ - return uno::Reference< sheet::XSpreadsheetDocument >( lcl_GetXModel( pDoc ), uno::UNO_QUERY ); -} - -struct TokenTable -{ - SCROW mnRowCount; - SCCOL mnColCount; - vector<FormulaToken*> maTokens; - - void init( SCCOL nColCount, SCROW nRowCount ) - { - mnColCount = nColCount; - mnRowCount = nRowCount; - maTokens.reserve(mnColCount*mnRowCount); - } - void clear() - { - ::std::for_each(maTokens.begin(), maTokens.end(), ScDeleteObjectByPtr<FormulaToken>()); - } - - void push_back( FormulaToken* pToken ) - { - maTokens.push_back( pToken ); - OSL_ENSURE( maTokens.size()<= static_cast<sal_uInt32>( mnColCount*mnRowCount ), "too much tokens" ); - } - - sal_uInt32 getIndex(SCCOL nCol, SCROW nRow) const - { - OSL_ENSURE( nCol<mnColCount, "wrong column index" ); - OSL_ENSURE( nRow<mnRowCount, "wrong row index" ); - sal_uInt32 nRet = static_cast<sal_uInt32>(nCol*mnRowCount + nRow); - OSL_ENSURE( maTokens.size()>= static_cast<sal_uInt32>( mnColCount*mnRowCount ), "too few tokens" ); - return nRet; - } - - vector<ScTokenRef>* getColRanges(SCCOL nCol) const; - vector<ScTokenRef>* getRowRanges(SCROW nRow) const; - vector<ScTokenRef>* getAllRanges() const; -}; - -vector<ScTokenRef>* TokenTable::getColRanges(SCCOL nCol) const -{ - if (nCol >= mnColCount) - return NULL; - if( mnRowCount<=0 ) - return NULL; - - auto_ptr< vector<ScTokenRef> > pTokens(new vector<ScTokenRef>); - sal_uInt32 nLast = getIndex(nCol, mnRowCount-1); - for (sal_uInt32 i = getIndex(nCol, 0); i <= nLast; ++i) - { - FormulaToken* p = maTokens[i]; - if (!p) - continue; - - ScTokenRef pCopy(static_cast<ScToken*>(p->Clone())); - ScRefTokenHelper::join(*pTokens, pCopy); - } - return pTokens.release(); -} - -vector<ScTokenRef>* TokenTable::getRowRanges(SCROW nRow) const -{ - if (nRow >= mnRowCount) - return NULL; - if( mnColCount<=0 ) - return NULL; - - auto_ptr< vector<ScTokenRef> > pTokens(new vector<ScTokenRef>); - sal_uInt32 nLast = getIndex(mnColCount-1, nRow); - for (sal_uInt32 i = getIndex(0, nRow); i <= nLast; i += mnRowCount) - { - FormulaToken* p = maTokens[i]; - if (!p) - continue; - - ScTokenRef p2(static_cast<ScToken*>(p->Clone())); - ScRefTokenHelper::join(*pTokens, p2); - } - return pTokens.release(); -} - -vector<ScTokenRef>* TokenTable::getAllRanges() const -{ - auto_ptr< vector<ScTokenRef> > pTokens(new vector<ScTokenRef>); - sal_uInt32 nStop = mnColCount*mnRowCount; - for (sal_uInt32 i = 0; i < nStop; i++) - { - FormulaToken* p = maTokens[i]; - if (!p) - continue; - - ScTokenRef p2(static_cast<ScToken*>(p->Clone())); - ScRefTokenHelper::join(*pTokens, p2); - } - return pTokens.release(); -} - -// ============================================================================ - -class Chart2PositionMap -{ -public: - Chart2PositionMap(SCCOL nColCount, SCROW nRowCount, - bool bFillRowHeader, bool bFillColumnHeader, Table& rCols, - ScDocument* pDoc ); - ~Chart2PositionMap(); - - SCCOL getDataColCount() const { return mnDataColCount; } - SCROW getDataRowCount() const { return mnDataRowCount; } - - vector<ScTokenRef>* getLeftUpperCornerRanges() const; - vector<ScTokenRef>* getAllColHeaderRanges() const; - vector<ScTokenRef>* getAllRowHeaderRanges() const; - - vector<ScTokenRef>* getColHeaderRanges(SCCOL nChartCol) const; - vector<ScTokenRef>* getRowHeaderRanges(SCROW nChartRow) const; - - vector<ScTokenRef>* getDataColRanges(SCCOL nCol) const; - vector<ScTokenRef>* getDataRowRanges(SCROW nRow) const; - -private: - SCCOL mnDataColCount; - SCROW mnDataRowCount; - - TokenTable maLeftUpperCorner; //nHeaderColCount*nHeaderRowCount - TokenTable maColHeaders; //mnDataColCount*nHeaderRowCount - TokenTable maRowHeaders; //nHeaderColCount*mnDataRowCount - TokenTable maData;//mnDataColCount*mnDataRowCount -}; - -Chart2PositionMap::Chart2PositionMap(SCCOL nAllColCount, SCROW nAllRowCount, - bool bFillRowHeader, bool bFillColumnHeader, Table& rCols, ScDocument* pDoc) -{ - // if bFillRowHeader is true, at least the first column serves as a row header. - // If more than one column is pure text all the first pure text columns are used as header. - // Likewise, if bFillColumnHeader is true, at least the first row serves as a column header. - // If more than one row is pure text all the first pure text rows are used as header. - - SCROW nHeaderRowCount = (bFillColumnHeader && nAllColCount && nAllRowCount) ? 1 : 0; - SCCOL nHeaderColCount = (bFillRowHeader && nAllColCount && nAllRowCount) ? 1 : 0; - - if( nHeaderColCount || nHeaderRowCount ) - { - const SCCOL nInitialHeaderColCount = nHeaderColCount; - //check whether there is more than one text column or row that should be added to the headers - SCROW nSmallestValueRowIndex = nAllRowCount; - bool bFoundValues = false; - bool bFoundAnything = false; - Table* pCol = static_cast<Table*>(rCols.First()); - for (SCCOL nCol = 0; !bFoundValues && nCol < nAllColCount; ++nCol) - { - if (pCol && nCol>=nHeaderColCount) - { - ScToken* pToken = static_cast<ScToken*>(pCol->First()); - for (SCROW nRow = 0; !bFoundValues && nRow < nSmallestValueRowIndex; ++nRow) - { - if (pToken && nRow>=nHeaderRowCount) - { - ScRange aRange; - bool bExternal = false; - StackVar eType = pToken->GetType(); - if( eType==svExternal || eType==svExternalSingleRef || eType==svExternalDoubleRef || eType==svExternalName ) - bExternal = true;//lllll todo correct? - ScTokenRef pSharedToken(static_cast<ScToken*>(pToken->Clone())); - ScRefTokenHelper::getRangeFromToken(aRange, pSharedToken, bExternal ); - SCCOL nCol1=0, nCol2=0; - SCROW nRow1=0, nRow2=0; - SCTAB nTab1=0, nTab2=0; - aRange.GetVars( nCol1, nRow1, nTab1, nCol2, nRow2, nTab2 ); - if (pDoc && pDoc->HasValueData( nCol1, nRow1, nTab1 )) - { - bFoundValues = bFoundAnything = true; - nSmallestValueRowIndex = std::min( nSmallestValueRowIndex, nRow ); - } - if( !bFoundAnything ) - { - if (pDoc && pDoc->HasData( nCol1, nRow1, nTab1 ) ) - bFoundAnything = true; - } - } - pToken = static_cast<ScToken*>(pCol->Next()); - } - if(!bFoundValues && nHeaderColCount>0) - nHeaderColCount++; - } - pCol = static_cast<Table*>(rCols.Next()); - } - if( bFoundAnything ) - { - if(nHeaderRowCount>0) - { - if( bFoundValues ) - nHeaderRowCount = nSmallestValueRowIndex; - else if( nAllRowCount>1 ) - nHeaderRowCount = nAllRowCount-1; - } - } - else //if the cells are completely empty, just use single header rows and columns - nHeaderColCount = nInitialHeaderColCount; - } - - mnDataColCount = nAllColCount - nHeaderColCount; - mnDataRowCount = nAllRowCount - nHeaderRowCount; - - maLeftUpperCorner.init(nHeaderColCount,nHeaderRowCount); - maColHeaders.init(mnDataColCount,nHeaderRowCount); - maRowHeaders.init(nHeaderColCount,mnDataRowCount); - maData.init(mnDataColCount,mnDataRowCount); - - Table* pCol = static_cast<Table*>(rCols.First()); - FormulaToken* pToken = static_cast<FormulaToken*>(pCol->First()); - for (SCCOL nCol = 0; nCol < nAllColCount; ++nCol) - { - if (pCol) - { - pToken = static_cast<FormulaToken*>(pCol->First()); - for (SCROW nRow = 0; nRow < nAllRowCount; ++nRow) - { - if( nCol < nHeaderColCount ) - { - if( nRow < nHeaderRowCount ) - maLeftUpperCorner.push_back(pToken); - else - maRowHeaders.push_back(pToken); - } - else if( nRow < nHeaderRowCount ) - maColHeaders.push_back(pToken); - else - maData.push_back(pToken); - - pToken = static_cast<FormulaToken*>(pCol->Next()); - } - } - pCol = static_cast<Table*>(rCols.Next()); - } -} - -Chart2PositionMap::~Chart2PositionMap() -{ - maLeftUpperCorner.clear(); - maColHeaders.clear(); - maRowHeaders.clear(); - maData.clear(); -} - -vector<ScTokenRef>* Chart2PositionMap::getLeftUpperCornerRanges() const -{ - return maLeftUpperCorner.getAllRanges(); -} -vector<ScTokenRef>* Chart2PositionMap::getAllColHeaderRanges() const -{ - return maColHeaders.getAllRanges(); -} -vector<ScTokenRef>* Chart2PositionMap::getAllRowHeaderRanges() const -{ - return maRowHeaders.getAllRanges(); -} -vector<ScTokenRef>* Chart2PositionMap::getColHeaderRanges(SCCOL nCol) const -{ - return maColHeaders.getColRanges( nCol); -} -vector<ScTokenRef>* Chart2PositionMap::getRowHeaderRanges(SCROW nRow) const -{ - return maRowHeaders.getRowRanges( nRow); -} - -vector<ScTokenRef>* Chart2PositionMap::getDataColRanges(SCCOL nCol) const -{ - return maData.getColRanges( nCol); -} - -vector<ScTokenRef>* Chart2PositionMap::getDataRowRanges(SCROW nRow) const -{ - return maData.getRowRanges( nRow); -} - -// ---------------------------------------------------------------------------- - -/** - * Designed to be a drop-in replacement for ScChartPositioner, in order to - * handle external references. - */ -class Chart2Positioner -{ - enum GlueType - { - GLUETYPE_NA, - GLUETYPE_NONE, - GLUETYPE_COLS, - GLUETYPE_ROWS, - GLUETYPE_BOTH - }; - -public: - Chart2Positioner(ScDocument* pDoc, const vector<ScTokenRef>& rRefTokens) : - mpRefTokens(new vector<ScTokenRef>(rRefTokens)), - mpPositionMap(NULL), - meGlue(GLUETYPE_NA), - mpDoc(pDoc), - mbColHeaders(false), - mbRowHeaders(false), - mbDummyUpperLeft(false) - { - } - - ~Chart2Positioner() - { - } - - void setHeaders(bool bColHeaders, bool bRowHeaders) - { - mbColHeaders = bColHeaders; - mbRowHeaders = bRowHeaders; - } - - bool hasColHeaders() const { return mbColHeaders; } - bool hasRowHeaders() const { return mbRowHeaders; } - - Chart2PositionMap* getPositionMap() - { - createPositionMap(); - return mpPositionMap.get(); - } - -private: - Chart2Positioner(); // disabled - - void invalidateGlue(); - void glueState(); - void createPositionMap(); - -private: - shared_ptr< vector<ScTokenRef> > mpRefTokens; - auto_ptr<Chart2PositionMap> mpPositionMap; - GlueType meGlue; - SCCOL mnStartCol; - SCROW mnStartRow; - ScDocument* mpDoc; - bool mbColHeaders:1; - bool mbRowHeaders:1; - bool mbDummyUpperLeft:1; -}; - -void Chart2Positioner::invalidateGlue() -{ - meGlue = GLUETYPE_NA; - mpPositionMap.reset(NULL); -} - -void Chart2Positioner::glueState() -{ - if (meGlue != GLUETYPE_NA) - return; - - mbDummyUpperLeft = false; - if (mpRefTokens->size() <= 1) - { - const ScTokenRef& p = mpRefTokens->front(); - ScComplexRefData aData; - if (ScRefTokenHelper::getDoubleRefDataFromToken(aData, p)) - { - if (aData.Ref1.nTab == aData.Ref2.nTab) - meGlue = GLUETYPE_NONE; - else - meGlue = GLUETYPE_COLS; - mnStartCol = aData.Ref1.nCol; - mnStartRow = aData.Ref1.nRow; - } - else - { - invalidateGlue(); - mnStartCol = 0; - mnStartRow = 0; - } - return; - } - - ScComplexRefData aData; - ScRefTokenHelper::getDoubleRefDataFromToken(aData, mpRefTokens->front()); - mnStartCol = aData.Ref1.nCol; - mnStartRow = aData.Ref1.nRow; - - SCCOL nMaxCols = 0, nEndCol = 0; - SCROW nMaxRows = 0, nEndRow = 0; - for (vector<ScTokenRef>::const_iterator itr = mpRefTokens->begin(), itrEnd = mpRefTokens->end() - ; itr != itrEnd; ++itr) - { - ScRefTokenHelper::getDoubleRefDataFromToken(aData, *itr); - SCCOLROW n1 = aData.Ref1.nCol; - SCCOLROW n2 = aData.Ref2.nCol; - if (n1 > MAXCOL) - n1 = MAXCOL; - if (n2 > MAXCOL) - n2 = MAXCOL; - SCCOLROW nTmp = n2 - n1 + 1; - if (n1 < mnStartCol) - mnStartCol = static_cast<SCCOL>(n1); - if (n2 > nEndCol) - nEndCol = static_cast<SCCOL>(n2); - if (nTmp > nMaxCols) - nMaxCols = static_cast<SCCOL>(nTmp); - - n1 = aData.Ref1.nRow; - n2 = aData.Ref2.nRow; - if (n1 > MAXROW) - n1 = MAXROW; - if (n2 > MAXROW) - n2 = MAXROW; - nTmp = n2 - n1 + 1; - - if (n1 < mnStartRow) - mnStartRow = static_cast<SCROW>(n1); - if (n2 > nEndRow) - nEndRow = static_cast<SCROW>(n2); - if (nTmp > nMaxRows) - nMaxRows = static_cast<SCROW>(nTmp); - } - - // total column size ? - SCCOL nC = nEndCol - mnStartCol + 1; - if (nC == 1) - { - meGlue = GLUETYPE_ROWS; - return; - } - // total row size ? - SCROW nR = nEndRow - mnStartRow + 1; - if (nR == 1) - { - meGlue = GLUETYPE_COLS; - return; - } - // #i103540# prevent invalid vector size - if ((nC <= 0) || (nR <= 0)) - { - invalidateGlue(); - mnStartCol = 0; - mnStartRow = 0; - return; - } - sal_uInt32 nCR = static_cast<sal_uInt32>(nC*nR); - - const sal_uInt8 nHole = 0; - const sal_uInt8 nOccu = 1; - const sal_uInt8 nFree = 2; - const sal_uInt8 nGlue = 3; - - vector<sal_uInt8> aCellStates(nCR); - for (vector<ScTokenRef>::const_iterator itr = mpRefTokens->begin(), itrEnd = mpRefTokens->end(); - itr != itrEnd; ++itr) - { - ScRefTokenHelper::getDoubleRefDataFromToken(aData, *itr); - SCCOL nCol1 = static_cast<SCCOL>(aData.Ref1.nCol) - mnStartCol; - SCCOL nCol2 = static_cast<SCCOL>(aData.Ref2.nCol) - mnStartCol; - SCROW nRow1 = static_cast<SCROW>(aData.Ref1.nRow) - mnStartRow; - SCROW nRow2 = static_cast<SCROW>(aData.Ref2.nRow) - mnStartRow; - for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol) - for (SCROW nRow = nRow1; nRow <= nRow2; ++nRow) - { - size_t i = nCol*nR + nRow; - aCellStates[i] = nOccu; - } - } - bool bGlue = true; - - size_t i = 0; - bool bGlueCols = false; - for (SCCOL nCol = 0; bGlue && nCol < nC; ++nCol) - { - for (SCROW nRow = 0; bGlue && nRow < nR; ++nRow) - { - i = nCol*nR + nRow; - if (aCellStates[i] == nOccu) - { - if (nRow > 0 && nRow > 0) - bGlue = false; - else - nRow = nR; - } - else - aCellStates[i] = nFree; - } - i = (nCol+1)*nR - 1; // index for the last cell in the column. - if (bGlue && (aCellStates[i] == nFree)) - { - aCellStates[i] = nGlue; - bGlueCols = true; - } - } - - bool bGlueRows = false; - for (SCROW nRow = 0; bGlue && nRow < nR; ++nRow) - { - i = nRow; - for (SCCOL nCol = 0; bGlue && nCol < nC; ++nCol, i += nR) - { - if (aCellStates[i] == nOccu) - { - if (nCol > 0 && nRow > 0) - bGlue = false; - else - nCol = nC; - } - else - aCellStates[i] = nFree; - } - i = (nC-1)*nR + nRow; // index for the row position in the last column. - if (bGlue && aCellStates[i] == nFree) - { - aCellStates[i] = nGlue; - bGlueRows = true; - } - } - - i = 1; - for (sal_uInt32 n = 1; bGlue && n < nCR; ++n, ++i) - if (aCellStates[i] == nHole) - bGlue = false; - - if (bGlue) - { - if (bGlueCols && bGlueRows) - meGlue = GLUETYPE_BOTH; - else if (bGlueRows) - meGlue = GLUETYPE_ROWS; - else - meGlue = GLUETYPE_COLS; - if (aCellStates.front() != nOccu) - mbDummyUpperLeft = true; - } - else - meGlue = GLUETYPE_NONE; -} - -void Chart2Positioner::createPositionMap() -{ - if (meGlue == GLUETYPE_NA && mpPositionMap.get()) - mpPositionMap.reset(NULL); - - if (mpPositionMap.get()) - return; - - glueState(); - - bool bNoGlue = (meGlue == GLUETYPE_NONE); - auto_ptr<Table> pCols(new Table); - auto_ptr<FormulaToken> pNewAddress; - auto_ptr<Table> pNewRowTable(new Table); - Table* pCol = NULL; - SCROW nNoGlueRow = 0; - for (vector<ScTokenRef>::const_iterator itr = mpRefTokens->begin(), itrEnd = mpRefTokens->end(); - itr != itrEnd; ++itr) - { - const ScTokenRef& pToken = *itr; - - bool bExternal = ScRefTokenHelper::isExternalRef(pToken); - sal_uInt16 nFileId = bExternal ? pToken->GetIndex() : 0; - String aTabName = bExternal ? pToken->GetString() : String(); - - ScComplexRefData aData; - ScRefTokenHelper::getDoubleRefDataFromToken(aData, *itr); - const ScSingleRefData& s = aData.Ref1; - const ScSingleRefData& e = aData.Ref2; - SCCOL nCol1 = s.nCol, nCol2 = e.nCol; - SCROW nRow1 = s.nRow, nRow2 = e.nRow; - SCTAB nTab1 = s.nTab, nTab2 = e.nTab; - - for (SCTAB nTab = nTab1; nTab <= nTab2; ++nTab) - { - // What's this for ??? - sal_uInt32 nInsCol = (static_cast<sal_uInt32>(nTab) << 16) | - (bNoGlue ? 0 : static_cast<sal_uInt32>(nCol1)); - for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol, ++nInsCol) - { - if (bNoGlue || meGlue == GLUETYPE_ROWS) - { - pCol = static_cast<Table*>(pCols->Get(nInsCol)); - if (!pCol) - { - pCol = pNewRowTable.get(); - pCols->Insert(nInsCol, pNewRowTable.release()); - pNewRowTable.reset(new Table); - } - } - else - { - if (pCols->Insert(nInsCol, pNewRowTable.get())) - { - pCol = pNewRowTable.release(); - pNewRowTable.reset(new Table); - } - else - pCol = static_cast<Table*>(pCols->Get(nInsCol)); - } - - sal_uInt32 nInsRow = static_cast<sal_uInt32>(bNoGlue ? nNoGlueRow : nRow1); - for (SCROW nRow = nRow1; nRow <= nRow2; ++nRow, ++nInsRow) - { - ScSingleRefData aCellData; - aCellData.InitFlags(); - aCellData.SetFlag3D(true); - aCellData.SetColRel(false); - aCellData.SetRowRel(false); - aCellData.SetTabRel(false); - aCellData.nCol = nCol; - aCellData.nRow = nRow; - aCellData.nTab = nTab; - - if (bExternal) - pNewAddress.reset(new ScExternalSingleRefToken(nFileId, aTabName, aCellData)); - else - pNewAddress.reset(new ScSingleRefToken(aCellData)); - - if (pCol->Insert(nInsRow, pNewAddress.get())) - pNewAddress.release(); // To prevent the instance from being destroyed. - } - } - } - nNoGlueRow += nRow2 - nRow1 + 1; - } - pNewAddress.reset(NULL); - pNewRowTable.reset(NULL); - - bool bFillRowHeader = mbRowHeaders; - bool bFillColumnHeader = mbColHeaders; - - SCSIZE nAllColCount = static_cast<SCSIZE>(pCols->Count()); - SCSIZE nAllRowCount = 0; - pCol = static_cast<Table*>(pCols->First()); - if (pCol) - { - if (mbDummyUpperLeft) - pCol->Insert(0, NULL); // Dummy fuer Beschriftung - nAllRowCount = static_cast<SCSIZE>(pCol->Count()); - } - - if( nAllColCount!=0 && nAllRowCount!=0 ) - { - if (bNoGlue) - { - Table* pFirstCol = static_cast<Table*>(pCols->First()); - sal_uInt32 nCount = pFirstCol->Count(); - pFirstCol->First(); - for (sal_uInt32 n = 0; n < nCount; ++n, pFirstCol->Next()) - { - sal_uInt32 nKey = pFirstCol->GetCurKey(); - pCols->First(); - for (pCol = static_cast<Table*>(pCols->Next()); pCol; pCol = static_cast<Table*>(pCols->Next())) - pCol->Insert(nKey, NULL); - } - } - } - mpPositionMap.reset( - new Chart2PositionMap( - static_cast<SCCOL>(nAllColCount), static_cast<SCROW>(nAllRowCount), - bFillRowHeader, bFillColumnHeader, *pCols, mpDoc)); - - // Destroy all column instances. - for (pCol = static_cast<Table*>(pCols->First()); pCol; pCol = static_cast<Table*>(pCols->Next())) - delete pCol; -} - -// ============================================================================ - -/** - * Function object to create a range string from a token list. - */ -class Tokens2RangeString : public unary_function<ScTokenRef, void> -{ -public: - Tokens2RangeString(ScDocument* pDoc, FormulaGrammar::Grammar eGram, sal_Unicode cRangeSep) : - mpRangeStr(new OUStringBuffer), - mpDoc(pDoc), - meGrammar(eGram), - mcRangeSep(cRangeSep), - mbFirst(true) - { - } - - Tokens2RangeString(const Tokens2RangeString& r) : - mpRangeStr(r.mpRangeStr), - mpDoc(r.mpDoc), - meGrammar(r.meGrammar), - mcRangeSep(r.mcRangeSep), - mbFirst(r.mbFirst) - { - } - - void operator() (const ScTokenRef& rToken) - { - ScCompiler aCompiler(mpDoc, ScAddress(0,0,0)); - aCompiler.SetGrammar(meGrammar); - String aStr; - aCompiler.CreateStringFromToken(aStr, rToken.get()); - if (mbFirst) - mbFirst = false; - else - mpRangeStr->append(mcRangeSep); - mpRangeStr->append(aStr); - } - - void getString(OUString& rStr) - { - rStr = mpRangeStr->makeStringAndClear(); - } - -private: - Tokens2RangeString(); // disabled - -private: - shared_ptr<OUStringBuffer> mpRangeStr; - ScDocument* mpDoc; - FormulaGrammar::Grammar meGrammar; - sal_Unicode mcRangeSep; - bool mbFirst; -}; - -/** - * Function object to convert a list of tokens into a string form suitable - * for ODF export. In ODF, a range is expressed as - * - * (start cell address):(end cell address) - * - * and each address doesn't include any '$' symbols. - */ -class Tokens2RangeStringXML : public unary_function<ScTokenRef, void> -{ -public: - Tokens2RangeStringXML(ScDocument* pDoc) : - mpRangeStr(new OUStringBuffer), - mpDoc(pDoc), - mcRangeSep(' '), - mcAddrSep(':'), - mbFirst(true) - { - } - - Tokens2RangeStringXML(const Tokens2RangeStringXML& r) : - mpRangeStr(r.mpRangeStr), - mpDoc(r.mpDoc), - mcRangeSep(r.mcRangeSep), - mcAddrSep(r.mcAddrSep), - mbFirst(r.mbFirst) - { - } - - void operator() (const ScTokenRef& rToken) - { - if (mbFirst) - mbFirst = false; - else - mpRangeStr->append(mcRangeSep); - - ScTokenRef aStart, aEnd; - splitRangeToken(rToken, aStart, aEnd); - ScCompiler aCompiler(mpDoc, ScAddress(0,0,0)); - aCompiler.SetGrammar(FormulaGrammar::GRAM_ENGLISH); - { - String aStr; - aCompiler.CreateStringFromToken(aStr, aStart.get()); - mpRangeStr->append(aStr); - } - mpRangeStr->append(mcAddrSep); - { - String aStr; - aCompiler.CreateStringFromToken(aStr, aEnd.get()); - mpRangeStr->append(aStr); - } - } - - void getString(OUString& rStr) - { - rStr = mpRangeStr->makeStringAndClear(); - } - -private: - Tokens2RangeStringXML(); // disabled - - void splitRangeToken(const ScTokenRef& pToken, ScTokenRef& rStart, ScTokenRef& rEnd) const - { - ScComplexRefData aData; - ScRefTokenHelper::getDoubleRefDataFromToken(aData, pToken); - bool bExternal = ScRefTokenHelper::isExternalRef(pToken); - sal_uInt16 nFileId = bExternal ? pToken->GetIndex() : 0; - String aTabName = bExternal ? pToken->GetString() : String(); - - // In saving to XML, we don't prepend address with '$'. - setRelative(aData.Ref1); - setRelative(aData.Ref2); - - // In XML, the end range must explicitly specify sheet name. - aData.Ref2.SetFlag3D(true); - - if (bExternal) - rStart.reset(new ScExternalSingleRefToken(nFileId, aTabName, aData.Ref1)); - else - rStart.reset(new ScSingleRefToken(aData.Ref1)); - - if (bExternal) - rEnd.reset(new ScExternalSingleRefToken(nFileId, aTabName, aData.Ref2)); - else - rEnd.reset(new ScSingleRefToken(aData.Ref2)); - } - - void setRelative(ScSingleRefData& rData) const - { - rData.SetColRel(true); - rData.SetRowRel(true); - rData.SetTabRel(true); - } - -private: - shared_ptr<OUStringBuffer> mpRangeStr; - ScDocument* mpDoc; - sal_Unicode mcRangeSep; - sal_Unicode mcAddrSep; - bool mbFirst; -}; - -void lcl_convertTokensToString(OUString& rStr, const vector<ScTokenRef>& rTokens, ScDocument* pDoc) -{ - const sal_Unicode cRangeSep = ScCompiler::GetNativeSymbol(ocSep).GetChar(0); - FormulaGrammar::Grammar eGrammar = pDoc->GetGrammar(); - Tokens2RangeString func(pDoc, eGrammar, cRangeSep); - func = ::std::for_each(rTokens.begin(), rTokens.end(), func); - func.getString(rStr); -} - -} // anonymous namespace - -// DataProvider ============================================================== - -ScChart2DataProvider::ScChart2DataProvider( ScDocument* pDoc ) - : m_pDocument( pDoc) - , m_aPropSet(lcl_GetDataProviderPropertyMap()) - , m_bIncludeHiddenCells( sal_True) -{ - if ( m_pDocument ) - m_pDocument->AddUnoObject( *this); -} - -ScChart2DataProvider::~ScChart2DataProvider() -{ - if ( m_pDocument ) - m_pDocument->RemoveUnoObject( *this); -} - - -void ScChart2DataProvider::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint) -{ - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - m_pDocument = NULL; - } -} - -::sal_Bool SAL_CALL ScChart2DataProvider::createDataSourcePossible( const uno::Sequence< beans::PropertyValue >& aArguments ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if( ! m_pDocument ) - return false; - - rtl::OUString aRangeRepresentation; - for(sal_Int32 i = 0; i < aArguments.getLength(); ++i) - { - rtl::OUString sName(aArguments[i].Name); - if (aArguments[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("CellRangeRepresentation"))) - { - aArguments[i].Value >>= aRangeRepresentation; - } - } - - vector<ScTokenRef> aTokens; - ScRefTokenHelper::compileRangeRepresentation(aTokens, aRangeRepresentation, m_pDocument, m_pDocument->GetGrammar()); - return !aTokens.empty(); -} - -namespace -{ - -Reference< chart2::data::XLabeledDataSequence > lcl_createLabeledDataSequenceFromTokens( - auto_ptr< vector< ScTokenRef > > pValueTokens, auto_ptr< vector< ScTokenRef > > pLabelTokens, - ScDocument* pDoc, const Reference< chart2::data::XDataProvider >& xDP, bool bIncludeHiddenCells ) -{ - Reference< chart2::data::XLabeledDataSequence > xResult; - bool bHasValues = pValueTokens.get() && !pValueTokens->empty(); - bool bHasLabel = pLabelTokens.get() && !pLabelTokens->empty(); - if( bHasValues || bHasLabel ) - { - try - { - Reference< uno::XComponentContext > xContext( ::comphelper::getProcessComponentContext() ); - if ( xContext.is() ) - { - xResult.set( xContext->getServiceManager()->createInstanceWithContext( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.chart2.data.LabeledDataSequence")), - xContext ), uno::UNO_QUERY_THROW ); - } - if ( bHasValues ) - { - Reference< chart2::data::XDataSequence > xSeq( new ScChart2DataSequence( pDoc, xDP, pValueTokens.release(), bIncludeHiddenCells ) ); - xResult->setValues( xSeq ); - } - if ( bHasLabel ) - { - Reference< chart2::data::XDataSequence > xLabelSeq( new ScChart2DataSequence( pDoc, xDP, pLabelTokens.release(), bIncludeHiddenCells ) ); - xResult->setLabel( xLabelSeq ); - } - } - catch( const uno::Exception& ) - { - } - } - return xResult; -} - -//---------------------------------------------------- -/** - * Check the current list of reference tokens, and add the upper left - * corner of the minimum range that encloses all ranges if certain - * conditions are met. - * - * @param rRefTokens list of reference tokens - * - * @return true if the corner was added, false otherwise. - */ -bool lcl_addUpperLeftCornerIfMissing(vector<ScTokenRef>& rRefTokens, - SCROW nCornerRowCount=1, SCCOL nCornerColumnCount=1) -{ - using ::std::max; - using ::std::min; - - if (rRefTokens.empty()) - return false; - - SCCOL nMinCol = MAXCOLCOUNT; - SCROW nMinRow = MAXROWCOUNT; - SCCOL nMaxCol = 0; - SCROW nMaxRow = 0; - SCTAB nTab = 0; - - sal_uInt16 nFileId = 0; - String aExtTabName; - bool bExternal = false; - - vector<ScTokenRef>::const_iterator itr = rRefTokens.begin(), itrEnd = rRefTokens.end(); - - // Get the first ref token. - ScTokenRef pToken = *itr; - switch (pToken->GetType()) - { - case svSingleRef: - { - const ScSingleRefData& rData = pToken->GetSingleRef(); - nMinCol = rData.nCol; - nMinRow = rData.nRow; - nMaxCol = rData.nCol; - nMaxRow = rData.nRow; - nTab = rData.nTab; - } - break; - case svDoubleRef: - { - const ScComplexRefData& rData = pToken->GetDoubleRef(); - nMinCol = min(rData.Ref1.nCol, rData.Ref2.nCol); - nMinRow = min(rData.Ref1.nRow, rData.Ref2.nRow); - nMaxCol = max(rData.Ref1.nCol, rData.Ref2.nCol); - nMaxRow = max(rData.Ref1.nRow, rData.Ref2.nRow); - nTab = rData.Ref1.nTab; - } - break; - case svExternalSingleRef: - { - const ScSingleRefData& rData = pToken->GetSingleRef(); - nMinCol = rData.nCol; - nMinRow = rData.nRow; - nMaxCol = rData.nCol; - nMaxRow = rData.nRow; - nTab = rData.nTab; - nFileId = pToken->GetIndex(); - aExtTabName = pToken->GetString(); - bExternal = true; - } - break; - case svExternalDoubleRef: - { - const ScComplexRefData& rData = pToken->GetDoubleRef(); - nMinCol = min(rData.Ref1.nCol, rData.Ref2.nCol); - nMinRow = min(rData.Ref1.nRow, rData.Ref2.nRow); - nMaxCol = max(rData.Ref1.nCol, rData.Ref2.nCol); - nMaxRow = max(rData.Ref1.nRow, rData.Ref2.nRow); - nTab = rData.Ref1.nTab; - nFileId = pToken->GetIndex(); - aExtTabName = pToken->GetString(); - bExternal = true; - } - break; - default: - ; - } - - // Determine the minimum range enclosing all data ranges. Also make sure - // that they are all on the same table. - - for (++itr; itr != itrEnd; ++itr) - { - pToken = *itr; - switch (pToken->GetType()) - { - case svSingleRef: - { - const ScSingleRefData& rData = pToken->GetSingleRef(); - - nMinCol = min(nMinCol, rData.nCol); - nMinRow = min(nMinRow, rData.nRow); - nMaxCol = max(nMaxCol, rData.nCol); - nMaxRow = max(nMaxRow, rData.nRow); - if (nTab != rData.nTab || bExternal) - return false; - } - break; - case svDoubleRef: - { - const ScComplexRefData& rData = pToken->GetDoubleRef(); - - nMinCol = min(nMinCol, rData.Ref1.nCol); - nMinCol = min(nMinCol, rData.Ref2.nCol); - nMinRow = min(nMinRow, rData.Ref1.nRow); - nMinRow = min(nMinRow, rData.Ref2.nRow); - - nMaxCol = max(nMaxCol, rData.Ref1.nCol); - nMaxCol = max(nMaxCol, rData.Ref2.nCol); - nMaxRow = max(nMaxRow, rData.Ref1.nRow); - nMaxRow = max(nMaxRow, rData.Ref2.nRow); - - if (nTab != rData.Ref1.nTab || bExternal) - return false; - } - break; - case svExternalSingleRef: - { - if (!bExternal) - return false; - - if (nFileId != pToken->GetIndex() || aExtTabName != pToken->GetString()) - return false; - - const ScSingleRefData& rData = pToken->GetSingleRef(); - - nMinCol = min(nMinCol, rData.nCol); - nMinRow = min(nMinRow, rData.nRow); - nMaxCol = max(nMaxCol, rData.nCol); - nMaxRow = max(nMaxRow, rData.nRow); - } - break; - case svExternalDoubleRef: - { - if (!bExternal) - return false; - - if (nFileId != pToken->GetIndex() || aExtTabName != pToken->GetString()) - return false; - - const ScComplexRefData& rData = pToken->GetDoubleRef(); - - nMinCol = min(nMinCol, rData.Ref1.nCol); - nMinCol = min(nMinCol, rData.Ref2.nCol); - nMinRow = min(nMinRow, rData.Ref1.nRow); - nMinRow = min(nMinRow, rData.Ref2.nRow); - - nMaxCol = max(nMaxCol, rData.Ref1.nCol); - nMaxCol = max(nMaxCol, rData.Ref2.nCol); - nMaxRow = max(nMaxRow, rData.Ref1.nRow); - nMaxRow = max(nMaxRow, rData.Ref2.nRow); - } - break; - default: - ; - } - } - - if (nMinRow >= nMaxRow || nMinCol >= nMaxCol || - nMinRow >= MAXROWCOUNT || nMinCol >= MAXCOLCOUNT || - nMaxRow >= MAXROWCOUNT || nMaxCol >= MAXCOLCOUNT) - { - // Invalid range. Bail out. - return false; - } - - // Check if the following conditions are met: - // - // 1) The upper-left corner cell is not included. - // 2) The three adjacent cells of that corner cell are included. - - bool bRight = false, bBottom = false, bDiagonal = false; - for (itr = rRefTokens.begin(); itr != itrEnd; ++itr) - { - pToken = *itr; - switch (pToken->GetType()) - { - case svSingleRef: - case svExternalSingleRef: - { - const ScSingleRefData& rData = pToken->GetSingleRef(); - if (rData.nCol == nMinCol && rData.nRow == nMinRow) - // The corner cell is contained. - return false; - - if (rData.nCol == nMinCol+nCornerColumnCount && rData.nRow == nMinRow) - bRight = true; - - if (rData.nCol == nMinCol && rData.nRow == nMinRow+nCornerRowCount) - bBottom = true; - - if (rData.nCol == nMinCol+nCornerColumnCount && rData.nRow == nMinRow+nCornerRowCount) - bDiagonal = true; - } - break; - case svDoubleRef: - case svExternalDoubleRef: - { - const ScComplexRefData& rData = pToken->GetDoubleRef(); - const ScSingleRefData& r1 = rData.Ref1; - const ScSingleRefData& r2 = rData.Ref2; - if (r1.nCol <= nMinCol && nMinCol <= r2.nCol && - r1.nRow <= nMinRow && nMinRow <= r2.nRow) - // The corner cell is contained. - return false; - - if (r1.nCol <= nMinCol+nCornerColumnCount && nMinCol+nCornerColumnCount <= r2.nCol && - r1.nRow <= nMinRow && nMinRow <= r2.nRow) - bRight = true; - - if (r1.nCol <= nMinCol && nMinCol <= r2.nCol && - r1.nRow <= nMinRow+nCornerRowCount && nMinRow+nCornerRowCount <= r2.nRow) - bBottom = true; - - if (r1.nCol <= nMinCol+nCornerColumnCount && nMinCol+nCornerColumnCount <= r2.nCol && - r1.nRow <= nMinRow+nCornerRowCount && nMinRow+nCornerRowCount <= r2.nRow) - bDiagonal = true; - } - break; - default: - ; - } - } - - if (!bRight || !bBottom || !bDiagonal) - // Not all the adjacent cells are included. Bail out. - return false; - - ScSingleRefData aData; - aData.InitFlags(); - aData.SetFlag3D(true); - aData.SetColRel(false); - aData.SetRowRel(false); - aData.SetTabRel(false); - aData.nCol = nMinCol; - aData.nRow = nMinRow; - aData.nTab = nTab; - - if( nCornerRowCount==1 && nCornerColumnCount==1 ) - { - if (bExternal) - { - ScTokenRef pCorner( - new ScExternalSingleRefToken(nFileId, aExtTabName, aData)); - ScRefTokenHelper::join(rRefTokens, pCorner); - } - else - { - ScTokenRef pCorner(new ScSingleRefToken(aData)); - ScRefTokenHelper::join(rRefTokens, pCorner); - } - } - else - { - ScSingleRefData aDataEnd(aData); - aDataEnd.nCol += (nCornerColumnCount-1); - aDataEnd.nRow += (nCornerRowCount-1); - ScComplexRefData r; - r.Ref1=aData; - r.Ref2=aDataEnd; - if (bExternal) - { - ScTokenRef pCorner( - new ScExternalDoubleRefToken(nFileId, aExtTabName, r)); - ScRefTokenHelper::join(rRefTokens, pCorner); - } - else - { - ScTokenRef pCorner(new ScDoubleRefToken(r)); - ScRefTokenHelper::join(rRefTokens, pCorner); - } - } - - return true; -} - -} - -uno::Reference< chart2::data::XDataSource> SAL_CALL -ScChart2DataProvider::createDataSource( - const uno::Sequence< beans::PropertyValue >& aArguments ) - throw( lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( ! m_pDocument ) - throw uno::RuntimeException(); - - uno::Reference< chart2::data::XDataSource> xResult; - bool bLabel = true; - bool bCategories = false; - bool bOrientCol = true; - ::rtl::OUString aRangeRepresentation; - uno::Sequence< sal_Int32 > aSequenceMapping; - for(sal_Int32 i = 0; i < aArguments.getLength(); ++i) - { - rtl::OUString sName(aArguments[i].Name); - if (aArguments[i].Name == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataRowSource"))) - { - chart::ChartDataRowSource eSource = chart::ChartDataRowSource_COLUMNS; - if( ! (aArguments[i].Value >>= eSource)) - { - sal_Int32 nSource(0); - if( aArguments[i].Value >>= nSource ) - eSource = (static_cast< chart::ChartDataRowSource >( nSource )); - } - bOrientCol = (eSource == chart::ChartDataRowSource_COLUMNS); - } - else if (aArguments[i].Name == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FirstCellAsLabel"))) - { - bLabel = ::cppu::any2bool(aArguments[i].Value); - } - else if (aArguments[i].Name == rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HasCategories"))) - { - bCategories = ::cppu::any2bool(aArguments[i].Value); - } - else if (aArguments[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("CellRangeRepresentation"))) - { - aArguments[i].Value >>= aRangeRepresentation; - } - else if (aArguments[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("SequenceMapping"))) - { - aArguments[i].Value >>= aSequenceMapping; - } - } - - vector<ScTokenRef> aRefTokens; - ScRefTokenHelper::compileRangeRepresentation(aRefTokens, aRangeRepresentation, m_pDocument, m_pDocument->GetGrammar()); - if (aRefTokens.empty()) - // Invalid range representation. Bail out. - throw lang::IllegalArgumentException(); - - if (bLabel) - lcl_addUpperLeftCornerIfMissing(aRefTokens); //#i90669# - - bool bColHeaders = (bOrientCol ? bLabel : bCategories ); - bool bRowHeaders = (bOrientCol ? bCategories : bLabel ); - - Chart2Positioner aChPositioner(m_pDocument, aRefTokens); - aChPositioner.setHeaders(bColHeaders, bRowHeaders); - - const Chart2PositionMap* pChartMap = aChPositioner.getPositionMap(); - if (!pChartMap) - // No chart position map instance. Bail out. - return xResult; - - ScChart2DataSource* pDS = NULL; - ::std::list< Reference< chart2::data::XLabeledDataSequence > > aSeqs; - - // Fill Categories - if( bCategories ) - { - auto_ptr< vector<ScTokenRef> > pValueTokens(NULL); - if (bOrientCol) - pValueTokens.reset(pChartMap->getAllRowHeaderRanges()); - else - pValueTokens.reset(pChartMap->getAllColHeaderRanges()); - - auto_ptr< vector<ScTokenRef> > pLabelTokens(NULL); - pLabelTokens.reset(pChartMap->getLeftUpperCornerRanges()); - - Reference< chart2::data::XLabeledDataSequence > xCategories = lcl_createLabeledDataSequenceFromTokens( - pValueTokens, pLabelTokens, m_pDocument, this, m_bIncludeHiddenCells ); //ownership of pointers is transfered! - if ( xCategories.is() ) - { - aSeqs.push_back( xCategories ); - } - } - - // Fill Serieses (values and label) - sal_Int32 nCount = bOrientCol ? pChartMap->getDataColCount() : pChartMap->getDataRowCount(); - for (sal_Int32 i = 0; i < nCount; ++i) - { - auto_ptr< vector<ScTokenRef> > pValueTokens(NULL); - auto_ptr< vector<ScTokenRef> > pLabelTokens(NULL); - if (bOrientCol) - { - pValueTokens.reset(pChartMap->getDataColRanges(static_cast<SCCOL>(i))); - pLabelTokens.reset(pChartMap->getColHeaderRanges(static_cast<SCCOL>(i))); - } - else - { - pValueTokens.reset(pChartMap->getDataRowRanges(static_cast<SCROW>(i))); - pLabelTokens.reset(pChartMap->getRowHeaderRanges(static_cast<SCROW>(i))); - } - Reference< chart2::data::XLabeledDataSequence > xChartSeries = lcl_createLabeledDataSequenceFromTokens( - pValueTokens, pLabelTokens, m_pDocument, this, m_bIncludeHiddenCells ); //ownership of pointers is transfered! - if ( xChartSeries.is() ) - { - aSeqs.push_back( xChartSeries ); - } - } - - pDS = new ScChart2DataSource(m_pDocument); - ::std::list< Reference< chart2::data::XLabeledDataSequence > >::iterator aItr( aSeqs.begin() ); - ::std::list< Reference< chart2::data::XLabeledDataSequence > >::iterator aEndItr( aSeqs.end() ); - - //reorder labeled sequences according to aSequenceMapping - ::std::vector< Reference< chart2::data::XLabeledDataSequence > > aSeqVector; - while(aItr != aEndItr) - { - aSeqVector.push_back(*aItr); - ++aItr; - } - - ::std::map< sal_Int32, Reference< chart2::data::XLabeledDataSequence > > aSequenceMap; - for( sal_Int32 nNewIndex = 0; nNewIndex < aSequenceMapping.getLength(); nNewIndex++ ) - { - // note: assuming that the values in the sequence mapping are always non-negative - ::std::vector< Reference< chart2::data::XLabeledDataSequence > >::size_type nOldIndex( static_cast< sal_uInt32 >( aSequenceMapping[nNewIndex] ) ); - if( nOldIndex < aSeqVector.size() ) - { - pDS->AddLabeledSequence( aSeqVector[nOldIndex] ); - aSeqVector[nOldIndex] = 0; - } - } - - ::std::vector< Reference< chart2::data::XLabeledDataSequence > >::iterator aVectorItr( aSeqVector.begin() ); - ::std::vector< Reference< chart2::data::XLabeledDataSequence > >::iterator aVectorEndItr( aSeqVector.end() ); - while(aVectorItr != aVectorEndItr) - { - Reference< chart2::data::XLabeledDataSequence > xSeq( *aVectorItr ); - if ( xSeq.is() ) - { - pDS->AddLabeledSequence( xSeq ); - } - ++aVectorItr; - } - - xResult.set( pDS ); - return xResult; -} - -namespace -{ - -/** - * Function object to create a list of table numbers from a token list. - */ -class InsertTabNumber : public unary_function<ScTokenRef, void> -{ -public: - InsertTabNumber() : - mpTabNumList(new list<SCTAB>()) - { - } - - InsertTabNumber(const InsertTabNumber& r) : - mpTabNumList(r.mpTabNumList) - { - } - - void operator() (const ScTokenRef& pToken) const - { - if (!ScRefTokenHelper::isRef(pToken)) - return; - - const ScSingleRefData& r = pToken->GetSingleRef(); - mpTabNumList->push_back(r.nTab); - } - - void getList(list<SCTAB>& rList) - { - mpTabNumList->swap(rList); - } -private: - shared_ptr< list<SCTAB> > mpTabNumList; -}; - -class RangeAnalyzer -{ -public: - RangeAnalyzer(); - void initRangeAnalyzer( const vector<ScTokenRef>& rTokens ); - void analyzeRange( sal_Int32& rnDataInRows, sal_Int32& rnDataInCols, - bool& rbRowSourceAmbiguous ) const; - bool inSameSingleRow( RangeAnalyzer& rOther ); - bool inSameSingleColumn( RangeAnalyzer& rOther ); - SCROW getRowCount() { return mnRowCount; } - SCCOL getColumnCount() { return mnColumnCount; } - -private: - bool mbEmpty; - bool mbAmbiguous; - SCROW mnRowCount; - SCCOL mnColumnCount; - - SCCOL mnStartColumn; - SCROW mnStartRow; -}; - -RangeAnalyzer::RangeAnalyzer() - : mbEmpty(true) - , mbAmbiguous(false) - , mnRowCount(0) - , mnColumnCount(0) - , mnStartColumn(-1) - , mnStartRow(-1) -{ -} - -void RangeAnalyzer::initRangeAnalyzer( const vector<ScTokenRef>& rTokens ) -{ - mnRowCount=0; - mnColumnCount=0; - mnStartColumn = -1; - mnStartRow = -1; - mbAmbiguous=false; - if( rTokens.empty() ) - { - mbEmpty=true; - return; - } - mbEmpty=false; - - vector<ScTokenRef>::const_iterator itr = rTokens.begin(), itrEnd = rTokens.end(); - for (; itr != itrEnd ; ++itr) - { - ScTokenRef aRefToken = *itr; - StackVar eVar = aRefToken->GetType(); - if (eVar == svDoubleRef || eVar == svExternalDoubleRef) - { - const ScComplexRefData& r = aRefToken->GetDoubleRef(); - if (r.Ref1.nTab == r.Ref2.nTab) - { - mnColumnCount = std::max<SCCOL>( mnColumnCount, static_cast<SCCOL>(abs(r.Ref2.nCol - r.Ref1.nCol)+1) ); - mnRowCount = std::max<SCROW>( mnRowCount, static_cast<SCROW>(abs(r.Ref2.nRow - r.Ref1.nRow)+1) ); - if( mnStartColumn == -1 ) - { - mnStartColumn = r.Ref1.nCol; - mnStartRow = r.Ref1.nRow; - } - else - { - if( mnStartColumn != r.Ref1.nCol && mnStartRow != r.Ref1.nRow ) - mbAmbiguous=true; - } - } - else - mbAmbiguous=true; - } - else if (eVar == svSingleRef || eVar == svExternalSingleRef) - { - const ScSingleRefData& r = aRefToken->GetSingleRef(); - mnColumnCount = std::max<SCCOL>( mnColumnCount, 1); - mnRowCount = std::max<SCROW>( mnRowCount, 1); - if( mnStartColumn == -1 ) - { - mnStartColumn = r.nCol; - mnStartRow = r.nRow; - } - else - { - if( mnStartColumn != r.nCol && mnStartRow != r.nRow ) - mbAmbiguous=true; - } - } - else - mbAmbiguous=true; - } -} - -void RangeAnalyzer::analyzeRange( sal_Int32& rnDataInRows, - sal_Int32& rnDataInCols, - bool& rbRowSourceAmbiguous ) const -{ - if(!mbEmpty && !mbAmbiguous) - { - if( mnRowCount==1 && mnColumnCount>1 ) - ++rnDataInRows; - else if( mnColumnCount==1 && mnRowCount>1 ) - ++rnDataInCols; - else if( mnRowCount>1 && mnColumnCount>1 ) - rbRowSourceAmbiguous = true; - } - else if( !mbEmpty ) - rbRowSourceAmbiguous = true; -} - -bool RangeAnalyzer::inSameSingleRow( RangeAnalyzer& rOther ) -{ - if( mnStartRow==rOther.mnStartRow && - mnRowCount==1 && rOther.mnRowCount==1 ) - return true; - return false; -} - -bool RangeAnalyzer::inSameSingleColumn( RangeAnalyzer& rOther ) -{ - if( mnStartColumn==rOther.mnStartColumn && - mnColumnCount==1 && rOther.mnColumnCount==1 ) - return true; - return false; -} - -} //end anonymous namespace - -uno::Sequence< beans::PropertyValue > SAL_CALL ScChart2DataProvider::detectArguments( - const uno::Reference< chart2::data::XDataSource >& xDataSource ) - throw (uno::RuntimeException) -{ - ::std::vector< beans::PropertyValue > aResult; - bool bRowSourceDetected = false; - bool bFirstCellAsLabel = false; - bool bHasCategories = false; - ::rtl::OUString sRangeRep; - - bool bHasCategoriesLabels = false; - vector<ScTokenRef> aAllCategoriesValuesTokens; - vector<ScTokenRef> aAllSeriesLabelTokens; - - chart::ChartDataRowSource eRowSource = chart::ChartDataRowSource_COLUMNS; - - vector<ScTokenRef> aAllTokens; - - // parse given data source and collect infos - { - SolarMutexGuard aGuard; - OSL_ENSURE( m_pDocument, "No Document -> no detectArguments" ); - if(!m_pDocument ||!xDataSource.is()) - return lcl_VectorToSequence( aResult ); - - sal_Int32 nDataInRows = 0; - sal_Int32 nDataInCols = 0; - bool bRowSourceAmbiguous = false; - - Sequence< Reference< chart2::data::XLabeledDataSequence > > aSequences( xDataSource->getDataSequences()); - const sal_Int32 nCount( aSequences.getLength()); - RangeAnalyzer aPrevLabel,aPrevValues; - for( sal_Int32 nIdx=0; nIdx<nCount; ++nIdx ) - { - Reference< chart2::data::XLabeledDataSequence > xLS(aSequences[nIdx]); - if( xLS.is() ) - { - bool bThisIsCategories = false; - if(!bHasCategories) - { - Reference< beans::XPropertySet > xSeqProp( xLS->getValues(), uno::UNO_QUERY ); - ::rtl::OUString aRole; - if( xSeqProp.is() && (xSeqProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Role"))) >>= aRole) && - aRole.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("categories")) ) - bThisIsCategories = bHasCategories = true; - } - - RangeAnalyzer aLabel,aValues; - // label - Reference< chart2::data::XDataSequence > xLabel( xLS->getLabel()); - if( xLabel.is()) - { - bFirstCellAsLabel = true; - vector<ScTokenRef> aTokens; - ScRefTokenHelper::compileRangeRepresentation( aTokens, xLabel->getSourceRangeRepresentation(), m_pDocument, m_pDocument->GetGrammar() ); - aLabel.initRangeAnalyzer(aTokens); - vector<ScTokenRef>::const_iterator itr = aTokens.begin(), itrEnd = aTokens.end(); - for (; itr != itrEnd; ++itr) - { - ScRefTokenHelper::join(aAllTokens, *itr); - if(!bThisIsCategories) - ScRefTokenHelper::join(aAllSeriesLabelTokens, *itr); - } - if(bThisIsCategories) - bHasCategoriesLabels=true; - } - // values - Reference< chart2::data::XDataSequence > xValues( xLS->getValues()); - if( xValues.is()) - { - vector<ScTokenRef> aTokens; - ScRefTokenHelper::compileRangeRepresentation( aTokens, xValues->getSourceRangeRepresentation(), m_pDocument, m_pDocument->GetGrammar() ); - aValues.initRangeAnalyzer(aTokens); - vector<ScTokenRef>::const_iterator itr = aTokens.begin(), itrEnd = aTokens.end(); - for (; itr != itrEnd; ++itr) - { - ScRefTokenHelper::join(aAllTokens, *itr); - if(bThisIsCategories) - ScRefTokenHelper::join(aAllCategoriesValuesTokens, *itr); - } - } - //detect row source - if(!bThisIsCategories || nCount==1) //categories might span multiple rows *and* columns, so they should be used for detection only if nothing else is available - { - if (!bRowSourceAmbiguous) - { - aValues.analyzeRange(nDataInRows,nDataInCols,bRowSourceAmbiguous); - aLabel.analyzeRange(nDataInRows,nDataInCols,bRowSourceAmbiguous); - if (nDataInRows > 1 && nDataInCols > 1) - bRowSourceAmbiguous = true; - else if( !bRowSourceAmbiguous && !nDataInRows && !nDataInCols ) - { - if( aValues.inSameSingleColumn( aLabel ) ) - nDataInCols++; - else if( aValues.inSameSingleRow( aLabel ) ) - nDataInRows++; - else - { - //#i86188# also detect a single column split into rows correctly - if( aValues.inSameSingleColumn( aPrevValues ) ) - nDataInRows++; - else if( aValues.inSameSingleRow( aPrevValues ) ) - nDataInCols++; - else if( aLabel.inSameSingleColumn( aPrevLabel ) ) - nDataInRows++; - else if( aLabel.inSameSingleRow( aPrevLabel ) ) - nDataInCols++; - } - } - } - } - aPrevValues=aValues; - aPrevLabel=aLabel; - } - } - - if (!bRowSourceAmbiguous) - { - bRowSourceDetected = true; - eRowSource = ( nDataInRows > 0 - ? chart::ChartDataRowSource_ROWS - : chart::ChartDataRowSource_COLUMNS ); - } - else - { - // set DataRowSource to the better of the two ambiguities - eRowSource = ( nDataInRows > nDataInCols - ? chart::ChartDataRowSource_ROWS - : chart::ChartDataRowSource_COLUMNS ); - } - - } - - // TableNumberList - { - list<SCTAB> aTableNumList; - InsertTabNumber func; - func = ::std::for_each(aAllTokens.begin(), aAllTokens.end(), func); - func.getList(aTableNumList); - aResult.push_back( - beans::PropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TableNumberList")), -1, - uno::makeAny( lcl_createTableNumberList( aTableNumList ) ), - beans::PropertyState_DIRECT_VALUE )); - } - - // DataRowSource (calculated before) - if( bRowSourceDetected ) - { - aResult.push_back( - beans::PropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataRowSource")), -1, - uno::makeAny( eRowSource ), beans::PropertyState_DIRECT_VALUE )); - } - - // HasCategories - if( bRowSourceDetected ) - { - aResult.push_back( - beans::PropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HasCategories")), -1, - uno::makeAny( bHasCategories ), beans::PropertyState_DIRECT_VALUE )); - } - - // FirstCellAsLabel - if( bRowSourceDetected ) - { - aResult.push_back( - beans::PropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FirstCellAsLabel")), -1, - uno::makeAny( bFirstCellAsLabel ), beans::PropertyState_DIRECT_VALUE )); - } - - // Add the left upper corner to the range if it is missing. - if (bRowSourceDetected && bFirstCellAsLabel && bHasCategories && !bHasCategoriesLabels ) - { - RangeAnalyzer aTop,aLeft; - if( eRowSource==chart::ChartDataRowSource_COLUMNS ) - { - aTop.initRangeAnalyzer(aAllSeriesLabelTokens); - aLeft.initRangeAnalyzer(aAllCategoriesValuesTokens); - } - else - { - aTop.initRangeAnalyzer(aAllCategoriesValuesTokens); - aLeft.initRangeAnalyzer(aAllSeriesLabelTokens); - } - lcl_addUpperLeftCornerIfMissing(aAllTokens, aTop.getRowCount(), aLeft.getColumnCount());//e.g. #i91212# - } - - // Get range string. - lcl_convertTokensToString(sRangeRep, aAllTokens, m_pDocument); - - // add cell range property - aResult.push_back( - beans::PropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CellRangeRepresentation")), -1, - uno::makeAny( sRangeRep ), beans::PropertyState_DIRECT_VALUE )); - - //Sequence Mapping - bool bSequencesReordered = true;//todo detect this above or detect this sequence mapping cheaper ... - if( bSequencesReordered && bRowSourceDetected ) - { - bool bDifferentIndexes = false; - - std::vector< sal_Int32 > aSequenceMappingVector; - - uno::Reference< chart2::data::XDataSource > xCompareDataSource; - try - { - xCompareDataSource.set( this->createDataSource( lcl_VectorToSequence( aResult ) ) ); - } - catch( const lang::IllegalArgumentException & ) - { - // creation of data source to compare didn't work, so we cannot - // create a sequence mapping - } - - if( xDataSource.is() && xCompareDataSource.is() ) - { - uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence> > aOldSequences( - xCompareDataSource->getDataSequences() ); - uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aNewSequences( - xDataSource->getDataSequences()); - - rtl::OUString aOldLabel; - rtl::OUString aNewLabel; - rtl::OUString aOldValues; - rtl::OUString aNewValues; - rtl::OUString aEmpty; - - for( sal_Int32 nNewIndex = 0; nNewIndex < aNewSequences.getLength(); nNewIndex++ ) - { - uno::Reference< chart2::data::XLabeledDataSequence> xNew( aNewSequences[nNewIndex] ); - for( sal_Int32 nOldIndex = 0; nOldIndex < aOldSequences.getLength(); nOldIndex++ ) - { - uno::Reference< chart2::data::XLabeledDataSequence> xOld( aOldSequences[nOldIndex] ); - - if( xOld.is() && xNew.is() ) - { - aOldLabel = aNewLabel = aOldValues = aNewValues = aEmpty; - if( xOld.is() && xOld->getLabel().is() ) - aOldLabel = xOld->getLabel()->getSourceRangeRepresentation(); - if( xNew.is() && xNew->getLabel().is() ) - aNewLabel = xNew->getLabel()->getSourceRangeRepresentation(); - if( xOld.is() && xOld->getValues().is() ) - aOldValues = xOld->getValues()->getSourceRangeRepresentation(); - if( xNew.is() && xNew->getValues().is() ) - aNewValues = xNew->getValues()->getSourceRangeRepresentation(); - - if( aOldLabel.equals(aNewLabel) - && ( aOldValues.equals(aNewValues) ) ) - { - if( nOldIndex!=nNewIndex ) - bDifferentIndexes = true; - aSequenceMappingVector.push_back(nOldIndex); - break; - } - } - } - } - } - - if( bDifferentIndexes && aSequenceMappingVector.size() ) - { - aResult.push_back( - beans::PropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SequenceMapping")), -1, - uno::makeAny( lcl_VectorToSequence(aSequenceMappingVector) ) - , beans::PropertyState_DIRECT_VALUE )); - } - } - - return lcl_VectorToSequence( aResult ); -} - -::sal_Bool SAL_CALL ScChart2DataProvider::createDataSequenceByRangeRepresentationPossible( const ::rtl::OUString& aRangeRepresentation ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if( ! m_pDocument ) - return false; - - vector<ScTokenRef> aTokens; - ScRefTokenHelper::compileRangeRepresentation(aTokens, aRangeRepresentation, m_pDocument, m_pDocument->GetGrammar()); - return !aTokens.empty(); -} - -uno::Reference< chart2::data::XDataSequence > SAL_CALL - ScChart2DataProvider::createDataSequenceByRangeRepresentation( - const ::rtl::OUString& aRangeRepresentation ) - throw (lang::IllegalArgumentException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< chart2::data::XDataSequence > xResult; - - OSL_ENSURE( m_pDocument, "No Document -> no createDataSequenceByRangeRepresentation" ); - if(!m_pDocument || (aRangeRepresentation.getLength() == 0)) - return xResult; - - // Note: the range representation must be in Calc A1 format. The import - // filters use this method to pass data ranges, and they have no idea what - // the current formula syntax is. In the future we should add another - // method to allow the client code to directly pass tokens representing - // ranges. - - vector<ScTokenRef> aRefTokens; - ScRefTokenHelper::compileRangeRepresentation(aRefTokens, aRangeRepresentation, m_pDocument); - if (aRefTokens.empty()) - return xResult; - - // ScChart2DataSequence manages the life cycle of pRefTokens. - vector<ScTokenRef>* pRefTokens = new vector<ScTokenRef>(); - pRefTokens->swap(aRefTokens); - xResult.set(new ScChart2DataSequence(m_pDocument, this, pRefTokens, m_bIncludeHiddenCells)); - - return xResult; -} - -uno::Reference< sheet::XRangeSelection > SAL_CALL ScChart2DataProvider::getRangeSelection() - throw (uno::RuntimeException) -{ - uno::Reference< sheet::XRangeSelection > xResult; - - uno::Reference< frame::XModel > xModel( lcl_GetXModel( m_pDocument )); - if( xModel.is()) - xResult.set( xModel->getCurrentController(), uno::UNO_QUERY ); - - return xResult; -} - -// XRangeXMLConversion --------------------------------------------------- - -rtl::OUString SAL_CALL ScChart2DataProvider::convertRangeToXML( const rtl::OUString& sRangeRepresentation ) - throw ( uno::RuntimeException, lang::IllegalArgumentException ) -{ - OUString aRet; - if (!m_pDocument) - return aRet; - - if (!sRangeRepresentation.getLength()) - // Empty data range is allowed. - return aRet; - - vector<ScTokenRef> aRefTokens; - ScRefTokenHelper::compileRangeRepresentation(aRefTokens, sRangeRepresentation, m_pDocument, m_pDocument->GetGrammar()); - if (aRefTokens.empty()) - throw lang::IllegalArgumentException(); - - Tokens2RangeStringXML converter(m_pDocument); - converter = ::std::for_each(aRefTokens.begin(), aRefTokens.end(), converter); - converter.getString(aRet); - - return aRet; -} - -rtl::OUString SAL_CALL ScChart2DataProvider::convertRangeFromXML( const rtl::OUString& sXMLRange ) - throw ( uno::RuntimeException, lang::IllegalArgumentException ) -{ - const sal_Unicode cSep = ' '; - const sal_Unicode cQuote = '\''; - - if (!m_pDocument) - { - // #i74062# When loading flat XML, this is called before the referenced sheets are in the document, - // so the conversion has to take place directly with the strings, without looking up the sheets. - - rtl::OUStringBuffer sRet; - sal_Int32 nOffset = 0; - while( nOffset >= 0 ) - { - rtl::OUString sToken; - ScRangeStringConverter::GetTokenByOffset( sToken, sXMLRange, nOffset, cSep, cQuote ); - if( nOffset >= 0 ) - { - // convert one address (remove dots) - - String aUIString(sToken); - - sal_Int32 nIndex = ScRangeStringConverter::IndexOf( sToken, ':', 0, cQuote ); - if ( nIndex >= 0 && nIndex < aUIString.Len() - 1 && - aUIString.GetChar((xub_StrLen)nIndex + 1) == (sal_Unicode) '.' ) - aUIString.Erase( (xub_StrLen)nIndex + 1, 1 ); - - if ( aUIString.GetChar(0) == (sal_Unicode) '.' ) - aUIString.Erase( 0, 1 ); - - if( sRet.getLength() ) - sRet.append( (sal_Unicode) ';' ); - sRet.append( aUIString ); - } - } - - return sRet.makeStringAndClear(); - } - - OUString aRet; - ScRangeStringConverter::GetStringFromXMLRangeString(aRet, sXMLRange, m_pDocument); - return aRet; -} - -// DataProvider XPropertySet ------------------------------------------------- - -uno::Reference< beans::XPropertySetInfo> SAL_CALL -ScChart2DataProvider::getPropertySetInfo() throw( uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef = - new SfxItemPropertySetInfo( m_aPropSet.getPropertyMap() ); - return aRef; -} - - -void SAL_CALL ScChart2DataProvider::setPropertyValue( - const ::rtl::OUString& rPropertyName, const uno::Any& rValue) - throw( beans::UnknownPropertyException, - beans::PropertyVetoException, - lang::IllegalArgumentException, - lang::WrappedTargetException, uno::RuntimeException) -{ - if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) - { - if ( !(rValue >>= m_bIncludeHiddenCells)) - throw lang::IllegalArgumentException(); - } - else - throw beans::UnknownPropertyException(); -} - - -uno::Any SAL_CALL ScChart2DataProvider::getPropertyValue( - const ::rtl::OUString& rPropertyName) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - uno::Any aRet; - if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) - aRet <<= m_bIncludeHiddenCells; - else - throw beans::UnknownPropertyException(); - return aRet; -} - - -void SAL_CALL ScChart2DataProvider::addPropertyChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XPropertyChangeListener>& /*xListener*/) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL( "Not yet implemented" ); -} - - -void SAL_CALL ScChart2DataProvider::removePropertyChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XPropertyChangeListener>& /*rListener*/) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL( "Not yet implemented" ); -} - - -void SAL_CALL ScChart2DataProvider::addVetoableChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XVetoableChangeListener>& /*rListener*/) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL( "Not yet implemented" ); -} - - -void SAL_CALL ScChart2DataProvider::removeVetoableChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XVetoableChangeListener>& /*rListener*/ ) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL( "Not yet implemented" ); -} - -// DataSource ================================================================ - -ScChart2DataSource::ScChart2DataSource( ScDocument* pDoc) - : m_pDocument( pDoc) -{ - if ( m_pDocument ) - m_pDocument->AddUnoObject( *this); -} - - -ScChart2DataSource::~ScChart2DataSource() -{ - if ( m_pDocument ) - m_pDocument->RemoveUnoObject( *this); -} - - -void ScChart2DataSource::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint) -{ - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - m_pDocument = NULL; - } -} - - -uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence> > SAL_CALL -ScChart2DataSource::getDataSequences() throw ( uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - LabeledList::const_iterator aItr(m_aLabeledSequences.begin()); - LabeledList::const_iterator aEndItr(m_aLabeledSequences.end()); - - uno::Sequence< uno::Reference< chart2::data::XLabeledDataSequence > > aRet(m_aLabeledSequences.size()); - - sal_Int32 i = 0; - while (aItr != aEndItr) - { - aRet[i] = *aItr; - ++i; - ++aItr; - } - - return aRet; -} - -void ScChart2DataSource::AddLabeledSequence(const uno::Reference < chart2::data::XLabeledDataSequence >& xNew) -{ - m_aLabeledSequences.push_back(xNew); -} - - -// DataSequence ============================================================== - -ScChart2DataSequence::Item::Item() : - mfValue(0.0), mbIsValue(false) -{ - ::rtl::math::setNan(&mfValue); -} - -ScChart2DataSequence::HiddenRangeListener::HiddenRangeListener(ScChart2DataSequence& rParent) : - mrParent(rParent) -{ -} - -ScChart2DataSequence::HiddenRangeListener::~HiddenRangeListener() -{ -} - -void ScChart2DataSequence::HiddenRangeListener::notify() -{ - mrParent.setDataChangedHint(true); -} - -ScChart2DataSequence::ScChart2DataSequence( ScDocument* pDoc, - const uno::Reference < chart2::data::XDataProvider >& xDP, - vector<ScTokenRef>* pTokens, - bool bIncludeHiddenCells ) - : m_bIncludeHiddenCells( bIncludeHiddenCells) - , m_nObjectId( 0 ) - , m_pDocument( pDoc) - , m_pTokens(pTokens) - , m_pRangeIndices(NULL) - , m_pExtRefListener(NULL) - , m_xDataProvider( xDP) - , m_aPropSet(lcl_GetDataSequencePropertyMap()) - , m_pHiddenListener(NULL) - , m_pValueListener( NULL ) - , m_bGotDataChangedHint(false) - , m_bExtDataRebuildQueued(false) -{ - OSL_ENSURE(pTokens, "reference token list is null"); - - if ( m_pDocument ) - { - m_pDocument->AddUnoObject( *this); - m_nObjectId = m_pDocument->GetNewUnoId(); - } - // FIXME: real implementation of identifier and it's mapping to ranges. - // Reuse ScChartListener? - - // BM: don't use names of named ranges but the UI range strings -// String aStr; -// rRangeList->Format( aStr, SCR_ABS_3D, m_pDocument ); -// m_aIdentifier = ::rtl::OUString( aStr ); - -// m_aIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ID_")); -// static sal_Int32 nID = 0; -// m_aIdentifier += ::rtl::OUString::valueOf( ++nID); -} - -ScChart2DataSequence::~ScChart2DataSequence() -{ - if ( m_pDocument ) - { - m_pDocument->RemoveUnoObject( *this); - if (m_pHiddenListener.get()) - { - ScChartListenerCollection* pCLC = m_pDocument->GetChartListenerCollection(); - if (pCLC) - pCLC->EndListeningHiddenRange(m_pHiddenListener.get()); - } - StopListeningToAllExternalRefs(); - } - - delete m_pValueListener; -} - -void ScChart2DataSequence::RefChanged() -{ - if( m_pValueListener && m_aValueListeners.Count() != 0 ) - { - m_pValueListener->EndListeningAll(); - - if( m_pDocument ) - { - ScChartListenerCollection* pCLC = NULL; - if (m_pHiddenListener.get()) - { - pCLC = m_pDocument->GetChartListenerCollection(); - if (pCLC) - pCLC->EndListeningHiddenRange(m_pHiddenListener.get()); - } - - vector<ScTokenRef>::const_iterator itr = m_pTokens->begin(), itrEnd = m_pTokens->end(); - for (; itr != itrEnd; ++itr) - { - ScRange aRange; - if (!ScRefTokenHelper::getRangeFromToken(aRange, *itr)) - continue; - - m_pDocument->StartListeningArea(aRange, m_pValueListener); - if (pCLC) - pCLC->StartListeningHiddenRange(aRange, m_pHiddenListener.get()); - } - } - } -} - -void ScChart2DataSequence::BuildDataCache() -{ - m_bExtDataRebuildQueued = false; - - if (!m_aDataArray.empty()) - return; - - if (!m_pTokens.get()) - { - OSL_FAIL("m_pTokens == NULL! Something is wrong."); - return; - } - - StopListeningToAllExternalRefs(); - - ::std::list<sal_Int32> aHiddenValues; - sal_Int32 nDataCount = 0; - sal_Int32 nHiddenValueCount = 0; - - for (vector<ScTokenRef>::const_iterator itr = m_pTokens->begin(), itrEnd = m_pTokens->end(); - itr != itrEnd; ++itr) - { - if (ScRefTokenHelper::isExternalRef(*itr)) - { - nDataCount += FillCacheFromExternalRef(*itr); - } - else - { - ScRange aRange; - if (!ScRefTokenHelper::getRangeFromToken(aRange, *itr)) - continue; - - SCCOL nLastCol = -1; - SCROW nLastRow = -1; - for (SCTAB nTab = aRange.aStart.Tab(); nTab <= aRange.aEnd.Tab(); ++nTab) - { - for (SCCOL nCol = aRange.aStart.Col(); nCol <= aRange.aEnd.Col(); ++nCol) - { - for (SCROW nRow = aRange.aStart.Row(); nRow <= aRange.aEnd.Row(); ++nRow) - { - bool bColHidden = m_pDocument->ColHidden(nCol, nTab, NULL, &nLastCol); - bool bRowHidden = m_pDocument->RowHidden(nRow, nTab, NULL, &nLastRow); - - if (bColHidden || bRowHidden) - { - // hidden cell - ++nHiddenValueCount; - aHiddenValues.push_back(nDataCount-1); - - if( !m_bIncludeHiddenCells ) - continue; - } - - m_aDataArray.push_back(Item()); - Item& rItem = m_aDataArray.back(); - ++nDataCount; - - ScAddress aAdr(nCol, nRow, nTab); - ScBaseCell* pCell = m_pDocument->GetCell(aAdr); - if (!pCell) - continue; - - if (pCell->HasStringData()) - rItem.maString = pCell->GetStringData(); - else - { - String aStr; - m_pDocument->GetString(nCol, nRow, nTab, aStr); - rItem.maString = aStr; - } - - switch (pCell->GetCellType()) - { - case CELLTYPE_VALUE: - rItem.mfValue = static_cast< ScValueCell*>(pCell)->GetValue(); - rItem.mbIsValue = true; - break; - case CELLTYPE_FORMULA: - { - ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pCell); - sal_uInt16 nErr = pFCell->GetErrCode(); - if (nErr) - break; - - if (pFCell->HasValueData()) - { - rItem.mfValue = pFCell->GetValue(); - rItem.mbIsValue = true; - } - } - break; -#if OSL_DEBUG_LEVEL > 0 - case CELLTYPE_DESTROYED: -#endif - case CELLTYPE_EDIT: - case CELLTYPE_NONE: - case CELLTYPE_NOTE: - case CELLTYPE_STRING: - case CELLTYPE_SYMBOLS: - default: - ; // do nothing - } - } - } - } - } - } - - // convert the hidden cell list to sequence. - m_aHiddenValues.realloc(nHiddenValueCount); - sal_Int32* pArr = m_aHiddenValues.getArray(); - ::std::list<sal_Int32>::const_iterator itr = aHiddenValues.begin(), itrEnd = aHiddenValues.end(); - for (;itr != itrEnd; ++itr, ++pArr) - *pArr = *itr; - - // Clear the data series cache when the array is re-built. - m_aMixedDataCache.realloc(0); -} - -void ScChart2DataSequence::RebuildDataCache() -{ - if (!m_bExtDataRebuildQueued) - { - m_aDataArray.clear(); - m_pDocument->BroadcastUno(ScHint(SC_HINT_DATACHANGED, ScAddress(), NULL)); - m_bExtDataRebuildQueued = true; - m_bGotDataChangedHint = true; - } -} - -sal_Int32 ScChart2DataSequence::FillCacheFromExternalRef(const ScTokenRef& pToken) -{ - ScExternalRefManager* pRefMgr = m_pDocument->GetExternalRefManager(); - ScRange aRange; - if (!ScRefTokenHelper::getRangeFromToken(aRange, pToken, true)) - return 0; - - sal_uInt16 nFileId = pToken->GetIndex(); - const String& rTabName = pToken->GetString(); - ScExternalRefCache::TokenArrayRef pArray = pRefMgr->getDoubleRefTokens(nFileId, rTabName, aRange, NULL); - if (!pArray) - // no external data exists for this range. - return 0; - - // Start listening for this external document. - ExternalRefListener* pExtRefListener = GetExtRefListener(); - pRefMgr->addLinkListener(nFileId, pExtRefListener); - pExtRefListener->addFileId(nFileId); - - ScExternalRefCache::TableTypeRef pTable = pRefMgr->getCacheTable(nFileId, rTabName, false, NULL); - sal_Int32 nDataCount = 0; - for (FormulaToken* p = pArray->First(); p; p = pArray->Next()) - { - // Cached external range is always represented as a single - // matrix token, although that might change in the future when - // we introduce a new token type to store multi-table range - // data. - - if (p->GetType() != svMatrix) - { - OSL_FAIL("Cached array is not a matrix token."); - continue; - } - - const ScMatrix* pMat = static_cast<ScToken*>(p)->GetMatrix(); - SCSIZE nCSize, nRSize; - pMat->GetDimensions(nCSize, nRSize); - for (SCSIZE nC = 0; nC < nCSize; ++nC) - { - for (SCSIZE nR = 0; nR < nRSize; ++nR) - { - if (pMat->IsValue(nC, nR) || pMat->IsBoolean(nC, nR)) - { - m_aDataArray.push_back(Item()); - Item& rItem = m_aDataArray.back(); - ++nDataCount; - - rItem.mbIsValue = true; - rItem.mfValue = pMat->GetDouble(nC, nR); - - SvNumberFormatter* pFormatter = m_pDocument->GetFormatTable(); - if (pFormatter) - { - String aStr; - const double fVal = rItem.mfValue; - Color* pColor = NULL; - sal_uInt32 nFmt = 0; - if (pTable) - { - // Get the correct format index from the cache. - SCCOL nCol = aRange.aStart.Col() + static_cast<SCCOL>(nC); - SCROW nRow = aRange.aStart.Row() + static_cast<SCROW>(nR); - pTable->getCell(nCol, nRow, &nFmt); - } - pFormatter->GetOutputString(fVal, nFmt, aStr, &pColor); - rItem.maString = aStr; - } - } - else if (pMat->IsString(nC, nR)) - { - m_aDataArray.push_back(Item()); - Item& rItem = m_aDataArray.back(); - ++nDataCount; - - rItem.mbIsValue = false; - rItem.maString = pMat->GetString(nC, nR); - } - } - } - } - return nDataCount; -} - -void ScChart2DataSequence::UpdateTokensFromRanges(const ScRangeList& rRanges) -{ - if (!m_pRangeIndices.get()) - return; - - for ( size_t i = 0, nCount = rRanges.size(); i < nCount; ++i ) - { - ScTokenRef pToken; - const ScRange* pRange = rRanges[i]; - OSL_ENSURE(pRange, "range object is NULL."); - - ScRefTokenHelper::getTokenFromRange(pToken, *pRange); - sal_uInt32 nOrigPos = (*m_pRangeIndices)[i]; - (*m_pTokens)[nOrigPos] = pToken; - } - - RefChanged(); - - // any change of the range address is broadcast to value (modify) listeners - if ( m_aValueListeners.Count() ) - m_bGotDataChangedHint = true; -} - -ScChart2DataSequence::ExternalRefListener* ScChart2DataSequence::GetExtRefListener() -{ - if (!m_pExtRefListener.get()) - m_pExtRefListener.reset(new ExternalRefListener(*this, m_pDocument)); - - return m_pExtRefListener.get(); -} - -void ScChart2DataSequence::StopListeningToAllExternalRefs() -{ - if (!m_pExtRefListener.get()) - return; - - const boost::unordered_set<sal_uInt16>& rFileIds = m_pExtRefListener->getAllFileIds(); - boost::unordered_set<sal_uInt16>::const_iterator itr = rFileIds.begin(), itrEnd = rFileIds.end(); - ScExternalRefManager* pRefMgr = m_pDocument->GetExternalRefManager(); - for (; itr != itrEnd; ++itr) - pRefMgr->removeLinkListener(*itr, m_pExtRefListener.get()); - - m_pExtRefListener.reset(NULL); -} - -void ScChart2DataSequence::CopyData(const ScChart2DataSequence& r) -{ - if (!m_pDocument) - { - OSL_FAIL("document instance is NULL!?"); - return; - } - - list<Item> aDataArray(r.m_aDataArray); - m_aDataArray.swap(aDataArray); - - m_aHiddenValues = r.m_aHiddenValues; - m_aRole = r.m_aRole; - - if (r.m_pRangeIndices.get()) - m_pRangeIndices.reset(new vector<sal_uInt32>(*r.m_pRangeIndices)); - - if (r.m_pExtRefListener.get()) - { - // Re-register all external files that the old instance was - // listening to. - - ScExternalRefManager* pRefMgr = m_pDocument->GetExternalRefManager(); - m_pExtRefListener.reset(new ExternalRefListener(*this, m_pDocument)); - const boost::unordered_set<sal_uInt16>& rFileIds = r.m_pExtRefListener->getAllFileIds(); - boost::unordered_set<sal_uInt16>::const_iterator itr = rFileIds.begin(), itrEnd = rFileIds.end(); - for (; itr != itrEnd; ++itr) - { - pRefMgr->addLinkListener(*itr, m_pExtRefListener.get()); - m_pExtRefListener->addFileId(*itr); - } - } -} - -void ScChart2DataSequence::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint) -{ - if ( rHint.ISA( SfxSimpleHint ) ) - { - sal_uLong nId = static_cast<const SfxSimpleHint&>(rHint).GetId(); - if ( nId ==SFX_HINT_DYING ) - { - m_pDocument = NULL; - } - else if ( nId == SFX_HINT_DATACHANGED ) - { - // delayed broadcast as in ScCellRangesBase - - if ( m_bGotDataChangedHint && m_pDocument ) - { - m_aDataArray.clear(); - lang::EventObject aEvent; - aEvent.Source.set((cppu::OWeakObject*)this); - - if( m_pDocument ) - { - for ( sal_uInt16 n=0; n<m_aValueListeners.Count(); n++ ) - m_pDocument->AddUnoListenerCall( *m_aValueListeners[n], aEvent ); - } - - m_bGotDataChangedHint = false; - } - } - else if ( nId == SC_HINT_CALCALL ) - { - // broadcast from DoHardRecalc - set m_bGotDataChangedHint - // (SFX_HINT_DATACHANGED follows separately) - - if ( m_aValueListeners.Count() ) - m_bGotDataChangedHint = true; - } - } - else if ( rHint.ISA( ScUpdateRefHint ) ) - { - // Create a range list from the token list, have the range list - // updated, and bring the change back to the token list. - - ScRangeList aRanges; - m_pRangeIndices.reset(new vector<sal_uInt32>()); - vector<ScTokenRef>::const_iterator itrBeg = m_pTokens->begin(), itrEnd = m_pTokens->end(); - for (vector<ScTokenRef>::const_iterator itr = itrBeg ;itr != itrEnd; ++itr) - { - if (!ScRefTokenHelper::isExternalRef(*itr)) - { - ScRange aRange; - ScRefTokenHelper::getRangeFromToken(aRange, *itr); - aRanges.Append(aRange); - sal_uInt32 nPos = distance(itrBeg, itr); - m_pRangeIndices->push_back(nPos); - } - } - - OSL_ENSURE(m_pRangeIndices->size() == static_cast<size_t>(aRanges.size()), - "range list and range index list have different sizes."); - - auto_ptr<ScRangeList> pUndoRanges; - if ( m_pDocument->HasUnoRefUndo() ) - pUndoRanges.reset(new ScRangeList(aRanges)); - - const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint; - bool bChanged = aRanges.UpdateReference( - rRef.GetMode(), m_pDocument, rRef.GetRange(), rRef.GetDx(), rRef.GetDy(), rRef.GetDz()); - - if (bChanged) - { - OSL_ENSURE(m_pRangeIndices->size() == aRanges.size(), - "range list and range index list have different sizes after the reference update."); - - // Bring the change back from the range list to the token list. - UpdateTokensFromRanges(aRanges); - - if (pUndoRanges.get()) - m_pDocument->AddUnoRefChange(m_nObjectId, *pUndoRanges); - } - } - else if ( rHint.ISA( ScUnoRefUndoHint ) ) - { - const ScUnoRefUndoHint& rUndoHint = static_cast<const ScUnoRefUndoHint&>(rHint); - - do - { - if (rUndoHint.GetObjectId() != m_nObjectId) - break; - - // The hint object provides the old ranges. Restore the old state - // from these ranges. - - if (!m_pRangeIndices.get() || m_pRangeIndices->empty()) - { - OSL_FAIL(" faulty range indices"); - break; - } - - const ScRangeList& rRanges = rUndoHint.GetRanges(); - - size_t nCount = rRanges.size(); - if (nCount != m_pRangeIndices->size()) - { - OSL_FAIL("range count and range index count differ."); - break; - } - - UpdateTokensFromRanges(rRanges); - } - while (false); - } -} - - -IMPL_LINK( ScChart2DataSequence, ValueListenerHdl, SfxHint*, pHint ) -{ - if ( m_pDocument && pHint && pHint->ISA( SfxSimpleHint ) && - ((const SfxSimpleHint*)pHint)->GetId() & (SC_HINT_DATACHANGED | SC_HINT_DYING) ) - { - // This may be called several times for a single change, if several formulas - // in the range are notified. So only a flag is set that is checked when - // SFX_HINT_DATACHANGED is received. - - setDataChangedHint(true); - } - return 0; -} - -// ---------------------------------------------------------------------------- - -ScChart2DataSequence::ExternalRefListener::ExternalRefListener( - ScChart2DataSequence& rParent, ScDocument* pDoc) : - ScExternalRefManager::LinkListener(), - mrParent(rParent), - mpDoc(pDoc) -{ -} - -ScChart2DataSequence::ExternalRefListener::~ExternalRefListener() -{ - if (!mpDoc || mpDoc->IsInDtorClear()) - // The document is being destroyed. Do nothing. - return; - - // Make sure to remove all pointers to this object. - mpDoc->GetExternalRefManager()->removeLinkListener(this); -} - -void ScChart2DataSequence::ExternalRefListener::notify(sal_uInt16 nFileId, ScExternalRefManager::LinkUpdateType eType) -{ - switch (eType) - { - case ScExternalRefManager::LINK_MODIFIED: - { - if (maFileIds.count(nFileId)) - // We are listening to this external document. - mrParent.RebuildDataCache(); - } - break; - case ScExternalRefManager::LINK_BROKEN: - removeFileId(nFileId); - break; - } -} - -void ScChart2DataSequence::ExternalRefListener::addFileId(sal_uInt16 nFileId) -{ - maFileIds.insert(nFileId); -} - -void ScChart2DataSequence::ExternalRefListener::removeFileId(sal_uInt16 nFileId) -{ - maFileIds.erase(nFileId); -} - -const boost::unordered_set<sal_uInt16>& ScChart2DataSequence::ExternalRefListener::getAllFileIds() -{ - return maFileIds; -} - -// ---------------------------------------------------------------------------- - -uno::Sequence< uno::Any> SAL_CALL ScChart2DataSequence::getData() - throw ( uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( !m_pDocument) - throw uno::RuntimeException(); - - BuildDataCache(); - - if (!m_aMixedDataCache.getLength()) - { - // Build a cache for the 1st time... - - sal_Int32 nCount = m_aDataArray.size(); - m_aMixedDataCache.realloc(nCount); - uno::Any* pArr = m_aMixedDataCache.getArray(); - ::std::list<Item>::const_iterator itr = m_aDataArray.begin(), itrEnd = m_aDataArray.end(); - for (; itr != itrEnd; ++itr, ++pArr) - { - if (itr->mbIsValue) - *pArr <<= itr->mfValue; - else - *pArr <<= itr->maString; - } - } - return m_aMixedDataCache; -} - -// XNumericalDataSequence -------------------------------------------------- - -uno::Sequence< double > SAL_CALL ScChart2DataSequence::getNumericalData() - throw ( uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( !m_pDocument) - throw uno::RuntimeException(); - - BuildDataCache(); - - double fNAN; - ::rtl::math::setNan(&fNAN); - - sal_Int32 nCount = m_aDataArray.size(); - uno::Sequence<double> aSeq(nCount); - double* pArr = aSeq.getArray(); - ::std::list<Item>::const_iterator itr = m_aDataArray.begin(), itrEnd = m_aDataArray.end(); - for (; itr != itrEnd; ++itr, ++pArr) - *pArr = itr->mbIsValue ? itr->mfValue : fNAN; - - return aSeq; -} - -// XTextualDataSequence -------------------------------------------------- - -uno::Sequence< rtl::OUString > SAL_CALL ScChart2DataSequence::getTextualData( ) throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( !m_pDocument) - throw uno::RuntimeException(); - - BuildDataCache(); - - sal_Int32 nCount = m_aDataArray.size(); - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pArr = aSeq.getArray(); - ::std::list<Item>::const_iterator itr = m_aDataArray.begin(), itrEnd = m_aDataArray.end(); - for (; itr != itrEnd; ++itr, ++pArr) - *pArr = itr->maString; - - return aSeq; -} - -::rtl::OUString SAL_CALL ScChart2DataSequence::getSourceRangeRepresentation() - throw ( uno::RuntimeException) -{ - SolarMutexGuard aGuard; - OUString aStr; - OSL_ENSURE( m_pDocument, "No Document -> no SourceRangeRepresentation" ); - if (m_pDocument && m_pTokens.get()) - lcl_convertTokensToString(aStr, *m_pTokens, m_pDocument); - - return aStr; -} - -namespace { - -/** - * This function object is used to accumulatively count the numbers of - * columns and rows in all reference tokens. - */ -class AccumulateRangeSize : public unary_function<ScTokenRef, void> -{ -public: - AccumulateRangeSize() : - mnCols(0), mnRows(0) {} - - AccumulateRangeSize(const AccumulateRangeSize& r) : - mnCols(r.mnCols), mnRows(r.mnRows) {} - - void operator() (const ScTokenRef& pToken) - { - ScRange r; - bool bExternal = ScRefTokenHelper::isExternalRef(pToken); - ScRefTokenHelper::getRangeFromToken(r, pToken, bExternal); - r.Justify(); - mnCols += r.aEnd.Col() - r.aStart.Col() + 1; - mnRows += r.aEnd.Row() - r.aStart.Row() + 1; - } - - SCCOL getCols() const { return mnCols; } - SCROW getRows() const { return mnRows; } -private: - SCCOL mnCols; - SCROW mnRows; -}; - -/** - * This function object is used to generate label strings from a list of - * reference tokens. - */ -class GenerateLabelStrings : public unary_function<ScTokenRef, void> -{ -public: - GenerateLabelStrings(sal_Int32 nSize, chart2::data::LabelOrigin eOrigin, bool bColumn) : - mpLabels(new Sequence<OUString>(nSize)), - meOrigin(eOrigin), - mnCount(0), - mbColumn(bColumn) {} - - GenerateLabelStrings(const GenerateLabelStrings& r) : - mpLabels(r.mpLabels), - meOrigin(r.meOrigin), - mnCount(r.mnCount), - mbColumn(r.mbColumn) {} - - void operator() (const ScTokenRef& pToken) - { - bool bExternal = ScRefTokenHelper::isExternalRef(pToken); - ScRange aRange; - ScRefTokenHelper::getRangeFromToken(aRange, pToken, bExternal); - OUString* pArr = mpLabels->getArray(); - if (mbColumn) - { - for (SCCOL nCol = aRange.aStart.Col(); nCol <= aRange.aEnd.Col(); ++nCol) - { - if ( meOrigin != chart2::data::LabelOrigin_LONG_SIDE) - { - String aString = ScGlobal::GetRscString(STR_COLUMN); - aString += ' '; - ScAddress aPos( nCol, 0, 0 ); - String aColStr; - aPos.Format( aColStr, SCA_VALID_COL, NULL ); - aString += aColStr; - pArr[mnCount] = aString; - } - else //only indices for categories - pArr[mnCount] = String::CreateFromInt32( mnCount+1 ); - ++mnCount; - } - } - else - { - for (sal_Int32 nRow = aRange.aStart.Row(); nRow <= aRange.aEnd.Row(); ++nRow) - { - if (meOrigin != chart2::data::LabelOrigin_LONG_SIDE) - { - String aString = ScGlobal::GetRscString(STR_ROW); - aString += ' '; - aString += String::CreateFromInt32( nRow+1 ); - pArr[mnCount] = aString; - } - else //only indices for categories - pArr[mnCount] = String::CreateFromInt32( mnCount+1 ); - ++mnCount; - } - } - } - - Sequence<OUString> getLabels() const { return *mpLabels; } - -private: - GenerateLabelStrings(); // disabled - - shared_ptr< Sequence<OUString> > mpLabels; - chart2::data::LabelOrigin meOrigin; - sal_Int32 mnCount; - bool mbColumn; -}; - -} - -uno::Sequence< ::rtl::OUString > SAL_CALL ScChart2DataSequence::generateLabel(chart2::data::LabelOrigin eOrigin) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( !m_pDocument) - throw uno::RuntimeException(); - - if (!m_pTokens.get()) - return Sequence<OUString>(); - - // Determine the total size of all ranges. - AccumulateRangeSize func; - func = ::std::for_each(m_pTokens->begin(), m_pTokens->end(), func); - SCCOL nCols = func.getCols(); - SCROW nRows = func.getRows(); - - // Detemine whether this is column-major or row-major. - bool bColumn = true; - if ((eOrigin == chart2::data::LabelOrigin_SHORT_SIDE) || - (eOrigin == chart2::data::LabelOrigin_LONG_SIDE)) - { - if (nRows > nCols) - { - if (eOrigin == chart2::data::LabelOrigin_SHORT_SIDE) - bColumn = true; - else - bColumn = false; - } - else if (nCols > nRows) - { - if (eOrigin == chart2::data::LabelOrigin_SHORT_SIDE) - bColumn = false; - else - bColumn = true; - } - else - return Sequence<OUString>(); - } - - // Generate label strings based on the info so far. - sal_Int32 nCount = bColumn ? nCols : nRows; - GenerateLabelStrings genLabels(nCount, eOrigin, bColumn); - genLabels = ::std::for_each(m_pTokens->begin(), m_pTokens->end(), genLabels); - Sequence<OUString> aSeq = genLabels.getLabels(); - - return aSeq; -} - -::sal_Int32 SAL_CALL ScChart2DataSequence::getNumberFormatKeyByIndex( ::sal_Int32 nIndex ) - throw (lang::IndexOutOfBoundsException, - uno::RuntimeException) -{ - // index -1 means a heuristic value for the entire sequence - bool bGetSeriesFormat = (nIndex == -1); - sal_Int32 nResult = 0; - - SolarMutexGuard aGuard; - if ( !m_pDocument || !m_pTokens.get()) - return nResult; - - sal_Int32 nCount = 0; - bool bFound = false; - ScRange* p; - - uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( lcl_GetSpreadSheetDocument( m_pDocument )); - if (!xSpreadDoc.is()) - return nResult; - - uno::Reference<container::XIndexAccess> xIndex( xSpreadDoc->getSheets(), uno::UNO_QUERY ); - if (!xIndex.is()) - return nResult; - - ScRangeList aRanges; - ScRefTokenHelper::getRangeListFromTokens(aRanges, *m_pTokens); - uno::Reference< table::XCellRange > xSheet; - for ( size_t rIndex = 0, nRanges = aRanges.size(); (rIndex < nRanges) && !bFound; ++rIndex ) - { - p = aRanges[ rIndex ]; - // TODO: use DocIter? - table::CellAddress aStart, aEnd; - ScUnoConversion::FillApiAddress( aStart, p->aStart ); - ScUnoConversion::FillApiAddress( aEnd, p->aEnd ); - for ( sal_Int16 nSheet = aStart.Sheet; nSheet <= aEnd.Sheet && !bFound; ++nSheet) - { - xSheet.set(xIndex->getByIndex(nSheet), uno::UNO_QUERY); - for ( sal_Int32 nCol = aStart.Column; nCol <= aEnd.Column && !bFound; ++nCol) - { - for ( sal_Int32 nRow = aStart.Row; nRow <= aEnd.Row && !bFound; ++nRow) - { - if( bGetSeriesFormat ) - { - // TODO: use nicer heuristic - // return format of first non-empty cell - uno::Reference< text::XText > xText( - xSheet->getCellByPosition(nCol, nRow), uno::UNO_QUERY); - if (xText.is() && xText->getString().getLength()) - { - uno::Reference< beans::XPropertySet > xProp(xText, uno::UNO_QUERY); - if( xProp.is()) - xProp->getPropertyValue( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberFormat"))) >>= nResult; - bFound = true; - break; - } - } - else if( nCount == nIndex ) - { - uno::Reference< beans::XPropertySet > xProp( - xSheet->getCellByPosition(nCol, nRow), uno::UNO_QUERY); - if( xProp.is()) - xProp->getPropertyValue( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NumberFormat"))) >>= nResult; - bFound = true; - break; - } - ++nCount; - } - } - } - } - - return nResult; -} - -// XCloneable ================================================================ - -uno::Reference< util::XCloneable > SAL_CALL ScChart2DataSequence::createClone() - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - auto_ptr< vector<ScTokenRef> > pTokensNew; - if (m_pTokens.get()) - { - // Clone tokens. - pTokensNew.reset(new vector<ScTokenRef>); - pTokensNew->reserve(m_pTokens->size()); - vector<ScTokenRef>::const_iterator itr = m_pTokens->begin(), itrEnd = m_pTokens->end(); - for (; itr != itrEnd; ++itr) - { - ScTokenRef p(static_cast<ScToken*>((*itr)->Clone())); - pTokensNew->push_back(p); - } - } - - auto_ptr<ScChart2DataSequence> p(new ScChart2DataSequence(m_pDocument, m_xDataProvider, pTokensNew.release(), m_bIncludeHiddenCells)); - p->CopyData(*this); - Reference< util::XCloneable > xClone(p.release()); - - return xClone; -} - -// XModifyBroadcaster ======================================================== - -void SAL_CALL ScChart2DataSequence::addModifyListener( const uno::Reference< util::XModifyListener >& aListener ) - throw (uno::RuntimeException) -{ - // like ScCellRangesBase::addModifyListener - SolarMutexGuard aGuard; - if (!m_pTokens.get() || m_pTokens->empty()) - return; - - ScRangeList aRanges; - ScRefTokenHelper::getRangeListFromTokens(aRanges, *m_pTokens); - uno::Reference<util::XModifyListener> *pObj = - new uno::Reference<util::XModifyListener>( aListener ); - m_aValueListeners.Insert( pObj, m_aValueListeners.Count() ); - - if ( m_aValueListeners.Count() == 1 ) - { - if (!m_pValueListener) - m_pValueListener = new ScLinkListener( LINK( this, ScChart2DataSequence, ValueListenerHdl ) ); - - if (!m_pHiddenListener.get()) - m_pHiddenListener.reset(new HiddenRangeListener(*this)); - - if( m_pDocument ) - { - ScChartListenerCollection* pCLC = m_pDocument->GetChartListenerCollection(); - vector<ScTokenRef>::const_iterator itr = m_pTokens->begin(), itrEnd = m_pTokens->end(); - for (; itr != itrEnd; ++itr) - { - ScRange aRange; - if (!ScRefTokenHelper::getRangeFromToken(aRange, *itr)) - continue; - - m_pDocument->StartListeningArea( aRange, m_pValueListener ); - if (pCLC) - pCLC->StartListeningHiddenRange(aRange, m_pHiddenListener.get()); - } - } - - acquire(); // don't lose this object (one ref for all listeners) - } -} - -void SAL_CALL ScChart2DataSequence::removeModifyListener( const uno::Reference< util::XModifyListener >& aListener ) - throw (uno::RuntimeException) -{ - // like ScCellRangesBase::removeModifyListener - - SolarMutexGuard aGuard; - if (!m_pTokens.get() || m_pTokens->empty()) - return; - - acquire(); // in case the listeners have the last ref - released below - - sal_uInt16 nCount = m_aValueListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<util::XModifyListener> *pObj = m_aValueListeners[n]; - if ( *pObj == aListener ) - { - m_aValueListeners.DeleteAndDestroy( n ); - - if ( m_aValueListeners.Count() == 0 ) - { - if (m_pValueListener) - m_pValueListener->EndListeningAll(); - - if (m_pHiddenListener.get() && m_pDocument) - { - ScChartListenerCollection* pCLC = m_pDocument->GetChartListenerCollection(); - if (pCLC) - pCLC->EndListeningHiddenRange(m_pHiddenListener.get()); - } - - release(); // release the ref for the listeners - } - - break; - } - } - - release(); // might delete this object -} - -// DataSequence XPropertySet ------------------------------------------------- - -uno::Reference< beans::XPropertySetInfo> SAL_CALL -ScChart2DataSequence::getPropertySetInfo() throw( uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef = - new SfxItemPropertySetInfo( m_aPropSet.getPropertyMap() ); - return aRef; -} - - -void SAL_CALL ScChart2DataSequence::setPropertyValue( - const ::rtl::OUString& rPropertyName, const uno::Any& rValue) - throw( beans::UnknownPropertyException, - beans::PropertyVetoException, - lang::IllegalArgumentException, - lang::WrappedTargetException, uno::RuntimeException) -{ - if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ROLE))) - { - if ( !(rValue >>= m_aRole)) - throw lang::IllegalArgumentException(); - } - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) - { - sal_Bool bOldValue = m_bIncludeHiddenCells; - if ( !(rValue >>= m_bIncludeHiddenCells)) - throw lang::IllegalArgumentException(); - if( bOldValue != m_bIncludeHiddenCells ) - m_aDataArray.clear();//data array is dirty now - } - else - throw beans::UnknownPropertyException(); - // TODO: support optional properties -} - - -uno::Any SAL_CALL ScChart2DataSequence::getPropertyValue( - const ::rtl::OUString& rPropertyName) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - uno::Any aRet; - if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ROLE))) - aRet <<= m_aRole; - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) - aRet <<= m_bIncludeHiddenCells; - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM(SC_UNONAME_HIDDENVALUES))) - { - // This property is read-only thus cannot be set externally via - // setPropertyValue(...). - BuildDataCache(); - aRet <<= m_aHiddenValues; - } - else - throw beans::UnknownPropertyException(); - // TODO: support optional properties - return aRet; -} - - -void SAL_CALL ScChart2DataSequence::addPropertyChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XPropertyChangeListener>& /*xListener*/) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - // FIXME: real implementation - OSL_FAIL( "Not yet implemented" ); -} - - -void SAL_CALL ScChart2DataSequence::removePropertyChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XPropertyChangeListener>& /*rListener*/) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - // FIXME: real implementation - OSL_FAIL( "Not yet implemented" ); -} - - -void SAL_CALL ScChart2DataSequence::addVetoableChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XVetoableChangeListener>& /*rListener*/) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - // FIXME: real implementation - OSL_FAIL( "Not yet implemented" ); -} - - -void SAL_CALL ScChart2DataSequence::removeVetoableChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XVetoableChangeListener>& /*rListener*/) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - // FIXME: real implementation - OSL_FAIL( "Not yet implemented" ); -} - -void ScChart2DataSequence::setDataChangedHint(bool b) -{ - m_bGotDataChangedHint = b; -} - - -#if USE_CHART2_EMPTYDATASEQUENCE -// DataSequence ============================================================== - -ScChart2EmptyDataSequence::ScChart2EmptyDataSequence( ScDocument* pDoc, - const uno::Reference < chart2::data::XDataProvider >& xDP, - const ScRangeListRef& rRangeList, - sal_Bool bColumn) - : m_bIncludeHiddenCells( sal_True) - , m_xRanges( rRangeList) - , m_pDocument( pDoc) - , m_xDataProvider( xDP) - , m_aPropSet(lcl_GetDataSequencePropertyMap()) - , m_bColumn(bColumn) -{ - if ( m_pDocument ) - m_pDocument->AddUnoObject( *this); - // FIXME: real implementation of identifier and it's mapping to ranges. - // Reuse ScChartListener? - - // BM: don't use names of named ranges but the UI range strings -// String aStr; -// rRangeList->Format( aStr, SCR_ABS_3D, m_pDocument ); -// m_aIdentifier = ::rtl::OUString( aStr ); - -// m_aIdentifier = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ID_")); -// static sal_Int32 nID = 0; -// m_aIdentifier += ::rtl::OUString::valueOf( ++nID); -} - - -ScChart2EmptyDataSequence::~ScChart2EmptyDataSequence() -{ - if ( m_pDocument ) - m_pDocument->RemoveUnoObject( *this); -} - - -void ScChart2EmptyDataSequence::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint) -{ - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - m_pDocument = NULL; - } -} - - -uno::Sequence< uno::Any> SAL_CALL ScChart2EmptyDataSequence::getData() - throw ( uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( !m_pDocument) - throw uno::RuntimeException(); - return uno::Sequence< uno::Any>(); -} - -// XTextualDataSequence -------------------------------------------------- - -uno::Sequence< rtl::OUString > SAL_CALL ScChart2EmptyDataSequence::getTextualData( ) throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( !m_pDocument) - throw uno::RuntimeException(); - - sal_Int32 nCount = 0; - ScRange* p; - - OSL_ENSURE(m_xRanges->Count() == 1, "not handled count of ranges"); - - for ( p = m_xRanges->First(); p; p = m_xRanges->Next()) - { - p->Justify(); - // TODO: handle overlaping ranges? - nCount += m_bColumn ? p->aEnd.Col() - p->aStart.Col() + 1 : p->aEnd.Row() - p->aStart.Row() + 1; - } - uno::Sequence< rtl::OUString > aSeq( nCount); - rtl::OUString* pArr = aSeq.getArray(); - nCount = 0; - for ( p = m_xRanges->First(); p; p = m_xRanges->Next()) - { - if (m_bColumn) - { - for (SCCOL nCol = p->aStart.Col(); nCol <= p->aEnd.Col(); ++nCol) - { - String aString = ScGlobal::GetRscString(STR_COLUMN); - aString += ' '; - ScAddress aPos( nCol, 0, 0 ); - String aColStr; - aPos.Format( aColStr, SCA_VALID_COL, NULL ); - aString += aColStr; - pArr[nCount] = aString; - ++nCount; - } - } - else - { - sal_Int32 n = p->aEnd.Row() - p->aStart.Row() + 1; - for (sal_Int32 i = 0; i < n; ++i) - pArr[nCount++] = String::CreateFromInt32( i+1 ); - } - } - return aSeq; -} - -::rtl::OUString SAL_CALL ScChart2EmptyDataSequence::getSourceRangeRepresentation() - throw ( uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aStr; - OSL_ENSURE( m_pDocument, "No Document -> no SourceRangeRepresentation" ); - if( m_pDocument ) - m_xRanges->Format( aStr, SCR_ABS_3D, m_pDocument, m_pDocument->GetAddressConvention() ); - return aStr; -} - -uno::Sequence< ::rtl::OUString > SAL_CALL ScChart2EmptyDataSequence::generateLabel(chart2::data::LabelOrigin /*nOrigin*/) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Sequence< ::rtl::OUString > aRet; - return aRet; -} - -::sal_Int32 SAL_CALL ScChart2EmptyDataSequence::getNumberFormatKeyByIndex( ::sal_Int32 /*nIndex*/ ) - throw (lang::IndexOutOfBoundsException, - uno::RuntimeException) -{ - sal_Int32 nResult = 0; - - SolarMutexGuard aGuard; - if ( !m_pDocument) - return nResult; - - return nResult; -} - -// XCloneable ================================================================ - -uno::Reference< util::XCloneable > SAL_CALL ScChart2EmptyDataSequence::createClone() - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (m_xDataProvider.is()) - { - // copy properties - uno::Reference < util::XCloneable > xClone(new ScChart2EmptyDataSequence(m_pDocument, m_xDataProvider, new ScRangeList(*m_xRanges), m_bColumn)); - uno::Reference< beans::XPropertySet > xProp( xClone, uno::UNO_QUERY ); - if( xProp.is()) - { - xProp->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ROLE )), - uno::makeAny( m_aRole )); - xProp->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS )), - uno::makeAny( m_bIncludeHiddenCells )); - } - return xClone; - } - return uno::Reference< util::XCloneable >(); -} - -// XModifyBroadcaster ======================================================== - -void SAL_CALL ScChart2EmptyDataSequence::addModifyListener( const uno::Reference< util::XModifyListener >& /*aListener*/ ) - throw (uno::RuntimeException) -{ - // TODO: Implement -} - -void SAL_CALL ScChart2EmptyDataSequence::removeModifyListener( const uno::Reference< util::XModifyListener >& /*aListener*/ ) - throw (uno::RuntimeException) -{ - // TODO: Implement -} - -// DataSequence XPropertySet ------------------------------------------------- - -uno::Reference< beans::XPropertySetInfo> SAL_CALL -ScChart2EmptyDataSequence::getPropertySetInfo() throw( uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef = - new SfxItemPropertySetInfo( m_aPropSet.getPropertyMap() ); - return aRef; -} - - -void SAL_CALL ScChart2EmptyDataSequence::setPropertyValue( - const ::rtl::OUString& rPropertyName, const uno::Any& rValue) - throw( beans::UnknownPropertyException, - beans::PropertyVetoException, - lang::IllegalArgumentException, - lang::WrappedTargetException, uno::RuntimeException) -{ - if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ROLE))) - { - if ( !(rValue >>= m_aRole)) - throw lang::IllegalArgumentException(); - } - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) - { - if ( !(rValue >>= m_bIncludeHiddenCells)) - throw lang::IllegalArgumentException(); - } - else - throw beans::UnknownPropertyException(); - // TODO: support optional properties -} - - -uno::Any SAL_CALL ScChart2EmptyDataSequence::getPropertyValue( - const ::rtl::OUString& rPropertyName) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - uno::Any aRet; - if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ROLE))) - aRet <<= m_aRole; - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_INCLUDEHIDDENCELLS))) - aRet <<= m_bIncludeHiddenCells; - else - throw beans::UnknownPropertyException(); - // TODO: support optional properties - return aRet; -} - - -void SAL_CALL ScChart2EmptyDataSequence::addPropertyChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XPropertyChangeListener>& /*xListener*/) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - // FIXME: real implementation - OSL_FAIL( "Not yet implemented" ); -} - - -void SAL_CALL ScChart2EmptyDataSequence::removePropertyChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XPropertyChangeListener>& /*rListener*/) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - // FIXME: real implementation - OSL_FAIL( "Not yet implemented" ); -} - - -void SAL_CALL ScChart2EmptyDataSequence::addVetoableChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XVetoableChangeListener>& /*rListener*/) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - // FIXME: real implementation - OSL_FAIL( "Not yet implemented" ); -} - - -void SAL_CALL ScChart2EmptyDataSequence::removeVetoableChangeListener( - const ::rtl::OUString& /*rPropertyName*/, - const uno::Reference< beans::XVetoableChangeListener>& /*rListener*/ ) - throw( beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - // FIXME: real implementation - OSL_FAIL( "Not yet implemented" ); -} - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/chartuno.cxx b/sc/source/ui/unoobj/chartuno.cxx deleted file mode 100644 index ef2e59ee7..000000000 --- a/sc/source/ui/unoobj/chartuno.cxx +++ /dev/null @@ -1,809 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - -#include <com/sun/star/embed/Aspects.hpp> -#include <com/sun/star/awt/Size.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/chart2/data/XDataReceiver.hpp> -#include <com/sun/star/chart/ChartDataRowSource.hpp> -#include <com/sun/star/chart2/XChartDocument.hpp> -#include <com/sun/star/embed/Aspects.hpp> -#include <com/sun/star/table/CellRangeAddress.hpp> - -#include <svx/svditer.hxx> -#include <svx/svdoole2.hxx> -#include <svx/svdpage.hxx> -#include <svx/svdundo.hxx> -#include <sfx2/app.hxx> -#include <unotools/moduleoptions.hxx> -#include <sot/clsids.hxx> -#include <toolkit/helper/vclunohelper.hxx> - -#include "chartuno.hxx" -#include "miscuno.hxx" -#include "docsh.hxx" -#include "drwlayer.hxx" -#include "undodat.hxx" -#include "chartarr.hxx" -#include "chartlis.hxx" -#include "chart2uno.hxx" -#include "convuno.hxx" - -using namespace com::sun::star; - -#define PROP_HANDLE_RELATED_CELLRANGES 1 - -//------------------------------------------------------------------------ - -SC_SIMPLE_SERVICE_INFO( ScChartObj, "ScChartObj", "com.sun.star.table.TableChart" ) -SC_SIMPLE_SERVICE_INFO( ScChartsObj, "ScChartsObj", "com.sun.star.table.TableCharts" ) - -//------------------------------------------------------------------------ - -SdrOle2Obj* lcl_FindChartObj( ScDocShell* pDocShell, SCTAB nTab, const String& rName ) -{ - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); - if (pDrawLayer) - { - SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); - OSL_ENSURE(pPage, "Page nicht gefunden"); - if (pPage) - { - SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); - SdrObject* pObject = aIter.Next(); - while (pObject) - { - if ( pObject->GetObjIdentifier() == OBJ_OLE2 && pDoc->IsChart(pObject) ) - { - uno::Reference < embed::XEmbeddedObject > xObj = ((SdrOle2Obj*)pObject)->GetObjRef(); - if ( xObj.is() ) - { - String aObjName = pDocShell->GetEmbeddedObjectContainer().GetEmbeddedObjectName( xObj ); - if ( aObjName == rName ) - return (SdrOle2Obj*)pObject; - } - } - pObject = aIter.Next(); - } - } - } - } - return NULL; -} - -//------------------------------------------------------------------------ - -ScChartsObj::ScChartsObj(ScDocShell* pDocSh, SCTAB nT) : - pDocShell( pDocSh ), - nTab( nT ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScChartsObj::~ScChartsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScChartsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! Referenz-Update - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -ScChartObj* ScChartsObj::GetObjectByIndex_Impl(long nIndex) const -{ - String aName; - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); - if (pDrawLayer) - { - SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); - OSL_ENSURE(pPage, "Page nicht gefunden"); - if (pPage) - { - long nPos = 0; - SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); - SdrObject* pObject = aIter.Next(); - while (pObject) - { - if ( pObject->GetObjIdentifier() == OBJ_OLE2 && pDoc->IsChart(pObject) ) - { - if ( nPos == nIndex ) - { - uno::Reference < embed::XEmbeddedObject > xObj = ((SdrOle2Obj*)pObject)->GetObjRef(); - if ( xObj.is() ) - aName = pDocShell->GetEmbeddedObjectContainer().GetEmbeddedObjectName( xObj ); - break; // nicht weitersuchen - } - ++nPos; - } - pObject = aIter.Next(); - } - } - } - } - - if (aName.Len()) - return new ScChartObj( pDocShell, nTab, aName ); - return NULL; -} - -ScChartObj* ScChartsObj::GetObjectByName_Impl(const rtl::OUString& aName) const -{ - String aNameString(aName); - if ( lcl_FindChartObj( pDocShell, nTab, aNameString ) ) - return new ScChartObj( pDocShell, nTab, aNameString ); - return NULL; -} - -// XTableCharts - -void SAL_CALL ScChartsObj::addNewByName( const rtl::OUString& aName, - const awt::Rectangle& aRect, - const uno::Sequence<table::CellRangeAddress>& aRanges, - sal_Bool bColumnHeaders, sal_Bool bRowHeaders ) - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pDocShell) - return; - - ScDocument* pDoc = pDocShell->GetDocument(); - ScDrawLayer* pModel = pDocShell->MakeDrawLayer(); - SdrPage* pPage = pModel->GetPage(static_cast<sal_uInt16>(nTab)); - OSL_ENSURE(pPage,"addChart: keine Page"); - if (!pPage || !pDoc) - return; - - // chart can't be inserted if any ole object with that name exists on any table - // (empty string: generate valid name) - - String aNameString(aName); - SCTAB nDummy; - if ( aNameString.Len() && pModel->GetNamedObject( aNameString, OBJ_OLE2, nDummy ) ) - { - // object exists - only RuntimeException is specified - throw uno::RuntimeException(); - } - - ScRangeList* pList = new ScRangeList; - sal_uInt16 nRangeCount = (sal_uInt16)aRanges.getLength(); - if (nRangeCount) - { - const table::CellRangeAddress* pAry = aRanges.getConstArray(); - for (sal_uInt16 i=0; i<nRangeCount; i++) - { - ScRange aRange( static_cast<SCCOL>(pAry[i].StartColumn), pAry[i].StartRow, pAry[i].Sheet, - static_cast<SCCOL>(pAry[i].EndColumn), pAry[i].EndRow, pAry[i].Sheet ); - pList->Append( aRange ); - } - } - ScRangeListRef xNewRanges( pList ); - - uno::Reference < embed::XEmbeddedObject > xObj; - ::rtl::OUString aTmp( aNameString ); - if ( SvtModuleOptions().IsChart() ) - xObj = pDocShell->GetEmbeddedObjectContainer().CreateEmbeddedObject( SvGlobalName( SO3_SCH_CLASSID ).GetByteSequence(), aTmp ); - if ( xObj.is() ) - { - String aObjName = aTmp; // wirklich eingefuegter Name... - - // Rechteck anpassen - //! Fehler/Exception, wenn leer/ungueltig ??? - Point aRectPos( aRect.X, aRect.Y ); - bool bLayoutRTL = pDoc->IsLayoutRTL( nTab ); - if ( ( aRectPos.X() < 0 && !bLayoutRTL ) || ( aRectPos.X() > 0 && bLayoutRTL ) ) aRectPos.X() = 0; - if (aRectPos.Y() < 0) aRectPos.Y() = 0; - Size aRectSize( aRect.Width, aRect.Height ); - if (aRectSize.Width() <= 0) aRectSize.Width() = 5000; // Default-Groesse - if (aRectSize.Height() <= 0) aRectSize.Height() = 5000; - Rectangle aInsRect( aRectPos, aRectSize ); - - sal_Int64 nAspect(embed::Aspects::MSOLE_CONTENT); - MapUnit aMapUnit(VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) )); - Size aSize(aInsRect.GetSize()); - aSize = Window::LogicToLogic( aSize, MapMode( MAP_100TH_MM ), MapMode( aMapUnit ) ); - awt::Size aSz; - aSz.Width = aSize.Width(); - aSz.Height = aSize.Height(); - - // Calc -> DataProvider - uno::Reference< chart2::data::XDataProvider > xDataProvider = new - ScChart2DataProvider( pDoc ); - // Chart -> DataReceiver - uno::Reference< chart2::data::XDataReceiver > xReceiver; - uno::Reference< embed::XComponentSupplier > xCompSupp( xObj, uno::UNO_QUERY ); - if( xCompSupp.is()) - xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY ); - if( xReceiver.is()) - { - String sRangeStr; - xNewRanges->Format(sRangeStr, SCR_ABS_3D, pDoc); - - // connect - if( sRangeStr.Len() ) - xReceiver->attachDataProvider( xDataProvider ); - else - sRangeStr = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( "all" ) ); - - uno::Reference< util::XNumberFormatsSupplier > xNumberFormatsSupplier( pDocShell->GetModel(), uno::UNO_QUERY ); - xReceiver->attachNumberFormatsSupplier( xNumberFormatsSupplier ); - - // set arguments - uno::Sequence< beans::PropertyValue > aArgs( 4 ); - aArgs[0] = beans::PropertyValue( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CellRangeRepresentation")), -1, - uno::makeAny( ::rtl::OUString( sRangeStr )), beans::PropertyState_DIRECT_VALUE ); - aArgs[1] = beans::PropertyValue( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HasCategories")), -1, - uno::makeAny( bRowHeaders ), beans::PropertyState_DIRECT_VALUE ); - aArgs[2] = beans::PropertyValue( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FirstCellAsLabel")), -1, - uno::makeAny( bColumnHeaders ), beans::PropertyState_DIRECT_VALUE ); - aArgs[3] = beans::PropertyValue( - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataRowSource")), -1, - uno::makeAny( chart::ChartDataRowSource_COLUMNS ), beans::PropertyState_DIRECT_VALUE ); - xReceiver->setArguments( aArgs ); - } - - ScChartListener* pChartListener = - new ScChartListener( aObjName, pDoc, xNewRanges ); - pDoc->GetChartListenerCollection()->Insert( pChartListener ); - pChartListener->StartListeningTo(); - - SdrOle2Obj* pObj = new SdrOle2Obj( ::svt::EmbeddedObjectRef( xObj, embed::Aspects::MSOLE_CONTENT ), aObjName, aInsRect ); - - // set VisArea - if( xObj.is()) - xObj->setVisualAreaSize( nAspect, aSz ); - - pPage->InsertObject( pObj ); - pModel->AddUndo( new SdrUndoInsertObj( *pObj ) ); //! Undo-Kommentar? - } -} - -void SAL_CALL ScChartsObj::removeByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aName); - SdrOle2Obj* pObj = lcl_FindChartObj( pDocShell, nTab, aNameString ); - if (pObj) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDrawLayer* pModel = pDoc->GetDrawLayer(); // ist nicht 0 - SdrPage* pPage = pModel->GetPage(static_cast<sal_uInt16>(nTab)); // ist nicht 0 - - pModel->AddUndo( new SdrUndoDelObj( *pObj ) ); - pPage->RemoveObject( pObj->GetOrdNum() ); - - //! Notify etc.??? - } -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScChartsObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.table.TableChartsEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScChartsObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Int32 nCount = 0; - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); - if (pDrawLayer) - { - SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); - OSL_ENSURE(pPage, "Page nicht gefunden"); - if (pPage) - { - SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); - SdrObject* pObject = aIter.Next(); - while (pObject) - { - if ( pObject->GetObjIdentifier() == OBJ_OLE2 && pDoc->IsChart(pObject) ) - ++nCount; - pObject = aIter.Next(); - } - } - } - } - return nCount; -} - -uno::Any SAL_CALL ScChartsObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<table::XTableChart> xChart(GetObjectByIndex_Impl(nIndex)); - if (xChart.is()) - return uno::makeAny(xChart); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScChartsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<table::XTableChart>*)0); -} - -sal_Bool SAL_CALL ScChartsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCount() != 0; -} - -uno::Any SAL_CALL ScChartsObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<table::XTableChart> xChart(GetObjectByName_Impl(aName)); - if (xChart.is()) - return uno::makeAny(xChart); - else - throw container::NoSuchElementException(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScChartsObj::getElementNames() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - - long nCount = getCount(); - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pAry = aSeq.getArray(); - - long nPos = 0; - ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); - if (pDrawLayer) - { - SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); - OSL_ENSURE(pPage, "Page nicht gefunden"); - if (pPage) - { - SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS ); - SdrObject* pObject = aIter.Next(); - while (pObject) - { - if ( pObject->GetObjIdentifier() == OBJ_OLE2 && pDoc->IsChart(pObject) ) - { - String aName; - uno::Reference < embed::XEmbeddedObject > xObj = ((SdrOle2Obj*)pObject)->GetObjRef(); - if ( xObj.is() ) - aName = pDocShell->GetEmbeddedObjectContainer().GetEmbeddedObjectName( xObj ); - - OSL_ENSURE(nPos<nCount, "huch, verzaehlt?"); - pAry[nPos++] = aName; - } - pObject = aIter.Next(); - } - } - } - OSL_ENSURE(nPos==nCount, "nanu, verzaehlt?"); - - return aSeq; - } - return uno::Sequence<rtl::OUString>(0); -} - -sal_Bool SAL_CALL ScChartsObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aName); - return ( lcl_FindChartObj( pDocShell, nTab, aNameString ) != NULL ); -} - -//------------------------------------------------------------------------ - -ScChartObj::ScChartObj(ScDocShell* pDocSh, SCTAB nT, const String& rN) - :ScChartObj_Base( m_aMutex ) - ,ScChartObj_PBase( ScChartObj_Base::rBHelper ) - ,pDocShell( pDocSh ) - ,nTab( nT ) - ,aChartName( rN ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); - - uno::Sequence< table::CellRangeAddress > aInitialPropValue; - registerPropertyNoMember( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "RelatedCellRanges" )), - PROP_HANDLE_RELATED_CELLRANGES, beans::PropertyAttribute::MAYBEVOID, - ::getCppuType( &aInitialPropValue ), &aInitialPropValue ); -} - -ScChartObj::~ScChartObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScChartObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! Referenz-Update - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -void ScChartObj::GetData_Impl( ScRangeListRef& rRanges, bool& rColHeaders, bool& rRowHeaders ) const -{ - bool bFound = false; - ScDocument* pDoc = (pDocShell? pDocShell->GetDocument(): 0); - - if( pDoc ) - { - uno::Reference< chart2::XChartDocument > xChartDoc( pDoc->GetChartByName( aChartName ) ); - if( xChartDoc.is() ) - { - uno::Reference< chart2::data::XDataReceiver > xReceiver( xChartDoc, uno::UNO_QUERY ); - uno::Reference< chart2::data::XDataProvider > xProvider = xChartDoc->getDataProvider(); - if( xReceiver.is() && xProvider.is() ) - { - uno::Sequence< beans::PropertyValue > aArgs( xProvider->detectArguments( xReceiver->getUsedData() ) ); - - rtl::OUString aRanges; - chart::ChartDataRowSource eDataRowSource = chart::ChartDataRowSource_COLUMNS; - bool bHasCategories=false; - bool bFirstCellAsLabel=false; - const beans::PropertyValue* pPropArray = aArgs.getConstArray(); - long nPropCount = aArgs.getLength(); - for (long i = 0; i < nPropCount; i++) - { - const beans::PropertyValue& rProp = pPropArray[i]; - String aPropName(rProp.Name); - - if (aPropName.EqualsAscii( "CellRangeRepresentation" )) - rProp.Value >>= aRanges; - else if (aPropName.EqualsAscii( "DataRowSource" )) - eDataRowSource = (chart::ChartDataRowSource)ScUnoHelpFunctions::GetEnumFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( "HasCategories" )) - bHasCategories = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( "FirstCellAsLabel" )) - bFirstCellAsLabel = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - } - - if( chart::ChartDataRowSource_COLUMNS == eDataRowSource ) - { - rColHeaders=bFirstCellAsLabel; - rRowHeaders=bHasCategories; - } - else - { - rColHeaders=bHasCategories; - rRowHeaders=bFirstCellAsLabel; - } - rRanges->Parse( aRanges, pDoc); - } - bFound = true; - } - } - if( !bFound ) - { - rRanges = 0; - rColHeaders = false; - rRowHeaders = false; - } -} - -void ScChartObj::Update_Impl( const ScRangeListRef& rRanges, bool bColHeaders, bool bRowHeaders ) -{ - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Bool bUndo(pDoc->IsUndoEnabled()); - - if (bUndo) - { - pDocShell->GetUndoManager()->AddUndoAction( - new ScUndoChartData( pDocShell, aChartName, rRanges, bColHeaders, bRowHeaders, false ) ); - } - pDoc->UpdateChartArea( aChartName, rRanges, bColHeaders, bRowHeaders, false ); - } -} - -// ::comphelper::OPropertySetHelper - -::cppu::IPropertyArrayHelper& ScChartObj::getInfoHelper() -{ - return *ScChartObj_PABase::getArrayHelper(); -} - -void ScChartObj::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const uno::Any& rValue ) throw (uno::Exception) -{ - switch ( nHandle ) - { - case PROP_HANDLE_RELATED_CELLRANGES: - { - uno::Sequence< table::CellRangeAddress > aCellRanges; - if ( rValue >>= aCellRanges ) - { - ScRangeListRef rRangeList = new ScRangeList(); - const table::CellRangeAddress* pCellRanges = aCellRanges.getArray(); - sal_Int32 nCount = aCellRanges.getLength(); - for ( sal_Int32 i = 0; i < nCount; ++i ) - { - table::CellRangeAddress aCellRange = pCellRanges[ i ]; - ScRange aRange; - ScUnoConversion::FillScRange( aRange, aCellRange ); - rRangeList->Append( aRange ); - } - ScDocument* pDoc = ( pDocShell ? pDocShell->GetDocument() : NULL ); - ScChartListenerCollection* pCollection = ( pDoc ? pDoc->GetChartListenerCollection() : NULL ); - if ( pCollection ) - { - pCollection->ChangeListening( aChartName, rRangeList ); - } - } - } - break; - default: - break; - } -} - -void ScChartObj::getFastPropertyValue( uno::Any& rValue, sal_Int32 nHandle ) const -{ - switch ( nHandle ) - { - case PROP_HANDLE_RELATED_CELLRANGES: - { - ScDocument* pDoc = ( pDocShell ? pDocShell->GetDocument() : NULL ); - if ( pDoc ) - { - ScRange aEmptyRange; - sal_uInt16 nIndex = 0; - ScChartListener aSearcher( aChartName, pDoc, aEmptyRange ); - ScChartListenerCollection* pCollection = pDoc->GetChartListenerCollection(); - if ( pCollection && pCollection->Search( &aSearcher, nIndex ) ) - { - ScChartListener* pListener = static_cast< ScChartListener* >( pCollection->At( nIndex ) ); - if ( pListener ) - { - const ScRangeListRef& rRangeList = pListener->GetRangeList(); - if ( rRangeList.Is() ) - { - size_t nCount = rRangeList->size(); - uno::Sequence< table::CellRangeAddress > aCellRanges( nCount ); - table::CellRangeAddress* pCellRanges = aCellRanges.getArray(); - for ( size_t i = 0; i < nCount; ++i ) - { - ScRange aRange( *(*rRangeList)[i] ); - table::CellRangeAddress aCellRange; - ScUnoConversion::FillApiRange( aCellRange, aRange ); - pCellRanges[ i ] = aCellRange; - } - rValue <<= aCellRanges; - } - } - } - } - } - break; - default: - break; - } -} - -// ::comphelper::OPropertyArrayUsageHelper - -::cppu::IPropertyArrayHelper* ScChartObj::createArrayHelper() const -{ - uno::Sequence< beans::Property > aProps; - describeProperties( aProps ); - return new ::cppu::OPropertyArrayHelper( aProps ); -} - -// XInterface - -IMPLEMENT_FORWARD_XINTERFACE2( ScChartObj, ScChartObj_Base, ScChartObj_PBase ) - -// XTypeProvider - -IMPLEMENT_FORWARD_XTYPEPROVIDER2( ScChartObj, ScChartObj_Base, ScChartObj_PBase ) - -// XComponent - -void ScChartObj::disposing() -{ - ScChartObj_Base::disposing(); -} - -// XTableChart - -sal_Bool SAL_CALL ScChartObj::getHasColumnHeaders() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRangeListRef xRanges = new ScRangeList; - bool bColHeaders, bRowHeaders; - GetData_Impl( xRanges, bColHeaders, bRowHeaders ); - return bColHeaders; -} - -void SAL_CALL ScChartObj::setHasColumnHeaders( sal_Bool bHasColumnHeaders ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRangeListRef xRanges = new ScRangeList; - bool bOldColHeaders, bOldRowHeaders; - GetData_Impl( xRanges, bOldColHeaders, bOldRowHeaders ); - if ( bOldColHeaders != (bHasColumnHeaders != false) ) - Update_Impl( xRanges, bHasColumnHeaders, bOldRowHeaders ); -} - -sal_Bool SAL_CALL ScChartObj::getHasRowHeaders() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRangeListRef xRanges = new ScRangeList; - bool bColHeaders, bRowHeaders; - GetData_Impl( xRanges, bColHeaders, bRowHeaders ); - return bRowHeaders; -} - -void SAL_CALL ScChartObj::setHasRowHeaders( sal_Bool bHasRowHeaders ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRangeListRef xRanges = new ScRangeList; - bool bOldColHeaders, bOldRowHeaders; - GetData_Impl( xRanges, bOldColHeaders, bOldRowHeaders ); - if ( bOldRowHeaders != (bHasRowHeaders != false) ) - Update_Impl( xRanges, bOldColHeaders, bHasRowHeaders ); -} - -uno::Sequence<table::CellRangeAddress> SAL_CALL ScChartObj::getRanges() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRangeListRef xRanges = new ScRangeList; - bool bColHeaders, bRowHeaders; - GetData_Impl( xRanges, bColHeaders, bRowHeaders ); - if ( xRanges.Is() ) - { - size_t nCount = xRanges->size(); - - table::CellRangeAddress aRangeAddress; - uno::Sequence<table::CellRangeAddress> aSeq(nCount); - table::CellRangeAddress* pAry = aSeq.getArray(); - for (size_t i = 0; i < nCount; i++) - { - ScRange aRange( *(*xRanges)[i] ); - - aRangeAddress.Sheet = aRange.aStart.Tab(); - aRangeAddress.StartColumn = aRange.aStart.Col(); - aRangeAddress.StartRow = aRange.aStart.Row(); - aRangeAddress.EndColumn = aRange.aEnd.Col(); - aRangeAddress.EndRow = aRange.aEnd.Row(); - - pAry[i] = aRangeAddress; - } - return aSeq; - } - - OSL_FAIL("ScChartObj::getRanges: keine Ranges"); - return uno::Sequence<table::CellRangeAddress>(); -} - -void SAL_CALL ScChartObj::setRanges( const uno::Sequence<table::CellRangeAddress>& aRanges ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRangeListRef xOldRanges = new ScRangeList; - bool bColHeaders, bRowHeaders; - GetData_Impl( xOldRanges, bColHeaders, bRowHeaders ); - - ScRangeList* pList = new ScRangeList; - sal_uInt16 nRangeCount = (sal_uInt16)aRanges.getLength(); - if (nRangeCount) - { - const table::CellRangeAddress* pAry = aRanges.getConstArray(); - for (sal_uInt16 i=0; i<nRangeCount; i++) - { - ScRange aRange( static_cast<SCCOL>(pAry[i].StartColumn), pAry[i].StartRow, pAry[i].Sheet, - static_cast<SCCOL>(pAry[i].EndColumn), pAry[i].EndRow, pAry[i].Sheet ); - pList->Append( aRange ); - } - } - ScRangeListRef xNewRanges( pList ); - - if ( !xOldRanges.Is() || *xOldRanges != *xNewRanges ) - Update_Impl( xNewRanges, bColHeaders, bRowHeaders ); -} - -// XEmbeddedObjectSupplier - -uno::Reference<lang::XComponent> SAL_CALL ScChartObj::getEmbeddedObject() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SdrOle2Obj* pObject = lcl_FindChartObj( pDocShell, nTab, aChartName ); - if ( pObject && svt::EmbeddedObjectRef::TryRunningState( pObject->GetObjRef() ) ) - { - //TODO/LATER: is it OK that something is returned for *all* objects, not only own objects? - return uno::Reference < lang::XComponent > ( pObject->GetObjRef()->getComponent(), uno::UNO_QUERY ); - } - - return NULL; -} - -// XNamed - -rtl::OUString SAL_CALL ScChartObj::getName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aChartName; -} - -void SAL_CALL ScChartObj::setName( const rtl::OUString& /* aName */ ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - throw uno::RuntimeException(); // name cannot be changed -} - -// XPropertySet - -uno::Reference< beans::XPropertySetInfo > ScChartObj::getPropertySetInfo() throw (uno::RuntimeException) -{ - return createPropertySetInfo( getInfoHelper() ) ; -} - -//------------------------------------------------------------------------ - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/confuno.cxx b/sc/source/ui/unoobj/confuno.cxx deleted file mode 100644 index b9ea31c86..000000000 --- a/sc/source/ui/unoobj/confuno.cxx +++ /dev/null @@ -1,487 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include "confuno.hxx" -#include "unonames.hxx" -#include "scdll.hxx" -#include "docsh.hxx" -#include "miscuno.hxx" -#include "forbiuno.hxx" -#include "viewopti.hxx" -#include "docpool.hxx" -#include "sc.hrc" - -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <sfx2/printer.hxx> -#include <xmloff/xmluconv.hxx> -#include <rtl/ustrbuf.hxx> -#include <vcl/svapp.hxx> - -using namespace com::sun::star; - -#define SCCOMPSCPREADSHEETSETTINGS_SERVICE "com.sun.star.comp.SpreadsheetSettings" -#define SCDOCUMENTSETTINGS_SERVICE "com.sun.star.document.Settings" -#define SCSAVEVERSION "SaveVersionOnClose" - - -const SfxItemPropertyMapEntry* lcl_GetConfigPropertyMap() -{ - static SfxItemPropertyMapEntry aConfigPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_SHOWZERO), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWNOTES), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWGRID), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_GRIDCOLOR), 0, &getCppuType((sal_Int32*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWPAGEBR), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_LINKUPD), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_COLROWHDR), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHEETTABS), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_OUTLSYMB), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SNAPTORASTER), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_RASTERVIS), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_RASTERRESX), 0, &getCppuType((sal_Int32*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_RASTERRESY), 0, &getCppuType((sal_Int32*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_RASTERSUBX), 0, &getCppuType((sal_Int32*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_RASTERSUBY), 0, &getCppuType((sal_Int32*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_RASTERSYNC), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_AUTOCALC), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_PRINTERNAME), 0, &getCppuType((rtl::OUString*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_PRINTERSETUP), 0, &getCppuType((uno::Sequence<sal_Int8>*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_APPLYDOCINF), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_FORBIDDEN), 0, &getCppuType((uno::Reference<i18n::XForbiddenCharacters>*)0), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN(SC_UNO_CHARCOMP), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ASIANKERN), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SCSAVEVERSION), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_UPDTEMPL), 0, &getBooleanCppuType(), 0, 0}, - /*Stampit enable/disable print cancel */ - {MAP_CHAR_LEN(SC_UNO_ALLOWPRINTJOBCANCEL), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_LOADREADONLY), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHAREDOC), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_MODIFYPASSWORDINFO), 0, &getCppuType((uno::Sequence< beans::PropertyValue >*)0), 0, 0}, - {0,0,0,0,0,0} - }; - return aConfigPropertyMap_Impl; -} - -//------------------------------------------------------------------------ - -ScDocumentConfiguration::ScDocumentConfiguration(ScDocShell* pDocSh) - : pDocShell(pDocSh) , - aPropSet ( lcl_GetConfigPropertyMap() ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDocumentConfiguration::~ScDocumentConfiguration() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScDocumentConfiguration::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScDocumentConfiguration::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScDocumentConfiguration::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if(pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if (pDoc) - { - sal_Bool bUpdateHeights = false; - - ScViewOptions aViewOpt(pDoc->GetViewOptions()); - - /*Stampit enable/disable print cancel */ - if ( aPropertyName.compareToAscii( SC_UNO_ALLOWPRINTJOBCANCEL ) == 0 ) - pDocShell->Stamp_SetPrintCancelState( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - /*Stampit enable/disable print cancel */ - - else if ( aPropertyName.compareToAscii( SC_UNO_SHOWZERO ) == 0 ) - aViewOpt.SetOption(VOPT_NULLVALS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_SHOWNOTES ) == 0 ) - aViewOpt.SetOption(VOPT_NOTES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_SHOWGRID ) == 0 ) - aViewOpt.SetOption(VOPT_GRID, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_GRIDCOLOR ) == 0 ) - { - sal_Int64 nColor = 0; - if (aValue >>= nColor) - { - String aColorName; - Color aColor(static_cast<sal_uInt32>(nColor)); - aViewOpt.SetGridColor(aColor, aColorName); - } - } - else if ( aPropertyName.compareToAscii( SC_UNO_SHOWPAGEBR ) == 0 ) - aViewOpt.SetOption(VOPT_PAGEBREAKS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aPropertyName.compareToAscii( SC_UNONAME_LINKUPD ) == 0 ) - pDoc->SetLinkMode( static_cast<ScLkUpdMode> ( ScUnoHelpFunctions::GetInt16FromAny( aValue ) ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_COLROWHDR ) == 0 ) - aViewOpt.SetOption(VOPT_HEADER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_SHEETTABS ) == 0 ) - aViewOpt.SetOption(VOPT_TABCONTROLS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_OUTLSYMB ) == 0 ) - aViewOpt.SetOption(VOPT_OUTLINER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_AUTOCALC ) == 0 ) - pDoc->SetAutoCalc( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_PRINTERNAME ) == 0 ) - { - rtl::OUString sPrinterName; - if ( aValue >>= sPrinterName ) - { - // #i75610# if the name is empty, do nothing (don't create any printer) - if ( sPrinterName.getLength() != 0 && pDocShell->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED ) - { - SfxPrinter* pPrinter = pDocShell->GetPrinter(); - if (pPrinter) - { - String aString(sPrinterName); - if (pPrinter->GetName() != aString) - { - SfxPrinter* pNewPrinter = new SfxPrinter( pPrinter->GetOptions().Clone(), aString ); - if (pNewPrinter->IsKnown()) - pDocShell->SetPrinter( pNewPrinter, SFX_PRINTER_PRINTER ); - else - delete pNewPrinter; - } - } - else - throw uno::RuntimeException(); - } - } - else - throw lang::IllegalArgumentException(); - } - else if ( aPropertyName.compareToAscii( SC_UNO_PRINTERSETUP ) == 0 ) - { - uno::Sequence<sal_Int8> aSequence; - if ( aValue >>= aSequence ) - { - sal_uInt32 nSize = aSequence.getLength(); - // #i75610# if the sequence is empty, do nothing (don't create any printer) - if ( nSize != 0 ) - { - SvMemoryStream aStream (aSequence.getArray(), nSize, STREAM_READ ); - aStream.Seek ( STREAM_SEEK_TO_BEGIN ); - SfxItemSet* pSet = new SfxItemSet( *pDoc->GetPool(), - SID_PRINTER_NOTFOUND_WARN, SID_PRINTER_NOTFOUND_WARN, - SID_PRINTER_CHANGESTODOC, SID_PRINTER_CHANGESTODOC, - SID_PRINT_SELECTEDSHEET, SID_PRINT_SELECTEDSHEET, - SID_SCPRINTOPTIONS, SID_SCPRINTOPTIONS, - NULL ); - pDocShell->SetPrinter( SfxPrinter::Create( aStream, pSet ) ); - } - } - } - else if ( aPropertyName.compareToAscii( SC_UNO_APPLYDOCINF ) == 0 ) - { - sal_Bool bTmp=sal_True; - if ( aValue >>= bTmp ) - pDocShell->SetUseUserData( bTmp ); - } - else if ( aPropertyName.compareToAscii( SC_UNO_FORBIDDEN ) == 0 ) - { - // read-only - should not be set - } - else if ( aPropertyName.compareToAscii( SC_UNO_CHARCOMP ) == 0 ) - { - // Int16 contains CharacterCompressionType values - sal_Int16 nUno = ScUnoHelpFunctions::GetInt16FromAny( aValue ); - pDoc->SetAsianCompression( (sal_uInt8) nUno ); - bUpdateHeights = sal_True; - } - else if ( aPropertyName.compareToAscii( SC_UNO_ASIANKERN ) == 0 ) - { - pDoc->SetAsianKerning( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - bUpdateHeights = sal_True; - } - else if ( aPropertyName.compareToAscii( SCSAVEVERSION ) == 0) - { - sal_Bool bTmp=false; - if ( aValue >>= bTmp ) - pDocShell->SetSaveVersionOnClose( bTmp ); - } - else if ( aPropertyName.compareToAscii( SC_UNO_UPDTEMPL ) == 0 ) - { - sal_Bool bTmp=sal_True; - if ( aValue >>= bTmp ) - pDocShell->SetQueryLoadTemplate( bTmp ); - } - else if ( aPropertyName.compareToAscii( SC_UNO_LOADREADONLY ) == 0 ) - { - sal_Bool bTmp=false; - if ( aValue >>= bTmp ) - pDocShell->SetLoadReadonly( bTmp ); - } - else if ( aPropertyName.compareToAscii( SC_UNO_SHAREDOC ) == 0 ) - { - sal_Bool bDocShared = false; - if ( aValue >>= bDocShared ) - { - pDocShell->SetSharedXMLFlag( bDocShared ); - } - } - else if ( aPropertyName.compareToAscii( SC_UNO_MODIFYPASSWORDINFO ) == 0 ) - { - uno::Sequence< beans::PropertyValue > aInfo; - if ( !( aValue >>= aInfo ) ) - throw lang::IllegalArgumentException( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Value of type Sequence<PropertyValue> expected!" ) ), - uno::Reference< uno::XInterface >(), - 2 ); - - if ( !pDocShell->SetModifyPasswordInfo( aInfo ) ) - throw beans::PropertyVetoException( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "The hash is not allowed to be changed now!" ) ), - uno::Reference< uno::XInterface >() ); - } - else - { - ScGridOptions aGridOpt(aViewOpt.GetGridOptions()); - if ( aPropertyName.compareToAscii( SC_UNO_SNAPTORASTER ) == 0 ) - aGridOpt.SetUseGridSnap( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERVIS ) == 0 ) - aGridOpt.SetGridVisible( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERRESX ) == 0 ) - aGridOpt.SetFldDrawX( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( aValue ) ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERRESY ) == 0 ) - aGridOpt.SetFldDrawY( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( aValue ) ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERSUBX ) == 0 ) - aGridOpt.SetFldDivisionX( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( aValue ) ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERSUBY ) == 0 ) - aGridOpt.SetFldDivisionY( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( aValue ) ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERSYNC ) == 0 ) - aGridOpt.SetSynchronize( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else - throw beans::UnknownPropertyException(); - aViewOpt.SetGridOptions(aGridOpt); - } - pDoc->SetViewOptions(aViewOpt); - - if ( bUpdateHeights && !pDoc->IsImportingXML() ) - { - // update automatic row heights and repaint - SCTAB nTabCount = pDoc->GetTableCount(); - for (SCTAB nTab=0; nTab<nTabCount; nTab++) - if ( !pDocShell->AdjustRowHeight( 0, MAXROW, nTab ) ) - pDocShell->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID ); - pDocShell->SetDocumentModified(); - } - } - else - throw uno::RuntimeException(); - } - else - throw uno::RuntimeException(); -} - -uno::Any SAL_CALL ScDocumentConfiguration::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aRet; - - if(pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if (pDoc) - { - const ScViewOptions& aViewOpt = pDoc->GetViewOptions(); - - /*Stampit enable/disable print cancel */ - if ( aPropertyName.compareToAscii( SC_UNO_ALLOWPRINTJOBCANCEL ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, pDocShell->Stamp_GetPrintCancelState() ); - /*Stampit enable/disable print cancel */ - - else if ( aPropertyName.compareToAscii( SC_UNO_SHOWZERO ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, aViewOpt.GetOption( VOPT_NULLVALS ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_SHOWNOTES ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, aViewOpt.GetOption( VOPT_NOTES ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_SHOWGRID ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, aViewOpt.GetOption( VOPT_GRID ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_GRIDCOLOR ) == 0 ) - { - String aColorName; - Color aColor = aViewOpt.GetGridColor(&aColorName); - aRet <<= static_cast<sal_Int64>(aColor.GetColor()); - } - else if ( aPropertyName.compareToAscii( SC_UNO_SHOWPAGEBR ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, aViewOpt.GetOption( VOPT_PAGEBREAKS ) ); - else if ( aPropertyName.compareToAscii( SC_UNONAME_LINKUPD ) == 0 ) - aRet <<= static_cast<sal_Int16> ( pDoc->GetLinkMode() ); - else if ( aPropertyName.compareToAscii( SC_UNO_COLROWHDR ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, aViewOpt.GetOption( VOPT_HEADER ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_SHEETTABS ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, aViewOpt.GetOption( VOPT_TABCONTROLS ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_OUTLSYMB ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, aViewOpt.GetOption( VOPT_OUTLINER ) ); - else if ( aPropertyName.compareToAscii( SC_UNO_AUTOCALC ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, pDoc->GetAutoCalc() ); - else if ( aPropertyName.compareToAscii( SC_UNO_PRINTERNAME ) == 0 ) - { - // #i75610# don't create the printer, return empty string if no printer created yet - // (as in SwXDocumentSettings) - SfxPrinter* pPrinter = pDoc->GetPrinter( false ); - if (pPrinter) - aRet <<= rtl::OUString ( pPrinter->GetName()); - else - aRet <<= rtl::OUString(); - } - else if ( aPropertyName.compareToAscii( SC_UNO_PRINTERSETUP ) == 0 ) - { - // #i75610# don't create the printer, return empty sequence if no printer created yet - // (as in SwXDocumentSettings) - SfxPrinter* pPrinter = pDoc->GetPrinter( false ); - if (pPrinter) - { - SvMemoryStream aStream; - pPrinter->Store( aStream ); - aStream.Seek ( STREAM_SEEK_TO_END ); - sal_uInt32 nSize = aStream.Tell(); - aStream.Seek ( STREAM_SEEK_TO_BEGIN ); - uno::Sequence < sal_Int8 > aSequence( nSize ); - aStream.Read ( aSequence.getArray(), nSize ); - aRet <<= aSequence; - } - else - aRet <<= uno::Sequence<sal_Int8>(); - } - else if ( aPropertyName.compareToAscii( SC_UNO_APPLYDOCINF ) == 0 ) - aRet <<= pDocShell->IsUseUserData(); - else if ( aPropertyName.compareToAscii( SC_UNO_FORBIDDEN ) == 0 ) - { - aRet <<= uno::Reference<i18n::XForbiddenCharacters>(new ScForbiddenCharsObj( pDocShell )); - } - else if ( aPropertyName.compareToAscii( SC_UNO_CHARCOMP ) == 0 ) - aRet <<= static_cast<sal_Int16> ( pDoc->GetAsianCompression() ); - else if ( aPropertyName.compareToAscii( SC_UNO_ASIANKERN ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, pDoc->GetAsianKerning() ); - else if ( aPropertyName.compareToAscii( SCSAVEVERSION ) == 0) - aRet <<= pDocShell->IsSaveVersionOnClose(); - else if ( aPropertyName.compareToAscii( SC_UNO_UPDTEMPL ) == 0 ) - aRet <<= pDocShell->IsQueryLoadTemplate(); - else if ( aPropertyName.compareToAscii( SC_UNO_LOADREADONLY ) == 0 ) - aRet <<= pDocShell->IsLoadReadonly(); - else if ( aPropertyName.compareToAscii( SC_UNO_SHAREDOC ) == 0 ) - { - ScUnoHelpFunctions::SetBoolInAny( aRet, pDocShell->HasSharedXMLFlagSet() ); - } - else if ( aPropertyName.compareToAscii( SC_UNO_MODIFYPASSWORDINFO ) == 0 ) - aRet <<= pDocShell->GetModifyPasswordInfo(); - else - { - const ScGridOptions& aGridOpt = aViewOpt.GetGridOptions(); - if ( aPropertyName.compareToAscii( SC_UNO_SNAPTORASTER ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, aGridOpt.GetUseGridSnap() ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERVIS ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, aGridOpt.GetGridVisible() ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERRESX ) == 0 ) - aRet <<= static_cast<sal_Int32> ( aGridOpt.GetFldDrawX() ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERRESY ) == 0 ) - aRet <<= static_cast<sal_Int32> ( aGridOpt.GetFldDrawY() ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERSUBX ) == 0 ) - aRet <<= static_cast<sal_Int32> ( aGridOpt.GetFldDivisionX() ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERSUBY ) == 0 ) - aRet <<= static_cast<sal_Int32> ( aGridOpt.GetFldDivisionY() ); - else if ( aPropertyName.compareToAscii( SC_UNO_RASTERSYNC ) == 0 ) - ScUnoHelpFunctions::SetBoolInAny( aRet, aGridOpt.GetSynchronize() ); - else - throw beans::UnknownPropertyException(); - } - } - else - throw uno::RuntimeException(); - } - else - throw uno::RuntimeException(); - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScDocumentConfiguration ) - -// XServiceInfo - -rtl::OUString SAL_CALL ScDocumentConfiguration::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScDocumentConfiguration" )); -} - -sal_Bool SAL_CALL ScDocumentConfiguration::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr( rServiceName ); - return aServiceStr.EqualsAscii( SCCOMPSCPREADSHEETSETTINGS_SERVICE ) || - aServiceStr.EqualsAscii( SCDOCUMENTSETTINGS_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScDocumentConfiguration::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(2); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCOMPSCPREADSHEETSETTINGS_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCDOCUMENTSETTINGS_SERVICE )); - return aRet; -} - -//------------------------------------------------------------------------- - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/convuno.cxx b/sc/source/ui/unoobj/convuno.cxx deleted file mode 100644 index 2f7fdd7e7..000000000 --- a/sc/source/ui/unoobj/convuno.cxx +++ /dev/null @@ -1,65 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <i18npool/mslangid.hxx> - -#include "convuno.hxx" -#include "global.hxx" - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -// everything is static... - -LanguageType ScUnoConversion::GetLanguage( const lang::Locale& rLocale ) -{ - // empty language -> LANGUAGE_SYSTEM - if ( rLocale.Language.getLength() == 0 ) - return LANGUAGE_SYSTEM; - - LanguageType eRet = MsLangId::convertLocaleToLanguage( rLocale ); - if ( eRet == LANGUAGE_NONE ) - eRet = LANGUAGE_SYSTEM; //! or throw an exception? - - return eRet; -} - -void ScUnoConversion::FillLocale( lang::Locale& rLocale, LanguageType eLang ) -{ - MsLangId::convertLanguageToLocale( eLang, rLocale ); -} - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/cursuno.cxx b/sc/source/ui/unoobj/cursuno.cxx deleted file mode 100644 index 84fe95124..000000000 --- a/sc/source/ui/unoobj/cursuno.cxx +++ /dev/null @@ -1,511 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include "scitems.hxx" -#include <svl/intitem.hxx> -#include <svl/zforlist.hxx> -#include <vcl/svapp.hxx> -#include <comphelper/servicehelper.hxx> - -#include "cursuno.hxx" -#include "cellsuno.hxx" -#include "docsh.hxx" -#include "hints.hxx" -#include "markdata.hxx" -#include "dociter.hxx" -#include "miscuno.hxx" - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -#define SCSHEETCELLCURSOR_SERVICE "com.sun.star.sheet.SheetCellCursor" -#define SCCELLCURSOR_SERVICE "com.sun.star.table.CellCursor" - -//------------------------------------------------------------------------ - -ScCellCursorObj::ScCellCursorObj(ScDocShell* pDocSh, const ScRange& rR) : - ScCellRangeObj( pDocSh, rR ) -{ -} - -ScCellCursorObj::~ScCellCursorObj() -{ -} - -uno::Any SAL_CALL ScCellCursorObj::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( sheet::XSheetCellCursor ) - SC_QUERYINTERFACE( sheet::XUsedAreaCursor ) - SC_QUERYINTERFACE( table::XCellCursor ) - - return ScCellRangeObj::queryInterface( rType ); -} - -void SAL_CALL ScCellCursorObj::acquire() throw() -{ - ScCellRangeObj::acquire(); -} - -void SAL_CALL ScCellCursorObj::release() throw() -{ - ScCellRangeObj::release(); -} - -uno::Sequence<uno::Type> SAL_CALL ScCellCursorObj::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - uno::Sequence<uno::Type> aParentTypes(ScCellRangeObj::getTypes()); - long nParentLen = aParentTypes.getLength(); - const uno::Type* pParentPtr = aParentTypes.getConstArray(); - - aTypes.realloc( nParentLen + 3 ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSheetCellCursor>*)0); - pPtr[nParentLen + 1] = getCppuType((const uno::Reference<sheet::XUsedAreaCursor>*)0); - pPtr[nParentLen + 2] = getCppuType((const uno::Reference<table::XCellCursor>*)0); - - for (long i=0; i<nParentLen; i++) - pPtr[i] = pParentPtr[i]; // parent types first - } - return aTypes; -} - -namespace -{ - class theScCellCursorObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScCellCursorObjImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScCellCursorObj::getImplementationId() throw(uno::RuntimeException) -{ - return theScCellCursorObjImplementationId::get().getSeq(); -} - -// XSheetCellCursor - -void SAL_CALL ScCellCursorObj::collapseToCurrentRegion() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aOneRange( *rRanges[ 0 ] ); - - aOneRange.Justify(); - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - SCCOL nStartCol = aOneRange.aStart.Col(); - SCROW nStartRow = aOneRange.aStart.Row(); - SCCOL nEndCol = aOneRange.aEnd.Col(); - SCROW nEndRow = aOneRange.aEnd.Row(); - SCTAB nTab = aOneRange.aStart.Tab(); - - pDocSh->GetDocument()->GetDataArea( - nTab, nStartCol, nStartRow, nEndCol, nEndRow, sal_True, false ); - - ScRange aNew( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab ); - SetNewRange( aNew ); - } -} - -void SAL_CALL ScCellCursorObj::collapseToCurrentArray() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aOneRange( *rRanges[ 0 ] ); - - aOneRange.Justify(); - ScAddress aCursor(aOneRange.aStart); // use the start address of the range - - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - ScRange aMatrix; - - // finding the matrix range is now in GetMatrixFormulaRange in the document - if ( pDoc->GetMatrixFormulaRange( aCursor, aMatrix ) ) - { - SetNewRange( aMatrix ); - } - } - // thats a Bug, that this assertion comes; the API Reference says, that - // if there is no Matrix, the Range is left unchanged; they says nothing - // about a exception - /*if (!bFound) - { - OSL_FAIL("keine Matrix"); - //! Exception, oder was? - }*/ -} - -void SAL_CALL ScCellCursorObj::collapseToMergedArea() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aNewRange( *rRanges[ 0 ] ); - - ScDocument* pDoc = pDocSh->GetDocument(); - pDoc->ExtendOverlapped( aNewRange ); - pDoc->ExtendMerge( aNewRange ); // after ExtendOverlapped! - - SetNewRange( aNewRange ); - } -} - -void SAL_CALL ScCellCursorObj::expandToEntireColumns() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aNewRange( *rRanges[ 0 ] ); - - aNewRange.aStart.SetRow( 0 ); - aNewRange.aEnd.SetRow( MAXROW ); - - SetNewRange( aNewRange ); -} - -void SAL_CALL ScCellCursorObj::expandToEntireRows() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aNewRange( *rRanges[ 0 ] ); - - aNewRange.aStart.SetCol( 0 ); - aNewRange.aEnd.SetCol( MAXCOL ); - - SetNewRange( aNewRange ); -} - -void SAL_CALL ScCellCursorObj::collapseToSize( sal_Int32 nColumns, sal_Int32 nRows ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( nColumns <= 0 || nRows <= 0 ) - { - OSL_FAIL("leerer Range geht nicht"); - //! und dann? - } - else - { - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aNewRange( *rRanges[ 0 ] ); - - aNewRange.Justify(); //! wirklich? - - long nEndX = aNewRange.aStart.Col() + nColumns - 1; - long nEndY = aNewRange.aStart.Row() + nRows - 1; - if ( nEndX < 0 ) nEndX = 0; - if ( nEndX > MAXCOL ) nEndX = MAXCOL; - if ( nEndY < 0 ) nEndY = 0; - if ( nEndY > MAXROW ) nEndY = MAXROW; - //! Fehler/Exception oder so, wenn zu gross/zu klein? - - aNewRange.aEnd.SetCol((SCCOL)nEndX); - aNewRange.aEnd.SetRow((SCROW)nEndY); - - aNewRange.Justify(); //! wirklich? - - SetNewRange( aNewRange ); - } -} - -// XUsedAreaCursor - -void SAL_CALL ScCellCursorObj::gotoStartOfUsedArea( sal_Bool bExpand ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aNewRange( *rRanges[0] ); - SCTAB nTab = aNewRange.aStart.Tab(); - - SCCOL nUsedX = 0; // Anfang holen - SCROW nUsedY = 0; - if (!pDocSh->GetDocument()->GetDataStart( nTab, nUsedX, nUsedY )) - { - nUsedX = 0; - nUsedY = 0; - } - - aNewRange.aStart.SetCol( nUsedX ); - aNewRange.aStart.SetRow( nUsedY ); - if (!bExpand) - aNewRange.aEnd = aNewRange.aStart; - SetNewRange( aNewRange ); - } -} - -void SAL_CALL ScCellCursorObj::gotoEndOfUsedArea( sal_Bool bExpand ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aNewRange( *rRanges[ 0 ]); - SCTAB nTab = aNewRange.aStart.Tab(); - - SCCOL nUsedX = 0; // Ende holen - SCROW nUsedY = 0; - if (!pDocSh->GetDocument()->GetTableArea( nTab, nUsedX, nUsedY )) - { - nUsedX = 0; - nUsedY = 0; - } - - aNewRange.aEnd.SetCol( nUsedX ); - aNewRange.aEnd.SetRow( nUsedY ); - if (!bExpand) - aNewRange.aStart = aNewRange.aEnd; - SetNewRange( aNewRange ); - } -} - -// XCellCursor - -void SAL_CALL ScCellCursorObj::gotoStart() throw(uno::RuntimeException) -{ - // this is similar to collapseToCurrentRegion - //! something like gotoEdge with 4 possible directions is needed - - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aOneRange( *rRanges[ 0 ]); - - aOneRange.Justify(); - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - SCCOL nStartCol = aOneRange.aStart.Col(); - SCROW nStartRow = aOneRange.aStart.Row(); - SCCOL nEndCol = aOneRange.aEnd.Col(); - SCROW nEndRow = aOneRange.aEnd.Row(); - SCTAB nTab = aOneRange.aStart.Tab(); - - pDocSh->GetDocument()->GetDataArea( - nTab, nStartCol, nStartRow, nEndCol, nEndRow, false, false ); - - ScRange aNew( nStartCol, nStartRow, nTab ); - SetNewRange( aNew ); - } -} - -void SAL_CALL ScCellCursorObj::gotoEnd() throw(uno::RuntimeException) -{ - // this is similar to collapseToCurrentRegion - //! something like gotoEdge with 4 possible directions is needed - - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aOneRange( *rRanges[ 0 ] ); - - aOneRange.Justify(); - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - { - SCCOL nStartCol = aOneRange.aStart.Col(); - SCROW nStartRow = aOneRange.aStart.Row(); - SCCOL nEndCol = aOneRange.aEnd.Col(); - SCROW nEndRow = aOneRange.aEnd.Row(); - SCTAB nTab = aOneRange.aStart.Tab(); - - pDocSh->GetDocument()->GetDataArea( - nTab, nStartCol, nStartRow, nEndCol, nEndRow, false, false ); - - ScRange aNew( nEndCol, nEndRow, nTab ); - SetNewRange( aNew ); - } -} - -void SAL_CALL ScCellCursorObj::gotoNext() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aOneRange( *rRanges[ 0 ] ); - - aOneRange.Justify(); - ScAddress aCursor(aOneRange.aStart); // bei Block immer den Start nehmen - - ScMarkData aMark; // not used with bMarked=FALSE - SCCOL nNewX = aCursor.Col(); - SCROW nNewY = aCursor.Row(); - SCTAB nTab = aCursor.Tab(); - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - pDocSh->GetDocument()->GetNextPos( nNewX,nNewY, nTab, 1,0, false,sal_True, aMark ); - //! sonst Exception oder so - - SetNewRange( ScRange( nNewX, nNewY, nTab ) ); -} - -void SAL_CALL ScCellCursorObj::gotoPrevious() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aOneRange( *rRanges[ 0 ] ); - - aOneRange.Justify(); - ScAddress aCursor(aOneRange.aStart); // bei Block immer den Start nehmen - - ScMarkData aMark; // not used with bMarked=FALSE - SCCOL nNewX = aCursor.Col(); - SCROW nNewY = aCursor.Row(); - SCTAB nTab = aCursor.Tab(); - ScDocShell* pDocSh = GetDocShell(); - if ( pDocSh ) - pDocSh->GetDocument()->GetNextPos( nNewX,nNewY, nTab, -1,0, false,sal_True, aMark ); - //! sonst Exception oder so - - SetNewRange( ScRange( nNewX, nNewY, nTab ) ); -} - -void SAL_CALL ScCellCursorObj::gotoOffset( sal_Int32 nColumnOffset, sal_Int32 nRowOffset ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScRangeList& rRanges = GetRangeList(); - OSL_ENSURE( rRanges.size() == 1, "Range? Ranges?" ); - ScRange aOneRange( *rRanges[ 0 ] ); - aOneRange.Justify(); - - if ( aOneRange.aStart.Col() + nColumnOffset >= 0 && - aOneRange.aEnd.Col() + nColumnOffset <= MAXCOL && - aOneRange.aStart.Row() + nRowOffset >= 0 && - aOneRange.aEnd.Row() + nRowOffset <= MAXROW ) - { - ScRange aNew( (SCCOL)(aOneRange.aStart.Col() + nColumnOffset), - (SCROW)(aOneRange.aStart.Row() + nRowOffset), - aOneRange.aStart.Tab(), - (SCCOL)(aOneRange.aEnd.Col() + nColumnOffset), - (SCROW)(aOneRange.aEnd.Row() + nRowOffset), - aOneRange.aEnd.Tab() ); - SetNewRange( aNew ); - } -} - -// XSheetCellRange - -uno::Reference<sheet::XSpreadsheet> SAL_CALL ScCellCursorObj::getSpreadsheet() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ScCellRangeObj::getSpreadsheet(); -} - -// XCellRange - -uno::Reference<table::XCell> SAL_CALL ScCellCursorObj::getCellByPosition( - sal_Int32 nColumn, sal_Int32 nRow ) - throw(lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ScCellRangeObj::getCellByPosition(nColumn,nRow); -} - -uno::Reference<table::XCellRange> SAL_CALL ScCellCursorObj::getCellRangeByPosition( - sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom ) - throw(lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ScCellRangeObj::getCellRangeByPosition(nLeft,nTop,nRight,nBottom); -} - -uno::Reference<table::XCellRange> SAL_CALL ScCellCursorObj::getCellRangeByName( - const rtl::OUString& rRange ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ScCellRangeObj::getCellRangeByName(rRange); -} - -// XServiceInfo - -rtl::OUString SAL_CALL ScCellCursorObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScCellCursorObj" )); -} - -sal_Bool SAL_CALL ScCellCursorObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr( rServiceName ); - return aServiceStr.EqualsAscii( SCSHEETCELLCURSOR_SERVICE ) || - aServiceStr.EqualsAscii( SCCELLCURSOR_SERVICE ) || - ScCellRangeObj::supportsService(rServiceName); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScCellCursorObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - // get all service names from cell range - uno::Sequence<rtl::OUString> aParentSeq(ScCellRangeObj::getSupportedServiceNames()); - sal_Int32 nParentLen = aParentSeq.getLength(); - const rtl::OUString* pParentArr = aParentSeq.getConstArray(); - - // SheetCellCursor should be first (?) - uno::Sequence<rtl::OUString> aTotalSeq( nParentLen + 2 ); - rtl::OUString* pTotalArr = aTotalSeq.getArray(); - pTotalArr[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSHEETCELLCURSOR_SERVICE )); - pTotalArr[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCCELLCURSOR_SERVICE )); - - // append cell range services - for (long i=0; i<nParentLen; i++) - pTotalArr[i+2] = pParentArr[i]; - - return aTotalSeq; -} - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/dapiuno.cxx b/sc/source/ui/unoobj/dapiuno.cxx deleted file mode 100644 index 270b0979b..000000000 --- a/sc/source/ui/unoobj/dapiuno.cxx +++ /dev/null @@ -1,3554 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include <algorithm> -#include <svl/smplhint.hxx> -#include <vcl/svapp.hxx> - -#include "dapiuno.hxx" -#include "datauno.hxx" -#include "miscuno.hxx" -#include "convuno.hxx" -#include "docsh.hxx" -#include "tabvwsh.hxx" -#include "pivot.hxx" -#include "rangeutl.hxx" -#include "dpobject.hxx" -#include "dpshttab.hxx" -#include "dpsdbtab.hxx" -#include "dpsave.hxx" -#include "dbdocfun.hxx" -#include "unonames.hxx" -#include "dpgroup.hxx" -#include "dpdimsave.hxx" -#include "hints.hxx" - -#include <com/sun/star/sheet/XHierarchiesSupplier.hpp> -#include <com/sun/star/sheet/XLevelsSupplier.hpp> -#include <com/sun/star/sheet/XMembersSupplier.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/sheet/DataImportMode.hpp> -#include <com/sun/star/sheet/DataPilotFieldGroupBy.hpp> -#include <com/sun/star/sheet/DataPilotFieldFilter.hpp> -#include <com/sun/star/sheet/DataPilotOutputRangeType.hpp> -#include <com/sun/star/sheet/DataPilotTablePositionData.hpp> - -#include <comphelper/extract.hxx> -#include <comphelper/sequence.hxx> -#include <comphelper/servicehelper.hxx> - -using namespace com::sun::star; -using namespace com::sun::star::sheet; - -using ::rtl::OUString; - -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::RuntimeException; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; - -using ::com::sun::star::container::ElementExistException; -using ::com::sun::star::container::NoSuchElementException; -using ::com::sun::star::container::XEnumeration; -using ::com::sun::star::container::XIndexAccess; -using ::com::sun::star::container::XNameAccess; -using ::com::sun::star::container::XNamed; - -using ::com::sun::star::beans::PropertyVetoException; -using ::com::sun::star::beans::UnknownPropertyException; -using ::com::sun::star::beans::XPropertyChangeListener; -using ::com::sun::star::beans::XPropertySet; -using ::com::sun::star::beans::XPropertySetInfo; -using ::com::sun::star::beans::XVetoableChangeListener; - -using ::com::sun::star::lang::IllegalArgumentException; -using ::com::sun::star::lang::IndexOutOfBoundsException; -using ::com::sun::star::lang::WrappedTargetException; - -using ::com::sun::star::table::CellAddress; -using ::com::sun::star::table::CellRangeAddress; - -// ============================================================================ - -namespace { - -const SfxItemPropertyMapEntry* lcl_GetDataPilotDescriptorBaseMap() -{ - static SfxItemPropertyMapEntry aDataPilotDescriptorBaseMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_COLGRAND), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_DRILLDOWN), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_IGNEMPROWS), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_IMPORTDESC), 0, &getCppuType((uno::Sequence<beans::PropertyValue>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_RPTEMPTY), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_ROWGRAND), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_SERVICEARG), 0, &getCppuType((uno::Sequence<beans::PropertyValue>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_SHOWFILT), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_SOURCESERV), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - return aDataPilotDescriptorBaseMap_Impl; -} - -// ---------------------------------------------------------------------------- - -const SfxItemPropertyMapEntry* lcl_GetDataPilotFieldMap() -{ - using namespace ::com::sun::star::beans::PropertyAttribute; - static SfxItemPropertyMapEntry aDataPilotFieldMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_AUTOSHOW), 0, &getCppuType((DataPilotFieldAutoShowInfo*)0), MAYBEVOID, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_FUNCTION), 0, &getCppuType((GeneralFunction*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_GROUPINFO), 0, &getCppuType((DataPilotFieldGroupInfo*)0), MAYBEVOID, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_HASAUTOSHOW), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_HASLAYOUTINFO),0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_HASREFERENCE), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_HASSORTINFO), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ISGROUP), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_LAYOUTINFO), 0, &getCppuType((DataPilotFieldLayoutInfo*)0), MAYBEVOID, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ORIENT), 0, &getCppuType((DataPilotFieldOrientation*)0), MAYBEVOID, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_REFERENCE), 0, &getCppuType((DataPilotFieldReference*)0), MAYBEVOID, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SELPAGE), 0, &getCppuType((OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SHOWEMPTY), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SORTINFO), 0, &getCppuType((DataPilotFieldSortInfo*)0), MAYBEVOID, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SUBTOTALS), 0, &getCppuType((Sequence<GeneralFunction>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_USESELPAGE), 0, &getBooleanCppuType(), 0, 0 }, - {0,0,0,0,0,0} - }; - return aDataPilotFieldMap_Impl; -} - -// ---------------------------------------------------------------------------- - -const SfxItemPropertyMapEntry* lcl_GetDataPilotItemMap() -{ - static SfxItemPropertyMapEntry aDataPilotItemMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ISHIDDEN), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_POS), 0, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SHOWDETAIL), 0, &getBooleanCppuType(), 0, 0 }, - {0,0,0,0,0,0} - }; - return aDataPilotItemMap_Impl; -} - -// ---------------------------------------------------------------------------- - -inline bool lclCheckValidDouble( double fValue, sal_Bool bAuto ) -{ - return bAuto || ::rtl::math::isFinite( fValue ); -} - -bool lclCheckMinMaxStep( const DataPilotFieldGroupInfo& rInfo ) -{ - return - lclCheckValidDouble( rInfo.Start, rInfo.HasAutoStart ) && - lclCheckValidDouble( rInfo.End, rInfo.HasAutoEnd ) && - (rInfo.HasAutoStart || rInfo.HasAutoEnd || (rInfo.Start <= rInfo.End)) && - lclCheckValidDouble( rInfo.Step, false ) && - (0.0 <= rInfo.Step); -} - -} // namespace - -// ============================================================================ - -SC_SIMPLE_SERVICE_INFO( ScDataPilotDescriptor, "ScDataPilotDescriptor", "stardiv::one::sheet::DataPilotDescriptor" ) -SC_SIMPLE_SERVICE_INFO( ScDataPilotFieldObj, "ScDataPilotFieldObj", "com.sun.star.sheet.DataPilotField" ) -SC_SIMPLE_SERVICE_INFO( ScDataPilotFieldsObj, "ScDataPilotFieldsObj", "com.sun.star.sheet.DataPilotFields" ) -SC_SIMPLE_SERVICE_INFO( ScDataPilotTableObj, "ScDataPilotTableObj", "com.sun.star.sheet.DataPilotTable" ) -SC_SIMPLE_SERVICE_INFO( ScDataPilotTablesObj, "ScDataPilotTablesObj", "com.sun.star.sheet.DataPilotTables" ) -SC_SIMPLE_SERVICE_INFO( ScDataPilotItemsObj, "ScDataPilotItemsObj", "com.sun.star.sheet.DataPilotItems" ) -SC_SIMPLE_SERVICE_INFO( ScDataPilotItemObj, "ScDataPilotItemObj", "com.sun.star.sheet.DataPilotItem" ) - -SC_SIMPLE_SERVICE_INFO( ScDataPilotFieldGroupsObj, "ScDataPilotFieldGroupsObj", "com.sun.star.sheet.DataPilotFieldGroups" ) -SC_SIMPLE_SERVICE_INFO( ScDataPilotFieldGroupObj, "ScDataPilotFieldGroupObj", "com.sun.star.sheet.DataPilotFieldGroup" ) -SC_SIMPLE_SERVICE_INFO( ScDataPilotFieldGroupItemObj, "ScDataPilotFieldGroupItemObj", "com.sun.star.sheet.DataPilotFieldGroupItem" ) - -//------------------------------------------------------------------------ - -// name that is used in the API for the data layout field -#define SC_DATALAYOUT_NAME "Data" - -//------------------------------------------------------------------------ - -GeneralFunction ScDataPilotConversion::FirstFunc( sal_uInt16 nBits ) -{ - if ( nBits & PIVOT_FUNC_SUM ) return GeneralFunction_SUM; - if ( nBits & PIVOT_FUNC_COUNT ) return GeneralFunction_COUNT; - if ( nBits & PIVOT_FUNC_AVERAGE ) return GeneralFunction_AVERAGE; - if ( nBits & PIVOT_FUNC_MAX ) return GeneralFunction_MAX; - if ( nBits & PIVOT_FUNC_MIN ) return GeneralFunction_MIN; - if ( nBits & PIVOT_FUNC_PRODUCT ) return GeneralFunction_PRODUCT; - if ( nBits & PIVOT_FUNC_COUNT_NUM ) return GeneralFunction_COUNTNUMS; - if ( nBits & PIVOT_FUNC_STD_DEV ) return GeneralFunction_STDEV; - if ( nBits & PIVOT_FUNC_STD_DEVP ) return GeneralFunction_STDEVP; - if ( nBits & PIVOT_FUNC_STD_VAR ) return GeneralFunction_VAR; - if ( nBits & PIVOT_FUNC_STD_VARP ) return GeneralFunction_VARP; - if ( nBits & PIVOT_FUNC_AUTO ) return GeneralFunction_AUTO; - return GeneralFunction_NONE; -} - -sal_uInt16 ScDataPilotConversion::FunctionBit( GeneralFunction eFunc ) -{ - sal_uInt16 nRet = PIVOT_FUNC_NONE; // 0 - switch (eFunc) - { - case GeneralFunction_SUM: nRet = PIVOT_FUNC_SUM; break; - case GeneralFunction_COUNT: nRet = PIVOT_FUNC_COUNT; break; - case GeneralFunction_AVERAGE: nRet = PIVOT_FUNC_AVERAGE; break; - case GeneralFunction_MAX: nRet = PIVOT_FUNC_MAX; break; - case GeneralFunction_MIN: nRet = PIVOT_FUNC_MIN; break; - case GeneralFunction_PRODUCT: nRet = PIVOT_FUNC_PRODUCT; break; - case GeneralFunction_COUNTNUMS: nRet = PIVOT_FUNC_COUNT_NUM; break; - case GeneralFunction_STDEV: nRet = PIVOT_FUNC_STD_DEV; break; - case GeneralFunction_STDEVP: nRet = PIVOT_FUNC_STD_DEVP; break; - case GeneralFunction_VAR: nRet = PIVOT_FUNC_STD_VAR; break; - case GeneralFunction_VARP: nRet = PIVOT_FUNC_STD_VARP; break; - case GeneralFunction_AUTO: nRet = PIVOT_FUNC_AUTO; break; - default: - { - // added to avoid warnings - } - } - return nRet; -} - -void ScDataPilotConversion::FillGroupInfo( DataPilotFieldGroupInfo& rInfo, const ScDPNumGroupInfo& rGroupInfo ) -{ - rInfo.HasDateValues = rGroupInfo.DateValues; - rInfo.HasAutoStart = rGroupInfo.AutoStart; - rInfo.Start = rGroupInfo.Start; - rInfo.HasAutoEnd = rGroupInfo.AutoEnd; - rInfo.End = rGroupInfo.End; - rInfo.Step = rGroupInfo.Step; -} - -//------------------------------------------------------------------------ - -ScDPObject* lcl_GetDPObject( ScDocShell* pDocShell, SCTAB nTab, const OUString& rName ) -{ - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDPCollection* pColl = pDoc->GetDPCollection(); - if ( pColl ) - { - size_t nCount = pColl->GetCount(); - for (size_t i=0; i<nCount; ++i) - { - ScDPObject* pDPObj = (*pColl)[i]; - if ( pDPObj->GetOutRange().aStart.Tab() == nTab && - pDPObj->GetName() == rName ) - return pDPObj; - } - } - } - return NULL; // nicht gefunden -} - -String lcl_CreatePivotName( ScDocShell* pDocShell ) -{ - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDPCollection* pColl = pDoc->GetDPCollection(); - if ( pColl ) - return pColl->CreateNewName(); - } - return String(); // sollte nicht vorkommen -} - -sal_Int32 lcl_GetObjectIndex( ScDPObject* pDPObj, const ScFieldIdentifier& rFieldId ) -{ - // used for items - nRepeat in identifier can be ignored - if ( pDPObj ) - { - sal_Int32 nCount = pDPObj->GetDimCount(); - for ( sal_Int32 nDim = 0; nDim < nCount; ++nDim ) - { - bool bIsDataLayout = false; - OUString aDimName( pDPObj->GetDimName( nDim, bIsDataLayout ) ); - if ( rFieldId.mbDataLayout ? bIsDataLayout : (aDimName == rFieldId.maFieldName) ) - return nDim; - } - } - return -1; // none -} - -//------------------------------------------------------------------------ - -ScDataPilotTablesObj::ScDataPilotTablesObj(ScDocShell* pDocSh, SCTAB nT) : - pDocShell( pDocSh ), - nTab( nT ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDataPilotTablesObj::~ScDataPilotTablesObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScDataPilotTablesObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! Referenz-Update - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XDataPilotTables - -ScDataPilotTableObj* ScDataPilotTablesObj::GetObjectByIndex_Impl( sal_Int32 nIndex ) -{ - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDPCollection* pColl = pDoc->GetDPCollection(); - if ( pColl ) - { - // count tables on this sheet - // api only handles sheet data at this time - //! allow all data sources!!! - sal_Int32 nFound = 0; - size_t nCount = pColl->GetCount(); - for (size_t i=0; i<nCount; ++i) - { - ScDPObject* pDPObj = (*pColl)[i]; - if ( pDPObj->GetOutRange().aStart.Tab() == nTab ) - { - if ( nFound == nIndex ) - { - String aName = pDPObj->GetName(); - return new ScDataPilotTableObj( pDocShell, nTab, aName ); - } - ++nFound; - } - } - } - } - return NULL; -} - -ScDataPilotTableObj* ScDataPilotTablesObj::GetObjectByName_Impl(const OUString& rName) -{ - if (hasByName(rName)) - return new ScDataPilotTableObj( pDocShell, nTab, rName ); - return 0; -} - -Reference<XDataPilotDescriptor> SAL_CALL ScDataPilotTablesObj::createDataPilotDescriptor() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return new ScDataPilotDescriptor(pDocShell); - return NULL; -} - -bool lcl_IsDuplicated( const Reference<XPropertySet> xDimProps ) -{ - try - { - Any aAny = xDimProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNO_ORIGINAL ) ) ); - Reference< XNamed > xOriginal( aAny, UNO_QUERY ); - return xOriginal.is(); - } - catch( Exception& ) - { - } - return false; -} - -OUString lcl_GetOriginalName( const Reference< XNamed > xDim ) -{ - Reference< XNamed > xOriginal; - - Reference< XPropertySet > xDimProps( xDim, UNO_QUERY ); - if ( xDimProps.is() ) - { - try - { - Any aAny = xDimProps->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ORIGINAL))); - aAny >>= xOriginal; - } - catch( Exception& ) - { - } - } - - if ( !xOriginal.is() ) - xOriginal = xDim; - - return xOriginal->getName(); -} - -void SAL_CALL ScDataPilotTablesObj::insertNewByName( const OUString& aNewName, - const CellAddress& aOutputAddress, - const Reference<XDataPilotDescriptor>& xDescriptor ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - if (!xDescriptor.is()) return; - - // inserting with already existing name? - if ( aNewName.getLength() && hasByName( aNewName ) ) - throw RuntimeException(); // no other exceptions specified - - sal_Bool bDone = false; - ScDataPilotDescriptorBase* pImp = ScDataPilotDescriptorBase::getImplementation( xDescriptor ); - if ( pDocShell && pImp ) - { - ScDPObject* pNewObj = pImp->GetDPObject(); - - if (pNewObj) - { - ScRange aOutputRange((SCCOL)aOutputAddress.Column, (SCROW)aOutputAddress.Row, (SCTAB)aOutputAddress.Sheet, - (SCCOL)aOutputAddress.Column, (SCROW)aOutputAddress.Row, (SCTAB)aOutputAddress.Sheet); - pNewObj->SetOutRange(aOutputRange); - String aName = aNewName; - if (!aName.Len()) - aName = lcl_CreatePivotName( pDocShell ); - pNewObj->SetName(aName); - String aTag = xDescriptor->getTag(); - pNewObj->SetTag(aTag); - - // todo: handle double fields (for more information see ScDPObject - - ScDBDocFunc aFunc(*pDocShell); - bDone = aFunc.DataPilotUpdate( NULL, pNewObj, sal_True, sal_True ); - } - } - - if (!bDone) - throw RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScDataPilotTablesObj::removeByName( const OUString& aName ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameStr(aName); - ScDPObject* pDPObj = lcl_GetDPObject( pDocShell, nTab, aNameStr ); - if (pDPObj && pDocShell) - { - ScDBDocFunc aFunc(*pDocShell); - aFunc.DataPilotUpdate( pDPObj, NULL, sal_True, sal_True ); // remove - incl. undo etc. - } - else - throw RuntimeException(); // no other exceptions specified -} - -// XEnumerationAccess - -Reference< XEnumeration > SAL_CALL ScDataPilotTablesObj::createEnumeration() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.DataPilotTablesEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScDataPilotTablesObj::getCount() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDPCollection* pColl = pDoc->GetDPCollection(); - if ( pColl ) - { - // count tables on this sheet - // api only handles sheet data at this time - //! allow all data sources!!! - - sal_uInt16 nFound = 0; - size_t nCount = pColl->GetCount(); - for (size_t i=0; i<nCount; ++i) - { - ScDPObject* pDPObj = (*pColl)[i]; - if ( pDPObj->GetOutRange().aStart.Tab() == nTab ) - ++nFound; - } - return nFound; - } - } - - return 0; -} - -Any SAL_CALL ScDataPilotTablesObj::getByIndex( sal_Int32 nIndex ) - throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - Reference<XDataPilotTable2> xTable(GetObjectByIndex_Impl(nIndex)); - if (!xTable.is()) - throw IndexOutOfBoundsException(); - return Any( xTable ); -} - -uno::Type SAL_CALL ScDataPilotTablesObj::getElementType() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((Reference<XDataPilotTable2>*)0); -} - -sal_Bool SAL_CALL ScDataPilotTablesObj::hasElements() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// XNameAccess - -Any SAL_CALL ScDataPilotTablesObj::getByName( const OUString& aName ) - throw(NoSuchElementException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - Reference<XDataPilotTable2> xTable(GetObjectByName_Impl(aName)); - if (!xTable.is()) - throw NoSuchElementException(); - return Any( xTable ); -} - -Sequence<OUString> SAL_CALL ScDataPilotTablesObj::getElementNames() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDPCollection* pColl = pDoc->GetDPCollection(); - if ( pColl ) - { - // count tables on this sheet - // api only handles sheet data at this time - //! allow all data sources!!! - - sal_uInt16 nFound = 0; - size_t nCount = pColl->GetCount(); - size_t i; - for (i=0; i<nCount; ++i) - { - ScDPObject* pDPObj = (*pColl)[i]; - if ( pDPObj->GetOutRange().aStart.Tab() == nTab ) - ++nFound; - } - - sal_uInt16 nPos = 0; - Sequence<OUString> aSeq(nFound); - OUString* pAry = aSeq.getArray(); - for (i=0; i<nCount; ++i) - { - ScDPObject* pDPObj = (*pColl)[i]; - if ( pDPObj->GetOutRange().aStart.Tab() == nTab ) - pAry[nPos++] = pDPObj->GetName(); - } - - return aSeq; - } - } - return Sequence<OUString>(0); -} - -sal_Bool SAL_CALL ScDataPilotTablesObj::hasByName( const OUString& aName ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScDPCollection* pColl = pDoc->GetDPCollection(); - if ( pColl ) - { - size_t nCount = pColl->GetCount(); - for (size_t i=0; i<nCount; ++i) - { - // api only handles sheet data at this time - //! allow all data sources!!! - - ScDPObject* pDPObj = (*pColl)[i]; - if ( pDPObj->GetOutRange().aStart.Tab() == nTab && - pDPObj->GetName() == aName ) - return true; - } - } - } - return false; -} - -//------------------------------------------------------------------------ - -ScDataPilotDescriptorBase::ScDataPilotDescriptorBase(ScDocShell* pDocSh) : - maPropSet( lcl_GetDataPilotDescriptorBaseMap() ), - pDocShell( pDocSh ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDataPilotDescriptorBase::~ScDataPilotDescriptorBase() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -Any SAL_CALL ScDataPilotDescriptorBase::queryInterface( const uno::Type& rType ) - throw(RuntimeException) -{ - SC_QUERYINTERFACE( XDataPilotDescriptor ) - SC_QUERYINTERFACE( XPropertySet ) - SC_QUERYINTERFACE( XDataPilotDataLayoutFieldSupplier ) - SC_QUERYINTERFACE( XNamed ) // base of XDataPilotDescriptor - SC_QUERYINTERFACE( lang::XUnoTunnel ) - SC_QUERYINTERFACE( lang::XTypeProvider ) - SC_QUERYINTERFACE( lang::XServiceInfo ) - - return OWeakObject::queryInterface( rType ); -} - -void SAL_CALL ScDataPilotDescriptorBase::acquire() throw() -{ - OWeakObject::acquire(); -} - -void SAL_CALL ScDataPilotDescriptorBase::release() throw() -{ - OWeakObject::release(); -} - -Sequence< uno::Type > SAL_CALL ScDataPilotDescriptorBase::getTypes() - throw(RuntimeException) -{ - static Sequence< uno::Type > aTypes; - if ( aTypes.getLength() == 0 ) - { - aTypes.realloc( 6 ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[ 0 ] = getCppuType( (const Reference< XDataPilotDescriptor >*)0 ); - pPtr[ 1 ] = getCppuType( (const Reference< XPropertySet >*)0 ); - pPtr[ 2 ] = getCppuType( (const Reference< XDataPilotDataLayoutFieldSupplier >*)0 ); - pPtr[ 3 ] = getCppuType( (const Reference< lang::XUnoTunnel >*)0 ); - pPtr[ 4 ] = getCppuType( (const Reference< lang::XTypeProvider >*)0 ); - pPtr[ 5 ] = getCppuType( (const Reference< lang::XServiceInfo >*)0 ); - } - return aTypes; -} - -namespace -{ - class theScDataPilotDescriptorBaseImplementationId : public rtl::Static< UnoTunnelIdInit, theScDataPilotDescriptorBaseImplementationId > {}; -} - -Sequence<sal_Int8> SAL_CALL ScDataPilotDescriptorBase::getImplementationId() - throw(RuntimeException) -{ - return theScDataPilotDescriptorBaseImplementationId::get().getSeq(); -} - -void ScDataPilotDescriptorBase::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! Referenz-Update? - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XDataPilotDescriptor - -CellRangeAddress SAL_CALL ScDataPilotDescriptorBase::getSourceRange() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - - ScDPObject* pDPObject(GetDPObject()); - if (!pDPObject) - throw RuntimeException(); - - CellRangeAddress aRet; - if (pDPObject->IsSheetData()) - ScUnoConversion::FillApiRange( aRet, pDPObject->GetSheetDesc()->GetSourceRange() ); - return aRet; -} - -void SAL_CALL ScDataPilotDescriptorBase::setSourceRange( const CellRangeAddress& aSourceRange ) throw(RuntimeException) -{ - SolarMutexGuard aGuard; - - ScDPObject* pDPObject = GetDPObject(); - if (!pDPObject) - throw RuntimeException(); - - ScSheetSourceDesc aSheetDesc(pDocShell->GetDocument()); - if (pDPObject->IsSheetData()) - aSheetDesc = *pDPObject->GetSheetDesc(); - - ScRange aRange; - ScUnoConversion::FillScRange(aRange, aSourceRange); - aSheetDesc.SetSourceRange(aRange); - pDPObject->SetSheetDesc( aSheetDesc ); - SetDPObject( pDPObject ); -} - -Reference<XSheetFilterDescriptor> SAL_CALL ScDataPilotDescriptorBase::getFilterDescriptor() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScDataPilotFilterDescriptor( pDocShell, this ); -} - -Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getDataPilotFields() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScDataPilotFieldsObj( *this ); -} - -Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getColumnFields() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScDataPilotFieldsObj( *this, DataPilotFieldOrientation_COLUMN ); -} - -Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getRowFields() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScDataPilotFieldsObj( *this, DataPilotFieldOrientation_ROW ); -} - -Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getPageFields() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScDataPilotFieldsObj( *this, DataPilotFieldOrientation_PAGE ); -} - -Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getDataFields() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScDataPilotFieldsObj( *this, DataPilotFieldOrientation_DATA ); -} - -Reference<XIndexAccess> SAL_CALL ScDataPilotDescriptorBase::getHiddenFields() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScDataPilotFieldsObj( *this, DataPilotFieldOrientation_HIDDEN ); -} - -// XPropertySet -Reference< XPropertySetInfo > SAL_CALL ScDataPilotDescriptorBase::getPropertySetInfo( ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - static Reference<XPropertySetInfo> aRef = - new SfxItemPropertySetInfo( maPropSet.getPropertyMap() ); - return aRef; -} - -void SAL_CALL ScDataPilotDescriptorBase::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) - throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, - WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObject = GetDPObject(); - if (pDPObject) - { - ScDPSaveData* pOldData = pDPObject->GetSaveData(); - OSL_ENSURE(pOldData, "Here should be a SaveData"); - if ( pOldData ) - { - ScDPSaveData aNewData( *pOldData ); - - String aNameString = aPropertyName; - if ( aNameString.EqualsAscii( SC_UNO_COLGRAND ) ) - { - aNewData.SetColumnGrand(::cppu::any2bool( aValue )); - } - else if ( aNameString.EqualsAscii( SC_UNO_IGNEMPROWS ) ) - { - aNewData.SetIgnoreEmptyRows(::cppu::any2bool( aValue )); - } - else if ( aNameString.EqualsAscii( SC_UNO_RPTEMPTY ) ) - { - aNewData.SetRepeatIfEmpty(::cppu::any2bool( aValue )); - } - else if ( aNameString.EqualsAscii( SC_UNO_ROWGRAND ) ) - { - aNewData.SetRowGrand(::cppu::any2bool( aValue )); - } - else if ( aNameString.EqualsAscii( SC_UNO_SHOWFILT ) ) - { - aNewData.SetFilterButton(::cppu::any2bool( aValue )); - } - else if ( aNameString.EqualsAscii( SC_UNO_DRILLDOWN ) ) - { - aNewData.SetDrillDown(::cppu::any2bool( aValue )); - } - else if ( aNameString.EqualsAscii( SC_UNO_IMPORTDESC ) ) - { - uno::Sequence<beans::PropertyValue> aArgSeq; - if ( aValue >>= aArgSeq ) - { - ScImportSourceDesc aImportDesc(pDocShell->GetDocument()); - - const ScImportSourceDesc* pOldDesc = pDPObject->GetImportSourceDesc(); - if (pOldDesc) - aImportDesc = *pOldDesc; - - ScImportParam aParam; - ScImportDescriptor::FillImportParam( aParam, aArgSeq ); - - sal_uInt16 nNewType = sheet::DataImportMode_NONE; - if ( aParam.bImport ) - { - if ( aParam.bSql ) - nNewType = sheet::DataImportMode_SQL; - else if ( aParam.nType == ScDbQuery ) - nNewType = sheet::DataImportMode_QUERY; - else - nNewType = sheet::DataImportMode_TABLE; - } - aImportDesc.nType = nNewType; - aImportDesc.aDBName = aParam.aDBName; - aImportDesc.aObject = aParam.aStatement; - aImportDesc.bNative = aParam.bNative; - - pDPObject->SetImportDesc( aImportDesc ); - } - } - else if ( aNameString.EqualsAscii( SC_UNO_SOURCESERV ) ) - { - rtl::OUString aStrVal; - if ( aValue >>= aStrVal ) - { - String aEmpty; - ScDPServiceDesc aServiceDesc(aEmpty, aEmpty, aEmpty, aEmpty, aEmpty); - - const ScDPServiceDesc* pOldDesc = pDPObject->GetDPServiceDesc(); - if (pOldDesc) - aServiceDesc = *pOldDesc; - - aServiceDesc.aServiceName = aStrVal; - - pDPObject->SetServiceData( aServiceDesc ); - } - } - else if ( aNameString.EqualsAscii( SC_UNO_SERVICEARG ) ) - { - uno::Sequence<beans::PropertyValue> aArgSeq; - if ( aValue >>= aArgSeq ) - { - String aEmpty; - ScDPServiceDesc aServiceDesc(aEmpty, aEmpty, aEmpty, aEmpty, aEmpty); - - const ScDPServiceDesc* pOldDesc = pDPObject->GetDPServiceDesc(); - if (pOldDesc) - aServiceDesc = *pOldDesc; - - rtl::OUString aStrVal; - sal_Int32 nArgs = aArgSeq.getLength(); - for (sal_Int32 nArgPos=0; nArgPos<nArgs; ++nArgPos) - { - const beans::PropertyValue& rProp = aArgSeq[nArgPos]; - String aPropName(rProp.Name); - - if (aPropName.EqualsAscii( SC_UNO_SOURCENAME )) - { - if ( rProp.Value >>= aStrVal ) - aServiceDesc.aParSource = aStrVal; - } - else if (aPropName.EqualsAscii( SC_UNO_OBJECTNAME )) - { - if ( rProp.Value >>= aStrVal ) - aServiceDesc.aParName = aStrVal; - } - else if (aPropName.EqualsAscii( SC_UNO_USERNAME )) - { - if ( rProp.Value >>= aStrVal ) - aServiceDesc.aParUser = aStrVal; - } - else if (aPropName.EqualsAscii( SC_UNO_PASSWORD )) - { - if ( rProp.Value >>= aStrVal ) - aServiceDesc.aParPass = aStrVal; - } - } - - pDPObject->SetServiceData( aServiceDesc ); - } - } - else - throw UnknownPropertyException(); - - pDPObject->SetSaveData( aNewData ); - } - - SetDPObject(pDPObject); - } -} - -Any SAL_CALL ScDataPilotDescriptorBase::getPropertyValue( const OUString& aPropertyName ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - Any aRet; - - ScDPObject* pDPObject(GetDPObject()); - if (pDPObject) - { - ScDPSaveData* pOldData = pDPObject->GetSaveData(); - OSL_ENSURE(pOldData, "Here should be a SaveData"); - if ( pOldData ) - { - ScDPSaveData aNewData( *pOldData ); - - String aNameString = aPropertyName; - if ( aNameString.EqualsAscii( SC_UNO_COLGRAND ) ) - { - aRet = ::cppu::bool2any( aNewData.GetColumnGrand() ); - } - else if ( aNameString.EqualsAscii( SC_UNO_IGNEMPROWS ) ) - { - aRet = ::cppu::bool2any( aNewData.GetIgnoreEmptyRows() ); - } - else if ( aNameString.EqualsAscii( SC_UNO_RPTEMPTY ) ) - { - aRet = ::cppu::bool2any( aNewData.GetRepeatIfEmpty() ); - } - else if ( aNameString.EqualsAscii( SC_UNO_ROWGRAND ) ) - { - aRet = ::cppu::bool2any( aNewData.GetRowGrand() ); - } - else if ( aNameString.EqualsAscii( SC_UNO_SHOWFILT ) ) - { - aRet = ::cppu::bool2any( aNewData.GetFilterButton() ); - } - else if ( aNameString.EqualsAscii( SC_UNO_DRILLDOWN ) ) - { - aRet = ::cppu::bool2any( aNewData.GetDrillDown() ); - } - else if ( aNameString.EqualsAscii( SC_UNO_IMPORTDESC ) ) - { - const ScImportSourceDesc* pImportDesc = pDPObject->GetImportSourceDesc(); - if ( pImportDesc ) - { - // fill ScImportParam so ScImportDescriptor::FillProperties can be used - ScImportParam aParam; - aParam.bImport = ( pImportDesc->nType != sheet::DataImportMode_NONE ); - aParam.aDBName = pImportDesc->aDBName; - aParam.aStatement = pImportDesc->aObject; - aParam.bNative = pImportDesc->bNative; - aParam.bSql = ( pImportDesc->nType == sheet::DataImportMode_SQL ); - aParam.nType = static_cast<sal_uInt8>(( pImportDesc->nType == sheet::DataImportMode_QUERY ) ? ScDbQuery : ScDbTable); - - uno::Sequence<beans::PropertyValue> aSeq( ScImportDescriptor::GetPropertyCount() ); - ScImportDescriptor::FillProperties( aSeq, aParam ); - aRet <<= aSeq; - } - else - { - // empty sequence - uno::Sequence<beans::PropertyValue> aEmpty(0); - aRet <<= aEmpty; - } - } - else if ( aNameString.EqualsAscii( SC_UNO_SOURCESERV ) ) - { - rtl::OUString aServiceName; - const ScDPServiceDesc* pServiceDesc = pDPObject->GetDPServiceDesc(); - if (pServiceDesc) - aServiceName = pServiceDesc->aServiceName; - aRet <<= aServiceName; // empty string if no ServiceDesc set - } - else if ( aNameString.EqualsAscii( SC_UNO_SERVICEARG ) ) - { - const ScDPServiceDesc* pServiceDesc = pDPObject->GetDPServiceDesc(); - if (pServiceDesc) - { - uno::Sequence<beans::PropertyValue> aSeq( 4 ); - beans::PropertyValue* pArray = aSeq.getArray(); - pArray[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNO_SOURCENAME )); - pArray[0].Value <<= pServiceDesc->aParSource; - pArray[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNO_OBJECTNAME )); - pArray[1].Value <<= pServiceDesc->aParName; - pArray[2].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNO_USERNAME )); - pArray[2].Value <<= pServiceDesc->aParUser; - pArray[3].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNO_PASSWORD )); - pArray[3].Value <<= pServiceDesc->aParPass; - aRet <<= aSeq; - } - else - { - // empty sequence - uno::Sequence<beans::PropertyValue> aEmpty(0); - aRet <<= aEmpty; - } - } - else - throw UnknownPropertyException(); - } - } - - return aRet; -} - -void SAL_CALL ScDataPilotDescriptorBase::addPropertyChangeListener( - const OUString& /* aPropertyName */, const Reference<XPropertyChangeListener >& /* xListener */ ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ -} - -void SAL_CALL ScDataPilotDescriptorBase::removePropertyChangeListener( - const OUString& /* aPropertyName */, const Reference<XPropertyChangeListener >& /* aListener */ ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ -} - -void SAL_CALL ScDataPilotDescriptorBase::addVetoableChangeListener( - const OUString& /* PropertyName */, const Reference<XVetoableChangeListener >& /* aListener */ ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ -} - -void SAL_CALL ScDataPilotDescriptorBase::removeVetoableChangeListener( - const OUString& /* PropertyName */, const Reference<XVetoableChangeListener >& /* aListener */ ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ -} - -// XDataPilotDataLayoutFieldSupplier - -Reference< XDataPilotField > SAL_CALL ScDataPilotDescriptorBase::getDataLayoutField() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - if( ScDPObject* pDPObject = GetDPObject() ) - { - if( ScDPSaveData* pSaveData = pDPObject->GetSaveData() ) - { - if( pSaveData->GetDataLayoutDimension() ) - { - ScFieldIdentifier aFieldId( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_DATALAYOUT_NAME ) ), 0, true ); - return new ScDataPilotFieldObj( *this, aFieldId ); - } - } - } - return 0; -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScDataPilotDescriptorBase::getSomething( - const Sequence<sal_Int8 >& rId ) throw(RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScDataPilotDescriptorBaseUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScDataPilotDescriptorBaseUnoTunnelId> {}; -} - -const Sequence<sal_Int8>& ScDataPilotDescriptorBase::getUnoTunnelId() -{ - return theScDataPilotDescriptorBaseUnoTunnelId::get().getSeq(); -} - -ScDataPilotDescriptorBase* ScDataPilotDescriptorBase::getImplementation( - const Reference<XDataPilotDescriptor> xObj ) -{ - ScDataPilotDescriptorBase* pRet = NULL; - Reference<lang::XUnoTunnel> xUT( xObj, UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScDataPilotDescriptorBase*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -//------------------------------------------------------------------------ - -ScDataPilotTableObj::ScDataPilotTableObj(ScDocShell* pDocSh, SCTAB nT, const String& rN) : - ScDataPilotDescriptorBase( pDocSh ), - nTab( nT ), - aName( rN ), - aModifyListeners( 0 ) -{ -} - -ScDataPilotTableObj::~ScDataPilotTableObj() -{ -} - -Any SAL_CALL ScDataPilotTableObj::queryInterface( const uno::Type& rType ) - throw(RuntimeException) -{ - // since we manually do resolve the query for XDataPilotTable2 - // we also need to do the same for XDataPilotTable - SC_QUERYINTERFACE( XDataPilotTable ) - SC_QUERYINTERFACE( XDataPilotTable2 ) - SC_QUERYINTERFACE( XModifyBroadcaster ) - - return ScDataPilotDescriptorBase::queryInterface( rType ); -} - -void SAL_CALL ScDataPilotTableObj::acquire() throw() -{ - ScDataPilotDescriptorBase::acquire(); -} - -void SAL_CALL ScDataPilotTableObj::release() throw() -{ - ScDataPilotDescriptorBase::release(); -} - -Sequence< uno::Type > SAL_CALL ScDataPilotTableObj::getTypes() throw(RuntimeException) -{ - static Sequence< uno::Type > aTypes; - if ( aTypes.getLength() == 0 ) - { - Sequence< uno::Type > aParentTypes = ScDataPilotDescriptorBase::getTypes(); - sal_Int32 nParentLen = aParentTypes.getLength(); - const uno::Type* pParentPtr = aParentTypes.getConstArray(); - - aTypes.realloc( nParentLen + 2 ); - uno::Type* pPtr = aTypes.getArray(); - for (sal_Int32 i = 0; i < nParentLen; ++i) - pPtr[ i ] = pParentPtr[ i ]; // parent types first - - pPtr[ nParentLen ] = getCppuType( (const Reference< XDataPilotTable2 >*)0 ); - pPtr[ nParentLen+1 ] = getCppuType( (const Reference< XModifyBroadcaster >*)0 ); - } - return aTypes; -} - -namespace -{ - class theScDataPilotTableObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScDataPilotTableObjImplementationId > {}; -} - -Sequence<sal_Int8> SAL_CALL ScDataPilotTableObj::getImplementationId() - throw(RuntimeException) -{ - return theScDataPilotTableObjImplementationId::get().getSeq(); -} - -// --- -ScDPObject* ScDataPilotTableObj::GetDPObject() const -{ - return lcl_GetDPObject(GetDocShell(), nTab, aName); -} - -void ScDataPilotTableObj::SetDPObject( ScDPObject* pDPObject ) -{ - ScDocShell* pDocSh = GetDocShell(); - ScDPObject* pDPObj = lcl_GetDPObject(pDocSh, nTab, aName); - if ( pDPObj && pDocSh ) - { - ScDBDocFunc aFunc(*pDocSh); - aFunc.DataPilotUpdate( pDPObj, pDPObject, sal_True, sal_True ); - } -} - -// "rest of XDataPilotDescriptor" - -OUString SAL_CALL ScDataPilotTableObj::getName() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName); - if (pDPObj) - return pDPObj->GetName(); - return OUString(); -} - -void SAL_CALL ScDataPilotTableObj::setName( const OUString& aNewName ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName); - if (pDPObj) - { - //! test for existing names !!! - - String aString(aNewName); - pDPObj->SetName( aString ); //! Undo - DBDocFunc ??? - aName = aString; - - // DataPilotUpdate would do too much (output table is not changed) - GetDocShell()->SetDocumentModified(); - } -} - -OUString SAL_CALL ScDataPilotTableObj::getTag() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName); - if (pDPObj) - return pDPObj->GetTag(); - return OUString(); -} - -void SAL_CALL ScDataPilotTableObj::setTag( const OUString& aNewTag ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName); - if (pDPObj) - { - String aString(aNewTag); - pDPObj->SetTag( aString ); //! Undo - DBDocFunc ??? - - // DataPilotUpdate would do too much (output table is not changed) - GetDocShell()->SetDocumentModified(); - } -} - -// XDataPilotTable - -CellRangeAddress SAL_CALL ScDataPilotTableObj::getOutputRange() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - CellRangeAddress aRet; - ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName); - if (pDPObj) - { - ScRange aRange(pDPObj->GetOutRange()); - aRet.Sheet = aRange.aStart.Tab(); - aRet.StartColumn = aRange.aStart.Col(); - aRet.StartRow = aRange.aStart.Row(); - aRet.EndColumn = aRange.aEnd.Col(); - aRet.EndRow = aRange.aEnd.Row(); - } - return aRet; -} - -void SAL_CALL ScDataPilotTableObj::refresh() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName); - if (pDPObj) - { - ScDBDocFunc aFunc(*GetDocShell()); - GetDocShell()->GetDocument()->GetDPCollection()->ClearCache(pDPObj); - aFunc.DataPilotUpdate( pDPObj, pDPObj, true, true ); - } -} - -Sequence< Sequence<Any> > SAL_CALL ScDataPilotTableObj::getDrillDownData(const CellAddress& aAddr) - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - Sequence< Sequence<Any> > aTabData; - ScAddress aAddr2(static_cast<SCCOL>(aAddr.Column), static_cast<SCROW>(aAddr.Row), aAddr.Sheet); - ScDPObject* pObj = GetDPObject(); - if (!pObj) - throw RuntimeException(); - - pObj->GetDrillDownData(aAddr2, aTabData); - return aTabData; -} - -DataPilotTablePositionData SAL_CALL ScDataPilotTableObj::getPositionData(const CellAddress& aAddr) - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - DataPilotTablePositionData aPosData; - ScAddress aAddr2(static_cast<SCCOL>(aAddr.Column), static_cast<SCROW>(aAddr.Row), aAddr.Sheet); - ScDPObject* pObj = GetDPObject(); - if (!pObj) - throw RuntimeException(); - - pObj->GetPositionData(aAddr2, aPosData); - return aPosData; -} - -void SAL_CALL ScDataPilotTableObj::insertDrillDownSheet(const CellAddress& aAddr) - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = GetDPObject(); - if (!pDPObj) - throw RuntimeException(); - - Sequence<DataPilotFieldFilter> aFilters; - pDPObj->GetDataFieldPositionData( - ScAddress(static_cast<SCCOL>(aAddr.Column), static_cast<SCROW>(aAddr.Row), aAddr.Sheet), aFilters); - GetDocShell()->GetBestViewShell()->ShowDataPilotSourceData(*pDPObj, aFilters); -} - -CellRangeAddress SAL_CALL ScDataPilotTableObj::getOutputRangeByType( sal_Int32 nType ) - throw (IllegalArgumentException, RuntimeException) -{ - SolarMutexGuard aGuard; - if (nType < 0 || nType > DataPilotOutputRangeType::RESULT) - throw IllegalArgumentException(); - - CellRangeAddress aRet; - if (ScDPObject* pDPObj = lcl_GetDPObject(GetDocShell(), nTab, aName)) - ScUnoConversion::FillApiRange( aRet, pDPObj->GetOutputRangeByType( nType ) ); - return aRet; -} - -void SAL_CALL ScDataPilotTableObj::addModifyListener( const uno::Reference<util::XModifyListener>& aListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<util::XModifyListener> *pObj = new uno::Reference<util::XModifyListener>( aListener ); - aModifyListeners.Insert( pObj, aModifyListeners.Count() ); - - if ( aModifyListeners.Count() == 1 ) - { - acquire(); // don't lose this object (one ref for all listeners) - } -} - -void SAL_CALL ScDataPilotTableObj::removeModifyListener( const uno::Reference<util::XModifyListener>& aListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - acquire(); // in case the listeners have the last ref - released below - - sal_uInt16 nCount = aModifyListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<util::XModifyListener> *pObj = aModifyListeners[n]; - if ( *pObj == aListener ) - { - aModifyListeners.DeleteAndDestroy( n ); - - if ( aModifyListeners.Count() == 0 ) - { - release(); // release the ref for the listeners - } - - break; - } - } - - release(); // might delete this object -} - -void ScDataPilotTableObj::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) -{ - if ( rHint.ISA(ScDataPilotModifiedHint) && - static_cast<const ScDataPilotModifiedHint&>(rHint).GetName() == aName ) - { - Refreshed_Impl(); - } - else if ( rHint.ISA( ScUpdateRefHint ) ) - { - ScRange aRange( 0, 0, nTab ); - ScRangeList aRanges; - aRanges.Append( aRange ); - const ScUpdateRefHint& rRef = static_cast< const ScUpdateRefHint& >( rHint ); - if ( aRanges.UpdateReference( rRef.GetMode(), GetDocShell()->GetDocument(), rRef.GetRange(), - rRef.GetDx(), rRef.GetDy(), rRef.GetDz() ) && - aRanges.size() == 1 ) - { - const ScRange* pRange = aRanges.front(); - if ( pRange ) - { - nTab = pRange->aStart.Tab(); - } - } - } - - ScDataPilotDescriptorBase::Notify( rBC, rHint ); -} - -void ScDataPilotTableObj::Refreshed_Impl() -{ - lang::EventObject aEvent; - aEvent.Source.set((cppu::OWeakObject*)this); - - // the EventObject holds a Ref to this object until after the listener calls - - ScDocument* pDoc = GetDocShell()->GetDocument(); - for ( sal_uInt16 n=0; n<aModifyListeners.Count(); n++ ) - pDoc->AddUnoListenerCall( *aModifyListeners[n], aEvent ); -} - -// ============================================================================ - -ScDataPilotDescriptor::ScDataPilotDescriptor(ScDocShell* pDocSh) : - ScDataPilotDescriptorBase( pDocSh ), - mpDPObject(new ScDPObject(pDocSh ? pDocSh->GetDocument() : NULL) ) -{ - mpDPObject->SetAlive(sal_True); - ScDPSaveData aSaveData; - // set defaults like in ScPivotParam constructor - aSaveData.SetColumnGrand( sal_True ); - aSaveData.SetRowGrand( sal_True ); - aSaveData.SetIgnoreEmptyRows( false ); - aSaveData.SetRepeatIfEmpty( false ); - mpDPObject->SetSaveData(aSaveData); - ScSheetSourceDesc aSheetDesc(pDocSh ? pDocSh->GetDocument() : NULL); - mpDPObject->SetSheetDesc(aSheetDesc); - mpDPObject->GetSource(); -} - -ScDataPilotDescriptor::~ScDataPilotDescriptor() -{ - delete mpDPObject; -} - -ScDPObject* ScDataPilotDescriptor::GetDPObject() const -{ - return mpDPObject; -} - -void ScDataPilotDescriptor::SetDPObject( ScDPObject* pDPObject ) -{ - if (mpDPObject != pDPObject) - { - delete mpDPObject; - mpDPObject = pDPObject; - OSL_FAIL("replace DPObject should not happen"); - } -} - -// "rest of XDataPilotDescriptor" - -OUString SAL_CALL ScDataPilotDescriptor::getName() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return mpDPObject->GetName(); -} - -void SAL_CALL ScDataPilotDescriptor::setName( const OUString& aNewName ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - mpDPObject->SetName( aNewName ); -} - -OUString SAL_CALL ScDataPilotDescriptor::getTag() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return mpDPObject->GetTag(); -} - -void SAL_CALL ScDataPilotDescriptor::setTag( const OUString& aNewTag ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - mpDPObject->SetTag( aNewTag ); -} - -// ============================================================================ - -ScDataPilotChildObjBase::ScDataPilotChildObjBase( ScDataPilotDescriptorBase& rParent ) : - mrParent( rParent ) -{ - mrParent.acquire(); -} - -ScDataPilotChildObjBase::ScDataPilotChildObjBase( ScDataPilotDescriptorBase& rParent, const ScFieldIdentifier& rFieldId ) : - mrParent( rParent ), - maFieldId( rFieldId ) -{ - mrParent.acquire(); -} - -ScDataPilotChildObjBase::~ScDataPilotChildObjBase() -{ - mrParent.release(); -} - -ScDPObject* ScDataPilotChildObjBase::GetDPObject() const -{ - return mrParent.GetDPObject(); -} - -void ScDataPilotChildObjBase::SetDPObject( ScDPObject* pDPObject ) -{ - mrParent.SetDPObject( pDPObject ); -} - -ScDPSaveDimension* ScDataPilotChildObjBase::GetDPDimension( ScDPObject** ppDPObject ) const -{ - if( ScDPObject* pDPObj = GetDPObject() ) - { - if( ppDPObject ) *ppDPObject = pDPObj; - if( ScDPSaveData* pSaveData = pDPObj->GetSaveData() ) - { - if( maFieldId.mbDataLayout ) - return pSaveData->GetDataLayoutDimension(); - - if( maFieldId.mnFieldIdx == 0 ) - return pSaveData->GetDimensionByName( maFieldId.maFieldName ); - - // find dimension with specified index (search in duplicated dimensions) - const boost::ptr_vector<ScDPSaveDimension>& rDimensions = pSaveData->GetDimensions(); - - sal_Int32 nFoundIdx = 0; - boost::ptr_vector<ScDPSaveDimension>::const_iterator it; - for(it = rDimensions.begin(); it != rDimensions.end(); ++it) - { - if( !it->IsDataLayout() && (it->GetName() == maFieldId.maFieldName) ) - { - if( nFoundIdx == maFieldId.mnFieldIdx ) - return const_cast<ScDPSaveDimension*>(&(*it)); - ++nFoundIdx; - } - } - } - } - return 0; -} - -sal_Int32 ScDataPilotChildObjBase::GetMemberCount() const -{ - sal_Int32 nRet = 0; - Reference<XNameAccess> xMembersNA = GetMembers(); - if (xMembersNA.is()) - { - Reference< XIndexAccess > xMembersIA( new ScNameToIndexAccess( xMembersNA ) ); - nRet = xMembersIA->getCount(); - } - return nRet; -} - -Reference< XNameAccess > ScDataPilotChildObjBase::GetMembers() const -{ - Reference< XNameAccess > xMembersNA; - if( ScDPObject* pDPObj = GetDPObject() ) - pDPObj->GetMembersNA( lcl_GetObjectIndex( pDPObj, maFieldId ), xMembersNA ); - return xMembersNA; -} - -// ============================================================================ - -ScDataPilotFieldsObj::ScDataPilotFieldsObj( ScDataPilotDescriptorBase& rParent ) : - ScDataPilotChildObjBase( rParent ) -{ -} - -ScDataPilotFieldsObj::ScDataPilotFieldsObj( ScDataPilotDescriptorBase& rParent, DataPilotFieldOrientation eOrient ) : - ScDataPilotChildObjBase( rParent ), - maOrient( eOrient ) -{ -} - -ScDataPilotFieldsObj::~ScDataPilotFieldsObj() -{ -} - -sal_Int32 lcl_GetFieldCount( const Reference<XDimensionsSupplier>& rSource, const Any& rOrient ) -{ - sal_Int32 nRet = 0; - - Reference<XNameAccess> xDimsName(rSource->getDimensions()); - Reference<XIndexAccess> xIntDims(new ScNameToIndexAccess( xDimsName )); - sal_Int32 nIntCount = xIntDims->getCount(); - if (rOrient.hasValue()) - { - // all fields of the specified orientation, including duplicated - Reference<XPropertySet> xDim; - for (sal_Int32 i = 0; i < nIntCount; ++i) - { - xDim.set(xIntDims->getByIndex(i), UNO_QUERY); - if (xDim.is() && (xDim->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ORIENTAT))) == rOrient)) - ++nRet; - } - } - else - { - // count all non-duplicated fields - - Reference<XPropertySet> xDim; - for (sal_Int32 i = 0; i < nIntCount; ++i) - { - xDim.set(xIntDims->getByIndex(i), UNO_QUERY); - if ( xDim.is() && !lcl_IsDuplicated( xDim ) ) - ++nRet; - } - } - - return nRet; -} - -sal_Bool lcl_GetFieldDataByIndex( const Reference<XDimensionsSupplier>& rSource, - const Any& rOrient, SCSIZE nIndex, ScFieldIdentifier& rFieldId ) -{ - sal_Bool bOk = false; - SCSIZE nPos = 0; - sal_Int32 nDimIndex = 0; - - Reference<XNameAccess> xDimsName(rSource->getDimensions()); - Reference<XIndexAccess> xIntDims(new ScNameToIndexAccess( xDimsName )); - sal_Int32 nIntCount = xIntDims->getCount(); - Reference<XPropertySet> xDim; - if (rOrient.hasValue()) - { - sal_Int32 i = 0; - while (i < nIntCount && !bOk) - { - xDim.set(xIntDims->getByIndex(i), UNO_QUERY); - if (xDim.is() && (xDim->getPropertyValue(OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ORIENTAT))) == rOrient)) - { - if (nPos == nIndex) - { - bOk = sal_True; - nDimIndex = i; - } - else - ++nPos; - } - ++i; - } - } - else - { - sal_Int32 i = 0; - while (i < nIntCount && !bOk) - { - xDim.set(xIntDims->getByIndex(i), UNO_QUERY); - if ( xDim.is() && !lcl_IsDuplicated( xDim ) ) - { - if (nPos == nIndex) - { - bOk = sal_True; - nDimIndex = i; - } - else - ++nPos; - } - ++i; - } - } - - if ( bOk ) - { - xDim.set( xIntDims->getByIndex(nDimIndex), UNO_QUERY ); - Reference<XNamed> xDimName( xDim, UNO_QUERY ); - if ( xDimName.is() ) - { - OUString sOriginalName( lcl_GetOriginalName( xDimName ) ); - rFieldId.maFieldName = sOriginalName; - rFieldId.mbDataLayout = ScUnoHelpFunctions::GetBoolProperty( xDim, - OUString(RTL_CONSTASCII_USTRINGPARAM(SC_UNO_ISDATALA)) ); - - sal_Int32 nRepeat = 0; - if ( rOrient.hasValue() && lcl_IsDuplicated( xDim ) ) - { - // find the repeat count - // (this relies on the original dimension always being before the duplicates) - - Reference<XNamed> xPrevName; - for (sal_Int32 i = 0; i < nDimIndex; ++i) - { - xPrevName.set( xIntDims->getByIndex(i), UNO_QUERY ); - if ( xPrevName.is() && lcl_GetOriginalName( xPrevName ) == sOriginalName ) - ++nRepeat; - } - } - rFieldId.mnFieldIdx = nRepeat; - } - else - bOk = false; - } - - return bOk; -} - -sal_Bool lcl_GetFieldDataByName( ScDPObject* pDPObj, const OUString& rFieldName, ScFieldIdentifier& rFieldId ) -{ - // "By name" is always the first match. - // The name "Data" always refers to the data layout field. - rFieldId.maFieldName = rFieldName; - rFieldId.mnFieldIdx = 0; - rFieldId.mbDataLayout = rFieldName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_DATALAYOUT_NAME ) ); - - pDPObj->GetSource(); // IsDimNameInUse doesn't update source data - - // check if the named field exists (not for data layout) - return rFieldId.mbDataLayout || pDPObj->IsDimNameInUse( rFieldName ); -} - -// XDataPilotFields - -ScDataPilotFieldObj* ScDataPilotFieldsObj::GetObjectByIndex_Impl( sal_Int32 nIndex ) const -{ -// TODO - if (ScDPObject* pObj = GetDPObject()) - { - ScFieldIdentifier aFieldId; - if (lcl_GetFieldDataByIndex( pObj->GetSource(), maOrient, nIndex, aFieldId )) - return new ScDataPilotFieldObj( mrParent, aFieldId, maOrient ); - } - return 0; -} - -ScDataPilotFieldObj* ScDataPilotFieldsObj::GetObjectByName_Impl(const OUString& aName) const -{ - if (ScDPObject* pDPObj = GetDPObject()) - { - ScFieldIdentifier aFieldId; - if (lcl_GetFieldDataByName( pDPObj, aName, aFieldId )) - return new ScDataPilotFieldObj( mrParent, aFieldId, maOrient ); - } - return 0; -} - -// XEnumerationAccess - -Reference<XEnumeration> SAL_CALL ScDataPilotFieldsObj::createEnumeration() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.DataPilotFieldsEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScDataPilotFieldsObj::getCount() throw(RuntimeException) -{ - SolarMutexGuard aGuard; -// TODO - ScDPObject* pDPObj = GetDPObject(); - return pDPObj ? lcl_GetFieldCount( pDPObj->GetSource(), maOrient ) : 0; -} - -Any SAL_CALL ScDataPilotFieldsObj::getByIndex( sal_Int32 nIndex ) - throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - Reference< XPropertySet > xField( GetObjectByIndex_Impl( nIndex ) ); - if (!xField.is()) - throw IndexOutOfBoundsException(); - return Any( xField ); -} - -uno::Type SAL_CALL ScDataPilotFieldsObj::getElementType() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((Reference<XPropertySet>*)0); -} - -sal_Bool SAL_CALL ScDataPilotFieldsObj::hasElements() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -Any SAL_CALL ScDataPilotFieldsObj::getByName( const OUString& aName ) - throw(NoSuchElementException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - Reference<XPropertySet> xField(GetObjectByName_Impl(aName)); - if (!xField.is()) - throw NoSuchElementException(); - return Any( xField ); -} - -Sequence<OUString> SAL_CALL ScDataPilotFieldsObj::getElementNames() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; -// TODO - if (ScDPObject* pDPObj = GetDPObject()) - { - Sequence< OUString > aSeq( lcl_GetFieldCount( pDPObj->GetSource(), maOrient ) ); - OUString* pAry = aSeq.getArray(); - - const boost::ptr_vector<ScDPSaveDimension>& rDimensions = pDPObj->GetSaveData()->GetDimensions(); - boost::ptr_vector<ScDPSaveDimension>::const_iterator it; - for (it = rDimensions.begin(); it != rDimensions.end(); ++it) - { - if(maOrient.hasValue() && (it->GetOrientation() == maOrient.get< DataPilotFieldOrientation >())) - { - *pAry = it->GetName(); - ++pAry; - } - } - return aSeq; - } - return Sequence<OUString>(); -} - -sal_Bool SAL_CALL ScDataPilotFieldsObj::hasByName( const OUString& aName ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - - return GetObjectByName_Impl(aName) != NULL; -} - -//------------------------------------------------------------------------ - -ScDataPilotFieldObj::ScDataPilotFieldObj( - ScDataPilotDescriptorBase& rParent, const ScFieldIdentifier& rFieldId ) : - ScDataPilotChildObjBase( rParent, rFieldId ), - maPropSet( lcl_GetDataPilotFieldMap() ) -{ -} - -ScDataPilotFieldObj::ScDataPilotFieldObj( ScDataPilotDescriptorBase& rParent, - const ScFieldIdentifier& rFieldId, const Any& rOrient ) : - ScDataPilotChildObjBase( rParent, rFieldId ), - maPropSet( lcl_GetDataPilotFieldMap() ), - maOrient( rOrient ) -{ -} - -ScDataPilotFieldObj::~ScDataPilotFieldObj() -{ -} - -// XNamed - -OUString SAL_CALL ScDataPilotFieldObj::getName() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - OUString aName; - if( ScDPSaveDimension* pDim = GetDPDimension() ) - { - if( pDim->IsDataLayout() ) - aName = OUString( RTL_CONSTASCII_USTRINGPARAM( SC_DATALAYOUT_NAME ) ); - else - { - const rtl::OUString* pLayoutName = pDim->GetLayoutName(); - if (pLayoutName) - aName = *pLayoutName; - else - aName = pDim->GetName(); - } } - return aName; -} - -void SAL_CALL ScDataPilotFieldObj::setName( const OUString& rName ) throw(RuntimeException) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ); - if( pDim && !pDim->IsDataLayout() ) - { - String aName( rName ); - pDim->SetLayoutName(aName); - SetDPObject( pDPObj ); - } -} - -// XPropertySet - -Reference<XPropertySetInfo> SAL_CALL ScDataPilotFieldObj::getPropertySetInfo() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - static Reference<XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( maPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScDataPilotFieldObj::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) - throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - if ( aNameString.EqualsAscii( SC_UNONAME_FUNCTION ) ) - { - // #i109350# use GetEnumFromAny because it also allows sal_Int32 - GeneralFunction eFunction = (GeneralFunction) - ScUnoHelpFunctions::GetEnumFromAny( aValue ); - setFunction( eFunction ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_SUBTOTALS ) ) - { - Sequence< GeneralFunction > aSubtotals; - if( aValue >>= aSubtotals ) - setSubtotals( aSubtotals ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_ORIENT ) ) - { - //! test for correct enum type? - DataPilotFieldOrientation eOrient = (DataPilotFieldOrientation) - ScUnoHelpFunctions::GetEnumFromAny( aValue ); - setOrientation( eOrient ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_SELPAGE ) ) - { - OUString sCurrentPage; - if (aValue >>= sCurrentPage) - setCurrentPage(sCurrentPage); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_USESELPAGE ) ) - { - setUseCurrentPage(cppu::any2bool(aValue)); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HASAUTOSHOW ) ) - { - if (!cppu::any2bool(aValue)) - setAutoShowInfo(NULL); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_AUTOSHOW ) ) - { - DataPilotFieldAutoShowInfo aInfo; - if (aValue >>= aInfo) - setAutoShowInfo(&aInfo); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HASLAYOUTINFO ) ) - { - if (!cppu::any2bool(aValue)) - setLayoutInfo(NULL); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_LAYOUTINFO ) ) - { - DataPilotFieldLayoutInfo aInfo; - if (aValue >>= aInfo) - setLayoutInfo(&aInfo); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HASREFERENCE ) ) - { - if (!cppu::any2bool(aValue)) - setReference(NULL); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_REFERENCE ) ) - { - DataPilotFieldReference aRef; - if (aValue >>= aRef) - setReference(&aRef); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HASSORTINFO ) ) - { - if (!cppu::any2bool(aValue)) - setSortInfo(NULL); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_SORTINFO ) ) - { - DataPilotFieldSortInfo aInfo; - if (aValue >>= aInfo) - setSortInfo(&aInfo); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_ISGROUP ) ) - { - if (!cppu::any2bool(aValue)) - setGroupInfo(NULL); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_GROUPINFO ) ) - { - DataPilotFieldGroupInfo aInfo; - if (aValue >>= aInfo) - setGroupInfo(&aInfo); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_SHOWEMPTY ) ) - { - setShowEmpty(cppu::any2bool(aValue)); - } -} - -Any SAL_CALL ScDataPilotFieldObj::getPropertyValue( const OUString& aPropertyName ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - Any aRet; - - if ( aNameString.EqualsAscii( SC_UNONAME_FUNCTION ) ) - aRet <<= getFunction(); - else if ( aNameString.EqualsAscii( SC_UNONAME_SUBTOTALS ) ) - aRet <<= getSubtotals(); - else if ( aNameString.EqualsAscii( SC_UNONAME_ORIENT ) ) - aRet <<= getOrientation(); - else if ( aNameString.EqualsAscii( SC_UNONAME_SELPAGE ) ) - aRet <<= getCurrentPage(); - else if ( aNameString.EqualsAscii( SC_UNONAME_USESELPAGE ) ) - aRet <<= getUseCurrentPage(); - else if ( aNameString.EqualsAscii( SC_UNONAME_HASAUTOSHOW ) ) - aRet = ::cppu::bool2any(getAutoShowInfo() != NULL); - else if ( aNameString.EqualsAscii( SC_UNONAME_AUTOSHOW ) ) - { - const DataPilotFieldAutoShowInfo* pInfo = getAutoShowInfo(); - if (pInfo) - aRet <<= DataPilotFieldAutoShowInfo(*pInfo); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HASLAYOUTINFO ) ) - aRet = ::cppu::bool2any(getLayoutInfo() != NULL); - else if ( aNameString.EqualsAscii( SC_UNONAME_LAYOUTINFO ) ) - { - const DataPilotFieldLayoutInfo* pInfo = getLayoutInfo(); - if (pInfo) - aRet <<= DataPilotFieldLayoutInfo(*pInfo); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HASREFERENCE ) ) - aRet = ::cppu::bool2any(getReference() != NULL); - else if ( aNameString.EqualsAscii( SC_UNONAME_REFERENCE ) ) - { - const DataPilotFieldReference* pRef = getReference(); - if (pRef) - aRet <<= DataPilotFieldReference(*pRef); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HASSORTINFO ) ) - aRet = ::cppu::bool2any(getSortInfo() != NULL); - else if ( aNameString.EqualsAscii( SC_UNONAME_SORTINFO ) ) - { - const DataPilotFieldSortInfo* pInfo = getSortInfo(); - if (pInfo) - aRet <<= DataPilotFieldSortInfo(*pInfo); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_ISGROUP ) ) - aRet = ::cppu::bool2any(hasGroupInfo()); - else if ( aNameString.EqualsAscii( SC_UNONAME_GROUPINFO ) ) - { - aRet <<= getGroupInfo(); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_SHOWEMPTY ) ) - aRet <<= getShowEmpty(); - - return aRet; -} - -// XDatePilotField - -Reference<XIndexAccess> SAL_CALL ScDataPilotFieldObj::getItems() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - if (!mxItems.is()) - mxItems.set( new ScDataPilotItemsObj( mrParent, maFieldId ) ); - return mxItems; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScDataPilotFieldObj ) - -DataPilotFieldOrientation ScDataPilotFieldObj::getOrientation() const -{ - SolarMutexGuard aGuard; - ScDPSaveDimension* pDim = GetDPDimension(); - return pDim ? static_cast< DataPilotFieldOrientation >( pDim->GetOrientation() ) : DataPilotFieldOrientation_HIDDEN; -} - -void ScDataPilotFieldObj::setOrientation(DataPilotFieldOrientation eNew) -{ - SolarMutexGuard aGuard; - if (maOrient.hasValue() && (eNew == maOrient.get< DataPilotFieldOrientation >())) - return; - - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - ScDPSaveData* pSaveData = pDPObj->GetSaveData(); - - /* If the field was taken from getDataPilotFields(), don't reset the - orientation for an existing use, but create a duplicated field - instead (for "Data" orientation only). */ - if ( !maOrient.hasValue() && !maFieldId.mbDataLayout && - (pDim->GetOrientation() != DataPilotFieldOrientation_HIDDEN) && - (eNew == DataPilotFieldOrientation_DATA) ) - { - - ScDPSaveDimension* pNewDim = 0; - - // look for existing duplicate with orientation "hidden" - - sal_Int32 nFound = 0; - const boost::ptr_vector<ScDPSaveDimension>& rDimensions = pSaveData->GetDimensions(); - boost::ptr_vector<ScDPSaveDimension>::const_iterator it; - for ( it = rDimensions.begin(); it != rDimensions.end() && !pNewDim; ++it ) - { - if ( !it->IsDataLayout() && (it->GetName() == maFieldId.maFieldName) ) - { - if ( it->GetOrientation() == DataPilotFieldOrientation_HIDDEN ) - pNewDim = const_cast<ScDPSaveDimension*>(&(*it)); // use this one - else - ++nFound; // count existing non-hidden occurrences - } - } - - if ( !pNewDim ) // if none found, create a new duplicated dimension - pNewDim = &pSaveData->DuplicateDimension( *pDim ); - - maFieldId.mnFieldIdx = nFound; // keep accessing the new one - pDim = pNewDim; - } - - pDim->SetOrientation(sal::static_int_cast<sal_uInt16>(eNew)); - - // move changed field behind all other fields (make it the last field in dimension) - pSaveData->SetPosition( pDim, pSaveData->GetDimensions().size() ); - - SetDPObject( pDPObj ); - - maOrient <<= eNew; // modifying the same object's orientation again doesn't create another duplicate - } -} - -GeneralFunction ScDataPilotFieldObj::getFunction() const -{ - SolarMutexGuard aGuard; - GeneralFunction eRet = GeneralFunction_NONE; - if( ScDPSaveDimension* pDim = GetDPDimension() ) - { - if( pDim->GetOrientation() != DataPilotFieldOrientation_DATA ) - { - // for non-data fields, property Function is the subtotals - long nSubCount = pDim->GetSubTotalsCount(); - if ( nSubCount > 0 ) - eRet = (GeneralFunction)pDim->GetSubTotalFunc(0); // always use the first one - // else keep NONE - } - else - eRet = (GeneralFunction)pDim->GetFunction(); - } - return eRet; -} - -void ScDataPilotFieldObj::setFunction(GeneralFunction eNewFunc) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - if( pDim->GetOrientation() != DataPilotFieldOrientation_DATA ) - { - // for non-data fields, property Function is the subtotals - if ( eNewFunc == GeneralFunction_NONE ) - pDim->SetSubTotals( 0, NULL ); - else - { - sal_uInt16 nFunc = sal::static_int_cast<sal_uInt16>( eNewFunc ); - pDim->SetSubTotals( 1, &nFunc ); - } - } - else - pDim->SetFunction( sal::static_int_cast<sal_uInt16>( eNewFunc ) ); - SetDPObject( pDPObj ); - } -} - -Sequence< GeneralFunction > ScDataPilotFieldObj::getSubtotals() const -{ - SolarMutexGuard aGuard; - Sequence< GeneralFunction > aRet; - if( ScDPSaveDimension* pDim = GetDPDimension() ) - { - if( pDim->GetOrientation() != DataPilotFieldOrientation_DATA ) - { - // for non-data fields, property Functions is the sequence of subtotals - sal_Int32 nCount = static_cast< sal_Int32 >( pDim->GetSubTotalsCount() ); - if ( nCount > 0 ) - { - aRet.realloc( nCount ); - for( sal_Int32 nIdx = 0; nIdx < nCount; ++nIdx ) - aRet[ nIdx ] = (GeneralFunction)pDim->GetSubTotalFunc( nIdx ); - } - } - } - return aRet; -} - -void ScDataPilotFieldObj::setSubtotals( const Sequence< GeneralFunction >& rSubtotals ) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - if( pDim->GetOrientation() != DataPilotFieldOrientation_DATA ) - { - sal_Int32 nCount = rSubtotals.getLength(); - if( nCount == 1 ) - { - // count 1: all values are allowed (including NONE and AUTO) - if( rSubtotals[ 0 ] == GeneralFunction_NONE ) - pDim->SetSubTotals( 0, NULL ); - else - { - sal_uInt16 nFunc = sal::static_int_cast<sal_uInt16>( rSubtotals[ 0 ] ); - pDim->SetSubTotals( 1, &nFunc ); - } - } - else if( nCount > 1 ) - { - // set multiple functions, ignore NONE and AUTO in this case - ::std::vector< sal_uInt16 > aSubt; - for( sal_Int32 nIdx = 0; nIdx < nCount; ++nIdx ) - { - GeneralFunction eFunc = rSubtotals[ nIdx ]; - if( (eFunc != GeneralFunction_NONE) && (eFunc != GeneralFunction_AUTO) ) - { - // do not insert functions twice - sal_uInt16 nFunc = static_cast< sal_uInt16 >( eFunc ); - if( ::std::find( aSubt.begin(), aSubt.end(), nFunc ) == aSubt.end() ) - aSubt.push_back( nFunc ); - } - } - // set values from vector to ScDPSaveDimension - if ( aSubt.empty() ) - pDim->SetSubTotals( 0, NULL ); - else - pDim->SetSubTotals( static_cast< long >( aSubt.size() ), &aSubt.front() ); - } - } - SetDPObject( pDPObj ); - } -} - -OUString ScDataPilotFieldObj::getCurrentPage() const -{ - SolarMutexGuard aGuard; - ScDPSaveDimension* pDim = GetDPDimension(); - if( pDim && pDim->HasCurrentPage() ) - return pDim->GetCurrentPage(); - return OUString(); -} - -void ScDataPilotFieldObj::setCurrentPage( const OUString& rPage ) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - pDim->SetCurrentPage( &rPage ); - SetDPObject( pDPObj ); - } -} - -sal_Bool ScDataPilotFieldObj::getUseCurrentPage() const -{ - SolarMutexGuard aGuard; - ScDPSaveDimension* pDim = GetDPDimension(); - return pDim && pDim->HasCurrentPage(); -} - -void ScDataPilotFieldObj::setUseCurrentPage( sal_Bool bUse ) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - if( bUse ) - { - /* It is somehow useless to set the property "HasSelectedPage" to - true, because it is still needed to set an explicit page name. */ - if( !pDim->HasCurrentPage() ) - { - const ::rtl::OUString aPage; - pDim->SetCurrentPage( &aPage ); - } - } - else - pDim->SetCurrentPage( 0 ); - SetDPObject( pDPObj ); - } -} - -const DataPilotFieldAutoShowInfo* ScDataPilotFieldObj::getAutoShowInfo() -{ - SolarMutexGuard aGuard; - ScDPSaveDimension* pDim = GetDPDimension(); - return pDim ? pDim->GetAutoShowInfo() : 0; -} - -void ScDataPilotFieldObj::setAutoShowInfo( const DataPilotFieldAutoShowInfo* pInfo ) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - pDim->SetAutoShowInfo( pInfo ); - SetDPObject( pDPObj ); - } -} - -const DataPilotFieldLayoutInfo* ScDataPilotFieldObj::getLayoutInfo() -{ - SolarMutexGuard aGuard; - ScDPSaveDimension* pDim = GetDPDimension(); - return pDim ? pDim->GetLayoutInfo() : 0; -} - -void ScDataPilotFieldObj::setLayoutInfo( const DataPilotFieldLayoutInfo* pInfo ) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - pDim->SetLayoutInfo( pInfo ); - SetDPObject( pDPObj ); - } -} - -const DataPilotFieldReference* ScDataPilotFieldObj::getReference() -{ - SolarMutexGuard aGuard; - ScDPSaveDimension* pDim = GetDPDimension(); - return pDim ? pDim->GetReferenceValue() : 0; -} - -void ScDataPilotFieldObj::setReference( const DataPilotFieldReference* pInfo ) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - pDim->SetReferenceValue( pInfo ); - SetDPObject( pDPObj ); - } -} - -const DataPilotFieldSortInfo* ScDataPilotFieldObj::getSortInfo() -{ - SolarMutexGuard aGuard; - ScDPSaveDimension* pDim = GetDPDimension(); - return pDim ? pDim->GetSortInfo() : 0; -} - -void ScDataPilotFieldObj::setSortInfo( const DataPilotFieldSortInfo* pInfo ) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - pDim->SetSortInfo( pInfo ); - SetDPObject( pDPObj ); - } -} - -sal_Bool ScDataPilotFieldObj::getShowEmpty() const -{ - SolarMutexGuard aGuard; - ScDPSaveDimension* pDim = GetDPDimension(); - return pDim && pDim->GetShowEmpty(); -} - -void ScDataPilotFieldObj::setShowEmpty( sal_Bool bShow ) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - pDim->SetShowEmpty( bShow ); - SetDPObject( pDPObj ); - } -} - -sal_Bool ScDataPilotFieldObj::hasGroupInfo() -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - if( const ScDPDimensionSaveData* pDimData = pDPObj->GetSaveData()->GetExistingDimensionData() ) - return pDimData->GetNamedGroupDim( pDim->GetName() ) || pDimData->GetNumGroupDim( pDim->GetName() ); - return false; -} - -DataPilotFieldGroupInfo ScDataPilotFieldObj::getGroupInfo() -{ - SolarMutexGuard aGuard; - DataPilotFieldGroupInfo aInfo; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - if( const ScDPDimensionSaveData* pDimData = pDPObj->GetSaveData()->GetExistingDimensionData() ) - { - if( const ScDPSaveGroupDimension* pGroupDim = pDimData->GetNamedGroupDim( pDim->GetName() ) ) - { - // grouped by ... - aInfo.GroupBy = pGroupDim->GetDatePart(); - - // find source field - try - { - Reference< XNameAccess > xFields( mrParent.getDataPilotFields(), UNO_QUERY_THROW ); - aInfo.SourceField.set( xFields->getByName( pGroupDim->GetSourceDimName() ), UNO_QUERY ); - } - catch( Exception& ) - { - } - - ScDataPilotConversion::FillGroupInfo( aInfo, pGroupDim->GetDateInfo() ); - if( pGroupDim->GetDatePart() == 0 ) - { - // fill vector of group and group member information - ScFieldGroups aGroups; - for( sal_Int32 nIdx = 0, nCount = pGroupDim->GetGroupCount(); nIdx < nCount; ++nIdx ) - { - if( const ScDPSaveGroupItem* pGroup = pGroupDim->GetGroupByIndex( nIdx ) ) - { - ScFieldGroup aGroup; - aGroup.maName = pGroup->GetGroupName(); - for( sal_Int32 nMemIdx = 0, nMemCount = pGroup->GetElementCount(); nMemIdx < nMemCount; ++nMemIdx ) - if( const String* pMem = pGroup->GetElementByIndex( nMemIdx ) ) - aGroup.maMembers.push_back( *pMem ); - aGroups.push_back( aGroup ); - } - } - aInfo.Groups = new ScDataPilotFieldGroupsObj( aGroups ); - } - } - else if( const ScDPSaveNumGroupDimension* pNumGroupDim = pDimData->GetNumGroupDim( pDim->GetName() ) ) - { - if (pNumGroupDim->GetDatePart()) - { - ScDataPilotConversion::FillGroupInfo( aInfo, pNumGroupDim->GetDateInfo() ); - aInfo.GroupBy = pNumGroupDim->GetDatePart(); - } - else - { - ScDataPilotConversion::FillGroupInfo( aInfo, pNumGroupDim->GetInfo() ); - } - } - } - } - return aInfo; -} - -void ScDataPilotFieldObj::setGroupInfo( const DataPilotFieldGroupInfo* pInfo ) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( /*ScDPSaveDimension* pDim =*/ GetDPDimension( &pDPObj ) ) - { - ScDPSaveData* pSaveData = pDPObj->GetSaveData(); - if( pInfo && lclCheckMinMaxStep( *pInfo ) ) - { - ScDPNumGroupInfo aInfo; - aInfo.Enable = sal_True; - aInfo.DateValues = pInfo->HasDateValues; - aInfo.AutoStart = pInfo->HasAutoStart; - aInfo.AutoEnd = pInfo->HasAutoEnd; - aInfo.Start = pInfo->Start; - aInfo.End = pInfo->End; - aInfo.Step = pInfo->Step; - Reference< XNamed > xNamed( pInfo->SourceField, UNO_QUERY ); - if( xNamed.is() ) - { - ScDPSaveGroupDimension aGroupDim( xNamed->getName(), getName() ); - if( pInfo->GroupBy ) - aGroupDim.SetDateInfo(aInfo, pInfo->GroupBy); - else - { - Reference<XIndexAccess> xIndex(pInfo->Groups, UNO_QUERY); - if (xIndex.is()) - { - sal_Int32 nCount(xIndex->getCount()); - for(sal_Int32 i = 0; i < nCount; i++) - { - Reference<XNamed> xGroupNamed(xIndex->getByIndex(i), UNO_QUERY); - if (xGroupNamed.is()) - { - ScDPSaveGroupItem aItem(xGroupNamed->getName()); - Reference<XIndexAccess> xGroupIndex(xGroupNamed, UNO_QUERY); - if (xGroupIndex.is()) - { - sal_Int32 nItemCount(xGroupIndex->getCount()); - for (sal_Int32 j = 0; j < nItemCount; ++j) - { - Reference<XNamed> xItemNamed(xGroupIndex->getByIndex(j), UNO_QUERY); - if (xItemNamed.is()) - aItem.AddElement(xItemNamed->getName()); - } - } - aGroupDim.AddGroupItem(aItem); - } - } - } - } - - // get dimension savedata or create new if none - ScDPDimensionSaveData& rDimSaveData = *pSaveData->GetDimensionData(); - rDimSaveData.ReplaceGroupDimension( aGroupDim ); - } - else // no source field in group info -> numeric group - { - ScDPDimensionSaveData* pDimData = pSaveData->GetDimensionData(); // created if not there - - ScDPSaveNumGroupDimension* pExisting = pDimData->GetNumGroupDimAcc( getName() ); - if ( pExisting ) - { - if (pInfo->GroupBy) - pExisting->SetDateInfo(aInfo, pInfo->GroupBy); - // modify existing group dimension - pExisting->SetGroupInfo( aInfo ); - } - else if (pInfo->GroupBy) - { - // create new group dimension - ScDPSaveNumGroupDimension aNumGroupDim( getName(), aInfo, pInfo->GroupBy ); - pDimData->AddNumGroupDimension( aNumGroupDim ); - } - else - { - // create new group dimension - ScDPSaveNumGroupDimension aNumGroupDim( getName(), aInfo ); - pDimData->AddNumGroupDimension( aNumGroupDim ); - } - } - } - else // null passed as argument - { - pSaveData->SetDimensionData( 0 ); - } - - pDPObj->SetSaveData( *pSaveData ); - SetDPObject( pDPObj ); - } -} - -sal_Bool ScDataPilotFieldObj::HasString(const Sequence< OUString >& rItems, const OUString& aString) -{ - sal_Bool bRet = false; - - sal_Int32 nCount(rItems.getLength()); - sal_Int32 nItem(0); - while (nItem < nCount && !bRet) - { - bRet = rItems[nItem] == aString; - ++nItem; - } - - return bRet; -} - -// XDataPilotFieldGrouping -Reference< XDataPilotField > SAL_CALL ScDataPilotFieldObj::createNameGroup( const Sequence< OUString >& rItems ) - throw (RuntimeException, IllegalArgumentException) -{ - SolarMutexGuard aGuard; - - Reference< XDataPilotField > xRet; - OUString sNewDim; - - if( !rItems.hasElements() ) - throw IllegalArgumentException(); - - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - String aDimName = pDim->GetName(); - - ScDPSaveData aSaveData = *pDPObj->GetSaveData(); - ScDPDimensionSaveData* pDimData = aSaveData.GetDimensionData(); // created if not there - - // find original base - String aBaseDimName( aDimName ); - const ScDPSaveGroupDimension* pBaseGroupDim = pDimData->GetNamedGroupDim( aDimName ); - if ( pBaseGroupDim ) - { - // any entry's SourceDimName is the original base - aBaseDimName = pBaseGroupDim->GetSourceDimName(); - } - - // find existing group dimension - // (using the selected dim, can be intermediate group dim) - ScDPSaveGroupDimension* pGroupDimension = pDimData->GetGroupDimAccForBase( aDimName ); - - // remove the selected items from their groups - // (empty groups are removed, too) - sal_Int32 nEntryCount = rItems.getLength(); - sal_Int32 nEntry; - if ( pGroupDimension ) - { - for (nEntry=0; nEntry<nEntryCount; nEntry++) - { - String aEntryName(rItems[nEntry]); - if ( pBaseGroupDim ) - { - // for each selected (intermediate) group, remove all its items - // (same logic as for adding, below) - const ScDPSaveGroupItem* pBaseGroup = pBaseGroupDim->GetNamedGroup( aEntryName ); - if ( pBaseGroup ) - pBaseGroup->RemoveElementsFromGroups( *pGroupDimension ); // remove all elements - else - pGroupDimension->RemoveFromGroups( aEntryName ); - } - else - pGroupDimension->RemoveFromGroups( aEntryName ); - } - } - - ScDPSaveGroupDimension* pNewGroupDim = 0; - if ( !pGroupDimension ) - { - // create a new group dimension - String aGroupDimName = pDimData->CreateGroupDimName( aBaseDimName, *pDPObj, false, NULL ); - pNewGroupDim = new ScDPSaveGroupDimension( aBaseDimName, aGroupDimName ); - sNewDim = aGroupDimName; - - pGroupDimension = pNewGroupDim; // make changes to the new dim if none existed - - if ( pBaseGroupDim ) - { - // If it's a higher-order group dimension, pre-allocate groups for all - // non-selected original groups, so the individual base members aren't - // used for automatic groups (this would make the original groups hard - // to find). - //! Also do this when removing groups? - //! Handle this case dynamically with automatic groups? - - long nGroupCount = pBaseGroupDim->GetGroupCount(); - for ( long nGroup = 0; nGroup < nGroupCount; nGroup++ ) - { - const ScDPSaveGroupItem* pBaseGroup = pBaseGroupDim->GetGroupByIndex( nGroup ); - - StrData aStrData( pBaseGroup->GetGroupName() ); - if ( !HasString(rItems, aStrData.GetString()) ) //! ignore case? - { - // add an additional group for each item that is not in the selection - ScDPSaveGroupItem aGroup( pBaseGroup->GetGroupName() ); - aGroup.AddElementsFromGroup( *pBaseGroup ); - pGroupDimension->AddGroupItem( aGroup ); - } - } - } - } - String aGroupDimName = pGroupDimension->GetGroupDimName(); - - //! localized prefix string - String aGroupName = pGroupDimension->CreateGroupName( String( RTL_CONSTASCII_USTRINGPARAM( "Group" ) ) ); - ScDPSaveGroupItem aGroup( aGroupName ); - Reference< XNameAccess > xMembers = GetMembers(); - if (!xMembers.is()) - { - delete pNewGroupDim; - throw RuntimeException(); - } - - for (nEntry=0; nEntry<nEntryCount; nEntry++) - { - String aEntryName(rItems[nEntry]); - - if (!xMembers->hasByName(aEntryName)) - { - delete pNewGroupDim; - throw IllegalArgumentException(); - } - - if ( pBaseGroupDim ) - { - // for each selected (intermediate) group, add all its items - const ScDPSaveGroupItem* pBaseGroup = pBaseGroupDim->GetNamedGroup( aEntryName ); - if ( pBaseGroup ) - aGroup.AddElementsFromGroup( *pBaseGroup ); - else - aGroup.AddElement( aEntryName ); // no group found -> automatic group, add the item itself - } - else - aGroup.AddElement( aEntryName ); // no group dimension, add all items directly - } - - pGroupDimension->AddGroupItem( aGroup ); - - if ( pNewGroupDim ) - { - pDimData->AddGroupDimension( *pNewGroupDim ); - delete pNewGroupDim; // AddGroupDimension copies the object - // don't access pGroupDimension after here - } - pGroupDimension = pNewGroupDim = NULL; - - // set orientation - ScDPSaveDimension* pSaveDimension = aSaveData.GetDimensionByName( aGroupDimName ); - if ( pSaveDimension->GetOrientation() == DataPilotFieldOrientation_HIDDEN ) - { - ScDPSaveDimension* pOldDimension = aSaveData.GetDimensionByName( aDimName ); - pSaveDimension->SetOrientation( pOldDimension->GetOrientation() ); - long nPosition = 0; //! before (immediate) base - aSaveData.SetPosition( pSaveDimension, nPosition ); - } - - // apply changes - pDPObj->SetSaveData( aSaveData ); - SetDPObject( pDPObj ); - } - - // if new grouping field has been created (on first group), return it - if( sNewDim.getLength() > 0 ) - { - Reference< XNameAccess > xFields(mrParent.getDataPilotFields(), UNO_QUERY); - if (xFields.is()) - { - xRet.set(xFields->getByName(sNewDim), UNO_QUERY); - OSL_ENSURE(xRet.is(), "there is a name, so there should be also a field"); - } - } - return xRet; -} - -Reference < XDataPilotField > SAL_CALL ScDataPilotFieldObj::createDateGroup( const DataPilotFieldGroupInfo& rInfo ) - throw (RuntimeException, IllegalArgumentException) -{ - SolarMutexGuard aGuard; - using namespace ::com::sun::star::sheet::DataPilotFieldGroupBy; - - // check min/max/step, HasDateValues must be set always - if( !rInfo.HasDateValues || !lclCheckMinMaxStep( rInfo ) ) - throw IllegalArgumentException(); - // only a single date flag is allowed - if( (rInfo.GroupBy == 0) || (rInfo.GroupBy > YEARS) || ((rInfo.GroupBy & (rInfo.GroupBy - 1)) != 0) ) - throw IllegalArgumentException(); - // step must be zero, if something else than DAYS is specified - if( rInfo.Step >= ((rInfo.GroupBy == DAYS) ? 32768.0 : 1.0) ) - throw IllegalArgumentException(); - - String aGroupDimName; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - ScDPNumGroupInfo aInfo; - aInfo.Enable = sal_True; - aInfo.DateValues = (rInfo.GroupBy == DAYS) && (rInfo.Step >= 1.0); - aInfo.AutoStart = rInfo.HasAutoStart; - aInfo.AutoEnd = rInfo.HasAutoEnd; - aInfo.Start = rInfo.Start; - aInfo.End = rInfo.End; - aInfo.Step = static_cast< sal_Int32 >( rInfo.Step ); - - // create a local copy of the entire save data (will be written back below) - ScDPSaveData aSaveData = *pDPObj->GetSaveData(); - // get or create dimension save data - ScDPDimensionSaveData& rDimData = *aSaveData.GetDimensionData(); - - // find source dimension name - const String& rDimName = pDim->GetName(); - const ScDPSaveGroupDimension* pGroupDim = rDimData.GetNamedGroupDim( rDimName ); - String aSrcDimName = pGroupDim ? pGroupDim->GetSourceDimName() : rDimName; - - // find a group dimension for the base field, or get numeric grouping - pGroupDim = rDimData.GetFirstNamedGroupDim( aSrcDimName ); - const ScDPSaveNumGroupDimension* pNumGroupDim = rDimData.GetNumGroupDim( aSrcDimName ); - - // do not group by dates, if named groups or numeric grouping is present - bool bHasNamedGrouping = pGroupDim && !pGroupDim->GetDateInfo().Enable; - bool bHasNumGrouping = pNumGroupDim && pNumGroupDim->GetInfo().Enable && !pNumGroupDim->GetInfo().DateValues && !pNumGroupDim->GetDateInfo().Enable; - if( bHasNamedGrouping || bHasNumGrouping ) - throw IllegalArgumentException(); - - if( aInfo.DateValues ) // create day ranges grouping - { - // first remove all named group dimensions - while( pGroupDim ) - { - String aGroupDimName2 = pGroupDim->GetGroupDimName(); - // find next group dimension before deleting this group - pGroupDim = rDimData.GetNextNamedGroupDim( aGroupDimName2 ); - // remove from dimension save data - rDimData.RemoveGroupDimension( aGroupDimName2 ); - // also remove save data settings for the dimension that no longer exists - aSaveData.RemoveDimensionByName( aGroupDimName2 ); - } - // create or replace the number grouping dimension - ScDPSaveNumGroupDimension aNumGroupDim( aSrcDimName, aInfo ); - rDimData.ReplaceNumGroupDimension( aNumGroupDim ); - } - else // create date grouping - { - // collect all existing date flags - sal_Int32 nDateParts = rDimData.CollectDateParts( aSrcDimName ); - if( nDateParts == 0 ) - { - // insert numeric group dimension, if no date groups exist yet (or replace day range grouping) - ScDPSaveNumGroupDimension aNumGroupDim( aSrcDimName, aInfo, rInfo.GroupBy ); - rDimData.ReplaceNumGroupDimension( aNumGroupDim ); - } - else if( (nDateParts & rInfo.GroupBy) == 0 ) // do nothing if date field exists already - { - // create new named group dimension for additional date groups - aGroupDimName = rDimData.CreateDateGroupDimName( rInfo.GroupBy, *pDPObj, true, 0 ); - ScDPSaveGroupDimension aGroupDim( aSrcDimName, aGroupDimName, aInfo, rInfo.GroupBy ); - rDimData.AddGroupDimension( aGroupDim ); - - // set orientation of new named group dimension - ScDPSaveDimension& rSaveDim = *aSaveData.GetDimensionByName( aGroupDimName ); - if( rSaveDim.GetOrientation() == DataPilotFieldOrientation_HIDDEN ) - { - ScDPSaveDimension& rOldDim = *aSaveData.GetDimensionByName( aSrcDimName ); - rSaveDim.SetOrientation( rOldDim.GetOrientation() ); - aSaveData.SetPosition( &rSaveDim, 0 ); //! before (immediate) base - } - } - } - - // apply changes - pDPObj->SetSaveData( aSaveData ); - SetDPObject( pDPObj ); - } - - // return the UNO object of the new dimension, after writing back saved data - Reference< XDataPilotField > xRet; - if( aGroupDimName.Len() > 0 ) try - { - Reference< XNameAccess > xFields( mrParent.getDataPilotFields(), UNO_QUERY_THROW ); - xRet.set( xFields->getByName( aGroupDimName ), UNO_QUERY ); - } - catch( Exception& ) - { - } - return xRet; -} - -// ============================================================================ - -namespace { - -bool lclExtractGroupMembers( ScFieldGroupMembers& rMembers, const Any& rElement ) -{ - // allow empty value to create a new group - if( !rElement.hasValue() ) - return true; - - // try to extract a simple sequence of strings - Sequence< OUString > aSeq; - if( rElement >>= aSeq ) - { - if( aSeq.hasElements() ) - rMembers.insert( rMembers.end(), aSeq.getConstArray(), aSeq.getConstArray() + aSeq.getLength() ); - return true; - } - - // try to use XIndexAccess providing objects that support XNamed - Reference< XIndexAccess > xItemsIA( rElement, UNO_QUERY ); - if( xItemsIA.is() ) - { - for( sal_Int32 nIdx = 0, nCount = xItemsIA->getCount(); nIdx < nCount; ++nIdx ) - { - try // getByIndex() should not throw, but we cannot be sure - { - Reference< XNamed > xItemName( xItemsIA->getByIndex( nIdx ), UNO_QUERY_THROW ); - rMembers.push_back( xItemName->getName() ); - } - catch( Exception& ) - { - // ignore exceptions, go ahead with next element in the array - } - } - return true; - } - - // nothing valid inside the Any -> return false - return false; -} - -} // namespace - -// ---------------------------------------------------------------------------- - -ScDataPilotFieldGroupsObj::ScDataPilotFieldGroupsObj( const ScFieldGroups& rGroups ) : - maGroups( rGroups ) -{ -} - -ScDataPilotFieldGroupsObj::~ScDataPilotFieldGroupsObj() -{ -} - -// XNameAccess - -Any SAL_CALL ScDataPilotFieldGroupsObj::getByName( const OUString& rName ) - throw(NoSuchElementException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - if( implFindByName( rName ) == maGroups.end() ) - throw NoSuchElementException(); - return Any( Reference< XNameAccess >( new ScDataPilotFieldGroupObj( *this, rName ) ) ); -} - -Sequence< OUString > SAL_CALL ScDataPilotFieldGroupsObj::getElementNames() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - Sequence< OUString > aSeq; - if( !maGroups.empty() ) - { - aSeq.realloc( static_cast< sal_Int32 >( maGroups.size() ) ); - OUString* pName = aSeq.getArray(); - for( ScFieldGroups::iterator aIt = maGroups.begin(), aEnd = maGroups.end(); aIt != aEnd; ++aIt, ++pName ) - *pName = aIt->maName; - } - return aSeq; -} - -sal_Bool SAL_CALL ScDataPilotFieldGroupsObj::hasByName( const OUString& rName ) throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return implFindByName( rName ) != maGroups.end(); -} - -// XNameReplace - -void SAL_CALL ScDataPilotFieldGroupsObj::replaceByName( const OUString& rName, const Any& rElement ) - throw (IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - - if( rName.getLength() == 0 ) - throw IllegalArgumentException(); - - ScFieldGroups::iterator aIt = implFindByName( rName ); - if( aIt == maGroups.end() ) - throw NoSuchElementException(); - - // read all item names provided by the passed object - ScFieldGroupMembers aMembers; - if( !lclExtractGroupMembers( aMembers, rElement ) ) - throw IllegalArgumentException(); - - // copy and forget, faster than vector assignment - aIt->maMembers.swap( aMembers ); -} - -// XNameContainer - -void SAL_CALL ScDataPilotFieldGroupsObj::insertByName( const OUString& rName, const Any& rElement ) - throw (IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - - if( rName.getLength() == 0 ) - throw IllegalArgumentException(); - - ScFieldGroups::iterator aIt = implFindByName( rName ); - if( aIt != maGroups.end() ) - throw ElementExistException(); - - // read all item names provided by the passed object - ScFieldGroupMembers aMembers; - if( !lclExtractGroupMembers( aMembers, rElement ) ) - throw IllegalArgumentException(); - - // create the new entry if no error has been occurred - maGroups.resize( maGroups.size() + 1 ); - ScFieldGroup& rGroup = maGroups.back(); - rGroup.maName = rName; - rGroup.maMembers.swap( aMembers ); -} - -void SAL_CALL ScDataPilotFieldGroupsObj::removeByName( const OUString& rName ) - throw (NoSuchElementException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - - if( rName.getLength() == 0 ) - throw IllegalArgumentException(); - - ScFieldGroups::iterator aIt = implFindByName( rName ); - if( aIt == maGroups.end() ) - throw NoSuchElementException(); - - maGroups.erase( aIt ); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScDataPilotFieldGroupsObj::getCount() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return static_cast< sal_Int32 >( maGroups.size() ); -} - -Any SAL_CALL ScDataPilotFieldGroupsObj::getByIndex( sal_Int32 nIndex ) - throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - if ((nIndex < 0) || (nIndex >= static_cast< sal_Int32 >( maGroups.size() ))) - throw IndexOutOfBoundsException(); - return Any( Reference< XNameAccess >( new ScDataPilotFieldGroupObj( *this, maGroups[ nIndex ].maName ) ) ); -} - -// XEnumerationAccess - -Reference<XEnumeration> SAL_CALL ScDataPilotFieldGroupsObj::createEnumeration() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration( this, OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.DataPilotFieldGroupsEnumeration" ) ) ); -} - -// XElementAccess - -uno::Type SAL_CALL ScDataPilotFieldGroupsObj::getElementType() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType( (Reference< XNameAccess >*)0 ); -} - -sal_Bool SAL_CALL ScDataPilotFieldGroupsObj::hasElements() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return !maGroups.empty(); -} - -// implementation - -ScFieldGroup& ScDataPilotFieldGroupsObj::getFieldGroup( const OUString& rName ) throw(RuntimeException) -{ - SolarMutexGuard aGuard; - ScFieldGroups::iterator aIt = implFindByName( rName ); - if( aIt == maGroups.end() ) - throw RuntimeException(); - return *aIt; -} - -void ScDataPilotFieldGroupsObj::renameFieldGroup( const OUString& rOldName, const OUString& rNewName ) throw(RuntimeException) -{ - SolarMutexGuard aGuard; - ScFieldGroups::iterator aOldIt = implFindByName( rOldName ); - ScFieldGroups::iterator aNewIt = implFindByName( rNewName ); - // new name must not exist yet - if( (aOldIt == maGroups.end()) || ((aNewIt != maGroups.end()) && (aNewIt != aOldIt)) ) - throw RuntimeException(); - aOldIt->maName = rNewName; -} - -ScFieldGroups::iterator ScDataPilotFieldGroupsObj::implFindByName( const OUString& rName ) -{ - for( ScFieldGroups::iterator aIt = maGroups.begin(), aEnd = maGroups.end(); aIt != aEnd; ++aIt ) - if( aIt->maName == rName ) - return aIt; - return maGroups.end(); -} - -// ============================================================================ - -namespace { - -OUString lclExtractMember( const Any& rElement ) -{ - if( rElement.has< OUString >() ) - return rElement.get< OUString >(); - - Reference< XNamed > xNamed( rElement, UNO_QUERY ); - if( xNamed.is() ) - return xNamed->getName(); - - return OUString(); -} - -} // namespace - -// ---------------------------------------------------------------------------- - -ScDataPilotFieldGroupObj::ScDataPilotFieldGroupObj( ScDataPilotFieldGroupsObj& rParent, const OUString& rGroupName ) : - mrParent( rParent ), - maGroupName( rGroupName ) -{ - mrParent.acquire(); -} - -ScDataPilotFieldGroupObj::~ScDataPilotFieldGroupObj() -{ - mrParent.release(); -} - -// XNameAccess - -Any SAL_CALL ScDataPilotFieldGroupObj::getByName( const OUString& rName ) - throw(NoSuchElementException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers; - ScFieldGroupMembers::iterator aIt = ::std::find( rMembers.begin(), rMembers.end(), rName ); - if( aIt == rMembers.end() ) - throw NoSuchElementException(); - return Any( Reference< XNamed >( new ScDataPilotFieldGroupItemObj( *this, *aIt ) ) ); -} - -Sequence< OUString > SAL_CALL ScDataPilotFieldGroupObj::getElementNames() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return ::comphelper::containerToSequence( mrParent.getFieldGroup( maGroupName ).maMembers ); -} - -sal_Bool SAL_CALL ScDataPilotFieldGroupObj::hasByName( const OUString& rName ) throw(RuntimeException) -{ - SolarMutexGuard aGuard; - ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers; - return ::std::find( rMembers.begin(), rMembers.end(), rName ) != rMembers.end(); -} - -// XNameReplace - -void SAL_CALL ScDataPilotFieldGroupObj::replaceByName( const OUString& rName, const Any& rElement ) - throw (IllegalArgumentException, NoSuchElementException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - - // it should be possible to quickly rename an item -> accept string or XNamed - OUString aNewName = lclExtractMember( rElement ); - if( (rName.getLength() == 0) || (aNewName.getLength() == 0) ) - throw IllegalArgumentException(); - if( rName == aNewName ) - return; - - ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers; - ScFieldGroupMembers::iterator aOldIt = ::std::find( rMembers.begin(), rMembers.end(), rName ); - ScFieldGroupMembers::iterator aNewIt = ::std::find( rMembers.begin(), rMembers.end(), aNewName ); - // throw if passed member name does not exist - if( aOldIt == rMembers.end() ) - throw NoSuchElementException(); - // throw if new name already exists - if( aNewIt != rMembers.end() ) - throw IllegalArgumentException(); - *aOldIt = aNewName; -} - -// XNameContainer - -void SAL_CALL ScDataPilotFieldGroupObj::insertByName( const OUString& rName, const Any& /*rElement*/ ) - throw (IllegalArgumentException, ElementExistException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - - // we will ignore the passed element and just try to insert the name - if( rName.getLength() == 0 ) - throw IllegalArgumentException(); - - ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers; - ScFieldGroupMembers::iterator aIt = ::std::find( rMembers.begin(), rMembers.end(), rName ); - // throw if passed name already exists - if( aIt != rMembers.end() ) - throw IllegalArgumentException(); - rMembers.push_back( rName ); -} - -void SAL_CALL ScDataPilotFieldGroupObj::removeByName( const OUString& rName ) - throw (NoSuchElementException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - - if( rName.getLength() == 0 ) - throw IllegalArgumentException(); - ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers; - ScFieldGroupMembers::iterator aIt = ::std::find( rMembers.begin(), rMembers.end(), rName ); - // throw if passed name does not exist - if( aIt == rMembers.end() ) - throw NoSuchElementException(); - rMembers.erase( aIt ); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScDataPilotFieldGroupObj::getCount() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return static_cast< sal_Int32 >( mrParent.getFieldGroup( maGroupName ).maMembers.size() ); -} - -Any SAL_CALL ScDataPilotFieldGroupObj::getByIndex( sal_Int32 nIndex ) - throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - ScFieldGroupMembers& rMembers = mrParent.getFieldGroup( maGroupName ).maMembers; - if ((nIndex < 0) || (nIndex >= static_cast< sal_Int32 >( rMembers.size() ))) - throw IndexOutOfBoundsException(); - return Any( Reference< XNamed >( new ScDataPilotFieldGroupItemObj( *this, rMembers[ nIndex ] ) ) ); -} - -// XEnumerationAccess - -Reference< XEnumeration > SAL_CALL ScDataPilotFieldGroupObj::createEnumeration() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration( this, OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.DataPilotFieldGroupEnumeration" ) ) ); -} - -// XElementAccess - -uno::Type SAL_CALL ScDataPilotFieldGroupObj::getElementType() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType( (Reference< XNamed >*)0 ); -} - -sal_Bool SAL_CALL ScDataPilotFieldGroupObj::hasElements() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return !mrParent.getFieldGroup( maGroupName ).maMembers.empty(); -} - -// XNamed - -OUString SAL_CALL ScDataPilotFieldGroupObj::getName() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return maGroupName; -} - -void SAL_CALL ScDataPilotFieldGroupObj::setName( const OUString& rName ) throw(RuntimeException) -{ - SolarMutexGuard aGuard; - mrParent.renameFieldGroup( maGroupName, rName ); - // if call to renameFieldGroup() did not throw, remember the new name - maGroupName = rName; -} - -// ============================================================================ - -ScDataPilotFieldGroupItemObj::ScDataPilotFieldGroupItemObj( ScDataPilotFieldGroupObj& rParent, const OUString& rName ) : - mrParent( rParent ), - maName( rName ) -{ - mrParent.acquire(); -} - -ScDataPilotFieldGroupItemObj::~ScDataPilotFieldGroupItemObj() -{ - mrParent.release(); -} - -// XNamed - -OUString SAL_CALL ScDataPilotFieldGroupItemObj::getName() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return maName; -} - -void SAL_CALL ScDataPilotFieldGroupItemObj::setName( const OUString& rName ) throw(RuntimeException) -{ - SolarMutexGuard aGuard; - mrParent.replaceByName( maName, Any( rName ) ); - // if call to replaceByName() did not throw, remember the new name - maName = rName; -} - -// ============================================================================ - -ScDataPilotItemsObj::ScDataPilotItemsObj( ScDataPilotDescriptorBase& rParent, const ScFieldIdentifier& rFieldId ) : - ScDataPilotChildObjBase( rParent, rFieldId ) -{ -} - -ScDataPilotItemsObj::~ScDataPilotItemsObj() -{ -} - -// XDataPilotItems - -ScDataPilotItemObj* ScDataPilotItemsObj::GetObjectByIndex_Impl( sal_Int32 nIndex ) const -{ - return ((0 <= nIndex) && (nIndex < GetMemberCount())) ? - new ScDataPilotItemObj( mrParent, maFieldId, nIndex ) : 0; -} - -// XNameAccess - -Any SAL_CALL ScDataPilotItemsObj::getByName( const OUString& aName ) - throw(NoSuchElementException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - Reference<XNameAccess> xMembers = GetMembers(); - if (xMembers.is()) - { - Reference<XIndexAccess> xMembersIndex(new ScNameToIndexAccess( xMembers )); - sal_Int32 nCount = xMembersIndex->getCount(); - sal_Bool bFound(false); - sal_Int32 nItem = 0; - while (nItem < nCount && !bFound ) - { - Reference<XNamed> xMember(xMembersIndex->getByIndex(nItem), UNO_QUERY); - if (xMember.is() && (aName == xMember->getName())) - return Any( Reference< XPropertySet >( GetObjectByIndex_Impl( nItem ) ) ); - ++nItem; - } - if (!bFound) - throw NoSuchElementException(); - } - return Any(); -} - -Sequence<OUString> SAL_CALL ScDataPilotItemsObj::getElementNames() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - Sequence< OUString > aSeq; - if( ScDPObject* pDPObj = GetDPObject() ) - pDPObj->GetMemberNames( lcl_GetObjectIndex( pDPObj, maFieldId ), aSeq ); - return aSeq; -} - -sal_Bool SAL_CALL ScDataPilotItemsObj::hasByName( const OUString& aName ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bFound = false; - Reference<XNameAccess> xMembers = GetMembers(); - if (xMembers.is()) - { - Reference<XIndexAccess> xMembersIndex(new ScNameToIndexAccess( xMembers )); - sal_Int32 nCount = xMembersIndex->getCount(); - sal_Int32 nItem = 0; - while (nItem < nCount && !bFound ) - { - Reference<XNamed> xMember(xMembersIndex->getByIndex(nItem), UNO_QUERY); - if (xMember.is() && aName == xMember->getName()) - bFound = sal_True; - else - nItem++; - } - } - return bFound; -} - -// XEnumerationAccess - -Reference<XEnumeration> SAL_CALL ScDataPilotItemsObj::createEnumeration() - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.DataPilotItemsEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScDataPilotItemsObj::getCount() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return GetMemberCount(); -} - -Any SAL_CALL ScDataPilotItemsObj::getByIndex( sal_Int32 nIndex ) - throw(IndexOutOfBoundsException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - Reference< XPropertySet > xItem( GetObjectByIndex_Impl( nIndex ) ); - if (!xItem.is()) - throw IndexOutOfBoundsException(); - return Any( xItem ); -} - -uno::Type SAL_CALL ScDataPilotItemsObj::getElementType() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((Reference<XPropertySet>*)0); -} - -sal_Bool SAL_CALL ScDataPilotItemsObj::hasElements() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -//------------------------------------------------------------------------ - -ScDataPilotItemObj::ScDataPilotItemObj( ScDataPilotDescriptorBase& rParent, const ScFieldIdentifier& rFieldId, sal_Int32 nIndex ) : - ScDataPilotChildObjBase( rParent, rFieldId ), - maPropSet( lcl_GetDataPilotItemMap() ), - mnIndex( nIndex ) -{ -} - -ScDataPilotItemObj::~ScDataPilotItemObj() -{ -} - - // XNamed -OUString SAL_CALL ScDataPilotItemObj::getName() throw(RuntimeException) -{ - SolarMutexGuard aGuard; - OUString sRet; - Reference<XNameAccess> xMembers = GetMembers(); - if (xMembers.is()) - { - Reference<XIndexAccess> xMembersIndex(new ScNameToIndexAccess( xMembers )); - sal_Int32 nCount = xMembersIndex->getCount(); - if (mnIndex < nCount) - { - Reference<XNamed> xMember(xMembersIndex->getByIndex(mnIndex), UNO_QUERY); - sRet = xMember->getName(); - } - } - return sRet; -} - -void SAL_CALL ScDataPilotItemObj::setName( const OUString& /* aName */ ) - throw(RuntimeException) -{ -} - - // XPropertySet -Reference< XPropertySetInfo > - SAL_CALL ScDataPilotItemObj::getPropertySetInfo( ) - throw(RuntimeException) -{ - SolarMutexGuard aGuard; - static Reference<XPropertySetInfo> aRef = - new SfxItemPropertySetInfo( maPropSet.getPropertyMap() ); - return aRef; -} - -void SAL_CALL ScDataPilotItemObj::setPropertyValue( const OUString& aPropertyName, const Any& aValue ) - throw(UnknownPropertyException, PropertyVetoException, IllegalArgumentException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - ScDPObject* pDPObj = 0; - if( ScDPSaveDimension* pDim = GetDPDimension( &pDPObj ) ) - { - Reference<XNameAccess> xMembers = GetMembers(); - if( xMembers.is() ) - { - Reference<XIndexAccess> xMembersIndex( new ScNameToIndexAccess( xMembers ) ); - sal_Int32 nCount = xMembersIndex->getCount(); - if( mnIndex < nCount ) - { - Reference<XNamed> xMember(xMembersIndex->getByIndex(mnIndex), UNO_QUERY); - String sName(xMember->getName()); - ScDPSaveMember* pMember = pDim->GetMemberByName(sName); - if (pMember) - { - bool bGetNewIndex = false; - if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_SHOWDETAIL ) ) ) - pMember->SetShowDetails(cppu::any2bool(aValue)); - else if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ISHIDDEN ) ) ) - pMember->SetIsVisible(!cppu::any2bool(aValue)); - else if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_POS ) ) ) - { - sal_Int32 nNewPos = 0; - if ( ( aValue >>= nNewPos ) && nNewPos >= 0 && nNewPos < nCount ) - { - pDim->SetMemberPosition( sName, nNewPos ); - // get new effective index (depends on sorting mode, which isn't modified) - bGetNewIndex = true; - } - else - throw IllegalArgumentException(); - } - SetDPObject( pDPObj ); - - if ( bGetNewIndex ) // after SetDPObject, get the new index - { - OUString aOUName( sName ); - Sequence< OUString > aItemNames = xMembers->getElementNames(); - sal_Int32 nItemCount = aItemNames.getLength(); - for (sal_Int32 nItem=0; nItem<nItemCount; ++nItem) - if (aItemNames[nItem] == aOUName) - mnIndex = nItem; - } - } - } - } - } -} - -Any SAL_CALL ScDataPilotItemObj::getPropertyValue( const OUString& aPropertyName ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - Any aRet; - if( ScDPSaveDimension* pDim = GetDPDimension() ) - { - Reference< XNameAccess > xMembers = GetMembers(); - if( xMembers.is() ) - { - Reference< XIndexAccess > xMembersIndex( new ScNameToIndexAccess( xMembers ) ); - sal_Int32 nCount = xMembersIndex->getCount(); - if( mnIndex < nCount ) - { - Reference< XNamed > xMember( xMembersIndex->getByIndex( mnIndex ), UNO_QUERY ); - String sName( xMember->getName() ); - ScDPSaveMember* pMember = pDim->GetExistingMemberByName( sName ); - if( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_SHOWDETAIL ) ) ) - { - if (pMember && pMember->HasShowDetails()) - { - aRet <<= (bool)pMember->GetShowDetails(); - } - else - { - Reference< XPropertySet > xMemberProps( xMember, UNO_QUERY ); - if( xMemberProps.is() ) - aRet = xMemberProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNO_SHOWDETA ) ) ); - else - aRet <<= true; - } - } - else if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ISHIDDEN ) ) ) - { - if (pMember && pMember->HasIsVisible()) - { - aRet <<= !pMember->GetIsVisible(); - } - else - { - Reference< XPropertySet > xMemberProps( xMember, UNO_QUERY ); - if( xMemberProps.is() ) - aRet <<= !cppu::any2bool( xMemberProps->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( SC_UNO_ISVISIBL ) ) ) ); - else - aRet <<= false; - } - } - else if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_POS ) ) ) - { - aRet <<= mnIndex; - } - } - } - } - return aRet; -} - -void SAL_CALL ScDataPilotItemObj::addPropertyChangeListener( - const OUString& /* aPropertyName */, const Reference< XPropertyChangeListener >& /* xListener */ ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ -} - -void SAL_CALL ScDataPilotItemObj::removePropertyChangeListener( - const OUString& /* aPropertyName */, const Reference< XPropertyChangeListener >& /* aListener */ ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ -} - -void SAL_CALL ScDataPilotItemObj::addVetoableChangeListener( - const OUString& /* PropertyName */, const Reference< XVetoableChangeListener >& /* aListener */ ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ -} - -void SAL_CALL ScDataPilotItemObj::removeVetoableChangeListener( - const OUString& /* PropertyName */, const Reference< XVetoableChangeListener >& /* aListener */ ) - throw(UnknownPropertyException, WrappedTargetException, RuntimeException) -{ -} - -//------------------------------------------------------------------------ - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/datauno.cxx b/sc/source/ui/unoobj/datauno.cxx deleted file mode 100644 index fbef73f15..000000000 --- a/sc/source/ui/unoobj/datauno.cxx +++ /dev/null @@ -1,2462 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <svl/smplhint.hxx> -#include <svl/zforlist.hxx> -#include <vcl/svapp.hxx> - -#include <com/sun/star/awt/XBitmap.hpp> -#include <com/sun/star/util/SortField.hpp> -#include <com/sun/star/table/TableSortField.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/table/TableOrientation.hpp> -#include <com/sun/star/table/CellRangeAddress.hpp> -#include <com/sun/star/sheet/DataImportMode.hpp> -#include <com/sun/star/sheet/FilterOperator2.hpp> -#include <com/sun/star/sheet/TableFilterField2.hpp> - -#include "datauno.hxx" -#include "dapiuno.hxx" -#include "cellsuno.hxx" -#include "miscuno.hxx" -#include "targuno.hxx" -#include "rangeutl.hxx" -#include "dbdata.hxx" -#include "docsh.hxx" -#include "dbdocfun.hxx" -#include "unonames.hxx" -#include "globalnames.hxx" -#include "globstr.hrc" -#include "convuno.hxx" -#include "hints.hxx" -#include "attrib.hxx" -#include "dpshttab.hxx" -#include <comphelper/extract.hxx> -#include <comphelper/servicehelper.hxx> -#include <svx/dataaccessdescriptor.hxx> - -#include <limits> - -using namespace com::sun::star; - -SV_IMPL_PTRARR( XDBRefreshListenerArr_Impl, XDBRefreshListenerPtr ); - -//------------------------------------------------------------------------ - -// alles ohne Which-ID, Map nur fuer PropertySetInfo - -const SfxItemPropertyMapEntry* lcl_GetSubTotalPropertyMap() -{ - // some old property names are for 5.2 compatibility - - static SfxItemPropertyMapEntry aSubTotalPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_BINDFMT), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_CASE), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ENABSORT), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ENUSLIST), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_FORMATS), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_INSBRK), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ISCASE), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_MAXFLD), 0, &getCppuType((sal_Int32*)0), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN(SC_UNONAME_SORTASC), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ULIST), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_UINDEX), 0, &getCppuType((sal_Int32*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_USINDEX), 0, &getCppuType((sal_Int32*)0), 0, 0}, - {0,0,0,0,0,0} - }; - return aSubTotalPropertyMap_Impl; -} - -const SfxItemPropertyMapEntry* lcl_GetFilterPropertyMap() -{ - static SfxItemPropertyMapEntry aFilterPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_CONTHDR), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_COPYOUT), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ISCASE), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_MAXFLD), 0, &getCppuType((sal_Int32*)0), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ORIENT), 0, &getCppuType((table::TableOrientation*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_OUTPOS), 0, &getCppuType((table::CellAddress*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_SAVEOUT), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_SKIPDUP), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_USEREGEX), 0, &getBooleanCppuType(), 0, 0}, - {0,0,0,0,0,0} - }; - return aFilterPropertyMap_Impl; -} - -const SfxItemPropertyMapEntry* lcl_GetDBRangePropertyMap() -{ - static SfxItemPropertyMapEntry aDBRangePropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_AUTOFLT), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_FLTCRT), 0, &getCppuType((table::CellRangeAddress*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_FROMSELECT),0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ISUSER), 0, &getBooleanCppuType(), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_KEEPFORM), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_LINKDISPBIT), 0, &getCppuType((uno::Reference<awt::XBitmap>*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNO_LINKDISPNAME), 0, &getCppuType((rtl::OUString*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_MOVCELLS), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_REFPERIOD), 0, &getCppuType((sal_Int32*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_STRIPDAT), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_TOKENINDEX),0, &getCppuType((sal_Int32*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_USEFLTCRT),0, &getBooleanCppuType(), 0, 0}, - {0,0,0,0,0,0} - }; - return aDBRangePropertyMap_Impl; -} - - -//------------------------------------------------------------------------ - -#define SCDATABASERANGEOBJ_SERVICE "com.sun.star.sheet.DatabaseRange" - -SC_SIMPLE_SERVICE_INFO( ScConsolidationDescriptor, "ScConsolidationDescriptor", "com.sun.star.sheet.ConsolidationDescriptor" ) -SC_SIMPLE_SERVICE_INFO( ScDatabaseRangesObj, "ScDatabaseRangesObj", "com.sun.star.sheet.DatabaseRanges" ) -SC_SIMPLE_SERVICE_INFO( ScFilterDescriptorBase, "ScFilterDescriptorBase", "com.sun.star.sheet.SheetFilterDescriptor" ) -SC_SIMPLE_SERVICE_INFO( ScSubTotalDescriptorBase, "ScSubTotalDescriptorBase", "com.sun.star.sheet.SubTotalDescriptor" ) -SC_SIMPLE_SERVICE_INFO( ScSubTotalFieldObj, "ScSubTotalFieldObj", "com.sun.star.sheet.SubTotalField" ) - - -//------------------------------------------------------------------------ - -ScSubTotalFunc ScDataUnoConversion::GeneralToSubTotal( sheet::GeneralFunction eSummary ) -{ - ScSubTotalFunc eSubTotal; - switch (eSummary) - { - case sheet::GeneralFunction_NONE: eSubTotal = SUBTOTAL_FUNC_NONE; break; - case sheet::GeneralFunction_SUM: eSubTotal = SUBTOTAL_FUNC_SUM; break; - case sheet::GeneralFunction_COUNT: eSubTotal = SUBTOTAL_FUNC_CNT2; break; - case sheet::GeneralFunction_AVERAGE: eSubTotal = SUBTOTAL_FUNC_AVE; break; - case sheet::GeneralFunction_MAX: eSubTotal = SUBTOTAL_FUNC_MAX; break; - case sheet::GeneralFunction_MIN: eSubTotal = SUBTOTAL_FUNC_MIN; break; - case sheet::GeneralFunction_PRODUCT: eSubTotal = SUBTOTAL_FUNC_PROD; break; - case sheet::GeneralFunction_COUNTNUMS: eSubTotal = SUBTOTAL_FUNC_CNT; break; - case sheet::GeneralFunction_STDEV: eSubTotal = SUBTOTAL_FUNC_STD; break; - case sheet::GeneralFunction_STDEVP: eSubTotal = SUBTOTAL_FUNC_STDP; break; - case sheet::GeneralFunction_VAR: eSubTotal = SUBTOTAL_FUNC_VAR; break; - case sheet::GeneralFunction_VARP: eSubTotal = SUBTOTAL_FUNC_VARP; break; - case sheet::GeneralFunction_AUTO: - default: - OSL_FAIL("GeneralToSubTotal: falscher enum"); - eSubTotal = SUBTOTAL_FUNC_NONE; - } - return eSubTotal; -} - -sheet::GeneralFunction ScDataUnoConversion::SubTotalToGeneral( ScSubTotalFunc eSubTotal ) -{ - sheet::GeneralFunction eGeneral; - switch (eSubTotal) - { - case SUBTOTAL_FUNC_NONE: eGeneral = sheet::GeneralFunction_NONE; break; - case SUBTOTAL_FUNC_AVE: eGeneral = sheet::GeneralFunction_AVERAGE; break; - case SUBTOTAL_FUNC_CNT: eGeneral = sheet::GeneralFunction_COUNTNUMS; break; - case SUBTOTAL_FUNC_CNT2: eGeneral = sheet::GeneralFunction_COUNT; break; - case SUBTOTAL_FUNC_MAX: eGeneral = sheet::GeneralFunction_MAX; break; - case SUBTOTAL_FUNC_MIN: eGeneral = sheet::GeneralFunction_MIN; break; - case SUBTOTAL_FUNC_PROD: eGeneral = sheet::GeneralFunction_PRODUCT; break; - case SUBTOTAL_FUNC_STD: eGeneral = sheet::GeneralFunction_STDEV; break; - case SUBTOTAL_FUNC_STDP: eGeneral = sheet::GeneralFunction_STDEVP; break; - case SUBTOTAL_FUNC_SUM: eGeneral = sheet::GeneralFunction_SUM; break; - case SUBTOTAL_FUNC_VAR: eGeneral = sheet::GeneralFunction_VAR; break; - case SUBTOTAL_FUNC_VARP: eGeneral = sheet::GeneralFunction_VARP; break; - default: - OSL_FAIL("SubTotalToGeneral: falscher enum"); - eGeneral = sheet::GeneralFunction_NONE; - break; - } - return eGeneral; -} - -//------------------------------------------------------------------------ - -// ScImportDescriptor: alles static - -long ScImportDescriptor::GetPropertyCount() -{ - return 4; -} - -void ScImportDescriptor::FillProperties( uno::Sequence<beans::PropertyValue>& rSeq, const ScImportParam& rParam ) -{ - OSL_ENSURE( rSeq.getLength() == GetPropertyCount(), "falscher Count" ); - - beans::PropertyValue* pArray = rSeq.getArray(); - - sheet::DataImportMode eMode = sheet::DataImportMode_NONE; - if ( rParam.bImport ) - { - if ( rParam.bSql ) - eMode = sheet::DataImportMode_SQL; - else if ( rParam.nType == ScDbQuery ) - eMode = sheet::DataImportMode_QUERY; - else - eMode = sheet::DataImportMode_TABLE; // Type ist immer ScDbQuery oder ScDbTable - } - - ::svx::ODataAccessDescriptor aDescriptor; - aDescriptor.setDataSource(rParam.aDBName); - if (aDescriptor.has( svx::daDataSource )) - { - pArray[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_DBNAME )); - pArray[0].Value <<= rParam.aDBName; - } - else if (aDescriptor.has( svx::daConnectionResource )) - { - pArray[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_CONRES )); - pArray[0].Value <<= rParam.aDBName; - } - - pArray[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_SRCTYPE )); - pArray[1].Value <<= eMode; - - pArray[2].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_SRCOBJ )); - pArray[2].Value <<= rParam.aStatement; - - pArray[3].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ISNATIVE )); - ScUnoHelpFunctions::SetBoolInAny( pArray[3].Value, rParam.bNative ); -} - -void ScImportDescriptor::FillImportParam( ScImportParam& rParam, const uno::Sequence<beans::PropertyValue>& rSeq ) -{ - rtl::OUString aStrVal; - const beans::PropertyValue* pPropArray = rSeq.getConstArray(); - long nPropCount = rSeq.getLength(); - for (long i = 0; i < nPropCount; i++) - { - const beans::PropertyValue& rProp = pPropArray[i]; - String aPropName(rProp.Name); - - if (aPropName.EqualsAscii( SC_UNONAME_ISNATIVE )) - rParam.bNative = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( SC_UNONAME_DBNAME )) - { - if ( rProp.Value >>= aStrVal ) - rParam.aDBName = aStrVal; - } - else if (aPropName.EqualsAscii( SC_UNONAME_CONRES )) - { - if ( rProp.Value >>= aStrVal ) - rParam.aDBName = aStrVal; - } - else if (aPropName.EqualsAscii( SC_UNONAME_SRCOBJ )) - { - if ( rProp.Value >>= aStrVal ) - rParam.aStatement = aStrVal; - } - else if (aPropName.EqualsAscii( SC_UNONAME_SRCTYPE )) - { - //! test for correct enum type? - sheet::DataImportMode eMode = (sheet::DataImportMode) - ScUnoHelpFunctions::GetEnumFromAny( rProp.Value ); - switch (eMode) - { - case sheet::DataImportMode_NONE: - rParam.bImport = false; - break; - case sheet::DataImportMode_SQL: - rParam.bImport = true; - rParam.bSql = true; - break; - case sheet::DataImportMode_TABLE: - rParam.bImport = true; - rParam.bSql = false; - rParam.nType = ScDbTable; - break; - case sheet::DataImportMode_QUERY: - rParam.bImport = true; - rParam.bSql = false; - rParam.nType = ScDbQuery; - break; - default: - OSL_FAIL("falscher Mode"); - rParam.bImport = false; - } - } - } -} - -//------------------------------------------------------------------------ - -// ScSortDescriptor: alles static - -//! SortAscending muss aus der SheetSortDescriptor service-Beschreibung raus - -long ScSortDescriptor::GetPropertyCount() -{ - return 9; // TableSortDescriptor and SheetSortDescriptor -} - -void ScSortDescriptor::FillProperties( uno::Sequence<beans::PropertyValue>& rSeq, const ScSortParam& rParam ) -{ - OSL_ENSURE( rSeq.getLength() == GetPropertyCount(), "falscher Count" ); - - beans::PropertyValue* pArray = rSeq.getArray(); - - // Uno-Werte zusammensuchen - - table::CellAddress aOutPos; - aOutPos.Sheet = rParam.nDestTab; - aOutPos.Column = rParam.nDestCol; - aOutPos.Row = rParam.nDestRow; - - sal_uInt16 nSortCount = 0; - while ( nSortCount < MAXSORT && rParam.bDoSort[nSortCount] ) - ++nSortCount; - - uno::Sequence<table::TableSortField> aFields(nSortCount); - if (nSortCount) - { - table::TableSortField* pFieldArray = aFields.getArray(); - for (sal_uInt16 i=0; i<nSortCount; i++) - { - pFieldArray[i].Field = rParam.nField[i]; - pFieldArray[i].IsAscending = rParam.bAscending[i]; - pFieldArray[i].FieldType = table::TableSortFieldType_AUTOMATIC; // immer Automatic - pFieldArray[i].IsCaseSensitive = rParam.bCaseSens; - pFieldArray[i].CollatorLocale = rParam.aCollatorLocale; - pFieldArray[i].CollatorAlgorithm = rParam.aCollatorAlgorithm; - } - } - - // Sequence fuellen - - pArray[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ISSORTCOLUMNS )); - pArray[0].Value = ::cppu::bool2any(!rParam.bByRow); - - pArray[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_CONTHDR )); - ScUnoHelpFunctions::SetBoolInAny( pArray[1].Value, rParam.bHasHeader ); - - pArray[2].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_MAXFLD )); - pArray[2].Value <<= (sal_Int32) MAXSORT; - - pArray[3].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_SORTFLD )); - pArray[3].Value <<= aFields; - - pArray[4].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_BINDFMT )); - ScUnoHelpFunctions::SetBoolInAny( pArray[4].Value, rParam.bIncludePattern ); - - pArray[5].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_COPYOUT )); - ScUnoHelpFunctions::SetBoolInAny( pArray[5].Value, !rParam.bInplace ); - - pArray[6].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_OUTPOS )); - pArray[6].Value <<= aOutPos; - - pArray[7].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_ISULIST )); - ScUnoHelpFunctions::SetBoolInAny( pArray[7].Value, rParam.bUserDef ); - - pArray[8].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_UINDEX )); - pArray[8].Value <<= (sal_Int32) rParam.nUserIndex; -} - -void ScSortDescriptor::FillSortParam( ScSortParam& rParam, const uno::Sequence<beans::PropertyValue>& rSeq ) -{ - const beans::PropertyValue* pPropArray = rSeq.getConstArray(); - long nPropCount = rSeq.getLength(); - for (long nProp = 0; nProp < nPropCount; nProp++) - { - const beans::PropertyValue& rProp = pPropArray[nProp]; - String aPropName(rProp.Name); - - if (aPropName.EqualsAscii( SC_UNONAME_ORIENT )) - { - //! test for correct enum type? - table::TableOrientation eOrient = (table::TableOrientation) - ScUnoHelpFunctions::GetEnumFromAny( rProp.Value ); - rParam.bByRow = ( eOrient != table::TableOrientation_COLUMNS ); - } - else if (aPropName.EqualsAscii( SC_UNONAME_ISSORTCOLUMNS )) - { - rParam.bByRow = !::cppu::any2bool(rProp.Value); - } - else if (aPropName.EqualsAscii( SC_UNONAME_CONTHDR )) - rParam.bHasHeader = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( SC_UNONAME_MAXFLD )) - { - sal_Int32 nVal; - if ( (rProp.Value >>= nVal) && nVal > MAXSORT ) - { - //! specify exceptions - //! throw lang::IllegalArgumentException(); - } - } - else if (aPropName.EqualsAscii( SC_UNONAME_SORTFLD )) - { - uno::Sequence<util::SortField> aSeq; - uno::Sequence<table::TableSortField> aNewSeq; - if ( rProp.Value >>= aSeq ) - { - sal_Int32 nCount = aSeq.getLength(); - sal_Int32 i; - if ( nCount > MAXSORT ) - { - OSL_FAIL("Zu viele Sortierfelder"); - nCount = MAXSORT; - } - const util::SortField* pFieldArray = aSeq.getConstArray(); - for (i=0; i<nCount; i++) - { - rParam.nField[i] = (SCCOLROW)pFieldArray[i].Field; - rParam.bAscending[i] = pFieldArray[i].SortAscending; - - // FieldType wird ignoriert - rParam.bDoSort[i] = sal_True; - } - for (i=nCount; i<MAXSORT; i++) - rParam.bDoSort[i] = false; - } - else if ( rProp.Value >>= aNewSeq ) - { - sal_Int32 nCount = aNewSeq.getLength(); - sal_Int32 i; - if ( nCount > MAXSORT ) - { - OSL_FAIL("Zu viele Sortierfelder"); - nCount = MAXSORT; - } - const table::TableSortField* pFieldArray = aNewSeq.getConstArray(); - for (i=0; i<nCount; i++) - { - rParam.nField[i] = (SCCOLROW)pFieldArray[i].Field; - rParam.bAscending[i] = pFieldArray[i].IsAscending; - - // only one is possible, sometime we should make it possible to have different for every entry - rParam.bCaseSens = pFieldArray[i].IsCaseSensitive; - rParam.aCollatorLocale = pFieldArray[i].CollatorLocale; - rParam.aCollatorAlgorithm = pFieldArray[i].CollatorAlgorithm; - - // FieldType wird ignoriert - rParam.bDoSort[i] = sal_True; - } - for (i=nCount; i<MAXSORT; i++) - rParam.bDoSort[i] = false; - } - } - else if (aPropName.EqualsAscii( SC_UNONAME_ISCASE )) - { - rParam.bCaseSens = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - } - else if (aPropName.EqualsAscii( SC_UNONAME_BINDFMT )) - rParam.bIncludePattern = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( SC_UNONAME_COPYOUT )) - rParam.bInplace = !ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( SC_UNONAME_OUTPOS )) - { - table::CellAddress aAddress; - if ( rProp.Value >>= aAddress ) - { - rParam.nDestTab = aAddress.Sheet; - rParam.nDestCol = (SCCOL)aAddress.Column; - rParam.nDestRow = (SCROW)aAddress.Row; - } - } - else if (aPropName.EqualsAscii( SC_UNONAME_ISULIST )) - rParam.bUserDef = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( SC_UNONAME_UINDEX )) - { - sal_Int32 nVal = 0; - if ( rProp.Value >>= nVal ) - rParam.nUserIndex = (sal_uInt16)nVal; - } - else if (aPropName.EqualsAscii( SC_UNONAME_COLLLOC )) - { - rProp.Value >>= rParam.aCollatorLocale; - } - else if (aPropName.EqualsAscii( SC_UNONAME_COLLALG )) - { - rtl::OUString sStr; - if ( rProp.Value >>= sStr ) - rParam.aCollatorAlgorithm = sStr; - } - } -} - -//------------------------------------------------------------------------ - -ScSubTotalFieldObj::ScSubTotalFieldObj( ScSubTotalDescriptorBase* pDesc, sal_uInt16 nP ) : - xRef( pDesc ), // Objekt festhalten - rParent( *pDesc ), - nPos( nP ) -{ - OSL_ENSURE(pDesc, "ScSubTotalFieldObj: Parent ist 0"); -} - -ScSubTotalFieldObj::~ScSubTotalFieldObj() -{ -} - -// XSubTotalField - -sal_Int32 SAL_CALL ScSubTotalFieldObj::getGroupColumn() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSubTotalParam aParam; - rParent.GetData(aParam); - - return aParam.nField[nPos]; -} - -void SAL_CALL ScSubTotalFieldObj::setGroupColumn( sal_Int32 nGroupColumn ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSubTotalParam aParam; - rParent.GetData(aParam); - - aParam.nField[nPos] = (SCCOL)nGroupColumn; - - rParent.PutData(aParam); -} - -uno::Sequence<sheet::SubTotalColumn> SAL_CALL ScSubTotalFieldObj::getSubTotalColumns() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSubTotalParam aParam; - rParent.GetData(aParam); - - SCCOL nCount = aParam.nSubTotals[nPos]; - uno::Sequence<sheet::SubTotalColumn> aSeq(nCount); - sheet::SubTotalColumn* pAry = aSeq.getArray(); - for (SCCOL i=0; i<nCount; i++) - { - pAry[i].Column = aParam.pSubTotals[nPos][i]; - pAry[i].Function = ScDataUnoConversion::SubTotalToGeneral( - aParam.pFunctions[nPos][i] ); - } - return aSeq; -} - -void SAL_CALL ScSubTotalFieldObj::setSubTotalColumns( - const uno::Sequence<sheet::SubTotalColumn>& aSubTotalColumns ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSubTotalParam aParam; - rParent.GetData(aParam); - - sal_uInt32 nColCount = aSubTotalColumns.getLength(); - if ( nColCount <= sal::static_int_cast<sal_uInt32>(SCCOL_MAX) ) - { - SCCOL nCount = static_cast<SCCOL>(nColCount); - aParam.nSubTotals[nPos] = nCount; - if (nCount != 0) - { - aParam.pSubTotals[nPos] = new SCCOL[nCount]; - aParam.pFunctions[nPos] = new ScSubTotalFunc[nCount]; - - const sheet::SubTotalColumn* pAry = aSubTotalColumns.getConstArray(); - for (SCCOL i=0; i<nCount; i++) - { - aParam.pSubTotals[nPos][i] = static_cast<SCCOL>(pAry[i].Column); - aParam.pFunctions[nPos][i] = - ScDataUnoConversion::GeneralToSubTotal( pAry[i].Function ); - } - } - else - { - aParam.pSubTotals[nPos] = NULL; - aParam.pFunctions[nPos] = NULL; - } - } - //! sonst Exception oder so? (zuviele Spalten) - - rParent.PutData(aParam); -} - -//------------------------------------------------------------------------ - -ScSubTotalDescriptorBase::ScSubTotalDescriptorBase() : - aPropSet( lcl_GetSubTotalPropertyMap() ) -{ -} - -ScSubTotalDescriptorBase::~ScSubTotalDescriptorBase() -{ -} - -// GetData/PutData hier nur wegen NewInstance-Krempel implementiert... - -void ScSubTotalDescriptorBase::GetData( ScSubTotalParam& /* rParam */ ) const -{ - OSL_FAIL("ScSubTotalDescriptorBase::GetData soll nicht gerufen werden"); -} - -void ScSubTotalDescriptorBase::PutData( const ScSubTotalParam& /* rParam */ ) -{ - OSL_FAIL("ScSubTotalDescriptorBase::PutData soll nicht gerufen werden"); -} - -// XSubTotalDesctiptor - -ScSubTotalFieldObj* ScSubTotalDescriptorBase::GetObjectByIndex_Impl(sal_uInt16 nIndex) -{ - if ( nIndex < getCount() ) - return new ScSubTotalFieldObj( this, nIndex ); - return NULL; -} - -void SAL_CALL ScSubTotalDescriptorBase::clear() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSubTotalParam aParam; - GetData(aParam); - - for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++) - aParam.bGroupActive[i] = false; - - //! Notify oder so fuer die Field-Objekte??? - - PutData(aParam); -} - -void SAL_CALL ScSubTotalDescriptorBase::addNew( - const uno::Sequence<sheet::SubTotalColumn>& aSubTotalColumns, - sal_Int32 nGroupColumn ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSubTotalParam aParam; - GetData(aParam); - - sal_uInt16 nPos = 0; - while ( nPos < MAXSUBTOTAL && aParam.bGroupActive[nPos] ) - ++nPos; - - sal_uInt32 nColCount = aSubTotalColumns.getLength(); - - if ( nPos < MAXSUBTOTAL && nColCount <= sal::static_int_cast<sal_uInt32>(SCCOL_MAX) ) - { - aParam.bGroupActive[nPos] = sal_True; - aParam.nField[nPos] = static_cast<SCCOL>(nGroupColumn); - - delete aParam.pSubTotals[nPos]; - delete aParam.pFunctions[nPos]; - - SCCOL nCount = static_cast<SCCOL>(nColCount); - aParam.nSubTotals[nPos] = nCount; - if (nCount != 0) - { - aParam.pSubTotals[nPos] = new SCCOL[nCount]; - aParam.pFunctions[nPos] = new ScSubTotalFunc[nCount]; - - const sheet::SubTotalColumn* pAry = aSubTotalColumns.getConstArray(); - for (SCCOL i=0; i<nCount; i++) - { - aParam.pSubTotals[nPos][i] = static_cast<SCCOL>(pAry[i].Column); - aParam.pFunctions[nPos][i] = - ScDataUnoConversion::GeneralToSubTotal( pAry[i].Function ); - } - } - else - { - aParam.pSubTotals[nPos] = NULL; - aParam.pFunctions[nPos] = NULL; - } - } - else // too many fields / columns - throw uno::RuntimeException(); // no other exceptions specified - - PutData(aParam); -} - -// Flags/Einstellungen als Properties - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScSubTotalDescriptorBase::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SubTotalFieldsEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScSubTotalDescriptorBase::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSubTotalParam aParam; - GetData(aParam); - - sal_uInt16 nCount = 0; - while ( nCount < MAXSUBTOTAL && aParam.bGroupActive[nCount] ) - ++nCount; - return nCount; -} - -uno::Any SAL_CALL ScSubTotalDescriptorBase::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XSubTotalField> xField(GetObjectByIndex_Impl((sal_uInt16)nIndex)); - if (xField.is()) - return uno::makeAny(xField); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScSubTotalDescriptorBase::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<sheet::XSubTotalField>*)0); -} - -sal_Bool SAL_CALL ScSubTotalDescriptorBase::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScSubTotalDescriptorBase::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScSubTotalDescriptorBase::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSubTotalParam aParam; - GetData(aParam); - - String aString(aPropertyName); - - // some old property names are for 5.2 compatibility - - if (aString.EqualsAscii( SC_UNONAME_CASE ) || aString.EqualsAscii( SC_UNONAME_ISCASE )) - aParam.bCaseSens = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if (aString.EqualsAscii( SC_UNONAME_FORMATS ) || aString.EqualsAscii( SC_UNONAME_BINDFMT )) - aParam.bIncludePattern = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if (aString.EqualsAscii( SC_UNONAME_ENABSORT )) - aParam.bDoSort = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if (aString.EqualsAscii( SC_UNONAME_SORTASC )) - aParam.bAscending = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if (aString.EqualsAscii( SC_UNONAME_INSBRK )) - aParam.bPagebreak = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if (aString.EqualsAscii( SC_UNONAME_ULIST ) || aString.EqualsAscii( SC_UNONAME_ENUSLIST )) - aParam.bUserDef = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if (aString.EqualsAscii( SC_UNONAME_UINDEX ) || aString.EqualsAscii( SC_UNONAME_USINDEX )) - { - sal_Int32 nVal = 0; - if ( aValue >>= nVal ) - aParam.nUserIndex = (sal_uInt16)nVal; - } - else if (aString.EqualsAscii( SC_UNONAME_MAXFLD )) - { - sal_Int32 nVal = 0; - if ( (aValue >>= nVal) && nVal > sal::static_int_cast<sal_Int32>(MAXSUBTOTAL) ) - { - throw lang::IllegalArgumentException(); - } - } - - PutData(aParam); -} - -uno::Any SAL_CALL ScSubTotalDescriptorBase::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSubTotalParam aParam; - GetData(aParam); - - String aString(aPropertyName); - uno::Any aRet; - - // some old property names are for 5.2 compatibility - - if (aString.EqualsAscii( SC_UNONAME_CASE ) || aString.EqualsAscii( SC_UNONAME_ISCASE )) - ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bCaseSens ); - else if (aString.EqualsAscii( SC_UNONAME_FORMATS ) || aString.EqualsAscii( SC_UNONAME_BINDFMT )) - ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bIncludePattern ); - else if (aString.EqualsAscii( SC_UNONAME_ENABSORT )) - ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bDoSort ); - else if (aString.EqualsAscii( SC_UNONAME_SORTASC )) - ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bAscending ); - else if (aString.EqualsAscii( SC_UNONAME_INSBRK )) - ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bPagebreak ); - else if (aString.EqualsAscii( SC_UNONAME_ULIST ) || aString.EqualsAscii( SC_UNONAME_ENUSLIST )) - ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bUserDef ); - else if (aString.EqualsAscii( SC_UNONAME_UINDEX ) || aString.EqualsAscii( SC_UNONAME_USINDEX )) - aRet <<= (sal_Int32) aParam.nUserIndex; - else if (aString.EqualsAscii( SC_UNONAME_MAXFLD )) - aRet <<= (sal_Int32) MAXSUBTOTAL; - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScSubTotalDescriptorBase ) - -// XUnoTunnel - -sal_Int64 SAL_CALL ScSubTotalDescriptorBase::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScSubTotalDescriptorBaseUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScSubTotalDescriptorBaseUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScSubTotalDescriptorBase::getUnoTunnelId() -{ - return theScSubTotalDescriptorBaseUnoTunnelId::get().getSeq(); -} - -ScSubTotalDescriptorBase* ScSubTotalDescriptorBase::getImplementation( - const uno::Reference<sheet::XSubTotalDescriptor> xObj ) -{ - ScSubTotalDescriptorBase* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScSubTotalDescriptorBase*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -//------------------------------------------------------------------------ - -ScSubTotalDescriptor::ScSubTotalDescriptor() -{ -} - -ScSubTotalDescriptor::~ScSubTotalDescriptor() -{ -} - -void ScSubTotalDescriptor::GetData( ScSubTotalParam& rParam ) const -{ - rParam = aStoredParam; // Abfrage fuer Interface -} - -void ScSubTotalDescriptor::PutData( const ScSubTotalParam& rParam ) -{ - aStoredParam = rParam; // vom Interface gesetzt -} - -void ScSubTotalDescriptor::SetParam( const ScSubTotalParam& rNew ) -{ - aStoredParam = rNew; // von aussen gesetzt -} - -//------------------------------------------------------------------------ - -ScRangeSubTotalDescriptor::ScRangeSubTotalDescriptor(ScDatabaseRangeObj* pPar) : - pParent(pPar) -{ - if (pParent) - pParent->acquire(); -} - -ScRangeSubTotalDescriptor::~ScRangeSubTotalDescriptor() -{ - if (pParent) - pParent->release(); -} - -void ScRangeSubTotalDescriptor::GetData( ScSubTotalParam& rParam ) const -{ - if (pParent) - pParent->GetSubTotalParam( rParam ); -} - -void ScRangeSubTotalDescriptor::PutData( const ScSubTotalParam& rParam ) -{ - if (pParent) - pParent->SetSubTotalParam( rParam ); -} - -//------------------------------------------------------------------------ - -ScConsolidationDescriptor::ScConsolidationDescriptor() -{ -} - -ScConsolidationDescriptor::~ScConsolidationDescriptor() -{ -} - -void ScConsolidationDescriptor::SetParam( const ScConsolidateParam& rNew ) -{ - aParam = rNew; -} - -// XConsolidationDescriptor - -sheet::GeneralFunction SAL_CALL ScConsolidationDescriptor::getFunction() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ScDataUnoConversion::SubTotalToGeneral(aParam.eFunction); -} - -void SAL_CALL ScConsolidationDescriptor::setFunction( sheet::GeneralFunction nFunction ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aParam.eFunction = ScDataUnoConversion::GeneralToSubTotal(nFunction); -} - -uno::Sequence<table::CellRangeAddress> SAL_CALL ScConsolidationDescriptor::getSources() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aParam.nDataAreaCount; - if (!aParam.ppDataAreas) - nCount = 0; - table::CellRangeAddress aRange; - uno::Sequence<table::CellRangeAddress> aSeq(nCount); - table::CellRangeAddress* pAry = aSeq.getArray(); - for (sal_uInt16 i=0; i<nCount; i++) - { - ScArea* pArea = aParam.ppDataAreas[i]; - if (pArea) - { - aRange.Sheet = pArea->nTab; - aRange.StartColumn = pArea->nColStart; - aRange.StartRow = pArea->nRowStart; - aRange.EndColumn = pArea->nColEnd; - aRange.EndRow = pArea->nRowEnd; - } - pAry[i] = aRange; - } - return aSeq; -} - -void SAL_CALL ScConsolidationDescriptor::setSources( - const uno::Sequence<table::CellRangeAddress>& aSources ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = (sal_uInt16)aSources.getLength(); - if (nCount) - { - const table::CellRangeAddress* pAry = aSources.getConstArray(); - ScArea** pNew = new ScArea*[nCount]; - sal_uInt16 i; - for (i=0; i<nCount; i++) - pNew[i] = new ScArea( pAry[i].Sheet, - static_cast<SCCOL>(pAry[i].StartColumn), pAry[i].StartRow, - static_cast<SCCOL>(pAry[i].EndColumn), pAry[i].EndRow ); - - aParam.SetAreas( pNew, nCount ); // kopiert alles - - for (i=0; i<nCount; i++) - delete pNew[i]; - delete[] pNew; - } - else - aParam.ClearDataAreas(); -} - -table::CellAddress SAL_CALL ScConsolidationDescriptor::getStartOutputPosition() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellAddress aPos; - aPos.Column = aParam.nCol; - aPos.Row = aParam.nRow; - aPos.Sheet = aParam.nTab; - return aPos; -} - -void SAL_CALL ScConsolidationDescriptor::setStartOutputPosition( - const table::CellAddress& aStartOutputPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aParam.nCol = (SCCOL)aStartOutputPosition.Column; - aParam.nRow = (SCROW)aStartOutputPosition.Row; - aParam.nTab = aStartOutputPosition.Sheet; -} - -sal_Bool SAL_CALL ScConsolidationDescriptor::getUseColumnHeaders() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aParam.bByCol; -} - -void SAL_CALL ScConsolidationDescriptor::setUseColumnHeaders( sal_Bool bUseColumnHeaders ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aParam.bByCol = bUseColumnHeaders; -} - -sal_Bool SAL_CALL ScConsolidationDescriptor::getUseRowHeaders() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aParam.bByRow; -} - -void SAL_CALL ScConsolidationDescriptor::setUseRowHeaders( sal_Bool bUseRowHeaders ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aParam.bByRow = bUseRowHeaders; -} - -sal_Bool SAL_CALL ScConsolidationDescriptor::getInsertLinks() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aParam.bReferenceData; -} - -void SAL_CALL ScConsolidationDescriptor::setInsertLinks( sal_Bool bInsertLinks ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aParam.bReferenceData = bInsertLinks; -} - -//------------------------------------------------------------------------ - -void ScFilterDescriptorBase::fillQueryParam( - ScQueryParam& rParam, ScDocument* pDoc, - const uno::Sequence<sheet::TableFilterField2>& aFilterFields) -{ - SCSIZE nCount = static_cast<SCSIZE>(aFilterFields.getLength()); - OSL_ENSURE( nCount <= MAXQUERY, "setFilterFields: zu viele" ); - - rParam.Resize( nCount ); - - const sheet::TableFilterField2* pAry = aFilterFields.getConstArray(); - SCSIZE i; - for (i=0; i<nCount; i++) - { - ScQueryEntry& rEntry = rParam.GetEntry(i); - if (!rEntry.pStr) - rEntry.pStr = new String; // sollte nicht sein (soll immer initialisiert sein) - - rEntry.bDoQuery = sal_True; - rEntry.eConnect = (pAry[i].Connection == sheet::FilterConnection_AND) ? SC_AND : SC_OR; - rEntry.nField = pAry[i].Field; - rEntry.bQueryByString = !pAry[i].IsNumeric; - *rEntry.pStr = String( pAry[i].StringValue ); - rEntry.nVal = pAry[i].NumericValue; - - if (!rEntry.bQueryByString && pDoc) - { - pDoc->GetFormatTable()->GetInputLineString(rEntry.nVal, 0, *rEntry.pStr); - } - - switch (pAry[i].Operator) // FilterOperator - { - case sheet::FilterOperator2::EQUAL: rEntry.eOp = SC_EQUAL; break; - case sheet::FilterOperator2::LESS: rEntry.eOp = SC_LESS; break; - case sheet::FilterOperator2::GREATER: rEntry.eOp = SC_GREATER; break; - case sheet::FilterOperator2::LESS_EQUAL: rEntry.eOp = SC_LESS_EQUAL; break; - case sheet::FilterOperator2::GREATER_EQUAL: rEntry.eOp = SC_GREATER_EQUAL; break; - case sheet::FilterOperator2::NOT_EQUAL: rEntry.eOp = SC_NOT_EQUAL; break; - case sheet::FilterOperator2::TOP_VALUES: rEntry.eOp = SC_TOPVAL; break; - case sheet::FilterOperator2::BOTTOM_VALUES: rEntry.eOp = SC_BOTVAL; break; - case sheet::FilterOperator2::TOP_PERCENT: rEntry.eOp = SC_TOPPERC; break; - case sheet::FilterOperator2::BOTTOM_PERCENT: rEntry.eOp = SC_BOTPERC; break; - case sheet::FilterOperator2::CONTAINS: rEntry.eOp = SC_CONTAINS; break; - case sheet::FilterOperator2::DOES_NOT_CONTAIN: rEntry.eOp = SC_DOES_NOT_CONTAIN; break; - case sheet::FilterOperator2::BEGINS_WITH: rEntry.eOp = SC_BEGINS_WITH; break; - case sheet::FilterOperator2::DOES_NOT_BEGIN_WITH: rEntry.eOp = SC_DOES_NOT_BEGIN_WITH;break; - case sheet::FilterOperator2::ENDS_WITH: rEntry.eOp = SC_ENDS_WITH; break; - case sheet::FilterOperator2::DOES_NOT_END_WITH: rEntry.eOp = SC_DOES_NOT_END_WITH; break; - case sheet::FilterOperator2::EMPTY: - { - rEntry.eOp = SC_EQUAL; - rEntry.nVal = SC_EMPTYFIELDS; - rEntry.bQueryByString = false; - *rEntry.pStr = EMPTY_STRING; - } - break; - case sheet::FilterOperator2::NOT_EMPTY: - { - rEntry.eOp = SC_EQUAL; - rEntry.nVal = SC_NONEMPTYFIELDS; - rEntry.bQueryByString = false; - *rEntry.pStr = EMPTY_STRING; - } - break; - default: - OSL_FAIL("Falscher Query-enum"); - rEntry.eOp = SC_EQUAL; - } - } - - SCSIZE nParamCount = rParam.GetEntryCount(); // Param wird nicht unter 8 resized - for (i=nCount; i<nParamCount; i++) - rParam.GetEntry(i).bDoQuery = false; // ueberzaehlige Felder zuruecksetzen -} - -ScFilterDescriptorBase::ScFilterDescriptorBase(ScDocShell* pDocShell) : - aPropSet( lcl_GetFilterPropertyMap() ), - pDocSh(pDocShell) -{ - if (pDocSh) - pDocSh->GetDocument()->AddUnoObject(*this); -} - -ScFilterDescriptorBase::~ScFilterDescriptorBase() -{ - if (pDocSh) - pDocSh->GetDocument()->RemoveUnoObject(*this); -} - -void ScFilterDescriptorBase::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) ) - { - sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); - if ( nId == SFX_HINT_DYING ) - { - pDocSh = NULL; // invalid - } - } -} - -// XSheetFilterDescriptor and XSheetFilterDescriptor2 - -uno::Sequence<sheet::TableFilterField> SAL_CALL ScFilterDescriptorBase::getFilterFields() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScQueryParam aParam; - GetData(aParam); - - SCSIZE nEntries = aParam.GetEntryCount(); // allozierte Eintraege im Param - SCSIZE nCount = 0; // aktive - while ( nCount < nEntries && - aParam.GetEntry(nCount).bDoQuery ) - ++nCount; - - sheet::TableFilterField aField; - uno::Sequence<sheet::TableFilterField> aSeq(static_cast<sal_Int32>(nCount)); - sheet::TableFilterField* pAry = aSeq.getArray(); - for (SCSIZE i=0; i<nCount; i++) - { - const ScQueryEntry& rEntry = aParam.GetEntry(i); - - rtl::OUString aStringValue; - if (rEntry.pStr) - aStringValue = *rEntry.pStr; - - aField.Connection = (rEntry.eConnect == SC_AND) ? sheet::FilterConnection_AND : - sheet::FilterConnection_OR; - aField.Field = rEntry.nField; - aField.IsNumeric = !rEntry.bQueryByString; - aField.StringValue = aStringValue; - aField.NumericValue = rEntry.nVal; - - switch (rEntry.eOp) // ScQueryOp - { - case SC_EQUAL: - { - aField.Operator = sheet::FilterOperator_EQUAL; - if (!rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING) - { - if (rEntry.nVal == SC_EMPTYFIELDS) - { - aField.Operator = sheet::FilterOperator_EMPTY; - aField.NumericValue = 0; - } - else if (rEntry.nVal == SC_NONEMPTYFIELDS) - { - aField.Operator = sheet::FilterOperator_NOT_EMPTY; - aField.NumericValue = 0; - } - } - } - break; - case SC_LESS: aField.Operator = sheet::FilterOperator_LESS; break; - case SC_GREATER: aField.Operator = sheet::FilterOperator_GREATER; break; - case SC_LESS_EQUAL: aField.Operator = sheet::FilterOperator_LESS_EQUAL; break; - case SC_GREATER_EQUAL: aField.Operator = sheet::FilterOperator_GREATER_EQUAL; break; - case SC_NOT_EQUAL: aField.Operator = sheet::FilterOperator_NOT_EQUAL; break; - case SC_TOPVAL: aField.Operator = sheet::FilterOperator_TOP_VALUES; break; - case SC_BOTVAL: aField.Operator = sheet::FilterOperator_BOTTOM_VALUES; break; - case SC_TOPPERC: aField.Operator = sheet::FilterOperator_TOP_PERCENT; break; - case SC_BOTPERC: aField.Operator = sheet::FilterOperator_BOTTOM_PERCENT; break; - default: - OSL_FAIL("Falscher Filter-enum"); - aField.Operator = sheet::FilterOperator_EMPTY; - } - pAry[i] = aField; - } - return aSeq; -} - -uno::Sequence<sheet::TableFilterField2> SAL_CALL ScFilterDescriptorBase::getFilterFields2() -throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScQueryParam aParam; - GetData(aParam); - - SCSIZE nEntries = aParam.GetEntryCount(); // allozierte Eintraege im Param - SCSIZE nCount = 0; // aktive - while ( nCount < nEntries && - aParam.GetEntry(nCount).bDoQuery ) - ++nCount; - - sheet::TableFilterField2 aField; - uno::Sequence<sheet::TableFilterField2> aSeq(static_cast<sal_Int32>(nCount)); - sheet::TableFilterField2* pAry = aSeq.getArray(); - for (SCSIZE i=0; i<nCount; i++) - { - const ScQueryEntry& rEntry = aParam.GetEntry(i); - - rtl::OUString aStringValue; - if (rEntry.pStr) - aStringValue = *rEntry.pStr; - - aField.Connection = (rEntry.eConnect == SC_AND) ? sheet::FilterConnection_AND : sheet::FilterConnection_OR; - aField.Field = rEntry.nField; - aField.IsNumeric = !rEntry.bQueryByString; - aField.StringValue = aStringValue; - aField.NumericValue = rEntry.nVal; - - switch (rEntry.eOp) // ScQueryOp - { - case SC_EQUAL: - { - aField.Operator = sheet::FilterOperator2::EQUAL; - if (!rEntry.bQueryByString && *rEntry.pStr == EMPTY_STRING) - { - if (rEntry.nVal == SC_EMPTYFIELDS) - { - aField.Operator = sheet::FilterOperator2::EMPTY; - aField.NumericValue = 0; - } - else if (rEntry.nVal == SC_NONEMPTYFIELDS) - { - aField.Operator = sheet::FilterOperator2::NOT_EMPTY; - aField.NumericValue = 0; - } - } - } - break; - case SC_LESS: aField.Operator = sheet::FilterOperator2::LESS; break; - case SC_GREATER: aField.Operator = sheet::FilterOperator2::GREATER; break; - case SC_LESS_EQUAL: aField.Operator = sheet::FilterOperator2::LESS_EQUAL; break; - case SC_GREATER_EQUAL: aField.Operator = sheet::FilterOperator2::GREATER_EQUAL; break; - case SC_NOT_EQUAL: aField.Operator = sheet::FilterOperator2::NOT_EQUAL; break; - case SC_TOPVAL: aField.Operator = sheet::FilterOperator2::TOP_VALUES; break; - case SC_BOTVAL: aField.Operator = sheet::FilterOperator2::BOTTOM_VALUES; break; - case SC_TOPPERC: aField.Operator = sheet::FilterOperator2::TOP_PERCENT; break; - case SC_BOTPERC: aField.Operator = sheet::FilterOperator2::BOTTOM_PERCENT; break; - case SC_CONTAINS: aField.Operator = sheet::FilterOperator2::CONTAINS; break; - case SC_DOES_NOT_CONTAIN: aField.Operator = sheet::FilterOperator2::DOES_NOT_CONTAIN; break; - case SC_BEGINS_WITH: aField.Operator = sheet::FilterOperator2::BEGINS_WITH; break; - case SC_DOES_NOT_BEGIN_WITH: aField.Operator = sheet::FilterOperator2::DOES_NOT_BEGIN_WITH; break; - case SC_ENDS_WITH: aField.Operator = sheet::FilterOperator2::ENDS_WITH; break; - case SC_DOES_NOT_END_WITH: aField.Operator = sheet::FilterOperator2::DOES_NOT_END_WITH; break; - default: - OSL_FAIL("Falscher Filter-enum"); - aField.Operator = sheet::FilterOperator2::EMPTY; - } - pAry[i] = aField; - } - return aSeq; -} - -void SAL_CALL ScFilterDescriptorBase::setFilterFields( - const uno::Sequence<sheet::TableFilterField>& aFilterFields ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScQueryParam aParam; - GetData(aParam); - - SCSIZE nCount = static_cast<SCSIZE>(aFilterFields.getLength()); - OSL_ENSURE( nCount <= MAXQUERY, "setFilterFields: zu viele" ); - - aParam.Resize( nCount ); - - const sheet::TableFilterField* pAry = aFilterFields.getConstArray(); - SCSIZE i; - for (i=0; i<nCount; i++) - { - ScQueryEntry& rEntry = aParam.GetEntry(i); - if (!rEntry.pStr) - rEntry.pStr = new String; // sollte nicht sein (soll immer initialisiert sein) - - rEntry.bDoQuery = sal_True; - rEntry.eConnect = (pAry[i].Connection == sheet::FilterConnection_AND) ? SC_AND : SC_OR; - rEntry.nField = pAry[i].Field; - rEntry.bQueryByString = !pAry[i].IsNumeric; - *rEntry.pStr = String( pAry[i].StringValue ); - rEntry.nVal = pAry[i].NumericValue; - - if (!rEntry.bQueryByString && pDocSh) - { - pDocSh->GetDocument()->GetFormatTable()->GetInputLineString(rEntry.nVal, 0, *rEntry.pStr); - } - - switch (pAry[i].Operator) // FilterOperator - { - case sheet::FilterOperator_EQUAL: rEntry.eOp = SC_EQUAL; break; - case sheet::FilterOperator_LESS: rEntry.eOp = SC_LESS; break; - case sheet::FilterOperator_GREATER: rEntry.eOp = SC_GREATER; break; - case sheet::FilterOperator_LESS_EQUAL: rEntry.eOp = SC_LESS_EQUAL; break; - case sheet::FilterOperator_GREATER_EQUAL: rEntry.eOp = SC_GREATER_EQUAL; break; - case sheet::FilterOperator_NOT_EQUAL: rEntry.eOp = SC_NOT_EQUAL; break; - case sheet::FilterOperator_TOP_VALUES: rEntry.eOp = SC_TOPVAL; break; - case sheet::FilterOperator_BOTTOM_VALUES: rEntry.eOp = SC_BOTVAL; break; - case sheet::FilterOperator_TOP_PERCENT: rEntry.eOp = SC_TOPPERC; break; - case sheet::FilterOperator_BOTTOM_PERCENT: rEntry.eOp = SC_BOTPERC; break; - case sheet::FilterOperator_EMPTY: - { - rEntry.eOp = SC_EQUAL; - rEntry.nVal = SC_EMPTYFIELDS; - rEntry.bQueryByString = false; - *rEntry.pStr = EMPTY_STRING; - } - break; - case sheet::FilterOperator_NOT_EMPTY: - { - rEntry.eOp = SC_EQUAL; - rEntry.nVal = SC_NONEMPTYFIELDS; - rEntry.bQueryByString = false; - *rEntry.pStr = EMPTY_STRING; - } - break; - default: - OSL_FAIL("Falscher Query-enum"); - rEntry.eOp = SC_EQUAL; - } - } - - SCSIZE nParamCount = aParam.GetEntryCount(); // Param wird nicht unter 8 resized - for (i=nCount; i<nParamCount; i++) - aParam.GetEntry(i).bDoQuery = false; // ueberzaehlige Felder zuruecksetzen - - PutData(aParam); -} - -void SAL_CALL ScFilterDescriptorBase::setFilterFields2( - const uno::Sequence<sheet::TableFilterField2>& aFilterFields ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScQueryParam aParam; - GetData(aParam); - fillQueryParam(aParam, pDocSh->GetDocument(), aFilterFields); - PutData(aParam); -} - -// Rest sind Properties - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScFilterDescriptorBase::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScFilterDescriptorBase::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScQueryParam aParam; - GetData(aParam); - - String aString(aPropertyName); - if (aString.EqualsAscii( SC_UNONAME_CONTHDR )) - aParam.bHasHeader = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if (aString.EqualsAscii( SC_UNONAME_COPYOUT )) - aParam.bInplace = !(ScUnoHelpFunctions::GetBoolFromAny( aValue )); - else if (aString.EqualsAscii( SC_UNONAME_ISCASE )) - aParam.bCaseSens = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if (aString.EqualsAscii( SC_UNONAME_MAXFLD )) - { - sal_Int32 nVal = 0; - if ( (aValue >>= nVal) && nVal > sal::static_int_cast<sal_Int32>(MAXQUERY) ) - { - throw lang::IllegalArgumentException(); - } - } - else if (aString.EqualsAscii( SC_UNONAME_ORIENT )) - { - //! test for correct enum type? - table::TableOrientation eOrient = (table::TableOrientation) - ScUnoHelpFunctions::GetEnumFromAny( aValue ); - aParam.bByRow = ( eOrient != table::TableOrientation_COLUMNS ); - } - else if (aString.EqualsAscii( SC_UNONAME_OUTPOS )) - { - table::CellAddress aAddress; - if ( aValue >>= aAddress ) - { - aParam.nDestTab = aAddress.Sheet; - aParam.nDestCol = (SCCOL)aAddress.Column; - aParam.nDestRow = (SCROW)aAddress.Row; - } - } - else if (aString.EqualsAscii( SC_UNONAME_SAVEOUT )) - aParam.bDestPers = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if (aString.EqualsAscii( SC_UNONAME_SKIPDUP )) - aParam.bDuplicate = !(ScUnoHelpFunctions::GetBoolFromAny( aValue )); - else if (aString.EqualsAscii( SC_UNONAME_USEREGEX )) - aParam.bRegExp = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - - PutData(aParam); -} - -uno::Any SAL_CALL ScFilterDescriptorBase::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScQueryParam aParam; - GetData(aParam); - - String aString(aPropertyName); - uno::Any aRet; - - if (aString.EqualsAscii( SC_UNONAME_CONTHDR )) - ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bHasHeader ); - else if (aString.EqualsAscii( SC_UNONAME_COPYOUT )) - ScUnoHelpFunctions::SetBoolInAny( aRet, !(aParam.bInplace) ); - else if (aString.EqualsAscii( SC_UNONAME_ISCASE )) - ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bCaseSens ); - else if (aString.EqualsAscii( SC_UNONAME_MAXFLD )) - aRet <<= (sal_Int32) MAXQUERY; - else if (aString.EqualsAscii( SC_UNONAME_ORIENT )) - { - table::TableOrientation eOrient = aParam.bByRow ? table::TableOrientation_ROWS : - table::TableOrientation_COLUMNS; - aRet <<= eOrient; - } - else if (aString.EqualsAscii( SC_UNONAME_OUTPOS )) - { - table::CellAddress aOutPos; - aOutPos.Sheet = aParam.nDestTab; - aOutPos.Column = aParam.nDestCol; - aOutPos.Row = aParam.nDestRow; - aRet <<= aOutPos; - } - else if (aString.EqualsAscii( SC_UNONAME_SAVEOUT )) - ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bDestPers ); - else if (aString.EqualsAscii( SC_UNONAME_SKIPDUP )) - ScUnoHelpFunctions::SetBoolInAny( aRet, !(aParam.bDuplicate) ); - else if (aString.EqualsAscii( SC_UNONAME_USEREGEX )) - ScUnoHelpFunctions::SetBoolInAny( aRet, aParam.bRegExp ); - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScFilterDescriptorBase ) - -//------------------------------------------------------------------------ - -ScFilterDescriptor::ScFilterDescriptor(ScDocShell* pDocShell) - : - ScFilterDescriptorBase(pDocShell) -{ -} - -ScFilterDescriptor::~ScFilterDescriptor() -{ -} - -void ScFilterDescriptor::GetData( ScQueryParam& rParam ) const -{ - rParam = aStoredParam; // Abfrage fuer Interface -} - -void ScFilterDescriptor::PutData( const ScQueryParam& rParam ) -{ - aStoredParam = rParam; // vom Interface gesetzt -} - -void ScFilterDescriptor::SetParam( const ScQueryParam& rNew ) -{ - aStoredParam = rNew; // von aussen gesetzt -} - -//------------------------------------------------------------------------ - -ScRangeFilterDescriptor::ScRangeFilterDescriptor(ScDocShell* pDocShell, ScDatabaseRangeObj* pPar) : - ScFilterDescriptorBase(pDocShell), - pParent(pPar) -{ - if (pParent) - pParent->acquire(); -} - -ScRangeFilterDescriptor::~ScRangeFilterDescriptor() -{ - if (pParent) - pParent->release(); -} - -void ScRangeFilterDescriptor::GetData( ScQueryParam& rParam ) const -{ - if (pParent) - pParent->GetQueryParam( rParam ); -} - -void ScRangeFilterDescriptor::PutData( const ScQueryParam& rParam ) -{ - if (pParent) - pParent->SetQueryParam( rParam ); -} - -//------------------------------------------------------------------------ - -ScDataPilotFilterDescriptor::ScDataPilotFilterDescriptor(ScDocShell* pDocShell, ScDataPilotDescriptorBase* pPar) : - ScFilterDescriptorBase(pDocShell), - pParent(pPar) -{ - if (pParent) - pParent->acquire(); -} - -ScDataPilotFilterDescriptor::~ScDataPilotFilterDescriptor() -{ - if (pParent) - pParent->release(); -} - -void ScDataPilotFilterDescriptor::GetData( ScQueryParam& rParam ) const -{ - if (pParent) - { - ScDPObject* pDPObj = pParent->GetDPObject(); - if (pDPObj && pDPObj->IsSheetData()) - rParam = pDPObj->GetSheetDesc()->GetQueryParam(); - } -} - -void ScDataPilotFilterDescriptor::PutData( const ScQueryParam& rParam ) -{ - if (pParent) - { - ScDPObject* pDPObj = pParent->GetDPObject(); - if (pDPObj) - { - ScSheetSourceDesc aSheetDesc(pParent->GetDocShell()->GetDocument()); - if (pDPObj->IsSheetData()) - aSheetDesc = *pDPObj->GetSheetDesc(); - aSheetDesc.SetQueryParam(rParam); - pDPObj->SetSheetDesc(aSheetDesc); - pParent->SetDPObject(pDPObj); - } - } -} - -//------------------------------------------------------------------------ - -ScDatabaseRangeObj::ScDatabaseRangeObj(ScDocShell* pDocSh, const String& rNm) : - pDocShell( pDocSh ), - aName( rNm ), - aPropSet( lcl_GetDBRangePropertyMap() ), - bIsUnnamed(false) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDatabaseRangeObj::ScDatabaseRangeObj(ScDocShell* pDocSh, const SCTAB nTab) : - pDocShell( pDocSh ), - aName(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)), - aPropSet( lcl_GetDBRangePropertyMap() ), - bIsUnnamed(true), - aTab( nTab ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDatabaseRangeObj::~ScDatabaseRangeObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScDatabaseRangeObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - - if ( rHint.ISA( SfxSimpleHint ) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pDocShell = NULL; // ungueltig geworden - else if ( rHint.ISA (ScDBRangeRefreshedHint) ) - { - ScDBData* pDBData = GetDBData_Impl(); - const ScDBRangeRefreshedHint& rRef = (const ScDBRangeRefreshedHint&)rHint; - ScImportParam aParam; - pDBData->GetImportParam(aParam); - if (aParam == rRef.GetImportParam()) - Refreshed_Impl(); - } -} - -// Hilfsfuntionen - -ScDBData* ScDatabaseRangeObj::GetDBData_Impl() const -{ - ScDBData* pRet = NULL; - if (pDocShell) - { - if (bIsUnnamed) - { - pRet = pDocShell->GetDocument()->GetAnonymousDBData(aTab); - } - else - { - ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection(); - if (pNames) - { - ScDBData* p = pNames->getNamedDBs().findByName(aName); - if (p) - pRet = p; - } - } - } - return pRet; -} - -// XNamed - -rtl::OUString SAL_CALL ScDatabaseRangeObj::getName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aName; -} - -void SAL_CALL ScDatabaseRangeObj::setName( const rtl::OUString& aNewName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDBDocFunc aFunc(*pDocShell); - String aNewStr(aNewName); - sal_Bool bOk = aFunc.RenameDBRange( aName, aNewStr ); - if (bOk) - aName = aNewStr; - } -} - -// XDatabaseRange - -table::CellRangeAddress SAL_CALL ScDatabaseRangeObj::getDataArea() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellRangeAddress aAddress; - ScDBData* pData = GetDBData_Impl(); - if (pData) - { - ScRange aRange; - pData->GetArea(aRange); - aAddress.Sheet = aRange.aStart.Tab(); - aAddress.StartColumn = aRange.aStart.Col(); - aAddress.StartRow = aRange.aStart.Row(); - aAddress.EndColumn = aRange.aEnd.Col(); - aAddress.EndRow = aRange.aEnd.Row(); - } - return aAddress; -} - -void SAL_CALL ScDatabaseRangeObj::setDataArea( const table::CellRangeAddress& aDataArea ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDBData* pData = GetDBData_Impl(); - if ( pDocShell && pData ) - { - ScDBData aNewData( *pData ); - //! MoveTo ??? - aNewData.SetArea( aDataArea.Sheet, (SCCOL)aDataArea.StartColumn, (SCROW)aDataArea.StartRow, - (SCCOL)aDataArea.EndColumn, (SCROW)aDataArea.EndRow ); - ScDBDocFunc aFunc(*pDocShell); - aFunc.ModifyDBData(aNewData); - } -} - -uno::Sequence<beans::PropertyValue> SAL_CALL ScDatabaseRangeObj::getSortDescriptor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScSortParam aParam; - const ScDBData* pData = GetDBData_Impl(); - if (pData) - { - pData->GetSortParam(aParam); - - // im SortDescriptor sind die Fields innerhalb des Bereichs gezaehlt - ScRange aDBRange; - pData->GetArea(aDBRange); - SCCOLROW nFieldStart = aParam.bByRow ? static_cast<SCCOLROW>(aDBRange.aStart.Col()) : static_cast<SCCOLROW>(aDBRange.aStart.Row()); - for (sal_uInt16 i=0; i<MAXSORT; i++) - if ( aParam.bDoSort[i] && aParam.nField[i] >= nFieldStart ) - aParam.nField[i] -= nFieldStart; - } - - uno::Sequence<beans::PropertyValue> aSeq( ScSortDescriptor::GetPropertyCount() ); - ScSortDescriptor::FillProperties( aSeq, aParam ); - return aSeq; -} - -void ScDatabaseRangeObj::GetQueryParam(ScQueryParam& rQueryParam) const -{ - const ScDBData* pData = GetDBData_Impl(); - if (pData) - { - pData->GetQueryParam(rQueryParam); - - // im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt - ScRange aDBRange; - pData->GetArea(aDBRange); - SCCOLROW nFieldStart = rQueryParam.bByRow ? static_cast<SCCOLROW>(aDBRange.aStart.Col()) : static_cast<SCCOLROW>(aDBRange.aStart.Row()); - SCSIZE nCount = rQueryParam.GetEntryCount(); - for (SCSIZE i=0; i<nCount; i++) - { - ScQueryEntry& rEntry = rQueryParam.GetEntry(i); - if (rEntry.bDoQuery && rEntry.nField >= nFieldStart) - rEntry.nField -= nFieldStart; - } - } -} - -void ScDatabaseRangeObj::SetQueryParam(const ScQueryParam& rQueryParam) -{ - const ScDBData* pData = GetDBData_Impl(); - if (pData) - { - // im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt - ScQueryParam aParam(rQueryParam); - ScRange aDBRange; - pData->GetArea(aDBRange); - SCCOLROW nFieldStart = aParam.bByRow ? static_cast<SCCOLROW>(aDBRange.aStart.Col()) : static_cast<SCCOLROW>(aDBRange.aStart.Row()); - - SCSIZE nCount = aParam.GetEntryCount(); - for (SCSIZE i=0; i<nCount; i++) - { - ScQueryEntry& rEntry = aParam.GetEntry(i); - if (rEntry.bDoQuery) - rEntry.nField += nFieldStart; - } - - ScDBData aNewData( *pData ); - aNewData.SetQueryParam(aParam); - aNewData.SetHeader(aParam.bHasHeader); // not in ScDBData::SetQueryParam - ScDBDocFunc aFunc(*pDocShell); - aFunc.ModifyDBData(aNewData); - } -} - -uno::Reference<sheet::XSheetFilterDescriptor> SAL_CALL ScDatabaseRangeObj::getFilterDescriptor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScRangeFilterDescriptor(pDocShell, this); -} - -void ScDatabaseRangeObj::GetSubTotalParam(ScSubTotalParam& rSubTotalParam) const -{ - const ScDBData* pData = GetDBData_Impl(); - if (pData) - { - pData->GetSubTotalParam(rSubTotalParam); - - // im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt - ScRange aDBRange; - pData->GetArea(aDBRange); - SCCOL nFieldStart = aDBRange.aStart.Col(); - for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++) - { - if ( rSubTotalParam.bGroupActive[i] ) - { - if ( rSubTotalParam.nField[i] >= nFieldStart ) - rSubTotalParam.nField[i] = sal::static_int_cast<SCCOL>( rSubTotalParam.nField[i] - nFieldStart ); - for (SCCOL j=0; j<rSubTotalParam.nSubTotals[i]; j++) - if ( rSubTotalParam.pSubTotals[i][j] >= nFieldStart ) - rSubTotalParam.pSubTotals[i][j] = - sal::static_int_cast<SCCOL>( rSubTotalParam.pSubTotals[i][j] - nFieldStart ); - } - } - } -} - -void ScDatabaseRangeObj::SetSubTotalParam(const ScSubTotalParam& rSubTotalParam) -{ - const ScDBData* pData = GetDBData_Impl(); - if (pData) - { - // im FilterDescriptor sind die Fields innerhalb des Bereichs gezaehlt - ScSubTotalParam aParam(rSubTotalParam); - ScRange aDBRange; - pData->GetArea(aDBRange); - SCCOL nFieldStart = aDBRange.aStart.Col(); - for (sal_uInt16 i=0; i<MAXSUBTOTAL; i++) - { - if ( aParam.bGroupActive[i] ) - { - aParam.nField[i] = sal::static_int_cast<SCCOL>( aParam.nField[i] + nFieldStart ); - for (SCCOL j=0; j<aParam.nSubTotals[i]; j++) - aParam.pSubTotals[i][j] = sal::static_int_cast<SCCOL>( aParam.pSubTotals[i][j] + nFieldStart ); - } - } - - ScDBData aNewData( *pData ); - aNewData.SetSubTotalParam(aParam); - ScDBDocFunc aFunc(*pDocShell); - aFunc.ModifyDBData(aNewData); - } -} - -uno::Reference<sheet::XSubTotalDescriptor> SAL_CALL ScDatabaseRangeObj::getSubTotalDescriptor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScRangeSubTotalDescriptor(this); -} - -uno::Sequence<beans::PropertyValue> SAL_CALL ScDatabaseRangeObj::getImportDescriptor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScImportParam aParam; - const ScDBData* pData = GetDBData_Impl(); - if (pData) - pData->GetImportParam(aParam); - - uno::Sequence<beans::PropertyValue> aSeq( ScImportDescriptor::GetPropertyCount() ); - ScImportDescriptor::FillProperties( aSeq, aParam ); - return aSeq; -} - -// XRefreshable - -void SAL_CALL ScDatabaseRangeObj::refresh() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDBData* pData = GetDBData_Impl(); - if ( pDocShell && pData ) - { - ScDBDocFunc aFunc(*pDocShell); - - // Import zu wiederholen? - sal_Bool bContinue = sal_True; - ScImportParam aImportParam; - pData->GetImportParam( aImportParam ); - if (aImportParam.bImport && !pData->HasImportSelection()) - { - SCTAB nTab; - SCCOL nDummyCol; - SCROW nDummyRow; - pData->GetArea( nTab, nDummyCol,nDummyRow,nDummyCol,nDummyRow ); - uno::Reference< sdbc::XResultSet > xResultSet; - bContinue = aFunc.DoImport( nTab, aImportParam, xResultSet, NULL, sal_True, false ); //! Api-Flag als Parameter - } - - // interne Operationen (sort, query, subtotal) nur, wenn kein Fehler - if (bContinue) - aFunc.RepeatDB( pData->GetName(), true, true, bIsUnnamed, aTab ); - } -} - -void SAL_CALL ScDatabaseRangeObj::addRefreshListener( - const uno::Reference<util::XRefreshListener >& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<util::XRefreshListener>* pObj = - new uno::Reference<util::XRefreshListener>( xListener ); - aRefreshListeners.Insert( pObj, aRefreshListeners.Count() ); - - // hold one additional ref to keep this object alive as long as there are listeners - if ( aRefreshListeners.Count() == 1 ) - acquire(); -} - -void SAL_CALL ScDatabaseRangeObj::removeRefreshListener( - const uno::Reference<util::XRefreshListener >& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aRefreshListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<util::XRefreshListener>* pObj = aRefreshListeners[n]; - if ( *pObj == xListener ) - { - aRefreshListeners.DeleteAndDestroy( n ); - if ( aRefreshListeners.Count() == 0 ) - release(); // release ref for listeners - break; - } - } -} - -void ScDatabaseRangeObj::Refreshed_Impl() -{ - lang::EventObject aEvent; - aEvent.Source = (cppu::OWeakObject*)this; - for ( sal_uInt16 n=0; n<aRefreshListeners.Count(); n++ ) - (*aRefreshListeners[n])->refreshed( aEvent ); -} - -// XCellRangeSource - -uno::Reference<table::XCellRange> SAL_CALL ScDatabaseRangeObj::getReferredCells() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRange aRange; - ScDBData* pData = GetDBData_Impl(); - if ( pData ) - { - //! static Funktion um ScCellObj/ScCellRangeObj zu erzeugen am ScCellRangeObj ??? - - pData->GetArea(aRange); - if ( aRange.aStart == aRange.aEnd ) - return new ScCellObj( pDocShell, aRange.aStart ); - else - return new ScCellRangeObj( pDocShell, aRange ); - } - return NULL; -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScDatabaseRangeObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScDatabaseRangeObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDBData* pData = GetDBData_Impl(); - if ( pDocShell && pData ) - { - ScDBData aNewData( *pData ); - sal_Bool bDo = sal_True; - - String aString(aPropertyName); - if ( aString.EqualsAscii( SC_UNONAME_KEEPFORM ) ) - aNewData.SetKeepFmt( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNONAME_MOVCELLS ) ) - aNewData.SetDoSize( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNONAME_STRIPDAT ) ) - aNewData.SetStripData( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNONAME_AUTOFLT )) - { - sal_Bool bAutoFilter(ScUnoHelpFunctions::GetBoolFromAny( aValue )); - aNewData.SetAutoFilter(bAutoFilter); - ScRange aRange; - aNewData.GetArea(aRange); - ScDocument* pDoc = pDocShell->GetDocument(); - if (bAutoFilter && pDoc) - pDoc->ApplyFlagsTab( aRange.aStart.Col(), aRange.aStart.Row(), - aRange.aEnd.Col(), aRange.aStart.Row(), - aRange.aStart.Tab(), SC_MF_AUTO ); - else if (!bAutoFilter && pDoc) - pDoc->RemoveFlagsTab(aRange.aStart.Col(), aRange.aStart.Row(), - aRange.aEnd.Col(), aRange.aStart.Row(), - aRange.aStart.Tab(), SC_MF_AUTO ); - ScRange aPaintRange(aRange.aStart, aRange.aEnd); - aPaintRange.aEnd.SetRow(aPaintRange.aStart.Row()); - pDocShell->PostPaint(aPaintRange, PAINT_GRID); - } - else if (aString.EqualsAscii( SC_UNONAME_USEFLTCRT )) - { - if (ScUnoHelpFunctions::GetBoolFromAny( aValue )) - { - ScRange aRange; - aNewData.GetAdvancedQuerySource(aRange); - aNewData.SetAdvancedQuerySource(&aRange); - } - else - aNewData.SetAdvancedQuerySource(NULL); - } - else if (aString.EqualsAscii( SC_UNONAME_FLTCRT )) - { - table::CellRangeAddress aRange; - if (aValue >>= aRange) - { - ScRange aCoreRange; - ScUnoConversion::FillScRange(aCoreRange, aRange); - - aNewData.SetAdvancedQuerySource(&aCoreRange); - } - } - else if (aString.EqualsAscii( SC_UNONAME_FROMSELECT )) - { - aNewData.SetImportSelection(::cppu::any2bool(aValue)); - } - else if (aString.EqualsAscii( SC_UNONAME_REFPERIOD )) - { - sal_Int32 nRefresh = 0; - if (aValue >>= nRefresh) - { - ScDocument* pDoc = pDocShell->GetDocument(); - aNewData.SetRefreshDelay(nRefresh); - if (pDoc && pDoc->GetDBCollection()) - { - aNewData.SetRefreshHandler( pDoc->GetDBCollection()->GetRefreshHandler() ); - aNewData.SetRefreshControl( pDoc->GetRefreshTimerControlAddress() ); - } - } - } - else if (aString.EqualsAscii( SC_UNONAME_CONRES )) - { - } - else - bDo = false; - - if (bDo) - { - ScDBDocFunc aFunc(*pDocShell); - aFunc.ModifyDBData(aNewData); - } - } -} - -uno::Any SAL_CALL ScDatabaseRangeObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aRet; - ScDBData* pData = GetDBData_Impl(); - if ( pData ) - { - String aString(aPropertyName); - if ( aString.EqualsAscii( SC_UNONAME_KEEPFORM ) ) - ScUnoHelpFunctions::SetBoolInAny( aRet, pData->IsKeepFmt() ); - else if ( aString.EqualsAscii( SC_UNONAME_MOVCELLS ) ) - ScUnoHelpFunctions::SetBoolInAny( aRet, pData->IsDoSize() ); - else if ( aString.EqualsAscii( SC_UNONAME_STRIPDAT ) ) - ScUnoHelpFunctions::SetBoolInAny( aRet, pData->IsStripData() ); - else if ( aString.EqualsAscii( SC_UNONAME_ISUSER ) ) - { - // all database ranges except "unnamed" are user defined - ScUnoHelpFunctions::SetBoolInAny( - aRet, !pData->GetName().equalsAscii(STR_DB_LOCAL_NONAME)); - } - else if ( aString.EqualsAscii( SC_UNO_LINKDISPBIT ) ) - { - // no target bitmaps for individual entries (would be all equal) - // ScLinkTargetTypeObj::SetLinkTargetBitmap( aRet, SC_LINKTARGETTYPE_DBAREA ); - } - else if ( aString.EqualsAscii( SC_UNO_LINKDISPNAME ) ) - aRet <<= rtl::OUString( aName ); - else if (aString.EqualsAscii( SC_UNONAME_AUTOFLT )) - { - sal_Bool bAutoFilter(GetDBData_Impl()->HasAutoFilter()); - - ScUnoHelpFunctions::SetBoolInAny( aRet, bAutoFilter ); - } - else if (aString.EqualsAscii( SC_UNONAME_USEFLTCRT )) - { - ScRange aRange; - sal_Bool bIsAdvancedSource(GetDBData_Impl()->GetAdvancedQuerySource(aRange)); - - ScUnoHelpFunctions::SetBoolInAny( aRet, bIsAdvancedSource ); - } - else if (aString.EqualsAscii( SC_UNONAME_FLTCRT )) - { - table::CellRangeAddress aRange; - ScRange aCoreRange; - if (GetDBData_Impl()->GetAdvancedQuerySource(aCoreRange)) - ScUnoConversion::FillApiRange(aRange, aCoreRange); - - aRet <<= aRange; - } - else if (aString.EqualsAscii( SC_UNONAME_FROMSELECT )) - { - ScUnoHelpFunctions::SetBoolInAny( aRet, GetDBData_Impl()->HasImportSelection() ); - } - else if (aString.EqualsAscii( SC_UNONAME_REFPERIOD )) - { - sal_Int32 nRefresh(GetDBData_Impl()->GetRefreshDelay()); - aRet <<= nRefresh; - } - else if (aString.EqualsAscii( SC_UNONAME_CONRES )) - { - } - else if (aString.EqualsAscii( SC_UNONAME_TOKENINDEX )) - { - // get index for use in formula tokens (read-only) - aRet <<= static_cast<sal_Int32>(GetDBData_Impl()->GetIndex()); - } - } - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScDatabaseRangeObj ) - -// XServiceInfo - -rtl::OUString SAL_CALL ScDatabaseRangeObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScDatabaseRangeObj" )); -} - -sal_Bool SAL_CALL ScDatabaseRangeObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr( rServiceName ); - return aServiceStr.EqualsAscii( SCDATABASERANGEOBJ_SERVICE ) || - aServiceStr.EqualsAscii( SCLINKTARGET_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScDatabaseRangeObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(2); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCDATABASERANGEOBJ_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCLINKTARGET_SERVICE )); - return aRet; -} - -//------------------------------------------------------------------------ - -ScDatabaseRangesObj::ScDatabaseRangesObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDatabaseRangesObj::~ScDatabaseRangesObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScDatabaseRangesObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XDatabaseRanges - -ScDatabaseRangeObj* ScDatabaseRangesObj::GetObjectByIndex_Impl(size_t nIndex) -{ - if (!pDocShell) - return NULL; - - ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection(); - if (!pNames) - return NULL; - - const ScDBCollection::NamedDBs& rDBs = pNames->getNamedDBs(); - if (rDBs.empty() || nIndex >= rDBs.size()) - return NULL; - - ScDBCollection::NamedDBs::const_iterator itr = rDBs.begin(); - ::std::advance(itr, nIndex); // boundary check is done above. - return new ScDatabaseRangeObj(pDocShell, itr->GetName()); -} - -ScDatabaseRangeObj* ScDatabaseRangesObj::GetObjectByName_Impl(const rtl::OUString& aName) -{ - if ( pDocShell && hasByName(aName) ) - { - String aString(aName); - return new ScDatabaseRangeObj( pDocShell, aString ); - } - return NULL; -} - - -void SAL_CALL ScDatabaseRangesObj::addNewByName( const rtl::OUString& aName, - const table::CellRangeAddress& aRange ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if (pDocShell) - { - ScDBDocFunc aFunc(*pDocShell); - - String aString(aName); - ScRange aNameRange( (SCCOL)aRange.StartColumn, (SCROW)aRange.StartRow, aRange.Sheet, - (SCCOL)aRange.EndColumn, (SCROW)aRange.EndRow, aRange.Sheet ); - bDone = aFunc.AddDBRange( aString, aNameRange, sal_True ); - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScDatabaseRangesObj::removeByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if (pDocShell) - { - ScDBDocFunc aFunc(*pDocShell); - String aString(aName); - bDone = aFunc.DeleteDBRange( aString ); - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScDatabaseRangesObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.DatabaseRangesEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScDatabaseRangesObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! "unbenannt" weglassen ? - - if (pDocShell) - { - ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection(); - if (pNames) - return static_cast<sal_Int32>(pNames->getNamedDBs().size()); - } - return 0; -} - -uno::Any SAL_CALL ScDatabaseRangesObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (nIndex < 0) - throw lang::IndexOutOfBoundsException(); - - uno::Reference<sheet::XDatabaseRange> xRange(GetObjectByIndex_Impl(static_cast<size_t>(nIndex))); - if (xRange.is()) - return uno::makeAny(xRange); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScDatabaseRangesObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<sheet::XDatabaseRange>*)0); -} - -sal_Bool SAL_CALL ScDatabaseRangesObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// XNameAccess - -uno::Any SAL_CALL ScDatabaseRangesObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XDatabaseRange> xRange(GetObjectByName_Impl(aName)); - if (xRange.is()) - return uno::makeAny(xRange); - else - throw container::NoSuchElementException(); -// return uno::Any(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScDatabaseRangesObj::getElementNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! "unbenannt" weglassen ? - - if (pDocShell) - { - ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection(); - if (pNames) - { - const ScDBCollection::NamedDBs& rDBs = pNames->getNamedDBs(); - uno::Sequence<rtl::OUString> aSeq(rDBs.size()); - ScDBCollection::NamedDBs::const_iterator itr = rDBs.begin(), itrEnd = rDBs.end(); - for (size_t i = 0; itr != itrEnd; ++itr, ++i) - aSeq[i] = itr->GetName(); - - return aSeq; - } - } - return uno::Sequence<rtl::OUString>(0); -} - -sal_Bool SAL_CALL ScDatabaseRangesObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! "unbenannt" weglassen ? - - if (pDocShell) - { - ScDBCollection* pNames = pDocShell->GetDocument()->GetDBCollection(); - if (pNames) - return pNames->getNamedDBs().findByName(aName) != NULL; - } - return false; -} - -//------------------------------------------------------------------------ - -ScUnnamedDatabaseRangesObj::ScUnnamedDatabaseRangesObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScUnnamedDatabaseRangesObj::~ScUnnamedDatabaseRangesObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScUnnamedDatabaseRangesObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XUnnamedDatabaseRanges - -void ScUnnamedDatabaseRangesObj::setByTable( const table::CellRangeAddress& aRange ) - throw( uno::RuntimeException, - lang::IndexOutOfBoundsException ) -{ - SolarMutexGuard aGuard; - bool bDone = false; - if (pDocShell) - { - if ( pDocShell->GetDocument()->GetTableCount() <= aRange.Sheet ) - throw lang::IndexOutOfBoundsException(); - - ScDBDocFunc aFunc(*pDocShell); - String aString(RTL_CONSTASCII_USTRINGPARAM(STR_DB_LOCAL_NONAME)); - ScRange aUnnamedRange( (SCCOL)aRange.StartColumn, (SCROW)aRange.StartRow, aRange.Sheet, - (SCCOL)aRange.EndColumn, (SCROW)aRange.EndRow, aRange.Sheet ); - bDone = aFunc.AddDBRange( aString, aUnnamedRange, sal_True ); - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -uno::Any ScUnnamedDatabaseRangesObj::getByTable( sal_Int32 nTab ) - throw(uno::RuntimeException, - lang::IndexOutOfBoundsException, - container::NoSuchElementException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - if ( pDocShell->GetDocument()->GetTableCount() <= nTab ) - throw lang::IndexOutOfBoundsException(); - uno::Reference<sheet::XDatabaseRange> xRange( - new ScDatabaseRangeObj(pDocShell, static_cast<SCTAB>(nTab))); - if (xRange.is()) - return uno::makeAny(xRange); - else - throw container::NoSuchElementException(); - } - else - throw uno::RuntimeException(); -} - -sal_Bool ScUnnamedDatabaseRangesObj::hasByTable( sal_Int32 nTab ) - throw (uno::RuntimeException, - lang::IndexOutOfBoundsException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - if (pDocShell->GetDocument()->GetTableCount() <= nTab) - throw lang::IndexOutOfBoundsException(); - if (pDocShell->GetDocument()->GetAnonymousDBData((SCTAB) nTab)) - return true; - return false; - } - else - return false; -} - -//------------------------------------------------------------------------ - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/defltuno.cxx b/sc/source/ui/unoobj/defltuno.cxx deleted file mode 100644 index 2bf3c78ce..000000000 --- a/sc/source/ui/unoobj/defltuno.cxx +++ /dev/null @@ -1,389 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - -#include <editeng/memberids.hrc> -#include <svl/smplhint.hxx> -#include <svl/itemprop.hxx> -#include <svx/unomid.hxx> -#include <vcl/svapp.hxx> -#include <i18npool/mslangid.hxx> - -#include <com/sun/star/beans/PropertyAttribute.hpp> - -#include "scitems.hxx" -#include "defltuno.hxx" -#include "miscuno.hxx" -#include "docsh.hxx" -#include "docpool.hxx" -#include "unonames.hxx" -#include "docoptio.hxx" - -#include <limits> - -using namespace ::com::sun::star; - -//------------------------------------------------------------------------ - -const SfxItemPropertyMapEntry* lcl_GetDocDefaultsMap() -{ - static SfxItemPropertyMapEntry aDocDefaultsMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_CFCHARS), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFNAME), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CFPITCH), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CLOCAL), ATTR_FONT_LANGUAGE, &getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL), ATTR_CJK_FONT_LANGUAGE, &getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL), ATTR_CTL_FONT_LANGUAGE, &getCppuType((lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_STANDARDDEC), 0, &getCppuType((sal_Int16*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_TABSTOPDIS), 0, &getCppuType((sal_Int32*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - return aDocDefaultsMap_Impl; -} - -inline long TwipsToHMM(long nTwips) { return (nTwips * 127 + 36) / 72; } -inline long HMMToTwips(long nHMM) { return (nHMM * 72 + 63) / 127; } -inline long TwipsToEvenHMM(long nTwips) { return ( (nTwips * 127 + 72) / 144 ) * 2; } - -//------------------------------------------------------------------------ - -SC_SIMPLE_SERVICE_INFO( ScDocDefaultsObj, "ScDocDefaultsObj", "com.sun.star.sheet.Defaults" ) - -//------------------------------------------------------------------------ - -ScDocDefaultsObj::ScDocDefaultsObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ), - aPropertyMap(lcl_GetDocDefaultsMap()) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDocDefaultsObj::~ScDocDefaultsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScDocDefaultsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // document gone - } -} - -void ScDocDefaultsObj::ItemsChanged() -{ - if (pDocShell) - { - //! if not in XML import, adjust row heights - - pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID ); - } -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScDocDefaultsObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef = new SfxItemPropertySetInfo( - &aPropertyMap ); - return aRef; -} - -void SAL_CALL ScDocDefaultsObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( !pDocShell ) - throw uno::RuntimeException(); - - const SfxItemPropertySimpleEntry* pEntry = aPropertyMap.getByName( aPropertyName ); - if ( !pEntry ) - throw beans::UnknownPropertyException(); - if(!pEntry->nWID) - { - if(aPropertyName.compareToAscii(SC_UNO_STANDARDDEC) == 0) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if (pDoc) - { - ScDocOptions aDocOpt(pDoc->GetDocOptions()); - sal_Int16 nValue = 0; - if (aValue >>= nValue) - { - aDocOpt.SetStdPrecision(static_cast<sal_uInt16> (nValue)); - pDoc->SetDocOptions(aDocOpt); - } - } - else - throw uno::RuntimeException(); - } - else if (aPropertyName.compareToAscii(SC_UNO_TABSTOPDIS) == 0) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if (pDoc) - { - ScDocOptions aDocOpt(pDoc->GetDocOptions()); - sal_Int32 nValue = 0; - if (aValue >>= nValue) - { - aDocOpt.SetTabDistance(static_cast<sal_uInt16>(HMMToTwips(nValue))); - pDoc->SetDocOptions(aDocOpt); - } - } - else - throw uno::RuntimeException(); - } - } - else if ( pEntry->nWID == ATTR_FONT_LANGUAGE || - pEntry->nWID == ATTR_CJK_FONT_LANGUAGE || - pEntry->nWID == ATTR_CTL_FONT_LANGUAGE ) - { - // for getPropertyValue the PoolDefaults are sufficient, - // but setPropertyValue has to be handled differently - - lang::Locale aLocale; - if ( aValue >>= aLocale ) - { - LanguageType eNew; - if (aLocale.Language.getLength() || aLocale.Country.getLength()) - eNew = MsLangId::convertLocaleToLanguage( aLocale ); - else - eNew = LANGUAGE_NONE; - - ScDocument* pDoc = pDocShell->GetDocument(); - LanguageType eLatin, eCjk, eCtl; - pDoc->GetLanguage( eLatin, eCjk, eCtl ); - - if ( pEntry->nWID == ATTR_CJK_FONT_LANGUAGE ) - eCjk = eNew; - else if ( pEntry->nWID == ATTR_CTL_FONT_LANGUAGE ) - eCtl = eNew; - else - eLatin = eNew; - - pDoc->SetLanguage( eLatin, eCjk, eCtl ); - } - } - else - { - ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool(); - SfxPoolItem* pNewItem = pPool->GetDefaultItem(pEntry->nWID).Clone(); - - if( !pNewItem->PutValue( aValue, pEntry->nMemberId ) ) - throw lang::IllegalArgumentException(); - - pPool->SetPoolDefaultItem( *pNewItem ); - delete pNewItem; // copied in SetPoolDefaultItem - - ItemsChanged(); - } -} - -uno::Any SAL_CALL ScDocDefaultsObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - // use pool default if set - - SolarMutexGuard aGuard; - - if ( !pDocShell ) - throw uno::RuntimeException(); - - uno::Any aRet; - const SfxItemPropertySimpleEntry* pEntry = aPropertyMap.getByName( aPropertyName ); - if ( !pEntry ) - throw beans::UnknownPropertyException(); - - if (!pEntry->nWID) - { - if(aPropertyName.compareToAscii(SC_UNO_STANDARDDEC) == 0) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if (pDoc) - { - const ScDocOptions& aDocOpt = pDoc->GetDocOptions(); - sal_uInt16 nPrec = aDocOpt.GetStdPrecision(); - // the max value of unsigned 16-bit integer is used as the flag - // value for unlimited precision, c.f. - // SvNumberFormatter::UNLIMITED_PRECISION. - if (nPrec <= ::std::numeric_limits<sal_Int16>::max()) - aRet <<= static_cast<sal_Int16> (nPrec); - } - else - throw uno::RuntimeException(); - } - else if (aPropertyName.compareToAscii(SC_UNO_TABSTOPDIS) == 0) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if (pDoc) - { - const ScDocOptions& aDocOpt = pDoc->GetDocOptions(); - sal_Int32 nValue (TwipsToEvenHMM(aDocOpt.GetTabDistance())); - aRet <<= nValue; - } - else - throw uno::RuntimeException(); - } - } - else - { - ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool(); - const SfxPoolItem& rItem = pPool->GetDefaultItem( pEntry->nWID ); - rItem.QueryValue( aRet, pEntry->nMemberId ); - } - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScDocDefaultsObj ) - -// XPropertyState - -beans::PropertyState SAL_CALL ScDocDefaultsObj::getPropertyState( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( !pDocShell ) - throw uno::RuntimeException(); - - const SfxItemPropertySimpleEntry* pEntry = aPropertyMap.getByName( aPropertyName ); - if ( !pEntry ) - throw beans::UnknownPropertyException(); - - beans::PropertyState eRet = beans::PropertyState_DEFAULT_VALUE; - - sal_uInt16 nWID = pEntry->nWID; - if ( nWID == ATTR_FONT || nWID == ATTR_CJK_FONT || nWID == ATTR_CTL_FONT || !nWID ) - { - // static default for font is system-dependent, - // so font default is always treated as "direct value". - - eRet = beans::PropertyState_DIRECT_VALUE; - } - else - { - // check if pool default is set - - ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool(); - if ( pPool->GetPoolDefaultItem( nWID ) != NULL ) - eRet = beans::PropertyState_DIRECT_VALUE; - } - - return eRet; -} - -uno::Sequence<beans::PropertyState> SAL_CALL ScDocDefaultsObj::getPropertyStates( - const uno::Sequence<rtl::OUString>& aPropertyNames ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - // the simple way: call getPropertyState - - SolarMutexGuard aGuard; - const rtl::OUString* pNames = aPropertyNames.getConstArray(); - uno::Sequence<beans::PropertyState> aRet(aPropertyNames.getLength()); - beans::PropertyState* pStates = aRet.getArray(); - for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++) - pStates[i] = getPropertyState(pNames[i]); - return aRet; -} - -void SAL_CALL ScDocDefaultsObj::setPropertyToDefault( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( !pDocShell ) - throw uno::RuntimeException(); - - const SfxItemPropertySimpleEntry* pEntry = aPropertyMap.getByName( aPropertyName ); - if ( !pEntry ) - throw beans::UnknownPropertyException(); - - if (pEntry->nWID) - { - ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool(); - pPool->ResetPoolDefaultItem( pEntry->nWID ); - - ItemsChanged(); - } -} - -uno::Any SAL_CALL ScDocDefaultsObj::getPropertyDefault( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - // always use static default - - SolarMutexGuard aGuard; - - if ( !pDocShell ) - throw uno::RuntimeException(); - - const SfxItemPropertySimpleEntry* pEntry = aPropertyMap.getByName( aPropertyName ); - if ( !pEntry ) - throw beans::UnknownPropertyException(); - - uno::Any aRet; - if (pEntry->nWID) - { - ScDocumentPool* pPool = pDocShell->GetDocument()->GetPool(); - const SfxPoolItem* pItem = pPool->GetItem2( pEntry->nWID, SFX_ITEMS_DEFAULT ); - if (pItem) - pItem->QueryValue( aRet, pEntry->nMemberId ); - } - return aRet; -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/detreg.cxx b/sc/source/ui/unoobj/detreg.cxx deleted file mode 100644 index 3b0674a3a..000000000 --- a/sc/source/ui/unoobj/detreg.cxx +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "scdetect.hxx" -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/registry/XRegistryKey.hpp> -#include <com/sun/star/uno/Sequence.h> -#include <sal/types.h> -#include <rtl/ustring.hxx> - -using ::rtl::OUString; -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::lang; - -extern "C" { - -SAL_DLLPUBLIC_EXPORT void* SAL_CALL scd_component_getFactory( const sal_Char* pImplementationName, - void* pServiceManager, - void* /* pRegistryKey */ ) -{ - // Set default return value for this operation - if it failed. - void* pReturn = NULL ; - - if ( - ( pImplementationName != NULL ) && - ( pServiceManager != NULL ) - ) - { - // Define variables which are used in following macros. - Reference< XSingleServiceFactory > xFactory ; - Reference< XMultiServiceFactory > xServiceManager( reinterpret_cast< XMultiServiceFactory* >( pServiceManager ) ) ; - - if( ScFilterDetect::impl_getStaticImplementationName().equalsAscii( pImplementationName ) ) - { - xFactory.set(::cppu::createSingleFactory( xServiceManager, - ScFilterDetect::impl_getStaticImplementationName(), - ScFilterDetect::impl_createInstance, - ScFilterDetect::impl_getStaticSupportedServiceNames() )); - } - - // Factory is valid - service was found. - if ( xFactory.is() ) - { - xFactory->acquire(); - pReturn = xFactory.get(); - } - } - - // Return with result of this operation. - return pReturn ; -} -} // extern "C" - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/dispuno.cxx b/sc/source/ui/unoobj/dispuno.cxx deleted file mode 100644 index a2001cb7d..000000000 --- a/sc/source/ui/unoobj/dispuno.cxx +++ /dev/null @@ -1,417 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <sfx2/viewfrm.hxx> -#include <comphelper/uno3.hxx> -#include <svx/dataaccessdescriptor.hxx> -#include <svl/smplhint.hxx> -#include <vcl/svapp.hxx> - -#include <com/sun/star/frame/XDispatchProviderInterception.hpp> -#include <com/sun/star/view/XSelectionSupplier.hpp> -#include <com/sun/star/sdb/CommandType.hpp> - -#include "dispuno.hxx" -#include "tabvwsh.hxx" -#include "dbdocfun.hxx" -#include "dbdata.hxx" - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -const char* cURLInsertColumns = ".uno:DataSourceBrowser/InsertColumns"; //data into text -const char* cURLDocDataSource = ".uno:DataSourceBrowser/DocumentDataSource"; - -//------------------------------------------------------------------------ - -SV_IMPL_PTRARR( XStatusListenerArr_Impl, XStatusListenerPtr ); - -//------------------------------------------------------------------------ - -uno::Reference<view::XSelectionSupplier> lcl_GetSelectionSupplier( SfxViewShell* pViewShell ) -{ - if ( pViewShell ) - { - SfxViewFrame* pViewFrame = pViewShell->GetViewFrame(); - if (pViewFrame) - { - return uno::Reference<view::XSelectionSupplier>( pViewFrame->GetFrame().GetController(), uno::UNO_QUERY ); - } - } - return uno::Reference<view::XSelectionSupplier>(); -} - -//------------------------------------------------------------------------ - - -ScDispatchProviderInterceptor::ScDispatchProviderInterceptor(ScTabViewShell* pViewSh) : - pViewShell( pViewSh ) -{ - if ( pViewShell ) - { - m_xIntercepted.set(uno::Reference<frame::XDispatchProviderInterception>(pViewShell->GetViewFrame()->GetFrame().GetFrameInterface(), uno::UNO_QUERY)); - if (m_xIntercepted.is()) - { - comphelper::increment( m_refCount ); - - m_xIntercepted->registerDispatchProviderInterceptor( - static_cast<frame::XDispatchProviderInterceptor*>(this)); - // this should make us the top-level dispatch-provider for the component, via a call to our - // setDispatchProvider we should have got an fallback for requests we (i.e. our master) cannot fullfill - uno::Reference<lang::XComponent> xInterceptedComponent(m_xIntercepted, uno::UNO_QUERY); - if (xInterceptedComponent.is()) - xInterceptedComponent->addEventListener(static_cast<lang::XEventListener*>(this)); - - comphelper::decrement( m_refCount ); - } - - StartListening(*pViewShell); - } -} - -ScDispatchProviderInterceptor::~ScDispatchProviderInterceptor() -{ - if (pViewShell) - EndListening(*pViewShell); -} - -void ScDispatchProviderInterceptor::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pViewShell = NULL; -} - -// XDispatchProvider - -uno::Reference<frame::XDispatch> SAL_CALL ScDispatchProviderInterceptor::queryDispatch( - const util::URL& aURL, const rtl::OUString& aTargetFrameName, - sal_Int32 nSearchFlags ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<frame::XDispatch> xResult; - // create some dispatch ... - if ( pViewShell && ( - !aURL.Complete.compareToAscii(cURLInsertColumns) || - !aURL.Complete.compareToAscii(cURLDocDataSource) ) ) - { - if (!m_xMyDispatch.is()) - m_xMyDispatch = new ScDispatch( pViewShell ); - xResult = m_xMyDispatch; - } - - // ask our slave provider - if (!xResult.is() && m_xSlaveDispatcher.is()) - xResult = m_xSlaveDispatcher->queryDispatch(aURL, aTargetFrameName, nSearchFlags); - - return xResult; -} - -uno::Sequence< uno::Reference<frame::XDispatch> > SAL_CALL - ScDispatchProviderInterceptor::queryDispatches( - const uno::Sequence<frame::DispatchDescriptor>& aDescripts ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Sequence< uno::Reference< frame::XDispatch> > aReturn(aDescripts.getLength()); - uno::Reference< frame::XDispatch>* pReturn = aReturn.getArray(); - const frame::DispatchDescriptor* pDescripts = aDescripts.getConstArray(); - for (sal_Int16 i=0; i<aDescripts.getLength(); ++i, ++pReturn, ++pDescripts) - { - *pReturn = queryDispatch(pDescripts->FeatureURL, - pDescripts->FrameName, pDescripts->SearchFlags); - } - return aReturn; -} - -// XDispatchProviderInterceptor - -uno::Reference<frame::XDispatchProvider> SAL_CALL - ScDispatchProviderInterceptor::getSlaveDispatchProvider() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return m_xSlaveDispatcher; -} - -void SAL_CALL ScDispatchProviderInterceptor::setSlaveDispatchProvider( - const uno::Reference<frame::XDispatchProvider>& xNewDispatchProvider ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - m_xSlaveDispatcher.set(xNewDispatchProvider); -} - -uno::Reference<frame::XDispatchProvider> SAL_CALL - ScDispatchProviderInterceptor::getMasterDispatchProvider() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return m_xMasterDispatcher; -} - -void SAL_CALL ScDispatchProviderInterceptor::setMasterDispatchProvider( - const uno::Reference<frame::XDispatchProvider>& xNewSupplier ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - m_xMasterDispatcher.set(xNewSupplier); -} - -// XEventListener - -void SAL_CALL ScDispatchProviderInterceptor::disposing( const lang::EventObject& /* Source */ ) - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if (m_xIntercepted.is()) - { - m_xIntercepted->releaseDispatchProviderInterceptor( - static_cast<frame::XDispatchProviderInterceptor*>(this)); - uno::Reference<lang::XComponent> xInterceptedComponent(m_xIntercepted, uno::UNO_QUERY); - if (xInterceptedComponent.is()) - xInterceptedComponent->removeEventListener(static_cast<lang::XEventListener*>(this)); - - m_xMyDispatch = NULL; - } - m_xIntercepted = NULL; -} - -//------------------------------------------------------------------------ - -ScDispatch::ScDispatch(ScTabViewShell* pViewSh) : - pViewShell( pViewSh ), - bListeningToView( false ) -{ - if (pViewShell) - StartListening(*pViewShell); -} - -ScDispatch::~ScDispatch() -{ - if (pViewShell) - EndListening(*pViewShell); - - if (bListeningToView && pViewShell) - { - uno::Reference<view::XSelectionSupplier> xSupplier(lcl_GetSelectionSupplier( pViewShell )); - if ( xSupplier.is() ) - xSupplier->removeSelectionChangeListener(this); - } -} - -void ScDispatch::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pViewShell = NULL; -} - -// XDispatch - -void SAL_CALL ScDispatch::dispatch( const util::URL& aURL, - const uno::Sequence<beans::PropertyValue>& aArgs ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Bool bDone = false; - if ( pViewShell && !aURL.Complete.compareToAscii(cURLInsertColumns) ) - { - ScViewData* pViewData = pViewShell->GetViewData(); - ScAddress aPos( pViewData->GetCurX(), pViewData->GetCurY(), pViewData->GetTabNo() ); - - ScDBDocFunc aFunc( *pViewData->GetDocShell() ); - bDone = aFunc.DoImportUno( aPos, aArgs ); - } - // cURLDocDataSource is never dispatched - - if (!bDone) - throw uno::RuntimeException(); -} - -void lcl_FillDataSource( frame::FeatureStateEvent& rEvent, const ScImportParam& rParam ) -{ - rEvent.IsEnabled = rParam.bImport; - - ::svx::ODataAccessDescriptor aDescriptor; - if ( rParam.bImport ) - { - sal_Int32 nType = rParam.bSql ? sdb::CommandType::COMMAND : - ( (rParam.nType == ScDbQuery) ? sdb::CommandType::QUERY : - sdb::CommandType::TABLE ); - - aDescriptor.setDataSource(rParam.aDBName); - aDescriptor[svx::daCommand] <<= rParam.aStatement; - aDescriptor[svx::daCommandType] <<= nType; - } - else - { - // descriptor has to be complete anyway - - rtl::OUString aEmpty; - aDescriptor[svx::daDataSource] <<= aEmpty; - aDescriptor[svx::daCommand] <<= aEmpty; - aDescriptor[svx::daCommandType] <<= (sal_Int32)sdb::CommandType::TABLE; - } - rEvent.State <<= aDescriptor.createPropertyValueSequence(); -} - -void SAL_CALL ScDispatch::addStatusListener( - const uno::Reference<frame::XStatusListener>& xListener, - const util::URL& aURL ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if (!pViewShell) - throw uno::RuntimeException(); - - // initial state - frame::FeatureStateEvent aEvent; - aEvent.IsEnabled = sal_True; - aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); - aEvent.FeatureURL = aURL; - - if ( !aURL.Complete.compareToAscii(cURLDocDataSource) ) - { - uno::Reference<frame::XStatusListener>* pObj = - new uno::Reference<frame::XStatusListener>( xListener ); - aDataSourceListeners.Insert( pObj, aDataSourceListeners.Count() ); - - if (!bListeningToView) - { - uno::Reference<view::XSelectionSupplier> xSupplier(lcl_GetSelectionSupplier( pViewShell )); - if ( xSupplier.is() ) - xSupplier->addSelectionChangeListener(this); - bListeningToView = sal_True; - } - - ScDBData* pDBData = pViewShell->GetDBData(false,SC_DB_OLD); - if ( pDBData ) - pDBData->GetImportParam( aLastImport ); - lcl_FillDataSource( aEvent, aLastImport ); // modifies State, IsEnabled - } - //! else add to listener for "enabled" changes? - - xListener->statusChanged( aEvent ); -} - -void SAL_CALL ScDispatch::removeStatusListener( - const uno::Reference<frame::XStatusListener>& xListener, - const util::URL& aURL ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( !aURL.Complete.compareToAscii(cURLDocDataSource) ) - { - sal_uInt16 nCount = aDataSourceListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<frame::XStatusListener> *pObj = aDataSourceListeners[n]; - if ( *pObj == xListener ) - { - aDataSourceListeners.DeleteAndDestroy( n ); - break; - } - } - - if ( aDataSourceListeners.Count() == 0 && pViewShell ) - { - uno::Reference<view::XSelectionSupplier> xSupplier(lcl_GetSelectionSupplier( pViewShell )); - if ( xSupplier.is() ) - xSupplier->removeSelectionChangeListener(this); - bListeningToView = false; - } - } -} - -// XSelectionChangeListener - -void SAL_CALL ScDispatch::selectionChanged( const ::com::sun::star::lang::EventObject& /* aEvent */ ) - throw (::com::sun::star::uno::RuntimeException) -{ - // currently only called for URL cURLDocDataSource - - if ( pViewShell ) - { - ScImportParam aNewImport; - ScDBData* pDBData = pViewShell->GetDBData(false,SC_DB_OLD); - if ( pDBData ) - pDBData->GetImportParam( aNewImport ); - - // notify listeners only if data source has changed - if ( aNewImport.bImport != aLastImport.bImport || - aNewImport.aDBName != aLastImport.aDBName || - aNewImport.aStatement != aLastImport.aStatement || - aNewImport.bSql != aLastImport.bSql || - aNewImport.nType != aLastImport.nType ) - { - frame::FeatureStateEvent aEvent; - aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); - aEvent.FeatureURL.Complete = rtl::OUString::createFromAscii( cURLDocDataSource ); - - lcl_FillDataSource( aEvent, aNewImport ); // modifies State, IsEnabled - - for ( sal_uInt16 n=0; n<aDataSourceListeners.Count(); n++ ) - (*aDataSourceListeners[n])->statusChanged( aEvent ); - - aLastImport = aNewImport; - } - } -} - -// XEventListener - -void SAL_CALL ScDispatch::disposing( const ::com::sun::star::lang::EventObject& rSource ) - throw (::com::sun::star::uno::RuntimeException) -{ - uno::Reference<view::XSelectionSupplier> xSupplier(rSource.Source, uno::UNO_QUERY); - xSupplier->removeSelectionChangeListener(this); - bListeningToView = false; - - lang::EventObject aEvent; - aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); - for ( sal_uInt16 n=0; n<aDataSourceListeners.Count(); n++ ) - (*aDataSourceListeners[n])->disposing( aEvent ); - - pViewShell = NULL; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx deleted file mode 100644 index 12802fc49..000000000 --- a/sc/source/ui/unoobj/docuno.cxx +++ /dev/null @@ -1,3734 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "scitems.hxx" -#include <svx/fmdpage.hxx> -#include <svx/fmview.hxx> -#include <svx/svditer.hxx> -#include <svx/svdpage.hxx> -#include <svx/svxids.hrc> -#include <svx/unoshape.hxx> - -#include <svl/numuno.hxx> -#include <svl/smplhint.hxx> -#include <unotools/undoopt.hxx> -#include <unotools/moduleoptions.hxx> -#include <sfx2/printer.hxx> -#include <sfx2/bindings.hxx> -#include <vcl/pdfextoutdevdata.hxx> -#include <vcl/waitobj.hxx> -#include <unotools/charclass.hxx> -#include <tools/multisel.hxx> -#include <tools/resary.hxx> -#include <toolkit/awt/vclxdevice.hxx> - -#include <ctype.h> -#include <float.h> // DBL_MAX - -#include <com/sun/star/util/Date.hpp> -#include <com/sun/star/sheet/XNamedRanges.hpp> -#include <com/sun/star/sheet/XLabelRanges.hpp> -#include <com/sun/star/sheet/XUnnamedDatabaseRanges.hpp> -#include <com/sun/star/i18n/XForbiddenCharacters.hpp> -#include <com/sun/star/script/XLibraryContainer.hpp> -#include <com/sun/star/lang/XInitialization.hpp> -#include <com/sun/star/lang/ServiceNotRegisteredException.hpp> -#include <com/sun/star/document/XDocumentEventBroadcaster.hpp> -#include <com/sun/star/script/XInvocation.hpp> -#include <com/sun/star/script/vba/XVBAEventProcessor.hpp> -#include <com/sun/star/reflection/XIdlClassProvider.hpp> -#include <comphelper/processfactory.hxx> -#include <comphelper/servicehelper.hxx> - -#include "docuno.hxx" -#include "cellsuno.hxx" -#include "nameuno.hxx" -#include "datauno.hxx" -#include "miscuno.hxx" -#include "notesuno.hxx" -#include "styleuno.hxx" -#include "linkuno.hxx" -#include "servuno.hxx" -#include "targuno.hxx" -#include "convuno.hxx" -#include "optuno.hxx" -#include "forbiuno.hxx" -#include "docsh.hxx" -#include "hints.hxx" -#include "docfunc.hxx" -#include "dociter.hxx" -#include "cell.hxx" -#include "drwlayer.hxx" -#include "rangeutl.hxx" -#include "markdata.hxx" -#include "docoptio.hxx" -#include "unonames.hxx" -#include "shapeuno.hxx" -#include "viewuno.hxx" -#include "tabvwsh.hxx" -#include "printfun.hxx" -#include "pfuncache.hxx" -#include "scmod.hxx" -#include "rangeutl.hxx" -#include "ViewSettingsSequenceDefines.hxx" -#include "sheetevents.hxx" -#include "sc.hrc" -#include "scresid.hxx" - -using namespace com::sun::star; -#define SC_UNO_VBADOCOBJ "ThisVBADocObj" // perhaps we want to actually make this ThisWorkbook ? - -//------------------------------------------------------------------------ - -// alles ohne Which-ID, Map nur fuer PropertySetInfo - -//! umbenennen, sind nicht mehr nur Options -const SfxItemPropertyMapEntry* lcl_GetDocOptPropertyMap() -{ - static SfxItemPropertyMapEntry aDocOptPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_APPLYFMDES), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_AREALINKS), 0, &getCppuType((uno::Reference<sheet::XAreaLinks>*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_AUTOCONTFOC), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_BASICLIBRARIES), 0, &getCppuType((uno::Reference< script::XLibraryContainer >*)0), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN(SC_UNO_DIALOGLIBRARIES), 0, &getCppuType((uno::Reference< script::XLibraryContainer >*)0), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN(SC_UNO_VBADOCOBJ), 0, &getCppuType((beans::PropertyValue*)0), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN(SC_UNO_CALCASSHOWN), PROP_UNO_CALCASSHOWN, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_CLOCAL), 0, &getCppuType((lang::Locale*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL), 0, &getCppuType((lang::Locale*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL), 0, &getCppuType((lang::Locale*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_COLLABELRNG), 0, &getCppuType((uno::Reference<sheet::XLabelRanges>*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_DDELINKS), 0, &getCppuType((uno::Reference<container::XNameAccess>*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_DEFTABSTOP), PROP_UNO_DEFTABSTOP, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_EXTERNALDOCLINKS), 0, &getCppuType((uno::Reference<sheet::XExternalDocLinks>*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_FORBIDDEN), 0, &getCppuType((uno::Reference<i18n::XForbiddenCharacters>*)0), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN(SC_UNO_HASDRAWPAGES), 0, &getBooleanCppuType(), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN(SC_UNO_IGNORECASE), PROP_UNO_IGNORECASE, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ITERENABLED), PROP_UNO_ITERENABLED, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ITERCOUNT), PROP_UNO_ITERCOUNT, &getCppuType((sal_Int32*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ITEREPSILON), PROP_UNO_ITEREPSILON, &getCppuType((double*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_LOOKUPLABELS), PROP_UNO_LOOKUPLABELS, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_MATCHWHOLE), PROP_UNO_MATCHWHOLE, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_NAMEDRANGES), 0, &getCppuType((uno::Reference<sheet::XNamedRanges>*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_DATABASERNG), 0, &getCppuType((uno::Reference<sheet::XDatabaseRanges>*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_NULLDATE), PROP_UNO_NULLDATE, &getCppuType((util::Date*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ROWLABELRNG), 0, &getCppuType((uno::Reference<sheet::XLabelRanges>*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHEETLINKS), 0, &getCppuType((uno::Reference<container::XNameAccess>*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SPELLONLINE), PROP_UNO_SPELLONLINE, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_STANDARDDEC), PROP_UNO_STANDARDDEC, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_REGEXENABLED), PROP_UNO_REGEXENABLED, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_RUNTIMEUID), 0, &getCppuType(static_cast< const rtl::OUString * >(0)), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN(SC_UNO_HASVALIDSIGNATURES),0, &getBooleanCppuType(), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN(SC_UNO_ISLOADED), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ISUNDOENABLED), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ISADJUSTHEIGHTENABLED), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ISEXECUTELINKENABLED), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ISCHANGEREADONLYENABLED), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_REFERENCEDEVICE), 0, &getCppuType((uno::Reference<awt::XDevice>*)0), beans::PropertyAttribute::READONLY, 0}, - {MAP_CHAR_LEN("BuildId"), 0, &::getCppuType(static_cast< const rtl::OUString * >(0)), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_CODENAME), 0, &getCppuType(static_cast< const rtl::OUString * >(0)), 0, 0}, - - {0,0,0,0,0,0} - }; - return aDocOptPropertyMap_Impl; -} - -//! StandardDecimals als Property und vom NumberFormatter ???????? - -const SfxItemPropertyMapEntry* lcl_GetColumnsPropertyMap() -{ - static SfxItemPropertyMapEntry aColumnsPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_MANPAGE), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NEWPAGE), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVIS), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_OWIDTH), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLWID), 0, &getCppuType((sal_Int32*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - return aColumnsPropertyMap_Impl; -} - -const SfxItemPropertyMapEntry* lcl_GetRowsPropertyMap() -{ - static SfxItemPropertyMapEntry aRowsPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_CELLHGT), 0, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLFILT), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_OHEIGHT), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_MANPAGE), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_NEWPAGE), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVIS), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND, &::getCppuType((const sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND, &::getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - // not sorted, not used with SfxItemPropertyMapEntry::GetByName - {0,0,0,0,0,0} - }; - return aRowsPropertyMap_Impl; -} - -//! move these functions to a header file -inline long TwipsToHMM(long nTwips) { return (nTwips * 127 + 36) / 72; } -inline long HMMToTwips(long nHMM) { return (nHMM * 72 + 63) / 127; } - -//------------------------------------------------------------------------ - -#define SCMODELOBJ_SERVICE "com.sun.star.sheet.SpreadsheetDocument" -#define SCDOCSETTINGS_SERVICE "com.sun.star.sheet.SpreadsheetDocumentSettings" -#define SCDOC_SERVICE "com.sun.star.document.OfficeDocument" - -SC_SIMPLE_SERVICE_INFO( ScAnnotationsObj, "ScAnnotationsObj", "com.sun.star.sheet.CellAnnotations" ) -SC_SIMPLE_SERVICE_INFO( ScDrawPagesObj, "ScDrawPagesObj", "com.sun.star.drawing.DrawPages" ) -SC_SIMPLE_SERVICE_INFO( ScScenariosObj, "ScScenariosObj", "com.sun.star.sheet.Scenarios" ) -SC_SIMPLE_SERVICE_INFO( ScSpreadsheetSettingsObj, "ScSpreadsheetSettingsObj", "com.sun.star.sheet.SpreadsheetDocumentSettings" ) -SC_SIMPLE_SERVICE_INFO( ScTableColumnsObj, "ScTableColumnsObj", "com.sun.star.table.TableColumns" ) -SC_SIMPLE_SERVICE_INFO( ScTableRowsObj, "ScTableRowsObj", "com.sun.star.table.TableRows" ) -SC_SIMPLE_SERVICE_INFO( ScTableSheetsObj, "ScTableSheetsObj", "com.sun.star.sheet.Spreadsheets" ) - -//------------------------------------------------------------------------ - -class ScPrintUIOptions : public vcl::PrinterOptionsHelper -{ -public: - ScPrintUIOptions(); - void SetDefaults(); -}; - -ScPrintUIOptions::ScPrintUIOptions() -{ - const ScPrintOptions& rPrintOpt = SC_MOD()->GetPrintOptions(); - sal_Int32 nContent = rPrintOpt.GetAllSheets() ? 0 : 1; - sal_Bool bSuppress = rPrintOpt.GetSkipEmpty(); - - ResStringArray aStrings( ScResId( SCSTR_PRINT_OPTIONS ) ); - OSL_ENSURE( aStrings.Count() >= 10, "resource incomplete" ); - if( aStrings.Count() < 10 ) // bad resource ? - return; - - m_aUIProperties.realloc( 8 ); - - // create Section for spreadsheet (results in an extra tab page in dialog) - SvtModuleOptions aOpt; - String aAppGroupname( aStrings.GetString( 9 ) ); - aAppGroupname.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "%s" ) ), - aOpt.GetModuleName( SvtModuleOptions::E_SCALC ) ); - m_aUIProperties[0].Value = getGroupControlOpt( aAppGroupname, rtl::OUString() ); - - // create subgroup for pages - m_aUIProperties[1].Value = getSubgroupControlOpt( rtl::OUString( aStrings.GetString( 0 ) ), rtl::OUString() ); - - // create a bool option for empty pages - m_aUIProperties[2].Value = getBoolControlOpt( rtl::OUString( aStrings.GetString( 1 ) ), - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:IsIncludeEmptyPages:CheckBox" ) ), - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "IsIncludeEmptyPages" ) ), - ! bSuppress - ); - // create Subgroup for print content - vcl::PrinterOptionsHelper::UIControlOptions aPrintRangeOpt; - aPrintRangeOpt.maGroupHint = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintRange" ) ); - m_aUIProperties[3].Value = getSubgroupControlOpt( rtl::OUString( aStrings.GetString( 2 ) ), - rtl::OUString(), - aPrintRangeOpt - ); - - // create a choice for the content to create - uno::Sequence< rtl::OUString > aChoices( 3 ), aHelpIds( 3 ); - aChoices[0] = aStrings.GetString( 3 ); - aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:0" ) ); - aChoices[1] = aStrings.GetString( 4 ); - aHelpIds[1] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:1" ) ); - aChoices[2] = aStrings.GetString( 5 ); - aHelpIds[2] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintContent:RadioButton:2" ) ); - m_aUIProperties[4].Value = getChoiceControlOpt( rtl::OUString(), - aHelpIds, - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintContent" ) ), - aChoices, - nContent ); - - // create Subgroup for print range - aPrintRangeOpt.mbInternalOnly = sal_True; - m_aUIProperties[5].Value = getSubgroupControlOpt( rtl::OUString( aStrings.GetString( 6 ) ), - rtl::OUString(), - aPrintRangeOpt - ); - - // create a choice for the range to print - rtl::OUString aPrintRangeName( RTL_CONSTASCII_USTRINGPARAM( "PrintRange" ) ); - aChoices.realloc( 2 ); - aHelpIds.realloc( 2 ); - aChoices[0] = aStrings.GetString( 7 ); - aHelpIds[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintRange:RadioButton:0" ) ); - aChoices[1] = aStrings.GetString( 8 ); - aHelpIds[1] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PrintRange:RadioButton:1" ) ); - m_aUIProperties[6].Value = getChoiceControlOpt( rtl::OUString(), - aHelpIds, - aPrintRangeName, - aChoices, - 0 ); - - // create a an Edit dependent on "Pages" selected - vcl::PrinterOptionsHelper::UIControlOptions aPageRangeOpt( aPrintRangeName, 1, sal_True ); - m_aUIProperties[7].Value = getEditControlOpt( rtl::OUString(), - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:PageRange:Edit" ) ), - rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PageRange" ) ), - rtl::OUString(), - aPageRangeOpt - ); -} - -void ScPrintUIOptions::SetDefaults() -{ - // re-initialize the default values from print options - - const ScPrintOptions& rPrintOpt = SC_MOD()->GetPrintOptions(); - sal_Int32 nContent = rPrintOpt.GetAllSheets() ? 0 : 1; - sal_Bool bSuppress = rPrintOpt.GetSkipEmpty(); - - for (sal_Int32 nUIPos=0; nUIPos<m_aUIProperties.getLength(); ++nUIPos) - { - uno::Sequence<beans::PropertyValue> aUIProp; - if ( m_aUIProperties[nUIPos].Value >>= aUIProp ) - { - for (sal_Int32 nPropPos=0; nPropPos<aUIProp.getLength(); ++nPropPos) - { - rtl::OUString aName = aUIProp[nPropPos].Name; - if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Property" ) ) ) - { - beans::PropertyValue aPropertyValue; - if ( aUIProp[nPropPos].Value >>= aPropertyValue ) - { - if ( aPropertyValue.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintContent" ) ) ) - { - aPropertyValue.Value <<= nContent; - aUIProp[nPropPos].Value <<= aPropertyValue; - } - else if ( aPropertyValue.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsIncludeEmptyPages") ) ) - { - ScUnoHelpFunctions::SetBoolInAny( aPropertyValue.Value, ! bSuppress ); - aUIProp[nPropPos].Value <<= aPropertyValue; - } - } - } - } - m_aUIProperties[nUIPos].Value <<= aUIProp; - } - } -} - -void ScModelObj::CreateAndSet(ScDocShell* pDocSh) -{ - if (pDocSh) - pDocSh->SetBaseModel( new ScModelObj(pDocSh) ); -} - -ScModelObj::ScModelObj( ScDocShell* pDocSh ) : - SfxBaseModel( pDocSh ), - aPropSet( lcl_GetDocOptPropertyMap() ), - pDocShell( pDocSh ), - pPrintFuncCache( NULL ), - pPrinterOptions( NULL ), - maChangesListeners( m_aMutex ) -{ - // pDocShell may be NULL if this is the base of a ScDocOptionsObj - if ( pDocShell ) - { - pDocShell->GetDocument()->AddUnoObject(*this); // SfxModel is derived from SfxListener - } -} - -ScModelObj::~ScModelObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); - - if (xNumberAgg.is()) - xNumberAgg->setDelegator(uno::Reference<uno::XInterface>()); - - delete pPrintFuncCache; - delete pPrinterOptions; -} - -uno::Reference< uno::XAggregation> ScModelObj::GetFormatter() -{ - // pDocShell may be NULL if this is the base of a ScDocOptionsObj - if ( !xNumberAgg.is() && pDocShell ) - { - // setDelegator veraendert den RefCount, darum eine Referenz selber halten - // (direkt am m_refCount, um sich beim release nicht selbst zu loeschen) - comphelper::increment( m_refCount ); - // waehrend des queryInterface braucht man ein Ref auf das - // SvNumberFormatsSupplierObj, sonst wird es geloescht. - uno::Reference<util::XNumberFormatsSupplier> xFormatter(new SvNumberFormatsSupplierObj(pDocShell->GetDocument()->GetFormatTable() )); - { - xNumberAgg.set(uno::Reference<uno::XAggregation>( xFormatter, uno::UNO_QUERY )); - // extra block to force deletion of the temporary before setDelegator - } - - // beim setDelegator darf die zusaetzliche Ref nicht mehr existieren - xFormatter = NULL; - - if (xNumberAgg.is()) - xNumberAgg->setDelegator( (cppu::OWeakObject*)this ); - comphelper::decrement( m_refCount ); - } // if ( !xNumberAgg.is() ) - return xNumberAgg; -} - -ScDocument* ScModelObj::GetDocument() const -{ - if (pDocShell) - return pDocShell->GetDocument(); - return NULL; -} - -SfxObjectShell* ScModelObj::GetEmbeddedObject() const -{ - return pDocShell; -} - -void ScModelObj::UpdateAllRowHeights(const ScMarkData* pTabMark) -{ - if (pDocShell) - pDocShell->UpdateAllRowHeights(pTabMark); -} - -void ScModelObj::BeforeXMLLoading() -{ - if (pDocShell) - pDocShell->BeforeXMLLoading(); -} - -void ScModelObj::AfterXMLLoading(sal_Bool bRet) -{ - if (pDocShell) - pDocShell->AfterXMLLoading(bRet); -} - -ScSheetSaveData* ScModelObj::GetSheetSaveData() -{ - if (pDocShell) - return pDocShell->GetSheetSaveData(); - return NULL; -} - -void ScModelObj::RepaintRange( const ScRange& rRange ) -{ - if (pDocShell) - pDocShell->PostPaint( rRange, PAINT_GRID ); -} - -uno::Any SAL_CALL ScModelObj::queryInterface( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( sheet::XSpreadsheetDocument ) - SC_QUERYINTERFACE( document::XActionLockable ) - SC_QUERYINTERFACE( sheet::XCalculatable ) - SC_QUERYINTERFACE( util::XProtectable ) - SC_QUERYINTERFACE( drawing::XDrawPagesSupplier ) - SC_QUERYINTERFACE( sheet::XGoalSeek ) - SC_QUERYINTERFACE( sheet::XConsolidatable ) - SC_QUERYINTERFACE( sheet::XDocumentAuditing ) - SC_QUERYINTERFACE( style::XStyleFamiliesSupplier ) - SC_QUERYINTERFACE( view::XRenderable ) - SC_QUERYINTERFACE( document::XLinkTargetSupplier ) - SC_QUERYINTERFACE( beans::XPropertySet ) - SC_QUERYINTERFACE( lang::XMultiServiceFactory ) - SC_QUERYINTERFACE( lang::XServiceInfo ) - SC_QUERYINTERFACE( util::XChangesNotifier ) - - uno::Any aRet(SfxBaseModel::queryInterface( rType )); - if ( !aRet.hasValue() - && rType != ::getCppuType((uno::Reference< com::sun::star::document::XDocumentEventBroadcaster>*)0) - && rType != ::getCppuType((uno::Reference< com::sun::star::frame::XController>*)0) - && rType != ::getCppuType((uno::Reference< com::sun::star::frame::XFrame>*)0) - && rType != ::getCppuType((uno::Reference< com::sun::star::script::XInvocation>*)0) - && rType != ::getCppuType((uno::Reference< com::sun::star::reflection::XIdlClassProvider>*)0) - && rType != ::getCppuType((uno::Reference< com::sun::star::beans::XFastPropertySet>*)0) - && rType != ::getCppuType((uno::Reference< com::sun::star::awt::XWindow>*)0)) - { - GetFormatter(); - if ( xNumberAgg.is() ) - aRet = xNumberAgg->queryAggregation( rType ); - } - - return aRet; -} - -void SAL_CALL ScModelObj::acquire() throw() -{ - SfxBaseModel::acquire(); -} - -void SAL_CALL ScModelObj::release() throw() -{ - SfxBaseModel::release(); -} - -uno::Sequence<uno::Type> SAL_CALL ScModelObj::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - uno::Sequence<uno::Type> aParentTypes(SfxBaseModel::getTypes()); - long nParentLen = aParentTypes.getLength(); - const uno::Type* pParentPtr = aParentTypes.getConstArray(); - - uno::Sequence<uno::Type> aAggTypes; - if ( GetFormatter().is() ) - { - const uno::Type& rProvType = ::getCppuType((uno::Reference<lang::XTypeProvider>*) 0); - uno::Any aNumProv(xNumberAgg->queryAggregation(rProvType)); - if(aNumProv.getValueType() == rProvType) - { - uno::Reference<lang::XTypeProvider> xNumProv( - *(uno::Reference<lang::XTypeProvider>*)aNumProv.getValue()); - aAggTypes = xNumProv->getTypes(); - } - } - long nAggLen = aAggTypes.getLength(); - const uno::Type* pAggPtr = aAggTypes.getConstArray(); - - const long nThisLen = 15; - aTypes.realloc( nParentLen + nAggLen + nThisLen ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSpreadsheetDocument>*)0); - pPtr[nParentLen + 1] = getCppuType((const uno::Reference<document::XActionLockable>*)0); - pPtr[nParentLen + 2] = getCppuType((const uno::Reference<sheet::XCalculatable>*)0); - pPtr[nParentLen + 3] = getCppuType((const uno::Reference<util::XProtectable>*)0); - pPtr[nParentLen + 4] = getCppuType((const uno::Reference<drawing::XDrawPagesSupplier>*)0); - pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XGoalSeek>*)0); - pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XConsolidatable>*)0); - pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XDocumentAuditing>*)0); - pPtr[nParentLen + 8] = getCppuType((const uno::Reference<style::XStyleFamiliesSupplier>*)0); - pPtr[nParentLen + 9] = getCppuType((const uno::Reference<view::XRenderable>*)0); - pPtr[nParentLen +10] = getCppuType((const uno::Reference<document::XLinkTargetSupplier>*)0); - pPtr[nParentLen +11] = getCppuType((const uno::Reference<beans::XPropertySet>*)0); - pPtr[nParentLen +12] = getCppuType((const uno::Reference<lang::XMultiServiceFactory>*)0); - pPtr[nParentLen +13] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0); - pPtr[nParentLen +14] = getCppuType((const uno::Reference<util::XChangesNotifier>*)0); - - long i; - for (i=0; i<nParentLen; i++) - pPtr[i] = pParentPtr[i]; // parent types first - - for (i=0; i<nAggLen; i++) - pPtr[nParentLen+nThisLen+i] = pAggPtr[i]; // aggregated types last - } - return aTypes; -} - -namespace -{ - class theScModelObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScModelObjImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScModelObj::getImplementationId() - throw(uno::RuntimeException) -{ - return theScModelObjImplementationId::get().getSeq(); -} - -void ScModelObj::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) -{ - // Not interested in reference update hints here - - if ( rHint.ISA( SfxSimpleHint ) ) - { - sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); - if ( nId == SFX_HINT_DYING ) - { - pDocShell = NULL; // has become invalid - if (xNumberAgg.is()) - { - SvNumberFormatsSupplierObj* pNumFmt = - SvNumberFormatsSupplierObj::getImplementation( - uno::Reference<util::XNumberFormatsSupplier>(xNumberAgg, uno::UNO_QUERY) ); - if ( pNumFmt ) - pNumFmt->SetNumberFormatter( NULL ); - } - - DELETEZ( pPrintFuncCache ); // must be deleted because it has a pointer to the DocShell - } - else if ( nId == SFX_HINT_DATACHANGED ) - { - // cached data for rendering become invalid when contents change - // (if a broadcast is added to SetDrawModified, is has to be tested here, too) - - DELETEZ( pPrintFuncCache ); - - // handle "OnCalculate" sheet events (search also for VBA event handlers) - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if ( pDoc->GetVbaEventProcessor().is() ) - { - // If the VBA event processor is set, HasAnyCalcNotification is much faster than HasAnySheetEventScript - if ( pDoc->HasAnyCalcNotification() && pDoc->HasAnySheetEventScript( SC_SHEETEVENT_CALCULATE, true ) ) - HandleCalculateEvents(); - } - else - { - if ( pDoc->HasAnySheetEventScript( SC_SHEETEVENT_CALCULATE ) ) - HandleCalculateEvents(); - } - } - } - } - else if ( rHint.ISA( ScPointerChangedHint ) ) - { - sal_uInt16 nFlags = ((const ScPointerChangedHint&)rHint).GetFlags(); - if (nFlags & SC_POINTERCHANGED_NUMFMT) - { - // NumberFormatter-Pointer am Uno-Objekt neu setzen - - if (GetFormatter().is()) - { - SvNumberFormatsSupplierObj* pNumFmt = - SvNumberFormatsSupplierObj::getImplementation( - uno::Reference<util::XNumberFormatsSupplier>(xNumberAgg, uno::UNO_QUERY) ); - if ( pNumFmt && pDocShell ) - pNumFmt->SetNumberFormatter( pDocShell->GetDocument()->GetFormatTable() ); - } - } - } - - // always call parent - SfxBaseModel might need to handle the same hints again - SfxBaseModel::Notify( rBC, rHint ); // SfxBaseModel is derived from SfxListener -} - -// XSpreadsheetDocument - -uno::Reference<sheet::XSpreadsheets> SAL_CALL ScModelObj::getSheets() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return new ScTableSheetsObj(pDocShell); - return NULL; -} - -// XStyleFamiliesSupplier - -uno::Reference<container::XNameAccess> SAL_CALL ScModelObj::getStyleFamilies() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return new ScStyleFamiliesObj(pDocShell); - return NULL; -} - -// XRenderable - -OutputDevice* lcl_GetRenderDevice( const uno::Sequence<beans::PropertyValue>& rOptions ) -{ - OutputDevice* pRet = NULL; - const beans::PropertyValue* pPropArray = rOptions.getConstArray(); - long nPropCount = rOptions.getLength(); - for (long i = 0; i < nPropCount; i++) - { - const beans::PropertyValue& rProp = pPropArray[i]; - String aPropName(rProp.Name); - - if (aPropName.EqualsAscii( SC_UNONAME_RENDERDEV )) - { - uno::Reference<awt::XDevice> xRenderDevice(rProp.Value, uno::UNO_QUERY); - if ( xRenderDevice.is() ) - { - VCLXDevice* pDevice = VCLXDevice::GetImplementation( xRenderDevice ); - if ( pDevice ) - { - pRet = pDevice->GetOutputDevice(); - pRet->SetDigitLanguage( SC_MOD()->GetOptDigitLanguage() ); - } - } - } - } - return pRet; -} - -bool lcl_ParseTarget( const String& rTarget, ScRange& rTargetRange, Rectangle& rTargetRect, - bool& rIsSheet, ScDocument* pDoc, SCTAB nSourceTab ) -{ - // test in same order as in SID_CURRENTCELL execute - - ScAddress aAddress; - ScRangeUtil aRangeUtil; - SCTAB nNameTab; - sal_Int32 nNumeric = 0; - - bool bRangeValid = false; - bool bRectValid = false; - - if ( rTargetRange.Parse( rTarget, pDoc ) & SCA_VALID ) - { - bRangeValid = true; // range reference - } - else if ( aAddress.Parse( rTarget, pDoc ) & SCA_VALID ) - { - rTargetRange = aAddress; - bRangeValid = true; // cell reference - } - else if ( aRangeUtil.MakeRangeFromName( rTarget, pDoc, nSourceTab, rTargetRange, RUTL_NAMES ) || - aRangeUtil.MakeRangeFromName( rTarget, pDoc, nSourceTab, rTargetRange, RUTL_DBASE ) ) - { - bRangeValid = true; // named range or database range - } - else if ( ByteString( rTarget, RTL_TEXTENCODING_ASCII_US ).IsNumericAscii() && - ( nNumeric = rTarget.ToInt32() ) > 0 && nNumeric <= MAXROW+1 ) - { - // row number is always mapped to cell A(row) on the same sheet - rTargetRange = ScAddress( 0, (SCROW)(nNumeric-1), nSourceTab ); // target row number is 1-based - bRangeValid = true; // row number - } - else if ( pDoc->GetTable( rTarget, nNameTab ) ) - { - rTargetRange = ScAddress(0,0,nNameTab); - bRangeValid = true; // sheet name - rIsSheet = true; // needs special handling (first page of the sheet) - } - else - { - // look for named drawing object - - ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); - if ( pDrawLayer ) - { - SCTAB nTabCount = pDoc->GetTableCount(); - for (SCTAB i=0; i<nTabCount && !bRangeValid; i++) - { - SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(i)); - OSL_ENSURE(pPage,"Page ?"); - if (pPage) - { - SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS ); - SdrObject* pObject = aIter.Next(); - while (pObject && !bRangeValid) - { - if ( ScDrawLayer::GetVisibleName( pObject ) == rTarget ) - { - rTargetRect = pObject->GetLogicRect(); // 1/100th mm - rTargetRange = pDoc->GetRange( i, rTargetRect ); // underlying cells - bRangeValid = bRectValid = true; // rectangle is valid - } - pObject = aIter.Next(); - } - } - } - } - } - if ( bRangeValid && !bRectValid ) - { - // get rectangle for cell range - rTargetRect = pDoc->GetMMRect( rTargetRange.aStart.Col(), rTargetRange.aStart.Row(), - rTargetRange.aEnd.Col(), rTargetRange.aEnd.Row(), - rTargetRange.aStart.Tab() ); - } - - return bRangeValid; -} - -sal_Bool ScModelObj::FillRenderMarkData( const uno::Any& aSelection, - const uno::Sequence< beans::PropertyValue >& rOptions, - ScMarkData& rMark, - ScPrintSelectionStatus& rStatus, String& rPagesStr ) const -{ - OSL_ENSURE( !rMark.IsMarked() && !rMark.IsMultiMarked(), "FillRenderMarkData: MarkData must be empty" ); - OSL_ENSURE( pDocShell, "FillRenderMarkData: DocShell must be set" ); - - sal_Bool bDone = false; - - uno::Reference<frame::XController> xView; - - // defaults when no options are passed: all sheets, include empty pages - sal_Bool bSelectedSheetsOnly = false; - sal_Bool bIncludeEmptyPages = sal_True; - - bool bHasPrintContent = false; - sal_Int32 nPrintContent = 0; // all sheets / selected sheets / selected cells - sal_Int32 nPrintRange = 0; // all pages / pages - rtl::OUString aPageRange; // "pages" edit value - - for( sal_Int32 i = 0, nLen = rOptions.getLength(); i < nLen; i++ ) - { - if( rOptions[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsOnlySelectedSheets" ) ) ) - { - rOptions[i].Value >>= bSelectedSheetsOnly; - } - else if( rOptions[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsIncludeEmptyPages" ) ) ) - { - rOptions[i].Value >>= bIncludeEmptyPages; - } - else if( rOptions[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PageRange" ) ) ) - { - rOptions[i].Value >>= aPageRange; - } - else if( rOptions[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintRange" ) ) ) - { - rOptions[i].Value >>= nPrintRange; - } - else if( rOptions[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintContent" ) ) ) - { - bHasPrintContent = true; - rOptions[i].Value >>= nPrintContent; - } - else if( rOptions[i].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "View" ) ) ) - { - rOptions[i].Value >>= xView; - } - } - - // "Print Content" selection wins over "Selected Sheets" option - if ( bHasPrintContent ) - bSelectedSheetsOnly = ( nPrintContent != 0 ); - - uno::Reference<uno::XInterface> xInterface(aSelection, uno::UNO_QUERY); - if ( xInterface.is() ) - { - ScCellRangesBase* pSelObj = ScCellRangesBase::getImplementation( xInterface ); - uno::Reference< drawing::XShapes > xShapes( xInterface, uno::UNO_QUERY ); - if ( pSelObj && pSelObj->GetDocShell() == pDocShell ) - { - sal_Bool bSheet = ( ScTableSheetObj::getImplementation( xInterface ) != NULL ); - sal_Bool bCursor = pSelObj->IsCursorOnly(); - const ScRangeList& rRanges = pSelObj->GetRangeList(); - - rMark.MarkFromRangeList( rRanges, false ); - rMark.MarkToSimple(); - - if ( rMark.IsMultiMarked() ) - { - // #i115266# copy behavior of old printing: - // treat multiple selection like a single selection with the enclosing range - ScRange aMultiMarkArea; - rMark.GetMultiMarkArea( aMultiMarkArea ); - rMark.ResetMark(); - rMark.SetMarkArea( aMultiMarkArea ); - } - - if ( rMark.IsMarked() && !rMark.IsMultiMarked() ) - { - // a sheet object is treated like an empty selection: print the used area of the sheet - - if ( bCursor || bSheet ) // nothing selected -> use whole tables - { - rMark.ResetMark(); // doesn't change table selection - rStatus.SetMode( SC_PRINTSEL_CURSOR ); - } - else - rStatus.SetMode( SC_PRINTSEL_RANGE ); - - rStatus.SetRanges( rRanges ); - bDone = sal_True; - } - // multi selection isn't supported - } - else if( xShapes.is() ) - { - //print a selected ole object - uno::Reference< container::XIndexAccess > xIndexAccess( xShapes, uno::UNO_QUERY ); - if( xIndexAccess.is() ) - { - // multi selection isn't supported yet - uno::Reference< drawing::XShape > xShape( xIndexAccess->getByIndex(0), uno::UNO_QUERY ); - SvxShape* pShape = SvxShape::getImplementation( xShape ); - if( pShape ) - { - SdrObject *pSdrObj = pShape->GetSdrObject(); - if( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if( pDoc && pSdrObj ) - { - Rectangle aObjRect = pSdrObj->GetCurrentBoundRect(); - SCTAB nCurrentTab = ScDocShell::GetCurTab(); - ScRange aRange = pDoc->GetRange( nCurrentTab, aObjRect ); - rMark.SetMarkArea( aRange ); - - if( rMark.IsMarked() && !rMark.IsMultiMarked() ) - { - rStatus.SetMode( SC_PRINTSEL_RANGE_EXCLUSIVELY_OLE_AND_DRAW_OBJECTS ); - bDone = sal_True; - } - } - } - } - } - } - else if ( ScModelObj::getImplementation( xInterface ) == this ) - { - // render the whole document - // -> no selection, all sheets - - SCTAB nTabCount = pDocShell->GetDocument()->GetTableCount(); - for (SCTAB nTab = 0; nTab < nTabCount; nTab++) - rMark.SelectTable( nTab, sal_True ); - rStatus.SetMode( SC_PRINTSEL_DOCUMENT ); - bDone = sal_True; - } - // other selection types aren't supported - } - - // restrict to selected sheets if a view is available - if ( bSelectedSheetsOnly && xView.is() ) - { - ScTabViewObj* pViewObj = ScTabViewObj::getImplementation( xView ); - if (pViewObj) - { - ScTabViewShell* pViewSh = pViewObj->GetViewShell(); - if (pViewSh) - { - const ScMarkData& rViewMark = pViewSh->GetViewData()->GetMarkData(); - SCTAB nTabCount = pDocShell->GetDocument()->GetTableCount(); - for (SCTAB nTab = 0; nTab < nTabCount; nTab++) - if (!rViewMark.GetTableSelect(nTab)) - rMark.SelectTable( nTab, false ); - } - } - } - - ScPrintOptions aNewOptions; - aNewOptions.SetSkipEmpty( !bIncludeEmptyPages ); - aNewOptions.SetAllSheets( !bSelectedSheetsOnly ); - rStatus.SetOptions( aNewOptions ); - - // "PrintRange" enables (1) or disables (0) the "PageRange" edit - if ( nPrintRange == 1 ) - rPagesStr = aPageRange; - else - rPagesStr.Erase(); - - return bDone; -} - - -sal_Int32 SAL_CALL ScModelObj::getRendererCount( const uno::Any& aSelection, - const uno::Sequence<beans::PropertyValue>& rOptions ) - throw (lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pDocShell) - throw uno::RuntimeException(); - - ScMarkData aMark; - ScPrintSelectionStatus aStatus; - String aPagesStr; - if ( !FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr ) ) - return 0; - - // The same ScPrintFuncCache object in pPrintFuncCache is used as long as - // the same selection is used (aStatus) and the document isn't changed - // (pPrintFuncCache is cleared in Notify handler) - - if ( !pPrintFuncCache || !pPrintFuncCache->IsSameSelection( aStatus ) ) - { - delete pPrintFuncCache; - pPrintFuncCache = new ScPrintFuncCache( pDocShell, aMark, aStatus ); - } - sal_Int32 nPages = pPrintFuncCache->GetPageCount(); - - sal_Int32 nSelectCount = nPages; - if ( aPagesStr.Len() ) - { - MultiSelection aPageRanges( aPagesStr ); - aPageRanges.SetTotalRange( Range( 1, nPages ) ); - nSelectCount = aPageRanges.GetSelectCount(); - } - return nSelectCount; -} - -sal_Int32 lcl_GetRendererNum( sal_Int32 nSelRenderer, const String& rPagesStr, sal_Int32 nTotalPages ) -{ - if ( !rPagesStr.Len() ) - return nSelRenderer; - - MultiSelection aPageRanges( rPagesStr ); - aPageRanges.SetTotalRange( Range( 1, nTotalPages ) ); - - sal_Int32 nSelected = aPageRanges.FirstSelected(); - while ( nSelRenderer > 0 ) - { - nSelected = aPageRanges.NextSelected(); - --nSelRenderer; - } - return nSelected - 1; // selection is 1-based -} - -uno::Sequence<beans::PropertyValue> SAL_CALL ScModelObj::getRenderer( sal_Int32 nSelRenderer, - const uno::Any& aSelection, const uno::Sequence<beans::PropertyValue>& rOptions ) - throw (lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pDocShell) - throw uno::RuntimeException(); - - ScMarkData aMark; - ScPrintSelectionStatus aStatus; - String aPagesStr; - // #i115266# if FillRenderMarkData fails, keep nTotalPages at 0, but still handle getRenderer(0) below - long nTotalPages = 0; - if ( FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr ) ) - { - if ( !pPrintFuncCache || !pPrintFuncCache->IsSameSelection( aStatus ) ) - { - delete pPrintFuncCache; - pPrintFuncCache = new ScPrintFuncCache( pDocShell, aMark, aStatus ); - } - nTotalPages = pPrintFuncCache->GetPageCount(); - } - sal_Int32 nRenderer = lcl_GetRendererNum( nSelRenderer, aPagesStr, nTotalPages ); - if ( nRenderer >= nTotalPages ) - { - if ( nSelRenderer == 0 ) - { - // getRenderer(0) is used to query the settings, so it must always return something - - SCTAB nCurTab = 0; //! use current sheet from view? - ScPrintFunc aDefaultFunc( pDocShell, pDocShell->GetPrinter(), nCurTab ); - Size aTwips = aDefaultFunc.GetPageSize(); - awt::Size aPageSize( TwipsToHMM( aTwips.Width() ), TwipsToHMM( aTwips.Height() ) ); - - uno::Sequence<beans::PropertyValue> aSequence(1); - beans::PropertyValue* pArray = aSequence.getArray(); - pArray[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_PAGESIZE )); - pArray[0].Value <<= aPageSize; - - if( ! pPrinterOptions ) - pPrinterOptions = new ScPrintUIOptions; - else - pPrinterOptions->SetDefaults(); - pPrinterOptions->appendPrintUIOptions( aSequence ); - return aSequence; - } - else - throw lang::IllegalArgumentException(); - } - - // printer is used as device (just for page layout), draw view is not needed - - SCTAB nTab = pPrintFuncCache->GetTabForPage( nRenderer ); - - ScRange aRange; - const ScRange* pSelRange = NULL; - if ( aMark.IsMarked() ) - { - aMark.GetMarkArea( aRange ); - pSelRange = &aRange; - } - ScPrintFunc aFunc( pDocShell, pDocShell->GetPrinter(), nTab, - pPrintFuncCache->GetFirstAttr(nTab), nTotalPages, pSelRange, &aStatus.GetOptions() ); - aFunc.SetRenderFlag( sal_True ); - - Range aPageRange( nRenderer+1, nRenderer+1 ); - MultiSelection aPage( aPageRange ); - aPage.SetTotalRange( Range(0,RANGE_MAX) ); - aPage.Select( aPageRange ); - - long nDisplayStart = pPrintFuncCache->GetDisplayStart( nTab ); - long nTabStart = pPrintFuncCache->GetTabStart( nTab ); - - (void)aFunc.DoPrint( aPage, nTabStart, nDisplayStart, false, NULL, NULL ); - - ScRange aCellRange; - sal_Bool bWasCellRange = aFunc.GetLastSourceRange( aCellRange ); - Size aTwips = aFunc.GetPageSize(); - awt::Size aPageSize( TwipsToHMM( aTwips.Width() ), TwipsToHMM( aTwips.Height() ) ); - - long nPropCount = bWasCellRange ? 3 : 2; - uno::Sequence<beans::PropertyValue> aSequence(nPropCount); - beans::PropertyValue* pArray = aSequence.getArray(); - pArray[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_PAGESIZE )); - pArray[0].Value <<= aPageSize; - // #i111158# all positions are relative to the whole page, including non-printable area - pArray[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_INC_NP_AREA )); - pArray[1].Value = uno::makeAny( sal_True ); - if ( bWasCellRange ) - { - table::CellRangeAddress aRangeAddress( nTab, - aCellRange.aStart.Col(), aCellRange.aStart.Row(), - aCellRange.aEnd.Col(), aCellRange.aEnd.Row() ); - pArray[2].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_SOURCERANGE )); - pArray[2].Value <<= aRangeAddress; - } - - // FIXME: is this for side effects ? - SC_MOD()->GetPrintOptions(); - if( ! pPrinterOptions ) - pPrinterOptions = new ScPrintUIOptions; - else - pPrinterOptions->SetDefaults(); - pPrinterOptions->appendPrintUIOptions( aSequence ); - return aSequence; -} - -void SAL_CALL ScModelObj::render( sal_Int32 nSelRenderer, const uno::Any& aSelection, - const uno::Sequence<beans::PropertyValue>& rOptions ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pDocShell) - throw uno::RuntimeException(); - - ScMarkData aMark; - ScPrintSelectionStatus aStatus; - String aPagesStr; - if ( !FillRenderMarkData( aSelection, rOptions, aMark, aStatus, aPagesStr ) ) - throw lang::IllegalArgumentException(); - - if ( !pPrintFuncCache || !pPrintFuncCache->IsSameSelection( aStatus ) ) - { - delete pPrintFuncCache; - pPrintFuncCache = new ScPrintFuncCache( pDocShell, aMark, aStatus ); - } - long nTotalPages = pPrintFuncCache->GetPageCount(); - sal_Int32 nRenderer = lcl_GetRendererNum( nSelRenderer, aPagesStr, nTotalPages ); - if ( nRenderer >= nTotalPages ) - throw lang::IllegalArgumentException(); - - OutputDevice* pDev = lcl_GetRenderDevice( rOptions ); - if ( !pDev ) - throw lang::IllegalArgumentException(); - - SCTAB nTab = pPrintFuncCache->GetTabForPage( nRenderer ); - ScDocument* pDoc = pDocShell->GetDocument(); - - FmFormView* pDrawView = NULL; - Rectangle aFull( 0, 0, LONG_MAX, LONG_MAX ); - - // #114135# - ScDrawLayer* pModel = pDoc->GetDrawLayer(); - - if( pModel ) - { - pDrawView = new FmFormView( pModel, pDev ); - pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab)); - pDrawView->SetPrintPreview( sal_True ); - } - - ScRange aRange; - const ScRange* pSelRange = NULL; - if ( aMark.IsMarked() ) - { - aMark.GetMarkArea( aRange ); - pSelRange = &aRange; - } - - // to increase performance, ScPrintState might be used here for subsequent - // pages of the same sheet - - ScPrintFunc aFunc( pDev, pDocShell, nTab, pPrintFuncCache->GetFirstAttr(nTab), nTotalPages, pSelRange, &aStatus.GetOptions() ); - aFunc.SetDrawView( pDrawView ); - aFunc.SetRenderFlag( sal_True ); - if( aStatus.GetMode() == SC_PRINTSEL_RANGE_EXCLUSIVELY_OLE_AND_DRAW_OBJECTS ) - aFunc.SetExclusivelyDrawOleAndDrawObjects(); - - Range aPageRange( nRenderer+1, nRenderer+1 ); - MultiSelection aPage( aPageRange ); - aPage.SetTotalRange( Range(0,RANGE_MAX) ); - aPage.Select( aPageRange ); - - long nDisplayStart = pPrintFuncCache->GetDisplayStart( nTab ); - long nTabStart = pPrintFuncCache->GetTabStart( nTab ); - - vcl::PDFExtOutDevData* pPDFData = PTR_CAST( vcl::PDFExtOutDevData, pDev->GetExtOutDevData() ); - if ( nRenderer == nTabStart ) - { - // first page of a sheet: add outline item for the sheet name - - if ( pPDFData && pPDFData->GetIsExportBookmarks() ) - { - // the sheet starts at the top of the page - Rectangle aArea( pDev->PixelToLogic( Rectangle( 0,0,0,0 ) ) ); - sal_Int32 nDestID = pPDFData->CreateDest( aArea ); - String aTabName; - pDoc->GetName( nTab, aTabName ); - sal_Int32 nParent = -1; // top-level - pPDFData->CreateOutlineItem( nParent, aTabName, nDestID ); - } - // #i56629# add the named destination stuff - if( pPDFData && pPDFData->GetIsExportNamedDestinations() ) - { - Rectangle aArea( pDev->PixelToLogic( Rectangle( 0,0,0,0 ) ) ); - String aTabName; - pDoc->GetName( nTab, aTabName ); - //need the PDF page number here - pPDFData->CreateNamedDest( aTabName, aArea ); - } - } - - (void)aFunc.DoPrint( aPage, nTabStart, nDisplayStart, sal_True, NULL, NULL ); - - // resolve the hyperlinks for PDF export - - if ( pPDFData ) - { - // iterate over the hyperlinks that were output for this page - - std::vector< vcl::PDFExtOutDevBookmarkEntry >& rBookmarks = pPDFData->GetBookmarks(); - std::vector< vcl::PDFExtOutDevBookmarkEntry >::iterator aIter = rBookmarks.begin(); - std::vector< vcl::PDFExtOutDevBookmarkEntry >::iterator aIEnd = rBookmarks.end(); - while ( aIter != aIEnd ) - { - rtl::OUString aBookmark = aIter->aBookmark; - if ( aBookmark.toChar() == (sal_Unicode) '#' ) - { - // try to resolve internal link - - String aTarget( aBookmark.copy( 1 ) ); - - ScRange aTargetRange; - Rectangle aTargetRect; // 1/100th mm - bool bIsSheet = false; - bool bValid = lcl_ParseTarget( aTarget, aTargetRange, aTargetRect, bIsSheet, pDoc, nTab ); - - if ( bValid ) - { - sal_Int32 nPage = -1; - Rectangle aArea; - if ( bIsSheet ) - { - // Get first page for sheet (if nothing from that sheet is printed, - // this page can show a different sheet) - nPage = pPrintFuncCache->GetTabStart( aTargetRange.aStart.Tab() ); - aArea = pDev->PixelToLogic( Rectangle( 0,0,0,0 ) ); - } - else - { - pPrintFuncCache->InitLocations( aMark, pDev ); // does nothing if already initialized - - ScPrintPageLocation aLocation; - if ( pPrintFuncCache->FindLocation( aTargetRange.aStart, aLocation ) ) - { - nPage = aLocation.nPage; - - // get the rectangle of the page's cell range in 1/100th mm - ScRange aLocRange = aLocation.aCellRange; - Rectangle aLocationMM = pDoc->GetMMRect( - aLocRange.aStart.Col(), aLocRange.aStart.Row(), - aLocRange.aEnd.Col(), aLocRange.aEnd.Row(), - aLocRange.aStart.Tab() ); - Rectangle aLocationPixel = aLocation.aRectangle; - - // Scale and move the target rectangle from aLocationMM to aLocationPixel, - // to get the target rectangle in pixels. - - Fraction aScaleX( aLocationPixel.GetWidth(), aLocationMM.GetWidth() ); - Fraction aScaleY( aLocationPixel.GetHeight(), aLocationMM.GetHeight() ); - - long nX1 = aLocationPixel.Left() + (long) - ( Fraction( aTargetRect.Left() - aLocationMM.Left(), 1 ) * aScaleX ); - long nX2 = aLocationPixel.Left() + (long) - ( Fraction( aTargetRect.Right() - aLocationMM.Left(), 1 ) * aScaleX ); - long nY1 = aLocationPixel.Top() + (long) - ( Fraction( aTargetRect.Top() - aLocationMM.Top(), 1 ) * aScaleY ); - long nY2 = aLocationPixel.Top() + (long) - ( Fraction( aTargetRect.Bottom() - aLocationMM.Top(), 1 ) * aScaleY ); - - if ( nX1 > aLocationPixel.Right() ) nX1 = aLocationPixel.Right(); - if ( nX2 > aLocationPixel.Right() ) nX2 = aLocationPixel.Right(); - if ( nY1 > aLocationPixel.Bottom() ) nY1 = aLocationPixel.Bottom(); - if ( nY2 > aLocationPixel.Bottom() ) nY2 = aLocationPixel.Bottom(); - - // The link target area is interpreted using the device's MapMode at - // the time of the CreateDest call, so PixelToLogic can be used here, - // regardless of the MapMode that is actually selected. - - aArea = pDev->PixelToLogic( Rectangle( nX1, nY1, nX2, nY2 ) ); - } - } - - if ( nPage >= 0 ) - pPDFData->SetLinkDest( aIter->nLinkId, pPDFData->CreateDest( aArea, nPage ) ); - } - } - else - { - // external link, use as-is - pPDFData->SetLinkURL( aIter->nLinkId, aBookmark ); - } - ++aIter; - } - rBookmarks.clear(); - } - - if ( pDrawView ) - pDrawView->HideSdrPage(); - delete pDrawView; -} - -// XLinkTargetSupplier - -uno::Reference<container::XNameAccess> SAL_CALL ScModelObj::getLinks() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return new ScLinkTargetTypesObj(pDocShell); - return NULL; -} - -// XActionLockable - -sal_Bool SAL_CALL ScModelObj::isActionLocked() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bLocked = false; - if (pDocShell) - bLocked = ( pDocShell->GetLockCount() != 0 ); - return bLocked; -} - -void SAL_CALL ScModelObj::addActionLock() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - pDocShell->LockDocument(); -} - -void SAL_CALL ScModelObj::removeActionLock() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - pDocShell->UnlockDocument(); -} - -void SAL_CALL ScModelObj::setActionLocks( sal_Int16 nLock ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - pDocShell->SetLockCount(nLock); -} - -sal_Int16 SAL_CALL ScModelObj::resetActionLocks() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nRet = 0; - if (pDocShell) - { - nRet = pDocShell->GetLockCount(); - pDocShell->SetLockCount(0); - } - return nRet; -} - -void SAL_CALL ScModelObj::lockControllers() throw (::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SfxBaseModel::lockControllers(); - if (pDocShell) - pDocShell->LockPaint(); -} - -void SAL_CALL ScModelObj::unlockControllers() throw (::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (hasControllersLocked()) - { - SfxBaseModel::unlockControllers(); - if (pDocShell) - pDocShell->UnlockPaint(); - } -} - -// XCalculate - -void SAL_CALL ScModelObj::calculate() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - pDocShell->DoRecalc(sal_True); - else - { - OSL_FAIL("keine DocShell"); //! Exception oder so? - } -} - -void SAL_CALL ScModelObj::calculateAll() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - pDocShell->DoHardRecalc(sal_True); - else - { - OSL_FAIL("keine DocShell"); //! Exception oder so? - } -} - -sal_Bool SAL_CALL ScModelObj::isAutomaticCalculationEnabled() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return pDocShell->GetDocument()->GetAutoCalc(); - - OSL_FAIL("keine DocShell"); //! Exception oder so? - return false; -} - -void SAL_CALL ScModelObj::enableAutomaticCalculation( sal_Bool bEnabled ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if ( pDoc->GetAutoCalc() != bEnabled ) - { - pDoc->SetAutoCalc( bEnabled ); - pDocShell->SetDocumentModified(); - } - } - else - { - OSL_FAIL("keine DocShell"); //! Exception oder so? - } -} - -// XProtectable - -void SAL_CALL ScModelObj::protect( const rtl::OUString& aPassword ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // #i108245# if already protected, don't change anything - if ( pDocShell && !pDocShell->GetDocument()->IsDocProtected() ) - { - String aString(aPassword); - - ScDocFunc aFunc(*pDocShell); - aFunc.Protect( TABLEID_DOC, aString, sal_True ); - } -} - -void SAL_CALL ScModelObj::unprotect( const rtl::OUString& aPassword ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - String aString(aPassword); - - ScDocFunc aFunc(*pDocShell); - sal_Bool bDone = aFunc.Unprotect( TABLEID_DOC, aString, sal_True ); - if (!bDone) - throw lang::IllegalArgumentException(); - } -} - -sal_Bool SAL_CALL ScModelObj::isProtected() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return pDocShell->GetDocument()->IsDocProtected(); - - OSL_FAIL("keine DocShell"); //! Exception oder so? - return false; -} - -// XDrawPagesSupplier - -uno::Reference<drawing::XDrawPages> SAL_CALL ScModelObj::getDrawPages() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return new ScDrawPagesObj(pDocShell); - - OSL_FAIL("keine DocShell"); //! Exception oder so? - return NULL; -} - -// XGoalSeek - -sheet::GoalResult SAL_CALL ScModelObj::seekGoal( - const table::CellAddress& aFormulaPosition, - const table::CellAddress& aVariablePosition, - const ::rtl::OUString& aGoalValue ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sheet::GoalResult aResult; - aResult.Divergence = DBL_MAX; // nichts gefunden - if (pDocShell) - { - WaitObject aWait( pDocShell->GetActiveDialogParent() ); - String aGoalString(aGoalValue); - ScDocument* pDoc = pDocShell->GetDocument(); - double fValue = 0.0; - sal_Bool bFound = pDoc->Solver( - (SCCOL)aFormulaPosition.Column, (SCROW)aFormulaPosition.Row, aFormulaPosition.Sheet, - (SCCOL)aVariablePosition.Column, (SCROW)aVariablePosition.Row, aVariablePosition.Sheet, - aGoalString, fValue ); - aResult.Result = fValue; - if (bFound) - aResult.Divergence = 0.0; //! das ist gelogen - } - return aResult; -} - -// XConsolidatable - -uno::Reference<sheet::XConsolidationDescriptor> SAL_CALL ScModelObj::createConsolidationDescriptor( - sal_Bool bEmpty ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScConsolidationDescriptor* pNew = new ScConsolidationDescriptor; - if ( pDocShell && !bEmpty ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - const ScConsolidateParam* pParam = pDoc->GetConsolidateDlgData(); - if (pParam) - pNew->SetParam( *pParam ); - } - return pNew; -} - -void SAL_CALL ScModelObj::consolidate( - const uno::Reference<sheet::XConsolidationDescriptor>& xDescriptor ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // das koennte theoretisch ein fremdes Objekt sein, also nur das - // oeffentliche XConsolidationDescriptor Interface benutzen, um - // die Daten in ein ScConsolidationDescriptor Objekt zu kopieren: - //! wenn es schon ein ScConsolidationDescriptor ist, direkt per getImplementation? - - ScConsolidationDescriptor aImpl; - aImpl.setFunction( xDescriptor->getFunction() ); - aImpl.setSources( xDescriptor->getSources() ); - aImpl.setStartOutputPosition( xDescriptor->getStartOutputPosition() ); - aImpl.setUseColumnHeaders( xDescriptor->getUseColumnHeaders() ); - aImpl.setUseRowHeaders( xDescriptor->getUseRowHeaders() ); - aImpl.setInsertLinks( xDescriptor->getInsertLinks() ); - - if (pDocShell) - { - const ScConsolidateParam& rParam = aImpl.GetParam(); - pDocShell->DoConsolidate( rParam, sal_True ); - pDocShell->GetDocument()->SetConsolidateDlgData( &rParam ); - } -} - -// XDocumentAuditing - -void SAL_CALL ScModelObj::refreshArrows() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocFunc aFunc(*pDocShell); - aFunc.DetectiveRefresh(); - } -} - -// XViewDataSupplier -uno::Reference< container::XIndexAccess > SAL_CALL ScModelObj::getViewData( ) - throw (uno::RuntimeException) -{ - uno::Reference < container::XIndexAccess > xRet( SfxBaseModel::getViewData() ); - - if( !xRet.is() ) - { - SolarMutexGuard aGuard; - if (pDocShell && pDocShell->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED) - { - xRet.set(uno::Reference < container::XIndexAccess >::query(::comphelper::getProcessServiceFactory()->createInstance(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.document.IndexedPropertyValues"))))); - - uno::Reference < container::XIndexContainer > xCont( xRet, uno::UNO_QUERY ); - OSL_ENSURE( xCont.is(), "ScModelObj::getViewData() failed for OLE object" ); - if( xCont.is() ) - { - uno::Sequence< beans::PropertyValue > aSeq; - aSeq.realloc(1); - String sName; - pDocShell->GetDocument()->GetName( pDocShell->GetDocument()->GetVisibleTab(), sName ); - rtl::OUString sOUName(sName); - aSeq[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SC_ACTIVETABLE)); - aSeq[0].Value <<= sOUName; - xCont->insertByIndex( 0, uno::makeAny( aSeq ) ); - } - } - } - - return xRet; -} - -// XPropertySet (Doc-Optionen) -//! auch an der Applikation anbieten? - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScModelObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScModelObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aPropertyName); - - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - const ScDocOptions& rOldOpt = pDoc->GetDocOptions(); - ScDocOptions aNewOpt = rOldOpt; - // Don't recalculate while loading XML, when the formula text is stored - // Recalculation after loading is handled separately. - bool bHardRecalc = !pDoc->IsImportingXML(); - - sal_Bool bOpt = ScDocOptionsHelper::setPropertyValue( aNewOpt, *aPropSet.getPropertyMap(), aPropertyName, aValue ); - if (bOpt) - { - // done... - if ( aString.EqualsAscii( SC_UNO_IGNORECASE ) || - aString.EqualsAscii( SC_UNONAME_REGEXP ) || - aString.EqualsAscii( SC_UNO_LOOKUPLABELS ) ) - bHardRecalc = false; - } - else if ( aString.EqualsAscii( SC_UNONAME_CLOCAL ) ) - { - lang::Locale aLocale; - if ( aValue >>= aLocale ) - { - LanguageType eLatin, eCjk, eCtl; - pDoc->GetLanguage( eLatin, eCjk, eCtl ); - eLatin = ScUnoConversion::GetLanguage(aLocale); - pDoc->SetLanguage( eLatin, eCjk, eCtl ); - } - } - else if ( aString.EqualsAscii( SC_UNO_CODENAME ) ) - { - rtl::OUString sCodeName; - if ( aValue >>= sCodeName ) - pDoc->SetCodeName( sCodeName ); - } - else if ( aString.EqualsAscii( SC_UNO_CJK_CLOCAL ) ) - { - lang::Locale aLocale; - if ( aValue >>= aLocale ) - { - LanguageType eLatin, eCjk, eCtl; - pDoc->GetLanguage( eLatin, eCjk, eCtl ); - eCjk = ScUnoConversion::GetLanguage(aLocale); - pDoc->SetLanguage( eLatin, eCjk, eCtl ); - } - } - else if ( aString.EqualsAscii( SC_UNO_CTL_CLOCAL ) ) - { - lang::Locale aLocale; - if ( aValue >>= aLocale ) - { - LanguageType eLatin, eCjk, eCtl; - pDoc->GetLanguage( eLatin, eCjk, eCtl ); - eCtl = ScUnoConversion::GetLanguage(aLocale); - pDoc->SetLanguage( eLatin, eCjk, eCtl ); - } - } - else if ( aString.EqualsAscii( SC_UNO_APPLYFMDES ) ) - { - // model is created if not there - ScDrawLayer* pModel = pDocShell->MakeDrawLayer(); - pModel->SetOpenInDesignMode( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - - SfxBindings* pBindings = pDocShell->GetViewBindings(); - if (pBindings) - pBindings->Invalidate( SID_FM_OPEN_READONLY ); - } - else if ( aString.EqualsAscii( SC_UNO_AUTOCONTFOC ) ) - { - // model is created if not there - ScDrawLayer* pModel = pDocShell->MakeDrawLayer(); - pModel->SetAutoControlFocus( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - - SfxBindings* pBindings = pDocShell->GetViewBindings(); - if (pBindings) - pBindings->Invalidate( SID_FM_AUTOCONTROLFOCUS ); - } - else if ( aString.EqualsAscii( SC_UNO_ISLOADED ) ) - { - pDocShell->SetEmpty( !ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - } - else if ( aString.EqualsAscii( SC_UNO_ISUNDOENABLED ) ) - { - sal_Bool bUndoEnabled = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - pDoc->EnableUndo( bUndoEnabled ); - sal_uInt16 nCount = ( bUndoEnabled ? - static_cast< sal_uInt16 >( SvtUndoOptions().GetUndoCount() ) : 0 ); - pDocShell->GetUndoManager()->SetMaxUndoActionCount( nCount ); - } - else if ( aString.EqualsAscii( SC_UNO_ISADJUSTHEIGHTENABLED ) ) - { - bool bOldAdjustHeightEnabled = pDoc->IsAdjustHeightEnabled(); - bool bAdjustHeightEnabled = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - if( bOldAdjustHeightEnabled != bAdjustHeightEnabled ) - { - pDoc->EnableAdjustHeight( bAdjustHeightEnabled ); - if( bAdjustHeightEnabled ) - pDocShell->UpdateAllRowHeights(); - } - } - else if ( aString.EqualsAscii( SC_UNO_ISEXECUTELINKENABLED ) ) - { - pDoc->EnableExecuteLink( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - } - else if ( aString.EqualsAscii( SC_UNO_ISCHANGEREADONLYENABLED ) ) - { - pDoc->EnableChangeReadOnly( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - } - else if ( aString.EqualsAscii( "BuildId" ) ) - { - aValue >>= maBuildId; - } - else if ( aString.EqualsAscii( "SavedObject" ) ) // set from chart after saving - { - rtl::OUString aObjName; - aValue >>= aObjName; - if ( aObjName.getLength() ) - pDoc->RestoreChartListener( aObjName ); - } - - if ( aNewOpt != rOldOpt ) - { - pDoc->SetDocOptions( aNewOpt ); - //! Recalc only for options that need it? - if ( bHardRecalc ) - pDocShell->DoHardRecalc( sal_True ); - pDocShell->SetDocumentModified(); - } - } -} - -uno::Any SAL_CALL ScModelObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aPropertyName); - uno::Any aRet; - - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - const ScDocOptions& rOpt = pDoc->GetDocOptions(); - aRet = ScDocOptionsHelper::getPropertyValue( rOpt, *aPropSet.getPropertyMap(), aPropertyName ); - if ( aRet.hasValue() ) - { - // done... - } - else if ( aString.EqualsAscii( SC_UNONAME_CLOCAL ) ) - { - LanguageType eLatin, eCjk, eCtl; - pDoc->GetLanguage( eLatin, eCjk, eCtl ); - - lang::Locale aLocale; - ScUnoConversion::FillLocale( aLocale, eLatin ); - aRet <<= aLocale; - } - else if ( aString.EqualsAscii( SC_UNO_CODENAME ) ) - { - rtl::OUString sCodeName = pDoc->GetCodeName(); - aRet <<= sCodeName; - } - - else if ( aString.EqualsAscii( SC_UNO_CJK_CLOCAL ) ) - { - LanguageType eLatin, eCjk, eCtl; - pDoc->GetLanguage( eLatin, eCjk, eCtl ); - - lang::Locale aLocale; - ScUnoConversion::FillLocale( aLocale, eCjk ); - aRet <<= aLocale; - } - else if ( aString.EqualsAscii( SC_UNO_CTL_CLOCAL ) ) - { - LanguageType eLatin, eCjk, eCtl; - pDoc->GetLanguage( eLatin, eCjk, eCtl ); - - lang::Locale aLocale; - ScUnoConversion::FillLocale( aLocale, eCtl ); - aRet <<= aLocale; - } - else if ( aString.EqualsAscii( SC_UNO_NAMEDRANGES ) ) - { - aRet <<= uno::Reference<sheet::XNamedRanges>(new ScNamedRangesObj( pDocShell )); - } - else if ( aString.EqualsAscii( SC_UNO_DATABASERNG ) ) - { - aRet <<= uno::Reference<sheet::XDatabaseRanges>(new ScDatabaseRangesObj( pDocShell )); - } - else if ( aString.EqualsAscii( SC_UNO_UNNAMEDDBRNG ) ) - { - aRet <<= uno::Reference<sheet::XUnnamedDatabaseRanges>(new ScUnnamedDatabaseRangesObj(pDocShell)); - } - else if ( aString.EqualsAscii( SC_UNO_COLLABELRNG ) ) - { - aRet <<= uno::Reference<sheet::XLabelRanges>(new ScLabelRangesObj( pDocShell, sal_True )); - } - else if ( aString.EqualsAscii( SC_UNO_ROWLABELRNG ) ) - { - aRet <<= uno::Reference<sheet::XLabelRanges>(new ScLabelRangesObj( pDocShell, false )); - } - else if ( aString.EqualsAscii( SC_UNO_AREALINKS ) ) - { - aRet <<= uno::Reference<sheet::XAreaLinks>(new ScAreaLinksObj( pDocShell )); - } - else if ( aString.EqualsAscii( SC_UNO_DDELINKS ) ) - { - aRet <<= uno::Reference<container::XNameAccess>(new ScDDELinksObj( pDocShell )); - } - else if ( aString.EqualsAscii( SC_UNO_EXTERNALDOCLINKS ) ) - { - aRet <<= uno::Reference<sheet::XExternalDocLinks>(new ScExternalDocLinksObj(pDocShell)); - } - else if ( aString.EqualsAscii( SC_UNO_SHEETLINKS ) ) - { - aRet <<= uno::Reference<container::XNameAccess>(new ScSheetLinksObj( pDocShell )); - } - else if ( aString.EqualsAscii( SC_UNO_APPLYFMDES ) ) - { - // default for no model is TRUE - ScDrawLayer* pModel = pDoc->GetDrawLayer(); - sal_Bool bOpenInDesign = pModel ? pModel->GetOpenInDesignMode() : sal_True; - ScUnoHelpFunctions::SetBoolInAny( aRet, bOpenInDesign ); - } - else if ( aString.EqualsAscii( SC_UNO_AUTOCONTFOC ) ) - { - // default for no model is FALSE - ScDrawLayer* pModel = pDoc->GetDrawLayer(); - sal_Bool bAutoControlFocus = pModel ? pModel->GetAutoControlFocus() : false; - ScUnoHelpFunctions::SetBoolInAny( aRet, bAutoControlFocus ); - } - else if ( aString.EqualsAscii( SC_UNO_FORBIDDEN ) ) - { - aRet <<= uno::Reference<i18n::XForbiddenCharacters>(new ScForbiddenCharsObj( pDocShell )); - } - else if ( aString.EqualsAscii( SC_UNO_HASDRAWPAGES ) ) - { - ScUnoHelpFunctions::SetBoolInAny( aRet, (pDocShell->GetDocument()->GetDrawLayer() != 0) ); - } - else if ( aString.EqualsAscii( SC_UNO_BASICLIBRARIES ) ) - { - aRet <<= pDocShell->GetBasicContainer(); - } - else if ( aString.EqualsAscii( SC_UNO_DIALOGLIBRARIES ) ) - { - aRet <<= pDocShell->GetDialogContainer(); - } - else if ( aString.EqualsAscii( SC_UNO_VBADOCOBJ ) ) - { - // PropertyValue seems extreme because we store - // the model ( as the value member ) of the PropertyValue that is - // itself a property of the model ( the intention however is to - // store something like a Workbook object... but we don't do that ) - // yet - beans::PropertyValue aProp; - aProp.Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("ThisExcelDoc") ); - aProp.Value <<= pDocShell->GetModel(); - aRet <<= aProp; - } - else if ( aString.EqualsAscii( SC_UNO_RUNTIMEUID ) ) - { - aRet <<= getRuntimeUID(); - } - else if ( aString.EqualsAscii( SC_UNO_HASVALIDSIGNATURES ) ) - { - aRet <<= hasValidSignatures(); - } - else if ( aString.EqualsAscii( SC_UNO_ISLOADED ) ) - { - ScUnoHelpFunctions::SetBoolInAny( aRet, !pDocShell->IsEmpty() ); - } - else if ( aString.EqualsAscii( SC_UNO_ISUNDOENABLED ) ) - { - ScUnoHelpFunctions::SetBoolInAny( aRet, pDoc->IsUndoEnabled() ); - } - else if ( aString.EqualsAscii( SC_UNO_ISADJUSTHEIGHTENABLED ) ) - { - ScUnoHelpFunctions::SetBoolInAny( aRet, pDoc->IsAdjustHeightEnabled() ); - } - else if ( aString.EqualsAscii( SC_UNO_ISEXECUTELINKENABLED ) ) - { - ScUnoHelpFunctions::SetBoolInAny( aRet, pDoc->IsExecuteLinkEnabled() ); - } - else if ( aString.EqualsAscii( SC_UNO_ISCHANGEREADONLYENABLED ) ) - { - ScUnoHelpFunctions::SetBoolInAny( aRet, pDoc->IsChangeReadOnlyEnabled() ); - } - else if ( aString.EqualsAscii( SC_UNO_REFERENCEDEVICE ) ) - { - VCLXDevice* pXDev = new VCLXDevice(); - pXDev->SetOutputDevice( pDoc->GetRefDevice() ); - aRet <<= uno::Reference< awt::XDevice >( pXDev ); - } - else if ( aString.EqualsAscii( "BuildId" ) ) - { - aRet <<= maBuildId; - } - else if ( aString.EqualsAscii( "InternalDocument" ) ) - { - ScUnoHelpFunctions::SetBoolInAny( aRet, (pDocShell->GetCreateMode() == SFX_CREATE_MODE_INTERNAL) ); - } - } - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScModelObj ) - -// XMultiServiceFactory - -uno::Reference<uno::XInterface> SAL_CALL ScModelObj::createInstance( - const rtl::OUString& aServiceSpecifier ) - throw(uno::Exception, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<uno::XInterface> xRet; - String aNameStr(aServiceSpecifier); - sal_uInt16 nType = ScServiceProvider::GetProviderType(aNameStr); - if ( nType != SC_SERVICE_INVALID ) - { - // drawing layer tables must be kept as long as the model is alive - // return stored instance if already set - switch ( nType ) - { - case SC_SERVICE_GRADTAB: xRet.set(xDrawGradTab); break; - case SC_SERVICE_HATCHTAB: xRet.set(xDrawHatchTab); break; - case SC_SERVICE_BITMAPTAB: xRet.set(xDrawBitmapTab); break; - case SC_SERVICE_TRGRADTAB: xRet.set(xDrawTrGradTab); break; - case SC_SERVICE_MARKERTAB: xRet.set(xDrawMarkerTab); break; - case SC_SERVICE_DASHTAB: xRet.set(xDrawDashTab); break; - case SC_SERVICE_CHDATAPROV: xRet.set(xChartDataProv); break; - case SC_SERVICE_VBAOBJECTPROVIDER: xRet.set(xObjProvider); break; - } - - // #i64497# If a chart is in a temporary document during clipoard paste, - // there should be no data provider, so that own data is used - bool bCreate = - ! ( nType == SC_SERVICE_CHDATAPROV && - ( pDocShell->GetCreateMode() == SFX_CREATE_MODE_INTERNAL )); - // this should never happen, i.e. the temporary document should never be - // loaded, becuase this unlinks the data - OSL_ASSERT( bCreate ); - - if ( !xRet.is() && bCreate ) - { - xRet.set(ScServiceProvider::MakeInstance( nType, pDocShell )); - - // store created instance - switch ( nType ) - { - case SC_SERVICE_GRADTAB: xDrawGradTab.set(xRet); break; - case SC_SERVICE_HATCHTAB: xDrawHatchTab.set(xRet); break; - case SC_SERVICE_BITMAPTAB: xDrawBitmapTab.set(xRet); break; - case SC_SERVICE_TRGRADTAB: xDrawTrGradTab.set(xRet); break; - case SC_SERVICE_MARKERTAB: xDrawMarkerTab.set(xRet); break; - case SC_SERVICE_DASHTAB: xDrawDashTab.set(xRet); break; - case SC_SERVICE_CHDATAPROV: xChartDataProv.set(xRet); break; - case SC_SERVICE_VBAOBJECTPROVIDER: xObjProvider.set(xRet); break; - } - } - } - else - { - // alles was ich nicht kenn, werf ich der SvxFmMSFactory an den Hals, - // da wird dann 'ne Exception geworfen, wenn's nicht passt... - - try - { - xRet.set(SvxFmMSFactory::createInstance(aServiceSpecifier)); - // extra block to force deletion of the temporary before ScShapeObj ctor (setDelegator) - } - catch ( lang::ServiceNotRegisteredException & ) - { - } - - // if the drawing factory created a shape, a ScShapeObj has to be used - // to support own properties like ImageMap: - - uno::Reference<drawing::XShape> xShape( xRet, uno::UNO_QUERY ); - if ( xShape.is() ) - { - xRet.clear(); // for aggregation, xShape must be the object's only ref - new ScShapeObj( xShape ); // aggregates object and modifies xShape - xRet.set(xShape); - } - } - return xRet; -} - -uno::Reference<uno::XInterface> SAL_CALL ScModelObj::createInstanceWithArguments( - const rtl::OUString& ServiceSpecifier, - const uno::Sequence<uno::Any>& aArgs ) - throw(uno::Exception, uno::RuntimeException) -{ - //! unterscheiden zwischen eigenen Services und denen vom Drawing-Layer? - - SolarMutexGuard aGuard; - uno::Reference<uno::XInterface> xInt(createInstance(ServiceSpecifier)); - - if ( aArgs.getLength() ) - { - // used only for cell value binding so far - it can be initialized after creating - - uno::Reference<lang::XInitialization> xInit( xInt, uno::UNO_QUERY ); - if ( xInit.is() ) - xInit->initialize( aArgs ); - } - - return xInt; -} - -uno::Sequence<rtl::OUString> SAL_CALL ScModelObj::getAvailableServiceNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! warum sind die Parameter bei concatServiceNames nicht const ??? - //! return concatServiceNames( ScServiceProvider::GetAllServiceNames(), - //! SvxFmMSFactory::getAvailableServiceNames() ); - - uno::Sequence<rtl::OUString> aMyServices(ScServiceProvider::GetAllServiceNames()); - uno::Sequence<rtl::OUString> aDrawServices(SvxFmMSFactory::getAvailableServiceNames()); - - return concatServiceNames( aMyServices, aDrawServices ); -} - -// XServiceInfo - -rtl::OUString SAL_CALL ScModelObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScModelObj" )); -} - -sal_Bool SAL_CALL ScModelObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr(rServiceName); - return aServiceStr.EqualsAscii( SCMODELOBJ_SERVICE ) || - aServiceStr.EqualsAscii( SCDOCSETTINGS_SERVICE ) || - aServiceStr.EqualsAscii( SCDOC_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScModelObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(2); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCMODELOBJ_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCDOCSETTINGS_SERVICE )); - return aRet; -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScModelObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( SfxObjectShell::getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(pDocShell )); - } - - // aggregated number formats supplier has XUnoTunnel, too - // interface from aggregated object must be obtained via queryAggregation - - sal_Int64 nRet = SfxBaseModel::getSomething( rId ); - if ( nRet ) - return nRet; - - if ( GetFormatter().is() ) - { - const uno::Type& rTunnelType = ::getCppuType((uno::Reference<lang::XUnoTunnel>*) 0); - uno::Any aNumTunnel(xNumberAgg->queryAggregation(rTunnelType)); - if(aNumTunnel.getValueType() == rTunnelType) - { - uno::Reference<lang::XUnoTunnel> xTunnelAgg( - *(uno::Reference<lang::XUnoTunnel>*)aNumTunnel.getValue()); - return xTunnelAgg->getSomething( rId ); - } - } - - return 0; -} - -namespace -{ - class theScModelObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScModelObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScModelObj::getUnoTunnelId() -{ - return theScModelObjUnoTunnelId::get().getSeq(); -} - -ScModelObj* ScModelObj::getImplementation( const uno::Reference<uno::XInterface> xObj ) -{ - ScModelObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScModelObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -// XChangesNotifier - -void ScModelObj::addChangesListener( const uno::Reference< util::XChangesListener >& aListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - maChangesListeners.addInterface( aListener ); -} - -void ScModelObj::removeChangesListener( const uno::Reference< util::XChangesListener >& aListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - maChangesListeners.removeInterface( aListener ); -} - -bool ScModelObj::HasChangesListeners() const -{ - if ( maChangesListeners.getLength() > 0 ) - return true; - - // "change" event set in any sheet? - return pDocShell && pDocShell->GetDocument()->HasAnySheetEventScript(SC_SHEETEVENT_CHANGE); -} - -void ScModelObj::NotifyChanges( const ::rtl::OUString& rOperation, const ScRangeList& rRanges, - const uno::Sequence< beans::PropertyValue >& rProperties ) -{ - if ( pDocShell && HasChangesListeners() ) - { - util::ChangesEvent aEvent; - aEvent.Source.set( static_cast< cppu::OWeakObject* >( this ) ); - aEvent.Base <<= aEvent.Source; - - size_t nRangeCount = rRanges.size(); - aEvent.Changes.realloc( static_cast< sal_Int32 >( nRangeCount ) ); - for ( size_t nIndex = 0; nIndex < nRangeCount; ++nIndex ) - { - uno::Reference< table::XCellRange > xRangeObj; - - ScRange aRange( *rRanges[ nIndex ] ); - if ( aRange.aStart == aRange.aEnd ) - { - xRangeObj.set( new ScCellObj( pDocShell, aRange.aStart ) ); - } - else - { - xRangeObj.set( new ScCellRangeObj( pDocShell, aRange ) ); - } - - util::ElementChange& rChange = aEvent.Changes[ static_cast< sal_Int32 >( nIndex ) ]; - rChange.Accessor <<= rOperation; - rChange.Element <<= rProperties; - rChange.ReplacedElement <<= xRangeObj; - } - - ::cppu::OInterfaceIteratorHelper aIter( maChangesListeners ); - while ( aIter.hasMoreElements() ) - { - try - { - static_cast< util::XChangesListener* >( aIter.next() )->changesOccurred( aEvent ); - } - catch( uno::Exception& ) - { - } - } - } - - // handle sheet events - //! separate method with ScMarkData? Then change HasChangesListeners back. - if ( rOperation.compareToAscii("cell-change") == 0 && pDocShell ) - { - ScMarkData aMarkData; - aMarkData.MarkFromRangeList( rRanges, false ); - ScDocument* pDoc = pDocShell->GetDocument(); - SCTAB nTabCount = pDoc->GetTableCount(); - ScMarkData::iterator itr = aMarkData.begin(), itrEnd = aMarkData.end(); - for (; itr != itrEnd && *itr < nTabCount; ++itr) - { - SCTAB nTab = *itr; - const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab); - if (pEvents) - { - const rtl::OUString* pScript = pEvents->GetScript(SC_SHEETEVENT_CHANGE); - if (pScript) - { - ScRangeList aTabRanges; // collect ranges on this sheet - size_t nRangeCount = rRanges.size(); - for ( size_t nIndex = 0; nIndex < nRangeCount; ++nIndex ) - { - ScRange aRange( *rRanges[ nIndex ] ); - if ( aRange.aStart.Tab() == nTab ) - aTabRanges.Append( aRange ); - } - size_t nTabRangeCount = aTabRanges.size(); - if ( nTabRangeCount > 0 ) - { - uno::Reference<uno::XInterface> xTarget; - if ( nTabRangeCount == 1 ) - { - ScRange aRange( *aTabRanges[ 0 ] ); - if ( aRange.aStart == aRange.aEnd ) - xTarget.set( static_cast<cppu::OWeakObject*>( new ScCellObj( pDocShell, aRange.aStart ) ) ); - else - xTarget.set( static_cast<cppu::OWeakObject*>( new ScCellRangeObj( pDocShell, aRange ) ) ); - } - else - xTarget.set( static_cast<cppu::OWeakObject*>( new ScCellRangesObj( pDocShell, aTabRanges ) ) ); - - uno::Sequence<uno::Any> aParams(1); - aParams[0] <<= xTarget; - - uno::Any aRet; - uno::Sequence<sal_Int16> aOutArgsIndex; - uno::Sequence<uno::Any> aOutArgs; - - /*ErrCode eRet =*/ pDocShell->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs ); - } - } - } - } - } -} - -void ScModelObj::HandleCalculateEvents() -{ - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - // don't call events before the document is visible - // (might also set a flag on SFX_EVENT_LOADFINISHED and only disable while loading) - if ( pDoc->IsDocVisible() ) - { - SCTAB nTabCount = pDoc->GetTableCount(); - for (SCTAB nTab = 0; nTab < nTabCount; nTab++) - { - if (pDoc->HasCalcNotification(nTab)) - { - if (const ScSheetEvents* pEvents = pDoc->GetSheetEvents( nTab )) - { - if (const rtl::OUString* pScript = pEvents->GetScript(SC_SHEETEVENT_CALCULATE)) - { - uno::Any aRet; - uno::Sequence<uno::Any> aParams; - uno::Sequence<sal_Int16> aOutArgsIndex; - uno::Sequence<uno::Any> aOutArgs; - pDocShell->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs ); - } - } - - try - { - uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW ); - uno::Sequence< uno::Any > aArgs( 1 ); - aArgs[ 0 ] <<= nTab; - xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( SC_SHEETEVENT_CALCULATE ), aArgs ); - } - catch( uno::Exception& ) - { - } - } - } - } - pDoc->ResetCalcNotifications(); - } -} - -//------------------------------------------------------------------------ - -ScDrawPagesObj::ScDrawPagesObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDrawPagesObj::~ScDrawPagesObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScDrawPagesObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -uno::Reference<drawing::XDrawPage> ScDrawPagesObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const -{ - if (pDocShell) - { - ScDrawLayer* pDrawLayer = pDocShell->MakeDrawLayer(); - OSL_ENSURE(pDrawLayer,"kann Draw-Layer nicht anlegen"); - if ( pDrawLayer && nIndex >= 0 && nIndex < pDocShell->GetDocument()->GetTableCount() ) - { - SdrPage* pPage = pDrawLayer->GetPage((sal_uInt16)nIndex); - OSL_ENSURE(pPage,"Draw-Page nicht gefunden"); - if (pPage) - { - return uno::Reference<drawing::XDrawPage> (pPage->getUnoPage(), uno::UNO_QUERY); - } - } - } - return NULL; -} - -// XDrawPages - -uno::Reference<drawing::XDrawPage> SAL_CALL ScDrawPagesObj::insertNewByIndex( sal_Int32 nPos ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<drawing::XDrawPage> xRet; - if (pDocShell) - { - String aNewName; - pDocShell->GetDocument()->CreateValidTabName(aNewName); - ScDocFunc aFunc(*pDocShell); - if ( aFunc.InsertTable( (SCTAB)nPos, aNewName, sal_True, sal_True ) ) - xRet.set(GetObjectByIndex_Impl( nPos )); - } - return xRet; -} - -void SAL_CALL ScDrawPagesObj::remove( const uno::Reference<drawing::XDrawPage>& xPage ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SvxDrawPage* pImp = SvxDrawPage::getImplementation( xPage ); - if ( pDocShell && pImp ) - { - SdrPage* pPage = pImp->GetSdrPage(); - if (pPage) - { - SCTAB nPageNum = static_cast<SCTAB>(pPage->GetPageNum()); - ScDocFunc aFunc(*pDocShell); - aFunc.DeleteTable( nPageNum, sal_True, sal_True ); - } - } -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScDrawPagesObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return pDocShell->GetDocument()->GetTableCount(); - return 0; -} - -uno::Any SAL_CALL ScDrawPagesObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<drawing::XDrawPage> xPage(GetObjectByIndex_Impl(nIndex)); - if (xPage.is()) - return uno::makeAny(xPage); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScDrawPagesObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<drawing::XDrawPage>*)0); -} - -sal_Bool SAL_CALL ScDrawPagesObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -//------------------------------------------------------------------------ - -ScTableSheetsObj::ScTableSheetsObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScTableSheetsObj::~ScTableSheetsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScTableSheetsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XSpreadsheets - -ScTableSheetObj* ScTableSheetsObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const -{ - if ( pDocShell && nIndex >= 0 && nIndex < pDocShell->GetDocument()->GetTableCount() ) - return new ScTableSheetObj( pDocShell, static_cast<SCTAB>(nIndex) ); - - return NULL; -} - -ScTableSheetObj* ScTableSheetsObj::GetObjectByName_Impl(const rtl::OUString& aName) const -{ - if (pDocShell) - { - SCTAB nIndex; - String aString(aName); - if ( pDocShell->GetDocument()->GetTable( aString, nIndex ) ) - return new ScTableSheetObj( pDocShell, nIndex ); - } - return NULL; -} - -void SAL_CALL ScTableSheetsObj::insertNewByName( const rtl::OUString& aName, sal_Int16 nPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if (pDocShell) - { - String aNamStr(aName); - ScDocFunc aFunc(*pDocShell); - bDone = aFunc.InsertTable( nPosition, aNamStr, sal_True, sal_True ); - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScTableSheetsObj::moveByName( const rtl::OUString& aName, sal_Int16 nDestination ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if (pDocShell) - { - String aNamStr(aName); - SCTAB nSource; - if ( pDocShell->GetDocument()->GetTable( aNamStr, nSource ) ) - bDone = pDocShell->MoveTable( nSource, nDestination, false, sal_True ); - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScTableSheetsObj::copyByName( const rtl::OUString& aName, - const rtl::OUString& aCopy, sal_Int16 nDestination ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if (pDocShell) - { - String aNamStr(aName); - String aNewStr(aCopy); - SCTAB nSource; - if ( pDocShell->GetDocument()->GetTable( aNamStr, nSource ) ) - { - bDone = pDocShell->MoveTable( nSource, nDestination, sal_True, sal_True ); - if (bDone) - { - // #i92477# any index past the last sheet means "append" in MoveTable - SCTAB nResultTab = static_cast<SCTAB>(nDestination); - SCTAB nTabCount = pDocShell->GetDocument()->GetTableCount(); // count after copying - if (nResultTab >= nTabCount) - nResultTab = nTabCount - 1; - - ScDocFunc aFunc(*pDocShell); - bDone = aFunc.RenameTable( nResultTab, aNewStr, sal_True, sal_True ); - } - } - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScTableSheetsObj::insertByName( const rtl::OUString& aName, const uno::Any& aElement ) - throw(lang::IllegalArgumentException, container::ElementExistException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - sal_Bool bIllArg = false; - - //! Type of aElement can be some specific interface instead of XInterface - - if ( pDocShell ) - { - uno::Reference<uno::XInterface> xInterface(aElement, uno::UNO_QUERY); - if ( xInterface.is() ) - { - ScTableSheetObj* pSheetObj = ScTableSheetObj::getImplementation( xInterface ); - if ( pSheetObj && !pSheetObj->GetDocShell() ) // noch nicht eingefuegt? - { - ScDocument* pDoc = pDocShell->GetDocument(); - String aNamStr(aName); - SCTAB nDummy; - if ( pDoc->GetTable( aNamStr, nDummy ) ) - { - // name already exists - throw container::ElementExistException(); - } - else - { - SCTAB nPosition = pDoc->GetTableCount(); - ScDocFunc aFunc(*pDocShell); - bDone = aFunc.InsertTable( nPosition, aNamStr, sal_True, sal_True ); - if (bDone) - pSheetObj->InitInsertSheet( pDocShell, nPosition ); - // Dokument und neuen Range am Objekt setzen - } - } - else - bIllArg = sal_True; - } - else - bIllArg = sal_True; - } - - if (!bDone) - { - if (bIllArg) - throw lang::IllegalArgumentException(); - else - throw uno::RuntimeException(); // ElementExistException is handled above - } -} - -void SAL_CALL ScTableSheetsObj::replaceByName( const rtl::OUString& aName, const uno::Any& aElement ) - throw(lang::IllegalArgumentException, container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - sal_Bool bIllArg = false; - - //! Type of aElement can be some specific interface instead of XInterface - - if ( pDocShell ) - { - uno::Reference<uno::XInterface> xInterface(aElement, uno::UNO_QUERY); - if ( xInterface.is() ) - { - ScTableSheetObj* pSheetObj = ScTableSheetObj::getImplementation( xInterface ); - if ( pSheetObj && !pSheetObj->GetDocShell() ) // noch nicht eingefuegt? - { - String aNamStr(aName); - SCTAB nPosition; - if ( pDocShell->GetDocument()->GetTable( aNamStr, nPosition ) ) - { - ScDocFunc aFunc(*pDocShell); - if ( aFunc.DeleteTable( nPosition, sal_True, sal_True ) ) - { - // InsertTable kann jetzt eigentlich nicht schiefgehen... - bDone = aFunc.InsertTable( nPosition, aNamStr, sal_True, sal_True ); - if (bDone) - pSheetObj->InitInsertSheet( pDocShell, nPosition ); - } - } - else - { - // not found - throw container::NoSuchElementException(); - } - } - else - bIllArg = sal_True; - } - else - bIllArg = sal_True; - } - - if (!bDone) - { - if (bIllArg) - throw lang::IllegalArgumentException(); - else - throw uno::RuntimeException(); // NoSuchElementException is handled above - } -} - -void SAL_CALL ScTableSheetsObj::removeByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if (pDocShell) - { - SCTAB nIndex; - String aString(aName); - if ( pDocShell->GetDocument()->GetTable( aString, nIndex ) ) - { - ScDocFunc aFunc(*pDocShell); - bDone = aFunc.DeleteTable( nIndex, sal_True, sal_True ); - } - else - { - // not found - throw container::NoSuchElementException(); - } - } - - if (!bDone) - throw uno::RuntimeException(); // NoSuchElementException is handled above -} - -// XCellRangesAccess - -uno::Reference< table::XCell > SAL_CALL ScTableSheetsObj::getCellByPosition( sal_Int32 nColumn, sal_Int32 nRow, sal_Int32 nSheet ) - throw (lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<table::XCellRange> xSheet(static_cast<ScCellRangeObj*>(GetObjectByIndex_Impl((sal_uInt16)nSheet))); - if (! xSheet.is()) - throw lang::IndexOutOfBoundsException(); - - return xSheet->getCellByPosition(nColumn, nRow); -} - -uno::Reference< table::XCellRange > SAL_CALL ScTableSheetsObj::getCellRangeByPosition( sal_Int32 nLeft, sal_Int32 nTop, sal_Int32 nRight, sal_Int32 nBottom, sal_Int32 nSheet ) - throw (lang::IndexOutOfBoundsException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<table::XCellRange> xSheet(static_cast<ScCellRangeObj*>(GetObjectByIndex_Impl((sal_uInt16)nSheet))); - if (! xSheet.is()) - throw lang::IndexOutOfBoundsException(); - - return xSheet->getCellRangeByPosition(nLeft, nTop, nRight, nBottom); -} - -uno::Sequence < uno::Reference< table::XCellRange > > SAL_CALL ScTableSheetsObj::getCellRangesByName( const rtl::OUString& aRange ) - throw (lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Sequence < uno::Reference < table::XCellRange > > xRet; - - ScRangeList aRangeList; - ScDocument* pDoc = pDocShell->GetDocument(); - if (ScRangeStringConverter::GetRangeListFromString( aRangeList, aRange, pDoc, ::formula::FormulaGrammar::CONV_OOO, ';' )) - { - size_t nCount = aRangeList.size(); - if (nCount) - { - xRet.realloc(nCount); - for( size_t nIndex = 0; nIndex < nCount; nIndex++ ) - { - const ScRange* pRange = aRangeList[ nIndex ]; - if( pRange ) - xRet[nIndex] = new ScCellRangeObj(pDocShell, *pRange); - } - } - else - throw lang::IllegalArgumentException(); - } - else - throw lang::IllegalArgumentException(); - return xRet; -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScTableSheetsObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetsEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScTableSheetsObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return pDocShell->GetDocument()->GetTableCount(); - return 0; -} - -uno::Any SAL_CALL ScTableSheetsObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XSpreadsheet> xSheet(GetObjectByIndex_Impl(nIndex)); - if (xSheet.is()) - return uno::makeAny(xSheet); - else - throw lang::IndexOutOfBoundsException(); -// return uno::Any(); -} - -uno::Type SAL_CALL ScTableSheetsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<sheet::XSpreadsheet>*)0); -} - -sal_Bool SAL_CALL ScTableSheetsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// XNameAccess - -uno::Any SAL_CALL ScTableSheetsObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XSpreadsheet> xSheet(GetObjectByName_Impl(aName)); - if (xSheet.is()) - return uno::makeAny(xSheet); - else - throw container::NoSuchElementException(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScTableSheetsObj::getElementNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - SCTAB nCount = pDoc->GetTableCount(); - String aName; - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pAry = aSeq.getArray(); - for (SCTAB i=0; i<nCount; i++) - { - pDoc->GetName( i, aName ); - pAry[i] = aName; - } - return aSeq; - } - return uno::Sequence<rtl::OUString>(); -} - -sal_Bool SAL_CALL ScTableSheetsObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - SCTAB nIndex; - if ( pDocShell->GetDocument()->GetTable( String(aName), nIndex ) ) - return sal_True; - } - return false; -} - -//------------------------------------------------------------------------ - -ScTableColumnsObj::ScTableColumnsObj(ScDocShell* pDocSh, SCTAB nT, SCCOL nSC, SCCOL nEC) : - pDocShell( pDocSh ), - nTab ( nT ), - nStartCol( nSC ), - nEndCol ( nEC ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScTableColumnsObj::~ScTableColumnsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScTableColumnsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - //! Referenz-Update fuer Tab und Start/Ende - } - else if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XTableColumns - -ScTableColumnObj* ScTableColumnsObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const -{ - SCCOL nCol = static_cast<SCCOL>(nIndex) + nStartCol; - if ( pDocShell && nCol <= nEndCol ) - return new ScTableColumnObj( pDocShell, nCol, nTab ); - - return NULL; // falscher Index -} - -ScTableColumnObj* ScTableColumnsObj::GetObjectByName_Impl(const rtl::OUString& aName) const -{ - SCCOL nCol = 0; - String aString(aName); - if ( ::AlphaToCol( nCol, aString) ) - if ( pDocShell && nCol >= nStartCol && nCol <= nEndCol ) - return new ScTableColumnObj( pDocShell, nCol, nTab ); - - return NULL; -} - -void SAL_CALL ScTableColumnsObj::insertByIndex( sal_Int32 nPosition, sal_Int32 nCount ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if ( pDocShell && nCount > 0 && nPosition >= 0 && nStartCol+nPosition <= nEndCol && - nStartCol+nPosition+nCount-1 <= MAXCOL ) - { - ScDocFunc aFunc(*pDocShell); - ScRange aRange( (SCCOL)(nStartCol+nPosition), 0, nTab, - (SCCOL)(nStartCol+nPosition+nCount-1), MAXROW, nTab ); - bDone = aFunc.InsertCells( aRange, NULL, INS_INSCOLS, sal_True, sal_True ); - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScTableColumnsObj::removeByIndex( sal_Int32 nIndex, sal_Int32 nCount ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - // Der zu loeschende Bereich muss innerhalb des Objekts liegen - if ( pDocShell && nCount > 0 && nIndex >= 0 && nStartCol+nIndex+nCount-1 <= nEndCol ) - { - ScDocFunc aFunc(*pDocShell); - ScRange aRange( (SCCOL)(nStartCol+nIndex), 0, nTab, - (SCCOL)(nStartCol+nIndex+nCount-1), MAXROW, nTab ); - bDone = aFunc.DeleteCells( aRange, NULL, DEL_DELCOLS, sal_True, sal_True ); - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScTableColumnsObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.table.TableColumnsEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScTableColumnsObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return nEndCol - nStartCol + 1; -} - -uno::Any SAL_CALL ScTableColumnsObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<table::XCellRange> xColumn(GetObjectByIndex_Impl(nIndex)); - if (xColumn.is()) - return uno::makeAny(xColumn); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScTableColumnsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<table::XCellRange>*)0); -} - -sal_Bool SAL_CALL ScTableColumnsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -uno::Any SAL_CALL ScTableColumnsObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<table::XCellRange> xColumn(GetObjectByName_Impl(aName)); - if (xColumn.is()) - return uno::makeAny(xColumn); - else - throw container::NoSuchElementException(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScTableColumnsObj::getElementNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SCCOL nCount = nEndCol - nStartCol + 1; - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pAry = aSeq.getArray(); - for (SCCOL i=0; i<nCount; i++) - pAry[i] = ::ScColToAlpha( nStartCol + i ); - - return aSeq; -} - -sal_Bool SAL_CALL ScTableColumnsObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SCCOL nCol = 0; - String aString(aName); - if ( ::AlphaToCol( nCol, aString) ) - if ( pDocShell && nCol >= nStartCol && nCol <= nEndCol ) - return sal_True; - - return false; // nicht gefunden -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableColumnsObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( lcl_GetColumnsPropertyMap() )); - return aRef; -} - -void SAL_CALL ScTableColumnsObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pDocShell) - throw uno::RuntimeException(); - - ScDocFunc aFunc(*pDocShell); - SCCOLROW nColArr[2]; - nColArr[0] = nStartCol; - nColArr[1] = nEndCol; - String aNameString(aPropertyName); - - if ( aNameString.EqualsAscii( SC_UNONAME_CELLWID ) ) - { - sal_Int32 nNewWidth = 0; - if ( aValue >>= nNewWidth ) - aFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab, SC_SIZE_ORIGINAL, - (sal_uInt16)HMMToTwips(nNewWidth), sal_True, sal_True ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_CELLVIS ) ) - { - sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT; - aFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab, eMode, 0, sal_True, sal_True ); - // SC_SIZE_DIRECT with size 0: hide - } - else if ( aNameString.EqualsAscii( SC_UNONAME_OWIDTH ) ) - { - sal_Bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - if (bOpt) - aFunc.SetWidthOrHeight( sal_True, 1, nColArr, nTab, - SC_SIZE_OPTIMAL, STD_EXTRA_WIDTH, sal_True, sal_True ); - // sal_False for columns currently has no effect - } - else if ( aNameString.EqualsAscii( SC_UNONAME_NEWPAGE ) || aNameString.EqualsAscii( SC_UNONAME_MANPAGE ) ) - { - //! single function to set/remove all breaks? - sal_Bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - for (SCCOL nCol=nStartCol; nCol<=nEndCol; nCol++) - if (bSet) - aFunc.InsertPageBreak( sal_True, ScAddress(nCol,0,nTab), sal_True, sal_True, sal_True ); - else - aFunc.RemovePageBreak( sal_True, ScAddress(nCol,0,nTab), sal_True, sal_True, sal_True ); - } -} - -uno::Any SAL_CALL ScTableColumnsObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pDocShell) - throw uno::RuntimeException(); - - ScDocument* pDoc = pDocShell->GetDocument(); - String aNameString(aPropertyName); - uno::Any aAny; - - //! loop over all columns for current state? - - if ( aNameString.EqualsAscii( SC_UNONAME_CELLWID ) ) - { - // for hidden column, return original height - sal_uInt16 nWidth = pDoc->GetOriginalWidth( nStartCol, nTab ); - aAny <<= (sal_Int32)TwipsToHMM(nWidth); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_CELLVIS ) ) - { - bool bVis = !pDoc->ColHidden(nStartCol, nTab); - ScUnoHelpFunctions::SetBoolInAny( aAny, bVis ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_OWIDTH ) ) - { - sal_Bool bOpt = !(pDoc->GetColFlags( nStartCol, nTab ) & CR_MANUALSIZE); - ScUnoHelpFunctions::SetBoolInAny( aAny, bOpt ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_NEWPAGE ) ) - { - ScBreakType nBreak = pDoc->HasColBreak(nStartCol, nTab); - ScUnoHelpFunctions::SetBoolInAny( aAny, nBreak ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_MANPAGE ) ) - { - ScBreakType nBreak = pDoc->HasColBreak(nStartCol, nTab); - ScUnoHelpFunctions::SetBoolInAny( aAny, (nBreak & BREAK_MANUAL) ); - } - - return aAny; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScTableColumnsObj ) - -//------------------------------------------------------------------------ - -ScTableRowsObj::ScTableRowsObj(ScDocShell* pDocSh, SCTAB nT, SCROW nSR, SCROW nER) : - pDocShell( pDocSh ), - nTab ( nT ), - nStartRow( nSR ), - nEndRow ( nER ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScTableRowsObj::~ScTableRowsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScTableRowsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - //! Referenz-Update fuer Tab und Start/Ende - } - else if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XTableRows - -ScTableRowObj* ScTableRowsObj::GetObjectByIndex_Impl(sal_Int32 nIndex) const -{ - SCROW nRow = static_cast<SCROW>(nIndex) + nStartRow; - if ( pDocShell && nRow <= nEndRow ) - return new ScTableRowObj( pDocShell, nRow, nTab ); - - return NULL; // falscher Index -} - -void SAL_CALL ScTableRowsObj::insertByIndex( sal_Int32 nPosition, sal_Int32 nCount ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if ( pDocShell && nCount > 0 && nPosition >= 0 && nStartRow+nPosition <= nEndRow && - nStartRow+nPosition+nCount-1 <= MAXROW ) - { - ScDocFunc aFunc(*pDocShell); - ScRange aRange( 0, (SCROW)(nStartRow+nPosition), nTab, - MAXCOL, (SCROW)(nStartRow+nPosition+nCount-1), nTab ); - bDone = aFunc.InsertCells( aRange, NULL, INS_INSROWS, sal_True, sal_True ); - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScTableRowsObj::removeByIndex( sal_Int32 nIndex, sal_Int32 nCount ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - // Der zu loeschende Bereich muss innerhalb des Objekts liegen - if ( pDocShell && nCount > 0 && nIndex >= 0 && nStartRow+nIndex+nCount-1 <= nEndRow ) - { - ScDocFunc aFunc(*pDocShell); - ScRange aRange( 0, (SCROW)(nStartRow+nIndex), nTab, - MAXCOL, (SCROW)(nStartRow+nIndex+nCount-1), nTab ); - bDone = aFunc.DeleteCells( aRange, NULL, DEL_DELROWS, sal_True, sal_True ); - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScTableRowsObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.table.TableRowsEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScTableRowsObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return nEndRow - nStartRow + 1; -} - -uno::Any SAL_CALL ScTableRowsObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<table::XCellRange> xRow(GetObjectByIndex_Impl(nIndex)); - if (xRow.is()) - return uno::makeAny(xRow); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScTableRowsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<table::XCellRange>*)0); -} - -sal_Bool SAL_CALL ScTableRowsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableRowsObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( lcl_GetRowsPropertyMap() )); - return aRef; -} - -void SAL_CALL ScTableRowsObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pDocShell) - throw uno::RuntimeException(); - - ScDocFunc aFunc(*pDocShell); - ScDocument* pDoc = pDocShell->GetDocument(); - SCCOLROW nRowArr[2]; - nRowArr[0] = nStartRow; - nRowArr[1] = nEndRow; - String aNameString(aPropertyName); - - if ( aNameString.EqualsAscii( SC_UNONAME_OHEIGHT ) ) - { - sal_Int32 nNewHeight = 0; - if ( pDoc->IsImportingXML() && ( aValue >>= nNewHeight ) ) - { - // used to set the stored row height for rows with optimal height when loading. - - // TODO: It's probably cleaner to use a different property name - // for this. - pDoc->SetRowHeightOnly( nStartRow, nEndRow, nTab, (sal_uInt16)HMMToTwips(nNewHeight) ); - } - else - { - sal_Bool bOpt = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - if (bOpt) - aFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, SC_SIZE_OPTIMAL, 0, sal_True, sal_True ); - else - { - //! manually set old heights again? - } - } - } - else if ( aNameString.EqualsAscii( SC_UNONAME_CELLHGT ) ) - { - sal_Int32 nNewHeight = 0; - if ( aValue >>= nNewHeight ) - aFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, SC_SIZE_ORIGINAL, - (sal_uInt16)HMMToTwips(nNewHeight), sal_True, sal_True ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_CELLVIS ) ) - { - sal_Bool bVis = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - ScSizeMode eMode = bVis ? SC_SIZE_SHOW : SC_SIZE_DIRECT; - aFunc.SetWidthOrHeight( false, 1, nRowArr, nTab, eMode, 0, sal_True, sal_True ); - // SC_SIZE_DIRECT with size 0: hide - } - else if ( aNameString.EqualsAscii( SC_UNONAME_CELLFILT ) ) - { - //! undo etc. - if (ScUnoHelpFunctions::GetBoolFromAny( aValue )) - pDoc->SetRowFiltered(nStartRow, nEndRow, nTab, true); - else - pDoc->SetRowFiltered(nStartRow, nEndRow, nTab, false); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_NEWPAGE) || aNameString.EqualsAscii( SC_UNONAME_MANPAGE) ) - { - //! single function to set/remove all breaks? - sal_Bool bSet = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - for (SCROW nRow=nStartRow; nRow<=nEndRow; nRow++) - if (bSet) - aFunc.InsertPageBreak( false, ScAddress(0,nRow,nTab), sal_True, sal_True, sal_True ); - else - aFunc.RemovePageBreak( false, ScAddress(0,nRow,nTab), sal_True, sal_True, sal_True ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_CELLBACK ) || aNameString.EqualsAscii( SC_UNONAME_CELLTRAN ) ) - { - // #i57867# Background color is specified for row styles in the file format, - // so it has to be supported along with the row properties (import only). - - // Use ScCellRangeObj to set the property for all cells in the rows - // (this means, the "row attribute" must be set before individual cell attributes). - - ScRange aRange( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab ); - uno::Reference<beans::XPropertySet> xRangeObj = new ScCellRangeObj( pDocShell, aRange ); - xRangeObj->setPropertyValue( aPropertyName, aValue ); - } -} - -uno::Any SAL_CALL ScTableRowsObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pDocShell) - throw uno::RuntimeException(); - - ScDocument* pDoc = pDocShell->GetDocument(); - String aNameString(aPropertyName); - uno::Any aAny; - - //! loop over all rows for current state? - - if ( aNameString.EqualsAscii( SC_UNONAME_CELLHGT ) ) - { - // for hidden row, return original height - sal_uInt16 nHeight = pDoc->GetOriginalHeight( nStartRow, nTab ); - aAny <<= (sal_Int32)TwipsToHMM(nHeight); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_CELLVIS ) ) - { - SCROW nLastRow; - bool bVis = !pDoc->RowHidden(nStartRow, nTab, NULL, &nLastRow); - ScUnoHelpFunctions::SetBoolInAny( aAny, bVis ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_CELLFILT ) ) - { - bool bVis = pDoc->RowFiltered(nStartRow, nTab); - ScUnoHelpFunctions::SetBoolInAny( aAny, bVis ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_OHEIGHT ) ) - { - sal_Bool bOpt = !(pDoc->GetRowFlags( nStartRow, nTab ) & CR_MANUALSIZE); - ScUnoHelpFunctions::SetBoolInAny( aAny, bOpt ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_NEWPAGE ) ) - { - ScBreakType nBreak = pDoc->HasRowBreak(nStartRow, nTab); - ScUnoHelpFunctions::SetBoolInAny( aAny, nBreak ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_MANPAGE ) ) - { - ScBreakType nBreak = pDoc->HasRowBreak(nStartRow, nTab); - ScUnoHelpFunctions::SetBoolInAny( aAny, (nBreak & BREAK_MANUAL) ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_CELLBACK ) || aNameString.EqualsAscii( SC_UNONAME_CELLTRAN ) ) - { - // Use ScCellRangeObj to get the property from the cell range - // (for completeness only, this is not used by the XML filter). - - ScRange aRange( 0, nStartRow, nTab, MAXCOL, nEndRow, nTab ); - uno::Reference<beans::XPropertySet> xRangeObj = new ScCellRangeObj( pDocShell, aRange ); - aAny = xRangeObj->getPropertyValue( aPropertyName ); - } - - return aAny; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScTableRowsObj ) - -//------------------------------------------------------------------------ - -ScSpreadsheetSettingsObj::~ScSpreadsheetSettingsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScSpreadsheetSettingsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScSpreadsheetSettingsObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - //! muss noch - return NULL; -} - -void SAL_CALL ScSpreadsheetSettingsObj::setPropertyValue( - const rtl::OUString& /* aPropertyName */, const uno::Any& /* aValue */ ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - //! muss noch -} - -uno::Any SAL_CALL ScSpreadsheetSettingsObj::getPropertyValue( const rtl::OUString& /* aPropertyName */ ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - //! muss noch - return uno::Any(); -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScSpreadsheetSettingsObj ) - -//------------------------------------------------------------------------ - -ScAnnotationsObj::ScAnnotationsObj(ScDocShell* pDocSh, SCTAB nT) : - pDocShell( pDocSh ), - nTab( nT ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScAnnotationsObj::~ScAnnotationsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScAnnotationsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! nTab bei Referenz-Update anpassen!!! - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -bool ScAnnotationsObj::GetAddressByIndex_Impl( sal_Int32 nIndex, ScAddress& rPos ) const -{ - if (pDocShell) - { - sal_Int32 nFound = 0; - ScDocument* pDoc = pDocShell->GetDocument(); - ScCellIterator aCellIter( pDoc, 0,0, nTab, MAXCOL,MAXROW, nTab ); - for( ScBaseCell* pCell = aCellIter.GetFirst(); pCell; pCell = aCellIter.GetNext() ) - { - if (pCell->HasNote()) - { - if (nFound == nIndex) - { - rPos = ScAddress( aCellIter.GetCol(), aCellIter.GetRow(), aCellIter.GetTab() ); - return true; - } - ++nFound; - } - } - } - return false; -} - -ScAnnotationObj* ScAnnotationsObj::GetObjectByIndex_Impl( sal_Int32 nIndex ) const -{ - if (pDocShell) - { - ScAddress aPos; - if ( GetAddressByIndex_Impl( nIndex, aPos ) ) - return new ScAnnotationObj( pDocShell, aPos ); - } - return NULL; -} - -// XSheetAnnotations - -void SAL_CALL ScAnnotationsObj::insertNew( - const table::CellAddress& aPosition, const ::rtl::OUString& rText ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - OSL_ENSURE( aPosition.Sheet == nTab, "addAnnotation mit falschem Sheet" ); - ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, nTab ); - - ScDocFunc aFunc( *pDocShell ); - aFunc.ReplaceNote( aPos, rText, 0, 0, sal_True ); - } -} - -void SAL_CALL ScAnnotationsObj::removeByIndex( sal_Int32 nIndex ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScAddress aPos; - if ( GetAddressByIndex_Impl( nIndex, aPos ) ) - { - ScMarkData aMarkData; - aMarkData.SelectTable( aPos.Tab(), sal_True ); - aMarkData.SetMultiMarkArea( ScRange(aPos) ); - - ScDocFunc aFunc(*pDocShell); - aFunc.DeleteContents( aMarkData, IDF_NOTE, sal_True, sal_True ); - } - } -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScAnnotationsObj::createEnumeration() - throw(uno::RuntimeException) -{ - //! iterate directly (more efficiently)? - - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.CellAnnotationsEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScAnnotationsObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uLong nCount = 0; - if (pDocShell) - { - ScCellIterator aCellIter( pDocShell->GetDocument(), 0,0, nTab, MAXCOL,MAXROW, nTab ); - for( ScBaseCell* pCell = aCellIter.GetFirst(); pCell; pCell = aCellIter.GetNext() ) - if (pCell->HasNote()) - ++nCount; - } - return nCount; -} - -uno::Any SAL_CALL ScAnnotationsObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XSheetAnnotation> xAnnotation(GetObjectByIndex_Impl(nIndex)); - if (xAnnotation.is()) - return uno::makeAny(xAnnotation); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScAnnotationsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<sheet::XSheetAnnotation>*)0); -} - -sal_Bool SAL_CALL ScAnnotationsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -//------------------------------------------------------------------------ - -ScScenariosObj::ScScenariosObj(ScDocShell* pDocSh, SCTAB nT) : - pDocShell( pDocSh ), - nTab ( nT ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScScenariosObj::~ScScenariosObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScScenariosObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - //! Referenz-Update fuer Tab und Start/Ende - } - else if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XScenarios - -sal_Bool ScScenariosObj::GetScenarioIndex_Impl( const rtl::OUString& rName, SCTAB& rIndex ) -{ - //! Case-insensitiv ???? - - if ( pDocShell ) - { - String aString(rName); - - String aTabName; - ScDocument* pDoc = pDocShell->GetDocument(); - SCTAB nCount = (SCTAB)getCount(); - for (SCTAB i=0; i<nCount; i++) - if (pDoc->GetName( nTab+i+1, aTabName )) - if ( aTabName == aString ) - { - rIndex = i; - return sal_True; - } - } - - return false; -} - -ScTableSheetObj* ScScenariosObj::GetObjectByIndex_Impl(sal_Int32 nIndex) -{ - sal_uInt16 nCount = (sal_uInt16)getCount(); - if ( pDocShell && nIndex >= 0 && nIndex < nCount ) - return new ScTableSheetObj( pDocShell, nTab+static_cast<SCTAB>(nIndex)+1 ); - - return NULL; // kein Dokument oder falscher Index -} - -ScTableSheetObj* ScScenariosObj::GetObjectByName_Impl(const rtl::OUString& aName) -{ - SCTAB nIndex; - if ( pDocShell && GetScenarioIndex_Impl( aName, nIndex ) ) - return new ScTableSheetObj( pDocShell, nTab+nIndex+1 ); - - return NULL; // nicht gefunden -} - -void SAL_CALL ScScenariosObj::addNewByName( const rtl::OUString& aName, - const uno::Sequence<table::CellRangeAddress>& aRanges, - const rtl::OUString& aComment ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell ) - { - ScMarkData aMarkData; - aMarkData.SelectTable( nTab, sal_True ); - - sal_uInt16 nRangeCount = (sal_uInt16)aRanges.getLength(); - if (nRangeCount) - { - const table::CellRangeAddress* pAry = aRanges.getConstArray(); - for (sal_uInt16 i=0; i<nRangeCount; i++) - { - OSL_ENSURE( pAry[i].Sheet == nTab, "addScenario mit falscher Tab" ); - ScRange aRange( (SCCOL)pAry[i].StartColumn, (SCROW)pAry[i].StartRow, nTab, - (SCCOL)pAry[i].EndColumn, (SCROW)pAry[i].EndRow, nTab ); - - aMarkData.SetMultiMarkArea( aRange ); - } - } - - String aNameStr(aName); - String aCommStr(aComment); - - Color aColor( COL_LIGHTGRAY ); // Default - sal_uInt16 nFlags = SC_SCENARIO_SHOWFRAME | SC_SCENARIO_PRINTFRAME | SC_SCENARIO_TWOWAY | SC_SCENARIO_PROTECT; - - pDocShell->MakeScenario( nTab, aNameStr, aCommStr, aColor, nFlags, aMarkData ); - } -} - -void SAL_CALL ScScenariosObj::removeByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SCTAB nIndex; - if ( pDocShell && GetScenarioIndex_Impl( aName, nIndex ) ) - { - ScDocFunc aFunc(*pDocShell); - aFunc.DeleteTable( nTab+nIndex+1, sal_True, sal_True ); - } -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScScenariosObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.ScenariosEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScScenariosObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SCTAB nCount = 0; - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if (!pDoc->IsScenario(nTab)) - { - SCTAB nTabCount = pDoc->GetTableCount(); - SCTAB nNext = nTab + 1; - while (nNext < nTabCount && pDoc->IsScenario(nNext)) - { - ++nCount; - ++nNext; - } - } - } - return nCount; -} - -uno::Any SAL_CALL ScScenariosObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XScenario> xScen(GetObjectByIndex_Impl(nIndex)); - if (xScen.is()) - return uno::makeAny(xScen); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScScenariosObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<sheet::XScenario>*)0); -} - -sal_Bool SAL_CALL ScScenariosObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -uno::Any SAL_CALL ScScenariosObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XScenario> xScen(GetObjectByName_Impl(aName)); - if (xScen.is()) - return uno::makeAny(xScen); - else - throw container::NoSuchElementException(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScScenariosObj::getElementNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SCTAB nCount = (SCTAB)getCount(); - uno::Sequence<rtl::OUString> aSeq(nCount); - - if ( pDocShell ) // sonst ist auch Count = 0 - { - String aTabName; - ScDocument* pDoc = pDocShell->GetDocument(); - rtl::OUString* pAry = aSeq.getArray(); - for (SCTAB i=0; i<nCount; i++) - if (pDoc->GetName( nTab+i+1, aTabName )) - pAry[i] = aTabName; - } - - return aSeq; -} - -sal_Bool SAL_CALL ScScenariosObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SCTAB nIndex; - return GetScenarioIndex_Impl( aName, nIndex ); -} - - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/drdefuno.cxx b/sc/source/ui/unoobj/drdefuno.cxx deleted file mode 100644 index 3cee45eae..000000000 --- a/sc/source/ui/unoobj/drdefuno.cxx +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include "drdefuno.hxx" -#include "docsh.hxx" -#include "drwlayer.hxx" - -using namespace ::com::sun::star; - -//------------------------------------------------------------------------ - -ScDrawDefaultsObj::ScDrawDefaultsObj(ScDocShell* pDocSh) : - SvxUnoDrawPool( NULL ), - pDocShell( pDocSh ) -{ - // SvxUnoDrawPool is initialized without model, - // draw layer is created on demand in getModelPool - - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDrawDefaultsObj::~ScDrawDefaultsObj() throw () -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScDrawDefaultsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // document gone - } -} - -SfxItemPool* ScDrawDefaultsObj::getModelPool( sal_Bool bReadOnly ) throw() -{ - SfxItemPool* pRet = NULL; - if ( pDocShell ) - { - ScDrawLayer* pModel = bReadOnly ? - pDocShell->GetDocument()->GetDrawLayer() : - pDocShell->MakeDrawLayer(); - if ( pModel ) - pRet = &pModel->GetItemPool(); - } - if ( !pRet ) - pRet = SvxUnoDrawPool::getModelPool( bReadOnly ); // uses default pool - - return pRet; -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/editsrc.cxx b/sc/source/ui/unoobj/editsrc.cxx deleted file mode 100644 index 4c567f118..000000000 --- a/sc/source/ui/unoobj/editsrc.cxx +++ /dev/null @@ -1,373 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "editsrc.hxx" - -#include "scitems.hxx" -#include <editeng/eeitem.hxx> -#include <editeng/unofored.hxx> -#include <vcl/svapp.hxx> -#include <svx/svdpage.hxx> -#include <svx/svditer.hxx> -#include <svx/svdocapt.hxx> -#include <editeng/outlobj.hxx> -#include <editeng/editobj.hxx> -#include <editeng/outliner.hxx> -#include "textuno.hxx" -#include "editutil.hxx" -#include "docsh.hxx" -#include "docfunc.hxx" -#include "hints.hxx" -#include "patattr.hxx" -#include "drwlayer.hxx" -#include "userdat.hxx" -#include "postit.hxx" -#include "AccessibleText.hxx" - -//------------------------------------------------------------------------ - -TYPEINIT1( ScHeaderFooterChangedHint, SfxHint ); - -ScHeaderFooterChangedHint::ScHeaderFooterChangedHint(sal_uInt16 nP) : - nPart( nP ) -{ -} - -ScHeaderFooterChangedHint::~ScHeaderFooterChangedHint() -{ -} - -//------------------------------------------------------------------------ - -ScSharedHeaderFooterEditSource::ScSharedHeaderFooterEditSource( ScHeaderFooterTextData* pData ) : - pTextData( pData ) -{ - // pTextData is held by the ScHeaderFooterTextObj. - // Text range and cursor keep a reference to their parent text, so the text object is - // always alive and the TextData is valid as long as there are children. -} - -ScSharedHeaderFooterEditSource::~ScSharedHeaderFooterEditSource() -{ -} - -SvxEditSource* ScSharedHeaderFooterEditSource::Clone() const -{ - return new ScSharedHeaderFooterEditSource( pTextData ); -} - -SvxTextForwarder* ScSharedHeaderFooterEditSource::GetTextForwarder() -{ - return pTextData->GetTextForwarder(); -} - -void ScSharedHeaderFooterEditSource::UpdateData() -{ - pTextData->UpdateData(); -} - -ScEditEngineDefaulter* ScSharedHeaderFooterEditSource::GetEditEngine() -{ - return pTextData->GetEditEngine(); -} - -//------------------------------------------------------------------------ - -// each ScHeaderFooterEditSource object has its own ScHeaderFooterTextData - -ScHeaderFooterEditSource::ScHeaderFooterEditSource( ScHeaderFooterContentObj* pContent, - sal_uInt16 nP ) : - ScSharedHeaderFooterEditSource( new ScHeaderFooterTextData( *pContent, nP ) ) -{ -} - -ScHeaderFooterEditSource::ScHeaderFooterEditSource( ScHeaderFooterContentObj& rContent, - sal_uInt16 nP ) : - ScSharedHeaderFooterEditSource( new ScHeaderFooterTextData( rContent, nP ) ) -{ -} - -ScHeaderFooterEditSource::~ScHeaderFooterEditSource() -{ - delete GetTextData(); // not accessed in ScSharedHeaderFooterEditSource dtor -} - -SvxEditSource* ScHeaderFooterEditSource::Clone() const -{ - const ScHeaderFooterTextData* pData = GetTextData(); - return new ScHeaderFooterEditSource( pData->GetContentObj(), pData->GetPart() ); -} - -//------------------------------------------------------------------------ - -ScSharedCellEditSource::ScSharedCellEditSource( ScCellTextData* pData ) : - pCellTextData( pData ) -{ - // pCellTextData is part of the ScCellTextObj. - // Text range and cursor keep a reference to their parent text, so the text object is - // always alive and the CellTextData is valid as long as there are children. -} - -ScSharedCellEditSource::~ScSharedCellEditSource() -{ -} - -SvxEditSource* ScSharedCellEditSource::Clone() const -{ - return new ScSharedCellEditSource( pCellTextData ); -} - -SvxTextForwarder* ScSharedCellEditSource::GetTextForwarder() -{ - return pCellTextData->GetTextForwarder(); -} - -void ScSharedCellEditSource::UpdateData() -{ - pCellTextData->UpdateData(); -} - -void ScSharedCellEditSource::SetDoUpdateData(sal_Bool bValue) -{ - pCellTextData->SetDoUpdate(bValue); -} - -sal_Bool ScSharedCellEditSource::IsDirty() const -{ - return pCellTextData->IsDirty(); -} - -ScEditEngineDefaulter* ScSharedCellEditSource::GetEditEngine() -{ - return pCellTextData->GetEditEngine(); -} - -//------------------------------------------------------------------------ - -// each ScCellEditSource object has its own ScCellTextData - -ScCellEditSource::ScCellEditSource( ScDocShell* pDocSh, const ScAddress& rP ) : - ScSharedCellEditSource( new ScCellTextData( pDocSh, rP ) ) -{ -} - -ScCellEditSource::~ScCellEditSource() -{ - delete GetCellTextData(); // not accessed in ScSharedCellEditSource dtor -} - -SvxEditSource* ScCellEditSource::Clone() const -{ - const ScCellTextData* pData = GetCellTextData(); - return new ScCellEditSource( pData->GetDocShell(), pData->GetCellPos() ); -} - -//------------------------------------------------------------------------ - -ScAnnotationEditSource::ScAnnotationEditSource(ScDocShell* pDocSh, const ScAddress& rP) : - pDocShell( pDocSh ), - aCellPos( rP ), - pEditEngine( NULL ), - pForwarder( NULL ), - bDataValid( false ) -{ - if (pDocShell) - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScAnnotationEditSource::~ScAnnotationEditSource() -{ - SolarMutexGuard aGuard; // needed for EditEngine dtor - - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); - - delete pForwarder; - delete pEditEngine; -} - -SvxEditSource* ScAnnotationEditSource::Clone() const -{ - return new ScAnnotationEditSource( pDocShell, aCellPos ); -} - -SdrObject* ScAnnotationEditSource::GetCaptionObj() -{ - ScPostIt* pNote = pDocShell->GetDocument()->GetNote( aCellPos ); - return pNote ? pNote->GetOrCreateCaption( aCellPos ) : 0; -} - -SvxTextForwarder* ScAnnotationEditSource::GetTextForwarder() -{ - if (!pEditEngine) - { - // Notizen haben keine Felder - if ( pDocShell ) - { - pEditEngine = new ScNoteEditEngine( pDocShell->GetDocument()->GetNoteEngine() ); - } - else - { - SfxItemPool* pEnginePool = EditEngine::CreatePool(); - pEnginePool->FreezeIdRanges(); - pEditEngine = new ScEditEngineDefaulter( pEnginePool, sal_True ); - } - pForwarder = new SvxEditEngineForwarder(*pEditEngine); - } - - if (bDataValid) - return pForwarder; - - if ( pDocShell ) - if ( ScPostIt* pNote = pDocShell->GetDocument()->GetNote( aCellPos ) ) - if ( const EditTextObject* pEditObj = pNote->GetEditTextObject() ) - pEditEngine->SetText( *pEditObj ); // incl. Umbrueche - - bDataValid = sal_True; - return pForwarder; -} - -void ScAnnotationEditSource::UpdateData() -{ - if ( pDocShell && pEditEngine ) - { - ScDocShellModificator aModificator( *pDocShell ); - - if( SdrObject* pObj = GetCaptionObj() ) - { - EditTextObject* pEditObj = pEditEngine->CreateTextObject(); - OutlinerParaObject* pOPO = new OutlinerParaObject( *pEditObj ); - delete pEditObj; - pOPO->SetOutlinerMode( OUTLINERMODE_TEXTOBJECT ); - pObj->NbcSetOutlinerParaObject( pOPO ); - pObj->ActionChanged(); - } - - //! Undo !!! - - aModificator.SetDocumentModified(); - - // bDataValid wird bei SetDocumentModified zurueckgesetzt - } -} - -void ScAnnotationEditSource::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - //! Ref-Update - } - else if ( rHint.ISA( SfxSimpleHint ) ) - { - sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); - if ( nId == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - - DELETEZ( pForwarder ); - DELETEZ( pEditEngine ); // EditEngine uses document's pool - } - else if ( nId == SFX_HINT_DATACHANGED ) - bDataValid = false; // Text muss neu geholt werden - } -} - -//------------------------------------------------------------------------ - -ScSimpleEditSource::ScSimpleEditSource( SvxTextForwarder* pForw ) : - pForwarder( pForw ) -{ - // The same forwarder (and EditEngine) is shared by all children of the same Text object. - // Text range and cursor keep a reference to their parent text, so the text object is - // always alive and the forwarder is valid as long as there are children. -} - -ScSimpleEditSource::~ScSimpleEditSource() -{ -} - -SvxEditSource* ScSimpleEditSource::Clone() const -{ - return new ScSimpleEditSource( pForwarder ); -} - -SvxTextForwarder* ScSimpleEditSource::GetTextForwarder() -{ - return pForwarder; -} - -void ScSimpleEditSource::UpdateData() -{ - // nothing -} - -//------------------------------------------------------------------------ - -ScAccessibilityEditSource::ScAccessibilityEditSource( ::std::auto_ptr < ScAccessibleTextData > pAccessibleCellTextData ) - : mpAccessibleTextData(pAccessibleCellTextData) -{ -} - -ScAccessibilityEditSource::~ScAccessibilityEditSource() -{ -} - -SvxEditSource* ScAccessibilityEditSource::Clone() const -{ - return new ScAccessibilityEditSource(::std::auto_ptr < ScAccessibleTextData > (mpAccessibleTextData->Clone())); -} - -SvxTextForwarder* ScAccessibilityEditSource::GetTextForwarder() -{ - return mpAccessibleTextData->GetTextForwarder(); -} - -SvxViewForwarder* ScAccessibilityEditSource::GetViewForwarder() -{ - return mpAccessibleTextData->GetViewForwarder(); -} - -SvxEditViewForwarder* ScAccessibilityEditSource::GetEditViewForwarder( sal_Bool bCreate ) -{ - return mpAccessibleTextData->GetEditViewForwarder(bCreate); -} - -void ScAccessibilityEditSource::UpdateData() -{ - mpAccessibleTextData->UpdateData(); -} - -SfxBroadcaster& ScAccessibilityEditSource::GetBroadcaster() const -{ - return mpAccessibleTextData->GetBroadcaster(); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/eventuno.cxx b/sc/source/ui/unoobj/eventuno.cxx deleted file mode 100644 index fa0f28f30..000000000 --- a/sc/source/ui/unoobj/eventuno.cxx +++ /dev/null @@ -1,200 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "eventuno.hxx" -#include "miscuno.hxx" -#include "docsh.hxx" -#include "sheetevents.hxx" -#include "unonames.hxx" -#include <vcl/svapp.hxx> - -using namespace ::com::sun::star; - -//------------------------------------------------------------------------ - -SC_SIMPLE_SERVICE_INFO( ScSheetEventsObj, "ScSheetEventsObj", "com.sun.star.document.Events" ) - -//------------------------------------------------------------------------ - -ScSheetEventsObj::ScSheetEventsObj(ScDocShell* pDocSh, SCTAB nT) : - mpDocShell( pDocSh ), - mnTab( nT ) -{ - mpDocShell->GetDocument()->AddUnoObject(*this); -} - -ScSheetEventsObj::~ScSheetEventsObj() -{ - if (mpDocShell) - mpDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScSheetEventsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! reference update - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - mpDocShell = NULL; - } -} - -sal_Int32 lcl_GetEventFromName( const rtl::OUString& aName ) -{ - for (sal_Int32 nEvent=0; nEvent<SC_SHEETEVENT_COUNT; ++nEvent) - if ( aName == ScSheetEvents::GetEventName(nEvent) ) - return nEvent; - - return -1; // not found -} - -// XNameReplace - -void SAL_CALL ScSheetEventsObj::replaceByName( const rtl::OUString& aName, const uno::Any& aElement ) - throw(lang::IllegalArgumentException, container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!mpDocShell) - throw uno::RuntimeException(); - - sal_Int32 nEvent = lcl_GetEventFromName(aName); - if (nEvent < 0) - throw container::NoSuchElementException(); - - ScSheetEvents aNewEvents; - const ScSheetEvents* pOldEvents = mpDocShell->GetDocument()->GetSheetEvents(mnTab); - if (pOldEvents) - aNewEvents = *pOldEvents; - - rtl::OUString aScript; - if ( aElement.hasValue() ) // empty Any -> reset event - { - uno::Sequence<beans::PropertyValue> aPropSeq; - if ( aElement >>= aPropSeq ) - { - sal_Int32 nPropCount = aPropSeq.getLength(); - for (sal_Int32 nPos=0; nPos<nPropCount; ++nPos) - { - const beans::PropertyValue& rProp = aPropSeq[nPos]; - if ( rProp.Name.compareToAscii( SC_UNO_EVENTTYPE ) == 0 ) - { - rtl::OUString aEventType; - if ( rProp.Value >>= aEventType ) - { - // only "Script" is supported - if ( aEventType.compareToAscii( SC_UNO_SCRIPT ) != 0 ) - throw lang::IllegalArgumentException(); - } - } - else if ( rProp.Name.compareToAscii( SC_UNO_SCRIPT ) == 0 ) - rProp.Value >>= aScript; - } - } - } - if (aScript.getLength()) - aNewEvents.SetScript( nEvent, &aScript ); - else - aNewEvents.SetScript( nEvent, NULL ); // reset - - mpDocShell->GetDocument()->SetSheetEvents( mnTab, &aNewEvents ); - mpDocShell->SetDocumentModified(); -} - -// XNameAccess - -uno::Any SAL_CALL ScSheetEventsObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Int32 nEvent = lcl_GetEventFromName(aName); - if (nEvent < 0) - throw container::NoSuchElementException(); - - const rtl::OUString* pScript = NULL; - if (mpDocShell) - { - const ScSheetEvents* pEvents = mpDocShell->GetDocument()->GetSheetEvents(mnTab); - if (pEvents) - pScript = pEvents->GetScript(nEvent); - } - - uno::Any aRet; - if (pScript) - { - uno::Sequence<beans::PropertyValue> aPropSeq( 2 ); - aPropSeq[0] = beans::PropertyValue( - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EventType")), -1, - uno::makeAny( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Script")) ), beans::PropertyState_DIRECT_VALUE ); - aPropSeq[1] = beans::PropertyValue( - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Script")), -1, - uno::makeAny( *pScript ), beans::PropertyState_DIRECT_VALUE ); - aRet <<= aPropSeq; - } - // empty Any if nothing was set - return aRet; -} - -uno::Sequence<rtl::OUString> SAL_CALL ScSheetEventsObj::getElementNames() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Sequence<rtl::OUString> aNames(SC_SHEETEVENT_COUNT); - for (sal_Int32 nEvent=0; nEvent<SC_SHEETEVENT_COUNT; ++nEvent) - aNames[nEvent] = ScSheetEvents::GetEventName(nEvent); - return aNames; -} - -sal_Bool SAL_CALL ScSheetEventsObj::hasByName( const ::rtl::OUString& aName ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Int32 nEvent = lcl_GetEventFromName(aName); - return (nEvent >= 0); -} - -// XElementAccess - -uno::Type SAL_CALL ScSheetEventsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Sequence<beans::PropertyValue>*)0); -} - -sal_Bool SAL_CALL ScSheetEventsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (mpDocShell) - return sal_True; - return false; -} - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/fielduno.cxx b/sc/source/ui/unoobj/fielduno.cxx deleted file mode 100644 index 45f66149f..000000000 --- a/sc/source/ui/unoobj/fielduno.cxx +++ /dev/null @@ -1,1500 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" -#include <svl/smplhint.hxx> -#include <vcl/svapp.hxx> - - -#include <editeng/eeitem.hxx> - -#include <editeng/editeng.hxx> -#include <editeng/editobj.hxx> -#include <editeng/flditem.hxx> -#include <comphelper/servicehelper.hxx> - -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <com/sun/star/text/TextContentAnchorType.hpp> -#include <com/sun/star/text/WrapTextMode.hpp> -#include <com/sun/star/text/FilenameDisplayFormat.hpp> - -#include "fielduno.hxx" -#include "textuno.hxx" -#include "miscuno.hxx" -#include "docsh.hxx" -#include "hints.hxx" -#include "editsrc.hxx" -#include "cellsuno.hxx" -#include "servuno.hxx" // fuer IDs -#include "unonames.hxx" -#include "editutil.hxx" - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -// alles ohne Which-ID, Map nur fuer PropertySetInfo - -const SfxItemPropertySet* lcl_GetURLPropertySet() -{ - static SfxItemPropertyMapEntry aURLPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ANCTYPE), 0, &getCppuType((text::TextContentAnchorType*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ANCTYPES), 0, &getCppuType((uno::Sequence<text::TextContentAnchorType>*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_REPR), 0, &getCppuType((rtl::OUString*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_TARGET), 0, &getCppuType((rtl::OUString*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_TEXTWRAP), 0, &getCppuType((text::WrapTextMode*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_URL), 0, &getCppuType((rtl::OUString*)0), 0, 0}, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aURLPropertySet_Impl( aURLPropertyMap_Impl ); - return &aURLPropertySet_Impl; -} - -const SfxItemPropertySet* lcl_GetHeaderFieldPropertySet() -{ - static SfxItemPropertyMapEntry aHeaderFieldPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ANCTYPE), 0, &getCppuType((text::TextContentAnchorType*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ANCTYPES), 0, &getCppuType((uno::Sequence<text::TextContentAnchorType>*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TEXTWRAP), 0, &getCppuType((text::WrapTextMode*)0), beans::PropertyAttribute::READONLY, 0 }, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aHeaderFieldPropertySet_Impl( aHeaderFieldPropertyMap_Impl ); - return &aHeaderFieldPropertySet_Impl; -} - -const SfxItemPropertySet* lcl_GetFileFieldPropertySet() -{ - static SfxItemPropertyMapEntry aFileFieldPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ANCTYPE), 0, &getCppuType((text::TextContentAnchorType*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ANCTYPES), 0, &getCppuType((uno::Sequence<text::TextContentAnchorType>*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_FILEFORM), 0, &getCppuType((sal_Int16*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TEXTWRAP), 0, &getCppuType((text::WrapTextMode*)0), beans::PropertyAttribute::READONLY, 0 }, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aFileFieldPropertySet_Impl( aFileFieldPropertyMap_Impl ); - return &aFileFieldPropertySet_Impl; -} - -//------------------------------------------------------------------------ - -#define SCTEXTFIELD_SERVICE "com.sun.star.text.TextField" -#define SCTEXTCONTENT_SERVICE "com.sun.star.text.TextContent" - -SC_SIMPLE_SERVICE_INFO( ScCellFieldsObj, "ScCellFieldsObj", "com.sun.star.text.TextFields" ) -SC_SIMPLE_SERVICE_INFO( ScHeaderFieldsObj, "ScHeaderFieldsObj", "com.sun.star.text.TextFields" ) - -//------------------------------------------------------------------------ - -// ScUnoEditEngine nur um aus einer EditEngine die Felder herauszubekommen... - -enum ScUnoCollectMode -{ - SC_UNO_COLLECT_NONE, - SC_UNO_COLLECT_COUNT, - SC_UNO_COLLECT_FINDINDEX, - SC_UNO_COLLECT_FINDPOS -}; - -class ScUnoEditEngine : public ScEditEngineDefaulter -{ - ScUnoCollectMode eMode; - sal_uInt16 nFieldCount; - TypeId aFieldType; - SvxFieldData* pFound; // lokale Kopie - sal_uInt16 nFieldPar; - xub_StrLen nFieldPos; - sal_uInt16 nFieldIndex; - -public: - ScUnoEditEngine(ScEditEngineDefaulter* pSource); - ~ScUnoEditEngine(); - - //! nPos should be xub_StrLen - virtual String CalcFieldValue( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos, - Color*& rTxtColor, Color*& rFldColor ); - - sal_uInt16 CountFields(TypeId aType); - SvxFieldData* FindByIndex(sal_uInt16 nIndex, TypeId aType); - SvxFieldData* FindByPos(sal_uInt16 nPar, xub_StrLen nPos, TypeId aType); - - sal_uInt16 GetFieldPar() const { return nFieldPar; } - xub_StrLen GetFieldPos() const { return nFieldPos; } -}; - -ScUnoEditEngine::ScUnoEditEngine(ScEditEngineDefaulter* pSource) : - ScEditEngineDefaulter( *pSource ), - eMode( SC_UNO_COLLECT_NONE ), - nFieldCount( 0 ), - aFieldType( NULL ), - pFound( NULL ) -{ - if (pSource) - { - EditTextObject* pData = pSource->CreateTextObject(); - SetText( *pData ); - delete pData; - } -} - -ScUnoEditEngine::~ScUnoEditEngine() -{ - delete pFound; -} - -String ScUnoEditEngine::CalcFieldValue( const SvxFieldItem& rField, - sal_uInt16 nPara, sal_uInt16 nPos, Color*& rTxtColor, Color*& rFldColor ) -{ - String aRet(EditEngine::CalcFieldValue( rField, nPara, nPos, rTxtColor, rFldColor )); - if (eMode != SC_UNO_COLLECT_NONE) - { - const SvxFieldData* pFieldData = rField.GetField(); - if ( pFieldData ) - { - if ( !aFieldType || pFieldData->Type() == aFieldType ) - { - if ( eMode == SC_UNO_COLLECT_FINDINDEX && !pFound && nFieldCount == nFieldIndex ) - { - pFound = pFieldData->Clone(); - nFieldPar = nPara; - nFieldPos = nPos; - } - if ( eMode == SC_UNO_COLLECT_FINDPOS && !pFound && - nPara == nFieldPar && nPos == nFieldPos ) - { - pFound = pFieldData->Clone(); - nFieldIndex = nFieldCount; - } - ++nFieldCount; - } - } - } - return aRet; -} - -sal_uInt16 ScUnoEditEngine::CountFields(TypeId aType) -{ - eMode = SC_UNO_COLLECT_COUNT; - aFieldType = aType; - nFieldCount = 0; - UpdateFields(); - aFieldType = NULL; - eMode = SC_UNO_COLLECT_NONE; - - return nFieldCount; -} - -SvxFieldData* ScUnoEditEngine::FindByIndex(sal_uInt16 nIndex, TypeId aType) -{ - eMode = SC_UNO_COLLECT_FINDINDEX; - nFieldIndex = nIndex; - aFieldType = aType; - nFieldCount = 0; - UpdateFields(); - aFieldType = NULL; - eMode = SC_UNO_COLLECT_NONE; - - return pFound; -} - -SvxFieldData* ScUnoEditEngine::FindByPos(sal_uInt16 nPar, xub_StrLen nPos, TypeId aType) -{ - eMode = SC_UNO_COLLECT_FINDPOS; - nFieldPar = nPar; - nFieldPos = nPos; - aFieldType = aType; - nFieldCount = 0; - UpdateFields(); - aFieldType = NULL; - eMode = SC_UNO_COLLECT_NONE; - - return pFound; -} - -//------------------------------------------------------------------------ - -ScCellFieldsObj::ScCellFieldsObj(ScDocShell* pDocSh, const ScAddress& rPos) : - pDocShell( pDocSh ), - aCellPos( rPos ), - mpRefreshListeners( NULL ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); - - pEditSource = new ScCellEditSource( pDocShell, aCellPos ); -} - -ScCellFieldsObj::~ScCellFieldsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); - - delete pEditSource; - - // increment refcount to prevent double call off dtor - osl_incrementInterlockedCount( &m_refCount ); - - if (mpRefreshListeners) - { - lang::EventObject aEvent; - aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); - if (mpRefreshListeners) - { - mpRefreshListeners->disposeAndClear(aEvent); - DELETEZ( mpRefreshListeners ); - } - } -} - -void ScCellFieldsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { - //! Ref-Update - } - else if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } - - // EditSource hat sich selber als Listener angemeldet -} - -// XIndexAccess (via XTextFields) - -ScCellFieldObj* ScCellFieldsObj::GetObjectByIndex_Impl(sal_Int32 Index) const -{ - //! Feld-Funktionen muessen an den Forwarder !!! - ScEditEngineDefaulter* pEditEngine = ((ScCellEditSource*)pEditSource)->GetEditEngine(); - ScUnoEditEngine aTempEngine(pEditEngine); - - if ( aTempEngine.FindByIndex( (sal_uInt16)Index, NULL ) ) // in der Zelle ist der Typ egal - { - sal_uInt16 nPar = aTempEngine.GetFieldPar(); - xub_StrLen nPos = aTempEngine.GetFieldPos(); - ESelection aSelection( nPar, nPos, nPar, nPos+1 ); // Feld ist 1 Zeichen - return new ScCellFieldObj( pDocShell, aCellPos, aSelection ); - } - return NULL; -} - -sal_Int32 SAL_CALL ScCellFieldsObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! Feld-Funktionen muessen an den Forwarder !!! - ScEditEngineDefaulter* pEditEngine = ((ScCellEditSource*)pEditSource)->GetEditEngine(); - ScUnoEditEngine aTempEngine(pEditEngine); - - return aTempEngine.CountFields(NULL); // Felder zaehlen, in Zelle ist der Typ egal -} - -uno::Any SAL_CALL ScCellFieldsObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<text::XTextField> xField(GetObjectByIndex_Impl(nIndex)); - if (xField.is()) - return uno::makeAny(xField); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScCellFieldsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<text::XTextField>*)0); -} - -sal_Bool SAL_CALL ScCellFieldsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -uno::Reference<container::XEnumeration> SAL_CALL ScCellFieldsObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextFieldEnumeration"))); -} - -void SAL_CALL ScCellFieldsObj::addContainerListener( - const uno::Reference<container::XContainerListener>& /* xListener */ ) - throw(uno::RuntimeException) -{ - OSL_FAIL("not implemented"); -} - -void SAL_CALL ScCellFieldsObj::removeContainerListener( - const uno::Reference<container::XContainerListener>& /* xListener */ ) - throw(uno::RuntimeException) -{ - OSL_FAIL("not implemented"); -} - -// XRefreshable -void SAL_CALL ScCellFieldsObj::refresh( ) - throw (uno::RuntimeException) -{ - if (mpRefreshListeners) - { - // Call all listeners. - uno::Sequence< uno::Reference< uno::XInterface > > aListeners(mpRefreshListeners->getElements()); - sal_uInt32 nLength(aListeners.getLength()); - if (nLength) - { - const uno::Reference< uno::XInterface >* pInterfaces = aListeners.getConstArray(); - if (pInterfaces) - { - lang::EventObject aEvent; - aEvent.Source.set(uno::Reference< util::XRefreshable >(const_cast<ScCellFieldsObj*>(this))); - sal_uInt32 i(0); - while (i < nLength) - { - try - { - while(i < nLength) - { - static_cast< util::XRefreshListener* >(pInterfaces->get())->refreshed(aEvent); - ++pInterfaces; - ++i; - } - } - catch(uno::RuntimeException&) - { - ++pInterfaces; - ++i; - } - } - } - } - } -} - -void SAL_CALL ScCellFieldsObj::addRefreshListener( const uno::Reference< util::XRefreshListener >& xListener ) - throw (uno::RuntimeException) -{ - if (xListener.is()) - { - SolarMutexGuard aGuard; - if (!mpRefreshListeners) - mpRefreshListeners = new cppu::OInterfaceContainerHelper(aMutex); - mpRefreshListeners->addInterface(xListener); - } -} - -void SAL_CALL ScCellFieldsObj::removeRefreshListener( const uno::Reference<util::XRefreshListener >& xListener ) - throw (uno::RuntimeException) -{ - if (xListener.is()) - { - SolarMutexGuard aGuard; - if (mpRefreshListeners) - mpRefreshListeners->removeInterface(xListener); - } -} - -//------------------------------------------------------------------------ - -// Default-ctor wird fuer SMART_REFLECTION_IMPLEMENTATION gebraucht - - -ScCellFieldObj::ScCellFieldObj(ScDocShell* pDocSh, const ScAddress& rPos, - const ESelection& rSel) : - OComponentHelper( getMutex() ), - pPropSet( lcl_GetURLPropertySet() ), - pDocShell( pDocSh ), - aCellPos( rPos ), - aSelection( rSel ) -{ - // pDocShell ist Null, wenn per ServiceProvider erzeugt - - if (pDocShell) - { - pDocShell->GetDocument()->AddUnoObject(*this); - pEditSource = new ScCellEditSource( pDocShell, aCellPos ); - } - else - pEditSource = NULL; -} - -uno::Any SAL_CALL ScCellFieldObj::queryAggregation( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( text::XTextField ) - SC_QUERYINTERFACE( text::XTextContent ) // parent of XTextField - SC_QUERYINTERFACE( beans::XPropertySet ) - SC_QUERYINTERFACE( lang::XUnoTunnel ) - SC_QUERYINTERFACE( lang::XServiceInfo ) - - return OComponentHelper::queryAggregation( rType ); // XComponent -} - -uno::Sequence<uno::Type> SAL_CALL ScCellFieldObj::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - uno::Sequence<uno::Type> aParentTypes(OComponentHelper::getTypes()); - long nParentLen = aParentTypes.getLength(); - const uno::Type* pParentPtr = aParentTypes.getConstArray(); - - aTypes.realloc( nParentLen + 4 ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[nParentLen + 0] = getCppuType((const uno::Reference<text::XTextField>*)0); - pPtr[nParentLen + 1] = getCppuType((const uno::Reference<beans::XPropertySet>*)0); - pPtr[nParentLen + 2] = getCppuType((const uno::Reference<lang::XUnoTunnel>*)0); - pPtr[nParentLen + 3] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0); - - for (long i=0; i<nParentLen; i++) - pPtr[i] = pParentPtr[i]; // parent types first - } - return aTypes; -} - -namespace -{ - class theScCellFieldObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScCellFieldObjImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScCellFieldObj::getImplementationId() - throw(uno::RuntimeException) -{ - return theScCellFieldObjImplementationId::get().getSeq(); -} - -uno::Any SAL_CALL ScCellFieldObj::queryInterface( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - return OComponentHelper::queryInterface( rType ); -} - -void SAL_CALL ScCellFieldObj::acquire() throw() -{ - OComponentHelper::acquire(); -} - -void SAL_CALL ScCellFieldObj::release() throw() -{ - OComponentHelper::release(); -} - -void ScCellFieldObj::InitDoc( ScDocShell* pDocSh, const ScAddress& rPos, - const ESelection& rSel ) -{ - if ( pDocSh && !pEditSource ) - { - aCellPos = rPos; - aSelection = rSel; - pDocShell = pDocSh; - - pDocShell->GetDocument()->AddUnoObject(*this); - pEditSource = new ScCellEditSource( pDocShell, aCellPos ); - } -} - -ScCellFieldObj::~ScCellFieldObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); - - delete pEditSource; -} - -void ScCellFieldObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! Updates fuer aSelection (muessen erst noch erzeugt werden) !!!!!! - - if ( rHint.ISA( ScUpdateRefHint ) ) - { - //! Ref-Update - } - else if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } - - // EditSource hat sich selber als Listener angemeldet -} - -// per getImplementation gerufen: - -SvxFieldItem ScCellFieldObj::CreateFieldItem() -{ - OSL_ENSURE( !pEditSource, "CreateFieldItem mit eingefuegtem Feld" ); - - SvxURLField aField; - aField.SetFormat(SVXURLFORMAT_APPDEFAULT); - aField.SetURL( aUrl ); - aField.SetRepresentation( aRepresentation ); - aField.SetTargetFrame( aTarget ); - return SvxFieldItem( aField, EE_FEATURE_FIELD ); -} - -void ScCellFieldObj::DeleteField() -{ - if (pEditSource) - { - SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder(); - pForwarder->QuickInsertText( String(), aSelection ); - pEditSource->UpdateData(); - - aSelection.nEndPara = aSelection.nStartPara; - aSelection.nEndPos = aSelection.nStartPos; - - //! Broadcast, um Selektion in anderen Objekten anzupassen - //! (auch bei anderen Aktionen) - } -} - -// XTextField - -rtl::OUString SAL_CALL ScCellFieldObj::getPresentation( sal_Bool bShowCommand ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aRet; - - if (pEditSource) - { - //! Feld-Funktionen muessen an den Forwarder !!! - ScEditEngineDefaulter* pEditEngine = ((ScCellEditSource*)pEditSource)->GetEditEngine(); - ScUnoEditEngine aTempEngine(pEditEngine); - - // Typ egal (in Zellen gibts nur URLs) - SvxFieldData* pField = aTempEngine.FindByPos( aSelection.nStartPara, aSelection.nStartPos, 0 ); - OSL_ENSURE(pField,"getPresentation: Feld nicht gefunden"); - if (pField) - { - SvxURLField* pURL = (SvxURLField*)pField; - if (bShowCommand) - aRet = pURL->GetURL(); - else - aRet = pURL->GetRepresentation(); - } - } - - return aRet; -} - -// XTextContent - -void SAL_CALL ScCellFieldObj::attach( const uno::Reference<text::XTextRange>& xTextRange ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (xTextRange.is()) - { - uno::Reference<text::XText> xText(xTextRange->getText()); - if (xText.is()) - { - xText->insertTextContent( xTextRange, this, sal_True ); - } - } -} - -uno::Reference<text::XTextRange> SAL_CALL ScCellFieldObj::getAnchor() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - return new ScCellObj( pDocShell, aCellPos ); - return NULL; -} - -// XComponent - -void SAL_CALL ScCellFieldObj::dispose() throw(uno::RuntimeException) -{ - OComponentHelper::dispose(); -} - -void SAL_CALL ScCellFieldObj::addEventListener( - const uno::Reference<lang::XEventListener>& xListener ) - throw(uno::RuntimeException) -{ - OComponentHelper::addEventListener( xListener ); -} - -void SAL_CALL ScCellFieldObj::removeEventListener( - const uno::Reference<lang::XEventListener>& xListener ) - throw(uno::RuntimeException) -{ - OComponentHelper::removeEventListener( xListener ); -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellFieldObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef = pPropSet->getPropertySetInfo(); - return aRef; -} - -void SAL_CALL ScCellFieldObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - rtl::OUString aStrVal; - if (pEditSource) - { - //! Feld-Funktionen muessen an den Forwarder !!! - ScEditEngineDefaulter* pEditEngine = ((ScCellEditSource*)pEditSource)->GetEditEngine(); - ScUnoEditEngine aTempEngine(pEditEngine); - - // Typ egal (in Zellen gibts nur URLs) - SvxFieldData* pField = aTempEngine.FindByPos( aSelection.nStartPara, aSelection.nStartPos, 0 ); - OSL_ENSURE(pField,"setPropertyValue: Feld nicht gefunden"); - if (pField) - { - SvxURLField* pURL = (SvxURLField*)pField; // ist eine Kopie in der ScUnoEditEngine - - sal_Bool bOk = sal_True; - if ( aNameString.EqualsAscii( SC_UNONAME_URL ) ) - { - if (aValue >>= aStrVal) - pURL->SetURL( aStrVal ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_REPR ) ) - { - if (aValue >>= aStrVal) - pURL->SetRepresentation( aStrVal ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_TARGET ) ) - { - if (aValue >>= aStrVal) - pURL->SetTargetFrame( aStrVal ); - } - else - bOk = false; - - if (bOk) - { - pEditEngine->QuickInsertField( SvxFieldItem(*pField, EE_FEATURE_FIELD), aSelection ); - pEditSource->UpdateData(); - } - } - } - else // noch nicht eingefuegt - { - if ( aNameString.EqualsAscii( SC_UNONAME_URL ) ) - { - if (aValue >>= aStrVal) - aUrl = String( aStrVal ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_REPR ) ) - { - if (aValue >>= aStrVal) - aRepresentation = String( aStrVal ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_TARGET ) ) - { - if (aValue >>= aStrVal) - aTarget = String( aStrVal ); - } - } -} - -uno::Any SAL_CALL ScCellFieldObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aRet; - String aNameString(aPropertyName); - - // anchor type is always "as character", text wrap always "none" - - if ( aNameString.EqualsAscii( SC_UNONAME_ANCTYPE ) ) - aRet <<= text::TextContentAnchorType_AS_CHARACTER; - else if ( aNameString.EqualsAscii( SC_UNONAME_ANCTYPES ) ) - { - uno::Sequence<text::TextContentAnchorType> aSeq(1); - aSeq[0] = text::TextContentAnchorType_AS_CHARACTER; - aRet <<= aSeq; - } - else if ( aNameString.EqualsAscii( SC_UNONAME_TEXTWRAP ) ) - aRet <<= text::WrapTextMode_NONE; - else if (pEditSource) - { - //! Feld-Funktionen muessen an den Forwarder !!! - ScEditEngineDefaulter* pEditEngine = ((ScCellEditSource*)pEditSource)->GetEditEngine(); - ScUnoEditEngine aTempEngine(pEditEngine); - - // Typ egal (in Zellen gibts nur URLs) - SvxFieldData* pField = aTempEngine.FindByPos( aSelection.nStartPara, aSelection.nStartPos, 0 ); - OSL_ENSURE(pField,"getPropertyValue: Feld nicht gefunden"); - if (pField) - { - SvxURLField* pURL = (SvxURLField*)pField; - - if ( aNameString.EqualsAscii( SC_UNONAME_URL ) ) - aRet <<= rtl::OUString( pURL->GetURL() ); - else if ( aNameString.EqualsAscii( SC_UNONAME_REPR ) ) - aRet <<= rtl::OUString( pURL->GetRepresentation() ); - else if ( aNameString.EqualsAscii( SC_UNONAME_TARGET ) ) - aRet <<= rtl::OUString( pURL->GetTargetFrame() ); - } - } - else // noch nicht eingefuegt - { - if ( aNameString.EqualsAscii( SC_UNONAME_URL ) ) - aRet <<= rtl::OUString( aUrl ); - else if ( aNameString.EqualsAscii( SC_UNONAME_REPR ) ) - aRet <<= rtl::OUString( aRepresentation ); - else if ( aNameString.EqualsAscii( SC_UNONAME_TARGET ) ) - aRet <<= rtl::OUString( aTarget ); - } - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScCellFieldObj ) - -// XUnoTunnel - -sal_Int64 SAL_CALL ScCellFieldObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScCellFieldObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScCellFieldObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScCellFieldObj::getUnoTunnelId() -{ - return theScCellFieldObjUnoTunnelId::get().getSeq(); -} - -ScCellFieldObj* ScCellFieldObj::getImplementation( - const uno::Reference<text::XTextContent> xObj ) -{ - ScCellFieldObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScCellFieldObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -// XServiceInfo - -rtl::OUString SAL_CALL ScCellFieldObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScCellFieldObj" )); -} - -sal_Bool SAL_CALL ScCellFieldObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr( rServiceName ); - return aServiceStr.EqualsAscii( SCTEXTFIELD_SERVICE ) || - aServiceStr.EqualsAscii( SCTEXTCONTENT_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScCellFieldObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(2); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCTEXTFIELD_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCTEXTCONTENT_SERVICE )); - return aRet; -} - -//------------------------------------------------------------------------ - -ScHeaderFieldsObj::ScHeaderFieldsObj(ScHeaderFooterContentObj* pContent, sal_uInt16 nP, sal_uInt16 nT) : - pContentObj( pContent ), - nPart( nP ), - nType( nT ), - mpRefreshListeners( NULL ) -{ - OSL_ENSURE( pContentObj, "ScHeaderFieldsObj ohne Objekt?" ); - - if (pContentObj) - { - pContentObj->acquire(); // darf nicht wegkommen - pEditSource = new ScHeaderFooterEditSource( pContentObj, nPart ); - } - else - pEditSource = NULL; -} - -ScHeaderFieldsObj::~ScHeaderFieldsObj() -{ - delete pEditSource; - - if (pContentObj) - pContentObj->release(); - - // increment refcount to prevent double call off dtor - osl_incrementInterlockedCount( &m_refCount ); - - if (mpRefreshListeners) - { - lang::EventObject aEvent; - aEvent.Source = static_cast<cppu::OWeakObject*>(this); - if (mpRefreshListeners) - { - mpRefreshListeners->disposeAndClear(aEvent); - DELETEZ( mpRefreshListeners ); - } - } -} - -// XIndexAccess (via XTextFields) - -ScHeaderFieldObj* ScHeaderFieldsObj::GetObjectByIndex_Impl(sal_Int32 Index) const -{ - //! Feld-Funktionen muessen an den Forwarder !!! - ScEditEngineDefaulter* pEditEngine = ((ScHeaderFooterEditSource*)pEditSource)->GetEditEngine(); - ScUnoEditEngine aTempEngine(pEditEngine); - - TypeId aTypeId = NULL; - switch (nType) - { - case SC_SERVICE_PAGEFIELD: aTypeId = TYPE(SvxPageField); break; - case SC_SERVICE_PAGESFIELD: aTypeId = TYPE(SvxPagesField); break; - case SC_SERVICE_DATEFIELD: aTypeId = TYPE(SvxDateField); break; - case SC_SERVICE_TIMEFIELD: aTypeId = TYPE(SvxTimeField); break; - case SC_SERVICE_TITLEFIELD: aTypeId = TYPE(SvxFileField); break; - case SC_SERVICE_FILEFIELD: aTypeId = TYPE(SvxExtFileField); break; - case SC_SERVICE_SHEETFIELD: aTypeId = TYPE(SvxTableField); break; - // bei SC_SERVICE_INVALID bleibt TypeId Null - } - SvxFieldData* pData = aTempEngine.FindByIndex( (sal_uInt16)Index, aTypeId ); - if ( pData ) - { - sal_uInt16 nPar = aTempEngine.GetFieldPar(); - xub_StrLen nPos = aTempEngine.GetFieldPos(); - - sal_uInt16 nFieldType = nType; - if ( nFieldType == SC_SERVICE_INVALID ) - { - if ( pData->ISA( SvxPageField ) ) nFieldType = SC_SERVICE_PAGEFIELD; - else if ( pData->ISA( SvxPagesField ) ) nFieldType = SC_SERVICE_PAGESFIELD; - else if ( pData->ISA( SvxDateField ) ) nFieldType = SC_SERVICE_DATEFIELD; - else if ( pData->ISA( SvxTimeField ) ) nFieldType = SC_SERVICE_TIMEFIELD; - else if ( pData->ISA( SvxFileField ) ) nFieldType = SC_SERVICE_TITLEFIELD; - else if ( pData->ISA( SvxExtFileField ) ) nFieldType = SC_SERVICE_FILEFIELD; - else if ( pData->ISA( SvxTableField ) ) nFieldType = SC_SERVICE_SHEETFIELD; - } - - ESelection aSelection( nPar, nPos, nPar, nPos+1 ); // Field is 1 character - return new ScHeaderFieldObj( pContentObj, nPart, nFieldType, aSelection ); - } - return NULL; -} - -sal_Int32 SAL_CALL ScHeaderFieldsObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! Feld-Funktionen muessen an den Forwarder !!! - ScEditEngineDefaulter* pEditEngine = ((ScHeaderFooterEditSource*)pEditSource)->GetEditEngine(); - ScUnoEditEngine aTempEngine(pEditEngine); - - TypeId aTypeId = NULL; - switch (nType) - { - case SC_SERVICE_PAGEFIELD: aTypeId = TYPE(SvxPageField); break; - case SC_SERVICE_PAGESFIELD: aTypeId = TYPE(SvxPagesField); break; - case SC_SERVICE_DATEFIELD: aTypeId = TYPE(SvxDateField); break; - case SC_SERVICE_TIMEFIELD: aTypeId = TYPE(SvxTimeField); break; - case SC_SERVICE_TITLEFIELD: aTypeId = TYPE(SvxFileField); break; - case SC_SERVICE_FILEFIELD: aTypeId = TYPE(SvxExtFileField); break; - case SC_SERVICE_SHEETFIELD: aTypeId = TYPE(SvxTableField); break; - } - return aTempEngine.CountFields(aTypeId); // Felder zaehlen -} - -uno::Any SAL_CALL ScHeaderFieldsObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<text::XTextField> xField(GetObjectByIndex_Impl(nIndex)); - if (xField.is()) - return uno::makeAny(xField); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScHeaderFieldsObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<text::XTextField>*)0); -} - -sal_Bool SAL_CALL ScHeaderFieldsObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -uno::Reference<container::XEnumeration> SAL_CALL ScHeaderFieldsObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextFieldEnumeration"))); -} - -void SAL_CALL ScHeaderFieldsObj::addContainerListener( - const uno::Reference<container::XContainerListener>& /* xListener */ ) - throw(uno::RuntimeException) -{ - OSL_FAIL("not implemented"); -} - -void SAL_CALL ScHeaderFieldsObj::removeContainerListener( - const uno::Reference<container::XContainerListener>& /* xListener */ ) - throw(uno::RuntimeException) -{ - OSL_FAIL("not implemented"); -} - -// XRefreshable -void SAL_CALL ScHeaderFieldsObj::refresh( ) - throw (uno::RuntimeException) -{ - if (mpRefreshListeners) - { - // Call all listeners. - uno::Sequence< uno::Reference< uno::XInterface > > aListeners(mpRefreshListeners->getElements()); - sal_uInt32 nLength(aListeners.getLength()); - if (nLength) - { - const uno::Reference< uno::XInterface >* pInterfaces = aListeners.getConstArray(); - if (pInterfaces) - { - lang::EventObject aEvent; - aEvent.Source.set(uno::Reference< util::XRefreshable >(const_cast<ScHeaderFieldsObj*>(this))); - sal_uInt32 i(0); - while (i < nLength) - { - try - { - while(i < nLength) - { - static_cast< util::XRefreshListener* >(pInterfaces->get())->refreshed(aEvent); - ++pInterfaces; - ++i; - } - } - catch(uno::RuntimeException&) - { - ++pInterfaces; - ++i; - } - } - } - } - } -} - -void SAL_CALL ScHeaderFieldsObj::addRefreshListener( const uno::Reference< util::XRefreshListener >& xListener ) - throw (uno::RuntimeException) -{ - if (xListener.is()) - { - SolarMutexGuard aGuard; - if (!mpRefreshListeners) - mpRefreshListeners = new cppu::OInterfaceContainerHelper(aMutex); - mpRefreshListeners->addInterface(xListener); - } -} - -void SAL_CALL ScHeaderFieldsObj::removeRefreshListener( const uno::Reference<util::XRefreshListener >& xListener ) - throw (uno::RuntimeException) -{ - if (xListener.is()) - { - SolarMutexGuard aGuard; - if (mpRefreshListeners) - mpRefreshListeners->removeInterface(xListener); - } -} - -//------------------------------------------------------------------------ - -SvxFileFormat lcl_UnoToSvxFileFormat( sal_Int16 nUnoValue ) -{ - switch( nUnoValue ) - { - case text::FilenameDisplayFormat::FULL: return SVXFILEFORMAT_FULLPATH; - case text::FilenameDisplayFormat::PATH: return SVXFILEFORMAT_PATH; - case text::FilenameDisplayFormat::NAME: return SVXFILEFORMAT_NAME; - default: - return SVXFILEFORMAT_NAME_EXT; - } -} - -sal_Int16 lcl_SvxToUnoFileFormat( SvxFileFormat nSvxValue ) -{ - switch( nSvxValue ) - { - case SVXFILEFORMAT_NAME_EXT: return text::FilenameDisplayFormat::NAME_AND_EXT; - case SVXFILEFORMAT_FULLPATH: return text::FilenameDisplayFormat::FULL; - case SVXFILEFORMAT_PATH: return text::FilenameDisplayFormat::PATH; - default: - return text::FilenameDisplayFormat::NAME; - } -} - -ScHeaderFieldObj::ScHeaderFieldObj(ScHeaderFooterContentObj* pContent, sal_uInt16 nP, - sal_uInt16 nT, const ESelection& rSel) : - OComponentHelper( getMutex() ), - pPropSet( (nT == SC_SERVICE_FILEFIELD) ? lcl_GetFileFieldPropertySet() : lcl_GetHeaderFieldPropertySet() ), - pContentObj( pContent ), - nPart( nP ), - nType( nT ), - aSelection( rSel ), - nFileFormat( SVXFILEFORMAT_NAME_EXT ) -{ - // pContent ist Null, wenn per ServiceProvider erzeugt - - if (pContentObj) - { - pContentObj->acquire(); // darf nicht wegkommen - pEditSource = new ScHeaderFooterEditSource( pContentObj, nPart ); - } - else - pEditSource = NULL; -} - -uno::Any SAL_CALL ScHeaderFieldObj::queryAggregation( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( text::XTextField ) - SC_QUERYINTERFACE( text::XTextContent ) // parent of XTextField - SC_QUERYINTERFACE( beans::XPropertySet ) - SC_QUERYINTERFACE( lang::XUnoTunnel ) - SC_QUERYINTERFACE( lang::XServiceInfo ) - - return OComponentHelper::queryAggregation( rType ); // XComponent -} - -uno::Sequence<uno::Type> SAL_CALL ScHeaderFieldObj::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - uno::Sequence<uno::Type> aParentTypes(OComponentHelper::getTypes()); - long nParentLen = aParentTypes.getLength(); - const uno::Type* pParentPtr = aParentTypes.getConstArray(); - - aTypes.realloc( nParentLen + 4 ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[nParentLen + 0] = getCppuType((const uno::Reference<text::XTextField>*)0); - pPtr[nParentLen + 1] = getCppuType((const uno::Reference<beans::XPropertySet>*)0); - pPtr[nParentLen + 2] = getCppuType((const uno::Reference<lang::XUnoTunnel>*)0); - pPtr[nParentLen + 3] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0); - - for (long i=0; i<nParentLen; i++) - pPtr[i] = pParentPtr[i]; // parent types first - } - return aTypes; -} - -namespace -{ - class theScHeaderFieldObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScHeaderFieldObjImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScHeaderFieldObj::getImplementationId() - throw(uno::RuntimeException) -{ - return theScHeaderFieldObjImplementationId::get().getSeq(); -} - -uno::Any SAL_CALL ScHeaderFieldObj::queryInterface( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - return OComponentHelper::queryInterface( rType ); -} - -void SAL_CALL ScHeaderFieldObj::acquire() throw() -{ - OComponentHelper::acquire(); -} - -void SAL_CALL ScHeaderFieldObj::release() throw() -{ - OComponentHelper::release(); -} - -void ScHeaderFieldObj::InitDoc( ScHeaderFooterContentObj* pContent, sal_uInt16 nP, - const ESelection& rSel ) -{ - if ( pContent && !pEditSource ) - { - OSL_ENSURE( !pContentObj, "ContentObj, aber kein EditSource?" ); - - aSelection = rSel; - nPart = nP; - pContentObj = pContent; - - pContentObj->acquire(); // darf nicht wegkommen - pEditSource = new ScHeaderFooterEditSource( pContentObj, nPart ); - } -} - -ScHeaderFieldObj::~ScHeaderFieldObj() -{ - delete pEditSource; - - if (pContentObj) - pContentObj->release(); -} - -// per getImplementation gerufen: - -SvxFieldItem ScHeaderFieldObj::CreateFieldItem() -{ - OSL_ENSURE( !pEditSource, "CreateFieldItem mit eingefuegtem Feld" ); - - switch (nType) - { - case SC_SERVICE_PAGEFIELD: - { - SvxPageField aField; - return SvxFieldItem( aField, EE_FEATURE_FIELD ); - } - case SC_SERVICE_PAGESFIELD: - { - SvxPagesField aField; - return SvxFieldItem( aField, EE_FEATURE_FIELD ); - } - case SC_SERVICE_DATEFIELD: - { - SvxDateField aField; - return SvxFieldItem( aField, EE_FEATURE_FIELD ); - } - case SC_SERVICE_TIMEFIELD: - { - SvxTimeField aField; - return SvxFieldItem( aField, EE_FEATURE_FIELD ); - } - case SC_SERVICE_TITLEFIELD: - { - SvxFileField aField; - return SvxFieldItem( aField, EE_FEATURE_FIELD ); - } - case SC_SERVICE_FILEFIELD: - { - SvxExtFileField aField; - aField.SetFormat( (SvxFileFormat) nFileFormat ); - return SvxFieldItem( aField, EE_FEATURE_FIELD ); - } - case SC_SERVICE_SHEETFIELD: - { - SvxTableField aField; - return SvxFieldItem( aField, EE_FEATURE_FIELD ); - } - } - - return SvxFieldItem( SvxFieldData(), EE_FEATURE_FIELD ); -} - -void ScHeaderFieldObj::DeleteField() -{ - if (pEditSource) - { - SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder(); - pForwarder->QuickInsertText( String(), aSelection ); - pEditSource->UpdateData(); - - aSelection.nEndPara = aSelection.nStartPara; - aSelection.nEndPos = aSelection.nStartPos; - - //! Broadcast, um Selektion in anderen Objekten anzupassen - //! (auch bei anderen Aktionen) - } -} - -// XTextField - -rtl::OUString SAL_CALL ScHeaderFieldObj::getPresentation( sal_Bool /* bShowCommand */ ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aRet; - - if (pEditSource) - { - // Feld von der EditEngine formatieren lassen, bShowCommand gibt's nicht - - SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder(); - aRet = pForwarder->GetText( aSelection ); - } - - return aRet; -} - -// XTextContent - -void SAL_CALL ScHeaderFieldObj::attach( const uno::Reference<text::XTextRange>& xTextRange ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (xTextRange.is()) - { - uno::Reference<text::XText> xText(xTextRange->getText()); - if (xText.is()) - { - xText->insertTextContent( xTextRange, this, sal_True ); - } - } -} - -uno::Reference<text::XTextRange> SAL_CALL ScHeaderFieldObj::getAnchor() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pContentObj) - { - uno::Reference<text::XText> xText; - if ( nPart == SC_HDFT_LEFT ) - xText = pContentObj->getLeftText(); - else if (nPart == SC_HDFT_CENTER) - xText = pContentObj->getCenterText(); - else - xText = pContentObj->getRightText(); - return uno::Reference<text::XTextRange>( xText, uno::UNO_QUERY ); - } - return NULL; -} - -// XComponent - -void SAL_CALL ScHeaderFieldObj::dispose() throw(uno::RuntimeException) -{ - OComponentHelper::dispose(); -} - -void SAL_CALL ScHeaderFieldObj::addEventListener( - const uno::Reference<lang::XEventListener>& xListener ) - throw(uno::RuntimeException) -{ - OComponentHelper::addEventListener( xListener ); -} - -void SAL_CALL ScHeaderFieldObj::removeEventListener( - const uno::Reference<lang::XEventListener>& xListener ) - throw(uno::RuntimeException) -{ - OComponentHelper::removeEventListener( xListener ); -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScHeaderFieldObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (nType == SC_SERVICE_FILEFIELD) - { - // file field has different properties - static uno::Reference<beans::XPropertySetInfo> aFileFieldInfo = pPropSet->getPropertySetInfo(); - return aFileFieldInfo; - } - else - { - static uno::Reference<beans::XPropertySetInfo> aRef = pPropSet->getPropertySetInfo(); - return aRef; - } -} - -void SAL_CALL ScHeaderFieldObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - if ( nType == SC_SERVICE_FILEFIELD && aNameString.EqualsAscii( SC_UNONAME_FILEFORM ) ) - { - sal_Int16 nIntVal = 0; - if ( aValue >>= nIntVal ) - { - SvxFileFormat eFormat = lcl_UnoToSvxFileFormat( nIntVal ); - if (pEditSource) - { - ScEditEngineDefaulter* pEditEngine = ((ScHeaderFooterEditSource*)pEditSource)->GetEditEngine(); - ScUnoEditEngine aTempEngine(pEditEngine); - SvxFieldData* pField = aTempEngine.FindByPos( - aSelection.nStartPara, aSelection.nStartPos, TYPE(SvxExtFileField) ); - OSL_ENSURE(pField,"setPropertyValue: Field not found"); - if (pField) - { - SvxExtFileField* pExtFile = (SvxExtFileField*)pField; // local to the ScUnoEditEngine - pExtFile->SetFormat( eFormat ); - pEditEngine->QuickInsertField( SvxFieldItem(*pField, EE_FEATURE_FIELD), aSelection ); - pEditSource->UpdateData(); - } - } - else - nFileFormat = sal::static_int_cast<sal_Int16>(eFormat); // not inserted yet - store value - } - } -} - -uno::Any SAL_CALL ScHeaderFieldObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! Properties? - uno::Any aRet; - String aNameString(aPropertyName); - - // anchor type is always "as character", text wrap always "none" - - if ( aNameString.EqualsAscii( SC_UNONAME_ANCTYPE ) ) - aRet <<= text::TextContentAnchorType_AS_CHARACTER; - else if ( aNameString.EqualsAscii( SC_UNONAME_ANCTYPES ) ) - { - uno::Sequence<text::TextContentAnchorType> aSeq(1); - aSeq[0] = text::TextContentAnchorType_AS_CHARACTER; - aRet <<= aSeq; - } - else if ( aNameString.EqualsAscii( SC_UNONAME_TEXTWRAP ) ) - aRet <<= text::WrapTextMode_NONE; - else if ( nType == SC_SERVICE_FILEFIELD && aNameString.EqualsAscii( SC_UNONAME_FILEFORM ) ) - { - SvxFileFormat eFormat = SVXFILEFORMAT_NAME_EXT; - if (pEditSource) - { - ScEditEngineDefaulter* pEditEngine = ((ScHeaderFooterEditSource*)pEditSource)->GetEditEngine(); - ScUnoEditEngine aTempEngine(pEditEngine); - SvxFieldData* pField = aTempEngine.FindByPos( - aSelection.nStartPara, aSelection.nStartPos, TYPE(SvxExtFileField) ); - OSL_ENSURE(pField,"setPropertyValue: Field not found"); - if (pField) - { - const SvxExtFileField* pExtFile = (const SvxExtFileField*)pField; - eFormat = pExtFile->GetFormat(); - } - } - else - eFormat = (SvxFileFormat) nFileFormat; // not inserted yet - use stored value - - sal_Int16 nIntVal = lcl_SvxToUnoFileFormat( eFormat ); - aRet <<= nIntVal; - } - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScHeaderFieldObj ) - -// XUnoTunnel - -sal_Int64 SAL_CALL ScHeaderFieldObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScHeaderFieldObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScHeaderFieldObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScHeaderFieldObj::getUnoTunnelId() -{ - return theScHeaderFieldObjUnoTunnelId::get().getSeq(); -} - -ScHeaderFieldObj* ScHeaderFieldObj::getImplementation( - const uno::Reference<text::XTextContent> xObj ) -{ - ScHeaderFieldObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScHeaderFieldObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -// XServiceInfo - -rtl::OUString SAL_CALL ScHeaderFieldObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScHeaderFieldObj" )); -} - -sal_Bool SAL_CALL ScHeaderFieldObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr( rServiceName ); - return aServiceStr.EqualsAscii( SCTEXTFIELD_SERVICE ) || - aServiceStr.EqualsAscii( SCTEXTCONTENT_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScHeaderFieldObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(2); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCTEXTFIELD_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCTEXTCONTENT_SERVICE )); - return aRet; -} - -//------------------------------------------------------------------------ - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/filtuno.cxx b/sc/source/ui/unoobj/filtuno.cxx deleted file mode 100644 index d8d048944..000000000 --- a/sc/source/ui/unoobj/filtuno.cxx +++ /dev/null @@ -1,314 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> -#include <tools/urlobj.hxx> -#include <vcl/msgbox.hxx> -#include <vcl/svapp.hxx> -#include <unotools/ucbstreamhelper.hxx> - -#include "editutil.hxx" -#include "filtuno.hxx" -#include "miscuno.hxx" -#include "scdll.hxx" -#include "imoptdlg.hxx" -#include "asciiopt.hxx" -#include "docsh.hxx" -#include "globstr.hrc" - - -#include "sc.hrc" -#include "scabstdlg.hxx" -#include "i18npool/lang.h" - -#include <memory> - -using namespace ::com::sun::star; -using ::rtl::OUStringBuffer; - -//------------------------------------------------------------------------ - -#define SCFILTEROPTIONSOBJ_SERVICE "com.sun.star.ui.dialogs.FilterOptionsDialog" -#define SCFILTEROPTIONSOBJ_IMPLNAME "com.sun.star.comp.Calc.FilterOptionsDialog" - -SC_SIMPLE_SERVICE_INFO( ScFilterOptionsObj, SCFILTEROPTIONSOBJ_IMPLNAME, SCFILTEROPTIONSOBJ_SERVICE ) - -#define SC_UNONAME_FILENAME "URL" -#define SC_UNONAME_FILTERNAME "FilterName" -#define SC_UNONAME_FILTEROPTIONS "FilterOptions" -#define SC_UNONAME_INPUTSTREAM "InputStream" - -//------------------------------------------------------------------------ - -ScFilterOptionsObj::ScFilterOptionsObj() : - bExport( false ) -{ -} - -ScFilterOptionsObj::~ScFilterOptionsObj() -{ -} - -// stuff for exService_... - -uno::Reference<uno::XInterface> SAL_CALL ScFilterOptionsObj_CreateInstance( - const uno::Reference<lang::XMultiServiceFactory>& ) -{ - SolarMutexGuard aGuard; - ScDLL::Init(); - return (::cppu::OWeakObject*) new ScFilterOptionsObj; -} - -rtl::OUString ScFilterOptionsObj::getImplementationName_Static() -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCFILTEROPTIONSOBJ_IMPLNAME )); -} - -uno::Sequence<rtl::OUString> ScFilterOptionsObj::getSupportedServiceNames_Static() -{ - uno::Sequence<rtl::OUString> aRet(1); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCFILTEROPTIONSOBJ_SERVICE )); - return aRet; -} - -// XPropertyAccess - -uno::Sequence<beans::PropertyValue> SAL_CALL ScFilterOptionsObj::getPropertyValues() throw(uno::RuntimeException) -{ - uno::Sequence<beans::PropertyValue> aRet(1); - beans::PropertyValue* pArray = aRet.getArray(); - - pArray[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_FILTEROPTIONS )); - pArray[0].Value <<= aFilterOptions; - - return aRet; -} - -void SAL_CALL ScFilterOptionsObj::setPropertyValues( const uno::Sequence<beans::PropertyValue>& aProps ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) -{ - const beans::PropertyValue* pPropArray = aProps.getConstArray(); - long nPropCount = aProps.getLength(); - for (long i = 0; i < nPropCount; i++) - { - const beans::PropertyValue& rProp = pPropArray[i]; - String aPropName(rProp.Name); - - if ( aPropName.EqualsAscii( SC_UNONAME_FILENAME ) ) - rProp.Value >>= aFileName; - else if ( aPropName.EqualsAscii( SC_UNONAME_FILTERNAME ) ) - rProp.Value >>= aFilterName; - else if ( aPropName.EqualsAscii( SC_UNONAME_FILTEROPTIONS ) ) - rProp.Value >>= aFilterOptions; - else if ( aPropName.EqualsAscii( SC_UNONAME_INPUTSTREAM ) ) - rProp.Value >>= xInputStream; - } -} - -// XExecutableDialog - -void SAL_CALL ScFilterOptionsObj::setTitle( const ::rtl::OUString& /* aTitle */ ) throw(uno::RuntimeException) -{ - // not used -} - -sal_Int16 SAL_CALL ScFilterOptionsObj::execute() throw(uno::RuntimeException) -{ - sal_Int16 nRet = ui::dialogs::ExecutableDialogResults::CANCEL; - - String aFilterString( aFilterName ); - - ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); - OSL_ENSURE(pFact, "ScAbstractFactory create fail!"); - - if ( !bExport && aFilterString == ScDocShell::GetAsciiFilterName() ) - { - // ascii import is special... - - INetURLObject aURL( aFileName ); - String aExt(aURL.getExtension()); - String aPrivDatName(aURL.getName()); - sal_Unicode cAsciiDel; - if (aExt.EqualsIgnoreCaseAscii("CSV")) - cAsciiDel = ','; - else - cAsciiDel = '\t'; - - SvStream* pInStream = NULL; - if ( xInputStream.is() ) - pInStream = utl::UcbStreamHelper::CreateStream( xInputStream ); - - AbstractScImportAsciiDlg* pDlg = pFact->CreateScImportAsciiDlg( NULL, aPrivDatName, pInStream, RID_SCDLG_ASCII, cAsciiDel); - OSL_ENSURE(pDlg, "Dialog create fail!"); - if ( pDlg->Execute() == RET_OK ) - { - ScAsciiOptions aOptions; - pDlg->GetOptions( aOptions ); - pDlg->SaveParameters(); - aFilterOptions = aOptions.WriteToString(); - nRet = ui::dialogs::ExecutableDialogResults::OK; - } - delete pDlg; - delete pInStream; - } - else if ( aFilterString == ScDocShell::GetWebQueryFilterName() || aFilterString == ScDocShell::GetHtmlFilterName() ) - { - if (bExport) - nRet = ui::dialogs::ExecutableDialogResults::OK; // export HTML without dialog - else - { - // HTML import. - ::std::auto_ptr<AbstractScTextImportOptionsDlg> pDlg( - pFact->CreateScTextImportOptionsDlg(NULL, RID_SCDLG_TEXT_IMPORT_OPTIONS)); - - if (pDlg->Execute() == RET_OK) - { - LanguageType eLang = pDlg->GetLanguageType(); - OUStringBuffer aBuf; - - aBuf.append(String::CreateFromInt32(static_cast<sal_Int32>(eLang))); - aBuf.append(sal_Unicode(' ')); - aBuf.append(pDlg->IsDateConversionSet() ? sal_Unicode('1') : sal_Unicode('0')); - aFilterOptions = aBuf.makeStringAndClear(); - nRet = ui::dialogs::ExecutableDialogResults::OK; - } - } - } - else - { - sal_Bool bMultiByte = sal_True; - sal_Bool bDBEnc = false; - sal_Bool bAscii = false; - - sal_Unicode cStrDel = '"'; - sal_Unicode cAsciiDel = ';'; - rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW; - - String aTitle; - - if ( aFilterString == ScDocShell::GetAsciiFilterName() ) - { - // ascii export (import is handled above) - - INetURLObject aURL( aFileName ); - String aExt(aURL.getExtension()); - if (aExt.EqualsIgnoreCaseAscii("CSV")) - cAsciiDel = ','; - else - cAsciiDel = '\t'; - - aTitle = ScGlobal::GetRscString( STR_EXPORT_ASCII ); - bAscii = sal_True; - } - else if ( aFilterString == ScDocShell::GetLotusFilterName() ) - { - // lotus is only imported - OSL_ENSURE( !bExport, "Filter Options for Lotus Export is not implemented" ); - - aTitle = ScGlobal::GetRscString( STR_IMPORT_LOTUS ); - eEncoding = RTL_TEXTENCODING_IBM_437; - } - else if ( aFilterString == ScDocShell::GetDBaseFilterName() ) - { - if ( bExport ) - { - // dBase export - aTitle = ScGlobal::GetRscString( STR_EXPORT_DBF ); - } - else - { - // dBase import - aTitle = ScGlobal::GetRscString( STR_IMPORT_DBF ); - } - // common for dBase import/export - eEncoding = RTL_TEXTENCODING_IBM_850; - bDBEnc = sal_True; - } - else if ( aFilterString == ScDocShell::GetDifFilterName() ) - { - if ( bExport ) - { - // DIF export - aTitle = ScGlobal::GetRscString( STR_EXPORT_DIF ); - } - else - { - // DIF import - aTitle = ScGlobal::GetRscString( STR_IMPORT_DIF ); - } - // common for DIF import/export - eEncoding = RTL_TEXTENCODING_MS_1252; - } - - ScImportOptions aOptions( cAsciiDel, cStrDel, eEncoding); - - AbstractScImportOptionsDlg* pDlg = pFact->CreateScImportOptionsDlg( NULL, RID_SCDLG_IMPORTOPT, - bAscii, &aOptions, &aTitle, bMultiByte, bDBEnc, - !bExport); - OSL_ENSURE(pDlg, "Dialog create fail!"); - if ( pDlg->Execute() == RET_OK ) - { - pDlg->GetImportOptions( aOptions ); - if ( bAscii ) - aFilterOptions = aOptions.BuildString(); - else - aFilterOptions = aOptions.aStrFont; - nRet = ui::dialogs::ExecutableDialogResults::OK; - } - delete pDlg; - } - - xInputStream.clear(); // don't hold the stream longer than necessary - - return nRet; -} - -// XImporter - -void SAL_CALL ScFilterOptionsObj::setTargetDocument( const uno::Reference<lang::XComponent>& /* xDoc */ ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - bExport = false; -} - -// XExporter - -void SAL_CALL ScFilterOptionsObj::setSourceDocument( const uno::Reference<lang::XComponent>& /* xDoc */ ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - bExport = sal_True; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/fmtuno.cxx b/sc/source/ui/unoobj/fmtuno.cxx deleted file mode 100644 index 2e9a08f56..000000000 --- a/sc/source/ui/unoobj/fmtuno.cxx +++ /dev/null @@ -1,1078 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include <boost/bind.hpp> - -#include <vcl/svapp.hxx> -#include <comphelper/servicehelper.hxx> - -#include <com/sun/star/sheet/ValidationAlertStyle.hpp> -#include <com/sun/star/sheet/ValidationType.hpp> -#include <com/sun/star/sheet/TableValidationVisibility.hpp> - -#include "fmtuno.hxx" -#include "miscuno.hxx" -#include "validat.hxx" -#include "document.hxx" -#include "unonames.hxx" -#include "styleuno.hxx" // ScStyleNameConversion -#include "tokenarray.hxx" -#include "tokenuno.hxx" - -using namespace ::com::sun::star; -using namespace ::formula; - -//------------------------------------------------------------------------ - -// Map nur fuer PropertySetInfo - -const SfxItemPropertyMapEntry* lcl_GetValidatePropertyMap() -{ - static SfxItemPropertyMapEntry aValidatePropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ERRALSTY), 0, &getCppuType((sheet::ValidationAlertStyle*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ERRMESS), 0, &getCppuType((rtl::OUString*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_ERRTITLE), 0, &getCppuType((rtl::OUString*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_IGNOREBL), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_INPMESS), 0, &getCppuType((rtl::OUString*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_INPTITLE), 0, &getCppuType((rtl::OUString*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_SHOWERR), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_SHOWINP), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_SHOWLIST), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNONAME_TYPE), 0, &getCppuType((sheet::ValidationType*)0), 0, 0}, - {0,0,0,0,0,0} - }; - return aValidatePropertyMap_Impl; -} - -//------------------------------------------------------------------------ - -SC_SIMPLE_SERVICE_INFO( ScTableConditionalEntry, "ScTableConditionalEntry", "com.sun.star.sheet.TableConditionalEntry" ) -SC_SIMPLE_SERVICE_INFO( ScTableConditionalFormat, "ScTableConditionalFormat", "com.sun.star.sheet.TableConditionalFormat" ) -SC_SIMPLE_SERVICE_INFO( ScTableValidationObj, "ScTableValidationObj", "com.sun.star.sheet.TableValidation" ) - -//------------------------------------------------------------------------ - -sal_Int32 lcl_ConditionModeToOperatorNew( ScConditionMode eMode ) -{ - sal_Int32 eOper = sheet::ConditionOperator2::NONE; - switch (eMode) - { - case SC_COND_EQUAL: eOper = sheet::ConditionOperator2::EQUAL; break; - case SC_COND_LESS: eOper = sheet::ConditionOperator2::LESS; break; - case SC_COND_GREATER: eOper = sheet::ConditionOperator2::GREATER; break; - case SC_COND_EQLESS: eOper = sheet::ConditionOperator2::LESS_EQUAL; break; - case SC_COND_EQGREATER: eOper = sheet::ConditionOperator2::GREATER_EQUAL; break; - case SC_COND_NOTEQUAL: eOper = sheet::ConditionOperator2::NOT_EQUAL; break; - case SC_COND_BETWEEN: eOper = sheet::ConditionOperator2::BETWEEN; break; - case SC_COND_NOTBETWEEN: eOper = sheet::ConditionOperator2::NOT_BETWEEN; break; - case SC_COND_DIRECT: eOper = sheet::ConditionOperator2::FORMULA; break; - case SC_COND_DUPLICATE: eOper = sheet::ConditionOperator2::DUPLICATE; break; - default: - { - // added to avoid warnings - } - } - return eOper; -} - -ScConditionMode lcl_ConditionOperatorToModeNew( sal_Int32 eOper ) -{ - ScConditionMode eMode = SC_COND_NONE; - switch (eOper) - { - case sheet::ConditionOperator2::EQUAL: eMode = SC_COND_EQUAL; break; - case sheet::ConditionOperator2::LESS: eMode = SC_COND_LESS; break; - case sheet::ConditionOperator2::GREATER: eMode = SC_COND_GREATER; break; - case sheet::ConditionOperator2::LESS_EQUAL: eMode = SC_COND_EQLESS; break; - case sheet::ConditionOperator2::GREATER_EQUAL: eMode = SC_COND_EQGREATER; break; - case sheet::ConditionOperator2::NOT_EQUAL: eMode = SC_COND_NOTEQUAL; break; - case sheet::ConditionOperator2::BETWEEN: eMode = SC_COND_BETWEEN; break; - case sheet::ConditionOperator2::NOT_BETWEEN: eMode = SC_COND_NOTBETWEEN; break; - case sheet::ConditionOperator2::FORMULA: eMode = SC_COND_DIRECT; break; - case sheet::ConditionOperator2::DUPLICATE: eMode = SC_COND_DUPLICATE; break; - default: - { - // added to avoid warnings - } - } - return eMode; -} - -sheet::ConditionOperator lcl_ConditionModeToOperator( ScConditionMode eMode ) -{ - sheet::ConditionOperator eOper = sheet::ConditionOperator_NONE; - switch (eMode) - { - case SC_COND_EQUAL: eOper = sheet::ConditionOperator_EQUAL; break; - case SC_COND_LESS: eOper = sheet::ConditionOperator_LESS; break; - case SC_COND_GREATER: eOper = sheet::ConditionOperator_GREATER; break; - case SC_COND_EQLESS: eOper = sheet::ConditionOperator_LESS_EQUAL; break; - case SC_COND_EQGREATER: eOper = sheet::ConditionOperator_GREATER_EQUAL; break; - case SC_COND_NOTEQUAL: eOper = sheet::ConditionOperator_NOT_EQUAL; break; - case SC_COND_BETWEEN: eOper = sheet::ConditionOperator_BETWEEN; break; - case SC_COND_NOTBETWEEN: eOper = sheet::ConditionOperator_NOT_BETWEEN; break; - case SC_COND_DIRECT: eOper = sheet::ConditionOperator_FORMULA; break; - default: - { - // added to avoid warnings - } - } - return eOper; -} - -ScConditionMode lcl_ConditionOperatorToMode( sheet::ConditionOperator eOper ) -{ - ScConditionMode eMode = SC_COND_NONE; - switch (eOper) - { - case sheet::ConditionOperator_EQUAL: eMode = SC_COND_EQUAL; break; - case sheet::ConditionOperator_LESS: eMode = SC_COND_LESS; break; - case sheet::ConditionOperator_GREATER: eMode = SC_COND_GREATER; break; - case sheet::ConditionOperator_LESS_EQUAL: eMode = SC_COND_EQLESS; break; - case sheet::ConditionOperator_GREATER_EQUAL: eMode = SC_COND_EQGREATER; break; - case sheet::ConditionOperator_NOT_EQUAL: eMode = SC_COND_NOTEQUAL; break; - case sheet::ConditionOperator_BETWEEN: eMode = SC_COND_BETWEEN; break; - case sheet::ConditionOperator_NOT_BETWEEN: eMode = SC_COND_NOTBETWEEN; break; - case sheet::ConditionOperator_FORMULA: eMode = SC_COND_DIRECT; break; - default: - { - // added to avoid warnings - } - } - return eMode; -} - -//------------------------------------------------------------------------ - -ScCondFormatEntryItem::ScCondFormatEntryItem() : - meGrammar1( FormulaGrammar::GRAM_UNSPECIFIED ), - meGrammar2( FormulaGrammar::GRAM_UNSPECIFIED ), - meMode( SC_COND_NONE ) -{ -} - -//------------------------------------------------------------------------ - -ScTableConditionalFormat::ScTableConditionalFormat( - ScDocument* pDoc, sal_uLong nKey, FormulaGrammar::Grammar eGrammar) -{ - // Eintrag aus dem Dokument lesen... - - if ( pDoc && nKey ) - { - ScConditionalFormatList* pList = pDoc->GetCondFormList(); - if (pList) - { - const ScConditionalFormat* pFormat = pList->GetFormat( nKey ); - if (pFormat) - { - // During save to XML. - if (pDoc->IsInExternalReferenceMarking()) - pFormat->MarkUsedExternalReferences(); - - sal_uInt16 nEntryCount = pFormat->Count(); - for (sal_uInt16 i=0; i<nEntryCount; i++) - { - ScCondFormatEntryItem aItem; - const ScCondFormatEntry* pFormatEntry = pFormat->GetEntry(i); - aItem.meMode = pFormatEntry->GetOperation(); - aItem.maPos = pFormatEntry->GetValidSrcPos(); - aItem.maExpr1 = pFormatEntry->GetExpression(aItem.maPos, 0, 0, eGrammar); - aItem.maExpr2 = pFormatEntry->GetExpression(aItem.maPos, 1, 0, eGrammar); - aItem.meGrammar1 = aItem.meGrammar2 = eGrammar; - aItem.maStyle = pFormatEntry->GetStyle(); - - AddEntry_Impl(aItem); - } - } - } - } -} - -namespace { - -FormulaGrammar::Grammar lclResolveGrammar( FormulaGrammar::Grammar eExtGrammar, FormulaGrammar::Grammar eIntGrammar ) -{ - if( eExtGrammar != FormulaGrammar::GRAM_UNSPECIFIED ) - return eExtGrammar; - OSL_ENSURE( eIntGrammar != FormulaGrammar::GRAM_UNSPECIFIED, "lclResolveGrammar - unspecified grammar, using GRAM_PODF_A1" ); - return (eIntGrammar == FormulaGrammar::GRAM_UNSPECIFIED) ? FormulaGrammar::GRAM_PODF_A1 : eIntGrammar; -} - -} // namespace - -void ScTableConditionalFormat::FillFormat( ScConditionalFormat& rFormat, - ScDocument* pDoc, FormulaGrammar::Grammar eGrammar) const -{ - // ScConditionalFormat = Core-Struktur, muss leer sein - - OSL_ENSURE( rFormat.IsEmpty(), "FillFormat: Format nicht leer" ); - - std::vector<ScTableConditionalEntry*>::const_iterator iter; - for (iter = aEntries.begin(); iter != aEntries.end(); ++iter) - { - ScCondFormatEntryItem aData; - (*iter)->GetData(aData); - - FormulaGrammar::Grammar eGrammar1 = lclResolveGrammar( eGrammar, aData.meGrammar1 ); - FormulaGrammar::Grammar eGrammar2 = lclResolveGrammar( eGrammar, aData.meGrammar2 ); - - ScCondFormatEntry aCoreEntry( aData.meMode, aData.maExpr1, aData.maExpr2, - pDoc, aData.maPos, aData.maStyle, aData.maExprNmsp1, aData.maExprNmsp2, eGrammar1, eGrammar2 ); - - if ( aData.maPosStr.Len() ) - aCoreEntry.SetSrcString( aData.maPosStr ); - - if ( aData.maTokens1.getLength() ) - { - ScTokenArray aTokenArray; - if ( ScTokenConversion::ConvertToTokenArray(*pDoc, aTokenArray, aData.maTokens1) ) - aCoreEntry.SetFormula1(aTokenArray); - } - - if ( aData.maTokens2.getLength() ) - { - ScTokenArray aTokenArray; - if ( ScTokenConversion::ConvertToTokenArray(*pDoc, aTokenArray, aData.maTokens2) ) - aCoreEntry.SetFormula2(aTokenArray); - } - rFormat.AddEntry( aCoreEntry ); - } -} - -ScTableConditionalFormat::~ScTableConditionalFormat() -{ - std::for_each(aEntries.begin(),aEntries.end(),boost::bind(&ScTableConditionalEntry::release,_1)); -} - -void ScTableConditionalFormat::AddEntry_Impl(const ScCondFormatEntryItem& aEntry) -{ - ScTableConditionalEntry* pNew = new ScTableConditionalEntry(aEntry); - pNew->acquire(); - aEntries.push_back(pNew); -} - -// XSheetConditionalFormat - -ScTableConditionalEntry* ScTableConditionalFormat::GetObjectByIndex_Impl(sal_uInt16 nIndex) const -{ - return nIndex < aEntries.size() ? aEntries[nIndex] : NULL; -} - -void SAL_CALL ScTableConditionalFormat::addNew( - const uno::Sequence<beans::PropertyValue >& aConditionalEntry ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScCondFormatEntryItem aEntry; - aEntry.meMode = SC_COND_NONE; - - const beans::PropertyValue* pPropArray = aConditionalEntry.getConstArray(); - long nPropCount = aConditionalEntry.getLength(); - for (long i = 0; i < nPropCount; i++) - { - const beans::PropertyValue& rProp = pPropArray[i]; - - if ( rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_OPERATOR ) ) ) - { - sal_Int32 eOper = ScUnoHelpFunctions::GetEnumFromAny( rProp.Value ); - aEntry.meMode = lcl_ConditionOperatorToModeNew( eOper ); - } - else if ( rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_FORMULA1 ) ) ) - { - rtl::OUString aStrVal; - uno::Sequence<sheet::FormulaToken> aTokens; - if ( rProp.Value >>= aStrVal ) - aEntry.maExpr1 = aStrVal; - else if ( rProp.Value >>= aTokens ) - { - aEntry.maExpr1.Erase(); - aEntry.maTokens1 = aTokens; - } - } - else if ( rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_FORMULA2 ) ) ) - { - rtl::OUString aStrVal; - uno::Sequence<sheet::FormulaToken> aTokens; - if ( rProp.Value >>= aStrVal ) - aEntry.maExpr2 = aStrVal; - else if ( rProp.Value >>= aTokens ) - { - aEntry.maExpr2.Erase(); - aEntry.maTokens2 = aTokens; - } - } - else if ( rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_SOURCEPOS ) ) ) - { - table::CellAddress aAddress; - if ( rProp.Value >>= aAddress ) - aEntry.maPos = ScAddress( (SCCOL)aAddress.Column, (SCROW)aAddress.Row, aAddress.Sheet ); - } - else if ( rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_SOURCESTR ) ) ) - { - rtl::OUString aStrVal; - if ( rProp.Value >>= aStrVal ) - aEntry.maPosStr = String( aStrVal ); - } - else if ( rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_STYLENAME ) ) ) - { - rtl::OUString aStrVal; - if ( rProp.Value >>= aStrVal ) - aEntry.maStyle = ScStyleNameConversion::ProgrammaticToDisplayName( - aStrVal, SFX_STYLE_FAMILY_PARA ); - } - else if ( rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_FORMULANMSP1 ) ) ) - { - rtl::OUString aStrVal; - if ( rProp.Value >>= aStrVal ) - aEntry.maExprNmsp1 = aStrVal; - } - else if ( rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_FORMULANMSP2 ) ) ) - { - rtl::OUString aStrVal; - if ( rProp.Value >>= aStrVal ) - aEntry.maExprNmsp2 = aStrVal; - } - else if ( rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_GRAMMAR1 ) ) ) - { - sal_Int32 nVal = 0; - if ( rProp.Value >>= nVal ) - aEntry.meGrammar1 = static_cast< FormulaGrammar::Grammar >( nVal ); - } - else if ( rProp.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_GRAMMAR2 ) ) ) - { - sal_Int32 nVal = 0; - if ( rProp.Value >>= nVal ) - aEntry.meGrammar2 = static_cast< FormulaGrammar::Grammar >( nVal ); - } - else - { - OSL_FAIL("falsche Property"); - //! Exception... - } - } - - AddEntry_Impl(aEntry); -} - -void SAL_CALL ScTableConditionalFormat::removeByIndex( sal_Int32 nIndex ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if (nIndex < static_cast<sal_Int32>(aEntries.size())) - { - std::vector<ScTableConditionalEntry*>::iterator iter = aEntries.begin()+nIndex; - - (*iter)->release(); - aEntries.erase(iter); - } -} - -void SAL_CALL ScTableConditionalFormat::clear() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - std::for_each(aEntries.begin(),aEntries.end(), - boost::bind(&ScTableConditionalEntry::release,_1)); - - aEntries.clear(); -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScTableConditionalFormat::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.TableConditionalEntryEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScTableConditionalFormat::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aEntries.size(); -} - -uno::Any SAL_CALL ScTableConditionalFormat::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XSheetConditionalEntry> xEntry(GetObjectByIndex_Impl((sal_uInt16)nIndex)); - if (xEntry.is()) - return uno::makeAny(xEntry); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScTableConditionalFormat::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<sheet::XSheetConditionalEntry>*)0); -} - -sal_Bool SAL_CALL ScTableConditionalFormat::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// conditional format entries have no real names -// -> generate name from index - -rtl::OUString lcl_GetEntryNameFromIndex( sal_Int32 nIndex ) -{ - rtl::OUString aRet( RTL_CONSTASCII_USTRINGPARAM( "Entry" ) ); - aRet += rtl::OUString::valueOf( nIndex ); - return aRet; -} - -uno::Any SAL_CALL ScTableConditionalFormat::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<sheet::XSheetConditionalEntry> xEntry; - long nCount = aEntries.size(); - for (long i=0; i<nCount; i++) - if ( aName == lcl_GetEntryNameFromIndex(i) ) - { - xEntry.set(GetObjectByIndex_Impl((sal_uInt16)i)); - break; - } - - if (xEntry.is()) - return uno::makeAny(xEntry); - else - throw container::NoSuchElementException(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScTableConditionalFormat::getElementNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - long nCount = aEntries.size(); - uno::Sequence<rtl::OUString> aNames(nCount); - rtl::OUString* pArray = aNames.getArray(); - for (long i=0; i<nCount; i++) - pArray[i] = lcl_GetEntryNameFromIndex(i); - - return aNames; -} - -sal_Bool SAL_CALL ScTableConditionalFormat::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - long nCount = aEntries.size(); - for (long i=0; i<nCount; i++) - if ( aName == lcl_GetEntryNameFromIndex(i) ) - return sal_True; - - return false; -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScTableConditionalFormat::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScTableConditionalFormatUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScTableConditionalFormatUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScTableConditionalFormat::getUnoTunnelId() -{ - return theScTableConditionalFormatUnoTunnelId::get().getSeq(); -} - -ScTableConditionalFormat* ScTableConditionalFormat::getImplementation( - const uno::Reference<sheet::XSheetConditionalEntries> xObj ) -{ - ScTableConditionalFormat* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScTableConditionalFormat*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -//------------------------------------------------------------------------ - -ScTableConditionalEntry::ScTableConditionalEntry(const ScCondFormatEntryItem& aItem) : - aData( aItem ) -{ - // #i113668# only store the settings, keep no reference to parent object -} - -ScTableConditionalEntry::~ScTableConditionalEntry() -{ -} - -void ScTableConditionalEntry::GetData(ScCondFormatEntryItem& rData) const -{ - rData = aData; -} - -// XSheetCondition - -sheet::ConditionOperator SAL_CALL ScTableConditionalEntry::getOperator() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return lcl_ConditionModeToOperator( aData.meMode ); -} - -void SAL_CALL ScTableConditionalEntry::setOperator( sheet::ConditionOperator nOperator ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aData.meMode = lcl_ConditionOperatorToMode( nOperator ); -} - -sal_Int32 SAL_CALL ScTableConditionalEntry::getConditionOperator() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return lcl_ConditionModeToOperatorNew( aData.meMode ); -} - -void SAL_CALL ScTableConditionalEntry::setConditionOperator( sal_Int32 nOperator ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aData.meMode = lcl_ConditionOperatorToModeNew( nOperator ); -} - -rtl::OUString SAL_CALL ScTableConditionalEntry::getFormula1() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aData.maExpr1; -} - -void SAL_CALL ScTableConditionalEntry::setFormula1( const rtl::OUString& aFormula1 ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aData.maExpr1 = String( aFormula1 ); -} - -rtl::OUString SAL_CALL ScTableConditionalEntry::getFormula2() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aData.maExpr2; -} - -void SAL_CALL ScTableConditionalEntry::setFormula2( const rtl::OUString& aFormula2 ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aData.maExpr2 = String( aFormula2 ); -} - -table::CellAddress SAL_CALL ScTableConditionalEntry::getSourcePosition() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellAddress aRet; - aRet.Column = aData.maPos.Col(); - aRet.Row = aData.maPos.Row(); - aRet.Sheet = aData.maPos.Tab(); - return aRet; -} - -void SAL_CALL ScTableConditionalEntry::setSourcePosition( const table::CellAddress& aSourcePosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aData.maPos.Set( (SCCOL)aSourcePosition.Column, (SCROW)aSourcePosition.Row, aSourcePosition.Sheet ); -} - -// XSheetConditionalEntry - -rtl::OUString SAL_CALL ScTableConditionalEntry::getStyleName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ScStyleNameConversion::DisplayToProgrammaticName( aData.maStyle, SFX_STYLE_FAMILY_PARA ); -} - -void SAL_CALL ScTableConditionalEntry::setStyleName( const rtl::OUString& aStyleName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aData.maStyle = ScStyleNameConversion::ProgrammaticToDisplayName( aStyleName, SFX_STYLE_FAMILY_PARA ); -} - -//------------------------------------------------------------------------ - -ScTableValidationObj::ScTableValidationObj(ScDocument* pDoc, sal_uLong nKey, - const formula::FormulaGrammar::Grammar eGrammar) : - aPropSet( lcl_GetValidatePropertyMap() ) -{ - // Eintrag aus dem Dokument lesen... - - sal_Bool bFound = false; - if ( pDoc && nKey ) - { - const ScValidationData* pData = pDoc->GetValidationEntry( nKey ); - if (pData) - { - nMode = sal::static_int_cast<sal_uInt16>( pData->GetOperation() ); - aSrcPos = pData->GetValidSrcPos(); // valid pos for expressions - aExpr1 = pData->GetExpression( aSrcPos, 0, 0, eGrammar ); - aExpr2 = pData->GetExpression( aSrcPos, 1, 0, eGrammar ); - meGrammar1 = meGrammar2 = eGrammar; - nValMode = sal::static_int_cast<sal_uInt16>( pData->GetDataMode() ); - bIgnoreBlank = pData->IsIgnoreBlank(); - nShowList = pData->GetListType(); - bShowInput = pData->GetInput( aInputTitle, aInputMessage ); - ScValidErrorStyle eStyle; - bShowError = pData->GetErrMsg( aErrorTitle, aErrorMessage, eStyle ); - nErrorStyle = sal::static_int_cast<sal_uInt16>( eStyle ); - - // During save to XML, sheet::ValidationType_ANY formulas are not - // saved, even if in the list, see - // ScMyValidationsContainer::GetCondition(), so shall not mark - // anything in use. - if (nValMode != SC_VALID_ANY && pDoc->IsInExternalReferenceMarking()) - pData->MarkUsedExternalReferences(); - - bFound = sal_True; - } - } - if (!bFound) - ClearData_Impl(); // Defaults -} - -ScValidationData* ScTableValidationObj::CreateValidationData( ScDocument* pDoc, - formula::FormulaGrammar::Grammar eGrammar ) const -{ - // ScValidationData = Core-Struktur - - FormulaGrammar::Grammar eGrammar1 = lclResolveGrammar( eGrammar, meGrammar1 ); - FormulaGrammar::Grammar eGrammar2 = lclResolveGrammar( eGrammar, meGrammar2 ); - - ScValidationData* pRet = new ScValidationData( (ScValidationMode)nValMode, - (ScConditionMode)nMode, - aExpr1, aExpr2, pDoc, aSrcPos, - maExprNmsp1, maExprNmsp2, - eGrammar1, eGrammar2 ); - pRet->SetIgnoreBlank(bIgnoreBlank); - pRet->SetListType(nShowList); - - if ( aTokens1.getLength() ) - { - ScTokenArray aTokenArray; - if ( ScTokenConversion::ConvertToTokenArray(*pDoc, aTokenArray, aTokens1) ) - pRet->SetFormula1(aTokenArray); - } - - if ( aTokens2.getLength() ) - { - ScTokenArray aTokenArray; - if ( ScTokenConversion::ConvertToTokenArray(*pDoc, aTokenArray, aTokens2) ) - pRet->SetFormula2(aTokenArray); - } - - // set strings for error / input even if disabled (and disable afterwards) - pRet->SetInput( aInputTitle, aInputMessage ); - if (!bShowInput) - pRet->ResetInput(); - pRet->SetError( aErrorTitle, aErrorMessage, (ScValidErrorStyle)nErrorStyle ); - if (!bShowError) - pRet->ResetError(); - - if ( aPosString.Len() ) - pRet->SetSrcString( aPosString ); - - return pRet; -} - -void ScTableValidationObj::ClearData_Impl() -{ - nMode = SC_COND_NONE; - nValMode = SC_VALID_ANY; - bIgnoreBlank = sal_True; - nShowList = sheet::TableValidationVisibility::UNSORTED; - bShowInput = false; - bShowError = false; - nErrorStyle = SC_VALERR_STOP; - aSrcPos.Set(0,0,0); - aExpr1.Erase(); - aExpr2.Erase(); - maExprNmsp1.Erase(); - maExprNmsp2.Erase(); - meGrammar1 = meGrammar2 = FormulaGrammar::GRAM_UNSPECIFIED; // will be overriden when needed - aInputTitle.Erase(); - aInputMessage.Erase(); - aErrorTitle.Erase(); - aErrorMessage.Erase(); -} - -ScTableValidationObj::~ScTableValidationObj() -{ -} - -// XSheetCondition - -sheet::ConditionOperator SAL_CALL ScTableValidationObj::getOperator() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return lcl_ConditionModeToOperator( (ScConditionMode)nMode ); -} - -void SAL_CALL ScTableValidationObj::setOperator( sheet::ConditionOperator nOperator ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - nMode = sal::static_int_cast<sal_uInt16>( lcl_ConditionOperatorToMode( nOperator ) ); -} - -sal_Int32 SAL_CALL ScTableValidationObj::getConditionOperator() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return lcl_ConditionModeToOperatorNew( (ScConditionMode)nMode ); -} - -void SAL_CALL ScTableValidationObj::setConditionOperator( sal_Int32 nOperator ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - nMode = sal::static_int_cast<sal_uInt16>( lcl_ConditionOperatorToModeNew( nOperator ) ); -} - -rtl::OUString SAL_CALL ScTableValidationObj::getFormula1() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aExpr1; -} - -void SAL_CALL ScTableValidationObj::setFormula1( const rtl::OUString& aFormula1 ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aExpr1 = String( aFormula1 ); -} - -rtl::OUString SAL_CALL ScTableValidationObj::getFormula2() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aExpr2; -} - -void SAL_CALL ScTableValidationObj::setFormula2( const rtl::OUString& aFormula2 ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aExpr2 = String( aFormula2 ); -} - -table::CellAddress SAL_CALL ScTableValidationObj::getSourcePosition() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellAddress aRet; - aRet.Column = aSrcPos.Col(); - aRet.Row = aSrcPos.Row(); - aRet.Sheet = aSrcPos.Tab(); - return aRet; -} - -void SAL_CALL ScTableValidationObj::setSourcePosition( const table::CellAddress& aSourcePosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - aSrcPos.Set( (SCCOL)aSourcePosition.Column, (SCROW)aSourcePosition.Row, aSourcePosition.Sheet ); -} - -uno::Sequence<sheet::FormulaToken> SAL_CALL ScTableValidationObj::getTokens( sal_Int32 nIndex ) - throw(uno::RuntimeException,lang::IndexOutOfBoundsException) -{ - SolarMutexGuard aGuard; - if (nIndex >= 2 || nIndex < 0) - throw lang::IndexOutOfBoundsException(); - - return nIndex == 0 ? aTokens1 : aTokens2; -} - -void SAL_CALL ScTableValidationObj::setTokens( sal_Int32 nIndex, const uno::Sequence<sheet::FormulaToken>& aTokens ) - throw(uno::RuntimeException,lang::IndexOutOfBoundsException) -{ - SolarMutexGuard aGuard; - if (nIndex >= 2 || nIndex < 0) - throw lang::IndexOutOfBoundsException(); - - if (nIndex == 0) - { - aTokens1 = aTokens; - aExpr1.Erase(); - } - else if (nIndex == 1) - { - aTokens2 = aTokens; - aExpr2.Erase(); - } -} - -sal_Int32 SAL_CALL ScTableValidationObj::getCount() throw(uno::RuntimeException) -{ - return 2; -} - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTableValidationObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScTableValidationObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aPropertyName); - - if ( aString.EqualsAscii( SC_UNONAME_SHOWINP ) ) bShowInput = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if ( aString.EqualsAscii( SC_UNONAME_SHOWERR ) ) bShowError = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if ( aString.EqualsAscii( SC_UNONAME_IGNOREBL ) ) bIgnoreBlank = ScUnoHelpFunctions::GetBoolFromAny( aValue ); - else if ( aString.EqualsAscii( SC_UNONAME_SHOWLIST ) ) aValue >>= nShowList; - else if ( aString.EqualsAscii( SC_UNONAME_INPTITLE ) ) - { - rtl::OUString aStrVal; - if ( aValue >>= aStrVal ) - aInputTitle = String( aStrVal ); - } - else if ( aString.EqualsAscii( SC_UNONAME_INPMESS ) ) - { - rtl::OUString aStrVal; - if ( aValue >>= aStrVal ) - aInputMessage = String( aStrVal ); - } - else if ( aString.EqualsAscii( SC_UNONAME_ERRTITLE ) ) - { - rtl::OUString aStrVal; - if ( aValue >>= aStrVal ) - aErrorTitle = String( aStrVal ); - } - else if ( aString.EqualsAscii( SC_UNONAME_ERRMESS ) ) - { - rtl::OUString aStrVal; - if ( aValue >>= aStrVal ) - aErrorMessage = String( aStrVal ); - } - else if ( aString.EqualsAscii( SC_UNONAME_TYPE ) ) - { - sheet::ValidationType eType = (sheet::ValidationType) - ScUnoHelpFunctions::GetEnumFromAny( aValue ); - switch (eType) - { - case sheet::ValidationType_ANY: nValMode = SC_VALID_ANY; break; - case sheet::ValidationType_WHOLE: nValMode = SC_VALID_WHOLE; break; - case sheet::ValidationType_DECIMAL: nValMode = SC_VALID_DECIMAL; break; - case sheet::ValidationType_DATE: nValMode = SC_VALID_DATE; break; - case sheet::ValidationType_TIME: nValMode = SC_VALID_TIME; break; - case sheet::ValidationType_TEXT_LEN: nValMode = SC_VALID_TEXTLEN; break; - case sheet::ValidationType_LIST: nValMode = SC_VALID_LIST; break; - case sheet::ValidationType_CUSTOM: nValMode = SC_VALID_CUSTOM; break; - default: - { - // added to avoid warnings - } - } - } - else if ( aString.EqualsAscii( SC_UNONAME_ERRALSTY ) ) - { - sheet::ValidationAlertStyle eStyle = (sheet::ValidationAlertStyle) - ScUnoHelpFunctions::GetEnumFromAny( aValue ); - switch (eStyle) - { - case sheet::ValidationAlertStyle_STOP: nErrorStyle = SC_VALERR_STOP; break; - case sheet::ValidationAlertStyle_WARNING: nErrorStyle = SC_VALERR_WARNING; break; - case sheet::ValidationAlertStyle_INFO: nErrorStyle = SC_VALERR_INFO; break; - case sheet::ValidationAlertStyle_MACRO: nErrorStyle = SC_VALERR_MACRO; break; - default: - { - // added to avoid warnings - } - } - } - else if ( aString.EqualsAscii( SC_UNONAME_SOURCESTR ) ) - { - // internal - only for XML filter, not in PropertySetInfo, only set - - rtl::OUString aStrVal; - if ( aValue >>= aStrVal ) - aPosString = String( aStrVal ); - } - else if ( aString.EqualsAscii( SC_UNONAME_FORMULANMSP1 ) ) - { - // internal - only for XML filter, not in PropertySetInfo, only set - - rtl::OUString aStrVal; - if ( aValue >>= aStrVal ) - maExprNmsp1 = aStrVal; - } - else if ( aString.EqualsAscii( SC_UNONAME_FORMULANMSP2 ) ) - { - // internal - only for XML filter, not in PropertySetInfo, only set - - rtl::OUString aStrVal; - if ( aValue >>= aStrVal ) - maExprNmsp2 = aStrVal; - } - else if ( aString.EqualsAscii( SC_UNONAME_GRAMMAR1 ) ) - { - // internal - only for XML filter, not in PropertySetInfo, only set - - sal_Int32 nVal = 0; - if ( aValue >>= nVal ) - meGrammar1 = static_cast< FormulaGrammar::Grammar >(nVal); - } - else if ( aString.EqualsAscii( SC_UNONAME_GRAMMAR2 ) ) - { - // internal - only for XML filter, not in PropertySetInfo, only set - - sal_Int32 nVal = 0; - if ( aValue >>= nVal ) - meGrammar2 = static_cast< FormulaGrammar::Grammar >(nVal); - } -} - -uno::Any SAL_CALL ScTableValidationObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aPropertyName); - uno::Any aRet; - - if ( aString.EqualsAscii( SC_UNONAME_SHOWINP ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, bShowInput ); - else if ( aString.EqualsAscii( SC_UNONAME_SHOWERR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, bShowError ); - else if ( aString.EqualsAscii( SC_UNONAME_IGNOREBL ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, bIgnoreBlank ); - else if ( aString.EqualsAscii( SC_UNONAME_SHOWLIST ) ) aRet <<= nShowList; - else if ( aString.EqualsAscii( SC_UNONAME_INPTITLE ) ) aRet <<= rtl::OUString( aInputTitle ); - else if ( aString.EqualsAscii( SC_UNONAME_INPMESS ) ) aRet <<= rtl::OUString( aInputMessage ); - else if ( aString.EqualsAscii( SC_UNONAME_ERRTITLE ) ) aRet <<= rtl::OUString( aErrorTitle ); - else if ( aString.EqualsAscii( SC_UNONAME_ERRMESS ) ) aRet <<= rtl::OUString( aErrorMessage ); - else if ( aString.EqualsAscii( SC_UNONAME_TYPE ) ) - { - sheet::ValidationType eType = sheet::ValidationType_ANY; - switch (nValMode) - { - case SC_VALID_ANY: eType = sheet::ValidationType_ANY; break; - case SC_VALID_WHOLE: eType = sheet::ValidationType_WHOLE; break; - case SC_VALID_DECIMAL: eType = sheet::ValidationType_DECIMAL; break; - case SC_VALID_DATE: eType = sheet::ValidationType_DATE; break; - case SC_VALID_TIME: eType = sheet::ValidationType_TIME; break; - case SC_VALID_TEXTLEN: eType = sheet::ValidationType_TEXT_LEN; break; - case SC_VALID_LIST: eType = sheet::ValidationType_LIST; break; - case SC_VALID_CUSTOM: eType = sheet::ValidationType_CUSTOM; break; - } - aRet <<= eType; - } - else if ( aString.EqualsAscii( SC_UNONAME_ERRALSTY ) ) - { - sheet::ValidationAlertStyle eStyle = sheet::ValidationAlertStyle_STOP; - switch (nErrorStyle) - { - case SC_VALERR_STOP: eStyle = sheet::ValidationAlertStyle_STOP; break; - case SC_VALERR_WARNING: eStyle = sheet::ValidationAlertStyle_WARNING; break; - case SC_VALERR_INFO: eStyle = sheet::ValidationAlertStyle_INFO; break; - case SC_VALERR_MACRO: eStyle = sheet::ValidationAlertStyle_MACRO; break; - } - aRet <<= eStyle; - } - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScTableValidationObj ) - -// XUnoTunnel - -sal_Int64 SAL_CALL ScTableValidationObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScTableValidationObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScTableValidationObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScTableValidationObj::getUnoTunnelId() -{ - return theScTableValidationObjUnoTunnelId::get().getSeq(); -} - -ScTableValidationObj* ScTableValidationObj::getImplementation( - const uno::Reference<beans::XPropertySet> xObj ) -{ - ScTableValidationObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScTableValidationObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -//------------------------------------------------------------------------ - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/forbiuno.cxx b/sc/source/ui/unoobj/forbiuno.cxx deleted file mode 100644 index c6a91c28d..000000000 --- a/sc/source/ui/unoobj/forbiuno.cxx +++ /dev/null @@ -1,95 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <editeng/forbiddencharacterstable.hxx> - -#include "forbiuno.hxx" -#include "docsh.hxx" - -using namespace ::com::sun::star; - -//------------------------------------------------------------------------ - -rtl::Reference<SvxForbiddenCharactersTable> lcl_GetForbidden( ScDocShell* pDocSh ) -{ - rtl::Reference<SvxForbiddenCharactersTable> xRet; - if ( pDocSh ) - { - ScDocument* pDoc = pDocSh->GetDocument(); - xRet = pDoc->GetForbiddenCharacters(); - if ( !xRet.is() ) - { - // create an empty SvxForbiddenCharactersTable for SvxUnoForbiddenCharsTable, - // so changes can be stored. - - xRet = new SvxForbiddenCharactersTable( pDoc->GetServiceManager() ); - pDoc->SetForbiddenCharacters( xRet ); - } - } - return xRet; -} - -ScForbiddenCharsObj::ScForbiddenCharsObj( ScDocShell* pDocSh ) : - SvxUnoForbiddenCharsTable( lcl_GetForbidden( pDocSh ) ), - pDocShell( pDocSh ) -{ - if (pDocShell) - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScForbiddenCharsObj::~ScForbiddenCharsObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScForbiddenCharsObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // document gone - } -} - -void ScForbiddenCharsObj::onChange() -{ - if (pDocShell) - { - pDocShell->GetDocument()->SetForbiddenCharacters( mxForbiddenChars ); - pDocShell->PostPaintGridAll(); - pDocShell->SetDocumentModified(); - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/funcuno.cxx b/sc/source/ui/unoobj/funcuno.cxx deleted file mode 100644 index 3d5b2f08e..000000000 --- a/sc/source/ui/unoobj/funcuno.cxx +++ /dev/null @@ -1,742 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <sfx2/app.hxx> -#include <svl/itemprop.hxx> - -#include "scitems.hxx" -#include "funcuno.hxx" -#include "miscuno.hxx" -#include "cellsuno.hxx" -#include "scdll.hxx" -#include "document.hxx" -#include "compiler.hxx" -#include "formula/errorcodes.hxx" -#include "callform.hxx" -#include "addincol.hxx" -#include "rangeseq.hxx" -#include "cell.hxx" -#include "docoptio.hxx" -#include "optuno.hxx" -#include <docuno.hxx> -// for lcl_CopyData: -#include "markdata.hxx" -#include "patattr.hxx" -#include "docpool.hxx" -#include "attrib.hxx" -#include "clipparam.hxx" -#include "dociter.hxx" - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -// registered as implementation for service FunctionAccess, -// also supports service SpreadsheetDocumentSettings (to set null date etc.) - -#define SCFUNCTIONACCESS_SERVICE "com.sun.star.sheet.FunctionAccess" -#define SCDOCSETTINGS_SERVICE "com.sun.star.sheet.SpreadsheetDocumentSettings" - -//------------------------------------------------------------------------ - -// helper to use cached document if not in use, temporary document otherwise - -class ScTempDocSource -{ -private: - ScTempDocCache& rCache; - ScDocument* pTempDoc; - - static ScDocument* CreateDocument(); // create and initialize doc - -public: - ScTempDocSource( ScTempDocCache& rDocCache ); - ~ScTempDocSource(); - - ScDocument* GetDocument(); -}; - -//------------------------------------------------------------------------ - -ScDocument* ScTempDocSource::CreateDocument() -{ - ScDocument* pDoc = new ScDocument; // SCDOCMODE_DOCUMENT - pDoc->MakeTable( 0 ); - return pDoc; -} - -ScTempDocSource::ScTempDocSource( ScTempDocCache& rDocCache ) : - rCache( rDocCache ), - pTempDoc( NULL ) -{ - if ( rCache.IsInUse() ) - pTempDoc = CreateDocument(); - else - { - rCache.SetInUse( sal_True ); - if ( !rCache.GetDocument() ) - rCache.SetDocument( CreateDocument() ); - } -} - -ScTempDocSource::~ScTempDocSource() -{ - if ( pTempDoc ) - delete pTempDoc; - else - rCache.SetInUse( false ); -} - -ScDocument* ScTempDocSource::GetDocument() -{ - if ( pTempDoc ) - return pTempDoc; - else - return rCache.GetDocument(); -} - -//------------------------------------------------------------------------ - -ScTempDocCache::ScTempDocCache() : - pDoc( NULL ), - bInUse( false ) -{ -} - -ScTempDocCache::~ScTempDocCache() -{ - OSL_ENSURE( !bInUse, "ScTempDocCache dtor: bInUse" ); - delete pDoc; -} - -void ScTempDocCache::SetDocument( ScDocument* pNew ) -{ - OSL_ENSURE( !pDoc, "ScTempDocCache::SetDocument: already set" ); - pDoc = pNew; -} - -void ScTempDocCache::Clear() -{ - OSL_ENSURE( !bInUse, "ScTempDocCache::Clear: bInUse" ); - delete pDoc; - pDoc = NULL; -} - -//------------------------------------------------------------------------ - -// copy results from one document into another -//! merge this with ScAreaLink::Refresh -//! copy directly without a clipboard document? - -sal_Bool lcl_CopyData( ScDocument* pSrcDoc, const ScRange& rSrcRange, - ScDocument* pDestDoc, const ScAddress& rDestPos ) -{ - SCTAB nSrcTab = rSrcRange.aStart.Tab(); - SCTAB nDestTab = rDestPos.Tab(); - - ScRange aNewRange( rDestPos, ScAddress( - rSrcRange.aEnd.Col() - rSrcRange.aStart.Col() + rDestPos.Col(), - rSrcRange.aEnd.Row() - rSrcRange.aStart.Row() + rDestPos.Row(), - nDestTab ) ); - - ScDocument* pClipDoc = new ScDocument( SCDOCMODE_CLIP ); - ScMarkData aSourceMark; - aSourceMark.SelectOneTable( nSrcTab ); // for CopyToClip - aSourceMark.SetMarkArea( rSrcRange ); - ScClipParam aClipParam(rSrcRange, false); - pSrcDoc->CopyToClip(aClipParam, pClipDoc, &aSourceMark, false); - - if ( pClipDoc->HasAttrib( 0,0,nSrcTab, MAXCOL,MAXROW,nSrcTab, - HASATTR_MERGED | HASATTR_OVERLAPPED ) ) - { - ScPatternAttr aPattern( pSrcDoc->GetPool() ); - aPattern.GetItemSet().Put( ScMergeAttr() ); // Defaults - aPattern.GetItemSet().Put( ScMergeFlagAttr() ); - pClipDoc->ApplyPatternAreaTab( 0,0, MAXCOL,MAXROW, nSrcTab, aPattern ); - } - - // If the range contains formula cells with default number format, - // apply a number format for the formula result - ScCellIterator aIter( pClipDoc, rSrcRange ); - ScBaseCell* pCell = aIter.GetFirst(); - while (pCell) - { - if (pCell->GetCellType() == CELLTYPE_FORMULA) - { - ScAddress aCellPos = aIter.GetPos(); - sal_uInt32 nFormat = pClipDoc->GetNumberFormat(aCellPos); - if ( (nFormat % SV_COUNTRY_LANGUAGE_OFFSET) == 0 ) - { - ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pCell); - sal_uInt16 nErrCode = pFCell->GetErrCode(); - if ( nErrCode == 0 && pFCell->IsValue() ) - { - sal_uInt32 nNewFormat = pFCell->GetStandardFormat( *pClipDoc->GetFormatTable(), nFormat ); - if ( nNewFormat != nFormat ) - pClipDoc->ApplyAttr( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab(), - SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) ); - } - } - } - pCell = aIter.GetNext(); - } - - ScMarkData aDestMark; - aDestMark.SelectOneTable( nDestTab ); - aDestMark.SetMarkArea( aNewRange ); - pDestDoc->CopyFromClip( aNewRange, aDestMark, IDF_ALL & ~IDF_FORMULA, NULL, pClipDoc, false ); - - delete pClipDoc; - return sal_True; -} - -//------------------------------------------------------------------------ - -ScFunctionAccess::ScFunctionAccess() : - pOptions( NULL ), - aPropertyMap( ScDocOptionsHelper::GetPropertyMap() ), - mbArray( true ), // default according to behaviour of older Office versions - mbValid( true ) -{ - StartListening( *SFX_APP() ); // for SFX_HINT_DEINITIALIZING -} - -ScFunctionAccess::~ScFunctionAccess() -{ - delete pOptions; -} - -void ScFunctionAccess::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA(SfxSimpleHint) && - ((SfxSimpleHint&)rHint).GetId() == SFX_HINT_DEINITIALIZING ) - { - // document must not be used anymore - aDocCache.Clear(); - mbValid = false; - } -} - -// stuff for exService_... - -uno::Reference<uno::XInterface> SAL_CALL ScFunctionAccess_CreateInstance( - const uno::Reference<lang::XMultiServiceFactory>& ) -{ - SolarMutexGuard aGuard; - ScDLL::Init(); - static uno::Reference< uno::XInterface > xInst((::cppu::OWeakObject*) new ScFunctionAccess); - return xInst; -} - -rtl::OUString ScFunctionAccess::getImplementationName_Static() -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "stardiv.StarCalc.ScFunctionAccess" )); -} - -uno::Sequence<rtl::OUString> ScFunctionAccess::getSupportedServiceNames_Static() -{ - uno::Sequence<rtl::OUString> aRet(1); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCFUNCTIONACCESS_SERVICE )); - return aRet; -} - -// XServiceInfo - -rtl::OUString SAL_CALL ScFunctionAccess::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScFunctionAccess") ); -} - -sal_Bool SAL_CALL ScFunctionAccess::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr(rServiceName); - return aServiceStr.EqualsAscii( SCFUNCTIONACCESS_SERVICE ) || - aServiceStr.EqualsAscii( SCDOCSETTINGS_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScFunctionAccess::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(2); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCFUNCTIONACCESS_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCDOCSETTINGS_SERVICE )); - return aRet; -} - -// XPropertySet (document settings) - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScFunctionAccess::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( &aPropertyMap )); - return aRef; -} - -void SAL_CALL ScFunctionAccess::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsArrayFunction" ) ) ) - { - if( !(aValue >>= mbArray) ) - throw lang::IllegalArgumentException(); - } - else - { - if ( !pOptions ) - pOptions = new ScDocOptions(); - - // options aren't initialized from configuration - always get the same default behaviour - - sal_Bool bDone = ScDocOptionsHelper::setPropertyValue( *pOptions, aPropertyMap, aPropertyName, aValue ); - if (!bDone) - throw beans::UnknownPropertyException(); - } -} - -uno::Any SAL_CALL ScFunctionAccess::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "IsArrayFunction" ) ) ) - return uno::Any( mbArray ); - - if ( !pOptions ) - pOptions = new ScDocOptions(); - - // options aren't initialized from configuration - always get the same default behaviour - - return ScDocOptionsHelper::getPropertyValue( *pOptions, aPropertyMap, aPropertyName ); -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScFunctionAccess ) - -// XFunctionAccess - -sal_Bool lcl_AddFunctionToken( ScTokenArray& rArray, const rtl::OUString& rName,const ScCompiler& rCompiler ) -{ - // function names are always case-insensitive - String aUpper( ScGlobal::pCharClass->upper( rName ) ); - - // same options as in ScCompiler::IsOpCode: - // 1. built-in function name - - OpCode eOp = rCompiler.GetEnglishOpCode( aUpper ); - if ( eOp != ocNone ) - { - rArray.AddOpCode( eOp ); - return sal_True; - } - - // 2. old add in functions - - sal_uInt16 nIndex; - if ( ScGlobal::GetFuncCollection()->SearchFunc( aUpper, nIndex ) ) - { - rArray.AddExternal( aUpper.GetBuffer() ); - return sal_True; - } - - // 3. new (uno) add in functions - - String aIntName(ScGlobal::GetAddInCollection()->FindFunction( aUpper, false )); - if (aIntName.Len()) - { - rArray.AddExternal( aIntName.GetBuffer() ); // international name - return sal_True; - } - - return false; // no valid function name -} - -void lcl_AddRef( ScTokenArray& rArray, long nStartRow, long nColCount, long nRowCount ) -{ - ScComplexRefData aRef; - aRef.InitFlags(); - aRef.Ref1.nTab = 0; - aRef.Ref2.nTab = 0; - aRef.Ref1.nCol = 0; - aRef.Ref1.nRow = (SCROW) nStartRow; - aRef.Ref2.nCol = (SCCOL) (nColCount - 1); - aRef.Ref2.nRow = (SCROW) (nStartRow + nRowCount - 1); - rArray.AddDoubleReference(aRef); -} - -class SimpleVisitor -{ -protected: - bool mbArgError; - ScDocument* mpDoc; -public: - SimpleVisitor( ScDocument* pDoc ) : mbArgError( false ), mpDoc( pDoc ) {} - // could possibly just get away with JUST the following overload - // 1) virtual void visitElem( long& nCol, long& nRow, const double& elem ) - // 2) virtual void visitElem( long& nCol, long& nRow, const rtl::OUString& elem ) - // 3) virtual void visitElem( long& nCol, long& nRow, const uno::Any& elem ) - // the other types methods are here just to reflect the orig code and for - // completeness. - - void visitElem( long nCol, long nRow, const sal_Int16& elem ) - { - mpDoc->SetValue( (SCCOL) nCol, (SCROW) nRow, 0, elem ); - } - void visitElem( long nCol, long nRow, const sal_Int32& elem ) - { - mpDoc->SetValue( (SCCOL) nCol, (SCROW) nRow, 0, elem ); - } - void visitElem( long nCol, long nRow, const double& elem ) - { - mpDoc->SetValue( (SCCOL) nCol, (SCROW) nRow, 0, elem ); - } - void visitElem( long nCol, long nRow, const rtl::OUString& elem ) - { - if ( elem.getLength() ) - mpDoc->PutCell( (SCCOL) nCol, (SCROW) nRow, 0, - new ScStringCell( elem ) ); - } - void visitElem( long nCol, long nRow, const uno::Any& rElement ) - { - uno::TypeClass eElemClass = rElement.getValueTypeClass(); - if ( eElemClass == uno::TypeClass_VOID ) - { - // leave empty - } - else if ( eElemClass == uno::TypeClass_BYTE || - eElemClass == uno::TypeClass_SHORT || - eElemClass == uno::TypeClass_UNSIGNED_SHORT || - eElemClass == uno::TypeClass_LONG || - eElemClass == uno::TypeClass_UNSIGNED_LONG || - eElemClass == uno::TypeClass_FLOAT || - eElemClass == uno::TypeClass_DOUBLE ) - { - // accept integer types because Basic passes a floating point - // variable as byte, short or long if it's an integer number. - double fVal(0.0); - rElement >>= fVal; - visitElem( nCol, nRow, fVal ); - } - else if ( eElemClass == uno::TypeClass_STRING ) - { - rtl::OUString aUStr; - rElement >>= aUStr; - visitElem( nCol, nRow, aUStr ); - } - else - mbArgError = true; - } - bool hasArgError() const { return mbArgError; } -}; - -template< class seq > -class SequencesContainer -{ - uno::Sequence< uno::Sequence< seq > > maSeq; - - long& mrDocRow; - bool mbOverflow; - bool mbArgError; - ScDocument* mpDoc; - ScTokenArray& mrTokenArr; - -public: - SequencesContainer( const uno::Any& rArg, ScTokenArray& rTokenArr, long& rDocRow, ScDocument* pDoc ) : - mrDocRow( rDocRow ), mbOverflow(false), mbArgError(false), mpDoc( pDoc ), mrTokenArr( rTokenArr ) - { - rArg >>= maSeq; - } - - void process() - { - SimpleVisitor aVisitor(mpDoc); - long nStartRow = mrDocRow; - long nRowCount = maSeq.getLength(); - long nMaxColCount = 0; - const uno::Sequence< seq >* pRowArr = maSeq.getConstArray(); - for ( long nRow=0; nRow<nRowCount; nRow++ ) - { - long nColCount = pRowArr[nRow].getLength(); - if ( nColCount > nMaxColCount ) - nMaxColCount = nColCount; - const seq* pColArr = pRowArr[nRow].getConstArray(); - for (long nCol=0; nCol<nColCount; nCol++) - if ( nCol <= MAXCOL && mrDocRow <= MAXROW ) - aVisitor.visitElem( nCol, mrDocRow, pColArr[ nCol ] ); - else - mbOverflow=true; - mrDocRow++; - } - mbArgError = aVisitor.hasArgError(); - if ( nRowCount && nMaxColCount && !mbOverflow ) - lcl_AddRef( mrTokenArr, nStartRow, nMaxColCount, nRowCount ); - } - bool getOverflow() const { return mbOverflow; } - bool getArgError() const { return mbArgError; } -}; - -template <class T> -class ArrayOfArrayProc -{ -public: -static void processSequences( ScDocument* pDoc, const uno::Any& rArg, ScTokenArray& rTokenArr, - long& rDocRow, sal_Bool& rArgErr, sal_Bool& rOverflow ) -{ - SequencesContainer< T > aContainer( rArg, rTokenArr, rDocRow, pDoc ); - aContainer.process(); - rArgErr = aContainer.getArgError(); - rOverflow = aContainer.getOverflow(); -} -}; - -uno::Any SAL_CALL ScFunctionAccess::callFunction( const rtl::OUString& aName, - const uno::Sequence<uno::Any>& aArguments ) - throw(container::NoSuchElementException, lang::IllegalArgumentException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if (!mbValid) - throw uno::RuntimeException(); - - // use cached document if not in use, temporary document otherwise - // (deleted in ScTempDocSource dtor) - ScTempDocSource aSource( aDocCache ); - ScDocument* pDoc = aSource.GetDocument(); - const static SCTAB nTempSheet = 1; - // Create an extra tab to contain the Function Cell - // this will allow full rows to be used. - if ( !pDoc->HasTable( nTempSheet ) ) - pDoc->MakeTable( nTempSheet ); - - /// TODO: check - ScAddress aAdr; - ScCompiler aCompiler(pDoc,aAdr); - aCompiler.SetGrammar(pDoc->GetGrammar()); - - // - // find function - // - - ScTokenArray aTokenArr; - if ( !lcl_AddFunctionToken( aTokenArr, aName,aCompiler ) ) - { - // function not found - throw container::NoSuchElementException(); - } - - // - // set options (null date, etc.) - // - - if ( pOptions ) - pDoc->SetDocOptions( *pOptions ); - - // - // add arguments to token array - // - - sal_Bool bArgErr = false; - sal_Bool bOverflow = false; - long nDocRow = 0; - long nArgCount = aArguments.getLength(); - const uno::Any* pArgArr = aArguments.getConstArray(); - - aTokenArr.AddOpCode(ocOpen); - for (long nPos=0; nPos<nArgCount; nPos++) - { - if ( nPos > 0 ) - aTokenArr.AddOpCode(ocSep); - - const uno::Any& rArg = pArgArr[nPos]; - - uno::TypeClass eClass = rArg.getValueTypeClass(); - uno::Type aType = rArg.getValueType(); - if ( eClass == uno::TypeClass_BYTE || - eClass == uno::TypeClass_BOOLEAN || - eClass == uno::TypeClass_SHORT || - eClass == uno::TypeClass_UNSIGNED_SHORT || - eClass == uno::TypeClass_LONG || - eClass == uno::TypeClass_UNSIGNED_LONG || - eClass == uno::TypeClass_FLOAT || - eClass == uno::TypeClass_DOUBLE ) - { - // accept integer types because Basic passes a floating point - // variable as byte, short or long if it's an integer number. - double fVal = 0; - rArg >>= fVal; - aTokenArr.AddDouble( fVal ); - } - else if ( eClass == uno::TypeClass_STRING ) - { - rtl::OUString aUStr; - rArg >>= aUStr; - String aStr( aUStr ); - aTokenArr.AddString( aStr.GetBuffer() ); - } - else if ( aType.equals( getCppuType( (uno::Sequence< uno::Sequence<sal_Int16> > *)0 ) ) ) - { - ArrayOfArrayProc<sal_Int16>::processSequences( pDoc, rArg, aTokenArr, nDocRow, bArgErr, bOverflow ); - } - else if ( aType.equals( getCppuType( (uno::Sequence< uno::Sequence<sal_Int32> > *)0 ) ) ) - { - ArrayOfArrayProc<sal_Int32>::processSequences( pDoc, rArg, aTokenArr, nDocRow, bArgErr, bOverflow ); - } - else if ( aType.equals( getCppuType( (uno::Sequence< uno::Sequence<double> > *)0 ) ) ) - { - ArrayOfArrayProc<double>::processSequences( pDoc, rArg, aTokenArr, nDocRow, bArgErr, bOverflow ); - } - else if ( aType.equals( getCppuType( (uno::Sequence< uno::Sequence<rtl::OUString> > *)0 ) ) ) - { - ArrayOfArrayProc<rtl::OUString>::processSequences( pDoc, rArg, aTokenArr, nDocRow, bArgErr, bOverflow ); - } - else if ( aType.equals( getCppuType( (uno::Sequence< uno::Sequence<uno::Any> > *)0 ) ) ) - { - ArrayOfArrayProc<uno::Any>::processSequences( pDoc, rArg, aTokenArr, nDocRow, bArgErr, bOverflow ); - } - else if ( aType.equals( getCppuType( (uno::Reference<table::XCellRange>*)0 ) ) ) - { - // currently, only our own cell ranges are supported - - uno::Reference<table::XCellRange> xRange(rArg, uno::UNO_QUERY); - ScCellRangesBase* pImpl = ScCellRangesBase::getImplementation( xRange ); - if ( pImpl ) - { - ScDocument* pSrcDoc = pImpl->GetDocument(); - const ScRangeList& rRanges = pImpl->GetRangeList(); - if ( pSrcDoc && rRanges.size() == 1 ) - { - ScRange aSrcRange = *rRanges[ 0 ]; - - long nStartRow = nDocRow; - long nColCount = aSrcRange.aEnd.Col() - aSrcRange.aStart.Col() + 1; - long nRowCount = aSrcRange.aEnd.Row() - aSrcRange.aStart.Row() + 1; - - if ( nStartRow + nRowCount > MAXROWCOUNT ) - bOverflow = sal_True; - else - { - // copy data - if ( !lcl_CopyData( pSrcDoc, aSrcRange, pDoc, ScAddress( 0, (SCROW)nDocRow, 0 ) ) ) - bOverflow = sal_True; - } - - nDocRow += nRowCount; - if ( !bOverflow ) - lcl_AddRef( aTokenArr, nStartRow, nColCount, nRowCount ); - } - else - bArgErr = sal_True; - } - else - bArgErr = sal_True; - } - else - bArgErr = sal_True; // invalid type - } - aTokenArr.AddOpCode(ocClose); - aTokenArr.AddOpCode(ocStop); - - // - // execute formula - // - - uno::Any aRet; - if ( !bArgErr && !bOverflow && nDocRow <= MAXROWCOUNT ) - { - ScAddress aFormulaPos( 0, 0, nTempSheet ); - // GRAM_PODF_A1 doesn't really matter for the token array but fits with - // other API compatibility grammars. - ScFormulaCell* pFormula = new ScFormulaCell( pDoc, aFormulaPos, - &aTokenArr, formula::FormulaGrammar::GRAM_PODF_A1, (sal_uInt8)(mbArray ? MM_FORMULA : MM_NONE) ); - pDoc->PutCell( aFormulaPos, pFormula ); //! necessary? - - // call GetMatrix before GetErrCode because GetMatrix always recalculates - // if there is no matrix result - - const ScMatrix* pMat = mbArray ? pFormula->GetMatrix() : 0; - sal_uInt16 nErrCode = pFormula->GetErrCode(); - if ( nErrCode == 0 ) - { - if ( pMat ) - { - // array result - ScRangeToSequence::FillMixedArray( aRet, pMat ); - } - else if ( pFormula->IsValue() ) - { - // numeric value - aRet <<= (double) pFormula->GetValue(); - } - else - { - // string result - String aStrVal; - pFormula->GetString( aStrVal ); - aRet <<= rtl::OUString( aStrVal ); - } - } - else if ( nErrCode == NOTAVAILABLE ) - { - // #N/A: leave result empty, no exception - } - else - { - // any other error: IllegalArgumentException - bArgErr = sal_True; - } - - pDoc->DeleteAreaTab( 0, 0, MAXCOL, MAXROW, 0, IDF_ALL ); - pDoc->DeleteAreaTab( 0, 0, 0, 0, nTempSheet, IDF_ALL ); - } - - if (bOverflow) - throw uno::RuntimeException(); - - if (bArgErr) - throw lang::IllegalArgumentException(); - - return aRet; -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/linkuno.cxx b/sc/source/ui/unoobj/linkuno.cxx deleted file mode 100644 index 94fdb130d..000000000 --- a/sc/source/ui/unoobj/linkuno.cxx +++ /dev/null @@ -1,1819 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <svl/smplhint.hxx> -#include <sfx2/linkmgr.hxx> -#include <vcl/svapp.hxx> - -#include "linkuno.hxx" -#include "miscuno.hxx" -#include "convuno.hxx" -#include "docsh.hxx" -#include "docfunc.hxx" -#include "collect.hxx" -#include "tablink.hxx" -#include "arealink.hxx" -#include "hints.hxx" -#include "unonames.hxx" -#include "rangeseq.hxx" -#include "token.hxx" - -#include <vector> -#include <climits> - -using namespace com::sun::star; -using namespace formula; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Sequence; -using ::com::sun::star::uno::UNO_QUERY; -using ::com::sun::star::uno::UNO_QUERY_THROW; -using ::com::sun::star::lang::IllegalArgumentException; -using ::com::sun::star::uno::RuntimeException; -using ::rtl::OUString; -using ::std::vector; - -//------------------------------------------------------------------------ - -// fuer Sheet- und Area-Links benutzt: -const SfxItemPropertyMapEntry* lcl_GetSheetLinkMap() -{ - static SfxItemPropertyMapEntry aSheetLinkMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_FILTER), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_FILTOPT), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_LINKURL), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_REFDELAY), 0, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_REFPERIOD), 0, &getCppuType((sal_Int32*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - return aSheetLinkMap_Impl; -} - -//------------------------------------------------------------------------ - -SV_IMPL_PTRARR( XRefreshListenerArr_Impl, XRefreshListenerPtr ); - -SC_SIMPLE_SERVICE_INFO( ScAreaLinkObj, "ScAreaLinkObj", "com.sun.star.sheet.CellAreaLink" ) -SC_SIMPLE_SERVICE_INFO( ScAreaLinksObj, "ScAreaLinksObj", "com.sun.star.sheet.CellAreaLinks" ) -SC_SIMPLE_SERVICE_INFO( ScDDELinkObj, "ScDDELinkObj", "com.sun.star.sheet.DDELink" ) -SC_SIMPLE_SERVICE_INFO( ScDDELinksObj, "ScDDELinksObj", "com.sun.star.sheet.DDELinks" ) -SC_SIMPLE_SERVICE_INFO( ScSheetLinkObj, "ScSheetLinkObj", "com.sun.star.sheet.SheetLink" ) -SC_SIMPLE_SERVICE_INFO( ScSheetLinksObj, "ScSheetLinksObj", "com.sun.star.sheet.SheetLinks" ) - -//------------------------------------------------------------------------ - -ScSheetLinkObj::ScSheetLinkObj(ScDocShell* pDocSh, const String& rName) : - aPropSet( lcl_GetSheetLinkMap() ), - pDocShell( pDocSh ), - aFileName( rName ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScSheetLinkObj::~ScSheetLinkObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScSheetLinkObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! notify if links in document are changed - // UpdateRef is not needed here - - if ( rHint.ISA( SfxSimpleHint ) ) - { - if ( ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pDocShell = NULL; // pointer is invalid - } - else if ( rHint.ISA( ScLinkRefreshedHint ) ) - { - const ScLinkRefreshedHint& rLH = (const ScLinkRefreshedHint&) rHint; - if ( rLH.GetLinkType() == SC_LINKREFTYPE_SHEET && rLH.GetUrl() == aFileName ) - Refreshed_Impl(); - } -} - -ScTableLink* ScSheetLinkObj::GetLink_Impl() const -{ - if (pDocShell) - { - sfx2::LinkManager* pLinkManager = pDocShell->GetDocument()->GetLinkManager(); - sal_uInt16 nCount = pLinkManager->GetLinks().Count(); - for (sal_uInt16 i=0; i<nCount; i++) - { - ::sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[i]; - if (pBase->ISA(ScTableLink)) - { - ScTableLink* pTabLink = (ScTableLink*)pBase; - if ( pTabLink->GetFileName() == aFileName ) - return pTabLink; - } - } - } - return NULL; // nicht gefunden -} - -// XNamed - -rtl::OUString SAL_CALL ScSheetLinkObj::getName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getFileName(); // Name ist der Dateiname (URL) -} - -void SAL_CALL ScSheetLinkObj::setName( const rtl::OUString& aName ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - setFileName(aName); // Name ist der Dateiname (URL) -} - -// XRefreshable - -void SAL_CALL ScSheetLinkObj::refresh() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTableLink* pLink = GetLink_Impl(); - if (pLink) - pLink->Refresh( pLink->GetFileName(), pLink->GetFilterName(), NULL, pLink->GetRefreshDelay() ); -} - -void SAL_CALL ScSheetLinkObj::addRefreshListener( - const uno::Reference<util::XRefreshListener >& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<util::XRefreshListener>* pObj = - new uno::Reference<util::XRefreshListener>( xListener ); - aRefreshListeners.Insert( pObj, aRefreshListeners.Count() ); - - // hold one additional ref to keep this object alive as long as there are listeners - if ( aRefreshListeners.Count() == 1 ) - acquire(); -} - -void SAL_CALL ScSheetLinkObj::removeRefreshListener( - const uno::Reference<util::XRefreshListener >& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aRefreshListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<util::XRefreshListener>* pObj = aRefreshListeners[n]; - if ( *pObj == xListener ) - { - aRefreshListeners.DeleteAndDestroy( n ); - if ( aRefreshListeners.Count() == 0 ) - release(); // release ref for listeners - break; - } - } -} - -void ScSheetLinkObj::Refreshed_Impl() -{ - lang::EventObject aEvent; - aEvent.Source.set((cppu::OWeakObject*)this); - for ( sal_uInt16 n=0; n<aRefreshListeners.Count(); n++ ) - (*aRefreshListeners[n])->refreshed( aEvent ); -} - -void ScSheetLinkObj::ModifyRefreshDelay_Impl( sal_Int32 nRefresh ) -{ - ScTableLink* pLink = GetLink_Impl(); - if( pLink ) - pLink->SetRefreshDelay( (sal_uLong) nRefresh ); -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScSheetLinkObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScSheetLinkObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - rtl::OUString aValStr; - if ( aNameString.EqualsAscii( SC_UNONAME_LINKURL ) ) - { - if ( aValue >>= aValStr ) - setFileName( aValStr ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_FILTER ) ) - { - if ( aValue >>= aValStr ) - setFilter( aValStr ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_FILTOPT ) ) - { - if ( aValue >>= aValStr ) - setFilterOptions( aValStr ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_REFPERIOD ) ) - { - sal_Int32 nRefresh = 0; - if ( aValue >>= nRefresh ) - setRefreshDelay( nRefresh ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_REFDELAY ) ) - { - sal_Int32 nRefresh = 0; - if ( aValue >>= nRefresh ) - setRefreshDelay( nRefresh ); - } -} - -uno::Any SAL_CALL ScSheetLinkObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - uno::Any aRet; - if ( aNameString.EqualsAscii( SC_UNONAME_LINKURL ) ) - aRet <<= getFileName(); - else if ( aNameString.EqualsAscii( SC_UNONAME_FILTER ) ) - aRet <<= getFilter(); - else if ( aNameString.EqualsAscii( SC_UNONAME_FILTOPT ) ) - aRet <<= getFilterOptions(); - else if ( aNameString.EqualsAscii( SC_UNONAME_REFPERIOD ) ) - aRet <<= getRefreshDelay(); - else if ( aNameString.EqualsAscii( SC_UNONAME_REFDELAY ) ) - aRet <<= getRefreshDelay(); - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScSheetLinkObj ) - -// internal: - -rtl::OUString ScSheetLinkObj::getFileName(void) const -{ - SolarMutexGuard aGuard; - return aFileName; -} - -void ScSheetLinkObj::setFileName(const rtl::OUString& rNewName) -{ - SolarMutexGuard aGuard; - ScTableLink* pLink = GetLink_Impl(); - if (pLink) - { - // pLink->Refresh mit neuem Dateinamen bringt sfx2::LinkManager durcheinander - // darum per Hand die Tabellen umsetzen und Link per UpdateLinks neu erzeugen - - String aNewStr(ScGlobal::GetAbsDocName( String(rNewName), pDocShell )); - - // zuerst Tabellen umsetzen - - ScDocument* pDoc = pDocShell->GetDocument(); - SCTAB nTabCount = pDoc->GetTableCount(); - for (SCTAB nTab=0; nTab<nTabCount; nTab++) - if ( pDoc->IsLinked(nTab) && pDoc->GetLinkDoc(nTab) == aFileName ) // alte Datei - pDoc->SetLink( nTab, pDoc->GetLinkMode(nTab), aNewStr, - pDoc->GetLinkFlt(nTab), pDoc->GetLinkOpt(nTab), - pDoc->GetLinkTab(nTab), - pDoc->GetLinkRefreshDelay(nTab) ); // nur Datei aendern - - // Links updaten - //! Undo !!! - - pLink = NULL; // wird bei UpdateLinks ungueltig - pDocShell->UpdateLinks(); // alter Link raus, evtl. neuen Link anlegen - - // Daten kopieren - - aFileName = aNewStr; - pLink = GetLink_Impl(); // neuer Link mit neuem Namen - if (pLink) - pLink->Update(); // inkl. Paint & Undo fuer Daten - } -} - -rtl::OUString ScSheetLinkObj::getFilter(void) const -{ - SolarMutexGuard aGuard; - rtl::OUString aRet; - ScTableLink* pLink = GetLink_Impl(); - if (pLink) - aRet = pLink->GetFilterName(); - return aRet; -} - -void ScSheetLinkObj::setFilter(const rtl::OUString& Filter) -{ - SolarMutexGuard aGuard; - ScTableLink* pLink = GetLink_Impl(); - if (pLink) - { - String aFilterStr(Filter); - pLink->Refresh( aFileName, aFilterStr, NULL, pLink->GetRefreshDelay() ); - } -} - -rtl::OUString ScSheetLinkObj::getFilterOptions(void) const -{ - SolarMutexGuard aGuard; - rtl::OUString aRet; - ScTableLink* pLink = GetLink_Impl(); - if (pLink) - aRet = pLink->GetOptions(); - return aRet; -} - -void ScSheetLinkObj::setFilterOptions(const rtl::OUString& FilterOptions) -{ - SolarMutexGuard aGuard; - ScTableLink* pLink = GetLink_Impl(); - if (pLink) - { - String aOptStr(FilterOptions); - pLink->Refresh( aFileName, pLink->GetFilterName(), &aOptStr, pLink->GetRefreshDelay() ); - } -} - -sal_Int32 ScSheetLinkObj::getRefreshDelay(void) const -{ - SolarMutexGuard aGuard; - sal_Int32 nRet = 0; - ScTableLink* pLink = GetLink_Impl(); - if (pLink) - nRet = (sal_Int32) pLink->GetRefreshDelay(); - return nRet; -} - -void ScSheetLinkObj::setRefreshDelay(sal_Int32 nRefreshDelay) -{ - SolarMutexGuard aGuard; - ModifyRefreshDelay_Impl( nRefreshDelay ); -} - -//------------------------------------------------------------------------ - -ScSheetLinksObj::ScSheetLinksObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScSheetLinksObj::~ScSheetLinksObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScSheetLinksObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XSheetLinks - -ScSheetLinkObj* ScSheetLinksObj::GetObjectByIndex_Impl(sal_Int32 nIndex) -{ - if (pDocShell) - { - sal_Int32 nCount = 0; - ScStrCollection aNames; // um doppelte wegzulassen - ScDocument* pDoc = pDocShell->GetDocument(); - SCTAB nTabCount = pDoc->GetTableCount(); - for (SCTAB nTab=0; nTab<nTabCount; nTab++) - if (pDoc->IsLinked(nTab)) - { - String aLinkDoc = pDoc->GetLinkDoc( nTab ); - StrData* pData = new StrData(aLinkDoc); - if (aNames.Insert(pData)) - { - if ( nCount == nIndex ) - return new ScSheetLinkObj( pDocShell, aLinkDoc ); - ++nCount; - } - else - delete pData; - } - } - return NULL; // kein Dokument oder Index zu gross -} - -ScSheetLinkObj* ScSheetLinksObj::GetObjectByName_Impl(const rtl::OUString& aName) -{ - // Name ist der Dateiname - - if (pDocShell) - { - String aNameStr(aName); - - ScDocument* pDoc = pDocShell->GetDocument(); - SCTAB nTabCount = pDoc->GetTableCount(); - for (SCTAB nTab=0; nTab<nTabCount; nTab++) - if (pDoc->IsLinked(nTab)) - { - //! case-insensitiv ??? - String aLinkDoc = pDoc->GetLinkDoc( nTab ); - if ( aLinkDoc == aNameStr ) - return new ScSheetLinkObj( pDocShell, aNameStr ); - } - } - - return NULL; -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScSheetLinksObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SheetLinksEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScSheetLinksObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Int32 nCount = 0; - if (pDocShell) - { - ScStrCollection aNames; // um doppelte wegzulassen - ScDocument* pDoc = pDocShell->GetDocument(); - SCTAB nTabCount = pDoc->GetTableCount(); - for (SCTAB nTab=0; nTab<nTabCount; nTab++) - if (pDoc->IsLinked(nTab)) - { - String aLinkDoc(pDoc->GetLinkDoc( nTab )); - StrData* pData = new StrData(aLinkDoc); - if (aNames.Insert(pData)) - ++nCount; - else - delete pData; - } - } - return nCount; -} - -uno::Any SAL_CALL ScSheetLinksObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<beans::XPropertySet> xLink(GetObjectByIndex_Impl(nIndex)); - if (xLink.is()) - return uno::makeAny(xLink); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScSheetLinksObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<beans::XPropertySet>*)0); -} - -sal_Bool SAL_CALL ScSheetLinksObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -uno::Any SAL_CALL ScSheetLinksObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<beans::XPropertySet> xLink(GetObjectByName_Impl(aName)); - if (xLink.is()) - return uno::makeAny(xLink); - else - throw container::NoSuchElementException(); -// return uno::Any(); -} - -sal_Bool SAL_CALL ScSheetLinksObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // Name ist der Dateiname - - if (pDocShell) - { - String aNameStr(aName); - - ScDocument* pDoc = pDocShell->GetDocument(); - SCTAB nTabCount = pDoc->GetTableCount(); - for (SCTAB nTab=0; nTab<nTabCount; nTab++) - if (pDoc->IsLinked(nTab)) - { - //! case-insensitiv ??? - String aLinkDoc(pDoc->GetLinkDoc( nTab )); - if ( aLinkDoc == aNameStr ) - return sal_True; - } - } - return false; -} - -uno::Sequence<rtl::OUString> SAL_CALL ScSheetLinksObj::getElementNames() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // Name ist der Dateiname - - if (pDocShell) - { - ScStrCollection aNames; // um doppelte wegzulassen - ScDocument* pDoc = pDocShell->GetDocument(); - SCTAB nTabCount = pDoc->GetTableCount(); - String aName; - - sal_Int32 nLinkCount = getCount(); - uno::Sequence<rtl::OUString> aSeq(nLinkCount); - rtl::OUString* pAry = aSeq.getArray(); - sal_uInt16 nPos = 0; - for (SCTAB nTab=0; nTab<nTabCount; nTab++) - { - if (pDoc->IsLinked(nTab)) - { - String aLinkDoc(pDoc->GetLinkDoc( nTab )); - StrData* pData = new StrData(aLinkDoc); - if (aNames.Insert(pData)) - pAry[nPos++] = aLinkDoc; - else - delete pData; - } - } - OSL_ENSURE( nPos==nLinkCount, "verzaehlt" ); - return aSeq; - } - return uno::Sequence<rtl::OUString>(); -} - -//------------------------------------------------------------------------ - -ScAreaLink* lcl_GetAreaLink( ScDocShell* pDocShell, sal_uInt16 nPos ) -{ - if (pDocShell) - { - sfx2::LinkManager* pLinkManager = pDocShell->GetDocument()->GetLinkManager(); - sal_uInt16 nTotalCount = pLinkManager->GetLinks().Count(); - sal_uInt16 nAreaCount = 0; - for (sal_uInt16 i=0; i<nTotalCount; i++) - { - ::sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[i]; - if (pBase->ISA(ScAreaLink)) - { - if ( nAreaCount == nPos ) - return (ScAreaLink*)pBase; - ++nAreaCount; - } - } - } - return NULL; // nicht gefunden -} - -ScAreaLinkObj::ScAreaLinkObj(ScDocShell* pDocSh, sal_uInt16 nP) : - aPropSet( lcl_GetSheetLinkMap() ), - pDocShell( pDocSh ), - nPos( nP ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScAreaLinkObj::~ScAreaLinkObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScAreaLinkObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! notify if links in document are changed - // UpdateRef is not needed here - - if ( rHint.ISA( SfxSimpleHint ) ) - { - if ( ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pDocShell = NULL; // pointer is invalid - } - else if ( rHint.ISA( ScLinkRefreshedHint ) ) - { - const ScLinkRefreshedHint& rLH = (const ScLinkRefreshedHint&) rHint; - if ( rLH.GetLinkType() == SC_LINKREFTYPE_AREA ) - { - // get this link to compare dest position - ScAreaLink* pLink = lcl_GetAreaLink(pDocShell, nPos); - if ( pLink && pLink->GetDestArea().aStart == rLH.GetDestPos() ) - Refreshed_Impl(); - } - } -} - -// XFileLink - -void ScAreaLinkObj::Modify_Impl( const rtl::OUString* pNewFile, const rtl::OUString* pNewFilter, - const rtl::OUString* pNewOptions, const rtl::OUString* pNewSource, - const table::CellRangeAddress* pNewDest ) -{ - ScAreaLink* pLink = lcl_GetAreaLink(pDocShell, nPos); - if (pLink) - { - String aFile (pLink->GetFile()); - String aFilter (pLink->GetFilter()); - String aOptions (pLink->GetOptions()); - String aSource (pLink->GetSource()); - ScRange aDest (pLink->GetDestArea()); - sal_uLong nRefresh = pLink->GetRefreshDelay(); - - //! Undo fuer Loeschen - //! Undo zusammenfassen - - sfx2::LinkManager* pLinkManager = pDocShell->GetDocument()->GetLinkManager(); - pLinkManager->Remove( pLink ); - pLink = NULL; // bei Remove geloescht - - sal_Bool bFitBlock = sal_True; // verschieben, wenn durch Update Groesse geaendert - if (pNewFile) - { - aFile = String( *pNewFile ); - aFile = ScGlobal::GetAbsDocName( aFile, pDocShell ); //! in InsertAreaLink? - } - if (pNewFilter) - aFilter = String( *pNewFilter ); - if (pNewOptions) - aOptions = String( *pNewOptions ); - if (pNewSource) - aSource = String( *pNewSource ); - if (pNewDest) - { - ScUnoConversion::FillScRange( aDest, *pNewDest ); - bFitBlock = false; // neuer Bereich angegeben -> keine Inhalte verschieben - } - - ScDocFunc aFunc(*pDocShell); - aFunc.InsertAreaLink( aFile, aFilter, aOptions, aSource, aDest, nRefresh, bFitBlock, sal_True ); - } -} - -void ScAreaLinkObj::ModifyRefreshDelay_Impl( sal_Int32 nRefresh ) -{ - ScAreaLink* pLink = lcl_GetAreaLink( pDocShell, nPos ); - if( pLink ) - pLink->SetRefreshDelay( (sal_uLong) nRefresh ); -} - -// XRefreshable - -void SAL_CALL ScAreaLinkObj::refresh() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAreaLink* pLink = lcl_GetAreaLink(pDocShell, nPos); - if (pLink) - pLink->Refresh( pLink->GetFile(), pLink->GetFilter(), pLink->GetSource(), pLink->GetRefreshDelay() ); -} - -void SAL_CALL ScAreaLinkObj::addRefreshListener( - const uno::Reference<util::XRefreshListener >& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<util::XRefreshListener>* pObj = - new uno::Reference<util::XRefreshListener>( xListener ); - aRefreshListeners.Insert( pObj, aRefreshListeners.Count() ); - - // hold one additional ref to keep this object alive as long as there are listeners - if ( aRefreshListeners.Count() == 1 ) - acquire(); -} - -void SAL_CALL ScAreaLinkObj::removeRefreshListener( - const uno::Reference<util::XRefreshListener >& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aRefreshListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<util::XRefreshListener>* pObj = aRefreshListeners[n]; - if ( *pObj == xListener ) - { - aRefreshListeners.DeleteAndDestroy( n ); - if ( aRefreshListeners.Count() == 0 ) - release(); // release ref for listeners - break; - } - } -} - -void ScAreaLinkObj::Refreshed_Impl() -{ - lang::EventObject aEvent; - aEvent.Source.set((cppu::OWeakObject*)this); - for ( sal_uInt16 n=0; n<aRefreshListeners.Count(); n++ ) - (*aRefreshListeners[n])->refreshed( aEvent ); -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScAreaLinkObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScAreaLinkObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - rtl::OUString aValStr; - if ( aNameString.EqualsAscii( SC_UNONAME_LINKURL ) ) - { - if ( aValue >>= aValStr ) - setFileName( aValStr ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_FILTER ) ) - { - if ( aValue >>= aValStr ) - setFilter( aValStr ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_FILTOPT ) ) - { - if ( aValue >>= aValStr ) - setFilterOptions( aValStr ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_REFPERIOD ) ) - { - sal_Int32 nRefresh = 0; - if ( aValue >>= nRefresh ) - setRefreshDelay( nRefresh ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_REFDELAY ) ) - { - sal_Int32 nRefresh = 0; - if ( aValue >>= nRefresh ) - setRefreshDelay( nRefresh ); - } -} - -uno::Any SAL_CALL ScAreaLinkObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - uno::Any aRet; - if ( aNameString.EqualsAscii( SC_UNONAME_LINKURL ) ) - aRet <<= getFileName(); - else if ( aNameString.EqualsAscii( SC_UNONAME_FILTER ) ) - aRet <<= getFilter(); - else if ( aNameString.EqualsAscii( SC_UNONAME_FILTOPT ) ) - aRet <<= getFilterOptions(); - else if ( aNameString.EqualsAscii( SC_UNONAME_REFPERIOD ) ) - aRet <<= getRefreshDelay(); - else if ( aNameString.EqualsAscii( SC_UNONAME_REFDELAY ) ) - aRet <<= getRefreshDelay(); - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScAreaLinkObj ) - -// internal: - -rtl::OUString ScAreaLinkObj::getFileName(void) const -{ - SolarMutexGuard aGuard; - rtl::OUString aRet; - ScAreaLink* pLink = lcl_GetAreaLink(pDocShell, nPos); - if (pLink) - aRet = pLink->GetFile(); - return aRet; -} - -void ScAreaLinkObj::setFileName(const rtl::OUString& rNewName) -{ - SolarMutexGuard aGuard; - Modify_Impl( &rNewName, NULL, NULL, NULL, NULL ); -} - -rtl::OUString ScAreaLinkObj::getFilter(void) const -{ - SolarMutexGuard aGuard; - rtl::OUString aRet; - ScAreaLink* pLink = lcl_GetAreaLink(pDocShell, nPos); - if (pLink) - aRet = pLink->GetFilter(); - return aRet; -} - -void ScAreaLinkObj::setFilter(const rtl::OUString& Filter) -{ - SolarMutexGuard aGuard; - Modify_Impl( NULL, &Filter, NULL, NULL, NULL ); -} - -rtl::OUString ScAreaLinkObj::getFilterOptions(void) const -{ - SolarMutexGuard aGuard; - rtl::OUString aRet; - ScAreaLink* pLink = lcl_GetAreaLink(pDocShell, nPos); - if (pLink) - aRet = pLink->GetOptions(); - return aRet; -} - -void ScAreaLinkObj::setFilterOptions(const rtl::OUString& FilterOptions) -{ - SolarMutexGuard aGuard; - Modify_Impl( NULL, NULL, &FilterOptions, NULL, NULL ); -} - -sal_Int32 ScAreaLinkObj::getRefreshDelay(void) const -{ - SolarMutexGuard aGuard; - sal_Int32 nRet = 0; - ScAreaLink* pLink = lcl_GetAreaLink(pDocShell, nPos); - if (pLink) - nRet = (sal_Int32) pLink->GetRefreshDelay(); - return nRet; -} - -void ScAreaLinkObj::setRefreshDelay(sal_Int32 nRefreshDelay) -{ - SolarMutexGuard aGuard; - ModifyRefreshDelay_Impl( nRefreshDelay ); -} - -// XAreaLink - -rtl::OUString SAL_CALL ScAreaLinkObj::getSourceArea() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - rtl::OUString aRet; - ScAreaLink* pLink = lcl_GetAreaLink(pDocShell, nPos); - if (pLink) - aRet = pLink->GetSource(); - return aRet; -} - -void SAL_CALL ScAreaLinkObj::setSourceArea( const rtl::OUString& aSourceArea ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - Modify_Impl( NULL, NULL, NULL, &aSourceArea, NULL ); -} - -table::CellRangeAddress SAL_CALL ScAreaLinkObj::getDestArea() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellRangeAddress aRet; - ScAreaLink* pLink = lcl_GetAreaLink(pDocShell, nPos); - if (pLink) - ScUnoConversion::FillApiRange( aRet, pLink->GetDestArea() ); - return aRet; -} - -void SAL_CALL ScAreaLinkObj::setDestArea( const table::CellRangeAddress& aDestArea ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - Modify_Impl( NULL, NULL, NULL, NULL, &aDestArea ); -} - -//------------------------------------------------------------------------ - -ScAreaLinksObj::ScAreaLinksObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScAreaLinksObj::~ScAreaLinksObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScAreaLinksObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XAreaLinks - -ScAreaLinkObj* ScAreaLinksObj::GetObjectByIndex_Impl(sal_Int32 nIndex) -{ - if ( pDocShell && nIndex >= 0 && nIndex < getCount() ) - return new ScAreaLinkObj( pDocShell, (sal_uInt16)nIndex ); - - return NULL; // nicht gefunden -} - -void SAL_CALL ScAreaLinksObj::insertAtPosition( const table::CellAddress& aDestPos, - const rtl::OUString& aFileName, - const rtl::OUString& aSourceArea, - const rtl::OUString& aFilter, - const rtl::OUString& aFilterOptions ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - String aFileStr (aFileName); - String aFilterStr (aFilter); - String aOptionStr (aFilterOptions); - String aSourceStr (aSourceArea); - ScAddress aDestAddr( (SCCOL)aDestPos.Column, (SCROW)aDestPos.Row, aDestPos.Sheet ); - - aFileStr = ScGlobal::GetAbsDocName( aFileStr, pDocShell ); //! in InsertAreaLink ??? - - ScDocFunc aFunc(*pDocShell); - aFunc.InsertAreaLink( aFileStr, aFilterStr, aOptionStr, - aSourceStr, ScRange(aDestAddr), - 0, false, sal_True ); // keine Inhalte verschieben - } -} - -void SAL_CALL ScAreaLinksObj::removeByIndex( sal_Int32 nIndex ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAreaLink* pLink = lcl_GetAreaLink(pDocShell, (sal_uInt16)nIndex); - if (pLink) - { - //! SetAddUndo oder so - - sfx2::LinkManager* pLinkManager = pDocShell->GetDocument()->GetLinkManager(); - pLinkManager->Remove( pLink ); - } -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScAreaLinksObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.CellAreaLinksEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScAreaLinksObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Int32 nAreaCount = 0; - if (pDocShell) - { - sfx2::LinkManager* pLinkManager = pDocShell->GetDocument()->GetLinkManager(); - sal_uInt16 nTotalCount = pLinkManager->GetLinks().Count(); - for (sal_uInt16 i=0; i<nTotalCount; i++) - { - ::sfx2::SvBaseLink* pBase = *pLinkManager->GetLinks()[i]; - if (pBase->ISA(ScAreaLink)) - ++nAreaCount; - } - } - return nAreaCount; -} - -uno::Any SAL_CALL ScAreaLinksObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XAreaLink> xLink(GetObjectByIndex_Impl(nIndex)); - if (xLink.is()) - return uno::makeAny(xLink); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScAreaLinksObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<sheet::XAreaLink>*)0); -} - -sal_Bool SAL_CALL ScAreaLinksObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -//------------------------------------------------------------------------ - -ScDDELinkObj::ScDDELinkObj(ScDocShell* pDocSh, const String& rA, - const String& rT, const String& rI) : - pDocShell( pDocSh ), - aAppl( rA ), - aTopic( rT ), - aItem( rI ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDDELinkObj::~ScDDELinkObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScDDELinkObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! notify if links in document are changed - // UpdateRef is not needed here - - if ( rHint.ISA( SfxSimpleHint ) ) - { - if ( ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pDocShell = NULL; // pointer is invalid - } - else if ( rHint.ISA( ScLinkRefreshedHint ) ) - { - const ScLinkRefreshedHint& rLH = (const ScLinkRefreshedHint&) rHint; - if ( rLH.GetLinkType() == SC_LINKREFTYPE_DDE && - rLH.GetDdeAppl() == aAppl && - rLH.GetDdeTopic() == aTopic && - rLH.GetDdeItem() == aItem ) //! mode is ignored - Refreshed_Impl(); - } -} - -// XNamed - -String lcl_BuildDDEName( const String& rAppl, const String& rTopic, const String& rItem ) -{ - // Appl|Topic!Item (wie Excel) - String aRet = rAppl; - aRet += '|'; - aRet += rTopic; - aRet += '!'; - aRet += rItem; - return aRet; -} - -rtl::OUString SAL_CALL ScDDELinkObj::getName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return lcl_BuildDDEName( aAppl, aTopic, aItem ); -} - -void SAL_CALL ScDDELinkObj::setName( const rtl::OUString& /* aName */ ) throw(uno::RuntimeException) -{ - // name can't be changed (formulas wouldn't find the link) - throw uno::RuntimeException(); -} - -// XDDELink - -rtl::OUString SAL_CALL ScDDELinkObj::getApplication() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - //! Test, ob Link noch im Dokument enthalten? - - return aAppl; -} - -rtl::OUString SAL_CALL ScDDELinkObj::getTopic() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - //! Test, ob Link noch im Dokument enthalten? - - return aTopic; -} - -rtl::OUString SAL_CALL ScDDELinkObj::getItem() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - //! Test, ob Link noch im Dokument enthalten? - - return aItem; -} - -// XRefreshable - -void SAL_CALL ScDDELinkObj::refresh() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - (void)pDoc->UpdateDdeLink( aAppl, aTopic, aItem ); - //! Fehler abfragen - } -} - -void SAL_CALL ScDDELinkObj::addRefreshListener( - const uno::Reference<util::XRefreshListener >& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<util::XRefreshListener>* pObj = - new uno::Reference<util::XRefreshListener>( xListener ); - aRefreshListeners.Insert( pObj, aRefreshListeners.Count() ); - - // hold one additional ref to keep this object alive as long as there are listeners - if ( aRefreshListeners.Count() == 1 ) - acquire(); -} - -void SAL_CALL ScDDELinkObj::removeRefreshListener( - const uno::Reference<util::XRefreshListener >& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aRefreshListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<util::XRefreshListener>* pObj = aRefreshListeners[n]; - if ( *pObj == xListener ) - { - aRefreshListeners.DeleteAndDestroy( n ); - if ( aRefreshListeners.Count() == 0 ) - release(); // release ref for listeners - break; - } - } -} - -// XDDELinkResults - -uno::Sequence< uno::Sequence< uno::Any > > ScDDELinkObj::getResults( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Sequence< uno::Sequence< uno::Any > > aReturn; - bool bSuccess = false; - - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if ( pDoc ) - { - sal_uInt16 nPos = 0; - if ( pDoc->FindDdeLink( aAppl, aTopic, aItem, SC_DDE_IGNOREMODE, nPos ) ) - { - const ScMatrix* pMatrix = pDoc->GetDdeLinkResultMatrix( nPos ); - if ( pMatrix ) - { - uno::Any aAny; - if ( ScRangeToSequence::FillMixedArray( aAny, pMatrix, true ) ) - { - aAny >>= aReturn; - } - } - bSuccess = true; - } - } - } - - if ( !bSuccess ) - { - throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( - "ScDDELinkObj::getResults: failed to get results!" ) ), - uno::Reference< uno::XInterface >() ); - } - - return aReturn; -} - -void ScDDELinkObj::setResults( const uno::Sequence< uno::Sequence< uno::Any > >& aResults ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - bool bSuccess = false; - - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if ( pDoc ) - { - sal_uInt16 nPos = 0; - if ( pDoc->FindDdeLink( aAppl, aTopic, aItem, SC_DDE_IGNOREMODE, nPos ) ) - { - uno::Any aAny; - aAny <<= aResults; - ScMatrixRef xMatrix = ScSequenceToMatrix::CreateMixedMatrix( aAny ); - bSuccess = pDoc->SetDdeLinkResultMatrix( nPos, xMatrix ); - } - } - } - - if ( !bSuccess ) - { - throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( - "ScDDELinkObj::setResults: failed to set results!" ) ), - uno::Reference< uno::XInterface >() ); - } -} - -void ScDDELinkObj::Refreshed_Impl() -{ - lang::EventObject aEvent; - aEvent.Source.set((cppu::OWeakObject*)this); - for ( sal_uInt16 n=0; n<aRefreshListeners.Count(); n++ ) - (*aRefreshListeners[n])->refreshed( aEvent ); -} - -//------------------------------------------------------------------------ - -ScDDELinksObj::ScDDELinksObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScDDELinksObj::~ScDDELinksObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScDDELinksObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XDDELinks - -ScDDELinkObj* ScDDELinksObj::GetObjectByIndex_Impl(sal_Int32 nIndex) -{ - if (pDocShell) - { - String aAppl, aTopic, aItem; - if ( nIndex <= USHRT_MAX && - pDocShell->GetDocument()->GetDdeLinkData( (sal_uInt16)nIndex, aAppl, aTopic, aItem ) ) - return new ScDDELinkObj( pDocShell, aAppl, aTopic, aItem ); - } - return NULL; -} - -ScDDELinkObj* ScDDELinksObj::GetObjectByName_Impl(const rtl::OUString& aName) -{ - if (pDocShell) - { - String aNamStr(aName); - String aAppl, aTopic, aItem; - - ScDocument* pDoc = pDocShell->GetDocument(); - sal_uInt16 nCount = pDoc->GetDdeLinkCount(); - for (sal_uInt16 i=0; i<nCount; i++) - { - pDoc->GetDdeLinkData( i, aAppl, aTopic, aItem ); - if ( lcl_BuildDDEName(aAppl, aTopic, aItem) == aNamStr ) - return new ScDDELinkObj( pDocShell, aAppl, aTopic, aItem ); - } - } - return NULL; -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScDDELinksObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.DDELinksEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScDDELinksObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Int32 nAreaCount = 0; - if (pDocShell) - nAreaCount = pDocShell->GetDocument()->GetDdeLinkCount(); - return nAreaCount; -} - -uno::Any SAL_CALL ScDDELinksObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XDDELink> xLink(GetObjectByIndex_Impl(nIndex)); - if (xLink.is()) - return uno::makeAny(xLink); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScDDELinksObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<sheet::XDDELink>*)0); -} - -sal_Bool SAL_CALL ScDDELinksObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -uno::Any SAL_CALL ScDDELinksObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XDDELink> xLink(GetObjectByName_Impl(aName)); - if (xLink.is()) - return uno::makeAny(xLink); - else - throw container::NoSuchElementException(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScDDELinksObj::getElementNames() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - String aAppl, aTopic, aItem; - - ScDocument* pDoc = pDocShell->GetDocument(); - sal_uInt16 nCount = pDoc->GetDdeLinkCount(); - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pAry = aSeq.getArray(); - - for (sal_uInt16 i=0; i<nCount; i++) - { - pDoc->GetDdeLinkData( i, aAppl, aTopic, aItem ); - pAry[i] = lcl_BuildDDEName(aAppl, aTopic, aItem); - } - return aSeq; - } - return uno::Sequence<rtl::OUString>(); -} - -sal_Bool SAL_CALL ScDDELinksObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - String aNamStr(aName); - String aAppl, aTopic, aItem; - - ScDocument* pDoc = pDocShell->GetDocument(); - sal_uInt16 nCount = pDoc->GetDdeLinkCount(); - for (sal_uInt16 i=0; i<nCount; i++) - { - pDoc->GetDdeLinkData( i, aAppl, aTopic, aItem ); - if ( lcl_BuildDDEName(aAppl, aTopic, aItem) == aNamStr ) - return sal_True; - } - } - return false; -} - -// XDDELinks - -uno::Reference< sheet::XDDELink > ScDDELinksObj::addDDELink( - const ::rtl::OUString& aApplication, const ::rtl::OUString& aTopic, - const ::rtl::OUString& aItem, ::com::sun::star::sheet::DDELinkMode nMode ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< sheet::XDDELink > xLink; - - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - if ( pDoc ) - { - sal_uInt8 nMod = SC_DDE_DEFAULT; - switch ( nMode ) - { - case sheet::DDELinkMode_DEFAULT: - { - nMod = SC_DDE_DEFAULT; - } - break; - case sheet::DDELinkMode_ENGLISH: - { - nMod = SC_DDE_ENGLISH; - } - break; - case sheet::DDELinkMode_TEXT: - { - nMod = SC_DDE_TEXT; - } - break; - default: - { - } - break; - } - - if ( pDoc->CreateDdeLink( aApplication, aTopic, aItem, nMod, ScMatrixRef() ) ) - { - const ::rtl::OUString aName( lcl_BuildDDEName( aApplication, aTopic, aItem ) ); - xLink.set( GetObjectByName_Impl( aName ) ); - } - } - } - - if ( !xLink.is() ) - { - throw uno::RuntimeException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( - "ScDDELinksObj::addDDELink: cannot add DDE link!" ) ), - uno::Reference< uno::XInterface >() ); - } - - return xLink; -} - -// ============================================================================ - -ScExternalSheetCacheObj::ScExternalSheetCacheObj(ScExternalRefCache::TableTypeRef pTable, size_t nIndex) : - mpTable(pTable), - mnIndex(nIndex) -{ -} - -ScExternalSheetCacheObj::~ScExternalSheetCacheObj() -{ -} - -void SAL_CALL ScExternalSheetCacheObj::setCellValue(sal_Int32 nCol, sal_Int32 nRow, const Any& rValue) - throw (IllegalArgumentException, RuntimeException) -{ - SolarMutexGuard aGuard; - if (nRow < 0 || nCol < 0) - throw IllegalArgumentException(); - - ScExternalRefCache::TokenRef pToken; - double fVal = 0.0; - OUString aVal; - if (rValue >>= fVal) - pToken.reset(new FormulaDoubleToken(fVal)); - else if (rValue >>= aVal) - pToken.reset(new FormulaStringToken(aVal)); - else - // unidentified value type. - return; - - mpTable->setCell(static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow), pToken); -} - -Any SAL_CALL ScExternalSheetCacheObj::getCellValue(sal_Int32 nCol, sal_Int32 nRow) - throw (IllegalArgumentException, RuntimeException) -{ - SolarMutexGuard aGuard; - if (nRow < 0 || nCol < 0) - throw IllegalArgumentException(); - - FormulaToken* pToken = mpTable->getCell(static_cast<SCCOL>(nCol), static_cast<SCROW>(nRow)).get(); - if (!pToken) - throw IllegalArgumentException(); - - Any aValue; - switch (pToken->GetType()) - { - case svDouble: - { - double fVal = pToken->GetDouble(); - aValue <<= fVal; - } - break; - case svString: - { - OUString aVal = pToken->GetString(); - aValue <<= aVal; - } - break; - default: - throw IllegalArgumentException(); - } - return aValue; -} - -Sequence< sal_Int32 > SAL_CALL ScExternalSheetCacheObj::getAllRows() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - vector<SCROW> aRows; - mpTable->getAllRows(aRows); - size_t nSize = aRows.size(); - Sequence<sal_Int32> aRowsSeq(nSize); - for (size_t i = 0; i < nSize; ++i) - aRowsSeq[i] = aRows[i]; - - return aRowsSeq; -} - -Sequence< sal_Int32 > SAL_CALL ScExternalSheetCacheObj::getAllColumns(sal_Int32 nRow) - throw (IllegalArgumentException, RuntimeException) -{ - SolarMutexGuard aGuard; - if (nRow < 0) - throw IllegalArgumentException(); - - vector<SCCOL> aCols; - mpTable->getAllCols(static_cast<SCROW>(nRow), aCols); - size_t nSize = aCols.size(); - Sequence<sal_Int32> aColsSeq(nSize); - for (size_t i = 0; i < nSize; ++i) - aColsSeq[i] = aCols[i]; - - return aColsSeq; -} - -sal_Int32 SAL_CALL ScExternalSheetCacheObj::getTokenIndex() - throw (RuntimeException) -{ - return static_cast< sal_Int32 >( mnIndex ); -} - -// ============================================================================ - -ScExternalDocLinkObj::ScExternalDocLinkObj(ScExternalRefManager* pRefMgr, sal_uInt16 nFileId) : - mpRefMgr(pRefMgr), mnFileId(nFileId) -{ -} - -ScExternalDocLinkObj::~ScExternalDocLinkObj() -{ -} - -Reference< sheet::XExternalSheetCache > SAL_CALL ScExternalDocLinkObj::addSheetCache( - const OUString& aSheetName, sal_Bool bDynamicCache ) - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - size_t nIndex = 0; - ScExternalRefCache::TableTypeRef pTable = mpRefMgr->getCacheTable(mnFileId, aSheetName, true, &nIndex); - if (!bDynamicCache) - // Set the whole table cached to prevent access to the source document. - pTable->setWholeTableCached(); - - Reference< sheet::XExternalSheetCache > aSheetCache(new ScExternalSheetCacheObj(pTable, nIndex)); - return aSheetCache; -} - -Any SAL_CALL ScExternalDocLinkObj::getByName(const::rtl::OUString &aName) - throw (container::NoSuchElementException, lang::WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - size_t nIndex = 0; - ScExternalRefCache::TableTypeRef pTable = mpRefMgr->getCacheTable(mnFileId, aName, false, &nIndex); - if (!pTable) - throw container::NoSuchElementException(); - - Reference< sheet::XExternalSheetCache > aSheetCache(new ScExternalSheetCacheObj(pTable, nIndex)); - - Any aAny; - aAny <<= aSheetCache; - return aAny; -} - -Sequence< OUString > SAL_CALL ScExternalDocLinkObj::getElementNames() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - vector<OUString> aTabNames; - mpRefMgr->getAllCachedTableNames(mnFileId, aTabNames); - size_t n = aTabNames.size(); - Sequence<OUString> aSeq(n); - for (size_t i = 0; i < n; ++i) - aSeq[i] = aTabNames[i]; - return aSeq; -} - -sal_Bool SAL_CALL ScExternalDocLinkObj::hasByName(const OUString &aName) - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - return static_cast<sal_Bool>(mpRefMgr->hasCacheTable(mnFileId, aName)); -} - -sal_Int32 SAL_CALL ScExternalDocLinkObj::getCount() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - return static_cast<sal_Int32>(mpRefMgr->getCacheTableCount(mnFileId)); -} - -Any SAL_CALL ScExternalDocLinkObj::getByIndex(sal_Int32 nIndex) - throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - size_t nTabCount = mpRefMgr->getCacheTableCount(mnFileId); - if (nIndex < 0 || nIndex >= static_cast<sal_Int32>(nTabCount)) - throw lang::IndexOutOfBoundsException(); - - ScExternalRefCache::TableTypeRef pTable = mpRefMgr->getCacheTable(mnFileId, static_cast<size_t>(nIndex)); - if (!pTable) - throw lang::IndexOutOfBoundsException(); - - Reference< sheet::XExternalSheetCache > aSheetCache(new ScExternalSheetCacheObj(pTable, nIndex)); - - Any aAny; - aAny <<= aSheetCache; - return aAny; -} - -Reference< container::XEnumeration > SAL_CALL ScExternalDocLinkObj::createEnumeration() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - Reference< container::XEnumeration > aRef( - new ScIndexEnumeration(this, OUString(RTL_CONSTASCII_USTRINGPARAM( - "com.sun.star.sheet.ExternalDocLink")))); - return aRef; -} - -uno::Type SAL_CALL ScExternalDocLinkObj::getElementType() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType(static_cast<Reference<sheet::XExternalDocLink>*>(0)); -} - -sal_Bool SAL_CALL ScExternalDocLinkObj::hasElements() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - return static_cast<sal_Bool>(mpRefMgr->getCacheTableCount(mnFileId) > 0); -} - -sal_Int32 SAL_CALL ScExternalDocLinkObj::getTokenIndex() - throw (RuntimeException) -{ - return static_cast<sal_Int32>(mnFileId); -} - -// ============================================================================ - -ScExternalDocLinksObj::ScExternalDocLinksObj(ScDocShell* pDocShell) : - mpDocShell(pDocShell), - mpRefMgr(pDocShell->GetDocument()->GetExternalRefManager()) -{ -} - -ScExternalDocLinksObj::~ScExternalDocLinksObj() -{ -} - -Reference< sheet::XExternalDocLink > SAL_CALL ScExternalDocLinksObj::addDocLink( - const OUString& aDocName ) - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nFileId = mpRefMgr->getExternalFileId(aDocName); - Reference< sheet::XExternalDocLink > aDocLink(new ScExternalDocLinkObj(mpRefMgr, nFileId)); - return aDocLink; -} - -Any SAL_CALL ScExternalDocLinksObj::getByName(const::rtl::OUString &aName) - throw (container::NoSuchElementException, lang::WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - if (!mpRefMgr->hasExternalFile(aName)) - throw container::NoSuchElementException(); - - sal_uInt16 nFileId = mpRefMgr->getExternalFileId(aName); - Reference< sheet::XExternalDocLink > aDocLink(new ScExternalDocLinkObj(mpRefMgr, nFileId)); - - Any aAny; - aAny <<= aDocLink; - return aAny; -} - -Sequence< OUString > SAL_CALL ScExternalDocLinksObj::getElementNames() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 n = mpRefMgr->getExternalFileCount(); - Sequence<OUString> aSeq(n); - for (sal_uInt16 i = 0; i < n; ++i) - { - const OUString* pName = mpRefMgr->getExternalFileName(i); - aSeq[i] = pName ? *pName : OUString(); - } - - return aSeq; -} - -sal_Bool SAL_CALL ScExternalDocLinksObj::hasByName(const OUString &aName) - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - return mpRefMgr->hasExternalFile(aName); -} - -sal_Int32 SAL_CALL ScExternalDocLinksObj::getCount() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - return mpRefMgr->getExternalFileCount(); -} - -Any SAL_CALL ScExternalDocLinksObj::getByIndex(sal_Int32 nIndex) - throw (lang::IndexOutOfBoundsException, lang::WrappedTargetException, RuntimeException) -{ - SolarMutexGuard aGuard; - if (nIndex > ::std::numeric_limits<sal_uInt16>::max() || nIndex < ::std::numeric_limits<sal_uInt16>::min()) - throw lang::IndexOutOfBoundsException(); - - sal_uInt16 nFileId = static_cast<sal_uInt16>(nIndex); - - if (!mpRefMgr->hasExternalFile(nFileId)) - throw lang::IndexOutOfBoundsException(); - - Reference< sheet::XExternalDocLink > aDocLink(new ScExternalDocLinkObj(mpRefMgr, nFileId)); - Any aAny; - aAny <<= aDocLink; - return aAny; -} - -Reference< container::XEnumeration > SAL_CALL ScExternalDocLinksObj::createEnumeration() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - Reference< container::XEnumeration > aRef( - new ScIndexEnumeration(this, OUString(RTL_CONSTASCII_USTRINGPARAM( - "com.sun.star.sheet.ExternalDocLinks")))); - return aRef; -} - -uno::Type SAL_CALL ScExternalDocLinksObj::getElementType() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType(static_cast<Reference<sheet::XExternalDocLinks>*>(0)); -} - -sal_Bool SAL_CALL ScExternalDocLinksObj::hasElements() - throw (RuntimeException) -{ - SolarMutexGuard aGuard; - return mpRefMgr->getExternalFileCount() > 0; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/listenercalls.cxx b/sc/source/ui/unoobj/listenercalls.cxx deleted file mode 100644 index 68de42912..000000000 --- a/sc/source/ui/unoobj/listenercalls.cxx +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <com/sun/star/util/XModifyListener.hpp> - -#include "listenercalls.hxx" - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -ScUnoListenerCalls::ScUnoListenerCalls() -{ -} - -ScUnoListenerCalls::~ScUnoListenerCalls() -{ - OSL_ENSURE( aEntries.empty(), "unhandled listener calls remaining" ); -} - -void ScUnoListenerCalls::Add( const uno::Reference<util::XModifyListener>& rListener, - const lang::EventObject& rEvent ) -{ - if ( rListener.is() ) - aEntries.push_back( ScUnoListenerEntry( rListener, rEvent ) ); -} - -void ScUnoListenerCalls::ExecuteAndClear() -{ - // Execute all stored calls and remove them from the list. - // During each modified() call, Add may be called again. - // These new calls are executed here, too. - - if (!aEntries.empty()) - { - std::list<ScUnoListenerEntry>::iterator aItr(aEntries.begin()); - std::list<ScUnoListenerEntry>::iterator aEndItr(aEntries.end()); - while ( aItr != aEndItr ) - { - ScUnoListenerEntry aEntry = *aItr; - try - { - aEntry.xListener->modified( aEntry.aEvent ); - } - catch ( const uno::RuntimeException& ) - { - // the listener is an external object and may throw a RuntimeException - // for reasons we don't know - } - - // New calls that are added during the modified() call are appended to the end - // of aEntries, so the loop will catch them, too (as long as erase happens - // after modified). - - aItr = aEntries.erase(aItr); - } - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/miscuno.cxx b/sc/source/ui/unoobj/miscuno.cxx deleted file mode 100644 index 817e146ef..000000000 --- a/sc/source/ui/unoobj/miscuno.cxx +++ /dev/null @@ -1,317 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <vcl/svapp.hxx> - -#include "miscuno.hxx" - -using namespace com::sun::star; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Any; -using ::rtl::OUString; - -//------------------------------------------------------------------------ - -SC_SIMPLE_SERVICE_INFO( ScNameToIndexAccess, "ScNameToIndexAccess", "stardiv.unknown" ) - -//------------------------------------------------------------------------ - -uno::Reference<uno::XInterface> ScUnoHelpFunctions::AnyToInterface( const uno::Any& rAny ) -{ - if ( rAny.getValueTypeClass() == uno::TypeClass_INTERFACE ) - { - return uno::Reference<uno::XInterface>(rAny, uno::UNO_QUERY); - } - return uno::Reference<uno::XInterface>(); //! Exception? -} - -sal_Bool ScUnoHelpFunctions::GetBoolProperty( const uno::Reference<beans::XPropertySet>& xProp, - const rtl::OUString& rName, sal_Bool bDefault ) -{ - sal_Bool bRet = bDefault; - if ( xProp.is() ) - { - try - { - uno::Any aAny(xProp->getPropertyValue( rName )); - //! type conversion??? - // operator >>= shouldn't be used for bool (?) - if ( aAny.getValueTypeClass() == uno::TypeClass_BOOLEAN ) - { - //! safe way to get bool value from any??? - bRet = *(sal_Bool*)aAny.getValue(); - } - } - catch(uno::Exception&) - { - // keep default - } - } - return bRet; -} - -sal_Int32 ScUnoHelpFunctions::GetLongProperty( const uno::Reference<beans::XPropertySet>& xProp, - const rtl::OUString& rName, long nDefault ) -{ - sal_Int32 nRet = nDefault; - if ( xProp.is() ) - { - try - { - //! type conversion??? - xProp->getPropertyValue( rName ) >>= nRet; - } - catch(uno::Exception&) - { - // keep default - } - } - return nRet; -} - -sal_Int32 ScUnoHelpFunctions::GetEnumProperty( const uno::Reference<beans::XPropertySet>& xProp, - const rtl::OUString& rName, long nDefault ) -{ - sal_Int32 nRet = nDefault; - if ( xProp.is() ) - { - try - { - uno::Any aAny(xProp->getPropertyValue( rName )); - - if ( aAny.getValueTypeClass() == uno::TypeClass_ENUM ) - { - //! get enum value from any??? - nRet = *(sal_Int32*)aAny.getValue(); - } - else - { - //! type conversion??? - aAny >>= nRet; - } - } - catch(uno::Exception&) - { - // keep default - } - } - return nRet; -} - -OUString ScUnoHelpFunctions::GetStringProperty( - const Reference<beans::XPropertySet>& xProp, const OUString& rName, const OUString& rDefault ) -{ - OUString aRet = rDefault; - if (!xProp.is()) - return aRet; - - try - { - Any any = xProp->getPropertyValue(rName); - any >>= aRet; - } - catch (const uno::Exception&) - { - } - - return aRet; -} - -sal_Bool ScUnoHelpFunctions::GetBoolFromAny( const uno::Any& aAny ) -{ - if ( aAny.getValueTypeClass() == uno::TypeClass_BOOLEAN ) - return *(sal_Bool*)aAny.getValue(); - return false; -} - -sal_Int16 ScUnoHelpFunctions::GetInt16FromAny( const uno::Any& aAny ) -{ - sal_Int16 nRet = 0; - if ( aAny >>= nRet ) - return nRet; - return 0; -} - -sal_Int32 ScUnoHelpFunctions::GetInt32FromAny( const uno::Any& aAny ) -{ - sal_Int32 nRet = 0; - if ( aAny >>= nRet ) - return nRet; - return 0; -} - -sal_Int32 ScUnoHelpFunctions::GetEnumFromAny( const uno::Any& aAny ) -{ - sal_Int32 nRet = 0; - if ( aAny.getValueTypeClass() == uno::TypeClass_ENUM ) - nRet = *(sal_Int32*)aAny.getValue(); - else - aAny >>= nRet; - return nRet; -} - -void ScUnoHelpFunctions::SetBoolInAny( uno::Any& rAny, sal_Bool bValue ) -{ - rAny.setValue( &bValue, getBooleanCppuType() ); -} - -void ScUnoHelpFunctions::SetOptionalPropertyValue( - Reference<beans::XPropertySet>& rPropSet, const sal_Char* pPropName, const Any& rVal ) -{ - try - { - rPropSet->setPropertyValue(OUString::createFromAscii(pPropName), rVal); - } - catch (const beans::UnknownPropertyException&) - { - // ignored - not supported. - } -} - -//------------------------------------------------------------------------ - -ScIndexEnumeration::ScIndexEnumeration(const uno::Reference<container::XIndexAccess>& rInd, - const rtl::OUString& rServiceName) : - xIndex( rInd ), - sServiceName(rServiceName), - nPos( 0 ) -{ -} - -ScIndexEnumeration::~ScIndexEnumeration() -{ -} - -// XEnumeration - -sal_Bool SAL_CALL ScIndexEnumeration::hasMoreElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( nPos < xIndex->getCount() ); -} - -uno::Any SAL_CALL ScIndexEnumeration::nextElement() throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aReturn; - try - { - aReturn = xIndex->getByIndex(nPos++); - } - catch (lang::IndexOutOfBoundsException&) - { - throw container::NoSuchElementException(); - } - return aReturn; -} - -::rtl::OUString SAL_CALL ScIndexEnumeration::getImplementationName() - throw(::com::sun::star::uno::RuntimeException) -{ - return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ScIndexEnumeration")); -} - -sal_Bool SAL_CALL ScIndexEnumeration::supportsService( const ::rtl::OUString& ServiceName ) - throw(::com::sun::star::uno::RuntimeException) -{ - return sServiceName == ServiceName; -} - -::com::sun::star::uno::Sequence< ::rtl::OUString > - SAL_CALL ScIndexEnumeration::getSupportedServiceNames(void) - throw(::com::sun::star::uno::RuntimeException) -{ - ::com::sun::star::uno::Sequence< ::rtl::OUString > aRet(1); - ::rtl::OUString* pArray = aRet.getArray(); - pArray[0] = sServiceName; - return aRet; -} - -//------------------------------------------------------------------------ - -//------------------------------------------------------------------------ - -ScNameToIndexAccess::ScNameToIndexAccess( const com::sun::star::uno::Reference< - com::sun::star::container::XNameAccess>& rNameObj ) : - xNameAccess( rNameObj ) -{ - //! test for XIndexAccess interface at rNameObj, use that instead! - - if ( xNameAccess.is() ) - aNames = xNameAccess->getElementNames(); -} - -ScNameToIndexAccess::~ScNameToIndexAccess() -{ -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScNameToIndexAccess::getCount( ) throw(::com::sun::star::uno::RuntimeException) -{ - return aNames.getLength(); -} - -::com::sun::star::uno::Any SAL_CALL ScNameToIndexAccess::getByIndex( sal_Int32 nIndex ) - throw(::com::sun::star::lang::IndexOutOfBoundsException, - ::com::sun::star::lang::WrappedTargetException, - ::com::sun::star::uno::RuntimeException) -{ - if ( xNameAccess.is() && nIndex >= 0 && nIndex < aNames.getLength() ) - return xNameAccess->getByName( aNames.getConstArray()[nIndex] ); - - throw lang::IndexOutOfBoundsException(); -} - -// XElementAccess - -::com::sun::star::uno::Type SAL_CALL ScNameToIndexAccess::getElementType( ) - throw(::com::sun::star::uno::RuntimeException) -{ - if ( xNameAccess.is() ) - return xNameAccess->getElementType(); - else - return uno::Type(); -} - -sal_Bool SAL_CALL ScNameToIndexAccess::hasElements( ) throw(::com::sun::star::uno::RuntimeException) -{ - return getCount() > 0; -} - -//------------------------------------------------------------------------ - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/nameuno.cxx b/sc/source/ui/unoobj/nameuno.cxx deleted file mode 100644 index d392c9bf9..000000000 --- a/sc/source/ui/unoobj/nameuno.cxx +++ /dev/null @@ -1,1163 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <svl/smplhint.hxx> -#include <vcl/svapp.hxx> - -#include <com/sun/star/sheet/NamedRangeFlag.hpp> -#include <com/sun/star/awt/XBitmap.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> - -#include <comphelper/servicehelper.hxx> - -using namespace ::com::sun::star; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Any; - - -#include "nameuno.hxx" -#include "miscuno.hxx" -#include "cellsuno.hxx" -#include "convuno.hxx" -#include "targuno.hxx" -#include "tokenuno.hxx" -#include "tokenarray.hxx" -#include "docsh.hxx" -#include "docfunc.hxx" -#include "rangenam.hxx" -#include "unonames.hxx" - -#include "scui_def.hxx" - -//------------------------------------------------------------------------ - -const SfxItemPropertyMapEntry* lcl_GetNamedRangeMap() -{ - static SfxItemPropertyMapEntry aNamedRangeMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_LINKDISPBIT), 0, &getCppuType((uno::Reference<awt::XBitmap>*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNO_LINKDISPNAME), 0, &getCppuType((rtl::OUString*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TOKENINDEX), 0, &getCppuType((sal_Int32*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ISSHAREDFMLA), 0, &getBooleanCppuType(), 0, 0 }, - {0,0,0,0,0,0} - }; - return aNamedRangeMap_Impl; -} - -const SfxItemPropertyMapEntry* lcl_GetNamedRangesMap() -{ - static SfxItemPropertyMapEntry aNamedRangesMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_MODIFY_BROADCAST), 0, &getBooleanCppuType(), 0, 0 }, - {0,0,0,0,0,0} - }; - return aNamedRangesMap_Impl; -} - -//------------------------------------------------------------------------ - -#define SCNAMEDRANGEOBJ_SERVICE "com.sun.star.sheet.NamedRange" - -SC_SIMPLE_SERVICE_INFO( ScLabelRangeObj, "ScLabelRangeObj", "com.sun.star.sheet.LabelRange" ) -SC_SIMPLE_SERVICE_INFO( ScLabelRangesObj, "ScLabelRangesObj", "com.sun.star.sheet.LabelRanges" ) -SC_SIMPLE_SERVICE_INFO( ScNamedRangesObj, "ScNamedRangesObj", "com.sun.star.sheet.NamedRanges" ) - -bool lcl_UserVisibleName(const ScRangeData& rData) -{ - //! als Methode an ScRangeData - - return !rData.HasType(RT_DATABASE) && !rData.HasType(RT_SHARED); -} - -ScNamedRangeObj::ScNamedRangeObj(ScNamedRangesObj* pParent, ScDocShell* pDocSh, const String& rNm) : - mpParent(pParent), - pDocShell( pDocSh ), - aName( rNm ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScNamedRangeObj::~ScNamedRangeObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScNamedRangeObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Ref-Update interessiert nicht - - if ( rHint.ISA( SfxSimpleHint ) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pDocShell = NULL; // ungueltig geworden -} - -// Hilfsfuntionen - -ScRangeData* ScNamedRangeObj::GetRangeData_Impl() -{ - ScRangeData* pRet = NULL; - if (pDocShell) - { - ScRangeName* pNames = pDocShell->GetDocument()->GetRangeName(); - if (pNames) - { - pRet = pNames->findByName(aName); - if (pRet) - pRet->ValidateTabRefs(); // adjust relative tab refs to valid tables - } - } - return pRet; -} - -// sheet::XNamedRange - -void ScNamedRangeObj::Modify_Impl( const String* pNewName, const ScTokenArray* pNewTokens, const String* pNewContent, - const ScAddress* pNewPos, const sal_uInt16* pNewType, - const formula::FormulaGrammar::Grammar eGrammar ) -{ - if (!pDocShell) - return; - - ScDocument* pDoc = pDocShell->GetDocument(); - ScRangeName* pNames = pDoc->GetRangeName(); - if (!pNames) - return; - - const ScRangeData* pOld = pNames->findByName(aName); - if (!pOld) - return; - - ScRangeName* pNewRanges = new ScRangeName(*pNames); - - String aInsName = pOld->GetName(); - if (pNewName) - aInsName = *pNewName; - - String aContent; // Content string based => - pOld->GetSymbol( aContent, eGrammar); // no problems with changed positions and such. - if (pNewContent) - aContent = *pNewContent; - - ScAddress aPos = pOld->GetPos(); - if (pNewPos) - aPos = *pNewPos; - - sal_uInt16 nType = pOld->GetType(); - if (pNewType) - nType = *pNewType; - - ScRangeData* pNew = NULL; - if (pNewTokens) - pNew = new ScRangeData( pDoc, aInsName, *pNewTokens, aPos, nType ); - else - pNew = new ScRangeData( pDoc, aInsName, aContent, aPos, nType, eGrammar ); - - pNew->SetIndex( pOld->GetIndex() ); - - pNewRanges->erase(*pOld); - if (pNewRanges->insert(pNew)) - { - ScDocFunc aFunc(*pDocShell); - aFunc.SetNewRangeNames(pNewRanges, mpParent->IsModifyAndBroadcast()); - - aName = aInsName; //! broadcast? - } - else - { - delete pNew; //! uno::Exception/Fehler oder so - delete pNewRanges; - } -} - - -rtl::OUString SAL_CALL ScNamedRangeObj::getName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return aName; -} - -void SAL_CALL ScNamedRangeObj::setName( const rtl::OUString& aNewName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - //! Formeln anpassen ????? - - String aNewStr(aNewName); - // GRAM_PODF_A1 for API compatibility. - Modify_Impl( &aNewStr, NULL, NULL, NULL, NULL,formula::FormulaGrammar::GRAM_PODF_A1 ); - - if ( aName != aNewStr ) // some error occurred... - throw uno::RuntimeException(); // no other exceptions specified -} - -rtl::OUString SAL_CALL ScNamedRangeObj::getContent() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aContent; - ScRangeData* pData = GetRangeData_Impl(); - if (pData) - // GRAM_PODF_A1 for API compatibility. - pData->GetSymbol( aContent,formula::FormulaGrammar::GRAM_PODF_A1); - return aContent; -} - -void SAL_CALL ScNamedRangeObj::setContent( const rtl::OUString& aContent ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aContStr(aContent); - // GRAM_PODF_A1 for API compatibility. - Modify_Impl( NULL, NULL, &aContStr, NULL, NULL,formula::FormulaGrammar::GRAM_PODF_A1 ); -} - -void ScNamedRangeObj::SetContentWithGrammar( const ::rtl::OUString& aContent, - const formula::FormulaGrammar::Grammar eGrammar ) - throw(::com::sun::star::uno::RuntimeException) -{ - String aContStr(aContent); - Modify_Impl( NULL, NULL, &aContStr, NULL, NULL, eGrammar ); -} - -table::CellAddress SAL_CALL ScNamedRangeObj::getReferencePosition() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAddress aPos; - ScRangeData* pData = GetRangeData_Impl(); - if (pData) - aPos = pData->GetPos(); - table::CellAddress aAddress; - aAddress.Column = aPos.Col(); - aAddress.Row = aPos.Row(); - aAddress.Sheet = aPos.Tab(); - if (pDocShell) - { - SCTAB nDocTabs = pDocShell->GetDocument()->GetTableCount(); - if ( aAddress.Sheet >= nDocTabs && nDocTabs > 0 ) - { - // Even after ValidateTabRefs, the position can be invalid if - // the content points to preceding tables. The resulting string - // is invalid in any case, so the position is just shifted. - aAddress.Sheet = nDocTabs - 1; - } - } - return aAddress; -} - -void SAL_CALL ScNamedRangeObj::setReferencePosition( const table::CellAddress& aReferencePosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAddress aPos( (SCCOL)aReferencePosition.Column, (SCROW)aReferencePosition.Row, aReferencePosition.Sheet ); - // GRAM_PODF_A1 for API compatibility. - Modify_Impl( NULL, NULL, NULL, &aPos, NULL,formula::FormulaGrammar::GRAM_PODF_A1 ); -} - -sal_Int32 SAL_CALL ScNamedRangeObj::getType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Int32 nType=0; - ScRangeData* pData = GetRangeData_Impl(); - if (pData) - { - // do not return internal RT_* flags - // see property 'IsSharedFormula' for RT_SHARED - if ( pData->HasType(RT_CRITERIA) ) nType |= sheet::NamedRangeFlag::FILTER_CRITERIA; - if ( pData->HasType(RT_PRINTAREA) ) nType |= sheet::NamedRangeFlag::PRINT_AREA; - if ( pData->HasType(RT_COLHEADER) ) nType |= sheet::NamedRangeFlag::COLUMN_HEADER; - if ( pData->HasType(RT_ROWHEADER) ) nType |= sheet::NamedRangeFlag::ROW_HEADER; - } - return nType; -} - -void SAL_CALL ScNamedRangeObj::setType( sal_Int32 nUnoType ) throw(uno::RuntimeException) -{ - // see property 'IsSharedFormula' for RT_SHARED - SolarMutexGuard aGuard; - sal_uInt16 nNewType = RT_NAME; - if ( nUnoType & sheet::NamedRangeFlag::FILTER_CRITERIA ) nNewType |= RT_CRITERIA; - if ( nUnoType & sheet::NamedRangeFlag::PRINT_AREA ) nNewType |= RT_PRINTAREA; - if ( nUnoType & sheet::NamedRangeFlag::COLUMN_HEADER ) nNewType |= RT_COLHEADER; - if ( nUnoType & sheet::NamedRangeFlag::ROW_HEADER ) nNewType |= RT_ROWHEADER; - - // GRAM_PODF_A1 for API compatibility. - Modify_Impl( NULL, NULL, NULL, NULL, &nNewType,formula::FormulaGrammar::GRAM_PODF_A1 ); -} - -// XFormulaTokens - -uno::Sequence<sheet::FormulaToken> SAL_CALL ScNamedRangeObj::getTokens() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Sequence<sheet::FormulaToken> aSequence; - ScRangeData* pData = GetRangeData_Impl(); - if (pData && pDocShell) - { - ScTokenArray* pTokenArray = pData->GetCode(); - if ( pTokenArray ) - (void)ScTokenConversion::ConvertToTokenSequence( *pDocShell->GetDocument(), aSequence, *pTokenArray ); - } - return aSequence; -} - -void SAL_CALL ScNamedRangeObj::setTokens( const uno::Sequence<sheet::FormulaToken>& rTokens ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if( pDocShell ) - { - ScTokenArray aTokenArray; - (void)ScTokenConversion::ConvertToTokenArray( *pDocShell->GetDocument(), aTokenArray, rTokens ); - // GRAM_PODF_A1 for API compatibility. - Modify_Impl( NULL, &aTokenArray, NULL, NULL, NULL, formula::FormulaGrammar::GRAM_PODF_A1 ); - } -} - - -// XCellRangeSource - -uno::Reference<table::XCellRange> SAL_CALL ScNamedRangeObj::getReferredCells() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRange aRange; - ScRangeData* pData = GetRangeData_Impl(); - if ( pData && pData->IsValidReference( aRange ) ) - { - //! static Funktion um ScCellObj/ScCellRangeObj zu erzeugen am ScCellRangeObj ??? - - if ( aRange.aStart == aRange.aEnd ) - return new ScCellObj( pDocShell, aRange.aStart ); - else - return new ScCellRangeObj( pDocShell, aRange ); - } - return NULL; -} - -// beans::XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScNamedRangeObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference< beans::XPropertySetInfo > aRef(new SfxItemPropertySetInfo( lcl_GetNamedRangeMap() )); - return aRef; -} - -void SAL_CALL ScNamedRangeObj::setPropertyValue( - const rtl::OUString& rPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ISSHAREDFMLA ) ) ) - { - bool bIsShared = false; - if( aValue >>= bIsShared ) - { - sal_uInt16 nNewType = bIsShared ? RT_SHARED : RT_NAME; - Modify_Impl( NULL, NULL, NULL, NULL, &nNewType,formula::FormulaGrammar::GRAM_PODF_A1 ); - } - } -} - -uno::Any SAL_CALL ScNamedRangeObj::getPropertyValue( const rtl::OUString& rPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aRet; - if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNO_LINKDISPBIT ) ) ) - { - // no target bitmaps for individual entries (would be all equal) - // ScLinkTargetTypeObj::SetLinkTargetBitmap( aRet, SC_LINKTARGETTYPE_RANGENAME ); - } - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNO_LINKDISPNAME ) ) ) - aRet <<= rtl::OUString( aName ); - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_TOKENINDEX ) ) ) - { - // get index for use in formula tokens (read-only) - ScRangeData* pData = GetRangeData_Impl(); - if (pData) - aRet <<= static_cast<sal_Int32>(pData->GetIndex()); - } - else if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_ISSHAREDFMLA ) ) ) - { - if( ScRangeData* pData = GetRangeData_Impl() ) - aRet <<= static_cast< bool >( pData->HasType( RT_SHARED ) ); - } - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScNamedRangeObj ) - -// lang::XServiceInfo - -rtl::OUString SAL_CALL ScNamedRangeObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ScNamedRangeObj" ) ); -} - -sal_Bool SAL_CALL ScNamedRangeObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SCNAMEDRANGEOBJ_SERVICE ) ) || - rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SCLINKTARGET_SERVICE ) ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScNamedRangeObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(2); - aRet[0] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SCNAMEDRANGEOBJ_SERVICE ) ); - aRet[1] = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( SCLINKTARGET_SERVICE ) ); - return aRet; -} - - -// XUnoTunnel - -sal_Int64 SAL_CALL ScNamedRangeObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScNamedRangeObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScNamedRangeObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScNamedRangeObj::getUnoTunnelId() -{ - return theScNamedRangeObjUnoTunnelId::get().getSeq(); -} - -ScNamedRangeObj* ScNamedRangeObj::getImplementation( const uno::Reference<uno::XInterface> xObj ) -{ - ScNamedRangeObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScNamedRangeObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -//------------------------------------------------------------------------ - -ScNamedRangesObj::ScNamedRangesObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ), - mbModifyAndBroadcast(true) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScNamedRangesObj::~ScNamedRangesObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScNamedRangesObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -bool ScNamedRangesObj::IsModifyAndBroadcast() const -{ - return mbModifyAndBroadcast; -} - -// sheet::XNamedRanges - -ScNamedRangeObj* ScNamedRangesObj::GetObjectByIndex_Impl(sal_uInt16 nIndex) -{ - if (!pDocShell) - return NULL; - - ScRangeName* pNames = pDocShell->GetDocument()->GetRangeName(); - if (!pNames) - return NULL; - - ScRangeName::const_iterator itr = pNames->begin(), itrEnd = pNames->end(); - sal_uInt16 nPos = 0; - for (; itr != itrEnd; ++itr) - { - if (lcl_UserVisibleName(*itr)) - { - if (nPos == nIndex) - return new ScNamedRangeObj(this, pDocShell, itr->GetName()); - } - ++nPos; - } - return NULL; -} - -ScNamedRangeObj* ScNamedRangesObj::GetObjectByName_Impl(const rtl::OUString& aName) -{ - if ( pDocShell && hasByName(aName) ) - return new ScNamedRangeObj(this, pDocShell, String(aName)); - return NULL; -} - -void SAL_CALL ScNamedRangesObj::addNewByName( const rtl::OUString& aName, - const rtl::OUString& aContent, const table::CellAddress& aPosition, - sal_Int32 nUnoType ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAddress aPos( (SCCOL)aPosition.Column, (SCROW)aPosition.Row, aPosition.Sheet ); - - sal_uInt16 nNewType = RT_NAME; - if ( nUnoType & sheet::NamedRangeFlag::FILTER_CRITERIA ) nNewType |= RT_CRITERIA; - if ( nUnoType & sheet::NamedRangeFlag::PRINT_AREA ) nNewType |= RT_PRINTAREA; - if ( nUnoType & sheet::NamedRangeFlag::COLUMN_HEADER ) nNewType |= RT_COLHEADER; - if ( nUnoType & sheet::NamedRangeFlag::ROW_HEADER ) nNewType |= RT_ROWHEADER; - - sal_Bool bDone = false; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScRangeName* pNames = pDoc->GetRangeName(); - if (pNames && !pNames->findByName(aName)) - { - ScRangeName* pNewRanges = new ScRangeName( *pNames ); - // GRAM_PODF_A1 for API compatibility. - ScRangeData* pNew = new ScRangeData( pDoc, aName, aContent, - aPos, nNewType,formula::FormulaGrammar::GRAM_PODF_A1 ); - if ( pNewRanges->insert(pNew) ) - { - ScDocFunc aFunc(*pDocShell); - aFunc.SetNewRangeNames(pNewRanges, mbModifyAndBroadcast); - bDone = true; - } - else - { - delete pNew; - delete pNewRanges; - } - } - } - - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScNamedRangesObj::addNewFromTitles( const table::CellRangeAddress& aSource, - sheet::Border aBorder ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - //! das darf kein enum sein, weil mehrere Bits gesetzt sein koennen !!! - - sal_Bool bTop = ( aBorder == sheet::Border_TOP ); - sal_Bool bLeft = ( aBorder == sheet::Border_LEFT ); - sal_Bool bBottom = ( aBorder == sheet::Border_BOTTOM ); - sal_Bool bRight = ( aBorder == sheet::Border_RIGHT ); - - ScRange aRange; - ScUnoConversion::FillScRange( aRange, aSource ); - - sal_uInt16 nFlags = 0; - if (bTop) nFlags |= NAME_TOP; - if (bLeft) nFlags |= NAME_LEFT; - if (bBottom) nFlags |= NAME_BOTTOM; - if (bRight) nFlags |= NAME_RIGHT; - - if (nFlags) - { - ScDocFunc aFunc(*pDocShell); - aFunc.CreateNames( aRange, nFlags, sal_True ); - } -} - -void SAL_CALL ScNamedRangesObj::removeByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - bool bDone = false; - if (pDocShell) - { - ScRangeName* pNames = pDocShell->GetDocument()->GetRangeName(); - if (pNames) - { - const ScRangeData* pData = pNames->findByName(aName); - if (pData && lcl_UserVisibleName(*pData)) - { - ScRangeName* pNewRanges = new ScRangeName(*pNames); - pNewRanges->erase(*pData); - ScDocFunc aFunc(*pDocShell); - aFunc.SetNewRangeNames( pNewRanges, mbModifyAndBroadcast); - bDone = true; - } - } - } - - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -void SAL_CALL ScNamedRangesObj::outputList( const table::CellAddress& aOutputPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScAddress aPos( (SCCOL)aOutputPosition.Column, (SCROW)aOutputPosition.Row, aOutputPosition.Sheet ); - if (pDocShell) - { - ScDocFunc aFunc(*pDocShell); - aFunc.InsertNameList( aPos, sal_True ); - } -} - -// container::XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScNamedRangesObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.NamedRangesEnumeration"))); -} - -// container::XIndexAccess - -sal_Int32 SAL_CALL ScNamedRangesObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - long nRet = 0; - if (pDocShell) - { - ScRangeName* pNames = pDocShell->GetDocument()->GetRangeName(); - if (pNames) - { - ScRangeName::const_iterator itr = pNames->begin(), itrEnd = pNames->end(); - for (; itr != itrEnd; ++itr) - if (lcl_UserVisibleName(*itr)) - ++nRet; - } - } - return nRet; -} - -uno::Any SAL_CALL ScNamedRangesObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< sheet::XNamedRange > xRange(GetObjectByIndex_Impl((sal_uInt16)nIndex)); - if ( xRange.is() ) - return uno::makeAny(xRange); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScNamedRangesObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ::getCppuType((const uno::Reference< sheet::XNamedRange >*)0); // muss zu getByIndex passen -} - -sal_Bool SAL_CALL ScNamedRangesObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -Reference<beans::XPropertySetInfo> SAL_CALL ScNamedRangesObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - static Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo(lcl_GetNamedRangesMap())); - return aRef; -} - -void SAL_CALL ScNamedRangesObj::setPropertyValue( - const rtl::OUString& rPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - if (rPropertyName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(SC_UNO_MODIFY_BROADCAST))) - { - aValue >>= mbModifyAndBroadcast; - } -} - -Any SAL_CALL ScNamedRangesObj::getPropertyValue( const rtl::OUString& rPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - Any aRet; - if (rPropertyName.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM(SC_UNO_MODIFY_BROADCAST))) - { - aRet <<= mbModifyAndBroadcast; - } - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScNamedRangesObj ) - -uno::Any SAL_CALL ScNamedRangesObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< sheet::XNamedRange > xRange(GetObjectByName_Impl(aName)); - if ( xRange.is() ) - return uno::makeAny(xRange); - else - throw container::NoSuchElementException(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScNamedRangesObj::getElementNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScRangeName* pNames = pDocShell->GetDocument()->GetRangeName(); - if (pNames) - { - long nVisCount = getCount(); // Namen mit lcl_UserVisibleName - uno::Sequence<rtl::OUString> aSeq(nVisCount); - rtl::OUString* pAry = aSeq.getArray(); - sal_uInt16 nVisPos = 0; - ScRangeName::const_iterator itr = pNames->begin(), itrEnd = pNames->end(); - for (; itr != itrEnd; ++itr) - { - if (lcl_UserVisibleName(*itr)) - pAry[nVisPos++] = itr->GetName(); - } - return aSeq; - } - } - return uno::Sequence<rtl::OUString>(0); -} - -sal_Bool SAL_CALL ScNamedRangesObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScRangeName* pNames = pDocShell->GetDocument()->GetRangeName(); - if (pNames) - { - const ScRangeData* pData = pNames->findByName(aName); - if (pData && lcl_UserVisibleName(*pData)) - return sal_True; - } - } - return false; -} - -/** called from the XActionLockable interface methods on initial locking */ -void ScNamedRangesObj::lock() -{ - pDocShell->GetDocument()->CompileNameFormula( sal_True ); // CreateFormulaString -} - -/** called from the XActionLockable interface methods on final unlock */ -void ScNamedRangesObj::unlock() -{ - pDocShell->GetDocument()->CompileNameFormula( false ); // CompileFormulaString -} - -// document::XActionLockable - -sal_Bool ScNamedRangesObj::isActionLocked() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return pDocShell->GetDocument()->GetNamedRangesLockCount() != 0; -} - -void ScNamedRangesObj::addActionLock() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Int16 nLockCount = pDoc->GetNamedRangesLockCount(); - ++nLockCount; - if ( nLockCount == 1 ) - { - lock(); - } - pDoc->SetNamedRangesLockCount( nLockCount ); -} - -void ScNamedRangesObj::removeActionLock() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Int16 nLockCount = pDoc->GetNamedRangesLockCount(); - if ( nLockCount > 0 ) - { - --nLockCount; - if ( nLockCount == 0 ) - { - unlock(); - } - pDoc->SetNamedRangesLockCount( nLockCount ); - } -} - -void ScNamedRangesObj::setActionLocks( sal_Int16 nLock ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( nLock >= 0 ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Int16 nLockCount = pDoc->GetNamedRangesLockCount(); - if ( nLock == 0 && nLockCount > 0 ) - { - unlock(); - } - if ( nLock > 0 && nLockCount == 0 ) - { - lock(); - } - pDoc->SetNamedRangesLockCount( nLock ); - } -} - -sal_Int16 ScNamedRangesObj::resetActionLocks() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScDocument* pDoc = pDocShell->GetDocument(); - sal_Int16 nLockCount = pDoc->GetNamedRangesLockCount(); - if ( nLockCount > 0 ) - { - unlock(); - } - pDoc->SetNamedRangesLockCount( 0 ); - return nLockCount; -} - -//------------------------------------------------------------------------ - -ScLabelRangeObj::ScLabelRangeObj(ScDocShell* pDocSh, sal_Bool bCol, const ScRange& rR) : - pDocShell( pDocSh ), - bColumn( bCol ), - aRange( rR ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScLabelRangeObj::~ScLabelRangeObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScLabelRangeObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - //! Ref-Update !!! - - if ( rHint.ISA( SfxSimpleHint ) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pDocShell = NULL; // ungueltig geworden -} - -// Hilfsfuntionen - -ScRangePair* ScLabelRangeObj::GetData_Impl() -{ - ScRangePair* pRet = NULL; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScRangePairList* pList = bColumn ? pDoc->GetColNameRanges() : pDoc->GetRowNameRanges(); - if (pList) - pRet = pList->Find( aRange ); - } - return pRet; -} - -void ScLabelRangeObj::Modify_Impl( const ScRange* pLabel, const ScRange* pData ) -{ - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScRangePairList* pOldList = bColumn ? pDoc->GetColNameRanges() : pDoc->GetRowNameRanges(); - if (pOldList) - { - ScRangePairListRef xNewList(pOldList->Clone()); - ScRangePair* pEntry = xNewList->Find( aRange ); - if (pEntry) - { - xNewList->Remove( pEntry ); // nur aus der Liste entfernt, nicht geloescht - - if ( pLabel ) - pEntry->GetRange(0) = *pLabel; - if ( pData ) - pEntry->GetRange(1) = *pData; - - xNewList->Join( *pEntry ); - delete pEntry; - - if (bColumn) - pDoc->GetColNameRangesRef() = xNewList; - else - pDoc->GetRowNameRangesRef() = xNewList; - - pDoc->CompileColRowNameFormula(); - pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID ); - pDocShell->SetDocumentModified(); - - //! Undo ?!?! (hier und aus Dialog) - - if ( pLabel ) - aRange = *pLabel; // Objekt anpassen, um Range wiederzufinden - } - } - } -} - -// sheet::XLabelRange - -table::CellRangeAddress SAL_CALL ScLabelRangeObj::getLabelArea() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellRangeAddress aRet; - ScRangePair* pData = GetData_Impl(); - if (pData) - ScUnoConversion::FillApiRange( aRet, pData->GetRange(0) ); - return aRet; -} - -void SAL_CALL ScLabelRangeObj::setLabelArea( const table::CellRangeAddress& aLabelArea ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRange aLabelRange; - ScUnoConversion::FillScRange( aLabelRange, aLabelArea ); - Modify_Impl( &aLabelRange, NULL ); -} - -table::CellRangeAddress SAL_CALL ScLabelRangeObj::getDataArea() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellRangeAddress aRet; - ScRangePair* pData = GetData_Impl(); - if (pData) - ScUnoConversion::FillApiRange( aRet, pData->GetRange(1) ); - return aRet; -} - -void SAL_CALL ScLabelRangeObj::setDataArea( const table::CellRangeAddress& aDataArea ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScRange aDataRange; - ScUnoConversion::FillScRange( aDataRange, aDataArea ); - Modify_Impl( NULL, &aDataRange ); -} - -//------------------------------------------------------------------------ - -ScLabelRangesObj::ScLabelRangesObj(ScDocShell* pDocSh, sal_Bool bCol) : - pDocShell( pDocSh ), - bColumn( bCol ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScLabelRangesObj::~ScLabelRangesObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScLabelRangesObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// sheet::XLabelRanges - -ScLabelRangeObj* ScLabelRangesObj::GetObjectByIndex_Impl(size_t nIndex) -{ - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScRangePairList* pList = bColumn ? pDoc->GetColNameRanges() : pDoc->GetRowNameRanges(); - if ( pList && nIndex < pList->size() ) - { - ScRangePair* pData = (*pList)[nIndex]; - if (pData) - return new ScLabelRangeObj( pDocShell, bColumn, pData->GetRange(0) ); - } - } - return NULL; -} - -void SAL_CALL ScLabelRangesObj::addNew( const table::CellRangeAddress& aLabelArea, - const table::CellRangeAddress& aDataArea ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScRangePairList* pOldList = bColumn ? pDoc->GetColNameRanges() : pDoc->GetRowNameRanges(); - if (pOldList) - { - ScRangePairListRef xNewList(pOldList->Clone()); - - ScRange aLabelRange; - ScRange aDataRange; - ScUnoConversion::FillScRange( aLabelRange, aLabelArea ); - ScUnoConversion::FillScRange( aDataRange, aDataArea ); - xNewList->Join( ScRangePair( aLabelRange, aDataRange ) ); - - if (bColumn) - pDoc->GetColNameRangesRef() = xNewList; - else - pDoc->GetRowNameRangesRef() = xNewList; - - pDoc->CompileColRowNameFormula(); - pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID ); - pDocShell->SetDocumentModified(); - - //! Undo ?!?! (hier und aus Dialog) - } - } -} - -void SAL_CALL ScLabelRangesObj::removeByIndex( sal_Int32 nIndex ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScRangePairList* pOldList = bColumn ? pDoc->GetColNameRanges() : pDoc->GetRowNameRanges(); - - if ( pOldList && nIndex >= 0 && nIndex < (sal_Int32)pOldList->size() ) - { - ScRangePairListRef xNewList(pOldList->Clone()); - - ScRangePair* pEntry = (*xNewList)[nIndex]; - if (pEntry) - { - xNewList->Remove( pEntry ); - delete pEntry; - - if (bColumn) - pDoc->GetColNameRangesRef() = xNewList; - else - pDoc->GetRowNameRangesRef() = xNewList; - - pDoc->CompileColRowNameFormula(); - pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID ); - pDocShell->SetDocumentModified(); - bDone = sal_True; - - //! Undo ?!?! (hier und aus Dialog) - } - } - } - if (!bDone) - throw uno::RuntimeException(); // no other exceptions specified -} - -// container::XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScLabelRangesObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.LabelRangesEnumeration"))); -} - -// container::XIndexAccess - -sal_Int32 SAL_CALL ScLabelRangesObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScRangePairList* pList = bColumn ? pDoc->GetColNameRanges() : pDoc->GetRowNameRanges(); - if (pList) - return pList->size(); - } - return 0; -} - -uno::Any SAL_CALL ScLabelRangesObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< sheet::XLabelRange > xRange(GetObjectByIndex_Impl((sal_uInt16)nIndex)); - if ( xRange.is() ) - return uno::makeAny(xRange); - else - throw lang::IndexOutOfBoundsException(); -} - -uno::Type SAL_CALL ScLabelRangesObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ::getCppuType((const uno::Reference< sheet::XLabelRange >*)0); // muss zu getByIndex passen - -} - -sal_Bool SAL_CALL ScLabelRangesObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -//------------------------------------------------------------------------ - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/notesuno.cxx b/sc/source/ui/unoobj/notesuno.cxx deleted file mode 100644 index 7be42a6ae..000000000 --- a/sc/source/ui/unoobj/notesuno.cxx +++ /dev/null @@ -1,735 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" -#include <svl/smplhint.hxx> - - -#include "rangelst.hxx" -#include <editeng/unotext.hxx> -#include <svx/svdpool.hxx> -#include <svx/svdobj.hxx> -#include <vcl/svapp.hxx> -#include "notesuno.hxx" -#include "textuno.hxx" -#include "cellsuno.hxx" // getParent -#include "docsh.hxx" -#include "docfunc.hxx" -#include "hints.hxx" -#include "editsrc.hxx" -#include "miscuno.hxx" - -// setVisible: -#include <svx/svdundo.hxx> -#include "drwlayer.hxx" -#include "detfunc.hxx" -#include "undocell.hxx" -#include "userdat.hxx" -#include <editeng/outlobj.hxx> -#include <svx/unoshape.hxx> -#include <svx/svdocapt.hxx> -#include <svx/svditer.hxx> -#include <svx/svdpage.hxx> -#include <com/sun/star/drawing/XShapeDescriptor.hpp> -#include <editeng/unoprnms.hxx> - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -const SvxItemPropertySet* lcl_GetAnnotationPropertySet() -{ - static SfxItemPropertyMapEntry aAnnotationPropertyMap_Impl[] = - { - SVX_UNOEDIT_CHAR_PROPERTIES, - SVX_UNOEDIT_FONT_PROPERTIES, - SVX_UNOEDIT_PARA_PROPERTIES, - SVX_UNOEDIT_NUMBERING_PROPERTIE, // for completeness of service ParagraphProperties - {0,0,0,0,0,0} - }; - static SvxItemPropertySet aAnnotationPropertySet_Impl( aAnnotationPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); - return &aAnnotationPropertySet_Impl; -} - -//------------------------------------------------------------------------ - -SC_SIMPLE_SERVICE_INFO( ScAnnotationObj, "ScAnnotationObj", "com.sun.star.sheet.CellAnnotation" ) -SC_SIMPLE_SERVICE_INFO( ScAnnotationShapeObj, "ScAnnotationShapeObj", "com.sun.star.sheet.CellAnnotationShape" ) - -//------------------------------------------------------------------------ - -ScAnnotationObj::ScAnnotationObj(ScDocShell* pDocSh, const ScAddress& rPos) : - pDocShell( pDocSh ), - aCellPos( rPos ), - pUnoText( NULL ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); - - // pUnoText is allocated on demand (GetUnoText) - // can't be aggregated because getString/setString is handled here -} - -ScAnnotationObj::~ScAnnotationObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); - - if (pUnoText) - pUnoText->release(); -} - -void ScAnnotationObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { -// const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint; - - //! Ref-Update - } - else if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - - -// XChild - -uno::Reference<uno::XInterface> SAL_CALL ScAnnotationObj::getParent() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - // Parent der Notiz ist die zugehoerige Zelle - //! existierendes Objekt finden und zurueckgeben ??? - - if (pDocShell) - return (cppu::OWeakObject*)new ScCellObj( pDocShell, aCellPos ); - - return NULL; -} - -void SAL_CALL ScAnnotationObj::setParent( const uno::Reference<uno::XInterface>& /* Parent */ ) - throw(lang::NoSupportException, uno::RuntimeException) -{ - // hamma nich - //! Exception oder so ??! -} - -// XSimpleText - -uno::Reference<text::XTextCursor> SAL_CALL ScAnnotationObj::createTextCursor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // Notizen brauchen keine Extrawurst - return GetUnoText().createTextCursor(); -} - -uno::Reference<text::XTextCursor> SAL_CALL ScAnnotationObj::createTextCursorByRange( - const uno::Reference<text::XTextRange>& aTextPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // Notizen brauchen keine Extrawurst - return GetUnoText().createTextCursorByRange(aTextPosition); -} - -rtl::OUString SAL_CALL ScAnnotationObj::getString() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getString(); -} - -void SAL_CALL ScAnnotationObj::setString( const rtl::OUString& aText ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetUnoText().setString(aText); -} - -void SAL_CALL ScAnnotationObj::insertString( const uno::Reference<text::XTextRange>& xRange, - const rtl::OUString& aString, sal_Bool bAbsorb ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetUnoText().insertString( xRange, aString, bAbsorb ); -} - -void SAL_CALL ScAnnotationObj::insertControlCharacter( const uno::Reference<text::XTextRange>& xRange, - sal_Int16 nControlCharacter, sal_Bool bAbsorb ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetUnoText().insertControlCharacter( xRange, nControlCharacter, bAbsorb ); -} - -uno::Reference<text::XText> SAL_CALL ScAnnotationObj::getText() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getText(); -} - -uno::Reference<text::XTextRange> SAL_CALL ScAnnotationObj::getStart() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getStart(); -} - -uno::Reference<text::XTextRange> SAL_CALL ScAnnotationObj::getEnd() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getEnd(); -} - -// XSheetAnnotation - -table::CellAddress SAL_CALL ScAnnotationObj::getPosition() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellAddress aAdr; - aAdr.Sheet = aCellPos.Tab(); - aAdr.Column = aCellPos.Col(); - aAdr.Row = aCellPos.Row(); - return aAdr; -} - -rtl::OUString SAL_CALL ScAnnotationObj::getAuthor() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScPostIt* pNote = ImplGetNote(); - return pNote ? pNote->GetAuthor() : rtl::OUString(); -} - -rtl::OUString SAL_CALL ScAnnotationObj::getDate() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScPostIt* pNote = ImplGetNote(); - return pNote ? pNote->GetDate() : rtl::OUString(); -} - -sal_Bool SAL_CALL ScAnnotationObj::getIsVisible() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - const ScPostIt* pNote = ImplGetNote(); - return pNote && pNote->IsCaptionShown(); -} - -void SAL_CALL ScAnnotationObj::setIsVisible( sal_Bool bIsVisible ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // show/hide note with undo action - if( pDocShell ) - pDocShell->GetDocFunc().ShowNote( aCellPos, bIsVisible ); -} - -// XSheetAnnotationShapeSupplier -uno::Reference < drawing::XShape > SAL_CALL ScAnnotationObj::getAnnotationShape() - throw(::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScAnnotationShapeObj(pDocShell, aCellPos); -} - -SvxUnoText& ScAnnotationObj::GetUnoText() -{ - if (!pUnoText) - { - ScAnnotationEditSource aEditSource( pDocShell, aCellPos ); - pUnoText = new SvxUnoText( &aEditSource, lcl_GetAnnotationPropertySet(), - uno::Reference<text::XText>() ); - pUnoText->acquire(); - } - return *pUnoText; -} - -const ScPostIt* ScAnnotationObj::ImplGetNote() const -{ - return pDocShell ? pDocShell->GetDocument()->GetNote( aCellPos ) : 0; -} -//------------------------------------------------------------------------ - -ScAnnotationShapeObj::ScAnnotationShapeObj(ScDocShell* pDocSh, const ScAddress& rPos) : - pDocShell( pDocSh ), - aCellPos( rPos ), - pUnoText( NULL ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); - - // pUnoText is allocated on demand (GetUnoText) - // can't be aggregated because getString/setString is handled here -} - -SvxUnoText& ScAnnotationShapeObj::GetUnoText() -{ - if (!pUnoText) - { - ScAnnotationEditSource aEditSource( pDocShell, aCellPos ); - pUnoText = new SvxUnoText( &aEditSource, lcl_GetAnnotationPropertySet(), - uno::Reference<text::XText>() ); - pUnoText->acquire(); - } - return *pUnoText; -} - -uno::Reference < drawing::XShape > ScAnnotationShapeObj::GetXShape() -{ - if (!xShape.is()) - if( ScPostIt* pNote = pDocShell->GetDocument()->GetNote( aCellPos ) ) - if( SdrObject* pCaption = pNote->GetOrCreateCaption( aCellPos ) ) - xShape.set( pCaption->getUnoShape(), uno::UNO_QUERY ); - return xShape; -} - -ScAnnotationShapeObj::~ScAnnotationShapeObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); - if (pUnoText) - pUnoText->release(); -} - -void ScAnnotationShapeObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { -// const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint; - - //! Ref-Update - } - else if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - - -// XChild - -uno::Reference<uno::XInterface> SAL_CALL ScAnnotationShapeObj::getParent() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - // Parent der Notiz ist die zugehoerige Zelle - //! existierendes Objekt finden und zurueckgeben ??? - - if (pDocShell) - return (cppu::OWeakObject*)new ScCellObj( pDocShell, aCellPos ); - - return NULL; -} - -void SAL_CALL ScAnnotationShapeObj::setParent( const uno::Reference<uno::XInterface>& /* Parent */ ) - throw(lang::NoSupportException, uno::RuntimeException) -{ - // hamma nich - //! Exception oder so ??! -} - -// XElementAccess -uno::Type SAL_CALL ScAnnotationShapeObj::getElementType( ) throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - return GetUnoText().getElementType(); -} - -sal_Bool SAL_CALL ScAnnotationShapeObj::hasElements( ) throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - return GetUnoText().hasElements(); -} - -// XEnumerationAccess -uno::Reference< container::XEnumeration > SAL_CALL ScAnnotationShapeObj::createEnumeration( ) throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - return GetUnoText().createEnumeration(); -} - -// XTextRangeMover -void SAL_CALL ScAnnotationShapeObj::moveTextRange( const uno::Reference< text::XTextRange >& xRange, sal_Int16 nParagraphs ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - GetUnoText().moveTextRange( xRange, nParagraphs ); -} - -// XText -void SAL_CALL ScAnnotationShapeObj::insertTextContent( const uno::Reference< text::XTextRange >& xRange, - const uno::Reference< text::XTextContent >& xContent, sal_Bool bAbsorb ) - throw (lang::IllegalArgumentException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - GetUnoText().insertTextContent( xRange, xContent, bAbsorb ); -} - -void SAL_CALL ScAnnotationShapeObj::removeTextContent( const uno::Reference< text::XTextContent >& xContent ) - throw (container::NoSuchElementException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - GetUnoText().removeTextContent( xContent ); -} - -// XSimpleText - -uno::Reference<text::XTextCursor> SAL_CALL ScAnnotationShapeObj::createTextCursor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // Notizen brauchen keine Extrawurst - return GetUnoText().createTextCursor(); -} - -uno::Reference<text::XTextCursor> SAL_CALL ScAnnotationShapeObj::createTextCursorByRange( - const uno::Reference<text::XTextRange>& aTextPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // Notizen brauchen keine Extrawurst - return GetUnoText().createTextCursorByRange(aTextPosition); -} - -rtl::OUString SAL_CALL ScAnnotationShapeObj::getString() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getString(); -} - -void SAL_CALL ScAnnotationShapeObj::setString( const rtl::OUString& aText ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetUnoText().setString(aText); -} - -void SAL_CALL ScAnnotationShapeObj::insertString( const uno::Reference<text::XTextRange>& xRange, - const rtl::OUString& aString, sal_Bool bAbsorb ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetUnoText().insertString( xRange, aString, bAbsorb ); -} - -void SAL_CALL ScAnnotationShapeObj::insertControlCharacter( const uno::Reference<text::XTextRange>& xRange, - sal_Int16 nControlCharacter, sal_Bool bAbsorb ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetUnoText().insertControlCharacter( xRange, nControlCharacter, bAbsorb ); -} - -uno::Reference<text::XText> SAL_CALL ScAnnotationShapeObj::getText() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getText(); -} - -uno::Reference<text::XTextRange> SAL_CALL ScAnnotationShapeObj::getStart() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getStart(); -} - -uno::Reference<text::XTextRange> SAL_CALL ScAnnotationShapeObj::getEnd() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return GetUnoText().getEnd(); -} - -// XShapeDescriptor -::rtl::OUString SAL_CALL ScAnnotationShapeObj::getShapeType( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < drawing::XShapeDescriptor > xDesc(GetXShape(), uno::UNO_QUERY); - if (xDesc.is()) - return xDesc->getShapeType(); - return rtl::OUString(); -} - -// XShape -awt::Point SAL_CALL ScAnnotationShapeObj::getPosition( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetXShape(); - return xShape.is() ? xShape->getPosition() : awt::Point(); -} - -void SAL_CALL ScAnnotationShapeObj::setPosition( const awt::Point& aPosition ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetXShape(); - if( xShape.is() ) - xShape->setPosition(aPosition); -} - -awt::Size SAL_CALL ScAnnotationShapeObj::getSize( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetXShape(); - return xShape.is() ? xShape->getSize() : awt::Size(); -} - -void SAL_CALL ScAnnotationShapeObj::setSize( const awt::Size& aSize ) - throw (beans::PropertyVetoException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - GetXShape(); - if( xShape.is() ) - xShape->setSize(aSize); -} - -// XPropertyState -beans::PropertyState SAL_CALL ScAnnotationShapeObj::getPropertyState( const rtl::OUString& PropertyName ) - throw (beans::UnknownPropertyException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertyState > xState (GetXShape(), uno::UNO_QUERY); - if (xState.is()) - return xState->getPropertyState( PropertyName ); - return beans::PropertyState(); -} - -uno::Sequence< beans::PropertyState > SAL_CALL ScAnnotationShapeObj::getPropertyStates( - const uno::Sequence< rtl::OUString >& aPropertyName ) - throw (beans::UnknownPropertyException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertyState > xState (GetXShape(), uno::UNO_QUERY); - if (xState.is()) - return xState->getPropertyStates( aPropertyName ); - return uno::Sequence< beans::PropertyState >(); -} - -void SAL_CALL ScAnnotationShapeObj::setPropertyToDefault( const ::rtl::OUString& PropertyName ) - throw (::com::sun::star::beans::UnknownPropertyException, - ::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertyState > xState (GetXShape(), uno::UNO_QUERY); - if (xState.is()) - xState->setPropertyToDefault( PropertyName ); -} - -uno::Any SAL_CALL ScAnnotationShapeObj::getPropertyDefault( const rtl::OUString& aPropertyName ) - throw (beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertyState > xState (GetXShape(), uno::UNO_QUERY); - if (xState.is()) - return xState->getPropertyDefault( aPropertyName ); - return uno::Any(); -} - -// XPropertySet -uno::Reference< beans::XPropertySetInfo > SAL_CALL ScAnnotationShapeObj::getPropertySetInfo( ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - return xProp->getPropertySetInfo(); - return uno::Reference< beans::XPropertySetInfo >(); -} - -void SAL_CALL ScAnnotationShapeObj::setPropertyValue( const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw (beans::UnknownPropertyException, - beans::PropertyVetoException, - lang::IllegalArgumentException, - lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - xProp->setPropertyValue( aPropertyName, aValue ); -} - -uno::Any SAL_CALL ScAnnotationShapeObj::getPropertyValue( const rtl::OUString& PropertyName ) - throw (beans::UnknownPropertyException, - lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - return xProp->getPropertyValue( PropertyName ); - return uno::Any(); -} - -void SAL_CALL ScAnnotationShapeObj::addPropertyChangeListener( const rtl::OUString& aPropertyName, - const uno::Reference< beans::XPropertyChangeListener >& xListener ) - throw (beans::UnknownPropertyException, - lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - return xProp->addPropertyChangeListener( aPropertyName, xListener ); -} - -void SAL_CALL ScAnnotationShapeObj::removePropertyChangeListener( const rtl::OUString& aPropertyName, - const uno::Reference< beans::XPropertyChangeListener >& aListener ) - throw (beans::UnknownPropertyException, - lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - return xProp->removePropertyChangeListener( aPropertyName, aListener ); -} - -void SAL_CALL ScAnnotationShapeObj::addVetoableChangeListener( const rtl::OUString& PropertyName, - const uno::Reference< beans::XVetoableChangeListener >& aListener ) - throw (beans::UnknownPropertyException, - lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - return xProp->addVetoableChangeListener( PropertyName, aListener ); -} - -void SAL_CALL ScAnnotationShapeObj::removeVetoableChangeListener( const rtl::OUString& PropertyName, - const uno::Reference< beans::XVetoableChangeListener >& aListener ) - throw (beans::UnknownPropertyException, - lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - return xProp->removeVetoableChangeListener( PropertyName, aListener ); -} - - // XMultiPropertySet -void SAL_CALL ScAnnotationShapeObj::setPropertyValues( const uno::Sequence< rtl::OUString >& aPropertyNames, - const uno::Sequence< uno::Any >& aValues ) - throw (beans::PropertyVetoException, - lang::IllegalArgumentException, - lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XMultiPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - xProp->setPropertyValues( aPropertyNames, aValues ); -} - -uno::Sequence< uno::Any > SAL_CALL ScAnnotationShapeObj::getPropertyValues( - const uno::Sequence< rtl::OUString >& aPropertyNames ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XMultiPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - return xProp->getPropertyValues( aPropertyNames ); - return uno::Sequence< uno::Any >(); -} - -void SAL_CALL ScAnnotationShapeObj::addPropertiesChangeListener( const uno::Sequence< rtl::OUString >& aPropertyNames, - const uno::Reference< beans::XPropertiesChangeListener >& xListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XMultiPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - xProp->addPropertiesChangeListener( aPropertyNames, xListener ); -} - -void SAL_CALL ScAnnotationShapeObj::removePropertiesChangeListener( const uno::Reference< beans::XPropertiesChangeListener >& xListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XMultiPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - xProp->removePropertiesChangeListener( xListener ); -} - -void SAL_CALL ScAnnotationShapeObj::firePropertiesChangeEvent( const uno::Sequence< rtl::OUString >& aPropertyNames, - const uno::Reference< beans::XPropertiesChangeListener >& xListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < beans::XMultiPropertySet > xProp (GetXShape(), uno::UNO_QUERY); - if (xProp.is()) - xProp->firePropertiesChangeEvent( aPropertyNames, xListener ); -} - - // XComponent -void SAL_CALL ScAnnotationShapeObj::dispose( ) throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < lang::XComponent > xComp (GetXShape(), uno::UNO_QUERY); - if (xComp.is()) - xComp->dispose(); - if (xShape.is()) - xShape.clear(); -} - -void SAL_CALL ScAnnotationShapeObj::addEventListener( const uno::Reference< lang::XEventListener >& xListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < lang::XComponent > xComp (GetXShape(), uno::UNO_QUERY); - if (xComp.is()) - xComp->addEventListener( xListener ); -} - -void SAL_CALL ScAnnotationShapeObj::removeEventListener( const uno::Reference< lang::XEventListener >& aListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference < lang::XComponent > xComp (GetXShape(), uno::UNO_QUERY); - if (xComp.is()) - xComp->removeEventListener( aListener ); -} - -//------------------------------------------------------------------------ - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/optuno.cxx b/sc/source/ui/unoobj/optuno.cxx deleted file mode 100644 index fd571f9a5..000000000 --- a/sc/source/ui/unoobj/optuno.cxx +++ /dev/null @@ -1,235 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <svl/itemprop.hxx> - -#include <com/sun/star/util/Date.hpp> - -#include "optuno.hxx" -#include "miscuno.hxx" -#include "unonames.hxx" -#include "docoptio.hxx" - -using namespace com::sun::star; - -//------------------------------------------------------------------------ -const SfxItemPropertyMapEntry* ScDocOptionsHelper::GetPropertyMap() -{ - static SfxItemPropertyMapEntry aMap[] = - { - {MAP_CHAR_LEN(SC_UNO_CALCASSHOWN), PROP_UNO_CALCASSHOWN , &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_DEFTABSTOP), PROP_UNO_DEFTABSTOP , &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_IGNORECASE), PROP_UNO_IGNORECASE , &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ITERENABLED), PROP_UNO_ITERENABLED , &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ITERCOUNT), PROP_UNO_ITERCOUNT , &getCppuType((sal_Int32*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ITEREPSILON), PROP_UNO_ITEREPSILON , &getCppuType((double*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_LOOKUPLABELS), PROP_UNO_LOOKUPLABELS, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_MATCHWHOLE), PROP_UNO_MATCHWHOLE , &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_NULLDATE), PROP_UNO_NULLDATE , &getCppuType((util::Date*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SPELLONLINE), PROP_UNO_SPELLONLINE , &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_STANDARDDEC), PROP_UNO_STANDARDDEC , &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_REGEXENABLED), PROP_UNO_REGEXENABLED, &getBooleanCppuType(), 0, 0}, - {0,0,0,0,0,0} - }; - return aMap; -} - -sal_Bool ScDocOptionsHelper::setPropertyValue( ScDocOptions& rOptions, - const SfxItemPropertyMap& rPropMap, - const rtl::OUString& aPropertyName, const uno::Any& aValue ) -{ - //! use map (with new identifiers) - - const SfxItemPropertySimpleEntry* pEntry = rPropMap.getByName(aPropertyName ); - if( !pEntry || !pEntry->nWID ) - return false; - switch( pEntry->nWID ) - { - case PROP_UNO_CALCASSHOWN : - rOptions.SetCalcAsShown( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - break; - case PROP_UNO_DEFTABSTOP : - { - sal_Int16 nIntVal = 0; - if ( aValue >>= nIntVal ) - rOptions.SetTabDistance( nIntVal ); - } - break; - case PROP_UNO_IGNORECASE : - rOptions.SetIgnoreCase( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - break; - case PROP_UNO_ITERENABLED: - rOptions.SetIter( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - break; - case PROP_UNO_ITERCOUNT : - { - sal_Int32 nIntVal = 0; - if ( aValue >>= nIntVal ) - rOptions.SetIterCount( (sal_uInt16)nIntVal ); - } - break; - case PROP_UNO_ITEREPSILON : - { - double fDoubleVal = 0; - if ( aValue >>= fDoubleVal ) - rOptions.SetIterEps( fDoubleVal ); - } - break; - case PROP_UNO_LOOKUPLABELS : - rOptions.SetLookUpColRowNames( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - break; - case PROP_UNO_MATCHWHOLE : - rOptions.SetMatchWholeCell( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - break; - case PROP_UNO_NULLDATE: - { - util::Date aDate; - if ( aValue >>= aDate ) - rOptions.SetDate( aDate.Day, aDate.Month, aDate.Year ); - } - break; - case PROP_UNO_SPELLONLINE: - rOptions.SetAutoSpell( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - break; - case PROP_UNO_STANDARDDEC: - { - sal_Int16 nIntVal = 0; - if ( aValue >>= nIntVal ) - rOptions.SetStdPrecision( nIntVal ); - } - break; - case PROP_UNO_REGEXENABLED: - rOptions.SetFormulaRegexEnabled( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - break; - default:; - } - return sal_True; -} - -uno::Any ScDocOptionsHelper::getPropertyValue( - const ScDocOptions& rOptions, - const SfxItemPropertyMap& rPropMap, - const rtl::OUString& aPropertyName ) -{ - uno::Any aRet; - const SfxItemPropertySimpleEntry* pEntry = rPropMap.getByName( aPropertyName ); - if( !pEntry || !pEntry->nWID ) - return aRet; - switch( pEntry->nWID ) - { - case PROP_UNO_CALCASSHOWN : - ScUnoHelpFunctions::SetBoolInAny( aRet, rOptions.IsCalcAsShown() ); - break; - case PROP_UNO_DEFTABSTOP : - aRet <<= (sal_Int16)( rOptions.GetTabDistance() ); - break; - case PROP_UNO_IGNORECASE : - ScUnoHelpFunctions::SetBoolInAny( aRet, rOptions.IsIgnoreCase() ); - break; - case PROP_UNO_ITERENABLED: - ScUnoHelpFunctions::SetBoolInAny( aRet, rOptions.IsIter() ); - break; - case PROP_UNO_ITERCOUNT: - aRet <<= (sal_Int32)( rOptions.GetIterCount() ); - break; - case PROP_UNO_ITEREPSILON: - aRet <<= (double)( rOptions.GetIterEps() ); - break; - case PROP_UNO_LOOKUPLABELS: - ScUnoHelpFunctions::SetBoolInAny( aRet, rOptions.IsLookUpColRowNames() ); - break; - case PROP_UNO_MATCHWHOLE: - ScUnoHelpFunctions::SetBoolInAny( aRet, rOptions.IsMatchWholeCell() ); - break; - case PROP_UNO_NULLDATE: - { - sal_uInt16 nD, nM, nY; - rOptions.GetDate( nD, nM, nY ); - util::Date aDate( nD, nM, nY ); - aRet <<= aDate; - } - break; - case PROP_UNO_SPELLONLINE: - ScUnoHelpFunctions::SetBoolInAny( aRet, rOptions.IsAutoSpell() ); - break; - case PROP_UNO_STANDARDDEC : - aRet <<= (sal_Int16)( rOptions.GetStdPrecision() ); - break; - case PROP_UNO_REGEXENABLED: - ScUnoHelpFunctions::SetBoolInAny( aRet, rOptions.IsFormulaRegexEnabled() ); - break; - default:; - } - return aRet; -} - -//------------------------------------------------------------------------ - -ScDocOptionsObj::ScDocOptionsObj( const ScDocOptions& rOpt ) : - ScModelObj( NULL ), - aOptions( rOpt ) -{ -} - -ScDocOptionsObj::~ScDocOptionsObj() -{ -} - -void SAL_CALL ScDocOptionsObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Bool bDone = ScDocOptionsHelper::setPropertyValue( aOptions, *GetPropertySet().getPropertyMap(), aPropertyName, aValue ); - - if (!bDone) - ScModelObj::setPropertyValue( aPropertyName, aValue ); -} - -uno::Any SAL_CALL ScDocOptionsObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Any aRet(ScDocOptionsHelper::getPropertyValue( aOptions, *GetPropertySet().getPropertyMap(), aPropertyName )); - if ( !aRet.hasValue() ) - aRet = ScModelObj::getPropertyValue( aPropertyName ); - - return aRet; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/pageuno.cxx b/sc/source/ui/unoobj/pageuno.cxx deleted file mode 100644 index e65a8e241..000000000 --- a/sc/source/ui/unoobj/pageuno.cxx +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include "pageuno.hxx" -#include "shapeuno.hxx" - -using namespace ::com::sun::star; - -//------------------------------------------------------------------------ - -ScPageObj::ScPageObj( SdrPage* pPage ) : - SvxFmDrawPage( pPage ) -{ -} - -ScPageObj::~ScPageObj() throw() -{ -} - -uno::Reference<drawing::XShape > ScPageObj::_CreateShape( SdrObject *pObj ) const throw() -{ - uno::Reference<drawing::XShape> xShape(SvxFmDrawPage::_CreateShape( pObj )); - - new ScShapeObj( xShape ); // aggregates object and modifies xShape - - return xShape; -} - -::rtl::OUString SAL_CALL ScPageObj::getImplementationName() - throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ScPageObj")); -} - -sal_Bool SAL_CALL ScPageObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr(rServiceName); - return aServiceStr.EqualsAscii( "com.sun.star.sheet.SpreadsheetDrawPage" ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScPageObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(1); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetDrawPage")); - return aRet; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/scdetect.cxx b/sc/source/ui/unoobj/scdetect.cxx deleted file mode 100644 index 178197f0c..000000000 --- a/sc/source/ui/unoobj/scdetect.cxx +++ /dev/null @@ -1,896 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "scdetect.hxx" - -#include <sal/macros.h> - -#include <framework/interaction.hxx> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/beans/PropertyValue.hpp> -#include <com/sun/star/frame/XFrame.hpp> -#include <com/sun/star/frame/XModel.hpp> -#include <com/sun/star/awt/XWindow.hpp> -#include <com/sun/star/lang/XUnoTunnel.hpp> -#include <comphelper/processfactory.hxx> -#include <com/sun/star/beans/PropertyValue.hpp> -#include <com/sun/star/container/XNameAccess.hpp> -#include <com/sun/star/io/XInputStream.hpp> -#include <com/sun/star/task/XInteractionHandler.hpp> -#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp> -#include <com/sun/star/ucb/CommandAbortedException.hpp> -#include <com/sun/star/ucb/InteractiveAppException.hpp> -#include <com/sun/star/ucb/XContent.hpp> -#include <com/sun/star/packages/zip/ZipIOException.hpp> - - -#include <framework/interaction.hxx> - -#include <toolkit/helper/vclunohelper.hxx> -#include <ucbhelper/simpleinteractionrequest.hxx> - -#include <svtools/parhtml.hxx> -#include <rtl/ustring.h> -#include <rtl/logfile.hxx> -#include <svl/itemset.hxx> -#include <vcl/window.hxx> -#include <svl/eitem.hxx> -#include <svl/stritem.hxx> -#include <tools/urlobj.hxx> -#include <osl/mutex.hxx> -#include <svtools/sfxecode.hxx> -#include <svtools/ehdl.hxx> -#include <sot/storinfo.hxx> -#include <vcl/svapp.hxx> -#include <sfx2/sfxsids.hrc> -#include <sfx2/request.hxx> -#include <sfx2/docfile.hxx> -#include <sfx2/docfilt.hxx> -#include <sfx2/fcontnr.hxx> -#include <sfx2/app.hxx> -#include <sfx2/brokenpackageint.hxx> -#include <sot/storage.hxx> - -using namespace ::com::sun::star; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::io; -using namespace ::com::sun::star::frame; -using namespace ::com::sun::star::task; -using namespace ::com::sun::star::beans; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::ucb; -using ::rtl::OUString; - -ScFilterDetect::ScFilterDetect( const REFERENCE < ::com::sun::star::lang::XMultiServiceFactory >& /* xFactory */ ) -{ -} - -ScFilterDetect::~ScFilterDetect() -{ -} - -static const sal_Char pFilterSc50[] = "StarCalc 5.0"; -static const sal_Char pFilterSc50Temp[] = "StarCalc 5.0 Vorlage/Template"; -static const sal_Char pFilterSc40[] = "StarCalc 4.0"; -static const sal_Char pFilterSc40Temp[] = "StarCalc 4.0 Vorlage/Template"; -static const sal_Char pFilterSc30[] = "StarCalc 3.0"; -static const sal_Char pFilterSc30Temp[] = "StarCalc 3.0 Vorlage/Template"; -static const sal_Char pFilterSc10[] = "StarCalc 1.0"; -static const sal_Char pFilterXML[] = "StarOffice XML (Calc)"; -static const sal_Char pFilterAscii[] = "Text - txt - csv (StarCalc)"; -static const sal_Char pFilterLotus[] = "Lotus"; -static const sal_Char pFilterQPro6[] = "Quattro Pro 6.0"; -static const sal_Char pFilterExcel4[] = "MS Excel 4.0"; -static const sal_Char pFilterEx4Temp[] = "MS Excel 4.0 Vorlage/Template"; -static const sal_Char pFilterExcel5[] = "MS Excel 5.0/95"; -static const sal_Char pFilterEx5Temp[] = "MS Excel 5.0/95 Vorlage/Template"; -static const sal_Char pFilterExcel95[] = "MS Excel 95"; -static const sal_Char pFilterEx95Temp[] = "MS Excel 95 Vorlage/Template"; -static const sal_Char pFilterExcel97[] = "MS Excel 97"; -static const sal_Char pFilterEx97Temp[] = "MS Excel 97 Vorlage/Template"; -static const sal_Char pFilter2003XML[] = "MS Excel 2003 XML"; -static const sal_Char pFilterDBase[] = "dBase"; -static const sal_Char pFilterDif[] = "DIF"; -static const sal_Char pFilterSylk[] = "SYLK"; -static const sal_Char pFilterHtml[] = "HTML (StarCalc)"; -static const sal_Char pFilterHtmlWeb[] = "calc_HTML_WebQuery"; -static const sal_Char pFilterRtf[] = "Rich Text Format (StarCalc)"; - - -static sal_Bool lcl_MayBeAscii( SvStream& rStream ) -{ - // ASCII/CSV is considered possible if there are no null bytes, or a Byte - // Order Mark is present, or if, for Unicode UCS2/UTF-16, all null bytes - // are on either even or uneven byte positions. - - rStream.Seek(STREAM_SEEK_TO_BEGIN); - - const size_t nBufSize = 2048; - sal_uInt16 aBuffer[ nBufSize ]; - sal_uInt8* pByte = reinterpret_cast<sal_uInt8*>(aBuffer); - sal_uLong nBytesRead = rStream.Read( pByte, nBufSize*2); - - if ( nBytesRead >= 2 && (aBuffer[0] == 0xfffe || aBuffer[0] == 0xfeff) ) - { - // Unicode BOM file may contain null bytes. - return sal_True; - } - - const sal_uInt16* p = aBuffer; - sal_uInt16 nMask = 0xffff; - nBytesRead /= 2; - while( nBytesRead-- && nMask ) - { - sal_uInt16 nVal = *p++ & nMask; - if (!(nVal & 0x00ff)) - nMask &= 0xff00; - if (!(nVal & 0xff00)) - nMask &= 0x00ff; - } - - return nMask != 0; -} - -static sal_Bool lcl_MayBeDBase( SvStream& rStream ) -{ - // Look for dbf marker, see connectivity/source/inc/dbase/DTable.hxx - // DBFType for values. - const sal_uInt8 nValidMarks[] = { - 0x03, 0x04, 0x05, 0x30, 0x43, 0xB3, 0x83, 0x8b, 0x8e, 0xf5 }; - sal_uInt8 nMark; - rStream.Seek(STREAM_SEEK_TO_BEGIN); - rStream >> nMark; - bool bValidMark = false; - for (size_t i=0; i < SAL_N_ELEMENTS(nValidMarks) && !bValidMark; ++i) - { - if (nValidMarks[i] == nMark) - bValidMark = true; - } - if ( !bValidMark ) - return false; - - const size_t nHeaderBlockSize = 32; - // Empty dbf is >= 32*2+1 bytes in size. - const size_t nEmptyDbf = nHeaderBlockSize * 2 + 1; - - rStream.Seek(STREAM_SEEK_TO_END); - sal_uLong nSize = rStream.Tell(); - if ( nSize < nEmptyDbf ) - return false; - - // length of header starts at 8 - rStream.Seek(8); - sal_uInt16 nHeaderLen; - rStream >> nHeaderLen; - - if ( nHeaderLen < nEmptyDbf || nSize < nHeaderLen ) - return false; - - // Last byte of header must be 0x0d, this is how it's specified. - // #i9581#,#i26407# but some applications don't follow the specification - // and pad the header with one byte 0x00 to reach an - // even boundary. Some (#i88577# ) even pad more or pad using a 0x1a ^Z - // control character (#i8857#). This results in: - // Last byte of header must be 0x0d on 32 bytes boundary. - sal_uInt16 nBlocks = (nHeaderLen - 1) / nHeaderBlockSize; - sal_uInt8 nEndFlag = 0; - while ( nBlocks > 1 && nEndFlag != 0x0d ) { - rStream.Seek( nBlocks-- * nHeaderBlockSize ); - rStream >> nEndFlag; - } - - return ( 0x0d == nEndFlag ); -} - -::rtl::OUString SAL_CALL ScFilterDetect::detect( ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& lDescriptor ) throw( ::com::sun::star::uno::RuntimeException ) -{ - REFERENCE< XInputStream > xStream; - REFERENCE< XContent > xContent; - REFERENCE< XInteractionHandler > xInteraction; - String aURL; - ::rtl::OUString sTemp; - String aTypeName; // a name describing the type (from MediaDescriptor, usually from flat detection) - String aPreselectedFilterName; // a name describing the filter to use (from MediaDescriptor, usually from UI action) - - ::rtl::OUString aDocumentTitle; // interesting only if set in this method - - // opening as template is done when a parameter tells to do so and a template filter can be detected - // (otherwise no valid filter would be found) or if the detected filter is a template filter and - // there is no parameter that forbids to open as template - sal_Bool bOpenAsTemplate = false; - sal_Bool bWasReadOnly = false, bReadOnly = false; - - sal_Bool bRepairPackage = false; - sal_Bool bRepairAllowed = false; - - // now some parameters that can already be in the array, but may be overwritten or new inserted here - // remember their indices in the case new values must be added to the array - sal_Int32 nPropertyCount = lDescriptor.getLength(); - sal_Int32 nIndexOfFilterName = -1; - sal_Int32 nIndexOfInputStream = -1; - sal_Int32 nIndexOfContent = -1; - sal_Int32 nIndexOfReadOnlyFlag = -1; - sal_Int32 nIndexOfTemplateFlag = -1; - sal_Int32 nIndexOfDocumentTitle = -1; - bool bFakeXLS = false; - - for( sal_Int32 nProperty=0; nProperty<nPropertyCount; ++nProperty ) - { - // extract properties - if( lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("URL")) ) - { - lDescriptor[nProperty].Value >>= sTemp; - aURL = sTemp; - } - else if( !aURL.Len() && lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("FileName")) ) - { - lDescriptor[nProperty].Value >>= sTemp; - aURL = sTemp; - } - else if( lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("TypeName")) ) - { - lDescriptor[nProperty].Value >>= sTemp; - aTypeName = sTemp; - } - else if( lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("FilterName")) ) - { - lDescriptor[nProperty].Value >>= sTemp; - aPreselectedFilterName = sTemp; - - // if the preselected filter name is not correct, it must be erased after detection - // remember index of property to get access to it later - nIndexOfFilterName = nProperty; - } - else if( lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("InputStream")) ) - nIndexOfInputStream = nProperty; - else if( lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("ReadOnly")) ) - nIndexOfReadOnlyFlag = nProperty; - else if( lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("UCBContent")) ) - nIndexOfContent = nProperty; - else if( lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("AsTemplate")) ) - { - lDescriptor[nProperty].Value >>= bOpenAsTemplate; - nIndexOfTemplateFlag = nProperty; - } - else if( lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("InteractionHandler")) ) - lDescriptor[nProperty].Value >>= xInteraction; - else if( lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("RepairPackage")) ) - lDescriptor[nProperty].Value >>= bRepairPackage; - else if( lDescriptor[nProperty].Name == OUString(RTL_CONSTASCII_USTRINGPARAM("DocumentTitle")) ) - nIndexOfDocumentTitle = nProperty; - } - - // can't check the type for external filters, so set the "dont" flag accordingly - SolarMutexGuard aGuard; - //SfxFilterFlags nMust = SFX_FILTER_IMPORT, nDont = SFX_FILTER_NOTINSTALLED; - - SfxAllItemSet *pSet = new SfxAllItemSet( SFX_APP()->GetPool() ); - TransformParameters( SID_OPENDOC, lDescriptor, *pSet ); - SFX_ITEMSET_ARG( pSet, pItem, SfxBoolItem, SID_DOC_READONLY, false ); - - bWasReadOnly = pItem && pItem->GetValue(); - - const SfxFilter* pFilter = 0; - String aPrefix = String::CreateFromAscii( "private:factory/" ); - if( aURL.Match( aPrefix ) == aPrefix.Len() ) - { - String aPattern( aPrefix ); - aPattern += String::CreateFromAscii("scalc"); - if ( aURL.Match( aPattern ) >= aPattern.Len() ) - pFilter = SfxFilter::GetDefaultFilterFromFactory( aURL ); - } - else - { - // container for Calc filters - SfxFilterMatcher aMatcher( String::CreateFromAscii("scalc") ); - if ( aPreselectedFilterName.Len() ) - pFilter = SfxFilter::GetFilterByName( aPreselectedFilterName ); - else if( aTypeName.Len() ) - pFilter = aMatcher.GetFilter4EA( aTypeName ); - - // ctor of SfxMedium uses owner transition of ItemSet - SfxMedium aMedium( aURL, bWasReadOnly ? STREAM_STD_READ : STREAM_STD_READWRITE, false, NULL, pSet ); - aMedium.UseInteractionHandler( sal_True ); - - sal_Bool bIsStorage = aMedium.IsStorage(); - if ( aMedium.GetErrorCode() == ERRCODE_NONE ) - { - // remember input stream and content and put them into the descriptor later - // should be done here since later the medium can switch to a version - xStream.set(aMedium.GetInputStream()); - xContent.set(aMedium.GetContent()); - bReadOnly = aMedium.IsReadOnly(); - - // maybe that IsStorage() already created an error! - if ( bIsStorage ) - { - uno::Reference < embed::XStorage > xStorage(aMedium.GetStorage( false )); - if ( aMedium.GetLastStorageCreationState() != ERRCODE_NONE ) - { - // error during storage creation means _here_ that the medium - // is broken, but we can not handle it in medium since unpossibility - // to create a storage does not _always_ means that the medium is broken - aMedium.SetError( aMedium.GetLastStorageCreationState(), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) ); - if ( xInteraction.is() ) - { - OUString empty; - try - { - InteractiveAppException xException( empty, - REFERENCE< XInterface >(), - InteractionClassification_ERROR, - aMedium.GetError() ); - - REFERENCE< XInteractionRequest > xRequest( - new ucbhelper::SimpleInteractionRequest( makeAny( xException ), - ucbhelper::CONTINUATION_APPROVE ) ); - xInteraction->handle( xRequest ); - } - catch ( Exception & ) {}; - } - } - else if ( xStorage.is() ) - { - try - { - String aFilterName; - if ( pFilter ) - aFilterName = pFilter->GetName(); - aTypeName = SfxFilter::GetTypeFromStorage( xStorage, pFilter ? pFilter->IsOwnTemplateFormat() : false, &aFilterName ); - } - catch( lang::WrappedTargetException& aWrap ) - { - packages::zip::ZipIOException aZipException; - - // repairing is done only if this type is requested from outside - if ( ( aWrap.TargetException >>= aZipException ) && aTypeName.Len() ) - { - if ( xInteraction.is() ) - { - // the package is broken one - aDocumentTitle = aMedium.GetURLObject().getName( - INetURLObject::LAST_SEGMENT, - true, - INetURLObject::DECODE_WITH_CHARSET ); - - if ( !bRepairPackage ) - { - // ask the user whether he wants to try to repair - RequestPackageReparation aRequest( aDocumentTitle ); - xInteraction->handle( aRequest.GetRequest() ); - bRepairAllowed = aRequest.isApproved(); - } - - if ( !bRepairAllowed ) - { - // repair either not allowed or not successful - NotifyBrokenPackage aNotifyRequest( aDocumentTitle ); - xInteraction->handle( aNotifyRequest.GetRequest() ); - } - } - - if ( !bRepairAllowed ) - aTypeName.Erase(); - } - } - catch( uno::RuntimeException& ) - { - throw; - } - catch( uno::Exception& ) - { - aTypeName.Erase(); - } - - if ( aTypeName.Len() ) - pFilter = SfxFilterMatcher( String::CreateFromAscii("scalc") ).GetFilter4EA( aTypeName ); - - } - } - else - { - bool bIsXLS = false; - SvStream* pStream = aMedium.GetInStream(); - const SfxFilter* pPreselectedFilter = pFilter; - if ( pPreselectedFilter && ( ( pPreselectedFilter->GetName().SearchAscii("Excel") != STRING_NOTFOUND ) || - ( !aPreselectedFilterName.Len() && pPreselectedFilter->GetFilterName().EqualsAscii( pFilterAscii ) ) ) ) - bIsXLS = true; - pFilter = 0; - if ( pStream ) - { - SotStorageRef aStorage = new SotStorage ( pStream, false ); - if ( !aStorage->GetError() ) - { - // Excel-5: detect through contained streams - // there are some "excel" formats from 3rd party vendors that need to be distinguished - String aStreamName(RTL_CONSTASCII_USTRINGPARAM("Workbook")); - sal_Bool bExcel97Stream = ( aStorage->IsStream( aStreamName ) ); - - aStreamName = String(RTL_CONSTASCII_USTRINGPARAM("Book")); - sal_Bool bExcel5Stream = ( aStorage->IsStream( aStreamName ) ); - if ( bExcel97Stream || bExcel5Stream ) - { - if ( bExcel97Stream ) - { - String aOldName; - sal_Bool bIsCalcFilter = sal_True; - if ( pPreselectedFilter ) - { - // cross filter; now this should be a type detection only, not a filter detection - // we can simulate it by preserving the preselected filter if the type matches - // example: Excel filters for Writer - aOldName = pPreselectedFilter->GetFilterName(); - bIsCalcFilter = pPreselectedFilter->GetServiceName().EqualsAscii("com.sun.star.sheet.SpreadsheetDocument"); - } - - if ( aOldName.EqualsAscii(pFilterEx97Temp) || !bIsCalcFilter ) - { - // Excel 97 template selected -> keep selection - } - else if ( bExcel5Stream && - ( aOldName.EqualsAscii(pFilterExcel5) || aOldName.EqualsAscii(pFilterEx5Temp) || - aOldName.EqualsAscii(pFilterExcel95) || aOldName.EqualsAscii(pFilterEx95Temp) ) ) - { - // dual format file and Excel 5 selected -> keep selection - } - else - { - // else use Excel 97 filter - pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterExcel97) ); - } - } - else if ( bExcel5Stream ) - { - String aOldName; - sal_Bool bIsCalcFilter = sal_True; - if ( pPreselectedFilter ) - { - // cross filter; now this should be a type detection only, not a filter detection - // we can simulate it by preserving the preselected filter if the type matches - // example: Excel filters for Writer - aOldName = pPreselectedFilter->GetFilterName(); - bIsCalcFilter = pPreselectedFilter->GetServiceName().EqualsAscii("com.sun.star.sheet.SpreadsheetDocument"); - } - - if ( aOldName.EqualsAscii(pFilterExcel95) || aOldName.EqualsAscii(pFilterEx95Temp) || - aOldName.EqualsAscii(pFilterEx5Temp) || !bIsCalcFilter ) - { - // Excel 95 oder Vorlage (5 oder 95) eingestellt -> auch gut - } - else if ( aOldName.EqualsAscii(pFilterEx97Temp) ) - { - // auto detection has found template -> return Excel5 template - pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterEx5Temp) ); - } - else - { - // sonst wird als Excel 5-Datei erkannt - pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterExcel5) ); - } - } - } - } - else - { - SvStream &rStr = *pStream; - - // Tabelle mit Suchmustern - // Bedeutung der Sequenzen - // 0x00??: genau Byte 0x?? muss an dieser Stelle stehen - // 0x0100: ein Byte ueberlesen (don't care) - // 0x02nn: ein Byte aus 0xnn Alternativen folgt - // 0x8000: Erkennung abgeschlossen - // - - #define M_DC 0x0100 - #define M_ALT(ANZ) (0x0200+(ANZ)) - #define M_ENDE 0x8000 - - static const sal_uInt16 pLotus[] = // Lotus 1/1A/2 - { 0x0000, 0x0000, 0x0002, 0x0000, - M_ALT(2), 0x0004, 0x0006, - 0x0004, M_ENDE }; - - static const sal_uInt16 pLotusNew[] = // Lotus >= 9.7 - { 0x0000, 0x0000, M_DC, 0x0000, // Rec# + Len (0x1a) - M_ALT(3), 0x0003, 0x0004, 0x0005, // File Revision Code 97->ME - 0x0010, 0x0004, 0x0000, 0x0000, - M_ENDE }; - - static const sal_uInt16 pExcel1[] = // Excel BIFF2, BIFF3, BIFF4 - { 0x09, // lobyte of BOF rec ID (0x0009, 0x0209, 0x0409) - M_ALT(3), 0x00, 0x02, 0x04, // hibyte of BOF rec ID (0x0009, 0x0209, 0x0409) - M_ALT(3), 4, 6, 8, // lobyte of BOF rec size (4, 6, 8, 16) - 0x00, // hibyte of BOF rec size (4, 6, 8, 16) - M_DC, M_DC, // any version - M_ALT(3), 0x10, 0x20, 0x40, // lobyte of data type (0x0010, 0x0020, 0x0040) - 0x00, // hibyte of data type (0x0010, 0x0020, 0x0040) - M_ENDE }; - - static const sal_uInt16 pExcel2[] = // Excel BIFF4 Workspace - { 0x09, // lobyte of BOF rec ID (0x0409) - 0x04, // hibyte of BOF rec ID (0x0409) - M_ALT(3), 4, 6, 8, // lobyte of BOF rec size (4, 6, 8, 16) - 0x00, // hibyte of BOF rec size (4, 6, 8, 16) - M_DC, M_DC, // any version - 0x00, // lobyte of data type (0x0100) - 0x01, // hibyte of data type (0x0100) - M_ENDE }; - - static const sal_uInt16 pExcel3[] = // #i23425# Excel BIFF5, BIFF7, BIFF8 (simple book stream) - { 0x09, // lobyte of BOF rec ID (0x0809) - 0x08, // hibyte of BOF rec ID (0x0809) - M_ALT(4), 4, 6, 8, 16, // lobyte of BOF rec size - 0x00, // hibyte of BOF rec size - M_DC, M_DC, // any version - M_ALT(5), 0x05, 0x06, 0x10, 0x20, 0x40, // lobyte of data type - 0x00, // hibyte of data type - M_ENDE }; - - static const sal_uInt16 pSc10[] = // StarCalc 1.0 Dokumente - { 'B', 'l', 'a', 'i', 's', 'e', '-', 'T', 'a', 'b', 'e', 'l', 'l', - 'e', 0x000A, 0x000D, 0x0000, // Sc10CopyRight[16] - M_DC, M_DC, M_DC, M_DC, M_DC, M_DC, M_DC, M_DC, M_DC, M_DC, M_DC, - M_DC, M_DC, // Sc10CopyRight[29] - M_ALT(2), 0x0065, 0x0066, // Versionsnummer 101 oder 102 - 0x0000, - M_ENDE }; - - static const sal_uInt16 pLotus2[] = // Lotus >3 - { 0x0000, 0x0000, 0x001A, 0x0000, // Rec# + Len (26) - M_ALT(2), 0x0000, 0x0002, // File Revision Code - 0x0010, - 0x0004, 0x0000, // File Revision Subcode - M_ENDE }; - - static const sal_uInt16 pQPro[] = - { 0x0000, 0x0000, 0x0002, 0x0000, - M_ALT(4), 0x0001, 0x0002, // WB1, WB2 - 0x0006, 0x0007, // QPro 6/7 (?) - 0x0010, - M_ENDE }; - - static const sal_uInt16 pDIF1[] = // DIF mit CR-LF - { - 'T', 'A', 'B', 'L', 'E', - M_DC, M_DC, - '0', ',', '1', - M_DC, M_DC, - '\"', - M_ENDE }; - - static const sal_uInt16 pDIF2[] = // DIF mit CR oder LF - { - 'T', 'A', 'B', 'L', 'E', - M_DC, - '0', ',', '1', - M_DC, - '\"', - M_ENDE }; - - static const sal_uInt16 pSylk[] = // Sylk - { - 'I', 'D', ';', - M_ALT(3), 'P', 'N', 'E', // 'P' plus undocumented Excel extensions 'N' and 'E' - M_ENDE }; - - static const sal_uInt16 *ppFilterPatterns[] = // Arrays mit Suchmustern - { - pLotus, - pExcel1, - pExcel2, - pExcel3, - pSc10, - pDIF1, - pDIF2, - pSylk, - pLotusNew, - pLotus2, - pQPro - }; - const sal_uInt16 nFilterCount = SAL_N_ELEMENTS(ppFilterPatterns); - - static const sal_Char* const pFilterName[] = // zugehoerige Filter - { - pFilterLotus, - pFilterExcel4, - pFilterExcel4, - pFilterExcel4, - pFilterSc10, - pFilterDif, - pFilterDif, - pFilterSylk, - pFilterLotus, - pFilterLotus, - pFilterQPro6 - }; - - // suchen Sie jetzt! - // ... realisiert ueber 'Mustererkennung' - - sal_uInt8 nAkt; - sal_Bool bSync; // Datei und Muster stimmen ueberein - sal_uInt16 nFilter; // Zaehler ueber alle Filter - const sal_uInt16 *pSearch; // aktuelles Musterwort - - for ( nFilter = 0 ; nFilter < nFilterCount ; nFilter++ ) - { - rStr.Seek( 0 ); // am Anfang war alles Uebel... - rStr >> nAkt; - pSearch = ppFilterPatterns[ nFilter ]; - bSync = sal_True; - while( !rStr.IsEof() && bSync ) - { - register sal_uInt16 nMuster = *pSearch; - - if( nMuster < 0x0100 ) - { // direkter Byte-Vergleich - if( ( sal_uInt8 ) nMuster != nAkt ) - bSync = false; - } - else if( nMuster & M_DC ) - { // don't care - } - else if( nMuster & M_ALT(0) ) - { // alternative Bytes - sal_uInt8 nAnzAlt = ( sal_uInt8 ) nMuster; - bSync = false; // zunaechst unsynchron - while( nAnzAlt > 0 ) - { - pSearch++; - if( ( sal_uInt8 ) *pSearch == nAkt ) - bSync = sal_True; // jetzt erst Synchronisierung - nAnzAlt--; - } - } - else if( nMuster & M_ENDE ) - { // Format detected - if ( pFilterName[nFilter] == pFilterExcel4 && pPreselectedFilter && - ( (pPreselectedFilter)->GetFilterName().EqualsAscii(pFilterEx4Temp) || pPreselectedFilter->GetTypeName().EqualsAscii("calc_MS_Excel_40") ) ) - { - // Excel 4 erkannt, Excel 4 Vorlage eingestellt -> auch gut - // oder Excel 4 Filter anderer Applikation (simulated type detection!) - } - else - { // gefundenen Filter einstellen - pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterName[ nFilter ]) ); - } - bSync = false; // leave inner loop - nFilter = nFilterCount; // leave outer loop - } - else - { // Tabellenfehler - OSL_FAIL( "-ScApplication::DetectFilter(): Fehler in Mustertabelle"); - } - - pSearch++; - rStr >> nAkt; - } - } - - if ( pPreselectedFilter && !pFilter ) - { - // further checks for filters only if they are preselected: ASCII, HTML, RTF, DBase - // without the preselection other filters (Writer) take precedence - // DBase can't be detected reliably, so it also needs preselection - bool bMaybeText = lcl_MayBeAscii( rStr ); - - // get file header - rStr.Seek( 0 ); - const int nTrySize = 80; - ByteString aHeader; - for ( int j = 0; j < nTrySize && !rStr.IsEof(); j++ ) - { - sal_Char c; - rStr >> c; - aHeader += c; - } - aHeader += '\0'; - - if ( HTMLParser::IsHTMLFormat( aHeader.GetBuffer() ) ) - { - // test for HTML - if ( pPreselectedFilter->GetName().EqualsAscii(pFilterHtml) ) - { - pFilter = pPreselectedFilter; - } - else - { - pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterHtmlWeb) ); - if ( bIsXLS ) - bFakeXLS = true; - } - } - else if ( aHeader.CompareTo( "{\\rtf", 5 ) == COMPARE_EQUAL ) - { - // test for RTF - pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterRtf) ); - } - else if ( bIsXLS && bMaybeText ) - { - aHeader.EraseLeadingChars(); - if( aHeader.CompareTo( "<?xml", 5 ) == COMPARE_EQUAL ) - pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilter2003XML) ); - else - pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterAscii) ); - bFakeXLS = true; - } - else if ( pPreselectedFilter->GetName().EqualsAscii(pFilterDBase) && lcl_MayBeDBase( rStr ) ) - pFilter = pPreselectedFilter; - else if ( pPreselectedFilter->GetFilterName().EqualsAscii(pFilterAscii) && bMaybeText ) - pFilter = pPreselectedFilter; - } - } - } - } - } - } - - if ( nIndexOfInputStream == -1 && xStream.is() ) - { - // if input stream wasn't part of the descriptor, now it should be, otherwise the content would be opend twice - lDescriptor.realloc( nPropertyCount + 1 ); - lDescriptor[nPropertyCount].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("InputStream")); - lDescriptor[nPropertyCount].Value <<= xStream; - nPropertyCount++; - } - - if ( nIndexOfContent == -1 && xContent.is() ) - { - // if input stream wasn't part of the descriptor, now it should be, otherwise the content would be opend twice - lDescriptor.realloc( nPropertyCount + 1 ); - lDescriptor[nPropertyCount].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UCBContent")); - lDescriptor[nPropertyCount].Value <<= xContent; - nPropertyCount++; - } - - if ( bReadOnly != bWasReadOnly ) - { - if ( nIndexOfReadOnlyFlag == -1 ) - { - lDescriptor.realloc( nPropertyCount + 1 ); - lDescriptor[nPropertyCount].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ReadOnly")); - lDescriptor[nPropertyCount].Value <<= bReadOnly; - nPropertyCount++; - } - else - lDescriptor[nIndexOfReadOnlyFlag].Value <<= bReadOnly; - } - - if ( !bRepairPackage && bRepairAllowed ) - { - lDescriptor.realloc( nPropertyCount + 1 ); - lDescriptor[nPropertyCount].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("RepairPackage")); - lDescriptor[nPropertyCount].Value <<= bRepairAllowed; - nPropertyCount++; - - bOpenAsTemplate = sal_True; - - // TODO/LATER: set progress bar that should be used - } - - if ( bOpenAsTemplate ) - { - if ( nIndexOfTemplateFlag == -1 ) - { - lDescriptor.realloc( nPropertyCount + 1 ); - lDescriptor[nPropertyCount].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AsTemplate")); - lDescriptor[nPropertyCount].Value <<= bOpenAsTemplate; - nPropertyCount++; - } - else - lDescriptor[nIndexOfTemplateFlag].Value <<= bOpenAsTemplate; - } - - if ( aDocumentTitle.getLength() ) - { - // the title was set here - if ( nIndexOfDocumentTitle == -1 ) - { - lDescriptor.realloc( nPropertyCount + 1 ); - lDescriptor[nPropertyCount].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DocumentTitle")); - lDescriptor[nPropertyCount].Value <<= aDocumentTitle; - nPropertyCount++; - } - else - lDescriptor[nIndexOfDocumentTitle].Value <<= aDocumentTitle; - } - - if ( bFakeXLS ) - { - if ( nIndexOfFilterName == -1 ) - { - lDescriptor.realloc( nPropertyCount + 1 ); - lDescriptor[nPropertyCount].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FilterName")); - lDescriptor[nPropertyCount].Value <<= rtl::OUString(pFilter->GetName()); - nPropertyCount++; - } - else - lDescriptor[nIndexOfFilterName].Value <<= rtl::OUString(pFilter->GetName()); - } - - if ( pFilter ) - aTypeName = pFilter->GetTypeName(); - else - aTypeName.Erase(); - return aTypeName; -} - -SFX_IMPL_SINGLEFACTORY( ScFilterDetect ) - -/* XServiceInfo */ -UNOOUSTRING SAL_CALL ScFilterDetect::getImplementationName() throw( UNORUNTIMEEXCEPTION ) -{ - return impl_getStaticImplementationName(); -} - \ -/* XServiceInfo */ -sal_Bool SAL_CALL ScFilterDetect::supportsService( const UNOOUSTRING& sServiceName ) throw( UNORUNTIMEEXCEPTION ) -{ - UNOSEQUENCE< UNOOUSTRING > seqServiceNames(getSupportedServiceNames()); - const UNOOUSTRING* pArray = seqServiceNames.getConstArray(); - for ( sal_Int32 nCounter=0; nCounter<seqServiceNames.getLength(); nCounter++ ) - { - if ( pArray[nCounter] == sServiceName ) - { - return sal_True ; - } - } - return false ; -} - -/* XServiceInfo */ -UNOSEQUENCE< UNOOUSTRING > SAL_CALL ScFilterDetect::getSupportedServiceNames() throw( UNORUNTIMEEXCEPTION ) -{ - return impl_getStaticSupportedServiceNames(); -} - -/* Helper for XServiceInfo */ -UNOSEQUENCE< UNOOUSTRING > ScFilterDetect::impl_getStaticSupportedServiceNames() -{ - UNOSEQUENCE< UNOOUSTRING > seqServiceNames( 1 ); - seqServiceNames.getArray() [0] = UNOOUSTRING(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.ExtendedTypeDetection" )); - return seqServiceNames ; -} - -/* Helper for XServiceInfo */ -UNOOUSTRING ScFilterDetect::impl_getStaticImplementationName() -{ - return UNOOUSTRING(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.calc.FormatDetector" )); -} - -/* Helper for registry */ -UNOREFERENCE< UNOXINTERFACE > SAL_CALL ScFilterDetect::impl_createInstance( const UNOREFERENCE< UNOXMULTISERVICEFACTORY >& xServiceManager ) throw( UNOEXCEPTION ) -{ - return UNOREFERENCE< UNOXINTERFACE >( *new ScFilterDetect( xServiceManager ) ); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/scdetect.hxx b/sc/source/ui/unoobj/scdetect.hxx deleted file mode 100644 index b7f533079..000000000 --- a/sc/source/ui/unoobj/scdetect.hxx +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _SC_TYPEDETECT_HXX -#define _SC_TYPEDETECT_HXX - -#include <rtl/ustring.hxx> -#include <com/sun/star/document/XExtendedFilterDetection.hpp> -#include <com/sun/star/uno/Exception.hpp> -#include <com/sun/star/uno/Reference.h> -#include <cppuhelper/implbase2.hxx> - -#include <com/sun/star/lang/XServiceInfo.hpp> -#include <com/sun/star/lang/XSingleServiceFactory.hpp> -#include <cppuhelper/factory.hxx> -#include <tools/link.hxx> -#include <tools/string.hxx> - -class SfxObjectFactory; -class SfxFilterMatcher; -class LoadEnvironment_Impl; -class SfxMedium; - -namespace com -{ - namespace sun - { - namespace star - { - namespace uno - { - class Any; - } - namespace lang - { - class XMultiServiceFactory; - } - namespace frame - { - class XFrame; - } - namespace beans - { - struct PropertyValue; - } - } - } -} - -#include <sfx2/sfxuno.hxx> - -#define REFERENCE ::com::sun::star::uno::Reference -#define SEQUENCE ::com::sun::star::uno::Sequence -#define RUNTIME_EXCEPTION ::com::sun::star::uno::RuntimeException - -class ScFilterDetect : public ::cppu::WeakImplHelper2< ::com::sun::star::document::XExtendedFilterDetection, ::com::sun::star::lang::XServiceInfo > -{ -public: - ScFilterDetect( const REFERENCE < ::com::sun::star::lang::XMultiServiceFactory >& xFactory ); - virtual ~ScFilterDetect(); - - SFX_DECL_XSERVICEINFO - - //---------------------------------------------------------------------------------- - // XExtendedFilterDetect - //---------------------------------------------------------------------------------- - virtual ::rtl::OUString SAL_CALL detect( SEQUENCE< ::com::sun::star::beans::PropertyValue >& lDescriptor ) throw( RUNTIME_EXCEPTION ); -}; - -#endif - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/servuno.cxx b/sc/source/ui/unoobj/servuno.cxx deleted file mode 100644 index 99f396c49..000000000 --- a/sc/source/ui/unoobj/servuno.cxx +++ /dev/null @@ -1,621 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include <sal/macros.h> -#include <svtools/unoimap.hxx> -#include <svx/unofill.hxx> -#include <editeng/unonrule.hxx> -#include <com/sun/star/sheet/XSpreadsheetDocument.hpp> -#include <com/sun/star/container/XNameAccess.hpp> - -#include "servuno.hxx" -#include "unonames.hxx" -#include "cellsuno.hxx" -#include "fielduno.hxx" -#include "styleuno.hxx" -#include "afmtuno.hxx" -#include "defltuno.hxx" -#include "drdefuno.hxx" -#include "docsh.hxx" -#include "drwlayer.hxx" -#include "confuno.hxx" -#include "shapeuno.hxx" -#include "cellvaluebinding.hxx" -#include "celllistsource.hxx" -#include "addruno.hxx" -#include "chart2uno.hxx" -#include "tokenuno.hxx" - -// Support creation of GraphicObjectResolver and EmbeddedObjectResolver -#include <svx/xmleohlp.hxx> -#include <svx/xmlgrhlp.hxx> -#include <sfx2/docfile.hxx> -#include <sfx2/docfilt.hxx> -#include <com/sun/star/script/ScriptEventDescriptor.hpp> -#include <com/sun/star/script/vba/XVBAEventProcessor.hpp> -#include <com/sun/star/document/XCodeNameQuery.hpp> -#include <com/sun/star/drawing/XDrawPagesSupplier.hpp> -#include <com/sun/star/form/XFormsSupplier.hpp> -#include <svx/unomod.hxx> -#include <vbahelper/vbaaccesshelper.hxx> - -#include <comphelper/processfactory.hxx> -#include <basic/basmgr.hxx> -#include <sfx2/app.hxx> - -#include <comphelper/processfactory.hxx> -#include <com/sun/star/document/XCodeNameQuery.hpp> -#include <com/sun/star/drawing/XDrawPagesSupplier.hpp> -#include <com/sun/star/form/XFormsSupplier.hpp> -#include <com/sun/star/script/ScriptEventDescriptor.hpp> -#include <comphelper/componentcontext.hxx> -#include <cppuhelper/component_context.hxx> -#include <vbahelper/vbaaccesshelper.hxx> -#include <com/sun/star/script/vba/XVBACompatibility.hpp> - -using namespace ::com::sun::star; - -bool isInVBAMode( ScDocShell& rDocSh ) -{ - uno::Reference<script::XLibraryContainer> xLibContainer = rDocSh.GetBasicContainer(); - uno::Reference<script::vba::XVBACompatibility> xVBACompat( xLibContainer, uno::UNO_QUERY ); - if ( xVBACompat.is() ) - return xVBACompat->getVBACompatibilityMode(); - return false; -} - -class ScVbaObjectForCodeNameProvider : public ::cppu::WeakImplHelper1< container::XNameAccess > -{ - uno::Any maWorkbook; - uno::Any maCachedObject; - ScDocShell* mpDocShell; -public: - ScVbaObjectForCodeNameProvider( ScDocShell* pDocShell ) : mpDocShell( pDocShell ) - { - ScDocument* pDoc = mpDocShell->GetDocument(); - if ( !pDoc ) - throw uno::RuntimeException( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("")), uno::Reference< uno::XInterface >() ); - - uno::Sequence< uno::Any > aArgs(2); - // access the application object ( parent for workbook ) - aArgs[0] = uno::Any( ooo::vba::createVBAUnoAPIServiceWithArgs( mpDocShell, "ooo.vba.Application", uno::Sequence< uno::Any >() ) ); - aArgs[1] = uno::Any( mpDocShell->GetModel() ); - maWorkbook <<= ooo::vba::createVBAUnoAPIServiceWithArgs( mpDocShell, "ooo.vba.excel.Workbook", aArgs ); - } - - virtual ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (::com::sun::star::uno::RuntimeException ) - { - SolarMutexGuard aGuard; - maCachedObject = uno::Any(); // clear cached object - String sName = aName; - - ScDocument* pDoc = mpDocShell->GetDocument(); - if ( !pDoc ) - throw uno::RuntimeException(); - // aName ( sName ) is generated from the stream name which can be different ( case-wise ) - // from the code name - if( sName.EqualsIgnoreCaseAscii( pDoc->GetCodeName() ) ) - maCachedObject = maWorkbook; - else - { - String sCodeName; - SCTAB nCount = pDoc->GetTableCount(); - for( SCTAB i = 0; i < nCount; i++ ) - { - pDoc->GetCodeName( i, sCodeName ); - // aName ( sName ) is generated from the stream name which can be different ( case-wise ) - // from the code name - if( sCodeName.EqualsIgnoreCaseAscii( sName ) ) - { - String sSheetName; - if( pDoc->GetName( i, sSheetName ) ) - { - uno::Reference< frame::XModel > xModel( mpDocShell->GetModel() ); - uno::Reference <sheet::XSpreadsheetDocument> xSpreadDoc( xModel, uno::UNO_QUERY_THROW ); - uno::Reference<sheet::XSpreadsheets > xSheets( xSpreadDoc->getSheets(), uno::UNO_QUERY_THROW ); - uno::Reference< container::XIndexAccess > xIndexAccess( xSheets, uno::UNO_QUERY_THROW ); - uno::Reference< sheet::XSpreadsheet > xSheet( xIndexAccess->getByIndex( i ), uno::UNO_QUERY_THROW ); - uno::Sequence< uno::Any > aArgs(3); - aArgs[0] = maWorkbook; - aArgs[1] = uno::Any( xModel ); - aArgs[2] = uno::Any( rtl::OUString( sSheetName ) ); - // use the convience function - maCachedObject <<= ooo::vba::createVBAUnoAPIServiceWithArgs( mpDocShell, "ooo.vba.excel.Worksheet", aArgs ); - break; - } - } - } - } - return maCachedObject.hasValue(); - - } - ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw (::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) - { - SolarMutexGuard aGuard; - OSL_TRACE("ScVbaObjectForCodeNameProvider::getByName( %s )", - rtl::OUStringToOString( aName, RTL_TEXTENCODING_UTF8 ).getStr() ); - if ( !hasByName( aName ) ) - throw ::com::sun::star::container::NoSuchElementException(); - return maCachedObject; - } - virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) throw (::com::sun::star::uno::RuntimeException) - { - SolarMutexGuard aGuard; - ScDocument* pDoc = mpDocShell->GetDocument(); - if ( !pDoc ) - throw uno::RuntimeException(); - SCTAB nCount = pDoc->GetTableCount(); - uno::Sequence< rtl::OUString > aNames( nCount + 1 ); - SCTAB index = 0; - String sCodeName; - for( ; index < nCount; ++index ) - { - pDoc->GetCodeName( index, sCodeName ); - aNames[ index ] = sCodeName; - } - aNames[ index ] = pDoc->GetCodeName(); - return aNames; - } - // XElemenAccess - virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw (::com::sun::star::uno::RuntimeException){ return uno::Type(); } - virtual ::sal_Bool SAL_CALL hasElements( ) throw (::com::sun::star::uno::RuntimeException ) { return sal_True; } - -}; - -class ScVbaCodeNameProvider : public ::cppu::WeakImplHelper1< document::XCodeNameQuery > -{ -ScDocShell* mpDocShell; -public: - ScVbaCodeNameProvider( ScDocShell* pDocShell ) : mpDocShell( pDocShell ) {} - // XCodeNameQuery - rtl::OUString SAL_CALL getCodeNameForObject( const uno::Reference< uno::XInterface >& xIf ) throw( uno::RuntimeException ) - { - SolarMutexGuard aGuard; - rtl::OUString sCodeName; - if ( mpDocShell ) - { - OSL_TRACE( "*** In ScVbaCodeNameProvider::getCodeNameForObject"); - // need to find the page ( and index ) for this control - uno::Reference< drawing::XDrawPagesSupplier > xSupplier( mpDocShell->GetModel(), uno::UNO_QUERY_THROW ); - uno::Reference< container::XIndexAccess > xIndex( xSupplier->getDrawPages(), uno::UNO_QUERY_THROW ); - sal_Int32 nLen = xIndex->getCount(); - bool bMatched = false; - uno::Sequence< script::ScriptEventDescriptor > aFakeEvents; - for ( sal_Int32 index = 0; index < nLen; ++index ) - { - try - { - uno::Reference< form::XFormsSupplier > xFormSupplier( xIndex->getByIndex( index ), uno::UNO_QUERY_THROW ); - uno::Reference< container::XIndexAccess > xFormIndex( xFormSupplier->getForms(), uno::UNO_QUERY_THROW ); - // get the www-standard container - uno::Reference< container::XIndexAccess > xFormControls( xFormIndex->getByIndex(0), uno::UNO_QUERY_THROW ); - sal_Int32 nCntrls = xFormControls->getCount(); - for( sal_Int32 cIndex = 0; cIndex < nCntrls; ++cIndex ) - { - uno::Reference< uno::XInterface > xControl( xFormControls->getByIndex( cIndex ), uno::UNO_QUERY_THROW ); - bMatched = ( xControl == xIf ); - if ( bMatched ) - { - String sName; - mpDocShell->GetDocument()->GetCodeName( static_cast<SCTAB>( index ), sName ); - sCodeName = sName; - } - } - } - catch( uno::Exception& ) {} - if ( bMatched ) - break; - } - } - // Probably should throw here ( if !bMatched ) - return sCodeName; - } - -}; - -//------------------------------------------------------------------------ -// -struct ProvNamesId_Type -{ - const char * pName; - sal_uInt16 nType; -}; - -static const ProvNamesId_Type aProvNamesId[] = -{ - { "com.sun.star.sheet.Spreadsheet", SC_SERVICE_SHEET }, - { "com.sun.star.text.TextField.URL", SC_SERVICE_URLFIELD }, - { "com.sun.star.text.TextField.PageNumber", SC_SERVICE_PAGEFIELD }, - { "com.sun.star.text.TextField.PageCount", SC_SERVICE_PAGESFIELD }, - { "com.sun.star.text.TextField.Date", SC_SERVICE_DATEFIELD }, - { "com.sun.star.text.TextField.Time", SC_SERVICE_TIMEFIELD }, - { "com.sun.star.text.TextField.DocumentTitle", SC_SERVICE_TITLEFIELD }, - { "com.sun.star.text.TextField.FileName", SC_SERVICE_FILEFIELD }, - { "com.sun.star.text.TextField.SheetName", SC_SERVICE_SHEETFIELD }, - { "com.sun.star.style.CellStyle", SC_SERVICE_CELLSTYLE }, - { "com.sun.star.style.PageStyle", SC_SERVICE_PAGESTYLE }, - { "com.sun.star.sheet.TableAutoFormat", SC_SERVICE_AUTOFORMAT }, - { "com.sun.star.sheet.SheetCellRanges", SC_SERVICE_CELLRANGES }, - { "com.sun.star.drawing.GradientTable", SC_SERVICE_GRADTAB }, - { "com.sun.star.drawing.HatchTable", SC_SERVICE_HATCHTAB }, - { "com.sun.star.drawing.BitmapTable", SC_SERVICE_BITMAPTAB }, - { "com.sun.star.drawing.TransparencyGradientTable", SC_SERVICE_TRGRADTAB }, - { "com.sun.star.drawing.MarkerTable", SC_SERVICE_MARKERTAB }, - { "com.sun.star.drawing.DashTable", SC_SERVICE_DASHTAB }, - { "com.sun.star.text.NumberingRules", SC_SERVICE_NUMRULES }, - { "com.sun.star.sheet.Defaults", SC_SERVICE_DOCDEFLTS }, - { "com.sun.star.drawing.Defaults", SC_SERVICE_DRAWDEFLTS }, - { "com.sun.star.comp.SpreadsheetSettings", SC_SERVICE_DOCSPRSETT }, - { "com.sun.star.document.Settings", SC_SERVICE_DOCCONF }, - { "com.sun.star.image.ImageMapRectangleObject", SC_SERVICE_IMAP_RECT }, - { "com.sun.star.image.ImageMapCircleObject", SC_SERVICE_IMAP_CIRC }, - { "com.sun.star.image.ImageMapPolygonObject", SC_SERVICE_IMAP_POLY }, - - // Support creation of GraphicObjectResolver and EmbeddedObjectResolver - { "com.sun.star.document.ExportGraphicObjectResolver", SC_SERVICE_EXPORT_GOR }, - { "com.sun.star.document.ImportGraphicObjectResolver", SC_SERVICE_IMPORT_GOR }, - { "com.sun.star.document.ExportEmbeddedObjectResolver", SC_SERVICE_EXPORT_EOR }, - { "com.sun.star.document.ImportEmbeddedObjectResolver", SC_SERVICE_IMPORT_EOR }, - - { SC_SERVICENAME_VALBIND, SC_SERVICE_VALBIND }, - { SC_SERVICENAME_LISTCELLBIND, SC_SERVICE_LISTCELLBIND }, - { SC_SERVICENAME_LISTSOURCE, SC_SERVICE_LISTSOURCE }, - { SC_SERVICENAME_CELLADDRESS, SC_SERVICE_CELLADDRESS }, - { SC_SERVICENAME_RANGEADDRESS, SC_SERVICE_RANGEADDRESS }, - - { "com.sun.star.sheet.DocumentSettings",SC_SERVICE_SHEETDOCSET }, - - { SC_SERVICENAME_CHDATAPROV, SC_SERVICE_CHDATAPROV }, - { SC_SERVICENAME_FORMULAPARS, SC_SERVICE_FORMULAPARS }, - { SC_SERVICENAME_OPCODEMAPPER, SC_SERVICE_OPCODEMAPPER }, - { "ooo.vba.VBAObjectModuleObjectProvider", SC_SERVICE_VBAOBJECTPROVIDER }, - { "ooo.vba.VBACodeNameProvider", SC_SERVICE_VBACODENAMEPROVIDER }, - { "ooo.vba.VBAGlobals", SC_SERVICE_VBAGLOBALS }, - - // case-correct versions of the service names (#i102468#) - { "com.sun.star.text.textfield.URL", SC_SERVICE_URLFIELD }, - { "com.sun.star.text.textfield.PageNumber", SC_SERVICE_PAGEFIELD }, - { "com.sun.star.text.textfield.PageCount", SC_SERVICE_PAGESFIELD }, - { "com.sun.star.text.textfield.Date", SC_SERVICE_DATEFIELD }, - { "com.sun.star.text.textfield.Time", SC_SERVICE_TIMEFIELD }, - { "com.sun.star.text.textfield.DocumentTitle", SC_SERVICE_TITLEFIELD }, - { "com.sun.star.text.textfield.FileName", SC_SERVICE_FILEFIELD }, - { "com.sun.star.text.textfield.SheetName", SC_SERVICE_SHEETFIELD }, - { "ooo.vba.VBAGlobals", SC_SERVICE_VBAGLOBALS }, -}; - -// -// old service names that were in 567 still work in createInstance, -// in case some macro is still using them -// - -static const sal_Char* aOldNames[SC_SERVICE_COUNT] = - { - "", // SC_SERVICE_SHEET - "stardiv.one.text.TextField.URL", // SC_SERVICE_URLFIELD - "stardiv.one.text.TextField.PageNumber", // SC_SERVICE_PAGEFIELD - "stardiv.one.text.TextField.PageCount", // SC_SERVICE_PAGESFIELD - "stardiv.one.text.TextField.Date", // SC_SERVICE_DATEFIELD - "stardiv.one.text.TextField.Time", // SC_SERVICE_TIMEFIELD - "stardiv.one.text.TextField.DocumentTitle", // SC_SERVICE_TITLEFIELD - "stardiv.one.text.TextField.FileName", // SC_SERVICE_FILEFIELD - "stardiv.one.text.TextField.SheetName", // SC_SERVICE_SHEETFIELD - "stardiv.one.style.CellStyle", // SC_SERVICE_CELLSTYLE - "stardiv.one.style.PageStyle", // SC_SERVICE_PAGESTYLE - "", // SC_SERVICE_AUTOFORMAT - "", // SC_SERVICE_CELLRANGES - "", // SC_SERVICE_GRADTAB - "", // SC_SERVICE_HATCHTAB - "", // SC_SERVICE_BITMAPTAB - "", // SC_SERVICE_TRGRADTAB - "", // SC_SERVICE_MARKERTAB - "", // SC_SERVICE_DASHTAB - "", // SC_SERVICE_NUMRULES - "", // SC_SERVICE_DOCDEFLTS - "", // SC_SERVICE_DRAWDEFLTS - "", // SC_SERVICE_DOCSPRSETT - "", // SC_SERVICE_DOCCONF - "", // SC_SERVICE_IMAP_RECT - "", // SC_SERVICE_IMAP_CIRC - "", // SC_SERVICE_IMAP_POLY - - // Support creation of GraphicObjectResolver and EmbeddedObjectResolver - "", // SC_SERVICE_EXPORT_GOR - "", // SC_SERVICE_IMPORT_GOR - "", // SC_SERVICE_EXPORT_EOR - "", // SC_SERVICE_IMPORT_EOR - - "", // SC_SERVICE_VALBIND - "", // SC_SERVICE_LISTCELLBIND - "", // SC_SERVICE_LISTSOURCE - "", // SC_SERVICE_CELLADDRESS - "", // SC_SERVICE_RANGEADDRESS - "", // SC_SERVICE_SHEETDOCSET - "", // SC_SERVICE_CHDATAPROV - "", // SC_SERVICE_FORMULAPARS - "", // SC_SERVICE_OPCODEMAPPER - "", // SC_SERVICE_VBAOBJECTPROVIDER - "", // SC_SERVICE_VBACODENAMEPROVIDER - "", // SC_SERVICE_VBAGLOBALS - }; - - - - -//------------------------------------------------------------------------ - -// alles static - - -sal_uInt16 ScServiceProvider::GetProviderType(const String& rServiceName) -{ - if (rServiceName.Len()) - { - const sal_uInt16 nEntries = SAL_N_ELEMENTS(aProvNamesId); - - for (sal_uInt16 i = 0; i < nEntries; i++) - { - if (rServiceName.EqualsAscii( aProvNamesId[i].pName )) - { - return aProvNamesId[i].nType; - } - } - - sal_uInt16 i; - for (i=0; i<SC_SERVICE_COUNT; i++) - { - OSL_ENSURE( aOldNames[i], "ScServiceProvider::GetProviderType: no oldname => crash"); - if (rServiceName.EqualsAscii( aOldNames[i] )) - { - OSL_FAIL("old service name used"); - return i; - } - } - } - return SC_SERVICE_INVALID; -} - -uno::Reference<uno::XInterface> ScServiceProvider::MakeInstance( - sal_uInt16 nType, ScDocShell* pDocShell ) -{ - uno::Reference<uno::XInterface> xRet; - switch (nType) - { - case SC_SERVICE_SHEET: - // noch nicht eingefuegt - DocShell=Null - xRet.set((sheet::XSpreadsheet*)new ScTableSheetObj(NULL,0)); - break; - case SC_SERVICE_URLFIELD: - xRet.set((text::XTextField*)new ScCellFieldObj( NULL, ScAddress(), ESelection() )); - break; - case SC_SERVICE_PAGEFIELD: - case SC_SERVICE_PAGESFIELD: - case SC_SERVICE_DATEFIELD: - case SC_SERVICE_TIMEFIELD: - case SC_SERVICE_TITLEFIELD: - case SC_SERVICE_FILEFIELD: - case SC_SERVICE_SHEETFIELD: - xRet.set((text::XTextField*)new ScHeaderFieldObj( NULL, 0, nType, ESelection() )); - break; - case SC_SERVICE_CELLSTYLE: - xRet.set((style::XStyle*)new ScStyleObj( NULL, SFX_STYLE_FAMILY_PARA, String() )); - break; - case SC_SERVICE_PAGESTYLE: - xRet.set((style::XStyle*)new ScStyleObj( NULL, SFX_STYLE_FAMILY_PAGE, String() )); - break; - case SC_SERVICE_AUTOFORMAT: - xRet.set((container::XIndexAccess*)new ScAutoFormatObj( SC_AFMTOBJ_INVALID )); - break; - case SC_SERVICE_CELLRANGES: - // wird nicht eingefuegt, sondern gefuellt - // -> DocShell muss gesetzt sein, aber leere Ranges - if (pDocShell) - xRet.set((sheet::XSheetCellRanges*)new ScCellRangesObj( pDocShell, ScRangeList() )); - break; - - case SC_SERVICE_DOCDEFLTS: - if (pDocShell) - xRet.set((beans::XPropertySet*)new ScDocDefaultsObj( pDocShell )); - break; - case SC_SERVICE_DRAWDEFLTS: - if (pDocShell) - xRet.set((beans::XPropertySet*)new ScDrawDefaultsObj( pDocShell )); - break; - - // Drawing layer tables are not in SvxUnoDrawMSFactory, - // because SvxUnoDrawMSFactory doesn't have a SdrModel pointer. - // Drawing layer is always allocated if not there (MakeDrawLayer). - - case SC_SERVICE_GRADTAB: - if (pDocShell) - xRet.set(SvxUnoGradientTable_createInstance( pDocShell->MakeDrawLayer() )); - break; - case SC_SERVICE_HATCHTAB: - if (pDocShell) - xRet.set(SvxUnoHatchTable_createInstance( pDocShell->MakeDrawLayer() )); - break; - case SC_SERVICE_BITMAPTAB: - if (pDocShell) - xRet.set(SvxUnoBitmapTable_createInstance( pDocShell->MakeDrawLayer() )); - break; - case SC_SERVICE_TRGRADTAB: - if (pDocShell) - xRet.set(SvxUnoTransGradientTable_createInstance( pDocShell->MakeDrawLayer() )); - break; - case SC_SERVICE_MARKERTAB: - if (pDocShell) - xRet.set(SvxUnoMarkerTable_createInstance( pDocShell->MakeDrawLayer() )); - break; - case SC_SERVICE_DASHTAB: - if (pDocShell) - xRet.set(SvxUnoDashTable_createInstance( pDocShell->MakeDrawLayer() )); - break; - case SC_SERVICE_NUMRULES: - if (pDocShell) - xRet.set(SvxCreateNumRule( pDocShell->MakeDrawLayer() )); - break; - case SC_SERVICE_DOCSPRSETT: - case SC_SERVICE_SHEETDOCSET: - case SC_SERVICE_DOCCONF: - if (pDocShell) - xRet.set((beans::XPropertySet*)new ScDocumentConfiguration(pDocShell)); - break; - - case SC_SERVICE_IMAP_RECT: - xRet.set(SvUnoImageMapRectangleObject_createInstance( ScShapeObj::GetSupportedMacroItems() )); - break; - case SC_SERVICE_IMAP_CIRC: - xRet.set(SvUnoImageMapCircleObject_createInstance( ScShapeObj::GetSupportedMacroItems() )); - break; - case SC_SERVICE_IMAP_POLY: - xRet.set(SvUnoImageMapPolygonObject_createInstance( ScShapeObj::GetSupportedMacroItems() )); - break; - - // Support creation of GraphicObjectResolver and EmbeddedObjectResolver - case SC_SERVICE_EXPORT_GOR: - xRet.set((::cppu::OWeakObject * )new SvXMLGraphicHelper( GRAPHICHELPER_MODE_WRITE )); - break; - - case SC_SERVICE_IMPORT_GOR: - xRet.set((::cppu::OWeakObject * )new SvXMLGraphicHelper( GRAPHICHELPER_MODE_READ )); - break; - - case SC_SERVICE_EXPORT_EOR: - if (pDocShell) - xRet.set((::cppu::OWeakObject * )new SvXMLEmbeddedObjectHelper( *pDocShell, EMBEDDEDOBJECTHELPER_MODE_WRITE )); - break; - - case SC_SERVICE_IMPORT_EOR: - if (pDocShell) - xRet.set((::cppu::OWeakObject * )new SvXMLEmbeddedObjectHelper( *pDocShell, EMBEDDEDOBJECTHELPER_MODE_READ )); - break; - - case SC_SERVICE_VALBIND: - case SC_SERVICE_LISTCELLBIND: - if (pDocShell) - { - sal_Bool bListPos = ( nType == SC_SERVICE_LISTCELLBIND ); - uno::Reference<sheet::XSpreadsheetDocument> xDoc( pDocShell->GetBaseModel(), uno::UNO_QUERY ); - xRet.set(*new calc::OCellValueBinding( xDoc, bListPos )); - } - break; - case SC_SERVICE_LISTSOURCE: - if (pDocShell) - { - uno::Reference<sheet::XSpreadsheetDocument> xDoc( pDocShell->GetBaseModel(), uno::UNO_QUERY ); - xRet.set(*new calc::OCellListSource( xDoc )); - } - break; - case SC_SERVICE_CELLADDRESS: - case SC_SERVICE_RANGEADDRESS: - if (pDocShell) - { - sal_Bool bRange = ( nType == SC_SERVICE_RANGEADDRESS ); - xRet.set(*new ScAddressConversionObj( pDocShell, bRange )); - } - break; - - case SC_SERVICE_CHDATAPROV: - if (pDocShell && pDocShell->GetDocument()) - xRet = *new ScChart2DataProvider( pDocShell->GetDocument() ); - break; - - case SC_SERVICE_FORMULAPARS: - if (pDocShell) - xRet.set(static_cast<sheet::XFormulaParser*>(new ScFormulaParserObj( pDocShell ))); - break; - - case SC_SERVICE_OPCODEMAPPER: - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScAddress aAddress; - ScCompiler* pComp = new ScCompiler(pDoc,aAddress); - pComp->SetGrammar( pDoc->GetGrammar() ); - xRet.set(static_cast<sheet::XFormulaOpCodeMapper*>(new ScFormulaOpCodeMapperObj(::std::auto_ptr<formula::FormulaCompiler> (pComp)))); - break; - } - case SC_SERVICE_VBAOBJECTPROVIDER: - if (pDocShell && pDocShell->GetDocument()->IsInVBAMode()) - { - OSL_TRACE("**** creating VBA Object mapper"); - xRet.set(static_cast<container::XNameAccess*>(new ScVbaObjectForCodeNameProvider( pDocShell ))); - } - break; - case SC_SERVICE_VBACODENAMEPROVIDER: - if ( pDocShell && ooo::vba::isAlienExcelDoc( *pDocShell ) && isInVBAMode( *pDocShell ) ) - { - OSL_TRACE("**** creating VBA Object provider"); - xRet.set(static_cast<document::XCodeNameQuery*>(new ScVbaCodeNameProvider( pDocShell ))); - } - break; - case SC_SERVICE_VBAGLOBALS: - if (pDocShell) - { - uno::Any aGlobs; - if ( !pDocShell->GetBasicManager()->GetGlobalUNOConstant( "VBAGlobals", aGlobs ) ) - { - uno::Sequence< uno::Any > aArgs(1); - aArgs[ 0 ] <<= pDocShell->GetModel(); - xRet = ::comphelper::getProcessServiceFactory()->createInstanceWithArguments( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ooo.vba.excel.Globals" ) ), aArgs ); - pDocShell->GetBasicManager()->SetGlobalUNOConstant( "VBAGlobals", uno::Any( xRet ) ); - BasicManager* pAppMgr = SFX_APP()->GetBasicManager(); - if ( pAppMgr ) - pAppMgr->SetGlobalUNOConstant( "ThisExcelDoc", aArgs[ 0 ] ); - - // create the VBA document event processor - uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( - ::ooo::vba::createVBAUnoAPIServiceWithArgs( pDocShell, "com.sun.star.script.vba.VBASpreadsheetEventProcessor", aArgs ), uno::UNO_QUERY ); - pDocShell->GetDocument()->SetVbaEventProcessor( xVbaEvents ); - } - } - break; - } - - return xRet; -} - -uno::Sequence<rtl::OUString> ScServiceProvider::GetAllServiceNames() -{ - const sal_uInt16 nEntries = SAL_N_ELEMENTS(aProvNamesId); - uno::Sequence<rtl::OUString> aRet(nEntries); - rtl::OUString* pArray = aRet.getArray(); - for (sal_uInt16 i = 0; i < nEntries; i++) - { - pArray[i] = rtl::OUString::createFromAscii( aProvNamesId[i].pName ); - } - return aRet; -} - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/shapeuno.cxx b/sc/source/ui/unoobj/shapeuno.cxx deleted file mode 100644 index ad0fdbe49..000000000 --- a/sc/source/ui/unoobj/shapeuno.cxx +++ /dev/null @@ -1,1512 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include <comphelper/uno3.hxx> -#include <comphelper/stl_types.hxx> -#include <svtools/unoevent.hxx> -#include <svtools/unoimap.hxx> -#include <svx/svdobj.hxx> -#include <vcl/svapp.hxx> -#include <svx/unoshape.hxx> -#include <editeng/unofield.hxx> -#include <svx/shapepropertynotifier.hxx> -#include <toolkit/helper/convert.hxx> -#include <cppuhelper/implbase2.hxx> - -#include <com/sun/star/drawing/XShape.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> - -#include "shapeuno.hxx" -#include "miscuno.hxx" -#include "cellsuno.hxx" -#include "textuno.hxx" -#include "fielduno.hxx" -#include "docsh.hxx" -#include "drwlayer.hxx" -#include "userdat.hxx" -#include "unonames.hxx" - -using namespace ::com::sun::star; - -//------------------------------------------------------------------------ - -DECLARE_STL_USTRINGACCESS_MAP( uno::Sequence< sal_Int8 > *, ScShapeImplementationIdMap ); - -static ScShapeImplementationIdMap aImplementationIdMap; - -const SfxItemPropertyMapEntry* lcl_GetShapeMap() -{ - static SfxItemPropertyMapEntry aShapeMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ANCHOR), 0, &getCppuType((uno::Reference<uno::XInterface>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_HORIPOS), 0, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_IMAGEMAP), 0, &getCppuType((uno::Reference<container::XIndexContainer>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_VERTPOS), 0, &getCppuType((sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_MOVEPROTECT), 0, &getCppuType((sal_Bool*)0), 0, 0 }, - // #i66550 HLINK_FOR_SHAPES - {MAP_CHAR_LEN(SC_UNONAME_HYPERLINK), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_URL), 0, &getCppuType((rtl::OUString*)0), 0, 0 }, - - {0,0,0,0,0,0} - }; - return aShapeMap_Impl; -} - -const SvEventDescription* ScShapeObj::GetSupportedMacroItems() -{ - static const SvEventDescription aMacroDescriptionsImpl[] = - { - { 0, NULL } - }; - return aMacroDescriptionsImpl; -} -// #i66550 HLINK_FOR_SHAPES -ScMacroInfo* lcl_getShapeHyperMacroInfo( ScShapeObj* pShape, sal_Bool bCreate = false ) -{ - if( pShape ) - if( SdrObject* pObj = pShape->GetSdrObject() ) - return ScDrawLayer::GetMacroInfo( pObj, bCreate ); - return 0; -} - -//------------------------------------------------------------------------ - -namespace -{ - void lcl_initializeNotifier( SdrObject& _rSdrObj, ::cppu::OWeakObject& _rShape ) - { - ::svx::PPropertyValueProvider pProvider( new ::svx::PropertyValueProvider( _rShape, "Anchor" ) ); - _rSdrObj.getShapePropertyChangeNotifier().registerProvider( ::svx::eSpreadsheetAnchor, pProvider ); - } -} - -//------------------------------------------------------------------------ - -ScShapeObj::ScShapeObj( uno::Reference<drawing::XShape>& xShape ) : - pShapePropertySet(NULL), - pShapePropertyState(NULL), - pImplementationId(NULL), - bIsTextShape(false), - bInitializedNotifier(false) -{ - comphelper::increment( m_refCount ); - - { - mxShapeAgg = uno::Reference<uno::XAggregation>( xShape, uno::UNO_QUERY ); - // extra block to force deletion of the temporary before setDelegator - } - - if (mxShapeAgg.is()) - { - xShape = NULL; // during setDelegator, mxShapeAgg must be the only ref - - mxShapeAgg->setDelegator( (cppu::OWeakObject*)this ); - - xShape.set(uno::Reference<drawing::XShape>( mxShapeAgg, uno::UNO_QUERY )); - - bIsTextShape = ( SvxUnoTextBase::getImplementation( mxShapeAgg ) != NULL ); - } - - { - SdrObject* pObj = GetSdrObject(); - if ( pObj ) - { - lcl_initializeNotifier( *pObj, *this ); - bInitializedNotifier = true; - } - } - - comphelper::decrement( m_refCount ); -} - -ScShapeObj::~ScShapeObj() -{ -// if (mxShapeAgg.is()) -// mxShapeAgg->setDelegator(uno::Reference<uno::XInterface>()); -} - -// XInterface - -uno::Any SAL_CALL ScShapeObj::queryInterface( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - uno::Any aRet = ScShapeObj_Base::queryInterface( rType ); - - if ( !aRet.hasValue() && bIsTextShape ) - aRet = ScShapeObj_TextBase::queryInterface( rType ); - - if ( !aRet.hasValue() && mxShapeAgg.is() ) - aRet = mxShapeAgg->queryAggregation( rType ); - - return aRet; -} - -void SAL_CALL ScShapeObj::acquire() throw() -{ - OWeakObject::acquire(); -} - -void SAL_CALL ScShapeObj::release() throw() -{ - OWeakObject::release(); -} - -void ScShapeObj::GetShapePropertySet() -{ - // #i61908# Store the result of queryAggregation in a member. - // The reference in mxShapeAgg is kept for this object's lifetime, so the pointer is always valid. - - if (!pShapePropertySet) - { - uno::Reference<beans::XPropertySet> xProp; - if ( mxShapeAgg.is() ) - mxShapeAgg->queryAggregation( getCppuType((uno::Reference<beans::XPropertySet>*) 0) ) >>= xProp; - pShapePropertySet = xProp.get(); - } -} - -void ScShapeObj::GetShapePropertyState() -{ - // #i61908# Store the result of queryAggregation in a member. - // The reference in mxShapeAgg is kept for this object's lifetime, so the pointer is always valid. - - if (!pShapePropertyState) - { - uno::Reference<beans::XPropertyState> xState; - if ( mxShapeAgg.is() ) - mxShapeAgg->queryAggregation( getCppuType((uno::Reference<beans::XPropertyState>*) 0) ) >>= xState; - pShapePropertyState = xState.get(); - } -} - -uno::Reference<lang::XComponent> lcl_GetComponent( const uno::Reference<uno::XAggregation>& xAgg ) -{ - uno::Reference<lang::XComponent> xRet; - if ( xAgg.is() ) - xAgg->queryAggregation( getCppuType((uno::Reference<lang::XComponent>*) 0) ) >>= xRet; - return xRet; -} - -uno::Reference<text::XText> lcl_GetText( const uno::Reference<uno::XAggregation>& xAgg ) -{ - uno::Reference<text::XText> xRet; - if ( xAgg.is() ) - xAgg->queryAggregation( getCppuType((uno::Reference<text::XText>*) 0) ) >>= xRet; - return xRet; -} - -uno::Reference<text::XSimpleText> lcl_GetSimpleText( const uno::Reference<uno::XAggregation>& xAgg ) -{ - uno::Reference<text::XSimpleText> xRet; - if ( xAgg.is() ) - xAgg->queryAggregation( getCppuType((uno::Reference<text::XSimpleText>*) 0) ) >>= xRet; - return xRet; -} - -uno::Reference<text::XTextRange> lcl_GetTextRange( const uno::Reference<uno::XAggregation>& xAgg ) -{ - uno::Reference<text::XTextRange> xRet; - if ( xAgg.is() ) - xAgg->queryAggregation( getCppuType((uno::Reference<text::XTextRange>*) 0) ) >>= xRet; - return xRet; -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScShapeObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - // #i61527# cache property set info for this object - if ( !mxPropSetInfo.is() ) - { - // mix own and aggregated properties: - GetShapePropertySet(); - if (pShapePropertySet) - { - uno::Reference<beans::XPropertySetInfo> xAggInfo(pShapePropertySet->getPropertySetInfo()); - const uno::Sequence<beans::Property> aPropSeq(xAggInfo->getProperties()); - mxPropSetInfo.set(new SfxExtItemPropertySetInfo( lcl_GetShapeMap(), aPropSeq )); - } - } - return mxPropSetInfo; -} - -sal_Bool lcl_GetPageNum( SdrPage* pPage, SdrModel& rModel, SCTAB& rNum ) -{ - sal_uInt16 nCount = rModel.GetPageCount(); - for (sal_uInt16 i=0; i<nCount; i++) - if ( rModel.GetPage(i) == pPage ) - { - rNum = static_cast<SCTAB>(i); - return sal_True; - } - - return false; -} - -sal_Bool lcl_GetCaptionPoint( uno::Reference< drawing::XShape >& xShape, awt::Point& rCaptionPoint ) -{ - sal_Bool bReturn = false; - rtl::OUString sType(xShape->getShapeType()); - sal_Bool bCaptionShape(sType.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("com.sun.star.drawing.CaptionShape"))); - if (bCaptionShape) - { - uno::Reference < beans::XPropertySet > xShapeProp (xShape, uno::UNO_QUERY); - if (xShapeProp.is()) - { - xShapeProp->getPropertyValue( rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "CaptionPoint" )) ) >>= rCaptionPoint; - bReturn = sal_True; - } - } - return bReturn; -} - -ScRange lcl_GetAnchorCell( uno::Reference< drawing::XShape >& xShape, ScDocument* pDoc, SCTAB nTab, - awt::Point& rUnoPoint, awt::Size& rUnoSize, awt::Point& rCaptionPoint ) -{ - ScRange aReturn; - rUnoPoint = xShape->getPosition(); - rtl::OUString sType(xShape->getShapeType()); - sal_Bool bCaptionShape(lcl_GetCaptionPoint(xShape, rCaptionPoint)); - if (pDoc->IsNegativePage(nTab)) - { - rUnoSize = xShape->getSize(); - rUnoPoint.X += rUnoSize.Width; // the right top point is base - if (bCaptionShape) - { - if (rCaptionPoint.X > 0 && rCaptionPoint.X > rUnoSize.Width) - rUnoPoint.X += rCaptionPoint.X - rUnoSize.Width; - if (rCaptionPoint.Y < 0) - rUnoPoint.Y += rCaptionPoint.Y; - } - aReturn = pDoc->GetRange( nTab, Rectangle( VCLPoint(rUnoPoint), VCLPoint(rUnoPoint) )); - } - else - { - if (bCaptionShape) - { - if (rCaptionPoint.X < 0) - rUnoPoint.X += rCaptionPoint.X; - if (rCaptionPoint.Y < 0) - rUnoPoint.Y += rCaptionPoint.Y; - } - aReturn = pDoc->GetRange( nTab, Rectangle( VCLPoint(rUnoPoint), VCLPoint(rUnoPoint) )); - } - - return aReturn; -} - -awt::Point lcl_GetRelativePos( uno::Reference< drawing::XShape >& xShape, ScDocument* pDoc, SCTAB nTab, ScRange& rRange, - awt::Size& rUnoSize, awt::Point& rCaptionPoint) -{ - awt::Point aUnoPoint; - rRange = lcl_GetAnchorCell(xShape, pDoc, nTab, aUnoPoint, rUnoSize, rCaptionPoint); - Rectangle aRect(pDoc->GetMMRect( rRange.aStart.Col(), rRange.aStart.Row(), rRange.aEnd.Col(), rRange.aEnd.Row(), rRange.aStart.Tab() )); - Point aPoint = pDoc->IsNegativePage(nTab) ? aRect.TopRight() : aRect.TopLeft(); - aUnoPoint.X -= aPoint.X(); - aUnoPoint.Y -= aPoint.Y(); - return aUnoPoint; -} - -void SAL_CALL ScShapeObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - - if ( aNameString.EqualsAscii( SC_UNONAME_ANCHOR ) ) - { - uno::Reference<sheet::XCellRangeAddressable> xRangeAdd(aValue, uno::UNO_QUERY); - if (xRangeAdd.is()) - { - SdrObject *pObj = GetSdrObject(); - if (pObj) - { - ScDrawLayer* pModel = (ScDrawLayer*)pObj->GetModel(); - SdrPage* pPage = pObj->GetPage(); - if ( pModel && pPage ) - { - ScDocument* pDoc = pModel->GetDocument(); - if ( pDoc ) - { - SfxObjectShell* pObjSh = pDoc->GetDocumentShell(); - if ( pObjSh && pObjSh->ISA(ScDocShell) ) - { - ScDocShell* pDocSh = (ScDocShell*)pObjSh; - - SCTAB nTab = 0; - if ( lcl_GetPageNum( pPage, *pModel, nTab ) ) - { - table::CellRangeAddress aAddress = xRangeAdd->getRangeAddress(); - if (nTab == aAddress.Sheet) - { - Rectangle aRect(pDoc->GetMMRect( static_cast<SCCOL>(aAddress.StartColumn), static_cast<SCROW>(aAddress.StartRow), - static_cast<SCCOL>(aAddress.EndColumn), static_cast<SCROW>(aAddress.EndRow), aAddress.Sheet )); - awt::Point aRelPoint; - uno::Reference<drawing::XShape> xShape( mxShapeAgg, uno::UNO_QUERY ); - if (xShape.is()) - { - Point aPoint; - Point aEndPoint; - if (pDoc->IsNegativePage(nTab)) - { - aPoint = aRect.TopRight(); - aEndPoint = aRect.BottomLeft(); - } - else - { - aPoint = aRect.TopLeft(); - aEndPoint = aRect.BottomRight(); - } - awt::Size aUnoSize; - awt::Point aCaptionPoint; - ScRange aRange; - aRelPoint = lcl_GetRelativePos( xShape, pDoc, nTab, aRange, aUnoSize, aCaptionPoint ); - awt::Point aUnoPoint(aRelPoint); - - aUnoPoint.X += aPoint.X(); - aUnoPoint.Y += aPoint.Y(); - - if ( aUnoPoint.Y > aEndPoint.Y() ) - aUnoPoint.Y = aEndPoint.Y() - 2; - if (pDoc->IsNegativePage(nTab)) - { - if ( aUnoPoint.X < aEndPoint.X() ) - aUnoPoint.X = aEndPoint.X() + 2; - aUnoPoint.X -= aUnoSize.Width; - // remove difference to caption point - if (aCaptionPoint.X > 0 && aCaptionPoint.X > aUnoSize.Width) - aUnoPoint.X -= aCaptionPoint.X - aUnoSize.Width; - } - else - { - if ( aUnoPoint.X > aEndPoint.X() ) - aUnoPoint.X = aEndPoint.X() - 2; - if (aCaptionPoint.X < 0) - aUnoPoint.X -= aCaptionPoint.X; - } - if (aCaptionPoint.Y < 0) - aUnoPoint.Y -= aCaptionPoint.Y; - - xShape->setPosition(aUnoPoint); - pDocSh->SetModified(); - } - - if (aAddress.StartRow != aAddress.EndRow) //should be a Spreadsheet - { - OSL_ENSURE(aAddress.StartRow == 0 && aAddress.EndRow == MAXROW && - aAddress.StartColumn == 0 && aAddress.EndColumn == MAXCOL, "here should be a XSpreadsheet"); - ScDrawLayer::SetPageAnchored(*pObj); - } - else - { - OSL_ENSURE(aAddress.StartRow == aAddress.EndRow && - aAddress.StartColumn == aAddress.EndColumn, "here should be a XCell"); - ScDrawObjData aAnchor; - aAnchor.maStart = ScAddress(aAddress.StartColumn, aAddress.StartRow, aAddress.Sheet); - aAnchor.maStartOffset = Point(aRelPoint.X, aRelPoint.Y); - ScDrawLayer::SetCellAnchored(*pObj, aAnchor); - //Currently we've only got a start anchor, not an end-anchor, so generate that now - ScDrawLayer::UpdateCellAnchorFromPositionEnd(*pObj, *pDoc, aAddress.Sheet); - } - } - } - } - } - } - } - } - else - throw lang::IllegalArgumentException(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("only XCell or XSpreadsheet objects allowed")), static_cast<cppu::OWeakObject*>(this), 0); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_IMAGEMAP ) ) - { - SdrObject* pObj = GetSdrObject(); - if ( pObj ) - { - ImageMap aImageMap; - uno::Reference< uno::XInterface > xImageMapInt(aValue, uno::UNO_QUERY); - - if( !xImageMapInt.is() || !SvUnoImageMap_fillImageMap( xImageMapInt, aImageMap ) ) - throw lang::IllegalArgumentException(); - - ScIMapInfo* pIMapInfo = ScDrawLayer::GetIMapInfo(pObj); - if( pIMapInfo ) - { - // replace existing image map - pIMapInfo->SetImageMap( aImageMap ); - } - else - { - // insert new user data with image map - pObj->InsertUserData(new ScIMapInfo(aImageMap) ); - } - } - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HORIPOS ) ) - { - sal_Int32 nPos = 0; - if (aValue >>= nPos) - { - SdrObject *pObj = GetSdrObject(); - if (pObj) - { - ScDrawLayer* pModel = (ScDrawLayer*)pObj->GetModel(); - SdrPage* pPage = pObj->GetPage(); - if ( pModel && pPage ) - { - SCTAB nTab = 0; - if ( lcl_GetPageNum( pPage, *pModel, nTab ) ) - { - ScDocument* pDoc = pModel->GetDocument(); - if ( pDoc ) - { - SfxObjectShell* pObjSh = pDoc->GetDocumentShell(); - if ( pObjSh && pObjSh->ISA(ScDocShell) ) - { - ScDocShell* pDocSh = (ScDocShell*)pObjSh; - uno::Reference<drawing::XShape> xShape( mxShapeAgg, uno::UNO_QUERY ); - if (xShape.is()) - { - if (ScDrawLayer::GetAnchorType(*pObj) == SCA_PAGE) - { - awt::Point aPoint(xShape->getPosition()); - awt::Size aSize(xShape->getSize()); - awt::Point aCaptionPoint; - if (pDoc->IsNegativePage(nTab)) - { - nPos *= -1; - nPos -= aSize.Width; - } - if (lcl_GetCaptionPoint(xShape, aCaptionPoint)) - { - if (pDoc->IsNegativePage(nTab)) - { - if (aCaptionPoint.X > 0 && aCaptionPoint.X > aSize.Width) - nPos -= aCaptionPoint.X - aSize.Width; - } - else - { - if (aCaptionPoint.X < 0) - nPos -= aCaptionPoint.X; - } - } - aPoint.X = nPos; - xShape->setPosition(aPoint); - pDocSh->SetModified(); - } - else if (ScDrawLayer::GetAnchorType(*pObj) == SCA_CELL) - { - awt::Size aUnoSize; - awt::Point aCaptionPoint; - ScRange aRange; - awt::Point aUnoPoint(lcl_GetRelativePos( xShape, pDoc, nTab, aRange, aUnoSize, aCaptionPoint )); - Rectangle aRect(pDoc->GetMMRect( aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab() )); - if (pDoc->IsNegativePage(nTab)) - { - aUnoPoint.X = -nPos; - Point aPoint(aRect.TopRight()); - Point aEndPoint(aRect.BottomLeft()); - aUnoPoint.X += aPoint.X(); - if (aUnoPoint.X < aEndPoint.X()) - aUnoPoint.X = aEndPoint.X() + 2; - aUnoPoint.X -= aUnoSize.Width; - if (aCaptionPoint.X > 0 && aCaptionPoint.X > aUnoSize.Width) - aUnoPoint.X -= aCaptionPoint.X - aUnoSize.Width; - } - else - { - aUnoPoint.X = nPos; - Point aPoint(aRect.TopLeft()); - Point aEndPoint(aRect.BottomRight()); - aUnoPoint.X += aPoint.X(); - if (aUnoPoint.X > aEndPoint.X()) - aUnoPoint.X = aEndPoint.X() - 2; - if (aCaptionPoint.X < 0) - aUnoPoint.X -= aCaptionPoint.X; - } - aUnoPoint.Y = xShape->getPosition().Y; - xShape->setPosition(aUnoPoint); - pDocSh->SetModified(); - } - else - { - OSL_FAIL("unknown anchor type"); - } - } - } - } - } - } - } - } - } - else if ( aNameString.EqualsAscii( SC_UNONAME_VERTPOS ) ) - { - sal_Int32 nPos = 0; - if (aValue >>= nPos) - { - SdrObject *pObj = GetSdrObject(); - if (pObj) - { - ScDrawLayer* pModel = (ScDrawLayer*)pObj->GetModel(); - SdrPage* pPage = pObj->GetPage(); - if ( pModel && pPage ) - { - SCTAB nTab = 0; - if ( lcl_GetPageNum( pPage, *pModel, nTab ) ) - { - ScDocument* pDoc = pModel->GetDocument(); - if ( pDoc ) - { - SfxObjectShell* pObjSh = pDoc->GetDocumentShell(); - if ( pObjSh && pObjSh->ISA(ScDocShell) ) - { - ScDocShell* pDocSh = (ScDocShell*)pObjSh; - uno::Reference<drawing::XShape> xShape( mxShapeAgg, uno::UNO_QUERY ); - if (xShape.is()) - { - if (ScDrawLayer::GetAnchorType(*pObj) == SCA_PAGE) - { - awt::Point aPoint = xShape->getPosition(); - awt::Point aCaptionPoint; - if (lcl_GetCaptionPoint(xShape, aCaptionPoint)) - { - if (aCaptionPoint.Y < 0) - nPos -= aCaptionPoint.Y; - } - aPoint.Y = nPos; - xShape->setPosition(aPoint); - pDocSh->SetModified(); - } - else if (ScDrawLayer::GetAnchorType(*pObj) == SCA_CELL) - { - awt::Size aUnoSize; - awt::Point aCaptionPoint; - ScRange aRange; - awt::Point aUnoPoint(lcl_GetRelativePos( xShape, pDoc, nTab, aRange, aUnoSize, aCaptionPoint )); - Rectangle aRect(pDoc->GetMMRect( aRange.aStart.Col(), aRange.aStart.Row(), aRange.aEnd.Col(), aRange.aEnd.Row(), aRange.aStart.Tab() )); - Point aPoint(aRect.TopRight()); - Point aEndPoint(aRect.BottomLeft()); - aUnoPoint.Y = nPos; - aUnoPoint.Y += aPoint.Y(); - if (aUnoPoint.Y > aEndPoint.Y()) - aUnoPoint.Y = aEndPoint.Y() - 2; - if (aCaptionPoint.Y < 0) - aUnoPoint.Y -= aCaptionPoint.Y; - aUnoPoint.X = xShape->getPosition().X; - xShape->setPosition(aUnoPoint); - pDocSh->SetModified(); - } - else - { - OSL_FAIL("unknown anchor type"); - } - } - } - } - } - } - } - } - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HYPERLINK ) || - aNameString.EqualsAscii( SC_UNONAME_URL) ) - { - rtl::OUString sHlink; - ScMacroInfo* pInfo = lcl_getShapeHyperMacroInfo(this, true); - if ( ( aValue >>= sHlink ) && pInfo ) - pInfo->SetHlink( sHlink ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_MOVEPROTECT ) ) - { - if( SdrObject* pObj = this->GetSdrObject() ) - { - sal_Bool aProt = false; - if( aValue >>= aProt ) - pObj->SetMoveProtect( aProt ); - } - } - else - { - GetShapePropertySet(); - if (pShapePropertySet) - pShapePropertySet->setPropertyValue( aPropertyName, aValue ); - } -} - -uno::Any SAL_CALL ScShapeObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString = aPropertyName; - - uno::Any aAny; - if ( aNameString.EqualsAscii( SC_UNONAME_ANCHOR ) ) - { - SdrObject *pObj = GetSdrObject(); - if (pObj) - { - ScDrawLayer* pModel = (ScDrawLayer*)pObj->GetModel(); - SdrPage* pPage = pObj->GetPage(); - if ( pModel && pPage ) - { - ScDocument* pDoc = pModel->GetDocument(); - if ( pDoc ) - { - SCTAB nTab = 0; - if ( lcl_GetPageNum( pPage, *pModel, nTab ) ) - { - SfxObjectShell* pObjSh = pDoc->GetDocumentShell(); - if ( pObjSh && pObjSh->ISA(ScDocShell) ) - { - ScDocShell* pDocSh = (ScDocShell*)pObjSh; - uno::Reference< uno::XInterface > xAnchor; - if (ScDrawObjData *pAnchor = ScDrawLayer::GetObjDataTab(pObj, nTab)) - xAnchor.set(static_cast<cppu::OWeakObject*>(new ScCellObj( pDocSh, pAnchor->maStart))); - else - xAnchor.set(static_cast<cppu::OWeakObject*>(new ScTableSheetObj( pDocSh, nTab ))); - aAny <<= xAnchor; - } - } - } - } - } - } - else if ( aNameString.EqualsAscii( SC_UNONAME_IMAGEMAP ) ) - { - uno::Reference< uno::XInterface > xImageMap; - SdrObject* pObj = GetSdrObject(); - if ( pObj ) - { - ScIMapInfo* pIMapInfo = ScDrawLayer::GetIMapInfo(GetSdrObject()); - if( pIMapInfo ) - { - const ImageMap& rIMap = pIMapInfo->GetImageMap(); - xImageMap.set(SvUnoImageMap_createInstance( rIMap, GetSupportedMacroItems() )); - } - else - xImageMap = SvUnoImageMap_createInstance( GetSupportedMacroItems() ); - } - aAny <<= uno::Reference< container::XIndexContainer >::query( xImageMap ); - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HORIPOS ) ) - { - SdrObject *pObj = GetSdrObject(); - if (pObj) - { - ScDrawLayer* pModel = (ScDrawLayer*)pObj->GetModel(); - SdrPage* pPage = pObj->GetPage(); - if ( pModel && pPage ) - { - ScDocument* pDoc = pModel->GetDocument(); - if ( pDoc ) - { - SCTAB nTab = 0; - if ( lcl_GetPageNum( pPage, *pModel, nTab ) ) - { - uno::Reference<drawing::XShape> xShape( mxShapeAgg, uno::UNO_QUERY ); - if (xShape.is()) - { - if (ScDrawLayer::GetAnchorType(*pObj) == SCA_CELL) - { - awt::Size aUnoSize; - awt::Point aCaptionPoint; - ScRange aRange; - awt::Point aUnoPoint(lcl_GetRelativePos( xShape, pDoc, nTab, aRange, aUnoSize, aCaptionPoint )); - if (pDoc->IsNegativePage(nTab)) - aUnoPoint.X *= -1; - aAny <<= aUnoPoint.X; - } - else - { - awt::Point aCaptionPoint; - awt::Point aUnoPoint(xShape->getPosition()); - awt::Size aUnoSize(xShape->getSize()); - if (pDoc->IsNegativePage(nTab)) - { - aUnoPoint.X *= -1; - aUnoPoint.X -= aUnoSize.Width; - } - if (lcl_GetCaptionPoint(xShape, aCaptionPoint)) - { - if (pDoc->IsNegativePage(nTab)) - { - if (aCaptionPoint.X > 0 && aCaptionPoint.X > aUnoSize.Width) - aUnoPoint.X -= aCaptionPoint.X - aUnoSize.Width; - } - else - { - if (aCaptionPoint.X < 0) - aUnoPoint.X += aCaptionPoint.X; - } - } - aAny <<= aUnoPoint.X; - } - } - } - } - } - } - } - else if ( aNameString.EqualsAscii( SC_UNONAME_VERTPOS ) ) - { - SdrObject *pObj = GetSdrObject(); - if (pObj) - { - ScDrawLayer* pModel = (ScDrawLayer*)pObj->GetModel(); - SdrPage* pPage = pObj->GetPage(); - if ( pModel && pPage ) - { - ScDocument* pDoc = pModel->GetDocument(); - if ( pDoc ) - { - SCTAB nTab = 0; - if ( lcl_GetPageNum( pPage, *pModel, nTab ) ) - { - uno::Reference<drawing::XShape> xShape( mxShapeAgg, uno::UNO_QUERY ); - if (xShape.is()) - { - uno::Reference< uno::XInterface > xAnchor; - if (ScDrawLayer::GetAnchorType(*pObj) == SCA_CELL) - { - awt::Size aUnoSize; - awt::Point aCaptionPoint; - ScRange aRange; - awt::Point aUnoPoint(lcl_GetRelativePos( xShape, pDoc, nTab, aRange, aUnoSize, aCaptionPoint )); - - aAny <<= aUnoPoint.Y; - } - else - { - awt::Point aUnoPoint(xShape->getPosition()); - awt::Point aCaptionPoint; - if (lcl_GetCaptionPoint(xShape, aCaptionPoint)) - { - if (aCaptionPoint.Y < 0) - aUnoPoint.Y += aCaptionPoint.Y; - } - aAny <<= aUnoPoint.Y; - } - } - } - } - } - } - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HYPERLINK ) || - aNameString.EqualsAscii( SC_UNONAME_URL ) ) - { - rtl::OUString sHlink; - if ( ScMacroInfo* pInfo = lcl_getShapeHyperMacroInfo(this) ) - sHlink = pInfo->GetHlink(); - aAny <<= sHlink; - } - else if ( aNameString.EqualsAscii( SC_UNONAME_MOVEPROTECT ) ) - { - sal_Bool aProt = false; - if ( SdrObject* pObj = this->GetSdrObject() ) - aProt = pObj->IsMoveProtect(); - aAny <<= aProt; - } - else - { - GetShapePropertySet(); - if (pShapePropertySet) - aAny = pShapePropertySet->getPropertyValue( aPropertyName ); - } - - return aAny; -} - -void SAL_CALL ScShapeObj::addPropertyChangeListener( const rtl::OUString& aPropertyName, - const uno::Reference<beans::XPropertyChangeListener>& aListener) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - GetShapePropertySet(); - if (pShapePropertySet) - pShapePropertySet->addPropertyChangeListener( aPropertyName, aListener ); - - if ( !bInitializedNotifier ) - { - // here's the latest chance to initialize the property notification at the SdrObject - // (in the ctor, where we also attempt to do this, we do not necessarily have - // and SdrObject, yet) - SdrObject* pObj = GetSdrObject(); - OSL_ENSURE( pObj, "ScShapeObj::addPropertyChangeListener: no SdrObject -> no property change notification!" ); - if ( pObj ) - lcl_initializeNotifier( *pObj, *this ); - bInitializedNotifier = true; - } -} - -void SAL_CALL ScShapeObj::removePropertyChangeListener( const rtl::OUString& aPropertyName, - const uno::Reference<beans::XPropertyChangeListener>& aListener) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - GetShapePropertySet(); - if (pShapePropertySet) - pShapePropertySet->removePropertyChangeListener( aPropertyName, aListener ); -} - -void SAL_CALL ScShapeObj::addVetoableChangeListener( const rtl::OUString& aPropertyName, - const uno::Reference<beans::XVetoableChangeListener>& aListener) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - GetShapePropertySet(); - if (pShapePropertySet) - pShapePropertySet->addVetoableChangeListener( aPropertyName, aListener ); -} - -void SAL_CALL ScShapeObj::removeVetoableChangeListener( const rtl::OUString& aPropertyName, - const uno::Reference<beans::XVetoableChangeListener>& aListener) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - GetShapePropertySet(); - if (pShapePropertySet) - pShapePropertySet->removeVetoableChangeListener( aPropertyName, aListener ); -} - -// XPropertyState - -beans::PropertyState SAL_CALL ScShapeObj::getPropertyState( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - - beans::PropertyState eRet = beans::PropertyState_DIRECT_VALUE; - if ( aNameString.EqualsAscii( SC_UNONAME_IMAGEMAP ) ) - { - // ImageMap is always "direct" - } - else if ( aNameString.EqualsAscii( SC_UNONAME_ANCHOR ) ) - { - // Anchor is always "direct" - } - else if ( aNameString.EqualsAscii( SC_UNONAME_HORIPOS ) ) - { - // HoriPos is always "direct" - } - else if ( aNameString.EqualsAscii( SC_UNONAME_VERTPOS ) ) - { - // VertPos is always "direct" - } - else - { - GetShapePropertyState(); - if (pShapePropertyState) - eRet = pShapePropertyState->getPropertyState( aPropertyName ); - } - - return eRet; -} - -uno::Sequence<beans::PropertyState> SAL_CALL ScShapeObj::getPropertyStates( - const uno::Sequence<rtl::OUString>& aPropertyNames ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - // simple loop to get own and aggregated states - - const rtl::OUString* pNames = aPropertyNames.getConstArray(); - uno::Sequence<beans::PropertyState> aRet(aPropertyNames.getLength()); - beans::PropertyState* pStates = aRet.getArray(); - for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++) - pStates[i] = getPropertyState(pNames[i]); - return aRet; -} - -void SAL_CALL ScShapeObj::setPropertyToDefault( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString(aPropertyName); - - if ( aNameString.EqualsAscii( SC_UNONAME_IMAGEMAP ) ) - { - SdrObject* pObj = GetSdrObject(); - if ( pObj ) - { - ScIMapInfo* pIMapInfo = ScDrawLayer::GetIMapInfo(pObj); - if( pIMapInfo ) - { - ImageMap aEmpty; - pIMapInfo->SetImageMap( aEmpty ); // replace with empty image map - } - else - { - // nothing to do (no need to insert user data for an empty map) - } - } - } - else - { - GetShapePropertyState(); - if (pShapePropertyState) - pShapePropertyState->setPropertyToDefault( aPropertyName ); - } -} - -uno::Any SAL_CALL ScShapeObj::getPropertyDefault( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameString = aPropertyName; - - uno::Any aAny; - if ( aNameString.EqualsAscii( SC_UNONAME_IMAGEMAP ) ) - { - // default: empty ImageMap - uno::Reference< uno::XInterface > xImageMap(SvUnoImageMap_createInstance( GetSupportedMacroItems() )); - aAny <<= uno::Reference< container::XIndexContainer >::query( xImageMap ); - } - else - { - GetShapePropertyState(); - if (pShapePropertyState) - aAny = pShapePropertyState->getPropertyDefault( aPropertyName ); - } - - return aAny; -} - -// XTextContent - -void SAL_CALL ScShapeObj::attach( const uno::Reference<text::XTextRange>& /* xTextRange */ ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - throw lang::IllegalArgumentException(); // anchor cannot be changed -} - -uno::Reference<text::XTextRange> SAL_CALL ScShapeObj::getAnchor() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<text::XTextRange> xRet; - - SdrObject* pObj = GetSdrObject(); - if( pObj ) - { - ScDrawLayer* pModel = (ScDrawLayer*)pObj->GetModel(); - SdrPage* pPage = pObj->GetPage(); - if ( pModel ) - { - ScDocument* pDoc = pModel->GetDocument(); - if ( pDoc ) - { - SfxObjectShell* pObjSh = pDoc->GetDocumentShell(); - if ( pObjSh && pObjSh->ISA(ScDocShell) ) - { - ScDocShell* pDocSh = (ScDocShell*)pObjSh; - - SCTAB nTab = 0; - if ( lcl_GetPageNum( pPage, *pModel, nTab ) ) - { - Point aPos(pObj->GetCurrentBoundRect().TopLeft()); - ScRange aRange(pDoc->GetRange( nTab, Rectangle( aPos, aPos ) )); - - // anchor is always the cell - - xRet.set(new ScCellObj( pDocSh, aRange.aStart )); - } - } - } - } - } - - return xRet; -} - -// XComponent - -void SAL_CALL ScShapeObj::dispose() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<lang::XComponent> xAggComp(lcl_GetComponent(mxShapeAgg)); - if ( xAggComp.is() ) - xAggComp->dispose(); -} - -void SAL_CALL ScShapeObj::addEventListener( - const uno::Reference<lang::XEventListener>& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<lang::XComponent> xAggComp(lcl_GetComponent(mxShapeAgg)); - if ( xAggComp.is() ) - xAggComp->addEventListener(xListener); -} - -void SAL_CALL ScShapeObj::removeEventListener( - const uno::Reference<lang::XEventListener>& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<lang::XComponent> xAggComp(lcl_GetComponent(mxShapeAgg)); - if ( xAggComp.is() ) - xAggComp->removeEventListener(xListener); -} - -// XText -// (special handling for ScCellFieldObj) - -void lcl_CopyOneProperty( beans::XPropertySet& rDest, beans::XPropertySet& rSource, const sal_Char* pName ) -{ - rtl::OUString aNameStr(rtl::OUString::createFromAscii(pName)); - try - { - rDest.setPropertyValue( aNameStr, rSource.getPropertyValue( aNameStr ) ); - } - catch (uno::Exception&) - { - OSL_FAIL("Exception in text field"); - } -} - -void SAL_CALL ScShapeObj::insertTextContent( const uno::Reference<text::XTextRange>& xRange, - const uno::Reference<text::XTextContent>& xContent, - sal_Bool bAbsorb ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<text::XTextContent> xEffContent; - - ScCellFieldObj* pCellField = ScCellFieldObj::getImplementation( xContent ); - if ( pCellField ) - { - // createInstance("TextField.URL") from the document creates a ScCellFieldObj. - // To insert it into drawing text, a SvxUnoTextField is needed instead. - // The ScCellFieldObj object is left in non-inserted state. - - SvxUnoTextField* pDrawField = new SvxUnoTextField( ID_URLFIELD ); - xEffContent.set(pDrawField); - lcl_CopyOneProperty( *pDrawField, *pCellField, SC_UNONAME_URL ); - lcl_CopyOneProperty( *pDrawField, *pCellField, SC_UNONAME_REPR ); - lcl_CopyOneProperty( *pDrawField, *pCellField, SC_UNONAME_TARGET ); - } - else - xEffContent.set(xContent); - - uno::Reference<text::XText> xAggText(lcl_GetText(mxShapeAgg)); - if ( xAggText.is() ) - xAggText->insertTextContent( xRange, xEffContent, bAbsorb ); -} - -void SAL_CALL ScShapeObj::removeTextContent( const uno::Reference<text::XTextContent>& xContent ) - throw(container::NoSuchElementException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - // ScCellFieldObj can't be used here. - - uno::Reference<text::XText> xAggText(lcl_GetText(mxShapeAgg)); - if ( xAggText.is() ) - xAggText->removeTextContent( xContent ); -} - -// XSimpleText (parent of XText) -// Use own SvxUnoTextCursor subclass - everything is just passed to aggregated object - -uno::Reference<text::XTextCursor> SAL_CALL ScShapeObj::createTextCursor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( mxShapeAgg.is() ) - { - // ScDrawTextCursor must be used to ensure the ScShapeObj is returned by getText - - SvxUnoTextBase* pText = SvxUnoTextBase::getImplementation( mxShapeAgg ); - if (pText) - return new ScDrawTextCursor( this, *pText ); - } - - return uno::Reference<text::XTextCursor>(); -} - -uno::Reference<text::XTextCursor> SAL_CALL ScShapeObj::createTextCursorByRange( - const uno::Reference<text::XTextRange>& aTextPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if ( mxShapeAgg.is() && aTextPosition.is() ) - { - // ScDrawTextCursor must be used to ensure the ScShapeObj is returned by getText - - SvxUnoTextBase* pText = SvxUnoTextBase::getImplementation( mxShapeAgg ); - SvxUnoTextRangeBase* pRange = SvxUnoTextRangeBase::getImplementation( aTextPosition ); - if ( pText && pRange ) - { - SvxUnoTextCursor* pCursor = new ScDrawTextCursor( this, *pText ); - uno::Reference<text::XTextCursor> xCursor( pCursor ); - pCursor->SetSelection( pRange->GetSelection() ); - return xCursor; - } - } - - return uno::Reference<text::XTextCursor>(); -} - -void SAL_CALL ScShapeObj::insertString( const uno::Reference<text::XTextRange>& xRange, - const rtl::OUString& aString, sal_Bool bAbsorb ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<text::XSimpleText> xAggSimpleText(lcl_GetSimpleText(mxShapeAgg)); - if ( xAggSimpleText.is() ) - xAggSimpleText->insertString( xRange, aString, bAbsorb ); - else - throw uno::RuntimeException(); -} - -void SAL_CALL ScShapeObj::insertControlCharacter( const uno::Reference<text::XTextRange>& xRange, - sal_Int16 nControlCharacter, sal_Bool bAbsorb ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<text::XSimpleText> xAggSimpleText(lcl_GetSimpleText(mxShapeAgg)); - if ( xAggSimpleText.is() ) - xAggSimpleText->insertControlCharacter( xRange, nControlCharacter, bAbsorb ); - else - throw uno::RuntimeException(); -} - -// XTextRange -// (parent of XSimpleText) - -uno::Reference<text::XText> SAL_CALL ScShapeObj::getText() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return this; -} - -uno::Reference<text::XTextRange> SAL_CALL ScShapeObj::getStart() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<text::XTextRange> xAggTextRange(lcl_GetTextRange(mxShapeAgg)); - if ( xAggTextRange.is() ) - return xAggTextRange->getStart(); - else - throw uno::RuntimeException(); - -// return uno::Reference<text::XTextRange>(); -} - -uno::Reference<text::XTextRange> SAL_CALL ScShapeObj::getEnd() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<text::XTextRange> xAggTextRange(lcl_GetTextRange(mxShapeAgg)); - if ( xAggTextRange.is() ) - return xAggTextRange->getEnd(); - else - throw uno::RuntimeException(); - -// return uno::Reference<text::XTextRange>(); -} - -rtl::OUString SAL_CALL ScShapeObj::getString() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<text::XTextRange> xAggTextRange(lcl_GetTextRange(mxShapeAgg)); - if ( xAggTextRange.is() ) - return xAggTextRange->getString(); - else - throw uno::RuntimeException(); - -// return rtl::OUString(); -} - -void SAL_CALL ScShapeObj::setString( const rtl::OUString& aText ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<text::XTextRange> xAggTextRange(lcl_GetTextRange(mxShapeAgg)); - if ( xAggTextRange.is() ) - xAggTextRange->setString( aText ); - else - throw uno::RuntimeException(); -} - -// XTypeProvider - -uno::Sequence<uno::Type> SAL_CALL ScShapeObj::getTypes() throw(uno::RuntimeException) -{ - uno::Sequence< uno::Type > aBaseTypes( ScShapeObj_Base::getTypes() ); - - uno::Sequence< uno::Type > aTextTypes; - if ( bIsTextShape ) - aTextTypes = ScShapeObj_TextBase::getTypes(); - - uno::Reference<lang::XTypeProvider> xBaseProvider; - if ( mxShapeAgg.is() ) - mxShapeAgg->queryAggregation( getCppuType((uno::Reference<lang::XTypeProvider>*) 0) ) >>= xBaseProvider; - OSL_ENSURE( xBaseProvider.is(), "ScShapeObj: No XTypeProvider from aggregated shape!" ); - - uno::Sequence< uno::Type > aAggTypes; - if( xBaseProvider.is() ) - aAggTypes = xBaseProvider->getTypes(); - - return ::comphelper::concatSequences( aBaseTypes, aTextTypes, aAggTypes ); -} - -uno::Sequence<sal_Int8> SAL_CALL ScShapeObj::getImplementationId() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // do we need to compute the implementation id for this instance? - if( !pImplementationId && mxShapeAgg.is()) - { - uno::Reference< drawing::XShape > xAggShape; - mxShapeAgg->queryAggregation( ::getCppuType((uno::Reference< drawing::XShape >*)0) ) >>= xAggShape; - - if( xAggShape.is() ) - { - const rtl::OUString aShapeType( xAggShape->getShapeType() ); - // did we already compute an implementation id for the agregated shape type? - ScShapeImplementationIdMap::iterator aIter( aImplementationIdMap.find(aShapeType ) ); - if( aIter == aImplementationIdMap.end() ) - { - // we need to create a new implementation id for this - // note: this memory is not free'd until application exits - // but since we have a fixed set of shapetypes and the - // memory will be reused this is ok. - pImplementationId = new uno::Sequence< sal_Int8 >( 16 ); - rtl_createUuid( (sal_uInt8 *) pImplementationId->getArray(), 0, sal_True ); - aImplementationIdMap[ aShapeType ] = pImplementationId; - } - else - { - // use the already computed implementation id - pImplementationId = (*aIter).second; - } - } - } - if( NULL == pImplementationId ) - { - OSL_FAIL( "Could not create an implementation id for a ScXShape!" ); - return uno::Sequence< sal_Int8 > (); - } - else - { - return *pImplementationId; - } -} - -SdrObject* ScShapeObj::GetSdrObject() const throw() -{ - if(mxShapeAgg.is()) - { - SvxShape* pShape = SvxShape::getImplementation( mxShapeAgg ); - if(pShape) - return pShape->GetSdrObject(); - } - - return NULL; -} - -#define SC_EVENTACC_ONCLICK ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "OnClick" ) ) -#define SC_EVENTACC_SCRIPT ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Script" ) ) -#define SC_EVENTACC_EVENTTYPE ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "EventType" ) ) - -typedef ::cppu::WeakImplHelper1< container::XNameReplace > ShapeUnoEventAcess_BASE; -class ShapeUnoEventAccessImpl : public ShapeUnoEventAcess_BASE -{ -private: - ScShapeObj* mpShape; - - ScMacroInfo* getInfo( sal_Bool bCreate = false ) - { - return lcl_getShapeHyperMacroInfo( mpShape, bCreate ); - } - -public: - ShapeUnoEventAccessImpl( ScShapeObj* pShape ): mpShape( pShape ) - { - } - - // XNameReplace - virtual void SAL_CALL replaceByName( const rtl::OUString& aName, const uno::Any& aElement ) throw(lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) - { - if ( !hasByName( aName ) ) - throw container::NoSuchElementException(); - uno::Sequence< beans::PropertyValue > aProperties; - aElement >>= aProperties; - const beans::PropertyValue* pProperties = aProperties.getConstArray(); - const sal_Int32 nCount = aProperties.getLength(); - sal_Int32 nIndex; - bool isEventType = false; - for( nIndex = 0; nIndex < nCount; nIndex++, pProperties++ ) - { - if ( pProperties->Name.equals( SC_EVENTACC_EVENTTYPE ) ) - { - isEventType = true; - continue; - } - if ( isEventType && (pProperties->Name == SC_EVENTACC_SCRIPT) ) - { - rtl::OUString sValue; - if ( pProperties->Value >>= sValue ) - { - ScMacroInfo* pInfo = getInfo( sal_True ); - OSL_ENSURE( pInfo, "shape macro info could not be created!" ); - if ( !pInfo ) - break; - if ( pProperties->Name == SC_EVENTACC_SCRIPT ) - pInfo->SetMacro( sValue ); - else - pInfo->SetHlink( sValue ); - } - } - } - } - - // XNameAccess - virtual uno::Any SAL_CALL getByName( const rtl::OUString& aName ) throw(container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException) - { - uno::Sequence< beans::PropertyValue > aProperties; - ScMacroInfo* pInfo = getInfo(); - - if ( aName == SC_EVENTACC_ONCLICK ) - { - if ( pInfo && (pInfo->GetMacro().getLength() > 0) ) - { - aProperties.realloc( 2 ); - aProperties[ 0 ].Name = SC_EVENTACC_EVENTTYPE; - aProperties[ 0 ].Value <<= SC_EVENTACC_SCRIPT; - aProperties[ 1 ].Name = SC_EVENTACC_SCRIPT; - aProperties[ 1 ].Value <<= pInfo->GetMacro(); - } - } - else - { - throw container::NoSuchElementException(); - } - - return uno::Any( aProperties ); - } - - virtual uno::Sequence< rtl::OUString > SAL_CALL getElementNames() throw(uno::RuntimeException) - { - uno::Sequence< rtl::OUString > aSeq( 1 ); - aSeq[ 0 ] = SC_EVENTACC_ONCLICK; - return aSeq; - } - - virtual sal_Bool SAL_CALL hasByName( const rtl::OUString& aName ) throw(uno::RuntimeException) - { - return aName == SC_EVENTACC_ONCLICK; - } - - // XElementAccess - virtual uno::Type SAL_CALL getElementType() throw(uno::RuntimeException) - { - return *SEQTYPE(::getCppuType((const uno::Sequence< beans::PropertyValue >*)0)); - } - - virtual sal_Bool SAL_CALL hasElements() throw(uno::RuntimeException) - { - // elements are always present (but contained property sequences may be empty) - return sal_True; - } -}; - -::uno::Reference< container::XNameReplace > SAL_CALL -ScShapeObj::getEvents( ) throw(uno::RuntimeException) -{ - return new ShapeUnoEventAccessImpl( this ); -} - -::rtl::OUString SAL_CALL ScShapeObj::getImplementationName( ) throw (uno::RuntimeException) -{ - return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.sc.ScShapeObj" ) ); -} - -::sal_Bool SAL_CALL ScShapeObj::supportsService( const ::rtl::OUString& _ServiceName ) throw (uno::RuntimeException) -{ - uno::Sequence< ::rtl::OUString > aSupported( getSupportedServiceNames() ); - for ( const ::rtl::OUString* pSupported = aSupported.getConstArray(); - pSupported != aSupported.getConstArray() + aSupported.getLength(); - ++pSupported - ) - if ( _ServiceName == *pSupported ) - return sal_True; - return false; -} - -uno::Sequence< ::rtl::OUString > SAL_CALL ScShapeObj::getSupportedServiceNames( ) throw (uno::RuntimeException) -{ - uno::Reference<lang::XServiceInfo> xSI; - if ( mxShapeAgg.is() ) - mxShapeAgg->queryAggregation( lang::XServiceInfo::static_type() ) >>= xSI; - - uno::Sequence< ::rtl::OUString > aSupported; - if ( xSI.is() ) - aSupported = xSI->getSupportedServiceNames(); - - aSupported.realloc( aSupported.getLength() + 1 ); - aSupported[ aSupported.getLength() - 1 ] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.Shape" ) ); - return aSupported; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/srchuno.cxx b/sc/source/ui/unoobj/srchuno.cxx deleted file mode 100644 index c5cea9d4e..000000000 --- a/sc/source/ui/unoobj/srchuno.cxx +++ /dev/null @@ -1,272 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include "scitems.hxx" -#include <svl/srchitem.hxx> -#include <vcl/svapp.hxx> -#include <osl/mutex.hxx> -#include <comphelper/servicehelper.hxx> - -#include "srchuno.hxx" -#include "docsh.hxx" -#include "undoblk.hxx" -#include "hints.hxx" -#include "markdata.hxx" -#include "miscuno.hxx" -#include "unonames.hxx" - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -//! SearchWords sucht in ganzen Zellen - umbenennen ??? - -// SfxItemPropertyMapEntry nur fuer GetPropertySetInfo - -const SfxItemPropertyMapEntry* lcl_GetSearchPropertyMap() -{ - static SfxItemPropertyMapEntry aSearchPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_SRCHBACK), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SRCHBYROW), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SRCHCASE), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SRCHREGEXP), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SRCHSIM), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SRCHSIMADD), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SRCHSIMEX), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SRCHSIMREL), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SRCHSIMREM), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SRCHSTYLES), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SRCHTYPE), 0, &getCppuType((sal_Int16*)0), 0, 0}, // enum TableSearch ist weg - {MAP_CHAR_LEN(SC_UNO_SRCHWORDS), 0, &getBooleanCppuType(), 0, 0}, - {0,0,0,0,0,0} - }; - return aSearchPropertyMap_Impl; -} - -//------------------------------------------------------------------------ - -#define SCSEARCHDESCRIPTOR_SERVICE "com.sun.star.util.SearchDescriptor" -#define SCREPLACEDESCRIPTOR_SERVICE "com.sun.star.util.ReplaceDescriptor" - -//------------------------------------------------------------------------ - -ScCellSearchObj::ScCellSearchObj() : - aPropSet(lcl_GetSearchPropertyMap()) -{ - pSearchItem = new SvxSearchItem( SCITEM_SEARCHDATA ); - // Defaults: - pSearchItem->SetWordOnly(false); - pSearchItem->SetExact(false); - pSearchItem->SetMatchFullHalfWidthForms(false); - pSearchItem->SetUseAsianOptions(false); // or all asian bits would have to be handled - pSearchItem->SetBackward(false); - pSearchItem->SetSelection(false); - pSearchItem->SetRegExp(false); - pSearchItem->SetPattern(false); - pSearchItem->SetLevenshtein(false); - pSearchItem->SetLEVRelaxed(false); - pSearchItem->SetLEVOther(2); - pSearchItem->SetLEVShorter(2); - pSearchItem->SetLEVLonger(2); - // Calc-Flags - pSearchItem->SetRowDirection(false); - pSearchItem->SetCellType(SVX_SEARCHIN_FORMULA); - - // Selection-Flag wird beim Aufruf gesetzt -} - -ScCellSearchObj::~ScCellSearchObj() -{ - delete pSearchItem; -} - -// XSearchDescriptor - -rtl::OUString SAL_CALL ScCellSearchObj::getSearchString() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return pSearchItem->GetSearchString(); -} - -void SAL_CALL ScCellSearchObj::setSearchString( const rtl::OUString& aString ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - pSearchItem->SetSearchString( aString ); -} - -// XReplaceDescriptor - -rtl::OUString SAL_CALL ScCellSearchObj::getReplaceString() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return pSearchItem->GetReplaceString(); -} - -void SAL_CALL ScCellSearchObj::setReplaceString( const rtl::OUString& aReplaceString ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - pSearchItem->SetReplaceString( aReplaceString ); -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScCellSearchObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScCellSearchObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aPropertyName); - - if (aString.EqualsAscii( SC_UNO_SRCHBACK )) pSearchItem->SetBackward( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHBYROW )) pSearchItem->SetRowDirection( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHCASE )) pSearchItem->SetExact( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHREGEXP )) pSearchItem->SetRegExp( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHSIM )) pSearchItem->SetLevenshtein( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHSIMREL )) pSearchItem->SetLEVRelaxed( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHSTYLES )) pSearchItem->SetPattern( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHWORDS )) pSearchItem->SetWordOnly( ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHSIMADD )) pSearchItem->SetLEVLonger( ScUnoHelpFunctions::GetInt16FromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHSIMEX )) pSearchItem->SetLEVOther( ScUnoHelpFunctions::GetInt16FromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHSIMREM )) pSearchItem->SetLEVShorter( ScUnoHelpFunctions::GetInt16FromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHTYPE )) pSearchItem->SetCellType( ScUnoHelpFunctions::GetInt16FromAny( aValue ) ); - else if (aString.EqualsAscii( SC_UNO_SRCHFILTERED )) pSearchItem->SetSearchFiltered( ScUnoHelpFunctions::GetBoolFromAny(aValue) ); -} - -uno::Any SAL_CALL ScCellSearchObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aPropertyName); - uno::Any aRet; - - if (aString.EqualsAscii( SC_UNO_SRCHBACK )) ScUnoHelpFunctions::SetBoolInAny( aRet, pSearchItem->GetBackward() ); - else if (aString.EqualsAscii( SC_UNO_SRCHBYROW )) ScUnoHelpFunctions::SetBoolInAny( aRet, pSearchItem->GetRowDirection() ); - else if (aString.EqualsAscii( SC_UNO_SRCHCASE )) ScUnoHelpFunctions::SetBoolInAny( aRet, pSearchItem->GetExact() ); - else if (aString.EqualsAscii( SC_UNO_SRCHREGEXP )) ScUnoHelpFunctions::SetBoolInAny( aRet, pSearchItem->GetRegExp() ); - else if (aString.EqualsAscii( SC_UNO_SRCHSIM )) ScUnoHelpFunctions::SetBoolInAny( aRet, pSearchItem->IsLevenshtein() ); - else if (aString.EqualsAscii( SC_UNO_SRCHSIMREL )) ScUnoHelpFunctions::SetBoolInAny( aRet, pSearchItem->IsLEVRelaxed() ); - else if (aString.EqualsAscii( SC_UNO_SRCHSTYLES )) ScUnoHelpFunctions::SetBoolInAny( aRet, pSearchItem->GetPattern() ); - else if (aString.EqualsAscii( SC_UNO_SRCHWORDS )) ScUnoHelpFunctions::SetBoolInAny( aRet, pSearchItem->GetWordOnly() ); - else if (aString.EqualsAscii( SC_UNO_SRCHSIMADD )) aRet <<= (sal_Int16) pSearchItem->GetLEVLonger(); - else if (aString.EqualsAscii( SC_UNO_SRCHSIMEX )) aRet <<= (sal_Int16) pSearchItem->GetLEVOther(); - else if (aString.EqualsAscii( SC_UNO_SRCHSIMREM )) aRet <<= (sal_Int16) pSearchItem->GetLEVShorter(); - else if (aString.EqualsAscii( SC_UNO_SRCHTYPE )) aRet <<= (sal_Int16) pSearchItem->GetCellType(); - else if (aString.EqualsAscii( SC_UNO_SRCHFILTERED )) ScUnoHelpFunctions::SetBoolInAny( aRet, pSearchItem->IsSearchFiltered() ); - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScCellSearchObj ) - -// XServiceInfo - -rtl::OUString SAL_CALL ScCellSearchObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScCellSearchObj" )); -} - -sal_Bool SAL_CALL ScCellSearchObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr(rServiceName); - return aServiceStr.EqualsAscii( SCSEARCHDESCRIPTOR_SERVICE ) || - aServiceStr.EqualsAscii( SCREPLACEDESCRIPTOR_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScCellSearchObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(2); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSEARCHDESCRIPTOR_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCREPLACEDESCRIPTOR_SERVICE )); - return aRet; -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScCellSearchObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScCellSearchObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScCellSearchObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScCellSearchObj::getUnoTunnelId() -{ - return theScCellSearchObjUnoTunnelId::get().getSeq(); -} - -ScCellSearchObj* ScCellSearchObj::getImplementation( - const uno::Reference<util::XSearchDescriptor> xObj ) -{ - ScCellSearchObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScCellSearchObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - - -//------------------------------------------------------------------------ - - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/styleuno.cxx b/sc/source/ui/unoobj/styleuno.cxx deleted file mode 100644 index d3abb27c9..000000000 --- a/sc/source/ui/unoobj/styleuno.cxx +++ /dev/null @@ -1,2125 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include "scitems.hxx" -#include <editeng/memberids.hrc> -#include <svx/algitem.hxx> -#include <editeng/boxitem.hxx> -#include <editeng/langitem.hxx> -#include <editeng/numitem.hxx> -#include <svx/pageitem.hxx> -#include <editeng/pbinitem.hxx> -#include <svx/unomid.hxx> -#include <editeng/unonrule.hxx> -#include <sfx2/bindings.hxx> -#include <sfx2/printer.hxx> -#include <vcl/virdev.hxx> -#include <vcl/svapp.hxx> -#include <svl/itempool.hxx> -#include <svl/itemset.hxx> -#include <svl/intitem.hxx> -#include <svl/zformat.hxx> - -#include <com/sun/star/table/BorderLine.hpp> -#include <com/sun/star/table/CellVertJustify2.hpp> -#include <com/sun/star/table/TableBorder.hpp> -#include <com/sun/star/table/ShadowFormat.hpp> -#include <com/sun/star/table/CellHoriJustify.hpp> -#include <com/sun/star/table/CellOrientation.hpp> -#include <com/sun/star/style/PageStyleLayout.hpp> -#include <com/sun/star/style/GraphicLocation.hpp> -#include <com/sun/star/sheet/XHeaderFooterContent.hpp> -#include <com/sun/star/util/CellProtection.hpp> -#include <com/sun/star/awt/FontSlant.hpp> -#include <com/sun/star/awt/Size.hpp> -#include <com/sun/star/lang/Locale.hpp> -#include <com/sun/star/beans/PropertyAttribute.hpp> - -#include "styleuno.hxx" -#include "docsh.hxx" -#include "attrib.hxx" -#include "stlpool.hxx" -#include "docpool.hxx" -#include "miscuno.hxx" -#include "convuno.hxx" -#include "tablink.hxx" -#include "unonames.hxx" -#include "unowids.hxx" -#include "globstr.hrc" -#include "cellsuno.hxx" - -using namespace ::com::sun::star; - -//------------------------------------------------------------------------ - -const SfxItemPropertySet* lcl_GetCellStyleSet() -{ - static SfxItemPropertyMapEntry aCellStyleMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNONAME_ASIANVERT),ATTR_VERTICAL_ASIAN,&getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_BOTTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CELLBACK), ATTR_BACKGROUND, &::getCppuType((const sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CELLPRO), ATTR_PROTECTION, &::getCppuType((const util::CellProtection*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCOLOR), ATTR_FONT_COLOR, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_COUTL), ATTR_FONT_CONTOUR, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CCROSS), ATTR_FONT_CROSSEDOUT,&::getBooleanCppuType(), 0, MID_CROSSED_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CEMPHAS), ATTR_FONT_EMPHASISMARK,&getCppuType((sal_Int16*)0), 0, MID_EMPHASIS }, - {MAP_CHAR_LEN(SC_UNONAME_CFONT), ATTR_FONT, &::getCppuType((const sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFCHARS), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFCHARS), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFCHARS), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_CHAR_SET }, - {MAP_CHAR_LEN(SC_UNONAME_CFFAMIL), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFFAMIL), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFFAMIL), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_FAMILY }, - {MAP_CHAR_LEN(SC_UNONAME_CFNAME), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFNAME), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFNAME), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_FAMILY_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CFPITCH), ATTR_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFPITCH), ATTR_CJK_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFPITCH), ATTR_CTL_FONT, &getCppuType((sal_Int16*)0), 0, MID_FONT_PITCH }, - {MAP_CHAR_LEN(SC_UNONAME_CFSTYLE), ATTR_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CJK_CFSTYLE), ATTR_CJK_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNO_CTL_CFSTYLE), ATTR_CTL_FONT, &getCppuType((rtl::OUString*)0), 0, MID_FONT_STYLE_NAME }, - {MAP_CHAR_LEN(SC_UNONAME_CHEIGHT), ATTR_FONT_HEIGHT, &::getCppuType((const float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CJK_CHEIGHT), ATTR_CJK_FONT_HEIGHT,&::getCppuType((const float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_CTL_CHEIGHT), ATTR_CTL_FONT_HEIGHT,&::getCppuType((const float*)0), 0, MID_FONTHEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_CLOCAL), ATTR_FONT_LANGUAGE, &::getCppuType((const lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CLOCAL), ATTR_CJK_FONT_LANGUAGE,&::getCppuType((const lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CLOCAL), ATTR_CTL_FONT_LANGUAGE,&::getCppuType((const lang::Locale*)0), 0, MID_LANG_LOCALE }, - {MAP_CHAR_LEN(SC_UNONAME_COVER), ATTR_FONT_OVERLINE, &::getCppuType((const sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLCOL), ATTR_FONT_OVERLINE, &getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_COVRLHAS), ATTR_FONT_OVERLINE, &getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CPOST), ATTR_FONT_POSTURE, &::getCppuType((const awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CJK_CPOST), ATTR_CJK_FONT_POSTURE,&::getCppuType((const awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNO_CTL_CPOST), ATTR_CTL_FONT_POSTURE,&::getCppuType((const awt::FontSlant*)0), 0, MID_POSTURE }, - {MAP_CHAR_LEN(SC_UNONAME_CRELIEF), ATTR_FONT_RELIEF, &getCppuType((sal_Int16*)0), 0, MID_RELIEF }, - {MAP_CHAR_LEN(SC_UNONAME_CSHADD), ATTR_FONT_SHADOWED, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CSTRIKE), ATTR_FONT_CROSSEDOUT,&getCppuType((sal_Int16*)0), 0, MID_CROSS_OUT }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDER), ATTR_FONT_UNDERLINE,&::getCppuType((const sal_Int16*)0), 0, MID_TL_STYLE }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLCOL), ATTR_FONT_UNDERLINE,&getCppuType((sal_Int32*)0), 0, MID_TL_COLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CUNDLHAS), ATTR_FONT_UNDERLINE,&getBooleanCppuType(), 0, MID_TL_HASCOLOR }, - {MAP_CHAR_LEN(SC_UNONAME_CWEIGHT), ATTR_FONT_WEIGHT, &::getCppuType((const float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CJK_CWEIGHT), ATTR_CJK_FONT_WEIGHT,&::getCppuType((const float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNO_CTL_CWEIGHT), ATTR_CTL_FONT_WEIGHT,&::getCppuType((const float*)0), 0, MID_WEIGHT }, - {MAP_CHAR_LEN(SC_UNONAME_CWORDMOD), ATTR_FONT_WORDLINE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_BLTR), ATTR_BORDER_BLTR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_DIAGONAL_TLBR), ATTR_BORDER_TLBR, &::getCppuType((const table::BorderLine*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_DISPNAME), SC_WID_UNO_DISPNAME,&::getCppuType((rtl::OUString*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS), ATTR_HOR_JUSTIFY, &::getCppuType((const table::CellHoriJustify*)0), 0, MID_HORJUST_HORJUST }, - {MAP_CHAR_LEN(SC_UNONAME_CELLHJUS_METHOD), ATTR_HOR_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLTRAN), ATTR_BACKGROUND, &::getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(SC_UNONAME_WRAP), ATTR_LINEBREAK, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_LEFTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_NUMFMT), ATTR_VALUE_FORMAT, &::getCppuType((const sal_Int32*)0), 0, 0 }, -// {MAP_CHAR_LEN(SC_UNONAME_NUMRULES), SC_WID_UNO_NUMRULES,&getCppuType((const uno::Reference<container::XIndexReplace>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLORI), ATTR_STACKED, &::getCppuType((const table::CellOrientation*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PADJUST), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PBMARGIN), ATTR_MARGIN, &::getCppuType((const sal_Int32*)0), 0, MID_MARGIN_LO_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PINDENT), ATTR_INDENT, &::getCppuType((const sal_Int16*)0), 0, 0 }, //! CONVERT_TWIPS - {MAP_CHAR_LEN(SC_UNONAME_PISCHDIST),ATTR_SCRIPTSPACE, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISFORBID),ATTR_FORBIDDEN_RULES,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHANG), ATTR_HANGPUNCTUATION,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PISHYPHEN),ATTR_HYPHENATE, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_PLASTADJ), ATTR_HOR_JUSTIFY, &::getCppuType((const sal_Int16*)0), 0, MID_HORJUST_ADJUST }, - {MAP_CHAR_LEN(SC_UNONAME_PLMARGIN), ATTR_MARGIN, &::getCppuType((const sal_Int32*)0), 0, MID_MARGIN_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PRMARGIN), ATTR_MARGIN, &::getCppuType((const sal_Int32*)0), 0, MID_MARGIN_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_PTMARGIN), ATTR_MARGIN, &::getCppuType((const sal_Int32*)0), 0, MID_MARGIN_UP_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_RIGHTBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_ROTANG), ATTR_ROTATE_VALUE, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_ROTREF), ATTR_ROTATE_MODE, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_SHADOW), ATTR_SHADOW, &::getCppuType((const table::ShadowFormat*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_SHRINK_TO_FIT), ATTR_SHRINKTOFIT, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_TBLBORD), SC_WID_UNO_TBLBORD, &::getCppuType((const table::TableBorder*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_TOPBORDER),ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_USERDEF), ATTR_USERDEF, &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS), ATTR_VER_JUSTIFY, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_CELLVJUS_METHOD), ATTR_VER_JUSTIFY_METHOD, &::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_WRITING), ATTR_WRITINGDIR, &getCppuType((sal_Int16*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aCellStyleSet_Impl( aCellStyleMap_Impl ); - return &aCellStyleSet_Impl; -} - -// Map mit allen Seitenattributen, incl. Kopf-/Fusszeilenattribute - -const SfxItemPropertySet * lcl_GetPageStyleSet() -{ - static SfxItemPropertyMapEntry aPageStyleMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_PAGE_BACKCOLOR), ATTR_BACKGROUND, &::getCppuType((const sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNO_PAGE_GRAPHICFILT), ATTR_BACKGROUND, &::getCppuType((const ::rtl::OUString*)0), 0, MID_GRAPHIC_FILTER }, - {MAP_CHAR_LEN(SC_UNO_PAGE_GRAPHICLOC), ATTR_BACKGROUND, &::getCppuType((const style::GraphicLocation*)0), 0, MID_GRAPHIC_POSITION }, - {MAP_CHAR_LEN(SC_UNO_PAGE_GRAPHICURL), ATTR_BACKGROUND, &::getCppuType((const ::rtl::OUString*)0), 0, MID_GRAPHIC_URL }, - {MAP_CHAR_LEN(SC_UNO_PAGE_BACKTRANS), ATTR_BACKGROUND, &::getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_BACKCOLOR), ATTR_BACKGROUND, &::getCppuType((const sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNO_PAGE_BORDERDIST), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_BOTTBORDER), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_BOTTBRDDIST), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, BOTTOM_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_BOTTMARGIN), ATTR_ULSPACE, &::getCppuType((const sal_Int32*)0), 0, MID_LO_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_CENTERHOR), ATTR_PAGE_HORCENTER,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_CENTERVER), ATTR_PAGE_VERCENTER,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_DISPNAME), SC_WID_UNO_DISPNAME,&::getCppuType((rtl::OUString*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FIRSTPAGE), ATTR_PAGE_FIRSTPAGENO,&::getCppuType((const sal_Int16*)0), 0, 0 }, -// - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBACKCOL), SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRGRFFILT), SC_WID_UNO_FOOTERSET,&::getCppuType((const ::rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRGRFLOC), SC_WID_UNO_FOOTERSET,&::getCppuType((const style::GraphicLocation*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRGRFURL), SC_WID_UNO_FOOTERSET,&::getCppuType((const ::rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBACKTRAN), SC_WID_UNO_FOOTERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_FTRBACKCOL), SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBODYDIST), SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBRDDIST), SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBOTTBOR), SC_WID_UNO_FOOTERSET,&::getCppuType((const table::BorderLine*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBOTTBDIS), SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_FTRDYNAMIC), SC_WID_UNO_FOOTERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRHEIGHT), SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRDYNAMIC), SC_WID_UNO_FOOTERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRON), SC_WID_UNO_FOOTERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRSHARED), SC_WID_UNO_FOOTERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRLEFTBOR), SC_WID_UNO_FOOTERSET,&::getCppuType((const table::BorderLine*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRLEFTBDIS), SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRLEFTMAR), SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_FTRON), SC_WID_UNO_FOOTERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRRIGHTBOR), SC_WID_UNO_FOOTERSET,&::getCppuType((const table::BorderLine*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRRIGHTBDIS),SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRRIGHTMAR), SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRSHADOW), SC_WID_UNO_FOOTERSET,&::getCppuType((const table::ShadowFormat*)0), 0, 0 }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_FTRSHARED), SC_WID_UNO_FOOTERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRTOPBOR), SC_WID_UNO_FOOTERSET,&::getCppuType((const table::BorderLine*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRTOPBDIS), SC_WID_UNO_FOOTERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, -// - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBACKCOL), SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRGRFFILT), SC_WID_UNO_HEADERSET,&::getCppuType((const ::rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRGRFLOC), SC_WID_UNO_HEADERSET,&::getCppuType((const style::GraphicLocation*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRGRFURL), SC_WID_UNO_HEADERSET,&::getCppuType((const ::rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBACKTRAN), SC_WID_UNO_HEADERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_HDRBACKCOL), SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBODYDIST), SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBRDDIST), SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBOTTBOR), SC_WID_UNO_HEADERSET,&::getCppuType((const table::BorderLine*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBOTTBDIS), SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_HDRDYNAMIC), SC_WID_UNO_HEADERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRHEIGHT), SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRDYNAMIC), SC_WID_UNO_HEADERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRON), SC_WID_UNO_HEADERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRSHARED), SC_WID_UNO_HEADERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRLEFTBOR), SC_WID_UNO_HEADERSET,&::getCppuType((const table::BorderLine*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRLEFTBDIS), SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRLEFTMAR), SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_HDRON), SC_WID_UNO_HEADERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRRIGHTBOR), SC_WID_UNO_HEADERSET,&::getCppuType((const table::BorderLine*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRRIGHTBDIS),SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRRIGHTMAR), SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRSHADOW), SC_WID_UNO_HEADERSET,&::getCppuType((const table::ShadowFormat*)0), 0, 0 }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_HDRSHARED), SC_WID_UNO_HEADERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRTOPBOR), SC_WID_UNO_HEADERSET,&::getCppuType((const table::BorderLine*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRTOPBDIS), SC_WID_UNO_HEADERSET,&::getCppuType((const sal_Int32*)0), 0, 0 }, -// - {MAP_CHAR_LEN(SC_UNO_PAGE_HEIGHT), ATTR_PAGE_SIZE, &::getCppuType((const sal_Int32*)0), 0, MID_SIZE_HEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_BACKTRANS), ATTR_BACKGROUND, &::getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(SC_UNO_PAGE_LANDSCAPE), ATTR_PAGE, &::getBooleanCppuType(), 0, MID_PAGE_ORIENTATION }, - {MAP_CHAR_LEN(SC_UNO_PAGE_LEFTBORDER), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_LEFTBRDDIST), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, LEFT_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_LEFTMARGIN), ATTR_LRSPACE, &::getCppuType((const sal_Int32*)0), 0, MID_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_LEFTFTRCONT), ATTR_PAGE_FOOTERLEFT,&::getCppuType((const uno::Reference< sheet::XHeaderFooterContent >*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_LEFTHDRCONT), ATTR_PAGE_HEADERLEFT,&::getCppuType((const uno::Reference< sheet::XHeaderFooterContent >*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_NUMBERTYPE), ATTR_PAGE, &::getCppuType((const sal_Int16*)0), 0, MID_PAGE_NUMTYPE }, - {MAP_CHAR_LEN(SC_UNO_PAGE_SCALEVAL), ATTR_PAGE_SCALE, &::getCppuType((const sal_Int16*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_SYTLELAYOUT), ATTR_PAGE, &::getCppuType((const style::PageStyleLayout*)0), 0, MID_PAGE_LAYOUT }, - {MAP_CHAR_LEN(SC_UNO_PAGE_PRINTANNOT), ATTR_PAGE_NOTES, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_PRINTCHARTS), ATTR_PAGE_CHARTS, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_PRINTDOWN), ATTR_PAGE_TOPDOWN, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_PRINTDRAW), ATTR_PAGE_DRAWINGS, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_PRINTFORMUL), ATTR_PAGE_FORMULAS, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_PRINTGRID), ATTR_PAGE_GRID, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_PRINTHEADER), ATTR_PAGE_HEADERS, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_PRINTOBJS), ATTR_PAGE_OBJECTS, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_PRINTZERO), ATTR_PAGE_NULLVALS, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_PAPERTRAY), ATTR_PAGE_PAPERBIN, &::getCppuType((const ::rtl::OUString*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_RIGHTBORDER), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_RIGHTBRDDIST),ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, RIGHT_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_RIGHTMARGIN), ATTR_LRSPACE, &::getCppuType((const sal_Int32*)0), 0, MID_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_RIGHTFTRCON), ATTR_PAGE_FOOTERRIGHT,&::getCppuType((const uno::Reference< sheet::XHeaderFooterContent >*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_RIGHTHDRCON), ATTR_PAGE_HEADERRIGHT,&::getCppuType((const uno::Reference< sheet::XHeaderFooterContent >*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_SCALETOPAG), ATTR_PAGE_SCALETOPAGES,&::getCppuType((const sal_Int16*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_SCALETOX), ATTR_PAGE_SCALETO, &::getCppuType((const sal_Int16*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_SCALETOY), ATTR_PAGE_SCALETO, &::getCppuType((const sal_Int16*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_SHADOWFORM), ATTR_SHADOW, &::getCppuType((const table::ShadowFormat*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_SIZE), ATTR_PAGE_SIZE, &::getCppuType((const awt::Size*)0), 0, MID_SIZE_SIZE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_TOPBORDER), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_TOPBRDDIST), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, TOP_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_TOPMARGIN), ATTR_ULSPACE, &::getCppuType((const sal_Int32*)0), 0, MID_UP_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_FTRBACKTRAN),SC_WID_UNO_FOOTERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_HDRBACKTRAN),SC_WID_UNO_HEADERSET,&::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNONAME_USERDEF), ATTR_USERDEF, &getCppuType((uno::Reference<container::XNameContainer>*)0), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_WIDTH), ATTR_PAGE_SIZE, &::getCppuType((const sal_Int32*)0), 0, MID_SIZE_WIDTH | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNONAME_WRITING), ATTR_WRITINGDIR, &getCppuType((sal_Int16*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - static SfxItemPropertySet aPageStyleSet_Impl( aPageStyleMap_Impl ); - return &aPageStyleSet_Impl; -} - -// Map mit Inhalten des Header-Item-Sets - -const SfxItemPropertyMap* lcl_GetHeaderStyleMap() -{ - static SfxItemPropertyMapEntry aHeaderStyleMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBACKCOL), ATTR_BACKGROUND, &::getCppuType((const sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRGRFFILT), ATTR_BACKGROUND, &::getCppuType((const ::rtl::OUString*)0), 0, MID_GRAPHIC_FILTER }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRGRFLOC), ATTR_BACKGROUND, &::getCppuType((const style::GraphicLocation*)0), 0, MID_GRAPHIC_POSITION }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRGRFURL), ATTR_BACKGROUND, &::getCppuType((const ::rtl::OUString*)0), 0, MID_GRAPHIC_URL }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBACKTRAN), ATTR_BACKGROUND, &::getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_HDRBACKCOL), ATTR_BACKGROUND, &::getCppuType((const sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBODYDIST), ATTR_ULSPACE, &::getCppuType((const sal_Int32*)0), 0, MID_LO_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBRDDIST), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBOTTBOR), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRBOTTBDIS), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, BOTTOM_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_HDRDYNAMIC), ATTR_PAGE_DYNAMIC, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRHEIGHT), ATTR_PAGE_SIZE, &::getCppuType((const sal_Int32*)0), 0, MID_SIZE_HEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRDYNAMIC), ATTR_PAGE_DYNAMIC, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRON), ATTR_PAGE_ON, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRSHARED), ATTR_PAGE_SHARED, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRLEFTBOR), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRLEFTBDIS), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, LEFT_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRLEFTMAR), ATTR_LRSPACE, &::getCppuType((const sal_Int32*)0), 0, MID_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_HDRON), ATTR_PAGE_ON, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRRIGHTBOR), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRRIGHTBDIS),ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, RIGHT_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRRIGHTMAR), ATTR_LRSPACE, &::getCppuType((const sal_Int32*)0), 0, MID_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRSHADOW), ATTR_SHADOW, &::getCppuType((const table::ShadowFormat*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_HDRSHARED), ATTR_PAGE_SHARED, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRTOPBOR), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_HDRTOPBDIS), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, TOP_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_HDRBACKTRAN),ATTR_BACKGROUND, &::getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {0,0,0,0,0,0} - }; - static SfxItemPropertyMap aHeaderStyleMap( aHeaderStyleMap_Impl ); - return &aHeaderStyleMap; -} - -// Map mit Inhalten des Footer-Item-Sets - -const SfxItemPropertyMap* lcl_GetFooterStyleMap() -{ - static SfxItemPropertyMapEntry aFooterStyleMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBACKCOL), ATTR_BACKGROUND, &::getCppuType((const sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRGRFFILT), ATTR_BACKGROUND, &::getCppuType((const ::rtl::OUString*)0), 0, MID_GRAPHIC_FILTER }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRGRFLOC), ATTR_BACKGROUND, &::getCppuType((const style::GraphicLocation*)0), 0, MID_GRAPHIC_POSITION }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRGRFURL), ATTR_BACKGROUND, &::getCppuType((const ::rtl::OUString*)0), 0, MID_GRAPHIC_URL }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBACKTRAN), ATTR_BACKGROUND, &::getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_FTRBACKCOL), ATTR_BACKGROUND, &::getCppuType((const sal_Int32*)0), 0, MID_BACK_COLOR }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBODYDIST), ATTR_ULSPACE, &::getCppuType((const sal_Int32*)0), 0, MID_UP_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBRDDIST), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBOTTBOR), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, BOTTOM_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRBOTTBDIS), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, BOTTOM_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_FTRDYNAMIC), ATTR_PAGE_DYNAMIC, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRHEIGHT), ATTR_PAGE_SIZE, &::getCppuType((const sal_Int32*)0), 0, MID_SIZE_HEIGHT | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRDYNAMIC), ATTR_PAGE_DYNAMIC, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRON), ATTR_PAGE_ON, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRSHARED), ATTR_PAGE_SHARED, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRLEFTBOR), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, LEFT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRLEFTBDIS), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, LEFT_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRLEFTMAR), ATTR_LRSPACE, &::getCppuType((const sal_Int32*)0), 0, MID_L_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_FTRON), ATTR_PAGE_ON, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRRIGHTBOR), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, RIGHT_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRRIGHTBDIS),ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, RIGHT_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRRIGHTMAR), ATTR_LRSPACE, &::getCppuType((const sal_Int32*)0), 0, MID_R_MARGIN | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRSHADOW), ATTR_SHADOW, &::getCppuType((const table::ShadowFormat*)0), 0, 0 | CONVERT_TWIPS }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_FTRSHARED), ATTR_PAGE_SHARED, &::getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRTOPBOR), ATTR_BORDER, &::getCppuType((const table::BorderLine*)0), 0, TOP_BORDER | CONVERT_TWIPS }, - {MAP_CHAR_LEN(SC_UNO_PAGE_FTRTOPBDIS), ATTR_BORDER, &::getCppuType((const sal_Int32*)0), 0, TOP_BORDER_DISTANCE | CONVERT_TWIPS }, - {MAP_CHAR_LEN(OLD_UNO_PAGE_FTRBACKTRAN),ATTR_BACKGROUND, &::getBooleanCppuType(), 0, MID_GRAPHIC_TRANSPARENT }, - {0,0,0,0,0,0} - }; - static SfxItemPropertyMap aFooterStyleMap( aFooterStyleMap_Impl ); - return &aFooterStyleMap; -} - - -//------------------------------------------------------------------------ - -// Index-Access auf die Style-Typen: 0 = Cell, 1 = Page - -#define SC_STYLE_FAMILY_COUNT 2 - -#define SC_FAMILYNAME_CELL "CellStyles" -#define SC_FAMILYNAME_PAGE "PageStyles" - -static sal_uInt16 aStyleFamilyTypes[SC_STYLE_FAMILY_COUNT] = { SFX_STYLE_FAMILY_PARA, SFX_STYLE_FAMILY_PAGE }; - -//------------------------------------------------------------------------ - -//! diese Funktionen in einen allgemeinen Header verschieben -inline long TwipsToHMM(long nTwips) { return (nTwips * 127 + 36) / 72; } -inline long HMMToTwips(long nHMM) { return (nHMM * 72 + 63) / 127; } - -//------------------------------------------------------------------------ - -#define SCSTYLE_SERVICE "com.sun.star.style.Style" -#define SCCELLSTYLE_SERVICE "com.sun.star.style.CellStyle" -#define SCPAGESTYLE_SERVICE "com.sun.star.style.PageStyle" - -SC_SIMPLE_SERVICE_INFO( ScStyleFamiliesObj, "ScStyleFamiliesObj", "com.sun.star.style.StyleFamilies" ) -SC_SIMPLE_SERVICE_INFO( ScStyleFamilyObj, "ScStyleFamilyObj", "com.sun.star.style.StyleFamily" ) - -//------------------------------------------------------------------------ - -#define SC_PAPERBIN_DEFAULTNAME "[From printer settings]" - -//------------------------------------------------------------------------ - -// conversion programmatic <-> display (visible) name -// currently, the core always has the visible names -// the api is required to use programmatic names for default styles -// these programmatic names must never change! - -#define SC_STYLE_PROG_STANDARD "Default" -#define SC_STYLE_PROG_RESULT "Result" -#define SC_STYLE_PROG_RESULT1 "Result2" -#define SC_STYLE_PROG_HEADLINE "Heading" -#define SC_STYLE_PROG_HEADLINE1 "Heading1" -#define SC_STYLE_PROG_REPORT "Report" - -struct ScDisplayNameMap -{ - String aDispName; - String aProgName; -}; - -const ScDisplayNameMap* lcl_GetStyleNameMap( sal_uInt16 nType ) -{ - if ( nType == SFX_STYLE_FAMILY_PARA ) - { - static sal_Bool bCellMapFilled = false; - static ScDisplayNameMap aCellMap[6]; - if ( !bCellMapFilled ) - { - aCellMap[0].aDispName = ScGlobal::GetRscString( STR_STYLENAME_STANDARD ); - aCellMap[0].aProgName = String::CreateFromAscii( SC_STYLE_PROG_STANDARD ); - - aCellMap[1].aDispName = ScGlobal::GetRscString( STR_STYLENAME_RESULT ); - aCellMap[1].aProgName = String::CreateFromAscii( SC_STYLE_PROG_RESULT ); - - aCellMap[2].aDispName = ScGlobal::GetRscString( STR_STYLENAME_RESULT1 ); - aCellMap[2].aProgName = String::CreateFromAscii( SC_STYLE_PROG_RESULT1 ); - - aCellMap[3].aDispName = ScGlobal::GetRscString( STR_STYLENAME_HEADLINE ); - aCellMap[3].aProgName = String::CreateFromAscii( SC_STYLE_PROG_HEADLINE ); - - aCellMap[4].aDispName = ScGlobal::GetRscString( STR_STYLENAME_HEADLINE1 ); - aCellMap[4].aProgName = String::CreateFromAscii( SC_STYLE_PROG_HEADLINE1 ); - - // last entry remains empty - - bCellMapFilled = sal_True; - } - return aCellMap; - } - else if ( nType == SFX_STYLE_FAMILY_PAGE ) - { - static sal_Bool bPageMapFilled = false; - static ScDisplayNameMap aPageMap[3]; - if ( !bPageMapFilled ) - { - aPageMap[0].aDispName = ScGlobal::GetRscString( STR_STYLENAME_STANDARD ); - aPageMap[0].aProgName = String::CreateFromAscii( SC_STYLE_PROG_STANDARD ); - - aPageMap[1].aDispName = ScGlobal::GetRscString( STR_STYLENAME_REPORT ); - aPageMap[1].aProgName = String::CreateFromAscii( SC_STYLE_PROG_REPORT ); - - // last entry remains empty - - bPageMapFilled = sal_True; - } - return aPageMap; - } - OSL_FAIL("invalid family"); - return NULL; -} - -// programmatic name suffix for display names that match other programmatic names -// is " (user)" including a space - -#define SC_SUFFIX_USER " (user)" -#define SC_SUFFIX_USER_LEN 7 - -sal_Bool lcl_EndsWithUser( const String& rString ) -{ - const sal_Unicode *pChar = rString.GetBuffer(); - xub_StrLen nLen = rString.Len(); - return nLen >= SC_SUFFIX_USER_LEN && - pChar[nLen-7] == ' ' && - pChar[nLen-6] == '(' && - pChar[nLen-5] == 'u' && - pChar[nLen-4] == 's' && - pChar[nLen-3] == 'e' && - pChar[nLen-2] == 'r' && - pChar[nLen-1] == ')'; -} - -String ScStyleNameConversion::DisplayToProgrammaticName( const String& rDispName, sal_uInt16 nType ) -{ - sal_Bool bDisplayIsProgrammatic = false; - - const ScDisplayNameMap* pNames = lcl_GetStyleNameMap( nType ); - if (pNames) - { - do - { - if (pNames->aDispName == rDispName) - return pNames->aProgName; - else if (pNames->aProgName == rDispName) - bDisplayIsProgrammatic = sal_True; // display name matches any programmatic name - } - while( (++pNames)->aDispName.Len() ); - } - - if ( bDisplayIsProgrammatic || lcl_EndsWithUser( rDispName ) ) - { - // add the (user) suffix if the display name matches any style's programmatic name - // or if it already contains the suffix - - String aRet(rDispName); - aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( SC_SUFFIX_USER ) ); - return aRet; - } - - return rDispName; -} - -String ScStyleNameConversion::ProgrammaticToDisplayName( const String& rProgName, sal_uInt16 nType ) -{ - if ( lcl_EndsWithUser( rProgName ) ) - { - // remove the (user) suffix, don't compare to map entries - return rProgName.Copy( 0, rProgName.Len() - SC_SUFFIX_USER_LEN ); - } - - const ScDisplayNameMap* pNames = lcl_GetStyleNameMap( nType ); - if (pNames) - { - do - { - if (pNames->aProgName == rProgName) - return pNames->aDispName; - } - while( (++pNames)->aDispName.Len() ); - } - return rProgName; -} - -//------------------------------------------------------------------------ - -sal_Bool lcl_AnyTabProtected( ScDocument& rDoc ) -{ - SCTAB nTabCount = rDoc.GetTableCount(); - for (SCTAB i=0; i<nTabCount; i++) - if (rDoc.IsTabProtected(i)) - return sal_True; - return false; -} - -//------------------------------------------------------------------------ - -ScStyleFamiliesObj::ScStyleFamiliesObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScStyleFamiliesObj::~ScStyleFamiliesObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScStyleFamiliesObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XStyleFamilies - -ScStyleFamilyObj*ScStyleFamiliesObj::GetObjectByType_Impl(sal_uInt16 nType) const -{ - if ( pDocShell ) - { - if ( nType == SFX_STYLE_FAMILY_PARA ) - return new ScStyleFamilyObj( pDocShell, SFX_STYLE_FAMILY_PARA ); - else if ( nType == SFX_STYLE_FAMILY_PAGE ) - return new ScStyleFamilyObj( pDocShell, SFX_STYLE_FAMILY_PAGE ); - } - OSL_FAIL("getStyleFamilyByType: keine DocShell oder falscher Typ"); - return NULL; -} - -ScStyleFamilyObj* ScStyleFamiliesObj::GetObjectByIndex_Impl(sal_uInt32 nIndex) const -{ - if ( nIndex < SC_STYLE_FAMILY_COUNT ) - return GetObjectByType_Impl(aStyleFamilyTypes[nIndex]); - - return NULL; // ungueltiger Index -} - -ScStyleFamilyObj* ScStyleFamiliesObj::GetObjectByName_Impl(const rtl::OUString& aName) const -{ - if ( pDocShell ) - { - String aNameStr( aName ); - if ( aNameStr.EqualsAscii( SC_FAMILYNAME_CELL ) ) - return new ScStyleFamilyObj( pDocShell, SFX_STYLE_FAMILY_PARA ); - else if ( aNameStr.EqualsAscii( SC_FAMILYNAME_PAGE ) ) - return new ScStyleFamilyObj( pDocShell, SFX_STYLE_FAMILY_PAGE ); - } - // no assertion - called directly from getByName - return NULL; -} - -// container::XIndexAccess - -sal_Int32 SAL_CALL ScStyleFamiliesObj::getCount() throw(uno::RuntimeException) -{ - return SC_STYLE_FAMILY_COUNT; -} - -uno::Any SAL_CALL ScStyleFamiliesObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< container::XNameContainer > xFamily(GetObjectByIndex_Impl(nIndex)); - if (xFamily.is()) - return uno::makeAny(xFamily); - else - throw lang::IndexOutOfBoundsException(); -// return uno::Any(); -} - -uno::Type SAL_CALL ScStyleFamiliesObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ::getCppuType((const uno::Reference< container::XNameContainer >*)0); // muss zu getByIndex passen -} - -sal_Bool SAL_CALL ScStyleFamiliesObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// container::XNameAccess - -uno::Any SAL_CALL ScStyleFamiliesObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< container::XNameContainer > xFamily(GetObjectByName_Impl(aName)); - if (xFamily.is()) - return uno::makeAny(xFamily); - else - throw container::NoSuchElementException(); -// return uno::Any(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScStyleFamiliesObj::getElementNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Sequence<rtl::OUString> aNames(SC_STYLE_FAMILY_COUNT); - rtl::OUString* pNames = aNames.getArray(); - pNames[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_FAMILYNAME_CELL )); - pNames[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_FAMILYNAME_PAGE )); - return aNames; -} - -sal_Bool SAL_CALL ScStyleFamiliesObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aNameStr( aName ); - return ( aNameStr.EqualsAscii( SC_FAMILYNAME_CELL ) || aNameStr.EqualsAscii( SC_FAMILYNAME_PAGE ) ); -} - -// style::XStyleLoader - -void SAL_CALL ScStyleFamiliesObj::loadStylesFromURL( const rtl::OUString& aURL, - const uno::Sequence<beans::PropertyValue>& aOptions ) - throw(io::IOException, uno::RuntimeException) -{ - //! use aOptions (like Writer) - //! set flag to disable filter option dialogs when importing - - String aFilter; // empty - detect - String aFiltOpt; - ScDocumentLoader aLoader( aURL, aFilter, aFiltOpt ); - - ScDocShell* pSource = aLoader.GetDocShell(); - if ( pSource && pDocShell ) - { - // collect options - - sal_Bool bLoadReplace = sal_True; // defaults - sal_Bool bLoadCellStyles = sal_True; - sal_Bool bLoadPageStyles = sal_True; - - const beans::PropertyValue* pPropArray = aOptions.getConstArray(); - long nPropCount = aOptions.getLength(); - for (long i = 0; i < nPropCount; i++) - { - const beans::PropertyValue& rProp = pPropArray[i]; - String aPropName(rProp.Name); - - if (aPropName.EqualsAscii( SC_UNONAME_OVERWSTL )) - bLoadReplace = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( SC_UNONAME_LOADCELL )) - bLoadCellStyles = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( SC_UNONAME_LOADPAGE )) - bLoadPageStyles = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - } - - pDocShell->LoadStylesArgs( *pSource, bLoadReplace, bLoadCellStyles, bLoadPageStyles ); - pDocShell->SetDocumentModified(); // paint is inside LoadStyles - } -} - -uno::Sequence<beans::PropertyValue> SAL_CALL ScStyleFamiliesObj::getStyleLoaderOptions() - throw(uno::RuntimeException) -{ - // return defaults for options (?) - - uno::Sequence<beans::PropertyValue> aSequence(3); - beans::PropertyValue* pArray = aSequence.getArray(); - - pArray[0].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_OVERWSTL )); - ScUnoHelpFunctions::SetBoolInAny( pArray[0].Value, true ); - - pArray[1].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_LOADCELL )); - ScUnoHelpFunctions::SetBoolInAny( pArray[1].Value, true ); - - pArray[2].Name = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_UNONAME_LOADPAGE )); - ScUnoHelpFunctions::SetBoolInAny( pArray[2].Value, true ); - - return aSequence; -} - -//------------------------------------------------------------------------ - -ScStyleFamilyObj::ScStyleFamilyObj(ScDocShell* pDocSh, SfxStyleFamily eFam) : - pDocShell( pDocSh ), - eFamily( eFam ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScStyleFamilyObj::~ScStyleFamilyObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScStyleFamilyObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -// XStyleFamily - -ScStyleObj* ScStyleFamilyObj::GetObjectByIndex_Impl(sal_uInt32 nIndex) -{ - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); - - SfxStyleSheetIterator aIter( pStylePool, eFamily ); - if ( nIndex < aIter.Count() ) - { - SfxStyleSheetBase* pStyle = aIter[(sal_uInt16)nIndex]; - if ( pStyle ) - { - return new ScStyleObj( pDocShell, eFamily, String (pStyle->GetName()) ); - } - } - } - return NULL; -} - -ScStyleObj* ScStyleFamilyObj::GetObjectByName_Impl(const rtl::OUString& aName) -{ - if ( pDocShell ) - { - String aString(aName); - - ScDocument* pDoc = pDocShell->GetDocument(); - ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); - if ( pStylePool->Find( aString, eFamily ) ) - return new ScStyleObj( pDocShell, eFamily, aString ); - } - return NULL; -} - -void SAL_CALL ScStyleFamilyObj::insertByName( const rtl::OUString& aName, const uno::Any& aElement ) - throw(lang::IllegalArgumentException, container::ElementExistException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bDone = false; - // Reflection muss nicht uno::XInterface sein, kann auch irgendein Interface sein... - uno::Reference< uno::XInterface > xInterface(aElement, uno::UNO_QUERY); - if ( xInterface.is() ) - { - ScStyleObj* pStyleObj = ScStyleObj::getImplementation( xInterface ); - if ( pStyleObj && pStyleObj->GetFamily() == eFamily && - !pStyleObj->IsInserted() ) // noch nicht eingefuegt? - { - String aNameStr(ScStyleNameConversion::ProgrammaticToDisplayName( aName, sal::static_int_cast<sal_uInt16>(eFamily) )); - - ScDocument* pDoc = pDocShell->GetDocument(); - ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); - - //! DocFunc-Funktion?? - //! Undo ????????????? - - if ( !pStylePool->Find( aNameStr, eFamily ) ) // noch nicht vorhanden - { - (void)pStylePool->Make( aNameStr, eFamily, SFXSTYLEBIT_USERDEF ); - - if ( eFamily == SFX_STYLE_FAMILY_PARA && !pDoc->IsImportingXML() ) - pDoc->GetPool()->CellStyleCreated( aNameStr ); - - pStyleObj->InitDoc( pDocShell, aNameStr ); // Objekt kann benutzt werden - - pDocShell->SetDocumentModified(); // verwendet wird der neue Style noch nicht - bDone = sal_True; - } - else - throw container::ElementExistException(); - } - } - - if (!bDone) - { - // other errors are handled above - throw lang::IllegalArgumentException(); - } -} - -void SAL_CALL ScStyleFamilyObj::replaceByName( const rtl::OUString& aName, const uno::Any& aElement ) - throw(lang::IllegalArgumentException, container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - //! zusammenfassen? - removeByName( aName ); - insertByName( aName, aElement ); -} - -void SAL_CALL ScStyleFamilyObj::removeByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bFound = false; - if ( pDocShell ) - { - String aString(ScStyleNameConversion::ProgrammaticToDisplayName( aName, sal::static_int_cast<sal_uInt16>(eFamily) )); - - ScDocument* pDoc = pDocShell->GetDocument(); - ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); - - //! DocFunc-Funktion?? - //! Undo ????????????? - - SfxStyleSheetBase* pStyle = pStylePool->Find( aString, eFamily ); - if (pStyle) - { - bFound = sal_True; - if ( eFamily == SFX_STYLE_FAMILY_PARA ) - { - // wie ScViewFunc::RemoveStyleSheetInUse - VirtualDevice aVDev; - Point aLogic = aVDev.LogicToPixel( Point(1000,1000), MAP_TWIP ); - double nPPTX = aLogic.X() / 1000.0; - double nPPTY = aLogic.Y() / 1000.0; - Fraction aZoom(1,1); - pDoc->StyleSheetChanged( pStyle, false, &aVDev, nPPTX, nPPTY, aZoom, aZoom ); - pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID|PAINT_LEFT ); - pDocShell->SetDocumentModified(); - - pStylePool->Remove( pStyle ); - - //! InvalidateAttribs(); // Bindings-Invalidate - } - else - { - if ( pDoc->RemovePageStyleInUse( aString ) ) - pDocShell->PageStyleModified( ScGlobal::GetRscString(STR_STYLENAME_STANDARD), sal_True ); - - pStylePool->Remove( pStyle ); - - SfxBindings* pBindings = pDocShell->GetViewBindings(); - if (pBindings) - pBindings->Invalidate( SID_STYLE_FAMILY4 ); - pDocShell->SetDocumentModified(); - } - } - } - - if (!bFound) - throw container::NoSuchElementException(); -} - -// container::XIndexAccess - -sal_Int32 SAL_CALL ScStyleFamilyObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); - - SfxStyleSheetIterator aIter( pStylePool, eFamily ); - return aIter.Count(); - } - return 0; -} - -uno::Any SAL_CALL ScStyleFamilyObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< style::XStyle > xObj(GetObjectByIndex_Impl(nIndex)); - if (xObj.is()) - return uno::makeAny(xObj); - else - throw lang::IndexOutOfBoundsException(); -// return uno::Any(); -} - -uno::Type SAL_CALL ScStyleFamilyObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ::getCppuType((const uno::Reference< style::XStyle >*)0); // muss zu getByIndex passen -} - -sal_Bool SAL_CALL ScStyleFamilyObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// container::XNameAccess - -uno::Any SAL_CALL ScStyleFamilyObj::getByName( const rtl::OUString& aName ) - throw(container::NoSuchElementException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference< style::XStyle > xObj( - GetObjectByName_Impl( ScStyleNameConversion::ProgrammaticToDisplayName( aName, sal::static_int_cast<sal_uInt16>(eFamily) ) )); - if (xObj.is()) - return uno::makeAny(xObj); - else - throw container::NoSuchElementException(); -// return uno::Any(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScStyleFamilyObj::getElementNames() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); - - SfxStyleSheetIterator aIter( pStylePool, eFamily ); - sal_uInt16 nCount = aIter.Count(); - - String aName; - uno::Sequence<rtl::OUString> aSeq(nCount); - rtl::OUString* pAry = aSeq.getArray(); - SfxStyleSheetBase* pStyle = aIter.First(); - sal_uInt16 nPos = 0; - while (pStyle) - { - OSL_ENSURE( nPos<nCount, "Anzahl durcheinandergekommen" ); - if (nPos<nCount) - pAry[nPos++] = ScStyleNameConversion::DisplayToProgrammaticName( - pStyle->GetName(), sal::static_int_cast<sal_uInt16>(eFamily) ); - pStyle = aIter.Next(); - } - return aSeq; - } - return uno::Sequence<rtl::OUString>(); -} - -sal_Bool SAL_CALL ScStyleFamilyObj::hasByName( const rtl::OUString& aName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( pDocShell ) - { - String aString(ScStyleNameConversion::ProgrammaticToDisplayName( aName, sal::static_int_cast<sal_uInt16>(eFamily) )); - - ScDocument* pDoc = pDocShell->GetDocument(); - ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); - if ( pStylePool->Find( aString, eFamily ) ) - return sal_True; - } - return false; -} - -// XPropertySet - -uno::Reference< beans::XPropertySetInfo > SAL_CALL ScStyleFamilyObj::getPropertySetInfo( ) throw (uno::RuntimeException) -{ - OSL_FAIL( "###unexpected!" ); - return uno::Reference< beans::XPropertySetInfo >(); -} - -void SAL_CALL ScStyleFamilyObj::setPropertyValue( const ::rtl::OUString&, const uno::Any& ) throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL( "###unexpected!" ); -} - -uno::Any SAL_CALL ScStyleFamilyObj::getPropertyValue( const ::rtl::OUString& sPropertyName ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) -{ - uno::Any aRet; - - if ( sPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("DisplayName") ) ) - { - SolarMutexGuard aGuard; - sal_uInt32 nResId = 0; - switch ( eFamily ) - { - case SFX_STYLE_FAMILY_PARA: - nResId = STR_STYLE_FAMILY_CELL; break; - case SFX_STYLE_FAMILY_PAGE: - nResId = STR_STYLE_FAMILY_PAGE; break; - default: - OSL_FAIL( "ScStyleFamilyObj::getPropertyValue(): invalid family" ); - } - if ( nResId > 0 ) - { - ::rtl::OUString sDisplayName( ScGlobal::GetRscString( static_cast< sal_uInt16 >( nResId ) ) ); - aRet = uno::makeAny( sDisplayName ); - } - } - else - { - throw beans::UnknownPropertyException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("unknown property: ") ) + sPropertyName, static_cast<OWeakObject *>(this) ); - } - - return aRet; -} - -void SAL_CALL ScStyleFamilyObj::addPropertyChangeListener( const ::rtl::OUString&, const uno::Reference< beans::XPropertyChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL( "###unexpected!" ); -} - -void SAL_CALL ScStyleFamilyObj::removePropertyChangeListener( const ::rtl::OUString&, const uno::Reference< beans::XPropertyChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL( "###unexpected!" ); -} - -void SAL_CALL ScStyleFamilyObj::addVetoableChangeListener( const ::rtl::OUString&, const uno::Reference< beans::XVetoableChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL( "###unexpected!" ); -} - -void SAL_CALL ScStyleFamilyObj::removeVetoableChangeListener( const ::rtl::OUString&, const uno::Reference< beans::XVetoableChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException) -{ - OSL_FAIL( "###unexpected!" ); -} - -//------------------------------------------------------------------------ - -// Default-ctor wird fuer die Reflection gebraucht - -ScStyleObj::ScStyleObj(ScDocShell* pDocSh, SfxStyleFamily eFam, const String& rName) : - pPropSet( (eFam == SFX_STYLE_FAMILY_PARA) ? lcl_GetCellStyleSet() : lcl_GetPageStyleSet() ), - pDocShell( pDocSh ), - eFamily( eFam ), - aStyleName( rName ) -{ - // pDocShell ist Null, wenn per ServiceProvider erzeugt - - if (pDocShell) - pDocShell->GetDocument()->AddUnoObject(*this); -} - -void ScStyleObj::InitDoc( ScDocShell* pNewDocSh, const String& rNewName ) -{ - if ( pNewDocSh && !pDocShell ) - { - aStyleName = rNewName; - pDocShell = pNewDocSh; - pDocShell->GetDocument()->AddUnoObject(*this); - } -} - -ScStyleObj::~ScStyleObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScStyleObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScStyleObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScStyleObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScStyleObj::getUnoTunnelId() -{ - return theScStyleObjUnoTunnelId::get().getSeq(); -} - -ScStyleObj* ScStyleObj::getImplementation( - const uno::Reference<uno::XInterface> xObj ) -{ - ScStyleObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScStyleObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -void ScStyleObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - // Referenz-Update interessiert hier nicht - - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - { - pDocShell = NULL; // ungueltig geworden - } -} - -SfxStyleSheetBase* ScStyleObj::GetStyle_Impl() -{ - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); - return pStylePool->Find( aStyleName, eFamily ); - } - return NULL; -} - -// style::XStyle - -sal_Bool SAL_CALL ScStyleObj::isUserDefined() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SfxStyleSheetBase* pStyle = GetStyle_Impl(); - if (pStyle) - return pStyle->IsUserDefined(); - return false; -} - -sal_Bool SAL_CALL ScStyleObj::isInUse() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SfxStyleSheetBase* pStyle = GetStyle_Impl(); - if (pStyle) - return pStyle->IsUsed(); - return false; -} - -rtl::OUString SAL_CALL ScStyleObj::getParentStyle() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SfxStyleSheetBase* pStyle = GetStyle_Impl(); - if (pStyle) - return ScStyleNameConversion::DisplayToProgrammaticName( pStyle->GetParent(), sal::static_int_cast<sal_uInt16>(eFamily) ); - return rtl::OUString(); -} - -void SAL_CALL ScStyleObj::setParentStyle( const rtl::OUString& rParentStyle ) - throw(container::NoSuchElementException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SfxStyleSheetBase* pStyle = GetStyle_Impl(); - if (pStyle) - { - // cell styles cannot be modified if any sheet is protected - if ( eFamily == SFX_STYLE_FAMILY_PARA && lcl_AnyTabProtected( *pDocShell->GetDocument() ) ) - return; //! exception? - - //! DocFunc-Funktion?? - //! Undo ????????????? - - String aString(ScStyleNameConversion::ProgrammaticToDisplayName( rParentStyle, sal::static_int_cast<sal_uInt16>(eFamily) )); - sal_Bool bOk = pStyle->SetParent( aString ); - if (bOk) - { - // wie bei setPropertyValue - - ScDocument* pDoc = pDocShell->GetDocument(); - if ( eFamily == SFX_STYLE_FAMILY_PARA ) - { - // Zeilenhoehen anpassen... - - VirtualDevice aVDev; - Point aLogic = aVDev.LogicToPixel( Point(1000,1000), MAP_TWIP ); - double nPPTX = aLogic.X() / 1000.0; - double nPPTY = aLogic.Y() / 1000.0; - Fraction aZoom(1,1); - pDoc->StyleSheetChanged( pStyle, false, &aVDev, nPPTX, nPPTY, aZoom, aZoom ); - - pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID|PAINT_LEFT ); - pDocShell->SetDocumentModified(); - } - else - { - //! ModifyStyleSheet am Dokument (alte Werte merken) - - pDocShell->PageStyleModified( aStyleName, sal_True ); - } - } - } -} - -// container::XNamed - -rtl::OUString SAL_CALL ScStyleObj::getName() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SfxStyleSheetBase* pStyle = GetStyle_Impl(); - if (pStyle) - return ScStyleNameConversion::DisplayToProgrammaticName( pStyle->GetName(), sal::static_int_cast<sal_uInt16>(eFamily) ); - return rtl::OUString(); -} - -void SAL_CALL ScStyleObj::setName( const rtl::OUString& aNewName ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - SfxStyleSheetBase* pStyle = GetStyle_Impl(); - if (pStyle) - { - // cell styles cannot be renamed if any sheet is protected - if ( eFamily == SFX_STYLE_FAMILY_PARA && lcl_AnyTabProtected( *pDocShell->GetDocument() ) ) - return; //! exception? - - //! DocFunc-Funktion?? - //! Undo ????????????? - - String aString(aNewName); - sal_Bool bOk = pStyle->SetName( aString ); - if (bOk) - { - aStyleName = aString; //! notify other objects for this style? - - ScDocument* pDoc = pDocShell->GetDocument(); - if ( eFamily == SFX_STYLE_FAMILY_PARA && !pDoc->IsImportingXML() ) - pDoc->GetPool()->CellStyleCreated( aString ); - - // Zellvorlagen = 2, Seitenvorlagen = 4 - sal_uInt16 nId = ( eFamily == SFX_STYLE_FAMILY_PARA ) ? - SID_STYLE_FAMILY2 : SID_STYLE_FAMILY4; - SfxBindings* pBindings = pDocShell->GetViewBindings(); - if (pBindings) - { - pBindings->Invalidate( nId ); - pBindings->Invalidate( SID_STYLE_APPLY ); - } - } - } -} - -uno::Reference<container::XIndexReplace> ScStyleObj::CreateEmptyNumberingRules() -{ - SvxNumRule aRule( 0, 0, sal_True ); // nothing supported - return SvxCreateNumRule( &aRule ); -} - -// beans::XPropertyState - -const SfxItemSet* ScStyleObj::GetStyleItemSet_Impl( const ::rtl::OUString& rPropName, - const SfxItemPropertySimpleEntry*& rpResultEntry ) -{ - //! OUString as argument? - - SfxStyleSheetBase* pStyle = GetStyle_Impl(); - if (pStyle) - { - const SfxItemPropertySimpleEntry* pEntry = NULL; - if ( eFamily == SFX_STYLE_FAMILY_PAGE ) - { - pEntry = lcl_GetHeaderStyleMap()->getByName( rPropName ); - if ( pEntry ) // only item-wids in header/footer map - { - rpResultEntry = pEntry; - return &((const SvxSetItem&)pStyle->GetItemSet().Get(ATTR_PAGE_HEADERSET)).GetItemSet(); - } - pEntry = lcl_GetFooterStyleMap()->getByName( rPropName ); - if ( pEntry ) // only item-wids in header/footer map - { - rpResultEntry = pEntry; - return &((const SvxSetItem&)pStyle->GetItemSet().Get(ATTR_PAGE_FOOTERSET)).GetItemSet(); - } - } - pEntry = pPropSet->getPropertyMap()->getByName( rPropName ); - if ( pEntry ) - { - rpResultEntry = pEntry; - return &pStyle->GetItemSet(); - } - } - - rpResultEntry = NULL; - return NULL; -} - -beans::PropertyState SAL_CALL ScStyleObj::getPropertyState( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - beans::PropertyState eRet = beans::PropertyState_DIRECT_VALUE; - - const SfxItemPropertySimpleEntry* pResultEntry = NULL; - const SfxItemSet* pItemSet = GetStyleItemSet_Impl( aPropertyName, pResultEntry ); - - if ( pItemSet && pResultEntry ) - { - sal_uInt16 nWhich = pResultEntry->nWID; - if ( nWhich == SC_WID_UNO_TBLBORD ) - { - nWhich = ATTR_BORDER; - } - if ( IsScItemWid( nWhich ) ) - { - SfxItemState eState = pItemSet->GetItemState( nWhich, false ); - -// // if no rotate value is set, look at orientation -// //! also for a fixed value of 0 (in case orientation is ambiguous)? -// if ( nWhich == ATTR_ROTATE_VALUE && eState == SFX_ITEM_DEFAULT ) -// eState = pItemSet->GetItemState( ATTR_ORIENTATION, sal_False ); - - if ( eState == SFX_ITEM_SET ) - eRet = beans::PropertyState_DIRECT_VALUE; - else if ( eState == SFX_ITEM_DEFAULT ) - eRet = beans::PropertyState_DEFAULT_VALUE; - else if ( eState == SFX_ITEM_DONTCARE ) - eRet = beans::PropertyState_AMBIGUOUS_VALUE; // kann eigentlich nicht sein... - else - { - OSL_FAIL("unbekannter ItemState"); - } - } - } - return eRet; -} - -uno::Sequence<beans::PropertyState> SAL_CALL ScStyleObj::getPropertyStates( - const uno::Sequence<rtl::OUString>& aPropertyNames ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - // duemmliche Default-Implementierung: alles einzeln per getPropertyState holen - //! sollte optimiert werden! - - SolarMutexGuard aGuard; - const rtl::OUString* pNames = aPropertyNames.getConstArray(); - uno::Sequence<beans::PropertyState> aRet(aPropertyNames.getLength()); - beans::PropertyState* pStates = aRet.getArray(); - for(sal_Int32 i = 0; i < aPropertyNames.getLength(); i++) - pStates[i] = getPropertyState(pNames[i]); - return aRet; -} - -void SAL_CALL ScStyleObj::setPropertyToDefault( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - const SfxItemPropertyMap* pMap = pPropSet->getPropertyMap(); - const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( aPropertyName ); - if ( !pEntry ) - throw beans::UnknownPropertyException(); - - SetOnePropertyValue( aPropertyName, pEntry, NULL ); -} - -uno::Any SAL_CALL ScStyleObj::getPropertyDefault( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aAny; - - const SfxItemPropertySimpleEntry* pResultEntry = NULL; - const SfxItemSet* pStyleSet = GetStyleItemSet_Impl( aPropertyName, pResultEntry ); - - if ( pStyleSet && pResultEntry ) - { - sal_uInt16 nWhich = pResultEntry->nWID; - - if ( IsScItemWid( nWhich ) ) - { - // Default ist Default vom ItemPool, nicht vom Standard-Style, - // damit es zu setPropertyToDefault passt - SfxItemSet aEmptySet( *pStyleSet->GetPool(), pStyleSet->GetRanges() ); - // Default-Items mit falscher Slot-ID funktionieren im SfxItemPropertySet3 nicht - //! Slot-IDs aendern... - if ( aEmptySet.GetPool()->GetSlotId(nWhich) == nWhich && - aEmptySet.GetItemState(nWhich, false) == SFX_ITEM_DEFAULT ) - { - aEmptySet.Put( aEmptySet.Get( nWhich ) ); - } - const SfxItemSet* pItemSet = &aEmptySet; - - switch ( nWhich ) // fuer Item-Spezial-Behandlungen - { - case ATTR_VALUE_FORMAT: - // default has no language set - aAny <<= sal_Int32( ((const SfxUInt32Item&)pItemSet->Get(nWhich)).GetValue() ); - break; - case ATTR_INDENT: - aAny <<= sal_Int16( TwipsToHMM(((const SfxUInt16Item&) - pItemSet->Get(nWhich)).GetValue()) ); - break; - case ATTR_PAGE_SCALE: - case ATTR_PAGE_SCALETOPAGES: - case ATTR_PAGE_FIRSTPAGENO: - aAny <<= sal_Int16( ((const SfxUInt16Item&)pItemSet->Get(nWhich)).GetValue() ); - break; - case ATTR_PAGE_CHARTS: - case ATTR_PAGE_OBJECTS: - case ATTR_PAGE_DRAWINGS: - //! sal_Bool-MID fuer ScViewObjectModeItem definieren? - aAny <<= sal_Bool( ((const ScViewObjectModeItem&)pItemSet->Get(nWhich)). - GetValue() == VOBJ_MODE_SHOW ); - break; - case ATTR_PAGE_SCALETO: - { - const ScPageScaleToItem aItem((const ScPageScaleToItem&)pItemSet->Get(nWhich)); - if (aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SC_UNO_PAGE_SCALETOX ))) - aAny = uno::makeAny(static_cast<sal_Int16>(aItem.GetWidth())); - else - aAny = uno::makeAny(static_cast<sal_Int16>(aItem.GetHeight())); - } - break; - default: - pPropSet->getPropertyValue( *pResultEntry, *pItemSet, aAny ); - } - } - else if ( IsScUnoWid( nWhich ) ) - { - SfxItemSet aEmptySet( *pStyleSet->GetPool(), pStyleSet->GetRanges() ); - const SfxItemSet* pItemSet = &aEmptySet; - switch ( nWhich ) - { - case SC_WID_UNO_TBLBORD: - { - const SfxPoolItem* pItem = &pItemSet->Get( ATTR_BORDER ); - if ( pItem ) - { - SvxBoxItem aOuter( *( static_cast<const SvxBoxItem*>( pItem ) ) ); - SvxBoxInfoItem aInner( ATTR_BORDER_INNER ); - table::TableBorder aBorder; - ScHelperFunctions::FillTableBorder( aBorder, aOuter, aInner ); - aBorder.IsHorizontalLineValid = false; - aBorder.IsVerticalLineValid = false; - aBorder.IsDistanceValid = false; - aAny <<= aBorder; - } - } - break; - } - } - } - return aAny; -} - -// XMultiPropertySet - -void SAL_CALL ScStyleObj::setPropertyValues( const uno::Sequence< rtl::OUString >& aPropertyNames, - const uno::Sequence< uno::Any >& aValues ) - throw (beans::PropertyVetoException, lang::IllegalArgumentException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Int32 nCount = aPropertyNames.getLength(); - if ( aValues.getLength() != nCount ) - throw lang::IllegalArgumentException(); - - if ( nCount ) - { - const rtl::OUString* pNames = aPropertyNames.getConstArray(); - const uno::Any* pValues = aValues.getConstArray(); - - const SfxItemPropertyMap* pPropertyMap = pPropSet->getPropertyMap(); - for (sal_Int32 i = 0; i < nCount; i++) - { - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( pNames[i] ); - SetOnePropertyValue( pNames[i], pEntry, &pValues[i] ); - } - } -} - -uno::Sequence<uno::Any> SAL_CALL ScStyleObj::getPropertyValues( - const uno::Sequence< rtl::OUString >& aPropertyNames ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! optimize - - sal_Int32 nCount = aPropertyNames.getLength(); - uno::Sequence<uno::Any> aSequence( nCount ); - if ( nCount ) - { - uno::Any* pValues = aSequence.getArray(); - for (sal_Int32 i=0; i<nCount; i++) - pValues[i] = getPropertyValue( aPropertyNames[i] ); - } - return aSequence; -} - -void SAL_CALL ScStyleObj::addPropertiesChangeListener( const uno::Sequence<rtl::OUString>& /* aPropertyNames */, - const uno::Reference<beans::XPropertiesChangeListener>& /* xListener */ ) - throw (uno::RuntimeException) -{ - // no bound properties -} - -void SAL_CALL ScStyleObj::removePropertiesChangeListener( - const uno::Reference<beans::XPropertiesChangeListener>& /* xListener */ ) - throw (uno::RuntimeException) -{ - // no bound properties -} - -void SAL_CALL ScStyleObj::firePropertiesChangeEvent( const uno::Sequence<rtl::OUString>& /* aPropertyNames */, - const uno::Reference<beans::XPropertiesChangeListener>& /* xListener */ ) - throw (uno::RuntimeException) -{ - // no bound properties -} - -// XMultiPropertyStates -// getPropertyStates already defined for XPropertyState - -void SAL_CALL ScStyleObj::setAllPropertiesToDefault() throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - SfxStyleSheetBase* pStyle = GetStyle_Impl(); - if ( pStyle ) - { - // cell styles cannot be modified if any sheet is protected - if ( eFamily == SFX_STYLE_FAMILY_PARA && lcl_AnyTabProtected( *pDocShell->GetDocument() ) ) - throw uno::RuntimeException(); - - SfxItemSet& rSet = pStyle->GetItemSet(); - rSet.ClearItem(); // set all items to default - - //! merge with SetOneProperty - - ScDocument* pDoc = pDocShell->GetDocument(); - if ( eFamily == SFX_STYLE_FAMILY_PARA ) - { - // row heights - - VirtualDevice aVDev; - Point aLogic = aVDev.LogicToPixel( Point(1000,1000), MAP_TWIP ); - double nPPTX = aLogic.X() / 1000.0; - double nPPTY = aLogic.Y() / 1000.0; - Fraction aZoom(1,1); - pDoc->StyleSheetChanged( pStyle, false, &aVDev, nPPTX, nPPTY, aZoom, aZoom ); - - pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID|PAINT_LEFT ); - pDocShell->SetDocumentModified(); - } - else - { - // #i22448# apply the default BoxInfoItem for page styles again - // (same content as in ScStyleSheet::GetItemSet, to control the dialog) - SvxBoxInfoItem aBoxInfoItem( ATTR_BORDER_INNER ); - aBoxInfoItem.SetTable( false ); - aBoxInfoItem.SetDist( sal_True ); - aBoxInfoItem.SetValid( VALID_DISTANCE, sal_True ); - rSet.Put( aBoxInfoItem ); - - pDocShell->PageStyleModified( aStyleName, sal_True ); - } - } -} - -void SAL_CALL ScStyleObj::setPropertiesToDefault( const uno::Sequence<rtl::OUString>& aPropertyNames ) - throw (beans::UnknownPropertyException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Int32 nCount = aPropertyNames.getLength(); - if ( nCount ) - { - const rtl::OUString* pNames = aPropertyNames.getConstArray(); - - const SfxItemPropertyMap* pPropertyMap = pPropSet->getPropertyMap(); - for (sal_Int32 i = 0; i < nCount; i++) - { - const SfxItemPropertySimpleEntry* pEntry = pPropertyMap->getByName( pNames[i] ); - SetOnePropertyValue( pNames[i], pEntry, NULL ); - } - } -} - -uno::Sequence<uno::Any> SAL_CALL ScStyleObj::getPropertyDefaults( - const uno::Sequence<rtl::OUString>& aPropertyNames ) - throw (beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! optimize - - sal_Int32 nCount = aPropertyNames.getLength(); - uno::Sequence<uno::Any> aSequence( nCount ); - if ( nCount ) - { - uno::Any* pValues = aSequence.getArray(); - for (sal_Int32 i=0; i<nCount; i++) - pValues[i] = getPropertyDefault( aPropertyNames[i] ); - } - return aSequence; -} - -// beans::XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScStyleObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return pPropSet->getPropertySetInfo(); -} - -void SAL_CALL ScStyleObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - const SfxItemPropertySimpleEntry* pEntry = pPropSet->getPropertyMap()->getByName( aPropertyName ); - if ( !pEntry ) - throw beans::UnknownPropertyException(); - - SetOnePropertyValue( aPropertyName, pEntry, &aValue ); -} - -void ScStyleObj::SetOnePropertyValue( const ::rtl::OUString& rPropertyName, const SfxItemPropertySimpleEntry* pEntry, const uno::Any* pValue ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SfxStyleSheetBase* pStyle = GetStyle_Impl(); - if ( pStyle && pEntry ) - { - // cell styles cannot be modified if any sheet is protected - if ( eFamily == SFX_STYLE_FAMILY_PARA && lcl_AnyTabProtected( *pDocShell->GetDocument() ) ) - throw uno::RuntimeException(); - - SfxItemSet& rSet = pStyle->GetItemSet(); // direkt im lebenden Style aendern... - sal_Bool bDone = false; - if ( eFamily == SFX_STYLE_FAMILY_PAGE ) - { - if(pEntry->nWID == SC_WID_UNO_HEADERSET) - { - const SfxItemPropertySimpleEntry* pHeaderEntry = lcl_GetHeaderStyleMap()->getByName( rPropertyName ); - if ( pHeaderEntry ) // only item-wids in header/footer map - { - SvxSetItem aNewHeader( (const SvxSetItem&)rSet.Get(ATTR_PAGE_HEADERSET) ); - if (pValue) - pPropSet->setPropertyValue( *pHeaderEntry, *pValue, aNewHeader.GetItemSet() ); - else - aNewHeader.GetItemSet().ClearItem( pHeaderEntry->nWID ); - rSet.Put( aNewHeader ); - bDone = sal_True; - } - } - else if(pEntry->nWID == SC_WID_UNO_FOOTERSET) - { - const SfxItemPropertySimpleEntry* pFooterEntry = lcl_GetFooterStyleMap()->getByName( rPropertyName ); - if ( pFooterEntry ) // only item-wids in header/footer map - { - SvxSetItem aNewFooter( (const SvxSetItem&)rSet.Get(ATTR_PAGE_FOOTERSET) ); - if (pValue) - pPropSet->setPropertyValue( *pFooterEntry, *pValue, aNewFooter.GetItemSet() ); - else - aNewFooter.GetItemSet().ClearItem( pFooterEntry->nWID ); - rSet.Put( aNewFooter ); - bDone = sal_True; - } - } - } - if (!bDone) - { - if ( pEntry ) - { - if ( IsScItemWid( pEntry->nWID ) ) - { - if (pValue) - { - switch ( pEntry->nWID ) // fuer Item-Spezial-Behandlungen - { - case ATTR_VALUE_FORMAT: - { - // language for number formats - SvNumberFormatter* pFormatter = - pDocShell->GetDocument()->GetFormatTable(); - sal_uInt32 nOldFormat = ((const SfxUInt32Item&) - rSet.Get( ATTR_VALUE_FORMAT )).GetValue(); - LanguageType eOldLang = ((const SvxLanguageItem&) - rSet.Get( ATTR_LANGUAGE_FORMAT )).GetLanguage(); - nOldFormat = pFormatter-> - GetFormatForLanguageIfBuiltIn( nOldFormat, eOldLang ); - - sal_uInt32 nNewFormat = 0; - *pValue >>= nNewFormat; - rSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, nNewFormat ) ); - - const SvNumberformat* pNewEntry = pFormatter->GetEntry( nNewFormat ); - LanguageType eNewLang = - pNewEntry ? pNewEntry->GetLanguage() : LANGUAGE_DONTKNOW; - if ( eNewLang != eOldLang && eNewLang != LANGUAGE_DONTKNOW ) - rSet.Put( SvxLanguageItem( eNewLang, ATTR_LANGUAGE_FORMAT ) ); - - //! keep default state of number format if only language changed? - } - break; - case ATTR_INDENT: - { - sal_Int16 nVal = 0; - *pValue >>= nVal; - rSet.Put( SfxUInt16Item( pEntry->nWID, (sal_uInt16)HMMToTwips(nVal) ) ); - } - break; - case ATTR_ROTATE_VALUE: - { - sal_Int32 nRotVal = 0; - if ( *pValue >>= nRotVal ) - { - // stored value is always between 0 and 360 deg. - nRotVal %= 36000; - if ( nRotVal < 0 ) - nRotVal += 36000; - rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, nRotVal ) ); - } - } - break; - case ATTR_STACKED: - { - table::CellOrientation eOrient; - if( *pValue >>= eOrient ) - { - switch( eOrient ) - { - case table::CellOrientation_STANDARD: - rSet.Put( SfxBoolItem( ATTR_STACKED, false ) ); - break; - case table::CellOrientation_TOPBOTTOM: - rSet.Put( SfxBoolItem( ATTR_STACKED, false ) ); - rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 27000 ) ); - break; - case table::CellOrientation_BOTTOMTOP: - rSet.Put( SfxBoolItem( ATTR_STACKED, false ) ); - rSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 9000 ) ); - break; - case table::CellOrientation_STACKED: - rSet.Put( SfxBoolItem( ATTR_STACKED, sal_True ) ); - break; - default: - { - // added to avoid warnings - } - } - } - } - break; - case ATTR_PAGE_SCALE: - case ATTR_PAGE_SCALETOPAGES: - { - rSet.ClearItem(ATTR_PAGE_SCALETOPAGES); - rSet.ClearItem(ATTR_PAGE_SCALE); - rSet.ClearItem(ATTR_PAGE_SCALETO); - sal_Int16 nVal = 0; - *pValue >>= nVal; - rSet.Put( SfxUInt16Item( pEntry->nWID, nVal ) ); - } - break; - case ATTR_PAGE_FIRSTPAGENO: - { - sal_Int16 nVal = 0; - *pValue >>= nVal; - rSet.Put( SfxUInt16Item( ATTR_PAGE_FIRSTPAGENO, nVal ) ); - } - break; - case ATTR_PAGE_CHARTS: - case ATTR_PAGE_OBJECTS: - case ATTR_PAGE_DRAWINGS: - { - sal_Bool bBool = false; - *pValue >>= bBool; - //! sal_Bool-MID fuer ScViewObjectModeItem definieren? - rSet.Put( ScViewObjectModeItem( pEntry->nWID, - bBool ? VOBJ_MODE_SHOW : VOBJ_MODE_HIDE ) ); - } - break; - case ATTR_PAGE_PAPERBIN: - { - sal_uInt8 nTray = PAPERBIN_PRINTER_SETTINGS; - sal_Bool bFound = false; - - rtl::OUString aName; - if ( *pValue >>= aName ) - { - if ( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_PAPERBIN_DEFAULTNAME ) ) ) - bFound = sal_True; - else - { - Printer* pPrinter = pDocShell->GetPrinter(); - if (pPrinter) - { - String aNameStr = aName; - sal_uInt16 nCount = pPrinter->GetPaperBinCount(); - for (sal_uInt16 i=0; i<nCount; i++) - if ( aNameStr == pPrinter->GetPaperBinName(i) ) - { - nTray = (sal_uInt8) i; - bFound = sal_True; - break; - } - } - } - } - if ( bFound ) - rSet.Put( SvxPaperBinItem( ATTR_PAGE_PAPERBIN, nTray ) ); - else - throw lang::IllegalArgumentException(); - } - break; - case ATTR_PAGE_SCALETO: - { - sal_Int16 nPages = 0; - if (*pValue >>= nPages) - { - ScPageScaleToItem aItem = ((const ScPageScaleToItem&)rSet.Get(ATTR_PAGE_SCALETO)); - if ( rPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SC_UNO_PAGE_SCALETOX))) - aItem.SetWidth(static_cast<sal_uInt16>(nPages)); - else - aItem.SetHeight(static_cast<sal_uInt16>(nPages)); - rSet.Put( aItem ); - rSet.ClearItem(ATTR_PAGE_SCALETOPAGES); - rSet.ClearItem(ATTR_PAGE_SCALE); - } - } - break; - default: - // Default-Items mit falscher Slot-ID - // funktionieren im SfxItemPropertySet3 nicht - //! Slot-IDs aendern... - if ( rSet.GetPool()->GetSlotId(pEntry->nWID) == pEntry->nWID && - rSet.GetItemState(pEntry->nWID, false) == SFX_ITEM_DEFAULT ) - { - rSet.Put( rSet.Get(pEntry->nWID) ); - } - pPropSet->setPropertyValue( *pEntry, *pValue, rSet ); - } - } - else - { - rSet.ClearItem( pEntry->nWID ); - // language for number formats - if ( pEntry->nWID == ATTR_VALUE_FORMAT ) - rSet.ClearItem( ATTR_LANGUAGE_FORMAT ); - - //! for ATTR_ROTATE_VALUE, also reset ATTR_ORIENTATION? - } - } - else if ( IsScUnoWid( pEntry->nWID ) ) - { - switch ( pEntry->nWID ) - { - case SC_WID_UNO_TBLBORD: - { - if (pValue) - { - table::TableBorder aBorder; - if ( *pValue >>= aBorder ) - { - SvxBoxItem aOuter( ATTR_BORDER ); - SvxBoxInfoItem aInner( ATTR_BORDER_INNER ); - ScHelperFunctions::FillBoxItems( aOuter, aInner, aBorder ); - rSet.Put( aOuter ); - } - } - else - { - rSet.ClearItem( ATTR_BORDER ); - } - } - break; - } - } - } - } - - //! DocFunc-Funktion?? - //! Undo ????????????? - - ScDocument* pDoc = pDocShell->GetDocument(); - if ( eFamily == SFX_STYLE_FAMILY_PARA ) - { - // Zeilenhoehen anpassen... - - VirtualDevice aVDev; - Point aLogic = aVDev.LogicToPixel( Point(1000,1000), MAP_TWIP ); - double nPPTX = aLogic.X() / 1000.0; - double nPPTY = aLogic.Y() / 1000.0; - Fraction aZoom(1,1); - pDoc->StyleSheetChanged( pStyle, false, &aVDev, nPPTX, nPPTY, aZoom, aZoom ); - - pDocShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB, PAINT_GRID|PAINT_LEFT ); - pDocShell->SetDocumentModified(); - } - else - { - //! ModifyStyleSheet am Dokument (alte Werte merken) - - pDocShell->PageStyleModified( aStyleName, sal_True ); - } - } -} - -uno::Any SAL_CALL ScStyleObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aAny; - - if ( aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( SC_UNONAME_DISPNAME ) ) ) // read-only - { - // core always has the display name - SfxStyleSheetBase* pStyle = GetStyle_Impl(); - if (pStyle) - aAny <<= rtl::OUString( pStyle->GetName() ); - } - else - { - const SfxItemPropertySimpleEntry* pResultEntry = NULL; - const SfxItemSet* pItemSet = GetStyleItemSet_Impl( aPropertyName, pResultEntry ); - - if ( pItemSet && pResultEntry ) - { - sal_uInt16 nWhich = pResultEntry->nWID; - - if ( IsScItemWid( nWhich ) ) - { - switch ( nWhich ) // fuer Item-Spezial-Behandlungen - { - case ATTR_VALUE_FORMAT: - if ( pDocShell ) - { - sal_uInt32 nOldFormat = ((const SfxUInt32Item&) - pItemSet->Get( ATTR_VALUE_FORMAT )).GetValue(); - LanguageType eOldLang = ((const SvxLanguageItem&) - pItemSet->Get( ATTR_LANGUAGE_FORMAT )).GetLanguage(); - nOldFormat = pDocShell->GetDocument()->GetFormatTable()-> - GetFormatForLanguageIfBuiltIn( nOldFormat, eOldLang ); - aAny <<= nOldFormat; - } - break; - case ATTR_INDENT: - aAny <<= sal_Int16( TwipsToHMM(((const SfxUInt16Item&) - pItemSet->Get(nWhich)).GetValue()) ); - break; - case ATTR_STACKED: - { - sal_Int32 nRot = ((const SfxInt32Item&)pItemSet->Get(ATTR_ROTATE_VALUE)).GetValue(); - sal_Bool bStacked = ((const SfxBoolItem&)pItemSet->Get(nWhich)).GetValue(); - SvxOrientationItem( nRot, bStacked, 0 ).QueryValue( aAny ); - } - break; - case ATTR_PAGE_SCALE: - case ATTR_PAGE_SCALETOPAGES: - case ATTR_PAGE_FIRSTPAGENO: - aAny <<= sal_Int16( ((const SfxUInt16Item&)pItemSet->Get(nWhich)).GetValue() ); - break; - case ATTR_PAGE_CHARTS: - case ATTR_PAGE_OBJECTS: - case ATTR_PAGE_DRAWINGS: - //! sal_Bool-MID fuer ScViewObjectModeItem definieren? - aAny <<= sal_Bool( ((const ScViewObjectModeItem&)pItemSet-> - Get(nWhich)).GetValue() == VOBJ_MODE_SHOW ); - break; - case ATTR_PAGE_PAPERBIN: - { - // property PrinterPaperTray is the name of the tray - - sal_uInt8 nValue = ((const SvxPaperBinItem&)pItemSet->Get(nWhich)).GetValue(); - rtl::OUString aName; - if ( nValue == PAPERBIN_PRINTER_SETTINGS ) - aName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SC_PAPERBIN_DEFAULTNAME )); - else - { - Printer* pPrinter = pDocShell->GetPrinter(); - if (pPrinter) - aName = pPrinter->GetPaperBinName( nValue ); - } - aAny <<= aName; - } - break; - case ATTR_PAGE_SCALETO: - { - ScPageScaleToItem aItem((const ScPageScaleToItem&)pItemSet->Get(ATTR_PAGE_SCALETO)); - if (aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SC_UNO_PAGE_SCALETOX))) - aAny = uno::makeAny(static_cast<sal_Int16>(aItem.GetWidth())); - else - aAny = uno::makeAny(static_cast<sal_Int16>(aItem.GetHeight())); - } - break; - default: - // Default-Items mit falscher Slot-ID - // funktionieren im SfxItemPropertySet3 nicht - //! Slot-IDs aendern... - if ( pItemSet->GetPool()->GetSlotId(nWhich) == nWhich && - pItemSet->GetItemState(nWhich, false) == SFX_ITEM_DEFAULT ) - { - SfxItemSet aNoEmptySet( *pItemSet ); - aNoEmptySet.Put( aNoEmptySet.Get( nWhich ) ); - pPropSet->getPropertyValue( *pResultEntry, aNoEmptySet, aAny ); - } - else - pPropSet->getPropertyValue( *pResultEntry, *pItemSet, aAny ); - } - } - else if ( IsScUnoWid( nWhich ) ) - { - switch ( nWhich ) - { - case SC_WID_UNO_TBLBORD: - { - const SfxPoolItem* pItem = &pItemSet->Get( ATTR_BORDER ); - if ( pItem ) - { - SvxBoxItem aOuter( *( static_cast<const SvxBoxItem*>( pItem ) ) ); - SvxBoxInfoItem aInner( ATTR_BORDER_INNER ); - table::TableBorder aBorder; - ScHelperFunctions::FillTableBorder( aBorder, aOuter, aInner ); - aBorder.IsHorizontalLineValid = false; - aBorder.IsVerticalLineValid = false; - aBorder.IsDistanceValid = false; - aAny <<= aBorder; - } - } - break; - } - } - } - } - - return aAny; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScStyleObj ) - -// lang::XServiceInfo - -rtl::OUString SAL_CALL ScStyleObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScStyleObj" )); -} - -sal_Bool SAL_CALL ScStyleObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - sal_Bool bPage = ( eFamily == SFX_STYLE_FAMILY_PAGE ); - return rServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SCSTYLE_SERVICE ) )|| - rServiceName.equalsAsciiL( - RTL_CONSTASCII_STRINGPARAM ( bPage ? SCPAGESTYLE_SERVICE : SCCELLSTYLE_SERVICE )); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScStyleObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - sal_Bool bPage = ( eFamily == SFX_STYLE_FAMILY_PAGE ); - uno::Sequence<rtl::OUString> aRet(2); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCSTYLE_SERVICE )); - pArray[1] = bPage ? rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SCPAGESTYLE_SERVICE)) - : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(SCCELLSTYLE_SERVICE)); - return aRet; -} - -//------------------------------------------------------------------------ - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/targuno.cxx b/sc/source/ui/unoobj/targuno.cxx deleted file mode 100644 index d8feaaa54..000000000 --- a/sc/source/ui/unoobj/targuno.cxx +++ /dev/null @@ -1,315 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include <vcl/image.hxx> -#include <vcl/virdev.hxx> -#include <toolkit/unohlp.hxx> -#include <svl/itemprop.hxx> -#include <svl/smplhint.hxx> -#include <vcl/svapp.hxx> -#include <vcl/settings.hxx> -#include <com/sun/star/awt/XBitmap.hpp> - -#include "targuno.hxx" -#include "miscuno.hxx" -#include "docuno.hxx" -#include "datauno.hxx" -#include "nameuno.hxx" -#include "docsh.hxx" -#include "content.hxx" -#include "scresid.hxx" -#include "sc.hrc" -#include "unonames.hxx" - -using namespace ::com::sun::star; - -//------------------------------------------------------------------------ - -sal_uInt16 nTypeResIds[SC_LINKTARGETTYPE_COUNT] = -{ - SCSTR_CONTENT_TABLE, // SC_LINKTARGETTYPE_SHEET - SCSTR_CONTENT_RANGENAME, // SC_LINKTARGETTYPE_RANGENAME - SCSTR_CONTENT_DBAREA // SC_LINKTARGETTYPE_DBAREA -}; - -const SfxItemPropertyMapEntry* lcl_GetLinkTargetMap() -{ - static SfxItemPropertyMapEntry aLinkTargetMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_LINKDISPBIT), 0, &getCppuType((const uno::Reference<awt::XBitmap>*)0), beans::PropertyAttribute::READONLY, 0 }, - {MAP_CHAR_LEN(SC_UNO_LINKDISPNAME), 0, &getCppuType((const ::rtl::OUString*)0), beans::PropertyAttribute::READONLY, 0 }, - {0,0,0,0,0,0} - }; - return aLinkTargetMap_Impl; -} - -//------------------------------------------------------------------------ - -// service for ScLinkTargetTypeObj is not defined -// must not support document::LinkTarget because the target type cannot be used as a target - -SC_SIMPLE_SERVICE_INFO( ScLinkTargetTypesObj, "ScLinkTargetTypesObj", "com.sun.star.document.LinkTargets" ) -SC_SIMPLE_SERVICE_INFO( ScLinkTargetTypeObj, "ScLinkTargetTypeObj", "com.sun.star.document.LinkTargetSupplier" ) -SC_SIMPLE_SERVICE_INFO( ScLinkTargetsObj, "ScLinkTargetsObj", "com.sun.star.document.LinkTargets" ) - -//------------------------------------------------------------------------ - -ScLinkTargetTypesObj::ScLinkTargetTypesObj(ScDocShell* pDocSh) : - pDocShell( pDocSh ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); - - for (sal_uInt16 i=0; i<SC_LINKTARGETTYPE_COUNT; i++) - aNames[i] = String( ScResId( nTypeResIds[i] ) ); -} - -ScLinkTargetTypesObj::~ScLinkTargetTypesObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScLinkTargetTypesObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pDocShell = NULL; // document gone -} - -// container::XNameAccess - -uno::Any SAL_CALL ScLinkTargetTypesObj::getByName(const rtl::OUString& aName) - throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException ) -{ - if (pDocShell) - { - String aNameStr(aName); - for (sal_uInt16 i=0; i<SC_LINKTARGETTYPE_COUNT; i++) - if ( aNames[i] == aNameStr ) - return uno::makeAny(uno::Reference< beans::XPropertySet >(new ScLinkTargetTypeObj( pDocShell, i ))); - } - - throw container::NoSuchElementException(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScLinkTargetTypesObj::getElementNames(void) throw( uno::RuntimeException ) -{ - uno::Sequence<rtl::OUString> aRet(SC_LINKTARGETTYPE_COUNT); - rtl::OUString* pArray = aRet.getArray(); - for (sal_uInt16 i=0; i<SC_LINKTARGETTYPE_COUNT; i++) - pArray[i] = aNames[i]; - return aRet; -} - -sal_Bool SAL_CALL ScLinkTargetTypesObj::hasByName(const rtl::OUString& aName) throw( uno::RuntimeException ) -{ - String aNameStr = aName; - for (sal_uInt16 i=0; i<SC_LINKTARGETTYPE_COUNT; i++) - if ( aNames[i] == aNameStr ) - return sal_True; - return false; -} - -// container::XElementAccess - -uno::Type SAL_CALL ScLinkTargetTypesObj::getElementType(void) throw( uno::RuntimeException ) -{ - return ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); -} - -sal_Bool SAL_CALL ScLinkTargetTypesObj::hasElements(void) throw( uno::RuntimeException ) -{ - return sal_True; -} - -//------------------------------------------------------------------------ - -ScLinkTargetTypeObj::ScLinkTargetTypeObj(ScDocShell* pDocSh, sal_uInt16 nT) : - pDocShell( pDocSh ), - nType( nT ) -{ - pDocShell->GetDocument()->AddUnoObject(*this); - aName = String( ScResId( nTypeResIds[nType] ) ); //! on demand? -} - -ScLinkTargetTypeObj::~ScLinkTargetTypeObj() -{ - if (pDocShell) - pDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScLinkTargetTypeObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pDocShell = NULL; // document gone -} - -// document::XLinkTargetSupplier - -uno::Reference< container::XNameAccess > SAL_CALL ScLinkTargetTypeObj::getLinks(void) throw( uno::RuntimeException ) -{ - uno::Reference< container::XNameAccess > xCollection; - - if ( pDocShell ) - { - switch ( nType ) - { - case SC_LINKTARGETTYPE_SHEET: - xCollection.set(new ScTableSheetsObj(pDocShell)); - break; - case SC_LINKTARGETTYPE_RANGENAME: - xCollection.set(new ScNamedRangesObj(pDocShell)); - break; - case SC_LINKTARGETTYPE_DBAREA: - xCollection.set(new ScDatabaseRangesObj(pDocShell)); - break; - default: - OSL_FAIL("invalid type"); - } - } - - // wrap collection in ScLinkTargetsObj because service document::LinkTargets requires - // beans::XPropertySet as ElementType in container::XNameAccess. - if ( xCollection.is() ) - return new ScLinkTargetsObj( xCollection ); - return NULL; -} - -// beans::XPropertySet - -uno::Reference< beans::XPropertySetInfo > SAL_CALL ScLinkTargetTypeObj::getPropertySetInfo(void) throw( uno::RuntimeException ) -{ - SolarMutexGuard aGuard; - static uno::Reference< beans::XPropertySetInfo > aRef(new SfxItemPropertySetInfo( lcl_GetLinkTargetMap() )); - return aRef; -} - -void SAL_CALL ScLinkTargetTypeObj::setPropertyValue(const rtl::OUString& /* aPropertyName */, - const uno::Any& /* aValue */) - throw( beans::UnknownPropertyException, - beans::PropertyVetoException, - lang::IllegalArgumentException, - lang::WrappedTargetException, - uno::RuntimeException ) -{ - // everything is read-only - //! exception? -} - -void ScLinkTargetTypeObj::SetLinkTargetBitmap( uno::Any& rRet, sal_uInt16 nType ) -{ - sal_uInt16 nImgId = 0; - switch ( nType ) - { - case SC_LINKTARGETTYPE_SHEET: - nImgId = SC_CONTENT_TABLE; - break; - case SC_LINKTARGETTYPE_RANGENAME: - nImgId = SC_CONTENT_RANGENAME; - break; - case SC_LINKTARGETTYPE_DBAREA: - nImgId = SC_CONTENT_DBAREA; - break; - } - if (nImgId) - { - ImageList aEntryImages( ScResId( RID_IMAGELIST_NAVCONT ) ); - const Image& rImage = aEntryImages.GetImage( nImgId ); - rRet <<= uno::Reference< awt::XBitmap > (VCLUnoHelper::CreateBitmap( rImage.GetBitmapEx() )); - } -} - -uno::Any SAL_CALL ScLinkTargetTypeObj::getPropertyValue(const rtl::OUString& PropertyName) - throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException ) -{ - uno::Any aRet; - String aNameStr(PropertyName); - if ( aNameStr.EqualsAscii( SC_UNO_LINKDISPBIT ) ) - SetLinkTargetBitmap( aRet, nType ); - else if ( aNameStr.EqualsAscii( SC_UNO_LINKDISPNAME ) ) - aRet <<= rtl::OUString( aName ); - - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScLinkTargetTypeObj ) - -//------------------------------------------------------------------------ - -ScLinkTargetsObj::ScLinkTargetsObj( const uno::Reference< container::XNameAccess > & rColl ) : - xCollection( rColl ) -{ - OSL_ENSURE( xCollection.is(), "ScLinkTargetsObj: NULL" ); -} - -ScLinkTargetsObj::~ScLinkTargetsObj() -{ -} - -// container::XNameAccess - -uno::Any SAL_CALL ScLinkTargetsObj::getByName(const rtl::OUString& aName) - throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException ) -{ - uno::Reference< beans::XPropertySet > xProp( ScUnoHelpFunctions::AnyToInterface( xCollection->getByName(aName) ), uno::UNO_QUERY ); - if (xProp.is()) - return uno::makeAny(xProp); - - throw container::NoSuchElementException(); -// return uno::Any(); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScLinkTargetsObj::getElementNames(void) throw( uno::RuntimeException ) -{ - return xCollection->getElementNames(); -} - -sal_Bool SAL_CALL ScLinkTargetsObj::hasByName(const rtl::OUString& aName) throw( uno::RuntimeException ) -{ - return xCollection->hasByName(aName); -} - -// container::XElementAccess - -uno::Type SAL_CALL ScLinkTargetsObj::getElementType(void) throw( uno::RuntimeException ) -{ - return ::getCppuType((const uno::Reference< beans::XPropertySet >*)0); -} - -sal_Bool SAL_CALL ScLinkTargetsObj::hasElements(void) throw( uno::RuntimeException ) -{ - return xCollection->hasElements(); -} - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/textuno.cxx b/sc/source/ui/unoobj/textuno.cxx deleted file mode 100644 index ffe1b7d5d..000000000 --- a/sc/source/ui/unoobj/textuno.cxx +++ /dev/null @@ -1,1114 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - - -#include "scitems.hxx" -#include <editeng/eeitem.hxx> -#include <svx/svdpool.hxx> -#include <svx/svdobj.hxx> -#include <editeng/editeng.hxx> -#include <editeng/editobj.hxx> -#include <editeng/flditem.hxx> -#include <svx/unomid.hxx> -#include <editeng/unoprnms.hxx> -#include <editeng/unofored.hxx> -#include <vcl/virdev.hxx> -#include <vcl/svapp.hxx> -#include <com/sun/star/awt/FontSlant.hpp> - -#include <com/sun/star/beans/PropertyAttribute.hpp> -#include <editeng/unoipset.hxx> -#include "textuno.hxx" -#include "fielduno.hxx" -#include "servuno.hxx" -#include "editsrc.hxx" -#include "docsh.hxx" -#include "editutil.hxx" -#include "miscuno.hxx" -#include "cellsuno.hxx" -#include "hints.hxx" -#include "patattr.hxx" -#include "cell.hxx" -#include "docfunc.hxx" -#include "scmod.hxx" - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -const SvxItemPropertySet * lcl_GetHdFtPropertySet() -{ - static SfxItemPropertyMapEntry aHdFtPropertyMap_Impl[] = - { - SVX_UNOEDIT_CHAR_PROPERTIES, - SVX_UNOEDIT_FONT_PROPERTIES, - SVX_UNOEDIT_PARA_PROPERTIES, - SVX_UNOEDIT_NUMBERING_PROPERTIE, // for completeness of service ParagraphProperties - {0,0,0,0,0,0} - }; - static sal_Bool bTwipsSet = false; - - if (!bTwipsSet) - { - // modify PropertyMap to include CONVERT_TWIPS flag for font height - // (headers/footers are in twips) - - SfxItemPropertyMapEntry* pEntry = aHdFtPropertyMap_Impl; - while (pEntry->pName) - { - if ( ( pEntry->nWID == EE_CHAR_FONTHEIGHT || - pEntry->nWID == EE_CHAR_FONTHEIGHT_CJK || - pEntry->nWID == EE_CHAR_FONTHEIGHT_CTL ) && - pEntry->nMemberId == MID_FONTHEIGHT ) - { - pEntry->nMemberId |= CONVERT_TWIPS; - } - - ++pEntry; - } - bTwipsSet = sal_True; - } - static SvxItemPropertySet aHdFtPropertySet_Impl( aHdFtPropertyMap_Impl, SdrObject::GetGlobalDrawObjectItemPool() ); - return &aHdFtPropertySet_Impl; -} - -//------------------------------------------------------------------------ - -SC_SIMPLE_SERVICE_INFO( ScHeaderFooterContentObj, "ScHeaderFooterContentObj", "com.sun.star.sheet.HeaderFooterContent" ) -SC_SIMPLE_SERVICE_INFO( ScHeaderFooterTextObj, "ScHeaderFooterTextObj", "stardiv.one.Text.Text" ) - -//------------------------------------------------------------------------ - -ScHeaderFooterContentObj::ScHeaderFooterContentObj( const EditTextObject* pLeft, - const EditTextObject* pCenter, - const EditTextObject* pRight ) : - pLeftText ( NULL ), - pCenterText ( NULL ), - pRightText ( NULL ) -{ - if ( pLeft ) - pLeftText = pLeft->Clone(); - if ( pCenter ) - pCenterText = pCenter->Clone(); - if ( pRight ) - pRightText = pRight->Clone(); -} - -ScHeaderFooterContentObj::~ScHeaderFooterContentObj() -{ - delete pLeftText; - delete pCenterText; - delete pRightText; -} - -void ScHeaderFooterContentObj::AddListener( SfxListener& rListener ) -{ - rListener.StartListening( aBC ); -} - -void ScHeaderFooterContentObj::RemoveListener( SfxListener& rListener ) -{ - rListener.EndListening( aBC ); -} - -void ScHeaderFooterContentObj::UpdateText( sal_uInt16 nPart, EditEngine& rSource ) -{ - EditTextObject* pNew = rSource.CreateTextObject(); - switch (nPart) - { - case SC_HDFT_LEFT: - delete pLeftText; - pLeftText = pNew; - break; - case SC_HDFT_CENTER: - delete pCenterText; - pCenterText = pNew; - break; - default: // SC_HDFT_RIGHT - delete pRightText; - pRightText = pNew; - break; - } - - aBC.Broadcast( ScHeaderFooterChangedHint( nPart ) ); -} - -// XHeaderFooterContent - -uno::Reference<text::XText> SAL_CALL ScHeaderFooterContentObj::getLeftText() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScHeaderFooterTextObj( *this, SC_HDFT_LEFT ); -} - -uno::Reference<text::XText> SAL_CALL ScHeaderFooterContentObj::getCenterText() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScHeaderFooterTextObj( *this, SC_HDFT_CENTER ); -} - -uno::Reference<text::XText> SAL_CALL ScHeaderFooterContentObj::getRightText() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScHeaderFooterTextObj( *this, SC_HDFT_RIGHT ); -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScHeaderFooterContentObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScHeaderFooterContentObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScHeaderFooterContentObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScHeaderFooterContentObj::getUnoTunnelId() -{ - return theScHeaderFooterContentObjUnoTunnelId::get().getSeq(); -} - -ScHeaderFooterContentObj* ScHeaderFooterContentObj::getImplementation( - const uno::Reference<sheet::XHeaderFooterContent> xObj ) -{ - ScHeaderFooterContentObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScHeaderFooterContentObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - - -//------------------------------------------------------------------------ - -ScHeaderFooterTextData::ScHeaderFooterTextData( ScHeaderFooterContentObj& rContent, - sal_uInt16 nP ) : - rContentObj( rContent ), - nPart( nP ), - pEditEngine( NULL ), - pForwarder( NULL ), - bDataValid( false ), - bInUpdate( false ) -{ - rContentObj.acquire(); // must not go away - rContentObj.AddListener( *this ); -} - -ScHeaderFooterTextData::~ScHeaderFooterTextData() -{ - SolarMutexGuard aGuard; // needed for EditEngine dtor - - rContentObj.RemoveListener( *this ); - - delete pForwarder; - delete pEditEngine; - - rContentObj.release(); -} - -void ScHeaderFooterTextData::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScHeaderFooterChangedHint ) ) - { - if ( ((const ScHeaderFooterChangedHint&)rHint).GetPart() == nPart ) - { - if (!bInUpdate) // not for own updates - bDataValid = false; // text has to be fetched again - } - } -} - -SvxTextForwarder* ScHeaderFooterTextData::GetTextForwarder() -{ - if (!pEditEngine) - { - SfxItemPool* pEnginePool = EditEngine::CreatePool(); - pEnginePool->FreezeIdRanges(); - ScHeaderEditEngine* pHdrEngine = new ScHeaderEditEngine( pEnginePool, sal_True ); - - pHdrEngine->EnableUndo( false ); - pHdrEngine->SetRefMapMode( MAP_TWIP ); - - // default font must be set, independently of document - // -> use global pool from module - - SfxItemSet aDefaults( pHdrEngine->GetEmptyItemSet() ); - const ScPatternAttr& rPattern = (const ScPatternAttr&)SC_MOD()->GetPool().GetDefaultItem(ATTR_PATTERN); - rPattern.FillEditItemSet( &aDefaults ); - // FillEditItemSet adjusts font height to 1/100th mm, - // but for header/footer twips is needed, as in the PatternAttr: - aDefaults.Put( rPattern.GetItem(ATTR_FONT_HEIGHT), EE_CHAR_FONTHEIGHT ); - aDefaults.Put( rPattern.GetItem(ATTR_CJK_FONT_HEIGHT), EE_CHAR_FONTHEIGHT_CJK ); - aDefaults.Put( rPattern.GetItem(ATTR_CTL_FONT_HEIGHT), EE_CHAR_FONTHEIGHT_CTL ); - pHdrEngine->SetDefaults( aDefaults ); - - ScHeaderFieldData aData; - ScHeaderFooterTextObj::FillDummyFieldData( aData ); - pHdrEngine->SetData( aData ); - - pEditEngine = pHdrEngine; - pForwarder = new SvxEditEngineForwarder(*pEditEngine); - } - - if (bDataValid) - return pForwarder; - - const EditTextObject* pData; - if (nPart == SC_HDFT_LEFT) - pData = rContentObj.GetLeftEditObject(); - else if (nPart == SC_HDFT_CENTER) - pData = rContentObj.GetCenterEditObject(); - else - pData = rContentObj.GetRightEditObject(); - - if (pData) - pEditEngine->SetText(*pData); - - bDataValid = sal_True; - return pForwarder; -} - -void ScHeaderFooterTextData::UpdateData() -{ - if ( pEditEngine ) - { - bInUpdate = sal_True; // don't reset bDataValid during UpdateText - - rContentObj.UpdateText( nPart, *pEditEngine ); - - bInUpdate = false; - } -} - -//------------------------------------------------------------------------ - -ScHeaderFooterTextObj::ScHeaderFooterTextObj( ScHeaderFooterContentObj& rContent, - sal_uInt16 nP ) : - aTextData( rContent, nP ), - pUnoText( NULL ) -{ - // ScHeaderFooterTextData acquires rContent - // pUnoText is created on demand (getString/setString work without it) -} - -void ScHeaderFooterTextObj::CreateUnoText_Impl() -{ - if ( !pUnoText ) - { - // can't be aggregated because getString/setString is handled here - ScSharedHeaderFooterEditSource aEditSource( &aTextData ); - pUnoText = new SvxUnoText( &aEditSource, lcl_GetHdFtPropertySet(), uno::Reference<text::XText>() ); - pUnoText->acquire(); - } -} - -ScHeaderFooterTextObj::~ScHeaderFooterTextObj() -{ - if (pUnoText) - pUnoText->release(); -} - -const SvxUnoText& ScHeaderFooterTextObj::GetUnoText() -{ - if (!pUnoText) - CreateUnoText_Impl(); - return *pUnoText; -} - -// XText - -uno::Reference<text::XTextCursor> SAL_CALL ScHeaderFooterTextObj::createTextCursor() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScHeaderFooterTextCursor( *this ); -} - -uno::Reference<text::XTextCursor> SAL_CALL ScHeaderFooterTextObj::createTextCursorByRange( - const uno::Reference<text::XTextRange>& aTextPosition ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pUnoText) - CreateUnoText_Impl(); - return pUnoText->createTextCursorByRange(aTextPosition); - //! wie ScCellObj::createTextCursorByRange, wenn SvxUnoTextRange_getReflection verfuegbar -} - -void ScHeaderFooterTextObj::FillDummyFieldData( ScHeaderFieldData& rData ) -{ - String aDummy(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( "???" ))); - rData.aTitle = aDummy; - rData.aLongDocName = aDummy; - rData.aShortDocName = aDummy; - rData.aTabName = aDummy; - rData.nPageNo = 1; - rData.nTotalPages = 99; -} - -rtl::OUString SAL_CALL ScHeaderFooterTextObj::getString() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - rtl::OUString aRet; - const EditTextObject* pData; - - sal_uInt16 nPart = aTextData.GetPart(); - ScHeaderFooterContentObj& rContentObj = aTextData.GetContentObj(); - - if (nPart == SC_HDFT_LEFT) - pData = rContentObj.GetLeftEditObject(); - else if (nPart == SC_HDFT_CENTER) - pData = rContentObj.GetCenterEditObject(); - else - pData = rContentObj.GetRightEditObject(); - if (pData) - { - // for pure text, no font info is needed in pool defaults - ScHeaderEditEngine aEditEngine( EditEngine::CreatePool(), sal_True ); - - ScHeaderFieldData aData; - FillDummyFieldData( aData ); - aEditEngine.SetData( aData ); - - aEditEngine.SetText(*pData); - aRet = ScEditUtil::GetSpaceDelimitedString( aEditEngine ); - } - return aRet; -} - -void SAL_CALL ScHeaderFooterTextObj::setString( const rtl::OUString& aText ) throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aText); - - // for pure text, no font info is needed in pool defaults - ScHeaderEditEngine aEditEngine( EditEngine::CreatePool(), sal_True ); - aEditEngine.SetText( aString ); - - aTextData.GetContentObj().UpdateText( aTextData.GetPart(), aEditEngine ); -} - -void SAL_CALL ScHeaderFooterTextObj::insertString( const uno::Reference<text::XTextRange>& xRange, - const rtl::OUString& aString, sal_Bool bAbsorb ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pUnoText) - CreateUnoText_Impl(); - pUnoText->insertString( xRange, aString, bAbsorb ); -} - -void SAL_CALL ScHeaderFooterTextObj::insertControlCharacter( - const uno::Reference<text::XTextRange>& xRange, - sal_Int16 nControlCharacter, sal_Bool bAbsorb ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pUnoText) - CreateUnoText_Impl(); - pUnoText->insertControlCharacter( xRange, nControlCharacter, bAbsorb ); -} - -void SAL_CALL ScHeaderFooterTextObj::insertTextContent( - const uno::Reference<text::XTextRange >& xRange, - const uno::Reference<text::XTextContent >& xContent, - sal_Bool bAbsorb ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( xContent.is() && xRange.is() ) - { - ScHeaderFieldObj* pHeaderField = ScHeaderFieldObj::getImplementation( xContent ); - - SvxUnoTextRangeBase* pTextRange = - ScHeaderFooterTextCursor::getImplementation( xRange ); - - if ( pHeaderField && !pHeaderField->IsInserted() && pTextRange ) - { - SvxEditSource* pEditSource = pTextRange->GetEditSource(); - ESelection aSelection(pTextRange->GetSelection()); - - if (!bAbsorb) - { - // don't replace -> append at end - aSelection.Adjust(); - aSelection.nStartPara = aSelection.nEndPara; - aSelection.nStartPos = aSelection.nEndPos; - } - - SvxFieldItem aItem(pHeaderField->CreateFieldItem()); - - SvxTextForwarder* pForwarder = pEditSource->GetTextForwarder(); - pForwarder->QuickInsertField( aItem, aSelection ); - pEditSource->UpdateData(); - - // neue Selektion: ein Zeichen - aSelection.Adjust(); - aSelection.nEndPara = aSelection.nStartPara; - aSelection.nEndPos = aSelection.nStartPos + 1; - pHeaderField->InitDoc( &aTextData.GetContentObj(), aTextData.GetPart(), aSelection ); - - // for bAbsorb=FALSE, the new selection must be behind the inserted content - // (the xml filter relies on this) - if (!bAbsorb) - aSelection.nStartPos = aSelection.nEndPos; - - pTextRange->SetSelection( aSelection ); - - return; - } - } - - if (!pUnoText) - CreateUnoText_Impl(); - pUnoText->insertTextContent( xRange, xContent, bAbsorb ); -} - -void SAL_CALL ScHeaderFooterTextObj::removeTextContent( - const uno::Reference<text::XTextContent>& xContent ) - throw(container::NoSuchElementException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if ( xContent.is() ) - { - ScHeaderFieldObj* pHeaderField = ScHeaderFieldObj::getImplementation( xContent ); - if ( pHeaderField && pHeaderField->IsInserted() ) - { - //! Testen, ob das Feld in dieser Zelle ist - pHeaderField->DeleteField(); - return; - } - } - if (!pUnoText) - CreateUnoText_Impl(); - pUnoText->removeTextContent( xContent ); -} - -uno::Reference<text::XText> SAL_CALL ScHeaderFooterTextObj::getText() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pUnoText) - CreateUnoText_Impl(); - return pUnoText->getText(); -} - -uno::Reference<text::XTextRange> SAL_CALL ScHeaderFooterTextObj::getStart() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pUnoText) - CreateUnoText_Impl(); - return pUnoText->getStart(); -} - -uno::Reference<text::XTextRange> SAL_CALL ScHeaderFooterTextObj::getEnd() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pUnoText) - CreateUnoText_Impl(); - return pUnoText->getEnd(); -} - -// XTextFieldsSupplier - -uno::Reference<container::XEnumerationAccess> SAL_CALL ScHeaderFooterTextObj::getTextFields() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // all fields - return new ScHeaderFieldsObj( &aTextData.GetContentObj(), aTextData.GetPart(), SC_SERVICE_INVALID ); -} - -uno::Reference<container::XNameAccess> SAL_CALL ScHeaderFooterTextObj::getTextFieldMasters() - throw(uno::RuntimeException) -{ - // sowas gibts nicht im Calc (?) - return NULL; -} - -// XTextRangeMover - -void SAL_CALL ScHeaderFooterTextObj::moveTextRange( - const uno::Reference<text::XTextRange>& xRange, - sal_Int16 nParagraphs ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pUnoText) - CreateUnoText_Impl(); - pUnoText->moveTextRange( xRange, nParagraphs ); -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScHeaderFooterTextObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pUnoText) - CreateUnoText_Impl(); - return pUnoText->createEnumeration(); -} - -// XElementAccess - -uno::Type SAL_CALL ScHeaderFooterTextObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pUnoText) - CreateUnoText_Impl(); - return pUnoText->getElementType(); -} - -sal_Bool SAL_CALL ScHeaderFooterTextObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (!pUnoText) - CreateUnoText_Impl(); - return pUnoText->hasElements(); -} - -//------------------------------------------------------------------------ - -ScCellTextCursor::ScCellTextCursor(const ScCellTextCursor& rOther) : - SvxUnoTextCursor( rOther ), - rTextObj( rOther.rTextObj ) -{ - rTextObj.acquire(); -} - -ScCellTextCursor::ScCellTextCursor(ScCellObj& rText) : - SvxUnoTextCursor( rText.GetUnoText() ), - rTextObj( rText ) -{ - rTextObj.acquire(); -} - -ScCellTextCursor::~ScCellTextCursor() throw() -{ - rTextObj.release(); -} - -// SvxUnoTextCursor methods reimplemented here to return the right objects: - -uno::Reference<text::XText> SAL_CALL ScCellTextCursor::getText() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return &rTextObj; -} - -uno::Reference<text::XTextRange> SAL_CALL ScCellTextCursor::getStart() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! use other object for range than cursor? - - ScCellTextCursor* pNew = new ScCellTextCursor( *this ); - uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) ); - - ESelection aNewSel(GetSelection()); - aNewSel.nEndPara = aNewSel.nStartPara; - aNewSel.nEndPos = aNewSel.nStartPos; - pNew->SetSelection( aNewSel ); - - return xRange; -} - -uno::Reference<text::XTextRange> SAL_CALL ScCellTextCursor::getEnd() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! use other object for range than cursor? - - ScCellTextCursor* pNew = new ScCellTextCursor( *this ); - uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) ); - - ESelection aNewSel(GetSelection()); - aNewSel.nStartPara = aNewSel.nEndPara; - aNewSel.nStartPos = aNewSel.nEndPos; - pNew->SetSelection( aNewSel ); - - return xRange; -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScCellTextCursor::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return SvxUnoTextCursor::getSomething( rId ); -} - -namespace -{ - class theScCellTextCursorUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScCellTextCursorUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScCellTextCursor::getUnoTunnelId() -{ - return theScCellTextCursorUnoTunnelId::get().getSeq(); -} - -ScCellTextCursor* ScCellTextCursor::getImplementation( const uno::Reference<uno::XInterface> xObj ) -{ - ScCellTextCursor* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScCellTextCursor*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -//------------------------------------------------------------------------ - -ScHeaderFooterTextCursor::ScHeaderFooterTextCursor(const ScHeaderFooterTextCursor& rOther) : - SvxUnoTextCursor( rOther ), - rTextObj( rOther.rTextObj ) -{ - rTextObj.acquire(); -} - -ScHeaderFooterTextCursor::ScHeaderFooterTextCursor(ScHeaderFooterTextObj& rText) : - SvxUnoTextCursor( rText.GetUnoText() ), - rTextObj( rText ) -{ - rTextObj.acquire(); -} - -ScHeaderFooterTextCursor::~ScHeaderFooterTextCursor() throw() -{ - rTextObj.release(); -} - -// SvxUnoTextCursor methods reimplemented here to return the right objects: - -uno::Reference<text::XText> SAL_CALL ScHeaderFooterTextCursor::getText() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return &rTextObj; -} - -uno::Reference<text::XTextRange> SAL_CALL ScHeaderFooterTextCursor::getStart() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! use other object for range than cursor? - - ScHeaderFooterTextCursor* pNew = new ScHeaderFooterTextCursor( *this ); - uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) ); - - ESelection aNewSel(GetSelection()); - aNewSel.nEndPara = aNewSel.nStartPara; - aNewSel.nEndPos = aNewSel.nStartPos; - pNew->SetSelection( aNewSel ); - - return xRange; -} - -uno::Reference<text::XTextRange> SAL_CALL ScHeaderFooterTextCursor::getEnd() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! use other object for range than cursor? - - ScHeaderFooterTextCursor* pNew = new ScHeaderFooterTextCursor( *this ); - uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) ); - - ESelection aNewSel(GetSelection()); - aNewSel.nStartPara = aNewSel.nEndPara; - aNewSel.nStartPos = aNewSel.nEndPos; - pNew->SetSelection( aNewSel ); - - return xRange; -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScHeaderFooterTextCursor::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return SvxUnoTextCursor::getSomething( rId ); -} - -namespace -{ - class theScHeaderFooterTextCursorUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScHeaderFooterTextCursorUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScHeaderFooterTextCursor::getUnoTunnelId() -{ - return theScHeaderFooterTextCursorUnoTunnelId::get().getSeq(); -} - -ScHeaderFooterTextCursor* ScHeaderFooterTextCursor::getImplementation( - const uno::Reference<uno::XInterface> xObj ) -{ - ScHeaderFooterTextCursor* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScHeaderFooterTextCursor*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -//------------------------------------------------------------------------ - -ScDrawTextCursor::ScDrawTextCursor(const ScDrawTextCursor& rOther) : - SvxUnoTextCursor( rOther ), - xParentText( rOther.xParentText ) -{ -} - -ScDrawTextCursor::ScDrawTextCursor( const uno::Reference<text::XText>& xParent, - const SvxUnoTextBase& rText ) : - SvxUnoTextCursor( rText ), - xParentText( xParent ) - -{ -} - -ScDrawTextCursor::~ScDrawTextCursor() throw() -{ -} - -// SvxUnoTextCursor methods reimplemented here to return the right objects: - -uno::Reference<text::XText> SAL_CALL ScDrawTextCursor::getText() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return xParentText; -} - -uno::Reference<text::XTextRange> SAL_CALL ScDrawTextCursor::getStart() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! use other object for range than cursor? - - ScDrawTextCursor* pNew = new ScDrawTextCursor( *this ); - uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) ); - - ESelection aNewSel(GetSelection()); - aNewSel.nEndPara = aNewSel.nStartPara; - aNewSel.nEndPos = aNewSel.nStartPos; - pNew->SetSelection( aNewSel ); - - return xRange; -} - -uno::Reference<text::XTextRange> SAL_CALL ScDrawTextCursor::getEnd() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - //! use other object for range than cursor? - - ScDrawTextCursor* pNew = new ScDrawTextCursor( *this ); - uno::Reference<text::XTextRange> xRange( static_cast<SvxUnoTextRangeBase*>(pNew) ); - - ESelection aNewSel(GetSelection()); - aNewSel.nStartPara = aNewSel.nEndPara; - aNewSel.nStartPos = aNewSel.nEndPos; - pNew->SetSelection( aNewSel ); - - return xRange; -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScDrawTextCursor::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return SvxUnoTextCursor::getSomething( rId ); -} - -namespace -{ - class theScDrawTextCursorUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScDrawTextCursorUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScDrawTextCursor::getUnoTunnelId() -{ - return theScDrawTextCursorUnoTunnelId::get().getSeq(); -} - -ScDrawTextCursor* ScDrawTextCursor::getImplementation( const uno::Reference<uno::XInterface> xObj ) -{ - ScDrawTextCursor* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScDrawTextCursor*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -//------------------------------------------------------------------------ - -ScSimpleEditSourceHelper::ScSimpleEditSourceHelper() -{ - SfxItemPool* pEnginePool = EditEngine::CreatePool(); - pEnginePool->SetDefaultMetric( SFX_MAPUNIT_100TH_MM ); - pEnginePool->FreezeIdRanges(); - - pEditEngine = new ScFieldEditEngine( pEnginePool, NULL, sal_True ); // TRUE: become owner of pool - pForwarder = new SvxEditEngineForwarder( *pEditEngine ); - pOriginalSource = new ScSimpleEditSource( pForwarder ); -} - -ScSimpleEditSourceHelper::~ScSimpleEditSourceHelper() -{ - SolarMutexGuard aGuard; // needed for EditEngine dtor - - delete pOriginalSource; - delete pForwarder; - delete pEditEngine; -} - -ScEditEngineTextObj::ScEditEngineTextObj() : - SvxUnoText( GetOriginalSource(), ScCellObj::GetEditPropertySet(), uno::Reference<text::XText>() ) -{ -} - -ScEditEngineTextObj::~ScEditEngineTextObj() throw() -{ -} - -void ScEditEngineTextObj::SetText( const EditTextObject& rTextObject ) -{ - GetEditEngine()->SetText( rTextObject ); - - ESelection aSel; - ::GetSelection( aSel, GetEditSource()->GetTextForwarder() ); - SetSelection( aSel ); -} - -EditTextObject* ScEditEngineTextObj::CreateTextObject() -{ - return GetEditEngine()->CreateTextObject(); -} - -//------------------------------------------------------------------------ - -ScCellTextData::ScCellTextData(ScDocShell* pDocSh, const ScAddress& rP) : - pDocShell( pDocSh ), - aCellPos( rP ), - pEditEngine( NULL ), - pForwarder( NULL ), - pOriginalSource( NULL ), - bDataValid( false ), - bInUpdate( false ), - bDirty( false ), - bDoUpdate( sal_True ) -{ - if (pDocShell) - pDocShell->GetDocument()->AddUnoObject(*this); -} - -ScCellTextData::~ScCellTextData() -{ - SolarMutexGuard aGuard; // needed for EditEngine dtor - - if (pDocShell) - { - pDocShell->GetDocument()->RemoveUnoObject(*this); - pDocShell->GetDocument()->DisposeFieldEditEngine(pEditEngine); - } - else - delete pEditEngine; - - delete pForwarder; - - delete pOriginalSource; -} - -ScSharedCellEditSource* ScCellTextData::GetOriginalSource() -{ - if (!pOriginalSource) - pOriginalSource = new ScSharedCellEditSource( this ); - return pOriginalSource; -} - -void ScCellTextData::GetCellText(const ScAddress& rCellPos, String& rText) -{ - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - pDoc->GetInputString( rCellPos.Col(), rCellPos.Row(), rCellPos.Tab(), rText ); - } -} - -SvxTextForwarder* ScCellTextData::GetTextForwarder() -{ - if (!pEditEngine) - { - if ( pDocShell ) - { - ScDocument* pDoc = pDocShell->GetDocument(); - pEditEngine = pDoc->CreateFieldEditEngine(); - } - else - { - SfxItemPool* pEnginePool = EditEngine::CreatePool(); - pEnginePool->FreezeIdRanges(); - pEditEngine = new ScFieldEditEngine( pEnginePool, NULL, sal_True ); - } - // currently, GetPortions doesn't work if UpdateMode is sal_False, - // this will be fixed (in EditEngine) by src600 -// pEditEngine->SetUpdateMode( sal_False ); - pEditEngine->EnableUndo( false ); - if (pDocShell) - pEditEngine->SetRefDevice(pDocShell->GetRefDevice()); - else - pEditEngine->SetRefMapMode( MAP_100TH_MM ); - pForwarder = new SvxEditEngineForwarder(*pEditEngine); - } - - if (bDataValid) - return pForwarder; - - String aText; - - if (pDocShell) - { - ScDocument* pDoc = pDocShell->GetDocument(); - - SfxItemSet aDefaults( pEditEngine->GetEmptyItemSet() ); - if( const ScPatternAttr* pPattern = - pDoc->GetPattern( aCellPos.Col(), aCellPos.Row(), aCellPos.Tab() ) ) - { - pPattern->FillEditItemSet( &aDefaults ); - pPattern->FillEditParaItems( &aDefaults ); // including alignment etc. (for reading) - } - - const ScBaseCell* pCell = pDoc->GetCell( aCellPos ); - if ( pCell && pCell->GetCellType() == CELLTYPE_EDIT ) - pEditEngine->SetTextNewDefaults( *((const ScEditCell*)pCell)->GetData(), aDefaults ); - else - { - GetCellText( aCellPos, aText ); - if (aText.Len()) - pEditEngine->SetTextNewDefaults( aText, aDefaults ); - else - pEditEngine->SetDefaults(aDefaults); - } - } - - bDataValid = sal_True; - return pForwarder; -} - -void ScCellTextData::UpdateData() -{ - if ( bDoUpdate ) - { - OSL_ENSURE(pEditEngine != NULL, "no EditEngine for UpdateData()"); - if ( pDocShell && pEditEngine ) - { - // during the own UpdateData call, bDataValid must not be reset, - // or things like attributes after the text would be lost - // (are not stored in the cell) - - bInUpdate = sal_True; // prevents bDataValid from being reset - - ScDocFunc aFunc(*pDocShell); - aFunc.PutData( aCellPos, *pEditEngine, false, sal_True ); // always as text - - bInUpdate = false; - bDirty = false; - } - } - else - bDirty = sal_True; -} - -void ScCellTextData::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( ScUpdateRefHint ) ) - { -// const ScUpdateRefHint& rRef = (const ScUpdateRefHint&)rHint; - - //! Ref-Update - } - else if ( rHint.ISA( SfxSimpleHint ) ) - { - sal_uLong nId = ((const SfxSimpleHint&)rHint).GetId(); - if ( nId == SFX_HINT_DYING ) - { - pDocShell = NULL; // invalid now - - DELETEZ( pForwarder ); - DELETEZ( pEditEngine ); // EditEngine uses document's pool - } - else if ( nId == SFX_HINT_DATACHANGED ) - { - if (!bInUpdate) // not for own UpdateData calls - bDataValid = false; // text has to be read from the cell again - } - } -} - -ScCellTextObj::ScCellTextObj(ScDocShell* pDocSh, const ScAddress& rP) : - ScCellTextData( pDocSh, rP ), - SvxUnoText( GetOriginalSource(), ScCellObj::GetEditPropertySet(), uno::Reference<text::XText>() ) -{ -} - -ScCellTextObj::~ScCellTextObj() throw() -{ -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/tokenuno.cxx b/sc/source/ui/unoobj/tokenuno.cxx deleted file mode 100644 index 5f89de8d9..000000000 --- a/sc/source/ui/unoobj/tokenuno.cxx +++ /dev/null @@ -1,475 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include "tokenuno.hxx" - -#include <sal/macros.h> - -#include <com/sun/star/sheet/ComplexReference.hpp> -#include <com/sun/star/sheet/ExternalReference.hpp> -#include <com/sun/star/sheet/ReferenceFlags.hpp> -#include <com/sun/star/sheet/AddressConvention.hpp> -#include <com/sun/star/sheet/NameToken.hpp> -#include <com/sun/star/table/CellAddress.hpp> - -#include <svl/itemprop.hxx> -#include <vcl/svapp.hxx> - -#include "miscuno.hxx" -#include "convuno.hxx" -#include "unonames.hxx" -#include "token.hxx" -#include "compiler.hxx" -#include "tokenarray.hxx" -#include "docsh.hxx" -#include "rangeseq.hxx" -#include "externalrefmgr.hxx" - -using namespace ::formula; -using namespace ::com::sun::star; - -// ============================================================================ - -const SfxItemPropertyMapEntry* lcl_GetFormulaParserMap() -{ - static SfxItemPropertyMapEntry aFormulaParserMap_Impl[] = - { - {MAP_CHAR_LEN(SC_UNO_COMPILEFAP), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_COMPILEENGLISH), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_IGNORELEADING), 0, &getBooleanCppuType(), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_FORMULACONVENTION), 0, &getCppuType(&sheet::AddressConvention::UNSPECIFIED), 0, 0 }, - {MAP_CHAR_LEN(SC_UNO_OPCODEMAP), 0, &getCppuType((uno::Sequence< sheet::FormulaOpCodeMapEntry >*)0), 0, 0 }, - {0,0,0,0,0,0} - }; - return aFormulaParserMap_Impl; -} - -SC_SIMPLE_SERVICE_INFO( ScFormulaParserObj, "ScFormulaParserObj", SC_SERVICENAME_FORMULAPARS ) - -// ============================================================================ - -ScFormulaParserObj::ScFormulaParserObj(ScDocShell* pDocSh) : - mpDocShell( pDocSh ), - mnConv( sheet::AddressConvention::UNSPECIFIED ), - mbEnglish( false ), - mbIgnoreSpaces( true ), - mbCompileFAP( false ) -{ - mpDocShell->GetDocument()->AddUnoObject(*this); -} - -ScFormulaParserObj::~ScFormulaParserObj() -{ - if (mpDocShell) - mpDocShell->GetDocument()->RemoveUnoObject(*this); -} - -void ScFormulaParserObj::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - mpDocShell = NULL; -} - -// XFormulaParser - -void ScFormulaParserObj::SetCompilerFlags( ScCompiler& rCompiler ) const -{ - static const formula::FormulaGrammar::AddressConvention aConvMap[] = { - formula::FormulaGrammar::CONV_OOO, // <- AddressConvention::OOO - formula::FormulaGrammar::CONV_XL_A1, // <- AddressConvention::XL_A1 - formula::FormulaGrammar::CONV_XL_R1C1, // <- AddressConvention::XL_R1C1 - formula::FormulaGrammar::CONV_XL_OOX, // <- AddressConvention::XL_OOX - formula::FormulaGrammar::CONV_LOTUS_A1 // <- AddressConvention::LOTUS_A1 - }; - static const sal_Int16 nConvMapCount = SAL_N_ELEMENTS(aConvMap); - - // If mxOpCodeMap is not empty it overrides mbEnglish, and vice versa. We - // don't need to initialize things twice. - if (mxOpCodeMap.get()) - rCompiler.SetFormulaLanguage( mxOpCodeMap ); - else - { - sal_Int32 nFormulaLanguage = mbEnglish ? - sheet::FormulaLanguage::ENGLISH : - sheet::FormulaLanguage::NATIVE; - ScCompiler::OpCodeMapPtr xMap = rCompiler.GetOpCodeMap( nFormulaLanguage); - rCompiler.SetFormulaLanguage( xMap); - } - - formula::FormulaGrammar::AddressConvention eConv = formula::FormulaGrammar::CONV_UNSPECIFIED; - if (mnConv >= 0 && mnConv < nConvMapCount) - eConv = aConvMap[mnConv]; - - rCompiler.SetRefConvention( eConv ); - - rCompiler.SetCompileForFAP(mbCompileFAP); - - rCompiler.SetExternalLinks( maExternalLinks); -} - -uno::Sequence<sheet::FormulaToken> SAL_CALL ScFormulaParserObj::parseFormula( - const rtl::OUString& aFormula, const table::CellAddress& rReferencePos ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Sequence<sheet::FormulaToken> aRet; - - if (mpDocShell) - { - ScDocument* pDoc = mpDocShell->GetDocument(); - ScExternalRefManager::ApiGuard aExtRefGuard(pDoc); - - ScAddress aRefPos( ScAddress::UNINITIALIZED ); - ScUnoConversion::FillScAddress( aRefPos, rReferencePos ); - ScCompiler aCompiler( pDoc, aRefPos); - aCompiler.SetGrammar(pDoc->GetGrammar()); - SetCompilerFlags( aCompiler ); - - ScTokenArray* pCode = aCompiler.CompileString( aFormula ); - (void)ScTokenConversion::ConvertToTokenSequence( *pDoc, aRet, *pCode ); - delete pCode; - } - - return aRet; -} - -rtl::OUString SAL_CALL ScFormulaParserObj::printFormula( - const uno::Sequence<sheet::FormulaToken>& aTokens, const table::CellAddress& rReferencePos ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - rtl::OUString aRet; - - if (mpDocShell) - { - ScDocument* pDoc = mpDocShell->GetDocument(); - ScTokenArray aCode; - (void)ScTokenConversion::ConvertToTokenArray( *pDoc, aCode, aTokens ); - ScAddress aRefPos( ScAddress::UNINITIALIZED ); - ScUnoConversion::FillScAddress( aRefPos, rReferencePos ); - ScCompiler aCompiler( pDoc, aRefPos, aCode); - aCompiler.SetGrammar(pDoc->GetGrammar()); - SetCompilerFlags( aCompiler ); - - rtl::OUStringBuffer aBuffer; - aCompiler.CreateStringFromTokenArray( aBuffer ); - aRet = aBuffer.makeStringAndClear(); - } - - return aRet; -} - -// XPropertySet - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScFormulaParserObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference< beans::XPropertySetInfo > aRef(new SfxItemPropertySetInfo( lcl_GetFormulaParserMap() )); - return aRef; -} - -void SAL_CALL ScFormulaParserObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aPropertyName); - if ( aString.EqualsAscii( SC_UNO_COMPILEFAP ) ) - { - aValue >>= mbCompileFAP; - } - else if ( aString.EqualsAscii( SC_UNO_COMPILEENGLISH ) ) - { - bool bOldEnglish = mbEnglish; - if (aValue >>= mbEnglish) - { - // Need to recreate the symbol map to change English property - // because the map is const. So for performance reasons set - // CompileEnglish _before_ OpCodeMap! - if (mxOpCodeMap.get() && mbEnglish != bOldEnglish) - { - ScDocument* pDoc = mpDocShell->GetDocument(); - ScCompiler aCompiler( pDoc, ScAddress()); - aCompiler.SetGrammar(pDoc->GetGrammar()); - mxOpCodeMap = aCompiler.CreateOpCodeMap( maOpCodeMapping, mbEnglish); - } - } - else - throw lang::IllegalArgumentException(); - } - else if ( aString.EqualsAscii( SC_UNO_FORMULACONVENTION ) ) - { - aValue >>= mnConv; - } - else if ( aString.EqualsAscii( SC_UNO_IGNORELEADING ) ) - { - aValue >>= mbIgnoreSpaces; - } - else if ( aString.EqualsAscii( SC_UNO_OPCODEMAP ) ) - { - if (aValue >>= maOpCodeMapping) - { - ScDocument* pDoc = mpDocShell->GetDocument(); - ScCompiler aCompiler( pDoc, ScAddress()); - aCompiler.SetGrammar(pDoc->GetGrammar()); - mxOpCodeMap = aCompiler.CreateOpCodeMap( maOpCodeMapping, mbEnglish); - } - else - throw lang::IllegalArgumentException(); - } - else if ( aString.EqualsAscii( SC_UNO_EXTERNALLINKS ) ) - { - if (!(aValue >>= maExternalLinks)) - throw lang::IllegalArgumentException(); - } - else - throw beans::UnknownPropertyException(); -} - -uno::Any SAL_CALL ScFormulaParserObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Any aRet; - String aString(aPropertyName); - if ( aString.EqualsAscii( SC_UNO_COMPILEFAP ) ) - { - aRet <<= mbCompileFAP; - } - else if ( aString.EqualsAscii( SC_UNO_COMPILEENGLISH ) ) - { - aRet <<= mbEnglish; - } - else if ( aString.EqualsAscii( SC_UNO_FORMULACONVENTION ) ) - { - aRet <<= mnConv; - } - else if ( aString.EqualsAscii( SC_UNO_IGNORELEADING ) ) - { - aRet <<= mbIgnoreSpaces; - } - else if ( aString.EqualsAscii( SC_UNO_OPCODEMAP ) ) - { - aRet <<= maOpCodeMapping; - } - else if ( aString.EqualsAscii( SC_UNO_EXTERNALLINKS ) ) - { - aRet <<= maExternalLinks; - } - else - throw beans::UnknownPropertyException(); - return aRet; -} - -SC_IMPL_DUMMY_PROPERTY_LISTENER( ScFormulaParserObj ) - -// ============================================================================ - -void lcl_ExternalRefToApi( sheet::SingleReference& rAPI, const ScSingleRefData& rRef ) -{ - rAPI.Column = rRef.nCol; - rAPI.Row = rRef.nRow; - rAPI.Sheet = 0; - rAPI.RelativeColumn = rRef.nRelCol; - rAPI.RelativeRow = rRef.nRelRow; - rAPI.RelativeSheet = 0; - - sal_Int32 nFlags = 0; - if ( rRef.IsColRel() ) nFlags |= sheet::ReferenceFlags::COLUMN_RELATIVE; - if ( rRef.IsRowRel() ) nFlags |= sheet::ReferenceFlags::ROW_RELATIVE; - if ( rRef.IsColDeleted() ) nFlags |= sheet::ReferenceFlags::COLUMN_DELETED; - if ( rRef.IsRowDeleted() ) nFlags |= sheet::ReferenceFlags::ROW_DELETED; - if ( rRef.IsFlag3D() ) nFlags |= sheet::ReferenceFlags::SHEET_3D; - if ( rRef.IsRelName() ) nFlags |= sheet::ReferenceFlags::RELATIVE_NAME; - rAPI.Flags = nFlags; -} - -void lcl_SingleRefToApi( sheet::SingleReference& rAPI, const ScSingleRefData& rRef ) -{ - rAPI.Column = rRef.nCol; - rAPI.Row = rRef.nRow; - rAPI.Sheet = rRef.nTab; - rAPI.RelativeColumn = rRef.nRelCol; - rAPI.RelativeRow = rRef.nRelRow; - rAPI.RelativeSheet = rRef.nRelTab; - - sal_Int32 nFlags = 0; - if ( rRef.IsColRel() ) nFlags |= sheet::ReferenceFlags::COLUMN_RELATIVE; - if ( rRef.IsRowRel() ) nFlags |= sheet::ReferenceFlags::ROW_RELATIVE; - if ( rRef.IsTabRel() ) nFlags |= sheet::ReferenceFlags::SHEET_RELATIVE; - if ( rRef.IsColDeleted() ) nFlags |= sheet::ReferenceFlags::COLUMN_DELETED; - if ( rRef.IsRowDeleted() ) nFlags |= sheet::ReferenceFlags::ROW_DELETED; - if ( rRef.IsTabDeleted() ) nFlags |= sheet::ReferenceFlags::SHEET_DELETED; - if ( rRef.IsFlag3D() ) nFlags |= sheet::ReferenceFlags::SHEET_3D; - if ( rRef.IsRelName() ) nFlags |= sheet::ReferenceFlags::RELATIVE_NAME; - rAPI.Flags = nFlags; -} - -bool ScTokenConversion::ConvertToTokenArray( ScDocument& rDoc, - ScTokenArray& rTokenArray, const uno::Sequence<sheet::FormulaToken>& rSequence ) -{ - return !rTokenArray.Fill(rSequence,rDoc.GetExternalRefManager()); -} - -bool ScTokenConversion::ConvertToTokenSequence( ScDocument& rDoc, - uno::Sequence<sheet::FormulaToken>& rSequence, const ScTokenArray& rTokenArray ) -{ - bool bError = false; - - sal_Int32 nLen = static_cast<sal_Int32>(rTokenArray.GetLen()); - formula::FormulaToken** pTokens = rTokenArray.GetArray(); - if ( pTokens ) - { - rSequence.realloc(nLen); - for (sal_Int32 nPos=0; nPos<nLen; nPos++) - { - const formula::FormulaToken& rToken = *pTokens[nPos]; - sheet::FormulaToken& rAPI = rSequence[nPos]; - - OpCode eOpCode = rToken.GetOpCode(); - // eOpCode may be changed in the following switch/case - switch ( rToken.GetType() ) - { - case svByte: - // Only the count of spaces is stored as "long". Parameter count is ignored. - if ( eOpCode == ocSpaces ) - rAPI.Data <<= (sal_Int32) rToken.GetByte(); - else - rAPI.Data.clear(); // no data - break; - case formula::svDouble: - rAPI.Data <<= rToken.GetDouble(); - break; - case formula::svString: - rAPI.Data <<= rtl::OUString( rToken.GetString() ); - break; - case svExternal: - // Function name is stored as string. - // Byte (parameter count) is ignored. - rAPI.Data <<= rtl::OUString( rToken.GetExternal() ); - break; - case svSingleRef: - { - sheet::SingleReference aSingleRef; - lcl_SingleRefToApi( aSingleRef, static_cast<const ScToken&>(rToken).GetSingleRef() ); - rAPI.Data <<= aSingleRef; - } - break; - case formula::svDoubleRef: - { - sheet::ComplexReference aCompRef; - lcl_SingleRefToApi( aCompRef.Reference1, static_cast<const ScToken&>(rToken).GetSingleRef() ); - lcl_SingleRefToApi( aCompRef.Reference2, static_cast<const ScToken&>(rToken).GetSingleRef2() ); - rAPI.Data <<= aCompRef; - } - break; - case svIndex: - { - sheet::NameToken aNameToken; - aNameToken.Index = static_cast<sal_Int32>( rToken.GetIndex() ); - aNameToken.Global = static_cast<sal_Bool>( rToken.GetByte() ); - rAPI.Data <<= aNameToken; - } - break; - case svMatrix: - if (!ScRangeToSequence::FillMixedArray( rAPI.Data, static_cast<const ScToken&>(rToken).GetMatrix(), true)) - rAPI.Data.clear(); - break; - case svExternalSingleRef: - { - sheet::SingleReference aSingleRef; - lcl_ExternalRefToApi( aSingleRef, static_cast<const ScToken&>(rToken).GetSingleRef() ); - size_t nCacheId; - rDoc.GetExternalRefManager()->getCacheTable( rToken.GetIndex(), rToken.GetString(), false, &nCacheId ); - aSingleRef.Sheet = static_cast< sal_Int32 >( nCacheId ); - sheet::ExternalReference aExtRef; - aExtRef.Index = rToken.GetIndex(); - aExtRef.Reference <<= aSingleRef; - rAPI.Data <<= aExtRef; - eOpCode = ocPush; - } - break; - case svExternalDoubleRef: - { - sheet::ComplexReference aComplRef; - lcl_ExternalRefToApi( aComplRef.Reference1, static_cast<const ScToken&>(rToken).GetSingleRef() ); - lcl_ExternalRefToApi( aComplRef.Reference2, static_cast<const ScToken&>(rToken).GetSingleRef2() ); - size_t nCacheId; - rDoc.GetExternalRefManager()->getCacheTable( rToken.GetIndex(), rToken.GetString(), false, &nCacheId ); - aComplRef.Reference1.Sheet = static_cast< sal_Int32 >( nCacheId ); - // NOTE: This assumes that cached sheets are in consecutive order! - aComplRef.Reference2.Sheet = aComplRef.Reference1.Sheet + (static_cast<const ScToken&>(rToken).GetSingleRef2().nTab - static_cast<const ScToken&>(rToken).GetSingleRef().nTab); - sheet::ExternalReference aExtRef; - aExtRef.Index = rToken.GetIndex(); - aExtRef.Reference <<= aComplRef; - rAPI.Data <<= aExtRef; - eOpCode = ocPush; - } - break; - case svExternalName: - { - sheet::ExternalReference aExtRef; - aExtRef.Index = rToken.GetIndex(); - aExtRef.Reference <<= ::rtl::OUString( rToken.GetString() ); - rAPI.Data <<= aExtRef; - eOpCode = ocPush; - } - break; - default: - OSL_TRACE( "ScTokenConversion::ConvertToTokenSequence: unhandled token type SvStackVar %d", rToken.GetType()); - case svSep: // occurs with ocSep, ocOpen, ocClose, ocArray* - case svJump: // occurs with ocIf, ocChose - case svMissing: // occurs with ocMissing - rAPI.Data.clear(); // no data - } - rAPI.OpCode = static_cast<sal_Int32>(eOpCode); //! assuming equal values for the moment - } - } - else - rSequence.realloc(0); - - return !bError; -} - -// ============================================================================ - -ScFormulaOpCodeMapperObj::ScFormulaOpCodeMapperObj(::std::auto_ptr<formula::FormulaCompiler> _pCompiler) -: formula::FormulaOpCodeMapperObj(_pCompiler) -{ -} - -// ============================================================================ - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/unodoc.cxx b/sc/source/ui/unoobj/unodoc.cxx deleted file mode 100644 index 6fa0a4710..000000000 --- a/sc/source/ui/unoobj/unodoc.cxx +++ /dev/null @@ -1,69 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -// System - Includes ----------------------------------------------------- - -#include <tools/string.hxx> -#include <sfx2/docfac.hxx> -#include <sfx2/sfxmodelfactory.hxx> -#include <com/sun/star/lang/XMultiServiceFactory.hpp> - -#include "scmod.hxx" -#include <osl/mutex.hxx> -#include <vcl/svapp.hxx> - -#include "docsh.hxx" - -using namespace ::com::sun::star; - -::rtl::OUString SAL_CALL ScDocument_getImplementationName() throw() -{ - return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.Calc.SpreadsheetDocument" ) ); -} - -uno::Sequence< rtl::OUString > SAL_CALL ScDocument_getSupportedServiceNames() throw() -{ - uno::Sequence< rtl::OUString > aSeq( 1 ); - aSeq[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.SpreadsheetDocument" )); - return aSeq; -} - -uno::Reference< uno::XInterface > SAL_CALL ScDocument_createInstance( - const uno::Reference< lang::XMultiServiceFactory > & /* rSMgr */, const sal_uInt64 _nCreationFlags ) throw( uno::Exception ) -{ - SolarMutexGuard aGuard; - ScDLL::Init(); - SfxObjectShell* pShell = new ScDocShell( _nCreationFlags ); - return uno::Reference< uno::XInterface >( pShell->GetModel() ); -} - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/unoreflist.cxx b/sc/source/ui/unoobj/unoreflist.cxx deleted file mode 100644 index f67499419..000000000 --- a/sc/source/ui/unoobj/unoreflist.cxx +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - - -#include "unoreflist.hxx" -#include "document.hxx" - -//------------------------------------------------------------------------ - -ScUnoRefList::ScUnoRefList() -{ -} - -ScUnoRefList::~ScUnoRefList() -{ -} - -void ScUnoRefList::Add( sal_Int64 nId, const ScRangeList& rOldRanges ) -{ - aEntries.push_back( ScUnoRefEntry( nId, rOldRanges ) ); -} - -void ScUnoRefList::Undo( ScDocument* pDoc ) -{ - std::list<ScUnoRefEntry>::const_iterator aEnd( aEntries.end() ); - for ( std::list<ScUnoRefEntry>::const_iterator aIter( aEntries.begin() ); - aIter != aEnd; ++aIter ) - { - ScUnoRefUndoHint aHint( *aIter ); - pDoc->BroadcastUno( aHint ); - } -} - -//------------------------------------------------------------------------ - -TYPEINIT1(ScUnoRefUndoHint, SfxHint); - -ScUnoRefUndoHint::ScUnoRefUndoHint( const ScUnoRefEntry& rRefEntry ) : - aEntry( rRefEntry ) -{ -} - -ScUnoRefUndoHint::~ScUnoRefUndoHint() -{ -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/viewuno.cxx b/sc/source/ui/unoobj/viewuno.cxx deleted file mode 100644 index 57e39c07a..000000000 --- a/sc/source/ui/unoobj/viewuno.cxx +++ /dev/null @@ -1,2382 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -#include <com/sun/star/awt/MouseButton.hpp> -#include <com/sun/star/script/vba/VBAEventId.hpp> -#include <com/sun/star/script/vba/XVBAEventProcessor.hpp> -#include <com/sun/star/view/DocumentZoomType.hpp> - -#include <editeng/outliner.hxx> -#include <svx/fmdpage.hxx> -#include <svx/svditer.hxx> -#include <svx/svdmark.hxx> -#include <svx/svdouno.hxx> -#include <svx/svdpage.hxx> -#include <svx/svdpagv.hxx> -#include <svx/svdview.hxx> -#include <svx/unoshape.hxx> -#include <svx/unoshcol.hxx> -#include <svx/fmshell.hxx> -#include <sfx2/bindings.hxx> -#include <sfx2/dispatch.hxx> -#include <sfx2/printer.hxx> -#include <sfx2/request.hxx> -#include <sfx2/viewfrm.hxx> -#include <comphelper/servicehelper.hxx> -#include <toolkit/helper/convert.hxx> -#include <vcl/svapp.hxx> - -#include "drawsh.hxx" -#include "drtxtob.hxx" -#include "transobj.hxx" -#include "editsh.hxx" -#include "viewuno.hxx" -#include "cellsuno.hxx" -#include "miscuno.hxx" -#include "tabvwsh.hxx" -#include "docsh.hxx" -#include "drwlayer.hxx" -#include "drawview.hxx" -#include "fupoor.hxx" -#include "sc.hrc" -#include "unonames.hxx" -#include "scmod.hxx" -#include "appoptio.hxx" -#include "gridwin.hxx" -#include "sheetevents.hxx" -#include "AccessibilityHints.hxx" -#include <svx/sdrhittesthelper.hxx> - -using namespace com::sun::star; - -//------------------------------------------------------------------------ - -//! Clipping-Markierungen - -// alles ohne Which-ID, Map nur fuer PropertySetInfo - -const SfxItemPropertyMapEntry* lcl_GetViewOptPropertyMap() -{ - static SfxItemPropertyMapEntry aViewOptPropertyMap_Impl[] = - { - {MAP_CHAR_LEN(OLD_UNO_COLROWHDR), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_GRIDCOLOR), 0, &getCppuType((sal_Int32*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_COLROWHDR), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_HORSCROLL), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHEETTABS), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_VERTSCROLL), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_HIDESPELL), 0, &getBooleanCppuType(), 0, 0}, /* deprecated #i91949 */ - {MAP_CHAR_LEN(OLD_UNO_HORSCROLL), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_OUTLSYMB), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_VALUEHIGH), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(OLD_UNO_OUTLSYMB), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(OLD_UNO_SHEETTABS), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWANCHOR), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWCHARTS), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWDRAW), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWFORM), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWGRID), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWHELP), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWNOTES), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWOBJ), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWPAGEBR), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWZERO), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_SHOWSOLID), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(OLD_UNO_VALUEHIGH), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(OLD_UNO_VERTSCROLL), 0, &getBooleanCppuType(), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_VISAREA), 0, &getCppuType((awt::Rectangle*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ZOOMTYPE), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_ZOOMVALUE), 0, &getCppuType((sal_Int16*)0), 0, 0}, - {MAP_CHAR_LEN(SC_UNO_VISAREASCREEN),0, &getCppuType((awt::Rectangle*)0), 0, 0}, - {0,0,0,0,0,0} - }; - return aViewOptPropertyMap_Impl; -} - -//------------------------------------------------------------------------ - -SV_IMPL_PTRARR( XRangeSelectionListenerArr_Impl, XRangeSelectionListenerPtr ); -SV_IMPL_PTRARR( XRangeSelectionChangeListenerArr_Impl, XRangeSelectionChangeListenerPtr ); -SV_IMPL_PTRARR( XSelectionChangeListenerArr_Impl, XSelectionChangeListenerPtr ); -SV_IMPL_PTRARR( XViewPropertyChangeListenerArr_Impl, XViewPropertyChangeListenerPtr ); -SV_IMPL_PTRARR( XMouseClickHandlerArr_Impl, XMouseClickHandlerPtr ); -SV_IMPL_PTRARR( XActivationEventListenerArr_Impl, XActivationEventListenerPtr ); - -#define SCTABVIEWOBJ_SERVICE "com.sun.star.sheet.SpreadsheetView" -#define SCVIEWSETTINGS_SERVICE "com.sun.star.sheet.SpreadsheetViewSettings" - -SC_SIMPLE_SERVICE_INFO( ScViewPaneBase, "ScViewPaneObj", "com.sun.star.sheet.SpreadsheetViewPane" ) - -//------------------------------------------------------------------------ - -ScViewPaneBase::ScViewPaneBase(ScTabViewShell* pViewSh, sal_uInt16 nP) : - pViewShell( pViewSh ), - nPane( nP ) -{ - if (pViewShell) - StartListening(*pViewShell); -} - -ScViewPaneBase::~ScViewPaneBase() -{ - if (pViewShell) - EndListening(*pViewShell); -} - -void ScViewPaneBase::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - if ( rHint.ISA( SfxSimpleHint ) && - ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING ) - pViewShell = NULL; -} - -uno::Any SAL_CALL ScViewPaneBase::queryInterface( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( sheet::XViewPane ) - SC_QUERYINTERFACE( sheet::XCellRangeReferrer ) - SC_QUERYINTERFACE( view::XFormLayerAccess ) - SC_QUERYINTERFACE( view::XControlAccess ) - SC_QUERYINTERFACE( lang::XServiceInfo ) - SC_QUERYINTERFACE( lang::XTypeProvider ) - - return uno::Any(); // OWeakObject is in derived objects -} - -uno::Sequence<uno::Type> SAL_CALL ScViewPaneBase::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - aTypes.realloc(5); - uno::Type* pPtr = aTypes.getArray(); - pPtr[0] = getCppuType((const uno::Reference<sheet::XViewPane>*)0); - pPtr[1] = getCppuType((const uno::Reference<sheet::XCellRangeReferrer>*)0); - pPtr[2] = getCppuType((const uno::Reference<view::XFormLayerAccess>*)0); - pPtr[3] = getCppuType((const uno::Reference<lang::XServiceInfo>*)0); - pPtr[4] = getCppuType((const uno::Reference<lang::XTypeProvider>*)0); - } - return aTypes; -} - -namespace -{ - class theScViewPaneBaseImplementationId : public rtl::Static< UnoTunnelIdInit, theScViewPaneBaseImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScViewPaneBase::getImplementationId() - throw(uno::RuntimeException) -{ - return theScViewPaneBaseImplementationId::get().getSeq(); -} - -// XViewPane - -sal_Int32 SAL_CALL ScViewPaneBase::getFirstVisibleColumn() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pViewShell) - { - ScViewData* pViewData = pViewShell->GetViewData(); - ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? - pViewData->GetActivePart() : - (ScSplitPos) nPane; - ScHSplitPos eWhichH = WhichH( eWhich ); - - return pViewData->GetPosX( eWhichH ); - } - OSL_FAIL("keine View ?!?"); //! Exception? - return 0; -} - -void SAL_CALL ScViewPaneBase::setFirstVisibleColumn( sal_Int32 nFirstVisibleColumn ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pViewShell) - { - ScViewData* pViewData = pViewShell->GetViewData(); - ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? - pViewData->GetActivePart() : - (ScSplitPos) nPane; - ScHSplitPos eWhichH = WhichH( eWhich ); - - long nDeltaX = ((long)nFirstVisibleColumn) - pViewData->GetPosX( eWhichH ); - pViewShell->ScrollX( nDeltaX, eWhichH ); - } -} - -sal_Int32 SAL_CALL ScViewPaneBase::getFirstVisibleRow() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pViewShell) - { - ScViewData* pViewData = pViewShell->GetViewData(); - ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? - pViewData->GetActivePart() : - (ScSplitPos) nPane; - ScVSplitPos eWhichV = WhichV( eWhich ); - - return pViewData->GetPosY( eWhichV ); - } - OSL_FAIL("keine View ?!?"); //! Exception? - return 0; -} - -void SAL_CALL ScViewPaneBase::setFirstVisibleRow( sal_Int32 nFirstVisibleRow ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pViewShell) - { - ScViewData* pViewData = pViewShell->GetViewData(); - ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? - pViewData->GetActivePart() : - (ScSplitPos) nPane; - ScVSplitPos eWhichV = WhichV( eWhich ); - - long nDeltaY = ((long)nFirstVisibleRow) - pViewData->GetPosY( eWhichV ); - pViewShell->ScrollY( nDeltaY, eWhichV ); - } -} - -table::CellRangeAddress SAL_CALL ScViewPaneBase::getVisibleRange() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - table::CellRangeAddress aAdr; - if (pViewShell) - { - ScViewData* pViewData = pViewShell->GetViewData(); - ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? - pViewData->GetActivePart() : - (ScSplitPos) nPane; - ScHSplitPos eWhichH = WhichH( eWhich ); - ScVSplitPos eWhichV = WhichV( eWhich ); - - // VisibleCellsX gibt nur komplett sichtbare Zellen, - // VisibleRange in Excel auch teilweise sichtbare. - //! anpassen ??? - - SCCOL nVisX = pViewData->VisibleCellsX( eWhichH ); - SCROW nVisY = pViewData->VisibleCellsY( eWhichV ); - if (!nVisX) nVisX = 1; // irgendwas muss ja im Range sein - if (!nVisY) nVisY = 1; - aAdr.Sheet = pViewData->GetTabNo(); - aAdr.StartColumn = pViewData->GetPosX( eWhichH ); - aAdr.StartRow = pViewData->GetPosY( eWhichV ); - aAdr.EndColumn = aAdr.StartColumn + nVisX - 1; - aAdr.EndRow = aAdr.StartRow + nVisY - 1; - } - return aAdr; -} - -// XCellRangeSource - -uno::Reference<table::XCellRange> SAL_CALL ScViewPaneBase::getReferredCells() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - if (pViewShell) - { - ScDocShell* pDocSh = pViewShell->GetViewData()->GetDocShell(); - - table::CellRangeAddress aAdr(getVisibleRange()); //! Hilfsfunktion mit ScRange? - ScRange aRange( (SCCOL)aAdr.StartColumn, (SCROW)aAdr.StartRow, aAdr.Sheet, - (SCCOL)aAdr.EndColumn, (SCROW)aAdr.EndRow, aAdr.Sheet ); - if ( aRange.aStart == aRange.aEnd ) - return new ScCellObj( pDocSh, aRange.aStart ); - else - return new ScCellRangeObj( pDocSh, aRange ); - } - - return NULL; -} - -namespace -{ - bool lcl_prepareFormShellCall( ScTabViewShell* _pViewShell, sal_uInt16 _nPane, FmFormShell*& _rpFormShell, Window*& _rpWindow, SdrView*& _rpSdrView ) - { - if ( !_pViewShell ) - return false; - - ScViewData* pViewData = _pViewShell->GetViewData(); - ScSplitPos eWhich = ( _nPane == SC_VIEWPANE_ACTIVE ) ? - pViewData->GetActivePart() : - (ScSplitPos) _nPane; - _rpWindow = _pViewShell->GetWindowByPos( eWhich ); - _rpSdrView = _pViewShell->GetSdrView(); - _rpFormShell = _pViewShell->GetFormShell(); - return ( _rpFormShell != NULL ) && ( _rpSdrView != NULL )&& ( _rpWindow != NULL ); - } -} - -// XFormLayerAccess -uno::Reference< form::runtime::XFormController > SAL_CALL ScViewPaneBase::getFormController( const uno::Reference< form::XForm >& _Form ) throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference< form::runtime::XFormController > xController; - - Window* pWindow( NULL ); - SdrView* pSdrView( NULL ); - FmFormShell* pFormShell( NULL ); - if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) ) - xController = pFormShell->GetFormController( _Form, *pSdrView, *pWindow ); - - return xController; -} - -::sal_Bool SAL_CALL ScViewPaneBase::isFormDesignMode( ) throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - sal_Bool bIsFormDesignMode( sal_True ); - - FmFormShell* pFormShell( pViewShell ? pViewShell->GetFormShell() : NULL ); - if ( pFormShell ) - bIsFormDesignMode = pFormShell->IsDesignMode(); - - return bIsFormDesignMode; -} - -void SAL_CALL ScViewPaneBase::setFormDesignMode( ::sal_Bool _DesignMode ) throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - Window* pWindow( NULL ); - SdrView* pSdrView( NULL ); - FmFormShell* pFormShell( NULL ); - if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) ) - pFormShell->SetDesignMode( _DesignMode ); -} - -// XControlAccess - -uno::Reference<awt::XControl> SAL_CALL ScViewPaneBase::getControl( - const uno::Reference<awt::XControlModel>& xModel ) - throw(container::NoSuchElementException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - uno::Reference<awt::XControl> xRet; - - Window* pWindow( NULL ); - SdrView* pSdrView( NULL ); - FmFormShell* pFormShell( NULL ); - if ( lcl_prepareFormShellCall( pViewShell, nPane, pFormShell, pWindow, pSdrView ) ) - pFormShell->GetFormControl( xModel, *pSdrView, *pWindow, xRet ); - - if ( !xRet.is() ) - throw container::NoSuchElementException(); // no control found - - return xRet; -} - -awt::Rectangle ScViewPaneBase::GetVisArea() const -{ - awt::Rectangle aVisArea; - if (pViewShell) - { - ScSplitPos eWhich = ( nPane == SC_VIEWPANE_ACTIVE ) ? - pViewShell->GetViewData()->GetActivePart() : - (ScSplitPos) nPane; - ScGridWindow* pWindow = (ScGridWindow*)pViewShell->GetWindowByPos(eWhich); - ScDocument* pDoc = pViewShell->GetViewData()->GetDocument(); - if (pWindow && pDoc) - { - ScHSplitPos eWhichH = ((eWhich == SC_SPLIT_TOPLEFT) || (eWhich == SC_SPLIT_BOTTOMLEFT)) ? - SC_SPLIT_LEFT : SC_SPLIT_RIGHT; - ScVSplitPos eWhichV = ((eWhich == SC_SPLIT_TOPLEFT) || (eWhich == SC_SPLIT_TOPRIGHT)) ? - SC_SPLIT_TOP : SC_SPLIT_BOTTOM; - ScAddress aCell(pViewShell->GetViewData()->GetPosX(eWhichH), - pViewShell->GetViewData()->GetPosY(eWhichV), - pViewShell->GetViewData()->GetTabNo()); - Rectangle aCellRect( pDoc->GetMMRect( aCell.Col(), aCell.Row(), aCell.Col(), aCell.Row(), aCell.Tab() ) ); - Size aVisSize( pWindow->PixelToLogic( pWindow->GetSizePixel(), pWindow->GetDrawMapMode( sal_True ) ) ); - Point aVisPos( aCellRect.TopLeft() ); - if ( pDoc->IsLayoutRTL( aCell.Tab() ) ) - { - aVisPos = aCellRect.TopRight(); - aVisPos.X() -= aVisSize.Width(); - } - Rectangle aVisRect( aVisPos, aVisSize ); - aVisArea = AWTRectangle(aVisRect); - } - } - return aVisArea; -} - -//------------------------------------------------------------------------ - -ScViewPaneObj::ScViewPaneObj(ScTabViewShell* pViewSh, sal_uInt16 nP) : - ScViewPaneBase( pViewSh, nP ) -{ -} - -ScViewPaneObj::~ScViewPaneObj() -{ -} - -uno::Any SAL_CALL ScViewPaneObj::queryInterface( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - // ScViewPaneBase has everything except OWeakObject - - uno::Any aRet(ScViewPaneBase::queryInterface( rType )); - if (!aRet.hasValue()) - aRet = OWeakObject::queryInterface( rType ); - return aRet; -} - -void SAL_CALL ScViewPaneObj::acquire() throw() -{ - OWeakObject::acquire(); -} - -void SAL_CALL ScViewPaneObj::release() throw() -{ - OWeakObject::release(); -} - -// To process sheet compatibile event -typedef ::cppu::WeakImplHelper2< awt::XEnhancedMouseClickHandler, view::XSelectionChangeListener > TabViewEventListener_BASE; -class ScTabViewEventListener: public TabViewEventListener_BASE -{ -private: - ScTabViewObj* pViewObj; - uno::Reference< script::vba::XVBAEventProcessor > xVbaEventsHelper; - sal_Bool bDelaySelectionEvent; - sal_Bool bSelectionChangeOccurred; - - void fireSelectionChangeEvent(); - -public: - ScTabViewEventListener( ScTabViewObj* pObj, uno::Reference< script::vba::XVBAEventProcessor >& rVbaEventsHelper); - ~ScTabViewEventListener(); - // XEnhancedMouseClickHandler - virtual sal_Bool SAL_CALL mousePressed( const awt::EnhancedMouseEvent& e ) throw (uno::RuntimeException); - virtual sal_Bool SAL_CALL mouseReleased( const awt::EnhancedMouseEvent& e ) throw (uno::RuntimeException); - - // XSelectionChangeListener - virtual void SAL_CALL selectionChanged( const lang::EventObject& aEvent ) throw ( uno::RuntimeException ); - // XEventListener - virtual void SAL_CALL disposing( const lang::EventObject& aEvent ) throw ( uno::RuntimeException ); -}; - -ScTabViewEventListener::ScTabViewEventListener(ScTabViewObj* pObj, uno::Reference< script::vba::XVBAEventProcessor >& rVbaEventsHelper): - pViewObj( pObj ),xVbaEventsHelper( rVbaEventsHelper ), bDelaySelectionEvent( false ), bSelectionChangeOccurred( false ) -{ -} - -ScTabViewEventListener::~ScTabViewEventListener() -{ -} - -void SAL_CALL ScTabViewEventListener::disposing( const lang::EventObject& /*aEvent*/ ) throw ( uno::RuntimeException ) -{ -} - -void ScTabViewEventListener::fireSelectionChangeEvent() -{ - if ( xVbaEventsHelper.is() && pViewObj ) - { - uno::Sequence< uno::Any > aArgs(1); - aArgs[0] = pViewObj->getSelection(); - try - { - xVbaEventsHelper->processVbaEvent( script::vba::VBAEventId::WORKSHEET_SELECTIONCHANGE, aArgs ); - } - catch( uno::Exception& ) - { - } - } - bDelaySelectionEvent = false; - bSelectionChangeOccurred = false; -} - -sal_Bool SAL_CALL ScTabViewEventListener::mousePressed( const awt::EnhancedMouseEvent& e ) throw (uno::RuntimeException) -{ - // Delay to fire the selection change event if clicking the left mouse button to do selection. - bDelaySelectionEvent = ( e.Buttons == ::com::sun::star::awt::MouseButton::RIGHT ) ? false : sal_True; - bSelectionChangeOccurred = false; - - // ScTabViewObj::MousePressed should handle process BeforeDoubleClick and BeforeRightClick events - return sal_True; -} - -sal_Bool SAL_CALL ScTabViewEventListener::mouseReleased( const awt::EnhancedMouseEvent&/*e*/) throw (uno::RuntimeException) -{ - if ( bSelectionChangeOccurred ) - fireSelectionChangeEvent(); - return sal_True; -} - -void SAL_CALL ScTabViewEventListener::selectionChanged( const lang::EventObject& /*aEvent*/ ) throw ( uno::RuntimeException ) -{ - if ( !bDelaySelectionEvent ) - { - fireSelectionChangeEvent(); - } - else - { - bSelectionChangeOccurred = sal_True; - } -} - -//------------------------------------------------------------------------ - -// Default-ctor wird fuer SMART_REFLECTION_IMPLEMENTATION gebraucht - -ScTabViewObj::ScTabViewObj( ScTabViewShell* pViewSh ) : - ScViewPaneBase( pViewSh, SC_VIEWPANE_ACTIVE ), - SfxBaseController( pViewSh ), - aPropSet( lcl_GetViewOptPropertyMap() ), - aMouseClickHandlers( 0 ), - aActivationListeners( 0 ), - nPreviousTab( 0 ), - bDrawSelModeSet(false) -{ - if (pViewSh) - { - nPreviousTab = pViewSh->GetViewData()->GetTabNo(); - ScViewData* pViewData = pViewSh->GetViewData(); - if( pViewData ) - { - uno::Reference< script::vba::XVBAEventProcessor > xVbaEventsHelper (pViewData->GetDocument()->GetVbaEventProcessor(), uno::UNO_QUERY ); - if ( xVbaEventsHelper.is() ) - { - ScTabViewEventListener* pEventListener = new ScTabViewEventListener( this, xVbaEventsHelper ); - uno::Reference< awt::XEnhancedMouseClickHandler > aMouseClickHandler( *pEventListener, uno::UNO_QUERY ); - addEnhancedMouseClickHandler( aMouseClickHandler ); - uno::Reference< view::XSelectionChangeListener > aSelectionChangeListener( *pEventListener, uno::UNO_QUERY ); - addSelectionChangeListener( aSelectionChangeListener ); - } - } - } -} - -ScTabViewObj::~ScTabViewObj() -{ - //! Listening oder so - if (aMouseClickHandlers.Count()) - { - acquire(); - EndMouseListening(); - } - if (aActivationListeners.Count()) - { - acquire(); - EndActivationListening(); - } -} - -uno::Any SAL_CALL ScTabViewObj::queryInterface( const uno::Type& rType ) - throw(uno::RuntimeException) -{ - SC_QUERYINTERFACE( sheet::XSpreadsheetView ) - SC_QUERYINTERFACE( sheet::XEnhancedMouseClickBroadcaster ) - SC_QUERYINTERFACE( sheet::XActivationBroadcaster ) - SC_QUERYINTERFACE( container::XEnumerationAccess ) - SC_QUERYINTERFACE( container::XIndexAccess ) - SC_QUERY_MULTIPLE( container::XElementAccess, container::XIndexAccess ) - SC_QUERYINTERFACE( view::XSelectionSupplier ) - SC_QUERYINTERFACE( beans::XPropertySet ) - SC_QUERYINTERFACE( sheet::XViewSplitable ) - SC_QUERYINTERFACE( sheet::XViewFreezable ) - SC_QUERYINTERFACE( sheet::XRangeSelection ) - SC_QUERYINTERFACE( lang::XUnoTunnel ) - SC_QUERYINTERFACE( datatransfer::XTransferableSupplier ) - - uno::Any aRet(ScViewPaneBase::queryInterface( rType )); - if (!aRet.hasValue()) - aRet = SfxBaseController::queryInterface( rType ); - return aRet; -} - -void SAL_CALL ScTabViewObj::acquire() throw() -{ - SfxBaseController::acquire(); -} - -void SAL_CALL ScTabViewObj::release() throw() -{ - SfxBaseController::release(); -} - -void lcl_CallActivate( ScDocShell* pDocSh, SCTAB nTab, sal_Int32 nEvent ) -{ - ScDocument* pDoc = pDocSh->GetDocument(); - // when deleting a sheet, nPreviousTab can be invalid - // (could be handled with reference updates) - if (!pDoc->HasTable(nTab)) - return; - - const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab); - if (pEvents) - { - const rtl::OUString* pScript = pEvents->GetScript(nEvent); - if (pScript) - { - uno::Any aRet; - uno::Sequence<uno::Any> aParams; - uno::Sequence<sal_Int16> aOutArgsIndex; - uno::Sequence<uno::Any> aOutArgs; - /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs ); - } - } - - // execute VBA event handlers - try - { - uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW ); - // the parameter is the clicked object, as in the mousePressed call above - uno::Sequence< uno::Any > aArgs( 1 ); - aArgs[ 0 ] <<= nTab; - xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs ); - } - catch( uno::Exception& ) - { - } -} - -void ScTabViewObj::SheetChanged( bool bSameTabButMoved ) -{ - if ( !GetViewShell() ) - return; - - ScViewData* pViewData = GetViewShell()->GetViewData(); - ScDocShell* pDocSh = pViewData->GetDocShell(); - if (aActivationListeners.Count() > 0) - { - sheet::ActivationEvent aEvent; - uno::Reference< sheet::XSpreadsheetView > xView(this); - uno::Reference< uno::XInterface > xSource(xView, uno::UNO_QUERY); - aEvent.Source = xSource; - aEvent.ActiveSheet = new ScTableSheetObj(pDocSh, pViewData->GetTabNo()); - for ( sal_uInt16 n=0; n<aActivationListeners.Count(); n++ ) - { - try - { - (*aActivationListeners[n])->activeSpreadsheetChanged( aEvent ); - } - catch( uno::Exception& ) - { - aActivationListeners.DeleteAndDestroy( n ); - --n; // because it will be increased again in the loop - } - } - } - - /* Handle sheet events, but do not trigger event handlers, if the old - active sheet gets re-activated after inserting/deleting/moving a sheet. */ - SCTAB nNewTab = pViewData->GetTabNo(); - if ( !bSameTabButMoved && (nNewTab != nPreviousTab) ) - { - lcl_CallActivate( pDocSh, nPreviousTab, SC_SHEETEVENT_UNFOCUS ); - lcl_CallActivate( pDocSh, nNewTab, SC_SHEETEVENT_FOCUS ); - } - nPreviousTab = nNewTab; -} - -uno::Sequence<uno::Type> SAL_CALL ScTabViewObj::getTypes() throw(uno::RuntimeException) -{ - static uno::Sequence<uno::Type> aTypes; - if ( aTypes.getLength() == 0 ) - { - uno::Sequence<uno::Type> aViewPaneTypes(ScViewPaneBase::getTypes()); - long nViewPaneLen = aViewPaneTypes.getLength(); - const uno::Type* pViewPanePtr = aViewPaneTypes.getConstArray(); - - uno::Sequence<uno::Type> aControllerTypes(SfxBaseController::getTypes()); - long nControllerLen = aControllerTypes.getLength(); - const uno::Type* pControllerPtr = aControllerTypes.getConstArray(); - - long nParentLen = nViewPaneLen + nControllerLen; - - aTypes.realloc( nParentLen + 12 ); - uno::Type* pPtr = aTypes.getArray(); - pPtr[nParentLen + 0] = getCppuType((const uno::Reference<sheet::XSpreadsheetView>*)0); - pPtr[nParentLen + 1] = getCppuType((const uno::Reference<container::XEnumerationAccess>*)0); - pPtr[nParentLen + 2] = getCppuType((const uno::Reference<container::XIndexAccess>*)0); - pPtr[nParentLen + 3] = getCppuType((const uno::Reference<view::XSelectionSupplier>*)0); - pPtr[nParentLen + 4] = getCppuType((const uno::Reference<beans::XPropertySet>*)0); - pPtr[nParentLen + 5] = getCppuType((const uno::Reference<sheet::XViewSplitable>*)0); - pPtr[nParentLen + 6] = getCppuType((const uno::Reference<sheet::XViewFreezable>*)0); - pPtr[nParentLen + 7] = getCppuType((const uno::Reference<sheet::XRangeSelection>*)0); - pPtr[nParentLen + 8] = getCppuType((const uno::Reference<lang::XUnoTunnel>*)0); - pPtr[nParentLen + 9] = getCppuType((const uno::Reference<sheet::XEnhancedMouseClickBroadcaster>*)0); - pPtr[nParentLen + 10] = getCppuType((const uno::Reference<sheet::XActivationBroadcaster>*)0); - pPtr[nParentLen + 11] = getCppuType((const uno::Reference<datatransfer::XTransferableSupplier>*)0); - - long i; - for (i=0; i<nViewPaneLen; i++) - pPtr[i] = pViewPanePtr[i]; // parent types first - for (i=0; i<nControllerLen; i++) - pPtr[nViewPaneLen+i] = pControllerPtr[i]; - } - return aTypes; -} - -namespace -{ - class theScTabViewObjImplementationId : public rtl::Static< UnoTunnelIdInit, theScTabViewObjImplementationId > {}; -} - -uno::Sequence<sal_Int8> SAL_CALL ScTabViewObj::getImplementationId() - throw(uno::RuntimeException) -{ - return theScTabViewObjImplementationId::get().getSeq(); -} - -// XDocumentView - -sal_Bool lcl_TabInRanges( SCTAB nTab, const ScRangeList& rRanges ) -{ - for (size_t i = 0, nCount = rRanges.size(); i < nCount; ++i) - { - const ScRange* pRange = rRanges[ i ]; - if ( nTab >= pRange->aStart.Tab() && nTab <= pRange->aEnd.Tab() ) - return sal_True; - } - return false; -} - -void lcl_ShowObject( ScTabViewShell& rViewSh, ScDrawView& rDrawView, SdrObject* pSelObj ) -{ - sal_Bool bFound = false; - SCTAB nObjectTab = 0; - - SdrModel* pModel = rDrawView.GetModel(); - sal_uInt16 nPageCount = pModel->GetPageCount(); - for (sal_uInt16 i=0; i<nPageCount && !bFound; i++) - { - SdrPage* pPage = pModel->GetPage(i); - if (pPage) - { - SdrObjListIter aIter( *pPage, IM_DEEPWITHGROUPS ); - SdrObject* pObject = aIter.Next(); - while (pObject && !bFound) - { - if ( pObject == pSelObj ) - { - bFound = sal_True; - nObjectTab = static_cast<SCTAB>(i); - } - pObject = aIter.Next(); - } - } - } - - if (bFound) - { - rViewSh.SetTabNo( nObjectTab ); - rViewSh.ScrollToObject( pSelObj ); - } -} - -sal_Bool SAL_CALL ScTabViewObj::select( const uno::Any& aSelection ) - throw(lang::IllegalArgumentException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - - if ( !pViewSh ) - return false; - - //! Type of aSelection can be some specific interface instead of XInterface - - sal_Bool bRet = false; - uno::Reference<uno::XInterface> xInterface(aSelection, uno::UNO_QUERY); - if ( !xInterface.is() ) //clear all selections - { - ScDrawView* pDrawView = pViewSh->GetScDrawView(); - if (pDrawView) - { - pDrawView->ScEndTextEdit(); - pDrawView->UnmarkAll(); - } - else //#102232#; if there is no DrawView remove range selection - pViewSh->Unmark(); - bRet = sal_True; - } - - if (bDrawSelModeSet) // remove DrawSelMode if set by API; if necessary it will be set again later - { - pViewSh->SetDrawSelMode(false); - pViewSh->UpdateLayerLocks(); - bDrawSelModeSet = false; - } - - if (bRet) - return bRet; - - - ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xInterface ); - uno::Reference<drawing::XShapes> xShapeColl( xInterface, uno::UNO_QUERY ); - uno::Reference<drawing::XShape> xShapeSel( xInterface, uno::UNO_QUERY ); - SvxShape* pShapeImp = SvxShape::getImplementation( xShapeSel ); - - if (pRangesImp) // Zell-Ranges - { - ScViewData* pViewData = pViewSh->GetViewData(); - if ( pViewData->GetDocShell() == pRangesImp->GetDocShell() ) - { - // Zuerst evtl. Drawing-Selektion aufheben - // (MarkListHasChanged hebt Tabellen-Selektion auf) - - ScDrawView* pDrawView = pViewSh->GetScDrawView(); - if (pDrawView) - { - pDrawView->ScEndTextEdit(); - pDrawView->UnmarkAll(); - } - FuPoor* pFunc = pViewSh->GetDrawFuncPtr(); - if ( pFunc && pFunc->GetSlotID() != SID_OBJECT_SELECT ) - { - // Slot der Zeichenfunktion nochmal ausfuehren -> abschalten - SfxDispatcher* pDisp = pViewSh->GetDispatcher(); - if (pDisp) - pDisp->Execute( pFunc->GetSlotID(), SFX_CALLMODE_SYNCHRON ); - } - pViewSh->SetDrawShell(false); - pViewSh->SetDrawSelMode(false); // nach dem Dispatcher-Execute - - // Ranges selektieren - - const ScRangeList& rRanges = pRangesImp->GetRangeList(); - size_t nRangeCount = rRanges.size(); - // for empty range list, remove selection (cursor remains where it was) - if ( nRangeCount == 0 ) - pViewSh->Unmark(); - else if ( nRangeCount == 1 ) - pViewSh->MarkRange( *rRanges[ 0 ] ); - else - { - // Mehrfachselektion - - const ScRange* pFirst = rRanges[ 0 ]; - if ( pFirst && !lcl_TabInRanges( pViewData->GetTabNo(), rRanges ) ) - pViewSh->SetTabNo( pFirst->aStart.Tab() ); - pViewSh->DoneBlockMode(); - pViewSh->InitOwnBlockMode(); - pViewData->GetMarkData().MarkFromRangeList( rRanges, sal_True ); - pViewSh->MarkDataChanged(); - pViewData->GetDocShell()->PostPaintGridAll(); // Markierung (alt&neu) - if ( pFirst ) - { - pViewSh->AlignToCursor( pFirst->aStart.Col(), pFirst->aStart.Row(), - SC_FOLLOW_JUMP ); - pViewSh->SetCursor( pFirst->aStart.Col(), pFirst->aStart.Row() ); - } - - //! Methode an der View, um RangeList zu selektieren - } - bRet = sal_True; - } - } - else if ( pShapeImp || xShapeColl.is() ) // Drawing-Layer - { - ScDrawView* pDrawView = pViewSh->GetScDrawView(); - if (pDrawView) - { - pDrawView->ScEndTextEdit(); - pDrawView->UnmarkAll(); - - if (pShapeImp) // einzelnes Shape - { - SdrObject *pObj = pShapeImp->GetSdrObject(); - if (pObj) - { - lcl_ShowObject( *pViewSh, *pDrawView, pObj ); - SdrPageView* pPV = pDrawView->GetSdrPageView(); - if ( pPV && pObj->GetPage() == pPV->GetPage() ) - { - pDrawView->MarkObj( pObj, pPV ); - bRet = sal_True; - } - } - } - else // Shape-Collection (xShapeColl ist nicht 0) - { - // Es wird auf die Tabelle des ersten Objekts umgeschaltet, - // und alle Objekte selektiert, die auf dieser Tabelle liegen - //! Exception, wenn Objekte auf verschiedenen Tabellen? - - SdrPageView* pPV = NULL; - long nCount = xShapeColl->getCount(); - if (nCount) - { - sal_Bool bAllMarked(sal_True); - for ( long i = 0; i < nCount; i++ ) - { - uno::Reference<drawing::XShape> xShapeInt(xShapeColl->getByIndex(i), uno::UNO_QUERY); - if (xShapeInt.is()) - { - SvxShape* pShape = SvxShape::getImplementation( xShapeInt ); - if (pShape) - { - SdrObject *pObj = pShape->GetSdrObject(); - if (pObj) - { - if (!bDrawSelModeSet && (pObj->GetLayer() == SC_LAYER_BACK)) - { - pViewSh->SetDrawSelMode(sal_True); - pViewSh->UpdateLayerLocks(); - bDrawSelModeSet = sal_True; - } - if (!pPV) // erstes Objekt - { - lcl_ShowObject( *pViewSh, *pDrawView, pObj ); - pPV = pDrawView->GetSdrPageView(); - } - if ( pPV && pObj->GetPage() == pPV->GetPage() ) - { - if (pDrawView->IsObjMarkable( pObj, pPV )) - pDrawView->MarkObj( pObj, pPV ); - else - bAllMarked = false; - } - } - } - } - } - if (bAllMarked) - bRet = sal_True; - } - else - bRet = sal_True; // empty XShapes (all shapes are deselected) - } - - if (bRet) - pViewSh->SetDrawShell(sal_True); - } - } - - if (!bRet) - throw lang::IllegalArgumentException(); - - return bRet; -} - -uno::Any SAL_CALL ScTabViewObj::getSelection() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - ScCellRangesBase* pObj = NULL; - if (pViewSh) - { - // Ist auf dem Drawing-Layer etwas selektiert? - - SdrView* pDrawView = pViewSh->GetSdrView(); - if (pDrawView) - { - const SdrMarkList& rMarkList = pDrawView->GetMarkedObjectList(); - sal_uLong nMarkCount = rMarkList.GetMarkCount(); - if (nMarkCount) - { - // ShapeCollection erzeugen (wie in SdXImpressView::getSelection im Draw) - // Zurueckgegeben wird XInterfaceRef, das muss das UsrObject-XInterface sein - - SvxShapeCollection* pShapes = new SvxShapeCollection(); - uno::Reference<uno::XInterface> xRet(static_cast<cppu::OWeakObject*>(pShapes)); - - for (sal_uLong i=0; i<nMarkCount; i++) - { - SdrObject* pDrawObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); - if (pDrawObj) - { - uno::Reference<drawing::XShape> xShape( pDrawObj->getUnoShape(), uno::UNO_QUERY ); - if (xShape.is()) - pShapes->add(xShape); - } - } - return uno::makeAny(xRet); - } - } - - // sonst Tabellen-(Zellen-)Selektion - - ScViewData* pViewData = pViewSh->GetViewData(); - ScDocShell* pDocSh = pViewData->GetDocShell(); - - const ScMarkData& rMark = pViewData->GetMarkData(); - SCTAB nTabs = rMark.GetSelectCount(); - - ScRange aRange; - ScMarkType eMarkType = pViewData->GetSimpleArea(aRange); - if ( nTabs == 1 && (eMarkType == SC_MARK_SIMPLE) ) - { - if (aRange.aStart == aRange.aEnd) - pObj = new ScCellObj( pDocSh, aRange.aStart ); - else - pObj = new ScCellRangeObj( pDocSh, aRange ); - } - else if ( nTabs == 1 && (eMarkType == SC_MARK_SIMPLE_FILTERED) ) - { - ScMarkData aFilteredMark( rMark ); - ScViewUtil::UnmarkFiltered( aFilteredMark, pDocSh->GetDocument()); - ScRangeList aRangeList; - aFilteredMark.FillRangeListWithMarks( &aRangeList, false); - // Theoretically a selection may start and end on a filtered row. - switch ( aRangeList.size() ) - { - case 0: - // No unfiltered row, we have to return some object, so - // here is one with no ranges. - pObj = new ScCellRangesObj( pDocSh, aRangeList ); - break; - case 1: - { - const ScRange& rRange = *(aRangeList[ 0 ]); - if (rRange.aStart == rRange.aEnd) - pObj = new ScCellObj( pDocSh, rRange.aStart ); - else - pObj = new ScCellRangeObj( pDocSh, rRange ); - } - break; - default: - pObj = new ScCellRangesObj( pDocSh, aRangeList ); - } - } - else // Mehrfachselektion - { - ScRangeListRef xRanges; - pViewData->GetMultiArea( xRanges ); - - // bei mehreren Tabellen Ranges kopieren - //! sollte eigentlich schon in ScMarkData::FillRangeListWithMarks passieren? - if ( nTabs > 1 ) - rMark.ExtendRangeListTables( xRanges ); - - pObj = new ScCellRangesObj( pDocSh, *xRanges ); - } - - if ( !rMark.IsMarked() && !rMark.IsMultiMarked() ) - { - // remember if the selection was from the cursor position without anything selected - // (used when rendering the selection) - - pObj->SetCursorOnly( sal_True ); - } - } - - return uno::makeAny(uno::Reference<uno::XInterface>(static_cast<cppu::OWeakObject*>(pObj))); -} - -// XEnumerationAccess - -uno::Reference<container::XEnumeration> SAL_CALL ScTabViewObj::createEnumeration() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return new ScIndexEnumeration(this, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sheet.SpreadsheetViewPanesEnumeration"))); -} - -// XIndexAccess - -sal_Int32 SAL_CALL ScTabViewObj::getCount() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - sal_uInt16 nPanes = 0; - if (pViewSh) - { - nPanes = 1; - ScViewData* pViewData = pViewSh->GetViewData(); - if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE ) - nPanes *= 2; - if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE ) - nPanes *= 2; - } - return nPanes; -} - -uno::Any SAL_CALL ScTabViewObj::getByIndex( sal_Int32 nIndex ) - throw(lang::IndexOutOfBoundsException, - lang::WrappedTargetException, uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XViewPane> xPane(GetObjectByIndex_Impl((sal_uInt16)nIndex)); - if (xPane.is()) - return uno::makeAny(xPane); - else - throw lang::IndexOutOfBoundsException(); -// return uno::Any(); -} - -uno::Type SAL_CALL ScTabViewObj::getElementType() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return getCppuType((uno::Reference<sheet::XViewPane>*)0); -} - -sal_Bool SAL_CALL ScTabViewObj::hasElements() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - return ( getCount() != 0 ); -} - -// XSpreadsheetView - -ScViewPaneObj* ScTabViewObj::GetObjectByIndex_Impl(sal_uInt16 nIndex) const -{ - static ScSplitPos ePosHV[4] = - { SC_SPLIT_TOPLEFT, SC_SPLIT_BOTTOMLEFT, SC_SPLIT_TOPRIGHT, SC_SPLIT_BOTTOMRIGHT }; - - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - ScSplitPos eWhich = SC_SPLIT_BOTTOMLEFT; // default Position - sal_Bool bError = false; - ScViewData* pViewData = pViewSh->GetViewData(); - sal_Bool bHor = ( pViewData->GetHSplitMode() != SC_SPLIT_NONE ); - sal_Bool bVer = ( pViewData->GetVSplitMode() != SC_SPLIT_NONE ); - if ( bHor && bVer ) - { - // links oben, links unten, rechts oben, rechts unten - wie in Excel - if ( nIndex < 4 ) - eWhich = ePosHV[nIndex]; - else - bError = sal_True; - } - else if ( bHor ) - { - if ( nIndex > 1 ) - bError = sal_True; - else if ( nIndex == 1 ) - eWhich = SC_SPLIT_BOTTOMRIGHT; - // sonst SC_SPLIT_BOTTOMLEFT - } - else if ( bVer ) - { - if ( nIndex > 1 ) - bError = sal_True; - else if ( nIndex == 0 ) - eWhich = SC_SPLIT_TOPLEFT; - // sonst SC_SPLIT_BOTTOMLEFT - } - else if ( nIndex > 0 ) - bError = sal_True; // nicht geteilt: nur 0 gueltig - - if (!bError) - return new ScViewPaneObj( pViewSh, sal::static_int_cast<sal_uInt16>(eWhich) ); - } - - return NULL; -} - -uno::Reference<sheet::XSpreadsheet> SAL_CALL ScTabViewObj::getActiveSheet() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - ScViewData* pData = pViewSh->GetViewData(); - SCTAB nTab = pData->GetTabNo(); - return new ScTableSheetObj( pData->GetDocShell(), nTab ); - } - return NULL; -} - -// support expand (but not replace) the active sheet -void SAL_CALL ScTabViewObj::setActiveSheet( const uno::Reference<sheet::XSpreadsheet>& xActiveSheet ) - throw(uno::RuntimeException) -{ - selectSheet(xActiveSheet, false); -} - -void SAL_CALL -ScTabViewObj::selectSheet( const uno::Reference<sheet::XSpreadsheet>& xActiveSheet, - sal_Bool bExpand) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_Bool bNew = bExpand; - - ScTabViewShell* pViewSh = GetViewShell(); - if ( pViewSh && xActiveSheet.is() ) - { - // XSpreadsheet und ScCellRangesBase -> muss ein Sheet sein - - ScCellRangesBase* pRangesImp = ScCellRangesBase::getImplementation( xActiveSheet ); - if ( pRangesImp && pViewSh->GetViewData()->GetDocShell() == pRangesImp->GetDocShell() ) - { - const ScRangeList& rRanges = pRangesImp->GetRangeList(); - if ( rRanges.size() == 1 ) - { - SCTAB nNewTab = rRanges[ 0 ]->aStart.Tab(); - if ( pViewSh->GetViewData()->GetDocument()->HasTable(nNewTab) ) - pViewSh->SetTabNo( nNewTab, bNew, bExpand ); - } - } - } -} - -uno::Reference< uno::XInterface > ScTabViewObj::GetClickedObject(const Point& rPoint) const -{ - uno::Reference< uno::XInterface > xTarget; - if (GetViewShell()) - { - SCsCOL nX; - SCsROW nY; - ScViewData* pData = GetViewShell()->GetViewData(); - ScSplitPos eSplitMode = pData->GetActivePart(); - SCTAB nTab(pData->GetTabNo()); - pData->GetPosFromPixel( rPoint.X(), rPoint.Y(), eSplitMode, nX, nY); - - ScAddress aCellPos (nX, nY, nTab); - ScCellObj* pCellObj = new ScCellObj(pData->GetDocShell(), aCellPos); - - xTarget.set(uno::Reference<table::XCell>(pCellObj), uno::UNO_QUERY); - - ScDocument* pDoc = pData->GetDocument(); - if (pDoc && pDoc->GetDrawLayer()) - { - SdrPage* pDrawPage = NULL; - ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); - if (pDrawLayer->HasObjects() && (pDrawLayer->GetPageCount() > nTab)) - pDrawPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab)); - - SdrView* pDrawView = GetViewShell()->GetSdrView(); - - if (pDrawPage && pDrawView && pDrawView->GetSdrPageView()) - { - Window* pActiveWin = pData->GetActiveWin(); - Point aPos = pActiveWin->PixelToLogic(rPoint); - - sal_uInt16 nHitLog = (sal_uInt16) pActiveWin->PixelToLogic( - Size(pDrawView->GetHitTolerancePixel(),0)).Width(); - - sal_uInt32 nCount(pDrawPage->GetObjCount()); - sal_Bool bFound(false); - sal_uInt32 i(0); - while (i < nCount && !bFound) - { - SdrObject* pObj = pDrawPage->GetObj(i); - if (pObj && SdrObjectPrimitiveHit(*pObj, aPos, nHitLog, *pDrawView->GetSdrPageView(), 0, false)) - { - xTarget.set(pObj->getUnoShape(), uno::UNO_QUERY); - bFound = sal_True; - } - ++i; - } - } - } - } - return xTarget; -} - -bool ScTabViewObj::IsMouseListening() const -{ - if ( aMouseClickHandlers.Count() > 0 ) - return true; - - // also include sheet events, because MousePressed must be called for them - ScViewData* pViewData = GetViewShell()->GetViewData(); - ScDocument* pDoc = pViewData->GetDocument(); - SCTAB nTab = pViewData->GetTabNo(); - return - pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_RIGHTCLICK, true ) || - pDoc->HasSheetEventScript( nTab, SC_SHEETEVENT_DOUBLECLICK, true ); -} - -sal_Bool ScTabViewObj::MousePressed( const awt::MouseEvent& e ) - throw (::uno::RuntimeException) -{ - sal_Bool bReturn(false); - - uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y)); - if (aMouseClickHandlers.Count() && xTarget.is()) - { - awt::EnhancedMouseEvent aMouseEvent; - - aMouseEvent.Buttons = e.Buttons; - aMouseEvent.X = e.X; - aMouseEvent.Y = e.Y; - aMouseEvent.ClickCount = e.ClickCount; - aMouseEvent.PopupTrigger = e.PopupTrigger; - aMouseEvent.Target = xTarget; - - for ( sal_uInt16 n=0; n<aMouseClickHandlers.Count(); n++ ) - { - try - { - if (!(*aMouseClickHandlers[n])->mousePressed( aMouseEvent )) - bReturn = sal_True; - } - catch ( uno::Exception& ) - { - aMouseClickHandlers.DeleteAndDestroy(n); - --n; // because it will be increased again in the loop - } - } - } - - // handle sheet events - bool bDoubleClick = ( e.Buttons == awt::MouseButton::LEFT && e.ClickCount == 2 ); - bool bRightClick = ( e.Buttons == awt::MouseButton::RIGHT && e.ClickCount == 1 ); - if ( ( bDoubleClick || bRightClick ) && !bReturn && xTarget.is()) - { - sal_Int32 nEvent = bDoubleClick ? SC_SHEETEVENT_DOUBLECLICK : SC_SHEETEVENT_RIGHTCLICK; - - ScTabViewShell* pViewSh = GetViewShell(); - ScViewData* pViewData = pViewSh->GetViewData(); - ScDocShell* pDocSh = pViewData->GetDocShell(); - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = pViewData->GetTabNo(); - const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab); - if (pEvents) - { - const rtl::OUString* pScript = pEvents->GetScript(nEvent); - if (pScript) - { - // the macro parameter is the clicked object, as in the mousePressed call above - uno::Sequence<uno::Any> aParams(1); - aParams[0] <<= xTarget; - - uno::Any aRet; - uno::Sequence<sal_Int16> aOutArgsIndex; - uno::Sequence<uno::Any> aOutArgs; - - /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs ); - - // look for a boolean return value of true - sal_Bool bRetValue = false; - if (aRet >>= bRetValue) - { - if (bRetValue) - bReturn = sal_True; - } - } - } - - // execute VBA event handler - if (!bReturn && xTarget.is()) try - { - uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( pDoc->GetVbaEventProcessor(), uno::UNO_SET_THROW ); - // the parameter is the clicked object, as in the mousePressed call above - uno::Sequence< uno::Any > aArgs( 1 ); - aArgs[ 0 ] <<= xTarget; - xVbaEvents->processVbaEvent( ScSheetEvents::GetVbaSheetEventId( nEvent ), aArgs ); - } - catch( util::VetoException& ) - { - bReturn = sal_True; - } - catch( uno::Exception& ) - { - } - } - - return bReturn; -} - -sal_Bool ScTabViewObj::MouseReleased( const awt::MouseEvent& e ) - throw (uno::RuntimeException) -{ - sal_Bool bReturn(false); - - if (aMouseClickHandlers.Count()) - { - uno::Reference< uno::XInterface > xTarget = GetClickedObject(Point(e.X, e.Y)); - - if (xTarget.is()) - { - awt::EnhancedMouseEvent aMouseEvent; - - aMouseEvent.Buttons = e.Buttons; - aMouseEvent.X = e.X; - aMouseEvent.Y = e.Y; - aMouseEvent.ClickCount = e.ClickCount; - aMouseEvent.PopupTrigger = e.PopupTrigger; - aMouseEvent.Target = xTarget; - - for ( sal_uInt16 n=0; n<aMouseClickHandlers.Count(); n++ ) - { - try - { - if (!(*aMouseClickHandlers[n])->mouseReleased( aMouseEvent )) - bReturn = sal_True; - } - catch ( uno::Exception& ) - { - aMouseClickHandlers.DeleteAndDestroy(n); - --n; // because it will be increased again in the loop - } - } - } - } - return bReturn; -} - -// XEnhancedMouseClickBroadcaster - -void ScTabViewObj::StartMouseListening() -{ -} - -void ScTabViewObj::EndMouseListening() -{ - sal_uInt16 nCount(aMouseClickHandlers.Count()); - lang::EventObject aEvent; - aEvent.Source = (cppu::OWeakObject*)this; - for ( sal_uInt16 n=0; n<nCount; n++ ) - { - try - { - (*aMouseClickHandlers[n])->disposing(aEvent); - } - catch ( uno::Exception& ) - { - } - } - aMouseClickHandlers.DeleteAndDestroy(0, nCount); -} - -void ScTabViewObj::StartActivationListening() -{ -} - -void ScTabViewObj::EndActivationListening() -{ - sal_uInt16 nCount = aActivationListeners.Count(); - lang::EventObject aEvent; - aEvent.Source = (cppu::OWeakObject*)this; - for ( sal_uInt16 n=0; n<nCount; n++ ) - { - try - { - (*aActivationListeners[n])->disposing(aEvent); - } - catch ( uno::Exception& ) - { - } - } - aActivationListeners.DeleteAndDestroy(0, nCount); -} - -void SAL_CALL ScTabViewObj::addEnhancedMouseClickHandler( const uno::Reference< awt::XEnhancedMouseClickHandler >& aListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if (aListener.is()) - { - sal_uInt16 nCount = aMouseClickHandlers.Count(); - uno::Reference<awt::XEnhancedMouseClickHandler> *pObj = - new uno::Reference<awt::XEnhancedMouseClickHandler>( aListener ); - aMouseClickHandlers.Insert( pObj, nCount ); - - if (aMouseClickHandlers.Count() == 1 && nCount == 0) // only if a listener added - StartMouseListening(); - } -} - -void SAL_CALL ScTabViewObj::removeEnhancedMouseClickHandler( const uno::Reference< awt::XEnhancedMouseClickHandler >& aListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aMouseClickHandlers.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<awt::XEnhancedMouseClickHandler> *pObj = aMouseClickHandlers[n]; - if ( *pObj == aListener ) - aMouseClickHandlers.DeleteAndDestroy( n ); - } - if ((aMouseClickHandlers.Count() == 0) && (nCount > 0)) // only if last listener removed - EndMouseListening(); -} - -// XActivationBroadcaster - -void SAL_CALL ScTabViewObj::addActivationEventListener( const uno::Reference< sheet::XActivationEventListener >& aListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - - if (aListener.is()) - { - sal_uInt16 nCount = aActivationListeners.Count(); - uno::Reference<sheet::XActivationEventListener> *pObj = - new uno::Reference<sheet::XActivationEventListener>( aListener ); - aActivationListeners.Insert( pObj, nCount ); - - if (aActivationListeners.Count() == 1 && nCount == 0) // only if a listener added - StartActivationListening(); - } -} - -void SAL_CALL ScTabViewObj::removeActivationEventListener( const uno::Reference< sheet::XActivationEventListener >& aListener ) - throw (uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aActivationListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<sheet::XActivationEventListener> *pObj = aActivationListeners[n]; - if ( *pObj == aListener ) - aActivationListeners.DeleteAndDestroy( n ); - } - if ((aActivationListeners.Count() == 0) && (nCount > 0)) // only if last listener removed - EndActivationListening(); -} - -sal_Int16 ScTabViewObj::GetZoom(void) const -{ - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - const Fraction& rZoomY = pViewSh->GetViewData()->GetZoomY(); // Y wird angezeigt - return (sal_Int16)(( rZoomY.GetNumerator() * 100 ) / rZoomY.GetDenominator()); - } - return 0; -} - -void ScTabViewObj::SetZoom(sal_Int16 nZoom) -{ - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - if ( nZoom != GetZoom() && nZoom != 0 ) - { - if (!pViewSh->GetViewData()->IsPagebreakMode()) - { - ScModule* pScMod = SC_MOD(); - ScAppOptions aNewOpt(pScMod->GetAppOptions()); - aNewOpt.SetZoom( nZoom ); - aNewOpt.SetZoomType( pViewSh->GetViewData()->GetView()->GetZoomType() ); - pScMod->SetAppOptions( aNewOpt ); - } - } - Fraction aFract( nZoom, 100 ); - pViewSh->SetZoom( aFract, aFract, sal_True ); - pViewSh->PaintGrid(); - pViewSh->PaintTop(); - pViewSh->PaintLeft(); - pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM ); - pViewSh->GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER ); - } -} - -sal_Int16 ScTabViewObj::GetZoomType(void) const -{ - sal_Int16 aZoomType = view::DocumentZoomType::OPTIMAL; - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - SvxZoomType eZoomType = pViewSh->GetViewData()->GetView()->GetZoomType(); - switch (eZoomType) - { - case SVX_ZOOM_PERCENT: - aZoomType = view::DocumentZoomType::BY_VALUE; - break; - case SVX_ZOOM_OPTIMAL: - aZoomType = view::DocumentZoomType::OPTIMAL; - break; - case SVX_ZOOM_WHOLEPAGE: - aZoomType = view::DocumentZoomType::ENTIRE_PAGE; - break; - case SVX_ZOOM_PAGEWIDTH: - aZoomType = view::DocumentZoomType::PAGE_WIDTH; - break; - case SVX_ZOOM_PAGEWIDTH_NOBORDER: - aZoomType = view::DocumentZoomType::PAGE_WIDTH_EXACT; - break; - } - } - return aZoomType; -} - -void ScTabViewObj::SetZoomType(sal_Int16 aZoomType) -{ - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - ScDBFunc* pView = pViewSh->GetViewData()->GetView(); - if (pView) - { - SvxZoomType eZoomType; - switch (aZoomType) - { - case view::DocumentZoomType::BY_VALUE: - eZoomType = SVX_ZOOM_PERCENT; - break; - case view::DocumentZoomType::OPTIMAL: - eZoomType = SVX_ZOOM_OPTIMAL; - break; - case view::DocumentZoomType::ENTIRE_PAGE: - eZoomType = SVX_ZOOM_WHOLEPAGE; - break; - case view::DocumentZoomType::PAGE_WIDTH: - eZoomType = SVX_ZOOM_PAGEWIDTH; - break; - case view::DocumentZoomType::PAGE_WIDTH_EXACT: - eZoomType = SVX_ZOOM_PAGEWIDTH_NOBORDER; - break; - default: - eZoomType = SVX_ZOOM_OPTIMAL; - } - sal_Int16 nZoom(GetZoom()); - sal_Int16 nOldZoom(nZoom); - if ( eZoomType == SVX_ZOOM_PERCENT ) - { - if ( nZoom < MINZOOM ) nZoom = MINZOOM; - if ( nZoom > MAXZOOM ) nZoom = MAXZOOM; - } - else - nZoom = pView->CalcZoom( eZoomType, nOldZoom ); - - switch ( eZoomType ) - { - case SVX_ZOOM_WHOLEPAGE: - case SVX_ZOOM_PAGEWIDTH: - pView->SetZoomType( eZoomType, sal_True ); - break; - - default: - pView->SetZoomType( SVX_ZOOM_PERCENT, sal_True ); - } - SetZoom( nZoom ); - } - } -} - -sal_Bool SAL_CALL ScTabViewObj::getIsWindowSplit() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // wie Menue-Slot SID_WINDOW_SPLIT - - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - ScViewData* pViewData = pViewSh->GetViewData(); - return ( pViewData->GetHSplitMode() == SC_SPLIT_NORMAL || - pViewData->GetVSplitMode() == SC_SPLIT_NORMAL ); - } - - return false; -} - -sal_Bool SAL_CALL ScTabViewObj::hasFrozenPanes() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - // wie Menue-Slot SID_WINDOW_FIX - - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - ScViewData* pViewData = pViewSh->GetViewData(); - return ( pViewData->GetHSplitMode() == SC_SPLIT_FIX || - pViewData->GetVSplitMode() == SC_SPLIT_FIX ); - } - - return false; -} - -sal_Int32 SAL_CALL ScTabViewObj::getSplitHorizontal() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - ScViewData* pViewData = pViewSh->GetViewData(); - if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE ) - return pViewData->GetHSplitPos(); - } - return 0; -} - -sal_Int32 SAL_CALL ScTabViewObj::getSplitVertical() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - ScViewData* pViewData = pViewSh->GetViewData(); - if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE ) - return pViewData->GetVSplitPos(); - } - return 0; -} - -sal_Int32 SAL_CALL ScTabViewObj::getSplitColumn() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - ScViewData* pViewData = pViewSh->GetViewData(); - if ( pViewData->GetHSplitMode() != SC_SPLIT_NONE ) - { - long nSplit = pViewData->GetHSplitPos(); - - ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT; - if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE ) - ePos = SC_SPLIT_TOPLEFT; - - SCsCOL nCol; - SCsROW nRow; - pViewData->GetPosFromPixel( nSplit, 0, ePos, nCol, nRow, false ); - if ( nCol > 0 ) - return nCol; - } - } - return 0; -} - -sal_Int32 SAL_CALL ScTabViewObj::getSplitRow() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - ScViewData* pViewData = pViewSh->GetViewData(); - if ( pViewData->GetVSplitMode() != SC_SPLIT_NONE ) - { - long nSplit = pViewData->GetVSplitPos(); - - ScSplitPos ePos = SC_SPLIT_TOPLEFT; // es ist vertikal geteilt - SCsCOL nCol; - SCsROW nRow; - pViewData->GetPosFromPixel( 0, nSplit, ePos, nCol, nRow, false ); - if ( nRow > 0 ) - return nRow; - } - } - return 0; -} - -void SAL_CALL ScTabViewObj::splitAtPosition( sal_Int32 nPixelX, sal_Int32 nPixelY ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - pViewSh->SplitAtPixel( Point( nPixelX, nPixelY ), sal_True, sal_True ); - pViewSh->FreezeSplitters( false ); - pViewSh->InvalidateSplit(); - } -} - -void SAL_CALL ScTabViewObj::freezeAtPosition( sal_Int32 nColumns, sal_Int32 nRows ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - // erst alles aufheben -> kein Stress mit Scrolling zwischendurch o.ae. - - pViewSh->RemoveSplit(); - - Point aWinStart; - Window* pWin = pViewSh->GetWindowByPos( SC_SPLIT_BOTTOMLEFT ); - if (pWin) - aWinStart = pWin->GetPosPixel(); - - ScViewData* pViewData = pViewSh->GetViewData(); - Point aSplit(pViewData->GetScrPos( (SCCOL)nColumns, (SCROW)nRows, SC_SPLIT_BOTTOMLEFT, sal_True )); - aSplit += aWinStart; - - pViewSh->SplitAtPixel( aSplit, sal_True, sal_True ); - pViewSh->FreezeSplitters( sal_True ); - pViewSh->InvalidateSplit(); - } -} - -void SAL_CALL ScTabViewObj::addSelectionChangeListener( - const uno::Reference<view::XSelectionChangeListener>& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<view::XSelectionChangeListener>* pObj = - new uno::Reference<view::XSelectionChangeListener>( xListener ); - aSelectionListeners.Insert( pObj, aSelectionListeners.Count() ); -} - -void SAL_CALL ScTabViewObj::removeSelectionChangeListener( - const uno::Reference< view::XSelectionChangeListener >& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aSelectionListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<view::XSelectionChangeListener> *pObj = aSelectionListeners[n]; - if ( *pObj == xListener ) //! wozu der Mumpitz mit queryInterface? - { - aSelectionListeners.DeleteAndDestroy( n ); - break; - } - } -} - -void ScTabViewObj::SelectionChanged() -{ - lang::EventObject aEvent; - aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); - for ( sal_uInt16 n=0; n<aSelectionListeners.Count(); n++ ) - (*aSelectionListeners[n])->selectionChanged( aEvent ); - - // handle sheet events - ScTabViewShell* pViewSh = GetViewShell(); - ScViewData* pViewData = pViewSh->GetViewData(); - ScDocShell* pDocSh = pViewData->GetDocShell(); - ScDocument* pDoc = pDocSh->GetDocument(); - SCTAB nTab = pViewData->GetTabNo(); - const ScSheetEvents* pEvents = pDoc->GetSheetEvents(nTab); - if (pEvents) - { - const rtl::OUString* pScript = pEvents->GetScript(SC_SHEETEVENT_SELECT); - if (pScript) - { - // the macro parameter is the selection as returned by getSelection - uno::Sequence<uno::Any> aParams(1); - aParams[0] = getSelection(); - uno::Any aRet; - uno::Sequence<sal_Int16> aOutArgsIndex; - uno::Sequence<uno::Any> aOutArgs; - /*ErrCode eRet =*/ pDocSh->CallXScript( *pScript, aParams, aRet, aOutArgsIndex, aOutArgs ); - } - } - // Removed Sun/Oracle code intentionally, it doesn't work properly ( selection should be fired after mouse release ) -} - - -// XPropertySet (View-Optionen) -//! auch an der Applikation anbieten? - -uno::Reference<beans::XPropertySetInfo> SAL_CALL ScTabViewObj::getPropertySetInfo() - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - static uno::Reference<beans::XPropertySetInfo> aRef( - new SfxItemPropertySetInfo( aPropSet.getPropertyMap() )); - return aRef; -} - -void SAL_CALL ScTabViewObj::setPropertyValue( - const rtl::OUString& aPropertyName, const uno::Any& aValue ) - throw(beans::UnknownPropertyException, beans::PropertyVetoException, - lang::IllegalArgumentException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aPropertyName); - - if ( aString.EqualsAscii(SC_UNO_FILTERED_RANGE_SELECTION) ) - { - bFilteredRangeSelection = ScUnoHelpFunctions::GetBoolFromAny(aValue); - return; - } - - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - ScViewData* pViewData = pViewSh->GetViewData(); - const ScViewOptions& rOldOpt = pViewSh->GetViewData()->GetOptions(); - ScViewOptions aNewOpt(rOldOpt); - - if ( aString.EqualsAscii( SC_UNO_COLROWHDR ) || aString.EqualsAscii( OLD_UNO_COLROWHDR ) ) - aNewOpt.SetOption( VOPT_HEADER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_HORSCROLL ) || aString.EqualsAscii( OLD_UNO_HORSCROLL ) ) - aNewOpt.SetOption( VOPT_HSCROLL, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_OUTLSYMB ) || aString.EqualsAscii( OLD_UNO_OUTLSYMB ) ) - aNewOpt.SetOption( VOPT_OUTLINER, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_SHEETTABS ) || aString.EqualsAscii( OLD_UNO_SHEETTABS ) ) - aNewOpt.SetOption( VOPT_TABCONTROLS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWANCHOR ) ) - aNewOpt.SetOption( VOPT_ANCHOR, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWFORM ) ) - aNewOpt.SetOption( VOPT_FORMULAS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWGRID ) ) - aNewOpt.SetOption( VOPT_GRID, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWHELP ) ) - aNewOpt.SetOption( VOPT_HELPLINES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWNOTES ) ) - aNewOpt.SetOption( VOPT_NOTES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWPAGEBR ) ) - aNewOpt.SetOption( VOPT_PAGEBREAKS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWZERO ) ) - aNewOpt.SetOption( VOPT_NULLVALS, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWSOLID ) ) - aNewOpt.SetOption( VOPT_SOLIDHANDLES, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_VALUEHIGH ) || aString.EqualsAscii( OLD_UNO_VALUEHIGH ) ) - aNewOpt.SetOption( VOPT_SYNTAX, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_VERTSCROLL ) || aString.EqualsAscii( OLD_UNO_VERTSCROLL ) ) - aNewOpt.SetOption( VOPT_VSCROLL, ScUnoHelpFunctions::GetBoolFromAny( aValue ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWOBJ ) ) - { - sal_Int16 nIntVal = 0; - if ( aValue >>= nIntVal ) - { - //#i80528# adapt to new range eventually - if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW; - - aNewOpt.SetObjMode( VOBJ_TYPE_OLE, (ScVObjMode)nIntVal); - } - } - else if ( aString.EqualsAscii( SC_UNO_SHOWCHARTS ) ) - { - sal_Int16 nIntVal = 0; - if ( aValue >>= nIntVal ) - { - //#i80528# adapt to new range eventually - if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW; - - aNewOpt.SetObjMode( VOBJ_TYPE_CHART, (ScVObjMode)nIntVal); - } - } - else if ( aString.EqualsAscii( SC_UNO_SHOWDRAW ) ) - { - sal_Int16 nIntVal = 0; - if ( aValue >>= nIntVal ) - { - //#i80528# adapt to new range eventually - if((sal_Int16)VOBJ_MODE_HIDE < nIntVal) nIntVal = (sal_Int16)VOBJ_MODE_SHOW; - - aNewOpt.SetObjMode( VOBJ_TYPE_DRAW, (ScVObjMode)nIntVal); - } - } - else if ( aString.EqualsAscii( SC_UNO_GRIDCOLOR ) ) - { - sal_Int32 nIntVal = 0; - if ( aValue >>= nIntVal ) - aNewOpt.SetGridColor( nIntVal, String() ); - } - else if ( aString.EqualsAscii( SC_UNO_ZOOMTYPE ) ) - { - sal_Int16 nIntVal = 0; - if ( aValue >>= nIntVal ) - SetZoomType(nIntVal); - } - else if ( aString.EqualsAscii( SC_UNO_ZOOMVALUE ) ) - { - sal_Int16 nIntVal = 0; - if ( aValue >>= nIntVal ) - SetZoom(nIntVal); - } - - // Optionen werden an der View und am Dokument (fuer neue Views) gesetzt, - // damit sie beim Speichern erhalten bleiben. - //! An der App (Module) braeuchte man noch eine Extra-Moeglichkeit, - //! das einzustellen (fuer neue Dokumente) - - if ( aNewOpt != rOldOpt ) - { - pViewData->SetOptions( aNewOpt ); - pViewData->GetDocument()->SetViewOptions( aNewOpt ); - pViewData->GetDocShell()->SetDocumentModified(); //! wirklich? - - pViewSh->UpdateFixPos(); - pViewSh->PaintGrid(); - pViewSh->PaintTop(); - pViewSh->PaintLeft(); - pViewSh->PaintExtras(); - pViewSh->InvalidateBorder(); - - SfxBindings& rBindings = pViewSh->GetViewFrame()->GetBindings(); - rBindings.Invalidate( FID_TOGGLEHEADERS ); // -> Checks im Menue - rBindings.Invalidate( FID_TOGGLESYNTAX ); - } - } -} - -uno::Any SAL_CALL ScTabViewObj::getPropertyValue( const rtl::OUString& aPropertyName ) - throw(beans::UnknownPropertyException, lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - String aString(aPropertyName); - uno::Any aRet; - - if ( aString.EqualsAscii(SC_UNO_FILTERED_RANGE_SELECTION) ) - { - ScUnoHelpFunctions::SetBoolInAny(aRet, bFilteredRangeSelection); - return aRet; - } - - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - const ScViewOptions& rOpt = pViewSh->GetViewData()->GetOptions(); - - if ( aString.EqualsAscii( SC_UNO_COLROWHDR ) || aString.EqualsAscii( OLD_UNO_COLROWHDR ) ) - ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HEADER ) ); - else if ( aString.EqualsAscii( SC_UNO_HORSCROLL ) || aString.EqualsAscii( OLD_UNO_HORSCROLL ) ) - ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HSCROLL ) ); - else if ( aString.EqualsAscii( SC_UNO_OUTLSYMB ) || aString.EqualsAscii( OLD_UNO_OUTLSYMB ) ) - ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_OUTLINER ) ); - else if ( aString.EqualsAscii( SC_UNO_SHEETTABS ) || aString.EqualsAscii( OLD_UNO_SHEETTABS ) ) - ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_TABCONTROLS ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWANCHOR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_ANCHOR ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWFORM ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_FORMULAS ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWGRID ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_GRID ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWHELP ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_HELPLINES ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWNOTES ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_NOTES ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWPAGEBR ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_PAGEBREAKS ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWZERO ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_NULLVALS ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWSOLID ) ) ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_SOLIDHANDLES ) ); - else if ( aString.EqualsAscii( SC_UNO_VALUEHIGH ) || aString.EqualsAscii( OLD_UNO_VALUEHIGH ) ) - ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_SYNTAX ) ); - else if ( aString.EqualsAscii( SC_UNO_VERTSCROLL ) || aString.EqualsAscii( OLD_UNO_VERTSCROLL ) ) - ScUnoHelpFunctions::SetBoolInAny( aRet, rOpt.GetOption( VOPT_VSCROLL ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWOBJ ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_OLE ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWCHARTS ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_CHART ) ); - else if ( aString.EqualsAscii( SC_UNO_SHOWDRAW ) ) aRet <<= (sal_Int16)( rOpt.GetObjMode( VOBJ_TYPE_DRAW ) ); - else if ( aString.EqualsAscii( SC_UNO_GRIDCOLOR ) ) aRet <<= (sal_Int32)( rOpt.GetGridColor().GetColor() ); - else if ( aString.EqualsAscii( SC_UNO_VISAREA ) ) aRet <<= GetVisArea(); - else if ( aString.EqualsAscii( SC_UNO_ZOOMTYPE ) ) aRet <<= GetZoomType(); - else if ( aString.EqualsAscii( SC_UNO_ZOOMVALUE ) ) aRet <<= GetZoom(); - else if ( aString.EqualsAscii( SC_UNO_VISAREASCREEN ) ) - { - ScViewData* pViewData = pViewSh->GetViewData(); - Window* pActiveWin = ( pViewData ? pViewData->GetActiveWin() : NULL ); - if ( pActiveWin ) - { - Rectangle aRect = pActiveWin->GetWindowExtentsRelative( NULL ); - aRet <<= AWTRectangle( aRect ); - } - } - } - - return aRet; -} - -void SAL_CALL ScTabViewObj::addPropertyChangeListener( const ::rtl::OUString& /* aPropertyName */, - const uno::Reference<beans::XPropertyChangeListener >& xListener ) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<beans::XPropertyChangeListener>* pObj = - new uno::Reference<beans::XPropertyChangeListener>( xListener ); - aPropertyChgListeners.Insert( pObj, aPropertyChgListeners.Count() ); -} - -void SAL_CALL ScTabViewObj::removePropertyChangeListener( const ::rtl::OUString& /* aPropertyName */, - const uno::Reference<beans::XPropertyChangeListener >& xListener ) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, - uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aPropertyChgListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<beans::XPropertyChangeListener> *pObj = aPropertyChgListeners[n]; - if ( *pObj == xListener ) //! wozu der Mumpitz mit queryInterface? - { - aPropertyChgListeners.DeleteAndDestroy( n ); - break; - } - } -} - -void SAL_CALL ScTabViewObj::addVetoableChangeListener( const ::rtl::OUString& /* PropertyName */, - const uno::Reference<beans::XVetoableChangeListener >& /* aListener */ ) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, - uno::RuntimeException) -{ -} - -void SAL_CALL ScTabViewObj::removeVetoableChangeListener( const ::rtl::OUString& /* PropertyName */, - const uno::Reference<beans::XVetoableChangeListener >& /* aListener */ ) - throw(beans::UnknownPropertyException, - lang::WrappedTargetException, - uno::RuntimeException) -{ -} - -void ScTabViewObj::VisAreaChanged() -{ - beans::PropertyChangeEvent aEvent; - aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); - for ( sal_uInt16 n=0; n<aPropertyChgListeners.Count(); n++ ) - (*aPropertyChgListeners[n])->propertyChange( aEvent ); -} - -// XRangeSelection - -void SAL_CALL ScTabViewObj::startRangeSelection( - const uno::Sequence<beans::PropertyValue>& aArguments ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - { - String aInitVal, aTitle; - sal_Bool bCloseOnButtonUp = false; - sal_Bool bSingleCell = false; - sal_Bool bMultiSelection = false; - - rtl::OUString aStrVal; - const beans::PropertyValue* pPropArray = aArguments.getConstArray(); - long nPropCount = aArguments.getLength(); - for (long i = 0; i < nPropCount; i++) - { - const beans::PropertyValue& rProp = pPropArray[i]; - String aPropName(rProp.Name); - - if (aPropName.EqualsAscii( SC_UNONAME_CLOSEONUP )) - bCloseOnButtonUp = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( SC_UNONAME_TITLE )) - { - if ( rProp.Value >>= aStrVal ) - aTitle = String( aStrVal ); - } - else if (aPropName.EqualsAscii( SC_UNONAME_INITVAL )) - { - if ( rProp.Value >>= aStrVal ) - aInitVal = String( aStrVal ); - } - else if (aPropName.EqualsAscii( SC_UNONAME_SINGLECELL )) - bSingleCell = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - else if (aPropName.EqualsAscii( SC_UNONAME_MULTISEL )) - bMultiSelection = ScUnoHelpFunctions::GetBoolFromAny( rProp.Value ); - } - - pViewSh->StartSimpleRefDialog( aTitle, aInitVal, bCloseOnButtonUp, bSingleCell, bMultiSelection ); - } -} - -void SAL_CALL ScTabViewObj::abortRangeSelection() throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScTabViewShell* pViewSh = GetViewShell(); - if (pViewSh) - pViewSh->StopSimpleRefDialog(); -} - -void SAL_CALL ScTabViewObj::addRangeSelectionListener( - const uno::Reference<sheet::XRangeSelectionListener>& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XRangeSelectionListener>* pObj = - new uno::Reference<sheet::XRangeSelectionListener>( xListener ); - aRangeSelListeners.Insert( pObj, aRangeSelListeners.Count() ); -} - -void SAL_CALL ScTabViewObj::removeRangeSelectionListener( - const uno::Reference<sheet::XRangeSelectionListener>& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aRangeSelListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<sheet::XRangeSelectionListener> *pObj = aRangeSelListeners[n]; - if ( *pObj == xListener ) - { - aRangeSelListeners.DeleteAndDestroy( n ); - break; - } - } -} - -void SAL_CALL ScTabViewObj::addRangeSelectionChangeListener( - const uno::Reference<sheet::XRangeSelectionChangeListener>& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - uno::Reference<sheet::XRangeSelectionChangeListener>* pObj = - new uno::Reference<sheet::XRangeSelectionChangeListener>( xListener ); - aRangeChgListeners.Insert( pObj, aRangeChgListeners.Count() ); -} - -void SAL_CALL ScTabViewObj::removeRangeSelectionChangeListener( - const uno::Reference<sheet::XRangeSelectionChangeListener>& xListener ) - throw(uno::RuntimeException) -{ - SolarMutexGuard aGuard; - sal_uInt16 nCount = aRangeChgListeners.Count(); - for ( sal_uInt16 n=nCount; n--; ) - { - uno::Reference<sheet::XRangeSelectionChangeListener> *pObj = aRangeChgListeners[n]; - if ( *pObj == xListener ) - { - aRangeChgListeners.DeleteAndDestroy( n ); - break; - } - } -} - -void ScTabViewObj::RangeSelDone( const String& rText ) -{ - sheet::RangeSelectionEvent aEvent; - aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); - aEvent.RangeDescriptor = rtl::OUString( rText ); - - for ( sal_uInt16 n=0; n<aRangeSelListeners.Count(); n++ ) - (*aRangeSelListeners[n])->done( aEvent ); -} - -void ScTabViewObj::RangeSelAborted( const String& rText ) -{ - sheet::RangeSelectionEvent aEvent; - aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); - aEvent.RangeDescriptor = rtl::OUString( rText ); - - for ( sal_uInt16 n=0; n<aRangeSelListeners.Count(); n++ ) - (*aRangeSelListeners[n])->aborted( aEvent ); -} - -void ScTabViewObj::RangeSelChanged( const String& rText ) -{ - sheet::RangeSelectionEvent aEvent; - aEvent.Source.set(static_cast<cppu::OWeakObject*>(this)); - aEvent.RangeDescriptor = rtl::OUString( rText ); - - for ( sal_uInt16 n=0; n<aRangeChgListeners.Count(); n++ ) - (*aRangeChgListeners[n])->descriptorChanged( aEvent ); -} - -// XServiceInfo - -rtl::OUString SAL_CALL ScTabViewObj::getImplementationName() throw(uno::RuntimeException) -{ - return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ScTabViewObj" )); -} - -sal_Bool SAL_CALL ScTabViewObj::supportsService( const rtl::OUString& rServiceName ) - throw(uno::RuntimeException) -{ - String aServiceStr( rServiceName ); - return aServiceStr.EqualsAscii( SCTABVIEWOBJ_SERVICE ) || - aServiceStr.EqualsAscii( SCVIEWSETTINGS_SERVICE ); -} - -uno::Sequence<rtl::OUString> SAL_CALL ScTabViewObj::getSupportedServiceNames() - throw(uno::RuntimeException) -{ - uno::Sequence<rtl::OUString> aRet(2); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCTABVIEWOBJ_SERVICE )); - pArray[1] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( SCVIEWSETTINGS_SERVICE )); - return aRet; -} - -// XUnoTunnel - -sal_Int64 SAL_CALL ScTabViewObj::getSomething( - const uno::Sequence<sal_Int8 >& rId ) throw(uno::RuntimeException) -{ - if ( rId.getLength() == 16 && - 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), - rId.getConstArray(), 16 ) ) - { - return sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); - } - return 0; -} - -namespace -{ - class theScTabViewObjUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theScTabViewObjUnoTunnelId> {}; -} - -const uno::Sequence<sal_Int8>& ScTabViewObj::getUnoTunnelId() -{ - return theScTabViewObjUnoTunnelId::get().getSeq(); -} - -ScTabViewObj* ScTabViewObj::getImplementation( const uno::Reference<uno::XInterface> xObj ) -{ - ScTabViewObj* pRet = NULL; - uno::Reference<lang::XUnoTunnel> xUT( xObj, uno::UNO_QUERY ); - if (xUT.is()) - pRet = reinterpret_cast<ScTabViewObj*>(sal::static_int_cast<sal_IntPtr>(xUT->getSomething(getUnoTunnelId()))); - return pRet; -} - -::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > SAL_CALL ScTabViewObj::getTransferable( ) throw (::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScEditShell* pShell = PTR_CAST( ScEditShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ); - if (pShell) - return pShell->GetEditView()->GetTransferable(); - - ScDrawTextObjectBar* pTextShell = PTR_CAST( ScDrawTextObjectBar, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ); - if (pTextShell) - { - ScViewData* pViewData = GetViewShell()->GetViewData(); - ScDrawView* pView = pViewData->GetScDrawView(); - OutlinerView* pOutView = pView->GetTextEditOutlinerView(); - if (pOutView) - return pOutView->GetEditView().GetTransferable(); - } - - ScDrawShell* pDrawShell = PTR_CAST( ScDrawShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ); - if (pDrawShell) - return pDrawShell->GetDrawView()->CopyToTransferable(); - - ScTransferObj* pObj = GetViewShell()->CopyToTransferable(); - uno::Reference<datatransfer::XTransferable> xTransferable( pObj ); - return xTransferable; -} - -void SAL_CALL ScTabViewObj::insertTransferable( const ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans ) throw (::com::sun::star::datatransfer::UnsupportedFlavorException, ::com::sun::star::uno::RuntimeException) -{ - SolarMutexGuard aGuard; - ScEditShell* pShell = PTR_CAST( ScEditShell, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ); - if (pShell) - pShell->GetEditView()->InsertText( xTrans, ::rtl::OUString(), false ); - else - { - ScDrawTextObjectBar* pTextShell = PTR_CAST( ScDrawTextObjectBar, GetViewShell()->GetViewFrame()->GetDispatcher()->GetShell(0) ); - if (pTextShell) - { - ScViewData* pViewData = GetViewShell()->GetViewData(); - ScDrawView* pView = pViewData->GetScDrawView(); - OutlinerView* pOutView = pView->GetTextEditOutlinerView(); - if ( pOutView ) - { - pOutView->GetEditView().InsertText( xTrans, ::rtl::OUString(), false ); - return; - } - } - - GetViewShell()->PasteFromTransferable( xTrans ); - } -} - -//------------------------------------------------------------------------ - - - - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/unoobj/warnpassword.cxx b/sc/source/ui/unoobj/warnpassword.cxx deleted file mode 100644 index 426644d9f..000000000 --- a/sc/source/ui/unoobj/warnpassword.cxx +++ /dev/null @@ -1,97 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_sc.hxx" - -// ============================================================================ -#include "warnpassword.hxx" -#include <com/sun/star/task/XInteractionHandler.hpp> -#include <com/sun/star/task/XInteractionRequest.hpp> -#include <svl/itemset.hxx> -#include <sfx2/docfile.hxx> -#include <sfx2/sfxsids.hrc> -#include <ucbhelper/simpleinteractionrequest.hxx> -#include <com/sun/star/task/InteractionClassification.hpp> -#include <com/sun/star/ucb/InteractiveAppException.hpp> -#include <com/sun/star/ucb/XContent.hpp> -#include <svx/svxerr.hxx> - - -using ::rtl::OUString; -using ::com::sun::star::uno::makeAny; -using ::com::sun::star::uno::Any; -using ::com::sun::star::uno::Reference; -using ::com::sun::star::uno::Exception; -using ::com::sun::star::uno::XInterface; -using ::com::sun::star::task::InteractionClassification_QUERY; -using ::com::sun::star::task::XInteractionHandler; -using ::com::sun::star::task::XInteractionRequest; -using ::com::sun::star::ucb::InteractiveAppException; - -bool ScWarnPassword::WarningOnPassword( SfxMedium& rMedium ) -{ - bool bReturn = true; - Reference< XInteractionHandler > xHandler( rMedium.GetInteractionHandler()); - if( xHandler.is() ) - { - - OUString empty; - Any xException( makeAny(InteractiveAppException(empty, - Reference <XInterface> (), - InteractionClassification_QUERY, - ERRCODE_SVX_EXPORT_FILTER_CRYPT))); - - Reference< ucbhelper::SimpleInteractionRequest > xRequest - = new ucbhelper::SimpleInteractionRequest( - xException, - ucbhelper::CONTINUATION_APPROVE - | ucbhelper::CONTINUATION_DISAPPROVE ); - - xHandler->handle( xRequest.get() ); - - const sal_Int32 nResp = xRequest->getResponse(); - - switch ( nResp ) - { - case ucbhelper::CONTINUATION_UNKNOWN: - break; - - case ucbhelper::CONTINUATION_APPROVE: - // Continue - break; - - case ucbhelper::CONTINUATION_DISAPPROVE: - bReturn = false; - break; - } - } - return bReturn; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |