]>
git.saurik.com Git - wxWidgets.git/blob - src/msw/headerctrl.cpp
6330b225e1e9f3e0efc8434df9ca9e74ce3aaa6e
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/headerctrl.cpp
3 // Purpose: implementation of wxHeaderCtrl for wxMSW
4 // Author: Vadim Zeitlin
7 // Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
8 // Licence: wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
11 // ============================================================================
13 // ============================================================================
15 // ----------------------------------------------------------------------------
17 // ----------------------------------------------------------------------------
19 // for compilers that support precompilation, includes "wx.h".
20 #include "wx/wxprec.h"
30 #include "wx/headerctrl.h"
31 #include "wx/imaglist.h"
33 #include "wx/msw/wrapcctl.h"
34 #include "wx/msw/private.h"
36 // ============================================================================
37 // wxHeaderCtrl implementation
38 // ============================================================================
40 // ----------------------------------------------------------------------------
41 // wxHeaderCtrl construction/destruction
42 // ----------------------------------------------------------------------------
44 void wxHeaderCtrl::Init()
49 bool wxHeaderCtrl::Create(wxWindow
*parent
,
56 // notice that we don't need InitCommonControlsEx(ICC_LISTVIEW_CLASSES)
57 // here as we already call InitCommonControls() in wxApp initialization
58 // code which covers this
60 if ( !CreateControl(parent
, id
, pos
, size
, style
, wxDefaultValidator
, name
) )
63 if ( !MSWCreateControl(WC_HEADER
, _T(""), pos
, size
) )
69 WXDWORD
wxHeaderCtrl::MSWGetStyle(long style
, WXDWORD
*exstyle
) const
71 WXDWORD msStyle
= wxControl::MSWGetStyle(style
, exstyle
);
73 if ( style
& wxHD_DRAGDROP
)
74 msStyle
|= HDS_DRAGDROP
;
76 // the control looks nicer with these styles and there doesn't seem to be
77 // any reason to not use them so we always do (as for HDS_HORZ it is 0
78 // anyhow but include it for clarity)
79 msStyle
|= HDS_HORZ
| HDS_BUTTONS
| HDS_FLAT
| HDS_FULLDRAG
| HDS_HOTTRACK
;
84 wxHeaderCtrl::~wxHeaderCtrl()
89 // ----------------------------------------------------------------------------
90 // wxHeaderCtrl scrolling
91 // ----------------------------------------------------------------------------
93 // as the native control doesn't support offsetting its contents, we use a hack
94 // here to make it appear correctly when the parent is scrolled: instead of
95 // scrolling or repainting we simply move the control window itself
96 void wxHeaderCtrl::ScrollWindow(int dx
,
97 int WXUNUSED_UNLESS_DEBUG(dy
),
98 const wxRect
* WXUNUSED_UNLESS_DEBUG(rect
))
100 // this doesn't make sense at all
101 wxASSERT_MSG( !dy
, "header window can't be scrolled vertically" );
103 // this would actually be nice to support for "frozen" headers
104 wxASSERT_MSG( !rect
, "header window can't be scrolled partially" );
106 // offset the window by the scroll increment to the left and increment its
107 // width to still extend to the right boundary to compensate for it (notice
108 // that dx is negative when scrolling to the right)
109 SetSize(GetPosition().x
+ dx
, -1, GetSize().x
- dx
, -1, wxSIZE_USE_EXISTING
);
112 // ----------------------------------------------------------------------------
113 // wxHeaderCtrl geometry calculation
114 // ----------------------------------------------------------------------------
116 wxSize
wxHeaderCtrl::DoGetBestSize() const
118 RECT rc
= wxGetClientRect(GetHwndOf(GetParent()));
120 HDLAYOUT layout
= { &rc
, &wpos
};
121 if ( !Header_Layout(GetHwnd(), &layout
) )
123 wxLogLastError(_T("Header_Layout"));
124 return wxControl::DoGetBestSize();
127 return wxSize(wpos
.cx
, wpos
.cy
);
130 // ----------------------------------------------------------------------------
131 // wxHeaderCtrl columns managements
132 // ----------------------------------------------------------------------------
134 unsigned int wxHeaderCtrl::DoGetCount() const
136 return Header_GetItemCount(GetHwnd());
139 void wxHeaderCtrl::DoInsert(const wxHeaderColumn
& col
, unsigned int idx
)
141 // copy the HDITEM because we may modify it below
142 HDITEM hdi
= col
.GetHDI();
144 const wxBitmap bmp
= col
.GetBitmap();
147 const int bmpWidth
= bmp
.GetWidth(),
148 bmpHeight
= bmp
.GetHeight();
152 m_imageList
= new wxImageList(bmpWidth
, bmpHeight
);
153 Header_SetImageList(GetHwnd(), GetHimagelistOf(m_imageList
));
155 else // already have an image list
157 // check that all bitmaps we use have the same size
160 m_imageList
->GetSize(0, imageWidth
, imageHeight
);
162 wxASSERT_MSG( imageWidth
== bmpWidth
&& imageHeight
== bmpHeight
,
163 "all column bitmaps must have the same size" );
166 m_imageList
->Add(bmp
);
167 hdi
.mask
|= HDI_IMAGE
;
168 hdi
.iImage
= m_imageList
->GetImageCount() - 1;
171 if ( col
.IsHidden() )
173 hdi
.mask
|= HDI_WIDTH
;
177 if ( Header_InsertItem(GetHwnd(), idx
, &hdi
) == -1 )
179 wxLogLastError(_T("Header_InsertItem"));
183 void wxHeaderCtrl::DoDelete(unsigned int idx
)
185 if ( !Header_DeleteItem(GetHwnd(), idx
) )
187 wxLogLastError(_T("Header_DeleteItem"));
191 // ----------------------------------------------------------------------------
192 // wxHeaderCtrl columns attributes
193 // ----------------------------------------------------------------------------
195 void wxHeaderCtrl::DoShowColumn(unsigned int idx
, bool show
)
198 hdi
.mask
= HDI_WIDTH
;
200 if ( !Header_GetItem(GetHwnd(), idx
, &hdi
) )
202 wxLogLastError(_T("Header_GetItem(HDI_WIDTH)"));
207 hdi
.cxy
= 80; // FIXME: we don't have the column width here any more
211 if ( !Header_SetItem(GetHwnd(), idx
, &hdi
) )
213 wxLogLastError(_T("Header_SetItem(HDI_WIDTH)"));
218 void wxHeaderCtrl::DoShowSortIndicator(unsigned int idx
, int sortOrder
)
221 hdi
.mask
= HDI_FORMAT
;
223 if ( !Header_GetItem(GetHwnd(), idx
, &hdi
) )
225 wxLogLastError(_T("Header_GetItem(HDI_FORMAT)"));
229 if ( sortOrder
== -1 )
230 hdi
.fmt
&= ~(HDF_SORTDOWN
| HDF_SORTUP
);
232 hdi
.fmt
|= sortOrder
? HDF_SORTUP
: HDF_SORTDOWN
;
234 if ( !Header_SetItem(GetHwnd(), idx
, &hdi
) )
236 wxLogLastError(_T("Header_SetItem(HDI_FORMAT)"));