summaryrefslogtreecommitdiff
path: root/sc/source/ui/miscdlgs/linkarea.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/miscdlgs/linkarea.cxx')
-rw-r--r--sc/source/ui/miscdlgs/linkarea.cxx370
1 files changed, 370 insertions, 0 deletions
diff --git a/sc/source/ui/miscdlgs/linkarea.cxx b/sc/source/ui/miscdlgs/linkarea.cxx
new file mode 100644
index 000000000000..baff23726e72
--- /dev/null
+++ b/sc/source/ui/miscdlgs/linkarea.cxx
@@ -0,0 +1,370 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+#undef SC_DLLIMPLEMENTATION
+
+
+
+//------------------------------------------------------------------
+
+#include <sfx2/app.hxx>
+#include <sfx2/docfile.hxx>
+#include <sfx2/docfilt.hxx>
+#include <sfx2/docinsert.hxx>
+#include <sfx2/fcontnr.hxx>
+#include <sfx2/filedlghelper.hxx>
+#include <svtools/ehdl.hxx>
+#include <svtools/sfxecode.hxx>
+#include <vcl/waitobj.hxx>
+
+#include "linkarea.hxx"
+#include "linkarea.hrc"
+#include "scresid.hxx"
+#include "sc.hrc"
+#include "rangeutl.hxx"
+#include "docsh.hxx"
+#include "tablink.hxx"
+
+//==================================================================
+
+ScLinkedAreaDlg::ScLinkedAreaDlg( Window* pParent ) :
+ ModalDialog ( pParent, ScResId( RID_SCDLG_LINKAREA ) ),
+ //
+ aFlLocation ( this, ScResId( FL_LOCATION ) ),
+ aCbUrl ( this, ScResId( CB_URL ) ),
+ aBtnBrowse ( this, ScResId( BTN_BROWSE ) ),
+ aTxtHint ( this, ScResId( FT_HINT ) ),
+ aFtRanges ( this, ScResId( FT_RANGES ) ),
+ aLbRanges ( this, ScResId( LB_RANGES ) ),
+ aBtnReload ( this, ScResId( BTN_RELOAD ) ),
+ aNfDelay ( this, ScResId( NF_DELAY ) ),
+ aFtSeconds ( this, ScResId( FT_SECONDS ) ),
+ aBtnOk ( this, ScResId( BTN_OK ) ),
+ aBtnCancel ( this, ScResId( BTN_CANCEL ) ),
+ aBtnHelp ( this, ScResId( BTN_HELP ) ),
+ //
+ pSourceShell( NULL ),
+ pDocInserter( NULL )
+
+{
+ FreeResource();
+
+ aCbUrl.SetHelpId( HID_SCDLG_LINKAREAURL ); // SvtURLBox ctor always sets SID_OPENURL
+ aCbUrl.SetSelectHdl( LINK( this, ScLinkedAreaDlg, FileHdl ) );
+ aBtnBrowse.SetClickHdl( LINK( this, ScLinkedAreaDlg, BrowseHdl ) );
+ aLbRanges.SetSelectHdl( LINK( this, ScLinkedAreaDlg, RangeHdl ) );
+ aBtnReload.SetClickHdl( LINK( this, ScLinkedAreaDlg, ReloadHdl ) );
+ UpdateEnable();
+
+ aNfDelay.SetAccessibleName(aBtnReload.GetText());
+ aNfDelay.SetAccessibleRelationLabeledBy(&aBtnReload);
+}
+
+ScLinkedAreaDlg::~ScLinkedAreaDlg()
+{
+ // pSourceShell is deleted by aSourceRef
+}
+
+short ScLinkedAreaDlg::Execute()
+{
+ // set parent for file dialog or filter options
+
+ Window* pOldDefParent = Application::GetDefDialogParent();
+ Application::SetDefDialogParent( this );
+
+ short nRet = ModalDialog::Execute();
+
+ Application::SetDefDialogParent( pOldDefParent );
+
+ return nRet;
+}
+
+#define FILTERNAME_HTML "HTML (StarCalc)"
+#define FILTERNAME_QUERY "calc_HTML_WebQuery"
+
+IMPL_LINK( ScLinkedAreaDlg, BrowseHdl, PushButton*, EMPTYARG )
+{
+ if ( !pDocInserter )
+ pDocInserter = new sfx2::DocumentInserter(
+ 0, String::CreateFromAscii( ScDocShell::Factory().GetShortName() ) );
+ pDocInserter->StartExecuteModal( LINK( this, ScLinkedAreaDlg, DialogClosedHdl ) );
+ return 0;
+}
+
+IMPL_LINK( ScLinkedAreaDlg, FileHdl, ComboBox*, EMPTYARG )
+{
+ String aEntered = aCbUrl.GetURL();
+ if (pSourceShell)
+ {
+ SfxMedium* pMed = pSourceShell->GetMedium();
+ if ( pMed->GetName() == aEntered )
+ {
+ // already loaded - nothing to do
+ return 0;
+ }
+ }
+
+ String aFilter;
+ String aOptions;
+ // get filter name by looking at the file content (bWithContent = TRUE)
+ // Break operation if any error occurred inside.
+ if (!ScDocumentLoader::GetFilterName( aEntered, aFilter, aOptions, true, true ))
+ return 0;
+
+ // #i53241# replace HTML filter with DataQuery filter
+ if( aFilter.EqualsAscii( FILTERNAME_HTML ) )
+ aFilter.AssignAscii( FILTERNAME_QUERY );
+
+ LoadDocument( aEntered, aFilter, aOptions );
+
+ UpdateSourceRanges();
+ UpdateEnable();
+ return 0;
+}
+
+void ScLinkedAreaDlg::LoadDocument( const String& rFile, const String& rFilter, const String& rOptions )
+{
+ if ( pSourceShell )
+ {
+ // unload old document
+ pSourceShell->DoClose();
+ pSourceShell = NULL;
+ aSourceRef.Clear();
+ }
+
+ if ( rFile.Len() )
+ {
+ WaitObject aWait( this );
+
+ String aNewFilter = rFilter;
+ String aNewOptions = rOptions;
+
+ SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, rFile );
+
+ ScDocumentLoader aLoader( rFile, aNewFilter, aNewOptions, 0, sal_True ); // with interaction
+ pSourceShell = aLoader.GetDocShell();
+ if ( pSourceShell )
+ {
+ sal_uLong nErr = pSourceShell->GetErrorCode();
+ if (nErr)
+ ErrorHandler::HandleError( nErr ); // including warnings
+
+ aSourceRef = pSourceShell;
+ aLoader.ReleaseDocRef(); // don't call DoClose in DocLoader dtor
+ }
+ }
+}
+
+void ScLinkedAreaDlg::InitFromOldLink( const String& rFile, const String& rFilter,
+ const String& rOptions, const String& rSource,
+ sal_uLong nRefresh )
+{
+ LoadDocument( rFile, rFilter, rOptions );
+ if (pSourceShell)
+ {
+ SfxMedium* pMed = pSourceShell->GetMedium();
+ aCbUrl.SetText( pMed->GetName() );
+ }
+ else
+ aCbUrl.SetText( EMPTY_STRING );
+
+ UpdateSourceRanges();
+
+ xub_StrLen nRangeCount = rSource.GetTokenCount();
+ for ( xub_StrLen i=0; i<nRangeCount; i++ )
+ {
+ String aRange = rSource.GetToken(i);
+ aLbRanges.SelectEntry( aRange );
+ }
+
+ sal_Bool bDoRefresh = ( nRefresh != 0 );
+ aBtnReload.Check( bDoRefresh );
+ if (bDoRefresh)
+ aNfDelay.SetValue( nRefresh );
+
+ UpdateEnable();
+}
+
+IMPL_LINK( ScLinkedAreaDlg, RangeHdl, MultiListBox*, EMPTYARG )
+{
+ UpdateEnable();
+ return 0;
+}
+
+IMPL_LINK( ScLinkedAreaDlg, ReloadHdl, CheckBox*, EMPTYARG )
+{
+ UpdateEnable();
+ return 0;
+}
+
+IMPL_LINK( ScLinkedAreaDlg, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg )
+{
+ if ( _pFileDlg->GetError() != ERRCODE_NONE )
+ return 0;
+
+ SfxMedium* pMed = pDocInserter->CreateMedium();
+ if ( pMed )
+ {
+ WaitObject aWait( this );
+
+ // replace HTML filter with DataQuery filter
+ const String aHTMLFilterName( RTL_CONSTASCII_USTRINGPARAM( FILTERNAME_HTML ) );
+ const String aWebQFilterName( RTL_CONSTASCII_USTRINGPARAM( FILTERNAME_QUERY ) );
+
+ const SfxFilter* pFilter = pMed->GetFilter();
+ if( pFilter && (pFilter->GetFilterName() == aHTMLFilterName) )
+ {
+ const SfxFilter* pNewFilter =
+ ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName( aWebQFilterName );
+ if( pNewFilter )
+ pMed->SetFilter( pNewFilter );
+ }
+
+ // ERRCTX_SFX_OPENDOC -> "Fehler beim Laden des Dokumentes"
+ SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, pMed->GetName() );
+
+ if (pSourceShell)
+ pSourceShell->DoClose(); // deleted when assigning aSourceRef
+
+ pMed->UseInteractionHandler( sal_True ); // to enable the filter options dialog
+
+ pSourceShell = new ScDocShell;
+ aSourceRef = pSourceShell;
+ pSourceShell->DoLoad( pMed );
+
+ sal_uLong nErr = pSourceShell->GetErrorCode();
+ if (nErr)
+ ErrorHandler::HandleError( nErr ); // including warnings
+
+ if ( !pSourceShell->GetError() ) // only errors
+ {
+ aCbUrl.SetText( pMed->GetName() );
+ }
+ else
+ {
+ pSourceShell->DoClose();
+ pSourceShell = NULL;
+ aSourceRef.Clear();
+
+ aCbUrl.SetText( EMPTY_STRING );
+ }
+ }
+
+ UpdateSourceRanges();
+ UpdateEnable();
+ return 0;
+}
+
+#undef FILTERNAME_HTML
+#undef FILTERNAME_QUERY
+
+void ScLinkedAreaDlg::UpdateSourceRanges()
+{
+ aLbRanges.SetUpdateMode( false );
+
+ aLbRanges.Clear();
+ if ( pSourceShell )
+ {
+ ScAreaNameIterator aIter( pSourceShell->GetDocument() );
+ ScRange aDummy;
+ String aName;
+ while ( aIter.Next( aName, aDummy ) )
+ aLbRanges.InsertEntry( aName );
+ }
+
+ aLbRanges.SetUpdateMode( sal_True );
+
+ if ( aLbRanges.GetEntryCount() == 1 )
+ aLbRanges.SelectEntryPos(0);
+}
+
+void ScLinkedAreaDlg::UpdateEnable()
+{
+ sal_Bool bEnable = ( pSourceShell && aLbRanges.GetSelectEntryCount() );
+ aBtnOk.Enable( bEnable );
+
+ sal_Bool bReload = aBtnReload.IsChecked();
+ aNfDelay.Enable( bReload );
+ aFtSeconds.Enable( bReload );
+}
+
+String ScLinkedAreaDlg::GetURL()
+{
+ if (pSourceShell)
+ {
+ SfxMedium* pMed = pSourceShell->GetMedium();
+ return pMed->GetName();
+ }
+ return EMPTY_STRING;
+}
+
+String ScLinkedAreaDlg::GetFilter()
+{
+ if (pSourceShell)
+ {
+ SfxMedium* pMed = pSourceShell->GetMedium();
+ return pMed->GetFilter()->GetFilterName();
+ }
+ return EMPTY_STRING;
+}
+
+String ScLinkedAreaDlg::GetOptions()
+{
+ if (pSourceShell)
+ {
+ SfxMedium* pMed = pSourceShell->GetMedium();
+ return ScDocumentLoader::GetOptions( *pMed );
+ }
+ return EMPTY_STRING;
+}
+
+String ScLinkedAreaDlg::GetSource()
+{
+ String aSource;
+ sal_uInt16 nCount = aLbRanges.GetSelectEntryCount();
+ for (sal_uInt16 i=0; i<nCount; i++)
+ {
+ if (i > 0)
+ aSource.Append( (sal_Unicode) ';' );
+ aSource.Append( aLbRanges.GetSelectEntry( i ) );
+ }
+ return aSource;
+}
+
+sal_uLong ScLinkedAreaDlg::GetRefresh()
+{
+ if ( aBtnReload.IsChecked() )
+ return sal::static_int_cast<sal_uLong>( aNfDelay.GetValue() );
+ else
+ return 0; // disabled
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */