wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_COLLAPSING, GetId() );
event.m_item = item;
event.SetEventObject( this );
- if ( ProcessEvent( event ) && event.m_code )
+ if ( ProcessEvent( event ) && !event.IsAllowed() )
{
// cancelled by program
return;
wxCHECK_RET( itemId.IsOk(), _T("invalid tree item") );
bool is_single=!(GetWindowStyleFlag() & wxTR_MULTIPLE);
+ wxGenericTreeItem *item = itemId.m_pItem;
//wxCHECK_RET( ( (!unselect_others) && is_single),
// _T("this is a single selection tree") );
// to keep going anyhow !!!
if (is_single)
- {
+ {
+ if (item->HasHilight()) return; // nothing to do
unselect_others=TRUE;
extended_select=FALSE;
- }
-
- wxGenericTreeItem *item = itemId.m_pItem;
+ }
+ else // check if selection will really change
+ if (unselect_others && item->HasHilight())
+ {
+ // selection change if there is more than one item currently selected
+ wxArrayTreeItemIds selected_items;
+ if (GetSelections(selected_items)==1) return;
+ }
wxTreeEvent event( wxEVT_COMMAND_TREE_SEL_CHANGING, GetId() );
event.m_item = item;
// first expand all parent branches
wxGenericTreeItem *parent = gitem->GetParent();
- while ( parent && !parent->IsExpanded() )
+ while ( parent )
{
- Expand(parent);
-
+ Expand(parent);
parent = parent->GetParent();
}
- if (parent) CalculatePositions();
+ //if (parent) CalculatePositions();
ScrollTo(item);
}
{
if (!item.IsOk()) return;
+ // We have to call this here because the label in
+ // question might just have been added and no screen
+ // update taken place.
+ if (m_dirty) wxYield();
+
wxGenericTreeItem *gitem = item.m_pItem;
// now scroll to the item
int item_y = gitem->GetY();
-
+
int start_x = 0;
int start_y = 0;
ViewStart( &start_x, &start_y );
// May be toggle off. Then wxTreeCtrl will spread when
// necessary (which might look ugly).
#if 1
- wxPaintDC dc(this);
+ wxClientDC dc(this);
m_lineHeight = (int)(dc.GetCharHeight() + 4);
int
width = 0,
int wxTreeCtrl::GetLineHeight(wxGenericTreeItem *item) const
{
- if (GetWindowStyleFlag() & wxTR_HAS_VARIABLE_ROW_HEIGHT)
- return item->GetHeight();
- else
- return m_lineHeight;
+ if (GetWindowStyleFlag() & wxTR_HAS_VARIABLE_ROW_HEIGHT)
+ return item->GetHeight();
+ else
+ return m_lineHeight;
}
void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
item->SetCross( horizX+m_indent, y );
int exposed_x = dc.LogicalToDeviceX( 0 );
- int exposed_y = dc.LogicalToDeviceY( item->GetY()-2 );
+ int exposed_y = dc.LogicalToDeviceY( item->GetY() );
- if (IsExposed( exposed_x, exposed_y, 10000, GetLineHeight(item)+4 )) // 10000 = very much
+ if (IsExposed( exposed_x, exposed_y, 10000, GetLineHeight(item) )) // 10000 = very much
{
int startX = horizX;
int endX = horizX + (m_indent-5);
wxGenericTreeItem *i=item.m_pItem;
- wxPaintDC dc(this);
+ wxClientDC dc(this);
PrepareDC( dc );
dc.SetLogicalFunction(wxINVERT);
wxGenericTreeItem *i=item.m_pItem;
- wxPaintDC dc(this);
+ wxClientDC dc(this);
PrepareDC( dc );
dc.SetLogicalFunction(wxINVERT);
wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
{
+ // We have to call this here because the label in
+ // question might just have been added and no screen
+ // update taken place.
+ if (m_dirty) wxYield();
+
wxClientDC dc(this);
PrepareDC(dc);
long x = dc.DeviceToLogicalX( (long)point.x );
GetEventHandler()->ProcessEvent( te );
if (!te.IsAllowed()) return;
+
+ // We have to call this here because the label in
+ // question might just have been added and no screen
+ // update taken place.
+ if (m_dirty) wxYield();
wxString s = m_currentEdit->GetText();
int x = m_currentEdit->GetX();
void wxTreeCtrl::OnMouse( wxMouseEvent &event )
{
- if (!event.LeftIsDown()) m_dragCount = 0;
-
if ( !(event.LeftUp() || event.LeftDClick() || event.Dragging()) ) return;
if ( !m_anchor ) return;
wxGenericTreeItem *item = m_anchor->HitTest( wxPoint(x,y), this, flags);
bool onButton = flags & wxTREE_HITTEST_ONITEMBUTTON;
- if (item == NULL) return; /* we hit the blank area */
-
if (event.Dragging())
{
- if (m_dragCount == 2) /* small drag latency (3?) */
- {
- m_dragCount = 0;
-
- wxTreeEvent nevent(wxEVT_COMMAND_TREE_BEGIN_DRAG, GetId());
- nevent.m_item = m_current;
- nevent.SetEventObject(this);
- GetEventHandler()->ProcessEvent(nevent);
- }
- else
- {
- m_dragCount++;
- }
- return;
+ if (m_dragCount == 0)
+ m_dragStart = wxPoint(x,y);
+
+ m_dragCount++;
+
+ if (m_dragCount != 3) return;
+
+ int command = wxEVT_COMMAND_TREE_BEGIN_DRAG;
+ if (event.RightIsDown()) command = wxEVT_COMMAND_TREE_BEGIN_RDRAG;
+
+ wxTreeEvent nevent( command, GetId() );
+ nevent.m_item = m_current;
+ nevent.SetEventObject(this);
+ GetEventHandler()->ProcessEvent(nevent);
+ return;
+ }
+ else
+ {
+ m_dragCount = 0;
}
+ if (item == NULL) return; /* we hit the blank area */
+
if (event.LeftUp() && (item == m_current) &&
(flags & wxTREE_HITTEST_ONITEMLABEL) &&
HasFlag(wxTR_EDIT_LABELS) )
//if(GetImageList() == NULL)
// m_lineHeight = (int)(dc.GetCharHeight() + 4);
- int y = 2; //GetLineHeight(m_anchor) / 2 + 2;
+ int y = 2;
CalculateLevel( m_anchor, dc, 0, y ); // start recursion
}
wxClientDC dc(this);
PrepareDC( dc );
+ int cw = 0;
+ int ch = 0;
+ GetClientSize( &cw, &ch );
+
wxRect rect;
- rect.x = dc.LogicalToDeviceX( item->GetX() - 2 );
- rect.y = dc.LogicalToDeviceY( item->GetY());
- rect.width = 1000;
+ rect.x = dc.LogicalToDeviceX( 0 );
+ rect.y = dc.LogicalToDeviceY( item->GetY() );
+ rect.width = cw;
rect.height = GetLineHeight(item); //dc.GetCharHeight() + 6;
Refresh( TRUE, &rect );