]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/datavgen.cpp
Don't always use the Cairo context for wxGCDC(wxMemoryDC). If a Cairo context is...
[wxWidgets.git] / src / generic / datavgen.cpp
index 46ea2141e1bbaae70e8e8796aadf231958aaf5cc..f9a43c707502835375278ccf31464040c66a38a6 100644 (file)
@@ -146,6 +146,30 @@ void wxDataViewColumn::UpdateDisplay()
     }
 }
 
+void wxDataViewColumn::SetSortOrder(bool ascending)
+{
+    if ( !m_owner )
+        return;
+
+    // First unset the old sort column if any.
+    int oldSortKey = m_owner->GetSortingColumnIndex();
+    if ( oldSortKey != wxNOT_FOUND )
+    {
+        m_owner->GetColumn(oldSortKey)->UnsetAsSortKey();
+    }
+
+    // Now set this one as the new sort column.
+    const int idx = m_owner->GetColumnIndex(this);
+    m_owner->SetSortingColumnIndex(idx);
+
+    m_sort = true;
+    m_sortAscending = ascending;
+
+    // Call this directly instead of using UpdateDisplay() as we already have
+    // the column index, no need to look it up again.
+    m_owner->OnColumnChange(idx);
+}
+
 //-----------------------------------------------------------------------------
 // wxDataViewHeaderWindow
 //-----------------------------------------------------------------------------
@@ -221,16 +245,7 @@ private:
         }
         else // not using this column for sorting yet
         {
-            // first unset the old sort column if any
-            int oldSortKey = owner->GetSortingColumnIndex();
-            if ( oldSortKey != wxNOT_FOUND )
-            {
-                owner->GetColumn(oldSortKey)->UnsetAsSortKey();
-                owner->OnColumnChange(oldSortKey);
-            }
-
-            owner->SetSortingColumnIndex(idx);
-            col->SetAsSortKey();
+            col->SetSortOrder(true);
         }
 
         wxDataViewModel * const model = owner->GetModel();
@@ -3540,6 +3555,37 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
         }
         xpos += c->GetWidth();
     }
+
+    wxDataViewModel* const model = GetModel();
+
+    const unsigned int current = GetLineAt( y );
+    const wxDataViewItem item = GetItemByRow(current);
+
+    // Handle right clicking here, before everything else as context menu
+    // events should be sent even when we click outside of any item, unlike all
+    // the other ones.
+    if (event.RightUp())
+    {
+        wxWindow *parent = GetParent();
+        wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, parent->GetId());
+        le.SetEventObject(parent);
+        le.SetModel(model);
+
+        if ( item.IsOk() && col )
+        {
+            le.SetItem( item );
+            le.SetColumn( col->GetModelColumn() );
+            le.SetDataViewColumn( col );
+
+            wxVariant value;
+            model->GetValue( value, item, col->GetModelColumn() );
+            le.SetValue(value);
+        }
+
+        parent->ProcessWindowEvent(le);
+        return;
+    }
+
     if (!col)
     {
         event.Skip();
@@ -3547,7 +3593,6 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
     }
 
     wxDataViewRenderer *cell = col->GetRenderer();
-    unsigned int current = GetLineAt( y );
     if ((current >= GetRowCount()) || (x > GetEndOfLastCol()))
     {
         // Unselect all if below the last row ?
@@ -3610,8 +3655,6 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
         }
     }
 
-    wxDataViewModel *model = GetModel();
-
 #if wxUSE_DRAG_AND_DROP
     if (event.Dragging())
     {
@@ -3633,12 +3676,12 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
             m_owner->CalcUnscrolledPosition( m_dragStart.x, m_dragStart.y,
                                              &m_dragStart.x, &m_dragStart.y );
             unsigned int drag_item_row = GetLineAt( m_dragStart.y );
-            wxDataViewItem item = GetItemByRow( drag_item_row );
+            wxDataViewItem itemDragged = GetItemByRow( drag_item_row );
 
             // Notify cell about drag
             wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG, m_owner->GetId() );
             event.SetEventObject( m_owner );
-            event.SetItem( item );
+            event.SetItem( itemDragged );
             event.SetModel( model );
             if (!m_owner->HandleWindowEvent( event ))
                 return;
@@ -3671,7 +3714,6 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
         m_lastOnSame = false;
     }
 
-    wxDataViewItem item = GetItemByRow(current);
     bool ignore_other_columns =
         ((expander != col) &&
         (model->IsContainer(item)) &&
@@ -3771,20 +3813,6 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
             SendSelectionChangedEvent(GetItemByRow( m_currentRow ) );
         }
     }
-    else if (event.RightUp())
-    {
-        wxVariant value;
-        model->GetValue( value, item, col->GetModelColumn() );
-        wxWindow *parent = GetParent();
-        wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, parent->GetId());
-        le.SetItem( item );
-        le.SetColumn( col->GetModelColumn() );
-        le.SetDataViewColumn( col );
-        le.SetEventObject(parent);
-        le.SetModel(GetModel());
-        le.SetValue(value);
-        parent->ProcessWindowEvent(le);
-    }
     else if (event.MiddleDown())
     {
     }