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 62 BasicIDEDLL* BasicIDEDLL::GetDLL() 63 { 64 return pBasicIDEDLL; 65 } 66 67 IDEResId::IDEResId( sal_uInt16 nId ): 68 ResId( nId, *(*(BasicIDEModule**)GetAppData(SHL_IDE))->GetResMgr() ) 69 { 70 } 71 72 BasicIDEDLL::BasicIDEDLL() 73 { 74 pBasicIDEDLL = this; 75 pShell = 0; 76 pExtraData = 0; 77 78 GetExtraData(); // damit GlobalErrorHdl gesetzt wird. 79 } 80 81 BasicIDEDLL::~BasicIDEDLL() 82 { 83 delete pExtraData; 84 *(BasicIDEDLL**)GetAppData(SHL_IDE) = NULL; 85 } 86 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 \************************************************************************/ 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 128 BasicIDEData* BasicIDEDLL::GetExtraData() 129 { 130 if ( !pExtraData ) 131 pExtraData = new BasicIDEData; 132 return pExtraData; 133 } 134 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 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 161 SvxSearchItem& BasicIDEData::GetSearchItem() const 162 { 163 return *pSearchItem; 164 } 165 166 void BasicIDEData::SetSearchItem( const SvxSearchItem& rItem ) 167 { 168 delete pSearchItem; 169 pSearchItem = (SvxSearchItem*)rItem.Clone(); 170 } 171 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