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_scui.hxx" 26 27 28 29 30 //------------------------------------------------------------------ 31 32 #include <sfx2/app.hxx> 33 #include <sfx2/docfile.hxx> 34 #include <sfx2/docfilt.hxx> 35 #include <sfx2/docinsert.hxx> 36 #include <sfx2/fcontnr.hxx> 37 #include <sfx2/filedlghelper.hxx> 38 #include <svtools/ehdl.hxx> 39 #include <svtools/sfxecode.hxx> 40 #include <vcl/waitobj.hxx> 41 42 #include "linkarea.hxx" 43 #include "linkarea.hrc" 44 #include "scresid.hxx" 45 #include "sc.hrc" 46 #include "rangeutl.hxx" 47 #include "docsh.hxx" 48 #include "tablink.hxx" 49 50 //================================================================== 51 52 ScLinkedAreaDlg::ScLinkedAreaDlg( Window* pParent ) : 53 ModalDialog ( pParent, ScResId( RID_SCDLG_LINKAREA ) ), 54 // 55 aFlLocation ( this, ScResId( FL_LOCATION ) ), 56 aCbUrl ( this, ScResId( CB_URL ) ), 57 aBtnBrowse ( this, ScResId( BTN_BROWSE ) ), 58 aTxtHint ( this, ScResId( FT_HINT ) ), 59 aFtRanges ( this, ScResId( FT_RANGES ) ), 60 aLbRanges ( this, ScResId( LB_RANGES ) ), 61 aBtnReload ( this, ScResId( BTN_RELOAD ) ), 62 aNfDelay ( this, ScResId( NF_DELAY ) ), 63 aFtSeconds ( this, ScResId( FT_SECONDS ) ), 64 aBtnOk ( this, ScResId( BTN_OK ) ), 65 aBtnCancel ( this, ScResId( BTN_CANCEL ) ), 66 aBtnHelp ( this, ScResId( BTN_HELP ) ), 67 // 68 pSourceShell( NULL ), 69 pDocInserter( NULL ) 70 71 { 72 FreeResource(); 73 74 aCbUrl.SetHelpId( HID_SCDLG_LINKAREAURL ); // SvtURLBox ctor always sets SID_OPENURL 75 aCbUrl.SetSelectHdl( LINK( this, ScLinkedAreaDlg, FileHdl ) ); 76 aBtnBrowse.SetClickHdl( LINK( this, ScLinkedAreaDlg, BrowseHdl ) ); 77 aLbRanges.SetSelectHdl( LINK( this, ScLinkedAreaDlg, RangeHdl ) ); 78 aBtnReload.SetClickHdl( LINK( this, ScLinkedAreaDlg, ReloadHdl ) ); 79 UpdateEnable(); 80 81 aNfDelay.SetAccessibleName(aBtnReload.GetText()); 82 aNfDelay.SetAccessibleRelationLabeledBy(&aBtnReload); 83 } 84 85 ScLinkedAreaDlg::~ScLinkedAreaDlg() 86 { 87 // pSourceShell is deleted by aSourceRef 88 } 89 90 short ScLinkedAreaDlg::Execute() 91 { 92 // set parent for file dialog or filter options 93 94 Window* pOldDefParent = Application::GetDefDialogParent(); 95 Application::SetDefDialogParent( this ); 96 97 short nRet = ModalDialog::Execute(); 98 99 Application::SetDefDialogParent( pOldDefParent ); 100 101 return nRet; 102 } 103 104 #define FILTERNAME_HTML "HTML (StarCalc)" 105 #define FILTERNAME_QUERY "calc_HTML_WebQuery" 106 107 IMPL_LINK( ScLinkedAreaDlg, BrowseHdl, PushButton*, EMPTYARG ) 108 { 109 if ( !pDocInserter ) 110 pDocInserter = new sfx2::DocumentInserter( 111 0, String::CreateFromAscii( ScDocShell::Factory().GetShortName() ) ); 112 pDocInserter->StartExecuteModal( LINK( this, ScLinkedAreaDlg, DialogClosedHdl ) ); 113 return 0; 114 } 115 116 IMPL_LINK( ScLinkedAreaDlg, FileHdl, ComboBox*, EMPTYARG ) 117 { 118 String aEntered = aCbUrl.GetURL(); 119 if (pSourceShell) 120 { 121 SfxMedium* pMed = pSourceShell->GetMedium(); 122 if ( pMed->GetName() == aEntered ) 123 { 124 // already loaded - nothing to do 125 return 0; 126 } 127 } 128 129 String aFilter; 130 String aOptions; 131 // get filter name by looking at the file content (bWithContent = sal_True) 132 // Break operation if any error occurred inside. 133 if (!ScDocumentLoader::GetFilterName( aEntered, aFilter, aOptions, sal_True, sal_True )) 134 return 0; 135 136 // #i53241# replace HTML filter with DataQuery filter 137 if( aFilter.EqualsAscii( FILTERNAME_HTML ) ) 138 aFilter.AssignAscii( FILTERNAME_QUERY ); 139 140 LoadDocument( aEntered, aFilter, aOptions ); 141 142 UpdateSourceRanges(); 143 UpdateEnable(); 144 return 0; 145 } 146 147 void ScLinkedAreaDlg::LoadDocument( const String& rFile, const String& rFilter, const String& rOptions ) 148 { 149 if ( pSourceShell ) 150 { 151 // unload old document 152 pSourceShell->DoClose(); 153 pSourceShell = NULL; 154 aSourceRef.Clear(); 155 } 156 157 if ( rFile.Len() ) 158 { 159 WaitObject aWait( this ); 160 161 String aNewFilter = rFilter; 162 String aNewOptions = rOptions; 163 164 SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, rFile ); 165 166 ScDocumentLoader aLoader( rFile, aNewFilter, aNewOptions, 0, sal_True ); // with interaction 167 pSourceShell = aLoader.GetDocShell(); 168 if ( pSourceShell ) 169 { 170 sal_uLong nErr = pSourceShell->GetErrorCode(); 171 if (nErr) 172 ErrorHandler::HandleError( nErr ); // including warnings 173 174 aSourceRef = pSourceShell; 175 aLoader.ReleaseDocRef(); // don't call DoClose in DocLoader dtor 176 } 177 } 178 } 179 180 void ScLinkedAreaDlg::InitFromOldLink( const String& rFile, const String& rFilter, 181 const String& rOptions, const String& rSource, 182 sal_uLong nRefresh ) 183 { 184 LoadDocument( rFile, rFilter, rOptions ); 185 if (pSourceShell) 186 { 187 SfxMedium* pMed = pSourceShell->GetMedium(); 188 aCbUrl.SetText( pMed->GetName() ); 189 } 190 else 191 aCbUrl.SetText( EMPTY_STRING ); 192 193 UpdateSourceRanges(); 194 195 xub_StrLen nRangeCount = rSource.GetTokenCount(); 196 for ( xub_StrLen i=0; i<nRangeCount; i++ ) 197 { 198 String aRange = rSource.GetToken(i); 199 aLbRanges.SelectEntry( aRange ); 200 } 201 202 sal_Bool bDoRefresh = ( nRefresh != 0 ); 203 aBtnReload.Check( bDoRefresh ); 204 if (bDoRefresh) 205 aNfDelay.SetValue( nRefresh ); 206 207 UpdateEnable(); 208 } 209 210 IMPL_LINK( ScLinkedAreaDlg, RangeHdl, MultiListBox*, EMPTYARG ) 211 { 212 UpdateEnable(); 213 return 0; 214 } 215 216 IMPL_LINK( ScLinkedAreaDlg, ReloadHdl, CheckBox*, EMPTYARG ) 217 { 218 UpdateEnable(); 219 return 0; 220 } 221 222 IMPL_LINK( ScLinkedAreaDlg, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg ) 223 { 224 if ( _pFileDlg->GetError() != ERRCODE_NONE ) 225 return 0; 226 227 SfxMedium* pMed = pDocInserter->CreateMedium(); 228 if ( pMed ) 229 { 230 WaitObject aWait( this ); 231 232 // #92296# replace HTML filter with DataQuery filter 233 const String aHTMLFilterName( RTL_CONSTASCII_USTRINGPARAM( FILTERNAME_HTML ) ); 234 const String aWebQFilterName( RTL_CONSTASCII_USTRINGPARAM( FILTERNAME_QUERY ) ); 235 236 const SfxFilter* pFilter = pMed->GetFilter(); 237 if( pFilter && (pFilter->GetFilterName() == aHTMLFilterName) ) 238 { 239 const SfxFilter* pNewFilter = 240 ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName( aWebQFilterName ); 241 if( pNewFilter ) 242 pMed->SetFilter( pNewFilter ); 243 } 244 245 // ERRCTX_SFX_OPENDOC -> "Fehler beim Laden des Dokumentes" 246 SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, pMed->GetName() ); 247 248 if (pSourceShell) 249 pSourceShell->DoClose(); // deleted when assigning aSourceRef 250 251 pMed->UseInteractionHandler( sal_True ); // to enable the filter options dialog 252 253 pSourceShell = new ScDocShell; 254 aSourceRef = pSourceShell; 255 pSourceShell->DoLoad( pMed ); 256 257 sal_uLong nErr = pSourceShell->GetErrorCode(); 258 if (nErr) 259 ErrorHandler::HandleError( nErr ); // including warnings 260 261 if ( !pSourceShell->GetError() ) // only errors 262 { 263 //aCbUrl.SetText( pSourceShell->GetTitle( SFX_TITLE_FULLNAME ) ); 264 aCbUrl.SetText( pMed->GetName() ); 265 } 266 else 267 { 268 pSourceShell->DoClose(); 269 pSourceShell = NULL; 270 aSourceRef.Clear(); 271 272 aCbUrl.SetText( EMPTY_STRING ); 273 } 274 } 275 276 UpdateSourceRanges(); 277 UpdateEnable(); 278 return 0; 279 } 280 281 #undef FILTERNAME_HTML 282 #undef FILTERNAME_QUERY 283 284 void ScLinkedAreaDlg::UpdateSourceRanges() 285 { 286 aLbRanges.SetUpdateMode( sal_False ); 287 288 aLbRanges.Clear(); 289 if ( pSourceShell ) 290 { 291 ScAreaNameIterator aIter( pSourceShell->GetDocument() ); 292 ScRange aDummy; 293 String aName; 294 while ( aIter.Next( aName, aDummy ) ) 295 aLbRanges.InsertEntry( aName ); 296 } 297 298 aLbRanges.SetUpdateMode( sal_True ); 299 300 if ( aLbRanges.GetEntryCount() == 1 ) 301 aLbRanges.SelectEntryPos(0); 302 } 303 304 void ScLinkedAreaDlg::UpdateEnable() 305 { 306 sal_Bool bEnable = ( pSourceShell && aLbRanges.GetSelectEntryCount() ); 307 aBtnOk.Enable( bEnable ); 308 309 sal_Bool bReload = aBtnReload.IsChecked(); 310 aNfDelay.Enable( bReload ); 311 aFtSeconds.Enable( bReload ); 312 } 313 314 String ScLinkedAreaDlg::GetURL() 315 { 316 if (pSourceShell) 317 { 318 SfxMedium* pMed = pSourceShell->GetMedium(); 319 return pMed->GetName(); 320 } 321 return EMPTY_STRING; 322 } 323 324 String ScLinkedAreaDlg::GetFilter() 325 { 326 if (pSourceShell) 327 { 328 SfxMedium* pMed = pSourceShell->GetMedium(); 329 return pMed->GetFilter()->GetFilterName(); 330 } 331 return EMPTY_STRING; 332 } 333 334 String ScLinkedAreaDlg::GetOptions() 335 { 336 if (pSourceShell) 337 { 338 SfxMedium* pMed = pSourceShell->GetMedium(); 339 return ScDocumentLoader::GetOptions( *pMed ); 340 } 341 return EMPTY_STRING; 342 } 343 344 String ScLinkedAreaDlg::GetSource() 345 { 346 String aSource; 347 sal_uInt16 nCount = aLbRanges.GetSelectEntryCount(); 348 for (sal_uInt16 i=0; i<nCount; i++) 349 { 350 if (i > 0) 351 aSource.Append( (sal_Unicode) ';' ); 352 aSource.Append( aLbRanges.GetSelectEntry( i ) ); 353 } 354 return aSource; 355 } 356 357 sal_uLong ScLinkedAreaDlg::GetRefresh() 358 { 359 if ( aBtnReload.IsChecked() ) 360 return sal::static_int_cast<sal_uLong>( aNfDelay.GetValue() ); 361 else 362 return 0; // disabled 363 } 364