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
|
/* -*- 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 "address.hxx"
#include <tools/gen.hxx>
#include <tools/color.hxx>
#include "scdllapi.h"
#include <vector>
class SdrObject;
class ScDetectiveData;
class ScDocument;
#define SC_DET_MAXCIRCLE 1000
enum class ScDetectiveDelete { Detective, Circles, Arrows };
enum ScDetectiveObjType
{
SC_DETOBJ_NONE,
SC_DETOBJ_ARROW,
SC_DETOBJ_FROMOTHERTAB,
SC_DETOBJ_TOOTHERTAB,
SC_DETOBJ_CIRCLE,
SC_DETOBJ_RECTANGLE
};
class SC_DLLPUBLIC ScDetectiveFunc
{
static Color nArrowColor;
static Color nErrorColor;
static Color nCommentColor;
static bool bColorsInitialized;
ScDocument& rDoc;
SCTAB nTab;
enum class DrawPosMode
{
TopLeft, ///< Top-left edge of the cell.
BottomRight, ///< Bottom-right edge of the cell.
DetectiveArrow, ///< Position inside cell for detective arrows.
};
/** @return a drawing layer position for the passed cell address. */
Point GetDrawPos( SCCOL nCol, SCROW nRow, DrawPosMode eMode ) const;
/** @return the drawing layer rectangle for the passed cell range. */
tools::Rectangle GetDrawRect( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) const;
/** @return the drawing layer rectangle for the passed cell address. */
tools::Rectangle GetDrawRect( SCCOL nCol, SCROW nRow ) const;
bool HasArrow( const ScAddress& rStart,
SCCOL nEndCol, SCROW nEndRow, SCTAB nEndTab );
void DeleteArrowsAt( SCCOL nCol, SCROW nRow, bool bDestPnt );
void DeleteBox( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
bool HasError( const ScRange& rRange, ScAddress& rErrPos );
/// called from DrawEntry/DrawAlienEntry and InsertObject
void InsertArrow( SCCOL nCol, SCROW nRow,
SCCOL nRefStartCol, SCROW nRefStartRow,
SCCOL nRefEndCol, SCROW nRefEndRow,
bool bFromOtherTab, bool bRed,
ScDetectiveData& rData );
void InsertToOtherTab( SCCOL nStartCol, SCROW nStartRow,
SCCOL nEndCol, SCROW nEndRow, bool bRed,
ScDetectiveData& rData );
/// DrawEntry / DrawAlienEntry check for existing arrows and errors
bool DrawEntry( SCCOL nCol, SCROW nRow, const ScRange& rRef,
ScDetectiveData& rData );
bool DrawAlienEntry( const ScRange& rRef,
ScDetectiveData& rData );
void DrawCircle( SCCOL nCol, SCROW nRow, ScDetectiveData& rData );
sal_uInt16 InsertPredLevel( SCCOL nCol, SCROW nRow, ScDetectiveData& rData, sal_uInt16 nLevel );
sal_uInt16 InsertPredLevelArea( const ScRange& rRef,
ScDetectiveData& rData, sal_uInt16 nLevel );
sal_uInt16 FindPredLevel( SCCOL nCol, SCROW nRow, sal_uInt16 nLevel, sal_uInt16 nDeleteLevel );
sal_uInt16 FindPredLevelArea( const ScRange& rRef,
sal_uInt16 nLevel, sal_uInt16 nDeleteLevel );
sal_uInt16 InsertErrorLevel( SCCOL nCol, SCROW nRow, ScDetectiveData& rData, sal_uInt16 nLevel );
sal_uInt16 InsertSuccLevel( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
ScDetectiveData& rData, sal_uInt16 nLevel );
sal_uInt16 FindSuccLevel( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
sal_uInt16 nLevel, sal_uInt16 nDeleteLevel );
void FindFrameForObject( const SdrObject* pObject, ScRange& rRange );
void Modified();
public:
ScDetectiveFunc(ScDocument& rDocument, SCTAB nTable) : rDoc(rDocument),nTab(nTable) {}
bool ShowSucc( SCCOL nCol, SCROW nRow );
bool ShowPred( SCCOL nCol, SCROW nRow );
bool ShowError( SCCOL nCol, SCROW nRow );
bool DeleteSucc( SCCOL nCol, SCROW nRow );
bool DeletePred( SCCOL nCol, SCROW nRow );
bool DeleteAll( ScDetectiveDelete eWhat );
bool DeleteCirclesAt( SCCOL nCol, SCROW nRow );
bool MarkInvalid(bool& rOverflow);
void GetAllPreds(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ::std::vector<ScTokenRef>& rRefTokens);
void GetAllSuccs(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ::std::vector<ScTokenRef>& rRefTokens);
static void UpdateAllComments( ScDocument& rDoc ); ///< on all tables
void UpdateAllArrowColors(); ///< on all tables
static bool IsNonAlienArrow( const SdrObject* pObject );
ScDetectiveObjType GetDetectiveObjectType( SdrObject* pObject, SCTAB nObjTab,
ScAddress& rPosition, ScRange& rSource, bool& rRedLine );
void InsertObject( ScDetectiveObjType eType, const ScAddress& rPosition,
const ScRange& rSource, bool bRedLine );
static Color GetArrowColor();
static Color GetErrorColor();
static Color GetCommentColor();
static void InitializeColors();
static bool IsColorsInitialized();
static void AppendChangTrackNoteSeparator(OUString &str);
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|