1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#pragma once
#include <tools/fract.hxx>
#include <sfx2/zoomitem.hxx>
#include <rangelst.hxx>
#include <scdllapi.h>
#include <viewopti.hxx>
#include "docsh.hxx"
#include <memory>
#include <o3tl/typed_flags_set.hxx>
#define SC_SIZE_NONE 65535
enum class ScFillMode
{
NONE = 0,
FILL = 1,
EMBED_LT = 2,
EMBED_RB = 3,
MATRIX = 4,
};
enum ScSplitMode { SC_SPLIT_NONE = 0, SC_SPLIT_NORMAL, SC_SPLIT_FIX, SC_SPLIT_MODE_MAX_ENUM = SC_SPLIT_FIX };
enum ScSplitPos { SC_SPLIT_TOPLEFT, SC_SPLIT_TOPRIGHT, SC_SPLIT_BOTTOMLEFT, SC_SPLIT_BOTTOMRIGHT, SC_SPLIT_POS_MAX_ENUM = SC_SPLIT_BOTTOMRIGHT };
enum ScHSplitPos { SC_SPLIT_LEFT, SC_SPLIT_RIGHT };
enum ScVSplitPos { SC_SPLIT_TOP, SC_SPLIT_BOTTOM };
inline ScHSplitPos WhichH( ScSplitPos ePos );
inline ScVSplitPos WhichV( ScSplitPos ePos );
/** Screen behavior related to cursor movements */
enum ScFollowMode { SC_FOLLOW_NONE, SC_FOLLOW_LINE, SC_FOLLOW_FIX, SC_FOLLOW_JUMP, SC_FOLLOW_JUMP_END };
/** Mouse mode to select areas */
enum ScRefType { SC_REFTYPE_NONE, SC_REFTYPE_REF, SC_REFTYPE_FILL,
SC_REFTYPE_EMBED_LT, SC_REFTYPE_EMBED_RB };
/** States GetSimpleArea() returns for the underlying selection marks, so the
caller can react if the result is not of type SC_MARK_SIMPLE. */
enum ScMarkType
{
SC_MARK_NONE = 0, // Not returned by GetSimpleArea(), used internally.
// Nothing marked always results in the
// current cursor position being selected and a simple mark.
SC_MARK_SIMPLE = 1, // Simple rectangular area marked, no filtered rows.
SC_MARK_FILTERED = 2, // At least one mark contains filtered rows.
SC_MARK_SIMPLE_FILTERED = // Simple rectangular area marked containing filtered rows.
SC_MARK_SIMPLE |
SC_MARK_FILTERED, // 3
SC_MARK_MULTI = 4 // Multiple selection marks.
/* TODO: if filtered multi-selection was implemented, this would be the value to use. */
#if 0
,
SC_MARK_MULTI_FILTERED = // Multiple selection marks containing filtered rows.
SC_MARK_MULTI |
SC_MARK_FILTERED // 6
#endif
};
enum class ScPasteFlags
{
NONE = 0, // No flags specified
Mode = 1, // Enable paste-mode
Border = 2, // Show a border around the source cells
};
namespace o3tl {
template<> struct typed_flags<ScPasteFlags> : is_typed_flags<ScPasteFlags, 0x03> {};
}
// for internal Drag&Drop:
enum class ScDragSrc{
Undefined = 0,
Navigator = 1,
Table = 2
};
namespace o3tl {
template<> struct typed_flags<ScDragSrc> : is_typed_flags<ScDragSrc, 0x00000003> {};
}
class ScDocFunc;
class ScDocument;
class ScDBFunc;
class ScTabViewShell;
class ScDrawView;
class ScEditEngineDefaulter;
class EditView;
class EditStatus;
class Outliner;
namespace vcl { class Window; }
class SfxObjectShell;
class SfxBindings;
class SfxDispatcher;
class ScPatternAttr;
class ScExtDocOptions;
class ScViewData;
class ScMarkData;
class ScGridWindow;
class ScPositionHelper
{
public:
typedef SCCOLROW index_type;
typedef std::pair<index_type, tools::Long> value_type;
static_assert(std::numeric_limits<index_type>::is_signed, "ScPositionCache: index type is not signed");
private:
static const index_type null = std::numeric_limits<index_type>::min();
class Comp
{
public:
bool operator() (const value_type& rValue1, const value_type& rValue2) const;
};
index_type MAX_INDEX;
std::set<value_type, Comp> mData;
public:
ScPositionHelper(const ScDocument *pDoc, bool bColumn);
void setDocument(const ScDocument& rDoc, bool bColumn);
void insert(index_type nIndex, tools::Long nPos);
void removeByIndex(index_type nIndex);
void invalidateByIndex(index_type nIndex);
void invalidateByPosition(tools::Long nPos);
const value_type& getNearestByIndex(index_type nIndex) const;
const value_type& getNearestByPosition(tools::Long nPos) const;
tools::Long getPosition(index_type nIndex) const;
tools::Long computePosition(index_type nIndex, const std::function<long (index_type)>& getSizePx);
};
class ScBoundsProvider
{
typedef ScPositionHelper::value_type value_type;
typedef SCCOLROW index_type;
ScDocument& rDoc;
const SCTAB nTab;
const bool bColumnHeader;
const index_type MAX_INDEX;
double mfPPTX;
double mfPPTY;
index_type nFirstIndex;
index_type nSecondIndex;
tools::Long nFirstPositionPx;
tools::Long nSecondPositionPx;
public:
ScBoundsProvider(const ScViewData &rView, SCTAB nT, bool bColumnHeader);
void GetStartIndexAndPosition(SCCOL& nIndex, tools::Long& nPosition) const;
void GetEndIndexAndPosition(SCCOL& nIndex, tools::Long& nPosition) const;
void GetStartIndexAndPosition(SCROW& nIndex, tools::Long& nPosition) const;
void GetEndIndexAndPosition(SCROW& nIndex, tools::Long& nPosition) const;
void Compute(value_type aFirstNearest, value_type aSecondNearest,
tools::Long nFirstBound, tools::Long nSecondBound);
void EnlargeStartBy(tools::Long nOffset);
void EnlargeEndBy(tools::Long nOffset);
void EnlargeBy(tools::Long nOffset)
{
EnlargeStartBy(nOffset);
EnlargeEndBy(nOffset);
}
private:
tools::Long GetSize(index_type nIndex) const;
void GetIndexAndPos(index_type nNearestIndex, tools::Long nNearestPosition,
tools::Long nBound, index_type& nFoundIndex, tools::Long& nPosition,
bool bTowards, tools::Long nDiff);
void GeIndexBackwards(index_type nNearestIndex, tools::Long nNearestPosition,
tools::Long nBound, index_type& nFoundIndex, tools::Long& nPosition,
bool bTowards);
void GetIndexTowards(index_type nNearestIndex, tools::Long nNearestPosition,
tools::Long nBound, index_type& nFoundIndex, tools::Long& nPosition,
bool bTowards);
};
class ScViewDataTable // per-sheet data
{
friend class ScViewData;
private:
SvxZoomType eZoomType; // selected zoom type (normal view)
Fraction aZoomX; // selected zoom X
Fraction aZoomY; // selected zoom Y (displayed)
Fraction aPageZoomX; // zoom in page break preview mode
Fraction aPageZoomY;
tools::Long nTPosX[2]; // MapMode - Offset (Twips)
tools::Long nTPosY[2];
tools::Long nMPosX[2]; // MapMode - Offset (1/100 mm)
tools::Long nMPosY[2];
tools::Long nPixPosX[2]; // Offset in Pixels
tools::Long nPixPosY[2];
tools::Long nHSplitPos;
tools::Long nVSplitPos;
ScSplitMode eHSplitMode;
ScSplitMode eVSplitMode;
ScSplitPos eWhichActive;
SCCOL nFixPosX; // Cell position of the splitter when freeze pane
SCROW nFixPosY;
SCCOL nCurX;
SCROW nCurY;
SCCOL nOldCurX;
SCROW nOldCurY;
ScPositionHelper aWidthHelper;
ScPositionHelper aHeightHelper;
SCCOL nPosX[2]; ///< X position of the top left cell of the visible area.
SCROW nPosY[2]; ///< Y position of the top left cell of the visible area.
SCCOL nMaxTiledCol;
SCROW nMaxTiledRow;
bool bShowGrid; // per sheet show grid lines option.
bool mbOldCursorValid; // "virtual" Cursor position when combined
ScViewDataTable(const ScDocument *pDoc = nullptr);
void InitData(const ScDocument& rDoc);
void WriteUserDataSequence(
css::uno::Sequence <css::beans::PropertyValue>& rSettings,
const ScViewData& rViewData, SCTAB nTab ) const;
void ReadUserDataSequence(
const css::uno::Sequence <css::beans::PropertyValue>& rSettings,
ScViewData& rViewData, SCTAB nTab, bool& rHasZoom);
/** Sanitize the active split range value to not point into a grid window
that would never be initialized due to non-matching split modes.
This is to be done when reading settings from file formats or
configurations that could have arbitrary values. The caller is
responsible for actually assigning the new value to eWhichActive because
we want this function to be const to be able to call the check from
anywhere.
*/
[[nodiscard]] ScSplitPos SanitizeWhichActive() const;
};
class SC_DLLPUBLIC ScViewData
{
private:
double nPPTX, nPPTY; // Scaling factors
::std::vector<std::unique_ptr<ScViewDataTable>> maTabData;
ScMarkData maMarkData;
ScMarkData maHighlightData;
ScViewDataTable* pThisTab; // Data of the displayed sheet
ScDocShell* pDocShell;
ScDocument& mrDoc;
ScTabViewShell* pView;
std::unique_ptr<EditView> pEditView[4]; // Belongs to the window
ScViewOptions maOptions;
EditView* pSpellingView;
Size aScenButSize;
Size aScrSize;
MapMode aLogicMode; // skalierter 1/100mm-MapMode
SvxZoomType eDefZoomType; // default zoom and type for missing TabData
Fraction aDefZoomX;
Fraction aDefZoomY;
Fraction aDefPageZoomX; // zoom in page break preview mode
Fraction aDefPageZoomY;
ScRefType eRefType;
SCTAB nTabNo; // displayed sheet
SCTAB nRefTabNo; // sheet which contains RefInput
SCCOL nRefStartX;
SCROW nRefStartY;
SCTAB nRefStartZ;
SCCOL nRefEndX;
SCROW nRefEndY;
SCTAB nRefEndZ;
SCCOL nFillStartX; // Fill Cursor
SCROW nFillStartY;
SCCOL nFillEndX;
SCROW nFillEndY;
SCCOL nEditCol; // Related position
SCROW nEditRow;
SCCOL nEditStartCol;
SCCOL nEditEndCol; // End of Edit View
SCROW nEditEndRow;
SCCOL nTabStartCol; // for Enter after Tab
ScRange aDelRange; // for delete AutoFill
ScPasteFlags nPasteFlags;
ScSplitPos eEditActivePart; // the part that was active when edit mode was started
ScFillMode nFillMode;
SvxAdjust eEditAdjust;
bool bEditActive[4] = {}; // Active?
bool bActive:1; // Active Window ?
bool bIsRefMode:1; // Reference input
bool bDelMarkValid:1; // Only valid at SC_REFTYPE_FILL
bool bPagebreak:1; // Page break preview mode
bool bSelCtrlMouseClick:1; // special selection handling for ctrl-mouse-click
bool bMoveArea:1;
bool bGrowing;
sal_Int16 nFormulaBarLines; // Visible lines in the formula bar
tools::Long m_nLOKPageUpDownOffset;
tools::Rectangle maLOKVisibleArea;///< The visible area in the LibreOfficeKit client.
DECL_DLLPRIVATE_LINK( EditEngineHdl, EditStatus&, void );
SAL_DLLPRIVATE void CalcPPT();
SAL_DLLPRIVATE void CreateTabData( SCTAB nNewTab );
SAL_DLLPRIVATE void CreateTabData( std::vector< SCTAB >& rvTabs );
SAL_DLLPRIVATE void CreateSelectedTabData();
SAL_DLLPRIVATE void EnsureTabDataSize(size_t nSize);
SAL_DLLPRIVATE void UpdateCurrentTab();
SAL_DLLPRIVATE ScViewDataTable* FetchTableData(SCTAB) const;
ScViewData(ScDocument* pDoc, ScDocShell* pDocSh, ScTabViewShell* pViewSh);
public:
ScViewData( ScDocShell& rDocSh, ScTabViewShell* pViewSh );
ScViewData( ScDocument& rDoc );
~ScViewData() COVERITY_NOEXCEPT_FALSE;
ScDocShell* GetDocShell() const { return pDocShell; }
ScDocFunc& GetDocFunc() const;
ScDBFunc* GetView() const;
ScTabViewShell* GetViewShell() const { return pView; }
SfxObjectShell* GetSfxDocShell() const { return pDocShell; }
SfxBindings& GetBindings(); // from ViewShell's ViewFrame
SfxDispatcher& GetDispatcher(); // from ViewShell's ViewFrame
ScMarkData& GetMarkData();
ScMarkData& GetHighlightData();
const ScMarkData& GetMarkData() const;
weld::Window* GetDialogParent(); // forwarded from tabvwsh
ScGridWindow* GetActiveWin(); // from View
const ScGridWindow* GetActiveWin() const;
ScDrawView* GetScDrawView(); // from View
bool IsMinimized() const; // from View
void UpdateInputHandler( bool bForce = false );
void WriteUserData(OUString& rData);
void ReadUserData(std::u16string_view rData);
void WriteExtOptions( ScExtDocOptions& rOpt ) const;
void ReadExtOptions( const ScExtDocOptions& rOpt );
void WriteUserDataSequence(css::uno::Sequence <css::beans::PropertyValue>& rSettings) const;
void ReadUserDataSequence(const css::uno::Sequence <css::beans::PropertyValue>& rSettings);
ScDocument& GetDocument() const { return mrDoc; }
bool IsActive() const { return bActive; }
void Activate(bool bActivate) { bActive = bActivate; }
void InsertTab( SCTAB nTab );
void InsertTabs( SCTAB nTab, SCTAB nNewSheets );
void DeleteTab( SCTAB nTab );
void DeleteTabs( SCTAB nTab, SCTAB nSheets );
void CopyTab( SCTAB nSrcTab, SCTAB nDestTab );
void MoveTab( SCTAB nSrcTab, SCTAB nDestTab );
SCTAB GetRefTabNo() const { return nRefTabNo; }
void SetRefTabNo( SCTAB nNewTab ) { nRefTabNo = nNewTab; }
SCTAB GetTabNo() const { return nTabNo; }
SCCOL MaxCol() const { return mrDoc.MaxCol(); }
SCROW MaxRow() const { return mrDoc.MaxRow(); }
ScSplitPos GetActivePart() const { return pThisTab->eWhichActive; }
SCCOL GetPosX( ScHSplitPos eWhich, SCTAB nForTab = -1 ) const;
SCROW GetPosY( ScVSplitPos eWhich, SCTAB nForTab = -1 ) const;
SCCOL GetCurX() const { return pThisTab->nCurX; }
SCROW GetCurY() const { return pThisTab->nCurY; }
SCCOL GetCurXForTab( SCTAB nTabIndex ) const;
SCROW GetCurYForTab( SCTAB nTabIndex ) const;
SCCOL GetOldCurX() const;
SCROW GetOldCurY() const;
tools::Long GetLOKDocWidthPixel() const { return pThisTab->aWidthHelper.getPosition(pThisTab->nMaxTiledCol); }
tools::Long GetLOKDocHeightPixel() const { return pThisTab->aHeightHelper.getPosition(pThisTab->nMaxTiledRow); }
ScPositionHelper& GetLOKWidthHelper() { return pThisTab->aWidthHelper; }
ScPositionHelper& GetLOKHeightHelper() { return pThisTab->aHeightHelper; }
ScPositionHelper* GetLOKWidthHelper(SCTAB nTabIndex);
ScPositionHelper* GetLOKHeightHelper(SCTAB nTabIndex);
ScSplitMode GetHSplitMode() const { return pThisTab->eHSplitMode; }
ScSplitMode GetVSplitMode() const { return pThisTab->eVSplitMode; }
tools::Long GetHSplitPos() const { return pThisTab->nHSplitPos; }
tools::Long GetVSplitPos() const { return pThisTab->nVSplitPos; }
SCCOL GetFixPosX() const { return pThisTab->nFixPosX; }
SCROW GetFixPosY() const { return pThisTab->nFixPosY; }
SCCOL GetMaxTiledCol() const { return pThisTab->nMaxTiledCol; }
SCROW GetMaxTiledRow() const { return pThisTab->nMaxTiledRow; }
bool IsPagebreakMode() const { return bPagebreak; }
bool IsPasteMode() const { return bool(nPasteFlags & ScPasteFlags::Mode); }
bool ShowPasteSource() const { return bool(nPasteFlags & ScPasteFlags::Border); }
void SetPosX( ScHSplitPos eWhich, SCCOL nNewPosX );
void SetPosY( ScVSplitPos eWhich, SCROW nNewPosY );
void SetCurX( SCCOL nNewCurX ) { pThisTab->nCurX = nNewCurX; }
void SetCurY( SCROW nNewCurY ) { pThisTab->nCurY = nNewCurY; }
void SetCurXForTab( SCCOL nNewCurX, SCTAB nTabIndex );
void SetCurYForTab( SCCOL nNewCurY, SCTAB nTabIndex );
void SetOldCursor( SCCOL nNewX, SCROW nNewY );
void ResetOldCursor();
void SetHSplitMode( ScSplitMode eMode ) { pThisTab->eHSplitMode = eMode; }
void SetVSplitMode( ScSplitMode eMode ) { pThisTab->eVSplitMode = eMode; }
void SetHSplitPos( tools::Long nPos ) { pThisTab->nHSplitPos = nPos; }
void SetVSplitPos( tools::Long nPos ) { pThisTab->nVSplitPos = nPos; }
void SetFixPosX( SCCOL nPos ) { pThisTab->nFixPosX = nPos; }
void SetFixPosY( SCROW nPos ) { pThisTab->nFixPosY = nPos; }
void SetMaxTiledCol( SCCOL nCol );
void SetMaxTiledRow( SCROW nRow );
void SetPagebreakMode( bool bSet );
void SetPasteMode ( ScPasteFlags nFlags ) { nPasteFlags = nFlags; }
void SetZoomType( SvxZoomType eNew, bool bAll );
void SetZoomType( SvxZoomType eNew, std::vector< SCTAB >& tabs );
void SetZoom( const Fraction& rNewX, const Fraction& rNewY, std::vector< SCTAB >& tabs );
void SetZoom( const Fraction& rNewX, const Fraction& rNewY, bool bAll );
void RefreshZoom();
void SetSelCtrlMouseClick( bool bTmp ) { bSelCtrlMouseClick = bTmp; }
SvxZoomType GetZoomType() const { return pThisTab->eZoomType; }
const Fraction& GetZoomX() const { return bPagebreak ? pThisTab->aPageZoomX : pThisTab->aZoomX; }
const Fraction& GetZoomY() const { return bPagebreak ? pThisTab->aPageZoomY : pThisTab->aZoomY; }
void SetShowGrid( bool bShow );
bool GetShowGrid() const { return pThisTab->bShowGrid; }
const MapMode& GetLogicMode( ScSplitPos eWhich );
const MapMode& GetLogicMode(); // Offset 0
double GetPPTX() const { return nPPTX; }
double GetPPTY() const { return nPPTY; }
void SetFormulaBarLines(sal_Int16 nLines)
{
// Formula bar must be between 1 and 25 lines (see SpreadsheetViewSettings.idl)
nLines = std::max(nLines, static_cast<sal_Int16>(1));
nLines = std::min(nLines, static_cast<sal_Int16>(25));
nFormulaBarLines = nLines;
}
sal_Int16 GetFormulaBarLines() const { return nFormulaBarLines; };
ScMarkType GetSimpleArea( SCCOL& rStartCol, SCROW& rStartRow, SCTAB& rStartTab,
SCCOL& rEndCol, SCROW& rEndRow, SCTAB& rEndTab ) const;
ScMarkType GetSimpleArea( ScRange& rRange ) const;
/// May modify rNewMark using MarkToSimple().
ScMarkType GetSimpleArea( ScRange & rRange, ScMarkData & rNewMark ) const;
void GetMultiArea( ScRangeListRef& rRange ) const;
bool SimpleColMarked();
bool SimpleRowMarked();
bool IsMultiMarked() const;
/** Disallow Paste on Ctrl+A all selected or another high
amount of selected cells that is not the same size in
one direction as the clipboard source.
To prevent DOOM.
*/
bool SelectionForbidsPaste( ScDocument* pClipDoc = nullptr );
bool SelectionForbidsPaste( SCCOL nSrcCols, SCROW nSrcRows );
/** Disallow cell fill (Fill,Enter,...) on Ctrl+A all
selected or another high amount of selected cells.
We'd go DOOM.
*/
bool SelectionForbidsCellFill();
/// Determine DOOM condition, i.e. from selected range.
static bool SelectionFillDOOM( const ScRange& rRange );
void SetFillMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow );
void SetDragMode( SCCOL nStartCol, SCROW nStartRow, SCCOL nEndCol, SCROW nEndRow,
ScFillMode nMode );
void GetFillData( SCCOL& rStartCol, SCROW& rStartRow,
SCCOL& rEndCol, SCROW& rEndRow );
void ResetFillMode();
bool IsAnyFillMode() const { return nFillMode != ScFillMode::NONE; }
bool IsFillMode() const { return nFillMode == ScFillMode::FILL; }
ScFillMode GetFillMode() const { return nFillMode; }
SvxAdjust GetEditAdjust() const {return eEditAdjust; }
void SetEditAdjust( SvxAdjust eNewEditAdjust ) { eEditAdjust = eNewEditAdjust; }
// TRUE: Cell is merged
bool GetMergeSizePixel( SCCOL nX, SCROW nY, tools::Long& rSizeXPix, tools::Long& rSizeYPix ) const;
bool GetMergeSizePrintTwips( SCCOL nX, SCROW nY, tools::Long& rSizeXTwips, tools::Long& rSizeYTwips ) const;
void GetPosFromPixel( tools::Long nClickX, tools::Long nClickY, ScSplitPos eWhich,
SCCOL& rPosX, SCROW& rPosY,
bool bTestMerge = true, bool bRepair = false, SCTAB nForTab = -1 );
void GetMouseQuadrant( const Point& rClickPos, ScSplitPos eWhich,
SCCOL nPosX, SCROW nPosY, bool& rLeft, bool& rTop );
bool IsRefMode() const { return bIsRefMode; }
ScRefType GetRefType() const { return eRefType; }
SCCOL GetRefStartX() const { return nRefStartX; }
SCROW GetRefStartY() const { return nRefStartY; }
SCTAB GetRefStartZ() const { return nRefStartZ; }
SCCOL GetRefEndX() const { return nRefEndX; }
SCROW GetRefEndY() const { return nRefEndY; }
SCTAB GetRefEndZ() const { return nRefEndZ; }
void SetRefMode( bool bNewMode, ScRefType eNewType )
{ bIsRefMode = bNewMode; eRefType = eNewType; }
void SetRefStart( SCCOL nNewX, SCROW nNewY, SCTAB nNewZ );
void SetRefEnd( SCCOL nNewX, SCROW nNewY, SCTAB nNewZ );
void ResetDelMark() { bDelMarkValid = false; }
void SetDelMark( const ScRange& rRange )
{ aDelRange = rRange; bDelMarkValid = true; }
bool GetDelMark( ScRange& rRange ) const
{ rRange = aDelRange; return bDelMarkValid; }
inline void GetMoveCursor( SCCOL& rCurX, SCROW& rCurY );
const ScViewOptions& GetOptions() const { return maOptions; }
void SetOptions( const ScViewOptions& rOpt );
bool IsGridMode () const { return maOptions.GetOption(VOPT_GRID); }
bool IsSyntaxMode () const { return maOptions.GetOption(VOPT_SYNTAX); }
void SetSyntaxMode ( bool bNewMode ) { maOptions.SetOption(VOPT_SYNTAX, bNewMode); }
bool IsHeaderMode () const { return maOptions.GetOption(VOPT_HEADER); }
void SetHeaderMode ( bool bNewMode ) { maOptions.SetOption(VOPT_HEADER, bNewMode); }
bool IsTabMode () const { return maOptions.GetOption(VOPT_TABCONTROLS); }
bool IsVScrollMode () const { return maOptions.GetOption(VOPT_VSCROLL); }
bool IsHScrollMode () const { return maOptions.GetOption(VOPT_HSCROLL); }
bool IsOutlineMode () const { return maOptions.GetOption(VOPT_OUTLINER); }
bool IsThemedCursor () const { return maOptions.GetOption(VOPT_THEMEDCURSOR); }
/// Force page size for PgUp/PgDown to overwrite the computation based on m_aVisArea.
void ForcePageUpDownOffset(tools::Long nTwips) { m_nLOKPageUpDownOffset = nTwips; }
tools::Long GetPageUpDownOffset() const { return m_nLOKPageUpDownOffset; }
/// The visible area in the client (set by setClientVisibleArea).
const tools::Rectangle& getLOKVisibleArea() const { return maLOKVisibleArea; }
void setLOKVisibleArea(const tools::Rectangle& rArea) { maLOKVisibleArea = rArea; }
void KillEditView();
void ResetEditView();
void SetEditEngine( ScSplitPos eWhich,
ScEditEngineDefaulter* pNewEngine,
vcl::Window* pWin, SCCOL nNewX, SCROW nNewY );
void GetEditView( ScSplitPos eWhich, EditView*& rViewPtr, SCCOL& rCol, SCROW& rRow );
bool HasEditView( ScSplitPos eWhich ) const
{ return pEditView[eWhich] && bEditActive[eWhich]; }
EditView* GetEditView( ScSplitPos eWhich ) const
{ return pEditView[eWhich].get(); }
/**
* Extend the output area for the edit engine view in a horizontal
* direction as needed.
*/
void EditGrowX();
/**
* Extend the output area for the edit engine view in a vertical direction
* as needed.
*
* @param bInitial when true, then the call originates from a brand-new
* edit engine instance.
*/
void EditGrowY( bool bInitial = false );
ScSplitPos GetEditActivePart() const { return eEditActivePart; }
SCCOL GetEditViewCol() const { return nEditCol; }
SCROW GetEditViewRow() const { return nEditRow; }
SCCOL GetEditStartCol() const { return nEditStartCol; }
SCROW GetEditStartRow() const { return nEditRow; } // never editing above the cell
SCCOL GetEditEndCol() const { return nEditEndCol; }
SCROW GetEditEndRow() const { return nEditEndRow; }
tools::Rectangle GetEditArea( ScSplitPos eWhich, SCCOL nPosX, SCROW nPosY, vcl::Window* pWin,
const ScPatternAttr* pPattern, bool bForceToTop, bool bInPrintTwips = false );
void SetTabNo( SCTAB nNewTab );
void SetActivePart( ScSplitPos eNewActive );
Point GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScSplitPos eWhich,
bool bAllowNeg = false, SCTAB nForTab = -1 ) const;
Point GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScHSplitPos eWhich ) const;
Point GetScrPos( SCCOL nWhereX, SCROW nWhereY, ScVSplitPos eWhich ) const;
/// returns the position (top-left corner) of the requested cell in print twips coordinates.
Point GetPrintTwipsPos( SCCOL nCol, SCROW nRow ) const;
Point GetPrintTwipsPosFromTileTwips(const Point& rTileTwipsPos) const;
/// return json for our cursor position.
OString describeCellCursor() const { return describeCellCursorAt(GetCurX(), GetCurY()); }
OString describeCellCursorInPrintTwips() const { return describeCellCursorAt(GetCurX(), GetCurY(), false); }
OString describeCellCursorAt( SCCOL nCol, SCROW nRow, bool bPixelAligned = true ) const;
SCCOL CellsAtX( SCCOL nPosX, SCCOL nDir, ScHSplitPos eWhichX, sal_uInt16 nScrSizeY = SC_SIZE_NONE ) const;
SCROW CellsAtY( SCROW nPosY, SCROW nDir, ScVSplitPos eWhichY, sal_uInt16 nScrSizeX = SC_SIZE_NONE ) const;
SCCOL VisibleCellsX( ScHSplitPos eWhichX ) const; // Completely visible cell
SCROW VisibleCellsY( ScVSplitPos eWhichY ) const;
SCCOL PrevCellsX( ScHSplitPos eWhichX ) const; // Cells on the preceding page
SCROW PrevCellsY( ScVSplitPos eWhichY ) const;
bool IsOle() const;
void SetScreen( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
void SetScreen( const tools::Rectangle& rVisArea );
void SetScreenPos( const Point& rVisAreaStart );
void UpdateScreenZoom( const Fraction& rNewX, const Fraction& rNewY );
const Size& GetScrSize() const { return aScrSize; }
void RecalcPixPos();
Point GetPixPos( ScSplitPos eWhich ) const
{ return Point( pThisTab->nPixPosX[WhichH(eWhich)],
pThisTab->nPixPosY[WhichV(eWhich)] ); }
void SetSpellingView( EditView* pSpView) { pSpellingView = pSpView; }
EditView* GetSpellingView() const { return pSpellingView; }
void UpdateOutlinerFlags( Outliner& rOutl ) const;
Point GetMousePosPixel();
bool UpdateFixX(SCTAB nTab = MAXTAB+1);
bool UpdateFixY(SCTAB nTab = MAXTAB+1);
SCCOL GetTabStartCol() const { return nTabStartCol; }
void SetTabStartCol(SCCOL nNew) { nTabStartCol = nNew; }
ScAddress GetCurPos() const;
const Size& GetScenButSize() const { return aScenButSize; }
void SetScenButSize(const Size& rNew) { aScenButSize = rNew; }
bool IsSelCtrlMouseClick() const { return bSelCtrlMouseClick; }
SCCOLROW GetLOKSheetFreezeIndex(bool bIsCol) const;
bool SetLOKSheetFreezeIndex(const SCCOLROW nFreezeIndex, bool bIsCol, SCTAB nForTab = -1);
bool RemoveLOKFreeze();
void DeriveLOKFreezeAllSheets();
void DeriveLOKFreezeIfNeeded(SCTAB nForTab);
void OverrideWithLOKFreeze(ScSplitMode& eExHSplitMode, ScSplitMode& eExVSplitMode,
SCCOL& nExFixPosX, SCROW& nExFixPosY,
tools::Long& nExHSplitPos, tools::Long& nExVSplitPos, SCTAB nForTab) const;
static inline tools::Long ToPixel( sal_uInt16 nTwips, double nFactor );
/** while (rScrY <= nEndPixels && rPosY <= nEndRow) add pixels of row
heights converted with nPPTY to rScrY, optimized for row height
segments. Upon return rPosY is the last row evaluated <= nEndRow, rScrY
may be > nEndPixels!
*/
static void AddPixelsWhile( tools::Long & rScrY, tools::Long nEndPixels,
SCROW & rPosY, SCROW nEndRow, double nPPTY,
const ScDocument * pDoc, SCTAB nTabNo );
/** while (rScrY <= nEndPixels && rPosY >= nStartRow) add pixels of row
heights converted with nPPTY to rScrY, optimized for row height
segments. Upon return rPosY is the last row evaluated >= nStartRow,
rScrY may be > nEndPixels!
*/
static void AddPixelsWhileBackward( tools::Long & rScrY, tools::Long nEndPixels,
SCROW & rPosY, SCROW nStartRow, double nPPTY,
const ScDocument * pDoc, SCTAB nTabNo );
};
inline tools::Long ScViewData::ToPixel( sal_uInt16 nTwips, double nFactor )
{
tools::Long nRet = static_cast<tools::Long>( nTwips * nFactor );
if ( !nRet && nTwips )
nRet = 1;
return nRet;
}
inline void ScViewData::GetMoveCursor( SCCOL& rCurX, SCROW& rCurY )
{
if ( bIsRefMode )
{
rCurX = nRefEndX;
rCurY = nRefEndY;
}
else
{
rCurX = GetCurX();
rCurY = GetCurY();
}
}
inline ScHSplitPos WhichH( ScSplitPos ePos )
{
return (ePos==SC_SPLIT_TOPLEFT || ePos==SC_SPLIT_BOTTOMLEFT) ?
SC_SPLIT_LEFT : SC_SPLIT_RIGHT;
}
inline ScVSplitPos WhichV( ScSplitPos ePos )
{
return (ePos==SC_SPLIT_TOPLEFT || ePos==SC_SPLIT_TOPRIGHT) ?
SC_SPLIT_TOP : SC_SPLIT_BOTTOM;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|