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