xref: /AOO41X/main/sw/source/core/fields/macrofld.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 #include <hintids.hxx>
28 #include <doc.hxx>
29 #include <docufld.hxx>
30 #include <unofldmid.h>
31 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
32 #include <com/sun/star/uri/XUriReferenceFactory.hpp>
33 #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
34 #include <comphelper/processfactory.hxx>
35 
36 
37 using namespace ::com::sun::star;
38 using ::rtl::OUString;
39 
40 /*--------------------------------------------------------------------
41     Beschreibung: MacroFeldtypen
42  --------------------------------------------------------------------*/
43 
SwMacroFieldType(SwDoc * pDocument)44 SwMacroFieldType::SwMacroFieldType(SwDoc* pDocument)
45     : SwFieldType( RES_MACROFLD ),
46       pDoc(pDocument)
47 {
48 }
49 
Copy() const50 SwFieldType* SwMacroFieldType::Copy() const
51 {
52     SwMacroFieldType* pType = new SwMacroFieldType(pDoc);
53     return pType;
54 }
55 
56 /*--------------------------------------------------------------------
57     Beschreibung: Das Macrofeld selbst
58  --------------------------------------------------------------------*/
59 
SwMacroField(SwMacroFieldType * pInitType,const String & rLibAndName,const String & rTxt)60 SwMacroField::SwMacroField(SwMacroFieldType* pInitType,
61                            const String& rLibAndName, const String& rTxt) :
62     SwField(pInitType), aMacro(rLibAndName), aText(rTxt), bIsScriptURL(sal_False)
63 {
64     bIsScriptURL = isScriptURL(aMacro);
65 }
66 
Expand() const67 String SwMacroField::Expand() const
68 {   // Button malen anstatt von
69     return aText ;
70 }
71 
Copy() const72 SwField* SwMacroField::Copy() const
73 {
74     return new SwMacroField((SwMacroFieldType*)GetTyp(), aMacro, aText);
75 }
76 
GetFieldName() const77 String SwMacroField::GetFieldName() const
78 {
79     String aStr(GetTyp()->GetName());
80     aStr += ' ';
81     aStr += aMacro;
82     return aStr;
83 }
84 
GetLibName() const85 String SwMacroField::GetLibName() const
86 {
87     // if it is a Scripting Framework macro return an empty string
88     if (bIsScriptURL)
89     {
90         return String();
91     }
92 
93     if (aMacro.Len())
94     {
95         sal_uInt16 nPos = aMacro.Len();
96 
97         for (sal_uInt16 i = 0; i < 3 && nPos > 0; i++)
98             while (aMacro.GetChar(--nPos) != '.' && nPos > 0) ;
99 
100         return aMacro.Copy(0, nPos );
101     }
102 
103     DBG_ASSERT(0, "Kein Macroname vorhanden");
104     return aEmptyStr;
105 }
106 
GetMacroName() const107 String SwMacroField::GetMacroName() const
108 {
109     if (aMacro.Len())
110     {
111         if (bIsScriptURL)
112         {
113             return aMacro.Copy( 0 );
114         }
115         else
116         {
117             sal_uInt16 nPos = aMacro.Len();
118 
119             for (sal_uInt16 i = 0; i < 3 && nPos > 0; i++)
120                 while (aMacro.GetChar(--nPos) != '.' && nPos > 0) ;
121 
122             return aMacro.Copy( ++nPos );
123         }
124     }
125 
126     DBG_ASSERT(0, "Kein Macroname vorhanden");
127     return aEmptyStr;
128 }
129 
GetSvxMacro() const130 SvxMacro SwMacroField::GetSvxMacro() const
131 {
132   if (bIsScriptURL)
133     {
134         return SvxMacro(aMacro, String(), EXTENDED_STYPE);
135     }
136     else
137     {
138         return SvxMacro(GetMacroName(), GetLibName(), STARBASIC);
139     }
140 }
141 
142 /*--------------------------------------------------------------------
143     Beschreibung: LibName und MacroName
144  --------------------------------------------------------------------*/
145 
SetPar1(const String & rStr)146 void SwMacroField::SetPar1(const String& rStr)
147 {
148     aMacro = rStr;
149     bIsScriptURL = isScriptURL(aMacro);
150 }
151 
GetPar1() const152 const String& SwMacroField::GetPar1() const
153 {
154     return aMacro;
155 }
156 
157 /*--------------------------------------------------------------------
158     Beschreibung: Macrotext
159  --------------------------------------------------------------------*/
160 
SetPar2(const String & rStr)161 void SwMacroField::SetPar2(const String& rStr)
162 {
163     aText = rStr;
164 }
165 
GetPar2() const166 String SwMacroField::GetPar2() const
167 {
168     return aText;
169 }
170 
171 /*-----------------05.03.98 13:38-------------------
172 
173 --------------------------------------------------*/
QueryValue(uno::Any & rAny,sal_uInt16 nWhichId) const174 sal_Bool SwMacroField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
175 {
176     switch( nWhichId )
177     {
178     case FIELD_PROP_PAR1:
179         rAny <<= OUString(GetMacroName());
180         break;
181     case FIELD_PROP_PAR2:
182         rAny <<= OUString(aText);
183         break;
184     case FIELD_PROP_PAR3:
185         rAny <<= OUString(GetLibName());
186         break;
187     case FIELD_PROP_PAR4:
188         rAny <<= bIsScriptURL ? OUString(GetMacroName()): OUString();
189         break;
190     default:
191         DBG_ERROR("illegal property");
192     }
193     return sal_True;
194 }
195 /*-----------------05.03.98 13:38-------------------
196 
197 --------------------------------------------------*/
PutValue(const uno::Any & rAny,sal_uInt16 nWhichId)198 sal_Bool SwMacroField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
199 {
200     String sTmp;
201     switch( nWhichId )
202     {
203     case FIELD_PROP_PAR1:
204         CreateMacroString( aMacro, ::GetString(rAny, sTmp), GetLibName());
205         break;
206     case FIELD_PROP_PAR2:
207         ::GetString( rAny, aText );
208         break;
209     case FIELD_PROP_PAR3:
210         CreateMacroString(aMacro, GetMacroName(), ::GetString(rAny, sTmp) );
211         break;
212     case FIELD_PROP_PAR4:
213         ::GetString(rAny, aMacro);
214         bIsScriptURL = isScriptURL(aMacro);
215         break;
216     default:
217         DBG_ERROR("illegal property");
218     }
219 
220     return sal_True;
221 }
222 
223 // create an internally used macro name from the library and macro name parts
CreateMacroString(String & rMacro,const String & rMacroName,const String & rLibraryName)224 void SwMacroField::CreateMacroString(
225     String& rMacro,
226     const String& rMacroName,
227     const String& rLibraryName )
228 {
229     // concatenate library and name; use dot only if both strings have content
230     rMacro = rLibraryName;
231     if ( rLibraryName.Len() > 0 && rMacroName.Len() > 0 )
232         rMacro += '.';
233     rMacro += rMacroName;
234 }
235 
isScriptURL(const String & str)236 sal_Bool SwMacroField::isScriptURL( const String& str )
237 {
238     uno::Reference< lang::XMultiServiceFactory > xSMgr =
239         ::comphelper::getProcessServiceFactory();
240 
241     uno::Reference< uri::XUriReferenceFactory >
242         xFactory( xSMgr->createInstance(
243             OUString::createFromAscii(
244                 "com.sun.star.uri.UriReferenceFactory" ) ), uno::UNO_QUERY );
245 
246     if ( xFactory.is() )
247     {
248         uno::Reference< uri::XVndSunStarScriptUrl >
249             xUrl( xFactory->parse( str ), uno::UNO_QUERY );
250 
251         if ( xUrl.is() )
252         {
253             return sal_True;
254         }
255     }
256     return sal_False;
257 }
258