blob: aea382fde41687645f60f8fc50561634897f7da0 [file] [log] [blame]
/**************************************************************
*
* 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