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 #include "docsignature.hxx"
28 
29 #define SI_NOCONTROL
30 #define SI_NOSBXCONTROLS
31 
32 #include <ide_pch.hxx>
33 #include <basic/sbx.hxx>
34 #include "basicrenderable.hxx"
35 
36 #include <com/sun/star/frame/XTitle.hpp>
37 
38 #include <vcl/sound.hxx>
39 #include <basidesh.hxx>
40 #include <basidesh.hrc>
41 #include <baside2.hxx>
42 #include <basdoc.hxx>
43 #include <basobj.hxx>
44 #include <svtools/texteng.hxx>
45 #include <svtools/textview.hxx>
46 #include <svtools/xtextedt.hxx>
47 #include <tools/diagnose_ex.h>
48 #include <sfx2/sfxdefs.hxx>
49 #include <sfx2/signaturestate.hxx>
50 #include <com/sun/star/container/XNameContainer.hpp>
51 #include <com/sun/star/container/XNamed.hpp>
52 #include <com/sun/star/lang/XServiceInfo.hpp>
53 
54 using namespace ::com::sun::star;
55 using namespace ::com::sun::star::uno;
56 namespace css = ::com::sun::star;
57 
IMPL_LINK_INLINE_START(BasicIDEShell,ObjectDialogCancelHdl,ObjectCatalog *,EMPTYARG)58 IMPL_LINK_INLINE_START( BasicIDEShell, ObjectDialogCancelHdl, ObjectCatalog *, EMPTYARG )
59 {
60 	ShowObjectDialog( sal_False, sal_True );
61 	return 0;
62 }
IMPL_LINK_INLINE_END(BasicIDEShell,ObjectDialogCancelHdl,ObjectCatalog *,EMPTYARG)63 IMPL_LINK_INLINE_END( BasicIDEShell, ObjectDialogCancelHdl, ObjectCatalog *, EMPTYARG )
64 
65 /*
66 IMPL_LINK( BasicIDEShell, ObjectDialogInsertHdl, ObjectCatalog *, pObjCat )
67 {
68 	if ( !pCurWin )
69 		return 0;
70 
71 	if ( pCurWin->IsA( TYPE( ModulWindow ) ) )
72 	{
73 		ModulWindow* pEditWin = (ModulWindow*)pCurWin;
74 		pEditWin->InsertFromObjectCatalog( pObjCat );
75 	}
76 	else
77 		Sound::Beep();
78 
79 	return 0;
80 }
81 */
82 
83 Reference< view::XRenderable > BasicIDEShell::GetRenderable()
84 {
85     return Reference< view::XRenderable >( new basicide::BasicRenderable( pCurWin ) );
86 }
87 
88 #if 0
89 sal_uInt16 __EXPORT BasicIDEShell::Print( SfxProgress &rProgress, sal_Bool bIsAPI, PrintDialog *pPrintDialog )
90 {
91 	if ( pCurWin )
92 	{
93 		SfxPrinter* pPrinter = GetPrinter( sal_True );
94 		if ( pPrinter )
95 		{
96 			SfxViewShell::Print( rProgress, bIsAPI, pPrintDialog );
97 			pCurWin->PrintData( pPrinter );
98 		}
99 	}
100 	return 0;
101 }
102 #endif
103 
HasSelection(sal_Bool) const104 sal_Bool BasicIDEShell::HasSelection( sal_Bool /* bText */ ) const
105 {
106 	sal_Bool bSel = sal_False;
107 	if ( pCurWin && pCurWin->ISA( ModulWindow ) )
108 	{
109 		TextView* pEditView = ((ModulWindow*)pCurWin)->GetEditView();
110 		if ( pEditView && pEditView->HasSelection() )
111 			bSel = sal_True;
112 	}
113 	return bSel;
114 }
115 
GetSelectionText(sal_Bool bWholeWord)116 String BasicIDEShell::GetSelectionText( sal_Bool bWholeWord )
117 {
118 	String aText;
119 	if ( pCurWin && pCurWin->ISA( ModulWindow ) )
120 	{
121 		TextView* pEditView = ((ModulWindow*)pCurWin)->GetEditView();
122 		if ( pEditView )
123 		{
124 			if ( bWholeWord && !pEditView->HasSelection() )
125 			{
126 				// String aStrCurrentDelimiters = pEngine->GetWordDelimiters();
127 				// pEngine->SetWordDelimiters( " .,;\"'" );
128 				aText = pEditView->GetTextEngine()->GetWord( pEditView->GetSelection().GetEnd() );
129 				// pEngine->SetWordDelimiters( aStrCurrentDelimiters );
130 			}
131 			else
132 			{
133 				TextSelection aSel = pEditView->GetSelection();
134 				if ( !bWholeWord || ( aSel.GetStart().GetPara() == aSel.GetEnd().GetPara() ) )
135 					aText = pEditView->GetSelected();
136 			}
137 		}
138 	}
139 	return aText;
140 }
141 
GetPrinter(sal_Bool bCreate)142 SfxPrinter* __EXPORT BasicIDEShell::GetPrinter( sal_Bool bCreate )
143 {
144 	if ( pCurWin ) // && pCurWin->ISA( ModulWindow ) )
145 	{
146 		BasicDocShell* pDocShell = (BasicDocShell*)GetViewFrame()->GetObjectShell();
147 		DBG_ASSERT( pDocShell, "DocShell ?!" );
148 		return pDocShell->GetPrinter( bCreate );
149 	}
150 	return 0;
151 }
152 
SetPrinter(SfxPrinter * pNewPrinter,sal_uInt16 nDiffFlags,bool)153 sal_uInt16 __EXPORT BasicIDEShell::SetPrinter( SfxPrinter *pNewPrinter, sal_uInt16 nDiffFlags, bool )
154 {
155 	(void)nDiffFlags;
156 	BasicDocShell* pDocShell = (BasicDocShell*)GetViewFrame()->GetObjectShell();
157 	DBG_ASSERT( pDocShell, "DocShell ?!" );
158 	pDocShell->SetPrinter( pNewPrinter );
159 	return 0;
160 }
161 
SetMDITitle()162 void BasicIDEShell::SetMDITitle()
163 {
164 	String aTitle;
165 
166     if ( m_aCurLibName.Len() )
167     {
168         LibraryLocation eLocation = m_aCurDocument.getLibraryLocation( m_aCurLibName );
169         aTitle = m_aCurDocument.getTitle( eLocation );
170         aTitle += '.';
171         aTitle += m_aCurLibName;
172 	}
173     else
174     {
175         aTitle = String( IDEResId( RID_STR_ALL ) );
176     }
177 
178     ::basctl::DocumentSignature aCurSignature( m_aCurDocument );
179     if ( aCurSignature.getScriptingSignatureState() == SIGNATURESTATE_SIGNATURES_OK )
180     {
181         aTitle += String::CreateFromAscii( " " );
182         aTitle += String( IDEResId( RID_STR_SIGNED ) );
183         aTitle += String::CreateFromAscii( " " );
184     }
185 
186     SfxViewFrame* pViewFrame = GetViewFrame();
187     if ( pViewFrame )
188     {
189         SfxObjectShell* pShell = pViewFrame->GetObjectShell();
190         if ( pShell && aTitle != pShell->GetTitle( SFX_TITLE_CAPTION ) )
191         {
192             pShell->SetTitle( aTitle );
193             pShell->SetModified( sal_False );
194         }
195 
196         css::uno::Reference< css::frame::XController > xController = GetController ();
197         css::uno::Reference< css::frame::XTitle >      xTitle      (xController, css::uno::UNO_QUERY);
198         if (xTitle.is ())
199             xTitle->setTitle (aTitle);
200     }
201 }
202 
DestroyModulWindowLayout()203 void BasicIDEShell::DestroyModulWindowLayout()
204 {
205 	delete pModulLayout;
206 	pModulLayout = 0;
207 }
208 
209 
UpdateModulWindowLayout(bool bBasicStopped)210 void BasicIDEShell::UpdateModulWindowLayout( bool bBasicStopped )
211 {
212 	if ( pModulLayout )
213 	{
214 		pModulLayout->GetStackWindow().UpdateCalls();
215 		pModulLayout->GetWatchWindow().UpdateWatches( bBasicStopped );
216 	}
217 }
218 
CreateModulWindowLayout()219 void BasicIDEShell::CreateModulWindowLayout()
220 {
221 	pModulLayout = new ModulWindowLayout( &GetViewFrame()->GetWindow() );
222 }
223 
CreateBasWin(const ScriptDocument & rDocument,const String & rLibName,const String & rModName)224 ModulWindow* BasicIDEShell::CreateBasWin( const ScriptDocument& rDocument, const String& rLibName, const String& rModName )
225 {
226 	bCreatingWindow = sal_True;
227 
228 	sal_uLong nKey = 0;
229 	ModulWindow* pWin = 0;
230 
231     String aLibName( rLibName );
232     String aModName( rModName );
233 
234     if ( !aLibName.Len() )
235         aLibName = String::CreateFromAscii( "Standard" );
236 
237     uno::Reference< container::XNameContainer > xLib = rDocument.getOrCreateLibrary( E_SCRIPTS, aLibName );
238 
239 	if ( !aModName.Len() )
240         aModName = rDocument.createObjectName( E_SCRIPTS, aLibName );
241 
242 	// Vielleicht gibt es ein suspendiertes?
243 	pWin = FindBasWin( rDocument, aLibName, aModName, sal_False, sal_True );
244 
245 	if ( !pWin )
246 	{
247 		::rtl::OUString aModule;
248         bool bSuccess = false;
249         if ( rDocument.hasModule( aLibName, aModName ) )
250             bSuccess = rDocument.getModule( aLibName, aModName, aModule );
251 		else
252             bSuccess = rDocument.createModule( aLibName, aModName, sal_True, aModule );
253 
254         if ( bSuccess )
255         {
256 			pWin = FindBasWin( rDocument, aLibName, aModName, sal_False, sal_True );
257 			if( !pWin )
258 			{
259 				// new module window
260 				pWin = new ModulWindow( pModulLayout, rDocument, aLibName, aModName, aModule );
261 				nKey = InsertWindowInTable( pWin );
262 			}
263 			else // we've gotten called recursively ( via listener from createModule above ), get outta here
264 				return pWin;
265 		}
266 	}
267     else
268 	{
269 		pWin->SetStatus( pWin->GetStatus() & ~BASWIN_SUSPENDED );
270 		IDEBaseWindow* pTmp = aIDEWindowTable.First();
271 		while ( pTmp && !nKey )
272 		{
273 			if ( pTmp == pWin )
274 				nKey = aIDEWindowTable.GetCurKey();
275 			pTmp = aIDEWindowTable.Next();
276 		}
277 		DBG_ASSERT( nKey, "CreateBasWin: Kein Key- Fenster nicht gefunden!" );
278 	}
279 	if( nKey && xLib.is() && rDocument.isInVBAMode() )
280 	{
281 		// display a nice friendly name in the ObjectModule tab,
282 		// combining the objectname and module name, e.g. Sheet1 ( Financials )
283 		String sObjName;
284 		ModuleInfoHelper::getObjectName( xLib, rModName, sObjName );
285 		if( sObjName.Len() )
286 		{
287 			aModName.AppendAscii(" (").Append(sObjName).AppendAscii(")");
288 		}
289 	}
290 	pTabBar->InsertPage( (sal_uInt16)nKey, aModName );
291 	pTabBar->Sort();
292 	pWin->GrabScrollBars( &aHScrollBar, &aVScrollBar );
293 	if ( !pCurWin )
294 		SetCurWindow( pWin, sal_False, sal_False );
295 
296 	bCreatingWindow = sal_False;
297 	return pWin;
298 }
299 
FindBasWin(const ScriptDocument & rDocument,const String & rLibName,const String & rModName,sal_Bool bCreateIfNotExist,sal_Bool bFindSuspended)300 ModulWindow* BasicIDEShell::FindBasWin( const ScriptDocument& rDocument, const String& rLibName, const String& rModName, sal_Bool bCreateIfNotExist, sal_Bool bFindSuspended )
301 {
302 	ModulWindow* pModWin = 0;
303 	IDEBaseWindow* pWin = aIDEWindowTable.First();
304 	while ( pWin && !pModWin )
305 	{
306 		if ( ( !pWin->IsSuspended() || bFindSuspended ) && pWin->IsA( TYPE( ModulWindow ) ) )
307 		{
308 			if ( !rLibName.Len() )	// nur irgendeins finden...
309 				pModWin = (ModulWindow*)pWin;
310             else if ( pWin->IsDocument( rDocument ) && pWin->GetLibName() == rLibName && pWin->GetName() == rModName )
311 				pModWin = (ModulWindow*)pWin;
312 		}
313 		pWin = aIDEWindowTable.Next();
314 	}
315 	if ( !pModWin && bCreateIfNotExist )
316         pModWin = CreateBasWin( rDocument, rLibName, rModName );
317 
318 	return pModWin;
319 }
320 
Move()321 void __EXPORT BasicIDEShell::Move()
322 {
323 	if ( pCurWin && pCurWin->ISA( ModulWindow ) )
324 		((ModulWindow*)pCurWin)->FrameWindowMoved();
325 }
326 
ShowCursor(FASTBOOL bOn)327 void __EXPORT BasicIDEShell::ShowCursor( FASTBOOL bOn )
328 {
329 	if ( pCurWin && pCurWin->ISA( ModulWindow ) )
330 		((ModulWindow*)pCurWin)->ShowCursor( (sal_Bool)bOn );
331 }
332 
333 // Hack for #101048
334 sal_Int32 getBasicIDEShellCount( void );
335 
336 // Nur wenn Basicfenster oben:
ExecuteBasic(SfxRequest & rReq)337 void __EXPORT BasicIDEShell::ExecuteBasic( SfxRequest& rReq )
338 {
339 	if ( !pCurWin || !pCurWin->IsA( TYPE( ModulWindow ) ) )
340 		return;
341 
342 	pCurWin->ExecuteCommand( rReq );
343     sal_Int32 nCount = getBasicIDEShellCount();
344     if( nCount )
345 	    CheckWindows();
346 }
347 
348