// For the generic implementation, both the leaf nodes and the nodes are sorted for
// fast search when needed
static wxDataViewModel* g_model;
-static int g_column = -2;
+
+// The column is either the index of the column to be used for sorting or one
+// of the special values in this enum:
+enum
+{
+ // Sort when we're thawed later.
+ SortColumn_OnThaw = -3,
+
+ // Don't sort at all.
+ SortColumn_None = -2,
+
+ // Sort using the model default sort order.
+ SortColumn_Default = -1
+};
+
+static int g_column = SortColumn_None;
static bool g_asending = true;
// ----------------------------------------------------------------------------
UpdateDisplay();
}
+ // Override the base class method to resort if needed, i.e. if
+ // SortPrepare() was called -- and ignored -- while we were frozen.
+ virtual void DoThaw()
+ {
+ if ( g_column == SortColumn_OnThaw )
+ {
+ Resort();
+ g_column = SortColumn_None;
+ }
+
+ wxWindow::DoThaw();
+ }
+
void SortPrepare()
{
g_model = GetModel();
+
+ // Avoid sorting while the window is frozen, this allows to quickly add
+ // many items without resorting after each addition and only resort
+ // them all at once when the window is finally thawed, see above.
+ if ( IsFrozen() )
+ {
+ g_column = SortColumn_OnThaw;
+ return;
+ }
+
wxDataViewColumn* col = GetOwner()->GetSortingColumn();
if( !col )
{
if (g_model->HasDefaultCompare())
- g_column = -1;
+ g_column = SortColumn_Default;
else
- g_column = -2;
+ g_column = SortColumn_None;
g_asending = true;
return;
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)
+ // Check if we clicked outside the item area.
+ if ((current >= GetRowCount()) || !col)
{
+ // Follow Windows convention here: clicking either left or right (but
+ // not middle) button clears the existing selection.
+ if (m_owner && (event.LeftDown() || event.RightDown()))
+ {
+ if (!GetSelections().empty())
+ {
+ m_owner->UnselectAll();
+ SendSelectionChangedEvent(wxDataViewItem());
+ }
+ }
event.Skip();
return;
}
wxDataViewRenderer *cell = col->GetRenderer();
- if ((current >= GetRowCount()) || (x > GetEndOfLastCol()))
- {
- // Unselect all if below the last row ?
- event.Skip();
- return;
- }
-
wxDataViewColumn* const
expander = GetExpanderColumnOrFirstOne(GetOwner());