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
|
/*************************************************************************
*
* $RCSfile: csvruler.hxx,v $
*
* $Revision: 1.4 $
*
* last change: $Author: dr $ $Date: 2002-10-22 10:35:46 $
*
* 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_CSVRULER_HXX
#define _SC_CSVRULER_HXX
#ifndef _SV_VIRDEV_HXX
#include <vcl/virdev.hxx>
#endif
#ifndef _SC_CSVCONTROL_HXX
#include "csvcontrol.hxx"
#endif
#ifndef _SC_CSVSPLITS_HXX
#include "csvsplits.hxx"
#endif
class ScAccessibleCsvControl;
// ============================================================================
/** A ruler control for the CSV import dialog. Supports setting and moving
splits (which divide lines of data into several columns). */
class ScCsvRuler : public ScCsvControl
{
private:
VirtualDevice maBackgrDev; /// Ruler background, scaling.
VirtualDevice maRulerDev; /// Ruler with splits and cursor.
Color maBackColor; /// Background color.
Color maActiveColor; /// Color for active part of ruler.
Color maTextColor; /// Text and scale color.
Color maSplitColor; /// Split area color.
ScCsvSplits maSplits; /// Vector with split positions.
ScCsvSplits maOldSplits; /// Old state for cancellation.
sal_Int32 mnPosCursorLast; /// Last valid position of cursor.
sal_Int32 mnPosMTStart; /// Start position of mouse tracking.
sal_Int32 mnPosMTCurr; /// Current position of mouse tracking.
bool mbPosMTMoved; /// Tracking: Anytime moved to another position?
Size maWinSize; /// Size of the control.
Rectangle maActiveRect; /// The active area of the ruler.
sal_Int32 mnSplitSize; /// Size of a split circle.
// ------------------------------------------------------------------------
public:
explicit ScCsvRuler( ScCsvControl& rParent );
// common ruler handling --------------------------------------------------
public:
/** Sets position and size of the ruler. The height is calculated internally. */
virtual void SetPosSizePixel(
sal_Int32 nX, sal_Int32 nY,
sal_Int32 nWidth, sal_Int32 nHeight,
sal_uInt16 nFlags = WINDOW_POSSIZE_ALL );
/** Apply current layout data to the ruler. */
void ApplyLayout( const ScCsvLayoutData& rOldData );
private:
/** Reads colors from system settings. */
void InitColors();
/** Initializes all data dependent from the control's size. */
void InitSizeData();
/** Moves cursor to a new position.
@param bScroll TRUE = The method may scroll the ruler. */
void MoveCursor( sal_Int32 nPos, bool bScroll = true );
/** Moves cursor to the given direction. */
void MoveCursorRel( ScMoveMode eDir );
/** Sets cursor to an existing split, according to eDir. */
void MoveCursorToSplit( ScMoveMode eDir );
/** Scrolls data grid vertically. */
void ScrollVertRel( ScMoveMode eDir );
// split handling ---------------------------------------------------------
public:
/** Returns the split array. */
inline const ScCsvSplits& GetSplits() const { return maSplits; }
/** Returns the number of splits. */
inline sal_uInt32 GetSplitCount() const
{ return maSplits.Count(); }
/** Returns the position of the specified split. */
inline sal_Int32 GetSplitPos( sal_uInt32 nIndex ) const
{ return maSplits[ nIndex ]; }
/** Finds a position nearest to nPos which does not cause scrolling the visible area. */
sal_Int32 GetNoScrollPos( sal_Int32 nPos ) const;
/** Returns true if at position nPos is a split. */
inline bool HasSplit( sal_Int32 nPos ) const { return maSplits.HasSplit( nPos ); }
/** Inserts a split. */
void InsertSplit( sal_Int32 nPos );
/** Removes a split. */
void RemoveSplit( sal_Int32 nPos );
/** Moves a split from nPos to nNewPos. */
void MoveSplit( sal_Int32 nPos, sal_Int32 nNewPos );
/** Removes all splits of the ruler. */
void RemoveAllSplits();
private:
/** Finds next position without a split. */
sal_Int32 FindEmptyPos( sal_Int32 nPos, ScMoveMode eDir ) const;
/** Moves split and cursor to nNewPos and commits event. */
void MoveCurrSplit( sal_Int32 nNewPos );
/** Moves split and cursor to the given direction and commits event. */
void MoveCurrSplitRel( ScMoveMode eDir );
// event handling ---------------------------------------------------------
protected:
virtual void Resize();
virtual void GetFocus();
virtual void LoseFocus();
virtual void DataChanged( const DataChangedEvent& rDCEvt );
virtual void MouseButtonDown( const MouseEvent& rMEvt );
virtual void MouseMove( const MouseEvent& rMEvt );
virtual void Tracking( const TrackingEvent& rTEvt );
virtual void KeyInput( const KeyEvent& rKEvt );
private:
/** Starts tracking at the specified position. */
void StartMouseTracking( sal_Int32 nPos );
/** Moves tracking to a new position. */
void MoveMouseTracking( sal_Int32 nPos );
/** Applies tracking action for the current tracking position.
@param bApply TRUE = apply action, FALSE = cancel action. */
void EndMouseTracking( bool bApply );
// painting ---------------------------------------------------------------
protected:
virtual void Paint( const Rectangle& );
public:
/** Redraws the entire ruler. */
void ImplRedraw();
private:
/** Returns the width of the control. */
inline sal_Int32 GetWidth() const { return maWinSize.Width(); }
/** Returns the height of the control. */
inline sal_Int32 GetHeight() const { return maWinSize.Height(); }
/** Draws the background and active area to maBackgrDev (only the given X range). */
void ImplDrawArea( sal_Int32 nPosX, sal_Int32 nWidth );
/** Draws the entire ruler background with scaling to maBackgrDev. */
void ImplDrawBackgrDev();
/** Draws a split to maRulerDev. */
void ImplDrawSplit( sal_Int32 nPos );
/** Erases a split from maRulerDev. */
void ImplEraseSplit( sal_Int32 nPos );
/** Draws the ruler background, all splits and the cursor to maRulerDev. */
void ImplDrawRulerDev();
/** Inverts the cursor bar at the specified position in maRulerDev. */
void ImplInvertCursor( sal_Int32 nPos );
/** Draws directly tracking rectangle to the column with the specified index. */
void ImplDrawTrackingRect();
/** Sets arrow or horizontal split pointer. */
void ImplSetMousePointer( sal_Int32 nPos );
// accessibility ----------------------------------------------------------
protected:
/** Creates a new accessible object. */
virtual ScAccessibleCsvControl* ImplCreateAccessible();
};
// ============================================================================
#endif
|