// array types
// -----------------------------------------------------------------------------
-class WXDLLEXPORT wxGenericTreeItem;
+class WXDLLIMPEXP_FWD_CORE wxGenericTreeItem;
WX_DEFINE_EXPORTED_ARRAY_PTR(wxGenericTreeItem *, wxArrayGenericTreeItems);
m_textCtrl = NULL;
m_renameTimer = NULL;
- m_freezeCount = 0;
m_findTimer = NULL;
m_lastOnSame = false;
-#ifdef __WXMAC_CARBON__
- m_normalFont.MacCreateThemeFont( kThemeViewsFont ) ;
+#ifdef __WXMAC__
+ m_normalFont.MacCreateFromThemeFont( kThemeViewsFont ) ;
#else
m_normalFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
#endif
if (!m_hasFont)
SetOwnFont(attr.font);
- m_dottedPen = wxPen( wxT("grey"), 0, 0 );
+ // this is a misnomer: it's called "dotted pen" but uses (default) wxSOLID
+ // style because we apparently get performance problems when using dotted
+ // pen for drawing in some ports -- but under MSW it seems to work fine
+#ifdef __WXMSW__
+ m_dottedPen = wxPen(*wxLIGHT_GREY, 0, wxDOT);
+#else
+ m_dottedPen = *wxGREY_PEN;
+#endif
SetInitialSize(size);
wxTreeItemId wxGenericTreeCtrl::GetNextVisible(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") );
+ wxASSERT_MSG( IsVisible(item), wxT("this item itself should be visible") );
wxTreeItemId id = item;
if (id.IsOk())
wxTreeItemId wxGenericTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const
{
wxCHECK_MSG( item.IsOk(), wxTreeItemId(), wxT("invalid tree item") );
+ wxASSERT_MSG( IsVisible(item), wxT("this item itself should be visible") );
- wxFAIL_MSG(wxT("not implemented"));
+ // find out the starting point
+ wxTreeItemId prevItem = GetPrevSibling(item);
+ if ( !prevItem.IsOk() )
+ {
+ prevItem = GetItemParent(item);
+ }
- return wxTreeItemId();
+ // find the first visible item after it
+ while ( prevItem.IsOk() && !IsVisible(prevItem) )
+ {
+ prevItem = GetNext(prevItem);
+ if ( !prevItem.IsOk() || prevItem == item )
+ {
+ // there are no visible items before item
+ return wxTreeItemId();
+ }
+ }
+
+ // from there we must be able to navigate until this item
+ while ( prevItem.IsOk() )
+ {
+ const wxTreeItemId nextItem = GetNextVisible(prevItem);
+ if ( !nextItem.IsOk() || nextItem == item )
+ break;
+
+ prevItem = nextItem;
+ }
+
+ return prevItem;
}
// called by wxTextTreeCtrl when it marks itself for deletion
parent->Insert( item, previous == (size_t)-1 ? parent->GetChildren().size()
: previous );
+ InvalidateBestSize();
return item;
}
m_current->SetHilight( true );
}
+ InvalidateBestSize();
return m_anchor;
}
wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem;
ChildrenClosing(item);
item->DeleteChildren(this);
+ InvalidateBestSize();
}
void wxGenericTreeCtrl::Delete(const wxTreeItemId& itemId)
m_select_me = NULL;
delete item;
+
+ InvalidateBestSize();
}
void wxGenericTreeCtrl::DeleteAllItems()
}
item->Expand();
- CalculatePositions();
+ if ( !IsFrozen() )
+ {
+ CalculatePositions();
- RefreshSubtree(item);
+ RefreshSubtree(item);
+ }
+ else // frozen
+ {
+ m_dirty = true;
+ }
event.SetEventType(wxEVT_COMMAND_TREE_ITEM_EXPANDED);
GetEventHandler()->ProcessEvent( event );
else if (item->IsBold())
dc.SetFont(m_boldFont);
- long text_w = 0, text_h = 0;
+ wxCoord text_w = 0, text_h = 0;
dc.GetTextExtent( item->GetText(), &text_w, &text_h );
int image_h = 0, image_w = 0;
{
int flags = wxCONTROL_SELECTED;
if (m_hasFocus
-#ifdef __WXMAC__
+#if defined( __WXMAC__ ) && !defined(__WXUNIVERSAL__)
&& IsControlActive( (ControlRef)GetHandle() )
#endif
)
wxColour colText;
if ( item->IsSelected()
-#ifdef __WXMAC__
+#if defined( __WXMAC__ ) && !defined(__WXUNIVERSAL__)
// On wxMac, if the tree doesn't have the focus we draw an empty
// rectangle, so we want to make sure that the text is visible
// against the normal background, not the highlightbackground, so
case WXK_RIGHT:
// this works the same as the down arrow except that we
// also expand the item if it wasn't expanded yet
- Expand(m_current);
+ if (m_current != GetRootItem().m_pItem || !HasFlag(wxTR_HIDE_ROOT))
+ Expand(m_current);
+ //else: don't try to expand hidden root item (which can be the
+ // current one when the tree is empty)
+
// fall through
case WXK_DOWN:
{
wxTreeItemIdValue cookie;
wxTreeItemId child = GetFirstChild( m_key_current, cookie );
+ if ( !child )
+ break;
+
DoSelectItem( child, unselect_others, extended_select );
m_key_current=(wxGenericTreeItem*) child.m_pItem;
}
void wxGenericTreeCtrl::Refresh(bool eraseBackground, const wxRect *rect)
{
- if ( !m_freezeCount )
+ if ( !IsFrozen() )
wxTreeCtrlBase::Refresh(eraseBackground, rect);
}
void wxGenericTreeCtrl::RefreshSubtree(wxGenericTreeItem *item)
{
- if (m_dirty || m_freezeCount)
+ if (m_dirty || IsFrozen() )
return;
wxSize client = GetClientSize();
void wxGenericTreeCtrl::RefreshLine( wxGenericTreeItem *item )
{
- if (m_dirty || m_freezeCount)
+ if (m_dirty || IsFrozen() )
return;
wxRect rect;
void wxGenericTreeCtrl::RefreshSelected()
{
- if (m_freezeCount)
+ if (IsFrozen())
return;
// TODO: this is awfully inefficient, we should keep the list of all
void wxGenericTreeCtrl::RefreshSelectedUnder(wxGenericTreeItem *item)
{
- if (m_freezeCount)
+ if (IsFrozen())
return;
if ( item->IsSelected() )
}
}
-void wxGenericTreeCtrl::Freeze()
+void wxGenericTreeCtrl::DoThaw()
{
- m_freezeCount++;
-}
-
-void wxGenericTreeCtrl::Thaw()
-{
- wxCHECK_RET( m_freezeCount > 0, _T("thawing unfrozen tree control?") );
-
- if ( --m_freezeCount == 0 )
- {
+ if ( m_dirty )
+ DoDirtyProcessing();
+ else
Refresh();
- }
}
// ----------------------------------------------------------------------------
void wxGenericTreeCtrl::DoDirtyProcessing()
{
- if (m_freezeCount)
+ if (IsFrozen())
return;
m_dirty = false;