| /************************************************************** |
| * |
| * 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 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef SC_FIELDWND_HXX |
| #define SC_FIELDWND_HXX |
| |
| #include <utility> |
| #include <vector> |
| #include <boost/shared_ptr.hpp> |
| #include <cppuhelper/weakref.hxx> |
| #include <rtl/ref.hxx> |
| #include <vcl/ctrl.hxx> |
| #include <vcl/fixed.hxx> |
| |
| #include "address.hxx" |
| #include "pivot.hxx" |
| |
| // ============================================================================ |
| |
| class ScPivotLayoutDlg; |
| class ScAccessibleDataPilotControl; |
| |
| const size_t PIVOTFIELD_INVALID = static_cast< size_t >( -1 ); |
| |
| // ============================================================================ |
| |
| /** Type of the pivot table field window. */ |
| enum ScPivotFieldType |
| { |
| PIVOTFIELDTYPE_PAGE, /// Window for all page fields. |
| PIVOTFIELDTYPE_COL, /// Window for all column fields. |
| PIVOTFIELDTYPE_ROW, /// Window for all row fields. |
| PIVOTFIELDTYPE_DATA, /// Window for all data fields. |
| PIVOTFIELDTYPE_SELECT /// Selection window with all fields. |
| }; |
| |
| /** Type of an end tracking event. */ |
| enum ScPivotFieldEndTracking |
| { |
| ENDTRACKING_SUSPEND, /// Stop tracking in this window, but tracking still active (in another window). |
| ENDTRACKING_CANCEL, /// Tracking has been cancelled. |
| ENDTRACKING_DROP /// Tracking has ended, a field has been dropped. |
| }; |
| |
| // ============================================================================ |
| |
| typedef ::std::pair< const ScPivotFuncData*, size_t > ScPivotFuncDataEntry; |
| |
| // ============================================================================ |
| |
| /** Represents a field area in the pivot table layout dialog. */ |
| class ScPivotFieldWindow : public Control |
| { |
| public: |
| ScPivotFieldWindow( |
| ScPivotLayoutDlg* pDialog, |
| const ResId& rResId, |
| ScrollBar& rScrollBar, |
| FixedText* pFtCaption, |
| const ::rtl::OUString& rName, |
| ScPivotFieldType eFieldType, |
| const sal_Char* pcHelpId, |
| PointerStyle eDropPointer, |
| size_t nColCount, |
| size_t nRowCount, |
| long nFieldWidthFactor, |
| long nSpaceSize ); |
| |
| virtual ~ScPivotFieldWindow(); |
| |
| /** Initializes this field window from the passed label data (used for selection window). */ |
| void ReadDataLabels( const ScDPLabelDataVector& rLabels ); |
| /** Initializes this field window from the passed field data (used for row/col/page/data window). */ |
| void ReadPivotFields( const ScPivotFieldVector& rPivotFields ); |
| |
| /** Fills the passed vector with the plain names of all fields from this field window. */ |
| void WriteFieldNames( ScDPNameVec& rFieldNames ) const; |
| /** Fills the passed pivot field vector with the fields of this field window. */ |
| void WritePivotFields( ScPivotFieldVector& rPivotFields ) const; |
| |
| /** Returns the type of this field window. */ |
| inline ScPivotFieldType GetType() const { return meFieldType; } |
| /** Returns the mouse pointer style for tracking over this window. */ |
| inline PointerStyle GetDropPointerStyle() const { return meDropPointer; } |
| /** Returns the name of the control without shortcut. */ |
| inline ::rtl::OUString GetName() const { return maName; } |
| /** Returns the description of the control which is used for the accessibility objects. */ |
| ::rtl::OUString GetDescription() const; |
| |
| /** Returns true, if the window is empty. */ |
| inline bool IsEmpty() const { return maFields.empty(); } |
| /** Returns the number of existing fields. */ |
| inline size_t GetFieldCount() const { return maFields.size(); } |
| /** Returns the text of an existing field. */ |
| ::rtl::OUString GetFieldText( size_t nFieldIndex ) const; |
| |
| /** Returns the index of a field with the specified column identifier. */ |
| ScPivotFuncDataEntry FindFuncDataByCol( SCCOL nCol ) const; |
| |
| /** Returns the pixel size of a field. */ |
| inline const Size& GetFieldSize() const { return maFieldSize; } |
| /** Returns the pixel position of a field (without bound check). */ |
| Point GetFieldPosition( size_t nFieldIndex ) const; |
| /** Calculates the field index at a specific pixel position. */ |
| size_t GetFieldIndex( const Point& rWindowPos ) const; |
| /** Calculates the field insertion index for mouse drop at a specific pixel position. */ |
| size_t GetDropIndex( const Point& rWindowPos ) const; |
| |
| /** Returns the index of the selected field. */ |
| inline size_t GetSelectedIndex() const { return mnSelectIndex; } |
| /** Grabs focus and sets the passed selection. */ |
| void GrabFocusAndSelect( size_t nIndex ); |
| /** Selects the next field. */ |
| void SelectNextField(); |
| |
| /** Inserts a new field in front of the specified field. */ |
| void InsertField( size_t nInsertIndex, const ScPivotFuncData& rFuncData ); |
| /** Removes the specified field. */ |
| bool RemoveField( size_t nRemoveIndex ); |
| /** Moves the specified field to a new position. */ |
| bool MoveField( size_t nFieldIndex, size_t nInsertIndex ); |
| |
| /** Returns the selected field (pointer is valid as long as field vector is not changed). */ |
| const ScPivotFuncData* GetSelectedFuncData() const; |
| /** Removes the selected field. */ |
| void ModifySelectedField( const ScPivotFuncData& rFuncData ); |
| /** Removes the selected field. */ |
| bool RemoveSelectedField(); |
| /** Moves the selected field in front of the specified field. */ |
| bool MoveSelectedField( size_t nInsertIndex ); |
| |
| /** Called from dialog when tracking starts in this field window. */ |
| void NotifyStartTracking(); |
| /** Called from dialog while tracking in this field window. */ |
| void NotifyTracking( const Point& rWindowPos ); |
| /** Called from dialog when tracking ends in this field window. */ |
| void NotifyEndTracking( ScPivotFieldEndTracking eEndType ); |
| |
| protected: |
| virtual void Paint( const Rectangle& rRect ); |
| virtual void StateChanged( StateChangedType nStateChange ); |
| virtual void DataChanged( const DataChangedEvent& rDCEvt ); |
| virtual void KeyInput( const KeyEvent& rKEvt ); |
| virtual void MouseButtonDown( const MouseEvent& rMEvt ); |
| virtual void RequestHelp( const HelpEvent& rHEvt ); |
| virtual void GetFocus(); |
| virtual void LoseFocus(); |
| virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > |
| CreateAccessible(); |
| |
| private: |
| /** A structure containing all data needed for a field in this window. */ |
| struct ScPivotWindowField |
| { |
| ScPivotFuncData maFuncData; /// Field data from source pivot table. |
| ::rtl::OUString maFieldName; /// Name displayed on the field button. |
| bool mbClipped; /// True = field text does not fit into button. |
| explicit ScPivotWindowField( const ScDPLabelData& rLabelData ); |
| explicit ScPivotWindowField( ScPivotLayoutDlg& rDialog, const ScPivotField& rField, bool bDataWindow ); |
| explicit ScPivotWindowField( ScPivotLayoutDlg& rDialog, const ScPivotFuncData& rFuncData, bool bDataWindow ); |
| void InitFieldName( ScPivotLayoutDlg& rDialog, bool bDataWindow ); |
| }; |
| |
| /** Specifies how the selection cursor can move in the window. */ |
| enum MoveType { PREV_FIELD, NEXT_FIELD, PREV_LINE, NEXT_LINE, PREV_PAGE, NEXT_PAGE, FIRST_FIELD, LAST_FIELD }; |
| |
| /** Calculates a scroll position to make the passed field visible. Tries to |
| stick to current scroll position if possible. */ |
| size_t RecalcVisibleIndex( size_t nSelectIndex ) const; |
| |
| /** Sets selection to the specified field and changes scrolling position. */ |
| void SetSelectionUnchecked( size_t nSelectIndex, size_t nFirstVisIndex ); |
| /** Selects a field and adjusts scrolling position to make the field visible. */ |
| void MoveSelection( size_t nSelectIndex ); |
| /** Sets selection to a new position relative to current. */ |
| void MoveSelection( MoveType eMoveType ); |
| /** Moves the selected field to a new position relative to current. */ |
| void MoveSelectedField( MoveType eMoveType ); |
| |
| /** Inserts the passed field into the vector and notifies accessibility object. */ |
| void InsertFieldUnchecked( size_t nInsertIndex, const ScPivotWindowField& rField ); |
| /** Removes the specified field from the vector and notifies accessibility object. */ |
| void RemoveFieldUnchecked( size_t nRemoveIndex ); |
| |
| /** Draws the background. */ |
| void DrawBackground( OutputDevice& rDev ); |
| /** Draws the specified field. */ |
| void DrawField( OutputDevice& rDev, size_t nFieldIndex ); |
| /** Draws the insertion cursor. */ |
| void DrawInsertionCursor( OutputDevice& rDev ); |
| |
| /** Returns a reference to the accessiblity object, if still alive. */ |
| ::rtl::Reference< ScAccessibleDataPilotControl > GetAccessibleControl(); |
| |
| DECL_LINK( ScrollHdl, ScrollBar* ); |
| |
| private: |
| typedef ::std::vector< ScPivotWindowField > ScPivotWindowFieldVector; |
| |
| ScPivotLayoutDlg* mpDialog; /// Parent pivot table dialog. |
| ::com::sun::star::uno::WeakReference< ::com::sun::star::accessibility::XAccessible > |
| mxAccessible; /// Weak reference to the accessible object. |
| ScAccessibleDataPilotControl* |
| mpAccessible; /// Pointer to the accessible implementation. |
| ScrollBar& mrScrollBar; /// Scrollbar of the select window. |
| FixedText* mpFtCaption; /// Associated fixedtext control with caption text and mnemonic. |
| ::rtl::OUString maName; /// Name of the control, used for accessibility. |
| ScPivotWindowFieldVector maFields; /// Vector with all fields contained in this window. |
| Size maFieldSize; /// Size of a single field in pixels. |
| Size maSpaceSize; /// Size between fields in pixels. |
| ScPivotFieldType meFieldType; /// Type of this field window. |
| PointerStyle meDropPointer; /// Mouse pointer style for tracking over this window. |
| size_t mnColCount; /// Number of field columns. |
| size_t mnRowCount; /// Number of field rows. |
| size_t mnLineSize; /// Number of fields per line (depending on scrolling orientation). |
| size_t mnPageSize; /// Number of visible fields. |
| size_t mnFirstVisIndex; /// Index of first visible field (scrolling offset). |
| size_t mnSelectIndex; /// Currently selected field. |
| size_t mnInsCursorIndex; /// Position of the insertion cursor. |
| size_t mnOldFirstVisIndex; /// Stores original scroll position during auto scrolling. |
| size_t mnAutoScrollDelay; /// Initial counter before auto scrolling starts on tracking. |
| bool mbVertical; /// True = sort fields vertically. |
| bool mbIsTrackingSource; /// True = this field window is the source while tracking. |
| }; |
| |
| // ============================================================================ |
| |
| #endif |