]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/treectrl.cpp
Unicodified wxSplitPath
[wxWidgets.git] / src / generic / treectrl.cpp
index 0bb4b72c4f6299c3c2b75c4a69bf0467da6d6201..c69ea64098cf5f01e8e7f6542e1ed336c39c47f4 100644 (file)
@@ -197,7 +197,7 @@ wxGenericTreeItem::~wxGenericTreeItem()
   delete m_data;
 
   wxASSERT_MSG( m_children.IsEmpty(),
-                "please call DeleteChildren() before deleting the item" );
+                _T("please call DeleteChildren() before deleting the item") );
 }
 
 void wxGenericTreeItem::DeleteChildren(wxTreeCtrl *tree)
@@ -287,6 +287,7 @@ wxGenericTreeItem *wxGenericTreeItem::HitTest( const wxPoint& point,
   if ((point.y > m_y) && (point.y < m_y + m_height))
   {
     // FIXME why +5?
+    //  Because that is the size of the plus sign, RR
     if ((point.x > m_xCross-5) && (point.x < m_xCross+5) &&
         (point.y > m_yCross-5) && (point.y < m_yCross+5) &&
         (IsExpanded() || HasPlus()))
@@ -295,8 +296,10 @@ wxGenericTreeItem *wxGenericTreeItem::HitTest( const wxPoint& point,
       return this;
     }
 
+    /* TODO: we should do a query here like
+         m_imageListNormal->GetSize( item->GetImage(), image_w, image_h );  */
     int w = m_width;
-    if (m_image != -1) w += 20;
+    if (m_image != -1) w += 24;
 
     if ((point.x > m_x) && (point.x < m_x+w))
     {
@@ -405,7 +408,7 @@ void wxTreeCtrl::SetIndent(unsigned int indent)
 
 size_t wxTreeCtrl::GetChildrenCount(const wxTreeItemId& item, bool recursively)
 {
-  wxCHECK_MSG( item.IsOk(), 0u, "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), 0u, _T("invalid tree item") );
 
   return item.m_pItem->GetChildrenCount(recursively);
 }
@@ -416,35 +419,35 @@ size_t wxTreeCtrl::GetChildrenCount(const wxTreeItemId& item, bool recursively)
 
 wxString wxTreeCtrl::GetItemText(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), "", "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), _T(""), _T("invalid tree item") );
 
   return item.m_pItem->GetText();
 }
 
 int wxTreeCtrl::GetItemImage(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), -1, "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), -1, _T("invalid tree item") );
 
   return item.m_pItem->GetImage();
 }
 
 int wxTreeCtrl::GetItemSelectedImage(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), -1, "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), -1, _T("invalid tree item") );
 
   return item.m_pItem->GetSelectedImage();
 }
 
 wxTreeItemData *wxTreeCtrl::GetItemData(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), NULL, "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), NULL, _T("invalid tree item") );
 
   return item.m_pItem->GetData();
 }
 
 void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text)
 {
-  wxCHECK_RET( item.IsOk(), "invalid tree item" );
+  wxCHECK_RET( item.IsOk(), _T("invalid tree item") );
 
   wxClientDC dc(this);
   wxGenericTreeItem *pItem = item.m_pItem;
@@ -454,7 +457,7 @@ void wxTreeCtrl::SetItemText(const wxTreeItemId& item, const wxString& text)
 
 void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image)
 {
-  wxCHECK_RET( item.IsOk(), "invalid tree item" );
+  wxCHECK_RET( item.IsOk(), _T("invalid tree item") );
 
   wxGenericTreeItem *pItem = item.m_pItem;
   pItem->SetImage(image);
@@ -463,7 +466,7 @@ void wxTreeCtrl::SetItemImage(const wxTreeItemId& item, int image)
 
 void wxTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image)
 {
-  wxCHECK_RET( item.IsOk(), "invalid tree item" );
+  wxCHECK_RET( item.IsOk(), _T("invalid tree item") );
 
   wxGenericTreeItem *pItem = item.m_pItem;
   pItem->SetSelectedImage(image);
@@ -472,14 +475,14 @@ void wxTreeCtrl::SetItemSelectedImage(const wxTreeItemId& item, int image)
 
 void wxTreeCtrl::SetItemData(const wxTreeItemId& item, wxTreeItemData *data)
 {
-  wxCHECK_RET( item.IsOk(), "invalid tree item" );
+  wxCHECK_RET( item.IsOk(), _T("invalid tree item") );
 
   item.m_pItem->SetData(data);
 }
 
 void wxTreeCtrl::SetItemHasChildren(const wxTreeItemId& item, bool has)
 {
-  wxCHECK_RET( item.IsOk(), "invalid tree item" );
+  wxCHECK_RET( item.IsOk(), _T("invalid tree item") );
 
   wxGenericTreeItem *pItem = item.m_pItem;
   pItem->SetHasPlus(has);
@@ -488,7 +491,7 @@ void wxTreeCtrl::SetItemHasChildren(const wxTreeItemId& item, bool has)
 
 void wxTreeCtrl::SetItemBold(const wxTreeItemId& item, bool bold)
 {
-  wxCHECK_RET( item.IsOk(), "invalid tree item" );
+  wxCHECK_RET( item.IsOk(), _T("invalid tree item") );
 
   // avoid redrawing the tree if no real change
   wxGenericTreeItem *pItem = item.m_pItem;
@@ -505,35 +508,35 @@ void wxTreeCtrl::SetItemBold(const wxTreeItemId& item, bool bold)
 
 bool wxTreeCtrl::IsVisible(const wxTreeItemId& WXUNUSED(item)) const
 {
-  wxFAIL_MSG("not implemented");
+  wxFAIL_MSG(_T("not implemented"));
 
   return TRUE;
 }
 
 bool wxTreeCtrl::ItemHasChildren(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), FALSE, "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), FALSE, _T("invalid tree item") );
 
   return !item.m_pItem->GetChildren().IsEmpty();
 }
 
 bool wxTreeCtrl::IsExpanded(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), FALSE, "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), FALSE, _T("invalid tree item") );
 
   return item.m_pItem->IsExpanded();
 }
 
 bool wxTreeCtrl::IsSelected(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), FALSE, "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), FALSE, _T("invalid tree item") );
 
   return item.m_pItem->HasHilight();
 }
 
 bool wxTreeCtrl::IsBold(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), FALSE, "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), FALSE, _T("invalid tree item") );
 
   return item.m_pItem->IsBold();
 }
