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