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
|
/*************************************************************************
*
* $RCSfile: olinewin.hxx,v $
*
* $Revision: 1.3 $
*
* last change: $Author: dr $ $Date: 2002-09-18 13:59:56 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
*
* - GNU Lesser General Public License Version 2.1
* - Sun Industry Standards Source License Version 1.1
*
* Sun Microsystems Inc., October, 2000
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2000 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*
* Sun Industry Standards Source License Version 1.1
* =================================================
* The contents of this file are subject to the Sun Industry Standards
* Source License Version 1.1 (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.openoffice.org/license.html.
*
* Software provided under this License is provided on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
* See the License for the specific provisions governing your rights and
* obligations concerning the Software.
*
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
*
* Copyright: 2000 by Sun Microsystems, Inc.
*
* All Rights Reserved.
*
* Contributor(s): _______________________________________
*
*
************************************************************************/
#ifndef SC_OLINEWIN_HXX
#define SC_OLINEWIN_HXX
#ifndef SC_VIEWDATA_HXX
#include "viewdata.hxx"
#endif
class ScOutlineEntry;
class ScOutlineArray;
class ScOutlineTable;
// ============================================================================
enum ScOutlineMode { SC_OUTLINE_HOR, SC_OUTLINE_VER };
// ----------------------------------------------------------------------------
/** The window left of or above the spreadsheet containing the outline groups
and controls to expand/collapse them. */
class ScOutlineWindow : public Window
{
private:
ScViewData& mrViewData; /// View data containing the document.
ScSplitPos meWhich; /// Which area in split window.
bool mbHoriz; /// true = Horizontal orientation.
ImageList* mpSymbols; /// Symbols for buttons.
Color maLineColor; /// Line color for expanded groups.
sal_Int32 mnHeaderSize; /// Width or height of header area.
sal_uInt16 mnMTLevel; /// Mouse tracking: Level of active button.
sal_uInt16 mnMTEntry; /// Mouse tracking: Entry index of active button.
bool mbMTActive; /// Mouse tracking active?
bool mbMTPressed; /// Mouse tracking: Button currently drawed pressed?
Rectangle maFocusRect; /// Focus rectangle on screen.
sal_uInt16 mnFocusLevel; /// Level of focused button.
sal_uInt16 mnFocusEntry; /// Entry index of focused button.
bool mbDontDrawFocus; /// Do not redraw focus in next Paint().
public:
ScOutlineWindow(
Window* pParent,
ScOutlineMode eMode,
ScViewData* pViewData,
ScSplitPos eWhich );
virtual ~ScOutlineWindow();
/** Sets the size of the header area (width/height dep. on window type). */
void SetHeaderSize( sal_Int32 nNewSize );
/** Returns the width/height the window needs to show all levels. */
sal_Int32 GetDepthSize() const;
/** Scrolls the window content by the specified amount of pixels. */
void ScrollPixel( sal_Int32 nDiff );
private:
/** Initializes color and image settings. */
void InitSettings();
/** Returns the calc document. */
inline ScDocument& GetDoc() const { return *mrViewData.GetDocument(); }
/** Returns the current sheet index. */
inline sal_uInt16 GetTab() const { return mrViewData.GetTabNo(); }
/** Returns the outline array of the corresponding document. */
const ScOutlineArray* GetOutlineArray() const;
/** Returns the specified outline entry. */
const ScOutlineEntry* GetOutlineEntry( sal_uInt16 nLevel, sal_uInt16 nEntry ) const;
/** Returns true, if the column/row is hidden. */
bool IsHidden( sal_uInt16 nColRowIndex ) const;
/** Returns true, if the column/row is filtered. */
bool IsFiltered( sal_uInt16 nColRowIndex ) const;
/** Returns true, if all columns/rows before nColRowIndex are hidden. */
bool IsFirstVisible( sal_uInt16 nColRowIndex ) const;
/** Returns the currently visible column/row range. */
void GetVisibleRange( sal_uInt16& rnColRowStart, sal_uInt16& rnColRowEnd ) const;
/** Returns the point in the window of the specified position. */
Point GetPoint( sal_Int32 nLevelPos, sal_Int32 nEntryPos ) const;
/** Returns the rectangle in the window of the specified position. */
Rectangle GetRectangle(
sal_Int32 nLevelStart, sal_Int32 nEntryStart,
sal_Int32 nLevelEnd, sal_Int32 nEntryEnd ) const;
/** Returns the window size for the level coordinate. */
sal_Int32 GetOutputSizeLevel() const;
/** Returns the window size for the entry coordinate. */
sal_Int32 GetOutputSizeEntry() const;
/** Returns the count of levels of the outline array. 0 means no outlines. */
sal_uInt16 GetLevelCount() const;
/** Returns the pixel position of the specified level. */
sal_Int32 GetLevelPos( sal_uInt16 nLevel ) const;
/** Returns the level of the passed pixel position. */
sal_uInt16 GetLevelFromPos( sal_Int32 nLevelPos ) const;
/** Returns the start coordinate of the specified column/row in the window. */
sal_Int32 GetColRowPos( sal_uInt16 nColRowIndex ) const;
/** Returns the entry position of header images. */
sal_Int32 GetHeaderEntryPos() const;
/** Calculates the coordinates the outline entry takes in the window.
@return false = no part of the group is visible (outside window or collapsed by parent group). */
bool GetEntryPos(
sal_uInt16 nLevel, sal_uInt16 nEntry,
sal_Int32& rnStartPos, sal_Int32& rnEndPos, sal_Int32& rnImagePos ) const;
/** Calculates the absolute position of the image of the specified outline entry.
@param nLevel The level of the entry.
@param nEntry The entry index or SC_OL_HEADERENTRY for the header image.
@return false = image is not visible. */
bool GetImagePos( sal_uInt16 nLevel, sal_uInt16 nEntry, Point& rPos ) const;
/** Returns true, if the button of the specified entry is visible in the window. */
bool IsButtonVisible( sal_uInt16 nLevel, sal_uInt16 nEntry ) const;
/** Returns true, if rPos is inside of a button or over the line of an expanded
group. The outline entry data is stored in the passed variables. */
bool ItemHit( const Point& rPos, sal_uInt16& rnLevel, sal_uInt16& rnEntry, bool& rbButton ) const;
/** Returns true, if rPos is inside of a button.
The button data is stored in the passed variables. */
bool ButtonHit( const Point& rPos, sal_uInt16& rnLevel, sal_uInt16& rnEntry ) const;
/** Returns true, if rPos is over the line of an expanded group.
The outline entry data is stored in the passed variables. */
bool LineHit( const Point& rPos, sal_uInt16& rnLevel, sal_uInt16& rnEntry ) const;
/** Performs an action with the specified item.
@param nLevel The level of the entry.
@param nEntry The entry index or SC_OL_HEADERENTRY for the header entry. */
void DoFunction( sal_uInt16 nLevel, sal_uInt16 nEntry ) const;
/** Expands the specified entry (does nothing with header entries). */
void DoExpand( sal_uInt16 nLevel, sal_uInt16 nEntry ) const;
/** Collapses the specified entry (does nothing with header entries). */
void DoCollapse( sal_uInt16 nLevel, sal_uInt16 nEntry ) const;
/** Calculates index of next/previous focus button in the current level (no paint).
@return true = focus wrapped from end to start or vice versa. */
bool ImplMoveFocusByEntry( bool bForward );
/** Calculates position of focus button in next/previous level (no paint).
@return true = focus wrapped from end to start or vice versa. */
bool ImplMoveFocusByLevel( bool bForward );
/** Focuses next/previous button in the current level. */
void MoveFocusByEntry( bool bForward );
/** Focuses button in next/previous level. */
void MoveFocusByLevel( bool bForward );
/** Focuses next/previous button in tab order. */
void MoveFocusByTabOrder( bool bForward );
/** Starts mouse tracking after click on a button. */
void StartMouseTracking( sal_uInt16 nLevel, sal_uInt16 nEntry );
/** Returns whether mouse tracking mode is active. */
inline bool IsMouseTracking() const { return mbMTActive; }
/** Ends mouse tracking. */
void EndMouseTracking();
/** Sets a clip region for the window area without header. */
void SetEntryAreaClipRegion();
/** Converts coordinates to real window points and draws the line. */
void DrawLineRel(
sal_Int32 nLevelStart, sal_Int32 nEntryStart,
sal_Int32 nLevelEnd, sal_Int32 nEntryEnd );
/** Converts coordinates to real window points and draws the rectangle. */
void DrawRectRel(
sal_Int32 nLevelStart, sal_Int32 nEntryStart,
sal_Int32 nLevelEnd, sal_Int32 nEntryEnd );
/** Draws the specified image unpressed. */
void DrawImageRel( sal_Int32 nLevelPos, sal_Int32 nEntryPos, sal_uInt16 nId );
/** Draws a pressed or unpressed border. */
void DrawBorder( const Point& rPos, bool bPressed );
/** Draws a pressed or unpressed border. */
void DrawBorderRel( sal_uInt16 nLevel, sal_uInt16 nEntry, bool bPressed );
/** Draws the focus rectangle into the focused button. */
void ShowFocus();
/** Erases the focus rectangle from the focused button. */
void HideFocus();
/** Scrolls the window in entry-relative direction. */
void ScrollRel( sal_Int32 nEntryDiff );
/** Scrolls the specified range of the window in entry-relative direction. */
void ScrollRel( sal_Int32 nEntryDiff, sal_Int32 nEntryStart, sal_Int32 nEntryEnd );
protected:
virtual void Paint( const Rectangle& rRect );
virtual void Resize();
virtual void GetFocus();
virtual void LoseFocus();
virtual void MouseMove( const MouseEvent& rMEvt );
virtual void MouseButtonUp( const MouseEvent& rMEvt );
virtual void MouseButtonDown( const MouseEvent& rMEvt );
virtual void KeyInput( const KeyEvent& rKEvt );
public:
virtual void DataChanged( const DataChangedEvent& rDCEvt );
};
// ============================================================================
#endif
|