1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_cui.hxx" 26 27 // include --------------------------------------------------------------- 28 29 #include "optjava.hxx" 30 #include <dialmgr.hxx> 31 32 #include "optjava.hrc" 33 #include <cuires.hrc> 34 #include "helpid.hrc" 35 #include <vcl/svapp.hxx> 36 #include <vcl/help.hxx> 37 #include <tools/urlobj.hxx> 38 #include <vcl/msgbox.hxx> 39 #include <vcl/waitobj.hxx> 40 #include <unotools/pathoptions.hxx> 41 #include <svtools/imagemgr.hxx> 42 #include <sfx2/filedlghelper.hxx> 43 #include <comphelper/processfactory.hxx> 44 #include <ucbhelper/contentbroker.hxx> 45 #include <com/sun/star/lang/XMultiServiceFactory.hpp> 46 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp> 47 #include <com/sun/star/ui/dialogs/XAsynchronousExecutableDialog.hpp> 48 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp> 49 #include <com/sun/star/ucb/XContentProvider.hpp> 50 #include <jvmfwk/framework.h> 51 52 // define ---------------------------------------------------------------- 53 54 #define CLASSPATH_DELIMITER SAL_PATHSEPARATOR 55 #define STRIM( s ) s.EraseLeadingChars().EraseTrailingChars() 56 #define BUTTON_BORDER 2 57 #define RESET_TIMEOUT 300 58 59 using namespace ::com::sun::star::lang; 60 using namespace ::com::sun::star::ucb; 61 using namespace ::com::sun::star::ui::dialogs; 62 using namespace ::com::sun::star::uno; 63 64 // ----------------------------------------------------------------------- 65 66 bool areListsEqual( const Sequence< ::rtl::OUString >& rListA, const Sequence< ::rtl::OUString >& rListB ) 67 { 68 bool bRet = true; 69 const sal_Int32 nLen = rListA.getLength(); 70 71 if ( rListB.getLength() != nLen ) 72 bRet = false; 73 else 74 { 75 const ::rtl::OUString* pStringA = rListA.getConstArray(); 76 const ::rtl::OUString* pStringB = rListB.getConstArray(); 77 78 for ( sal_Int32 i = 0; i < nLen; ++i ) 79 { 80 if ( *pStringA++ != *pStringB++ ) 81 { 82 bRet = false; 83 break; 84 } 85 } 86 } 87 88 return bRet; 89 } 90 91 // class SvxJavaOptionsPage ---------------------------------------------- 92 93 SvxJavaOptionsPage::SvxJavaOptionsPage( Window* pParent, const SfxItemSet& rSet ) : 94 95 SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_OPTIONS_JAVA ), rSet ), 96 97 m_aJavaLine ( this, CUI_RES( FL_JAVA ) ), 98 m_aJavaEnableCB ( this, CUI_RES( CB_JAVA_ENABLE ) ), 99 m_aJavaFoundLabel ( this, CUI_RES( FT_JAVA_FOUND ) ), 100 m_aJavaList ( this, CUI_RES( LB_JAVA ) ), 101 m_aJavaPathText ( this, CUI_RES( FT_JAVA_PATH ) ), 102 m_aAddBtn ( this, CUI_RES( PB_ADD ) ), 103 m_aParameterBtn ( this, CUI_RES( PB_PARAMETER ) ), 104 m_aClassPathBtn ( this, CUI_RES( PB_CLASSPATH ) ), 105 106 m_pParamDlg ( NULL ), 107 m_pPathDlg ( NULL ), 108 m_parJavaInfo ( NULL ), 109 m_parParameters ( NULL ), 110 m_pClassPath ( NULL ), 111 m_nInfoSize ( 0 ), 112 m_nParamSize ( 0 ), 113 m_sInstallText ( CUI_RES( STR_INSTALLED_IN ) ), 114 m_sAccessibilityText( CUI_RES( STR_ACCESSIBILITY ) ), 115 m_sAddDialogText ( CUI_RES( STR_ADDDLGTEXT ) ), 116 117 xDialogListener ( new ::svt::DialogClosedListener() ) 118 119 { 120 m_aJavaEnableCB.SetClickHdl( LINK( this, SvxJavaOptionsPage, EnableHdl_Impl ) ); 121 m_aJavaList.SetCheckButtonHdl( LINK( this, SvxJavaOptionsPage, CheckHdl_Impl ) ); 122 m_aJavaList.SetSelectHdl( LINK( this, SvxJavaOptionsPage, SelectHdl_Impl ) ); 123 m_aAddBtn.SetClickHdl( LINK( this, SvxJavaOptionsPage, AddHdl_Impl ) ); 124 m_aParameterBtn.SetClickHdl( LINK( this, SvxJavaOptionsPage, ParameterHdl_Impl ) ); 125 m_aClassPathBtn.SetClickHdl( LINK( this, SvxJavaOptionsPage, ClassPathHdl_Impl ) ); 126 m_aResetTimer.SetTimeoutHdl( LINK( this, SvxJavaOptionsPage, ResetHdl_Impl ) ); 127 m_aResetTimer.SetTimeout( RESET_TIMEOUT ); 128 129 //! m_aJavaList.EnableCheckButton( new SvLBoxButtonData( &m_aJavaList, true ) ); 130 131 static long aStaticTabs[]= 132 { 133 5, 0, 15, 90, 130, 300 134 }; 135 136 m_aJavaList.SvxSimpleTable::SetTabs( aStaticTabs ); 137 String sHeader( '\t' ); 138 sHeader += String( CUI_RES( STR_HEADER_VENDOR ) ); 139 sHeader += '\t'; 140 sHeader += String( CUI_RES( STR_HEADER_VERSION ) ); 141 sHeader += '\t'; 142 sHeader += String( CUI_RES( STR_HEADER_FEATURES ) ); 143 sHeader += '\t'; 144 m_aJavaList.InsertHeaderEntry( sHeader, HEADERBAR_APPEND, HIB_LEFT ); 145 146 m_aJavaList.SetHelpId( HID_OPTIONS_JAVA_LIST ); 147 148 FreeResource(); 149 150 xDialogListener->SetDialogClosedLink( LINK( this, SvxJavaOptionsPage, DialogClosedHdl ) ); 151 152 EnableHdl_Impl( &m_aJavaEnableCB ); 153 jfw_lock(); 154 155 //check if the text fits into the class path button 156 Size aButtonSize = m_aClassPathBtn.GetOutputSizePixel(); 157 sal_Int32 nTextWidth = m_aClassPathBtn.GetTextWidth(m_aClassPathBtn.GetText()); 158 //add some additional space 159 sal_Int32 nDiff = nTextWidth + 4 - aButtonSize.Width(); 160 if( nDiff > 0) 161 { 162 Point aPos(m_aClassPathBtn.GetPosPixel()); 163 aPos.X() -= nDiff; 164 aButtonSize.Width() += nDiff; 165 m_aClassPathBtn.SetPosSizePixel(aPos, aButtonSize); 166 aPos = m_aAddBtn.GetPosPixel(); 167 aPos.X() -= nDiff; 168 m_aAddBtn.SetPosSizePixel(aPos, aButtonSize); 169 aPos = m_aParameterBtn.GetPosPixel(); 170 aPos.X() -= nDiff; 171 m_aParameterBtn.SetPosSizePixel(aPos, aButtonSize); 172 Size aSize = m_aJavaList.GetSizePixel(); 173 aSize.Width() -= nDiff; 174 m_aJavaList.SetSizePixel(aSize); 175 } 176 } 177 178 // ----------------------------------------------------------------------- 179 180 SvxJavaOptionsPage::~SvxJavaOptionsPage() 181 { 182 delete m_pParamDlg; 183 delete m_pPathDlg; 184 ClearJavaInfo(); 185 std::vector< JavaInfo* >::iterator pIter; 186 for ( pIter = m_aAddedInfos.begin(); pIter != m_aAddedInfos.end(); ++pIter ) 187 { 188 JavaInfo* pInfo = *pIter; 189 jfw_freeJavaInfo( pInfo ); 190 } 191 /* 192 rtl_uString** pParamArr = m_parParameters; 193 for ( sal_Int32 i = 0; i < m_nParamSize; ++i ) 194 rtl_uString_release( *pParamArr++ ); 195 rtl_freeMemory( m_parParameters ); 196 rtl_uString_release( m_pClassPath ); 197 */ 198 jfw_unlock(); 199 } 200 201 // ----------------------------------------------------------------------- 202 203 IMPL_LINK( SvxJavaOptionsPage, EnableHdl_Impl, CheckBox *, EMPTYARG ) 204 { 205 sal_Bool bEnable = m_aJavaEnableCB.IsChecked(); 206 m_aJavaFoundLabel.Enable( bEnable ); 207 m_aJavaPathText.Enable( bEnable ); 208 m_aAddBtn.Enable( bEnable ); 209 m_aParameterBtn.Enable( bEnable ); 210 m_aClassPathBtn.Enable( bEnable ); 211 212 bEnable ? m_aJavaList.EnableTable() : m_aJavaList.DisableTable(); 213 214 return 0; 215 } 216 217 // ----------------------------------------------------------------------- 218 219 IMPL_LINK( SvxJavaOptionsPage, CheckHdl_Impl, SvxSimpleTable *, pList ) 220 { 221 SvLBoxEntry* pEntry = pList ? m_aJavaList.GetEntry( m_aJavaList.GetCurMousePoint() ) 222 : m_aJavaList.FirstSelected(); 223 if ( pEntry ) 224 m_aJavaList.HandleEntryChecked( pEntry ); 225 return 0; 226 } 227 228 // ----------------------------------------------------------------------- 229 230 IMPL_LINK( SvxJavaOptionsPage, SelectHdl_Impl, SvxSimpleTable *, EMPTYARG ) 231 { 232 // set installation directory info 233 SvLBoxEntry* pEntry = m_aJavaList.FirstSelected(); 234 DBG_ASSERT( pEntry, "SvxJavaOptionsPage::SelectHdl_Impl(): no entry" ); 235 String* pLocation = static_cast< String* >( pEntry->GetUserData() ); 236 DBG_ASSERT( pLocation, "invalid location string" ); 237 String sInfo = m_sInstallText; 238 if ( pLocation ) 239 sInfo += *pLocation; 240 m_aJavaPathText.SetText( sInfo ); 241 return 0; 242 } 243 244 // ----------------------------------------------------------------------- 245 246 IMPL_LINK( SvxJavaOptionsPage, AddHdl_Impl, PushButton *, EMPTYARG ) 247 { 248 try 249 { 250 Reference < XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); 251 xFolderPicker = Reference< XFolderPicker >( 252 xMgr->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.FolderPicker" ) ), UNO_QUERY ); 253 254 String sWorkFolder = SvtPathOptions().GetWorkPath(); 255 xFolderPicker->setDisplayDirectory( sWorkFolder ); 256 xFolderPicker->setDescription( m_sAddDialogText ); 257 258 Reference< XAsynchronousExecutableDialog > xAsyncDlg( xFolderPicker, UNO_QUERY ); 259 if ( xAsyncDlg.is() ) 260 xAsyncDlg->startExecuteModal( xDialogListener.get() ); 261 else if ( xFolderPicker.is() && xFolderPicker->execute() == ExecutableDialogResults::OK ) 262 AddFolder( xFolderPicker->getDirectory() ); 263 } 264 catch ( Exception& ) 265 { 266 #ifdef DBG_UTIL 267 DBG_ERRORFILE( "SvxJavaOptionsPage::AddHdl_Impl(): caught exception" ); 268 #endif 269 } 270 271 return 0; 272 } 273 274 // ----------------------------------------------------------------------- 275 276 IMPL_LINK( SvxJavaOptionsPage, ParameterHdl_Impl, PushButton *, EMPTYARG ) 277 { 278 Sequence< ::rtl::OUString > aParameterList; 279 if ( !m_pParamDlg ) 280 { 281 m_pParamDlg = new SvxJavaParameterDlg( this ); 282 javaFrameworkError eErr = jfw_getVMParameters( &m_parParameters, &m_nParamSize ); 283 if ( JFW_E_NONE == eErr && m_parParameters && m_nParamSize > 0 ) 284 { 285 rtl_uString** pParamArr = m_parParameters; 286 aParameterList.realloc( m_nParamSize ); 287 ::rtl::OUString* pParams = aParameterList.getArray(); 288 for ( sal_Int32 i = 0; i < m_nParamSize; ++i ) 289 { 290 rtl_uString* pParam = *pParamArr++; 291 pParams[i] = ::rtl::OUString( pParam ); 292 } 293 m_pParamDlg->SetParameters( aParameterList ); 294 } 295 } 296 else 297 aParameterList = m_pParamDlg->GetParameters(); 298 299 if ( m_pParamDlg->Execute() == RET_OK ) 300 { 301 if ( !areListsEqual( aParameterList, m_pParamDlg->GetParameters() ) ) 302 { 303 aParameterList = m_pParamDlg->GetParameters(); 304 sal_Bool bRunning = sal_False; 305 javaFrameworkError eErr = jfw_isVMRunning( &bRunning ); 306 DBG_ASSERT( JFW_E_NONE == eErr, 307 "SvxJavaOptionsPage::ParameterHdl_Impl(): error in jfw_isVMRunning" ); 308 (void)eErr; 309 if ( bRunning ) 310 { 311 WarningBox aWarnBox( this, CUI_RES( RID_SVX_MSGBOX_JAVA_RESTART2 ) ); 312 aWarnBox.Execute(); 313 } 314 } 315 } 316 else 317 m_pParamDlg->SetParameters( aParameterList ); 318 319 return 0; 320 } 321 322 // ----------------------------------------------------------------------- 323 324 IMPL_LINK( SvxJavaOptionsPage, ClassPathHdl_Impl, PushButton *, EMPTYARG ) 325 { 326 String sClassPath; 327 328 if ( !m_pPathDlg ) 329 { 330 m_pPathDlg = new SvxJavaClassPathDlg( this ); 331 javaFrameworkError eErr = jfw_getUserClassPath( &m_pClassPath ); 332 if ( JFW_E_NONE == eErr && m_pClassPath ) 333 { 334 sClassPath = String( ::rtl::OUString( m_pClassPath ) ); 335 m_pPathDlg->SetClassPath( sClassPath ); 336 } 337 } 338 else 339 sClassPath = m_pPathDlg->GetClassPath(); 340 341 m_pPathDlg->SetFocus(); 342 if ( m_pPathDlg->Execute() == RET_OK ) 343 { 344 345 if ( m_pPathDlg->GetClassPath() != sClassPath ) 346 { 347 sClassPath = m_pPathDlg->GetClassPath(); 348 sal_Bool bRunning = sal_False; 349 javaFrameworkError eErr = jfw_isVMRunning( &bRunning ); 350 DBG_ASSERT( JFW_E_NONE == eErr, 351 "SvxJavaOptionsPage::ParameterHdl_Impl(): error in jfw_isVMRunning" ); 352 (void)eErr; 353 if ( bRunning ) 354 { 355 WarningBox aWarnBox( this, CUI_RES( RID_SVX_MSGBOX_JAVA_RESTART2 ) ); 356 aWarnBox.Execute(); 357 } 358 } 359 } 360 else 361 m_pPathDlg->SetClassPath( sClassPath ); 362 363 return 0; 364 } 365 366 // ----------------------------------------------------------------------- 367 368 IMPL_LINK( SvxJavaOptionsPage, ResetHdl_Impl, Timer *, EMPTYARG ) 369 { 370 LoadJREs(); 371 return 0; 372 } 373 374 // ----------------------------------------------------------------------- 375 376 IMPL_LINK( SvxJavaOptionsPage, StartFolderPickerHdl, void*, EMPTYARG ) 377 { 378 try 379 { 380 Reference< XAsynchronousExecutableDialog > xAsyncDlg( xFolderPicker, UNO_QUERY ); 381 if ( xAsyncDlg.is() ) 382 xAsyncDlg->startExecuteModal( xDialogListener.get() ); 383 else if ( xFolderPicker.is() && xFolderPicker->execute() == ExecutableDialogResults::OK ) 384 AddFolder( xFolderPicker->getDirectory() ); 385 } 386 catch ( Exception& ) 387 { 388 #ifdef DBG_UTIL 389 DBG_ERRORFILE( "SvxJavaOptionsPage::StartFolderPickerHdl(): caught exception" ); 390 #endif 391 } 392 393 return 0L; 394 } 395 396 // ----------------------------------------------------------------------- 397 398 IMPL_LINK( SvxJavaOptionsPage, DialogClosedHdl, DialogClosedEvent*, pEvt ) 399 { 400 if ( RET_OK == pEvt->DialogResult ) 401 { 402 DBG_ASSERT( xFolderPicker.is() == sal_True, "SvxJavaOptionsPage::DialogClosedHdl(): no folder picker" ); 403 404 AddFolder( xFolderPicker->getDirectory() ); 405 } 406 return 0L; 407 } 408 409 // ----------------------------------------------------------------------- 410 411 void SvxJavaOptionsPage::ClearJavaInfo() 412 { 413 if ( m_parJavaInfo ) 414 { 415 JavaInfo** parInfo = m_parJavaInfo; 416 for ( sal_Int32 i = 0; i < m_nInfoSize; ++i ) 417 { 418 JavaInfo* pInfo = *parInfo++; 419 jfw_freeJavaInfo( pInfo ); 420 } 421 422 rtl_freeMemory( m_parJavaInfo ); 423 m_parJavaInfo = NULL; 424 m_nInfoSize = 0; 425 } 426 } 427 428 // ----------------------------------------------------------------------- 429 430 void SvxJavaOptionsPage::ClearJavaList() 431 { 432 SvLBoxEntry* pEntry = m_aJavaList.First(); 433 while ( pEntry ) 434 { 435 String* pLocation = static_cast< String* >( pEntry->GetUserData() ); 436 delete pLocation; 437 pEntry = m_aJavaList.Next( pEntry ); 438 } 439 m_aJavaList.Clear(); 440 } 441 442 // ----------------------------------------------------------------------- 443 444 void SvxJavaOptionsPage::LoadJREs() 445 { 446 WaitObject aWaitObj( &m_aJavaList ); 447 javaFrameworkError eErr = jfw_findAllJREs( &m_parJavaInfo, &m_nInfoSize ); 448 if ( JFW_E_NONE == eErr && m_parJavaInfo ) 449 { 450 JavaInfo** parInfo = m_parJavaInfo; 451 for ( sal_Int32 i = 0; i < m_nInfoSize; ++i ) 452 { 453 JavaInfo* pInfo = *parInfo++; 454 AddJRE( pInfo ); 455 } 456 } 457 458 std::vector< JavaInfo* >::iterator pIter; 459 for ( pIter = m_aAddedInfos.begin(); pIter != m_aAddedInfos.end(); ++pIter ) 460 { 461 JavaInfo* pInfo = *pIter; 462 AddJRE( pInfo ); 463 } 464 465 JavaInfo* pSelectedJava = NULL; 466 eErr = jfw_getSelectedJRE( &pSelectedJava ); 467 if ( JFW_E_NONE == eErr && pSelectedJava ) 468 { 469 JavaInfo** parInfo = m_parJavaInfo; 470 for ( sal_Int32 i = 0; i < m_nInfoSize; ++i ) 471 { 472 JavaInfo* pCmpInfo = *parInfo++; 473 if ( jfw_areEqualJavaInfo( pCmpInfo, pSelectedJava ) ) 474 { 475 SvLBoxEntry* pEntry = m_aJavaList.GetEntry(i); 476 if ( pEntry ) 477 m_aJavaList.HandleEntryChecked( pEntry ); 478 break; 479 } 480 } 481 } 482 483 jfw_freeJavaInfo( pSelectedJava ); 484 } 485 486 // ----------------------------------------------------------------------- 487 488 void SvxJavaOptionsPage::AddJRE( JavaInfo* _pInfo ) 489 { 490 String sEntry( '\t' ); 491 sEntry += String( ::rtl::OUString( _pInfo->sVendor ) ); 492 sEntry += '\t'; 493 sEntry += String( ::rtl::OUString( _pInfo->sVersion ) ); 494 sEntry += '\t'; 495 if ( ( _pInfo->nFeatures & JFW_FEATURE_ACCESSBRIDGE ) == JFW_FEATURE_ACCESSBRIDGE ) 496 sEntry += m_sAccessibilityText; 497 SvLBoxEntry* pEntry = m_aJavaList.InsertEntry( sEntry ); 498 INetURLObject aLocObj( ::rtl::OUString( _pInfo->sLocation ) ); 499 String* pLocation = new String( aLocObj.getFSysPath( INetURLObject::FSYS_DETECT ) ); 500 pEntry->SetUserData( pLocation ); 501 } 502 503 // ----------------------------------------------------------------------- 504 505 void SvxJavaOptionsPage::HandleCheckEntry( SvLBoxEntry* _pEntry ) 506 { 507 m_aJavaList.Select( _pEntry, sal_True ); 508 SvButtonState eState = m_aJavaList.GetCheckButtonState( _pEntry ); 509 510 if ( SV_BUTTON_CHECKED == eState ) 511 { 512 // we have radio button behavior -> so uncheck the other entries 513 SvLBoxEntry* pEntry = m_aJavaList.First(); 514 while ( pEntry ) 515 { 516 if ( pEntry != _pEntry ) 517 m_aJavaList.SetCheckButtonState( pEntry, SV_BUTTON_UNCHECKED ); 518 pEntry = m_aJavaList.Next( pEntry ); 519 } 520 } 521 else 522 m_aJavaList.SetCheckButtonState( _pEntry, SV_BUTTON_CHECKED ); 523 } 524 525 // ----------------------------------------------------------------------- 526 527 void SvxJavaOptionsPage::AddFolder( const ::rtl::OUString& _rFolder ) 528 { 529 bool bStartAgain = true; 530 sal_Int32 nPos = 0; 531 JavaInfo* pInfo = NULL; 532 javaFrameworkError eErr = jfw_getJavaInfoByPath( _rFolder.pData, &pInfo ); 533 if ( JFW_E_NONE == eErr && pInfo ) 534 { 535 bool bFound = false; 536 JavaInfo** parInfo = m_parJavaInfo; 537 for ( sal_Int32 i = 0; i < m_nInfoSize; ++i ) 538 { 539 JavaInfo* pCmpInfo = *parInfo++; 540 if ( jfw_areEqualJavaInfo( pCmpInfo, pInfo ) ) 541 { 542 bFound = true; 543 nPos = i; 544 break; 545 } 546 } 547 548 if ( !bFound ) 549 { 550 std::vector< JavaInfo* >::iterator pIter; 551 for ( pIter = m_aAddedInfos.begin(); pIter != m_aAddedInfos.end(); ++pIter ) 552 { 553 JavaInfo* pCmpInfo = *pIter; 554 if ( jfw_areEqualJavaInfo( pCmpInfo, pInfo ) ) 555 { 556 bFound = true; 557 break; 558 } 559 } 560 } 561 562 if ( !bFound ) 563 { 564 jfw_addJRELocation( pInfo->sLocation ); 565 AddJRE( pInfo ); 566 m_aAddedInfos.push_back( pInfo ); 567 nPos = m_aJavaList.GetEntryCount() - 1; 568 } 569 else 570 jfw_freeJavaInfo( pInfo ); 571 572 SvLBoxEntry* pEntry = m_aJavaList.GetEntry( nPos ); 573 m_aJavaList.Select( pEntry ); 574 m_aJavaList.SetCheckButtonState( pEntry, SV_BUTTON_CHECKED ); 575 HandleCheckEntry( pEntry ); 576 bStartAgain = false; 577 } 578 else if ( JFW_E_NOT_RECOGNIZED == eErr ) 579 { 580 ErrorBox aErrBox( this, CUI_RES( RID_SVXERR_JRE_NOT_RECOGNIZED ) ); 581 aErrBox.Execute(); 582 } 583 else if ( JFW_E_FAILED_VERSION == eErr ) 584 { 585 ErrorBox aErrBox( this, CUI_RES( RID_SVXERR_JRE_FAILED_VERSION ) ); 586 aErrBox.Execute(); 587 } 588 589 if ( bStartAgain ) 590 { 591 xFolderPicker->setDisplayDirectory( _rFolder ); 592 Application::PostUserEvent( LINK( this, SvxJavaOptionsPage, StartFolderPickerHdl ) ); 593 } 594 } 595 596 // ----------------------------------------------------------------------- 597 598 SfxTabPage* SvxJavaOptionsPage::Create( Window* pParent, const SfxItemSet& rAttrSet ) 599 { 600 return ( new SvxJavaOptionsPage( pParent, rAttrSet ) ); 601 } 602 603 // ----------------------------------------------------------------------- 604 605 sal_Bool SvxJavaOptionsPage::FillItemSet( SfxItemSet& /*rCoreSet*/ ) 606 { 607 sal_Bool bModified = sal_False; 608 javaFrameworkError eErr = JFW_E_NONE; 609 if ( m_pParamDlg ) 610 { 611 Sequence< ::rtl::OUString > aParamList = m_pParamDlg->GetParameters(); 612 sal_Int32 i, nSize = aParamList.getLength(); 613 rtl_uString** pParamArr = (rtl_uString**)rtl_allocateMemory( sizeof(rtl_uString*) * nSize ); 614 rtl_uString** pParamArrIter = pParamArr; 615 const ::rtl::OUString* pList = aParamList.getConstArray(); 616 for ( i = 0; i < nSize; ++i ) 617 pParamArr[i] = pList[i].pData; 618 eErr = jfw_setVMParameters( pParamArrIter, nSize ); 619 DBG_ASSERT( JFW_E_NONE == eErr, 620 "SvxJavaOptionsPage::FillItemSet(): error in jfw_setVMParameters" ); 621 pParamArrIter = pParamArr; 622 rtl_freeMemory( pParamArr ); 623 bModified = sal_True; 624 } 625 626 if ( m_pPathDlg ) 627 { 628 ::rtl::OUString sPath( m_pPathDlg->GetClassPath() ); 629 if ( m_pPathDlg->GetOldPath() != String( sPath ) ) 630 { 631 eErr = jfw_setUserClassPath( sPath.pData ); 632 DBG_ASSERT( JFW_E_NONE == eErr, 633 "SvxJavaOptionsPage::FillItemSet(): error in jfw_setUserClassPath" ); 634 bModified = sal_True; 635 } 636 } 637 638 sal_uLong nCount = m_aJavaList.GetEntryCount(); 639 for ( sal_uLong i = 0; i < nCount; ++i ) 640 { 641 if ( m_aJavaList.GetCheckButtonState( m_aJavaList.GetEntry(i) ) == SV_BUTTON_CHECKED ) 642 { 643 JavaInfo* pInfo = NULL; 644 if ( i < static_cast< sal_uLong >( m_nInfoSize ) ) 645 pInfo = m_parJavaInfo[i]; 646 else 647 pInfo = m_aAddedInfos[ i - m_nInfoSize ]; 648 649 JavaInfo* pSelectedJava = NULL; 650 eErr = jfw_getSelectedJRE( &pSelectedJava ); 651 if ( JFW_E_NONE == eErr || JFW_E_INVALID_SETTINGS == eErr ) 652 { 653 if (pSelectedJava == NULL || !jfw_areEqualJavaInfo( pInfo, pSelectedJava ) ) 654 { 655 sal_Bool bRunning = sal_False; 656 eErr = jfw_isVMRunning( &bRunning ); 657 DBG_ASSERT( JFW_E_NONE == eErr, 658 "SvxJavaOptionsPage::FillItemSet(): error in jfw_isVMRunning" ); 659 if ( bRunning || 660 ( ( pInfo->nRequirements & JFW_REQUIRE_NEEDRESTART ) == JFW_REQUIRE_NEEDRESTART ) ) 661 { 662 WarningBox aWarnBox( this, CUI_RES( RID_SVX_MSGBOX_JAVA_RESTART ) ); 663 aWarnBox.Execute(); 664 } 665 666 eErr = jfw_setSelectedJRE( pInfo ); 667 DBG_ASSERT( JFW_E_NONE == eErr, 668 "SvxJavaOptionsPage::FillItemSet(): error in jfw_setSelectedJRE" ); 669 bModified = sal_True; 670 } 671 } 672 jfw_freeJavaInfo( pSelectedJava ); 673 break; 674 } 675 } 676 677 sal_Bool bEnabled = sal_False; 678 eErr = jfw_getEnabled( &bEnabled ); 679 DBG_ASSERT( JFW_E_NONE == eErr, 680 "SvxJavaOptionsPage::FillItemSet(): error in jfw_getEnabled" ); 681 if ( bEnabled != m_aJavaEnableCB.IsChecked() ) 682 { 683 eErr = jfw_setEnabled( m_aJavaEnableCB.IsChecked() ); 684 DBG_ASSERT( JFW_E_NONE == eErr, 685 "SvxJavaOptionsPage::FillItemSet(): error in jfw_setEnabled" ); 686 bModified = sal_True; 687 } 688 689 return bModified; 690 } 691 692 // ----------------------------------------------------------------------- 693 694 void SvxJavaOptionsPage::Reset( const SfxItemSet& /*rSet*/ ) 695 { 696 ClearJavaInfo(); 697 ClearJavaList(); 698 699 sal_Bool bEnabled = sal_False; 700 javaFrameworkError eErr = jfw_getEnabled( &bEnabled ); 701 if ( eErr != JFW_E_NONE ) 702 bEnabled = sal_False; 703 m_aJavaEnableCB.Check( bEnabled ); 704 EnableHdl_Impl( &m_aJavaEnableCB ); 705 706 m_aResetTimer.Start(); 707 } 708 709 // ----------------------------------------------------------------------- 710 711 void SvxJavaOptionsPage::FillUserData() 712 { 713 String aUserData; 714 SetUserData( aUserData ); 715 } 716 717 // class SvxJavaParameterDlg --------------------------------------------- 718 719 SvxJavaParameterDlg::SvxJavaParameterDlg( Window* pParent ) : 720 721 ModalDialog( pParent, CUI_RES( RID_SVXDLG_JAVA_PARAMETER ) ), 722 723 m_aParameterLabel ( this, CUI_RES( FT_PARAMETER ) ), 724 m_aParameterEdit ( this, CUI_RES( ED_PARAMETER ) ), 725 m_aAssignBtn ( this, CUI_RES( PB_ASSIGN ) ), 726 m_aAssignedLabel ( this, CUI_RES( FT_ASSIGNED ) ), 727 m_aAssignedList ( this, CUI_RES( LB_ASSIGNED ) ), 728 m_aExampleText ( this, CUI_RES( FT_EXAMPLE ) ), 729 m_aRemoveBtn ( this, CUI_RES( PB_REMOVE ) ), 730 m_aButtonsLine ( this, CUI_RES( FL_BUTTONS ) ), 731 m_aOKBtn ( this, CUI_RES( PB_PARAMETER_OK ) ), 732 m_aCancelBtn ( this, CUI_RES( PB_PARAMETER_ESC ) ), 733 m_aHelpBtn ( this, CUI_RES( PB_PARAMETER_HLP ) ) 734 735 { 736 FreeResource(); 737 738 m_aParameterEdit.SetModifyHdl( LINK( this, SvxJavaParameterDlg, ModifyHdl_Impl ) ); 739 m_aAssignBtn.SetClickHdl( LINK( this, SvxJavaParameterDlg, AssignHdl_Impl ) ); 740 m_aRemoveBtn.SetClickHdl( LINK( this, SvxJavaParameterDlg, RemoveHdl_Impl ) ); 741 m_aAssignedList.SetSelectHdl( LINK( this, SvxJavaParameterDlg, SelectHdl_Impl ) ); 742 m_aAssignedList.SetDoubleClickHdl( LINK( this, SvxJavaParameterDlg, DblClickHdl_Impl ) ); 743 744 ModifyHdl_Impl( &m_aParameterEdit ); 745 EnableRemoveButton(); 746 } 747 748 // ----------------------------------------------------------------------- 749 750 SvxJavaParameterDlg::~SvxJavaParameterDlg() 751 { 752 } 753 754 // ----------------------------------------------------------------------- 755 756 IMPL_LINK( SvxJavaParameterDlg, ModifyHdl_Impl, Edit *, EMPTYARG ) 757 { 758 String sParam = STRIM( m_aParameterEdit.GetText() ); 759 m_aAssignBtn.Enable( sParam.Len() > 0 ); 760 761 return 0; 762 } 763 764 // ----------------------------------------------------------------------- 765 766 IMPL_LINK( SvxJavaParameterDlg, AssignHdl_Impl, PushButton *, EMPTYARG ) 767 { 768 String sParam = STRIM( m_aParameterEdit.GetText() ); 769 if ( sParam.Len() > 0 ) 770 { 771 sal_uInt16 nPos = m_aAssignedList.GetEntryPos( sParam ); 772 if ( LISTBOX_ENTRY_NOTFOUND == nPos ) 773 nPos = m_aAssignedList.InsertEntry( sParam ); 774 m_aAssignedList.SelectEntryPos( nPos ); 775 m_aParameterEdit.SetText( String() ); 776 ModifyHdl_Impl( &m_aParameterEdit ); 777 EnableRemoveButton(); 778 } 779 780 return 0; 781 } 782 783 // ----------------------------------------------------------------------- 784 785 IMPL_LINK( SvxJavaParameterDlg, SelectHdl_Impl, ListBox *, EMPTYARG ) 786 { 787 EnableRemoveButton(); 788 return 0; 789 } 790 791 // ----------------------------------------------------------------------- 792 793 IMPL_LINK( SvxJavaParameterDlg, DblClickHdl_Impl, ListBox *, EMPTYARG ) 794 { 795 sal_uInt16 nPos = m_aAssignedList.GetSelectEntryPos(); 796 if ( nPos != LISTBOX_ENTRY_NOTFOUND ) 797 m_aParameterEdit.SetText( m_aAssignedList.GetEntry( nPos ) ); 798 return 0; 799 } 800 801 // ----------------------------------------------------------------------- 802 803 IMPL_LINK( SvxJavaParameterDlg, RemoveHdl_Impl, PushButton *, EMPTYARG ) 804 { 805 sal_uInt16 nPos = m_aAssignedList.GetSelectEntryPos(); 806 if ( nPos != LISTBOX_ENTRY_NOTFOUND ) 807 { 808 m_aAssignedList.RemoveEntry( nPos ); 809 sal_uInt16 nCount = m_aAssignedList.GetEntryCount(); 810 if ( nCount ) 811 { 812 if ( nPos >= nCount ) 813 nPos = ( nCount - 1 ); 814 m_aAssignedList.SelectEntryPos( nPos ); 815 } 816 } 817 EnableRemoveButton(); 818 819 return 0; 820 } 821 822 // ----------------------------------------------------------------------- 823 824 short SvxJavaParameterDlg::Execute() 825 { 826 m_aParameterEdit.GrabFocus(); 827 m_aAssignedList.SetNoSelection(); 828 return ModalDialog::Execute(); 829 } 830 831 // ----------------------------------------------------------------------- 832 833 Sequence< ::rtl::OUString > SvxJavaParameterDlg::GetParameters() const 834 { 835 sal_uInt16 nCount = m_aAssignedList.GetEntryCount(); 836 Sequence< ::rtl::OUString > aParamList( nCount ); 837 ::rtl::OUString* pArray = aParamList.getArray(); 838 for ( sal_uInt16 i = 0; i < nCount; ++i ) 839 pArray[i] = ::rtl::OUString( m_aAssignedList.GetEntry(i) ); 840 return aParamList; 841 } 842 843 // ----------------------------------------------------------------------- 844 845 void SvxJavaParameterDlg::SetParameters( Sequence< ::rtl::OUString >& rParams ) 846 { 847 m_aAssignedList.Clear(); 848 sal_uLong i, nCount = rParams.getLength(); 849 const ::rtl::OUString* pArray = rParams.getConstArray(); 850 for ( i = 0; i < nCount; ++i ) 851 { 852 String sParam = String( *pArray++ ); 853 m_aAssignedList.InsertEntry( sParam ); 854 } 855 } 856 857 // class SvxJavaClassPathDlg --------------------------------------------- 858 859 SvxJavaClassPathDlg::SvxJavaClassPathDlg( Window* pParent ) : 860 861 ModalDialog( pParent, CUI_RES( RID_SVXDLG_JAVA_CLASSPATH ) ), 862 863 m_aPathLabel ( this, CUI_RES( FT_PATH ) ), 864 m_aPathList ( this, CUI_RES( LB_PATH ) ), 865 m_aAddArchiveBtn ( this, CUI_RES( PB_ADDARCHIVE ) ), 866 m_aAddPathBtn ( this, CUI_RES( PB_ADDPATH ) ), 867 m_aRemoveBtn ( this, CUI_RES( PB_REMOVE_PATH ) ), 868 m_aButtonsLine ( this, CUI_RES( FL_PATH_BUTTONS ) ), 869 m_aOKBtn ( this, CUI_RES( PB_PATH_OK ) ), 870 m_aCancelBtn ( this, CUI_RES( PB_PATH_ESC ) ), 871 m_aHelpBtn ( this, CUI_RES( PB_PATH_HLP ) ) 872 873 { 874 FreeResource(); 875 876 m_aAddArchiveBtn.SetClickHdl( LINK( this, SvxJavaClassPathDlg, AddArchiveHdl_Impl ) ); 877 m_aAddPathBtn.SetClickHdl( LINK( this, SvxJavaClassPathDlg, AddPathHdl_Impl ) ); 878 m_aRemoveBtn.SetClickHdl( LINK( this, SvxJavaClassPathDlg, RemoveHdl_Impl ) ); 879 m_aPathList.SetSelectHdl( LINK( this, SvxJavaClassPathDlg, SelectHdl_Impl ) ); 880 881 // check if the buttons text are not too wide otherwise we have to stretch the buttons 882 // and shrink the listbox 883 long nTxtWidth1 = m_aAddArchiveBtn.GetTextWidth( m_aAddArchiveBtn.GetText() ); 884 long nTxtWidth2 = m_aAddPathBtn.GetTextWidth( m_aAddPathBtn.GetText() ); 885 Size aBtnSz = m_aAddArchiveBtn.GetSizePixel(); 886 if ( nTxtWidth1 > aBtnSz.Width() || nTxtWidth2 > aBtnSz.Width() ) 887 { 888 long nW = ( nTxtWidth1 > aBtnSz.Width() ) ? nTxtWidth1 : nTxtWidth2; 889 long nDelta = nW - aBtnSz.Width() + 2 * BUTTON_BORDER; 890 aBtnSz.Width() += nDelta; 891 Point aBtnPnt = m_aAddArchiveBtn.GetPosPixel(); 892 aBtnPnt.X() -= nDelta; 893 m_aAddArchiveBtn.SetPosSizePixel( aBtnPnt, aBtnSz ); 894 aBtnPnt = m_aAddPathBtn.GetPosPixel(); 895 aBtnPnt.X() -= nDelta; 896 m_aAddPathBtn.SetPosSizePixel( aBtnPnt, aBtnSz ); 897 aBtnPnt = m_aRemoveBtn.GetPosPixel(); 898 aBtnPnt.X() -= nDelta; 899 m_aRemoveBtn.SetPosSizePixel( aBtnPnt, aBtnSz ); 900 Size aBoxSz = m_aPathList.GetSizePixel(); 901 aBoxSz.Width() -= nDelta; 902 m_aPathList.SetSizePixel( aBoxSz ); 903 } 904 905 // set initial focus to path list 906 m_aPathList.GrabFocus(); 907 } 908 909 // ----------------------------------------------------------------------- 910 911 SvxJavaClassPathDlg::~SvxJavaClassPathDlg() 912 { 913 sal_uInt16 i, nCount = m_aPathList.GetEntryCount(); 914 for ( i = 0; i < nCount; ++i ) 915 delete static_cast< String* >( m_aPathList.GetEntryData(i) ); 916 } 917 918 // ----------------------------------------------------------------------- 919 920 IMPL_LINK( SvxJavaClassPathDlg, AddArchiveHdl_Impl, PushButton *, EMPTYARG ) 921 { 922 sfx2::FileDialogHelper aDlg( TemplateDescription::FILEOPEN_SIMPLE, 0 ); 923 aDlg.SetTitle( CUI_RES( RID_SVXSTR_ARCHIVE_TITLE ) ); 924 aDlg.AddFilter( CUI_RES( RID_SVXSTR_ARCHIVE_HEADLINE ), String::CreateFromAscii("*.jar;*.zip") ); 925 String sFolder; 926 if ( m_aPathList.GetSelectEntryCount() > 0 ) 927 { 928 INetURLObject aObj( m_aPathList.GetSelectEntry(), INetURLObject::FSYS_DETECT ); 929 sFolder = aObj.GetMainURL( INetURLObject::NO_DECODE ); 930 } 931 else 932 sFolder = SvtPathOptions().GetWorkPath(); 933 aDlg.SetDisplayDirectory( sFolder ); 934 if ( aDlg.Execute() == ERRCODE_NONE ) 935 { 936 String sURL = aDlg.GetPath(); 937 INetURLObject aURL( sURL ); 938 String sFile = aURL.getFSysPath( INetURLObject::FSYS_DETECT ); 939 if ( !IsPathDuplicate( sURL ) ) 940 { 941 sal_uInt16 nPos = m_aPathList.InsertEntry( sFile, SvFileInformationManager::GetImage( aURL ) ); 942 m_aPathList.SelectEntryPos( nPos ); 943 } 944 else 945 { 946 String sMsg( CUI_RES( RID_SVXSTR_MULTIFILE_DBL_ERR ) ); 947 sMsg.SearchAndReplaceAscii( "%1", sFile ); 948 ErrorBox( this, WB_OK, sMsg ).Execute(); 949 } 950 } 951 EnableRemoveButton(); 952 return 0; 953 } 954 955 // ----------------------------------------------------------------------- 956 957 IMPL_LINK( SvxJavaClassPathDlg, AddPathHdl_Impl, PushButton *, EMPTYARG ) 958 { 959 rtl::OUString sService( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.FolderPicker" ) ); 960 Reference < XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); 961 Reference < XFolderPicker > xFolderPicker( xFactory->createInstance( sService ), UNO_QUERY ); 962 963 String sOldFolder; 964 if ( m_aPathList.GetSelectEntryCount() > 0 ) 965 { 966 INetURLObject aObj( m_aPathList.GetSelectEntry(), INetURLObject::FSYS_DETECT ); 967 sOldFolder = aObj.GetMainURL( INetURLObject::NO_DECODE ); 968 } 969 else 970 sOldFolder = SvtPathOptions().GetWorkPath(); 971 xFolderPicker->setDisplayDirectory( sOldFolder ); 972 if ( xFolderPicker->execute() == ExecutableDialogResults::OK ) 973 { 974 String sFolderURL( xFolderPicker->getDirectory() ); 975 INetURLObject aURL( sFolderURL ); 976 String sNewFolder = aURL.getFSysPath( INetURLObject::FSYS_DETECT ); 977 if ( !IsPathDuplicate( sFolderURL ) ) 978 { 979 sal_uInt16 nPos = m_aPathList.InsertEntry( sNewFolder, SvFileInformationManager::GetImage( aURL ) ); 980 m_aPathList.SelectEntryPos( nPos ); 981 } 982 else 983 { 984 String sMsg( CUI_RES( RID_SVXSTR_MULTIFILE_DBL_ERR ) ); 985 sMsg.SearchAndReplaceAscii( "%1", sNewFolder ); 986 ErrorBox( this, WB_OK, sMsg ).Execute(); 987 } 988 } 989 EnableRemoveButton(); 990 return 0; 991 } 992 993 // ----------------------------------------------------------------------- 994 995 IMPL_LINK( SvxJavaClassPathDlg, RemoveHdl_Impl, PushButton *, EMPTYARG ) 996 { 997 sal_uInt16 nPos = m_aPathList.GetSelectEntryPos(); 998 if ( nPos != LISTBOX_ENTRY_NOTFOUND ) 999 { 1000 m_aPathList.RemoveEntry( nPos ); 1001 sal_uInt16 nCount = m_aPathList.GetEntryCount(); 1002 if ( nCount ) 1003 { 1004 if ( nPos >= nCount ) 1005 nPos = ( nCount - 1 ); 1006 m_aPathList.SelectEntryPos( nPos ); 1007 } 1008 } 1009 1010 EnableRemoveButton(); 1011 return 0; 1012 } 1013 1014 // ----------------------------------------------------------------------- 1015 1016 IMPL_LINK( SvxJavaClassPathDlg, SelectHdl_Impl, ListBox *, EMPTYARG ) 1017 { 1018 EnableRemoveButton(); 1019 return 0; 1020 } 1021 1022 // ----------------------------------------------------------------------- 1023 1024 bool SvxJavaClassPathDlg::IsPathDuplicate( const String& _rPath ) 1025 { 1026 bool bRet = false; 1027 INetURLObject aFileObj( _rPath ); 1028 sal_uInt16 nCount = m_aPathList.GetEntryCount(); 1029 for ( sal_uInt16 i = 0; i < nCount; ++i ) 1030 { 1031 INetURLObject aOtherObj( m_aPathList.GetEntry(i), INetURLObject::FSYS_DETECT ); 1032 if ( aOtherObj == aFileObj ) 1033 { 1034 bRet = true; 1035 break; 1036 } 1037 } 1038 1039 return bRet; 1040 } 1041 1042 // ----------------------------------------------------------------------- 1043 1044 String SvxJavaClassPathDlg::GetClassPath() const 1045 { 1046 String sPath; 1047 sal_uInt16 nCount = m_aPathList.GetEntryCount(); 1048 for ( sal_uInt16 i = 0; i < nCount; ++i ) 1049 { 1050 if ( sPath.Len() > 0 ) 1051 sPath += CLASSPATH_DELIMITER; 1052 String* pFullPath = static_cast< String* >( m_aPathList.GetEntryData(i) ); 1053 if ( pFullPath ) 1054 sPath += *pFullPath; 1055 else 1056 sPath += m_aPathList.GetEntry(i); 1057 } 1058 return sPath; 1059 } 1060 1061 // ----------------------------------------------------------------------- 1062 1063 void SvxJavaClassPathDlg::SetClassPath( const String& _rPath ) 1064 { 1065 if ( m_sOldPath.Len() == 0 ) 1066 m_sOldPath = _rPath; 1067 m_aPathList.Clear(); 1068 xub_StrLen i, nIdx = 0; 1069 xub_StrLen nCount = _rPath.GetTokenCount( CLASSPATH_DELIMITER ); 1070 for ( i = 0; i < nCount; ++i ) 1071 { 1072 String sToken = _rPath.GetToken( 0, CLASSPATH_DELIMITER, nIdx ); 1073 INetURLObject aURL( sToken, INetURLObject::FSYS_DETECT ); 1074 String sPath = aURL.getFSysPath( INetURLObject::FSYS_DETECT ); 1075 m_aPathList.InsertEntry( sPath, SvFileInformationManager::GetImage( aURL ) ); 1076 } 1077 // select first entry 1078 m_aPathList.SelectEntryPos(0); 1079 SelectHdl_Impl( NULL ); 1080 } 1081 1082