]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/gridg.cpp
Moved gsockunx.h from src/unix to include/wx/unix
[wxWidgets.git] / src / generic / gridg.cpp
index 5798ad501e2346f77adac3de8397c9871d4874ea..cb590108cbf6988ca8d2c6b9bbc1dab649c65b6a 100644 (file)
 
 #include "wx/generic/gridg.h"
 
 
 #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__
 #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 __WXPM__
+#define wxIPE_ADJUST            -1
+#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
 
 #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
 #define wxGRID_DRAG_NONE       0
 #define wxGRID_DRAG_LEFT_RIGHT 1
 #define wxGRID_DRAG_UP_DOWN    2
@@ -98,8 +131,9 @@ wxGenericGrid::wxGenericGrid()
   m_currentRectVisible = FALSE;
   m_editable = TRUE;
 
   m_currentRectVisible = FALSE;
   m_editable = TRUE;
 
-  m_editInPlace = TRUE;
+  m_editInPlace = FALSE;
   m_inOnTextInPlace = FALSE;
   m_inOnTextInPlace = FALSE;
+  m_inScroll = FALSE;
 
 #if defined(__WIN95__)
   m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
 
 #if defined(__WIN95__)
   m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
@@ -113,6 +147,7 @@ wxGenericGrid::wxGenericGrid()
   m_dragStartPosition = 0;
   m_dragLastPosition = 0;
   m_divisionPen = wxNullPen;
   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;
   m_leftOfSheet = wxGRID_DEFAULT_SHEET_LEFT;
   m_topOfSheet = wxGRID_DEFAULT_SHEET_TOP;
   m_cellHeight = wxGRID_DEFAULT_CELL_HEIGHT;
@@ -165,6 +200,9 @@ bool wxGenericGrid::Create(wxWindow *parent,
   m_textItem = (wxTextCtrl *) NULL;
   m_currentRectVisible = FALSE;
   m_editable = TRUE;
   m_textItem = (wxTextCtrl *) NULL;
   m_currentRectVisible = FALSE;
   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__)
 #if defined(__WIN95__)
   m_scrollWidth = wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
 #elif defined(__WXGTK__)
@@ -177,6 +215,7 @@ bool wxGenericGrid::Create(wxWindow *parent,
   m_dragStartPosition = 0;
   m_dragLastPosition = 0;
   m_divisionPen = * wxThePenList->FindOrCreatePen("LIGHT GREY", 1, wxSOLID);
   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())
   m_doubleBufferingBitmap = (wxBitmap *) NULL;
 
   if (!m_horizontalSashCursor.Ok())
@@ -247,11 +286,12 @@ 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, "",
 //  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 );
                                       wxNO_BORDER | wxTE_PROCESS_ENTER );
-  m_inPlaceTextItem->Show(TRUE);
-  m_inPlaceTextItem->SetFocus();
+  m_inPlaceTextItem->Show(m_editInPlace);
+  if ( m_editInPlace )
+    m_inPlaceTextItem->SetFocus();
 
   return TRUE;
 }
 
   return TRUE;
 }
