]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/grid.cpp
corrected VC++ version check
[wxWidgets.git] / src / generic / grid.cpp
index adace082480fe74899494c42ae2ef3bfb57edfb8..dd23379a8c96188767f1bde5ae332ba8dddc0b87 100644 (file)
@@ -132,12 +132,14 @@ public:
                     int additionalStyle = 0,
                     const wxString& name = wxPanelNameStr)
         : wxWindow(owner, id, pos, size,
-                   wxWANTS_CHARS | wxBORDER_NONE | additionalStyle,
+                   wxBORDER_NONE | additionalStyle,
                    name)
     {
         m_owner = owner;
     }
 
+    virtual bool AcceptsFocus() const { return false; }
+
     wxGrid *GetOwner() { return m_owner; }
 
 protected:
@@ -160,9 +162,6 @@ private:
     void OnPaint( wxPaintEvent& event );
     void OnMouseEvent( wxMouseEvent& event );
     void OnMouseWheel( wxMouseEvent& event );
-    void OnKeyDown( wxKeyEvent& event );
-    void OnKeyUp( wxKeyEvent& );
-    void OnChar( wxKeyEvent& );
 
     DECLARE_DYNAMIC_CLASS(wxGridRowLabelWindow)
     DECLARE_EVENT_TABLE()
@@ -181,9 +180,6 @@ private:
     void OnPaint( wxPaintEvent& event );
     void OnMouseEvent( wxMouseEvent& event );
     void OnMouseWheel( wxMouseEvent& event );
-    void OnKeyDown( wxKeyEvent& event );
-    void OnKeyUp( wxKeyEvent& );
-    void OnChar( wxKeyEvent& );
 
     DECLARE_DYNAMIC_CLASS(wxGridColLabelWindow)
     DECLARE_EVENT_TABLE()
@@ -201,9 +197,6 @@ public:
 private:
     void OnMouseEvent( wxMouseEvent& event );
     void OnMouseWheel( wxMouseEvent& event );
-    void OnKeyDown( wxKeyEvent& event );
-    void OnKeyUp( wxKeyEvent& );
-    void OnChar( wxKeyEvent& );
     void OnPaint( wxPaintEvent& event );
 
     DECLARE_DYNAMIC_CLASS(wxGridCornerLabelWindow)
@@ -227,6 +220,8 @@ public:
 
     void ScrollWindow( int dx, int dy, const wxRect *rect );
 
+    virtual bool AcceptsFocus() const { return true; }
+
 private:
     wxGridRowLabelWindow     *m_rowLabelWin;
     wxGridColLabelWindow     *m_colLabelWin;
