summaryrefslogtreecommitdiff
path: root/basic/source/app/brkpnts.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'basic/source/app/brkpnts.cxx')
-rw-r--r--basic/source/app/brkpnts.cxx384
1 files changed, 384 insertions, 0 deletions
diff --git a/basic/source/app/brkpnts.cxx b/basic/source/app/brkpnts.cxx
new file mode 100644
index 000000000000..134c5194b7aa
--- /dev/null
+++ b/basic/source/app/brkpnts.cxx
@@ -0,0 +1,384 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_basic.hxx"
+#include <basic/sbx.hxx>
+#include <basic/sbmod.hxx>
+#include <basic/sbstar.hxx>
+#include <basic/sbmeth.hxx>
+#include <vcl/image.hxx>
+#include <svtools/textdata.hxx>
+#include <tools/config.hxx>
+#include <vcl/gradient.hxx>
+
+#include <basic/ttstrhlp.hxx>
+
+#include "brkpnts.hxx"
+#include "basic.hrc"
+#include "resids.hrc"
+#include "basrid.hxx"
+
+struct Breakpoint
+{
+ sal_uInt32 nLine;
+ Breakpoint( sal_uInt32 nL ) { nLine = nL; }
+};
+
+ImageList* BreakpointWindow::pImages = NULL;
+
+BreakpointWindow::BreakpointWindow( Window *pParent )
+: Window( pParent )
+, nCurYOffset( 0 )
+, nMarkerPos( MARKER_NOMARKER )
+, pModule( NULL )
+, bErrorMarker( sal_False )
+{
+ if ( !pImages )
+ pImages = new ImageList( SttResId( RID_IMGLST_LAYOUT ) );
+
+ Gradient aGradient( GRADIENT_AXIAL, Color( 185, 182, 215 ), Color( 250, 245, 255 ) );
+ aGradient.SetAngle(900);
+ SetBackground( aGradient );
+ Show();
+}
+
+
+void BreakpointWindow::Reset()
+{
+ for ( size_t i = 0, n = BreakpointList.size(); i < n; ++i )
+ delete BreakpointList[ i ];
+ BreakpointList.clear();
+
+ pModule->ClearAllBP();
+}
+
+void BreakpointWindow::SetModule( SbModule *pMod )
+{
+ pModule = pMod;
+ sal_uInt16 i;
+ for ( i=0 ; i < pModule->GetBPCount() ; i++ )
+ {
+ InsertBreakpoint( pModule->GetBP( i ) );
+ }
+ SetBPsInModule();
+}
+
+
+void BreakpointWindow::SetBPsInModule()
+{
+ pModule->ClearAllBP();
+
+ for ( size_t i = 0, n = BreakpointList.size(); i < n; ++i )
+ {
+ Breakpoint* pBrk = BreakpointList[ i ];
+ pModule->SetBP( (sal_uInt16)pBrk->nLine );
+#if OSL_DEBUG_LEVEL > 1
+ DBG_ASSERT( !pModule->IsCompiled() || pModule->IsBP( (sal_uInt16)pBrk->nLine ), "Brechpunkt wurde nicht gesetzt" );
+#endif
+ }
+ for ( sal_uInt16 nMethod = 0; nMethod < pModule->GetMethods()->Count(); nMethod++ )
+ {
+ SbMethod* pMethod = (SbMethod*)pModule->GetMethods()->Get( nMethod );
+ DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" );
+ pMethod->SetDebugFlags( pMethod->GetDebugFlags() | SbDEBUG_BREAK );
+ }
+}
+
+
+void BreakpointWindow::InsertBreakpoint( sal_uInt32 nLine )
+{
+ Breakpoint* pNewBrk = new Breakpoint( nLine );
+
+ for ( ::std::vector< Breakpoint* >::iterator i = BreakpointList.begin();
+ i < BreakpointList.end();
+ ++ i
+ )
+ {
+ Breakpoint* pBrk = *i;
+ if ( nLine <= pBrk->nLine )
+ {
+ if ( nLine != pBrk->nLine )
+ BreakpointList.insert( i, pNewBrk );
+ else
+ delete pNewBrk;
+ pNewBrk = NULL;
+ break;
+ }
+ }
+
+ // No insert position found => LIST_APPEND
+ if ( pNewBrk )
+ BreakpointList.push_back( pNewBrk );
+
+ Invalidate();
+
+ if ( pModule->SetBP( nLine ) )
+ {
+#if OSL_DEBUG_LEVEL > 1
+ DBG_ASSERT( !pModule->IsCompiled() || pModule->IsBP( nLine ), "Brechpunkt wurde nicht gesetzt" );
+#endif
+ if ( StarBASIC::IsRunning() )
+ {
+ for ( sal_uInt16 nMethod = 0; nMethod < pModule->GetMethods()->Count(); nMethod++ )
+ {
+ SbMethod* pMethod = (SbMethod*)pModule->GetMethods()->Get( nMethod );
+ DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" );
+ pMethod->SetDebugFlags( pMethod->GetDebugFlags() | SbDEBUG_BREAK );
+ }
+ }
+ }
+#if OSL_DEBUG_LEVEL > 1
+ DBG_ASSERT( !pModule->IsCompiled() || pModule->IsBP( nLine ), "Brechpunkt wurde nicht gesetzt" );
+#endif
+}
+
+
+Breakpoint* BreakpointWindow::FindBreakpoint( sal_uInt32 nLine )
+{
+ for ( size_t i = 0, n = BreakpointList.size(); i < n; ++i )
+ {
+ Breakpoint* pBP = BreakpointList[ i ];
+ if ( pBP->nLine == nLine )
+ return pBP;
+ }
+ return NULL;
+}
+
+
+void BreakpointWindow::AdjustBreakpoints( sal_uInt32 nLine, bool bInserted )
+{
+ if ( nLine == 0 ) //TODO: nLine == TEXT_PARA_ALL+1
+ return;
+
+ for ( size_t i = 0; i < BreakpointList.size(); )
+ {
+ Breakpoint* pBrk = BreakpointList[ i ];
+ bool bDelBrk = false;
+
+ if ( pBrk->nLine == nLine )
+ {
+ if ( bInserted )
+ pBrk->nLine++;
+ else
+ bDelBrk = true;
+ }
+ else if ( pBrk->nLine > nLine )
+ {
+ if ( bInserted )
+ pBrk->nLine++;
+ else
+ pBrk->nLine--;
+ }
+ if ( bDelBrk )
+ {
+ delete pBrk;
+ ::std::vector< Breakpoint* >::iterator it = BreakpointList.begin();
+ ::std::advance( it, i );
+ BreakpointList.erase( it );
+ }
+ else
+ {
+ ++i;
+ }
+ }
+
+ Invalidate();
+}
+
+
+void BreakpointWindow::LoadBreakpoints( String aFilename )
+{
+ Config aConfig(Config::GetConfigName( Config::GetDefDirectory(), CUniString("testtool") ));
+
+ aConfig.SetGroup("Breakpoints");
+
+ ByteString aBreakpoints;
+ aBreakpoints = aConfig.ReadKey( ByteString( aFilename, RTL_TEXTENCODING_UTF8 ) );
+
+ xub_StrLen i;
+
+ for ( i = 0 ; i < aBreakpoints.GetTokenCount( ';' ) ; i++ )
+ {
+ InsertBreakpoint( (sal_uInt16)aBreakpoints.GetToken( i, ';' ).ToInt32() );
+ }
+}
+
+
+void BreakpointWindow::SaveBreakpoints( String aFilename )
+{
+ ByteString aBreakpoints;
+
+ for ( size_t i = 0, n = BreakpointList.size(); i < n; ++i )
+ {
+ Breakpoint* pBrk = BreakpointList[ i ];
+ if ( aBreakpoints.Len() )
+ aBreakpoints += ';';
+ aBreakpoints += ByteString::CreateFromInt32( pBrk->nLine );
+ }
+
+ Config aConfig(Config::GetConfigName( Config::GetDefDirectory(), CUniString("testtool") ));
+
+ aConfig.SetGroup("Breakpoints");
+
+ if ( aBreakpoints.Len() )
+ aConfig.WriteKey( ByteString( aFilename, RTL_TEXTENCODING_UTF8 ), aBreakpoints );
+ else
+ aConfig.DeleteKey( ByteString( aFilename, RTL_TEXTENCODING_UTF8 ) );
+}
+
+
+void BreakpointWindow::Paint( const Rectangle& )
+{
+ Size aOutSz( GetOutputSize() );
+ long nLineHeight = GetTextHeight();
+
+ Image aBrk( pImages->GetImage( IMGID_BRKENABLED ) );
+ Size aBmpSz( aBrk.GetSizePixel() );
+ aBmpSz = PixelToLogic( aBmpSz );
+ Point aBmpOff( 0, 0 );
+ aBmpOff.X() = ( aOutSz.Width() - aBmpSz.Width() ) / 2;
+ aBmpOff.Y() = ( nLineHeight - aBmpSz.Height() ) / 2;
+
+ for ( size_t i = 0, n = BreakpointList.size(); i < n; ++i )
+ {
+ Breakpoint* pBrk = BreakpointList[ i ];
+#if OSL_DEBUG_LEVEL > 1
+ DBG_ASSERT( !pModule->IsCompiled() || pModule->IsBP( pBrk->nLine ), "Brechpunkt wurde nicht gesetzt" );
+#endif
+ sal_Int32 nLine = pBrk->nLine-1;
+ sal_Int32 nY = nLine*nLineHeight - nCurYOffset;
+ DrawImage( Point( 0, nY ) + aBmpOff, aBrk );
+ }
+ ShowMarker( sal_True );
+}
+
+
+Breakpoint* BreakpointWindow::FindBreakpoint( const Point& rMousePos )
+{
+ sal_Int32 nLineHeight = GetTextHeight();
+ sal_Int32 nYPos = rMousePos.Y() + nCurYOffset;
+
+ for ( size_t i = 0, n = BreakpointList.size(); i < n; ++i )
+ {
+ Breakpoint* pBrk = BreakpointList[ i ];
+ sal_Int32 nLine = pBrk->nLine-1;
+ sal_Int32 nY = nLine * nLineHeight;
+ if ( ( nYPos > nY ) && ( nYPos < ( nY + nLineHeight ) ) )
+ return pBrk;
+ }
+ return NULL;
+}
+
+
+void BreakpointWindow::ToggleBreakpoint( sal_uInt32 nLine )
+{
+ bool Removed = false;
+ for ( size_t i = 0, n = BreakpointList.size(); i < n; ++i )
+ {
+ Breakpoint* pBP = BreakpointList[ i ];
+ if ( pBP->nLine == nLine ) // remove
+ {
+ pModule->ClearBP( nLine );
+ delete pBP;
+ ::std::vector< Breakpoint* >::iterator it = BreakpointList.begin();
+ ::std::advance( it, i );
+ BreakpointList.erase( it );
+ Removed = true;
+ break;
+ }
+ }
+
+ if ( !Removed ) // create one
+ InsertBreakpoint( nLine );
+
+ Invalidate();
+}
+
+void BreakpointWindow::ShowMarker( bool bShow )
+{
+ if ( nMarkerPos == MARKER_NOMARKER )
+ return;
+
+ Size aOutSz( GetOutputSize() );
+ long nLineHeight = GetTextHeight();
+
+ Image aMarker;
+ if ( bErrorMarker )
+ aMarker = pImages->GetImage( IMGID_ERRORMARKER );
+ else
+ aMarker = pImages->GetImage( IMGID_STEPMARKER );
+
+ Size aMarkerSz( aMarker.GetSizePixel() );
+ aMarkerSz = PixelToLogic( aMarkerSz );
+ Point aMarkerOff( 0, 0 );
+ aMarkerOff.X() = ( aOutSz.Width() - aMarkerSz.Width() ) / 2;
+ aMarkerOff.Y() = ( nLineHeight - aMarkerSz.Height() ) / 2;
+
+ sal_uIntPtr nY = nMarkerPos*nLineHeight - nCurYOffset;
+ Point aPos( 0, nY );
+ aPos += aMarkerOff;
+ if ( bShow )
+ DrawImage( aPos, aMarker );
+ else
+ Invalidate( Rectangle( aPos, aMarkerSz ) );
+}
+
+
+void BreakpointWindow::MouseButtonDown( const MouseEvent& rMEvt )
+{
+ if ( rMEvt.GetClicks() == 2 )
+ {
+ Point aMousePos( PixelToLogic( rMEvt.GetPosPixel() ) );
+ long nLineHeight = GetTextHeight();
+ long nYPos = aMousePos.Y() + nCurYOffset;
+ long nLine = nYPos / nLineHeight + 1;
+ ToggleBreakpoint( sal::static_int_cast< sal_uInt16 >(nLine) );
+ Invalidate();
+ }
+}
+
+
+void BreakpointWindow::SetMarkerPos( sal_uInt32 nLine, bool bError )
+{
+ ShowMarker( false ); // Remove old one
+ nMarkerPos = nLine;
+ bErrorMarker = bError;
+ ShowMarker( true ); // Draw new one
+ Update();
+}
+
+
+void BreakpointWindow::Scroll( long nHorzScroll, long nVertScroll, sal_uInt16 nFlags )
+{
+ (void) nFlags; /* avoid warning about unused parameter */
+ nCurYOffset -= nVertScroll;
+ Window::Scroll( nHorzScroll, nVertScroll );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */