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:
@@ -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();
|
||||
}
|
||||
|
Reference in New Issue
Block a user