xref: /trunk/main/sc/source/core/data/documen9.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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
10cdf0e10cSrcweir  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
20b3f79822SAndrew Rist  *************************************************************/
21b3f79822SAndrew Rist 
22b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "scitems.hxx"
30cdf0e10cSrcweir #include <editeng/eeitem.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include <sot/exchange.hxx>
33cdf0e10cSrcweir #include <editeng/akrnitem.hxx>
34cdf0e10cSrcweir #include <editeng/fontitem.hxx>
35cdf0e10cSrcweir #include <editeng/forbiddencharacterstable.hxx>
36cdf0e10cSrcweir #include <editeng/langitem.hxx>
37cdf0e10cSrcweir #include <svx/svdetc.hxx>
38cdf0e10cSrcweir #include <svx/svditer.hxx>
39cdf0e10cSrcweir #include <svx/svdocapt.hxx>
40cdf0e10cSrcweir #include <svx/svdograf.hxx>
41cdf0e10cSrcweir #include <svx/svdoole2.hxx>
42cdf0e10cSrcweir #include <svx/svdouno.hxx>
43cdf0e10cSrcweir #include <svx/svdpage.hxx>
44cdf0e10cSrcweir #include <svx/svdundo.hxx>
45cdf0e10cSrcweir #include <svx/xtable.hxx>
46cdf0e10cSrcweir #include <sfx2/objsh.hxx>
47cdf0e10cSrcweir #include <sfx2/printer.hxx>
48cdf0e10cSrcweir #include <unotools/saveopt.hxx>
49cdf0e10cSrcweir #include <unotools/pathoptions.hxx>
50cdf0e10cSrcweir 
51cdf0e10cSrcweir #include "document.hxx"
52cdf0e10cSrcweir #include "docoptio.hxx"
53cdf0e10cSrcweir #include "table.hxx"
54cdf0e10cSrcweir #include "drwlayer.hxx"
55cdf0e10cSrcweir #include "markdata.hxx"
56cdf0e10cSrcweir #include "patattr.hxx"
57cdf0e10cSrcweir #include "rechead.hxx"
58cdf0e10cSrcweir #include "poolhelp.hxx"
59cdf0e10cSrcweir #include "docpool.hxx"
60cdf0e10cSrcweir #include "detfunc.hxx"      // for UpdateAllComments
61cdf0e10cSrcweir #include "editutil.hxx"
62cdf0e10cSrcweir #include "postit.hxx"
63cdf0e10cSrcweir #include "charthelper.hxx"
64cdf0e10cSrcweir 
65cdf0e10cSrcweir using namespace ::com::sun::star;
66cdf0e10cSrcweir #include <stdio.h>
67cdf0e10cSrcweir // -----------------------------------------------------------------------
68cdf0e10cSrcweir 
69cdf0e10cSrcweir 
GetDrawBroadcaster()70cdf0e10cSrcweir SfxBroadcaster* ScDocument::GetDrawBroadcaster()
71cdf0e10cSrcweir {
72cdf0e10cSrcweir     return pDrawLayer;
73cdf0e10cSrcweir }
74cdf0e10cSrcweir 
BeginDrawUndo()75cdf0e10cSrcweir void ScDocument::BeginDrawUndo()
76cdf0e10cSrcweir {
77cdf0e10cSrcweir     if (pDrawLayer)
78a840a559SArmin Le Grand         pDrawLayer->BeginCalcUndo(false);
79cdf0e10cSrcweir }
80cdf0e10cSrcweir 
IsDrawRecording() const81ee342afcSWang Lei sal_Bool ScDocument::IsDrawRecording() const
82ee342afcSWang Lei {
83ee342afcSWang Lei     return pDrawLayer ? pDrawLayer->IsRecording() : sal_False;
84ee342afcSWang Lei }
85ee342afcSWang Lei 
EndDrawUndo()86ee342afcSWang Lei void ScDocument::EndDrawUndo()
87ee342afcSWang Lei {
88ee342afcSWang Lei     if( pDrawLayer )
89ee342afcSWang Lei         delete pDrawLayer->GetCalcUndo();
90ee342afcSWang Lei }
91ee342afcSWang Lei 
GetColorTable()92c7be74b1SArmin Le Grand XColorListSharedPtr ScDocument::GetColorTable()
93cdf0e10cSrcweir {
94cdf0e10cSrcweir     if (pDrawLayer)
95c7be74b1SArmin Le Grand         return pDrawLayer->GetColorTableFromSdrModel();
96cdf0e10cSrcweir     else
97cdf0e10cSrcweir     {
98c7be74b1SArmin Le Grand         if (!maColorTable.get())
99cdf0e10cSrcweir         {
100cdf0e10cSrcweir             SvtPathOptions aPathOpt;
101c7be74b1SArmin Le Grand             maColorTable = XPropertyListFactory::CreateSharedXColorList(aPathOpt.GetPalettePath());
102cdf0e10cSrcweir         }
103cdf0e10cSrcweir 
104c7be74b1SArmin Le Grand         return maColorTable;
105cdf0e10cSrcweir     }
106cdf0e10cSrcweir }
107cdf0e10cSrcweir 
TransferDrawPage(ScDocument * pSrcDoc,SCTAB nSrcPos,SCTAB nDestPos)108cdf0e10cSrcweir void ScDocument::TransferDrawPage(ScDocument* pSrcDoc, SCTAB nSrcPos, SCTAB nDestPos)
109cdf0e10cSrcweir {
110cdf0e10cSrcweir     if (pDrawLayer && pSrcDoc->pDrawLayer)
111cdf0e10cSrcweir     {
112cdf0e10cSrcweir         SdrPage* pOldPage = pSrcDoc->pDrawLayer->GetPage(static_cast<sal_uInt16>(nSrcPos));
113cdf0e10cSrcweir         SdrPage* pNewPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nDestPos));
114cdf0e10cSrcweir 
115cdf0e10cSrcweir         if (pOldPage && pNewPage)
116cdf0e10cSrcweir         {
117cdf0e10cSrcweir             SdrObjListIter aIter( *pOldPage, IM_FLAT );
118cdf0e10cSrcweir             SdrObject* pOldObject = aIter.Next();
119cdf0e10cSrcweir             while (pOldObject)
120cdf0e10cSrcweir             {
121cdf0e10cSrcweir                 // #i112034# do not copy internal objects (detective) and note captions
122cdf0e10cSrcweir                 if ( pOldObject->GetLayer() != SC_LAYER_INTERN && !ScDrawLayer::IsNoteCaption( pOldObject ) )
123cdf0e10cSrcweir                 {
124cdf0e10cSrcweir                     // #116235#
125cdf0e10cSrcweir                     SdrObject* pNewObject = pOldObject->Clone();
126cdf0e10cSrcweir                     // SdrObject* pNewObject = pOldObject->Clone( pNewPage, pDrawLayer );
127cdf0e10cSrcweir                     pNewObject->SetModel(pDrawLayer);
128cdf0e10cSrcweir                     pNewObject->SetPage(pNewPage);
129cdf0e10cSrcweir 
130cdf0e10cSrcweir                     pNewObject->NbcMove(Size(0,0));
131cdf0e10cSrcweir                     pNewPage->InsertObject( pNewObject );
132cdf0e10cSrcweir 
133cdf0e10cSrcweir                     if (pDrawLayer->IsRecording())
134577c0052SWang Lei             pDrawLayer->AddCalcUndo< SdrUndoInsertObj >( *pNewObject );
135cdf0e10cSrcweir                 }
136cdf0e10cSrcweir 
137cdf0e10cSrcweir                 pOldObject = aIter.Next();
138cdf0e10cSrcweir             }
139cdf0e10cSrcweir         }
140cdf0e10cSrcweir     }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir     //  #71726# make sure the data references of charts are adapted
143cdf0e10cSrcweir     //  (this must be after InsertObject!)
144cdf0e10cSrcweir     ScChartHelper::AdjustRangesOfChartsOnDestinationPage( pSrcDoc, this, nSrcPos, nDestPos );
14517e36312SWang Lei     ScChartHelper::UpdateChartsOnDestinationPage(this, nDestPos);
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
InitDrawLayer(SfxObjectShell * pDocShell)148cdf0e10cSrcweir void ScDocument::InitDrawLayer( SfxObjectShell* pDocShell )
149cdf0e10cSrcweir {
150cdf0e10cSrcweir     if (pDocShell && !pShell)
151cdf0e10cSrcweir         pShell = pDocShell;
152cdf0e10cSrcweir 
153cdf0e10cSrcweir //  DBG_ASSERT(pShell,"InitDrawLayer ohne Shell");
154cdf0e10cSrcweir 
155cdf0e10cSrcweir     if (!pDrawLayer)
156cdf0e10cSrcweir     {
157cdf0e10cSrcweir         String aName;
158cdf0e10cSrcweir         if ( pShell && !pShell->IsLoading() )       // #88438# don't call GetTitle while loading
159cdf0e10cSrcweir             aName = pShell->GetTitle();
160cdf0e10cSrcweir         pDrawLayer = new ScDrawLayer( this, aName );
161cdf0e10cSrcweir         if (GetLinkManager())
162cdf0e10cSrcweir             pDrawLayer->SetLinkManager( pLinkManager );
163cdf0e10cSrcweir 
164*56b35d86SArmin Le Grand         //UUUU set DrawingLayer's SfxItemPool at Calc's SfxItemPool as
165*56b35d86SArmin Le Grand         // secondary pool to support DrawingLayer FillStyle ranges (and similar)
166*56b35d86SArmin Le Grand         // in SfxItemSets using the Calc SfxItemPool. This is e.g. needed when
167*56b35d86SArmin Le Grand         // the PageStyle using SvxBrushItem is visualized and will be potentially
168*56b35d86SArmin Le Grand         // used more intense in the future
169*56b35d86SArmin Le Grand         if(xPoolHelper.isValid())
170*56b35d86SArmin Le Grand         {
171*56b35d86SArmin Le Grand             ScDocumentPool* pLocalPool = xPoolHelper->GetDocPool();
172*56b35d86SArmin Le Grand 
173*56b35d86SArmin Le Grand             if(pLocalPool)
174*56b35d86SArmin Le Grand             {
175*56b35d86SArmin Le Grand                 OSL_ENSURE(!pLocalPool->GetSecondaryPool(), "OOps, already a secondary pool set where the DrawingLayer ItemPool is to be placed (!)");
176*56b35d86SArmin Le Grand                 pLocalPool->SetSecondaryPool(&pDrawLayer->GetItemPool());
177*56b35d86SArmin Le Grand             }
178*56b35d86SArmin Le Grand         }
179*56b35d86SArmin Le Grand 
180cdf0e10cSrcweir         //  Drawing pages are accessed by table number, so they must also be present
181cdf0e10cSrcweir         //  for preceding table numbers, even if the tables aren't allocated
182cdf0e10cSrcweir         //  (important for clipboard documents).
183cdf0e10cSrcweir 
184cdf0e10cSrcweir         SCTAB nDrawPages = 0;
185cdf0e10cSrcweir         SCTAB nTab;
186cdf0e10cSrcweir         for (nTab=0; nTab<=MAXTAB; nTab++)
187cdf0e10cSrcweir             if (pTab[nTab])
188cdf0e10cSrcweir                 nDrawPages = nTab + 1;          // needed number of pages
189cdf0e10cSrcweir 
190cdf0e10cSrcweir         for (nTab=0; nTab<nDrawPages; nTab++)
191cdf0e10cSrcweir         {
192cdf0e10cSrcweir             pDrawLayer->ScAddPage( nTab );      // always add page, with or without the table
193cdf0e10cSrcweir             if (pTab[nTab])
194cdf0e10cSrcweir             {
195cdf0e10cSrcweir                 String aTabName;
196cdf0e10cSrcweir                 pTab[nTab]->GetName(aTabName);
197cdf0e10cSrcweir                 pDrawLayer->ScRenamePage( nTab, aTabName );
198cdf0e10cSrcweir 
199cdf0e10cSrcweir                 pTab[nTab]->SetDrawPageSize(false,false);     // #54782# set the right size immediately
200cdf0e10cSrcweir #if 0
201cdf0e10cSrcweir                 sal_uLong nx = (sal_uLong) ((double) (MAXCOL+1) * STD_COL_WIDTH           * HMM_PER_TWIPS );
202cdf0e10cSrcweir                 sal_uLong ny = (sal_uLong) ((double) (MAXROW+1) * ScGlobal::nStdRowHeight * HMM_PER_TWIPS );
203cdf0e10cSrcweir                 pDrawLayer->SetPageSize( nTab, Size( nx, ny ) );
204cdf0e10cSrcweir #endif
205cdf0e10cSrcweir             }
206cdf0e10cSrcweir         }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir         pDrawLayer->SetDefaultTabulator( GetDocOptions().GetTabDistance() );
209cdf0e10cSrcweir 
210cdf0e10cSrcweir         UpdateDrawPrinter();
2111396af09SArmin Le Grand 
2121396af09SArmin Le Grand         // set draw defaults directly
2131396af09SArmin Le Grand         SfxItemPool& rDrawPool = pDrawLayer->GetItemPool();
2141396af09SArmin Le Grand         rDrawPool.SetPoolDefaultItem( SvxAutoKernItem( sal_True, EE_CHAR_PAIRKERNING ) );
2151396af09SArmin Le Grand 
216cdf0e10cSrcweir         UpdateDrawLanguages();
217cdf0e10cSrcweir         if (bImportingXML)
218cdf0e10cSrcweir             pDrawLayer->EnableAdjust(sal_False);
219cdf0e10cSrcweir 
220577c0052SWang Lei         if( IsImportingMSXML( ) )
221577c0052SWang Lei             pDrawLayer->SetUndoAllowed( false );
222577c0052SWang Lei 
223cdf0e10cSrcweir         pDrawLayer->SetForbiddenCharsTable( xForbiddenCharacters );
224cdf0e10cSrcweir         pDrawLayer->SetCharCompressType( GetAsianCompression() );
225cdf0e10cSrcweir         pDrawLayer->SetKernAsianPunctuation( GetAsianKerning() );
226cdf0e10cSrcweir     }
227cdf0e10cSrcweir }
228cdf0e10cSrcweir 
UpdateDrawLanguages()229cdf0e10cSrcweir void ScDocument::UpdateDrawLanguages()
230cdf0e10cSrcweir {
231cdf0e10cSrcweir     if (pDrawLayer)
232cdf0e10cSrcweir     {
233cdf0e10cSrcweir         SfxItemPool& rDrawPool = pDrawLayer->GetItemPool();
234cdf0e10cSrcweir         rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eLanguage, EE_CHAR_LANGUAGE ) );
235cdf0e10cSrcweir         rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eCjkLanguage, EE_CHAR_LANGUAGE_CJK ) );
236cdf0e10cSrcweir         rDrawPool.SetPoolDefaultItem( SvxLanguageItem( eCtlLanguage, EE_CHAR_LANGUAGE_CTL ) );
237cdf0e10cSrcweir     }
238cdf0e10cSrcweir }
239cdf0e10cSrcweir 
UpdateDrawPrinter()240cdf0e10cSrcweir void ScDocument::UpdateDrawPrinter()
241cdf0e10cSrcweir {
242cdf0e10cSrcweir     if (pDrawLayer)
243cdf0e10cSrcweir     {
244cdf0e10cSrcweir         // use the printer even if IsValid is false
245cdf0e10cSrcweir         // Application::GetDefaultDevice causes trouble with changing MapModes
246cdf0e10cSrcweir 
247cdf0e10cSrcweir //      OutputDevice* pRefDev = GetPrinter();
248cdf0e10cSrcweir //      pRefDev->SetMapMode( MAP_100TH_MM );
249cdf0e10cSrcweir         pDrawLayer->SetRefDevice(GetRefDevice());
250cdf0e10cSrcweir     }
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
IsChart(const SdrObject * pObject)253cdf0e10cSrcweir sal_Bool ScDocument::IsChart( const SdrObject* pObject )
254cdf0e10cSrcweir {
255cdf0e10cSrcweir     // #109985#
256cdf0e10cSrcweir     // IsChart() implementation moved to svx drawinglayer
257cdf0e10cSrcweir     if(pObject && OBJ_OLE2 == pObject->GetObjIdentifier())
258cdf0e10cSrcweir     {
259cdf0e10cSrcweir         return ((SdrOle2Obj*)pObject)->IsChart();
260cdf0e10cSrcweir     }
261cdf0e10cSrcweir 
262cdf0e10cSrcweir     return sal_False;
263cdf0e10cSrcweir }
264cdf0e10cSrcweir 
IMPL_LINK_INLINE_START(ScDocument,GetUserDefinedColor,sal_uInt16 *,pColorIndex)265cdf0e10cSrcweir IMPL_LINK_INLINE_START( ScDocument, GetUserDefinedColor, sal_uInt16 *, pColorIndex )
266cdf0e10cSrcweir {
267cdf0e10cSrcweir     return (long) &((GetColorTable()->GetColor(*pColorIndex))->GetColor());
268cdf0e10cSrcweir }
IMPL_LINK_INLINE_END(ScDocument,GetUserDefinedColor,sal_uInt16 *,pColorIndex)269cdf0e10cSrcweir IMPL_LINK_INLINE_END( ScDocument, GetUserDefinedColor, sal_uInt16 *, pColorIndex )
270cdf0e10cSrcweir 
271cdf0e10cSrcweir void ScDocument::DeleteDrawLayer()
272cdf0e10cSrcweir {
273*56b35d86SArmin Le Grand     //UUUU remove DrawingLayer's SfxItemPool from Calc's SfxItemPool where
274*56b35d86SArmin Le Grand     // it is registered as secondary pool
275*56b35d86SArmin Le Grand     if(xPoolHelper.isValid())
276*56b35d86SArmin Le Grand     {
277*56b35d86SArmin Le Grand         ScDocumentPool* pLocalPool = xPoolHelper->GetDocPool();
278*56b35d86SArmin Le Grand 
279*56b35d86SArmin Le Grand         if(pLocalPool && pLocalPool->GetSecondaryPool())
280*56b35d86SArmin Le Grand         {
281*56b35d86SArmin Le Grand             pLocalPool->SetSecondaryPool(0);
282*56b35d86SArmin Le Grand         }
283*56b35d86SArmin Le Grand     }
284*56b35d86SArmin Le Grand 
285cdf0e10cSrcweir     delete pDrawLayer;
286*56b35d86SArmin Le Grand     pDrawLayer = 0;
287cdf0e10cSrcweir }
288cdf0e10cSrcweir 
DrawGetPrintArea(ScRange & rRange,sal_Bool bSetHor,sal_Bool bSetVer) const289cdf0e10cSrcweir sal_Bool ScDocument::DrawGetPrintArea( ScRange& rRange, sal_Bool bSetHor, sal_Bool bSetVer ) const
290cdf0e10cSrcweir {
291cdf0e10cSrcweir     return pDrawLayer->GetPrintArea( rRange, bSetHor, bSetVer );
292cdf0e10cSrcweir }
293cdf0e10cSrcweir 
DrawMovePage(sal_uInt16 nOldPos,sal_uInt16 nNewPos)294cdf0e10cSrcweir void ScDocument::DrawMovePage( sal_uInt16 nOldPos, sal_uInt16 nNewPos )
295cdf0e10cSrcweir {
296cdf0e10cSrcweir     pDrawLayer->ScMovePage(nOldPos,nNewPos);
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
DrawCopyPage(sal_uInt16 nOldPos,sal_uInt16 nNewPos)299cdf0e10cSrcweir void ScDocument::DrawCopyPage( sal_uInt16 nOldPos, sal_uInt16 nNewPos )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir     // angelegt wird die Page schon im ScTable ctor
302cdf0e10cSrcweir     pDrawLayer->ScCopyPage( nOldPos, nNewPos, sal_False );
303cdf0e10cSrcweir }
304cdf0e10cSrcweir 
DeleteObjectsInArea(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,const ScMarkData & rMark)305cdf0e10cSrcweir void ScDocument::DeleteObjectsInArea( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
306cdf0e10cSrcweir                         const ScMarkData& rMark )
307cdf0e10cSrcweir {
308cdf0e10cSrcweir     if (!pDrawLayer)
309cdf0e10cSrcweir         return;
310cdf0e10cSrcweir 
311cdf0e10cSrcweir     SCTAB nTabCount = GetTableCount();
312cdf0e10cSrcweir     for (SCTAB nTab=0; nTab<=nTabCount; nTab++)
313cdf0e10cSrcweir         if (pTab[nTab] && rMark.GetTableSelect(nTab))
314cdf0e10cSrcweir             pDrawLayer->DeleteObjectsInArea( nTab, nCol1, nRow1, nCol2, nRow2 );
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
DeleteObjectsInSelection(const ScMarkData & rMark)317cdf0e10cSrcweir void ScDocument::DeleteObjectsInSelection( const ScMarkData& rMark )
318cdf0e10cSrcweir {
319cdf0e10cSrcweir     if (!pDrawLayer)
320cdf0e10cSrcweir         return;
321cdf0e10cSrcweir 
322cdf0e10cSrcweir     pDrawLayer->DeleteObjectsInSelection( rMark );
323cdf0e10cSrcweir }
324cdf0e10cSrcweir 
HasOLEObjectsInArea(const ScRange & rRange,const ScMarkData * pTabMark)325cdf0e10cSrcweir sal_Bool ScDocument::HasOLEObjectsInArea( const ScRange& rRange, const ScMarkData* pTabMark )
326cdf0e10cSrcweir {
327cdf0e10cSrcweir     //  pTabMark is used only for selected tables. If pTabMark is 0, all tables of rRange are used.
328cdf0e10cSrcweir 
329cdf0e10cSrcweir     if (!pDrawLayer)
330cdf0e10cSrcweir         return sal_False;
331cdf0e10cSrcweir 
332cdf0e10cSrcweir     SCTAB nStartTab = 0;
333cdf0e10cSrcweir     SCTAB nEndTab = MAXTAB;
334cdf0e10cSrcweir     if ( !pTabMark )
335cdf0e10cSrcweir     {
336cdf0e10cSrcweir         nStartTab = rRange.aStart.Tab();
337cdf0e10cSrcweir         nEndTab = rRange.aEnd.Tab();
338cdf0e10cSrcweir     }
339cdf0e10cSrcweir 
340cdf0e10cSrcweir     for (SCTAB nTab = nStartTab; nTab <= nEndTab; nTab++)
341cdf0e10cSrcweir     {
342cdf0e10cSrcweir         if ( !pTabMark || pTabMark->GetTableSelect(nTab) )
343cdf0e10cSrcweir         {
344cdf0e10cSrcweir             Rectangle aMMRect = GetMMRect( rRange.aStart.Col(), rRange.aStart.Row(),
345cdf0e10cSrcweir                                             rRange.aEnd.Col(), rRange.aEnd.Row(), nTab );
346cdf0e10cSrcweir 
347cdf0e10cSrcweir             SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
348cdf0e10cSrcweir             DBG_ASSERT(pPage,"Page ?");
349cdf0e10cSrcweir             if (pPage)
350cdf0e10cSrcweir             {
351cdf0e10cSrcweir                 SdrObjListIter aIter( *pPage, IM_FLAT );
352cdf0e10cSrcweir                 SdrObject* pObject = aIter.Next();
353cdf0e10cSrcweir                 while (pObject)
354cdf0e10cSrcweir                 {
355cdf0e10cSrcweir                     if ( pObject->GetObjIdentifier() == OBJ_OLE2 &&
356cdf0e10cSrcweir                             aMMRect.IsInside( pObject->GetCurrentBoundRect() ) )
357cdf0e10cSrcweir                         return sal_True;
358cdf0e10cSrcweir 
359cdf0e10cSrcweir                     pObject = aIter.Next();
360cdf0e10cSrcweir                 }
361cdf0e10cSrcweir             }
362cdf0e10cSrcweir         }
363cdf0e10cSrcweir     }
364cdf0e10cSrcweir 
365cdf0e10cSrcweir     return sal_False;
366cdf0e10cSrcweir }
367cdf0e10cSrcweir 
368cdf0e10cSrcweir 
StartAnimations(SCTAB nTab,Window * pWin)369cdf0e10cSrcweir void ScDocument::StartAnimations( SCTAB nTab, Window* pWin )
370cdf0e10cSrcweir {
371cdf0e10cSrcweir     if (!pDrawLayer)
372cdf0e10cSrcweir         return;
373cdf0e10cSrcweir     SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
374cdf0e10cSrcweir     DBG_ASSERT(pPage,"Page ?");
375cdf0e10cSrcweir     if (!pPage)
376cdf0e10cSrcweir         return;
377cdf0e10cSrcweir 
378cdf0e10cSrcweir     SdrObjListIter aIter( *pPage, IM_FLAT );
379cdf0e10cSrcweir     SdrObject* pObject = aIter.Next();
380cdf0e10cSrcweir     while (pObject)
381cdf0e10cSrcweir     {
382cdf0e10cSrcweir         if (pObject->ISA(SdrGrafObj))
383cdf0e10cSrcweir         {
384cdf0e10cSrcweir             SdrGrafObj* pGrafObj = (SdrGrafObj*)pObject;
385cdf0e10cSrcweir             if ( pGrafObj->IsAnimated() )
386cdf0e10cSrcweir             {
387cdf0e10cSrcweir                 const Rectangle& rRect = pGrafObj->GetCurrentBoundRect();
388cdf0e10cSrcweir                 pGrafObj->StartAnimation( pWin, rRect.TopLeft(), rRect.GetSize() );
389cdf0e10cSrcweir             }
390cdf0e10cSrcweir         }
391cdf0e10cSrcweir         pObject = aIter.Next();
392cdf0e10cSrcweir     }
393cdf0e10cSrcweir }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir //UNUSED2008-05  void ScDocument::RefreshNoteFlags()
396cdf0e10cSrcweir //UNUSED2008-05  {
397cdf0e10cSrcweir //UNUSED2008-05      if (!pDrawLayer)
398cdf0e10cSrcweir //UNUSED2008-05          return;
399cdf0e10cSrcweir //UNUSED2008-05
400cdf0e10cSrcweir //UNUSED2008-05      sal_Bool bAnyIntObj = sal_False;
401cdf0e10cSrcweir //UNUSED2008-05      SCTAB nTab;
402cdf0e10cSrcweir //UNUSED2008-05      ScPostIt aNote(this);
403cdf0e10cSrcweir //UNUSED2008-05      for (nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++)
404cdf0e10cSrcweir //UNUSED2008-05      {
405cdf0e10cSrcweir //UNUSED2008-05          SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
406cdf0e10cSrcweir //UNUSED2008-05          DBG_ASSERT(pPage,"Page ?");
407cdf0e10cSrcweir //UNUSED2008-05          if (pPage)
408cdf0e10cSrcweir //UNUSED2008-05          {
409cdf0e10cSrcweir //UNUSED2008-05              SdrObjListIter aIter( *pPage, IM_FLAT );
410cdf0e10cSrcweir //UNUSED2008-05              SdrObject* pObject = aIter.Next();
411cdf0e10cSrcweir //UNUSED2008-05              while (pObject)
412cdf0e10cSrcweir //UNUSED2008-05              {
413cdf0e10cSrcweir //UNUSED2008-05                  if ( pObject->GetLayer() == SC_LAYER_INTERN )
414cdf0e10cSrcweir //UNUSED2008-05                  {
415cdf0e10cSrcweir //UNUSED2008-05                      bAnyIntObj = sal_True;  // for all internal objects, including detective
416cdf0e10cSrcweir //UNUSED2008-05
417cdf0e10cSrcweir //UNUSED2008-05                      if ( pObject->ISA( SdrCaptionObj ) )
418cdf0e10cSrcweir //UNUSED2008-05                      {
419cdf0e10cSrcweir //UNUSED2008-05                          ScDrawObjData* pData = ScDrawLayer::GetObjData( pObject );
420cdf0e10cSrcweir //UNUSED2008-05                          if ( pData )
421cdf0e10cSrcweir //UNUSED2008-05                          {
422cdf0e10cSrcweir //UNUSED2008-05                              if ( GetNote( pData->aStt.Col(), pData->aStt.Row(), nTab, aNote))
423cdf0e10cSrcweir //UNUSED2008-05                                  if ( !aNote.IsShown() )
424cdf0e10cSrcweir //UNUSED2008-05                                  {
425cdf0e10cSrcweir //UNUSED2008-05                                      aNote.SetShown(sal_True);
426cdf0e10cSrcweir //UNUSED2008-05                                      SetNote( pData->aStt.Col(), pData->aStt.Row(), nTab, aNote);
427cdf0e10cSrcweir //UNUSED2008-05                                  }
428cdf0e10cSrcweir //UNUSED2008-05                          }
429cdf0e10cSrcweir //UNUSED2008-05                      }
430cdf0e10cSrcweir //UNUSED2008-05                  }
431cdf0e10cSrcweir //UNUSED2008-05                  pObject = aIter.Next();
432cdf0e10cSrcweir //UNUSED2008-05              }
433cdf0e10cSrcweir //UNUSED2008-05          }
434cdf0e10cSrcweir //UNUSED2008-05      }
435cdf0e10cSrcweir //UNUSED2008-05
436cdf0e10cSrcweir //UNUSED2008-05      if (bAnyIntObj)
437cdf0e10cSrcweir //UNUSED2008-05      {
438cdf0e10cSrcweir //UNUSED2008-05          //  update attributes for all note objects and the colors of detective objects
439cdf0e10cSrcweir //UNUSED2008-05          //  (we don't know with which settings the file was created)
440cdf0e10cSrcweir //UNUSED2008-05
441cdf0e10cSrcweir //UNUSED2008-05          ScDetectiveFunc aFunc( this, 0 );
442cdf0e10cSrcweir //UNUSED2008-05          aFunc.UpdateAllComments();
443cdf0e10cSrcweir //UNUSED2008-05          aFunc.UpdateAllArrowColors();
444cdf0e10cSrcweir //UNUSED2008-05      }
445cdf0e10cSrcweir //UNUSED2008-05  }
446cdf0e10cSrcweir 
HasBackgroundDraw(SCTAB nTab,const Rectangle & rMMRect)447cdf0e10cSrcweir sal_Bool ScDocument::HasBackgroundDraw( SCTAB nTab, const Rectangle& rMMRect )
448cdf0e10cSrcweir {
449cdf0e10cSrcweir     //  Gibt es Objekte auf dem Hintergrund-Layer, die (teilweise) von rMMRect
450cdf0e10cSrcweir     //  betroffen sind?
451cdf0e10cSrcweir     //  (fuer Drawing-Optimierung, vor dem Hintergrund braucht dann nicht geloescht
452cdf0e10cSrcweir     //   zu werden)
453cdf0e10cSrcweir 
454cdf0e10cSrcweir     if (!pDrawLayer)
455cdf0e10cSrcweir         return sal_False;
456cdf0e10cSrcweir     SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
457cdf0e10cSrcweir     DBG_ASSERT(pPage,"Page ?");
458cdf0e10cSrcweir     if (!pPage)
459cdf0e10cSrcweir         return sal_False;
460cdf0e10cSrcweir 
461cdf0e10cSrcweir     sal_Bool bFound = sal_False;
462cdf0e10cSrcweir 
463cdf0e10cSrcweir     SdrObjListIter aIter( *pPage, IM_FLAT );
464cdf0e10cSrcweir     SdrObject* pObject = aIter.Next();
465cdf0e10cSrcweir     while (pObject && !bFound)
466cdf0e10cSrcweir     {
467cdf0e10cSrcweir         if ( pObject->GetLayer() == SC_LAYER_BACK && pObject->GetCurrentBoundRect().IsOver( rMMRect ) )
468cdf0e10cSrcweir             bFound = sal_True;
469cdf0e10cSrcweir         pObject = aIter.Next();
470cdf0e10cSrcweir     }
471cdf0e10cSrcweir 
472cdf0e10cSrcweir     return bFound;
473cdf0e10cSrcweir }
474cdf0e10cSrcweir 
HasAnyDraw(SCTAB nTab,const Rectangle & rMMRect)475cdf0e10cSrcweir sal_Bool ScDocument::HasAnyDraw( SCTAB nTab, const Rectangle& rMMRect )
476cdf0e10cSrcweir {
477cdf0e10cSrcweir     //  Gibt es ueberhaupt Objekte, die (teilweise) von rMMRect
478cdf0e10cSrcweir     //  betroffen sind?
479cdf0e10cSrcweir     //  (um leere Seiten beim Drucken zu erkennen)
480cdf0e10cSrcweir 
481cdf0e10cSrcweir     if (!pDrawLayer)
482cdf0e10cSrcweir         return sal_False;
483cdf0e10cSrcweir     SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
484cdf0e10cSrcweir     DBG_ASSERT(pPage,"Page ?");
485cdf0e10cSrcweir     if (!pPage)
486cdf0e10cSrcweir         return sal_False;
487cdf0e10cSrcweir 
488cdf0e10cSrcweir     sal_Bool bFound = sal_False;
489cdf0e10cSrcweir 
490cdf0e10cSrcweir     SdrObjListIter aIter( *pPage, IM_FLAT );
491cdf0e10cSrcweir     SdrObject* pObject = aIter.Next();
492cdf0e10cSrcweir     while (pObject && !bFound)
493cdf0e10cSrcweir     {
494cdf0e10cSrcweir         if ( pObject->GetCurrentBoundRect().IsOver( rMMRect ) )
495cdf0e10cSrcweir             bFound = sal_True;
496cdf0e10cSrcweir         pObject = aIter.Next();
497cdf0e10cSrcweir     }
498cdf0e10cSrcweir 
499cdf0e10cSrcweir     return bFound;
500cdf0e10cSrcweir }
501cdf0e10cSrcweir 
EnsureGraphicNames()502cdf0e10cSrcweir void ScDocument::EnsureGraphicNames()
503cdf0e10cSrcweir {
504cdf0e10cSrcweir     if (pDrawLayer)
505cdf0e10cSrcweir         pDrawLayer->EnsureGraphicNames();
506cdf0e10cSrcweir }
507cdf0e10cSrcweir 
GetObjectAtPoint(SCTAB nTab,const Point & rPos)508cdf0e10cSrcweir SdrObject* ScDocument::GetObjectAtPoint( SCTAB nTab, const Point& rPos )
509cdf0e10cSrcweir {
510cdf0e10cSrcweir     //  fuer Drag&Drop auf Zeichenobjekt
511cdf0e10cSrcweir 
512cdf0e10cSrcweir     SdrObject* pFound = NULL;
513cdf0e10cSrcweir     if (pDrawLayer && pTab[nTab])
514cdf0e10cSrcweir     {
515cdf0e10cSrcweir         SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
516cdf0e10cSrcweir         DBG_ASSERT(pPage,"Page ?");
517cdf0e10cSrcweir         if (pPage)
518cdf0e10cSrcweir         {
519cdf0e10cSrcweir             SdrObjListIter aIter( *pPage, IM_FLAT );
520cdf0e10cSrcweir             SdrObject* pObject = aIter.Next();
521cdf0e10cSrcweir             while (pObject)
522cdf0e10cSrcweir             {
523cdf0e10cSrcweir                 if ( pObject->GetCurrentBoundRect().IsInside(rPos) )
524cdf0e10cSrcweir                 {
525cdf0e10cSrcweir                     //  Intern interessiert gar nicht
526cdf0e10cSrcweir                     //  Objekt vom Back-Layer nur, wenn kein Objekt von anderem Layer getroffen
527cdf0e10cSrcweir 
528cdf0e10cSrcweir                     SdrLayerID nLayer = pObject->GetLayer();
529cdf0e10cSrcweir                     if ( (nLayer != SC_LAYER_INTERN) && (nLayer != SC_LAYER_HIDDEN) )
530cdf0e10cSrcweir                     {
531cdf0e10cSrcweir                         if ( nLayer != SC_LAYER_BACK ||
532cdf0e10cSrcweir                                 !pFound || pFound->GetLayer() == SC_LAYER_BACK )
533cdf0e10cSrcweir                         {
534cdf0e10cSrcweir                             pFound = pObject;
535cdf0e10cSrcweir                         }
536cdf0e10cSrcweir                     }
537cdf0e10cSrcweir                 }
538cdf0e10cSrcweir                 //  weitersuchen -> letztes (oberstes) getroffenes Objekt nehmen
539cdf0e10cSrcweir 
540cdf0e10cSrcweir                 pObject = aIter.Next();
541cdf0e10cSrcweir             }
542cdf0e10cSrcweir         }
543cdf0e10cSrcweir     }
544cdf0e10cSrcweir     return pFound;
545cdf0e10cSrcweir }
546cdf0e10cSrcweir 
IsPrintEmpty(SCTAB nTab,SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,sal_Bool bLeftIsEmpty,ScRange * pLastRange,Rectangle * pLastMM) const547cdf0e10cSrcweir sal_Bool ScDocument::IsPrintEmpty( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow,
548cdf0e10cSrcweir                                 SCCOL nEndCol, SCROW nEndRow, sal_Bool bLeftIsEmpty,
549cdf0e10cSrcweir                                 ScRange* pLastRange, Rectangle* pLastMM ) const
550cdf0e10cSrcweir {
551cdf0e10cSrcweir     if (!IsBlockEmpty( nTab, nStartCol, nStartRow, nEndCol, nEndRow ))
552cdf0e10cSrcweir         return sal_False;
553cdf0e10cSrcweir 
554cdf0e10cSrcweir     ScDocument* pThis = (ScDocument*)this;  //! GetMMRect / HasAnyDraw etc. const !!!
555cdf0e10cSrcweir 
556cdf0e10cSrcweir     Rectangle aMMRect;
557cdf0e10cSrcweir     if ( pLastRange && pLastMM && nTab == pLastRange->aStart.Tab() &&
558cdf0e10cSrcweir             nStartRow == pLastRange->aStart.Row() && nEndRow == pLastRange->aEnd.Row() )
559cdf0e10cSrcweir     {
560cdf0e10cSrcweir         //  keep vertical part of aMMRect, only update horizontal position
561cdf0e10cSrcweir         aMMRect = *pLastMM;
562cdf0e10cSrcweir 
563cdf0e10cSrcweir         long nLeft = 0;
564cdf0e10cSrcweir         SCCOL i;
565cdf0e10cSrcweir         for (i=0; i<nStartCol; i++)
566cdf0e10cSrcweir             nLeft += GetColWidth(i,nTab);
567cdf0e10cSrcweir         long nRight = nLeft;
568cdf0e10cSrcweir         for (i=nStartCol; i<=nEndCol; i++)
569cdf0e10cSrcweir             nRight += GetColWidth(i,nTab);
570cdf0e10cSrcweir 
571cdf0e10cSrcweir         aMMRect.Left()  = (long)(nLeft  * HMM_PER_TWIPS);
572cdf0e10cSrcweir         aMMRect.Right() = (long)(nRight * HMM_PER_TWIPS);
573cdf0e10cSrcweir     }
574cdf0e10cSrcweir     else
575cdf0e10cSrcweir         aMMRect = pThis->GetMMRect( nStartCol, nStartRow, nEndCol, nEndRow, nTab );
576cdf0e10cSrcweir 
577cdf0e10cSrcweir     if ( pLastRange && pLastMM )
578cdf0e10cSrcweir     {
579cdf0e10cSrcweir         *pLastRange = ScRange( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab );
580cdf0e10cSrcweir         *pLastMM = aMMRect;
581cdf0e10cSrcweir     }
582cdf0e10cSrcweir 
583cdf0e10cSrcweir     if ( pThis->HasAnyDraw( nTab, aMMRect ))
584cdf0e10cSrcweir         return sal_False;
585cdf0e10cSrcweir 
586cdf0e10cSrcweir     if ( nStartCol > 0 && !bLeftIsEmpty )
587cdf0e10cSrcweir     {
588cdf0e10cSrcweir         //  aehnlich wie in ScPrintFunc::AdjustPrintArea
589cdf0e10cSrcweir         //! ExtendPrintArea erst ab Start-Spalte des Druckbereichs
590cdf0e10cSrcweir 
591cdf0e10cSrcweir         SCCOL nExtendCol = nStartCol - 1;
592cdf0e10cSrcweir         SCROW nTmpRow = nEndRow;
593cdf0e10cSrcweir 
594cdf0e10cSrcweir         pThis->ExtendMerge( 0,nStartRow, nExtendCol,nTmpRow, nTab,
595cdf0e10cSrcweir                             sal_False, sal_True );      // kein Refresh, incl. Attrs
596cdf0e10cSrcweir 
597cdf0e10cSrcweir         OutputDevice* pDev = pThis->GetPrinter();
598cdf0e10cSrcweir         pDev->SetMapMode( MAP_PIXEL );              // wichtig fuer GetNeededSize
599cdf0e10cSrcweir         pThis->ExtendPrintArea( pDev, nTab, 0, nStartRow, nExtendCol, nEndRow );
600cdf0e10cSrcweir         if ( nExtendCol >= nStartCol )
601cdf0e10cSrcweir             return sal_False;
602cdf0e10cSrcweir     }
603cdf0e10cSrcweir 
604cdf0e10cSrcweir     return sal_True;
605cdf0e10cSrcweir }
606cdf0e10cSrcweir 
Clear(sal_Bool bFromDestructor)607cdf0e10cSrcweir void ScDocument::Clear( sal_Bool bFromDestructor )
608cdf0e10cSrcweir {
609cdf0e10cSrcweir     for (SCTAB i=0; i<=MAXTAB; i++)
610cdf0e10cSrcweir         if (pTab[i])
611cdf0e10cSrcweir         {
612cdf0e10cSrcweir             delete pTab[i];
613cdf0e10cSrcweir             pTab[i]=NULL;
614cdf0e10cSrcweir         }
615cdf0e10cSrcweir     delete pSelectionAttr;
616cdf0e10cSrcweir     pSelectionAttr = NULL;
617cdf0e10cSrcweir 
618cdf0e10cSrcweir     if (pDrawLayer)
619cdf0e10cSrcweir     {
620cdf0e10cSrcweir         // #116168#
621cdf0e10cSrcweir         //pDrawLayer->Clear();
622cdf0e10cSrcweir         pDrawLayer->ClearModel( bFromDestructor );
623cdf0e10cSrcweir     }
624cdf0e10cSrcweir }
625cdf0e10cSrcweir 
HasControl(SCTAB nTab,const Rectangle & rMMRect)626cdf0e10cSrcweir sal_Bool ScDocument::HasControl( SCTAB nTab, const Rectangle& rMMRect )
627cdf0e10cSrcweir {
628cdf0e10cSrcweir     sal_Bool bFound = sal_False;
629cdf0e10cSrcweir 
630cdf0e10cSrcweir     if (pDrawLayer)
631cdf0e10cSrcweir     {
632cdf0e10cSrcweir         SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
633cdf0e10cSrcweir         DBG_ASSERT(pPage,"Page ?");
634cdf0e10cSrcweir         if (pPage)
635cdf0e10cSrcweir         {
636cdf0e10cSrcweir             SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
637cdf0e10cSrcweir             SdrObject* pObject = aIter.Next();
638cdf0e10cSrcweir             while (pObject && !bFound)
639cdf0e10cSrcweir             {
640cdf0e10cSrcweir                 if (pObject->ISA(SdrUnoObj))
641cdf0e10cSrcweir                 {
642cdf0e10cSrcweir                     Rectangle aObjRect = pObject->GetLogicRect();
643cdf0e10cSrcweir                     if ( aObjRect.IsOver( rMMRect ) )
644cdf0e10cSrcweir                         bFound = sal_True;
645cdf0e10cSrcweir                 }
646cdf0e10cSrcweir 
647cdf0e10cSrcweir                 pObject = aIter.Next();
648cdf0e10cSrcweir             }
649cdf0e10cSrcweir         }
650cdf0e10cSrcweir     }
651cdf0e10cSrcweir 
652cdf0e10cSrcweir     return bFound;
653cdf0e10cSrcweir }
654cdf0e10cSrcweir 
InvalidateControls(Window * pWin,SCTAB nTab,const Rectangle & rMMRect)655cdf0e10cSrcweir void ScDocument::InvalidateControls( Window* pWin, SCTAB nTab, const Rectangle& rMMRect )
656cdf0e10cSrcweir {
657cdf0e10cSrcweir     if (pDrawLayer)
658cdf0e10cSrcweir     {
659cdf0e10cSrcweir         SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
660cdf0e10cSrcweir         DBG_ASSERT(pPage,"Page ?");
661cdf0e10cSrcweir         if (pPage)
662cdf0e10cSrcweir         {
663cdf0e10cSrcweir             SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
664cdf0e10cSrcweir             SdrObject* pObject = aIter.Next();
665cdf0e10cSrcweir             while (pObject)
666cdf0e10cSrcweir             {
667cdf0e10cSrcweir                 if (pObject->ISA(SdrUnoObj))
668cdf0e10cSrcweir                 {
669cdf0e10cSrcweir                     Rectangle aObjRect = pObject->GetLogicRect();
670cdf0e10cSrcweir                     if ( aObjRect.IsOver( rMMRect ) )
671cdf0e10cSrcweir                     {
672cdf0e10cSrcweir                         //  Uno-Controls zeichnen sich immer komplett, ohne Ruecksicht
673cdf0e10cSrcweir                         //  auf ClippingRegions. Darum muss das ganze Objekt neu gepainted
674cdf0e10cSrcweir                         //  werden, damit die Selektion auf der Tabelle nicht uebermalt wird.
675cdf0e10cSrcweir 
676cdf0e10cSrcweir                         //pWin->Invalidate( aObjRect.GetIntersection( rMMRect ) );
677cdf0e10cSrcweir                         pWin->Invalidate( aObjRect );
678cdf0e10cSrcweir                     }
679cdf0e10cSrcweir                 }
680cdf0e10cSrcweir 
681cdf0e10cSrcweir                 pObject = aIter.Next();
682cdf0e10cSrcweir             }
683cdf0e10cSrcweir         }
684cdf0e10cSrcweir     }
685cdf0e10cSrcweir }
686cdf0e10cSrcweir 
HasDetectiveObjects(SCTAB nTab) const687cdf0e10cSrcweir sal_Bool ScDocument::HasDetectiveObjects(SCTAB nTab) const
688cdf0e10cSrcweir {
689cdf0e10cSrcweir     //  looks for detective objects, annotations don't count
690cdf0e10cSrcweir     //  (used to adjust scale so detective objects hit their cells better)
691cdf0e10cSrcweir 
692cdf0e10cSrcweir     sal_Bool bFound = sal_False;
693cdf0e10cSrcweir 
694cdf0e10cSrcweir     if (pDrawLayer)
695cdf0e10cSrcweir     {
696cdf0e10cSrcweir         SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
697cdf0e10cSrcweir         DBG_ASSERT(pPage,"Page ?");
698cdf0e10cSrcweir         if (pPage)
699cdf0e10cSrcweir         {
700cdf0e10cSrcweir             SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
701cdf0e10cSrcweir             SdrObject* pObject = aIter.Next();
702cdf0e10cSrcweir             while (pObject && !bFound)
703cdf0e10cSrcweir             {
704cdf0e10cSrcweir                 // anything on the internal layer except captions (annotations)
705cdf0e10cSrcweir                 if ( (pObject->GetLayer() == SC_LAYER_INTERN) && !ScDrawLayer::IsNoteCaption( pObject ) )
706cdf0e10cSrcweir                     bFound = sal_True;
707cdf0e10cSrcweir 
708cdf0e10cSrcweir                 pObject = aIter.Next();
709cdf0e10cSrcweir             }
710cdf0e10cSrcweir         }
711cdf0e10cSrcweir     }
712cdf0e10cSrcweir 
713cdf0e10cSrcweir     return bFound;
714cdf0e10cSrcweir }
715cdf0e10cSrcweir 
UpdateFontCharSet()716cdf0e10cSrcweir void ScDocument::UpdateFontCharSet()
717cdf0e10cSrcweir {
718cdf0e10cSrcweir     //  In alten Versionen (bis incl. 4.0 ohne SP) wurden beim Austausch zwischen
719cdf0e10cSrcweir     //  Systemen die CharSets in den Font-Attributen nicht angepasst.
720cdf0e10cSrcweir     //  Das muss fuer Dokumente bis incl SP2 nun nachgeholt werden:
721cdf0e10cSrcweir     //  Alles, was nicht SYMBOL ist, wird auf den System-CharSet umgesetzt.
722cdf0e10cSrcweir     //  Bei neuen Dokumenten (Version SC_FONTCHARSET) sollte der CharSet stimmen.
723cdf0e10cSrcweir 
724cdf0e10cSrcweir     sal_Bool bUpdateOld = ( nSrcVer < SC_FONTCHARSET );
725cdf0e10cSrcweir 
726cdf0e10cSrcweir     CharSet eSysSet = gsl_getSystemTextEncoding();
727cdf0e10cSrcweir     if ( eSrcSet != eSysSet || bUpdateOld )
728cdf0e10cSrcweir     {
729cdf0e10cSrcweir         sal_uInt32 nCount,i;
730cdf0e10cSrcweir         SvxFontItem* pItem;
731cdf0e10cSrcweir 
732cdf0e10cSrcweir         ScDocumentPool* pPool = xPoolHelper->GetDocPool();
733cdf0e10cSrcweir         nCount = pPool->GetItemCount2(ATTR_FONT);
734cdf0e10cSrcweir         for (i=0; i<nCount; i++)
735cdf0e10cSrcweir         {
736cdf0e10cSrcweir             pItem = (SvxFontItem*)pPool->GetItem2(ATTR_FONT, i);
737cdf0e10cSrcweir             if ( pItem && ( pItem->GetCharSet() == eSrcSet ||
738cdf0e10cSrcweir                             ( bUpdateOld && pItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) )
739cdf0e10cSrcweir                 pItem->SetCharSet(eSysSet);
740cdf0e10cSrcweir         }
741cdf0e10cSrcweir 
742cdf0e10cSrcweir         if ( pDrawLayer )
743cdf0e10cSrcweir         {
744cdf0e10cSrcweir             SfxItemPool& rDrawPool = pDrawLayer->GetItemPool();
745cdf0e10cSrcweir             nCount = rDrawPool.GetItemCount2(EE_CHAR_FONTINFO);
746cdf0e10cSrcweir             for (i=0; i<nCount; i++)
747cdf0e10cSrcweir             {
748cdf0e10cSrcweir                 pItem = (SvxFontItem*)rDrawPool.GetItem2(EE_CHAR_FONTINFO, i);
749cdf0e10cSrcweir                 if ( pItem && ( pItem->GetCharSet() == eSrcSet ||
750cdf0e10cSrcweir                                 ( bUpdateOld && pItem->GetCharSet() != RTL_TEXTENCODING_SYMBOL ) ) )
751cdf0e10cSrcweir                     pItem->SetCharSet( eSysSet );
752cdf0e10cSrcweir             }
753cdf0e10cSrcweir         }
754cdf0e10cSrcweir     }
755cdf0e10cSrcweir }
756cdf0e10cSrcweir 
SetLoadingMedium(bool bVal)757cdf0e10cSrcweir void ScDocument::SetLoadingMedium( bool bVal )
758cdf0e10cSrcweir {
759cdf0e10cSrcweir     bLoadingMedium = bVal;
760cdf0e10cSrcweir     for (SCTAB nTab = 0; nTab <= MAXTAB; ++nTab)
761cdf0e10cSrcweir     {
762cdf0e10cSrcweir         if (!pTab[nTab])
763cdf0e10cSrcweir             return;
764cdf0e10cSrcweir 
765cdf0e10cSrcweir         pTab[nTab]->SetLoadingMedium(bVal);
766cdf0e10cSrcweir     }
767cdf0e10cSrcweir }
768cdf0e10cSrcweir 
SetImportingXML(bool bVal)769cdf0e10cSrcweir void ScDocument::SetImportingXML( bool bVal )
770cdf0e10cSrcweir {
771cdf0e10cSrcweir     bImportingXML = bVal;
772cdf0e10cSrcweir     if (pDrawLayer)
773cdf0e10cSrcweir         pDrawLayer->EnableAdjust(!bImportingXML);
774cdf0e10cSrcweir 
775cdf0e10cSrcweir     if ( !bVal )
776cdf0e10cSrcweir     {
777cdf0e10cSrcweir         // #i57869# after loading, do the real RTL mirroring for the sheets that have the LoadingRTL flag set
778cdf0e10cSrcweir 
779cdf0e10cSrcweir         for ( SCTAB nTab=0; nTab<=MAXTAB && pTab[nTab]; nTab++ )
780cdf0e10cSrcweir             if ( pTab[nTab]->IsLoadingRTL() )
781cdf0e10cSrcweir             {
782cdf0e10cSrcweir                 pTab[nTab]->SetLoadingRTL( sal_False );
783cdf0e10cSrcweir                 SetLayoutRTL( nTab, sal_True );             // includes mirroring; bImportingXML must be cleared first
784cdf0e10cSrcweir             }
785cdf0e10cSrcweir     }
786cdf0e10cSrcweir 
787cdf0e10cSrcweir     SetLoadingMedium(bVal);
788cdf0e10cSrcweir }
789cdf0e10cSrcweir 
SetImportingMSXML(bool bVal)790577c0052SWang Lei void ScDocument::SetImportingMSXML( bool bVal )
791577c0052SWang Lei {
792577c0052SWang Lei     mbImportingMSXML = bVal;
793577c0052SWang Lei 
794577c0052SWang Lei     if (pDrawLayer)
795577c0052SWang Lei         pDrawLayer->SetUndoAllowed( !mbImportingMSXML );
796577c0052SWang Lei }
797577c0052SWang Lei 
SetXMLFromWrapper(sal_Bool bVal)798cdf0e10cSrcweir void ScDocument::SetXMLFromWrapper( sal_Bool bVal )
799cdf0e10cSrcweir {
800cdf0e10cSrcweir     bXMLFromWrapper = bVal;
801cdf0e10cSrcweir }
802cdf0e10cSrcweir 
GetForbiddenCharacters()803cdf0e10cSrcweir vos::ORef<SvxForbiddenCharactersTable> ScDocument::GetForbiddenCharacters()
804cdf0e10cSrcweir {
805cdf0e10cSrcweir     return xForbiddenCharacters;
806cdf0e10cSrcweir }
807cdf0e10cSrcweir 
SetForbiddenCharacters(const vos::ORef<SvxForbiddenCharactersTable> xNew)808cdf0e10cSrcweir void ScDocument::SetForbiddenCharacters( const vos::ORef<SvxForbiddenCharactersTable> xNew )
809cdf0e10cSrcweir {
810cdf0e10cSrcweir     xForbiddenCharacters = xNew;
811cdf0e10cSrcweir     if ( pEditEngine )
812cdf0e10cSrcweir         pEditEngine->SetForbiddenCharsTable( xForbiddenCharacters );
813cdf0e10cSrcweir     if ( pDrawLayer )
814cdf0e10cSrcweir         pDrawLayer->SetForbiddenCharsTable( xForbiddenCharacters );
815cdf0e10cSrcweir }
816cdf0e10cSrcweir 
IsValidAsianCompression() const817cdf0e10cSrcweir sal_Bool ScDocument::IsValidAsianCompression() const
818cdf0e10cSrcweir {
819cdf0e10cSrcweir     return ( nAsianCompression != SC_ASIANCOMPRESSION_INVALID );
820cdf0e10cSrcweir }
821cdf0e10cSrcweir 
GetAsianCompression() const822cdf0e10cSrcweir sal_uInt8 ScDocument::GetAsianCompression() const
823cdf0e10cSrcweir {
824cdf0e10cSrcweir     if ( nAsianCompression == SC_ASIANCOMPRESSION_INVALID )
825cdf0e10cSrcweir         return 0;
826cdf0e10cSrcweir     else
827cdf0e10cSrcweir         return nAsianCompression;
828cdf0e10cSrcweir }
829cdf0e10cSrcweir 
SetAsianCompression(sal_uInt8 nNew)830cdf0e10cSrcweir void ScDocument::SetAsianCompression(sal_uInt8 nNew)
831cdf0e10cSrcweir {
832cdf0e10cSrcweir     nAsianCompression = nNew;
833cdf0e10cSrcweir     if ( pEditEngine )
834cdf0e10cSrcweir         pEditEngine->SetAsianCompressionMode( nAsianCompression );
835cdf0e10cSrcweir     if ( pDrawLayer )
836cdf0e10cSrcweir         pDrawLayer->SetCharCompressType( nAsianCompression );
837cdf0e10cSrcweir }
838cdf0e10cSrcweir 
IsValidAsianKerning() const839cdf0e10cSrcweir sal_Bool ScDocument::IsValidAsianKerning() const
840cdf0e10cSrcweir {
841cdf0e10cSrcweir     return ( nAsianKerning != SC_ASIANKERNING_INVALID );
842cdf0e10cSrcweir }
843cdf0e10cSrcweir 
GetAsianKerning() const844cdf0e10cSrcweir sal_Bool ScDocument::GetAsianKerning() const
845cdf0e10cSrcweir {
846cdf0e10cSrcweir     if ( nAsianKerning == SC_ASIANKERNING_INVALID )
847cdf0e10cSrcweir         return sal_False;
848cdf0e10cSrcweir     else
849cdf0e10cSrcweir         return (sal_Bool)nAsianKerning;
850cdf0e10cSrcweir }
851cdf0e10cSrcweir 
SetAsianKerning(sal_Bool bNew)852cdf0e10cSrcweir void ScDocument::SetAsianKerning(sal_Bool bNew)
853cdf0e10cSrcweir {
854cdf0e10cSrcweir     nAsianKerning = (sal_uInt8)bNew;
855cdf0e10cSrcweir     if ( pEditEngine )
856cdf0e10cSrcweir         pEditEngine->SetKernAsianPunctuation( (sal_Bool)nAsianKerning );
857cdf0e10cSrcweir     if ( pDrawLayer )
858cdf0e10cSrcweir         pDrawLayer->SetKernAsianPunctuation( (sal_Bool)nAsianKerning );
859cdf0e10cSrcweir }
860cdf0e10cSrcweir 
ApplyAsianEditSettings(ScEditEngineDefaulter & rEngine)861cdf0e10cSrcweir void ScDocument::ApplyAsianEditSettings( ScEditEngineDefaulter& rEngine )
862cdf0e10cSrcweir {
863cdf0e10cSrcweir     rEngine.SetForbiddenCharsTable( xForbiddenCharacters );
864cdf0e10cSrcweir     rEngine.SetAsianCompressionMode( GetAsianCompression() );
865cdf0e10cSrcweir     rEngine.SetKernAsianPunctuation( GetAsianKerning() );
866cdf0e10cSrcweir }
867