blob: 0d5451280e9da8cd4fa98ceddf7565694f0207f1 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
#include <com/sun/star/embed/XEmbeddedObject.hpp>
#include <com/sun/star/frame/XComponentLoader.hpp>
using namespace ::com::sun::star;
// INCLUDE ---------------------------------------------------------------
#include <math.h> // prevent conflict between exception and std::exception
#include "scitems.hxx"
#include <sfx2/fcontnr.hxx>
#include <editeng/eeitem.hxx>
#include <sfx2/objface.hxx>
#include <sfx2/app.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/docfile.hxx>
#include <sfx2/docfilt.hxx>
#include <svtools/ehdl.hxx>
#include <basic/sbxcore.hxx>
#include <sfx2/printer.hxx>
#include <sfx2/request.hxx>
#include <svtools/sfxecode.hxx>
#include <svx/ofaitem.hxx>
#include <sot/formats.hxx>
#include <svl/whiter.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/waitobj.hxx>
#include <tools/multisel.hxx>
#include <svx/dataaccessdescriptor.hxx>
#include <svx/drawitem.hxx>
#include <svx/fmview.hxx>
#include <svx/pageitem.hxx>
#include <svx/svditer.hxx>
#include <svx/svdpage.hxx>
#include <svx/fmshell.hxx>
#include <svtools/xwindowitem.hxx>
#include <sfx2/passwd.hxx>
#include <sfx2/filedlghelper.hxx>
#include <sfx2/docinsert.hxx>
#include <svl/PasswordHelper.hxx>
#include <svl/documentlockfile.hxx>
#include <svl/sharecontrolfile.hxx>
#include <comphelper/processfactory.hxx>
#include "docuno.hxx"
#include <com/sun/star/sdbc/XResultSet.hpp>
#include "docsh.hxx"
#include "docshimp.hxx"
#include "docfunc.hxx"
#include "sc.hrc"
#include "stlsheet.hxx"
#include "stlpool.hxx"
#include "appoptio.hxx"
#include "globstr.hrc"
#include "global.hxx"
//CHINA001 #include "styledlg.hxx"
//CHINA001 #include "hfedtdlg.hxx"
#include "dbdocfun.hxx"
#include "printfun.hxx" // DrawToDev
#include "viewdata.hxx"
#include "tabvwsh.hxx"
#include "impex.hxx"
#include "attrib.hxx"
//CHINA001 #include "corodlg.hxx"
#include "undodat.hxx"
#include "autostyl.hxx"
#include "undocell.hxx"
#include "undotab.hxx"
#include "inputhdl.hxx"
#include "dbcolect.hxx"
#include "servobj.hxx"
#include "rangenam.hxx"
#include "scmod.hxx"
//CHINA001 #include "scendlg.hxx"
#include "chgviset.hxx"
#include "reffact.hxx"
#include "chartlis.hxx"
#include "chartpos.hxx"
#include "waitoff.hxx"
#include "tablink.hxx" // ScDocumentLoader statics
#include "drwlayer.hxx"
#include "docoptio.hxx"
#include "undostyl.hxx"
#include "rangeseq.hxx"
#include "chgtrack.hxx"
#include "printopt.hxx"
#include <com/sun/star/document/UpdateDocMode.hpp>
#include "scresid.hxx" //add by CHINA001
#include "scabstdlg.hxx" //CHINA001
#include "externalrefmgr.hxx"
#include "sharedocdlg.hxx"
#include "conditio.hxx"
#include "sheetevents.hxx"
//------------------------------------------------------------------
#define IS_SHARE_HEADER(set) \
((SfxBoolItem&) \
((SvxSetItem&)(set).Get(ATTR_PAGE_HEADERSET)).GetItemSet(). \
Get(ATTR_PAGE_SHARED)).GetValue()
#define IS_SHARE_FOOTER(set) \
((SfxBoolItem&) \
((SvxSetItem&)(set).Get(ATTR_PAGE_FOOTERSET)).GetItemSet(). \
Get(ATTR_PAGE_SHARED)).GetValue()
#define IS_AVAILABLE(WhichId,ppItem) \
(pReqArgs->GetItemState((WhichId), sal_True, ppItem ) == SFX_ITEM_SET)
#define SC_PREVIEW_SIZE_X 10000
#define SC_PREVIEW_SIZE_Y 12400
//------------------------------------------------------------------
void ScDocShell::Execute( SfxRequest& rReq )
{
// SID_SC_RANGE (Range),
// SID_SC_CELLTEXT (CellText),
// SID_SC_CELLS (Cells) - removed (old Basic)
const SfxItemSet* pReqArgs = rReq.GetArgs();
SfxBindings* pBindings = GetViewBindings();
sal_Bool bUndo (aDocument.IsUndoEnabled());
sal_uInt16 nSlot = rReq.GetSlot();
switch ( nSlot )
{
case SID_SC_SETTEXT:
{
const SfxPoolItem* pColItem;
const SfxPoolItem* pRowItem;
const SfxPoolItem* pTabItem;
const SfxPoolItem* pTextItem;
if( pReqArgs && IS_AVAILABLE( FN_PARAM_1, &pColItem ) &&
IS_AVAILABLE( FN_PARAM_2, &pRowItem ) &&
IS_AVAILABLE( FN_PARAM_3, &pTabItem ) &&
IS_AVAILABLE( SID_SC_SETTEXT, &pTextItem ) )
{
// Parameter sind 1-based !!!
SCCOL nCol = ((SfxInt16Item*)pColItem)->GetValue() - 1;
SCROW nRow = ((SfxInt32Item*)pRowItem)->GetValue() - 1;
SCTAB nTab = ((SfxInt16Item*)pTabItem)->GetValue() - 1;
SCTAB nTabCount = aDocument.GetTableCount();
if ( ValidCol(nCol) && ValidRow(nRow) && ValidTab(nTab,nTabCount) )
{
if ( aDocument.IsBlockEditable( nTab, nCol,nRow, nCol, nRow ) )
{
String aVal = ((const SfxStringItem*)pTextItem)->GetValue();
aDocument.SetString( nCol, nRow, nTab, aVal );
PostPaintCell( nCol, nRow, nTab );
SetDocumentModified();
rReq.Done();
break;
}
else // geschuetzte Zelle
{
SbxBase::SetError( SbxERR_BAD_PARAMETER ); //! welchen Fehler ?
break;
}
}
}
SbxBase::SetError( SbxERR_NO_OBJECT );
}
break;
case SID_SBA_IMPORT:
{
if (pReqArgs)
{
const SfxPoolItem* pItem;
svx::ODataAccessDescriptor aDesc;
if ( pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET )
{
uno::Any aAny = static_cast<const SfxUsrAnyItem*>(pItem)->GetValue();
uno::Sequence<beans::PropertyValue> aProperties;
if ( aAny >>= aProperties )
aDesc.initializeFrom( aProperties );
}
String sTarget;
if ( pReqArgs->GetItemState( FN_PARAM_1, sal_True, &pItem ) == SFX_ITEM_SET )
sTarget = ((const SfxStringItem*)pItem)->GetValue();
sal_Bool bIsNewArea = sal_True; // Default sal_True (keine Nachfrage)
if ( pReqArgs->GetItemState( FN_PARAM_2, sal_True, &pItem ) == SFX_ITEM_SET )
bIsNewArea = ((const SfxBoolItem*)pItem)->GetValue();
// bei Bedarf neuen Datenbankbereich anlegen
sal_Bool bMakeArea = sal_False;
if (bIsNewArea)
{
ScDBCollection* pDBColl = aDocument.GetDBCollection();
sal_uInt16 nDummy;
if ( !pDBColl || !pDBColl->SearchName( sTarget, nDummy ) )
{
ScAddress aPos;
if ( aPos.Parse( sTarget, &aDocument, aDocument.GetAddressConvention() ) & SCA_VALID )
{
bMakeArea = sal_True;
if (bUndo)
{
String aStrImport = ScGlobal::GetRscString( STR_UNDO_IMPORTDATA );
GetUndoManager()->EnterListAction( aStrImport, aStrImport );
}
ScDBData* pDBData = GetDBData( ScRange(aPos), SC_DB_IMPORT, SC_DBSEL_KEEP );
DBG_ASSERT(pDBData, "kann DB-Daten nicht anlegen");
sTarget = pDBData->GetName();
}
}
}
// nachfragen, bevor alter DB-Bereich ueberschrieben wird
sal_Bool bDo = sal_True;
if (!bIsNewArea)
{
String aTemplate = ScGlobal::GetRscString( STR_IMPORT_REPLACE );
String aMessage = aTemplate.GetToken( 0, '#' );
aMessage += sTarget;
aMessage += aTemplate.GetToken( 1, '#' );
QueryBox aBox( 0, WinBits(WB_YES_NO | WB_DEF_YES), aMessage );
bDo = ( aBox.Execute() == RET_YES );
}
if (bDo)
{
ScDBDocFunc(*this).UpdateImport( sTarget, aDesc );
rReq.Done();
// UpdateImport aktualisiert auch die internen Operationen
}
else
rReq.Ignore();
if ( bMakeArea && bUndo)
GetUndoManager()->LeaveListAction();
}
else
{
DBG_ERROR( "arguments expected" );
}
}
break;
case SID_CHART_SOURCE:
case SID_CHART_ADDSOURCE:
if (pReqArgs)
{
ScDocument* pDoc = GetDocument();
// sal_Bool bUndo (pDoc->IsUndoEnabled());
const SfxPoolItem* pItem;
String aChartName, aRangeName;
ScRange aSingleRange;
ScRangeListRef aRangeListRef;
sal_Bool bMultiRange = sal_False;
sal_Bool bColHeaders = sal_True;
sal_Bool bRowHeaders = sal_True;
sal_Bool bColInit = sal_False;
sal_Bool bRowInit = sal_False;
sal_Bool bAddRange = (nSlot == SID_CHART_ADDSOURCE);
if( IS_AVAILABLE( SID_CHART_NAME, &pItem ) )
aChartName = ((const SfxStringItem*)pItem)->GetValue();
if( IS_AVAILABLE( SID_CHART_SOURCE, &pItem ) )
aRangeName = ((const SfxStringItem*)pItem)->GetValue();
if( IS_AVAILABLE( FN_PARAM_1, &pItem ) )
{
bColHeaders = ((const SfxBoolItem*)pItem)->GetValue();
bColInit = sal_True;
}
if( IS_AVAILABLE( FN_PARAM_2, &pItem ) )
{
bRowHeaders = ((const SfxBoolItem*)pItem)->GetValue();
bRowInit = sal_True;
}
ScAddress::Details aDetails(pDoc->GetAddressConvention(), 0, 0);
sal_Bool bValid = ( aSingleRange.ParseAny( aRangeName, pDoc, aDetails ) & SCA_VALID ) != 0;
if (!bValid)
{
aRangeListRef = new ScRangeList;
aRangeListRef->Parse( aRangeName, pDoc );
if ( aRangeListRef->Count() )
{
bMultiRange = sal_True;
aSingleRange = *aRangeListRef->GetObject(0); // fuer Header
bValid = sal_True;
}
else
aRangeListRef.Clear();
}
ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell();
if (pViewSh && bValid && aChartName.Len() != 0 )
{
Window* pParent = pViewSh->GetDialogParent();
SCCOL nCol1 = aSingleRange.aStart.Col();
SCROW nRow1 = aSingleRange.aStart.Row();
SCCOL nCol2 = aSingleRange.aEnd.Col();
SCROW nRow2 = aSingleRange.aEnd.Row();
SCTAB nTab = aSingleRange.aStart.Tab();
//! immer oder gar nicht begrenzen ???
if (!bMultiRange)
aDocument.LimitChartArea( nTab, nCol1,nRow1, nCol2,nRow2 );
// Dialog fuer Spalten/Zeilenkoepfe
sal_Bool bOk = sal_True;
if ( !bAddRange && ( !bColInit || !bRowInit ) )
{
ScChartPositioner aChartPositioner( &aDocument, nTab, nCol1,nRow1, nCol2,nRow2 );
if (!bColInit)
bColHeaders = aChartPositioner.HasColHeaders();
if (!bRowInit)
bRowHeaders = aChartPositioner.HasRowHeaders();
//CHINA001 ScColRowLabelDlg aDlg( pParent, bRowHeaders, bColHeaders );
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
AbstractScColRowLabelDlg* pDlg = pFact->CreateScColRowLabelDlg( pParent, RID_SCDLG_CHARTCOLROW, bRowHeaders, bColHeaders);
DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
if ( pDlg->Execute() == RET_OK ) //CHINA001 if ( aDlg.Execute() == RET_OK )
{
bColHeaders = pDlg->IsRow(); //CHINA001 bColHeaders = aDlg.IsRow(); // Spaltenkoepfe = 1. Zeile
bRowHeaders = pDlg->IsCol(); //CHINA001 bRowHeaders = aDlg.IsCol();
rReq.AppendItem(SfxBoolItem(FN_PARAM_1, bColHeaders));
rReq.AppendItem(SfxBoolItem(FN_PARAM_2, bRowHeaders));
}
else
bOk = sal_False;
delete pDlg; //CHINA001
}
if (bOk) // ausfuehren
{
if (bMultiRange)
{
if (bUndo)
{
GetUndoManager()->AddUndoAction(
new ScUndoChartData( this, aChartName, aRangeListRef,
bColHeaders, bRowHeaders, bAddRange ) );
}
aDocument.UpdateChartArea( aChartName, aRangeListRef,
bColHeaders, bRowHeaders, bAddRange );
}
else
{
ScRange aNewRange( nCol1,nRow1,nTab, nCol2,nRow2,nTab );
if (bUndo)
{
GetUndoManager()->AddUndoAction(
new ScUndoChartData( this, aChartName, aNewRange,
bColHeaders, bRowHeaders, bAddRange ) );
}
aDocument.UpdateChartArea( aChartName, aNewRange,
bColHeaders, bRowHeaders, bAddRange );
}
}
}
else
{
DBG_ERROR("UpdateChartArea: keine ViewShell oder falsche Daten");
}
rReq.Done();
}
else
{
DBG_ERROR("SID_CHART_SOURCE ohne Argumente");
}
break;
case FID_AUTO_CALC:
{
sal_Bool bNewVal;
const SfxPoolItem* pItem;
if ( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( nSlot, sal_True, &pItem ) )
bNewVal = ((const SfxBoolItem*)pItem)->GetValue();
else
bNewVal = !aDocument.GetAutoCalc(); // Toggle fuer Menue
aDocument.SetAutoCalc( bNewVal );
SetDocumentModified();
if (pBindings)
{
pBindings->Invalidate( FID_AUTO_CALC );
// pBindings->Invalidate( FID_RECALC ); // jetzt immer enabled
}
rReq.AppendItem( SfxBoolItem( FID_AUTO_CALC, bNewVal ) );
rReq.Done();
}
break;
case FID_RECALC:
DoRecalc( rReq.IsAPI() );
rReq.Done();
break;
case FID_HARD_RECALC:
DoHardRecalc( rReq.IsAPI() );
rReq.Done();
break;
case SID_UPDATETABLINKS:
{
ScDocument* pDoc = GetDocument();
ScLkUpdMode nSet=pDoc->GetLinkMode();
sal_uInt16 nDlgRet=RET_NO;
if(nSet==LM_UNKNOWN)
{
ScAppOptions aAppOptions=SC_MOD()->GetAppOptions();
nSet=aAppOptions.GetLinkMode();
}
if (nCanUpdate == com::sun::star::document::UpdateDocMode::NO_UPDATE)
nSet = LM_NEVER;
else if (nCanUpdate == com::sun::star::document::UpdateDocMode::QUIET_UPDATE &&
nSet == LM_ON_DEMAND)
nSet = LM_NEVER;
else if (nCanUpdate == com::sun::star::document::UpdateDocMode::FULL_UPDATE)
nSet = LM_ALWAYS;
if(nSet==LM_ON_DEMAND)
{
QueryBox aBox( GetActiveDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES),
ScGlobal::GetRscString(STR_RELOAD_TABLES) );
nDlgRet=aBox.Execute();
}
if (nDlgRet == RET_YES || nSet==LM_ALWAYS)
{
ReloadTabLinks();
aDocument.UpdateExternalRefLinks();
aDocument.UpdateDdeLinks();
aDocument.UpdateAreaLinks();
//! Test, ob Fehler
rReq.Done();
}
else
rReq.Ignore();
}
break;
case SID_REIMPORT_AFTER_LOAD:
{
// wird nach dem Laden aufgerufen, wenn DB-Bereiche mit
// weggelassenen Daten enthalten sind
sal_Bool bDone = sal_False;
ScDBCollection* pDBColl = aDocument.GetDBCollection();
if ((nCanUpdate != com::sun::star::document::UpdateDocMode::NO_UPDATE) &&
(nCanUpdate != com::sun::star::document::UpdateDocMode::QUIET_UPDATE))
{
ScRange aRange;
ScTabViewShell* pViewSh = GetBestViewShell();
DBG_ASSERT(pViewSh,"SID_REIMPORT_AFTER_LOAD: keine View");
if (pViewSh && pDBColl)
{
QueryBox aBox( GetActiveDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES),
ScGlobal::GetRscString(STR_REIMPORT_AFTER_LOAD) );
if (aBox.Execute() == RET_YES)
{
for (sal_uInt16 i=0; i<pDBColl->GetCount(); i++)
{
ScDBData* pDBData = (*pDBColl)[i];
if ( pDBData->IsStripData() &&
pDBData->HasImportParam() && !pDBData->HasImportSelection() )
{
pDBData->GetArea(aRange);
pViewSh->MarkRange(aRange);
// Import und interne Operationen wie SID_REFRESH_DBAREA
// (Abfrage auf Import hier nicht noetig)
ScImportParam aImportParam;
pDBData->GetImportParam( aImportParam );
sal_Bool bContinue = pViewSh->ImportData( aImportParam );
pDBData->SetImportParam( aImportParam );
// markieren (Groesse kann sich geaendert haben)
pDBData->GetArea(aRange);
pViewSh->MarkRange(aRange);
if ( bContinue ) // #41905# Fehler beim Import -> Abbruch
{
// interne Operationen, wenn welche gespeichert
if ( pDBData->HasQueryParam() || pDBData->HasSortParam() ||
pDBData->HasSubTotalParam() )
pViewSh->RepeatDB();
// Pivottabellen die den Bereich als Quelldaten haben
RefreshPivotTables(aRange);
}
}
}
bDone = sal_True;
}
}
}
if ( !bDone && pDBColl )
{
// wenn nicht, dann aber die abhaengigen Formeln updaten
//! auch fuer einzelne Bereiche, die nicht aktualisiert werden koennen
aDocument.CalcAll(); //! nur die abhaengigen
PostDataChanged();
}
if (bDone)
rReq.Done();
else
rReq.Ignore();
}
break;
case SID_AUTO_STYLE:
DBG_ERROR("use ScAutoStyleHint instead of SID_AUTO_STYLE");
break;
case SID_GET_COLORTABLE:
{
// passende ColorTable ist per PutItem gesetzt worden
const SvxColorTableItem* pColItem = static_cast< const SvxColorTableItem* >(GetItem(SID_COLOR_TABLE));
XColorListSharedPtr aTable = pColItem->GetColorTable();
rReq.SetReturnValue(SvxColorTableItem(aTable, SID_GET_COLORTABLE));
}
break;
case FID_CHG_RECORD:
{
ScDocument* pDoc = GetDocument();
if(pDoc!=NULL)
{
// get argument (recorded macro)
SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FID_CHG_RECORD, sal_False );
sal_Bool bDo = sal_True;
// xmlsec05/06:
// getting real parent window when called from Security-Options TP
Window* pParent = NULL;
const SfxPoolItem* pParentItem;
if( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( SID_ATTR_XWINDOW, sal_False, &pParentItem ) )
pParent = ( ( const XWindowItem* ) pParentItem )->GetWindowPtr();
// desired state
ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
sal_Bool bActivateTracking = (pChangeTrack == 0); // toggle
if ( pItem )
bActivateTracking = pItem->GetValue(); // from argument
if ( !bActivateTracking )
{
if ( !pItem )
{
// no dialog on playing the macro
WarningBox aBox( pParent ? pParent : GetActiveDialogParent(),
WinBits(WB_YES_NO | WB_DEF_NO),
ScGlobal::GetRscString( STR_END_REDLINING ) );
bDo = ( aBox.Execute() == RET_YES );
}
if ( bDo )
{
if ( pChangeTrack->IsProtected() )
bDo = ExecuteChangeProtectionDialog( NULL );
if ( bDo )
{
pDoc->EndChangeTracking();
PostPaintGridAll();
}
}
}
else
{
pDoc->StartChangeTracking();
ScChangeViewSettings aChangeViewSet;
aChangeViewSet.SetShowChanges(sal_True);
pDoc->SetChangeViewSettings(aChangeViewSet);
}
if ( bDo )
{
UpdateAcceptChangesDialog();
// Slots invalidieren
if (pBindings)
pBindings->InvalidateAll(sal_False);
if ( !pItem )
rReq.AppendItem( SfxBoolItem( FID_CHG_RECORD, bActivateTracking ) );
rReq.Done();
}
else
rReq.Ignore();
}
}
break;
case SID_CHG_PROTECT :
{
Window* pParent = NULL;
const SfxPoolItem* pParentItem;
if( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( SID_ATTR_XWINDOW, sal_False, &pParentItem ) )
pParent = ( ( const XWindowItem* ) pParentItem )->GetWindowPtr();
if ( ExecuteChangeProtectionDialog( pParent ) )
{
rReq.Done();
SetDocumentModified();
}
else
rReq.Ignore();
}
break;
case SID_DOCUMENT_MERGE:
case SID_DOCUMENT_COMPARE:
{
sal_Bool bDo = sal_True;
ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
if ( pChangeTrack && !pImpl->bIgnoreLostRedliningWarning )
{
if ( nSlot == SID_DOCUMENT_COMPARE )
{ //! old changes trace will be lost
WarningBox aBox( GetActiveDialogParent(),
WinBits(WB_YES_NO | WB_DEF_NO),
ScGlobal::GetRscString( STR_END_REDLINING ) );
if( aBox.Execute() == RET_YES )
bDo = ExecuteChangeProtectionDialog( NULL, sal_True );
else
bDo = sal_False;
}
else // merge might reject some actions
bDo = ExecuteChangeProtectionDialog( NULL, sal_True );
}
if ( !bDo )
{
rReq.Ignore();
break;
}
SfxApplication* pApp = SFX_APP();
const SfxPoolItem* pItem;
SfxMedium* pMed = NULL;
if ( pReqArgs &&
pReqArgs->GetItemState( SID_FILE_NAME, sal_True, &pItem ) == SFX_ITEM_SET &&
pItem->ISA(SfxStringItem) )
{
String aFileName = ((const SfxStringItem*)pItem)->GetValue();
String aFilterName;
if ( pReqArgs->GetItemState( SID_FILTER_NAME, sal_True, &pItem ) == SFX_ITEM_SET &&
pItem->ISA(SfxStringItem) )
{
aFilterName = ((const SfxStringItem*)pItem)->GetValue();
}
String aOptions;
if ( pReqArgs->GetItemState( SID_FILE_FILTEROPTIONS, sal_True, &pItem ) == SFX_ITEM_SET &&
pItem->ISA(SfxStringItem) )
{
aOptions = ((const SfxStringItem*)pItem)->GetValue();
}
short nVersion = 0;
if ( pReqArgs->GetItemState( SID_VERSION, sal_True, &pItem ) == SFX_ITEM_SET &&
pItem->ISA(SfxInt16Item) )
{
nVersion = ((const SfxInt16Item*)pItem)->GetValue();
}
// kein Filter angegeben -> Detection
if ( !aFilterName.Len() )
ScDocumentLoader::GetFilterName( aFileName, aFilterName, aOptions, sal_True, sal_False );
// filter name from dialog contains application prefix,
// GetFilter needs name without the prefix.
ScDocumentLoader::RemoveAppPrefix( aFilterName );
const SfxFilter* pFilter = ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName( aFilterName );
SfxItemSet* pSet = new SfxAllItemSet( pApp->GetPool() );
if ( aOptions.Len() )
pSet->Put( SfxStringItem( SID_FILE_FILTEROPTIONS, aOptions ) );
if ( nVersion != 0 )
pSet->Put( SfxInt16Item( SID_VERSION, nVersion ) );
pMed = new SfxMedium( aFileName, STREAM_STD_READ, sal_False, pFilter, pSet );
}
else
{
// start file dialog asynchronous
pImpl->bIgnoreLostRedliningWarning = true;
delete pImpl->pRequest;
pImpl->pRequest = new SfxRequest( rReq );
delete pImpl->pDocInserter;
pImpl->pDocInserter = new ::sfx2::DocumentInserter(
0, String::CreateFromAscii( ScDocShell::Factory().GetShortName() ), 0 );
pImpl->pDocInserter->StartExecuteModal( LINK( this, ScDocShell, DialogClosedHdl ) );
return ;
}
if ( pMed ) // nun wirklich ausfuehren...
{
SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, pMed->GetName() );
// pOtherDocSh->DoClose() will be called explicitly later, but it is still more safe to use SfxObjectShellLock here
ScDocShell* pOtherDocSh = new ScDocShell;
SfxObjectShellLock aDocShTablesRef = pOtherDocSh;
pOtherDocSh->DoLoad( pMed );
sal_uLong nErr = pOtherDocSh->GetErrorCode();
if (nErr)
ErrorHandler::HandleError( nErr ); // auch Warnings
if ( !pOtherDocSh->GetError() ) // nur Errors
{
sal_Bool bHadTrack = ( aDocument.GetChangeTrack() != NULL );
sal_uLong nStart = 0;
if ( nSlot == SID_DOCUMENT_MERGE && pChangeTrack )
{
nStart = pChangeTrack->GetActionMax() + 1;
}
if ( nSlot == SID_DOCUMENT_COMPARE )
CompareDocument( *pOtherDocSh->GetDocument() );
else
MergeDocument( *pOtherDocSh->GetDocument() );
// show "accept changes" dialog
//! get view for this document!
if ( !IsDocShared() )
{
SfxViewFrame* pViewFrm = SfxViewFrame::Current();
if ( pViewFrm )
{
pViewFrm->ShowChildWindow( ScAcceptChgDlgWrapper::GetChildWindowId(), sal_True ); //@51669
}
if ( pBindings )
{
pBindings->Invalidate( FID_CHG_ACCEPT );
}
}
rReq.SetReturnValue( SfxInt32Item( nSlot, 0 ) ); //! ???????
rReq.Done();
if (!bHadTrack) // neu eingeschaltet -> auch anzeigen
{
ScChangeViewSettings* pOldSet = aDocument.GetChangeViewSettings();
if ( !pOldSet || !pOldSet->ShowChanges() )
{
ScChangeViewSettings aChangeViewSet;
aChangeViewSet.SetShowChanges(sal_True);
aDocument.SetChangeViewSettings(aChangeViewSet);
}
}
else if ( nSlot == SID_DOCUMENT_MERGE && IsDocShared() && pChangeTrack )
{
sal_uLong nEnd = pChangeTrack->GetActionMax();
if ( nEnd >= nStart )
{
// only show changes from merged document
ScChangeViewSettings aChangeViewSet;
aChangeViewSet.SetShowChanges( sal_True );
aChangeViewSet.SetShowAccepted( sal_True );
aChangeViewSet.SetHasActionRange( true );
aChangeViewSet.SetTheActionRange( nStart, nEnd );
aDocument.SetChangeViewSettings( aChangeViewSet );
// update view
PostPaintExtras();
PostPaintGridAll();
}
}
}
pOtherDocSh->DoClose(); // delete passiert mit der Ref
}
}
break;
case SID_DELETE_SCENARIO:
if (pReqArgs)
{
const SfxPoolItem* pItem;
if ( pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET )
{
if ( pItem->ISA(SfxStringItem) )
{
String aName = ((const SfxStringItem*)pItem)->GetValue();
SCTAB nTab;
if (aDocument.GetTable( aName, nTab ))
{
// DeleteTable von viewfunc nach docfunc verschieben!
ScTabViewShell* pSh = GetBestViewShell();
if ( pSh )
{
//! SetTabNo in DeleteTable weglassen?
SCTAB nDispTab = pSh->GetViewData()->GetTabNo();
pSh->DeleteTable( nTab );
pSh->SetTabNo(nDispTab);
rReq.Done();
}
}
}
}
}
break;
case SID_EDIT_SCENARIO:
{
const SfxPoolItem* pItem;
if ( pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET )
{
if ( pItem->ISA(SfxStringItem) )
{
String aName = ((const SfxStringItem*)pItem)->GetValue();
SCTAB nTab;
if (aDocument.GetTable( aName, nTab ))
{
if (aDocument.IsScenario(nTab))
{
String aComment;
Color aColor;
sal_uInt16 nFlags;
aDocument.GetScenarioData( nTab, aComment, aColor, nFlags );
// Determine if the Sheet that the Scenario was created on
// is protected. But first we need to find that Sheet.
// Rewind back to the actual sheet.
SCTAB nActualTab = nTab;
do
{
nActualTab--;
}
while(aDocument.IsScenario(nActualTab));
sal_Bool bSheetProtected = aDocument.IsTabProtected(nActualTab);
//! anderen Titel am Dialog setzen
//CHINA001 ScNewScenarioDlg* pNewDlg =
//CHINA001 new ScNewScenarioDlg( GetActiveDialogParent(), aName, sal_True, bSheetProtected);
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
AbstractScNewScenarioDlg* pNewDlg = pFact->CreateScNewScenarioDlg( GetActiveDialogParent(), aName, RID_SCDLG_NEWSCENARIO, sal_True,bSheetProtected);
DBG_ASSERT(pNewDlg, "Dialog create fail!");//CHINA001
pNewDlg->SetScenarioData( aName, aComment, aColor, nFlags );
if ( pNewDlg->Execute() == RET_OK )
{
pNewDlg->GetScenarioData( aName, aComment, aColor, nFlags );
ModifyScenario( nTab, aName, aComment, aColor, nFlags );
rReq.Done();
}
delete pNewDlg;
}
}
}
}
}
break;
case SID_ATTR_YEAR2000 :
{
const SfxPoolItem* pItem;
if ( pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET )
{
if ( pItem->ISA(SfxUInt16Item) )
{
sal_uInt16 nY2k = ((SfxUInt16Item*)pItem)->GetValue();
// immer an den DocOptions setzen, damit das auch fuer SO50
// gespeichert wird (und alle Abfragen bisher auch darauf laufen).
// SetDocOptions propagiert das an den NumberFormatter
ScDocOptions aDocOpt( aDocument.GetDocOptions() );
aDocOpt.SetYear2000( nY2k );
aDocument.SetDocOptions( aDocOpt );
// die FormShell soll es mitbekommen
ScTabViewShell* pSh = GetBestViewShell();
if ( pSh )
{
FmFormShell* pFSh = pSh->GetFormShell();
if ( pFSh )
pFSh->SetY2KState( nY2k );
}
}
}
}
break;
case SID_SHARE_DOC:
{
ScViewData* pViewData = GetViewData();
if ( !pViewData )
{
rReq.Ignore();
break;
}
ScShareDocumentDlg aDlg( GetActiveDialogParent(), pViewData );
if ( aDlg.Execute() == RET_OK )
{
bool bSetShared = aDlg.IsShareDocumentChecked();
if ( bSetShared != static_cast< bool >( IsDocShared() ) )
{
if ( bSetShared )
{
bool bContinue = true;
if ( HasName() )
{
QueryBox aBox( GetActiveDialogParent(), WinBits( WB_YES_NO | WB_DEF_YES ),
ScGlobal::GetRscString( STR_DOC_WILLBESAVED ) );
if ( aBox.Execute() == RET_NO )
{
bContinue = false;
}
}
if ( bContinue )
{
EnableSharedSettings( true );
SC_MOD()->SetInSharedDocSaving( true );
if ( !SwitchToShared( sal_True, sal_True ) )
{
// TODO/LATER: what should be done in case the switch has failed?
// for example in case the user has cancelled the saveAs operation
}
SC_MOD()->SetInSharedDocSaving( false );
InvalidateName();
GetUndoManager()->Clear();
ScTabView* pTabView = dynamic_cast< ScTabView* >( pViewData->GetView() );
if ( pTabView )
{
pTabView->UpdateLayerLocks();
}
}
}
else
{
uno::Reference< frame::XModel > xModel;
try
{
// load shared file
xModel.set( LoadSharedDocument(), uno::UNO_QUERY_THROW );
uno::Reference< util::XCloseable > xCloseable( xModel, uno::UNO_QUERY_THROW );
// check if shared flag is set in shared file
bool bShared = false;
ScModelObj* pDocObj = ScModelObj::getImplementation( xModel );
if ( pDocObj )
{
ScDocShell* pDocShell = dynamic_cast< ScDocShell* >( pDocObj->GetEmbeddedObject() );
if ( pDocShell )
{
bShared = pDocShell->HasSharedXMLFlagSet();
}
}
// #i87870# check if shared status was disabled and enabled again
bool bOwnEntry = false;
try
{
::svt::ShareControlFile aControlFile( GetSharedFileURL() );
bOwnEntry = aControlFile.HasOwnEntry();
}
catch ( uno::Exception& )
{
}
if ( bShared && bOwnEntry )
{
uno::Reference< frame::XStorable > xStorable( xModel, uno::UNO_QUERY_THROW );
if ( xStorable->isReadonly() )
{
xCloseable->close( sal_True );
String aUserName( ScGlobal::GetRscString( STR_UNKNOWN_USER ) );
try
{
::svt::DocumentLockFile aLockFile( GetSharedFileURL() );
uno::Sequence< ::rtl::OUString > aData = aLockFile.GetLockData();
if ( aData.getLength() > LOCKFILE_SYSUSERNAME_ID )
{
if ( aData[LOCKFILE_OOOUSERNAME_ID].getLength() > 0 )
{
aUserName = aData[LOCKFILE_OOOUSERNAME_ID];
}
else if ( aData[LOCKFILE_SYSUSERNAME_ID].getLength() > 0 )
{
aUserName = aData[LOCKFILE_SYSUSERNAME_ID];
}
}
}
catch ( uno::Exception& )
{
}
String aMessage( ScGlobal::GetRscString( STR_FILE_LOCKED_TRY_LATER ) );
aMessage.SearchAndReplaceAscii( "%1", aUserName );
WarningBox aBox( GetActiveDialogParent(), WinBits( WB_OK ), aMessage );
aBox.Execute();
}
else
{
WarningBox aBox( GetActiveDialogParent(), WinBits( WB_YES_NO | WB_DEF_YES ),
ScGlobal::GetRscString( STR_DOC_DISABLESHARED ) );
if ( aBox.Execute() == RET_YES )
{
xCloseable->close( sal_True );
if ( !SwitchToShared( sal_False, sal_True ) )
{
// TODO/LATER: what should be done in case the switch has failed?
// for example in case the user has cancelled the saveAs operation
}
EnableSharedSettings( false );
if ( pBindings )
{
pBindings->ExecuteSynchron( SID_SAVEDOC );
}
ScTabView* pTabView = dynamic_cast< ScTabView* >( pViewData->GetView() );
if ( pTabView )
{
pTabView->UpdateLayerLocks();
}
}
else
{
xCloseable->close( sal_True );
}
}
}
else
{
xCloseable->close( sal_True );
WarningBox aBox( GetActiveDialogParent(), WinBits( WB_OK ),
ScGlobal::GetRscString( STR_DOC_NOLONGERSHARED ) );
aBox.Execute();
}
}
catch ( uno::Exception& )
{
DBG_ERROR( "SID_SHARE_DOC: caught exception\n" );
SC_MOD()->SetInSharedDocSaving( false );
try
{
uno::Reference< util::XCloseable > xClose( xModel, uno::UNO_QUERY_THROW );
xClose->close( sal_True );
}
catch ( uno::Exception& )
{
}
}
}
}
}
rReq.Done();
}
break;
default:
{
// kleiner (?) Hack -> forward der Slots an TabViewShell
ScTabViewShell* pSh = GetBestViewShell();
if ( pSh )
pSh->Execute( rReq );
else
SbxBase::SetError( SbxERR_NO_ACTIVE_OBJECT );
}
}
}
//------------------------------------------------------------------
void UpdateAcceptChangesDialog()
{
// update "accept changes" dialog
//! notify all views
SfxViewFrame* pViewFrm = SfxViewFrame::Current();
if ( pViewFrm && pViewFrm->HasChildWindow( FID_CHG_ACCEPT ) )
{
SfxChildWindow* pChild = pViewFrm->GetChildWindow( FID_CHG_ACCEPT );
if ( pChild )
((ScAcceptChgDlgWrapper*)pChild)->ReInitDlg();
}
}
//------------------------------------------------------------------
sal_Bool ScDocShell::ExecuteChangeProtectionDialog( Window* _pParent, sal_Bool bJustQueryIfProtected )
{
sal_Bool bDone = sal_False;
ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
if ( pChangeTrack )
{
sal_Bool bProtected = pChangeTrack->IsProtected();
if ( bJustQueryIfProtected && !bProtected )
return sal_True;
String aTitle( ScResId( bProtected ? SCSTR_CHG_UNPROTECT : SCSTR_CHG_PROTECT ) );
String aText( ScResId( SCSTR_PASSWORD ) );
String aPassword;
SfxPasswordDialog* pDlg = new SfxPasswordDialog(
_pParent ? _pParent : GetActiveDialogParent(), &aText );
pDlg->SetText( aTitle );
pDlg->SetMinLen( 1 );
pDlg->SetHelpId( GetStaticInterface()->GetSlot(SID_CHG_PROTECT)->GetCommand() );
pDlg->SetEditHelpId( HID_CHG_PROTECT );
if ( !bProtected )
pDlg->ShowExtras( SHOWEXTRAS_CONFIRM );
if ( pDlg->Execute() == RET_OK )
aPassword = pDlg->GetPassword();
delete pDlg;
if ( aPassword.Len() )
{
if ( bProtected )
{
if ( SvPasswordHelper::CompareHashPassword(pChangeTrack->GetProtection(), aPassword) )
{
if ( bJustQueryIfProtected )
bDone = sal_True;
else
pChangeTrack->SetProtection(
com::sun::star::uno::Sequence< sal_Int8 > (0) );
}
else
{
InfoBox aBox( GetActiveDialogParent(),
String( ScResId( SCSTR_WRONGPASSWORD ) ) );
aBox.Execute();
}
}
else
{
com::sun::star::uno::Sequence< sal_Int8 > aPass;
SvPasswordHelper::GetHashPassword( aPass, aPassword );
pChangeTrack->SetProtection( aPass );
}
if ( bProtected != pChangeTrack->IsProtected() )
{
UpdateAcceptChangesDialog();
bDone = sal_True;
}
}
}
else if ( bJustQueryIfProtected )
bDone = sal_True;
return bDone;
}
//------------------------------------------------------------------
void ScDocShell::DoRecalc( sal_Bool bApi )
{
sal_Bool bDone = sal_False;
ScTabViewShell* pSh = GetBestViewShell();
if ( pSh )
{
ScInputHandler* pHdl = SC_MOD()->GetInputHdl(pSh);
if ( pHdl && pHdl->IsInputMode() && pHdl->IsFormulaMode() && !bApi )
{
pHdl->FormulaPreview(); // Teilergebnis als QuickHelp
bDone = sal_True;
}
else
{
pSh->UpdateInputLine(); // InputEnterHandler
pSh->UpdateInputHandler();
}
}
if (!bDone) // sonst Dokument neu berechnen
{
WaitObject aWaitObj( GetActiveDialogParent() );
aDocument.CalcFormulaTree();
if ( pSh )
pSh->UpdateCharts(sal_True);
aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
// #47939# Wenn es Charts gibt, dann alles painten, damit nicht
// PostDataChanged und die Charts nacheinander kommen und Teile
// doppelt gepainted werden.
ScChartListenerCollection* pCharts = aDocument.GetChartListenerCollection();
if ( pCharts && pCharts->GetCount() )
PostPaintGridAll();
else
PostDataChanged();
}
}
void ScDocShell::DoHardRecalc( sal_Bool /* bApi */ )
{
WaitObject aWaitObj( GetActiveDialogParent() );
ScTabViewShell* pSh = GetBestViewShell();
if ( pSh )
{
pSh->UpdateInputLine(); // InputEnterHandler
pSh->UpdateInputHandler();
}
aDocument.CalcAll();
GetDocFunc().DetectiveRefresh(); // erzeugt eigenes Undo
if ( pSh )
pSh->UpdateCharts(sal_True);
// set notification flags for "calculate" event (used in SFX_HINT_DATACHANGED broadcast)
// (might check for the presence of any formulas on each sheet)
SCTAB nTabCount = aDocument.GetTableCount();
SCTAB nTab;
if (aDocument.HasAnySheetEventScript( SC_SHEETEVENT_CALCULATE, true )) // search also for VBA hendler
for (nTab=0; nTab<nTabCount; nTab++)
aDocument.SetCalcNotification(nTab);
// CalcAll doesn't broadcast value changes, so SC_HINT_CALCALL is broadcasted globally
// in addition to SFX_HINT_DATACHANGED.
aDocument.BroadcastUno( SfxSimpleHint( SC_HINT_CALCALL ) );
aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
// use hard recalc also to disable stream-copying of all sheets
// (somewhat consistent with charts)
for (nTab=0; nTab<nTabCount; nTab++)
if (aDocument.IsStreamValid(nTab))
aDocument.SetStreamValid(nTab, sal_False);
PostPaintGridAll();
}
//------------------------------------------------------------------
void ScDocShell::DoAutoStyle( const ScRange& rRange, const String& rStyle )
{
ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
ScStyleSheet* pStyleSheet =
pStylePool->FindCaseIns( rStyle, SFX_STYLE_FAMILY_PARA );
if (!pStyleSheet)
pStyleSheet = (ScStyleSheet*)
pStylePool->Find( ScGlobal::GetRscString(STR_STYLENAME_STANDARD), SFX_STYLE_FAMILY_PARA );
if (pStyleSheet)
{
DBG_ASSERT(rRange.aStart.Tab() == rRange.aEnd.Tab(),
"DoAutoStyle mit mehreren Tabellen");
SCTAB nTab = rRange.aStart.Tab();
SCCOL nStartCol = rRange.aStart.Col();
SCROW nStartRow = rRange.aStart.Row();
SCCOL nEndCol = rRange.aEnd.Col();
SCROW nEndRow = rRange.aEnd.Row();
aDocument.ApplyStyleAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, *pStyleSheet );
aDocument.ExtendMerge( nStartCol, nStartRow, nEndCol, nEndRow, nTab );
PostPaint( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab, PAINT_GRID );
}
}
//------------------------------------------------------------------
void ScDocShell::NotifyStyle( const SfxStyleSheetHint& rHint )
{
sal_uInt16 nId = rHint.GetHint();
const SfxStyleSheetBase* pStyle = rHint.GetStyleSheet();
if (!pStyle)
return;
if ( pStyle->GetFamily() == SFX_STYLE_FAMILY_PAGE )
{
if ( nId == SFX_STYLESHEET_MODIFIED )
{
ScDocShellModificator aModificator( *this );
String aNewName = pStyle->GetName();
String aOldName = aNewName;
sal_Bool bExtended = rHint.ISA(SfxStyleSheetHintExtended); // Name geaendert?
if (bExtended)
aOldName = ((SfxStyleSheetHintExtended&)rHint).GetOldName();
if ( aNewName != aOldName )
aDocument.RenamePageStyleInUse( aOldName, aNewName );
SCTAB nTabCount = aDocument.GetTableCount();
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
if (aDocument.GetPageStyle(nTab) == aNewName) // schon auf neu angepasst
{
aDocument.PageStyleModified( nTab, aNewName );
ScPrintFunc aPrintFunc( this, GetPrinter(), nTab );
aPrintFunc.UpdatePages();
}
aModificator.SetDocumentModified();
if (bExtended)
{
SfxBindings* pBindings = GetViewBindings();
if (pBindings)
{
pBindings->Invalidate( SID_STATUS_PAGESTYLE );
pBindings->Invalidate( SID_STYLE_FAMILY4 );
pBindings->Invalidate( FID_RESET_PRINTZOOM );
pBindings->Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT );
pBindings->Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT );
}
}
}
}
else if ( pStyle->GetFamily() == SFX_STYLE_FAMILY_PARA )
{
if ( nId == SFX_STYLESHEET_MODIFIED)
{
String aNewName = pStyle->GetName();
String aOldName = aNewName;
sal_Bool bExtended = rHint.ISA(SfxStyleSheetHintExtended);
if (bExtended)
aOldName = ((SfxStyleSheetHintExtended&)rHint).GetOldName();
if ( aNewName != aOldName )
{
ScConditionalFormatList* pList = aDocument.GetCondFormList();
if (pList)
pList->RenameCellStyle( aOldName,aNewName );
}
}
}
// alles andere geht ueber Slots...
}
// wie in printfun.cxx
#define ZOOM_MIN 10
void ScDocShell::SetPrintZoom( SCTAB nTab, sal_uInt16 nScale, sal_uInt16 nPages )
{
sal_Bool bUndo(aDocument.IsUndoEnabled());
String aStyleName = aDocument.GetPageStyle( nTab );
ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PAGE );
DBG_ASSERT( pStyleSheet, "PageStyle not found" );
if ( pStyleSheet )
{
ScDocShellModificator aModificator( *this );
SfxItemSet& rSet = pStyleSheet->GetItemSet();
if (bUndo)
{
sal_uInt16 nOldScale = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALE)).GetValue();
sal_uInt16 nOldPages = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALETOPAGES)).GetValue();
GetUndoManager()->AddUndoAction( new ScUndoPrintZoom(
this, nTab, nOldScale, nOldPages, nScale, nPages ) );
}
rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALE, nScale ) );
rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALETOPAGES, nPages ) );
ScPrintFunc aPrintFunc( this, GetPrinter(), nTab );
aPrintFunc.UpdatePages();
aModificator.SetDocumentModified();
SfxBindings* pBindings = GetViewBindings();
if (pBindings)
pBindings->Invalidate( FID_RESET_PRINTZOOM );
}
}
sal_Bool ScDocShell::AdjustPrintZoom( const ScRange& rRange )
{
sal_Bool bChange = sal_False;
SCTAB nTab = rRange.aStart.Tab();
String aStyleName = aDocument.GetPageStyle( nTab );
ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PAGE );
DBG_ASSERT( pStyleSheet, "PageStyle not found" );
if ( pStyleSheet )
{
SfxItemSet& rSet = pStyleSheet->GetItemSet();
sal_Bool bHeaders = ((const SfxBoolItem&)rSet.Get(ATTR_PAGE_HEADERS)).GetValue();
sal_uInt16 nOldScale = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALE)).GetValue();
sal_uInt16 nOldPages = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALETOPAGES)).GetValue();
const ScRange* pRepeatCol = aDocument.GetRepeatColRange( nTab );
const ScRange* pRepeatRow = aDocument.GetRepeatRowRange( nTab );
// benoetigte Skalierung fuer Selektion ausrechnen
sal_uInt16 nNewScale = nOldScale;
long nBlkTwipsX = 0;
if (bHeaders)
nBlkTwipsX += (long) PRINT_HEADER_WIDTH;
SCCOL nStartCol = rRange.aStart.Col();
SCCOL nEndCol = rRange.aEnd.Col();
if ( pRepeatCol && nStartCol >= pRepeatCol->aStart.Col() )
{
for (SCCOL i=pRepeatCol->aStart.Col(); i<=pRepeatCol->aEnd.Col(); i++ )
nBlkTwipsX += aDocument.GetColWidth( i, nTab );
if ( nStartCol <= pRepeatCol->aEnd.Col() )
nStartCol = pRepeatCol->aEnd.Col() + 1;
}
// legacy compilers' own scope for i
{
for ( SCCOL i=nStartCol; i<=nEndCol; i++ )
nBlkTwipsX += aDocument.GetColWidth( i, nTab );
}
long nBlkTwipsY = 0;
if (bHeaders)
nBlkTwipsY += (long) PRINT_HEADER_HEIGHT;
SCROW nStartRow = rRange.aStart.Row();
SCROW nEndRow = rRange.aEnd.Row();
if ( pRepeatRow && nStartRow >= pRepeatRow->aStart.Row() )
{
nBlkTwipsY += aDocument.GetRowHeight( pRepeatRow->aStart.Row(),
pRepeatRow->aEnd.Row(), nTab );
if ( nStartRow <= pRepeatRow->aEnd.Row() )
nStartRow = pRepeatRow->aEnd.Row() + 1;
}
nBlkTwipsY += aDocument.GetRowHeight( nStartRow, nEndRow, nTab );
Size aPhysPage;
long nHdr, nFtr;
ScPrintFunc aOldPrFunc( this, GetPrinter(), nTab );
aOldPrFunc.GetScaleData( aPhysPage, nHdr, nFtr );
nBlkTwipsY += nHdr + nFtr;
if ( nBlkTwipsX == 0 ) // #100639# hidden columns/rows may lead to 0
nBlkTwipsX = 1;
if ( nBlkTwipsY == 0 )
nBlkTwipsY = 1;
long nNeeded = Min( aPhysPage.Width() * 100 / nBlkTwipsX,
aPhysPage.Height() * 100 / nBlkTwipsY );
if ( nNeeded < ZOOM_MIN )
nNeeded = ZOOM_MIN; // Begrenzung
if ( nNeeded < (long) nNewScale )
nNewScale = (sal_uInt16) nNeeded;
bChange = ( nNewScale != nOldScale || nOldPages != 0 );
if ( bChange )
SetPrintZoom( nTab, nNewScale, 0 );
}
return bChange;
}
void ScDocShell::PageStyleModified( const String& rStyleName, sal_Bool bApi )
{
ScDocShellModificator aModificator( *this );
sal_Bool bWarn = sal_False;
SCTAB nTabCount = aDocument.GetTableCount();
SCTAB nUseTab = MAXTAB+1;
for (SCTAB nTab=0; nTab<nTabCount && nUseTab>MAXTAB; nTab++)
if ( aDocument.GetPageStyle(nTab) == rStyleName &&
( !bApi || aDocument.GetPageSize(nTab).Width() ) )
nUseTab = nTab;
// bei bApi nur, wenn Umbrueche schon angezeigt
if (ValidTab(nUseTab)) // nicht verwendet -> nichts zu tun
{
ScPrintFunc aPrintFunc( this, GetPrinter(), nUseTab ); //! ohne CountPages auskommen
if (!aPrintFunc.UpdatePages()) // setzt Umbrueche auf allen Tabs
bWarn = sal_True;
if (bWarn && !bApi)
{
ScWaitCursorOff aWaitOff( GetActiveDialogParent() );
InfoBox aInfoBox(GetActiveDialogParent(),
ScGlobal::GetRscString(STR_PRINT_INVALID_AREA));
aInfoBox.Execute();
}
}
aModificator.SetDocumentModified();
SfxBindings* pBindings = GetViewBindings();
if (pBindings)
{
pBindings->Invalidate( FID_RESET_PRINTZOOM );
pBindings->Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT );
pBindings->Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT );
}
}
void ScDocShell::ExecutePageStyle( SfxViewShell& rCaller,
SfxRequest& rReq,
SCTAB nCurTab )
{
const SfxItemSet* pReqArgs = rReq.GetArgs();
switch ( rReq.GetSlot() )
{
case SID_STATUS_PAGESTYLE: // Click auf StatusBar-Control
case SID_FORMATPAGE:
{
if ( pReqArgs != NULL )
{
}
else if ( pReqArgs == NULL )
{
sal_Bool bUndo(aDocument.IsUndoEnabled());
String aOldName = aDocument.GetPageStyle( nCurTab );
ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet
= pStylePool->Find( aOldName, SFX_STYLE_FAMILY_PAGE );
DBG_ASSERT( pStyleSheet, "PageStyle not found! :-/" );
if ( pStyleSheet )
{
ScStyleSaveData aOldData;
if (bUndo)
aOldData.InitFromStyle( pStyleSheet );
SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
//CHINA001 ScStyleDlg* pDlg = new ScStyleDlg( GetActiveDialogParent(),
//CHINA001 *pStyleSheet,
//CHINA001 RID_SCDLG_STYLES_PAGE );
//CHINA001
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
SfxAbstractTabDialog* pDlg = pFact->CreateScStyleDlg( GetActiveDialogParent(), *pStyleSheet, RID_SCDLG_STYLES_PAGE, RID_SCDLG_STYLES_PAGE );
DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
if ( pDlg->Execute() == RET_OK )
{
const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
WaitObject aWait( GetActiveDialogParent() );
String aNewName = pStyleSheet->GetName();
if ( aNewName != aOldName &&
aDocument.RenamePageStyleInUse( aOldName, aNewName ) )
{
SfxBindings* pBindings = GetViewBindings();
if (pBindings)
{
pBindings->Invalidate( SID_STATUS_PAGESTYLE );
pBindings->Invalidate( FID_RESET_PRINTZOOM );
}
}
if ( pOutSet )
aDocument.ModifyStyleSheet( *pStyleSheet, *pOutSet );
// merken fuer GetState():
GetPageOnFromPageStyleSet( &rStyleSet, nCurTab, bHeaderOn, bFooterOn );
rCaller.GetViewFrame()->GetBindings().Invalidate( SID_HFEDIT );
ScStyleSaveData aNewData;
aNewData.InitFromStyle( pStyleSheet );
if (bUndo)
{
GetUndoManager()->AddUndoAction(
new ScUndoModifyStyle( this, SFX_STYLE_FAMILY_PAGE,
aOldData, aNewData ) );
}
PageStyleModified( aNewName, sal_False );
rReq.Done();
}
delete pDlg;
rStyleSet.ClearItem( ATTR_PAGE_PAPERTRAY );
}
}
}
break;
case SID_HFEDIT:
{
if ( pReqArgs != NULL )
{
}
else if ( pReqArgs == NULL )
{
String aStr( aDocument.GetPageStyle( nCurTab ) );
ScStyleSheetPool* pStylePool
= aDocument.GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet
= pStylePool->Find( aStr, SFX_STYLE_FAMILY_PAGE );
DBG_ASSERT( pStyleSheet, "PageStyle not found! :-/" );
if ( pStyleSheet )
{
SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
SvxPageUsage eUsage =
SvxPageUsage( ((const SvxPageItem&)
rStyleSet.Get( ATTR_PAGE )).
GetPageUsage() );
sal_Bool bShareHeader = IS_SHARE_HEADER(rStyleSet);
sal_Bool bShareFooter = IS_SHARE_FOOTER(rStyleSet);
sal_uInt16 nResId = 0;
switch ( eUsage )
{
case SVX_PAGE_LEFT:
case SVX_PAGE_RIGHT:
{
if ( bHeaderOn && bFooterOn )
nResId = RID_SCDLG_HFEDIT;
else if ( SVX_PAGE_RIGHT == eUsage )
{
if ( !bHeaderOn && bFooterOn )
nResId = RID_SCDLG_HFEDIT_RIGHTFOOTER;
else if ( bHeaderOn && !bFooterOn )
nResId = RID_SCDLG_HFEDIT_RIGHTHEADER;
}
else
{
// #69193a# respect "shared" setting
if ( !bHeaderOn && bFooterOn )
nResId = bShareFooter ?
RID_SCDLG_HFEDIT_RIGHTFOOTER :
RID_SCDLG_HFEDIT_LEFTFOOTER;
else if ( bHeaderOn && !bFooterOn )
nResId = bShareHeader ?
RID_SCDLG_HFEDIT_RIGHTHEADER :
RID_SCDLG_HFEDIT_LEFTHEADER;
}
}
break;
case SVX_PAGE_MIRROR:
case SVX_PAGE_ALL:
default:
{
if ( !bShareHeader && !bShareFooter )
{
if ( bHeaderOn && bFooterOn )
nResId = RID_SCDLG_HFEDIT_ALL;
else if ( !bHeaderOn && bFooterOn )
nResId = RID_SCDLG_HFEDIT_FOOTER;
else if ( bHeaderOn && !bFooterOn )
nResId = RID_SCDLG_HFEDIT_HEADER;
}
else if ( bShareHeader && bShareFooter )
{
if ( bHeaderOn && bFooterOn )
nResId = RID_SCDLG_HFEDIT;
else
{
if ( !bHeaderOn && bFooterOn )
nResId = RID_SCDLG_HFEDIT_RIGHTFOOTER;
else if ( bHeaderOn && !bFooterOn )
nResId = RID_SCDLG_HFEDIT_RIGHTHEADER;
}
}
else if ( !bShareHeader && bShareFooter )
{
if ( bHeaderOn && bFooterOn )
nResId = RID_SCDLG_HFEDIT_SFTR;
else if ( !bHeaderOn && bFooterOn )
nResId = RID_SCDLG_HFEDIT_RIGHTFOOTER;
else if ( bHeaderOn && !bFooterOn )
nResId = RID_SCDLG_HFEDIT_HEADER;
}
else if ( bShareHeader && !bShareFooter )
{
if ( bHeaderOn && bFooterOn )
nResId = RID_SCDLG_HFEDIT_SHDR;
else if ( !bHeaderOn && bFooterOn )
nResId = RID_SCDLG_HFEDIT_FOOTER;
else if ( bHeaderOn && !bFooterOn )
nResId = RID_SCDLG_HFEDIT_RIGHTHEADER;
}
}
}
//CHINA001 ScHFEditDlg* pDlg
//CHINA001 = new ScHFEditDlg( SFX_APP()->GetViewFrame(),
//CHINA001 GetActiveDialogParent(),
//CHINA001 rStyleSet,
//CHINA001 aStr,
//CHINA001 nResId );
//CHINA001
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
SfxAbstractTabDialog* pDlg = pFact->CreateScHFEditDlg( SfxViewFrame::Current(),
GetActiveDialogParent(),
rStyleSet,
aStr,
RID_SCDLG_HFEDIT, nResId);
DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
if ( pDlg->Execute() == RET_OK )
{
const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
if ( pOutSet )
aDocument.ModifyStyleSheet( *pStyleSheet, *pOutSet );
SetDocumentModified();
rReq.Done();
}
delete pDlg;
}
}
}
break;
default:
break;
}
}
void ScDocShell::GetStatePageStyle( SfxViewShell& /* rCaller */,
SfxItemSet& rSet,
SCTAB nCurTab )
{
SfxWhichIter aIter(rSet);
sal_uInt16 nWhich = aIter.FirstWhich();
while ( nWhich )
{
switch (nWhich)
{
case SID_STATUS_PAGESTYLE:
rSet.Put( SfxStringItem( nWhich, aDocument.GetPageStyle( nCurTab ) ) );
break;
case SID_HFEDIT:
{
String aStr = aDocument.GetPageStyle( nCurTab );
ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStr, SFX_STYLE_FAMILY_PAGE );
DBG_ASSERT( pStyleSheet, "PageStyle not found! :-/" );
if ( pStyleSheet )
{
SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
GetPageOnFromPageStyleSet( &rStyleSet, nCurTab, bHeaderOn, bFooterOn );
if ( !bHeaderOn && !bFooterOn )
rSet.DisableItem( nWhich );
}
}
break;
}
nWhich = aIter.NextWhich();
}
}
void ScDocShell::GetState( SfxItemSet &rSet )
{
SfxWhichIter aIter(rSet);
sal_uInt16 nWhich = aIter.FirstWhich();
while ( nWhich )
{
switch (nWhich)
{
case FID_AUTO_CALC:
if ( (sal_Bool) aDocument.GetHardRecalcState() )
rSet.DisableItem( nWhich );
else
rSet.Put( SfxBoolItem( nWhich, aDocument.GetAutoCalc() ) );
break;
case FID_CHG_RECORD:
if ( IsDocShared() )
rSet.DisableItem( nWhich );
else
rSet.Put( SfxBoolItem( nWhich,
aDocument.GetChangeTrack() != NULL ) );
break;
case SID_CHG_PROTECT:
{
ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
if ( pChangeTrack && !IsDocShared() )
rSet.Put( SfxBoolItem( nWhich,
pChangeTrack->IsProtected() ) );
else
rSet.DisableItem( nWhich );
}
break;
case SID_DOCUMENT_COMPARE:
{
if ( IsDocShared() )
{
rSet.DisableItem( nWhich );
}
}
break;
// Wenn eine Formel editiert wird, muss FID_RECALC auf jeden Fall enabled sein.
// Recalc fuer das Doc war mal wegen #29898# disabled, wenn AutoCalc an war,
// ist jetzt wegen #41540# aber auch immer enabled.
// case FID_RECALC:
// if ( aDocument.GetAutoCalc() )
// rSet.DisableItem( nWhich );
// break;
case SID_TABLES_COUNT:
rSet.Put( SfxInt16Item( nWhich, aDocument.GetTableCount() ) );
break;
case SID_ATTR_YEAR2000 :
rSet.Put( SfxUInt16Item( nWhich,
aDocument.GetDocOptions().GetYear2000() ) );
break;
case SID_SHARE_DOC:
{
if ( IsReadOnly() )
{
rSet.DisableItem( nWhich );
}
}
break;
default:
{
}
break;
}
nWhich = aIter.NextWhich();
}
}
void ScDocShell::GetSbxState( SfxItemSet &rSet )
{
// SID_SC_SELECTION (Selection),
// SID_SC_ACTIVECELL (ActiveCell),
// SID_SC_ACTIVETAB (ActiveTable),
// SID_TABLES_GET (Tables),
// SID_PIVOT_GET (DataPilotTables) - removed (old Basic)
//
// Wenn hier Slots von der View-Shell executed werden, muss auch der
// GetState weitergeleitet werden!
//
ScTabViewShell* pVisibleSh = GetBestViewShell(); // sichtbare View
if ( pVisibleSh )
pVisibleSh->GetState( rSet );
}
void __EXPORT ScDocShell::Draw( OutputDevice* pDev, const JobSetup & /* rSetup */, sal_uInt16 nAspect )
{
// bIsOle = sal_True; // jetzt ueber den CreateMode
SCTAB nVisTab = aDocument.GetVisibleTab();
if (!aDocument.HasTable(nVisTab))
return;
sal_uLong nOldLayoutMode = pDev->GetLayoutMode();
pDev->SetLayoutMode( TEXT_LAYOUT_DEFAULT ); // even if it's the same, to get the metafile action
if ( nAspect == ASPECT_THUMBNAIL )
{
Rectangle aBoundRect = GetVisArea( ASPECT_THUMBNAIL );
ScViewData aTmpData( this, NULL );
aTmpData.SetTabNo(nVisTab);
aDocument.SnapVisArea( aBoundRect );
aTmpData.SetScreen( aBoundRect );
ScPrintFunc::DrawToDev( &aDocument, pDev, 1.0, aBoundRect, &aTmpData, sal_True );
}
else
{
Rectangle aBoundRect = SfxObjectShell::GetVisArea();
ScViewData aTmpData( this, NULL );
aTmpData.SetTabNo(nVisTab);
aDocument.SnapVisArea( aBoundRect );
aTmpData.SetScreen( aBoundRect );
ScPrintFunc::DrawToDev( &aDocument, pDev, 1.0, aBoundRect, &aTmpData, sal_True );
}
pDev->SetLayoutMode( nOldLayoutMode );
}
Rectangle __EXPORT ScDocShell::GetVisArea( sal_uInt16 nAspect ) const
{
SfxObjectCreateMode eShellMode = GetCreateMode();
if ( eShellMode == SFX_CREATE_MODE_ORGANIZER )
{
// ohne Inhalte wissen wir auch nicht, wie gross die Inhalte sind
// leeres Rechteck zurueckgeben, das wird dann nach dem Laden berechnet
return Rectangle();
}
if( nAspect == ASPECT_THUMBNAIL )
{
// Rectangle aArea( 0,0, 3175,3175 ); // 120x120 Pixel in 1:1
Rectangle aArea( 0,0, SC_PREVIEW_SIZE_X,SC_PREVIEW_SIZE_Y );
sal_Bool bNegativePage = aDocument.IsNegativePage( aDocument.GetVisibleTab() );
if ( bNegativePage )
ScDrawLayer::MirrorRectRTL( aArea );
aDocument.SnapVisArea( aArea );
return aArea;
}
else if( nAspect == ASPECT_CONTENT && eShellMode != SFX_CREATE_MODE_EMBEDDED )
{
// Visarea holen wie nach Load
SCTAB nVisTab = aDocument.GetVisibleTab();
if (!aDocument.HasTable(nVisTab))
{
nVisTab = 0;
((ScDocShell*)this)->aDocument.SetVisibleTab(nVisTab);
}
SCCOL nStartCol;
SCROW nStartRow;
aDocument.GetDataStart( nVisTab, nStartCol, nStartRow );
SCCOL nEndCol;
SCROW nEndRow;
aDocument.GetPrintArea( nVisTab, nEndCol, nEndRow );
if (nStartCol>nEndCol)
nStartCol = nEndCol;
if (nStartRow>nEndRow)
nStartRow = nEndRow;
Rectangle aNewArea = ((ScDocument&)aDocument)
.GetMMRect( nStartCol,nStartRow, nEndCol,nEndRow, nVisTab );
//TODO/LATER: different methods for setting VisArea?!
((ScDocShell*)this)->SfxObjectShell::SetVisArea( aNewArea );
return aNewArea;
}
else
return SfxObjectShell::GetVisArea( nAspect );
}
void ScDocShell::GetPageOnFromPageStyleSet( const SfxItemSet* pStyleSet,
SCTAB nCurTab,
sal_Bool& rbHeader,
sal_Bool& rbFooter )
{
if ( !pStyleSet )
{
ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet = pStylePool->
Find( aDocument.GetPageStyle( nCurTab ),
SFX_STYLE_FAMILY_PAGE );
DBG_ASSERT( pStyleSheet, "PageStyle not found! :-/" );
if ( pStyleSheet )
pStyleSet = &pStyleSheet->GetItemSet();
else
rbHeader = rbFooter = sal_False;
}
DBG_ASSERT( pStyleSet, "PageStyle-Set not found! :-(" );
//--------------------------------------------------------------------
const SvxSetItem* pSetItem = NULL;
const SfxItemSet* pSet = NULL;
pSetItem = (const SvxSetItem*) &pStyleSet->Get( ATTR_PAGE_HEADERSET );
pSet = &pSetItem->GetItemSet();
rbHeader = ((const SfxBoolItem&)pSet->Get(ATTR_PAGE_ON)).GetValue();
pSetItem = (const SvxSetItem*) &pStyleSet->Get( ATTR_PAGE_FOOTERSET );
pSet = &pSetItem->GetItemSet();
rbFooter = ((const SfxBoolItem&)pSet->Get(ATTR_PAGE_ON)).GetValue();
}
long __EXPORT ScDocShell::DdeGetData( const String& rItem,
const String& rMimeType,
::com::sun::star::uno::Any & rValue )
{
if( FORMAT_STRING == SotExchange::GetFormatIdFromMimeType( rMimeType ) )
{
if( rItem.EqualsIgnoreCaseAscii( "Format" ) )
{
ByteString aFmtByte( aDdeTextFmt, gsl_getSystemTextEncoding() );
rValue <<= ::com::sun::star::uno::Sequence< sal_Int8 >(
(sal_Int8*)aFmtByte.GetBuffer(),
aFmtByte.Len() + 1 );
return 1;
}
ScImportExport aObj( &aDocument, rItem );
if ( !aObj.IsRef() )
return 0; // ungueltiger Bereich
if( aDdeTextFmt.GetChar(0) == 'F' )
aObj.SetFormulas( sal_True );
if( aDdeTextFmt.EqualsAscii( "SYLK" ) ||
aDdeTextFmt.EqualsAscii( "FSYLK" ) )
{
ByteString aData;
if( aObj.ExportByteString( aData, gsl_getSystemTextEncoding(),
SOT_FORMATSTR_ID_SYLK ) )
{
rValue <<= ::com::sun::star::uno::Sequence< sal_Int8 >(
(sal_Int8*)aData.GetBuffer(),
aData.Len() + 1 );
return 1;
}
else
return 0;
}
if( aDdeTextFmt.EqualsAscii( "CSV" ) ||
aDdeTextFmt.EqualsAscii( "FCSV" ) )
aObj.SetSeparator( ',' );
aObj.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::ToSpace, 0, false ) );
return aObj.ExportData( rMimeType, rValue ) ? 1 : 0;
}
ScImportExport aObj( &aDocument, rItem );
aObj.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::ToSpace, 0, false ) );
if( aObj.IsRef() )
return aObj.ExportData( rMimeType, rValue ) ? 1 : 0;
return 0;
}
long __EXPORT ScDocShell::DdeSetData( const String& rItem,
const String& rMimeType,
const ::com::sun::star::uno::Any & rValue )
{
if( FORMAT_STRING == SotExchange::GetFormatIdFromMimeType( rMimeType ))
{
if( rItem.EqualsIgnoreCaseAscii( "Format" ) )
{
if ( ScByteSequenceToString::GetString( aDdeTextFmt, rValue, gsl_getSystemTextEncoding() ) )
{
aDdeTextFmt.ToUpperAscii();
return 1;
}
return 0;
}
ScImportExport aObj( &aDocument, rItem );
if( aDdeTextFmt.GetChar(0) == 'F' )
aObj.SetFormulas( sal_True );
if( aDdeTextFmt.EqualsAscii( "SYLK" ) ||
aDdeTextFmt.EqualsAscii( "FSYLK" ) )
{
String aData;
if ( ScByteSequenceToString::GetString( aData, rValue, gsl_getSystemTextEncoding() ) )
{
return aObj.ImportString( aData, SOT_FORMATSTR_ID_SYLK ) ? 1 : 0;
}
return 0;
}
if( aDdeTextFmt.EqualsAscii( "CSV" ) ||
aDdeTextFmt.EqualsAscii( "FCSV" ) )
aObj.SetSeparator( ',' );
return aObj.ImportData( rMimeType, rValue ) ? 1 : 0;
}
ScImportExport aObj( &aDocument, rItem );
if( aObj.IsRef() )
return aObj.ImportData( rMimeType, rValue ) ? 1 : 0;
return 0;
}
::sfx2::SvLinkSource* __EXPORT ScDocShell::DdeCreateLinkSource( const String& rItem )
{
// only check for valid item string - range is parsed again in ScServerObject ctor
// named range?
String aPos = rItem;
ScRangeName* pRange = aDocument.GetRangeName();
if( pRange )
{
sal_uInt16 nPos;
if( pRange->SearchName( aPos, nPos ) )
{
ScRangeData* pData = (*pRange)[ nPos ];
if( pData->HasType( RT_REFAREA )
|| pData->HasType( RT_ABSAREA )
|| pData->HasType( RT_ABSPOS ) )
pData->GetSymbol( aPos ); // continue with the name's contents
}
}
// Address in DDE function must be always parsed as CONV_OOO so that it
// would always work regardless of current address convension. We do this
// because the address item in a DDE entry is *not* normalized when saved
// into ODF.
ScRange aRange;
bool bValid = ( (aRange.Parse(aPos, &aDocument, formula::FormulaGrammar::CONV_OOO ) & SCA_VALID) ||
(aRange.aStart.Parse(aPos, &aDocument, formula::FormulaGrammar::CONV_OOO) & SCA_VALID) );
ScServerObject* pObj = NULL; // NULL = error
if ( bValid )
pObj = new ScServerObject( this, rItem );
// GetLinkManager()->InsertServer() is in the ScServerObject ctor
return pObj;
}
//------------------------------------------------------------------
ScViewData* ScDocShell::GetViewData()
{
SfxViewShell* pCur = SfxViewShell::Current();
ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,pCur);
return pViewSh ? pViewSh->GetViewData() : NULL;
}
//------------------------------------------------------------------
SCTAB ScDocShell::GetCurTab()
{
//! this must be made non-static and use a ViewShell from this document!
ScViewData* pViewData = GetViewData();
return pViewData ? pViewData->GetTabNo() : static_cast<SCTAB>(0);
}
ScTabViewShell* ScDocShell::GetBestViewShell( sal_Bool bOnlyVisible )
{
ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell();
// falsches Doc?
if( pViewSh && pViewSh->GetViewData()->GetDocShell() != this )
pViewSh = NULL;
if( !pViewSh )
{
// 1. ViewShell suchen
SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this, bOnlyVisible );
if( pFrame )
{
SfxViewShell* p = pFrame->GetViewShell();
pViewSh = PTR_CAST(ScTabViewShell,p);
}
}
return pViewSh;
}
SfxBindings* ScDocShell::GetViewBindings()
{
// used to invalidate slots after changes to this document
SfxViewShell* pViewSh = GetBestViewShell();
if (pViewSh)
return &pViewSh->GetViewFrame()->GetBindings();
else
return NULL;
}
//------------------------------------------------------------------
ScDocShell* ScDocShell::GetShellByNum( sal_uInt16 nDocNo ) // static
{
ScDocShell* pFound = NULL;
SfxObjectShell* pShell = SfxObjectShell::GetFirst();
sal_uInt16 nShellCnt = 0;
while ( pShell && !pFound )
{
if ( pShell->Type() == TYPE(ScDocShell) )
{
if ( nShellCnt == nDocNo )
pFound = (ScDocShell*) pShell;
else
++nShellCnt;
}
pShell = SfxObjectShell::GetNext( *pShell );
}
return pFound;
}
//------------------------------------------------------------------
IMPL_LINK( ScDocShell, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg )
{
DBG_ASSERT( _pFileDlg, "ScDocShell::DialogClosedHdl(): no file dialog" );
DBG_ASSERT( pImpl->pDocInserter, "ScDocShell::DialogClosedHdl(): no document inserter" );
if ( ERRCODE_NONE == _pFileDlg->GetError() )
{
sal_uInt16 nSlot = pImpl->pRequest->GetSlot();
SfxMedium* pMed = pImpl->pDocInserter->CreateMedium();
// #i87094# If a .odt was selected pMed is NULL.
if (pMed)
{
pImpl->pRequest->AppendItem( SfxStringItem( SID_FILE_NAME, pMed->GetName() ) );
if ( SID_DOCUMENT_COMPARE == nSlot )
{
if ( pMed->GetFilter() )
pImpl->pRequest->AppendItem(
SfxStringItem( SID_FILTER_NAME, pMed->GetFilter()->GetFilterName() ) );
String sOptions = ScDocumentLoader::GetOptions( *pMed );
if ( sOptions.Len() > 0 )
pImpl->pRequest->AppendItem( SfxStringItem( SID_FILE_FILTEROPTIONS, sOptions ) );
}
const SfxPoolItem* pItem = NULL;
SfxItemSet* pSet = pMed->GetItemSet();
if ( pSet &&
pSet->GetItemState( SID_VERSION, sal_True, &pItem ) == SFX_ITEM_SET &&
pItem->ISA( SfxInt16Item ) )
{
pImpl->pRequest->AppendItem( *pItem );
}
Execute( *(pImpl->pRequest) );
}
}
pImpl->bIgnoreLostRedliningWarning = false;
return 0;
}
//------------------------------------------------------------------
void ScDocShell::EnableSharedSettings( bool bEnable )
{
SetDocumentModified();
if ( bEnable )
{
aDocument.EndChangeTracking();
aDocument.StartChangeTracking();
// hide accept or reject changes dialog
sal_uInt16 nId = ScAcceptChgDlgWrapper::GetChildWindowId();
SfxViewFrame* pViewFrame = SfxViewFrame::Current();
if ( pViewFrame && pViewFrame->HasChildWindow( nId ) )
{
pViewFrame->ToggleChildWindow( nId );
SfxBindings* pBindings = GetViewBindings();
if ( pBindings )
{
pBindings->Invalidate( FID_CHG_ACCEPT );
}
}
}
else
{
aDocument.EndChangeTracking();
}
ScChangeViewSettings aChangeViewSet;
aChangeViewSet.SetShowChanges( sal_False );
aDocument.SetChangeViewSettings( aChangeViewSet );
}
uno::Reference< frame::XModel > ScDocShell::LoadSharedDocument()
{
uno::Reference< frame::XModel > xModel;
try
{
SC_MOD()->SetInSharedDocLoading( true );
uno::Reference< lang::XMultiServiceFactory > xFactory(
::comphelper::getProcessServiceFactory(), uno::UNO_QUERY_THROW );
uno::Reference< frame::XComponentLoader > xLoader(
xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.Desktop" ) ) ),
uno::UNO_QUERY_THROW );
uno::Sequence < beans::PropertyValue > aArgs( 1 );
aArgs[0].Name = ::rtl::OUString::createFromAscii( "Hidden" );
aArgs[0].Value <<= sal_True;
if ( GetMedium() )
{
SFX_ITEMSET_ARG( GetMedium()->GetItemSet(), pPasswordItem, SfxStringItem, SID_PASSWORD, sal_False);
if ( pPasswordItem && pPasswordItem->GetValue().Len() )
{
aArgs.realloc( 2 );
aArgs[1].Name = ::rtl::OUString::createFromAscii( "Password" );
aArgs[1].Value <<= ::rtl::OUString( pPasswordItem->GetValue() );
}
}
xModel.set(
xLoader->loadComponentFromURL( GetSharedFileURL(), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "_blank" ) ), 0, aArgs ),
uno::UNO_QUERY_THROW );
SC_MOD()->SetInSharedDocLoading( false );
}
catch ( uno::Exception& )
{
DBG_ERROR( "ScDocShell::LoadSharedDocument(): caught exception\n" );
SC_MOD()->SetInSharedDocLoading( false );
try
{
uno::Reference< util::XCloseable > xClose( xModel, uno::UNO_QUERY_THROW );
xClose->close( sal_True );
return uno::Reference< frame::XModel >();
}
catch ( uno::Exception& )
{
return uno::Reference< frame::XModel >();
}
}
return xModel;
}