340 lines
8.9 KiB
C++
340 lines
8.9 KiB
C++
/*************************************************************************
|
|
*
|
|
* $RCSfile: mybasic.cxx,v $
|
|
*
|
|
* $Revision: 1.3 $
|
|
*
|
|
* last change: $Author: gh $ $Date: 2001-03-14 11:33:54 $
|
|
*
|
|
* The Contents of this file are made available subject to the terms of
|
|
* either of the following licenses
|
|
*
|
|
* - GNU Lesser General Public License Version 2.1
|
|
* - Sun Industry Standards Source License Version 1.1
|
|
*
|
|
* Sun Microsystems Inc., October, 2000
|
|
*
|
|
* GNU Lesser General Public License Version 2.1
|
|
* =============================================
|
|
* Copyright 2000 by Sun Microsystems, Inc.
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
*
|
|
* This library 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 for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*
|
|
*
|
|
* Sun Industry Standards Source License Version 1.1
|
|
* =================================================
|
|
* The contents of this file are subject to the Sun Industry Standards
|
|
* Source License Version 1.1 (the "License"); You may not use this file
|
|
* except in compliance with the License. You may obtain a copy of the
|
|
* License at http://www.openoffice.org/license.html.
|
|
*
|
|
* Software provided under this License is provided on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
|
* See the License for the specific provisions governing your rights and
|
|
* obligations concerning the Software.
|
|
*
|
|
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
|
*
|
|
* Copyright: 2000 by Sun Microsystems, Inc.
|
|
*
|
|
* All Rights Reserved.
|
|
*
|
|
* Contributor(s): _______________________________________
|
|
*
|
|
*
|
|
************************************************************************/
|
|
|
|
#ifndef _MSGBOX_HXX //autogen
|
|
#include <vcl/msgbox.hxx>
|
|
#endif
|
|
#ifndef _SBXCLASS_HXX //autogen
|
|
#include <svtools/sbx.hxx>
|
|
#endif
|
|
|
|
// AB-Uno-Test
|
|
//#define unotest
|
|
#ifdef unotest
|
|
#ifndef _USR_UNO_HXX
|
|
#include <usr/uno.hxx>
|
|
#endif
|
|
#include <sbuno.hxx>
|
|
#include <sbunoobj.hxx>
|
|
#endif
|
|
|
|
#include "sbintern.hxx"
|
|
|
|
#ifndef _BASIC_TTRESHLP_HXX
|
|
#include "ttstrhlp.hxx"
|
|
#endif
|
|
#include "mybasic.hxx"
|
|
#include "basic.hrc"
|
|
#include "appbased.hxx"
|
|
|
|
#include "status.hxx"
|
|
#include "basic.hrc"
|
|
|
|
#include "object.hxx"
|
|
|
|
#include "comm_bas.hxx"
|
|
#include "processw.hxx"
|
|
|
|
TYPEINIT1(MyBasic,StarBASIC)
|
|
|
|
class MyFactory : public SbxFactory
|
|
{
|
|
public:
|
|
virtual SbxBase* Create( UINT16 nSbxId, UINT32 = SBXCR_SBX );
|
|
};
|
|
|
|
static SampleObjectFac aFac1;
|
|
static MyFactory aFac2;
|
|
static CommunicationFactory aComManFac;
|
|
static ProcessFactory aProcessFac;
|
|
static short nInst = 0;
|
|
|
|
SbxBase* MyFactory::Create( UINT16 nSbxId, UINT32 nCr )
|
|
{
|
|
if( nCr == SBXCR_TEST && nSbxId == SBXID_MYBASIC )
|
|
return new MyBasic;
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
MyBasic::MyBasic() : StarBASIC()
|
|
{
|
|
nError = 0;
|
|
if( !nInst++ )
|
|
{
|
|
AddFactory( &aFac1 );
|
|
AddFactory( &aFac2 );
|
|
AddFactory( &aComManFac );
|
|
AddFactory( &aProcessFac );
|
|
}
|
|
SbxVariable* p = new SbxCollection( CUniString("MyColl") );
|
|
p->SetName( CUniString("Objects") );
|
|
Insert( p );
|
|
|
|
// AB-Uno-Test
|
|
#ifdef unotest
|
|
// Uno-Service-Manager holenReflection Service bolen
|
|
createAndSetDefaultServiceManager(); // spaeter schon erledigt
|
|
|
|
// Uno-Test-Objekt holen
|
|
UsrAny aObjAny = getIntrospectionTestObject();
|
|
|
|
// Objekt verpacken in ein SbUnoObject packen
|
|
String aName( "UnoObject" );
|
|
SbxObjectRef xSbUnoObj = GetSbUnoObject( aName, aObjAny );
|
|
//SbxObjectRef xSbUnoObj = new SbUnoObject( aName, aObjAny );
|
|
Insert( (SbxObject*)xSbUnoObj );
|
|
#endif
|
|
|
|
pTestObject = NULL;
|
|
}
|
|
|
|
Link MyBasic::GenLogHdl()
|
|
{
|
|
return LINK( GetpApp()->GetAppWindow(), BasicFrame, Log );
|
|
}
|
|
|
|
Link MyBasic::GenWinInfoHdl()
|
|
{
|
|
return LINK( GetpApp()->GetAppWindow(), BasicFrame, WinInfo );
|
|
}
|
|
|
|
Link MyBasic::GenModuleWinExistsHdl()
|
|
{
|
|
return LINK( GetpApp()->GetAppWindow(), BasicFrame, ModuleWinExists );
|
|
}
|
|
|
|
void MyBasic::StartListening( SfxBroadcaster &rBroadcaster )
|
|
{
|
|
((BasicFrame*)GetpApp()->GetAppWindow())->StartListening( rBroadcaster );
|
|
}
|
|
|
|
void MyBasic::SetCompileModule( SbModule *pMod )
|
|
{
|
|
GetSbData()->pCompMod = pMod;
|
|
}
|
|
|
|
SbModule *MyBasic::GetCompileModule()
|
|
{
|
|
return GetSbData()->pCompMod;
|
|
}
|
|
|
|
String MyBasic::GenRealString( const String &aResString )
|
|
{
|
|
return ((BasicFrame*)GetpApp()->GetAppWindow())->GenRealString( aResString );
|
|
}
|
|
|
|
void MyBasic::LoadIniFile()
|
|
{
|
|
}
|
|
|
|
SbTextType MyBasic::GetSymbolType( const String &rSymbol, BOOL bWasTTControl )
|
|
{
|
|
return SB_SYMBOL; // Alles was hier landet ist vom Typ SB_SYMBOL und bleibt es auch
|
|
}
|
|
|
|
|
|
MyBasic::~MyBasic()
|
|
{
|
|
aErrors.Clear();
|
|
if( !--nInst )
|
|
{
|
|
RemoveFactory( &aFac1 );
|
|
RemoveFactory( &aFac2 );
|
|
RemoveFactory( &aComManFac );
|
|
RemoveFactory( &aProcessFac );
|
|
}
|
|
}
|
|
|
|
void MyBasic::Reset()
|
|
{
|
|
aErrors.Clear();
|
|
nError = 0;
|
|
}
|
|
|
|
BOOL MyBasic::Compile( SbModule* p )
|
|
{
|
|
Reset();
|
|
return StarBASIC::Compile( p );
|
|
}
|
|
|
|
BOOL MyBasic::ErrorHdl()
|
|
{
|
|
AppBasEd *pCurrWin = aBasicApp.pFrame->FindModuleWin( GetActiveModule()->GetName() );
|
|
if(pCurrWin)
|
|
pCurrWin->ToTop();
|
|
else
|
|
{ // erstmal Fenster aufmachen
|
|
String aModName = GetActiveModule()->GetName();
|
|
if ( aModName.Copy(0,2).CompareToAscii("--") == COMPARE_EQUAL )
|
|
aModName.Erase(0,2);
|
|
GetActiveModule()->SetName(aModName);
|
|
AppBasEd* p = new AppBasEd( aBasicApp.pFrame, GetActiveModule() );
|
|
p->Show();
|
|
p->GrabFocus();
|
|
pCurrWin = p;
|
|
}
|
|
if( IsCompilerError() )
|
|
{
|
|
aErrors.Insert(
|
|
new BasicError
|
|
( pCurrWin,
|
|
0, StarBASIC::GetErrorText(), GetLine(), GetCol1(), GetCol2() ),
|
|
LIST_APPEND );
|
|
nError++;
|
|
return BOOL( nError < 20 ); // Abbruch nach 20 Fehlern
|
|
}
|
|
else
|
|
{
|
|
ReportRuntimeError( pCurrWin );
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
void MyBasic::ReportRuntimeError( AppBasEd *pEditWin )
|
|
{
|
|
String nErrorText;
|
|
nErrorText = GetSpechialErrorText();
|
|
|
|
if ( pEditWin ) // just in case the focus is not right
|
|
pEditWin->ToTop();
|
|
|
|
BasicError( pEditWin,
|
|
GetVBErrorCode( GetErrorCode() ), nErrorText, GetLine(),
|
|
GetCol1(), GetCol2() ).Show();
|
|
}
|
|
|
|
const String MyBasic::GetSpechialErrorText()
|
|
{
|
|
return GetErrorText();
|
|
}
|
|
|
|
USHORT MyBasic::BreakHdl()
|
|
{
|
|
SbModule* pMod = GetActiveModule();
|
|
if( pMod )
|
|
{
|
|
AppEdit* pWin = aBasicApp.pFrame->FindModuleWin( pMod->GetName() );
|
|
if( !pWin )
|
|
{ // erstmal Fenster aufmachen
|
|
String aModName = GetActiveModule()->GetName();
|
|
if ( aModName.Copy(0,2).CompareToAscii("--") == COMPARE_EQUAL )
|
|
aModName.Erase(0,2);
|
|
GetActiveModule()->SetName(aModName);
|
|
AppWin* p = new AppBasEd( aBasicApp.pFrame, GetActiveModule() );
|
|
p->Show();
|
|
p->GrabFocus();
|
|
p->ToTop();
|
|
pWin = aBasicApp.pFrame->FindModuleWin( aModName );
|
|
}
|
|
pWin->Highlight( GetLine(), GetCol1(), GetCol2() );
|
|
}
|
|
|
|
if( IsBreak() ) // Wenn Breakpoint (oder "Run to Cursor")
|
|
{
|
|
// if ( GetActiveModule()->IsBP(GetLine()) )
|
|
// GetActiveModule()->ClearBP(GetLine());
|
|
return aBasicApp.pFrame->BreakHandler();
|
|
}
|
|
else
|
|
{
|
|
return aBasicApp.pFrame->BreakHandler();
|
|
}
|
|
}
|
|
|
|
/***************************************************************************
|
|
|*
|
|
|* class BasicError
|
|
|*
|
|
***************************************************************************/
|
|
|
|
BasicError::BasicError
|
|
( AppBasEd* w, USHORT nE, const String& r, USHORT nL, USHORT nC1, USHORT nC2 )
|
|
: aText( ResId( IDS_ERROR1 ) )
|
|
{
|
|
pWin = w;
|
|
nLine = nL;
|
|
nCol1 = nC1;
|
|
nCol2 = nC2;
|
|
if( nE )
|
|
{
|
|
aText += String::CreateFromInt32( nE );
|
|
aText.AppendAscii(": ");
|
|
aText += r;
|
|
}
|
|
else
|
|
aText = r;
|
|
}
|
|
|
|
// Dies ist ein Beispiel, wie die Fehler-Information geschickt
|
|
// aufgebaut werden kann, um ein Statement zu highlighten.
|
|
|
|
void BasicError::Show()
|
|
{
|
|
if( pWin && aBasicApp.pFrame->IsWinValid( pWin ) ) {
|
|
pWin->Highlight( nLine, nCol1, nCol2 );
|
|
aBasicApp.pFrame->pStatus->Message( aText );
|
|
} else MessBox( aBasicApp.pFrame, WB_OK, aBasicApp.pFrame->GetText(),
|
|
aText ).Execute();
|
|
}
|
|
|
|
|