xref: /trunk/main/basctl/source/basicide/baside2b.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_basctl.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <vector>
32*cdf0e10cSrcweir #define _BASIC_TEXTPORTIONS
33*cdf0e10cSrcweir #include <basic/sbdef.hxx>
34*cdf0e10cSrcweir #include <ide_pch.hxx>
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir 
37*cdf0e10cSrcweir #include <tools/urlobj.hxx>
38*cdf0e10cSrcweir #include <unotools/charclass.hxx>
39*cdf0e10cSrcweir #include <svl/urihelper.hxx>
40*cdf0e10cSrcweir #include <basic/sbx.hxx>
41*cdf0e10cSrcweir #include <vcl/sound.hxx>
42*cdf0e10cSrcweir #include <svtools/xtextedt.hxx>
43*cdf0e10cSrcweir #include <svtools/txtattr.hxx>
44*cdf0e10cSrcweir #include <svtools/textwindowpeer.hxx>
45*cdf0e10cSrcweir #include <basic/sbuno.hxx>
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir #include <helpid.hrc>
48*cdf0e10cSrcweir #include <baside2.hrc>
49*cdf0e10cSrcweir #include <baside2.hxx>
50*cdf0e10cSrcweir #include <brkdlg.hxx>
51*cdf0e10cSrcweir #include <objdlg.hxx>
52*cdf0e10cSrcweir #include <basobj.hxx>
53*cdf0e10cSrcweir #include <iderdll.hxx>
54*cdf0e10cSrcweir #include <iderdll2.hxx>
55*cdf0e10cSrcweir #include <vcl/taskpanelist.hxx>
56*cdf0e10cSrcweir #include <vcl/help.hxx>
57*cdf0e10cSrcweir 
58*cdf0e10cSrcweir //#ifndef _SFX_HELP_HXX //autogen
59*cdf0e10cSrcweir //#include <sfx2/sfxhelp.hxx>
60*cdf0e10cSrcweir //#endif
61*cdf0e10cSrcweir #include <unotools/sourceviewconfig.hxx>
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_SCRIPT_XLIBRYARYCONTAINER2_HPP_
64*cdf0e10cSrcweir #include <com/sun/star/script/XLibraryContainer2.hpp>
65*cdf0e10cSrcweir #endif
66*cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir using namespace ::com::sun::star;
70*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
71*cdf0e10cSrcweir 
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir long nVirtToolBoxHeight;    // wird im WatchWindow init., im Stackwindow verw.
74*cdf0e10cSrcweir long nHeaderBarHeight;
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir #define SCROLL_LINE     12
77*cdf0e10cSrcweir #define SCROLL_PAGE     60
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir #define DWBORDER        3
80*cdf0e10cSrcweir 
81*cdf0e10cSrcweir static const char cSuffixes[] = "%&!#@$";
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir MapUnit eEditMapUnit = MAP_100TH_MM;
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir // #108672 Helper functions to get/set text in TextEngine
87*cdf0e10cSrcweir // using the stream interface (get/setText() only supports
88*cdf0e10cSrcweir // tools Strings limited to 64K).
89*cdf0e10cSrcweir ::rtl::OUString getTextEngineText( ExtTextEngine* pEngine )
90*cdf0e10cSrcweir {
91*cdf0e10cSrcweir     SvMemoryStream aMemStream;
92*cdf0e10cSrcweir     aMemStream.SetStreamCharSet( RTL_TEXTENCODING_UTF8 );
93*cdf0e10cSrcweir     aMemStream.SetLineDelimiter( LINEEND_LF );
94*cdf0e10cSrcweir     pEngine->Write( aMemStream );
95*cdf0e10cSrcweir     sal_uLong nSize = aMemStream.Tell();
96*cdf0e10cSrcweir     ::rtl::OUString aText( (const sal_Char*)aMemStream.GetData(),
97*cdf0e10cSrcweir         nSize, RTL_TEXTENCODING_UTF8 );
98*cdf0e10cSrcweir     return aText;
99*cdf0e10cSrcweir }
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir void setTextEngineText( ExtTextEngine* pEngine, const ::rtl::OUString aStr )
102*cdf0e10cSrcweir {
103*cdf0e10cSrcweir     pEngine->SetText( String() );
104*cdf0e10cSrcweir     ::rtl::OString aUTF8Str = ::rtl::OUStringToOString( aStr, RTL_TEXTENCODING_UTF8 );
105*cdf0e10cSrcweir     SvMemoryStream aMemStream( (void*)aUTF8Str.getStr(), aUTF8Str.getLength(),
106*cdf0e10cSrcweir         STREAM_READ | STREAM_SEEK_TO_BEGIN );
107*cdf0e10cSrcweir     aMemStream.SetStreamCharSet( RTL_TEXTENCODING_UTF8 );
108*cdf0e10cSrcweir     aMemStream.SetLineDelimiter( LINEEND_LF );
109*cdf0e10cSrcweir     pEngine->Read( aMemStream );
110*cdf0e10cSrcweir }
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir void lcl_DrawIDEWindowFrame( DockingWindow* pWin )
113*cdf0e10cSrcweir {
114*cdf0e10cSrcweir     // The result of using explicit colors here appears to be harmless when
115*cdf0e10cSrcweir     // switching to high contrast mode:
116*cdf0e10cSrcweir     if ( !pWin->IsFloatingMode() )
117*cdf0e10cSrcweir     {
118*cdf0e10cSrcweir         Size aSz = pWin->GetOutputSizePixel();
119*cdf0e10cSrcweir         const Color aOldLineColor( pWin->GetLineColor() );
120*cdf0e10cSrcweir         pWin->SetLineColor( Color( COL_WHITE ) );
121*cdf0e10cSrcweir         // oben eine weisse..
122*cdf0e10cSrcweir         pWin->DrawLine( Point( 0, 0 ), Point( aSz.Width(), 0 ) );
123*cdf0e10cSrcweir         // unten eine schwarze...
124*cdf0e10cSrcweir         pWin->SetLineColor( Color( COL_BLACK ) );
125*cdf0e10cSrcweir         pWin->DrawLine( Point( 0, aSz.Height() - 1 ), Point( aSz.Width(), aSz.Height() - 1 ) );
126*cdf0e10cSrcweir         pWin->SetLineColor( aOldLineColor );
127*cdf0e10cSrcweir     }
128*cdf0e10cSrcweir }
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir void lcl_SeparateNameAndIndex( const String& rVName, String& rVar, String& rIndex )
131*cdf0e10cSrcweir {
132*cdf0e10cSrcweir     rVar = rVName;
133*cdf0e10cSrcweir     rIndex.Erase();
134*cdf0e10cSrcweir     sal_uInt16 nIndexStart = rVar.Search( '(' );
135*cdf0e10cSrcweir     if ( nIndexStart != STRING_NOTFOUND )
136*cdf0e10cSrcweir     {
137*cdf0e10cSrcweir         sal_uInt16 nIndexEnd = rVar.Search( ')', nIndexStart );
138*cdf0e10cSrcweir         if ( nIndexStart != STRING_NOTFOUND )
139*cdf0e10cSrcweir         {
140*cdf0e10cSrcweir             rIndex = rVar.Copy( nIndexStart+1, nIndexEnd-nIndexStart-1 );
141*cdf0e10cSrcweir             rVar.Erase( nIndexStart );
142*cdf0e10cSrcweir             rVar.EraseTrailingChars();
143*cdf0e10cSrcweir             rIndex.EraseLeadingChars();
144*cdf0e10cSrcweir             rIndex.EraseTrailingChars();
145*cdf0e10cSrcweir         }
146*cdf0e10cSrcweir     }
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir     if ( rVar.Len() )
149*cdf0e10cSrcweir     {
150*cdf0e10cSrcweir         sal_uInt16 nLastChar = rVar.Len()-1;
151*cdf0e10cSrcweir         if ( strchr( cSuffixes, rVar.GetChar( nLastChar ) ) )
152*cdf0e10cSrcweir             rVar.Erase( nLastChar, 1 );
153*cdf0e10cSrcweir     }
154*cdf0e10cSrcweir     if ( rIndex.Len() )
155*cdf0e10cSrcweir     {
156*cdf0e10cSrcweir         sal_uInt16 nLastChar = rIndex.Len()-1;
157*cdf0e10cSrcweir         if ( strchr( cSuffixes, rIndex.GetChar( nLastChar ) ) )
158*cdf0e10cSrcweir             rIndex.Erase( nLastChar, 1 );
159*cdf0e10cSrcweir     }
160*cdf0e10cSrcweir }
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir 
163*cdf0e10cSrcweir EditorWindow::EditorWindow( Window* pParent ) :
164*cdf0e10cSrcweir     Window( pParent, WB_BORDER )
165*cdf0e10cSrcweir {
166*cdf0e10cSrcweir     bDoSyntaxHighlight = sal_True;
167*cdf0e10cSrcweir     bDelayHighlight = sal_True;
168*cdf0e10cSrcweir     pModulWindow = 0;
169*cdf0e10cSrcweir     pEditView = 0;
170*cdf0e10cSrcweir     pEditEngine = 0;
171*cdf0e10cSrcweir     pSourceViewConfig = new utl::SourceViewConfig;
172*cdf0e10cSrcweir     bHighlightning = sal_False;
173*cdf0e10cSrcweir     pProgress = 0;
174*cdf0e10cSrcweir     nCurTextWidth = 0;
175*cdf0e10cSrcweir     SetBackground(
176*cdf0e10cSrcweir         Wallpaper(GetSettings().GetStyleSettings().GetFieldColor()));
177*cdf0e10cSrcweir     SetPointer( Pointer( POINTER_TEXT ) );
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir     SetHelpId( HID_BASICIDE_EDITORWINDOW );
180*cdf0e10cSrcweir     pSourceViewConfig->AddListener(this);
181*cdf0e10cSrcweir }
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir 
185*cdf0e10cSrcweir __EXPORT EditorWindow::~EditorWindow()
186*cdf0e10cSrcweir {
187*cdf0e10cSrcweir     pSourceViewConfig->RemoveListener(this);
188*cdf0e10cSrcweir     delete pSourceViewConfig;
189*cdf0e10cSrcweir 
190*cdf0e10cSrcweir     aSyntaxIdleTimer.Stop();
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir     if ( pEditEngine )
193*cdf0e10cSrcweir     {
194*cdf0e10cSrcweir         EndListening( *pEditEngine );
195*cdf0e10cSrcweir         pEditEngine->RemoveView( pEditView );
196*cdf0e10cSrcweir //      pEditEngine->SetViewWin( 0 );
197*cdf0e10cSrcweir         delete pEditView;
198*cdf0e10cSrcweir         delete pEditEngine;
199*cdf0e10cSrcweir     }
200*cdf0e10cSrcweir }
201*cdf0e10cSrcweir 
202*cdf0e10cSrcweir String EditorWindow::GetWordAtCursor()
203*cdf0e10cSrcweir {
204*cdf0e10cSrcweir     String aWord;
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir     if ( pEditView )
207*cdf0e10cSrcweir     {
208*cdf0e10cSrcweir         TextEngine* pTextEngine = pEditView->GetTextEngine();
209*cdf0e10cSrcweir         if ( pTextEngine )
210*cdf0e10cSrcweir         {
211*cdf0e10cSrcweir             // check first, if the cursor is at a help URL
212*cdf0e10cSrcweir             const TextSelection& rSelection = pEditView->GetSelection();
213*cdf0e10cSrcweir             const TextPaM& rSelStart = rSelection.GetStart();
214*cdf0e10cSrcweir             const TextPaM& rSelEnd = rSelection.GetEnd();
215*cdf0e10cSrcweir             String aText = pTextEngine->GetText( rSelEnd.GetPara() );
216*cdf0e10cSrcweir             CharClass aClass( ::comphelper::getProcessServiceFactory() , Application::GetSettings().GetLocale() );
217*cdf0e10cSrcweir             xub_StrLen nSelStart = static_cast< xub_StrLen >( rSelStart.GetIndex() );
218*cdf0e10cSrcweir             xub_StrLen nSelEnd = static_cast< xub_StrLen >( rSelEnd.GetIndex() );
219*cdf0e10cSrcweir             xub_StrLen nLength = static_cast< xub_StrLen >( aText.Len() );
220*cdf0e10cSrcweir             xub_StrLen nStart = 0;
221*cdf0e10cSrcweir             xub_StrLen nEnd = nLength;
222*cdf0e10cSrcweir             while ( nStart < nLength )
223*cdf0e10cSrcweir             {
224*cdf0e10cSrcweir                 String aURL( URIHelper::FindFirstURLInText( aText, nStart, nEnd, aClass ) );
225*cdf0e10cSrcweir                 INetURLObject aURLObj( aURL );
226*cdf0e10cSrcweir                 if ( aURLObj.GetProtocol() == INET_PROT_VND_SUN_STAR_HELP
227*cdf0e10cSrcweir                      && nSelStart >= nStart && nSelStart <= nEnd && nSelEnd >= nStart && nSelEnd <= nEnd )
228*cdf0e10cSrcweir                 {
229*cdf0e10cSrcweir                     aWord = aURL;
230*cdf0e10cSrcweir                     break;
231*cdf0e10cSrcweir                 }
232*cdf0e10cSrcweir                 nStart = nEnd;
233*cdf0e10cSrcweir                 nEnd = nLength;
234*cdf0e10cSrcweir             }
235*cdf0e10cSrcweir 
236*cdf0e10cSrcweir             // Nicht den Selektierten Bereich, sondern an der CursorPosition,
237*cdf0e10cSrcweir             // falls Teil eines Worts markiert.
238*cdf0e10cSrcweir             if ( !aWord.Len() )
239*cdf0e10cSrcweir                 aWord = pTextEngine->GetWord( rSelEnd );
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir             // Kann leer sein, wenn komplettes Word markiert, da Cursor dahinter.
242*cdf0e10cSrcweir             if ( !aWord.Len() && pEditView->HasSelection() )
243*cdf0e10cSrcweir                 aWord = pTextEngine->GetWord( rSelStart );
244*cdf0e10cSrcweir         }
245*cdf0e10cSrcweir     }
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir     return aWord;
248*cdf0e10cSrcweir }
249*cdf0e10cSrcweir 
250*cdf0e10cSrcweir void __EXPORT EditorWindow::RequestHelp( const HelpEvent& rHEvt )
251*cdf0e10cSrcweir {
252*cdf0e10cSrcweir     sal_Bool bDone = sal_False;
253*cdf0e10cSrcweir 
254*cdf0e10cSrcweir     // Sollte eigentlich mal aktiviert werden...
255*cdf0e10cSrcweir     if ( pEditEngine )
256*cdf0e10cSrcweir     {
257*cdf0e10cSrcweir         if ( rHEvt.GetMode() & HELPMODE_CONTEXT )
258*cdf0e10cSrcweir         {
259*cdf0e10cSrcweir             String aKeyword = GetWordAtCursor();
260*cdf0e10cSrcweir             Application::GetHelp()->SearchKeyword( aKeyword );
261*cdf0e10cSrcweir             bDone = sal_True;
262*cdf0e10cSrcweir         }
263*cdf0e10cSrcweir         else if ( rHEvt.GetMode() & HELPMODE_QUICK )
264*cdf0e10cSrcweir         {
265*cdf0e10cSrcweir             String aHelpText;
266*cdf0e10cSrcweir             Point aTopLeft;
267*cdf0e10cSrcweir             if ( StarBASIC::IsRunning() )
268*cdf0e10cSrcweir             {
269*cdf0e10cSrcweir                 Point aWindowPos = rHEvt.GetMousePosPixel();
270*cdf0e10cSrcweir                 aWindowPos = ScreenToOutputPixel( aWindowPos );
271*cdf0e10cSrcweir                 Point aDocPos = GetEditView()->GetDocPos( aWindowPos );
272*cdf0e10cSrcweir                 TextPaM aCursor = GetEditView()->GetTextEngine()->GetPaM( aDocPos, sal_False );
273*cdf0e10cSrcweir                 TextPaM aStartOfWord;
274*cdf0e10cSrcweir                 String aWord = GetEditView()->GetTextEngine()->GetWord( aCursor, &aStartOfWord );
275*cdf0e10cSrcweir                 if ( aWord.Len() && !ByteString( aWord, RTL_TEXTENCODING_UTF8 ).IsNumericAscii() )
276*cdf0e10cSrcweir                 {
277*cdf0e10cSrcweir                     sal_uInt16 nLastChar =aWord.Len()-1;
278*cdf0e10cSrcweir                     if ( strchr( cSuffixes, aWord.GetChar( nLastChar ) ) )
279*cdf0e10cSrcweir                         aWord.Erase( nLastChar, 1 );
280*cdf0e10cSrcweir                     SbxBase* pSBX = StarBASIC::FindSBXInCurrentScope( aWord );
281*cdf0e10cSrcweir                     if ( pSBX && pSBX->ISA( SbxVariable ) && !pSBX->ISA( SbxMethod ) )
282*cdf0e10cSrcweir                     {
283*cdf0e10cSrcweir                         SbxVariable* pVar = (SbxVariable*)pSBX;
284*cdf0e10cSrcweir                         SbxDataType eType = pVar->GetType();
285*cdf0e10cSrcweir                         if ( (sal_uInt8)eType == (sal_uInt8)SbxOBJECT )
286*cdf0e10cSrcweir                             // Kann zu Absturz, z.B. bei Selections-Objekt fuehren
287*cdf0e10cSrcweir                             // Type == Object heisst nicht, dass pVar == Object!
288*cdf0e10cSrcweir                             ; // aHelpText = ((SbxObject*)pVar)->GetClassName();
289*cdf0e10cSrcweir                         else if ( eType & SbxARRAY )
290*cdf0e10cSrcweir                             ; // aHelpText = "{...}";
291*cdf0e10cSrcweir                         else if ( (sal_uInt8)eType != (sal_uInt8)SbxEMPTY )
292*cdf0e10cSrcweir                         {
293*cdf0e10cSrcweir                             aHelpText = pVar->GetName();
294*cdf0e10cSrcweir                             if ( !aHelpText.Len() )     // Bei Uebergabeparametern wird der Name nicht kopiert
295*cdf0e10cSrcweir                                 aHelpText = aWord;
296*cdf0e10cSrcweir                             aHelpText += '=';
297*cdf0e10cSrcweir                             aHelpText += pVar->GetString();
298*cdf0e10cSrcweir                         }
299*cdf0e10cSrcweir                     }
300*cdf0e10cSrcweir                     if ( aHelpText.Len() )
301*cdf0e10cSrcweir                     {
302*cdf0e10cSrcweir                         aTopLeft = GetEditView()->GetTextEngine()->PaMtoEditCursor( aStartOfWord ).BottomLeft();
303*cdf0e10cSrcweir                         aTopLeft = GetEditView()->GetWindowPos( aTopLeft );
304*cdf0e10cSrcweir                         aTopLeft.X() += 5;
305*cdf0e10cSrcweir                         aTopLeft.Y() += 5;
306*cdf0e10cSrcweir                         aTopLeft = OutputToScreenPixel( aTopLeft );
307*cdf0e10cSrcweir                     }
308*cdf0e10cSrcweir                 }
309*cdf0e10cSrcweir             }
310*cdf0e10cSrcweir             Help::ShowQuickHelp( this, Rectangle( aTopLeft, Size( 1, 1 ) ), aHelpText, QUICKHELP_TOP|QUICKHELP_LEFT);
311*cdf0e10cSrcweir             bDone = sal_True;
312*cdf0e10cSrcweir         }
313*cdf0e10cSrcweir     }
314*cdf0e10cSrcweir 
315*cdf0e10cSrcweir     if ( !bDone )
316*cdf0e10cSrcweir         Window::RequestHelp( rHEvt );
317*cdf0e10cSrcweir }
318*cdf0e10cSrcweir 
319*cdf0e10cSrcweir 
320*cdf0e10cSrcweir void __EXPORT EditorWindow::Resize()
321*cdf0e10cSrcweir {
322*cdf0e10cSrcweir     // ScrollBars, etc. passiert in Adjust...
323*cdf0e10cSrcweir     if ( pEditView )
324*cdf0e10cSrcweir     {
325*cdf0e10cSrcweir         long nVisY = pEditView->GetStartDocPos().Y();
326*cdf0e10cSrcweir //      pEditView->SetOutputArea( Rectangle( Point( 0, 0 ), GetOutputSize() ) );
327*cdf0e10cSrcweir         pEditView->ShowCursor();
328*cdf0e10cSrcweir         Size aOutSz( GetOutputSizePixel() );
329*cdf0e10cSrcweir         long nMaxVisAreaStart = pEditView->GetTextEngine()->GetTextHeight() - aOutSz.Height();
330*cdf0e10cSrcweir         if ( nMaxVisAreaStart < 0 )
331*cdf0e10cSrcweir             nMaxVisAreaStart = 0;
332*cdf0e10cSrcweir         if ( pEditView->GetStartDocPos().Y() > nMaxVisAreaStart )
333*cdf0e10cSrcweir         {
334*cdf0e10cSrcweir             Point aStartDocPos( pEditView->GetStartDocPos() );
335*cdf0e10cSrcweir             aStartDocPos.Y() = nMaxVisAreaStart;
336*cdf0e10cSrcweir             pEditView->SetStartDocPos( aStartDocPos );
337*cdf0e10cSrcweir             pEditView->ShowCursor();
338*cdf0e10cSrcweir             pModulWindow->GetBreakPointWindow().GetCurYOffset() = aStartDocPos.Y();
339*cdf0e10cSrcweir         }
340*cdf0e10cSrcweir         InitScrollBars();
341*cdf0e10cSrcweir         if ( nVisY != pEditView->GetStartDocPos().Y() )
342*cdf0e10cSrcweir             Invalidate();
343*cdf0e10cSrcweir     }
344*cdf0e10cSrcweir }
345*cdf0e10cSrcweir 
346*cdf0e10cSrcweir 
347*cdf0e10cSrcweir 
348*cdf0e10cSrcweir void __EXPORT EditorWindow::MouseMove( const MouseEvent &rEvt )
349*cdf0e10cSrcweir {
350*cdf0e10cSrcweir     if ( pEditView )
351*cdf0e10cSrcweir         pEditView->MouseMove( rEvt );
352*cdf0e10cSrcweir }
353*cdf0e10cSrcweir 
354*cdf0e10cSrcweir 
355*cdf0e10cSrcweir 
356*cdf0e10cSrcweir void __EXPORT EditorWindow::MouseButtonUp( const MouseEvent &rEvt )
357*cdf0e10cSrcweir {
358*cdf0e10cSrcweir     if ( pEditView )
359*cdf0e10cSrcweir     {
360*cdf0e10cSrcweir         pEditView->MouseButtonUp( rEvt );
361*cdf0e10cSrcweir         SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
362*cdf0e10cSrcweir         if ( pBindings )
363*cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_STAT_POS );
364*cdf0e10cSrcweir     }
365*cdf0e10cSrcweir }
366*cdf0e10cSrcweir 
367*cdf0e10cSrcweir void __EXPORT EditorWindow::MouseButtonDown( const MouseEvent &rEvt )
368*cdf0e10cSrcweir {
369*cdf0e10cSrcweir     GrabFocus();
370*cdf0e10cSrcweir     if ( pEditView )
371*cdf0e10cSrcweir     {
372*cdf0e10cSrcweir         pEditView->MouseButtonDown( rEvt );
373*cdf0e10cSrcweir     }
374*cdf0e10cSrcweir }
375*cdf0e10cSrcweir 
376*cdf0e10cSrcweir void __EXPORT EditorWindow::Command( const CommandEvent& rCEvt )
377*cdf0e10cSrcweir {
378*cdf0e10cSrcweir     if ( pEditView )
379*cdf0e10cSrcweir     {
380*cdf0e10cSrcweir         pEditView->Command( rCEvt );
381*cdf0e10cSrcweir         if ( ( rCEvt.GetCommand() == COMMAND_WHEEL ) ||
382*cdf0e10cSrcweir              ( rCEvt.GetCommand() == COMMAND_STARTAUTOSCROLL ) ||
383*cdf0e10cSrcweir              ( rCEvt.GetCommand() == COMMAND_AUTOSCROLL ) )
384*cdf0e10cSrcweir         {
385*cdf0e10cSrcweir             HandleScrollCommand( rCEvt, pModulWindow->GetHScrollBar(), &pModulWindow->GetEditVScrollBar() );
386*cdf0e10cSrcweir         }
387*cdf0e10cSrcweir     }
388*cdf0e10cSrcweir }
389*cdf0e10cSrcweir 
390*cdf0e10cSrcweir sal_Bool EditorWindow::ImpCanModify()
391*cdf0e10cSrcweir {
392*cdf0e10cSrcweir     sal_Bool bCanModify = sal_True;
393*cdf0e10cSrcweir     if ( StarBASIC::IsRunning() )
394*cdf0e10cSrcweir     {
395*cdf0e10cSrcweir         // Wenn im Trace-Mode, entweder Trace abbrechen oder
396*cdf0e10cSrcweir         // Eingabe verweigern
397*cdf0e10cSrcweir         // Im Notify bei Basic::Stoped die Markierungen in den Modulen
398*cdf0e10cSrcweir         // entfernen!
399*cdf0e10cSrcweir         if ( QueryBox( 0, WB_OK_CANCEL, String( IDEResId( RID_STR_WILLSTOPPRG ) ) ).Execute() == RET_OK )
400*cdf0e10cSrcweir         {
401*cdf0e10cSrcweir             pModulWindow->GetBasicStatus().bIsRunning = sal_False;
402*cdf0e10cSrcweir             BasicIDE::StopBasic();
403*cdf0e10cSrcweir         }
404*cdf0e10cSrcweir         else
405*cdf0e10cSrcweir             bCanModify = sal_False;
406*cdf0e10cSrcweir     }
407*cdf0e10cSrcweir     return bCanModify;
408*cdf0e10cSrcweir }
409*cdf0e10cSrcweir 
410*cdf0e10cSrcweir void __EXPORT EditorWindow::KeyInput( const KeyEvent& rKEvt )
411*cdf0e10cSrcweir {
412*cdf0e10cSrcweir     if ( !pEditView )   // Passiert unter W95 bei letzte Version, Ctrl-Tab
413*cdf0e10cSrcweir         return;
414*cdf0e10cSrcweir 
415*cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
416*cdf0e10cSrcweir     Range aRange = pModulWindow->GetHScrollBar()->GetRange(); (void)aRange;
417*cdf0e10cSrcweir     long nVisSz = pModulWindow->GetHScrollBar()->GetVisibleSize(); (void)nVisSz;
418*cdf0e10cSrcweir     long nPapSz = pModulWindow->GetHScrollBar()->GetPageSize(); (void)nPapSz;
419*cdf0e10cSrcweir     long nLinSz = pModulWindow->GetHScrollBar()->GetLineSize(); (void)nLinSz;
420*cdf0e10cSrcweir     long nThumb = pModulWindow->GetHScrollBar()->GetThumbPos(); (void)nThumb;
421*cdf0e10cSrcweir #endif
422*cdf0e10cSrcweir     sal_Bool bDone = sal_False;
423*cdf0e10cSrcweir     sal_Bool bWasModified = pEditEngine->IsModified();
424*cdf0e10cSrcweir     if ( !TextEngine::DoesKeyChangeText( rKEvt ) || ImpCanModify() )
425*cdf0e10cSrcweir     {
426*cdf0e10cSrcweir         if ( ( rKEvt.GetKeyCode().GetCode() == KEY_A) && rKEvt.GetKeyCode().IsMod1() )
427*cdf0e10cSrcweir             pEditView->SetSelection( TextSelection( TextPaM( 0, 0 ), TextPaM( 0xFFFFFFFF, 0xFFFF ) ) );
428*cdf0e10cSrcweir         else if ( ( rKEvt.GetKeyCode().GetCode() == KEY_Y ) && rKEvt.GetKeyCode().IsMod1() )
429*cdf0e10cSrcweir             bDone = sal_True; // CTRL-Y schlucken, damit kein Vorlagenkatalog
430*cdf0e10cSrcweir         else
431*cdf0e10cSrcweir         {
432*cdf0e10cSrcweir             if ( ( rKEvt.GetKeyCode().GetCode() == KEY_TAB ) && !rKEvt.GetKeyCode().IsMod1() &&
433*cdf0e10cSrcweir                   !rKEvt.GetKeyCode().IsMod2() && !GetEditView()->IsReadOnly() )
434*cdf0e10cSrcweir             {
435*cdf0e10cSrcweir                 TextSelection aSel( pEditView->GetSelection() );
436*cdf0e10cSrcweir                 if ( aSel.GetStart().GetPara() != aSel.GetEnd().GetPara() )
437*cdf0e10cSrcweir                 {
438*cdf0e10cSrcweir                     bDelayHighlight = sal_False;
439*cdf0e10cSrcweir                     if ( !rKEvt.GetKeyCode().IsShift() )
440*cdf0e10cSrcweir                         pEditView->IndentBlock();
441*cdf0e10cSrcweir                     else
442*cdf0e10cSrcweir                         pEditView->UnindentBlock();
443*cdf0e10cSrcweir                     bDelayHighlight = sal_True;
444*cdf0e10cSrcweir                     bDone = sal_True;
445*cdf0e10cSrcweir                 }
446*cdf0e10cSrcweir             }
447*cdf0e10cSrcweir             if ( !bDone )
448*cdf0e10cSrcweir                 bDone = pEditView->KeyInput( rKEvt );
449*cdf0e10cSrcweir         }
450*cdf0e10cSrcweir     }
451*cdf0e10cSrcweir     if ( !bDone )
452*cdf0e10cSrcweir     {
453*cdf0e10cSrcweir         if ( !SfxViewShell::Current()->KeyInput( rKEvt ) )
454*cdf0e10cSrcweir             Window::KeyInput( rKEvt );
455*cdf0e10cSrcweir     }
456*cdf0e10cSrcweir     else
457*cdf0e10cSrcweir     {
458*cdf0e10cSrcweir         SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
459*cdf0e10cSrcweir         if ( pBindings )
460*cdf0e10cSrcweir         {
461*cdf0e10cSrcweir             pBindings->Invalidate( SID_BASICIDE_STAT_POS );
462*cdf0e10cSrcweir             if ( rKEvt.GetKeyCode().GetGroup() == KEYGROUP_CURSOR )
463*cdf0e10cSrcweir                 pBindings->Update( SID_BASICIDE_STAT_POS );
464*cdf0e10cSrcweir             if ( !bWasModified && pEditEngine->IsModified() )
465*cdf0e10cSrcweir             {
466*cdf0e10cSrcweir                 pBindings->Invalidate( SID_SAVEDOC );
467*cdf0e10cSrcweir                 pBindings->Invalidate( SID_DOC_MODIFIED );
468*cdf0e10cSrcweir                 pBindings->Invalidate( SID_UNDO );
469*cdf0e10cSrcweir             }
470*cdf0e10cSrcweir             if ( rKEvt.GetKeyCode().GetCode() == KEY_INSERT )
471*cdf0e10cSrcweir                 pBindings->Invalidate( SID_ATTR_INSERT );
472*cdf0e10cSrcweir         }
473*cdf0e10cSrcweir     }
474*cdf0e10cSrcweir }
475*cdf0e10cSrcweir 
476*cdf0e10cSrcweir void __EXPORT EditorWindow::Paint( const Rectangle& rRect )
477*cdf0e10cSrcweir {
478*cdf0e10cSrcweir     if ( !pEditEngine )     // spaetestens jetzt brauche ich sie...
479*cdf0e10cSrcweir         CreateEditEngine();
480*cdf0e10cSrcweir 
481*cdf0e10cSrcweir     pEditView->Paint( rRect );
482*cdf0e10cSrcweir }
483*cdf0e10cSrcweir 
484*cdf0e10cSrcweir void __EXPORT EditorWindow::LoseFocus()
485*cdf0e10cSrcweir {
486*cdf0e10cSrcweir     SetSourceInBasic();
487*cdf0e10cSrcweir     Window::LoseFocus();
488*cdf0e10cSrcweir }
489*cdf0e10cSrcweir 
490*cdf0e10cSrcweir sal_Bool EditorWindow::SetSourceInBasic( sal_Bool bQuiet )
491*cdf0e10cSrcweir {
492*cdf0e10cSrcweir     (void)bQuiet;
493*cdf0e10cSrcweir 
494*cdf0e10cSrcweir     sal_Bool bChanged = sal_False;
495*cdf0e10cSrcweir     if ( pEditEngine && pEditEngine->IsModified()
496*cdf0e10cSrcweir         && !GetEditView()->IsReadOnly() )   // Added because of #i60626, otherwise
497*cdf0e10cSrcweir             // any read only bug in the text engine could lead to a crash later
498*cdf0e10cSrcweir     {
499*cdf0e10cSrcweir         if ( !StarBASIC::IsRunning() ) // Nicht zur Laufzeit!
500*cdf0e10cSrcweir         {
501*cdf0e10cSrcweir             ::rtl::OUString aModule = getTextEngineText( pEditEngine );
502*cdf0e10cSrcweir 
503*cdf0e10cSrcweir             // update module in basic
504*cdf0e10cSrcweir #ifdef DBG_UTIL
505*cdf0e10cSrcweir             SbModule* pModule = pModulWindow->GetSbModule();
506*cdf0e10cSrcweir #endif
507*cdf0e10cSrcweir             DBG_ASSERT(pModule, "EditorWindow::SetSourceInBasic: No Module found!");
508*cdf0e10cSrcweir 
509*cdf0e10cSrcweir             // update module in module window
510*cdf0e10cSrcweir             pModulWindow->SetModule( aModule );
511*cdf0e10cSrcweir 
512*cdf0e10cSrcweir             // update module in library
513*cdf0e10cSrcweir             ScriptDocument aDocument( pModulWindow->GetDocument() );
514*cdf0e10cSrcweir             String aLibName = pModulWindow->GetLibName();
515*cdf0e10cSrcweir             String aName = pModulWindow->GetName();
516*cdf0e10cSrcweir             OSL_VERIFY( aDocument.updateModule( aLibName, aName, aModule ) );
517*cdf0e10cSrcweir 
518*cdf0e10cSrcweir             pEditEngine->SetModified( sal_False );
519*cdf0e10cSrcweir             BasicIDE::MarkDocumentModified( aDocument );
520*cdf0e10cSrcweir             bChanged = sal_True;
521*cdf0e10cSrcweir         }
522*cdf0e10cSrcweir     }
523*cdf0e10cSrcweir     return bChanged;
524*cdf0e10cSrcweir }
525*cdf0e10cSrcweir 
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir // Returns the position of the last character of any of the following
528*cdf0e10cSrcweir // EOL char combinations: CR, CR/LF, LF, return -1 if no EOL is found
529*cdf0e10cSrcweir sal_Int32 searchEOL( const ::rtl::OUString& rStr, sal_Int32 fromIndex )
530*cdf0e10cSrcweir {
531*cdf0e10cSrcweir     sal_Int32 iRetPos = -1;
532*cdf0e10cSrcweir 
533*cdf0e10cSrcweir     sal_Int32 iLF = rStr.indexOf( LINE_SEP, fromIndex );
534*cdf0e10cSrcweir     if( iLF != -1 )
535*cdf0e10cSrcweir     {
536*cdf0e10cSrcweir         iRetPos = iLF;
537*cdf0e10cSrcweir     }
538*cdf0e10cSrcweir     else
539*cdf0e10cSrcweir     {
540*cdf0e10cSrcweir         iRetPos = rStr.indexOf( LINE_SEP_CR, fromIndex );
541*cdf0e10cSrcweir     }
542*cdf0e10cSrcweir     return iRetPos;
543*cdf0e10cSrcweir }
544*cdf0e10cSrcweir 
545*cdf0e10cSrcweir 
546*cdf0e10cSrcweir void EditorWindow::CreateEditEngine()
547*cdf0e10cSrcweir {
548*cdf0e10cSrcweir     if ( pEditEngine )
549*cdf0e10cSrcweir         return;
550*cdf0e10cSrcweir 
551*cdf0e10cSrcweir     pEditEngine = new ExtTextEngine;
552*cdf0e10cSrcweir     pEditView = new ExtTextView( pEditEngine, this );
553*cdf0e10cSrcweir     pEditView->SetAutoIndentMode( sal_True );
554*cdf0e10cSrcweir     pEditEngine->SetUpdateMode( sal_False );
555*cdf0e10cSrcweir     pEditEngine->InsertView( pEditView );
556*cdf0e10cSrcweir 
557*cdf0e10cSrcweir     ImplSetFont();
558*cdf0e10cSrcweir 
559*cdf0e10cSrcweir     aSyntaxIdleTimer.SetTimeout( 200 );
560*cdf0e10cSrcweir     aSyntaxIdleTimer.SetTimeoutHdl( LINK( this, EditorWindow, SyntaxTimerHdl ) );
561*cdf0e10cSrcweir 
562*cdf0e10cSrcweir     aHighlighter.initialize( HIGHLIGHT_BASIC );
563*cdf0e10cSrcweir 
564*cdf0e10cSrcweir     sal_Bool bWasDoSyntaxHighlight = bDoSyntaxHighlight;
565*cdf0e10cSrcweir     bDoSyntaxHighlight = sal_False; // Bei grossen Texten zu langsam...
566*cdf0e10cSrcweir     ::rtl::OUString aOUSource( pModulWindow->GetModule() );
567*cdf0e10cSrcweir     sal_Int32 nLines = 0;
568*cdf0e10cSrcweir     sal_Int32 nIndex = -1;
569*cdf0e10cSrcweir     do
570*cdf0e10cSrcweir     {
571*cdf0e10cSrcweir         nLines++;
572*cdf0e10cSrcweir         nIndex = searchEOL( aOUSource, nIndex+1 );
573*cdf0e10cSrcweir     }
574*cdf0e10cSrcweir     while ( nIndex >= 0 );
575*cdf0e10cSrcweir 
576*cdf0e10cSrcweir     // nLines*4: SetText+Formatting+DoHighlight+Formatting
577*cdf0e10cSrcweir     // 1 Formatting koennte eingespart werden, aber dann wartet man
578*cdf0e10cSrcweir     // bei einem langen Sourcecode noch laenger auf den Text...
579*cdf0e10cSrcweir     pProgress = new ProgressInfo( IDE_DLL()->GetShell()->GetViewFrame()->GetObjectShell(), String( IDEResId( RID_STR_GENERATESOURCE ) ), nLines*4 );
580*cdf0e10cSrcweir     setTextEngineText( pEditEngine, aOUSource );
581*cdf0e10cSrcweir 
582*cdf0e10cSrcweir     pEditView->SetStartDocPos( Point( 0, 0 ) );
583*cdf0e10cSrcweir     pEditView->SetSelection( TextSelection() );
584*cdf0e10cSrcweir     pModulWindow->GetBreakPointWindow().GetCurYOffset() = 0;
585*cdf0e10cSrcweir     pEditEngine->SetUpdateMode( sal_True );
586*cdf0e10cSrcweir     Update();   // Es wurde bei UpdateMode = sal_True nur Invalidiert
587*cdf0e10cSrcweir 
588*cdf0e10cSrcweir     // Die anderen Fenster auch, damit keine halben Sachen auf dem Bildschirm!
589*cdf0e10cSrcweir     pModulWindow->GetLayout()->GetWatchWindow().Update();
590*cdf0e10cSrcweir     pModulWindow->GetLayout()->GetStackWindow().Update();
591*cdf0e10cSrcweir     pModulWindow->GetBreakPointWindow().Update();
592*cdf0e10cSrcweir 
593*cdf0e10cSrcweir     pEditView->ShowCursor( sal_True, sal_True );
594*cdf0e10cSrcweir 
595*cdf0e10cSrcweir     StartListening( *pEditEngine );
596*cdf0e10cSrcweir 
597*cdf0e10cSrcweir     // Das Syntax-Highlightning legt ein rel. groesse VDev an.
598*cdf0e10cSrcweir     aSyntaxIdleTimer.Stop();
599*cdf0e10cSrcweir     bDoSyntaxHighlight = bWasDoSyntaxHighlight;
600*cdf0e10cSrcweir 
601*cdf0e10cSrcweir 
602*cdf0e10cSrcweir     for ( sal_uInt16 nLine = 0; nLine < nLines; nLine++ )
603*cdf0e10cSrcweir         aSyntaxLineTable.Insert( nLine, (void*)(sal_uInt16)1 );
604*cdf0e10cSrcweir     ForceSyntaxTimeout();
605*cdf0e10cSrcweir 
606*cdf0e10cSrcweir     DELETEZ( pProgress );
607*cdf0e10cSrcweir 
608*cdf0e10cSrcweir     pEditView->EraseVirtualDevice();
609*cdf0e10cSrcweir     pEditEngine->SetModified( sal_False );
610*cdf0e10cSrcweir     pEditEngine->EnableUndo( sal_True );
611*cdf0e10cSrcweir 
612*cdf0e10cSrcweir     InitScrollBars();
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir     SfxBindings* pBindings = BasicIDE::GetBindingsPtr();
615*cdf0e10cSrcweir     if ( pBindings )
616*cdf0e10cSrcweir         pBindings->Invalidate( SID_BASICIDE_STAT_POS );
617*cdf0e10cSrcweir 
618*cdf0e10cSrcweir     DBG_ASSERT( pModulWindow->GetBreakPointWindow().GetCurYOffset() == 0, "CreateEditEngine: Brechpunkte verschoben?" );
619*cdf0e10cSrcweir 
620*cdf0e10cSrcweir     // set readonly mode for readonly libraries
621*cdf0e10cSrcweir     ScriptDocument aDocument( pModulWindow->GetDocument() );
622*cdf0e10cSrcweir     ::rtl::OUString aOULibName( pModulWindow->GetLibName() );
623*cdf0e10cSrcweir     Reference< script::XLibraryContainer2 > xModLibContainer( aDocument.getLibraryContainer( E_SCRIPTS ), UNO_QUERY );
624*cdf0e10cSrcweir     if ( xModLibContainer.is() && xModLibContainer->hasByName( aOULibName ) && xModLibContainer->isLibraryReadOnly( aOULibName ) )
625*cdf0e10cSrcweir     {
626*cdf0e10cSrcweir         pModulWindow->SetReadOnly( sal_True );
627*cdf0e10cSrcweir     }
628*cdf0e10cSrcweir 
629*cdf0e10cSrcweir     if ( aDocument.isDocument() && aDocument.isReadOnly() )
630*cdf0e10cSrcweir         pModulWindow->SetReadOnly( sal_True );
631*cdf0e10cSrcweir }
632*cdf0e10cSrcweir 
633*cdf0e10cSrcweir // virtual
634*cdf0e10cSrcweir void EditorWindow::DataChanged(DataChangedEvent const & rDCEvt)
635*cdf0e10cSrcweir {
636*cdf0e10cSrcweir     Window::DataChanged(rDCEvt);
637*cdf0e10cSrcweir     if (rDCEvt.GetType() == DATACHANGED_SETTINGS
638*cdf0e10cSrcweir         && (rDCEvt.GetFlags() & SETTINGS_STYLE) != 0)
639*cdf0e10cSrcweir     {
640*cdf0e10cSrcweir         Color aColor(GetSettings().GetStyleSettings().GetFieldColor());
641*cdf0e10cSrcweir         if (aColor
642*cdf0e10cSrcweir             != rDCEvt.GetOldSettings()->GetStyleSettings().GetFieldColor())
643*cdf0e10cSrcweir         {
644*cdf0e10cSrcweir             SetBackground(Wallpaper(aColor));
645*cdf0e10cSrcweir             Invalidate();
646*cdf0e10cSrcweir         }
647*cdf0e10cSrcweir         if (pEditEngine != 0)
648*cdf0e10cSrcweir         {
649*cdf0e10cSrcweir             aColor = GetSettings().GetStyleSettings().GetFieldTextColor();
650*cdf0e10cSrcweir             if (aColor != rDCEvt.GetOldSettings()->
651*cdf0e10cSrcweir                 GetStyleSettings().GetFieldTextColor())
652*cdf0e10cSrcweir             {
653*cdf0e10cSrcweir                 Font aFont(pEditEngine->GetFont());
654*cdf0e10cSrcweir                 aFont.SetColor(aColor);
655*cdf0e10cSrcweir                 pEditEngine->SetFont(aFont);
656*cdf0e10cSrcweir             }
657*cdf0e10cSrcweir         }
658*cdf0e10cSrcweir     }
659*cdf0e10cSrcweir }
660*cdf0e10cSrcweir 
661*cdf0e10cSrcweir void EditorWindow::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
662*cdf0e10cSrcweir {
663*cdf0e10cSrcweir     if ( rHint.ISA( TextHint ) )
664*cdf0e10cSrcweir     {
665*cdf0e10cSrcweir         const TextHint& rTextHint = (const TextHint&)rHint;
666*cdf0e10cSrcweir         if( rTextHint.GetId() == TEXT_HINT_VIEWSCROLLED )
667*cdf0e10cSrcweir         {
668*cdf0e10cSrcweir             if ( pModulWindow->GetHScrollBar() )
669*cdf0e10cSrcweir                 pModulWindow->GetHScrollBar()->SetThumbPos( pEditView->GetStartDocPos().X() );
670*cdf0e10cSrcweir             pModulWindow->GetEditVScrollBar().SetThumbPos( pEditView->GetStartDocPos().Y() );
671*cdf0e10cSrcweir             pModulWindow->GetBreakPointWindow().DoScroll
672*cdf0e10cSrcweir                 ( 0, pModulWindow->GetBreakPointWindow().GetCurYOffset() - pEditView->GetStartDocPos().Y() );
673*cdf0e10cSrcweir         }
674*cdf0e10cSrcweir         else if( rTextHint.GetId() == TEXT_HINT_TEXTHEIGHTCHANGED )
675*cdf0e10cSrcweir         {
676*cdf0e10cSrcweir             if ( pEditView->GetStartDocPos().Y() )
677*cdf0e10cSrcweir             {
678*cdf0e10cSrcweir                 long nOutHeight = GetOutputSizePixel().Height();
679*cdf0e10cSrcweir                 long nTextHeight = pEditEngine->GetTextHeight();
680*cdf0e10cSrcweir                 if ( nTextHeight < nOutHeight )
681*cdf0e10cSrcweir                     pEditView->Scroll( 0, pEditView->GetStartDocPos().Y() );
682*cdf0e10cSrcweir             }
683*cdf0e10cSrcweir 
684*cdf0e10cSrcweir             SetScrollBarRanges();
685*cdf0e10cSrcweir         }
686*cdf0e10cSrcweir         else if( rTextHint.GetId() == TEXT_HINT_TEXTFORMATTED )
687*cdf0e10cSrcweir         {
688*cdf0e10cSrcweir             if ( pModulWindow->GetHScrollBar() )
689*cdf0e10cSrcweir             {
690*cdf0e10cSrcweir                 sal_uLong nWidth = pEditEngine->CalcTextWidth();
691*cdf0e10cSrcweir                 if ( (long)nWidth != nCurTextWidth )
692*cdf0e10cSrcweir                 {
693*cdf0e10cSrcweir                     nCurTextWidth = nWidth;
694*cdf0e10cSrcweir                     pModulWindow->GetHScrollBar()->SetRange( Range( 0, (long)nCurTextWidth-1) );
695*cdf0e10cSrcweir                     pModulWindow->GetHScrollBar()->SetThumbPos( pEditView->GetStartDocPos().X() );
696*cdf0e10cSrcweir                 }
697*cdf0e10cSrcweir             }
698*cdf0e10cSrcweir             long nPrevTextWidth = nCurTextWidth;
699*cdf0e10cSrcweir             nCurTextWidth = pEditEngine->CalcTextWidth();
700*cdf0e10cSrcweir             if ( nCurTextWidth != nPrevTextWidth )
701*cdf0e10cSrcweir                 SetScrollBarRanges();
702*cdf0e10cSrcweir         }
703*cdf0e10cSrcweir         else if( rTextHint.GetId() == TEXT_HINT_PARAINSERTED )
704*cdf0e10cSrcweir         {
705*cdf0e10cSrcweir             ParagraphInsertedDeleted( rTextHint.GetValue(), sal_True );
706*cdf0e10cSrcweir             DoDelayedSyntaxHighlight( rTextHint.GetValue() );
707*cdf0e10cSrcweir         }
708*cdf0e10cSrcweir         else if( rTextHint.GetId() == TEXT_HINT_PARAREMOVED )
709*cdf0e10cSrcweir         {
710*cdf0e10cSrcweir             ParagraphInsertedDeleted( rTextHint.GetValue(), sal_False );
711*cdf0e10cSrcweir         }
712*cdf0e10cSrcweir         else if( rTextHint.GetId() == TEXT_HINT_PARACONTENTCHANGED )
713*cdf0e10cSrcweir         {
714*cdf0e10cSrcweir             DoDelayedSyntaxHighlight( rTextHint.GetValue() );
715*cdf0e10cSrcweir         }
716*cdf0e10cSrcweir     }
717*cdf0e10cSrcweir }
718*cdf0e10cSrcweir 
719*cdf0e10cSrcweir void EditorWindow::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 )
720*cdf0e10cSrcweir {
721*cdf0e10cSrcweir     ImplSetFont();
722*cdf0e10cSrcweir }
723*cdf0e10cSrcweir 
724*cdf0e10cSrcweir void EditorWindow::SetScrollBarRanges()
725*cdf0e10cSrcweir {
726*cdf0e10cSrcweir     // Extra-Methode, nicht InitScrollBars, da auch fuer EditEngine-Events.
727*cdf0e10cSrcweir     if ( !pEditEngine )
728*cdf0e10cSrcweir         return;
729*cdf0e10cSrcweir 
730*cdf0e10cSrcweir     if ( pModulWindow->GetHScrollBar() )
731*cdf0e10cSrcweir         pModulWindow->GetHScrollBar()->SetRange( Range( 0, nCurTextWidth-1 ) );
732*cdf0e10cSrcweir 
733*cdf0e10cSrcweir     pModulWindow->GetEditVScrollBar().SetRange( Range( 0, pEditEngine->GetTextHeight()-1 ) );
734*cdf0e10cSrcweir }
735*cdf0e10cSrcweir 
736*cdf0e10cSrcweir void EditorWindow::InitScrollBars()
737*cdf0e10cSrcweir {
738*cdf0e10cSrcweir     if ( !pEditEngine )
739*cdf0e10cSrcweir         return;
740*cdf0e10cSrcweir 
741*cdf0e10cSrcweir     SetScrollBarRanges();
742*cdf0e10cSrcweir     Size aOutSz( GetOutputSizePixel() );
743*cdf0e10cSrcweir     pModulWindow->GetEditVScrollBar().SetVisibleSize( aOutSz.Height() );
744*cdf0e10cSrcweir     pModulWindow->GetEditVScrollBar().SetPageSize( aOutSz.Height() * 8 / 10 );
745*cdf0e10cSrcweir     pModulWindow->GetEditVScrollBar().SetLineSize( GetTextHeight() );
746*cdf0e10cSrcweir     pModulWindow->GetEditVScrollBar().SetThumbPos( pEditView->GetStartDocPos().Y() );
747*cdf0e10cSrcweir     pModulWindow->GetEditVScrollBar().Show();
748*cdf0e10cSrcweir 
749*cdf0e10cSrcweir     if ( pModulWindow->GetHScrollBar() )
750*cdf0e10cSrcweir     {
751*cdf0e10cSrcweir         pModulWindow->GetHScrollBar()->SetVisibleSize( aOutSz.Width() );
752*cdf0e10cSrcweir         pModulWindow->GetHScrollBar()->SetPageSize( aOutSz.Width() * 8 / 10 );
753*cdf0e10cSrcweir         pModulWindow->GetHScrollBar()->SetLineSize( GetTextWidth( 'x' ) );
754*cdf0e10cSrcweir         pModulWindow->GetHScrollBar()->SetThumbPos( pEditView->GetStartDocPos().X() );
755*cdf0e10cSrcweir         pModulWindow->GetHScrollBar()->Show();
756*cdf0e10cSrcweir     }
757*cdf0e10cSrcweir }
758*cdf0e10cSrcweir 
759*cdf0e10cSrcweir void EditorWindow::ImpDoHighlight( sal_uLong nLine )
760*cdf0e10cSrcweir {
761*cdf0e10cSrcweir     if ( bDoSyntaxHighlight )
762*cdf0e10cSrcweir     {
763*cdf0e10cSrcweir         String aLine( pEditEngine->GetText( nLine ) );
764*cdf0e10cSrcweir         Range aChanges = aHighlighter.notifyChange( nLine, 0, &aLine, 1 );
765*cdf0e10cSrcweir         if ( aChanges.Len() )
766*cdf0e10cSrcweir         {
767*cdf0e10cSrcweir             for ( long n = aChanges.Min() + 1; n <= aChanges.Max(); n++ )
768*cdf0e10cSrcweir                 aSyntaxLineTable.Insert( n, (void*)(sal_uLong)1 );
769*cdf0e10cSrcweir             aSyntaxIdleTimer.Start();
770*cdf0e10cSrcweir         }
771*cdf0e10cSrcweir 
772*cdf0e10cSrcweir         sal_Bool bWasModified = pEditEngine->IsModified();
773*cdf0e10cSrcweir         pEditEngine->RemoveAttribs( nLine, sal_True );
774*cdf0e10cSrcweir         HighlightPortions aPortions;
775*cdf0e10cSrcweir         aHighlighter.getHighlightPortions( nLine, aLine, aPortions );
776*cdf0e10cSrcweir 
777*cdf0e10cSrcweir         for ( size_t i = 0; i < aPortions.size(); i++ )
778*cdf0e10cSrcweir         {
779*cdf0e10cSrcweir             HighlightPortion& r = aPortions[i];
780*cdf0e10cSrcweir             const Color& rColor = ((ModulWindowLayout*)pModulWindow->GetLayoutWindow())->getSyntaxColor(r.tokenType);
781*cdf0e10cSrcweir             pEditEngine->SetAttrib( TextAttribFontColor( rColor ), nLine, r.nBegin, r.nEnd, sal_True );
782*cdf0e10cSrcweir         }
783*cdf0e10cSrcweir 
784*cdf0e10cSrcweir         // Das Highlighten soll kein Modify setzen
785*cdf0e10cSrcweir         pEditEngine->SetModified( bWasModified );
786*cdf0e10cSrcweir     }
787*cdf0e10cSrcweir }
788*cdf0e10cSrcweir 
789*cdf0e10cSrcweir void EditorWindow::ImplSetFont()
790*cdf0e10cSrcweir {
791*cdf0e10cSrcweir     if ( pSourceViewConfig )
792*cdf0e10cSrcweir     {
793*cdf0e10cSrcweir         String sFontName = pSourceViewConfig->GetFontName();
794*cdf0e10cSrcweir         if ( !sFontName.Len() )
795*cdf0e10cSrcweir         {
796*cdf0e10cSrcweir             Font aTmpFont( OutputDevice::GetDefaultFont( DEFAULTFONT_FIXED, Application::GetSettings().GetUILanguage(), 0 , this ) );
797*cdf0e10cSrcweir             sFontName = aTmpFont.GetName();
798*cdf0e10cSrcweir         }
799*cdf0e10cSrcweir         Size aFontSize( 0, pSourceViewConfig->GetFontHeight() );
800*cdf0e10cSrcweir         Font aFont( sFontName, aFontSize );
801*cdf0e10cSrcweir         aFont.SetColor( GetSettings().GetStyleSettings().GetFieldTextColor() );
802*cdf0e10cSrcweir         SetPointFont( aFont );
803*cdf0e10cSrcweir         aFont = GetFont();
804*cdf0e10cSrcweir 
805*cdf0e10cSrcweir         if ( pModulWindow )
806*cdf0e10cSrcweir             pModulWindow->GetBreakPointWindow().SetFont( aFont );
807*cdf0e10cSrcweir 
808*cdf0e10cSrcweir         if ( pEditEngine )
809*cdf0e10cSrcweir         {
810*cdf0e10cSrcweir             sal_Bool bModified = pEditEngine->IsModified();
811*cdf0e10cSrcweir             pEditEngine->SetFont( aFont );
812*cdf0e10cSrcweir             pEditEngine->SetModified( bModified );
813*cdf0e10cSrcweir         }
814*cdf0e10cSrcweir     }
815*cdf0e10cSrcweir }
816*cdf0e10cSrcweir 
817*cdf0e10cSrcweir void EditorWindow::DoSyntaxHighlight( sal_uLong nPara )
818*cdf0e10cSrcweir {
819*cdf0e10cSrcweir     // Durch das DelayedSyntaxHighlight kann es passieren,
820*cdf0e10cSrcweir     // dass die Zeile nicht mehr existiert!
821*cdf0e10cSrcweir     if ( nPara < pEditEngine->GetParagraphCount() )
822*cdf0e10cSrcweir     {
823*cdf0e10cSrcweir         // leider weis ich nicht, ob genau diese Zeile Modified() ...
824*cdf0e10cSrcweir         if ( pProgress )
825*cdf0e10cSrcweir             pProgress->StepProgress();
826*cdf0e10cSrcweir         ImpDoHighlight( nPara );
827*cdf0e10cSrcweir     }
828*cdf0e10cSrcweir }
829*cdf0e10cSrcweir 
830*cdf0e10cSrcweir void EditorWindow::DoDelayedSyntaxHighlight( sal_uLong nPara )
831*cdf0e10cSrcweir {
832*cdf0e10cSrcweir     // Zeile wird nur in 'Liste' aufgenommen, im TimerHdl abgearbeitet.
833*cdf0e10cSrcweir     // => Nicht Absaetze manipulieren, waehrend EditEngine formatiert.
834*cdf0e10cSrcweir     if ( pProgress )
835*cdf0e10cSrcweir         pProgress->StepProgress();
836*cdf0e10cSrcweir 
837*cdf0e10cSrcweir     if ( !bHighlightning && bDoSyntaxHighlight )
838*cdf0e10cSrcweir     {
839*cdf0e10cSrcweir         if ( bDelayHighlight )
840*cdf0e10cSrcweir         {
841*cdf0e10cSrcweir             aSyntaxLineTable.Insert( nPara, (void*)(sal_uLong)1 );
842*cdf0e10cSrcweir             aSyntaxIdleTimer.Start();
843*cdf0e10cSrcweir         }
844*cdf0e10cSrcweir         else
845*cdf0e10cSrcweir             DoSyntaxHighlight( nPara );
846*cdf0e10cSrcweir     }
847*cdf0e10cSrcweir }
848*cdf0e10cSrcweir 
849*cdf0e10cSrcweir IMPL_LINK( EditorWindow, SyntaxTimerHdl, Timer *, EMPTYARG )
850*cdf0e10cSrcweir {
851*cdf0e10cSrcweir     DBG_ASSERT( pEditView, "Noch keine View, aber Syntax-Highlight ?!" );
852*cdf0e10cSrcweir 
853*cdf0e10cSrcweir     sal_Bool bWasModified = pEditEngine->IsModified();
854*cdf0e10cSrcweir     // pEditEngine->SetUpdateMode( sal_False );
855*cdf0e10cSrcweir 
856*cdf0e10cSrcweir     bHighlightning = sal_True;
857*cdf0e10cSrcweir     sal_uInt16 nLine;
858*cdf0e10cSrcweir     void* p = aSyntaxLineTable.First();
859*cdf0e10cSrcweir     while ( p )
860*cdf0e10cSrcweir     {
861*cdf0e10cSrcweir         nLine = (sal_uInt16)aSyntaxLineTable.GetCurKey();
862*cdf0e10cSrcweir         DoSyntaxHighlight( nLine );
863*cdf0e10cSrcweir         p = aSyntaxLineTable.Next();
864*cdf0e10cSrcweir     }
865*cdf0e10cSrcweir 
866*cdf0e10cSrcweir     // MT: Removed, because of idle format now when set/remove attribs...
867*cdf0e10cSrcweir     // pEditView->SetAutoScroll( sal_False );  // #101043# Don't scroll because of syntax highlight
868*cdf0e10cSrcweir     // pEditEngine->SetUpdateMode( sal_True );
869*cdf0e10cSrcweir     // pEditView->ShowCursor( sal_False, sal_True );
870*cdf0e10cSrcweir     // pEditView->SetAutoScroll( sal_True );
871*cdf0e10cSrcweir 
872*cdf0e10cSrcweir     // #i45572#
873*cdf0e10cSrcweir     if ( pEditView )
874*cdf0e10cSrcweir         pEditView->ShowCursor( sal_False, sal_True );
875*cdf0e10cSrcweir 
876*cdf0e10cSrcweir     pEditEngine->SetModified( bWasModified );
877*cdf0e10cSrcweir 
878*cdf0e10cSrcweir     aSyntaxLineTable.Clear();
879*cdf0e10cSrcweir     bHighlightning = sal_False;
880*cdf0e10cSrcweir 
881*cdf0e10cSrcweir     return 0;
882*cdf0e10cSrcweir }
883*cdf0e10cSrcweir 
884*cdf0e10cSrcweir void EditorWindow::ParagraphInsertedDeleted( sal_uLong nPara, sal_Bool bInserted )
885*cdf0e10cSrcweir {
886*cdf0e10cSrcweir     if ( pProgress )
887*cdf0e10cSrcweir         pProgress->StepProgress();
888*cdf0e10cSrcweir 
889*cdf0e10cSrcweir     if ( !bInserted && ( nPara == TEXT_PARA_ALL ) )
890*cdf0e10cSrcweir     {
891*cdf0e10cSrcweir         pModulWindow->GetBreakPoints().reset();
892*cdf0e10cSrcweir         pModulWindow->GetBreakPointWindow().Invalidate();
893*cdf0e10cSrcweir         aHighlighter.initialize( HIGHLIGHT_BASIC );
894*cdf0e10cSrcweir     }
895*cdf0e10cSrcweir     else
896*cdf0e10cSrcweir     {
897*cdf0e10cSrcweir         // Brechpunkte Aktualisieren...
898*cdf0e10cSrcweir         // keine Sonderbehandlung fuer EditEngine-CTOR ( Erste-Zeile-Problem ),
899*cdf0e10cSrcweir         // da in diesem Moment noch keine BreakPoints.
900*cdf0e10cSrcweir         // +1: Basic-Zeilen beginnen bei 1!
901*cdf0e10cSrcweir         pModulWindow->GetBreakPoints().AdjustBreakPoints( (sal_uInt16)nPara+1, bInserted );
902*cdf0e10cSrcweir 
903*cdf0e10cSrcweir         // Im BreakPointWindow invalidieren...
904*cdf0e10cSrcweir         long nLineHeight = GetTextHeight();
905*cdf0e10cSrcweir         Size aSz = pModulWindow->GetBreakPointWindow().GetOutputSize();
906*cdf0e10cSrcweir         Rectangle aInvRec( Point( 0, 0 ), aSz );
907*cdf0e10cSrcweir         long nY = nPara*nLineHeight - pModulWindow->GetBreakPointWindow().GetCurYOffset();
908*cdf0e10cSrcweir         aInvRec.Top() = nY;
909*cdf0e10cSrcweir         pModulWindow->GetBreakPointWindow().Invalidate( aInvRec );
910*cdf0e10cSrcweir 
911*cdf0e10cSrcweir         if ( bDoSyntaxHighlight )
912*cdf0e10cSrcweir         {
913*cdf0e10cSrcweir             String aDummy;
914*cdf0e10cSrcweir             aHighlighter.notifyChange( nPara, bInserted ? 1 : (-1), &aDummy, 1 );
915*cdf0e10cSrcweir         }
916*cdf0e10cSrcweir     }
917*cdf0e10cSrcweir }
918*cdf0e10cSrcweir 
919*cdf0e10cSrcweir void EditorWindow::CreateProgress( const String& rText, sal_uLong nRange )
920*cdf0e10cSrcweir {
921*cdf0e10cSrcweir     DBG_ASSERT( !pProgress, "ProgressInfo existiert schon" );
922*cdf0e10cSrcweir     pProgress = new ProgressInfo( IDE_DLL()->GetShell()->GetViewFrame()->GetObjectShell(), rText, nRange );
923*cdf0e10cSrcweir }
924*cdf0e10cSrcweir 
925*cdf0e10cSrcweir void EditorWindow::DestroyProgress()
926*cdf0e10cSrcweir {
927*cdf0e10cSrcweir     DELETEZ( pProgress );
928*cdf0e10cSrcweir }
929*cdf0e10cSrcweir 
930*cdf0e10cSrcweir void EditorWindow::ForceSyntaxTimeout()
931*cdf0e10cSrcweir {
932*cdf0e10cSrcweir     aSyntaxIdleTimer.Stop();
933*cdf0e10cSrcweir     ((Link&)aSyntaxIdleTimer.GetTimeoutHdl()).Call( &aSyntaxIdleTimer );
934*cdf0e10cSrcweir }
935*cdf0e10cSrcweir 
936*cdf0e10cSrcweir 
937*cdf0e10cSrcweir 
938*cdf0e10cSrcweir BreakPointWindow::BreakPointWindow( Window* pParent ) :
939*cdf0e10cSrcweir     Window( pParent, WB_BORDER )
940*cdf0e10cSrcweir {
941*cdf0e10cSrcweir     pModulWindow = 0;
942*cdf0e10cSrcweir     nCurYOffset = 0;
943*cdf0e10cSrcweir     setBackgroundColor(GetSettings().GetStyleSettings().GetFieldColor());
944*cdf0e10cSrcweir     m_bHighContrastMode = GetSettings().GetStyleSettings().GetHighContrastMode();
945*cdf0e10cSrcweir     nMarkerPos = MARKER_NOMARKER;
946*cdf0e10cSrcweir 
947*cdf0e10cSrcweir     // nCurYOffset merken und nicht von EditEngine holen.
948*cdf0e10cSrcweir     // Falls in EditEngine autom. gescrollt wurde, wuesste ich sonst nicht,
949*cdf0e10cSrcweir     // wo ich gerade stehe.
950*cdf0e10cSrcweir 
951*cdf0e10cSrcweir     SetHelpId( HID_BASICIDE_BREAKPOINTWINDOW );
952*cdf0e10cSrcweir }
953*cdf0e10cSrcweir 
954*cdf0e10cSrcweir 
955*cdf0e10cSrcweir 
956*cdf0e10cSrcweir __EXPORT BreakPointWindow::~BreakPointWindow()
957*cdf0e10cSrcweir {
958*cdf0e10cSrcweir }
959*cdf0e10cSrcweir 
960*cdf0e10cSrcweir 
961*cdf0e10cSrcweir 
962*cdf0e10cSrcweir void __EXPORT BreakPointWindow::Resize()
963*cdf0e10cSrcweir {
964*cdf0e10cSrcweir /// Invalidate();
965*cdf0e10cSrcweir }
966*cdf0e10cSrcweir 
967*cdf0e10cSrcweir 
968*cdf0e10cSrcweir 
969*cdf0e10cSrcweir void __EXPORT BreakPointWindow::Paint( const Rectangle& )
970*cdf0e10cSrcweir {
971*cdf0e10cSrcweir     if ( SyncYOffset() )
972*cdf0e10cSrcweir         return;
973*cdf0e10cSrcweir 
974*cdf0e10cSrcweir     Size aOutSz( GetOutputSize() );
975*cdf0e10cSrcweir     long nLineHeight = GetTextHeight();
976*cdf0e10cSrcweir 
977*cdf0e10cSrcweir     Image aBrk1(((ModulWindowLayout *) pModulWindow->GetLayoutWindow())->
978*cdf0e10cSrcweir                 getImage(IMGID_BRKENABLED, m_bHighContrastMode));
979*cdf0e10cSrcweir     Image aBrk0(((ModulWindowLayout *) pModulWindow->GetLayoutWindow())->
980*cdf0e10cSrcweir                 getImage(IMGID_BRKDISABLED, m_bHighContrastMode));
981*cdf0e10cSrcweir     Size aBmpSz( aBrk1.GetSizePixel() );
982*cdf0e10cSrcweir     aBmpSz = PixelToLogic( aBmpSz );
983*cdf0e10cSrcweir     Point aBmpOff( 0, 0 );
984*cdf0e10cSrcweir     aBmpOff.X() = ( aOutSz.Width() - aBmpSz.Width() ) / 2;
985*cdf0e10cSrcweir     aBmpOff.Y() = ( nLineHeight - aBmpSz.Height() ) / 2;
986*cdf0e10cSrcweir 
987*cdf0e10cSrcweir     BreakPoint* pBrk = GetBreakPoints().First();
988*cdf0e10cSrcweir     while ( pBrk )
989*cdf0e10cSrcweir     {
990*cdf0e10cSrcweir         sal_uLong nLine = pBrk->nLine-1;
991*cdf0e10cSrcweir         sal_uLong nY = nLine*nLineHeight - nCurYOffset;
992*cdf0e10cSrcweir         DrawImage( Point( 0, nY ) + aBmpOff, pBrk->bEnabled ? aBrk1 : aBrk0 );
993*cdf0e10cSrcweir         pBrk = GetBreakPoints().Next();
994*cdf0e10cSrcweir     }
995*cdf0e10cSrcweir     ShowMarker( sal_True );
996*cdf0e10cSrcweir }
997*cdf0e10cSrcweir 
998*cdf0e10cSrcweir 
999*cdf0e10cSrcweir 
1000*cdf0e10cSrcweir void BreakPointWindow::DoScroll( long nHorzScroll, long nVertScroll )
1001*cdf0e10cSrcweir {
1002*cdf0e10cSrcweir     nCurYOffset -= nVertScroll;
1003*cdf0e10cSrcweir     Window::Scroll( nHorzScroll, nVertScroll );
1004*cdf0e10cSrcweir }
1005*cdf0e10cSrcweir 
1006*cdf0e10cSrcweir 
1007*cdf0e10cSrcweir 
1008*cdf0e10cSrcweir void BreakPointWindow::SetMarkerPos( sal_uInt16 nLine, sal_Bool bError )
1009*cdf0e10cSrcweir {
1010*cdf0e10cSrcweir     if ( SyncYOffset() )
1011*cdf0e10cSrcweir         Update();
1012*cdf0e10cSrcweir 
1013*cdf0e10cSrcweir     ShowMarker( sal_False );    // Alten wegzeichen...
1014*cdf0e10cSrcweir     nMarkerPos = nLine;
1015*cdf0e10cSrcweir     bErrorMarker = bError;
1016*cdf0e10cSrcweir     ShowMarker( sal_True );     // Neuen zeichnen...
1017*cdf0e10cSrcweir }
1018*cdf0e10cSrcweir 
1019*cdf0e10cSrcweir void BreakPointWindow::ShowMarker( sal_Bool bShow )
1020*cdf0e10cSrcweir {
1021*cdf0e10cSrcweir     if ( nMarkerPos == MARKER_NOMARKER )
1022*cdf0e10cSrcweir         return;
1023*cdf0e10cSrcweir 
1024*cdf0e10cSrcweir     Size aOutSz( GetOutputSize() );
1025*cdf0e10cSrcweir     long nLineHeight = GetTextHeight();
1026*cdf0e10cSrcweir 
1027*cdf0e10cSrcweir     Image aMarker(((ModulWindowLayout*)pModulWindow->GetLayoutWindow())->
1028*cdf0e10cSrcweir                   getImage(bErrorMarker
1029*cdf0e10cSrcweir                            ? IMGID_ERRORMARKER : IMGID_STEPMARKER,
1030*cdf0e10cSrcweir                            m_bHighContrastMode));
1031*cdf0e10cSrcweir 
1032*cdf0e10cSrcweir     Size aMarkerSz( aMarker.GetSizePixel() );
1033*cdf0e10cSrcweir     aMarkerSz = PixelToLogic( aMarkerSz );
1034*cdf0e10cSrcweir     Point aMarkerOff( 0, 0 );
1035*cdf0e10cSrcweir     aMarkerOff.X() = ( aOutSz.Width() - aMarkerSz.Width() ) / 2;
1036*cdf0e10cSrcweir     aMarkerOff.Y() = ( nLineHeight - aMarkerSz.Height() ) / 2;
1037*cdf0e10cSrcweir 
1038*cdf0e10cSrcweir     sal_uLong nY = nMarkerPos*nLineHeight - nCurYOffset;
1039*cdf0e10cSrcweir     Point aPos( 0, nY );
1040*cdf0e10cSrcweir     aPos += aMarkerOff;
1041*cdf0e10cSrcweir     if ( bShow )
1042*cdf0e10cSrcweir         DrawImage( aPos, aMarker );
1043*cdf0e10cSrcweir     else
1044*cdf0e10cSrcweir         Invalidate( Rectangle( aPos, aMarkerSz ) );
1045*cdf0e10cSrcweir }
1046*cdf0e10cSrcweir 
1047*cdf0e10cSrcweir 
1048*cdf0e10cSrcweir 
1049*cdf0e10cSrcweir 
1050*cdf0e10cSrcweir BreakPoint* BreakPointWindow::FindBreakPoint( const Point& rMousePos )
1051*cdf0e10cSrcweir {
1052*cdf0e10cSrcweir     long nLineHeight = GetTextHeight();
1053*cdf0e10cSrcweir     long nYPos = rMousePos.Y() + nCurYOffset;
1054*cdf0e10cSrcweir //  Image aBrk( ((ModulWindowLayout*)pModulWindow->GetLayoutWindow())->GetImage( IMGID_BRKENABLED ) );
1055*cdf0e10cSrcweir //  Size aBmpSz( aBrk.GetSizePixel() );
1056*cdf0e10cSrcweir //  aBmpSz = PixelToLogic( aBmpSz );
1057*cdf0e10cSrcweir 
1058*cdf0e10cSrcweir     BreakPoint* pBrk = GetBreakPoints().First();
1059*cdf0e10cSrcweir     while ( pBrk )
1060*cdf0e10cSrcweir     {
1061*cdf0e10cSrcweir         sal_uLong nLine = pBrk->nLine-1;
1062*cdf0e10cSrcweir         long nY = nLine*nLineHeight;
1063*cdf0e10cSrcweir         if ( ( nYPos > nY ) && ( nYPos < ( nY + nLineHeight ) ) )
1064*cdf0e10cSrcweir             return pBrk;
1065*cdf0e10cSrcweir         pBrk = GetBreakPoints().Next();
1066*cdf0e10cSrcweir     }
1067*cdf0e10cSrcweir     return 0;
1068*cdf0e10cSrcweir }
1069*cdf0e10cSrcweir 
1070*cdf0e10cSrcweir void __EXPORT BreakPointWindow::MouseButtonDown( const MouseEvent& rMEvt )
1071*cdf0e10cSrcweir {
1072*cdf0e10cSrcweir     if ( rMEvt.GetClicks() == 2 )
1073*cdf0e10cSrcweir     {
1074*cdf0e10cSrcweir         Point aMousePos( PixelToLogic( rMEvt.GetPosPixel() ) );
1075*cdf0e10cSrcweir         long nLineHeight = GetTextHeight();
1076*cdf0e10cSrcweir         long nYPos = aMousePos.Y() + nCurYOffset;
1077*cdf0e10cSrcweir         long nLine = nYPos / nLineHeight + 1;
1078*cdf0e10cSrcweir         pModulWindow->ToggleBreakPoint( (sal_uLong)nLine );
1079*cdf0e10cSrcweir         // vielleicht mal etwas genauer...
1080*cdf0e10cSrcweir         Invalidate();
1081*cdf0e10cSrcweir     }
1082*cdf0e10cSrcweir }
1083*cdf0e10cSrcweir 
1084*cdf0e10cSrcweir 
1085*cdf0e10cSrcweir 
1086*cdf0e10cSrcweir void __EXPORT BreakPointWindow::Command( const CommandEvent& rCEvt )
1087*cdf0e10cSrcweir {
1088*cdf0e10cSrcweir     if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
1089*cdf0e10cSrcweir     {
1090*cdf0e10cSrcweir         Point aPos( rCEvt.IsMouseEvent() ? rCEvt.GetMousePosPixel() : Point(1,1) );
1091*cdf0e10cSrcweir         Point aEventPos( PixelToLogic( aPos ) );
1092*cdf0e10cSrcweir         BreakPoint* pBrk = rCEvt.IsMouseEvent() ? FindBreakPoint( aEventPos ) : 0;
1093*cdf0e10cSrcweir         if ( pBrk )
1094*cdf0e10cSrcweir         {
1095*cdf0e10cSrcweir             // prueffen, ob Brechpunkt enabled....
1096*cdf0e10cSrcweir             PopupMenu aBrkPropMenu( IDEResId( RID_POPUP_BRKPROPS ) );
1097*cdf0e10cSrcweir             aBrkPropMenu.CheckItem( RID_ACTIV, pBrk->bEnabled );
1098*cdf0e10cSrcweir             switch ( aBrkPropMenu.Execute( this, aPos ) )
1099*cdf0e10cSrcweir             {
1100*cdf0e10cSrcweir                 case RID_ACTIV:
1101*cdf0e10cSrcweir                 {
1102*cdf0e10cSrcweir                     pBrk->bEnabled = pBrk->bEnabled ? sal_False : sal_True;
1103*cdf0e10cSrcweir                     pModulWindow->UpdateBreakPoint( *pBrk );
1104*cdf0e10cSrcweir                     Invalidate();
1105*cdf0e10cSrcweir                 }
1106*cdf0e10cSrcweir                 break;
1107*cdf0e10cSrcweir                 case RID_BRKPROPS:
1108*cdf0e10cSrcweir                 {
1109*cdf0e10cSrcweir                     BreakPointDialog aBrkDlg( this, GetBreakPoints() );
1110*cdf0e10cSrcweir                     aBrkDlg.SetCurrentBreakPoint( pBrk );
1111*cdf0e10cSrcweir                     aBrkDlg.Execute();
1112*cdf0e10cSrcweir                     Invalidate();
1113*cdf0e10cSrcweir                 }
1114*cdf0e10cSrcweir                 break;
1115*cdf0e10cSrcweir             }
1116*cdf0e10cSrcweir         }
1117*cdf0e10cSrcweir         else
1118*cdf0e10cSrcweir         {
1119*cdf0e10cSrcweir             PopupMenu aBrkListMenu( IDEResId( RID_POPUP_BRKDLG ) );
1120*cdf0e10cSrcweir             switch ( aBrkListMenu.Execute( this, aPos ) )
1121*cdf0e10cSrcweir             {
1122*cdf0e10cSrcweir                 case RID_BRKDLG:
1123*cdf0e10cSrcweir                 {
1124*cdf0e10cSrcweir                     BreakPointDialog aBrkDlg( this, GetBreakPoints() );
1125*cdf0e10cSrcweir                     aBrkDlg.Execute();
1126*cdf0e10cSrcweir                     Invalidate();
1127*cdf0e10cSrcweir                 }
1128*cdf0e10cSrcweir                 break;
1129*cdf0e10cSrcweir             }
1130*cdf0e10cSrcweir         }
1131*cdf0e10cSrcweir     }
1132*cdf0e10cSrcweir }
1133*cdf0e10cSrcweir 
1134*cdf0e10cSrcweir sal_Bool BreakPointWindow::SyncYOffset()
1135*cdf0e10cSrcweir {
1136*cdf0e10cSrcweir     TextView* pView = pModulWindow->GetEditView();
1137*cdf0e10cSrcweir     if ( pView )
1138*cdf0e10cSrcweir     {
1139*cdf0e10cSrcweir         long nViewYOffset = pView->GetStartDocPos().Y();
1140*cdf0e10cSrcweir         if ( nCurYOffset != nViewYOffset )
1141*cdf0e10cSrcweir         {
1142*cdf0e10cSrcweir             nCurYOffset = nViewYOffset;
1143*cdf0e10cSrcweir             Invalidate();
1144*cdf0e10cSrcweir             return sal_True;
1145*cdf0e10cSrcweir         }
1146*cdf0e10cSrcweir     }
1147*cdf0e10cSrcweir     return sal_False;
1148*cdf0e10cSrcweir }
1149*cdf0e10cSrcweir 
1150*cdf0e10cSrcweir // virtual
1151*cdf0e10cSrcweir void BreakPointWindow::DataChanged(DataChangedEvent const & rDCEvt)
1152*cdf0e10cSrcweir {
1153*cdf0e10cSrcweir     Window::DataChanged(rDCEvt);
1154*cdf0e10cSrcweir     if (rDCEvt.GetType() == DATACHANGED_SETTINGS
1155*cdf0e10cSrcweir         && (rDCEvt.GetFlags() & SETTINGS_STYLE) != 0)
1156*cdf0e10cSrcweir     {
1157*cdf0e10cSrcweir         Color aColor(GetSettings().GetStyleSettings().GetFieldColor());
1158*cdf0e10cSrcweir         if (aColor
1159*cdf0e10cSrcweir             != rDCEvt.GetOldSettings()->GetStyleSettings().GetFieldColor())
1160*cdf0e10cSrcweir         {
1161*cdf0e10cSrcweir             setBackgroundColor(aColor);
1162*cdf0e10cSrcweir             m_bHighContrastMode = GetSettings().GetStyleSettings().GetHighContrastMode();
1163*cdf0e10cSrcweir             Invalidate();
1164*cdf0e10cSrcweir         }
1165*cdf0e10cSrcweir     }
1166*cdf0e10cSrcweir }
1167*cdf0e10cSrcweir 
1168*cdf0e10cSrcweir void BreakPointWindow::setBackgroundColor(Color aColor)
1169*cdf0e10cSrcweir {
1170*cdf0e10cSrcweir     SetBackground(Wallpaper(aColor));
1171*cdf0e10cSrcweir }
1172*cdf0e10cSrcweir 
1173*cdf0e10cSrcweir 
1174*cdf0e10cSrcweir const sal_uInt16 ITEM_ID_VARIABLE = 1;
1175*cdf0e10cSrcweir const sal_uInt16 ITEM_ID_VALUE = 2;
1176*cdf0e10cSrcweir const sal_uInt16 ITEM_ID_TYPE = 3;
1177*cdf0e10cSrcweir 
1178*cdf0e10cSrcweir WatchWindow::WatchWindow( Window* pParent ) :
1179*cdf0e10cSrcweir     BasicDockingWindow( pParent ),
1180*cdf0e10cSrcweir     aWatchStr( IDEResId( RID_STR_REMOVEWATCH ) ),
1181*cdf0e10cSrcweir     aXEdit( this, IDEResId( RID_EDT_WATCHEDIT ) ),
1182*cdf0e10cSrcweir     aRemoveWatchButton( this, IDEResId( RID_IMGBTN_REMOVEWATCH ) ),
1183*cdf0e10cSrcweir     aTreeListBox( this, WB_BORDER | WB_3DLOOK | WB_HASBUTTONS | WB_HASLINES | WB_HSCROLL | WB_TABSTOP
1184*cdf0e10cSrcweir                                   | WB_HASLINESATROOT | WB_HASBUTTONSATROOT ),
1185*cdf0e10cSrcweir     aHeaderBar( this, WB_BUTTONSTYLE | WB_BORDER )
1186*cdf0e10cSrcweir {
1187*cdf0e10cSrcweir     aXEdit.SetAccessibleName(String(IDEResId( RID_STR_WATCHNAME)));
1188*cdf0e10cSrcweir     aTreeListBox.SetAccessibleName(String(IDEResId(RID_STR_WATCHNAME)));
1189*cdf0e10cSrcweir 
1190*cdf0e10cSrcweir     nVirtToolBoxHeight = aXEdit.GetSizePixel().Height() + 7;
1191*cdf0e10cSrcweir     nHeaderBarHeight = 16;
1192*cdf0e10cSrcweir 
1193*cdf0e10cSrcweir     aTreeListBox.SetHelpId(HID_BASICIDE_WATCHWINDOW_LIST);
1194*cdf0e10cSrcweir     aTreeListBox.EnableInplaceEditing( sal_True );
1195*cdf0e10cSrcweir     aTreeListBox.SetSelectHdl( LINK( this, WatchWindow, TreeListHdl ) );
1196*cdf0e10cSrcweir     aTreeListBox.SetPosPixel( Point( DWBORDER, nVirtToolBoxHeight + nHeaderBarHeight ) );
1197*cdf0e10cSrcweir     aTreeListBox.SetHighlightRange( 1, 5 );
1198*cdf0e10cSrcweir 
1199*cdf0e10cSrcweir     Point aPnt( DWBORDER, nVirtToolBoxHeight + 1 );
1200*cdf0e10cSrcweir     aHeaderBar.SetPosPixel( aPnt );
1201*cdf0e10cSrcweir     aHeaderBar.SetEndDragHdl( LINK( this, WatchWindow, implEndDragHdl ) );
1202*cdf0e10cSrcweir 
1203*cdf0e10cSrcweir     long nVarTabWidth = 220;
1204*cdf0e10cSrcweir     long nValueTabWidth = 100;
1205*cdf0e10cSrcweir     long nTypeTabWidth = 1250;
1206*cdf0e10cSrcweir     aHeaderBar.InsertItem( ITEM_ID_VARIABLE, String( IDEResId( RID_STR_WATCHVARIABLE ) ), nVarTabWidth );
1207*cdf0e10cSrcweir     aHeaderBar.InsertItem( ITEM_ID_VALUE, String( IDEResId( RID_STR_WATCHVALUE ) ), nValueTabWidth );
1208*cdf0e10cSrcweir     aHeaderBar.InsertItem( ITEM_ID_TYPE, String( IDEResId( RID_STR_WATCHTYPE ) ), nTypeTabWidth );
1209*cdf0e10cSrcweir 
1210*cdf0e10cSrcweir     long tabs[ 4 ];
1211*cdf0e10cSrcweir     tabs[ 0 ] = 3; // two tabs
1212*cdf0e10cSrcweir     tabs[ 1 ] = 0;
1213*cdf0e10cSrcweir     tabs[ 2 ] = nVarTabWidth;
1214*cdf0e10cSrcweir     tabs[ 3 ] = nVarTabWidth + nValueTabWidth;
1215*cdf0e10cSrcweir     aTreeListBox.SvHeaderTabListBox::SetTabs( tabs, MAP_PIXEL );
1216*cdf0e10cSrcweir     aTreeListBox.InitHeaderBar( &aHeaderBar );
1217*cdf0e10cSrcweir 
1218*cdf0e10cSrcweir     aTreeListBox.SetNodeDefaultImages( );
1219*cdf0e10cSrcweir 
1220*cdf0e10cSrcweir     aHeaderBar.Show();
1221*cdf0e10cSrcweir 
1222*cdf0e10cSrcweir     aRemoveWatchButton.Disable();
1223*cdf0e10cSrcweir 
1224*cdf0e10cSrcweir     aTreeListBox.Show();
1225*cdf0e10cSrcweir 
1226*cdf0e10cSrcweir     long nTextLen = GetTextWidth( aWatchStr ) + DWBORDER;
1227*cdf0e10cSrcweir     aXEdit.SetPosPixel( Point( nTextLen, 3 ) );
1228*cdf0e10cSrcweir     aXEdit.SetAccHdl( LINK( this, WatchWindow, EditAccHdl ) );
1229*cdf0e10cSrcweir     aXEdit.GetAccelerator().InsertItem( 1, KeyCode( KEY_RETURN ) );
1230*cdf0e10cSrcweir     aXEdit.GetAccelerator().InsertItem( 2, KeyCode( KEY_ESCAPE ) );
1231*cdf0e10cSrcweir     aXEdit.Show();
1232*cdf0e10cSrcweir 
1233*cdf0e10cSrcweir     aRemoveWatchButton.SetModeImage(Image(IDEResId(RID_IMG_REMOVEWATCH_HC)),
1234*cdf0e10cSrcweir                                     BMP_COLOR_HIGHCONTRAST);
1235*cdf0e10cSrcweir     aRemoveWatchButton.SetClickHdl( LINK( this, WatchWindow, ButtonHdl ) );
1236*cdf0e10cSrcweir     aRemoveWatchButton.SetPosPixel( Point( nTextLen + aXEdit.GetSizePixel().Width() + 4, 2 ) );
1237*cdf0e10cSrcweir     Size aSz( aRemoveWatchButton.GetModeImage().GetSizePixel() );
1238*cdf0e10cSrcweir     aSz.Width() += 6;
1239*cdf0e10cSrcweir     aSz.Height() += 6;
1240*cdf0e10cSrcweir     aRemoveWatchButton.SetSizePixel( aSz );
1241*cdf0e10cSrcweir     aRemoveWatchButton.Show();
1242*cdf0e10cSrcweir 
1243*cdf0e10cSrcweir     SetText( String( IDEResId( RID_STR_WATCHNAME ) ) );
1244*cdf0e10cSrcweir 
1245*cdf0e10cSrcweir     SetHelpId( HID_BASICIDE_WATCHWINDOW );
1246*cdf0e10cSrcweir 
1247*cdf0e10cSrcweir     // make watch window keyboard accessible
1248*cdf0e10cSrcweir     GetSystemWindow()->GetTaskPaneList()->AddWindow( this );
1249*cdf0e10cSrcweir }
1250*cdf0e10cSrcweir 
1251*cdf0e10cSrcweir 
1252*cdf0e10cSrcweir 
1253*cdf0e10cSrcweir __EXPORT WatchWindow::~WatchWindow()
1254*cdf0e10cSrcweir {
1255*cdf0e10cSrcweir     GetSystemWindow()->GetTaskPaneList()->RemoveWindow( this );
1256*cdf0e10cSrcweir }
1257*cdf0e10cSrcweir 
1258*cdf0e10cSrcweir 
1259*cdf0e10cSrcweir 
1260*cdf0e10cSrcweir void __EXPORT WatchWindow::Paint( const Rectangle& )
1261*cdf0e10cSrcweir {
1262*cdf0e10cSrcweir     DrawText( Point( DWBORDER, 7 ), aWatchStr );
1263*cdf0e10cSrcweir     lcl_DrawIDEWindowFrame( this );
1264*cdf0e10cSrcweir }
1265*cdf0e10cSrcweir 
1266*cdf0e10cSrcweir 
1267*cdf0e10cSrcweir 
1268*cdf0e10cSrcweir void __EXPORT WatchWindow::Resize()
1269*cdf0e10cSrcweir {
1270*cdf0e10cSrcweir     Size aSz = GetOutputSizePixel();
1271*cdf0e10cSrcweir     Size aBoxSz( aSz.Width() - 2*DWBORDER, aSz.Height() - nVirtToolBoxHeight - DWBORDER );
1272*cdf0e10cSrcweir 
1273*cdf0e10cSrcweir     if ( aBoxSz.Width() < 4 )   // < 4, weil noch Border...
1274*cdf0e10cSrcweir         aBoxSz.Width() = 0;
1275*cdf0e10cSrcweir     if ( aBoxSz.Height() < 4 )
1276*cdf0e10cSrcweir         aBoxSz.Height() = 0;
1277*cdf0e10cSrcweir 
1278*cdf0e10cSrcweir     aBoxSz.Height() -= nHeaderBarHeight;
1279*cdf0e10cSrcweir     aTreeListBox.SetSizePixel( aBoxSz );
1280*cdf0e10cSrcweir     aTreeListBox.GetHScroll()->SetPageSize( aTreeListBox.GetHScroll()->GetVisibleSize() );
1281*cdf0e10cSrcweir 
1282*cdf0e10cSrcweir     aBoxSz.Height() = nHeaderBarHeight;
1283*cdf0e10cSrcweir     aHeaderBar.SetSizePixel( aBoxSz );
1284*cdf0e10cSrcweir 
1285*cdf0e10cSrcweir     Invalidate();   //Wegen DrawLine im Paint...
1286*cdf0e10cSrcweir }
1287*cdf0e10cSrcweir 
1288*cdf0e10cSrcweir struct MemberList
1289*cdf0e10cSrcweir {
1290*cdf0e10cSrcweir     String*         mpMemberNames;
1291*cdf0e10cSrcweir     int             mnMemberCount;
1292*cdf0e10cSrcweir 
1293*cdf0e10cSrcweir     MemberList( void )
1294*cdf0e10cSrcweir         : mpMemberNames( NULL )
1295*cdf0e10cSrcweir         , mnMemberCount( 0 )
1296*cdf0e10cSrcweir     {}
1297*cdf0e10cSrcweir     ~MemberList()
1298*cdf0e10cSrcweir     {
1299*cdf0e10cSrcweir         clear();
1300*cdf0e10cSrcweir     }
1301*cdf0e10cSrcweir 
1302*cdf0e10cSrcweir     void clear( void );
1303*cdf0e10cSrcweir     void allocList( int nCount );
1304*cdf0e10cSrcweir };
1305*cdf0e10cSrcweir 
1306*cdf0e10cSrcweir void MemberList::clear( void )
1307*cdf0e10cSrcweir {
1308*cdf0e10cSrcweir     if( mnMemberCount )
1309*cdf0e10cSrcweir     {
1310*cdf0e10cSrcweir         delete[] mpMemberNames;
1311*cdf0e10cSrcweir         mnMemberCount = 0;
1312*cdf0e10cSrcweir     }
1313*cdf0e10cSrcweir }
1314*cdf0e10cSrcweir 
1315*cdf0e10cSrcweir void MemberList::allocList( int nCount )
1316*cdf0e10cSrcweir {
1317*cdf0e10cSrcweir     clear();
1318*cdf0e10cSrcweir     if( nCount > 0 )
1319*cdf0e10cSrcweir     {
1320*cdf0e10cSrcweir         mnMemberCount = nCount;
1321*cdf0e10cSrcweir         mpMemberNames = new String[ mnMemberCount ];
1322*cdf0e10cSrcweir     }
1323*cdf0e10cSrcweir }
1324*cdf0e10cSrcweir 
1325*cdf0e10cSrcweir struct WatchItem
1326*cdf0e10cSrcweir {
1327*cdf0e10cSrcweir     String          maName;
1328*cdf0e10cSrcweir     String          maDisplayName;
1329*cdf0e10cSrcweir     SbxObjectRef    mpObject;
1330*cdf0e10cSrcweir     MemberList      maMemberList;
1331*cdf0e10cSrcweir 
1332*cdf0e10cSrcweir     SbxDimArrayRef  mpArray;
1333*cdf0e10cSrcweir     int             nDimLevel;  // 0 = Root
1334*cdf0e10cSrcweir     int             nDimCount;
1335*cdf0e10cSrcweir     short*          pIndices;
1336*cdf0e10cSrcweir 
1337*cdf0e10cSrcweir     WatchItem*      mpArrayParentItem;
1338*cdf0e10cSrcweir 
1339*cdf0e10cSrcweir     WatchItem( void )
1340*cdf0e10cSrcweir         : nDimLevel( 0 )
1341*cdf0e10cSrcweir         , nDimCount( 0 )
1342*cdf0e10cSrcweir         , pIndices( NULL )
1343*cdf0e10cSrcweir         , mpArrayParentItem( NULL )
1344*cdf0e10cSrcweir     {}
1345*cdf0e10cSrcweir     ~WatchItem()
1346*cdf0e10cSrcweir         { clearWatchItem(); }
1347*cdf0e10cSrcweir 
1348*cdf0e10cSrcweir     void clearWatchItem( bool bIncludeArrayData=true )
1349*cdf0e10cSrcweir     {
1350*cdf0e10cSrcweir         mpObject = NULL;
1351*cdf0e10cSrcweir         maMemberList.clear();
1352*cdf0e10cSrcweir         if( bIncludeArrayData )
1353*cdf0e10cSrcweir         {
1354*cdf0e10cSrcweir             mpArray = NULL;
1355*cdf0e10cSrcweir             nDimLevel = 0;
1356*cdf0e10cSrcweir             nDimCount = 0;
1357*cdf0e10cSrcweir             delete[] pIndices;
1358*cdf0e10cSrcweir             pIndices = NULL;
1359*cdf0e10cSrcweir         }
1360*cdf0e10cSrcweir     }
1361*cdf0e10cSrcweir 
1362*cdf0e10cSrcweir     WatchItem* GetRootItem( void );
1363*cdf0e10cSrcweir     SbxDimArray* GetRootArray( void );
1364*cdf0e10cSrcweir };
1365*cdf0e10cSrcweir 
1366*cdf0e10cSrcweir WatchItem* WatchItem::GetRootItem( void )
1367*cdf0e10cSrcweir {
1368*cdf0e10cSrcweir     WatchItem* pItem = mpArrayParentItem;
1369*cdf0e10cSrcweir     while( pItem )
1370*cdf0e10cSrcweir     {
1371*cdf0e10cSrcweir         if( pItem->mpArray.Is() )
1372*cdf0e10cSrcweir             break;
1373*cdf0e10cSrcweir         pItem = pItem->mpArrayParentItem;
1374*cdf0e10cSrcweir     }
1375*cdf0e10cSrcweir     return pItem;
1376*cdf0e10cSrcweir }
1377*cdf0e10cSrcweir 
1378*cdf0e10cSrcweir SbxDimArray* WatchItem::GetRootArray( void )
1379*cdf0e10cSrcweir {
1380*cdf0e10cSrcweir     WatchItem* pRootItem = GetRootItem();
1381*cdf0e10cSrcweir     SbxDimArray* pRet = NULL;
1382*cdf0e10cSrcweir     if( pRootItem )
1383*cdf0e10cSrcweir         pRet = pRootItem->mpArray;
1384*cdf0e10cSrcweir     return pRet;
1385*cdf0e10cSrcweir }
1386*cdf0e10cSrcweir 
1387*cdf0e10cSrcweir void WatchWindow::AddWatch( const String& rVName )
1388*cdf0e10cSrcweir {
1389*cdf0e10cSrcweir     WatchItem* pWatchItem = new WatchItem;
1390*cdf0e10cSrcweir     String aVar, aIndex;
1391*cdf0e10cSrcweir     lcl_SeparateNameAndIndex( rVName, aVar, aIndex );
1392*cdf0e10cSrcweir     pWatchItem->maName = aVar;
1393*cdf0e10cSrcweir 
1394*cdf0e10cSrcweir     String aWatchStr_( aVar );
1395*cdf0e10cSrcweir     aWatchStr_ += String( RTL_CONSTASCII_USTRINGPARAM( "\t\t" ) );
1396*cdf0e10cSrcweir     SvLBoxEntry* pNewEntry = aTreeListBox.InsertEntry( aWatchStr_, 0, sal_True, LIST_APPEND );
1397*cdf0e10cSrcweir     pNewEntry->SetUserData( pWatchItem );
1398*cdf0e10cSrcweir 
1399*cdf0e10cSrcweir     aTreeListBox.Select( pNewEntry, sal_True );
1400*cdf0e10cSrcweir     aTreeListBox.MakeVisible( pNewEntry );
1401*cdf0e10cSrcweir     aRemoveWatchButton.Enable();
1402*cdf0e10cSrcweir }
1403*cdf0e10cSrcweir 
1404*cdf0e10cSrcweir sal_Bool WatchWindow::RemoveSelectedWatch()
1405*cdf0e10cSrcweir {
1406*cdf0e10cSrcweir     SvLBoxEntry* pEntry = aTreeListBox.GetCurEntry();
1407*cdf0e10cSrcweir     if ( pEntry )
1408*cdf0e10cSrcweir     {
1409*cdf0e10cSrcweir         aTreeListBox.GetModel()->Remove( pEntry );
1410*cdf0e10cSrcweir         pEntry = aTreeListBox.GetCurEntry();
1411*cdf0e10cSrcweir         if ( pEntry )
1412*cdf0e10cSrcweir             aXEdit.SetText( ((WatchItem*)pEntry->GetUserData())->maName );
1413*cdf0e10cSrcweir         else
1414*cdf0e10cSrcweir             aXEdit.SetText( String() );
1415*cdf0e10cSrcweir         if ( !aTreeListBox.GetEntryCount() )
1416*cdf0e10cSrcweir             aRemoveWatchButton.Disable();
1417*cdf0e10cSrcweir         return sal_True;
1418*cdf0e10cSrcweir     }
1419*cdf0e10cSrcweir     else
1420*cdf0e10cSrcweir         return sal_False;
1421*cdf0e10cSrcweir }
1422*cdf0e10cSrcweir 
1423*cdf0e10cSrcweir 
1424*cdf0e10cSrcweir IMPL_LINK_INLINE_START( WatchWindow, ButtonHdl, ImageButton *, pButton )
1425*cdf0e10cSrcweir {
1426*cdf0e10cSrcweir     if ( pButton == &aRemoveWatchButton )
1427*cdf0e10cSrcweir     {
1428*cdf0e10cSrcweir         BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
1429*cdf0e10cSrcweir         SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
1430*cdf0e10cSrcweir         SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
1431*cdf0e10cSrcweir         if( pDispatcher )
1432*cdf0e10cSrcweir         {
1433*cdf0e10cSrcweir             pDispatcher->Execute( SID_BASICIDE_REMOVEWATCH );
1434*cdf0e10cSrcweir         }
1435*cdf0e10cSrcweir     }
1436*cdf0e10cSrcweir     return 0;
1437*cdf0e10cSrcweir }
1438*cdf0e10cSrcweir IMPL_LINK_INLINE_END( WatchWindow, ButtonHdl, ImageButton *, pButton )
1439*cdf0e10cSrcweir 
1440*cdf0e10cSrcweir 
1441*cdf0e10cSrcweir 
1442*cdf0e10cSrcweir IMPL_LINK_INLINE_START( WatchWindow, TreeListHdl, SvTreeListBox *, EMPTYARG )
1443*cdf0e10cSrcweir {
1444*cdf0e10cSrcweir     SvLBoxEntry* pCurEntry = aTreeListBox.GetCurEntry();
1445*cdf0e10cSrcweir     if ( pCurEntry && pCurEntry->GetUserData() )
1446*cdf0e10cSrcweir         aXEdit.SetText( ((WatchItem*)pCurEntry->GetUserData())->maName );
1447*cdf0e10cSrcweir 
1448*cdf0e10cSrcweir     return 0;
1449*cdf0e10cSrcweir }
1450*cdf0e10cSrcweir IMPL_LINK_INLINE_END( WatchWindow, TreeListHdl, SvTreeListBox *, EMPTYARG )
1451*cdf0e10cSrcweir 
1452*cdf0e10cSrcweir 
1453*cdf0e10cSrcweir IMPL_LINK_INLINE_START( WatchWindow, implEndDragHdl, HeaderBar *, pBar )
1454*cdf0e10cSrcweir {
1455*cdf0e10cSrcweir     (void)pBar;
1456*cdf0e10cSrcweir 
1457*cdf0e10cSrcweir     const sal_Int32 TAB_WIDTH_MIN = 10;
1458*cdf0e10cSrcweir     sal_Int32 nMaxWidth =
1459*cdf0e10cSrcweir         aHeaderBar.GetSizePixel().getWidth() - 2 * TAB_WIDTH_MIN;
1460*cdf0e10cSrcweir 
1461*cdf0e10cSrcweir     sal_Int32 nVariableWith = aHeaderBar.GetItemSize( ITEM_ID_VARIABLE );
1462*cdf0e10cSrcweir     if( nVariableWith < TAB_WIDTH_MIN )
1463*cdf0e10cSrcweir         aHeaderBar.SetItemSize( ITEM_ID_VARIABLE, TAB_WIDTH_MIN );
1464*cdf0e10cSrcweir     else if( nVariableWith > nMaxWidth )
1465*cdf0e10cSrcweir         aHeaderBar.SetItemSize( ITEM_ID_VARIABLE, nMaxWidth );
1466*cdf0e10cSrcweir 
1467*cdf0e10cSrcweir     sal_Int32 nValueWith = aHeaderBar.GetItemSize( ITEM_ID_VALUE );
1468*cdf0e10cSrcweir     if( nValueWith < TAB_WIDTH_MIN )
1469*cdf0e10cSrcweir         aHeaderBar.SetItemSize( ITEM_ID_VALUE, TAB_WIDTH_MIN );
1470*cdf0e10cSrcweir     else if( nValueWith > nMaxWidth )
1471*cdf0e10cSrcweir         aHeaderBar.SetItemSize( ITEM_ID_VALUE, nMaxWidth );
1472*cdf0e10cSrcweir 
1473*cdf0e10cSrcweir     if (aHeaderBar.GetItemSize( ITEM_ID_TYPE ) < TAB_WIDTH_MIN)
1474*cdf0e10cSrcweir         aHeaderBar.SetItemSize( ITEM_ID_TYPE, TAB_WIDTH_MIN );
1475*cdf0e10cSrcweir 
1476*cdf0e10cSrcweir     sal_Int32 nPos = 0;
1477*cdf0e10cSrcweir     sal_uInt16 nTabs = aHeaderBar.GetItemCount();
1478*cdf0e10cSrcweir     // OSL_ASSERT( m_treelb->TabCount() == nTabs );
1479*cdf0e10cSrcweir     for( sal_uInt16 i = 1 ; i < nTabs ; ++i )
1480*cdf0e10cSrcweir     {
1481*cdf0e10cSrcweir         nPos += aHeaderBar.GetItemSize( i );
1482*cdf0e10cSrcweir         aTreeListBox.SetTab( i, nPos, MAP_PIXEL );
1483*cdf0e10cSrcweir     }
1484*cdf0e10cSrcweir     return 0;
1485*cdf0e10cSrcweir }
1486*cdf0e10cSrcweir IMPL_LINK_INLINE_END( WatchWindow, implEndDragHdl, HeaderBar *, pBar )
1487*cdf0e10cSrcweir 
1488*cdf0e10cSrcweir 
1489*cdf0e10cSrcweir IMPL_LINK( WatchWindow, EditAccHdl, Accelerator *, pAcc )
1490*cdf0e10cSrcweir {
1491*cdf0e10cSrcweir     switch ( pAcc->GetCurKeyCode().GetCode() )
1492*cdf0e10cSrcweir     {
1493*cdf0e10cSrcweir         case KEY_RETURN:
1494*cdf0e10cSrcweir         {
1495*cdf0e10cSrcweir             String aCurText( aXEdit.GetText() );
1496*cdf0e10cSrcweir             if ( aCurText.Len() )
1497*cdf0e10cSrcweir             {
1498*cdf0e10cSrcweir                 AddWatch( aCurText );
1499*cdf0e10cSrcweir                 aXEdit.SetSelection( Selection( 0, 0xFFFF ) );
1500*cdf0e10cSrcweir                 UpdateWatches();
1501*cdf0e10cSrcweir             }
1502*cdf0e10cSrcweir             else
1503*cdf0e10cSrcweir                 Sound::Beep();
1504*cdf0e10cSrcweir         }
1505*cdf0e10cSrcweir         break;
1506*cdf0e10cSrcweir         case KEY_ESCAPE:
1507*cdf0e10cSrcweir         {
1508*cdf0e10cSrcweir             aXEdit.SetText( String() );
1509*cdf0e10cSrcweir         }
1510*cdf0e10cSrcweir         break;
1511*cdf0e10cSrcweir     }
1512*cdf0e10cSrcweir 
1513*cdf0e10cSrcweir     return 0;
1514*cdf0e10cSrcweir }
1515*cdf0e10cSrcweir 
1516*cdf0e10cSrcweir void WatchWindow::UpdateWatches( bool bBasicStopped )
1517*cdf0e10cSrcweir {
1518*cdf0e10cSrcweir     aTreeListBox.UpdateWatches( bBasicStopped );
1519*cdf0e10cSrcweir }
1520*cdf0e10cSrcweir 
1521*cdf0e10cSrcweir 
1522*cdf0e10cSrcweir StackWindow::StackWindow( Window* pParent ) :
1523*cdf0e10cSrcweir     BasicDockingWindow( pParent ),
1524*cdf0e10cSrcweir     aTreeListBox( this, WB_BORDER | WB_3DLOOK | WB_HSCROLL | WB_TABSTOP ),
1525*cdf0e10cSrcweir     aGotoCallButton( this, IDEResId( RID_IMGBTN_GOTOCALL ) ),
1526*cdf0e10cSrcweir     aStackStr( IDEResId( RID_STR_STACK ) )
1527*cdf0e10cSrcweir {
1528*cdf0e10cSrcweir     aTreeListBox.SetHelpId(HID_BASICIDE_STACKWINDOW_LIST);
1529*cdf0e10cSrcweir     aTreeListBox.SetAccessibleName(String( IDEResId(RID_STR_STACKNAME)));
1530*cdf0e10cSrcweir     aTreeListBox.SetPosPixel( Point( DWBORDER, nVirtToolBoxHeight ) );
1531*cdf0e10cSrcweir     aTreeListBox.SetHighlightRange();
1532*cdf0e10cSrcweir     aTreeListBox.SetSelectionMode( NO_SELECTION );
1533*cdf0e10cSrcweir     aTreeListBox.InsertEntry( String(), 0, sal_False, LIST_APPEND );
1534*cdf0e10cSrcweir     aTreeListBox.Show();
1535*cdf0e10cSrcweir 
1536*cdf0e10cSrcweir     SetText( String( IDEResId( RID_STR_STACKNAME ) ) );
1537*cdf0e10cSrcweir 
1538*cdf0e10cSrcweir     SetHelpId( HID_BASICIDE_STACKWINDOW );
1539*cdf0e10cSrcweir 
1540*cdf0e10cSrcweir     aGotoCallButton.SetClickHdl( LINK( this, StackWindow, ButtonHdl ) );
1541*cdf0e10cSrcweir     aGotoCallButton.SetPosPixel( Point( DWBORDER, 2 ) );
1542*cdf0e10cSrcweir     Size aSz( aGotoCallButton.GetModeImage().GetSizePixel() );
1543*cdf0e10cSrcweir     aSz.Width() += 6;
1544*cdf0e10cSrcweir     aSz.Height() += 6;
1545*cdf0e10cSrcweir     aGotoCallButton.SetSizePixel( aSz );
1546*cdf0e10cSrcweir //  aGotoCallButton.Show(); // wird vom Basic noch nicht unterstuetzt!
1547*cdf0e10cSrcweir     aGotoCallButton.Hide();
1548*cdf0e10cSrcweir 
1549*cdf0e10cSrcweir     // make stack window keyboard accessible
1550*cdf0e10cSrcweir     GetSystemWindow()->GetTaskPaneList()->AddWindow( this );
1551*cdf0e10cSrcweir }
1552*cdf0e10cSrcweir 
1553*cdf0e10cSrcweir 
1554*cdf0e10cSrcweir 
1555*cdf0e10cSrcweir __EXPORT StackWindow::~StackWindow()
1556*cdf0e10cSrcweir {
1557*cdf0e10cSrcweir     GetSystemWindow()->GetTaskPaneList()->RemoveWindow( this );
1558*cdf0e10cSrcweir }
1559*cdf0e10cSrcweir 
1560*cdf0e10cSrcweir 
1561*cdf0e10cSrcweir 
1562*cdf0e10cSrcweir void __EXPORT StackWindow::Paint( const Rectangle& )
1563*cdf0e10cSrcweir {
1564*cdf0e10cSrcweir     DrawText( Point( DWBORDER, 7 ), aStackStr );
1565*cdf0e10cSrcweir     lcl_DrawIDEWindowFrame( this );
1566*cdf0e10cSrcweir }
1567*cdf0e10cSrcweir 
1568*cdf0e10cSrcweir 
1569*cdf0e10cSrcweir 
1570*cdf0e10cSrcweir void __EXPORT StackWindow::Resize()
1571*cdf0e10cSrcweir {
1572*cdf0e10cSrcweir     Size aSz = GetOutputSizePixel();
1573*cdf0e10cSrcweir     Size aBoxSz( aSz.Width() - 2*DWBORDER, aSz.Height() - nVirtToolBoxHeight - DWBORDER );
1574*cdf0e10cSrcweir 
1575*cdf0e10cSrcweir     if ( aBoxSz.Width() < 4 )   // < 4, weil noch Border...
1576*cdf0e10cSrcweir         aBoxSz.Width() = 0;
1577*cdf0e10cSrcweir     if ( aBoxSz.Height() < 4 )
1578*cdf0e10cSrcweir         aBoxSz.Height() = 0;
1579*cdf0e10cSrcweir 
1580*cdf0e10cSrcweir     aTreeListBox.SetSizePixel( aBoxSz );
1581*cdf0e10cSrcweir 
1582*cdf0e10cSrcweir     Invalidate();   //Wegen DrawLine im Paint...
1583*cdf0e10cSrcweir }
1584*cdf0e10cSrcweir 
1585*cdf0e10cSrcweir 
1586*cdf0e10cSrcweir 
1587*cdf0e10cSrcweir IMPL_LINK_INLINE_START( StackWindow, ButtonHdl, ImageButton *, pButton )
1588*cdf0e10cSrcweir {
1589*cdf0e10cSrcweir     if ( pButton == &aGotoCallButton )
1590*cdf0e10cSrcweir     {
1591*cdf0e10cSrcweir         BasicIDEShell* pIDEShell = IDE_DLL()->GetShell();
1592*cdf0e10cSrcweir         SfxViewFrame* pViewFrame = pIDEShell ? pIDEShell->GetViewFrame() : NULL;
1593*cdf0e10cSrcweir         SfxDispatcher* pDispatcher = pViewFrame ? pViewFrame->GetDispatcher() : NULL;
1594*cdf0e10cSrcweir         if( pDispatcher )
1595*cdf0e10cSrcweir         {
1596*cdf0e10cSrcweir             pDispatcher->Execute( SID_BASICIDE_GOTOCALL );
1597*cdf0e10cSrcweir         }
1598*cdf0e10cSrcweir     }
1599*cdf0e10cSrcweir     return 0;
1600*cdf0e10cSrcweir }
1601*cdf0e10cSrcweir IMPL_LINK_INLINE_END( StackWindow, ButtonHdl, ImageButton *, pButton )
1602*cdf0e10cSrcweir 
1603*cdf0e10cSrcweir 
1604*cdf0e10cSrcweir 
1605*cdf0e10cSrcweir void __EXPORT StackWindow::UpdateCalls()
1606*cdf0e10cSrcweir {
1607*cdf0e10cSrcweir     aTreeListBox.SetUpdateMode( sal_False );
1608*cdf0e10cSrcweir     aTreeListBox.Clear();
1609*cdf0e10cSrcweir 
1610*cdf0e10cSrcweir     if ( StarBASIC::IsRunning() )
1611*cdf0e10cSrcweir     {
1612*cdf0e10cSrcweir         SbxError eOld = SbxBase::GetError();
1613*cdf0e10cSrcweir         aTreeListBox.SetSelectionMode( SINGLE_SELECTION );
1614*cdf0e10cSrcweir 
1615*cdf0e10cSrcweir         sal_uInt16 nScope = 0;
1616*cdf0e10cSrcweir         SbMethod* pMethod = StarBASIC::GetActiveMethod( nScope );
1617*cdf0e10cSrcweir         while ( pMethod )
1618*cdf0e10cSrcweir         {
1619*cdf0e10cSrcweir             String aEntry( String::CreateFromInt32(nScope ));
1620*cdf0e10cSrcweir             if ( aEntry.Len() < 2 )
1621*cdf0e10cSrcweir                 aEntry.Insert( ' ', 0 );
1622*cdf0e10cSrcweir             aEntry += String( RTL_CONSTASCII_USTRINGPARAM( ": " ) );
1623*cdf0e10cSrcweir             aEntry += pMethod->GetName();
1624*cdf0e10cSrcweir             SbxArray* pParams = pMethod->GetParameters();
1625*cdf0e10cSrcweir             SbxInfo* pInfo = pMethod->GetInfo();
1626*cdf0e10cSrcweir             if ( pParams )
1627*cdf0e10cSrcweir             {
1628*cdf0e10cSrcweir                 aEntry += '(';
1629*cdf0e10cSrcweir                 // 0 ist der Name der Sub...
1630*cdf0e10cSrcweir                 for ( sal_uInt16 nParam = 1; nParam < pParams->Count(); nParam++ )
1631*cdf0e10cSrcweir                 {
1632*cdf0e10cSrcweir                     SbxVariable* pVar = pParams->Get( nParam );
1633*cdf0e10cSrcweir                     DBG_ASSERT( pVar, "Parameter?!" );
1634*cdf0e10cSrcweir                     if ( pVar->GetName().Len() )
1635*cdf0e10cSrcweir                         aEntry += pVar->GetName();
1636*cdf0e10cSrcweir                     else if ( pInfo )
1637*cdf0e10cSrcweir                     {
1638*cdf0e10cSrcweir                         const SbxParamInfo* pParam = pInfo->GetParam( nParam );
1639*cdf0e10cSrcweir                         if ( pParam )
1640*cdf0e10cSrcweir                             aEntry += pParam->aName;
1641*cdf0e10cSrcweir                     }
1642*cdf0e10cSrcweir                     aEntry += '=';
1643*cdf0e10cSrcweir                     SbxDataType eType = pVar->GetType();
1644*cdf0e10cSrcweir                     if( eType & SbxARRAY )
1645*cdf0e10cSrcweir                         aEntry += String( RTL_CONSTASCII_USTRINGPARAM( "..." ) );
1646*cdf0e10cSrcweir                     else if( eType != SbxOBJECT )
1647*cdf0e10cSrcweir                         aEntry += pVar->GetString();
1648*cdf0e10cSrcweir                     if ( nParam < ( pParams->Count() - 1 ) )
1649*cdf0e10cSrcweir                         aEntry += String( RTL_CONSTASCII_USTRINGPARAM( ", " ) );
1650*cdf0e10cSrcweir                 }
1651*cdf0e10cSrcweir                 aEntry += ')';
1652*cdf0e10cSrcweir             }
1653*cdf0e10cSrcweir             aTreeListBox.InsertEntry( aEntry, 0, sal_False, LIST_APPEND );
1654*cdf0e10cSrcweir             nScope++;
1655*cdf0e10cSrcweir             pMethod = StarBASIC::GetActiveMethod( nScope );
1656*cdf0e10cSrcweir         }
1657*cdf0e10cSrcweir 
1658*cdf0e10cSrcweir         SbxBase::ResetError();
1659*cdf0e10cSrcweir         if( eOld != SbxERR_OK )
1660*cdf0e10cSrcweir             SbxBase::SetError( eOld );
1661*cdf0e10cSrcweir     }
1662*cdf0e10cSrcweir     else
1663*cdf0e10cSrcweir     {
1664*cdf0e10cSrcweir         aTreeListBox.SetSelectionMode( NO_SELECTION );
1665*cdf0e10cSrcweir         aTreeListBox.InsertEntry( String(), 0, sal_False, LIST_APPEND );
1666*cdf0e10cSrcweir     }
1667*cdf0e10cSrcweir 
1668*cdf0e10cSrcweir     aTreeListBox.SetUpdateMode( sal_True );
1669*cdf0e10cSrcweir }
1670*cdf0e10cSrcweir 
1671*cdf0e10cSrcweir 
1672*cdf0e10cSrcweir 
1673*cdf0e10cSrcweir 
1674*cdf0e10cSrcweir ComplexEditorWindow::ComplexEditorWindow( ModulWindow* pParent ) :
1675*cdf0e10cSrcweir     Window( pParent, WB_3DLOOK | WB_CLIPCHILDREN ),
1676*cdf0e10cSrcweir     aBrkWindow( this ),
1677*cdf0e10cSrcweir     aEdtWindow( this ),
1678*cdf0e10cSrcweir     aEWVScrollBar( this, WB_VSCROLL | WB_DRAG )
1679*cdf0e10cSrcweir {
1680*cdf0e10cSrcweir     aEdtWindow.SetModulWindow( pParent );
1681*cdf0e10cSrcweir     aBrkWindow.SetModulWindow( pParent );
1682*cdf0e10cSrcweir     aEdtWindow.Show();
1683*cdf0e10cSrcweir     aBrkWindow.Show();
1684*cdf0e10cSrcweir 
1685*cdf0e10cSrcweir     aEWVScrollBar.SetLineSize( SCROLL_LINE );
1686*cdf0e10cSrcweir     aEWVScrollBar.SetPageSize( SCROLL_PAGE );
1687*cdf0e10cSrcweir     aEWVScrollBar.SetScrollHdl( LINK( this, ComplexEditorWindow, ScrollHdl ) );
1688*cdf0e10cSrcweir     aEWVScrollBar.Show();
1689*cdf0e10cSrcweir }
1690*cdf0e10cSrcweir 
1691*cdf0e10cSrcweir 
1692*cdf0e10cSrcweir 
1693*cdf0e10cSrcweir void __EXPORT ComplexEditorWindow::Resize()
1694*cdf0e10cSrcweir {
1695*cdf0e10cSrcweir     Size aOutSz = GetOutputSizePixel();
1696*cdf0e10cSrcweir     Size aSz( aOutSz );
1697*cdf0e10cSrcweir     aSz.Width() -= 2*DWBORDER;
1698*cdf0e10cSrcweir     aSz.Height() -= 2*DWBORDER;
1699*cdf0e10cSrcweir     long nBrkWidth = 20;
1700*cdf0e10cSrcweir     long nSBWidth = aEWVScrollBar.GetSizePixel().Width();
1701*cdf0e10cSrcweir 
1702*cdf0e10cSrcweir     Size aBrkSz( Size( nBrkWidth, aSz.Height() ) );
1703*cdf0e10cSrcweir     aBrkWindow.SetPosSizePixel( Point( DWBORDER, DWBORDER ), aBrkSz );
1704*cdf0e10cSrcweir 
1705*cdf0e10cSrcweir     Size aEWSz( Size( aSz.Width() - nBrkWidth - nSBWidth + 2, aSz.Height() ) );
1706*cdf0e10cSrcweir     aEdtWindow.SetPosSizePixel( Point( DWBORDER+aBrkSz.Width()-1, DWBORDER ), aEWSz );
1707*cdf0e10cSrcweir 
1708*cdf0e10cSrcweir     aEWVScrollBar.SetPosSizePixel( Point( aOutSz.Width()-DWBORDER-nSBWidth, DWBORDER ), Size( nSBWidth, aSz.Height() ) );
1709*cdf0e10cSrcweir 
1710*cdf0e10cSrcweir     // Macht das EditorWindow, ausserdem hier falsch, da Pixel
1711*cdf0e10cSrcweir //  aEWVScrollBar.SetPageSize( aEWSz.Height() * 8 / 10 );
1712*cdf0e10cSrcweir //  aEWVScrollBar.SetVisibleSize( aSz.Height() );
1713*cdf0e10cSrcweir //  Invalidate();
1714*cdf0e10cSrcweir }
1715*cdf0e10cSrcweir 
1716*cdf0e10cSrcweir IMPL_LINK( ComplexEditorWindow, ScrollHdl, ScrollBar *, pCurScrollBar )
1717*cdf0e10cSrcweir {
1718*cdf0e10cSrcweir     if ( aEdtWindow.GetEditView() )
1719*cdf0e10cSrcweir     {
1720*cdf0e10cSrcweir         DBG_ASSERT( pCurScrollBar == &aEWVScrollBar, "Wer scrollt hier ?" );
1721*cdf0e10cSrcweir         long nDiff = aEdtWindow.GetEditView()->GetStartDocPos().Y() - pCurScrollBar->GetThumbPos();
1722*cdf0e10cSrcweir         aEdtWindow.GetEditView()->Scroll( 0, nDiff );
1723*cdf0e10cSrcweir         aBrkWindow.DoScroll( 0, nDiff );
1724*cdf0e10cSrcweir         aEdtWindow.GetEditView()->ShowCursor( sal_False, sal_True );
1725*cdf0e10cSrcweir         pCurScrollBar->SetThumbPos( aEdtWindow.GetEditView()->GetStartDocPos().Y() );
1726*cdf0e10cSrcweir     }
1727*cdf0e10cSrcweir 
1728*cdf0e10cSrcweir     return 0;
1729*cdf0e10cSrcweir }
1730*cdf0e10cSrcweir 
1731*cdf0e10cSrcweir // virtual
1732*cdf0e10cSrcweir void ComplexEditorWindow::DataChanged(DataChangedEvent const & rDCEvt)
1733*cdf0e10cSrcweir {
1734*cdf0e10cSrcweir     Window::DataChanged(rDCEvt);
1735*cdf0e10cSrcweir     if (rDCEvt.GetType() == DATACHANGED_SETTINGS
1736*cdf0e10cSrcweir         && (rDCEvt.GetFlags() & SETTINGS_STYLE) != 0)
1737*cdf0e10cSrcweir     {
1738*cdf0e10cSrcweir         Color aColor(GetSettings().GetStyleSettings().GetFaceColor());
1739*cdf0e10cSrcweir         if (aColor
1740*cdf0e10cSrcweir             != rDCEvt.GetOldSettings()->GetStyleSettings().GetFaceColor())
1741*cdf0e10cSrcweir         {
1742*cdf0e10cSrcweir             SetBackground(Wallpaper(aColor));
1743*cdf0e10cSrcweir             Invalidate();
1744*cdf0e10cSrcweir         }
1745*cdf0e10cSrcweir     }
1746*cdf0e10cSrcweir }
1747*cdf0e10cSrcweir 
1748*cdf0e10cSrcweir // virtual
1749*cdf0e10cSrcweir uno::Reference< awt::XWindowPeer >
1750*cdf0e10cSrcweir EditorWindow::GetComponentInterface(sal_Bool bCreate)
1751*cdf0e10cSrcweir {
1752*cdf0e10cSrcweir     uno::Reference< awt::XWindowPeer > xPeer(
1753*cdf0e10cSrcweir         Window::GetComponentInterface(false));
1754*cdf0e10cSrcweir     if (!xPeer.is() && bCreate)
1755*cdf0e10cSrcweir     {
1756*cdf0e10cSrcweir         // Make sure edit engine and view are available:
1757*cdf0e10cSrcweir         if (!pEditEngine)
1758*cdf0e10cSrcweir             CreateEditEngine();
1759*cdf0e10cSrcweir 
1760*cdf0e10cSrcweir         xPeer = new ::svt::TextWindowPeer(*GetEditView());
1761*cdf0e10cSrcweir         SetComponentInterface(xPeer);
1762*cdf0e10cSrcweir     }
1763*cdf0e10cSrcweir     return xPeer;
1764*cdf0e10cSrcweir }
1765*cdf0e10cSrcweir 
1766*cdf0e10cSrcweir WatchTreeListBox::WatchTreeListBox( Window* pParent, WinBits nWinBits )
1767*cdf0e10cSrcweir     : SvHeaderTabListBox( pParent, nWinBits )
1768*cdf0e10cSrcweir {}
1769*cdf0e10cSrcweir 
1770*cdf0e10cSrcweir WatchTreeListBox::~WatchTreeListBox()
1771*cdf0e10cSrcweir {
1772*cdf0e10cSrcweir     // User-Daten zerstoeren...
1773*cdf0e10cSrcweir     SvLBoxEntry* pEntry = First();
1774*cdf0e10cSrcweir     while ( pEntry )
1775*cdf0e10cSrcweir     {
1776*cdf0e10cSrcweir         delete (WatchItem*)pEntry->GetUserData();
1777*cdf0e10cSrcweir         pEntry = Next( pEntry );
1778*cdf0e10cSrcweir     }
1779*cdf0e10cSrcweir }
1780*cdf0e10cSrcweir 
1781*cdf0e10cSrcweir void WatchTreeListBox::SetTabs()
1782*cdf0e10cSrcweir {
1783*cdf0e10cSrcweir     SvHeaderTabListBox::SetTabs();
1784*cdf0e10cSrcweir     sal_uInt16 nTabCount_ = aTabs.Count();
1785*cdf0e10cSrcweir     for( sal_uInt16 i = 0 ; i < nTabCount_ ; i++ )
1786*cdf0e10cSrcweir     {
1787*cdf0e10cSrcweir         SvLBoxTab* pTab = (SvLBoxTab*)aTabs.GetObject(i);
1788*cdf0e10cSrcweir         if( i == 2 )
1789*cdf0e10cSrcweir             pTab->nFlags |= SV_LBOXTAB_EDITABLE;
1790*cdf0e10cSrcweir         else
1791*cdf0e10cSrcweir             pTab->nFlags &= ~SV_LBOXTAB_EDITABLE;
1792*cdf0e10cSrcweir     }
1793*cdf0e10cSrcweir }
1794*cdf0e10cSrcweir 
1795*cdf0e10cSrcweir void WatchTreeListBox::RequestingChilds( SvLBoxEntry * pParent )
1796*cdf0e10cSrcweir {
1797*cdf0e10cSrcweir     if( !StarBASIC::IsRunning() )
1798*cdf0e10cSrcweir         return;
1799*cdf0e10cSrcweir 
1800*cdf0e10cSrcweir     if( GetChildCount( pParent ) > 0 )
1801*cdf0e10cSrcweir         return;
1802*cdf0e10cSrcweir 
1803*cdf0e10cSrcweir     SvLBoxEntry * pEntry = pParent;
1804*cdf0e10cSrcweir     WatchItem* pItem = (WatchItem*)pEntry->GetUserData();
1805*cdf0e10cSrcweir 
1806*cdf0e10cSrcweir     SbxDimArray* pArray = pItem->mpArray;
1807*cdf0e10cSrcweir     SbxDimArray* pRootArray = pItem->GetRootArray();
1808*cdf0e10cSrcweir     bool bArrayIsRootArray = false;
1809*cdf0e10cSrcweir     if( !pArray && pRootArray )
1810*cdf0e10cSrcweir     {
1811*cdf0e10cSrcweir         pArray = pRootArray;
1812*cdf0e10cSrcweir         bArrayIsRootArray = true;
1813*cdf0e10cSrcweir     }
1814*cdf0e10cSrcweir 
1815*cdf0e10cSrcweir     SbxObject* pObj = pItem->mpObject;
1816*cdf0e10cSrcweir     if( pObj )
1817*cdf0e10cSrcweir     {
1818*cdf0e10cSrcweir         createAllObjectProperties( pObj );
1819*cdf0e10cSrcweir         SbxArray* pProps = pObj->GetProperties();
1820*cdf0e10cSrcweir         sal_uInt16 nPropCount = pProps->Count();
1821*cdf0e10cSrcweir         pItem->maMemberList.allocList( nPropCount );
1822*cdf0e10cSrcweir 
1823*cdf0e10cSrcweir         for( sal_uInt16 i = 0 ; i < nPropCount - 3 ; i++ )
1824*cdf0e10cSrcweir         {
1825*cdf0e10cSrcweir             SbxVariable* pVar = pProps->Get( i );
1826*cdf0e10cSrcweir 
1827*cdf0e10cSrcweir             String aName( pVar->GetName() );
1828*cdf0e10cSrcweir             pItem->maMemberList.mpMemberNames[i] = aName;
1829*cdf0e10cSrcweir             SvLBoxEntry* pChildEntry = SvTreeListBox::InsertEntry( aName, pEntry );
1830*cdf0e10cSrcweir             WatchItem* pChildItem = new WatchItem();
1831*cdf0e10cSrcweir             pChildItem->maName = aName;
1832*cdf0e10cSrcweir             pChildEntry->SetUserData( pChildItem );
1833*cdf0e10cSrcweir         }
1834*cdf0e10cSrcweir         if( nPropCount > 0 )
1835*cdf0e10cSrcweir         {
1836*cdf0e10cSrcweir             UpdateWatches();
1837*cdf0e10cSrcweir         }
1838*cdf0e10cSrcweir     }
1839*cdf0e10cSrcweir     else if( pArray )
1840*cdf0e10cSrcweir     {
1841*cdf0e10cSrcweir         sal_uInt16 nElementCount = 0;
1842*cdf0e10cSrcweir 
1843*cdf0e10cSrcweir         // Loop through indices of current level
1844*cdf0e10cSrcweir         int nParentLevel = bArrayIsRootArray ? pItem->nDimLevel : 0;
1845*cdf0e10cSrcweir         int nThisLevel = nParentLevel + 1;
1846*cdf0e10cSrcweir         sal_Int32 nMin, nMax;
1847*cdf0e10cSrcweir         pArray->GetDim32( nThisLevel, nMin, nMax );
1848*cdf0e10cSrcweir         for( sal_Int32 i = nMin ; i <= nMax ; i++ )
1849*cdf0e10cSrcweir         {
1850*cdf0e10cSrcweir             WatchItem* pChildItem = new WatchItem();
1851*cdf0e10cSrcweir 
1852*cdf0e10cSrcweir             // Copy data and create name
1853*cdf0e10cSrcweir             String aBaseName( pItem->maName );
1854*cdf0e10cSrcweir             pChildItem->maName = aBaseName;
1855*cdf0e10cSrcweir 
1856*cdf0e10cSrcweir             String aIndexStr = String( RTL_CONSTASCII_USTRINGPARAM( "(" ) );
1857*cdf0e10cSrcweir             // pChildItem->mpArray = pItem->mpArray;
1858*cdf0e10cSrcweir             pChildItem->mpArrayParentItem = pItem;
1859*cdf0e10cSrcweir             pChildItem->nDimLevel = nThisLevel;
1860*cdf0e10cSrcweir             pChildItem->nDimCount = pItem->nDimCount;
1861*cdf0e10cSrcweir             pChildItem->pIndices = new short[ pChildItem->nDimCount ];
1862*cdf0e10cSrcweir             sal_uInt16 j;
1863*cdf0e10cSrcweir             for( j = 0 ; j < nParentLevel ; j++ )
1864*cdf0e10cSrcweir             {
1865*cdf0e10cSrcweir                 short n = pChildItem->pIndices[j] = pItem->pIndices[j];
1866*cdf0e10cSrcweir                 aIndexStr += String::CreateFromInt32( n );
1867*cdf0e10cSrcweir                 aIndexStr += String( RTL_CONSTASCII_USTRINGPARAM( "," ) );
1868*cdf0e10cSrcweir             }
1869*cdf0e10cSrcweir             pChildItem->pIndices[ nParentLevel ] = sal::static_int_cast<short>( i );
1870*cdf0e10cSrcweir             aIndexStr += String::CreateFromInt32( i );
1871*cdf0e10cSrcweir             aIndexStr += String( RTL_CONSTASCII_USTRINGPARAM( ")" ) );
1872*cdf0e10cSrcweir 
1873*cdf0e10cSrcweir             String aDisplayName;
1874*cdf0e10cSrcweir             WatchItem* pArrayRootItem = pChildItem->GetRootItem();
1875*cdf0e10cSrcweir             if( pArrayRootItem && pArrayRootItem->mpArrayParentItem )
1876*cdf0e10cSrcweir                 aDisplayName = pItem->maDisplayName;
1877*cdf0e10cSrcweir             else
1878*cdf0e10cSrcweir                 aDisplayName = aBaseName;
1879*cdf0e10cSrcweir             aDisplayName += aIndexStr;
1880*cdf0e10cSrcweir             pChildItem->maDisplayName = aDisplayName;
1881*cdf0e10cSrcweir 
1882*cdf0e10cSrcweir             SvLBoxEntry* pChildEntry = SvTreeListBox::InsertEntry( aDisplayName, pEntry );
1883*cdf0e10cSrcweir             nElementCount++;
1884*cdf0e10cSrcweir             pChildEntry->SetUserData( pChildItem );
1885*cdf0e10cSrcweir         }
1886*cdf0e10cSrcweir         if( nElementCount > 0 )
1887*cdf0e10cSrcweir         {
1888*cdf0e10cSrcweir             UpdateWatches();
1889*cdf0e10cSrcweir         }
1890*cdf0e10cSrcweir     }
1891*cdf0e10cSrcweir }
1892*cdf0e10cSrcweir 
1893*cdf0e10cSrcweir SbxBase* WatchTreeListBox::ImplGetSBXForEntry( SvLBoxEntry* pEntry, bool& rbArrayElement )
1894*cdf0e10cSrcweir {
1895*cdf0e10cSrcweir     SbxBase* pSBX = NULL;
1896*cdf0e10cSrcweir     rbArrayElement = false;
1897*cdf0e10cSrcweir 
1898*cdf0e10cSrcweir     WatchItem* pItem = (WatchItem*)pEntry->GetUserData();
1899*cdf0e10cSrcweir     String aVName( pItem->maName );
1900*cdf0e10cSrcweir 
1901*cdf0e10cSrcweir     SvLBoxEntry* pParentEntry = GetParent( pEntry );
1902*cdf0e10cSrcweir     WatchItem* pParentItem = pParentEntry ? (WatchItem*)pParentEntry->GetUserData() : NULL;
1903*cdf0e10cSrcweir     if( pParentItem )
1904*cdf0e10cSrcweir     {
1905*cdf0e10cSrcweir         SbxObject* pObj = pParentItem->mpObject;
1906*cdf0e10cSrcweir         SbxDimArray* pArray;
1907*cdf0e10cSrcweir         if( pObj )
1908*cdf0e10cSrcweir         {
1909*cdf0e10cSrcweir             pSBX = pObj->Find( aVName, SbxCLASS_DONTCARE );
1910*cdf0e10cSrcweir 
1911*cdf0e10cSrcweir             SbxVariable* pVar;
1912*cdf0e10cSrcweir             if ( pSBX && (pVar = PTR_CAST( SbxVariable, pSBX )) != NULL
1913*cdf0e10cSrcweir                         && !pSBX->ISA( SbxMethod ) )
1914*cdf0e10cSrcweir             {
1915*cdf0e10cSrcweir                 // Force getting value
1916*cdf0e10cSrcweir                 SbxValues aRes;
1917*cdf0e10cSrcweir                 aRes.eType = SbxVOID;
1918*cdf0e10cSrcweir                 pVar->Get( aRes );
1919*cdf0e10cSrcweir             }
1920*cdf0e10cSrcweir         }
1921*cdf0e10cSrcweir         // Array?
1922*cdf0e10cSrcweir         else if( (pArray = pItem->GetRootArray()) != NULL )
1923*cdf0e10cSrcweir         // else if( (pArray = pItem->mpArray) != NULL )
1924*cdf0e10cSrcweir         {
1925*cdf0e10cSrcweir             rbArrayElement = true;
1926*cdf0e10cSrcweir             if( pParentItem->nDimLevel + 1 == pParentItem->nDimCount )
1927*cdf0e10cSrcweir             // if( pItem->nDimLevel == pItem->nDimCount )
1928*cdf0e10cSrcweir                 pSBX = pArray->Get( pItem->pIndices );
1929*cdf0e10cSrcweir             // else
1930*cdf0e10cSrcweir                 // pSBX = pArray;
1931*cdf0e10cSrcweir         }
1932*cdf0e10cSrcweir     }
1933*cdf0e10cSrcweir     else
1934*cdf0e10cSrcweir     {
1935*cdf0e10cSrcweir         pSBX = StarBASIC::FindSBXInCurrentScope( aVName );
1936*cdf0e10cSrcweir     }
1937*cdf0e10cSrcweir     return pSBX;
1938*cdf0e10cSrcweir }
1939*cdf0e10cSrcweir 
1940*cdf0e10cSrcweir sal_Bool __EXPORT WatchTreeListBox::EditingEntry( SvLBoxEntry* pEntry, Selection& )
1941*cdf0e10cSrcweir {
1942*cdf0e10cSrcweir     WatchItem* pItem = (WatchItem*)pEntry->GetUserData();
1943*cdf0e10cSrcweir 
1944*cdf0e10cSrcweir     sal_Bool bEdit = sal_False;
1945*cdf0e10cSrcweir     if ( StarBASIC::IsRunning() && StarBASIC::GetActiveMethod() && !SbxBase::IsError() )
1946*cdf0e10cSrcweir     {
1947*cdf0e10cSrcweir         // No out of scope entries
1948*cdf0e10cSrcweir         bool bArrayElement;
1949*cdf0e10cSrcweir         SbxBase* pSBX = ImplGetSBXForEntry( pEntry, bArrayElement );
1950*cdf0e10cSrcweir         if ( ( pSBX && pSBX->ISA( SbxVariable ) && !pSBX->ISA( SbxMethod ) ) || bArrayElement )
1951*cdf0e10cSrcweir         {
1952*cdf0e10cSrcweir             // Accept no objects and only end nodes of arrays for editing
1953*cdf0e10cSrcweir             if( !pItem->mpObject && (pItem->mpArray == NULL || pItem->nDimLevel == pItem->nDimCount) )
1954*cdf0e10cSrcweir             {
1955*cdf0e10cSrcweir                 aEditingRes = SvHeaderTabListBox::GetEntryText( pEntry, ITEM_ID_VALUE-1 );
1956*cdf0e10cSrcweir                 aEditingRes.EraseLeadingChars();
1957*cdf0e10cSrcweir                 aEditingRes.EraseTrailingChars();
1958*cdf0e10cSrcweir                 bEdit = sal_True;
1959*cdf0e10cSrcweir             }
1960*cdf0e10cSrcweir         }
1961*cdf0e10cSrcweir     }
1962*cdf0e10cSrcweir 
1963*cdf0e10cSrcweir     if ( !bEdit )
1964*cdf0e10cSrcweir         Sound::Beep();
1965*cdf0e10cSrcweir 
1966*cdf0e10cSrcweir     return bEdit;
1967*cdf0e10cSrcweir }
1968*cdf0e10cSrcweir 
1969*cdf0e10cSrcweir sal_Bool __EXPORT WatchTreeListBox::EditedEntry( SvLBoxEntry* pEntry, const String& rNewText )
1970*cdf0e10cSrcweir {
1971*cdf0e10cSrcweir     WatchItem* pItem = (WatchItem*)pEntry->GetUserData();
1972*cdf0e10cSrcweir     String aVName( pItem->maName );
1973*cdf0e10cSrcweir 
1974*cdf0e10cSrcweir     String aResult = rNewText;
1975*cdf0e10cSrcweir     aResult.EraseLeadingChars();
1976*cdf0e10cSrcweir     aResult.EraseTrailingChars();
1977*cdf0e10cSrcweir 
1978*cdf0e10cSrcweir     sal_uInt16 nResultLen = aResult.Len();
1979*cdf0e10cSrcweir     sal_Unicode cFirst = aResult.GetChar( 0 );
1980*cdf0e10cSrcweir     sal_Unicode cLast  = aResult.GetChar( nResultLen - 1 );
1981*cdf0e10cSrcweir     if( cFirst == '\"' && cLast == '\"' )
1982*cdf0e10cSrcweir         aResult = aResult.Copy( 1, nResultLen - 2 );
1983*cdf0e10cSrcweir 
1984*cdf0e10cSrcweir     sal_Bool bResModified = ( aResult != aEditingRes ) ? sal_True : sal_False;
1985*cdf0e10cSrcweir     sal_Bool bError = sal_False;
1986*cdf0e10cSrcweir     if ( !aVName.Len() )
1987*cdf0e10cSrcweir     {
1988*cdf0e10cSrcweir         bError = sal_True;
1989*cdf0e10cSrcweir     }
1990*cdf0e10cSrcweir 
1991*cdf0e10cSrcweir     sal_Bool bRet = sal_False;
1992*cdf0e10cSrcweir 
1993*cdf0e10cSrcweir     if ( bError )
1994*cdf0e10cSrcweir     {
1995*cdf0e10cSrcweir         Sound::Beep();
1996*cdf0e10cSrcweir     }
1997*cdf0e10cSrcweir     else if ( bResModified )
1998*cdf0e10cSrcweir     {
1999*cdf0e10cSrcweir         bRet = ImplBasicEntryEdited( pEntry, aResult );
2000*cdf0e10cSrcweir     }
2001*cdf0e10cSrcweir 
2002*cdf0e10cSrcweir     return bRet;
2003*cdf0e10cSrcweir }
2004*cdf0e10cSrcweir 
2005*cdf0e10cSrcweir sal_Bool WatchTreeListBox::ImplBasicEntryEdited( SvLBoxEntry* pEntry, const String& rResult )
2006*cdf0e10cSrcweir {
2007*cdf0e10cSrcweir     WatchItem* pItem = (WatchItem*)pEntry->GetUserData();
2008*cdf0e10cSrcweir     String aVName( pItem->maName );
2009*cdf0e10cSrcweir 
2010*cdf0e10cSrcweir     sal_Bool bError = sal_False;
2011*cdf0e10cSrcweir     String aResult( rResult );
2012*cdf0e10cSrcweir     String aIndex;
2013*cdf0e10cSrcweir     bool bArrayElement;
2014*cdf0e10cSrcweir     SbxBase* pSBX = ImplGetSBXForEntry( pEntry, bArrayElement );
2015*cdf0e10cSrcweir 
2016*cdf0e10cSrcweir     SbxBase* pToBeChanged = NULL;
2017*cdf0e10cSrcweir     if ( pSBX && pSBX->ISA( SbxVariable ) && !pSBX->ISA( SbxMethod ) )
2018*cdf0e10cSrcweir     {
2019*cdf0e10cSrcweir         SbxVariable* pVar = (SbxVariable*)pSBX;
2020*cdf0e10cSrcweir         SbxDataType eType = pVar->GetType();
2021*cdf0e10cSrcweir         if ( (sal_uInt8)eType == (sal_uInt8)SbxOBJECT )
2022*cdf0e10cSrcweir             bError = sal_True;
2023*cdf0e10cSrcweir         else if ( eType & SbxARRAY )
2024*cdf0e10cSrcweir             bError = sal_True;
2025*cdf0e10cSrcweir         else
2026*cdf0e10cSrcweir             pToBeChanged = pSBX;
2027*cdf0e10cSrcweir     }
2028*cdf0e10cSrcweir 
2029*cdf0e10cSrcweir     if ( pToBeChanged )
2030*cdf0e10cSrcweir     {
2031*cdf0e10cSrcweir         if ( pToBeChanged->ISA( SbxVariable ) )
2032*cdf0e10cSrcweir         {
2033*cdf0e10cSrcweir             // Wenn der Typ variabel ist, macht die Konvertierung des SBX nichts,
2034*cdf0e10cSrcweir             // bei festem Typ wird der String konvertiert.
2035*cdf0e10cSrcweir             ((SbxVariable*)pToBeChanged)->PutStringExt( aResult );
2036*cdf0e10cSrcweir         }
2037*cdf0e10cSrcweir         else
2038*cdf0e10cSrcweir             bError = sal_True;
2039*cdf0e10cSrcweir     }
2040*cdf0e10cSrcweir 
2041*cdf0e10cSrcweir     // Wenn jemand z.B. einen zu grossen Wert fuer ein Int eingegeben hat,
2042*cdf0e10cSrcweir     // folgt beim naechsten Step() ein Runtime-Error.
2043*cdf0e10cSrcweir     if ( SbxBase::IsError() )
2044*cdf0e10cSrcweir     {
2045*cdf0e10cSrcweir         bError = sal_True;
2046*cdf0e10cSrcweir         SbxBase::ResetError();
2047*cdf0e10cSrcweir     }
2048*cdf0e10cSrcweir 
2049*cdf0e10cSrcweir     if ( bError )
2050*cdf0e10cSrcweir         Sound::Beep();
2051*cdf0e10cSrcweir 
2052*cdf0e10cSrcweir     UpdateWatches();
2053*cdf0e10cSrcweir 
2054*cdf0e10cSrcweir     // Der Text soll niemals 1-zu-1 uebernommen werden, weil dann das
2055*cdf0e10cSrcweir     // UpdateWatches verlorengeht.
2056*cdf0e10cSrcweir     return sal_False;
2057*cdf0e10cSrcweir }
2058*cdf0e10cSrcweir 
2059*cdf0e10cSrcweir 
2060*cdf0e10cSrcweir static void implCollapseModifiedObjectEntry( SvLBoxEntry* pParent, WatchTreeListBox* pThis )
2061*cdf0e10cSrcweir {
2062*cdf0e10cSrcweir     pThis->Collapse( pParent );
2063*cdf0e10cSrcweir 
2064*cdf0e10cSrcweir     SvLBoxTreeList* pModel = pThis->GetModel();
2065*cdf0e10cSrcweir     SvLBoxEntry* pDeleteEntry;
2066*cdf0e10cSrcweir     while( (pDeleteEntry = pThis->SvTreeListBox::GetEntry( pParent, 0 )) != NULL )
2067*cdf0e10cSrcweir     {
2068*cdf0e10cSrcweir         implCollapseModifiedObjectEntry( pDeleteEntry, pThis );
2069*cdf0e10cSrcweir 
2070*cdf0e10cSrcweir         WatchItem* pItem = (WatchItem*)pDeleteEntry->GetUserData();
2071*cdf0e10cSrcweir         delete pItem;
2072*cdf0e10cSrcweir         pModel->Remove( pDeleteEntry );
2073*cdf0e10cSrcweir     }
2074*cdf0e10cSrcweir }
2075*cdf0e10cSrcweir 
2076*cdf0e10cSrcweir static String implCreateTypeStringForDimArray( WatchItem* pItem, SbxDataType eType )
2077*cdf0e10cSrcweir {
2078*cdf0e10cSrcweir     String aRetStr = getBasicTypeName( eType );
2079*cdf0e10cSrcweir 
2080*cdf0e10cSrcweir     SbxDimArray* pArray = pItem->mpArray;
2081*cdf0e10cSrcweir     if( !pArray )
2082*cdf0e10cSrcweir         pArray = pItem->GetRootArray();
2083*cdf0e10cSrcweir     if( pArray )
2084*cdf0e10cSrcweir     {
2085*cdf0e10cSrcweir         int nDimLevel = pItem->nDimLevel;
2086*cdf0e10cSrcweir         int nDims = pItem->nDimCount;
2087*cdf0e10cSrcweir         if( nDimLevel < nDims )
2088*cdf0e10cSrcweir         {
2089*cdf0e10cSrcweir             aRetStr += '(';
2090*cdf0e10cSrcweir             for( int i = nDimLevel ; i < nDims ; i++ )
2091*cdf0e10cSrcweir             {
2092*cdf0e10cSrcweir                 short nMin, nMax;
2093*cdf0e10cSrcweir                 pArray->GetDim( sal::static_int_cast<short>( i+1 ), nMin, nMax );
2094*cdf0e10cSrcweir                 aRetStr += String::CreateFromInt32( nMin );
2095*cdf0e10cSrcweir                 aRetStr += String( RTL_CONSTASCII_USTRINGPARAM( " to " ) );
2096*cdf0e10cSrcweir                 aRetStr += String::CreateFromInt32( nMax );
2097*cdf0e10cSrcweir                 if( i < nDims - 1 )
2098*cdf0e10cSrcweir                     aRetStr += String( RTL_CONSTASCII_USTRINGPARAM( ", " ) );
2099*cdf0e10cSrcweir             }
2100*cdf0e10cSrcweir             aRetStr += ')';
2101*cdf0e10cSrcweir         }
2102*cdf0e10cSrcweir     }
2103*cdf0e10cSrcweir     return aRetStr;
2104*cdf0e10cSrcweir }
2105*cdf0e10cSrcweir 
2106*cdf0e10cSrcweir 
2107*cdf0e10cSrcweir void implEnableChildren( SvLBoxEntry* pEntry, bool bEnable )
2108*cdf0e10cSrcweir // inline void implEnableChildren( SvLBoxEntry* pEntry, bool bEnable )
2109*cdf0e10cSrcweir {
2110*cdf0e10cSrcweir     if( bEnable )
2111*cdf0e10cSrcweir     {
2112*cdf0e10cSrcweir         pEntry->SetFlags(
2113*cdf0e10cSrcweir             (pEntry->GetFlags() &
2114*cdf0e10cSrcweir             ~(SV_ENTRYFLAG_NO_NODEBMP | SV_ENTRYFLAG_HAD_CHILDREN))
2115*cdf0e10cSrcweir             | SV_ENTRYFLAG_CHILDS_ON_DEMAND );
2116*cdf0e10cSrcweir     }
2117*cdf0e10cSrcweir     else
2118*cdf0e10cSrcweir     {
2119*cdf0e10cSrcweir         pEntry->SetFlags(
2120*cdf0e10cSrcweir             (pEntry->GetFlags() & ~(SV_ENTRYFLAG_CHILDS_ON_DEMAND)) );
2121*cdf0e10cSrcweir     }
2122*cdf0e10cSrcweir }
2123*cdf0e10cSrcweir 
2124*cdf0e10cSrcweir void WatchTreeListBox::UpdateWatches( bool bBasicStopped )
2125*cdf0e10cSrcweir {
2126*cdf0e10cSrcweir     SbMethod* pCurMethod = StarBASIC::GetActiveMethod();
2127*cdf0e10cSrcweir 
2128*cdf0e10cSrcweir     SbxError eOld = SbxBase::GetError();
2129*cdf0e10cSrcweir     setBasicWatchMode( true );
2130*cdf0e10cSrcweir 
2131*cdf0e10cSrcweir     SvLBoxEntry* pEntry = First();
2132*cdf0e10cSrcweir     while ( pEntry )
2133*cdf0e10cSrcweir     {
2134*cdf0e10cSrcweir         WatchItem* pItem = (WatchItem*)pEntry->GetUserData();
2135*cdf0e10cSrcweir         String aVName( pItem->maName );
2136*cdf0e10cSrcweir         DBG_ASSERT( aVName.Len(), "Var? - Darf nicht leer sein!" );
2137*cdf0e10cSrcweir         String aWatchStr;
2138*cdf0e10cSrcweir         String aTypeStr;
2139*cdf0e10cSrcweir         if ( pCurMethod )
2140*cdf0e10cSrcweir         {
2141*cdf0e10cSrcweir             bool bArrayElement;
2142*cdf0e10cSrcweir             SbxBase* pSBX = ImplGetSBXForEntry( pEntry, bArrayElement );
2143*cdf0e10cSrcweir 
2144*cdf0e10cSrcweir             // Array? If no end node create type string
2145*cdf0e10cSrcweir             if( bArrayElement && pItem->nDimLevel < pItem->nDimCount )
2146*cdf0e10cSrcweir             {
2147*cdf0e10cSrcweir                 SbxDimArray* pRootArray = pItem->GetRootArray();
2148*cdf0e10cSrcweir                 SbxDataType eType = pRootArray->GetType();
2149*cdf0e10cSrcweir                 // SbxDataType eType = pItem->mpArray->GetType();
2150*cdf0e10cSrcweir                 aTypeStr = implCreateTypeStringForDimArray( pItem, eType );
2151*cdf0e10cSrcweir                 implEnableChildren( pEntry, true );
2152*cdf0e10cSrcweir             }
2153*cdf0e10cSrcweir 
2154*cdf0e10cSrcweir             bool bCollapse = false;
2155*cdf0e10cSrcweir             if ( pSBX && pSBX->ISA( SbxVariable ) && !pSBX->ISA( SbxMethod ) )
2156*cdf0e10cSrcweir             {
2157*cdf0e10cSrcweir                 SbxVariable* pVar = (SbxVariable*)pSBX;
2158*cdf0e10cSrcweir                 // Sonderbehandlung fuer Arrays:
2159*cdf0e10cSrcweir                 SbxDataType eType = pVar->GetType();
2160*cdf0e10cSrcweir                 if ( eType & SbxARRAY )
2161*cdf0e10cSrcweir                 {
2162*cdf0e10cSrcweir                     // Mehrdimensionale Arrays beruecksichtigen!
2163*cdf0e10cSrcweir                     SbxBase* pBase = pVar->GetObject();
2164*cdf0e10cSrcweir                     if ( pBase && pBase->ISA( SbxDimArray ) )
2165*cdf0e10cSrcweir                     {
2166*cdf0e10cSrcweir                         SbxDimArray* pNewArray = (SbxDimArray*)pBase;
2167*cdf0e10cSrcweir                         SbxDimArray* pOldArray = pItem->mpArray;
2168*cdf0e10cSrcweir 
2169*cdf0e10cSrcweir                         bool bArrayChanged = false;
2170*cdf0e10cSrcweir                         if( pNewArray != NULL && pOldArray != NULL )
2171*cdf0e10cSrcweir                         {
2172*cdf0e10cSrcweir                             // Compare Array dimensions to see if array has changed
2173*cdf0e10cSrcweir                             // Can be a copy, so comparing pointers does not work
2174*cdf0e10cSrcweir                             sal_uInt16 nOldDims = pOldArray->GetDims();
2175*cdf0e10cSrcweir                             sal_uInt16 nNewDims = pNewArray->GetDims();
2176*cdf0e10cSrcweir                             if( nOldDims != nNewDims )
2177*cdf0e10cSrcweir                             {
2178*cdf0e10cSrcweir                                 bArrayChanged = true;
2179*cdf0e10cSrcweir                             }
2180*cdf0e10cSrcweir                             else
2181*cdf0e10cSrcweir                             {
2182*cdf0e10cSrcweir                                 for( int i = 0 ; i < nOldDims ; i++ )
2183*cdf0e10cSrcweir                                 {
2184*cdf0e10cSrcweir                                     short nOldMin, nOldMax;
2185*cdf0e10cSrcweir                                     short nNewMin, nNewMax;
2186*cdf0e10cSrcweir 
2187*cdf0e10cSrcweir                                     pOldArray->GetDim( sal::static_int_cast<short>( i+1 ), nOldMin, nOldMax );
2188*cdf0e10cSrcweir                                     pNewArray->GetDim( sal::static_int_cast<short>( i+1 ), nNewMin, nNewMax );
2189*cdf0e10cSrcweir                                     if( nOldMin != nNewMin || nOldMax != nNewMax )
2190*cdf0e10cSrcweir                                     {
2191*cdf0e10cSrcweir                                         bArrayChanged = true;
2192*cdf0e10cSrcweir                                         break;
2193*cdf0e10cSrcweir                                     }
2194*cdf0e10cSrcweir                                 }
2195*cdf0e10cSrcweir                             }
2196*cdf0e10cSrcweir                         }
2197*cdf0e10cSrcweir                         else if( pNewArray == NULL || pOldArray == NULL )
2198*cdf0e10cSrcweir                             bArrayChanged = true;
2199*cdf0e10cSrcweir 
2200*cdf0e10cSrcweir                         if( pNewArray )
2201*cdf0e10cSrcweir                             implEnableChildren( pEntry, true );
2202*cdf0e10cSrcweir 
2203*cdf0e10cSrcweir                         // #i37227 Clear always and replace array
2204*cdf0e10cSrcweir                         if( pNewArray != pOldArray )
2205*cdf0e10cSrcweir                         {
2206*cdf0e10cSrcweir                             pItem->clearWatchItem( false );
2207*cdf0e10cSrcweir                             if( pNewArray )
2208*cdf0e10cSrcweir                             {
2209*cdf0e10cSrcweir                                 implEnableChildren( pEntry, true );
2210*cdf0e10cSrcweir 
2211*cdf0e10cSrcweir                                 pItem->mpArray = pNewArray;
2212*cdf0e10cSrcweir                                 sal_uInt16 nDims = pNewArray->GetDims();
2213*cdf0e10cSrcweir                                 pItem->nDimLevel = 0;
2214*cdf0e10cSrcweir                                 pItem->nDimCount = nDims;
2215*cdf0e10cSrcweir                             }
2216*cdf0e10cSrcweir                         }
2217*cdf0e10cSrcweir                         if( bArrayChanged && pOldArray != NULL )
2218*cdf0e10cSrcweir                             bCollapse = true;
2219*cdf0e10cSrcweir 
2220*cdf0e10cSrcweir                         aTypeStr = implCreateTypeStringForDimArray( pItem, eType );
2221*cdf0e10cSrcweir                     }
2222*cdf0e10cSrcweir                     else
2223*cdf0e10cSrcweir                         aWatchStr += String( RTL_CONSTASCII_USTRINGPARAM( "<?>" ) );
2224*cdf0e10cSrcweir                 }
2225*cdf0e10cSrcweir                 else if ( (sal_uInt8)eType == (sal_uInt8)SbxOBJECT )
2226*cdf0e10cSrcweir                 {
2227*cdf0e10cSrcweir                     SbxObject* pObj = NULL;
2228*cdf0e10cSrcweir                     SbxBase* pBase = pVar->GetObject();
2229*cdf0e10cSrcweir                     if( pBase && pBase->ISA( SbxObject ) )
2230*cdf0e10cSrcweir                         pObj = (SbxObject*)pBase;
2231*cdf0e10cSrcweir 
2232*cdf0e10cSrcweir                     if( pObj )
2233*cdf0e10cSrcweir                     {
2234*cdf0e10cSrcweir                         // Check if member list has changed
2235*cdf0e10cSrcweir                         bool bObjChanged = false;
2236*cdf0e10cSrcweir                         if( pItem->mpObject != NULL && pItem->maMemberList.mpMemberNames != NULL )
2237*cdf0e10cSrcweir                         {
2238*cdf0e10cSrcweir                             SbxArray* pProps = pObj->GetProperties();
2239*cdf0e10cSrcweir                             sal_uInt16 nPropCount = pProps->Count();
2240*cdf0e10cSrcweir                             for( sal_uInt16 i = 0 ; i < nPropCount - 3 ; i++ )
2241*cdf0e10cSrcweir                             {
2242*cdf0e10cSrcweir                                 SbxVariable* pVar_ = pProps->Get( i );
2243*cdf0e10cSrcweir                                 String aName( pVar_->GetName() );
2244*cdf0e10cSrcweir                                 if( pItem->maMemberList.mpMemberNames[i] != aName )
2245*cdf0e10cSrcweir                                 {
2246*cdf0e10cSrcweir                                     bObjChanged = true;
2247*cdf0e10cSrcweir                                     break;
2248*cdf0e10cSrcweir                                 }
2249*cdf0e10cSrcweir                             }
2250*cdf0e10cSrcweir                             if( bObjChanged )
2251*cdf0e10cSrcweir                                 bCollapse = true;
2252*cdf0e10cSrcweir                         }
2253*cdf0e10cSrcweir 
2254*cdf0e10cSrcweir                         pItem->mpObject = pObj;
2255*cdf0e10cSrcweir                         implEnableChildren( pEntry, true );
2256*cdf0e10cSrcweir                         aTypeStr = getBasicObjectTypeName( pObj );
2257*cdf0e10cSrcweir                     }
2258*cdf0e10cSrcweir                     else
2259*cdf0e10cSrcweir                     {
2260*cdf0e10cSrcweir                         aWatchStr = String( RTL_CONSTASCII_USTRINGPARAM( "Null" ) );
2261*cdf0e10cSrcweir                         if( pItem->mpObject != NULL )
2262*cdf0e10cSrcweir                         {
2263*cdf0e10cSrcweir                             bCollapse = true;
2264*cdf0e10cSrcweir                             pItem->clearWatchItem( false );
2265*cdf0e10cSrcweir 
2266*cdf0e10cSrcweir                             implEnableChildren( pEntry, false );
2267*cdf0e10cSrcweir                         }
2268*cdf0e10cSrcweir                     }
2269*cdf0e10cSrcweir                 }
2270*cdf0e10cSrcweir                 else
2271*cdf0e10cSrcweir                 {
2272*cdf0e10cSrcweir                     if( pItem->mpObject != NULL )
2273*cdf0e10cSrcweir                     {
2274*cdf0e10cSrcweir                         bCollapse = true;
2275*cdf0e10cSrcweir                         pItem->clearWatchItem( false );
2276*cdf0e10cSrcweir 
2277*cdf0e10cSrcweir                         implEnableChildren( pEntry, false );
2278*cdf0e10cSrcweir                     }
2279*cdf0e10cSrcweir 
2280*cdf0e10cSrcweir                     bool bString = ((sal_uInt8)eType == (sal_uInt8)SbxSTRING);
2281*cdf0e10cSrcweir                     String aStrStr( RTL_CONSTASCII_USTRINGPARAM( "\"" ) );
2282*cdf0e10cSrcweir                     if( bString )
2283*cdf0e10cSrcweir                         aWatchStr += aStrStr;
2284*cdf0e10cSrcweir                     aWatchStr += pVar->GetString();
2285*cdf0e10cSrcweir                     if( bString )
2286*cdf0e10cSrcweir                         aWatchStr += aStrStr;
2287*cdf0e10cSrcweir                 }
2288*cdf0e10cSrcweir                 if( !aTypeStr.Len() )
2289*cdf0e10cSrcweir                 {
2290*cdf0e10cSrcweir                     if( !pVar->IsFixed() )
2291*cdf0e10cSrcweir                         aTypeStr = String( RTL_CONSTASCII_USTRINGPARAM( "Variant/" ) );
2292*cdf0e10cSrcweir                     aTypeStr += getBasicTypeName( pVar->GetType() );
2293*cdf0e10cSrcweir                 }
2294*cdf0e10cSrcweir             }
2295*cdf0e10cSrcweir             else if( !bArrayElement )
2296*cdf0e10cSrcweir                 aWatchStr += String( RTL_CONSTASCII_USTRINGPARAM( "<Out of Scope>" ) );
2297*cdf0e10cSrcweir 
2298*cdf0e10cSrcweir             if( bCollapse )
2299*cdf0e10cSrcweir                 implCollapseModifiedObjectEntry( pEntry, this );
2300*cdf0e10cSrcweir 
2301*cdf0e10cSrcweir         }
2302*cdf0e10cSrcweir         else if( bBasicStopped )
2303*cdf0e10cSrcweir         {
2304*cdf0e10cSrcweir             if( pItem->mpObject || pItem->mpArray )
2305*cdf0e10cSrcweir             {
2306*cdf0e10cSrcweir                 implCollapseModifiedObjectEntry( pEntry, this );
2307*cdf0e10cSrcweir                 pItem->mpObject = NULL;
2308*cdf0e10cSrcweir             }
2309*cdf0e10cSrcweir         }
2310*cdf0e10cSrcweir 
2311*cdf0e10cSrcweir         SvHeaderTabListBox::SetEntryText( aWatchStr, pEntry, ITEM_ID_VALUE-1 );
2312*cdf0e10cSrcweir         SvHeaderTabListBox::SetEntryText( aTypeStr, pEntry, ITEM_ID_TYPE-1 );
2313*cdf0e10cSrcweir 
2314*cdf0e10cSrcweir         pEntry = Next( pEntry );
2315*cdf0e10cSrcweir     }
2316*cdf0e10cSrcweir 
2317*cdf0e10cSrcweir     // Force redraw
2318*cdf0e10cSrcweir     Invalidate();
2319*cdf0e10cSrcweir 
2320*cdf0e10cSrcweir     SbxBase::ResetError();
2321*cdf0e10cSrcweir     if( eOld != SbxERR_OK )
2322*cdf0e10cSrcweir         SbxBase::SetError( eOld );
2323*cdf0e10cSrcweir     setBasicWatchMode( false );
2324*cdf0e10cSrcweir }
2325*cdf0e10cSrcweir 
2326