wxTreeControl::Get/SetSelection implemented
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@346 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -295,7 +295,7 @@ public:
|
|||||||
long GetParent( long item ) const;
|
long GetParent( long item ) const;
|
||||||
long GetRootItem() const;
|
long GetRootItem() const;
|
||||||
long GetSelection() const;
|
long GetSelection() const;
|
||||||
bool SelectItem( long item ) const;
|
bool SelectItem( long item );
|
||||||
bool ItemHasChildren( long item ) const;
|
bool ItemHasChildren( long item ) const;
|
||||||
void SetIndent( int indent );
|
void SetIndent( int indent );
|
||||||
int GetIndent() const;
|
int GetIndent() const;
|
||||||
@@ -317,6 +317,10 @@ public:
|
|||||||
void SetImageList(wxImageList *imageList, int which = wxIMAGE_LIST_NORMAL);
|
void SetImageList(wxImageList *imageList, int which = wxIMAGE_LIST_NORMAL);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// set the selection to the specified item generating appropriate event(s) if
|
||||||
|
// not disabled
|
||||||
|
void SelectItem(wxGenericTreeItem *item, bool bDoEvents = TRUE);
|
||||||
|
|
||||||
wxGenericTreeItem *m_anchor;
|
wxGenericTreeItem *m_anchor;
|
||||||
wxGenericTreeItem *m_current;
|
wxGenericTreeItem *m_current;
|
||||||
bool m_hasFocus;
|
bool m_hasFocus;
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
// Purpose:
|
// Purpose:
|
||||||
// Author: Robert Roebling
|
// Author: Robert Roebling
|
||||||
// Created: 01/02/97
|
// Created: 01/02/97
|
||||||
// Id:
|
// Id: $Id$
|
||||||
// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
|
// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
|
||||||
// Licence: wxWindows licence
|
// Licence: wxWindows licence
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
#include "wx/treectrl.h"
|
#include "wx/treectrl.h"
|
||||||
#include "wx/settings.h"
|
#include "wx/settings.h"
|
||||||
|
#include "wx/log.h"
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxTreeItem
|
// wxTreeItem
|
||||||
@@ -445,7 +446,7 @@ long wxTreeCtrl::InsertItem( long parent, const wxString& label, int image,
|
|||||||
CalculatePositions();
|
CalculatePositions();
|
||||||
|
|
||||||
if (!p->HasChildren()) p->m_hasChildren = TRUE;
|
if (!p->HasChildren()) p->m_hasChildren = TRUE;
|
||||||
|
|
||||||
int ch = 0;
|
int ch = 0;
|
||||||
GetClientSize( NULL, &ch );
|
GetClientSize( NULL, &ch );
|
||||||
|
|
||||||
@@ -524,7 +525,7 @@ long wxTreeCtrl::InsertItem( long parent, wxTreeItem &info, long WXUNUSED(insert
|
|||||||
if (p)
|
if (p)
|
||||||
{
|
{
|
||||||
CalculatePositions();
|
CalculatePositions();
|
||||||
|
|
||||||
if (!p->HasChildren()) p->m_hasChildren = TRUE;
|
if (!p->HasChildren()) p->m_hasChildren = TRUE;
|
||||||
|
|
||||||
int ch = 0;
|
int ch = 0;
|
||||||
@@ -593,7 +594,7 @@ bool wxTreeCtrl::ExpandItem( long item, int action )
|
|||||||
};
|
};
|
||||||
|
|
||||||
CalculatePositions();
|
CalculatePositions();
|
||||||
|
|
||||||
i->SendCollapse( this );
|
i->SendCollapse( this );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -632,9 +633,9 @@ void wxTreeCtrl::DeleteItem( long item )
|
|||||||
{
|
{
|
||||||
wxGenericTreeItem *pItem = FindItem( item );
|
wxGenericTreeItem *pItem = FindItem( item );
|
||||||
wxCHECK_RET( pItem != NULL, "wxTreeCtrl::DeleteItem: no such pItem." );
|
wxCHECK_RET( pItem != NULL, "wxTreeCtrl::DeleteItem: no such pItem." );
|
||||||
|
|
||||||
pItem->m_parent->m_children.DeleteObject(pItem);
|
pItem->m_parent->m_children.DeleteObject(pItem);
|
||||||
|
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -642,9 +643,9 @@ void wxTreeCtrl::DeleteChildren( long item )
|
|||||||
{
|
{
|
||||||
wxGenericTreeItem *pItem = FindItem( item );
|
wxGenericTreeItem *pItem = FindItem( item );
|
||||||
wxCHECK_RET( pItem != NULL, "wxTreeCtrl::DeleteChildren: no such pItem." );
|
wxCHECK_RET( pItem != NULL, "wxTreeCtrl::DeleteChildren: no such pItem." );
|
||||||
|
|
||||||
pItem->m_children.Clear();
|
pItem->m_children.Clear();
|
||||||
|
|
||||||
Refresh();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -701,14 +702,41 @@ long wxTreeCtrl::GetRootItem() const
|
|||||||
|
|
||||||
long wxTreeCtrl::GetSelection() const
|
long wxTreeCtrl::GetSelection() const
|
||||||
{
|
{
|
||||||
return 0;
|
return m_current ? m_current->GetItemId() : -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool wxTreeCtrl::SelectItem( long WXUNUSED(item) ) const
|
bool wxTreeCtrl::SelectItem(long itemId)
|
||||||
{
|
{
|
||||||
return FALSE;
|
wxGenericTreeItem *pItem = FindItem(itemId);
|
||||||
|
if ( !pItem ) {
|
||||||
|
wxLogDebug("Can't select an item %d which doesn't exist.", itemId);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectItem(pItem, FALSE /* no events */);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void wxTreeCtrl::SelectItem(wxGenericTreeItem *item, bool bDoEvents)
|
||||||
|
{
|
||||||
|
if (m_current != item)
|
||||||
|
{
|
||||||
|
if (m_current)
|
||||||
|
{
|
||||||
|
m_current->SetHilight( FALSE );
|
||||||
|
RefreshLine( m_current );
|
||||||
|
};
|
||||||
|
m_current = item;
|
||||||
|
m_current->SetHilight( TRUE );
|
||||||
|
RefreshLine( m_current );
|
||||||
|
|
||||||
|
if ( bDoEvents )
|
||||||
|
m_current->SendSelected( this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool wxTreeCtrl::ItemHasChildren( long item ) const
|
bool wxTreeCtrl::ItemHasChildren( long item ) const
|
||||||
{
|
{
|
||||||
wxGenericTreeItem *i = FindItem( item );
|
wxGenericTreeItem *i = FindItem( item );
|
||||||
@@ -811,22 +839,22 @@ void wxTreeCtrl::AdjustMyScrollbars()
|
|||||||
void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y )
|
void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y )
|
||||||
{
|
{
|
||||||
int horizX = level*m_indent;
|
int horizX = level*m_indent;
|
||||||
|
|
||||||
item->m_x = horizX+33;
|
item->m_x = horizX+33;
|
||||||
item->m_y = y-m_lineHeight/3;
|
item->m_y = y-m_lineHeight/3;
|
||||||
item->m_height = m_lineHeight;
|
item->m_height = m_lineHeight;
|
||||||
|
|
||||||
item->SetCross( horizX+15, y );
|
item->SetCross( horizX+15, y );
|
||||||
|
|
||||||
int oldY = y;
|
int oldY = y;
|
||||||
|
|
||||||
if (IsExposed( 0, item->m_y-2, 10000, m_lineHeight+4 ))
|
if (IsExposed( 0, item->m_y-2, 10000, m_lineHeight+4 ))
|
||||||
{
|
{
|
||||||
int startX = horizX;
|
int startX = horizX;
|
||||||
int endX = horizX + 10;
|
int endX = horizX + 10;
|
||||||
|
|
||||||
if (!item->HasChildren()) endX += 20;
|
if (!item->HasChildren()) endX += 20;
|
||||||
dc.DrawLine( startX, y, endX, y );
|
dc.DrawLine( startX, y, endX, y );
|
||||||
|
|
||||||
if (item->HasChildren())
|
if (item->HasChildren())
|
||||||
{
|
{
|
||||||
@@ -846,24 +874,24 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level,
|
|||||||
long tw, th;
|
long tw, th;
|
||||||
dc.GetTextExtent( item->m_text, &tw, &th );
|
dc.GetTextExtent( item->m_text, &tw, &th );
|
||||||
if (m_hasFocus)
|
if (m_hasFocus)
|
||||||
{
|
{
|
||||||
dc.SetPen( *wxBLACK_PEN );
|
dc.SetPen( *wxBLACK_PEN );
|
||||||
dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 );
|
dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dc.SetPen( *wxTRANSPARENT_PEN );
|
dc.SetPen( *wxTRANSPARENT_PEN );
|
||||||
dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 );
|
dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 );
|
||||||
}
|
}
|
||||||
dc.DrawText( item->m_text, item->m_x, item->m_y );
|
dc.DrawText( item->m_text, item->m_x, item->m_y );
|
||||||
|
|
||||||
dc.SetPen( *wxBLACK_PEN );
|
dc.SetPen( *wxBLACK_PEN );
|
||||||
dc.SetTextForeground( *wxBLACK );
|
dc.SetTextForeground( *wxBLACK );
|
||||||
dc.SetBrush( *wxWHITE_BRUSH );
|
dc.SetBrush( *wxWHITE_BRUSH );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dc.SetPen( *wxTRANSPARENT_PEN );
|
dc.SetPen( *wxTRANSPARENT_PEN );
|
||||||
long tw, th;
|
long tw, th;
|
||||||
dc.GetTextExtent( item->m_text, &tw, &th );
|
dc.GetTextExtent( item->m_text, &tw, &th );
|
||||||
dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 );
|
dc.DrawRectangle( item->m_x-2, item->m_y-2, tw+4, th+4 );
|
||||||
@@ -874,8 +902,8 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level,
|
|||||||
|
|
||||||
if (item->NumberOfVisibleChildren() == 0) return;
|
if (item->NumberOfVisibleChildren() == 0) return;
|
||||||
|
|
||||||
int semiOldY = y;
|
int semiOldY = y;
|
||||||
|
|
||||||
wxNode *node = item->m_children.First();
|
wxNode *node = item->m_children.First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
@@ -883,9 +911,9 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level,
|
|||||||
|
|
||||||
y += m_lineHeight;
|
y += m_lineHeight;
|
||||||
semiOldY = y;
|
semiOldY = y;
|
||||||
|
|
||||||
PaintLevel( child, dc, level+1, y );
|
PaintLevel( child, dc, level+1, y );
|
||||||
|
|
||||||
node = node->Next();
|
node = node->Next();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -948,18 +976,7 @@ void wxTreeCtrl::OnMouse( const wxMouseEvent &event )
|
|||||||
if ((flag != wxTREE_HITTEST_ONITEMBUTTON) &&
|
if ((flag != wxTREE_HITTEST_ONITEMBUTTON) &&
|
||||||
(flag != wxTREE_HITTEST_ONITEMLABEL)) return;
|
(flag != wxTREE_HITTEST_ONITEMLABEL)) return;
|
||||||
|
|
||||||
if (m_current != item)
|
SelectItem(item);
|
||||||
{
|
|
||||||
if (m_current)
|
|
||||||
{
|
|
||||||
m_current->SetHilight( FALSE );
|
|
||||||
RefreshLine( m_current );
|
|
||||||
};
|
|
||||||
m_current = item;
|
|
||||||
m_current->SetHilight( TRUE );
|
|
||||||
RefreshLine( m_current );
|
|
||||||
m_current->SendSelected( this );
|
|
||||||
};
|
|
||||||
|
|
||||||
if (event.LeftDClick())
|
if (event.LeftDClick())
|
||||||
m_current->SendKeyDown( this );
|
m_current->SendKeyDown( this );
|
||||||
@@ -974,18 +991,18 @@ void wxTreeCtrl::OnMouse( const wxMouseEvent &event )
|
|||||||
void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y )
|
void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxPaintDC &dc, int level, int &y )
|
||||||
{
|
{
|
||||||
int horizX = level*m_indent;
|
int horizX = level*m_indent;
|
||||||
|
|
||||||
item->m_x = horizX+33;
|
item->m_x = horizX+33;
|
||||||
item->m_y = y-m_lineHeight/3-2;
|
item->m_y = y-m_lineHeight/3-2;
|
||||||
item->m_height = m_lineHeight;
|
item->m_height = m_lineHeight;
|
||||||
|
|
||||||
if (item->NumberOfVisibleChildren() == 0) return;
|
if (item->NumberOfVisibleChildren() == 0) return;
|
||||||
|
|
||||||
wxNode *node = item->m_children.First();
|
wxNode *node = item->m_children.First();
|
||||||
while (node)
|
while (node)
|
||||||
{
|
{
|
||||||
wxGenericTreeItem *child = (wxGenericTreeItem *)node->Data();
|
wxGenericTreeItem *child = (wxGenericTreeItem *)node->Data();
|
||||||
|
|
||||||
y += m_lineHeight;
|
y += m_lineHeight;
|
||||||
CalculateLevel( child, dc, level+1, y );
|
CalculateLevel( child, dc, level+1, y );
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user