151 lines
5.6 KiB
C++
151 lines
5.6 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/msw/headerctrl.h
|
|
// Purpose: wxMSW native wxHeaderCtrl
|
|
// Author: Vadim Zeitlin
|
|
// Created: 2008-12-01
|
|
// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_MSW_HEADERCTRL_H_
|
|
#define _WX_MSW_HEADERCTRL_H_
|
|
|
|
class WXDLLIMPEXP_FWD_CORE wxImageList;
|
|
|
|
class wxMSWHeaderCtrlCustomDraw;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxHeaderCtrl
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class WXDLLIMPEXP_CORE wxHeaderCtrl : public wxHeaderCtrlBase
|
|
{
|
|
public:
|
|
wxHeaderCtrl()
|
|
{
|
|
Init();
|
|
}
|
|
|
|
wxHeaderCtrl(wxWindow *parent,
|
|
wxWindowID id = wxID_ANY,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
long style = wxHD_DEFAULT_STYLE,
|
|
const wxString& name = wxHeaderCtrlNameStr)
|
|
{
|
|
Init();
|
|
|
|
Create(parent, id, pos, size, style, name);
|
|
}
|
|
|
|
bool Create(wxWindow *parent,
|
|
wxWindowID id = wxID_ANY,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
long style = wxHD_DEFAULT_STYLE,
|
|
const wxString& name = wxHeaderCtrlNameStr);
|
|
|
|
virtual ~wxHeaderCtrl();
|
|
|
|
// Override to implement colours support via custom drawing.
|
|
virtual bool SetBackgroundColour(const wxColour& colour) wxOVERRIDE;
|
|
virtual bool SetForegroundColour(const wxColour& colour) wxOVERRIDE;
|
|
virtual bool SetFont(const wxFont& font) wxOVERRIDE;
|
|
|
|
protected:
|
|
// override wxWindow methods which must be implemented by a new control
|
|
virtual wxSize DoGetBestSize() const wxOVERRIDE;
|
|
virtual void DoSetSize(int x, int y,
|
|
int width, int height,
|
|
int sizeFlags = wxSIZE_AUTO) wxOVERRIDE;
|
|
|
|
private:
|
|
// implement base class pure virtuals
|
|
virtual void DoSetCount(unsigned int count) wxOVERRIDE;
|
|
virtual unsigned int DoGetCount() const wxOVERRIDE;
|
|
virtual void DoUpdate(unsigned int idx) wxOVERRIDE;
|
|
|
|
virtual void DoScrollHorz(int dx) wxOVERRIDE;
|
|
|
|
virtual void DoSetColumnsOrder(const wxArrayInt& order) wxOVERRIDE;
|
|
virtual wxArrayInt DoGetColumnsOrder() const wxOVERRIDE;
|
|
|
|
// override MSW-specific methods needed for new control
|
|
virtual WXDWORD MSWGetStyle(long style, WXDWORD *exstyle) const wxOVERRIDE;
|
|
virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result) wxOVERRIDE;
|
|
|
|
// common part of all ctors
|
|
void Init();
|
|
|
|
// wrapper around Header_InsertItem(): insert the item using information
|
|
// from the given column at the given index
|
|
void DoInsertItem(const wxHeaderColumn& col, unsigned int idx);
|
|
|
|
// get the number of currently visible items: this is also the total number
|
|
// of items contained in the native control
|
|
int GetShownColumnsCount() const;
|
|
|
|
// due to the discrepancy for the hidden columns which we know about but
|
|
// the native control does not, there can be a difference between the
|
|
// column indices we use and the ones used by the native control; these
|
|
// functions translate between them
|
|
//
|
|
// notice that MSWToNativeIdx() shouldn't be called for hidden columns and
|
|
// MSWFromNativeIdx() always returns an index of a visible column
|
|
int MSWToNativeIdx(int idx);
|
|
int MSWFromNativeIdx(int item);
|
|
|
|
// this is the same as above but for order, not index
|
|
int MSWToNativeOrder(int order);
|
|
int MSWFromNativeOrder(int order);
|
|
|
|
// get the event type corresponding to a click or double click event
|
|
// (depending on dblclk value) with the specified (using MSW convention)
|
|
// mouse button
|
|
wxEventType GetClickEventType(bool dblclk, int button);
|
|
|
|
// allocate m_customDraw if we need it or free it if it no longer is,
|
|
// return the pointer which can be used to update it if it's non-null
|
|
wxMSWHeaderCtrlCustomDraw* GetCustomDraw();
|
|
|
|
|
|
// the number of columns in the control, including the hidden ones (not
|
|
// taken into account by the native control, see comment in DoGetCount())
|
|
unsigned int m_numColumns;
|
|
|
|
// this is a lookup table allowing us to check whether the column with the
|
|
// given index is currently shown in the native control, in which case the
|
|
// value of this array element with this index is 0, or hidden
|
|
//
|
|
// notice that this may be different from GetColumn(idx).IsHidden() and in
|
|
// fact we need this array precisely because it will be different from it
|
|
// in DoUpdate() when the column hidden flag gets toggled and we need it to
|
|
// handle this transition correctly
|
|
wxArrayInt m_isHidden;
|
|
|
|
// the order of our columns: this array contains the index of the column
|
|
// shown at the position n as the n-th element
|
|
//
|
|
// this is necessary only to handle the hidden columns: the native control
|
|
// doesn't know about them and so we can't use Header_GetOrderArray()
|
|
wxArrayInt m_colIndices;
|
|
|
|
// the image list: initially NULL, created on demand
|
|
wxImageList *m_imageList;
|
|
|
|
// the offset of the window used to emulate scrolling it
|
|
int m_scrollOffset;
|
|
|
|
// actual column we are dragging or -1 if not dragging anything
|
|
int m_colBeingDragged;
|
|
|
|
// the custom draw helper: initially NULL, created on demand, use
|
|
// GetCustomDraw() to do it
|
|
wxMSWHeaderCtrlCustomDraw *m_customDraw;
|
|
|
|
wxDECLARE_NO_COPY_CLASS(wxHeaderCtrl);
|
|
};
|
|
|
|
#endif // _WX_MSW_HEADERCTRL_H_
|
|
|