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