]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/datavgen.cpp
correct painting of the items with custom colours in TVIS_DROPHILITED state (patch...
[wxWidgets.git] / src / generic / datavgen.cpp
index f02cef988e1b7f7c49bb9997819ddc52fccc1ba8..c9ca4db621cfc51f9e1a0ade0363547e85efddaf 100644 (file)
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
 #if wxUSE_DATAVIEWCTRL
 
 #include "wx/dataview.h"
 #ifndef WX_PRECOMP
     #include "wx/sizer.h"
     #include "wx/log.h"
+    #include "wx/dcclient.h"
+    #include "wx/timer.h"
+    #include "wx/settings.h"
 #endif
 
 #include "wx/stockitem.h"
-#include "wx/dcclient.h"
 #include "wx/calctrl.h"
 #include "wx/popupwin.h"
 #include "wx/renderer.h"
-#include "wx/timer.h"
-#include "wx/settings.h"
 
 #ifdef __WXMSW__
     #include "wx/msw/wrapwin.h"
@@ -114,7 +118,7 @@ private:
     wxTextCtrl             *m_text;
     wxString                m_startValue;
     wxDataViewListModel    *m_model;
-    size_t                  m_col; 
+    size_t                  m_col;
     size_t                  m_row;
     bool                    m_finished;
     bool                    m_aboutToFinish;
@@ -166,44 +170,42 @@ public:
     void FinishEditing( wxTextCtrl *text );
 
     void ScrollWindow( int dx, int dy, const wxRect *rect );
-    
+
     bool HasCurrentRow() { return m_currentRow != (size_t)-1; }
     void ChangeCurrentRow( size_t row );
-    
+
     bool IsSingleSel() const { return !GetParent()->HasFlag(wxDV_MULTIPLE); };
     bool IsEmpty() { return GetRowCount() == 0; }
-    
+
     int GetCountPerPage();
     int GetEndOfLastCol();
     size_t GetFirstVisibleRow();
     size_t GetLastVisibleRow();
-    int GetRowCount();
-    
+    size_t GetRowCount();
+
     void SelectAllRows( bool on );
     void SelectRow( size_t row, bool on );
     void SelectRows( size_t from, size_t to, bool on );
     void ReverseRowSelection( size_t row );
     bool IsRowSelected( size_t row );
-    
+
     void RefreshRow( size_t row );
     void RefreshRows( size_t from, size_t to );
     void RefreshRowsAfter( size_t firstRow );
-    
+
 private:
     wxDataViewCtrl             *m_owner;
     int                         m_lineHeight;
     bool                        m_dirty;
-    
+
     wxDataViewColumn           *m_currentCol;
     size_t                      m_currentRow;
     wxDataViewSelection         m_selection;
-    
+
     wxDataViewRenameTimer      *m_renameTimer;
     wxDataViewTextCtrlWrapper  *m_textctrlWrapper;
     bool                        m_lastOnSame;
 
-    wxBrush                    *m_highlightBrush,
-                               *m_highlightUnfocusedBrush;
     bool                        m_hasFocus;
 
     int                         m_dragCount;
@@ -345,7 +347,7 @@ bool wxDataViewToggleCell::SetValue( const wxVariant &value )
 {
     m_toggle = value.GetBool();
 
-    return true;;
+    return true;
 }
 
 bool wxDataViewToggleCell::GetValue( wxVariant &WXUNUSED(value) )
@@ -362,14 +364,14 @@ bool wxDataViewToggleCell::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) )
     rect.width = 20;
     rect.y = cell.y + cell.height/2 - 10;
     rect.height = 20;
-    
+
     int flags = 0;
     if (m_toggle)
         flags |= wxCONTROL_CHECKED;
     if (GetMode() != wxDATAVIEW_CELL_ACTIVATABLE)
         flags |= wxCONTROL_DISABLED;
 
