xref: /trunk/main/sc/source/ui/inc/fieldwnd.hxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef SC_FIELDWND_HXX
29 #define SC_FIELDWND_HXX
30 
31 #include <utility>
32 #include <vector>
33 #include <boost/shared_ptr.hpp>
34 #include <cppuhelper/weakref.hxx>
35 #include <rtl/ref.hxx>
36 #include <vcl/ctrl.hxx>
37 #include <vcl/fixed.hxx>
38 
39 #include "address.hxx"
40 #include "pivot.hxx"
41 
42 // ============================================================================
43 
44 class ScPivotLayoutDlg;
45 class ScAccessibleDataPilotControl;
46 
47 const size_t PIVOTFIELD_INVALID = static_cast< size_t >( -1 );
48 
49 // ============================================================================
50 
51 /** Type of the pivot table field window. */
52 enum ScPivotFieldType
53 {
54     PIVOTFIELDTYPE_PAGE,            /// Window for all page fields.
55     PIVOTFIELDTYPE_COL,             /// Window for all column fields.
56     PIVOTFIELDTYPE_ROW,             /// Window for all row fields.
57     PIVOTFIELDTYPE_DATA,            /// Window for all data fields.
58     PIVOTFIELDTYPE_SELECT           /// Selection window with all fields.
59 };
60 
61 /** Type of an end tracking event. */
62 enum ScPivotFieldEndTracking
63 {
64     ENDTRACKING_SUSPEND,            /// Stop tracking in this window, but tracking still active (in another window).
65     ENDTRACKING_CANCEL,             /// Tracking has been cancelled.
66     ENDTRACKING_DROP                /// Tracking has ended, a field has been dropped.
67 };
68 
69 // ============================================================================
70 
71 typedef ::std::pair< const ScPivotFuncData*, size_t > ScPivotFuncDataEntry;
72 
73 // ============================================================================
74 
75 /** Represents a field area in the pivot table layout dialog. */
76 class ScPivotFieldWindow : public Control
77 {
78 public:
79                         ScPivotFieldWindow(
80                             ScPivotLayoutDlg* pDialog,
81                             const ResId& rResId,
82                             ScrollBar& rScrollBar,
83                             FixedText* pFtCaption,
84                             const ::rtl::OUString& rName,
85                             ScPivotFieldType eFieldType,
86                             const sal_Char* pcHelpId,
87                             PointerStyle eDropPointer,
88                             size_t nColCount,
89                             size_t nRowCount,
90                             long nFieldWidthFactor,
91                             long nSpaceSize );
92 
93     virtual             ~ScPivotFieldWindow();
94 
95     /** Initializes this field window from the passed label data (used for selection window). */
96     void                ReadDataLabels( const ScDPLabelDataVector& rLabels );
97     /** Initializes this field window from the passed field data (used for row/col/page/data window). */
98     void                ReadPivotFields( const ScPivotFieldVector& rPivotFields );
99 
100     /** Fills the passed vector with the plain names of all fields from this field window. */
101     void                WriteFieldNames( ScDPNameVec& rFieldNames ) const;
102     /** Fills the passed pivot field vector with the fields of this field window. */
103     void                WritePivotFields( ScPivotFieldVector& rPivotFields ) const;
104 
105     /** Returns the type of this field window. */
106     inline ScPivotFieldType GetType() const { return meFieldType; }
107     /** Returns the mouse pointer style for tracking over this window. */
108     inline PointerStyle GetDropPointerStyle() const { return meDropPointer; }
109     /** Returns the name of the control without shortcut. */
110     inline ::rtl::OUString GetName() const { return maName; }
111     /** Returns the description of the control which is used for the accessibility objects. */
112     ::rtl::OUString     GetDescription() const;
113 
114     /** Returns true, if the window is empty. */
115     inline bool         IsEmpty() const { return maFields.empty(); }
116     /** Returns the number of existing fields. */
117     inline size_t       GetFieldCount() const { return maFields.size(); }
118     /** Returns the text of an existing field. */
119     ::rtl::OUString     GetFieldText( size_t nFieldIndex ) const;
120 
121     /** Returns the index of a field with the specified column identifier. */
122     ScPivotFuncDataEntry FindFuncDataByCol( SCCOL nCol ) const;
123 
124     /** Returns the pixel size of a field. */
125     inline const Size&  GetFieldSize() const { return maFieldSize; }
126     /** Returns the pixel position of a field (without bound check). */
127     Point               GetFieldPosition( size_t nFieldIndex ) const;
128     /** Calculates the field index at a specific pixel position. */
129     size_t              GetFieldIndex( const Point& rWindowPos ) const;
130     /** Calculates the field insertion index for mouse drop at a specific pixel position. */
131     size_t              GetDropIndex( const Point& rWindowPos ) const;
132 
133     /** Returns the index of the selected field. */
134     inline size_t       GetSelectedIndex() const { return mnSelectIndex; }
135     /** Grabs focus and sets the passed selection. */
136     void                GrabFocusAndSelect( size_t nIndex );
137     /** Selects the next field. */
138     void                SelectNextField();
139 
140     /** Inserts a new field in front of the specified field. */
141     void                InsertField( size_t nInsertIndex, const ScPivotFuncData& rFuncData );
142     /** Removes the specified field. */
143     bool                RemoveField( size_t nRemoveIndex );
144     /** Moves the specified field to a new position. */
145     bool                MoveField( size_t nFieldIndex, size_t nInsertIndex );
146 
147     /** Returns the selected field (pointer is valid as long as field vector is not changed). */
148     const ScPivotFuncData* GetSelectedFuncData() const;
149     /** Removes the selected field. */
150     void                ModifySelectedField( const ScPivotFuncData& rFuncData );
151     /** Removes the selected field. */
152     bool                RemoveSelectedField();
153     /** Moves the selected field in front of the specified field. */
154     bool                MoveSelectedField( size_t nInsertIndex );
155 
156     /** Called from dialog when tracking starts in this field window. */
157     void                NotifyStartTracking();
158     /** Called from dialog while tracking in this field window. */
159     void                NotifyTracking( const Point& rWindowPos );
160     /** Called from dialog when tracking ends in this field window. */
161     void                NotifyEndTracking( ScPivotFieldEndTracking eEndType );
162 
163 protected:
164     virtual void        Paint( const Rectangle& rRect );
165     virtual void        StateChanged( StateChangedType nStateChange );
166     virtual void        DataChanged( const DataChangedEvent& rDCEvt );
167     virtual void        KeyInput( const KeyEvent& rKEvt );
168     virtual void        MouseButtonDown( const MouseEvent& rMEvt );
169     virtual void        RequestHelp( const HelpEvent& rHEvt );
170     virtual void        GetFocus();
171     virtual void        LoseFocus();
172     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
173                         CreateAccessible();
174 
175 private:
176     /** A structure containing all data needed for a field in this window. */
177     struct ScPivotWindowField
178     {
179         ScPivotFuncData     maFuncData;         /// Field data from source pivot table.
180         ::rtl::OUString     maFieldName;        /// Name displayed on the field button.
181         bool                mbClipped;          /// True = field text does not fit into button.
182         explicit            ScPivotWindowField( const ScDPLabelData& rLabelData );
183         explicit            ScPivotWindowField( ScPivotLayoutDlg& rDialog, const ScPivotField& rField, bool bDataWindow );
184         explicit            ScPivotWindowField( ScPivotLayoutDlg& rDialog, const ScPivotFuncData& rFuncData, bool bDataWindow );
185         void                InitFieldName( ScPivotLayoutDlg& rDialog, bool bDataWindow );
186     };
187 
188     /** Specifies how the selection cursor can move in the window. */
189     enum MoveType { PREV_FIELD, NEXT_FIELD, PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE, FIRST_FIELD, LAST_FIELD };
190 
191     /** Calculates a scroll position to make the passed field visible. Tries to
192         stick to current scroll position if possible. */
193     size_t              RecalcVisibleIndex( size_t nSelectIndex ) const;
194 
195     /** Sets selection to the specified field and changes scrolling position. */
196     void                SetSelectionUnchecked( size_t nSelectIndex, size_t nFirstVisIndex );
197     /** Selects a field and adjusts scrolling position to make the field visible. */
198     void                MoveSelection( size_t nSelectIndex );
199     /** Sets selection to a new position relative to current. */
200     void                MoveSelection( MoveType eMoveType );
201     /** Moves the selected field to a new position relative to current. */
202     void                MoveSelectedField( MoveType eMoveType );
203 
204     /** Inserts the passed field into the vector and notifies accessibility object. */
205     void                InsertFieldUnchecked( size_t nInsertIndex, const ScPivotWindowField& rField );
206     /** Removes the specified field from the vector and notifies accessibility object. */
207     void                RemoveFieldUnchecked( size_t nRemoveIndex );
208 
209     /** Draws the background. */
210     void                DrawBackground( OutputDevice& rDev );
211     /** Draws the specified field. */
212     void                DrawField( OutputDevice& rDev, size_t nFieldIndex );
213     /** Draws the insertion cursor. */
214     void                DrawInsertionCursor( OutputDevice& rDev );
215 
216     /** Returns a reference to the accessiblity object, if still alive. */
217     ::rtl::Reference< ScAccessibleDataPilotControl > GetAccessibleControl();
218 
219 	DECL_LINK( ScrollHdl, ScrollBar* );
220 
221 private:
222     typedef ::std::vector< ScPivotWindowField > ScPivotWindowFieldVector;
223 
224     ScPivotLayoutDlg*   mpDialog;           /// Parent pivot table dialog.
225     ::com::sun::star::uno::WeakReference< ::com::sun::star::accessibility::XAccessible >
226                         mxAccessible;       /// Weak reference to the accessible object.
227     ScAccessibleDataPilotControl*
228                         mpAccessible;       /// Pointer to the accessible implementation.
229     ScrollBar&          mrScrollBar;        /// Scrollbar of the select window.
230     FixedText*          mpFtCaption;        /// Associated fixedtext control with caption text and mnemonic.
231     ::rtl::OUString     maName;             /// Name of the control, used for accessibility.
232     ScPivotWindowFieldVector maFields;      /// Vector with all fields contained in this window.
233     Size                maFieldSize;        /// Size of a single field in pixels.
234     Size                maSpaceSize;        /// Size between fields in pixels.
235     ScPivotFieldType    meFieldType;        /// Type of this field window.
236     PointerStyle        meDropPointer;      /// Mouse pointer style for tracking over this window.
237     size_t              mnColCount;         /// Number of field columns.
238     size_t              mnRowCount;         /// Number of field rows.
239     size_t              mnLineSize;         /// Number of fields per line (depending on scrolling orientation).
240     size_t              mnPageSize;         /// Number of visible fields.
241     size_t              mnFirstVisIndex;    /// Index of first visible field (scrolling offset).
242     size_t              mnSelectIndex;      /// Currently selected field.
243     size_t              mnInsCursorIndex;   /// Position of the insertion cursor.
244     size_t              mnOldFirstVisIndex; /// Stores original scroll position during auto scrolling.
245     size_t              mnAutoScrollDelay;  /// Initial counter before auto scrolling starts on tracking.
246     bool                mbVertical;         /// True = sort fields vertically.
247     bool                mbIsTrackingSource; /// True = this field window is the source while tracking.
248 };
249 
250 // ============================================================================
251 
252 #endif
253