1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_cui.hxx" 26 27 #include <com/sun/star/frame/XDispatchProvider.hpp> 28 #include <com/sun/star/util/XURLTransformer.hpp> 29 #include <com/sun/star/frame/FrameSearchFlag.hpp> 30 #include <sfx2/request.hxx> 31 32 #include <comphelper/processfactory.hxx> 33 #include <sfx2/viewfrm.hxx> 34 #include <unotools/pathoptions.hxx> 35 #include <unotools/moduleoptions.hxx> 36 37 #include "hlmailtp.hxx" 38 #include "hyperdlg.hrc" 39 40 using namespace ::rtl; 41 using namespace ::com::sun::star; 42 43 /************************************************************************* 44 |* 45 |* Contructor / Destructor 46 |* 47 |************************************************************************/ 48 49 SvxHyperlinkMailTp::SvxHyperlinkMailTp ( Window *pParent, const SfxItemSet& rItemSet) 50 : SvxHyperlinkTabPageBase ( pParent, CUI_RES( RID_SVXPAGE_HYPERLINK_MAIL ), 51 rItemSet ), 52 maGrpMailNews ( this, CUI_RES (GRP_MAILNEWS) ), 53 maRbtMail ( this, CUI_RES (RB_LINKTYP_MAIL) ), 54 maRbtNews ( this, CUI_RES (RB_LINKTYP_NEWS) ), 55 maFtReceiver ( this, CUI_RES (FT_RECEIVER) ), 56 maCbbReceiver ( this, INET_PROT_MAILTO ), 57 maBtAdrBook ( this, CUI_RES (BTN_ADRESSBOOK) ), 58 maFtSubject ( this, CUI_RES (FT_SUBJECT) ), 59 maEdSubject ( this, CUI_RES (ED_SUBJECT) ) 60 { 61 // Set HC bitmaps and disable display of bitmap names. 62 maBtAdrBook.SetModeImage( Image( CUI_RES( IMG_ADRESSBOOK_HC ) ), BMP_COLOR_HIGHCONTRAST ); 63 maBtAdrBook.EnableTextDisplay (sal_False); 64 65 InitStdControls(); 66 FreeResource(); 67 68 // Init URL-Box (pos&size, Open-Handler) 69 maCbbReceiver.SetPosSizePixel ( LogicToPixel( Point( COL_2, 25 ), MAP_APPFONT ), 70 LogicToPixel( Size ( 176 - COL_DIFF, 60), MAP_APPFONT ) ); 71 72 maCbbReceiver.Show(); 73 maCbbReceiver.SetHelpId( HID_HYPERDLG_MAIL_PATH ); 74 75 SetExchangeSupport (); 76 77 // set defaults 78 maRbtMail.Check (); 79 80 // overload handlers 81 maRbtMail.SetClickHdl ( LINK ( this, SvxHyperlinkMailTp, Click_SmartProtocol_Impl ) ); 82 maRbtNews.SetClickHdl ( LINK ( this, SvxHyperlinkMailTp, Click_SmartProtocol_Impl ) ); 83 maBtAdrBook.SetClickHdl ( LINK ( this, SvxHyperlinkMailTp, ClickAdrBookHdl_Impl ) ); 84 maCbbReceiver.SetModifyHdl ( LINK ( this, SvxHyperlinkMailTp, ModifiedReceiverHdl_Impl) ); 85 86 if ( !SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) ) 87 maBtAdrBook.Hide(); 88 89 maBtAdrBook.SetAccessibleRelationMemberOf( &maGrpMailNews ); 90 maBtAdrBook.SetAccessibleRelationLabeledBy( &maFtReceiver ); 91 } 92 93 SvxHyperlinkMailTp::~SvxHyperlinkMailTp () 94 { 95 } 96 97 /************************************************************************* 98 |* 99 |* Fill the all dialog-controls except controls in groupbox "more..." 100 |* 101 |************************************************************************/ 102 103 void SvxHyperlinkMailTp::FillDlgFields ( String& aStrURL ) 104 { 105 const sal_Char sMailtoScheme[] = INET_MAILTO_SCHEME; 106 107 INetURLObject aURL( aStrURL ); 108 String aStrScheme = GetSchemeFromURL( aStrURL ); 109 110 // set URL-field and additional controls 111 String aStrURLc ( aStrURL ); 112 // set additional controls for EMail: 113 if ( aStrScheme.SearchAscii( sMailtoScheme ) == 0 ) 114 { 115 // Find mail-subject 116 String aStrSubject, aStrTmp ( aStrURLc ); 117 118 const sal_Char sSubject[] = "subject"; 119 xub_StrLen nPos = aStrTmp.ToLowerAscii().SearchAscii( sSubject, 0 ); 120 nPos = aStrTmp.Search( sal_Unicode( '=' ), nPos ); 121 122 if ( nPos != STRING_NOTFOUND ) 123 aStrSubject = aStrURLc.Copy( nPos+1, aStrURLc.Len() ); 124 125 nPos = aStrURLc.Search ( sal_Unicode( '?' ), 0); 126 127 aStrURLc = aStrURLc.Copy( 0, ( nPos == STRING_NOTFOUND ? 128 aStrURLc.Len() : nPos ) ); 129 130 maEdSubject.SetText ( aStrSubject ); 131 } 132 else 133 { 134 maEdSubject.SetText (aEmptyStr); 135 } 136 137 maCbbReceiver.SetText ( aStrURLc ); 138 139 SetScheme( aStrScheme ); 140 } 141 142 /************************************************************************* 143 |* 144 |* retrieve and prepare data from dialog-fields 145 |* 146 |************************************************************************/ 147 148 void SvxHyperlinkMailTp::GetCurentItemData ( String& aStrURL, String& aStrName, 149 String& aStrIntName, String& aStrFrame, 150 SvxLinkInsertMode& eMode ) 151 { 152 aStrURL = CreateAbsoluteURL(); 153 GetDataFromCommonFields( aStrName, aStrIntName, aStrFrame, eMode ); 154 } 155 156 String SvxHyperlinkMailTp::CreateAbsoluteURL() const 157 { 158 String aStrURL = maCbbReceiver.GetText(); 159 INetURLObject aURL(aStrURL); 160 161 if( aURL.GetProtocol() == INET_PROT_NOT_VALID ) 162 { 163 aURL.SetSmartProtocol( GetSmartProtocolFromButtons() ); 164 aURL.SetSmartURL(aStrURL); 165 } 166 167 // subject for EMail-url 168 if( aURL.GetProtocol() == INET_PROT_MAILTO ) 169 { 170 if ( maEdSubject.GetText() != aEmptyStr ) 171 { 172 String aQuery = UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "subject=" ) ); 173 aQuery.Append( maEdSubject.GetText() ); 174 aURL.SetParam(aQuery); 175 } 176 } 177 178 if ( aURL.GetProtocol() != INET_PROT_NOT_VALID ) 179 return aURL.GetMainURL( INetURLObject::DECODE_WITH_CHARSET ); 180 else //#105788# always create a URL even if it is not valid 181 return aStrURL; 182 } 183 184 /************************************************************************* 185 |* 186 |* static method to create Tabpage 187 |* 188 |************************************************************************/ 189 190 IconChoicePage* SvxHyperlinkMailTp::Create( Window* pWindow, const SfxItemSet& rItemSet ) 191 { 192 return( new SvxHyperlinkMailTp( pWindow, rItemSet ) ); 193 } 194 195 /************************************************************************* 196 |* 197 |* Set initial focus 198 |* 199 |************************************************************************/ 200 201 void SvxHyperlinkMailTp::SetInitFocus() 202 { 203 maCbbReceiver.GrabFocus(); 204 } 205 206 /************************************************************************* 207 |************************************************************************/ 208 209 void SvxHyperlinkMailTp::SetScheme( const String& aScheme ) 210 { 211 //if aScheme is empty or unknown the default beaviour is like it where MAIL 212 const sal_Char sNewsScheme[] = INET_NEWS_SCHEME; 213 214 sal_Bool bMail = aScheme.SearchAscii( sNewsScheme ) != 0; 215 216 //update protocol button selection: 217 maRbtMail.Check(bMail); 218 maRbtNews.Check(!bMail); 219 220 //update target: 221 RemoveImproperProtocol(aScheme); 222 maCbbReceiver.SetSmartProtocol( GetSmartProtocolFromButtons() ); 223 224 //show/hide special fields for MAIL: 225 maFtSubject.Enable(bMail); 226 maEdSubject.Enable(bMail); 227 } 228 229 /************************************************************************* 230 |* 231 |* Remove protocol if it does not fit to the current button selection 232 |* 233 |************************************************************************/ 234 235 void SvxHyperlinkMailTp::RemoveImproperProtocol(const String& aProperScheme) 236 { 237 String aStrURL ( maCbbReceiver.GetText() ); 238 if ( aStrURL != aEmptyStr ) 239 { 240 String aStrScheme = GetSchemeFromURL( aStrURL ); 241 if ( aStrScheme != aEmptyStr && aStrScheme != aProperScheme ) 242 { 243 aStrURL.Erase ( 0, aStrScheme.Len() ); 244 maCbbReceiver.SetText ( aStrURL ); 245 } 246 } 247 } 248 249 String SvxHyperlinkMailTp::GetSchemeFromButtons() const 250 { 251 if( maRbtNews.IsChecked() ) 252 { 253 return String::CreateFromAscii( INET_NEWS_SCHEME ); 254 } 255 return String::CreateFromAscii( INET_MAILTO_SCHEME ); 256 } 257 258 INetProtocol SvxHyperlinkMailTp::GetSmartProtocolFromButtons() const 259 { 260 if( maRbtNews.IsChecked() ) 261 { 262 return INET_PROT_NEWS; 263 } 264 return INET_PROT_MAILTO; 265 } 266 267 /************************************************************************* 268 |* 269 |* Click on radiobutton : Type EMail 270 |* 271 |************************************************************************/ 272 273 IMPL_LINK ( SvxHyperlinkMailTp, Click_SmartProtocol_Impl, void *, EMPTYARG ) 274 { 275 String aScheme = GetSchemeFromButtons(); 276 SetScheme( aScheme ); 277 return( 0L ); 278 } 279 280 /************************************************************************* 281 |* 282 |* Contens of editfield "receiver" modified 283 |* 284 |************************************************************************/ 285 286 IMPL_LINK ( SvxHyperlinkMailTp, ModifiedReceiverHdl_Impl, void *, EMPTYARG ) 287 { 288 String aScheme = GetSchemeFromURL( maCbbReceiver.GetText() ); 289 if(aScheme.Len()!=0) 290 SetScheme( aScheme ); 291 292 return( 0L ); 293 } 294 295 /************************************************************************* 296 |* 297 |* Click on imagebutton : addressbook 298 |* 299 |************************************************************************/ 300 301 IMPL_LINK ( SvxHyperlinkMailTp, ClickAdrBookHdl_Impl, void *, EMPTYARG ) 302 { 303 SfxViewFrame* pViewFrame = SfxViewFrame::Current(); 304 if( pViewFrame ) 305 { 306 SfxItemPool &rPool = pViewFrame->GetPool(); 307 SfxRequest aReq(SID_VIEW_DATA_SOURCE_BROWSER, 0, rPool); 308 pViewFrame->ExecuteSlot( aReq, sal_True ); 309 } 310 311 312 /* uno::Reference< frame::XDispatchProvider > xProv( pViewFrame->GetFrame().GetFrameInterface(), uno::UNO_QUERY ); 313 if ( xProv.is() ) 314 { 315 !!! (pb) we need a new config item here 316 SfxAppIniManagerProperty aProp; 317 GetpApp()->Property( aProp ); 318 if( !aProp.GetIniManager() ) 319 return ( 0L ); 320 321 String aAddressBook = aProp.GetIniManager()->Get( SFX_KEY_ADDRESSBOOK ); 322 INetURLObject aObj; 323 aObj.SetSmartProtocol( INET_PROT_FILE ); 324 aObj.SetURL( aAddressBook.GetToken( 0, sal_Unicode( ';' ) ) ); 325 326 String aMark( RTL_CONSTASCII_USTRINGPARAM( "db:Table;" ) ); 327 aMark += aAddressBook.GetToken( 1, sal_Unicode( ';' ) ); 328 aObj.SetMark( aMark ); 329 330 util::URL aURL; 331 aURL.Complete = ::rtl::OUString( aObj.GetMainURL( INetURLObject::NO_DECODE ) ); 332 333 uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() ); 334 if( xFactory.is() ) 335 { 336 uno::Reference< util::XURLTransformer > xTrans( xFactory->createInstance 337 ( OUString::createFromAscii( "com.sun.star.util.URLTransformer" ) ), 338 uno::UNO_QUERY); 339 xTrans->parseStrict( aURL ); 340 341 uno::Reference< frame::XDispatch > aDisp = xProv->queryDispatch( aURL, 342 OUString::createFromAscii( "_beamer" ), 343 frame::FrameSearchFlag::GLOBAL | 344 frame::FrameSearchFlag::CREATE ); 345 if ( aDisp.is() ) 346 { 347 uno::Sequence< beans::PropertyValue > aArgs(1); 348 beans::PropertyValue* pArg = aArgs.getArray(); 349 pArg[0].Name = DEFINE_CONST_UNICODE("Referer"); 350 pArg[0].Value = uno::makeAny( OUString( DEFINE_CONST_UNICODE("private:user") ) ); 351 aDisp->dispatch( aURL, aArgs ); 352 } 353 } 354 } 355 */ 356 357 return( 0L ); 358 } 359 360 361