xref: /trunk/main/cui/source/dialogs/hltpbase.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_cui.hxx"
30 
31 #include <sfx2/frame.hxx>
32 #include <sfx2/viewfrm.hxx>
33 #include <sot/formats.hxx>
34 #include <sfx2/sfxsids.hrc>
35 #include <svl/macitem.hxx>
36 #include <ucbhelper/content.hxx>
37 #include <unotools/localfilehelper.hxx>
38 #include "hyperdlg.hrc"
39 #include "cuihyperdlg.hxx"  //CHINA001
40 #include "hltpbase.hxx"
41 #include "macroass.hxx"
42 #include <svx/svxdlg.hxx> //CHINA001
43 #include <cuires.hrc> //CHINA001
44 
45 using namespace ::ucbhelper;
46 
47 //########################################################################
48 //#                                                                      #
49 //# ComboBox-Control, wich is filled with all current framenames         #
50 //#                                                                      #
51 //########################################################################
52 
53 /*************************************************************************
54 |*
55 |* Contructor / Destructor
56 |*
57 |************************************************************************/
58 
59 SvxFramesComboBox::SvxFramesComboBox ( Window* pParent, const ResId& rResId,
60                                         SfxDispatcher* pDispatch )
61 :   ComboBox (pParent, rResId)
62 {
63     TargetList* pList = new TargetList;
64     SfxViewFrame* pViewFrame = pDispatch ? pDispatch->GetFrame() : 0;
65     SfxFrame* pFrame = pViewFrame ? &pViewFrame->GetTopFrame() : 0;
66     if ( pFrame )
67     {
68         pFrame->GetTargetList(*pList);
69         sal_uInt16 nCount = (sal_uInt16)pList->Count();
70         if( nCount )
71         {
72             sal_uInt16 i;
73             for ( i = 0; i < nCount; i++ )
74             {
75                 InsertEntry(*pList->GetObject(i));
76             }
77             for ( i = nCount; i; i-- )
78             {
79                 delete pList->GetObject( i - 1 );
80             }
81         }
82         delete pList;
83     }
84 }
85 
86 SvxFramesComboBox::~SvxFramesComboBox ()
87 {
88 }
89 //########################################################################
90 //#                                                                      #
91 //# ComboBox-Control for URL's with History and Autocompletion           #
92 //#                                                                      #
93 //########################################################################
94 
95 /*************************************************************************
96 |*
97 |* Contructor / Destructor
98 |*
99 |************************************************************************/
100 
101 SvxHyperURLBox::SvxHyperURLBox( Window* pParent, INetProtocol eSmart, sal_Bool bAddresses )
102 : SvtURLBox         ( pParent, eSmart ),
103   DropTargetHelper  ( this ),
104   mbAccessAddress   (bAddresses)
105 {
106 }
107 
108 sal_Int8 SvxHyperURLBox::AcceptDrop( const AcceptDropEvent& /* rEvt */ )
109 {
110     return( IsDropFormatSupported( FORMAT_STRING ) ? DND_ACTION_COPY : DND_ACTION_NONE );
111 }
112 
113 sal_Int8 SvxHyperURLBox::ExecuteDrop( const ExecuteDropEvent& rEvt )
114 {
115     TransferableDataHelper  aDataHelper( rEvt.maDropEvent.Transferable );
116     String                  aString;
117     sal_Int8                nRet = DND_ACTION_NONE;
118 
119     if( aDataHelper.GetString( FORMAT_STRING, aString ) )
120     {
121         SetText( aString );
122         nRet = DND_ACTION_COPY;
123     }
124 
125     return nRet;
126 }
127 
128 /*
129 Diese Methode parsed eine EMailadresse aus einem D&D-DataObjekt aus der Adre�datenbank heraus
130 
131 #ifndef _OFF_OFADBMGR_HXX
132 #include <offmgr/ofadbmgr.hxx>
133 #endif
134 #ifndef _SFX_APP_HXX
135 #include <offmgr/app.hxx>
136 #endif
137 #ifndef _SDB_SDBCURS_HXX
138 #include <sdb/sdbcurs.hxx>
139 #endif
140 
141 #define DB_DD_DELIM         ((char)11)
142 
143 String SvxHyperURLBox::GetAllEmailNamesFromDragItem( sal_uInt16 nItem )
144 {
145 #if !defined( ICC ) && !defined( SOLARIS )
146     String aAddress;
147 
148     if (  DragServer::HasFormat( nItem, SOT_FORMATSTR_ID_SBA_DATAEXCHANGE ) )
149     {
150         sal_uLong nLen = DragServer::GetDataLen( nItem, SOT_FORMATSTR_ID_SBA_DATAEXCHANGE ) - 1;
151         sal_uInt16 i = 0;
152         String aTxt;
153         char *pTxt = aTxt.AllocStrBuf( (sal_uInt16)nLen );
154         DragServer::PasteData( nItem, pTxt, nLen, SOT_FORMATSTR_ID_SBA_DATAEXCHANGE );
155         String aDBName = aTxt.GetToken( i++, DB_DD_DELIM );
156         String aTableName = aTxt.GetToken( i++, DB_DD_DELIM );
157         i++;    // Format"anderung
158         String aStatement = aTxt.GetToken( i++, DB_DD_DELIM );
159         if ( !aStatement )
160         {
161             aDBName += DB_DELIM;
162             aDBName += aTableName;
163         }
164         else
165         {
166             // use here another delimiter, because the OfaDBMgr uses two
167             // delimiters ( (char)11 and ; )
168             aDBName += ';';
169             aDBName += aStatement;
170         }
171         SbaSelectionListRef pSelectionList;
172         pSelectionList.Clear();
173         pSelectionList = new SbaSelectionList;
174         sal_uInt16 nTokCnt = aTxt.GetTokenCount( DB_DD_DELIM );
175 
176         for ( ; i < nTokCnt; ++i )
177             pSelectionList->Insert(
178                 (void*)(sal_uInt16)aTxt.GetToken( i, DB_DD_DELIM ), LIST_APPEND );
179 
180         OfaDBMgr* pDBMgr = SFX_APP()->GetOfaDBMgr();
181         sal_Bool bBasic = DBMGR_STD;
182 
183         if ( !pDBMgr->OpenDB( bBasic, aDBName ) )
184             return aAddress;
185 
186         OfaDBParam& rParam = pDBMgr->GetDBData( bBasic );
187         pDBMgr->ChangeStatement( bBasic, aStatement );
188         rParam.pSelectionList->Clear();
189 
190         if ( pSelectionList.Is() &&
191                 (long)pSelectionList->GetObject(0) != -1L )
192             *rParam.pSelectionList = *pSelectionList;
193 
194         if ( !pDBMgr->ToFirstSelectedRecord( bBasic ) )
195         {
196             pDBMgr->CloseAll();
197             return aAddress;
198         }
199 
200         if ( pDBMgr->IsSuccessful( bBasic ) )
201         {
202             //  Spaltenk"opfe
203             SbaDBDataDefRef aDBDef = pDBMgr->OpenColumnNames( bBasic );
204 
205             if ( aDBDef.Is() )
206             {
207                 SbaColumn* pCol = aDBDef->GetColumn("EMAIL");
208                 sal_uLong nPos = 0;
209 
210                 if ( pCol )
211                     nPos = aDBDef->GetOriginalColumns().GetPos( pCol ) + 1;
212                 for ( i = 0 ; nPos && i < pSelectionList->Count(); ++i )
213                 {
214                     sal_uLong nIndex = (sal_uLong)pSelectionList->GetObject(i);
215 
216                     // N"achsten zu lesenden Datensatz ansteuern
217 
218                     sal_Bool bEnd = rParam.GetCursor()->IsOffRange();
219 
220                     if ( !bEnd )
221                     {
222                         const ODbRowRef aRow =
223                             pDBMgr->GetSelectedRecord( bBasic, i );
224 
225                         if ( aRow.Is() )
226                         {
227                             aAddress += pDBMgr->
228                                 ImportDBField( (sal_uInt16)nPos, &aDBDef, aRow.getBodyPtr() );
229                             aAddress += ',';
230                         }
231                         else
232                         {
233                             aAddress.Erase();
234                             break;
235                         }
236                     }
237                     else
238                         break;
239                 }
240             }
241         }
242         pDBMgr->CloseAll();
243     }
244     aAddress.EraseTrailingChars( ',' );
245     return aAddress;
246 #else
247     return String();
248 #endif
249 }
250 */
251 
252 void SvxHyperURLBox::Select()
253 {
254     SvtURLBox::Select();
255 }
256 void SvxHyperURLBox::Modify()
257 {
258     SvtURLBox::Modify();
259 }
260 long SvxHyperURLBox::Notify( NotifyEvent& rNEvt )
261 {
262     return SvtURLBox::Notify( rNEvt );
263 }
264 long SvxHyperURLBox::PreNotify( NotifyEvent& rNEvt )
265 {
266     return SvtURLBox::PreNotify( rNEvt );
267 }
268 
269 //########################################################################
270 //#                                                                      #
271 //# Hyperlink-Dialog: Tabpages-Baseclass                                 #
272 //#                                                                      #
273 //########################################################################
274 
275 /*************************************************************************
276 |*
277 |* Con/Destructor, Initialize
278 |*
279 \************************************************************************/
280 
281 SvxHyperlinkTabPageBase::SvxHyperlinkTabPageBase ( Window *pParent,
282                                                    const ResId &rResId,
283                                                    const SfxItemSet& rItemSet )
284 :   IconChoicePage          ( pParent, rResId, rItemSet ),
285     mpGrpMore               ( NULL ),
286     mpFtFrame               ( NULL ),
287     mpCbbFrame              ( NULL ),
288     mpFtForm                ( NULL ),
289     mpLbForm                ( NULL ),
290     mpFtIndication          ( NULL ),
291     mpEdIndication          ( NULL ),
292     mpFtText                ( NULL ),
293     mpEdText                ( NULL ),
294     mpBtScript              ( NULL ),
295     mbIsCloseDisabled       ( sal_False ),
296     mpDialog                ( pParent ),
297     mbStdControlsInit       ( sal_False ),
298     aEmptyStr()
299 {
300     // create bookmark-window
301     mpMarkWnd = new SvxHlinkDlgMarkWnd ( this );
302 }
303 
304 SvxHyperlinkTabPageBase::~SvxHyperlinkTabPageBase ()
305 {
306     maTimer.Stop();
307 
308     if ( mbStdControlsInit )
309     {
310         delete mpGrpMore;
311         delete mpFtFrame;
312         delete mpCbbFrame;
313         delete mpFtForm;
314         delete mpLbForm;
315         delete mpFtIndication;
316         delete mpEdIndication;
317         delete mpFtText;
318         delete mpEdText ;
319         delete mpBtScript;
320     }
321 
322     delete mpMarkWnd;
323 }
324 
325 void SvxHyperlinkTabPageBase::ActivatePage()
326 {
327     TabPage::ActivatePage();
328 }
329 
330 void SvxHyperlinkTabPageBase::DeactivatePage()
331 {
332     TabPage::DeactivatePage();
333 }
334 
335 sal_Bool SvxHyperlinkTabPageBase::QueryClose()
336 {
337     return !mbIsCloseDisabled;
338 }
339 
340 void SvxHyperlinkTabPageBase::InitStdControls ()
341 {
342     if ( !mbStdControlsInit )
343     {
344         mpGrpMore     = new FixedLine           ( this, ResId (GRP_MORE, *m_pResMgr) );
345         mpFtFrame     = new FixedText           ( this, ResId (FT_FRAME, *m_pResMgr) );
346         mpCbbFrame    = new SvxFramesComboBox   ( this, ResId (CB_FRAME, *m_pResMgr), GetDispatcher() );
347         mpFtForm      = new FixedText           ( this, ResId (FT_FORM, *m_pResMgr) );
348         mpLbForm      = new ListBox             ( this, ResId (LB_FORM, *m_pResMgr) );
349         mpFtIndication= new FixedText           ( this, ResId (FT_INDICATION, *m_pResMgr) );
350         mpEdIndication= new Edit                ( this, ResId (ED_INDICATION, *m_pResMgr) );
351         mpFtText      = new FixedText           ( this, ResId (FT_TEXT, *m_pResMgr) );
352         mpEdText      = new Edit                ( this, ResId (ED_TEXT, *m_pResMgr) );
353         mpBtScript    = new ImageButton         ( this, ResId (BTN_SCRIPT, *m_pResMgr) );
354 
355         mpBtScript->SetClickHdl ( LINK ( this, SvxHyperlinkTabPageBase, ClickScriptHdl_Impl ) );
356 
357         mpBtScript->SetModeImage( Image( ResId( IMG_SCRIPT_HC, *m_pResMgr ) ), BMP_COLOR_HIGHCONTRAST );
358         mpBtScript->EnableTextDisplay (sal_False);
359 
360         mpBtScript->SetAccessibleRelationMemberOf( mpGrpMore );
361         mpBtScript->SetAccessibleRelationLabeledBy( mpFtForm );
362     }
363 
364     mbStdControlsInit = sal_True;
365 }
366 
367 /*************************************************************************
368 |*
369 |* Move Extra-Window
370 |*
371 \************************************************************************/
372 
373 sal_Bool SvxHyperlinkTabPageBase::MoveToExtraWnd( Point aNewPos, sal_Bool bDisConnectDlg )
374 {
375     sal_Bool bReturn =  mpMarkWnd->MoveTo ( aNewPos );
376 
377     if( bDisConnectDlg )
378         mpMarkWnd->ConnectToDialog( sal_False );
379 
380     return ( !bReturn && IsMarkWndVisible() );
381 }
382 
383 /*************************************************************************
384 |*
385 |* Show Extra-Window
386 |*
387 \************************************************************************/
388 
389 void SvxHyperlinkTabPageBase::ShowMarkWnd ()
390 {
391     ( ( Window* ) mpMarkWnd )->Show();
392 
393     // Size of dialog-window in screen pixels
394     Rectangle aDlgRect( mpDialog->GetWindowExtentsRelative( NULL ) );
395     Point aDlgPos ( aDlgRect.TopLeft() );
396     Size aDlgSize ( mpDialog->GetSizePixel () );
397 
398     // Absolute size of the screen
399     Rectangle aScreen( mpDialog->GetDesktopRectPixel() );
400 
401     // Size of Extrawindow
402     Size aExtraWndSize( mpMarkWnd->GetSizePixel () );
403 
404     // mpMarkWnd is a child of mpDialog, so coordinates for positioning must be relative to mpDialog
405     if( aDlgPos.X()+(1.05*aDlgSize.Width())+aExtraWndSize.Width() > aScreen.Right() )
406     {
407         if( aDlgPos.X() - ( 0.05*aDlgSize.Width() ) - aExtraWndSize.Width() < 0 )
408         {
409             // Pos Extrawindow anywhere
410             MoveToExtraWnd( Point(10,10) );  // very unlikely
411             mpMarkWnd->ConnectToDialog( sal_False );
412         }
413         else
414         {
415             // Pos Extrawindow on the left side of Dialog
416             MoveToExtraWnd( Point(0,0) - Point( long(0.05*aDlgSize.Width()), 0 ) - Point( aExtraWndSize.Width(), 0 ) );
417         }
418     }
419     else
420     {
421         // Pos Extrawindow on the right side of Dialog
422         MoveToExtraWnd ( Point( long(1.05*aDlgSize.getWidth()), 0 ) );
423     }
424 
425     // Set size of Extra-Window
426     mpMarkWnd->SetSizePixel( Size( aExtraWndSize.Width(), aDlgSize.Height() ) );
427 }
428 
429 /*************************************************************************
430 |*
431 |* Fill Dialogfields
432 |*
433 \************************************************************************/
434 
435 void SvxHyperlinkTabPageBase::FillStandardDlgFields ( SvxHyperlinkItem* pHyperlinkItem )
436 {
437     // Frame
438     sal_uInt16 nPos = mpCbbFrame->GetEntryPos ( pHyperlinkItem->GetTargetFrame() );
439     if ( nPos != LISTBOX_ENTRY_NOTFOUND)
440         mpCbbFrame->SetText ( pHyperlinkItem->GetTargetFrame() );
441 
442     // Form
443     String aStrFormText = CUI_RESSTR( RID_SVXSTR_HYPERDLG_FROM_TEXT );
444     String aStrFormButton = CUI_RESSTR( RID_SVXSTR_HYPERDLG_FORM_BUTTON );
445 
446     if( pHyperlinkItem->GetInsertMode() & HLINK_HTMLMODE )
447     {
448         mpLbForm->Clear();
449         mpLbForm->InsertEntry( aStrFormText );
450         mpLbForm->SelectEntryPos ( 0 );
451     }
452     else
453     {
454         mpLbForm->Clear();
455         mpLbForm->InsertEntry( aStrFormText );
456         mpLbForm->InsertEntry( aStrFormButton );
457         mpLbForm->SelectEntryPos ( pHyperlinkItem->GetInsertMode() == HLINK_BUTTON ? 1 : 0 );
458     }
459 
460     // URL
461     mpEdIndication->SetText ( pHyperlinkItem->GetName() );
462 
463     // Name
464     mpEdText->SetText ( pHyperlinkItem->GetIntName() );
465 
466     // Script-button
467     if ( !pHyperlinkItem->GetMacroEvents() )
468         mpBtScript->Disable();
469     else
470         mpBtScript->Enable();
471 }
472 
473 /*************************************************************************
474 |*
475 |* Any action to do after apply-button is pressed
476 |*
477 \************************************************************************/
478 
479 void SvxHyperlinkTabPageBase::DoApply ()
480 {
481     // default-implemtation : do nothing
482 }
483 
484 /*************************************************************************
485 |*
486 |* Ask page whether an insert is possible
487 |*
488 \************************************************************************/
489 
490 sal_Bool SvxHyperlinkTabPageBase::AskApply ()
491 {
492     // default-implementation
493     return sal_True;
494 }
495 
496 /*************************************************************************
497 |*
498 |* This method would be called from bookmark-window to set new mark-string
499 |*
500 \************************************************************************/
501 
502 void SvxHyperlinkTabPageBase::SetMarkStr ( String& /*aStrMark*/ )
503 {
504     // default-implemtation : do nothing
505 }
506 
507 /*************************************************************************
508 |*
509 |* This method will be called from the dialog-class if the state off
510 |* the online-mode has changed.
511 |*
512 \************************************************************************/
513 
514 void SvxHyperlinkTabPageBase::SetOnlineMode( sal_Bool /*bEnable*/ )
515 {
516     // default-implemtation : do nothing
517 }
518 
519 /*************************************************************************
520 |*
521 |* Set initial focus
522 |*
523 |************************************************************************/
524 
525 void SvxHyperlinkTabPageBase::SetInitFocus()
526 {
527     GrabFocus();
528 }
529 
530 /*************************************************************************
531 |*
532 |* Ask dialog whether the curretn doc is a HTML-doc
533 |*
534 |************************************************************************/
535 
536 sal_Bool SvxHyperlinkTabPageBase::IsHTMLDoc() const
537 {
538     return ((SvxHpLinkDlg*)mpDialog)->IsHTMLDoc();
539 }
540 
541 /*************************************************************************
542 |*
543 |* retrieve dispatcher
544 |*
545 |************************************************************************/
546 
547 SfxDispatcher* SvxHyperlinkTabPageBase::GetDispatcher() const
548 {
549     return ((SvxHpLinkDlg*)mpDialog)->GetDispatcher();
550 }
551 
552 /*************************************************************************
553 |*
554 |* Click on imagebutton : Script
555 |*
556 |************************************************************************/
557 
558 IMPL_LINK ( SvxHyperlinkTabPageBase, ClickScriptHdl_Impl, void *, EMPTYARG )
559 {
560     SvxHyperlinkItem *pHyperlinkItem = (SvxHyperlinkItem *)
561                                        GetItemSet().GetItem (SID_HYPERLINK_GETLINK);
562 
563     if ( pHyperlinkItem->GetMacroEvents() )
564     {
565         // get macros from itemset
566         const SvxMacroTableDtor* pMacroTbl = pHyperlinkItem->GetMacroTbl();
567         SvxMacroItem aItem ( GetWhich(SID_ATTR_MACROITEM) );
568         if( pMacroTbl )
569             aItem.SetMacroTable( *pMacroTbl );
570 
571         // create empty itemset for macro-dlg
572         SfxItemSet* pItemSet = new SfxItemSet(SFX_APP()->GetPool(),
573                                               SID_ATTR_MACROITEM,
574                                               SID_ATTR_MACROITEM );
575         pItemSet->Put ( aItem, SID_ATTR_MACROITEM );
576 
577         // --> PB 2006-01-13 #123474#
578         /*  disable HyperLinkDlg for input while the MacroAssignDlg is working
579             because if no JAVA is installed an error box occurs and then it is possible
580             to close the HyperLinkDlg before its child (MacroAssignDlg) -> GPF
581          */
582         sal_Bool bIsInputEnabled = GetParent()->IsInputEnabled();
583         if ( bIsInputEnabled )
584             GetParent()->EnableInput( sal_False );
585         // <--
586         SfxMacroAssignDlg aDlg( this, mxDocumentFrame, *pItemSet );
587 
588         // add events
589         SfxMacroTabPage *pMacroPage = (SfxMacroTabPage*) aDlg.GetTabPage();
590 
591         if ( pHyperlinkItem->GetMacroEvents() & HYPERDLG_EVENT_MOUSEOVER_OBJECT )
592             pMacroPage->AddEvent( String( CUI_RESSTR(RID_SVXSTR_HYPDLG_MACROACT1) ),
593                                   SFX_EVENT_MOUSEOVER_OBJECT );
594         if ( pHyperlinkItem->GetMacroEvents() & HYPERDLG_EVENT_MOUSECLICK_OBJECT )
595             pMacroPage->AddEvent( String( CUI_RESSTR(RID_SVXSTR_HYPDLG_MACROACT2) ),
596                                   SFX_EVENT_MOUSECLICK_OBJECT);
597         if ( pHyperlinkItem->GetMacroEvents() & HYPERDLG_EVENT_MOUSEOUT_OBJECT )
598             pMacroPage->AddEvent( String( CUI_RESSTR(RID_SVXSTR_HYPDLG_MACROACT3) ),
599                                   SFX_EVENT_MOUSEOUT_OBJECT);
600 
601         // --> PB 2006-01-13 #123474#
602         if ( bIsInputEnabled )
603             GetParent()->EnableInput( sal_True );
604         // <--
605         // execute dlg
606         DisableClose( sal_True );
607         short nRet = aDlg.Execute();
608         DisableClose( sal_False );
609         if ( RET_OK == nRet )
610         {
611             const SfxItemSet* pOutSet = aDlg.GetOutputItemSet();
612             const SfxPoolItem* pItem;
613             if( SFX_ITEM_SET == pOutSet->GetItemState( SID_ATTR_MACROITEM, sal_False, &pItem ))
614             {
615                 pHyperlinkItem->SetMacroTable( ((SvxMacroItem*)pItem)->GetMacroTable() );
616             }
617         }
618         delete pItemSet;
619     }
620 
621     return( 0L );
622 }
623 
624 /*************************************************************************
625 |*
626 |* Get Macro-Infos
627 |*
628 |************************************************************************/
629 
630 sal_uInt16 SvxHyperlinkTabPageBase::GetMacroEvents()
631 {
632     SvxHyperlinkItem *pHyperlinkItem = (SvxHyperlinkItem *)
633                                        GetItemSet().GetItem (SID_HYPERLINK_GETLINK);
634 
635     return pHyperlinkItem->GetMacroEvents();
636 }
637 
638 SvxMacroTableDtor* SvxHyperlinkTabPageBase::GetMacroTable()
639 {
640     SvxHyperlinkItem *pHyperlinkItem = (SvxHyperlinkItem *)
641                                        GetItemSet().GetItem (SID_HYPERLINK_GETLINK);
642 
643     return ( (SvxMacroTableDtor*)pHyperlinkItem->GetMacroTbl() );
644 }
645 
646 /*************************************************************************
647 |*
648 |* Does the given file exists ?
649 |*
650 |************************************************************************/
651 
652 sal_Bool SvxHyperlinkTabPageBase::FileExists( const INetURLObject& rURL )
653 {
654     sal_Bool bRet = sal_False;
655 
656     if( rURL.GetFull().getLength() > 0 )
657     {
658         try
659         {
660             Content     aCnt( rURL.GetMainURL( INetURLObject::NO_DECODE ), ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XCommandEnvironment >() );
661             ::rtl::OUString aTitle;
662 
663             aCnt.getPropertyValue( ::rtl::OUString::createFromAscii( "Title" ) ) >>= aTitle;
664             bRet = ( aTitle.getLength() > 0 );
665         }
666         catch( ... )
667         {
668             DBG_ERROR( "FileExists: ucb error" );
669         }
670     }
671 
672     return bRet;
673 }
674 
675 /*************************************************************************
676 |*
677 |* try to detect the current protocol that is used in aStrURL
678 |*
679 |************************************************************************/
680 
681 String SvxHyperlinkTabPageBase::GetSchemeFromURL( String aStrURL )
682 {
683     String aStrScheme;
684 
685     INetURLObject aURL( aStrURL );
686     INetProtocol aProtocol = aURL.GetProtocol();
687 
688     // #77696#
689     // our new INetUrlObject now has the ability
690     // to detect if an Url is valid or not :-(
691     if ( aProtocol == INET_PROT_NOT_VALID )
692     {
693         if ( aStrURL.EqualsIgnoreCaseAscii( INET_HTTP_SCHEME, 0, 7 ) )
694         {
695             aStrScheme = String::CreateFromAscii( INET_HTTP_SCHEME );
696         }
697         else if ( aStrURL.EqualsIgnoreCaseAscii( INET_HTTPS_SCHEME, 0, 8 ) )
698         {
699             aStrScheme = String::CreateFromAscii( INET_HTTPS_SCHEME );
700         }
701         else if ( aStrURL.EqualsIgnoreCaseAscii( INET_FTP_SCHEME, 0, 6 ) )
702         {
703             aStrScheme = String::CreateFromAscii( INET_FTP_SCHEME );
704         }
705         else if ( aStrURL.EqualsIgnoreCaseAscii( INET_MAILTO_SCHEME, 0, 7 ) )
706         {
707             aStrScheme = String::CreateFromAscii( INET_MAILTO_SCHEME );
708         }
709         else if ( aStrURL.EqualsIgnoreCaseAscii( INET_NEWS_SCHEME, 0, 5 ) )
710         {
711             aStrScheme = String::CreateFromAscii( INET_NEWS_SCHEME );
712         }
713         else if ( aStrURL.EqualsIgnoreCaseAscii( INET_TELNET_SCHEME, 0, 9 ) )
714         {
715             aStrScheme = String::CreateFromAscii( INET_TELNET_SCHEME );
716         }
717     }
718     else
719         aStrScheme = INetURLObject::GetScheme( aProtocol );
720     return aStrScheme;
721 }
722 
723 
724 void SvxHyperlinkTabPageBase::GetDataFromCommonFields( String& aStrName,
725                                              String& aStrIntName, String& aStrFrame,
726                                              SvxLinkInsertMode& eMode )
727 {
728     aStrIntName = mpEdText->GetText();
729     aStrName    = mpEdIndication->GetText();
730     aStrFrame   = mpCbbFrame->GetText();
731     eMode       = (SvxLinkInsertMode) (mpLbForm->GetSelectEntryPos()+1);
732     if( IsHTMLDoc() )
733         eMode = (SvxLinkInsertMode) ( sal_uInt16(eMode) | HLINK_HTMLMODE );
734 }
735 
736 /*************************************************************************
737 |*
738 |* reset dialog-fields
739 |*
740 |************************************************************************/
741 
742 void SvxHyperlinkTabPageBase::Reset( const SfxItemSet& rItemSet)
743 {
744     ///////////////////////////////////////
745     // Set dialog-fields from create-itemset
746     maStrInitURL = aEmptyStr;
747 
748     SvxHyperlinkItem *pHyperlinkItem = (SvxHyperlinkItem *)
749                                        rItemSet.GetItem (SID_HYPERLINK_GETLINK);
750 
751     if ( pHyperlinkItem )
752     {
753         // set dialog-fields
754         FillStandardDlgFields (pHyperlinkItem);
755 
756         // set all other fields
757         FillDlgFields ( (String&)pHyperlinkItem->GetURL() );
758 
759         // Store initial URL
760         maStrInitURL = pHyperlinkItem->GetURL();
761     }
762 }
763 
764 /*************************************************************************
765 |*
766 |* Fill output-ItemSet
767 |*
768 |************************************************************************/
769 
770 sal_Bool SvxHyperlinkTabPageBase::FillItemSet( SfxItemSet& rOut)
771 {
772     String aStrURL, aStrName, aStrIntName, aStrFrame;
773     SvxLinkInsertMode eMode;
774 
775     GetCurentItemData ( aStrURL, aStrName, aStrIntName, aStrFrame, eMode);
776     if ( !aStrName.Len() ) //automatically create a visible name if the link is created without name
777         aStrName = CreateUiNameFromURL(aStrURL);
778 
779     sal_uInt16 nEvents = GetMacroEvents();
780     SvxMacroTableDtor* pTable = GetMacroTable();
781 
782     SvxHyperlinkItem aItem( SID_HYPERLINK_SETLINK, aStrName, aStrURL, aStrFrame,
783                             aStrIntName, eMode, nEvents, pTable );
784     rOut.Put (aItem);
785 
786     return sal_True;
787 }
788 
789 String SvxHyperlinkTabPageBase::CreateUiNameFromURL( const String& aStrURL )
790 {
791     String          aStrUiURL;
792     INetURLObject   aURLObj( aStrURL );
793 
794     switch(aURLObj.GetProtocol())
795     {
796         case INET_PROT_FILE:
797             utl::LocalFileHelper::ConvertURLToSystemPath( aURLObj.GetMainURL(INetURLObject::NO_DECODE), aStrUiURL );
798             break;
799         case INET_PROT_FTP :
800             {
801                 //remove password from name
802                 INetURLObject   aTmpURL(aURLObj);
803                 aTmpURL.SetPass(aEmptyStr);
804                 aStrUiURL = aTmpURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
805             }
806             break;
807         default :
808             {
809                 aStrUiURL = aURLObj.GetMainURL(INetURLObject::DECODE_UNAMBIGUOUS);
810             }
811     }
812     if(!aStrUiURL.Len())
813         return aStrURL;
814     return aStrUiURL;
815 }
816 
817 /*************************************************************************
818 |*
819 |* Activate / Deactivate Tabpage
820 |*
821 |************************************************************************/
822 
823 void SvxHyperlinkTabPageBase::ActivatePage( const SfxItemSet& rItemSet )
824 {
825     ///////////////////////////////////////
826     // Set dialog-fields from input-itemset
827     SvxHyperlinkItem *pHyperlinkItem = (SvxHyperlinkItem *)
828                                        rItemSet.GetItem (SID_HYPERLINK_GETLINK);
829 
830     if ( pHyperlinkItem )
831     {
832         // standard-fields
833         FillStandardDlgFields (pHyperlinkItem);
834     }
835 
836     // show mark-window if it was open before
837     if ( ShouldOpenMarkWnd () )
838         ShowMarkWnd ();
839 }
840 
841 int SvxHyperlinkTabPageBase::DeactivatePage( SfxItemSet* _pSet)
842 {
843     // hide mark-wnd
844     SetMarkWndShouldOpen( IsMarkWndVisible () );
845     HideMarkWnd ();
846 
847     // retrieve data of dialog
848     String aStrURL, aStrName, aStrIntName, aStrFrame;
849     SvxLinkInsertMode eMode;
850 
851     GetCurentItemData ( aStrURL, aStrName, aStrIntName, aStrFrame, eMode);
852 
853     sal_uInt16 nEvents = GetMacroEvents();
854     SvxMacroTableDtor* pTable = GetMacroTable();
855 
856     if( _pSet )
857     {
858         SvxHyperlinkItem aItem( SID_HYPERLINK_GETLINK, aStrName, aStrURL, aStrFrame,
859                                 aStrIntName, eMode, nEvents, pTable );
860         _pSet->Put( aItem );
861     }
862 
863     return( LEAVE_PAGE );
864 }
865 
866 sal_Bool SvxHyperlinkTabPageBase::ShouldOpenMarkWnd()
867 {
868     return sal_False;
869 }
870 
871 void SvxHyperlinkTabPageBase::SetMarkWndShouldOpen(sal_Bool)
872 {
873 }
874