]> git.saurik.com Git - wxWidgets.git/commitdiff
Changes necessary to make In Place Edit work and look a lot nicer for
authorRobin Dunn <robin@alldunn.com>
Wed, 28 Jul 1999 21:59:08 +0000 (21:59 +0000)
committerRobin Dunn <robin@alldunn.com>
Wed, 28 Jul 1999 21:59:08 +0000 (21:59 +0000)
MSW and GTK, and hopefully make it easy to make the same tweaks for
other ports.  There are still some very minor anomalies (changing
colors of the grid doesn't change the IPE control, etc.) but it is
definitely useable now.

The IPE control now gets the fore/background color of the cell.

Changed how the current cell highlight is drawn so mulitple clicks in
a single cell don't leave the highlight in an inconsistent state for
GTK.

Changed a dangerous static variable to a member variable.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3182 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/generic/gridg.h
src/generic/gridg.cpp

index f753026d0069c69a87a5480db857ce00fd206cad..90bea68db4f272db28570d3044a345f7a96862f1 100644 (file)
@@ -186,7 +186,7 @@ public:
     void UpdateDimensions();
 
     void SetCurrentRect (int Row, int Column, int canvasW = -1, int canvasH = -1);
-    void HighlightCell (wxDC *dc);
+    void HighlightCell(wxDC *dc, bool doHighlight);
     void DrawCellText();
     void SetGridClippingRegion(wxDC *dc);
 
@@ -247,6 +247,7 @@ protected:
     bool                      m_editable;
     bool                      m_editInPlace;
     bool                      m_inOnTextInPlace;
+    bool                      m_inScroll;
 
     int                       m_totalRows;
     int                       m_totalCols;
@@ -283,6 +284,7 @@ protected:
     wxBrush                   m_labelBackgroundBrush;
     wxFont                    m_labelTextFont;
     wxPen                     m_divisionPen;
+    wxPen                     m_highlightPen;
     wxBitmap*                 m_doubleBufferingBitmap;
 
     // Position of Edit control
index e1a020e44d95ab36235c0a6b773afede45aca943..9ef503b3bb9826d278853c3b9f31338e4e9d0560 100644 (file)
 
 #include "wx/generic/gridg.h"
 
-// Set to zero to use no double-buffering
+
+// Values used to adjust the size of the in-place-edit control, and other
+// goodies.  Per-platform tweaks should be done here.
 #ifdef __WXMSW__
-    #define wxUSE_DOUBLE_BUFFERING 1
-#else
-    #define wxUSE_DOUBLE_BUFFERING 0
+#define wxIPE_ADJUST            -2
+#define wxIPE_STYLE             wxNO_BORDER
+#define wxIPE_HIGHLIGHT         1
+#define wxUSE_DOUBLE_BUFFERING  1
+#endif
+
+#ifdef __WXGTK__
+#define wxIPE_ADJUST            -1
+#define wxIPE_STYLE             wxNO_BORDER
+#define wxIPE_HIGHLIGHT         0
+#define wxUSE_DOUBLE_BUFFERING  1
 #endif
 
+#ifdef __WXMOTIF__
+#define wxIPE_ADJUST            2
+#define wxIPE_STYLE             wxNO_BORDER
+#define wxIPE_HIGHLIGHT         0
+#define wxUSE_DOUBLE_BUFFERING  0
+#endif
+
+#ifndef wxIPE_ADJUST
+#define wxIPE_ADJUST            2
+#define wxIPE_STYLE             wxNO_BORDER
+#define wxIPE_HIGHLIGHT         0
+#define wxUSE_DOUBLE_BUFFERING  0
+#endif
+
+
+
 #define wxGRID_DRAG_NONE       0
 #define wxGRID_DRAG_LEFT_RIGHT 1
 #define wxGRID_DRAG_UP_DOWN    2
@@ -100,6 +126,7 @@ wxGenericGrid::wxGenericGrid()
 
   m_editInPlace = FALSE;
   m_inOnTextInPlace = FALSE;
+  m_inScroll = FALSE;
 
 #if defined(__WIN95__)
   m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
@@ -113,6 +140,7 @@ wxGenericGrid::wxGenericGrid()
   m_dragStartPosition = 0;
   m_dragLastPosition = 0;
   m_divisionPen = wxNullPen;
+  m_highlightPen = wxNullPen;
   m_leftOfSheet = wxGRID_DEFAULT_SHEET_LEFT;
   m_topOfSheet = wxGRID_DEFAULT_SHEET_TOP;
   m_cellHeight = wxGRID_DEFAULT_CELL_HEIGHT;
@@ -167,6 +195,7 @@ bool wxGenericGrid::Create(wxWindow *parent,
   m_editable = TRUE;
   m_editInPlace = FALSE;
   m_inOnTextInPlace = FALSE;
+  m_inScroll = FALSE;
 #if defined(__WIN95__)
   m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
 #elif defined(__WXGTK__)
@@ -179,6 +208,7 @@ bool wxGenericGrid::Create(wxWindow *parent,
   m_dragStartPosition = 0;
   m_dragLastPosition = 0;
   m_divisionPen = * wxThePenList->FindOrCreatePen("LIGHT GREY", 1, wxSOLID);
+  m_highlightPen = * wxBLACK_PEN;
   m_doubleBufferingBitmap = (wxBitmap *) NULL;
 
   if (!m_horizontalSashCursor.Ok())
@@ -249,8 +279,8 @@ bool wxGenericGrid::Create(wxWindow *parent,
 //  SetSize(pos.x, pos.y, size.x, size.y);
 
   m_inPlaceTextItem = new wxTextCtrl( (wxPanel*)this, wxGRID_EDIT_IN_PLACE_TEXT_CTRL, "",
-                                      wxPoint( m_currentRect.x-2, m_currentRect.y-2 ),
-                                      wxSize( m_currentRect.width+4, m_currentRect.height+4 ),
+                                      wxPoint( m_currentRect.x-wxIPE_ADJUST, m_currentRect.y-wxIPE_ADJUST ),
+                                      wxSize( m_currentRect.width+wxIPE_ADJUST*2, m_currentRect.height+wxIPE_ADJUST*2 ),
                                       wxNO_BORDER | wxTE_PROCESS_ENTER );
   m_inPlaceTextItem->Show(m_editInPlace);
   if ( m_editInPlace )
@@ -546,8 +576,8 @@ void wxGenericGrid::PaintGrid(wxDC& dc)
 
     /* Hilight present cell */
     SetCurrentRect(m_wCursorRow, m_wCursorColumn);
-    if (m_currentRectVisible && !(m_editable && m_editInPlace))
-      HighlightCell(& dc);
+    if (m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace)))
+      HighlightCell(& dc, TRUE);
 
     dc.DestroyClippingRegion();
     dc.SetOptimization(TRUE);
@@ -1426,9 +1456,9 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
   SetGridClippingRegion(dc);
 
   // Remove the highlight from the old cell
-  if ( m_currentRectVisible && !(m_editable && m_editInPlace) )
+  if ( m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace)))
     {
-      HighlightCell(dc);
+      HighlightCell(dc, FALSE);
     }
 
 
