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
GetDefaultSearchEngine()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 -----------------------------------------------------------------------*/
SearchDefaultConfigItem_Impl()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 -----------------------------------------------------------------------*/
~SearchDefaultConfigItem_Impl()80 SearchDefaultConfigItem_Impl::~SearchDefaultConfigItem_Impl()
81 {
82 }
83
Notify(const com::sun::star::uno::Sequence<rtl::OUString> &)84 void SearchDefaultConfigItem_Impl::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& )
85 {
86 }
87
Commit()88 void SearchDefaultConfigItem_Impl::Commit()
89 {
90 }
91
92 /*************************************************************************
93 |*
94 |* Dialog zum Einf"ugen/"Andern eines Hyperlink
95 |*
96 \************************************************************************/
97
SvxHyperlinkDlg(SfxBindings * _pBindings,Window * pParent)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
~SvxHyperlinkDlg()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
Resize()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
Resizing(Size & rSize)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
StateChanged(sal_uInt16 nSID,SfxItemState eState,const SfxPoolItem * pState)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
IMPL_LINK(SvxHyperlinkDlg,TBClickHdl,ToolBox *,pBox)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
IMPL_LINK(SvxHyperlinkDlg,TBSelectHdl,ToolBox *,pBox)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
IMPL_LINK(SvxHyperlinkDlg,DropdownClick,ToolBox *,pBox)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
TargetMenu(const String & rSelEntry,sal_Bool bExecute)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
IMPL_LINK(SvxHyperlinkDlg,LinkPopupSelectHdl,Menu *,pMenu)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
IMPL_LINK(SvxHyperlinkDlg,SearchPopupSelectHdl,Menu *,pMenu)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
IMPL_LINK(SvxHyperlinkDlg,BookmarkFoundHdl,String *,pUrl)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
EnableLink()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
SendToApp(sal_uInt16 nType)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
GetSelTarget()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
AddToHistory(const String & rName,const String & rURL)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
IMPL_LINK(SvxHyperlinkDlg,ComboSelectHdl,ComboBox *,pCombo)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
IMPL_LINK(SvxHyperlinkDlg,ComboModifyHdl,ComboBox *,pCombo)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
DataChanged(const DataChangedEvent & rDCEvt)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
SetImages()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
HyperCombo(SvxHyperlinkDlg * pDialog,const ResId & rResId)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
Notify(NotifyEvent & rNEvt)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
PreNotify(NotifyEvent & rNEvt)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
CalcResizeWidth(long nW)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
DoResize(long nNewWidth)943 void HyperCombo::DoResize( long nNewWidth )
944 {
945 SetSizePixel(Size(nNewWidth, GetSizePixel().Height()));
946 }
947
948 /*--------------------------------------------------------------------
949 Beschreibung: FixedText
950 --------------------------------------------------------------------*/
951
HyperFixedText(SvxHyperlinkDlg * pDialog,const ResId & rResId)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 --------------------------------------------------------------------*/
OpenDoc(const String & rURL,SfxViewFrame * pViewFrame)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
SFX_IMPL_CHILDWINDOW(SvxHyperlinkDlgWrapper,SID_HYPERLINK_INSERT)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
GetInfo() const1004 SfxChildWinInfo SvxHyperlinkDlgWrapper::GetInfo() const
1005 {
1006 SfxChildWinInfo aInfo = SfxChildWindow::GetInfo();
1007 return aInfo;
1008 }
1009
1010