]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/treectrl.cpp
More stubs
[wxWidgets.git] / src / generic / treectrl.cpp
index 1e6e00823134b64895205db0f2d339208dae7731..21f04410553a5c68acb4e52316fc2326a81a079d 100644 (file)
@@ -950,7 +950,7 @@ void wxTreeCtrl::Collapse(const wxTreeItemId& itemId)
   wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_COLLAPSING, GetId() );
   event.m_item = item;
   event.SetEventObject( this );
   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;
   {
     // cancelled by program
     return;
@@ -1090,18 +1090,25 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& itemId,
     wxCHECK_RET( itemId.IsOk(), _T("invalid tree item") );
 
     bool is_single=!(GetWindowStyleFlag() & wxTR_MULTIPLE);
     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)
 
     //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;
         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;
 
     wxTreeEvent event( wxEVT_COMMAND_TREE_SEL_CHANGING, GetId() );
     event.m_item = item;
@@ -1174,14 +1181,13 @@ void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
 
     // first expand all parent branches
     wxGenericTreeItem *parent = gitem->GetParent();
 
     // first expand all parent branches
     wxGenericTreeItem *parent = gitem->GetParent();
-    while ( parent && !parent->IsExpanded() )
+    while ( parent )
     {
     {
-        Expand(parent);
-
+       Expand(parent);
         parent = parent->GetParent();
     }
 
         parent = parent->GetParent();
     }
 
-    if (parent) CalculatePositions();
+    //if (parent) CalculatePositions();
 
     ScrollTo(item);
 }
 
     ScrollTo(item);
 }
@@ -1190,11 +1196,16 @@ void wxTreeCtrl::ScrollTo(const wxTreeItemId &item)
 {
     if (!item.IsOk()) return;
 
 {
     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();
     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 );
     int start_x = 0;
     int start_y = 0;
     ViewStart( &start_x, &start_y );
@@ -1285,7 +1296,7 @@ void wxTreeCtrl::SetImageList(wxImageList *imageList)
    // May be toggle off. Then wxTreeCtrl will spread when
    // necessary (which might look ugly).
 #if 1
    // 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,
    m_lineHeight = (int)(dc.GetCharHeight() + 4);
    int
       width = 0,
@@ -1333,10 +1344,10 @@ void wxTreeCtrl::AdjustMyScrollbars()
 
 int wxTreeCtrl::GetLineHeight(wxGenericTreeItem *item) const
 {
 
 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)
 }
 
 void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
@@ -1429,9 +1440,9 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &
     item->SetCross( horizX+m_indent, y );
 
     int exposed_x = dc.LogicalToDeviceX( 0 );
     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);
     {
         int startX = horizX;
         int endX = horizX + (m_indent-5);
@@ -1516,7 +1527,7 @@ void wxTreeCtrl::DrawBorder(wxTreeItemId &item)
 
     wxGenericTreeItem *i=item.m_pItem;
 
 
     wxGenericTreeItem *i=item.m_pItem;
 
-    wxPaintDC dc(this);
+    wxClientDC dc(this);
     PrepareDC( dc );
     dc.SetLogicalFunction(wxINVERT);
 
     PrepareDC( dc );
     dc.SetLogicalFunction(wxINVERT);
 
@@ -1535,7 +1546,7 @@ void wxTreeCtrl::DrawLine(wxTreeItemId &item, bool below)
 
     wxGenericTreeItem *i=item.m_pItem;
 
 
     wxGenericTreeItem *i=item.m_pItem;
 
-    wxPaintDC dc(this);
+    wxClientDC dc(this);
     PrepareDC( dc );
     dc.SetLogicalFunction(wxINVERT);
 
     PrepareDC( dc );
     dc.SetLogicalFunction(wxINVERT);
 
@@ -1772,6 +1783,11 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event )
 
 wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& flags)
 {
 
 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 );
     wxClientDC dc(this);
     PrepareDC(dc);
     long x = dc.DeviceToLogicalX( (long)point.x );
@@ -1802,6 +1818,11 @@ void wxTreeCtrl::Edit( const wxTreeItemId& item )
     GetEventHandler()->ProcessEvent( te );
 
     if (!te.IsAllowed()) return;
     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();
 
     wxString s = m_currentEdit->GetText();
     int x = m_currentEdit->GetX();
@@ -1854,8 +1875,6 @@ void wxTreeCtrl::OnRenameAccept()
 
 void wxTreeCtrl::OnMouse( wxMouseEvent &event )
 {
 
 void wxTreeCtrl::OnMouse( wxMouseEvent &event )
 {
-    if (!event.LeftIsDown()) m_dragCount = 0;
-
     if ( !(event.LeftUp() || event.LeftDClick() || event.Dragging()) ) return;
 
     if ( !m_anchor ) return;
     if ( !(event.LeftUp() || event.LeftDClick() || event.Dragging()) ) return;
 
     if ( !m_anchor ) return;
@@ -1869,26 +1888,31 @@ void wxTreeCtrl::OnMouse( wxMouseEvent &event )
     wxGenericTreeItem *item = m_anchor->HitTest( wxPoint(x,y), this, flags);
     bool onButton = flags & wxTREE_HITTEST_ONITEMBUTTON;
 
     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 (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 (event.LeftUp() && (item == m_current) &&
         (flags & wxTREE_HITTEST_ONITEMLABEL) &&
         HasFlag(wxTR_EDIT_LABELS) )
@@ -2031,7 +2055,7 @@ void wxTreeCtrl::CalculatePositions()
     //if(GetImageList() == NULL)
     // m_lineHeight = (int)(dc.GetCharHeight() + 4);
 
     //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
 }
 
     CalculateLevel( m_anchor, dc, 0, y ); // start recursion
 }
 
@@ -2060,10 +2084,14 @@ void wxTreeCtrl::RefreshLine( wxGenericTreeItem *item )
     wxClientDC dc(this);
     PrepareDC( dc );
 
     wxClientDC dc(this);
     PrepareDC( dc );
 
+    int cw = 0;
+    int ch = 0;
+    GetClientSize( &cw, &ch );
+
     wxRect rect;
     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 );
     rect.height = GetLineHeight(item); //dc.GetCharHeight() + 6;
 
     Refresh( TRUE, &rect );