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_sfx2.hxx"
26 #include <com/sun/star/frame/XDesktop.hpp>
27 #include <com/sun/star/script/XLibraryContainer.hpp>
28 #include <comphelper/processfactory.hxx>
29 #include <com/sun/star/uno/Reference.h>
30 #include <basic/basrdll.hxx>
31 #include <tools/urlobj.hxx>
32 #include <svl/macitem.hxx>
33 #include <basic/sbxfac.hxx>
34 #include <basic/sbx.hxx>
35 #include <vcl/gradient.hxx>
36 #include <svl/rectitem.hxx>
37 #include <svl/intitem.hxx>
38 #include <svl/eitem.hxx>
39 #include <basic/sbmod.hxx>
40 #include <svl/whiter.hxx>
41 #include <basic/sbmeth.hxx>
42 #include <basic/sbstar.hxx>
43 #include <vcl/wrkwin.hxx>
44 #include <vcl/msgbox.hxx>
45 #include <basic/sbuno.hxx>
46 #include <svtools/sfxecode.hxx>
47 #include <svtools/ehdl.hxx>
48
49 #include <unotools/undoopt.hxx>
50 #include <unotools/pathoptions.hxx>
51 #include <unotools/useroptions.hxx>
52 #include <unotools/bootstrap.hxx>
53
54 #include <sfx2/appuno.hxx>
55 #include <sfx2/module.hxx>
56 #include "arrdecl.hxx"
57 #include <sfx2/app.hxx>
58 #include "sfxtypes.hxx"
59 #include "sfx2/sfxresid.hxx"
60 #include <sfx2/msg.hxx>
61 #include <sfx2/msgpool.hxx>
62 #include <sfx2/progress.hxx>
63 #include <sfx2/objsh.hxx>
64 #include <sfx2/objitem.hxx>
65 #include <sfx2/viewfrm.hxx>
66 #include <sfx2/viewsh.hxx>
67 #include <sfx2/dispatch.hxx>
68 #include "sfx2/tplpitem.hxx"
69 #include "sfx2/minfitem.hxx"
70 #include "app.hrc"
71 #include <sfx2/evntconf.hxx>
72 #include <sfx2/request.hxx>
73 #include <sfx2/dinfdlg.hxx>
74 #include "appdata.hxx"
75 #include "appbas.hxx"
76 #include "sfx2/sfxhelp.hxx"
77 #include "sfx2/basmgr.hxx"
78 #include "sorgitm.hxx"
79 #include "appbaslib.hxx"
80 #include <basic/basicmanagerrepository.hxx>
81
82 #define ITEMID_SEARCH SID_SEARCH_ITEM
83
84 #include <svl/srchitem.hxx>
85 #include <vos/socket.hxx>
86
87 #define SFX_TYPEMAP
88 #define Selection
89 #include "sfxslots.hxx"
90
91 using namespace ::com::sun::star;
92 using namespace ::com::sun::star::uno;
93 using namespace ::com::sun::star::frame;
94 using namespace ::com::sun::star::script;
95
96 using ::basic::BasicManagerRepository;
97
98 //========================================================================
99
100 //------------------------------------------------------------------------
lcl_GetVersionString(ResMgr *)101 String lcl_GetVersionString(ResMgr* /*pAppData_ImplResMgr*/)
102 {
103 ::rtl::OUString aDefault;
104 String aVersion( utl::Bootstrap::getBuildIdData( aDefault ));
105
106 if ( aVersion.Len() == 0 )
107 {
108 DBG_ERROR( "No BUILDID in bootstrap file found" );
109 }
110
111 aVersion.Erase( 0, aVersion.Search( ':' ) + 1 );
112 aVersion.Erase( aVersion.Search( ')' ) );
113 return aVersion;
114 }
115
116 //=========================================================================
SaveBasicManager() const117 sal_uInt16 SfxApplication::SaveBasicManager() const
118 {
119 return 0;
120 }
121
122 //--------------------------------------------------------------------
SaveBasicAndDialogContainer() const123 sal_uInt16 SfxApplication::SaveBasicAndDialogContainer() const
124 {
125 if ( pAppData_Impl->pBasicManager->isValid() )
126 pAppData_Impl->pBasicManager->storeAllLibraries();
127 return 0;
128 }
129
130 //--------------------------------------------------------------------
131
RegisterBasicConstants(const char *,const SfxConstant *,sal_uInt16)132 void SfxApplication::RegisterBasicConstants
133 (
134 const char*, // Prefix vor Konstanten-Namen
135 const SfxConstant*, // Array von <SfxConstant> Instanzen
136 sal_uInt16 // Anahl der Kontanten in pConsts
137 )
138
139 /* [Beschreibung]
140
141 Diese Methode meldet Konstanten beim BASIC an. Sie sollte on-demand
142 (in GetSbxObject() der Applikation) gerufen werden. Das Array mu\s
143 alphabetisch nach den Namen sortiert sein!
144
145 Durch den Prefix kann Speicher gespart und das Suchen beschleunigt
146 werden. Im StarOffice soll der Prefix "so" verwendet werden.
147
148
149 [Beispiel]
150
151 const SfxConstant __FAR_DATA aConstants[] =
152 {
153 SFX_BOOL_CONSTANT( "False", sal_False ),
154 SFX_BOOL_CONSTANT( "True", sal_True ),
155 };
156
157 ...
158 SFX_APP()->RegisterBasicConstants( 0, aConstants, 2 );
159 ...
160
161 */
162
163 {
164 // DBG_ASSERT( pAppData_Impl->pBasicMgr, "no basic available" );
165
166 // pAppData_Impl->pBasicMgr->GetLib(0)->Insert(
167 // new SfxConstants_Impl( pPrefix, pConsts, nCount ) );
168 }
169
170 //--------------------------------------------------------------------
171
MakeVariable(StarBASIC * pBas,SbxObject * pObject,const char * pName,sal_uInt32 nSID,SbxDataType eType,SbxClassType eClassType)172 SbxVariable* MakeVariable( StarBASIC *pBas, SbxObject *pObject,
173 const char *pName, sal_uInt32 nSID, SbxDataType eType, SbxClassType eClassType )
174 {
175 SbxVariable *pVar = pBas->Make( String::CreateFromAscii(pName), eClassType, eType ); //SbxCLASS_PROPERTY
176 pVar->SetUserData( nSID );
177 pVar->SetFlag( SBX_DONTSTORE );
178 pObject->StartListening( pVar->GetBroadcaster() );
179 return pVar;
180 }
181
182 //--------------------------------------------------------------------
183
GetBasicManager()184 BasicManager* SfxApplication::GetBasicManager()
185 {
186 return BasicManagerRepository::getApplicationBasicManager( true );
187 }
188
189 //--------------------------------------------------------------------
190
GetDialogContainer()191 Reference< XLibraryContainer > SfxApplication::GetDialogContainer()
192 {
193 if ( !pAppData_Impl->pBasicManager->isValid() )
194 GetBasicManager();
195 return pAppData_Impl->pBasicManager->getLibraryContainer( SfxBasicManagerHolder::DIALOGS );
196 }
197
198 //--------------------------------------------------------------------
199
GetBasicContainer()200 Reference< XLibraryContainer > SfxApplication::GetBasicContainer()
201 {
202 if ( !pAppData_Impl->pBasicManager->isValid() )
203 GetBasicManager();
204 return pAppData_Impl->pBasicManager->getLibraryContainer( SfxBasicManagerHolder::SCRIPTS );
205 }
206
207 //--------------------------------------------------------------------
208
GetBasic()209 StarBASIC* SfxApplication::GetBasic()
210 {
211 return GetBasicManager()->GetLib(0);
212 }
213
214 //-------------------------------------------------------------------------
PropExec_Impl(SfxRequest & rReq)215 void SfxApplication::PropExec_Impl( SfxRequest &rReq )
216 {
217 rReq.GetArgs();
218 sal_uInt16 nSID = rReq.GetSlot();
219 switch ( nSID )
220 {
221 case SID_CREATE_BASICOBJECT:
222 {
223 SFX_REQUEST_ARG(rReq, pItem, SfxStringItem, nSID, sal_False);
224 if ( pItem )
225 {
226 SbxObject* pObject = SbxBase::CreateObject( pItem->GetValue() );
227 pObject->AddRef();
228 //(mba) rReq.SetReturnValue( SfxObjectItem( 0, pObject ) );
229 rReq.Done();
230 }
231 break;
232 }
233
234 case SID_DELETE_BASICOBJECT:
235 {
236 SFX_REQUEST_ARG(rReq, pItem, SfxObjectItem, nSID, sal_False);
237 if ( pItem )
238 {
239 //(mba) SbxObject* pObject = pItem->GetObject();
240 //(mba) pObject->ReleaseRef();
241 }
242 break;
243 }
244
245 case SID_ATTR_UNDO_COUNT:
246 {
247 SFX_REQUEST_ARG(rReq, pCountItem, SfxUInt16Item, nSID, sal_False);
248 SvtUndoOptions().SetUndoCount( pCountItem->GetValue() );
249 break;
250 }
251
252 case SID_WIN_VISIBLE:
253 {
254 break;
255 }
256
257 case SID_STATUSBARTEXT:
258 {
259 SFX_REQUEST_ARG(rReq, pStringItem, SfxStringItem, nSID, sal_False);
260 String aText = pStringItem->GetValue();
261 if ( aText.Len() )
262 GetpApp()->ShowStatusText( aText );
263 else
264 GetpApp()->HideStatusText();
265 break;
266 }
267
268 case SID_OFFICE_PRIVATE_USE:
269 case SID_OFFICE_COMMERCIAL_USE:
270 {
271 DBG_ASSERT( sal_False, "SfxApplication::PropExec_Impl()\nSID_OFFICE_PRIVATE_USE & SID_OFFICE_COMMERCIAL_USE are obsolete!\n" );
272 break;
273 }
274
275 case SID_OFFICE_CUSTOMERNUMBER:
276 {
277 SFX_REQUEST_ARG(rReq, pStringItem, SfxStringItem, nSID, sal_False);
278
279 if ( pStringItem )
280 SvtUserOptions().SetCustomerNumber( pStringItem->GetValue() );
281 break;
282 }
283 }
284 }
285
286 //-------------------------------------------------------------------------
PropState_Impl(SfxItemSet & rSet)287 void SfxApplication::PropState_Impl( SfxItemSet &rSet )
288 {
289 // SfxViewFrame *pFrame = SfxViewFrame::Current();
290 SfxWhichIter aIter(rSet);
291 for ( sal_uInt16 nSID = aIter.FirstWhich(); nSID; nSID = aIter.NextWhich() )
292 {
293 switch ( nSID )
294 {
295 case SID_PROGNAME:
296 rSet.Put( SfxStringItem( SID_PROGNAME, GetName() ) );
297 break;
298
299 case SID_ACTIVEDOCUMENT:
300 rSet.Put( SfxObjectItem( SID_ACTIVEDOCUMENT, SfxObjectShell::Current() ) );
301 break;
302
303 case SID_APPLICATION:
304 rSet.Put( SfxObjectItem( SID_APPLICATION, this ) );
305 break;
306
307 case SID_PROGFILENAME:
308 rSet.Put( SfxStringItem( SID_PROGFILENAME, Application::GetAppFileName() ) );
309 break;
310
311 case SID_ATTR_UNDO_COUNT:
312 rSet.Put( SfxUInt16Item( SID_ATTR_UNDO_COUNT, sal::static_int_cast< sal_uInt16 >( SvtUndoOptions().GetUndoCount() ) ) );
313 break;
314
315 case SID_UPDATE_VERSION:
316 rSet.Put( SfxUInt32Item( SID_UPDATE_VERSION, SUPD ) );
317 break;
318
319 case SID_OFFICE_CUSTOMERNUMBER:
320 {
321 rSet.Put( SfxStringItem( nSID, SvtUserOptions().GetCustomerNumber() ) );
322 break;
323 }
324 }
325 }
326 }
327
328