1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef EXTENSIONS_PROPCTRLR_CELLBINDINGHELPER_HXX 25*b1cdbd2cSJim Jagielski #define EXTENSIONS_PROPCTRLR_CELLBINDINGHELPER_HXX 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski /** === begin UNO includes === **/ 28*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XModel.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/sheet/XSpreadsheetDocument.hpp> 31*b1cdbd2cSJim Jagielski #include <com/sun/star/table/CellAddress.hpp> 32*b1cdbd2cSJim Jagielski #include <com/sun/star/table/CellRangeAddress.hpp> 33*b1cdbd2cSJim Jagielski #include <com/sun/star/form/binding/XValueBinding.hpp> 34*b1cdbd2cSJim Jagielski #include <com/sun/star/form/binding/XListEntrySource.hpp> 35*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp> 36*b1cdbd2cSJim Jagielski #include <com/sun/star/sheet/XSpreadsheet.hpp> 37*b1cdbd2cSJim Jagielski /** === end UNO includes === **/ 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski //............................................................................ 40*b1cdbd2cSJim Jagielski namespace pcr 41*b1cdbd2cSJim Jagielski { 42*b1cdbd2cSJim Jagielski //............................................................................ 43*b1cdbd2cSJim Jagielski 44*b1cdbd2cSJim Jagielski //======================================================================== 45*b1cdbd2cSJim Jagielski //= CellBindingHelper 46*b1cdbd2cSJim Jagielski //======================================================================== 47*b1cdbd2cSJim Jagielski /** encapsulates functionality related to binding a form control to a spreadsheet cell 48*b1cdbd2cSJim Jagielski */ 49*b1cdbd2cSJim Jagielski class CellBindingHelper 50*b1cdbd2cSJim Jagielski { 51*b1cdbd2cSJim Jagielski protected: 52*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > 53*b1cdbd2cSJim Jagielski m_xControlModel; // the model we work for 54*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheetDocument > 55*b1cdbd2cSJim Jagielski m_xDocument; // the document where the model lives 56*b1cdbd2cSJim Jagielski 57*b1cdbd2cSJim Jagielski public: 58*b1cdbd2cSJim Jagielski /** ctor 59*b1cdbd2cSJim Jagielski @param _rxControlModel 60*b1cdbd2cSJim Jagielski the control model which is or will be bound 61*b1cdbd2cSJim Jagielski */ 62*b1cdbd2cSJim Jagielski CellBindingHelper( 63*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxControlModel, 64*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& _rxContextDocument 65*b1cdbd2cSJim Jagielski ); 66*b1cdbd2cSJim Jagielski 67*b1cdbd2cSJim Jagielski public: 68*b1cdbd2cSJim Jagielski /** determines whether the given model is a spreadsheet document model 69*b1cdbd2cSJim Jagielski 70*b1cdbd2cSJim Jagielski <p>If this method returns <FALSE/>, you cannot instantiate a CellBindingHelper with 71*b1cdbd2cSJim Jagielski the document, since then no of it's functionality will be available.</p> 72*b1cdbd2cSJim Jagielski */ 73*b1cdbd2cSJim Jagielski static sal_Bool isSpreadsheetDocument( 74*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XModel >& _rxContextDocument 75*b1cdbd2cSJim Jagielski ); 76*b1cdbd2cSJim Jagielski 77*b1cdbd2cSJim Jagielski /** gets a cell binding for the given address 78*b1cdbd2cSJim Jagielski @precond 79*b1cdbd2cSJim Jagielski isCellBindingAllowed returns <TRUE/> 80*b1cdbd2cSJim Jagielski */ 81*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding > 82*b1cdbd2cSJim Jagielski createCellBindingFromStringAddress( 83*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rAddress, 84*b1cdbd2cSJim Jagielski bool _bSupportIntegerExchange = false 85*b1cdbd2cSJim Jagielski ) const; 86*b1cdbd2cSJim Jagielski 87*b1cdbd2cSJim Jagielski /** creates a cell binding (supporting integer exchange, if requested) for 88*b1cdbd2cSJim Jagielski the given address object 89*b1cdbd2cSJim Jagielski */ 90*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding > 91*b1cdbd2cSJim Jagielski createCellBindingFromAddress( 92*b1cdbd2cSJim Jagielski const ::com::sun::star::table::CellAddress& _rAddress, 93*b1cdbd2cSJim Jagielski bool _bSupportIntegerExchange = false 94*b1cdbd2cSJim Jagielski ) const; 95*b1cdbd2cSJim Jagielski 96*b1cdbd2cSJim Jagielski /** gets a cell range list source binding for the given address 97*b1cdbd2cSJim Jagielski */ 98*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XListEntrySource > 99*b1cdbd2cSJim Jagielski createCellListSourceFromStringAddress( const ::rtl::OUString& _rAddress ) const; 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski /** creates a string representation for the given value binding's address 102*b1cdbd2cSJim Jagielski 103*b1cdbd2cSJim Jagielski <p>If the sheet of the bound cell is the same as the sheet which our control belongs 104*b1cdbd2cSJim Jagielski to, then the sheet name is omitted in the resulting string representation.</p> 105*b1cdbd2cSJim Jagielski 106*b1cdbd2cSJim Jagielski @precond 107*b1cdbd2cSJim Jagielski The binding is a valid cell binding, or <NULL/> 108*b1cdbd2cSJim Jagielski @see isCellBinding 109*b1cdbd2cSJim Jagielski */ 110*b1cdbd2cSJim Jagielski ::rtl::OUString getStringAddressFromCellBinding( 111*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >& _rxBinding 112*b1cdbd2cSJim Jagielski ) const; 113*b1cdbd2cSJim Jagielski 114*b1cdbd2cSJim Jagielski /** creates an address object for the given value binding's address 115*b1cdbd2cSJim Jagielski 116*b1cdbd2cSJim Jagielski @precond 117*b1cdbd2cSJim Jagielski The binding is a valid cell binding, or <NULL/> 118*b1cdbd2cSJim Jagielski @return 119*b1cdbd2cSJim Jagielski <FALSE/> if and only if an error occured and no valid address could be obtained 120*b1cdbd2cSJim Jagielski @see isCellBinding 121*b1cdbd2cSJim Jagielski */ 122*b1cdbd2cSJim Jagielski bool getAddressFromCellBinding( 123*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >& _rxBinding, 124*b1cdbd2cSJim Jagielski ::com::sun::star::table::CellAddress& _rAddress 125*b1cdbd2cSJim Jagielski ) const; 126*b1cdbd2cSJim Jagielski 127*b1cdbd2cSJim Jagielski /** creates a string representation for the given list source's range address 128*b1cdbd2cSJim Jagielski 129*b1cdbd2cSJim Jagielski <p>If the sheet of the cell range which acts as list source is the same as the 130*b1cdbd2cSJim Jagielski sheet which our control belongs to, then the sheet name is omitted in the 131*b1cdbd2cSJim Jagielski resulting string representation.</p> 132*b1cdbd2cSJim Jagielski 133*b1cdbd2cSJim Jagielski @precond 134*b1cdbd2cSJim Jagielski The object is a valid cell range list source, or <NULL/> 135*b1cdbd2cSJim Jagielski @see isCellRangeListSource 136*b1cdbd2cSJim Jagielski */ 137*b1cdbd2cSJim Jagielski ::rtl::OUString getStringAddressFromCellListSource( 138*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XListEntrySource >& _rxSource 139*b1cdbd2cSJim Jagielski ) const; 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski /** returns the current binding of our control model, if any. 142*b1cdbd2cSJim Jagielski */ 143*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding > 144*b1cdbd2cSJim Jagielski getCurrentBinding( ) const; 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski /** returns the current external list source of the control model, if any 147*b1cdbd2cSJim Jagielski */ 148*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XListEntrySource > 149*b1cdbd2cSJim Jagielski getCurrentListSource( ) const; 150*b1cdbd2cSJim Jagielski 151*b1cdbd2cSJim Jagielski /** sets a new binding for our control model 152*b1cdbd2cSJim Jagielski @precond 153*b1cdbd2cSJim Jagielski the control model is bindable (which is implied by <member>isCellBindingAllowed</member> 154*b1cdbd2cSJim Jagielski returning <TRUE/>) 155*b1cdbd2cSJim Jagielski */ 156*b1cdbd2cSJim Jagielski void setBinding( 157*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >& _rxBinding 158*b1cdbd2cSJim Jagielski ); 159*b1cdbd2cSJim Jagielski 160*b1cdbd2cSJim Jagielski /** sets a list source for our control model 161*b1cdbd2cSJim Jagielski @precond 162*b1cdbd2cSJim Jagielski the control model is a list sink (which is implied by <member>isListCellRangeAllowed</member> 163*b1cdbd2cSJim Jagielski returning <TRUE/>) 164*b1cdbd2cSJim Jagielski */ 165*b1cdbd2cSJim Jagielski void setListSource( 166*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XListEntrySource >& _rxSource 167*b1cdbd2cSJim Jagielski ); 168*b1cdbd2cSJim Jagielski 169*b1cdbd2cSJim Jagielski /** checks whether it's possible to bind the control model to a spreadsheet cell 170*b1cdbd2cSJim Jagielski */ 171*b1cdbd2cSJim Jagielski bool isCellBindingAllowed( ) const; 172*b1cdbd2cSJim Jagielski 173*b1cdbd2cSJim Jagielski /** checks whether it's possible to bind the control model to a spreadsheet cell, 174*b1cdbd2cSJim Jagielski with exchanging integer values 175*b1cdbd2cSJim Jagielski */ 176*b1cdbd2cSJim Jagielski bool isCellIntegerBindingAllowed( ) const; 177*b1cdbd2cSJim Jagielski 178*b1cdbd2cSJim Jagielski /** checks whether it's possible to bind the control model to range of spreadsheet cells 179*b1cdbd2cSJim Jagielski supplying the list entries 180*b1cdbd2cSJim Jagielski */ 181*b1cdbd2cSJim Jagielski bool isListCellRangeAllowed( ) const; 182*b1cdbd2cSJim Jagielski 183*b1cdbd2cSJim Jagielski /** checks whether a given binding is a spreadsheet cell binding 184*b1cdbd2cSJim Jagielski */ 185*b1cdbd2cSJim Jagielski bool isCellBinding( 186*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >& _rxBinding 187*b1cdbd2cSJim Jagielski ) const; 188*b1cdbd2cSJim Jagielski 189*b1cdbd2cSJim Jagielski /** checks whether a given binding is a spreadsheet cell binding, exchanging 190*b1cdbd2cSJim Jagielski integer values 191*b1cdbd2cSJim Jagielski */ 192*b1cdbd2cSJim Jagielski bool isCellIntegerBinding( 193*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XValueBinding >& _rxBinding 194*b1cdbd2cSJim Jagielski ) const; 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski /** checks whether a given list source is a spreadsheet cell list source 197*b1cdbd2cSJim Jagielski */ 198*b1cdbd2cSJim Jagielski bool isCellRangeListSource( 199*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::form::binding::XListEntrySource >& _rxSource 200*b1cdbd2cSJim Jagielski ) const; 201*b1cdbd2cSJim Jagielski 202*b1cdbd2cSJim Jagielski /** retrieves the index of the sheet which our control belongs to 203*b1cdbd2cSJim Jagielski @return the index of the sheet which our control belongs to or -1, if an error occured 204*b1cdbd2cSJim Jagielski */ 205*b1cdbd2cSJim Jagielski sal_Int16 getControlSheetIndex( 206*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XSpreadsheet >& _out_rxSheet 207*b1cdbd2cSJim Jagielski ) const; 208*b1cdbd2cSJim Jagielski 209*b1cdbd2cSJim Jagielski protected: 210*b1cdbd2cSJim Jagielski /** creates an address object from a string representation of a cell address 211*b1cdbd2cSJim Jagielski */ 212*b1cdbd2cSJim Jagielski bool convertStringAddress( 213*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rAddressDescription, 214*b1cdbd2cSJim Jagielski ::com::sun::star::table::CellAddress& /* [out] */ _rAddress 215*b1cdbd2cSJim Jagielski ) const; 216*b1cdbd2cSJim Jagielski 217*b1cdbd2cSJim Jagielski /** creates an address range object from a string representation of a cell range address 218*b1cdbd2cSJim Jagielski */ 219*b1cdbd2cSJim Jagielski bool convertStringAddress( 220*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rAddressDescription, 221*b1cdbd2cSJim Jagielski ::com::sun::star::table::CellRangeAddress& /* [out] */ _rAddress 222*b1cdbd2cSJim Jagielski ) const; 223*b1cdbd2cSJim Jagielski 224*b1cdbd2cSJim Jagielski /** determines if our document is a spreadsheet document, *and* can supply 225*b1cdbd2cSJim Jagielski the given service 226*b1cdbd2cSJim Jagielski */ 227*b1cdbd2cSJim Jagielski bool isSpreadsheetDocumentWhichSupplies( const ::rtl::OUString& _rService ) const; 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski /** checkes whether a given component supports a given servive 230*b1cdbd2cSJim Jagielski */ 231*b1cdbd2cSJim Jagielski bool doesComponentSupport( 232*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxComponent, 233*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rService 234*b1cdbd2cSJim Jagielski ) const; 235*b1cdbd2cSJim Jagielski 236*b1cdbd2cSJim Jagielski /** uses the document (it's factory interface, respectively) to create a component instance 237*b1cdbd2cSJim Jagielski @param _rService 238*b1cdbd2cSJim Jagielski the service name 239*b1cdbd2cSJim Jagielski @param _rArgumentName 240*b1cdbd2cSJim Jagielski the name of the single argument to pass during creation. May be empty, in this case 241*b1cdbd2cSJim Jagielski no arguments are passed 242*b1cdbd2cSJim Jagielski @param _rArgumentValue 243*b1cdbd2cSJim Jagielski the value of the instantiation argument. Not evaluated if <arg>_rArgumentName</arg> 244*b1cdbd2cSJim Jagielski is empty. 245*b1cdbd2cSJim Jagielski */ 246*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > 247*b1cdbd2cSJim Jagielski createDocumentDependentInstance( 248*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rService, 249*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rArgumentName, 250*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Any& _rArgumentValue 251*b1cdbd2cSJim Jagielski ) const; 252*b1cdbd2cSJim Jagielski 253*b1cdbd2cSJim Jagielski /** converts an address representation into another one 254*b1cdbd2cSJim Jagielski 255*b1cdbd2cSJim Jagielski @param _rInputProperty 256*b1cdbd2cSJim Jagielski the input property name for the conversion service 257*b1cdbd2cSJim Jagielski @param _rInputValue 258*b1cdbd2cSJim Jagielski the input property value for the conversion service 259*b1cdbd2cSJim Jagielski @param _rOutputProperty 260*b1cdbd2cSJim Jagielski the output property name for the conversion service 261*b1cdbd2cSJim Jagielski @param _rOutputValue 262*b1cdbd2cSJim Jagielski the output property value for the conversion service 263*b1cdbd2cSJim Jagielski @param _bIsRange 264*b1cdbd2cSJim Jagielski if <TRUE/>, the RangeAddressConversion service will be used, else 265*b1cdbd2cSJim Jagielski the AddressConversion service 266*b1cdbd2cSJim Jagielski 267*b1cdbd2cSJim Jagielski @return 268*b1cdbd2cSJim Jagielski <TRUE/> if any only if the conversion was successfull 269*b1cdbd2cSJim Jagielski 270*b1cdbd2cSJim Jagielski @see com::sun::star::table::CellAddressConversion 271*b1cdbd2cSJim Jagielski @see com::sun::star::table::CellRangeAddressConversion 272*b1cdbd2cSJim Jagielski */ 273*b1cdbd2cSJim Jagielski bool doConvertAddressRepresentations( 274*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rInputProperty, 275*b1cdbd2cSJim Jagielski const ::com::sun::star::uno::Any& _rInputValue, 276*b1cdbd2cSJim Jagielski const ::rtl::OUString& _rOutputProperty, 277*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Any& _rOutputValue, 278*b1cdbd2cSJim Jagielski bool _bIsRange 279*b1cdbd2cSJim Jagielski ) const SAL_THROW(()); 280*b1cdbd2cSJim Jagielski }; 281*b1cdbd2cSJim Jagielski 282*b1cdbd2cSJim Jagielski //............................................................................ 283*b1cdbd2cSJim Jagielski } // namespace pcr 284*b1cdbd2cSJim Jagielski //............................................................................ 285*b1cdbd2cSJim Jagielski 286*b1cdbd2cSJim Jagielski #endif // EXTENSIONS_PROPCTRLR_CELLBINDINGHELPER_HXX 287