@@ -1811,7 +1806,12 @@ void wxGridCellRenderer::Draw(wxGrid& grid,
     {
         if ( isSelected )
         {
-            dc.SetBrush( wxBrush(grid.GetSelectionBackground(), wxSOLID) );
+            wxColour clr;
+            if ( grid.HasFocus() )
+                clr = grid.GetSelectionBackground();
+            else
+                clr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW);
+            dc.SetBrush( wxBrush(clr, wxSOLID) );
         }
         else
         {
@@ -1845,7 +1845,12 @@ void wxGridCellStringRenderer::SetTextColoursAndFont(const wxGrid& grid,
     {
         if ( isSelected )
         {
-            dc.SetTextBackground( grid.GetSelectionBackground() );
+            wxColour clr;
+            if ( grid.HasFocus() )
+                clr = grid.GetSelectionBackground();
+            else
+                clr = wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW);
+            dc.SetTextBackground( clr );
             dc.SetTextForeground( grid.GetSelectionForeground() );
         }
         else
@@ -3774,9 +3779,6 @@ BEGIN_EVENT_TABLE( wxGridRowLabelWindow, wxGridSubwindow )
     EVT_PAINT( wxGridRowLabelWindow::OnPaint )
     EVT_MOUSEWHEEL( wxGridRowLabelWindow::OnMouseWheel )
     EVT_MOUSE_EVENTS( wxGridRowLabelWindow::OnMouseEvent )
-    EVT_KEY_DOWN( wxGridRowLabelWindow::OnKeyDown )
-    EVT_KEY_UP( wxGridRowLabelWindow::OnKeyUp )
-    EVT_CHAR( wxGridRowLabelWindow::OnChar )
 END_EVENT_TABLE()
 
 wxGridRowLabelWindow::wxGridRowLabelWindow( wxGrid *parent,
@@ -3816,27 +3818,6 @@ void wxGridRowLabelWindow::OnMouseWheel( wxMouseEvent& event )
     m_owner->GetEventHandler()->ProcessEvent( event );
 }
 
-// This seems to be required for wxMotif otherwise the mouse
-// cursor must be in the cell edit control to get key events
-//
-void wxGridRowLabelWindow::OnKeyDown( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridRowLabelWindow::OnKeyUp( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridRowLabelWindow::OnChar( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
 //////////////////////////////////////////////////////////////////////
 
 IMPLEMENT_DYNAMIC_CLASS( wxGridColLabelWindow, wxWindow )
@@ -3845,9 +3826,6 @@ BEGIN_EVENT_TABLE( wxGridColLabelWindow, wxGridSubwindow )
     EVT_PAINT( wxGridColLabelWindow::OnPaint )
     EVT_MOUSEWHEEL( wxGridColLabelWindow::OnMouseWheel )
     EVT_MOUSE_EVENTS( wxGridColLabelWindow::OnMouseEvent )
-    EVT_KEY_DOWN( wxGridColLabelWindow::OnKeyDown )
-    EVT_KEY_UP( wxGridColLabelWindow::OnKeyUp )
-    EVT_CHAR( wxGridColLabelWindow::OnChar )
 END_EVENT_TABLE()
 
 wxGridColLabelWindow::wxGridColLabelWindow( wxGrid *parent,
@@ -3890,27 +3868,6 @@ void wxGridColLabelWindow::OnMouseWheel( wxMouseEvent& event )
     m_owner->GetEventHandler()->ProcessEvent( event );
 }
 
-// This seems to be required for wxMotif otherwise the mouse
-// cursor must be in the cell edit control to get key events
-//
-void wxGridColLabelWindow::OnKeyDown( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridColLabelWindow::OnKeyUp( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridColLabelWindow::OnChar( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
 //////////////////////////////////////////////////////////////////////
 
 IMPLEMENT_DYNAMIC_CLASS( wxGridCornerLabelWindow, wxWindow )
@@ -3919,9 +3876,6 @@ BEGIN_EVENT_TABLE( wxGridCornerLabelWindow, wxGridSubwindow )
     EVT_MOUSEWHEEL( wxGridCornerLabelWindow::OnMouseWheel )
     EVT_MOUSE_EVENTS( wxGridCornerLabelWindow::OnMouseEvent )
     EVT_PAINT( wxGridCornerLabelWindow::OnPaint )
-    EVT_KEY_DOWN( wxGridCornerLabelWindow::OnKeyDown )
-    EVT_KEY_UP( wxGridCornerLabelWindow::OnKeyUp )
-    EVT_CHAR( wxGridCornerLabelWindow::OnChar )
 END_EVENT_TABLE()
 
 wxGridCornerLabelWindow::wxGridCornerLabelWindow( wxGrid *parent,
@@ -3973,27 +3927,6 @@ void wxGridCornerLabelWindow::OnMouseWheel( wxMouseEvent& event )
     m_owner->GetEventHandler()->ProcessEvent(event);
 }
 
-// This seems to be required for wxMotif otherwise the mouse
-// cursor must be in the cell edit control to get key events
-//
-void wxGridCornerLabelWindow::OnKeyDown( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridCornerLabelWindow::OnKeyUp( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
-void wxGridCornerLabelWindow::OnChar( wxKeyEvent& event )
-{
-    if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
-        event.Skip();
-}
-
 //////////////////////////////////////////////////////////////////////
 
 IMPLEMENT_DYNAMIC_CLASS( wxGridWindow, wxWindow )
@@ -4017,7 +3950,8 @@ wxGridWindow::wxGridWindow( wxGrid *parent,
                             const wxPoint &pos,
                             const wxSize &size )
             : wxGridSubwindow(parent, id, pos, size,
-                              wxCLIP_CHILDREN, wxT("grid window") )
+                              wxWANTS_CHARS | wxCLIP_CHILDREN,
+                              wxT("grid window") )
 {
     m_owner = parent;
     m_rowLabelWin = rowLblWin;
@@ -4087,6 +4021,29 @@ void wxGridWindow::OnEraseBackground( wxEraseEvent& WXUNUSED(event) )
 
 void wxGridWindow::OnFocus(wxFocusEvent& event)
 {
+    // and if we have any selection, it has to be repainted, because it
+    // uses different colour when the grid is not focused:
+    if ( m_owner->IsSelection() )
+    {
+        Refresh();
+    }
+    else
+    {
+        // NB: Note that this code is in "else" branch only because the other
+        //     branch refreshes everything and so there's no point in calling
+        //     Refresh() again, *not* because it should only be done if
+        //     !IsSelection(). If the above code is ever optimized to refresh
+        //     only selected area, this needs to be moved out of the "else"
+        //     branch so that it's always executed.
+
+        // current cell cursor {dis,re}appears on focus change:
+        const wxGridCellCoords cursorCoords(m_owner->GetGridCursorRow(),
+                                            m_owner->GetGridCursorCol());
+        const wxRect cursor =
+            m_owner->BlockToDeviceRect(cursorCoords, cursorCoords);
+        Refresh(true, &cursor);
+    }
+
     if ( !m_owner->GetEventHandler()->ProcessEvent( event ) )
         event.Skip();
 }
@@ -4188,12 +4145,8 @@ wxGrid::wxGrid( wxWindow *parent,
                  const wxSize& size,
                  long style,
                  const wxString& name )
-  : wxScrolledWindow( parent, id, pos, size, (style | wxWANTS_CHARS), name ),
-    m_colMinWidths(GRID_HASH_SIZE),
-    m_rowMinHeights(GRID_HASH_SIZE)
 {
-    Create();
-    SetInitialSize(size);
+    Create(parent, id, pos, size, style, name);
 }
 
 bool wxGrid::Create(wxWindow *parent, wxWindowID id,
@@ -4515,6 +4468,7 @@ void wxGrid::Init()
     m_dragRowOrCol = -1;
     m_isDragging = false;
     m_startDragPos = wxDefaultPosition;
+    m_nativeColumnLabels = false;
 
     m_waitForSlowClick = false;
 
@@ -7637,6 +7591,10 @@ void wxGrid::DrawCell( wxDC& dc, const wxGridCellCoords& coords )
 
 void wxGrid::DrawCellHighlight( wxDC& dc, const wxGridCellAttr *attr )
 {
+    // don't show highlight when the grid doesn't have focus
+    if ( !HasFocus() )
+        return;
+
     int row = m_currentCellCoords.GetRow();
     int col = m_currentCellCoords.GetCol();
 
@@ -7912,19 +7870,6 @@ void wxGrid::DrawRowLabel( wxDC& dc, int row )
 
     wxRect rect;
 
-#if 0
-def __WXGTK20__
-    rect.SetX( 1 );
-    rect.SetY( GetRowTop(row) + 1 );
-    rect.SetWidth( m_rowLabelWidth - 2 );
-    rect.SetHeight( GetRowHeight(row) - 2 );
-
-    CalcScrolledPosition( 0, rect.y, NULL, &rect.y );
-
-    wxWindowDC *win_dc = (wxWindowDC*) &dc;
-
-    wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 );
-#else
     int rowTop = GetRowTop(row),
         rowBottom = GetRowBottom(row) - 1;
 
@@ -7936,7 +7881,6 @@ def __WXGTK20__
     dc.SetPen( *wxWHITE_PEN );
     dc.DrawLine( 1, rowTop, 1, rowBottom );
     dc.DrawLine( 1, rowTop, m_rowLabelWidth - 1, rowTop );
-#endif
 
     dc.SetBackgroundMode( wxTRANSPARENT );
     dc.SetTextForeground( GetLabelTextColour() );
@@ -7952,6 +7896,18 @@ def __WXGTK20__
     DrawTextRectangle( dc, GetRowLabelValue( row ), rect, hAlign, vAlign );
 }
 
+void wxGrid::SetUseNativeColLabels( bool native )
+{
+    m_nativeColumnLabels = native;
+    if (native)
+    {
+        int height = wxRendererNative::Get().GetHeaderButtonHeight( this );
+        SetColLabelSize( height );
+    }
+    
+    m_colLabelWin->Refresh();
+}
+
 void wxGrid::DrawColLabels( wxDC& dc,const wxArrayInt& cols )
 {
     if ( !m_numCols )
@@ -7975,29 +7931,30 @@ void wxGrid::DrawColLabel( wxDC& dc, int col )
 
     wxRect rect;
 
-#if 0
-def __WXGTK20__
-    rect.SetX( colLeft + 1 );
-    rect.SetY( 1 );
-    rect.SetWidth( GetColWidth(col) - 2 );
-    rect.SetHeight( m_colLabelHeight - 2 );
-
-    wxWindowDC *win_dc = (wxWindowDC*) &dc;
+    if (m_nativeColumnLabels)
+    {
+        rect.SetX( colLeft);
+        rect.SetY( 0 );
+        rect.SetWidth( GetColWidth(col));
+        rect.SetHeight( m_colLabelHeight );
 
-    wxRendererNative::Get().DrawHeaderButton( win_dc->m_owner, dc, rect, 0 );
-#else
-    int colRight = GetColRight(col) - 1;
+        wxWindowDC *win_dc = (wxWindowDC*) &dc;
+        wxRendererNative::Get().DrawHeaderButton( win_dc->GetWindow(), dc, rect, 0 );
+    }
+    else
+    {
+        int colRight = GetColRight(col) - 1;
 
-    dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) );
-    dc.DrawLine( colRight, 0, colRight, m_colLabelHeight - 1 );
-    dc.DrawLine( colLeft, 0, colRight, 0 );
-    dc.DrawLine( colLeft, m_colLabelHeight - 1,
+        dc.SetPen( wxPen(wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW), 1, wxSOLID) );
+        dc.DrawLine( colRight, 0, colRight, m_colLabelHeight - 1 );
+        dc.DrawLine( colLeft, 0, colRight, 0 );
+        dc.DrawLine( colLeft, m_colLabelHeight - 1,
                  colRight + 1, m_colLabelHeight - 1 );
 
-    dc.SetPen( *wxWHITE_PEN );
-    dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight - 1 );
-    dc.DrawLine( colLeft, 1, colRight, 1 );
-#endif
+        dc.SetPen( *wxWHITE_PEN );
+        dc.DrawLine( colLeft, 1, colLeft, m_colLabelHeight - 1 );
+        dc.DrawLine( colLeft, 1, colRight, 1 );
+    }
 
     dc.SetBackgroundMode( wxTRANSPARENT );
     dc.SetTextForeground( GetLabelTextColour() );