fix several bugs in index/position translation code between wx and MSW

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57343 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2008-12-14 22:54:34 +00:00
parent 3b367af8cd
commit 2e733ec74c
2 changed files with 50 additions and 20 deletions

View File

@ -90,6 +90,7 @@ private:
int MSWFromNativeIdx(int item); int MSWFromNativeIdx(int item);
// this is the same as above but for order, not index // this is the same as above but for order, not index
int MSWToNativeOrder(int order);
int MSWFromNativeOrder(int order); int MSWFromNativeOrder(int order);
// get the event type corresponding to a click or double click event // get the event type corresponding to a click or double click event

View File

@ -319,7 +319,7 @@ void wxHeaderCtrl::DoInsertItem(const wxHeaderColumn& col, unsigned int idx)
} }
hdi.mask |= HDI_ORDER; hdi.mask |= HDI_ORDER;
hdi.iOrder = m_colIndices.Index(idx); hdi.iOrder = MSWToNativeOrder(m_colIndices.Index(idx));
if ( ::SendMessage(GetHwnd(), HDM_INSERTITEM, if ( ::SendMessage(GetHwnd(), HDM_INSERTITEM,
MSWToNativeIdx(idx), (LPARAM)&hdi) == -1 ) MSWToNativeIdx(idx), (LPARAM)&hdi) == -1 )
@ -356,6 +356,10 @@ wxArrayInt wxHeaderCtrl::DoGetColumnsOrder() const
return m_colIndices; return m_colIndices;
} }
// ----------------------------------------------------------------------------
// wxHeaderCtrl indexes and positions translation
// ----------------------------------------------------------------------------
int wxHeaderCtrl::MSWToNativeIdx(int idx) int wxHeaderCtrl::MSWToNativeIdx(int idx)
{ {
// don't check for GetColumn(idx).IsShown() as it could have just became // don't check for GetColumn(idx).IsShown() as it could have just became
@ -364,13 +368,16 @@ int wxHeaderCtrl::MSWToNativeIdx(int idx)
"column must be visible to have an " "column must be visible to have an "
"index in the native control" ); "index in the native control" );
int item = idx;
for ( int i = 0; i < idx; i++ ) for ( int i = 0; i < idx; i++ )
{ {
if ( GetColumn(i).IsHidden() ) 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) int wxHeaderCtrl::MSWFromNativeIdx(int item)
@ -379,35 +386,57 @@ int wxHeaderCtrl::MSWFromNativeIdx(int item)
"column index out of range" ); "column index out of range" );
// reverse the above function // 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() ) if ( n > idx )
item++; break;
if ( GetColumn(n).IsHidden() )
idx++;
} }
return item; wxASSERT_MSG( MSWToNativeIdx(idx) == item, "logic error" );
return idx;
}
int wxHeaderCtrl::MSWToNativeOrder(int pos)
{
wxASSERT_MSG( pos >= 0 && static_cast<unsigned>(pos) < m_numColumns,
"column position out of range" );
int order = pos;
for ( int n = 0; n < pos; n++ )
{
if ( GetColumn(m_colIndices[n]).IsHidden() )
order--;
}
wxASSERT_MSG( order >= 0 && order <= GetShownColumnsCount(), "logic error" );
return order;
} }
int wxHeaderCtrl::MSWFromNativeOrder(int order) int wxHeaderCtrl::MSWFromNativeOrder(int order)
{ {
wxASSERT_MSG( order >= 0 && order < GetShownColumnsCount(), wxASSERT_MSG( order >= 0 && order < GetShownColumnsCount(),
"column position out of range" ); "native column position out of range" );
// notice that the loop condition is inclusive because if the column unsigned pos = order;
// exactly at position order is hidden we should go to the next one for ( unsigned n = 0; n < m_numColumns; n++ )
for ( int pos = 0; pos <= order; pos++ )
{ {
if ( GetColumn(m_colIndices[pos]).IsHidden() ) if ( n > pos )
{ break;
// order can't become greater than m_numColumns here because it is
// less than the number of shown columns initially and it is going if ( GetColumn(m_colIndices[n]).IsHidden() )
// to be incremented at most once for every hidden column and pos++;
// m_numColumns is the total columns number
order++;
}
} }
return order; wxASSERT_MSG( MSWToNativeOrder(pos) == order, "logic error" );
return pos;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------