#if defined(__WXGTK20__)
// for testing
- // #define wxUSE_GENERICDATAVIEWCTRL 1
+ #define wxUSE_GENERICDATAVIEWCTRL 1
#elif defined(__WXMAC__)
#else
#define wxUSE_GENERICDATAVIEWCTRL 1
virtual bool DeleteColumn( unsigned int pos );
virtual bool ClearColumns();
- virtual wxDataViewColumn* GetColumn( unsigned int pos );
+ virtual wxDataViewColumn* GetColumn( unsigned int pos ) const;
void SetExpanderColumn( unsigned int col )
{ m_expander_column = col ; DoSetExpanderColumn(); }
int GetIndent() const
{ return m_indent; }
- virtual wxDataViewItem GetSelection() = 0;
+ virtual wxDataViewItem GetSelection() const = 0;
virtual int GetSelections( wxDataViewItemArray & sel ) const = 0;
virtual void SetSelections( const wxDataViewItemArray & sel ) = 0;
virtual void Select( const wxDataViewItem & item ) = 0;
virtual void UnselectAll() = 0;
virtual void EnsureVisible( const wxDataViewItem & item,
- wxDataViewColumn *column = NULL ) = 0;
-
- virtual void HitTest( const wxPoint &point,
- wxDataViewItem &item, unsigned int &column ) const = 0;
- virtual wxRect GetItemRect( const wxDataViewItem &item,
- unsigned int column ) const = 0;
+ const wxDataViewColumn *column = NULL ) = 0;
+ virtual void HitTest( const wxPoint & point, wxDataViewItem &item, wxDataViewColumn* column ) const = 0;
+ virtual wxRect GetItemRect( const wxDataViewItem & item, const wxDataViewColumn *column = NULL ) const = 0;
protected:
virtual void DoSetExpanderColumn() = 0 ;
virtual void DoSetExpanderColumn();
virtual void DoSetIndent();
- virtual wxDataViewItem GetSelection();
+ virtual wxDataViewItem GetSelection() const;
virtual int GetSelections( wxDataViewItemArray & sel ) const;
virtual void SetSelections( const wxDataViewItemArray & sel );
virtual void Select( const wxDataViewItem & item );
virtual void UnselectAll();
virtual void EnsureVisible( const wxDataViewItem & item,
- wxDataViewColumn *column = NULL );
- virtual void HitTest( const wxPoint & point, wxDataViewItem & item, unsigned int & column ) const;
- virtual wxRect GetItemRect( const wxDataViewItem & item, unsigned int column ) const;
+ const wxDataViewColumn *column = NULL );
+ virtual void HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* column ) const;
+ virtual wxRect GetItemRect( const wxDataViewItem & item, const wxDataViewColumn *column = NULL ) const;
protected:
virtual int GetSelections( wxArrayInt & sel ) const;
virtual void SelectRange( int from, int to );
virtual void UnselectRange( int from, int to );
- virtual void EnsureVisible( int row );
+ virtual void EnsureVisible( int row, int column );
virtual wxDataViewItem GetItemByRow( unsigned int row ) const;
virtual int GetRowByItem( const wxDataViewItem & item ) const;
MyMusicModelNode *node = (MyMusicModelNode*) item.GetID();
switch (col)
{
- case 0: node->m_title = variant.GetString(); return true;
- case 1: node->m_artist = variant.GetString(); return true;
- case 2: node->m_year = variant.GetString(); return true;
+ case 0: node->m_title = variant.GetString(); break;
+ case 1: node->m_artist = variant.GetString(); break;
+ case 2: node->m_year = variant.GetString(); break;
default: wxLogError( "MyMusicModel::SetValue: wrong column" );
}
- return false;
}
virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const
wxDataViewCtrl* m_listCtrl;
wxObjectDataPtr<MyListModel> m_list_model;
+
+ wxDataViewColumn * m_col;
wxTextCtrl * m_log;
wxLog *m_logOld;
wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
{
m_log = NULL;
+ m_col = NULL;
SetIcon(wxICON(sample));
m_listCtrl->AssociateModel( m_list_model.get() );
m_listCtrl->AppendTextColumn( "editable string", 0, wxDATAVIEW_CELL_EDITABLE, 120 );
- m_listCtrl->AppendTextColumn( "index", 1, wxDATAVIEW_CELL_INERT, 120 );
+ m_col = m_listCtrl->AppendTextColumn( "index", 1, wxDATAVIEW_CELL_INERT, 120 );
data_sizer->Add( m_listCtrl, 2, wxGROW );
void MyFrame::OnGoto( wxCommandEvent &event)
{
wxDataViewItem item = m_list_model->GetItem( 50 );
- m_listCtrl->EnsureVisible(item);
+ m_listCtrl->EnsureVisible(item,m_col);
}
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
void OnRenameTimer();
void ScrollWindow( int dx, int dy, const wxRect *rect = NULL );
- void ScrollTo( int rows );
+ void ScrollTo( int rows, int column );
bool HasCurrentRow() { return m_currentRow != (unsigned int)-1; }
void ChangeCurrentRow( unsigned int row );
unsigned int GetLastVisibleRow();
unsigned int GetRowCount() ;
- wxDataViewItem GetSelection();
+ wxDataViewItem GetSelection() const;
wxDataViewSelection GetSelections(){ return m_selection; }
void SetSelections( const wxDataViewSelection & sel ) { m_selection = sel; UpdateDisplay(); }
void Select( const wxArrayInt& aSelections );
wxRect GetLineRect( unsigned int row ) const;
//Some useful functions for row and item mapping
- wxDataViewItem GetItemByRow( unsigned int row );
+ wxDataViewItem GetItemByRow( unsigned int row ) const;
int GetRowByItem( const wxDataViewItem & item );
//Methods for building the mapping tree
void BuildTree( wxDataViewModel * model );
void DestroyTree();
- void HitTest( const wxPoint & point, wxDataViewItem & item, unsigned int & column );
- wxRect GetItemRect( const wxDataViewItem & item, unsigned int column );
+ void HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* column );
+ wxRect GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column );
private:
wxDataViewTreeNode * GetTreeNodeByRow( unsigned int row );
//We did not need this temporarily
m_count = -1;
UpdateDisplay();
-
+
return true;
}
wxDataViewTreeNode * node;
node = FindNode(parent);
- SendModelEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED, item);
+ SendModelEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED, item);
if( node == NULL || node->GetChildren().Index( item.GetID() ) == wxNOT_FOUND )
{
return false;
int sub = -1;
node->GetChildren().Remove( item.GetID() );
+ //Manuplate selection
+ if( m_selection.GetCount() > 1 )
+ {
+ int row = m_selection[0];
+ m_selection.Empty();
+ m_selection.Add(row);
+ }
+
if( GetOwner()->GetModel()->IsContainer( item ) )
{
wxDataViewTreeNode * n = NULL;
GetOwner()->m_headerArea->ScrollWindow( dx, 0 );
}
-void wxDataViewMainWindow::ScrollTo( int rows )
+void wxDataViewMainWindow::ScrollTo( int rows, int column )
{
int x, y;
m_owner->GetScrollPixelsPerUnit( &x, &y );
- int sc = rows*m_lineHeight/y;
- m_owner->Scroll(0, sc );
+ int sy = rows*m_lineHeight/y;
+ int sx = 0;
+ if( column != -1 )
+ {
+ wxRect rect = GetClientRect();
+ unsigned int colnum = 0;
+ unsigned int x_start = 0, x_end = 0, w = 0;
+ int xx, yy, xe;
+ m_owner->CalcUnscrolledPosition( rect.x, rect.y, &xx, &yy );
+ for (x_start = 0; colnum < column; colnum++)
+ {
+ wxDataViewColumn *col = GetOwner()->GetColumn(colnum);
+ if (col->IsHidden())
+ continue; // skip it!
+
+ w = col->GetWidth();
+ x_start += w;
+ }
+
+ x_end = x_start + w;
+ xe = xx + rect.width;
+ if( x_end > xe )
+ {
+ sx = ( xx + x_end - xe )/x;
+ }
+ if( x_start < xx )
+ {
+ sx = x_start/x;
+ }
+ }
+ m_owner->Scroll( sx, sy );
}
void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
m_owner->CalcUnscrolledPosition( client_size.x, client_size.y,
&client_size.x, &client_size.y );
- return wxMin( GetRowCount()-1, ((unsigned)client_size.y/m_lineHeight)+1 );
+ //we should deal with the pixel here
+ unsigned int row = (client_size.y)/m_lineHeight;
+ if( client_size.y % m_lineHeight < m_lineHeight/2 )
+ row -= 1;
+
+ return wxMin( GetRowCount()-1, row );
}
unsigned int wxDataViewMainWindow::GetRowCount()
wxDataViewItem ret;
};
-wxDataViewItem wxDataViewMainWindow::GetItemByRow(unsigned int row)
+wxDataViewItem wxDataViewMainWindow::GetItemByRow(unsigned int row) const
{
RowToItemJob job( row, -2 );
Walker( m_root , job );
return node;
}
-void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item, unsigned int & column )
+void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* column )
{
+ wxDataViewColumn *col = NULL;
unsigned int cols = GetOwner()->GetColumnCount();
unsigned int colnum = 0;
unsigned int x_start = 0;
m_owner->CalcUnscrolledPosition( point.x, point.y, &x, &y );
for (x_start = 0; colnum < cols; colnum++)
{
- wxDataViewColumn *col = GetOwner()->GetColumn(colnum);
+ col = GetOwner()->GetColumn(colnum);
if (col->IsHidden())
continue; // skip it!
x_start += w;
}
- column = colnum;
+ column = col;
item = GetItemByRow( y/m_lineHeight );
}
-wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, unsigned int column )
+wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column )
{
int row = GetRowByItem(item);
int y = row*m_lineHeight;
{
col = GetOwner()->GetColumn( i );
x += col->GetWidth();
- if( i == column - 1 )
+ if( GetOwner()->GetColumn(i+1) == column )
break;
}
int w = col->GetWidth();
{
wxDataViewModel * model = GetOwner()->GetModel();
if( model == NULL )
- return 0;
+ return -1;
if( !item.IsOk() )
return -1;
event.Skip();
}
-wxDataViewItem wxDataViewMainWindow::GetSelection()
+wxDataViewItem wxDataViewMainWindow::GetSelection() const
{
if( m_selection.GetCount() != 1 )
return wxDataViewItem();
}
//Selection code with wxDataViewItem as parameters
-wxDataViewItem wxDataViewCtrl::GetSelection()
+wxDataViewItem wxDataViewCtrl::GetSelection() const
{
return m_clientArea->GetSelection();
}
m_clientArea->SelectAllRows(false);
}
-void wxDataViewCtrl::EnsureVisible( int row )
+void wxDataViewCtrl::EnsureVisible( int row, int column )
{
- m_clientArea->ScrollTo( row );
+ if( row < 0 )
+ row = 0;
+ if( row > m_clientArea->GetRowCount() )
+ row = m_clientArea->GetRowCount();
+
+ int first = m_clientArea->GetFirstVisibleRow();
+ int last = m_clientArea->GetLastVisibleRow();
+ if( row < first )
+ m_clientArea->ScrollTo( row, column );
+ else if( row > last )
+ m_clientArea->ScrollTo( row - last + first, column );
+ else
+ m_clientArea->ScrollTo( first, column );
}
-void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, wxDataViewColumn * column )
+void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, const wxDataViewColumn * column )
{
int row = m_clientArea->GetRowByItem(item);
if( row >= 0 )
- EnsureVisible(row);
+ {
+ if( column == NULL )
+ return EnsureVisible(row, -1);
+ else
+ {
+ int col = 0;
+ int len = GetColumnCount();
+ for( int i = 0; i < len; i ++ )
+ if( GetColumn(i) == column )
+ {
+ col = i;
+ break;
+ }
+ EnsureVisible( row, col );
+ }
+ }
+
}
-void wxDataViewCtrl::HitTest( const wxPoint & point, wxDataViewItem & item, unsigned int & column ) const
+void wxDataViewCtrl::HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* column ) const
{
m_clientArea->HitTest(point, item, column);
}
-wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem & item, unsigned int column ) const
+wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column ) const
{
return m_clientArea->GetItemRect(item, column);
}