// Purpose: Generic wxTreeListCtrl implementation.
// Author: Vadim Zeitlin
// Created: 2011-08-19
-// RCS-ID: $Id: wxhead.cpp,v 1.11 2010-04-22 12:44:51 zeitlin Exp $
+// RCS-ID: $Id$
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
}
// Event handlers toggling the items checkbox if it was clicked.
- virtual bool Activate(const wxRect& WXUNUSED(cell),
- wxDataViewModel* model,
- const wxDataViewItem& item,
- unsigned int WXUNUSED(col))
+ virtual bool ActivateCell(const wxRect& WXUNUSED(cell),
+ wxDataViewModel *model,
+ const wxDataViewItem & item,
+ unsigned int WXUNUSED(col),
+ const wxMouseEvent *mouseEvent)
{
- static_cast<wxTreeListModel*>(model)->ToggleItem(item);
- return true;
- }
-
- virtual bool LeftClick(const wxPoint& pos,
- const wxRect& WXUNUSED(cell),
- wxDataViewModel* model,
- const wxDataViewItem& item,
- unsigned int WXUNUSED(col))
- {
- if ( !wxRect(GetCheckSize()).Contains(pos) )
- return false;
+ if ( mouseEvent )
+ {
+ if ( !wxRect(GetCheckSize()).Contains(mouseEvent->GetPosition()) )
+ return false;
+ }
static_cast<wxTreeListModel*>(model)->ToggleItem(item);
return true;
wxScopedPtr<Node>
newItem(new Node(parent, text, imageClosed, imageOpened, data));
+ // FIXME-VC6: This compiler refuses to compare "Node* previous" with
+ // wxTLI_XXX without some help.
+ const wxTreeListItem previousItem(previous);
+
// If we have no children at all, then inserting as last child is the same
// as inserting as the first one so check for it here too.
- if ( previous == wxTLI_FIRST ||
- (previous == wxTLI_LAST && !parent->GetChild()) )
+ if ( previousItem == wxTLI_FIRST ||
+ (previousItem == wxTLI_LAST && !parent->GetChild()) )
{
parent->InsertChild(newItem.get());
}
else // Not the first item, find the previous one.
{
- if ( previous == wxTLI_LAST )
+ if ( previousItem == wxTLI_LAST )
{
previous = parent->GetChild();
// empty string we can return reference to.
wxCHECK_MSG( item, m_root->m_text, "Invalid item" );
- return col == 0 ? item->m_text : item->GetColumnText(col);
+ // Notice that asking for the text of a column of an item that doesn't have
+ // any column texts is not an error so we simply return an empty string in
+ // this case.
+ return col == 0 ? item->m_text
+ : item->HasColumnsTexts() ? item->GetColumnText(col)
+ : m_root->m_text;
}
void wxTreeListModel::SetItemText(Node* item, unsigned col, const wxString& text)
}
m_view = new wxDataViewCtrl;
+ long styleDataView = HasFlag(wxTL_MULTIPLE) ? wxDV_MULTIPLE
+ : wxDV_SINGLE;
+ if ( HasFlag(wxTL_NO_HEADER) )
+ styleDataView |= wxDV_NO_HEADER;
+
if ( !m_view->Create(this, wxID_ANY,
wxPoint(0, 0), GetClientSize(),
- HasFlag(wxTL_MULTIPLE) ? wxDV_MULTIPLE
- : wxDV_SINGLE) )
+ styleDataView) )
{
delete m_view;
m_view = NULL;
wxDataViewColumn* const column = m_view->GetColumn(col);
wxCHECK_RET( column, "No such column?" );
- return column->SetWidth(width);
+ column->SetWidth(width);
}
int wxTreeListCtrl::GetColumnWidth(unsigned col) const
const wxRect rect = GetClientRect();
m_view->SetSize(rect);
+#ifdef wxHAS_GENERIC_DATAVIEWCTRL
+ // The generic implementation doesn't refresh itself immediately which
+ // is annoying during "live resizing", so do it forcefully here to
+ // ensure that the items are re-laid out and the focus rectangle is
+ // redrawn correctly (instead of leaving traces) while our size is
+ // being changed.
+ wxWindow* const view = GetView();
+ view->Refresh();
+ view->Update();
+#endif // wxHAS_GENERIC_DATAVIEWCTRL
+
// Resize the first column to take the remaining available space.
const unsigned numColumns = GetColumnCount();
if ( !numColumns )
// wxTreeListEvent implementation
// ============================================================================
-wxIMPLEMENT_ABSTRACT_CLASS(wxTreeListEvent, wxNotifyEvent)
+wxIMPLEMENT_DYNAMIC_CLASS(wxTreeListEvent, wxNotifyEvent)
#define wxDEFINE_TREELIST_EVENT(name) \
wxDEFINE_EVENT(wxEVT_COMMAND_TREELIST_##name, wxTreeListEvent)