@@ -543,8 +583,8 @@ void wxGenericGrid::PaintGrid(wxDC& dc)
 
     /* Hilight present cell */
     SetCurrentRect(m_wCursorRow, m_wCursorColumn);
 
     /* 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);
 
     dc.DestroyClippingRegion();
     dc.SetOptimization(TRUE);
@@ -1423,9 +1463,9 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
   SetGridClippingRegion(dc);
 
   // Remove the highlight from the old cell
   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);
     }
 
 
     }
 
 
@@ -1445,24 +1485,56 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
 
   if ( m_editable && m_editInPlace )
     {
 
   if ( m_editable && m_editInPlace )
     {
-      m_inPlaceTextItem->SetSize( m_currentRect.x-2, m_currentRect.y-2,
-                                  m_currentRect.width+4, m_currentRect.height+4 );
+      int x, y, width, height;
+      if ( m_currentRect.x <= 0 )
+        {
+          x = 0;
+          width = m_currentRect.width + wxIPE_ADJUST;
+        }
+      else
+        {
+          x = m_currentRect.x - wxIPE_ADJUST;
+          width = m_currentRect.width + wxIPE_ADJUST*2;
+        }
 
 
-      if ( cell )
+      if ( m_currentRect.y <= 0 )
         {
         {
-          if ( cell->GetTextValue().IsNull() )
-            {
+          y = 0;
+          height = m_currentRect.height + wxIPE_ADJUST;
+        }
+      else
+        {
+          y = m_currentRect.y - wxIPE_ADJUST;
+          height = m_currentRect.height + wxIPE_ADJUST*2;
+        }
+
+      m_inPlaceTextItem->SetSize( x, y, width, height );
+
+      if ( cell ) {
+          m_inPlaceTextItem->SetFont( cell->GetFont() );
+          m_inPlaceTextItem->SetBackgroundColour(cell->GetBackgroundColour());
+          m_inPlaceTextItem->SetForegroundColour(cell->GetTextColour());
+
+          if ( cell->GetTextValue().IsNull() ) {
               m_inPlaceTextItem->SetValue( "" );
               m_inPlaceTextItem->SetValue( "" );
-            }
-          else
-            {
-              m_inPlaceTextItem->SetFont( cell->GetFont() );
+          }
+          else {
               m_inPlaceTextItem->SetValue( cell->GetTextValue() );
               m_inPlaceTextItem->SetValue( cell->GetTextValue() );
-            }
-        }
+          }
+      }
 
       m_inPlaceTextItem->Show(TRUE);
       m_inPlaceTextItem->SetFocus();
 
       m_inPlaceTextItem->Show(TRUE);
       m_inPlaceTextItem->SetFocus();
+#if defined(__VISAGECPP__)
+      {
+          int                       highlight = wxIPE_HIGHLIGHT;
+          if (highlight != 0)
+              HighlightCell(dc, TRUE);
+      }
+#else
+      if (wxIPE_HIGHLIGHT != 0)
+          HighlightCell(dc, TRUE);
+#endif
     }
   else
     {
     }
   else
     {
@@ -1473,9 +1545,9 @@ void wxGenericGrid::OnSelectCellImplementation(wxDC *dc, int row, int col)
       //
       // 3) It *is* needed for Motif - michael
       //
       //
       // 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
     }
 
 #endif
     }
 
@@ -1532,9 +1604,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,
 
   // Top
   dc->DrawLine( m_currentRect.x + 1,
@@ -1545,7 +1621,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,
   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,
   // Bottom
   dc->DrawLine( m_currentRect.x + m_currentRect.width - 1,
                 m_currentRect.y + m_currentRect.height - 1,
@@ -1557,7 +1633,7 @@ void wxGenericGrid::HighlightCell(wxDC *dc)
                 m_currentRect.x + 1,
                 m_currentRect.y + 1);
 
                 m_currentRect.x + 1,
                 m_currentRect.y + 1);
 
-  dc->SetLogicalFunction(wxCOPY);
+  dc->SetPen(savePen);
 }
 
 void wxGenericGrid::DrawCellText()
 }
 
 void wxGenericGrid::DrawCellText()
@@ -1710,21 +1786,21 @@ void wxGenericGrid::DrawTextRect(wxDC *dc, const wxString& text, wxRect *rect, i
   {
     case wxRIGHT:
     {
   {
     case wxRIGHT:
     {
-      x = (rect->x + rect->width - textWidth - 1.0);
-      y = (rect->y + (rect->height - textHeight)/2.0);
+      x = (rect->x + rect->width - textWidth - (float)1.0);
+      y = (rect->y + (rect->height - textHeight)/(float)2.0);
       break;
     }
     case wxCENTRE:
     {
       break;
     }
     case wxCENTRE:
     {
-      x = (rect->x + (rect->width - textWidth)/2.0);
-      y = (rect->y + (rect->height - textHeight)/2.0);
+      x = (rect->x + (rect->width - textWidth)/(float)2.0);
+      y = (rect->y + (rect->height - textHeight)/(float)2.0);
       break;
     }
     case wxLEFT:
     default:
     {
       break;
     }
     case wxLEFT:
     default:
     {
-      x = (rect->x + 1.0);
-      y = (rect->y + (rect->height - textHeight)/2.0);
+      x = (rect->x + (float)1.0);
+      y = (rect->y + (rect->height - textHeight)/(float)2.0);
       break;
     }
   }
       break;
     }
   }
@@ -2069,23 +2145,25 @@ void wxGenericGrid::SetEditInPlace(bool edit)
         {
           if ( m_currentRectVisible && m_editable )
             {
         {
           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);
 
 
               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( "" );
                       m_inPlaceTextItem->SetValue( "" );
-                    }
-                  else
-                    {
-                      m_inPlaceTextItem->SetFont( cell->GetFont() );
+                  }
+                  else {
                       m_inPlaceTextItem->SetValue( cell->GetTextValue() );
                       m_inPlaceTextItem->SetValue( cell->GetTextValue() );
-                    }
-                }
+                  }
+              }
 
               m_inPlaceTextItem->Show( TRUE );
               m_inPlaceTextItem->SetFocus();
 
               m_inPlaceTextItem->Show( TRUE );
               m_inPlaceTextItem->SetFocus();
@@ -2499,8 +2577,8 @@ void wxGenericGrid::SetGridCursor(int row, int col)
 
   SetGridClippingRegion(& dc);
 
 
   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;
 
   m_wCursorRow = row;
   m_wCursorColumn = col;
@@ -2510,8 +2588,8 @@ void wxGenericGrid::SetGridCursor(int row, int col)
 
   SetCurrentRect(row, col, cw, ch);
 
 
   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();
 
   dc.DestroyClippingRegion();
   dc.EndDrawing();
@@ -2578,15 +2656,17 @@ void wxGenericGrid::OnText(wxCommandEvent& WXUNUSED(ev) )
               m_inPlaceTextItem->SetValue( grid->GetTextItem()->GetValue() );
             }
 
               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,
 
           //grid->OnCellChange(grid->GetCursorRow(), grid->GetCursorColumn());
           wxGridEvent g_evt(GetId(), wxEVT_GRID_CELL_CHANGE, grid,
@@ -2654,14 +2734,12 @@ void wxGenericGrid::OnTextInPlaceEnter(wxCommandEvent& WXUNUSED(ev) )
 
 void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
 {
 
 void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
 {
-  static bool inScroll = FALSE;
-
-  if ( inScroll )
+  if ( m_inScroll )
         return;
 
   if ( m_editInPlace ) m_inPlaceTextItem->Show(FALSE);
 
         return;
 
   if ( m_editInPlace ) m_inPlaceTextItem->Show(FALSE);
 
-  inScroll = TRUE;
+  m_inScroll = TRUE;
   wxGenericGrid *win = this;
 
   bool change = FALSE;
   wxGenericGrid *win = this;
 
   bool change = FALSE;
@@ -2690,13 +2768,15 @@ void wxGenericGrid::OnGridScroll(wxScrollEvent& ev)
 
   if ( m_editInPlace && m_currentRectVisible )
     {
 
   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();
     }
 
       m_inPlaceTextItem->Show( TRUE );
       m_inPlaceTextItem->SetFocus();
     }
 
-  inScroll = FALSE;
+  m_inScroll = FALSE;
 
 }
 
 
 }