xref: /aoo4110/main/sc/source/ui/vba/vbasheetobject.cxx (revision b1cdbd2c)
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 #include "vbasheetobject.hxx"
25*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/TextAlign.hpp>
26*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexContainer.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/drawing/XControlShape.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/script/ScriptEventDescriptor.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/script/XEventAttacherManager.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/style/VerticalAlignment.hpp>
31*b1cdbd2cSJim Jagielski #include <ooo/vba/excel/Constants.hpp>
32*b1cdbd2cSJim Jagielski #include <ooo/vba/excel/XlOrientation.hpp>
33*b1cdbd2cSJim Jagielski #include <ooo/vba/excel/XlPlacement.hpp>
34*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
35*b1cdbd2cSJim Jagielski #include <filter/msfilter/msvbahelper.hxx>
36*b1cdbd2cSJim Jagielski #include <oox/helper/helper.hxx>
37*b1cdbd2cSJim Jagielski #include <svx/unoshape.hxx>
38*b1cdbd2cSJim Jagielski #include "vbafont.hxx"
39*b1cdbd2cSJim Jagielski #include "drwlayer.hxx"
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski using ::rtl::OUString;
42*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
43*b1cdbd2cSJim Jagielski using namespace ::ooo::vba;
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski // ============================================================================
46*b1cdbd2cSJim Jagielski 
ScVbaButtonCharacters(const uno::Reference<XHelperInterface> & rxParent,const uno::Reference<uno::XComponentContext> & rxContext,const uno::Reference<beans::XPropertySet> & rxPropSet,const ScVbaPalette & rPalette,const uno::Any & rStart,const uno::Any & rLength)47*b1cdbd2cSJim Jagielski ScVbaButtonCharacters::ScVbaButtonCharacters(
48*b1cdbd2cSJim Jagielski         const uno::Reference< XHelperInterface >& rxParent,
49*b1cdbd2cSJim Jagielski         const uno::Reference< uno::XComponentContext >& rxContext,
50*b1cdbd2cSJim Jagielski         const uno::Reference< beans::XPropertySet >& rxPropSet,
51*b1cdbd2cSJim Jagielski         const ScVbaPalette& rPalette,
52*b1cdbd2cSJim Jagielski         const uno::Any& rStart,
53*b1cdbd2cSJim Jagielski         const uno::Any& rLength ) throw (uno::RuntimeException) :
54*b1cdbd2cSJim Jagielski     ScVbaButtonCharacters_BASE( rxParent, rxContext ),
55*b1cdbd2cSJim Jagielski     maPalette( rPalette ),
56*b1cdbd2cSJim Jagielski     mxPropSet( rxPropSet, uno::UNO_SET_THROW )
57*b1cdbd2cSJim Jagielski {
58*b1cdbd2cSJim Jagielski     // extract optional start parameter (missing or invalid -> from beginning)
59*b1cdbd2cSJim Jagielski     if( !(rStart >>= mnStart) || (mnStart < 1) )
60*b1cdbd2cSJim Jagielski         mnStart = 1;
61*b1cdbd2cSJim Jagielski     --mnStart;  // VBA is 1-based, rtl string is 0-based
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski     // extract optional length parameter (missing or invalid -> to end)
64*b1cdbd2cSJim Jagielski     if( !(rLength >>= mnLength) || (mnLength < 1) )
65*b1cdbd2cSJim Jagielski         mnLength = SAL_MAX_INT32;
66*b1cdbd2cSJim Jagielski }
67*b1cdbd2cSJim Jagielski 
~ScVbaButtonCharacters()68*b1cdbd2cSJim Jagielski ScVbaButtonCharacters::~ScVbaButtonCharacters()
69*b1cdbd2cSJim Jagielski {
70*b1cdbd2cSJim Jagielski }
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski // XCharacters attributes
73*b1cdbd2cSJim Jagielski 
getCaption()74*b1cdbd2cSJim Jagielski OUString SAL_CALL ScVbaButtonCharacters::getCaption() throw (uno::RuntimeException)
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski     // ignore invalid mnStart and/or mnLength members
77*b1cdbd2cSJim Jagielski     OUString aString = getFullString();
78*b1cdbd2cSJim Jagielski     sal_Int32 nStart = ::std::min( mnStart, aString.getLength() );
79*b1cdbd2cSJim Jagielski     sal_Int32 nLength = ::std::min( mnLength, aString.getLength() - nStart );
80*b1cdbd2cSJim Jagielski     return aString.copy( nStart, nLength );
81*b1cdbd2cSJim Jagielski }
82*b1cdbd2cSJim Jagielski 
setCaption(const OUString & rCaption)83*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaButtonCharacters::setCaption( const OUString& rCaption ) throw (uno::RuntimeException)
84*b1cdbd2cSJim Jagielski {
85*b1cdbd2cSJim Jagielski     /*  Replace the covered text with the passed text, ignore invalid mnStart
86*b1cdbd2cSJim Jagielski         and/or mnLength members. This operation does not affect the mnLength
87*b1cdbd2cSJim Jagielski         parameter. If the inserted text is longer than mnLength, the additional
88*b1cdbd2cSJim Jagielski         characters are not covered by this object. If the inserted text is
89*b1cdbd2cSJim Jagielski         shorter than mnLength, other uncovered characters from the original
90*b1cdbd2cSJim Jagielski         string will be covered now, thus may be changed with subsequent
91*b1cdbd2cSJim Jagielski         operations. */
92*b1cdbd2cSJim Jagielski     OUString aString = getFullString();
93*b1cdbd2cSJim Jagielski     sal_Int32 nStart = ::std::min( mnStart, aString.getLength() );
94*b1cdbd2cSJim Jagielski     sal_Int32 nLength = ::std::min( mnLength, aString.getLength() - nStart );
95*b1cdbd2cSJim Jagielski     setFullString( aString.replaceAt( nStart, nLength, rCaption ) );
96*b1cdbd2cSJim Jagielski }
97*b1cdbd2cSJim Jagielski 
getCount()98*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScVbaButtonCharacters::getCount() throw (uno::RuntimeException)
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski     // always return the total length of the caption
101*b1cdbd2cSJim Jagielski     return getFullString().getLength();
102*b1cdbd2cSJim Jagielski }
103*b1cdbd2cSJim Jagielski 
getText()104*b1cdbd2cSJim Jagielski OUString SAL_CALL ScVbaButtonCharacters::getText() throw (uno::RuntimeException)
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski     // Text attribute same as Caption attribute?
107*b1cdbd2cSJim Jagielski     return getCaption();
108*b1cdbd2cSJim Jagielski }
109*b1cdbd2cSJim Jagielski 
setText(const OUString & rText)110*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaButtonCharacters::setText( const OUString& rText ) throw (uno::RuntimeException)
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski     // Text attribute same as Caption attribute?
113*b1cdbd2cSJim Jagielski     setCaption( rText );
114*b1cdbd2cSJim Jagielski }
115*b1cdbd2cSJim Jagielski 
getFont()116*b1cdbd2cSJim Jagielski uno::Reference< excel::XFont > SAL_CALL ScVbaButtonCharacters::getFont() throw (uno::RuntimeException)
117*b1cdbd2cSJim Jagielski {
118*b1cdbd2cSJim Jagielski     return new ScVbaFont( this, mxContext, maPalette, mxPropSet, 0, true );
119*b1cdbd2cSJim Jagielski }
120*b1cdbd2cSJim Jagielski 
setFont(const uno::Reference<excel::XFont> &)121*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaButtonCharacters::setFont( const uno::Reference< excel::XFont >& /*rxFont*/ ) throw (uno::RuntimeException)
122*b1cdbd2cSJim Jagielski {
123*b1cdbd2cSJim Jagielski     // TODO
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski // XCharacters methods
127*b1cdbd2cSJim Jagielski 
Insert(const OUString & rString)128*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaButtonCharacters::Insert( const OUString& rString ) throw (uno::RuntimeException)
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski     /*  The Insert() operation is in fact "replace covered characters", at
131*b1cdbd2cSJim Jagielski         least for buttons... It seems there is no easy way to really insert a
132*b1cdbd2cSJim Jagielski         substring. This operation does not affect the mnLength parameter. */
133*b1cdbd2cSJim Jagielski     setCaption( rString );
134*b1cdbd2cSJim Jagielski }
135*b1cdbd2cSJim Jagielski 
Delete()136*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaButtonCharacters::Delete() throw (uno::RuntimeException)
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski     /*  The Delete() operation is nothing else than "replace with empty string".
139*b1cdbd2cSJim Jagielski         This does not affect the mnLength parameter, multiple calls of Delete()
140*b1cdbd2cSJim Jagielski         will remove characters as long as there are some more covered by this
141*b1cdbd2cSJim Jagielski         object. */
142*b1cdbd2cSJim Jagielski     setCaption( OUString() );
143*b1cdbd2cSJim Jagielski }
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski // XHelperInterface
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski VBAHELPER_IMPL_XHELPERINTERFACE( ScVbaButtonCharacters, "ooo.vba.excel.Characters" )
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski // private
150*b1cdbd2cSJim Jagielski 
getFullString() const151*b1cdbd2cSJim Jagielski OUString ScVbaButtonCharacters::getFullString() const throw (uno::RuntimeException)
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski     return mxPropSet->getPropertyValue( CREATE_OUSTRING( "Label" ) ).get< OUString >();
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski 
setFullString(const OUString & rString)156*b1cdbd2cSJim Jagielski void ScVbaButtonCharacters::setFullString( const OUString& rString ) throw (uno::RuntimeException)
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski     mxPropSet->setPropertyValue( CREATE_OUSTRING( "Label" ), uno::Any( rString ) );
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski // ============================================================================
162*b1cdbd2cSJim Jagielski 
ScVbaSheetObjectBase(const uno::Reference<XHelperInterface> & rxParent,const uno::Reference<uno::XComponentContext> & rxContext,const uno::Reference<frame::XModel> & rxModel,const uno::Reference<drawing::XShape> & rxShape)163*b1cdbd2cSJim Jagielski ScVbaSheetObjectBase::ScVbaSheetObjectBase(
164*b1cdbd2cSJim Jagielski         const uno::Reference< XHelperInterface >& rxParent,
165*b1cdbd2cSJim Jagielski         const uno::Reference< uno::XComponentContext >& rxContext,
166*b1cdbd2cSJim Jagielski         const uno::Reference< frame::XModel >& rxModel,
167*b1cdbd2cSJim Jagielski         const uno::Reference< drawing::XShape >& rxShape ) throw (uno::RuntimeException) :
168*b1cdbd2cSJim Jagielski     ScVbaSheetObject_BASE( rxParent, rxContext ),
169*b1cdbd2cSJim Jagielski     maPalette( rxModel ),
170*b1cdbd2cSJim Jagielski     mxModel( rxModel, uno::UNO_SET_THROW ),
171*b1cdbd2cSJim Jagielski     mxShape( rxShape, uno::UNO_SET_THROW ),
172*b1cdbd2cSJim Jagielski     mxShapeProps( rxShape, uno::UNO_QUERY_THROW )
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski }
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski // XSheetObject attributes
177*b1cdbd2cSJim Jagielski 
getLeft()178*b1cdbd2cSJim Jagielski double SAL_CALL ScVbaSheetObjectBase::getLeft() throw (uno::RuntimeException)
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski     return HmmToPoints( mxShape->getPosition().X );
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
setLeft(double fLeft)183*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaSheetObjectBase::setLeft( double fLeft ) throw (uno::RuntimeException)
184*b1cdbd2cSJim Jagielski {
185*b1cdbd2cSJim Jagielski     if( fLeft < 0.0 )
186*b1cdbd2cSJim Jagielski         throw uno::RuntimeException();
187*b1cdbd2cSJim Jagielski     mxShape->setPosition( awt::Point( PointsToHmm( fLeft ), mxShape->getPosition().Y ) );
188*b1cdbd2cSJim Jagielski }
189*b1cdbd2cSJim Jagielski 
getTop()190*b1cdbd2cSJim Jagielski double SAL_CALL ScVbaSheetObjectBase::getTop() throw (uno::RuntimeException)
191*b1cdbd2cSJim Jagielski {
192*b1cdbd2cSJim Jagielski     return HmmToPoints( mxShape->getPosition().Y );
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski 
setTop(double fTop)195*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaSheetObjectBase::setTop( double fTop ) throw (uno::RuntimeException)
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski     if( fTop < 0.0 )
198*b1cdbd2cSJim Jagielski         throw uno::RuntimeException();
199*b1cdbd2cSJim Jagielski     mxShape->setPosition( awt::Point( mxShape->getPosition().X, PointsToHmm( fTop ) ) );
200*b1cdbd2cSJim Jagielski }
201*b1cdbd2cSJim Jagielski 
getWidth()202*b1cdbd2cSJim Jagielski double SAL_CALL ScVbaSheetObjectBase::getWidth() throw (uno::RuntimeException)
203*b1cdbd2cSJim Jagielski {
204*b1cdbd2cSJim Jagielski     return HmmToPoints( mxShape->getSize().Width );
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski 
setWidth(double fWidth)207*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaSheetObjectBase::setWidth( double fWidth ) throw (uno::RuntimeException)
208*b1cdbd2cSJim Jagielski {
209*b1cdbd2cSJim Jagielski     if( fWidth <= 0.0 )
210*b1cdbd2cSJim Jagielski         throw uno::RuntimeException();
211*b1cdbd2cSJim Jagielski     mxShape->setSize( awt::Size( PointsToHmm( fWidth ), mxShape->getSize().Height ) );
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski 
getHeight()214*b1cdbd2cSJim Jagielski double SAL_CALL ScVbaSheetObjectBase::getHeight() throw (uno::RuntimeException)
215*b1cdbd2cSJim Jagielski {
216*b1cdbd2cSJim Jagielski     return HmmToPoints( mxShape->getSize().Height );
217*b1cdbd2cSJim Jagielski }
218*b1cdbd2cSJim Jagielski 
setHeight(double fHeight)219*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaSheetObjectBase::setHeight( double fHeight ) throw (uno::RuntimeException)
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski     if( fHeight <= 0.0 )
222*b1cdbd2cSJim Jagielski         throw uno::RuntimeException();
223*b1cdbd2cSJim Jagielski     mxShape->setSize( awt::Size( mxShape->getSize().Width, PointsToHmm( fHeight ) ) );
224*b1cdbd2cSJim Jagielski }
225*b1cdbd2cSJim Jagielski 
getName()226*b1cdbd2cSJim Jagielski OUString SAL_CALL ScVbaSheetObjectBase::getName() throw (uno::RuntimeException)
227*b1cdbd2cSJim Jagielski {
228*b1cdbd2cSJim Jagielski     return mxShapeProps->getPropertyValue( CREATE_OUSTRING( "Name" ) ).get< OUString >();
229*b1cdbd2cSJim Jagielski }
230*b1cdbd2cSJim Jagielski 
setName(const OUString & rName)231*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaSheetObjectBase::setName( const OUString& rName ) throw (uno::RuntimeException)
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski     mxShapeProps->setPropertyValue( CREATE_OUSTRING( "Name" ), uno::Any( rName ) );
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski 
getPlacement()236*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScVbaSheetObjectBase::getPlacement() throw (uno::RuntimeException)
237*b1cdbd2cSJim Jagielski {
238*b1cdbd2cSJim Jagielski     sal_Int32 nRet = excel::XlPlacement::xlMoveAndSize;
239*b1cdbd2cSJim Jagielski     SvxShape* pShape = SvxShape::getImplementation( mxShape );
240*b1cdbd2cSJim Jagielski     if(pShape)
241*b1cdbd2cSJim Jagielski     {
242*b1cdbd2cSJim Jagielski         SdrObject* pObj = pShape->GetSdrObject();
243*b1cdbd2cSJim Jagielski         if (pObj)
244*b1cdbd2cSJim Jagielski         {
245*b1cdbd2cSJim Jagielski             ScAnchorType eType = ScDrawLayer::GetAnchor(pObj);
246*b1cdbd2cSJim Jagielski             if (eType == SCA_PAGE)
247*b1cdbd2cSJim Jagielski                 nRet = excel::XlPlacement::xlFreeFloating;
248*b1cdbd2cSJim Jagielski         }
249*b1cdbd2cSJim Jagielski     }
250*b1cdbd2cSJim Jagielski     return nRet;
251*b1cdbd2cSJim Jagielski }
252*b1cdbd2cSJim Jagielski 
setPlacement(sal_Int32 nPlacement)253*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaSheetObjectBase::setPlacement( sal_Int32 nPlacement ) throw (uno::RuntimeException)
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski     SvxShape* pShape = SvxShape::getImplementation( mxShape );
256*b1cdbd2cSJim Jagielski     if(pShape)
257*b1cdbd2cSJim Jagielski     {
258*b1cdbd2cSJim Jagielski         SdrObject* pObj = pShape->GetSdrObject();
259*b1cdbd2cSJim Jagielski         if (pObj)
260*b1cdbd2cSJim Jagielski         {
261*b1cdbd2cSJim Jagielski             ScAnchorType eType = SCA_CELL;
262*b1cdbd2cSJim Jagielski             if ( nPlacement == excel::XlPlacement::xlFreeFloating )
263*b1cdbd2cSJim Jagielski                 eType = SCA_PAGE;
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski             // xlMove is not supported, treated as SCA_CELL (xlMoveAndSize)
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski             ScDrawLayer::SetAnchor(pObj, eType);
268*b1cdbd2cSJim Jagielski         }
269*b1cdbd2cSJim Jagielski     }
270*b1cdbd2cSJim Jagielski }
271*b1cdbd2cSJim Jagielski 
getPrintObject()272*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScVbaSheetObjectBase::getPrintObject() throw (uno::RuntimeException)
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski     // not supported
275*b1cdbd2cSJim Jagielski     return sal_True;
276*b1cdbd2cSJim Jagielski }
277*b1cdbd2cSJim Jagielski 
setPrintObject(sal_Bool)278*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaSheetObjectBase::setPrintObject( sal_Bool /*bPrintObject*/ ) throw (uno::RuntimeException)
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski     // not supported
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski // private
284*b1cdbd2cSJim Jagielski 
setDefaultProperties(sal_Int32 nIndex)285*b1cdbd2cSJim Jagielski void ScVbaSheetObjectBase::setDefaultProperties( sal_Int32 nIndex ) throw (uno::RuntimeException)
286*b1cdbd2cSJim Jagielski {
287*b1cdbd2cSJim Jagielski     OUString aName = ::rtl::OUStringBuffer( implGetBaseName() ).append( sal_Unicode( ' ' ) ).append( nIndex + 1 ).makeStringAndClear();
288*b1cdbd2cSJim Jagielski     setName( aName );
289*b1cdbd2cSJim Jagielski     implSetDefaultProperties();
290*b1cdbd2cSJim Jagielski }
291*b1cdbd2cSJim Jagielski 
implSetDefaultProperties()292*b1cdbd2cSJim Jagielski void ScVbaSheetObjectBase::implSetDefaultProperties() throw (uno::RuntimeException)
293*b1cdbd2cSJim Jagielski {
294*b1cdbd2cSJim Jagielski }
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski // ============================================================================
297*b1cdbd2cSJim Jagielski 
ScVbaControlObjectBase(const uno::Reference<XHelperInterface> & rxParent,const uno::Reference<uno::XComponentContext> & rxContext,const uno::Reference<frame::XModel> & rxModel,const uno::Reference<container::XIndexContainer> & rxFormIC,const uno::Reference<drawing::XControlShape> & rxControlShape,ListenerType eListenerType)298*b1cdbd2cSJim Jagielski ScVbaControlObjectBase::ScVbaControlObjectBase(
299*b1cdbd2cSJim Jagielski         const uno::Reference< XHelperInterface >& rxParent,
300*b1cdbd2cSJim Jagielski         const uno::Reference< uno::XComponentContext >& rxContext,
301*b1cdbd2cSJim Jagielski         const uno::Reference< frame::XModel >& rxModel,
302*b1cdbd2cSJim Jagielski         const uno::Reference< container::XIndexContainer >& rxFormIC,
303*b1cdbd2cSJim Jagielski         const uno::Reference< drawing::XControlShape >& rxControlShape,
304*b1cdbd2cSJim Jagielski         ListenerType eListenerType ) throw (uno::RuntimeException) :
305*b1cdbd2cSJim Jagielski     ScVbaControlObject_BASE( rxParent, rxContext, rxModel, uno::Reference< drawing::XShape >( rxControlShape, uno::UNO_QUERY_THROW ) ),
306*b1cdbd2cSJim Jagielski     mxFormIC( rxFormIC, uno::UNO_SET_THROW ),
307*b1cdbd2cSJim Jagielski     mxControlProps( rxControlShape->getControl(), uno::UNO_QUERY_THROW )
308*b1cdbd2cSJim Jagielski {
309*b1cdbd2cSJim Jagielski     // set listener and event name to be used for OnAction attribute
310*b1cdbd2cSJim Jagielski     switch( eListenerType )
311*b1cdbd2cSJim Jagielski     {
312*b1cdbd2cSJim Jagielski         case LISTENER_ACTION:
313*b1cdbd2cSJim Jagielski             maListenerType = CREATE_OUSTRING( "XActionListener" );
314*b1cdbd2cSJim Jagielski             maEventMethod = CREATE_OUSTRING( "actionPerformed" );
315*b1cdbd2cSJim Jagielski         break;
316*b1cdbd2cSJim Jagielski         case LISTENER_MOUSE:
317*b1cdbd2cSJim Jagielski             maListenerType = CREATE_OUSTRING( "XMouseListener" );
318*b1cdbd2cSJim Jagielski             maEventMethod = CREATE_OUSTRING( "mouseReleased" );
319*b1cdbd2cSJim Jagielski         break;
320*b1cdbd2cSJim Jagielski         case LISTENER_TEXT:
321*b1cdbd2cSJim Jagielski             maListenerType = CREATE_OUSTRING( "XTextListener" );
322*b1cdbd2cSJim Jagielski             maEventMethod = CREATE_OUSTRING( "textChanged" );
323*b1cdbd2cSJim Jagielski         break;
324*b1cdbd2cSJim Jagielski         case LISTENER_VALUE:
325*b1cdbd2cSJim Jagielski             maListenerType = CREATE_OUSTRING( "XAdjustmentListener" );
326*b1cdbd2cSJim Jagielski             maEventMethod = CREATE_OUSTRING( "adjustmentValueChanged" );
327*b1cdbd2cSJim Jagielski         break;
328*b1cdbd2cSJim Jagielski         case LISTENER_CHANGE:
329*b1cdbd2cSJim Jagielski             maListenerType = CREATE_OUSTRING( "XChangeListener" );
330*b1cdbd2cSJim Jagielski             maEventMethod = CREATE_OUSTRING( "changed" );
331*b1cdbd2cSJim Jagielski         break;
332*b1cdbd2cSJim Jagielski         // no default, to let the compiler complain about missing case
333*b1cdbd2cSJim Jagielski     }
334*b1cdbd2cSJim Jagielski }
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski // XSheetObject attributes
337*b1cdbd2cSJim Jagielski 
getName()338*b1cdbd2cSJim Jagielski OUString SAL_CALL ScVbaControlObjectBase::getName() throw (uno::RuntimeException)
339*b1cdbd2cSJim Jagielski {
340*b1cdbd2cSJim Jagielski     return mxControlProps->getPropertyValue( CREATE_OUSTRING( "Name" ) ).get< OUString >();
341*b1cdbd2cSJim Jagielski }
342*b1cdbd2cSJim Jagielski 
setName(const OUString & rName)343*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaControlObjectBase::setName( const OUString& rName ) throw (uno::RuntimeException)
344*b1cdbd2cSJim Jagielski {
345*b1cdbd2cSJim Jagielski     mxControlProps->setPropertyValue( CREATE_OUSTRING( "Name" ), uno::Any( rName ) );
346*b1cdbd2cSJim Jagielski }
347*b1cdbd2cSJim Jagielski 
getOnAction()348*b1cdbd2cSJim Jagielski OUString SAL_CALL ScVbaControlObjectBase::getOnAction() throw (uno::RuntimeException)
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski     uno::Reference< script::XEventAttacherManager > xEventMgr( mxFormIC, uno::UNO_QUERY_THROW );
351*b1cdbd2cSJim Jagielski     sal_Int32 nIndex = getModelIndexInForm();
352*b1cdbd2cSJim Jagielski     uno::Sequence< script::ScriptEventDescriptor > aEvents = xEventMgr->getScriptEvents( nIndex );
353*b1cdbd2cSJim Jagielski     if( aEvents.hasElements() )
354*b1cdbd2cSJim Jagielski     {
355*b1cdbd2cSJim Jagielski         const script::ScriptEventDescriptor* pEvent = aEvents.getConstArray();
356*b1cdbd2cSJim Jagielski         const script::ScriptEventDescriptor* pEventEnd = pEvent + aEvents.getLength();
357*b1cdbd2cSJim Jagielski         const OUString aScriptType = CREATE_OUSTRING( "Script" );
358*b1cdbd2cSJim Jagielski         for( ; pEvent < pEventEnd; ++pEvent )
359*b1cdbd2cSJim Jagielski             if( (pEvent->ListenerType == maListenerType) && (pEvent->EventMethod == maEventMethod) && (pEvent->ScriptType == aScriptType) )
360*b1cdbd2cSJim Jagielski                 return extractMacroName( pEvent->ScriptCode );
361*b1cdbd2cSJim Jagielski     }
362*b1cdbd2cSJim Jagielski     return OUString();
363*b1cdbd2cSJim Jagielski }
364*b1cdbd2cSJim Jagielski 
setOnAction(const OUString & rMacroName)365*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaControlObjectBase::setOnAction( const OUString& rMacroName ) throw (uno::RuntimeException)
366*b1cdbd2cSJim Jagielski {
367*b1cdbd2cSJim Jagielski     uno::Reference< script::XEventAttacherManager > xEventMgr( mxFormIC, uno::UNO_QUERY_THROW );
368*b1cdbd2cSJim Jagielski     sal_Int32 nIndex = getModelIndexInForm();
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski     // first, remove a registered event (try/catch just in case implementation throws)
371*b1cdbd2cSJim Jagielski     try { xEventMgr->revokeScriptEvent( nIndex, maListenerType, maEventMethod, OUString() ); } catch( uno::Exception& ) {}
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski     // if a macro name has been passed, try to attach it to the event
374*b1cdbd2cSJim Jagielski     if( rMacroName.getLength() > 0 )
375*b1cdbd2cSJim Jagielski     {
376*b1cdbd2cSJim Jagielski         MacroResolvedInfo aResolvedMacro = resolveVBAMacro( getSfxObjShell( mxModel ), rMacroName );
377*b1cdbd2cSJim Jagielski         if( !aResolvedMacro.mbFound )
378*b1cdbd2cSJim Jagielski             throw uno::RuntimeException();
379*b1cdbd2cSJim Jagielski         script::ScriptEventDescriptor aDescriptor;
380*b1cdbd2cSJim Jagielski         aDescriptor.ListenerType = maListenerType;
381*b1cdbd2cSJim Jagielski         aDescriptor.EventMethod = maEventMethod;
382*b1cdbd2cSJim Jagielski         aDescriptor.ScriptType = CREATE_OUSTRING( "Script" );
383*b1cdbd2cSJim Jagielski         aDescriptor.ScriptCode = makeMacroURL( aResolvedMacro.msResolvedMacro );
384*b1cdbd2cSJim Jagielski         xEventMgr->registerScriptEvent( nIndex, aDescriptor );
385*b1cdbd2cSJim Jagielski     }
386*b1cdbd2cSJim Jagielski }
387*b1cdbd2cSJim Jagielski 
getPrintObject()388*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScVbaControlObjectBase::getPrintObject() throw (uno::RuntimeException)
389*b1cdbd2cSJim Jagielski {
390*b1cdbd2cSJim Jagielski     return mxControlProps->getPropertyValue( CREATE_OUSTRING( "Printable" ) ).get< sal_Bool >();
391*b1cdbd2cSJim Jagielski }
392*b1cdbd2cSJim Jagielski 
setPrintObject(sal_Bool bPrintObject)393*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaControlObjectBase::setPrintObject( sal_Bool bPrintObject ) throw (uno::RuntimeException)
394*b1cdbd2cSJim Jagielski {
395*b1cdbd2cSJim Jagielski     mxControlProps->setPropertyValue( CREATE_OUSTRING( "Printable" ), uno::Any( bPrintObject ) );
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski // XControlObject attributes
399*b1cdbd2cSJim Jagielski 
getAutoSize()400*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScVbaControlObjectBase::getAutoSize() throw (uno::RuntimeException)
401*b1cdbd2cSJim Jagielski {
402*b1cdbd2cSJim Jagielski     // not supported
403*b1cdbd2cSJim Jagielski     return sal_False;
404*b1cdbd2cSJim Jagielski }
405*b1cdbd2cSJim Jagielski 
setAutoSize(sal_Bool)406*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaControlObjectBase::setAutoSize( sal_Bool /*bAutoSize*/ ) throw (uno::RuntimeException)
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski     // not supported
409*b1cdbd2cSJim Jagielski }
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski // private
412*b1cdbd2cSJim Jagielski 
getModelIndexInForm() const413*b1cdbd2cSJim Jagielski sal_Int32 ScVbaControlObjectBase::getModelIndexInForm() const throw (uno::RuntimeException)
414*b1cdbd2cSJim Jagielski {
415*b1cdbd2cSJim Jagielski     for( sal_Int32 nIndex = 0, nCount = mxFormIC->getCount(); nIndex < nCount; ++nIndex )
416*b1cdbd2cSJim Jagielski     {
417*b1cdbd2cSJim Jagielski         uno::Reference< beans::XPropertySet > xProps( mxFormIC->getByIndex( nIndex ), uno::UNO_QUERY_THROW );
418*b1cdbd2cSJim Jagielski         if( mxControlProps.get() == xProps.get() )
419*b1cdbd2cSJim Jagielski             return nIndex;
420*b1cdbd2cSJim Jagielski     }
421*b1cdbd2cSJim Jagielski     throw uno::RuntimeException();
422*b1cdbd2cSJim Jagielski }
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski // ============================================================================
425*b1cdbd2cSJim Jagielski 
ScVbaButton(const uno::Reference<XHelperInterface> & rxParent,const uno::Reference<uno::XComponentContext> & rxContext,const uno::Reference<frame::XModel> & rxModel,const uno::Reference<container::XIndexContainer> & rxFormIC,const uno::Reference<drawing::XControlShape> & rxControlShape)426*b1cdbd2cSJim Jagielski ScVbaButton::ScVbaButton(
427*b1cdbd2cSJim Jagielski         const uno::Reference< XHelperInterface >& rxParent,
428*b1cdbd2cSJim Jagielski         const uno::Reference< uno::XComponentContext >& rxContext,
429*b1cdbd2cSJim Jagielski         const uno::Reference< frame::XModel >& rxModel,
430*b1cdbd2cSJim Jagielski         const uno::Reference< container::XIndexContainer >& rxFormIC,
431*b1cdbd2cSJim Jagielski         const uno::Reference< drawing::XControlShape >& rxControlShape ) throw (uno::RuntimeException) :
432*b1cdbd2cSJim Jagielski     ScVbaButton_BASE( rxParent, rxContext, rxModel, rxFormIC, rxControlShape, LISTENER_ACTION )
433*b1cdbd2cSJim Jagielski {
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski // XButton attributes
437*b1cdbd2cSJim Jagielski 
getCaption()438*b1cdbd2cSJim Jagielski OUString SAL_CALL ScVbaButton::getCaption() throw (uno::RuntimeException)
439*b1cdbd2cSJim Jagielski {
440*b1cdbd2cSJim Jagielski     return mxControlProps->getPropertyValue( CREATE_OUSTRING( "Label" ) ).get< OUString >();
441*b1cdbd2cSJim Jagielski }
442*b1cdbd2cSJim Jagielski 
setCaption(const OUString & rCaption)443*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaButton::setCaption( const OUString& rCaption ) throw (uno::RuntimeException)
444*b1cdbd2cSJim Jagielski {
445*b1cdbd2cSJim Jagielski     mxControlProps->setPropertyValue( CREATE_OUSTRING( "Label" ), uno::Any( rCaption ) );
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski 
getFont()448*b1cdbd2cSJim Jagielski uno::Reference< excel::XFont > SAL_CALL ScVbaButton::getFont() throw (uno::RuntimeException)
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski     return new ScVbaFont( this, mxContext, maPalette, mxControlProps, 0, true );
451*b1cdbd2cSJim Jagielski }
452*b1cdbd2cSJim Jagielski 
setFont(const uno::Reference<excel::XFont> &)453*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaButton::setFont( const uno::Reference< excel::XFont >& /*rxFont*/ ) throw (uno::RuntimeException)
454*b1cdbd2cSJim Jagielski {
455*b1cdbd2cSJim Jagielski     // TODO
456*b1cdbd2cSJim Jagielski }
457*b1cdbd2cSJim Jagielski 
getHorizontalAlignment()458*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScVbaButton::getHorizontalAlignment() throw (uno::RuntimeException)
459*b1cdbd2cSJim Jagielski {
460*b1cdbd2cSJim Jagielski     switch( mxControlProps->getPropertyValue( CREATE_OUSTRING( "Align" ) ).get< sal_Int16 >() )
461*b1cdbd2cSJim Jagielski     {
462*b1cdbd2cSJim Jagielski         case awt::TextAlign::LEFT:      return excel::Constants::xlLeft;
463*b1cdbd2cSJim Jagielski         case awt::TextAlign::RIGHT:     return excel::Constants::xlRight;
464*b1cdbd2cSJim Jagielski         case awt::TextAlign::CENTER:    return excel::Constants::xlCenter;
465*b1cdbd2cSJim Jagielski     }
466*b1cdbd2cSJim Jagielski     return excel::Constants::xlCenter;
467*b1cdbd2cSJim Jagielski }
468*b1cdbd2cSJim Jagielski 
setHorizontalAlignment(sal_Int32 nAlign)469*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaButton::setHorizontalAlignment( sal_Int32 nAlign ) throw (uno::RuntimeException)
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski     sal_Int32 nAwtAlign = awt::TextAlign::CENTER;
472*b1cdbd2cSJim Jagielski     switch( nAlign )
473*b1cdbd2cSJim Jagielski     {
474*b1cdbd2cSJim Jagielski         case excel::Constants::xlLeft:      nAwtAlign = awt::TextAlign::LEFT;   break;
475*b1cdbd2cSJim Jagielski         case excel::Constants::xlRight:     nAwtAlign = awt::TextAlign::RIGHT;  break;
476*b1cdbd2cSJim Jagielski         case excel::Constants::xlCenter:    nAwtAlign = awt::TextAlign::CENTER; break;
477*b1cdbd2cSJim Jagielski     }
478*b1cdbd2cSJim Jagielski     // form controls expect short value
479*b1cdbd2cSJim Jagielski     mxControlProps->setPropertyValue( CREATE_OUSTRING( "Align" ), uno::Any( static_cast< sal_Int16 >( nAwtAlign ) ) );
480*b1cdbd2cSJim Jagielski }
481*b1cdbd2cSJim Jagielski 
getVerticalAlignment()482*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScVbaButton::getVerticalAlignment() throw (uno::RuntimeException)
483*b1cdbd2cSJim Jagielski {
484*b1cdbd2cSJim Jagielski     switch( mxControlProps->getPropertyValue( CREATE_OUSTRING( "VerticalAlign" ) ).get< style::VerticalAlignment >() )
485*b1cdbd2cSJim Jagielski     {
486*b1cdbd2cSJim Jagielski         case style::VerticalAlignment_TOP:      return excel::Constants::xlTop;
487*b1cdbd2cSJim Jagielski         case style::VerticalAlignment_BOTTOM:   return excel::Constants::xlBottom;
488*b1cdbd2cSJim Jagielski         case style::VerticalAlignment_MIDDLE:   return excel::Constants::xlCenter;
489*b1cdbd2cSJim Jagielski         default:;
490*b1cdbd2cSJim Jagielski     }
491*b1cdbd2cSJim Jagielski     return excel::Constants::xlCenter;
492*b1cdbd2cSJim Jagielski }
493*b1cdbd2cSJim Jagielski 
setVerticalAlignment(sal_Int32 nAlign)494*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaButton::setVerticalAlignment( sal_Int32 nAlign ) throw (uno::RuntimeException)
495*b1cdbd2cSJim Jagielski {
496*b1cdbd2cSJim Jagielski     style::VerticalAlignment eAwtAlign = style::VerticalAlignment_MIDDLE;
497*b1cdbd2cSJim Jagielski     switch( nAlign )
498*b1cdbd2cSJim Jagielski     {
499*b1cdbd2cSJim Jagielski         case excel::Constants::xlTop:       eAwtAlign = style::VerticalAlignment_TOP;       break;
500*b1cdbd2cSJim Jagielski         case excel::Constants::xlBottom:    eAwtAlign = style::VerticalAlignment_BOTTOM;    break;
501*b1cdbd2cSJim Jagielski         case excel::Constants::xlCenter:    eAwtAlign = style::VerticalAlignment_MIDDLE;    break;
502*b1cdbd2cSJim Jagielski     }
503*b1cdbd2cSJim Jagielski     mxControlProps->setPropertyValue( CREATE_OUSTRING( "VerticalAlign" ), uno::Any( eAwtAlign ) );
504*b1cdbd2cSJim Jagielski }
505*b1cdbd2cSJim Jagielski 
getOrientation()506*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScVbaButton::getOrientation() throw (uno::RuntimeException)
507*b1cdbd2cSJim Jagielski {
508*b1cdbd2cSJim Jagielski     // not supported
509*b1cdbd2cSJim Jagielski     return excel::XlOrientation::xlHorizontal;
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski 
setOrientation(sal_Int32)512*b1cdbd2cSJim Jagielski void SAL_CALL ScVbaButton::setOrientation( sal_Int32 /*nOrientation*/ ) throw (uno::RuntimeException)
513*b1cdbd2cSJim Jagielski {
514*b1cdbd2cSJim Jagielski     // not supported
515*b1cdbd2cSJim Jagielski }
516*b1cdbd2cSJim Jagielski 
517*b1cdbd2cSJim Jagielski // XButton methods
518*b1cdbd2cSJim Jagielski 
Characters(const uno::Any & rStart,const uno::Any & rLength)519*b1cdbd2cSJim Jagielski uno::Reference< excel::XCharacters > SAL_CALL ScVbaButton::Characters( const uno::Any& rStart, const uno::Any& rLength ) throw (uno::RuntimeException)
520*b1cdbd2cSJim Jagielski {
521*b1cdbd2cSJim Jagielski     return new ScVbaButtonCharacters( this, mxContext, mxControlProps, maPalette, rStart, rLength );
522*b1cdbd2cSJim Jagielski }
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski // XHelperInterface
525*b1cdbd2cSJim Jagielski 
526*b1cdbd2cSJim Jagielski VBAHELPER_IMPL_XHELPERINTERFACE( ScVbaButton, "ooo.vba.excel.Button" )
527*b1cdbd2cSJim Jagielski 
528*b1cdbd2cSJim Jagielski // private
529*b1cdbd2cSJim Jagielski 
implGetBaseName() const530*b1cdbd2cSJim Jagielski OUString ScVbaButton::implGetBaseName() const
531*b1cdbd2cSJim Jagielski {
532*b1cdbd2cSJim Jagielski     return CREATE_OUSTRING( "Button" );
533*b1cdbd2cSJim Jagielski }
534*b1cdbd2cSJim Jagielski 
implSetDefaultProperties()535*b1cdbd2cSJim Jagielski void ScVbaButton::implSetDefaultProperties() throw (uno::RuntimeException)
536*b1cdbd2cSJim Jagielski {
537*b1cdbd2cSJim Jagielski     setCaption( getName() );
538*b1cdbd2cSJim Jagielski }
539*b1cdbd2cSJim Jagielski 
540*b1cdbd2cSJim Jagielski // ============================================================================
541