summaryrefslogtreecommitdiff
path: root/sc/source/core/data/documen9.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/core/data/documen9.cxx')
-rw-r--r--sc/source/core/data/documen9.cxx775
1 files changed, 775 insertions, 0 deletions
diff --git a/sc/source/core/data/documen9.cxx b/sc/source/core/data/documen9.cxx
new file mode 100644
index 000000000000..b8ba53f22d4d
--- /dev/null
+++ b/sc/source/core/data/documen9.cxx
@@ -0,0 +1,775 @@
+/* -*- 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"
+
+// INCLUDE ---------------------------------------------------------------
+
+#include "scitems.hxx"
+#include <editeng/eeitem.hxx>
+
+#include <sot/exchange.hxx>
+#include <editeng/akrnitem.hxx>
+#include <editeng/fontitem.hxx>
+#include <editeng/forbiddencharacterstable.hxx>
+#include <editeng/langitem.hxx>
+#include <svx/svdetc.hxx>
+#include <svx/svditer.hxx>
+#include <svx/svdocapt.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdouno.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/xtable.hxx>
+#include <sfx2/objsh.hxx>
+#include <sfx2/printer.hxx>
+#include <unotools/saveopt.hxx>
+#include <unotools/pathoptions.hxx>
+
+#include "document.hxx"
+#include "docoptio.hxx"
+#include "table.hxx"
+#include "drwlayer.hxx"
+#include "markdata.hxx"
+#include "patattr.hxx"
+#include "rechead.hxx"
+#include "poolhelp.hxx"
+#include "docpool.hxx"
+#include "detfunc.hxx" // for UpdateAllComments
+#include "editutil.hxx"
+#include "postit.hxx"
+#include "charthelper.hxx"
+
+using namespace ::com::sun::star;
+#include <stdio.h>
+// -----------------------------------------------------------------------
+
+
+SfxBroadcaster* ScDocument::GetDrawBroadcaster()
+{
+ return pDrawLayer;
+}
+
+void ScDocument::BeginDrawUndo()
+{
+ if (pDrawLayer)
+ pDrawLayer->BeginCalcUndo();
+}
+
+XColorTable* ScDocument::GetColorTable()
+{
+ if (pDrawLayer)
+ return pDrawLayer->GetColorTable();
+ else
+ {
+ if (!pColorTable)
+ {
+ SvtPathOptions aPathOpt;
+ pColorTable = new XColorTable( aPathOpt.GetPalettePath() );
+ }
+
+ return pColorTable;
+ }
+}
+
+void ScDocument::TransferDrawPage(ScDocument* pSrcDoc, SCTAB nSrcPos, SCTAB nDestPos)
+{
+ if (pDrawLayer && pSrcDoc->pDrawLayer)
+ {
+ SdrPage* pOldPage = pSrcDoc->pDrawLayer->GetPage(static_cast<sal_uInt16>(nSrcPos));
+ SdrPage* pNewPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nDestPos));
+
+ if (pOldPage && pNewPage)
+ {
+ SdrObjListIter aIter( *pOldPage, IM_FLAT );
+ SdrObject* pOldObject = aIter.Next();
+ while (pOldObject)
+ {
+ // #116235#
+ SdrObject* pNewObject = pOldObject->Clone();
+ // SdrObject* pNewObject = pOldObject->Clone( pNewPage, pDrawLayer );
+ pNewObject->SetModel(pDrawLayer);
+ pNewObject->SetPage(pNewPage);
+
+ pNewObject->NbcMove(Size(0,0));
+ pNewPage->InsertObject( pNewObject );
+
+ if (pDrawLayer->IsRecording())
+ pDrawLayer->AddCalcUndo( new SdrUndoInsertObj( *pNewObject ) );
+
+ pOldObject = aIter.Next();
+ }
+ }
+ }
+
+ // make sure the data references of charts are adapted
+ // (this must be after InsertObject!)
+ ScChartHelper::AdjustRangesOfChartsOnDestinationPage( pSrcDoc, this, nSrcPos, nDestPos );
+}
+
+void ScDocument::InitDrawLayer( SfxObjectShell* pDocShell )
+{
+ if (pDocShell && !pShell)
+ pShell = pDocShell;
+
+ if (!pDrawLayer)
+ {
+ String aName;
+ if ( pShell && !pShell->IsLoading() ) // don't call GetTitle while loading
+ aName = pShell->GetTitle();
+ pDrawLayer = new ScDrawLayer( this, aName );
+ if (GetLinkManager())
+ pDrawLayer->SetLinkManager( pLinkManager );
+
+ // Drawing pages are accessed by table number, so they must also be present
+ // for preceding table numbers, even if the tables aren't allocated
+ // (important for clipboard documents).
+
+ SCTAB nDrawPages = 0;
+ SCTAB nTab;
+ for (nTab=0; nTab<=MAXTAB; nTab++)
+ if (pTab[nTab])
+ nDrawPages = nTab + 1; // needed number of pages
+
+ for (nTab=0; nTab<nDrawPages; nTab++)
+ {
+ pDrawLayer->ScAddPage( nTab ); // always add page, with or without the table
+ if (pTab[nTab])
+ {
+ String aTabName;
+ pTab[nTab]->GetName(aTabName);
+ pDrawLayer->ScRenamePage( nTab, aTabName );
+
+ pTab[nTab]->SetDrawPageSize(false,false); // set the right size immediately
+ }
+ }
+
+ pDrawLayer->SetDefaultTabulator( GetDocOptions().GetTabDistance() );
+
+ UpdateDrawPrinter();
+ UpdateDrawDefaults();
+ UpdateDrawLanguages();
+ if (bImportingXML)
+ pDrawLayer->EnableAdjust(false);
+
+ pDrawLayer->SetForbiddenCharsTable( xForbiddenCharacters );
+ pDrawLayer->SetCharCompressType( GetAsianCompression() );
+ pDrawLayer->SetKernAsianPunctuation( GetAsianKerning() );
+ }
+}
+
+void ScDocument::UpdateDrawLanguages()
+{
+ if (pDrawLayer)
+ {
+ SfxItemPool& rDrawPool = pDrawLayer->GetItemPool();
+ rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eLanguage, EE_CHAR_LANGUAGE ) );
+ rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eCjkLanguage, EE_CHAR_LANGUAGE_CJK ) );
+ rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eCtlLanguage, EE_CHAR_LANGUAGE_CTL ) );
+ }
+}
+
+void ScDocument::UpdateDrawDefaults()
+{
+ // drawing layer defaults that are set for new documents (if InitNew was called)
+
+ if ( pDrawLayer && bSetDrawDefaults )
+ {
+ SfxItemPool& rDrawPool = pDrawLayer->GetItemPool();
+ rDrawPool.SetPoolDefaultItem( SvxAutoKernItem( sal_True, EE_CHAR_PAIRKERNING ) );
+ }
+}
+
+void ScDocument::UpdateDrawPrinter()
+{
+ if (pDrawLayer)
+ {
+ // use the printer even if IsValid is false
+ // Application::GetDefaultDevice causes trouble with changing MapModes
+ pDrawLayer->SetRefDevice(GetRefDevice());
+ }
+}
+
+void ScDocument::SetDrawPageSize(SCTAB nTab)
+{
+ if (!ValidTab(nTab) || !pTab[nTab])
+ return;
+
+ pTab[nTab]->SetDrawPageSize();
+}
+
+sal_Bool ScDocument::IsChart( const SdrObject* pObject )
+{
+ // #109985#
+ // IsChart() implementation moved to svx drawinglayer
+ if(pObject && OBJ_OLE2 == pObject->GetObjIdentifier())
+ {
+ return ((SdrOle2Obj*)pObject)->IsChart();
+ }
+
+ return false;
+}
+
+IMPL_LINK_INLINE_START( ScDocument, GetUserDefinedColor, sal_uInt16 *, pColorIndex )
+{
+ return (long) &((GetColorTable()->GetColor(*pColorIndex))->GetColor());
+}
+IMPL_LINK_INLINE_END( ScDocument, GetUserDefinedColor, sal_uInt16 *, pColorIndex )
+
+void ScDocument::DeleteDrawLayer()
+{
+ delete pDrawLayer;
+}
+
+void ScDocument::DeleteColorTable()
+{
+ delete pColorTable;
+}
+
+sal_Bool ScDocument::DrawGetPrintArea( ScRange& rRange, sal_Bool bSetHor, sal_Bool bSetVer ) const
+{
+ return pDrawLayer->GetPrintArea( rRange, bSetHor, bSetVer );
+}
+
+void ScDocument::DrawMovePage( sal_uInt16 nOldPos, sal_uInt16 nNewPos )
+{
+ pDrawLayer->ScMovePage(nOldPos,nNewPos);
+}
+
+void ScDocument::DrawCopyPage( sal_uInt16 nOldPos, sal_uInt16 nNewPos )
+{
+ // angelegt wird die Page schon im ScTable ctor
+ pDrawLayer->ScCopyPage( nOldPos, nNewPos, false );
+}
+
+void ScDocument::DeleteObjectsInArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
+ const ScMarkData& rMark )
+{
+ if (!pDrawLayer)
+ return;
+
+ SCTAB nTabCount = GetTableCount();
+ for (SCTAB nTab=0; nTab<=nTabCount; nTab++)
+ if (pTab[nTab] && rMark.GetTableSelect(nTab))
+ pDrawLayer->DeleteObjectsInArea( nTab, nCol1, nRow1, nCol2, nRow2 );
+}
+
+void ScDocument::DeleteObjectsInSelection( const ScMarkData& rMark )
+{
+ if (!pDrawLayer)
+ return;
+
+ pDrawLayer->DeleteObjectsInSelection( rMark );
+}
+
+sal_Bool ScDocument::HasOLEObjectsInArea( const ScRange& rRange, const ScMarkData* pTabMark )
+{
+ // pTabMark is used only for selected tables. If pTabMark is 0, all tables of rRange are used.
+
+ if (!pDrawLayer)
+ return false;
+
+ SCTAB nStartTab = 0;
+ SCTAB nEndTab = MAXTAB;
+ if ( !pTabMark )
+ {
+ nStartTab = rRange.aStart.Tab();
+ nEndTab = rRange.aEnd.Tab();
+ }
+
+ for (SCTAB nTab = nStartTab; nTab <= nEndTab; nTab++)
+ {
+ if ( !pTabMark || pTabMark->GetTableSelect(nTab) )
+ {
+ Rectangle aMMRect = GetMMRect( rRange.aStart.Col(), rRange.aStart.Row(),
+ rRange.aEnd.Col(), rRange.aEnd.Row(), nTab );
+
+ SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
+ DBG_ASSERT(pPage,"Page ?");
+ if (pPage)
+ {
+ SdrObjListIter aIter( *pPage, IM_FLAT );
+ SdrObject* pObject = aIter.Next();
+ while (pObject)
+ {
+ if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
+ aMMRect.IsInside( pObject->GetCurrentBoundRect() ) )
+ return sal_True;
+
+ pObject = aIter.Next();
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+
+void ScDocument::StartAnimations( SCTAB nTab, Window* pWin )
+{
+ if (!pDrawLayer)
+ return;
+ SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
+ DBG_ASSERT(pPage,"Page ?");
+ if (!pPage)
+ return;
+
+ SdrObjListIter aIter( *pPage, IM_FLAT );
+ SdrObject* pObject = aIter.Next();
+ while (pObject)
+ {
+ if (pObject->ISA(SdrGrafObj))
+ {
+ SdrGrafObj* pGrafObj = (SdrGrafObj*)pObject;
+ if ( pGrafObj->IsAnimated() )
+ {
+ const Rectangle& rRect = pGrafObj->GetCurrentBoundRect();
+ pGrafObj->StartAnimation( pWin, rRect.TopLeft(), rRect.GetSize() );
+ }
+ }
+ pObject = aIter.Next();
+ }
+}
+
+
+sal_Bool ScDocument::HasBackgroundDraw( SCTAB nTab, const Rectangle& rMMRect )
+{
+ // Gibt es Objekte auf dem Hintergrund-Layer, die (teilweise) von rMMRect
+ // betroffen sind?
+ // (fuer Drawing-Optimierung, vor dem Hintergrund braucht dann nicht geloescht
+ // zu werden)
+
+ if (!pDrawLayer)
+ return false;
+ SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
+ DBG_ASSERT(pPage,"Page ?");
+ if (!pPage)
+ return false;
+
+ sal_Bool bFound = false;
+
+ SdrObjListIter aIter( *pPage, IM_FLAT );
+ SdrObject* pObject = aIter.Next();
+ while (pObject && !bFound)
+ {
+ if ( pObject->GetLayer() == SC_LAYER_BACK && pObject->GetCurrentBoundRect().IsOver( rMMRect ) )
+ bFound = sal_True;
+ pObject = aIter.Next();
+ }
+
+ return bFound;
+}
+
+sal_Bool ScDocument::HasAnyDraw( SCTAB nTab, const Rectangle& rMMRect )
+{
+ // Gibt es ueberhaupt Objekte, die (teilweise) von rMMRect
+ // betroffen sind?
+ // (um leere Seiten beim Drucken zu erkennen)
+
+ if (!pDrawLayer)
+ return false;
+ SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
+ DBG_ASSERT(pPage,"Page ?");
+ if (!pPage)
+ return false;
+
+ sal_Bool bFound = false;
+
+ SdrObjListIter aIter( *pPage, IM_FLAT );
+ SdrObject* pObject = aIter.Next();
+ while (pObject && !bFound)
+ {
+ if ( pObject->GetCurrentBoundRect().IsOver( rMMRect ) )
+ bFound = sal_True;
+ pObject = aIter.Next();
+ }
+
+ return bFound;
+}
+
+void ScDocument::EnsureGraphicNames()
+{
+ if (pDrawLayer)
+ pDrawLayer->EnsureGraphicNames();
+}
+
+SdrObject* ScDocument::GetObjectAtPoint( SCTAB nTab, const Point& rPos )
+{
+ // fuer Drag&Drop auf Zeichenobjekt
+
+ SdrObject* pFound = NULL;
+ if (pDrawLayer && pTab[nTab])
+ {
+ SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
+ DBG_ASSERT(pPage,"Page ?");
+ if (pPage)
+ {
+ SdrObjListIter aIter( *pPage, IM_FLAT );
+ SdrObject* pObject = aIter.Next();
+ while (pObject)
+ {
+ if ( pObject->GetCurrentBoundRect().IsInside(rPos) )
+ {
+ // Intern interessiert gar nicht
+ // Objekt vom Back-Layer nur, wenn kein Objekt von anderem Layer getroffen
+
+ SdrLayerID nLayer = pObject->GetLayer();
+ if ( (nLayer != SC_LAYER_INTERN) && (nLayer != SC_LAYER_HIDDEN) )
+ {
+ if ( nLayer != SC_LAYER_BACK ||
+ !pFound || pFound->GetLayer() == SC_LAYER_BACK )
+ {
+ pFound = pObject;
+ }
+ }
+ }
+ // weitersuchen -> letztes (oberstes) getroffenes Objekt nehmen
+
+ pObject = aIter.Next();
+ }
+ }
+ }
+ return pFound;
+}
+
+sal_Bool ScDocument::IsPrintEmpty( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow,
+ SCCOL nEndCol, SCROW nEndRow, sal_Bool bLeftIsEmpty,
+ ScRange* pLastRange, Rectangle* pLastMM ) const
+{
+ if (!IsBlockEmpty( nTab, nStartCol, nStartRow, nEndCol, nEndRow ))
+ return false;
+
+ if (HasAttrib(ScRange(nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab), HASATTR_LINES))
+ // We want to print sheets with borders even if there is no cell content.
+ return false;
+
+ ScDocument* pThis = (ScDocument*)this; //! GetMMRect / HasAnyDraw etc. const !!!
+
+ Rectangle aMMRect;
+ if ( pLastRange && pLastMM && nTab == pLastRange->aStart.Tab() &&
+ nStartRow == pLastRange->aStart.Row() && nEndRow == pLastRange->aEnd.Row() )
+ {
+ // keep vertical part of aMMRect, only update horizontal position
+ aMMRect = *pLastMM;
+
+ long nLeft = 0;
+ SCCOL i;
+ for (i=0; i<nStartCol; i++)
+ nLeft += GetColWidth(i,nTab);
+ long nRight = nLeft;
+ for (i=nStartCol; i<=nEndCol; i++)
+ nRight += GetColWidth(i,nTab);
+
+ aMMRect.Left() = (long)(nLeft * HMM_PER_TWIPS);
+ aMMRect.Right() = (long)(nRight * HMM_PER_TWIPS);
+ }
+ else
+ aMMRect = pThis->GetMMRect( nStartCol, nStartRow, nEndCol, nEndRow, nTab );
+
+ if ( pLastRange && pLastMM )
+ {
+ *pLastRange = ScRange( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab );
+ *pLastMM = aMMRect;
+ }
+
+ if ( pThis->HasAnyDraw( nTab, aMMRect ))
+ return false;
+
+ if ( nStartCol > 0 && !bLeftIsEmpty )
+ {
+ // aehnlich wie in ScPrintFunc::AdjustPrintArea
+ //! ExtendPrintArea erst ab Start-Spalte des Druckbereichs
+
+ SCCOL nExtendCol = nStartCol - 1;
+ SCROW nTmpRow = nEndRow;
+
+ pThis->ExtendMerge( 0,nStartRow, nExtendCol,nTmpRow, nTab,
+ false, sal_True ); // kein Refresh, incl. Attrs
+
+ OutputDevice* pDev = pThis->GetPrinter();
+ pDev->SetMapMode( MAP_PIXEL ); // wichtig fuer GetNeededSize
+ pThis->ExtendPrintArea( pDev, nTab, 0, nStartRow, nExtendCol, nEndRow );
+ if ( nExtendCol >= nStartCol )
+ return false;
+ }
+
+ return sal_True;
+}
+
+void ScDocument::Clear( sal_Bool bFromDestructor )
+{
+ for (SCTAB i=0; i<=MAXTAB; i++)
+ if (pTab[i])
+ {
+ delete pTab[i];
+ pTab[i]=NULL;
+ }
+ delete pSelectionAttr;
+ pSelectionAttr = NULL;
+
+ if (pDrawLayer)
+ {
+ pDrawLayer->ClearModel( bFromDestructor );
+ }
+}
+
+sal_Bool ScDocument::HasControl( SCTAB nTab, const Rectangle& rMMRect )
+{
+ sal_Bool bFound = false;
+
+ if (pDrawLayer)
+ {
+ SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
+ DBG_ASSERT(pPage,"Page ?");
+ if (pPage)
+ {
+ SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
+ SdrObject* pObject = aIter.Next();
+ while (pObject && !bFound)
+ {
+ if (pObject->ISA(SdrUnoObj))
+ {
+ Rectangle aObjRect = pObject->GetLogicRect();
+ if ( aObjRect.IsOver( rMMRect ) )
+ bFound = sal_True;
+ }
+
+ pObject = aIter.Next();
+ }
+ }
+ }
+
+ return bFound;
+}
+
+void ScDocument::InvalidateControls( Window* pWin, SCTAB nTab, const Rectangle& rMMRect )
+{
+ if (pDrawLayer)
+ {
+ SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
+ DBG_ASSERT(pPage,"Page ?");
+ if (pPage)
+ {
+ SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
+ SdrObject* pObject = aIter.Next();
+ while (pObject)
+ {
+ if (pObject->ISA(SdrUnoObj))
+ {
+ Rectangle aObjRect = pObject->GetLogicRect();
+ if ( aObjRect.IsOver( rMMRect ) )
+ {
+ // Uno-Controls zeichnen sich immer komplett, ohne Ruecksicht
+ // auf ClippingRegions. Darum muss das ganze Objekt neu gepainted
+ // werden, damit die Selektion auf der Tabelle nicht uebermalt wird.
+
+ pWin->Invalidate( aObjRect );
+ }
+ }
+
+ pObject = aIter.Next();
+ }
+ }
+ }
+}
+
+sal_Bool ScDocument::HasDetectiveObjects(SCTAB nTab) const
+{
+ // looks for detective objects, annotations don't count
+ // (used to adjust scale so detective objects hit their cells better)
+
+ sal_Bool bFound = false;
+
+ if (pDrawLayer)
+ {
+ SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
+ DBG_ASSERT(pPage,"Page ?");
+ if (pPage)
+ {
+ SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
+ SdrObject* pObject = aIter.Next();
+ while (pObject && !bFound)
+ {
+ // anything on the internal layer except captions (annotations)
+ if ( (pObject->GetLayer() == SC_LAYER_INTERN) && !ScDrawLayer::IsNoteCaption( pObject ) )
+ bFound = sal_True;
+
+ pObject = aIter.Next();
+ }
+ }
+ }
+
+ return bFound;
+}
+
+void ScDocument::UpdateFontCharSet()
+{
+ // In alten Versionen (bis incl. 4.0 ohne SP) wurden beim Austausch zwischen
+ // Systemen die CharSets in den Font-Attributen nicht angepasst.
+ // Das muss fuer Dokumente bis incl SP2 nun nachgeholt werden:
+ // Alles, was nicht SYMBOL ist, wird auf den System-CharSet umgesetzt.
+ // Bei neuen Dokumenten (Version SC_FONTCHARSET) sollte der CharSet stimmen.
+
+ sal_Bool bUpdateOld = ( nSrcVer < SC_FONTCHARSET );
+
+ CharSet eSysSet = gsl_getSystemTextEncoding();
+ if ( eSrcSet != eSysSet || bUpdateOld )
+ {
+ sal_uInt32 nCount,i;
+ SvxFontItem* pItem;
+
+ ScDocumentPool* pPool = xPoolHelper->GetDocPool();
+ nCount = pPool->GetItemCount2(ATTR_FONT);
+ for (i=0; i<nCount; i++)
+ {
+ pItem = (SvxFontItem*)pPool->GetItem2(ATTR_FONT, i);
+ if ( pItem && ( pItem->GetCharSet() == eSrcSet ||
+ ( bUpdateOld && pItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) )
+ pItem->SetCharSet(eSysSet);
+ }
+
+ if ( pDrawLayer )
+ {
+ SfxItemPool& rDrawPool = pDrawLayer->GetItemPool();
+ nCount = rDrawPool.GetItemCount2(EE_CHAR_FONTINFO);
+ for (i=0; i<nCount; i++)
+ {
+ pItem = (SvxFontItem*)rDrawPool.GetItem2(EE_CHAR_FONTINFO, i);
+ if ( pItem && ( pItem->GetCharSet() == eSrcSet ||
+ ( bUpdateOld && pItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) )
+ pItem->SetCharSet( eSysSet );
+ }
+ }
+ }
+}
+
+bool ScDocument::IsLoadingMedium() const
+{
+ return bLoadingMedium;
+}
+
+void ScDocument::SetLoadingMedium( bool bVal )
+{
+ bLoadingMedium = bVal;
+ for (SCTAB nTab = 0; nTab <= MAXTAB; ++nTab)
+ {
+ if (!pTab[nTab])
+ return;
+
+ pTab[nTab]->SetLoadingMedium(bVal);
+ }
+}
+
+void ScDocument::SetImportingXML( bool bVal )
+{
+ bImportingXML = bVal;
+ if (pDrawLayer)
+ pDrawLayer->EnableAdjust(!bImportingXML);
+
+ if ( !bVal )
+ {
+ // #i57869# after loading, do the real RTL mirroring for the sheets that have the LoadingRTL flag set
+
+ for ( SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++ )
+ if ( pTab[nTab]->IsLoadingRTL() )
+ {
+ pTab[nTab]->SetLoadingRTL( false );
+ SetLayoutRTL( nTab, sal_True ); // includes mirroring; bImportingXML must be cleared first
+ }
+ }
+
+ SetLoadingMedium(bVal);
+}
+
+void ScDocument::SetXMLFromWrapper( sal_Bool bVal )
+{
+ bXMLFromWrapper = bVal;
+}
+
+rtl::Reference<SvxForbiddenCharactersTable> ScDocument::GetForbiddenCharacters()
+{
+ return xForbiddenCharacters;
+}
+
+void ScDocument::SetForbiddenCharacters( const rtl::Reference<SvxForbiddenCharactersTable> xNew )
+{
+ xForbiddenCharacters = xNew;
+ if ( pEditEngine )
+ pEditEngine->SetForbiddenCharsTable( xForbiddenCharacters );
+ if ( pDrawLayer )
+ pDrawLayer->SetForbiddenCharsTable( xForbiddenCharacters );
+}
+
+sal_Bool ScDocument::IsValidAsianCompression() const
+{
+ return ( nAsianCompression != SC_ASIANCOMPRESSION_INVALID );
+}
+
+sal_uInt8 ScDocument::GetAsianCompression() const
+{
+ if ( nAsianCompression == SC_ASIANCOMPRESSION_INVALID )
+ return 0;
+ else
+ return nAsianCompression;
+}
+
+void ScDocument::SetAsianCompression(sal_uInt8 nNew)
+{
+ nAsianCompression = nNew;
+ if ( pEditEngine )
+ pEditEngine->SetAsianCompressionMode( nAsianCompression );
+ if ( pDrawLayer )
+ pDrawLayer->SetCharCompressType( nAsianCompression );
+}
+
+sal_Bool ScDocument::IsValidAsianKerning() const
+{
+ return ( nAsianKerning != SC_ASIANKERNING_INVALID );
+}
+
+sal_Bool ScDocument::GetAsianKerning() const
+{
+ if ( nAsianKerning == SC_ASIANKERNING_INVALID )
+ return false;
+ else
+ return (sal_Bool)nAsianKerning;
+}
+
+void ScDocument::SetAsianKerning(sal_Bool bNew)
+{
+ nAsianKerning = (sal_uInt8)bNew;
+ if ( pEditEngine )
+ pEditEngine->SetKernAsianPunctuation( (sal_Bool)nAsianKerning );
+ if ( pDrawLayer )
+ pDrawLayer->SetKernAsianPunctuation( (sal_Bool)nAsianKerning );
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */