From 7db713aea6713ef70756179ee88e7ab4bccb2e0d Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Sat, 11 Mar 2006 14:17:50 +0000 Subject: [PATCH] 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 --- src/generic/grid.cpp | 112 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/src/generic/grid.cpp b/src/generic/grid.cpp index f6f5494bb0..f5fcc66684 100644 --- a/src/generic/grid.cpp +++ b/src/generic/grid.cpp @@ -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(); } -- 2.47.2