Patch from Bo, adapt generic code to new API, add GetItemRect and HitTest
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48223 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#if defined(__WXGTK20__)
|
#if defined(__WXGTK20__)
|
||||||
// for testing
|
// for testing
|
||||||
// #define wxUSE_GENERICDATAVIEWCTRL 1
|
#define wxUSE_GENERICDATAVIEWCTRL 1
|
||||||
#elif defined(__WXMAC__)
|
#elif defined(__WXMAC__)
|
||||||
#else
|
#else
|
||||||
#define wxUSE_GENERICDATAVIEWCTRL 1
|
#define wxUSE_GENERICDATAVIEWCTRL 1
|
||||||
@@ -154,7 +154,7 @@ public:
|
|||||||
// default compare function
|
// default compare function
|
||||||
virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
|
virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2,
|
||||||
unsigned int column, bool ascending );
|
unsigned int column, bool ascending );
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// the user should not delete this class directly: he should use DecRef() instead!
|
// the user should not delete this class directly: he should use DecRef() instead!
|
||||||
virtual ~wxDataViewModel() { }
|
virtual ~wxDataViewModel() { }
|
||||||
@@ -487,6 +487,11 @@ public:
|
|||||||
|
|
||||||
virtual void EnsureVisible( const wxDataViewItem & item,
|
virtual void EnsureVisible( const wxDataViewItem & item,
|
||||||
wxDataViewColumn *column = NULL ) = 0;
|
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;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void DoSetExpanderColumn() = 0 ;
|
virtual void DoSetExpanderColumn() = 0 ;
|
||||||
|
@@ -326,6 +326,7 @@ class WXDLLIMPEXP_ADV wxDataViewCtrl: public wxDataViewCtrlBase,
|
|||||||
public:
|
public:
|
||||||
wxDataViewCtrl() : wxScrollHelperNative(this)
|
wxDataViewCtrl() : wxScrollHelperNative(this)
|
||||||
{
|
{
|
||||||
|
m_sortingColumn = 0;
|
||||||
Init();
|
Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -353,12 +354,22 @@ public:
|
|||||||
virtual void DoSetExpanderColumn();
|
virtual void DoSetExpanderColumn();
|
||||||
virtual void DoSetIndent();
|
virtual void DoSetIndent();
|
||||||
|
|
||||||
|
virtual wxDataViewItem GetSelection();
|
||||||
virtual int GetSelections( wxDataViewItemArray & sel ) const;
|
virtual int GetSelections( wxDataViewItemArray & sel ) const;
|
||||||
virtual void SetSelections( const wxDataViewItemArray & sel );
|
virtual void SetSelections( const wxDataViewItemArray & sel );
|
||||||
virtual void Select( const wxDataViewItem & item );
|
virtual void Select( const wxDataViewItem & item );
|
||||||
virtual void Unselect( const wxDataViewItem & item );
|
virtual void Unselect( const wxDataViewItem & item );
|
||||||
virtual bool IsSelected( const wxDataViewItem & item ) const;
|
virtual bool IsSelected( const wxDataViewItem & item ) const;
|
||||||
|
|
||||||
|
virtual void SelectAll();
|
||||||
|
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;
|
||||||
|
|
||||||
|
protected:
|
||||||
virtual int GetSelections( wxArrayInt & sel ) const;
|
virtual int GetSelections( wxArrayInt & sel ) const;
|
||||||
virtual void SetSelections( const wxArrayInt & sel );
|
virtual void SetSelections( const wxArrayInt & sel );
|
||||||
virtual void Select( int row );
|
virtual void Select( int row );
|
||||||
@@ -367,15 +378,13 @@ public:
|
|||||||
virtual void SelectRange( int from, int to );
|
virtual void SelectRange( int from, int to );
|
||||||
virtual void UnselectRange( int from, int to );
|
virtual void UnselectRange( int from, int to );
|
||||||
|
|
||||||
virtual void SelectAll();
|
|
||||||
virtual void UnselectAll();
|
|
||||||
|
|
||||||
virtual void EnsureVisible( int row );
|
virtual void EnsureVisible( int row );
|
||||||
virtual void EnsureVisible( const wxDataViewItem & item, wxDataViewColumn *column = NULL );
|
|
||||||
|
|
||||||
virtual wxDataViewItem GetItemByRow( unsigned int row ) const;
|
virtual wxDataViewItem GetItemByRow( unsigned int row ) const;
|
||||||
virtual int GetRowByItem( const wxDataViewItem & item ) const;
|
virtual int GetRowByItem( const wxDataViewItem & item ) const;
|
||||||
|
|
||||||
|
unsigned int GetSortingColumn() { return m_sortingColumn; }
|
||||||
|
void SetSortingColumn( unsigned int column ) { m_sortingColumn = column; }
|
||||||
|
|
||||||
public: // utility functions not part of the API
|
public: // utility functions not part of the API
|
||||||
|
|
||||||
@@ -394,6 +403,7 @@ private:
|
|||||||
wxDataViewModelNotifier *m_notifier;
|
wxDataViewModelNotifier *m_notifier;
|
||||||
wxDataViewMainWindow *m_clientArea;
|
wxDataViewMainWindow *m_clientArea;
|
||||||
wxDataViewHeaderWindow *m_headerArea;
|
wxDataViewHeaderWindow *m_headerArea;
|
||||||
|
unsigned int m_sortingColumn;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void OnSize( wxSizeEvent &event );
|
void OnSize( wxSizeEvent &event );
|
||||||
|
@@ -317,6 +317,12 @@ public:
|
|||||||
|
|
||||||
virtual void EnsureVisible( const wxDataViewItem & item, wxDataViewColumn *column = NULL );
|
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;
|
||||||
|
|
||||||
|
|
||||||
static wxVisualAttributes
|
static wxVisualAttributes
|
||||||
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
|
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
|
||||||
|
|
||||||
|
@@ -683,6 +683,9 @@ bool wxDataViewCtrlBase::ClearColumns()
|
|||||||
|
|
||||||
wxDataViewColumn* wxDataViewCtrlBase::GetColumn( unsigned int pos )
|
wxDataViewColumn* wxDataViewCtrlBase::GetColumn( unsigned int pos )
|
||||||
{
|
{
|
||||||
|
if( pos >= m_cols.GetCount() )
|
||||||
|
return NULL;
|
||||||
|
|
||||||
return (wxDataViewColumn*) m_cols[ pos ];
|
return (wxDataViewColumn*) m_cols[ pos ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -385,15 +385,17 @@ private:
|
|||||||
//Below is the compare stuff
|
//Below is the compare stuff
|
||||||
//For the generic implements, both the leaf nodes and the nodes are sorted for fast search when needed
|
//For the generic implements, both the leaf nodes and the nodes are sorted for fast search when needed
|
||||||
static wxDataViewModel * g_model;
|
static wxDataViewModel * g_model;
|
||||||
|
static unsigned int g_column;
|
||||||
|
static bool g_asending;
|
||||||
|
|
||||||
int LINKAGEMODE wxGenericTreeModelNodeCmp( wxDataViewTreeNode * node1, wxDataViewTreeNode * node2)
|
int LINKAGEMODE wxGenericTreeModelNodeCmp( wxDataViewTreeNode * node1, wxDataViewTreeNode * node2)
|
||||||
{
|
{
|
||||||
return g_model->Compare( node1->GetItem(), node2->GetItem() );
|
return g_model->Compare( node1->GetItem(), node2->GetItem(), g_column, g_asending );
|
||||||
}
|
}
|
||||||
|
|
||||||
int LINKAGEMODE wxGenericTreeModelItemCmp( void * id1, void * id2)
|
int LINKAGEMODE wxGenericTreeModelItemCmp( void * id1, void * id2)
|
||||||
{
|
{
|
||||||
return g_model->Compare( id1, id2 );
|
return g_model->Compare( id1, id2, g_column, g_asending );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -425,8 +427,25 @@ public:
|
|||||||
bool ValueChanged( const wxDataViewItem &item, unsigned int col );
|
bool ValueChanged( const wxDataViewItem &item, unsigned int col );
|
||||||
bool Cleared();
|
bool Cleared();
|
||||||
void Resort()
|
void Resort()
|
||||||
{ g_model = GetOwner()->GetModel(); m_root->Resort(); UpdateDisplay(); }
|
{
|
||||||
|
SortPrepare();
|
||||||
|
m_root->Resort();
|
||||||
|
UpdateDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SortPrepare()
|
||||||
|
{
|
||||||
|
g_model = GetOwner()->GetModel();
|
||||||
|
g_column = GetOwner()->GetSortingColumn();
|
||||||
|
wxDataViewColumn * col = GetOwner()->GetColumn(g_column);
|
||||||
|
if( !col )
|
||||||
|
{
|
||||||
|
g_asending = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
g_asending = col->IsSortOrderAscending();
|
||||||
|
}
|
||||||
|
|
||||||
void SetOwner( wxDataViewCtrl* owner ) { m_owner = owner; }
|
void SetOwner( wxDataViewCtrl* owner ) { m_owner = owner; }
|
||||||
wxDataViewCtrl *GetOwner() { return m_owner; }
|
wxDataViewCtrl *GetOwner() { return m_owner; }
|
||||||
const wxDataViewCtrl *GetOwner() const { return m_owner; }
|
const wxDataViewCtrl *GetOwner() const { return m_owner; }
|
||||||
@@ -490,6 +509,8 @@ public:
|
|||||||
//Methods for building the mapping tree
|
//Methods for building the mapping tree
|
||||||
void BuildTree( wxDataViewModel * model );
|
void BuildTree( wxDataViewModel * model );
|
||||||
void DestroyTree();
|
void DestroyTree();
|
||||||
|
void HitTest( const wxPoint & point, wxDataViewItem & item, unsigned int & column );
|
||||||
|
wxRect GetItemRect( const wxDataViewItem & item, unsigned int column );
|
||||||
private:
|
private:
|
||||||
wxDataViewTreeNode * GetTreeNodeByRow( unsigned int row );
|
wxDataViewTreeNode * GetTreeNodeByRow( unsigned int row );
|
||||||
//We did not need this temporarily
|
//We did not need this temporarily
|
||||||
@@ -497,6 +518,7 @@ private:
|
|||||||
|
|
||||||
int RecalculateCount() ;
|
int RecalculateCount() ;
|
||||||
|
|
||||||
|
wxDataViewEvent SendExpanderEvent( wxEventType type, const wxDataViewItem & item );
|
||||||
void OnExpanding( unsigned int row );
|
void OnExpanding( unsigned int row );
|
||||||
void OnCollapsing( unsigned int row );
|
void OnCollapsing( unsigned int row );
|
||||||
|
|
||||||
@@ -1197,7 +1219,7 @@ void wxDataViewHeaderWindowMSW::UpdateDisplay()
|
|||||||
//hdi.fmt &= ~(HDF_SORTDOWN|HDF_SORTUP);
|
//hdi.fmt &= ~(HDF_SORTDOWN|HDF_SORTUP);
|
||||||
|
|
||||||
//sorting support
|
//sorting support
|
||||||
if(model && model->GetSortingColumn() == i)
|
if(model && m_owner->GetSortingColumn() == i)
|
||||||
{
|
{
|
||||||
//The Microsoft Comctrl32.dll 6.0 support SORTUP/SORTDOWN, but they are not default
|
//The Microsoft Comctrl32.dll 6.0 support SORTUP/SORTDOWN, but they are not default
|
||||||
//see http://msdn2.microsoft.com/en-us/library/ms649534.aspx for more detail
|
//see http://msdn2.microsoft.com/en-us/library/ms649534.aspx for more detail
|
||||||
@@ -1332,16 +1354,14 @@ bool wxDataViewHeaderWindowMSW::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARA
|
|||||||
wxDataViewColumn *col = GetColumn(idx);
|
wxDataViewColumn *col = GetColumn(idx);
|
||||||
if(col->IsSortable())
|
if(col->IsSortable())
|
||||||
{
|
{
|
||||||
if(model && model->GetSortingColumn() == idx)
|
if(model && m_owner->GetSortingColumn() == idx)
|
||||||
{
|
{
|
||||||
bool order = col->IsSortOrderAscending();
|
bool order = col->IsSortOrderAscending();
|
||||||
col->SetSortOrder(!order);
|
col->SetSortOrder(!order);
|
||||||
model->SetSortOrderAscending(!order);
|
|
||||||
}
|
}
|
||||||
else if(model)
|
else if(model)
|
||||||
{
|
{
|
||||||
model->SetSortingColumn(idx);
|
m_owner->SetSortingColumn(idx);
|
||||||
model->SetSortOrderAscending(col->IsSortOrderAscending());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UpdateDisplay();
|
UpdateDisplay();
|
||||||
@@ -1505,7 +1525,7 @@ void wxGenericDataViewHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
|||||||
int ch = h;
|
int ch = h;
|
||||||
|
|
||||||
wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE;
|
wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE;
|
||||||
if (col->IsSortable() && GetOwner()->GetModel()->GetSortingColumn() == i)
|
if (col->IsSortable() && GetOwner()->GetSortingColumn() == i)
|
||||||
{
|
{
|
||||||
if (col->IsSortOrderAscending())
|
if (col->IsSortOrderAscending())
|
||||||
sortArrow = wxHDR_SORT_ICON_UP;
|
sortArrow = wxHDR_SORT_ICON_UP;
|
||||||
@@ -1670,17 +1690,15 @@ void wxGenericDataViewHeaderWindow::OnMouse( wxMouseEvent &event )
|
|||||||
wxDataViewColumn *col = GetColumn(m_column);
|
wxDataViewColumn *col = GetColumn(m_column);
|
||||||
if(col->IsSortable())
|
if(col->IsSortable())
|
||||||
{
|
{
|
||||||
unsigned int colnum = model->GetSortingColumn();
|
unsigned int colnum = m_owner->GetSortingColumn();
|
||||||
if(model && static_cast<int>(colnum) == m_column)
|
if(model && static_cast<int>(colnum) == m_column)
|
||||||
{
|
{
|
||||||
bool order = col->IsSortOrderAscending();
|
bool order = col->IsSortOrderAscending();
|
||||||
col->SetSortOrder(!order);
|
col->SetSortOrder(!order);
|
||||||
model->SetSortOrderAscending(!order);
|
|
||||||
}
|
}
|
||||||
else if(model)
|
else if(model)
|
||||||
{
|
{
|
||||||
model->SetSortingColumn(m_column);
|
m_owner->SetSortingColumn(m_column);
|
||||||
model->SetSortOrderAscending(col->IsSortOrderAscending());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UpdateDisplay();
|
UpdateDisplay();
|
||||||
@@ -1944,7 +1962,7 @@ void wxDataViewMainWindow::SendModelEvent( wxEventType type, const wxDataViewIte
|
|||||||
|
|
||||||
bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxDataViewItem & item)
|
bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxDataViewItem & item)
|
||||||
{
|
{
|
||||||
g_model = GetOwner()->GetModel();
|
SortPrepare();
|
||||||
|
|
||||||
wxDataViewTreeNode * node;
|
wxDataViewTreeNode * node;
|
||||||
node = FindNode(parent);
|
node = FindNode(parent);
|
||||||
@@ -1978,7 +1996,7 @@ void DestroyTreeHelper( wxDataViewTreeNode * node);
|
|||||||
bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent,
|
bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent,
|
||||||
const wxDataViewItem& item)
|
const wxDataViewItem& item)
|
||||||
{
|
{
|
||||||
g_model = GetOwner()->GetModel();
|
SortPrepare();
|
||||||
|
|
||||||
wxDataViewTreeNode * node;
|
wxDataViewTreeNode * node;
|
||||||
node = FindNode(parent);
|
node = FindNode(parent);
|
||||||
@@ -2029,7 +2047,7 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent,
|
|||||||
|
|
||||||
bool wxDataViewMainWindow::ItemChanged(const wxDataViewItem & item)
|
bool wxDataViewMainWindow::ItemChanged(const wxDataViewItem & item)
|
||||||
{
|
{
|
||||||
g_model = GetOwner()->GetModel();
|
SortPrepare();
|
||||||
g_model->Resort();
|
g_model->Resort();
|
||||||
|
|
||||||
SendModelEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED,item);
|
SendModelEvent(wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED,item);
|
||||||
@@ -2048,7 +2066,7 @@ bool wxDataViewMainWindow::ValueChanged( const wxDataViewItem & item, unsigned i
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
*/
|
*/
|
||||||
g_model = GetOwner()->GetModel();
|
SortPrepare();
|
||||||
g_model->Resort();
|
g_model->Resort();
|
||||||
|
|
||||||
//Send event
|
//Send event
|
||||||
@@ -2066,7 +2084,7 @@ bool wxDataViewMainWindow::ValueChanged( const wxDataViewItem & item, unsigned i
|
|||||||
|
|
||||||
bool wxDataViewMainWindow::Cleared()
|
bool wxDataViewMainWindow::Cleared()
|
||||||
{
|
{
|
||||||
g_model = GetOwner()->GetModel();
|
SortPrepare();
|
||||||
|
|
||||||
DestroyTree();
|
DestroyTree();
|
||||||
UpdateDisplay();
|
UpdateDisplay();
|
||||||
@@ -2757,20 +2775,41 @@ wxDataViewTreeNode * wxDataViewMainWindow::GetTreeNodeByRow(unsigned int row)
|
|||||||
return job.GetResult();
|
return job.GetResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, const wxDataViewItem & item )
|
||||||
|
{
|
||||||
|
wxWindow *parent = GetParent();
|
||||||
|
wxDataViewEvent le(type, parent->GetId());
|
||||||
|
|
||||||
|
le.SetEventObject(parent);
|
||||||
|
le.SetModel(GetOwner()->GetModel());
|
||||||
|
le.SetItem( item );
|
||||||
|
|
||||||
|
parent->GetEventHandler()->ProcessEvent(le);
|
||||||
|
return le;
|
||||||
|
}
|
||||||
|
|
||||||
void wxDataViewMainWindow::OnExpanding( unsigned int row )
|
void wxDataViewMainWindow::OnExpanding( unsigned int row )
|
||||||
{
|
{
|
||||||
wxDataViewTreeNode * node = GetTreeNodeByRow(row);
|
wxDataViewTreeNode * node = GetTreeNodeByRow(row);
|
||||||
if( node != NULL )
|
if( node != NULL )
|
||||||
{
|
{
|
||||||
if( node->HasChildren())
|
if( node->HasChildren())
|
||||||
|
{
|
||||||
if( !node->IsOpen())
|
if( !node->IsOpen())
|
||||||
{
|
{
|
||||||
|
wxDataViewEvent e = SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING,node->GetItem());
|
||||||
|
//Check if the user prevent expanding
|
||||||
|
if( e.GetSkipped() )
|
||||||
|
return;
|
||||||
|
|
||||||
node->ToggleOpen();
|
node->ToggleOpen();
|
||||||
//Here I build the children of current node
|
//Here I build the children of current node
|
||||||
if( node->GetChildrenNumber() == 0 )
|
if( node->GetChildrenNumber() == 0 )
|
||||||
BuildTreeHelper(GetOwner()->GetModel(), node->GetItem(), node);
|
BuildTreeHelper(GetOwner()->GetModel(), node->GetItem(), node);
|
||||||
m_count = -1;
|
m_count = -1;
|
||||||
UpdateDisplay();
|
UpdateDisplay();
|
||||||
|
//Send the expanded event
|
||||||
|
SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED,node->GetItem());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -2778,6 +2817,7 @@ void wxDataViewMainWindow::OnExpanding( unsigned int row )
|
|||||||
SelectRow( row + 1, true );
|
SelectRow( row + 1, true );
|
||||||
ChangeCurrentRow( row + 1 );
|
ChangeCurrentRow( row + 1 );
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
delete node;
|
delete node;
|
||||||
}
|
}
|
||||||
@@ -2792,27 +2832,30 @@ void wxDataViewMainWindow::OnCollapsing(unsigned int row)
|
|||||||
|
|
||||||
if( node->HasChildren() && node->IsOpen() )
|
if( node->HasChildren() && node->IsOpen() )
|
||||||
{
|
{
|
||||||
|
wxDataViewEvent e = SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING,node->GetItem());
|
||||||
|
if( e.GetSkipped() )
|
||||||
|
return;
|
||||||
node->ToggleOpen();
|
node->ToggleOpen();
|
||||||
m_count = -1;
|
m_count = -1;
|
||||||
UpdateDisplay();
|
UpdateDisplay();
|
||||||
//RefreshRows(row,GetLastVisibleRow());
|
SendExpanderEvent(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED,nd->GetItem());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
node = node->GetParent();
|
node = node->GetParent();
|
||||||
if( node != NULL )
|
if( node != NULL )
|
||||||
{
|
{
|
||||||
int parent = GetRowByItem( node->GetItem() ) ;
|
int parent = GetRowByItem( node->GetItem() ) ;
|
||||||
if( parent >= 0 )
|
if( parent >= 0 )
|
||||||
{
|
{
|
||||||
SelectRow( row, false);
|
SelectRow( row, false);
|
||||||
SelectRow(parent , true );
|
SelectRow(parent , true );
|
||||||
ChangeCurrentRow( parent );
|
ChangeCurrentRow( parent );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( !nd->HasChildren())
|
if( !nd->HasChildren())
|
||||||
delete nd;
|
delete nd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2858,6 +2901,49 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item
|
|||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item, unsigned int & column )
|
||||||
|
{
|
||||||
|
unsigned int cols = GetOwner()->GetColumnCount();
|
||||||
|
unsigned int colnum = 0;
|
||||||
|
unsigned int x_start = 0;
|
||||||
|
int x, y;
|
||||||
|
m_owner->CalcUnscrolledPosition( point.x, point.y, &x, &y );
|
||||||
|
for (x_start = 0; colnum < cols; colnum++)
|
||||||
|
{
|
||||||
|
wxDataViewColumn *col = GetOwner()->GetColumn(colnum);
|
||||||
|
if (col->IsHidden())
|
||||||
|
continue; // skip it!
|
||||||
|
|
||||||
|
unsigned int w = col->GetWidth();
|
||||||
|
if (x_start+w >= (unsigned int)x)
|
||||||
|
break;
|
||||||
|
|
||||||
|
x_start += w;
|
||||||
|
}
|
||||||
|
|
||||||
|
column = colnum;
|
||||||
|
item = GetItemByRow( y/m_lineHeight );
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, unsigned int column )
|
||||||
|
{
|
||||||
|
int row = GetRowByItem(item);
|
||||||
|
int y = row*m_lineHeight;
|
||||||
|
int h = m_lineHeight;
|
||||||
|
int x = 0;
|
||||||
|
wxDataViewColumn *col = NULL;
|
||||||
|
for( int i = 0, cols = GetOwner()->GetColumnCount(); i < cols; i ++ )
|
||||||
|
{
|
||||||
|
col = GetOwner()->GetColumn( i );
|
||||||
|
x += col->GetWidth();
|
||||||
|
if( i == column - 1 )
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
int w = col->GetWidth();
|
||||||
|
m_owner->CalcScrolledPosition( x, y, &x, &y );
|
||||||
|
return wxRect(x, y, w, h);
|
||||||
|
}
|
||||||
|
|
||||||
int wxDataViewMainWindow::RecalculateCount()
|
int wxDataViewMainWindow::RecalculateCount()
|
||||||
{
|
{
|
||||||
return m_root->GetSubTreeCount();
|
return m_root->GetSubTreeCount();
|
||||||
@@ -2970,7 +3056,7 @@ void wxDataViewMainWindow::BuildTree(wxDataViewModel * model)
|
|||||||
{
|
{
|
||||||
//First we define a invalid item to fetch the top-level elements
|
//First we define a invalid item to fetch the top-level elements
|
||||||
wxDataViewItem item;
|
wxDataViewItem item;
|
||||||
g_model = GetOwner()->GetModel();
|
SortPrepare();
|
||||||
BuildTreeHelper( model, item, m_root);
|
BuildTreeHelper( model, item, m_root);
|
||||||
m_count = -1 ;
|
m_count = -1 ;
|
||||||
}
|
}
|
||||||
@@ -3494,6 +3580,11 @@ void wxDataViewCtrl::DoSetIndent()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Selection code with wxDataViewItem as parameters
|
//Selection code with wxDataViewItem as parameters
|
||||||
|
wxDataViewItem wxDataViewCtrl::GetSelection()
|
||||||
|
{
|
||||||
|
return m_clientArea->GetSelection();
|
||||||
|
}
|
||||||
|
|
||||||
int wxDataViewCtrl::GetSelections( wxDataViewItemArray & sel ) const
|
int wxDataViewCtrl::GetSelections( wxDataViewItemArray & sel ) const
|
||||||
{
|
{
|
||||||
sel.Empty();
|
sel.Empty();
|
||||||
@@ -3622,13 +3713,23 @@ void wxDataViewCtrl::EnsureVisible( int row )
|
|||||||
m_clientArea->ScrollTo( row );
|
m_clientArea->ScrollTo( row );
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, wxDataViewColumn *column )
|
void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, wxDataViewColumn * column )
|
||||||
{
|
{
|
||||||
int row = m_clientArea->GetRowByItem(item);
|
int row = m_clientArea->GetRowByItem(item);
|
||||||
if( row >= 0 )
|
if( row >= 0 )
|
||||||
EnsureVisible(row);
|
EnsureVisible(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxDataViewCtrl::HitTest( const wxPoint & point, wxDataViewItem & item, unsigned int & column ) const
|
||||||
|
{
|
||||||
|
m_clientArea->HitTest(point, item, column);
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem & item, unsigned int column ) const
|
||||||
|
{
|
||||||
|
return m_clientArea->GetItemRect(item, column);
|
||||||
|
}
|
||||||
|
|
||||||
wxDataViewItem wxDataViewCtrl::GetItemByRow( unsigned int row ) const
|
wxDataViewItem wxDataViewCtrl::GetItemByRow( unsigned int row ) const
|
||||||
{
|
{
|
||||||
return m_clientArea->GetItemByRow( row );
|
return m_clientArea->GetItemByRow( row );
|
||||||
|
@@ -3156,6 +3156,19 @@ void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, wxDataViewColum
|
|||||||
gtk_tree_path_free( path );
|
gtk_tree_path_free( path );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxDataViewCtrl::HitTest( const wxPoint &point,
|
||||||
|
wxDataViewItem &item, unsigned int &column ) const
|
||||||
|
{
|
||||||
|
item = wxDataViewItem(0);
|
||||||
|
column = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem &item,
|
||||||
|
unsigned int column ) const
|
||||||
|
{
|
||||||
|
return wxRect();
|
||||||
|
}
|
||||||
|
|
||||||
void wxDataViewCtrl::DoSetExpanderColumn()
|
void wxDataViewCtrl::DoSetExpanderColumn()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user