diff options
Diffstat (limited to 'basctl/source/basicide/baside2.cxx')
-rw-r--r-- | basctl/source/basicide/baside2.cxx | 1739 |
1 files changed, 0 insertions, 1739 deletions
diff --git a/basctl/source/basicide/baside2.cxx b/basctl/source/basicide/baside2.cxx deleted file mode 100644 index 2ee4e33d7..000000000 --- a/basctl/source/basicide/baside2.cxx +++ /dev/null @@ -1,1739 +0,0 @@ -/* -*- 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_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> -#include <com/sun/star/script/XLibraryContainer2.hpp> -#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 <vcl/sound.hxx> - -#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 "*" -#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, sal_uInt16 nPages, sal_uInt16 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() ) - { - sal_uInt16 nPos = 0; - sal_uInt16 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; -} - -ModulWindow::~ModulWindow() -{ - DBG_DTOR( ModulWindow, 0 ); - nValid = 0; - - StarBASIC::Stop(); -} - - -void 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().InitScrollBars(); -} - - -void ModulWindow::Paint( const Rectangle& ) -{ -} - -void 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! - sal_Bool bRunning = StarBASIC::IsRunning(); - sal_Bool bModified = ( !xModule->IsCompiled() || - ( GetEditEngine() && GetEditEngine()->IsModified() ) ); - - if ( !bRunning && bModified ) - { - sal_Bool bDone = sal_False; - - BasicIDEShell* pIDEShell = IDE_DLL()->GetShell(); - pIDEShell->GetViewFrame()->GetWindow().EnterWait(); - - if( bModified ) - { - AssertValidEditEngine(); - GetEditorWindow().SetSourceInBasic( sal_False ); - } - - sal_Bool bWasModified = GetBasic()->IsModified(); - - bDone = GetBasic()->Compile( xModule ); - if ( !bWasModified ) - GetBasic()->SetModified( sal_False ); - - if ( bDone ) - { - GetBreakPoints().SetBreakPointsInBasic( xModule ); - } - - pIDEShell->GetViewFrame()->GetWindow().LeaveWait(); - - aStatus.bError = !bDone; - aStatus.bIsRunning = sal_False; - } - } -} - -sal_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 sal_False; - } - } - - CheckCompileBasic(); - - if ( XModule().Is() && xModule->IsCompiled() && !aStatus.bError ) - { - if ( GetBreakPoints().size() ) - aStatus.nBasicFlags = aStatus.nBasicFlags | SbDEBUG_BREAK; - - if ( !aStatus.bIsRunning ) - { - DBG_ASSERT( xModule.Is(), "Kein Modul!" ); - AddStatus( BASWIN_RUNNINGBASIC ); - sal_uInt16 nStart, nEnd, nCurMethodStart = 0; - TextSelection aSel = GetEditView()->GetSelection(); - // Init cursor to top - nCurMethodStart = ( aSel.GetStart().GetPara() + 1 ); - SbMethod* pMethod = 0; - // erstes Macro, sonst blind "Main" (ExtSearch?) - for ( sal_uInt16 nMacro = 0; nMacro < xModule->GetMethods()->Count(); nMacro++ ) - { - SbMethod* pM = (SbMethod*)xModule->GetMethods()->Get( nMacro ); - DBG_ASSERT( pM, "Method?" ); - pM->GetLineRange( nStart, nEnd ); - if ( nCurMethodStart >= nStart && nCurMethodStart <= nEnd ) - { - // matched a method to the cursor position - pMethod = pM; - break; - } - } - if ( !pMethod ) - { - // If not in a method then prompt the user - return ( BasicIDE::ChooseMacro( uno::Reference< frame::XModel >(), sal_False, rtl::OUString() ).getLength() > 0 ) ? sal_True : sal_False; - } - if ( pMethod ) - { - pMethod->SetDebugFlags( aStatus.nBasicFlags ); - BasicDLL::SetDebugMode( sal_True ); - BasicIDE::RunMethod( pMethod ); - BasicDLL::SetDebugMode( sal_False ); - // Falls waehrend Interactive=sal_False abgebrochen - BasicDLL::EnableBreak( sal_True ); - } - ClearStatus( BASWIN_RUNNINGBASIC ); - } - else - aStatus.bIsRunning = sal_False; // Abbruch von Reschedule() - } - - sal_Bool bDone = !aStatus.bError; - - return bDone; -} - -sal_Bool ModulWindow::CompileBasic() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - CheckCompileBasic(); - - sal_Bool bIsCompiled = sal_False; - if ( XModule().Is() ) - bIsCompiled = xModule->IsCompiled(); - - return bIsCompiled; -} - -sal_Bool ModulWindow::BasicRun() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - - aStatus.nBasicFlags = 0; - sal_Bool bDone = BasicExecute(); - return bDone; -} - -sal_Bool ModulWindow::BasicStepOver() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - aStatus.nBasicFlags = SbDEBUG_STEPINTO | SbDEBUG_STEPOVER; - sal_Bool bDone = BasicExecute(); - return bDone; -} - - -sal_Bool ModulWindow::BasicStepInto() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - - aStatus.nBasicFlags = SbDEBUG_STEPINTO; - sal_Bool bDone = BasicExecute(); - return bDone; -} - -sal_Bool ModulWindow::BasicStepOut() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - - aStatus.nBasicFlags = SbDEBUG_STEPOUT; - sal_Bool bDone = BasicExecute(); - return bDone; -} - - - -void ModulWindow::BasicStop() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - - GetBasic()->Stop(); - aStatus.bIsRunning = sal_False; -} - -sal_Bool ModulWindow::LoadBasic() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - sal_Bool bDone = sal_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 ); - - 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, sal_True ); - SvStream* pStream = aMedium.GetInStream(); - if ( pStream ) - { - AssertValidEditEngine(); - sal_uLong nLines = CalcLineCount( *pStream ); - // nLines*4: ReadText/Formatting/Highlighting/Formatting - GetEditorWindow().CreateProgress( String( IDEResId( RID_STR_GENERATESOURCE ) ), nLines*4 ); - GetEditEngine()->SetUpdateMode( sal_False ); - GetEditView()->Read( *pStream ); - GetEditEngine()->SetUpdateMode( sal_True ); - GetEditorWindow().Update(); // Es wurde bei UpdateMode = sal_True nur Invalidiert - GetEditorWindow().ForceSyntaxTimeout(); - GetEditorWindow().DestroyProgress(); - sal_uLong nError = aMedium.GetError(); - if ( nError ) - ErrorHandler::HandleError( nError ); - else - bDone = sal_True; - } - else - ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_COULDNTREAD ) ) ).Execute(); - } - return bDone; -} - - -sal_Bool ModulWindow::SaveBasicSource() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - sal_Bool bDone = sal_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 ); - - 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, sal_True, sal_False ); - SvStream* pStream = aMedium.GetOutStream(); - if ( pStream ) - { - EnterWait(); - AssertValidEditEngine(); - GetEditEngine()->Write( *pStream ); - aMedium.Commit(); - LeaveWait(); - sal_uLong nError = aMedium.GetError(); - if ( nError ) - ErrorHandler::HandleError( nError ); - else - bDone = sal_True; - } - else - ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_COULDNTWRITE) ) ).Execute(); - } - - return bDone; -} - -sal_Bool implImportDialog( Window* pWin, const String& rCurPath, const ScriptDocument& rDocument, const String& aLibName ); - -sal_Bool ModulWindow::ImportDialog() -{ - const ScriptDocument& rDocument = GetDocument(); - String aLibName = GetLibName(); - sal_Bool bRet = implImportDialog( this, aCurPath, rDocument, aLibName ); - return bRet; -} - -sal_Bool ModulWindow::ToggleBreakPoint( sal_uLong nLine ) -{ - DBG_ASSERT( XModule().Is(), "Kein Modul!" ); - - sal_Bool bNewBreakPoint = sal_False; - - if ( XModule().Is() ) - { - CheckCompileBasic(); - if ( aStatus.bError ) - { - Sound::Beep(); - return sal_False; - } - - BreakPoint* pBrk = GetBreakPoints().FindBreakPoint( nLine ); - if ( pBrk ) // entfernen - { - xModule->ClearBP( (sal_uInt16)nLine ); - delete GetBreakPoints().remove( pBrk ); - } - else // einen erzeugen - { - if ( xModule->SetBP( (sal_uInt16)nLine) ) - { - GetBreakPoints().InsertSorted( new BreakPoint( nLine ) ); - bNewBreakPoint = sal_True; - if ( StarBASIC::IsRunning() ) - { - for ( sal_uInt16 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( (sal_uInt16)rBrk.nLine ); - else - xModule->ClearBP( (sal_uInt16)rBrk.nLine ); - } -} - - -sal_Bool ModulWindow::BasicToggleBreakPoint() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - AssertValidEditEngine(); - - TextSelection aSel = GetEditView()->GetSelection(); - aSel.GetStart().GetPara()++; // Basic-Zeilen beginnen bei 1! - aSel.GetEnd().GetPara()++; - - sal_Bool bNewBreakPoint = sal_False; - - for ( sal_uLong nLine = aSel.GetStart().GetPara(); nLine <= aSel.GetEnd().GetPara(); nLine++ ) - { - if ( ToggleBreakPoint( nLine ) ) - bNewBreakPoint = sal_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 ( sal_uLong nLine = ++aSel.GetStart().GetPara(), nEnd = ++aSel.GetEnd().GetPara(); nLine <= nEnd; ++nLine ) - { - BreakPoint* pBrk = rList.FindBreakPoint( nLine ); - if ( pBrk ) - { - pBrk->bEnabled = pBrk->bEnabled ? sal_False : sal_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() ); - sal_uInt16 nErrorLine = pBasic->GetLine() - 1; - sal_uInt16 nErrCol1 = pBasic->GetCol1(); - sal_uInt16 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... - sal_Bool bMarkError = ( pBasic == GetBasic() ) ? sal_True : sal_False; - if ( bMarkError ) - aXEditorWindow.GetBrkWindow().SetMarkerPos( nErrorLine, sal_True ); - - // #i47002# - Reference< awt::XWindow > xWindow = VCLUnoHelper::GetInterface( this ); - - ErrorHandler::HandleError( StarBASIC::GetErrorCode() ); - - // #i47002# - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); - if ( !pWindow ) - return sal_False; - - if ( bMarkError ) - aXEditorWindow.GetBrkWindow().SetMarkerPos( MARKER_NOMARKER ); - return sal_False; -} - -long ModulWindow::BasicBreakHdl( StarBASIC* pBasic ) -{ - DBG_CHKTHIS( ModulWindow, 0 ); - - // #i69280 Required in Window despite normal usage in next command! - (void)pBasic; - - // ReturnWert: sal_uInt16 => siehe SB-Debug-Flags - sal_uInt16 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 = sal_True; - aStatus.bIsRunning = sal_True; - - AddStatus( BASWIN_INRESCHEDULE ); - - BasicIDE::InvalidateDebuggerSlots(); - - while( aStatus.bIsRunning ) - Application::Yield(); - - aStatus.bIsInReschedule = sal_False; - aXEditorWindow.GetBrkWindow().SetMarkerPos( MARKER_NOMARKER ); - - ClearStatus( BASWIN_INRESCHEDULE ); - - return aStatus.nBasicFlags; -} - -void ModulWindow::BasicAddWatch() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - String aWatchStr; - sal_Bool bInserted = sal_False; - AssertValidEditEngine(); - sal_Bool bAdd = sal_True; - if ( !GetEditView()->HasSelection() ) - { - TextPaM aWordStart; - String aWord = GetEditEngine()->GetWord( GetEditView()->GetSelection().GetEnd(), &aWordStart ); - if ( aWord.Len() ) - { - TextSelection aSel( aWordStart ); - sal_uInt16& rIndex = aSel.GetEnd().GetIndex(); - rIndex = rIndex + aWord.Len(); - GetEditView()->SetSelection( aSel ); - bAdd = sal_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 = sal_True; - } - } - - if ( !bInserted ) - Sound::Beep(); -} - - - -void ModulWindow::BasicRemoveWatch() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - sal_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 ) - { - sal_uInt16 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( sal_False, sal_True ); - GetEditVScrollBar().SetThumbPos( pView->GetStartDocPos().Y() ); - } - pView->SetSelection( aSel ); - pView->ShowCursor(); - pView->GetWindow()->GrabFocus(); - } - } - } -} - - -void 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( sal_True ); -} - -sal_Bool ModulWindow::CanClose() -{ - DBG_CHKTHIS( ModulWindow, 0 ); - return sal_True; -} - - -sal_Bool ModulWindow::AllowUndo() -{ - return GetEditorWindow().CanModify(); -} - - -void 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( sal_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()->GetFont() ); - aFont.SetAlign( ALIGN_BOTTOM ); - aFont.SetTransparent( sal_True ); - aFont.SetSize( Size( 0, 360 ) ); - pPrinter->SetFont( aFont ); - pPrinter->SetMapMode( MAP_100TH_MM ); - - String aTitle( CreateQualifiedName() ); - - sal_uInt16 nLineHeight = (sal_uInt16) pPrinter->GetTextHeight(); // etwas mehr. - sal_uInt16 nParaSpace = 10; - - Size aPaperSz = pPrinter->GetOutputSize(); - aPaperSz.Width() -= (LMARGPRN+RMARGPRN); - aPaperSz.Height() -= (TMARGPRN+BMARGPRN); - - // nLinepPage stimmt nicht, wenn Zeilen umgebrochen werden muessen... - sal_uInt16 nLinespPage = (sal_uInt16) (aPaperSz.Height()/nLineHeight); - sal_uInt16 nCharspLine = (sal_uInt16) (aPaperSz.Width() / pPrinter->GetTextWidth( 'X' ) ); - sal_uLong nParas = GetEditEngine()->GetParagraphCount(); - - sal_uInt16 nPages = (sal_uInt16) (nParas/nLinespPage+1 ); - sal_uInt16 nCurPage = 1; - - // Header drucken... - lcl_PrintHeader( pPrinter, nPages, nCurPage, aTitle, nPrintPage == 0 ); - Point aPos( LMARGPRN, TMARGPRN ); - for ( sal_uLong nPara = 0; nPara < nParas; nPara++ ) - { - String aLine( GetEditEngine()->GetText( nPara ) ); - lcl_ConvertTabsToSpaces( aLine ); - sal_uInt16 nLines = aLine.Len()/nCharspLine+1; - for ( sal_uInt16 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 ModulWindow::ExecuteCommand( SfxRequest& rReq ) -{ - DBG_CHKTHIS( ModulWindow, 0 ); - AssertValidEditEngine(); - sal_uInt16 nSlot = rReq.GetSlot(); - switch ( nSlot ) - { - case SID_DELETE: - { - KeyEvent aFakeDelete( 0, KEY_DELETE ); - GetEditView()->KeyInput( aFakeDelete ); - break; - } - case SID_SELECTALL: - GetEditView()->SetSelection( TextSelection( TextPaM( 0, 0 ), TextPaM( 0xFFFFFFFF, 0xFFFF ) ) ); - break; - 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 ModulWindow::GetState( SfxItemSet &rSet ) -{ - DBG_CHKTHIS( ModulWindow, 0 ); - SfxWhichIter aIter(rSet); - for ( sal_uInt16 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 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( sal_False, sal_True ); - pCurScrollBar->SetThumbPos( GetEditView()->GetStartDocPos().X() ); - - } -} - - -sal_Bool ModulWindow::IsModified() -{ - return GetEditEngine() ? GetEditEngine()->IsModified() : sal_False; -} - - - -void ModulWindow::GoOnTop() -{ - IDE_DLL()->GetShell()->GetViewFrame()->ToTop(); -} - -String ModulWindow::GetSbModuleName() -{ - String aModuleName; - if ( XModule().Is() ) - aModuleName = xModule->GetName(); - return aModuleName; -} - - - -String ModulWindow::GetTitle() -{ - return GetSbModuleName(); -} - - - -void ModulWindow::FrameWindowMoved() -{ -} - - - -void ModulWindow::ShowCursor( sal_Bool bOn ) -{ - if ( GetEditEngine() ) - { - TextView* pView = GetEditEngine()->GetActiveView(); - if ( pView ) - { - if ( bOn ) - pView->ShowCursor(); - else - pView->HideCursor(); - } - } -} - - -Window* ModulWindow::GetLayoutWindow() -{ - return pLayout; -} - -void ModulWindow::AssertValidEditEngine() -{ - if ( !GetEditEngine() ) - GetEditorWindow().CreateEditEngine(); -} - -void ModulWindow::Deactivating() -{ - if ( GetEditView() ) - GetEditView()->EraseVirtualDevice(); -} - -sal_uInt16 ModulWindow::StartSearchAndReplace( const SvxSearchItem& rSearchItem, sal_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 ) ) ); - } - - sal_Bool bForward = !rSearchItem.GetBackward(); - sal_uInt16 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() ) - { - sal_Bool bAll = rSearchItem.GetCommand() == SVX_SEARCHCMD_REPLACE_ALL; - nFound = pView->Replace( rSearchItem.GetSearchOptions() , bAll , bForward ); - } - } - - if ( bFromStart && !nFound ) - pView->SetSelection( aSel ); - - return nFound; -} - -::svl::IUndoManager* ModulWindow::GetUndoManager() -{ - if ( GetEditEngine() ) - return &GetEditEngine()->GetUndoManager(); - return NULL; -} - -sal_uInt16 ModulWindow::GetSearchOptions() -{ - sal_uInt16 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 ModulWindow::BasicStarted() -{ - if ( XModule().Is() ) - { - aStatus.bIsRunning = sal_True; - BreakPointList& rList = GetBreakPoints(); - if ( rList.size() ) - { - rList.ResetHitCount(); - rList.SetBreakPointsInBasic( xModule ); - for ( sal_uInt16 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 ModulWindow::BasicStopped() -{ - aStatus.bIsRunning = sal_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( sal_Bool b ) -{ - if ( GetEditView() ) - GetEditView()->SetReadOnly( b ); -} - -sal_Bool ModulWindow::IsReadOnly() -{ - sal_Bool bReadOnly = sal_False; - - if ( GetEditView() ) - bReadOnly = GetEditView()->IsReadOnly(); - - return bReadOnly; -} - -sal_Bool ModulWindow::IsPasteAllowed() -{ - sal_Bool bPaste = sal_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 = sal_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(sal_False), - bHSplitted(sal_False), - m_pModulWindow(0), - m_aImagesNormal(IDEResId(RID_IMGLST_LAYOUT)) -{ - 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 ModulWindowLayout::Resize() -{ - // ScrollBars, etc. passiert in BasicIDEShell:Adjust... - ArrangeWindows(); -} - -void 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 = sal_True; - else - bHSplitted = sal_True; - - ArrangeWindows(); - return 0; -} - -sal_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 sal_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 sal_True; - } - } - } - return sal_False; -} - -void ModulWindowLayout::DockaWindow( DockingWindow* pDockingWindow ) -{ - if ( pDockingWindow == &aWatchWindow ) - { - // evtl. Sonderbehandlung... - ArrangeWindows(); - } - else if ( pDockingWindow == &aStackWindow ) - { - // evtl. Sonderbehandlung... - ArrangeWindows(); - } -#if OSL_DEBUG_LEVEL > 0 - else - OSL_FAIL( "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(); - sal_uLong nCount = rEditor.GetEditEngine()->GetParagraphCount(); - for (sal_uLong i = 0; i < nCount; ++i) - rEditor.DoDelayedSyntaxHighlight(i); - } -} - -Image ModulWindowLayout::getImage(sal_uInt16 nId) const -{ - return m_aImagesNormal.GetImage(nId); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |