#pragma hdrstop
#endif
+#if wxUSE_HEADERCTRL
+
#ifndef WX_PRECOMP
+ #include "wx/app.h"
#include "wx/log.h"
#endif // WX_PRECOMP
#include "wx/msw/wrapcctl.h"
#include "wx/msw/private.h"
+#ifndef HDM_SETBITMAPMARGIN
+ #define HDM_SETBITMAPMARGIN 0x1234
+#endif
+
+#ifndef Header_SetBitmapMargin
+ #define Header_SetBitmapMargin(hwnd, margin) \
+ ::SendMessage((hwnd), HDM_SETBITMAPMARGIN, (WPARAM)(margin), 0)
+#endif
+
// from src/msw/listctrl.cpp
extern int WXDLLIMPEXP_CORE wxMSWGetColumnClicked(NMHDR *nmhdr, POINT *ptClick);
if ( !MSWCreateControl(WC_HEADER, _T(""), pos, size) )
return false;
+ // special hack for margins when using comctl32.dll v6 or later: the
+ // default margin is too big and results in label truncation when the
+ // column width is just about right to show it together with the sort
+ // indicator, so reduce it to a smaller value (in principle we could even
+ // use 0 here but this starts to look ugly)
+ if ( wxApp::GetComCtl32Version() >= 600 )
+ {
+ Header_SetBitmapMargin(GetHwnd(), ::GetSystemMetrics(SM_CXEDGE));
+ }
+
return true;
}
{
WXDWORD msStyle = wxControl::MSWGetStyle(style, exstyle);
- if ( style & wxHD_DRAGDROP )
+ if ( style & wxHD_ALLOW_REORDER )
msStyle |= HDS_DRAGDROP;
// the control looks nicer with these styles and there doesn't seem to be
if ( col.GetAlignment() != wxALIGN_NOT )
{
- hdi.mask |= HDI_FORMAT;
+ hdi.mask |= HDI_FORMAT | HDF_LEFT;
switch ( col.GetAlignment() )
{
case wxALIGN_LEFT:
}
hdi.mask |= HDI_ORDER;
- hdi.iOrder = m_colIndices.Index(idx);
+ hdi.iOrder = MSWToNativeOrder(m_colIndices.Index(idx));
if ( ::SendMessage(GetHwnd(), HDM_INSERTITEM,
MSWToNativeIdx(idx), (LPARAM)&hdi) == -1 )
return m_colIndices;
}
+// ----------------------------------------------------------------------------
+// wxHeaderCtrl indexes and positions translation
+// ----------------------------------------------------------------------------
+
int wxHeaderCtrl::MSWToNativeIdx(int idx)
{
// don't check for GetColumn(idx).IsShown() as it could have just became
"column must be visible to have an "
"index in the native control" );
+ int item = idx;
for ( int i = 0; i < idx; i++ )
{
if ( GetColumn(i).IsHidden() )
- idx--; // one less column the native control knows about
+ item--; // one less column the native control knows about
}
- return idx;
+ wxASSERT_MSG( item >= 0 && item <= GetShownColumnsCount(), "logic error" );
+
+ return item;
}
int wxHeaderCtrl::MSWFromNativeIdx(int item)
"column index out of range" );
// reverse the above function
- for ( int i = 0; i <= item; i++ )
+
+ unsigned idx = item;
+ for ( unsigned n = 0; n < m_numColumns; n++ )
{
- if ( GetColumn(i).IsHidden() )
- item++;
+ if ( n > idx )
+ break;
+
+ if ( GetColumn(n).IsHidden() )
+ idx++;
}
- return item;
+ wxASSERT_MSG( MSWToNativeIdx(idx) == item, "logic error" );
+
+ return idx;
}
-int wxHeaderCtrl::MSWFromNativeOrder(int order)
+int wxHeaderCtrl::MSWToNativeOrder(int pos)
{
- wxASSERT_MSG( order >= 0 && order < GetShownColumnsCount(),
+ wxASSERT_MSG( pos >= 0 && static_cast<unsigned>(pos) < m_numColumns,
"column position out of range" );
- // notice that the loop condition is inclusive because if the column
- // exactly at position order is hidden we should go to the next one
- for ( int pos = 0; pos <= order; pos++ )
+ int order = pos;
+ for ( int n = 0; n < pos; n++ )
{
- if ( GetColumn(m_colIndices[pos]).IsHidden() )
- {
- // order can't become greater than m_numColumns here because it is
- // less than the number of shown columns initially and it is going
- // to be incremented at most once for every hidden column and
- // m_numColumns is the total columns number
- order++;
- }
+ if ( GetColumn(m_colIndices[n]).IsHidden() )
+ order--;
}
+ wxASSERT_MSG( order >= 0 && order <= GetShownColumnsCount(), "logic error" );
+
return order;
}
+int wxHeaderCtrl::MSWFromNativeOrder(int order)
+{
+ wxASSERT_MSG( order >= 0 && order < GetShownColumnsCount(),
+ "native column position out of range" );
+
+ unsigned pos = order;
+ for ( unsigned n = 0; n < m_numColumns; n++ )
+ {
+ if ( n > pos )
+ break;
+
+ if ( GetColumn(m_colIndices[n]).IsHidden() )
+ pos++;
+ }
+
+ wxASSERT_MSG( MSWToNativeOrder(pos) == order, "logic error" );
+
+ return pos;
+}
+
// ----------------------------------------------------------------------------
// wxHeaderCtrl events
// ----------------------------------------------------------------------------
}
#endif // wxHAS_GENERIC_HEADERCTRL
+
+#endif // wxUSE_HEADERCTRL