Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <comphelper/string.hxx>
21 : #include <unotools/pathoptions.hxx>
22 : #include <unotools/useroptions.hxx>
23 : #include <svl/adrparse.hxx>
24 :
25 : #include "hlinettp.hxx"
26 : #include "hyperdlg.hrc"
27 : #include "hlmarkwn_def.hxx"
28 :
29 : sal_Char const sAnonymous[] = "anonymous";
30 : sal_Char const sHTTPScheme[] = INET_HTTP_SCHEME;
31 : sal_Char const sHTTPSScheme[] = INET_HTTPS_SCHEME;
32 : sal_Char const sFTPScheme[] = INET_FTP_SCHEME;
33 :
34 : /*************************************************************************
35 : |*
36 : |* Constructor / Destructor
37 : |*
38 : |************************************************************************/
39 :
40 0 : SvxHyperlinkInternetTp::SvxHyperlinkInternetTp ( Window *pParent,
41 : const SfxItemSet& rItemSet)
42 0 : : SvxHyperlinkTabPageBase ( pParent, CUI_RES( RID_SVXPAGE_HYPERLINK_INTERNET ),
43 : rItemSet ) ,
44 0 : maGrpLinkTyp ( this, CUI_RES (GRP_LINKTYPE) ),
45 0 : maRbtLinktypInternet ( this, CUI_RES (RB_LINKTYP_INTERNET) ),
46 0 : maRbtLinktypFTP ( this, CUI_RES (RB_LINKTYP_FTP) ),
47 0 : maFtTarget ( this, CUI_RES (FT_TARGET_HTML) ),
48 : maCbbTarget ( this, INET_PROT_HTTP ),
49 0 : maBtBrowse ( this, CUI_RES (BTN_BROWSE) ),
50 0 : maFtLogin ( this, CUI_RES (FT_LOGIN) ),
51 0 : maEdLogin ( this, CUI_RES (ED_LOGIN) ),
52 0 : maBtTarget ( this, CUI_RES (BTN_TARGET) ),
53 0 : maFtPassword ( this, CUI_RES (FT_PASSWD) ),
54 0 : maEdPassword ( this, CUI_RES (ED_PASSWD) ),
55 0 : maCbAnonymous ( this, CUI_RES (CBX_ANONYMOUS) ),
56 0 : mbMarkWndOpen ( sal_False )
57 : {
58 : // Disable display of bitmap names.
59 0 : maBtBrowse.EnableTextDisplay (sal_False);
60 0 : maBtTarget.EnableTextDisplay (sal_False);
61 :
62 0 : InitStdControls();
63 0 : FreeResource();
64 :
65 : // Init URL-Box (pos&size, Open-Handler)
66 0 : maCbbTarget.SetPosSizePixel ( LogicToPixel( Point( COL_2, 25 ), MAP_APPFONT ),
67 0 : LogicToPixel( Size ( 176 - COL_DIFF, 60), MAP_APPFONT ) );
68 0 : maCbbTarget.Show();
69 0 : maCbbTarget.SetHelpId( HID_HYPERDLG_INET_PATH );
70 :
71 0 : SetExchangeSupport ();
72 :
73 : ///////////////////////////////////////
74 : // set defaults
75 0 : maRbtLinktypInternet.Check ();
76 0 : maFtLogin.Show( sal_False );
77 0 : maFtPassword.Show( sal_False );
78 0 : maEdLogin.Show( sal_False );
79 0 : maEdPassword.Show( sal_False );
80 0 : maCbAnonymous.Show( sal_False );
81 0 : maBtTarget.Enable( sal_False );
82 0 : maBtBrowse.Enable( sal_True );
83 :
84 : ///////////////////////////////////////
85 : // overload handlers
86 0 : Link aLink( LINK ( this, SvxHyperlinkInternetTp, Click_SmartProtocol_Impl ) );
87 0 : maRbtLinktypInternet.SetClickHdl( aLink );
88 0 : maRbtLinktypFTP.SetClickHdl ( aLink );
89 0 : maCbAnonymous.SetClickHdl ( LINK ( this, SvxHyperlinkInternetTp, ClickAnonymousHdl_Impl ) );
90 0 : maBtBrowse.SetClickHdl ( LINK ( this, SvxHyperlinkInternetTp, ClickBrowseHdl_Impl ) );
91 0 : maBtTarget.SetClickHdl ( LINK ( this, SvxHyperlinkInternetTp, ClickTargetHdl_Impl ) );
92 0 : maEdLogin.SetModifyHdl ( LINK ( this, SvxHyperlinkInternetTp, ModifiedLoginHdl_Impl ) );
93 0 : maCbbTarget.SetLoseFocusHdl ( LINK ( this, SvxHyperlinkInternetTp, LostFocusTargetHdl_Impl ) );
94 0 : maCbbTarget.SetModifyHdl ( LINK ( this, SvxHyperlinkInternetTp, ModifiedTargetHdl_Impl ) );
95 0 : maTimer.SetTimeoutHdl ( LINK ( this, SvxHyperlinkInternetTp, TimeoutHdl_Impl ) );
96 :
97 0 : maFtTarget.SetAccessibleRelationMemberOf( &maGrpLinkTyp );
98 0 : maCbbTarget.SetAccessibleRelationMemberOf( &maGrpLinkTyp );
99 0 : maBtTarget.SetAccessibleRelationMemberOf( &maGrpLinkTyp );
100 0 : maBtTarget.SetAccessibleRelationLabeledBy( &maFtTarget );
101 0 : maBtBrowse.SetAccessibleRelationMemberOf( &maGrpLinkTyp );
102 0 : maBtBrowse.SetAccessibleRelationLabeledBy( &maFtTarget );
103 0 : }
104 :
105 0 : SvxHyperlinkInternetTp::~SvxHyperlinkInternetTp ()
106 : {
107 0 : }
108 :
109 : /*************************************************************************
110 : |*
111 : |* Fill the all dialog-controls except controls in groupbox "more..."
112 : |*
113 : |************************************************************************/
114 :
115 0 : void SvxHyperlinkInternetTp::FillDlgFields ( String& aStrURL )
116 : {
117 0 : INetURLObject aURL( aStrURL );
118 0 : String aStrScheme = GetSchemeFromURL( aStrURL );
119 :
120 : // set additional controls for FTP: Username / Password
121 0 : if ( aStrScheme.SearchAscii( sFTPScheme ) == 0 )
122 : {
123 0 : if ( String(aURL.GetUser()).ToLowerAscii().SearchAscii ( sAnonymous ) == 0 )
124 0 : setAnonymousFTPUser();
125 : else
126 0 : setFTPUser(aURL.GetUser(), aURL.GetPass());
127 :
128 : //do not show password and user in url
129 0 : if(!aURL.GetUser().isEmpty() || !aURL.GetPass().isEmpty() )
130 0 : aURL.SetUserAndPass(aEmptyStr,aEmptyStr);
131 : }
132 :
133 : // set URL-field
134 : // Show the scheme, #72740
135 0 : if ( aURL.GetProtocol() != INET_PROT_NOT_VALID )
136 0 : maCbbTarget.SetText( aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) );
137 : else
138 0 : maCbbTarget.SetText( aStrURL ); // #77696#
139 :
140 0 : SetScheme( aStrScheme );
141 0 : }
142 :
143 0 : void SvxHyperlinkInternetTp::setAnonymousFTPUser()
144 : {
145 0 : maEdLogin.SetText(rtl::OUString(sAnonymous));
146 0 : SvAddressParser aAddress( SvtUserOptions().GetEmail() );
147 0 : maEdPassword.SetText( aAddress.Count() ? aAddress.GetEmailAddress(0) : rtl::OUString() );
148 :
149 0 : maFtLogin.Disable ();
150 0 : maFtPassword.Disable ();
151 0 : maEdLogin.Disable ();
152 0 : maEdPassword.Disable ();
153 0 : maCbAnonymous.Check();
154 0 : }
155 :
156 0 : void SvxHyperlinkInternetTp::setFTPUser(const String& rUser, const String& rPassword)
157 : {
158 0 : maEdLogin.SetText ( rUser );
159 0 : maEdPassword.SetText ( rPassword );
160 :
161 0 : maFtLogin.Enable ();
162 0 : maFtPassword.Enable ();
163 0 : maEdLogin.Enable ();
164 0 : maEdPassword.Enable ();
165 0 : maCbAnonymous.Check(sal_False);
166 0 : }
167 :
168 : /*************************************************************************
169 : |*
170 : |* retrieve and prepare data from dialog-fields
171 : |*
172 : |************************************************************************/
173 :
174 0 : void SvxHyperlinkInternetTp::GetCurentItemData ( String& aStrURL, String& aStrName,
175 : String& aStrIntName, String& aStrFrame,
176 : SvxLinkInsertMode& eMode )
177 : {
178 0 : aStrURL = CreateAbsoluteURL();
179 0 : GetDataFromCommonFields( aStrName, aStrIntName, aStrFrame, eMode );
180 0 : }
181 :
182 0 : String SvxHyperlinkInternetTp::CreateAbsoluteURL() const
183 : {
184 0 : String aStrURL = maCbbTarget.GetText();
185 0 : String aScheme = GetSchemeFromURL(aStrURL);
186 :
187 0 : INetURLObject aURL(aStrURL);
188 :
189 0 : if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
190 : {
191 0 : aURL.SetSmartProtocol( GetSmartProtocolFromButtons() );
192 0 : aURL.SetSmartURL(aStrURL);
193 : }
194 :
195 : // username and password for ftp-url
196 0 : if( aURL.GetProtocol() == INET_PROT_FTP && maEdLogin.GetText().Len()!=0 )
197 0 : aURL.SetUserAndPass ( maEdLogin.GetText(), maEdPassword.GetText() );
198 :
199 0 : if ( aURL.GetProtocol() != INET_PROT_NOT_VALID )
200 0 : return aURL.GetMainURL( INetURLObject::DECODE_WITH_CHARSET );
201 : else //#105788# always create a URL even if it is not valid
202 0 : return aStrURL;
203 : }
204 :
205 : /*************************************************************************
206 : |*
207 : |* static method to create Tabpage
208 : |*
209 : |************************************************************************/
210 :
211 0 : IconChoicePage* SvxHyperlinkInternetTp::Create( Window* pWindow, const SfxItemSet& rItemSet )
212 : {
213 0 : return( new SvxHyperlinkInternetTp( pWindow, rItemSet ) );
214 : }
215 :
216 : /*************************************************************************
217 : |*
218 : |* Set initial focus
219 : |*
220 : |************************************************************************/
221 :
222 0 : void SvxHyperlinkInternetTp::SetInitFocus()
223 : {
224 0 : maCbbTarget.GrabFocus();
225 0 : }
226 :
227 : /*************************************************************************
228 : |*
229 : |* Contents of editfield "Target" modified
230 : |*
231 : |************************************************************************/
232 :
233 0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ModifiedTargetHdl_Impl)
234 : {
235 0 : String aScheme = GetSchemeFromURL( maCbbTarget.GetText() );
236 0 : if(aScheme.Len()!=0)
237 0 : SetScheme( aScheme );
238 :
239 : // start timer
240 0 : maTimer.SetTimeout( 2500 );
241 0 : maTimer.Start();
242 :
243 0 : return( 0L );
244 : }
245 :
246 : /*************************************************************************
247 : |*
248 : |* If target-field was modify, to browse the new doc after timeout
249 : |*
250 : |************************************************************************/
251 :
252 0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, TimeoutHdl_Impl)
253 : {
254 0 : RefreshMarkWindow();
255 0 : return( 0L );
256 : }
257 :
258 : /*************************************************************************
259 : |*
260 : |* Contents of editfield "Login" modified
261 : |*
262 : |************************************************************************/
263 :
264 0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ModifiedLoginHdl_Impl)
265 : {
266 0 : String aStrLogin ( maEdLogin.GetText() );
267 0 : if ( aStrLogin.EqualsIgnoreCaseAscii( sAnonymous ) )
268 : {
269 0 : maCbAnonymous.Check();
270 0 : ClickAnonymousHdl_Impl(NULL);
271 : }
272 :
273 0 : return( 0L );
274 : }
275 :
276 : /*************************************************************************
277 : |************************************************************************/
278 :
279 0 : void SvxHyperlinkInternetTp::SetScheme( const String& aScheme )
280 : {
281 : //if aScheme is empty or unknown the default beaviour is like it where HTTP
282 :
283 0 : sal_Bool bFTP = aScheme.SearchAscii( sFTPScheme ) == 0;
284 0 : sal_Bool bInternet = !(bFTP);
285 :
286 : //update protocol button selection:
287 0 : maRbtLinktypFTP.Check(bFTP);
288 0 : maRbtLinktypInternet.Check(bInternet);
289 :
290 : //update target:
291 0 : RemoveImproperProtocol(aScheme);
292 0 : maCbbTarget.SetSmartProtocol( GetSmartProtocolFromButtons() );
293 :
294 : //show/hide special fields for FTP:
295 0 : maFtLogin.Show( bFTP );
296 0 : maFtPassword.Show( bFTP );
297 0 : maEdLogin.Show( bFTP );
298 0 : maEdPassword.Show( bFTP );
299 0 : maCbAnonymous.Show( bFTP );
300 :
301 : //update 'link target in document'-window and opening-button
302 0 : if( aScheme.SearchAscii( sHTTPScheme ) == 0 || aScheme.Len() == 0 )
303 : {
304 0 : maBtTarget.Enable();
305 0 : if ( mbMarkWndOpen )
306 0 : ShowMarkWnd ();
307 : }
308 : else
309 : {
310 : //disable for https and ftp
311 0 : maBtTarget.Disable();
312 0 : if ( mbMarkWndOpen )
313 0 : HideMarkWnd ();
314 : }
315 0 : }
316 :
317 : /*************************************************************************
318 : |*
319 : |* Remove protocol if it does not fit to the current button selection
320 : |*
321 : |************************************************************************/
322 :
323 0 : void SvxHyperlinkInternetTp::RemoveImproperProtocol(const String& aProperScheme)
324 : {
325 0 : String aStrURL ( maCbbTarget.GetText() );
326 0 : if ( aStrURL != aEmptyStr )
327 : {
328 0 : String aStrScheme = GetSchemeFromURL( aStrURL );
329 0 : if ( aStrScheme != aEmptyStr && aStrScheme != aProperScheme )
330 : {
331 0 : aStrURL.Erase ( 0, aStrScheme.Len() );
332 0 : maCbbTarget.SetText ( aStrURL );
333 0 : }
334 0 : }
335 0 : }
336 :
337 0 : String SvxHyperlinkInternetTp::GetSchemeFromButtons() const
338 : {
339 0 : if( maRbtLinktypFTP.IsChecked() )
340 0 : return rtl::OUString(INET_FTP_SCHEME);
341 0 : return rtl::OUString(INET_HTTP_SCHEME);
342 : }
343 :
344 0 : INetProtocol SvxHyperlinkInternetTp::GetSmartProtocolFromButtons() const
345 : {
346 0 : if( maRbtLinktypFTP.IsChecked() )
347 : {
348 0 : return INET_PROT_FTP;
349 : }
350 0 : return INET_PROT_HTTP;
351 : }
352 :
353 : /*************************************************************************
354 : |*
355 : |* Click on Radiobutton : Internet or FTP
356 : |*
357 : |************************************************************************/
358 :
359 0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, Click_SmartProtocol_Impl)
360 : {
361 0 : String aScheme = GetSchemeFromButtons();
362 0 : SetScheme( aScheme );
363 0 : return( 0L );
364 : }
365 :
366 : /*************************************************************************
367 : |*
368 : |* Click on Checkbox : Anonymous user
369 : |*
370 : |************************************************************************/
371 :
372 0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ClickAnonymousHdl_Impl)
373 : {
374 : // disable login-editfields if checked
375 0 : if ( maCbAnonymous.IsChecked() )
376 : {
377 0 : if ( maEdLogin.GetText().ToLowerAscii().SearchAscii ( sAnonymous ) == 0 )
378 : {
379 0 : maStrOldUser = aEmptyStr;
380 0 : maStrOldPassword = aEmptyStr;
381 : }
382 : else
383 : {
384 0 : maStrOldUser = maEdLogin.GetText();
385 0 : maStrOldPassword = maEdPassword.GetText();
386 : }
387 :
388 0 : setAnonymousFTPUser();
389 : }
390 : else
391 0 : setFTPUser(maStrOldUser, maStrOldPassword);
392 :
393 0 : return( 0L );
394 : }
395 :
396 : /*************************************************************************
397 : |*
398 : |* Combobox Target lost the focus
399 : |*
400 : |************************************************************************/
401 :
402 0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, LostFocusTargetHdl_Impl)
403 : {
404 0 : RefreshMarkWindow();
405 0 : return (0L);
406 : }
407 :
408 : /*************************************************************************
409 : |*
410 : |* Click on imagebutton : Browse
411 : |*
412 : |************************************************************************/
413 :
414 0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ClickBrowseHdl_Impl)
415 : {
416 : /////////////////////////////////////////////////
417 : // Open URL if available
418 :
419 0 : SfxStringItem aName( SID_FILE_NAME, rtl::OUString("http://") );
420 0 : SfxStringItem aRefererItem( SID_REFERER, rtl::OUString("private:user") );
421 0 : SfxBoolItem aNewView( SID_OPEN_NEW_VIEW, sal_True );
422 0 : SfxBoolItem aSilent( SID_SILENT, sal_True );
423 0 : SfxBoolItem aReadOnly( SID_DOC_READONLY, sal_True );
424 :
425 0 : SfxBoolItem aBrowse( SID_BROWSE, sal_True );
426 :
427 0 : const SfxPoolItem *ppItems[] = { &aName, &aNewView, &aSilent, &aReadOnly, &aRefererItem, &aBrowse, NULL };
428 0 : (((SvxHpLinkDlg*)mpDialog)->GetBindings())->Execute( SID_OPENDOC, ppItems, 0, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD );
429 :
430 0 : return( 0L );
431 : }
432 :
433 : /*************************************************************************
434 : |*
435 : |* Click on imagebutton : Target
436 : |*
437 : |************************************************************************/
438 :
439 0 : IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ClickTargetHdl_Impl)
440 : {
441 0 : RefreshMarkWindow();
442 0 : ShowMarkWnd ();
443 0 : mbMarkWndOpen = IsMarkWndVisible ();
444 :
445 0 : return( 0L );
446 : }
447 :
448 0 : void SvxHyperlinkInternetTp::RefreshMarkWindow()
449 : {
450 0 : if ( maRbtLinktypInternet.IsChecked() && IsMarkWndVisible() )
451 : {
452 0 : EnterWait();
453 0 : String aStrURL( CreateAbsoluteURL() );
454 0 : if ( aStrURL != aEmptyStr )
455 0 : mpMarkWnd->RefreshTree ( aStrURL );
456 : else
457 0 : mpMarkWnd->SetError( LERR_DOCNOTOPEN );
458 0 : LeaveWait();
459 : }
460 :
461 0 : }
462 :
463 : /*************************************************************************
464 : |*
465 : |* Get String from Bookmark-Wnd
466 : |*
467 : |************************************************************************/
468 :
469 0 : void SvxHyperlinkInternetTp::SetMarkStr ( String& aStrMark )
470 : {
471 0 : String aStrURL ( maCbbTarget.GetText() );
472 :
473 0 : const sal_Unicode sUHash = '#';
474 0 : xub_StrLen nPos = aStrURL.SearchBackward( sUHash );
475 :
476 0 : if( nPos != STRING_NOTFOUND )
477 0 : aStrURL.Erase ( nPos );
478 :
479 0 : aStrURL += sUHash;
480 0 : aStrURL += aStrMark;
481 :
482 0 : maCbbTarget.SetText ( aStrURL );
483 0 : }
484 :
485 : /*************************************************************************
486 : |*
487 : |* Enable Browse-Button in subject to the office is in onlinemode
488 : |*
489 : |************************************************************************/
490 :
491 0 : void SvxHyperlinkInternetTp::SetOnlineMode( sal_Bool /*bEnable*/ )
492 : {
493 : // State of target-button in subject to the current url-string
494 : // ( Can't display any targets in an document, if there is no
495 : // valid url to a document )
496 0 : String aStrCurrentTarget(comphelper::string::stripEnd(maCbbTarget.GetText(), ' '));
497 :
498 0 : if( aStrCurrentTarget == aEmptyStr ||
499 0 : aStrCurrentTarget.EqualsIgnoreCaseAscii( sHTTPScheme ) ||
500 0 : aStrCurrentTarget.EqualsIgnoreCaseAscii( sHTTPSScheme ) )
501 0 : maBtTarget.Enable( sal_False );
502 : else
503 0 : maBtTarget.Enable( sal_True );
504 3 : }
505 :
506 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|