if ( pItem->IsBold() != bold )
{
pItem->SetBold(bold);
+
+ // recalculate the item size as bold and non bold fonts have different
+ // widths
+ wxClientDC dc(this);
+ CalculateSize(pItem, dc);
+
RefreshLine(pItem);
}
}
}
// and try all the items (stop when we get to the one we started from)
- while ( id != idParent && !GetItemText(id).Lower().StartsWith(prefix) )
+ while (id.IsOk() && id != idParent && !GetItemText(id).Lower().StartsWith(prefix) )
{
id = GetNext(id);
}
+ // If we haven't found the item, id.IsOk() will be false, as per
+ // documentation
}
return id;
ProcessEvent( event );
}
-void wxGenericTreeCtrl::ExpandAll(const wxTreeItemId& item)
-{
- if ( !HasFlag(wxTR_HIDE_ROOT) || item != GetRootItem())
- {
- Expand(item);
- if ( !IsExpanded(item) )
- return;
- }
-
- wxTreeItemIdValue cookie;
- wxTreeItemId child = GetFirstChild(item, cookie);
- while ( child.IsOk() )
- {
- ExpandAll(child);
-
- child = GetNextChild(item, cookie);
- }
-}
-
void wxGenericTreeCtrl::Collapse(const wxTreeItemId& itemId)
{
wxCHECK_RET( !HasFlag(wxTR_HIDE_ROOT) || itemId != GetRootItem(),
{
wxGenericTreeItem *item = (wxGenericTreeItem*) itemId.m_pItem;
wxCHECK_RET( item, wxT("SelectItem(): invalid tree item") );
+
+ wxTreeEvent event(wxEVT_COMMAND_TREE_SEL_CHANGING, this, item);
+ if ( GetEventHandler()->ProcessEvent( event ) && !event.IsAllowed() )
+ return;
item->SetHilight(false);
RefreshLine(item);
+
+ event.SetEventType(wxEVT_COMMAND_TREE_SEL_CHANGED);
+ GetEventHandler()->ProcessEvent( event );
}
}
#if defined( __WXMSW__ ) || defined(__WXMAC__)
Update();
#else
- wxYieldIfNeeded();
+ DoDirtyProcessing();
#endif
wxGenericTreeItem *gitem = (wxGenericTreeItem*) item.m_pItem;
event.CmdDown(),
is_multiple, extended_select, unselect_others);
+ if (GetLayoutDirection() == wxLayout_RightToLeft)
+ {
+ if (event.GetKeyCode() == WXK_RIGHT)
+ event.m_keyCode = WXK_LEFT;
+ else if (event.GetKeyCode() == WXK_LEFT)
+ event.m_keyCode = WXK_RIGHT;
+ }
+
// + : Expand
// - : Collaspe
// * : Expand all/Collapse all
if ( !IsExpanded(m_current) )
{
// expand all
- ExpandAll(m_current);
+ ExpandAllChildren(m_current);
break;
}
//else: fall through to Collapse() it
#if defined( __WXMSW__ ) || defined(__WXMAC__)
Update();
#else
- wxYieldIfNeeded();
+ DoDirtyProcessing();
#endif
// TODO: use textCtrlClass here to create the control of correct class
}
#endif
- // we process left mouse up event (enables in-place edit), right down
+ // we process left mouse up event (enables in-place edit), middle/right down
// (pass to the user code), left dbl click (activate item) and
// dragging/moving events for items drag-and-drop
if ( !(event.LeftDown() ||
event.LeftUp() ||
+ event.MiddleDown() ||
event.RightDown() ||
event.LeftDClick() ||
event.Dragging() ||
nevent2.m_pointDrag = CalcScrolledPosition(pt);
GetEventHandler()->ProcessEvent(nevent2);
}
+ else if ( event.MiddleDown() )
+ {
+ wxTreeEvent nevent(wxEVT_COMMAND_TREE_ITEM_MIDDLE_CLICK, this, item);
+ nevent.m_pointDrag = CalcScrolledPosition(pt);
+ event.Skip(!GetEventHandler()->ProcessEvent(nevent));
+ }
else if ( event.LeftUp() )
{
// this facilitates multiple-item drag-and-drop
m_lastOnSame = false;
}
}
- else // !RightDown() && !LeftUp() ==> LeftDown() || LeftDClick()
+ else // !RightDown() && !MiddleDown() && !LeftUp() ==> LeftDown() || LeftDClick()
{
if ( event.LeftDown() )
{
SelectItem(GetRootItem());
}
- /* after all changes have been done to the tree control,
- * we actually redraw the tree when everything is over */
-
- if (!m_dirty) return;
- if (m_freezeCount) return;
-
- m_dirty = false;
-
- CalculatePositions();
- Refresh();
- AdjustMyScrollbars();
+ // after all changes have been done to the tree control,
+ // actually redraw the tree when everything is over
+ if (m_dirty)
+ DoDirtyProcessing();
}
void wxGenericTreeCtrl::CalculateSize( wxGenericTreeItem *item, wxDC &dc )
CalculateLevel( m_anchor, dc, 0, y ); // start recursion
}
+void wxGenericTreeCtrl::Refresh(bool eraseBackground, const wxRect *rect)
+{
+ if ( !m_freezeCount )
+ wxTreeCtrlBase::Refresh(eraseBackground, rect);
+}
+
void wxGenericTreeCtrl::RefreshSubtree(wxGenericTreeItem *item)
{
- if (m_dirty) return;
- if (m_freezeCount) return;
+ if (m_dirty || m_freezeCount)
+ return;
wxSize client = GetClientSize();
void wxGenericTreeCtrl::RefreshLine( wxGenericTreeItem *item )
{
- if (m_dirty) return;
- if (m_freezeCount) return;
+ if (m_dirty || m_freezeCount)
+ return;
wxRect rect;
CalcScrolledPosition(0, item->GetY(), NULL, &rect.y);
void wxGenericTreeCtrl::RefreshSelected()
{
- if (m_freezeCount) return;
+ if (m_freezeCount)
+ return;
// TODO: this is awfully inefficient, we should keep the list of all
// selected items internally, should be much faster
void wxGenericTreeCtrl::RefreshSelectedUnder(wxGenericTreeItem *item)
{
- if (m_freezeCount) return;
+ if (m_freezeCount)
+ return;
if ( item->IsSelected() )
RefreshLine(item);
if ( !wxWindow::SetBackgroundColour(colour) )
return false;
- if (m_freezeCount) return true;
-
Refresh();
return true;
if ( !wxWindow::SetForegroundColour(colour) )
return false;
- if (m_freezeCount) return true;
-
Refresh();
return true;
#endif // WXWIN_COMPATIBILITY_2_4
+void wxGenericTreeCtrl::DoDirtyProcessing()
+{
+ if (m_freezeCount)
+ return;
+
+ m_dirty = false;
+
+ CalculatePositions();
+ Refresh();
+ AdjustMyScrollbars();
+}
+
#endif // wxUSE_TREECTRL