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