-    wxRendererNative::Get().DrawCheckButton(
+    wxRendererNative::Get().DrawCheckBox(
             GetOwner()->GetOwner(),
             *dc,
             rect,
@@ -462,10 +464,6 @@ public:
         sizer->Fit( this );
     }
 
-    virtual void OnDismiss()
-    {
-    }
-
     void OnCalendar( wxCalendarEvent &event );
 
     wxCalendarCtrl      *m_cal;
@@ -473,6 +471,11 @@ public:
     size_t               m_col;
     size_t               m_row;
 
+protected:
+    virtual void OnDismiss()
+    {
+    }
+
 private:
     DECLARE_EVENT_TABLE()
 };
@@ -545,12 +548,12 @@ bool wxDataViewDateCell::Activate( wxRect WXUNUSED(cell), wxDataViewListModel *m
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn, wxDataViewColumnBase)
 
-wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewCell *cell, size_t model_column, 
+wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewCell *cell, size_t model_column,
         int fixed_width, wxDataViewColumnSizing sizing, int flags ) :
     wxDataViewColumnBase( title, cell, model_column, flags )
 {
     m_sizing = sizing;
-    
+
     m_width = fixed_width;
     m_fixedWidth = fixed_width;
 }
@@ -573,7 +576,7 @@ int wxDataViewColumn::GetWidth()
 void wxDataViewColumn::SetFixedWidth( int width )
 {
     m_fixedWidth = width;
-    
+
     if (m_sizing == wxDATAVIEW_COL_WIDTH_FIXED)
     {
         m_width = width;
@@ -707,15 +710,15 @@ wxDataViewTextCtrlWrapper::wxDataViewTextCtrlWrapper(
     m_model = model;
     m_row = row;
     m_col = col;
-    m_text = text; 
-    
+    m_text = text;
+
     m_finished = false;
     m_aboutToFinish = false;
-    
+
     wxVariant value;
     model->GetValue( value, col, row );
     m_startValue = value.GetString();
-    
+
     m_owner->GetOwner()->CalcScrolledPosition(
         rectLabel.x, rectLabel.y, &rectLabel.x, &rectLabel.y );
 
@@ -723,7 +726,7 @@ wxDataViewTextCtrlWrapper::wxDataViewTextCtrlWrapper(
                     wxPoint(rectLabel.x-2,rectLabel.y-2),
                     wxSize(rectLabel.width+7,rectLabel.height+4) );
     m_text->SetFocus();
-                       
+
     m_text->PushEventHandler(this);
 }
 
@@ -786,7 +789,7 @@ void wxDataViewTextCtrlWrapper::OnKillFocus( wxFocusEvent &event )
         AcceptChanges();
         //if ( !AcceptChanges() )
         //    m_owner->OnRenameCancelled( m_itemEdited );
-        
+
         Finish();
     }
 
@@ -855,14 +858,14 @@ wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID i
     const wxPoint &pos, const wxSize &size, const wxString &name ) :
     wxWindow( parent, id, pos, size, wxWANTS_CHARS, name ),
     m_selection( wxDataViewSelectionCmp )
