Applied patch [ 1436761 ] wxGrid: Can't enable cell edit ctrl on very wide columns

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37995 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2006-03-11 14:17:50 +00:00
parent 4c43dd9078
commit 7db713aea6

View File

@@ -1587,6 +1587,14 @@ void wxGridCellEditorEvtHandler::OnKeyDown(wxKeyEvent& event)
void wxGridCellEditorEvtHandler::OnChar(wxKeyEvent& event)
{
int row = m_grid->GetGridCursorRow();
int col = m_grid->GetGridCursorCol();
wxRect rect = m_grid->CellToRect( row, col );
int cw, ch;
m_grid->GetGridWindow()->GetClientSize( &cw, &ch );
// if cell width is smaller than grid client area, cell is wholly visible
bool wholeCellVisible = (rect.GetWidth() < cw);
switch ( event.GetKeyCode() )
{
case WXK_ESCAPE:
@@ -1595,6 +1603,85 @@ void wxGridCellEditorEvtHandler::OnChar(wxKeyEvent& event)
case WXK_NUMPAD_ENTER:
break;
case WXK_HOME:
{
if( wholeCellVisible )
{
// no special processing needed...
event.Skip();
break;
}
// do special processing for partly visible cell...
// get the widths of all cells previous to this one
int colXPos = 0;
for ( int i = 0; i < col; i++ )
{
colXPos += m_grid->GetColSize(i);
}
int xUnit = 1, yUnit = 1;
m_grid->GetScrollPixelsPerUnit(&xUnit, &yUnit);
if (col != 0)
{
m_grid->Scroll(colXPos/xUnit-1, m_grid->GetScrollPos(wxVERTICAL));
}
else
{
m_grid->Scroll(colXPos/xUnit, m_grid->GetScrollPos(wxVERTICAL));
}
event.Skip();
break;
}
case WXK_END:
{
if( wholeCellVisible )
{
// no special processing needed...
event.Skip();
break;
}
// do special processing for partly visible cell...
int textWidth = 0;
wxString value = m_grid->GetCellValue(row, col);
if ( wxEmptyString != value )
{
// get width of cell CONTENTS (text)
int y;
wxFont font = m_grid->GetCellFont(row, col);
m_grid->GetTextExtent(value, &textWidth, &y, NULL, NULL, &font);
// try to RIGHT align the text by scrolling
int client_right = m_grid->GetGridWindow()->GetClientSize().GetWidth();
// (m_grid->GetScrollLineX()*2) is a factor for not scrolling to far,
// otherwise the last part of the cell content might be hidden below the scroll bar
// FIXME: maybe there is a more suitable correction?
textWidth -= (client_right - (m_grid->GetScrollLineX()*2));
if ( textWidth < 0 )
{
textWidth = 0;
}
}
// get the widths of all cells previous to this one
int colXPos = 0;
for ( int i = 0; i < col; i++ )
{
colXPos += m_grid->GetColSize(i);
}
// and add the (modified) text width of the cell contents
// as we'd like to see the last part of the cell contents
colXPos += textWidth;
int xUnit = 1, yUnit = 1;
m_grid->GetScrollPixelsPerUnit(&xUnit, &yUnit);
m_grid->Scroll(colXPos/xUnit-1, m_grid->GetScrollPos(wxVERTICAL));
event.Skip();
break;
}
default:
event.Skip();
}
@@ -7772,7 +7859,7 @@ void wxGrid::ShowCellEditControl()
{
if ( IsCellEditControlEnabled() )
{
if ( !IsVisible( m_currentCellCoords ) )
if ( !IsVisible( m_currentCellCoords, false ) )
{
m_cellEditCtrlEnabled = false;
return;
@@ -7798,6 +7885,10 @@ void wxGrid::ShowCellEditControl()
//
CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
int nXMove = 0;
if(rect.x < 0)
nXMove = rect.x;
// done in PaintBackground()
#if 0
// erase the highlight and the cell contents because the editor
@@ -7872,8 +7963,21 @@ void wxGrid::ShowCellEditControl()
editor->SetCellAttr(attr);
editor->SetSize( rect );
editor->GetControl()->Move(editor->GetControl()->GetPosition().x + nXMove, editor->GetControl()->GetPosition().y);
editor->Show( true, attr );
int colXPos = 0;
for (int i = 0; i < m_currentCellCoords.GetCol(); i++)
{
colXPos += GetColSize(i);
}
int xUnit=1, yUnit=1;
GetScrollPixelsPerUnit(&xUnit, &yUnit);
if (m_currentCellCoords.GetCol() != 0)
Scroll(colXPos/xUnit-1, GetScrollPos(wxVERTICAL));
else
Scroll(colXPos/xUnit, GetScrollPos(wxVERTICAL));
// recalc dimensions in case we need to
// expand the scrolled window to account for editor
CalcDimensions();
@@ -8203,7 +8307,11 @@ void wxGrid::MakeCellVisible( int row, int col )
ypos += m_scrollLineY;
}
if ( left < 0 )
// special handling for wide cells - show always left part of the cell!
// Otherwise, e.g. when stepping from row to row, it would jump between
// left and right part of the cell on every step!
// if ( left < 0 )
if ( left < 0 || (right-left) >= cw )
{
xpos = r.GetLeft();
}