//////////////////////////////////////////////////////////////////////
+// Internal Helper function for computing row or column from some
+// (unscrolled) coordinate value, using either
+// m_defaultRowHeight/m_defaultColWidth or binary search on array
+// of m_rowBottoms/m_ColRights to speed up the search!
+
+// Internal helper macros for simpler use of that function
+
+static int CoordToRowOrCol(int coord, int defaultDist, int minDist,
+ wxArrayInt BorderArray, bool maxOnOverflow);
+
+#define internalXToCol(x) CoordToRowOrCol(x, m_defaultColWidth, \
+ WXGRID_MIN_COL_WIDTH, \
+ m_colRights, TRUE)
+#define internalYToRow(y) CoordToRowOrCol(y, m_defaultRowHeight, \
+ WXGRID_MIN_ROW_HEIGHT, \
+ m_rowBottoms, TRUE)
+/////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC_CLASS( wxGrid, wxScrolledWindow )
// find the row labels within these bounds
//
int row;
- for ( row = YToRow(top); row < m_numRows; row++ )
+ for ( row = internalYToRow(top); row < m_numRows; row++ )
{
if ( GetRowBottom(row) < top )
continue;
// find the cells within these bounds
//
int col;
- for ( col = XToCol(left); col < m_numCols; col++ )
+ for ( col = internalXToCol(left); col < m_numCols; col++ )
{
if ( GetColRight(col) < left )
continue;
// find the cells within these bounds
//
int row, col;
- for ( row = YToRow(top); row < m_numRows; row++ )
+ for ( row = internalYToRow(top); row < m_numRows; row++ )
{
if ( GetRowBottom(row) <= top )
continue;
if ( GetRowTop(row) > bottom )
break;
- for ( col = XToCol(left); col < m_numCols; col++ )
+ for ( col = internalXToCol(left); col < m_numCols; col++ )
{
if ( GetColRight(col) <= left )
continue;
// horizontal grid lines
//
int i;
- for ( i = YToRow(top); i < m_numRows; i++ )
+ for ( i = internalYToRow(top); i < m_numRows; i++ )
{
int bot = GetRowBottom(i) - 1;
// vertical grid lines
//
- for ( i = XToCol(left); i < m_numCols; i++ )
+ for ( i = internalXToCol(left); i < m_numCols; i++ )
{
int colRight = GetColRight(i) - 1;
if ( colRight > right )
// of m_rowBottoms/m_ColRights to speed up the search!
static int CoordToRowOrCol(int coord, int defaultDist, int minDist,
- wxArrayInt BorderArray)
+ wxArrayInt BorderArray, bool maxOnOverflow)
{
if (!defaultDist)
defaultDist = 1;
- unsigned int i_max = coord / defaultDist,
- i_min = 0;
+ int i_max = coord / defaultDist,
+ i_min = 0;
if (BorderArray.IsEmpty())
{
return i_max;
if ( i_max >= BorderArray.GetCount())
i_max = BorderArray.GetCount() - 1;
}
- if ( coord > BorderArray[i_max])
- return -1;
+ if ( coord >= BorderArray[i_max])
+ return (maxOnOverflow ? i_max : -1);
if ( coord < BorderArray[0] )
return 0;
while ( i_max - i_min > 0 )
{
wxCHECK_MSG(BorderArray[i_min] <= coord && coord < BorderArray[i_max],
- -1, _T("wxGrid: internal error in CoordToRowOrCol"));
+ 0, _T("wxGrid: internal error in CoordToRowOrCol"));
if (coord >= BorderArray[ i_max - 1])
return i_max;
else
int wxGrid::YToRow( int y )
{
return CoordToRowOrCol(y, m_defaultRowHeight,
- WXGRID_MIN_ROW_HEIGHT, m_rowBottoms);
+ WXGRID_MIN_ROW_HEIGHT, m_rowBottoms, FALSE);
}
int wxGrid::XToCol( int x )
{
return CoordToRowOrCol(x, m_defaultColWidth,
- WXGRID_MIN_COL_WIDTH, m_colRights);
+ WXGRID_MIN_COL_WIDTH, m_colRights, FALSE);
}
//
int wxGrid::YToEdgeOfRow( int y )
{
- int i, d;
- i = YToRow(y);
- if ( i > 0 )
- i--;
- for ( ; i < m_numRows; i++ )
+ int i;
+ i = internalYToRow(y);
+
+ if ( GetRowHeight(i) > WXGRID_LABEL_EDGE_ZONE )
{
- if ( GetRowHeight(i) > WXGRID_LABEL_EDGE_ZONE )
- {
- d = abs( y - GetRowBottom(i) );
- if ( d < WXGRID_LABEL_EDGE_ZONE )
- return i;
- }
+ // We know that we are in row i, test whether we are
+ // close enough to lower or upper border, respectively.
+ if ( abs(GetRowBottom(i) - y) < WXGRID_LABEL_EDGE_ZONE )
+ return i;
+ else if( i > 0 && y - GetRowTop(i) < WXGRID_LABEL_EDGE_ZONE )
+ return i - 1;
}
return -1;
//
int wxGrid::XToEdgeOfCol( int x )
{
- int i, d;
- i = XToCol(x);
- if ( i > 0 )
- i--;
- for ( ; i < m_numCols; i++ )
+ int i;
+ i = internalXToCol(x);
+
+ if ( GetColWidth(i) > WXGRID_LABEL_EDGE_ZONE )
{
- if ( GetColWidth(i) > WXGRID_LABEL_EDGE_ZONE )
- {
- d = abs( x - GetColRight(i) );
- if ( d < WXGRID_LABEL_EDGE_ZONE )
- return i;
- }
+ // We know that we are in column i, test whether we are
+ // close enough to right or left border, respectively.
+ if ( abs(GetColRight(i) - x) < WXGRID_LABEL_EDGE_ZONE )
+ return i;
+ else if( i > 0 && x - GetColLeft(i) < WXGRID_LABEL_EDGE_ZONE )
+ return i - 1;
}
return -1;