/* -*- 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ // include --------------------------------------------------------------- #include "optjava.hxx" #include #include "optjava.hrc" #include #include "helpid.hrc" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // 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; // ----------------------------------------------------------------------- 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_aJavaListContainer(this, CUI_RES(LB_JAVA)), m_aJavaList(m_aJavaListContainer), 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 ); 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_aJavaListContainer.GetSizePixel(); aSize.Width() -= nDiff; m_aJavaListContainer.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 ); } jfw_unlock(); } // ----------------------------------------------------------------------- IMPL_LINK( SvxJavaOptionsPage, EnableHdl_Impl, CheckBox *, EMPTYARG ) { sal_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(RTL_CONSTASCII_USTRINGPARAM("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, sal_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; JavaInfo* pInfo = NULL; javaFrameworkError eErr = jfw_getJavaInfoByPath( _rFolder.pData, &pInfo ); if ( JFW_E_NONE == eErr && pInfo ) { sal_Int32 nPos = 0; 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 ) ); } // ----------------------------------------------------------------------- sal_Bool SvxJavaOptionsPage::FillItemSet( SfxItemSet& /*rCoreSet*/ ) { sal_Bool bModified = sal_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 = sal_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 = sal_True; } } sal_uLong nCount = m_aJavaList.GetEntryCount(); for ( sal_uLong i = 0; i < nCount; ++i ) { if ( m_aJavaList.GetCheckButtonState( m_aJavaList.GetEntry(i) ) == SV_BUTTON_CHECKED ) { JavaInfo* pInfo = NULL; if ( i < static_cast< sal_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 = sal_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 = sal_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 ) { sal_uInt16 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 ) { sal_uInt16 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 ) { sal_uInt16 nPos = m_aAssignedList.GetSelectEntryPos(); if ( nPos != LISTBOX_ENTRY_NOTFOUND ) { m_aAssignedList.RemoveEntry( nPos ); sal_uInt16 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 { sal_uInt16 nCount = m_aAssignedList.GetEntryCount(); Sequence< ::rtl::OUString > aParamList( nCount ); ::rtl::OUString* pArray = aParamList.getArray(); for ( sal_uInt16 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(); sal_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() { sal_uInt16 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 ) ) { sal_uInt16 nPos = m_aPathList.InsertEntry( sFile, SvFileInformationManager::GetImage( aURL, false ) ); 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 ) ) { sal_uInt16 nPos = m_aPathList.InsertEntry( sNewFolder, SvFileInformationManager::GetImage( aURL, false ) ); 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 ) { sal_uInt16 nPos = m_aPathList.GetSelectEntryPos(); if ( nPos != LISTBOX_ENTRY_NOTFOUND ) { m_aPathList.RemoveEntry( nPos ); sal_uInt16 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 ); sal_uInt16 nCount = m_aPathList.GetEntryCount(); for ( sal_uInt16 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; sal_uInt16 nCount = m_aPathList.GetEntryCount(); for ( sal_uInt16 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, false ) ); } // select first entry m_aPathList.SelectEntryPos(0); SelectHdl_Impl( NULL ); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */