xref: /trunk/main/sw/source/core/fields/macrofld.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 #include <hintids.hxx>
32 #include <doc.hxx>
33 #include <docufld.hxx>
34 #include <unofldmid.h>
35 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
36 #include <com/sun/star/uri/XUriReferenceFactory.hpp>
37 #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
38 #include <comphelper/processfactory.hxx>
39 
40 
41 using namespace ::com::sun::star;
42 using ::rtl::OUString;
43 
44 /*--------------------------------------------------------------------
45     Beschreibung: MacroFeldtypen
46  --------------------------------------------------------------------*/
47 
48 SwMacroFieldType::SwMacroFieldType(SwDoc* pDocument)
49     : SwFieldType( RES_MACROFLD ),
50       pDoc(pDocument)
51 {
52 }
53 
54 SwFieldType* SwMacroFieldType::Copy() const
55 {
56     SwMacroFieldType* pType = new SwMacroFieldType(pDoc);
57     return pType;
58 }
59 
60 /*--------------------------------------------------------------------
61     Beschreibung: Das Macrofeld selbst
62  --------------------------------------------------------------------*/
63 
64 SwMacroField::SwMacroField(SwMacroFieldType* pInitType,
65                            const String& rLibAndName, const String& rTxt) :
66     SwField(pInitType), aMacro(rLibAndName), aText(rTxt), bIsScriptURL(sal_False)
67 {
68     bIsScriptURL = isScriptURL(aMacro);
69 }
70 
71 String SwMacroField::Expand() const
72 {   // Button malen anstatt von
73     return aText ;
74 }
75 
76 SwField* SwMacroField::Copy() const
77 {
78     return new SwMacroField((SwMacroFieldType*)GetTyp(), aMacro, aText);
79 }
80 
81 String SwMacroField::GetFieldName() const
82 {
83     String aStr(GetTyp()->GetName());
84     aStr += ' ';
85     aStr += aMacro;
86     return aStr;
87 }
88 
89 String SwMacroField::GetLibName() const
90 {
91     // if it is a Scripting Framework macro return an empty string
92     if (bIsScriptURL)
93     {
94         return String();
95     }
96 
97     if (aMacro.Len())
98     {
99         sal_uInt16 nPos = aMacro.Len();
100 
101         for (sal_uInt16 i = 0; i < 3 && nPos > 0; i++)
102             while (aMacro.GetChar(--nPos) != '.' && nPos > 0) ;
103 
104         return aMacro.Copy(0, nPos );
105     }
106 
107     DBG_ASSERT(0, "Kein Macroname vorhanden");
108     return aEmptyStr;
109 }
110 
111 String SwMacroField::GetMacroName() const
112 {
113     if (aMacro.Len())
114     {
115         if (bIsScriptURL)
116         {
117             return aMacro.Copy( 0 );
118         }
119         else
120         {
121             sal_uInt16 nPos = aMacro.Len();
122 
123             for (sal_uInt16 i = 0; i < 3 && nPos > 0; i++)
124                 while (aMacro.GetChar(--nPos) != '.' && nPos > 0) ;
125 
126             return aMacro.Copy( ++nPos );
127         }
128     }
129 
130     DBG_ASSERT(0, "Kein Macroname vorhanden");
131     return aEmptyStr;
132 }
133 
134 SvxMacro SwMacroField::GetSvxMacro() const
135 {
136   if (bIsScriptURL)
137     {
138         return SvxMacro(aMacro, String(), EXTENDED_STYPE);
139     }
140     else
141     {
142         return SvxMacro(GetMacroName(), GetLibName(), STARBASIC);
143     }
144 }
145 
146 /*--------------------------------------------------------------------
147     Beschreibung: LibName und MacroName
148  --------------------------------------------------------------------*/
149 
150 void SwMacroField::SetPar1(const String& rStr)
151 {
152     aMacro = rStr;
153     bIsScriptURL = isScriptURL(aMacro);
154 }
155 
156 const String& SwMacroField::GetPar1() const
157 {
158     return aMacro;
159 }
160 
161 /*--------------------------------------------------------------------
162     Beschreibung: Macrotext
163  --------------------------------------------------------------------*/
164 
165 void SwMacroField::SetPar2(const String& rStr)
166 {
167     aText = rStr;
168 }
169 
170 String SwMacroField::GetPar2() const
171 {
172     return aText;
173 }
174 
175 /*-----------------05.03.98 13:38-------------------
176 
177 --------------------------------------------------*/
178 sal_Bool SwMacroField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
179 {
180     switch( nWhichId )
181     {
182     case FIELD_PROP_PAR1:
183         rAny <<= OUString(GetMacroName());
184         break;
185     case FIELD_PROP_PAR2:
186         rAny <<= OUString(aText);
187         break;
188     case FIELD_PROP_PAR3:
189         rAny <<= OUString(GetLibName());
190         break;
191     case FIELD_PROP_PAR4:
192         rAny <<= bIsScriptURL ? OUString(GetMacroName()): OUString();
193         break;
194     default:
195         DBG_ERROR("illegal property");
196     }
197     return sal_True;
198 }
199 /*-----------------05.03.98 13:38-------------------
200 
201 --------------------------------------------------*/
202 sal_Bool SwMacroField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
203 {
204     String sTmp;
205     switch( nWhichId )
206     {
207     case FIELD_PROP_PAR1:
208         CreateMacroString( aMacro, ::GetString(rAny, sTmp), GetLibName());
209         break;
210     case FIELD_PROP_PAR2:
211         ::GetString( rAny, aText );
212         break;
213     case FIELD_PROP_PAR3:
214         CreateMacroString(aMacro, GetMacroName(), ::GetString(rAny, sTmp) );
215         break;
216     case FIELD_PROP_PAR4:
217         ::GetString(rAny, aMacro);
218         bIsScriptURL = isScriptURL(aMacro);
219         break;
220     default:
221         DBG_ERROR("illegal property");
222     }
223 
224     return sal_True;
225 }
226 
227 // create an internally used macro name from the library and macro name parts
228 void SwMacroField::CreateMacroString(
229     String& rMacro,
230     const String& rMacroName,
231     const String& rLibraryName )
232 {
233     // concatenate library and name; use dot only if both strings have content
234     rMacro = rLibraryName;
235     if ( rLibraryName.Len() > 0 && rMacroName.Len() > 0 )
236         rMacro += '.';
237     rMacro += rMacroName;
238 }
239 
240 sal_Bool SwMacroField::isScriptURL( const String& str )
241 {
242     uno::Reference< lang::XMultiServiceFactory > xSMgr =
243         ::comphelper::getProcessServiceFactory();
244 
245     uno::Reference< uri::XUriReferenceFactory >
246         xFactory( xSMgr->createInstance(
247             OUString::createFromAscii(
248                 "com.sun.star.uri.UriReferenceFactory" ) ), uno::UNO_QUERY );
249 
250     if ( xFactory.is() )
251     {
252         uno::Reference< uri::XVndSunStarScriptUrl >
253             xUrl( xFactory->parse( str ), uno::UNO_QUERY );
254 
255         if ( xUrl.is() )
256         {
257             return sal_True;
258         }
259     }
260     return sal_False;
261 }
262