X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1d156af3247c862e51a7c62f569a3fd302052a42..6ba718d7aee2f519d9146b90424ccec9e2243479:/src/common/datavcmn.cpp diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index b7ee97b28e..2c5621eb0c 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -3,7 +3,6 @@ // Purpose: wxDataViewCtrl base classes and common parts // Author: Robert Roebling // Created: 2006/02/20 -// RCS-ID: $Id$ // Copyright: (c) 2006, Robert Roebling // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -26,6 +25,7 @@ #include "wx/crt.h" #endif +#include "wx/datectrl.h" #include "wx/spinctrl.h" #include "wx/choice.h" #include "wx/imaglist.h" @@ -307,15 +307,6 @@ void wxDataViewModel::RemoveNotifier( wxDataViewModelNotifier *notifier ) int wxDataViewModel::Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, unsigned int column, bool ascending ) const { - // sort branches before leaves - bool item1_is_container = IsContainer(item1); - bool item2_is_container = IsContainer(item2); - - if (item1_is_container && !item2_is_container) - return 1; - if (item2_is_container && !item1_is_container) - return -1; - wxVariant value1,value2; GetValue( value1, item1, column ); GetValue( value2, item2, column ); @@ -450,15 +441,12 @@ void wxDataViewIndexListModel::RowDeleted( unsigned int row ) m_ordered = false; wxDataViewItem item( m_hash[row] ); - /* wxDataViewModel:: */ ItemDeleted( wxDataViewItem(0), item ); m_hash.RemoveAt( row ); + /* wxDataViewModel:: */ ItemDeleted( wxDataViewItem(0), item ); } void wxDataViewIndexListModel::RowsDeleted( const wxArrayInt &rows ) { - wxArrayInt sorted = rows; - sorted.Sort( my_sort ); - m_ordered = false; wxDataViewItemArray array; @@ -468,10 +456,13 @@ void wxDataViewIndexListModel::RowsDeleted( const wxArrayInt &rows ) wxDataViewItem item( m_hash[rows[i]] ); array.Add( item ); } - /* wxDataViewModel:: */ ItemsDeleted( wxDataViewItem(0), array ); + wxArrayInt sorted = rows; + sorted.Sort( my_sort ); for (i = 0; i < sorted.GetCount(); i++) m_hash.RemoveAt( sorted[i] ); + + /* wxDataViewModel:: */ ItemsDeleted( wxDataViewItem(0), array ); } void wxDataViewIndexListModel::RowChanged( unsigned int row ) @@ -499,33 +490,6 @@ wxDataViewItem wxDataViewIndexListModel::GetItem( unsigned int row ) const return wxDataViewItem( m_hash[row] ); } -bool wxDataViewIndexListModel::HasDefaultCompare() const -{ - return !m_ordered; -} - -int wxDataViewIndexListModel::Compare(const wxDataViewItem& item1, - const wxDataViewItem& item2, - unsigned int WXUNUSED(column), - bool ascending) const -{ - if (m_ordered) - { - unsigned int pos1 = wxPtrToUInt(item1.GetID()); // -1 not needed here - unsigned int pos2 = wxPtrToUInt(item2.GetID()); // -1 not needed here - - if (ascending) - return pos1 - pos2; - else - return pos2 - pos1; - } - - if (ascending) - return GetRow(item1) - GetRow(item2); - - return GetRow(item2) - GetRow(item1); -} - unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem &item, wxDataViewItemArray &children ) const { if (item.IsOk()) @@ -671,6 +635,8 @@ wxDataViewRendererBase::wxDataViewRendererBase( const wxString &varianttype, wxDataViewRendererBase::~wxDataViewRendererBase() { + if ( m_editorCtrl ) + DestroyEditControl(); } wxDataViewCtrl* wxDataViewRendererBase::GetView() const @@ -683,7 +649,7 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner(); // Before doing anything we send an event asking if editing of this item is really wanted. - wxDataViewEvent start_event( wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING, dv_ctrl->GetId() ); + wxDataViewEvent start_event( wxEVT_DATAVIEW_ITEM_START_EDITING, dv_ctrl->GetId() ); start_event.SetDataViewColumn( GetOwner() ); start_event.SetModel( dv_ctrl->GetModel() ); start_event.SetItem( item ); @@ -716,7 +682,7 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la #endif // Now we should send Editing Started event - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, dv_ctrl->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_EDITING_STARTED, dv_ctrl->GetId() ); event.SetDataViewColumn( GetOwner() ); event.SetModel( dv_ctrl->GetModel() ); event.SetItem( item ); @@ -739,6 +705,9 @@ void wxDataViewRendererBase::DestroyEditControl() wxPendingDelete.Append(handler); wxPendingDelete.Append(m_editorCtrl); + + // Ensure that DestroyEditControl() is not called again for this control. + m_editorCtrl.Release(); } void wxDataViewRendererBase::CancelEditing() @@ -759,15 +728,15 @@ bool wxDataViewRendererBase::FinishEditing() wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner(); - dv_ctrl->GetMainWindow()->SetFocus(); - DestroyEditControl(); + dv_ctrl->GetMainWindow()->SetFocus(); + bool isValid = Validate(value); unsigned int col = GetOwner()->GetModelColumn(); // Now we should send Editing Done event - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, dv_ctrl->GetId() ); + wxDataViewEvent event( wxEVT_DATAVIEW_ITEM_EDITING_DONE, dv_ctrl->GetId() ); event.SetDataViewColumn( GetOwner() ); event.SetModel( dv_ctrl->GetModel() ); event.SetItem( m_item ); @@ -806,6 +775,31 @@ void wxDataViewRendererBase::PrepareForItem(const wxDataViewModel *model, // wxDataViewCustomRendererBase // ---------------------------------------------------------------------------- +bool wxDataViewCustomRendererBase::ActivateCell(const wxRect& cell, + wxDataViewModel *model, + const wxDataViewItem & item, + unsigned int col, + const wxMouseEvent* mouseEvent) +{ + // Compatibility code + if ( mouseEvent ) + return LeftClick(mouseEvent->GetPosition(), cell, model, item, col); + else + return Activate(cell, model, item, col); +} + +void wxDataViewCustomRendererBase::RenderBackground(wxDC* dc, const wxRect& rect) +{ + if ( !m_attr.HasBackgroundColour() ) + return; + + const wxColour& colour = m_attr.GetBackgroundColour(); + wxDCPenChanger changePen(*dc, colour); + wxDCBrushChanger changeBrush(*dc, colour); + + dc->DrawRectangle(rect); +} + void wxDataViewCustomRendererBase::WXCallRender(wxRect rectCell, wxDC *dc, int state) { @@ -1390,36 +1384,41 @@ wxDataViewCtrlBase::InsertColumn( unsigned int WXUNUSED(pos), wxDataViewColumn * return true; } +void wxDataViewCtrlBase::StartEditor(const wxDataViewItem& item, unsigned int column) +{ + EditItem(item, GetColumn(column)); +} + // --------------------------------------------------------- // wxDataViewEvent // --------------------------------------------------------- IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent,wxNotifyEvent) -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_SELECTION_CHANGED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_ACTIVATED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_COLLAPSING, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_COLLAPSED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_EXPANDING, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_EXPANDED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_EDITING_STARTED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_START_EDITING, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_EDITING_DONE, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_COLUMN_HEADER_CLICK, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_COLUMN_SORTED, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_COLUMN_REORDERED, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_CACHE_HINT, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_CACHE_HINT, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE, wxDataViewEvent ); -wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_DROP, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_BEGIN_DRAG, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE, wxDataViewEvent ); +wxDEFINE_EVENT( wxEVT_DATAVIEW_ITEM_DROP, wxDataViewEvent ); @@ -1609,6 +1608,64 @@ bool wxDataViewChoiceByIndexRenderer::GetValue( wxVariant &value ) const #endif +// --------------------------------------------------------- +// wxDataViewDateRenderer +// --------------------------------------------------------- + +#if (defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXGTK__)) && wxUSE_DATEPICKCTRL + +wxDataViewDateRenderer::wxDataViewDateRenderer(const wxString& varianttype, + wxDataViewCellMode mode, int align) + : wxDataViewCustomRenderer(varianttype, mode, align) +{ +} + +wxWindow * +wxDataViewDateRenderer::CreateEditorCtrl(wxWindow *parent, wxRect labelRect, const wxVariant& value) +{ + return new wxDatePickerCtrl + ( + parent, + wxID_ANY, + value.GetDateTime(), + labelRect.GetTopLeft(), + labelRect.GetSize() + ); +} + +bool wxDataViewDateRenderer::GetValueFromEditorCtrl(wxWindow *editor, wxVariant& value) +{ + wxDatePickerCtrl *ctrl = static_cast(editor); + value = ctrl->GetValue(); + return true; +} + +bool wxDataViewDateRenderer::SetValue(const wxVariant& value) +{ + m_date = value.GetDateTime(); + return true; +} + +bool wxDataViewDateRenderer::GetValue(wxVariant& value) const +{ + value = m_date; + return true; +} + +bool wxDataViewDateRenderer::Render(wxRect cell, wxDC* dc, int state) +{ + wxString tmp = m_date.FormatDate(); + RenderText( tmp, 0, cell, dc, state ); + return true; +} + +wxSize wxDataViewDateRenderer::GetSize() const +{ + return GetTextExtent(m_date.FormatDate()); +} + +#endif // (defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXGTK__)) && wxUSE_DATEPICKCTRL + //----------------------------------------------------------------------------- // wxDataViewListStore //----------------------------------------------------------------------------- @@ -1647,12 +1704,17 @@ unsigned int wxDataViewListStore::GetColumnCount() const return m_cols.GetCount(); } +unsigned int wxDataViewListStore::GetItemCount() const +{ + return m_data.size(); +} + wxString wxDataViewListStore::GetColumnType( unsigned int pos ) const { return m_cols[pos]; } -void wxDataViewListStore::AppendItem( const wxVector &values, wxClientData *data ) +void wxDataViewListStore::AppendItem( const wxVector &values, wxUIntPtr data ) { wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data ); line->m_values = values; @@ -1661,7 +1723,7 @@ void wxDataViewListStore::AppendItem( const wxVector &values, wxClien RowAppended(); } -void wxDataViewListStore::PrependItem( const wxVector &values, wxClientData *data ) +void wxDataViewListStore::PrependItem( const wxVector &values, wxUIntPtr data ) { wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data ); line->m_values = values; @@ -1671,7 +1733,7 @@ void wxDataViewListStore::PrependItem( const wxVector &values, wxClie } void wxDataViewListStore::InsertItem( unsigned int row, const wxVector &values, - wxClientData *data ) + wxUIntPtr data ) { wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data ); line->m_values = values; @@ -1703,6 +1765,22 @@ void wxDataViewListStore::DeleteAllItems() Reset( 0 ); } +void wxDataViewListStore::SetItemData( const wxDataViewItem& item, wxUIntPtr data ) +{ + wxDataViewListStoreLine* line = m_data[GetRow(item)]; + if (!line) return; + + line->SetData( data ); +} + +wxUIntPtr wxDataViewListStore::GetItemData( const wxDataViewItem& item ) const +{ + wxDataViewListStoreLine* line = m_data[GetRow(item)]; + if (!line) return static_cast(NULL); + + return line->GetData(); +} + void wxDataViewListStore::GetValueByRow( wxVariant &value, unsigned int row, unsigned int col ) const { wxDataViewListStoreLine *line = m_data[row]; @@ -2105,10 +2183,7 @@ void wxDataViewTreeStore::DeleteItem( const wxDataViewItem& item ) wxDataViewTreeStoreContainerNode *parent_node = FindContainerNode( parent_item ); if (!parent_node) return; - wxDataViewTreeStoreContainerNode *node = FindContainerNode( item ); - if (!node) return; - - parent_node->GetChildren().DeleteObject( node ); + parent_node->GetChildren().DeleteObject( FindNode(item) ); } void wxDataViewTreeStore::DeleteChildren( const wxDataViewItem& item )