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_svx.hxx" 26 #include <tools/urlobj.hxx> 27 #include <vcl/msgbox.hxx> 28 #include <unotools/configitem.hxx> 29 #include <unotools/cmdoptions.hxx> 30 #include <svtools/inetimg.hxx> 31 #include <svl/urlbmk.hxx> 32 #include <svl/eitem.hxx> 33 #include <svl/stritem.hxx> 34 #include <sfx2/viewfrm.hxx> 35 #include <sfx2/docfile.hxx> 36 #include <sfx2/imgmgr.hxx> 37 #include <sfx2/dispatch.hxx> 38 #include <svl/urihelper.hxx> 39 #include <sfx2/objsh.hxx> 40 #include <comphelper/processfactory.hxx> 41 42 #include "svx/hlnkitem.hxx" 43 #include <svx/dialogs.hrc> 44 #include "hyprlink.hrc" 45 #include <svx/dialmgr.hxx> 46 #include "svx/hyprlink.hxx" 47 #include "hyprdlg.hxx" 48 49 using namespace ::rtl; 50 using namespace ::com::sun::star; 51 52 // ----------------------------------------------------------------------- 53 54 class SearchDefaultConfigItem_Impl : public ::utl::ConfigItem 55 { 56 OUString sDefaultEngine; 57 public: 58 SearchDefaultConfigItem_Impl(); 59 ~SearchDefaultConfigItem_Impl(); 60 61 const OUString& GetDefaultSearchEngine(){ return sDefaultEngine;} 62 virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames ); 63 virtual void Commit(); 64 }; 65 66 /*-- 11.11.2003 14:20:59--------------------------------------------------- 67 68 -----------------------------------------------------------------------*/ 69 SearchDefaultConfigItem_Impl::SearchDefaultConfigItem_Impl() : 70 ConfigItem(OUString::createFromAscii("Inet/DefaultSearchEngine")) 71 { 72 uno::Sequence<OUString> aNames(1); 73 aNames.getArray()[0] = OUString::createFromAscii("Name"); 74 uno::Sequence< uno::Any > aValues = GetProperties(aNames); 75 aValues.getConstArray()[0] >>= sDefaultEngine; 76 } 77 /*-- 11.11.2003 14:21:00--------------------------------------------------- 78 79 -----------------------------------------------------------------------*/ 80 SearchDefaultConfigItem_Impl::~SearchDefaultConfigItem_Impl() 81 { 82 } 83 84 void SearchDefaultConfigItem_Impl::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& ) 85 { 86 } 87 88 void SearchDefaultConfigItem_Impl::Commit() 89 { 90 } 91 92 /************************************************************************* 93 |* 94 |* Dialog zum Einf"ugen/"Andern eines Hyperlink 95 |* 96 \************************************************************************/ 97 98 SvxHyperlinkDlg::SvxHyperlinkDlg( SfxBindings *_pBindings, Window* pParent) : 99 100 ToolBox ( pParent, SVX_RES( RID_SVXDLG_HYPERLINK ) ), 101 SfxControllerItem ( SID_HYPERLINK_SETLINK, *_pBindings ), 102 103 aForwarder ( SID_HYPERLINK_GETLINK, *this ), 104 aHyperlinkDlgForward( SID_HYPERLINK_DIALOG , *this), 105 106 aNameCB ( this, SVX_RES( CB_NAME ) ), 107 aUrlFT ( this, SVX_RES( FT_URL ) ), 108 aUrlCB ( this, SVX_RES( CB_URL ) ), 109 aSearchConfig (sal_True), 110 sAddress ( SVX_RES( STR_ADDRESS ) ), 111 sExplorer ( SVX_RES( STR_EXPLORER ) ), 112 sSearchTitle ( SVX_RES( STR_BOOKMARK_SEARCH ) ), 113 aLinkPopup ( SVX_RES( RID_SVXMN_HYPERLINK ) ), 114 pTargetMenu ( NULL ), 115 116 bNoDoc ( sal_True ), 117 bHasOldName ( sal_False ), 118 bHtmlMode ( sal_False ) 119 120 { 121 FreeResource(); 122 123 mpManager = SfxImageManager::GetImageManager( 0 ); 124 mpManager->RegisterToolBox( this ); 125 126 SetImages(); 127 128 // save initial size 129 nMaxWidth = GetSizePixel().Width(); 130 nMaxHeight = GetSizePixel().Height(); 131 132 133 InsertSeparator( 0 ); 134 InsertWindow( CB_URL, &aUrlCB, 0, 0 ); 135 // we need an item text for accessibility 136 String sItemText = aUrlCB.GetText(); 137 if ( sItemText.Len() == 0 ) 138 sItemText = aUrlCB.GetQuickHelpText(); 139 if ( sItemText.Len() > 0 ) 140 { 141 SetItemText( CB_URL, sItemText ); 142 sItemText.Erase(); 143 } 144 InsertWindow( FT_URL, &aUrlFT, 0, 0 ); 145 InsertSeparator( 0 ); 146 InsertWindow( CB_NAME, &aNameCB, 0, 0 ); 147 sItemText = aNameCB.GetText(); 148 if ( sItemText.Len() == 0 ) 149 sItemText = aNameCB.GetQuickHelpText(); 150 if ( sItemText.Len() > 0 ) 151 SetItemText( CB_NAME, sItemText ); 152 153 SetSizePixel(CalcWindowSizePixel()); // Groesse initialisieren 154 155 nMaxHeight = GetSizePixel().Height(); // Hoehe nochmal merken, da sie veraendert wurde 156 // SetSizePixel ruft Resize-Handler! 157 158 Show(); 159 Resize(); 160 161 long nUrlWidth = aUrlCB.GetResizeWidth(); 162 long nNameWidth = aNameCB.GetResizeWidth(); 163 long nSum = nUrlWidth + nNameWidth; 164 165 aUrlCB.SetRatio((nUrlWidth * 100L) / nSum); 166 aNameCB.SetRatio((nNameWidth * 100L) / nSum); 167 168 SetClickHdl( LINK( this, SvxHyperlinkDlg, TBClickHdl ) ); 169 SetSelectHdl( LINK( this, SvxHyperlinkDlg, TBSelectHdl ) ); 170 SetDropdownClickHdl( LINK( this, SvxHyperlinkDlg, DropdownClick ) ); 171 172 SetItemBits( BTN_TARGET, GetItemBits( BTN_TARGET ) | TIB_DROPDOWNONLY ); 173 SetItemBits( BTN_INET_SEARCH, GetItemBits( BTN_INET_SEARCH ) | TIB_DROPDOWN ); 174 SetItemBits( BTN_INET_SEARCH, GetItemBits( BTN_TARGET ) | TIB_DROPDOWNONLY ); 175 176 aLinkPopup.SetSelectHdl(LINK(this, SvxHyperlinkDlg, LinkPopupSelectHdl)); 177 178 Link aLk = LINK(this, SvxHyperlinkDlg, ComboSelectHdl); 179 aNameCB.SetSelectHdl(aLk); 180 aUrlCB.SetSelectHdl(aLk); 181 182 aLk = LINK(this, SvxHyperlinkDlg, ComboModifyHdl); 183 aNameCB.SetModifyHdl(aLk); 184 aUrlCB.SetModifyHdl(aLk); 185 186 // Accessibility: Set the quick help text as accessible name for the 187 // drop down lists. 188 aNameCB.SetAccessibleName (aNameCB.GetQuickHelpText()); 189 aUrlCB.SetAccessibleName (aUrlCB.GetQuickHelpText()); 190 191 // Hide button according to config item. 192 SvtCommandOptions aCmdOpts; 193 if ( aCmdOpts.Lookup( SvtCommandOptions::CMDOPTION_DISABLED, 194 rtl::OUString( 195 RTL_CONSTASCII_USTRINGPARAM( 196 "InternetSearch" ) ) ) ) 197 HideItem( BTN_INET_SEARCH ); 198 } 199 200 /*-------------------------------------------------------------------- 201 Beschreibung: 202 --------------------------------------------------------------------*/ 203 204 SvxHyperlinkDlg::~SvxHyperlinkDlg() 205 { 206 SfxImageManager::GetImageManager( 0 )->ReleaseToolBox(this); 207 208 if (pTargetMenu != NULL) 209 delete pTargetMenu; 210 } 211 212 /*-------------------------------------------------------------------- 213 Beschreibung: Leiste so resizen, dass die Comboboxen automatisch mit 214 verkleinert werden 215 --------------------------------------------------------------------*/ 216 217 void SvxHyperlinkDlg::Resize() 218 { 219 long nWidth = GetSizePixel().Width(); 220 221 ToolBox::Resize(); 222 223 if (nWidth) // nWidth ist manchmal 0 224 { 225 long nDeltaW = nMaxWidth - nWidth + aUrlCB.LogicToPixel(Size(3, 1)).Width() + 1; 226 227 long nNewUrlWidth = aUrlCB.CalcResizeWidth(nDeltaW); 228 long nNewNameWidth = aNameCB.CalcResizeWidth(nDeltaW); 229 230 if (nNewUrlWidth && nNewNameWidth) // Flackern reduzieren 231 { 232 SetUpdateMode(sal_False); 233 234 // Comboboxen resizen 235 aUrlCB.DoResize(nNewUrlWidth); 236 aNameCB.DoResize(nNewNameWidth); 237 RecalcItems(); // Alle Elemente neu anordnen 238 239 SetUpdateMode(sal_True); 240 } 241 } 242 } 243 244 /*-------------------------------------------------------------------- 245 Beschreibung: 246 --------------------------------------------------------------------*/ 247 248 void SvxHyperlinkDlg::Resizing(Size& rSize) 249 { 250 if (rSize.Height() > nMaxHeight) 251 rSize.Height() = nMaxHeight; 252 253 if (rSize.Width() > nMaxWidth) 254 rSize.Width() = nMaxWidth; 255 256 ToolBox::Resizing(rSize); 257 } 258 259 /*-------------------------------------------------------------------- 260 Beschreibung: Im Dokument selektierten Hyperlink in Leiste anzeigen 261 --------------------------------------------------------------------*/ 262 263 void SvxHyperlinkDlg::StateChanged( sal_uInt16 nSID, SfxItemState eState, 264 const SfxPoolItem* pState ) 265 { 266 if ( nSID == SID_HYPERLINK_DIALOG ) 267 { 268 if( eState != SFX_ITEM_DISABLED) 269 { 270 EnableItem( BTN_OPENDIALOG, sal_True ); 271 272 sal_Bool bItem = sal_False; 273 if ( pState && eState == SFX_ITEM_AVAILABLE ) 274 bItem = ((SfxBoolItem*)pState)->GetValue(); 275 SetItemState ( BTN_OPENDIALOG, bItem ? STATE_CHECK : STATE_NOCHECK ); 276 } 277 else 278 { 279 SetItemState ( BTN_OPENDIALOG, STATE_NOCHECK ); 280 EnableItem( BTN_OPENDIALOG, sal_False ); 281 } 282 } 283 284 if (nSID == SID_HYPERLINK_SETLINK) 285 { 286 if (eState == SFX_ITEM_DISABLED) 287 bNoDoc = sal_True; 288 else 289 bNoDoc = sal_False; 290 EnableItem(BTN_TARGET, !bNoDoc); 291 EnableLink(); 292 } 293 294 if (nSID == SID_HYPERLINK_GETLINK) 295 { 296 if (eState == SFX_ITEM_AVAILABLE) 297 { 298 const SvxHyperlinkItem& rHLnkItem = *((const SvxHyperlinkItem*)pState); 299 300 sal_uInt16 nNamePos = aNameCB.GetEntryPos(aNameCB.GetText()); 301 sal_uInt16 nUrlPos = aUrlCB.GetEntryPos(aUrlCB.GetText()); 302 sal_uInt16 nNotFound = COMBOBOX_ENTRY_NOTFOUND; 303 304 if (!bHasOldName && 305 (nNamePos == nNotFound || nUrlPos == nNotFound)) 306 { 307 sOldName = aNameCB.GetText(); 308 bHasOldName = sal_True; 309 } 310 if (rHLnkItem.GetName().Len()) 311 { 312 aNameCB.SetText(rHLnkItem.GetName()); 313 ComboModifyHdl(&aNameCB); 314 } 315 if (rHLnkItem.GetURL().Len() || rHLnkItem.GetName().Len()) 316 { 317 String sUrl = INetURLObject(rHLnkItem.GetURL()).GetURLNoPass(); 318 aUrlCB.SetText(sUrl); 319 } 320 else if (aUrlCB.GetEntryCount()) 321 { // Letzten Eintrag wieder selektieren 322 aNameCB.SetText(aNameCB.GetEntry(0)); 323 aUrlCB.SetText(aUrlCB.GetEntry(0)); 324 } 325 326 TargetMenu(rHLnkItem.GetTargetFrame(), sal_False); 327 bHtmlMode = (rHLnkItem.GetInsertMode() & HLINK_HTMLMODE) != 0; 328 } 329 else 330 return; 331 332 ComboModifyHdl(&aUrlCB); 333 } 334 } 335 336 /*-------------------------------------------------------------------- 337 Beschreibung: 338 --------------------------------------------------------------------*/ 339 340 IMPL_LINK( SvxHyperlinkDlg, TBClickHdl, ToolBox *, pBox ) 341 { 342 switch (pBox->GetCurItemId()) 343 { 344 case BTN_LINK: 345 { 346 SendToApp(HLINK_DEFAULT); 347 } 348 break; 349 350 case BTN_OPENDIALOG: 351 { 352 GetBindings().GetDispatcher()->Execute( SID_HYPERLINK_DIALOG ); 353 } 354 break; 355 } 356 357 return sal_True; 358 } 359 360 /*-------------------------------------------------------------------- 361 Beschreibung: 362 --------------------------------------------------------------------*/ 363 364 IMPL_LINK( SvxHyperlinkDlg, TBSelectHdl, ToolBox *, pBox ) 365 { 366 switch (pBox->GetCurItemId()) 367 { 368 // Link als Bookmark im Explorer eintragen 369 // Soll erst im Loslassen der Maus gerufen werden, daher im Select-Hdl 370 case BTN_INSERT_BOOKMARK: 371 { 372 String sName = aNameCB.GetText(); 373 if ( !sName.Len() ) 374 sName = aUrlCB.GetText(); 375 376 String aBase = GetBindings().GetDispatcher()->GetFrame()->GetObjectShell()->GetMedium()->GetBaseURL(); 377 SfxStringItem aName( SID_BOOKMARK_TITLE, sName ); 378 SfxStringItem aURL( SID_BOOKMARK_URL, 379 URIHelper::SmartRel2Abs( INetURLObject(aBase), aUrlCB.GetText(), URIHelper::GetMaybeFileHdl(), true, false, 380 INetURLObject::WAS_ENCODED, 381 INetURLObject::DECODE_UNAMBIGUOUS ) ); 382 GetBindings().GetDispatcher()->Execute( 383 SID_CREATELINK, SFX_CALLMODE_ASYNCHRON, &aName, &aURL, 0L ); 384 } 385 break; 386 } 387 388 return sal_True; 389 } 390 391 IMPL_LINK( SvxHyperlinkDlg, DropdownClick, ToolBox *, pBox ) 392 { 393 switch (pBox->GetCurItemId()) 394 { 395 case BTN_LINK: 396 { 397 // Link-Popup anstossen 398 EndSelection(); // Vor dem Execute, damit Popup den Focus bekommt 399 aLinkPopup.EnableItem(MN_BUTTON, !bHtmlMode); 400 aLinkPopup.Execute( this, GetItemRect( BTN_LINK ), FLOATWIN_POPUPMODE_DOWN ); 401 } 402 break; 403 404 case BTN_INET_SEARCH: 405 { 406 // Search-Engines per Popup auswaehlen 407 PopupMenu *pMenu = new PopupMenu; 408 pMenu->SetSelectHdl(LINK(this, SvxHyperlinkDlg, SearchPopupSelectHdl)); 409 SearchDefaultConfigItem_Impl aDefaultEngine; 410 String sDefault(aDefaultEngine.GetDefaultSearchEngine()); 411 sDefault.ToLowerAscii(); 412 const bool bHasDefault = sDefault.Len() > 0; 413 414 sal_uInt16 nCount = aSearchConfig.Count(); 415 String sFound; 416 for (sal_uInt16 i = 0; i < nCount; i++) 417 { 418 const SvxSearchEngineData& rData = aSearchConfig.GetData(i); 419 //check if it's the configured default search engine 420 String sTest(rData.sEngineName); 421 sTest.ToLowerAscii(); 422 bool bIsDefaultEngine = bHasDefault && STRING_NOTFOUND != sTest.Search( sDefault ); 423 //then put it at the top 424 if(i && bIsDefaultEngine) 425 { 426 pMenu->InsertItem( i + 1, rData.sEngineName, 0, 0); 427 pMenu->InsertSeparator(1); 428 } 429 else 430 { 431 if (i) 432 pMenu->InsertSeparator(); 433 pMenu->InsertItem( i + 1, rData.sEngineName); 434 } 435 } 436 pBox->SetItemDown(BTN_INET_SEARCH, sal_True, sal_True); 437 pMenu->Execute( this, GetItemRect( BTN_INET_SEARCH ), FLOATWIN_POPUPMODE_DOWN ); 438 pBox->SetItemDown(BTN_INET_SEARCH, sal_False, sal_True); 439 EndSelection(); 440 delete pMenu; 441 } 442 break; 443 444 case BTN_TARGET: 445 { 446 // Target Frame einstellen 447 TargetMenu(GetSelTarget(), sal_True); 448 EndSelection(); 449 } 450 break; 451 } 452 453 return sal_True; 454 } 455 456 /*-------------------------------------------------------------------- 457 Beschreibung: 458 --------------------------------------------------------------------*/ 459 460 void SvxHyperlinkDlg::TargetMenu(const String& rSelEntry, sal_Bool bExecute) 461 { 462 if (pTargetMenu && !bExecute) 463 { 464 for (sal_uInt16 i = 1; i <= pTargetMenu->GetItemCount(); i++) 465 { 466 if (pTargetMenu->GetItemText(i) == rSelEntry) 467 { 468 pTargetMenu->CheckItem(i); 469 return; 470 } 471 } 472 } 473 474 SfxViewFrame* pVwFrm = SfxViewFrame::Current(); 475 476 if (pVwFrm) // Alle moeglichen Target Frames zusammensammeln und anzeigen 477 { 478 TargetList aList; 479 pVwFrm->GetTopFrame().GetTargetList(aList); 480 481 sal_uInt16 nCount = (sal_uInt16)aList.Count(); 482 if( nCount ) 483 { 484 sal_Bool bChecked = sal_False; 485 486 if (pTargetMenu != NULL) 487 delete pTargetMenu; 488 489 pTargetMenu = new PopupMenu; 490 pTargetMenu->SetMenuFlags( pTargetMenu->GetMenuFlags() | 491 MENU_FLAG_NOAUTOMNEMONICS ); 492 sal_uInt16 i; 493 for ( i = 0; i < nCount; i++ ) 494 { 495 String sEntry(*aList.GetObject(i)); 496 pTargetMenu->InsertItem(i + 1, sEntry, MIB_RADIOCHECK|MIB_AUTOCHECK); 497 498 if (sEntry == rSelEntry) 499 { 500 pTargetMenu->CheckItem(i + 1); 501 bChecked = sal_True; 502 } 503 } 504 for ( i = nCount; i; i-- ) 505 delete aList.GetObject( i - 1 ); 506 507 if (!bChecked) 508 pTargetMenu->CheckItem(1); 509 510 if (bExecute) 511 { 512 sal_uInt16 nEntry = pTargetMenu->Execute( 513 this, GetItemRect( BTN_TARGET ), FLOATWIN_POPUPMODE_DOWN ); 514 if ( nEntry ) 515 pTargetMenu->CheckItem( nEntry ); 516 } 517 } 518 } 519 } 520 521 /*-------------------------------------------------------------------- 522 Beschreibung: 523 --------------------------------------------------------------------*/ 524 525 IMPL_LINK( SvxHyperlinkDlg, LinkPopupSelectHdl, Menu *, pMenu ) 526 { 527 switch (pMenu->GetCurItemId()) 528 { 529 case MN_FIELD: // URL als Hyperlink ins Dok einfuegen 530 SendToApp(HLINK_FIELD); 531 break; 532 case MN_BUTTON: // URL als Button ins Dok einfuegen 533 SendToApp(HLINK_BUTTON); 534 break; 535 } 536 537 return sal_True; 538 } 539 540 /*-------------------------------------------------------------------- 541 Beschreibung: 542 --------------------------------------------------------------------*/ 543 544 IMPL_LINK( SvxHyperlinkDlg, SearchPopupSelectHdl, Menu *, pMenu ) 545 { 546 const SvxSearchEngineData& rData = aSearchConfig.GetData(pMenu->GetCurItemId() - 1); 547 String sText(aNameCB.GetText()); 548 sText.EraseLeadingChars().EraseTrailingChars(); 549 550 rtl::OUString sPrefix; 551 rtl::OUString sSuffix; 552 rtl::OUString sSeparator; 553 sal_Int32 nCaseMatch; 554 sal_Unicode cToken = 0; 555 556 if (sText.Search(' ') != STRING_NOTFOUND) 557 { 558 sPrefix = rData.sExactPrefix; 559 sSuffix = rData.sExactSuffix; 560 sSeparator = rData.sExactSeparator; 561 nCaseMatch = rData.nExactCaseMatch; 562 cToken = ' '; 563 } 564 else if (sText.Search('+') != STRING_NOTFOUND) 565 { 566 sPrefix = rData.sAndPrefix; 567 sSuffix = rData.sAndSuffix; 568 sSeparator = rData.sAndSeparator; 569 nCaseMatch = rData.nAndCaseMatch; 570 cToken = '+'; 571 } 572 else if (sText.Search(',') != STRING_NOTFOUND) 573 { 574 sPrefix = rData.sOrPrefix; 575 sSuffix = rData.sOrSuffix; 576 sSeparator = rData.sOrSeparator; 577 nCaseMatch = rData.nOrCaseMatch; 578 cToken = ','; 579 } 580 else 581 { 582 sPrefix = rData.sExactPrefix; 583 sSuffix = rData.sExactSuffix; 584 nCaseMatch = rData.nExactCaseMatch; 585 cToken = 0; 586 } 587 588 String sURL = sPrefix; 589 xub_StrLen nTok; 590 591 if(1 == nCaseMatch) 592 sText.ToUpperAscii(); 593 else if(2 == nCaseMatch) 594 sText.ToLowerAscii(); 595 596 if ((nTok = sText.GetTokenCount(cToken)) > 1) 597 { 598 for (sal_uInt16 i = 0; i < nTok; i++) 599 { 600 sURL += sText.GetToken(i, cToken); 601 if(i < nTok -1) 602 sURL += (String)sSeparator; 603 } 604 sURL += (String)sSuffix; 605 } 606 else 607 { 608 sURL += sText; 609 sURL += (String)sSuffix; 610 } 611 sURL.EraseAllChars(); // remove all spaces 612 SfxViewFrame* pViewFrame = SfxViewFrame::Current(); 613 if ( pViewFrame ) 614 pViewFrame = pViewFrame->GetTopViewFrame(); 615 OpenDoc( sURL, pViewFrame ); 616 617 return sal_True; 618 } 619 620 /*-------------------------------------------------------------------- 621 Beschreibung: 622 --------------------------------------------------------------------*/ 623 624 IMPL_LINK( SvxHyperlinkDlg, BookmarkFoundHdl, String *, pUrl ) 625 { 626 if (pUrl && pUrl->Len()) 627 { 628 aUrlCB.SetText(*pUrl); 629 ComboModifyHdl(&aUrlCB); 630 } 631 632 return sal_True; 633 } 634 /*-------------------------------------------------------------------- 635 Beschreibung: Link-Button enablen/disablen 636 --------------------------------------------------------------------*/ 637 638 void SvxHyperlinkDlg::EnableLink() 639 { 640 sal_Bool bEnable = aUrlCB.GetText().Len() != 0; 641 642 EnableItem(BTN_LINK, (!bNoDoc) & bEnable); 643 } 644 645 /*-------------------------------------------------------------------- 646 Beschreibung: URL im Dokument einfuegen 647 --------------------------------------------------------------------*/ 648 649 void SvxHyperlinkDlg::SendToApp(sal_uInt16 nType) 650 { 651 static bool bAlreadyWorking(false); 652 653 if(bAlreadyWorking) 654 { 655 OSL_ENSURE(false, "SvxHyperlinkDlg::SendToApp called to potentially run recursively, please check (!)"); 656 return; 657 } 658 659 bAlreadyWorking = true; 660 sal_Bool bIsFile = sal_False; 661 String sURL( aUrlCB.GetText() ); 662 663 if ( !sURL.Len() ) 664 { 665 bAlreadyWorking = false; 666 return; 667 } 668 669 String aBase = GetBindings().GetDispatcher()->GetFrame()->GetObjectShell()->GetMedium()->GetBaseURL(); 670 INetURLObject aObj( URIHelper::SmartRel2Abs( INetURLObject(aBase), sURL, URIHelper::GetMaybeFileHdl(), true, false, 671 INetURLObject::WAS_ENCODED, 672 INetURLObject::DECODE_UNAMBIGUOUS ) ); 673 sURL = aObj.GetMainURL( INetURLObject::NO_DECODE ); 674 if ( aObj.GetProtocol() == INET_PROT_FILE ) 675 bIsFile = sal_True; 676 677 if ( bIsFile ) 678 { 679 EnterWait(); 680 SfxMedium aMedium( sURL, STREAM_STD_READ, sal_True ); 681 if ( aMedium.Exists( sal_False ) == sal_False ) 682 { 683 LeaveWait(); 684 QueryBox aBox( this, SVX_RES( RID_SVXQB_DONTEXIST ) ); 685 if ( aBox.Execute() == RET_NO ) 686 { 687 bAlreadyWorking = false; 688 return; 689 } 690 } 691 else 692 LeaveWait(); 693 } 694 695 SvxHyperlinkItem aItem( SID_HYPERLINK_SETLINK ); 696 697 if (aNameCB.GetText().Len()) 698 aItem.SetName( aNameCB.GetText() ); 699 else 700 aItem.SetName( sURL ); 701 702 sOldName = aNameCB.GetText(); 703 704 aItem.SetURL(sURL); 705 aItem.SetInsertMode( (SvxLinkInsertMode)nType ); 706 aItem.SetTargetFrame( GetSelTarget() ); 707 708 GetBindings().GetDispatcher()->Execute( 709 SID_HYPERLINK_SETLINK, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L ); 710 711 AddToHistory( aNameCB.GetText(), sURL ); 712 713 if ( sURL != aUrlCB.GetText() ) 714 aUrlCB.SetText( sURL ); 715 716 bAlreadyWorking = false; 717 } 718 719 /*-------------------------------------------------------------------- 720 Beschreibung: Selektierten Target Frame Eintrag im Popup ermitteln 721 --------------------------------------------------------------------*/ 722 723 String SvxHyperlinkDlg::GetSelTarget() 724 { 725 String sTarget; 726 727 if (pTargetMenu != NULL) 728 { 729 for (sal_uInt16 i = 1; i <= pTargetMenu->GetItemCount(); i++) 730 { 731 if (pTargetMenu->IsItemChecked(i)) 732 { 733 sTarget = pTargetMenu->GetItemText(i); 734 break; 735 } 736 } 737 } 738 739 return sTarget; 740 } 741 742 /*-------------------------------------------------------------------- 743 Beschreibung: URL in History der Leiste aufnehmen 744 --------------------------------------------------------------------*/ 745 746 void SvxHyperlinkDlg::AddToHistory(const String& rName, const String& rURL) 747 { 748 String sName(rName); 749 750 if (bHasOldName && sOldName.Len()) 751 { 752 sName = sOldName; 753 bHasOldName = sal_False; 754 } 755 756 if (!sName.Len()) 757 sName = rURL; 758 759 if (rURL.Len()) 760 { 761 sal_uInt16 nNamePos = aNameCB.GetEntryPos(sName); 762 sal_uInt16 nUrlPos = aUrlCB.GetEntryPos(rURL); 763 sal_uInt16 nPos = COMBOBOX_ENTRY_NOTFOUND; 764 765 if (nNamePos != COMBOBOX_ENTRY_NOTFOUND) 766 nPos = nNamePos; 767 else 768 nPos = nUrlPos; 769 770 // Alten Eintrag durch neuen Eintrag ersetzen 771 if (nPos != COMBOBOX_ENTRY_NOTFOUND) 772 { 773 aNameCB.RemoveEntry(nPos); 774 aUrlCB.RemoveEntry(nPos); 775 aNameCB.SetText(rName); 776 aUrlCB.SetText(rURL); 777 } 778 779 aNameCB.InsertEntry(sName, 0); 780 aUrlCB.InsertEntry(rURL, 0); 781 } 782 } 783 784 /*-------------------------------------------------------------------- 785 Beschreibung: Bookmark und Search-Button enablen/disablen 786 --------------------------------------------------------------------*/ 787 788 IMPL_LINK( SvxHyperlinkDlg, ComboSelectHdl, ComboBox *, pCombo ) 789 { 790 sal_uInt16 nPos = pCombo->GetEntryPos(pCombo->GetText()); 791 792 if (nPos != COMBOBOX_ENTRY_NOTFOUND) 793 { 794 aNameCB.SetText(aNameCB.GetEntry(nPos)); 795 aUrlCB.SetText(aUrlCB.GetEntry(nPos)); 796 797 EnableLink(); 798 EnableItem(BTN_INSERT_BOOKMARK, sal_True); 799 EnableItem(BTN_INET_SEARCH, sal_True); 800 } 801 return sal_True; 802 } 803 804 /*-------------------------------------------------------------------- 805 Beschreibung: 806 --------------------------------------------------------------------*/ 807 808 IMPL_LINK( SvxHyperlinkDlg, ComboModifyHdl, ComboBox *, pCombo ) 809 { 810 sal_Bool bEnable = sal_True; 811 812 if (!pCombo->GetText().Len()) 813 bEnable = sal_False; 814 815 if (pCombo == &aNameCB) 816 { 817 if (IsItemEnabled(BTN_INET_SEARCH) != bEnable) 818 EnableItem(BTN_INET_SEARCH, bEnable); 819 } 820 821 EnableLink(); 822 823 if (aUrlCB.GetText().Len()) 824 bEnable = sal_True; 825 else 826 bEnable = sal_False; 827 828 if (IsItemEnabled(BTN_INSERT_BOOKMARK) != bEnable) 829 EnableItem(BTN_INSERT_BOOKMARK, bEnable); 830 831 return sal_True; 832 } 833 834 // -------------------------------------------------------------------- 835 836 void SvxHyperlinkDlg::DataChanged( const DataChangedEvent& rDCEvt ) 837 { 838 ToolBox::DataChanged( rDCEvt ); 839 840 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE)) 841 SetImages(); 842 } 843 844 // -------------------------------------------------------------------- 845 846 void SvxHyperlinkDlg::SetImages() 847 { 848 bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); 849 850 SetItemImage( BTN_LINK, mpManager->GetImage( BTN_LINK, bHighContrast ) ); 851 SetItemImage( BTN_INSERT_BOOKMARK, mpManager->GetImage( BTN_INSERT_BOOKMARK, bHighContrast ) ); 852 SetItemImage( BTN_INET_SEARCH, mpManager->GetImage( BTN_INET_SEARCH, bHighContrast ) ); 853 SetItemImage( BTN_TARGET, mpManager->GetImage( BTN_TARGET, bHighContrast ) ); 854 SetItemImage( BTN_OPENDIALOG, mpManager->GetImage( BTN_OPENDIALOG, bHighContrast ) ); 855 } 856 857 /*-------------------------------------------------------------------- 858 Beschreibung: Comboboxen 859 --------------------------------------------------------------------*/ 860 861 HyperCombo::HyperCombo( SvxHyperlinkDlg* pDialog, const ResId& rResId ) : 862 ComboBox( (Window *)pDialog, rResId ) 863 { 864 pDlg = pDialog; 865 866 nMaxWidth = GetSizePixel().Width(); 867 if (this == &pDlg->aUrlCB) 868 nMinWidth = GetTextWidth(String::CreateFromAscii("http://www.stardiv.dewww")); 869 else 870 nMinWidth = GetTextWidth(String::CreateFromAscii("StarDivision GmbHwww")); 871 } 872 873 /*-------------------------------------------------------------------- 874 Beschreibung: Comboboxen KeyInput 875 --------------------------------------------------------------------*/ 876 877 long HyperCombo::Notify( NotifyEvent& rNEvt ) 878 { 879 long nHandled = 0; 880 static sal_Bool bLocked = sal_False; 881 882 if (bLocked) // Keine weiteren RETURNs annehmen (nicht Reentrant!) 883 return nHandled; 884 885 bLocked = sal_True; 886 887 if ( rNEvt.GetType() == EVENT_KEYINPUT ) 888 { 889 const KeyEvent* pKEvt = rNEvt.GetKeyEvent(); 890 const KeyCode aKeyCode = pKEvt->GetKeyCode(); 891 892 if (aKeyCode.GetCode() == KEY_RETURN) 893 { 894 pDlg->SendToApp(HLINK_DEFAULT); 895 nHandled = 1; 896 } 897 } 898 if (this == &pDlg->aNameCB) 899 pDlg->sOldName = GetText(); 900 901 if (!nHandled) 902 nHandled = ComboBox::Notify( rNEvt ); 903 904 bLocked = sal_False; 905 906 return nHandled; 907 } 908 909 /*-------------------------------------------------------------------- 910 Beschreibung: Drag&Drop vor dem Combo-Edit abfangen und weiterleiten 911 --------------------------------------------------------------------*/ 912 913 long HyperCombo::PreNotify( NotifyEvent& rNEvt ) 914 { 915 long nHandled = 0; 916 917 nHandled = ComboBox::PreNotify( rNEvt ); 918 919 return nHandled; 920 } 921 922 /*-------------------------------------------------------------------- 923 Beschreibung: 924 --------------------------------------------------------------------*/ 925 926 long HyperCombo::CalcResizeWidth( long nW ) 927 { 928 long nNewWidth = Max(nMaxWidth - nW * GetRatio() / 100L, nMinWidth); 929 930 if (nNewWidth > nMaxWidth) 931 nNewWidth = nMaxWidth; 932 933 if (nNewWidth != GetSizePixel().Width()) 934 return nNewWidth; 935 else 936 return 0; // Kein Resize notwendig 937 } 938 939 /*-------------------------------------------------------------------- 940 Beschreibung: 941 --------------------------------------------------------------------*/ 942 943 void HyperCombo::DoResize( long nNewWidth ) 944 { 945 SetSizePixel(Size(nNewWidth, GetSizePixel().Height())); 946 } 947 948 /*-------------------------------------------------------------------- 949 Beschreibung: FixedText 950 --------------------------------------------------------------------*/ 951 952 HyperFixedText::HyperFixedText( SvxHyperlinkDlg* pDialog, const ResId& rResId ) : 953 FixedInfo( (Window *)pDialog, rResId ) 954 { 955 pDlg = pDialog; 956 } 957 958 /*-------------------------------------------------------------------- 959 Beschreibung: Webseite der Search-Engine mit Suchergebnissen anzeigen 960 --------------------------------------------------------------------*/ 961 void SvxHyperlinkDlg::OpenDoc( const String& rURL, SfxViewFrame* pViewFrame ) 962 { 963 SfxStringItem aName( SID_FILE_NAME, rURL ); 964 SfxStringItem aReferer( SID_REFERER, String::CreateFromAscii("private:user") ); 965 SfxBoolItem aNewView( SID_OPEN_NEW_VIEW, sal_True ); 966 SfxBoolItem aSilent( SID_SILENT, sal_True ); 967 SfxBoolItem aReadOnly( SID_DOC_READONLY, sal_True ); 968 SfxBoolItem aExternal( SID_BROWSE, sal_True ); 969 SfxDispatcher* pDisp = SfxViewFrame::Current() ? SfxViewFrame::Current()->GetDispatcher() : NULL; 970 971 if ( pViewFrame ) 972 { 973 SfxFrameItem aView( SID_DOCFRAME, pViewFrame ? &pViewFrame->GetFrame() : NULL ); 974 if ( pDisp ) 975 pDisp->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, 976 &aName, &aView, &aNewView, &aSilent, &aReadOnly, &aReferer, &aExternal, 0L ); 977 } 978 else if ( pDisp ) 979 pDisp->Execute( SID_OPENDOC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, 980 &aName, &aNewView, &aSilent, &aReadOnly, &aReferer, 0L ); 981 } 982 // class SvxHyperlinkDialogWrapper ------------------------------------------ 983 984 SFX_IMPL_CHILDWINDOW(SvxHyperlinkDlgWrapper, SID_HYPERLINK_INSERT) 985 986 /*-------------------------------------------------------------------- 987 Beschreibung: Wrapper fuer Hyperlinkleiste 988 --------------------------------------------------------------------*/ 989 990 SvxHyperlinkDlgWrapper::SvxHyperlinkDlgWrapper( Window* _pParent, sal_uInt16 nId, 991 SfxBindings* _pBindings, SfxChildWinInfo* /*pInfo*/ ) : 992 993 SfxChildWindow( _pParent, nId ) 994 995 { 996 pWindow = new SvxHyperlinkDlg( _pBindings, _pParent ); 997 eChildAlignment = SFX_ALIGN_TOP; 998 } 999 1000 /*-------------------------------------------------------------------- 1001 Beschreibung: 1002 --------------------------------------------------------------------*/ 1003 1004 SfxChildWinInfo SvxHyperlinkDlgWrapper::GetInfo() const 1005 { 1006 SfxChildWinInfo aInfo = SfxChildWindow::GetInfo(); 1007 return aInfo; 1008 } 1009 1010