975 lines
34 KiB
C++
975 lines
34 KiB
C++
/*************************************************************************
|
|
*
|
|
* $RCSfile: moduldl2.cxx,v $
|
|
*
|
|
* $Revision: 1.1.1.1 $
|
|
*
|
|
* last change: $Author: mh $ $Date: 2000-09-29 11:02:37 $
|
|
*
|
|
* 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): _______________________________________
|
|
*
|
|
*
|
|
************************************************************************/
|
|
|
|
|
|
#define GLOBALOVERFLOW
|
|
|
|
#include <ide_pch.hxx>
|
|
|
|
#ifdef VCL
|
|
#include <svtools/filedlg.hxx>
|
|
#endif
|
|
|
|
#pragma hdrstop
|
|
|
|
#include <sot/storinfo.hxx>
|
|
|
|
#include <moduldlg.hrc>
|
|
#include <moduldlg.hxx>
|
|
#include <basidesh.hrc>
|
|
#include <bastypes.hxx>
|
|
#include <basobj.hxx>
|
|
#include <baside2.hrc>
|
|
#include <iderdll.hxx>
|
|
#include <iderdll2.hxx>
|
|
#include <svx/passwd.hxx>
|
|
#include <sbxitem.hxx>
|
|
|
|
#ifndef _FSYS_HXX //autogen
|
|
#include <tools/fsys.hxx>
|
|
#endif
|
|
|
|
#ifndef _SVSTOR_HXX //autogen
|
|
#include <so3/svstor.hxx>
|
|
#endif
|
|
|
|
|
|
#ifndef _IODLG_HXX //autogen
|
|
#include <sfx2/iodlg.hxx>
|
|
#endif
|
|
|
|
|
|
|
|
LibPage::LibPage( Window * pParent ) :
|
|
TabPage( pParent,IDEResId( RID_TP_LIBS ) ),
|
|
aLibText( this, IDEResId( RID_STR_LIB ) ),
|
|
aLibBox( this, IDEResId( RID_TRLBOX ) ),
|
|
aBasicsBox( this, IDEResId( RID_LB_BASICS ) ),
|
|
aEditButton( this, IDEResId( RID_PB_EDIT ) ),
|
|
aCloseButton( this, IDEResId( RID_PB_CLOSE ) ),
|
|
aPasswordButton(this, IDEResId( RID_PB_PASSWORD ) ),
|
|
aNewLibButton( this, IDEResId( RID_PB_NEWLIB ) ),
|
|
aInsertLibButton( this, IDEResId( RID_PB_APPEND ) ),
|
|
aDelButton( this, IDEResId( RID_PB_DELETE ) )
|
|
{
|
|
FreeResource();
|
|
pTabDlg = 0;
|
|
|
|
aEditButton.SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
|
|
aNewLibButton.SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
|
|
aPasswordButton.SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
|
|
aInsertLibButton.SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
|
|
aDelButton.SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
|
|
aCloseButton.SetClickHdl( LINK( this, LibPage, ButtonHdl ) );
|
|
aLibBox.SetSelectHdl( LINK( this, LibPage, TreeListHighlightHdl ) );
|
|
|
|
aBasicsBox.SetSelectHdl( LINK( this, LibPage, BasicSelectHdl ) );
|
|
|
|
aLibBox.SetMode( LIBMODE_MANAGER );
|
|
aLibBox.EnableInplaceEditing( TRUE );
|
|
aLibBox.SetCheckButtonHdl( LINK( this, LibPage, CheckBoxHdl ) );
|
|
aCloseButton.GrabFocus();
|
|
|
|
long aTabs[] = { 2, 30, 120 };
|
|
aLibBox.SetTabs( aTabs, MAP_PIXEL );
|
|
|
|
FillListBox();
|
|
aBasicsBox.SelectEntryPos( 0 );
|
|
SetCurLib();
|
|
|
|
CheckButtons();
|
|
}
|
|
|
|
void LibPage::CheckButtons()
|
|
{
|
|
SvLBoxEntry* pCur = aLibBox.GetCurEntry();
|
|
BOOL bCurChecked = pCur ? aLibBox.IsChecked( aLibBox.GetModel()->GetAbsPos( pCur ) ) : FALSE;
|
|
if ( bCurChecked )
|
|
{
|
|
aEditButton.Enable();
|
|
if ( aLibBox.GetModel()->GetAbsPos( pCur ) != 0 )
|
|
aPasswordButton.Enable();
|
|
else
|
|
aPasswordButton.Disable();
|
|
}
|
|
else
|
|
{
|
|
aEditButton.Disable();
|
|
aPasswordButton.Disable();
|
|
}
|
|
|
|
if ( pCur && aLibBox.GetModel()->GetAbsPos( pCur ) )
|
|
aDelButton.Enable();
|
|
else
|
|
aDelButton.Disable();
|
|
}
|
|
|
|
|
|
|
|
IMPL_LINK_INLINE_START( LibPage, CheckBoxHdl, SvTreeListBox *, EMPTYARG )
|
|
{
|
|
CheckButtons();
|
|
return 0;
|
|
}
|
|
IMPL_LINK_INLINE_END( LibPage, CheckBoxHdl, SvTreeListBox *, EMPTYARG )
|
|
|
|
|
|
|
|
void __EXPORT LibPage::ActivatePage()
|
|
{
|
|
SetCurLib();
|
|
}
|
|
|
|
|
|
|
|
void __EXPORT LibPage::DeactivatePage()
|
|
{
|
|
ActivateCurrentLibSettings();
|
|
}
|
|
|
|
|
|
|
|
IMPL_LINK_INLINE_START( LibPage, TreeListHighlightHdl, SvTreeListBox *, pBox )
|
|
{
|
|
if ( pBox->IsSelected( pBox->GetHdlEntry() ) )
|
|
CheckButtons();
|
|
return 0;
|
|
}
|
|
IMPL_LINK_INLINE_END( LibPage, TreeListHighlightHdl, SvTreeListBox *, pBox )
|
|
|
|
|
|
|
|
IMPL_LINK_INLINE_START( LibPage, BasicSelectHdl, ListBox *, pBox )
|
|
{
|
|
SetCurLib();
|
|
CheckButtons();
|
|
return 0;
|
|
}
|
|
IMPL_LINK_INLINE_END( LibPage, BasicSelectHdl, ListBox *, pBox )
|
|
|
|
|
|
|
|
IMPL_LINK( LibPage, ButtonHdl, Button *, pButton )
|
|
{
|
|
if ( pButton == &aEditButton )
|
|
{
|
|
ActivateCurrentLibSettings();
|
|
SfxViewFrame* pCurFrame = SfxViewFrame::Current();
|
|
DBG_ASSERT( pCurFrame != NULL, "No current view frame!" );
|
|
SfxDispatcher* pDispatcher = pCurFrame ? pCurFrame->GetDispatcher() : NULL;
|
|
if( pDispatcher )
|
|
{
|
|
pDispatcher->Execute( SID_BASICIDE_APPEAR, SFX_CALLMODE_SYNCHRON );
|
|
}
|
|
SvLBoxEntry* pCurEntry = aLibBox.GetCurEntry();
|
|
DBG_ASSERT( pCurEntry, "Entry?!" );
|
|
String aLib( CreateMgrAndLibStr( aCurBasMgr, aLibBox.GetEntryText( pCurEntry, 0 ) ) );
|
|
SfxStringItem aLibName( SID_BASICIDE_ARG_LIBNAME, aLib );
|
|
if( pDispatcher )
|
|
{
|
|
pDispatcher->Execute( SID_BASICIDE_LIBSELECTED,
|
|
SFX_CALLMODE_ASYNCHRON, &aLibName, 0L );
|
|
}
|
|
EndTabDialog( 1 );
|
|
}
|
|
else if ( pButton == &aNewLibButton )
|
|
NewLib();
|
|
else if ( pButton == &aInsertLibButton )
|
|
InsertLib();
|
|
else if ( pButton == &aDelButton )
|
|
DeleteCurrent();
|
|
else if ( pButton == &aCloseButton )
|
|
{
|
|
ActivateCurrentLibSettings();
|
|
EndTabDialog( 0 );
|
|
}
|
|
else if ( pButton == &aPasswordButton )
|
|
{
|
|
String aBasicManager( aBasicsBox.GetSelectEntry() );
|
|
BasicManager* pBasMgr = BasicIDE::FindBasicManager( aBasicManager );
|
|
DBG_ASSERT( pBasMgr, "BasicManager?!" );
|
|
|
|
SvLBoxEntry* pCurEntry = aLibBox.GetCurEntry();
|
|
USHORT nLib = (USHORT)aLibBox.GetModel()->GetAbsPos( pCurEntry );
|
|
|
|
BOOL bHadPassword = aLibBox.GetBasicManager()->HasPassword( nLib );
|
|
// Noch nicht geladen, falls gerade erst aktiviert.
|
|
// Wuerde sonst erst beim Beenden des Dlg's geschehen.
|
|
if ( !aLibBox.GetBasicManager()->IsLibLoaded( nLib ) )
|
|
{
|
|
Application::EnterWait();
|
|
aLibBox.GetBasicManager()->LoadLib( nLib );
|
|
Application::LeaveWait();
|
|
}
|
|
|
|
SvxPasswordDialog* pDlg = new SvxPasswordDialog( this, TRUE );
|
|
String aPassword = pBasMgr->GetPassword( nLib );
|
|
#ifdef DEBUG
|
|
InfoBox( 0, aPassword ).Execute();
|
|
#endif
|
|
pDlg->SetOldPassword( aPassword );
|
|
|
|
if ( pDlg->Execute() == RET_OK )
|
|
{
|
|
pBasMgr->SetPassword( nLib, pDlg->GetNewPassword() );
|
|
pBasMgr->SetPasswordVerified( nLib );
|
|
if ( bHadPassword != aLibBox.GetBasicManager()->HasPassword( nLib ) )
|
|
{
|
|
aLibBox.GetModel()->Remove( pCurEntry );
|
|
ImpInsertLibEntry( nLib );
|
|
aLibBox.GetBasicManager()->SetPasswordVerified( nLib );
|
|
}
|
|
}
|
|
delete pDlg;
|
|
}
|
|
CheckButtons();
|
|
return 0;
|
|
}
|
|
|
|
void LibPage::NewLib()
|
|
{
|
|
BasicManager* pBasMgr = BasicIDE::FindBasicManager( aCurBasMgr );
|
|
DBG_ASSERT( pBasMgr, "BasMgr?!" );
|
|
String aLibName;
|
|
String aLibStdName( IDEResId( RID_STR_STDLIBNAME ) );
|
|
BOOL bValid = FALSE;
|
|
USHORT i = 1;
|
|
while ( !bValid )
|
|
{
|
|
aLibName = aLibStdName;
|
|
aLibName += String::CreateFromInt32( i );
|
|
if ( !pBasMgr->HasLib( aLibName ) )
|
|
bValid = TRUE;
|
|
i++;
|
|
}
|
|
|
|
NewObjectDialog* pNewDlg = new NewObjectDialog( this, NEWOBJECTMODE_LIB );
|
|
pNewDlg->SetObjectName( aLibName );
|
|
BOOL bEnableSepFile = ( pBasMgr->GetStorageName().Len() && ( pBasMgr == SFX_APP()->GetBasicManager() ) );
|
|
pNewDlg->EnableSeparateFile( bEnableSepFile );
|
|
if ( pNewDlg->Execute() )
|
|
{
|
|
if ( pNewDlg->GetObjectName().Len() )
|
|
aLibName = pNewDlg->GetObjectName();
|
|
|
|
if ( aLibName.Len() > 30 )
|
|
{
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_LIBNAMETOLONG ) ) ).Execute();
|
|
}
|
|
else if ( !BasicIDE::IsValidSbxName( aLibName ) )
|
|
{
|
|
ErrorBox( this, WB_OK | WB_DEF_OK,
|
|
String( IDEResId( RID_STR_BADSBXNAME ) ) ).Execute();
|
|
}
|
|
else if ( pBasMgr->HasLib( aLibName ) )
|
|
{
|
|
ErrorBox( this, WB_OK | WB_DEF_OK,
|
|
String( IDEResId( RID_STR_SBXNAMEALLREADYUSED2 ) ) ).Execute();
|
|
}
|
|
else
|
|
{
|
|
BOOL bCreateLib = TRUE;
|
|
String aLibStorageName;
|
|
if ( pNewDlg->IsSeparateFile() )
|
|
{
|
|
DirEntry aDirEntry( pBasMgr->GetStorageName() );
|
|
String aExt = aDirEntry.GetExtension();
|
|
aDirEntry.SetName( aLibName );
|
|
aDirEntry.SetExtension( aExt );
|
|
aLibStorageName = aDirEntry.GetFull();
|
|
if ( aDirEntry.Exists() )
|
|
{
|
|
String aText( IDEResId( RID_STR_FILEEXISTS ) );
|
|
aText.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "XX" ) ), aLibStorageName );
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, aText ).Execute();
|
|
bCreateLib = FALSE;
|
|
}
|
|
}
|
|
|
|
if ( bCreateLib )
|
|
{
|
|
StarBASIC* pLib = pBasMgr->CreateLib( aLibName );
|
|
|
|
SvLBoxEntry* pEntry = aLibBox.InsertEntry( aLibName );
|
|
USHORT nPos = (USHORT)aLibBox.GetModel()->GetAbsPos( pEntry );
|
|
USHORT nLib = pBasMgr->GetLibId( aLibName );
|
|
aLibBox.CheckEntryPos( nPos, pBasMgr->IsLibLoaded( nLib ) );
|
|
|
|
if ( aLibStorageName.Len() )
|
|
{
|
|
DirEntry aDirEntry( aLibStorageName );
|
|
String aShortName = aDirEntry.GetName();
|
|
|
|
// Immer 8.3
|
|
DirEntry aTempEntry( aDirEntry.GetPath() );
|
|
if( aTempEntry.MakeShortName( aDirEntry.GetName(), FSYS_KIND_NONE, TRUE, FSYS_STYLE_FAT ) )
|
|
{
|
|
aLibStorageName = aTempEntry.GetFull();
|
|
aShortName = aTempEntry.GetName();
|
|
}
|
|
pBasMgr->SetLibStorageName( nLib, aLibStorageName );
|
|
aLibBox.SetEntryText( aShortName, pEntry, 1 );
|
|
|
|
// Sofort speichern, sonst erhaelt man ggf. spaeter
|
|
// nochmal den gleichen ShortName
|
|
pBasMgr->StoreLib( nLib );
|
|
}
|
|
|
|
// Ein Modul anlegen:
|
|
SbModule* pModule = BasicIDE::CreateModule( pLib, String(), TRUE );
|
|
DBG_ASSERT( pModule , "Modul wurde nicht erzeugt!" );
|
|
SbxItem aSbxItem( SID_BASICIDE_ARG_SBX, pModule );
|
|
|
|
SfxViewFrame* pCurFrame = SfxViewFrame::Current();
|
|
DBG_ASSERT( pCurFrame != NULL, "No current view frame!" );
|
|
SfxDispatcher* pDispatcher = pCurFrame ? pCurFrame->GetDispatcher() : NULL;
|
|
if( pDispatcher )
|
|
{
|
|
pDispatcher->Execute( SID_BASICIDE_SBXINSERTED,
|
|
SFX_CALLMODE_SYNCHRON, &aSbxItem, 0L );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
delete pNewDlg;
|
|
}
|
|
|
|
void LibPage::InsertLib()
|
|
{
|
|
// BasicManager* pBasMgr = BasicIDE::FindBasicManager( aCurBasMgr );
|
|
BasicManager* pBasMgr = aLibBox.GetBasicManager();
|
|
DBG_ASSERT( pBasMgr, "BasMgr?!" );
|
|
|
|
SfxFileDialog aFileDialogBox( this, WinBits( WB_OPEN | WB_3DLOOK ) );
|
|
aFileDialogBox.SetText( String( IDEResId( RID_STR_APPENDLIBS ) ) );
|
|
aFileDialogBox.AddFilter( String( IDEResId( RID_STR_BASIC ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.sbl" ) ) );
|
|
aFileDialogBox.AddFilter( String( IDEResId( RID_STR_DOC ) ), String( RTL_CONSTASCII_USTRINGPARAM( "*.sdw;*.sdc;*.sdd" ) ) );
|
|
|
|
String aPath( IDE_DLL()->GetExtraData()->GetAddLibPath() );
|
|
if ( aPath.Len() )
|
|
{
|
|
aFileDialogBox.SetPath( aPath );
|
|
aFileDialogBox.SetCurFilter( IDE_DLL()->GetExtraData()->GetAddLibFilter() );
|
|
}
|
|
else
|
|
{
|
|
// Macro-Pfad vom Ini-Manager
|
|
SfxIniManager* pIni = SFX_INIMANAGER()->Find( SFX_KEY_WORK_PATH );
|
|
if ( !pIni )
|
|
pIni = SFX_INIMANAGER();
|
|
DBG_ASSERT( pIni, "Ini?!" );
|
|
aPath = pIni->Get( SFX_KEY_WORK_PATH );
|
|
aPath += DirEntry::GetAccessDelimiter();
|
|
aFileDialogBox.SetPath( aPath );
|
|
aFileDialogBox.SetCurFilter( String( IDEResId( RID_STR_DOC ) ) );
|
|
}
|
|
|
|
if ( aFileDialogBox.Execute() )
|
|
{
|
|
aPath = aFileDialogBox.GetPath();
|
|
IDE_DLL()->GetExtraData()->SetAddLibPath( aPath );
|
|
IDE_DLL()->GetExtraData()->SetAddLibFilter( aFileDialogBox.GetCurFilter() );
|
|
DirEntry aDirEntry( aPath );
|
|
String aFullName( aDirEntry.GetFull() );
|
|
if ( SvStorage::IsStorageFile( aFullName ) )
|
|
{
|
|
SvStorageRef xStorage = new SvStorage( aFullName, STREAM_READ | STREAM_SHARE_DENYWRITE );
|
|
if ( xStorage->GetError() )
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_ERROROPENSTORAGE ) ) ).Execute();
|
|
else
|
|
{
|
|
// Die einzelnen Libs aus dem BasicStorage...
|
|
SvStorageRef xBasicStorage = xStorage->OpenStorage( String( RTL_CONSTASCII_USTRINGPARAM( "StarBASIC" ) ), STREAM_READ | STREAM_SHARE_DENYWRITE, 0 );
|
|
if ( xBasicStorage->GetError() )
|
|
InfoBox( this, String( IDEResId( RID_STR_NOLIBINSTORAGE ) ) ).Execute();
|
|
else
|
|
{
|
|
LibDialog* pLibDlg = 0;
|
|
SvStorageInfoList aInfoList( 4, 4 );
|
|
xBasicStorage->FillInfoList( &aInfoList );
|
|
for ( USHORT nStream = 0; nStream < aInfoList.Count(); nStream++ )
|
|
{
|
|
SvStorageInfo& rInf = aInfoList[nStream];
|
|
if ( rInf.IsStream() )
|
|
{
|
|
if ( !pLibDlg )
|
|
{
|
|
pLibDlg = new LibDialog( this );
|
|
pLibDlg->SetStorageName( aDirEntry.GetName() );
|
|
pLibDlg->GetLibBox().SetMode( LIBMODE_CHOOSER );
|
|
if ( pBasMgr == SFX_APP()->GetBasicManager() )
|
|
pLibDlg->SetSeparateFileEnabled( TRUE );
|
|
}
|
|
SvLBoxEntry* pEntry = pLibDlg->GetLibBox().InsertEntry( rInf.GetName() );
|
|
USHORT nPos = (USHORT) pLibDlg->GetLibBox().GetModel()->GetAbsPos( pEntry );
|
|
pLibDlg->GetLibBox().CheckEntryPos( nPos, TRUE);
|
|
|
|
}
|
|
}
|
|
xBasicStorage.Clear();
|
|
if ( !pLibDlg )
|
|
InfoBox( this, String( IDEResId( RID_STR_NOLIBINSTORAGE ) ) ).Execute();
|
|
else
|
|
{
|
|
BOOL bChanges = FALSE;
|
|
if ( pLibDlg->Execute() )
|
|
{
|
|
ULONG nNewPos = aLibBox.GetEntryCount();
|
|
// ULONG nCurPos = aLibBox.GetAbsPos( aLibBox.GetCurEntry() );
|
|
BOOL bReplace = pLibDlg->IsReplace();
|
|
BOOL bReference = pLibDlg->IsReference();
|
|
for ( USHORT nLib = 0; nLib < pLibDlg->GetLibBox().GetEntryCount(); nLib++ )
|
|
{
|
|
if ( pLibDlg->GetLibBox().IsChecked( nLib ) )
|
|
{
|
|
SvLBoxEntry* pEntry = pLibDlg->GetLibBox().GetEntry( nLib );
|
|
DBG_ASSERT( pEntry, "Entry?!" );
|
|
String aName( pLibDlg->GetLibBox().GetEntryText( pEntry, 0 ) );
|
|
// Optionen auswerten...
|
|
if ( pBasMgr->HasLib( aName ) )
|
|
{
|
|
// Die Standard-Lib kann nicht ersetzt werden,
|
|
// weil Basics verkettet.
|
|
if ( bReplace && ( pBasMgr->GetLib( aName ) == pBasMgr->GetStdLib() ) )
|
|
{
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_REPLACESTDLIB ) ) ).Execute();
|
|
continue;
|
|
}
|
|
if ( bReplace )
|
|
{
|
|
SvLBoxEntry* pEntry = aLibBox.FindEntry( aName );
|
|
if ( pEntry )
|
|
aLibBox.SvTreeListBox::GetModel()->Remove( pEntry );
|
|
pBasMgr->RemoveLib( pBasMgr->GetLibId( aName ) );
|
|
}
|
|
else if ( bReference )
|
|
{
|
|
// Referenz nicht moeglich, wenn Lib mit
|
|
// Namen schon existiert, ausser bei Replace.
|
|
String aErrStr( IDEResId( RID_STR_REFNOTPOSSIBLE ) );
|
|
aErrStr.SearchAndReplace( String( RTL_CONSTASCII_USTRINGPARAM( "XX" ) ), aName );
|
|
aErrStr += '\n';
|
|
aErrStr += String( IDEResId( RID_STR_SBXNAMEALLREADYUSED ) );
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, aErrStr ).Execute();
|
|
continue;
|
|
}
|
|
}
|
|
StarBASIC* pNew = pBasMgr->AddLib( *xStorage, aName, bReference );
|
|
if ( !pNew )
|
|
{
|
|
String aErrStr( IDEResId( RID_STR_ERROROPENLIB ) );
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, aErrStr ).Execute();
|
|
continue;
|
|
}
|
|
USHORT nLib = pBasMgr->GetLibId( pNew->GetName() );
|
|
if ( pLibDlg->IsSeparateFile() )
|
|
{
|
|
DirEntry aDirEntry( pBasMgr->GetStorageName() );
|
|
String aExt = aDirEntry.GetExtension();
|
|
aDirEntry.SetName( pBasMgr->GetLibName( nLib ) );
|
|
aDirEntry.SetExtension( aExt );
|
|
pBasMgr->SetLibStorageName( nLib, aDirEntry.GetFull() );
|
|
}
|
|
DBG_ASSERT( nLib != LIB_NOTFOUND, "Lib nicht eingefuegt?!" );
|
|
ImpInsertLibEntry( nLib );
|
|
bChanges = TRUE;
|
|
}
|
|
}
|
|
SvLBoxEntry* pFirstNew = aLibBox.GetEntry( nNewPos );
|
|
if ( pFirstNew )
|
|
aLibBox.SetCurEntry( pFirstNew );
|
|
}
|
|
delete pLibDlg;
|
|
if ( bChanges )
|
|
BasicIDE::MarkDocShellModified( pBasMgr->GetStdLib() );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Erstmal nur in Storages moeglich, wie soll ein Basic in eine
|
|
// Datei kommen?
|
|
InfoBox( this, String( IDEResId( RID_STR_NOLIBINSTORAGE ) ) ).Execute();
|
|
}
|
|
}
|
|
}
|
|
|
|
void LibPage::DeleteCurrent()
|
|
{
|
|
BasicManager* pBasMgr = BasicIDE::FindBasicManager( aCurBasMgr );
|
|
DBG_ASSERT( pBasMgr, "BasMgr?!" );
|
|
SvLBoxEntry* pCurEntry = aLibBox.GetCurEntry();
|
|
DBG_ASSERT( pCurEntry && aLibBox.GetModel()->GetAbsPos( pCurEntry ), "Kann nicht loeschen!" );
|
|
String aLibName( aLibBox.GetEntryText( pCurEntry, 0 ) );
|
|
USHORT nLib = pBasMgr->GetLibId( aLibName );
|
|
if ( QueryDelLib( aLibName, pBasMgr->IsReference( nLib ), this ) )
|
|
{
|
|
// BasicIDE informieren, falls oben.
|
|
String aLib( CreateMgrAndLibStr( aCurBasMgr, aLibName ) );
|
|
SfxStringItem aLibItem( SID_BASICIDE_ARG_LIBNAME, aLib );
|
|
SfxViewFrame* pCurFrame = SfxViewFrame::Current();
|
|
DBG_ASSERT( pCurFrame != NULL, "No current view frame!" );
|
|
SfxDispatcher* pDispatcher = pCurFrame ? pCurFrame->GetDispatcher() : NULL;
|
|
if( pDispatcher )
|
|
{
|
|
pDispatcher->Execute( SID_BASICIDE_LIBREMOVED,
|
|
SFX_CALLMODE_SYNCHRON, &aLibItem, 0L );
|
|
}
|
|
pBasMgr->RemoveLib( nLib, TRUE );
|
|
((SvLBox&)aLibBox).GetModel()->Remove( pCurEntry );
|
|
BasicIDE::MarkDocShellModified( pBasMgr->GetStdLib() );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void LibPage::EndTabDialog( USHORT nRet )
|
|
{
|
|
DBG_ASSERT( pTabDlg, "TabDlg nicht gesetzt!" );
|
|
if ( pTabDlg )
|
|
pTabDlg->EndDialog( nRet );
|
|
}
|
|
|
|
|
|
|
|
void LibPage::FillListBox()
|
|
{
|
|
BasicManager* pBasicMgr = SFX_APP()->GetBasicManager();
|
|
SfxObjectShell* pDocShell = 0;
|
|
while ( pBasicMgr )
|
|
{
|
|
// Nur, wenn es ein dazugehoeriges Fenster gibt, damit nicht die
|
|
// Gecachten Docs, die nicht sichtbar sind ( Remot-Dokumente )
|
|
if ( !pDocShell || ( ( pBasicMgr != SFX_APP()->GetBasicManager() )
|
|
&& ( SfxViewFrame::GetFirst( pDocShell ) ) ) )
|
|
{
|
|
String aBasMgr;
|
|
if (pDocShell)
|
|
aBasMgr = pDocShell->GetTitle( SFX_TITLE_FILENAME );
|
|
else
|
|
aBasMgr = Application::GetAppName();
|
|
|
|
aBasicsBox.InsertEntry( aBasMgr, LISTBOX_APPEND );
|
|
}
|
|
|
|
if ( pDocShell )
|
|
pDocShell = SfxObjectShell::GetNext( *pDocShell );
|
|
else
|
|
pDocShell = SfxObjectShell::GetFirst();
|
|
|
|
pBasicMgr = ( pDocShell ? pDocShell->GetBasicManager() : 0 );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void LibPage::SetCurLib()
|
|
{
|
|
String aSelected( aBasicsBox.GetSelectEntry() );
|
|
if ( aSelected != aCurBasMgr )
|
|
{
|
|
ActivateCurrentLibSettings();
|
|
aCurBasMgr = aSelected;
|
|
BasicManager* pBasMgr = BasicIDE::FindBasicManager( aCurBasMgr );
|
|
DBG_ASSERT( pBasMgr, "BasMgr?!" );
|
|
aLibBox.SetBasicManager( pBasMgr );
|
|
USHORT nLibs = pBasMgr->GetLibCount();
|
|
aLibBox.Clear();
|
|
Image aLockedImg( IDEResId( RID_IMG_LOCKED ) );
|
|
for ( USHORT nLib = 0; nLib < nLibs; nLib++ )
|
|
ImpInsertLibEntry( nLib );
|
|
aLibBox.SetCurEntry( aLibBox.GetEntry( 0 ) );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void LibPage::ActivateCurrentLibSettings()
|
|
{
|
|
BasicManager* pBasMgr = BasicIDE::FindBasicManager( aCurBasMgr );
|
|
if ( pBasMgr ) // Beim ersten mal 0
|
|
{
|
|
USHORT nLibs = (USHORT) aLibBox.GetEntryCount();
|
|
// StandardLib kann nicht geaendert werden...
|
|
for ( USHORT nLib = 1; nLib < nLibs; nLib++ )
|
|
{
|
|
BOOL bChecked = aLibBox.IsChecked( nLib );
|
|
if ( bChecked != pBasMgr->IsLibLoaded( nLib ) )
|
|
{
|
|
String aLibName( pBasMgr->GetLibName( nLib ) );
|
|
String aLib( CreateMgrAndLibStr( aCurBasMgr, aLibName ) );
|
|
SfxStringItem aLibItem( SID_BASICIDE_ARG_LIBNAME, aLib );
|
|
|
|
SfxViewFrame* pCurFrame = SfxViewFrame::Current();
|
|
DBG_ASSERT( pCurFrame != NULL, "No current view frame!" );
|
|
SfxDispatcher* pDispatcher = pCurFrame ? pCurFrame->GetDispatcher() : NULL;
|
|
if ( bChecked )
|
|
{
|
|
pBasMgr->LoadLib( nLib );
|
|
if( pDispatcher )
|
|
{
|
|
pDispatcher->Execute( SID_BASICIDE_LIBLOADED,
|
|
SFX_CALLMODE_ASYNCHRON, &aLibItem, 0L );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Vorher aufrufen, damit noch im BasMgr
|
|
if( pDispatcher )
|
|
{
|
|
pDispatcher->Execute( SID_BASICIDE_LIBREMOVED,
|
|
SFX_CALLMODE_SYNCHRON, &aLibItem, 0L );
|
|
}
|
|
pBasMgr->StoreLib( nLib );
|
|
pBasMgr->UnloadLib( nLib );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SvLBoxEntry* LibPage::ImpInsertLibEntry( USHORT nLib )
|
|
{
|
|
BasicManager* pBasicManager = aLibBox.GetBasicManager();
|
|
DBG_ASSERT( pBasicManager, "ImpInsertLibEntry: Kein BasicManager!" );
|
|
BOOL bPassword = pBasicManager->HasPassword( nLib );
|
|
// if ( !pBasicManager->IsLibLoaded( nLib ) )
|
|
// {
|
|
// // Lib muss geladen sein, wenn Passwortabfrage...
|
|
// pBasicManager->LoadLib( nLib );
|
|
// bPassword = pBasicManager->HasPassword( nLib );
|
|
// pBasicManager->UnloadLib( nLib );
|
|
// }
|
|
if ( bPassword )
|
|
{
|
|
Image aImg = Image( IDEResId( RID_IMG_LOCKED ) );
|
|
Size aSz = aImg.GetSizePixel();
|
|
aLibBox.SetDefaultExpandedEntryBmp( aImg );
|
|
aLibBox.SetDefaultCollapsedEntryBmp( aImg );
|
|
}
|
|
|
|
SvLBoxEntry* pNewEntry = aLibBox.InsertEntry( pBasicManager->GetLibName( nLib ), nLib );
|
|
|
|
if ( pBasicManager->IsReference( nLib ) || pBasicManager->IsExtern( nLib ) )
|
|
{
|
|
String aLibStorage = pBasicManager->GetLibStorageName( nLib );
|
|
if ( pBasicManager->GetStorageName().Len() )
|
|
{
|
|
DirEntry aEntry( pBasicManager->GetStorageName() );
|
|
String aPath = aEntry.GetPath().GetFull();
|
|
if ( aLibStorage.CompareIgnoreCaseToAscii( aPath, aPath.Len() ) == COMPARE_EQUAL )
|
|
aLibStorage.Erase( 0, aPath.Len()+1 ); // Dann ohne Pfadangabe...
|
|
else if ( pBasicManager->GetRelLibStorageName( nLib ).Len() )
|
|
aLibStorage = pBasicManager->GetRelLibStorageName( nLib ); // Kuerzer...
|
|
}
|
|
|
|
aLibBox.SetEntryText( aLibStorage, pNewEntry, 1 );
|
|
}
|
|
|
|
aLibBox.CheckEntryPos( nLib, pBasicManager->IsLibLoaded( nLib ) );
|
|
|
|
if ( bPassword )
|
|
{
|
|
Image aImg; // Default zuruecksetzen
|
|
aLibBox.SetDefaultExpandedEntryBmp( aImg );
|
|
aLibBox.SetDefaultCollapsedEntryBmp( aImg );
|
|
}
|
|
|
|
return pNewEntry;
|
|
}
|
|
|
|
|
|
BasicCheckBox::BasicCheckBox( Window* pParent, const ResId& rResId ) :
|
|
SvTabListBox( pParent, rResId )
|
|
{
|
|
nMode = 0;
|
|
pBasMgr = 0;
|
|
long aTabs[] = { 1, 12 }; // Mindestens einen braucht die TabPos...
|
|
// 12 wegen der Checkbox
|
|
SetTabs( aTabs );
|
|
Init();
|
|
}
|
|
|
|
|
|
|
|
__EXPORT BasicCheckBox::~BasicCheckBox()
|
|
{
|
|
delete pCheckButton;
|
|
}
|
|
|
|
void __EXPORT BasicCheckBox::CheckButtonHdl()
|
|
{
|
|
SvLBoxEntry* pEntry = GetHdlEntry();
|
|
DBG_ASSERT( pEntry, "HdlEntry?!" );
|
|
ULONG nPos = GetModel()->GetAbsPos( pEntry );
|
|
if ( !nPos && ( GetMode() == LIBMODE_MANAGER ) )
|
|
{
|
|
CheckEntryPos( 0, TRUE );
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_CANNOTUNLOADSTDLIB ) ) ).Execute();
|
|
}
|
|
else
|
|
{
|
|
// SelectHdl ausloesen, damit Buttons geprueft werden.
|
|
SelectEntryPos( nPos, FALSE );
|
|
SelectEntryPos( nPos, TRUE );
|
|
}
|
|
}
|
|
|
|
void BasicCheckBox::Init()
|
|
{
|
|
BasicCheckBoxBitmaps theBmps;
|
|
|
|
pCheckButton = new SvLBoxButtonData;
|
|
pCheckButton->aBmps[SV_BMP_UNCHECKED] = theBmps.GetUncheckedBmp();
|
|
pCheckButton->aBmps[SV_BMP_CHECKED] = theBmps.GetCheckedBmp();
|
|
pCheckButton->aBmps[SV_BMP_HICHECKED] = theBmps.GetHiCheckedBmp();
|
|
pCheckButton->aBmps[SV_BMP_HIUNCHECKED] = theBmps.GetHiUncheckedBmp();
|
|
pCheckButton->aBmps[SV_BMP_TRISTATE] = theBmps.GetTriStateBmp();
|
|
pCheckButton->aBmps[SV_BMP_HITRISTATE] = theBmps.GetHiTriStateBmp();
|
|
EnableCheckButton( pCheckButton );
|
|
SetHighlightRange();
|
|
}
|
|
|
|
SvLBoxEntry* BasicCheckBox::InsertEntry( const String& rStr, ULONG nPos )
|
|
{
|
|
// return SvTreeListBox::InsertEntry( rStr, NULL, FALSE, nPos );
|
|
return SvTabListBox::InsertEntry( rStr, nPos, 0 );
|
|
}
|
|
|
|
|
|
void BasicCheckBox::RemoveEntry( ULONG nPos )
|
|
{
|
|
if ( nPos < GetEntryCount() )
|
|
SvTreeListBox::GetModel()->Remove( GetEntry( nPos ) );
|
|
}
|
|
|
|
SvLBoxEntry* BasicCheckBox::FindEntry( const String& rName )
|
|
{
|
|
ULONG nCount = GetEntryCount();
|
|
for ( ULONG i = 0; i < nCount; i++ )
|
|
{
|
|
SvLBoxEntry* pEntry = GetEntry( i );
|
|
DBG_ASSERT( pEntry, "pEntry?!" );
|
|
if ( rName.CompareIgnoreCaseToAscii( GetEntryText( pEntry, 0 ) ) == COMPARE_EQUAL )
|
|
return pEntry;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
void BasicCheckBox::SelectEntryPos( ULONG nPos, BOOL bSelect )
|
|
{
|
|
if ( nPos < GetEntryCount() )
|
|
Select( GetEntry( nPos ), bSelect );
|
|
}
|
|
|
|
|
|
|
|
ULONG BasicCheckBox::GetSelectEntryPos() const
|
|
{
|
|
return GetModel()->GetAbsPos( FirstSelected() );
|
|
}
|
|
|
|
|
|
|
|
ULONG BasicCheckBox::GetCheckedEntryCount() const
|
|
{
|
|
ULONG nCheckCount = 0;
|
|
ULONG nCount = GetEntryCount();
|
|
|
|
for (ULONG i=0; i<nCount; i++ )
|
|
{
|
|
if ( IsChecked( i ) )
|
|
nCheckCount++;
|
|
}
|
|
|
|
return nCheckCount;
|
|
}
|
|
|
|
|
|
|
|
void BasicCheckBox::CheckEntryPos( ULONG nPos, BOOL bCheck )
|
|
{
|
|
if ( nPos < GetEntryCount() )
|
|
{
|
|
SvLBoxEntry* pEntry = GetEntry( nPos );
|
|
|
|
if ( bCheck != GetCheckButtonState( pEntry ) )
|
|
SetCheckButtonState( pEntry,
|
|
bCheck
|
|
? SvButtonState(SV_BUTTON_CHECKED)
|
|
: SvButtonState(SV_BUTTON_UNCHECKED) );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
BOOL BasicCheckBox::IsChecked( ULONG nPos ) const
|
|
{
|
|
if ( nPos < GetEntryCount() )
|
|
return (GetCheckButtonState( GetEntry( nPos ) ) == SV_BUTTON_CHECKED);
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL __EXPORT BasicCheckBox::EditingEntry( SvLBoxEntry* pEntry, Selection& )
|
|
{
|
|
if ( nMode != LIBMODE_MANAGER )
|
|
return FALSE;
|
|
|
|
DBG_ASSERT( pEntry, "Kein Eintrag?" );
|
|
ULONG nAbsPos = GetModel()->GetAbsPos( pEntry );
|
|
if ( nAbsPos == 0 )
|
|
{
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_CANNOTCHANGENAMESTDLIB ) ) ).Execute();
|
|
return FALSE;
|
|
}
|
|
|
|
// Prueffen, ob Referenz...
|
|
USHORT nLib = pBasMgr->GetLibId( GetEntryText( pEntry, 0 ) );
|
|
DBG_ASSERT( nLib != LIB_NOTFOUND, "LibId ?!" );
|
|
if ( pBasMgr->IsReference( nLib ) )
|
|
{
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_CANNOTCHANGENAMEREFLIB ) ) ).Execute();
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
BOOL __EXPORT BasicCheckBox::EditedEntry( SvLBoxEntry* pEntry, const String& rNewText )
|
|
{
|
|
BOOL bValid = ( rNewText.Len() <= 30 ) && BasicIDE::IsValidSbxName( rNewText );
|
|
String aCurText( GetEntryText( pEntry, 0 ) );
|
|
if ( bValid && ( aCurText != rNewText ) )
|
|
{
|
|
// Prueffen, ob Lib mit dem Namen existiert!
|
|
DBG_ASSERT( pBasMgr, "BasMgr nicht gesetzt!" );
|
|
if ( pBasMgr->HasLib( rNewText ) )
|
|
{
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_SBXNAMEALLREADYUSED ) ) ).Execute();
|
|
return FALSE;
|
|
}
|
|
USHORT nLib = pBasMgr->GetLibId( aCurText );
|
|
DBG_ASSERT( nLib != LIB_NOTFOUND, "Lib nicht gefunden!" );
|
|
pBasMgr->SetLibName( nLib, rNewText );
|
|
BasicIDE::MarkDocShellModified( pBasMgr->GetStdLib() );
|
|
BasicIDE::GetBindings().Invalidate( SID_BASICIDE_LIBSELECTOR );
|
|
BasicIDE::GetBindings().Update( SID_BASICIDE_LIBSELECTOR );
|
|
}
|
|
|
|
if ( !bValid )
|
|
{
|
|
if ( rNewText.Len() > 30 )
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_LIBNAMETOLONG ) ) ).Execute();
|
|
else
|
|
ErrorBox( this, WB_OK | WB_DEF_OK, String( IDEResId( RID_STR_BADSBXNAME ) ) ).Execute();
|
|
}
|
|
return bValid;
|
|
}
|
|
|
|
|
|
|
|
BasicCheckBoxBitmaps::BasicCheckBoxBitmaps() :
|
|
Resource ( ResId( RID_RES_CHECKBITMAPS ) ),
|
|
aUncheckedBmp ( ResId( CHKBTN_UNCHECKED ) ),
|
|
aCheckedBmp ( ResId( CHKBTN_CHECKED ) ),
|
|
aHiCheckedBmp ( ResId( CHKBTN_HICHECKED ) ),
|
|
aHiUncheckedBmp ( ResId( CHKBTN_HIUNCHECKED ) ),
|
|
aTriStateBmp ( ResId( CHKBTN_TRISTATE ) ),
|
|
aHiTriStateBmp ( ResId( CHKBTN_HITRISTATE ) )
|
|
{
|
|
FreeResource();
|
|
}
|
|
|
|
|
|
NewObjectDialog::NewObjectDialog( Window* pParent, USHORT nMode )
|
|
: ModalDialog( pParent, IDEResId( RID_DLG_NEWLIB ) ),
|
|
aText( this, IDEResId( RID_FT_NEWLIB ) ),
|
|
aEdit( this, IDEResId( RID_ED_LIBNAME ) ),
|
|
aCheckBox( this, IDEResId( RID_CHKB_EXTRAFILE ) ),
|
|
aOKButton( this, IDEResId( RID_PB_OK ) ),
|
|
aCancelButton( this, IDEResId( RID_PB_CANCEL ) )
|
|
{
|
|
FreeResource();
|
|
aEdit.GrabFocus();
|
|
|
|
if ( nMode == NEWOBJECTMODE_LIB )
|
|
{
|
|
aCheckBox.Show();
|
|
SetText( String( IDEResId( RID_STR_NEWLIB ) ) );
|
|
}
|
|
else if ( nMode == NEWOBJECTMODE_MOD )
|
|
{
|
|
SetText( String( IDEResId( RID_STR_NEWMOD ) ) );
|
|
}
|
|
else
|
|
{
|
|
SetText( String( IDEResId( RID_STR_NEWDLG ) ) );
|
|
}
|
|
}
|
|
|
|
NewObjectDialog::~NewObjectDialog()
|
|
{
|
|
}
|
|
|