diff options
Diffstat (limited to 'basctl/source/basicide/baside2.cxx')
-rw-r--r-- | basctl/source/basicide/baside2.cxx | 1771 |
1 files changed, 1771 insertions, 0 deletions
diff --git a/basctl/source/basicide/baside2.cxx b/basctl/source/basicide/baside2.cxx new file mode 100644 index 000000000000..d0a8ca1a6ddb --- /dev/null +++ b/basctl/source/basicide/baside2.cxx @@ -0,0 +1,1771 @@ +/************************************************************************* + * + * 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_basctl.hxx" + + +#include <ide_pch.hxx> + + +#include <svtools/texteng.hxx> +#include <svtools/textview.hxx> +#include <svtools/xtextedt.hxx> +#include <basic/sbx.hxx> +#include <comphelper/processfactory.hxx> +#include <com/sun/star/ui/dialogs/XFilePicker.hpp> +#include <com/sun/star/ui/dialogs/XFilePickerControlAccess.hpp> +#include <com/sun/star/ui/dialogs/XFilterManager.hpp> +#include <com/sun/star/ui/dialogs/TemplateDescription.hpp> +#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp> +#ifndef _COM_SUN_STAR_SCRIPT_XLIBRYARYCONTAINER2_HPP_ +#include <com/sun/star/script/XLibraryContainer2.hpp> +#endif +#include <com/sun/star/document/MacroExecMode.hpp> +#include <com/sun/star/script/ModuleType.hpp> +#include <toolkit/helper/vclunohelper.hxx> +#include <sfx2/docfile.hxx> +#include <basic/basrdll.hxx> + + +#include <baside2.hrc> +#include <baside2.hxx> +#include <objdlg.hxx> +#include <iderdll.hxx> +#include <iderdll2.hxx> + +#include <basobj.hxx> +#include <brkdlg.hxx> + +#include <svx/srchdlg.hxx> + +#include <vcl/sound.hxx> + +//#ifndef _TXTCMP_HXX //autogen +//#include <svtools/txtcmp.hxx> +//#endif + +#include <unotools/textsearch.hxx> +#include <tools/diagnose_ex.h> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + + +#define SPLIT_MARGIN 5 +#define SPLIT_HEIGHT 2 + +#define LMARGPRN 1700 +#define RMARGPRN 900 +#define TMARGPRN 2000 +#define BMARGPRN 1000 +#define BORDERPRN 300 + +#define APPWAIT_START 100 + +#define VALIDWINDOW 0x1234 + +#if defined(OW) || defined(MTF) +#define FILTERMASK_ALL "*" +#elif defined(PM2) +#define FILTERMASK_ALL "" +#else +#define FILTERMASK_ALL "*.*" +#endif + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::ui::dialogs; +using namespace utl; +using namespace comphelper; + + +DBG_NAME( ModulWindow ) + +TYPEINIT1( ModulWindow , IDEBaseWindow ); + +void lcl_PrintHeader( Printer* pPrinter, USHORT nPages, USHORT nCurPage, const String& rTitle, bool bOutput ) +{ + short nLeftMargin = LMARGPRN; + Size aSz = pPrinter->GetOutputSize(); + short nBorder = BORDERPRN; + + const Color aOldLineColor( pPrinter->GetLineColor() ); + const Color aOldFillColor( pPrinter->GetFillColor() ); + const Font aOldFont( pPrinter->GetFont() ); + + pPrinter->SetLineColor( Color( COL_BLACK ) ); + pPrinter->SetFillColor(); + + Font aFont( aOldFont ); + aFont.SetWeight( WEIGHT_BOLD ); + aFont.SetAlign( ALIGN_BOTTOM ); + pPrinter->SetFont( aFont ); + + long nFontHeight = pPrinter->GetTextHeight(); + + // 1.Border => Strich, 2+3 Border = Freiraum. + long nYTop = TMARGPRN-3*nBorder-nFontHeight; + + long nXLeft = nLeftMargin-nBorder; + long nXRight = aSz.Width()-RMARGPRN+nBorder; + + if( bOutput ) + pPrinter->DrawRect( Rectangle( + Point( nXLeft, nYTop ), + Size( nXRight-nXLeft, aSz.Height() - nYTop - BMARGPRN + nBorder ) ) ); + + + long nY = TMARGPRN-2*nBorder; + Point aPos( nLeftMargin, nY ); + if( bOutput ) + pPrinter->DrawText( aPos, rTitle ); + if ( nPages != 1 ) + { + aFont.SetWeight( WEIGHT_NORMAL ); + pPrinter->SetFont( aFont ); + String aPageStr( RTL_CONSTASCII_USTRINGPARAM( " [" ) ); + aPageStr += String( IDEResId( RID_STR_PAGE ) ); + aPageStr += ' '; + aPageStr += String::CreateFromInt32( nCurPage ); + aPageStr += ']'; + aPos.X() += pPrinter->GetTextWidth( rTitle ); + if( bOutput ) + pPrinter->DrawText( aPos, aPageStr ); + } + + + nY = TMARGPRN-nBorder; + + if( bOutput ) + pPrinter->DrawLine( Point( nXLeft, nY ), Point( nXRight, nY ) ); + + pPrinter->SetFont( aOldFont ); + pPrinter->SetFillColor( aOldFillColor ); + pPrinter->SetLineColor( aOldLineColor ); +} + +void lcl_ConvertTabsToSpaces( String& rLine ) +{ + if ( rLine.Len() ) + { + USHORT nPos = 0; + USHORT nMax = rLine.Len(); + while ( nPos < nMax ) + { + if ( rLine.GetChar( nPos ) == '\t' ) + { + // Nicht 4 Blanks, sondern an 4er TabPos: + String aBlanker; + aBlanker.Fill( ( 4 - ( nPos % 4 ) ), ' ' ); + rLine.Erase( nPos, 1 ); + rLine.Insert( aBlanker, nPos ); + nMax = rLine.Len(); + } + nPos++; // Nicht optimal, falls Tab, aber auch nicht verkehrt... + } + } +} + + +ModulWindow::ModulWindow( ModulWindowLayout* pParent, const ScriptDocument& rDocument, String aLibName, + String aName, ::rtl::OUString& aModule ) + :IDEBaseWindow( pParent, rDocument, aLibName, aName ) + ,aXEditorWindow( this ) + ,m_aModule( aModule ) +{ + DBG_CTOR( ModulWindow, 0 ); + nValid = VALIDWINDOW; + pLayout = pParent; + aXEditorWindow.Show(); + + SetBackground(); +} + +SbModuleRef ModulWindow::XModule() +{ + // ModuleWindows can now be created as a result of the + // modules getting created via the api. This is a result of an + // elementInserted event from the BasicLibrary container. + // However the SbModule is also created from a different listener to + // the same event ( in basmgr ) Therefore it is possible when we look + // for xModule it may not yet be available, here we keep tring to access + // the module until such time as it exists + + if ( !xModule.Is() ) + { + BasicManager* pBasMgr = GetDocument().getBasicManager(); + if ( pBasMgr ) + { + StarBASIC* pBasic = pBasMgr->GetLib( GetLibName() ); + if ( pBasic ) + { + xBasic = pBasic; + xModule = (SbModule*)pBasic->FindModule( GetName() ); + } + } + } + return xModule; +} + +__EXPORT ModulWindow::~ModulWindow() +{ + DBG_DTOR( ModulWindow, 0 ); + nValid = 0; + + StarBASIC::Stop(); +} + + +void __EXPORT ModulWindow::GetFocus() +{ + if ( nValid != VALIDWINDOW ) + return; + DBG_CHKTHIS( ModulWindow, 0 ); + aXEditorWindow.GetEdtWindow().GrabFocus(); + // Basisklasse nicht rufen, weil Focus jetzt woanders... +} + +void ModulWindow::DoInit() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + // Wird beim Umschalten der Fenster gerufen... + if ( GetVScrollBar() ) + GetVScrollBar()->Hide(); + GetHScrollBar()->Show(); +// GetEditorWindow().SetScrollBarRanges(); + GetEditorWindow().InitScrollBars(); +// GetEditorWindow().GrabFocus(); +} + + +void __EXPORT ModulWindow::Paint( const Rectangle& ) +{ +} + +void __EXPORT ModulWindow::Resize() +{ + aXEditorWindow.SetPosSizePixel( Point( 0, 0 ), + Size( GetOutputSizePixel() ) ); +} + + +// "Import" von baside4.cxx +void CreateEngineForBasic( StarBASIC* pBasic ); + +void ModulWindow::CheckCompileBasic() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + + if ( XModule().Is() ) + { + // Zur Laufzeit wird niemals compiliert! + BOOL bRunning = StarBASIC::IsRunning(); + BOOL bModified = ( !xModule->IsCompiled() || + ( GetEditEngine() && GetEditEngine()->IsModified() ) ); + + if ( !bRunning && bModified ) + { + BOOL bDone = FALSE; + + BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); + pIDEShell->GetViewFrame()->GetWindow().EnterWait(); + + if( bModified ) + { + AssertValidEditEngine(); + GetEditorWindow().SetSourceInBasic( FALSE ); + } + + BOOL bWasModified = GetBasic()->IsModified(); + + bDone = GetBasic()->Compile( xModule ); + if ( !bWasModified ) + GetBasic()->SetModified( FALSE ); + + if ( bDone ) + { + GetBreakPoints().SetBreakPointsInBasic( xModule ); + } + + pIDEShell->GetViewFrame()->GetWindow().LeaveWait(); + + aStatus.bError = !bDone; + aStatus.bIsRunning = FALSE; + } + } +} + +BOOL ModulWindow::BasicExecute() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + + // #116444# check security settings before macro execution + ScriptDocument aDocument( GetDocument() ); + if ( aDocument.isDocument() ) + { + if ( !aDocument.allowMacros() ) + { + WarningBox( this, WB_OK, String( IDEResId( RID_STR_CANNOTRUNMACRO ) ) ).Execute(); + return FALSE; + } + } + + CheckCompileBasic(); + + if ( XModule().Is() && xModule->IsCompiled() && !aStatus.bError ) + { + if ( GetBreakPoints().Count() ) + aStatus.nBasicFlags = aStatus.nBasicFlags | SbDEBUG_BREAK; + + if ( !aStatus.bIsRunning ) + { + DBG_ASSERT( xModule.Is(), "Kein Modul!" ); + AddStatus( BASWIN_RUNNINGBASIC ); + USHORT nStart, nEnd, nCurMethodStart = 0; + TextSelection aSel = GetEditView()->GetSelection(); + if ( aDocument.isInVBAMode() ) + nCurMethodStart = ( aSel.GetStart().GetPara() + 1 ); + SbMethod* pMethod = 0; + // erstes Macro, sonst blind "Main" (ExtSearch?) + for ( USHORT nMacro = 0; nMacro < xModule->GetMethods()->Count(); nMacro++ ) + { + SbMethod* pM = (SbMethod*)xModule->GetMethods()->Get( nMacro ); + DBG_ASSERT( pM, "Method?" ); + pM->GetLineRange( nStart, nEnd ); + if ( aDocument.isInVBAMode() ) + { + if ( nCurMethodStart >= nStart && nCurMethodStart <= nEnd ) + { + pMethod = pM; + break; + } + } + else if ( !pMethod || ( nStart < nCurMethodStart && !pM->IsHidden() ) ) + { + pMethod = pM; + nCurMethodStart = nStart; + } + } + if ( !pMethod ) + { + if ( aDocument.isInVBAMode() ) + return ( BasicIDE::ChooseMacro( uno::Reference< frame::XModel >(), FALSE, rtl::OUString() ).getLength() > 0 ) ? TRUE : FALSE; + else + pMethod = (SbMethod*)xModule->Find( String( RTL_CONSTASCII_USTRINGPARAM( "Main" ) ), SbxCLASS_METHOD ); + } + if ( pMethod ) + { + pMethod->SetDebugFlags( aStatus.nBasicFlags ); + BasicDLL::SetDebugMode( TRUE ); + BasicIDE::RunMethod( pMethod ); + BasicDLL::SetDebugMode( FALSE ); + // Falls waehrend Interactive=FALSE abgebrochen + BasicDLL::EnableBreak( TRUE ); + } + ClearStatus( BASWIN_RUNNINGBASIC ); + } + else + aStatus.bIsRunning = FALSE; // Abbruch von Reschedule() + } + + BOOL bDone = !aStatus.bError; + + return bDone; +} + +BOOL ModulWindow::CompileBasic() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + CheckCompileBasic(); + + BOOL bIsCompiled = FALSE; + if ( XModule().Is() ) + bIsCompiled = xModule->IsCompiled(); + + return bIsCompiled; +} + +BOOL ModulWindow::BasicRun() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + + aStatus.nBasicFlags = 0; + BOOL bDone = BasicExecute(); + return bDone; +} + +BOOL ModulWindow::BasicStepOver() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + aStatus.nBasicFlags = SbDEBUG_STEPINTO | SbDEBUG_STEPOVER; + BOOL bDone = BasicExecute(); + return bDone; +} + + +BOOL ModulWindow::BasicStepInto() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + + aStatus.nBasicFlags = SbDEBUG_STEPINTO; + BOOL bDone = BasicExecute(); + return bDone; +} + +BOOL ModulWindow::BasicStepOut() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + + aStatus.nBasicFlags = SbDEBUG_STEPOUT; + BOOL bDone = BasicExecute(); + return bDone; +} + + + +void ModulWindow::BasicStop() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + + GetBasic()->Stop(); + aStatus.bIsRunning = FALSE; +} + +BOOL ModulWindow::LoadBasic() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + BOOL bDone = FALSE; + + Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() ); + Reference < XFilePicker > xFP; + if( xMSF.is() ) + { + Sequence <Any> aServiceType(1); + aServiceType[0] <<= TemplateDescription::FILEOPEN_SIMPLE; + xFP = Reference< XFilePicker >( xMSF->createInstanceWithArguments( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FilePicker" ) ), aServiceType ), UNO_QUERY ); + } + + if ( aCurPath.Len() ) + xFP->setDisplayDirectory ( aCurPath ); + + //xFP->setTitle( String( IDEResId( RID_STR_OPEN ) ) ); + + Reference< XFilterManager > xFltMgr(xFP, UNO_QUERY); + xFltMgr->appendFilter( String( RTL_CONSTASCII_USTRINGPARAM( "BASIC" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.bas" ) ) ); + xFltMgr->appendFilter( String( IDEResId( RID_STR_FILTER_ALLFILES ) ), String( RTL_CONSTASCII_USTRINGPARAM( FILTERMASK_ALL ) ) ); + xFltMgr->setCurrentFilter( String( RTL_CONSTASCII_USTRINGPARAM( "BASIC" ) ) ); + + if( xFP->execute() == RET_OK ) + { + Sequence< ::rtl::OUString > aPaths = xFP->getFiles(); + aCurPath = aPaths[0]; + SfxMedium aMedium( aCurPath, STREAM_READ | STREAM_SHARE_DENYWRITE | STREAM_NOCREATE, TRUE ); + SvStream* pStream = aMedium.GetInStream(); + if ( pStream ) + { + AssertValidEditEngine(); + ULONG nLines = CalcLineCount( *pStream ); + // nLines*4: ReadText/Formatting/Highlighting/Formatting + GetEditorWindow().CreateProgress( String( IDEResId( RID_STR_GENERATESOURCE ) ), nLines*4 ); + GetEditEngine()->SetUpdateMode( FALSE ); + GetEditView()->Read( *pStream ); + GetEditEngine()->SetUpdateMode( TRUE ); + GetEditorWindow().Update(); // Es wurde bei UpdateMode = TRUE nur Invalidiert + GetEditorWindow().ForceSyntaxTimeout(); + GetEditorWindow().DestroyProgress(); + ULONG nError = aMedium.GetError(); + if ( nError ) + ErrorHandler::HandleError( nError ); + else + bDone = TRUE; + } + else + ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_COULDNTREAD ) ) ).Execute(); + } + return bDone; +} + + +BOOL ModulWindow::SaveBasicSource() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + BOOL bDone = FALSE; + + Reference< lang::XMultiServiceFactory > xMSF( ::comphelper::getProcessServiceFactory() ); + Reference < XFilePicker > xFP; + if( xMSF.is() ) + { + Sequence <Any> aServiceType(1); + aServiceType[0] <<= TemplateDescription::FILESAVE_AUTOEXTENSION_PASSWORD; + xFP = Reference< XFilePicker >( xMSF->createInstanceWithArguments( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FilePicker" ) ), aServiceType ), UNO_QUERY ); + } + + Reference< XFilePickerControlAccess > xFPControl(xFP, UNO_QUERY); + xFPControl->enableControl(ExtendedFilePickerElementIds::CHECKBOX_PASSWORD, sal_False); + Any aValue; + aValue <<= (sal_Bool) sal_True; + xFPControl->setValue(ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, aValue); + + if ( aCurPath.Len() ) + xFP->setDisplayDirectory ( aCurPath ); + + //xFP->setTitle( String( IDEResId( RID_STR_SAVE ) ) ); + + Reference< XFilterManager > xFltMgr(xFP, UNO_QUERY); + xFltMgr->appendFilter( String( RTL_CONSTASCII_USTRINGPARAM( "BASIC" ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.bas" ) ) ); + xFltMgr->appendFilter( String( IDEResId( RID_STR_FILTER_ALLFILES ) ), String( RTL_CONSTASCII_USTRINGPARAM( FILTERMASK_ALL ) ) ); + xFltMgr->setCurrentFilter( String( RTL_CONSTASCII_USTRINGPARAM( "BASIC" ) ) ); + + if( xFP->execute() == RET_OK ) + { + Sequence< ::rtl::OUString > aPaths = xFP->getFiles(); + aCurPath = aPaths[0]; + SfxMedium aMedium( aCurPath, STREAM_WRITE | STREAM_SHARE_DENYWRITE | STREAM_TRUNC, TRUE, FALSE ); + SvStream* pStream = aMedium.GetOutStream(); + if ( pStream ) + { + EnterWait(); + AssertValidEditEngine(); + GetEditEngine()->Write( *pStream ); + aMedium.Commit(); + LeaveWait(); + ULONG nError = aMedium.GetError(); + if ( nError ) + ErrorHandler::HandleError( nError ); + else + bDone = TRUE; + } + else + ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_COULDNTWRITE) ) ).Execute(); + } + + return bDone; +} + +BOOL implImportDialog( Window* pWin, const String& rCurPath, const ScriptDocument& rDocument, const String& aLibName ); + +BOOL ModulWindow::ImportDialog() +{ + const ScriptDocument& rDocument = GetDocument(); + String aLibName = GetLibName(); + BOOL bRet = implImportDialog( this, aCurPath, rDocument, aLibName ); + return bRet; +} + +BOOL ModulWindow::ToggleBreakPoint( ULONG nLine ) +{ + DBG_ASSERT( XModule().Is(), "Kein Modul!" ); + + BOOL bNewBreakPoint = FALSE; + + if ( XModule().Is() ) + { + CheckCompileBasic(); + if ( aStatus.bError ) + { + Sound::Beep(); + return FALSE; + } + + BreakPoint* pBrk = GetBreakPoints().FindBreakPoint( nLine ); + if ( pBrk ) // entfernen + { + xModule->ClearBP( (USHORT)nLine ); + delete GetBreakPoints().Remove( pBrk ); + } + else // einen erzeugen + { + if ( xModule->SetBP( (USHORT)nLine) ) + { + GetBreakPoints().InsertSorted( new BreakPoint( nLine ) ); + bNewBreakPoint = TRUE; + if ( StarBASIC::IsRunning() ) + { + for ( USHORT nMethod = 0; nMethod < xModule->GetMethods()->Count(); nMethod++ ) + { + SbMethod* pMethod = (SbMethod*)xModule->GetMethods()->Get( nMethod ); + DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" ); + pMethod->SetDebugFlags( pMethod->GetDebugFlags() | SbDEBUG_BREAK ); + } + } + } + + if ( !bNewBreakPoint ) + Sound::Beep(); + } + } + + return bNewBreakPoint; +} + +void ModulWindow::UpdateBreakPoint( const BreakPoint& rBrk ) +{ + DBG_ASSERT( XModule().Is(), "Kein Modul!" ); + + if ( XModule().Is() ) + { + CheckCompileBasic(); + + if ( rBrk.bEnabled ) + xModule->SetBP( (USHORT)rBrk.nLine ); + else + xModule->ClearBP( (USHORT)rBrk.nLine ); + } +} + + +BOOL ModulWindow::BasicToggleBreakPoint() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + AssertValidEditEngine(); + + TextSelection aSel = GetEditView()->GetSelection(); + aSel.GetStart().GetPara()++; // Basic-Zeilen beginnen bei 1! + aSel.GetEnd().GetPara()++; + + BOOL bNewBreakPoint = FALSE; + + for ( ULONG nLine = aSel.GetStart().GetPara(); nLine <= aSel.GetEnd().GetPara(); nLine++ ) + { + if ( ToggleBreakPoint( nLine ) ) + bNewBreakPoint = TRUE; + } + + aXEditorWindow.GetBrkWindow().Invalidate(); + return bNewBreakPoint; +} + + +void ModulWindow::BasicToggleBreakPointEnabled() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + AssertValidEditEngine(); + + ExtTextView* pView = GetEditView(); + if ( pView ) + { + TextSelection aSel = pView->GetSelection(); + BreakPointList& rList = GetBreakPoints(); + + for ( ULONG nLine = ++aSel.GetStart().GetPara(), nEnd = ++aSel.GetEnd().GetPara(); nLine <= nEnd; ++nLine ) + { + BreakPoint* pBrk = rList.FindBreakPoint( nLine ); + if ( pBrk ) + { + pBrk->bEnabled = pBrk->bEnabled ? FALSE : TRUE; + UpdateBreakPoint( *pBrk ); + } + } + + GetBreakPointWindow().Invalidate(); + } +} + + +void ModulWindow::ManageBreakPoints() +{ + BreakPointWindow& rBrkWin = GetBreakPointWindow(); + BreakPointDialog aBrkDlg( &rBrkWin, GetBreakPoints() ); + aBrkDlg.Execute(); + rBrkWin.Invalidate(); +} + + +IMPL_LINK( ModulWindow, BasicErrorHdl, StarBASIC *, pBasic ) +{ + DBG_CHKTHIS( ModulWindow, 0 ); + GoOnTop(); + + // ReturnWert: BOOL + // FALSE: Abbrechen + // TRUE: Weiter.... + String aErrorText( pBasic->GetErrorText() ); + USHORT nErrorLine = pBasic->GetLine() - 1; + USHORT nErrCol1 = pBasic->GetCol1(); + USHORT nErrCol2 = pBasic->GetCol2(); + if ( nErrCol2 != 0xFFFF ) + nErrCol2++; + + AssertValidEditEngine(); + GetEditView()->SetSelection( TextSelection( TextPaM( nErrorLine, nErrCol1 ), TextPaM( nErrorLine, nErrCol2 ) ) ); + + String aErrorTextPrefix; + if( pBasic->IsCompilerError() ) + { + aErrorTextPrefix = String( IDEResId( RID_STR_COMPILEERROR ) ); + } + else + { + aErrorTextPrefix = String( IDEResId( RID_STR_RUNTIMEERROR ) ); + aErrorTextPrefix += StarBASIC::GetVBErrorCode( pBasic->GetErrorCode() ); + aErrorTextPrefix += ' '; + pLayout->GetStackWindow().UpdateCalls(); + } + // Wenn anderes Basic, dan sollte die IDE versuchen, da richtige + // Modul anzuzeigen... + BOOL bMarkError = ( pBasic == GetBasic() ) ? TRUE : FALSE; + if ( bMarkError ) + aXEditorWindow.GetBrkWindow().SetMarkerPos( nErrorLine, TRUE ); +// ErrorBox( this, WB_OK | WB_DEF_OK, String( aErrorTextPrefix + aErrorText ) ).Execute(); +// ErrorHandler::HandleError( pBasic->GetErrorCode() ); + + // #i47002# + Reference< awt::XWindow > xWindow = VCLUnoHelper::GetInterface( this ); + + ErrorHandler::HandleError( StarBASIC::GetErrorCode() ); + + // #i47002# + Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); + if ( !pWindow ) + return FALSE; + + if ( bMarkError ) + aXEditorWindow.GetBrkWindow().SetMarkerPos( MARKER_NOMARKER ); + return FALSE; +} + +long __EXPORT ModulWindow::BasicBreakHdl( StarBASIC* pBasic ) +{ + DBG_CHKTHIS( ModulWindow, 0 ); + // Ein GoOnTop aktiviert da Fenster, das veraendert aber den Context fuer + // das Programm! +// GoOnTop(); + + // #i69280 Required in Window despite normal usage in next command! + (void)pBasic; + + // ReturnWert: USHORT => siehe SB-Debug-Flags + USHORT nErrorLine = pBasic->GetLine(); + + // Gibt es hier einen BreakPoint? + BreakPoint* pBrk = GetBreakPoints().FindBreakPoint( nErrorLine ); + if ( pBrk ) + { + pBrk->nHitCount++; + if ( pBrk->nHitCount < pBrk->nStopAfter && GetBasic()->IsBreak() ) + return aStatus.nBasicFlags; // weiterlaufen... + } + + nErrorLine--; // EditEngine begint bei 0, Basic bei 1 + // Alleine schon damit gescrollt wird... + AssertValidEditEngine(); + GetEditView()->SetSelection( TextSelection( TextPaM( nErrorLine, 0 ), TextPaM( nErrorLine, 0 ) ) ); + aXEditorWindow.GetBrkWindow().SetMarkerPos( nErrorLine ); + + pLayout->GetWatchWindow().UpdateWatches(); + pLayout->GetStackWindow().UpdateCalls(); + + aStatus.bIsInReschedule = TRUE; + aStatus.bIsRunning = TRUE; + + AddStatus( BASWIN_INRESCHEDULE ); + + BasicIDE::InvalidateDebuggerSlots(); + + while( aStatus.bIsRunning ) + Application::Yield(); + + aStatus.bIsInReschedule = FALSE; + aXEditorWindow.GetBrkWindow().SetMarkerPos( MARKER_NOMARKER ); + + ClearStatus( BASWIN_INRESCHEDULE ); + + return aStatus.nBasicFlags; +} + +void ModulWindow::BasicAddWatch() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + String aWatchStr; + BOOL bInserted = FALSE; + AssertValidEditEngine(); + BOOL bAdd = TRUE; + if ( !GetEditView()->HasSelection() ) + { +// bAdd = GetEditView()->SelectCurrentWord(); + TextPaM aWordStart; + String aWord = GetEditEngine()->GetWord( GetEditView()->GetSelection().GetEnd(), &aWordStart ); + if ( aWord.Len() ) + { + TextSelection aSel( aWordStart ); + USHORT& rIndex = aSel.GetEnd().GetIndex(); + rIndex = rIndex + aWord.Len(); + // aSel.GetEnd().GetIndex() += sal::static_int_cast<int>( aWord.Len() ); + GetEditView()->SetSelection( aSel ); + bAdd = TRUE; + } + } + if ( bAdd ) + { + TextSelection aSel = GetEditView()->GetSelection(); + if ( aSel.GetStart().GetPara() == aSel.GetEnd().GetPara() ) + { + aWatchStr = GetEditView()->GetSelected(); + pLayout->GetWatchWindow().AddWatch( aWatchStr ); + pLayout->GetWatchWindow().UpdateWatches(); + bInserted = TRUE; + } + } + + if ( !bInserted ) + Sound::Beep(); +} + + + +void ModulWindow::BasicRemoveWatch() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + BOOL bRemoved = pLayout->GetWatchWindow().RemoveSelectedWatch(); + + if ( !bRemoved ) + Sound::Beep(); +} + + +void ModulWindow::EditMacro( const String& rMacroName ) +{ + DBG_CHKTHIS( ModulWindow, 0 ); + DBG_ASSERT( XModule().Is(), "Kein Modul!" ); + + if ( XModule().Is() ) + { + CheckCompileBasic(); + + if ( !aStatus.bError ) + { + USHORT nStart, nEnd; + SbMethod* pMethod = (SbMethod*)xModule->Find( rMacroName, SbxCLASS_METHOD ); + if ( pMethod ) + { + pMethod->GetLineRange( nStart, nEnd ); + if ( nStart ) + { + // Basic beginnt bei 1 + nStart--; + nEnd--; + } + TextSelection aSel( TextPaM( nStart, 0 ), TextPaM( nStart, 0 ) ); + AssertValidEditEngine(); + TextView * pView = GetEditView(); + // ggf. hinscrollen, so dass erste Zeile oben... + long nVisHeight = GetOutputSizePixel().Height(); + if ( (long)pView->GetTextEngine()->GetTextHeight() > nVisHeight ) + { + long nMaxY = pView->GetTextEngine()->GetTextHeight() - nVisHeight; + long nOldStartY = pView->GetStartDocPos().Y(); + long nNewStartY = nStart * pView->GetTextEngine()->GetCharHeight(); + nNewStartY = Min( nNewStartY, nMaxY ); + pView->Scroll( 0, -(nNewStartY-nOldStartY) ); + pView->ShowCursor( FALSE, TRUE ); + GetEditVScrollBar().SetThumbPos( pView->GetStartDocPos().Y() ); + } + pView->SetSelection( aSel ); + pView->ShowCursor(); + pView->GetWindow()->GrabFocus(); + } + } + } +} + + +void __EXPORT ModulWindow::StoreData() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + // StoreData wird gerufen, wenn der BasicManager zerstoert oder + // dieses Fenster beendet wird. + // => Keine Unterbrechungen erwuenscht! + // Und bei SAVE, wenn AppBasic... + GetEditorWindow().SetSourceInBasic( TRUE ); + // Nicht das Modify loeschen, sonst wird das Basic nicht gespeichert + // Es wird beim Speichern sowieso geloescht. +// xModule->SetModified( FALSE ); +} + +BOOL __EXPORT ModulWindow::CanClose() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + return TRUE; +} + + +BOOL __EXPORT ModulWindow::AllowUndo() +{ + return GetEditorWindow().CanModify(); +} + + +void __EXPORT ModulWindow::UpdateData() +{ + DBG_CHKTHIS( ModulWindow, 0 ); + DBG_ASSERT( XModule().Is(), "Kein Modul!" ); + // UpdateData wird gerufen, wenn sich der Source von aussen + // geaendert hat. + // => Keine Unterbrechungen erwuenscht! + + if ( XModule().Is() ) + { + SetModule( xModule->GetSource32() ); + + if ( GetEditView() ) + { + TextSelection aSel = GetEditView()->GetSelection(); + setTextEngineText( GetEditEngine(), xModule->GetSource32() ); + GetEditView()->SetSelection( aSel ); + GetEditEngine()->SetModified( FALSE ); + BasicIDE::MarkDocumentModified( GetDocument() ); + } + } +} + +sal_Int32 ModulWindow::countPages( Printer* pPrinter ) +{ + return FormatAndPrint( pPrinter, -1 ); +} + +void ModulWindow::printPage( sal_Int32 nPage, Printer* pPrinter ) +{ + FormatAndPrint( pPrinter, nPage ); +} + +/* implementation note: this is totally inefficient for the XRenderable interface + usage since the whole "document" will be format for every page. Should this ever + become a problem we should + - format only once for every new printer + - keep an index list for each page which is the starting paragraph +*/ +sal_Int32 ModulWindow::FormatAndPrint( Printer* pPrinter, sal_Int32 nPrintPage ) +{ + DBG_CHKTHIS( ModulWindow, 0 ); + + AssertValidEditEngine(); + + MapMode eOldMapMode( pPrinter->GetMapMode() ); + Font aOldFont( pPrinter->GetFont() ); + +// Font aFont( GetEditEngine()->CreateFontFromItemSet( GetEditEngine()->GetEmptyItemSet() ) ); + Font aFont( GetEditEngine()->GetFont() ); + aFont.SetAlign( ALIGN_BOTTOM ); + aFont.SetTransparent( TRUE ); + aFont.SetSize( Size( 0, 360 ) ); + pPrinter->SetFont( aFont ); + pPrinter->SetMapMode( MAP_100TH_MM ); + + String aTitle( CreateQualifiedName() ); + + USHORT nLineHeight = (USHORT) pPrinter->GetTextHeight(); // etwas mehr. + USHORT nParaSpace = 10; + + Size aPaperSz = pPrinter->GetOutputSize(); + aPaperSz.Width() -= (LMARGPRN+RMARGPRN); + aPaperSz.Height() -= (TMARGPRN+BMARGPRN); + + // nLinepPage stimmt nicht, wenn Zeilen umgebrochen werden muessen... + USHORT nLinespPage = (USHORT) (aPaperSz.Height()/nLineHeight); + USHORT nCharspLine = (USHORT) (aPaperSz.Width() / pPrinter->GetTextWidth( 'X' ) ); + ULONG nParas = GetEditEngine()->GetParagraphCount(); + + USHORT nPages = (USHORT) (nParas/nLinespPage+1 ); + USHORT nCurPage = 1; + + // Header drucken... + lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle, nPrintPage == 0 ); + Point aPos( LMARGPRN, TMARGPRN ); + for ( ULONG nPara = 0; nPara < nParas; nPara++ ) + { + String aLine( GetEditEngine()->GetText( nPara ) ); + lcl_ConvertTabsToSpaces( aLine ); + USHORT nLines = aLine.Len()/nCharspLine+1; + for ( USHORT nLine = 0; nLine < nLines; nLine++ ) + { + String aTmpLine( aLine, nLine*nCharspLine, nCharspLine ); + aPos.Y() += nLineHeight; + if ( aPos.Y() > ( aPaperSz.Height()+TMARGPRN ) ) + { + nCurPage++; + lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle, nCurPage-1 == nPrintPage ); + aPos = Point( LMARGPRN, TMARGPRN+nLineHeight ); + } + if( nCurPage-1 == nPrintPage ) + pPrinter->DrawText( aPos, aTmpLine ); + } + aPos.Y() += nParaSpace; + } + + pPrinter->SetFont( aOldFont ); + pPrinter->SetMapMode( eOldMapMode ); + + return sal_Int32(nCurPage); +} + + +void __EXPORT ModulWindow::ExecuteCommand( SfxRequest& rReq ) +{ + DBG_CHKTHIS( ModulWindow, 0 ); + AssertValidEditEngine(); + USHORT nSlot = rReq.GetSlot(); + switch ( nSlot ) + { + case SID_BASICRUN: + { + BasicRun(); + } + break; + case SID_BASICCOMPILE: + { + CompileBasic(); + } + break; + case SID_BASICSTEPOVER: + { + BasicStepOver(); + } + break; + case SID_BASICSTEPINTO: + { + BasicStepInto(); + } + break; + case SID_BASICSTEPOUT: + { + BasicStepOut(); + } + break; + case SID_BASICLOAD: + { + LoadBasic(); + } + break; + case SID_BASICSAVEAS: + { + SaveBasicSource(); + } + break; + case SID_IMPORT_DIALOG: + { + ImportDialog(); + } + break; + case SID_BASICIDE_MATCHGROUP: + { + if ( !GetEditView()->MatchGroup() ) + Sound::Beep(); + } + break; + case SID_BASICIDE_TOGGLEBRKPNT: + { + BasicToggleBreakPoint(); + } + break; + case SID_BASICIDE_MANAGEBRKPNTS: + { + ManageBreakPoints(); + } + break; + case SID_BASICIDE_TOGGLEBRKPNTENABLED: + { + BasicToggleBreakPointEnabled(); + } + break; + case SID_BASICIDE_ADDWATCH: + { + BasicAddWatch(); + } + break; + case SID_BASICIDE_REMOVEWATCH: + { + BasicRemoveWatch(); + } + break; + case SID_CUT: + { + if ( !IsReadOnly() ) + { + GetEditView()->Cut(); + SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); + if ( pBindings ) + pBindings->Invalidate( SID_DOC_MODIFIED ); + } + } + break; + case SID_COPY: + { + GetEditView()->Copy(); + } + break; + case SID_PASTE: + { + if ( !IsReadOnly() ) + { + GetEditView()->Paste(); + SfxBindings* pBindings = BasicIDE::GetBindingsPtr(); + if ( pBindings ) + pBindings->Invalidate( SID_DOC_MODIFIED ); + } + } + break; + case SID_BASICIDE_BRKPNTSCHANGED: + { + GetBreakPointWindow().Invalidate(); + } + break; + } +} + + + +void __EXPORT ModulWindow::GetState( SfxItemSet &rSet ) +{ + DBG_CHKTHIS( ModulWindow, 0 ); + SfxWhichIter aIter(rSet); + for ( USHORT nWh = aIter.FirstWhich(); 0 != nWh; nWh = aIter.NextWhich() ) + { + switch ( nWh ) + { + // allgemeine Items: + case SID_CUT: + { + if ( !GetEditView() || !GetEditView()->HasSelection() ) + rSet.DisableItem( nWh ); + + if ( IsReadOnly() ) + rSet.DisableItem( nWh ); + } + break; + case SID_COPY: + { + if ( !GetEditView() || !GetEditView()->HasSelection() ) + rSet.DisableItem( nWh ); + } + break; + case SID_PASTE: + { + if ( !IsPasteAllowed() ) + rSet.DisableItem( nWh ); + + if ( IsReadOnly() ) + rSet.DisableItem( nWh ); + } + break; + case SID_BASICIDE_STAT_POS: + { + TextView* pView = GetEditView(); + if ( pView ) + { + TextSelection aSel = pView->GetSelection(); + String aPos( IDEResId( RID_STR_LINE ) ); + aPos += ' '; + aPos += String::CreateFromInt32( aSel.GetEnd().GetPara()+1 ); + aPos += String( RTL_CONSTASCII_USTRINGPARAM( ", " ) ); + aPos += String( IDEResId( RID_STR_COLUMN ) ); + aPos += ' '; + aPos += String::CreateFromInt32( aSel.GetEnd().GetIndex()+1 ); + SfxStringItem aItem( SID_BASICIDE_STAT_POS, aPos ); + rSet.Put( aItem ); + } + } + break; + case SID_ATTR_INSERT: + { + TextView* pView = GetEditView(); + if ( pView ) + { + SfxBoolItem aItem( SID_ATTR_INSERT, pView->IsInsertMode() ); + rSet.Put( aItem ); + } + } + break; + } + } +} + + +void __EXPORT ModulWindow::DoScroll( ScrollBar* pCurScrollBar ) +{ + DBG_CHKTHIS( ModulWindow, 0 ); + if ( ( pCurScrollBar == GetHScrollBar() ) && GetEditView() ) + { + // Nicht mit dem Wert Scrollen, sondern lieber die Thumb-Pos fuer die + // VisArea verwenden: + long nDiff = GetEditView()->GetStartDocPos().X() - pCurScrollBar->GetThumbPos(); + GetEditView()->Scroll( nDiff, 0 ); + GetEditView()->ShowCursor( FALSE, TRUE ); + pCurScrollBar->SetThumbPos( GetEditView()->GetStartDocPos().X() ); + + } +} + + +BOOL __EXPORT ModulWindow::IsModified() +{ + return GetEditEngine() ? GetEditEngine()->IsModified() : FALSE; +} + + + +void __EXPORT ModulWindow::GoOnTop() +{ + IDE_DLL()->GetShell()->GetViewFrame()->ToTop(); +} + +String ModulWindow::GetSbModuleName() +{ + String aModuleName; + if ( XModule().Is() ) + aModuleName = xModule->GetName(); + return aModuleName; +} + + + +String __EXPORT ModulWindow::GetTitle() +{ + return GetSbModuleName(); +} + + + +void ModulWindow::FrameWindowMoved() +{ +// if ( GetEditEngine() && GetEditEngine()->IsInSelectionMode() ) +// GetEditEngine()->StopSelectionMode(); +} + + + +void ModulWindow::ShowCursor( BOOL bOn ) +{ + if ( GetEditEngine() ) + { + TextView* pView = GetEditEngine()->GetActiveView(); + if ( pView ) + { + if ( bOn ) + pView->ShowCursor(); + else + pView->HideCursor(); + } + } +} + + +Window* __EXPORT ModulWindow::GetLayoutWindow() +{ + return pLayout; +} + +void ModulWindow::AssertValidEditEngine() +{ + if ( !GetEditEngine() ) + GetEditorWindow().CreateEditEngine(); +} + +void ModulWindow::Deactivating() +{ + if ( GetEditView() ) + GetEditView()->EraseVirtualDevice(); +} + +USHORT ModulWindow::StartSearchAndReplace( const SvxSearchItem& rSearchItem, BOOL bFromStart ) +{ + // Mann koennte fuer das blinde Alle-Ersetzen auch auf + // Syntaxhighlighting/Formatierung verzichten... + AssertValidEditEngine(); + ExtTextView* pView = GetEditView(); + TextSelection aSel; + if ( bFromStart ) + { + aSel = pView->GetSelection(); + if ( !rSearchItem.GetBackward() ) + pView->SetSelection( TextSelection() ); + else + pView->SetSelection( TextSelection( TextPaM( 0xFFFFFFFF, 0xFFFF ), TextPaM( 0xFFFFFFFF, 0xFFFF ) ) ); + } + + BOOL bForward = !rSearchItem.GetBackward(); + USHORT nFound = 0; + if ( ( rSearchItem.GetCommand() == SVX_SEARCHCMD_FIND ) || + ( rSearchItem.GetCommand() == SVX_SEARCHCMD_FIND_ALL ) ) + { + nFound = pView->Search( rSearchItem.GetSearchOptions() , bForward ); + } + else if ( ( rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE ) || + ( rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL ) ) + { + if ( !IsReadOnly() ) + { + BOOL bAll = rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL; + nFound = pView->Replace( rSearchItem.GetSearchOptions() , bAll , bForward ); + } + } + + if ( bFromStart && !nFound ) + pView->SetSelection( aSel ); + + return nFound; +} + +SfxUndoManager* __EXPORT ModulWindow::GetUndoManager() +{ + if ( GetEditEngine() ) + return &GetEditEngine()->GetUndoManager(); + return NULL; +} + +USHORT __EXPORT ModulWindow::GetSearchOptions() +{ + USHORT nOptions = SEARCH_OPTIONS_SEARCH | + SEARCH_OPTIONS_WHOLE_WORDS | + SEARCH_OPTIONS_BACKWARDS | + SEARCH_OPTIONS_REG_EXP | + SEARCH_OPTIONS_EXACT | + SEARCH_OPTIONS_SELECTION | + SEARCH_OPTIONS_SIMILARITY; + + if ( !IsReadOnly() ) + { + nOptions |= SEARCH_OPTIONS_REPLACE; + nOptions |= SEARCH_OPTIONS_REPLACE_ALL; + } + + return nOptions; +} + +void __EXPORT ModulWindow::BasicStarted() +{ + if ( XModule().Is() ) + { + aStatus.bIsRunning = TRUE; + BreakPointList& rList = GetBreakPoints(); + if ( rList.Count() ) + { + rList.ResetHitCount(); + rList.SetBreakPointsInBasic( xModule ); + for ( USHORT nMethod = 0; nMethod < xModule->GetMethods()->Count(); nMethod++ ) + { + SbMethod* pMethod = (SbMethod*)xModule->GetMethods()->Get( nMethod ); + DBG_ASSERT( pMethod, "Methode nicht gefunden! (NULL)" ); + pMethod->SetDebugFlags( pMethod->GetDebugFlags() | SbDEBUG_BREAK ); + } + } + } +} + +void __EXPORT ModulWindow::BasicStopped() +{ + aStatus.bIsRunning = FALSE; + GetBreakPointWindow().SetMarkerPos( MARKER_NOMARKER ); +} + +BasicEntryDescriptor ModulWindow::CreateEntryDescriptor() +{ + ScriptDocument aDocument( GetDocument() ); + String aLibName( GetLibName() ); + LibraryLocation eLocation = aDocument.getLibraryLocation( aLibName ); + String aModName( GetName() ); + String aLibSubName; + if( xBasic.Is() && aDocument.isInVBAMode() && XModule().Is() ) + { + switch( xModule->GetModuleType() ) + { + case script::ModuleType::DOCUMENT: + { + aLibSubName = String( IDEResId( RID_STR_DOCUMENT_OBJECTS ) ); + uno::Reference< container::XNameContainer > xLib = aDocument.getOrCreateLibrary( E_SCRIPTS, aLibName ); + if( xLib.is() ) + { + String sObjName; + ModuleInfoHelper::getObjectName( xLib, aModName, sObjName ); + if( sObjName.Len() ) + { + aModName.AppendAscii(" (").Append(sObjName).AppendAscii(")"); + } + } + break; + } + case script::ModuleType::FORM: + aLibSubName = String( IDEResId( RID_STR_USERFORMS ) ); + break; + case script::ModuleType::NORMAL: + aLibSubName = String( IDEResId( RID_STR_NORMAL_MODULES ) ); + break; + case script::ModuleType::CLASS: + aLibSubName = String( IDEResId( RID_STR_CLASS_MODULES ) ); + break; + } + } + return BasicEntryDescriptor( aDocument, eLocation, aLibName, aLibSubName, aModName, OBJ_TYPE_MODULE ); +} + +void ModulWindow::SetReadOnly( BOOL b ) +{ + if ( GetEditView() ) + GetEditView()->SetReadOnly( b ); +} + +BOOL ModulWindow::IsReadOnly() +{ + BOOL bReadOnly = FALSE; + + if ( GetEditView() ) + bReadOnly = GetEditView()->IsReadOnly(); + + return bReadOnly; +} + +BOOL ModulWindow::IsPasteAllowed() +{ + BOOL bPaste = FALSE; + + // get clipboard + Reference< datatransfer::clipboard::XClipboard > xClipboard = GetClipboard(); + if ( xClipboard.is() ) + { + // get clipboard content + const sal_uInt32 nRef = Application::ReleaseSolarMutex(); + Reference< datatransfer::XTransferable > xTransf = xClipboard->getContents(); + Application::AcquireSolarMutex( nRef ); + if ( xTransf.is() ) + { + datatransfer::DataFlavor aFlavor; + SotExchange::GetFormatDataFlavor( SOT_FORMAT_STRING, aFlavor ); + if ( xTransf->isDataFlavorSupported( aFlavor ) ) + { + bPaste = TRUE; + } + } + } + + return bPaste; +} + +ModulWindowLayout::ModulWindowLayout( Window* pParent ) : + Window( pParent, WB_CLIPCHILDREN ), + aVSplitter( this, WinBits( WB_VSCROLL ) ), + aHSplitter( this, WinBits( WB_HSCROLL ) ), + aWatchWindow( this ), + aStackWindow( this ), + bVSplitted(FALSE), + bHSplitted(FALSE), + m_pModulWindow(0), + m_aImagesNormal(IDEResId(RID_IMGLST_LAYOUT)), + m_aImagesHighContrast(IDEResId(RID_IMGLST_LAYOUT_HC)) +{ + SetBackground(GetSettings().GetStyleSettings().GetWindowColor()); + + aVSplitter.SetSplitHdl( LINK( this, ModulWindowLayout, SplitHdl ) ); + aHSplitter.SetSplitHdl( LINK( this, ModulWindowLayout, SplitHdl ) ); + aVSplitter.Show(); + aHSplitter.Show(); + + aWatchWindow.Show(); + aStackWindow.Show(); + + Color aColor(GetSettings().GetStyleSettings().GetFieldTextColor()); + m_aSyntaxColors[TT_UNKNOWN] = aColor; + m_aSyntaxColors[TT_WHITESPACE] = aColor; + m_aSyntaxColors[TT_EOL] = aColor; + m_aColorConfig.AddListener(this); + m_aSyntaxColors[TT_IDENTIFIER] + = Color(m_aColorConfig.GetColorValue(svtools::BASICIDENTIFIER).nColor); + m_aSyntaxColors[TT_NUMBER] + = Color(m_aColorConfig.GetColorValue(svtools::BASICNUMBER).nColor); + m_aSyntaxColors[TT_STRING] + = Color(m_aColorConfig.GetColorValue(svtools::BASICSTRING).nColor); + m_aSyntaxColors[TT_COMMENT] + = Color(m_aColorConfig.GetColorValue(svtools::BASICCOMMENT).nColor); + m_aSyntaxColors[TT_ERROR] + = Color(m_aColorConfig.GetColorValue(svtools::BASICERROR).nColor); + m_aSyntaxColors[TT_OPERATOR] + = Color(m_aColorConfig.GetColorValue(svtools::BASICOPERATOR).nColor); + m_aSyntaxColors[TT_KEYWORDS] + = Color(m_aColorConfig.GetColorValue(svtools::BASICKEYWORD).nColor); + + Font aFont( GetFont() ); + Size aSz( aFont.GetSize() ); + aSz.Height() *= 3; + aSz.Height() /= 2; + aFont.SetSize( aSz ); + aFont.SetWeight( WEIGHT_BOLD ); + aFont.SetColor(GetSettings().GetStyleSettings().GetWindowTextColor()); + SetFont( aFont ); +} + +ModulWindowLayout::~ModulWindowLayout() +{ + m_aColorConfig.RemoveListener(this); +} + +void __EXPORT ModulWindowLayout::Resize() +{ + // ScrollBars, etc. passiert in BasicIDEShell:Adjust... + ArrangeWindows(); +// Invalidate(); +} + +void __EXPORT ModulWindowLayout::Paint( const Rectangle& ) +{ + DrawText( Point(), String( IDEResId( RID_STR_NOMODULE ) ) ); +} + + +void ModulWindowLayout::ArrangeWindows() +{ + Size aSz = GetOutputSizePixel(); + + // prueffen, ob der Splitter in einem gueltigen Bereich liegt... + long nMinPos = SPLIT_MARGIN; + long nMaxPos = aSz.Height() - SPLIT_MARGIN; + + long nVSplitPos = aVSplitter.GetSplitPosPixel(); + long nHSplitPos = aHSplitter.GetSplitPosPixel(); + if ( !bVSplitted ) + { + // Wenn noch nie gesplitted wurde, Verhaeltniss = 3 : 4 + nVSplitPos = aSz.Height() * 3 / 4; + aVSplitter.SetSplitPosPixel( nVSplitPos ); + } + if ( !bHSplitted ) + { + // Wenn noch nie gesplitted wurde, Verhaeltniss = 2 : 3 + nHSplitPos = aSz.Width() * 2 / 3; + aHSplitter.SetSplitPosPixel( nHSplitPos ); + } + if ( ( nVSplitPos < nMinPos ) || ( nVSplitPos > nMaxPos ) ) + nVSplitPos = ( nVSplitPos < nMinPos ) ? 0 : ( aSz.Height() - SPLIT_HEIGHT ); + + Size aXEWSz; + aXEWSz.Width() = aSz.Width(); + aXEWSz.Height() = nVSplitPos + 1; + if ( m_pModulWindow ) + { + DBG_CHKOBJ( m_pModulWindow, ModulWindow, 0 ); + m_pModulWindow->SetPosSizePixel( Point( 0, 0 ), aXEWSz ); + } + + aVSplitter.SetDragRectPixel( Rectangle( Point( 0, 0 ), Size( aSz.Width(), aSz.Height() ) ) ); + aVSplitter.SetPosPixel( Point( 0, nVSplitPos ) ); + aVSplitter.SetSizePixel( Size( aSz.Width(), SPLIT_HEIGHT ) ); + + aHSplitter.SetDragRectPixel( Rectangle( Point( 0, nVSplitPos+SPLIT_HEIGHT ), Size( aSz.Width(), aSz.Height() - nVSplitPos - SPLIT_HEIGHT ) ) ); + aHSplitter.SetPosPixel( Point( nHSplitPos, nVSplitPos ) ); + aHSplitter.SetSizePixel( Size( SPLIT_HEIGHT, aSz.Height() - nVSplitPos ) ); + + Size aWWSz; + Point aWWPos( 0, nVSplitPos+SPLIT_HEIGHT ); + aWWSz.Width() = nHSplitPos; + aWWSz.Height() = aSz.Height() - aWWPos.Y(); + if ( !aWatchWindow.IsFloatingMode() ) + aWatchWindow.SetPosSizePixel( aWWPos, aWWSz ); + + Size aSWSz; + Point aSWPos( nHSplitPos+SPLIT_HEIGHT, nVSplitPos+SPLIT_HEIGHT ); + aSWSz.Width() = aSz.Width() - aSWPos.X(); + aSWSz.Height() = aSz.Height() - aSWPos.Y(); + if ( !aStackWindow.IsFloatingMode() ) + aStackWindow.SetPosSizePixel( aSWPos, aSWSz ); + + if ( aStackWindow.IsFloatingMode() && aWatchWindow.IsFloatingMode() ) + aHSplitter.Hide(); + else + aHSplitter.Show(); + + long nHDoubleClickSplitPosX = aSz.Width()-aHSplitter.GetSizePixel().Width(); + if ( aHSplitter.GetSplitPosPixel() < nHDoubleClickSplitPosX ) + aHSplitter.SetLastSplitPosPixel( nHDoubleClickSplitPosX ); + + + long nHDoubleClickSplitPosY = aSz.Height()-aVSplitter.GetSizePixel().Height(); + if ( aVSplitter.GetSplitPosPixel() < nHDoubleClickSplitPosY ) + aVSplitter.SetLastSplitPosPixel( nHDoubleClickSplitPosY ); +} + +IMPL_LINK( ModulWindowLayout, SplitHdl, Splitter *, pSplitter ) +{ + if ( pSplitter == &aVSplitter ) + bVSplitted = TRUE; + else + bHSplitted = TRUE; + + ArrangeWindows(); + return 0; +} + +BOOL ModulWindowLayout::IsToBeDocked( DockingWindow* pDockingWindow, const Point& rPos, Rectangle& rRect ) +{ + // prueffen, ob als Dock oder als Child: + // TRUE: Floating + // FALSE: Child + Point aPosInMe = ScreenToOutputPixel( rPos ); + Size aSz = GetOutputSizePixel(); + if ( ( aPosInMe.X() > 0 ) && ( aPosInMe.X() < aSz.Width() ) && + ( aPosInMe.Y() > 0 ) && ( aPosInMe.Y() < aSz.Height() ) ) + { + long nVSplitPos = aVSplitter.GetSplitPosPixel(); + long nHSplitPos = aHSplitter.GetSplitPosPixel(); + if ( pDockingWindow == &aWatchWindow ) + { + if ( ( aPosInMe.Y() > nVSplitPos ) && ( aPosInMe.X() < nHSplitPos ) ) + { + rRect.SetSize( Size( nHSplitPos, aSz.Height() - nVSplitPos ) ); + rRect.SetPos( OutputToScreenPixel( Point( 0, nVSplitPos ) ) ); + return TRUE; + } + } + if ( pDockingWindow == &aStackWindow ) + { + if ( ( aPosInMe.Y() > nVSplitPos ) && ( aPosInMe.X() > nHSplitPos ) ) + { + rRect.SetSize( Size( aSz.Width() - nHSplitPos, aSz.Height() - nVSplitPos ) ); + rRect.SetPos( OutputToScreenPixel( Point( nHSplitPos, nVSplitPos ) ) ); + return TRUE; + } + } + } + return FALSE; +} + +void ModulWindowLayout::DockaWindow( DockingWindow* pDockingWindow ) +{ + if ( pDockingWindow == &aWatchWindow ) + { + // evtl. Sonderbehandlung... + ArrangeWindows(); + } + else if ( pDockingWindow == &aStackWindow ) + { + // evtl. Sonderbehandlung... + ArrangeWindows(); + } +#ifdef DBG_UTIL + else + DBG_ERROR( "Wer will sich denn hier andocken ?" ); +#endif +} + +void ModulWindowLayout::SetModulWindow( ModulWindow* pModWin ) +{ + m_pModulWindow = pModWin; + ArrangeWindows(); +} + +// virtual +void ModulWindowLayout::DataChanged(DataChangedEvent const & rDCEvt) +{ + Window::DataChanged(rDCEvt); + if (rDCEvt.GetType() == DATACHANGED_SETTINGS + && (rDCEvt.GetFlags() & SETTINGS_STYLE) != 0) + { + bool bInvalidate = false; + Color aColor(GetSettings().GetStyleSettings().GetWindowColor()); + if (aColor + != rDCEvt.GetOldSettings()->GetStyleSettings().GetWindowColor()) + { + SetBackground(Wallpaper(aColor)); + bInvalidate = true; + } + aColor = GetSettings().GetStyleSettings().GetWindowTextColor(); + if (aColor != rDCEvt.GetOldSettings()-> + GetStyleSettings().GetWindowTextColor()) + { + Font aFont(GetFont()); + aFont.SetColor(aColor); + SetFont(aFont); + bInvalidate = true; + } + if (bInvalidate) + Invalidate(); + aColor = GetSettings().GetStyleSettings().GetFieldTextColor(); + if (aColor != m_aSyntaxColors[TT_UNKNOWN]) + { + m_aSyntaxColors[TT_UNKNOWN] = aColor; + m_aSyntaxColors[TT_WHITESPACE] = aColor; + m_aSyntaxColors[TT_EOL] = aColor; + updateSyntaxHighlighting(); + } + } +} + +// virtual +void ModulWindowLayout::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ) +{ + { + Color aColor(m_aColorConfig.GetColorValue(svtools::BASICIDENTIFIER). + nColor); + bool bChanged = aColor != m_aSyntaxColors[TT_IDENTIFIER]; + m_aSyntaxColors[TT_IDENTIFIER] = aColor; + aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICNUMBER).nColor); + if (bChanged || aColor != m_aSyntaxColors[TT_NUMBER]) + bChanged = true; + m_aSyntaxColors[TT_NUMBER] = aColor; + aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICSTRING).nColor); + if (bChanged || aColor != m_aSyntaxColors[TT_STRING]) + bChanged = true; + m_aSyntaxColors[TT_STRING] = aColor; + aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICCOMMENT). + nColor); + if (bChanged || aColor != m_aSyntaxColors[TT_COMMENT]) + bChanged = true; + m_aSyntaxColors[TT_COMMENT] = aColor; + aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICERROR).nColor); + if (bChanged || aColor != m_aSyntaxColors[TT_ERROR]) + bChanged = true; + m_aSyntaxColors[TT_ERROR] = aColor; + aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICOPERATOR). + nColor); + if (bChanged || aColor != m_aSyntaxColors[TT_OPERATOR]) + bChanged = true; + m_aSyntaxColors[TT_OPERATOR] = aColor; + aColor = Color(m_aColorConfig.GetColorValue(svtools::BASICKEYWORD). + nColor); + if (bChanged || aColor != m_aSyntaxColors[TT_KEYWORDS]) + bChanged = true; + m_aSyntaxColors[TT_KEYWORDS] = aColor; + if (bChanged) + updateSyntaxHighlighting(); + } +} + +void ModulWindowLayout::updateSyntaxHighlighting() +{ + if (m_pModulWindow != 0) + { + EditorWindow & rEditor = m_pModulWindow->GetEditorWindow(); + ULONG nCount = rEditor.GetEditEngine()->GetParagraphCount(); + for (ULONG i = 0; i < nCount; ++i) + rEditor.DoDelayedSyntaxHighlight(i); + } +} + +Image ModulWindowLayout::getImage(USHORT nId, bool bHighContrastMode) const +{ + return (bHighContrastMode ? m_aImagesHighContrast : m_aImagesNormal). + GetImage(nId); +} |