summaryrefslogtreecommitdiff
path: root/cui/source/options/optjava.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'cui/source/options/optjava.cxx')
-rw-r--r--cui/source/options/optjava.cxx1135
1 files changed, 1135 insertions, 0 deletions
diff --git a/cui/source/options/optjava.cxx b/cui/source/options/optjava.cxx
new file mode 100644
index 000000000000..31a40f2cd221
--- /dev/null
+++ b/cui/source/options/optjava.cxx
@@ -0,0 +1,1135 @@
+/*************************************************************************
+ *
+ * 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_cui.hxx"
+
+// include ---------------------------------------------------------------
+
+#include "optjava.hxx"
+#include <dialmgr.hxx>
+
+#include "optjava.hrc"
+#include <cuires.hrc>
+#include "helpid.hrc"
+#include <vcl/svapp.hxx>
+#include <vcl/help.hxx>
+#include <tools/urlobj.hxx>
+#include <vcl/msgbox.hxx>
+#include <vcl/waitobj.hxx>
+#include <unotools/pathoptions.hxx>
+#include <svtools/imagemgr.hxx>
+#include <sfx2/filedlghelper.hxx>
+#include <comphelper/processfactory.hxx>
+#include <ucbhelper/contentbroker.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
+#include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+#include <com/sun/star/ucb/XContentProvider.hpp>
+#include <jvmfwk/framework.h>
+
+// define ----------------------------------------------------------------
+
+#define CLASSPATH_DELIMITER SAL_PATHSEPARATOR
+#define STRIM( s ) s.EraseLeadingChars().EraseTrailingChars()
+#define BUTTON_BORDER 2
+#define RESET_TIMEOUT 300
+
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::ucb;
+using namespace ::com::sun::star::ui::dialogs;
+using namespace ::com::sun::star::uno;
+
+// class SvxJavaTable ----------------------------------------------------
+
+SvxJavaTable::SvxJavaTable( Window* _pParent, const ResId& _rId ) :
+
+ SvxSimpleTable( _pParent, _rId )
+
+{
+}
+
+SvxJavaTable::~SvxJavaTable()
+{
+}
+
+void SvxJavaTable::SetTabs()
+{
+ SvxSimpleTable::SetTabs();
+/*
+ USHORT nAdjust = SV_LBOXTAB_ADJUST_RIGHT | SV_LBOXTAB_ADJUST_LEFT |
+ SV_LBOXTAB_ADJUST_CENTER | SV_LBOXTAB_ADJUST_NUMERIC | SV_LBOXTAB_FORCE;
+ if ( aTabs.Count() > 0 )
+ {
+ SvLBoxTab* pTab = (SvLBoxTab*)aTabs.GetObject(0);
+ pTab->nFlags &= ~nAdjust;
+ pTab->nFlags |= SV_LBOXTAB_PUSHABLE | SV_LBOXTAB_ADJUST_CENTER | SV_LBOXTAB_FORCE;
+ }
+*/
+}
+
+void SvxJavaTable::MouseButtonUp( const MouseEvent& _rMEvt )
+{
+ m_aCurMousePoint = _rMEvt.GetPosPixel();
+ SvxSimpleTable::MouseButtonUp( _rMEvt );
+}
+
+void SvxJavaTable::KeyInput( const KeyEvent& rKEvt )
+{
+ if ( !rKEvt.GetKeyCode().GetModifier() && KEY_SPACE == rKEvt.GetKeyCode().GetCode() )
+ {
+ SvLBoxEntry* pEntry = FirstSelected();
+ if ( GetCheckButtonState( pEntry ) == SV_BUTTON_UNCHECKED )
+ {
+ SetCheckButtonState( pEntry, SV_BUTTON_CHECKED );
+ GetCheckButtonHdl().Call( NULL );
+ return ;
+ }
+ }
+
+ SvxSimpleTable::KeyInput( rKEvt );
+}
+
+// -----------------------------------------------------------------------
+
+bool areListsEqual( const Sequence< ::rtl::OUString >& rListA, const Sequence< ::rtl::OUString >& rListB )
+{
+ bool bRet = true;
+ const sal_Int32 nLen = rListA.getLength();
+
+ if ( rListB.getLength() != nLen )
+ bRet = false;
+ else
+ {
+ const ::rtl::OUString* pStringA = rListA.getConstArray();
+ const ::rtl::OUString* pStringB = rListB.getConstArray();
+
+ for ( sal_Int32 i = 0; i < nLen; ++i )
+ {
+ if ( *pStringA++ != *pStringB++ )
+ {
+ bRet = false;
+ break;
+ }
+ }
+ }
+
+ return bRet;
+}
+
+// class SvxJavaOptionsPage ----------------------------------------------
+
+SvxJavaOptionsPage::SvxJavaOptionsPage( Window* pParent, const SfxItemSet& rSet ) :
+
+ SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_OPTIONS_JAVA ), rSet ),
+
+ m_aJavaLine ( this, CUI_RES( FL_JAVA ) ),
+ m_aJavaEnableCB ( this, CUI_RES( CB_JAVA_ENABLE ) ),
+ m_aJavaFoundLabel ( this, CUI_RES( FT_JAVA_FOUND ) ),
+ m_aJavaList ( this, CUI_RES( LB_JAVA ) ),
+ m_aJavaPathText ( this, CUI_RES( FT_JAVA_PATH ) ),
+ m_aAddBtn ( this, CUI_RES( PB_ADD ) ),
+ m_aParameterBtn ( this, CUI_RES( PB_PARAMETER ) ),
+ m_aClassPathBtn ( this, CUI_RES( PB_CLASSPATH ) ),
+
+ m_pParamDlg ( NULL ),
+ m_pPathDlg ( NULL ),
+ m_parJavaInfo ( NULL ),
+ m_parParameters ( NULL ),
+ m_pClassPath ( NULL ),
+ m_nInfoSize ( 0 ),
+ m_nParamSize ( 0 ),
+ m_sInstallText ( CUI_RES( STR_INSTALLED_IN ) ),
+ m_sAccessibilityText( CUI_RES( STR_ACCESSIBILITY ) ),
+ m_sAddDialogText ( CUI_RES( STR_ADDDLGTEXT ) ),
+
+ xDialogListener ( new ::svt::DialogClosedListener() )
+
+{
+ m_aJavaEnableCB.SetClickHdl( LINK( this, SvxJavaOptionsPage, EnableHdl_Impl ) );
+ m_aJavaList.SetCheckButtonHdl( LINK( this, SvxJavaOptionsPage, CheckHdl_Impl ) );
+ m_aJavaList.SetSelectHdl( LINK( this, SvxJavaOptionsPage, SelectHdl_Impl ) );
+ m_aAddBtn.SetClickHdl( LINK( this, SvxJavaOptionsPage, AddHdl_Impl ) );
+ m_aParameterBtn.SetClickHdl( LINK( this, SvxJavaOptionsPage, ParameterHdl_Impl ) );
+ m_aClassPathBtn.SetClickHdl( LINK( this, SvxJavaOptionsPage, ClassPathHdl_Impl ) );
+ m_aResetTimer.SetTimeoutHdl( LINK( this, SvxJavaOptionsPage, ResetHdl_Impl ) );
+ m_aResetTimer.SetTimeout( RESET_TIMEOUT );
+
+//! m_aJavaList.EnableCheckButton( new SvLBoxButtonData( &m_aJavaList, true ) );
+
+ static long aStaticTabs[]=
+ {
+ 5, 0, 15, 90, 130, 300
+ };
+
+ m_aJavaList.SvxSimpleTable::SetTabs( aStaticTabs );
+ String sHeader( '\t' );
+ sHeader += String( CUI_RES( STR_HEADER_VENDOR ) );
+ sHeader += '\t';
+ sHeader += String( CUI_RES( STR_HEADER_VERSION ) );
+ sHeader += '\t';
+ sHeader += String( CUI_RES( STR_HEADER_FEATURES ) );
+ sHeader += '\t';
+ m_aJavaList.InsertHeaderEntry( sHeader, HEADERBAR_APPEND, HIB_LEFT );
+
+ m_aJavaList.SetHelpId( HID_OPTIONS_JAVA_LIST );
+
+ FreeResource();
+
+ xDialogListener->SetDialogClosedLink( LINK( this, SvxJavaOptionsPage, DialogClosedHdl ) );
+
+ EnableHdl_Impl( &m_aJavaEnableCB );
+ jfw_lock();
+
+ //check if the text fits into the class path button
+ Size aButtonSize = m_aClassPathBtn.GetOutputSizePixel();
+ sal_Int32 nTextWidth = m_aClassPathBtn.GetTextWidth(m_aClassPathBtn.GetText());
+ //add some additional space
+ sal_Int32 nDiff = nTextWidth + 4 - aButtonSize.Width();
+ if( nDiff > 0)
+ {
+ Point aPos(m_aClassPathBtn.GetPosPixel());
+ aPos.X() -= nDiff;
+ aButtonSize.Width() += nDiff;
+ m_aClassPathBtn.SetPosSizePixel(aPos, aButtonSize);
+ aPos = m_aAddBtn.GetPosPixel();
+ aPos.X() -= nDiff;
+ m_aAddBtn.SetPosSizePixel(aPos, aButtonSize);
+ aPos = m_aParameterBtn.GetPosPixel();
+ aPos.X() -= nDiff;
+ m_aParameterBtn.SetPosSizePixel(aPos, aButtonSize);
+ Size aSize = m_aJavaList.GetSizePixel();
+ aSize.Width() -= nDiff;
+ m_aJavaList.SetSizePixel(aSize);
+ }
+}
+
+// -----------------------------------------------------------------------
+
+SvxJavaOptionsPage::~SvxJavaOptionsPage()
+{
+ delete m_pParamDlg;
+ delete m_pPathDlg;
+ ClearJavaInfo();
+ std::vector< JavaInfo* >::iterator pIter;
+ for ( pIter = m_aAddedInfos.begin(); pIter != m_aAddedInfos.end(); ++pIter )
+ {
+ JavaInfo* pInfo = *pIter;
+ jfw_freeJavaInfo( pInfo );
+ }
+/*
+ rtl_uString** pParamArr = m_parParameters;
+ for ( sal_Int32 i = 0; i < m_nParamSize; ++i )
+ rtl_uString_release( *pParamArr++ );
+ rtl_freeMemory( m_parParameters );
+ rtl_uString_release( m_pClassPath );
+*/
+ jfw_unlock();
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaOptionsPage, EnableHdl_Impl, CheckBox *, EMPTYARG )
+{
+ BOOL bEnable = m_aJavaEnableCB.IsChecked();
+ m_aJavaFoundLabel.Enable( bEnable );
+ m_aJavaPathText.Enable( bEnable );
+ m_aAddBtn.Enable( bEnable );
+ m_aParameterBtn.Enable( bEnable );
+ m_aClassPathBtn.Enable( bEnable );
+
+ bEnable ? m_aJavaList.EnableTable() : m_aJavaList.DisableTable();
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaOptionsPage, CheckHdl_Impl, SvxSimpleTable *, pList )
+{
+ SvLBoxEntry* pEntry = pList ? m_aJavaList.GetEntry( m_aJavaList.GetCurMousePoint() )
+ : m_aJavaList.FirstSelected();
+ if ( pEntry )
+ m_aJavaList.HandleEntryChecked( pEntry );
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaOptionsPage, SelectHdl_Impl, SvxSimpleTable *, EMPTYARG )
+{
+ // set installation directory info
+ SvLBoxEntry* pEntry = m_aJavaList.FirstSelected();
+ DBG_ASSERT( pEntry, "SvxJavaOptionsPage::SelectHdl_Impl(): no entry" );
+ String* pLocation = static_cast< String* >( pEntry->GetUserData() );
+ DBG_ASSERT( pLocation, "invalid location string" );
+ String sInfo = m_sInstallText;
+ if ( pLocation )
+ sInfo += *pLocation;
+ m_aJavaPathText.SetText( sInfo );
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaOptionsPage, AddHdl_Impl, PushButton *, EMPTYARG )
+{
+ try
+ {
+ Reference < XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() );
+ xFolderPicker = Reference< XFolderPicker >(
+ xMgr->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.FolderPicker" ) ), UNO_QUERY );
+
+ String sWorkFolder = SvtPathOptions().GetWorkPath();
+ xFolderPicker->setDisplayDirectory( sWorkFolder );
+ xFolderPicker->setDescription( m_sAddDialogText );
+
+ Reference< XAsynchronousExecutableDialog > xAsyncDlg( xFolderPicker, UNO_QUERY );
+ if ( xAsyncDlg.is() )
+ xAsyncDlg->startExecuteModal( xDialogListener.get() );
+ else if ( xFolderPicker.is() && xFolderPicker->execute() == ExecutableDialogResults::OK )
+ AddFolder( xFolderPicker->getDirectory() );
+ }
+ catch ( Exception& )
+ {
+#ifdef DBG_UTIL
+ DBG_ERRORFILE( "SvxJavaOptionsPage::AddHdl_Impl(): caught exception" );
+#endif
+ }
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaOptionsPage, ParameterHdl_Impl, PushButton *, EMPTYARG )
+{
+ Sequence< ::rtl::OUString > aParameterList;
+ if ( !m_pParamDlg )
+ {
+ m_pParamDlg = new SvxJavaParameterDlg( this );
+ javaFrameworkError eErr = jfw_getVMParameters( &m_parParameters, &m_nParamSize );
+ if ( JFW_E_NONE == eErr && m_parParameters && m_nParamSize > 0 )
+ {
+ rtl_uString** pParamArr = m_parParameters;
+ aParameterList.realloc( m_nParamSize );
+ ::rtl::OUString* pParams = aParameterList.getArray();
+ for ( sal_Int32 i = 0; i < m_nParamSize; ++i )
+ {
+ rtl_uString* pParam = *pParamArr++;
+ pParams[i] = ::rtl::OUString( pParam );
+ }
+ m_pParamDlg->SetParameters( aParameterList );
+ }
+ }
+ else
+ aParameterList = m_pParamDlg->GetParameters();
+
+ if ( m_pParamDlg->Execute() == RET_OK )
+ {
+ if ( !areListsEqual( aParameterList, m_pParamDlg->GetParameters() ) )
+ {
+ aParameterList = m_pParamDlg->GetParameters();
+ sal_Bool bRunning = sal_False;
+ javaFrameworkError eErr = jfw_isVMRunning( &bRunning );
+ DBG_ASSERT( JFW_E_NONE == eErr,
+ "SvxJavaOptionsPage::ParameterHdl_Impl(): error in jfw_isVMRunning" );
+ (void)eErr;
+ if ( bRunning )
+ {
+ WarningBox aWarnBox( this, CUI_RES( RID_SVX_MSGBOX_JAVA_RESTART2 ) );
+ aWarnBox.Execute();
+ }
+ }
+ }
+ else
+ m_pParamDlg->SetParameters( aParameterList );
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaOptionsPage, ClassPathHdl_Impl, PushButton *, EMPTYARG )
+{
+ String sClassPath;
+
+ if ( !m_pPathDlg )
+ {
+ m_pPathDlg = new SvxJavaClassPathDlg( this );
+ javaFrameworkError eErr = jfw_getUserClassPath( &m_pClassPath );
+ if ( JFW_E_NONE == eErr && m_pClassPath )
+ {
+ sClassPath = String( ::rtl::OUString( m_pClassPath ) );
+ m_pPathDlg->SetClassPath( sClassPath );
+ }
+ }
+ else
+ sClassPath = m_pPathDlg->GetClassPath();
+
+ m_pPathDlg->SetFocus();
+ if ( m_pPathDlg->Execute() == RET_OK )
+ {
+
+ if ( m_pPathDlg->GetClassPath() != sClassPath )
+ {
+ sClassPath = m_pPathDlg->GetClassPath();
+ sal_Bool bRunning = sal_False;
+ javaFrameworkError eErr = jfw_isVMRunning( &bRunning );
+ DBG_ASSERT( JFW_E_NONE == eErr,
+ "SvxJavaOptionsPage::ParameterHdl_Impl(): error in jfw_isVMRunning" );
+ (void)eErr;
+ if ( bRunning )
+ {
+ WarningBox aWarnBox( this, CUI_RES( RID_SVX_MSGBOX_JAVA_RESTART2 ) );
+ aWarnBox.Execute();
+ }
+ }
+ }
+ else
+ m_pPathDlg->SetClassPath( sClassPath );
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaOptionsPage, ResetHdl_Impl, Timer *, EMPTYARG )
+{
+ LoadJREs();
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaOptionsPage, StartFolderPickerHdl, void*, EMPTYARG )
+{
+ try
+ {
+ Reference< XAsynchronousExecutableDialog > xAsyncDlg( xFolderPicker, UNO_QUERY );
+ if ( xAsyncDlg.is() )
+ xAsyncDlg->startExecuteModal( xDialogListener.get() );
+ else if ( xFolderPicker.is() && xFolderPicker->execute() == ExecutableDialogResults::OK )
+ AddFolder( xFolderPicker->getDirectory() );
+ }
+ catch ( Exception& )
+ {
+#ifdef DBG_UTIL
+ DBG_ERRORFILE( "SvxJavaOptionsPage::StartFolderPickerHdl(): caught exception" );
+#endif
+ }
+
+ return 0L;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaOptionsPage, DialogClosedHdl, DialogClosedEvent*, pEvt )
+{
+ if ( RET_OK == pEvt->DialogResult )
+ {
+ DBG_ASSERT( xFolderPicker.is() == sal_True, "SvxJavaOptionsPage::DialogClosedHdl(): no folder picker" );
+
+ AddFolder( xFolderPicker->getDirectory() );
+ }
+ return 0L;
+}
+
+// -----------------------------------------------------------------------
+
+void SvxJavaOptionsPage::ClearJavaInfo()
+{
+ if ( m_parJavaInfo )
+ {
+ JavaInfo** parInfo = m_parJavaInfo;
+ for ( sal_Int32 i = 0; i < m_nInfoSize; ++i )
+ {
+ JavaInfo* pInfo = *parInfo++;
+ jfw_freeJavaInfo( pInfo );
+ }
+
+ rtl_freeMemory( m_parJavaInfo );
+ m_parJavaInfo = NULL;
+ m_nInfoSize = 0;
+ }
+}
+
+// -----------------------------------------------------------------------
+
+void SvxJavaOptionsPage::ClearJavaList()
+{
+ SvLBoxEntry* pEntry = m_aJavaList.First();
+ while ( pEntry )
+ {
+ String* pLocation = static_cast< String* >( pEntry->GetUserData() );
+ delete pLocation;
+ pEntry = m_aJavaList.Next( pEntry );
+ }
+ m_aJavaList.Clear();
+}
+
+// -----------------------------------------------------------------------
+
+void SvxJavaOptionsPage::LoadJREs()
+{
+ WaitObject aWaitObj( &m_aJavaList );
+ javaFrameworkError eErr = jfw_findAllJREs( &m_parJavaInfo, &m_nInfoSize );
+ if ( JFW_E_NONE == eErr && m_parJavaInfo )
+ {
+ JavaInfo** parInfo = m_parJavaInfo;
+ for ( sal_Int32 i = 0; i < m_nInfoSize; ++i )
+ {
+ JavaInfo* pInfo = *parInfo++;
+ AddJRE( pInfo );
+ }
+ }
+
+ std::vector< JavaInfo* >::iterator pIter;
+ for ( pIter = m_aAddedInfos.begin(); pIter != m_aAddedInfos.end(); ++pIter )
+ {
+ JavaInfo* pInfo = *pIter;
+ AddJRE( pInfo );
+ }
+
+ JavaInfo* pSelectedJava = NULL;
+ eErr = jfw_getSelectedJRE( &pSelectedJava );
+ if ( JFW_E_NONE == eErr && pSelectedJava )
+ {
+ JavaInfo** parInfo = m_parJavaInfo;
+ for ( sal_Int32 i = 0; i < m_nInfoSize; ++i )
+ {
+ JavaInfo* pCmpInfo = *parInfo++;
+ if ( jfw_areEqualJavaInfo( pCmpInfo, pSelectedJava ) )
+ {
+ SvLBoxEntry* pEntry = m_aJavaList.GetEntry(i);
+ if ( pEntry )
+ m_aJavaList.HandleEntryChecked( pEntry );
+ break;
+ }
+ }
+ }
+
+ jfw_freeJavaInfo( pSelectedJava );
+}
+
+// -----------------------------------------------------------------------
+
+void SvxJavaOptionsPage::AddJRE( JavaInfo* _pInfo )
+{
+ String sEntry( '\t' );
+ sEntry += String( ::rtl::OUString( _pInfo->sVendor ) );
+ sEntry += '\t';
+ sEntry += String( ::rtl::OUString( _pInfo->sVersion ) );
+ sEntry += '\t';
+ if ( ( _pInfo->nFeatures & JFW_FEATURE_ACCESSBRIDGE ) == JFW_FEATURE_ACCESSBRIDGE )
+ sEntry += m_sAccessibilityText;
+ SvLBoxEntry* pEntry = m_aJavaList.InsertEntry( sEntry );
+ INetURLObject aLocObj( ::rtl::OUString( _pInfo->sLocation ) );
+ String* pLocation = new String( aLocObj.getFSysPath( INetURLObject::FSYS_DETECT ) );
+ pEntry->SetUserData( pLocation );
+}
+
+// -----------------------------------------------------------------------
+
+void SvxJavaOptionsPage::HandleCheckEntry( SvLBoxEntry* _pEntry )
+{
+ m_aJavaList.Select( _pEntry, TRUE );
+ SvButtonState eState = m_aJavaList.GetCheckButtonState( _pEntry );
+
+ if ( SV_BUTTON_CHECKED == eState )
+ {
+ // we have radio button behavior -> so uncheck the other entries
+ SvLBoxEntry* pEntry = m_aJavaList.First();
+ while ( pEntry )
+ {
+ if ( pEntry != _pEntry )
+ m_aJavaList.SetCheckButtonState( pEntry, SV_BUTTON_UNCHECKED );
+ pEntry = m_aJavaList.Next( pEntry );
+ }
+ }
+ else
+ m_aJavaList.SetCheckButtonState( _pEntry, SV_BUTTON_CHECKED );
+}
+
+// -----------------------------------------------------------------------
+
+void SvxJavaOptionsPage::AddFolder( const ::rtl::OUString& _rFolder )
+{
+ bool bStartAgain = true;
+ sal_Int32 nPos = 0;
+ JavaInfo* pInfo = NULL;
+ javaFrameworkError eErr = jfw_getJavaInfoByPath( _rFolder.pData, &pInfo );
+ if ( JFW_E_NONE == eErr && pInfo )
+ {
+ bool bFound = false;
+ JavaInfo** parInfo = m_parJavaInfo;
+ for ( sal_Int32 i = 0; i < m_nInfoSize; ++i )
+ {
+ JavaInfo* pCmpInfo = *parInfo++;
+ if ( jfw_areEqualJavaInfo( pCmpInfo, pInfo ) )
+ {
+ bFound = true;
+ nPos = i;
+ break;
+ }
+ }
+
+ if ( !bFound )
+ {
+ std::vector< JavaInfo* >::iterator pIter;
+ for ( pIter = m_aAddedInfos.begin(); pIter != m_aAddedInfos.end(); ++pIter )
+ {
+ JavaInfo* pCmpInfo = *pIter;
+ if ( jfw_areEqualJavaInfo( pCmpInfo, pInfo ) )
+ {
+ bFound = true;
+ break;
+ }
+ }
+ }
+
+ if ( !bFound )
+ {
+ jfw_addJRELocation( pInfo->sLocation );
+ AddJRE( pInfo );
+ m_aAddedInfos.push_back( pInfo );
+ nPos = m_aJavaList.GetEntryCount() - 1;
+ }
+ else
+ jfw_freeJavaInfo( pInfo );
+
+ SvLBoxEntry* pEntry = m_aJavaList.GetEntry( nPos );
+ m_aJavaList.Select( pEntry );
+ m_aJavaList.SetCheckButtonState( pEntry, SV_BUTTON_CHECKED );
+ HandleCheckEntry( pEntry );
+ bStartAgain = false;
+ }
+ else if ( JFW_E_NOT_RECOGNIZED == eErr )
+ {
+ ErrorBox aErrBox( this, CUI_RES( RID_SVXERR_JRE_NOT_RECOGNIZED ) );
+ aErrBox.Execute();
+ }
+ else if ( JFW_E_FAILED_VERSION == eErr )
+ {
+ ErrorBox aErrBox( this, CUI_RES( RID_SVXERR_JRE_FAILED_VERSION ) );
+ aErrBox.Execute();
+ }
+
+ if ( bStartAgain )
+ {
+ xFolderPicker->setDisplayDirectory( _rFolder );
+ Application::PostUserEvent( LINK( this, SvxJavaOptionsPage, StartFolderPickerHdl ) );
+ }
+}
+
+// -----------------------------------------------------------------------
+
+SfxTabPage* SvxJavaOptionsPage::Create( Window* pParent, const SfxItemSet& rAttrSet )
+{
+ return ( new SvxJavaOptionsPage( pParent, rAttrSet ) );
+}
+
+// -----------------------------------------------------------------------
+
+BOOL SvxJavaOptionsPage::FillItemSet( SfxItemSet& /*rCoreSet*/ )
+{
+ BOOL bModified = FALSE;
+ javaFrameworkError eErr = JFW_E_NONE;
+ if ( m_pParamDlg )
+ {
+ Sequence< ::rtl::OUString > aParamList = m_pParamDlg->GetParameters();
+ sal_Int32 i, nSize = aParamList.getLength();
+ rtl_uString** pParamArr = (rtl_uString**)rtl_allocateMemory( sizeof(rtl_uString*) * nSize );
+ rtl_uString** pParamArrIter = pParamArr;
+ const ::rtl::OUString* pList = aParamList.getConstArray();
+ for ( i = 0; i < nSize; ++i )
+ pParamArr[i] = pList[i].pData;
+ eErr = jfw_setVMParameters( pParamArrIter, nSize );
+ DBG_ASSERT( JFW_E_NONE == eErr,
+ "SvxJavaOptionsPage::FillItemSet(): error in jfw_setVMParameters" );
+ pParamArrIter = pParamArr;
+ rtl_freeMemory( pParamArr );
+ bModified = TRUE;
+ }
+
+ if ( m_pPathDlg )
+ {
+ ::rtl::OUString sPath( m_pPathDlg->GetClassPath() );
+ if ( m_pPathDlg->GetOldPath() != String( sPath ) )
+ {
+ eErr = jfw_setUserClassPath( sPath.pData );
+ DBG_ASSERT( JFW_E_NONE == eErr,
+ "SvxJavaOptionsPage::FillItemSet(): error in jfw_setUserClassPath" );
+ bModified = TRUE;
+ }
+ }
+
+ ULONG nCount = m_aJavaList.GetEntryCount();
+ for ( ULONG i = 0; i < nCount; ++i )
+ {
+ if ( m_aJavaList.GetCheckButtonState( m_aJavaList.GetEntry(i) ) == SV_BUTTON_CHECKED )
+ {
+ JavaInfo* pInfo = NULL;
+ if ( i < static_cast< ULONG >( m_nInfoSize ) )
+ pInfo = m_parJavaInfo[i];
+ else
+ pInfo = m_aAddedInfos[ i - m_nInfoSize ];
+
+ JavaInfo* pSelectedJava = NULL;
+ eErr = jfw_getSelectedJRE( &pSelectedJava );
+ if ( JFW_E_NONE == eErr || JFW_E_INVALID_SETTINGS == eErr )
+ {
+ if (pSelectedJava == NULL || !jfw_areEqualJavaInfo( pInfo, pSelectedJava ) )
+ {
+ sal_Bool bRunning = sal_False;
+ eErr = jfw_isVMRunning( &bRunning );
+ DBG_ASSERT( JFW_E_NONE == eErr,
+ "SvxJavaOptionsPage::FillItemSet(): error in jfw_isVMRunning" );
+ if ( bRunning ||
+ ( ( pInfo->nRequirements & JFW_REQUIRE_NEEDRESTART ) == JFW_REQUIRE_NEEDRESTART ) )
+ {
+ WarningBox aWarnBox( this, CUI_RES( RID_SVX_MSGBOX_JAVA_RESTART ) );
+ aWarnBox.Execute();
+ }
+
+ eErr = jfw_setSelectedJRE( pInfo );
+ DBG_ASSERT( JFW_E_NONE == eErr,
+ "SvxJavaOptionsPage::FillItemSet(): error in jfw_setSelectedJRE" );
+ bModified = TRUE;
+ }
+ }
+ jfw_freeJavaInfo( pSelectedJava );
+ break;
+ }
+ }
+
+ sal_Bool bEnabled = sal_False;
+ eErr = jfw_getEnabled( &bEnabled );
+ DBG_ASSERT( JFW_E_NONE == eErr,
+ "SvxJavaOptionsPage::FillItemSet(): error in jfw_getEnabled" );
+ if ( bEnabled != m_aJavaEnableCB.IsChecked() )
+ {
+ eErr = jfw_setEnabled( m_aJavaEnableCB.IsChecked() );
+ DBG_ASSERT( JFW_E_NONE == eErr,
+ "SvxJavaOptionsPage::FillItemSet(): error in jfw_setEnabled" );
+ bModified = TRUE;
+ }
+
+ return bModified;
+}
+
+// -----------------------------------------------------------------------
+
+void SvxJavaOptionsPage::Reset( const SfxItemSet& /*rSet*/ )
+{
+ ClearJavaInfo();
+ ClearJavaList();
+
+ sal_Bool bEnabled = sal_False;
+ javaFrameworkError eErr = jfw_getEnabled( &bEnabled );
+ if ( eErr != JFW_E_NONE )
+ bEnabled = sal_False;
+ m_aJavaEnableCB.Check( bEnabled );
+ EnableHdl_Impl( &m_aJavaEnableCB );
+
+ m_aResetTimer.Start();
+}
+
+// -----------------------------------------------------------------------
+
+void SvxJavaOptionsPage::FillUserData()
+{
+ String aUserData;
+ SetUserData( aUserData );
+}
+
+// class SvxJavaParameterDlg ---------------------------------------------
+
+SvxJavaParameterDlg::SvxJavaParameterDlg( Window* pParent ) :
+
+ ModalDialog( pParent, CUI_RES( RID_SVXDLG_JAVA_PARAMETER ) ),
+
+ m_aParameterLabel ( this, CUI_RES( FT_PARAMETER ) ),
+ m_aParameterEdit ( this, CUI_RES( ED_PARAMETER ) ),
+ m_aAssignBtn ( this, CUI_RES( PB_ASSIGN ) ),
+ m_aAssignedLabel ( this, CUI_RES( FT_ASSIGNED ) ),
+ m_aAssignedList ( this, CUI_RES( LB_ASSIGNED ) ),
+ m_aExampleText ( this, CUI_RES( FT_EXAMPLE ) ),
+ m_aRemoveBtn ( this, CUI_RES( PB_REMOVE ) ),
+ m_aButtonsLine ( this, CUI_RES( FL_BUTTONS ) ),
+ m_aOKBtn ( this, CUI_RES( PB_PARAMETER_OK ) ),
+ m_aCancelBtn ( this, CUI_RES( PB_PARAMETER_ESC ) ),
+ m_aHelpBtn ( this, CUI_RES( PB_PARAMETER_HLP ) )
+
+{
+ FreeResource();
+
+ m_aParameterEdit.SetModifyHdl( LINK( this, SvxJavaParameterDlg, ModifyHdl_Impl ) );
+ m_aAssignBtn.SetClickHdl( LINK( this, SvxJavaParameterDlg, AssignHdl_Impl ) );
+ m_aRemoveBtn.SetClickHdl( LINK( this, SvxJavaParameterDlg, RemoveHdl_Impl ) );
+ m_aAssignedList.SetSelectHdl( LINK( this, SvxJavaParameterDlg, SelectHdl_Impl ) );
+ m_aAssignedList.SetDoubleClickHdl( LINK( this, SvxJavaParameterDlg, DblClickHdl_Impl ) );
+
+ ModifyHdl_Impl( &m_aParameterEdit );
+ EnableRemoveButton();
+}
+
+// -----------------------------------------------------------------------
+
+SvxJavaParameterDlg::~SvxJavaParameterDlg()
+{
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaParameterDlg, ModifyHdl_Impl, Edit *, EMPTYARG )
+{
+ String sParam = STRIM( m_aParameterEdit.GetText() );
+ m_aAssignBtn.Enable( sParam.Len() > 0 );
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaParameterDlg, AssignHdl_Impl, PushButton *, EMPTYARG )
+{
+ String sParam = STRIM( m_aParameterEdit.GetText() );
+ if ( sParam.Len() > 0 )
+ {
+ USHORT nPos = m_aAssignedList.GetEntryPos( sParam );
+ if ( LISTBOX_ENTRY_NOTFOUND == nPos )
+ nPos = m_aAssignedList.InsertEntry( sParam );
+ m_aAssignedList.SelectEntryPos( nPos );
+ m_aParameterEdit.SetText( String() );
+ ModifyHdl_Impl( &m_aParameterEdit );
+ EnableRemoveButton();
+ }
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaParameterDlg, SelectHdl_Impl, ListBox *, EMPTYARG )
+{
+ EnableRemoveButton();
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaParameterDlg, DblClickHdl_Impl, ListBox *, EMPTYARG )
+{
+ USHORT nPos = m_aAssignedList.GetSelectEntryPos();
+ if ( nPos != LISTBOX_ENTRY_NOTFOUND )
+ m_aParameterEdit.SetText( m_aAssignedList.GetEntry( nPos ) );
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaParameterDlg, RemoveHdl_Impl, PushButton *, EMPTYARG )
+{
+ USHORT nPos = m_aAssignedList.GetSelectEntryPos();
+ if ( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ m_aAssignedList.RemoveEntry( nPos );
+ USHORT nCount = m_aAssignedList.GetEntryCount();
+ if ( nCount )
+ {
+ if ( nPos >= nCount )
+ nPos = ( nCount - 1 );
+ m_aAssignedList.SelectEntryPos( nPos );
+ }
+ }
+ EnableRemoveButton();
+
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+short SvxJavaParameterDlg::Execute()
+{
+ m_aParameterEdit.GrabFocus();
+ m_aAssignedList.SetNoSelection();
+ return ModalDialog::Execute();
+}
+
+// -----------------------------------------------------------------------
+
+Sequence< ::rtl::OUString > SvxJavaParameterDlg::GetParameters() const
+{
+ USHORT nCount = m_aAssignedList.GetEntryCount();
+ Sequence< ::rtl::OUString > aParamList( nCount );
+ ::rtl::OUString* pArray = aParamList.getArray();
+ for ( USHORT i = 0; i < nCount; ++i )
+ pArray[i] = ::rtl::OUString( m_aAssignedList.GetEntry(i) );
+ return aParamList;
+}
+
+// -----------------------------------------------------------------------
+
+void SvxJavaParameterDlg::SetParameters( Sequence< ::rtl::OUString >& rParams )
+{
+ m_aAssignedList.Clear();
+ ULONG i, nCount = rParams.getLength();
+ const ::rtl::OUString* pArray = rParams.getConstArray();
+ for ( i = 0; i < nCount; ++i )
+ {
+ String sParam = String( *pArray++ );
+ m_aAssignedList.InsertEntry( sParam );
+ }
+}
+
+// class SvxJavaClassPathDlg ---------------------------------------------
+
+SvxJavaClassPathDlg::SvxJavaClassPathDlg( Window* pParent ) :
+
+ ModalDialog( pParent, CUI_RES( RID_SVXDLG_JAVA_CLASSPATH ) ),
+
+ m_aPathLabel ( this, CUI_RES( FT_PATH ) ),
+ m_aPathList ( this, CUI_RES( LB_PATH ) ),
+ m_aAddArchiveBtn ( this, CUI_RES( PB_ADDARCHIVE ) ),
+ m_aAddPathBtn ( this, CUI_RES( PB_ADDPATH ) ),
+ m_aRemoveBtn ( this, CUI_RES( PB_REMOVE_PATH ) ),
+ m_aButtonsLine ( this, CUI_RES( FL_PATH_BUTTONS ) ),
+ m_aOKBtn ( this, CUI_RES( PB_PATH_OK ) ),
+ m_aCancelBtn ( this, CUI_RES( PB_PATH_ESC ) ),
+ m_aHelpBtn ( this, CUI_RES( PB_PATH_HLP ) )
+
+{
+ FreeResource();
+
+ m_aAddArchiveBtn.SetClickHdl( LINK( this, SvxJavaClassPathDlg, AddArchiveHdl_Impl ) );
+ m_aAddPathBtn.SetClickHdl( LINK( this, SvxJavaClassPathDlg, AddPathHdl_Impl ) );
+ m_aRemoveBtn.SetClickHdl( LINK( this, SvxJavaClassPathDlg, RemoveHdl_Impl ) );
+ m_aPathList.SetSelectHdl( LINK( this, SvxJavaClassPathDlg, SelectHdl_Impl ) );
+
+ // check if the buttons text are not too wide otherwise we have to stretch the buttons
+ // and shrink the listbox
+ long nTxtWidth1 = m_aAddArchiveBtn.GetTextWidth( m_aAddArchiveBtn.GetText() );
+ long nTxtWidth2 = m_aAddPathBtn.GetTextWidth( m_aAddPathBtn.GetText() );
+ Size aBtnSz = m_aAddArchiveBtn.GetSizePixel();
+ if ( nTxtWidth1 > aBtnSz.Width() || nTxtWidth2 > aBtnSz.Width() )
+ {
+ long nW = ( nTxtWidth1 > aBtnSz.Width() ) ? nTxtWidth1 : nTxtWidth2;
+ long nDelta = nW - aBtnSz.Width() + 2 * BUTTON_BORDER;
+ aBtnSz.Width() += nDelta;
+ Point aBtnPnt = m_aAddArchiveBtn.GetPosPixel();
+ aBtnPnt.X() -= nDelta;
+ m_aAddArchiveBtn.SetPosSizePixel( aBtnPnt, aBtnSz );
+ aBtnPnt = m_aAddPathBtn.GetPosPixel();
+ aBtnPnt.X() -= nDelta;
+ m_aAddPathBtn.SetPosSizePixel( aBtnPnt, aBtnSz );
+ aBtnPnt = m_aRemoveBtn.GetPosPixel();
+ aBtnPnt.X() -= nDelta;
+ m_aRemoveBtn.SetPosSizePixel( aBtnPnt, aBtnSz );
+ Size aBoxSz = m_aPathList.GetSizePixel();
+ aBoxSz.Width() -= nDelta;
+ m_aPathList.SetSizePixel( aBoxSz );
+ }
+
+ // set initial focus to path list
+ m_aPathList.GrabFocus();
+}
+
+// -----------------------------------------------------------------------
+
+SvxJavaClassPathDlg::~SvxJavaClassPathDlg()
+{
+ USHORT i, nCount = m_aPathList.GetEntryCount();
+ for ( i = 0; i < nCount; ++i )
+ delete static_cast< String* >( m_aPathList.GetEntryData(i) );
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaClassPathDlg, AddArchiveHdl_Impl, PushButton *, EMPTYARG )
+{
+ sfx2::FileDialogHelper aDlg( TemplateDescription::FILEOPEN_SIMPLE, 0 );
+ aDlg.SetTitle( CUI_RES( RID_SVXSTR_ARCHIVE_TITLE ) );
+ aDlg.AddFilter( CUI_RES( RID_SVXSTR_ARCHIVE_HEADLINE ), String::CreateFromAscii("*.jar;*.zip") );
+ String sFolder;
+ if ( m_aPathList.GetSelectEntryCount() > 0 )
+ {
+ INetURLObject aObj( m_aPathList.GetSelectEntry(), INetURLObject::FSYS_DETECT );
+ sFolder = aObj.GetMainURL( INetURLObject::NO_DECODE );
+ }
+ else
+ sFolder = SvtPathOptions().GetWorkPath();
+ aDlg.SetDisplayDirectory( sFolder );
+ if ( aDlg.Execute() == ERRCODE_NONE )
+ {
+ String sURL = aDlg.GetPath();
+ INetURLObject aURL( sURL );
+ String sFile = aURL.getFSysPath( INetURLObject::FSYS_DETECT );
+ if ( !IsPathDuplicate( sURL ) )
+ {
+ USHORT nPos = m_aPathList.InsertEntry( sFile, SvFileInformationManager::GetImage( aURL ) );
+ m_aPathList.SelectEntryPos( nPos );
+ }
+ else
+ {
+ String sMsg( CUI_RES( RID_SVXSTR_MULTIFILE_DBL_ERR ) );
+ sMsg.SearchAndReplaceAscii( "%1", sFile );
+ ErrorBox( this, WB_OK, sMsg ).Execute();
+ }
+ }
+ EnableRemoveButton();
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaClassPathDlg, AddPathHdl_Impl, PushButton *, EMPTYARG )
+{
+ rtl::OUString sService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FolderPicker" ) );
+ Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
+ Reference < XFolderPicker > xFolderPicker( xFactory->createInstance( sService ), UNO_QUERY );
+
+ String sOldFolder;
+ if ( m_aPathList.GetSelectEntryCount() > 0 )
+ {
+ INetURLObject aObj( m_aPathList.GetSelectEntry(), INetURLObject::FSYS_DETECT );
+ sOldFolder = aObj.GetMainURL( INetURLObject::NO_DECODE );
+ }
+ else
+ sOldFolder = SvtPathOptions().GetWorkPath();
+ xFolderPicker->setDisplayDirectory( sOldFolder );
+ if ( xFolderPicker->execute() == ExecutableDialogResults::OK )
+ {
+ String sFolderURL( xFolderPicker->getDirectory() );
+ INetURLObject aURL( sFolderURL );
+ String sNewFolder = aURL.getFSysPath( INetURLObject::FSYS_DETECT );
+ if ( !IsPathDuplicate( sFolderURL ) )
+ {
+ USHORT nPos = m_aPathList.InsertEntry( sNewFolder, SvFileInformationManager::GetImage( aURL ) );
+ m_aPathList.SelectEntryPos( nPos );
+ }
+ else
+ {
+ String sMsg( CUI_RES( RID_SVXSTR_MULTIFILE_DBL_ERR ) );
+ sMsg.SearchAndReplaceAscii( "%1", sNewFolder );
+ ErrorBox( this, WB_OK, sMsg ).Execute();
+ }
+ }
+ EnableRemoveButton();
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaClassPathDlg, RemoveHdl_Impl, PushButton *, EMPTYARG )
+{
+ USHORT nPos = m_aPathList.GetSelectEntryPos();
+ if ( nPos != LISTBOX_ENTRY_NOTFOUND )
+ {
+ m_aPathList.RemoveEntry( nPos );
+ USHORT nCount = m_aPathList.GetEntryCount();
+ if ( nCount )
+ {
+ if ( nPos >= nCount )
+ nPos = ( nCount - 1 );
+ m_aPathList.SelectEntryPos( nPos );
+ }
+ }
+
+ EnableRemoveButton();
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+IMPL_LINK( SvxJavaClassPathDlg, SelectHdl_Impl, ListBox *, EMPTYARG )
+{
+ EnableRemoveButton();
+ return 0;
+}
+
+// -----------------------------------------------------------------------
+
+bool SvxJavaClassPathDlg::IsPathDuplicate( const String& _rPath )
+{
+ bool bRet = false;
+ INetURLObject aFileObj( _rPath );
+ USHORT nCount = m_aPathList.GetEntryCount();
+ for ( USHORT i = 0; i < nCount; ++i )
+ {
+ INetURLObject aOtherObj( m_aPathList.GetEntry(i), INetURLObject::FSYS_DETECT );
+ if ( aOtherObj == aFileObj )
+ {
+ bRet = true;
+ break;
+ }
+ }
+
+ return bRet;
+}
+
+// -----------------------------------------------------------------------
+
+String SvxJavaClassPathDlg::GetClassPath() const
+{
+ String sPath;
+ USHORT nCount = m_aPathList.GetEntryCount();
+ for ( USHORT i = 0; i < nCount; ++i )
+ {
+ if ( sPath.Len() > 0 )
+ sPath += CLASSPATH_DELIMITER;
+ String* pFullPath = static_cast< String* >( m_aPathList.GetEntryData(i) );
+ if ( pFullPath )
+ sPath += *pFullPath;
+ else
+ sPath += m_aPathList.GetEntry(i);
+ }
+ return sPath;
+}
+
+// -----------------------------------------------------------------------
+
+void SvxJavaClassPathDlg::SetClassPath( const String& _rPath )
+{
+ if ( m_sOldPath.Len() == 0 )
+ m_sOldPath = _rPath;
+ m_aPathList.Clear();
+ xub_StrLen i, nIdx = 0;
+ xub_StrLen nCount = _rPath.GetTokenCount( CLASSPATH_DELIMITER );
+ for ( i = 0; i < nCount; ++i )
+ {
+ String sToken = _rPath.GetToken( 0, CLASSPATH_DELIMITER, nIdx );
+ INetURLObject aURL( sToken, INetURLObject::FSYS_DETECT );
+ String sPath = aURL.getFSysPath( INetURLObject::FSYS_DETECT );
+ m_aPathList.InsertEntry( sPath, SvFileInformationManager::GetImage( aURL ) );
+ }
+ // select first entry
+ m_aPathList.SelectEntryPos(0);
+ SelectHdl_Impl( NULL );
+}
+