xref: /AOO41X/main/sw/source/core/doc/docbasic.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 
27 
28 #include <hintids.hxx>
29 
30 #ifndef _RTL_USTRING_HXX //autogen
31 #include <rtl/ustring.hxx>
32 #endif
33 #include <svtools/imap.hxx>
34 #include <svtools/imapobj.hxx>
35 #include <basic/sbx.hxx>
36 #include <frmfmt.hxx>
37 #include <fmtinfmt.hxx>
38 #include <fmturl.hxx>
39 #include <frmatr.hxx>
40 #include <docary.hxx>
41 #include <doc.hxx>
42 #ifndef _DOCSH_HXX
43 #include <docsh.hxx>
44 #endif
45 #include <swevent.hxx>
46 
47 using namespace ::com::sun::star::uno;
48 using ::rtl::OUString;
49 
lcl_docbasic_convertArgs(SbxArray & rArgs)50 static Sequence<Any> *lcl_docbasic_convertArgs( SbxArray& rArgs )
51 {
52     Sequence<Any> *pRet = 0;
53 
54     sal_uInt16 nCount = rArgs.Count();
55     if( nCount > 1 )
56     {
57         nCount--;
58         pRet = new Sequence<Any>( nCount );
59         Any *pUnoArgs = pRet->getArray();
60         for( sal_uInt16 i=0; i<nCount; i++ )
61         {
62             SbxVariable *pVar = rArgs.Get( i+1 );
63             switch( pVar->GetType() )
64             {
65             case SbxSTRING:
66                 pUnoArgs[i] <<= OUString( pVar->GetString() );
67                 break;
68             case SbxCHAR:
69                 pUnoArgs[i] <<= (sal_Int16)pVar->GetChar() ;
70                 break;
71             case SbxUSHORT:
72                 pUnoArgs[i] <<= (sal_Int16)pVar->GetUShort();
73                 break;
74             case SbxLONG:
75                 pUnoArgs[i] <<= (sal_Int32)pVar->GetLong();
76                 break;
77             default:
78                 pUnoArgs[i].setValue(0, ::getVoidCppuType());
79                 break;
80             }
81         }
82     }
83 
84     return pRet;
85 }
86 
ExecMacro(const SvxMacro & rMacro,String * pRet,SbxArray * pArgs)87 sal_Bool SwDoc::ExecMacro( const SvxMacro& rMacro, String* pRet, SbxArray* pArgs )
88 {
89     ErrCode eErr = 0;
90     switch( rMacro.GetScriptType() )
91     {
92     case STARBASIC:
93         {
94             SbxBaseRef aRef;
95             SbxValue* pRetValue = new SbxValue;
96             aRef = pRetValue;
97             eErr = pDocShell->CallBasic( rMacro.GetMacName(),
98                                          rMacro.GetLibName(),
99                                          pArgs, pRet ? pRetValue : 0 );
100 
101             if( pRet && SbxNULL <  pRetValue->GetType() &&
102                         SbxVOID != pRetValue->GetType() )
103                 // gueltiger Wert, also setzen
104                 *pRet = pRetValue->GetString();
105         }
106         break;
107     case JAVASCRIPT:
108         // ignore JavaScript calls
109         break;
110     case EXTENDED_STYPE:
111         {
112             Sequence<Any> *pUnoArgs = 0;
113             if( pArgs )
114             {
115                 // better to rename the local function to lcl_translateBasic2Uno and
116                 // a much shorter routine can be found in sfx2/source/doc/objmisc.cxx
117                 pUnoArgs = lcl_docbasic_convertArgs( *pArgs );
118             }
119 
120             if (!pUnoArgs)
121             {
122                 pUnoArgs = new Sequence< Any > (0);
123             }
124 
125             // TODO - return value is not handled
126             Any aRet;
127             Sequence< sal_Int16 > aOutArgsIndex;
128             Sequence< Any > aOutArgs;
129 
130             OSL_TRACE( "SwDoc::ExecMacro URL is %s", ByteString( rMacro.GetMacName(),
131                 RTL_TEXTENCODING_UTF8).GetBuffer() );
132 
133             eErr = pDocShell->CallXScript(
134                 rMacro.GetMacName(), *pUnoArgs, aRet, aOutArgsIndex, aOutArgs);
135 
136             //*pRet = pRetValue->GetString();
137             // use the AnyConverter to return a String if appropriate?
138 
139             // need to call something like lcl_translateUno2Basic
140             // pArgs = lcl_translateUno2Basic( pUnoArgs );
141 
142             delete pUnoArgs;
143             break;
144         }
145     }
146 
147     return 0 == eErr;
148 }
149 
150 
151 
CallEvent(sal_uInt16 nEvent,const SwCallMouseEvent & rCallEvent,sal_Bool bCheckPtr,SbxArray * pArgs,const Link *)152 sal_uInt16 SwDoc::CallEvent( sal_uInt16 nEvent, const SwCallMouseEvent& rCallEvent,
153                     sal_Bool bCheckPtr, SbxArray* pArgs, const Link* )
154 {
155     if( !pDocShell )        // ohne DocShell geht das nicht!
156         return 0;
157 
158     sal_uInt16 nRet = 0;
159     const SvxMacroTableDtor* pTbl = 0;
160     switch( rCallEvent.eType )
161     {
162     case EVENT_OBJECT_INETATTR:
163         if( bCheckPtr  )
164         {
165             const SfxPoolItem* pItem;
166             sal_uInt32 n, nMaxItems = GetAttrPool().GetItemCount2( RES_TXTATR_INETFMT );
167             for( n = 0; n < nMaxItems; ++n )
168                 if( 0 != (pItem = GetAttrPool().GetItem2( RES_TXTATR_INETFMT, n ) )
169                     && rCallEvent.PTR.pINetAttr == pItem )
170                 {
171                     bCheckPtr = sal_False;      // als Flag missbrauchen
172                     break;
173                 }
174         }
175         if( !bCheckPtr )
176             pTbl = rCallEvent.PTR.pINetAttr->GetMacroTbl();
177         break;
178 
179     case EVENT_OBJECT_URLITEM:
180     case EVENT_OBJECT_IMAGE:
181         {
182             const SwFrmFmtPtr pFmt = (SwFrmFmtPtr)rCallEvent.PTR.pFmt;
183             if( bCheckPtr )
184             {
185                 sal_uInt16 nPos = GetSpzFrmFmts()->GetPos( pFmt );
186                 if( USHRT_MAX != nPos )
187                     bCheckPtr = sal_False;      // als Flag missbrauchen
188             }
189             if( !bCheckPtr )
190                 pTbl = &pFmt->GetMacro().GetMacroTable();
191         }
192         break;
193 
194     case EVENT_OBJECT_IMAGEMAP:
195         {
196             const IMapObject* pIMapObj = rCallEvent.PTR.IMAP.pIMapObj;
197             if( bCheckPtr )
198             {
199                 const SwFrmFmtPtr pFmt = (SwFrmFmtPtr)rCallEvent.PTR.IMAP.pFmt;
200                 sal_uInt16 nPos = GetSpzFrmFmts()->GetPos( pFmt );
201                 const ImageMap* pIMap;
202                 if( USHRT_MAX != nPos &&
203                     0 != (pIMap = pFmt->GetURL().GetMap()) )
204                 {
205                     for( nPos = pIMap->GetIMapObjectCount(); nPos; )
206                         if( pIMapObj == pIMap->GetIMapObject( --nPos ))
207                         {
208                             bCheckPtr = sal_False;      // als Flag missbrauchen
209                             break;
210                         }
211                 }
212             }
213             if( !bCheckPtr )
214                 pTbl = &pIMapObj->GetMacroTable();
215         }
216         break;
217     default:
218         break;
219     }
220 
221     if( pTbl )
222     {
223         nRet = 0x1;
224         if( pTbl->IsKeyValid( nEvent ) )
225         {
226             const SvxMacro& rMacro = *pTbl->Get( nEvent );
227             if( STARBASIC == rMacro.GetScriptType() )
228             {
229                 nRet += 0 == pDocShell->CallBasic( rMacro.GetMacName(),
230                                     rMacro.GetLibName(), pArgs ) ? 1 : 0;
231             }
232             else if( EXTENDED_STYPE == rMacro.GetScriptType() )
233             {
234                 Sequence<Any> *pUnoArgs = 0;
235 
236                 if( pArgs )
237                 {
238                     pUnoArgs = lcl_docbasic_convertArgs( *pArgs );
239                 }
240 
241                 if (!pUnoArgs)
242                 {
243                     pUnoArgs = new Sequence <Any> (0);
244                 }
245 
246                 Any aRet;
247                 Sequence< sal_Int16 > aOutArgsIndex;
248                 Sequence< Any > aOutArgs;
249 
250                 OSL_TRACE( "SwDoc::CallEvent URL is %s", ByteString(
251                     rMacro.GetMacName(), RTL_TEXTENCODING_UTF8).GetBuffer() );
252 
253                 nRet += 0 == pDocShell->CallXScript(
254                     rMacro.GetMacName(), *pUnoArgs,aRet, aOutArgsIndex, aOutArgs) ? 1 : 0;
255 
256                 //*pRet = pRetValue->GetString();
257                 // use the AnyConverter to return a String if appropriate?
258 
259                 // need to call something like lcl_translateUno2Basic
260                 // pArgs = lcl_translateUno2Basic( pUnoArgs );
261 
262                 delete pUnoArgs;
263             }
264             // JavaScript calls are ignored
265         }
266     }
267     return nRet;
268 }
269 
270 
271 
272 
273