X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/657a8a359826e46a7fc458216403f54deca34989..9c61c5b04b0b023eb9592bde5633c2111f1940fb:/src/common/datavcmn.cpp diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 57c2aaecd0..ddfbd8c7e6 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -309,7 +309,7 @@ wxDataViewIndexListModel::wxDataViewIndexListModel( unsigned int initial_size ) unsigned int i; for (i = 1; i < initial_size+1; i++) m_hash.Add( wxUIntToPtr(i) ); - m_lastIndex = initial_size + 1; + m_nextFreeID = initial_size + 1; } wxDataViewIndexListModel::~wxDataViewIndexListModel() @@ -327,7 +327,8 @@ void wxDataViewIndexListModel::Reset( unsigned int new_size ) unsigned int i; for (i = 1; i < new_size+1; i++) m_hash.Add( wxUIntToPtr(i) ); - m_lastIndex = new_size + 1; + + m_nextFreeID = new_size + 1; wxDataViewModel::Cleared(); } @@ -336,17 +337,22 @@ void wxDataViewIndexListModel::RowPrepended() { m_ordered = false; - unsigned int id = m_lastIndex++; + unsigned int id = m_nextFreeID; + m_nextFreeID++; + m_hash.Insert( wxUIntToPtr(id), 0 ); wxDataViewItem item( wxUIntToPtr(id) ); ItemAdded( wxDataViewItem(0), item ); + } void wxDataViewIndexListModel::RowInserted( unsigned int before ) { m_ordered = false; - unsigned int id = m_lastIndex++; + unsigned int id = m_nextFreeID; + m_nextFreeID++; + m_hash.Insert( wxUIntToPtr(id), before ); wxDataViewItem item( wxUIntToPtr(id) ); ItemAdded( wxDataViewItem(0), item ); @@ -354,7 +360,9 @@ void wxDataViewIndexListModel::RowInserted( unsigned int before ) void wxDataViewIndexListModel::RowAppended() { - unsigned int id = m_lastIndex++; + unsigned int id = m_nextFreeID; + m_nextFreeID++; + m_hash.Add( wxUIntToPtr(id) ); wxDataViewItem item( wxUIntToPtr(id) ); ItemAdded( wxDataViewItem(0), item ); @@ -402,10 +410,7 @@ void wxDataViewIndexListModel::RowValueChanged( unsigned int row, unsigned int c unsigned int wxDataViewIndexListModel::GetRow( const wxDataViewItem &item ) const { if (m_ordered) - { - unsigned int pos = wxPtrToUInt( item.GetID() ); - return pos-1; - } + return wxPtrToUInt(item.GetID())-1; // assert for not found return (unsigned int) m_hash.Index( item.GetID() ); @@ -429,8 +434,8 @@ int wxDataViewIndexListModel::Compare(const wxDataViewItem& item1, { if (m_ordered) { - unsigned int pos1 = wxPtrToUInt(item1.GetID()); - unsigned int pos2 = wxPtrToUInt(item2.GetID()); + 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; @@ -493,7 +498,7 @@ unsigned int wxDataViewIndexListModel::GetChildren( const wxDataViewItem &item, wxDataViewVirtualListModel::wxDataViewVirtualListModel( unsigned int initial_size ) { - m_lastIndex = initial_size-1; + m_size = initial_size; } wxDataViewVirtualListModel::~wxDataViewVirtualListModel() @@ -502,37 +507,37 @@ wxDataViewVirtualListModel::~wxDataViewVirtualListModel() void wxDataViewVirtualListModel::Reset( unsigned int new_size ) { - m_lastIndex = new_size-1; + m_size = new_size; wxDataViewModel::Cleared(); } void wxDataViewVirtualListModel::RowPrepended() { - m_lastIndex++; - wxDataViewItem item( NULL ); + m_size++; + wxDataViewItem item( wxUIntToPtr(1) ); ItemAdded( wxDataViewItem(0), item ); } void wxDataViewVirtualListModel::RowInserted( unsigned int before ) { - m_lastIndex++; - wxDataViewItem item( wxUIntToPtr(before) ); + m_size++; + wxDataViewItem item( wxUIntToPtr(before+1) ); ItemAdded( wxDataViewItem(0), item ); } void wxDataViewVirtualListModel::RowAppended() { - m_lastIndex++; - wxDataViewItem item( wxUIntToPtr(m_lastIndex) ); + m_size++; + wxDataViewItem item( wxUIntToPtr(m_size) ); ItemAdded( wxDataViewItem(0), item ); } void wxDataViewVirtualListModel::RowDeleted( unsigned int row ) { - wxDataViewItem item( wxUIntToPtr(row) ); + wxDataViewItem item( wxUIntToPtr(row+1) ); wxDataViewModel::ItemDeleted( wxDataViewItem(0), item ); - m_lastIndex++; + m_size--; } void wxDataViewVirtualListModel::RowsDeleted( const wxArrayInt &rows ) @@ -544,12 +549,12 @@ void wxDataViewVirtualListModel::RowsDeleted( const wxArrayInt &rows ) unsigned int i; for (i = 0; i < sorted.GetCount(); i++) { - wxDataViewItem item( wxUIntToPtr(sorted[i]) ); + wxDataViewItem item( wxUIntToPtr(sorted[i]+1) ); array.Add( item ); } wxDataViewModel::ItemsDeleted( wxDataViewItem(0), array ); - m_lastIndex -= rows.GetCount(); + m_size -= rows.GetCount(); } void wxDataViewVirtualListModel::RowChanged( unsigned int row ) @@ -564,12 +569,12 @@ void wxDataViewVirtualListModel::RowValueChanged( unsigned int row, unsigned int unsigned int wxDataViewVirtualListModel::GetRow( const wxDataViewItem &item ) const { - return wxPtrToUInt( item.GetID() ); + return wxPtrToUInt( item.GetID() ) -1; } wxDataViewItem wxDataViewVirtualListModel::GetItem( unsigned int row ) const { - return wxDataViewItem( wxUIntToPtr(row) ); + return wxDataViewItem( wxUIntToPtr(row+1) ); } bool wxDataViewVirtualListModel::HasDefaultCompare() const @@ -582,8 +587,8 @@ int wxDataViewVirtualListModel::Compare(const wxDataViewItem& item1, unsigned int WXUNUSED(column), bool ascending) const { - unsigned int pos1 = wxPtrToUInt(item1.GetID()); - unsigned int pos2 = wxPtrToUInt(item2.GetID()); + 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; @@ -681,13 +686,30 @@ public: bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect labelRect ) { + 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() ); + start_event.SetDataViewColumn( GetOwner() ); + start_event.SetModel( dv_ctrl->GetModel() ); + start_event.SetItem( item ); + start_event.SetEventObject( dv_ctrl ); + dv_ctrl->GetEventHandler()->ProcessEvent( start_event ); + if( !start_event.IsAllowed() ) + return false; + m_item = item; // remember for later unsigned int col = GetOwner()->GetModelColumn(); wxVariant value; - GetOwner()->GetOwner()->GetModel()->GetValue( value, item, col ); + dv_ctrl->GetModel()->GetValue( value, item, col ); + + m_editorCtrl = CreateEditorCtrl( dv_ctrl->GetMainWindow(), labelRect, value ); + + // there might be no editor control for the given item + if(!m_editorCtrl) + return false; - m_editorCtrl = CreateEditorCtrl( GetOwner()->GetOwner()->GetMainWindow(), labelRect, value ); (void) new wxKillRef( m_editorCtrl.get() ); wxDataViewEditorCtrlEvtHandler *handler = @@ -695,10 +717,6 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la m_editorCtrl->PushEventHandler( handler ); - // there might be no editor control for the given item - if (!m_editorCtrl) - return false; - #if defined(__WXGTK20__) && !defined(wxUSE_GENERICDATAVIEWCTRL) handler->SetFocusOnIdle(); #else @@ -706,18 +724,20 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la #endif // Now we should send Editing Started event - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, GetOwner()->GetOwner()->GetId() ); + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, dv_ctrl->GetId() ); event.SetDataViewColumn( GetOwner() ); - event.SetModel( GetOwner()->GetOwner()->GetModel() ); + event.SetModel( dv_ctrl->GetModel() ); event.SetItem( item ); - GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event ); + event.SetEventObject( dv_ctrl ); + dv_ctrl->GetEventHandler()->ProcessEvent( event ); return true; } void wxDataViewRendererBase::CancelEditing() { - if (!m_editorCtrl) return; + if (!m_editorCtrl) + return; GetOwner()->GetOwner()->GetMainWindow()->SetFocus(); @@ -727,12 +747,15 @@ void wxDataViewRendererBase::CancelEditing() bool wxDataViewRendererBase::FinishEditing() { - if (!m_editorCtrl) return true; + if (!m_editorCtrl) + return true; wxVariant value; GetValueFromEditorCtrl( m_editorCtrl, value ); - GetOwner()->GetOwner()->GetMainWindow()->SetFocus(); + wxDataViewCtrl* dv_ctrl = GetOwner()->GetOwner(); + + dv_ctrl->GetMainWindow()->SetFocus(); m_editorCtrl->Hide(); wxPendingDelete.Append( m_editorCtrl ); @@ -741,15 +764,16 @@ bool wxDataViewRendererBase::FinishEditing() return false; unsigned int col = GetOwner()->GetModelColumn(); - GetOwner()->GetOwner()->GetModel()->SetValue( value, m_item, col ); - GetOwner()->GetOwner()->GetModel()->ValueChanged( m_item, col ); + dv_ctrl->GetModel()->SetValue( value, m_item, col ); + dv_ctrl->GetModel()->ValueChanged( m_item, col ); // Now we should send Editing Done event - wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, GetOwner()->GetOwner()->GetId() ); + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, dv_ctrl->GetId() ); event.SetDataViewColumn( GetOwner() ); - event.SetModel( GetOwner()->GetOwner()->GetModel() ); + event.SetModel( dv_ctrl->GetModel() ); event.SetItem( m_item ); - GetOwner()->GetOwner()->GetEventHandler()->ProcessEvent( event ); + event.SetEventObject( dv_ctrl ); + dv_ctrl->GetEventHandler()->ProcessEvent( event ); return true; } @@ -1298,7 +1322,7 @@ bool wxDataViewSpinRenderer::GetValue( wxVariant &value ) const // wxDataViewChoiceRenderer // ------------------------------------- -#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXMAC__) +#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXOSX_CARBON__) wxDataViewChoiceRenderer::wxDataViewChoiceRenderer( const wxArrayString& choices, wxDataViewCellMode mode, int alignment ) : wxDataViewCustomRenderer(wxT("string"), mode, alignment )