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_basctl.hxx"
26
27
28 #include <ide_pch.hxx>
29
30
31 #include <svheader.hxx>
32 #include <sfx2/app.hxx>
33 #include <sfx2/dispatch.hxx>
34 #include <sfx2/genlink.hxx>
35
36
37 #include <svl/solar.hrc>
38 #include <iderdll.hxx>
39 #include <iderdll2.hxx>
40 #include <iderid.hxx>
41 #include <svx/svxids.hrc>
42 #include <basidesh.hxx>
43 #include <basidesh.hrc>
44 #include <basobj.hxx>
45 #include <bastypes.hxx>
46 #include <basdoc.hxx>
47 #include <basicmod.hxx>
48 #include <propbrw.hxx>
49
50
51 #define ITEMID_SEARCH 0
52 #include <svl/srchitem.hxx>
53 #include <com/sun/star/script/XLibraryContainerPassword.hpp>
54
55 using ::rtl::OUString;
56 using namespace ::com::sun::star;
57 using namespace ::com::sun::star::uno;
58
59
60 static BasicIDEDLL* pBasicIDEDLL = 0;
61
GetDLL()62 BasicIDEDLL* BasicIDEDLL::GetDLL()
63 {
64 return pBasicIDEDLL;
65 }
66
IDEResId(sal_uInt16 nId)67 IDEResId::IDEResId( sal_uInt16 nId ):
68 ResId( nId, *(*(BasicIDEModule**)GetAppData(SHL_IDE))->GetResMgr() )
69 {
70 }
71
BasicIDEDLL()72 BasicIDEDLL::BasicIDEDLL()
73 {
74 pBasicIDEDLL = this;
75 pShell = 0;
76 pExtraData = 0;
77
78 GetExtraData(); // damit GlobalErrorHdl gesetzt wird.
79 }
80
~BasicIDEDLL()81 BasicIDEDLL::~BasicIDEDLL()
82 {
83 delete pExtraData;
84 *(BasicIDEDLL**)GetAppData(SHL_IDE) = NULL;
85 }
86
Init()87 void BasicIDEDLL::Init()
88 {
89 if ( pBasicIDEDLL )
90 return;
91
92 SfxObjectFactory* pFact = &BasicDocShell::Factory();
93 (void)pFact;
94
95 ByteString aResMgrName( "basctl" );
96 ResMgr* pMgr = ResMgr::CreateResMgr(
97 aResMgrName.GetBuffer(), Application::GetSettings().GetUILocale() );
98
99 BASIC_MOD() = new BasicIDEModule( pMgr, &BasicDocShell::Factory() );
100
101 new BasicIDEDLL;
102 SfxModule* pMod = BASIC_MOD();
103
104 SfxObjectFactory& rFactory = BasicDocShell::Factory();
105 rFactory.SetDocumentServiceName( String::CreateFromAscii( "com.sun.star.script.BasicIDE" ) );
106
107 BasicDocShell::RegisterInterface( pMod );
108 BasicIDEShell::RegisterFactory( SVX_INTERFACE_BASIDE_VIEWSH );
109 BasicIDEShell::RegisterInterface( pMod );
110
111 PropBrwMgr::RegisterChildWindow();
112 }
113
114 /*************************************************************************
115 |*
116 |* Deinitialisierung
117 |*
118 \************************************************************************/
Exit()119 void BasicIDEDLL::Exit()
120 {
121 // the BasicIDEModule must be destroyed
122 BasicIDEModule** ppShlPtr = (BasicIDEModule**) GetAppData(SHL_IDE);
123 delete (*ppShlPtr);
124 (*ppShlPtr) = NULL;
125 DELETEZ( pBasicIDEDLL );
126 }
127
GetExtraData()128 BasicIDEData* BasicIDEDLL::GetExtraData()
129 {
130 if ( !pExtraData )
131 pExtraData = new BasicIDEData;
132 return pExtraData;
133 }
134
BasicIDEData()135 BasicIDEData::BasicIDEData() : aObjCatPos( INVPOSITION, INVPOSITION )
136 {
137 nBasicDialogCount = 0;
138 bChoosingMacro = sal_False;
139 bShellInCriticalSection = sal_False;
140 pSearchItem = new SvxSearchItem( SID_SEARCH_ITEM );
141
142 StarBASIC::SetGlobalBreakHdl( LINK( this, BasicIDEData, GlobalBasicBreakHdl ) );
143
144 pAccelerator = 0;
145 }
146
~BasicIDEData()147 BasicIDEData::~BasicIDEData()
148 {
149 // ErrorHdl zuruecksetzen ist zwar sauberer, aber diese Instanz wird
150 // sowieso sehr spaet, nach dem letzten Basic, zerstoert.
151 // Durch den Aufruf werden dann aber wieder AppDaten erzeugt und nicht
152 // mehr zerstoert => MLK's beim Purify
153 // StarBASIC::SetGlobalErrorHdl( Link() );
154 // StarBASIC::SetGlobalBreakHdl( Link() );
155 // StarBASIC::setGlobalStarScriptListener( XEngineListenerRef() );
156
157 delete pSearchItem;
158 //delete pAccelerator;
159 }
160
GetSearchItem() const161 SvxSearchItem& BasicIDEData::GetSearchItem() const
162 {
163 return *pSearchItem;
164 }
165
SetSearchItem(const SvxSearchItem & rItem)166 void BasicIDEData::SetSearchItem( const SvxSearchItem& rItem )
167 {
168 delete pSearchItem;
169 pSearchItem = (SvxSearchItem*)rItem.Clone();
170 }
171
IMPL_LINK(BasicIDEData,GlobalBasicBreakHdl,StarBASIC *,pBasic)172 IMPL_LINK( BasicIDEData, GlobalBasicBreakHdl, StarBASIC *, pBasic )
173 {
174 long nRet = 0;
175 BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
176 if ( pIDEShell )
177 {
178 BasicManager* pBasMgr = BasicIDE::FindBasicManager( pBasic );
179 if ( pBasMgr )
180 {
181 // Hier lande ich zweimal, wenn Step into protected Basic
182 // => schlecht, wenn Passwortabfrage 2x, ausserdem sieht man in
183 // dem PasswordDlg nicht, fuer welche Lib...
184 // => An dieser Stelle keine Passwort-Abfrage starten
185 ScriptDocument aDocument( ScriptDocument::getDocumentForBasicManager( pBasMgr ) );
186 OSL_ENSURE( aDocument.isValid(), "BasicIDEData::GlobalBasicBreakHdl: no document for the basic manager!" );
187 if ( aDocument.isValid() )
188 {
189 ::rtl::OUString aOULibName( pBasic->GetName() );
190 Reference< script::XLibraryContainer > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
191 if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) )
192 {
193 Reference< script::XLibraryContainerPassword > xPasswd( xModLibContainer, UNO_QUERY );
194 if ( xPasswd.is() && xPasswd->isLibraryPasswordProtected( aOULibName ) && !xPasswd->isLibraryPasswordVerified( aOULibName ) )
195 {
196 // Ein Step-Out muesste mich aus den geschuetzten Bereich befoerdern...
197 nRet = SbDEBUG_STEPOUT;
198 }
199 else
200 {
201 nRet = pIDEShell->CallBasicBreakHdl( pBasic );
202 }
203 }
204 }
205 }
206 }
207
208 return nRet;
209 }
210