@@ -1452,42 +1482,44 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
       if ( m_currentRect.x <= 0 )
         {
           x = 0;
-          width = m_currentRect.width + 2;
+          width = m_currentRect.width + wxIPE_ADJUST;
         }
       else
         {
-          x = m_currentRect.x - 2;
-          width = m_currentRect.width + 4;
+          x = m_currentRect.x - wxIPE_ADJUST;
+          width = m_currentRect.width + wxIPE_ADJUST*2;
         }
 
       if ( m_currentRect.y <= 0 )
         {
           y = 0;
-          height = m_currentRect.height + 2;
+          height = m_currentRect.height + wxIPE_ADJUST;
         }
       else
         {
-          y = m_currentRect.y - 2;
-          height = m_currentRect.height + 4;
+          y = m_currentRect.y - wxIPE_ADJUST;
+          height = m_currentRect.height + wxIPE_ADJUST*2;
         }
 
       m_inPlaceTextItem->SetSize( x, y, width, height );
 
-      if ( cell )
-        {
-          if ( cell->GetTextValue().IsNull() )
-            {
+      if ( cell ) {
+          m_inPlaceTextItem->SetFont( cell->GetFont() );
+          m_inPlaceTextItem->SetBackgroundColour(cell->GetBackgroundColour());
+          m_inPlaceTextItem->SetForegroundColour(cell->GetTextColour());
+
+          if ( cell->GetTextValue().IsNull() ) {
               m_inPlaceTextItem->SetValue( "" );
-            }
-          else
-            {
-              m_inPlaceTextItem->SetFont( cell->GetFont() );
+          }
+          else {
               m_inPlaceTextItem->SetValue( cell->GetTextValue() );
-            }
-        }
+          }
+      }
 
       m_inPlaceTextItem->Show(TRUE);
       m_inPlaceTextItem->SetFocus();