-    
+
 {
     SetOwner( parent );
 
     m_lastOnSame = false;
     m_renameTimer = new wxDataViewRenameTimer( this );
     m_textctrlWrapper = NULL;
-    
+
     // TODO: user better initial values/nothing selected
     m_currentCol = NULL;
     m_currentRow = 0;
@@ -875,25 +878,7 @@ wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID i
     m_lineLastClicked = (size_t) -1;
     m_lineBeforeLastClicked = (size_t) -1;
     m_lineSelectSingleOnUp = (size_t) -1;
-    
-    m_highlightBrush = new wxBrush
-                           (
-                            wxSystemSettings::GetColour
-                            (
-                                wxSYS_COLOUR_HIGHLIGHT
-                            ),
-                            wxSOLID
-                           );
-
-    m_highlightUnfocusedBrush = new wxBrush
-                                    (
-                                       wxSystemSettings::GetColour
-                                       (
-                                           wxSYS_COLOUR_BTNSHADOW
-                                       ),
-                                       wxSOLID
-                                    );
-    
+
     m_hasFocus = false;
 
     SetBackgroundColour( *wxWHITE );
@@ -904,8 +889,6 @@ wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID i
 wxDataViewMainWindow::~wxDataViewMainWindow()
 {
     delete m_renameTimer;
-    delete m_highlightBrush;
-    delete m_highlightUnfocusedBrush;
 }
 
 void wxDataViewMainWindow::OnRenameTimer()
@@ -931,7 +914,7 @@ void wxDataViewMainWindow::OnRenameTimer()
     wxClassInfo *textControlClass = CLASSINFO(wxTextCtrl);
 
     wxTextCtrl * const text = (wxTextCtrl *)textControlClass->CreateObject();
-    m_textctrlWrapper = new wxDataViewTextCtrlWrapper(this, text, GetOwner()->GetModel(), 
+    m_textctrlWrapper = new wxDataViewTextCtrlWrapper(this, text, GetOwner()->GetModel(),
         m_currentCol->GetModelColumn(), m_currentRow, labelRect );
 }
 
@@ -980,7 +963,7 @@ bool wxDataViewMainWindow::ValueChanged( size_t WXUNUSED(col), size_t row )
 bool wxDataViewMainWindow::RowsReordered( size_t *WXUNUSED(new_order) )
 {
     Refresh();
-    
+
     return true;
 }
 
@@ -1051,32 +1034,48 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
     wxDataViewListModel *model = GetOwner()->GetModel();
 
     size_t item_start = wxMax( 0, (update.y / m_lineHeight) );
-    size_t item_count = wxMin( (int)(((update.y + update.height) / m_lineHeight) - item_start + 1), 
+    size_t item_count = wxMin( (int)(((update.y + update.height) / m_lineHeight) - item_start + 1),
                                (int)(model->GetNumberOfRows()-item_start) );
 
 
-    if (m_hasFocus)
-        dc.SetBrush( *m_highlightBrush );
-    else
-        dc.SetBrush( *m_highlightUnfocusedBrush );
-    dc.SetPen( *wxTRANSPARENT_PEN );
-            
+
     size_t item;
     for (item = item_start; item < item_start+item_count; item++)
     {
         if (m_selection.Index( item ) != wxNOT_FOUND)
         {
+            int flags = wxCONTROL_SELECTED;
+            if (item == m_currentRow)
+                flags |= wxCONTROL_CURRENT;
+            if (m_hasFocus)
+                flags |= wxCONTROL_FOCUSED;
             wxRect rect( 0, item*m_lineHeight+1, GetEndOfLastCol(), m_lineHeight-2 );
-            dc.DrawRectangle( rect );
+            wxRendererNative::Get().DrawItemSelectionRect
+                                (
+                                    this,
+                                    dc,
+                                    rect,
+                                    flags
+                                );
+        }
+        else
+        {
+            if (item == m_currentRow)
+            {
+                int flags = wxCONTROL_CURRENT;
+                if (m_hasFocus)
+                    flags |= wxCONTROL_FOCUSED;  // should have no effect
+                wxRect rect( 0, item*m_lineHeight+1, GetEndOfLastCol(), m_lineHeight-2 );
+                wxRendererNative::Get().DrawItemSelectionRect
+                                (
+                                    this,
+                                    dc,
+                                    rect,
+                                    flags
+                                );
+
+            }
         }
-    }
-    
-    dc.SetBrush( *wxTRANSPARENT_BRUSH );
-    dc.SetPen( *wxBLACK_PEN );
-    if (HasCurrentRow())
-    {
-        wxRect rect( 0, m_currentRow*m_lineHeight+1, GetEndOfLastCol(), m_lineHeight-2 );
-        dc.DrawRectangle( rect );
     }
 
     wxRect cell_rect;
@@ -1138,7 +1137,7 @@ size_t wxDataViewMainWindow::GetFirstVisibleRow()
     int x = 0;
     int y = 0;
     m_owner->CalcUnscrolledPosition( x, y, &x, &y );
-    
+
     return y / m_lineHeight;
 }
 
@@ -1147,10 +1146,10 @@ size_t wxDataViewMainWindow::GetLastVisibleRow()
     wxSize client_size = GetClientSize();
     m_owner->CalcUnscrolledPosition( client_size.x, client_size.y, &client_size.x, &client_size.y );
 
-    return wxMin( GetRowCount()-1, (client_size.y/m_lineHeight)+1 );
+    return wxMin( GetRowCount()-1, ((unsigned)client_size.y/m_lineHeight)+1 );
 }
 
