xref: /aoo4110/main/sc/source/ui/vba/vbahelper.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 #include <cppuhelper/bootstrap.hxx>
24*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XURLTransformer.hpp>
25*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDispatchProvider.hpp>
26*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XModel.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XFrame.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDesktop.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XController.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/XComponentContext.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiComponentFactory.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XIntrospection.hpp>
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <sfx2/objsh.hxx>
38*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
39*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
40*b1cdbd2cSJim Jagielski #include <sfx2/app.hxx>
41*b1cdbd2cSJim Jagielski #include <svl/stritem.hxx>
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #include <docuno.hxx>
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #include <basic/sbx.hxx>
46*b1cdbd2cSJim Jagielski #include <basic/sbstar.hxx>
47*b1cdbd2cSJim Jagielski #include <rtl/math.hxx>
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski #include <math.h>
50*b1cdbd2cSJim Jagielski #include "vbahelper.hxx"
51*b1cdbd2cSJim Jagielski #include "tabvwsh.hxx"
52*b1cdbd2cSJim Jagielski #include "transobj.hxx"
53*b1cdbd2cSJim Jagielski #include "scmod.hxx"
54*b1cdbd2cSJim Jagielski #include "vbashape.hxx"
55*b1cdbd2cSJim Jagielski #include "unonames.hxx"
56*b1cdbd2cSJim Jagielski #include "cellsuno.hxx"
57*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
58*b1cdbd2cSJim Jagielski using namespace ::ooo::vba;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski #define POINTTO100THMILLIMETERFACTOR 35.27778
61*b1cdbd2cSJim Jagielski void unoToSbxValue( SbxVariable* pVar, const uno::Any& aValue );
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski uno::Any sbxToUnoValue( SbxVariable* pVar );
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski 
66*b1cdbd2cSJim Jagielski namespace ooo
67*b1cdbd2cSJim Jagielski {
68*b1cdbd2cSJim Jagielski namespace vba
69*b1cdbd2cSJim Jagielski {
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski const double Millimeter::factor =  35.27778;
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski uno::Reference< beans::XIntrospectionAccess >
getIntrospectionAccess(const uno::Any & aObject)74*b1cdbd2cSJim Jagielski getIntrospectionAccess( const uno::Any& aObject ) throw (uno::RuntimeException)
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski 	static uno::Reference< beans::XIntrospection > xIntrospection;
77*b1cdbd2cSJim Jagielski 	if( !xIntrospection.is() )
78*b1cdbd2cSJim Jagielski 	{
79*b1cdbd2cSJim Jagielski 		uno::Reference< lang::XMultiServiceFactory > xFactory( comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
80*b1cdbd2cSJim Jagielski 		xIntrospection.set( xFactory->createInstance( rtl::OUString::createFromAscii("com.sun.star.beans.Introspection") ), uno::UNO_QUERY_THROW );
81*b1cdbd2cSJim Jagielski 	}
82*b1cdbd2cSJim Jagielski 	return xIntrospection->inspect( aObject );
83*b1cdbd2cSJim Jagielski }
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski uno::Reference< script::XTypeConverter >
getTypeConverter(const uno::Reference<uno::XComponentContext> & xContext)86*b1cdbd2cSJim Jagielski getTypeConverter( const uno::Reference< uno::XComponentContext >& xContext ) throw (uno::RuntimeException)
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski 	static uno::Reference< script::XTypeConverter > xTypeConv( xContext->getServiceManager()->createInstanceWithContext( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.script.Converter") ), xContext ), uno::UNO_QUERY_THROW );
89*b1cdbd2cSJim Jagielski 	return xTypeConv;
90*b1cdbd2cSJim Jagielski }
91*b1cdbd2cSJim Jagielski // helper method to determine if the view ( calc ) is in print-preview mode
isInPrintPreview(SfxViewFrame * pView)92*b1cdbd2cSJim Jagielski bool isInPrintPreview( SfxViewFrame* pView )
93*b1cdbd2cSJim Jagielski {
94*b1cdbd2cSJim Jagielski 	sal_uInt16 nViewNo = SID_VIEWSHELL1 - SID_VIEWSHELL0;
95*b1cdbd2cSJim Jagielski 	if ( pView->GetObjectShell()->GetFactory().GetViewFactoryCount() >
96*b1cdbd2cSJim Jagielski nViewNo && !pView->GetObjectShell()->IsInPlaceActive() )
97*b1cdbd2cSJim Jagielski 	{
98*b1cdbd2cSJim Jagielski 		SfxViewFactory &rViewFactory =
99*b1cdbd2cSJim Jagielski 			pView->GetObjectShell()->GetFactory().GetViewFactory(nViewNo);
100*b1cdbd2cSJim Jagielski 		if (  pView->GetCurViewId() == rViewFactory.GetOrdinal() )
101*b1cdbd2cSJim Jagielski 			return true;
102*b1cdbd2cSJim Jagielski 	}
103*b1cdbd2cSJim Jagielski 	return false;
104*b1cdbd2cSJim Jagielski }
105*b1cdbd2cSJim Jagielski const ::rtl::OUString REPLACE_CELLS_WARNING(  RTL_CONSTASCII_USTRINGPARAM( "ReplaceCellsWarning"));
106*b1cdbd2cSJim Jagielski const uno::Any&
aNULL()107*b1cdbd2cSJim Jagielski aNULL()
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski  	static  uno::Any aNULLL = uno::makeAny( uno::Reference< uno::XInterface >() );
110*b1cdbd2cSJim Jagielski 	return aNULLL;
111*b1cdbd2cSJim Jagielski }
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski class PasteCellsWarningReseter
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski private:
116*b1cdbd2cSJim Jagielski 	bool bInitialWarningState;
getGlobalSheetSettings()117*b1cdbd2cSJim Jagielski 	static uno::Reference< beans::XPropertySet > getGlobalSheetSettings() throw ( uno::RuntimeException )
118*b1cdbd2cSJim Jagielski 	{
119*b1cdbd2cSJim Jagielski 		static uno::Reference< beans::XPropertySet > xTmpProps( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
120*b1cdbd2cSJim Jagielski 		static uno::Reference<uno::XComponentContext > xContext( xTmpProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), uno::UNO_QUERY_THROW );
121*b1cdbd2cSJim Jagielski 		static uno::Reference<lang::XMultiComponentFactory > xServiceManager(
122*b1cdbd2cSJim Jagielski 				xContext->getServiceManager(), uno::UNO_QUERY_THROW );
123*b1cdbd2cSJim Jagielski 		static uno::Reference< beans::XPropertySet > xProps( xServiceManager->createInstanceWithContext( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.GlobalSheetSettings" ) ) ,xContext ), uno::UNO_QUERY_THROW );
124*b1cdbd2cSJim Jagielski 		return xProps;
125*b1cdbd2cSJim Jagielski 	}
126*b1cdbd2cSJim Jagielski 
getReplaceCellsWarning()127*b1cdbd2cSJim Jagielski 	bool getReplaceCellsWarning() throw ( uno::RuntimeException )
128*b1cdbd2cSJim Jagielski 	{
129*b1cdbd2cSJim Jagielski 		sal_Bool res = sal_False;
130*b1cdbd2cSJim Jagielski 		getGlobalSheetSettings()->getPropertyValue( REPLACE_CELLS_WARNING ) >>= res;
131*b1cdbd2cSJim Jagielski 		return ( res == sal_True );
132*b1cdbd2cSJim Jagielski 	}
133*b1cdbd2cSJim Jagielski 
setReplaceCellsWarning(bool bState)134*b1cdbd2cSJim Jagielski 	void setReplaceCellsWarning( bool bState ) throw ( uno::RuntimeException )
135*b1cdbd2cSJim Jagielski 	{
136*b1cdbd2cSJim Jagielski 		getGlobalSheetSettings()->setPropertyValue( REPLACE_CELLS_WARNING, uno::makeAny( bState ) );
137*b1cdbd2cSJim Jagielski 	}
138*b1cdbd2cSJim Jagielski public:
PasteCellsWarningReseter()139*b1cdbd2cSJim Jagielski 	PasteCellsWarningReseter() throw ( uno::RuntimeException )
140*b1cdbd2cSJim Jagielski 	{
141*b1cdbd2cSJim Jagielski 		bInitialWarningState = getReplaceCellsWarning();
142*b1cdbd2cSJim Jagielski 		if ( bInitialWarningState )
143*b1cdbd2cSJim Jagielski 			setReplaceCellsWarning( false );
144*b1cdbd2cSJim Jagielski 	}
~PasteCellsWarningReseter()145*b1cdbd2cSJim Jagielski 	~PasteCellsWarningReseter()
146*b1cdbd2cSJim Jagielski 	{
147*b1cdbd2cSJim Jagielski 		if ( bInitialWarningState )
148*b1cdbd2cSJim Jagielski 		{
149*b1cdbd2cSJim Jagielski 			// don't allow dtor to throw
150*b1cdbd2cSJim Jagielski 			try
151*b1cdbd2cSJim Jagielski 			{
152*b1cdbd2cSJim Jagielski 				setReplaceCellsWarning( true );
153*b1cdbd2cSJim Jagielski 			}
154*b1cdbd2cSJim Jagielski 			catch ( uno::Exception& /*e*/ ){}
155*b1cdbd2cSJim Jagielski 		}
156*b1cdbd2cSJim Jagielski 	}
157*b1cdbd2cSJim Jagielski };
158*b1cdbd2cSJim Jagielski 
dispatchExecute(css::uno::Reference<css::frame::XModel> & xModel,sal_uInt16 nSlot,SfxCallMode nCall)159*b1cdbd2cSJim Jagielski void dispatchExecute(css::uno::Reference< css::frame::XModel>& xModel, sal_uInt16 nSlot, SfxCallMode nCall)
160*b1cdbd2cSJim Jagielski {
161*b1cdbd2cSJim Jagielski 	ScTabViewShell* pViewShell = getBestViewShell( xModel );
162*b1cdbd2cSJim Jagielski 	SfxViewFrame* pViewFrame = NULL;
163*b1cdbd2cSJim Jagielski 	if ( pViewShell )
164*b1cdbd2cSJim Jagielski 		pViewFrame = pViewShell->GetViewFrame();
165*b1cdbd2cSJim Jagielski 	if ( pViewFrame )
166*b1cdbd2cSJim Jagielski 	{
167*b1cdbd2cSJim Jagielski 		SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
168*b1cdbd2cSJim Jagielski 		if( pDispatcher )
169*b1cdbd2cSJim Jagielski 		{
170*b1cdbd2cSJim Jagielski 			pDispatcher->Execute( nSlot , nCall );
171*b1cdbd2cSJim Jagielski 		}
172*b1cdbd2cSJim Jagielski 	}
173*b1cdbd2cSJim Jagielski }
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski void
implnPaste()176*b1cdbd2cSJim Jagielski implnPaste()
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski 	PasteCellsWarningReseter resetWarningBox;
179*b1cdbd2cSJim Jagielski 	ScTabViewShell* pViewShell = getCurrentBestViewShell();
180*b1cdbd2cSJim Jagielski 	if ( pViewShell )
181*b1cdbd2cSJim Jagielski 	{
182*b1cdbd2cSJim Jagielski 		pViewShell->PasteFromSystem();
183*b1cdbd2cSJim Jagielski 		pViewShell->CellContentChanged();
184*b1cdbd2cSJim Jagielski 	}
185*b1cdbd2cSJim Jagielski }
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski void
implnCopy()189*b1cdbd2cSJim Jagielski implnCopy()
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski 	ScTabViewShell* pViewShell = getCurrentBestViewShell();
192*b1cdbd2cSJim Jagielski 	if ( pViewShell )
193*b1cdbd2cSJim Jagielski 		pViewShell->CopyToClip(NULL,false,false,true);
194*b1cdbd2cSJim Jagielski }
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski void
implnCut()197*b1cdbd2cSJim Jagielski implnCut()
198*b1cdbd2cSJim Jagielski {
199*b1cdbd2cSJim Jagielski 	ScTabViewShell* pViewShell =  getCurrentBestViewShell();
200*b1cdbd2cSJim Jagielski 	if ( pViewShell )
201*b1cdbd2cSJim Jagielski 		pViewShell->CutToClip( NULL, sal_True );
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski 
implnPasteSpecial(sal_uInt16 nFlags,sal_uInt16 nFunction,sal_Bool bSkipEmpty,sal_Bool bTranspose)204*b1cdbd2cSJim Jagielski void implnPasteSpecial(sal_uInt16 nFlags,sal_uInt16 nFunction,sal_Bool bSkipEmpty, sal_Bool bTranspose)
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski 	PasteCellsWarningReseter resetWarningBox;
207*b1cdbd2cSJim Jagielski 	sal_Bool bAsLink(sal_False), bOtherDoc(sal_False);
208*b1cdbd2cSJim Jagielski 	InsCellCmd eMoveMode = INS_NONE;
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 	ScTabViewShell* pTabViewShell = ScTabViewShell::GetActiveViewShell();
211*b1cdbd2cSJim Jagielski 	if ( !pTabViewShell )
212*b1cdbd2cSJim Jagielski 		// none active, try next best
213*b1cdbd2cSJim Jagielski 		pTabViewShell = getCurrentBestViewShell();
214*b1cdbd2cSJim Jagielski 	if ( pTabViewShell )
215*b1cdbd2cSJim Jagielski 	{
216*b1cdbd2cSJim Jagielski 		ScViewData* pView = pTabViewShell->GetViewData();
217*b1cdbd2cSJim Jagielski 		Window* pWin = ( pView != NULL ) ? pView->GetActiveWin() : NULL;
218*b1cdbd2cSJim Jagielski 		if ( pView && pWin )
219*b1cdbd2cSJim Jagielski 		{
220*b1cdbd2cSJim Jagielski 			if ( bAsLink && bOtherDoc )
221*b1cdbd2cSJim Jagielski 				pTabViewShell->PasteFromSystem(0);//SOT_FORMATSTR_ID_LINK
222*b1cdbd2cSJim Jagielski 			else
223*b1cdbd2cSJim Jagielski 			{
224*b1cdbd2cSJim Jagielski 				ScTransferObj* pOwnClip = ScTransferObj::GetOwnClipboard( pWin );
225*b1cdbd2cSJim Jagielski 				ScDocument* pDoc = NULL;
226*b1cdbd2cSJim Jagielski 				if ( pOwnClip )
227*b1cdbd2cSJim Jagielski 					pDoc = pOwnClip->GetDocument();
228*b1cdbd2cSJim Jagielski 				pTabViewShell->PasteFromClip( nFlags, pDoc,
229*b1cdbd2cSJim Jagielski 					nFunction, bSkipEmpty, bTranspose, bAsLink,
230*b1cdbd2cSJim Jagielski 					eMoveMode, IDF_NONE, sal_True );
231*b1cdbd2cSJim Jagielski 				pTabViewShell->CellContentChanged();
232*b1cdbd2cSJim Jagielski 			}
233*b1cdbd2cSJim Jagielski 		}
234*b1cdbd2cSJim Jagielski 	}
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski }
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski  uno::Reference< frame::XModel >
getCurrentDocument()239*b1cdbd2cSJim Jagielski getCurrentDocument() throw (uno::RuntimeException)
240*b1cdbd2cSJim Jagielski {
241*b1cdbd2cSJim Jagielski 	uno::Reference< frame::XModel > xModel;
242*b1cdbd2cSJim Jagielski 	SbxObject* pBasic = dynamic_cast< SbxObject* > ( SFX_APP()->GetBasic() );
243*b1cdbd2cSJim Jagielski 	SbxObject* basicChosen =  pBasic ;
244*b1cdbd2cSJim Jagielski 	if ( basicChosen == NULL)
245*b1cdbd2cSJim Jagielski 	{
246*b1cdbd2cSJim Jagielski 		OSL_TRACE("getModelFromBasic() StarBASIC* is NULL" );
247*b1cdbd2cSJim Jagielski 		return xModel;
248*b1cdbd2cSJim Jagielski 	}
249*b1cdbd2cSJim Jagielski     SbxObject* p = pBasic;
250*b1cdbd2cSJim Jagielski     SbxObject* pParent = p->GetParent();
251*b1cdbd2cSJim Jagielski     SbxObject* pParentParent = pParent ? pParent->GetParent() : NULL;
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski     if( pParentParent )
254*b1cdbd2cSJim Jagielski     {
255*b1cdbd2cSJim Jagielski         basicChosen = pParentParent;
256*b1cdbd2cSJim Jagielski     }
257*b1cdbd2cSJim Jagielski     else if( pParent )
258*b1cdbd2cSJim Jagielski     {
259*b1cdbd2cSJim Jagielski         basicChosen = pParent;
260*b1cdbd2cSJim Jagielski     }
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 
263*b1cdbd2cSJim Jagielski     uno::Any aModel;
264*b1cdbd2cSJim Jagielski     SbxVariable *pCompVar = basicChosen->Find(  UniString(RTL_CONSTASCII_USTRINGPARAM("ThisComponent")), SbxCLASS_OBJECT );
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 	if ( pCompVar )
267*b1cdbd2cSJim Jagielski 	{
268*b1cdbd2cSJim Jagielski 		aModel = sbxToUnoValue( pCompVar );
269*b1cdbd2cSJim Jagielski 		if ( sal_False == ( aModel >>= xModel ) ||
270*b1cdbd2cSJim Jagielski 			!xModel.is() )
271*b1cdbd2cSJim Jagielski 		{
272*b1cdbd2cSJim Jagielski 			// trying last gasp try the current component
273*b1cdbd2cSJim Jagielski 			uno::Reference< beans::XPropertySet > xProps( ::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
274*b1cdbd2cSJim Jagielski 			// test if vba service is present
275*b1cdbd2cSJim Jagielski 			uno::Reference< uno::XComponentContext > xCtx( xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ))), uno::UNO_QUERY_THROW );
276*b1cdbd2cSJim Jagielski 			uno::Reference<lang::XMultiComponentFactory > xSMgr( xCtx->getServiceManager(), uno::UNO_QUERY_THROW );
277*b1cdbd2cSJim Jagielski 			uno::Reference< frame::XDesktop > xDesktop (xSMgr->createInstanceWithContext(::rtl::OUString::createFromAscii("com.sun.star.frame.Desktop"), xCtx), uno::UNO_QUERY_THROW );
278*b1cdbd2cSJim Jagielski 			xModel.set( xDesktop->getCurrentComponent(), uno::UNO_QUERY );
279*b1cdbd2cSJim Jagielski 			if ( !xModel.is() )
280*b1cdbd2cSJim Jagielski 			{
281*b1cdbd2cSJim Jagielski 				throw uno::RuntimeException(
282*b1cdbd2cSJim Jagielski 					rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Can't extract model from basic ( its obviously not set yet ) therefore don't know the currently selected document") ), uno::Reference< uno::XInterface >() );
283*b1cdbd2cSJim Jagielski 			}
284*b1cdbd2cSJim Jagielski 			return xModel;
285*b1cdbd2cSJim Jagielski 		}
286*b1cdbd2cSJim Jagielski 		else
287*b1cdbd2cSJim Jagielski 		{
288*b1cdbd2cSJim Jagielski 			OSL_TRACE("Have model ThisComponent points to url %s",
289*b1cdbd2cSJim Jagielski 			::rtl::OUStringToOString( xModel->getURL(),
290*b1cdbd2cSJim Jagielski 				RTL_TEXTENCODING_ASCII_US ).pData->buffer );
291*b1cdbd2cSJim Jagielski 		}
292*b1cdbd2cSJim Jagielski 	}
293*b1cdbd2cSJim Jagielski 	else
294*b1cdbd2cSJim Jagielski 	{
295*b1cdbd2cSJim Jagielski 		OSL_TRACE("Failed to get ThisComponent");
296*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException(
297*b1cdbd2cSJim Jagielski 			rtl::OUString(
298*b1cdbd2cSJim Jagielski 				RTL_CONSTASCII_USTRINGPARAM(
299*b1cdbd2cSJim Jagielski 					"Can't determine the currently selected document") ),
300*b1cdbd2cSJim Jagielski 			uno::Reference< uno::XInterface >() );
301*b1cdbd2cSJim Jagielski 	}
302*b1cdbd2cSJim Jagielski 	return xModel;
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski ScDocShell*
getDocShell(css::uno::Reference<css::frame::XModel> & xModel)306*b1cdbd2cSJim Jagielski getDocShell( css::uno::Reference< css::frame::XModel>& xModel )
307*b1cdbd2cSJim Jagielski {
308*b1cdbd2cSJim Jagielski 	uno::Reference< uno::XInterface > xIf( xModel, uno::UNO_QUERY_THROW );
309*b1cdbd2cSJim Jagielski 	ScModelObj* pModel = dynamic_cast< ScModelObj* >( xIf.get() );
310*b1cdbd2cSJim Jagielski 	ScDocShell* pDocShell = NULL;
311*b1cdbd2cSJim Jagielski 	if ( pModel )
312*b1cdbd2cSJim Jagielski 		pDocShell = (ScDocShell*)pModel->GetEmbeddedObject();
313*b1cdbd2cSJim Jagielski 	return pDocShell;
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski }
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski ScTabViewShell*
getBestViewShell(css::uno::Reference<css::frame::XModel> & xModel)318*b1cdbd2cSJim Jagielski getBestViewShell(  css::uno::Reference< css::frame::XModel>& xModel )
319*b1cdbd2cSJim Jagielski {
320*b1cdbd2cSJim Jagielski 	ScDocShell* pDocShell = getDocShell( xModel );
321*b1cdbd2cSJim Jagielski 	if ( pDocShell )
322*b1cdbd2cSJim Jagielski 		return pDocShell->GetBestViewShell();
323*b1cdbd2cSJim Jagielski 	return NULL;
324*b1cdbd2cSJim Jagielski }
325*b1cdbd2cSJim Jagielski 
326*b1cdbd2cSJim Jagielski ScTabViewShell*
getCurrentBestViewShell()327*b1cdbd2cSJim Jagielski getCurrentBestViewShell()
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski 	uno::Reference< frame::XModel > xModel = getCurrentDocument();
330*b1cdbd2cSJim Jagielski 	return getBestViewShell( xModel );
331*b1cdbd2cSJim Jagielski }
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski SfxViewFrame*
getCurrentViewFrame()334*b1cdbd2cSJim Jagielski getCurrentViewFrame()
335*b1cdbd2cSJim Jagielski {
336*b1cdbd2cSJim Jagielski 	ScTabViewShell* pViewShell = getCurrentBestViewShell();
337*b1cdbd2cSJim Jagielski 	if ( pViewShell )
338*b1cdbd2cSJim Jagielski 		return pViewShell->GetViewFrame();
339*b1cdbd2cSJim Jagielski 	return NULL;
340*b1cdbd2cSJim Jagielski }
341*b1cdbd2cSJim Jagielski 
342*b1cdbd2cSJim Jagielski sal_Int32
OORGBToXLRGB(sal_Int32 nCol)343*b1cdbd2cSJim Jagielski OORGBToXLRGB( sal_Int32 nCol )
344*b1cdbd2cSJim Jagielski {
345*b1cdbd2cSJim Jagielski 	sal_Int32 nRed = nCol;
346*b1cdbd2cSJim Jagielski 	nRed &= 0x00FF0000;
347*b1cdbd2cSJim Jagielski 	nRed >>= 16;
348*b1cdbd2cSJim Jagielski 	sal_Int32 nGreen = nCol;
349*b1cdbd2cSJim Jagielski 	nGreen &= 0x0000FF00;
350*b1cdbd2cSJim Jagielski 	nGreen >>= 8;
351*b1cdbd2cSJim Jagielski 	sal_Int32 nBlue = nCol;
352*b1cdbd2cSJim Jagielski 	nBlue &= 0x000000FF;
353*b1cdbd2cSJim Jagielski 	sal_Int32 nRGB =  ( (nBlue << 16) | (nGreen << 8) | nRed );
354*b1cdbd2cSJim Jagielski 	return nRGB;
355*b1cdbd2cSJim Jagielski }
356*b1cdbd2cSJim Jagielski sal_Int32
XLRGBToOORGB(sal_Int32 nCol)357*b1cdbd2cSJim Jagielski XLRGBToOORGB( sal_Int32 nCol )
358*b1cdbd2cSJim Jagielski {
359*b1cdbd2cSJim Jagielski 	sal_Int32 nBlue = nCol;
360*b1cdbd2cSJim Jagielski 	nBlue &= 0x00FF0000;
361*b1cdbd2cSJim Jagielski 	nBlue >>= 16;
362*b1cdbd2cSJim Jagielski 	sal_Int32 nGreen = nCol;
363*b1cdbd2cSJim Jagielski 	nGreen &= 0x0000FF00;
364*b1cdbd2cSJim Jagielski 	nGreen >>= 8;
365*b1cdbd2cSJim Jagielski 	sal_Int32 nRed = nCol;
366*b1cdbd2cSJim Jagielski 	nRed &= 0x000000FF;
367*b1cdbd2cSJim Jagielski 	sal_Int32 nRGB =  ( (nRed << 16) | (nGreen << 8) | nBlue );
368*b1cdbd2cSJim Jagielski 	return nRGB;
369*b1cdbd2cSJim Jagielski }
370*b1cdbd2cSJim Jagielski uno::Any
OORGBToXLRGB(const uno::Any & aCol)371*b1cdbd2cSJim Jagielski OORGBToXLRGB( const uno::Any& aCol )
372*b1cdbd2cSJim Jagielski {
373*b1cdbd2cSJim Jagielski 	sal_Int32 nCol=0;
374*b1cdbd2cSJim Jagielski 	aCol >>= nCol;
375*b1cdbd2cSJim Jagielski 	nCol = OORGBToXLRGB( nCol );
376*b1cdbd2cSJim Jagielski 	return uno::makeAny( nCol );
377*b1cdbd2cSJim Jagielski }
378*b1cdbd2cSJim Jagielski uno::Any
XLRGBToOORGB(const uno::Any & aCol)379*b1cdbd2cSJim Jagielski XLRGBToOORGB(  const uno::Any& aCol )
380*b1cdbd2cSJim Jagielski {
381*b1cdbd2cSJim Jagielski 	sal_Int32 nCol=0;
382*b1cdbd2cSJim Jagielski 	aCol >>= nCol;
383*b1cdbd2cSJim Jagielski 	nCol = XLRGBToOORGB( nCol );
384*b1cdbd2cSJim Jagielski 	return uno::makeAny( nCol );
385*b1cdbd2cSJim Jagielski }
386*b1cdbd2cSJim Jagielski 
PrintOutHelper(const uno::Any & From,const uno::Any & To,const uno::Any & Copies,const uno::Any & Preview,const uno::Any &,const uno::Any &,const uno::Any & Collate,const uno::Any & PrToFileName,css::uno::Reference<frame::XModel> & xModel,sal_Bool bUseSelection)387*b1cdbd2cSJim Jagielski void PrintOutHelper( const uno::Any& From, const uno::Any& To, const uno::Any& Copies, const uno::Any& Preview, const uno::Any& /*ActivePrinter*/, const uno::Any& /*PrintToFile*/, const uno::Any& Collate, const uno::Any& PrToFileName, css::uno::Reference< frame::XModel >& xModel, sal_Bool bUseSelection  )
388*b1cdbd2cSJim Jagielski {
389*b1cdbd2cSJim Jagielski 	sal_Int32 nTo = 0;
390*b1cdbd2cSJim Jagielski 	sal_Int32 nFrom = 0;
391*b1cdbd2cSJim Jagielski 	sal_Int16 nCopies = 1;
392*b1cdbd2cSJim Jagielski 	sal_Bool bPreview = sal_False;
393*b1cdbd2cSJim Jagielski 	sal_Bool bCollate = sal_False;
394*b1cdbd2cSJim Jagielski 	sal_Bool bSelection = bUseSelection;
395*b1cdbd2cSJim Jagielski 	From >>= nFrom;
396*b1cdbd2cSJim Jagielski 	To >>= nTo;
397*b1cdbd2cSJim Jagielski 	Copies >>= nCopies;
398*b1cdbd2cSJim Jagielski 	Preview >>= bPreview;
399*b1cdbd2cSJim Jagielski 	if ( nCopies > 1 ) // Collate only useful when more that 1 copy
400*b1cdbd2cSJim Jagielski 		Collate >>= bCollate;
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 	rtl::OUString sRange(  RTL_CONSTASCII_USTRINGPARAM( "-" ) );
403*b1cdbd2cSJim Jagielski 	rtl::OUString sFileName;
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski 	if (( nFrom || nTo ) )
406*b1cdbd2cSJim Jagielski 	{
407*b1cdbd2cSJim Jagielski 		if ( nFrom )
408*b1cdbd2cSJim Jagielski 			sRange = ( ::rtl::OUString::valueOf( nFrom ) + sRange );
409*b1cdbd2cSJim Jagielski 		if ( nTo )
410*b1cdbd2cSJim Jagielski 			sRange += ::rtl::OUString::valueOf( nTo );
411*b1cdbd2cSJim Jagielski 	}
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski 	if (  PrToFileName.getValue() )
414*b1cdbd2cSJim Jagielski 	{
415*b1cdbd2cSJim Jagielski 		PrToFileName >>= sFileName;
416*b1cdbd2cSJim Jagielski 	}
417*b1cdbd2cSJim Jagielski 	ScTabViewShell* pViewShell = getBestViewShell( xModel );
418*b1cdbd2cSJim Jagielski 	SfxViewFrame* pViewFrame = NULL;
419*b1cdbd2cSJim Jagielski 	if ( pViewShell )
420*b1cdbd2cSJim Jagielski 		pViewFrame = pViewShell->GetViewFrame();
421*b1cdbd2cSJim Jagielski 	if ( pViewFrame )
422*b1cdbd2cSJim Jagielski 	{
423*b1cdbd2cSJim Jagielski 		SfxAllItemSet aArgs( SFX_APP()->GetPool() );
424*b1cdbd2cSJim Jagielski 
425*b1cdbd2cSJim Jagielski 		SfxBoolItem sfxCollate( SID_PRINT_COLLATE, bCollate );
426*b1cdbd2cSJim Jagielski 		aArgs.Put( sfxCollate, sfxCollate.Which() );
427*b1cdbd2cSJim Jagielski 		SfxInt16Item sfxCopies( SID_PRINT_COPIES, nCopies );
428*b1cdbd2cSJim Jagielski 		aArgs.Put( sfxCopies, sfxCopies.Which() );
429*b1cdbd2cSJim Jagielski 		if ( sFileName.getLength() )
430*b1cdbd2cSJim Jagielski 		{
431*b1cdbd2cSJim Jagielski 			SfxStringItem sfxFileName( SID_FILE_NAME, sFileName);
432*b1cdbd2cSJim Jagielski 			aArgs.Put( sfxFileName, sfxFileName.Which() );
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski 		}
435*b1cdbd2cSJim Jagielski 		if (  sRange.getLength() )
436*b1cdbd2cSJim Jagielski 		{
437*b1cdbd2cSJim Jagielski 			SfxStringItem sfxRange( SID_PRINT_PAGES, sRange );
438*b1cdbd2cSJim Jagielski 			aArgs.Put( sfxRange, sfxRange.Which() );
439*b1cdbd2cSJim Jagielski 		}
440*b1cdbd2cSJim Jagielski 		SfxBoolItem sfxSelection( SID_SELECTION, bSelection );
441*b1cdbd2cSJim Jagielski 		aArgs.Put( sfxSelection, sfxSelection.Which() );
442*b1cdbd2cSJim Jagielski 		SfxBoolItem sfxAsync( SID_ASYNCHRON, sal_False );
443*b1cdbd2cSJim Jagielski 		aArgs.Put( sfxAsync, sfxAsync.Which() );
444*b1cdbd2cSJim Jagielski 		SfxDispatcher* pDispatcher = pViewFrame->GetDispatcher();
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 		if ( pDispatcher )
447*b1cdbd2cSJim Jagielski 		{
448*b1cdbd2cSJim Jagielski 			if ( bPreview )
449*b1cdbd2cSJim Jagielski 			{
450*b1cdbd2cSJim Jagielski 				if ( !pViewFrame->GetFrame().IsInPlace() )
451*b1cdbd2cSJim Jagielski 				{
452*b1cdbd2cSJim Jagielski 					SC_MOD()->InputEnterHandler();
453*b1cdbd2cSJim Jagielski 					pViewFrame->GetDispatcher()->Execute( SID_VIEWSHELL1, SFX_CALLMODE_SYNCHRON );
454*b1cdbd2cSJim Jagielski 					while ( isInPrintPreview( pViewFrame ) )
455*b1cdbd2cSJim Jagielski 						Application::Yield();
456*b1cdbd2cSJim Jagielski 				}
457*b1cdbd2cSJim Jagielski 			}
458*b1cdbd2cSJim Jagielski 			else
459*b1cdbd2cSJim Jagielski 				pDispatcher->Execute( (sal_uInt16)SID_PRINTDOC, (SfxCallMode)SFX_CALLMODE_SYNCHRON, aArgs );
460*b1cdbd2cSJim Jagielski 		}
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski 	}
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 	// #FIXME #TODO
465*b1cdbd2cSJim Jagielski 	// 1 ActivePrinter ( how/can we switch a printer via API? )
466*b1cdbd2cSJim Jagielski 	// 2 PrintToFile ( ms behaviour if this option is specified but no
467*b1cdbd2cSJim Jagielski 	//   filename supplied 'PrToFileName' then the user will be prompted )
468*b1cdbd2cSJim Jagielski 	// 3 Need to check behaviour of Selected sheets with range ( e.g. From & To
469*b1cdbd2cSJim Jagielski 	//    values ) in oOO these options are mutually exclusive
470*b1cdbd2cSJim Jagielski 	// 4 There is a pop up to do with transparent objects in the print source
471*b1cdbd2cSJim Jagielski 	//   should be able to disable that via configuration for the duration
472*b1cdbd2cSJim Jagielski 	//   of this method
473*b1cdbd2cSJim Jagielski }
474*b1cdbd2cSJim Jagielski 
PrintPreviewHelper(const css::uno::Any &,css::uno::Reference<css::frame::XModel> & xModel)475*b1cdbd2cSJim Jagielski  void PrintPreviewHelper( const css::uno::Any& /*EnableChanges*/, css::uno::Reference< css::frame::XModel >& xModel )
476*b1cdbd2cSJim Jagielski {
477*b1cdbd2cSJim Jagielski 	dispatchExecute( xModel, SID_VIEWSHELL1 );
478*b1cdbd2cSJim Jagielski }
479*b1cdbd2cSJim Jagielski 
getAnyAsString(const uno::Any & pvargItem)480*b1cdbd2cSJim Jagielski rtl::OUString getAnyAsString( const uno::Any& pvargItem ) throw ( uno::RuntimeException )
481*b1cdbd2cSJim Jagielski {
482*b1cdbd2cSJim Jagielski 	uno::Type aType = pvargItem.getValueType();
483*b1cdbd2cSJim Jagielski 	uno::TypeClass eTypeClass = aType.getTypeClass();
484*b1cdbd2cSJim Jagielski 	rtl::OUString sString;
485*b1cdbd2cSJim Jagielski 	switch ( eTypeClass )
486*b1cdbd2cSJim Jagielski 	{
487*b1cdbd2cSJim Jagielski 		case uno::TypeClass_BOOLEAN:
488*b1cdbd2cSJim Jagielski 		{
489*b1cdbd2cSJim Jagielski 			sal_Bool bBool = sal_False;
490*b1cdbd2cSJim Jagielski 			pvargItem >>= bBool;
491*b1cdbd2cSJim Jagielski 			sString = rtl::OUString::valueOf( bBool );
492*b1cdbd2cSJim Jagielski 			break;
493*b1cdbd2cSJim Jagielski 		}
494*b1cdbd2cSJim Jagielski 		case uno::TypeClass_STRING:
495*b1cdbd2cSJim Jagielski 			pvargItem >>= sString;
496*b1cdbd2cSJim Jagielski 			break;
497*b1cdbd2cSJim Jagielski 		case uno::TypeClass_FLOAT:
498*b1cdbd2cSJim Jagielski 			{
499*b1cdbd2cSJim Jagielski 				float aFloat = 0;
500*b1cdbd2cSJim Jagielski 				pvargItem >>= aFloat;
501*b1cdbd2cSJim Jagielski 				sString = rtl::OUString::valueOf( aFloat );
502*b1cdbd2cSJim Jagielski 				break;
503*b1cdbd2cSJim Jagielski 			}
504*b1cdbd2cSJim Jagielski 		case uno::TypeClass_DOUBLE:
505*b1cdbd2cSJim Jagielski 			{
506*b1cdbd2cSJim Jagielski 				double aDouble = 0;
507*b1cdbd2cSJim Jagielski 				pvargItem >>= aDouble;
508*b1cdbd2cSJim Jagielski 				sString = rtl::OUString::valueOf( aDouble );
509*b1cdbd2cSJim Jagielski 				break;
510*b1cdbd2cSJim Jagielski 			}
511*b1cdbd2cSJim Jagielski 		case uno::TypeClass_SHORT:
512*b1cdbd2cSJim Jagielski 		case uno::TypeClass_LONG:
513*b1cdbd2cSJim Jagielski 		case uno::TypeClass_BYTE:
514*b1cdbd2cSJim Jagielski 			{
515*b1cdbd2cSJim Jagielski 				sal_Int32 aNum = 0;
516*b1cdbd2cSJim Jagielski 				pvargItem >>= aNum;
517*b1cdbd2cSJim Jagielski 				sString = rtl::OUString::valueOf( aNum );
518*b1cdbd2cSJim Jagielski 				break;
519*b1cdbd2cSJim Jagielski 			}
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski 		case uno::TypeClass_HYPER:
522*b1cdbd2cSJim Jagielski 			{
523*b1cdbd2cSJim Jagielski 				sal_Int64 aHyper = 0;
524*b1cdbd2cSJim Jagielski 				pvargItem >>= aHyper;
525*b1cdbd2cSJim Jagielski 				sString = rtl::OUString::valueOf( aHyper );
526*b1cdbd2cSJim Jagielski 				break;
527*b1cdbd2cSJim Jagielski 			}
528*b1cdbd2cSJim Jagielski 		default:
529*b1cdbd2cSJim Jagielski        			throw uno::RuntimeException( rtl::OUString::createFromAscii( "Invalid type, can't convert" ), uno::Reference< uno::XInterface >() );
530*b1cdbd2cSJim Jagielski 	}
531*b1cdbd2cSJim Jagielski 	return sString;
532*b1cdbd2cSJim Jagielski }
533*b1cdbd2cSJim Jagielski 
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski rtl::OUString
getUniqueName(const uno::Sequence<::rtl::OUString> & _slist,const rtl::OUString & _sElementName,const::rtl::OUString & _sSuffixSeparator)536*b1cdbd2cSJim Jagielski ContainerUtilities::getUniqueName( const uno::Sequence< ::rtl::OUString >&  _slist, const rtl::OUString& _sElementName, const ::rtl::OUString& _sSuffixSeparator)
537*b1cdbd2cSJim Jagielski {
538*b1cdbd2cSJim Jagielski 	return getUniqueName(_slist, _sElementName, _sSuffixSeparator, sal_Int32(2));
539*b1cdbd2cSJim Jagielski }
540*b1cdbd2cSJim Jagielski 
541*b1cdbd2cSJim Jagielski rtl::OUString
getUniqueName(const uno::Sequence<rtl::OUString> & _slist,const rtl::OUString _sElementName,const rtl::OUString & _sSuffixSeparator,sal_Int32 _nStartSuffix)542*b1cdbd2cSJim Jagielski ContainerUtilities::getUniqueName( const uno::Sequence< rtl::OUString >& _slist, const rtl::OUString _sElementName, const rtl::OUString& _sSuffixSeparator, sal_Int32 _nStartSuffix)
543*b1cdbd2cSJim Jagielski {
544*b1cdbd2cSJim Jagielski 	sal_Int32 a = _nStartSuffix;
545*b1cdbd2cSJim Jagielski 	rtl::OUString scompname = _sElementName;
546*b1cdbd2cSJim Jagielski 	bool bElementexists = true;
547*b1cdbd2cSJim Jagielski 	sal_Int32 nLen = _slist.getLength();
548*b1cdbd2cSJim Jagielski 	if ( nLen == 0 )
549*b1cdbd2cSJim Jagielski 		return _sElementName;
550*b1cdbd2cSJim Jagielski 
551*b1cdbd2cSJim Jagielski 	while (bElementexists == true)
552*b1cdbd2cSJim Jagielski 	{
553*b1cdbd2cSJim Jagielski 		for (sal_Int32 i = 0; i < nLen; i++)
554*b1cdbd2cSJim Jagielski 		{
555*b1cdbd2cSJim Jagielski 			if (FieldInList(_slist, scompname) == -1)
556*b1cdbd2cSJim Jagielski 			{
557*b1cdbd2cSJim Jagielski 				return scompname;
558*b1cdbd2cSJim Jagielski 			}
559*b1cdbd2cSJim Jagielski 		}
560*b1cdbd2cSJim Jagielski 		scompname = _sElementName + _sSuffixSeparator + rtl::OUString::valueOf( a++ );
561*b1cdbd2cSJim Jagielski 	}
562*b1cdbd2cSJim Jagielski 	return rtl::OUString();
563*b1cdbd2cSJim Jagielski }
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski sal_Int32
FieldInList(const uno::Sequence<rtl::OUString> & SearchList,const rtl::OUString & SearchString)566*b1cdbd2cSJim Jagielski ContainerUtilities::FieldInList( const uno::Sequence< rtl::OUString >& SearchList, const rtl::OUString& SearchString )
567*b1cdbd2cSJim Jagielski {
568*b1cdbd2cSJim Jagielski 	sal_Int32 FieldLen = SearchList.getLength();
569*b1cdbd2cSJim Jagielski 	sal_Int32 retvalue = -1;
570*b1cdbd2cSJim Jagielski 	for (sal_Int32 i = 0; i < FieldLen; i++)
571*b1cdbd2cSJim Jagielski 	{
572*b1cdbd2cSJim Jagielski 		// I wonder why comparing lexicographically is done
573*b1cdbd2cSJim Jagielski 		// when its a match is whats interesting?
574*b1cdbd2cSJim Jagielski 		//if (SearchList[i].compareTo(SearchString) == 0)
575*b1cdbd2cSJim Jagielski 		if ( SearchList[i].equals( SearchString ) )
576*b1cdbd2cSJim Jagielski 		{
577*b1cdbd2cSJim Jagielski 			retvalue = i;
578*b1cdbd2cSJim Jagielski 			break;
579*b1cdbd2cSJim Jagielski 		}
580*b1cdbd2cSJim Jagielski 	}
581*b1cdbd2cSJim Jagielski 	return retvalue;
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski }
NeedEsc(sal_Unicode cCode)584*b1cdbd2cSJim Jagielski bool NeedEsc(sal_Unicode cCode)
585*b1cdbd2cSJim Jagielski {
586*b1cdbd2cSJim Jagielski 	String sEsc(RTL_CONSTASCII_USTRINGPARAM(".^$+\\|{}()"));
587*b1cdbd2cSJim Jagielski 	return (STRING_NOTFOUND != sEsc.Search(cCode));
588*b1cdbd2cSJim Jagielski }
589*b1cdbd2cSJim Jagielski 
VBAToRegexp(const rtl::OUString & rIn,bool bForLike)590*b1cdbd2cSJim Jagielski rtl::OUString VBAToRegexp(const rtl::OUString &rIn, bool bForLike )
591*b1cdbd2cSJim Jagielski {
592*b1cdbd2cSJim Jagielski 	rtl::OUStringBuffer sResult;
593*b1cdbd2cSJim Jagielski 	const sal_Unicode *start = rIn.getStr();
594*b1cdbd2cSJim Jagielski 	const sal_Unicode *end = start + rIn.getLength();
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski 	int seenright = 0;
597*b1cdbd2cSJim Jagielski 	if ( bForLike )
598*b1cdbd2cSJim Jagielski 		sResult.append(static_cast<sal_Unicode>('^'));
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski 	while (start < end)
601*b1cdbd2cSJim Jagielski 	{
602*b1cdbd2cSJim Jagielski 		switch (*start)
603*b1cdbd2cSJim Jagielski 		{
604*b1cdbd2cSJim Jagielski 			case '?':
605*b1cdbd2cSJim Jagielski 				sResult.append(static_cast<sal_Unicode>('.'));
606*b1cdbd2cSJim Jagielski 				start++;
607*b1cdbd2cSJim Jagielski 				break;
608*b1cdbd2cSJim Jagielski 			case '*':
609*b1cdbd2cSJim Jagielski 				sResult.append(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".*")));
610*b1cdbd2cSJim Jagielski 				start++;
611*b1cdbd2cSJim Jagielski 				break;
612*b1cdbd2cSJim Jagielski 			case '#':
613*b1cdbd2cSJim Jagielski 				sResult.append(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("[0-9]")));
614*b1cdbd2cSJim Jagielski 				start++;
615*b1cdbd2cSJim Jagielski 				break;
616*b1cdbd2cSJim Jagielski 			case '~':
617*b1cdbd2cSJim Jagielski 				sResult.append(static_cast<sal_Unicode>('\\'));
618*b1cdbd2cSJim Jagielski 				sResult.append(*(++start));
619*b1cdbd2cSJim Jagielski 				start++;
620*b1cdbd2cSJim Jagielski 				break;
621*b1cdbd2cSJim Jagielski 				// dump the ~ and escape the next characture
622*b1cdbd2cSJim Jagielski 			case ']':
623*b1cdbd2cSJim Jagielski 				sResult.append(static_cast<sal_Unicode>('\\'));
624*b1cdbd2cSJim Jagielski 				sResult.append(*start++);
625*b1cdbd2cSJim Jagielski 				break;
626*b1cdbd2cSJim Jagielski 			case '[':
627*b1cdbd2cSJim Jagielski 				sResult.append(*start++);
628*b1cdbd2cSJim Jagielski 				seenright = 0;
629*b1cdbd2cSJim Jagielski 				while (start < end && !seenright)
630*b1cdbd2cSJim Jagielski 				{
631*b1cdbd2cSJim Jagielski 					switch (*start)
632*b1cdbd2cSJim Jagielski 					{
633*b1cdbd2cSJim Jagielski 						case '[':
634*b1cdbd2cSJim Jagielski 						case '?':
635*b1cdbd2cSJim Jagielski 						case '*':
636*b1cdbd2cSJim Jagielski 						sResult.append(static_cast<sal_Unicode>('\\'));
637*b1cdbd2cSJim Jagielski 						sResult.append(*start);
638*b1cdbd2cSJim Jagielski 							break;
639*b1cdbd2cSJim Jagielski 						case ']':
640*b1cdbd2cSJim Jagielski 						sResult.append(*start);
641*b1cdbd2cSJim Jagielski 							seenright = 1;
642*b1cdbd2cSJim Jagielski 							break;
643*b1cdbd2cSJim Jagielski 						case '!':
644*b1cdbd2cSJim Jagielski 							sResult.append(static_cast<sal_Unicode>('^'));
645*b1cdbd2cSJim Jagielski 							break;
646*b1cdbd2cSJim Jagielski 						default:
647*b1cdbd2cSJim Jagielski 						if (NeedEsc(*start))
648*b1cdbd2cSJim Jagielski 							sResult.append(static_cast<sal_Unicode>('\\'));
649*b1cdbd2cSJim Jagielski 						sResult.append(*start);
650*b1cdbd2cSJim Jagielski 							break;
651*b1cdbd2cSJim Jagielski 					}
652*b1cdbd2cSJim Jagielski 					start++;
653*b1cdbd2cSJim Jagielski 				}
654*b1cdbd2cSJim Jagielski 				break;
655*b1cdbd2cSJim Jagielski 			default:
656*b1cdbd2cSJim Jagielski 				if (NeedEsc(*start))
657*b1cdbd2cSJim Jagielski 					sResult.append(static_cast<sal_Unicode>('\\'));
658*b1cdbd2cSJim Jagielski 				sResult.append(*start++);
659*b1cdbd2cSJim Jagielski 		}
660*b1cdbd2cSJim Jagielski 	}
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski 	if ( bForLike )
663*b1cdbd2cSJim Jagielski 		sResult.append(static_cast<sal_Unicode>('$'));
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski 	return sResult.makeStringAndClear( );
666*b1cdbd2cSJim Jagielski }
667*b1cdbd2cSJim Jagielski 
getPixelTo100thMillimeterConversionFactor(css::uno::Reference<css::awt::XDevice> & xDevice,sal_Bool bVertical)668*b1cdbd2cSJim Jagielski double getPixelTo100thMillimeterConversionFactor( css::uno::Reference< css::awt::XDevice >& xDevice, sal_Bool bVertical)
669*b1cdbd2cSJim Jagielski {
670*b1cdbd2cSJim Jagielski 	double fConvertFactor = 1.0;
671*b1cdbd2cSJim Jagielski 	if( bVertical )
672*b1cdbd2cSJim Jagielski 	{
673*b1cdbd2cSJim Jagielski 		fConvertFactor = xDevice->getInfo().PixelPerMeterY/100000;
674*b1cdbd2cSJim Jagielski 	}
675*b1cdbd2cSJim Jagielski 	else
676*b1cdbd2cSJim Jagielski 	{
677*b1cdbd2cSJim Jagielski 		fConvertFactor = xDevice->getInfo().PixelPerMeterX/100000;
678*b1cdbd2cSJim Jagielski 	}
679*b1cdbd2cSJim Jagielski 	return fConvertFactor;
680*b1cdbd2cSJim Jagielski }
681*b1cdbd2cSJim Jagielski 
PointsToPixels(css::uno::Reference<css::awt::XDevice> & xDevice,double fPoints,sal_Bool bVertical)682*b1cdbd2cSJim Jagielski double PointsToPixels( css::uno::Reference< css::awt::XDevice >& xDevice, double fPoints, sal_Bool bVertical)
683*b1cdbd2cSJim Jagielski {
684*b1cdbd2cSJim Jagielski 	double fConvertFactor = getPixelTo100thMillimeterConversionFactor( xDevice, bVertical );
685*b1cdbd2cSJim Jagielski 	return fPoints * POINTTO100THMILLIMETERFACTOR * fConvertFactor;
686*b1cdbd2cSJim Jagielski }
PixelsToPoints(css::uno::Reference<css::awt::XDevice> & xDevice,double fPixels,sal_Bool bVertical)687*b1cdbd2cSJim Jagielski double PixelsToPoints( css::uno::Reference< css::awt::XDevice >& xDevice, double fPixels, sal_Bool bVertical)
688*b1cdbd2cSJim Jagielski {
689*b1cdbd2cSJim Jagielski 	double fConvertFactor = getPixelTo100thMillimeterConversionFactor( xDevice, bVertical );
690*b1cdbd2cSJim Jagielski 	return (fPixels/fConvertFactor)/POINTTO100THMILLIMETERFACTOR;
691*b1cdbd2cSJim Jagielski }
692*b1cdbd2cSJim Jagielski 
ConcreteXShapeGeometryAttributes(const css::uno::Reference<css::uno::XComponentContext> & xContext,const css::uno::Reference<css::drawing::XShape> & xShape)693*b1cdbd2cSJim Jagielski ConcreteXShapeGeometryAttributes::ConcreteXShapeGeometryAttributes( const css::uno::Reference< css::uno::XComponentContext >& xContext, const css::uno::Reference< css::drawing::XShape >& xShape )
694*b1cdbd2cSJim Jagielski {
695*b1cdbd2cSJim Jagielski 	m_xShape = new ScVbaShape( xContext, xShape );
696*b1cdbd2cSJim Jagielski }
697*b1cdbd2cSJim Jagielski 
698*b1cdbd2cSJim Jagielski #define VBA_LEFT "PositionX"
699*b1cdbd2cSJim Jagielski #define VBA_TOP "PositionY"
UserFormGeometryHelper(const uno::Reference<uno::XComponentContext> &,const uno::Reference<awt::XControl> & xControl)700*b1cdbd2cSJim Jagielski UserFormGeometryHelper::UserFormGeometryHelper( const uno::Reference< uno::XComponentContext >& /*xContext*/, const uno::Reference< awt::XControl >& xControl )
701*b1cdbd2cSJim Jagielski {
702*b1cdbd2cSJim Jagielski     mxModel.set( xControl->getModel(), uno::UNO_QUERY_THROW );
703*b1cdbd2cSJim Jagielski }
getLeft()704*b1cdbd2cSJim Jagielski     double UserFormGeometryHelper::getLeft()
705*b1cdbd2cSJim Jagielski     {
706*b1cdbd2cSJim Jagielski 	sal_Int32 nLeft = 0;
707*b1cdbd2cSJim Jagielski 	mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_LEFT ) ) ) >>= nLeft;
708*b1cdbd2cSJim Jagielski 	return Millimeter::getInPoints( nLeft );
709*b1cdbd2cSJim Jagielski     }
setLeft(double nLeft)710*b1cdbd2cSJim Jagielski     void UserFormGeometryHelper::setLeft( double nLeft )
711*b1cdbd2cSJim Jagielski     {
712*b1cdbd2cSJim Jagielski         mxModel->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( VBA_LEFT ) ), uno::makeAny( Millimeter::getInHundredthsOfOneMillimeter( nLeft ) ) );
713*b1cdbd2cSJim Jagielski     }
getTop()714*b1cdbd2cSJim Jagielski     double UserFormGeometryHelper::getTop()
715*b1cdbd2cSJim Jagielski     {
716*b1cdbd2cSJim Jagielski 	sal_Int32 nTop = 0;
717*b1cdbd2cSJim Jagielski 	mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 	VBA_TOP ) ) ) >>= nTop;
718*b1cdbd2cSJim Jagielski 	return Millimeter::getInPoints( nTop );
719*b1cdbd2cSJim Jagielski     }
setTop(double nTop)720*b1cdbd2cSJim Jagielski     void UserFormGeometryHelper::setTop( double nTop )
721*b1cdbd2cSJim Jagielski     {
722*b1cdbd2cSJim Jagielski 	mxModel->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 	VBA_TOP ) ), uno::makeAny( Millimeter::getInHundredthsOfOneMillimeter( nTop ) ) );
723*b1cdbd2cSJim Jagielski     }
getHeight()724*b1cdbd2cSJim Jagielski     double UserFormGeometryHelper::getHeight()
725*b1cdbd2cSJim Jagielski     {
726*b1cdbd2cSJim Jagielski 	sal_Int32 nHeight = 0;
727*b1cdbd2cSJim Jagielski 	mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 	SC_UNONAME_CELLHGT ) ) ) >>= nHeight;
728*b1cdbd2cSJim Jagielski 	return Millimeter::getInPoints( nHeight );
729*b1cdbd2cSJim Jagielski     }
setHeight(double nHeight)730*b1cdbd2cSJim Jagielski     void UserFormGeometryHelper::setHeight( double nHeight )
731*b1cdbd2cSJim Jagielski     {
732*b1cdbd2cSJim Jagielski 	mxModel->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 	SC_UNONAME_CELLHGT ) ), uno::makeAny( Millimeter::getInHundredthsOfOneMillimeter( nHeight ) ) );
733*b1cdbd2cSJim Jagielski     }
getWidth()734*b1cdbd2cSJim Jagielski     double UserFormGeometryHelper::getWidth()
735*b1cdbd2cSJim Jagielski     {
736*b1cdbd2cSJim Jagielski 	sal_Int32 nWidth = 0;
737*b1cdbd2cSJim Jagielski 	mxModel->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 	SC_UNONAME_CELLWID ) ) ) >>= nWidth;
738*b1cdbd2cSJim Jagielski 	return Millimeter::getInPoints( nWidth );
739*b1cdbd2cSJim Jagielski     }
setWidth(double nWidth)740*b1cdbd2cSJim Jagielski     void UserFormGeometryHelper::setWidth( double nWidth)
741*b1cdbd2cSJim Jagielski     {
742*b1cdbd2cSJim Jagielski 	mxModel->setPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( 	SC_UNONAME_CELLWID ) ), uno::makeAny(  Millimeter::getInHundredthsOfOneMillimeter( nWidth ) ) );
743*b1cdbd2cSJim Jagielski     }
744*b1cdbd2cSJim Jagielski 
745*b1cdbd2cSJim Jagielski SfxItemSet*
GetDataSet(ScCellRangeObj * pRangeObj)746*b1cdbd2cSJim Jagielski ScVbaCellRangeAccess::GetDataSet( ScCellRangeObj* pRangeObj )
747*b1cdbd2cSJim Jagielski {
748*b1cdbd2cSJim Jagielski 	SfxItemSet* pDataSet = pRangeObj ? pRangeObj->GetCurrentDataSet( true ) : NULL ;
749*b1cdbd2cSJim Jagielski 	return pDataSet;
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski }
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski } // vba
754*b1cdbd2cSJim Jagielski } // ooo
755