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:
Vadim Zeitlin
1998-07-23 17:53:50 +00:00
parent 543e7dd22a
commit 389cdc7ae4
2 changed files with 64 additions and 43 deletions

View File

@@ -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;

View File

@@ -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 );