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