X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4cef387341f9876ba6496507e6a78cf8b0f6654e..07890fbeb5e65f242e8632ed957c54e188779af2:/src/generic/datavgen.cpp?ds=sidebyside diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 73b8bbc920..9b6c2759cb 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -716,9 +716,15 @@ bool wxDataViewTextRenderer::HasEditorCtrl() const wxControl* wxDataViewTextRenderer::CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value ) { - return new wxTextCtrl( parent, wxID_ANY, value, - wxPoint(labelRect.x,labelRect.y), - wxSize(labelRect.width,labelRect.height) ); + wxTextCtrl* ctrl = new wxTextCtrl( parent, wxID_ANY, value, + wxPoint(labelRect.x,labelRect.y), + wxSize(labelRect.width,labelRect.height) ); + + // select the text in the control an place the cursor at the end + ctrl->SetInsertionPointEnd(); + ctrl->SelectAll(); + + return ctrl; } bool wxDataViewTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVariant &value ) @@ -1145,9 +1151,15 @@ wxControl* wxDataViewIconTextRenderer::CreateEditorCtrl(wxWindow *parent, wxRect labelRect.width -= w; } - return new wxTextCtrl( parent, wxID_ANY, text, - wxPoint(labelRect.x,labelRect.y), - wxSize(labelRect.width,labelRect.height) ); + wxTextCtrl* ctrl = new wxTextCtrl( parent, wxID_ANY, text, + wxPoint(labelRect.x,labelRect.y), + wxSize(labelRect.width,labelRect.height) ); + + // select the text in the control an place the cursor at the end + ctrl->SetInsertionPointEnd(); + ctrl->SelectAll(); + + return ctrl; } bool wxDataViewIconTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVariant& value ) @@ -1664,6 +1676,12 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxMin( (int)( GetLineAt( wxMax(0,update.y+update.height) ) - item_start + 1), (int)(GetRowCount( ) - item_start)); unsigned int item_last = item_start + item_count; + // Get the parent of DataViewCtrl + wxWindow *parent = GetParent()->GetParent(); + wxDataViewEvent cache_event(wxEVT_COMMAND_DATAVIEW_CACHE_HINT, parent->GetId()); + cache_event.SetEventObject(GetParent()); + cache_event.SetCache(item_start, item_last - 1); + parent->ProcessWindowEvent(cache_event); // compute which columns needs to be redrawn unsigned int cols = GetOwner()->GetColumnCount(); @@ -1808,7 +1826,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) } else { - dataitem = wxDataViewItem( wxUIntToPtr(item) ); + dataitem = wxDataViewItem( wxUIntToPtr(item+1) ); } model->GetValue( value, dataitem, col->GetModelColumn()); @@ -1939,42 +1957,10 @@ void wxDataViewMainWindow::OnRenameTimer() wxSafeYield(); } - int xpos = 0; - unsigned int cols = GetOwner()->GetColumnCount(); - unsigned int i; - for (i = 0; i < cols; i++) - { - wxDataViewColumn *c = GetOwner()->GetColumnAt( i ); - if (c->IsHidden()) - continue; // skip it! - - if (c == m_currentCol) - break; - xpos += c->GetWidth(); - } - - // we have to take an expander column into account and compute its indentation - // to get the editor at the correct x position where the actual text is - int indent = 0; - if (!IsVirtualList() && GetOwner()->GetExpanderColumn() == m_currentCol) - { - wxDataViewTreeNode* node = GetTreeNodeByRow(m_currentRow); - indent = GetOwner()->GetIndent() * node->GetIndentLevel(); - indent = indent + m_lineHeight; - - if(!node->HasChildren()) - delete node; - } - - wxRect labelRect( xpos + indent, - GetLineStart( m_currentRow ), - m_currentCol->GetWidth() - indent, - GetLineHeight( m_currentRow ) ); + wxDataViewItem item = GetItemByRow( m_currentRow ); - GetOwner()->CalcScrolledPosition( labelRect.x, labelRect.y, - &labelRect.x, &labelRect.y); + wxRect labelRect = GetItemRect(item, m_currentCol); - wxDataViewItem item = GetItemByRow( m_currentRow ); m_currentCol->GetRenderer()->StartEditing( item, labelRect ); } @@ -2048,9 +2034,11 @@ bool Walker( wxDataViewTreeNode * node, DoJob & func ) bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxDataViewItem & item) { - if (!m_root) + if (IsVirtualList()) { - m_count++; + wxDataViewVirtualListModel *list_model = + (wxDataViewVirtualListModel*) GetOwner()->GetModel(); + m_count = list_model->GetCount(); UpdateDisplay(); return true; } @@ -2086,14 +2074,18 @@ bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxData static void DestroyTreeHelper( wxDataViewTreeNode * node); bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent, - const wxDataViewItem& item) + const wxDataViewItem& item) { - if (!m_root) + if (IsVirtualList()) { - m_count--; + wxDataViewVirtualListModel *list_model = + (wxDataViewVirtualListModel*) GetOwner()->GetModel(); + m_count = list_model->GetCount(); + if( m_currentRow > GetRowCount() ) m_currentRow = m_count - 1; + // TODO: why empty the entire selection? m_selection.Empty(); UpdateDisplay(); @@ -2506,7 +2498,7 @@ void wxDataViewMainWindow::RefreshRowsAfter( unsigned int firstRow ) void wxDataViewMainWindow::OnArrowChar(unsigned int newCurrent, const wxKeyEvent& event) { wxCHECK_RET( newCurrent < GetRowCount(), - _T("invalid item index in OnArrowChar()") ); + wxT("invalid item index in OnArrowChar()") ); // if there is no selection, we cannot move it anywhere if (!HasCurrentRow()) @@ -2797,9 +2789,9 @@ private: wxDataViewItem wxDataViewMainWindow::GetItemByRow(unsigned int row) const { - if (!m_root) + if (IsVirtualList()) { - return wxDataViewItem( wxUIntToPtr(row) ); + return wxDataViewItem( wxUIntToPtr(row+1) ); } else { @@ -3200,7 +3192,7 @@ wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, { wxDataViewTreeNode* node = GetTreeNodeByRow(row); indent = GetOwner()->GetIndent() * node->GetIndentLevel(); - indent = indent + m_lineHeight; // use m_lineHeight as the width of the expander + indent = indent + m_lineHeight; // use m_lineHeight as the width of the expander if(!node->HasChildren()) delete node; @@ -3219,15 +3211,12 @@ wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, int wxDataViewMainWindow::RecalculateCount() { - if (!m_root) + if (IsVirtualList()) { - wxDataViewIndexListModel *list_model = - (wxDataViewIndexListModel*) GetOwner()->GetModel(); -#ifndef __WXMAC__ - return list_model->GetLastIndex() + 1; -#else - return list_model->GetLastIndex() - 1; -#endif + wxDataViewVirtualListModel *list_model = + (wxDataViewVirtualListModel*) GetOwner()->GetModel(); + + return list_model->GetCount(); } else { @@ -3292,9 +3281,9 @@ int wxDataViewMainWindow::GetRowByItem(const wxDataViewItem & item) const if( model == NULL ) return -1; - if (!m_root) + if (IsVirtualList()) { - return wxPtrToUInt( item.GetID() ); + return wxPtrToUInt( item.GetID() ) -1; } else { @@ -3409,16 +3398,15 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) // don't use m_linesPerPage directly as it might not be computed yet const int pageSize = GetCountPerPage(); - wxCHECK_RET( pageSize, _T("should have non zero page size") ); + wxCHECK_RET( pageSize, wxT("should have non zero page size") ); switch ( event.GetKeyCode() ) { case WXK_RETURN: - { - if (m_currentRow >= 0) { wxWindow *parent = GetParent(); - wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, parent->GetId()); + wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, + parent->GetId()); le.SetItem( GetItemByRow(m_currentRow) ); le.SetEventObject(parent); le.SetModel(GetOwner()->GetModel()); @@ -3426,7 +3414,7 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) parent->GetEventHandler()->ProcessEvent(le); } break; - } + case WXK_UP: if ( m_currentRow > 0 ) OnArrowChar( m_currentRow - 1, event ); @@ -3446,14 +3434,17 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) if (!node) break; - if (node->HasChildren()) + if (node->HasChildren() && node->IsOpen()) { Collapse(m_currentRow); } - else + else // if the node is already closed we move the selection to its parent { wxDataViewTreeNode *parent_node = node->GetParent(); - delete node; + + if(!node->HasChildren()) + delete node; + if (parent_node) { int parent = GetRowByItem( parent_node->GetItem() ); @@ -3463,6 +3454,7 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) SelectRow( row, false); SelectRow( parent, true ); ChangeCurrentRow( parent ); + GetOwner()->EnsureVisible( parent, -1 ); SendSelectionChangedEvent( parent_node->GetItem() ); } } @@ -3479,6 +3471,7 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) SelectRow( row, false ); SelectRow( row + 1, true ); ChangeCurrentRow( row + 1 ); + GetOwner()->EnsureVisible( row + 1, -1 ); SendSelectionChangedEvent( GetItemByRow(row+1) ); } break; @@ -3517,6 +3510,16 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) } break; + case WXK_F2: + { + if(m_selection.size() == 1) + { + // TODO: we need to revise that when we have a concept for a 'current column' + GetOwner()->StartEditor(GetItemByRow(m_selection[0]), 0); + } + } + break; + default: event.Skip(); } @@ -3760,7 +3763,9 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) SelectRow(m_currentRow,true); SendSelectionChangedEvent(GetItemByRow( m_currentRow ) ); } - + } + else if (event.RightUp()) + { wxVariant value; model->GetValue( value, item, col->GetModelColumn() ); wxWindow *parent = GetParent(); @@ -3840,7 +3845,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event ) else // !ctrl, !shift { // test in the enclosing if should make it impossible - wxFAIL_MSG( _T("how did we get here?") ); + wxFAIL_MSG( wxT("how did we get here?") ); } }