xref: /aoo4110/main/sc/source/ui/view/viewfun2.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski // INCLUDE ---------------------------------------------------------------
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include "scitems.hxx"
30*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <sfx2/app.hxx>
33*b1cdbd2cSJim Jagielski #define _SVSTDARR_STRINGS
34*b1cdbd2cSJim Jagielski #include <editeng/boxitem.hxx>
35*b1cdbd2cSJim Jagielski #include <editeng/fontitem.hxx>
36*b1cdbd2cSJim Jagielski #include <editeng/scripttypeitem.hxx>
37*b1cdbd2cSJim Jagielski #include <svl/srchitem.hxx>
38*b1cdbd2cSJim Jagielski #include <sfx2/linkmgr.hxx>
39*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
40*b1cdbd2cSJim Jagielski #include <sfx2/docfilt.hxx>
41*b1cdbd2cSJim Jagielski #include <sfx2/docfile.hxx>
42*b1cdbd2cSJim Jagielski #include <sfx2/objitem.hxx>
43*b1cdbd2cSJim Jagielski #include <sfx2/viewfrm.hxx>
44*b1cdbd2cSJim Jagielski #include <svl/stritem.hxx>
45*b1cdbd2cSJim Jagielski #include <svl/zforlist.hxx>
46*b1cdbd2cSJim Jagielski #include <svl/svstdarr.hxx>
47*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
48*b1cdbd2cSJim Jagielski #include <vcl/sound.hxx>
49*b1cdbd2cSJim Jagielski #include <vcl/waitobj.hxx>
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski #include "viewfunc.hxx"
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski #include "sc.hrc"
54*b1cdbd2cSJim Jagielski #include "globstr.hrc"
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski #include "attrib.hxx"
57*b1cdbd2cSJim Jagielski #include "autoform.hxx"
58*b1cdbd2cSJim Jagielski #include "cell.hxx"					// EnterAutoSum
59*b1cdbd2cSJim Jagielski #include "compiler.hxx"
60*b1cdbd2cSJim Jagielski #include "docfunc.hxx"
61*b1cdbd2cSJim Jagielski #include "docpool.hxx"
62*b1cdbd2cSJim Jagielski #include "docsh.hxx"
63*b1cdbd2cSJim Jagielski #include "global.hxx"
64*b1cdbd2cSJim Jagielski #include "patattr.hxx"
65*b1cdbd2cSJim Jagielski #include "printfun.hxx"
66*b1cdbd2cSJim Jagielski #include "rangenam.hxx"
67*b1cdbd2cSJim Jagielski #include "rangeutl.hxx"
68*b1cdbd2cSJim Jagielski #include "refundo.hxx"
69*b1cdbd2cSJim Jagielski #include "tablink.hxx"
70*b1cdbd2cSJim Jagielski #include "tabvwsh.hxx"
71*b1cdbd2cSJim Jagielski #include "uiitems.hxx"
72*b1cdbd2cSJim Jagielski #include "undoblk.hxx"
73*b1cdbd2cSJim Jagielski #include "undocell.hxx"
74*b1cdbd2cSJim Jagielski #include "undotab.hxx"
75*b1cdbd2cSJim Jagielski #include "sizedev.hxx"
76*b1cdbd2cSJim Jagielski #include "editable.hxx"
77*b1cdbd2cSJim Jagielski #include "scmod.hxx"
78*b1cdbd2cSJim Jagielski #include "inputhdl.hxx"
79*b1cdbd2cSJim Jagielski #include "inputwin.hxx"
80*b1cdbd2cSJim Jagielski #include "funcdesc.hxx"
81*b1cdbd2cSJim Jagielski #include "docuno.hxx"
82*b1cdbd2cSJim Jagielski #include "charthelper.hxx"
83*b1cdbd2cSJim Jagielski #include "tabbgcolor.hxx"
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski #include <basic/sbstar.hxx>
86*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameContainer.hpp>
87*b1cdbd2cSJim Jagielski #include <com/sun/star/script/XLibraryContainer.hpp>
88*b1cdbd2cSJim Jagielski using namespace com::sun::star;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski // helper func defined in docfunc.cxx
91*b1cdbd2cSJim Jagielski void VBA_DeleteModule( ScDocShell& rDocSh, String& sModuleName );
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski // STATIC DATA ---------------------------------------------------------------
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
97*b1cdbd2cSJim Jagielski 
AdjustBlockHeight(sal_Bool bPaint,ScMarkData * pMarkData)98*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::AdjustBlockHeight( sal_Bool bPaint, ScMarkData* pMarkData )
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
101*b1cdbd2cSJim Jagielski 	if (!pMarkData)
102*b1cdbd2cSJim Jagielski 		pMarkData = &GetViewData()->GetMarkData();
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pDocSh->GetDocument();
105*b1cdbd2cSJim Jagielski 	SCCOLROW* pRanges = new SCCOLROW[MAXCOLROWCOUNT];
106*b1cdbd2cSJim Jagielski 	SCCOLROW nRangeCnt = pMarkData->GetMarkRowRanges( pRanges );
107*b1cdbd2cSJim Jagielski 	if (nRangeCnt == 0)
108*b1cdbd2cSJim Jagielski 	{
109*b1cdbd2cSJim Jagielski 		pRanges[0] = pRanges[1] = GetViewData()->GetCurY();
110*b1cdbd2cSJim Jagielski 		nRangeCnt = 1;
111*b1cdbd2cSJim Jagielski 	}
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski 	double nPPTX = GetViewData()->GetPPTX();
114*b1cdbd2cSJim Jagielski 	double nPPTY = GetViewData()->GetPPTY();
115*b1cdbd2cSJim Jagielski 	Fraction aZoomX = GetViewData()->GetZoomX();
116*b1cdbd2cSJim Jagielski 	Fraction aZoomY = GetViewData()->GetZoomY();
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski 	ScSizeDeviceProvider aProv(pDocSh);
119*b1cdbd2cSJim Jagielski 	if (aProv.IsPrinter())
120*b1cdbd2cSJim Jagielski 	{
121*b1cdbd2cSJim Jagielski 		nPPTX = aProv.GetPPTX();
122*b1cdbd2cSJim Jagielski 		nPPTY = aProv.GetPPTY();
123*b1cdbd2cSJim Jagielski 		aZoomX = aZoomY = Fraction( 1, 1 );
124*b1cdbd2cSJim Jagielski 	}
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski 	sal_Bool bAnyChanged = sal_False;
127*b1cdbd2cSJim Jagielski 	SCTAB nTabCount = pDoc->GetTableCount();
128*b1cdbd2cSJim Jagielski 	for (SCTAB nTab=0; nTab<nTabCount; nTab++)
129*b1cdbd2cSJim Jagielski 	{
130*b1cdbd2cSJim Jagielski 		if (pMarkData->GetTableSelect(nTab))
131*b1cdbd2cSJim Jagielski 		{
132*b1cdbd2cSJim Jagielski 			SCCOLROW* pOneRange = pRanges;
133*b1cdbd2cSJim Jagielski 			sal_Bool bChanged = sal_False;
134*b1cdbd2cSJim Jagielski             SCROW nPaintY = 0;
135*b1cdbd2cSJim Jagielski 			for (SCROW nRangeNo=0; nRangeNo<nRangeCnt; nRangeNo++)
136*b1cdbd2cSJim Jagielski 			{
137*b1cdbd2cSJim Jagielski 				SCROW nStartNo = *(pOneRange++);
138*b1cdbd2cSJim Jagielski 				SCROW nEndNo = *(pOneRange++);
139*b1cdbd2cSJim Jagielski 				if (pDoc->SetOptimalHeight( nStartNo, nEndNo, nTab, 0, aProv.GetDevice(),
140*b1cdbd2cSJim Jagielski 											nPPTX, nPPTY, aZoomX, aZoomY, sal_False ))
141*b1cdbd2cSJim Jagielski 				{
142*b1cdbd2cSJim Jagielski 					if (!bChanged)
143*b1cdbd2cSJim Jagielski 						nPaintY = nStartNo;
144*b1cdbd2cSJim Jagielski 					bAnyChanged = bChanged = sal_True;
145*b1cdbd2cSJim Jagielski 				}
146*b1cdbd2cSJim Jagielski 			}
147*b1cdbd2cSJim Jagielski 			if ( bPaint && bChanged )
148*b1cdbd2cSJim Jagielski 				pDocSh->PostPaint( 0, nPaintY, nTab, MAXCOL, MAXROW, nTab,
149*b1cdbd2cSJim Jagielski 													PAINT_GRID | PAINT_LEFT );
150*b1cdbd2cSJim Jagielski 		}
151*b1cdbd2cSJim Jagielski 	}
152*b1cdbd2cSJim Jagielski 	delete[] pRanges;
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski 	if ( bPaint && bAnyChanged )
155*b1cdbd2cSJim Jagielski 		pDocSh->UpdateOle(GetViewData());
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 	return bAnyChanged;
158*b1cdbd2cSJim Jagielski }
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
162*b1cdbd2cSJim Jagielski 
AdjustRowHeight(SCROW nStartRow,SCROW nEndRow,sal_Bool bPaint)163*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::AdjustRowHeight( SCROW nStartRow, SCROW nEndRow, sal_Bool bPaint )
164*b1cdbd2cSJim Jagielski {
165*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
166*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pDocSh->GetDocument();
167*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
168*b1cdbd2cSJim Jagielski 	double nPPTX = GetViewData()->GetPPTX();
169*b1cdbd2cSJim Jagielski 	double nPPTY = GetViewData()->GetPPTY();
170*b1cdbd2cSJim Jagielski 	Fraction aZoomX = GetViewData()->GetZoomX();
171*b1cdbd2cSJim Jagielski 	Fraction aZoomY = GetViewData()->GetZoomY();
172*b1cdbd2cSJim Jagielski     sal_uInt16 nOldPixel = 0;
173*b1cdbd2cSJim Jagielski 	if (nStartRow == nEndRow)
174*b1cdbd2cSJim Jagielski 		nOldPixel = (sal_uInt16) (pDoc->GetRowHeight(nStartRow,nTab) * nPPTY);
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 	ScSizeDeviceProvider aProv(pDocSh);
177*b1cdbd2cSJim Jagielski 	if (aProv.IsPrinter())
178*b1cdbd2cSJim Jagielski 	{
179*b1cdbd2cSJim Jagielski 		nPPTX = aProv.GetPPTX();
180*b1cdbd2cSJim Jagielski 		nPPTY = aProv.GetPPTY();
181*b1cdbd2cSJim Jagielski 		aZoomX = aZoomY = Fraction( 1, 1 );
182*b1cdbd2cSJim Jagielski 	}
183*b1cdbd2cSJim Jagielski 	sal_Bool bChanged = pDoc->SetOptimalHeight( nStartRow, nEndRow, nTab, 0, aProv.GetDevice(),
184*b1cdbd2cSJim Jagielski 											nPPTX, nPPTY, aZoomX, aZoomY, sal_False );
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski 	if (bChanged && ( nStartRow == nEndRow ))
187*b1cdbd2cSJim Jagielski 	{
188*b1cdbd2cSJim Jagielski 		sal_uInt16 nNewPixel = (sal_uInt16) (pDoc->GetRowHeight(nStartRow,nTab) * nPPTY);
189*b1cdbd2cSJim Jagielski 		if ( nNewPixel == nOldPixel )
190*b1cdbd2cSJim Jagielski 			bChanged = sal_False;
191*b1cdbd2cSJim Jagielski 	}
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 	if ( bPaint && bChanged )
194*b1cdbd2cSJim Jagielski 		pDocSh->PostPaint( 0, nStartRow, nTab, MAXCOL, MAXROW, nTab,
195*b1cdbd2cSJim Jagielski 											PAINT_GRID | PAINT_LEFT );
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 	return bChanged;
198*b1cdbd2cSJim Jagielski }
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski 
201*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski enum ScAutoSum
204*b1cdbd2cSJim Jagielski {
205*b1cdbd2cSJim Jagielski 	ScAutoSumNone = 0,
206*b1cdbd2cSJim Jagielski 	ScAutoSumData,
207*b1cdbd2cSJim Jagielski 	ScAutoSumSum
208*b1cdbd2cSJim Jagielski };
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski 
lcl_IsAutoSumData(ScDocument * pDoc,SCCOL nCol,SCROW nRow,SCTAB nTab,ScDirection eDir,SCCOLROW & nExtend)211*b1cdbd2cSJim Jagielski ScAutoSum lcl_IsAutoSumData( ScDocument* pDoc, SCCOL nCol, SCROW nRow,
212*b1cdbd2cSJim Jagielski 		SCTAB nTab, ScDirection eDir, SCCOLROW& nExtend )
213*b1cdbd2cSJim Jagielski {
214*b1cdbd2cSJim Jagielski 	ScBaseCell* pCell;
215*b1cdbd2cSJim Jagielski 	pDoc->GetCell( nCol, nRow, nTab, pCell );
216*b1cdbd2cSJim Jagielski 	if ( pCell && pCell->HasValueData() )
217*b1cdbd2cSJim Jagielski 	{
218*b1cdbd2cSJim Jagielski 		if ( pCell->GetCellType() == CELLTYPE_FORMULA )
219*b1cdbd2cSJim Jagielski 		{
220*b1cdbd2cSJim Jagielski 			ScTokenArray* pCode = ((ScFormulaCell*)pCell)->GetCode();
221*b1cdbd2cSJim Jagielski 			if ( pCode && pCode->GetOuterFuncOpCode() == ocSum )
222*b1cdbd2cSJim Jagielski 			{
223*b1cdbd2cSJim Jagielski 				if ( pCode->GetAdjacentExtendOfOuterFuncRefs( nExtend,
224*b1cdbd2cSJim Jagielski 						ScAddress( nCol, nRow, nTab ), eDir ) )
225*b1cdbd2cSJim Jagielski 					return ScAutoSumSum;
226*b1cdbd2cSJim Jagielski 			}
227*b1cdbd2cSJim Jagielski 		}
228*b1cdbd2cSJim Jagielski 		return ScAutoSumData;
229*b1cdbd2cSJim Jagielski 	}
230*b1cdbd2cSJim Jagielski 	return ScAutoSumNone;
231*b1cdbd2cSJim Jagielski }
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski #define SC_AUTOSUM_MAXCOUNT		20
237*b1cdbd2cSJim Jagielski 
lcl_SeekAutoSumData(ScDocument * pDoc,SCCOL & nCol,SCROW & nRow,SCTAB nTab,ScDirection eDir,SCCOLROW & nExtend)238*b1cdbd2cSJim Jagielski ScAutoSum lcl_SeekAutoSumData( ScDocument* pDoc, SCCOL& nCol, SCROW& nRow,
239*b1cdbd2cSJim Jagielski 		SCTAB nTab, ScDirection eDir, SCCOLROW& nExtend )
240*b1cdbd2cSJim Jagielski {
241*b1cdbd2cSJim Jagielski 	sal_uInt16 nCount = 0;
242*b1cdbd2cSJim Jagielski 	while (nCount < SC_AUTOSUM_MAXCOUNT)
243*b1cdbd2cSJim Jagielski 	{
244*b1cdbd2cSJim Jagielski 		if ( eDir == DIR_TOP )
245*b1cdbd2cSJim Jagielski 		{
246*b1cdbd2cSJim Jagielski 			if (nRow > 0)
247*b1cdbd2cSJim Jagielski 				--nRow;
248*b1cdbd2cSJim Jagielski 			else
249*b1cdbd2cSJim Jagielski 				return ScAutoSumNone;
250*b1cdbd2cSJim Jagielski 		}
251*b1cdbd2cSJim Jagielski 		else
252*b1cdbd2cSJim Jagielski 		{
253*b1cdbd2cSJim Jagielski 			if (nCol > 0)
254*b1cdbd2cSJim Jagielski 				--nCol;
255*b1cdbd2cSJim Jagielski 			else
256*b1cdbd2cSJim Jagielski 				return ScAutoSumNone;
257*b1cdbd2cSJim Jagielski 		}
258*b1cdbd2cSJim Jagielski 		ScAutoSum eSum;
259*b1cdbd2cSJim Jagielski 		if ( (eSum = lcl_IsAutoSumData(
260*b1cdbd2cSJim Jagielski 				pDoc, nCol, nRow, nTab, eDir, nExtend )) != ScAutoSumNone )
261*b1cdbd2cSJim Jagielski 			return eSum;
262*b1cdbd2cSJim Jagielski 		++nCount;
263*b1cdbd2cSJim Jagielski 	}
264*b1cdbd2cSJim Jagielski 	return ScAutoSumNone;
265*b1cdbd2cSJim Jagielski }
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski #undef SC_AUTOSUM_MAXCOUNT
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
270*b1cdbd2cSJim Jagielski 
lcl_FindNextSumEntryInColumn(ScDocument * pDoc,SCCOL nCol,SCROW & nRow,SCTAB nTab,SCCOLROW & nExtend,SCROW nMinRow)271*b1cdbd2cSJim Jagielski bool lcl_FindNextSumEntryInColumn( ScDocument* pDoc, SCCOL nCol, SCROW& nRow,
272*b1cdbd2cSJim Jagielski                                    SCTAB nTab, SCCOLROW& nExtend, SCROW nMinRow )
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski     const SCROW nTmp = nRow;
275*b1cdbd2cSJim Jagielski     ScAutoSum eSkip = ScAutoSumNone;
276*b1cdbd2cSJim Jagielski     while ( ( eSkip = lcl_IsAutoSumData( pDoc, nCol, nRow, nTab, DIR_TOP, nExtend ) ) == ScAutoSumData &&
277*b1cdbd2cSJim Jagielski             nRow > nMinRow )
278*b1cdbd2cSJim Jagielski     {
279*b1cdbd2cSJim Jagielski         --nRow;
280*b1cdbd2cSJim Jagielski     }
281*b1cdbd2cSJim Jagielski     if ( eSkip == ScAutoSumSum && nRow < nTmp )
282*b1cdbd2cSJim Jagielski     {
283*b1cdbd2cSJim Jagielski         return true;
284*b1cdbd2cSJim Jagielski     }
285*b1cdbd2cSJim Jagielski     return false;
286*b1cdbd2cSJim Jagielski }
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
289*b1cdbd2cSJim Jagielski 
lcl_FindNextSumEntryInRow(ScDocument * pDoc,SCCOL & nCol,SCROW nRow,SCTAB nTab,SCCOLROW & nExtend,SCROW nMinCol)290*b1cdbd2cSJim Jagielski bool lcl_FindNextSumEntryInRow( ScDocument* pDoc, SCCOL& nCol, SCROW nRow,
291*b1cdbd2cSJim Jagielski                                 SCTAB nTab, SCCOLROW& nExtend, SCROW nMinCol )
292*b1cdbd2cSJim Jagielski {
293*b1cdbd2cSJim Jagielski     const SCCOL nTmp = nCol;
294*b1cdbd2cSJim Jagielski     ScAutoSum eSkip = ScAutoSumNone;
295*b1cdbd2cSJim Jagielski     while ( ( eSkip = lcl_IsAutoSumData( pDoc, nCol, nRow, nTab, DIR_LEFT, nExtend ) ) == ScAutoSumData &&
296*b1cdbd2cSJim Jagielski             nCol > nMinCol )
297*b1cdbd2cSJim Jagielski     {
298*b1cdbd2cSJim Jagielski         --nCol;
299*b1cdbd2cSJim Jagielski     }
300*b1cdbd2cSJim Jagielski     if ( eSkip == ScAutoSumSum && nCol < nTmp )
301*b1cdbd2cSJim Jagielski     {
302*b1cdbd2cSJim Jagielski         return true;
303*b1cdbd2cSJim Jagielski     }
304*b1cdbd2cSJim Jagielski     return false;
305*b1cdbd2cSJim Jagielski }
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
308*b1cdbd2cSJim Jagielski 
lcl_GetAutoSumForColumnRange(ScDocument * pDoc,ScRangeList & rRangeList,const ScRange & rRange)309*b1cdbd2cSJim Jagielski bool lcl_GetAutoSumForColumnRange( ScDocument* pDoc, ScRangeList& rRangeList, const ScRange& rRange )
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski     const ScAddress aStart = rRange.aStart;
312*b1cdbd2cSJim Jagielski     const ScAddress aEnd = rRange.aEnd;
313*b1cdbd2cSJim Jagielski     if ( aStart.Col() != aEnd.Col() )
314*b1cdbd2cSJim Jagielski     {
315*b1cdbd2cSJim Jagielski         return false;
316*b1cdbd2cSJim Jagielski     }
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski     const SCTAB nTab = aEnd.Tab();
319*b1cdbd2cSJim Jagielski     const SCCOL nCol = aEnd.Col();
320*b1cdbd2cSJim Jagielski     SCROW nEndRow = aEnd.Row();
321*b1cdbd2cSJim Jagielski     SCROW nStartRow = nEndRow;
322*b1cdbd2cSJim Jagielski     SCCOLROW nExtend = 0;
323*b1cdbd2cSJim Jagielski     const ScAutoSum eSum = lcl_IsAutoSumData( pDoc, nCol, nEndRow, nTab, DIR_TOP, nExtend /*out*/ );
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski     if ( eSum == ScAutoSumSum )
326*b1cdbd2cSJim Jagielski     {
327*b1cdbd2cSJim Jagielski         bool bContinue = false;
328*b1cdbd2cSJim Jagielski         do
329*b1cdbd2cSJim Jagielski         {
330*b1cdbd2cSJim Jagielski             rRangeList.Append( ScRange( nCol, nStartRow, nTab, nCol, nEndRow, nTab ) );
331*b1cdbd2cSJim Jagielski             nEndRow = static_cast< SCROW >( nExtend );
332*b1cdbd2cSJim Jagielski             if ( ( bContinue = lcl_FindNextSumEntryInColumn( pDoc, nCol, nEndRow /*inout*/, nTab, nExtend /*out*/, aStart.Row() ) ) == true )
333*b1cdbd2cSJim Jagielski             {
334*b1cdbd2cSJim Jagielski                 nStartRow = nEndRow;
335*b1cdbd2cSJim Jagielski             }
336*b1cdbd2cSJim Jagielski         } while ( bContinue );
337*b1cdbd2cSJim Jagielski     }
338*b1cdbd2cSJim Jagielski     else
339*b1cdbd2cSJim Jagielski     {
340*b1cdbd2cSJim Jagielski         while ( nStartRow > aStart.Row() &&
341*b1cdbd2cSJim Jagielski                 lcl_IsAutoSumData( pDoc, nCol, nStartRow-1, nTab, DIR_TOP, nExtend /*out*/ ) != ScAutoSumSum )
342*b1cdbd2cSJim Jagielski         {
343*b1cdbd2cSJim Jagielski             --nStartRow;
344*b1cdbd2cSJim Jagielski         }
345*b1cdbd2cSJim Jagielski         rRangeList.Append( ScRange( nCol, nStartRow, nTab, nCol, nEndRow, nTab ) );
346*b1cdbd2cSJim Jagielski     }
347*b1cdbd2cSJim Jagielski 
348*b1cdbd2cSJim Jagielski     return true;
349*b1cdbd2cSJim Jagielski }
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
352*b1cdbd2cSJim Jagielski 
lcl_GetAutoSumForRowRange(ScDocument * pDoc,ScRangeList & rRangeList,const ScRange & rRange)353*b1cdbd2cSJim Jagielski bool lcl_GetAutoSumForRowRange( ScDocument* pDoc, ScRangeList& rRangeList, const ScRange& rRange )
354*b1cdbd2cSJim Jagielski {
355*b1cdbd2cSJim Jagielski     const ScAddress aStart = rRange.aStart;
356*b1cdbd2cSJim Jagielski     const ScAddress aEnd = rRange.aEnd;
357*b1cdbd2cSJim Jagielski     if ( aStart.Row() != aEnd.Row() )
358*b1cdbd2cSJim Jagielski     {
359*b1cdbd2cSJim Jagielski         return false;
360*b1cdbd2cSJim Jagielski     }
361*b1cdbd2cSJim Jagielski 
362*b1cdbd2cSJim Jagielski     const SCTAB nTab = aEnd.Tab();
363*b1cdbd2cSJim Jagielski     const SCROW nRow = aEnd.Row();
364*b1cdbd2cSJim Jagielski     SCCOL nEndCol = aEnd.Col();
365*b1cdbd2cSJim Jagielski     SCCOL nStartCol = nEndCol;
366*b1cdbd2cSJim Jagielski     SCCOLROW nExtend = 0;
367*b1cdbd2cSJim Jagielski     const ScAutoSum eSum = lcl_IsAutoSumData( pDoc, nEndCol, nRow, nTab, DIR_LEFT, nExtend /*out*/ );
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski     if ( eSum == ScAutoSumSum )
370*b1cdbd2cSJim Jagielski     {
371*b1cdbd2cSJim Jagielski         bool bContinue = false;
372*b1cdbd2cSJim Jagielski         do
373*b1cdbd2cSJim Jagielski         {
374*b1cdbd2cSJim Jagielski             rRangeList.Append( ScRange( nStartCol, nRow, nTab, nEndCol, nRow, nTab ) );
375*b1cdbd2cSJim Jagielski             nEndCol = static_cast< SCCOL >( nExtend );
376*b1cdbd2cSJim Jagielski             if ( ( bContinue = lcl_FindNextSumEntryInRow( pDoc, nEndCol /*inout*/, nRow, nTab, nExtend /*out*/, aStart.Col() ) ) == true )
377*b1cdbd2cSJim Jagielski             {
378*b1cdbd2cSJim Jagielski                 nStartCol = nEndCol;
379*b1cdbd2cSJim Jagielski             }
380*b1cdbd2cSJim Jagielski         } while ( bContinue );
381*b1cdbd2cSJim Jagielski     }
382*b1cdbd2cSJim Jagielski     else
383*b1cdbd2cSJim Jagielski     {
384*b1cdbd2cSJim Jagielski         while ( nStartCol > aStart.Col() &&
385*b1cdbd2cSJim Jagielski                 lcl_IsAutoSumData( pDoc, nStartCol-1, nRow, nTab, DIR_LEFT, nExtend /*out*/ ) != ScAutoSumSum )
386*b1cdbd2cSJim Jagielski         {
387*b1cdbd2cSJim Jagielski             --nStartCol;
388*b1cdbd2cSJim Jagielski         }
389*b1cdbd2cSJim Jagielski         rRangeList.Append( ScRange( nStartCol, nRow, nTab, nEndCol, nRow, nTab ) );
390*b1cdbd2cSJim Jagielski     }
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski     return true;
393*b1cdbd2cSJim Jagielski }
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
396*b1cdbd2cSJim Jagielski 
GetAutoSumArea(ScRangeList & rRangeList)397*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::GetAutoSumArea( ScRangeList& rRangeList )
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = GetViewData()->GetDocument();
400*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 	SCCOL nCol = GetViewData()->GetCurX();
403*b1cdbd2cSJim Jagielski 	SCROW nRow = GetViewData()->GetCurY();
404*b1cdbd2cSJim Jagielski 
405*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = nCol;
406*b1cdbd2cSJim Jagielski 	SCROW nStartRow = nRow;
407*b1cdbd2cSJim Jagielski 	SCCOL nEndCol	 = nCol;
408*b1cdbd2cSJim Jagielski 	SCROW nEndRow	 = nRow;
409*b1cdbd2cSJim Jagielski 	SCCOL nSeekCol	 = nCol;
410*b1cdbd2cSJim Jagielski 	SCROW nSeekRow	 = nRow;
411*b1cdbd2cSJim Jagielski 	SCCOLROW nExtend;		// wird per Reference gueltig bei ScAutoSumSum
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski 	sal_Bool bCol = sal_False;
414*b1cdbd2cSJim Jagielski 	sal_Bool bRow = sal_False;
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski 	ScAutoSum eSum;
417*b1cdbd2cSJim Jagielski 	if ( nRow != 0
418*b1cdbd2cSJim Jagielski 			&& ((eSum = lcl_IsAutoSumData( pDoc, nCol, nRow-1, nTab,
419*b1cdbd2cSJim Jagielski 				DIR_TOP, nExtend /*out*/ )) == ScAutoSumData )
420*b1cdbd2cSJim Jagielski 			&& ((eSum = lcl_IsAutoSumData( pDoc, nCol, nRow-1, nTab,
421*b1cdbd2cSJim Jagielski 				DIR_LEFT, nExtend /*out*/ )) == ScAutoSumData )
422*b1cdbd2cSJim Jagielski 		)
423*b1cdbd2cSJim Jagielski 	{
424*b1cdbd2cSJim Jagielski 		bRow = sal_True;
425*b1cdbd2cSJim Jagielski 		nSeekRow = nRow - 1;
426*b1cdbd2cSJim Jagielski 	}
427*b1cdbd2cSJim Jagielski 	else if ( nCol != 0 && (eSum = lcl_IsAutoSumData( pDoc, nCol-1, nRow, nTab,
428*b1cdbd2cSJim Jagielski 			DIR_LEFT, nExtend /*out*/ )) == ScAutoSumData )
429*b1cdbd2cSJim Jagielski 	{
430*b1cdbd2cSJim Jagielski 		bCol = sal_True;
431*b1cdbd2cSJim Jagielski 		nSeekCol = nCol - 1;
432*b1cdbd2cSJim Jagielski 	}
433*b1cdbd2cSJim Jagielski     else if ( (eSum = lcl_SeekAutoSumData( pDoc, nCol, nSeekRow, nTab, DIR_TOP, nExtend /*out*/ )) != ScAutoSumNone )
434*b1cdbd2cSJim Jagielski 		bRow = sal_True;
435*b1cdbd2cSJim Jagielski     else if (( eSum = lcl_SeekAutoSumData( pDoc, nSeekCol, nRow, nTab, DIR_LEFT, nExtend /*out*/ )) != ScAutoSumNone )
436*b1cdbd2cSJim Jagielski 		bCol = sal_True;
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski 	if ( bCol || bRow )
439*b1cdbd2cSJim Jagielski 	{
440*b1cdbd2cSJim Jagielski 		if ( bRow )
441*b1cdbd2cSJim Jagielski 		{
442*b1cdbd2cSJim Jagielski 			nStartRow = nSeekRow;		// nSeekRow evtl. per Reference angepasst
443*b1cdbd2cSJim Jagielski 			if ( eSum == ScAutoSumSum )
444*b1cdbd2cSJim Jagielski 				nEndRow = nStartRow;		// nur Summen summieren
445*b1cdbd2cSJim Jagielski 			else
446*b1cdbd2cSJim Jagielski 				nEndRow = nRow - 1;		// Datenbereich evtl. nach unten erweitern
447*b1cdbd2cSJim Jagielski 		}
448*b1cdbd2cSJim Jagielski 		else
449*b1cdbd2cSJim Jagielski 		{
450*b1cdbd2cSJim Jagielski 			nStartCol = nSeekCol;		// nSeekCol evtl. per Reference angepasst
451*b1cdbd2cSJim Jagielski 			if ( eSum == ScAutoSumSum )
452*b1cdbd2cSJim Jagielski 				nEndCol = nStartCol;		// nur Summen summieren
453*b1cdbd2cSJim Jagielski 			else
454*b1cdbd2cSJim Jagielski 				nEndCol = nCol - 1;		// Datenbereich evtl. nach rechts erweitern
455*b1cdbd2cSJim Jagielski 		}
456*b1cdbd2cSJim Jagielski 		sal_Bool bContinue = sal_False;
457*b1cdbd2cSJim Jagielski 		do
458*b1cdbd2cSJim Jagielski 		{
459*b1cdbd2cSJim Jagielski 			if ( eSum == ScAutoSumData )
460*b1cdbd2cSJim Jagielski 			{
461*b1cdbd2cSJim Jagielski 				if ( bRow )
462*b1cdbd2cSJim Jagielski 				{
463*b1cdbd2cSJim Jagielski 					while ( nStartRow != 0 && lcl_IsAutoSumData(	pDoc, nCol,
464*b1cdbd2cSJim Jagielski 							nStartRow-1, nTab, DIR_TOP, nExtend /*out*/ ) == eSum )
465*b1cdbd2cSJim Jagielski 						--nStartRow;
466*b1cdbd2cSJim Jagielski 				}
467*b1cdbd2cSJim Jagielski 				else
468*b1cdbd2cSJim Jagielski 				{
469*b1cdbd2cSJim Jagielski 					while ( nStartCol != 0 && lcl_IsAutoSumData( pDoc, nStartCol-1,
470*b1cdbd2cSJim Jagielski 							nRow, nTab, DIR_LEFT, nExtend /*out*/ ) == eSum )
471*b1cdbd2cSJim Jagielski 						--nStartCol;
472*b1cdbd2cSJim Jagielski 				}
473*b1cdbd2cSJim Jagielski 			}
474*b1cdbd2cSJim Jagielski 			rRangeList.Append(
475*b1cdbd2cSJim Jagielski 				ScRange( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab ) );
476*b1cdbd2cSJim Jagielski 			if ( eSum == ScAutoSumSum )
477*b1cdbd2cSJim Jagielski 			{
478*b1cdbd2cSJim Jagielski 				if ( bRow )
479*b1cdbd2cSJim Jagielski 				{
480*b1cdbd2cSJim Jagielski                     nEndRow = static_cast< SCROW >( nExtend );
481*b1cdbd2cSJim Jagielski                     if ( ( bContinue = lcl_FindNextSumEntryInColumn( pDoc, nCol, nEndRow /*inout*/, nTab, nExtend /*out*/, 0 ) ) == true )
482*b1cdbd2cSJim Jagielski                     {
483*b1cdbd2cSJim Jagielski                         nStartRow = nEndRow;
484*b1cdbd2cSJim Jagielski                     }
485*b1cdbd2cSJim Jagielski 				}
486*b1cdbd2cSJim Jagielski 				else
487*b1cdbd2cSJim Jagielski 				{
488*b1cdbd2cSJim Jagielski                     nEndCol = static_cast< SCCOL >( nExtend );
489*b1cdbd2cSJim Jagielski                     if ( ( bContinue = lcl_FindNextSumEntryInRow( pDoc, nEndCol /*inout*/, nRow, nTab, nExtend /*out*/, 0 ) ) == true )
490*b1cdbd2cSJim Jagielski                     {
491*b1cdbd2cSJim Jagielski                         nStartCol = nEndCol;
492*b1cdbd2cSJim Jagielski                     }
493*b1cdbd2cSJim Jagielski 				}
494*b1cdbd2cSJim Jagielski 			}
495*b1cdbd2cSJim Jagielski 		} while ( bContinue );
496*b1cdbd2cSJim Jagielski 		return sal_True;
497*b1cdbd2cSJim Jagielski 	}
498*b1cdbd2cSJim Jagielski 	return sal_False;
499*b1cdbd2cSJim Jagielski }
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
502*b1cdbd2cSJim Jagielski 
EnterAutoSum(const ScRangeList & rRangeList,sal_Bool bSubTotal)503*b1cdbd2cSJim Jagielski void ScViewFunc::EnterAutoSum(const ScRangeList& rRangeList, sal_Bool bSubTotal)		// Block mit Summen fuellen
504*b1cdbd2cSJim Jagielski {
505*b1cdbd2cSJim Jagielski     String aFormula = GetAutoSumFormula( rRangeList, bSubTotal );
506*b1cdbd2cSJim Jagielski 	EnterBlock( aFormula, NULL );
507*b1cdbd2cSJim Jagielski }
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
510*b1cdbd2cSJim Jagielski 
AutoSum(const ScRange & rRange,bool bSubTotal,bool bSetCursor,bool bContinue)511*b1cdbd2cSJim Jagielski bool ScViewFunc::AutoSum( const ScRange& rRange, bool bSubTotal, bool bSetCursor, bool bContinue )
512*b1cdbd2cSJim Jagielski {
513*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = GetViewData()->GetDocument();
514*b1cdbd2cSJim Jagielski     const SCTAB nTab = rRange.aStart.Tab();
515*b1cdbd2cSJim Jagielski     SCCOL nStartCol = rRange.aStart.Col();
516*b1cdbd2cSJim Jagielski     SCROW nStartRow = rRange.aStart.Row();
517*b1cdbd2cSJim Jagielski     const SCCOL nEndCol = rRange.aEnd.Col();
518*b1cdbd2cSJim Jagielski     const SCROW nEndRow = rRange.aEnd.Row();
519*b1cdbd2cSJim Jagielski     SCCOLROW nExtend = 0; // out parameter for lcl_IsAutoSumData
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski     // ignore rows at the top of the given range which don't contain autosum data
522*b1cdbd2cSJim Jagielski     bool bRowData = false;
523*b1cdbd2cSJim Jagielski     for ( SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow )
524*b1cdbd2cSJim Jagielski     {
525*b1cdbd2cSJim Jagielski         for ( SCCOL nCol = nStartCol; nCol <= nEndCol; ++nCol )
526*b1cdbd2cSJim Jagielski         {
527*b1cdbd2cSJim Jagielski             if ( lcl_IsAutoSumData( pDoc, nCol, nRow, nTab, DIR_TOP, nExtend ) != ScAutoSumNone )
528*b1cdbd2cSJim Jagielski             {
529*b1cdbd2cSJim Jagielski                 bRowData = true;
530*b1cdbd2cSJim Jagielski                 break;
531*b1cdbd2cSJim Jagielski             }
532*b1cdbd2cSJim Jagielski         }
533*b1cdbd2cSJim Jagielski         if ( bRowData )
534*b1cdbd2cSJim Jagielski         {
535*b1cdbd2cSJim Jagielski             nStartRow = nRow;
536*b1cdbd2cSJim Jagielski             break;
537*b1cdbd2cSJim Jagielski         }
538*b1cdbd2cSJim Jagielski     }
539*b1cdbd2cSJim Jagielski     if ( !bRowData )
540*b1cdbd2cSJim Jagielski     {
541*b1cdbd2cSJim Jagielski         return false;
542*b1cdbd2cSJim Jagielski     }
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski     // ignore columns at the left of the given range which don't contain autosum data
545*b1cdbd2cSJim Jagielski     bool bColData = false;
546*b1cdbd2cSJim Jagielski     for ( SCCOL nCol = nStartCol; nCol <= nEndCol; ++nCol )
547*b1cdbd2cSJim Jagielski     {
548*b1cdbd2cSJim Jagielski         for ( SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow )
549*b1cdbd2cSJim Jagielski         {
550*b1cdbd2cSJim Jagielski             if ( lcl_IsAutoSumData( pDoc, nCol, nRow, nTab, DIR_LEFT, nExtend ) != ScAutoSumNone )
551*b1cdbd2cSJim Jagielski             {
552*b1cdbd2cSJim Jagielski                 bColData = true;
553*b1cdbd2cSJim Jagielski                 break;
554*b1cdbd2cSJim Jagielski             }
555*b1cdbd2cSJim Jagielski         }
556*b1cdbd2cSJim Jagielski         if ( bColData )
557*b1cdbd2cSJim Jagielski         {
558*b1cdbd2cSJim Jagielski             nStartCol = nCol;
559*b1cdbd2cSJim Jagielski             break;
560*b1cdbd2cSJim Jagielski         }
561*b1cdbd2cSJim Jagielski     }
562*b1cdbd2cSJim Jagielski     if ( !bColData )
563*b1cdbd2cSJim Jagielski     {
564*b1cdbd2cSJim Jagielski         return false;
565*b1cdbd2cSJim Jagielski     }
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski     const bool bEndRowEmpty = pDoc->IsBlockEmpty( nTab, nStartCol, nEndRow, nEndCol, nEndRow );
568*b1cdbd2cSJim Jagielski     const bool bEndColEmpty = pDoc->IsBlockEmpty( nTab, nEndCol, nStartRow, nEndCol, nEndRow );
569*b1cdbd2cSJim Jagielski     bool bRow = ( ( nStartRow != nEndRow ) && ( bEndRowEmpty || ( !bEndRowEmpty && !bEndColEmpty ) ) );
570*b1cdbd2cSJim Jagielski     bool bCol = ( ( nStartCol != nEndCol ) && ( bEndColEmpty || nStartRow == nEndRow ) );
571*b1cdbd2cSJim Jagielski 
572*b1cdbd2cSJim Jagielski     // find an empty row for entering the result
573*b1cdbd2cSJim Jagielski     SCROW nInsRow = nEndRow;
574*b1cdbd2cSJim Jagielski     if ( bRow && !bEndRowEmpty )
575*b1cdbd2cSJim Jagielski     {
576*b1cdbd2cSJim Jagielski         if ( nInsRow < MAXROW )
577*b1cdbd2cSJim Jagielski         {
578*b1cdbd2cSJim Jagielski             ++nInsRow;
579*b1cdbd2cSJim Jagielski             while ( !pDoc->IsBlockEmpty( nTab, nStartCol, nInsRow, nEndCol, nInsRow ) )
580*b1cdbd2cSJim Jagielski             {
581*b1cdbd2cSJim Jagielski                 if ( nInsRow < MAXROW )
582*b1cdbd2cSJim Jagielski                 {
583*b1cdbd2cSJim Jagielski                     ++nInsRow;
584*b1cdbd2cSJim Jagielski                 }
585*b1cdbd2cSJim Jagielski                 else
586*b1cdbd2cSJim Jagielski                 {
587*b1cdbd2cSJim Jagielski                     bRow = false;
588*b1cdbd2cSJim Jagielski                     break;
589*b1cdbd2cSJim Jagielski                 }
590*b1cdbd2cSJim Jagielski             }
591*b1cdbd2cSJim Jagielski         }
592*b1cdbd2cSJim Jagielski         else
593*b1cdbd2cSJim Jagielski         {
594*b1cdbd2cSJim Jagielski             bRow = false;
595*b1cdbd2cSJim Jagielski         }
596*b1cdbd2cSJim Jagielski     }
597*b1cdbd2cSJim Jagielski 
598*b1cdbd2cSJim Jagielski     // find an empty column for entering the result
599*b1cdbd2cSJim Jagielski     SCCOL nInsCol = nEndCol;
600*b1cdbd2cSJim Jagielski     if ( bCol && !bEndColEmpty )
601*b1cdbd2cSJim Jagielski     {
602*b1cdbd2cSJim Jagielski         if ( nInsCol < MAXCOL )
603*b1cdbd2cSJim Jagielski         {
604*b1cdbd2cSJim Jagielski             ++nInsCol;
605*b1cdbd2cSJim Jagielski             while ( !pDoc->IsBlockEmpty( nTab, nInsCol, nStartRow, nInsCol, nEndRow ) )
606*b1cdbd2cSJim Jagielski             {
607*b1cdbd2cSJim Jagielski                 if ( nInsCol < MAXCOL )
608*b1cdbd2cSJim Jagielski                 {
609*b1cdbd2cSJim Jagielski                     ++nInsCol;
610*b1cdbd2cSJim Jagielski                 }
611*b1cdbd2cSJim Jagielski                 else
612*b1cdbd2cSJim Jagielski                 {
613*b1cdbd2cSJim Jagielski                     bCol = false;
614*b1cdbd2cSJim Jagielski                     break;
615*b1cdbd2cSJim Jagielski                 }
616*b1cdbd2cSJim Jagielski             }
617*b1cdbd2cSJim Jagielski         }
618*b1cdbd2cSJim Jagielski         else
619*b1cdbd2cSJim Jagielski         {
620*b1cdbd2cSJim Jagielski             bCol = false;
621*b1cdbd2cSJim Jagielski         }
622*b1cdbd2cSJim Jagielski     }
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski     if ( !bRow && !bCol )
625*b1cdbd2cSJim Jagielski     {
626*b1cdbd2cSJim Jagielski         return false;
627*b1cdbd2cSJim Jagielski     }
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski     SCCOL nMarkEndCol = nEndCol;
630*b1cdbd2cSJim Jagielski     SCROW nMarkEndRow = nEndRow;
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski     if ( bRow )
633*b1cdbd2cSJim Jagielski     {
634*b1cdbd2cSJim Jagielski         // calculate the row sums for all columns of the given range
635*b1cdbd2cSJim Jagielski 
636*b1cdbd2cSJim Jagielski         SCROW nSumEndRow = nEndRow;
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski         if ( bEndRowEmpty )
639*b1cdbd2cSJim Jagielski         {
640*b1cdbd2cSJim Jagielski             // the last row of the given range is empty;
641*b1cdbd2cSJim Jagielski             // don't take into account for calculating the autosum
642*b1cdbd2cSJim Jagielski             --nSumEndRow;
643*b1cdbd2cSJim Jagielski         }
644*b1cdbd2cSJim Jagielski         else
645*b1cdbd2cSJim Jagielski         {
646*b1cdbd2cSJim Jagielski             // increase mark range
647*b1cdbd2cSJim Jagielski             ++nMarkEndRow;
648*b1cdbd2cSJim Jagielski         }
649*b1cdbd2cSJim Jagielski 
650*b1cdbd2cSJim Jagielski         for ( SCCOL nCol = nStartCol; nCol <= nEndCol; ++nCol )
651*b1cdbd2cSJim Jagielski         {
652*b1cdbd2cSJim Jagielski             if ( !pDoc->IsBlockEmpty( nTab, nCol, nStartRow, nCol, nSumEndRow ) )
653*b1cdbd2cSJim Jagielski             {
654*b1cdbd2cSJim Jagielski                 ScRangeList aRangeList;
655*b1cdbd2cSJim Jagielski                 const ScRange aRange( nCol, nStartRow, nTab, nCol, nSumEndRow, nTab );
656*b1cdbd2cSJim Jagielski                 if ( lcl_GetAutoSumForColumnRange( pDoc, aRangeList, aRange ) )
657*b1cdbd2cSJim Jagielski                 {
658*b1cdbd2cSJim Jagielski                     const String aFormula = GetAutoSumFormula( aRangeList, bSubTotal );
659*b1cdbd2cSJim Jagielski                     EnterData( nCol, nInsRow, nTab, aFormula );
660*b1cdbd2cSJim Jagielski                 }
661*b1cdbd2cSJim Jagielski             }
662*b1cdbd2cSJim Jagielski         }
663*b1cdbd2cSJim Jagielski     }
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski     if ( bCol )
666*b1cdbd2cSJim Jagielski     {
667*b1cdbd2cSJim Jagielski         // calculate the column sums for all rows of the given range
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski         SCCOL nSumEndCol = nEndCol;
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski         if ( bEndColEmpty )
672*b1cdbd2cSJim Jagielski         {
673*b1cdbd2cSJim Jagielski             // the last column of the given range is empty;
674*b1cdbd2cSJim Jagielski             // don't take into account for calculating the autosum
675*b1cdbd2cSJim Jagielski             --nSumEndCol;
676*b1cdbd2cSJim Jagielski         }
677*b1cdbd2cSJim Jagielski         else
678*b1cdbd2cSJim Jagielski         {
679*b1cdbd2cSJim Jagielski             // increase mark range
680*b1cdbd2cSJim Jagielski             ++nMarkEndCol;
681*b1cdbd2cSJim Jagielski         }
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski         for ( SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow )
684*b1cdbd2cSJim Jagielski         {
685*b1cdbd2cSJim Jagielski             if ( !pDoc->IsBlockEmpty( nTab, nStartCol, nRow, nSumEndCol, nRow ) )
686*b1cdbd2cSJim Jagielski             {
687*b1cdbd2cSJim Jagielski                 ScRangeList aRangeList;
688*b1cdbd2cSJim Jagielski                 const ScRange aRange( nStartCol, nRow, nTab, nSumEndCol, nRow, nTab );
689*b1cdbd2cSJim Jagielski                 if ( lcl_GetAutoSumForRowRange( pDoc, aRangeList, aRange ) )
690*b1cdbd2cSJim Jagielski                 {
691*b1cdbd2cSJim Jagielski                     const String aFormula = GetAutoSumFormula( aRangeList, bSubTotal );
692*b1cdbd2cSJim Jagielski                     EnterData( nInsCol, nRow, nTab, aFormula );
693*b1cdbd2cSJim Jagielski                 }
694*b1cdbd2cSJim Jagielski             }
695*b1cdbd2cSJim Jagielski         }
696*b1cdbd2cSJim Jagielski     }
697*b1cdbd2cSJim Jagielski 
698*b1cdbd2cSJim Jagielski     // set new mark range and cursor position
699*b1cdbd2cSJim Jagielski     const ScRange aMarkRange( nStartCol, nStartRow, nTab, nMarkEndCol, nMarkEndRow, nTab );
700*b1cdbd2cSJim Jagielski     MarkRange( aMarkRange, sal_False, bContinue );
701*b1cdbd2cSJim Jagielski     if ( bSetCursor )
702*b1cdbd2cSJim Jagielski     {
703*b1cdbd2cSJim Jagielski         SetCursor( nMarkEndCol, nMarkEndRow );
704*b1cdbd2cSJim Jagielski     }
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski     return true;
707*b1cdbd2cSJim Jagielski }
708*b1cdbd2cSJim Jagielski 
709*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
710*b1cdbd2cSJim Jagielski 
GetAutoSumFormula(const ScRangeList & rRangeList,bool bSubTotal)711*b1cdbd2cSJim Jagielski String ScViewFunc::GetAutoSumFormula( const ScRangeList& rRangeList, bool bSubTotal )
712*b1cdbd2cSJim Jagielski {
713*b1cdbd2cSJim Jagielski     String aFormula = '=';
714*b1cdbd2cSJim Jagielski     ScFunctionMgr* pFuncMgr = ScGlobal::GetStarCalcFunctionMgr();
715*b1cdbd2cSJim Jagielski     const ScFuncDesc* pDesc = NULL;
716*b1cdbd2cSJim Jagielski     if ( bSubTotal )
717*b1cdbd2cSJim Jagielski     {
718*b1cdbd2cSJim Jagielski         pDesc = pFuncMgr->Get( SC_OPCODE_SUB_TOTAL );
719*b1cdbd2cSJim Jagielski     }
720*b1cdbd2cSJim Jagielski     else
721*b1cdbd2cSJim Jagielski     {
722*b1cdbd2cSJim Jagielski         pDesc = pFuncMgr->Get( SC_OPCODE_SUM );
723*b1cdbd2cSJim Jagielski     }
724*b1cdbd2cSJim Jagielski     if ( pDesc && pDesc->pFuncName )
725*b1cdbd2cSJim Jagielski     {
726*b1cdbd2cSJim Jagielski         aFormula += *pDesc->pFuncName;
727*b1cdbd2cSJim Jagielski         if ( bSubTotal )
728*b1cdbd2cSJim Jagielski         {
729*b1cdbd2cSJim Jagielski             aFormula.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "(9;" ) );
730*b1cdbd2cSJim Jagielski         }
731*b1cdbd2cSJim Jagielski         else
732*b1cdbd2cSJim Jagielski         {
733*b1cdbd2cSJim Jagielski             aFormula += '(';
734*b1cdbd2cSJim Jagielski         }
735*b1cdbd2cSJim Jagielski         ScDocument* pDoc = GetViewData()->GetDocument();
736*b1cdbd2cSJim Jagielski         String aRef;
737*b1cdbd2cSJim Jagielski         rRangeList.Format( aRef, SCA_VALID, pDoc );
738*b1cdbd2cSJim Jagielski         aFormula += aRef;
739*b1cdbd2cSJim Jagielski         aFormula += ')';
740*b1cdbd2cSJim Jagielski     }
741*b1cdbd2cSJim Jagielski     return aFormula;
742*b1cdbd2cSJim Jagielski }
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
745*b1cdbd2cSJim Jagielski 
EnterBlock(const String & rString,const EditTextObject * pData)746*b1cdbd2cSJim Jagielski void ScViewFunc::EnterBlock( const String& rString, const EditTextObject* pData )
747*b1cdbd2cSJim Jagielski {
748*b1cdbd2cSJim Jagielski 	//	Mehrfachselektion vorher abfragen...
749*b1cdbd2cSJim Jagielski 
750*b1cdbd2cSJim Jagielski 	SCCOL nCol = GetViewData()->GetCurX();
751*b1cdbd2cSJim Jagielski 	SCROW nRow = GetViewData()->GetCurY();
752*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
753*b1cdbd2cSJim Jagielski 	ScMarkData& rMark = GetViewData()->GetMarkData();
754*b1cdbd2cSJim Jagielski 	if ( rMark.IsMultiMarked() )
755*b1cdbd2cSJim Jagielski 	{
756*b1cdbd2cSJim Jagielski 		rMark.MarkToSimple();
757*b1cdbd2cSJim Jagielski 		if ( rMark.IsMultiMarked() )
758*b1cdbd2cSJim Jagielski 		{		// "Einfuegen auf Mehrfachselektion nicht moeglich"
759*b1cdbd2cSJim Jagielski 			ErrorMessage(STR_MSSG_PASTEFROMCLIP_0);
760*b1cdbd2cSJim Jagielski 
761*b1cdbd2cSJim Jagielski 			//	insert into single cell
762*b1cdbd2cSJim Jagielski 			if ( pData )
763*b1cdbd2cSJim Jagielski 				EnterData( nCol, nRow, nTab, pData );
764*b1cdbd2cSJim Jagielski 			else
765*b1cdbd2cSJim Jagielski 				EnterData( nCol, nRow, nTab, rString );
766*b1cdbd2cSJim Jagielski 			return;
767*b1cdbd2cSJim Jagielski 		}
768*b1cdbd2cSJim Jagielski 	}
769*b1cdbd2cSJim Jagielski 
770*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = GetViewData()->GetDocument();
771*b1cdbd2cSJim Jagielski 	String aNewStr = rString;
772*b1cdbd2cSJim Jagielski 	if ( pData )
773*b1cdbd2cSJim Jagielski 	{
774*b1cdbd2cSJim Jagielski 		const ScPatternAttr* pOldPattern = pDoc->GetPattern( nCol, nRow, nTab );
775*b1cdbd2cSJim Jagielski 		ScTabEditEngine aEngine( *pOldPattern, pDoc->GetEnginePool() );
776*b1cdbd2cSJim Jagielski 		aEngine.SetText(*pData);
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski 		ScEditAttrTester aTester( &aEngine );
779*b1cdbd2cSJim Jagielski 		if (!aTester.NeedsObject())
780*b1cdbd2cSJim Jagielski 		{
781*b1cdbd2cSJim Jagielski 			aNewStr = aEngine.GetText();
782*b1cdbd2cSJim Jagielski 			pData = NULL;
783*b1cdbd2cSJim Jagielski 		}
784*b1cdbd2cSJim Jagielski 	}
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 	//	Einfuegen per PasteFromClip
787*b1cdbd2cSJim Jagielski 
788*b1cdbd2cSJim Jagielski 	WaitObject aWait( GetFrameWin() );
789*b1cdbd2cSJim Jagielski 
790*b1cdbd2cSJim Jagielski 	ScAddress aPos( nCol, nRow, nTab );
791*b1cdbd2cSJim Jagielski 
792*b1cdbd2cSJim Jagielski 	ScDocument* pInsDoc = new ScDocument( SCDOCMODE_CLIP );
793*b1cdbd2cSJim Jagielski 	pInsDoc->ResetClip( pDoc, nTab );
794*b1cdbd2cSJim Jagielski 
795*b1cdbd2cSJim Jagielski 	if (aNewStr.GetChar(0) == '=')						// Formel ?
796*b1cdbd2cSJim Jagielski 	{
797*b1cdbd2cSJim Jagielski 		//	SetString geht nicht, weil in Clipboard-Dokumenten nicht kompiliert wird!
798*b1cdbd2cSJim Jagielski 		ScFormulaCell* pFCell = new ScFormulaCell( pDoc, aPos, aNewStr );
799*b1cdbd2cSJim Jagielski 		pInsDoc->PutCell( nCol, nRow, nTab, pFCell );
800*b1cdbd2cSJim Jagielski 	}
801*b1cdbd2cSJim Jagielski 	else if ( pData )
802*b1cdbd2cSJim Jagielski 		pInsDoc->PutCell( nCol, nRow, nTab, new ScEditCell( pData, pDoc, NULL ) );
803*b1cdbd2cSJim Jagielski 	else
804*b1cdbd2cSJim Jagielski 		pInsDoc->SetString( nCol, nRow, nTab, aNewStr );
805*b1cdbd2cSJim Jagielski 
806*b1cdbd2cSJim Jagielski 	pInsDoc->SetClipArea( ScRange(aPos) );
807*b1cdbd2cSJim Jagielski 	// auf Block einfuegen, mit Undo etc.
808*b1cdbd2cSJim Jagielski 	if ( PasteFromClip( IDF_CONTENTS, pInsDoc, PASTE_NOFUNC, sal_False, sal_False,
809*b1cdbd2cSJim Jagielski 			sal_False, INS_NONE, IDF_ATTRIB ) )
810*b1cdbd2cSJim Jagielski 	{
811*b1cdbd2cSJim Jagielski 		const SfxUInt32Item* pItem = (SfxUInt32Item*) pInsDoc->GetAttr(
812*b1cdbd2cSJim Jagielski 			nCol, nRow, nTab, ATTR_VALUE_FORMAT );
813*b1cdbd2cSJim Jagielski 		if ( pItem )
814*b1cdbd2cSJim Jagielski 		{	// Numberformat setzen wenn inkompatibel
815*b1cdbd2cSJim Jagielski 			// MarkData wurde bereits in PasteFromClip MarkToSimple'ed
816*b1cdbd2cSJim Jagielski 			ScRange aRange;
817*b1cdbd2cSJim Jagielski 			rMark.GetMarkArea( aRange );
818*b1cdbd2cSJim Jagielski 			ScPatternAttr* pPattern = new ScPatternAttr( pDoc->GetPool() );
819*b1cdbd2cSJim Jagielski 			pPattern->GetItemSet().Put( *pItem );
820*b1cdbd2cSJim Jagielski 			short nNewType = pDoc->GetFormatTable()->GetType( pItem->GetValue() );
821*b1cdbd2cSJim Jagielski 			pDoc->ApplyPatternIfNumberformatIncompatible( aRange, rMark,
822*b1cdbd2cSJim Jagielski 				*pPattern, nNewType );
823*b1cdbd2cSJim Jagielski 			delete pPattern;
824*b1cdbd2cSJim Jagielski 		}
825*b1cdbd2cSJim Jagielski 	}
826*b1cdbd2cSJim Jagielski 
827*b1cdbd2cSJim Jagielski 	delete pInsDoc;
828*b1cdbd2cSJim Jagielski }
829*b1cdbd2cSJim Jagielski 
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski //UNUSED2008-05  void ScViewFunc::PaintWidthHeight( sal_Bool bColumns, SCCOLROW nStart, SCCOLROW nEnd )
834*b1cdbd2cSJim Jagielski //UNUSED2008-05  {
835*b1cdbd2cSJim Jagielski //UNUSED2008-05      SCTAB nTab = GetViewData()->GetTabNo();
836*b1cdbd2cSJim Jagielski //UNUSED2008-05      ScDocument* pDoc = GetViewData()->GetDocument();
837*b1cdbd2cSJim Jagielski //UNUSED2008-05
838*b1cdbd2cSJim Jagielski //UNUSED2008-05      sal_uInt16 nParts = PAINT_GRID;
839*b1cdbd2cSJim Jagielski //UNUSED2008-05      SCCOL nStartCol = 0;
840*b1cdbd2cSJim Jagielski //UNUSED2008-05      SCROW nStartRow = 0;
841*b1cdbd2cSJim Jagielski //UNUSED2008-05      SCCOL nEndCol = MAXCOL;         // fuer Test auf Merge
842*b1cdbd2cSJim Jagielski //UNUSED2008-05      SCROW nEndRow = MAXROW;
843*b1cdbd2cSJim Jagielski //UNUSED2008-05      if ( bColumns )
844*b1cdbd2cSJim Jagielski //UNUSED2008-05      {
845*b1cdbd2cSJim Jagielski //UNUSED2008-05          nParts |= PAINT_TOP;
846*b1cdbd2cSJim Jagielski //UNUSED2008-05          nStartCol = static_cast<SCCOL>(nStart);
847*b1cdbd2cSJim Jagielski //UNUSED2008-05          nEndCol = static_cast<SCCOL>(nEnd);
848*b1cdbd2cSJim Jagielski //UNUSED2008-05      }
849*b1cdbd2cSJim Jagielski //UNUSED2008-05      else
850*b1cdbd2cSJim Jagielski //UNUSED2008-05      {
851*b1cdbd2cSJim Jagielski //UNUSED2008-05          nParts |= PAINT_LEFT;
852*b1cdbd2cSJim Jagielski //UNUSED2008-05          nStartRow = nStart;
853*b1cdbd2cSJim Jagielski //UNUSED2008-05          nEndRow = nEnd;
854*b1cdbd2cSJim Jagielski //UNUSED2008-05      }
855*b1cdbd2cSJim Jagielski //UNUSED2008-05      if (pDoc->HasAttrib( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab,
856*b1cdbd2cSJim Jagielski //UNUSED2008-05                           HASATTR_MERGED | HASATTR_OVERLAPPED ))
857*b1cdbd2cSJim Jagielski //UNUSED2008-05      {
858*b1cdbd2cSJim Jagielski //UNUSED2008-05          nStartCol = 0;
859*b1cdbd2cSJim Jagielski //UNUSED2008-05          nStartRow = 0;
860*b1cdbd2cSJim Jagielski //UNUSED2008-05      }
861*b1cdbd2cSJim Jagielski //UNUSED2008-05      GetViewData()->GetDocShell()->PostPaint( nStartCol,nStartRow,nTab, MAXCOL,MAXROW,nTab, nParts );
862*b1cdbd2cSJim Jagielski //UNUSED2008-05  }
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski 
865*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
866*b1cdbd2cSJim Jagielski //	manueller Seitenumbruch
867*b1cdbd2cSJim Jagielski 
InsertPageBreak(sal_Bool bColumn,sal_Bool bRecord,const ScAddress * pPos,sal_Bool bSetModified)868*b1cdbd2cSJim Jagielski void ScViewFunc::InsertPageBreak( sal_Bool bColumn, sal_Bool bRecord, const ScAddress* pPos,
869*b1cdbd2cSJim Jagielski 									sal_Bool bSetModified )
870*b1cdbd2cSJim Jagielski {
871*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
872*b1cdbd2cSJim Jagielski 	ScAddress aCursor;
873*b1cdbd2cSJim Jagielski 	if (pPos)
874*b1cdbd2cSJim Jagielski 		aCursor = *pPos;
875*b1cdbd2cSJim Jagielski 	else
876*b1cdbd2cSJim Jagielski 		aCursor = ScAddress( GetViewData()->GetCurX(), GetViewData()->GetCurY(), nTab );
877*b1cdbd2cSJim Jagielski 
878*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = GetViewData()->GetDocShell()->GetDocFunc().
879*b1cdbd2cSJim Jagielski 						InsertPageBreak( bColumn, aCursor, bRecord, bSetModified, sal_False );
880*b1cdbd2cSJim Jagielski 
881*b1cdbd2cSJim Jagielski 	if ( bSuccess && bSetModified )
882*b1cdbd2cSJim Jagielski 		UpdatePageBreakData( sal_True );	// fuer PageBreak-Modus
883*b1cdbd2cSJim Jagielski }
884*b1cdbd2cSJim Jagielski 
885*b1cdbd2cSJim Jagielski 
886*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
887*b1cdbd2cSJim Jagielski 
DeletePageBreak(sal_Bool bColumn,sal_Bool bRecord,const ScAddress * pPos,sal_Bool bSetModified)888*b1cdbd2cSJim Jagielski void ScViewFunc::DeletePageBreak( sal_Bool bColumn, sal_Bool bRecord, const ScAddress* pPos,
889*b1cdbd2cSJim Jagielski 									sal_Bool bSetModified )
890*b1cdbd2cSJim Jagielski {
891*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
892*b1cdbd2cSJim Jagielski 	ScAddress aCursor;
893*b1cdbd2cSJim Jagielski 	if (pPos)
894*b1cdbd2cSJim Jagielski 		aCursor = *pPos;
895*b1cdbd2cSJim Jagielski 	else
896*b1cdbd2cSJim Jagielski 		aCursor = ScAddress( GetViewData()->GetCurX(), GetViewData()->GetCurY(), nTab );
897*b1cdbd2cSJim Jagielski 
898*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = GetViewData()->GetDocShell()->GetDocFunc().
899*b1cdbd2cSJim Jagielski 						RemovePageBreak( bColumn, aCursor, bRecord, bSetModified, sal_False );
900*b1cdbd2cSJim Jagielski 
901*b1cdbd2cSJim Jagielski 	if ( bSuccess && bSetModified )
902*b1cdbd2cSJim Jagielski 		UpdatePageBreakData( sal_True );	// fuer PageBreak-Modus
903*b1cdbd2cSJim Jagielski }
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
906*b1cdbd2cSJim Jagielski 
RemoveManualBreaks()907*b1cdbd2cSJim Jagielski void ScViewFunc::RemoveManualBreaks()
908*b1cdbd2cSJim Jagielski {
909*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
910*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pDocSh->GetDocument();
911*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
912*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
913*b1cdbd2cSJim Jagielski 
914*b1cdbd2cSJim Jagielski 	if (bUndo)
915*b1cdbd2cSJim Jagielski 	{
916*b1cdbd2cSJim Jagielski 		ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
917*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, nTab, nTab, sal_True, sal_True );
918*b1cdbd2cSJim Jagielski 		pDoc->CopyToDocument( 0,0,nTab, MAXCOL,MAXROW,nTab, IDF_NONE, sal_False, pUndoDoc );
919*b1cdbd2cSJim Jagielski 		pDocSh->GetUndoManager()->AddUndoAction(
920*b1cdbd2cSJim Jagielski 								new ScUndoRemoveBreaks( pDocSh, nTab, pUndoDoc ) );
921*b1cdbd2cSJim Jagielski 	}
922*b1cdbd2cSJim Jagielski 
923*b1cdbd2cSJim Jagielski 	pDoc->RemoveManualBreaks(nTab);
924*b1cdbd2cSJim Jagielski 	pDoc->UpdatePageBreaks(nTab);
925*b1cdbd2cSJim Jagielski 
926*b1cdbd2cSJim Jagielski 	UpdatePageBreakData( sal_True );
927*b1cdbd2cSJim Jagielski 	pDocSh->SetDocumentModified();
928*b1cdbd2cSJim Jagielski 	pDocSh->PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID );
929*b1cdbd2cSJim Jagielski }
930*b1cdbd2cSJim Jagielski 
931*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
932*b1cdbd2cSJim Jagielski 
SetPrintZoom(sal_uInt16 nScale,sal_uInt16 nPages)933*b1cdbd2cSJim Jagielski void ScViewFunc::SetPrintZoom(sal_uInt16 nScale, sal_uInt16 nPages)
934*b1cdbd2cSJim Jagielski {
935*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
936*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
937*b1cdbd2cSJim Jagielski 	pDocSh->SetPrintZoom( nTab, nScale, nPages );
938*b1cdbd2cSJim Jagielski }
939*b1cdbd2cSJim Jagielski 
AdjustPrintZoom()940*b1cdbd2cSJim Jagielski void ScViewFunc::AdjustPrintZoom()
941*b1cdbd2cSJim Jagielski {
942*b1cdbd2cSJim Jagielski 	ScRange aRange;
943*b1cdbd2cSJim Jagielski 	if ( GetViewData()->GetSimpleArea( aRange ) != SC_MARK_SIMPLE )
944*b1cdbd2cSJim Jagielski 		GetViewData()->GetMarkData().GetMultiMarkArea( aRange );
945*b1cdbd2cSJim Jagielski 	GetViewData()->GetDocShell()->AdjustPrintZoom( aRange );
946*b1cdbd2cSJim Jagielski }
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
949*b1cdbd2cSJim Jagielski 
SetPrintRanges(sal_Bool bEntireSheet,const String * pPrint,const String * pRepCol,const String * pRepRow,sal_Bool bAddPrint)950*b1cdbd2cSJim Jagielski void ScViewFunc::SetPrintRanges( sal_Bool bEntireSheet, const String* pPrint,
951*b1cdbd2cSJim Jagielski 								const String* pRepCol, const String* pRepRow,
952*b1cdbd2cSJim Jagielski 								sal_Bool bAddPrint )
953*b1cdbd2cSJim Jagielski {
954*b1cdbd2cSJim Jagielski 	//	on all selected tables
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh	= GetViewData()->GetDocShell();
957*b1cdbd2cSJim Jagielski 	ScDocument* pDoc	= pDocSh->GetDocument();
958*b1cdbd2cSJim Jagielski 	SCTAB nTabCount	= pDoc->GetTableCount();
959*b1cdbd2cSJim Jagielski 	ScMarkData& rMark	= GetViewData()->GetMarkData();
960*b1cdbd2cSJim Jagielski 	SCTAB nTab;
961*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski 	ScPrintRangeSaver* pOldRanges = pDoc->CreatePrintRangeSaver();
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski     ScAddress::Details aDetails(pDoc->GetAddressConvention(), 0, 0);
966*b1cdbd2cSJim Jagielski 
967*b1cdbd2cSJim Jagielski 	for (nTab=0; nTab<nTabCount; nTab++)
968*b1cdbd2cSJim Jagielski 		if (rMark.GetTableSelect(nTab))
969*b1cdbd2cSJim Jagielski 		{
970*b1cdbd2cSJim Jagielski 			ScRange aRange( 0,0,nTab );
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski 			//	print ranges
973*b1cdbd2cSJim Jagielski 
974*b1cdbd2cSJim Jagielski             if( !bAddPrint )
975*b1cdbd2cSJim Jagielski                 pDoc->ClearPrintRanges( nTab );
976*b1cdbd2cSJim Jagielski 
977*b1cdbd2cSJim Jagielski             if( bEntireSheet )
978*b1cdbd2cSJim Jagielski             {
979*b1cdbd2cSJim Jagielski                 pDoc->SetPrintEntireSheet( nTab );
980*b1cdbd2cSJim Jagielski             }
981*b1cdbd2cSJim Jagielski             else if ( pPrint )
982*b1cdbd2cSJim Jagielski 			{
983*b1cdbd2cSJim Jagielski                 if ( pPrint->Len() )
984*b1cdbd2cSJim Jagielski 				{
985*b1cdbd2cSJim Jagielski                     const sal_Unicode sep = ScCompiler::GetNativeSymbol(ocSep).GetChar(0);
986*b1cdbd2cSJim Jagielski                     sal_uInt16 nTCount = pPrint->GetTokenCount(sep);
987*b1cdbd2cSJim Jagielski 					for (sal_uInt16 i=0; i<nTCount; i++)
988*b1cdbd2cSJim Jagielski 					{
989*b1cdbd2cSJim Jagielski 						String aToken = pPrint->GetToken(i, sep);
990*b1cdbd2cSJim Jagielski 						if ( aRange.ParseAny( aToken, pDoc, aDetails ) & SCA_VALID )
991*b1cdbd2cSJim Jagielski                             pDoc->AddPrintRange( nTab, aRange );
992*b1cdbd2cSJim Jagielski 					}
993*b1cdbd2cSJim Jagielski 				}
994*b1cdbd2cSJim Jagielski 			}
995*b1cdbd2cSJim Jagielski             else    // NULL = use selection (print range is always set), use empty string to delete all ranges
996*b1cdbd2cSJim Jagielski 			{
997*b1cdbd2cSJim Jagielski 				if ( GetViewData()->GetSimpleArea( aRange ) == SC_MARK_SIMPLE )
998*b1cdbd2cSJim Jagielski 				{
999*b1cdbd2cSJim Jagielski                     pDoc->AddPrintRange( nTab, aRange );
1000*b1cdbd2cSJim Jagielski 				}
1001*b1cdbd2cSJim Jagielski 				else if ( rMark.IsMultiMarked() )
1002*b1cdbd2cSJim Jagielski 				{
1003*b1cdbd2cSJim Jagielski 					rMark.MarkToMulti();
1004*b1cdbd2cSJim Jagielski 					ScRangeListRef aList( new ScRangeList );
1005*b1cdbd2cSJim Jagielski 					rMark.FillRangeListWithMarks( aList, sal_False );
1006*b1cdbd2cSJim Jagielski 					sal_uInt16 nCnt = (sal_uInt16) aList->Count();
1007*b1cdbd2cSJim Jagielski 					if ( nCnt )
1008*b1cdbd2cSJim Jagielski 					{
1009*b1cdbd2cSJim Jagielski 						ScRangePtr pR;
1010*b1cdbd2cSJim Jagielski 						sal_uInt16 i;
1011*b1cdbd2cSJim Jagielski 						for ( pR = aList->First(), i=0; i < nCnt;
1012*b1cdbd2cSJim Jagielski 							  pR = aList->Next(), i++ )
1013*b1cdbd2cSJim Jagielski 						{
1014*b1cdbd2cSJim Jagielski                             pDoc->AddPrintRange( nTab, *pR );
1015*b1cdbd2cSJim Jagielski 						}
1016*b1cdbd2cSJim Jagielski 					}
1017*b1cdbd2cSJim Jagielski 				}
1018*b1cdbd2cSJim Jagielski 			}
1019*b1cdbd2cSJim Jagielski 
1020*b1cdbd2cSJim Jagielski 			//	repeat columns
1021*b1cdbd2cSJim Jagielski 
1022*b1cdbd2cSJim Jagielski 			if ( pRepCol )
1023*b1cdbd2cSJim Jagielski 			{
1024*b1cdbd2cSJim Jagielski 				if ( !pRepCol->Len() )
1025*b1cdbd2cSJim Jagielski 					pDoc->SetRepeatColRange( nTab, NULL );
1026*b1cdbd2cSJim Jagielski 				else
1027*b1cdbd2cSJim Jagielski 					if ( aRange.ParseAny( *pRepCol, pDoc, aDetails ) & SCA_VALID )
1028*b1cdbd2cSJim Jagielski 						pDoc->SetRepeatColRange( nTab, &aRange );
1029*b1cdbd2cSJim Jagielski 			}
1030*b1cdbd2cSJim Jagielski 
1031*b1cdbd2cSJim Jagielski 			//	repeat rows
1032*b1cdbd2cSJim Jagielski 
1033*b1cdbd2cSJim Jagielski 			if ( pRepRow )
1034*b1cdbd2cSJim Jagielski 			{
1035*b1cdbd2cSJim Jagielski 				if ( !pRepRow->Len() )
1036*b1cdbd2cSJim Jagielski 					pDoc->SetRepeatRowRange( nTab, NULL );
1037*b1cdbd2cSJim Jagielski 				else
1038*b1cdbd2cSJim Jagielski 					if ( aRange.ParseAny( *pRepRow, pDoc, aDetails ) & SCA_VALID )
1039*b1cdbd2cSJim Jagielski 						pDoc->SetRepeatRowRange( nTab, &aRange );
1040*b1cdbd2cSJim Jagielski 			}
1041*b1cdbd2cSJim Jagielski 		}
1042*b1cdbd2cSJim Jagielski 
1043*b1cdbd2cSJim Jagielski 	//	undo (for all tables)
1044*b1cdbd2cSJim Jagielski 	if (bUndo)
1045*b1cdbd2cSJim Jagielski 	{
1046*b1cdbd2cSJim Jagielski 		SCTAB nCurTab = GetViewData()->GetTabNo();
1047*b1cdbd2cSJim Jagielski 		ScPrintRangeSaver* pNewRanges = pDoc->CreatePrintRangeSaver();
1048*b1cdbd2cSJim Jagielski 		pDocSh->GetUndoManager()->AddUndoAction(
1049*b1cdbd2cSJim Jagielski 					new ScUndoPrintRange( pDocSh, nCurTab, pOldRanges, pNewRanges ) );
1050*b1cdbd2cSJim Jagielski 	}
1051*b1cdbd2cSJim Jagielski 
1052*b1cdbd2cSJim Jagielski 	//	update page breaks
1053*b1cdbd2cSJim Jagielski 
1054*b1cdbd2cSJim Jagielski 	for (nTab=0; nTab<nTabCount; nTab++)
1055*b1cdbd2cSJim Jagielski 		if (rMark.GetTableSelect(nTab))
1056*b1cdbd2cSJim Jagielski 			ScPrintFunc( pDocSh, pDocSh->GetPrinter(), nTab ).UpdatePages();
1057*b1cdbd2cSJim Jagielski 
1058*b1cdbd2cSJim Jagielski 	SfxBindings& rBindings = GetViewData()->GetBindings();
1059*b1cdbd2cSJim Jagielski 	rBindings.Invalidate( SID_DELETE_PRINTAREA );
1060*b1cdbd2cSJim Jagielski 
1061*b1cdbd2cSJim Jagielski 	pDocSh->SetDocumentModified();
1062*b1cdbd2cSJim Jagielski }
1063*b1cdbd2cSJim Jagielski 
1064*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1065*b1cdbd2cSJim Jagielski //	Zellen zusammenfassen
1066*b1cdbd2cSJim Jagielski 
TestMergeCells()1067*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::TestMergeCells()			// Vorab-Test (fuer Menue)
1068*b1cdbd2cSJim Jagielski {
1069*b1cdbd2cSJim Jagielski 	//	simple test: sal_True if there's a selection but no multi selection and not filtered
1070*b1cdbd2cSJim Jagielski 
1071*b1cdbd2cSJim Jagielski 	const ScMarkData& rMark = GetViewData()->GetMarkData();
1072*b1cdbd2cSJim Jagielski 	if ( rMark.IsMarked() || rMark.IsMultiMarked() )
1073*b1cdbd2cSJim Jagielski 	{
1074*b1cdbd2cSJim Jagielski         ScRange aDummy;
1075*b1cdbd2cSJim Jagielski         return GetViewData()->GetSimpleArea( aDummy) == SC_MARK_SIMPLE;
1076*b1cdbd2cSJim Jagielski 	}
1077*b1cdbd2cSJim Jagielski 	else
1078*b1cdbd2cSJim Jagielski 		return sal_False;
1079*b1cdbd2cSJim Jagielski }
1080*b1cdbd2cSJim Jagielski 
1081*b1cdbd2cSJim Jagielski 
1082*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1083*b1cdbd2cSJim Jagielski 
MergeCells(sal_Bool bApi,sal_Bool & rDoContents,sal_Bool bRecord)1084*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::MergeCells( sal_Bool bApi, sal_Bool& rDoContents, sal_Bool bRecord )
1085*b1cdbd2cSJim Jagielski {
1086*b1cdbd2cSJim Jagielski 	//	Editable- und Verschachtelungs-Abfrage muss vorneweg sein (auch in DocFunc),
1087*b1cdbd2cSJim Jagielski 	//	damit dann nicht die Inhalte-QueryBox kommt
1088*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( this );
1089*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
1090*b1cdbd2cSJim Jagielski 	{
1091*b1cdbd2cSJim Jagielski 		ErrorMessage(aTester.GetMessageId());
1092*b1cdbd2cSJim Jagielski 		return sal_False;
1093*b1cdbd2cSJim Jagielski 	}
1094*b1cdbd2cSJim Jagielski 
1095*b1cdbd2cSJim Jagielski 	ScMarkData& rMark = GetViewData()->GetMarkData();
1096*b1cdbd2cSJim Jagielski 	rMark.MarkToSimple();
1097*b1cdbd2cSJim Jagielski 	if (!rMark.IsMarked())
1098*b1cdbd2cSJim Jagielski 	{
1099*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_NOMULTISELECT);
1100*b1cdbd2cSJim Jagielski 		return sal_False;
1101*b1cdbd2cSJim Jagielski 	}
1102*b1cdbd2cSJim Jagielski 
1103*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
1104*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pDocSh->GetDocument();
1105*b1cdbd2cSJim Jagielski 
1106*b1cdbd2cSJim Jagielski 	ScRange aMarkRange;
1107*b1cdbd2cSJim Jagielski 	rMark.GetMarkArea( aMarkRange );
1108*b1cdbd2cSJim Jagielski 	SCCOL nStartCol = aMarkRange.aStart.Col();
1109*b1cdbd2cSJim Jagielski 	SCROW nStartRow = aMarkRange.aStart.Row();
1110*b1cdbd2cSJim Jagielski 	SCTAB nStartTab = aMarkRange.aStart.Tab();
1111*b1cdbd2cSJim Jagielski 	SCCOL nEndCol = aMarkRange.aEnd.Col();
1112*b1cdbd2cSJim Jagielski 	SCROW nEndRow = aMarkRange.aEnd.Row();
1113*b1cdbd2cSJim Jagielski 	SCTAB nEndTab = aMarkRange.aEnd.Tab();
1114*b1cdbd2cSJim Jagielski 	if ( nStartCol == nEndCol && nStartRow == nEndRow )
1115*b1cdbd2cSJim Jagielski 	{
1116*b1cdbd2cSJim Jagielski 		// nichts zu tun
1117*b1cdbd2cSJim Jagielski 		return sal_True;
1118*b1cdbd2cSJim Jagielski 	}
1119*b1cdbd2cSJim Jagielski 
1120*b1cdbd2cSJim Jagielski 	if ( pDoc->HasAttrib( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab,
1121*b1cdbd2cSJim Jagielski 							HASATTR_MERGED | HASATTR_OVERLAPPED ) )
1122*b1cdbd2cSJim Jagielski 	{		// "Zusammenfassen nicht verschachteln !"
1123*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_MSSG_MERGECELLS_0);
1124*b1cdbd2cSJim Jagielski 		return sal_False;
1125*b1cdbd2cSJim Jagielski 	}
1126*b1cdbd2cSJim Jagielski 
1127*b1cdbd2cSJim Jagielski 	sal_Bool bOk = sal_True;
1128*b1cdbd2cSJim Jagielski 
1129*b1cdbd2cSJim Jagielski 	if ( !pDoc->IsBlockEmpty( nStartTab, nStartCol,nStartRow+1, nStartCol,nEndRow, true ) ||
1130*b1cdbd2cSJim Jagielski 		 !pDoc->IsBlockEmpty( nStartTab, nStartCol+1,nStartRow, nEndCol,nEndRow, true ) )
1131*b1cdbd2cSJim Jagielski 	{
1132*b1cdbd2cSJim Jagielski 		if (!bApi)
1133*b1cdbd2cSJim Jagielski 		{
1134*b1cdbd2cSJim Jagielski 			MessBox aBox( GetViewData()->GetDialogParent(),
1135*b1cdbd2cSJim Jagielski 							WinBits(WB_YES_NO_CANCEL | WB_DEF_NO),
1136*b1cdbd2cSJim Jagielski 							ScGlobal::GetRscString( STR_MSSG_DOSUBTOTALS_0 ),
1137*b1cdbd2cSJim Jagielski 							ScGlobal::GetRscString( STR_MERGE_NOTEMPTY ) );
1138*b1cdbd2cSJim Jagielski 			sal_uInt16 nRetVal = aBox.Execute();
1139*b1cdbd2cSJim Jagielski 
1140*b1cdbd2cSJim Jagielski 			if ( nRetVal == RET_YES )
1141*b1cdbd2cSJim Jagielski 				rDoContents = sal_True;
1142*b1cdbd2cSJim Jagielski 			else if ( nRetVal == RET_CANCEL )
1143*b1cdbd2cSJim Jagielski 				bOk = sal_False;
1144*b1cdbd2cSJim Jagielski 		}
1145*b1cdbd2cSJim Jagielski 	}
1146*b1cdbd2cSJim Jagielski 
1147*b1cdbd2cSJim Jagielski 	if (bOk)
1148*b1cdbd2cSJim Jagielski 	{
1149*b1cdbd2cSJim Jagielski 		HideCursor();
1150*b1cdbd2cSJim Jagielski 		bOk = pDocSh->GetDocFunc().MergeCells( aMarkRange, rDoContents, bRecord, bApi );
1151*b1cdbd2cSJim Jagielski 		ShowCursor();
1152*b1cdbd2cSJim Jagielski 
1153*b1cdbd2cSJim Jagielski 		if (bOk)
1154*b1cdbd2cSJim Jagielski 		{
1155*b1cdbd2cSJim Jagielski 			SetCursor( nStartCol, nStartRow );
1156*b1cdbd2cSJim Jagielski 			//DoneBlockMode( sal_False);
1157*b1cdbd2cSJim Jagielski 			Unmark();
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski 			pDocSh->UpdateOle(GetViewData());
1160*b1cdbd2cSJim Jagielski 			UpdateInputLine();
1161*b1cdbd2cSJim Jagielski 		}
1162*b1cdbd2cSJim Jagielski 	}
1163*b1cdbd2cSJim Jagielski 
1164*b1cdbd2cSJim Jagielski 	return bOk;
1165*b1cdbd2cSJim Jagielski }
1166*b1cdbd2cSJim Jagielski 
1167*b1cdbd2cSJim Jagielski 
1168*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1169*b1cdbd2cSJim Jagielski 
TestRemoveMerge()1170*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::TestRemoveMerge()
1171*b1cdbd2cSJim Jagielski {
1172*b1cdbd2cSJim Jagielski 	sal_Bool bMerged = sal_False;
1173*b1cdbd2cSJim Jagielski 	ScRange aRange;
1174*b1cdbd2cSJim Jagielski 	if (GetViewData()->GetSimpleArea( aRange ) == SC_MARK_SIMPLE)
1175*b1cdbd2cSJim Jagielski 	{
1176*b1cdbd2cSJim Jagielski 		ScDocument* pDoc = GetViewData()->GetDocument();
1177*b1cdbd2cSJim Jagielski 		if ( pDoc->HasAttrib( aRange, HASATTR_MERGED ) )
1178*b1cdbd2cSJim Jagielski 			bMerged = sal_True;
1179*b1cdbd2cSJim Jagielski 	}
1180*b1cdbd2cSJim Jagielski 	return bMerged;
1181*b1cdbd2cSJim Jagielski }
1182*b1cdbd2cSJim Jagielski 
1183*b1cdbd2cSJim Jagielski 
1184*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1185*b1cdbd2cSJim Jagielski 
RemoveMerge(sal_Bool bRecord)1186*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::RemoveMerge( sal_Bool bRecord )
1187*b1cdbd2cSJim Jagielski {
1188*b1cdbd2cSJim Jagielski 	ScRange aRange;
1189*b1cdbd2cSJim Jagielski     ScEditableTester aTester( this );
1190*b1cdbd2cSJim Jagielski     if (!aTester.IsEditable())
1191*b1cdbd2cSJim Jagielski     {
1192*b1cdbd2cSJim Jagielski         ErrorMessage(aTester.GetMessageId());
1193*b1cdbd2cSJim Jagielski         return sal_False;
1194*b1cdbd2cSJim Jagielski     }
1195*b1cdbd2cSJim Jagielski 	else if (GetViewData()->GetSimpleArea( aRange ) == SC_MARK_SIMPLE)
1196*b1cdbd2cSJim Jagielski 	{
1197*b1cdbd2cSJim Jagielski         ScRange aExtended( aRange );
1198*b1cdbd2cSJim Jagielski         GetViewData()->GetDocument()->ExtendMerge( aExtended );
1199*b1cdbd2cSJim Jagielski 		ScDocShell* pDocSh = GetViewData()->GetDocShell();
1200*b1cdbd2cSJim Jagielski 
1201*b1cdbd2cSJim Jagielski 		HideCursor();
1202*b1cdbd2cSJim Jagielski 		sal_Bool bOk = pDocSh->GetDocFunc().UnmergeCells( aRange, bRecord, sal_False );
1203*b1cdbd2cSJim Jagielski         MarkRange( aExtended );
1204*b1cdbd2cSJim Jagielski 		ShowCursor();
1205*b1cdbd2cSJim Jagielski 
1206*b1cdbd2cSJim Jagielski 		if (bOk)
1207*b1cdbd2cSJim Jagielski 			pDocSh->UpdateOle(GetViewData());
1208*b1cdbd2cSJim Jagielski 	}
1209*b1cdbd2cSJim Jagielski 	return sal_True;		//! bOk ??
1210*b1cdbd2cSJim Jagielski }
1211*b1cdbd2cSJim Jagielski 
1212*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1213*b1cdbd2cSJim Jagielski 
FillSimple(FillDir eDir,sal_Bool bRecord)1214*b1cdbd2cSJim Jagielski void ScViewFunc::FillSimple( FillDir eDir, sal_Bool bRecord )
1215*b1cdbd2cSJim Jagielski {
1216*b1cdbd2cSJim Jagielski 	ScRange aRange;
1217*b1cdbd2cSJim Jagielski 	if (GetViewData()->GetSimpleArea(aRange) == SC_MARK_SIMPLE)
1218*b1cdbd2cSJim Jagielski 	{
1219*b1cdbd2cSJim Jagielski 		ScDocShell* pDocSh = GetViewData()->GetDocShell();
1220*b1cdbd2cSJim Jagielski 		const ScMarkData& rMark = GetViewData()->GetMarkData();
1221*b1cdbd2cSJim Jagielski 		sal_Bool bSuccess = pDocSh->GetDocFunc().FillSimple( aRange, &rMark, eDir, bRecord, sal_False );
1222*b1cdbd2cSJim Jagielski 		if (bSuccess)
1223*b1cdbd2cSJim Jagielski 		{
1224*b1cdbd2cSJim Jagielski 			pDocSh->UpdateOle(GetViewData());
1225*b1cdbd2cSJim Jagielski 			UpdateScrollBars();
1226*b1cdbd2cSJim Jagielski 		}
1227*b1cdbd2cSJim Jagielski 	}
1228*b1cdbd2cSJim Jagielski 	else
1229*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_NOMULTISELECT);
1230*b1cdbd2cSJim Jagielski }
1231*b1cdbd2cSJim Jagielski 
1232*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1233*b1cdbd2cSJim Jagielski 
FillSeries(FillDir eDir,FillCmd eCmd,FillDateCmd eDateCmd,double fStart,double fStep,double fMax,sal_Bool bRecord)1234*b1cdbd2cSJim Jagielski void ScViewFunc::FillSeries( FillDir eDir, FillCmd eCmd, FillDateCmd eDateCmd,
1235*b1cdbd2cSJim Jagielski 							 double fStart, double fStep, double fMax, sal_Bool bRecord )
1236*b1cdbd2cSJim Jagielski {
1237*b1cdbd2cSJim Jagielski 	ScRange aRange;
1238*b1cdbd2cSJim Jagielski 	if (GetViewData()->GetSimpleArea(aRange) == SC_MARK_SIMPLE)
1239*b1cdbd2cSJim Jagielski 	{
1240*b1cdbd2cSJim Jagielski 		ScDocShell* pDocSh = GetViewData()->GetDocShell();
1241*b1cdbd2cSJim Jagielski 		const ScMarkData& rMark = GetViewData()->GetMarkData();
1242*b1cdbd2cSJim Jagielski 		sal_Bool bSuccess = pDocSh->GetDocFunc().
1243*b1cdbd2cSJim Jagielski 						FillSeries( aRange, &rMark, eDir, eCmd, eDateCmd,
1244*b1cdbd2cSJim Jagielski 									fStart, fStep, fMax, bRecord, sal_False );
1245*b1cdbd2cSJim Jagielski 		if (bSuccess)
1246*b1cdbd2cSJim Jagielski 		{
1247*b1cdbd2cSJim Jagielski 			pDocSh->UpdateOle(GetViewData());
1248*b1cdbd2cSJim Jagielski 			UpdateScrollBars();
1249*b1cdbd2cSJim Jagielski 
1250*b1cdbd2cSJim Jagielski             // #i97876# Spreadsheet data changes are not notified
1251*b1cdbd2cSJim Jagielski             ScModelObj* pModelObj = ScModelObj::getImplementation( pDocSh->GetModel() );
1252*b1cdbd2cSJim Jagielski             if ( pModelObj && pModelObj->HasChangesListeners() )
1253*b1cdbd2cSJim Jagielski             {
1254*b1cdbd2cSJim Jagielski                 ScRangeList aChangeRanges;
1255*b1cdbd2cSJim Jagielski                 aChangeRanges.Append( aRange );
1256*b1cdbd2cSJim Jagielski                 pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
1257*b1cdbd2cSJim Jagielski             }
1258*b1cdbd2cSJim Jagielski 		}
1259*b1cdbd2cSJim Jagielski 	}
1260*b1cdbd2cSJim Jagielski 	else
1261*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_NOMULTISELECT);
1262*b1cdbd2cSJim Jagielski }
1263*b1cdbd2cSJim Jagielski 
1264*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1265*b1cdbd2cSJim Jagielski 
FillAuto(FillDir eDir,SCCOL nStartCol,SCROW nStartRow,SCCOL nEndCol,SCROW nEndRow,sal_uLong nCount,sal_Bool bRecord)1266*b1cdbd2cSJim Jagielski void ScViewFunc::FillAuto( FillDir eDir, SCCOL nStartCol, SCROW nStartRow,
1267*b1cdbd2cSJim Jagielski 							SCCOL nEndCol, SCROW nEndRow, sal_uLong nCount, sal_Bool bRecord )
1268*b1cdbd2cSJim Jagielski {
1269*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
1270*b1cdbd2cSJim Jagielski 	ScRange aRange( nStartCol,nStartRow,nTab, nEndCol,nEndRow,nTab );
1271*b1cdbd2cSJim Jagielski     ScRange aSourceRange( aRange );
1272*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
1273*b1cdbd2cSJim Jagielski 	const ScMarkData& rMark = GetViewData()->GetMarkData();
1274*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = pDocSh->GetDocFunc().
1275*b1cdbd2cSJim Jagielski 					FillAuto( aRange, &rMark, eDir, nCount, bRecord, sal_False );
1276*b1cdbd2cSJim Jagielski 	if (bSuccess)
1277*b1cdbd2cSJim Jagielski 	{
1278*b1cdbd2cSJim Jagielski 		MarkRange( aRange, sal_False );			// aRange ist in FillAuto veraendert worden
1279*b1cdbd2cSJim Jagielski 		pDocSh->UpdateOle(GetViewData());
1280*b1cdbd2cSJim Jagielski 		UpdateScrollBars();
1281*b1cdbd2cSJim Jagielski 
1282*b1cdbd2cSJim Jagielski         // #i97876# Spreadsheet data changes are not notified
1283*b1cdbd2cSJim Jagielski         ScModelObj* pModelObj = ScModelObj::getImplementation( pDocSh->GetModel() );
1284*b1cdbd2cSJim Jagielski         if ( pModelObj && pModelObj->HasChangesListeners() )
1285*b1cdbd2cSJim Jagielski         {
1286*b1cdbd2cSJim Jagielski             ScRangeList aChangeRanges;
1287*b1cdbd2cSJim Jagielski             ScRange aChangeRange( aRange );
1288*b1cdbd2cSJim Jagielski             switch ( eDir )
1289*b1cdbd2cSJim Jagielski             {
1290*b1cdbd2cSJim Jagielski                 case FILL_TO_BOTTOM:
1291*b1cdbd2cSJim Jagielski                     {
1292*b1cdbd2cSJim Jagielski                         aChangeRange.aStart.SetRow( aSourceRange.aEnd.Row() + 1 );
1293*b1cdbd2cSJim Jagielski                     }
1294*b1cdbd2cSJim Jagielski                     break;
1295*b1cdbd2cSJim Jagielski                 case FILL_TO_TOP:
1296*b1cdbd2cSJim Jagielski                     {
1297*b1cdbd2cSJim Jagielski                         aChangeRange.aEnd.SetRow( aSourceRange.aStart.Row() - 1 );
1298*b1cdbd2cSJim Jagielski                     }
1299*b1cdbd2cSJim Jagielski                     break;
1300*b1cdbd2cSJim Jagielski                 case FILL_TO_RIGHT:
1301*b1cdbd2cSJim Jagielski                     {
1302*b1cdbd2cSJim Jagielski                         aChangeRange.aStart.SetCol( aSourceRange.aEnd.Col() + 1 );
1303*b1cdbd2cSJim Jagielski                     }
1304*b1cdbd2cSJim Jagielski                     break;
1305*b1cdbd2cSJim Jagielski                 case FILL_TO_LEFT:
1306*b1cdbd2cSJim Jagielski                     {
1307*b1cdbd2cSJim Jagielski                         aChangeRange.aEnd.SetCol( aSourceRange.aStart.Col() - 1 );
1308*b1cdbd2cSJim Jagielski                     }
1309*b1cdbd2cSJim Jagielski                     break;
1310*b1cdbd2cSJim Jagielski                 default:
1311*b1cdbd2cSJim Jagielski                     {
1312*b1cdbd2cSJim Jagielski 
1313*b1cdbd2cSJim Jagielski                     }
1314*b1cdbd2cSJim Jagielski                     break;
1315*b1cdbd2cSJim Jagielski             }
1316*b1cdbd2cSJim Jagielski             aChangeRanges.Append( aChangeRange );
1317*b1cdbd2cSJim Jagielski             pModelObj->NotifyChanges( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "cell-change" ) ), aChangeRanges );
1318*b1cdbd2cSJim Jagielski         }
1319*b1cdbd2cSJim Jagielski 	}
1320*b1cdbd2cSJim Jagielski }
1321*b1cdbd2cSJim Jagielski 
1322*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1323*b1cdbd2cSJim Jagielski 
FillTab(sal_uInt16 nFlags,sal_uInt16 nFunction,sal_Bool bSkipEmpty,sal_Bool bAsLink)1324*b1cdbd2cSJim Jagielski void ScViewFunc::FillTab( sal_uInt16 nFlags, sal_uInt16 nFunction, sal_Bool bSkipEmpty, sal_Bool bAsLink )
1325*b1cdbd2cSJim Jagielski {
1326*b1cdbd2cSJim Jagielski 	//! allow source sheet to be protected
1327*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( this );
1328*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
1329*b1cdbd2cSJim Jagielski 	{
1330*b1cdbd2cSJim Jagielski 		ErrorMessage(aTester.GetMessageId());
1331*b1cdbd2cSJim Jagielski 		return;
1332*b1cdbd2cSJim Jagielski 	}
1333*b1cdbd2cSJim Jagielski 
1334*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
1335*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pDocSh->GetDocument();
1336*b1cdbd2cSJim Jagielski 	ScMarkData& rMark = GetViewData()->GetMarkData();
1337*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
1338*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
1339*b1cdbd2cSJim Jagielski 
1340*b1cdbd2cSJim Jagielski 	ScRange aMarkRange;
1341*b1cdbd2cSJim Jagielski 	rMark.MarkToSimple();
1342*b1cdbd2cSJim Jagielski 	sal_Bool bMulti = rMark.IsMultiMarked();
1343*b1cdbd2cSJim Jagielski 	if (bMulti)
1344*b1cdbd2cSJim Jagielski 		rMark.GetMultiMarkArea( aMarkRange );
1345*b1cdbd2cSJim Jagielski 	else if (rMark.IsMarked())
1346*b1cdbd2cSJim Jagielski 		rMark.GetMarkArea( aMarkRange );
1347*b1cdbd2cSJim Jagielski 	else
1348*b1cdbd2cSJim Jagielski 		aMarkRange = ScRange( GetViewData()->GetCurX(), GetViewData()->GetCurY(), nTab );
1349*b1cdbd2cSJim Jagielski 
1350*b1cdbd2cSJim Jagielski 	ScDocument* pUndoDoc = NULL;
1351*b1cdbd2cSJim Jagielski //	if ( bRecord )
1352*b1cdbd2cSJim Jagielski 	if (bUndo)
1353*b1cdbd2cSJim Jagielski 	{
1354*b1cdbd2cSJim Jagielski 		pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1355*b1cdbd2cSJim Jagielski 		pUndoDoc->InitUndo( pDoc, nTab, nTab );
1356*b1cdbd2cSJim Jagielski //		pUndoDoc->SelectTable( nTab, sal_True );		// nur fuer Markierung
1357*b1cdbd2cSJim Jagielski 
1358*b1cdbd2cSJim Jagielski 		SCTAB nTabCount = pDoc->GetTableCount();
1359*b1cdbd2cSJim Jagielski 		for (SCTAB i=0; i<nTabCount; i++)
1360*b1cdbd2cSJim Jagielski 			if (i != nTab && rMark.GetTableSelect(i))
1361*b1cdbd2cSJim Jagielski 			{
1362*b1cdbd2cSJim Jagielski 				pUndoDoc->AddUndoTab( i, i );
1363*b1cdbd2cSJim Jagielski 				aMarkRange.aStart.SetTab( i );
1364*b1cdbd2cSJim Jagielski 				aMarkRange.aEnd.SetTab( i );
1365*b1cdbd2cSJim Jagielski 				pDoc->CopyToDocument( aMarkRange, IDF_ALL, bMulti, pUndoDoc );
1366*b1cdbd2cSJim Jagielski //				pUndoDoc->SelectTable( i, sal_True );
1367*b1cdbd2cSJim Jagielski 			}
1368*b1cdbd2cSJim Jagielski 	}
1369*b1cdbd2cSJim Jagielski 
1370*b1cdbd2cSJim Jagielski 	if (bMulti)
1371*b1cdbd2cSJim Jagielski 		pDoc->FillTabMarked( nTab, rMark, nFlags, nFunction, bSkipEmpty, bAsLink );
1372*b1cdbd2cSJim Jagielski 	else
1373*b1cdbd2cSJim Jagielski 	{
1374*b1cdbd2cSJim Jagielski 		aMarkRange.aStart.SetTab( nTab );
1375*b1cdbd2cSJim Jagielski 		aMarkRange.aEnd.SetTab( nTab );
1376*b1cdbd2cSJim Jagielski 		pDoc->FillTab( aMarkRange, rMark, nFlags, nFunction, bSkipEmpty, bAsLink );
1377*b1cdbd2cSJim Jagielski 	}
1378*b1cdbd2cSJim Jagielski 
1379*b1cdbd2cSJim Jagielski //	if ( bRecord )
1380*b1cdbd2cSJim Jagielski 	if (bUndo)
1381*b1cdbd2cSJim Jagielski 	{	//! fuer ChangeTrack erst zum Schluss
1382*b1cdbd2cSJim Jagielski 		pDocSh->GetUndoManager()->AddUndoAction(
1383*b1cdbd2cSJim Jagielski 			new ScUndoFillTable( pDocSh, rMark,
1384*b1cdbd2cSJim Jagielski 								aMarkRange.aStart.Col(), aMarkRange.aStart.Row(), nTab,
1385*b1cdbd2cSJim Jagielski 								aMarkRange.aEnd.Col(), aMarkRange.aEnd.Row(), nTab,
1386*b1cdbd2cSJim Jagielski 								pUndoDoc, bMulti, nTab, nFlags, nFunction, bSkipEmpty, bAsLink ) );
1387*b1cdbd2cSJim Jagielski 	}
1388*b1cdbd2cSJim Jagielski 
1389*b1cdbd2cSJim Jagielski 	pDocSh->PostPaintGridAll();
1390*b1cdbd2cSJim Jagielski 	pDocSh->PostDataChanged();
1391*b1cdbd2cSJim Jagielski }
1392*b1cdbd2cSJim Jagielski 
1393*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1394*b1cdbd2cSJim Jagielski 
1395*b1cdbd2cSJim Jagielski /** Downward fill of selected cell(s) by double-clicking cross-hair cursor
1396*b1cdbd2cSJim Jagielski 
1397*b1cdbd2cSJim Jagielski 	Extends a current selection down to the last non-empty cell of an adjacent
1398*b1cdbd2cSJim Jagielski 	column when the lower-right corner of the selection is double-clicked.  It
1399*b1cdbd2cSJim Jagielski 	uses a left-adjoining non-empty column as a guide if such is available,
1400*b1cdbd2cSJim Jagielski 	otherwise a right-adjoining non-empty column is used.
1401*b1cdbd2cSJim Jagielski 
1402*b1cdbd2cSJim Jagielski 	@author Kohei Yoshida (kohei@openoffice.org)
1403*b1cdbd2cSJim Jagielski 
1404*b1cdbd2cSJim Jagielski 	@return No return value
1405*b1cdbd2cSJim Jagielski 
1406*b1cdbd2cSJim Jagielski 	@see #i12313#
1407*b1cdbd2cSJim Jagielski */
FillCrossDblClick()1408*b1cdbd2cSJim Jagielski void ScViewFunc::FillCrossDblClick()
1409*b1cdbd2cSJim Jagielski {
1410*b1cdbd2cSJim Jagielski 	ScRange aRange;
1411*b1cdbd2cSJim Jagielski 	GetViewData()->GetSimpleArea( aRange );
1412*b1cdbd2cSJim Jagielski 	aRange.Justify();
1413*b1cdbd2cSJim Jagielski 
1414*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetCurPos().Tab();
1415*b1cdbd2cSJim Jagielski 	SCCOL nStartX = aRange.aStart.Col();
1416*b1cdbd2cSJim Jagielski 	SCROW nStartY = aRange.aStart.Row();
1417*b1cdbd2cSJim Jagielski 	SCCOL nEndX   = aRange.aEnd.Col();
1418*b1cdbd2cSJim Jagielski 	SCROW nEndY   = aRange.aEnd.Row();
1419*b1cdbd2cSJim Jagielski 
1420*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = GetViewData()->GetDocument();
1421*b1cdbd2cSJim Jagielski 
1422*b1cdbd2cSJim Jagielski 	// Make sure the selection is not empty
1423*b1cdbd2cSJim Jagielski 	if ( pDoc->IsBlockEmpty( nTab, nStartX, nStartY, nEndX, nEndY ) )
1424*b1cdbd2cSJim Jagielski 		return;
1425*b1cdbd2cSJim Jagielski 
1426*b1cdbd2cSJim Jagielski 	if ( nEndY < MAXROW )
1427*b1cdbd2cSJim Jagielski 	{
1428*b1cdbd2cSJim Jagielski 		if ( nStartX > 0 )
1429*b1cdbd2cSJim Jagielski 		{
1430*b1cdbd2cSJim Jagielski 			SCCOL nMovX = nStartX - 1;
1431*b1cdbd2cSJim Jagielski 			SCROW nMovY = nStartY;
1432*b1cdbd2cSJim Jagielski 
1433*b1cdbd2cSJim Jagielski 			if ( pDoc->HasData( nMovX, nStartY, nTab ) &&
1434*b1cdbd2cSJim Jagielski 				 pDoc->HasData( nMovX, nStartY + 1, nTab ) )
1435*b1cdbd2cSJim Jagielski 			{
1436*b1cdbd2cSJim Jagielski 				pDoc->FindAreaPos( nMovX, nMovY, nTab, 0, 1 );
1437*b1cdbd2cSJim Jagielski 
1438*b1cdbd2cSJim Jagielski 				if ( nMovY > nEndY )
1439*b1cdbd2cSJim Jagielski 				{
1440*b1cdbd2cSJim Jagielski 					FillAuto( FILL_TO_BOTTOM, nStartX, nStartY, nEndX, nEndY,
1441*b1cdbd2cSJim Jagielski 							  nMovY - nEndY );
1442*b1cdbd2cSJim Jagielski 					return;
1443*b1cdbd2cSJim Jagielski 				}
1444*b1cdbd2cSJim Jagielski 			}
1445*b1cdbd2cSJim Jagielski 		}
1446*b1cdbd2cSJim Jagielski 
1447*b1cdbd2cSJim Jagielski 		if ( nEndX < MAXCOL )
1448*b1cdbd2cSJim Jagielski 		{
1449*b1cdbd2cSJim Jagielski 			SCCOL nMovX = nEndX + 1;
1450*b1cdbd2cSJim Jagielski 			SCROW nMovY = nStartY;
1451*b1cdbd2cSJim Jagielski 
1452*b1cdbd2cSJim Jagielski 			if ( pDoc->HasData( nMovX, nStartY, nTab ) &&
1453*b1cdbd2cSJim Jagielski 				 pDoc->HasData( nMovX, nStartY + 1, nTab ) )
1454*b1cdbd2cSJim Jagielski 			{
1455*b1cdbd2cSJim Jagielski 				pDoc->FindAreaPos( nMovX, nMovY, nTab, 0, 1 );
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski 				if ( nMovY > nEndY )
1458*b1cdbd2cSJim Jagielski 				{
1459*b1cdbd2cSJim Jagielski 					FillAuto( FILL_TO_BOTTOM, nStartX, nStartY, nEndX, nEndY,
1460*b1cdbd2cSJim Jagielski 							  nMovY - nEndY );
1461*b1cdbd2cSJim Jagielski 					return;
1462*b1cdbd2cSJim Jagielski 				}
1463*b1cdbd2cSJim Jagielski 			}
1464*b1cdbd2cSJim Jagielski 		}
1465*b1cdbd2cSJim Jagielski 	}
1466*b1cdbd2cSJim Jagielski }
1467*b1cdbd2cSJim Jagielski 
1468*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1469*b1cdbd2cSJim Jagielski 
TransliterateText(sal_Int32 nType)1470*b1cdbd2cSJim Jagielski void ScViewFunc::TransliterateText( sal_Int32 nType )
1471*b1cdbd2cSJim Jagielski {
1472*b1cdbd2cSJim Jagielski 	ScMarkData aFuncMark = GetViewData()->GetMarkData();
1473*b1cdbd2cSJim Jagielski 	if ( !aFuncMark.IsMarked() && !aFuncMark.IsMultiMarked() )
1474*b1cdbd2cSJim Jagielski 	{
1475*b1cdbd2cSJim Jagielski 		//	no selection -> use cursor position
1476*b1cdbd2cSJim Jagielski 
1477*b1cdbd2cSJim Jagielski 		ScAddress aCursor( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
1478*b1cdbd2cSJim Jagielski 		aFuncMark.SetMarkArea( ScRange( aCursor ) );
1479*b1cdbd2cSJim Jagielski 	}
1480*b1cdbd2cSJim Jagielski 
1481*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = GetViewData()->GetDocShell()->GetDocFunc().
1482*b1cdbd2cSJim Jagielski 						TransliterateText( aFuncMark, nType, sal_True, sal_False );
1483*b1cdbd2cSJim Jagielski 	if (bSuccess)
1484*b1cdbd2cSJim Jagielski 	{
1485*b1cdbd2cSJim Jagielski 		GetViewData()->GetViewShell()->UpdateInputHandler();
1486*b1cdbd2cSJim Jagielski 	}
1487*b1cdbd2cSJim Jagielski }
1488*b1cdbd2cSJim Jagielski 
1489*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1490*b1cdbd2cSJim Jagielski //	AutoFormat
1491*b1cdbd2cSJim Jagielski 
CreateAutoFormatData()1492*b1cdbd2cSJim Jagielski ScAutoFormatData* ScViewFunc::CreateAutoFormatData()
1493*b1cdbd2cSJim Jagielski {
1494*b1cdbd2cSJim Jagielski 	ScAutoFormatData* pData = NULL;
1495*b1cdbd2cSJim Jagielski 	SCCOL nStartCol;
1496*b1cdbd2cSJim Jagielski 	SCROW nStartRow;
1497*b1cdbd2cSJim Jagielski 	SCTAB nStartTab;
1498*b1cdbd2cSJim Jagielski 	SCCOL nEndCol;
1499*b1cdbd2cSJim Jagielski 	SCROW nEndRow;
1500*b1cdbd2cSJim Jagielski 	SCTAB nEndTab;
1501*b1cdbd2cSJim Jagielski 	if (GetViewData()->GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) == SC_MARK_SIMPLE)
1502*b1cdbd2cSJim Jagielski 	{
1503*b1cdbd2cSJim Jagielski 		if ( nEndCol-nStartCol >= 3 && nEndRow-nStartRow >= 3 )
1504*b1cdbd2cSJim Jagielski 		{
1505*b1cdbd2cSJim Jagielski 			ScDocument* pDoc = GetViewData()->GetDocument();
1506*b1cdbd2cSJim Jagielski 			pData = new ScAutoFormatData;
1507*b1cdbd2cSJim Jagielski 			pDoc->GetAutoFormatData( nStartTab, nStartCol,nStartRow,nEndCol,nEndRow, *pData );
1508*b1cdbd2cSJim Jagielski 		}
1509*b1cdbd2cSJim Jagielski 	}
1510*b1cdbd2cSJim Jagielski 	return pData;
1511*b1cdbd2cSJim Jagielski }
1512*b1cdbd2cSJim Jagielski 
1513*b1cdbd2cSJim Jagielski 
1514*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1515*b1cdbd2cSJim Jagielski 
AutoFormat(sal_uInt16 nFormatNo,sal_Bool bRecord)1516*b1cdbd2cSJim Jagielski void ScViewFunc::AutoFormat( sal_uInt16 nFormatNo, sal_Bool bRecord )
1517*b1cdbd2cSJim Jagielski {
1518*b1cdbd2cSJim Jagielski #if 1
1519*b1cdbd2cSJim Jagielski 
1520*b1cdbd2cSJim Jagielski 	ScRange aRange;
1521*b1cdbd2cSJim Jagielski 	if (GetViewData()->GetSimpleArea(aRange) == SC_MARK_SIMPLE)
1522*b1cdbd2cSJim Jagielski 	{
1523*b1cdbd2cSJim Jagielski 		ScDocShell* pDocSh = GetViewData()->GetDocShell();
1524*b1cdbd2cSJim Jagielski 		ScMarkData& rMark = GetViewData()->GetMarkData();
1525*b1cdbd2cSJim Jagielski 
1526*b1cdbd2cSJim Jagielski 		sal_Bool bSuccess = pDocSh->GetDocFunc().AutoFormat( aRange, &rMark, nFormatNo, bRecord, sal_False );
1527*b1cdbd2cSJim Jagielski 		if (bSuccess)
1528*b1cdbd2cSJim Jagielski 			pDocSh->UpdateOle(GetViewData());
1529*b1cdbd2cSJim Jagielski 	}
1530*b1cdbd2cSJim Jagielski 	else
1531*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_NOMULTISELECT);
1532*b1cdbd2cSJim Jagielski 
1533*b1cdbd2cSJim Jagielski #else
1534*b1cdbd2cSJim Jagielski 
1535*b1cdbd2cSJim Jagielski 	// nur wegen Matrix nicht editierbar? Attribute trotzdem ok
1536*b1cdbd2cSJim Jagielski 	sal_Bool bOnlyNotBecauseOfMatrix;
1537*b1cdbd2cSJim Jagielski 	if ( !SelectionEditable( &bOnlyNotBecauseOfMatrix ) && !bOnlyNotBecauseOfMatrix )
1538*b1cdbd2cSJim Jagielski 	{
1539*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_PROTECTIONERR);
1540*b1cdbd2cSJim Jagielski 		return;
1541*b1cdbd2cSJim Jagielski 	}
1542*b1cdbd2cSJim Jagielski 
1543*b1cdbd2cSJim Jagielski 	SCCOL nStartCol;
1544*b1cdbd2cSJim Jagielski 	SCROW nStartRow;
1545*b1cdbd2cSJim Jagielski 	SCTAB nStartTab;
1546*b1cdbd2cSJim Jagielski 	SCCOL nEndCol;
1547*b1cdbd2cSJim Jagielski 	SCROW nEndRow;
1548*b1cdbd2cSJim Jagielski 	SCTAB nEndTab;
1549*b1cdbd2cSJim Jagielski 
1550*b1cdbd2cSJim Jagielski 	if (GetViewData()->GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) == SC_MARK_SIMPLE)
1551*b1cdbd2cSJim Jagielski 	{
1552*b1cdbd2cSJim Jagielski 		ScDocShell* pDocSh = GetViewData()->GetDocShell();
1553*b1cdbd2cSJim Jagielski 		ScDocument* pDoc = pDocSh->GetDocument();
1554*b1cdbd2cSJim Jagielski 		ScMarkData& rMark = GetViewData()->GetMarkData();
1555*b1cdbd2cSJim Jagielski 		sal_Bool bSize = (*ScGlobal::GetAutoFormat())[nFormatNo]->GetIncludeWidthHeight();
1556*b1cdbd2cSJim Jagielski 		if (bRecord && !pDoc->IsUndoEnabled())
1557*b1cdbd2cSJim Jagielski 			bRecord = sal_False;
1558*b1cdbd2cSJim Jagielski 
1559*b1cdbd2cSJim Jagielski 		ScDocument* pUndoDoc = NULL;
1560*b1cdbd2cSJim Jagielski 		if ( bRecord )
1561*b1cdbd2cSJim Jagielski 		{
1562*b1cdbd2cSJim Jagielski 			pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1563*b1cdbd2cSJim Jagielski 			pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab, bSize, bSize );
1564*b1cdbd2cSJim Jagielski 			pDoc->CopyToDocument( nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab,
1565*b1cdbd2cSJim Jagielski 									IDF_ATTRIB, sal_False, pUndoDoc );
1566*b1cdbd2cSJim Jagielski 			if (bSize)
1567*b1cdbd2cSJim Jagielski 			{
1568*b1cdbd2cSJim Jagielski 				pDoc->CopyToDocument( nStartCol,0,nStartTab, nEndCol,MAXROW,nEndTab,
1569*b1cdbd2cSJim Jagielski 															IDF_NONE, sal_False, pUndoDoc );
1570*b1cdbd2cSJim Jagielski 				pDoc->CopyToDocument( 0,nStartRow,nStartTab, MAXCOL,nEndRow,nEndTab,
1571*b1cdbd2cSJim Jagielski 															IDF_NONE, sal_False, pUndoDoc );
1572*b1cdbd2cSJim Jagielski 			}
1573*b1cdbd2cSJim Jagielski 			pDoc->BeginDrawUndo();
1574*b1cdbd2cSJim Jagielski 		}
1575*b1cdbd2cSJim Jagielski 
1576*b1cdbd2cSJim Jagielski 		GetFrameWin()->EnterWait();
1577*b1cdbd2cSJim Jagielski 		pDoc->AutoFormat( nStartCol, nStartRow, nEndCol, nEndRow, nFormatNo, rMark );
1578*b1cdbd2cSJim Jagielski 		GetFrameWin()->LeaveWait();
1579*b1cdbd2cSJim Jagielski 
1580*b1cdbd2cSJim Jagielski 		if (bSize)
1581*b1cdbd2cSJim Jagielski 		{
1582*b1cdbd2cSJim Jagielski 			SetMarkedWidthOrHeight( sal_True, SC_SIZE_VISOPT, STD_EXTRA_WIDTH, sal_False, sal_False );
1583*b1cdbd2cSJim Jagielski 			SetMarkedWidthOrHeight( sal_False, SC_SIZE_VISOPT, 0, sal_False, sal_False );
1584*b1cdbd2cSJim Jagielski 			pDocSh->PostPaint( 0,0,nStartTab, MAXCOL,MAXROW,nStartTab,
1585*b1cdbd2cSJim Jagielski 									PAINT_GRID | PAINT_LEFT | PAINT_TOP );
1586*b1cdbd2cSJim Jagielski 		}
1587*b1cdbd2cSJim Jagielski 		else
1588*b1cdbd2cSJim Jagielski 		{
1589*b1cdbd2cSJim Jagielski 			sal_Bool bAdj = AdjustBlockHeight( sal_False );
1590*b1cdbd2cSJim Jagielski 			if (bAdj)
1591*b1cdbd2cSJim Jagielski 				pDocSh->PostPaint( 0,nStartRow,nStartTab, MAXCOL,MAXROW,nStartTab,
1592*b1cdbd2cSJim Jagielski 									PAINT_GRID | PAINT_LEFT );
1593*b1cdbd2cSJim Jagielski 			else
1594*b1cdbd2cSJim Jagielski 				pDocSh->PostPaint( nStartCol, nStartRow, nStartTab,
1595*b1cdbd2cSJim Jagielski 									nEndCol, nEndRow, nEndTab, PAINT_GRID );
1596*b1cdbd2cSJim Jagielski 		}
1597*b1cdbd2cSJim Jagielski 
1598*b1cdbd2cSJim Jagielski 		if ( bRecord )		// Draw-Undo erst jetzt verfuegbar
1599*b1cdbd2cSJim Jagielski 		{
1600*b1cdbd2cSJim Jagielski 			pDocSh->GetUndoManager()->AddUndoAction(
1601*b1cdbd2cSJim Jagielski 				new ScUndoAutoFormat( pDocSh,
1602*b1cdbd2cSJim Jagielski 						ScRange(nStartCol,nStartRow,nStartTab, nEndCol,nEndRow,nEndTab),
1603*b1cdbd2cSJim Jagielski 						pUndoDoc, rMark, bSize, nFormatNo ) );
1604*b1cdbd2cSJim Jagielski 		}
1605*b1cdbd2cSJim Jagielski 
1606*b1cdbd2cSJim Jagielski 		pDocSh->UpdateOle(GetViewData());
1607*b1cdbd2cSJim Jagielski 		pDocSh->SetDocumentModified();
1608*b1cdbd2cSJim Jagielski 	}
1609*b1cdbd2cSJim Jagielski 	else
1610*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_NOMULTISELECT);
1611*b1cdbd2cSJim Jagielski 
1612*b1cdbd2cSJim Jagielski #endif
1613*b1cdbd2cSJim Jagielski }
1614*b1cdbd2cSJim Jagielski 
1615*b1cdbd2cSJim Jagielski 
1616*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1617*b1cdbd2cSJim Jagielski //	Suchen & Ersetzen
1618*b1cdbd2cSJim Jagielski 
SearchAndReplace(const SvxSearchItem * pSearchItem,sal_Bool bAddUndo,sal_Bool bIsApi)1619*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::SearchAndReplace( const SvxSearchItem* pSearchItem,
1620*b1cdbd2cSJim Jagielski 										sal_Bool bAddUndo, sal_Bool bIsApi )
1621*b1cdbd2cSJim Jagielski {
1622*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
1623*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pDocSh->GetDocument();
1624*b1cdbd2cSJim Jagielski 	ScMarkData& rMark = GetViewData()->GetMarkData();
1625*b1cdbd2cSJim Jagielski 	if (bAddUndo && !pDoc->IsUndoEnabled())
1626*b1cdbd2cSJim Jagielski 		bAddUndo = sal_False;
1627*b1cdbd2cSJim Jagielski 
1628*b1cdbd2cSJim Jagielski 	SCCOL nCol = GetViewData()->GetCurX();
1629*b1cdbd2cSJim Jagielski 	SCROW nRow = GetViewData()->GetCurY();
1630*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
1631*b1cdbd2cSJim Jagielski //    sal_Bool bAttrib = pSearchItem->GetPattern();
1632*b1cdbd2cSJim Jagielski 	sal_uInt16 nCommand = pSearchItem->GetCommand();
1633*b1cdbd2cSJim Jagielski 	sal_Bool bAllTables = pSearchItem->IsAllTables();
1634*b1cdbd2cSJim Jagielski 	sal_Bool* pOldSelectedTables = NULL;
1635*b1cdbd2cSJim Jagielski 	sal_uInt16 nOldSelectedCount = 0;
1636*b1cdbd2cSJim Jagielski 	SCTAB nOldTab = nTab;
1637*b1cdbd2cSJim Jagielski 	SCTAB nLastTab = pDoc->GetTableCount() - 1;
1638*b1cdbd2cSJim Jagielski 	SCTAB nStartTab, nEndTab;
1639*b1cdbd2cSJim Jagielski 	if ( bAllTables )
1640*b1cdbd2cSJim Jagielski 	{
1641*b1cdbd2cSJim Jagielski 		nStartTab = 0;
1642*b1cdbd2cSJim Jagielski 		nEndTab = nLastTab;
1643*b1cdbd2cSJim Jagielski 		pOldSelectedTables = new sal_Bool [ nEndTab + 1 ];
1644*b1cdbd2cSJim Jagielski 		for ( SCTAB j = 0; j <= nEndTab; j++ )
1645*b1cdbd2cSJim Jagielski 		{
1646*b1cdbd2cSJim Jagielski 			pOldSelectedTables[j] = rMark.GetTableSelect( j );
1647*b1cdbd2cSJim Jagielski 			if ( pOldSelectedTables[j] )
1648*b1cdbd2cSJim Jagielski 				++nOldSelectedCount;
1649*b1cdbd2cSJim Jagielski 		}
1650*b1cdbd2cSJim Jagielski 	}
1651*b1cdbd2cSJim Jagielski 	else
1652*b1cdbd2cSJim Jagielski 	{	//! mindestens eine ist immer selektiert
1653*b1cdbd2cSJim Jagielski 		nStartTab = nEndTab = rMark.GetFirstSelected();
1654*b1cdbd2cSJim Jagielski 		for ( SCTAB j = nStartTab + 1; j <= nLastTab; j++ )
1655*b1cdbd2cSJim Jagielski 		{
1656*b1cdbd2cSJim Jagielski 			if ( rMark.GetTableSelect( j ) )
1657*b1cdbd2cSJim Jagielski 				nEndTab = j;
1658*b1cdbd2cSJim Jagielski 		}
1659*b1cdbd2cSJim Jagielski 	}
1660*b1cdbd2cSJim Jagielski 
1661*b1cdbd2cSJim Jagielski 	if (   nCommand == SVX_SEARCHCMD_REPLACE
1662*b1cdbd2cSJim Jagielski 		|| nCommand == SVX_SEARCHCMD_REPLACE_ALL )
1663*b1cdbd2cSJim Jagielski 	{
1664*b1cdbd2cSJim Jagielski 		for ( SCTAB j = nStartTab; j <= nEndTab; j++ )
1665*b1cdbd2cSJim Jagielski 		{
1666*b1cdbd2cSJim Jagielski 			if ( (bAllTables || rMark.GetTableSelect( j )) &&
1667*b1cdbd2cSJim Jagielski 					pDoc->IsTabProtected( j ) )
1668*b1cdbd2cSJim Jagielski 			{
1669*b1cdbd2cSJim Jagielski 				if ( pOldSelectedTables )
1670*b1cdbd2cSJim Jagielski 					delete [] pOldSelectedTables;
1671*b1cdbd2cSJim Jagielski 				ErrorMessage(STR_PROTECTIONERR);
1672*b1cdbd2cSJim Jagielski 				return sal_False;
1673*b1cdbd2cSJim Jagielski 			}
1674*b1cdbd2cSJim Jagielski 		}
1675*b1cdbd2cSJim Jagielski 	}
1676*b1cdbd2cSJim Jagielski 
1677*b1cdbd2cSJim Jagielski 	if (   nCommand == SVX_SEARCHCMD_FIND
1678*b1cdbd2cSJim Jagielski 		|| nCommand == SVX_SEARCHCMD_FIND_ALL)
1679*b1cdbd2cSJim Jagielski 		bAddUndo = sal_False;
1680*b1cdbd2cSJim Jagielski 
1681*b1cdbd2cSJim Jagielski 	//!		bAttrib bei Undo beruecksichtigen !!!
1682*b1cdbd2cSJim Jagielski 
1683*b1cdbd2cSJim Jagielski 	ScDocument* pUndoDoc = NULL;
1684*b1cdbd2cSJim Jagielski 	ScMarkData* pUndoMark = NULL;
1685*b1cdbd2cSJim Jagielski 	String aUndoStr;
1686*b1cdbd2cSJim Jagielski 	if (bAddUndo)
1687*b1cdbd2cSJim Jagielski 	{
1688*b1cdbd2cSJim Jagielski 		pUndoMark = new ScMarkData( rMark );				// Markierung wird veraendert
1689*b1cdbd2cSJim Jagielski 		if ( nCommand == SVX_SEARCHCMD_REPLACE_ALL )
1690*b1cdbd2cSJim Jagielski 		{
1691*b1cdbd2cSJim Jagielski 			pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
1692*b1cdbd2cSJim Jagielski 			pUndoDoc->InitUndo( pDoc, nStartTab, nEndTab );
1693*b1cdbd2cSJim Jagielski 		}
1694*b1cdbd2cSJim Jagielski 	}
1695*b1cdbd2cSJim Jagielski 
1696*b1cdbd2cSJim Jagielski 	if ( bAllTables )
1697*b1cdbd2cSJim Jagielski 	{	//! alles selektieren, erst nachdem pUndoMark erzeugt wurde
1698*b1cdbd2cSJim Jagielski 		for ( SCTAB j = nStartTab; j <= nEndTab; j++ )
1699*b1cdbd2cSJim Jagielski 		{
1700*b1cdbd2cSJim Jagielski 			rMark.SelectTable( j, sal_True );
1701*b1cdbd2cSJim Jagielski 		}
1702*b1cdbd2cSJim Jagielski 	}
1703*b1cdbd2cSJim Jagielski 
1704*b1cdbd2cSJim Jagielski 	DoneBlockMode(sal_True);				// Markierung nicht loeschen!
1705*b1cdbd2cSJim Jagielski 	InitOwnBlockMode();
1706*b1cdbd2cSJim Jagielski 
1707*b1cdbd2cSJim Jagielski 	//	wenn vom Anfang an gesucht wird, nicht nochmal fragen ob vom Anfang gesucht werden soll
1708*b1cdbd2cSJim Jagielski 	sal_Bool bFirst = sal_True;
1709*b1cdbd2cSJim Jagielski 	if ( nCol == 0 && nRow == 0 && nTab == nStartTab && !pSearchItem->GetBackward()  )
1710*b1cdbd2cSJim Jagielski 		bFirst = sal_False;
1711*b1cdbd2cSJim Jagielski 
1712*b1cdbd2cSJim Jagielski 	sal_Bool bFound = sal_False;
1713*b1cdbd2cSJim Jagielski 	while (sal_True)
1714*b1cdbd2cSJim Jagielski 	{
1715*b1cdbd2cSJim Jagielski 		GetFrameWin()->EnterWait();
1716*b1cdbd2cSJim Jagielski 		if (pDoc->SearchAndReplace( *pSearchItem, nCol, nRow, nTab, rMark, aUndoStr, pUndoDoc ) )
1717*b1cdbd2cSJim Jagielski 		{
1718*b1cdbd2cSJim Jagielski 			bFound = sal_True;
1719*b1cdbd2cSJim Jagielski 			bFirst = sal_True;
1720*b1cdbd2cSJim Jagielski 			if (bAddUndo)
1721*b1cdbd2cSJim Jagielski 			{
1722*b1cdbd2cSJim Jagielski 				GetViewData()->GetDocShell()->GetUndoManager()->AddUndoAction(
1723*b1cdbd2cSJim Jagielski 					new ScUndoReplace( GetViewData()->GetDocShell(), *pUndoMark,
1724*b1cdbd2cSJim Jagielski 										nCol, nRow, nTab,
1725*b1cdbd2cSJim Jagielski 										aUndoStr, pUndoDoc, pSearchItem ) );
1726*b1cdbd2cSJim Jagielski 				pUndoDoc = NULL;
1727*b1cdbd2cSJim Jagielski 			}
1728*b1cdbd2cSJim Jagielski 
1729*b1cdbd2cSJim Jagielski 			break;					// Abbruch while True
1730*b1cdbd2cSJim Jagielski 		}
1731*b1cdbd2cSJim Jagielski 		else if ( bFirst && (nCommand == SVX_SEARCHCMD_FIND ||
1732*b1cdbd2cSJim Jagielski 				nCommand == SVX_SEARCHCMD_REPLACE) )
1733*b1cdbd2cSJim Jagielski 		{
1734*b1cdbd2cSJim Jagielski 			bFirst = sal_False;
1735*b1cdbd2cSJim Jagielski 			sal_uInt16 nRetVal;
1736*b1cdbd2cSJim Jagielski 			GetFrameWin()->LeaveWait();
1737*b1cdbd2cSJim Jagielski 			if ( bIsApi )
1738*b1cdbd2cSJim Jagielski 				nRetVal = RET_NO;
1739*b1cdbd2cSJim Jagielski 			else
1740*b1cdbd2cSJim Jagielski 			{
1741*b1cdbd2cSJim Jagielski 				//	Suchen-Dialog als Parent, wenn vorhanden
1742*b1cdbd2cSJim Jagielski 				Window* pParent = GetParentOrChild(SID_SEARCH_DLG);
1743*b1cdbd2cSJim Jagielski 				sal_uInt16 nStrId;
1744*b1cdbd2cSJim Jagielski 				if ( pSearchItem->GetBackward() )
1745*b1cdbd2cSJim Jagielski 				{
1746*b1cdbd2cSJim Jagielski 					if ( nStartTab == nEndTab )
1747*b1cdbd2cSJim Jagielski 						nStrId = STR_MSSG_SEARCHANDREPLACE_1;
1748*b1cdbd2cSJim Jagielski 					else
1749*b1cdbd2cSJim Jagielski 						nStrId = STR_MSSG_SEARCHANDREPLACE_4;
1750*b1cdbd2cSJim Jagielski 				}
1751*b1cdbd2cSJim Jagielski 				else
1752*b1cdbd2cSJim Jagielski 				{
1753*b1cdbd2cSJim Jagielski 					if ( nStartTab == nEndTab )
1754*b1cdbd2cSJim Jagielski 						nStrId = STR_MSSG_SEARCHANDREPLACE_2;
1755*b1cdbd2cSJim Jagielski 					else
1756*b1cdbd2cSJim Jagielski 						nStrId = STR_MSSG_SEARCHANDREPLACE_5;
1757*b1cdbd2cSJim Jagielski 				}
1758*b1cdbd2cSJim Jagielski 				MessBox aBox( pParent, WinBits(WB_YES_NO | WB_DEF_YES),
1759*b1cdbd2cSJim Jagielski 								ScGlobal::GetRscString( STR_MSSG_SEARCHANDREPLACE_3 ),
1760*b1cdbd2cSJim Jagielski 								ScGlobal::GetRscString( nStrId ) );
1761*b1cdbd2cSJim Jagielski 				nRetVal = aBox.Execute();
1762*b1cdbd2cSJim Jagielski 			}
1763*b1cdbd2cSJim Jagielski 
1764*b1cdbd2cSJim Jagielski 			if ( nRetVal == RET_YES )
1765*b1cdbd2cSJim Jagielski 			{
1766*b1cdbd2cSJim Jagielski 				ScDocument::GetSearchAndReplaceStart( *pSearchItem, nCol, nRow );
1767*b1cdbd2cSJim Jagielski 				if (pSearchItem->GetBackward())
1768*b1cdbd2cSJim Jagielski 					nTab = nEndTab;
1769*b1cdbd2cSJim Jagielski 				else
1770*b1cdbd2cSJim Jagielski 					nTab = nStartTab;
1771*b1cdbd2cSJim Jagielski 			}
1772*b1cdbd2cSJim Jagielski 			else
1773*b1cdbd2cSJim Jagielski 			{
1774*b1cdbd2cSJim Jagielski 				break;					// Abbruch while True
1775*b1cdbd2cSJim Jagielski 			}
1776*b1cdbd2cSJim Jagielski 		}
1777*b1cdbd2cSJim Jagielski 		else							// nichts gefunden
1778*b1cdbd2cSJim Jagielski 		{
1779*b1cdbd2cSJim Jagielski 			if ( nCommand == SVX_SEARCHCMD_FIND_ALL || nCommand == SVX_SEARCHCMD_REPLACE_ALL )
1780*b1cdbd2cSJim Jagielski 			{
1781*b1cdbd2cSJim Jagielski 				pDocSh->PostPaintGridAll();								// Markierung
1782*b1cdbd2cSJim Jagielski 			}
1783*b1cdbd2cSJim Jagielski 
1784*b1cdbd2cSJim Jagielski 			GetFrameWin()->LeaveWait();
1785*b1cdbd2cSJim Jagielski 			if (!bIsApi)
1786*b1cdbd2cSJim Jagielski 			{
1787*b1cdbd2cSJim Jagielski 				//	Suchen-Dialog als Parent, wenn vorhanden
1788*b1cdbd2cSJim Jagielski 				Window* pParent = GetParentOrChild(SID_SEARCH_DLG);
1789*b1cdbd2cSJim Jagielski 				// "nichts gefunden"
1790*b1cdbd2cSJim Jagielski 				InfoBox aBox( pParent, ScGlobal::GetRscString( STR_MSSG_SEARCHANDREPLACE_0 ) );
1791*b1cdbd2cSJim Jagielski 				aBox.Execute();
1792*b1cdbd2cSJim Jagielski 			}
1793*b1cdbd2cSJim Jagielski 
1794*b1cdbd2cSJim Jagielski 			break;						// Abbruch while True
1795*b1cdbd2cSJim Jagielski 		}
1796*b1cdbd2cSJim Jagielski 	}								// of while sal_True
1797*b1cdbd2cSJim Jagielski 
1798*b1cdbd2cSJim Jagielski 	if ( pOldSelectedTables )
1799*b1cdbd2cSJim Jagielski 	{	// urspruenglich selektierte Tabellen wiederherstellen
1800*b1cdbd2cSJim Jagielski 		for ( SCTAB j = nStartTab; j <= nEndTab; j++ )
1801*b1cdbd2cSJim Jagielski 		{
1802*b1cdbd2cSJim Jagielski 			rMark.SelectTable( j, pOldSelectedTables[j] );
1803*b1cdbd2cSJim Jagielski 		}
1804*b1cdbd2cSJim Jagielski 		if ( bFound )
1805*b1cdbd2cSJim Jagielski 		{	// durch Fundstelle neu selektierte Tabelle bleibt
1806*b1cdbd2cSJim Jagielski 			rMark.SelectTable( nTab, sal_True );
1807*b1cdbd2cSJim Jagielski 			// wenn vorher nur eine selektiert war, ist es ein Tausch
1808*b1cdbd2cSJim Jagielski 			//! wenn nicht, ist jetzt evtl. eine mehr selektiert
1809*b1cdbd2cSJim Jagielski 			if ( nOldSelectedCount == 1 && nTab != nOldTab )
1810*b1cdbd2cSJim Jagielski 				rMark.SelectTable( nOldTab, sal_False );
1811*b1cdbd2cSJim Jagielski 		}
1812*b1cdbd2cSJim Jagielski 		delete [] pOldSelectedTables;
1813*b1cdbd2cSJim Jagielski 	}
1814*b1cdbd2cSJim Jagielski 
1815*b1cdbd2cSJim Jagielski     MarkDataChanged();
1816*b1cdbd2cSJim Jagielski 
1817*b1cdbd2cSJim Jagielski 	if ( bFound )
1818*b1cdbd2cSJim Jagielski 	{
1819*b1cdbd2cSJim Jagielski 		if ( nTab != GetViewData()->GetTabNo() )
1820*b1cdbd2cSJim Jagielski 			SetTabNo( nTab );
1821*b1cdbd2cSJim Jagielski 
1822*b1cdbd2cSJim Jagielski 		//	wenn nichts markiert ist, DoneBlockMode, damit von hier aus
1823*b1cdbd2cSJim Jagielski 		//	direkt per Shift-Cursor markiert werden kann:
1824*b1cdbd2cSJim Jagielski 		if (!rMark.IsMarked() && !rMark.IsMultiMarked())
1825*b1cdbd2cSJim Jagielski 			DoneBlockMode(sal_True);
1826*b1cdbd2cSJim Jagielski 
1827*b1cdbd2cSJim Jagielski 		AlignToCursor( nCol, nRow, SC_FOLLOW_JUMP );
1828*b1cdbd2cSJim Jagielski 		SetCursor( nCol, nRow, sal_True );
1829*b1cdbd2cSJim Jagielski 
1830*b1cdbd2cSJim Jagielski 		if (   nCommand == SVX_SEARCHCMD_REPLACE
1831*b1cdbd2cSJim Jagielski 			|| nCommand == SVX_SEARCHCMD_REPLACE_ALL )
1832*b1cdbd2cSJim Jagielski 		{
1833*b1cdbd2cSJim Jagielski 			if ( nCommand == SVX_SEARCHCMD_REPLACE )
1834*b1cdbd2cSJim Jagielski 				pDocSh->PostPaint( nCol,nRow,nTab, nCol,nRow,nTab, PAINT_GRID );
1835*b1cdbd2cSJim Jagielski 			else
1836*b1cdbd2cSJim Jagielski 				pDocSh->PostPaintGridAll();
1837*b1cdbd2cSJim Jagielski 			pDocSh->SetDocumentModified();
1838*b1cdbd2cSJim Jagielski 		}
1839*b1cdbd2cSJim Jagielski 		else if ( nCommand == SVX_SEARCHCMD_FIND_ALL )
1840*b1cdbd2cSJim Jagielski 			pDocSh->PostPaintGridAll();								// Markierung
1841*b1cdbd2cSJim Jagielski 		GetFrameWin()->LeaveWait();
1842*b1cdbd2cSJim Jagielski 	}
1843*b1cdbd2cSJim Jagielski 
1844*b1cdbd2cSJim Jagielski 	delete pUndoDoc;			// loeschen wenn nicht benutzt
1845*b1cdbd2cSJim Jagielski 	delete pUndoMark;			// kann immer geloescht werden
1846*b1cdbd2cSJim Jagielski 	return bFound;
1847*b1cdbd2cSJim Jagielski }
1848*b1cdbd2cSJim Jagielski 
1849*b1cdbd2cSJim Jagielski 
1850*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1851*b1cdbd2cSJim Jagielski //	Zielwertsuche
1852*b1cdbd2cSJim Jagielski 
Solve(const ScSolveParam & rParam)1853*b1cdbd2cSJim Jagielski void ScViewFunc::Solve( const ScSolveParam& rParam )
1854*b1cdbd2cSJim Jagielski {
1855*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = GetViewData()->GetDocument();
1856*b1cdbd2cSJim Jagielski 
1857*b1cdbd2cSJim Jagielski 	SCCOL nDestCol = rParam.aRefVariableCell.Col();
1858*b1cdbd2cSJim Jagielski 	SCROW nDestRow = rParam.aRefVariableCell.Row();
1859*b1cdbd2cSJim Jagielski 	SCTAB nDestTab = rParam.aRefVariableCell.Tab();
1860*b1cdbd2cSJim Jagielski 
1861*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( pDoc, nDestTab, nDestCol,nDestRow, nDestCol,nDestRow );
1862*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
1863*b1cdbd2cSJim Jagielski 	{
1864*b1cdbd2cSJim Jagielski 		ErrorMessage(aTester.GetMessageId());
1865*b1cdbd2cSJim Jagielski 		return;
1866*b1cdbd2cSJim Jagielski 	}
1867*b1cdbd2cSJim Jagielski 
1868*b1cdbd2cSJim Jagielski 	if ( pDoc )
1869*b1cdbd2cSJim Jagielski 	{
1870*b1cdbd2cSJim Jagielski 		String  aTargetValStr;
1871*b1cdbd2cSJim Jagielski 		if ( rParam.pStrTargetVal != NULL )
1872*b1cdbd2cSJim Jagielski 			aTargetValStr = *(rParam.pStrTargetVal);
1873*b1cdbd2cSJim Jagielski 
1874*b1cdbd2cSJim Jagielski 		String  aMsgStr;
1875*b1cdbd2cSJim Jagielski 		String	aResStr;
1876*b1cdbd2cSJim Jagielski 		double	nSolveResult;
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski 		GetFrameWin()->EnterWait();
1879*b1cdbd2cSJim Jagielski 
1880*b1cdbd2cSJim Jagielski 		sal_Bool  	bExact =
1881*b1cdbd2cSJim Jagielski 					pDoc->Solver(
1882*b1cdbd2cSJim Jagielski 						rParam.aRefFormulaCell.Col(),
1883*b1cdbd2cSJim Jagielski 						rParam.aRefFormulaCell.Row(),
1884*b1cdbd2cSJim Jagielski 						rParam.aRefFormulaCell.Tab(),
1885*b1cdbd2cSJim Jagielski 						nDestCol, nDestRow, nDestTab,
1886*b1cdbd2cSJim Jagielski 						aTargetValStr,
1887*b1cdbd2cSJim Jagielski 						nSolveResult );
1888*b1cdbd2cSJim Jagielski 
1889*b1cdbd2cSJim Jagielski 		GetFrameWin()->LeaveWait();
1890*b1cdbd2cSJim Jagielski 
1891*b1cdbd2cSJim Jagielski 		SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
1892*b1cdbd2cSJim Jagielski 		sal_uLong nFormat = 0;
1893*b1cdbd2cSJim Jagielski 		const ScPatternAttr* pPattern = pDoc->GetPattern( nDestCol, nDestRow, nDestTab );
1894*b1cdbd2cSJim Jagielski 		if ( pPattern )
1895*b1cdbd2cSJim Jagielski 			nFormat = pPattern->GetNumberFormat( pFormatter );
1896*b1cdbd2cSJim Jagielski 		Color* p;
1897*b1cdbd2cSJim Jagielski 		pFormatter->GetOutputString( nSolveResult, nFormat, aResStr, &p );
1898*b1cdbd2cSJim Jagielski 
1899*b1cdbd2cSJim Jagielski 		if ( bExact )
1900*b1cdbd2cSJim Jagielski 		{
1901*b1cdbd2cSJim Jagielski 			aMsgStr  = ScGlobal::GetRscString( STR_MSSG_SOLVE_0 );
1902*b1cdbd2cSJim Jagielski 			aMsgStr += ScGlobal::GetRscString( STR_MSSG_SOLVE_1 );
1903*b1cdbd2cSJim Jagielski 			aMsgStr += String( aResStr );
1904*b1cdbd2cSJim Jagielski 			aMsgStr += ScGlobal::GetRscString( STR_MSSG_SOLVE_2 );
1905*b1cdbd2cSJim Jagielski 		}
1906*b1cdbd2cSJim Jagielski 		else
1907*b1cdbd2cSJim Jagielski 		{
1908*b1cdbd2cSJim Jagielski 			aMsgStr  = ScGlobal::GetRscString( STR_MSSG_SOLVE_3 );
1909*b1cdbd2cSJim Jagielski 			aMsgStr += ScGlobal::GetRscString( STR_MSSG_SOLVE_4 );
1910*b1cdbd2cSJim Jagielski 			aMsgStr += ScGlobal::GetRscString( STR_MSSG_SOLVE_5 );
1911*b1cdbd2cSJim Jagielski 			aMsgStr += String( aResStr );
1912*b1cdbd2cSJim Jagielski 			aMsgStr += ScGlobal::GetRscString( STR_MSSG_SOLVE_6 );
1913*b1cdbd2cSJim Jagielski 		}
1914*b1cdbd2cSJim Jagielski 
1915*b1cdbd2cSJim Jagielski 		MessBox aBox( GetViewData()->GetDialogParent(),
1916*b1cdbd2cSJim Jagielski 						WinBits(WB_YES_NO | WB_DEF_NO),
1917*b1cdbd2cSJim Jagielski 						ScGlobal::GetRscString( STR_MSSG_DOSUBTOTALS_0 ), aMsgStr );
1918*b1cdbd2cSJim Jagielski 		sal_uInt16 nRetVal = aBox.Execute();
1919*b1cdbd2cSJim Jagielski 
1920*b1cdbd2cSJim Jagielski 		if ( RET_YES == nRetVal )
1921*b1cdbd2cSJim Jagielski 			EnterValue( nDestCol, nDestRow, nDestTab, nSolveResult );
1922*b1cdbd2cSJim Jagielski 
1923*b1cdbd2cSJim Jagielski 		GetViewData()->GetViewShell()->UpdateInputHandler( sal_True );
1924*b1cdbd2cSJim Jagielski 	}
1925*b1cdbd2cSJim Jagielski }
1926*b1cdbd2cSJim Jagielski 
1927*b1cdbd2cSJim Jagielski 
1928*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1929*b1cdbd2cSJim Jagielski //	Mehrfachoperation
1930*b1cdbd2cSJim Jagielski 
TabOp(const ScTabOpParam & rParam,sal_Bool bRecord)1931*b1cdbd2cSJim Jagielski void ScViewFunc::TabOp( const ScTabOpParam& rParam, sal_Bool bRecord )
1932*b1cdbd2cSJim Jagielski {
1933*b1cdbd2cSJim Jagielski 	ScRange aRange;
1934*b1cdbd2cSJim Jagielski 	if (GetViewData()->GetSimpleArea(aRange) == SC_MARK_SIMPLE)
1935*b1cdbd2cSJim Jagielski 	{
1936*b1cdbd2cSJim Jagielski 		ScDocShell* pDocSh = GetViewData()->GetDocShell();
1937*b1cdbd2cSJim Jagielski 		ScMarkData& rMark = GetViewData()->GetMarkData();
1938*b1cdbd2cSJim Jagielski 		pDocSh->GetDocFunc().TabOp( aRange, &rMark, rParam, bRecord, sal_False );
1939*b1cdbd2cSJim Jagielski 	}
1940*b1cdbd2cSJim Jagielski 	else
1941*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_NOMULTISELECT);
1942*b1cdbd2cSJim Jagielski }
1943*b1cdbd2cSJim Jagielski 
1944*b1cdbd2cSJim Jagielski 
1945*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1946*b1cdbd2cSJim Jagielski 
MakeScenario(const String & rName,const String & rComment,const Color & rColor,sal_uInt16 nFlags)1947*b1cdbd2cSJim Jagielski void ScViewFunc::MakeScenario( const String& rName, const String& rComment,
1948*b1cdbd2cSJim Jagielski 									const Color& rColor, sal_uInt16 nFlags )
1949*b1cdbd2cSJim Jagielski {
1950*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh	= GetViewData()->GetDocShell();
1951*b1cdbd2cSJim Jagielski 	ScMarkData&	rMark	= GetViewData()->GetMarkData();
1952*b1cdbd2cSJim Jagielski 	SCTAB		nTab	= GetViewData()->GetTabNo();
1953*b1cdbd2cSJim Jagielski 
1954*b1cdbd2cSJim Jagielski 	SCTAB nNewTab = pDocSh->MakeScenario( nTab, rName, rComment, rColor, nFlags, rMark );
1955*b1cdbd2cSJim Jagielski 	if (nFlags & SC_SCENARIO_COPYALL)
1956*b1cdbd2cSJim Jagielski 		SetTabNo( nNewTab, sal_True );			// SC_SCENARIO_COPYALL -> sichtbar
1957*b1cdbd2cSJim Jagielski 	else
1958*b1cdbd2cSJim Jagielski 	{
1959*b1cdbd2cSJim Jagielski 		SfxBindings& rBindings = GetViewData()->GetBindings();
1960*b1cdbd2cSJim Jagielski 		rBindings.Invalidate( SID_STATUS_DOCPOS );		// Statusbar
1961*b1cdbd2cSJim Jagielski 		rBindings.Invalidate( SID_TABLES_COUNT );
1962*b1cdbd2cSJim Jagielski 		rBindings.Invalidate( SID_SELECT_SCENARIO );
1963*b1cdbd2cSJim Jagielski 		rBindings.Invalidate( FID_TABLE_SHOW );
1964*b1cdbd2cSJim Jagielski 	}
1965*b1cdbd2cSJim Jagielski }
1966*b1cdbd2cSJim Jagielski 
1967*b1cdbd2cSJim Jagielski 
1968*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1969*b1cdbd2cSJim Jagielski 
ExtendScenario()1970*b1cdbd2cSJim Jagielski void ScViewFunc::ExtendScenario()
1971*b1cdbd2cSJim Jagielski {
1972*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( this );
1973*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
1974*b1cdbd2cSJim Jagielski 	{
1975*b1cdbd2cSJim Jagielski 		ErrorMessage(aTester.GetMessageId());
1976*b1cdbd2cSJim Jagielski 		return;
1977*b1cdbd2cSJim Jagielski 	}
1978*b1cdbd2cSJim Jagielski 
1979*b1cdbd2cSJim Jagielski 		//	Undo: Attribute anwenden
1980*b1cdbd2cSJim Jagielski 
1981*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = GetViewData()->GetDocument();
1982*b1cdbd2cSJim Jagielski 	ScPatternAttr aPattern( pDoc->GetPool() );
1983*b1cdbd2cSJim Jagielski 	aPattern.GetItemSet().Put( ScMergeFlagAttr( SC_MF_SCENARIO ) );
1984*b1cdbd2cSJim Jagielski 	aPattern.GetItemSet().Put( ScProtectionAttr( sal_True ) );
1985*b1cdbd2cSJim Jagielski 	ApplySelectionPattern(aPattern);
1986*b1cdbd2cSJim Jagielski }
1987*b1cdbd2cSJim Jagielski 
1988*b1cdbd2cSJim Jagielski 
1989*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
1990*b1cdbd2cSJim Jagielski 
UseScenario(const String & rName)1991*b1cdbd2cSJim Jagielski void ScViewFunc::UseScenario( const String& rName )
1992*b1cdbd2cSJim Jagielski {
1993*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh	= GetViewData()->GetDocShell();
1994*b1cdbd2cSJim Jagielski 	SCTAB		nTab	= GetViewData()->GetTabNo();
1995*b1cdbd2cSJim Jagielski 
1996*b1cdbd2cSJim Jagielski 	DoneBlockMode();
1997*b1cdbd2cSJim Jagielski 	InitOwnBlockMode();
1998*b1cdbd2cSJim Jagielski 	pDocSh->UseScenario( nTab, rName );
1999*b1cdbd2cSJim Jagielski }
2000*b1cdbd2cSJim Jagielski 
2001*b1cdbd2cSJim Jagielski 
2002*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2003*b1cdbd2cSJim Jagielski //	Tabelle einfuegen
2004*b1cdbd2cSJim Jagielski 
InsertTable(const String & rName,SCTAB nTab,sal_Bool bRecord)2005*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::InsertTable( const String& rName, SCTAB nTab, sal_Bool bRecord )
2006*b1cdbd2cSJim Jagielski {
2007*b1cdbd2cSJim Jagielski 	//	Reihenfolge Tabelle/Name ist bei DocFunc umgekehrt
2008*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = GetViewData()->GetDocShell()->GetDocFunc().
2009*b1cdbd2cSJim Jagielski 						InsertTable( nTab, rName, bRecord, sal_False );
2010*b1cdbd2cSJim Jagielski 	if (bSuccess)
2011*b1cdbd2cSJim Jagielski 		SetTabNo( nTab, sal_True );
2012*b1cdbd2cSJim Jagielski 
2013*b1cdbd2cSJim Jagielski 	return bSuccess;
2014*b1cdbd2cSJim Jagielski }
2015*b1cdbd2cSJim Jagielski 
2016*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2017*b1cdbd2cSJim Jagielski //	Tabellen einfuegen
2018*b1cdbd2cSJim Jagielski 
InsertTables(SvStrings * pNames,SCTAB nTab,SCTAB nCount,sal_Bool bRecord)2019*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::InsertTables(SvStrings *pNames, SCTAB nTab,
2020*b1cdbd2cSJim Jagielski 											SCTAB nCount, sal_Bool bRecord )
2021*b1cdbd2cSJim Jagielski {
2022*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh	= GetViewData()->GetDocShell();
2023*b1cdbd2cSJim Jagielski 	ScDocument* pDoc 	= pDocSh->GetDocument();
2024*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
2025*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
2026*b1cdbd2cSJim Jagielski 
2027*b1cdbd2cSJim Jagielski 	SvStrings *pNameList= NULL;
2028*b1cdbd2cSJim Jagielski 
2029*b1cdbd2cSJim Jagielski 	WaitObject aWait( GetFrameWin() );
2030*b1cdbd2cSJim Jagielski 
2031*b1cdbd2cSJim Jagielski 	if (bRecord)
2032*b1cdbd2cSJim Jagielski 	{
2033*b1cdbd2cSJim Jagielski 		pNameList= new SvStrings;
2034*b1cdbd2cSJim Jagielski 		pDoc->BeginDrawUndo();							//	InsertTab erzeugt ein SdrUndoNewPage
2035*b1cdbd2cSJim Jagielski 	}
2036*b1cdbd2cSJim Jagielski 
2037*b1cdbd2cSJim Jagielski 	sal_Bool bFlag=sal_False;
2038*b1cdbd2cSJim Jagielski 
2039*b1cdbd2cSJim Jagielski 	String aValTabName;
2040*b1cdbd2cSJim Jagielski 	String *pStr;
2041*b1cdbd2cSJim Jagielski 
2042*b1cdbd2cSJim Jagielski 	for(SCTAB i=0;i<nCount;i++)
2043*b1cdbd2cSJim Jagielski 	{
2044*b1cdbd2cSJim Jagielski 		if(pNames!=NULL)
2045*b1cdbd2cSJim Jagielski 		{
2046*b1cdbd2cSJim Jagielski 			pStr=pNames->GetObject(static_cast<sal_uInt16>(i));
2047*b1cdbd2cSJim Jagielski 		}
2048*b1cdbd2cSJim Jagielski 		else
2049*b1cdbd2cSJim Jagielski 		{
2050*b1cdbd2cSJim Jagielski 			aValTabName.Erase();
2051*b1cdbd2cSJim Jagielski 			pDoc->CreateValidTabName( aValTabName);
2052*b1cdbd2cSJim Jagielski 			pStr=&aValTabName;
2053*b1cdbd2cSJim Jagielski 		}
2054*b1cdbd2cSJim Jagielski 
2055*b1cdbd2cSJim Jagielski 		if(pDoc->InsertTab( nTab+i,*pStr))
2056*b1cdbd2cSJim Jagielski 		{
2057*b1cdbd2cSJim Jagielski 			bFlag=sal_True;
2058*b1cdbd2cSJim Jagielski 			pDocSh->Broadcast( ScTablesHint( SC_TAB_INSERTED, nTab+i ) );
2059*b1cdbd2cSJim Jagielski 		}
2060*b1cdbd2cSJim Jagielski 		else
2061*b1cdbd2cSJim Jagielski 		{
2062*b1cdbd2cSJim Jagielski 			break;
2063*b1cdbd2cSJim Jagielski 		}
2064*b1cdbd2cSJim Jagielski 
2065*b1cdbd2cSJim Jagielski 		if(pNameList!=NULL)
2066*b1cdbd2cSJim Jagielski 			pNameList->Insert(new String(*pStr),pNameList->Count());
2067*b1cdbd2cSJim Jagielski 
2068*b1cdbd2cSJim Jagielski 	}
2069*b1cdbd2cSJim Jagielski 
2070*b1cdbd2cSJim Jagielski 	if (bFlag)
2071*b1cdbd2cSJim Jagielski 	{
2072*b1cdbd2cSJim Jagielski 		if (bRecord)
2073*b1cdbd2cSJim Jagielski 			pDocSh->GetUndoManager()->AddUndoAction(
2074*b1cdbd2cSJim Jagielski 						new ScUndoInsertTables( pDocSh, nTab, sal_False, pNameList));
2075*b1cdbd2cSJim Jagielski 
2076*b1cdbd2cSJim Jagielski 		//	Views updaten:
2077*b1cdbd2cSJim Jagielski 
2078*b1cdbd2cSJim Jagielski 		SetTabNo( nTab, sal_True );
2079*b1cdbd2cSJim Jagielski 		pDocSh->PostPaintExtras();
2080*b1cdbd2cSJim Jagielski 		pDocSh->SetDocumentModified();
2081*b1cdbd2cSJim Jagielski 		SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2082*b1cdbd2cSJim Jagielski 		return sal_True;
2083*b1cdbd2cSJim Jagielski 	}
2084*b1cdbd2cSJim Jagielski 	else
2085*b1cdbd2cSJim Jagielski 	{
2086*b1cdbd2cSJim Jagielski 		return sal_False;
2087*b1cdbd2cSJim Jagielski 	}
2088*b1cdbd2cSJim Jagielski }
2089*b1cdbd2cSJim Jagielski 
2090*b1cdbd2cSJim Jagielski 
2091*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2092*b1cdbd2cSJim Jagielski 
AppendTable(const String & rName,sal_Bool bRecord)2093*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::AppendTable( const String& rName, sal_Bool bRecord )
2094*b1cdbd2cSJim Jagielski {
2095*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
2096*b1cdbd2cSJim Jagielski 	ScDocument* pDoc   = pDocSh->GetDocument();
2097*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
2098*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
2099*b1cdbd2cSJim Jagielski 
2100*b1cdbd2cSJim Jagielski 	WaitObject aWait( GetFrameWin() );
2101*b1cdbd2cSJim Jagielski 
2102*b1cdbd2cSJim Jagielski 	if (bRecord)
2103*b1cdbd2cSJim Jagielski 		pDoc->BeginDrawUndo();							//	InsertTab erzeugt ein SdrUndoNewPage
2104*b1cdbd2cSJim Jagielski 
2105*b1cdbd2cSJim Jagielski 	if (pDoc->InsertTab( SC_TAB_APPEND, rName ))
2106*b1cdbd2cSJim Jagielski 	{
2107*b1cdbd2cSJim Jagielski 		SCTAB nTab = pDoc->GetTableCount()-1;
2108*b1cdbd2cSJim Jagielski 		if (bRecord)
2109*b1cdbd2cSJim Jagielski 			pDocSh->GetUndoManager()->AddUndoAction(
2110*b1cdbd2cSJim Jagielski 						new ScUndoInsertTab( pDocSh, nTab, sal_True, rName));
2111*b1cdbd2cSJim Jagielski 		GetViewData()->InsertTab( nTab );
2112*b1cdbd2cSJim Jagielski 		SetTabNo( nTab, sal_True );
2113*b1cdbd2cSJim Jagielski 		pDocSh->PostPaintExtras();
2114*b1cdbd2cSJim Jagielski 		pDocSh->SetDocumentModified();
2115*b1cdbd2cSJim Jagielski 		SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2116*b1cdbd2cSJim Jagielski 		return sal_True;
2117*b1cdbd2cSJim Jagielski 	}
2118*b1cdbd2cSJim Jagielski 	else
2119*b1cdbd2cSJim Jagielski 	{
2120*b1cdbd2cSJim Jagielski 		return sal_False;
2121*b1cdbd2cSJim Jagielski 	}
2122*b1cdbd2cSJim Jagielski }
2123*b1cdbd2cSJim Jagielski 
2124*b1cdbd2cSJim Jagielski 
2125*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2126*b1cdbd2cSJim Jagielski 
DeleteTable(SCTAB nTab,sal_Bool bRecord)2127*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::DeleteTable( SCTAB nTab, sal_Bool bRecord )
2128*b1cdbd2cSJim Jagielski {
2129*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh	= GetViewData()->GetDocShell();
2130*b1cdbd2cSJim Jagielski 	ScDocument* pDoc 	= pDocSh->GetDocument();
2131*b1cdbd2cSJim Jagielski 
2132*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = pDocSh->GetDocFunc().DeleteTable( nTab, bRecord, sal_False );
2133*b1cdbd2cSJim Jagielski 	if (bSuccess)
2134*b1cdbd2cSJim Jagielski 	{
2135*b1cdbd2cSJim Jagielski 		SCTAB nNewTab = nTab;
2136*b1cdbd2cSJim Jagielski 		if ( nNewTab >= pDoc->GetTableCount() )
2137*b1cdbd2cSJim Jagielski 			--nNewTab;
2138*b1cdbd2cSJim Jagielski 		SetTabNo( nNewTab, sal_True );
2139*b1cdbd2cSJim Jagielski 	}
2140*b1cdbd2cSJim Jagielski 	return bSuccess;
2141*b1cdbd2cSJim Jagielski }
2142*b1cdbd2cSJim Jagielski 
DeleteTables(const SvShorts & TheTabs,sal_Bool bRecord)2143*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::DeleteTables(const SvShorts &TheTabs, sal_Bool bRecord )
2144*b1cdbd2cSJim Jagielski {
2145*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh	= GetViewData()->GetDocShell();
2146*b1cdbd2cSJim Jagielski 	ScDocument* pDoc 	= pDocSh->GetDocument();
2147*b1cdbd2cSJim Jagielski     sal_Bool bVbaEnabled = pDoc ? pDoc->IsInVBAMode() : sal_False;
2148*b1cdbd2cSJim Jagielski 	SCTAB		nNewTab = TheTabs.front();
2149*b1cdbd2cSJim Jagielski 	WaitObject aWait( GetFrameWin() );
2150*b1cdbd2cSJim Jagielski 	if (bRecord && !pDoc->IsUndoEnabled())
2151*b1cdbd2cSJim Jagielski 		bRecord = sal_False;
2152*b1cdbd2cSJim Jagielski 
2153*b1cdbd2cSJim Jagielski 	while ( nNewTab > 0 && !pDoc->IsVisible( nNewTab ) )
2154*b1cdbd2cSJim Jagielski 		--nNewTab;
2155*b1cdbd2cSJim Jagielski 
2156*b1cdbd2cSJim Jagielski 	sal_Bool bWasLinked = sal_False;
2157*b1cdbd2cSJim Jagielski 	ScDocument* pUndoDoc = NULL;
2158*b1cdbd2cSJim Jagielski 	ScRefUndoData* pUndoData = NULL;
2159*b1cdbd2cSJim Jagielski 	if (bRecord)
2160*b1cdbd2cSJim Jagielski 	{
2161*b1cdbd2cSJim Jagielski 		pUndoDoc = new ScDocument( SCDOCMODE_UNDO );
2162*b1cdbd2cSJim Jagielski //		pUndoDoc->InitDrawLayer( pDocSh );
2163*b1cdbd2cSJim Jagielski 		SCTAB nCount = pDoc->GetTableCount();
2164*b1cdbd2cSJim Jagielski 
2165*b1cdbd2cSJim Jagielski //		pUndoDoc->InitUndo( pDoc, 0, nCount-1 );		// incl. Ref.
2166*b1cdbd2cSJim Jagielski 
2167*b1cdbd2cSJim Jagielski 		String aOldName;
2168*b1cdbd2cSJim Jagielski         for (size_t i = 0; i < TheTabs.size(); i++)
2169*b1cdbd2cSJim Jagielski         {
2170*b1cdbd2cSJim Jagielski             SCTAB nTab = TheTabs[i];
2171*b1cdbd2cSJim Jagielski 			if (i==0)
2172*b1cdbd2cSJim Jagielski 				pUndoDoc->InitUndo( pDoc, nTab,nTab, sal_True,sal_True );	// incl. Spalten/Zeilenflags
2173*b1cdbd2cSJim Jagielski 			else
2174*b1cdbd2cSJim Jagielski 				pUndoDoc->AddUndoTab( nTab,nTab, sal_True,sal_True );		// incl. Spalten/Zeilenflags
2175*b1cdbd2cSJim Jagielski 
2176*b1cdbd2cSJim Jagielski 			pDoc->CopyToDocument(0,0,nTab, MAXCOL,MAXROW,nTab, IDF_ALL,sal_False, pUndoDoc );
2177*b1cdbd2cSJim Jagielski 			pDoc->GetName( nTab, aOldName );
2178*b1cdbd2cSJim Jagielski 			pUndoDoc->RenameTab( nTab, aOldName, sal_False );
2179*b1cdbd2cSJim Jagielski 			if (pDoc->IsLinked(nTab))
2180*b1cdbd2cSJim Jagielski 			{
2181*b1cdbd2cSJim Jagielski 				bWasLinked = sal_True;
2182*b1cdbd2cSJim Jagielski 				pUndoDoc->SetLink( nTab, pDoc->GetLinkMode(nTab), pDoc->GetLinkDoc(nTab),
2183*b1cdbd2cSJim Jagielski 									pDoc->GetLinkFlt(nTab), pDoc->GetLinkOpt(nTab),
2184*b1cdbd2cSJim Jagielski 									pDoc->GetLinkTab(nTab),
2185*b1cdbd2cSJim Jagielski 									pDoc->GetLinkRefreshDelay(nTab) );
2186*b1cdbd2cSJim Jagielski 			}
2187*b1cdbd2cSJim Jagielski 			if ( pDoc->IsScenario(nTab) )
2188*b1cdbd2cSJim Jagielski 			{
2189*b1cdbd2cSJim Jagielski 				pUndoDoc->SetScenario( nTab, sal_True );
2190*b1cdbd2cSJim Jagielski 				String aComment;
2191*b1cdbd2cSJim Jagielski 				Color  aColor;
2192*b1cdbd2cSJim Jagielski 				sal_uInt16 nScenFlags;
2193*b1cdbd2cSJim Jagielski 				pDoc->GetScenarioData( nTab, aComment, aColor, nScenFlags );
2194*b1cdbd2cSJim Jagielski 				pUndoDoc->SetScenarioData( nTab, aComment, aColor, nScenFlags );
2195*b1cdbd2cSJim Jagielski 				sal_Bool bActive = pDoc->IsActiveScenario( nTab );
2196*b1cdbd2cSJim Jagielski 				pUndoDoc->SetActiveScenario( nTab, bActive );
2197*b1cdbd2cSJim Jagielski 			}
2198*b1cdbd2cSJim Jagielski 			pUndoDoc->SetVisible( nTab, pDoc->IsVisible( nTab ) );
2199*b1cdbd2cSJim Jagielski             pUndoDoc->SetTabBgColor( nTab, pDoc->GetTabBgColor(nTab) );
2200*b1cdbd2cSJim Jagielski             pUndoDoc->SetSheetEvents( nTab, pDoc->GetSheetEvents( nTab ) );
2201*b1cdbd2cSJim Jagielski 
2202*b1cdbd2cSJim Jagielski 			if ( pDoc->IsTabProtected( nTab ) )
2203*b1cdbd2cSJim Jagielski                 pUndoDoc->SetTabProtection(nTab, pDoc->GetTabProtection(nTab));
2204*b1cdbd2cSJim Jagielski 
2205*b1cdbd2cSJim Jagielski 			//	Drawing-Layer muss sein Undo selbst in der Hand behalten !!!
2206*b1cdbd2cSJim Jagielski 			//		pUndoDoc->TransferDrawPage(pDoc, nTab,nTab);
2207*b1cdbd2cSJim Jagielski 		}
2208*b1cdbd2cSJim Jagielski 
2209*b1cdbd2cSJim Jagielski 		pUndoDoc->AddUndoTab( 0, nCount-1 );			//	alle Tabs fuer Referenzen
2210*b1cdbd2cSJim Jagielski 
2211*b1cdbd2cSJim Jagielski 		pDoc->BeginDrawUndo();							//	DeleteTab erzeugt ein SdrUndoDelPage
2212*b1cdbd2cSJim Jagielski 
2213*b1cdbd2cSJim Jagielski 		pUndoData = new ScRefUndoData( pDoc );
2214*b1cdbd2cSJim Jagielski 	}
2215*b1cdbd2cSJim Jagielski 
2216*b1cdbd2cSJim Jagielski 	sal_Bool bDelDone = sal_False;
2217*b1cdbd2cSJim Jagielski 
2218*b1cdbd2cSJim Jagielski     for (size_t i = TheTabs.size(); i > 0; i--)
2219*b1cdbd2cSJim Jagielski     {
2220*b1cdbd2cSJim Jagielski         String sCodeName;
2221*b1cdbd2cSJim Jagielski         sal_Bool bHasCodeName = pDoc->GetCodeName( TheTabs[i-1], sCodeName );
2222*b1cdbd2cSJim Jagielski         if (pDoc->DeleteTab( TheTabs[i-1], pUndoDoc ))
2223*b1cdbd2cSJim Jagielski 		{
2224*b1cdbd2cSJim Jagielski 			bDelDone = sal_True;
2225*b1cdbd2cSJim Jagielski             if( bVbaEnabled )
2226*b1cdbd2cSJim Jagielski             {
2227*b1cdbd2cSJim Jagielski                 if( bHasCodeName )
2228*b1cdbd2cSJim Jagielski                 {
2229*b1cdbd2cSJim Jagielski                     VBA_DeleteModule( *pDocSh, sCodeName );
2230*b1cdbd2cSJim Jagielski                 }
2231*b1cdbd2cSJim Jagielski             }
2232*b1cdbd2cSJim Jagielski             pDocSh->Broadcast( ScTablesHint( SC_TAB_DELETED, TheTabs[i-1] ) );
2233*b1cdbd2cSJim Jagielski 		}
2234*b1cdbd2cSJim Jagielski 	}
2235*b1cdbd2cSJim Jagielski 	if (bRecord)
2236*b1cdbd2cSJim Jagielski 	{
2237*b1cdbd2cSJim Jagielski 		pDocSh->GetUndoManager()->AddUndoAction(
2238*b1cdbd2cSJim Jagielski 					new ScUndoDeleteTab( GetViewData()->GetDocShell(), TheTabs,
2239*b1cdbd2cSJim Jagielski 											pUndoDoc, pUndoData ));
2240*b1cdbd2cSJim Jagielski 	}
2241*b1cdbd2cSJim Jagielski 
2242*b1cdbd2cSJim Jagielski 
2243*b1cdbd2cSJim Jagielski 	if (bDelDone)
2244*b1cdbd2cSJim Jagielski 	{
2245*b1cdbd2cSJim Jagielski 		if ( nNewTab >= pDoc->GetTableCount() )
2246*b1cdbd2cSJim Jagielski 			nNewTab = pDoc->GetTableCount() - 1;
2247*b1cdbd2cSJim Jagielski 
2248*b1cdbd2cSJim Jagielski 		SetTabNo( nNewTab, sal_True );
2249*b1cdbd2cSJim Jagielski 
2250*b1cdbd2cSJim Jagielski 		if (bWasLinked)
2251*b1cdbd2cSJim Jagielski 		{
2252*b1cdbd2cSJim Jagielski 			pDocSh->UpdateLinks();				// Link-Manager updaten
2253*b1cdbd2cSJim Jagielski 			GetViewData()->GetBindings().Invalidate(SID_LINKS);
2254*b1cdbd2cSJim Jagielski 		}
2255*b1cdbd2cSJim Jagielski 
2256*b1cdbd2cSJim Jagielski 		pDocSh->PostPaintExtras();
2257*b1cdbd2cSJim Jagielski 		pDocSh->SetDocumentModified();
2258*b1cdbd2cSJim Jagielski 
2259*b1cdbd2cSJim Jagielski         SfxApplication* pSfxApp = SFX_APP();                                // Navigator
2260*b1cdbd2cSJim Jagielski         pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2261*b1cdbd2cSJim Jagielski         pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) );
2262*b1cdbd2cSJim Jagielski         pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_AREALINKS_CHANGED ) );
2263*b1cdbd2cSJim Jagielski 	}
2264*b1cdbd2cSJim Jagielski 	else
2265*b1cdbd2cSJim Jagielski 	{
2266*b1cdbd2cSJim Jagielski 		delete pUndoDoc;
2267*b1cdbd2cSJim Jagielski 		delete pUndoData;
2268*b1cdbd2cSJim Jagielski 	}
2269*b1cdbd2cSJim Jagielski 	return bDelDone;
2270*b1cdbd2cSJim Jagielski }
2271*b1cdbd2cSJim Jagielski 
2272*b1cdbd2cSJim Jagielski 
2273*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2274*b1cdbd2cSJim Jagielski 
RenameTable(const String & rName,SCTAB nTab)2275*b1cdbd2cSJim Jagielski sal_Bool ScViewFunc::RenameTable( const String& rName, SCTAB nTab )
2276*b1cdbd2cSJim Jagielski {
2277*b1cdbd2cSJim Jagielski 	//	Reihenfolge Tabelle/Name ist bei DocFunc umgekehrt
2278*b1cdbd2cSJim Jagielski 	sal_Bool bSuccess = GetViewData()->GetDocShell()->GetDocFunc().
2279*b1cdbd2cSJim Jagielski 						RenameTable( nTab, rName, sal_True, sal_False );
2280*b1cdbd2cSJim Jagielski 	if (bSuccess)
2281*b1cdbd2cSJim Jagielski 	{
2282*b1cdbd2cSJim Jagielski 		//	Der Tabellenname koennte in einer Formel vorkommen...
2283*b1cdbd2cSJim Jagielski 		GetViewData()->GetViewShell()->UpdateInputHandler();
2284*b1cdbd2cSJim Jagielski 	}
2285*b1cdbd2cSJim Jagielski 	return bSuccess;
2286*b1cdbd2cSJim Jagielski }
2287*b1cdbd2cSJim Jagielski 
2288*b1cdbd2cSJim Jagielski 
2289*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2290*b1cdbd2cSJim Jagielski 
SetTabBgColor(const Color & rColor,SCTAB nTab)2291*b1cdbd2cSJim Jagielski bool ScViewFunc::SetTabBgColor( const Color& rColor, SCTAB nTab )
2292*b1cdbd2cSJim Jagielski {
2293*b1cdbd2cSJim Jagielski     bool bSuccess = GetViewData()->GetDocShell()->GetDocFunc().SetTabBgColor( nTab, rColor, sal_True, sal_False );
2294*b1cdbd2cSJim Jagielski     if (bSuccess)
2295*b1cdbd2cSJim Jagielski     {
2296*b1cdbd2cSJim Jagielski         GetViewData()->GetViewShell()->UpdateInputHandler();
2297*b1cdbd2cSJim Jagielski     }
2298*b1cdbd2cSJim Jagielski     return bSuccess;
2299*b1cdbd2cSJim Jagielski }
2300*b1cdbd2cSJim Jagielski 
SetTabBgColor(ScUndoTabColorInfo::List & rUndoSetTabBgColorInfoList)2301*b1cdbd2cSJim Jagielski bool ScViewFunc::SetTabBgColor( ScUndoTabColorInfo::List& rUndoSetTabBgColorInfoList )
2302*b1cdbd2cSJim Jagielski {
2303*b1cdbd2cSJim Jagielski     bool bSuccess = GetViewData()->GetDocShell()->GetDocFunc().SetTabBgColor( rUndoSetTabBgColorInfoList, sal_True, sal_False );
2304*b1cdbd2cSJim Jagielski     if (bSuccess)
2305*b1cdbd2cSJim Jagielski     {
2306*b1cdbd2cSJim Jagielski         GetViewData()->GetViewShell()->UpdateInputHandler();
2307*b1cdbd2cSJim Jagielski     }
2308*b1cdbd2cSJim Jagielski     return bSuccess;
2309*b1cdbd2cSJim Jagielski }
2310*b1cdbd2cSJim Jagielski 
2311*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2312*b1cdbd2cSJim Jagielski 
InsertAreaLink(const String & rFile,const String & rFilter,const String & rOptions,const String & rSource,sal_uLong nRefresh)2313*b1cdbd2cSJim Jagielski void ScViewFunc::InsertAreaLink( const String& rFile,
2314*b1cdbd2cSJim Jagielski 									const String& rFilter, const String& rOptions,
2315*b1cdbd2cSJim Jagielski 									const String& rSource, sal_uLong nRefresh )
2316*b1cdbd2cSJim Jagielski {
2317*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
2318*b1cdbd2cSJim Jagielski 	SCCOL nPosX = GetViewData()->GetCurX();
2319*b1cdbd2cSJim Jagielski 	SCROW nPosY = GetViewData()->GetCurY();
2320*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
2321*b1cdbd2cSJim Jagielski 	ScAddress aPos( nPosX, nPosY, nTab );
2322*b1cdbd2cSJim Jagielski 
2323*b1cdbd2cSJim Jagielski     pDocSh->GetDocFunc().InsertAreaLink( rFile, rFilter, rOptions, rSource, aPos, nRefresh, sal_False, sal_False );
2324*b1cdbd2cSJim Jagielski }
2325*b1cdbd2cSJim Jagielski 
2326*b1cdbd2cSJim Jagielski 
2327*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2328*b1cdbd2cSJim Jagielski 
InsertTableLink(const String & rFile,const String & rFilter,const String & rOptions,const String & rTabName)2329*b1cdbd2cSJim Jagielski void ScViewFunc::InsertTableLink( const String& rFile,
2330*b1cdbd2cSJim Jagielski 									const String& rFilter, const String& rOptions,
2331*b1cdbd2cSJim Jagielski 									const String& rTabName )
2332*b1cdbd2cSJim Jagielski {
2333*b1cdbd2cSJim Jagielski 	String aFilterName = rFilter;
2334*b1cdbd2cSJim Jagielski 	String aOpt = rOptions;
2335*b1cdbd2cSJim Jagielski 	ScDocumentLoader aLoader( rFile, aFilterName, aOpt );
2336*b1cdbd2cSJim Jagielski 	if (!aLoader.IsError())
2337*b1cdbd2cSJim Jagielski 	{
2338*b1cdbd2cSJim Jagielski 		ScDocShell* pSrcSh = aLoader.GetDocShell();
2339*b1cdbd2cSJim Jagielski 		ScDocument* pSrcDoc = pSrcSh->GetDocument();
2340*b1cdbd2cSJim Jagielski 		SCTAB nTab = MAXTAB+1;
2341*b1cdbd2cSJim Jagielski 		if (!rTabName.Len())				// kein Name angegeben -> erste Tabelle
2342*b1cdbd2cSJim Jagielski 			nTab = 0;
2343*b1cdbd2cSJim Jagielski 		else
2344*b1cdbd2cSJim Jagielski 		{
2345*b1cdbd2cSJim Jagielski 			String aTemp;
2346*b1cdbd2cSJim Jagielski 			SCTAB nCount = pSrcDoc->GetTableCount();
2347*b1cdbd2cSJim Jagielski 			for (SCTAB i=0; i<nCount; i++)
2348*b1cdbd2cSJim Jagielski 			{
2349*b1cdbd2cSJim Jagielski 				pSrcDoc->GetName( i, aTemp );
2350*b1cdbd2cSJim Jagielski 				if ( aTemp == rTabName )
2351*b1cdbd2cSJim Jagielski 					nTab = i;
2352*b1cdbd2cSJim Jagielski 			}
2353*b1cdbd2cSJim Jagielski 		}
2354*b1cdbd2cSJim Jagielski 
2355*b1cdbd2cSJim Jagielski 		if ( nTab <= MAXTAB )
2356*b1cdbd2cSJim Jagielski 			ImportTables( pSrcSh, 1, &nTab, sal_True,
2357*b1cdbd2cSJim Jagielski 						GetViewData()->GetTabNo() );
2358*b1cdbd2cSJim Jagielski 	}
2359*b1cdbd2cSJim Jagielski }
2360*b1cdbd2cSJim Jagielski 
2361*b1cdbd2cSJim Jagielski 
2362*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2363*b1cdbd2cSJim Jagielski //	Tabellen aus anderem Dokument kopieren / linken
2364*b1cdbd2cSJim Jagielski 
ImportTables(ScDocShell * pSrcShell,SCTAB nCount,const SCTAB * pSrcTabs,sal_Bool bLink,SCTAB nTab)2365*b1cdbd2cSJim Jagielski void ScViewFunc::ImportTables( ScDocShell* pSrcShell,
2366*b1cdbd2cSJim Jagielski 								SCTAB nCount, const SCTAB* pSrcTabs, sal_Bool bLink,SCTAB nTab )
2367*b1cdbd2cSJim Jagielski {
2368*b1cdbd2cSJim Jagielski 	ScDocument* pSrcDoc = pSrcShell->GetDocument();
2369*b1cdbd2cSJim Jagielski 
2370*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
2371*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pDocSh->GetDocument();
2372*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
2373*b1cdbd2cSJim Jagielski 	//SCTAB nTab = GetViewData()->GetTabNo();
2374*b1cdbd2cSJim Jagielski 
2375*b1cdbd2cSJim Jagielski 	sal_Bool bError = sal_False;
2376*b1cdbd2cSJim Jagielski 	sal_Bool bRefs = sal_False;
2377*b1cdbd2cSJim Jagielski 	sal_Bool bName = sal_False;
2378*b1cdbd2cSJim Jagielski 
2379*b1cdbd2cSJim Jagielski 	if (pSrcDoc->GetDrawLayer())
2380*b1cdbd2cSJim Jagielski 		pDocSh->MakeDrawLayer();
2381*b1cdbd2cSJim Jagielski 
2382*b1cdbd2cSJim Jagielski 	if (bUndo)
2383*b1cdbd2cSJim Jagielski 		pDoc->BeginDrawUndo();			// drawing layer must do its own undo actions
2384*b1cdbd2cSJim Jagielski 
2385*b1cdbd2cSJim Jagielski 	SCTAB nInsCount = 0;
2386*b1cdbd2cSJim Jagielski 	SCTAB i;
2387*b1cdbd2cSJim Jagielski 	for( i=0; i<nCount; i++ )
2388*b1cdbd2cSJim Jagielski 	{	// #63304# insert sheets first and update all references
2389*b1cdbd2cSJim Jagielski 		String aName;
2390*b1cdbd2cSJim Jagielski 		pSrcDoc->GetName( pSrcTabs[i], aName );
2391*b1cdbd2cSJim Jagielski 		pDoc->CreateValidTabName( aName );
2392*b1cdbd2cSJim Jagielski 		if ( !pDoc->InsertTab( nTab+i, aName ) )
2393*b1cdbd2cSJim Jagielski 		{
2394*b1cdbd2cSJim Jagielski 			bError = sal_True;		// total error
2395*b1cdbd2cSJim Jagielski 			break;	// for
2396*b1cdbd2cSJim Jagielski 		}
2397*b1cdbd2cSJim Jagielski 		++nInsCount;
2398*b1cdbd2cSJim Jagielski 	}
2399*b1cdbd2cSJim Jagielski 	for (i=0; i<nCount && !bError; i++)
2400*b1cdbd2cSJim Jagielski 	{
2401*b1cdbd2cSJim Jagielski 		SCTAB nSrcTab = pSrcTabs[i];
2402*b1cdbd2cSJim Jagielski 		SCTAB nDestTab1=nTab+i;
2403*b1cdbd2cSJim Jagielski 		sal_uLong nErrVal = pDoc->TransferTab( pSrcDoc, nSrcTab, nDestTab1,
2404*b1cdbd2cSJim Jagielski 			sal_False );		// no insert
2405*b1cdbd2cSJim Jagielski 
2406*b1cdbd2cSJim Jagielski 		switch (nErrVal)
2407*b1cdbd2cSJim Jagielski 		{
2408*b1cdbd2cSJim Jagielski 			case 0:						// interner Fehler oder voll Fehler
2409*b1cdbd2cSJim Jagielski 				bError = sal_True;
2410*b1cdbd2cSJim Jagielski 				break;
2411*b1cdbd2cSJim Jagielski 			case 2:
2412*b1cdbd2cSJim Jagielski 				bRefs = sal_True;
2413*b1cdbd2cSJim Jagielski 				break;
2414*b1cdbd2cSJim Jagielski 			case 3:
2415*b1cdbd2cSJim Jagielski 				bName = sal_True;
2416*b1cdbd2cSJim Jagielski 				break;
2417*b1cdbd2cSJim Jagielski 			case 4:
2418*b1cdbd2cSJim Jagielski 				bRefs = bName = sal_True;
2419*b1cdbd2cSJim Jagielski 				break;
2420*b1cdbd2cSJim Jagielski 		}
2421*b1cdbd2cSJim Jagielski 
2422*b1cdbd2cSJim Jagielski 		// TransferTab doesn't copy drawing objects with bInsertNew=FALSE
2423*b1cdbd2cSJim Jagielski 		if ( !bError )
2424*b1cdbd2cSJim Jagielski 			pDoc->TransferDrawPage( pSrcDoc, nSrcTab, nDestTab1 );
2425*b1cdbd2cSJim Jagielski 
2426*b1cdbd2cSJim Jagielski 		if(!bError &&pSrcDoc->IsScenario(nSrcTab))
2427*b1cdbd2cSJim Jagielski 		{
2428*b1cdbd2cSJim Jagielski 			String aComment;
2429*b1cdbd2cSJim Jagielski 			Color  aColor;
2430*b1cdbd2cSJim Jagielski 			sal_uInt16 nFlags;
2431*b1cdbd2cSJim Jagielski 
2432*b1cdbd2cSJim Jagielski 			pSrcDoc->GetScenarioData(nSrcTab, aComment,aColor, nFlags);
2433*b1cdbd2cSJim Jagielski 			pDoc->SetScenario( nDestTab1,sal_True);
2434*b1cdbd2cSJim Jagielski 			pDoc->SetScenarioData( nTab+i,aComment,aColor,nFlags);
2435*b1cdbd2cSJim Jagielski 			sal_Bool bActive = pSrcDoc->IsActiveScenario(nSrcTab );
2436*b1cdbd2cSJim Jagielski 			pDoc->SetActiveScenario( nDestTab1, bActive );
2437*b1cdbd2cSJim Jagielski 			sal_Bool bVisible=pSrcDoc->IsVisible(nSrcTab);
2438*b1cdbd2cSJim Jagielski 			pDoc->SetVisible(nDestTab1,bVisible );
2439*b1cdbd2cSJim Jagielski 
2440*b1cdbd2cSJim Jagielski 		}
2441*b1cdbd2cSJim Jagielski 	}
2442*b1cdbd2cSJim Jagielski 
2443*b1cdbd2cSJim Jagielski 	if (bLink)
2444*b1cdbd2cSJim Jagielski 	{
2445*b1cdbd2cSJim Jagielski 		sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
2446*b1cdbd2cSJim Jagielski 
2447*b1cdbd2cSJim Jagielski 		SfxMedium* pMed = pSrcShell->GetMedium();
2448*b1cdbd2cSJim Jagielski 		String aFileName = pMed->GetName();
2449*b1cdbd2cSJim Jagielski 		String aFilterName;
2450*b1cdbd2cSJim Jagielski 		if (pMed->GetFilter())
2451*b1cdbd2cSJim Jagielski 			aFilterName = pMed->GetFilter()->GetFilterName();
2452*b1cdbd2cSJim Jagielski 		String aOptions = ScDocumentLoader::GetOptions(*pMed);
2453*b1cdbd2cSJim Jagielski 
2454*b1cdbd2cSJim Jagielski 		sal_Bool bWasThere = pDoc->HasLink( aFileName, aFilterName, aOptions );
2455*b1cdbd2cSJim Jagielski 
2456*b1cdbd2cSJim Jagielski 		sal_uLong nRefresh = 0;
2457*b1cdbd2cSJim Jagielski 		String aTabStr;
2458*b1cdbd2cSJim Jagielski 		for (i=0; i<nInsCount; i++)
2459*b1cdbd2cSJim Jagielski 		{
2460*b1cdbd2cSJim Jagielski 			pSrcDoc->GetName( pSrcTabs[i], aTabStr );
2461*b1cdbd2cSJim Jagielski 			pDoc->SetLink( nTab+i, SC_LINK_NORMAL,
2462*b1cdbd2cSJim Jagielski 						aFileName, aFilterName, aOptions, aTabStr, nRefresh );
2463*b1cdbd2cSJim Jagielski 		}
2464*b1cdbd2cSJim Jagielski 
2465*b1cdbd2cSJim Jagielski 		if (!bWasThere)			// Link pro Quelldokument nur einmal eintragen
2466*b1cdbd2cSJim Jagielski 		{
2467*b1cdbd2cSJim Jagielski 			ScTableLink* pLink = new ScTableLink( pDocSh, aFileName, aFilterName, aOptions, nRefresh );
2468*b1cdbd2cSJim Jagielski 			pLink->SetInCreate( sal_True );
2469*b1cdbd2cSJim Jagielski 			pLinkManager->InsertFileLink( *pLink, OBJECT_CLIENT_FILE, aFileName, &aFilterName );
2470*b1cdbd2cSJim Jagielski 			pLink->Update();
2471*b1cdbd2cSJim Jagielski 			pLink->SetInCreate( sal_False );
2472*b1cdbd2cSJim Jagielski 
2473*b1cdbd2cSJim Jagielski 			SfxBindings& rBindings = GetViewData()->GetBindings();
2474*b1cdbd2cSJim Jagielski 			rBindings.Invalidate( SID_LINKS );
2475*b1cdbd2cSJim Jagielski 		}
2476*b1cdbd2cSJim Jagielski 	}
2477*b1cdbd2cSJim Jagielski 
2478*b1cdbd2cSJim Jagielski 
2479*b1cdbd2cSJim Jagielski 	if (bUndo)
2480*b1cdbd2cSJim Jagielski 	{
2481*b1cdbd2cSJim Jagielski 		pDocSh->GetUndoManager()->AddUndoAction(
2482*b1cdbd2cSJim Jagielski 				new ScUndoImportTab( pDocSh, nTab, nCount, bLink ) );
2483*b1cdbd2cSJim Jagielski 	}
2484*b1cdbd2cSJim Jagielski 
2485*b1cdbd2cSJim Jagielski 	for (i=0; i<nInsCount; i++)
2486*b1cdbd2cSJim Jagielski 		GetViewData()->InsertTab(nTab);
2487*b1cdbd2cSJim Jagielski 	SetTabNo(nTab,sal_True);
2488*b1cdbd2cSJim Jagielski 	pDocSh->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB,
2489*b1cdbd2cSJim Jagielski 								PAINT_GRID | PAINT_TOP | PAINT_LEFT | PAINT_EXTRAS );
2490*b1cdbd2cSJim Jagielski 
2491*b1cdbd2cSJim Jagielski 	SfxApplication* pSfxApp = SFX_APP();
2492*b1cdbd2cSJim Jagielski 	pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2493*b1cdbd2cSJim Jagielski 	pSfxApp->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) );
2494*b1cdbd2cSJim Jagielski 
2495*b1cdbd2cSJim Jagielski 	pDocSh->PostPaintExtras();
2496*b1cdbd2cSJim Jagielski 	pDocSh->PostPaintGridAll();
2497*b1cdbd2cSJim Jagielski 	pDocSh->SetDocumentModified();
2498*b1cdbd2cSJim Jagielski 
2499*b1cdbd2cSJim Jagielski 	if (bRefs)
2500*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_ABSREFLOST);
2501*b1cdbd2cSJim Jagielski 	if (bName)
2502*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_NAMECONFLICT);
2503*b1cdbd2cSJim Jagielski }
2504*b1cdbd2cSJim Jagielski 
2505*b1cdbd2cSJim Jagielski 
2506*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2507*b1cdbd2cSJim Jagielski //	Tabelle in anderes Dokument verschieben / kopieren
2508*b1cdbd2cSJim Jagielski 
MoveTable(sal_uInt16 nDestDocNo,SCTAB nDestTab,sal_Bool bCopy)2509*b1cdbd2cSJim Jagielski void ScViewFunc::MoveTable( sal_uInt16 nDestDocNo, SCTAB nDestTab, sal_Bool bCopy )
2510*b1cdbd2cSJim Jagielski {
2511*b1cdbd2cSJim Jagielski 	ScDocument* pDoc	   = GetViewData()->GetDocument();
2512*b1cdbd2cSJim Jagielski 	ScDocShell* pDocShell  = GetViewData()->GetDocShell();
2513*b1cdbd2cSJim Jagielski 	ScDocument*	pDestDoc   = NULL;
2514*b1cdbd2cSJim Jagielski 	ScDocShell* pDestShell = NULL;
2515*b1cdbd2cSJim Jagielski 	ScTabViewShell* pDestViewSh = NULL;
2516*b1cdbd2cSJim Jagielski 	sal_Bool bUndo (pDoc->IsUndoEnabled());
2517*b1cdbd2cSJim Jagielski 
2518*b1cdbd2cSJim Jagielski 	sal_Bool bNewDoc = ( nDestDocNo == SC_DOC_NEW );
2519*b1cdbd2cSJim Jagielski 	if ( bNewDoc )
2520*b1cdbd2cSJim Jagielski 	{
2521*b1cdbd2cSJim Jagielski         nDestTab = 0;           // als erstes einfuegen
2522*b1cdbd2cSJim Jagielski 
2523*b1cdbd2cSJim Jagielski 		//	ohne SFX_CALLMODE_RECORD ausfuehren, weil schon im Move-Befehl enthalten:
2524*b1cdbd2cSJim Jagielski 
2525*b1cdbd2cSJim Jagielski 		String aUrl = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("private:factory/"));
2526*b1cdbd2cSJim Jagielski 		aUrl.AppendAscii(RTL_CONSTASCII_STRINGPARAM( STRING_SCAPP ));				// "scalc"
2527*b1cdbd2cSJim Jagielski 		SfxStringItem aItem( SID_FILE_NAME, aUrl );
2528*b1cdbd2cSJim Jagielski 		SfxStringItem aTarget( SID_TARGETNAME, String::CreateFromAscii("_blank") );
2529*b1cdbd2cSJim Jagielski 
2530*b1cdbd2cSJim Jagielski 		const SfxPoolItem* pRetItem = GetViewData()->GetDispatcher().Execute(
2531*b1cdbd2cSJim Jagielski 					SID_OPENDOC, SFX_CALLMODE_API|SFX_CALLMODE_SYNCHRON, &aItem, &aTarget, 0L );
2532*b1cdbd2cSJim Jagielski 		if ( pRetItem )
2533*b1cdbd2cSJim Jagielski 		{
2534*b1cdbd2cSJim Jagielski 			if ( pRetItem->ISA( SfxObjectItem ) )
2535*b1cdbd2cSJim Jagielski 				pDestShell = PTR_CAST( ScDocShell, ((const SfxObjectItem*)pRetItem)->GetShell() );
2536*b1cdbd2cSJim Jagielski 			else if ( pRetItem->ISA( SfxViewFrameItem ) )
2537*b1cdbd2cSJim Jagielski 			{
2538*b1cdbd2cSJim Jagielski 				SfxViewFrame* pFrm = ((const SfxViewFrameItem*)pRetItem)->GetFrame();
2539*b1cdbd2cSJim Jagielski 				if (pFrm)
2540*b1cdbd2cSJim Jagielski 					pDestShell = PTR_CAST( ScDocShell, pFrm->GetObjectShell() );
2541*b1cdbd2cSJim Jagielski 			}
2542*b1cdbd2cSJim Jagielski 			if (pDestShell)
2543*b1cdbd2cSJim Jagielski 				pDestViewSh = pDestShell->GetBestViewShell();
2544*b1cdbd2cSJim Jagielski 		}
2545*b1cdbd2cSJim Jagielski 	}
2546*b1cdbd2cSJim Jagielski 	else
2547*b1cdbd2cSJim Jagielski 		pDestShell = ScDocShell::GetShellByNum( nDestDocNo );
2548*b1cdbd2cSJim Jagielski 
2549*b1cdbd2cSJim Jagielski 	if (!pDestShell)
2550*b1cdbd2cSJim Jagielski 	{
2551*b1cdbd2cSJim Jagielski 		DBG_ERROR("Dest-Doc nicht gefunden !!!");
2552*b1cdbd2cSJim Jagielski 		return;
2553*b1cdbd2cSJim Jagielski 	}
2554*b1cdbd2cSJim Jagielski 
2555*b1cdbd2cSJim Jagielski 	pDestDoc = pDestShell->GetDocument();
2556*b1cdbd2cSJim Jagielski 
2557*b1cdbd2cSJim Jagielski 	SCTAB nTab = GetViewData()->GetTabNo();
2558*b1cdbd2cSJim Jagielski 
2559*b1cdbd2cSJim Jagielski 	if (pDestDoc != pDoc)
2560*b1cdbd2cSJim Jagielski 	{
2561*b1cdbd2cSJim Jagielski 		if (bNewDoc)
2562*b1cdbd2cSJim Jagielski 		{
2563*b1cdbd2cSJim Jagielski 			while (pDestDoc->GetTableCount() > 1)
2564*b1cdbd2cSJim Jagielski 				pDestDoc->DeleteTab(0);
2565*b1cdbd2cSJim Jagielski 			pDestDoc->RenameTab( 0,
2566*b1cdbd2cSJim Jagielski 						String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("______42_____")),
2567*b1cdbd2cSJim Jagielski 						sal_False );
2568*b1cdbd2cSJim Jagielski 		}
2569*b1cdbd2cSJim Jagielski 
2570*b1cdbd2cSJim Jagielski 		ScMarkData& rMark		= GetViewData()->GetMarkData();
2571*b1cdbd2cSJim Jagielski 		SCTAB		nTabCount	= pDoc->GetTableCount();
2572*b1cdbd2cSJim Jagielski 		SCTAB		nTabSelCount = rMark.GetSelectCount();
2573*b1cdbd2cSJim Jagielski 
2574*b1cdbd2cSJim Jagielski 		SvShorts	TheTabs;
2575*b1cdbd2cSJim Jagielski 
2576*b1cdbd2cSJim Jagielski 		for(SCTAB i=0;i<nTabCount;i++)
2577*b1cdbd2cSJim Jagielski 		{
2578*b1cdbd2cSJim Jagielski 			if(rMark.GetTableSelect(i))
2579*b1cdbd2cSJim Jagielski 			{
2580*b1cdbd2cSJim Jagielski 				String aTabName;
2581*b1cdbd2cSJim Jagielski 				pDoc->GetName( i, aTabName);
2582*b1cdbd2cSJim Jagielski 				TheTabs.push_back(i);
2583*b1cdbd2cSJim Jagielski 				for(SCTAB j=i+1;j<nTabCount;j++)
2584*b1cdbd2cSJim Jagielski 				{
2585*b1cdbd2cSJim Jagielski 					if((!pDoc->IsVisible(j))&&(pDoc->IsScenario(j)))
2586*b1cdbd2cSJim Jagielski 					{
2587*b1cdbd2cSJim Jagielski 						pDoc->GetName( j, aTabName);
2588*b1cdbd2cSJim Jagielski 						TheTabs.push_back(j);
2589*b1cdbd2cSJim Jagielski 						i=j;
2590*b1cdbd2cSJim Jagielski 					}
2591*b1cdbd2cSJim Jagielski 					else break;
2592*b1cdbd2cSJim Jagielski 				}
2593*b1cdbd2cSJim Jagielski 			}
2594*b1cdbd2cSJim Jagielski 		}
2595*b1cdbd2cSJim Jagielski 
2596*b1cdbd2cSJim Jagielski 		GetFrameWin()->EnterWait();
2597*b1cdbd2cSJim Jagielski 
2598*b1cdbd2cSJim Jagielski 		if (pDoc->GetDrawLayer())
2599*b1cdbd2cSJim Jagielski 			pDestShell->MakeDrawLayer();
2600*b1cdbd2cSJim Jagielski 
2601*b1cdbd2cSJim Jagielski 		if (!bNewDoc && bUndo)
2602*b1cdbd2cSJim Jagielski 			pDestDoc->BeginDrawUndo();		// drawing layer must do its own undo actions
2603*b1cdbd2cSJim Jagielski 
2604*b1cdbd2cSJim Jagielski 		sal_uLong nErrVal =1;
2605*b1cdbd2cSJim Jagielski 		if(nDestTab==SC_TAB_APPEND)
2606*b1cdbd2cSJim Jagielski             nDestTab=pDestDoc->GetTableCount();
2607*b1cdbd2cSJim Jagielski 		SCTAB nDestTab1=nDestTab;
2608*b1cdbd2cSJim Jagielski 		for( size_t j=0; j<TheTabs.size(); j++, nDestTab1++ )
2609*b1cdbd2cSJim Jagielski 		{	// #63304# insert sheets first and update all references
2610*b1cdbd2cSJim Jagielski 			String aName;
2611*b1cdbd2cSJim Jagielski 			pDoc->GetName( TheTabs[j], aName );
2612*b1cdbd2cSJim Jagielski 			pDestDoc->CreateValidTabName( aName );
2613*b1cdbd2cSJim Jagielski 			if ( !pDestDoc->InsertTab( nDestTab1, aName ) )
2614*b1cdbd2cSJim Jagielski 			{
2615*b1cdbd2cSJim Jagielski 				nErrVal = 0;		// total error
2616*b1cdbd2cSJim Jagielski 				break;	// for
2617*b1cdbd2cSJim Jagielski 			}
2618*b1cdbd2cSJim Jagielski 		}
2619*b1cdbd2cSJim Jagielski 		if ( nErrVal > 0 )
2620*b1cdbd2cSJim Jagielski 		{
2621*b1cdbd2cSJim Jagielski 			nDestTab1 = nDestTab;
2622*b1cdbd2cSJim Jagielski 			for(size_t i=0;i<TheTabs.size();i++)
2623*b1cdbd2cSJim Jagielski 			{
2624*b1cdbd2cSJim Jagielski 				nErrVal = pDestDoc->TransferTab( pDoc, TheTabs[i], nDestTab1,
2625*b1cdbd2cSJim Jagielski 					sal_False );		// no insert
2626*b1cdbd2cSJim Jagielski 
2627*b1cdbd2cSJim Jagielski 				// TransferTab doesn't copy drawing objects with bInsertNew=FALSE
2628*b1cdbd2cSJim Jagielski 				if ( nErrVal > 0 )
2629*b1cdbd2cSJim Jagielski 					pDestDoc->TransferDrawPage( pDoc, TheTabs[i], nDestTab1 );
2630*b1cdbd2cSJim Jagielski 
2631*b1cdbd2cSJim Jagielski 				if(nErrVal>0 && pDoc->IsScenario(TheTabs[i]))
2632*b1cdbd2cSJim Jagielski 				{
2633*b1cdbd2cSJim Jagielski 					String aComment;
2634*b1cdbd2cSJim Jagielski 					Color  aColor;
2635*b1cdbd2cSJim Jagielski 					sal_uInt16 nFlags;
2636*b1cdbd2cSJim Jagielski 
2637*b1cdbd2cSJim Jagielski 					pDoc->GetScenarioData(TheTabs[i], aComment,aColor, nFlags);
2638*b1cdbd2cSJim Jagielski 					pDestDoc->SetScenario(nDestTab1,sal_True);
2639*b1cdbd2cSJim Jagielski 					pDestDoc->SetScenarioData(nDestTab1,aComment,aColor,nFlags);
2640*b1cdbd2cSJim Jagielski 					sal_Bool bActive = pDoc->IsActiveScenario(TheTabs[i]);
2641*b1cdbd2cSJim Jagielski 					pDestDoc->SetActiveScenario(nDestTab1, bActive );
2642*b1cdbd2cSJim Jagielski 
2643*b1cdbd2cSJim Jagielski 					sal_Bool bVisible=pDoc->IsVisible(TheTabs[i]);
2644*b1cdbd2cSJim Jagielski 					pDestDoc->SetVisible(nDestTab1,bVisible );
2645*b1cdbd2cSJim Jagielski 
2646*b1cdbd2cSJim Jagielski 				}
2647*b1cdbd2cSJim Jagielski 
2648*b1cdbd2cSJim Jagielski 				if ( nErrVal > 0 && pDoc->IsTabProtected( TheTabs[i] ) )
2649*b1cdbd2cSJim Jagielski                     pDestDoc->SetTabProtection(nDestTab1, pDoc->GetTabProtection(TheTabs[i]));
2650*b1cdbd2cSJim Jagielski 
2651*b1cdbd2cSJim Jagielski 				nDestTab1++;
2652*b1cdbd2cSJim Jagielski 			}
2653*b1cdbd2cSJim Jagielski 		}
2654*b1cdbd2cSJim Jagielski 		String sName;
2655*b1cdbd2cSJim Jagielski 		if (!bNewDoc && bUndo)
2656*b1cdbd2cSJim Jagielski 		{
2657*b1cdbd2cSJim Jagielski 			pDestDoc->GetName(nDestTab, sName);
2658*b1cdbd2cSJim Jagielski 			pDestShell->GetUndoManager()->AddUndoAction(
2659*b1cdbd2cSJim Jagielski                             new ScUndoImportTab( pDestShell, nDestTab,
2660*b1cdbd2cSJim Jagielski                                 static_cast<SCTAB>(TheTabs.size()), sal_False));
2661*b1cdbd2cSJim Jagielski 
2662*b1cdbd2cSJim Jagielski 		}
2663*b1cdbd2cSJim Jagielski 		else
2664*b1cdbd2cSJim Jagielski 		{
2665*b1cdbd2cSJim Jagielski 			pDestShell->GetUndoManager()->Clear();
2666*b1cdbd2cSJim Jagielski 		}
2667*b1cdbd2cSJim Jagielski 
2668*b1cdbd2cSJim Jagielski 		GetFrameWin()->LeaveWait();
2669*b1cdbd2cSJim Jagielski 		switch (nErrVal)
2670*b1cdbd2cSJim Jagielski 		{
2671*b1cdbd2cSJim Jagielski 			case 0:						// interner Fehler oder voll Fehler
2672*b1cdbd2cSJim Jagielski 			{
2673*b1cdbd2cSJim Jagielski 				ErrorMessage(STR_TABINSERT_ERROR);
2674*b1cdbd2cSJim Jagielski 				return;
2675*b1cdbd2cSJim Jagielski 			}
2676*b1cdbd2cSJim Jagielski             //break;
2677*b1cdbd2cSJim Jagielski 			case 2:
2678*b1cdbd2cSJim Jagielski 				ErrorMessage(STR_ABSREFLOST);
2679*b1cdbd2cSJim Jagielski 			break;
2680*b1cdbd2cSJim Jagielski 			case 3:
2681*b1cdbd2cSJim Jagielski 				ErrorMessage(STR_NAMECONFLICT);
2682*b1cdbd2cSJim Jagielski 			break;
2683*b1cdbd2cSJim Jagielski 			case 4:
2684*b1cdbd2cSJim Jagielski 			{
2685*b1cdbd2cSJim Jagielski 				ErrorMessage(STR_ABSREFLOST);
2686*b1cdbd2cSJim Jagielski 				ErrorMessage(STR_NAMECONFLICT);
2687*b1cdbd2cSJim Jagielski 			}
2688*b1cdbd2cSJim Jagielski 			break;
2689*b1cdbd2cSJim Jagielski 			default:
2690*b1cdbd2cSJim Jagielski 			break;
2691*b1cdbd2cSJim Jagielski 		}
2692*b1cdbd2cSJim Jagielski 		//pDestShell->GetUndoManager()->Clear();		//! Undo implementieren !!!
2693*b1cdbd2cSJim Jagielski /*
2694*b1cdbd2cSJim Jagielski 		String sName;
2695*b1cdbd2cSJim Jagielski 		pDestDoc->GetName(nDestTab, sName);
2696*b1cdbd2cSJim Jagielski 		pDestShell->GetUndoManager()->AddUndoAction(
2697*b1cdbd2cSJim Jagielski 						new ScUndoInsertTab( pDestShell, nDestTab, sal_True, sName ) );
2698*b1cdbd2cSJim Jagielski */
2699*b1cdbd2cSJim Jagielski 		if (!bCopy)
2700*b1cdbd2cSJim Jagielski 		{
2701*b1cdbd2cSJim Jagielski 			if(nTabCount!=nTabSelCount)
2702*b1cdbd2cSJim Jagielski 				DeleteTables(TheTabs);// incl. Paint & Undo
2703*b1cdbd2cSJim Jagielski 			else
2704*b1cdbd2cSJim Jagielski 				ErrorMessage(STR_TABREMOVE_ERROR);
2705*b1cdbd2cSJim Jagielski 		}
2706*b1cdbd2cSJim Jagielski 
2707*b1cdbd2cSJim Jagielski 		if (bNewDoc)
2708*b1cdbd2cSJim Jagielski 		{
2709*b1cdbd2cSJim Jagielski 			//	ChartListenerCollection must be updated before DeleteTab
2710*b1cdbd2cSJim Jagielski 			if ( pDestDoc->IsChartListenerCollectionNeedsUpdate() )
2711*b1cdbd2cSJim Jagielski 				pDestDoc->UpdateChartListenerCollection();
2712*b1cdbd2cSJim Jagielski 
2713*b1cdbd2cSJim Jagielski 			pDestDoc->DeleteTab(static_cast<SCTAB>(TheTabs.size()));   // first old table
2714*b1cdbd2cSJim Jagielski //?			pDestDoc->SelectTable(0, sal_True);		// neue erste Tabelle selektieren
2715*b1cdbd2cSJim Jagielski 			if (pDestViewSh)
2716*b1cdbd2cSJim Jagielski 				pDestViewSh->TabChanged();		// Pages auf dem Drawing-Layer
2717*b1cdbd2cSJim Jagielski 			pDestShell->PostPaint( 0,0,0, MAXCOL,MAXROW,MAXTAB,
2718*b1cdbd2cSJim Jagielski 									PAINT_GRID | PAINT_TOP | PAINT_LEFT |
2719*b1cdbd2cSJim Jagielski 									PAINT_EXTRAS | PAINT_SIZE );
2720*b1cdbd2cSJim Jagielski 			//	PAINT_SIZE fuer Gliederung
2721*b1cdbd2cSJim Jagielski 		}
2722*b1cdbd2cSJim Jagielski 		else
2723*b1cdbd2cSJim Jagielski 		{
2724*b1cdbd2cSJim Jagielski 			pDestShell->Broadcast( ScTablesHint( SC_TAB_INSERTED, nDestTab ) );
2725*b1cdbd2cSJim Jagielski 			pDestShell->PostPaintExtras();
2726*b1cdbd2cSJim Jagielski 			pDestShell->PostPaintGridAll();
2727*b1cdbd2cSJim Jagielski 		}
2728*b1cdbd2cSJim Jagielski 
2729*b1cdbd2cSJim Jagielski 		TheTabs.clear();
2730*b1cdbd2cSJim Jagielski 
2731*b1cdbd2cSJim Jagielski 		pDestShell->SetDocumentModified();
2732*b1cdbd2cSJim Jagielski 		SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2733*b1cdbd2cSJim Jagielski 	}
2734*b1cdbd2cSJim Jagielski 	else					// within the documents
2735*b1cdbd2cSJim Jagielski 	{
2736*b1cdbd2cSJim Jagielski 
2737*b1cdbd2cSJim Jagielski 		ScMarkData& rMark		= GetViewData()->GetMarkData();
2738*b1cdbd2cSJim Jagielski 		SCTAB		nTabCount	= pDoc->GetTableCount();
2739*b1cdbd2cSJim Jagielski 
2740*b1cdbd2cSJim Jagielski 		SvShorts	TheTabs;
2741*b1cdbd2cSJim Jagielski 		SvShorts	TheDestTabs;
2742*b1cdbd2cSJim Jagielski 		SvStrings	TheTabNames;
2743*b1cdbd2cSJim Jagielski 		String		aDestName;
2744*b1cdbd2cSJim Jagielski 		String		*pString;
2745*b1cdbd2cSJim Jagielski 
2746*b1cdbd2cSJim Jagielski 		for(SCTAB i=0;i<nTabCount;i++)
2747*b1cdbd2cSJim Jagielski 		{
2748*b1cdbd2cSJim Jagielski 			if(rMark.GetTableSelect(i))
2749*b1cdbd2cSJim Jagielski 			{
2750*b1cdbd2cSJim Jagielski 				String aTabName;
2751*b1cdbd2cSJim Jagielski 				pDoc->GetName( i, aTabName);
2752*b1cdbd2cSJim Jagielski 				TheTabNames.Insert(new String(aTabName),TheTabNames.Count());
2753*b1cdbd2cSJim Jagielski 
2754*b1cdbd2cSJim Jagielski 				for(SCTAB j=i+1;j<nTabCount;j++)
2755*b1cdbd2cSJim Jagielski 				{
2756*b1cdbd2cSJim Jagielski 					if((!pDoc->IsVisible(j))&&(pDoc->IsScenario(j)))
2757*b1cdbd2cSJim Jagielski 					{
2758*b1cdbd2cSJim Jagielski 						pDoc->GetName( j, aTabName);
2759*b1cdbd2cSJim Jagielski 						TheTabNames.Insert(new String(aTabName),TheTabNames.Count());
2760*b1cdbd2cSJim Jagielski 						i=j;
2761*b1cdbd2cSJim Jagielski 					}
2762*b1cdbd2cSJim Jagielski 					else break;
2763*b1cdbd2cSJim Jagielski 				}
2764*b1cdbd2cSJim Jagielski 
2765*b1cdbd2cSJim Jagielski 			}
2766*b1cdbd2cSJim Jagielski 		}
2767*b1cdbd2cSJim Jagielski 
2768*b1cdbd2cSJim Jagielski 		if (bCopy && bUndo)
2769*b1cdbd2cSJim Jagielski 			pDoc->BeginDrawUndo();			// drawing layer must do its own undo actions
2770*b1cdbd2cSJim Jagielski 
2771*b1cdbd2cSJim Jagielski 		pDoc->GetName( nDestTab, aDestName);
2772*b1cdbd2cSJim Jagielski 		SCTAB nDestTab1=nDestTab;
2773*b1cdbd2cSJim Jagielski 		SCTAB nMovTab=0;
2774*b1cdbd2cSJim Jagielski 		for(int j=0;j<TheTabNames.Count();j++)
2775*b1cdbd2cSJim Jagielski 		{
2776*b1cdbd2cSJim Jagielski 			nTabCount	= pDoc->GetTableCount();
2777*b1cdbd2cSJim Jagielski             pString=TheTabNames[sal::static_int_cast<sal_uInt16>(j)];
2778*b1cdbd2cSJim Jagielski 			if(!pDoc->GetTable(*pString,nMovTab))
2779*b1cdbd2cSJim Jagielski 			{
2780*b1cdbd2cSJim Jagielski 				nMovTab=nTabCount;
2781*b1cdbd2cSJim Jagielski 			}
2782*b1cdbd2cSJim Jagielski 			if(!pDoc->GetTable(aDestName,nDestTab1))
2783*b1cdbd2cSJim Jagielski 			{
2784*b1cdbd2cSJim Jagielski 				nDestTab1=nTabCount;
2785*b1cdbd2cSJim Jagielski 			}
2786*b1cdbd2cSJim Jagielski 			pDocShell->MoveTable( nMovTab, nDestTab1, bCopy, sal_False );	// Undo ist hier
2787*b1cdbd2cSJim Jagielski 
2788*b1cdbd2cSJim Jagielski 			if(bCopy && pDoc->IsScenario(nMovTab))
2789*b1cdbd2cSJim Jagielski 			{
2790*b1cdbd2cSJim Jagielski 				String aComment;
2791*b1cdbd2cSJim Jagielski 				Color  aColor;
2792*b1cdbd2cSJim Jagielski 				sal_uInt16 nFlags;
2793*b1cdbd2cSJim Jagielski 
2794*b1cdbd2cSJim Jagielski 				pDoc->GetScenarioData(nMovTab, aComment,aColor, nFlags);
2795*b1cdbd2cSJim Jagielski 				pDoc->SetScenario(nDestTab1,sal_True);
2796*b1cdbd2cSJim Jagielski 				pDoc->SetScenarioData(nDestTab1,aComment,aColor,nFlags);
2797*b1cdbd2cSJim Jagielski 				sal_Bool bActive = pDoc->IsActiveScenario(nMovTab );
2798*b1cdbd2cSJim Jagielski 				pDoc->SetActiveScenario( nDestTab1, bActive );
2799*b1cdbd2cSJim Jagielski 				sal_Bool bVisible=pDoc->IsVisible(nMovTab);
2800*b1cdbd2cSJim Jagielski 				pDoc->SetVisible(nDestTab1,bVisible );
2801*b1cdbd2cSJim Jagielski 			}
2802*b1cdbd2cSJim Jagielski 
2803*b1cdbd2cSJim Jagielski 			TheTabs.push_back(nMovTab);
2804*b1cdbd2cSJim Jagielski 
2805*b1cdbd2cSJim Jagielski 			if(!bCopy)
2806*b1cdbd2cSJim Jagielski 			{
2807*b1cdbd2cSJim Jagielski 				if(!pDoc->GetTable(*pString,nDestTab1))
2808*b1cdbd2cSJim Jagielski 				{
2809*b1cdbd2cSJim Jagielski 					nDestTab1=nTabCount;
2810*b1cdbd2cSJim Jagielski 				}
2811*b1cdbd2cSJim Jagielski 			}
2812*b1cdbd2cSJim Jagielski 
2813*b1cdbd2cSJim Jagielski 			TheDestTabs.push_back(nDestTab1);
2814*b1cdbd2cSJim Jagielski 			delete pString;
2815*b1cdbd2cSJim Jagielski 		}
2816*b1cdbd2cSJim Jagielski 
2817*b1cdbd2cSJim Jagielski 		nTab = GetViewData()->GetTabNo();
2818*b1cdbd2cSJim Jagielski 
2819*b1cdbd2cSJim Jagielski 		if (bUndo)
2820*b1cdbd2cSJim Jagielski 		{
2821*b1cdbd2cSJim Jagielski 			if (bCopy)
2822*b1cdbd2cSJim Jagielski 			{
2823*b1cdbd2cSJim Jagielski 				pDocShell->GetUndoManager()->AddUndoAction(
2824*b1cdbd2cSJim Jagielski 						new ScUndoCopyTab( pDocShell, TheTabs, TheDestTabs));
2825*b1cdbd2cSJim Jagielski 			}
2826*b1cdbd2cSJim Jagielski 			else
2827*b1cdbd2cSJim Jagielski 			{
2828*b1cdbd2cSJim Jagielski 				pDocShell->GetUndoManager()->AddUndoAction(
2829*b1cdbd2cSJim Jagielski 						new ScUndoMoveTab( pDocShell, TheTabs, TheDestTabs));
2830*b1cdbd2cSJim Jagielski 			}
2831*b1cdbd2cSJim Jagielski 		}
2832*b1cdbd2cSJim Jagielski 
2833*b1cdbd2cSJim Jagielski 		SCTAB nNewTab = nDestTab;
2834*b1cdbd2cSJim Jagielski 		if (nNewTab == SC_TAB_APPEND)
2835*b1cdbd2cSJim Jagielski 			nNewTab = pDoc->GetTableCount()-1;
2836*b1cdbd2cSJim Jagielski 		else if (!bCopy && nTab<nDestTab)
2837*b1cdbd2cSJim Jagielski 			nNewTab--;
2838*b1cdbd2cSJim Jagielski 
2839*b1cdbd2cSJim Jagielski 		SetTabNo( nNewTab, sal_True );
2840*b1cdbd2cSJim Jagielski 
2841*b1cdbd2cSJim Jagielski         //#i29848# adjust references to data on the copied sheet
2842*b1cdbd2cSJim Jagielski         if( bCopy )
2843*b1cdbd2cSJim Jagielski             ScChartHelper::AdjustRangesOfChartsOnDestinationPage( pDoc, pDestDoc, nTab, nNewTab );
2844*b1cdbd2cSJim Jagielski 	}
2845*b1cdbd2cSJim Jagielski }
2846*b1cdbd2cSJim Jagielski 
2847*b1cdbd2cSJim Jagielski 
2848*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2849*b1cdbd2cSJim Jagielski 
ShowTable(const String & rName)2850*b1cdbd2cSJim Jagielski void ScViewFunc::ShowTable( const String& rName )
2851*b1cdbd2cSJim Jagielski {
2852*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
2853*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pDocSh->GetDocument();
2854*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
2855*b1cdbd2cSJim Jagielski 	sal_Bool bFound = sal_False;
2856*b1cdbd2cSJim Jagielski 	SCTAB nPos = 0;
2857*b1cdbd2cSJim Jagielski 	String aTabName;
2858*b1cdbd2cSJim Jagielski 	SCTAB nCount = pDoc->GetTableCount();
2859*b1cdbd2cSJim Jagielski 	for (SCTAB i=0; i<nCount; i++)
2860*b1cdbd2cSJim Jagielski 	{
2861*b1cdbd2cSJim Jagielski 		pDoc->GetName( i, aTabName );
2862*b1cdbd2cSJim Jagielski 		if ( aTabName == rName )
2863*b1cdbd2cSJim Jagielski 		{
2864*b1cdbd2cSJim Jagielski 			nPos = i;
2865*b1cdbd2cSJim Jagielski 			bFound = sal_True;
2866*b1cdbd2cSJim Jagielski 		}
2867*b1cdbd2cSJim Jagielski 	}
2868*b1cdbd2cSJim Jagielski 
2869*b1cdbd2cSJim Jagielski 	if (bFound)
2870*b1cdbd2cSJim Jagielski 	{
2871*b1cdbd2cSJim Jagielski 		pDoc->SetVisible( nPos, sal_True );
2872*b1cdbd2cSJim Jagielski 		if (bUndo)
2873*b1cdbd2cSJim Jagielski 		{
2874*b1cdbd2cSJim Jagielski 			pDocSh->GetUndoManager()->AddUndoAction( new ScUndoShowHideTab( pDocSh, nPos, sal_True ) );
2875*b1cdbd2cSJim Jagielski 		}
2876*b1cdbd2cSJim Jagielski 		SetTabNo( nPos, sal_True );
2877*b1cdbd2cSJim Jagielski 		SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2878*b1cdbd2cSJim Jagielski 		pDocSh->PostPaint(0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_EXTRAS);
2879*b1cdbd2cSJim Jagielski 		pDocSh->SetDocumentModified();
2880*b1cdbd2cSJim Jagielski 	}
2881*b1cdbd2cSJim Jagielski 	else
2882*b1cdbd2cSJim Jagielski 		Sound::Beep();
2883*b1cdbd2cSJim Jagielski }
2884*b1cdbd2cSJim Jagielski 
2885*b1cdbd2cSJim Jagielski 
2886*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2887*b1cdbd2cSJim Jagielski 
HideTable(SCTAB nTab)2888*b1cdbd2cSJim Jagielski void ScViewFunc::HideTable( SCTAB nTab )
2889*b1cdbd2cSJim Jagielski {
2890*b1cdbd2cSJim Jagielski 	ScDocShell* pDocSh = GetViewData()->GetDocShell();
2891*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = pDocSh->GetDocument();
2892*b1cdbd2cSJim Jagielski 	sal_Bool bUndo(pDoc->IsUndoEnabled());
2893*b1cdbd2cSJim Jagielski 	SCTAB nVisible = 0;
2894*b1cdbd2cSJim Jagielski 	SCTAB nCount = pDoc->GetTableCount();
2895*b1cdbd2cSJim Jagielski 	for (SCTAB i=0; i<nCount; i++)
2896*b1cdbd2cSJim Jagielski 	{
2897*b1cdbd2cSJim Jagielski 		if (pDoc->IsVisible(i))
2898*b1cdbd2cSJim Jagielski 			++nVisible;
2899*b1cdbd2cSJim Jagielski 	}
2900*b1cdbd2cSJim Jagielski 
2901*b1cdbd2cSJim Jagielski 	if (nVisible > 1)
2902*b1cdbd2cSJim Jagielski 	{
2903*b1cdbd2cSJim Jagielski 		pDoc->SetVisible( nTab, sal_False );
2904*b1cdbd2cSJim Jagielski 		if (bUndo)
2905*b1cdbd2cSJim Jagielski 		{
2906*b1cdbd2cSJim Jagielski 			pDocSh->GetUndoManager()->AddUndoAction( new ScUndoShowHideTab( pDocSh, nTab, sal_False ) );
2907*b1cdbd2cSJim Jagielski 		}
2908*b1cdbd2cSJim Jagielski 
2909*b1cdbd2cSJim Jagielski 		//	Views updaten:
2910*b1cdbd2cSJim Jagielski 		pDocSh->Broadcast( ScTablesHint( SC_TAB_HIDDEN, nTab ) );
2911*b1cdbd2cSJim Jagielski 
2912*b1cdbd2cSJim Jagielski 		SetTabNo( nTab, sal_True );
2913*b1cdbd2cSJim Jagielski 		SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_TABLES_CHANGED ) );
2914*b1cdbd2cSJim Jagielski 		pDocSh->PostPaint(0,0,0,MAXCOL,MAXROW,MAXTAB, PAINT_EXTRAS);
2915*b1cdbd2cSJim Jagielski 		pDocSh->SetDocumentModified();
2916*b1cdbd2cSJim Jagielski 	}
2917*b1cdbd2cSJim Jagielski 	else
2918*b1cdbd2cSJim Jagielski 		Sound::Beep();
2919*b1cdbd2cSJim Jagielski }
2920*b1cdbd2cSJim Jagielski 
2921*b1cdbd2cSJim Jagielski 
2922*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2923*b1cdbd2cSJim Jagielski 
InsertSpecialChar(const String & rStr,const Font & rFont)2924*b1cdbd2cSJim Jagielski void ScViewFunc::InsertSpecialChar( const String& rStr, const Font& rFont )
2925*b1cdbd2cSJim Jagielski {
2926*b1cdbd2cSJim Jagielski 	ScEditableTester aTester( this );
2927*b1cdbd2cSJim Jagielski 	if (!aTester.IsEditable())
2928*b1cdbd2cSJim Jagielski 	{
2929*b1cdbd2cSJim Jagielski 		ErrorMessage(aTester.GetMessageId());
2930*b1cdbd2cSJim Jagielski 		return;
2931*b1cdbd2cSJim Jagielski 	}
2932*b1cdbd2cSJim Jagielski 
2933*b1cdbd2cSJim Jagielski 	const sal_Unicode* pChar	= rStr.GetBuffer();
2934*b1cdbd2cSJim Jagielski 	ScTabViewShell* pViewShell	= GetViewData()->GetViewShell();
2935*b1cdbd2cSJim Jagielski 	SvxFontItem		aFontItem( rFont.GetFamily(),
2936*b1cdbd2cSJim Jagielski 							   rFont.GetName(),
2937*b1cdbd2cSJim Jagielski 							   rFont.GetStyleName(),
2938*b1cdbd2cSJim Jagielski 							   rFont.GetPitch(),
2939*b1cdbd2cSJim Jagielski 							   rFont.GetCharSet(),
2940*b1cdbd2cSJim Jagielski 							   ATTR_FONT );
2941*b1cdbd2cSJim Jagielski 
2942*b1cdbd2cSJim Jagielski 	//	if string contains WEAK characters, set all fonts
2943*b1cdbd2cSJim Jagielski 	sal_uInt8 nScript;
2944*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = GetViewData()->GetDocument();
2945*b1cdbd2cSJim Jagielski 	if ( pDoc->HasStringWeakCharacters( rStr ) )
2946*b1cdbd2cSJim Jagielski 		nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
2947*b1cdbd2cSJim Jagielski 	else
2948*b1cdbd2cSJim Jagielski 		nScript = pDoc->GetStringScriptType( rStr );
2949*b1cdbd2cSJim Jagielski 
2950*b1cdbd2cSJim Jagielski 	SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, pViewShell->GetPool() );
2951*b1cdbd2cSJim Jagielski 	aSetItem.PutItemForScriptType( nScript, aFontItem );
2952*b1cdbd2cSJim Jagielski 	ApplyUserItemSet( aSetItem.GetItemSet() );
2953*b1cdbd2cSJim Jagielski 
2954*b1cdbd2cSJim Jagielski 	while ( *pChar )
2955*b1cdbd2cSJim Jagielski 		pViewShell->TabKeyInput( KeyEvent( *(pChar++), KeyCode() ) );
2956*b1cdbd2cSJim Jagielski }
2957*b1cdbd2cSJim Jagielski 
2958*b1cdbd2cSJim Jagielski 
2959*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
2960*b1cdbd2cSJim Jagielski 
UpdateLineAttrs(SvxBorderLine & rLine,const SvxBorderLine * pDestLine,const SvxBorderLine * pSrcLine,sal_Bool bColor)2961*b1cdbd2cSJim Jagielski void ScViewFunc::UpdateLineAttrs( SvxBorderLine&	   rLine,
2962*b1cdbd2cSJim Jagielski 								  const SvxBorderLine* pDestLine,
2963*b1cdbd2cSJim Jagielski 								  const SvxBorderLine* pSrcLine,
2964*b1cdbd2cSJim Jagielski 								  sal_Bool 				   bColor )
2965*b1cdbd2cSJim Jagielski {
2966*b1cdbd2cSJim Jagielski 	if ( pSrcLine && pDestLine )
2967*b1cdbd2cSJim Jagielski 	{
2968*b1cdbd2cSJim Jagielski 		if ( bColor )
2969*b1cdbd2cSJim Jagielski 		{
2970*b1cdbd2cSJim Jagielski 			rLine.SetColor		( pSrcLine->GetColor() );
2971*b1cdbd2cSJim Jagielski 			rLine.SetOutWidth	( pDestLine->GetOutWidth() );
2972*b1cdbd2cSJim Jagielski 			rLine.SetInWidth	( pDestLine->GetInWidth() );
2973*b1cdbd2cSJim Jagielski 			rLine.SetDistance	( pDestLine->GetDistance() );
2974*b1cdbd2cSJim Jagielski 		}
2975*b1cdbd2cSJim Jagielski 		else
2976*b1cdbd2cSJim Jagielski 		{
2977*b1cdbd2cSJim Jagielski 			rLine.SetColor		( pDestLine->GetColor() );
2978*b1cdbd2cSJim Jagielski 			rLine.SetOutWidth	( pSrcLine->GetOutWidth() );
2979*b1cdbd2cSJim Jagielski 			rLine.SetInWidth	( pSrcLine->GetInWidth() );
2980*b1cdbd2cSJim Jagielski 			rLine.SetDistance	( pSrcLine->GetDistance() );
2981*b1cdbd2cSJim Jagielski 		}
2982*b1cdbd2cSJim Jagielski 	}
2983*b1cdbd2cSJim Jagielski }
2984*b1cdbd2cSJim Jagielski 
2985*b1cdbd2cSJim Jagielski 
2986*b1cdbd2cSJim Jagielski #define SET_LINE_ATTRIBUTES(LINE,BOXLINE) \
2987*b1cdbd2cSJim Jagielski 	pBoxLine = aBoxItem.Get##LINE();								\
2988*b1cdbd2cSJim Jagielski 	if ( pBoxLine )													\
2989*b1cdbd2cSJim Jagielski 	{																\
2990*b1cdbd2cSJim Jagielski 		if ( pLine )												\
2991*b1cdbd2cSJim Jagielski 		{															\
2992*b1cdbd2cSJim Jagielski 			UpdateLineAttrs( aLine, pBoxLine, pLine, bColorOnly );	\
2993*b1cdbd2cSJim Jagielski 			aBoxItem.SetLine( &aLine, BOXLINE );					\
2994*b1cdbd2cSJim Jagielski 		}															\
2995*b1cdbd2cSJim Jagielski 		else														\
2996*b1cdbd2cSJim Jagielski 			aBoxItem.SetLine( NULL, BOXLINE );						\
2997*b1cdbd2cSJim Jagielski 	}
2998*b1cdbd2cSJim Jagielski 
2999*b1cdbd2cSJim Jagielski 
3000*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
3001*b1cdbd2cSJim Jagielski 
SetSelectionFrameLines(const SvxBorderLine * pLine,sal_Bool bColorOnly)3002*b1cdbd2cSJim Jagielski void ScViewFunc::SetSelectionFrameLines( const SvxBorderLine* pLine,
3003*b1cdbd2cSJim Jagielski 										 sal_Bool bColorOnly )
3004*b1cdbd2cSJim Jagielski {
3005*b1cdbd2cSJim Jagielski 	// nur wegen Matrix nicht editierbar? Attribute trotzdem ok
3006*b1cdbd2cSJim Jagielski 	sal_Bool bOnlyNotBecauseOfMatrix;
3007*b1cdbd2cSJim Jagielski 	if ( !SelectionEditable( &bOnlyNotBecauseOfMatrix ) && !bOnlyNotBecauseOfMatrix )
3008*b1cdbd2cSJim Jagielski 	{
3009*b1cdbd2cSJim Jagielski 		ErrorMessage(STR_PROTECTIONERR);
3010*b1cdbd2cSJim Jagielski 		return;
3011*b1cdbd2cSJim Jagielski 	}
3012*b1cdbd2cSJim Jagielski 
3013*b1cdbd2cSJim Jagielski 	ScDocument*				pDoc = GetViewData()->GetDocument();
3014*b1cdbd2cSJim Jagielski     ScMarkData aFuncMark( GetViewData()->GetMarkData() );       // local copy for UnmarkFiltered
3015*b1cdbd2cSJim Jagielski     ScViewUtil::UnmarkFiltered( aFuncMark, pDoc );
3016*b1cdbd2cSJim Jagielski 	ScDocShell*				pDocSh = GetViewData()->GetDocShell();
3017*b1cdbd2cSJim Jagielski 	const ScPatternAttr*	pSelAttrs = GetSelectionPattern();
3018*b1cdbd2cSJim Jagielski     const SfxItemSet&       rSelItemSet = pSelAttrs->GetItemSet();
3019*b1cdbd2cSJim Jagielski 
3020*b1cdbd2cSJim Jagielski 	const SfxPoolItem*		pBorderAttr	= NULL;
3021*b1cdbd2cSJim Jagielski     SfxItemState            eItemState = rSelItemSet.GetItemState( ATTR_BORDER, sal_True, &pBorderAttr );
3022*b1cdbd2cSJim Jagielski 
3023*b1cdbd2cSJim Jagielski     const SfxPoolItem*      pTLBRItem = 0;
3024*b1cdbd2cSJim Jagielski     SfxItemState            eTLBRState = rSelItemSet.GetItemState( ATTR_BORDER_TLBR, sal_True, &pTLBRItem );
3025*b1cdbd2cSJim Jagielski 
3026*b1cdbd2cSJim Jagielski     const SfxPoolItem*      pBLTRItem = 0;
3027*b1cdbd2cSJim Jagielski     SfxItemState            eBLTRState = rSelItemSet.GetItemState( ATTR_BORDER_BLTR, sal_True, &pBLTRItem );
3028*b1cdbd2cSJim Jagielski 
3029*b1cdbd2cSJim Jagielski     // any of the lines visible?
3030*b1cdbd2cSJim Jagielski     if( (eItemState != SFX_ITEM_DEFAULT) || (eTLBRState != SFX_ITEM_DEFAULT) || (eBLTRState != SFX_ITEM_DEFAULT) )
3031*b1cdbd2cSJim Jagielski 	{
3032*b1cdbd2cSJim Jagielski         // none of the lines don't care?
3033*b1cdbd2cSJim Jagielski         if( (eItemState != SFX_ITEM_DONTCARE) && (eTLBRState != SFX_ITEM_DONTCARE) && (eBLTRState != SFX_ITEM_DONTCARE) )
3034*b1cdbd2cSJim Jagielski 		{
3035*b1cdbd2cSJim Jagielski 			SfxItemSet*		pOldSet	= new SfxItemSet(
3036*b1cdbd2cSJim Jagielski 											*(pDoc->GetPool()),
3037*b1cdbd2cSJim Jagielski 											ATTR_PATTERN_START,
3038*b1cdbd2cSJim Jagielski 											ATTR_PATTERN_END );
3039*b1cdbd2cSJim Jagielski 			SfxItemSet*		pNewSet	= new SfxItemSet(
3040*b1cdbd2cSJim Jagielski 											*(pDoc->GetPool()),
3041*b1cdbd2cSJim Jagielski 											ATTR_PATTERN_START,
3042*b1cdbd2cSJim Jagielski 											ATTR_PATTERN_END );
3043*b1cdbd2cSJim Jagielski 
3044*b1cdbd2cSJim Jagielski 			//------------------------------------------------------------
3045*b1cdbd2cSJim Jagielski 			const SvxBorderLine*	pBoxLine = NULL;
3046*b1cdbd2cSJim Jagielski 			SvxBorderLine			aLine;
3047*b1cdbd2cSJim Jagielski 
3048*b1cdbd2cSJim Jagielski 			// hier wird die pBoxLine benutzt:
3049*b1cdbd2cSJim Jagielski 
3050*b1cdbd2cSJim Jagielski             if( pBorderAttr )
3051*b1cdbd2cSJim Jagielski             {
3052*b1cdbd2cSJim Jagielski                 SvxBoxItem      aBoxItem( *(const SvxBoxItem*)pBorderAttr );
3053*b1cdbd2cSJim Jagielski                 SvxBoxInfoItem  aBoxInfoItem( ATTR_BORDER_INNER );
3054*b1cdbd2cSJim Jagielski 
3055*b1cdbd2cSJim Jagielski                 SET_LINE_ATTRIBUTES(Top,BOX_LINE_TOP)
3056*b1cdbd2cSJim Jagielski                 SET_LINE_ATTRIBUTES(Bottom,BOX_LINE_BOTTOM)
3057*b1cdbd2cSJim Jagielski                 SET_LINE_ATTRIBUTES(Left,BOX_LINE_LEFT)
3058*b1cdbd2cSJim Jagielski                 SET_LINE_ATTRIBUTES(Right,BOX_LINE_RIGHT)
3059*b1cdbd2cSJim Jagielski 
3060*b1cdbd2cSJim Jagielski                 aBoxInfoItem.SetLine( aBoxItem.GetTop(), BOXINFO_LINE_HORI );
3061*b1cdbd2cSJim Jagielski                 aBoxInfoItem.SetLine( aBoxItem.GetLeft(), BOXINFO_LINE_VERT );
3062*b1cdbd2cSJim Jagielski                 aBoxInfoItem.ResetFlags(); // Lines auf Valid setzen
3063*b1cdbd2cSJim Jagielski 
3064*b1cdbd2cSJim Jagielski                 pOldSet->Put( *pBorderAttr );
3065*b1cdbd2cSJim Jagielski                 pNewSet->Put( aBoxItem );
3066*b1cdbd2cSJim Jagielski                 pNewSet->Put( aBoxInfoItem );
3067*b1cdbd2cSJim Jagielski             }
3068*b1cdbd2cSJim Jagielski 
3069*b1cdbd2cSJim Jagielski             if( pTLBRItem && ((const SvxLineItem*)pTLBRItem)->GetLine() )
3070*b1cdbd2cSJim Jagielski             {
3071*b1cdbd2cSJim Jagielski                 SvxLineItem aTLBRItem( *(const SvxLineItem*)pTLBRItem );
3072*b1cdbd2cSJim Jagielski                 UpdateLineAttrs( aLine, aTLBRItem.GetLine(), pLine, bColorOnly );
3073*b1cdbd2cSJim Jagielski                 aTLBRItem.SetLine( &aLine );
3074*b1cdbd2cSJim Jagielski                 pOldSet->Put( *pTLBRItem );
3075*b1cdbd2cSJim Jagielski                 pNewSet->Put( aTLBRItem );
3076*b1cdbd2cSJim Jagielski             }
3077*b1cdbd2cSJim Jagielski 
3078*b1cdbd2cSJim Jagielski             if( pBLTRItem && ((const SvxLineItem*)pBLTRItem)->GetLine() )
3079*b1cdbd2cSJim Jagielski             {
3080*b1cdbd2cSJim Jagielski                 SvxLineItem aBLTRItem( *(const SvxLineItem*)pBLTRItem );
3081*b1cdbd2cSJim Jagielski                 UpdateLineAttrs( aLine, aBLTRItem.GetLine(), pLine, bColorOnly );
3082*b1cdbd2cSJim Jagielski                 aBLTRItem.SetLine( &aLine );
3083*b1cdbd2cSJim Jagielski                 pOldSet->Put( *pBLTRItem );
3084*b1cdbd2cSJim Jagielski                 pNewSet->Put( aBLTRItem );
3085*b1cdbd2cSJim Jagielski             }
3086*b1cdbd2cSJim Jagielski 
3087*b1cdbd2cSJim Jagielski 			ApplyAttributes( pNewSet, pOldSet );
3088*b1cdbd2cSJim Jagielski 
3089*b1cdbd2cSJim Jagielski 			delete pOldSet;
3090*b1cdbd2cSJim Jagielski 			delete pNewSet;
3091*b1cdbd2cSJim Jagielski 		}
3092*b1cdbd2cSJim Jagielski 		else // if ( eItemState == SFX_ITEM_DONTCARE )
3093*b1cdbd2cSJim Jagielski 		{
3094*b1cdbd2cSJim Jagielski 			aFuncMark.MarkToMulti();
3095*b1cdbd2cSJim Jagielski 			pDoc->ApplySelectionLineStyle( aFuncMark, pLine, bColorOnly );
3096*b1cdbd2cSJim Jagielski 		}
3097*b1cdbd2cSJim Jagielski 
3098*b1cdbd2cSJim Jagielski 		ScRange aMarkRange;
3099*b1cdbd2cSJim Jagielski 		aFuncMark.GetMultiMarkArea( aMarkRange );
3100*b1cdbd2cSJim Jagielski 		SCCOL nStartCol = aMarkRange.aStart.Col();
3101*b1cdbd2cSJim Jagielski 		SCROW nStartRow = aMarkRange.aStart.Row();
3102*b1cdbd2cSJim Jagielski 		SCTAB nStartTab = aMarkRange.aStart.Tab();
3103*b1cdbd2cSJim Jagielski 		SCCOL nEndCol = aMarkRange.aEnd.Col();
3104*b1cdbd2cSJim Jagielski 		SCROW nEndRow = aMarkRange.aEnd.Row();
3105*b1cdbd2cSJim Jagielski 		SCTAB nEndTab = aMarkRange.aEnd.Tab();
3106*b1cdbd2cSJim Jagielski 		pDocSh->PostPaint( nStartCol, nStartRow, nStartTab,
3107*b1cdbd2cSJim Jagielski 						   nEndCol, nEndRow, nEndTab,
3108*b1cdbd2cSJim Jagielski 						   PAINT_GRID, SC_PF_LINES | SC_PF_TESTMERGE );
3109*b1cdbd2cSJim Jagielski 
3110*b1cdbd2cSJim Jagielski 		pDocSh->UpdateOle( GetViewData() );
3111*b1cdbd2cSJim Jagielski 		pDocSh->SetDocumentModified();
3112*b1cdbd2cSJim Jagielski 	}
3113*b1cdbd2cSJim Jagielski }
3114*b1cdbd2cSJim Jagielski 
3115*b1cdbd2cSJim Jagielski #undef SET_LINE_ATTRIBUTES
3116*b1cdbd2cSJim Jagielski 
3117*b1cdbd2cSJim Jagielski 
3118*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
3119*b1cdbd2cSJim Jagielski 
SetConditionalFormat(const ScConditionalFormat & rNew)3120*b1cdbd2cSJim Jagielski void ScViewFunc::SetConditionalFormat( const ScConditionalFormat& rNew )
3121*b1cdbd2cSJim Jagielski {
3122*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = GetViewData()->GetDocument();
3123*b1cdbd2cSJim Jagielski 	sal_uLong nIndex = pDoc->AddCondFormat(rNew);			// dafuer gibt's kein Undo
3124*b1cdbd2cSJim Jagielski 	SfxUInt32Item aItem( ATTR_CONDITIONAL, nIndex );
3125*b1cdbd2cSJim Jagielski 
3126*b1cdbd2cSJim Jagielski 	ApplyAttr( aItem );			// mit Paint und Undo...
3127*b1cdbd2cSJim Jagielski }
3128*b1cdbd2cSJim Jagielski 
3129*b1cdbd2cSJim Jagielski 
3130*b1cdbd2cSJim Jagielski //----------------------------------------------------------------------------
3131*b1cdbd2cSJim Jagielski 
SetValidation(const ScValidationData & rNew)3132*b1cdbd2cSJim Jagielski void ScViewFunc::SetValidation( const ScValidationData& rNew )
3133*b1cdbd2cSJim Jagielski {
3134*b1cdbd2cSJim Jagielski 	ScDocument* pDoc = GetViewData()->GetDocument();
3135*b1cdbd2cSJim Jagielski 	sal_uLong nIndex = pDoc->AddValidationEntry(rNew);		// dafuer gibt's kein Undo
3136*b1cdbd2cSJim Jagielski 	SfxUInt32Item aItem( ATTR_VALIDDATA, nIndex );
3137*b1cdbd2cSJim Jagielski 
3138*b1cdbd2cSJim Jagielski 	ApplyAttr( aItem );			// mit Paint und Undo...
3139*b1cdbd2cSJim Jagielski }
3140*b1cdbd2cSJim Jagielski 
3141*b1cdbd2cSJim Jagielski 
3142