]> git.saurik.com Git - wxWidgets.git/commitdiff
Applied patch [ 1436761 ] wxGrid: Can't enable cell edit ctrl on very wide columns
authorJulian Smart <julian@anthemion.co.uk>
Sat, 11 Mar 2006 14:17:50 +0000 (14:17 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Sat, 11 Mar 2006 14:17:50 +0000 (14:17 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37995 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/generic/grid.cpp

index f6f5494bb00cb4937c3e661e50fb31af170edde1..f5fcc666844fc57657e23aab14fb729bc8d6d77b 100644 (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();
         }