@@ -544,14 +547,14 @@ bool wxTreeCtrl::IsBold(const wxTreeItemId& item) const
 
 wxTreeItemId wxTreeCtrl::GetParent(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
 
   return item.m_pItem->GetParent();
 }
 
 wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item, long& cookie) const
 {
-  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
 
   cookie = 0;
   return GetNextChild(item, cookie);
@@ -559,7 +562,7 @@ wxTreeItemId wxTreeCtrl::GetFirstChild(const wxTreeItemId& item, long& cookie) c
 
 wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& item, long& cookie) const
 {
-  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
 
   wxArrayTreeItems& children = item.m_pItem->GetChildren();
   if ( (size_t)cookie < children.Count() )
@@ -575,7 +578,7 @@ wxTreeItemId wxTreeCtrl::GetNextChild(const wxTreeItemId& item, long& cookie) co
 
 wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
 
   wxArrayTreeItems& children = item.m_pItem->GetChildren();
   return (children.IsEmpty() ? wxTreeItemId() : wxTreeItemId(children.Last()));
@@ -583,7 +586,7 @@ wxTreeItemId wxTreeCtrl::GetLastChild(const wxTreeItemId& item) const
 
 wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
 
   wxGenericTreeItem *i = item.m_pItem;
   wxGenericTreeItem *parent = i->GetParent();
@@ -603,7 +606,7 @@ wxTreeItemId wxTreeCtrl::GetNextSibling(const wxTreeItemId& item) const
 
 wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
 
   wxGenericTreeItem *i = item.m_pItem;
   wxGenericTreeItem *parent = i->GetParent();
@@ -623,25 +626,25 @@ wxTreeItemId wxTreeCtrl::GetPrevSibling(const wxTreeItemId& item) const
 
 wxTreeItemId wxTreeCtrl::GetFirstVisibleItem() const
 {
-  wxFAIL_MSG("not implemented");
+  wxFAIL_MSG(_T("not implemented"));
 
   return wxTreeItemId();
 }
 
 wxTreeItemId wxTreeCtrl::GetNextVisible(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
 
-  wxFAIL_MSG("not implemented");
+  wxFAIL_MSG(_T("not implemented"));
 
   return wxTreeItemId();
 }
 
 wxTreeItemId wxTreeCtrl::GetPrevVisible(const wxTreeItemId& item) const
 {
-  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), "invalid tree item" );
+  wxCHECK_MSG( item.IsOk(), wxTreeItemId(), _T("invalid tree item") );
 
-  wxFAIL_MSG("not implemented");
+  wxFAIL_MSG(_T("not implemented"));
 
   return wxTreeItemId();
 }
