xref: /trunk/main/basctl/source/basicide/baside2.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_basctl.hxx"
30 
31 
32 #include <ide_pch.hxx>
33 
34 
35 #include <svtools/texteng.hxx>
36 #include <svtools/textview.hxx>
37 #include <svtools/xtextedt.hxx>
38 #include <basic/sbx.hxx>
39 #include <comphelper/processfactory.hxx>
40 #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
41 #include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp>
42 #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
43 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
44 #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
45 #ifndef _COM_SUN_STAR_SCRIPT_XLIBRYARYCONTAINER2_HPP_
46 #include <com/sun/star/script/XLibraryContainer2.hpp>
47 #endif
48 #include <com/sun/star/document/MacroExecMode.hpp>
49 #include <com/sun/star/script/ModuleType.hpp>
50 #include <toolkit/helper/vclunohelper.hxx>
51 #include <sfx2/docfile.hxx>
52 #include <basic/basrdll.hxx>
53 
54 
55 #include <baside2.hrc>
56 #include <baside2.hxx>
57 #include <objdlg.hxx>
58 #include <iderdll.hxx>
59 #include <iderdll2.hxx>
60 
61 #include <basobj.hxx>
62 #include <brkdlg.hxx>
63 
64 #include <svx/srchdlg.hxx>
65 
66 #include <vcl/sound.hxx>
67 
68 //#ifndef _TXTCMP_HXX //autogen
69 //#include <svtools/txtcmp.hxx>
70 //#endif
71 
72 #include <unotools/textsearch.hxx>
73 #include <tools/diagnose_ex.h>
74 
75 using namespace ::com::sun::star;
76 using namespace ::com::sun::star::uno;
77 
78 
79 #define SPLIT_MARGIN    5
80 #define SPLIT_HEIGHT    2
81 
82 #define LMARGPRN        1700
83 #define RMARGPRN         900
84 #define TMARGPRN        2000
85 #define BMARGPRN        1000
86 #define BORDERPRN       300
87 
88 #define APPWAIT_START   100
89 
90 #define VALIDWINDOW     0x1234
91 
92 #if defined(OW) || defined(MTF)
93 #define FILTERMASK_ALL "*"
94 #elif defined(PM2)
95 #define FILTERMASK_ALL ""
96 #else
97 #define FILTERMASK_ALL "*.*"
98 #endif
99 
100 using namespace ::com::sun::star;
101 using namespace ::com::sun::star::uno;
102 using namespace ::com::sun::star::ui::dialogs;
103 using namespace utl;
104 using namespace comphelper;
105 
106 
107 DBG_NAME( ModulWindow )
108 
109 TYPEINIT1( ModulWindow , IDEBaseWindow );
110 
111 void lcl_PrintHeader( Printer* pPrinter, sal_uInt16 nPages, sal_uInt16 nCurPage, const String& rTitle, bool bOutput )
112 {
113     short nLeftMargin   = LMARGPRN;
114     Size aSz = pPrinter->GetOutputSize();
115     short nBorder = BORDERPRN;
116 
117     const Color aOldLineColor( pPrinter->GetLineColor() );
118     const Color aOldFillColor( pPrinter->GetFillColor() );
119     const Font  aOldFont( pPrinter->GetFont() );
120 
121     pPrinter->SetLineColor( Color( COL_BLACK ) );
122     pPrinter->SetFillColor();
123 
124     Font aFont( aOldFont );
125     aFont.SetWeight( WEIGHT_BOLD );
126     aFont.SetAlign( ALIGN_BOTTOM );
127     pPrinter->SetFont( aFont );
128 
129     long nFontHeight = pPrinter->GetTextHeight();
130 
131     // 1.Border => Strich, 2+3 Border = Freiraum.
132     long nYTop = TMARGPRN-3*nBorder-nFontHeight;
133 
134     long nXLeft = nLeftMargin-nBorder;
135     long nXRight = aSz.Width()-RMARGPRN+nBorder;
136 
137     if( bOutput )
138         pPrinter->DrawRect( Rectangle(
139             Point( nXLeft, nYTop ),
140             Size( nXRight-nXLeft, aSz.Height() - nYTop - BMARGPRN + nBorder ) ) );
141 
142 
143     long nY = TMARGPRN-2*nBorder;
144     Point aPos( nLeftMargin, nY );
145     if( bOutput )
146         pPrinter->DrawText( aPos, rTitle );
147     if ( nPages != 1 )
148     {
149         aFont.SetWeight( WEIGHT_NORMAL );
150         pPrinter->SetFont( aFont );
151         String aPageStr( RTL_CONSTASCII_USTRINGPARAM( " [" ) );
152         aPageStr += String( IDEResId( RID_STR_PAGE ) );
153         aPageStr += ' ';
154         aPageStr += String::CreateFromInt32( nCurPage );
155         aPageStr += ']';
156         aPos.X() += pPrinter->GetTextWidth( rTitle );
157         if( bOutput )
158             pPrinter->DrawText( aPos, aPageStr );
159     }
160 
161 
162     nY = TMARGPRN-nBorder;
163 
164     if( bOutput )
165         pPrinter->DrawLine( Point( nXLeft, nY ), Point( nXRight, nY ) );
166 
167     pPrinter->SetFont( aOldFont );
168     pPrinter->SetFillColor( aOldFillColor );
169     pPrinter->SetLineColor( aOldLineColor );
170 }
171 
172 void lcl_ConvertTabsToSpaces( String& rLine )
173 {
174     if ( rLine.Len() )
175     {
176         sal_uInt16 nPos = 0;
177         sal_uInt16 nMax = rLine.Len();
178         while ( nPos < nMax )
179         {
180             if ( rLine.GetChar( nPos ) == '\t' )
181             {
182                 // Nicht 4 Blanks, sondern an 4er TabPos:
183                 String aBlanker;
184                 aBlanker.Fill( ( 4 - ( nPos % 4 ) ), ' ' );
185                 rLine.Erase( nPos, 1 );
186                 rLine.Insert( aBlanker, nPos );
187                 nMax = rLine.Len();
188             }
189             nPos++; // Nicht optimal, falls Tab, aber auch nicht verkehrt...
190         }
191     }
192 }
193 
194 
195 ModulWindow::ModulWindow( ModulWindowLayout* pParent, const ScriptDocument& rDocument, String aLibName,
196                           String aName, ::rtl::OUString& aModule )
197         :IDEBaseWindow( pParent, rDocument, aLibName, aName )
198         ,aXEditorWindow( this )
199         ,m_aModule( aModule )
200 {
201     DBG_CTOR( ModulWindow, 0 );
202     nValid = VALIDWINDOW;
203     pLayout = pParent;
204     aXEditorWindow.Show();
205 
206     SetBackground();
207 }
208 
209 SbModuleRef ModulWindow::XModule()
210 {
211     // ModuleWindows can now be created as a result of the
212     // modules getting created via the api. This is a result of an
213     // elementInserted event from the BasicLibrary container.
214     // However the SbModule is also created from a different listener to
215     // the same event ( in basmgr ) Therefore it is possible when we look
216     // for xModule it may not yet be available, here we keep tring to access
217     // the module until such time as it exists
218 
219     if ( !xModule.Is() )
220     {
221         BasicManager* pBasMgr = GetDocument().getBasicManager();
222         if ( pBasMgr )
223         {
224             StarBASIC* pBasic = pBasMgr->GetLib( GetLibName() );
225             if ( pBasic )
226             {
227                 xBasic = pBasic;
228                 xModule = (SbModule*)pBasic->FindModule( GetName() );
229             }
230         }
231     }
232     return xModule;
233 }
234 
235 __EXPORT ModulWindow::~ModulWindow()
236 {
237     DBG_DTOR( ModulWindow, 0 );
238     nValid = 0;
239 
240     StarBASIC::Stop();
241 }
242 
243 
244 void __EXPORT ModulWindow::GetFocus()
245 {
246     if ( nValid != VALIDWINDOW  )
247         return;
248     DBG_CHKTHIS( ModulWindow, 0 );
249     aXEditorWindow.GetEdtWindow().GrabFocus();
250     // Basisklasse nicht rufen, weil Focus jetzt woanders...
251 }
252 
253 void ModulWindow::DoInit()
254 {
255     DBG_CHKTHIS( ModulWindow, 0 );
256     // Wird beim Umschalten der Fenster gerufen...
257     if ( GetVScrollBar() )
258         GetVScrollBar()->Hide();
259     GetHScrollBar()->Show();
260 //  GetEditorWindow().SetScrollBarRanges();
261     GetEditorWindow().InitScrollBars();
262 //  GetEditorWindow().GrabFocus();
263 }
264 
265 
266 void __EXPORT ModulWindow::Paint( const Rectangle& )
267 {
268 }
269 
270 void __EXPORT ModulWindow::Resize()
271 {
272     aXEditorWindow.SetPosSizePixel( Point( 0, 0 ),
273                                     Size( GetOutputSizePixel() ) );
274 }
275 
276 
277 // "Import" von baside4.cxx
278 void CreateEngineForBasic( StarBASIC* pBasic );
279 
280 void ModulWindow::CheckCompileBasic()
281 {
282     DBG_CHKTHIS( ModulWindow, 0 );
283 
284     if ( XModule().Is() )
285     {
286         // Zur Laufzeit wird niemals compiliert!
287         sal_Bool bRunning = StarBASIC::IsRunning();
288         sal_Bool bModified = ( !xModule->IsCompiled() ||
289             ( GetEditEngine() && GetEditEngine()->IsModified() ) );
290 
291         if ( !bRunning && bModified )
292         {
293             sal_Bool bDone = sal_False;
294 
295             BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
296             pIDEShell->GetViewFrame()->GetWindow().EnterWait();
297 
298             if( bModified )
299             {
300                 AssertValidEditEngine();
301                 GetEditorWindow().SetSourceInBasic( sal_False );
302             }
303 
304             sal_Bool bWasModified = GetBasic()->IsModified();
305 
306             bDone = GetBasic()->Compile( xModule );
307             if ( !bWasModified )
308                 GetBasic()->SetModified( sal_False );
309 
310             if ( bDone )
311             {
312                 GetBreakPoints().SetBreakPointsInBasic( xModule );
313             }
314 
315             pIDEShell->GetViewFrame()->GetWindow().LeaveWait();
316 
317             aStatus.bError = !bDone;
318             aStatus.bIsRunning = sal_False;
319         }
320     }
321 }
322 
323 sal_Bool ModulWindow::BasicExecute()
324 {
325     DBG_CHKTHIS( ModulWindow, 0 );
326 
327     // #116444# check security settings before macro execution
328     ScriptDocument aDocument( GetDocument() );
329     if ( aDocument.isDocument() )
330     {
331         if ( !aDocument.allowMacros() )
332         {
333             WarningBox( this, WB_OK, String( IDEResId( RID_STR_CANNOTRUNMACRO ) ) ).Execute();
334             return sal_False;
335         }
336     }
337 
338     CheckCompileBasic();
339 
340     if ( XModule().Is() && xModule->IsCompiled() && !aStatus.bError )
341     {
342         if ( GetBreakPoints().Count() )
343             aStatus.nBasicFlags = aStatus.nBasicFlags | SbDEBUG_BREAK;
344 
345         if ( !aStatus.bIsRunning )
346         {
347             DBG_ASSERT( xModule.Is(), "Kein Modul!" );
348             AddStatus( BASWIN_RUNNINGBASIC );
349             sal_uInt16 nStart, nEnd, nCurMethodStart = 0;
350             TextSelection aSel = GetEditView()->GetSelection();
351             if ( aDocument.isInVBAMode() )
352                 nCurMethodStart = ( aSel.GetStart().GetPara() + 1 );
353             SbMethod* pMethod = 0;
354             // erstes Macro, sonst blind "Main" (ExtSearch?)
355             for ( sal_uInt16 nMacro = 0; nMacro < xModule->GetMethods()->Count(); nMacro++ )
356             {
357                 SbMethod* pM = (SbMethod*)xModule->GetMethods()->Get( nMacro );
358                 DBG_ASSERT( pM, "Method?" );
359                 pM->GetLineRange( nStart, nEnd );
360                 if ( aDocument.isInVBAMode() )
361                 {
362                     if (  nCurMethodStart >= nStart && nCurMethodStart <= nEnd )
363                     {
364                         pMethod = pM;
365                         break;
366                     }
367                 }
368                 else if  ( !pMethod || ( nStart < nCurMethodStart && !pM->IsHidden() ) )
369                 {
370                     pMethod = pM;
371                     nCurMethodStart = nStart;
372                 }
373             }
374             if ( !pMethod )
375             {
376                 if ( aDocument.isInVBAMode() )
377                     return ( BasicIDE::ChooseMacro( uno::Reference< frame::XModel >(), sal_False, rtl::OUString() ).getLength() > 0 ) ? sal_True : sal_False;
378                 else
379                     pMethod = (SbMethod*)xModule->Find( String( RTL_CONSTASCII_USTRINGPARAM( "Main" ) ), SbxCLASS_METHOD );
380             }
381             if ( pMethod )
382             {
383                 pMethod->SetDebugFlags( aStatus.nBasicFlags );
384                 BasicDLL::SetDebugMode( sal_True );
385                 BasicIDE::RunMethod( pMethod );
386                 BasicDLL::SetDebugMode( sal_False );
387                 // Falls waehrend Interactive=sal_False abgebrochen
388                 BasicDLL::EnableBreak( sal_True );
389             }
390             ClearStatus( BASWIN_RUNNINGBASIC );
391         }
392         else
393             aStatus.bIsRunning = sal_False; // Abbruch von Reschedule()
394     }
395 
396     sal_Bool bDone = !aStatus.bError;
397 
398     return bDone;
399 }
400 
401 sal_Bool ModulWindow::CompileBasic()
402 {
403     DBG_CHKTHIS( ModulWindow, 0 );
404     CheckCompileBasic();
405 
406     sal_Bool bIsCompiled = sal_False;
407     if ( XModule().Is() )
408         bIsCompiled = xModule->IsCompiled();
409 
410     return bIsCompiled;
411 }
412 
413 sal_Bool ModulWindow::BasicRun()
414 {
415     DBG_CHKTHIS( ModulWindow, 0 );
416 
417     aStatus.nBasicFlags = 0;
418     sal_Bool bDone = BasicExecute();
419     return bDone;
420 }
421 
422 sal_Bool ModulWindow::BasicStepOver()
423 {
424     DBG_CHKTHIS( ModulWindow, 0 );
425     aStatus.nBasicFlags = SbDEBUG_STEPINTO | SbDEBUG_STEPOVER;
426     sal_Bool bDone = BasicExecute();
427     return bDone;
428 }
429 
430 
431 sal_Bool ModulWindow::BasicStepInto()
432 {
433     DBG_CHKTHIS( ModulWindow, 0 );
434 
435     aStatus.nBasicFlags = SbDEBUG_STEPINTO;
436     sal_Bool bDone = BasicExecute();
437     return bDone;
438 }
439 
440 sal_Bool ModulWindow::BasicStepOut()
441 {
442     DBG_CHKTHIS( ModulWindow, 0 );
443 
444     aStatus.nBasicFlags = SbDEBUG_STEPOUT;
445     sal_Bool bDone = BasicExecute();
446     return bDone;
447 }
448 
449 
450 
451 void ModulWindow::BasicStop()
452 {
453     DBG_CHKTHIS( ModulWindow, 0 );
454 
455     GetBasic()->Stop();
456     aStatus.bIsRunning = sal_False;
457 }
458 
459 sal_Bool ModulWindow::LoadBasic()
460 {
461     DBG_CHKTHIS( ModulWindow, 0 );
462     sal_Bool bDone = sal_False;
463 
464     Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() );
465     Reference < XFilePicker > xFP;
466     if( xMSF.is() )
467     {
468         Sequence <Any> aServiceType(1);
469         aServiceType[0] <<= TemplateDescription::FILEOPEN_SIMPLE;
470         xFP = Reference< XFilePicker >( xMSF->createInstanceWithArguments(
471                     ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FilePicker" ) ), aServiceType ), UNO_QUERY );
472     }
473 
474     if ( aCurPath.Len() )
475         xFP->setDisplayDirectory ( aCurPath );
476 
477     //xFP->setTitle( String( IDEResId( RID_STR_OPEN ) ) );
478 
479     Reference< XFilterManager > xFltMgr(xFP, UNO_QUERY);
480     xFltMgr->appendFilter( String( RTL_CONSTASCII_USTRINGPARAM( "BASIC" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.bas" ) ) );
481     xFltMgr->appendFilter( String( IDEResId( RID_STR_FILTER_ALLFILES ) ), String( RTL_CONSTASCII_USTRINGPARAM( FILTERMASK_ALL ) ) );
482     xFltMgr->setCurrentFilter( String( RTL_CONSTASCII_USTRINGPARAM( "BASIC" ) ) );
483 
484     if( xFP->execute() == RET_OK )
485     {
486         Sequence< ::rtl::OUString > aPaths = xFP->getFiles();
487         aCurPath = aPaths[0];
488         SfxMedium aMedium( aCurPath, STREAM_READ | STREAM_SHARE_DENYWRITE | STREAM_NOCREATE, sal_True );
489         SvStream* pStream = aMedium.GetInStream();
490         if ( pStream )
491         {
492             AssertValidEditEngine();
493             sal_uLong nLines = CalcLineCount( *pStream );
494             // nLines*4: ReadText/Formatting/Highlighting/Formatting
495             GetEditorWindow().CreateProgress( String( IDEResId( RID_STR_GENERATESOURCE ) ), nLines*4 );
496             GetEditEngine()->SetUpdateMode( sal_False );
497             GetEditView()->Read( *pStream );
498             GetEditEngine()->SetUpdateMode( sal_True );
499             GetEditorWindow().Update(); // Es wurde bei UpdateMode = sal_True nur Invalidiert
500             GetEditorWindow().ForceSyntaxTimeout();
501             GetEditorWindow().DestroyProgress();
502             sal_uLong nError = aMedium.GetError();
503             if ( nError )
504                 ErrorHandler::HandleError( nError );
505             else
506                 bDone = sal_True;
507         }
508         else
509             ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_COULDNTREAD ) ) ).Execute();
510     }
511     return bDone;
512 }
513 
514 
515 sal_Bool ModulWindow::SaveBasicSource()
516 {
517     DBG_CHKTHIS( ModulWindow, 0 );
518     sal_Bool bDone = sal_False;
519 
520     Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() );
521     Reference < XFilePicker > xFP;
522     if( xMSF.is() )
523     {
524         Sequence <Any> aServiceType(1);
525         aServiceType[0] <<= TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD;
526         xFP = Reference< XFilePicker >( xMSF->createInstanceWithArguments(
527                     ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FilePicker" ) ), aServiceType ), UNO_QUERY );
528     }
529 
530     Reference< XFilePickerControlAccess > xFPControl(xFP, UNO_QUERY);
531     xFPControl->enableControl(ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, sal_False);
532     Any aValue;
533     aValue <<= (sal_Bool) sal_True;
534     xFPControl->setValue(ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, aValue);
535 
536     if ( aCurPath.Len() )
537         xFP->setDisplayDirectory ( aCurPath );
538 
539     //xFP->setTitle( String( IDEResId( RID_STR_SAVE ) ) );
540 
541     Reference< XFilterManager > xFltMgr(xFP, UNO_QUERY);
542     xFltMgr->appendFilter( String( RTL_CONSTASCII_USTRINGPARAM( "BASIC" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.bas" ) ) );
543     xFltMgr->appendFilter( String( IDEResId( RID_STR_FILTER_ALLFILES ) ), String( RTL_CONSTASCII_USTRINGPARAM( FILTERMASK_ALL ) ) );
544     xFltMgr->setCurrentFilter( String( RTL_CONSTASCII_USTRINGPARAM( "BASIC" ) ) );
545 
546     if( xFP->execute() == RET_OK )
547     {
548         Sequence< ::rtl::OUString > aPaths = xFP->getFiles();
549         aCurPath = aPaths[0];
550         SfxMedium aMedium( aCurPath, STREAM_WRITE | STREAM_SHARE_DENYWRITE | STREAM_TRUNC, sal_True, sal_False );
551         SvStream* pStream = aMedium.GetOutStream();
552         if ( pStream )
553         {
554             EnterWait();
555             AssertValidEditEngine();
556             GetEditEngine()->Write( *pStream );
557             aMedium.Commit();
558             LeaveWait();
559             sal_uLong nError = aMedium.GetError();
560             if ( nError )
561                 ErrorHandler::HandleError( nError );
562             else
563                 bDone = sal_True;
564         }
565         else
566             ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_COULDNTWRITE) ) ).Execute();
567     }
568 
569     return bDone;
570 }
571 
572 sal_Bool implImportDialog( Window* pWin, const String& rCurPath, const ScriptDocument& rDocument, const String& aLibName );
573 
574 sal_Bool ModulWindow::ImportDialog()
575 {
576     const ScriptDocument& rDocument = GetDocument();
577     String aLibName = GetLibName();
578     sal_Bool bRet = implImportDialog( this, aCurPath, rDocument, aLibName );
579     return bRet;
580 }
581 
582 sal_Bool ModulWindow::ToggleBreakPoint( sal_uLong nLine )
583 {
584     DBG_ASSERT( XModule().Is(), "Kein Modul!" );
585 
586     sal_Bool bNewBreakPoint = sal_False;
587 
588     if ( XModule().Is() )
589     {
590         CheckCompileBasic();
591         if ( aStatus.bError )
592         {
593             Sound::Beep();
594             return sal_False;
595         }
596 
597         BreakPoint* pBrk = GetBreakPoints().FindBreakPoint( nLine );
598         if ( pBrk ) // entfernen
599         {
600             xModule->ClearBP( (sal_uInt16)nLine );
601             delete GetBreakPoints().Remove( pBrk );
602         }
603         else // einen erzeugen
604         {
605             if ( xModule->SetBP( (sal_uInt16)nLine) )
606             {
607                 GetBreakPoints().InsertSorted( new BreakPoint( nLine ) );
608                 bNewBreakPoint = sal_True;
609                 if ( StarBASIC::IsRunning() )
610                 {
611                     for ( sal_uInt16 nMethod = 0; nMethod < xModule->GetMethods()->Count(); nMethod++ )
612                     {
613                         SbMethod* pMethod = (SbMethod*)xModule->GetMethods()->Get( nMethod );
614                         DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" );
615                         pMethod->SetDebugFlags( pMethod->GetDebugFlags() | SbDEBUG_BREAK );
616                     }
617                 }
618             }
619 
620             if ( !bNewBreakPoint )
621                 Sound::Beep();
622         }
623     }
624 
625     return bNewBreakPoint;
626 }
627 
628 void ModulWindow::UpdateBreakPoint( const BreakPoint& rBrk )
629 {
630     DBG_ASSERT( XModule().Is(), "Kein Modul!" );
631 
632     if ( XModule().Is() )
633     {
634         CheckCompileBasic();
635 
636         if ( rBrk.bEnabled )
637             xModule->SetBP( (sal_uInt16)rBrk.nLine );
638         else
639             xModule->ClearBP( (sal_uInt16)rBrk.nLine );
640     }
641 }
642 
643 
644 sal_Bool ModulWindow::BasicToggleBreakPoint()
645 {
646     DBG_CHKTHIS( ModulWindow, 0 );
647     AssertValidEditEngine();
648 
649     TextSelection aSel = GetEditView()->GetSelection();
650     aSel.GetStart().GetPara()++;    // Basic-Zeilen beginnen bei 1!
651     aSel.GetEnd().GetPara()++;
652 
653     sal_Bool bNewBreakPoint = sal_False;
654 
655     for ( sal_uLong nLine = aSel.GetStart().GetPara(); nLine <= aSel.GetEnd().GetPara(); nLine++ )
656     {
657         if ( ToggleBreakPoint( nLine ) )
658             bNewBreakPoint = sal_True;
659     }
660 
661     aXEditorWindow.GetBrkWindow().Invalidate();
662     return bNewBreakPoint;
663 }
664 
665 
666 void ModulWindow::BasicToggleBreakPointEnabled()
667 {
668     DBG_CHKTHIS( ModulWindow, 0 );
669     AssertValidEditEngine();
670 
671     ExtTextView* pView = GetEditView();
672     if ( pView )
673     {
674         TextSelection aSel = pView->GetSelection();
675         BreakPointList& rList = GetBreakPoints();
676 
677         for ( sal_uLong nLine = ++aSel.GetStart().GetPara(), nEnd = ++aSel.GetEnd().GetPara(); nLine <= nEnd; ++nLine )
678         {
679             BreakPoint* pBrk = rList.FindBreakPoint( nLine );
680             if ( pBrk )
681             {
682                 pBrk->bEnabled = pBrk->bEnabled ? sal_False : sal_True;
683                 UpdateBreakPoint( *pBrk );
684             }
685         }
686 
687         GetBreakPointWindow().Invalidate();
688     }
689 }
690 
691 
692 void ModulWindow::ManageBreakPoints()
693 {
694     BreakPointWindow& rBrkWin = GetBreakPointWindow();
695     BreakPointDialog aBrkDlg( &rBrkWin, GetBreakPoints() );
696     aBrkDlg.Execute();
697     rBrkWin.Invalidate();
698 }
699 
700 
701 IMPL_LINK( ModulWindow, BasicErrorHdl, StarBASIC *, pBasic )
702 {
703     DBG_CHKTHIS( ModulWindow, 0 );
704     GoOnTop();
705 
706     // ReturnWert: BOOL
707     //  FALSE:  Abbrechen
708     //  TRUE:   Weiter....
709     String aErrorText( pBasic->GetErrorText() );
710     sal_uInt16 nErrorLine = pBasic->GetLine() - 1;
711     sal_uInt16 nErrCol1 = pBasic->GetCol1();
712     sal_uInt16 nErrCol2 = pBasic->GetCol2();
713     if ( nErrCol2 != 0xFFFF )
714         nErrCol2++;
715 
716     AssertValidEditEngine();
717     GetEditView()->SetSelection( TextSelection( TextPaM( nErrorLine, nErrCol1 ), TextPaM( nErrorLine, nErrCol2 ) ) );
718 
719     String aErrorTextPrefix;
720     if( pBasic->IsCompilerError() )
721     {
722         aErrorTextPrefix = String( IDEResId( RID_STR_COMPILEERROR ) );
723     }
724     else
725     {
726         aErrorTextPrefix = String( IDEResId( RID_STR_RUNTIMEERROR ) );
727         aErrorTextPrefix += StarBASIC::GetVBErrorCode( pBasic->GetErrorCode() );
728         aErrorTextPrefix += ' ';
729         pLayout->GetStackWindow().UpdateCalls();
730     }
731     // Wenn anderes Basic, dan sollte die IDE versuchen, da richtige
732     // Modul anzuzeigen...
733     sal_Bool bMarkError = ( pBasic == GetBasic() ) ? sal_True : sal_False;
734     if ( bMarkError )
735         aXEditorWindow.GetBrkWindow().SetMarkerPos( nErrorLine, sal_True );
736 //  ErrorBox( this, WB_OK | WB_DEF_OK, String( aErrorTextPrefix + aErrorText ) ).Execute();
737 //  ErrorHandler::HandleError( pBasic->GetErrorCode() );
738 
739     // #i47002#
740     Reference< awt::XWindow > xWindow = VCLUnoHelper::GetInterface( this );
741 
742     ErrorHandler::HandleError( StarBASIC::GetErrorCode() );
743 
744     // #i47002#
745     Window* pWindow = VCLUnoHelper::GetWindow( xWindow );
746     if ( !pWindow )
747         return sal_False;
748 
749     if ( bMarkError )
750         aXEditorWindow.GetBrkWindow().SetMarkerPos( MARKER_NOMARKER );
751     return sal_False;
752 }
753 
754 long __EXPORT ModulWindow::BasicBreakHdl( StarBASIC* pBasic )
755 {
756     DBG_CHKTHIS( ModulWindow, 0 );
757     // Ein GoOnTop aktiviert da Fenster, das veraendert aber den Context fuer
758     // das Programm!
759 //  GoOnTop();
760 
761     // #i69280 Required in Window despite normal usage in next command!
762     (void)pBasic;
763 
764     // ReturnWert: sal_uInt16 => siehe SB-Debug-Flags
765     sal_uInt16 nErrorLine = pBasic->GetLine();
766 
767     // Gibt es hier einen BreakPoint?
768     BreakPoint* pBrk = GetBreakPoints().FindBreakPoint( nErrorLine );
769     if ( pBrk )
770     {
771         pBrk->nHitCount++;
772         if ( pBrk->nHitCount < pBrk->nStopAfter && GetBasic()->IsBreak() )
773             return aStatus.nBasicFlags; // weiterlaufen...
774     }
775 
776     nErrorLine--;   // EditEngine begint bei 0, Basic bei 1
777     // Alleine schon damit gescrollt wird...
778     AssertValidEditEngine();
779     GetEditView()->SetSelection( TextSelection( TextPaM( nErrorLine, 0 ), TextPaM( nErrorLine, 0 ) ) );
780     aXEditorWindow.GetBrkWindow().SetMarkerPos( nErrorLine );
781 
782     pLayout->GetWatchWindow().UpdateWatches();
783     pLayout->GetStackWindow().UpdateCalls();
784 
785     aStatus.bIsInReschedule = sal_True;
786     aStatus.bIsRunning = sal_True;
787 
788     AddStatus( BASWIN_INRESCHEDULE );
789 
790     BasicIDE::InvalidateDebuggerSlots();
791 
792     while( aStatus.bIsRunning )
793         Application::Yield();
794 
795     aStatus.bIsInReschedule = sal_False;
796     aXEditorWindow.GetBrkWindow().SetMarkerPos( MARKER_NOMARKER );
797 
798     ClearStatus( BASWIN_INRESCHEDULE );
799 
800     return aStatus.nBasicFlags;
801 }
802 
803 void ModulWindow::BasicAddWatch()
804 {
805     DBG_CHKTHIS( ModulWindow, 0 );
806     String aWatchStr;
807     sal_Bool bInserted = sal_False;
808     AssertValidEditEngine();
809     sal_Bool bAdd = sal_True;
810     if ( !GetEditView()->HasSelection() )
811     {
812 //      bAdd = GetEditView()->SelectCurrentWord();
813         TextPaM aWordStart;
814         String aWord = GetEditEngine()->GetWord( GetEditView()->GetSelection().GetEnd(), &aWordStart );
815         if ( aWord.Len() )
816         {
817             TextSelection aSel( aWordStart );
818             sal_uInt16& rIndex = aSel.GetEnd().GetIndex();
819             rIndex = rIndex + aWord.Len();
820             // aSel.GetEnd().GetIndex() += sal::static_int_cast<int>( aWord.Len() );
821             GetEditView()->SetSelection( aSel );
822             bAdd = sal_True;
823         }
824     }
825     if ( bAdd )
826     {
827         TextSelection aSel = GetEditView()->GetSelection();
828         if ( aSel.GetStart().GetPara() == aSel.GetEnd().GetPara() )
829         {
830             aWatchStr = GetEditView()->GetSelected();
831             pLayout->GetWatchWindow().AddWatch( aWatchStr );
832             pLayout->GetWatchWindow().UpdateWatches();
833             bInserted = sal_True;
834         }
835     }
836 
837     if ( !bInserted )
838         Sound::Beep();
839 }
840 
841 
842 
843 void ModulWindow::BasicRemoveWatch()
844 {
845     DBG_CHKTHIS( ModulWindow, 0 );
846     sal_Bool bRemoved = pLayout->GetWatchWindow().RemoveSelectedWatch();
847 
848     if ( !bRemoved )
849         Sound::Beep();
850 }
851 
852 
853 void ModulWindow::EditMacro( const String& rMacroName )
854 {
855     DBG_CHKTHIS( ModulWindow, 0 );
856     DBG_ASSERT( XModule().Is(), "Kein Modul!" );
857 
858     if ( XModule().Is() )
859     {
860         CheckCompileBasic();
861 
862         if ( !aStatus.bError )
863         {
864             sal_uInt16 nStart, nEnd;
865             SbMethod* pMethod = (SbMethod*)xModule->Find( rMacroName, SbxCLASS_METHOD );
866             if ( pMethod )
867             {
868                 pMethod->GetLineRange( nStart, nEnd );
869                 if ( nStart )
870                 {
871                     // Basic beginnt bei 1
872                     nStart--;
873                     nEnd--;
874                 }
875                 TextSelection aSel( TextPaM( nStart, 0 ), TextPaM( nStart, 0 ) );
876                 AssertValidEditEngine();
877                 TextView * pView = GetEditView();
878                 // ggf. hinscrollen, so dass erste Zeile oben...
879                 long nVisHeight = GetOutputSizePixel().Height();
880                 if ( (long)pView->GetTextEngine()->GetTextHeight() > nVisHeight )
881                 {
882                     long nMaxY = pView->GetTextEngine()->GetTextHeight() - nVisHeight;
883                     long nOldStartY = pView->GetStartDocPos().Y();
884                     long nNewStartY = nStart * pView->GetTextEngine()->GetCharHeight();
885                     nNewStartY = Min( nNewStartY, nMaxY );
886                     pView->Scroll( 0, -(nNewStartY-nOldStartY) );
887                     pView->ShowCursor( sal_False, sal_True );
888                     GetEditVScrollBar().SetThumbPos( pView->GetStartDocPos().Y() );
889                 }
890                 pView->SetSelection( aSel );
891                 pView->ShowCursor();
892                 pView->GetWindow()->GrabFocus();
893             }
894         }
895     }
896 }
897 
898 
899 void __EXPORT ModulWindow::StoreData()
900 {
901     DBG_CHKTHIS( ModulWindow, 0 );
902     // StoreData wird gerufen, wenn der BasicManager zerstoert oder
903     // dieses Fenster beendet wird.
904     // => Keine Unterbrechungen erwuenscht!
905     // Und bei SAVE, wenn AppBasic...
906     GetEditorWindow().SetSourceInBasic( sal_True );
907     // Nicht das Modify loeschen, sonst wird das Basic nicht gespeichert
908     // Es wird beim Speichern sowieso geloescht.
909 //  xModule->SetModified( sal_False );
910 }
911 
912 sal_Bool __EXPORT ModulWindow::CanClose()
913 {
914     DBG_CHKTHIS( ModulWindow, 0 );
915     return sal_True;
916 }
917 
918 
919 sal_Bool __EXPORT ModulWindow::AllowUndo()
920 {
921     return GetEditorWindow().CanModify();
922 }
923 
924 
925 void __EXPORT ModulWindow::UpdateData()
926 {
927     DBG_CHKTHIS( ModulWindow, 0 );
928     DBG_ASSERT( XModule().Is(), "Kein Modul!" );
929     // UpdateData wird gerufen, wenn sich der Source von aussen
930     // geaendert hat.
931     // => Keine Unterbrechungen erwuenscht!
932 
933     if ( XModule().Is() )
934     {
935         SetModule( xModule->GetSource32() );
936 
937         if ( GetEditView() )
938         {
939             TextSelection aSel = GetEditView()->GetSelection();
940             setTextEngineText( GetEditEngine(), xModule->GetSource32() );
941             GetEditView()->SetSelection( aSel );
942             GetEditEngine()->SetModified( sal_False );
943             BasicIDE::MarkDocumentModified( GetDocument() );
944         }
945     }
946 }
947 
948 sal_Int32 ModulWindow::countPages( Printer* pPrinter )
949 {
950     return FormatAndPrint( pPrinter, -1 );
951 }
952 
953 void ModulWindow::printPage( sal_Int32 nPage, Printer* pPrinter )
954 {
955     FormatAndPrint( pPrinter, nPage );
956 }
957 
958 /* implementation note: this is totally inefficient for the XRenderable interface
959    usage since the whole "document" will be format for every page. Should this ever
960    become a problem we should
961    - format only once for every new printer
962    - keep an index list for each page which is the starting paragraph
963 */
964 sal_Int32 ModulWindow::FormatAndPrint( Printer* pPrinter, sal_Int32 nPrintPage )
965 {
966     DBG_CHKTHIS( ModulWindow, 0 );
967 
968     AssertValidEditEngine();
969 
970     MapMode eOldMapMode( pPrinter->GetMapMode() );
971     Font aOldFont( pPrinter->GetFont() );
972 
973 //  Font aFont( GetEditEngine()->CreateFontFromItemSet( GetEditEngine()->GetEmptyItemSet() ) );
974     Font aFont( GetEditEngine()->GetFont() );
975     aFont.SetAlign( ALIGN_BOTTOM );
976     aFont.SetTransparent( sal_True );
977     aFont.SetSize( Size( 0, 360 ) );
978     pPrinter->SetFont( aFont );
979     pPrinter->SetMapMode( MAP_100TH_MM );
980 
981     String aTitle( CreateQualifiedName() );
982 
983     sal_uInt16 nLineHeight = (sal_uInt16) pPrinter->GetTextHeight(); // etwas mehr.
984     sal_uInt16 nParaSpace = 10;
985 
986     Size aPaperSz = pPrinter->GetOutputSize();
987     aPaperSz.Width() -= (LMARGPRN+RMARGPRN);
988     aPaperSz.Height() -= (TMARGPRN+BMARGPRN);
989 
990     // nLinepPage stimmt nicht, wenn Zeilen umgebrochen werden muessen...
991     sal_uInt16 nLinespPage = (sal_uInt16) (aPaperSz.Height()/nLineHeight);
992     sal_uInt16 nCharspLine = (sal_uInt16) (aPaperSz.Width() / pPrinter->GetTextWidth( 'X' ) );
993     sal_uLong nParas = GetEditEngine()->GetParagraphCount();
994 
995     sal_uInt16 nPages = (sal_uInt16) (nParas/nLinespPage+1 );
996     sal_uInt16 nCurPage = 1;
997 
998     // Header drucken...
999     lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle, nPrintPage == 0 );
1000     Point aPos( LMARGPRN, TMARGPRN );
1001     for ( sal_uLong nPara = 0; nPara < nParas; nPara++ )
1002     {
1003         String aLine( GetEditEngine()->GetText( nPara ) );
1004         lcl_ConvertTabsToSpaces( aLine );
1005         sal_uInt16 nLines = aLine.Len()/nCharspLine+1;
1006         for ( sal_uInt16 nLine = 0; nLine < nLines; nLine++ )
1007         {
1008             String aTmpLine( aLine, nLine*nCharspLine, nCharspLine );
1009             aPos.Y() += nLineHeight;
1010             if ( aPos.Y() > ( aPaperSz.Height()+TMARGPRN ) )
1011             {
1012                 nCurPage++;
1013                 lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle, nCurPage-1 == nPrintPage );
1014                 aPos = Point( LMARGPRN, TMARGPRN+nLineHeight );
1015             }
1016             if( nCurPage-1 == nPrintPage )
1017                 pPrinter->DrawText( aPos, aTmpLine );
1018         }
1019         aPos.Y() += nParaSpace;
1020     }
1021 
1022     pPrinter->SetFont( aOldFont );
1023     pPrinter->SetMapMode( eOldMapMode );
1024 
1025     return sal_Int32(nCurPage);
1026 }
1027 
1028 
1029 void __EXPORT ModulWindow::ExecuteCommand( SfxRequest& rReq )
1030 {
1031     DBG_CHKTHIS( ModulWindow, 0 );
1032     AssertValidEditEngine();
1033     sal_uInt16 nSlot = rReq.GetSlot();
1034     switch ( nSlot )
1035     {
1036         case SID_BASICRUN:
1037         {
1038             BasicRun();
1039         }
1040         break;
1041         case SID_BASICCOMPILE:
1042         {
1043             CompileBasic();
1044         }
1045         break;
1046         case SID_BASICSTEPOVER:
1047         {
1048             BasicStepOver();
1049         }
1050         break;
1051         case SID_BASICSTEPINTO:
1052         {
1053             BasicStepInto();
1054         }
1055         break;
1056         case SID_BASICSTEPOUT:
1057         {
1058             BasicStepOut();
1059         }
1060         break;
1061         case SID_BASICLOAD:
1062         {
1063             LoadBasic();
1064         }
1065         break;
1066         case SID_BASICSAVEAS:
1067         {
1068             SaveBasicSource();
1069         }
1070         break;
1071         case SID_IMPORT_DIALOG:
1072         {
1073             ImportDialog();
1074         }
1075         break;
1076         case SID_BASICIDE_MATCHGROUP:
1077         {
1078             if ( !GetEditView()->MatchGroup() )
1079                 Sound::Beep();
1080         }
1081         break;
1082         case SID_BASICIDE_TOGGLEBRKPNT:
1083         {
1084             BasicToggleBreakPoint();
1085         }
1086         break;
1087         case SID_BASICIDE_MANAGEBRKPNTS:
1088         {
1089             ManageBreakPoints();
1090         }
1091         break;
1092         case SID_BASICIDE_TOGGLEBRKPNTENABLED:
1093         {
1094             BasicToggleBreakPointEnabled();
1095         }
1096         break;
1097         case SID_BASICIDE_ADDWATCH:
1098         {
1099             BasicAddWatch();
1100         }
1101         break;
1102         case SID_BASICIDE_REMOVEWATCH:
1103         {
1104             BasicRemoveWatch();
1105         }
1106         break;
1107         case SID_CUT:
1108         {
1109             if ( !IsReadOnly() )
1110             {
1111                 GetEditView()->Cut();
1112                 SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
1113                 if ( pBindings )
1114                     pBindings->Invalidate( SID_DOC_MODIFIED );
1115             }
1116         }
1117         break;
1118         case SID_COPY:
1119         {
1120             GetEditView()->Copy();
1121         }
1122         break;
1123         case SID_PASTE:
1124         {
1125             if ( !IsReadOnly() )
1126             {
1127                 GetEditView()->Paste();
1128                 SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
1129                 if ( pBindings )
1130                     pBindings->Invalidate( SID_DOC_MODIFIED );
1131             }
1132         }
1133         break;
1134         case SID_BASICIDE_BRKPNTSCHANGED:
1135         {
1136             GetBreakPointWindow().Invalidate();
1137         }
1138         break;
1139     }
1140 }
1141 
1142 
1143 
1144 void __EXPORT ModulWindow::GetState( SfxItemSet &rSet )
1145 {
1146     DBG_CHKTHIS( ModulWindow, 0 );
1147     SfxWhichIter aIter(rSet);
1148     for ( sal_uInt16 nWh = aIter.FirstWhich(); 0 != nWh; nWh = aIter.NextWhich() )
1149     {
1150         switch ( nWh )
1151         {
1152             // allgemeine Items:
1153             case SID_CUT:
1154             {
1155                 if ( !GetEditView() || !GetEditView()->HasSelection() )
1156                     rSet.DisableItem( nWh );
1157 
1158                 if ( IsReadOnly() )
1159                     rSet.DisableItem( nWh );
1160             }
1161             break;
1162             case SID_COPY:
1163             {
1164                 if ( !GetEditView() || !GetEditView()->HasSelection() )
1165                     rSet.DisableItem( nWh );
1166             }
1167             break;
1168             case SID_PASTE:
1169             {
1170                 if ( !IsPasteAllowed() )
1171                     rSet.DisableItem( nWh );
1172 
1173                 if ( IsReadOnly() )
1174                     rSet.DisableItem( nWh );
1175             }
1176             break;
1177             case SID_BASICIDE_STAT_POS:
1178             {
1179                 TextView* pView = GetEditView();
1180                 if ( pView )
1181                 {
1182                     TextSelection aSel = pView->GetSelection();
1183                     String aPos( IDEResId( RID_STR_LINE ) );
1184                     aPos += ' ';
1185                     aPos += String::CreateFromInt32( aSel.GetEnd().GetPara()+1 );
1186                     aPos += String( RTL_CONSTASCII_USTRINGPARAM( ", " ) );
1187                     aPos += String( IDEResId( RID_STR_COLUMN ) );
1188                     aPos += ' ';
1189                     aPos += String::CreateFromInt32( aSel.GetEnd().GetIndex()+1 );
1190                     SfxStringItem aItem( SID_BASICIDE_STAT_POS, aPos );
1191                     rSet.Put( aItem );
1192                 }
1193             }
1194             break;
1195             case SID_ATTR_INSERT:
1196             {
1197                 TextView* pView = GetEditView();
1198                 if ( pView )
1199                 {
1200                     SfxBoolItem aItem( SID_ATTR_INSERT, pView->IsInsertMode() );
1201                     rSet.Put( aItem );
1202                 }
1203             }
1204             break;
1205         }
1206     }
1207 }
1208 
1209 
1210 void __EXPORT ModulWindow::DoScroll( ScrollBar* pCurScrollBar )
1211 {
1212     DBG_CHKTHIS( ModulWindow, 0 );
1213     if ( ( pCurScrollBar == GetHScrollBar() ) && GetEditView() )
1214     {
1215         // Nicht mit dem Wert Scrollen, sondern lieber die Thumb-Pos fuer die
1216         // VisArea verwenden:
1217         long nDiff = GetEditView()->GetStartDocPos().X() - pCurScrollBar->GetThumbPos();
1218         GetEditView()->Scroll( nDiff, 0 );
1219         GetEditView()->ShowCursor( sal_False, sal_True );
1220         pCurScrollBar->SetThumbPos( GetEditView()->GetStartDocPos().X() );
1221 
1222     }
1223 }
1224 
1225 
1226 sal_Bool __EXPORT ModulWindow::IsModified()
1227 {
1228     return GetEditEngine() ? GetEditEngine()->IsModified() : sal_False;
1229 }
1230 
1231 
1232 
1233 void __EXPORT ModulWindow::GoOnTop()
1234 {
1235     IDE_DLL()->GetShell()->GetViewFrame()->ToTop();
1236 }
1237 
1238 String ModulWindow::GetSbModuleName()
1239 {
1240     String aModuleName;
1241     if ( XModule().Is() )
1242         aModuleName = xModule->GetName();
1243     return aModuleName;
1244 }
1245 
1246 
1247 
1248 String __EXPORT ModulWindow::GetTitle()
1249 {
1250     return GetSbModuleName();
1251 }
1252 
1253 
1254 
1255 void ModulWindow::FrameWindowMoved()
1256 {
1257 //  if ( GetEditEngine() && GetEditEngine()->IsInSelectionMode() )
1258 //      GetEditEngine()->StopSelectionMode();
1259 }
1260 
1261 
1262 
1263 void ModulWindow::ShowCursor( sal_Bool bOn )
1264 {
1265     if ( GetEditEngine() )
1266     {
1267         TextView* pView = GetEditEngine()->GetActiveView();
1268         if ( pView )
1269         {
1270             if ( bOn )
1271                 pView->ShowCursor();
1272             else
1273                 pView->HideCursor();
1274         }
1275     }
1276 }
1277 
1278 
1279 Window* __EXPORT ModulWindow::GetLayoutWindow()
1280 {
1281     return pLayout;
1282 }
1283 
1284 void ModulWindow::AssertValidEditEngine()
1285 {
1286     if ( !GetEditEngine() )
1287         GetEditorWindow().CreateEditEngine();
1288 }
1289 
1290 void ModulWindow::Deactivating()
1291 {
1292     if ( GetEditView() )
1293         GetEditView()->EraseVirtualDevice();
1294 }
1295 
1296 sal_uInt16 ModulWindow::StartSearchAndReplace( const SvxSearchItem& rSearchItem, sal_Bool bFromStart )
1297 {
1298     // Mann koennte fuer das blinde Alle-Ersetzen auch auf
1299     // Syntaxhighlighting/Formatierung verzichten...
1300     AssertValidEditEngine();
1301     ExtTextView* pView = GetEditView();
1302     TextSelection aSel;
1303     if ( bFromStart )
1304     {
1305         aSel = pView->GetSelection();
1306         if ( !rSearchItem.GetBackward() )
1307             pView->SetSelection( TextSelection() );
1308         else
1309             pView->SetSelection( TextSelection( TextPaM( 0xFFFFFFFF, 0xFFFF ), TextPaM( 0xFFFFFFFF, 0xFFFF ) ) );
1310     }
1311 
1312     sal_Bool bForward = !rSearchItem.GetBackward();
1313     sal_uInt16 nFound = 0;
1314     if ( ( rSearchItem.GetCommand() == SVX_SEARCHCMD_FIND ) ||
1315          ( rSearchItem.GetCommand() == SVX_SEARCHCMD_FIND_ALL ) )
1316     {
1317         nFound = pView->Search( rSearchItem.GetSearchOptions() , bForward );
1318     }
1319     else if ( ( rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE ) ||
1320               ( rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL ) )
1321     {
1322         if ( !IsReadOnly() )
1323         {
1324             sal_Bool bAll = rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL;
1325             nFound = pView->Replace( rSearchItem.GetSearchOptions() , bAll , bForward );
1326         }
1327     }
1328 
1329     if ( bFromStart && !nFound )
1330         pView->SetSelection( aSel );
1331 
1332     return nFound;
1333 }
1334 
1335 ::svl::IUndoManager* __EXPORT ModulWindow::GetUndoManager()
1336 {
1337     if ( GetEditEngine() )
1338         return &GetEditEngine()->GetUndoManager();
1339     return NULL;
1340 }
1341 
1342 sal_uInt16 __EXPORT ModulWindow::GetSearchOptions()
1343 {
1344     sal_uInt16 nOptions = SEARCH_OPTIONS_SEARCH |
1345                       SEARCH_OPTIONS_WHOLE_WORDS |
1346                       SEARCH_OPTIONS_BACKWARDS |
1347                       SEARCH_OPTIONS_REG_EXP |
1348                       SEARCH_OPTIONS_EXACT |
1349                       SEARCH_OPTIONS_SELECTION |
1350                       SEARCH_OPTIONS_SIMILARITY;
1351 
1352     if ( !IsReadOnly() )
1353     {
1354         nOptions |= SEARCH_OPTIONS_REPLACE;
1355         nOptions |= SEARCH_OPTIONS_REPLACE_ALL;
1356     }
1357 
1358     return nOptions;
1359 }
1360 
1361 void __EXPORT ModulWindow::BasicStarted()
1362 {
1363     if ( XModule().Is() )
1364     {
1365         aStatus.bIsRunning = sal_True;
1366         BreakPointList& rList = GetBreakPoints();
1367         if ( rList.Count() )
1368         {
1369             rList.ResetHitCount();
1370             rList.SetBreakPointsInBasic( xModule );
1371             for ( sal_uInt16 nMethod = 0; nMethod < xModule->GetMethods()->Count(); nMethod++ )
1372             {
1373                 SbMethod* pMethod = (SbMethod*)xModule->GetMethods()->Get( nMethod );
1374                 DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" );
1375                 pMethod->SetDebugFlags( pMethod->GetDebugFlags() | SbDEBUG_BREAK );
1376             }
1377         }
1378     }
1379 }
1380 
1381 void __EXPORT ModulWindow::BasicStopped()
1382 {
1383     aStatus.bIsRunning = sal_False;
1384     GetBreakPointWindow().SetMarkerPos( MARKER_NOMARKER );
1385 }
1386 
1387 BasicEntryDescriptor ModulWindow::CreateEntryDescriptor()
1388 {
1389     ScriptDocument aDocument( GetDocument() );
1390     String aLibName( GetLibName() );
1391     LibraryLocation eLocation = aDocument.getLibraryLocation( aLibName );
1392     String aModName( GetName() );
1393     String aLibSubName;
1394     if( xBasic.Is() && aDocument.isInVBAMode() && XModule().Is() )
1395     {
1396         switch( xModule->GetModuleType() )
1397         {
1398             case script::ModuleType::DOCUMENT:
1399             {
1400                 aLibSubName = String( IDEResId( RID_STR_DOCUMENT_OBJECTS ) );
1401                 uno::Reference< container::XNameContainer > xLib = aDocument.getOrCreateLibrary( E_SCRIPTS, aLibName );
1402                 if( xLib.is() )
1403                 {
1404                     String sObjName;
1405                     ModuleInfoHelper::getObjectName( xLib, aModName, sObjName );
1406                     if( sObjName.Len() )
1407                     {
1408                         aModName.AppendAscii(" (").Append(sObjName).AppendAscii(")");
1409                     }
1410                 }
1411                 break;
1412             }
1413             case script::ModuleType::FORM:
1414                 aLibSubName = String( IDEResId( RID_STR_USERFORMS ) );
1415                 break;
1416             case script::ModuleType::NORMAL:
1417                 aLibSubName = String( IDEResId( RID_STR_NORMAL_MODULES ) );
1418                 break;
1419             case script::ModuleType::CLASS:
1420                 aLibSubName = String( IDEResId( RID_STR_CLASS_MODULES ) );
1421                 break;
1422         }
1423     }
1424     return BasicEntryDescriptor( aDocument, eLocation, aLibName, aLibSubName, aModName, OBJ_TYPE_MODULE );
1425 }
1426 
1427 void ModulWindow::SetReadOnly( sal_Bool b )
1428 {
1429     if ( GetEditView() )
1430         GetEditView()->SetReadOnly( b );
1431 }
1432 
1433 sal_Bool ModulWindow::IsReadOnly()
1434 {
1435     sal_Bool bReadOnly = sal_False;
1436 
1437     if ( GetEditView() )
1438         bReadOnly = GetEditView()->IsReadOnly();
1439 
1440     return bReadOnly;
1441 }
1442 
1443 sal_Bool ModulWindow::IsPasteAllowed()
1444 {
1445     sal_Bool bPaste = sal_False;
1446 
1447     // get clipboard
1448     Reference< datatransfer::clipboard::XClipboard > xClipboard = GetClipboard();
1449     if ( xClipboard.is() )
1450     {
1451         // get clipboard content
1452         const sal_uInt32 nRef = Application::ReleaseSolarMutex();
1453         Reference< datatransfer::XTransferable > xTransf = xClipboard->getContents();
1454         Application::AcquireSolarMutex( nRef );
1455         if ( xTransf.is() )
1456         {
1457             datatransfer::DataFlavor aFlavor;
1458             SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor );
1459             if ( xTransf->isDataFlavorSupported( aFlavor ) )
1460             {
1461                 bPaste = sal_True;
1462             }
1463         }
1464     }
1465 
1466     return bPaste;
1467 }
1468 
1469 ModulWindowLayout::ModulWindowLayout( Window* pParent ) :
1470     Window( pParent, WB_CLIPCHILDREN ),
1471     aVSplitter( this, WinBits( WB_VSCROLL ) ),
1472     aHSplitter( this, WinBits( WB_HSCROLL ) ),
1473     aWatchWindow( this ),
1474     aStackWindow( this ),
1475     bVSplitted(sal_False),
1476     bHSplitted(sal_False),
1477     m_pModulWindow(0),
1478     m_aImagesNormal(IDEResId(RID_IMGLST_LAYOUT)),
1479     m_aImagesHighContrast(IDEResId(RID_IMGLST_LAYOUT_HC))
1480 {
1481     SetBackground(GetSettings().GetStyleSettings().GetWindowColor());
1482 
1483     aVSplitter.SetSplitHdl( LINK( this, ModulWindowLayout, SplitHdl ) );
1484     aHSplitter.SetSplitHdl( LINK( this, ModulWindowLayout, SplitHdl ) );
1485     aVSplitter.Show();
1486     aHSplitter.Show();
1487 
1488     aWatchWindow.Show();
1489     aStackWindow.Show();
1490 
1491     Color aColor(GetSettings().GetStyleSettings().GetFieldTextColor());
1492     m_aSyntaxColors[TT_UNKNOWN] = aColor;
1493     m_aSyntaxColors[TT_WHITESPACE] = aColor;
1494     m_aSyntaxColors[TT_EOL] = aColor;
1495     m_aColorConfig.AddListener(this);
1496     m_aSyntaxColors[TT_IDENTIFIER]
1497         = Color(m_aColorConfig.GetColorValue(svtools::BASICIDENTIFIER).nColor);
1498     m_aSyntaxColors[TT_NUMBER]
1499         = Color(m_aColorConfig.GetColorValue(svtools::BASICNUMBER).nColor);
1500     m_aSyntaxColors[TT_STRING]
1501         = Color(m_aColorConfig.GetColorValue(svtools::BASICSTRING).nColor);
1502     m_aSyntaxColors[TT_COMMENT]
1503         = Color(m_aColorConfig.GetColorValue(svtools::BASICCOMMENT).nColor);
1504     m_aSyntaxColors[TT_ERROR]
1505         = Color(m_aColorConfig.GetColorValue(svtools::BASICERROR).nColor);
1506     m_aSyntaxColors[TT_OPERATOR]
1507         = Color(m_aColorConfig.GetColorValue(svtools::BASICOPERATOR).nColor);
1508     m_aSyntaxColors[TT_KEYWORDS]
1509         = Color(m_aColorConfig.GetColorValue(svtools::BASICKEYWORD).nColor);
1510 
1511     Font aFont( GetFont() );
1512     Size aSz( aFont.GetSize() );
1513     aSz.Height() *= 3;
1514     aSz.Height() /= 2;
1515     aFont.SetSize( aSz );
1516     aFont.SetWeight( WEIGHT_BOLD );
1517     aFont.SetColor(GetSettings().GetStyleSettings().GetWindowTextColor());
1518     SetFont( aFont );
1519 }
1520 
1521 ModulWindowLayout::~ModulWindowLayout()
1522 {
1523     m_aColorConfig.RemoveListener(this);
1524 }
1525 
1526 void __EXPORT ModulWindowLayout::Resize()
1527 {
1528     // ScrollBars, etc. passiert in BasicIDEShell:Adjust...
1529     ArrangeWindows();
1530 //  Invalidate();
1531 }
1532 
1533 void __EXPORT ModulWindowLayout::Paint( const Rectangle& )
1534 {
1535     DrawText( Point(), String( IDEResId( RID_STR_NOMODULE ) ) );
1536 }
1537 
1538 
1539 void ModulWindowLayout::ArrangeWindows()
1540 {
1541     Size aSz = GetOutputSizePixel();
1542 
1543     // prueffen, ob der Splitter in einem gueltigen Bereich liegt...
1544     long nMinPos = SPLIT_MARGIN;
1545     long nMaxPos = aSz.Height() - SPLIT_MARGIN;
1546 
1547     long nVSplitPos = aVSplitter.GetSplitPosPixel();
1548     long nHSplitPos = aHSplitter.GetSplitPosPixel();
1549     if ( !bVSplitted )
1550     {
1551         // Wenn noch nie gesplitted wurde, Verhaeltniss = 3 : 4
1552         nVSplitPos = aSz.Height() * 3 / 4;
1553         aVSplitter.SetSplitPosPixel( nVSplitPos );
1554     }
1555     if ( !bHSplitted )
1556     {
1557         // Wenn noch nie gesplitted wurde, Verhaeltniss = 2 : 3
1558         nHSplitPos = aSz.Width() * 2 / 3;
1559         aHSplitter.SetSplitPosPixel( nHSplitPos );
1560     }
1561     if ( ( nVSplitPos < nMinPos ) || ( nVSplitPos > nMaxPos ) )
1562         nVSplitPos = ( nVSplitPos < nMinPos ) ? 0 : ( aSz.Height() - SPLIT_HEIGHT );
1563 
1564     Size aXEWSz;
1565     aXEWSz.Width() = aSz.Width();
1566     aXEWSz.Height() = nVSplitPos + 1;
1567     if ( m_pModulWindow )
1568     {
1569         DBG_CHKOBJ( m_pModulWindow, ModulWindow, 0 );
1570         m_pModulWindow->SetPosSizePixel( Point( 0, 0 ), aXEWSz );
1571     }
1572 
1573     aVSplitter.SetDragRectPixel( Rectangle( Point( 0, 0 ), Size( aSz.Width(), aSz.Height() ) ) );
1574     aVSplitter.SetPosPixel( Point( 0, nVSplitPos ) );
1575     aVSplitter.SetSizePixel( Size( aSz.Width(), SPLIT_HEIGHT ) );
1576 
1577     aHSplitter.SetDragRectPixel( Rectangle( Point( 0, nVSplitPos+SPLIT_HEIGHT ), Size( aSz.Width(), aSz.Height() - nVSplitPos - SPLIT_HEIGHT ) ) );
1578     aHSplitter.SetPosPixel( Point( nHSplitPos, nVSplitPos ) );
1579     aHSplitter.SetSizePixel( Size( SPLIT_HEIGHT, aSz.Height() - nVSplitPos ) );
1580 
1581     Size aWWSz;
1582     Point aWWPos( 0, nVSplitPos+SPLIT_HEIGHT );
1583     aWWSz.Width() = nHSplitPos;
1584     aWWSz.Height() = aSz.Height() - aWWPos.Y();
1585     if ( !aWatchWindow.IsFloatingMode() )
1586         aWatchWindow.SetPosSizePixel( aWWPos, aWWSz );
1587 
1588     Size aSWSz;
1589     Point aSWPos( nHSplitPos+SPLIT_HEIGHT, nVSplitPos+SPLIT_HEIGHT );
1590     aSWSz.Width() = aSz.Width() - aSWPos.X();
1591     aSWSz.Height() = aSz.Height() - aSWPos.Y();
1592     if ( !aStackWindow.IsFloatingMode() )
1593         aStackWindow.SetPosSizePixel( aSWPos, aSWSz );
1594 
1595     if ( aStackWindow.IsFloatingMode() && aWatchWindow.IsFloatingMode() )
1596         aHSplitter.Hide();
1597     else
1598         aHSplitter.Show();
1599 
1600     long nHDoubleClickSplitPosX = aSz.Width()-aHSplitter.GetSizePixel().Width();
1601     if ( aHSplitter.GetSplitPosPixel() < nHDoubleClickSplitPosX )
1602         aHSplitter.SetLastSplitPosPixel( nHDoubleClickSplitPosX );
1603 
1604 
1605     long nHDoubleClickSplitPosY = aSz.Height()-aVSplitter.GetSizePixel().Height();
1606     if ( aVSplitter.GetSplitPosPixel() < nHDoubleClickSplitPosY )
1607         aVSplitter.SetLastSplitPosPixel( nHDoubleClickSplitPosY );
1608 }
1609 
1610 IMPL_LINK( ModulWindowLayout, SplitHdl, Splitter *, pSplitter )
1611 {
1612     if ( pSplitter == &aVSplitter )
1613         bVSplitted = sal_True;
1614     else
1615         bHSplitted = sal_True;
1616 
1617     ArrangeWindows();
1618     return 0;
1619 }
1620 
1621 sal_Bool ModulWindowLayout::IsToBeDocked( DockingWindow* pDockingWindow, const Point& rPos, Rectangle& rRect )
1622 {
1623     // prueffen, ob als Dock oder als Child:
1624     // TRUE:    Floating
1625     // FALSE:   Child
1626     Point aPosInMe = ScreenToOutputPixel( rPos );
1627     Size aSz = GetOutputSizePixel();
1628     if ( ( aPosInMe.X() > 0 ) && ( aPosInMe.X() < aSz.Width() ) &&
1629          ( aPosInMe.Y() > 0 ) && ( aPosInMe.Y() < aSz.Height() ) )
1630     {
1631         long nVSplitPos = aVSplitter.GetSplitPosPixel();
1632         long nHSplitPos = aHSplitter.GetSplitPosPixel();
1633         if ( pDockingWindow == &aWatchWindow )
1634         {
1635             if ( ( aPosInMe.Y() > nVSplitPos ) && ( aPosInMe.X() < nHSplitPos ) )
1636             {
1637                 rRect.SetSize( Size( nHSplitPos, aSz.Height() - nVSplitPos ) );
1638                 rRect.SetPos( OutputToScreenPixel( Point( 0, nVSplitPos ) ) );
1639                 return sal_True;
1640             }
1641         }
1642         if ( pDockingWindow == &aStackWindow )
1643         {
1644             if ( ( aPosInMe.Y() > nVSplitPos ) && ( aPosInMe.X() > nHSplitPos ) )
1645             {
1646                 rRect.SetSize( Size( aSz.Width() - nHSplitPos, aSz.Height() - nVSplitPos ) );
1647                 rRect.SetPos( OutputToScreenPixel( Point( nHSplitPos, nVSplitPos ) ) );
1648                 return sal_True;
1649             }
1650         }
1651     }
1652     return sal_False;
1653 }
1654 
1655 void ModulWindowLayout::DockaWindow( DockingWindow* pDockingWindow )
1656 {
1657     if ( pDockingWindow == &aWatchWindow )
1658     {
1659         // evtl. Sonderbehandlung...
1660         ArrangeWindows();
1661     }
1662     else if ( pDockingWindow == &aStackWindow )
1663     {
1664         // evtl. Sonderbehandlung...
1665         ArrangeWindows();
1666     }
1667 #ifdef DBG_UTIL
1668     else
1669         DBG_ERROR( "Wer will sich denn hier andocken ?" );
1670 #endif
1671 }
1672 
1673 void ModulWindowLayout::SetModulWindow( ModulWindow* pModWin )
1674 {
1675     m_pModulWindow = pModWin;
1676     ArrangeWindows();
1677 }
1678 
1679 // virtual
1680 void ModulWindowLayout::DataChanged(DataChangedEvent const & rDCEvt)
1681 {
1682     Window::DataChanged(rDCEvt);
1683     if (rDCEvt.GetType() == DATACHANGED_SETTINGS
1684         && (rDCEvt.GetFlags() & SETTINGS_STYLE) != 0)
1685     {
1686         bool bInvalidate = false;
1687         Color aColor(GetSettings().GetStyleSettings().GetWindowColor());
1688         if (aColor
1689             != rDCEvt.GetOldSettings()->GetStyleSettings().GetWindowColor())
1690         {
1691             SetBackground(Wallpaper(aColor));
1692             bInvalidate = true;
1693         }
1694         aColor = GetSettings().GetStyleSettings().GetWindowTextColor();
1695         if (aColor != rDCEvt.GetOldSettings()->
1696             GetStyleSettings().GetWindowTextColor())
1697         {
1698             Font aFont(GetFont());
1699             aFont.SetColor(aColor);
1700             SetFont(aFont);
1701             bInvalidate = true;
1702         }
1703         if (bInvalidate)
1704             Invalidate();
1705         aColor = GetSettings().GetStyleSettings().GetFieldTextColor();
1706         if (aColor != m_aSyntaxColors[TT_UNKNOWN])
1707         {
1708             m_aSyntaxColors[TT_UNKNOWN] = aColor;
1709             m_aSyntaxColors[TT_WHITESPACE] = aColor;
1710             m_aSyntaxColors[TT_EOL] = aColor;
1711             updateSyntaxHighlighting();
1712         }
1713     }
1714 }
1715 
1716 // virtual
1717 void ModulWindowLayout::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 )
1718 {
1719     {
1720         Color aColor(m_aColorConfig.GetColorValue(svtools::BASICIDENTIFIER).
1721                      nColor);
1722         bool bChanged = aColor != m_aSyntaxColors[TT_IDENTIFIER];
1723         m_aSyntaxColors[TT_IDENTIFIER] = aColor;
1724         aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICNUMBER).nColor);
1725     if (bChanged || aColor != m_aSyntaxColors[TT_NUMBER])
1726             bChanged = true;
1727         m_aSyntaxColors[TT_NUMBER] = aColor;
1728         aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICSTRING).nColor);
1729         if (bChanged || aColor != m_aSyntaxColors[TT_STRING])
1730             bChanged = true;
1731         m_aSyntaxColors[TT_STRING] = aColor;
1732         aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICCOMMENT).
1733                        nColor);
1734         if (bChanged || aColor != m_aSyntaxColors[TT_COMMENT])
1735             bChanged = true;
1736         m_aSyntaxColors[TT_COMMENT] = aColor;
1737         aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICERROR).nColor);
1738         if (bChanged || aColor != m_aSyntaxColors[TT_ERROR])
1739             bChanged = true;
1740         m_aSyntaxColors[TT_ERROR] = aColor;
1741         aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICOPERATOR).
1742                        nColor);
1743         if (bChanged || aColor != m_aSyntaxColors[TT_OPERATOR])
1744             bChanged = true;
1745         m_aSyntaxColors[TT_OPERATOR] = aColor;
1746         aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICKEYWORD).
1747                        nColor);
1748         if (bChanged || aColor != m_aSyntaxColors[TT_KEYWORDS])
1749             bChanged = true;
1750         m_aSyntaxColors[TT_KEYWORDS] = aColor;
1751         if (bChanged)
1752             updateSyntaxHighlighting();
1753     }
1754 }
1755 
1756 void ModulWindowLayout::updateSyntaxHighlighting()
1757 {
1758     if (m_pModulWindow != 0)
1759     {
1760         EditorWindow & rEditor = m_pModulWindow->GetEditorWindow();
1761         sal_uLong nCount = rEditor.GetEditEngine()->GetParagraphCount();
1762         for (sal_uLong i = 0; i < nCount; ++i)
1763             rEditor.DoDelayedSyntaxHighlight(i);
1764     }
1765 }
1766 
1767 Image ModulWindowLayout::getImage(sal_uInt16 nId, bool bHighContrastMode) const
1768 {
1769     return (bHighContrastMode ? m_aImagesHighContrast : m_aImagesNormal).
1770         GetImage(nId);
1771 }
1772