-int wxDataViewMainWindow::GetRowCount()
+size_t wxDataViewMainWindow::GetRowCount()
 {
     return GetOwner()->GetModel()->GetNumberOfRows();
 }
@@ -1158,19 +1157,19 @@ int wxDataViewMainWindow::GetRowCount()
 void wxDataViewMainWindow::ChangeCurrentRow( size_t row )
 {
     m_currentRow = row;
-    
+
     // send event
 }
 
 void wxDataViewMainWindow::SelectAllRows( bool on )
 {
-    if (GetRowCount() == 0) return;
-    
+    if (IsEmpty())
+        return;
+
     if (on)
     {
         m_selection.Clear();
-        size_t i;
-        for (i = 0; i < GetRowCount(); i++)
+        for (size_t i = 0; i < GetRowCount(); i++)
             m_selection.Add( i );
         Refresh();
     }
@@ -1180,7 +1179,7 @@ void wxDataViewMainWindow::SelectAllRows( bool on )
         size_t last_visible = GetLastVisibleRow();
         size_t i;
         for (i = 0; i < m_selection.GetCount(); i++)
-        {    
+        {
             size_t row = m_selection[i];
             if ((row >= first_visible) && (row <= last_visible))
                 RefreshRow( row );
@@ -1241,7 +1240,7 @@ void wxDataViewMainWindow::ReverseRowSelection( size_t row )
         m_selection.Add( row );
     else
         m_selection.Remove( row );
-    Refresh( row );
+    RefreshRow( row );
 }
 
 bool wxDataViewMainWindow::IsRowSelected( size_t row )
@@ -1253,7 +1252,7 @@ void wxDataViewMainWindow::RefreshRow( size_t row )
 {
     wxRect rect( 0, row*m_lineHeight, GetEndOfLastCol(), m_lineHeight );
     m_owner->CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
-    
+
     wxSize client_size = GetClientSize();
     wxRect client_rect( 0, 0, client_size.x, client_size.y );
     wxRect intersect_rect = client_rect.Intersect( rect );
@@ -1272,7 +1271,7 @@ void wxDataViewMainWindow::RefreshRows( size_t from, size_t to )
 
     wxRect rect( 0, from*m_lineHeight, GetEndOfLastCol(), (to-from+1) * m_lineHeight );
     m_owner->CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
-    
+
     wxSize client_size = GetClientSize();
     wxRect client_rect( 0, 0, client_size.x, client_size.y );
     wxRect intersect_rect = client_rect.Intersect( rect );
@@ -1283,11 +1282,12 @@ void wxDataViewMainWindow::RefreshRows( size_t from, size_t to )
 void wxDataViewMainWindow::RefreshRowsAfter( size_t firstRow )
 {
     size_t count = GetRowCount();
-    if (firstRow > count) return;
-    
+    if (firstRow > count)
+        return;
+
     wxRect rect( 0, firstRow*m_lineHeight, GetEndOfLastCol(), count * m_lineHeight );
     m_owner->CalcScrolledPosition( rect.x, rect.y, &rect.x, &rect.y );
-    
+
     wxSize client_size = GetClientSize();
     wxRect client_rect( 0, 0, client_size.x, client_size.y );
     wxRect intersect_rect = client_rect.Intersect( rect );
@@ -1297,7 +1297,7 @@ void wxDataViewMainWindow::RefreshRowsAfter( size_t firstRow )
 
 void wxDataViewMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& event)
 {
-    wxCHECK_RET( newCurrent < (size_t)GetRowCount(),
+    wxCHECK_RET( newCurrent < GetRowCount(),
                  _T("invalid item index in OnArrowChar()") );
 
     // if there is no selection, we cannot move it anywhere
@@ -1311,7 +1311,7 @@ void wxDataViewMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& even
     if ( event.ShiftDown() && !IsSingleSel() )
     {
         RefreshRow( oldCurrent );
-    
+
         ChangeCurrentRow( newCurrent );
 
         // select all the items between the old and the new one
@@ -1326,7 +1326,7 @@ void wxDataViewMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& even
     else // !shift
     {
         RefreshRow( oldCurrent );
-    
+
         // all previously selected items are unselected unless ctrl is held
         if ( !event.ControlDown() )
             SelectAllRows(false);
@@ -1361,7 +1361,7 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event )
         event.Skip();
         return;
     }
-    
+
     // don't use m_linesPerPage directly as it might not be computed yet
     const int pageSize = GetCountPerPage();
     wxCHECK_RET( pageSize, _T("should have non zero page size") );
@@ -1374,7 +1374,7 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event )
             break;
 
         case WXK_DOWN:
-            if ( m_currentRow < (size_t)GetRowCount() - 1 )
+            if ( m_currentRow < GetRowCount() - 1 )
                 OnArrowChar( m_currentRow + 1, event );
             break;
 
@@ -1449,7 +1449,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
     wxDataViewCell *cell = col->GetCell();
 
     size_t current = y / m_lineHeight;
-    
+
     if ((current > GetRowCount()) || (x > GetEndOfLastCol()))
     {
         // Unselect all if below the last row ?
@@ -1512,7 +1512,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
             // a double click, but as a simple click instead
             forceClick = true;
         }
-    } 
+    }
 
     if (event.LeftUp())
     {
@@ -1522,10 +1522,10 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
             SelectAllRows( false );
             SelectRow( m_lineSelectSingleOnUp, true );
         }
-        
+
         if (m_lastOnSame)
         {
-            if ((col == m_currentCol) & (current == m_currentRow) &&
+            if ((col == m_currentCol) && (current == m_currentRow) &&
                 (cell->GetMode() == wxDATAVIEW_CELL_EDITABLE) )
             {
                 m_renameTimer->Start( 100, true );
@@ -1534,7 +1534,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
 
         m_lastOnSame = false;
         m_lineSelectSingleOnUp = (size_t)-1;
-    } 
+    }
     else
     {
         // This is necessary, because after a DnD operation in
@@ -1560,7 +1560,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
 
         // notify cell about right click
         // cell->...
-        
+
         // Allow generation of context menu event
         event.Skip();
     }
@@ -1574,7 +1574,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
 #ifdef __WXMSW__
         SetFocus();
 #endif
-    
+
         m_lineBeforeLastClicked = m_lineLastClicked;
         m_lineLastClicked = current;
 
@@ -1632,10 +1632,10 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
             RefreshRow( oldCurrentRow );
 
         wxDataViewColumn *oldCurrentCol = m_currentCol;
-        
+
         // Update selection here...
         m_currentCol = col;
-    
+
         m_lastOnSame = !forceClick && ((col == oldCurrentCol) && (current == oldCurrentRow)) && oldWasSelected;
     }
 }
@@ -1643,20 +1643,20 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
 void wxDataViewMainWindow::OnSetFocus( wxFocusEvent &event )
 {
     m_hasFocus = true;
-    
+
     if (HasCurrentRow())
         Refresh();
-        
+
     event.Skip();
 }
 
 void wxDataViewMainWindow::OnKillFocus( wxFocusEvent &event )
 {
     m_hasFocus = false;
-    
+
     if (HasCurrentRow())
         Refresh();
-        
+
     event.Skip();
 }
 
@@ -1699,7 +1699,7 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
     m_headerArea = new wxDataViewHeaderWindow( this, wxID_ANY, wxDefaultPosition, wxSize(wxDefaultCoord,22) );
 #else
     m_headerArea = new wxDataViewHeaderWindow( this, wxID_ANY, wxDefaultPosition, wxSize(wxDefaultCoord,25) );
-#endif 
+#endif
 
     SetTargetWindow( m_clientArea );
 
@@ -1773,4 +1773,3 @@ bool wxDataViewCtrl::AppendColumn( wxDataViewColumn *col )
 
 #endif
     // wxUSE_DATAVIEWCTRL
-