xref: /trunk/main/sc/source/core/data/document.cxx (revision 94f40e846ad5ad50c2a5a04ce7779e4e0d5135df)
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 
22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
23cdf0e10cSrcweir #include "precompiled_sc.hxx"
24cdf0e10cSrcweir 
25cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #define _ZFORLIST_DECLARE_TABLE
28cdf0e10cSrcweir #include "scitems.hxx"
29cdf0e10cSrcweir #include <editeng/eeitem.hxx>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include <editeng/boxitem.hxx>
32cdf0e10cSrcweir #include <editeng/frmdiritem.hxx>
33cdf0e10cSrcweir #include <svx/pageitem.hxx>
34cdf0e10cSrcweir #include <editeng/editeng.hxx>
35cdf0e10cSrcweir #include <svx/svditer.hxx>
36cdf0e10cSrcweir #include <svx/svdpage.hxx>
37cdf0e10cSrcweir #include <svx/svdocapt.hxx>
38cdf0e10cSrcweir #include <sfx2/app.hxx>
39cdf0e10cSrcweir #include <sfx2/objsh.hxx>
40cdf0e10cSrcweir #include <svl/poolcach.hxx>
41cdf0e10cSrcweir #include <unotools/saveopt.hxx>
42cdf0e10cSrcweir #include <svl/zforlist.hxx>
43cdf0e10cSrcweir #include <unotools/charclass.hxx>
44cdf0e10cSrcweir #include <unotools/transliterationwrapper.hxx>
45cdf0e10cSrcweir #include <tools/tenccvt.hxx>
4614af77b6SArmin Le Grand #include <svx/sdrundomanager.hxx>
47cdf0e10cSrcweir 
48cdf0e10cSrcweir #include <com/sun/star/text/WritingMode2.hpp>
49cdf0e10cSrcweir #include <com/sun/star/script/vba/XVBACompatibility.hpp>
50cdf0e10cSrcweir #include <com/sun/star/sheet/TablePageBreakData.hpp>
51cdf0e10cSrcweir 
52cdf0e10cSrcweir #include "document.hxx"
53cdf0e10cSrcweir #include "table.hxx"
54cdf0e10cSrcweir #include "attrib.hxx"
55cdf0e10cSrcweir #include "attarray.hxx"
56cdf0e10cSrcweir #include "markarr.hxx"
57cdf0e10cSrcweir #include "patattr.hxx"
58cdf0e10cSrcweir #include "rangenam.hxx"
59cdf0e10cSrcweir #include "poolhelp.hxx"
60cdf0e10cSrcweir #include "docpool.hxx"
61cdf0e10cSrcweir #include "stlpool.hxx"
62cdf0e10cSrcweir #include "stlsheet.hxx"
63cdf0e10cSrcweir #include "globstr.hrc"
64cdf0e10cSrcweir #include "rechead.hxx"
65cdf0e10cSrcweir #include "dbcolect.hxx"
66cdf0e10cSrcweir #include "pivot.hxx"
67cdf0e10cSrcweir #include "chartlis.hxx"
68cdf0e10cSrcweir #include "rangelst.hxx"
69cdf0e10cSrcweir #include "markdata.hxx"
70cdf0e10cSrcweir #include "drwlayer.hxx"
71cdf0e10cSrcweir #include "conditio.hxx"
72cdf0e10cSrcweir #include "validat.hxx"
73cdf0e10cSrcweir #include "prnsave.hxx"
74cdf0e10cSrcweir #include "chgtrack.hxx"
75cdf0e10cSrcweir #include "sc.hrc"
76cdf0e10cSrcweir #include "scresid.hxx"
77cdf0e10cSrcweir #include "hints.hxx"
78cdf0e10cSrcweir #include "detdata.hxx"
79cdf0e10cSrcweir #include "cell.hxx"
80cdf0e10cSrcweir #include "dpobject.hxx"
81cdf0e10cSrcweir #include "detfunc.hxx" // for UpdateAllComments
82cdf0e10cSrcweir #include "scmod.hxx"
83cdf0e10cSrcweir #include "dociter.hxx"
84cdf0e10cSrcweir #include "progress.hxx"
85cdf0e10cSrcweir #include "autonamecache.hxx"
86cdf0e10cSrcweir #include "bcaslot.hxx"
87cdf0e10cSrcweir #include "postit.hxx"
88cdf0e10cSrcweir #include "externalrefmgr.hxx"
89cdf0e10cSrcweir #include "tabprotection.hxx"
90cdf0e10cSrcweir #include "clipparam.hxx"
91cdf0e10cSrcweir 
92cdf0e10cSrcweir #include <map>
93cdf0e10cSrcweir #include <limits>
94cdf0e10cSrcweir 
95cdf0e10cSrcweir namespace WritingMode2 = ::com::sun::star::text::WritingMode2;
96cdf0e10cSrcweir using ::com::sun::star::uno::Sequence;
97cdf0e10cSrcweir using ::com::sun::star::sheet::TablePageBreakData;
98cdf0e10cSrcweir using ::std::set;
99cdf0e10cSrcweir 
100cdf0e10cSrcweir struct ScDefaultAttr
101cdf0e10cSrcweir {
102cdf0e10cSrcweir     const ScPatternAttr*    pAttr;
103cdf0e10cSrcweir     SCROW                   nFirst;
104cdf0e10cSrcweir     SCSIZE                  nCount;
ScDefaultAttrScDefaultAttr105cdf0e10cSrcweir     ScDefaultAttr(const ScPatternAttr* pPatAttr) : pAttr(pPatAttr), nFirst(0), nCount(0) {}
106cdf0e10cSrcweir };
107cdf0e10cSrcweir 
108cdf0e10cSrcweir struct ScLessDefaultAttr
109cdf0e10cSrcweir {
operator ()ScLessDefaultAttr110cdf0e10cSrcweir     sal_Bool operator() (const ScDefaultAttr& rValue1, const ScDefaultAttr& rValue2) const
111cdf0e10cSrcweir     {
112cdf0e10cSrcweir         return rValue1.pAttr < rValue2.pAttr;
113cdf0e10cSrcweir     }
114cdf0e10cSrcweir };
115cdf0e10cSrcweir 
116cdf0e10cSrcweir typedef std::set<ScDefaultAttr, ScLessDefaultAttr>  ScDefaultAttrSet;
117cdf0e10cSrcweir 
MakeTable(SCTAB nTab,bool _bNeedsNameCheck)118cdf0e10cSrcweir void ScDocument::MakeTable( SCTAB nTab,bool _bNeedsNameCheck )
119cdf0e10cSrcweir {
120cdf0e10cSrcweir     if ( ValidTab(nTab) && !pTab[nTab] )
121cdf0e10cSrcweir     {
122982a05a9Smseidel         String aString = ScGlobal::GetRscString(STR_TABLE_DEF); // "Table"
123cdf0e10cSrcweir         aString += String::CreateFromInt32(nTab+1);
124cdf0e10cSrcweir         if ( _bNeedsNameCheck )
125cdf0e10cSrcweir             CreateValidTabName( aString ); // keine doppelten
126cdf0e10cSrcweir 
127cdf0e10cSrcweir         pTab[nTab] = new ScTable(this, nTab, aString);
128cdf0e10cSrcweir         pTab[nTab]->SetLoadingMedium(bLoadingMedium);
129cdf0e10cSrcweir         ++nMaxTableNumber;
130cdf0e10cSrcweir     }
131cdf0e10cSrcweir }
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 
HasTable(SCTAB nTab) const134cdf0e10cSrcweir sal_Bool ScDocument::HasTable( SCTAB nTab ) const
135cdf0e10cSrcweir {
136cdf0e10cSrcweir     if (VALIDTAB(nTab))
137cdf0e10cSrcweir         if (pTab[nTab])
138cdf0e10cSrcweir             return sal_True;
139cdf0e10cSrcweir 
140cdf0e10cSrcweir     return sal_False;
141cdf0e10cSrcweir }
142cdf0e10cSrcweir 
143cdf0e10cSrcweir 
GetName(SCTAB nTab,String & rName) const144cdf0e10cSrcweir sal_Bool ScDocument::GetName( SCTAB nTab, String& rName ) const
145cdf0e10cSrcweir {
146cdf0e10cSrcweir     if (VALIDTAB(nTab))
147cdf0e10cSrcweir         if (pTab[nTab])
148cdf0e10cSrcweir         {
149cdf0e10cSrcweir             pTab[nTab]->GetName( rName );
150cdf0e10cSrcweir             return sal_True;
151cdf0e10cSrcweir         }
152cdf0e10cSrcweir     rName.Erase();
153cdf0e10cSrcweir     return sal_False;
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
SetCodeName(SCTAB nTab,const String & rName)156cdf0e10cSrcweir sal_Bool ScDocument::SetCodeName( SCTAB nTab, const String& rName )
157cdf0e10cSrcweir {
158cdf0e10cSrcweir     if (VALIDTAB(nTab))
159cdf0e10cSrcweir     {
160cdf0e10cSrcweir         if (pTab[nTab])
161cdf0e10cSrcweir         {
162cdf0e10cSrcweir             pTab[nTab]->SetCodeName( rName );
163cdf0e10cSrcweir             return sal_True;
164cdf0e10cSrcweir         }
165cdf0e10cSrcweir     }
166cdf0e10cSrcweir     OSL_TRACE( "**** can't set code name %s", rtl::OUStringToOString( rName, RTL_TEXTENCODING_UTF8 ).getStr() );
167cdf0e10cSrcweir     return sal_False;
168cdf0e10cSrcweir }
169cdf0e10cSrcweir 
GetCodeName(SCTAB nTab,String & rName) const170cdf0e10cSrcweir sal_Bool ScDocument::GetCodeName( SCTAB nTab, String& rName ) const
171cdf0e10cSrcweir {
172cdf0e10cSrcweir     if (VALIDTAB(nTab))
173cdf0e10cSrcweir         if (pTab[nTab])
174cdf0e10cSrcweir         {
175cdf0e10cSrcweir             pTab[nTab]->GetCodeName( rName );
176cdf0e10cSrcweir             return sal_True;
177cdf0e10cSrcweir         }
178cdf0e10cSrcweir     rName.Erase();
179cdf0e10cSrcweir     return sal_False;
180cdf0e10cSrcweir }
181cdf0e10cSrcweir 
182cdf0e10cSrcweir 
GetTable(const String & rName,SCTAB & rTab) const183cdf0e10cSrcweir sal_Bool ScDocument::GetTable( const String& rName, SCTAB& rTab ) const
184cdf0e10cSrcweir {
185cdf0e10cSrcweir     String aUpperName = rName;
186cdf0e10cSrcweir     ScGlobal::pCharClass->toUpper(aUpperName);
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     for (SCTAB i=0; i<=MAXTAB; i++)
189cdf0e10cSrcweir         if (pTab[i])
190cdf0e10cSrcweir         {
191cdf0e10cSrcweir             if ( pTab[i]->GetUpperName() == aUpperName )
192cdf0e10cSrcweir             {
193cdf0e10cSrcweir                 rTab = i;
194cdf0e10cSrcweir                 return sal_True;
195cdf0e10cSrcweir             }
196cdf0e10cSrcweir         }
197cdf0e10cSrcweir     rTab = 0;
198cdf0e10cSrcweir     return sal_False;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir 
GetTableByIndex(sal_Int32 nIndex)2010deba7fbSSteve Yin ScTable* ScDocument::GetTableByIndex(sal_Int32 nIndex)
2020deba7fbSSteve Yin {
2030deba7fbSSteve Yin   if ( nIndex <= MAXTAB && nIndex >= 0)
2040deba7fbSSteve Yin      return  pTab[nIndex];
2050deba7fbSSteve Yin 
2060deba7fbSSteve Yin   return NULL;
2070deba7fbSSteve Yin }
208cdf0e10cSrcweir 
ValidTabName(const String & rName) const209cdf0e10cSrcweir sal_Bool ScDocument::ValidTabName( const String& rName ) const
210cdf0e10cSrcweir {
211cdf0e10cSrcweir     xub_StrLen nLen = rName.Len();
212cdf0e10cSrcweir     if (!nLen)
213cdf0e10cSrcweir         return false;
214cdf0e10cSrcweir 
215cdf0e10cSrcweir #if 1
216cdf0e10cSrcweir     // Restrict sheet names to what Excel accepts.
217cdf0e10cSrcweir     /* TODO: We may want to remove this restriction for full ODFF compliance.
218cdf0e10cSrcweir      * Merely loading and calculating ODF documents using these characters in
219cdf0e10cSrcweir      * sheet names is not affected by this, but all sheet name editing and
220cdf0e10cSrcweir      * copying functionality is, maybe falling back to "Sheet4" or similar. */
221cdf0e10cSrcweir     for (xub_StrLen i = 0; i < nLen; ++i)
222cdf0e10cSrcweir     {
223cdf0e10cSrcweir         const sal_Unicode c = rName.GetChar(i);
224cdf0e10cSrcweir         switch (c)
225cdf0e10cSrcweir         {
226cdf0e10cSrcweir             case ':':
227cdf0e10cSrcweir             case '\\':
228cdf0e10cSrcweir             case '/':
229cdf0e10cSrcweir             case '?':
230cdf0e10cSrcweir             case '*':
231cdf0e10cSrcweir             case '[':
232cdf0e10cSrcweir             case ']':
233cdf0e10cSrcweir                 // these characters are not allowed to match XL's convention.
234cdf0e10cSrcweir                 return false;
235cdf0e10cSrcweir             case '\'':
236cdf0e10cSrcweir                 if (i == 0 || i == nLen - 1)
237982a05a9Smseidel                     // single quote is not allowed at the first or last character position.
238cdf0e10cSrcweir                     return false;
239cdf0e10cSrcweir             break;
240cdf0e10cSrcweir         }
241cdf0e10cSrcweir     }
242cdf0e10cSrcweir #endif
243cdf0e10cSrcweir 
244cdf0e10cSrcweir     return true;
245cdf0e10cSrcweir }
246cdf0e10cSrcweir 
247cdf0e10cSrcweir 
ValidNewTabName(const String & rName) const248cdf0e10cSrcweir sal_Bool ScDocument::ValidNewTabName( const String& rName ) const
249cdf0e10cSrcweir {
250cdf0e10cSrcweir     sal_Bool bValid = ValidTabName(rName);
251cdf0e10cSrcweir     for (SCTAB i=0; (i<=MAXTAB) && bValid; i++)
252cdf0e10cSrcweir         if (pTab[i])
253cdf0e10cSrcweir         {
254cdf0e10cSrcweir             String aOldName;
255cdf0e10cSrcweir             pTab[i]->GetName(aOldName);
256cdf0e10cSrcweir             bValid = !ScGlobal::GetpTransliteration()->isEqual( rName, aOldName );
257cdf0e10cSrcweir         }
258cdf0e10cSrcweir     return bValid;
259cdf0e10cSrcweir }
260cdf0e10cSrcweir 
261cdf0e10cSrcweir 
CreateValidTabName(String & rName) const262cdf0e10cSrcweir void ScDocument::CreateValidTabName(String& rName) const
263cdf0e10cSrcweir {
264cdf0e10cSrcweir     if ( !ValidTabName(rName) )
265cdf0e10cSrcweir     {
266cdf0e10cSrcweir         // neu erzeugen
267cdf0e10cSrcweir 
268cdf0e10cSrcweir         const String aStrTable( ScResId(SCSTR_TABLE) );
269cdf0e10cSrcweir         sal_Bool         bOk   = sal_False;
270cdf0e10cSrcweir 
271982a05a9Smseidel         // vorneweg testen, ob der Prefix als gültig erkannt wird
272cdf0e10cSrcweir         // wenn nicht, nur doppelte vermeiden
273cdf0e10cSrcweir         sal_Bool bPrefix = ValidTabName( aStrTable );
274982a05a9Smseidel         DBG_ASSERT(bPrefix, "Invalid table name");
275cdf0e10cSrcweir         SCTAB nDummy;
276cdf0e10cSrcweir 
277cdf0e10cSrcweir         SCTAB nLoops = 0; // "zur Sicherheit"
278cdf0e10cSrcweir         for ( SCTAB i = nMaxTableNumber+1; !bOk && nLoops <= MAXTAB; i++ )
279cdf0e10cSrcweir         {
280cdf0e10cSrcweir             rName  = aStrTable;
281cdf0e10cSrcweir             rName += String::CreateFromInt32(i);
282cdf0e10cSrcweir             if (bPrefix)
283cdf0e10cSrcweir                 bOk = ValidNewTabName( rName );
284cdf0e10cSrcweir             else
285cdf0e10cSrcweir                 bOk = !GetTable( rName, nDummy );
286cdf0e10cSrcweir             ++nLoops;
287cdf0e10cSrcweir         }
288cdf0e10cSrcweir 
289982a05a9Smseidel         DBG_ASSERT(bOk, "No valid table name found");
290cdf0e10cSrcweir         if ( !bOk )
291cdf0e10cSrcweir             rName = aStrTable;
292cdf0e10cSrcweir     }
293cdf0e10cSrcweir     else
294cdf0e10cSrcweir     {
295982a05a9Smseidel         // übergebenen Namen überprüfen
296cdf0e10cSrcweir 
297cdf0e10cSrcweir         if ( !ValidNewTabName(rName) )
298cdf0e10cSrcweir         {
299cdf0e10cSrcweir             SCTAB i = 1;
300cdf0e10cSrcweir             String aName;
301cdf0e10cSrcweir             do
302cdf0e10cSrcweir             {
303cdf0e10cSrcweir                 i++;
304cdf0e10cSrcweir                 aName = rName;
305cdf0e10cSrcweir                 aName += '_';
306cdf0e10cSrcweir                 aName += String::CreateFromInt32(static_cast<sal_Int32>(i));
307cdf0e10cSrcweir             }
308cdf0e10cSrcweir             while (!ValidNewTabName(aName) && (i < MAXTAB+1));
309cdf0e10cSrcweir             rName = aName;
310cdf0e10cSrcweir         }
311cdf0e10cSrcweir     }
312cdf0e10cSrcweir }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir 
InsertTab(SCTAB nPos,const String & rName,sal_Bool bExternalDocument)315cdf0e10cSrcweir sal_Bool ScDocument::InsertTab( SCTAB nPos, const String& rName,
316cdf0e10cSrcweir             sal_Bool bExternalDocument )
317cdf0e10cSrcweir {
318cdf0e10cSrcweir     SCTAB   nTabCount = GetTableCount();
319cdf0e10cSrcweir     sal_Bool    bValid = ValidTab(nTabCount);
320982a05a9Smseidel     if ( !bExternalDocument )   // sonst rName == "'Doc'!Tab", vorher prüfen
321cdf0e10cSrcweir         bValid = (bValid && ValidNewTabName(rName));
322cdf0e10cSrcweir     if (bValid)
323cdf0e10cSrcweir     {
324cdf0e10cSrcweir         if (nPos == SC_TAB_APPEND || nPos == nTabCount)
325cdf0e10cSrcweir         {
326cdf0e10cSrcweir             pTab[nTabCount] = new ScTable(this, nTabCount, rName);
327cdf0e10cSrcweir             pTab[nTabCount]->SetCodeName( rName );
328cdf0e10cSrcweir             ++nMaxTableNumber;
329cdf0e10cSrcweir             if ( bExternalDocument )
330cdf0e10cSrcweir                 pTab[nTabCount]->SetVisible( sal_False );
331cdf0e10cSrcweir         }
332cdf0e10cSrcweir         else
333cdf0e10cSrcweir         {
334cdf0e10cSrcweir             if (VALIDTAB(nPos) && (nPos < nTabCount))
335cdf0e10cSrcweir             {
336cdf0e10cSrcweir                 ScRange aRange( 0,0,nPos, MAXCOL,MAXROW,MAXTAB );
337cdf0e10cSrcweir                 xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,1 );
338cdf0e10cSrcweir                 xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,1 );
339cdf0e10cSrcweir                 pRangeName->UpdateTabRef( nPos, 1 );
340cdf0e10cSrcweir                 pDBCollection->UpdateReference(
341cdf0e10cSrcweir                                     URM_INSDEL, 0,0,nPos, MAXCOL,MAXROW,MAXTAB, 0,0,1 );
342cdf0e10cSrcweir                 if (pDPCollection)
343cdf0e10cSrcweir                     pDPCollection->UpdateReference( URM_INSDEL, aRange, 0,0,1 );
344cdf0e10cSrcweir                 if (pDetOpList)
345cdf0e10cSrcweir                     pDetOpList->UpdateReference( this, URM_INSDEL, aRange, 0,0,1 );
346cdf0e10cSrcweir                 UpdateChartRef( URM_INSDEL, 0,0,nPos, MAXCOL,MAXROW,MAXTAB, 0,0,1 );
347cdf0e10cSrcweir                 UpdateRefAreaLinks( URM_INSDEL, aRange, 0,0,1 );
348cdf0e10cSrcweir                 if ( pUnoBroadcaster )
349cdf0e10cSrcweir                     pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,1 ) );
350cdf0e10cSrcweir 
351cdf0e10cSrcweir                 SCTAB i;
352cdf0e10cSrcweir                 for (i = 0; i <= MAXTAB; i++)
353cdf0e10cSrcweir                     if (pTab[i])
354cdf0e10cSrcweir                         pTab[i]->UpdateInsertTab(nPos);
355cdf0e10cSrcweir 
356cdf0e10cSrcweir                 for (i = nTabCount; i > nPos; i--)
357cdf0e10cSrcweir                 {
358cdf0e10cSrcweir                     pTab[i] = pTab[i - 1];
359cdf0e10cSrcweir                 }
360cdf0e10cSrcweir 
361cdf0e10cSrcweir                 pTab[nPos] = new ScTable(this, nPos, rName);
362cdf0e10cSrcweir                 pTab[nPos]->SetCodeName( rName );
363cdf0e10cSrcweir                 ++nMaxTableNumber;
364cdf0e10cSrcweir 
365cdf0e10cSrcweir                 // UpdateBroadcastAreas must be called between UpdateInsertTab,
366cdf0e10cSrcweir                 // which ends listening, and StartAllListeners, to not modify
367cdf0e10cSrcweir                 // areas that are to be inserted by starting listeners.
368cdf0e10cSrcweir                 UpdateBroadcastAreas( URM_INSDEL, aRange, 0,0,1);
369cdf0e10cSrcweir                 for (i = 0; i <= MAXTAB; i++)
370cdf0e10cSrcweir                     if (pTab[i])
371cdf0e10cSrcweir                         pTab[i]->UpdateCompile();
372cdf0e10cSrcweir                 for (i = 0; i <= MAXTAB; i++)
373cdf0e10cSrcweir                     if (pTab[i])
374cdf0e10cSrcweir                         pTab[i]->StartAllListeners();
375cdf0e10cSrcweir 
376cdf0e10cSrcweir                 // update conditional formats after table is inserted
377cdf0e10cSrcweir                 if ( pCondFormList )
378cdf0e10cSrcweir                     pCondFormList->UpdateReference( URM_INSDEL, aRange, 0,0,1 );
379cdf0e10cSrcweir                 if ( pValidationList )
380cdf0e10cSrcweir                     pValidationList->UpdateReference( URM_INSDEL, aRange, 0,0,1 );
381cdf0e10cSrcweir                 // #81844# sheet names of references are not valid until sheet is inserted
382cdf0e10cSrcweir                 if ( pChartListenerCollection )
383cdf0e10cSrcweir                     pChartListenerCollection->UpdateScheduledSeriesRanges();
384cdf0e10cSrcweir 
385cdf0e10cSrcweir                 SetDirty();
386cdf0e10cSrcweir                 bValid = sal_True;
387cdf0e10cSrcweir             }
388cdf0e10cSrcweir             else
389cdf0e10cSrcweir                 bValid = sal_False;
390cdf0e10cSrcweir         }
391cdf0e10cSrcweir     }
392cdf0e10cSrcweir     return bValid;
393cdf0e10cSrcweir }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 
DeleteTab(SCTAB nTab,ScDocument * pRefUndoDoc)396cdf0e10cSrcweir sal_Bool ScDocument::DeleteTab( SCTAB nTab, ScDocument* pRefUndoDoc )
397cdf0e10cSrcweir {
398cdf0e10cSrcweir     sal_Bool bValid = sal_False;
399cdf0e10cSrcweir     if (VALIDTAB(nTab))
400cdf0e10cSrcweir     {
401cdf0e10cSrcweir         if (pTab[nTab])
402cdf0e10cSrcweir         {
403cdf0e10cSrcweir             SCTAB nTabCount = GetTableCount();
404cdf0e10cSrcweir             if (nTabCount > 1)
405cdf0e10cSrcweir             {
406cdf0e10cSrcweir                 sal_Bool bOldAutoCalc = GetAutoCalc();
407982a05a9Smseidel                 SetAutoCalc( sal_False ); // avoid multiple recalculations
408cdf0e10cSrcweir                 ScRange aRange( 0, 0, nTab, MAXCOL, MAXROW, nTab );
409cdf0e10cSrcweir                 DelBroadcastAreasInRange( aRange );
410cdf0e10cSrcweir 
411cdf0e10cSrcweir                 // #i8180# remove database ranges etc. that are on the deleted tab
412cdf0e10cSrcweir                 // (restored in undo with ScRefUndoData)
413cdf0e10cSrcweir 
414cdf0e10cSrcweir                 xColNameRanges->DeleteOnTab( nTab );
415cdf0e10cSrcweir                 xRowNameRanges->DeleteOnTab( nTab );
416cdf0e10cSrcweir                 pDBCollection->DeleteOnTab( nTab );
417cdf0e10cSrcweir                 if (pDPCollection)
418cdf0e10cSrcweir                     pDPCollection->DeleteOnTab( nTab );
419cdf0e10cSrcweir                 if (pDetOpList)
420cdf0e10cSrcweir                     pDetOpList->DeleteOnTab( nTab );
421cdf0e10cSrcweir                 DeleteAreaLinksOnTab( nTab );
422cdf0e10cSrcweir 
423cdf0e10cSrcweir                 // normal reference update
424cdf0e10cSrcweir 
425cdf0e10cSrcweir                 aRange.aEnd.SetTab( MAXTAB );
426cdf0e10cSrcweir                 xColNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1 );
427cdf0e10cSrcweir                 xRowNameRanges->UpdateReference( URM_INSDEL, this, aRange, 0,0,-1 );
428cdf0e10cSrcweir                 pRangeName->UpdateTabRef( nTab, 2 );
429cdf0e10cSrcweir                 pDBCollection->UpdateReference(
430cdf0e10cSrcweir                                     URM_INSDEL, 0,0,nTab, MAXCOL,MAXROW,MAXTAB, 0,0,-1 );
431cdf0e10cSrcweir                 if (pDPCollection)
432cdf0e10cSrcweir                     pDPCollection->UpdateReference( URM_INSDEL, aRange, 0,0,-1 );
433cdf0e10cSrcweir                 if (pDetOpList)
434cdf0e10cSrcweir                     pDetOpList->UpdateReference( this, URM_INSDEL, aRange, 0,0,-1 );
435cdf0e10cSrcweir                 UpdateChartRef( URM_INSDEL, 0,0,nTab, MAXCOL,MAXROW,MAXTAB, 0,0,-1 );
436cdf0e10cSrcweir                 UpdateRefAreaLinks( URM_INSDEL, aRange, 0,0,-1 );
437cdf0e10cSrcweir                 if ( pCondFormList )
438cdf0e10cSrcweir                     pCondFormList->UpdateReference( URM_INSDEL, aRange, 0,0,-1 );
439cdf0e10cSrcweir                 if ( pValidationList )
440cdf0e10cSrcweir                     pValidationList->UpdateReference( URM_INSDEL, aRange, 0,0,-1 );
441cdf0e10cSrcweir                 if ( pUnoBroadcaster )
442cdf0e10cSrcweir                     pUnoBroadcaster->Broadcast( ScUpdateRefHint( URM_INSDEL, aRange, 0,0,-1 ) );
443cdf0e10cSrcweir 
444cdf0e10cSrcweir                 SCTAB i;
445cdf0e10cSrcweir                 for (i=0; i<=MAXTAB; i++)
446cdf0e10cSrcweir                     if (pTab[i])
447cdf0e10cSrcweir                         pTab[i]->UpdateDeleteTab(nTab,sal_False,
448cdf0e10cSrcweir                                     pRefUndoDoc ? pRefUndoDoc->pTab[i] : 0);
449cdf0e10cSrcweir                 delete pTab[nTab];
450cdf0e10cSrcweir                 for (i=nTab + 1; i < nTabCount; i++)
451cdf0e10cSrcweir                     pTab[i - 1] = pTab[i];
452cdf0e10cSrcweir                 pTab[nTabCount - 1] = NULL;
453cdf0e10cSrcweir                 --nMaxTableNumber;
454cdf0e10cSrcweir                 // UpdateBroadcastAreas must be called between UpdateDeleteTab,
455cdf0e10cSrcweir                 // which ends listening, and StartAllListeners, to not modify
456cdf0e10cSrcweir                 // areas that are to be inserted by starting listeners.
457cdf0e10cSrcweir                 UpdateBroadcastAreas( URM_INSDEL, aRange, 0,0,-1);
458cdf0e10cSrcweir                 for (i = 0; i <= MAXTAB; i++)
459cdf0e10cSrcweir                     if (pTab[i])
460cdf0e10cSrcweir                         pTab[i]->UpdateCompile();
461982a05a9Smseidel                 // Excel-Filter löscht einige Tables während des Ladens,
462cdf0e10cSrcweir                 // Listener werden erst nach dem Laden aufgesetzt
463cdf0e10cSrcweir                 if ( !bInsertingFromOtherDoc )
464cdf0e10cSrcweir                 {
465cdf0e10cSrcweir                     for (i = 0; i <= MAXTAB; i++)
466cdf0e10cSrcweir                         if (pTab[i])
467cdf0e10cSrcweir                             pTab[i]->StartAllListeners();
468cdf0e10cSrcweir                     SetDirty();
469cdf0e10cSrcweir                 }
470cdf0e10cSrcweir                 // #81844# sheet names of references are not valid until sheet is deleted
471cdf0e10cSrcweir                 pChartListenerCollection->UpdateScheduledSeriesRanges();
472cdf0e10cSrcweir 
473cdf0e10cSrcweir                 SetAutoCalc( bOldAutoCalc );
474cdf0e10cSrcweir                 bValid = sal_True;
475cdf0e10cSrcweir             }
476cdf0e10cSrcweir         }
477cdf0e10cSrcweir     }
478cdf0e10cSrcweir     return bValid;
479cdf0e10cSrcweir }
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 
RenameTab(SCTAB nTab,const String & rName,sal_Bool,sal_Bool bExternalDocument)482cdf0e10cSrcweir sal_Bool ScDocument::RenameTab( SCTAB nTab, const String& rName, sal_Bool /* bUpdateRef */,
483cdf0e10cSrcweir         sal_Bool bExternalDocument )
484cdf0e10cSrcweir {
485cdf0e10cSrcweir     sal_Bool    bValid = sal_False;
486cdf0e10cSrcweir     SCTAB   i;
487cdf0e10cSrcweir     if VALIDTAB(nTab)
488cdf0e10cSrcweir         if (pTab[nTab])
489cdf0e10cSrcweir         {
490cdf0e10cSrcweir             if ( bExternalDocument )
491cdf0e10cSrcweir                 bValid = sal_True; // zusammengesetzter Name
492cdf0e10cSrcweir             else
493cdf0e10cSrcweir                 bValid = ValidTabName(rName);
494cdf0e10cSrcweir             for (i=0; (i<=MAXTAB) && bValid; i++)
495cdf0e10cSrcweir                 if (pTab[i] && (i != nTab))
496cdf0e10cSrcweir                 {
497cdf0e10cSrcweir                     String aOldName;
498cdf0e10cSrcweir                     pTab[i]->GetName(aOldName);
499cdf0e10cSrcweir                     bValid = !ScGlobal::GetpTransliteration()->isEqual( rName, aOldName );
500cdf0e10cSrcweir                 }
501cdf0e10cSrcweir             if (bValid)
502cdf0e10cSrcweir             {
503cdf0e10cSrcweir                 // #i75258# update charts before renaming, so they can get their live data objects.
504cdf0e10cSrcweir                 // Once the charts are live, the sheet can be renamed without problems.
505cdf0e10cSrcweir                 if ( pChartListenerCollection )
506cdf0e10cSrcweir                     pChartListenerCollection->UpdateChartsContainingTab( nTab );
507cdf0e10cSrcweir                 pTab[nTab]->SetName(rName);
508cdf0e10cSrcweir 
509cdf0e10cSrcweir                 // If formulas refer to the renamed sheet, the TokenArray remains valid,
510cdf0e10cSrcweir                 // but the XML stream must be re-generated.
511cdf0e10cSrcweir                 for (i=0; i<=MAXTAB; ++i)
512cdf0e10cSrcweir                     if (pTab[i] && pTab[i]->IsStreamValid())
513cdf0e10cSrcweir                         pTab[i]->SetStreamValid( sal_False );
514cdf0e10cSrcweir             }
515cdf0e10cSrcweir         }
516cdf0e10cSrcweir     return bValid;
517cdf0e10cSrcweir }
518cdf0e10cSrcweir 
519cdf0e10cSrcweir 
SetVisible(SCTAB nTab,sal_Bool bVisible)520cdf0e10cSrcweir void ScDocument::SetVisible( SCTAB nTab, sal_Bool bVisible )
521cdf0e10cSrcweir {
522cdf0e10cSrcweir     if (VALIDTAB(nTab))
523cdf0e10cSrcweir         if (pTab[nTab])
524cdf0e10cSrcweir             pTab[nTab]->SetVisible(bVisible);
525cdf0e10cSrcweir }
526cdf0e10cSrcweir 
527cdf0e10cSrcweir 
IsVisible(SCTAB nTab) const528cdf0e10cSrcweir sal_Bool ScDocument::IsVisible( SCTAB nTab ) const
529cdf0e10cSrcweir {
530cdf0e10cSrcweir     if (VALIDTAB(nTab))
531cdf0e10cSrcweir         if (pTab[nTab])
532cdf0e10cSrcweir             return pTab[nTab]->IsVisible();
533cdf0e10cSrcweir 
534cdf0e10cSrcweir     return sal_False;
535cdf0e10cSrcweir }
536cdf0e10cSrcweir 
537cdf0e10cSrcweir 
IsStreamValid(SCTAB nTab) const538cdf0e10cSrcweir sal_Bool ScDocument::IsStreamValid( SCTAB nTab ) const
539cdf0e10cSrcweir {
540cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
541cdf0e10cSrcweir         return pTab[nTab]->IsStreamValid();
542cdf0e10cSrcweir 
543cdf0e10cSrcweir     return sal_False;
544cdf0e10cSrcweir }
545cdf0e10cSrcweir 
546cdf0e10cSrcweir 
SetStreamValid(SCTAB nTab,sal_Bool bSet,sal_Bool bIgnoreLock)547cdf0e10cSrcweir void ScDocument::SetStreamValid( SCTAB nTab, sal_Bool bSet, sal_Bool bIgnoreLock )
548cdf0e10cSrcweir {
549cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
550cdf0e10cSrcweir         pTab[nTab]->SetStreamValid( bSet, bIgnoreLock );
551cdf0e10cSrcweir }
552cdf0e10cSrcweir 
553cdf0e10cSrcweir 
LockStreamValid(bool bLock)554cdf0e10cSrcweir void ScDocument::LockStreamValid( bool bLock )
555cdf0e10cSrcweir {
556cdf0e10cSrcweir     mbStreamValidLocked = bLock;
557cdf0e10cSrcweir }
558cdf0e10cSrcweir 
559cdf0e10cSrcweir 
IsPendingRowHeights(SCTAB nTab) const560cdf0e10cSrcweir sal_Bool ScDocument::IsPendingRowHeights( SCTAB nTab ) const
561cdf0e10cSrcweir {
562cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
563cdf0e10cSrcweir         return pTab[nTab]->IsPendingRowHeights();
564cdf0e10cSrcweir 
565cdf0e10cSrcweir     return sal_False;
566cdf0e10cSrcweir }
567cdf0e10cSrcweir 
568cdf0e10cSrcweir 
SetPendingRowHeights(SCTAB nTab,sal_Bool bSet)569cdf0e10cSrcweir void ScDocument::SetPendingRowHeights( SCTAB nTab, sal_Bool bSet )
570cdf0e10cSrcweir {
571cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
572cdf0e10cSrcweir         pTab[nTab]->SetPendingRowHeights( bSet );
573cdf0e10cSrcweir }
574cdf0e10cSrcweir 
575cdf0e10cSrcweir 
SetLayoutRTL(SCTAB nTab,sal_Bool bRTL)576cdf0e10cSrcweir void ScDocument::SetLayoutRTL( SCTAB nTab, sal_Bool bRTL )
577cdf0e10cSrcweir {
578cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
579cdf0e10cSrcweir     {
580cdf0e10cSrcweir         if ( bImportingXML )
581cdf0e10cSrcweir         {
582cdf0e10cSrcweir             // #i57869# only set the LoadingRTL flag, the real setting (including mirroring)
583cdf0e10cSrcweir             // is applied in SetImportingXML(sal_False). This is so the shapes can be loaded in
584cdf0e10cSrcweir             // normal LTR mode.
585cdf0e10cSrcweir 
586cdf0e10cSrcweir             pTab[nTab]->SetLoadingRTL( bRTL );
587cdf0e10cSrcweir             return;
588cdf0e10cSrcweir         }
589cdf0e10cSrcweir 
590cdf0e10cSrcweir         pTab[nTab]->SetLayoutRTL( bRTL );       // only sets the flag
591cdf0e10cSrcweir         pTab[nTab]->SetDrawPageSize();
592cdf0e10cSrcweir 
593cdf0e10cSrcweir         // mirror existing objects:
594cdf0e10cSrcweir 
595cdf0e10cSrcweir         if (pDrawLayer)
596cdf0e10cSrcweir         {
597cdf0e10cSrcweir             SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
598cdf0e10cSrcweir             DBG_ASSERT(pPage,"Page ?");
599cdf0e10cSrcweir             if (pPage)
600cdf0e10cSrcweir             {
601cdf0e10cSrcweir                 SdrObjListIter aIter( *pPage, IM_DEEPNOGROUPS );
602cdf0e10cSrcweir                 SdrObject* pObject = aIter.Next();
603cdf0e10cSrcweir                 while (pObject)
604cdf0e10cSrcweir                 {
605cdf0e10cSrcweir                     // objects with ScDrawObjData are re-positioned in SetPageSize,
606cdf0e10cSrcweir                     // don't mirror again
607cdf0e10cSrcweir                     ScDrawObjData* pData = ScDrawLayer::GetObjData( pObject );
608cdf0e10cSrcweir                     if ( !pData )
609cdf0e10cSrcweir                         pDrawLayer->MirrorRTL( pObject );
610cdf0e10cSrcweir 
611cdf0e10cSrcweir                     pObject->SetContextWritingMode( bRTL ? WritingMode2::RL_TB : WritingMode2::LR_TB );
612cdf0e10cSrcweir 
613cdf0e10cSrcweir                     pObject = aIter.Next();
614cdf0e10cSrcweir                 }
615cdf0e10cSrcweir             }
616cdf0e10cSrcweir         }
617cdf0e10cSrcweir     }
618cdf0e10cSrcweir }
619cdf0e10cSrcweir 
620cdf0e10cSrcweir 
IsLayoutRTL(SCTAB nTab) const621cdf0e10cSrcweir sal_Bool ScDocument::IsLayoutRTL( SCTAB nTab ) const
622cdf0e10cSrcweir {
623cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
624cdf0e10cSrcweir         return pTab[nTab]->IsLayoutRTL();
625cdf0e10cSrcweir 
626cdf0e10cSrcweir     return sal_False;
627cdf0e10cSrcweir }
628cdf0e10cSrcweir 
629cdf0e10cSrcweir 
IsNegativePage(SCTAB nTab) const630cdf0e10cSrcweir sal_Bool ScDocument::IsNegativePage( SCTAB nTab ) const
631cdf0e10cSrcweir {
632cdf0e10cSrcweir     // Negative page area is always used for RTL layout.
633cdf0e10cSrcweir     // The separate method is used to find all RTL handling of drawing objects.
634cdf0e10cSrcweir     return IsLayoutRTL( nTab );
635cdf0e10cSrcweir }
636cdf0e10cSrcweir 
637cdf0e10cSrcweir 
638cdf0e10cSrcweir /* ----------------------------------------------------------------------------
639cdf0e10cSrcweir     benutzten Bereich suchen:
640cdf0e10cSrcweir 
641cdf0e10cSrcweir     GetCellArea  - nur Daten
642cdf0e10cSrcweir     GetTableArea - Daten / Attribute
643982a05a9Smseidel     GetPrintArea - berücksichtigt auch Zeichenobjekte,
644cdf0e10cSrcweir                     streicht Attribute bis ganz rechts / unten
645cdf0e10cSrcweir ---------------------------------------------------------------------------- */
646cdf0e10cSrcweir 
647cdf0e10cSrcweir 
GetCellArea(SCTAB nTab,SCCOL & rEndCol,SCROW & rEndRow) const648cdf0e10cSrcweir sal_Bool ScDocument::GetCellArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const
649cdf0e10cSrcweir {
650cdf0e10cSrcweir     if (VALIDTAB(nTab))
651cdf0e10cSrcweir         if (pTab[nTab])
652cdf0e10cSrcweir             return pTab[nTab]->GetCellArea( rEndCol, rEndRow );
653cdf0e10cSrcweir 
654cdf0e10cSrcweir     rEndCol = 0;
655cdf0e10cSrcweir     rEndRow = 0;
656cdf0e10cSrcweir     return sal_False;
657cdf0e10cSrcweir }
658cdf0e10cSrcweir 
659cdf0e10cSrcweir 
GetTableArea(SCTAB nTab,SCCOL & rEndCol,SCROW & rEndRow) const660cdf0e10cSrcweir sal_Bool ScDocument::GetTableArea( SCTAB nTab, SCCOL& rEndCol, SCROW& rEndRow ) const
661cdf0e10cSrcweir {
662cdf0e10cSrcweir     if (VALIDTAB(nTab))
663cdf0e10cSrcweir         if (pTab[nTab])
664cdf0e10cSrcweir             return pTab[nTab]->GetTableArea( rEndCol, rEndRow );
665cdf0e10cSrcweir 
666cdf0e10cSrcweir     rEndCol = 0;
667cdf0e10cSrcweir     rEndRow = 0;
668cdf0e10cSrcweir     return sal_False;
669cdf0e10cSrcweir }
670cdf0e10cSrcweir 
ShrinkToDataArea(SCTAB nTab,SCCOL & rStartCol,SCROW & rStartRow,SCCOL & rEndCol,SCROW & rEndRow) const671cdf0e10cSrcweir bool ScDocument::ShrinkToDataArea(SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow) const
672cdf0e10cSrcweir {
673cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
674cdf0e10cSrcweir         return false;
675cdf0e10cSrcweir 
676cdf0e10cSrcweir     SCCOL nCol1, nCol2;
677cdf0e10cSrcweir     SCROW nRow1, nRow2;
678cdf0e10cSrcweir     pTab[nTab]->GetFirstDataPos(nCol1, nRow1);
679cdf0e10cSrcweir     pTab[nTab]->GetLastDataPos(nCol2, nRow2);
680cdf0e10cSrcweir 
681cdf0e10cSrcweir     if (nCol1 > nCol2 || nRow1 > nRow2)
682cdf0e10cSrcweir         // invalid range.
683cdf0e10cSrcweir         return false;
684cdf0e10cSrcweir 
685cdf0e10cSrcweir     // Make sure the area only shrinks, and doesn't grow.
686cdf0e10cSrcweir     if (rStartCol < nCol1)
687cdf0e10cSrcweir         rStartCol = nCol1;
688cdf0e10cSrcweir     if (nCol2 < rEndCol)
689cdf0e10cSrcweir         rEndCol = nCol2;
690cdf0e10cSrcweir     if (rStartRow < nRow1)
691cdf0e10cSrcweir         rStartRow = nRow1;
692cdf0e10cSrcweir     if (nRow2 < rEndRow)
693cdf0e10cSrcweir         rEndRow = nRow2;
694cdf0e10cSrcweir 
695cdf0e10cSrcweir     if (rStartCol > rEndCol || rStartRow > rEndRow)
696cdf0e10cSrcweir         // invalid range.
697cdf0e10cSrcweir         return false;
698cdf0e10cSrcweir 
699cdf0e10cSrcweir     return true; // success!
700cdf0e10cSrcweir }
701cdf0e10cSrcweir 
ShrinkToUsedDataArea(bool & o_bShrunk,SCTAB nTab,SCCOL & rStartCol,SCROW & rStartRow,SCCOL & rEndCol,SCROW & rEndRow,bool bColumnsOnly) const702cdf0e10cSrcweir bool ScDocument::ShrinkToUsedDataArea( bool& o_bShrunk, SCTAB nTab, SCCOL& rStartCol,
703cdf0e10cSrcweir         SCROW& rStartRow, SCCOL& rEndCol, SCROW& rEndRow, bool bColumnsOnly ) const
704cdf0e10cSrcweir {
705cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
706cdf0e10cSrcweir     {
707cdf0e10cSrcweir         o_bShrunk = false;
708cdf0e10cSrcweir         return false;
709cdf0e10cSrcweir     }
710cdf0e10cSrcweir     return pTab[nTab]->ShrinkToUsedDataArea( o_bShrunk, rStartCol, rStartRow, rEndCol, rEndRow, bColumnsOnly);
711cdf0e10cSrcweir }
712cdf0e10cSrcweir 
713982a05a9Smseidel // zusammenhängender Bereich
714cdf0e10cSrcweir 
GetDataArea(SCTAB nTab,SCCOL & rStartCol,SCROW & rStartRow,SCCOL & rEndCol,SCROW & rEndRow,sal_Bool bIncludeOld,bool bOnlyDown) const715cdf0e10cSrcweir void ScDocument::GetDataArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow,
716cdf0e10cSrcweir                               SCCOL& rEndCol, SCROW& rEndRow, sal_Bool bIncludeOld, bool bOnlyDown ) const
717cdf0e10cSrcweir {
718cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
719cdf0e10cSrcweir         pTab[nTab]->GetDataArea( rStartCol, rStartRow, rEndCol, rEndRow, bIncludeOld, bOnlyDown );
720cdf0e10cSrcweir }
721cdf0e10cSrcweir 
722cdf0e10cSrcweir 
LimitChartArea(SCTAB nTab,SCCOL & rStartCol,SCROW & rStartRow,SCCOL & rEndCol,SCROW & rEndRow)723cdf0e10cSrcweir void ScDocument::LimitChartArea( SCTAB nTab, SCCOL& rStartCol, SCROW& rStartRow,
724cdf0e10cSrcweir                                     SCCOL& rEndCol, SCROW& rEndRow )
725cdf0e10cSrcweir {
726cdf0e10cSrcweir     if (VALIDTAB(nTab))
727cdf0e10cSrcweir         if (pTab[nTab])
728cdf0e10cSrcweir             pTab[nTab]->LimitChartArea( rStartCol, rStartRow, rEndCol, rEndRow );
729cdf0e10cSrcweir }
730cdf0e10cSrcweir 
731cdf0e10cSrcweir 
LimitChartIfAll(ScRangeListRef & rRangeList)732cdf0e10cSrcweir void ScDocument::LimitChartIfAll( ScRangeListRef& rRangeList )
733cdf0e10cSrcweir {
734cdf0e10cSrcweir     ScRangeListRef aNew = new ScRangeList;
735cdf0e10cSrcweir     if (rRangeList.Is())
736cdf0e10cSrcweir     {
737cdf0e10cSrcweir         sal_uLong nCount = rRangeList->Count();
738cdf0e10cSrcweir         for (sal_uLong i=0; i<nCount; i++)
739cdf0e10cSrcweir         {
740cdf0e10cSrcweir             ScRange aRange(*rRangeList->GetObject( i ));
741cdf0e10cSrcweir             if ( ( aRange.aStart.Col() == 0 && aRange.aEnd.Col() == MAXCOL ) ||
742cdf0e10cSrcweir                  ( aRange.aStart.Row() == 0 && aRange.aEnd.Row() == MAXROW ) )
743cdf0e10cSrcweir             {
744cdf0e10cSrcweir                 SCCOL nStartCol = aRange.aStart.Col();
745cdf0e10cSrcweir                 SCROW nStartRow = aRange.aStart.Row();
746cdf0e10cSrcweir                 SCCOL nEndCol = aRange.aEnd.Col();
747cdf0e10cSrcweir                 SCROW nEndRow = aRange.aEnd.Row();
748cdf0e10cSrcweir                 SCTAB nTab = aRange.aStart.Tab();
749cdf0e10cSrcweir                 if (pTab[nTab])
750cdf0e10cSrcweir                     pTab[nTab]->LimitChartArea(nStartCol, nStartRow, nEndCol, nEndRow);
751cdf0e10cSrcweir                 aRange.aStart.SetCol( nStartCol );
752cdf0e10cSrcweir                 aRange.aStart.SetRow( nStartRow );
753cdf0e10cSrcweir                 aRange.aEnd.SetCol( nEndCol );
754cdf0e10cSrcweir                 aRange.aEnd.SetRow( nEndRow );
755cdf0e10cSrcweir             }
756cdf0e10cSrcweir             aNew->Append(aRange);
757cdf0e10cSrcweir         }
758cdf0e10cSrcweir     }
759cdf0e10cSrcweir     else
760cdf0e10cSrcweir     {
761cdf0e10cSrcweir         DBG_ERROR("LimitChartIfAll: Ref==0");
762cdf0e10cSrcweir     }
763cdf0e10cSrcweir     rRangeList = aNew;
764cdf0e10cSrcweir }
765cdf0e10cSrcweir 
766cdf0e10cSrcweir 
lcl_GetFirstTabRange(SCTAB & rTabRangeStart,SCTAB & rTabRangeEnd,const ScMarkData * pTabMark)767cdf0e10cSrcweir void lcl_GetFirstTabRange( SCTAB& rTabRangeStart, SCTAB& rTabRangeEnd, const ScMarkData* pTabMark )
768cdf0e10cSrcweir {
769cdf0e10cSrcweir     // without ScMarkData, leave start/end unchanged
770cdf0e10cSrcweir     if ( pTabMark )
771cdf0e10cSrcweir     {
772cdf0e10cSrcweir         for (SCTAB nTab=0; nTab<=MAXTAB; ++nTab)
773cdf0e10cSrcweir             if (pTabMark->GetTableSelect(nTab))
774cdf0e10cSrcweir             {
775cdf0e10cSrcweir                 // find first range of consecutive selected sheets
776cdf0e10cSrcweir                 rTabRangeStart = nTab;
777cdf0e10cSrcweir                 while ( nTab+1 <= MAXTAB && pTabMark->GetTableSelect(nTab+1) )
778cdf0e10cSrcweir                     ++nTab;
779cdf0e10cSrcweir                 rTabRangeEnd = nTab;
780cdf0e10cSrcweir                 return;
781cdf0e10cSrcweir             }
782cdf0e10cSrcweir     }
783cdf0e10cSrcweir }
784cdf0e10cSrcweir 
lcl_GetNextTabRange(SCTAB & rTabRangeStart,SCTAB & rTabRangeEnd,const ScMarkData * pTabMark)785cdf0e10cSrcweir bool lcl_GetNextTabRange( SCTAB& rTabRangeStart, SCTAB& rTabRangeEnd, const ScMarkData* pTabMark )
786cdf0e10cSrcweir {
787cdf0e10cSrcweir     if ( pTabMark )
788cdf0e10cSrcweir     {
789cdf0e10cSrcweir         // find next range of consecutive selected sheets after rTabRangeEnd
790cdf0e10cSrcweir         for (SCTAB nTab=rTabRangeEnd+1; nTab<=MAXTAB; ++nTab)
791cdf0e10cSrcweir             if (pTabMark->GetTableSelect(nTab))
792cdf0e10cSrcweir             {
793cdf0e10cSrcweir                 rTabRangeStart = nTab;
794cdf0e10cSrcweir                 while ( nTab+1 <= MAXTAB && pTabMark->GetTableSelect(nTab+1) )
795cdf0e10cSrcweir                     ++nTab;
796cdf0e10cSrcweir                 rTabRangeEnd = nTab;
797cdf0e10cSrcweir                 return true;
798cdf0e10cSrcweir             }
799cdf0e10cSrcweir     }
800cdf0e10cSrcweir     return false;
801cdf0e10cSrcweir }
802cdf0e10cSrcweir 
803cdf0e10cSrcweir 
CanInsertRow(const ScRange & rRange) const804cdf0e10cSrcweir sal_Bool ScDocument::CanInsertRow( const ScRange& rRange ) const
805cdf0e10cSrcweir {
806cdf0e10cSrcweir     SCCOL nStartCol = rRange.aStart.Col();
807cdf0e10cSrcweir     SCROW nStartRow = rRange.aStart.Row();
808cdf0e10cSrcweir     SCTAB nStartTab = rRange.aStart.Tab();
809cdf0e10cSrcweir     SCCOL nEndCol = rRange.aEnd.Col();
810cdf0e10cSrcweir     SCROW nEndRow = rRange.aEnd.Row();
811cdf0e10cSrcweir     SCTAB nEndTab = rRange.aEnd.Tab();
812cdf0e10cSrcweir     PutInOrder( nStartCol, nEndCol );
813cdf0e10cSrcweir     PutInOrder( nStartRow, nEndRow );
814cdf0e10cSrcweir     PutInOrder( nStartTab, nEndTab );
815cdf0e10cSrcweir     SCSIZE nSize = static_cast<SCSIZE>(nEndRow - nStartRow + 1);
816cdf0e10cSrcweir 
817cdf0e10cSrcweir     sal_Bool bTest = sal_True;
818cdf0e10cSrcweir     for (SCTAB i=nStartTab; i<=nEndTab && bTest; i++)
819cdf0e10cSrcweir         if (pTab[i])
820cdf0e10cSrcweir             bTest &= pTab[i]->TestInsertRow( nStartCol, nEndCol, nSize );
821cdf0e10cSrcweir 
822cdf0e10cSrcweir     return bTest;
823cdf0e10cSrcweir }
824cdf0e10cSrcweir 
825cdf0e10cSrcweir 
InsertRow(SCCOL nStartCol,SCTAB nStartTab,SCCOL nEndCol,SCTAB nEndTab,SCROW nStartRow,SCSIZE nSize,ScDocument * pRefUndoDoc,const ScMarkData * pTabMark)826cdf0e10cSrcweir sal_Bool ScDocument::InsertRow( SCCOL nStartCol, SCTAB nStartTab,
827cdf0e10cSrcweir                             SCCOL nEndCol,   SCTAB nEndTab,
828cdf0e10cSrcweir                             SCROW nStartRow, SCSIZE nSize, ScDocument* pRefUndoDoc,
829cdf0e10cSrcweir                             const ScMarkData* pTabMark )
830cdf0e10cSrcweir {
831cdf0e10cSrcweir     SCTAB i;
832cdf0e10cSrcweir 
833cdf0e10cSrcweir     PutInOrder( nStartCol, nEndCol );
834cdf0e10cSrcweir     PutInOrder( nStartTab, nEndTab );
835cdf0e10cSrcweir     if ( pTabMark )
836cdf0e10cSrcweir     {
837cdf0e10cSrcweir         nStartTab = 0;
838cdf0e10cSrcweir         nEndTab = MAXTAB;
839cdf0e10cSrcweir     }
840cdf0e10cSrcweir 
841cdf0e10cSrcweir     sal_Bool bTest = sal_True;
842cdf0e10cSrcweir     sal_Bool bRet = sal_False;
843cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
844982a05a9Smseidel     SetAutoCalc( sal_False ); // avoid multiple recalculations
845cdf0e10cSrcweir     for ( i = nStartTab; i <= nEndTab && bTest; i++)
846cdf0e10cSrcweir         if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
847cdf0e10cSrcweir             bTest &= pTab[i]->TestInsertRow( nStartCol, nEndCol, nSize );
848cdf0e10cSrcweir     if (bTest)
849cdf0e10cSrcweir     {
850cdf0e10cSrcweir         // UpdateBroadcastAreas muss vor UpdateReference gerufen werden, damit nicht
851982a05a9Smseidel         // Einträge verschoben werden, die erst bei UpdateReference neu erzeugt werden
852cdf0e10cSrcweir 
853cdf0e10cSrcweir         // handle chunks of consecutive selected sheets together
854cdf0e10cSrcweir         SCTAB nTabRangeStart = nStartTab;
855cdf0e10cSrcweir         SCTAB nTabRangeEnd = nEndTab;
856cdf0e10cSrcweir         lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
857cdf0e10cSrcweir         do
858cdf0e10cSrcweir         {
859cdf0e10cSrcweir             UpdateBroadcastAreas( URM_INSDEL, ScRange(
860cdf0e10cSrcweir                 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
861cdf0e10cSrcweir                 ScAddress( nEndCol, MAXROW, nTabRangeEnd )), 0, static_cast<SCsROW>(nSize), 0 );
862cdf0e10cSrcweir         }
863cdf0e10cSrcweir         while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
864cdf0e10cSrcweir 
865cdf0e10cSrcweir         lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
866cdf0e10cSrcweir         do
867cdf0e10cSrcweir         {
868cdf0e10cSrcweir             UpdateReference( URM_INSDEL, nStartCol, nStartRow, nTabRangeStart,
869cdf0e10cSrcweir                              nEndCol, MAXROW, nTabRangeEnd,
870cdf0e10cSrcweir                              0, static_cast<SCsROW>(nSize), 0, pRefUndoDoc, sal_False ); // without drawing objects
871cdf0e10cSrcweir         }
872cdf0e10cSrcweir         while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
873cdf0e10cSrcweir 
874cdf0e10cSrcweir         for (i=nStartTab; i<=nEndTab; i++)
875cdf0e10cSrcweir             if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
876cdf0e10cSrcweir                 pTab[i]->InsertRow( nStartCol, nEndCol, nStartRow, nSize );
877cdf0e10cSrcweir 
878cdf0e10cSrcweir         // #82991# UpdateRef for drawing layer must be after inserting,
879cdf0e10cSrcweir         // when the new row heights are known.
880cdf0e10cSrcweir         for (i=nStartTab; i<=nEndTab; i++)
881cdf0e10cSrcweir             if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
882cdf0e10cSrcweir                 pTab[i]->UpdateDrawRef( URM_INSDEL,
883cdf0e10cSrcweir                             nStartCol, nStartRow, nStartTab, nEndCol, MAXROW, nEndTab,
884cdf0e10cSrcweir                             0, static_cast<SCsROW>(nSize), 0 );
885cdf0e10cSrcweir 
886cdf0e10cSrcweir         if ( pChangeTrack && pChangeTrack->IsInDeleteUndo() )
887982a05a9Smseidel         {   // durch Restaurierung von Referenzen auf gelöschte Bereiche ist
888982a05a9Smseidel             // ein neues Listening fällig, bisherige Listener wurden in
889982a05a9Smseidel             // FormulaCell UpdateReference abgehängt
890cdf0e10cSrcweir             StartAllListeners();
891cdf0e10cSrcweir         }
892cdf0e10cSrcweir         else
893cdf0e10cSrcweir         {   // Listeners have been removed in UpdateReference
894cdf0e10cSrcweir             for (i=0; i<=MAXTAB; i++)
895cdf0e10cSrcweir                 if (pTab[i])
896cdf0e10cSrcweir                     pTab[i]->StartNeededListeners();
897cdf0e10cSrcweir             // #69592# at least all cells using range names pointing relative
898cdf0e10cSrcweir             // to the moved range must recalculate
899cdf0e10cSrcweir             for (i=0; i<=MAXTAB; i++)
900cdf0e10cSrcweir                 if (pTab[i])
901cdf0e10cSrcweir                     pTab[i]->SetRelNameDirty();
902cdf0e10cSrcweir         }
903cdf0e10cSrcweir         bRet = sal_True;
904cdf0e10cSrcweir     }
905cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
906cdf0e10cSrcweir     if ( bRet )
907cdf0e10cSrcweir         pChartListenerCollection->UpdateDirtyCharts();
908cdf0e10cSrcweir     return bRet;
909cdf0e10cSrcweir }
910cdf0e10cSrcweir 
911cdf0e10cSrcweir 
InsertRow(const ScRange & rRange,ScDocument * pRefUndoDoc)912cdf0e10cSrcweir sal_Bool ScDocument::InsertRow( const ScRange& rRange, ScDocument* pRefUndoDoc )
913cdf0e10cSrcweir {
914cdf0e10cSrcweir     return InsertRow( rRange.aStart.Col(), rRange.aStart.Tab(),
915cdf0e10cSrcweir                       rRange.aEnd.Col(),   rRange.aEnd.Tab(),
916cdf0e10cSrcweir                       rRange.aStart.Row(), static_cast<SCSIZE>(rRange.aEnd.Row()-rRange.aStart.Row()+1),
917cdf0e10cSrcweir                       pRefUndoDoc );
918cdf0e10cSrcweir }
919cdf0e10cSrcweir 
920cdf0e10cSrcweir 
DeleteRow(SCCOL nStartCol,SCTAB nStartTab,SCCOL nEndCol,SCTAB nEndTab,SCROW nStartRow,SCSIZE nSize,ScDocument * pRefUndoDoc,sal_Bool * pUndoOutline,const ScMarkData * pTabMark)921cdf0e10cSrcweir void ScDocument::DeleteRow( SCCOL nStartCol, SCTAB nStartTab,
922cdf0e10cSrcweir                             SCCOL nEndCol,   SCTAB nEndTab,
923cdf0e10cSrcweir                             SCROW nStartRow, SCSIZE nSize,
924cdf0e10cSrcweir                             ScDocument* pRefUndoDoc, sal_Bool* pUndoOutline,
925cdf0e10cSrcweir                             const ScMarkData* pTabMark )
926cdf0e10cSrcweir {
927cdf0e10cSrcweir     SCTAB i;
928cdf0e10cSrcweir 
929cdf0e10cSrcweir     PutInOrder( nStartCol, nEndCol );
930cdf0e10cSrcweir     PutInOrder( nStartTab, nEndTab );
931cdf0e10cSrcweir     if ( pTabMark )
932cdf0e10cSrcweir     {
933cdf0e10cSrcweir         nStartTab = 0;
934cdf0e10cSrcweir         nEndTab = MAXTAB;
935cdf0e10cSrcweir     }
936cdf0e10cSrcweir 
937cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
938982a05a9Smseidel     SetAutoCalc( sal_False ); // avoid multiple recalculations
939cdf0e10cSrcweir 
940cdf0e10cSrcweir     // handle chunks of consecutive selected sheets together
941cdf0e10cSrcweir     SCTAB nTabRangeStart = nStartTab;
942cdf0e10cSrcweir     SCTAB nTabRangeEnd = nEndTab;
943cdf0e10cSrcweir     lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
944cdf0e10cSrcweir     do
945cdf0e10cSrcweir     {
946cdf0e10cSrcweir         if ( ValidRow(nStartRow+nSize) )
947cdf0e10cSrcweir         {
948cdf0e10cSrcweir             DelBroadcastAreasInRange( ScRange(
949cdf0e10cSrcweir                 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
950cdf0e10cSrcweir                 ScAddress( nEndCol, nStartRow+nSize-1, nTabRangeEnd ) ) );
951cdf0e10cSrcweir             UpdateBroadcastAreas( URM_INSDEL, ScRange(
952cdf0e10cSrcweir                 ScAddress( nStartCol, nStartRow+nSize, nTabRangeStart ),
953cdf0e10cSrcweir                 ScAddress( nEndCol, MAXROW, nTabRangeEnd )), 0, -(static_cast<SCsROW>(nSize)), 0 );
954cdf0e10cSrcweir         }
955cdf0e10cSrcweir         else
956cdf0e10cSrcweir             DelBroadcastAreasInRange( ScRange(
957cdf0e10cSrcweir                 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
958cdf0e10cSrcweir                 ScAddress( nEndCol, MAXROW, nTabRangeEnd ) ) );
959cdf0e10cSrcweir     }
960cdf0e10cSrcweir     while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
961cdf0e10cSrcweir 
962cdf0e10cSrcweir     if ( ValidRow(nStartRow+nSize) )
963cdf0e10cSrcweir     {
964cdf0e10cSrcweir         lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
965cdf0e10cSrcweir         do
966cdf0e10cSrcweir         {
967cdf0e10cSrcweir             UpdateReference( URM_INSDEL, nStartCol, nStartRow+nSize, nTabRangeStart,
968cdf0e10cSrcweir                              nEndCol, MAXROW, nTabRangeEnd,
969cdf0e10cSrcweir                              0, -(static_cast<SCsROW>(nSize)), 0, pRefUndoDoc, sal_True, false );
970cdf0e10cSrcweir         }
971cdf0e10cSrcweir         while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
972cdf0e10cSrcweir     }
973cdf0e10cSrcweir 
974cdf0e10cSrcweir     if (pUndoOutline)
975cdf0e10cSrcweir         *pUndoOutline = sal_False;
976cdf0e10cSrcweir 
977cdf0e10cSrcweir     for ( i = nStartTab; i <= nEndTab; i++)
978cdf0e10cSrcweir         if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
979cdf0e10cSrcweir             pTab[i]->DeleteRow( nStartCol, nEndCol, nStartRow, nSize, pUndoOutline );
980cdf0e10cSrcweir 
981cdf0e10cSrcweir     if ( ValidRow(nStartRow+nSize) )
982cdf0e10cSrcweir     {   // Listeners have been removed in UpdateReference
983cdf0e10cSrcweir         for (i=0; i<=MAXTAB; i++)
984cdf0e10cSrcweir             if (pTab[i])
985cdf0e10cSrcweir                 pTab[i]->StartNeededListeners();
986cdf0e10cSrcweir         // #69592# at least all cells using range names pointing relative to
987cdf0e10cSrcweir         // the moved range must recalculate
988cdf0e10cSrcweir         for (i=0; i<=MAXTAB; i++)
989cdf0e10cSrcweir             if (pTab[i])
990cdf0e10cSrcweir                 pTab[i]->SetRelNameDirty();
991cdf0e10cSrcweir     }
992cdf0e10cSrcweir 
993cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
994cdf0e10cSrcweir     pChartListenerCollection->UpdateDirtyCharts();
995cdf0e10cSrcweir }
996cdf0e10cSrcweir 
997cdf0e10cSrcweir 
DeleteRow(const ScRange & rRange,ScDocument * pRefUndoDoc,sal_Bool * pUndoOutline)998cdf0e10cSrcweir void ScDocument::DeleteRow( const ScRange& rRange, ScDocument* pRefUndoDoc, sal_Bool* pUndoOutline )
999cdf0e10cSrcweir {
1000cdf0e10cSrcweir     DeleteRow( rRange.aStart.Col(), rRange.aStart.Tab(),
1001cdf0e10cSrcweir                rRange.aEnd.Col(),   rRange.aEnd.Tab(),
1002cdf0e10cSrcweir                rRange.aStart.Row(), static_cast<SCSIZE>(rRange.aEnd.Row()-rRange.aStart.Row()+1),
1003cdf0e10cSrcweir                pRefUndoDoc, pUndoOutline );
1004cdf0e10cSrcweir }
1005cdf0e10cSrcweir 
1006cdf0e10cSrcweir 
CanInsertCol(const ScRange & rRange) const1007cdf0e10cSrcweir sal_Bool ScDocument::CanInsertCol( const ScRange& rRange ) const
1008cdf0e10cSrcweir {
1009cdf0e10cSrcweir     SCCOL nStartCol = rRange.aStart.Col();
1010cdf0e10cSrcweir     SCROW nStartRow = rRange.aStart.Row();
1011cdf0e10cSrcweir     SCTAB nStartTab = rRange.aStart.Tab();
1012cdf0e10cSrcweir     SCCOL nEndCol = rRange.aEnd.Col();
1013cdf0e10cSrcweir     SCROW nEndRow = rRange.aEnd.Row();
1014cdf0e10cSrcweir     SCTAB nEndTab = rRange.aEnd.Tab();
1015cdf0e10cSrcweir     PutInOrder( nStartCol, nEndCol );
1016cdf0e10cSrcweir     PutInOrder( nStartRow, nEndRow );
1017cdf0e10cSrcweir     PutInOrder( nStartTab, nEndTab );
1018cdf0e10cSrcweir     SCSIZE nSize = static_cast<SCSIZE>(nEndCol - nStartCol + 1);
1019cdf0e10cSrcweir 
1020cdf0e10cSrcweir     sal_Bool bTest = sal_True;
1021cdf0e10cSrcweir     for (SCTAB i=nStartTab; i<=nEndTab && bTest; i++)
1022cdf0e10cSrcweir         if (pTab[i])
1023cdf0e10cSrcweir             bTest &= pTab[i]->TestInsertCol( nStartRow, nEndRow, nSize );
1024cdf0e10cSrcweir 
1025cdf0e10cSrcweir     return bTest;
1026cdf0e10cSrcweir }
1027cdf0e10cSrcweir 
1028cdf0e10cSrcweir 
InsertCol(SCROW nStartRow,SCTAB nStartTab,SCROW nEndRow,SCTAB nEndTab,SCCOL nStartCol,SCSIZE nSize,ScDocument * pRefUndoDoc,const ScMarkData * pTabMark)1029cdf0e10cSrcweir sal_Bool ScDocument::InsertCol( SCROW nStartRow, SCTAB nStartTab,
1030cdf0e10cSrcweir                             SCROW nEndRow,   SCTAB nEndTab,
1031cdf0e10cSrcweir                             SCCOL nStartCol, SCSIZE nSize, ScDocument* pRefUndoDoc,
1032cdf0e10cSrcweir                             const ScMarkData* pTabMark )
1033cdf0e10cSrcweir {
1034cdf0e10cSrcweir     SCTAB i;
1035cdf0e10cSrcweir 
1036cdf0e10cSrcweir     PutInOrder( nStartRow, nEndRow );
1037cdf0e10cSrcweir     PutInOrder( nStartTab, nEndTab );
1038cdf0e10cSrcweir     if ( pTabMark )
1039cdf0e10cSrcweir     {
1040cdf0e10cSrcweir         nStartTab = 0;
1041cdf0e10cSrcweir         nEndTab = MAXTAB;
1042cdf0e10cSrcweir     }
1043cdf0e10cSrcweir 
1044cdf0e10cSrcweir     sal_Bool bTest = sal_True;
1045cdf0e10cSrcweir     sal_Bool bRet = sal_False;
1046cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
1047982a05a9Smseidel     SetAutoCalc( sal_False ); // avoid multiple recalculations
1048cdf0e10cSrcweir     for ( i = nStartTab; i <= nEndTab && bTest; i++)
1049cdf0e10cSrcweir         if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
1050cdf0e10cSrcweir             bTest &= pTab[i]->TestInsertCol( nStartRow, nEndRow, nSize );
1051cdf0e10cSrcweir     if (bTest)
1052cdf0e10cSrcweir     {
1053cdf0e10cSrcweir         // handle chunks of consecutive selected sheets together
1054cdf0e10cSrcweir         SCTAB nTabRangeStart = nStartTab;
1055cdf0e10cSrcweir         SCTAB nTabRangeEnd = nEndTab;
1056cdf0e10cSrcweir         lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
1057cdf0e10cSrcweir         do
1058cdf0e10cSrcweir         {
1059cdf0e10cSrcweir             UpdateBroadcastAreas( URM_INSDEL, ScRange(
1060cdf0e10cSrcweir                 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
1061cdf0e10cSrcweir                 ScAddress( MAXCOL, nEndRow, nTabRangeEnd )), static_cast<SCsCOL>(nSize), 0, 0 );
1062cdf0e10cSrcweir         }
1063cdf0e10cSrcweir         while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
1064cdf0e10cSrcweir 
1065cdf0e10cSrcweir         lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
1066cdf0e10cSrcweir         do
1067cdf0e10cSrcweir         {
1068cdf0e10cSrcweir             UpdateReference( URM_INSDEL, nStartCol, nStartRow, nTabRangeStart,
1069cdf0e10cSrcweir                              MAXCOL, nEndRow, nTabRangeEnd,
1070cdf0e10cSrcweir                              static_cast<SCsCOL>(nSize), 0, 0, pRefUndoDoc, sal_True, false );
1071cdf0e10cSrcweir         }
1072cdf0e10cSrcweir         while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
1073cdf0e10cSrcweir 
1074cdf0e10cSrcweir         for (i=nStartTab; i<=nEndTab; i++)
1075cdf0e10cSrcweir             if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
1076cdf0e10cSrcweir                 pTab[i]->InsertCol( nStartCol, nStartRow, nEndRow, nSize );
1077cdf0e10cSrcweir 
1078cdf0e10cSrcweir         if ( pChangeTrack && pChangeTrack->IsInDeleteUndo() )
1079982a05a9Smseidel         {   // durch Restaurierung von Referenzen auf gelöschte Bereiche ist
1080982a05a9Smseidel             // ein neues Listening fällig, bisherige Listener wurden in
1081982a05a9Smseidel             // FormulaCell UpdateReference abgehängt
1082cdf0e10cSrcweir             StartAllListeners();
1083cdf0e10cSrcweir         }
1084cdf0e10cSrcweir         else
1085cdf0e10cSrcweir         {   // Listeners have been removed in UpdateReference
1086cdf0e10cSrcweir             for (i=0; i<=MAXTAB; i++)
1087cdf0e10cSrcweir                 if (pTab[i])
1088cdf0e10cSrcweir                     pTab[i]->StartNeededListeners();
1089cdf0e10cSrcweir             // #69592# at least all cells using range names pointing relative
1090cdf0e10cSrcweir             // to the moved range must recalculate
1091cdf0e10cSrcweir             for (i=0; i<=MAXTAB; i++)
1092cdf0e10cSrcweir                 if (pTab[i])
1093cdf0e10cSrcweir                     pTab[i]->SetRelNameDirty();
1094cdf0e10cSrcweir         }
1095cdf0e10cSrcweir         bRet = sal_True;
1096cdf0e10cSrcweir     }
1097cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
1098cdf0e10cSrcweir     if ( bRet )
1099cdf0e10cSrcweir         pChartListenerCollection->UpdateDirtyCharts();
1100cdf0e10cSrcweir     return bRet;
1101cdf0e10cSrcweir }
1102cdf0e10cSrcweir 
1103cdf0e10cSrcweir 
InsertCol(const ScRange & rRange,ScDocument * pRefUndoDoc)1104cdf0e10cSrcweir sal_Bool ScDocument::InsertCol( const ScRange& rRange, ScDocument* pRefUndoDoc )
1105cdf0e10cSrcweir {
1106cdf0e10cSrcweir     return InsertCol( rRange.aStart.Row(), rRange.aStart.Tab(),
1107cdf0e10cSrcweir                       rRange.aEnd.Row(),   rRange.aEnd.Tab(),
1108cdf0e10cSrcweir                       rRange.aStart.Col(), static_cast<SCSIZE>(rRange.aEnd.Col()-rRange.aStart.Col()+1),
1109cdf0e10cSrcweir                       pRefUndoDoc );
1110cdf0e10cSrcweir }
1111cdf0e10cSrcweir 
1112cdf0e10cSrcweir 
DeleteCol(SCROW nStartRow,SCTAB nStartTab,SCROW nEndRow,SCTAB nEndTab,SCCOL nStartCol,SCSIZE nSize,ScDocument * pRefUndoDoc,sal_Bool * pUndoOutline,const ScMarkData * pTabMark)1113cdf0e10cSrcweir void ScDocument::DeleteCol(SCROW nStartRow, SCTAB nStartTab, SCROW nEndRow, SCTAB nEndTab,
1114cdf0e10cSrcweir                                 SCCOL nStartCol, SCSIZE nSize, ScDocument* pRefUndoDoc,
1115cdf0e10cSrcweir                                 sal_Bool* pUndoOutline, const ScMarkData* pTabMark )
1116cdf0e10cSrcweir {
1117cdf0e10cSrcweir     SCTAB i;
1118cdf0e10cSrcweir 
1119cdf0e10cSrcweir     PutInOrder( nStartRow, nEndRow );
1120cdf0e10cSrcweir     PutInOrder( nStartTab, nEndTab );
1121cdf0e10cSrcweir     if ( pTabMark )
1122cdf0e10cSrcweir     {
1123cdf0e10cSrcweir         nStartTab = 0;
1124cdf0e10cSrcweir         nEndTab = MAXTAB;
1125cdf0e10cSrcweir     }
1126cdf0e10cSrcweir 
1127cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
1128982a05a9Smseidel     SetAutoCalc( sal_False ); // avoid multiple recalculations
1129cdf0e10cSrcweir 
1130cdf0e10cSrcweir     // handle chunks of consecutive selected sheets together
1131cdf0e10cSrcweir     SCTAB nTabRangeStart = nStartTab;
1132cdf0e10cSrcweir     SCTAB nTabRangeEnd = nEndTab;
1133cdf0e10cSrcweir     lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
1134cdf0e10cSrcweir     do
1135cdf0e10cSrcweir     {
1136cdf0e10cSrcweir         if ( ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) )
1137cdf0e10cSrcweir         {
1138cdf0e10cSrcweir             DelBroadcastAreasInRange( ScRange(
1139cdf0e10cSrcweir                 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
1140cdf0e10cSrcweir                 ScAddress( sal::static_int_cast<SCCOL>(nStartCol+nSize-1), nEndRow, nTabRangeEnd ) ) );
1141cdf0e10cSrcweir             UpdateBroadcastAreas( URM_INSDEL, ScRange(
1142cdf0e10cSrcweir                 ScAddress( sal::static_int_cast<SCCOL>(nStartCol+nSize), nStartRow, nTabRangeStart ),
1143cdf0e10cSrcweir                 ScAddress( MAXCOL, nEndRow, nTabRangeEnd )), -static_cast<SCsCOL>(nSize), 0, 0 );
1144cdf0e10cSrcweir         }
1145cdf0e10cSrcweir         else
1146cdf0e10cSrcweir             DelBroadcastAreasInRange( ScRange(
1147cdf0e10cSrcweir                 ScAddress( nStartCol, nStartRow, nTabRangeStart ),
1148cdf0e10cSrcweir                 ScAddress( MAXCOL, nEndRow, nTabRangeEnd ) ) );
1149cdf0e10cSrcweir     }
1150cdf0e10cSrcweir     while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
1151cdf0e10cSrcweir 
1152cdf0e10cSrcweir     if ( ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) )
1153cdf0e10cSrcweir     {
1154cdf0e10cSrcweir         lcl_GetFirstTabRange( nTabRangeStart, nTabRangeEnd, pTabMark );
1155cdf0e10cSrcweir         do
1156cdf0e10cSrcweir         {
1157cdf0e10cSrcweir             UpdateReference( URM_INSDEL, sal::static_int_cast<SCCOL>(nStartCol+nSize), nStartRow, nTabRangeStart,
1158cdf0e10cSrcweir                              MAXCOL, nEndRow, nTabRangeEnd,
1159cdf0e10cSrcweir                              -static_cast<SCsCOL>(nSize), 0, 0, pRefUndoDoc, sal_True, false );
1160cdf0e10cSrcweir         }
1161cdf0e10cSrcweir         while ( lcl_GetNextTabRange( nTabRangeStart, nTabRangeEnd, pTabMark ) );
1162cdf0e10cSrcweir     }
1163cdf0e10cSrcweir 
1164cdf0e10cSrcweir     if (pUndoOutline)
1165cdf0e10cSrcweir         *pUndoOutline = sal_False;
1166cdf0e10cSrcweir 
1167cdf0e10cSrcweir     for ( i = nStartTab; i <= nEndTab; i++)
1168cdf0e10cSrcweir         if (pTab[i] && (!pTabMark || pTabMark->GetTableSelect(i)))
1169cdf0e10cSrcweir             pTab[i]->DeleteCol( nStartCol, nStartRow, nEndRow, nSize, pUndoOutline );
1170cdf0e10cSrcweir 
1171cdf0e10cSrcweir     if ( ValidCol(sal::static_int_cast<SCCOL>(nStartCol+nSize)) )
1172cdf0e10cSrcweir     {   // Listeners have been removed in UpdateReference
1173cdf0e10cSrcweir         for (i=0; i<=MAXTAB; i++)
1174cdf0e10cSrcweir             if (pTab[i])
1175cdf0e10cSrcweir                 pTab[i]->StartNeededListeners();
1176cdf0e10cSrcweir         // #69592# at least all cells using range names pointing relative to
1177cdf0e10cSrcweir         // the moved range must recalculate
1178cdf0e10cSrcweir         for (i=0; i<=MAXTAB; i++)
1179cdf0e10cSrcweir             if (pTab[i])
1180cdf0e10cSrcweir                 pTab[i]->SetRelNameDirty();
1181cdf0e10cSrcweir     }
1182cdf0e10cSrcweir 
1183cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
1184cdf0e10cSrcweir     pChartListenerCollection->UpdateDirtyCharts();
1185cdf0e10cSrcweir }
1186cdf0e10cSrcweir 
1187cdf0e10cSrcweir 
DeleteCol(const ScRange & rRange,ScDocument * pRefUndoDoc,sal_Bool * pUndoOutline)1188cdf0e10cSrcweir void ScDocument::DeleteCol( const ScRange& rRange, ScDocument* pRefUndoDoc, sal_Bool* pUndoOutline )
1189cdf0e10cSrcweir {
1190cdf0e10cSrcweir     DeleteCol( rRange.aStart.Row(), rRange.aStart.Tab(),
1191cdf0e10cSrcweir                rRange.aEnd.Row(),   rRange.aEnd.Tab(),
1192cdf0e10cSrcweir                rRange.aStart.Col(), static_cast<SCSIZE>(rRange.aEnd.Col()-rRange.aStart.Col()+1),
1193cdf0e10cSrcweir                pRefUndoDoc, pUndoOutline );
1194cdf0e10cSrcweir }
1195cdf0e10cSrcweir 
1196cdf0e10cSrcweir 
1197982a05a9Smseidel // für Area-Links: Zellen einfügen/löschen, wenn sich der Bereich verändert
1198cdf0e10cSrcweir // (ohne Paint)
1199cdf0e10cSrcweir 
1200cdf0e10cSrcweir 
lcl_GetInsDelRanges(const ScRange & rOld,const ScRange & rNew,ScRange & rColRange,sal_Bool & rInsCol,sal_Bool & rDelCol,ScRange & rRowRange,sal_Bool & rInsRow,sal_Bool & rDelRow)1201cdf0e10cSrcweir void lcl_GetInsDelRanges( const ScRange& rOld, const ScRange& rNew,
1202cdf0e10cSrcweir                             ScRange& rColRange, sal_Bool& rInsCol, sal_Bool& rDelCol,
1203cdf0e10cSrcweir                             ScRange& rRowRange, sal_Bool& rInsRow, sal_Bool& rDelRow )
1204cdf0e10cSrcweir {
1205cdf0e10cSrcweir     DBG_ASSERT( rOld.aStart == rNew.aStart, "FitBlock: Anfang unterschiedlich" );
1206cdf0e10cSrcweir 
1207cdf0e10cSrcweir     rInsCol = rDelCol = rInsRow = rDelRow = sal_False;
1208cdf0e10cSrcweir 
1209cdf0e10cSrcweir     SCCOL nStartX = rOld.aStart.Col();
1210cdf0e10cSrcweir     SCROW nStartY = rOld.aStart.Row();
1211cdf0e10cSrcweir     SCCOL nOldEndX = rOld.aEnd.Col();
1212cdf0e10cSrcweir     SCROW nOldEndY = rOld.aEnd.Row();
1213cdf0e10cSrcweir     SCCOL nNewEndX = rNew.aEnd.Col();
1214cdf0e10cSrcweir     SCROW nNewEndY = rNew.aEnd.Row();
1215cdf0e10cSrcweir     SCTAB nTab = rOld.aStart.Tab();
1216cdf0e10cSrcweir 
1217982a05a9Smseidel     // wenn es mehr Zeilen werden, werden Spalten auf der alten Höhe eingefügt/gelöscht
1218cdf0e10cSrcweir     sal_Bool bGrowY = ( nNewEndY > nOldEndY );
1219cdf0e10cSrcweir     SCROW nColEndY = bGrowY ? nOldEndY : nNewEndY;
1220cdf0e10cSrcweir     SCCOL nRowEndX = bGrowY ? nNewEndX : nOldEndX;
1221cdf0e10cSrcweir 
1222cdf0e10cSrcweir     // Spalten
1223cdf0e10cSrcweir 
1224982a05a9Smseidel     if ( nNewEndX > nOldEndX ) // Spalten einfügen
1225cdf0e10cSrcweir     {
1226cdf0e10cSrcweir         rColRange = ScRange( nOldEndX+1, nStartY, nTab, nNewEndX, nColEndY, nTab );
1227cdf0e10cSrcweir         rInsCol = sal_True;
1228cdf0e10cSrcweir     }
1229982a05a9Smseidel     else if ( nNewEndX < nOldEndX ) // Spalten löschen
1230cdf0e10cSrcweir     {
1231cdf0e10cSrcweir         rColRange = ScRange( nNewEndX+1, nStartY, nTab, nOldEndX, nColEndY, nTab );
1232cdf0e10cSrcweir         rDelCol = sal_True;
1233cdf0e10cSrcweir     }
1234cdf0e10cSrcweir 
1235cdf0e10cSrcweir     // Zeilen
1236cdf0e10cSrcweir 
1237982a05a9Smseidel     if ( nNewEndY > nOldEndY ) // Zeilen einfügen
1238cdf0e10cSrcweir     {
1239cdf0e10cSrcweir         rRowRange = ScRange( nStartX, nOldEndY+1, nTab, nRowEndX, nNewEndY, nTab );
1240cdf0e10cSrcweir         rInsRow = sal_True;
1241cdf0e10cSrcweir     }
1242982a05a9Smseidel     else if ( nNewEndY < nOldEndY ) // Zeilen löschen
1243cdf0e10cSrcweir     {
1244cdf0e10cSrcweir         rRowRange = ScRange( nStartX, nNewEndY+1, nTab, nRowEndX, nOldEndY, nTab );
1245cdf0e10cSrcweir         rDelRow = sal_True;
1246cdf0e10cSrcweir     }
1247cdf0e10cSrcweir }
1248cdf0e10cSrcweir 
1249cdf0e10cSrcweir 
HasPartOfMerged(const ScRange & rRange)1250cdf0e10cSrcweir sal_Bool ScDocument::HasPartOfMerged( const ScRange& rRange )
1251cdf0e10cSrcweir {
1252cdf0e10cSrcweir     sal_Bool bPart = sal_False;
1253cdf0e10cSrcweir     SCTAB nTab = rRange.aStart.Tab();
1254cdf0e10cSrcweir 
1255cdf0e10cSrcweir     SCCOL nStartX = rRange.aStart.Col();
1256cdf0e10cSrcweir     SCROW nStartY = rRange.aStart.Row();
1257cdf0e10cSrcweir     SCCOL nEndX = rRange.aEnd.Col();
1258cdf0e10cSrcweir     SCROW nEndY = rRange.aEnd.Row();
1259cdf0e10cSrcweir 
1260cdf0e10cSrcweir     if (HasAttrib( nStartX, nStartY, nTab, nEndX, nEndY, nTab,
1261cdf0e10cSrcweir                         HASATTR_MERGED | HASATTR_OVERLAPPED ))
1262cdf0e10cSrcweir     {
1263cdf0e10cSrcweir         ExtendMerge( nStartX, nStartY, nEndX, nEndY, nTab );
1264cdf0e10cSrcweir         ExtendOverlapped( nStartX, nStartY, nEndX, nEndY, nTab );
1265cdf0e10cSrcweir 
1266cdf0e10cSrcweir         bPart = ( nStartX != rRange.aStart.Col() || nEndX != rRange.aEnd.Col() ||
1267cdf0e10cSrcweir                   nStartY != rRange.aStart.Row() || nEndY != rRange.aEnd.Row() );
1268cdf0e10cSrcweir     }
1269cdf0e10cSrcweir     return bPart;
1270cdf0e10cSrcweir }
1271cdf0e10cSrcweir 
1272cdf0e10cSrcweir 
CanFitBlock(const ScRange & rOld,const ScRange & rNew)1273cdf0e10cSrcweir sal_Bool ScDocument::CanFitBlock( const ScRange& rOld, const ScRange& rNew )
1274cdf0e10cSrcweir {
1275cdf0e10cSrcweir     if ( rOld == rNew )
1276cdf0e10cSrcweir         return sal_True;
1277cdf0e10cSrcweir 
1278cdf0e10cSrcweir     sal_Bool bOk = sal_True;
1279cdf0e10cSrcweir     sal_Bool bInsCol,bDelCol,bInsRow,bDelRow;
1280cdf0e10cSrcweir     ScRange aColRange,aRowRange;
1281cdf0e10cSrcweir     lcl_GetInsDelRanges( rOld, rNew, aColRange,bInsCol,bDelCol, aRowRange,bInsRow,bDelRow );
1282cdf0e10cSrcweir 
1283cdf0e10cSrcweir     if ( bInsCol && !CanInsertCol( aColRange ) ) // Zellen am Rand?
1284cdf0e10cSrcweir         bOk = sal_False;
1285cdf0e10cSrcweir     if ( bInsRow && !CanInsertRow( aRowRange ) ) // Zellen am Rand?
1286cdf0e10cSrcweir         bOk = sal_False;
1287cdf0e10cSrcweir 
1288cdf0e10cSrcweir     if ( bInsCol || bDelCol )
1289cdf0e10cSrcweir     {
1290cdf0e10cSrcweir         aColRange.aEnd.SetCol(MAXCOL);
1291cdf0e10cSrcweir         if ( HasPartOfMerged(aColRange) )
1292cdf0e10cSrcweir             bOk = sal_False;
1293cdf0e10cSrcweir     }
1294cdf0e10cSrcweir     if ( bInsRow || bDelRow )
1295cdf0e10cSrcweir     {
1296cdf0e10cSrcweir         aRowRange.aEnd.SetRow(MAXROW);
1297cdf0e10cSrcweir         if ( HasPartOfMerged(aRowRange) )
1298cdf0e10cSrcweir             bOk = sal_False;
1299cdf0e10cSrcweir     }
1300cdf0e10cSrcweir 
1301cdf0e10cSrcweir     return bOk;
1302cdf0e10cSrcweir }
1303cdf0e10cSrcweir 
1304cdf0e10cSrcweir 
FitBlock(const ScRange & rOld,const ScRange & rNew,sal_Bool bClear)1305cdf0e10cSrcweir void ScDocument::FitBlock( const ScRange& rOld, const ScRange& rNew, sal_Bool bClear )
1306cdf0e10cSrcweir {
1307cdf0e10cSrcweir     if (bClear)
1308cdf0e10cSrcweir         DeleteAreaTab( rOld, IDF_ALL );
1309cdf0e10cSrcweir 
1310cdf0e10cSrcweir     sal_Bool bInsCol,bDelCol,bInsRow,bDelRow;
1311cdf0e10cSrcweir     ScRange aColRange,aRowRange;
1312cdf0e10cSrcweir     lcl_GetInsDelRanges( rOld, rNew, aColRange,bInsCol,bDelCol, aRowRange,bInsRow,bDelRow );
1313cdf0e10cSrcweir 
1314cdf0e10cSrcweir     if ( bInsCol )
1315982a05a9Smseidel         InsertCol( aColRange ); // Spalten zuerst einfügen
1316cdf0e10cSrcweir     if ( bInsRow )
1317cdf0e10cSrcweir         InsertRow( aRowRange );
1318cdf0e10cSrcweir 
1319cdf0e10cSrcweir     if ( bDelRow )
1320982a05a9Smseidel         DeleteRow( aRowRange ); // Zeilen zuerst löschen
1321cdf0e10cSrcweir     if ( bDelCol )
1322cdf0e10cSrcweir         DeleteCol( aColRange );
1323cdf0e10cSrcweir 
1324cdf0e10cSrcweir     // Referenzen um eingefuegte Zeilen erweitern
1325cdf0e10cSrcweir 
1326cdf0e10cSrcweir     if ( bInsCol || bInsRow )
1327cdf0e10cSrcweir     {
1328cdf0e10cSrcweir         ScRange aGrowSource = rOld;
1329cdf0e10cSrcweir         aGrowSource.aEnd.SetCol(Min( rOld.aEnd.Col(), rNew.aEnd.Col() ));
1330cdf0e10cSrcweir         aGrowSource.aEnd.SetRow(Min( rOld.aEnd.Row(), rNew.aEnd.Row() ));
1331cdf0e10cSrcweir         SCCOL nGrowX = bInsCol ? ( rNew.aEnd.Col() - rOld.aEnd.Col() ) : 0;
1332cdf0e10cSrcweir         SCROW nGrowY = bInsRow ? ( rNew.aEnd.Row() - rOld.aEnd.Row() ) : 0;
1333cdf0e10cSrcweir         UpdateGrow( aGrowSource, nGrowX, nGrowY );
1334cdf0e10cSrcweir     }
1335cdf0e10cSrcweir }
1336cdf0e10cSrcweir 
1337cdf0e10cSrcweir 
DeleteArea(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,const ScMarkData & rMark,sal_uInt16 nDelFlag)1338cdf0e10cSrcweir void ScDocument::DeleteArea(SCCOL nCol1, SCROW nRow1,
1339cdf0e10cSrcweir                             SCCOL nCol2, SCROW nRow2,
1340cdf0e10cSrcweir                             const ScMarkData& rMark, sal_uInt16 nDelFlag)
1341cdf0e10cSrcweir {
1342cdf0e10cSrcweir     PutInOrder( nCol1, nCol2 );
1343cdf0e10cSrcweir     PutInOrder( nRow1, nRow2 );
1344cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
1345982a05a9Smseidel     SetAutoCalc( sal_False ); // avoid multiple recalculations
1346cdf0e10cSrcweir     for (SCTAB i = 0; i <= MAXTAB; i++)
1347cdf0e10cSrcweir         if (pTab[i])
1348cdf0e10cSrcweir             if ( rMark.GetTableSelect(i) || bIsUndo )
1349cdf0e10cSrcweir                 pTab[i]->DeleteArea(nCol1, nRow1, nCol2, nRow2, nDelFlag);
1350cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
1351cdf0e10cSrcweir }
1352cdf0e10cSrcweir 
1353cdf0e10cSrcweir 
DeleteAreaTab(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,SCTAB nTab,sal_uInt16 nDelFlag)1354cdf0e10cSrcweir void ScDocument::DeleteAreaTab(SCCOL nCol1, SCROW nRow1,
1355cdf0e10cSrcweir                                 SCCOL nCol2, SCROW nRow2,
1356cdf0e10cSrcweir                                 SCTAB nTab, sal_uInt16 nDelFlag)
1357cdf0e10cSrcweir {
1358cdf0e10cSrcweir     PutInOrder( nCol1, nCol2 );
1359cdf0e10cSrcweir     PutInOrder( nRow1, nRow2 );
1360cdf0e10cSrcweir     if ( VALIDTAB(nTab) && pTab[nTab] )
1361cdf0e10cSrcweir     {
1362cdf0e10cSrcweir         sal_Bool bOldAutoCalc = GetAutoCalc();
1363982a05a9Smseidel         SetAutoCalc( sal_False ); // avoid multiple recalculations
1364cdf0e10cSrcweir         pTab[nTab]->DeleteArea(nCol1, nRow1, nCol2, nRow2, nDelFlag);
1365cdf0e10cSrcweir         SetAutoCalc( bOldAutoCalc );
1366cdf0e10cSrcweir     }
1367cdf0e10cSrcweir }
1368cdf0e10cSrcweir 
1369cdf0e10cSrcweir 
DeleteAreaTab(const ScRange & rRange,sal_uInt16 nDelFlag)1370cdf0e10cSrcweir void ScDocument::DeleteAreaTab( const ScRange& rRange, sal_uInt16 nDelFlag )
1371cdf0e10cSrcweir {
1372cdf0e10cSrcweir     for ( SCTAB nTab = rRange.aStart.Tab(); nTab <= rRange.aEnd.Tab(); nTab++ )
1373cdf0e10cSrcweir         DeleteAreaTab( rRange.aStart.Col(), rRange.aStart.Row(),
1374cdf0e10cSrcweir                        rRange.aEnd.Col(),   rRange.aEnd.Row(),
1375cdf0e10cSrcweir                        nTab, nDelFlag );
1376cdf0e10cSrcweir }
1377cdf0e10cSrcweir 
1378cdf0e10cSrcweir 
InitUndoSelected(ScDocument * pSrcDoc,const ScMarkData & rTabSelection,sal_Bool bColInfo,sal_Bool bRowInfo)1379cdf0e10cSrcweir void ScDocument::InitUndoSelected( ScDocument* pSrcDoc, const ScMarkData& rTabSelection,
1380cdf0e10cSrcweir                                 sal_Bool bColInfo, sal_Bool bRowInfo )
1381cdf0e10cSrcweir {
1382cdf0e10cSrcweir     if (bIsUndo)
1383cdf0e10cSrcweir     {
1384cdf0e10cSrcweir         Clear();
1385cdf0e10cSrcweir 
1386cdf0e10cSrcweir         xPoolHelper = pSrcDoc->xPoolHelper;
1387cdf0e10cSrcweir 
1388cdf0e10cSrcweir         String aString;
1389cdf0e10cSrcweir         for (SCTAB nTab = 0; nTab <= MAXTAB; nTab++)
1390cdf0e10cSrcweir             if ( rTabSelection.GetTableSelect( nTab ) )
1391cdf0e10cSrcweir             {
1392cdf0e10cSrcweir                 pTab[nTab] = new ScTable(this, nTab, aString, bColInfo, bRowInfo);
1393cdf0e10cSrcweir                 nMaxTableNumber = nTab + 1;
1394cdf0e10cSrcweir             }
1395cdf0e10cSrcweir     }
1396cdf0e10cSrcweir     else
1397cdf0e10cSrcweir         {
1398cdf0e10cSrcweir         DBG_ERROR("InitUndo");
1399cdf0e10cSrcweir         }
1400cdf0e10cSrcweir }
1401cdf0e10cSrcweir 
1402cdf0e10cSrcweir 
InitUndo(ScDocument * pSrcDoc,SCTAB nTab1,SCTAB nTab2,sal_Bool bColInfo,sal_Bool bRowInfo)1403cdf0e10cSrcweir void ScDocument::InitUndo( ScDocument* pSrcDoc, SCTAB nTab1, SCTAB nTab2,
1404cdf0e10cSrcweir                                 sal_Bool bColInfo, sal_Bool bRowInfo )
1405cdf0e10cSrcweir {
1406cdf0e10cSrcweir     if (bIsUndo)
1407cdf0e10cSrcweir     {
1408cdf0e10cSrcweir         Clear();
1409cdf0e10cSrcweir 
1410cdf0e10cSrcweir         xPoolHelper = pSrcDoc->xPoolHelper;
1411cdf0e10cSrcweir 
1412cdf0e10cSrcweir         String aString;
1413cdf0e10cSrcweir         for (SCTAB nTab = nTab1; nTab <= nTab2; nTab++)
1414cdf0e10cSrcweir             pTab[nTab] = new ScTable(this, nTab, aString, bColInfo, bRowInfo);
1415cdf0e10cSrcweir 
1416cdf0e10cSrcweir         nMaxTableNumber = nTab2 + 1;
1417cdf0e10cSrcweir     }
1418cdf0e10cSrcweir     else
1419cdf0e10cSrcweir     {
1420cdf0e10cSrcweir         DBG_ERROR("InitUndo");
1421cdf0e10cSrcweir     }
1422cdf0e10cSrcweir }
1423cdf0e10cSrcweir 
1424cdf0e10cSrcweir 
AddUndoTab(SCTAB nTab1,SCTAB nTab2,sal_Bool bColInfo,sal_Bool bRowInfo)1425cdf0e10cSrcweir void ScDocument::AddUndoTab( SCTAB nTab1, SCTAB nTab2, sal_Bool bColInfo, sal_Bool bRowInfo )
1426cdf0e10cSrcweir {
1427cdf0e10cSrcweir     if (bIsUndo)
1428cdf0e10cSrcweir     {
1429cdf0e10cSrcweir         String aString;
1430cdf0e10cSrcweir         for (SCTAB nTab = nTab1; nTab <= nTab2; nTab++)
1431cdf0e10cSrcweir             if (!pTab[nTab])
1432cdf0e10cSrcweir                 pTab[nTab] = new ScTable(this, nTab, aString, bColInfo, bRowInfo);
1433cdf0e10cSrcweir 
1434cdf0e10cSrcweir         if ( nMaxTableNumber <= nTab2 )
1435cdf0e10cSrcweir             nMaxTableNumber = nTab2 + 1;
1436cdf0e10cSrcweir     }
1437cdf0e10cSrcweir     else
1438cdf0e10cSrcweir     {
1439cdf0e10cSrcweir         DBG_ERROR("InitUndo");
1440cdf0e10cSrcweir     }
1441cdf0e10cSrcweir }
1442cdf0e10cSrcweir 
1443cdf0e10cSrcweir 
SetCutMode(sal_Bool bVal)1444cdf0e10cSrcweir void ScDocument::SetCutMode( sal_Bool bVal )
1445cdf0e10cSrcweir {
1446cdf0e10cSrcweir     if (bIsClip)
1447cdf0e10cSrcweir         GetClipParam().mbCutMode = bVal;
1448cdf0e10cSrcweir     else
1449cdf0e10cSrcweir     {
1450cdf0e10cSrcweir         DBG_ERROR("SetCutMode without bIsClip");
1451cdf0e10cSrcweir     }
1452cdf0e10cSrcweir }
1453cdf0e10cSrcweir 
1454cdf0e10cSrcweir 
IsCutMode()1455cdf0e10cSrcweir sal_Bool ScDocument::IsCutMode()
1456cdf0e10cSrcweir {
1457cdf0e10cSrcweir     if (bIsClip)
1458cdf0e10cSrcweir         return GetClipParam().mbCutMode;
1459cdf0e10cSrcweir     else
1460cdf0e10cSrcweir     {
1461982a05a9Smseidel         DBG_ERROR("IsCutMode without bIsClip");
1462cdf0e10cSrcweir         return sal_False;
1463cdf0e10cSrcweir     }
1464cdf0e10cSrcweir }
1465cdf0e10cSrcweir 
1466cdf0e10cSrcweir 
CopyToDocument(SCCOL nCol1,SCROW nRow1,SCTAB nTab1,SCCOL nCol2,SCROW nRow2,SCTAB nTab2,sal_uInt16 nFlags,sal_Bool bOnlyMarked,ScDocument * pDestDoc,const ScMarkData * pMarks,sal_Bool bColRowFlags)1467cdf0e10cSrcweir void ScDocument::CopyToDocument(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
1468cdf0e10cSrcweir                             SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
1469cdf0e10cSrcweir                             sal_uInt16 nFlags, sal_Bool bOnlyMarked, ScDocument* pDestDoc,
1470cdf0e10cSrcweir                             const ScMarkData* pMarks, sal_Bool bColRowFlags )
1471cdf0e10cSrcweir {
1472cdf0e10cSrcweir     PutInOrder( nCol1, nCol2 );
1473cdf0e10cSrcweir     PutInOrder( nRow1, nRow2 );
1474cdf0e10cSrcweir     PutInOrder( nTab1, nTab2 );
1475cdf0e10cSrcweir     if( !pDestDoc->aDocName.Len() )
1476cdf0e10cSrcweir         pDestDoc->aDocName = aDocName;
1477cdf0e10cSrcweir     if (VALIDTAB(nTab1) && VALIDTAB(nTab2))
1478cdf0e10cSrcweir     {
1479cdf0e10cSrcweir         sal_Bool bOldAutoCalc = pDestDoc->GetAutoCalc();
1480982a05a9Smseidel         pDestDoc->SetAutoCalc( sal_False ); // avoid multiple recalculations
1481cdf0e10cSrcweir         for (SCTAB i = nTab1; i <= nTab2; i++)
1482cdf0e10cSrcweir         {
1483cdf0e10cSrcweir             if (pTab[i] && pDestDoc->pTab[i])
1484cdf0e10cSrcweir                 pTab[i]->CopyToTable( nCol1, nRow1, nCol2, nRow2, nFlags,
1485cdf0e10cSrcweir                                       bOnlyMarked, pDestDoc->pTab[i], pMarks,
1486cdf0e10cSrcweir                                       sal_False, bColRowFlags );
1487cdf0e10cSrcweir         }
1488cdf0e10cSrcweir         pDestDoc->SetAutoCalc( bOldAutoCalc );
1489cdf0e10cSrcweir     }
1490cdf0e10cSrcweir }
1491cdf0e10cSrcweir 
1492cdf0e10cSrcweir 
UndoToDocument(SCCOL nCol1,SCROW nRow1,SCTAB nTab1,SCCOL nCol2,SCROW nRow2,SCTAB nTab2,sal_uInt16 nFlags,sal_Bool bOnlyMarked,ScDocument * pDestDoc,const ScMarkData * pMarks)1493cdf0e10cSrcweir void ScDocument::UndoToDocument(SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
1494cdf0e10cSrcweir                             SCCOL nCol2, SCROW nRow2, SCTAB nTab2,
1495cdf0e10cSrcweir                             sal_uInt16 nFlags, sal_Bool bOnlyMarked, ScDocument* pDestDoc,
1496cdf0e10cSrcweir                             const ScMarkData* pMarks)
1497cdf0e10cSrcweir {
1498cdf0e10cSrcweir     PutInOrder( nCol1, nCol2 );
1499cdf0e10cSrcweir     PutInOrder( nRow1, nRow2 );
1500cdf0e10cSrcweir     PutInOrder( nTab1, nTab2 );
1501cdf0e10cSrcweir     if (VALIDTAB(nTab1) && VALIDTAB(nTab2))
1502cdf0e10cSrcweir     {
1503cdf0e10cSrcweir         sal_Bool bOldAutoCalc = pDestDoc->GetAutoCalc();
1504982a05a9Smseidel         pDestDoc->SetAutoCalc( sal_False ); // avoid multiple recalculations
1505cdf0e10cSrcweir         if (nTab1 > 0)
1506cdf0e10cSrcweir             CopyToDocument( 0,0,0, MAXCOL,MAXROW,nTab1-1, IDF_FORMULA, sal_False, pDestDoc, pMarks );
1507cdf0e10cSrcweir 
1508cdf0e10cSrcweir         for (SCTAB i = nTab1; i <= nTab2; i++)
1509cdf0e10cSrcweir         {
1510cdf0e10cSrcweir             if (pTab[i] && pDestDoc->pTab[i])
1511cdf0e10cSrcweir                 pTab[i]->UndoToTable(nCol1, nRow1, nCol2, nRow2, nFlags,
1512cdf0e10cSrcweir                                     bOnlyMarked, pDestDoc->pTab[i], pMarks);
1513cdf0e10cSrcweir         }
1514cdf0e10cSrcweir 
1515cdf0e10cSrcweir         if (nTab2 < MAXTAB)
1516cdf0e10cSrcweir             CopyToDocument( 0,0,nTab2+1, MAXCOL,MAXROW,MAXTAB, IDF_FORMULA, sal_False, pDestDoc, pMarks );
1517cdf0e10cSrcweir         pDestDoc->SetAutoCalc( bOldAutoCalc );
1518cdf0e10cSrcweir     }
1519cdf0e10cSrcweir }
1520cdf0e10cSrcweir 
1521cdf0e10cSrcweir 
CopyToDocument(const ScRange & rRange,sal_uInt16 nFlags,sal_Bool bOnlyMarked,ScDocument * pDestDoc,const ScMarkData * pMarks,sal_Bool bColRowFlags)1522cdf0e10cSrcweir void ScDocument::CopyToDocument(const ScRange& rRange,
1523cdf0e10cSrcweir                             sal_uInt16 nFlags, sal_Bool bOnlyMarked, ScDocument* pDestDoc,
1524cdf0e10cSrcweir                             const ScMarkData* pMarks, sal_Bool bColRowFlags)
1525cdf0e10cSrcweir {
1526cdf0e10cSrcweir     ScRange aNewRange = rRange;
1527cdf0e10cSrcweir     aNewRange.Justify();
1528cdf0e10cSrcweir 
1529cdf0e10cSrcweir     if( !pDestDoc->aDocName.Len() )
1530cdf0e10cSrcweir         pDestDoc->aDocName = aDocName;
1531cdf0e10cSrcweir     sal_Bool bOldAutoCalc = pDestDoc->GetAutoCalc();
1532982a05a9Smseidel     pDestDoc->SetAutoCalc( sal_False ); // avoid multiple recalculations
1533cdf0e10cSrcweir     for (SCTAB i = aNewRange.aStart.Tab(); i <= aNewRange.aEnd.Tab(); i++)
1534cdf0e10cSrcweir         if (pTab[i] && pDestDoc->pTab[i])
1535cdf0e10cSrcweir             pTab[i]->CopyToTable(aNewRange.aStart.Col(), aNewRange.aStart.Row(),
1536cdf0e10cSrcweir                                  aNewRange.aEnd.Col(), aNewRange.aEnd.Row(),
1537cdf0e10cSrcweir                                  nFlags, bOnlyMarked, pDestDoc->pTab[i],
1538cdf0e10cSrcweir                                  pMarks, sal_False, bColRowFlags);
1539cdf0e10cSrcweir     pDestDoc->SetAutoCalc( bOldAutoCalc );
1540cdf0e10cSrcweir }
1541cdf0e10cSrcweir 
1542cdf0e10cSrcweir 
UndoToDocument(const ScRange & rRange,sal_uInt16 nFlags,sal_Bool bOnlyMarked,ScDocument * pDestDoc,const ScMarkData * pMarks)1543cdf0e10cSrcweir void ScDocument::UndoToDocument(const ScRange& rRange,
1544cdf0e10cSrcweir                             sal_uInt16 nFlags, sal_Bool bOnlyMarked, ScDocument* pDestDoc,
1545cdf0e10cSrcweir                             const ScMarkData* pMarks)
1546cdf0e10cSrcweir {
1547cdf0e10cSrcweir     ScRange aNewRange = rRange;
1548cdf0e10cSrcweir     aNewRange.Justify();
1549cdf0e10cSrcweir     SCTAB nTab1 = aNewRange.aStart.Tab();
1550cdf0e10cSrcweir     SCTAB nTab2 = aNewRange.aEnd.Tab();
1551cdf0e10cSrcweir 
1552cdf0e10cSrcweir     sal_Bool bOldAutoCalc = pDestDoc->GetAutoCalc();
1553982a05a9Smseidel     pDestDoc->SetAutoCalc( sal_False ); // avoid multiple recalculations
1554cdf0e10cSrcweir     if (nTab1 > 0)
1555cdf0e10cSrcweir         CopyToDocument( 0,0,0, MAXCOL,MAXROW,nTab1-1, IDF_FORMULA, sal_False, pDestDoc, pMarks );
1556cdf0e10cSrcweir 
1557cdf0e10cSrcweir     for (SCTAB i = nTab1; i <= nTab2; i++)
1558cdf0e10cSrcweir     {
1559cdf0e10cSrcweir         if (pTab[i] && pDestDoc->pTab[i])
1560cdf0e10cSrcweir             pTab[i]->UndoToTable(aNewRange.aStart.Col(), aNewRange.aStart.Row(),
1561cdf0e10cSrcweir                                     aNewRange.aEnd.Col(), aNewRange.aEnd.Row(),
1562cdf0e10cSrcweir                                     nFlags, bOnlyMarked, pDestDoc->pTab[i], pMarks);
1563cdf0e10cSrcweir     }
1564cdf0e10cSrcweir 
1565cdf0e10cSrcweir     if (nTab2 < MAXTAB)
1566cdf0e10cSrcweir         CopyToDocument( 0,0,nTab2+1, MAXCOL,MAXROW,MAXTAB, IDF_FORMULA, sal_False, pDestDoc, pMarks );
1567cdf0e10cSrcweir     pDestDoc->SetAutoCalc( bOldAutoCalc );
1568cdf0e10cSrcweir }
1569cdf0e10cSrcweir 
CopyToClip(const ScClipParam & rClipParam,ScDocument * pClipDoc,const ScMarkData * pMarks,bool bAllTabs,bool bKeepScenarioFlags,bool bIncludeObjects,bool bCloneNoteCaptions)1570cdf0e10cSrcweir void ScDocument::CopyToClip(const ScClipParam& rClipParam,
1571cdf0e10cSrcweir                             ScDocument* pClipDoc, const ScMarkData* pMarks,
1572cdf0e10cSrcweir                             bool bAllTabs, bool bKeepScenarioFlags, bool bIncludeObjects, bool bCloneNoteCaptions)
1573cdf0e10cSrcweir {
1574cdf0e10cSrcweir     DBG_ASSERT( bAllTabs || pMarks, "CopyToClip: ScMarkData fehlt" );
1575cdf0e10cSrcweir 
1576cdf0e10cSrcweir     if (bIsClip)
1577cdf0e10cSrcweir         return;
1578cdf0e10cSrcweir 
1579cdf0e10cSrcweir     if (!pClipDoc)
1580cdf0e10cSrcweir     {
1581cdf0e10cSrcweir         DBG_ERROR("CopyToClip: no ClipDoc");
1582cdf0e10cSrcweir         pClipDoc = SC_MOD()->GetClipDoc();
1583cdf0e10cSrcweir     }
1584cdf0e10cSrcweir 
1585cdf0e10cSrcweir     pClipDoc->aDocName = aDocName;
1586cdf0e10cSrcweir     pClipDoc->SetClipParam(rClipParam);
1587cdf0e10cSrcweir     pClipDoc->ResetClip(this, pMarks);
1588cdf0e10cSrcweir 
1589cdf0e10cSrcweir     ScRange aClipRange = rClipParam.getWholeRange();
1590cdf0e10cSrcweir     CopyRangeNamesToClip(pClipDoc, aClipRange, pMarks, bAllTabs);
1591cdf0e10cSrcweir 
1592cdf0e10cSrcweir     for (SCTAB i = 0; i <= MAXTAB; ++i)
1593cdf0e10cSrcweir     {
1594cdf0e10cSrcweir         if (!pTab[i] || !pClipDoc->pTab[i])
1595cdf0e10cSrcweir             continue;
1596cdf0e10cSrcweir 
1597cdf0e10cSrcweir         if (pMarks && !pMarks->GetTableSelect(i))
1598cdf0e10cSrcweir             continue;
1599cdf0e10cSrcweir 
1600cdf0e10cSrcweir         pTab[i]->CopyToClip(rClipParam.maRanges, pClipDoc->pTab[i], bKeepScenarioFlags, bCloneNoteCaptions);
1601cdf0e10cSrcweir 
1602cdf0e10cSrcweir         if (pDrawLayer && bIncludeObjects)
1603cdf0e10cSrcweir         {
1604cdf0e10cSrcweir             // also copy drawing objects
1605cdf0e10cSrcweir             Rectangle aObjRect = GetMMRect(
1606cdf0e10cSrcweir                 aClipRange.aStart.Col(), aClipRange.aStart.Row(), aClipRange.aEnd.Col(), aClipRange.aEnd.Row(), i);
1607cdf0e10cSrcweir             pDrawLayer->CopyToClip(pClipDoc, i, aObjRect);
1608cdf0e10cSrcweir         }
1609cdf0e10cSrcweir     }
1610cdf0e10cSrcweir 
1611cdf0e10cSrcweir     // Make sure to mark overlapped cells.
1612cdf0e10cSrcweir     pClipDoc->ExtendMerge(aClipRange, true);
1613cdf0e10cSrcweir }
1614cdf0e10cSrcweir 
CopyTabToClip(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,SCTAB nTab,ScDocument * pClipDoc)1615cdf0e10cSrcweir void ScDocument::CopyTabToClip(SCCOL nCol1, SCROW nRow1,
1616cdf0e10cSrcweir                                 SCCOL nCol2, SCROW nRow2,
1617cdf0e10cSrcweir                                 SCTAB nTab, ScDocument* pClipDoc)
1618cdf0e10cSrcweir {
1619cdf0e10cSrcweir     if (!bIsClip)
1620cdf0e10cSrcweir     {
1621cdf0e10cSrcweir         PutInOrder( nCol1, nCol2 );
1622cdf0e10cSrcweir         PutInOrder( nRow1, nRow2 );
1623cdf0e10cSrcweir         if (!pClipDoc)
1624cdf0e10cSrcweir         {
1625cdf0e10cSrcweir             DBG_ERROR("CopyTabToClip: no ClipDoc");
1626cdf0e10cSrcweir             pClipDoc = SC_MOD()->GetClipDoc();
1627cdf0e10cSrcweir         }
1628cdf0e10cSrcweir 
1629cdf0e10cSrcweir         ScClipParam& rClipParam = pClipDoc->GetClipParam();
1630cdf0e10cSrcweir         pClipDoc->aDocName = aDocName;
1631cdf0e10cSrcweir         rClipParam.maRanges.RemoveAll();
1632cdf0e10cSrcweir         rClipParam.maRanges.Append(ScRange(nCol1, nRow1, 0, nCol2, nRow2, 0));
1633cdf0e10cSrcweir         pClipDoc->ResetClip( this, nTab );
1634cdf0e10cSrcweir 
1635cdf0e10cSrcweir         if (pTab[nTab] && pClipDoc->pTab[nTab])
1636cdf0e10cSrcweir             pTab[nTab]->CopyToClip(nCol1, nRow1, nCol2, nRow2, pClipDoc->pTab[nTab], sal_False, sal_True);
1637cdf0e10cSrcweir 
1638cdf0e10cSrcweir         pClipDoc->GetClipParam().mbCutMode = false;
1639cdf0e10cSrcweir     }
1640cdf0e10cSrcweir }
1641cdf0e10cSrcweir 
1642cdf0e10cSrcweir 
TransposeClip(ScDocument * pTransClip,sal_uInt16 nFlags,sal_Bool bAsLink)1643cdf0e10cSrcweir void ScDocument::TransposeClip( ScDocument* pTransClip, sal_uInt16 nFlags, sal_Bool bAsLink )
1644cdf0e10cSrcweir {
1645cdf0e10cSrcweir     DBG_ASSERT( bIsClip && pTransClip && pTransClip->bIsClip,
1646982a05a9Smseidel                     "TransposeClip with wrong document" );
1647cdf0e10cSrcweir 
1648cdf0e10cSrcweir         // initialisieren
1649982a05a9Smseidel         // -> pTransClip muss vor dem Original-Dokument gelöscht werden!
1650cdf0e10cSrcweir 
1651cdf0e10cSrcweir     pTransClip->ResetClip(this, (ScMarkData*)NULL); // alle
1652cdf0e10cSrcweir 
1653cdf0e10cSrcweir         // Bereiche uebernehmen
1654cdf0e10cSrcweir 
1655cdf0e10cSrcweir     pTransClip->pRangeName->FreeAll();
1656cdf0e10cSrcweir     for (sal_uInt16 i = 0; i < pRangeName->GetCount(); i++) //! DB-Bereiche Pivot-Bereiche auch !!!
1657cdf0e10cSrcweir     {
1658cdf0e10cSrcweir         sal_uInt16 nIndex = ((ScRangeData*)((*pRangeName)[i]))->GetIndex();
1659cdf0e10cSrcweir         ScRangeData* pData = new ScRangeData(*((*pRangeName)[i]));
1660cdf0e10cSrcweir         if (!pTransClip->pRangeName->Insert(pData))
1661cdf0e10cSrcweir             delete pData;
1662cdf0e10cSrcweir         else
1663cdf0e10cSrcweir             pData->SetIndex(nIndex);
1664cdf0e10cSrcweir     }
1665cdf0e10cSrcweir 
1666cdf0e10cSrcweir         // Daten
1667cdf0e10cSrcweir 
1668cdf0e10cSrcweir     ScRange aClipRange = GetClipParam().getWholeRange();
1669cdf0e10cSrcweir     if ( ValidRow(aClipRange.aEnd.Row()-aClipRange.aStart.Row()) )
1670cdf0e10cSrcweir     {
1671cdf0e10cSrcweir         for (SCTAB i=0; i<=MAXTAB; i++)
1672cdf0e10cSrcweir             if (pTab[i])
1673cdf0e10cSrcweir             {
1674cdf0e10cSrcweir                 DBG_ASSERT( pTransClip->pTab[i], "TransposeClip: Tabelle nicht da" );
1675cdf0e10cSrcweir                 pTab[i]->TransposeClip( aClipRange.aStart.Col(), aClipRange.aStart.Row(),
1676cdf0e10cSrcweir                                             aClipRange.aEnd.Col(), aClipRange.aEnd.Row(),
1677cdf0e10cSrcweir                                             pTransClip->pTab[i], nFlags, bAsLink );
1678cdf0e10cSrcweir 
1679cdf0e10cSrcweir                 if ( pDrawLayer && ( nFlags & IDF_OBJECTS ) )
1680cdf0e10cSrcweir                 {
1681cdf0e10cSrcweir                     // Drawing objects are copied to the new area without transposing.
1682cdf0e10cSrcweir                     // CopyFromClip is used to adjust the objects to the transposed block's
1683cdf0e10cSrcweir                     // cell range area.
1684cdf0e10cSrcweir                     // (pDrawLayer in the original clipboard document is set only if there
1685cdf0e10cSrcweir                     // are drawing objects to copy)
1686cdf0e10cSrcweir 
1687cdf0e10cSrcweir                     pTransClip->InitDrawLayer();
1688cdf0e10cSrcweir                     Rectangle aSourceRect = GetMMRect( aClipRange.aStart.Col(), aClipRange.aStart.Row(),
1689cdf0e10cSrcweir                                                         aClipRange.aEnd.Col(), aClipRange.aEnd.Row(), i );
1690cdf0e10cSrcweir                     Rectangle aDestRect = pTransClip->GetMMRect( 0, 0,
1691cdf0e10cSrcweir                             static_cast<SCCOL>(aClipRange.aEnd.Row() - aClipRange.aStart.Row()),
1692cdf0e10cSrcweir                             static_cast<SCROW>(aClipRange.aEnd.Col() - aClipRange.aStart.Col()), i );
1693cdf0e10cSrcweir                     pTransClip->pDrawLayer->CopyFromClip( pDrawLayer, i, aSourceRect, ScAddress(0,0,i), aDestRect );
1694cdf0e10cSrcweir                 }
1695cdf0e10cSrcweir             }
1696cdf0e10cSrcweir 
1697cdf0e10cSrcweir         pTransClip->SetClipParam(GetClipParam());
1698cdf0e10cSrcweir         pTransClip->GetClipParam().transpose();
1699cdf0e10cSrcweir     }
1700cdf0e10cSrcweir     else
1701cdf0e10cSrcweir     {
1702cdf0e10cSrcweir         DBG_ERROR("TransposeClip: zu gross");
1703cdf0e10cSrcweir     }
1704cdf0e10cSrcweir 
1705cdf0e10cSrcweir         // Dies passiert erst beim Einfuegen...
1706cdf0e10cSrcweir 
1707cdf0e10cSrcweir     GetClipParam().mbCutMode = false;
1708cdf0e10cSrcweir }
1709cdf0e10cSrcweir 
CopyRangeNamesToClip(ScDocument * pClipDoc,const ScRange & rClipRange,const ScMarkData * pMarks,bool bAllTabs)1710cdf0e10cSrcweir void ScDocument::CopyRangeNamesToClip(ScDocument* pClipDoc, const ScRange& rClipRange, const ScMarkData* pMarks, bool bAllTabs)
1711cdf0e10cSrcweir {
1712cdf0e10cSrcweir     std::set<sal_uInt16> aUsedNames; // indexes of named ranges that are used in the copied cells
1713cdf0e10cSrcweir     for (SCTAB i = 0; i <= MAXTAB; ++i)
1714cdf0e10cSrcweir         if (pTab[i] && pClipDoc->pTab[i])
1715cdf0e10cSrcweir             if ( bAllTabs || !pMarks || pMarks->GetTableSelect(i) )
1716cdf0e10cSrcweir                 pTab[i]->FindRangeNamesInUse(
1717cdf0e10cSrcweir                     rClipRange.aStart.Col(), rClipRange.aStart.Row(),
1718cdf0e10cSrcweir                     rClipRange.aEnd.Col(), rClipRange.aEnd.Row(), aUsedNames);
1719cdf0e10cSrcweir 
1720cdf0e10cSrcweir     pClipDoc->pRangeName->FreeAll();
1721cdf0e10cSrcweir     for (sal_uInt16 i = 0; i < pRangeName->GetCount(); i++) //! DB-Bereiche Pivot-Bereiche auch !!!
1722cdf0e10cSrcweir     {
1723cdf0e10cSrcweir         sal_uInt16 nIndex = ((ScRangeData*)((*pRangeName)[i]))->GetIndex();
1724cdf0e10cSrcweir         bool bInUse = ( aUsedNames.find(nIndex) != aUsedNames.end() );
1725cdf0e10cSrcweir         if (bInUse)
1726cdf0e10cSrcweir         {
1727cdf0e10cSrcweir             ScRangeData* pData = new ScRangeData(*((*pRangeName)[i]));
1728cdf0e10cSrcweir             if (!pClipDoc->pRangeName->Insert(pData))
1729cdf0e10cSrcweir                 delete pData;
1730cdf0e10cSrcweir             else
1731cdf0e10cSrcweir                 pData->SetIndex(nIndex);
1732cdf0e10cSrcweir         }
1733cdf0e10cSrcweir     }
1734cdf0e10cSrcweir }
1735cdf0e10cSrcweir 
NumFmtMergeHandler(ScDocument * pDoc,ScDocument * pSrcDoc)1736cdf0e10cSrcweir ScDocument::NumFmtMergeHandler::NumFmtMergeHandler(ScDocument* pDoc, ScDocument* pSrcDoc) :
1737cdf0e10cSrcweir         mpDoc(pDoc)
1738cdf0e10cSrcweir {
1739cdf0e10cSrcweir     mpDoc->MergeNumberFormatter(pSrcDoc);
1740cdf0e10cSrcweir }
1741cdf0e10cSrcweir 
~NumFmtMergeHandler()1742cdf0e10cSrcweir ScDocument::NumFmtMergeHandler::~NumFmtMergeHandler()
1743cdf0e10cSrcweir {
1744cdf0e10cSrcweir     mpDoc->pFormatExchangeList = NULL;
1745cdf0e10cSrcweir }
1746cdf0e10cSrcweir 
MergeNumberFormatter(ScDocument * pSrcDoc)1747cdf0e10cSrcweir void ScDocument::MergeNumberFormatter(ScDocument* pSrcDoc)
1748cdf0e10cSrcweir {
1749cdf0e10cSrcweir     SvNumberFormatter* pThisFormatter = xPoolHelper->GetFormTable();
1750cdf0e10cSrcweir     SvNumberFormatter* pOtherFormatter = pSrcDoc->xPoolHelper->GetFormTable();
1751cdf0e10cSrcweir     if (pOtherFormatter && pOtherFormatter != pThisFormatter)
1752cdf0e10cSrcweir     {
1753cdf0e10cSrcweir         SvNumberFormatterIndexTable* pExchangeList =
1754cdf0e10cSrcweir                  pThisFormatter->MergeFormatter(*(pOtherFormatter));
1755cdf0e10cSrcweir         if (pExchangeList->Count() > 0)
1756cdf0e10cSrcweir             pFormatExchangeList = pExchangeList;
1757cdf0e10cSrcweir     }
1758cdf0e10cSrcweir }
1759cdf0e10cSrcweir 
CopyRangeNamesFromClip(ScDocument * pClipDoc,ScClipRangeNameData & rRangeNames)1760cdf0e10cSrcweir void ScDocument::CopyRangeNamesFromClip(ScDocument* pClipDoc, ScClipRangeNameData& rRangeNames)
1761cdf0e10cSrcweir {
1762cdf0e10cSrcweir     sal_uInt16 nClipRangeNameCount = pClipDoc->pRangeName->GetCount();
1763cdf0e10cSrcweir     ScClipRangeNameData aClipRangeNames;
1764cdf0e10cSrcweir 
1765cdf0e10cSrcweir     // array containing range names which might need update of indices
1766cdf0e10cSrcweir     aClipRangeNames.mpRangeNames.resize(nClipRangeNameCount, NULL);
1767cdf0e10cSrcweir 
1768cdf0e10cSrcweir     for (sal_uInt16 i = 0; i < nClipRangeNameCount; ++i) //! DB-Bereiche Pivot-Bereiche auch
1769cdf0e10cSrcweir     {
1770cdf0e10cSrcweir         /*  Copy only if the name doesn't exist in this document.
1771cdf0e10cSrcweir             If it exists we use the already existing name instead,
1772cdf0e10cSrcweir             another possibility could be to create new names if
1773cdf0e10cSrcweir             documents differ.
1774cdf0e10cSrcweir             A proper solution would ask the user how to proceed.
1775cdf0e10cSrcweir             The adjustment of the indices in the formulas is done later.
1776cdf0e10cSrcweir         */
1777cdf0e10cSrcweir         ScRangeData* pClipRangeData = (*pClipDoc->pRangeName)[i];
1778cdf0e10cSrcweir         sal_uInt16 k;
1779cdf0e10cSrcweir         if ( pRangeName->SearchName( pClipRangeData->GetName(), k ) )
1780cdf0e10cSrcweir         {
1781cdf0e10cSrcweir             aClipRangeNames.mpRangeNames[i] = NULL; // range name not inserted
1782cdf0e10cSrcweir             sal_uInt16 nOldIndex = pClipRangeData->GetIndex();
1783cdf0e10cSrcweir             sal_uInt16 nNewIndex = ((*pRangeName)[k])->GetIndex();
1784cdf0e10cSrcweir             aClipRangeNames.insert(nOldIndex, nNewIndex);
1785cdf0e10cSrcweir             if ( !aClipRangeNames.mbReplace )
1786cdf0e10cSrcweir                 aClipRangeNames.mbReplace = ( nOldIndex != nNewIndex );
1787cdf0e10cSrcweir         }
1788cdf0e10cSrcweir         else
1789cdf0e10cSrcweir         {
1790cdf0e10cSrcweir             ScRangeData* pData = new ScRangeData( *pClipRangeData );
1791cdf0e10cSrcweir             pData->SetDocument(this);
1792cdf0e10cSrcweir             if ( pRangeName->FindIndex( pData->GetIndex() ) )
1793cdf0e10cSrcweir                 pData->SetIndex(0); // need new index, done in Insert
1794cdf0e10cSrcweir             if ( pRangeName->Insert( pData ) )
1795cdf0e10cSrcweir             {
1796cdf0e10cSrcweir                 aClipRangeNames.mpRangeNames[i] = pData;
1797cdf0e10cSrcweir                 sal_uInt16 nOldIndex = pClipRangeData->GetIndex();
1798cdf0e10cSrcweir                 sal_uInt16 nNewIndex = pData->GetIndex();
1799cdf0e10cSrcweir                 aClipRangeNames.insert(nOldIndex, nNewIndex);
1800cdf0e10cSrcweir                 if ( !aClipRangeNames.mbReplace )
1801cdf0e10cSrcweir                     aClipRangeNames.mbReplace = ( nOldIndex != nNewIndex );
1802cdf0e10cSrcweir             }
1803cdf0e10cSrcweir             else
1804cdf0e10cSrcweir             {   // must be an overflow
1805cdf0e10cSrcweir                 delete pData;
1806cdf0e10cSrcweir                 aClipRangeNames.mpRangeNames[i] = NULL;
1807cdf0e10cSrcweir                 aClipRangeNames.insert(pClipRangeData->GetIndex(), 0);
1808cdf0e10cSrcweir                 aClipRangeNames.mbReplace = true;
1809cdf0e10cSrcweir             }
1810cdf0e10cSrcweir         }
1811cdf0e10cSrcweir     }
1812cdf0e10cSrcweir     rRangeNames = aClipRangeNames;
1813cdf0e10cSrcweir }
1814cdf0e10cSrcweir 
UpdateRangeNamesInFormulas(ScClipRangeNameData & rRangeNames,const ScRangeList & rDestRanges,const ScMarkData & rMark,SCCOL nXw,SCROW nYw)1815cdf0e10cSrcweir void ScDocument::UpdateRangeNamesInFormulas(
1816cdf0e10cSrcweir     ScClipRangeNameData& rRangeNames, const ScRangeList& rDestRanges, const ScMarkData& rMark,
1817cdf0e10cSrcweir     SCCOL nXw, SCROW nYw)
1818cdf0e10cSrcweir {
1819cdf0e10cSrcweir     // nXw and nYw are the extra width and height of the destination range
1820cdf0e10cSrcweir     // extended due to presence of merged cell(s).
1821cdf0e10cSrcweir 
1822cdf0e10cSrcweir     if (!rRangeNames.mbReplace)
1823cdf0e10cSrcweir         return;
1824cdf0e10cSrcweir 
1825cdf0e10cSrcweir     // first update all inserted named formulas if they contain other
1826cdf0e10cSrcweir     // range names and used indices changed
1827cdf0e10cSrcweir     size_t nRangeNameCount = rRangeNames.mpRangeNames.size();
1828cdf0e10cSrcweir     for (size_t i = 0; i < nRangeNameCount; ++i) //! DB-Bereiche Pivot-Bereiche auch
1829cdf0e10cSrcweir     {
1830cdf0e10cSrcweir         if ( rRangeNames.mpRangeNames[i] )
1831cdf0e10cSrcweir             rRangeNames.mpRangeNames[i]->ReplaceRangeNamesInUse(rRangeNames.maRangeMap);
1832cdf0e10cSrcweir     }
1833cdf0e10cSrcweir     // then update the formulas, they might need just the updated range names
1834cdf0e10cSrcweir     for (sal_uLong nRange = 0; nRange < rDestRanges.Count(); ++nRange)
1835cdf0e10cSrcweir     {
1836cdf0e10cSrcweir         const ScRange* pRange = rDestRanges.GetObject( nRange);
1837cdf0e10cSrcweir         SCCOL nCol1 = pRange->aStart.Col();
1838cdf0e10cSrcweir         SCROW nRow1 = pRange->aStart.Row();
1839cdf0e10cSrcweir         SCCOL nCol2 = pRange->aEnd.Col();
1840cdf0e10cSrcweir         SCROW nRow2 = pRange->aEnd.Row();
1841cdf0e10cSrcweir 
1842cdf0e10cSrcweir         SCCOL nC1 = nCol1;
1843cdf0e10cSrcweir         SCROW nR1 = nRow1;
1844cdf0e10cSrcweir         SCCOL nC2 = nC1 + nXw;
1845cdf0e10cSrcweir         if (nC2 > nCol2)
1846cdf0e10cSrcweir             nC2 = nCol2;
1847cdf0e10cSrcweir         SCROW nR2 = nR1 + nYw;
1848cdf0e10cSrcweir         if (nR2 > nRow2)
1849cdf0e10cSrcweir             nR2 = nRow2;
1850cdf0e10cSrcweir         do
1851cdf0e10cSrcweir         {
1852cdf0e10cSrcweir             do
1853cdf0e10cSrcweir             {
1854cdf0e10cSrcweir                 for (SCTAB k = 0; k <= MAXTAB; k++)
1855cdf0e10cSrcweir                 {
1856cdf0e10cSrcweir                     if ( pTab[k] && rMark.GetTableSelect(k) )
1857cdf0e10cSrcweir                         pTab[k]->ReplaceRangeNamesInUse(nC1, nR1,
1858cdf0e10cSrcweir                             nC2, nR2, rRangeNames.maRangeMap);
1859cdf0e10cSrcweir                 }
1860cdf0e10cSrcweir                 nC1 = nC2 + 1;
1861cdf0e10cSrcweir                 nC2 = Min((SCCOL)(nC1 + nXw), nCol2);
1862cdf0e10cSrcweir             } while (nC1 <= nCol2);
1863cdf0e10cSrcweir             nC1 = nCol1;
1864cdf0e10cSrcweir             nC2 = nC1 + nXw;
1865cdf0e10cSrcweir             if (nC2 > nCol2)
1866cdf0e10cSrcweir                 nC2 = nCol2;
1867cdf0e10cSrcweir             nR1 = nR2 + 1;
1868cdf0e10cSrcweir             nR2 = Min((SCROW)(nR1 + nYw), nRow2);
1869cdf0e10cSrcweir         } while (nR1 <= nRow2);
1870cdf0e10cSrcweir     }
1871cdf0e10cSrcweir }
1872cdf0e10cSrcweir 
GetClipParam()1873cdf0e10cSrcweir ScClipParam& ScDocument::GetClipParam()
1874cdf0e10cSrcweir {
1875cdf0e10cSrcweir     if (!mpClipParam.get())
1876cdf0e10cSrcweir         mpClipParam.reset(new ScClipParam);
1877cdf0e10cSrcweir 
1878cdf0e10cSrcweir     return *mpClipParam;
1879cdf0e10cSrcweir }
1880cdf0e10cSrcweir 
SetClipParam(const ScClipParam & rParam)1881cdf0e10cSrcweir void ScDocument::SetClipParam(const ScClipParam& rParam)
1882cdf0e10cSrcweir {
1883cdf0e10cSrcweir     mpClipParam.reset(new ScClipParam(rParam));
1884cdf0e10cSrcweir }
1885cdf0e10cSrcweir 
IsClipboardSource() const1886cdf0e10cSrcweir sal_Bool ScDocument::IsClipboardSource() const
1887cdf0e10cSrcweir {
1888cdf0e10cSrcweir     ScDocument* pClipDoc = SC_MOD()->GetClipDoc();
1889cdf0e10cSrcweir     return pClipDoc && pClipDoc->xPoolHelper.isValid() &&
1890cdf0e10cSrcweir             xPoolHelper->GetDocPool() == pClipDoc->xPoolHelper->GetDocPool();
1891cdf0e10cSrcweir }
1892cdf0e10cSrcweir 
1893cdf0e10cSrcweir 
StartListeningFromClip(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,const ScMarkData & rMark,sal_uInt16 nInsFlag)1894cdf0e10cSrcweir void ScDocument::StartListeningFromClip( SCCOL nCol1, SCROW nRow1,
1895cdf0e10cSrcweir                                         SCCOL nCol2, SCROW nRow2,
1896cdf0e10cSrcweir                                         const ScMarkData& rMark, sal_uInt16 nInsFlag )
1897cdf0e10cSrcweir {
1898cdf0e10cSrcweir     if (nInsFlag & IDF_CONTENTS)
1899cdf0e10cSrcweir     {
1900cdf0e10cSrcweir         for (SCTAB i = 0; i <= MAXTAB; i++)
1901cdf0e10cSrcweir             if (pTab[i])
1902cdf0e10cSrcweir                 if (rMark.GetTableSelect(i))
1903cdf0e10cSrcweir                     pTab[i]->StartListeningInArea( nCol1, nRow1, nCol2, nRow2 );
1904cdf0e10cSrcweir     }
1905cdf0e10cSrcweir }
1906cdf0e10cSrcweir 
1907cdf0e10cSrcweir 
BroadcastFromClip(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,const ScMarkData & rMark,sal_uInt16 nInsFlag)1908cdf0e10cSrcweir void ScDocument::BroadcastFromClip( SCCOL nCol1, SCROW nRow1,
1909cdf0e10cSrcweir                                     SCCOL nCol2, SCROW nRow2,
1910cdf0e10cSrcweir                                     const ScMarkData& rMark, sal_uInt16 nInsFlag )
1911cdf0e10cSrcweir {
1912cdf0e10cSrcweir     if (nInsFlag & IDF_CONTENTS)
1913cdf0e10cSrcweir     {
1914cdf0e10cSrcweir         ScBulkBroadcast aBulkBroadcast( GetBASM());
1915cdf0e10cSrcweir         for (SCTAB i = 0; i <= MAXTAB; i++)
1916cdf0e10cSrcweir             if (pTab[i])
1917cdf0e10cSrcweir                 if (rMark.GetTableSelect(i))
1918cdf0e10cSrcweir                     pTab[i]->BroadcastInArea( nCol1, nRow1, nCol2, nRow2 );
1919cdf0e10cSrcweir     }
1920cdf0e10cSrcweir }
1921cdf0e10cSrcweir 
1922cdf0e10cSrcweir 
CopyBlockFromClip(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,const ScMarkData & rMark,SCsCOL nDx,SCsROW nDy,const ScCopyBlockFromClipParams * pCBFCP)1923cdf0e10cSrcweir void ScDocument::CopyBlockFromClip( SCCOL nCol1, SCROW nRow1,
1924cdf0e10cSrcweir                                     SCCOL nCol2, SCROW nRow2,
1925cdf0e10cSrcweir                                     const ScMarkData& rMark,
1926cdf0e10cSrcweir                                     SCsCOL nDx, SCsROW nDy,
1927cdf0e10cSrcweir                                     const ScCopyBlockFromClipParams* pCBFCP )
1928cdf0e10cSrcweir {
1929cdf0e10cSrcweir     ScTable** ppClipTab = pCBFCP->pClipDoc->pTab;
1930cdf0e10cSrcweir     SCTAB nTabEnd = pCBFCP->nTabEnd;
1931cdf0e10cSrcweir     SCTAB nClipTab = 0;
1932cdf0e10cSrcweir     for (SCTAB i = pCBFCP->nTabStart; i <= nTabEnd; i++)
1933cdf0e10cSrcweir     {
1934cdf0e10cSrcweir         if (pTab[i] && rMark.GetTableSelect(i) )
1935cdf0e10cSrcweir         {
1936cdf0e10cSrcweir             while (!ppClipTab[nClipTab]) nClipTab = (nClipTab+1) % (MAXTAB+1);
1937cdf0e10cSrcweir 
1938cdf0e10cSrcweir             pTab[i]->CopyFromClip( nCol1, nRow1, nCol2, nRow2, nDx, nDy,
1939cdf0e10cSrcweir                 pCBFCP->nInsFlag, pCBFCP->bAsLink, pCBFCP->bSkipAttrForEmpty, ppClipTab[nClipTab] );
1940cdf0e10cSrcweir 
1941cdf0e10cSrcweir             if ( pCBFCP->pClipDoc->pDrawLayer && ( pCBFCP->nInsFlag & IDF_OBJECTS ) )
1942cdf0e10cSrcweir             {
1943cdf0e10cSrcweir                 // also copy drawing objects
1944cdf0e10cSrcweir 
1945cdf0e10cSrcweir                 // drawing layer must be created before calling CopyFromClip
1946cdf0e10cSrcweir                 // (ScDocShell::MakeDrawLayer also does InitItems etc.)
1947cdf0e10cSrcweir                 DBG_ASSERT( pDrawLayer, "CopyBlockFromClip: No drawing layer" );
1948cdf0e10cSrcweir                 if ( pDrawLayer )
1949cdf0e10cSrcweir                 {
1950cdf0e10cSrcweir                     // For GetMMRect, the row heights in the target document must already be valid
1951cdf0e10cSrcweir                     // (copied in an extra step before pasting, or updated after pasting cells, but
1952cdf0e10cSrcweir                     // before pasting objects).
1953cdf0e10cSrcweir 
1954cdf0e10cSrcweir                     Rectangle aSourceRect = pCBFCP->pClipDoc->GetMMRect(
1955cdf0e10cSrcweir                                     nCol1-nDx, nRow1-nDy, nCol2-nDx, nRow2-nDy, nClipTab );
1956cdf0e10cSrcweir                     Rectangle aDestRect = GetMMRect( nCol1, nRow1, nCol2, nRow2, i );
1957cdf0e10cSrcweir                     pDrawLayer->CopyFromClip( pCBFCP->pClipDoc->pDrawLayer, nClipTab, aSourceRect,
1958cdf0e10cSrcweir                                                 ScAddress( nCol1, nRow1, i ), aDestRect );
1959cdf0e10cSrcweir                 }
1960cdf0e10cSrcweir             }
1961cdf0e10cSrcweir 
1962cdf0e10cSrcweir             nClipTab = (nClipTab+1) % (MAXTAB+1);
1963cdf0e10cSrcweir         }
1964cdf0e10cSrcweir     }
1965faa11fa3SDamjan Jovanovic     if ( (pCBFCP->nInsFlag & IDF_CONTENTS) &&
19663accd9b1SDamjan Jovanovic             (pCBFCP->pClipDoc->GetClipParam().getSourceDocID() == 0 ||
19673accd9b1SDamjan Jovanovic              pCBFCP->pClipDoc->GetClipParam().getSourceDocID() == GetDocumentID()) ) // #118023# only update references for *intra-document* cut and paste
1968cdf0e10cSrcweir     {
1969cdf0e10cSrcweir         nClipTab = 0;
1970cdf0e10cSrcweir         for (SCTAB i = pCBFCP->nTabStart; i <= nTabEnd; i++)
1971cdf0e10cSrcweir         {
1972cdf0e10cSrcweir             if (pTab[i] && rMark.GetTableSelect(i) )
1973cdf0e10cSrcweir             {
1974cdf0e10cSrcweir                 while (!ppClipTab[nClipTab]) nClipTab = (nClipTab+1) % (MAXTAB+1);
1975cdf0e10cSrcweir                 SCsTAB nDz = ((SCsTAB)i) - nClipTab;
1976cdf0e10cSrcweir 
1977cdf0e10cSrcweir                 // #89081# ranges of consecutive selected tables (in clipboard and dest. doc)
1978cdf0e10cSrcweir                 // must be handled in one UpdateReference call
1979cdf0e10cSrcweir                 SCTAB nFollow = 0;
1980cdf0e10cSrcweir                 while ( i + nFollow < nTabEnd
1981cdf0e10cSrcweir                         && rMark.GetTableSelect( i + nFollow + 1 )
1982cdf0e10cSrcweir                         && nClipTab + nFollow < MAXTAB
1983cdf0e10cSrcweir                         && ppClipTab[nClipTab + nFollow + 1] )
1984cdf0e10cSrcweir                     ++nFollow;
1985cdf0e10cSrcweir 
1986cdf0e10cSrcweir                 if ( pCBFCP->pClipDoc->GetClipParam().mbCutMode )
1987cdf0e10cSrcweir                 {
1988cdf0e10cSrcweir                     sal_Bool bOldInserting = IsInsertingFromOtherDoc();
1989cdf0e10cSrcweir                     SetInsertingFromOtherDoc( sal_True);
1990cdf0e10cSrcweir                     UpdateReference( URM_MOVE,
1991cdf0e10cSrcweir                         nCol1, nRow1, i, nCol2, nRow2, i+nFollow,
1992cdf0e10cSrcweir                         nDx, nDy, nDz, pCBFCP->pRefUndoDoc, sal_False );
1993cdf0e10cSrcweir                     SetInsertingFromOtherDoc( bOldInserting);
1994cdf0e10cSrcweir                 }
1995cdf0e10cSrcweir                 else
1996cdf0e10cSrcweir                     UpdateReference( URM_COPY,
1997cdf0e10cSrcweir                         nCol1, nRow1, i, nCol2, nRow2, i+nFollow,
1998cdf0e10cSrcweir                         nDx, nDy, nDz, pCBFCP->pRefUndoDoc, sal_False );
1999cdf0e10cSrcweir 
2000cdf0e10cSrcweir                 nClipTab = (nClipTab+nFollow+1) % (MAXTAB+1);
2001cdf0e10cSrcweir                 i = sal::static_int_cast<SCTAB>( i + nFollow );
2002cdf0e10cSrcweir             }
2003cdf0e10cSrcweir         }
2004cdf0e10cSrcweir     }
2005cdf0e10cSrcweir }
2006cdf0e10cSrcweir 
2007cdf0e10cSrcweir 
CopyNonFilteredFromClip(SCCOL nCol1,SCROW nRow1,SCCOL nCol2,SCROW nRow2,const ScMarkData & rMark,SCsCOL nDx,SCsROW,const ScCopyBlockFromClipParams * pCBFCP,SCROW & rClipStartRow)2008cdf0e10cSrcweir void ScDocument::CopyNonFilteredFromClip( SCCOL nCol1, SCROW nRow1,
2009cdf0e10cSrcweir                                     SCCOL nCol2, SCROW nRow2,
2010cdf0e10cSrcweir                                     const ScMarkData& rMark,
2011cdf0e10cSrcweir                                     SCsCOL nDx, SCsROW /* nDy */,
2012cdf0e10cSrcweir                                     const ScCopyBlockFromClipParams* pCBFCP,
2013cdf0e10cSrcweir                                     SCROW & rClipStartRow )
2014cdf0e10cSrcweir {
2015cdf0e10cSrcweir     // call CopyBlockFromClip for ranges of consecutive non-filtered rows
2016cdf0e10cSrcweir     // nCol1/nRow1 etc. is in target doc
2017cdf0e10cSrcweir 
2018cdf0e10cSrcweir     // filtered state is taken from first used table in clipboard (as in GetClipArea)
2019cdf0e10cSrcweir     SCTAB nFlagTab = 0;
2020cdf0e10cSrcweir     ScTable** ppClipTab = pCBFCP->pClipDoc->pTab;
2021cdf0e10cSrcweir     while ( nFlagTab < MAXTAB && !ppClipTab[nFlagTab] )
2022cdf0e10cSrcweir         ++nFlagTab;
2023cdf0e10cSrcweir 
2024cdf0e10cSrcweir     SCROW nSourceRow = rClipStartRow;
2025cdf0e10cSrcweir     SCROW nSourceEnd = 0;
2026cdf0e10cSrcweir     if (pCBFCP->pClipDoc->GetClipParam().maRanges.Count())
2027cdf0e10cSrcweir         nSourceEnd = pCBFCP->pClipDoc->GetClipParam().maRanges.First()->aEnd.Row();
2028cdf0e10cSrcweir     SCROW nDestRow = nRow1;
2029cdf0e10cSrcweir 
2030cdf0e10cSrcweir     while ( nSourceRow <= nSourceEnd && nDestRow <= nRow2 )
2031cdf0e10cSrcweir     {
2032cdf0e10cSrcweir         // skip filtered rows
2033cdf0e10cSrcweir         nSourceRow = pCBFCP->pClipDoc->FirstNonFilteredRow(nSourceRow, nSourceEnd, nFlagTab);
2034cdf0e10cSrcweir 
2035cdf0e10cSrcweir         if ( nSourceRow <= nSourceEnd )
2036cdf0e10cSrcweir         {
2037cdf0e10cSrcweir             // look for more non-filtered rows following
2038cdf0e10cSrcweir             SCROW nLastRow = nSourceRow;
2039cdf0e10cSrcweir             pCBFCP->pClipDoc->RowFiltered(nSourceRow, nFlagTab, NULL, &nLastRow);
2040cdf0e10cSrcweir             SCROW nFollow = nLastRow - nSourceRow;
2041cdf0e10cSrcweir 
2042cdf0e10cSrcweir             if (nFollow > nSourceEnd - nSourceRow)
2043cdf0e10cSrcweir                 nFollow = nSourceEnd - nSourceRow;
2044cdf0e10cSrcweir             if (nFollow > nRow2 - nDestRow)
2045cdf0e10cSrcweir                 nFollow = nRow2 - nDestRow;
2046cdf0e10cSrcweir 
2047cdf0e10cSrcweir             SCsROW nNewDy = ((SCsROW)nDestRow) - nSourceRow;
2048cdf0e10cSrcweir             CopyBlockFromClip( nCol1, nDestRow, nCol2, nDestRow + nFollow, rMark, nDx, nNewDy, pCBFCP );
2049cdf0e10cSrcweir 
2050cdf0e10cSrcweir             nSourceRow += nFollow + 1;
2051cdf0e10cSrcweir             nDestRow += nFollow + 1;
2052cdf0e10cSrcweir         }
2053cdf0e10cSrcweir     }
2054cdf0e10cSrcweir     rClipStartRow = nSourceRow;
2055cdf0e10cSrcweir }
2056cdf0e10cSrcweir 
2057cdf0e10cSrcweir 
CopyFromClip(const ScRange & rDestRange,const ScMarkData & rMark,sal_uInt16 nInsFlag,ScDocument * pRefUndoDoc,ScDocument * pClipDoc,sal_Bool bResetCut,sal_Bool bAsLink,sal_Bool bIncludeFiltered,sal_Bool bSkipAttrForEmpty,const ScRangeList * pDestRanges)2058cdf0e10cSrcweir void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMark,
2059cdf0e10cSrcweir                                 sal_uInt16 nInsFlag,
2060cdf0e10cSrcweir                                 ScDocument* pRefUndoDoc, ScDocument* pClipDoc, sal_Bool bResetCut,
2061cdf0e10cSrcweir                                 sal_Bool bAsLink, sal_Bool bIncludeFiltered, sal_Bool bSkipAttrForEmpty,
2062cdf0e10cSrcweir                                 const ScRangeList * pDestRanges )
2063cdf0e10cSrcweir {
2064cdf0e10cSrcweir     if (!bIsClip)
2065cdf0e10cSrcweir     {
2066cdf0e10cSrcweir         if (!pClipDoc)
2067cdf0e10cSrcweir         {
2068cdf0e10cSrcweir             DBG_ERROR("CopyFromClip: no ClipDoc");
2069cdf0e10cSrcweir             pClipDoc = SC_MOD()->GetClipDoc();
2070cdf0e10cSrcweir         }
2071cdf0e10cSrcweir         if (pClipDoc->bIsClip && pClipDoc->GetTableCount())
2072cdf0e10cSrcweir         {
2073cdf0e10cSrcweir             sal_Bool bOldAutoCalc = GetAutoCalc();
2074cdf0e10cSrcweir             SetAutoCalc( sal_False ); // avoid multiple recalculations
2075cdf0e10cSrcweir 
2076cdf0e10cSrcweir             NumFmtMergeHandler aNumFmtMergeHdl(this, pClipDoc);
2077cdf0e10cSrcweir 
2078cdf0e10cSrcweir             ScClipRangeNameData aClipRangeNames;
2079cdf0e10cSrcweir             CopyRangeNamesFromClip(pClipDoc, aClipRangeNames);
2080cdf0e10cSrcweir 
2081cdf0e10cSrcweir             SCCOL nAllCol1 = rDestRange.aStart.Col();
2082cdf0e10cSrcweir             SCROW nAllRow1 = rDestRange.aStart.Row();
2083cdf0e10cSrcweir             SCCOL nAllCol2 = rDestRange.aEnd.Col();
2084cdf0e10cSrcweir             SCROW nAllRow2 = rDestRange.aEnd.Row();
2085cdf0e10cSrcweir 
2086cdf0e10cSrcweir             SCCOL nXw = 0;
2087cdf0e10cSrcweir             SCROW nYw = 0;
2088cdf0e10cSrcweir             ScRange aClipRange = pClipDoc->GetClipParam().getWholeRange();
2089cdf0e10cSrcweir             for (SCTAB nTab = 0; nTab <= MAXTAB; nTab++)    // find largest merge overlap
2090cdf0e10cSrcweir                 if (pClipDoc->pTab[nTab])                   // all sheets of the clipboard content
2091cdf0e10cSrcweir                 {
2092cdf0e10cSrcweir                     SCCOL nThisEndX = aClipRange.aEnd.Col();
2093cdf0e10cSrcweir                     SCROW nThisEndY = aClipRange.aEnd.Row();
2094cdf0e10cSrcweir                     pClipDoc->ExtendMerge( aClipRange.aStart.Col(),
2095cdf0e10cSrcweir                                             aClipRange.aStart.Row(),
2096cdf0e10cSrcweir                                             nThisEndX, nThisEndY, nTab );
2097cdf0e10cSrcweir                     // only extra value from ExtendMerge
2098cdf0e10cSrcweir                     nThisEndX = sal::static_int_cast<SCCOL>( nThisEndX - aClipRange.aEnd.Col() );
2099cdf0e10cSrcweir                     nThisEndY = sal::static_int_cast<SCROW>( nThisEndY - aClipRange.aEnd.Row() );
2100cdf0e10cSrcweir                     if ( nThisEndX > nXw )
2101cdf0e10cSrcweir                         nXw = nThisEndX;
2102cdf0e10cSrcweir                     if ( nThisEndY > nYw )
2103cdf0e10cSrcweir                         nYw = nThisEndY;
2104cdf0e10cSrcweir                 }
2105cdf0e10cSrcweir 
2106cdf0e10cSrcweir             SCCOL nDestAddX;
2107cdf0e10cSrcweir             SCROW nDestAddY;
2108cdf0e10cSrcweir             pClipDoc->GetClipArea( nDestAddX, nDestAddY, bIncludeFiltered );
2109cdf0e10cSrcweir             nXw = sal::static_int_cast<SCCOL>( nXw + nDestAddX );
2110cdf0e10cSrcweir             nYw = sal::static_int_cast<SCROW>( nYw + nDestAddY ); // ClipArea, plus ExtendMerge value
2111cdf0e10cSrcweir 
2112cdf0e10cSrcweir             /*  Decide which contents to delete before copying. Delete all
2113cdf0e10cSrcweir                 contents if nInsFlag contains any real content flag.
2114cdf0e10cSrcweir                 #i102056# Notes are pasted from clipboard in a second pass,
2115cdf0e10cSrcweir                 together with the special flag IDF_ADDNOTES that states to not
2116cdf0e10cSrcweir                 overwrite/delete existing cells but to insert the notes into
2117cdf0e10cSrcweir                 these cells. In this case, just delete old notes from the
2118cdf0e10cSrcweir                 destination area. */
2119cdf0e10cSrcweir             sal_uInt16 nDelFlag = IDF_NONE;
2120cdf0e10cSrcweir             if ( (nInsFlag & (IDF_CONTENTS | IDF_ADDNOTES)) == (IDF_NOTE | IDF_ADDNOTES) )
2121cdf0e10cSrcweir                 nDelFlag |= IDF_NOTE;
2122cdf0e10cSrcweir             else if ( nInsFlag & IDF_CONTENTS )
2123cdf0e10cSrcweir                 nDelFlag |= IDF_CONTENTS;
2124cdf0e10cSrcweir             // With bSkipAttrForEmpty, don't remove attributes, copy
2125cdf0e10cSrcweir             // on top of existing attributes instead.
2126cdf0e10cSrcweir             if ( ( nInsFlag & IDF_ATTRIB ) && !bSkipAttrForEmpty )
2127cdf0e10cSrcweir                 nDelFlag |= IDF_ATTRIB;
2128cdf0e10cSrcweir 
2129cdf0e10cSrcweir             ScCopyBlockFromClipParams aCBFCP;
2130cdf0e10cSrcweir             aCBFCP.pRefUndoDoc = pRefUndoDoc;
2131cdf0e10cSrcweir             aCBFCP.pClipDoc = pClipDoc;
2132cdf0e10cSrcweir             aCBFCP.nInsFlag = nInsFlag;
2133cdf0e10cSrcweir             aCBFCP.bAsLink  = bAsLink;
2134cdf0e10cSrcweir             aCBFCP.bSkipAttrForEmpty = bSkipAttrForEmpty;
2135cdf0e10cSrcweir             aCBFCP.nTabStart = MAXTAB;      // wird in der Schleife angepasst
2136cdf0e10cSrcweir             aCBFCP.nTabEnd = 0;             // wird in der Schleife angepasst
2137cdf0e10cSrcweir 
2138982a05a9Smseidel             // Inc/DecRecalcLevel einmal aussen, damit nicht für jeden Block
2139982a05a9Smseidel             // die Draw-Seitengröße neu berechnet werden muss
2140cdf0e10cSrcweir             //! nur wenn ganze Zeilen/Spalten kopiert werden?
2141cdf0e10cSrcweir 
2142cdf0e10cSrcweir             for (SCTAB j = 0; j <= MAXTAB; j++)
2143cdf0e10cSrcweir                 if (pTab[j] && rMark.GetTableSelect(j))
2144cdf0e10cSrcweir                 {
2145cdf0e10cSrcweir                     if ( j < aCBFCP.nTabStart )
2146cdf0e10cSrcweir                         aCBFCP.nTabStart = j;
2147cdf0e10cSrcweir                     aCBFCP.nTabEnd = j;
2148cdf0e10cSrcweir                     pTab[j]->IncRecalcLevel();
2149cdf0e10cSrcweir                 }
2150cdf0e10cSrcweir 
2151cdf0e10cSrcweir             ScRangeList aLocalRangeList;
2152cdf0e10cSrcweir             if (!pDestRanges)
2153cdf0e10cSrcweir             {
2154cdf0e10cSrcweir                 aLocalRangeList.Append( rDestRange);
2155cdf0e10cSrcweir                 pDestRanges = &aLocalRangeList;
2156cdf0e10cSrcweir             }
2157cdf0e10cSrcweir 
2158cdf0e10cSrcweir             bInsertingFromOtherDoc = sal_True; // kein Broadcast/Listener aufbauen bei Insert
2159cdf0e10cSrcweir 
2160cdf0e10cSrcweir             // bei mindestens 64 Zeilen wird in ScColumn::CopyFromClip voralloziert
2161cdf0e10cSrcweir             sal_Bool bDoDouble = ( nYw < 64 && nAllRow2 - nAllRow1 > 64);
2162cdf0e10cSrcweir             sal_Bool bOldDouble = ScColumn::bDoubleAlloc;
2163cdf0e10cSrcweir             if (bDoDouble)
2164cdf0e10cSrcweir                 ScColumn::bDoubleAlloc = sal_True;
2165cdf0e10cSrcweir 
2166cdf0e10cSrcweir             SCCOL nClipStartCol = aClipRange.aStart.Col();
2167cdf0e10cSrcweir             SCROW nClipStartRow = aClipRange.aStart.Row();
2168cdf0e10cSrcweir             // WaE: commented because unused: SCCOL nClipEndCol = pClipDoc->aClipRange.aEnd.Col();
2169cdf0e10cSrcweir             SCROW nClipEndRow = aClipRange.aEnd.Row();
2170cdf0e10cSrcweir             for (sal_uLong nRange = 0; nRange < pDestRanges->Count(); ++nRange)
2171cdf0e10cSrcweir             {
2172cdf0e10cSrcweir                 const ScRange* pRange = pDestRanges->GetObject( nRange);
2173cdf0e10cSrcweir                 SCCOL nCol1 = pRange->aStart.Col();
2174cdf0e10cSrcweir                 SCROW nRow1 = pRange->aStart.Row();
2175cdf0e10cSrcweir                 SCCOL nCol2 = pRange->aEnd.Col();
2176cdf0e10cSrcweir                 SCROW nRow2 = pRange->aEnd.Row();
2177cdf0e10cSrcweir 
2178cdf0e10cSrcweir                 DeleteArea(nCol1, nRow1, nCol2, nRow2, rMark, nDelFlag);
2179cdf0e10cSrcweir 
2180cdf0e10cSrcweir                 SCCOL nC1 = nCol1;
2181cdf0e10cSrcweir                 SCROW nR1 = nRow1;
2182cdf0e10cSrcweir                 SCCOL nC2 = nC1 + nXw;
2183cdf0e10cSrcweir                 if (nC2 > nCol2)
2184cdf0e10cSrcweir                     nC2 = nCol2;
2185cdf0e10cSrcweir                 SCROW nR2 = nR1 + nYw;
2186cdf0e10cSrcweir                 if (nR2 > nRow2)
2187cdf0e10cSrcweir                     nR2 = nRow2;
2188cdf0e10cSrcweir 
21898f4c7c28SSteve Yin                 const unsigned PERFORMANCEOPTIMIZATION4PATTERNTHRESHOLD = 8192;
21908f4c7c28SSteve Yin                 bool bNeedPerformanceOptimization4Pattern = nRow2 - nRow1 > PERFORMANCEOPTIMIZATION4PATTERNTHRESHOLD;
21918f4c7c28SSteve Yin                 std::vector< std::vector< SCSIZE > > vvPatternCount( bNeedPerformanceOptimization4Pattern ? nCol2 - nCol1 + 1 : 0 );
21928f4c7c28SSteve Yin                 std::vector< SCTAB > vTables;
21938f4c7c28SSteve Yin 
21948f4c7c28SSteve Yin                 if( bNeedPerformanceOptimization4Pattern )
21958f4c7c28SSteve Yin                 {
21968f4c7c28SSteve Yin                     for (SCTAB i = aCBFCP.nTabStart; i <= aCBFCP.nTabEnd; i++)
21978f4c7c28SSteve Yin                         if (pTab[i] && rMark.GetTableSelect( i ) )
21988f4c7c28SSteve Yin                             vTables.push_back( i );
21998f4c7c28SSteve Yin 
22008f4c7c28SSteve Yin                     for( SCSIZE i = 0; i < vvPatternCount.size(); i++ )
22018f4c7c28SSteve Yin                     {
22028f4c7c28SSteve Yin                         vvPatternCount[i].resize( vTables.size() );
22038f4c7c28SSteve Yin 
22048f4c7c28SSteve Yin                         for( std::vector< SCTAB >::size_type j = 0; j<vTables.size(); j++ )
22058f4c7c28SSteve Yin                             vvPatternCount[i][j] = this->GetPatternCount( vTables[j], nCol1+i );
22068f4c7c28SSteve Yin                     }
22078f4c7c28SSteve Yin                 }
22088f4c7c28SSteve Yin 
2209cdf0e10cSrcweir                 do
2210cdf0e10cSrcweir                 {
2211cdf0e10cSrcweir                     // Pasting is done column-wise, when pasting to a filtered
2212cdf0e10cSrcweir                     // area this results in partitioning and we have to
2213cdf0e10cSrcweir                     // remember and reset the start row for each column until
2214cdf0e10cSrcweir                     // it can be advanced for the next chunk of unfiltered
2215cdf0e10cSrcweir                     // rows.
2216cdf0e10cSrcweir                     SCROW nSaveClipStartRow = nClipStartRow;
2217cdf0e10cSrcweir                     do
2218cdf0e10cSrcweir                     {
2219cdf0e10cSrcweir                         nClipStartRow = nSaveClipStartRow;
2220cdf0e10cSrcweir                         SCsCOL nDx = ((SCsCOL)nC1) - nClipStartCol;
2221cdf0e10cSrcweir                         SCsROW nDy = ((SCsROW)nR1) - nClipStartRow;
2222cdf0e10cSrcweir                         if ( bIncludeFiltered )
2223cdf0e10cSrcweir                         {
2224cdf0e10cSrcweir                             CopyBlockFromClip( nC1, nR1, nC2, nR2, rMark, nDx,
2225cdf0e10cSrcweir                                     nDy, &aCBFCP );
2226cdf0e10cSrcweir                             nClipStartRow += nR2 - nR1 + 1;
2227cdf0e10cSrcweir                         }
2228cdf0e10cSrcweir                         else
2229cdf0e10cSrcweir                         {
2230cdf0e10cSrcweir                             CopyNonFilteredFromClip( nC1, nR1, nC2, nR2, rMark,
2231cdf0e10cSrcweir                                     nDx, nDy, &aCBFCP, nClipStartRow );
2232cdf0e10cSrcweir                         }
2233cdf0e10cSrcweir                         // Not needed for columns, but if it was this would be how to.
2234cdf0e10cSrcweir                         //if (nClipStartCol > nClipEndCol)
2235cdf0e10cSrcweir                         //    nClipStartCol = pClipDoc->aClipRange.aStart.Col();
2236cdf0e10cSrcweir                         nC1 = nC2 + 1;
2237cdf0e10cSrcweir                         nC2 = Min((SCCOL)(nC1 + nXw), nCol2);
2238cdf0e10cSrcweir                     } while (nC1 <= nCol2);
2239cdf0e10cSrcweir                     if (nClipStartRow > nClipEndRow)
2240cdf0e10cSrcweir                         nClipStartRow = aClipRange.aStart.Row();
2241cdf0e10cSrcweir                     nC1 = nCol1;
2242cdf0e10cSrcweir                     nC2 = nC1 + nXw;
2243cdf0e10cSrcweir                     if (nC2 > nCol2)
2244cdf0e10cSrcweir                         nC2 = nCol2;
22458f4c7c28SSteve Yin 
22468f4c7c28SSteve Yin                     if( bNeedPerformanceOptimization4Pattern && vvPatternCount.size() )
22478f4c7c28SSteve Yin                     {
22488f4c7c28SSteve Yin                         for( SCSIZE i = 0; i < vvPatternCount.size(); i++ )
22498f4c7c28SSteve Yin                         {
22508f4c7c28SSteve Yin                             vvPatternCount[i].resize( vTables.size() );
22518f4c7c28SSteve Yin 
22528f4c7c28SSteve Yin                             for( std::vector< SCTAB >::size_type j = 0; j<vTables.size(); j++ )
22538f4c7c28SSteve Yin                                 this->ReservedPatternCount( vTables[j], nCol1+i, vvPatternCount[i][j] + ( this->GetPatternCount( vTables[j], nCol1+i, nR1, nR2 ) ) * ( ( nRow2 - nRow1 + 1 ) / ( nYw + 1 ) ) );
22548f4c7c28SSteve Yin                         }
22558f4c7c28SSteve Yin 
22568f4c7c28SSteve Yin                         bNeedPerformanceOptimization4Pattern = false;
22578f4c7c28SSteve Yin                         vvPatternCount.clear();
22588f4c7c28SSteve Yin                     }
22598f4c7c28SSteve Yin 
2260cdf0e10cSrcweir                     nR1 = nR2 + 1;
2261cdf0e10cSrcweir                     nR2 = Min((SCROW)(nR1 + nYw), nRow2);
2262cdf0e10cSrcweir                 } while (nR1 <= nRow2);
2263cdf0e10cSrcweir             }
2264cdf0e10cSrcweir 
2265cdf0e10cSrcweir             ScColumn::bDoubleAlloc = bOldDouble;
2266cdf0e10cSrcweir 
2267cdf0e10cSrcweir             for (SCTAB k = 0; k <= MAXTAB; k++)
2268cdf0e10cSrcweir                 if (pTab[k] && rMark.GetTableSelect(k))
2269cdf0e10cSrcweir                     pTab[k]->DecRecalcLevel();
2270cdf0e10cSrcweir 
2271cdf0e10cSrcweir             bInsertingFromOtherDoc = sal_False;
2272cdf0e10cSrcweir 
2273cdf0e10cSrcweir             UpdateRangeNamesInFormulas(aClipRangeNames, *pDestRanges, rMark, nXw, nYw);
2274cdf0e10cSrcweir 
2275cdf0e10cSrcweir             // Listener aufbauen nachdem alles inserted wurde
2276cdf0e10cSrcweir             StartListeningFromClip( nAllCol1, nAllRow1, nAllCol2, nAllRow2, rMark, nInsFlag );
2277cdf0e10cSrcweir             // nachdem alle Listener aufgebaut wurden, kann gebroadcastet werden
2278cdf0e10cSrcweir             BroadcastFromClip( nAllCol1, nAllRow1, nAllCol2, nAllRow2, rMark, nInsFlag );
2279cdf0e10cSrcweir             if (bResetCut)
2280cdf0e10cSrcweir                 pClipDoc->GetClipParam().mbCutMode = false;
2281cdf0e10cSrcweir             SetAutoCalc( bOldAutoCalc );
2282cdf0e10cSrcweir         }
2283cdf0e10cSrcweir     }
2284cdf0e10cSrcweir }
2285cdf0e10cSrcweir 
lcl_getLastNonFilteredRow(const ScBitMaskCompressedArray<SCROW,sal_uInt8> & rFlags,SCROW nBegRow,SCROW nEndRow,SCROW nRowCount)2286cdf0e10cSrcweir static SCROW lcl_getLastNonFilteredRow(
2287cdf0e10cSrcweir     const ScBitMaskCompressedArray<SCROW, sal_uInt8>& rFlags, SCROW nBegRow, SCROW nEndRow,
2288cdf0e10cSrcweir     SCROW nRowCount)
2289cdf0e10cSrcweir {
2290cdf0e10cSrcweir     SCROW nFilteredRow = rFlags.GetFirstForCondition(
2291cdf0e10cSrcweir         nBegRow, nEndRow, CR_FILTERED, CR_FILTERED);
2292cdf0e10cSrcweir 
2293cdf0e10cSrcweir     SCROW nRow = nFilteredRow - 1;
2294cdf0e10cSrcweir     if (nRow - nBegRow + 1 > nRowCount)
2295cdf0e10cSrcweir         // make sure the row range stays within the data size.
2296cdf0e10cSrcweir         nRow = nBegRow + nRowCount - 1;
2297cdf0e10cSrcweir 
2298cdf0e10cSrcweir     return nRow;
2299cdf0e10cSrcweir }
2300cdf0e10cSrcweir 
CopyMultiRangeFromClip(const ScAddress & rDestPos,const ScMarkData & rMark,sal_uInt16 nInsFlag,ScDocument * pClipDoc,bool bResetCut,bool bAsLink,bool,bool bSkipAttrForEmpty)2301cdf0e10cSrcweir void ScDocument::CopyMultiRangeFromClip(
2302cdf0e10cSrcweir     const ScAddress& rDestPos, const ScMarkData& rMark, sal_uInt16 nInsFlag, ScDocument* pClipDoc,
2303cdf0e10cSrcweir     bool bResetCut, bool bAsLink, bool /*bIncludeFiltered*/, bool bSkipAttrForEmpty)
2304cdf0e10cSrcweir {
2305cdf0e10cSrcweir     if (bIsClip)
2306cdf0e10cSrcweir         return;
2307cdf0e10cSrcweir 
2308cdf0e10cSrcweir     if (!pClipDoc->bIsClip || !pClipDoc->GetTableCount())
2309cdf0e10cSrcweir         // There is nothing in the clip doc to copy.
2310cdf0e10cSrcweir         return;
2311cdf0e10cSrcweir 
2312cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
2313cdf0e10cSrcweir     SetAutoCalc( sal_False ); // avoid multiple recalculations
2314cdf0e10cSrcweir 
2315cdf0e10cSrcweir     NumFmtMergeHandler aNumFmtMergeHdl(this, pClipDoc);
2316cdf0e10cSrcweir 
2317cdf0e10cSrcweir     ScClipRangeNameData aClipRangeNames;
2318cdf0e10cSrcweir     CopyRangeNamesFromClip(pClipDoc, aClipRangeNames);
2319cdf0e10cSrcweir 
2320cdf0e10cSrcweir     SCCOL nCol1 = rDestPos.Col();
2321cdf0e10cSrcweir     SCROW nRow1 = rDestPos.Row();
2322cdf0e10cSrcweir     ScClipParam& rClipParam = pClipDoc->GetClipParam();
2323cdf0e10cSrcweir 
2324cdf0e10cSrcweir     ScCopyBlockFromClipParams aCBFCP;
2325cdf0e10cSrcweir     aCBFCP.pRefUndoDoc = NULL;
2326cdf0e10cSrcweir     aCBFCP.pClipDoc = pClipDoc;
2327cdf0e10cSrcweir     aCBFCP.nInsFlag = nInsFlag;
2328cdf0e10cSrcweir     aCBFCP.bAsLink  = bAsLink;
2329cdf0e10cSrcweir     aCBFCP.bSkipAttrForEmpty = bSkipAttrForEmpty;
2330cdf0e10cSrcweir     aCBFCP.nTabStart = MAXTAB;
2331cdf0e10cSrcweir     aCBFCP.nTabEnd = 0;
2332cdf0e10cSrcweir 
2333cdf0e10cSrcweir     for (SCTAB j = 0; j <= MAXTAB; ++j)
2334cdf0e10cSrcweir     {
2335cdf0e10cSrcweir         if (pTab[j] && rMark.GetTableSelect(j))
2336cdf0e10cSrcweir         {
2337cdf0e10cSrcweir             if ( j < aCBFCP.nTabStart )
2338cdf0e10cSrcweir                 aCBFCP.nTabStart = j;
2339cdf0e10cSrcweir             aCBFCP.nTabEnd = j;
2340cdf0e10cSrcweir             pTab[j]->IncRecalcLevel();
2341cdf0e10cSrcweir         }
2342cdf0e10cSrcweir     }
2343cdf0e10cSrcweir 
2344cdf0e10cSrcweir     ScRange aDestRange;
2345cdf0e10cSrcweir     rMark.GetMarkArea(aDestRange);
2346cdf0e10cSrcweir     SCROW nLastMarkedRow = aDestRange.aEnd.Row();
2347cdf0e10cSrcweir 
2348cdf0e10cSrcweir     bInsertingFromOtherDoc = sal_True; // kein Broadcast/Listener aufbauen bei Insert
2349cdf0e10cSrcweir 
2350cdf0e10cSrcweir     SCROW nBegRow = nRow1;
2351cdf0e10cSrcweir     sal_uInt16 nDelFlag = IDF_CONTENTS;
2352cdf0e10cSrcweir     const ScBitMaskCompressedArray<SCROW, sal_uInt8>& rFlags = GetRowFlagsArray(aCBFCP.nTabStart);
2353cdf0e10cSrcweir 
2354cdf0e10cSrcweir     for (ScRange* p = rClipParam.maRanges.First(); p; p = rClipParam.maRanges.Next())
2355cdf0e10cSrcweir     {
2356cdf0e10cSrcweir         // The begin row must not be filtered.
2357cdf0e10cSrcweir 
2358cdf0e10cSrcweir         SCROW nRowCount = p->aEnd.Row() - p->aStart.Row() + 1;
2359cdf0e10cSrcweir 
2360cdf0e10cSrcweir         SCsCOL nDx = static_cast<SCsCOL>(nCol1 - p->aStart.Col());
2361cdf0e10cSrcweir         SCsROW nDy = static_cast<SCsROW>(nBegRow - p->aStart.Row());
2362cdf0e10cSrcweir         SCCOL nCol2 = nCol1 + p->aEnd.Col() - p->aStart.Col();
2363cdf0e10cSrcweir 
2364cdf0e10cSrcweir         SCROW nEndRow = lcl_getLastNonFilteredRow(rFlags, nBegRow, nLastMarkedRow, nRowCount);
2365cdf0e10cSrcweir 
2366cdf0e10cSrcweir         if (!bSkipAttrForEmpty)
2367cdf0e10cSrcweir             DeleteArea(nCol1, nBegRow, nCol2, nEndRow, rMark, nDelFlag);
2368cdf0e10cSrcweir 
2369cdf0e10cSrcweir         CopyBlockFromClip(nCol1, nBegRow, nCol2, nEndRow, rMark, nDx, nDy, &aCBFCP);
2370cdf0e10cSrcweir         nRowCount -= nEndRow - nBegRow + 1;
2371cdf0e10cSrcweir 
2372cdf0e10cSrcweir         while (nRowCount > 0)
2373cdf0e10cSrcweir         {
2374cdf0e10cSrcweir             // Get the first non-filtered row.
2375cdf0e10cSrcweir             SCROW nNonFilteredRow = rFlags.GetFirstForCondition(nEndRow+1, nLastMarkedRow, CR_FILTERED, 0);
2376cdf0e10cSrcweir             if (nNonFilteredRow > nLastMarkedRow)
2377cdf0e10cSrcweir                 return;
2378cdf0e10cSrcweir 
2379cdf0e10cSrcweir             SCROW nRowsSkipped = nNonFilteredRow - nEndRow - 1;
2380cdf0e10cSrcweir             nDy += nRowsSkipped;
2381cdf0e10cSrcweir 
2382cdf0e10cSrcweir             nBegRow = nNonFilteredRow;
2383cdf0e10cSrcweir             nEndRow = lcl_getLastNonFilteredRow(rFlags, nBegRow, nLastMarkedRow, nRowCount);
2384cdf0e10cSrcweir 
2385cdf0e10cSrcweir             if (!bSkipAttrForEmpty)
2386cdf0e10cSrcweir                 DeleteArea(nCol1, nBegRow, nCol2, nEndRow, rMark, nDelFlag);
2387cdf0e10cSrcweir 
2388cdf0e10cSrcweir             CopyBlockFromClip(nCol1, nBegRow, nCol2, nEndRow, rMark, nDx, nDy, &aCBFCP);
2389cdf0e10cSrcweir             nRowCount -= nEndRow - nBegRow + 1;
2390cdf0e10cSrcweir         }
2391cdf0e10cSrcweir 
2392cdf0e10cSrcweir         if (rClipParam.meDirection == ScClipParam::Row)
2393cdf0e10cSrcweir             // Begin row for the next range being pasted.
2394cdf0e10cSrcweir             nBegRow = rFlags.GetFirstForCondition(nEndRow+1, nLastMarkedRow, CR_FILTERED, 0);
2395cdf0e10cSrcweir         else
2396cdf0e10cSrcweir             nBegRow = nRow1;
2397cdf0e10cSrcweir 
2398cdf0e10cSrcweir         if (rClipParam.meDirection == ScClipParam::Column)
2399cdf0e10cSrcweir             nCol1 += p->aEnd.Col() - p->aStart.Col() + 1;
2400cdf0e10cSrcweir     }
2401cdf0e10cSrcweir 
2402cdf0e10cSrcweir     for (SCTAB i = 0; i <= MAXTAB; i++)
2403cdf0e10cSrcweir         if (pTab[i] && rMark.GetTableSelect(i))
2404cdf0e10cSrcweir             pTab[i]->DecRecalcLevel();
2405cdf0e10cSrcweir 
2406cdf0e10cSrcweir     bInsertingFromOtherDoc = sal_False;
2407cdf0e10cSrcweir 
2408cdf0e10cSrcweir     ScRangeList aRanges;
2409cdf0e10cSrcweir     aRanges.Append(aDestRange);
2410cdf0e10cSrcweir     SCCOL nCols = aDestRange.aEnd.Col() - aDestRange.aStart.Col() + 1;
2411cdf0e10cSrcweir     SCROW nRows = aDestRange.aEnd.Row() - aDestRange.aStart.Row() + 1;
2412cdf0e10cSrcweir     UpdateRangeNamesInFormulas(aClipRangeNames, aRanges, rMark, nCols-1, nRows-1);
2413cdf0e10cSrcweir 
2414cdf0e10cSrcweir     // Listener aufbauen nachdem alles inserted wurde
2415cdf0e10cSrcweir     StartListeningFromClip(aDestRange.aStart.Col(), aDestRange.aStart.Row(),
2416cdf0e10cSrcweir                            aDestRange.aEnd.Col(), aDestRange.aEnd.Row(), rMark, nInsFlag );
2417cdf0e10cSrcweir     // nachdem alle Listener aufgebaut wurden, kann gebroadcastet werden
2418cdf0e10cSrcweir     BroadcastFromClip(aDestRange.aStart.Col(), aDestRange.aStart.Row(),
2419cdf0e10cSrcweir                       aDestRange.aEnd.Col(), aDestRange.aEnd.Row(), rMark, nInsFlag );
2420cdf0e10cSrcweir 
2421cdf0e10cSrcweir     if (bResetCut)
2422cdf0e10cSrcweir         pClipDoc->GetClipParam().mbCutMode = false;
2423cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
2424cdf0e10cSrcweir }
2425cdf0e10cSrcweir 
SetClipArea(const ScRange & rArea,sal_Bool bCut)2426cdf0e10cSrcweir void ScDocument::SetClipArea( const ScRange& rArea, sal_Bool bCut )
2427cdf0e10cSrcweir {
2428cdf0e10cSrcweir     if (bIsClip)
2429cdf0e10cSrcweir     {
2430cdf0e10cSrcweir         ScClipParam& rClipParam = GetClipParam();
2431cdf0e10cSrcweir         rClipParam.maRanges.RemoveAll();
2432cdf0e10cSrcweir         rClipParam.maRanges.Append(rArea);
2433cdf0e10cSrcweir         rClipParam.mbCutMode = bCut;
2434cdf0e10cSrcweir     }
2435cdf0e10cSrcweir     else
2436cdf0e10cSrcweir     {
2437982a05a9Smseidel         DBG_ERROR("SetClipArea: No Clip");
2438cdf0e10cSrcweir     }
2439cdf0e10cSrcweir }
2440cdf0e10cSrcweir 
2441cdf0e10cSrcweir 
GetClipArea(SCCOL & nClipX,SCROW & nClipY,sal_Bool bIncludeFiltered)2442cdf0e10cSrcweir void ScDocument::GetClipArea(SCCOL& nClipX, SCROW& nClipY, sal_Bool bIncludeFiltered)
2443cdf0e10cSrcweir {
2444cdf0e10cSrcweir     if (!bIsClip)
2445cdf0e10cSrcweir     {
2446982a05a9Smseidel         DBG_ERROR("GetClipArea: No Clip");
2447cdf0e10cSrcweir         return;
2448cdf0e10cSrcweir     }
2449cdf0e10cSrcweir 
2450cdf0e10cSrcweir     ScRangeList& rClipRanges = GetClipParam().maRanges;
2451cdf0e10cSrcweir     if (!rClipRanges.Count())
2452cdf0e10cSrcweir         // No clip range. Bail out.
2453cdf0e10cSrcweir         return;
2454cdf0e10cSrcweir 
2455cdf0e10cSrcweir     ScRangePtr p = rClipRanges.First();
2456cdf0e10cSrcweir     SCCOL nStartCol = p->aStart.Col();
2457cdf0e10cSrcweir     SCCOL nEndCol   = p->aEnd.Col();
2458cdf0e10cSrcweir     SCROW nStartRow = p->aStart.Row();
2459cdf0e10cSrcweir     SCROW nEndRow   = p->aEnd.Row();
2460cdf0e10cSrcweir     for (p = rClipRanges.Next(); p; p = rClipRanges.Next())
2461cdf0e10cSrcweir     {
2462cdf0e10cSrcweir         if (p->aStart.Col() < nStartCol)
2463cdf0e10cSrcweir             nStartCol = p->aStart.Col();
2464cdf0e10cSrcweir         if (p->aStart.Row() < nStartRow)
2465cdf0e10cSrcweir             nStartRow = p->aStart.Row();
2466cdf0e10cSrcweir         if (p->aEnd.Col() > nEndCol)
2467cdf0e10cSrcweir             nEndCol = p->aEnd.Col();
2468cdf0e10cSrcweir         if (p->aEnd.Row() < nEndRow)
2469cdf0e10cSrcweir             nEndRow = p->aEnd.Row();
2470cdf0e10cSrcweir     }
2471cdf0e10cSrcweir 
2472cdf0e10cSrcweir     nClipX = nEndCol - nStartCol;
2473cdf0e10cSrcweir 
2474cdf0e10cSrcweir     if ( bIncludeFiltered )
2475cdf0e10cSrcweir         nClipY = nEndRow - nStartRow;
2476cdf0e10cSrcweir     else
2477cdf0e10cSrcweir     {
2478cdf0e10cSrcweir         // count non-filtered rows
2479cdf0e10cSrcweir         // count on first used table in clipboard
2480cdf0e10cSrcweir         SCTAB nCountTab = 0;
2481cdf0e10cSrcweir         while ( nCountTab < MAXTAB && !pTab[nCountTab] )
2482cdf0e10cSrcweir             ++nCountTab;
2483cdf0e10cSrcweir 
2484cdf0e10cSrcweir         SCROW nResult = CountNonFilteredRows(nStartRow, nEndRow, nCountTab);
2485cdf0e10cSrcweir 
2486cdf0e10cSrcweir         if ( nResult > 0 )
2487cdf0e10cSrcweir             nClipY = nResult - 1;
2488cdf0e10cSrcweir         else
2489cdf0e10cSrcweir             nClipY = 0;                 // always return at least 1 row
2490cdf0e10cSrcweir     }
2491cdf0e10cSrcweir }
2492cdf0e10cSrcweir 
2493cdf0e10cSrcweir 
GetClipStart(SCCOL & nClipX,SCROW & nClipY)2494cdf0e10cSrcweir void ScDocument::GetClipStart(SCCOL& nClipX, SCROW& nClipY)
2495cdf0e10cSrcweir {
2496cdf0e10cSrcweir     if (bIsClip)
2497cdf0e10cSrcweir     {
2498cdf0e10cSrcweir         ScRangeList& rClipRanges = GetClipParam().maRanges;
2499cdf0e10cSrcweir         if (rClipRanges.Count())
2500cdf0e10cSrcweir         {
2501cdf0e10cSrcweir             nClipX = rClipRanges.First()->aStart.Col();
2502cdf0e10cSrcweir             nClipY = rClipRanges.First()->aStart.Row();
2503cdf0e10cSrcweir         }
2504cdf0e10cSrcweir     }
2505cdf0e10cSrcweir     else
2506cdf0e10cSrcweir     {
2507982a05a9Smseidel         DBG_ERROR("GetClipStart: No Clip");
2508cdf0e10cSrcweir     }
2509cdf0e10cSrcweir }
2510cdf0e10cSrcweir 
2511cdf0e10cSrcweir 
HasClipFilteredRows()2512cdf0e10cSrcweir sal_Bool ScDocument::HasClipFilteredRows()
2513cdf0e10cSrcweir {
2514cdf0e10cSrcweir     // count on first used table in clipboard
2515cdf0e10cSrcweir     SCTAB nCountTab = 0;
2516cdf0e10cSrcweir     while ( nCountTab < MAXTAB && !pTab[nCountTab] )
2517cdf0e10cSrcweir         ++nCountTab;
2518cdf0e10cSrcweir 
2519cdf0e10cSrcweir     ScRangeList& rClipRanges = GetClipParam().maRanges;
2520cdf0e10cSrcweir     if (!rClipRanges.Count())
2521cdf0e10cSrcweir         return false;
2522cdf0e10cSrcweir 
2523cdf0e10cSrcweir     for (ScRange* p = rClipRanges.First(); p; p = rClipRanges.Next())
2524cdf0e10cSrcweir     {
2525cdf0e10cSrcweir         bool bAnswer = pTab[nCountTab]->HasFilteredRows(p->aStart.Row(), p->aEnd.Row());
2526cdf0e10cSrcweir         if (bAnswer)
2527cdf0e10cSrcweir             return true;
2528cdf0e10cSrcweir     }
2529cdf0e10cSrcweir     return false;
2530cdf0e10cSrcweir }
2531cdf0e10cSrcweir 
2532cdf0e10cSrcweir 
MixDocument(const ScRange & rRange,sal_uInt16 nFunction,sal_Bool bSkipEmpty,ScDocument * pSrcDoc)2533cdf0e10cSrcweir void ScDocument::MixDocument( const ScRange& rRange, sal_uInt16 nFunction, sal_Bool bSkipEmpty,
2534cdf0e10cSrcweir                                     ScDocument* pSrcDoc )
2535cdf0e10cSrcweir {
2536cdf0e10cSrcweir     SCTAB nTab1 = rRange.aStart.Tab();
2537cdf0e10cSrcweir     SCTAB nTab2 = rRange.aEnd.Tab();
2538cdf0e10cSrcweir     for (SCTAB i = nTab1; i <= nTab2; i++)
2539cdf0e10cSrcweir         if (pTab[i] && pSrcDoc->pTab[i])
2540cdf0e10cSrcweir             pTab[i]->MixData( rRange.aStart.Col(), rRange.aStart.Row(),
2541cdf0e10cSrcweir                                 rRange.aEnd.Col(), rRange.aEnd.Row(),
2542cdf0e10cSrcweir                                 nFunction, bSkipEmpty, pSrcDoc->pTab[i] );
2543cdf0e10cSrcweir }
2544cdf0e10cSrcweir 
2545cdf0e10cSrcweir 
FillTab(const ScRange & rSrcArea,const ScMarkData & rMark,sal_uInt16 nFlags,sal_uInt16 nFunction,sal_Bool bSkipEmpty,sal_Bool bAsLink)2546cdf0e10cSrcweir void ScDocument::FillTab( const ScRange& rSrcArea, const ScMarkData& rMark,
2547cdf0e10cSrcweir                                 sal_uInt16 nFlags, sal_uInt16 nFunction,
2548cdf0e10cSrcweir                                 sal_Bool bSkipEmpty, sal_Bool bAsLink )
2549cdf0e10cSrcweir {
2550cdf0e10cSrcweir     sal_uInt16 nDelFlags = nFlags;
2551cdf0e10cSrcweir     if (nDelFlags & IDF_CONTENTS)
2552982a05a9Smseidel         nDelFlags |= IDF_CONTENTS; // immer alle Inhalte oder keine löschen!
2553cdf0e10cSrcweir 
2554cdf0e10cSrcweir     SCTAB nSrcTab = rSrcArea.aStart.Tab();
2555cdf0e10cSrcweir 
2556cdf0e10cSrcweir     if (ValidTab(nSrcTab)  && pTab[nSrcTab])
2557cdf0e10cSrcweir     {
2558cdf0e10cSrcweir         SCCOL nStartCol = rSrcArea.aStart.Col();
2559cdf0e10cSrcweir         SCROW nStartRow = rSrcArea.aStart.Row();
2560cdf0e10cSrcweir         SCCOL nEndCol = rSrcArea.aEnd.Col();
2561cdf0e10cSrcweir         SCROW nEndRow = rSrcArea.aEnd.Row();
2562cdf0e10cSrcweir         ScDocument* pMixDoc = NULL;
2563cdf0e10cSrcweir         sal_Bool bDoMix = ( bSkipEmpty || nFunction ) && ( nFlags & IDF_CONTENTS );
2564cdf0e10cSrcweir 
2565cdf0e10cSrcweir         sal_Bool bOldAutoCalc = GetAutoCalc();
2566982a05a9Smseidel         SetAutoCalc( sal_False ); // avoid multiple recalculations
2567cdf0e10cSrcweir 
2568cdf0e10cSrcweir         SCTAB nCount = GetTableCount();
2569cdf0e10cSrcweir         for (SCTAB i=0; i<nCount; i++)
2570cdf0e10cSrcweir             if ( i!=nSrcTab && pTab[i] && rMark.GetTableSelect(i) )
2571cdf0e10cSrcweir             {
2572cdf0e10cSrcweir                 if (bDoMix)
2573cdf0e10cSrcweir                 {
2574cdf0e10cSrcweir                     if (!pMixDoc)
2575cdf0e10cSrcweir                     {
2576cdf0e10cSrcweir                         pMixDoc = new ScDocument( SCDOCMODE_UNDO );
2577cdf0e10cSrcweir                         pMixDoc->InitUndo( this, i, i );
2578cdf0e10cSrcweir                     }
2579cdf0e10cSrcweir                     else
2580cdf0e10cSrcweir                         pMixDoc->AddUndoTab( i, i );
2581cdf0e10cSrcweir                     pTab[i]->CopyToTable( nStartCol,nStartRow, nEndCol,nEndRow,
2582cdf0e10cSrcweir                                             IDF_CONTENTS, sal_False, pMixDoc->pTab[i] );
2583cdf0e10cSrcweir                 }
2584cdf0e10cSrcweir                 pTab[i]->DeleteArea( nStartCol,nStartRow, nEndCol,nEndRow, nDelFlags);
2585cdf0e10cSrcweir                 pTab[nSrcTab]->CopyToTable( nStartCol,nStartRow, nEndCol,nEndRow,
2586cdf0e10cSrcweir                                                  nFlags, sal_False, pTab[i], NULL, bAsLink );
2587cdf0e10cSrcweir 
2588cdf0e10cSrcweir                 if (bDoMix)
2589cdf0e10cSrcweir                     pTab[i]->MixData( nStartCol,nStartRow, nEndCol,nEndRow,
2590cdf0e10cSrcweir                                         nFunction, bSkipEmpty, pMixDoc->pTab[i] );
2591cdf0e10cSrcweir             }
2592cdf0e10cSrcweir 
2593cdf0e10cSrcweir         delete pMixDoc;
2594cdf0e10cSrcweir 
2595cdf0e10cSrcweir         SetAutoCalc( bOldAutoCalc );
2596cdf0e10cSrcweir     }
2597cdf0e10cSrcweir     else
2598cdf0e10cSrcweir     {
2599982a05a9Smseidel         DBG_ERROR("Wrong table");
2600cdf0e10cSrcweir     }
2601cdf0e10cSrcweir }
2602cdf0e10cSrcweir 
2603cdf0e10cSrcweir 
FillTabMarked(SCTAB nSrcTab,const ScMarkData & rMark,sal_uInt16 nFlags,sal_uInt16 nFunction,sal_Bool bSkipEmpty,sal_Bool bAsLink)2604cdf0e10cSrcweir void ScDocument::FillTabMarked( SCTAB nSrcTab, const ScMarkData& rMark,
2605cdf0e10cSrcweir                                 sal_uInt16 nFlags, sal_uInt16 nFunction,
2606cdf0e10cSrcweir                                 sal_Bool bSkipEmpty, sal_Bool bAsLink )
2607cdf0e10cSrcweir {
2608cdf0e10cSrcweir     sal_uInt16 nDelFlags = nFlags;
2609cdf0e10cSrcweir     if (nDelFlags & IDF_CONTENTS)
2610982a05a9Smseidel         nDelFlags |= IDF_CONTENTS; // immer alle Inhalte oder keine löschen!
2611cdf0e10cSrcweir 
2612cdf0e10cSrcweir     if (ValidTab(nSrcTab)  && pTab[nSrcTab])
2613cdf0e10cSrcweir     {
2614cdf0e10cSrcweir         ScDocument* pMixDoc = NULL;
2615cdf0e10cSrcweir         sal_Bool bDoMix = ( bSkipEmpty || nFunction ) && ( nFlags & IDF_CONTENTS );
2616cdf0e10cSrcweir 
2617cdf0e10cSrcweir         sal_Bool bOldAutoCalc = GetAutoCalc();
2618982a05a9Smseidel         SetAutoCalc( sal_False ); // avoid multiple recalculations
2619cdf0e10cSrcweir 
2620cdf0e10cSrcweir         ScRange aArea;
2621cdf0e10cSrcweir         rMark.GetMultiMarkArea( aArea );
2622cdf0e10cSrcweir         SCCOL nStartCol = aArea.aStart.Col();
2623cdf0e10cSrcweir         SCROW nStartRow = aArea.aStart.Row();
2624cdf0e10cSrcweir         SCCOL nEndCol = aArea.aEnd.Col();
2625cdf0e10cSrcweir         SCROW nEndRow = aArea.aEnd.Row();
2626cdf0e10cSrcweir 
2627cdf0e10cSrcweir         SCTAB nCount = GetTableCount();
2628cdf0e10cSrcweir         for (SCTAB i=0; i<nCount; i++)
2629cdf0e10cSrcweir             if ( i!=nSrcTab && pTab[i] && rMark.GetTableSelect(i) )
2630cdf0e10cSrcweir             {
2631cdf0e10cSrcweir                 if (bDoMix)
2632cdf0e10cSrcweir                 {
2633cdf0e10cSrcweir                     if (!pMixDoc)
2634cdf0e10cSrcweir                     {
2635cdf0e10cSrcweir                         pMixDoc = new ScDocument( SCDOCMODE_UNDO );
2636cdf0e10cSrcweir                         pMixDoc->InitUndo( this, i, i );
2637cdf0e10cSrcweir                     }
2638cdf0e10cSrcweir                     else
2639cdf0e10cSrcweir                         pMixDoc->AddUndoTab( i, i );
2640cdf0e10cSrcweir                     pTab[i]->CopyToTable( nStartCol,nStartRow, nEndCol,nEndRow,
2641cdf0e10cSrcweir                                             IDF_CONTENTS, sal_True, pMixDoc->pTab[i], &rMark );
2642cdf0e10cSrcweir                 }
2643cdf0e10cSrcweir 
2644cdf0e10cSrcweir                 pTab[i]->DeleteSelection( nDelFlags, rMark );
2645cdf0e10cSrcweir                 pTab[nSrcTab]->CopyToTable( nStartCol,nStartRow, nEndCol,nEndRow,
2646cdf0e10cSrcweir                                              nFlags, sal_True, pTab[i], &rMark, bAsLink );
2647cdf0e10cSrcweir 
2648cdf0e10cSrcweir                 if (bDoMix)
2649cdf0e10cSrcweir                     pTab[i]->MixMarked( rMark, nFunction, bSkipEmpty, pMixDoc->pTab[i] );
2650cdf0e10cSrcweir             }
2651cdf0e10cSrcweir 
2652cdf0e10cSrcweir         delete pMixDoc;
2653cdf0e10cSrcweir 
2654cdf0e10cSrcweir         SetAutoCalc( bOldAutoCalc );
2655cdf0e10cSrcweir     }
2656cdf0e10cSrcweir     else
2657cdf0e10cSrcweir     {
2658982a05a9Smseidel         DBG_ERROR("Wrong table");
2659cdf0e10cSrcweir     }
2660cdf0e10cSrcweir }
2661cdf0e10cSrcweir 
2662cdf0e10cSrcweir 
PutCell(SCCOL nCol,SCROW nRow,SCTAB nTab,ScBaseCell * pCell,sal_Bool bForceTab)2663cdf0e10cSrcweir void ScDocument::PutCell( SCCOL nCol, SCROW nRow, SCTAB nTab, ScBaseCell* pCell, sal_Bool bForceTab )
2664cdf0e10cSrcweir {
2665cdf0e10cSrcweir     if (VALIDTAB(nTab))
2666cdf0e10cSrcweir     {
2667cdf0e10cSrcweir         if ( bForceTab && !pTab[nTab] )
2668cdf0e10cSrcweir         {
2669982a05a9Smseidel             sal_Bool bExtras = !bIsUndo; // Spaltenbreiten, Zeilenhöhen, Flags
2670cdf0e10cSrcweir 
2671cdf0e10cSrcweir             pTab[nTab] = new ScTable(this, nTab,
2672cdf0e10cSrcweir                             String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("temp")),
2673cdf0e10cSrcweir                             bExtras, bExtras);
2674cdf0e10cSrcweir             ++nMaxTableNumber;
2675cdf0e10cSrcweir         }
2676cdf0e10cSrcweir 
2677cdf0e10cSrcweir         if (pTab[nTab])
2678cdf0e10cSrcweir             pTab[nTab]->PutCell( nCol, nRow, pCell );
2679cdf0e10cSrcweir     }
2680cdf0e10cSrcweir }
2681cdf0e10cSrcweir 
2682cdf0e10cSrcweir 
PutCell(const ScAddress & rPos,ScBaseCell * pCell,sal_Bool bForceTab)2683cdf0e10cSrcweir void ScDocument::PutCell( const ScAddress& rPos, ScBaseCell* pCell, sal_Bool bForceTab )
2684cdf0e10cSrcweir {
2685cdf0e10cSrcweir     SCTAB nTab = rPos.Tab();
2686cdf0e10cSrcweir     if ( bForceTab && !pTab[nTab] )
2687cdf0e10cSrcweir     {
2688982a05a9Smseidel         sal_Bool bExtras = !bIsUndo; // Spaltenbreiten, Zeilenhöhen, Flags
2689cdf0e10cSrcweir 
2690cdf0e10cSrcweir         pTab[nTab] = new ScTable(this, nTab,
2691cdf0e10cSrcweir                         String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("temp")),
2692cdf0e10cSrcweir                         bExtras, bExtras);
2693cdf0e10cSrcweir         ++nMaxTableNumber;
2694cdf0e10cSrcweir     }
2695cdf0e10cSrcweir 
2696cdf0e10cSrcweir     if (pTab[nTab])
2697cdf0e10cSrcweir         pTab[nTab]->PutCell( rPos, pCell );
2698cdf0e10cSrcweir }
2699cdf0e10cSrcweir 
2700cdf0e10cSrcweir 
SetString(SCCOL nCol,SCROW nRow,SCTAB nTab,const String & rString,SvNumberFormatter * pFormatter,bool bDetectNumberFormat)2701cdf0e10cSrcweir sal_Bool ScDocument::SetString( SCCOL nCol, SCROW nRow, SCTAB nTab, const String& rString,
2702cdf0e10cSrcweir                             SvNumberFormatter* pFormatter, bool bDetectNumberFormat )
2703cdf0e10cSrcweir {
2704cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
2705cdf0e10cSrcweir         return pTab[nTab]->SetString( nCol, nRow, nTab, rString, pFormatter, bDetectNumberFormat );
2706cdf0e10cSrcweir     else
2707cdf0e10cSrcweir         return sal_False;
2708cdf0e10cSrcweir }
2709cdf0e10cSrcweir 
2710cdf0e10cSrcweir 
SetValue(SCCOL nCol,SCROW nRow,SCTAB nTab,const double & rVal)2711cdf0e10cSrcweir void ScDocument::SetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, const double& rVal )
2712cdf0e10cSrcweir {
2713cdf0e10cSrcweir     if (VALIDTAB(nTab))
2714cdf0e10cSrcweir         if (pTab[nTab])
2715cdf0e10cSrcweir             pTab[nTab]->SetValue( nCol, nRow, rVal );
2716cdf0e10cSrcweir }
2717cdf0e10cSrcweir 
2718cdf0e10cSrcweir 
GetString(SCCOL nCol,SCROW nRow,SCTAB nTab,String & rString)2719cdf0e10cSrcweir void ScDocument::GetString( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rString )
2720cdf0e10cSrcweir {
2721cdf0e10cSrcweir     if ( VALIDTAB(nTab) && pTab[nTab] )
2722cdf0e10cSrcweir         pTab[nTab]->GetString( nCol, nRow, rString );
2723cdf0e10cSrcweir     else
2724cdf0e10cSrcweir         rString.Erase();
2725cdf0e10cSrcweir }
2726cdf0e10cSrcweir 
FillDPCache(ScDPTableDataCache * pCache,SCTAB nTab,SCCOL nStartCol,SCCOL nEndCol,SCROW nStartRow,SCROW nEndRow)2727b4df81e3SWang Lei void ScDocument::FillDPCache( ScDPTableDataCache * pCache, SCTAB nTab, SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCROW nEndRow )
2728b4df81e3SWang Lei {
2729b4df81e3SWang Lei     if ( VALIDTAB(nTab) && pTab[nTab] )
2730b4df81e3SWang Lei         pTab[nTab]->FillDPCache( pCache, nStartCol, nEndCol, nStartRow, nEndRow );
2731b4df81e3SWang Lei }
2732cdf0e10cSrcweir 
GetInputString(SCCOL nCol,SCROW nRow,SCTAB nTab,String & rString)2733cdf0e10cSrcweir void ScDocument::GetInputString( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rString )
2734cdf0e10cSrcweir {
2735cdf0e10cSrcweir     if ( VALIDTAB(nTab) && pTab[nTab] )
2736cdf0e10cSrcweir         pTab[nTab]->GetInputString( nCol, nRow, rString );
2737cdf0e10cSrcweir     else
2738cdf0e10cSrcweir         rString.Erase();
2739cdf0e10cSrcweir }
2740cdf0e10cSrcweir 
2741cdf0e10cSrcweir 
GetStringForFormula(const ScAddress & rPos,rtl::OUString & rString)2742cdf0e10cSrcweir sal_uInt16 ScDocument::GetStringForFormula( const ScAddress& rPos, rtl::OUString& rString )
2743cdf0e10cSrcweir {
2744cdf0e10cSrcweir     // Used in formulas (add-in parameters etc), so it must use the same semantics as
2745cdf0e10cSrcweir     // ScInterpreter::GetCellString: always format values as numbers.
2746cdf0e10cSrcweir     // The return value is the error code.
2747cdf0e10cSrcweir 
2748cdf0e10cSrcweir     sal_uInt16 nErr = 0;
2749cdf0e10cSrcweir     String aStr;
2750cdf0e10cSrcweir     ScBaseCell* pCell = GetCell( rPos );
2751cdf0e10cSrcweir     if (pCell)
2752cdf0e10cSrcweir     {
2753cdf0e10cSrcweir         SvNumberFormatter* pFormatter = GetFormatTable();
2754cdf0e10cSrcweir         switch (pCell->GetCellType())
2755cdf0e10cSrcweir         {
2756cdf0e10cSrcweir             case CELLTYPE_STRING:
2757cdf0e10cSrcweir                 static_cast<ScStringCell*>(pCell)->GetString(aStr);
2758cdf0e10cSrcweir             break;
2759cdf0e10cSrcweir             case CELLTYPE_EDIT:
2760cdf0e10cSrcweir                 static_cast<ScEditCell*>(pCell)->GetString(aStr);
2761cdf0e10cSrcweir             break;
2762cdf0e10cSrcweir             case CELLTYPE_FORMULA:
2763cdf0e10cSrcweir             {
2764cdf0e10cSrcweir                 ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pCell);
2765cdf0e10cSrcweir                 nErr = pFCell->GetErrCode();
2766cdf0e10cSrcweir                 if (pFCell->IsValue())
2767cdf0e10cSrcweir                 {
2768cdf0e10cSrcweir                     double fVal = pFCell->GetValue();
2769cdf0e10cSrcweir                     sal_uInt32 nIndex = pFormatter->GetStandardFormat(
2770cdf0e10cSrcweir                                         NUMBERFORMAT_NUMBER,
2771cdf0e10cSrcweir                                         ScGlobal::eLnge);
2772cdf0e10cSrcweir                     pFormatter->GetInputLineString(fVal, nIndex, aStr);
2773cdf0e10cSrcweir                 }
2774cdf0e10cSrcweir                 else
2775cdf0e10cSrcweir                     pFCell->GetString(aStr);
2776cdf0e10cSrcweir             }
2777cdf0e10cSrcweir             break;
2778cdf0e10cSrcweir             case CELLTYPE_VALUE:
2779cdf0e10cSrcweir             {
2780cdf0e10cSrcweir                 double fVal = static_cast<ScValueCell*>(pCell)->GetValue();
2781cdf0e10cSrcweir                 sal_uInt32 nIndex = pFormatter->GetStandardFormat(
2782cdf0e10cSrcweir                                         NUMBERFORMAT_NUMBER,
2783cdf0e10cSrcweir                                         ScGlobal::eLnge);
2784cdf0e10cSrcweir                 pFormatter->GetInputLineString(fVal, nIndex, aStr);
2785cdf0e10cSrcweir             }
2786cdf0e10cSrcweir             break;
2787cdf0e10cSrcweir             default:
2788cdf0e10cSrcweir                 ;
2789cdf0e10cSrcweir         }
2790cdf0e10cSrcweir     }
2791cdf0e10cSrcweir     rString = aStr;
2792cdf0e10cSrcweir     return nErr;
2793cdf0e10cSrcweir }
2794cdf0e10cSrcweir 
2795cdf0e10cSrcweir 
GetValue(SCCOL nCol,SCROW nRow,SCTAB nTab,double & rValue)2796cdf0e10cSrcweir void ScDocument::GetValue( SCCOL nCol, SCROW nRow, SCTAB nTab, double& rValue )
2797cdf0e10cSrcweir {
2798cdf0e10cSrcweir     if ( VALIDTAB(nTab) && pTab[nTab] )
2799cdf0e10cSrcweir         rValue = pTab[nTab]->GetValue( nCol, nRow );
2800cdf0e10cSrcweir     else
2801cdf0e10cSrcweir         rValue = 0.0;
2802cdf0e10cSrcweir }
2803cdf0e10cSrcweir 
2804cdf0e10cSrcweir 
GetValue(const ScAddress & rPos)2805cdf0e10cSrcweir double ScDocument::GetValue( const ScAddress& rPos )
2806cdf0e10cSrcweir {
2807cdf0e10cSrcweir     SCTAB nTab = rPos.Tab();
2808cdf0e10cSrcweir     if ( pTab[nTab] )
2809cdf0e10cSrcweir         return pTab[nTab]->GetValue( rPos );
2810cdf0e10cSrcweir     return 0.0;
2811cdf0e10cSrcweir }
2812cdf0e10cSrcweir 
2813cdf0e10cSrcweir 
GetNumberFormat(SCCOL nCol,SCROW nRow,SCTAB nTab,sal_uInt32 & rFormat)2814cdf0e10cSrcweir void ScDocument::GetNumberFormat( SCCOL nCol, SCROW nRow, SCTAB nTab,
2815cdf0e10cSrcweir                                   sal_uInt32& rFormat )
2816cdf0e10cSrcweir {
2817cdf0e10cSrcweir     if (VALIDTAB(nTab))
2818cdf0e10cSrcweir         if (pTab[nTab])
2819cdf0e10cSrcweir         {
2820cdf0e10cSrcweir             rFormat = pTab[nTab]->GetNumberFormat( nCol, nRow );
2821cdf0e10cSrcweir             return ;
2822cdf0e10cSrcweir         }
2823cdf0e10cSrcweir     rFormat = 0;
2824cdf0e10cSrcweir }
2825cdf0e10cSrcweir 
2826cdf0e10cSrcweir 
GetNumberFormat(const ScAddress & rPos) const2827cdf0e10cSrcweir sal_uInt32 ScDocument::GetNumberFormat( const ScAddress& rPos ) const
2828cdf0e10cSrcweir {
2829cdf0e10cSrcweir     SCTAB nTab = rPos.Tab();
2830cdf0e10cSrcweir     if ( pTab[nTab] )
2831cdf0e10cSrcweir         return pTab[nTab]->GetNumberFormat( rPos );
2832cdf0e10cSrcweir     return 0;
2833cdf0e10cSrcweir }
2834cdf0e10cSrcweir 
2835cdf0e10cSrcweir 
GetNumberFormatInfo(short & nType,sal_uLong & nIndex,const ScAddress & rPos,const ScBaseCell * pCell) const2836cdf0e10cSrcweir void ScDocument::GetNumberFormatInfo( short& nType, sal_uLong& nIndex,
2837cdf0e10cSrcweir             const ScAddress& rPos, const ScBaseCell* pCell ) const
2838cdf0e10cSrcweir {
2839cdf0e10cSrcweir     SCTAB nTab = rPos.Tab();
2840cdf0e10cSrcweir     if ( pTab[nTab] )
2841cdf0e10cSrcweir     {
2842cdf0e10cSrcweir         nIndex = pTab[nTab]->GetNumberFormat( rPos );
2843cdf0e10cSrcweir         if ( (nIndex % SV_COUNTRY_LANGUAGE_OFFSET) == 0 && pCell &&
2844cdf0e10cSrcweir                 pCell->GetCellType() == CELLTYPE_FORMULA )
2845cdf0e10cSrcweir             static_cast<const ScFormulaCell*>(pCell)->GetFormatInfo( nType, nIndex );
2846cdf0e10cSrcweir         else
2847cdf0e10cSrcweir             nType = GetFormatTable()->GetType( nIndex );
2848cdf0e10cSrcweir     }
2849cdf0e10cSrcweir     else
2850cdf0e10cSrcweir     {
2851cdf0e10cSrcweir         nType = NUMBERFORMAT_UNDEFINED;
2852cdf0e10cSrcweir         nIndex = 0;
2853cdf0e10cSrcweir     }
2854cdf0e10cSrcweir }
2855cdf0e10cSrcweir 
2856cdf0e10cSrcweir 
GetFormula(SCCOL nCol,SCROW nRow,SCTAB nTab,String & rFormula,sal_Bool bAsciiExport) const2857cdf0e10cSrcweir void ScDocument::GetFormula( SCCOL nCol, SCROW nRow, SCTAB nTab, String& rFormula,
2858cdf0e10cSrcweir                              sal_Bool bAsciiExport ) const
2859cdf0e10cSrcweir {
2860cdf0e10cSrcweir     if ( VALIDTAB(nTab) && pTab[nTab] )
2861cdf0e10cSrcweir             pTab[nTab]->GetFormula( nCol, nRow, rFormula, bAsciiExport );
2862cdf0e10cSrcweir     else
2863cdf0e10cSrcweir         rFormula.Erase();
2864cdf0e10cSrcweir }
2865cdf0e10cSrcweir 
2866cdf0e10cSrcweir 
GetCellType(const ScAddress & rPos) const2867cdf0e10cSrcweir CellType ScDocument::GetCellType( const ScAddress& rPos ) const
2868cdf0e10cSrcweir {
2869cdf0e10cSrcweir     SCTAB nTab = rPos.Tab();
2870cdf0e10cSrcweir     if ( pTab[nTab] )
2871cdf0e10cSrcweir         return pTab[nTab]->GetCellType( rPos );
2872cdf0e10cSrcweir     return CELLTYPE_NONE;
2873cdf0e10cSrcweir }
2874cdf0e10cSrcweir 
2875cdf0e10cSrcweir 
GetCellType(SCCOL nCol,SCROW nRow,SCTAB nTab,CellType & rCellType) const2876cdf0e10cSrcweir void ScDocument::GetCellType( SCCOL nCol, SCROW nRow, SCTAB nTab,
2877cdf0e10cSrcweir         CellType& rCellType ) const
2878cdf0e10cSrcweir {
2879cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
2880cdf0e10cSrcweir         rCellType = pTab[nTab]->GetCellType( nCol, nRow );
2881cdf0e10cSrcweir     else
2882cdf0e10cSrcweir         rCellType = CELLTYPE_NONE;
2883cdf0e10cSrcweir }
2884cdf0e10cSrcweir 
2885cdf0e10cSrcweir 
GetCell(SCCOL nCol,SCROW nRow,SCTAB nTab,ScBaseCell * & rpCell) const2886cdf0e10cSrcweir void ScDocument::GetCell( SCCOL nCol, SCROW nRow, SCTAB nTab,
2887cdf0e10cSrcweir         ScBaseCell*& rpCell ) const
2888cdf0e10cSrcweir {
2889cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
2890cdf0e10cSrcweir         rpCell = pTab[nTab]->GetCell( nCol, nRow );
2891cdf0e10cSrcweir     else
2892cdf0e10cSrcweir     {
2893cdf0e10cSrcweir         DBG_ERROR("GetCell ohne Tabelle");
2894cdf0e10cSrcweir         rpCell = NULL;
2895cdf0e10cSrcweir     }
2896cdf0e10cSrcweir }
2897cdf0e10cSrcweir 
2898cdf0e10cSrcweir 
GetCell(const ScAddress & rPos) const2899cdf0e10cSrcweir ScBaseCell* ScDocument::GetCell( const ScAddress& rPos ) const
2900cdf0e10cSrcweir {
2901cdf0e10cSrcweir     SCTAB nTab = rPos.Tab();
2902cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
2903cdf0e10cSrcweir         return pTab[nTab]->GetCell( rPos );
2904cdf0e10cSrcweir 
2905cdf0e10cSrcweir     DBG_ERROR("GetCell ohne Tabelle");
2906cdf0e10cSrcweir     return NULL;
2907cdf0e10cSrcweir }
2908cdf0e10cSrcweir 
2909cdf0e10cSrcweir 
HasStringData(SCCOL nCol,SCROW nRow,SCTAB nTab) const2910cdf0e10cSrcweir sal_Bool ScDocument::HasStringData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const
2911cdf0e10cSrcweir {
2912cdf0e10cSrcweir     if ( VALIDTAB(nTab) && pTab[nTab] )
2913cdf0e10cSrcweir             return pTab[nTab]->HasStringData( nCol, nRow );
2914cdf0e10cSrcweir     else
2915cdf0e10cSrcweir         return sal_False;
2916cdf0e10cSrcweir }
2917cdf0e10cSrcweir 
2918cdf0e10cSrcweir 
HasValueData(SCCOL nCol,SCROW nRow,SCTAB nTab) const2919cdf0e10cSrcweir sal_Bool ScDocument::HasValueData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const
2920cdf0e10cSrcweir {
2921cdf0e10cSrcweir     if ( VALIDTAB(nTab) && pTab[nTab] )
2922cdf0e10cSrcweir             return pTab[nTab]->HasValueData( nCol, nRow );
2923cdf0e10cSrcweir     else
2924cdf0e10cSrcweir         return sal_False;
2925cdf0e10cSrcweir }
2926cdf0e10cSrcweir 
2927cdf0e10cSrcweir 
HasStringCells(const ScRange & rRange) const2928cdf0e10cSrcweir sal_Bool ScDocument::HasStringCells( const ScRange& rRange ) const
2929cdf0e10cSrcweir {
2930cdf0e10cSrcweir     // sal_True, wenn String- oder Editzellen im Bereich
2931cdf0e10cSrcweir 
2932cdf0e10cSrcweir     SCCOL nStartCol = rRange.aStart.Col();
2933cdf0e10cSrcweir     SCROW nStartRow = rRange.aStart.Row();
2934cdf0e10cSrcweir     SCTAB nStartTab = rRange.aStart.Tab();
2935cdf0e10cSrcweir     SCCOL nEndCol = rRange.aEnd.Col();
2936cdf0e10cSrcweir     SCROW nEndRow = rRange.aEnd.Row();
2937cdf0e10cSrcweir     SCTAB nEndTab = rRange.aEnd.Tab();
2938cdf0e10cSrcweir 
2939cdf0e10cSrcweir     for ( SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++ )
2940cdf0e10cSrcweir         if ( pTab[nTab] && pTab[nTab]->HasStringCells( nStartCol, nStartRow, nEndCol, nEndRow ) )
2941cdf0e10cSrcweir             return sal_True;
2942cdf0e10cSrcweir 
2943cdf0e10cSrcweir     return sal_False;
2944cdf0e10cSrcweir }
2945cdf0e10cSrcweir 
2946cdf0e10cSrcweir 
HasSelectionData(SCCOL nCol,SCROW nRow,SCTAB nTab) const2947cdf0e10cSrcweir sal_Bool ScDocument::HasSelectionData( SCCOL nCol, SCROW nRow, SCTAB nTab ) const
2948cdf0e10cSrcweir {
2949cdf0e10cSrcweir     sal_uInt32 nValidation = static_cast< const SfxUInt32Item* >( GetAttr( nCol, nRow, nTab, ATTR_VALIDDATA ) )->GetValue();
2950cdf0e10cSrcweir     if( nValidation )
2951cdf0e10cSrcweir     {
2952cdf0e10cSrcweir         const ScValidationData* pData = GetValidationEntry( nValidation );
2953cdf0e10cSrcweir         if( pData && pData->HasSelectionList() )
2954cdf0e10cSrcweir             return sal_True;
2955cdf0e10cSrcweir     }
2956cdf0e10cSrcweir     return HasStringCells( ScRange( nCol, 0, nTab, nCol, MAXROW, nTab ) );
2957cdf0e10cSrcweir }
2958cdf0e10cSrcweir 
2959cdf0e10cSrcweir 
GetNote(const ScAddress & rPos)2960cdf0e10cSrcweir ScPostIt* ScDocument::GetNote( const ScAddress& rPos )
2961cdf0e10cSrcweir {
2962cdf0e10cSrcweir     ScTable* pTable = ValidTab( rPos.Tab() ) ? pTab[ rPos.Tab() ] : 0;
2963cdf0e10cSrcweir     return pTable ? pTable->GetNote( rPos.Col(), rPos.Row() ) : 0;
2964cdf0e10cSrcweir }
2965cdf0e10cSrcweir 
2966cdf0e10cSrcweir 
TakeNote(const ScAddress & rPos,ScPostIt * & rpNote)2967cdf0e10cSrcweir void ScDocument::TakeNote( const ScAddress& rPos, ScPostIt*& rpNote )
2968cdf0e10cSrcweir {
2969cdf0e10cSrcweir     if( ValidTab( rPos.Tab() ) && pTab[ rPos.Tab() ] )
2970cdf0e10cSrcweir         pTab[ rPos.Tab() ]->TakeNote( rPos.Col(), rPos.Row(), rpNote );
2971cdf0e10cSrcweir     else
2972cdf0e10cSrcweir         DELETEZ( rpNote );
2973cdf0e10cSrcweir }
2974cdf0e10cSrcweir 
2975cdf0e10cSrcweir 
ReleaseNote(const ScAddress & rPos)2976cdf0e10cSrcweir ScPostIt* ScDocument::ReleaseNote( const ScAddress& rPos )
2977cdf0e10cSrcweir {
2978cdf0e10cSrcweir     ScTable* pTable = ValidTab( rPos.Tab() ) ? pTab[ rPos.Tab() ] : 0;
2979cdf0e10cSrcweir     return pTable ? pTable->ReleaseNote( rPos.Col(), rPos.Row() ) : 0;
2980cdf0e10cSrcweir }
2981cdf0e10cSrcweir 
2982cdf0e10cSrcweir 
GetOrCreateNote(const ScAddress & rPos)2983cdf0e10cSrcweir ScPostIt* ScDocument::GetOrCreateNote( const ScAddress& rPos )
2984cdf0e10cSrcweir {
2985cdf0e10cSrcweir     ScPostIt* pNote = GetNote( rPos );
2986cdf0e10cSrcweir     if( !pNote )
2987cdf0e10cSrcweir     {
2988cdf0e10cSrcweir         pNote = new ScPostIt( *this, rPos, false );
2989cdf0e10cSrcweir         TakeNote( rPos, pNote );
2990cdf0e10cSrcweir     }
2991cdf0e10cSrcweir     return pNote;
2992cdf0e10cSrcweir }
2993cdf0e10cSrcweir 
2994cdf0e10cSrcweir 
DeleteNote(const ScAddress & rPos)2995cdf0e10cSrcweir void ScDocument::DeleteNote( const ScAddress& rPos )
2996cdf0e10cSrcweir {
2997cdf0e10cSrcweir     if( ValidTab( rPos.Tab() ) && pTab[ rPos.Tab() ] )
2998cdf0e10cSrcweir         pTab[ rPos.Tab() ]->DeleteNote( rPos.Col(), rPos.Row() );
2999cdf0e10cSrcweir }
3000cdf0e10cSrcweir 
3001cdf0e10cSrcweir 
InitializeNoteCaptions(SCTAB nTab,bool bForced)3002cdf0e10cSrcweir void ScDocument::InitializeNoteCaptions( SCTAB nTab, bool bForced )
3003cdf0e10cSrcweir {
3004cdf0e10cSrcweir     if( ValidTab( nTab ) && pTab[ nTab ] )
3005cdf0e10cSrcweir         pTab[ nTab ]->InitializeNoteCaptions( bForced );
3006cdf0e10cSrcweir }
3007cdf0e10cSrcweir 
InitializeAllNoteCaptions(bool bForced)3008cdf0e10cSrcweir void ScDocument::InitializeAllNoteCaptions( bool bForced )
3009cdf0e10cSrcweir {
3010cdf0e10cSrcweir     for( SCTAB nTab = 0; nTab < GetTableCount(); ++nTab )
3011cdf0e10cSrcweir         InitializeNoteCaptions( nTab, bForced );
3012cdf0e10cSrcweir }
3013cdf0e10cSrcweir 
SetDirty()3014cdf0e10cSrcweir void ScDocument::SetDirty()
3015cdf0e10cSrcweir {
3016cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
3017982a05a9Smseidel     bAutoCalc = sal_False; // no multiple recalculation
3018cdf0e10cSrcweir     {   // scope for bulk broadcast
3019cdf0e10cSrcweir         ScBulkBroadcast aBulkBroadcast( GetBASM());
3020cdf0e10cSrcweir         for (SCTAB i=0; i<=MAXTAB; i++)
3021cdf0e10cSrcweir             if (pTab[i]) pTab[i]->SetDirty();
3022cdf0e10cSrcweir     }
3023cdf0e10cSrcweir 
3024cdf0e10cSrcweir     // Charts werden zwar auch ohne AutoCalc im Tracking auf Dirty gesetzt,
3025cdf0e10cSrcweir     // wenn alle Formeln dirty sind, werden die Charts aber nicht mehr erwischt
3026cdf0e10cSrcweir     // (#45205#) - darum alle Charts nochmal explizit
3027cdf0e10cSrcweir     if (pChartListenerCollection)
3028cdf0e10cSrcweir         pChartListenerCollection->SetDirty();
3029cdf0e10cSrcweir 
3030cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
3031cdf0e10cSrcweir }
3032cdf0e10cSrcweir 
3033cdf0e10cSrcweir 
SetDirty(const ScRange & rRange)3034cdf0e10cSrcweir void ScDocument::SetDirty( const ScRange& rRange )
3035cdf0e10cSrcweir {
3036cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
3037982a05a9Smseidel     bAutoCalc = sal_False; // no multiple recalculation
3038cdf0e10cSrcweir     {   // scope for bulk broadcast
3039cdf0e10cSrcweir         ScBulkBroadcast aBulkBroadcast( GetBASM());
3040cdf0e10cSrcweir         SCTAB nTab2 = rRange.aEnd.Tab();
3041cdf0e10cSrcweir         for (SCTAB i=rRange.aStart.Tab(); i<=nTab2; i++)
3042cdf0e10cSrcweir             if (pTab[i]) pTab[i]->SetDirty( rRange );
3043cdf0e10cSrcweir     }
3044cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
3045cdf0e10cSrcweir }
3046cdf0e10cSrcweir 
3047cdf0e10cSrcweir 
SetTableOpDirty(const ScRange & rRange)3048cdf0e10cSrcweir void ScDocument::SetTableOpDirty( const ScRange& rRange )
3049cdf0e10cSrcweir {
3050cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
3051cdf0e10cSrcweir     bAutoCalc = sal_False; // no multiple recalculation
3052cdf0e10cSrcweir     SCTAB nTab2 = rRange.aEnd.Tab();
3053cdf0e10cSrcweir     for (SCTAB i=rRange.aStart.Tab(); i<=nTab2; i++)
3054cdf0e10cSrcweir         if (pTab[i]) pTab[i]->SetTableOpDirty( rRange );
3055cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
3056cdf0e10cSrcweir }
3057cdf0e10cSrcweir 
3058cdf0e10cSrcweir 
InterpretDirtyCells(const ScRangeList & rRanges)3059cdf0e10cSrcweir void ScDocument::InterpretDirtyCells( const ScRangeList& rRanges )
3060cdf0e10cSrcweir {
3061cdf0e10cSrcweir     sal_uLong nRangeCount = rRanges.Count();
3062cdf0e10cSrcweir     for (sal_uLong nPos=0; nPos<nRangeCount; nPos++)
3063cdf0e10cSrcweir     {
3064cdf0e10cSrcweir         ScCellIterator aIter( this, *rRanges.GetObject(nPos) );
3065cdf0e10cSrcweir         ScBaseCell* pCell = aIter.GetFirst();
3066cdf0e10cSrcweir         while (pCell)
3067cdf0e10cSrcweir         {
3068cdf0e10cSrcweir             if (pCell->GetCellType() == CELLTYPE_FORMULA)
3069cdf0e10cSrcweir             {
3070cdf0e10cSrcweir                 if ( static_cast<ScFormulaCell*>(pCell)->GetDirty() && GetAutoCalc() )
3071cdf0e10cSrcweir                     static_cast<ScFormulaCell*>(pCell)->Interpret();
3072cdf0e10cSrcweir             }
3073cdf0e10cSrcweir             pCell = aIter.GetNext();
3074cdf0e10cSrcweir         }
3075cdf0e10cSrcweir     }
3076cdf0e10cSrcweir }
3077cdf0e10cSrcweir 
3078cdf0e10cSrcweir 
AddTableOpFormulaCell(ScFormulaCell * pCell)3079cdf0e10cSrcweir void ScDocument::AddTableOpFormulaCell( ScFormulaCell* pCell )
3080cdf0e10cSrcweir {
3081cdf0e10cSrcweir     ScInterpreterTableOpParams* p = aTableOpList.Last();
3082cdf0e10cSrcweir     if ( p && p->bCollectNotifications )
3083cdf0e10cSrcweir     {
3084cdf0e10cSrcweir         if ( p->bRefresh )
3085cdf0e10cSrcweir         {   // refresh pointers only
3086cdf0e10cSrcweir             p->aNotifiedFormulaCells.push_back( pCell );
3087cdf0e10cSrcweir         }
3088cdf0e10cSrcweir         else
3089cdf0e10cSrcweir         {   // init both, address and pointer
3090cdf0e10cSrcweir             p->aNotifiedFormulaCells.push_back( pCell );
3091cdf0e10cSrcweir             p->aNotifiedFormulaPos.push_back( pCell->aPos );
3092cdf0e10cSrcweir         }
3093cdf0e10cSrcweir     }
3094cdf0e10cSrcweir }
3095cdf0e10cSrcweir 
3096cdf0e10cSrcweir 
CalcAll()3097cdf0e10cSrcweir void ScDocument::CalcAll()
3098cdf0e10cSrcweir {
3099cdf0e10cSrcweir     ClearLookupCaches(); // Ensure we don't deliver zombie data.
3100cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
3101cdf0e10cSrcweir     SetAutoCalc( sal_True );
3102cdf0e10cSrcweir     SCTAB i;
3103cdf0e10cSrcweir     for (i=0; i<=MAXTAB; i++)
3104cdf0e10cSrcweir         if (pTab[i]) pTab[i]->SetDirtyVar();
3105cdf0e10cSrcweir     for (i=0; i<=MAXTAB; i++)
3106cdf0e10cSrcweir         if (pTab[i]) pTab[i]->CalcAll();
3107cdf0e10cSrcweir     ClearFormulaTree();
3108cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
3109cdf0e10cSrcweir }
3110cdf0e10cSrcweir 
3111cdf0e10cSrcweir 
CompileAll()3112cdf0e10cSrcweir void ScDocument::CompileAll()
3113cdf0e10cSrcweir {
3114cdf0e10cSrcweir     if ( pCondFormList )
3115cdf0e10cSrcweir         pCondFormList->CompileAll();
3116cdf0e10cSrcweir 
3117cdf0e10cSrcweir     for (SCTAB i=0; i<=MAXTAB; i++)
3118cdf0e10cSrcweir         if (pTab[i]) pTab[i]->CompileAll();
3119cdf0e10cSrcweir     SetDirty();
3120cdf0e10cSrcweir }
3121cdf0e10cSrcweir 
3122cdf0e10cSrcweir 
CompileXML()3123cdf0e10cSrcweir void ScDocument::CompileXML()
3124cdf0e10cSrcweir {
3125cdf0e10cSrcweir     sal_Bool bOldAutoCalc = GetAutoCalc();
3126cdf0e10cSrcweir     SetAutoCalc( sal_False );
3127cdf0e10cSrcweir     ScProgress aProgress( GetDocumentShell(), ScGlobal::GetRscString(
3128cdf0e10cSrcweir                 STR_PROGRESS_CALCULATING ), GetXMLImportedFormulaCount() );
3129cdf0e10cSrcweir 
3130cdf0e10cSrcweir     // #b6355215# set AutoNameCache to speed up automatic name lookup
3131cdf0e10cSrcweir     DBG_ASSERT( !pAutoNameCache, "AutoNameCache already set" );
3132cdf0e10cSrcweir     pAutoNameCache = new ScAutoNameCache( this );
3133cdf0e10cSrcweir 
3134cdf0e10cSrcweir     for (SCTAB i=0; i<=MAXTAB; i++)
3135cdf0e10cSrcweir         if (pTab[i]) pTab[i]->CompileXML( aProgress );
3136cdf0e10cSrcweir 
3137cdf0e10cSrcweir     DELETEZ( pAutoNameCache ); // valid only during CompileXML, where cell contents don't change
3138cdf0e10cSrcweir 
3139cdf0e10cSrcweir     if ( pCondFormList )
3140cdf0e10cSrcweir         pCondFormList->CompileXML();
3141cdf0e10cSrcweir     if ( pValidationList )
3142cdf0e10cSrcweir         pValidationList->CompileXML();
3143cdf0e10cSrcweir 
3144cdf0e10cSrcweir     SetDirty();
3145cdf0e10cSrcweir     SetAutoCalc( bOldAutoCalc );
3146cdf0e10cSrcweir }
3147cdf0e10cSrcweir 
3148cdf0e10cSrcweir 
CalcAfterLoad()3149cdf0e10cSrcweir void ScDocument::CalcAfterLoad()
3150cdf0e10cSrcweir {
3151cdf0e10cSrcweir     SCTAB i;
3152cdf0e10cSrcweir 
3153cdf0e10cSrcweir     if (bIsClip)    // Excel-Dateien werden aus dem Clipboard in ein Clip-Doc geladen
3154982a05a9Smseidel         return;     // dann wird erst beim Einfügen in das richtige Doc berechnet
3155cdf0e10cSrcweir 
3156cdf0e10cSrcweir     bCalcingAfterLoad = sal_True;
3157cdf0e10cSrcweir     for ( i = 0; i <= MAXTAB; i++)
3158cdf0e10cSrcweir         if (pTab[i]) pTab[i]->CalcAfterLoad();
3159cdf0e10cSrcweir     for (i=0; i<=MAXTAB; i++)
3160cdf0e10cSrcweir         if (pTab[i]) pTab[i]->SetDirtyAfterLoad();
3161cdf0e10cSrcweir     bCalcingAfterLoad = sal_False;
3162cdf0e10cSrcweir 
3163cdf0e10cSrcweir     SetDetectiveDirty(sal_False);   // noch keine wirklichen Aenderungen
3164cdf0e10cSrcweir 
3165cdf0e10cSrcweir     // #i112436# If formula cells are already dirty, they don't broadcast further changes.
3166cdf0e10cSrcweir     // So the source ranges of charts must be interpreted even if they are not visible,
3167cdf0e10cSrcweir     // similar to ScMyShapeResizer::CreateChartListener for loading own files (i104899).
3168cdf0e10cSrcweir     if (pChartListenerCollection)
3169cdf0e10cSrcweir     {
3170cdf0e10cSrcweir         sal_uInt16 nChartCount = pChartListenerCollection->GetCount();
3171cdf0e10cSrcweir         for ( sal_uInt16 nIndex = 0; nIndex < nChartCount; nIndex++ )
3172cdf0e10cSrcweir         {
3173cdf0e10cSrcweir             ScChartListener* pChartListener = static_cast<ScChartListener*>(pChartListenerCollection->At(nIndex));
3174cdf0e10cSrcweir             InterpretDirtyCells(*pChartListener->GetRangeList());
3175cdf0e10cSrcweir         }
3176cdf0e10cSrcweir     }
3177cdf0e10cSrcweir }
3178cdf0e10cSrcweir 
3179cdf0e10cSrcweir 
GetErrCode(const ScAddress & rPos) const3180cdf0e10cSrcweir sal_uInt16 ScDocument::GetErrCode( const ScAddress& rPos ) const
3181cdf0e10cSrcweir {
3182cdf0e10cSrcweir     SCTAB nTab = rPos.Tab();
3183cdf0e10cSrcweir     if ( pTab[nTab] )
3184cdf0e10cSrcweir         return pTab[nTab]->GetErrCode( rPos );
3185cdf0e10cSrcweir     return 0;
3186cdf0e10cSrcweir }
3187cdf0e10cSrcweir 
3188cdf0e10cSrcweir 
ResetChanged(const ScRange & rRange)3189cdf0e10cSrcweir void ScDocument::ResetChanged( const ScRange& rRange )
3190cdf0e10cSrcweir {
3191cdf0e10cSrcweir     SCTAB nStartTab = rRange.aStart.Tab();
3192cdf0e10cSrcweir     SCTAB nEndTab = rRange.aEnd.Tab();
3193cdf0e10cSrcweir     for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++)
3194cdf0e10cSrcweir         if (pTab[nTab])
3195cdf0e10cSrcweir             pTab[nTab]->ResetChanged( rRange );
3196cdf0e10cSrcweir }
3197cdf0e10cSrcweir 
3198982a05a9Smseidel // Spaltenbreiten / Zeilenhöhen --------------------------------------
3199cdf0e10cSrcweir 
SetColWidth(SCCOL nCol,SCTAB nTab,sal_uInt16 nNewWidth)3200cdf0e10cSrcweir void ScDocument::SetColWidth( SCCOL nCol, SCTAB nTab, sal_uInt16 nNewWidth )
3201cdf0e10cSrcweir {
3202cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3203cdf0e10cSrcweir         pTab[nTab]->SetColWidth( nCol, nNewWidth );
3204cdf0e10cSrcweir }
3205cdf0e10cSrcweir 
SetColWidthOnly(SCCOL nCol,SCTAB nTab,sal_uInt16 nNewWidth)32063ce8cab8SWang Lei void ScDocument::SetColWidthOnly( SCCOL nCol, SCTAB nTab, sal_uInt16 nNewWidth )
32073ce8cab8SWang Lei {
32083ce8cab8SWang Lei     if ( ValidTab(nTab) && pTab[nTab] )
32093ce8cab8SWang Lei         pTab[nTab]->SetColWidthOnly( nCol, nNewWidth );
32103ce8cab8SWang Lei }
3211cdf0e10cSrcweir 
SetRowHeight(SCROW nRow,SCTAB nTab,sal_uInt16 nNewHeight)3212cdf0e10cSrcweir void ScDocument::SetRowHeight( SCROW nRow, SCTAB nTab, sal_uInt16 nNewHeight )
3213cdf0e10cSrcweir {
3214cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3215cdf0e10cSrcweir         pTab[nTab]->SetRowHeight( nRow, nNewHeight );
3216cdf0e10cSrcweir }
3217cdf0e10cSrcweir 
3218cdf0e10cSrcweir 
SetRowHeightRange(SCROW nStartRow,SCROW nEndRow,SCTAB nTab,sal_uInt16 nNewHeight)3219cdf0e10cSrcweir void ScDocument::SetRowHeightRange( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, sal_uInt16 nNewHeight )
3220cdf0e10cSrcweir {
3221cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3222cdf0e10cSrcweir         pTab[nTab]->SetRowHeightRange
3223cdf0e10cSrcweir             ( nStartRow, nEndRow, nNewHeight, 1.0, 1.0 );
3224cdf0e10cSrcweir }
3225cdf0e10cSrcweir 
SetRowHeightOnly(SCROW nStartRow,SCROW nEndRow,SCTAB nTab,sal_uInt16 nNewHeight)3226cdf0e10cSrcweir void ScDocument::SetRowHeightOnly( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, sal_uInt16 nNewHeight )
3227cdf0e10cSrcweir {
3228cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3229cdf0e10cSrcweir         pTab[nTab]->SetRowHeightOnly( nStartRow, nEndRow, nNewHeight );
3230cdf0e10cSrcweir }
3231cdf0e10cSrcweir 
SetManualHeight(SCROW nStartRow,SCROW nEndRow,SCTAB nTab,sal_Bool bManual)3232cdf0e10cSrcweir void ScDocument::SetManualHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, sal_Bool bManual )
3233cdf0e10cSrcweir {
3234cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3235cdf0e10cSrcweir         pTab[nTab]->SetManualHeight( nStartRow, nEndRow, bManual );
3236cdf0e10cSrcweir }
3237cdf0e10cSrcweir 
3238cdf0e10cSrcweir 
GetColWidth(SCCOL nCol,SCTAB nTab) const3239cdf0e10cSrcweir sal_uInt16 ScDocument::GetColWidth( SCCOL nCol, SCTAB nTab ) const
3240cdf0e10cSrcweir {
3241cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3242cdf0e10cSrcweir         return pTab[nTab]->GetColWidth( nCol );
3243982a05a9Smseidel     DBG_ERROR("Wrong table number");
3244cdf0e10cSrcweir     return 0;
3245cdf0e10cSrcweir }
3246cdf0e10cSrcweir 
3247cdf0e10cSrcweir 
GetOriginalWidth(SCCOL nCol,SCTAB nTab) const3248cdf0e10cSrcweir sal_uInt16 ScDocument::GetOriginalWidth( SCCOL nCol, SCTAB nTab ) const
3249cdf0e10cSrcweir {
3250cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3251cdf0e10cSrcweir         return pTab[nTab]->GetOriginalWidth( nCol );
3252982a05a9Smseidel     DBG_ERROR("Wrong table number");
3253cdf0e10cSrcweir     return 0;
3254cdf0e10cSrcweir }
3255cdf0e10cSrcweir 
3256cdf0e10cSrcweir 
GetCommonWidth(SCCOL nEndCol,SCTAB nTab) const3257cdf0e10cSrcweir sal_uInt16 ScDocument::GetCommonWidth( SCCOL nEndCol, SCTAB nTab ) const
3258cdf0e10cSrcweir {
3259cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3260cdf0e10cSrcweir         return pTab[nTab]->GetCommonWidth( nEndCol );
3261cdf0e10cSrcweir     DBG_ERROR("Wrong table number");
3262cdf0e10cSrcweir     return 0;
3263cdf0e10cSrcweir }
3264cdf0e10cSrcweir 
3265cdf0e10cSrcweir 
GetOriginalHeight(SCROW nRow,SCTAB nTab) const3266cdf0e10cSrcweir sal_uInt16 ScDocument::GetOriginalHeight( SCROW nRow, SCTAB nTab ) const
3267cdf0e10cSrcweir {
3268cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3269cdf0e10cSrcweir         return pTab[nTab]->GetOriginalHeight( nRow );
3270cdf0e10cSrcweir     DBG_ERROR("Wrong table number");
3271cdf0e10cSrcweir     return 0;
3272cdf0e10cSrcweir }
3273cdf0e10cSrcweir 
3274cdf0e10cSrcweir 
GetRowHeight(SCROW nRow,SCTAB nTab,bool bHiddenAsZero) const3275cdf0e10cSrcweir sal_uInt16 ScDocument::GetRowHeight( SCROW nRow, SCTAB nTab, bool bHiddenAsZero ) const
3276cdf0e10cSrcweir {
3277cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3278cdf0e10cSrcweir         return pTab[nTab]->GetRowHeight( nRow, NULL, NULL, bHiddenAsZero );
3279cdf0e10cSrcweir     DBG_ERROR("Wrong sheet number");
3280cdf0e10cSrcweir     return 0;
3281cdf0e10cSrcweir }
3282cdf0e10cSrcweir 
3283cdf0e10cSrcweir 
GetRowHeight(SCROW nRow,SCTAB nTab,SCROW * pStartRow,SCROW * pEndRow,bool bHiddenAsZero) const3284cdf0e10cSrcweir sal_uInt16 ScDocument::GetRowHeight( SCROW nRow, SCTAB nTab, SCROW* pStartRow, SCROW* pEndRow, bool bHiddenAsZero ) const
3285cdf0e10cSrcweir {
3286cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3287cdf0e10cSrcweir         return pTab[nTab]->GetRowHeight( nRow, pStartRow, pEndRow, bHiddenAsZero );
3288cdf0e10cSrcweir     DBG_ERROR("Wrong sheet number");
3289cdf0e10cSrcweir     return 0;
3290cdf0e10cSrcweir }
3291cdf0e10cSrcweir 
3292cdf0e10cSrcweir 
GetRowHeight(SCROW nStartRow,SCROW nEndRow,SCTAB nTab) const3293cdf0e10cSrcweir sal_uLong ScDocument::GetRowHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab ) const
3294cdf0e10cSrcweir {
3295cdf0e10cSrcweir     if (nStartRow == nEndRow)
3296cdf0e10cSrcweir         return GetRowHeight( nStartRow, nTab); // faster for a single row
3297cdf0e10cSrcweir 
3298cdf0e10cSrcweir     // check bounds because this method replaces former for(i=start;i<=end;++i) loops
3299cdf0e10cSrcweir     if (nStartRow > nEndRow)
3300cdf0e10cSrcweir         return 0;
3301cdf0e10cSrcweir 
3302cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3303cdf0e10cSrcweir         return pTab[nTab]->GetRowHeight( nStartRow, nEndRow);
3304cdf0e10cSrcweir 
3305982a05a9Smseidel     DBG_ERROR("Wrong sheet number");
3306cdf0e10cSrcweir     return 0;
3307cdf0e10cSrcweir }
3308cdf0e10cSrcweir 
GetRowForHeight(SCTAB nTab,sal_uLong nHeight) const3309cdf0e10cSrcweir SCROW ScDocument::GetRowForHeight( SCTAB nTab, sal_uLong nHeight ) const
3310cdf0e10cSrcweir {
3311cdf0e10cSrcweir     return pTab[nTab]->GetRowForHeight(nHeight);
3312cdf0e10cSrcweir }
3313cdf0e10cSrcweir 
GetScaledRowHeight(SCROW nStartRow,SCROW nEndRow,SCTAB nTab,double fScale) const3314cdf0e10cSrcweir sal_uLong ScDocument::GetScaledRowHeight( SCROW nStartRow, SCROW nEndRow,
3315cdf0e10cSrcweir         SCTAB nTab, double fScale ) const
3316cdf0e10cSrcweir {
3317cdf0e10cSrcweir     // faster for a single row
3318cdf0e10cSrcweir     if (nStartRow == nEndRow)
3319cdf0e10cSrcweir         return (sal_uLong) (GetRowHeight( nStartRow, nTab) * fScale);
3320cdf0e10cSrcweir 
3321cdf0e10cSrcweir     // check bounds because this method replaces former for(i=start;i<=end;++i) loops
3322cdf0e10cSrcweir     if (nStartRow > nEndRow)
3323cdf0e10cSrcweir         return 0;
3324cdf0e10cSrcweir 
3325cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3326cdf0e10cSrcweir         return pTab[nTab]->GetScaledRowHeight( nStartRow, nEndRow, fScale);
3327cdf0e10cSrcweir 
3328982a05a9Smseidel     DBG_ERROR("Wrong sheet number");
3329cdf0e10cSrcweir     return 0;
3330cdf0e10cSrcweir }
3331cdf0e10cSrcweir 
GetHiddenRowCount(SCROW nRow,SCTAB nTab) const3332cdf0e10cSrcweir SCROW ScDocument::GetHiddenRowCount( SCROW nRow, SCTAB nTab ) const
3333cdf0e10cSrcweir {
3334cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3335cdf0e10cSrcweir         return pTab[nTab]->GetHiddenRowCount( nRow );
3336982a05a9Smseidel     DBG_ERROR("Wrong table number");
3337cdf0e10cSrcweir     return 0;
3338cdf0e10cSrcweir }
3339cdf0e10cSrcweir 
3340cdf0e10cSrcweir 
GetColOffset(SCCOL nCol,SCTAB nTab) const3341cdf0e10cSrcweir sal_uLong ScDocument::GetColOffset( SCCOL nCol, SCTAB nTab ) const
3342cdf0e10cSrcweir {
3343cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3344cdf0e10cSrcweir         return pTab[nTab]->GetColOffset( nCol );
3345982a05a9Smseidel     DBG_ERROR("Wrong table number");
3346cdf0e10cSrcweir     return 0;
3347cdf0e10cSrcweir }
3348cdf0e10cSrcweir 
3349cdf0e10cSrcweir 
GetRowOffset(SCROW nRow,SCTAB nTab) const3350cdf0e10cSrcweir sal_uLong ScDocument::GetRowOffset( SCROW nRow, SCTAB nTab ) const
3351cdf0e10cSrcweir {
3352cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3353cdf0e10cSrcweir         return pTab[nTab]->GetRowOffset( nRow );
3354982a05a9Smseidel     DBG_ERROR("Wrong table number");
3355cdf0e10cSrcweir     return 0;
3356cdf0e10cSrcweir }
3357cdf0e10cSrcweir 
3358cdf0e10cSrcweir 
GetOptimalColWidth(SCCOL nCol,SCTAB nTab,OutputDevice * pDev,double nPPTX,double nPPTY,const Fraction & rZoomX,const Fraction & rZoomY,sal_Bool bFormula,const ScMarkData * pMarkData,sal_Bool bSimpleTextImport)3359cdf0e10cSrcweir sal_uInt16 ScDocument::GetOptimalColWidth( SCCOL nCol, SCTAB nTab, OutputDevice* pDev,
3360cdf0e10cSrcweir                                         double nPPTX, double nPPTY,
3361cdf0e10cSrcweir                                         const Fraction& rZoomX, const Fraction& rZoomY,
3362cdf0e10cSrcweir                                         sal_Bool bFormula, const ScMarkData* pMarkData,
3363cdf0e10cSrcweir                                         sal_Bool bSimpleTextImport )
3364cdf0e10cSrcweir {
3365cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3366cdf0e10cSrcweir         return pTab[nTab]->GetOptimalColWidth( nCol, pDev, nPPTX, nPPTY,
3367cdf0e10cSrcweir             rZoomX, rZoomY, bFormula, pMarkData, bSimpleTextImport );
3368982a05a9Smseidel     DBG_ERROR("Wrong table number");
3369cdf0e10cSrcweir     return 0;
3370cdf0e10cSrcweir }
3371cdf0e10cSrcweir 
3372cdf0e10cSrcweir 
GetNeededSize(SCCOL nCol,SCROW nRow,SCTAB nTab,OutputDevice * pDev,double nPPTX,double nPPTY,const Fraction & rZoomX,const Fraction & rZoomY,sal_Bool bWidth,sal_Bool bTotalSize)3373cdf0e10cSrcweir long ScDocument::GetNeededSize( SCCOL nCol, SCROW nRow, SCTAB nTab,
3374cdf0e10cSrcweir                                     OutputDevice* pDev,
3375cdf0e10cSrcweir                                     double nPPTX, double nPPTY,
3376cdf0e10cSrcweir                                     const Fraction& rZoomX, const Fraction& rZoomY,
3377cdf0e10cSrcweir                                     sal_Bool bWidth, sal_Bool bTotalSize )
3378cdf0e10cSrcweir {
3379cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3380cdf0e10cSrcweir         return pTab[nTab]->GetNeededSize
3381cdf0e10cSrcweir                 ( nCol, nRow, pDev, nPPTX, nPPTY, rZoomX, rZoomY, bWidth, bTotalSize );
3382982a05a9Smseidel     DBG_ERROR("Wrong table number");
3383cdf0e10cSrcweir     return 0;
3384cdf0e10cSrcweir }
3385cdf0e10cSrcweir 
3386cdf0e10cSrcweir 
SetOptimalHeight(SCROW nStartRow,SCROW nEndRow,SCTAB nTab,sal_uInt16 nExtra,OutputDevice * pDev,double nPPTX,double nPPTY,const Fraction & rZoomX,const Fraction & rZoomY,sal_Bool bShrink)3387cdf0e10cSrcweir sal_Bool ScDocument::SetOptimalHeight( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, sal_uInt16 nExtra,
3388cdf0e10cSrcweir                                     OutputDevice* pDev,
3389cdf0e10cSrcweir                                     double nPPTX, double nPPTY,
3390cdf0e10cSrcweir                                     const Fraction& rZoomX, const Fraction& rZoomY,
3391cdf0e10cSrcweir                                     sal_Bool bShrink )
3392cdf0e10cSrcweir {
3393cdf0e10cSrcweir //! MarkToMulti();
3394cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3395cdf0e10cSrcweir         return pTab[nTab]->SetOptimalHeight( nStartRow, nEndRow, nExtra,
3396cdf0e10cSrcweir                                                 pDev, nPPTX, nPPTY, rZoomX, rZoomY, bShrink );
3397982a05a9Smseidel     DBG_ERROR("Wrong table number");
3398cdf0e10cSrcweir     return sal_False;
3399cdf0e10cSrcweir }
3400cdf0e10cSrcweir 
3401cdf0e10cSrcweir 
UpdateAllRowHeights(OutputDevice * pDev,double nPPTX,double nPPTY,const Fraction & rZoomX,const Fraction & rZoomY,const ScMarkData * pTabMark)3402cdf0e10cSrcweir void ScDocument::UpdateAllRowHeights( OutputDevice* pDev, double nPPTX, double nPPTY,
3403cdf0e10cSrcweir                                     const Fraction& rZoomX, const Fraction& rZoomY, const ScMarkData* pTabMark )
3404cdf0e10cSrcweir {
3405cdf0e10cSrcweir     // one progress across all (selected) sheets
3406cdf0e10cSrcweir 
3407cdf0e10cSrcweir     sal_uLong nCellCount = 0;
3408cdf0e10cSrcweir     for ( SCTAB nTab=0; nTab<=MAXTAB; nTab++ )
3409cdf0e10cSrcweir         if ( pTab[nTab] && ( !pTabMark || pTabMark->GetTableSelect(nTab) ) )
3410cdf0e10cSrcweir             nCellCount += pTab[nTab]->GetWeightedCount();
3411cdf0e10cSrcweir 
3412cdf0e10cSrcweir     ScProgress aProgress( GetDocumentShell(), ScGlobal::GetRscString(STR_PROGRESS_HEIGHTING), nCellCount );
3413cdf0e10cSrcweir 
3414cdf0e10cSrcweir     sal_uLong nProgressStart = 0;
3415cdf0e10cSrcweir     for ( SCTAB nTab=0; nTab<=MAXTAB; nTab++ )
3416cdf0e10cSrcweir         if ( pTab[nTab] && ( !pTabMark || pTabMark->GetTableSelect(nTab) ) )
3417cdf0e10cSrcweir         {
3418cdf0e10cSrcweir             pTab[nTab]->SetOptimalHeight( 0, MAXROW, 0,
3419cdf0e10cSrcweir                         pDev, nPPTX, nPPTY, rZoomX, rZoomY, sal_False, &aProgress, nProgressStart );
3420cdf0e10cSrcweir             nProgressStart += pTab[nTab]->GetWeightedCount();
3421cdf0e10cSrcweir         }
3422cdf0e10cSrcweir }
3423cdf0e10cSrcweir 
3424cdf0e10cSrcweir // Spalten-/Zeilen-Flags    ----------------------------------------------
3425cdf0e10cSrcweir 
ShowCol(SCCOL nCol,SCTAB nTab,sal_Bool bShow)3426cdf0e10cSrcweir void ScDocument::ShowCol(SCCOL nCol, SCTAB nTab, sal_Bool bShow)
3427cdf0e10cSrcweir {
3428cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3429cdf0e10cSrcweir         pTab[nTab]->ShowCol( nCol, bShow );
3430cdf0e10cSrcweir }
3431cdf0e10cSrcweir 
3432cdf0e10cSrcweir 
ShowRow(SCROW nRow,SCTAB nTab,sal_Bool bShow)3433cdf0e10cSrcweir void ScDocument::ShowRow(SCROW nRow, SCTAB nTab, sal_Bool bShow)
3434cdf0e10cSrcweir {
3435cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3436cdf0e10cSrcweir         pTab[nTab]->ShowRow( nRow, bShow );
3437cdf0e10cSrcweir }
3438cdf0e10cSrcweir 
3439cdf0e10cSrcweir 
ShowRows(SCROW nRow1,SCROW nRow2,SCTAB nTab,sal_Bool bShow)3440cdf0e10cSrcweir void ScDocument::ShowRows(SCROW nRow1, SCROW nRow2, SCTAB nTab, sal_Bool bShow)
3441cdf0e10cSrcweir {
3442cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3443cdf0e10cSrcweir         pTab[nTab]->ShowRows( nRow1, nRow2, bShow );
3444cdf0e10cSrcweir }
3445cdf0e10cSrcweir 
3446cdf0e10cSrcweir 
SetColFlags(SCCOL nCol,SCTAB nTab,sal_uInt8 nNewFlags)3447cdf0e10cSrcweir void ScDocument::SetColFlags( SCCOL nCol, SCTAB nTab, sal_uInt8 nNewFlags )
3448cdf0e10cSrcweir {
3449cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3450cdf0e10cSrcweir         pTab[nTab]->SetColFlags( nCol, nNewFlags );
3451cdf0e10cSrcweir }
3452cdf0e10cSrcweir 
3453cdf0e10cSrcweir 
SetRowFlags(SCROW nRow,SCTAB nTab,sal_uInt8 nNewFlags)3454cdf0e10cSrcweir void ScDocument::SetRowFlags( SCROW nRow, SCTAB nTab, sal_uInt8 nNewFlags )
3455cdf0e10cSrcweir {
3456cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3457cdf0e10cSrcweir         pTab[nTab]->SetRowFlags( nRow, nNewFlags );
3458cdf0e10cSrcweir }
3459cdf0e10cSrcweir 
3460cdf0e10cSrcweir 
SetRowFlags(SCROW nStartRow,SCROW nEndRow,SCTAB nTab,sal_uInt8 nNewFlags)3461cdf0e10cSrcweir void ScDocument::SetRowFlags( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, sal_uInt8 nNewFlags )
3462cdf0e10cSrcweir {
3463cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3464cdf0e10cSrcweir         pTab[nTab]->SetRowFlags( nStartRow, nEndRow, nNewFlags );
3465cdf0e10cSrcweir }
3466cdf0e10cSrcweir 
3467cdf0e10cSrcweir 
GetColFlags(SCCOL nCol,SCTAB nTab) const3468cdf0e10cSrcweir sal_uInt8 ScDocument::GetColFlags( SCCOL nCol, SCTAB nTab ) const
3469cdf0e10cSrcweir {
3470cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3471cdf0e10cSrcweir         return pTab[nTab]->GetColFlags( nCol );
3472982a05a9Smseidel     DBG_ERROR("Wrong table number");
3473cdf0e10cSrcweir     return 0;
3474cdf0e10cSrcweir }
3475cdf0e10cSrcweir 
GetRowFlags(SCROW nRow,SCTAB nTab) const3476cdf0e10cSrcweir sal_uInt8 ScDocument::GetRowFlags( SCROW nRow, SCTAB nTab ) const
3477cdf0e10cSrcweir {
3478cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3479cdf0e10cSrcweir         return pTab[nTab]->GetRowFlags( nRow );
3480982a05a9Smseidel     DBG_ERROR("Wrong table number");
3481cdf0e10cSrcweir     return 0;
3482cdf0e10cSrcweir }
3483cdf0e10cSrcweir 
GetRowFlagsArrayModifiable(SCTAB nTab)3484cdf0e10cSrcweir ScBitMaskCompressedArray< SCROW, sal_uInt8> & ScDocument::GetRowFlagsArrayModifiable(
3485cdf0e10cSrcweir         SCTAB nTab )
3486cdf0e10cSrcweir {
3487cdf0e10cSrcweir     return const_cast< ScBitMaskCompressedArray< SCROW, sal_uInt8> & >(
3488cdf0e10cSrcweir             GetRowFlagsArray( nTab));
3489cdf0e10cSrcweir }
3490cdf0e10cSrcweir 
GetRowFlagsArray(SCTAB nTab) const3491cdf0e10cSrcweir const ScBitMaskCompressedArray< SCROW, sal_uInt8> & ScDocument::GetRowFlagsArray(
3492cdf0e10cSrcweir         SCTAB nTab ) const
3493cdf0e10cSrcweir {
3494cdf0e10cSrcweir     const ScBitMaskCompressedArray< SCROW, sal_uInt8> * pFlags;
3495cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3496cdf0e10cSrcweir         pFlags = pTab[nTab]->GetRowFlagsArray();
3497cdf0e10cSrcweir     else
3498cdf0e10cSrcweir     {
3499982a05a9Smseidel         DBG_ERROR("Wrong sheet number");
3500cdf0e10cSrcweir         pFlags = 0;
3501cdf0e10cSrcweir     }
3502cdf0e10cSrcweir     if (!pFlags)
3503cdf0e10cSrcweir     {
3504982a05a9Smseidel         DBG_ERROR("No row flags at sheet");
3505cdf0e10cSrcweir         static ScBitMaskCompressedArray< SCROW, sal_uInt8> aDummy( MAXROW, 0);
3506cdf0e10cSrcweir         pFlags = &aDummy;
3507cdf0e10cSrcweir     }
3508cdf0e10cSrcweir     return *pFlags;
3509cdf0e10cSrcweir }
3510cdf0e10cSrcweir 
GetAllRowBreaks(set<SCROW> & rBreaks,SCTAB nTab,bool bPage,bool bManual) const3511cdf0e10cSrcweir void ScDocument::GetAllRowBreaks(set<SCROW>& rBreaks, SCTAB nTab, bool bPage, bool bManual) const
3512cdf0e10cSrcweir {
3513cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3514cdf0e10cSrcweir         return;
3515cdf0e10cSrcweir 
3516cdf0e10cSrcweir     pTab[nTab]->GetAllRowBreaks(rBreaks, bPage, bManual);
3517cdf0e10cSrcweir }
3518cdf0e10cSrcweir 
GetAllColBreaks(set<SCCOL> & rBreaks,SCTAB nTab,bool bPage,bool bManual) const3519cdf0e10cSrcweir void ScDocument::GetAllColBreaks(set<SCCOL>& rBreaks, SCTAB nTab, bool bPage, bool bManual) const
3520cdf0e10cSrcweir {
3521cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3522cdf0e10cSrcweir         return;
3523cdf0e10cSrcweir 
3524cdf0e10cSrcweir     pTab[nTab]->GetAllColBreaks(rBreaks, bPage, bManual);
3525cdf0e10cSrcweir }
3526cdf0e10cSrcweir 
HasRowBreak(SCROW nRow,SCTAB nTab) const3527cdf0e10cSrcweir ScBreakType ScDocument::HasRowBreak(SCROW nRow, SCTAB nTab) const
3528cdf0e10cSrcweir {
3529cdf0e10cSrcweir     ScBreakType nType = BREAK_NONE;
3530cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab] || !ValidRow(nRow))
3531cdf0e10cSrcweir         return nType;
3532cdf0e10cSrcweir 
3533cdf0e10cSrcweir     if (pTab[nTab]->HasRowPageBreak(nRow))
3534cdf0e10cSrcweir         nType |= BREAK_PAGE;
3535cdf0e10cSrcweir 
3536cdf0e10cSrcweir     if (pTab[nTab]->HasRowManualBreak(nRow))
3537cdf0e10cSrcweir         nType |= BREAK_MANUAL;
3538cdf0e10cSrcweir 
3539cdf0e10cSrcweir     return nType;
3540cdf0e10cSrcweir }
3541cdf0e10cSrcweir 
HasColBreak(SCCOL nCol,SCTAB nTab) const3542cdf0e10cSrcweir ScBreakType ScDocument::HasColBreak(SCCOL nCol, SCTAB nTab) const
3543cdf0e10cSrcweir {
3544cdf0e10cSrcweir     ScBreakType nType = BREAK_NONE;
3545cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab] || !ValidCol(nCol))
3546cdf0e10cSrcweir         return nType;
3547cdf0e10cSrcweir 
3548cdf0e10cSrcweir     if (pTab[nTab]->HasColPageBreak(nCol))
3549cdf0e10cSrcweir         nType |= BREAK_PAGE;
3550cdf0e10cSrcweir 
3551cdf0e10cSrcweir     if (pTab[nTab]->HasColManualBreak(nCol))
3552cdf0e10cSrcweir         nType |= BREAK_MANUAL;
3553cdf0e10cSrcweir 
3554cdf0e10cSrcweir     return nType;
3555cdf0e10cSrcweir }
3556cdf0e10cSrcweir 
SetRowBreak(SCROW nRow,SCTAB nTab,bool bPage,bool bManual)3557cdf0e10cSrcweir void ScDocument::SetRowBreak(SCROW nRow, SCTAB nTab, bool bPage, bool bManual)
3558cdf0e10cSrcweir {
3559cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab] || !ValidRow(nRow))
3560cdf0e10cSrcweir         return;
3561cdf0e10cSrcweir 
3562cdf0e10cSrcweir     pTab[nTab]->SetRowBreak(nRow, bPage, bManual);
3563cdf0e10cSrcweir }
3564cdf0e10cSrcweir 
SetColBreak(SCCOL nCol,SCTAB nTab,bool bPage,bool bManual)3565cdf0e10cSrcweir void ScDocument::SetColBreak(SCCOL nCol, SCTAB nTab, bool bPage, bool bManual)
3566cdf0e10cSrcweir {
3567cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab] || !ValidCol(nCol))
3568cdf0e10cSrcweir         return;
3569cdf0e10cSrcweir 
3570cdf0e10cSrcweir     pTab[nTab]->SetColBreak(nCol, bPage, bManual);
3571cdf0e10cSrcweir }
3572cdf0e10cSrcweir 
RemoveRowBreak(SCROW nRow,SCTAB nTab,bool bPage,bool bManual)3573cdf0e10cSrcweir void ScDocument::RemoveRowBreak(SCROW nRow, SCTAB nTab, bool bPage, bool bManual)
3574cdf0e10cSrcweir {
3575cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab] || !ValidRow(nRow))
3576cdf0e10cSrcweir         return;
3577cdf0e10cSrcweir 
3578cdf0e10cSrcweir     pTab[nTab]->RemoveRowBreak(nRow, bPage, bManual);
3579cdf0e10cSrcweir }
3580cdf0e10cSrcweir 
RemoveColBreak(SCCOL nCol,SCTAB nTab,bool bPage,bool bManual)3581cdf0e10cSrcweir void ScDocument::RemoveColBreak(SCCOL nCol, SCTAB nTab, bool bPage, bool bManual)
3582cdf0e10cSrcweir {
3583cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab] || !ValidCol(nCol))
3584cdf0e10cSrcweir         return;
3585cdf0e10cSrcweir 
3586cdf0e10cSrcweir     pTab[nTab]->RemoveColBreak(nCol, bPage, bManual);
3587cdf0e10cSrcweir }
3588cdf0e10cSrcweir 
GetRowBreakData(SCTAB nTab) const3589cdf0e10cSrcweir Sequence<TablePageBreakData> ScDocument::GetRowBreakData(SCTAB nTab) const
3590cdf0e10cSrcweir {
3591cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3592cdf0e10cSrcweir         return Sequence<TablePageBreakData>();
3593cdf0e10cSrcweir 
3594cdf0e10cSrcweir     return pTab[nTab]->GetRowBreakData();
3595cdf0e10cSrcweir }
3596cdf0e10cSrcweir 
RowHidden(SCROW nRow,SCTAB nTab,SCROW * pFirstRow,SCROW * pLastRow)3597cdf0e10cSrcweir bool ScDocument::RowHidden(SCROW nRow, SCTAB nTab, SCROW* pFirstRow, SCROW* pLastRow)
3598cdf0e10cSrcweir {
3599cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3600cdf0e10cSrcweir         return false;
3601cdf0e10cSrcweir 
3602cdf0e10cSrcweir     return pTab[nTab]->RowHidden(nRow, pFirstRow, pLastRow);
3603cdf0e10cSrcweir }
3604cdf0e10cSrcweir 
RowHidden(SCROW nRow,SCTAB nTab,SCROW & rLastRow)3605cdf0e10cSrcweir bool ScDocument::RowHidden(SCROW nRow, SCTAB nTab, SCROW& rLastRow)
3606cdf0e10cSrcweir {
3607cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3608cdf0e10cSrcweir     {
3609cdf0e10cSrcweir         rLastRow = nRow;
3610cdf0e10cSrcweir         return false;
3611cdf0e10cSrcweir     }
3612cdf0e10cSrcweir 
3613cdf0e10cSrcweir     return pTab[nTab]->RowHidden(nRow, rLastRow);
3614cdf0e10cSrcweir }
3615cdf0e10cSrcweir 
3616cdf0e10cSrcweir 
HasHiddenRows(SCROW nStartRow,SCROW nEndRow,SCTAB nTab)3617cdf0e10cSrcweir bool ScDocument::HasHiddenRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab)
3618cdf0e10cSrcweir {
3619cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3620cdf0e10cSrcweir         return false;
3621cdf0e10cSrcweir 
3622cdf0e10cSrcweir     return pTab[nTab]->HasHiddenRows(nStartRow, nEndRow);
3623cdf0e10cSrcweir }
3624cdf0e10cSrcweir 
ColHidden(SCCOL nCol,SCTAB nTab,SCCOL & rLastCol)3625cdf0e10cSrcweir bool ScDocument::ColHidden(SCCOL nCol, SCTAB nTab, SCCOL& rLastCol)
3626cdf0e10cSrcweir {
3627cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3628cdf0e10cSrcweir     {
3629cdf0e10cSrcweir         rLastCol = nCol;
3630cdf0e10cSrcweir         return false;
3631cdf0e10cSrcweir     }
3632cdf0e10cSrcweir 
3633cdf0e10cSrcweir     return pTab[nTab]->ColHidden(nCol, rLastCol);
3634cdf0e10cSrcweir }
3635cdf0e10cSrcweir 
ColHidden(SCCOL nCol,SCTAB nTab,SCCOL * pFirstCol,SCCOL * pLastCol)3636cdf0e10cSrcweir bool ScDocument::ColHidden(SCCOL nCol, SCTAB nTab, SCCOL* pFirstCol, SCCOL* pLastCol)
3637cdf0e10cSrcweir {
3638cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3639cdf0e10cSrcweir     {
3640cdf0e10cSrcweir         if (pFirstCol)
3641cdf0e10cSrcweir             *pFirstCol = nCol;
3642cdf0e10cSrcweir         if (pLastCol)
3643cdf0e10cSrcweir             *pLastCol = nCol;
3644cdf0e10cSrcweir         return false;
3645cdf0e10cSrcweir     }
3646cdf0e10cSrcweir 
3647cdf0e10cSrcweir     return pTab[nTab]->ColHidden(nCol, pFirstCol, pLastCol);
3648cdf0e10cSrcweir }
3649cdf0e10cSrcweir 
SetRowHidden(SCROW nStartRow,SCROW nEndRow,SCTAB nTab,bool bHidden)3650cdf0e10cSrcweir void ScDocument::SetRowHidden(SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bHidden)
3651cdf0e10cSrcweir {
3652cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3653cdf0e10cSrcweir         return;
3654cdf0e10cSrcweir 
3655cdf0e10cSrcweir     pTab[nTab]->SetRowHidden(nStartRow, nEndRow, bHidden);
3656cdf0e10cSrcweir }
3657cdf0e10cSrcweir 
SetColHidden(SCCOL nStartCol,SCCOL nEndCol,SCTAB nTab,bool bHidden)3658cdf0e10cSrcweir void ScDocument::SetColHidden(SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, bool bHidden)
3659cdf0e10cSrcweir {
3660cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3661cdf0e10cSrcweir         return;
3662cdf0e10cSrcweir 
3663cdf0e10cSrcweir     pTab[nTab]->SetColHidden(nStartCol, nEndCol, bHidden);
3664cdf0e10cSrcweir }
3665cdf0e10cSrcweir 
FirstVisibleRow(SCROW nStartRow,SCROW nEndRow,SCTAB nTab)3666cdf0e10cSrcweir SCROW ScDocument::FirstVisibleRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab)
3667cdf0e10cSrcweir {
3668cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3669*94f40e84Smseidel         return ::std::numeric_limits<SCROW>::max();
3670cdf0e10cSrcweir 
3671cdf0e10cSrcweir     return pTab[nTab]->FirstVisibleRow(nStartRow, nEndRow);
3672cdf0e10cSrcweir }
3673cdf0e10cSrcweir 
LastVisibleRow(SCROW nStartRow,SCROW nEndRow,SCTAB nTab)3674cdf0e10cSrcweir SCROW ScDocument::LastVisibleRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab)
3675cdf0e10cSrcweir {
3676cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3677*94f40e84Smseidel         return ::std::numeric_limits<SCROW>::max();
3678cdf0e10cSrcweir 
3679cdf0e10cSrcweir     return pTab[nTab]->LastVisibleRow(nStartRow, nEndRow);
3680cdf0e10cSrcweir }
3681cdf0e10cSrcweir 
CountVisibleRows(SCROW nStartRow,SCROW nEndRow,SCTAB nTab)3682cdf0e10cSrcweir SCROW ScDocument::CountVisibleRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab)
3683cdf0e10cSrcweir {
3684cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3685cdf0e10cSrcweir         return 0;
3686cdf0e10cSrcweir 
3687cdf0e10cSrcweir     return pTab[nTab]->CountVisibleRows(nStartRow, nEndRow);
3688cdf0e10cSrcweir }
3689cdf0e10cSrcweir 
RowFiltered(SCROW nRow,SCTAB nTab,SCROW * pFirstRow,SCROW * pLastRow)3690cdf0e10cSrcweir bool ScDocument::RowFiltered(SCROW nRow, SCTAB nTab, SCROW* pFirstRow, SCROW* pLastRow)
3691cdf0e10cSrcweir {
3692cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3693cdf0e10cSrcweir         return false;
3694cdf0e10cSrcweir 
3695cdf0e10cSrcweir     return pTab[nTab]->RowFiltered(nRow, pFirstRow, pLastRow);
3696cdf0e10cSrcweir }
3697cdf0e10cSrcweir 
HasFilteredRows(SCROW nStartRow,SCROW nEndRow,SCTAB nTab)3698cdf0e10cSrcweir bool ScDocument::HasFilteredRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab)
3699cdf0e10cSrcweir {
3700cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3701cdf0e10cSrcweir         return false;
3702cdf0e10cSrcweir 
3703cdf0e10cSrcweir     return pTab[nTab]->HasFilteredRows(nStartRow, nEndRow);
3704cdf0e10cSrcweir }
3705cdf0e10cSrcweir 
ColFiltered(SCCOL nCol,SCTAB nTab,SCCOL * pFirstCol,SCCOL * pLastCol)3706cdf0e10cSrcweir bool ScDocument::ColFiltered(SCCOL nCol, SCTAB nTab, SCCOL* pFirstCol, SCCOL* pLastCol)
3707cdf0e10cSrcweir {
3708cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3709cdf0e10cSrcweir         return false;
3710cdf0e10cSrcweir 
3711cdf0e10cSrcweir     return pTab[nTab]->ColFiltered(nCol, pFirstCol, pLastCol);
3712cdf0e10cSrcweir }
3713cdf0e10cSrcweir 
SetRowFiltered(SCROW nStartRow,SCROW nEndRow,SCTAB nTab,bool bFiltered)3714cdf0e10cSrcweir void ScDocument::SetRowFiltered(SCROW nStartRow, SCROW nEndRow, SCTAB nTab, bool bFiltered)
3715cdf0e10cSrcweir {
3716cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3717cdf0e10cSrcweir         return;
3718cdf0e10cSrcweir 
3719cdf0e10cSrcweir     pTab[nTab]->SetRowFiltered(nStartRow, nEndRow, bFiltered);
3720cdf0e10cSrcweir }
3721cdf0e10cSrcweir 
SetColFiltered(SCCOL nStartCol,SCCOL nEndCol,SCTAB nTab,bool bFiltered)3722cdf0e10cSrcweir void ScDocument::SetColFiltered(SCCOL nStartCol, SCCOL nEndCol, SCTAB nTab, bool bFiltered)
3723cdf0e10cSrcweir {
3724cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3725cdf0e10cSrcweir         return;
3726cdf0e10cSrcweir 
3727cdf0e10cSrcweir     pTab[nTab]->SetColFiltered(nStartCol, nEndCol, bFiltered);
3728cdf0e10cSrcweir }
3729cdf0e10cSrcweir 
FirstNonFilteredRow(SCROW nStartRow,SCROW nEndRow,SCTAB nTab)3730cdf0e10cSrcweir SCROW ScDocument::FirstNonFilteredRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab)
3731cdf0e10cSrcweir {
3732cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3733*94f40e84Smseidel         return ::std::numeric_limits<SCROW>::max();
3734cdf0e10cSrcweir 
3735cdf0e10cSrcweir     return pTab[nTab]->FirstNonFilteredRow(nStartRow, nEndRow);
3736cdf0e10cSrcweir }
3737cdf0e10cSrcweir 
LastNonFilteredRow(SCROW nStartRow,SCROW nEndRow,SCTAB nTab)3738cdf0e10cSrcweir SCROW ScDocument::LastNonFilteredRow(SCROW nStartRow, SCROW nEndRow, SCTAB nTab)
3739cdf0e10cSrcweir {
3740cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3741*94f40e84Smseidel         return ::std::numeric_limits<SCROW>::max();
3742cdf0e10cSrcweir 
3743cdf0e10cSrcweir     return pTab[nTab]->LastNonFilteredRow(nStartRow, nEndRow);
3744cdf0e10cSrcweir }
3745cdf0e10cSrcweir 
CountNonFilteredRows(SCROW nStartRow,SCROW nEndRow,SCTAB nTab)3746cdf0e10cSrcweir SCROW ScDocument::CountNonFilteredRows(SCROW nStartRow, SCROW nEndRow, SCTAB nTab)
3747cdf0e10cSrcweir {
3748cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
3749cdf0e10cSrcweir         return 0;
3750cdf0e10cSrcweir 
3751cdf0e10cSrcweir     return pTab[nTab]->CountNonFilteredRows(nStartRow, nEndRow);
3752cdf0e10cSrcweir }
3753cdf0e10cSrcweir 
SyncColRowFlags()3754cdf0e10cSrcweir void ScDocument::SyncColRowFlags()
3755cdf0e10cSrcweir {
3756cdf0e10cSrcweir     for (SCTAB i = 0; i <= nMaxTableNumber; ++i)
3757cdf0e10cSrcweir     {
3758cdf0e10cSrcweir         if (!ValidTab(i) || !pTab[i])
3759cdf0e10cSrcweir             continue;
3760cdf0e10cSrcweir 
3761cdf0e10cSrcweir         pTab[i]->SyncColRowFlags();
3762cdf0e10cSrcweir     }
3763cdf0e10cSrcweir }
3764cdf0e10cSrcweir 
GetLastFlaggedRow(SCTAB nTab) const3765cdf0e10cSrcweir SCROW ScDocument::GetLastFlaggedRow( SCTAB nTab ) const
3766cdf0e10cSrcweir {
3767cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3768cdf0e10cSrcweir         return pTab[nTab]->GetLastFlaggedRow();
3769cdf0e10cSrcweir     return 0;
3770cdf0e10cSrcweir }
3771cdf0e10cSrcweir 
3772cdf0e10cSrcweir 
GetLastChangedCol(SCTAB nTab) const3773cdf0e10cSrcweir SCCOL ScDocument::GetLastChangedCol( SCTAB nTab ) const
3774cdf0e10cSrcweir {
3775cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3776cdf0e10cSrcweir         return pTab[nTab]->GetLastChangedCol();
3777cdf0e10cSrcweir     return 0;
3778cdf0e10cSrcweir }
3779cdf0e10cSrcweir 
GetLastChangedRow(SCTAB nTab) const3780cdf0e10cSrcweir SCROW ScDocument::GetLastChangedRow( SCTAB nTab ) const
3781cdf0e10cSrcweir {
3782cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3783cdf0e10cSrcweir         return pTab[nTab]->GetLastChangedRow();
3784cdf0e10cSrcweir     return 0;
3785cdf0e10cSrcweir }
3786cdf0e10cSrcweir 
3787cdf0e10cSrcweir 
GetNextDifferentChangedCol(SCTAB nTab,SCCOL nStart) const3788cdf0e10cSrcweir SCCOL ScDocument::GetNextDifferentChangedCol( SCTAB nTab, SCCOL nStart) const
3789cdf0e10cSrcweir {
3790cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3791cdf0e10cSrcweir     {
3792cdf0e10cSrcweir         sal_uInt8 nStartFlags = pTab[nTab]->GetColFlags(nStart);
3793cdf0e10cSrcweir         sal_uInt16 nStartWidth = pTab[nTab]->GetOriginalWidth(nStart);
3794cdf0e10cSrcweir         for (SCCOL nCol = nStart + 1; nCol <= MAXCOL; nCol++)
3795cdf0e10cSrcweir         {
3796cdf0e10cSrcweir             if (((nStartFlags & CR_MANUALBREAK) != (pTab[nTab]->GetColFlags(nCol) & CR_MANUALBREAK)) ||
3797cdf0e10cSrcweir                 (nStartWidth != pTab[nTab]->GetOriginalWidth(nCol)) ||
3798cdf0e10cSrcweir                 ((nStartFlags & CR_HIDDEN) != (pTab[nTab]->GetColFlags(nCol) & CR_HIDDEN)) )
3799cdf0e10cSrcweir                 return nCol;
3800cdf0e10cSrcweir         }
3801cdf0e10cSrcweir         return MAXCOL+1;
3802cdf0e10cSrcweir     }
3803cdf0e10cSrcweir     return 0;
3804cdf0e10cSrcweir }
3805cdf0e10cSrcweir 
GetNextDifferentChangedRow(SCTAB nTab,SCROW nStart,bool bCareManualSize) const3806cdf0e10cSrcweir SCROW ScDocument::GetNextDifferentChangedRow( SCTAB nTab, SCROW nStart, bool bCareManualSize) const
3807cdf0e10cSrcweir {
3808cdf0e10cSrcweir     const ScBitMaskCompressedArray< SCROW, sal_uInt8> * pRowFlagsArray;
3809cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] && ((pRowFlagsArray = pTab[nTab]->GetRowFlagsArray()) != NULL) &&
3810cdf0e10cSrcweir             pTab[nTab]->mpRowHeights && pTab[nTab]->mpHiddenRows )
3811cdf0e10cSrcweir     {
3812cdf0e10cSrcweir         size_t nIndex; // ignored
3813cdf0e10cSrcweir         SCROW nFlagsEndRow;
3814cdf0e10cSrcweir         SCROW nHiddenEndRow;
3815cdf0e10cSrcweir         SCROW nHeightEndRow;
3816cdf0e10cSrcweir         sal_uInt8 nFlags;
3817cdf0e10cSrcweir         bool bHidden;
3818cdf0e10cSrcweir         sal_uInt16 nHeight;
3819cdf0e10cSrcweir         sal_uInt8 nStartFlags = nFlags = pRowFlagsArray->GetValue( nStart, nIndex, nFlagsEndRow);
3820cdf0e10cSrcweir         bool bStartHidden = bHidden = pTab[nTab]->RowHidden( nStart, NULL, &nHiddenEndRow);
3821cdf0e10cSrcweir         sal_uInt16 nStartHeight = nHeight = pTab[nTab]->GetRowHeight( nStart, NULL, &nHeightEndRow, false);
3822cdf0e10cSrcweir         SCROW nRow;
3823cdf0e10cSrcweir         while ((nRow = std::min( nHiddenEndRow, std::min( nFlagsEndRow, nHeightEndRow)) + 1) <= MAXROW)
3824cdf0e10cSrcweir         {
3825cdf0e10cSrcweir             if (nFlagsEndRow < nRow)
3826cdf0e10cSrcweir                 nFlags = pRowFlagsArray->GetValue( nRow, nIndex, nFlagsEndRow);
3827cdf0e10cSrcweir             if (nHiddenEndRow < nRow)
3828cdf0e10cSrcweir                 bHidden = pTab[nTab]->RowHidden( nRow, NULL, &nHiddenEndRow);
3829cdf0e10cSrcweir             if (nHeightEndRow < nRow)
3830cdf0e10cSrcweir                 nHeight = pTab[nTab]->GetRowHeight( nRow, NULL, &nHeightEndRow, false);
3831cdf0e10cSrcweir             if (    ((nStartFlags & CR_MANUALBREAK) != (nFlags & CR_MANUALBREAK)) ||
3832cdf0e10cSrcweir                     ((nStartFlags & CR_MANUALSIZE) != (nFlags & CR_MANUALSIZE)) ||
3833cdf0e10cSrcweir                     (bStartHidden != bHidden) ||
3834cdf0e10cSrcweir                     (bCareManualSize && (nStartFlags & CR_MANUALSIZE) && (nStartHeight != nHeight)) ||
3835cdf0e10cSrcweir                     (!bCareManualSize && ((nStartHeight != nHeight))))
3836cdf0e10cSrcweir                 return nRow;
3837cdf0e10cSrcweir         }
3838cdf0e10cSrcweir         return MAXROW+1;
3839cdf0e10cSrcweir     }
3840cdf0e10cSrcweir     return 0;
3841cdf0e10cSrcweir }
3842cdf0e10cSrcweir 
GetColDefault(SCTAB nTab,SCCOL nCol,SCROW nLastRow,SCROW & nDefault)3843cdf0e10cSrcweir sal_Bool ScDocument::GetColDefault( SCTAB nTab, SCCOL nCol, SCROW nLastRow, SCROW& nDefault)
3844cdf0e10cSrcweir {
3845cdf0e10cSrcweir     sal_Bool bRet(sal_False);
3846cdf0e10cSrcweir     nDefault = 0;
3847cdf0e10cSrcweir     ScDocAttrIterator aDocAttrItr(this, nTab, nCol, 0, nCol, nLastRow);
3848cdf0e10cSrcweir     SCCOL nColumn;
3849cdf0e10cSrcweir     SCROW nStartRow;
3850cdf0e10cSrcweir     SCROW nEndRow;
3851cdf0e10cSrcweir     const ScPatternAttr* pAttr = aDocAttrItr.GetNext(nColumn, nStartRow, nEndRow);
3852cdf0e10cSrcweir     if (nEndRow < nLastRow)
3853cdf0e10cSrcweir     {
3854cdf0e10cSrcweir         ScDefaultAttrSet aSet;
3855cdf0e10cSrcweir         ScDefaultAttrSet::iterator aItr = aSet.end();
3856cdf0e10cSrcweir         while (pAttr)
3857cdf0e10cSrcweir         {
3858cdf0e10cSrcweir             ScDefaultAttr aAttr(pAttr);
3859cdf0e10cSrcweir             aItr = aSet.find(aAttr);
3860cdf0e10cSrcweir             if (aItr == aSet.end())
3861cdf0e10cSrcweir             {
3862cdf0e10cSrcweir                 aAttr.nCount = static_cast<SCSIZE>(nEndRow - nStartRow + 1);
3863cdf0e10cSrcweir                 aAttr.nFirst = nStartRow;
3864cdf0e10cSrcweir                 aSet.insert(aAttr);
3865cdf0e10cSrcweir             }
3866cdf0e10cSrcweir             else
3867cdf0e10cSrcweir             {
3868cdf0e10cSrcweir                 aAttr.nCount = aItr->nCount + static_cast<SCSIZE>(nEndRow - nStartRow + 1);
3869cdf0e10cSrcweir                 aAttr.nFirst = aItr->nFirst;
3870cdf0e10cSrcweir                 aSet.erase(aItr);
3871cdf0e10cSrcweir                 aSet.insert(aAttr);
3872cdf0e10cSrcweir             }
3873cdf0e10cSrcweir             pAttr = aDocAttrItr.GetNext(nColumn, nStartRow, nEndRow);
3874cdf0e10cSrcweir         }
3875cdf0e10cSrcweir         ScDefaultAttrSet::iterator aDefaultItr = aSet.begin();
3876cdf0e10cSrcweir         aItr = aDefaultItr;
3877cdf0e10cSrcweir         aItr++;
3878cdf0e10cSrcweir         while (aItr != aSet.end())
3879cdf0e10cSrcweir         {
3880cdf0e10cSrcweir             // for entries with equal count, use the one with the lowest start row,
3881cdf0e10cSrcweir             // don't use the random order of pointer comparisons
3882cdf0e10cSrcweir             if ( aItr->nCount > aDefaultItr->nCount ||
3883cdf0e10cSrcweir                  ( aItr->nCount == aDefaultItr->nCount && aItr->nFirst < aDefaultItr->nFirst ) )
3884cdf0e10cSrcweir                 aDefaultItr = aItr;
3885cdf0e10cSrcweir             aItr++;
3886cdf0e10cSrcweir         }
3887cdf0e10cSrcweir         nDefault = aDefaultItr->nFirst;
3888cdf0e10cSrcweir         bRet = sal_True;
3889cdf0e10cSrcweir     }
3890cdf0e10cSrcweir     else
3891cdf0e10cSrcweir         bRet = sal_True;
3892cdf0e10cSrcweir     return bRet;
3893cdf0e10cSrcweir }
3894cdf0e10cSrcweir 
GetRowDefault(SCTAB,SCROW,SCCOL,SCCOL &)3895cdf0e10cSrcweir sal_Bool ScDocument::GetRowDefault( SCTAB /* nTab */, SCROW /* nRow */, SCCOL /* nLastCol */, SCCOL& /* nDefault */ )
3896cdf0e10cSrcweir {
3897cdf0e10cSrcweir     sal_Bool bRet(sal_False);
3898cdf0e10cSrcweir     return bRet;
3899cdf0e10cSrcweir }
3900cdf0e10cSrcweir 
StripHidden(SCCOL & rX1,SCROW & rY1,SCCOL & rX2,SCROW & rY2,SCTAB nTab)3901cdf0e10cSrcweir void ScDocument::StripHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2, SCTAB nTab )
3902cdf0e10cSrcweir {
3903cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3904cdf0e10cSrcweir         pTab[nTab]->StripHidden( rX1, rY1, rX2, rY2 );
3905cdf0e10cSrcweir }
3906cdf0e10cSrcweir 
3907cdf0e10cSrcweir 
ExtendHidden(SCCOL & rX1,SCROW & rY1,SCCOL & rX2,SCROW & rY2,SCTAB nTab)3908cdf0e10cSrcweir void ScDocument::ExtendHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2, SCTAB nTab )
3909cdf0e10cSrcweir {
3910cdf0e10cSrcweir     if ( ValidTab(nTab) && pTab[nTab] )
3911cdf0e10cSrcweir         pTab[nTab]->ExtendHidden( rX1, rY1, rX2, rY2 );
3912cdf0e10cSrcweir }
3913cdf0e10cSrcweir 
3914cdf0e10cSrcweir // Attribute    ----------------------------------------------------------
3915cdf0e10cSrcweir 
GetAttr(SCCOL nCol,SCROW nRow,SCTAB nTab,sal_uInt16 nWhich) const3916cdf0e10cSrcweir const SfxPoolItem* ScDocument::GetAttr( SCCOL nCol, SCROW nRow, SCTAB nTab, sal_uInt16 nWhich ) const
3917cdf0e10cSrcweir {
3918cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
3919cdf0e10cSrcweir     {
3920cdf0e10cSrcweir         const SfxPoolItem* pTemp = pTab[nTab]->GetAttr( nCol, nRow, nWhich );
3921cdf0e10cSrcweir         if (pTemp)
3922cdf0e10cSrcweir             return pTemp;
3923cdf0e10cSrcweir         else
3924cdf0e10cSrcweir         {
3925cdf0e10cSrcweir             DBG_ERROR( "Attribut Null" );
3926cdf0e10cSrcweir         }
3927cdf0e10cSrcweir     }
3928cdf0e10cSrcweir     return &xPoolHelper->GetDocPool()->GetDefaultItem( nWhich );
3929cdf0e10cSrcweir }
3930cdf0e10cSrcweir 
3931cdf0e10cSrcweir 
GetPattern(SCCOL nCol,SCROW nRow,SCTAB nTab) const3932cdf0e10cSrcweir const ScPatternAttr* ScDocument::GetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab ) const
3933cdf0e10cSrcweir {
3934cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
3935cdf0e10cSrcweir         return pTab[nTab]->GetPattern( nCol, nRow );
3936cdf0e10cSrcweir     return NULL;
3937cdf0e10cSrcweir }
3938cdf0e10cSrcweir 
3939cdf0e10cSrcweir 
GetMostUsedPattern(SCCOL nCol,SCROW nStartRow,SCROW nEndRow,SCTAB nTab) const3940cdf0e10cSrcweir const ScPatternAttr* ScDocument::GetMostUsedPattern( SCCOL nCol, SCROW nStartRow, SCROW nEndRow, SCTAB nTab ) const
3941cdf0e10cSrcweir {
3942cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
3943cdf0e10cSrcweir         return pTab[nTab]->GetMostUsedPattern( nCol, nStartRow, nEndRow );
3944cdf0e10cSrcweir     return NULL;
3945cdf0e10cSrcweir }
3946cdf0e10cSrcweir 
3947cdf0e10cSrcweir 
ApplyAttr(SCCOL nCol,SCROW nRow,SCTAB nTab,const SfxPoolItem & rAttr)3948cdf0e10cSrcweir void ScDocument::ApplyAttr( SCCOL nCol, SCROW nRow, SCTAB nTab, const SfxPoolItem& rAttr )
3949cdf0e10cSrcweir {
3950cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
3951cdf0e10cSrcweir         pTab[nTab]->ApplyAttr( nCol, nRow, rAttr );
3952cdf0e10cSrcweir }
3953cdf0e10cSrcweir 
3954cdf0e10cSrcweir 
ApplyPattern(SCCOL nCol,SCROW nRow,SCTAB nTab,const ScPatternAttr & rAttr)3955cdf0e10cSrcweir void ScDocument::ApplyPattern( SCCOL nCol, SCROW nRow, SCTAB nTab, const ScPatternAttr& rAttr )
3956cdf0e10cSrcweir {
3957cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
3958cdf0e10cSrcweir         pTab[nTab]->ApplyPattern( nCol, nRow, rAttr );
3959cdf0e10cSrcweir }
3960cdf0e10cSrcweir 
3961cdf0e10cSrcweir 
ApplyPatternArea(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,const ScMarkData & rMark,const ScPatternAttr & rAttr)3962cdf0e10cSrcweir void ScDocument::ApplyPatternArea( SCCOL nStartCol, SCROW nStartRow,
3963cdf0e10cSrcweir                         SCCOL nEndCol, SCROW nEndRow,
3964cdf0e10cSrcweir                         const ScMarkData& rMark,
3965cdf0e10cSrcweir                         const ScPatternAttr& rAttr )
3966cdf0e10cSrcweir {
3967cdf0e10cSrcweir     for (SCTAB i=0; i <= MAXTAB; i++)
3968cdf0e10cSrcweir         if (pTab[i])
3969cdf0e10cSrcweir             if (rMark.GetTableSelect(i))
3970cdf0e10cSrcweir                 pTab[i]->ApplyPatternArea( nStartCol, nStartRow, nEndCol, nEndRow, rAttr );
3971cdf0e10cSrcweir }
3972cdf0e10cSrcweir 
3973cdf0e10cSrcweir 
ApplyPatternAreaTab(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,SCTAB nTab,const ScPatternAttr & rAttr)3974cdf0e10cSrcweir void ScDocument::ApplyPatternAreaTab( SCCOL nStartCol, SCROW nStartRow,
3975cdf0e10cSrcweir                         SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, const ScPatternAttr& rAttr )
3976cdf0e10cSrcweir {
3977cdf0e10cSrcweir     if (VALIDTAB(nTab))
3978cdf0e10cSrcweir         if (pTab[nTab])
3979cdf0e10cSrcweir             pTab[nTab]->ApplyPatternArea( nStartCol, nStartRow, nEndCol, nEndRow, rAttr );
3980cdf0e10cSrcweir }
3981cdf0e10cSrcweir 
ApplyPooledPatternAreaTab(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,SCTAB nTab,const ScPatternAttr & rPooledAttr,const ScPatternAttr & rAttr)39823a02adb1SWang Lei void ScDocument::ApplyPooledPatternAreaTab( SCCOL nStartCol, SCROW nStartRow,
39833a02adb1SWang Lei                         SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, const ScPatternAttr& rPooledAttr, const ScPatternAttr& rAttr )
39843a02adb1SWang Lei {
39853a02adb1SWang Lei     if (VALIDTAB(nTab))
39863a02adb1SWang Lei         if (pTab[nTab])
39873a02adb1SWang Lei             pTab[nTab]->ApplyPooledPatternArea( nStartCol, nStartRow, nEndCol, nEndRow, rPooledAttr, rAttr );
39883a02adb1SWang Lei }
39893a02adb1SWang Lei 
ApplyPatternIfNumberformatIncompatible(const ScRange & rRange,const ScMarkData & rMark,const ScPatternAttr & rPattern,short nNewType)3990cdf0e10cSrcweir void ScDocument::ApplyPatternIfNumberformatIncompatible( const ScRange& rRange,
3991cdf0e10cSrcweir         const ScMarkData& rMark, const ScPatternAttr& rPattern, short nNewType )
3992cdf0e10cSrcweir {
3993cdf0e10cSrcweir     for (SCTAB i=0; i <= MAXTAB; i++)
3994cdf0e10cSrcweir         if (pTab[i])
3995cdf0e10cSrcweir             if (rMark.GetTableSelect(i))
3996cdf0e10cSrcweir                 pTab[i]->ApplyPatternIfNumberformatIncompatible( rRange, rPattern, nNewType );
3997cdf0e10cSrcweir }
3998cdf0e10cSrcweir 
3999cdf0e10cSrcweir 
ApplyStyle(SCCOL nCol,SCROW nRow,SCTAB nTab,const ScStyleSheet & rStyle)4000cdf0e10cSrcweir void ScDocument::ApplyStyle( SCCOL nCol, SCROW nRow, SCTAB nTab, const ScStyleSheet& rStyle)
4001cdf0e10cSrcweir {
4002cdf0e10cSrcweir     if (VALIDTAB(nTab))
4003cdf0e10cSrcweir         if (pTab[nTab])
4004cdf0e10cSrcweir             pTab[nTab]->ApplyStyle( nCol, nRow, rStyle );
4005cdf0e10cSrcweir }
4006cdf0e10cSrcweir 
4007cdf0e10cSrcweir 
ApplyStyleArea(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,const ScMarkData & rMark,const ScStyleSheet & rStyle)4008cdf0e10cSrcweir void ScDocument::ApplyStyleArea( SCCOL nStartCol, SCROW nStartRow,
4009cdf0e10cSrcweir                         SCCOL nEndCol, SCROW nEndRow,
4010cdf0e10cSrcweir                         const ScMarkData& rMark,
4011cdf0e10cSrcweir                         const ScStyleSheet& rStyle)
4012cdf0e10cSrcweir {
4013cdf0e10cSrcweir     for (SCTAB i=0; i <= MAXTAB; i++)
4014cdf0e10cSrcweir         if (pTab[i])
4015cdf0e10cSrcweir             if (rMark.GetTableSelect(i))
4016cdf0e10cSrcweir                 pTab[i]->ApplyStyleArea( nStartCol, nStartRow, nEndCol, nEndRow, rStyle );
4017cdf0e10cSrcweir }
4018cdf0e10cSrcweir 
4019cdf0e10cSrcweir 
ApplyStyleAreaTab(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,SCTAB nTab,const ScStyleSheet & rStyle)4020cdf0e10cSrcweir void ScDocument::ApplyStyleAreaTab( SCCOL nStartCol, SCROW nStartRow,
4021cdf0e10cSrcweir                         SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, const ScStyleSheet& rStyle)
4022cdf0e10cSrcweir {
4023cdf0e10cSrcweir     if (VALIDTAB(nTab))
4024cdf0e10cSrcweir         if (pTab[nTab])
4025cdf0e10cSrcweir             pTab[nTab]->ApplyStyleArea( nStartCol, nStartRow, nEndCol, nEndRow, rStyle );
4026cdf0e10cSrcweir }
4027cdf0e10cSrcweir 
4028cdf0e10cSrcweir 
ApplySelectionStyle(const ScStyleSheet & rStyle,const ScMarkData & rMark)4029cdf0e10cSrcweir void ScDocument::ApplySelectionStyle(const ScStyleSheet& rStyle, const ScMarkData& rMark)
4030cdf0e10cSrcweir {
4031cdf0e10cSrcweir     // ApplySelectionStyle needs multi mark
4032cdf0e10cSrcweir     if ( rMark.IsMarked() && !rMark.IsMultiMarked() )
4033cdf0e10cSrcweir     {
4034cdf0e10cSrcweir         ScRange aRange;
4035cdf0e10cSrcweir         rMark.GetMarkArea( aRange );
4036cdf0e10cSrcweir         ApplyStyleArea( aRange.aStart.Col(), aRange.aStart.Row(),
4037cdf0e10cSrcweir                           aRange.aEnd.Col(), aRange.aEnd.Row(), rMark, rStyle );
4038cdf0e10cSrcweir     }
4039cdf0e10cSrcweir     else
4040cdf0e10cSrcweir     {
4041cdf0e10cSrcweir         for (SCTAB i=0; i<=MAXTAB; i++)
4042cdf0e10cSrcweir             if ( pTab[i] && rMark.GetTableSelect(i) )
4043cdf0e10cSrcweir                     pTab[i]->ApplySelectionStyle( rStyle, rMark );
4044cdf0e10cSrcweir     }
4045cdf0e10cSrcweir }
4046cdf0e10cSrcweir 
4047cdf0e10cSrcweir 
ApplySelectionLineStyle(const ScMarkData & rMark,const SvxBorderLine * pLine,sal_Bool bColorOnly)4048cdf0e10cSrcweir void ScDocument::ApplySelectionLineStyle( const ScMarkData& rMark,
4049cdf0e10cSrcweir                     const SvxBorderLine* pLine, sal_Bool bColorOnly )
4050cdf0e10cSrcweir {
4051cdf0e10cSrcweir     if ( bColorOnly && !pLine )
4052cdf0e10cSrcweir         return;
4053cdf0e10cSrcweir 
4054cdf0e10cSrcweir     for (SCTAB i=0; i<=MAXTAB; i++)
4055cdf0e10cSrcweir         if (pTab[i])
4056cdf0e10cSrcweir             if (rMark.GetTableSelect(i))
4057cdf0e10cSrcweir                 pTab[i]->ApplySelectionLineStyle( rMark, pLine, bColorOnly );
4058cdf0e10cSrcweir }
4059cdf0e10cSrcweir 
4060cdf0e10cSrcweir 
GetStyle(SCCOL nCol,SCROW nRow,SCTAB nTab) const4061cdf0e10cSrcweir const ScStyleSheet* ScDocument::GetStyle( SCCOL nCol, SCROW nRow, SCTAB nTab ) const
4062cdf0e10cSrcweir {
4063cdf0e10cSrcweir     if ( VALIDTAB(nTab) && pTab[nTab] )
4064cdf0e10cSrcweir         return pTab[nTab]->GetStyle(nCol, nRow);
4065cdf0e10cSrcweir     else
4066cdf0e10cSrcweir         return NULL;
4067cdf0e10cSrcweir }
4068cdf0e10cSrcweir 
4069cdf0e10cSrcweir 
GetSelectionStyle(const ScMarkData & rMark) const4070cdf0e10cSrcweir const ScStyleSheet* ScDocument::GetSelectionStyle( const ScMarkData& rMark ) const
4071cdf0e10cSrcweir {
4072cdf0e10cSrcweir     sal_Bool    bEqual = sal_True;
4073cdf0e10cSrcweir     sal_Bool    bFound;
4074cdf0e10cSrcweir 
4075cdf0e10cSrcweir     const ScStyleSheet* pStyle = NULL;
4076cdf0e10cSrcweir     const ScStyleSheet* pNewStyle;
4077cdf0e10cSrcweir 
4078cdf0e10cSrcweir     if ( rMark.IsMultiMarked() )
4079cdf0e10cSrcweir         for (SCTAB i=0; i<=MAXTAB && bEqual; i++)
4080cdf0e10cSrcweir             if (pTab[i] && rMark.GetTableSelect(i))
4081cdf0e10cSrcweir             {
4082cdf0e10cSrcweir                 pNewStyle = pTab[i]->GetSelectionStyle( rMark, bFound );
4083cdf0e10cSrcweir                 if (bFound)
4084cdf0e10cSrcweir                 {
4085cdf0e10cSrcweir                     if ( !pNewStyle || ( pStyle && pNewStyle != pStyle ) )
4086cdf0e10cSrcweir                         bEqual = sal_False;                                             // unterschiedliche
4087cdf0e10cSrcweir                     pStyle = pNewStyle;
4088cdf0e10cSrcweir                 }
4089cdf0e10cSrcweir             }
4090cdf0e10cSrcweir     if ( rMark.IsMarked() )
4091cdf0e10cSrcweir     {
4092cdf0e10cSrcweir         ScRange aRange;
4093cdf0e10cSrcweir         rMark.GetMarkArea( aRange );
4094cdf0e10cSrcweir         for (SCTAB i=aRange.aStart.Tab(); i<=aRange.aEnd.Tab() && bEqual; i++)
4095cdf0e10cSrcweir             if (pTab[i] && rMark.GetTableSelect(i))
4096cdf0e10cSrcweir             {
4097cdf0e10cSrcweir                 pNewStyle = pTab[i]->GetAreaStyle( bFound,
4098cdf0e10cSrcweir                                         aRange.aStart.Col(), aRange.aStart.Row(),
4099cdf0e10cSrcweir                                         aRange.aEnd.Col(),   aRange.aEnd.Row()   );
4100cdf0e10cSrcweir                 if (bFound)
4101cdf0e10cSrcweir                 {
4102cdf0e10cSrcweir                     if ( !pNewStyle || ( pStyle && pNewStyle != pStyle ) )
4103cdf0e10cSrcweir                         bEqual = sal_False;                                             // unterschiedliche
4104cdf0e10cSrcweir                     pStyle = pNewStyle;
4105cdf0e10cSrcweir                 }
4106cdf0e10cSrcweir             }
4107cdf0e10cSrcweir     }
4108cdf0e10cSrcweir 
4109cdf0e10cSrcweir     return bEqual ? pStyle : NULL;
4110cdf0e10cSrcweir }
4111cdf0e10cSrcweir 
4112cdf0e10cSrcweir 
StyleSheetChanged(const SfxStyleSheetBase * pStyleSheet,sal_Bool bRemoved,OutputDevice * pDev,double nPPTX,double nPPTY,const Fraction & rZoomX,const Fraction & rZoomY)4113cdf0e10cSrcweir void ScDocument::StyleSheetChanged( const SfxStyleSheetBase* pStyleSheet, sal_Bool bRemoved,
4114cdf0e10cSrcweir                                     OutputDevice* pDev,
4115cdf0e10cSrcweir                                     double nPPTX, double nPPTY,
4116cdf0e10cSrcweir                                     const Fraction& rZoomX, const Fraction& rZoomY )
4117cdf0e10cSrcweir {
4118cdf0e10cSrcweir     for (SCTAB i=0; i <= MAXTAB; i++)
4119cdf0e10cSrcweir         if (pTab[i])
4120cdf0e10cSrcweir             pTab[i]->StyleSheetChanged
4121cdf0e10cSrcweir                 ( pStyleSheet, bRemoved, pDev, nPPTX, nPPTY, rZoomX, rZoomY );
4122cdf0e10cSrcweir 
4123cdf0e10cSrcweir     if ( pStyleSheet && pStyleSheet->GetName() == ScGlobal::GetRscString(STR_STYLENAME_STANDARD) )
4124cdf0e10cSrcweir     {
4125cdf0e10cSrcweir         // update attributes for all note objects
4126cdf0e10cSrcweir         ScDetectiveFunc::UpdateAllComments( *this );
4127cdf0e10cSrcweir     }
4128cdf0e10cSrcweir }
4129cdf0e10cSrcweir 
4130cdf0e10cSrcweir 
IsStyleSheetUsed(const ScStyleSheet & rStyle,sal_Bool bGatherAllStyles) const4131cdf0e10cSrcweir sal_Bool ScDocument::IsStyleSheetUsed( const ScStyleSheet& rStyle, sal_Bool bGatherAllStyles ) const
4132cdf0e10cSrcweir {
4133cdf0e10cSrcweir     if ( bStyleSheetUsageInvalid || rStyle.GetUsage() == ScStyleSheet::UNKNOWN )
4134cdf0e10cSrcweir     {
4135cdf0e10cSrcweir         if ( bGatherAllStyles )
4136cdf0e10cSrcweir         {
4137cdf0e10cSrcweir             SfxStyleSheetIterator aIter( xPoolHelper->GetStylePool(),
4138cdf0e10cSrcweir                     SFX_STYLE_FAMILY_PARA );
4139cdf0e10cSrcweir             for ( const SfxStyleSheetBase* pStyle = aIter.First(); pStyle;
4140cdf0e10cSrcweir                                            pStyle = aIter.Next() )
4141cdf0e10cSrcweir             {
4142cdf0e10cSrcweir                 const ScStyleSheet* pScStyle = PTR_CAST( ScStyleSheet, pStyle );
4143cdf0e10cSrcweir                 if ( pScStyle )
4144cdf0e10cSrcweir                     pScStyle->SetUsage( ScStyleSheet::NOTUSED );
4145cdf0e10cSrcweir             }
4146cdf0e10cSrcweir         }
4147cdf0e10cSrcweir 
4148cdf0e10cSrcweir         sal_Bool bIsUsed = sal_False;
4149cdf0e10cSrcweir 
4150cdf0e10cSrcweir         for ( SCTAB i=0; i<=MAXTAB; i++ )
4151cdf0e10cSrcweir         {
4152cdf0e10cSrcweir             if ( pTab[i] )
4153cdf0e10cSrcweir             {
4154cdf0e10cSrcweir                 if ( pTab[i]->IsStyleSheetUsed( rStyle, bGatherAllStyles ) )
4155cdf0e10cSrcweir                 {
4156cdf0e10cSrcweir                     if ( !bGatherAllStyles )
4157cdf0e10cSrcweir                         return sal_True;
4158cdf0e10cSrcweir                     bIsUsed = sal_True;
4159cdf0e10cSrcweir                 }
4160cdf0e10cSrcweir             }
4161cdf0e10cSrcweir         }
4162cdf0e10cSrcweir 
4163cdf0e10cSrcweir         if ( bGatherAllStyles )
4164cdf0e10cSrcweir             bStyleSheetUsageInvalid = sal_False;
4165cdf0e10cSrcweir 
4166cdf0e10cSrcweir         return bIsUsed;
4167cdf0e10cSrcweir     }
4168cdf0e10cSrcweir 
4169cdf0e10cSrcweir     return rStyle.GetUsage() == ScStyleSheet::USED;
4170cdf0e10cSrcweir }
4171cdf0e10cSrcweir 
4172cdf0e10cSrcweir 
ApplyFlagsTab(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,SCTAB nTab,sal_Int16 nFlags)4173cdf0e10cSrcweir sal_Bool ScDocument::ApplyFlagsTab( SCCOL nStartCol, SCROW nStartRow,
4174cdf0e10cSrcweir                         SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, sal_Int16 nFlags )
4175cdf0e10cSrcweir {
4176cdf0e10cSrcweir     if (VALIDTAB(nTab))
4177cdf0e10cSrcweir         if (pTab[nTab])
4178cdf0e10cSrcweir             return pTab[nTab]->ApplyFlags( nStartCol, nStartRow, nEndCol, nEndRow, nFlags );
4179cdf0e10cSrcweir 
4180982a05a9Smseidel     DBG_ERROR("ApplyFlags: Wrong table");
4181cdf0e10cSrcweir     return sal_False;
4182cdf0e10cSrcweir }
4183cdf0e10cSrcweir 
4184cdf0e10cSrcweir 
RemoveFlagsTab(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,SCTAB nTab,sal_Int16 nFlags)4185cdf0e10cSrcweir sal_Bool ScDocument::RemoveFlagsTab( SCCOL nStartCol, SCROW nStartRow,
4186cdf0e10cSrcweir                         SCCOL nEndCol, SCROW nEndRow, SCTAB nTab, sal_Int16 nFlags )
4187cdf0e10cSrcweir {
4188cdf0e10cSrcweir     if (VALIDTAB(nTab))
4189cdf0e10cSrcweir         if (pTab[nTab])
4190cdf0e10cSrcweir             return pTab[nTab]->RemoveFlags( nStartCol, nStartRow, nEndCol, nEndRow, nFlags );
4191cdf0e10cSrcweir 
4192982a05a9Smseidel     DBG_ERROR("RemoveFlags: Wrong table");
4193cdf0e10cSrcweir     return sal_False;
4194cdf0e10cSrcweir }
4195cdf0e10cSrcweir 
4196cdf0e10cSrcweir 
SetPattern(SCCOL nCol,SCROW nRow,SCTAB nTab,const ScPatternAttr & rAttr,sal_Bool bPutToPool)4197cdf0e10cSrcweir void ScDocument::SetPattern( SCCOL nCol, SCROW nRow, SCTAB nTab, const ScPatternAttr& rAttr,
4198cdf0e10cSrcweir                                 sal_Bool bPutToPool )
4199cdf0e10cSrcweir {
4200cdf0e10cSrcweir     if (VALIDTAB(nTab))
4201cdf0e10cSrcweir         if (pTab[nTab])
4202cdf0e10cSrcweir             pTab[nTab]->SetPattern( nCol, nRow, rAttr, bPutToPool );
4203cdf0e10cSrcweir }
4204cdf0e10cSrcweir 
4205cdf0e10cSrcweir 
SetPattern(const ScAddress & rPos,const ScPatternAttr & rAttr,sal_Bool bPutToPool)4206cdf0e10cSrcweir void ScDocument::SetPattern( const ScAddress& rPos, const ScPatternAttr& rAttr,
4207cdf0e10cSrcweir                                 sal_Bool bPutToPool )
4208cdf0e10cSrcweir {
4209cdf0e10cSrcweir     SCTAB nTab = rPos.Tab();
4210cdf0e10cSrcweir     if (pTab[nTab])
4211cdf0e10cSrcweir         pTab[nTab]->SetPattern( rPos, rAttr, bPutToPool );
4212cdf0e10cSrcweir }
4213cdf0e10cSrcweir 
4214cdf0e10cSrcweir 
CreateSelectionPattern(const ScMarkData & rMark,sal_Bool bDeep)4215cdf0e10cSrcweir ScPatternAttr* ScDocument::CreateSelectionPattern( const ScMarkData& rMark, sal_Bool bDeep )
4216cdf0e10cSrcweir {
4217cdf0e10cSrcweir     ScMergePatternState aState;
4218cdf0e10cSrcweir 
4219cdf0e10cSrcweir     if ( rMark.IsMultiMarked() )                                // multi selection
4220cdf0e10cSrcweir     {
4221cdf0e10cSrcweir         for (SCTAB i=0; i<=MAXTAB; i++)
4222cdf0e10cSrcweir             if (pTab[i] && rMark.GetTableSelect(i))
4223cdf0e10cSrcweir                 pTab[i]->MergeSelectionPattern( aState, rMark, bDeep );
4224cdf0e10cSrcweir     }
4225982a05a9Smseidel     if ( rMark.IsMarked() )                                     // simple selection
4226cdf0e10cSrcweir     {
4227cdf0e10cSrcweir         ScRange aRange;
4228cdf0e10cSrcweir         rMark.GetMarkArea(aRange);
4229cdf0e10cSrcweir         for (SCTAB i=0; i<=MAXTAB; i++)
4230cdf0e10cSrcweir             if (pTab[i] && rMark.GetTableSelect(i))
4231cdf0e10cSrcweir                 pTab[i]->MergePatternArea( aState,
4232cdf0e10cSrcweir                                 aRange.aStart.Col(), aRange.aStart.Row(),
4233cdf0e10cSrcweir                                 aRange.aEnd.Col(), aRange.aEnd.Row(), bDeep );
4234cdf0e10cSrcweir     }
4235cdf0e10cSrcweir 
4236cdf0e10cSrcweir     DBG_ASSERT( aState.pItemSet, "SelectionPattern Null" );
4237cdf0e10cSrcweir     if (aState.pItemSet)
4238cdf0e10cSrcweir         return new ScPatternAttr( aState.pItemSet );
4239cdf0e10cSrcweir     else
4240cdf0e10cSrcweir         return new ScPatternAttr( GetPool() ); // empty
4241cdf0e10cSrcweir }
4242cdf0e10cSrcweir 
4243cdf0e10cSrcweir 
GetSelectionPattern(const ScMarkData & rMark,sal_Bool bDeep)4244cdf0e10cSrcweir const ScPatternAttr* ScDocument::GetSelectionPattern( const ScMarkData& rMark, sal_Bool bDeep )
4245cdf0e10cSrcweir {
4246cdf0e10cSrcweir     delete pSelectionAttr;
4247cdf0e10cSrcweir     pSelectionAttr = CreateSelectionPattern( rMark, bDeep );
4248cdf0e10cSrcweir     return pSelectionAttr;
4249cdf0e10cSrcweir }
4250cdf0e10cSrcweir 
4251cdf0e10cSrcweir 
GetSelectionFrame(const ScMarkData & rMark,SvxBoxItem & rLineOuter,SvxBoxInfoItem & rLineInner)4252cdf0e10cSrcweir void ScDocument::GetSelectionFrame( const ScMarkData& rMark,
4253cdf0e10cSrcweir                                     SvxBoxItem&     rLineOuter,
4254cdf0e10cSrcweir                                     SvxBoxInfoItem& rLineInner )
4255cdf0e10cSrcweir {
4256cdf0e10cSrcweir     rLineOuter.SetLine(NULL, BOX_LINE_TOP);
4257cdf0e10cSrcweir     rLineOuter.SetLine(NULL, BOX_LINE_BOTTOM);
4258cdf0e10cSrcweir     rLineOuter.SetLine(NULL, BOX_LINE_LEFT);
4259cdf0e10cSrcweir     rLineOuter.SetLine(NULL, BOX_LINE_RIGHT);
4260cdf0e10cSrcweir     rLineOuter.SetDistance(0);
4261cdf0e10cSrcweir 
4262cdf0e10cSrcweir     rLineInner.SetLine(NULL, BOXINFO_LINE_HORI);
4263cdf0e10cSrcweir     rLineInner.SetLine(NULL, BOXINFO_LINE_VERT);
4264cdf0e10cSrcweir     rLineInner.SetTable(sal_True);
4265cdf0e10cSrcweir     rLineInner.SetDist(sal_True);
4266cdf0e10cSrcweir     rLineInner.SetMinDist(sal_False);
4267cdf0e10cSrcweir 
4268cdf0e10cSrcweir     ScLineFlags aFlags;
4269cdf0e10cSrcweir 
4270cdf0e10cSrcweir     if (rMark.IsMarked())
4271cdf0e10cSrcweir     {
4272cdf0e10cSrcweir         ScRange aRange;
4273cdf0e10cSrcweir         rMark.GetMarkArea(aRange);
4274cdf0e10cSrcweir         rLineInner.EnableHor( aRange.aStart.Row() != aRange.aEnd.Row() );
4275cdf0e10cSrcweir         rLineInner.EnableVer( aRange.aStart.Col() != aRange.aEnd.Col() );
4276cdf0e10cSrcweir         for (SCTAB i=0; i<=MAXTAB; i++)
4277cdf0e10cSrcweir             if (pTab[i] && rMark.GetTableSelect(i))
4278cdf0e10cSrcweir                 pTab[i]->MergeBlockFrame( &rLineOuter, &rLineInner, aFlags,
4279cdf0e10cSrcweir                                           aRange.aStart.Col(), aRange.aStart.Row(),
4280cdf0e10cSrcweir                                           aRange.aEnd.Col(),   aRange.aEnd.Row() );
4281cdf0e10cSrcweir     }
4282cdf0e10cSrcweir 
4283cdf0e10cSrcweir         // Don't care Status auswerten
4284cdf0e10cSrcweir 
4285cdf0e10cSrcweir     rLineInner.SetValid( VALID_LEFT,   ( aFlags.nLeft != SC_LINE_DONTCARE ) );
4286cdf0e10cSrcweir     rLineInner.SetValid( VALID_RIGHT,  ( aFlags.nRight != SC_LINE_DONTCARE ) );
4287cdf0e10cSrcweir     rLineInner.SetValid( VALID_TOP,    ( aFlags.nTop != SC_LINE_DONTCARE ) );
4288cdf0e10cSrcweir     rLineInner.SetValid( VALID_BOTTOM, ( aFlags.nBottom != SC_LINE_DONTCARE ) );
4289cdf0e10cSrcweir     rLineInner.SetValid( VALID_HORI,   ( aFlags.nHori != SC_LINE_DONTCARE ) );
4290cdf0e10cSrcweir     rLineInner.SetValid( VALID_VERT,   ( aFlags.nVert != SC_LINE_DONTCARE ) );
4291cdf0e10cSrcweir }
4292cdf0e10cSrcweir 
4293cdf0e10cSrcweir 
HasAttrib(SCCOL nCol1,SCROW nRow1,SCTAB nTab1,SCCOL nCol2,SCROW nRow2,SCTAB nTab2,sal_uInt16 nMask)4294cdf0e10cSrcweir bool ScDocument::HasAttrib( SCCOL nCol1, SCROW nRow1, SCTAB nTab1,
4295cdf0e10cSrcweir                             SCCOL nCol2, SCROW nRow2, SCTAB nTab2, sal_uInt16 nMask )
4296cdf0e10cSrcweir {
4297cdf0e10cSrcweir     if ( nMask & HASATTR_ROTATE )
4298cdf0e10cSrcweir     {
4299982a05a9Smseidel         // Attribut im Dokument überhaupt verwendet?
4300cdf0e10cSrcweir         // (wie in fillinfo)
4301cdf0e10cSrcweir 
4302cdf0e10cSrcweir         ScDocumentPool* pPool = xPoolHelper->GetDocPool();
4303cdf0e10cSrcweir 
4304cdf0e10cSrcweir         sal_Bool bAnyItem = sal_False;
4305cdf0e10cSrcweir         sal_uInt32 nRotCount = pPool->GetItemCount2( ATTR_ROTATE_VALUE );
4306cdf0e10cSrcweir         for (sal_uInt32 nItem=0; nItem<nRotCount; nItem++)
4307cdf0e10cSrcweir         {
4308cdf0e10cSrcweir             const SfxPoolItem* pItem = pPool->GetItem2( ATTR_ROTATE_VALUE, nItem );
4309cdf0e10cSrcweir             if ( pItem )
4310cdf0e10cSrcweir             {
4311cdf0e10cSrcweir                 // 90 or 270 degrees is former SvxOrientationItem - only look for other values
4312cdf0e10cSrcweir                 // (see ScPatternAttr::GetCellOrientation)
4313cdf0e10cSrcweir                 sal_Int32 nAngle = static_cast<const SfxInt32Item*>(pItem)->GetValue();
4314cdf0e10cSrcweir                 if ( nAngle != 0 && nAngle != 9000 && nAngle != 27000 )
4315cdf0e10cSrcweir                 {
4316cdf0e10cSrcweir                     bAnyItem = sal_True;
4317cdf0e10cSrcweir                     break;
4318cdf0e10cSrcweir                 }
4319cdf0e10cSrcweir             }
4320cdf0e10cSrcweir         }
4321cdf0e10cSrcweir         if (!bAnyItem)
4322cdf0e10cSrcweir             nMask &= ~HASATTR_ROTATE;
4323cdf0e10cSrcweir     }
4324cdf0e10cSrcweir 
4325cdf0e10cSrcweir     if ( nMask & HASATTR_RTL )
4326cdf0e10cSrcweir     {
4327cdf0e10cSrcweir         // first check if right-to left is in the pool at all
4328cdf0e10cSrcweir         // (the same item is used in cell and page format)
4329cdf0e10cSrcweir 
4330cdf0e10cSrcweir         ScDocumentPool* pPool = xPoolHelper->GetDocPool();
4331cdf0e10cSrcweir 
4332cdf0e10cSrcweir         sal_Bool bHasRtl = sal_False;
4333cdf0e10cSrcweir         sal_uInt32 nDirCount = pPool->GetItemCount2( ATTR_WRITINGDIR );
4334cdf0e10cSrcweir         for (sal_uInt32 nItem=0; nItem<nDirCount; nItem++)
4335cdf0e10cSrcweir         {
4336cdf0e10cSrcweir             const SfxPoolItem* pItem = pPool->GetItem2( ATTR_WRITINGDIR, nItem );
4337cdf0e10cSrcweir             if ( pItem && ((const SvxFrameDirectionItem*)pItem)->GetValue() == FRMDIR_HORI_RIGHT_TOP )
4338cdf0e10cSrcweir             {
4339cdf0e10cSrcweir                 bHasRtl = sal_True;
4340cdf0e10cSrcweir                 break;
4341cdf0e10cSrcweir             }
4342cdf0e10cSrcweir         }
4343cdf0e10cSrcweir         if (!bHasRtl)
4344cdf0e10cSrcweir             nMask &= ~HASATTR_RTL;
4345cdf0e10cSrcweir     }
4346cdf0e10cSrcweir 
4347cdf0e10cSrcweir     if (!nMask)
4348cdf0e10cSrcweir         return false;
4349cdf0e10cSrcweir 
4350cdf0e10cSrcweir     bool bFound = false;
4351cdf0e10cSrcweir     for (SCTAB i=nTab1; i<=nTab2 && !bFound; i++)
4352cdf0e10cSrcweir         if (pTab[i])
4353cdf0e10cSrcweir         {
4354cdf0e10cSrcweir             if ( nMask & HASATTR_RTL )
4355cdf0e10cSrcweir             {
4356cdf0e10cSrcweir                 if ( GetEditTextDirection(i) == EE_HTEXTDIR_R2L ) // sheet default
4357cdf0e10cSrcweir                     bFound = true;
4358cdf0e10cSrcweir             }
4359cdf0e10cSrcweir             if ( nMask & HASATTR_RIGHTORCENTER )
4360cdf0e10cSrcweir             {
4361cdf0e10cSrcweir                 // On a RTL sheet, don't start to look for the default left value
4362cdf0e10cSrcweir                 // (which is then logically right), instead always assume sal_True.
4363cdf0e10cSrcweir                 // That way, ScAttrArray::HasAttrib doesn't have to handle RTL sheets.
4364cdf0e10cSrcweir 
4365cdf0e10cSrcweir                 if ( IsLayoutRTL(i) )
4366cdf0e10cSrcweir                     bFound = true;
4367cdf0e10cSrcweir             }
4368cdf0e10cSrcweir 
4369cdf0e10cSrcweir             if ( !bFound )
4370cdf0e10cSrcweir                 bFound = pTab[i]->HasAttrib( nCol1, nRow1, nCol2, nRow2, nMask );
4371cdf0e10cSrcweir         }
4372cdf0e10cSrcweir 
4373cdf0e10cSrcweir     return bFound;
4374cdf0e10cSrcweir }
4375cdf0e10cSrcweir 
HasAttrib(const ScRange & rRange,sal_uInt16 nMask)4376cdf0e10cSrcweir bool ScDocument::HasAttrib( const ScRange& rRange, sal_uInt16 nMask )
4377cdf0e10cSrcweir {
4378cdf0e10cSrcweir     return HasAttrib( rRange.aStart.Col(), rRange.aStart.Row(), rRange.aStart.Tab(),
4379cdf0e10cSrcweir                       rRange.aEnd.Col(),   rRange.aEnd.Row(),   rRange.aEnd.Tab(),
4380cdf0e10cSrcweir                       nMask );
4381cdf0e10cSrcweir }
4382cdf0e10cSrcweir 
FindMaxRotCol(SCTAB nTab,RowInfo * pRowInfo,SCSIZE nArrCount,SCCOL nX1,SCCOL nX2) const4383cdf0e10cSrcweir void ScDocument::FindMaxRotCol( SCTAB nTab, RowInfo* pRowInfo, SCSIZE nArrCount,
4384cdf0e10cSrcweir                                 SCCOL nX1, SCCOL nX2 ) const
4385cdf0e10cSrcweir {
4386cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
4387cdf0e10cSrcweir         pTab[nTab]->FindMaxRotCol( pRowInfo, nArrCount, nX1, nX2 );
4388cdf0e10cSrcweir     else
4389cdf0e10cSrcweir     {
4390982a05a9Smseidel         DBG_ERRORFILE("FindMaxRotCol: Wrong table");
4391cdf0e10cSrcweir     }
4392cdf0e10cSrcweir }
4393cdf0e10cSrcweir 
GetBorderLines(SCCOL nCol,SCROW nRow,SCTAB nTab,const SvxBorderLine ** ppLeft,const SvxBorderLine ** ppTop,const SvxBorderLine ** ppRight,const SvxBorderLine ** ppBottom) const4394cdf0e10cSrcweir void ScDocument::GetBorderLines( SCCOL nCol, SCROW nRow, SCTAB nTab,
4395cdf0e10cSrcweir                         const SvxBorderLine** ppLeft, const SvxBorderLine** ppTop,
4396cdf0e10cSrcweir                         const SvxBorderLine** ppRight, const SvxBorderLine** ppBottom ) const
4397cdf0e10cSrcweir {
4398982a05a9Smseidel     //! Seitengrenzen für Druck berücksichtigen !!!!!
4399cdf0e10cSrcweir 
4400cdf0e10cSrcweir     const SvxBoxItem* pThisAttr = (const SvxBoxItem*) GetEffItem( nCol, nRow, nTab, ATTR_BORDER );
4401cdf0e10cSrcweir     DBG_ASSERT(pThisAttr,"wo ist das Attribut?");
4402cdf0e10cSrcweir 
4403cdf0e10cSrcweir     const SvxBorderLine* pLeftLine   = pThisAttr->GetLeft();
4404cdf0e10cSrcweir     const SvxBorderLine* pTopLine    = pThisAttr->GetTop();
4405cdf0e10cSrcweir     const SvxBorderLine* pRightLine  = pThisAttr->GetRight();
4406cdf0e10cSrcweir     const SvxBorderLine* pBottomLine = pThisAttr->GetBottom();
4407cdf0e10cSrcweir 
4408cdf0e10cSrcweir     if ( nCol > 0 )
4409cdf0e10cSrcweir     {
4410cdf0e10cSrcweir         const SvxBorderLine* pOther = ((const SvxBoxItem*)
4411cdf0e10cSrcweir                                 GetEffItem( nCol-1, nRow, nTab, ATTR_BORDER ))->GetRight();
4412cdf0e10cSrcweir         if ( ScHasPriority( pOther, pLeftLine ) )
4413cdf0e10cSrcweir             pLeftLine = pOther;
4414cdf0e10cSrcweir     }
4415cdf0e10cSrcweir     if ( nRow > 0 )
4416cdf0e10cSrcweir     {
4417cdf0e10cSrcweir         const SvxBorderLine* pOther = ((const SvxBoxItem*)
4418cdf0e10cSrcweir                                 GetEffItem( nCol, nRow-1, nTab, ATTR_BORDER ))->GetBottom();
4419cdf0e10cSrcweir         if ( ScHasPriority( pOther, pTopLine ) )
4420cdf0e10cSrcweir             pTopLine = pOther;
4421cdf0e10cSrcweir     }
4422cdf0e10cSrcweir     if ( nCol < MAXCOL )
4423cdf0e10cSrcweir     {
4424cdf0e10cSrcweir         const SvxBorderLine* pOther = ((const SvxBoxItem*)
4425cdf0e10cSrcweir                                 GetEffItem( nCol+1, nRow, nTab, ATTR_BORDER ))->GetLeft();
4426cdf0e10cSrcweir         if ( ScHasPriority( pOther, pRightLine ) )
4427cdf0e10cSrcweir             pRightLine = pOther;
4428cdf0e10cSrcweir     }
4429cdf0e10cSrcweir     if ( nRow < MAXROW )
4430cdf0e10cSrcweir     {
4431cdf0e10cSrcweir         const SvxBorderLine* pOther = ((const SvxBoxItem*)
4432cdf0e10cSrcweir                                 GetEffItem( nCol, nRow+1, nTab, ATTR_BORDER ))->GetTop();
4433cdf0e10cSrcweir         if ( ScHasPriority( pOther, pBottomLine ) )
4434cdf0e10cSrcweir             pBottomLine = pOther;
4435cdf0e10cSrcweir     }
4436cdf0e10cSrcweir 
4437cdf0e10cSrcweir     if (ppLeft)
4438cdf0e10cSrcweir         *ppLeft = pLeftLine;
4439cdf0e10cSrcweir     if (ppTop)
4440cdf0e10cSrcweir         *ppTop = pTopLine;
4441cdf0e10cSrcweir     if (ppRight)
4442cdf0e10cSrcweir         *ppRight = pRightLine;
4443cdf0e10cSrcweir     if (ppBottom)
4444cdf0e10cSrcweir         *ppBottom = pBottomLine;
4445cdf0e10cSrcweir }
4446cdf0e10cSrcweir 
IsBlockEmpty(SCTAB nTab,SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,bool bIgnoreNotes) const4447cdf0e10cSrcweir sal_Bool ScDocument::IsBlockEmpty( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow,
4448cdf0e10cSrcweir                                         SCCOL nEndCol, SCROW nEndRow, bool bIgnoreNotes ) const
4449cdf0e10cSrcweir {
4450cdf0e10cSrcweir     if (VALIDTAB(nTab))
4451cdf0e10cSrcweir         if (pTab[nTab])
4452cdf0e10cSrcweir             return pTab[nTab]->IsBlockEmpty( nStartCol, nStartRow, nEndCol, nEndRow, bIgnoreNotes );
4453cdf0e10cSrcweir 
4454982a05a9Smseidel     DBG_ERROR("Wrong table number");
4455cdf0e10cSrcweir     return sal_False;
4456cdf0e10cSrcweir }
4457cdf0e10cSrcweir 
4458cdf0e10cSrcweir 
LockTable(SCTAB nTab)4459cdf0e10cSrcweir void ScDocument::LockTable(SCTAB nTab)
4460cdf0e10cSrcweir {
4461cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
4462cdf0e10cSrcweir         pTab[nTab]->LockTable();
4463cdf0e10cSrcweir     else
4464cdf0e10cSrcweir     {
4465982a05a9Smseidel         DBG_ERROR("Wrong table number");
4466cdf0e10cSrcweir     }
4467cdf0e10cSrcweir }
4468cdf0e10cSrcweir 
4469cdf0e10cSrcweir 
UnlockTable(SCTAB nTab)4470cdf0e10cSrcweir void ScDocument::UnlockTable(SCTAB nTab)
4471cdf0e10cSrcweir {
4472cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
4473cdf0e10cSrcweir         pTab[nTab]->UnlockTable();
4474cdf0e10cSrcweir     else
4475cdf0e10cSrcweir     {
4476982a05a9Smseidel         DBG_ERROR("Wrong table number");
4477cdf0e10cSrcweir     }
4478cdf0e10cSrcweir }
4479cdf0e10cSrcweir 
4480cdf0e10cSrcweir 
IsBlockEditable(SCTAB nTab,SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,sal_Bool * pOnlyNotBecauseOfMatrix) const4481cdf0e10cSrcweir sal_Bool ScDocument::IsBlockEditable( SCTAB nTab, SCCOL nStartCol, SCROW nStartRow,
4482cdf0e10cSrcweir                                         SCCOL nEndCol, SCROW nEndRow,
4483cdf0e10cSrcweir                                         sal_Bool* pOnlyNotBecauseOfMatrix /* = NULL */ ) const
4484cdf0e10cSrcweir {
4485cdf0e10cSrcweir     // import into read-only document is possible
4486cdf0e10cSrcweir     if ( !bImportingXML && !mbChangeReadOnlyEnabled && pShell && pShell->IsReadOnly() )
4487cdf0e10cSrcweir     {
4488cdf0e10cSrcweir         if ( pOnlyNotBecauseOfMatrix )
4489cdf0e10cSrcweir             *pOnlyNotBecauseOfMatrix = sal_False;
4490cdf0e10cSrcweir         return sal_False;
4491cdf0e10cSrcweir     }
4492cdf0e10cSrcweir 
4493cdf0e10cSrcweir     if (VALIDTAB(nTab))
4494cdf0e10cSrcweir         if (pTab[nTab])
4495cdf0e10cSrcweir             return pTab[nTab]->IsBlockEditable( nStartCol, nStartRow, nEndCol,
4496cdf0e10cSrcweir                 nEndRow, pOnlyNotBecauseOfMatrix );
4497cdf0e10cSrcweir 
4498982a05a9Smseidel     DBG_ERROR("Wrong table number");
4499cdf0e10cSrcweir     if ( pOnlyNotBecauseOfMatrix )
4500cdf0e10cSrcweir         *pOnlyNotBecauseOfMatrix = sal_False;
4501cdf0e10cSrcweir     return sal_False;
4502cdf0e10cSrcweir }
4503cdf0e10cSrcweir 
4504cdf0e10cSrcweir 
IsSelectionEditable(const ScMarkData & rMark,sal_Bool * pOnlyNotBecauseOfMatrix) const4505cdf0e10cSrcweir sal_Bool ScDocument::IsSelectionEditable( const ScMarkData& rMark,
4506cdf0e10cSrcweir             sal_Bool* pOnlyNotBecauseOfMatrix /* = NULL */ ) const
4507cdf0e10cSrcweir {
4508cdf0e10cSrcweir     // import into read-only document is possible
4509cdf0e10cSrcweir     if ( !bImportingXML && !mbChangeReadOnlyEnabled && pShell && pShell->IsReadOnly() )
4510cdf0e10cSrcweir     {
4511cdf0e10cSrcweir         if ( pOnlyNotBecauseOfMatrix )
4512cdf0e10cSrcweir             *pOnlyNotBecauseOfMatrix = sal_False;
4513cdf0e10cSrcweir         return sal_False;
4514cdf0e10cSrcweir     }
4515cdf0e10cSrcweir 
4516cdf0e10cSrcweir     ScRange aRange;
4517cdf0e10cSrcweir     rMark.GetMarkArea(aRange);
4518cdf0e10cSrcweir 
4519cdf0e10cSrcweir     sal_Bool bOk = sal_True;
4520cdf0e10cSrcweir     sal_Bool bMatrix = ( pOnlyNotBecauseOfMatrix != NULL );
4521cdf0e10cSrcweir     for ( SCTAB i=0; i<=MAXTAB && (bOk || bMatrix); i++ )
4522cdf0e10cSrcweir     {
4523cdf0e10cSrcweir         if ( pTab[i] && rMark.GetTableSelect(i) )
4524cdf0e10cSrcweir         {
4525cdf0e10cSrcweir             if (rMark.IsMarked())
4526cdf0e10cSrcweir             {
4527cdf0e10cSrcweir                 if ( !pTab[i]->IsBlockEditable( aRange.aStart.Col(),
4528cdf0e10cSrcweir                         aRange.aStart.Row(), aRange.aEnd.Col(),
4529cdf0e10cSrcweir                         aRange.aEnd.Row(), pOnlyNotBecauseOfMatrix ) )
4530cdf0e10cSrcweir                 {
4531cdf0e10cSrcweir                     bOk = sal_False;
4532cdf0e10cSrcweir                     if ( pOnlyNotBecauseOfMatrix )
4533cdf0e10cSrcweir                         bMatrix = *pOnlyNotBecauseOfMatrix;
4534cdf0e10cSrcweir                 }
4535cdf0e10cSrcweir             }
4536cdf0e10cSrcweir             if (rMark.IsMultiMarked())
4537cdf0e10cSrcweir             {
4538cdf0e10cSrcweir                 if ( !pTab[i]->IsSelectionEditable( rMark, pOnlyNotBecauseOfMatrix ) )
4539cdf0e10cSrcweir                 {
4540cdf0e10cSrcweir                     bOk = sal_False;
4541cdf0e10cSrcweir                     if ( pOnlyNotBecauseOfMatrix )
4542cdf0e10cSrcweir                         bMatrix = *pOnlyNotBecauseOfMatrix;
4543cdf0e10cSrcweir                 }
4544cdf0e10cSrcweir             }
4545cdf0e10cSrcweir         }
4546cdf0e10cSrcweir     }
4547cdf0e10cSrcweir 
4548cdf0e10cSrcweir     if ( pOnlyNotBecauseOfMatrix )
4549cdf0e10cSrcweir         *pOnlyNotBecauseOfMatrix = ( !bOk && bMatrix );
4550cdf0e10cSrcweir 
4551cdf0e10cSrcweir     return bOk;
4552cdf0e10cSrcweir }
4553cdf0e10cSrcweir 
4554cdf0e10cSrcweir 
HasSelectedBlockMatrixFragment(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,const ScMarkData & rMark) const4555cdf0e10cSrcweir sal_Bool ScDocument::HasSelectedBlockMatrixFragment( SCCOL nStartCol, SCROW nStartRow,
4556cdf0e10cSrcweir                                 SCCOL nEndCol, SCROW nEndRow,
4557cdf0e10cSrcweir                                 const ScMarkData& rMark ) const
4558cdf0e10cSrcweir {
4559cdf0e10cSrcweir     sal_Bool bOk = sal_True;
4560cdf0e10cSrcweir     for (SCTAB i=0; i<=MAXTAB && bOk; i++)
4561cdf0e10cSrcweir         if (pTab[i])
4562cdf0e10cSrcweir             if (rMark.GetTableSelect(i))
4563cdf0e10cSrcweir                 if (pTab[i]->HasBlockMatrixFragment( nStartCol, nStartRow, nEndCol, nEndRow ))
4564cdf0e10cSrcweir                     bOk = sal_False;
4565cdf0e10cSrcweir 
4566cdf0e10cSrcweir     return !bOk;
4567cdf0e10cSrcweir }
4568cdf0e10cSrcweir 
4569cdf0e10cSrcweir 
GetMatrixFormulaRange(const ScAddress & rCellPos,ScRange & rMatrix)4570cdf0e10cSrcweir sal_Bool ScDocument::GetMatrixFormulaRange( const ScAddress& rCellPos, ScRange& rMatrix )
4571cdf0e10cSrcweir {
4572cdf0e10cSrcweir     // if rCell is part of a matrix formula, return its complete range
4573cdf0e10cSrcweir 
4574cdf0e10cSrcweir     sal_Bool bRet = sal_False;
4575cdf0e10cSrcweir     ScBaseCell* pCell = GetCell( rCellPos );
4576cdf0e10cSrcweir     if (pCell && pCell->GetCellType() == CELLTYPE_FORMULA)
4577cdf0e10cSrcweir     {
4578cdf0e10cSrcweir         ScAddress aOrigin = rCellPos;
4579cdf0e10cSrcweir         if ( ((ScFormulaCell*)pCell)->GetMatrixOrigin( aOrigin ) )
4580cdf0e10cSrcweir         {
4581cdf0e10cSrcweir             if ( aOrigin != rCellPos )
4582cdf0e10cSrcweir                 pCell = GetCell( aOrigin );
4583cdf0e10cSrcweir             if (pCell && pCell->GetCellType() == CELLTYPE_FORMULA)
4584cdf0e10cSrcweir             {
4585cdf0e10cSrcweir                 SCCOL nSizeX;
4586cdf0e10cSrcweir                 SCROW nSizeY;
4587cdf0e10cSrcweir                 ((ScFormulaCell*)pCell)->GetMatColsRows(nSizeX,nSizeY);
4588cdf0e10cSrcweir                 if ( !(nSizeX > 0 && nSizeY > 0) )
4589cdf0e10cSrcweir                 {
4590cdf0e10cSrcweir                     // GetMatrixEdge computes also dimensions of the matrix
4591cdf0e10cSrcweir                     // if not already done (may occur if document is loaded
4592cdf0e10cSrcweir                     // from old file format).
4593cdf0e10cSrcweir                     // Needs an "invalid" initialized address.
4594cdf0e10cSrcweir                     aOrigin.SetInvalid();
4595cdf0e10cSrcweir                     ((ScFormulaCell*)pCell)->GetMatrixEdge(aOrigin);
4596cdf0e10cSrcweir                     ((ScFormulaCell*)pCell)->GetMatColsRows(nSizeX,nSizeY);
4597cdf0e10cSrcweir                 }
4598cdf0e10cSrcweir                 if ( nSizeX > 0 && nSizeY > 0 )
4599cdf0e10cSrcweir                 {
4600cdf0e10cSrcweir                     ScAddress aEnd( aOrigin.Col() + nSizeX - 1,
4601cdf0e10cSrcweir                                     aOrigin.Row() + nSizeY - 1,
4602cdf0e10cSrcweir                                     aOrigin.Tab() );
4603cdf0e10cSrcweir 
4604cdf0e10cSrcweir                     rMatrix.aStart = aOrigin;
4605cdf0e10cSrcweir                     rMatrix.aEnd = aEnd;
4606cdf0e10cSrcweir                     bRet = sal_True;
4607cdf0e10cSrcweir                 }
4608cdf0e10cSrcweir             }
4609cdf0e10cSrcweir         }
4610cdf0e10cSrcweir     }
4611cdf0e10cSrcweir     return bRet;
4612cdf0e10cSrcweir }
4613cdf0e10cSrcweir 
4614cdf0e10cSrcweir 
ExtendOverlapped(SCCOL & rStartCol,SCROW & rStartRow,SCCOL nEndCol,SCROW nEndRow,SCTAB nTab)4615cdf0e10cSrcweir sal_Bool ScDocument::ExtendOverlapped( SCCOL& rStartCol, SCROW& rStartRow,
4616cdf0e10cSrcweir                                 SCCOL nEndCol, SCROW nEndRow, SCTAB nTab )
4617cdf0e10cSrcweir {
4618cdf0e10cSrcweir     sal_Bool bFound = sal_False;
4619cdf0e10cSrcweir     if ( ValidColRow(rStartCol,rStartRow) && ValidColRow(nEndCol,nEndRow) && ValidTab(nTab) )
4620cdf0e10cSrcweir     {
4621cdf0e10cSrcweir         if (pTab[nTab])
4622cdf0e10cSrcweir         {
4623cdf0e10cSrcweir             SCCOL nCol;
4624cdf0e10cSrcweir             SCCOL nOldCol = rStartCol;
4625cdf0e10cSrcweir             SCROW nOldRow = rStartRow;
4626cdf0e10cSrcweir             for (nCol=nOldCol; nCol<=nEndCol; nCol++)
4627cdf0e10cSrcweir                 while (((ScMergeFlagAttr*)GetAttr(nCol,rStartRow,nTab,ATTR_MERGE_FLAG))->
4628cdf0e10cSrcweir                             IsVerOverlapped())
4629cdf0e10cSrcweir                     --rStartRow;
4630cdf0e10cSrcweir 
4631cdf0e10cSrcweir             //!     weiterreichen ?
4632cdf0e10cSrcweir 
4633cdf0e10cSrcweir             ScAttrArray* pAttrArray = pTab[nTab]->aCol[nOldCol].pAttrArray;
4634cdf0e10cSrcweir             SCSIZE nIndex;
4635cdf0e10cSrcweir             pAttrArray->Search( nOldRow, nIndex );
4636cdf0e10cSrcweir             SCROW nAttrPos = nOldRow;
4637cdf0e10cSrcweir             while (nAttrPos<=nEndRow)
4638cdf0e10cSrcweir             {
4639cdf0e10cSrcweir                 DBG_ASSERT( nIndex < pAttrArray->nCount, "Falscher Index im AttrArray" );
4640cdf0e10cSrcweir 
4641cdf0e10cSrcweir                 if (((ScMergeFlagAttr&)pAttrArray->pData[nIndex].pPattern->
4642cdf0e10cSrcweir                         GetItem(ATTR_MERGE_FLAG)).IsHorOverlapped())
4643cdf0e10cSrcweir                 {
4644cdf0e10cSrcweir                     SCROW nLoopEndRow = Min( nEndRow, pAttrArray->pData[nIndex].nRow );
4645cdf0e10cSrcweir                     for (SCROW nAttrRow = nAttrPos; nAttrRow <= nLoopEndRow; nAttrRow++)
4646cdf0e10cSrcweir                     {
4647cdf0e10cSrcweir                         SCCOL nTempCol = nOldCol;
4648cdf0e10cSrcweir                         do
4649cdf0e10cSrcweir                             --nTempCol;
4650cdf0e10cSrcweir                         while (((ScMergeFlagAttr*)GetAttr(nTempCol,nAttrRow,nTab,ATTR_MERGE_FLAG))
4651cdf0e10cSrcweir                                 ->IsHorOverlapped());
4652cdf0e10cSrcweir                         if (nTempCol < rStartCol)
4653cdf0e10cSrcweir                             rStartCol = nTempCol;
4654cdf0e10cSrcweir                     }
4655cdf0e10cSrcweir                 }
4656cdf0e10cSrcweir                 nAttrPos = pAttrArray->pData[nIndex].nRow + 1;
4657cdf0e10cSrcweir                 ++nIndex;
4658cdf0e10cSrcweir             }
4659cdf0e10cSrcweir         }
4660cdf0e10cSrcweir     }
4661cdf0e10cSrcweir     else
4662cdf0e10cSrcweir     {
4663cdf0e10cSrcweir         DBG_ERROR("ExtendOverlapped: falscher Bereich");
4664cdf0e10cSrcweir     }
4665cdf0e10cSrcweir 
4666cdf0e10cSrcweir     return bFound;
4667cdf0e10cSrcweir }
4668cdf0e10cSrcweir 
4669cdf0e10cSrcweir 
ExtendMergeSel(SCCOL nStartCol,SCROW nStartRow,SCCOL & rEndCol,SCROW & rEndRow,const ScMarkData & rMark,sal_Bool bRefresh,sal_Bool bAttrs)4670cdf0e10cSrcweir sal_Bool ScDocument::ExtendMergeSel( SCCOL nStartCol, SCROW nStartRow,
4671cdf0e10cSrcweir                               SCCOL& rEndCol, SCROW& rEndRow,
4672cdf0e10cSrcweir                               const ScMarkData& rMark, sal_Bool bRefresh, sal_Bool bAttrs )
4673cdf0e10cSrcweir {
4674cdf0e10cSrcweir     // use all selected sheets from rMark
4675cdf0e10cSrcweir 
4676cdf0e10cSrcweir     sal_Bool bFound = sal_False;
4677cdf0e10cSrcweir     SCCOL nOldEndCol = rEndCol;
4678cdf0e10cSrcweir     SCROW nOldEndRow = rEndRow;
4679cdf0e10cSrcweir 
4680cdf0e10cSrcweir     for (SCTAB nTab = 0; nTab <= MAXTAB; nTab++)
4681cdf0e10cSrcweir         if ( pTab[nTab] && rMark.GetTableSelect(nTab) )
4682cdf0e10cSrcweir         {
4683cdf0e10cSrcweir             SCCOL nThisEndCol = nOldEndCol;
4684cdf0e10cSrcweir             SCROW nThisEndRow = nOldEndRow;
4685cdf0e10cSrcweir             if ( ExtendMerge( nStartCol, nStartRow, nThisEndCol, nThisEndRow, nTab, bRefresh, bAttrs ) )
4686cdf0e10cSrcweir                 bFound = sal_True;
4687cdf0e10cSrcweir             if ( nThisEndCol > rEndCol )
4688cdf0e10cSrcweir                 rEndCol = nThisEndCol;
4689cdf0e10cSrcweir             if ( nThisEndRow > rEndRow )
4690cdf0e10cSrcweir                 rEndRow = nThisEndRow;
4691cdf0e10cSrcweir         }
4692cdf0e10cSrcweir 
4693cdf0e10cSrcweir     return bFound;
4694cdf0e10cSrcweir }
4695cdf0e10cSrcweir 
4696cdf0e10cSrcweir 
ExtendMerge(SCCOL nStartCol,SCROW nStartRow,SCCOL & rEndCol,SCROW & rEndRow,SCTAB nTab,sal_Bool bRefresh,sal_Bool bAttrs)4697cdf0e10cSrcweir sal_Bool ScDocument::ExtendMerge( SCCOL nStartCol, SCROW nStartRow,
4698cdf0e10cSrcweir                               SCCOL& rEndCol,  SCROW& rEndRow,
4699cdf0e10cSrcweir                               SCTAB nTab, sal_Bool bRefresh, sal_Bool bAttrs )
4700cdf0e10cSrcweir {
4701cdf0e10cSrcweir     sal_Bool bFound = sal_False;
4702cdf0e10cSrcweir     if ( ValidColRow(nStartCol,nStartRow) && ValidColRow(rEndCol,rEndRow) && ValidTab(nTab) )
4703cdf0e10cSrcweir     {
4704cdf0e10cSrcweir         if (pTab[nTab])
4705cdf0e10cSrcweir             bFound = pTab[nTab]->ExtendMerge( nStartCol, nStartRow, rEndCol, rEndRow, bRefresh, bAttrs );
4706cdf0e10cSrcweir 
4707cdf0e10cSrcweir         if (bRefresh)
4708cdf0e10cSrcweir             RefreshAutoFilter( nStartCol, nStartRow, rEndCol, rEndRow, nTab );
4709cdf0e10cSrcweir     }
4710cdf0e10cSrcweir     else
4711cdf0e10cSrcweir     {
4712cdf0e10cSrcweir         DBG_ERROR("ExtendMerge: falscher Bereich");
4713cdf0e10cSrcweir     }
4714cdf0e10cSrcweir 
4715cdf0e10cSrcweir     return bFound;
4716cdf0e10cSrcweir }
4717cdf0e10cSrcweir 
4718cdf0e10cSrcweir 
ExtendMerge(ScRange & rRange,sal_Bool bRefresh,sal_Bool bAttrs)4719cdf0e10cSrcweir sal_Bool ScDocument::ExtendMerge( ScRange& rRange, sal_Bool bRefresh, sal_Bool bAttrs )
4720cdf0e10cSrcweir {
4721cdf0e10cSrcweir     sal_Bool bFound = sal_False;
4722cdf0e10cSrcweir     SCTAB nStartTab = rRange.aStart.Tab();
4723cdf0e10cSrcweir     SCTAB nEndTab   = rRange.aEnd.Tab();
4724cdf0e10cSrcweir     SCCOL nEndCol   = rRange.aEnd.Col();
4725cdf0e10cSrcweir     SCROW nEndRow   = rRange.aEnd.Row();
4726cdf0e10cSrcweir 
4727cdf0e10cSrcweir     PutInOrder( nStartTab, nEndTab );
4728cdf0e10cSrcweir     for (SCTAB nTab = nStartTab; nTab <= nEndTab; nTab++ )
4729cdf0e10cSrcweir     {
4730cdf0e10cSrcweir         SCCOL nExtendCol = rRange.aEnd.Col();
4731cdf0e10cSrcweir         SCROW nExtendRow = rRange.aEnd.Row();
4732cdf0e10cSrcweir         if (ExtendMerge( rRange.aStart.Col(), rRange.aStart.Row(),
4733cdf0e10cSrcweir                          nExtendCol,          nExtendRow,
4734cdf0e10cSrcweir                          nTab, bRefresh, bAttrs ) )
4735cdf0e10cSrcweir         {
4736cdf0e10cSrcweir             bFound = sal_True;
4737cdf0e10cSrcweir             if (nExtendCol > nEndCol) nEndCol = nExtendCol;
4738cdf0e10cSrcweir             if (nExtendRow > nEndRow) nEndRow = nExtendRow;
4739cdf0e10cSrcweir         }
4740cdf0e10cSrcweir     }
4741cdf0e10cSrcweir 
4742cdf0e10cSrcweir     rRange.aEnd.SetCol(nEndCol);
4743cdf0e10cSrcweir     rRange.aEnd.SetRow(nEndRow);
4744cdf0e10cSrcweir 
4745cdf0e10cSrcweir     return bFound;
4746cdf0e10cSrcweir }
4747cdf0e10cSrcweir 
ExtendTotalMerge(ScRange & rRange)4748cdf0e10cSrcweir sal_Bool ScDocument::ExtendTotalMerge( ScRange& rRange )
4749cdf0e10cSrcweir {
4750cdf0e10cSrcweir     // Bereich genau dann auf zusammengefasste Zellen erweitern, wenn
4751982a05a9Smseidel     // dadurch keine neuen nicht-überdeckten Zellen getroffen werden
4752cdf0e10cSrcweir 
4753cdf0e10cSrcweir     sal_Bool bRet = sal_False;
4754cdf0e10cSrcweir     ScRange aExt = rRange;
4755cdf0e10cSrcweir     if (ExtendMerge(aExt))
4756cdf0e10cSrcweir     {
4757cdf0e10cSrcweir         if ( aExt.aEnd.Row() > rRange.aEnd.Row() )
4758cdf0e10cSrcweir         {
4759cdf0e10cSrcweir             ScRange aTest = aExt;
4760cdf0e10cSrcweir             aTest.aStart.SetRow( rRange.aEnd.Row() + 1 );
4761cdf0e10cSrcweir             if ( HasAttrib( aTest, HASATTR_NOTOVERLAPPED ) )
4762cdf0e10cSrcweir                 aExt.aEnd.SetRow(rRange.aEnd.Row());
4763cdf0e10cSrcweir         }
4764cdf0e10cSrcweir         if ( aExt.aEnd.Col() > rRange.aEnd.Col() )
4765cdf0e10cSrcweir         {
4766cdf0e10cSrcweir             ScRange aTest = aExt;
4767cdf0e10cSrcweir             aTest.aStart.SetCol( rRange.aEnd.Col() + 1 );
4768cdf0e10cSrcweir             if ( HasAttrib( aTest, HASATTR_NOTOVERLAPPED ) )
4769cdf0e10cSrcweir                 aExt.aEnd.SetCol(rRange.aEnd.Col());
4770cdf0e10cSrcweir         }
4771cdf0e10cSrcweir 
4772cdf0e10cSrcweir         bRet = ( aExt.aEnd != rRange.aEnd );
4773cdf0e10cSrcweir         rRange = aExt;
4774cdf0e10cSrcweir     }
4775cdf0e10cSrcweir     return bRet;
4776cdf0e10cSrcweir }
4777cdf0e10cSrcweir 
ExtendOverlapped(ScRange & rRange)4778cdf0e10cSrcweir sal_Bool ScDocument::ExtendOverlapped( ScRange& rRange )
4779cdf0e10cSrcweir {
4780cdf0e10cSrcweir     sal_Bool bFound = sal_False;
4781cdf0e10cSrcweir     SCTAB nStartTab = rRange.aStart.Tab();
4782cdf0e10cSrcweir     SCTAB nEndTab   = rRange.aEnd.Tab();
4783cdf0e10cSrcweir     SCCOL nStartCol = rRange.aStart.Col();
4784cdf0e10cSrcweir     SCROW nStartRow = rRange.aStart.Row();
4785cdf0e10cSrcweir 
4786cdf0e10cSrcweir     PutInOrder( nStartTab, nEndTab );
4787cdf0e10cSrcweir     for (SCTAB nTab = nStartTab; nTab <= nEndTab; nTab++ )
4788cdf0e10cSrcweir     {
4789cdf0e10cSrcweir         SCCOL nExtendCol = rRange.aStart.Col();
4790cdf0e10cSrcweir         SCROW nExtendRow = rRange.aStart.Row();
4791cdf0e10cSrcweir         ExtendOverlapped( nExtendCol, nExtendRow,
4792cdf0e10cSrcweir                                 rRange.aEnd.Col(), rRange.aEnd.Row(), nTab );
4793cdf0e10cSrcweir         if (nExtendCol < nStartCol)
4794cdf0e10cSrcweir         {
4795cdf0e10cSrcweir             nStartCol = nExtendCol;
4796cdf0e10cSrcweir             bFound = sal_True;
4797cdf0e10cSrcweir         }
4798cdf0e10cSrcweir         if (nExtendRow < nStartRow)
4799cdf0e10cSrcweir         {
4800cdf0e10cSrcweir             nStartRow = nExtendRow;
4801cdf0e10cSrcweir             bFound = sal_True;
4802cdf0e10cSrcweir         }
4803cdf0e10cSrcweir     }
4804cdf0e10cSrcweir 
4805cdf0e10cSrcweir     rRange.aStart.SetCol(nStartCol);
4806cdf0e10cSrcweir     rRange.aStart.SetRow(nStartRow);
4807cdf0e10cSrcweir 
4808cdf0e10cSrcweir     return bFound;
4809cdf0e10cSrcweir }
4810cdf0e10cSrcweir 
RefreshAutoFilter(SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,SCTAB nTab)4811cdf0e10cSrcweir sal_Bool ScDocument::RefreshAutoFilter( SCCOL nStartCol, SCROW nStartRow,
4812cdf0e10cSrcweir                                     SCCOL nEndCol, SCROW nEndRow, SCTAB nTab )
4813cdf0e10cSrcweir {
4814cdf0e10cSrcweir     sal_uInt16 nCount = pDBCollection->GetCount();
4815cdf0e10cSrcweir     sal_uInt16 i;
4816cdf0e10cSrcweir     ScDBData* pData;
4817cdf0e10cSrcweir     SCTAB nDBTab;
4818cdf0e10cSrcweir     SCCOL nDBStartCol;
4819cdf0e10cSrcweir     SCROW nDBStartRow;
4820cdf0e10cSrcweir     SCCOL nDBEndCol;
4821cdf0e10cSrcweir     SCROW nDBEndRow;
4822cdf0e10cSrcweir 
4823982a05a9Smseidel     //  delete Autofilter
4824cdf0e10cSrcweir 
4825cdf0e10cSrcweir     sal_Bool bChange = RemoveFlagsTab( nStartCol,nStartRow, nEndCol,nEndRow, nTab, SC_MF_AUTO );
4826cdf0e10cSrcweir 
4827982a05a9Smseidel     //  set Autofilter
4828cdf0e10cSrcweir 
4829cdf0e10cSrcweir     for (i=0; i<nCount; i++)
4830cdf0e10cSrcweir     {
4831cdf0e10cSrcweir         pData = (*pDBCollection)[i];
4832cdf0e10cSrcweir         if (pData->HasAutoFilter())
4833cdf0e10cSrcweir         {
4834cdf0e10cSrcweir             pData->GetArea( nDBTab, nDBStartCol,nDBStartRow, nDBEndCol,nDBEndRow );
4835cdf0e10cSrcweir             if ( nDBTab==nTab && nDBStartRow<=nEndRow && nDBEndRow>=nStartRow &&
4836cdf0e10cSrcweir                                     nDBStartCol<=nEndCol && nDBEndCol>=nStartCol )
4837cdf0e10cSrcweir             {
4838cdf0e10cSrcweir                 if (ApplyFlagsTab( nDBStartCol,nDBStartRow, nDBEndCol,nDBStartRow,
4839cdf0e10cSrcweir                                     nDBTab, SC_MF_AUTO ))
4840cdf0e10cSrcweir                     bChange = sal_True;
4841cdf0e10cSrcweir             }
4842cdf0e10cSrcweir         }
4843cdf0e10cSrcweir     }
4844cdf0e10cSrcweir     return bChange;
4845cdf0e10cSrcweir }
4846cdf0e10cSrcweir 
4847cdf0e10cSrcweir 
IsHorOverlapped(SCCOL nCol,SCROW nRow,SCTAB nTab) const4848cdf0e10cSrcweir sal_Bool ScDocument::IsHorOverlapped( SCCOL nCol, SCROW nRow, SCTAB nTab ) const
4849cdf0e10cSrcweir {
4850cdf0e10cSrcweir     const ScMergeFlagAttr* pAttr = (const ScMergeFlagAttr*)
4851cdf0e10cSrcweir                                         GetAttr( nCol, nRow, nTab, ATTR_MERGE_FLAG );
4852cdf0e10cSrcweir     if (pAttr)
4853cdf0e10cSrcweir         return pAttr->IsHorOverlapped();
4854cdf0e10cSrcweir     else
4855cdf0e10cSrcweir     {
4856cdf0e10cSrcweir         DBG_ERROR("Overlapped: Attr==0");
4857cdf0e10cSrcweir         return sal_False;
4858cdf0e10cSrcweir     }
4859cdf0e10cSrcweir }
4860cdf0e10cSrcweir 
4861cdf0e10cSrcweir 
IsVerOverlapped(SCCOL nCol,SCROW nRow,SCTAB nTab) const4862cdf0e10cSrcweir sal_Bool ScDocument::IsVerOverlapped( SCCOL nCol, SCROW nRow, SCTAB nTab ) const
4863cdf0e10cSrcweir {
4864cdf0e10cSrcweir     const ScMergeFlagAttr* pAttr = (const ScMergeFlagAttr*)
4865cdf0e10cSrcweir                                         GetAttr( nCol, nRow, nTab, ATTR_MERGE_FLAG );
4866cdf0e10cSrcweir     if (pAttr)
4867cdf0e10cSrcweir         return pAttr->IsVerOverlapped();
4868cdf0e10cSrcweir     else
4869cdf0e10cSrcweir     {
4870cdf0e10cSrcweir         DBG_ERROR("Overlapped: Attr==0");
4871cdf0e10cSrcweir         return sal_False;
4872cdf0e10cSrcweir     }
4873cdf0e10cSrcweir }
4874cdf0e10cSrcweir 
4875cdf0e10cSrcweir 
ApplySelectionFrame(const ScMarkData & rMark,const SvxBoxItem * pLineOuter,const SvxBoxInfoItem * pLineInner)4876cdf0e10cSrcweir void ScDocument::ApplySelectionFrame( const ScMarkData& rMark,
4877cdf0e10cSrcweir                                       const SvxBoxItem* pLineOuter,
4878cdf0e10cSrcweir                                       const SvxBoxInfoItem* pLineInner )
4879cdf0e10cSrcweir {
4880cdf0e10cSrcweir     ScRangeList aRangeList;
4881cdf0e10cSrcweir     rMark.FillRangeListWithMarks( &aRangeList, sal_False );
4882cdf0e10cSrcweir     sal_uLong nRangeCount = aRangeList.Count();
4883cdf0e10cSrcweir     for (SCTAB i=0; i<=MAXTAB; i++)
4884cdf0e10cSrcweir     {
4885cdf0e10cSrcweir         if (pTab[i] && rMark.GetTableSelect(i))
4886cdf0e10cSrcweir         {
4887cdf0e10cSrcweir             for (sal_uLong j=0; j<nRangeCount; j++)
4888cdf0e10cSrcweir             {
4889cdf0e10cSrcweir                 ScRange aRange = *aRangeList.GetObject(j);
4890cdf0e10cSrcweir                 pTab[i]->ApplyBlockFrame( pLineOuter, pLineInner,
4891cdf0e10cSrcweir                     aRange.aStart.Col(), aRange.aStart.Row(),
4892cdf0e10cSrcweir                     aRange.aEnd.Col(),   aRange.aEnd.Row() );
4893cdf0e10cSrcweir             }
4894cdf0e10cSrcweir         }
4895cdf0e10cSrcweir     }
4896cdf0e10cSrcweir }
4897cdf0e10cSrcweir 
4898cdf0e10cSrcweir 
ApplyFrameAreaTab(const ScRange & rRange,const SvxBoxItem * pLineOuter,const SvxBoxInfoItem * pLineInner)4899cdf0e10cSrcweir void ScDocument::ApplyFrameAreaTab( const ScRange& rRange,
4900cdf0e10cSrcweir                                     const SvxBoxItem* pLineOuter,
4901cdf0e10cSrcweir                                     const SvxBoxInfoItem* pLineInner )
4902cdf0e10cSrcweir {
4903cdf0e10cSrcweir     SCTAB nStartTab = rRange.aStart.Tab();
4904cdf0e10cSrcweir     SCTAB nEndTab = rRange.aStart.Tab();
4905cdf0e10cSrcweir     for (SCTAB nTab=nStartTab; nTab<=nEndTab; nTab++)
4906cdf0e10cSrcweir         if (pTab[nTab])
4907cdf0e10cSrcweir             pTab[nTab]->ApplyBlockFrame( pLineOuter, pLineInner,
4908cdf0e10cSrcweir                                          rRange.aStart.Col(), rRange.aStart.Row(),
4909cdf0e10cSrcweir                                          rRange.aEnd.Col(),   rRange.aEnd.Row() );
4910cdf0e10cSrcweir }
4911cdf0e10cSrcweir 
4912cdf0e10cSrcweir 
ApplySelectionPattern(const ScPatternAttr & rAttr,const ScMarkData & rMark)4913cdf0e10cSrcweir void ScDocument::ApplySelectionPattern( const ScPatternAttr& rAttr, const ScMarkData& rMark )
4914cdf0e10cSrcweir {
4915cdf0e10cSrcweir     const SfxItemSet* pSet = &rAttr.GetItemSet();
4916cdf0e10cSrcweir     sal_Bool bSet = sal_False;
4917cdf0e10cSrcweir     sal_uInt16 i;
4918cdf0e10cSrcweir     for (i=ATTR_PATTERN_START; i<=ATTR_PATTERN_END && !bSet; i++)
4919cdf0e10cSrcweir         if (pSet->GetItemState(i) == SFX_ITEM_SET)
4920cdf0e10cSrcweir             bSet = sal_True;
4921cdf0e10cSrcweir 
4922cdf0e10cSrcweir     if (bSet)
4923cdf0e10cSrcweir     {
4924cdf0e10cSrcweir         // ApplySelectionCache needs multi mark
4925cdf0e10cSrcweir         if ( rMark.IsMarked() && !rMark.IsMultiMarked() )
4926cdf0e10cSrcweir         {
4927cdf0e10cSrcweir             ScRange aRange;
4928cdf0e10cSrcweir             rMark.GetMarkArea( aRange );
4929cdf0e10cSrcweir             ApplyPatternArea( aRange.aStart.Col(), aRange.aStart.Row(),
4930cdf0e10cSrcweir                               aRange.aEnd.Col(), aRange.aEnd.Row(), rMark, rAttr );
4931cdf0e10cSrcweir         }
4932cdf0e10cSrcweir         else
4933cdf0e10cSrcweir         {
4934cdf0e10cSrcweir             SfxItemPoolCache aCache( xPoolHelper->GetDocPool(), pSet );
4935cdf0e10cSrcweir             for (SCTAB nTab=0; nTab<=MAXTAB; nTab++)
4936cdf0e10cSrcweir                 if (pTab[nTab])
4937cdf0e10cSrcweir                     if (rMark.GetTableSelect(nTab))
4938cdf0e10cSrcweir                         pTab[nTab]->ApplySelectionCache( &aCache, rMark );
4939cdf0e10cSrcweir         }
4940cdf0e10cSrcweir     }
4941cdf0e10cSrcweir }
4942cdf0e10cSrcweir 
4943cdf0e10cSrcweir 
ChangeSelectionIndent(sal_Bool bIncrement,const ScMarkData & rMark)4944cdf0e10cSrcweir void ScDocument::ChangeSelectionIndent( sal_Bool bIncrement, const ScMarkData& rMark )
4945cdf0e10cSrcweir {
4946cdf0e10cSrcweir     for (SCTAB i=0; i<=MAXTAB; i++)
4947cdf0e10cSrcweir         if (pTab[i] && rMark.GetTableSelect(i))
4948cdf0e10cSrcweir             pTab[i]->ChangeSelectionIndent( bIncrement, rMark );
4949cdf0e10cSrcweir }
4950cdf0e10cSrcweir 
4951cdf0e10cSrcweir 
ClearSelectionItems(const sal_uInt16 * pWhich,const ScMarkData & rMark)4952cdf0e10cSrcweir void ScDocument::ClearSelectionItems( const sal_uInt16* pWhich, const ScMarkData& rMark )
4953cdf0e10cSrcweir {
4954cdf0e10cSrcweir     for (SCTAB i=0; i<=MAXTAB; i++)
4955cdf0e10cSrcweir         if (pTab[i] && rMark.GetTableSelect(i))
4956cdf0e10cSrcweir             pTab[i]->ClearSelectionItems( pWhich, rMark );
4957cdf0e10cSrcweir }
4958cdf0e10cSrcweir 
4959cdf0e10cSrcweir 
DeleteSelection(sal_uInt16 nDelFlag,const ScMarkData & rMark)4960cdf0e10cSrcweir void ScDocument::DeleteSelection( sal_uInt16 nDelFlag, const ScMarkData& rMark )
4961cdf0e10cSrcweir {
4962cdf0e10cSrcweir     for (SCTAB i=0; i<=MAXTAB; i++)
4963cdf0e10cSrcweir         if (pTab[i] && rMark.GetTableSelect(i))
4964cdf0e10cSrcweir             pTab[i]->DeleteSelection( nDelFlag, rMark );
4965cdf0e10cSrcweir }
4966cdf0e10cSrcweir 
4967cdf0e10cSrcweir 
DeleteSelectionTab(SCTAB nTab,sal_uInt16 nDelFlag,const ScMarkData & rMark)4968cdf0e10cSrcweir void ScDocument::DeleteSelectionTab( SCTAB nTab, sal_uInt16 nDelFlag, const ScMarkData& rMark )
4969cdf0e10cSrcweir {
4970cdf0e10cSrcweir     if (ValidTab(nTab)  && pTab[nTab])
4971cdf0e10cSrcweir         pTab[nTab]->DeleteSelection( nDelFlag, rMark );
4972cdf0e10cSrcweir     else
4973cdf0e10cSrcweir     {
4974cdf0e10cSrcweir         DBG_ERROR("Falsche Tabelle");
4975cdf0e10cSrcweir     }
4976cdf0e10cSrcweir }
4977cdf0e10cSrcweir 
4978cdf0e10cSrcweir 
GetDefPattern() const4979cdf0e10cSrcweir ScPatternAttr* ScDocument::GetDefPattern() const
4980cdf0e10cSrcweir {
4981cdf0e10cSrcweir     return (ScPatternAttr*) &xPoolHelper->GetDocPool()->GetDefaultItem(ATTR_PATTERN);
4982cdf0e10cSrcweir }
4983cdf0e10cSrcweir 
4984cdf0e10cSrcweir 
GetPool()4985cdf0e10cSrcweir ScDocumentPool* ScDocument::GetPool()
4986cdf0e10cSrcweir {
4987cdf0e10cSrcweir     return xPoolHelper->GetDocPool();
4988cdf0e10cSrcweir }
4989cdf0e10cSrcweir 
4990cdf0e10cSrcweir 
4991cdf0e10cSrcweir 
GetStyleSheetPool() const4992cdf0e10cSrcweir ScStyleSheetPool* ScDocument::GetStyleSheetPool() const
4993cdf0e10cSrcweir {
4994cdf0e10cSrcweir     return xPoolHelper->GetStylePool();
4995cdf0e10cSrcweir }
4996cdf0e10cSrcweir 
4997cdf0e10cSrcweir 
GetEmptyLinesInBlock(SCCOL nStartCol,SCROW nStartRow,SCTAB nStartTab,SCCOL nEndCol,SCROW nEndRow,SCTAB nEndTab,ScDirection eDir)4998cdf0e10cSrcweir SCSIZE ScDocument::GetEmptyLinesInBlock( SCCOL nStartCol, SCROW nStartRow, SCTAB nStartTab,
4999cdf0e10cSrcweir                             SCCOL nEndCol, SCROW nEndRow, SCTAB nEndTab, ScDirection eDir )
5000cdf0e10cSrcweir {
5001cdf0e10cSrcweir     PutInOrder(nStartCol, nEndCol);
5002cdf0e10cSrcweir     PutInOrder(nStartRow, nEndRow);
5003cdf0e10cSrcweir     PutInOrder(nStartTab, nEndTab);
5004cdf0e10cSrcweir     if (VALIDTAB(nStartTab))
5005cdf0e10cSrcweir     {
5006cdf0e10cSrcweir         if (pTab[nStartTab])
5007cdf0e10cSrcweir             return pTab[nStartTab]->GetEmptyLinesInBlock(nStartCol, nStartRow, nEndCol, nEndRow, eDir);
5008cdf0e10cSrcweir         else
5009cdf0e10cSrcweir             return 0;
5010cdf0e10cSrcweir     }
5011cdf0e10cSrcweir     else
5012cdf0e10cSrcweir         return 0;
5013cdf0e10cSrcweir }
5014cdf0e10cSrcweir 
5015cdf0e10cSrcweir 
FindAreaPos(SCCOL & rCol,SCROW & rRow,SCTAB nTab,SCsCOL nMovX,SCsROW nMovY)5016cdf0e10cSrcweir void ScDocument::FindAreaPos( SCCOL& rCol, SCROW& rRow, SCTAB nTab, SCsCOL nMovX, SCsROW nMovY )
5017cdf0e10cSrcweir {
5018cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5019cdf0e10cSrcweir         pTab[nTab]->FindAreaPos( rCol, rRow, nMovX, nMovY );
5020cdf0e10cSrcweir }
5021cdf0e10cSrcweir 
5022cdf0e10cSrcweir 
GetNextPos(SCCOL & rCol,SCROW & rRow,SCTAB nTab,SCsCOL nMovX,SCsROW nMovY,sal_Bool bMarked,sal_Bool bUnprotected,const ScMarkData & rMark)5023cdf0e10cSrcweir void ScDocument::GetNextPos( SCCOL& rCol, SCROW& rRow, SCTAB nTab, SCsCOL nMovX, SCsROW nMovY,
5024cdf0e10cSrcweir                                 sal_Bool bMarked, sal_Bool bUnprotected, const ScMarkData& rMark )
5025cdf0e10cSrcweir {
5026cdf0e10cSrcweir     DBG_ASSERT( !nMovX || !nMovY, "GetNextPos: nur X oder Y" );
5027cdf0e10cSrcweir 
5028cdf0e10cSrcweir     ScMarkData aCopyMark = rMark;
5029cdf0e10cSrcweir     aCopyMark.SetMarking(sal_False);
5030cdf0e10cSrcweir     aCopyMark.MarkToMulti();
5031cdf0e10cSrcweir 
5032cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5033cdf0e10cSrcweir         pTab[nTab]->GetNextPos( rCol, rRow, nMovX, nMovY, bMarked, bUnprotected, aCopyMark );
5034cdf0e10cSrcweir }
5035cdf0e10cSrcweir 
5036cdf0e10cSrcweir //
5037cdf0e10cSrcweir // Datei-Operationen
5038cdf0e10cSrcweir //
5039cdf0e10cSrcweir 
5040cdf0e10cSrcweir 
UpdStlShtPtrsFrmNms()5041cdf0e10cSrcweir void ScDocument::UpdStlShtPtrsFrmNms()
5042cdf0e10cSrcweir {
5043cdf0e10cSrcweir     ScPatternAttr::pDoc = this;
5044cdf0e10cSrcweir 
5045cdf0e10cSrcweir     ScDocumentPool* pPool = xPoolHelper->GetDocPool();
5046cdf0e10cSrcweir 
5047cdf0e10cSrcweir     sal_uInt32 nCount = pPool->GetItemCount2(ATTR_PATTERN);
5048cdf0e10cSrcweir     ScPatternAttr* pPattern;
5049cdf0e10cSrcweir     for (sal_uInt32 i=0; i<nCount; i++)
5050cdf0e10cSrcweir     {
5051cdf0e10cSrcweir         pPattern = (ScPatternAttr*)pPool->GetItem2(ATTR_PATTERN, i);
5052cdf0e10cSrcweir         if (pPattern)
5053cdf0e10cSrcweir             pPattern->UpdateStyleSheet();
5054cdf0e10cSrcweir     }
5055cdf0e10cSrcweir     ((ScPatternAttr&)pPool->GetDefaultItem(ATTR_PATTERN)).UpdateStyleSheet();
5056cdf0e10cSrcweir }
5057cdf0e10cSrcweir 
5058cdf0e10cSrcweir 
StylesToNames()5059cdf0e10cSrcweir void ScDocument::StylesToNames()
5060cdf0e10cSrcweir {
5061cdf0e10cSrcweir     ScPatternAttr::pDoc = this;
5062cdf0e10cSrcweir 
5063cdf0e10cSrcweir     ScDocumentPool* pPool = xPoolHelper->GetDocPool();
5064cdf0e10cSrcweir 
5065cdf0e10cSrcweir     sal_uInt32 nCount = pPool->GetItemCount2(ATTR_PATTERN);
5066cdf0e10cSrcweir     ScPatternAttr* pPattern;
5067cdf0e10cSrcweir     for (sal_uInt32 i=0; i<nCount; i++)
5068cdf0e10cSrcweir     {
5069cdf0e10cSrcweir         pPattern = (ScPatternAttr*)pPool->GetItem2(ATTR_PATTERN, i);
5070cdf0e10cSrcweir         if (pPattern)
5071cdf0e10cSrcweir             pPattern->StyleToName();
5072cdf0e10cSrcweir     }
5073cdf0e10cSrcweir     ((ScPatternAttr&)pPool->GetDefaultItem(ATTR_PATTERN)).StyleToName();
5074cdf0e10cSrcweir }
5075cdf0e10cSrcweir 
5076cdf0e10cSrcweir 
GetCellCount() const5077cdf0e10cSrcweir sal_uLong ScDocument::GetCellCount() const
5078cdf0e10cSrcweir {
5079cdf0e10cSrcweir     sal_uLong nCellCount = 0L;
5080cdf0e10cSrcweir 
5081cdf0e10cSrcweir     for ( SCTAB nTab=0; nTab<=MAXTAB; nTab++ )
5082cdf0e10cSrcweir         if ( pTab[nTab] )
5083cdf0e10cSrcweir             nCellCount += pTab[nTab]->GetCellCount();
5084cdf0e10cSrcweir 
5085cdf0e10cSrcweir     return nCellCount;
5086cdf0e10cSrcweir }
5087cdf0e10cSrcweir 
GetCellCount(SCTAB nTab,SCCOL nCol) const5088cdf0e10cSrcweir SCSIZE ScDocument::GetCellCount(SCTAB nTab, SCCOL nCol) const
5089cdf0e10cSrcweir {
5090cdf0e10cSrcweir     if (!ValidTab(nTab) || !pTab[nTab])
5091cdf0e10cSrcweir         return 0;
5092cdf0e10cSrcweir 
5093cdf0e10cSrcweir     return pTab[nTab]->GetCellCount(nCol);
5094cdf0e10cSrcweir }
5095cdf0e10cSrcweir 
GetCodeCount() const5096cdf0e10cSrcweir sal_uLong ScDocument::GetCodeCount() const
5097cdf0e10cSrcweir {
5098cdf0e10cSrcweir     sal_uLong nCodeCount = 0;
5099cdf0e10cSrcweir 
5100cdf0e10cSrcweir     for ( SCTAB nTab=0; nTab<=MAXTAB; nTab++ )
5101cdf0e10cSrcweir         if ( pTab[nTab] )
5102cdf0e10cSrcweir             nCodeCount += pTab[nTab]->GetCodeCount();
5103cdf0e10cSrcweir 
5104cdf0e10cSrcweir     return nCodeCount;
5105cdf0e10cSrcweir }
5106cdf0e10cSrcweir 
5107cdf0e10cSrcweir 
GetWeightedCount() const5108cdf0e10cSrcweir sal_uLong ScDocument::GetWeightedCount() const
5109cdf0e10cSrcweir {
5110cdf0e10cSrcweir     sal_uLong nCellCount = 0L;
5111cdf0e10cSrcweir 
5112cdf0e10cSrcweir     for ( SCTAB nTab=0; nTab<=MAXTAB; nTab++ )
5113cdf0e10cSrcweir         if ( pTab[nTab] )
5114cdf0e10cSrcweir             nCellCount += pTab[nTab]->GetWeightedCount();
5115cdf0e10cSrcweir 
5116cdf0e10cSrcweir     return nCellCount;
5117cdf0e10cSrcweir }
5118cdf0e10cSrcweir 
5119cdf0e10cSrcweir 
PageStyleModified(SCTAB nTab,const String & rNewName)5120cdf0e10cSrcweir void ScDocument::PageStyleModified( SCTAB nTab, const String& rNewName )
5121cdf0e10cSrcweir {
5122cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
5123cdf0e10cSrcweir         pTab[nTab]->PageStyleModified( rNewName );
5124cdf0e10cSrcweir }
5125cdf0e10cSrcweir 
5126cdf0e10cSrcweir 
SetPageStyle(SCTAB nTab,const String & rName)5127cdf0e10cSrcweir void ScDocument::SetPageStyle( SCTAB nTab, const String& rName )
5128cdf0e10cSrcweir {
5129cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
5130cdf0e10cSrcweir         pTab[nTab]->SetPageStyle( rName );
5131cdf0e10cSrcweir }
5132cdf0e10cSrcweir 
5133cdf0e10cSrcweir 
GetPageStyle(SCTAB nTab) const5134cdf0e10cSrcweir const String& ScDocument::GetPageStyle( SCTAB nTab ) const
5135cdf0e10cSrcweir {
5136cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
5137cdf0e10cSrcweir         return pTab[nTab]->GetPageStyle();
5138cdf0e10cSrcweir 
5139cdf0e10cSrcweir     return EMPTY_STRING;
5140cdf0e10cSrcweir }
5141cdf0e10cSrcweir 
5142cdf0e10cSrcweir 
SetPageSize(SCTAB nTab,const Size & rSize)5143cdf0e10cSrcweir void ScDocument::SetPageSize( SCTAB nTab, const Size& rSize )
5144cdf0e10cSrcweir {
5145cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
5146cdf0e10cSrcweir         pTab[nTab]->SetPageSize( rSize );
5147cdf0e10cSrcweir }
5148cdf0e10cSrcweir 
GetPageSize(SCTAB nTab) const5149cdf0e10cSrcweir Size ScDocument::GetPageSize( SCTAB nTab ) const
5150cdf0e10cSrcweir {
5151cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
5152cdf0e10cSrcweir         return pTab[nTab]->GetPageSize();
5153cdf0e10cSrcweir 
5154cdf0e10cSrcweir     DBG_ERROR("falsche Tab");
5155cdf0e10cSrcweir     return Size();
5156cdf0e10cSrcweir }
5157cdf0e10cSrcweir 
5158cdf0e10cSrcweir 
SetRepeatArea(SCTAB nTab,SCCOL nStartCol,SCCOL nEndCol,SCROW nStartRow,SCROW nEndRow)5159cdf0e10cSrcweir void ScDocument::SetRepeatArea( SCTAB nTab, SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCROW nEndRow )
5160cdf0e10cSrcweir {
5161cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
5162cdf0e10cSrcweir         pTab[nTab]->SetRepeatArea( nStartCol, nEndCol, nStartRow, nEndRow );
5163cdf0e10cSrcweir }
5164cdf0e10cSrcweir 
InvalidatePageBreaks(SCTAB nTab)5165cdf0e10cSrcweir void ScDocument::InvalidatePageBreaks(SCTAB nTab)
5166cdf0e10cSrcweir {
5167cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5168cdf0e10cSrcweir         pTab[nTab]->InvalidatePageBreaks();
5169cdf0e10cSrcweir }
5170cdf0e10cSrcweir 
UpdatePageBreaks(SCTAB nTab,const ScRange * pUserArea)5171cdf0e10cSrcweir void ScDocument::UpdatePageBreaks( SCTAB nTab, const ScRange* pUserArea )
5172cdf0e10cSrcweir {
5173cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
5174cdf0e10cSrcweir         pTab[nTab]->UpdatePageBreaks( pUserArea );
5175cdf0e10cSrcweir }
5176cdf0e10cSrcweir 
RemoveManualBreaks(SCTAB nTab)5177cdf0e10cSrcweir void ScDocument::RemoveManualBreaks( SCTAB nTab )
5178cdf0e10cSrcweir {
5179cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
5180cdf0e10cSrcweir         pTab[nTab]->RemoveManualBreaks();
5181cdf0e10cSrcweir }
5182cdf0e10cSrcweir 
HasManualBreaks(SCTAB nTab) const5183cdf0e10cSrcweir sal_Bool ScDocument::HasManualBreaks( SCTAB nTab ) const
5184cdf0e10cSrcweir {
5185cdf0e10cSrcweir     if ( ValidTab(nTab)  && pTab[nTab] )
5186cdf0e10cSrcweir         return pTab[nTab]->HasManualBreaks();
5187cdf0e10cSrcweir 
5188cdf0e10cSrcweir     DBG_ERROR("falsche Tab");
5189cdf0e10cSrcweir     return sal_False;
5190cdf0e10cSrcweir }
5191cdf0e10cSrcweir 
5192cdf0e10cSrcweir 
GetDocStat(ScDocStat & rDocStat)5193cdf0e10cSrcweir void ScDocument::GetDocStat( ScDocStat& rDocStat )
5194cdf0e10cSrcweir {
5195cdf0e10cSrcweir     rDocStat.nTableCount = GetTableCount();
5196cdf0e10cSrcweir     rDocStat.aDocName    = aDocName;
5197cdf0e10cSrcweir     rDocStat.nCellCount  = GetCellCount();
5198cdf0e10cSrcweir }
5199cdf0e10cSrcweir 
5200cdf0e10cSrcweir 
HasPrintRange()5201cdf0e10cSrcweir sal_Bool ScDocument::HasPrintRange()
5202cdf0e10cSrcweir {
5203cdf0e10cSrcweir     sal_Bool bResult = sal_False;
5204cdf0e10cSrcweir 
5205cdf0e10cSrcweir     for ( SCTAB i=0; !bResult && i<nMaxTableNumber; i++ )
5206cdf0e10cSrcweir         if ( pTab[i] )
5207cdf0e10cSrcweir             bResult = pTab[i]->IsPrintEntireSheet() || (pTab[i]->GetPrintRangeCount() > 0);
5208cdf0e10cSrcweir 
5209cdf0e10cSrcweir     return bResult;
5210cdf0e10cSrcweir }
5211cdf0e10cSrcweir 
5212cdf0e10cSrcweir 
IsPrintEntireSheet(SCTAB nTab) const5213cdf0e10cSrcweir sal_Bool ScDocument::IsPrintEntireSheet( SCTAB nTab ) const
5214cdf0e10cSrcweir {
5215cdf0e10cSrcweir     return (ValidTab(nTab) ) && pTab[nTab] && pTab[nTab]->IsPrintEntireSheet();
5216cdf0e10cSrcweir }
5217cdf0e10cSrcweir 
5218cdf0e10cSrcweir 
GetPrintRangeCount(SCTAB nTab)5219cdf0e10cSrcweir sal_uInt16 ScDocument::GetPrintRangeCount( SCTAB nTab )
5220cdf0e10cSrcweir {
5221cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5222cdf0e10cSrcweir         return pTab[nTab]->GetPrintRangeCount();
5223cdf0e10cSrcweir 
5224cdf0e10cSrcweir     return 0;
5225cdf0e10cSrcweir }
5226cdf0e10cSrcweir 
5227cdf0e10cSrcweir 
GetPrintRange(SCTAB nTab,sal_uInt16 nPos)5228cdf0e10cSrcweir const ScRange* ScDocument::GetPrintRange( SCTAB nTab, sal_uInt16 nPos )
5229cdf0e10cSrcweir {
5230cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5231cdf0e10cSrcweir         return pTab[nTab]->GetPrintRange(nPos);
5232cdf0e10cSrcweir 
5233cdf0e10cSrcweir     return NULL;
5234cdf0e10cSrcweir }
5235cdf0e10cSrcweir 
5236cdf0e10cSrcweir 
GetRepeatColRange(SCTAB nTab)5237cdf0e10cSrcweir const ScRange* ScDocument::GetRepeatColRange( SCTAB nTab )
5238cdf0e10cSrcweir {
5239cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5240cdf0e10cSrcweir         return pTab[nTab]->GetRepeatColRange();
5241cdf0e10cSrcweir 
5242cdf0e10cSrcweir     return NULL;
5243cdf0e10cSrcweir }
5244cdf0e10cSrcweir 
5245cdf0e10cSrcweir 
GetRepeatRowRange(SCTAB nTab)5246cdf0e10cSrcweir const ScRange* ScDocument::GetRepeatRowRange( SCTAB nTab )
5247cdf0e10cSrcweir {
5248cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5249cdf0e10cSrcweir         return pTab[nTab]->GetRepeatRowRange();
5250cdf0e10cSrcweir 
5251cdf0e10cSrcweir     return NULL;
5252cdf0e10cSrcweir }
5253cdf0e10cSrcweir 
5254cdf0e10cSrcweir 
ClearPrintRanges(SCTAB nTab)5255cdf0e10cSrcweir void ScDocument::ClearPrintRanges( SCTAB nTab )
5256cdf0e10cSrcweir {
5257cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5258cdf0e10cSrcweir         pTab[nTab]->ClearPrintRanges();
5259cdf0e10cSrcweir }
5260cdf0e10cSrcweir 
5261cdf0e10cSrcweir 
AddPrintRange(SCTAB nTab,const ScRange & rNew)5262cdf0e10cSrcweir void ScDocument::AddPrintRange( SCTAB nTab, const ScRange& rNew )
5263cdf0e10cSrcweir {
5264cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5265cdf0e10cSrcweir         pTab[nTab]->AddPrintRange( rNew );
5266cdf0e10cSrcweir }
5267cdf0e10cSrcweir 
5268cdf0e10cSrcweir 
5269cdf0e10cSrcweir //UNUSED2009-05 void ScDocument::SetPrintRange( SCTAB nTab, const ScRange& rNew )
5270cdf0e10cSrcweir //UNUSED2009-05 {
5271cdf0e10cSrcweir //UNUSED2009-05     if (ValidTab(nTab) && pTab[nTab])
5272cdf0e10cSrcweir //UNUSED2009-05         pTab[nTab]->SetPrintRange( rNew );
5273cdf0e10cSrcweir //UNUSED2009-05 }
5274cdf0e10cSrcweir 
5275cdf0e10cSrcweir 
SetPrintEntireSheet(SCTAB nTab)5276cdf0e10cSrcweir void ScDocument::SetPrintEntireSheet( SCTAB nTab )
5277cdf0e10cSrcweir {
5278cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5279cdf0e10cSrcweir         pTab[nTab]->SetPrintEntireSheet();
5280cdf0e10cSrcweir }
5281cdf0e10cSrcweir 
5282cdf0e10cSrcweir 
SetRepeatColRange(SCTAB nTab,const ScRange * pNew)5283cdf0e10cSrcweir void ScDocument::SetRepeatColRange( SCTAB nTab, const ScRange* pNew )
5284cdf0e10cSrcweir {
5285cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5286cdf0e10cSrcweir         pTab[nTab]->SetRepeatColRange( pNew );
5287cdf0e10cSrcweir }
5288cdf0e10cSrcweir 
5289cdf0e10cSrcweir 
SetRepeatRowRange(SCTAB nTab,const ScRange * pNew)5290cdf0e10cSrcweir void ScDocument::SetRepeatRowRange( SCTAB nTab, const ScRange* pNew )
5291cdf0e10cSrcweir {
5292cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5293cdf0e10cSrcweir         pTab[nTab]->SetRepeatRowRange( pNew );
5294cdf0e10cSrcweir }
5295cdf0e10cSrcweir 
5296cdf0e10cSrcweir 
CreatePrintRangeSaver() const5297cdf0e10cSrcweir ScPrintRangeSaver* ScDocument::CreatePrintRangeSaver() const
5298cdf0e10cSrcweir {
5299cdf0e10cSrcweir     SCTAB nCount = GetTableCount();
5300cdf0e10cSrcweir     ScPrintRangeSaver* pNew = new ScPrintRangeSaver( nCount );
5301cdf0e10cSrcweir     for (SCTAB i=0; i<nCount; i++)
5302cdf0e10cSrcweir         if (pTab[i])
5303cdf0e10cSrcweir             pTab[i]->FillPrintSaver( pNew->GetTabData(i) );
5304cdf0e10cSrcweir     return pNew;
5305cdf0e10cSrcweir }
5306cdf0e10cSrcweir 
5307cdf0e10cSrcweir 
RestorePrintRanges(const ScPrintRangeSaver & rSaver)5308cdf0e10cSrcweir void ScDocument::RestorePrintRanges( const ScPrintRangeSaver& rSaver )
5309cdf0e10cSrcweir {
5310cdf0e10cSrcweir     SCTAB nCount = rSaver.GetTabCount();
5311cdf0e10cSrcweir     for (SCTAB i=0; i<nCount; i++)
5312cdf0e10cSrcweir         if (pTab[i])
5313cdf0e10cSrcweir             pTab[i]->RestorePrintRanges( rSaver.GetTabData(i) );
5314cdf0e10cSrcweir }
5315cdf0e10cSrcweir 
5316cdf0e10cSrcweir 
NeedPageResetAfterTab(SCTAB nTab) const5317cdf0e10cSrcweir sal_Bool ScDocument::NeedPageResetAfterTab( SCTAB nTab ) const
5318cdf0e10cSrcweir {
5319982a05a9Smseidel     // Die Seitennummern-Zaehlung fängt bei einer Tabelle neu an, wenn eine
5320cdf0e10cSrcweir     // andere Vorlage als bei der vorherigen gesetzt ist (nur Namen vergleichen)
5321cdf0e10cSrcweir     // und eine Seitennummer angegeben ist (nicht 0)
5322cdf0e10cSrcweir 
5323cdf0e10cSrcweir     if ( nTab < MAXTAB && pTab[nTab] && pTab[nTab+1] )
5324cdf0e10cSrcweir     {
5325cdf0e10cSrcweir         String aNew = pTab[nTab+1]->GetPageStyle();
5326cdf0e10cSrcweir         if ( aNew != pTab[nTab]->GetPageStyle() )
5327cdf0e10cSrcweir         {
5328cdf0e10cSrcweir             SfxStyleSheetBase* pStyle = xPoolHelper->GetStylePool()->Find( aNew, SFX_STYLE_FAMILY_PAGE );
5329cdf0e10cSrcweir             if ( pStyle )
5330cdf0e10cSrcweir             {
5331cdf0e10cSrcweir                 const SfxItemSet& rSet = pStyle->GetItemSet();
5332cdf0e10cSrcweir                 sal_uInt16 nFirst = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_FIRSTPAGENO)).GetValue();
5333cdf0e10cSrcweir                 if ( nFirst != 0 )
5334cdf0e10cSrcweir                     return sal_True; // Seitennummer in neuer Vorlage angegeben
5335cdf0e10cSrcweir             }
5336cdf0e10cSrcweir         }
5337cdf0e10cSrcweir     }
5338cdf0e10cSrcweir 
5339cdf0e10cSrcweir     return sal_False; // sonst nicht
5340cdf0e10cSrcweir }
5341cdf0e10cSrcweir 
GetUndoManager()5342cdf0e10cSrcweir SfxUndoManager* ScDocument::GetUndoManager()
5343cdf0e10cSrcweir {
5344cdf0e10cSrcweir     if (!mpUndoManager)
534514af77b6SArmin Le Grand     {
534614af77b6SArmin Le Grand         // to support enhanced text edit for draw objects, use an SdrUndoManager
534714af77b6SArmin Le Grand         mpUndoManager = new SdrUndoManager;
534814af77b6SArmin Le Grand     }
534914af77b6SArmin Le Grand 
5350cdf0e10cSrcweir     return mpUndoManager;
5351cdf0e10cSrcweir }
5352cdf0e10cSrcweir 
GetRowBreakIterator(SCTAB nTab) const5353cdf0e10cSrcweir ScRowBreakIterator* ScDocument::GetRowBreakIterator(SCTAB nTab) const
5354cdf0e10cSrcweir {
5355cdf0e10cSrcweir     if (ValidTab(nTab) && pTab[nTab])
5356cdf0e10cSrcweir         return new ScRowBreakIterator(pTab[nTab]->maRowPageBreaks);
5357cdf0e10cSrcweir     return NULL;
5358cdf0e10cSrcweir }
5359cdf0e10cSrcweir 
EnableUndo(bool bVal)5360cdf0e10cSrcweir void ScDocument::EnableUndo( bool bVal )
5361cdf0e10cSrcweir {
5362cdf0e10cSrcweir     GetUndoManager()->EnableUndo(bVal);
5363cdf0e10cSrcweir     if( pDrawLayer ) pDrawLayer->EnableUndo(bVal);
5364cdf0e10cSrcweir     mbUndoEnabled = bVal;
5365cdf0e10cSrcweir }
5366cdf0e10cSrcweir 
IsInVBAMode() const5367cdf0e10cSrcweir bool ScDocument::IsInVBAMode() const
5368cdf0e10cSrcweir {
5369cdf0e10cSrcweir     bool bResult = false;
5370cdf0e10cSrcweir     if ( pShell )
5371cdf0e10cSrcweir     {
5372cdf0e10cSrcweir         com::sun::star::uno::Reference< com::sun::star::script::vba::XVBACompatibility > xVBA( pShell->GetBasicContainer(), com::sun::star::uno::UNO_QUERY );
5373cdf0e10cSrcweir         bResult = xVBA.is() && xVBA->getVBACompatibilityMode();
5374cdf0e10cSrcweir     }
5375cdf0e10cSrcweir     return bResult;
5376cdf0e10cSrcweir }
5377982a05a9Smseidel 
5378982a05a9Smseidel /* vim: set noet sw=4 ts=4: */
5379