@@ -685,7 +688,7 @@ wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text,
                                  int image, int selImage,
                                  wxTreeItemData *data)
 {
-  wxCHECK_MSG( !m_anchor, wxTreeItemId(), "tree can have only one root" );
+  wxCHECK_MSG( !m_anchor, wxTreeItemId(), _T("tree can have only one root") );
 
   wxClientDC dc(this);
   m_anchor = new wxGenericTreeItem((wxGenericTreeItem *)NULL, text, dc,
@@ -724,7 +727,7 @@ wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parentId,
 
   int index = parent->GetChildren().Index(idPrevious.m_pItem);
   wxASSERT_MSG( index != wxNOT_FOUND,
-                "previous item in wxTreeCtrl::InsertItem() is not a sibling" );
+                _T("previous item in wxTreeCtrl::InsertItem() is not a sibling") );
   return DoInsertItem(parentId, (size_t)index, text, image, selImage, data);
 }
 
@@ -951,27 +954,27 @@ void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
 
 void wxTreeCtrl::ScrollTo(const wxTreeItemId& WXUNUSED(item))
 {
-    wxFAIL_MSG("not implemented");
+    wxFAIL_MSG(_T("not implemented"));
 }
 
 wxTextCtrl *wxTreeCtrl::EditLabel( const wxTreeItemId& WXUNUSED(item),
                                    wxClassInfo* WXUNUSED(textCtrlClass) )
 {
-    wxFAIL_MSG("not implemented");
+    wxFAIL_MSG(_T("not implemented"));
 
     return (wxTextCtrl*)NULL;
 }
 
 wxTextCtrl *wxTreeCtrl::GetEditControl() const
 {
-    wxFAIL_MSG("not implemented");
+    wxFAIL_MSG(_T("not implemented"));
 
     return (wxTextCtrl*)NULL;
 }
 
 void wxTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), bool WXUNUSED(discardChanges))
 {
-    wxFAIL_MSG("not implemented");
+    wxFAIL_MSG(_T("not implemented"));
 }
 
 // FIXME: tree sorting functions are not reentrant and not MT-safe!
@@ -980,7 +983,7 @@ static wxTreeCtrl *s_treeBeingSorted = NULL;
 static int tree_ctrl_compare_func(wxGenericTreeItem **item1,
                                   wxGenericTreeItem **item2)
 {
-    wxCHECK_MSG( s_treeBeingSorted, 0, "bug in wxTreeCtrl::SortChildren()" );
+    wxCHECK_MSG( s_treeBeingSorted, 0, _T("bug in wxTreeCtrl::SortChildren()") );
 
     return s_treeBeingSorted->OnCompareItems(*item1, *item2);
 }
@@ -988,17 +991,17 @@ static int tree_ctrl_compare_func(wxGenericTreeItem **item1,
 int wxTreeCtrl::OnCompareItems(const wxTreeItemId& item1,
                                const wxTreeItemId& item2)
 {
-    return strcmp(GetItemText(item1), GetItemText(item2));
+    return wxStrcmp(GetItemText(item1), GetItemText(item2));
 }
 
 void wxTreeCtrl::SortChildren(const wxTreeItemId& itemId)
 {
-    wxCHECK_RET( itemId.IsOk(), "invalid tree item" );
+    wxCHECK_RET( itemId.IsOk(), _T("invalid tree item") );
 
     wxGenericTreeItem *item = itemId.m_pItem;
 
     wxCHECK_RET( !s_treeBeingSorted,
-                 "wxTreeCtrl::SortChildren is not reentrant" );
+                 _T("wxTreeCtrl::SortChildren is not reentrant") );
 
     wxArrayTreeItems& children = item->GetChildren();
     if ( children.Count() > 1 )
@@ -1024,7 +1027,21 @@ wxImageList *wxTreeCtrl::GetStateImageList() const
 
 void wxTreeCtrl::SetImageList(wxImageList *imageList)
 {
-    m_imageListNormal = imageList;
+   m_imageListNormal = imageList;
+   // calculate a m_lineHeight value from the image sizes
+   wxPaintDC dc(this);
+   PrepareDC( dc );
+   m_lineHeight = (int)(dc.GetCharHeight() + 4);
+   int
+      width = 0,
+      height = 0,
+      n = m_imageListNormal->GetImageCount();
+   for(int i = 0; i < n ; i++)
+   {
+      m_imageListNormal->GetSize(i, width, height);
+      height += height/5;  //20% extra spacing
+      if(height > m_lineHeight) m_lineHeight = height;
+   }
 }
 
 void wxTreeCtrl::SetStateImageList(wxImageList *imageList)
@@ -1075,7 +1092,7 @@ void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
         }
         else
         {
-            wxFAIL_MSG("wxDC::GetFont() failed!");
+            wxFAIL_MSG(_T("wxDC::GetFont() failed!"));
         }
     }
 
