/************************************************************** * * 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 #include #include #include #include #include #include #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