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 :
21 : #include "scitems.hxx"
22 : #include <editeng/eeitem.hxx>
23 :
24 :
25 : #include <sfx2/viewfrm.hxx>
26 : #include <editeng/adjustitem.hxx>
27 : #include <svx/algitem.hxx>
28 : #include <editeng/brushitem.hxx>
29 : #include <svtools/colorcfg.hxx>
30 : #include <editeng/editview.hxx>
31 : #include <editeng/editstat.hxx>
32 : #include <editeng/outliner.hxx>
33 : #include <editeng/unolingu.hxx>
34 : #include <editeng/justifyitem.hxx>
35 :
36 : #include <vcl/svapp.hxx>
37 : #include <rtl/math.hxx>
38 :
39 : #include <sax/tools/converter.hxx>
40 :
41 : #include "viewdata.hxx"
42 : #include "docoptio.hxx"
43 : #include "scmod.hxx"
44 : #include "global.hxx"
45 : #include "document.hxx"
46 : #include "attrib.hxx"
47 : #include "tabview.hxx"
48 : #include "tabvwsh.hxx"
49 : #include "docsh.hxx"
50 : #include "sc.hrc"
51 : #include "patattr.hxx"
52 : #include "editutil.hxx"
53 : #include "scextopt.hxx"
54 : #include "miscuno.hxx"
55 : #include "unonames.hxx"
56 : #include "inputopt.hxx"
57 : #include "viewutil.hxx"
58 : #include "markdata.hxx"
59 : #include "stlalgorithm.hxx"
60 : #include "ViewSettingsSequenceDefines.hxx"
61 : #include <rtl/ustrbuf.hxx>
62 : #include <comphelper/processfactory.hxx>
63 : #include <comphelper/string.hxx>
64 : #include <com/sun/star/container/XNameContainer.hpp>
65 : #include <com/sun/star/document/NamedPropertyValues.hpp>
66 :
67 : using namespace com::sun::star;
68 :
69 : #define SC_GROWY_SMALL_EXTRA 100
70 : #define SC_GROWY_BIG_EXTRA 200
71 :
72 : #define TAG_TABBARWIDTH "tw:"
73 :
74 : static bool bMoveArea = false; // Member?
75 : sal_uInt16 nEditAdjust = SVX_ADJUST_LEFT; // Member!
76 :
77 0 : ScViewDataTable::ScViewDataTable() :
78 : eZoomType( SVX_ZOOM_PERCENT ),
79 : aZoomX( 1,1 ),
80 : aZoomY( 1,1 ),
81 : aPageZoomX( 3,5 ), // Page-Default: 60%
82 : aPageZoomY( 3,5 ),
83 : nHSplitPos( 0 ),
84 : nVSplitPos( 0 ),
85 : eHSplitMode( SC_SPLIT_NONE ),
86 : eVSplitMode( SC_SPLIT_NONE ),
87 : eWhichActive( SC_SPLIT_BOTTOMLEFT ),
88 : nFixPosX( 0 ),
89 : nFixPosY( 0 ),
90 : nCurX( 0 ),
91 : nCurY( 0 ),
92 : nOldCurX( 0 ),
93 : nOldCurY( 0 ),
94 : bShowGrid( true ),
95 0 : mbOldCursorValid( false )
96 : {
97 0 : nPosX[0]=nPosX[1]=0;
98 0 : nPosY[0]=nPosY[1]=0;
99 0 : nTPosX[0]=nTPosX[1]=0;
100 0 : nTPosY[0]=nTPosY[1]=0;
101 0 : nMPosX[0]=nMPosX[1]=0;
102 0 : nMPosY[0]=nMPosY[1]=0;
103 0 : nPixPosX[0]=nPixPosX[1]=0;
104 0 : nPixPosY[0]=nPixPosY[1]=0;
105 0 : }
106 :
107 0 : ScViewDataTable::~ScViewDataTable()
108 : {
109 0 : }
110 :
111 0 : void ScViewDataTable::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>& rSettings, const ScViewData& /*rViewData*/, SCTAB /*nTab*/) const
112 : {
113 0 : rSettings.realloc(SC_TABLE_VIEWSETTINGS_COUNT);
114 0 : beans::PropertyValue* pSettings = rSettings.getArray();
115 0 : if (pSettings)
116 : {
117 0 : pSettings[SC_CURSOR_X].Name = OUString(SC_CURSORPOSITIONX);
118 0 : pSettings[SC_CURSOR_X].Value <<= sal_Int32(nCurX);
119 0 : pSettings[SC_CURSOR_Y].Name = OUString(SC_CURSORPOSITIONY);
120 0 : pSettings[SC_CURSOR_Y].Value <<= sal_Int32(nCurY);
121 0 : pSettings[SC_HORIZONTAL_SPLIT_MODE].Name = OUString(SC_HORIZONTALSPLITMODE);
122 0 : pSettings[SC_HORIZONTAL_SPLIT_MODE].Value <<= sal_Int16(eHSplitMode);
123 0 : pSettings[SC_VERTICAL_SPLIT_MODE].Name = OUString(SC_VERTICALSPLITMODE);
124 0 : pSettings[SC_VERTICAL_SPLIT_MODE].Value <<= sal_Int16(eVSplitMode);
125 0 : pSettings[SC_HORIZONTAL_SPLIT_POSITION].Name = OUString(SC_HORIZONTALSPLITPOSITION);
126 0 : if (eHSplitMode == SC_SPLIT_FIX)
127 0 : pSettings[SC_HORIZONTAL_SPLIT_POSITION].Value <<= sal_Int32(nFixPosX);
128 : else
129 0 : pSettings[SC_HORIZONTAL_SPLIT_POSITION].Value <<= sal_Int32(nHSplitPos);
130 0 : pSettings[SC_VERTICAL_SPLIT_POSITION].Name = OUString(SC_VERTICALSPLITPOSITION);
131 0 : if (eVSplitMode == SC_SPLIT_FIX)
132 0 : pSettings[SC_VERTICAL_SPLIT_POSITION].Value <<= sal_Int32(nFixPosY);
133 : else
134 0 : pSettings[SC_VERTICAL_SPLIT_POSITION].Value <<= sal_Int32(nVSplitPos);
135 0 : pSettings[SC_ACTIVE_SPLIT_RANGE].Name = OUString(SC_ACTIVESPLITRANGE);
136 0 : pSettings[SC_ACTIVE_SPLIT_RANGE].Value <<= sal_Int16(eWhichActive);
137 0 : pSettings[SC_POSITION_LEFT].Name = OUString(SC_POSITIONLEFT);
138 0 : pSettings[SC_POSITION_LEFT].Value <<= sal_Int32(nPosX[SC_SPLIT_LEFT]);
139 0 : pSettings[SC_POSITION_RIGHT].Name = OUString(SC_POSITIONRIGHT);
140 0 : pSettings[SC_POSITION_RIGHT].Value <<= sal_Int32(nPosX[SC_SPLIT_RIGHT]);
141 0 : pSettings[SC_POSITION_TOP].Name = OUString(SC_POSITIONTOP);
142 0 : pSettings[SC_POSITION_TOP].Value <<= sal_Int32(nPosY[SC_SPLIT_TOP]);
143 0 : pSettings[SC_POSITION_BOTTOM].Name = OUString(SC_POSITIONBOTTOM);
144 0 : pSettings[SC_POSITION_BOTTOM].Value <<= sal_Int32(nPosY[SC_SPLIT_BOTTOM]);
145 :
146 0 : sal_Int32 nZoomValue ((aZoomY.GetNumerator() * 100) / aZoomY.GetDenominator());
147 0 : sal_Int32 nPageZoomValue ((aPageZoomY.GetNumerator() * 100) / aPageZoomY.GetDenominator());
148 0 : pSettings[SC_TABLE_ZOOM_TYPE].Name = OUString(SC_ZOOMTYPE);
149 0 : pSettings[SC_TABLE_ZOOM_TYPE].Value <<= sal_Int16(eZoomType);
150 0 : pSettings[SC_TABLE_ZOOM_VALUE].Name = OUString(SC_ZOOMVALUE);
151 0 : pSettings[SC_TABLE_ZOOM_VALUE].Value <<= nZoomValue;
152 0 : pSettings[SC_TABLE_PAGE_VIEW_ZOOM_VALUE].Name = OUString(SC_PAGEVIEWZOOMVALUE);
153 0 : pSettings[SC_TABLE_PAGE_VIEW_ZOOM_VALUE].Value <<= nPageZoomValue;
154 :
155 0 : pSettings[SC_TABLE_SHOWGRID].Name = OUString(SC_UNO_SHOWGRID);
156 0 : pSettings[SC_TABLE_SHOWGRID].Value <<= static_cast<sal_Bool>(bShowGrid);
157 : }
158 0 : }
159 :
160 0 : void ScViewDataTable::ReadUserDataSequence(const uno::Sequence <beans::PropertyValue>& aSettings, ScViewData& rViewData, SCTAB nTab, bool& rHasZoom )
161 : {
162 0 : rHasZoom = false;
163 :
164 0 : sal_Int32 nCount(aSettings.getLength());
165 0 : sal_Int32 nTemp32(0);
166 0 : sal_Int16 nTemp16(0);
167 0 : sal_Int32 nTempPosV(0);
168 0 : sal_Int32 nTempPosH(0);
169 0 : sal_Int32 nTempPosVTw(0);
170 0 : sal_Int32 nTempPosHTw(0);
171 0 : bool bHasVSplitInTwips = false;
172 0 : bool bHasHSplitInTwips = false;
173 0 : for (sal_Int32 i = 0; i < nCount; i++)
174 : {
175 0 : OUString sName(aSettings[i].Name);
176 0 : if (sName.equalsAscii(SC_CURSORPOSITIONX) )
177 : {
178 0 : aSettings[i].Value >>= nTemp32;
179 0 : nCurX = SanitizeCol( static_cast<SCCOL>(nTemp32));
180 : }
181 0 : else if (sName.equalsAscii(SC_CURSORPOSITIONY) )
182 : {
183 0 : aSettings[i].Value >>= nTemp32;
184 0 : nCurY = SanitizeRow( static_cast<SCROW>(nTemp32));
185 : }
186 0 : else if (sName.equalsAscii(SC_HORIZONTALSPLITMODE) )
187 : {
188 0 : aSettings[i].Value >>= nTemp16;
189 0 : eHSplitMode = static_cast<ScSplitMode>(nTemp16);
190 : }
191 0 : else if (sName.equalsAscii(SC_VERTICALSPLITMODE) )
192 : {
193 0 : aSettings[i].Value >>= nTemp16;
194 0 : eVSplitMode = static_cast<ScSplitMode>(nTemp16);
195 : }
196 0 : else if (sName.equalsAscii(SC_HORIZONTALSPLITPOSITION) )
197 : {
198 0 : aSettings[i].Value >>= nTempPosH;
199 0 : bHasHSplitInTwips = false;
200 : }
201 0 : else if (sName.equalsAscii(SC_VERTICALSPLITPOSITION) )
202 : {
203 0 : aSettings[i].Value >>= nTempPosV;
204 0 : bHasVSplitInTwips = false;
205 : }
206 0 : else if (sName.equalsAscii(SC_HORIZONTALSPLITPOSITION_TWIPS) )
207 : {
208 0 : aSettings[i].Value >>= nTempPosHTw;
209 0 : bHasHSplitInTwips = true;
210 : }
211 0 : else if (sName.equalsAscii(SC_VERTICALSPLITPOSITION_TWIPS) )
212 : {
213 0 : aSettings[i].Value >>= nTempPosVTw;
214 0 : bHasVSplitInTwips = true;
215 : }
216 0 : else if (sName.equalsAscii(SC_ACTIVESPLITRANGE) )
217 : {
218 0 : aSettings[i].Value >>= nTemp16;
219 0 : eWhichActive = static_cast<ScSplitPos>(nTemp16);
220 : }
221 0 : else if (sName.equalsAscii(SC_POSITIONLEFT) )
222 : {
223 0 : aSettings[i].Value >>= nTemp32;
224 0 : nPosX[SC_SPLIT_LEFT] = SanitizeCol( static_cast<SCCOL>(nTemp32));
225 : }
226 0 : else if (sName.equalsAscii(SC_POSITIONRIGHT) )
227 : {
228 0 : aSettings[i].Value >>= nTemp32;
229 0 : nPosX[SC_SPLIT_RIGHT] = SanitizeCol( static_cast<SCCOL>(nTemp32));
230 : }
231 0 : else if (sName.equalsAscii(SC_POSITIONTOP) )
232 : {
233 0 : aSettings[i].Value >>= nTemp32;
234 0 : nPosY[SC_SPLIT_TOP] = SanitizeRow( static_cast<SCROW>(nTemp32));
235 : }
236 0 : else if (sName.equalsAscii(SC_POSITIONBOTTOM) )
237 : {
238 0 : aSettings[i].Value >>= nTemp32;
239 0 : nPosY[SC_SPLIT_BOTTOM] = SanitizeRow( static_cast<SCROW>(nTemp32));
240 : }
241 0 : else if (sName.equalsAscii(SC_ZOOMTYPE) )
242 : {
243 0 : aSettings[i].Value >>= nTemp16;
244 0 : eZoomType = SvxZoomType(nTemp16);
245 0 : rHasZoom = true; // set if there is any zoom information
246 : }
247 0 : else if (sName.equalsAscii(SC_ZOOMVALUE) )
248 : {
249 0 : aSettings[i].Value >>= nTemp32;
250 0 : Fraction aZoom(nTemp32, 100);
251 0 : aZoomX = aZoomY = aZoom;
252 0 : rHasZoom = true;
253 : }
254 0 : else if (sName.equalsAscii(SC_PAGEVIEWZOOMVALUE) )
255 : {
256 0 : aSettings[i].Value >>= nTemp32;
257 0 : Fraction aZoom(nTemp32, 100);
258 0 : aPageZoomX = aPageZoomY = aZoom;
259 0 : rHasZoom = true;
260 : }
261 0 : else if (sName.equalsAscii(SC_UNO_SHOWGRID) )
262 : {
263 0 : aSettings[i].Value >>= bShowGrid;
264 : }
265 0 : else if (sName.equalsAscii(SC_TABLESELECTED) )
266 : {
267 0 : bool bSelected = false;
268 0 : aSettings[i].Value >>= bSelected;
269 0 : rViewData.GetMarkData().SelectTable( nTab, bSelected );
270 : }
271 0 : else if (sName.equalsAscii(SC_UNONAME_TABCOLOR) )
272 : {
273 : // There are documents out there that have their tab color defined as a view setting.
274 0 : sal_Int32 nColor = COL_AUTO;
275 0 : aSettings[i].Value >>= nColor;
276 0 : if (static_cast<ColorData>(nColor) != COL_AUTO)
277 : {
278 0 : ScDocument* pDoc = rViewData.GetDocument();
279 0 : pDoc->SetTabBgColor(nTab, Color(static_cast<ColorData>(nColor)));
280 : }
281 : }
282 0 : }
283 0 : if (eHSplitMode == SC_SPLIT_FIX)
284 0 : nFixPosX = SanitizeCol( static_cast<SCCOL>( bHasHSplitInTwips ? nTempPosHTw : nTempPosH ));
285 : else
286 0 : nHSplitPos = bHasHSplitInTwips ? static_cast< long >( nTempPosHTw * rViewData.GetPPTX() ) : nTempPosH;
287 :
288 0 : if (eVSplitMode == SC_SPLIT_FIX)
289 0 : nFixPosY = SanitizeRow( static_cast<SCROW>( bHasVSplitInTwips ? nTempPosVTw : nTempPosV ));
290 : else
291 0 : nVSplitPos = bHasVSplitInTwips ? static_cast< long >( nTempPosVTw * rViewData.GetPPTY() ) : nTempPosV;
292 0 : }
293 :
294 0 : ScViewData::ScViewData( ScDocShell* pDocSh, ScTabViewShell* pViewSh ) :
295 0 : mpMarkData(new ScMarkData),
296 : pDocShell ( pDocSh ),
297 : pDoc ( NULL ),
298 : pView ( pViewSh ),
299 : pViewShell ( pViewSh ),
300 0 : pOptions ( new ScViewOptions ),
301 : pSpellingView ( NULL ),
302 : aLogicMode ( MAP_100TH_MM ),
303 : eDefZoomType( SVX_ZOOM_PERCENT ),
304 : aDefZoomX ( 1,1 ),
305 : aDefZoomY ( 1,1 ),
306 : aDefPageZoomX( 3,5 ),
307 : aDefPageZoomY( 3,5 ),
308 : eRefType ( SC_REFTYPE_NONE ),
309 : nTabNo ( 0 ),
310 : nRefTabNo ( 0 ),
311 : nPasteFlags ( SC_PASTE_NONE ),
312 : eEditActivePart( SC_SPLIT_BOTTOMLEFT ),
313 : nFillMode ( SC_FILL_NONE ),
314 : bActive ( true ), // how to initialize?
315 : bIsRefMode ( false ),
316 : bDelMarkValid( false ),
317 : bPagebreak ( false ),
318 0 : bSelCtrlMouseClick( false )
319 : {
320 0 : mpMarkData->SelectOneTable(0); // Sync with nTabNo
321 :
322 0 : SetGridMode ( true );
323 0 : SetSyntaxMode ( false );
324 0 : SetHeaderMode ( true );
325 0 : SetTabMode ( true );
326 0 : SetVScrollMode ( true );
327 0 : SetHScrollMode ( true );
328 0 : SetOutlineMode ( true );
329 :
330 : aScrSize = Size( (long) ( STD_COL_WIDTH * PIXEL_PER_TWIPS * OLE_STD_CELLS_X ),
331 0 : (long) ( ScGlobal::nStdRowHeight * PIXEL_PER_TWIPS * OLE_STD_CELLS_Y ) );
332 0 : maTabData.push_back( new ScViewDataTable );
333 0 : pThisTab = maTabData[nTabNo];
334 0 : for (sal_uInt16 j=0; j<4; j++)
335 : {
336 0 : pEditView[j] = NULL;
337 0 : bEditActive[j] = false;
338 : }
339 :
340 0 : nEditEndCol = nEditStartCol = nEditCol = 0;
341 0 : nEditEndRow = nEditRow = 0;
342 0 : nTabStartCol = SC_TABSTART_NONE;
343 :
344 0 : if (pDocShell)
345 : {
346 0 : pDoc = pDocShell->GetDocument();
347 0 : *pOptions = pDoc->GetViewOptions();
348 : }
349 :
350 : // don't show hidden tables
351 0 : if (pDoc && !pDoc->IsVisible(nTabNo))
352 : {
353 0 : while ( !pDoc->IsVisible(nTabNo) && pDoc->HasTable(nTabNo+1) )
354 : {
355 0 : ++nTabNo;
356 0 : maTabData.push_back(NULL);
357 : }
358 0 : maTabData[nTabNo] = new ScViewDataTable() ;
359 0 : pThisTab = maTabData[nTabNo];
360 : }
361 :
362 0 : CalcPPT();
363 0 : }
364 :
365 0 : ScViewData::ScViewData( const ScViewData& rViewData ) :
366 : maTabData( rViewData.maTabData ),
367 0 : mpMarkData(new ScMarkData(*rViewData.mpMarkData)),
368 : pDocShell ( rViewData.pDocShell ),
369 : pDoc ( rViewData.pDoc ),
370 : pView ( rViewData.pView ),
371 : pViewShell ( rViewData.pViewShell ),
372 0 : pOptions ( new ScViewOptions( *(rViewData.pOptions) ) ),
373 : pSpellingView ( rViewData.pSpellingView ),
374 : aLogicMode ( rViewData.aLogicMode ),
375 : eDefZoomType( rViewData.eDefZoomType ),
376 : aDefZoomX ( rViewData.aDefZoomX ),
377 : aDefZoomY ( rViewData.aDefZoomY ),
378 : aDefPageZoomX( rViewData.aDefPageZoomX ),
379 : aDefPageZoomY( rViewData.aDefPageZoomY ),
380 : eRefType ( SC_REFTYPE_NONE ),
381 : nTabNo ( rViewData.nTabNo ),
382 : nRefTabNo ( rViewData.nTabNo ), // no RefMode
383 : eEditActivePart( rViewData.eEditActivePart ),
384 : nFillMode ( SC_FILL_NONE ),
385 : bActive ( true ), // how to initialize?
386 : bIsRefMode ( false ),
387 : bDelMarkValid( false ),
388 : bPagebreak ( rViewData.bPagebreak ),
389 0 : bSelCtrlMouseClick( rViewData.bSelCtrlMouseClick )
390 : {
391 :
392 0 : SetGridMode ( rViewData.IsGridMode() );
393 0 : SetSyntaxMode ( rViewData.IsSyntaxMode() );
394 0 : SetHeaderMode ( rViewData.IsHeaderMode() );
395 0 : SetTabMode ( rViewData.IsTabMode() );
396 0 : SetVScrollMode ( rViewData.IsVScrollMode() );
397 0 : SetHScrollMode ( rViewData.IsHScrollMode() );
398 0 : SetOutlineMode ( rViewData.IsOutlineMode() );
399 :
400 0 : aScrSize = rViewData.aScrSize;
401 :
402 0 : pThisTab = maTabData[nTabNo];
403 0 : for (sal_uInt16 j=0; j<4; j++)
404 : {
405 0 : pEditView[j] = NULL;
406 0 : bEditActive[j] = false;
407 : }
408 :
409 0 : nEditEndCol = nEditStartCol = nEditCol = 0;
410 0 : nEditEndRow = nEditRow = 0;
411 0 : nTabStartCol = SC_TABSTART_NONE;
412 0 : CalcPPT();
413 0 : }
414 :
415 0 : void ScViewData::InitData( ScDocument* pDocument )
416 : {
417 0 : pDoc = pDocument;
418 0 : *pOptions = pDoc->GetViewOptions();
419 0 : }
420 :
421 :
422 0 : ScDocument* ScViewData::GetDocument() const
423 : {
424 0 : if (pDoc)
425 0 : return pDoc;
426 0 : else if (pDocShell)
427 0 : return pDocShell->GetDocument();
428 :
429 : OSL_FAIL("kein Document an ViewData");
430 0 : return NULL;
431 : }
432 :
433 0 : ScViewData::~ScViewData()
434 : {
435 0 : KillEditView();
436 0 : delete pOptions;
437 : ::std::for_each(
438 0 : maTabData.begin(), maTabData.end(), ScDeleteObjectByPtr<ScViewDataTable>());
439 0 : }
440 :
441 0 : void ScViewData::UpdateCurrentTab()
442 : {
443 0 : pThisTab = maTabData[nTabNo];
444 0 : while (!pThisTab)
445 : {
446 0 : if (nTabNo > 0)
447 0 : pThisTab = maTabData[--nTabNo];
448 : else
449 0 : pThisTab = maTabData[0] = new ScViewDataTable;
450 : }
451 0 : }
452 :
453 0 : void ScViewData::InsertTab( SCTAB nTab )
454 : {
455 0 : if( nTab >= static_cast<SCTAB>(maTabData.size()))
456 0 : maTabData.resize(nTab+1, NULL);
457 : else
458 0 : maTabData.insert( maTabData.begin() + nTab, (ScViewDataTable *)NULL );
459 0 : CreateTabData( nTab );
460 :
461 0 : UpdateCurrentTab();
462 0 : mpMarkData->InsertTab( nTab );
463 0 : }
464 :
465 0 : void ScViewData::InsertTabs( SCTAB nTab, SCTAB nNewSheets )
466 : {
467 0 : if( nTab+nNewSheets >= static_cast<SCTAB>(maTabData.size()))
468 0 : maTabData.resize(nTab+nNewSheets, NULL);
469 : else
470 : {
471 0 : maTabData.insert( maTabData.begin() + nTab, nNewSheets, NULL );
472 : }
473 0 : for (SCTAB i = nTab; i < nTab + nNewSheets; ++i)
474 : {
475 0 : CreateTabData( i );
476 0 : mpMarkData->InsertTab( i );
477 : }
478 0 : UpdateCurrentTab();
479 0 : }
480 :
481 0 : void ScViewData::DeleteTab( SCTAB nTab )
482 : {
483 0 : delete maTabData.at(nTab);
484 :
485 0 : maTabData.erase(maTabData.begin() + nTab);
486 0 : UpdateCurrentTab();
487 0 : mpMarkData->DeleteTab( nTab );
488 0 : }
489 :
490 0 : void ScViewData::DeleteTabs( SCTAB nTab, SCTAB nSheets )
491 : {
492 0 : for (SCTAB i = 0; i < nSheets; ++i)
493 : {
494 0 : mpMarkData->DeleteTab( nTab + i );
495 0 : delete maTabData.at(nTab + i);
496 : }
497 :
498 0 : maTabData.erase(maTabData.begin() + nTab, maTabData.begin()+ nTab+nSheets);
499 0 : UpdateCurrentTab();
500 0 : }
501 :
502 0 : void ScViewData::CopyTab( SCTAB nSrcTab, SCTAB nDestTab )
503 : {
504 0 : if (nDestTab==SC_TAB_APPEND)
505 0 : nDestTab = pDoc->GetTableCount() - 1; // something had to have been copied
506 :
507 0 : if (nDestTab > MAXTAB)
508 : {
509 : OSL_FAIL("Zuviele Tabellen");
510 0 : return;
511 : }
512 :
513 0 : if (nSrcTab >= static_cast<SCTAB>(maTabData.size()))
514 : OSL_FAIL("pTabData out of bounds, FIX IT");
515 :
516 0 : EnsureTabDataSize(nDestTab + 1);
517 :
518 0 : if ( maTabData[nSrcTab] )
519 0 : maTabData.insert(maTabData.begin() + nDestTab, new ScViewDataTable( *maTabData[nSrcTab] ));
520 : else
521 0 : maTabData.insert(maTabData.begin() + nDestTab, (ScViewDataTable *)NULL);
522 :
523 0 : UpdateCurrentTab();
524 0 : mpMarkData->InsertTab( nDestTab );
525 : }
526 :
527 0 : void ScViewData::MoveTab( SCTAB nSrcTab, SCTAB nDestTab )
528 : {
529 0 : if (nDestTab==SC_TAB_APPEND)
530 0 : nDestTab = pDoc->GetTableCount() - 1;
531 0 : ScViewDataTable* pTab = NULL;
532 0 : if (nSrcTab < static_cast<SCTAB>(maTabData.size()))
533 : {
534 0 : pTab = maTabData[nSrcTab];
535 0 : maTabData.erase( maTabData.begin() + nSrcTab );
536 : }
537 :
538 0 : if (nDestTab < static_cast<SCTAB>(maTabData.size()))
539 0 : maTabData.insert( maTabData.begin() + nDestTab, pTab );
540 : else
541 : {
542 0 : EnsureTabDataSize(nDestTab + 1);
543 0 : maTabData[nDestTab] = pTab;
544 : }
545 :
546 0 : UpdateCurrentTab();
547 0 : mpMarkData->DeleteTab( nSrcTab );
548 0 : mpMarkData->InsertTab( nDestTab ); // adapted if needed
549 0 : }
550 :
551 0 : void ScViewData::CreateTabData( std::vector< SCTAB >& rvTabs )
552 : {
553 0 : std::vector< SCTAB >::iterator it_end = rvTabs.end();
554 0 : for ( std::vector< SCTAB >::iterator it = rvTabs.begin(); it != it_end; ++it )
555 0 : CreateTabData(*it);
556 0 : }
557 :
558 0 : void ScViewData::SetZoomType( SvxZoomType eNew, std::vector< SCTAB >& tabs )
559 : {
560 0 : bool bAll = ( tabs.empty() );
561 :
562 0 : if ( !bAll ) // create associated table data
563 0 : CreateTabData( tabs );
564 :
565 0 : if ( bAll )
566 : {
567 0 : for ( SCTAB i = 0; i < static_cast<SCTAB>(maTabData.size()); ++i )
568 : {
569 0 : if ( maTabData[i] )
570 0 : maTabData[i]->eZoomType = eNew;
571 : }
572 0 : eDefZoomType = eNew;
573 : }
574 : else
575 : {
576 0 : std::vector< SCTAB >::iterator it_end = tabs.end();
577 0 : std::vector< SCTAB >::iterator it = tabs.begin();
578 0 : for ( ; it != it_end; ++it )
579 : {
580 0 : SCTAB i = *it;
581 0 : if ( i < static_cast<SCTAB>(maTabData.size()) && maTabData[i] )
582 0 : maTabData[i]->eZoomType = eNew;
583 : }
584 : }
585 0 : }
586 :
587 0 : void ScViewData::SetZoomType( SvxZoomType eNew, bool bAll )
588 : {
589 0 : std::vector< SCTAB > vTabs; // Empty for all tabs
590 0 : if ( !bAll ) // get selected tabs
591 : {
592 0 : ScMarkData::iterator itr = mpMarkData->begin(), itrEnd = mpMarkData->end();
593 0 : vTabs.insert(vTabs.begin(), itr, itrEnd);
594 : }
595 0 : SetZoomType( eNew, vTabs );
596 0 : }
597 :
598 0 : void ScViewData::SetZoom( const Fraction& rNewX, const Fraction& rNewY, std::vector< SCTAB >& tabs )
599 : {
600 0 : bool bAll = ( tabs.empty() );
601 0 : if ( !bAll ) // create associated table data
602 0 : CreateTabData( tabs );
603 0 : Fraction aFrac20( 1,5 );
604 0 : Fraction aFrac400( 4,1 );
605 :
606 0 : Fraction aValidX = rNewX;
607 0 : if (aValidX<aFrac20)
608 0 : aValidX = aFrac20;
609 0 : if (aValidX>aFrac400)
610 0 : aValidX = aFrac400;
611 :
612 0 : Fraction aValidY = rNewY;
613 0 : if (aValidY<aFrac20)
614 0 : aValidY = aFrac20;
615 0 : if (aValidY>aFrac400)
616 0 : aValidY = aFrac400;
617 :
618 0 : if ( bAll )
619 : {
620 0 : for ( SCTAB i = 0; i < static_cast<SCTAB>(maTabData.size()); ++i )
621 : {
622 0 : if ( maTabData[i] )
623 : {
624 0 : if ( bPagebreak )
625 : {
626 0 : maTabData[i]->aPageZoomX = aValidX;
627 0 : maTabData[i]->aPageZoomY = aValidY;
628 : }
629 : else
630 : {
631 0 : maTabData[i]->aZoomX = aValidX;
632 0 : maTabData[i]->aZoomY = aValidY;
633 : }
634 : }
635 : }
636 0 : if ( bPagebreak )
637 : {
638 0 : aDefPageZoomX = aValidX;
639 0 : aDefPageZoomY = aValidY;
640 : }
641 : else
642 : {
643 0 : aDefZoomX = aValidX;
644 0 : aDefZoomY = aValidY;
645 : }
646 : }
647 : else
648 : {
649 0 : std::vector< SCTAB >::iterator it_end = tabs.end();
650 0 : std::vector< SCTAB >::iterator it = tabs.begin();
651 0 : for ( ; it != it_end; ++it )
652 : {
653 0 : SCTAB i = *it;
654 0 : if ( i < static_cast<SCTAB>(maTabData.size()) && maTabData[i] )
655 : {
656 0 : if ( bPagebreak )
657 : {
658 0 : maTabData[i]->aPageZoomX = aValidX;
659 0 : maTabData[i]->aPageZoomY = aValidY;
660 : }
661 : else
662 : {
663 0 : maTabData[i]->aZoomX = aValidX;
664 0 : maTabData[i]->aZoomY = aValidY;
665 : }
666 : }
667 : }
668 : }
669 0 : RefreshZoom();
670 0 : }
671 :
672 0 : void ScViewData::SetZoom( const Fraction& rNewX, const Fraction& rNewY, bool bAll )
673 : {
674 0 : std::vector< SCTAB > vTabs;
675 0 : if ( !bAll ) // get selected tabs
676 : {
677 0 : ScMarkData::iterator itr = mpMarkData->begin(), itrEnd = mpMarkData->end();
678 0 : vTabs.insert(vTabs.begin(), itr, itrEnd);
679 : }
680 0 : SetZoom( rNewX, rNewY, vTabs );
681 0 : }
682 :
683 0 : void ScViewData::SetShowGrid( bool bShow )
684 : {
685 0 : CreateSelectedTabData();
686 0 : maTabData[nTabNo]->bShowGrid = bShow;
687 0 : }
688 :
689 0 : void ScViewData::RefreshZoom()
690 : {
691 : // recalculate zoom-dependent values (only for current sheet)
692 :
693 0 : CalcPPT();
694 0 : RecalcPixPos();
695 0 : aScenButSize = Size(0,0);
696 0 : aLogicMode.SetScaleX( GetZoomX() );
697 0 : aLogicMode.SetScaleY( GetZoomY() );
698 0 : }
699 :
700 0 : void ScViewData::SetPagebreakMode( bool bSet )
701 : {
702 0 : bPagebreak = bSet;
703 :
704 0 : RefreshZoom();
705 0 : }
706 :
707 :
708 0 : ScMarkType ScViewData::GetSimpleArea( ScRange & rRange, ScMarkData & rNewMark ) const
709 : {
710 0 : ScMarkType eMarkType = SC_MARK_NONE;
711 :
712 0 : if ( rNewMark.IsMarked() || rNewMark.IsMultiMarked() )
713 : {
714 0 : if ( rNewMark.IsMultiMarked() )
715 0 : rNewMark.MarkToSimple();
716 :
717 0 : if ( rNewMark.IsMarked() && !rNewMark.IsMultiMarked() )
718 : {
719 0 : rNewMark.GetMarkArea( rRange );
720 0 : if (ScViewUtil::HasFiltered( rRange, GetDocument()))
721 0 : eMarkType = SC_MARK_SIMPLE_FILTERED;
722 : else
723 0 : eMarkType = SC_MARK_SIMPLE;
724 : }
725 : else
726 0 : eMarkType = SC_MARK_MULTI;
727 : }
728 0 : if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED)
729 : {
730 0 : if (eMarkType == SC_MARK_NONE)
731 0 : eMarkType = SC_MARK_SIMPLE;
732 0 : rRange = ScRange( GetCurX(), GetCurY(), GetTabNo() );
733 : }
734 0 : return eMarkType;
735 : }
736 :
737 :
738 0 : ScMarkType ScViewData::GetSimpleArea( SCCOL& rStartCol, SCROW& rStartRow, SCTAB& rStartTab,
739 : SCCOL& rEndCol, SCROW& rEndRow, SCTAB& rEndTab ) const
740 : {
741 : // parameter bMergeMark is no longer needed: The view's selection is never modified
742 : // (a local copy is used), and a multi selection that adds to a single range can always
743 : // be treated like a single selection (GetSimpleArea isn't used in selection
744 : // handling itself)
745 :
746 0 : ScRange aRange;
747 0 : ScMarkData aNewMark(*mpMarkData); // use a local copy for MarkToSimple
748 0 : ScMarkType eMarkType = GetSimpleArea( aRange, aNewMark);
749 0 : aRange.GetVars( rStartCol, rStartRow, rStartTab, rEndCol, rEndRow, rEndTab);
750 0 : return eMarkType;
751 : }
752 :
753 0 : ScMarkType ScViewData::GetSimpleArea( ScRange& rRange ) const
754 : {
755 : // parameter bMergeMark is no longer needed, see above
756 :
757 0 : ScMarkData aNewMark(*mpMarkData); // use a local copy for MarkToSimple
758 0 : return GetSimpleArea( rRange, aNewMark);
759 : }
760 :
761 0 : void ScViewData::GetMultiArea( ScRangeListRef& rRange ) const
762 : {
763 : // parameter bMergeMark is no longer needed, see GetSimpleArea
764 :
765 0 : ScMarkData aNewMark(*mpMarkData); // use a local copy for MarkToSimple
766 :
767 0 : bool bMulti = aNewMark.IsMultiMarked();
768 0 : if (bMulti)
769 : {
770 0 : aNewMark.MarkToSimple();
771 0 : bMulti = aNewMark.IsMultiMarked();
772 : }
773 0 : if (bMulti)
774 : {
775 0 : rRange = new ScRangeList;
776 0 : aNewMark.FillRangeListWithMarks( rRange, false );
777 : }
778 : else
779 : {
780 0 : ScRange aSimple;
781 0 : GetSimpleArea(aSimple);
782 0 : rRange = new ScRangeList;
783 0 : rRange->Append(aSimple);
784 0 : }
785 0 : }
786 :
787 0 : bool ScViewData::SimpleColMarked()
788 : {
789 : SCCOL nStartCol;
790 : SCROW nStartRow;
791 : SCTAB nStartTab;
792 : SCCOL nEndCol;
793 : SCROW nEndRow;
794 : SCTAB nEndTab;
795 0 : if (GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) == SC_MARK_SIMPLE)
796 0 : if (nStartRow==0 && nEndRow==MAXROW)
797 0 : return true;
798 :
799 0 : return false;
800 : }
801 :
802 0 : bool ScViewData::SimpleRowMarked()
803 : {
804 : SCCOL nStartCol;
805 : SCROW nStartRow;
806 : SCTAB nStartTab;
807 : SCCOL nEndCol;
808 : SCROW nEndRow;
809 : SCTAB nEndTab;
810 0 : if (GetSimpleArea(nStartCol,nStartRow,nStartTab,nEndCol,nEndRow,nEndTab) == SC_MARK_SIMPLE)
811 0 : if (nStartCol==0 && nEndCol==MAXCOL)
812 0 : return true;
813 :
814 0 : return false;
815 : }
816 :
817 0 : bool ScViewData::IsMultiMarked()
818 : {
819 : // Test for "real" multi selection, calling MarkToSimple on a local copy,
820 : // and taking filtered in simple area marks into account.
821 :
822 0 : ScRange aDummy;
823 0 : ScMarkType eType = GetSimpleArea(aDummy);
824 0 : return (eType & SC_MARK_SIMPLE) != SC_MARK_SIMPLE;
825 : }
826 :
827 0 : void ScViewData::SetFillMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow )
828 : {
829 0 : nFillMode = SC_FILL_FILL;
830 0 : nFillStartX = nStartCol;
831 0 : nFillStartY = nStartRow;
832 0 : nFillEndX = nEndCol;
833 0 : nFillEndY = nEndRow;
834 0 : }
835 :
836 0 : void ScViewData::SetDragMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
837 : sal_uInt8 nMode )
838 : {
839 0 : nFillMode = nMode;
840 0 : nFillStartX = nStartCol;
841 0 : nFillStartY = nStartRow;
842 0 : nFillEndX = nEndCol;
843 0 : nFillEndY = nEndRow;
844 0 : }
845 :
846 0 : void ScViewData::ResetFillMode()
847 : {
848 0 : nFillMode = SC_FILL_NONE;
849 0 : }
850 :
851 0 : void ScViewData::GetFillData( SCCOL& rStartCol, SCROW& rStartRow,
852 : SCCOL& rEndCol, SCROW& rEndRow )
853 : {
854 0 : rStartCol = nFillStartX;
855 0 : rStartRow = nFillStartY;
856 0 : rEndCol = nFillEndX;
857 0 : rEndRow = nFillEndY;
858 0 : }
859 :
860 0 : SCCOL ScViewData::GetOldCurX() const
861 : {
862 0 : if (pThisTab->mbOldCursorValid)
863 0 : return pThisTab->nOldCurX;
864 : else
865 0 : return pThisTab->nCurX;
866 : }
867 :
868 0 : SCROW ScViewData::GetOldCurY() const
869 : {
870 0 : if (pThisTab->mbOldCursorValid)
871 0 : return pThisTab->nOldCurY;
872 : else
873 0 : return pThisTab->nCurY;
874 : }
875 :
876 0 : void ScViewData::SetOldCursor( SCCOL nNewX, SCROW nNewY )
877 : {
878 0 : pThisTab->nOldCurX = nNewX;
879 0 : pThisTab->nOldCurY = nNewY;
880 0 : pThisTab->mbOldCursorValid = true;
881 0 : }
882 :
883 0 : void ScViewData::ResetOldCursor()
884 : {
885 0 : pThisTab->mbOldCursorValid = false;
886 0 : }
887 :
888 0 : Rectangle ScViewData::GetEditArea( ScSplitPos eWhich, SCCOL nPosX, SCROW nPosY,
889 : Window* pWin, const ScPatternAttr* pPattern,
890 : bool bForceToTop )
891 : {
892 0 : return ScEditUtil( pDoc, nPosX, nPosY, nTabNo, GetScrPos(nPosX,nPosY,eWhich,true),
893 0 : pWin, nPPTX, nPPTY, GetZoomX(), GetZoomY() ).
894 0 : GetEditArea( pPattern, bForceToTop );
895 : }
896 :
897 0 : void ScViewData::SetEditEngine( ScSplitPos eWhich,
898 : ScEditEngineDefaulter* pNewEngine,
899 : Window* pWin, SCCOL nNewX, SCROW nNewY )
900 : {
901 0 : bool bLayoutRTL = pDoc->IsLayoutRTL( nTabNo );
902 0 : ScHSplitPos eHWhich = WhichH(eWhich);
903 :
904 0 : bool bWasThere = false;
905 0 : if (pEditView[eWhich])
906 : {
907 : // if the view is already therem don't call anything that changes the cursor position
908 0 : if (bEditActive[eWhich])
909 0 : bWasThere = true;
910 : else
911 0 : pEditView[eWhich]->SetEditEngine(pNewEngine);
912 :
913 0 : if (pEditView[eWhich]->GetWindow() != pWin)
914 : {
915 0 : pEditView[eWhich]->SetWindow(pWin);
916 : OSL_FAIL("EditView Window geaendert");
917 : }
918 : }
919 : else
920 : {
921 0 : pEditView[eWhich] = new EditView( pNewEngine, pWin );
922 : }
923 :
924 : // bei IdleFormat wird manchmal ein Cursor gemalt, wenn die View schon weg ist (23576)
925 :
926 0 : sal_uLong nEC = pNewEngine->GetControlWord();
927 0 : pNewEngine->SetControlWord(nEC & ~EE_CNTRL_DOIDLEFORMAT);
928 :
929 0 : sal_uLong nVC = pEditView[eWhich]->GetControlWord();
930 0 : pEditView[eWhich]->SetControlWord(nVC & ~EV_CNTRL_AUTOSCROLL);
931 :
932 0 : bEditActive[eWhich] = true;
933 :
934 0 : const ScPatternAttr* pPattern = pDoc->GetPattern( nNewX, nNewY, nTabNo );
935 : SvxCellHorJustify eJust = (SvxCellHorJustify)((const SvxHorJustifyItem&)
936 0 : pPattern->GetItem( ATTR_HOR_JUSTIFY )).GetValue();
937 :
938 0 : bool bBreak = ( eJust == SVX_HOR_JUSTIFY_BLOCK ) ||
939 0 : ((SfxBoolItem&)pPattern->GetItem(ATTR_LINEBREAK)).GetValue();
940 :
941 0 : bool bAsianVertical = pNewEngine->IsVertical(); // set by InputHandler
942 :
943 0 : Rectangle aPixRect = ScEditUtil( pDoc, nNewX,nNewY,nTabNo, GetScrPos(nNewX,nNewY,eWhich),
944 0 : pWin, nPPTX,nPPTY,GetZoomX(),GetZoomY() ).
945 0 : GetEditArea( pPattern, true );
946 :
947 : // when right-aligned, leave space for the cursor
948 : // in vertical mode, editing is always right-aligned
949 0 : if ( nEditAdjust == SVX_ADJUST_RIGHT || bAsianVertical )
950 0 : aPixRect.Right() += 1;
951 :
952 0 : Rectangle aOutputArea = pWin->PixelToLogic( aPixRect, GetLogicMode() );
953 0 : pEditView[eWhich]->SetOutputArea( aOutputArea );
954 :
955 0 : if ( bActive && eWhich == GetActivePart() )
956 : {
957 : // keep the part that has the active edit view available after
958 : // switching sheets or reference input on a different part
959 0 : eEditActivePart = eWhich;
960 :
961 : // modify members nEditCol etc. only if also extending for needed area
962 0 : nEditCol = nNewX;
963 0 : nEditRow = nNewY;
964 0 : const ScMergeAttr* pMergeAttr = (ScMergeAttr*)&pPattern->GetItem(ATTR_MERGE);
965 0 : nEditEndCol = nEditCol;
966 0 : if (pMergeAttr->GetColMerge() > 1)
967 0 : nEditEndCol += pMergeAttr->GetColMerge() - 1;
968 0 : nEditEndRow = nEditRow;
969 0 : if (pMergeAttr->GetRowMerge() > 1)
970 0 : nEditEndRow += pMergeAttr->GetRowMerge() - 1;
971 0 : nEditStartCol = nEditCol;
972 :
973 : // For growing use only the alignment value from the attribute, numbers
974 : // (existing or started) with default aligment extend to the right.
975 0 : bool bGrowCentered = ( eJust == SVX_HOR_JUSTIFY_CENTER );
976 0 : bool bGrowToLeft = ( eJust == SVX_HOR_JUSTIFY_RIGHT ); // visual left
977 0 : bool bGrowBackwards = bGrowToLeft; // logical left
978 0 : if ( bLayoutRTL )
979 0 : bGrowBackwards = !bGrowBackwards; // invert on RTL sheet
980 0 : if ( bAsianVertical )
981 0 : bGrowCentered = bGrowToLeft = bGrowBackwards = false; // keep old behavior for asian mode
982 :
983 : long nSizeXPix;
984 0 : if (bBreak && !bAsianVertical)
985 0 : nSizeXPix = aPixRect.GetWidth(); // Papersize -> kein H-Scrolling
986 : else
987 : {
988 : OSL_ENSURE(pView,"keine View fuer EditView");
989 :
990 0 : if ( bGrowCentered )
991 : {
992 : // growing into both directions until one edge is reached
993 : //! should be limited to whole cells in both directions
994 0 : long nLeft = aPixRect.Left();
995 0 : long nRight = pView->GetGridWidth(eHWhich) - aPixRect.Right();
996 0 : nSizeXPix = aPixRect.GetWidth() + 2 * std::min( nLeft, nRight );
997 : }
998 0 : else if ( bGrowToLeft )
999 0 : nSizeXPix = aPixRect.Right(); // space that's available in the window when growing to the left
1000 : else
1001 0 : nSizeXPix = pView->GetGridWidth(eHWhich) - aPixRect.Left();
1002 :
1003 0 : if ( nSizeXPix <= 0 )
1004 0 : nSizeXPix = aPixRect.GetWidth(); // editing outside to the right of the window -> keep cell width
1005 : }
1006 : OSL_ENSURE(pView,"keine View fuer EditView");
1007 0 : long nSizeYPix = pView->GetGridHeight(WhichV(eWhich)) - aPixRect.Top();
1008 0 : if ( nSizeYPix <= 0 )
1009 0 : nSizeYPix = aPixRect.GetHeight(); // editing outside below the window -> keep cell height
1010 :
1011 0 : Size aPaperSize = pView->GetActiveWin()->PixelToLogic( Size( nSizeXPix, nSizeYPix ), GetLogicMode() );
1012 0 : if ( bBreak && !bAsianVertical && SC_MOD()->GetInputOptions().GetTextWysiwyg() )
1013 : {
1014 : // if text is formatted for printer, use the exact same paper width
1015 : // (and same line breaks) as for output.
1016 :
1017 0 : Fraction aFract(1,1);
1018 : Rectangle aUtilRect = ScEditUtil( pDoc,nNewX,nNewY,nTabNo, Point(0,0), pWin,
1019 0 : HMM_PER_TWIPS, HMM_PER_TWIPS, aFract, aFract ).GetEditArea( pPattern, false );
1020 0 : aPaperSize.Width() = aUtilRect.GetWidth();
1021 : }
1022 0 : pNewEngine->SetPaperSize( aPaperSize );
1023 :
1024 : // sichtbarer Ausschnitt
1025 0 : Size aPaper = pNewEngine->GetPaperSize();
1026 0 : Rectangle aVis = pEditView[eWhich]->GetVisArea();
1027 0 : long nDiff = aVis.Right() - aVis.Left();
1028 0 : if ( nEditAdjust == SVX_ADJUST_RIGHT )
1029 : {
1030 0 : aVis.Right() = aPaper.Width() - 1;
1031 0 : bMoveArea = !bLayoutRTL;
1032 : }
1033 0 : else if ( nEditAdjust == SVX_ADJUST_CENTER )
1034 : {
1035 0 : aVis.Right() = ( aPaper.Width() - 1 + nDiff ) / 2;
1036 0 : bMoveArea = true; // always
1037 : }
1038 : else
1039 : {
1040 0 : aVis.Right() = nDiff;
1041 0 : bMoveArea = bLayoutRTL;
1042 : }
1043 0 : aVis.Left() = aVis.Right() - nDiff;
1044 : // #i49561# Important note:
1045 : // The set offset of the visible area of the EditView for centered and
1046 : // right alignment in horizontal layout is consider by instances of
1047 : // class <ScEditObjectViewForwarder> in its methods <LogicToPixel(..)>
1048 : // and <PixelToLogic(..)>. This is needed for the correct visibility
1049 : // of paragraphs in edit mode at the accessibility API.
1050 0 : pEditView[eWhich]->SetVisArea(aVis);
1051 : // UpdateMode has been disabled in ScInputHandler::StartTable
1052 : // must be enabled before EditGrowY (GetTextHeight)
1053 0 : pNewEngine->SetUpdateMode( true );
1054 :
1055 0 : pNewEngine->SetStatusEventHdl( LINK( this, ScViewData, EditEngineHdl ) );
1056 :
1057 0 : EditGrowY( true ); // adjust to existing text content
1058 0 : EditGrowX();
1059 :
1060 0 : Point aDocPos = pEditView[eWhich]->GetWindowPosTopLeft(0);
1061 0 : if (aDocPos.Y() < aOutputArea.Top())
1062 0 : pEditView[eWhich]->Scroll( 0, aOutputArea.Top() - aDocPos.Y() );
1063 : }
1064 :
1065 : // here bEditActive needs to be set already
1066 : // (due to Map-Mode during Paint)
1067 0 : if (!bWasThere)
1068 0 : pNewEngine->InsertView(pEditView[eWhich]);
1069 :
1070 : // background color of the cell
1071 0 : Color aBackCol = ((const SvxBrushItem&)pPattern->GetItem(ATTR_BACKGROUND)).GetColor();
1072 :
1073 0 : ScModule* pScMod = SC_MOD();
1074 0 : if ( aBackCol.GetTransparency() > 0 )
1075 : {
1076 0 : aBackCol.SetColor( pScMod->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor );
1077 : }
1078 0 : pEditView[eWhich]->SetBackgroundColor( aBackCol );
1079 :
1080 0 : pEditView[eWhich]->Invalidate(); // needed?
1081 : // needed, wenn position changed
1082 0 : }
1083 :
1084 0 : IMPL_LINK_NOARG_INLINE_START(ScViewData, EmptyEditHdl)
1085 : {
1086 0 : return 0;
1087 : }
1088 0 : IMPL_LINK_NOARG_INLINE_END(ScViewData, EmptyEditHdl)
1089 :
1090 0 : IMPL_LINK( ScViewData, EditEngineHdl, EditStatus *, pStatus )
1091 : {
1092 0 : sal_uLong nStatus = pStatus->GetStatusWord();
1093 0 : if (nStatus & (EE_STAT_HSCROLL | EE_STAT_TEXTHEIGHTCHANGED | EE_STAT_TEXTWIDTHCHANGED | EE_STAT_CURSOROUT))
1094 : {
1095 0 : EditGrowY();
1096 0 : EditGrowX();
1097 :
1098 0 : if (nStatus & EE_STAT_CURSOROUT)
1099 : {
1100 0 : ScSplitPos eWhich = GetActivePart();
1101 0 : if (pEditView[eWhich])
1102 0 : pEditView[eWhich]->ShowCursor(false);
1103 : }
1104 : }
1105 0 : return 0;
1106 : }
1107 :
1108 0 : void ScViewData::EditGrowX()
1109 : {
1110 0 : ScDocument* pLocalDoc = GetDocument();
1111 :
1112 0 : ScSplitPos eWhich = GetActivePart();
1113 0 : ScHSplitPos eHWhich = WhichH(eWhich);
1114 0 : EditView* pCurView = pEditView[eWhich];
1115 :
1116 0 : if ( !pCurView || !bEditActive[eWhich])
1117 0 : return;
1118 :
1119 0 : bool bLayoutRTL = pLocalDoc->IsLayoutRTL( nTabNo );
1120 :
1121 : ScEditEngineDefaulter* pEngine =
1122 0 : (ScEditEngineDefaulter*) pCurView->GetEditEngine();
1123 0 : Window* pWin = pCurView->GetWindow();
1124 :
1125 0 : SCCOL nLeft = GetPosX(eHWhich);
1126 0 : SCCOL nRight = nLeft + VisibleCellsX(eHWhich);
1127 :
1128 0 : Size aSize = pEngine->GetPaperSize();
1129 0 : Rectangle aArea = pCurView->GetOutputArea();
1130 0 : long nOldRight = aArea.Right();
1131 :
1132 : // Margin ist schon bei der urspruenglichen Breite beruecksichtigt
1133 0 : long nTextWidth = pEngine->CalcTextWidth();
1134 :
1135 0 : bool bChanged = false;
1136 0 : bool bAsianVertical = pEngine->IsVertical();
1137 :
1138 : // get bGrow... variables the same way as in SetEditEngine
1139 0 : const ScPatternAttr* pPattern = pLocalDoc->GetPattern( nEditCol, nEditRow, nTabNo );
1140 : SvxCellHorJustify eJust = (SvxCellHorJustify)((const SvxHorJustifyItem&)
1141 0 : pPattern->GetItem( ATTR_HOR_JUSTIFY )).GetValue();
1142 0 : bool bGrowCentered = ( eJust == SVX_HOR_JUSTIFY_CENTER );
1143 0 : bool bGrowToLeft = ( eJust == SVX_HOR_JUSTIFY_RIGHT ); // visual left
1144 0 : bool bGrowBackwards = bGrowToLeft; // logical left
1145 0 : if ( bLayoutRTL )
1146 0 : bGrowBackwards = !bGrowBackwards; // invert on RTL sheet
1147 0 : if ( bAsianVertical )
1148 0 : bGrowCentered = bGrowToLeft = bGrowBackwards = false; // keep old behavior for asian mode
1149 :
1150 0 : bool bUnevenGrow = false;
1151 0 : if ( bGrowCentered )
1152 : {
1153 0 : while (aArea.GetWidth() + 0 < nTextWidth && ( nEditStartCol > nLeft || nEditEndCol < nRight ) )
1154 : {
1155 0 : long nLogicLeft = 0;
1156 0 : if ( nEditStartCol > nLeft )
1157 : {
1158 0 : --nEditStartCol;
1159 0 : long nLeftPix = ToPixel( pLocalDoc->GetColWidth( nEditStartCol, nTabNo ), nPPTX );
1160 0 : nLogicLeft = pWin->PixelToLogic(Size(nLeftPix,0)).Width();
1161 : }
1162 0 : long nLogicRight = 0;
1163 0 : if ( nEditEndCol < nRight )
1164 : {
1165 0 : ++nEditEndCol;
1166 0 : long nRightPix = ToPixel( pLocalDoc->GetColWidth( nEditEndCol, nTabNo ), nPPTX );
1167 0 : nLogicRight = pWin->PixelToLogic(Size(nRightPix,0)).Width();
1168 : }
1169 :
1170 0 : aArea.Left() -= bLayoutRTL ? nLogicRight : nLogicLeft;
1171 0 : aArea.Right() += bLayoutRTL ? nLogicLeft : nLogicRight;
1172 :
1173 0 : if ( aArea.Right() > aArea.Left() + aSize.Width() - 1 )
1174 : {
1175 0 : long nCenter = ( aArea.Left() + aArea.Right() ) / 2;
1176 0 : long nHalf = aSize.Width() / 2;
1177 0 : aArea.Left() = nCenter - nHalf + 1;
1178 0 : aArea.Right() = nCenter + aSize.Width() - nHalf - 1;
1179 : }
1180 :
1181 0 : bChanged = true;
1182 0 : if ( nLogicLeft != nLogicRight )
1183 0 : bUnevenGrow = true;
1184 : }
1185 : }
1186 0 : else if ( bGrowBackwards )
1187 : {
1188 0 : while (aArea.GetWidth() + 0 < nTextWidth && nEditStartCol > nLeft)
1189 : {
1190 0 : --nEditStartCol;
1191 0 : long nPix = ToPixel( pLocalDoc->GetColWidth( nEditStartCol, nTabNo ), nPPTX );
1192 0 : long nLogicWidth = pWin->PixelToLogic(Size(nPix,0)).Width();
1193 0 : if ( !bLayoutRTL )
1194 0 : aArea.Left() -= nLogicWidth;
1195 : else
1196 0 : aArea.Right() += nLogicWidth;
1197 :
1198 0 : if ( aArea.Right() > aArea.Left() + aSize.Width() - 1 )
1199 : {
1200 0 : if ( !bLayoutRTL )
1201 0 : aArea.Left() = aArea.Right() - aSize.Width() + 1;
1202 : else
1203 0 : aArea.Right() = aArea.Left() + aSize.Width() - 1;
1204 : }
1205 :
1206 0 : bChanged = true;
1207 : }
1208 : }
1209 : else
1210 : {
1211 0 : while (aArea.GetWidth() + 0 < nTextWidth && nEditEndCol < nRight)
1212 : {
1213 0 : ++nEditEndCol;
1214 0 : long nPix = ToPixel( pLocalDoc->GetColWidth( nEditEndCol, nTabNo ), nPPTX );
1215 0 : long nLogicWidth = pWin->PixelToLogic(Size(nPix,0)).Width();
1216 0 : if ( bLayoutRTL )
1217 0 : aArea.Left() -= nLogicWidth;
1218 : else
1219 0 : aArea.Right() += nLogicWidth;
1220 :
1221 0 : if ( aArea.Right() > aArea.Left() + aSize.Width() - 1 )
1222 : {
1223 0 : if ( bLayoutRTL )
1224 0 : aArea.Left() = aArea.Right() - aSize.Width() + 1;
1225 : else
1226 0 : aArea.Right() = aArea.Left() + aSize.Width() - 1;
1227 : }
1228 :
1229 0 : bChanged = true;
1230 : }
1231 : }
1232 :
1233 0 : if (bChanged)
1234 : {
1235 0 : if ( bMoveArea || bGrowCentered || bGrowBackwards || bLayoutRTL )
1236 : {
1237 0 : Rectangle aVis = pCurView->GetVisArea();
1238 :
1239 0 : if ( bGrowCentered )
1240 : {
1241 : // switch to center-aligned (undo?) and reset VisArea to center
1242 :
1243 0 : pEngine->SetDefaultItem( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
1244 :
1245 0 : long nCenter = aSize.Width() / 2;
1246 0 : long nVisSize = aArea.GetWidth();
1247 0 : aVis.Left() = nCenter - nVisSize / 2;
1248 0 : aVis.Right() = aVis.Left() + nVisSize - 1;
1249 : }
1250 0 : else if ( bGrowToLeft )
1251 : {
1252 : // switch to right-aligned (undo?) and reset VisArea to the right
1253 :
1254 0 : pEngine->SetDefaultItem( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
1255 :
1256 0 : aVis.Right() = aSize.Width() - 1;
1257 0 : aVis.Left() = aSize.Width() - aArea.GetWidth(); // with the new, increased area
1258 : }
1259 : else
1260 : {
1261 : // switch to left-aligned (undo?) and reset VisArea to the left
1262 :
1263 0 : pEngine->SetDefaultItem( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
1264 :
1265 0 : long nMove = aVis.Left();
1266 0 : aVis.Left() = 0;
1267 0 : aVis.Right() -= nMove;
1268 : }
1269 0 : pCurView->SetVisArea( aVis );
1270 0 : bMoveArea = false;
1271 : }
1272 :
1273 0 : pCurView->SetOutputArea(aArea);
1274 :
1275 : // In vertical mode, the whole text is moved to the next cell (right-aligned),
1276 : // so everything must be repainted. Otherwise, paint only the new area.
1277 : // If growing in centered alignment, if the cells left and right have different sizes,
1278 : // the whole text will move, and may not even obscure all of the original display.
1279 0 : if ( bUnevenGrow )
1280 : {
1281 0 : aArea.Left() = pWin->PixelToLogic( Point(0,0) ).X();
1282 0 : aArea.Right() = pWin->PixelToLogic( aScrSize ).Width();
1283 : }
1284 0 : else if ( !bAsianVertical && !bGrowToLeft && !bGrowCentered )
1285 0 : aArea.Left() = nOldRight;
1286 0 : pWin->Invalidate(aArea);
1287 : }
1288 : }
1289 :
1290 0 : void ScViewData::EditGrowY( bool bInitial )
1291 : {
1292 0 : ScSplitPos eWhich = GetActivePart();
1293 0 : ScVSplitPos eVWhich = WhichV(eWhich);
1294 0 : EditView* pCurView = pEditView[eWhich];
1295 :
1296 0 : if ( !pCurView || !bEditActive[eWhich])
1297 0 : return;
1298 :
1299 0 : sal_uLong nControl = pEditView[eWhich]->GetControlWord();
1300 0 : if ( nControl & EV_CNTRL_AUTOSCROLL )
1301 : {
1302 : // if end of screen had already been reached and scrolling enabled,
1303 : // don't further try to grow the edit area
1304 :
1305 0 : pCurView->SetOutputArea( pCurView->GetOutputArea() ); // re-align to pixels
1306 0 : return;
1307 : }
1308 :
1309 0 : EditEngine* pEngine = pCurView->GetEditEngine();
1310 0 : Window* pWin = pCurView->GetWindow();
1311 :
1312 0 : SCROW nBottom = GetPosY(eVWhich) + VisibleCellsY(eVWhich);
1313 :
1314 0 : Size aSize = pEngine->GetPaperSize();
1315 0 : Rectangle aArea = pCurView->GetOutputArea();
1316 0 : long nOldBottom = aArea.Bottom();
1317 0 : long nTextHeight = pEngine->GetTextHeight();
1318 :
1319 : // When editing a formula in a cell with optimal height, allow a larger portion
1320 : // to be clipped before extending to following rows, to avoid obscuring cells for
1321 : // reference input (next row is likely to be useful in formulas).
1322 0 : long nAllowedExtra = SC_GROWY_SMALL_EXTRA;
1323 0 : if ( nEditEndRow == nEditRow && !( pDoc->GetRowFlags( nEditRow, nTabNo ) & CR_MANUALSIZE ) &&
1324 0 : pEngine->GetParagraphCount() <= 1 )
1325 : {
1326 : // If the (only) paragraph starts with a '=', it's a formula.
1327 : // If this is the initial call and the text is empty, allow the larger value, too,
1328 : // because this occurs in the normal progress of editing a formula.
1329 : // Subsequent calls with empty text might involve changed attributes (including
1330 : // font height), so they are treated like normal text.
1331 0 : OUString aText = pEngine->GetText( 0 );
1332 0 : if ( ( aText.isEmpty() && bInitial ) || aText.startsWith("=") )
1333 0 : nAllowedExtra = SC_GROWY_BIG_EXTRA;
1334 : }
1335 :
1336 0 : bool bChanged = false;
1337 0 : bool bMaxReached = false;
1338 0 : while (aArea.GetHeight() + nAllowedExtra < nTextHeight && nEditEndRow < nBottom && !bMaxReached)
1339 : {
1340 0 : ++nEditEndRow;
1341 0 : ScDocument* pLocalDoc = GetDocument();
1342 0 : long nPix = ToPixel( pLocalDoc->GetRowHeight( nEditEndRow, nTabNo ), nPPTY );
1343 0 : aArea.Bottom() += pWin->PixelToLogic(Size(0,nPix)).Height();
1344 :
1345 0 : if ( aArea.Bottom() > aArea.Top() + aSize.Height() - 1 )
1346 : {
1347 0 : aArea.Bottom() = aArea.Top() + aSize.Height() - 1;
1348 0 : bMaxReached = true; // don't occupy more cells beyond paper size
1349 : }
1350 :
1351 0 : bChanged = true;
1352 0 : nAllowedExtra = SC_GROWY_SMALL_EXTRA; // larger value is only for first row
1353 : }
1354 :
1355 0 : if (bChanged)
1356 : {
1357 0 : pCurView->SetOutputArea(aArea);
1358 :
1359 0 : if (nEditEndRow >= nBottom || bMaxReached)
1360 : {
1361 0 : if ((nControl & EV_CNTRL_AUTOSCROLL) == 0)
1362 0 : pCurView->SetControlWord( nControl | EV_CNTRL_AUTOSCROLL );
1363 : }
1364 :
1365 0 : aArea.Top() = nOldBottom;
1366 0 : pWin->Invalidate(aArea);
1367 : }
1368 : }
1369 :
1370 0 : void ScViewData::ResetEditView()
1371 : {
1372 0 : EditEngine* pEngine = NULL;
1373 0 : for (sal_uInt16 i=0; i<4; i++)
1374 0 : if (pEditView[i])
1375 : {
1376 0 : if (bEditActive[i])
1377 : {
1378 0 : pEngine = pEditView[i]->GetEditEngine();
1379 0 : pEngine->RemoveView(pEditView[i]);
1380 0 : pEditView[i]->SetOutputArea( Rectangle() );
1381 : }
1382 0 : bEditActive[i] = false;
1383 : }
1384 :
1385 0 : if (pEngine)
1386 0 : pEngine->SetStatusEventHdl( LINK( this, ScViewData, EmptyEditHdl ) );
1387 0 : }
1388 :
1389 0 : void ScViewData::KillEditView()
1390 : {
1391 0 : for (sal_uInt16 i=0; i<4; i++)
1392 0 : if (pEditView[i])
1393 : {
1394 0 : if (bEditActive[i])
1395 0 : pEditView[i]->GetEditEngine()->RemoveView(pEditView[i]);
1396 0 : delete pEditView[i];
1397 0 : pEditView[i] = NULL;
1398 : }
1399 0 : }
1400 :
1401 0 : void ScViewData::GetEditView( ScSplitPos eWhich, EditView*& rViewPtr, SCCOL& rCol, SCROW& rRow )
1402 : {
1403 0 : rViewPtr = pEditView[eWhich];
1404 0 : rCol = nEditCol;
1405 0 : rRow = nEditRow;
1406 0 : }
1407 :
1408 0 : void ScViewData::CreateTabData( SCTAB nNewTab )
1409 : {
1410 0 : EnsureTabDataSize(nNewTab + 1);
1411 :
1412 0 : if (!maTabData[nNewTab])
1413 : {
1414 0 : maTabData[nNewTab] = new ScViewDataTable;
1415 :
1416 0 : maTabData[nNewTab]->eZoomType = eDefZoomType;
1417 0 : maTabData[nNewTab]->aZoomX = aDefZoomX;
1418 0 : maTabData[nNewTab]->aZoomY = aDefZoomY;
1419 0 : maTabData[nNewTab]->aPageZoomX = aDefPageZoomX;
1420 0 : maTabData[nNewTab]->aPageZoomY = aDefPageZoomY;
1421 : }
1422 0 : }
1423 :
1424 0 : void ScViewData::CreateSelectedTabData()
1425 : {
1426 0 : ScMarkData::iterator itr = mpMarkData->begin(), itrEnd = mpMarkData->end();
1427 0 : for (; itr != itrEnd; ++itr)
1428 0 : CreateTabData(*itr);
1429 0 : }
1430 :
1431 0 : void ScViewData::EnsureTabDataSize(size_t nSize)
1432 : {
1433 0 : if (nSize >= maTabData.size())
1434 : {
1435 0 : size_t n = nSize - maTabData.size() + 1;
1436 0 : maTabData.insert(maTabData.end(), n, NULL);
1437 : }
1438 0 : }
1439 :
1440 0 : void ScViewData::SetTabNo( SCTAB nNewTab )
1441 : {
1442 0 : if (!ValidTab(nNewTab))
1443 : {
1444 : OSL_FAIL("falsche Tabellennummer");
1445 0 : return;
1446 : }
1447 :
1448 0 : nTabNo = nNewTab;
1449 0 : CreateTabData(nTabNo);
1450 0 : pThisTab = maTabData[nTabNo];
1451 :
1452 0 : CalcPPT(); // for common column width correction
1453 0 : RecalcPixPos(); //! nicht immer noetig!
1454 : }
1455 :
1456 0 : void ScViewData::SetActivePart( ScSplitPos eNewActive )
1457 : {
1458 0 : pThisTab->eWhichActive = eNewActive;
1459 0 : }
1460 :
1461 0 : Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScHSplitPos eWhich ) const
1462 : {
1463 : OSL_ENSURE( eWhich==SC_SPLIT_LEFT || eWhich==SC_SPLIT_RIGHT, "Falsche Position" );
1464 0 : ScSplitPos ePos = ( eWhich == SC_SPLIT_LEFT ) ? SC_SPLIT_BOTTOMLEFT : SC_SPLIT_BOTTOMRIGHT;
1465 0 : return GetScrPos( nWhereX, nWhereY, ePos );
1466 : }
1467 :
1468 0 : Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScVSplitPos eWhich ) const
1469 : {
1470 : OSL_ENSURE( eWhich==SC_SPLIT_TOP || eWhich==SC_SPLIT_BOTTOM, "Falsche Position" );
1471 0 : ScSplitPos ePos = ( eWhich == SC_SPLIT_TOP ) ? SC_SPLIT_TOPLEFT : SC_SPLIT_BOTTOMLEFT;
1472 0 : return GetScrPos( nWhereX, nWhereY, ePos );
1473 : }
1474 :
1475 0 : Point ScViewData::GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich,
1476 : bool bAllowNeg ) const
1477 : {
1478 0 : ScHSplitPos eWhichX = SC_SPLIT_LEFT;
1479 0 : ScVSplitPos eWhichY = SC_SPLIT_BOTTOM;
1480 0 : switch( eWhich )
1481 : {
1482 : case SC_SPLIT_TOPLEFT:
1483 0 : eWhichX = SC_SPLIT_LEFT;
1484 0 : eWhichY = SC_SPLIT_TOP;
1485 0 : break;
1486 : case SC_SPLIT_TOPRIGHT:
1487 0 : eWhichX = SC_SPLIT_RIGHT;
1488 0 : eWhichY = SC_SPLIT_TOP;
1489 0 : break;
1490 : case SC_SPLIT_BOTTOMLEFT:
1491 0 : eWhichX = SC_SPLIT_LEFT;
1492 0 : eWhichY = SC_SPLIT_BOTTOM;
1493 0 : break;
1494 : case SC_SPLIT_BOTTOMRIGHT:
1495 0 : eWhichX = SC_SPLIT_RIGHT;
1496 0 : eWhichY = SC_SPLIT_BOTTOM;
1497 0 : break;
1498 : }
1499 :
1500 0 : if (pView)
1501 : {
1502 0 : ((ScViewData*)this)->aScrSize.Width() = pView->GetGridWidth(eWhichX);
1503 0 : ((ScViewData*)this)->aScrSize.Height() = pView->GetGridHeight(eWhichY);
1504 : }
1505 :
1506 : sal_uInt16 nTSize;
1507 :
1508 0 : SCCOL nPosX = GetPosX(eWhichX);
1509 : SCCOL nX;
1510 :
1511 0 : long nScrPosX=0;
1512 0 : if (nWhereX >= nPosX)
1513 0 : for (nX=nPosX; nX<nWhereX && (bAllowNeg || nScrPosX<=aScrSize.Width()); nX++)
1514 : {
1515 0 : if ( nX > MAXCOL )
1516 0 : nScrPosX = 65535;
1517 : else
1518 : {
1519 0 : nTSize = pDoc->GetColWidth( nX, nTabNo );
1520 0 : if (nTSize)
1521 : {
1522 0 : long nSizeXPix = ToPixel( nTSize, nPPTX );
1523 0 : nScrPosX += nSizeXPix;
1524 : }
1525 : }
1526 : }
1527 0 : else if (bAllowNeg)
1528 0 : for (nX=nPosX; nX>nWhereX;)
1529 : {
1530 0 : --nX;
1531 0 : nTSize = pDoc->GetColWidth( nX, nTabNo );
1532 0 : if (nTSize)
1533 : {
1534 0 : long nSizeXPix = ToPixel( nTSize, nPPTX );
1535 0 : nScrPosX -= nSizeXPix;
1536 : }
1537 : }
1538 :
1539 0 : SCROW nPosY = GetPosY(eWhichY);
1540 : SCROW nY;
1541 :
1542 0 : long nScrPosY=0;
1543 0 : if (nWhereY >= nPosY)
1544 0 : for (nY=nPosY; nY<nWhereY && (bAllowNeg || nScrPosY<=aScrSize.Height()); nY++)
1545 : {
1546 0 : if ( nY > MAXROW )
1547 0 : nScrPosY = 65535;
1548 : else
1549 : {
1550 0 : nTSize = pDoc->GetRowHeight( nY, nTabNo );
1551 0 : if (nTSize)
1552 : {
1553 0 : long nSizeYPix = ToPixel( nTSize, nPPTY );
1554 0 : nScrPosY += nSizeYPix;
1555 : }
1556 0 : else if ( nY < MAXROW )
1557 : {
1558 : // skip multiple hidden rows (forward only for now)
1559 0 : SCROW nNext = pDoc->FirstVisibleRow(nY + 1, MAXROW, nTabNo);
1560 0 : if ( nNext > MAXROW )
1561 0 : nY = MAXROW;
1562 : else
1563 0 : nY = nNext - 1; // +=nDir advances to next visible row
1564 : }
1565 : }
1566 : }
1567 0 : else if (bAllowNeg)
1568 0 : for (nY=nPosY; nY>nWhereY;)
1569 : {
1570 0 : --nY;
1571 0 : nTSize = pDoc->GetRowHeight( nY, nTabNo );
1572 0 : if (nTSize)
1573 : {
1574 0 : long nSizeYPix = ToPixel( nTSize, nPPTY );
1575 0 : nScrPosY -= nSizeYPix;
1576 : }
1577 : }
1578 :
1579 0 : if ( pDoc->IsLayoutRTL( nTabNo ) )
1580 : {
1581 : // mirror horizontal position
1582 0 : nScrPosX = aScrSize.Width() - 1 - nScrPosX;
1583 : }
1584 :
1585 0 : if (nScrPosX > 32767) nScrPosX=32767;
1586 0 : if (nScrPosY > 32767) nScrPosY=32767;
1587 0 : return Point( nScrPosX, nScrPosY );
1588 : }
1589 :
1590 :
1591 : // Number of cells on a screen
1592 :
1593 :
1594 0 : SCCOL ScViewData::CellsAtX( SCsCOL nPosX, SCsCOL nDir, ScHSplitPos eWhichX, sal_uInt16 nScrSizeX ) const
1595 : {
1596 : OSL_ENSURE( nDir==1 || nDir==-1, "falscher CellsAt Aufruf" );
1597 :
1598 0 : if (pView)
1599 0 : ((ScViewData*)this)->aScrSize.Width() = pView->GetGridWidth(eWhichX);
1600 :
1601 : SCsCOL nX;
1602 0 : sal_uInt16 nScrPosX = 0;
1603 0 : if (nScrSizeX == SC_SIZE_NONE) nScrSizeX = (sal_uInt16) aScrSize.Width();
1604 :
1605 0 : if (nDir==1)
1606 0 : nX = nPosX; // vorwaerts
1607 : else
1608 0 : nX = nPosX-1; // rueckwaerts
1609 :
1610 0 : bool bOut = false;
1611 0 : for ( ; nScrPosX<=nScrSizeX && !bOut; nX = sal::static_int_cast<SCsCOL>(nX + nDir) )
1612 : {
1613 0 : SCsCOL nColNo = nX;
1614 0 : if ( nColNo < 0 || nColNo > MAXCOL )
1615 0 : bOut = true;
1616 : else
1617 : {
1618 0 : sal_uInt16 nTSize = pDoc->GetColWidth( nColNo, nTabNo );
1619 0 : if (nTSize)
1620 : {
1621 0 : long nSizeXPix = ToPixel( nTSize, nPPTX );
1622 0 : nScrPosX = sal::static_int_cast<sal_uInt16>( nScrPosX + (sal_uInt16) nSizeXPix );
1623 : }
1624 : }
1625 : }
1626 :
1627 0 : if (nDir==1)
1628 0 : nX = sal::static_int_cast<SCsCOL>( nX - nPosX );
1629 : else
1630 0 : nX = (nPosX-1)-nX;
1631 :
1632 0 : if (nX>0) --nX;
1633 0 : return nX;
1634 : }
1635 :
1636 0 : SCROW ScViewData::CellsAtY( SCsROW nPosY, SCsROW nDir, ScVSplitPos eWhichY, sal_uInt16 nScrSizeY ) const
1637 : {
1638 : OSL_ENSURE( nDir==1 || nDir==-1, "falscher CellsAt Aufruf" );
1639 :
1640 0 : if (pView)
1641 0 : ((ScViewData*)this)->aScrSize.Height() = pView->GetGridHeight(eWhichY);
1642 :
1643 0 : if (nScrSizeY == SC_SIZE_NONE) nScrSizeY = (sal_uInt16) aScrSize.Height();
1644 :
1645 : SCROW nY;
1646 :
1647 0 : if (nDir==1)
1648 : {
1649 : // forward
1650 0 : nY = nPosY;
1651 0 : long nScrPosY = 0;
1652 0 : AddPixelsWhile( nScrPosY, nScrSizeY, nY, MAXROW, nPPTY, pDoc, nTabNo);
1653 : // Original loop ended on last evaluated +1 or if that was MAXROW even
1654 : // on MAXROW+2.
1655 0 : nY += (nY == MAXROW ? 2 : 1);
1656 0 : nY -= nPosY;
1657 : }
1658 : else
1659 : {
1660 : // backward
1661 0 : nY = nPosY-1;
1662 0 : long nScrPosY = 0;
1663 0 : AddPixelsWhileBackward( nScrPosY, nScrSizeY, nY, 0, nPPTY, pDoc, nTabNo);
1664 : // Original loop ended on last evaluated -1 or if that was 0 even on
1665 : // -2.
1666 0 : nY -= (nY == 0 ? 2 : 1);
1667 0 : nY = (nPosY-1)-nY;
1668 : }
1669 :
1670 0 : if (nY>0) --nY;
1671 0 : return nY;
1672 : }
1673 :
1674 0 : SCCOL ScViewData::VisibleCellsX( ScHSplitPos eWhichX ) const
1675 : {
1676 0 : return CellsAtX( GetPosX( eWhichX ), 1, eWhichX, SC_SIZE_NONE );
1677 : }
1678 :
1679 0 : SCROW ScViewData::VisibleCellsY( ScVSplitPos eWhichY ) const
1680 : {
1681 0 : return CellsAtY( GetPosY( eWhichY ), 1, eWhichY, SC_SIZE_NONE );
1682 : }
1683 :
1684 0 : SCCOL ScViewData::PrevCellsX( ScHSplitPos eWhichX ) const
1685 : {
1686 0 : return CellsAtX( GetPosX( eWhichX ), -1, eWhichX, SC_SIZE_NONE );
1687 : }
1688 :
1689 0 : SCROW ScViewData::PrevCellsY( ScVSplitPos eWhichY ) const
1690 : {
1691 0 : return CellsAtY( GetPosY( eWhichY ), -1, eWhichY, SC_SIZE_NONE );
1692 : }
1693 :
1694 :
1695 0 : bool ScViewData::GetMergeSizePixel( SCCOL nX, SCROW nY, long& rSizeXPix, long& rSizeYPix ) const
1696 : {
1697 0 : const ScMergeAttr* pMerge = (const ScMergeAttr*) pDoc->GetAttr( nX,nY,nTabNo, ATTR_MERGE );
1698 0 : if ( pMerge->GetColMerge() > 1 || pMerge->GetRowMerge() > 1 )
1699 : {
1700 0 : long nOutWidth = 0;
1701 0 : long nOutHeight = 0;
1702 0 : SCCOL nCountX = pMerge->GetColMerge();
1703 0 : for (SCCOL i=0; i<nCountX; i++)
1704 0 : nOutWidth += ToPixel( pDoc->GetColWidth(nX+i,nTabNo), nPPTX );
1705 0 : SCROW nCountY = pMerge->GetRowMerge();
1706 :
1707 0 : for (SCROW nRow = nY; nRow <= nY+nCountY-1; ++nRow)
1708 : {
1709 0 : SCROW nLastRow = nRow;
1710 0 : if (pDoc->RowHidden(nRow, nTabNo, NULL, &nLastRow))
1711 : {
1712 0 : nRow = nLastRow;
1713 0 : continue;
1714 : }
1715 :
1716 0 : sal_uInt16 nHeight = pDoc->GetRowHeight(nRow, nTabNo);
1717 0 : nOutHeight += ToPixel(nHeight, nPPTY);
1718 : }
1719 :
1720 0 : rSizeXPix = nOutWidth;
1721 0 : rSizeYPix = nOutHeight;
1722 0 : return true;
1723 : }
1724 : else
1725 : {
1726 0 : rSizeXPix = ToPixel( pDoc->GetColWidth( nX, nTabNo ), nPPTX );
1727 0 : rSizeYPix = ToPixel( pDoc->GetRowHeight( nY, nTabNo ), nPPTY );
1728 0 : return false;
1729 : }
1730 : }
1731 :
1732 0 : bool ScViewData::GetPosFromPixel( long nClickX, long nClickY, ScSplitPos eWhich,
1733 : SCsCOL& rPosX, SCsROW& rPosY,
1734 : bool bTestMerge, bool bRepair, bool bNextIfLarge )
1735 : {
1736 : // special handling of 0 is now in ScViewFunctionSet::SetCursorAtPoint
1737 :
1738 0 : ScHSplitPos eHWhich = WhichH(eWhich);
1739 0 : ScVSplitPos eVWhich = WhichV(eWhich);
1740 :
1741 0 : if ( pDoc->IsLayoutRTL( nTabNo ) )
1742 : {
1743 : // mirror horizontal position
1744 0 : if (pView)
1745 0 : aScrSize.Width() = pView->GetGridWidth(eHWhich);
1746 0 : nClickX = aScrSize.Width() - 1 - nClickX;
1747 : }
1748 :
1749 0 : SCsCOL nStartPosX = GetPosX(eHWhich);
1750 0 : SCsROW nStartPosY = GetPosY(eVWhich);
1751 0 : rPosX = nStartPosX;
1752 0 : rPosY = nStartPosY;
1753 0 : long nScrX = 0;
1754 0 : long nScrY = 0;
1755 :
1756 0 : if (nClickX > 0)
1757 : {
1758 0 : while ( rPosX<=MAXCOL && nClickX >= nScrX )
1759 : {
1760 0 : nScrX += ToPixel( pDoc->GetColWidth( rPosX, nTabNo ), nPPTX );
1761 0 : ++rPosX;
1762 : }
1763 0 : --rPosX;
1764 : }
1765 : else
1766 : {
1767 0 : while ( rPosX>0 && nClickX < nScrX )
1768 : {
1769 0 : --rPosX;
1770 0 : nScrX -= ToPixel( pDoc->GetColWidth( rPosX, nTabNo ), nPPTX );
1771 : }
1772 : }
1773 :
1774 0 : if (nClickY > 0)
1775 0 : AddPixelsWhile( nScrY, nClickY, rPosY, MAXROW, nPPTY, pDoc, nTabNo );
1776 : else
1777 : {
1778 : /* TODO: could need some "SubPixelsWhileBackward" method */
1779 0 : while ( rPosY>0 && nClickY < nScrY )
1780 : {
1781 0 : --rPosY;
1782 0 : nScrY -= ToPixel( pDoc->GetRowHeight( rPosY, nTabNo ), nPPTY );
1783 : }
1784 : }
1785 :
1786 0 : if (bNextIfLarge) // cells to big?
1787 : {
1788 0 : if ( rPosX == nStartPosX && nClickX > 0 )
1789 : {
1790 0 : if (pView)
1791 0 : aScrSize.Width() = pView->GetGridWidth(eHWhich);
1792 0 : if ( nClickX > aScrSize.Width() )
1793 0 : ++rPosX;
1794 : }
1795 0 : if ( rPosY == nStartPosY && nClickY > 0 )
1796 : {
1797 0 : if (pView)
1798 0 : aScrSize.Height() = pView->GetGridHeight(eVWhich);
1799 0 : if ( nClickY > aScrSize.Height() )
1800 0 : ++rPosY;
1801 : }
1802 : }
1803 :
1804 0 : if (rPosX<0) rPosX=0;
1805 0 : if (rPosX>MAXCOL) rPosX=MAXCOL;
1806 0 : if (rPosY<0) rPosY=0;
1807 0 : if (rPosY>MAXROW) rPosY=MAXROW;
1808 :
1809 0 : if (bTestMerge)
1810 : {
1811 : // public method to adapt position
1812 0 : SCCOL nOrigX = rPosX;
1813 0 : SCROW nOrigY = rPosY;
1814 0 : pDoc->SkipOverlapped(rPosX, rPosY, nTabNo);
1815 0 : bool bHOver = (nOrigX != rPosX);
1816 0 : bool bVOver = (nOrigY != rPosY);
1817 :
1818 0 : if ( bRepair && ( bHOver || bVOver ) )
1819 : {
1820 : const ScMergeAttr* pMerge = (const ScMergeAttr*)
1821 0 : pDoc->GetAttr( rPosX, rPosY, nTabNo, ATTR_MERGE );
1822 0 : if ( ( bHOver && pMerge->GetColMerge() <= 1 ) ||
1823 0 : ( bVOver && pMerge->GetRowMerge() <= 1 ) )
1824 : {
1825 : OSL_FAIL("Merge-Fehler gefunden");
1826 :
1827 0 : pDoc->RemoveFlagsTab( 0,0, MAXCOL,MAXROW, nTabNo, SC_MF_HOR | SC_MF_VER );
1828 0 : SCCOL nEndCol = MAXCOL;
1829 0 : SCROW nEndRow = MAXROW;
1830 0 : pDoc->ExtendMerge( 0,0, nEndCol,nEndRow, nTabNo, true );
1831 0 : if (pDocShell)
1832 0 : pDocShell->PostPaint( ScRange(0,0,nTabNo,MAXCOL,MAXROW,nTabNo), PAINT_GRID );
1833 : }
1834 : }
1835 : }
1836 :
1837 0 : return false;
1838 : }
1839 :
1840 0 : void ScViewData::GetMouseQuadrant( const Point& rClickPos, ScSplitPos eWhich,
1841 : SCsCOL nPosX, SCsROW nPosY, bool& rLeft, bool& rTop )
1842 : {
1843 0 : bool bLayoutRTL = pDoc->IsLayoutRTL( nTabNo );
1844 0 : long nLayoutSign = bLayoutRTL ? -1 : 1;
1845 :
1846 0 : Point aCellStart = GetScrPos( nPosX, nPosY, eWhich, true );
1847 : long nSizeX;
1848 : long nSizeY;
1849 0 : GetMergeSizePixel( nPosX, nPosY, nSizeX, nSizeY );
1850 0 : rLeft = ( rClickPos.X() - aCellStart.X() ) * nLayoutSign <= nSizeX / 2;
1851 0 : rTop = rClickPos.Y() - aCellStart.Y() <= nSizeY / 2;
1852 0 : }
1853 :
1854 0 : void ScViewData::SetPosX( ScHSplitPos eWhich, SCCOL nNewPosX )
1855 : {
1856 0 : if (nNewPosX != 0)
1857 : {
1858 0 : SCCOL nOldPosX = pThisTab->nPosX[eWhich];
1859 0 : long nTPosX = pThisTab->nTPosX[eWhich];
1860 0 : long nPixPosX = pThisTab->nPixPosX[eWhich];
1861 : SCCOL i;
1862 0 : if ( nNewPosX > nOldPosX )
1863 0 : for ( i=nOldPosX; i<nNewPosX; i++ )
1864 : {
1865 0 : long nThis = pDoc->GetColWidth( i,nTabNo );
1866 0 : nTPosX -= nThis;
1867 0 : nPixPosX -= ToPixel(sal::static_int_cast<sal_uInt16>(nThis), nPPTX);
1868 : }
1869 : else
1870 0 : for ( i=nNewPosX; i<nOldPosX; i++ )
1871 : {
1872 0 : long nThis = pDoc->GetColWidth( i,nTabNo );
1873 0 : nTPosX += nThis;
1874 0 : nPixPosX += ToPixel(sal::static_int_cast<sal_uInt16>(nThis), nPPTX);
1875 : }
1876 :
1877 0 : pThisTab->nPosX[eWhich] = nNewPosX;
1878 0 : pThisTab->nTPosX[eWhich] = nTPosX;
1879 0 : pThisTab->nMPosX[eWhich] = (long) (nTPosX * HMM_PER_TWIPS);
1880 0 : pThisTab->nPixPosX[eWhich] = nPixPosX;
1881 : }
1882 : else
1883 0 : pThisTab->nPixPosX[eWhich] =
1884 0 : pThisTab->nTPosX[eWhich] =
1885 0 : pThisTab->nMPosX[eWhich] =
1886 0 : pThisTab->nPosX[eWhich] = 0;
1887 0 : }
1888 :
1889 0 : void ScViewData::SetPosY( ScVSplitPos eWhich, SCROW nNewPosY )
1890 : {
1891 0 : if (nNewPosY != 0)
1892 : {
1893 0 : SCROW nOldPosY = pThisTab->nPosY[eWhich];
1894 0 : long nTPosY = pThisTab->nTPosY[eWhich];
1895 0 : long nPixPosY = pThisTab->nPixPosY[eWhich];
1896 : SCROW i, nHeightEndRow;
1897 0 : if ( nNewPosY > nOldPosY )
1898 0 : for ( i=nOldPosY; i<nNewPosY; i++ )
1899 : {
1900 0 : long nThis = pDoc->GetRowHeight( i, nTabNo, NULL, &nHeightEndRow );
1901 0 : SCROW nRows = std::min( nNewPosY, nHeightEndRow + 1) - i;
1902 0 : i = nHeightEndRow;
1903 0 : nTPosY -= nThis * nRows;
1904 0 : nPixPosY -= ToPixel(sal::static_int_cast<sal_uInt16>(nThis), nPPTY) * nRows;
1905 : }
1906 : else
1907 0 : for ( i=nNewPosY; i<nOldPosY; i++ )
1908 : {
1909 0 : long nThis = pDoc->GetRowHeight( i, nTabNo, NULL, &nHeightEndRow );
1910 0 : SCROW nRows = std::min( nOldPosY, nHeightEndRow + 1) - i;
1911 0 : i = nHeightEndRow;
1912 0 : nTPosY += nThis * nRows;
1913 0 : nPixPosY += ToPixel(sal::static_int_cast<sal_uInt16>(nThis), nPPTY) * nRows;
1914 : }
1915 :
1916 0 : pThisTab->nPosY[eWhich] = nNewPosY;
1917 0 : pThisTab->nTPosY[eWhich] = nTPosY;
1918 0 : pThisTab->nMPosY[eWhich] = (long) (nTPosY * HMM_PER_TWIPS);
1919 0 : pThisTab->nPixPosY[eWhich] = nPixPosY;
1920 : }
1921 : else
1922 0 : pThisTab->nPixPosY[eWhich] =
1923 0 : pThisTab->nTPosY[eWhich] =
1924 0 : pThisTab->nMPosY[eWhich] =
1925 0 : pThisTab->nPosY[eWhich] = 0;
1926 0 : }
1927 :
1928 0 : void ScViewData::RecalcPixPos() // after zoom changes
1929 : {
1930 0 : for (sal_uInt16 eWhich=0; eWhich<2; eWhich++)
1931 : {
1932 0 : long nPixPosX = 0;
1933 0 : SCCOL nPosX = pThisTab->nPosX[eWhich];
1934 0 : for (SCCOL i=0; i<nPosX; i++)
1935 0 : nPixPosX -= ToPixel(pDoc->GetColWidth(i,nTabNo), nPPTX);
1936 0 : pThisTab->nPixPosX[eWhich] = nPixPosX;
1937 :
1938 0 : long nPixPosY = 0;
1939 0 : SCROW nPosY = pThisTab->nPosY[eWhich];
1940 0 : for (SCROW j=0; j<nPosY; j++)
1941 0 : nPixPosY -= ToPixel(pDoc->GetRowHeight(j,nTabNo), nPPTY);
1942 0 : pThisTab->nPixPosY[eWhich] = nPixPosY;
1943 : }
1944 0 : }
1945 :
1946 0 : const MapMode& ScViewData::GetLogicMode( ScSplitPos eWhich )
1947 : {
1948 0 : aLogicMode.SetOrigin( Point( pThisTab->nMPosX[WhichH(eWhich)],
1949 0 : pThisTab->nMPosY[WhichV(eWhich)] ) );
1950 0 : return aLogicMode;
1951 : }
1952 :
1953 0 : const MapMode& ScViewData::GetLogicMode()
1954 : {
1955 0 : aLogicMode.SetOrigin( Point() );
1956 0 : return aLogicMode;
1957 : }
1958 :
1959 0 : void ScViewData::SetScreen( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 )
1960 : {
1961 : SCCOL nCol;
1962 : SCROW nRow;
1963 : sal_uInt16 nTSize;
1964 : long nSizePix;
1965 0 : long nScrPosX = 0;
1966 0 : long nScrPosY = 0;
1967 :
1968 0 : SetActivePart( SC_SPLIT_BOTTOMLEFT );
1969 0 : SetPosX( SC_SPLIT_LEFT, nCol1 );
1970 0 : SetPosY( SC_SPLIT_BOTTOM, nRow1 );
1971 :
1972 0 : for (nCol=nCol1; nCol<=nCol2; nCol++)
1973 : {
1974 0 : nTSize = pDoc->GetColWidth( nCol, nTabNo );
1975 0 : if (nTSize)
1976 : {
1977 0 : nSizePix = ToPixel( nTSize, nPPTX );
1978 0 : nScrPosX += (sal_uInt16) nSizePix;
1979 : }
1980 : }
1981 :
1982 0 : for (nRow=nRow1; nRow<=nRow2; nRow++)
1983 : {
1984 0 : nTSize = pDoc->GetRowHeight( nRow, nTabNo );
1985 0 : if (nTSize)
1986 : {
1987 0 : nSizePix = ToPixel( nTSize, nPPTY );
1988 0 : nScrPosY += (sal_uInt16) nSizePix;
1989 : }
1990 : }
1991 :
1992 0 : aScrSize = Size( nScrPosX, nScrPosY );
1993 0 : }
1994 :
1995 0 : void ScViewData::SetScreenPos( const Point& rVisAreaStart )
1996 : {
1997 : long nSize;
1998 : long nTwips;
1999 : long nAdd;
2000 : bool bEnd;
2001 :
2002 0 : nSize = 0;
2003 0 : nTwips = (long) (rVisAreaStart.X() / HMM_PER_TWIPS);
2004 0 : if ( pDoc->IsLayoutRTL( nTabNo ) )
2005 0 : nTwips = -nTwips;
2006 0 : SCCOL nX1 = 0;
2007 0 : bEnd = false;
2008 0 : while (!bEnd)
2009 : {
2010 0 : nAdd = (long) pDoc->GetColWidth(nX1,nTabNo);
2011 0 : if (nSize+nAdd <= nTwips+1 && nX1<MAXCOL)
2012 : {
2013 0 : nSize += nAdd;
2014 0 : ++nX1;
2015 : }
2016 : else
2017 0 : bEnd = true;
2018 : }
2019 :
2020 0 : nSize = 0;
2021 0 : nTwips = (long) (rVisAreaStart.Y() / HMM_PER_TWIPS);
2022 0 : SCROW nY1 = 0;
2023 0 : bEnd = false;
2024 0 : while (!bEnd)
2025 : {
2026 0 : nAdd = (long) pDoc->GetRowHeight(nY1,nTabNo);
2027 0 : if (nSize+nAdd <= nTwips+1 && nY1<MAXROW)
2028 : {
2029 0 : nSize += nAdd;
2030 0 : ++nY1;
2031 : }
2032 : else
2033 0 : bEnd = true;
2034 : }
2035 :
2036 0 : SetActivePart( SC_SPLIT_BOTTOMLEFT );
2037 0 : SetPosX( SC_SPLIT_LEFT, nX1 );
2038 0 : SetPosY( SC_SPLIT_BOTTOM, nY1 );
2039 :
2040 0 : SetCurX( nX1 );
2041 0 : SetCurY( nY1 );
2042 0 : }
2043 :
2044 0 : void ScViewData::SetScreen( const Rectangle& rVisArea )
2045 : {
2046 0 : SetScreenPos( rVisArea.TopLeft() );
2047 :
2048 : // here without GetOutputFactor(), since it's for the output into a Metafile
2049 :
2050 0 : aScrSize = rVisArea.GetSize();
2051 0 : aScrSize.Width() = (long)
2052 0 : ( aScrSize.Width() * ScGlobal::nScreenPPTX / HMM_PER_TWIPS );
2053 0 : aScrSize.Height() = (long)
2054 0 : ( aScrSize.Height() * ScGlobal::nScreenPPTY / HMM_PER_TWIPS );
2055 0 : }
2056 :
2057 0 : SfxObjectShell* ScViewData::GetSfxDocShell() const
2058 : {
2059 0 : return pDocShell;
2060 : }
2061 :
2062 0 : ScDocFunc& ScViewData::GetDocFunc() const
2063 : {
2064 0 : return pDocShell->GetDocFunc();
2065 : }
2066 :
2067 0 : SfxBindings& ScViewData::GetBindings()
2068 : {
2069 : OSL_ENSURE( pViewShell, "GetBindings() without ViewShell" );
2070 0 : return pViewShell->GetViewFrame()->GetBindings();
2071 : }
2072 :
2073 0 : SfxDispatcher& ScViewData::GetDispatcher()
2074 : {
2075 : OSL_ENSURE( pViewShell, "GetDispatcher() without ViewShell" );
2076 0 : return *pViewShell->GetViewFrame()->GetDispatcher();
2077 : }
2078 :
2079 0 : ScMarkData& ScViewData::GetMarkData()
2080 : {
2081 0 : return *mpMarkData;
2082 : }
2083 :
2084 0 : const ScMarkData& ScViewData::GetMarkData() const
2085 : {
2086 0 : return *mpMarkData;
2087 : }
2088 :
2089 0 : Window* ScViewData::GetDialogParent()
2090 : {
2091 : OSL_ENSURE( pViewShell, "GetDialogParent() ohne ViewShell" );
2092 0 : return pViewShell->GetDialogParent();
2093 : }
2094 :
2095 0 : Window* ScViewData::GetActiveWin()
2096 : {
2097 : OSL_ENSURE( pView, "GetActiveWin() ohne View" );
2098 0 : return pView->GetActiveWin();
2099 : }
2100 :
2101 0 : ScDrawView* ScViewData::GetScDrawView()
2102 : {
2103 : OSL_ENSURE( pView, "GetScDrawView() ohne View" );
2104 0 : return pView->GetScDrawView();
2105 : }
2106 :
2107 0 : bool ScViewData::IsMinimized()
2108 : {
2109 : OSL_ENSURE( pView, "IsMinimized() ohne View" );
2110 0 : return pView->IsMinimized();
2111 : }
2112 :
2113 0 : void ScViewData::UpdateScreenZoom( const Fraction& rNewX, const Fraction& rNewY )
2114 : {
2115 0 : Fraction aOldX = GetZoomX();
2116 0 : Fraction aOldY = GetZoomY();
2117 :
2118 0 : SetZoom( rNewX, rNewY, false );
2119 :
2120 0 : Fraction aWidth = GetZoomX();
2121 0 : aWidth *= Fraction( aScrSize.Width(),1 );
2122 0 : aWidth /= aOldX;
2123 :
2124 0 : Fraction aHeight = GetZoomY();
2125 0 : aHeight *= Fraction( aScrSize.Height(),1 );
2126 0 : aHeight /= aOldY;
2127 :
2128 0 : aScrSize.Width() = (long) aWidth;
2129 0 : aScrSize.Height() = (long) aHeight;
2130 0 : }
2131 :
2132 0 : void ScViewData::CalcPPT()
2133 : {
2134 0 : nPPTX = ScGlobal::nScreenPPTX * (double) GetZoomX();
2135 0 : if (pDocShell)
2136 0 : nPPTX = nPPTX / pDocShell->GetOutputFactor(); // Faktor ist Drucker zu Bildschirm
2137 0 : nPPTY = ScGlobal::nScreenPPTY * (double) GetZoomY();
2138 :
2139 : // if detective objects are present,
2140 : // try to adjust horizontal scale so the most common column width has minimal rounding errors,
2141 : // to avoid differences between cell and drawing layer output
2142 :
2143 0 : if ( pDoc && pDoc->HasDetectiveObjects(nTabNo) )
2144 : {
2145 0 : SCCOL nEndCol = 0;
2146 0 : SCROW nDummy = 0;
2147 0 : pDoc->GetTableArea( nTabNo, nEndCol, nDummy );
2148 0 : if (nEndCol<20)
2149 0 : nEndCol = 20; // same end position as when determining draw scale
2150 :
2151 0 : sal_uInt16 nTwips = pDoc->GetCommonWidth( nEndCol, nTabNo );
2152 0 : if ( nTwips )
2153 : {
2154 0 : double fOriginal = nTwips * nPPTX;
2155 0 : if ( fOriginal < static_cast<double>(nEndCol) )
2156 : {
2157 : // if one column is smaller than the column count,
2158 : // rounding errors are likely to add up to a whole column.
2159 :
2160 0 : double fRounded = ::rtl::math::approxFloor( fOriginal + 0.5 );
2161 0 : if ( fRounded > 0.0 )
2162 : {
2163 0 : double fScale = fRounded / fOriginal + 1E-6;
2164 0 : if ( fScale >= 0.9 && fScale <= 1.1 )
2165 0 : nPPTX *= fScale;
2166 : }
2167 : }
2168 : }
2169 : }
2170 0 : }
2171 :
2172 : #define SC_OLD_TABSEP '/'
2173 : #define SC_NEW_TABSEP '+'
2174 :
2175 0 : void ScViewData::WriteUserData(OUString& rData)
2176 : {
2177 : // nZoom (bis 364v) oder nZoom/nPageZoom/bPageMode (ab 364w)
2178 : // nTab
2179 : // Tab-ControlBreite
2180 : // pro Tabelle:
2181 : // CursorX/CursorY/HSplitMode/VSplitMode/HSplitPos/VSplitPos/SplitActive/
2182 : // PosX[links]/PosX[rechts]/PosY[oben]/PosY[unten]
2183 : // wenn Zeilen groesser 8192, "+" statt "/"
2184 :
2185 0 : sal_uInt16 nZoom = (sal_uInt16)((pThisTab->aZoomY.GetNumerator() * 100) / pThisTab->aZoomY.GetDenominator());
2186 0 : rData = OUString::number( nZoom ) + "/";
2187 0 : nZoom = (sal_uInt16)((pThisTab->aPageZoomY.GetNumerator() * 100) / pThisTab->aPageZoomY.GetDenominator());
2188 0 : rData += OUString::number( nZoom ) + "/";
2189 0 : if (bPagebreak)
2190 0 : rData += "1";
2191 : else
2192 0 : rData += "0";
2193 :
2194 0 : rData += ";" + OUString::number( nTabNo ) + ";" + TAG_TABBARWIDTH +
2195 0 : OUString::number( pView->GetTabBarWidth() );
2196 :
2197 0 : SCTAB nTabCount = pDoc->GetTableCount();
2198 0 : for (SCTAB i=0; i<nTabCount; i++)
2199 : {
2200 0 : rData += ";"; // Numerierung darf auf keinen Fall durcheinanderkommen
2201 0 : if (i < static_cast<SCTAB>(maTabData.size()) && maTabData[i])
2202 : {
2203 0 : OUString cTabSep = OUString(SC_OLD_TABSEP); // like 3.1
2204 0 : if ( maTabData[i]->nCurY > MAXROW_30 ||
2205 0 : maTabData[i]->nPosY[0] > MAXROW_30 || maTabData[i]->nPosY[1] > MAXROW_30 ||
2206 0 : ( maTabData[i]->eVSplitMode == SC_SPLIT_FIX &&
2207 0 : maTabData[i]->nFixPosY > MAXROW_30 ) )
2208 : {
2209 0 : cTabSep = OUString(SC_NEW_TABSEP); // in order to not kill a 3.1-version
2210 : }
2211 :
2212 :
2213 0 : rData += OUString::number( maTabData[i]->nCurX ) + cTabSep +
2214 0 : OUString::number( maTabData[i]->nCurY ) + cTabSep +
2215 0 : OUString::number( maTabData[i]->eHSplitMode ) + cTabSep +
2216 0 : OUString::number( maTabData[i]->eVSplitMode ) + cTabSep;
2217 0 : if ( maTabData[i]->eHSplitMode == SC_SPLIT_FIX )
2218 0 : rData += OUString::number( maTabData[i]->nFixPosX );
2219 : else
2220 0 : rData += OUString::number( maTabData[i]->nHSplitPos );
2221 0 : rData += cTabSep;
2222 0 : if ( maTabData[i]->eVSplitMode == SC_SPLIT_FIX )
2223 0 : rData += OUString::number( maTabData[i]->nFixPosY );
2224 : else
2225 0 : rData += OUString::number( maTabData[i]->nVSplitPos );
2226 0 : rData += cTabSep +
2227 0 : OUString::number( maTabData[i]->eWhichActive ) + cTabSep +
2228 0 : OUString::number( maTabData[i]->nPosX[0] ) + cTabSep +
2229 0 : OUString::number( maTabData[i]->nPosX[1] ) + cTabSep +
2230 0 : OUString::number( maTabData[i]->nPosY[0] ) + cTabSep +
2231 0 : OUString::number( maTabData[i]->nPosY[1] );
2232 : }
2233 : }
2234 0 : }
2235 :
2236 0 : void ScViewData::ReadUserData(const OUString& rData)
2237 : {
2238 0 : if (rData.isEmpty()) // Leerer String kommt bei "neu Laden"
2239 0 : return; // then exit without assertion
2240 :
2241 0 : sal_Int32 nCount = comphelper::string::getTokenCount(rData, ';');
2242 0 : if ( nCount <= 2 )
2243 : {
2244 : // beim Reload in der Seitenansicht sind evtl. die Preview-UserData
2245 : // stehengelassen worden. Den Zoom von der Preview will man hier nicht...
2246 : OSL_FAIL("ReadUserData: das sind nicht meine Daten");
2247 0 : return;
2248 : }
2249 :
2250 : // nicht pro Tabelle:
2251 0 : SCTAB nTabStart = 2;
2252 :
2253 0 : Fraction aZoomX, aZoomY, aPageZoomX, aPageZoomY; // evaluate (all sheets?)
2254 :
2255 0 : OUString aZoomStr = rData.getToken(0, ';'); // Zoom/PageZoom/Modus
2256 0 : sal_uInt16 nNormZoom = sal::static_int_cast<sal_uInt16>(aZoomStr.getToken(0,'/').toInt32());
2257 0 : if ( nNormZoom >= MINZOOM && nNormZoom <= MAXZOOM )
2258 0 : aZoomX = aZoomY = Fraction( nNormZoom, 100 ); // "normal" zoom (always)
2259 0 : sal_uInt16 nPageZoom = sal::static_int_cast<sal_uInt16>(aZoomStr.getToken(1,'/').toInt32());
2260 0 : if ( nPageZoom >= MINZOOM && nPageZoom <= MAXZOOM )
2261 0 : aPageZoomX = aPageZoomY = Fraction( nPageZoom, 100 ); // Pagebreak-zoom, if set
2262 0 : sal_Unicode cMode = aZoomStr.getToken(2,'/')[0]; // 0 or "0"/"1"
2263 0 : SetPagebreakMode( cMode == '1' );
2264 : // SetPagebreakMode muss immer gerufen werden wegen CalcPPT / RecalcPixPos()
2265 :
2266 : // Tabelle kann ungueltig geworden sein (z.B. letzte Version):
2267 0 : SCTAB nNewTab = static_cast<SCTAB>(rData.getToken(1, ';').toInt32());
2268 0 : if (pDoc->HasTable( nNewTab ))
2269 0 : SetTabNo(nNewTab);
2270 :
2271 : // wenn vorhanden, TabBar-Breite holen:
2272 0 : OUString aTabOpt = rData.getToken(2, ';');
2273 :
2274 0 : if (aTabOpt.startsWith(TAG_TABBARWIDTH))
2275 : {
2276 0 : sal_Int32 nTagLen = RTL_CONSTASCII_LENGTH(TAG_TABBARWIDTH);
2277 0 : pView->SetTabBarWidth(aTabOpt.copy(nTagLen).toInt32());
2278 0 : nTabStart = 3;
2279 : }
2280 :
2281 : // per table
2282 0 : SCTAB nPos = 0;
2283 0 : while ( nCount > nPos+nTabStart )
2284 : {
2285 0 : aTabOpt = rData.getToken(static_cast<sal_Int32>(nPos+nTabStart), ';');
2286 0 : EnsureTabDataSize(nPos + 1);
2287 0 : if (!maTabData[nPos])
2288 0 : maTabData[nPos] = new ScViewDataTable;
2289 :
2290 0 : sal_Unicode cTabSep = 0;
2291 0 : if (comphelper::string::getTokenCount(aTabOpt, SC_OLD_TABSEP) >= 11)
2292 0 : cTabSep = SC_OLD_TABSEP;
2293 : #ifndef SC_LIMIT_ROWS
2294 0 : else if (comphelper::string::getTokenCount(aTabOpt, SC_NEW_TABSEP) >= 11)
2295 0 : cTabSep = SC_NEW_TABSEP;
2296 : // '+' ist nur erlaubt, wenn wir mit Zeilen > 8192 umgehen koennen
2297 : #endif
2298 :
2299 0 : if (cTabSep)
2300 : {
2301 0 : maTabData[nPos]->nCurX = SanitizeCol( static_cast<SCCOL>(aTabOpt.getToken(0,cTabSep).toInt32()));
2302 0 : maTabData[nPos]->nCurY = SanitizeRow( aTabOpt.getToken(1,cTabSep).toInt32());
2303 0 : maTabData[nPos]->eHSplitMode = (ScSplitMode) aTabOpt.getToken(2,cTabSep).toInt32();
2304 0 : maTabData[nPos]->eVSplitMode = (ScSplitMode) aTabOpt.getToken(3,cTabSep).toInt32();
2305 :
2306 0 : if ( maTabData[nPos]->eHSplitMode == SC_SPLIT_FIX )
2307 : {
2308 0 : maTabData[nPos]->nFixPosX = SanitizeCol( static_cast<SCCOL>(aTabOpt.getToken(4,cTabSep).toInt32()));
2309 0 : UpdateFixX(nPos);
2310 : }
2311 : else
2312 0 : maTabData[nPos]->nHSplitPos = aTabOpt.getToken(4,cTabSep).toInt32();
2313 :
2314 0 : if ( maTabData[nPos]->eVSplitMode == SC_SPLIT_FIX )
2315 : {
2316 0 : maTabData[nPos]->nFixPosY = SanitizeRow( aTabOpt.getToken(5,cTabSep).toInt32());
2317 0 : UpdateFixY(nPos);
2318 : }
2319 : else
2320 0 : maTabData[nPos]->nVSplitPos = aTabOpt.getToken(5,cTabSep).toInt32();
2321 :
2322 0 : maTabData[nPos]->eWhichActive = (ScSplitPos) aTabOpt.getToken(6,cTabSep).toInt32();
2323 0 : maTabData[nPos]->nPosX[0] = SanitizeCol( static_cast<SCCOL>(aTabOpt.getToken(7,cTabSep).toInt32()));
2324 0 : maTabData[nPos]->nPosX[1] = SanitizeCol( static_cast<SCCOL>(aTabOpt.getToken(8,cTabSep).toInt32()));
2325 0 : maTabData[nPos]->nPosY[0] = SanitizeRow( aTabOpt.getToken(9,cTabSep).toInt32());
2326 0 : maTabData[nPos]->nPosY[1] = SanitizeRow( aTabOpt.getToken(10,cTabSep).toInt32());
2327 :
2328 : // Test, ob der aktive Teil laut SplitMode ueberhaupt existiert
2329 : // (Bug #44516#)
2330 0 : ScSplitPos eTest = maTabData[nPos]->eWhichActive;
2331 0 : if ( ( WhichH( eTest ) == SC_SPLIT_RIGHT &&
2332 0 : maTabData[nPos]->eHSplitMode == SC_SPLIT_NONE ) ||
2333 0 : ( WhichV( eTest ) == SC_SPLIT_TOP &&
2334 0 : maTabData[nPos]->eVSplitMode == SC_SPLIT_NONE ) )
2335 : {
2336 : // dann wieder auf Default (unten links)
2337 0 : maTabData[nPos]->eWhichActive = SC_SPLIT_BOTTOMLEFT;
2338 : OSL_FAIL("SplitPos musste korrigiert werden");
2339 : }
2340 : }
2341 0 : ++nPos;
2342 : }
2343 :
2344 0 : RecalcPixPos();
2345 : }
2346 :
2347 0 : void ScViewData::WriteExtOptions( ScExtDocOptions& rDocOpt ) const
2348 : {
2349 : // *** Fill extended document data for export filters ***
2350 :
2351 : // document settings
2352 0 : ScExtDocSettings& rDocSett = rDocOpt.GetDocSettings();
2353 :
2354 : // displayed sheet
2355 0 : rDocSett.mnDisplTab = GetTabNo();
2356 :
2357 : // width of the tabbar, relative to frame window width
2358 0 : rDocSett.mfTabBarWidth = pView->GetPendingRelTabBarWidth();
2359 0 : if( rDocSett.mfTabBarWidth < 0.0 )
2360 0 : rDocSett.mfTabBarWidth = pView->GetRelTabBarWidth();
2361 :
2362 : // sheet settings
2363 0 : for( SCTAB nTab = 0; nTab < static_cast<SCTAB>(maTabData.size()); ++nTab )
2364 : {
2365 0 : if( const ScViewDataTable* pViewTab = maTabData[ nTab ] )
2366 : {
2367 0 : ScExtTabSettings& rTabSett = rDocOpt.GetOrCreateTabSettings( nTab );
2368 :
2369 : // split mode
2370 0 : ScSplitMode eHSplit = pViewTab->eHSplitMode;
2371 0 : ScSplitMode eVSplit = pViewTab->eVSplitMode;
2372 0 : bool bHSplit = eHSplit != SC_SPLIT_NONE;
2373 0 : bool bVSplit = eVSplit != SC_SPLIT_NONE;
2374 0 : bool bRealSplit = (eHSplit == SC_SPLIT_NORMAL) || (eVSplit == SC_SPLIT_NORMAL);
2375 0 : bool bFrozen = (eHSplit == SC_SPLIT_FIX) || (eVSplit == SC_SPLIT_FIX);
2376 : OSL_ENSURE( !bRealSplit || !bFrozen, "ScViewData::WriteExtOptions - split and freeze in same sheet" );
2377 0 : rTabSett.mbFrozenPanes = !bRealSplit && bFrozen;
2378 :
2379 : // split and freeze position
2380 0 : rTabSett.maSplitPos = Point( 0, 0 );
2381 0 : rTabSett.maFreezePos.Set( 0, 0, nTab );
2382 0 : if( bRealSplit )
2383 : {
2384 0 : Point& rSplitPos = rTabSett.maSplitPos;
2385 0 : rSplitPos = Point( bHSplit ? pViewTab->nHSplitPos : 0, bVSplit ? pViewTab->nVSplitPos : 0 );
2386 0 : rSplitPos = Application::GetDefaultDevice()->PixelToLogic( rSplitPos, MapMode( MAP_TWIP ) );
2387 0 : if( pDocShell )
2388 0 : rSplitPos.X() = (long)((double)rSplitPos.X() / pDocShell->GetOutputFactor());
2389 : }
2390 0 : else if( bFrozen )
2391 : {
2392 0 : if( bHSplit ) rTabSett.maFreezePos.SetCol( pViewTab->nFixPosX );
2393 0 : if( bVSplit ) rTabSett.maFreezePos.SetRow( pViewTab->nFixPosY );
2394 : }
2395 :
2396 : // first visible cell in top-left and additional panes
2397 0 : rTabSett.maFirstVis.Set( pViewTab->nPosX[ SC_SPLIT_LEFT ], pViewTab->nPosY[ bVSplit ? SC_SPLIT_TOP : SC_SPLIT_BOTTOM ], nTab );
2398 0 : rTabSett.maSecondVis.Set( pViewTab->nPosX[ SC_SPLIT_RIGHT ], pViewTab->nPosY[ SC_SPLIT_BOTTOM ], nTab );
2399 :
2400 : // active pane
2401 0 : switch( pViewTab->eWhichActive )
2402 : {
2403 : // no horizontal split -> always use left panes
2404 : // no vertical split -> always use top panes
2405 : case SC_SPLIT_TOPLEFT:
2406 0 : rTabSett.meActivePane = SCEXT_PANE_TOPLEFT;
2407 0 : break;
2408 : case SC_SPLIT_TOPRIGHT:
2409 0 : rTabSett.meActivePane = bHSplit ? SCEXT_PANE_TOPRIGHT : SCEXT_PANE_TOPLEFT;
2410 0 : break;
2411 : case SC_SPLIT_BOTTOMLEFT:
2412 0 : rTabSett.meActivePane = bVSplit ? SCEXT_PANE_BOTTOMLEFT : SCEXT_PANE_TOPLEFT;
2413 0 : break;
2414 : case SC_SPLIT_BOTTOMRIGHT:
2415 : rTabSett.meActivePane = bHSplit ?
2416 : (bVSplit ? SCEXT_PANE_BOTTOMRIGHT : SCEXT_PANE_TOPRIGHT) :
2417 0 : (bVSplit ? SCEXT_PANE_BOTTOMLEFT : SCEXT_PANE_TOPLEFT);
2418 0 : break;
2419 : }
2420 :
2421 : // cursor position
2422 0 : rTabSett.maCursor.Set( pViewTab->nCurX, pViewTab->nCurY, nTab );
2423 :
2424 : // sheet selection and selected ranges
2425 0 : const ScMarkData& rMarkData = GetMarkData();
2426 0 : rTabSett.mbSelected = rMarkData.GetTableSelect( nTab );
2427 0 : rMarkData.FillRangeListWithMarks( &rTabSett.maSelection, true );
2428 :
2429 : // grid color
2430 0 : rTabSett.maGridColor.SetColor( COL_AUTO );
2431 0 : if( pOptions )
2432 : {
2433 0 : const Color& rGridColor = pOptions->GetGridColor();
2434 0 : if( rGridColor.GetColor() != SC_STD_GRIDCOLOR )
2435 0 : rTabSett.maGridColor = rGridColor;
2436 : }
2437 0 : rTabSett.mbShowGrid = pViewTab->bShowGrid;
2438 :
2439 : // view mode and zoom
2440 0 : rTabSett.mbPageMode = bPagebreak;
2441 0 : rTabSett.mnNormalZoom = static_cast< long >( pViewTab->aZoomY * Fraction( 100.0 ) );
2442 0 : rTabSett.mnPageZoom = static_cast< long >( pViewTab->aPageZoomY * Fraction( 100.0 ) );
2443 : }
2444 : }
2445 0 : }
2446 :
2447 0 : void ScViewData::ReadExtOptions( const ScExtDocOptions& rDocOpt )
2448 : {
2449 : // *** Get extended document data from import filters ***
2450 :
2451 0 : if( !rDocOpt.IsChanged() ) return;
2452 :
2453 : // document settings
2454 0 : const ScExtDocSettings& rDocSett = rDocOpt.GetDocSettings();
2455 :
2456 : // displayed sheet
2457 0 : SetTabNo( rDocSett.mnDisplTab );
2458 :
2459 : /* Width of the tabbar, relative to frame window width. We do not have the
2460 : correct width of the frame window here -> store in ScTabView, which sets
2461 : the size in the next resize. */
2462 0 : pView->SetPendingRelTabBarWidth( rDocSett.mfTabBarWidth );
2463 :
2464 : // sheet settings
2465 0 : SCTAB nLastTab = rDocOpt.GetLastTab();
2466 0 : if (static_cast<SCTAB>(maTabData.size()) <= nLastTab)
2467 0 : maTabData.resize(nLastTab+1);
2468 :
2469 0 : for( SCTAB nTab = 0; nTab < static_cast<SCTAB>(maTabData.size()); ++nTab )
2470 : {
2471 0 : if( const ScExtTabSettings* pTabSett = rDocOpt.GetTabSettings( nTab ) )
2472 : {
2473 0 : if( !maTabData[ nTab ] )
2474 0 : maTabData[ nTab ] = new ScViewDataTable;
2475 :
2476 0 : const ScExtTabSettings& rTabSett = *pTabSett;
2477 0 : ScViewDataTable& rViewTab = *maTabData[ nTab ];
2478 :
2479 : // split mode initialization
2480 0 : bool bFrozen = rTabSett.mbFrozenPanes;
2481 0 : bool bHSplit = bFrozen ? (rTabSett.maFreezePos.Col() > 0) : (rTabSett.maSplitPos.X() > 0);
2482 0 : bool bVSplit = bFrozen ? (rTabSett.maFreezePos.Row() > 0) : (rTabSett.maSplitPos.Y() > 0);
2483 :
2484 : // first visible cell of top-left pane and additional panes
2485 0 : rViewTab.nPosX[ SC_SPLIT_LEFT ] = rTabSett.maFirstVis.Col();
2486 0 : rViewTab.nPosY[ bVSplit ? SC_SPLIT_TOP : SC_SPLIT_BOTTOM ] = rTabSett.maFirstVis.Row();
2487 0 : if( bHSplit ) rViewTab.nPosX[ SC_SPLIT_RIGHT ] = rTabSett.maSecondVis.Col();
2488 0 : if( bVSplit ) rViewTab.nPosY[ SC_SPLIT_BOTTOM ] = rTabSett.maSecondVis.Row();
2489 :
2490 : // split mode, split and freeze position
2491 0 : rViewTab.eHSplitMode = rViewTab.eVSplitMode = SC_SPLIT_NONE;
2492 0 : rViewTab.nHSplitPos = rViewTab.nVSplitPos = 0;
2493 0 : rViewTab.nFixPosX = 0;
2494 0 : rViewTab.nFixPosY = 0;
2495 0 : if( bFrozen )
2496 : {
2497 0 : if( bHSplit )
2498 : {
2499 0 : rViewTab.eHSplitMode = SC_SPLIT_FIX;
2500 0 : rViewTab.nFixPosX = rTabSett.maFreezePos.Col();
2501 0 : UpdateFixX( nTab );
2502 : }
2503 0 : if( bVSplit )
2504 : {
2505 0 : rViewTab.eVSplitMode = SC_SPLIT_FIX;
2506 0 : rViewTab.nFixPosY = rTabSett.maFreezePos.Row();
2507 0 : UpdateFixY( nTab );
2508 : }
2509 : }
2510 : else
2511 : {
2512 : Point aPixel = Application::GetDefaultDevice()->LogicToPixel(
2513 0 : rTabSett.maSplitPos, MapMode( MAP_TWIP ) ); //! Zoom?
2514 : // the test for use of printer metrics for text formatting here
2515 : // effectively results in the nFactor = 1.0 regardless of the Option setting.
2516 0 : if( pDocShell && SC_MOD()->GetInputOptions().GetTextWysiwyg())
2517 : {
2518 0 : double nFactor = pDocShell->GetOutputFactor();
2519 0 : aPixel.X() = (long)( aPixel.X() * nFactor + 0.5 );
2520 : }
2521 :
2522 0 : bHSplit = bHSplit && aPixel.X() > 0;
2523 0 : bVSplit = bVSplit && aPixel.Y() > 0;
2524 0 : if( bHSplit )
2525 : {
2526 0 : rViewTab.eHSplitMode = SC_SPLIT_NORMAL;
2527 0 : rViewTab.nHSplitPos = aPixel.X();
2528 : }
2529 0 : if( bVSplit )
2530 : {
2531 0 : rViewTab.eVSplitMode = SC_SPLIT_NORMAL;
2532 0 : rViewTab.nVSplitPos = aPixel.Y();
2533 : }
2534 : }
2535 :
2536 : // active pane
2537 0 : ScSplitPos ePos = SC_SPLIT_BOTTOMLEFT;
2538 0 : switch( rTabSett.meActivePane )
2539 : {
2540 : // no horizontal split -> always use left panes
2541 : // no vertical split -> always use *bottom* panes
2542 : case SCEXT_PANE_TOPLEFT:
2543 0 : ePos = bVSplit ? SC_SPLIT_TOPLEFT : SC_SPLIT_BOTTOMLEFT;
2544 0 : break;
2545 : case SCEXT_PANE_TOPRIGHT:
2546 : ePos = bHSplit ?
2547 : (bVSplit ? SC_SPLIT_TOPRIGHT : SC_SPLIT_BOTTOMRIGHT) :
2548 0 : (bVSplit ? SC_SPLIT_TOPLEFT : SC_SPLIT_BOTTOMLEFT);
2549 0 : break;
2550 : case SCEXT_PANE_BOTTOMLEFT:
2551 0 : ePos = SC_SPLIT_BOTTOMLEFT;
2552 0 : break;
2553 : case SCEXT_PANE_BOTTOMRIGHT:
2554 0 : ePos = bHSplit ? SC_SPLIT_BOTTOMRIGHT : SC_SPLIT_BOTTOMLEFT;
2555 0 : break;
2556 : }
2557 0 : rViewTab.eWhichActive = ePos;
2558 :
2559 : // cursor position
2560 0 : const ScAddress& rCursor = rTabSett.maCursor;
2561 0 : if( rCursor.IsValid() )
2562 : {
2563 0 : rViewTab.nCurX = rCursor.Col();
2564 0 : rViewTab.nCurY = rCursor.Row();
2565 : }
2566 :
2567 : // sheet selection and selected ranges
2568 0 : ScMarkData& rMarkData = GetMarkData();
2569 0 : rMarkData.SelectTable( nTab, rTabSett.mbSelected );
2570 :
2571 : // zoom for each sheet
2572 0 : if( rTabSett.mnNormalZoom )
2573 0 : rViewTab.aZoomX = rViewTab.aZoomY = Fraction( rTabSett.mnNormalZoom, 100L );
2574 0 : if( rTabSett.mnPageZoom )
2575 0 : rViewTab.aPageZoomX = rViewTab.aPageZoomY = Fraction( rTabSett.mnPageZoom, 100L );
2576 :
2577 0 : rViewTab.bShowGrid = rTabSett.mbShowGrid;
2578 :
2579 : // get some settings from displayed Excel sheet, set at Calc document
2580 0 : if( nTab == GetTabNo() )
2581 : {
2582 : // grid color -- #i47435# set automatic grid color explicitly
2583 0 : if( pOptions )
2584 : {
2585 0 : Color aGridColor( rTabSett.maGridColor );
2586 0 : if( aGridColor.GetColor() == COL_AUTO )
2587 0 : aGridColor.SetColor( SC_STD_GRIDCOLOR );
2588 0 : pOptions->SetGridColor( aGridColor, EMPTY_OUSTRING );
2589 : }
2590 :
2591 : // view mode and default zoom (for new sheets) from current sheet
2592 0 : if( rTabSett.mnNormalZoom )
2593 0 : aDefZoomX = aDefZoomY = Fraction( rTabSett.mnNormalZoom, 100L );
2594 0 : if( rTabSett.mnPageZoom )
2595 0 : aDefPageZoomX = aDefPageZoomY = Fraction( rTabSett.mnPageZoom, 100L );
2596 : /* #i46820# set pagebreak mode via SetPagebreakMode(), this will
2597 : update map modes that are needed to draw text correctly. */
2598 0 : SetPagebreakMode( rTabSett.mbPageMode );
2599 : }
2600 : }
2601 : }
2602 :
2603 : // RecalcPixPos oder so - auch nMPos - auch bei ReadUserData ??!?!
2604 : }
2605 :
2606 0 : void ScViewData::WriteUserDataSequence(uno::Sequence <beans::PropertyValue>& rSettings) const
2607 : {
2608 0 : rSettings.realloc(SC_VIEWSETTINGS_COUNT);
2609 : // + 1, because we have to put the view id in the sequence
2610 0 : beans::PropertyValue* pSettings = rSettings.getArray();
2611 0 : if (pSettings)
2612 : {
2613 0 : sal_uInt16 nViewID(pViewShell->GetViewFrame()->GetCurViewId());
2614 0 : pSettings[SC_VIEW_ID].Name = OUString(SC_VIEWID);
2615 0 : OUStringBuffer sBuffer(SC_VIEW);
2616 : ::sax::Converter::convertNumber(sBuffer,
2617 0 : static_cast<sal_Int32>(nViewID));
2618 0 : pSettings[SC_VIEW_ID].Value <<= sBuffer.makeStringAndClear();
2619 :
2620 : uno::Reference<container::XNameContainer> xNameContainer =
2621 0 : document::NamedPropertyValues::create( comphelper::getProcessComponentContext() );
2622 0 : for (SCTAB nTab=0; nTab<static_cast<SCTAB>(maTabData.size()); nTab++)
2623 : {
2624 0 : if (maTabData[nTab])
2625 : {
2626 0 : uno::Sequence <beans::PropertyValue> aTableViewSettings;
2627 0 : maTabData[nTab]->WriteUserDataSequence(aTableViewSettings, *this, nTab);
2628 0 : OUString sTabName;
2629 0 : GetDocument()->GetName( nTab, sTabName );
2630 0 : uno::Any aAny;
2631 0 : aAny <<= aTableViewSettings;
2632 : try
2633 : {
2634 0 : xNameContainer->insertByName(sTabName, aAny);
2635 : }
2636 : //#101739#; two tables with the same name are possible
2637 0 : catch ( container::ElementExistException& )
2638 : {
2639 : OSL_FAIL("seems there are two tables with the same name");
2640 : }
2641 0 : catch ( uno::RuntimeException& )
2642 : {
2643 : OSL_FAIL("something went wrong");
2644 0 : }
2645 : }
2646 : }
2647 0 : pSettings[SC_TABLE_VIEWSETTINGS].Name = OUString(SC_TABLES);
2648 0 : pSettings[SC_TABLE_VIEWSETTINGS].Value <<= xNameContainer;
2649 :
2650 0 : OUString sName;
2651 0 : GetDocument()->GetName( nTabNo, sName );
2652 0 : pSettings[SC_ACTIVE_TABLE].Name = OUString(SC_ACTIVETABLE);
2653 0 : pSettings[SC_ACTIVE_TABLE].Value <<= sName;
2654 0 : pSettings[SC_HORIZONTAL_SCROLL_BAR_WIDTH].Name = OUString(SC_HORIZONTALSCROLLBARWIDTH);
2655 0 : pSettings[SC_HORIZONTAL_SCROLL_BAR_WIDTH].Value <<= sal_Int32(pView->GetTabBarWidth());
2656 0 : sal_Int32 nZoomValue ((pThisTab->aZoomY.GetNumerator() * 100) / pThisTab->aZoomY.GetDenominator());
2657 0 : sal_Int32 nPageZoomValue ((pThisTab->aPageZoomY.GetNumerator() * 100) / pThisTab->aPageZoomY.GetDenominator());
2658 0 : pSettings[SC_ZOOM_TYPE].Name = OUString(SC_ZOOMTYPE);
2659 0 : pSettings[SC_ZOOM_TYPE].Value <<= sal_Int16(pThisTab->eZoomType);
2660 0 : pSettings[SC_ZOOM_VALUE].Name = OUString(SC_ZOOMVALUE);
2661 0 : pSettings[SC_ZOOM_VALUE].Value <<= nZoomValue;
2662 0 : pSettings[SC_PAGE_VIEW_ZOOM_VALUE].Name = OUString(SC_PAGEVIEWZOOMVALUE);
2663 0 : pSettings[SC_PAGE_VIEW_ZOOM_VALUE].Value <<= nPageZoomValue;
2664 0 : pSettings[SC_PAGE_BREAK_PREVIEW].Name = OUString(SC_SHOWPAGEBREAKPREVIEW);
2665 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_PAGE_BREAK_PREVIEW].Value, bPagebreak);
2666 :
2667 0 : if (pOptions)
2668 : {
2669 0 : pSettings[SC_SHOWZERO].Name = OUString(SC_UNO_SHOWZERO);
2670 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SHOWZERO].Value, pOptions->GetOption( VOPT_NULLVALS ) );
2671 0 : pSettings[SC_SHOWNOTES].Name = OUString(SC_UNO_SHOWNOTES);
2672 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SHOWNOTES].Value, pOptions->GetOption( VOPT_NOTES ) );
2673 0 : pSettings[SC_SHOWGRID].Name = OUString(SC_UNO_SHOWGRID);
2674 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SHOWGRID].Value, pOptions->GetOption( VOPT_GRID ) );
2675 0 : pSettings[SC_GRIDCOLOR].Name = OUString(SC_UNO_GRIDCOLOR);
2676 0 : OUString aColorName;
2677 0 : Color aColor = pOptions->GetGridColor(&aColorName);
2678 0 : pSettings[SC_GRIDCOLOR].Value <<= static_cast<sal_Int64>(aColor.GetColor());
2679 0 : pSettings[SC_SHOWPAGEBR].Name = OUString(SC_UNO_SHOWPAGEBR);
2680 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SHOWPAGEBR].Value, pOptions->GetOption( VOPT_PAGEBREAKS ) );
2681 0 : pSettings[SC_COLROWHDR].Name = OUString(SC_UNO_COLROWHDR);
2682 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_COLROWHDR].Value, pOptions->GetOption( VOPT_HEADER ) );
2683 0 : pSettings[SC_SHEETTABS].Name = OUString(SC_UNO_SHEETTABS);
2684 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SHEETTABS].Value, pOptions->GetOption( VOPT_TABCONTROLS ) );
2685 0 : pSettings[SC_OUTLSYMB].Name = OUString(SC_UNO_OUTLSYMB);
2686 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_OUTLSYMB].Value, pOptions->GetOption( VOPT_OUTLINER ) );
2687 :
2688 0 : const ScGridOptions& aGridOpt = pOptions->GetGridOptions();
2689 0 : pSettings[SC_SNAPTORASTER].Name = OUString(SC_UNO_SNAPTORASTER);
2690 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_SNAPTORASTER].Value, aGridOpt.GetUseGridSnap() );
2691 0 : pSettings[SC_RASTERVIS].Name = OUString(SC_UNO_RASTERVIS);
2692 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_RASTERVIS].Value, aGridOpt.GetGridVisible() );
2693 0 : pSettings[SC_RASTERRESX].Name = OUString(SC_UNO_RASTERRESX);
2694 0 : pSettings[SC_RASTERRESX].Value <<= static_cast<sal_Int32> ( aGridOpt.GetFldDrawX() );
2695 0 : pSettings[SC_RASTERRESY].Name = OUString(SC_UNO_RASTERRESY);
2696 0 : pSettings[SC_RASTERRESY].Value <<= static_cast<sal_Int32> ( aGridOpt.GetFldDrawY() );
2697 0 : pSettings[SC_RASTERSUBX].Name = OUString(SC_UNO_RASTERSUBX);
2698 0 : pSettings[SC_RASTERSUBX].Value <<= static_cast<sal_Int32> ( aGridOpt.GetFldDivisionX() );
2699 0 : pSettings[SC_RASTERSUBY].Name = OUString(SC_UNO_RASTERSUBY);
2700 0 : pSettings[SC_RASTERSUBY].Value <<= static_cast<sal_Int32> ( aGridOpt.GetFldDivisionY() );
2701 0 : pSettings[SC_RASTERSYNC].Name = OUString(SC_UNO_RASTERSYNC);
2702 0 : ScUnoHelpFunctions::SetBoolInAny( pSettings[SC_RASTERSYNC].Value, aGridOpt.GetSynchronize() );
2703 0 : }
2704 : }
2705 0 : }
2706 :
2707 0 : void ScViewData::ReadUserDataSequence(const uno::Sequence <beans::PropertyValue>& rSettings)
2708 : {
2709 0 : std::vector<bool> aHasZoomVect( GetDocument()->GetTableCount(), false );
2710 :
2711 0 : sal_Int32 nCount(rSettings.getLength());
2712 0 : sal_Int32 nTemp32(0);
2713 0 : sal_Int16 nTemp16(0);
2714 0 : bool bPageMode(false);
2715 :
2716 0 : EnsureTabDataSize(GetDocument()->GetTableCount()-1);
2717 :
2718 0 : for (sal_Int32 i = 0; i < nCount; i++)
2719 : {
2720 : // SC_VIEWID has to parse and use by mba
2721 0 : OUString sName(rSettings[i].Name);
2722 0 : if (sName.equalsAscii(SC_TABLES) )
2723 : {
2724 0 : uno::Reference<container::XNameContainer> xNameContainer;
2725 0 : if ((rSettings[i].Value >>= xNameContainer) && xNameContainer->hasElements())
2726 : {
2727 0 : uno::Sequence< OUString > aNames(xNameContainer->getElementNames());
2728 0 : for (sal_Int32 nTabPos = 0; nTabPos < aNames.getLength(); nTabPos++)
2729 : {
2730 0 : OUString sTabName(aNames[nTabPos]);
2731 0 : SCTAB nTab(0);
2732 0 : if (GetDocument()->GetTable(sTabName, nTab))
2733 : {
2734 0 : uno::Any aAny = xNameContainer->getByName(aNames[nTabPos]);
2735 0 : uno::Sequence<beans::PropertyValue> aTabSettings;
2736 0 : if (aAny >>= aTabSettings)
2737 : {
2738 0 : EnsureTabDataSize(nTab + 1);
2739 0 : if (!maTabData[nTab])
2740 0 : maTabData[nTab] = new ScViewDataTable;
2741 :
2742 0 : bool bHasZoom = false;
2743 0 : maTabData[nTab]->ReadUserDataSequence(aTabSettings, *this, nTab, bHasZoom);
2744 0 : aHasZoomVect[nTab] = bHasZoom;
2745 0 : }
2746 : }
2747 0 : }
2748 0 : }
2749 : }
2750 0 : else if (sName.equalsAscii(SC_ACTIVETABLE) )
2751 : {
2752 0 : OUString sValue;
2753 0 : if(rSettings[i].Value >>= sValue)
2754 : {
2755 0 : OUString sTabName(sValue);
2756 0 : SCTAB nTab(0);
2757 0 : if (GetDocument()->GetTable(sTabName, nTab))
2758 0 : nTabNo = nTab;
2759 0 : }
2760 : }
2761 0 : else if (sName.equalsAscii(SC_HORIZONTALSCROLLBARWIDTH) )
2762 : {
2763 0 : if (rSettings[i].Value >>= nTemp32)
2764 0 : pView->SetTabBarWidth(nTemp32);
2765 : }
2766 0 : else if (sName.equalsAscii(SC_RELHORIZONTALTABBARWIDTH) )
2767 : {
2768 0 : double fWidth = 0.0;
2769 0 : if (rSettings[i].Value >>= fWidth)
2770 0 : pView->SetPendingRelTabBarWidth( fWidth );
2771 : }
2772 0 : else if (sName.equalsAscii(SC_ZOOMTYPE) )
2773 : {
2774 0 : if (rSettings[i].Value >>= nTemp16)
2775 0 : eDefZoomType = SvxZoomType(nTemp16);
2776 : }
2777 0 : else if (sName.equalsAscii(SC_ZOOMVALUE) )
2778 : {
2779 0 : if (rSettings[i].Value >>= nTemp32)
2780 : {
2781 0 : Fraction aZoom(nTemp32, 100);
2782 0 : aDefZoomX = aDefZoomY = aZoom;
2783 : }
2784 : }
2785 0 : else if (sName.equalsAscii(SC_PAGEVIEWZOOMVALUE) )
2786 : {
2787 0 : if (rSettings[i].Value >>= nTemp32)
2788 : {
2789 0 : Fraction aZoom(nTemp32, 100);
2790 0 : aDefPageZoomX = aDefPageZoomY = aZoom;
2791 : }
2792 : }
2793 0 : else if (sName.equalsAscii(SC_SHOWPAGEBREAKPREVIEW) )
2794 0 : bPageMode = ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value );
2795 0 : else if ( sName.equalsAscii( SC_UNO_SHOWZERO ) )
2796 0 : pOptions->SetOption(VOPT_NULLVALS, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
2797 0 : else if ( sName.equalsAscii( SC_UNO_SHOWNOTES ) )
2798 0 : pOptions->SetOption(VOPT_NOTES, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
2799 0 : else if ( sName.equalsAscii( SC_UNO_SHOWGRID ) )
2800 0 : pOptions->SetOption(VOPT_GRID, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
2801 0 : else if ( sName.equalsAscii( SC_UNO_GRIDCOLOR ) )
2802 : {
2803 0 : sal_Int64 nColor = 0;
2804 0 : if (rSettings[i].Value >>= nColor)
2805 : {
2806 0 : OUString aColorName;
2807 0 : Color aColor(static_cast<sal_uInt32>(nColor));
2808 : // #i47435# set automatic grid color explicitly
2809 0 : if( aColor.GetColor() == COL_AUTO )
2810 0 : aColor.SetColor( SC_STD_GRIDCOLOR );
2811 0 : pOptions->SetGridColor(aColor, aColorName);
2812 : }
2813 : }
2814 0 : else if ( sName.equalsAscii( SC_UNO_SHOWPAGEBR ) )
2815 0 : pOptions->SetOption(VOPT_PAGEBREAKS, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
2816 0 : else if ( sName.equalsAscii( SC_UNO_COLROWHDR ) )
2817 0 : pOptions->SetOption(VOPT_HEADER, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
2818 0 : else if ( sName.equalsAscii( SC_UNO_SHEETTABS ) )
2819 0 : pOptions->SetOption(VOPT_TABCONTROLS, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
2820 0 : else if ( sName.equalsAscii( SC_UNO_OUTLSYMB ) )
2821 0 : pOptions->SetOption(VOPT_OUTLINER, ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
2822 0 : else if ( sName.equalsAscii( SC_UNO_SHOWOBJ ) )
2823 : {
2824 : // #i80528# placeholders not supported anymore
2825 0 : if ( rSettings[i].Value >>= nTemp16 )
2826 0 : pOptions->SetObjMode( VOBJ_TYPE_OLE, (nTemp16 == 1) ? VOBJ_MODE_HIDE : VOBJ_MODE_SHOW );
2827 : }
2828 0 : else if ( sName.equalsAscii( SC_UNO_SHOWCHARTS ) )
2829 : {
2830 : // #i80528# placeholders not supported anymore
2831 0 : if ( rSettings[i].Value >>= nTemp16 )
2832 0 : pOptions->SetObjMode( VOBJ_TYPE_CHART, (nTemp16 == 1) ? VOBJ_MODE_HIDE : VOBJ_MODE_SHOW );
2833 : }
2834 0 : else if ( sName.equalsAscii( SC_UNO_SHOWDRAW ) )
2835 : {
2836 : // #i80528# placeholders not supported anymore
2837 0 : if ( rSettings[i].Value >>= nTemp16 )
2838 0 : pOptions->SetObjMode( VOBJ_TYPE_DRAW, (nTemp16 == 1) ? VOBJ_MODE_HIDE : VOBJ_MODE_SHOW );
2839 : }
2840 : else
2841 : {
2842 0 : ScGridOptions aGridOpt(pOptions->GetGridOptions());
2843 0 : if ( sName.equalsAscii( SC_UNO_SNAPTORASTER ) )
2844 0 : aGridOpt.SetUseGridSnap( ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
2845 0 : else if ( sName.equalsAscii( SC_UNO_RASTERVIS ) )
2846 0 : aGridOpt.SetGridVisible( ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
2847 0 : else if ( sName.equalsAscii( SC_UNO_RASTERRESX ) )
2848 0 : aGridOpt.SetFldDrawX( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( rSettings[i].Value ) ) );
2849 0 : else if ( sName.equalsAscii( SC_UNO_RASTERRESY ))
2850 0 : aGridOpt.SetFldDrawY( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( rSettings[i].Value ) ) );
2851 0 : else if ( sName.equalsAscii( SC_UNO_RASTERSUBX ) )
2852 0 : aGridOpt.SetFldDivisionX( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( rSettings[i].Value ) ) );
2853 0 : else if ( sName.equalsAscii( SC_UNO_RASTERSUBY ) )
2854 0 : aGridOpt.SetFldDivisionY( static_cast <sal_uInt32> ( ScUnoHelpFunctions::GetInt32FromAny( rSettings[i].Value ) ) );
2855 0 : else if ( sName.equalsAscii( SC_UNO_RASTERSYNC ) )
2856 0 : aGridOpt.SetSynchronize( ScUnoHelpFunctions::GetBoolFromAny( rSettings[i].Value ) );
2857 0 : pOptions->SetGridOptions(aGridOpt);
2858 : }
2859 0 : }
2860 :
2861 : // copy default zoom to sheets where a different one wasn't specified
2862 0 : for (SCTAB nZoomTab=0; nZoomTab< static_cast<SCTAB>(maTabData.size()); ++nZoomTab)
2863 0 : if (maTabData[nZoomTab] && ( nZoomTab >= static_cast<SCTAB>(aHasZoomVect.size()) || !aHasZoomVect[nZoomTab] ))
2864 : {
2865 0 : maTabData[nZoomTab]->eZoomType = eDefZoomType;
2866 0 : maTabData[nZoomTab]->aZoomX = aDefZoomX;
2867 0 : maTabData[nZoomTab]->aZoomY = aDefZoomY;
2868 0 : maTabData[nZoomTab]->aPageZoomX = aDefPageZoomX;
2869 0 : maTabData[nZoomTab]->aPageZoomY = aDefPageZoomY;
2870 : }
2871 :
2872 0 : if (nCount)
2873 0 : SetPagebreakMode( bPageMode );
2874 :
2875 : // #i47426# write view options to document, needed e.g. for Excel export
2876 0 : pDoc->SetViewOptions( *pOptions );
2877 0 : }
2878 :
2879 0 : void ScViewData::SetOptions( const ScViewOptions& rOpt )
2880 : {
2881 : // if visibility of horizontal ScrollBar is changed, TabBar may have to be resized...
2882 0 : bool bHScrollChanged = ( rOpt.GetOption(VOPT_HSCROLL) != pOptions->GetOption(VOPT_HSCROLL) );
2883 :
2884 : // if graphics are turned on or off, animation has to be started or stopped
2885 : // graphics are controlled by VOBJ_TYPE_OLE
2886 0 : bool bGraphicsChanged = ( pOptions->GetObjMode(VOBJ_TYPE_OLE) !=
2887 0 : rOpt.GetObjMode(VOBJ_TYPE_OLE) );
2888 :
2889 0 : *pOptions = rOpt;
2890 : OSL_ENSURE( pView, "No View" );
2891 :
2892 0 : if( pView )
2893 : {
2894 0 : pView->ViewOptionsHasChanged( bHScrollChanged, bGraphicsChanged );
2895 : }
2896 0 : }
2897 :
2898 0 : Point ScViewData::GetMousePosPixel()
2899 : {
2900 : OSL_ENSURE( pView, "GetMousePosPixel() ohne View" );
2901 0 : return pView->GetMousePosPixel();
2902 : }
2903 :
2904 0 : void ScViewData::UpdateInputHandler( bool bForce, bool bStopEditing )
2905 : {
2906 0 : if (pViewShell)
2907 0 : pViewShell->UpdateInputHandler( bForce, bStopEditing );
2908 0 : }
2909 :
2910 0 : bool ScViewData::IsOle()
2911 : {
2912 0 : return pDocShell && pDocShell->IsOle();
2913 : }
2914 :
2915 0 : bool ScViewData::UpdateFixX( SCTAB nTab ) // true = value changed
2916 : {
2917 0 : if (!ValidTab(nTab)) // Default
2918 0 : nTab=nTabNo; // current table
2919 :
2920 0 : if (!pView || maTabData[nTab]->eHSplitMode != SC_SPLIT_FIX)
2921 0 : return false;
2922 :
2923 0 : ScDocument* pLocalDoc = GetDocument();
2924 0 : if (!pLocalDoc->HasTable(nTab)) // if called from reload, the sheet may not exist
2925 0 : return false;
2926 :
2927 0 : SCCOL nFix = maTabData[nTab]->nFixPosX;
2928 0 : long nNewPos = 0;
2929 0 : for (SCCOL nX=maTabData[nTab]->nPosX[SC_SPLIT_LEFT]; nX<nFix; nX++)
2930 : {
2931 0 : sal_uInt16 nTSize = pLocalDoc->GetColWidth( nX, nTab );
2932 0 : if (nTSize)
2933 : {
2934 0 : long nPix = ToPixel( nTSize, nPPTX );
2935 0 : nNewPos += nPix;
2936 : }
2937 : }
2938 0 : nNewPos += pView->GetGridOffset().X();
2939 0 : if (nNewPos != maTabData[nTab]->nHSplitPos)
2940 : {
2941 0 : maTabData[nTab]->nHSplitPos = nNewPos;
2942 0 : if (nTab == nTabNo)
2943 0 : RecalcPixPos(); // should not be needed
2944 0 : return true;
2945 : }
2946 :
2947 0 : return false;
2948 : }
2949 :
2950 0 : bool ScViewData::UpdateFixY( SCTAB nTab ) // true = value changed
2951 : {
2952 0 : if (!ValidTab(nTab)) // Default
2953 0 : nTab=nTabNo; // current table
2954 :
2955 0 : if (!pView || maTabData[nTab]->eVSplitMode != SC_SPLIT_FIX)
2956 0 : return false;
2957 :
2958 0 : ScDocument* pLocalDoc = GetDocument();
2959 0 : if (!pLocalDoc->HasTable(nTab)) // if called from reload, the sheet may not exist
2960 0 : return false;
2961 :
2962 0 : SCROW nFix = maTabData[nTab]->nFixPosY;
2963 0 : long nNewPos = 0;
2964 0 : for (SCROW nY=maTabData[nTab]->nPosY[SC_SPLIT_TOP]; nY<nFix; nY++)
2965 : {
2966 0 : sal_uInt16 nTSize = pLocalDoc->GetRowHeight( nY, nTab );
2967 0 : if (nTSize)
2968 : {
2969 0 : long nPix = ToPixel( nTSize, nPPTY );
2970 0 : nNewPos += nPix;
2971 : }
2972 : }
2973 0 : nNewPos += pView->GetGridOffset().Y();
2974 0 : if (nNewPos != maTabData[nTab]->nVSplitPos)
2975 : {
2976 0 : maTabData[nTab]->nVSplitPos = nNewPos;
2977 0 : if (nTab == nTabNo)
2978 0 : RecalcPixPos(); // should not be needed
2979 0 : return true;
2980 : }
2981 :
2982 0 : return false;
2983 : }
2984 :
2985 0 : void ScViewData::UpdateOutlinerFlags( Outliner& rOutl ) const
2986 : {
2987 0 : ScDocument* pLocalDoc = GetDocument();
2988 0 : bool bOnlineSpell = pLocalDoc->GetDocOptions().IsAutoSpell();
2989 :
2990 0 : sal_uLong nCntrl = rOutl.GetControlWord();
2991 0 : nCntrl |= EE_CNTRL_URLSFXEXECUTE;
2992 0 : nCntrl |= EE_CNTRL_MARKFIELDS;
2993 0 : nCntrl |= EE_CNTRL_AUTOCORRECT;
2994 0 : if( bOnlineSpell )
2995 0 : nCntrl |= EE_CNTRL_ONLINESPELLING;
2996 : else
2997 0 : nCntrl &= ~EE_CNTRL_ONLINESPELLING;
2998 0 : rOutl.SetControlWord(nCntrl);
2999 :
3000 0 : rOutl.SetCalcFieldValueHdl( LINK( SC_MOD(), ScModule, CalcFieldValueHdl ) );
3001 :
3002 : // don't call GetSpellChecker if online spelling isn't enabled.
3003 : // The language for AutoCorrect etc. is taken from the pool defaults
3004 : // (set in ScDocument::UpdateDrawLanguages)
3005 :
3006 0 : if ( bOnlineSpell )
3007 : {
3008 0 : com::sun::star::uno::Reference<com::sun::star::linguistic2::XSpellChecker1> xXSpellChecker1( LinguMgr::GetSpellChecker() );
3009 0 : rOutl.SetSpeller( xXSpellChecker1 );
3010 : }
3011 :
3012 : rOutl.SetDefaultHorizontalTextDirection(
3013 0 : (EEHorizontalTextDirection)pLocalDoc->GetEditTextDirection( nTabNo ) );
3014 0 : }
3015 :
3016 0 : ScAddress ScViewData::GetCurPos() const
3017 : {
3018 0 : return ScAddress( GetCurX(), GetCurY(), GetTabNo() );
3019 : }
3020 :
3021 0 : void ScViewData::SetRefStart( SCCOL nNewX, SCROW nNewY, SCTAB nNewZ )
3022 : {
3023 0 : nRefStartX = nNewX; nRefStartY = nNewY; nRefStartZ = nNewZ;
3024 0 : }
3025 :
3026 0 : void ScViewData::SetRefEnd( SCCOL nNewX, SCROW nNewY, SCTAB nNewZ )
3027 : {
3028 0 : nRefEndX = nNewX; nRefEndY = nNewY; nRefEndZ = nNewZ;
3029 0 : }
3030 :
3031 0 : void ScViewData::AddPixelsWhile( long & rScrY, long nEndPixels, SCROW & rPosY,
3032 : SCROW nEndRow, double nPPTY, const ScDocument * pDoc, SCTAB nTabNo )
3033 : {
3034 0 : SCROW nRow = rPosY;
3035 0 : while (rScrY <= nEndPixels && nRow <= nEndRow)
3036 : {
3037 : SCROW nHeightEndRow;
3038 0 : sal_uInt16 nHeight = pDoc->GetRowHeight( nRow, nTabNo, NULL, &nHeightEndRow);
3039 0 : if (nHeightEndRow > nEndRow)
3040 0 : nHeightEndRow = nEndRow;
3041 0 : if (!nHeight)
3042 0 : nRow = nHeightEndRow + 1;
3043 : else
3044 : {
3045 0 : SCROW nRows = nHeightEndRow - nRow + 1;
3046 0 : sal_Int64 nPixel = ToPixel( nHeight, nPPTY);
3047 0 : sal_Int64 nAdd = nPixel * nRows;
3048 0 : if (nAdd + rScrY > nEndPixels)
3049 : {
3050 0 : sal_Int64 nDiff = rScrY + nAdd - nEndPixels;
3051 0 : nRows -= static_cast<SCROW>(nDiff / nPixel);
3052 0 : nAdd = nPixel * nRows;
3053 : // We're looking for a value that satisfies loop condition.
3054 0 : if (nAdd + rScrY <= nEndPixels)
3055 : {
3056 0 : ++nRows;
3057 0 : nAdd += nPixel;
3058 : }
3059 : }
3060 0 : rScrY += static_cast<long>(nAdd);
3061 0 : nRow += nRows;
3062 : }
3063 : }
3064 0 : if (nRow > rPosY)
3065 0 : --nRow;
3066 0 : rPosY = nRow;
3067 0 : }
3068 :
3069 :
3070 0 : void ScViewData::AddPixelsWhileBackward( long & rScrY, long nEndPixels,
3071 : SCROW & rPosY, SCROW nStartRow, double nPPTY, const ScDocument * pDoc,
3072 : SCTAB nTabNo )
3073 : {
3074 0 : SCROW nRow = rPosY;
3075 0 : while (rScrY <= nEndPixels && nRow >= nStartRow)
3076 : {
3077 : SCROW nHeightStartRow;
3078 0 : sal_uInt16 nHeight = pDoc->GetRowHeight( nRow, nTabNo, &nHeightStartRow, NULL);
3079 0 : if (nHeightStartRow < nStartRow)
3080 0 : nHeightStartRow = nStartRow;
3081 0 : if (!nHeight)
3082 0 : nRow = nHeightStartRow - 1;
3083 : else
3084 : {
3085 0 : SCROW nRows = nRow - nHeightStartRow + 1;
3086 0 : sal_Int64 nPixel = ToPixel( nHeight, nPPTY);
3087 0 : sal_Int64 nAdd = nPixel * nRows;
3088 0 : if (nAdd + rScrY > nEndPixels)
3089 : {
3090 0 : sal_Int64 nDiff = nAdd + rScrY - nEndPixels;
3091 0 : nRows -= static_cast<SCROW>(nDiff / nPixel);
3092 0 : nAdd = nPixel * nRows;
3093 : // We're looking for a value that satisfies loop condition.
3094 0 : if (nAdd + rScrY <= nEndPixels)
3095 : {
3096 0 : ++nRows;
3097 0 : nAdd += nPixel;
3098 : }
3099 : }
3100 0 : rScrY += static_cast<long>(nAdd);
3101 0 : nRow -= nRows;
3102 : }
3103 : }
3104 0 : if (nRow < rPosY)
3105 0 : ++nRow;
3106 0 : rPosY = nRow;
3107 0 : }
3108 :
3109 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|