@@ -1096,27 +1113,33 @@ void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
         image_w += 4;
     }
 
-    dc.DrawRectangle( item->GetX()-2, item->GetY()-2, image_w+text_w+4, text_h+4 );
+    int total_h = (image_h > text_h) ? image_h : text_h;
+    if(m_lineHeight > total_h) total_h = m_lineHeight;
+    
+    dc.DrawRectangle( item->GetX()-2, item->GetY(), image_w+text_w+4, total_h );
 
     if ((item->IsExpanded()) && (item->GetSelectedImage() != -1))
     {
-        dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, text_h );
+        dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, total_h );
         m_imageListNormal->Draw( item->GetSelectedImage(), dc,
-                                 item->GetX(), item->GetY()-1,
+                                 item->GetX(),
+                                 item->GetY() +((total_h > image_h)?((total_h-image_h)/2):0),
                                  wxIMAGELIST_DRAW_TRANSPARENT );
         dc.DestroyClippingRegion();
     }
     else if (item->GetImage() != -1)
     {
-        dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, text_h );
+        dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, total_h );
         m_imageListNormal->Draw( item->GetImage(), dc,
-                                 item->GetX(), item->GetY()-1,
+                                 item->GetX(),
+                                 item->GetY() +((total_h > image_h)?((total_h-image_h)/2):0),
                                  wxIMAGELIST_DRAW_TRANSPARENT );
         dc.DestroyClippingRegion();
     }
 
     dc.SetBackgroundMode(wxTRANSPARENT);
-    dc.DrawText( item->GetText(), image_w + item->GetX(), item->GetY() );
+    dc.DrawText( item->GetText(), image_w + item->GetX(), item->GetY()
+                 + ((total_h > text_h) ? (total_h - text_h)/2 : 0));
 
     // restore normal font for bold items
     if (fontOld.Ok())
@@ -1130,7 +1153,7 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &
     int horizX = level*m_indent;
 
     item->SetX( horizX+33 );
-    item->SetY( y-m_lineHeight/3 );
+    item->SetY( y-m_lineHeight/2 );
     item->SetHeight( m_lineHeight );
 
     item->SetCross( horizX+15, y );
@@ -1159,9 +1182,9 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &
             dc.DrawLine( horizX+13, y, horizX+18, y );
 
             if (!item->IsExpanded())
-        {
+            {
                 dc.DrawLine( horizX+15, y-2, horizX+15, y+3 );
-        }
+            }
         }
 
         if (item->HasHilight())
@@ -1228,7 +1251,8 @@ void wxTreeCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) )
     dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ) );
 
     dc.SetPen( m_dottedPen );
-    m_lineHeight = (int)(dc.GetCharHeight() + 4);
+    if(GetImageList() == NULL)
+       m_lineHeight = (int)(dc.GetCharHeight() + 4);
 
     int y = m_lineHeight / 2 + 2;
     PaintLevel( m_anchor, dc, 0, y );
@@ -1423,8 +1447,13 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event )
 
 wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& WXUNUSED(flags))
 {
+    wxClientDC dc(this);
+    PrepareDC(dc);
+    long x = dc.DeviceToLogicalX( (long)point.x );
+    long y = dc.DeviceToLogicalY( (long)point.y );
+
     bool onButton = FALSE;
-    return m_anchor->HitTest( point, onButton );
+    return m_anchor->HitTest( wxPoint(x, y), onButton );
 }
 
 void wxTreeCtrl::OnMouse( wxMouseEvent &event )
@@ -1503,7 +1532,7 @@ void wxTreeCtrl::CalculateLevel( wxGenericTreeItem *item, wxDC &dc, int level, i
     int horizX = level*m_indent;
 
     item->SetX( horizX+33 );
-    item->SetY( y-m_lineHeight/3-2 );
+    item->SetY( y-m_lineHeight/2 );
     item->SetHeight( m_lineHeight );
 
     if ( !item->IsExpanded() )
@@ -1531,7 +1560,8 @@ void wxTreeCtrl::CalculatePositions()
     dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_DEFAULT_GUI_FONT ) );
 
     dc.SetPen( m_dottedPen );
-    m_lineHeight = (int)(dc.GetCharHeight() + 4);
+    if(GetImageList() == NULL)
+       m_lineHeight = (int)(dc.GetCharHeight() + 4);
 
     int y = m_lineHeight / 2 + 2;
     CalculateLevel( m_anchor, dc, 0, y ); // start recursion