+      if (wxIPE_HIGHLIGHT)
+          HighlightCell(dc, TRUE);
     }
   else
     {
@@ -1498,9 +1530,9 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
       //
       // 3) It *is* needed for Motif - michael
       //
-#ifdef __WXMOTIF__
-      if ( !(m_editable && m_editInPlace) )
-          HighlightCell(dc);
+#if defined(__WXMOTIF__)
+      if ((wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace)))
+          HighlightCell(dc, TRUE);
 #endif
     }
 
@@ -1557,9 +1589,13 @@ void wxGenericGrid::OnChangeSelectionLabel()
   }
 }
 
-void wxGenericGrid::HighlightCell(wxDC *dc)
+void wxGenericGrid::HighlightCell(wxDC *dc, bool doHighlight)
 {
-  dc->SetLogicalFunction(wxINVERT);
+  wxPen savePen = dc->GetPen();
+  if (doHighlight)
+      dc->SetPen(m_highlightPen);
+  else
+      dc->SetPen(*wxThePenList->FindOrCreatePen(m_cellBackgroundColour, 1, wxSOLID));
 
   // Top
   dc->DrawLine( m_currentRect.x + 1,
@@ -1570,7 +1606,7 @@ void wxGenericGrid::HighlightCell(wxDC *dc)
   dc->DrawLine( m_currentRect.x + m_currentRect.width - 1,
                 m_currentRect.y + 1,
                 m_currentRect.x + m_currentRect.width - 1,
-                m_currentRect.y +m_currentRect.height - 1 );
+                m_currentRect.y + m_currentRect.height - 1 );
   // Bottom
   dc->DrawLine( m_currentRect.x + m_currentRect.width - 1,
                 m_currentRect.y + m_currentRect.height - 1,
@@ -1582,7 +1618,7 @@ void wxGenericGrid::HighlightCell(wxDC *dc)
                 m_currentRect.x + 1,
                 m_currentRect.y + 1);
 
-  dc->SetLogicalFunction(wxCOPY);
+  dc->SetPen(savePen);
 }
 
 void wxGenericGrid::DrawCellText()
