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