@@ -2094,23 +2130,25 @@ void wxGenericGrid::SetEditInPlace(bool edit)
         {
           if ( m_currentRectVisible && m_editable )
             {
-              m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2,
-                                          m_currentRect.width+4, m_currentRect.height+4 );
+              m_inPlaceTextItem->SetSize( m_currentRect.x-wxIPE_ADJUST,
+                                          m_currentRect.y-wxIPE_ADJUST,
+                                          m_currentRect.width+wxIPE_ADJUST*2,
+                                          m_currentRect.height+wxIPE_ADJUST*2 );
 
               wxGridCell *cell = GetCell(m_wCursorRow, m_wCursorColumn);
 
-              if ( cell )
-                {
-                  if ( cell->GetTextValue().IsNull() )
-                    {
+              if ( cell ) {
+                  m_inPlaceTextItem->SetFont( cell->GetFont() );
+                  m_inPlaceTextItem->SetBackgroundColour(cell->GetBackgroundColour());
+                  m_inPlaceTextItem->SetForegroundColour(cell->GetTextColour());
+
+                  if ( cell->GetTextValue().IsNull() ) {
                       m_inPlaceTextItem->SetValue( "" );
-                    }
-                  else
-                    {
-                      m_inPlaceTextItem->SetFont( cell->GetFont() );
+                  }
+                  else {
                       m_inPlaceTextItem->SetValue( cell->GetTextValue() );
-                    }
-                }
+                  }
+              }
 
               m_inPlaceTextItem->Show( TRUE );
               m_inPlaceTextItem->SetFocus();
@@ -2524,8 +2562,8 @@ void wxGenericGrid::SetGridCursor(int row, int col)
 
   SetGridClippingRegion(& dc);
 
-  if (m_currentRectVisible && !(m_editable && m_editInPlace) )
-    HighlightCell(& dc);
+  if (m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace)))
+      HighlightCell(& dc, FALSE);
 
   m_wCursorRow = row;
   m_wCursorColumn = col;
@@ -2535,8 +2573,8 @@ void wxGenericGrid::SetGridCursor(int row, int col)
 
   SetCurrentRect(row, col, cw, ch);
 
-  if (m_currentRectVisible && !(m_editable && m_editInPlace) )
-    HighlightCell(& dc);
+  if (m_currentRectVisible && (wxIPE_HIGHLIGHT || !(m_editable && m_editInPlace)))
+      HighlightCell(& dc, TRUE);
 
   dc.DestroyClippingRegion();
   dc.EndDrawing();
@@ -2603,15 +2641,17 @@ void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) )
               m_inPlaceTextItem->SetValue( grid->GetTextItem()->GetValue() );
             }
 
-          wxClientDC dc(grid);
+          if (!m_editInPlace) {
+              wxClientDC dc(grid);
 
-          dc.BeginDrawing();
-          grid->SetGridClippingRegion(& dc);
-          grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
-          grid->DrawCellValue(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
-          if ( !(m_editable && m_editInPlace ) ) grid->HighlightCell(& dc);
-          dc.DestroyClippingRegion();
-          dc.EndDrawing();
+              dc.BeginDrawing();
+              grid->SetGridClippingRegion(& dc);
+              grid->DrawCellBackground(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
+              grid->DrawCellValue(& dc, &grid->GetCurrentRect(), grid->GetCursorRow(), grid->GetCursorColumn());
+              grid->HighlightCell(& dc, TRUE);
+              dc.DestroyClippingRegion();
+              dc.EndDrawing();
+          }
 
           //grid->OnCellChange(grid->GetCursorRow(), grid->GetCursorColumn());
           wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_CHANGE, grid,
@@ -2679,14 +2719,12 @@ void wxGenericGrid::OnTextInPlaceEnter(wxCommandEvent& WXUNUSED(ev) )
 
 void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
 {
-  static bool inScroll = FALSE;
-
-  if ( inScroll )
+  if ( m_inScroll )
         return;
 
   if ( m_editInPlace ) m_inPlaceTextItem->Show(FALSE);
 
-  inScroll = TRUE;
+  m_inScroll = TRUE;
   wxGenericGrid *win = this;
 
   bool change = FALSE;
@@ -2715,13 +2753,15 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
 
   if ( m_editInPlace && m_currentRectVisible )
     {
-      m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2,
-                                  m_currentRect.width+4, m_currentRect.height+4 );
+      m_inPlaceTextItem->SetSize( m_currentRect.x-wxIPE_ADJUST,
+                                  m_currentRect.y-wxIPE_ADJUST,
+                                  m_currentRect.width+wxIPE_ADJUST*2,
+                                  m_currentRect.height+wxIPE_ADJUST*2 );
       m_inPlaceTextItem->Show( TRUE );
       m_inPlaceTextItem->SetFocus();
     }
 
-  inScroll = FALSE;
+  m_inScroll = FALSE;
 
 }