]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/treectlg.cpp
Prevent crash when m_defGridAttr is NULL
[wxWidgets.git] / src / generic / treectlg.cpp
index 0b23a9cd099b7ba0603327ba41cef08f039f8b3b..1994629da8f1d6999b60d4fabcef7a769ab690ca 100644 (file)
@@ -55,6 +55,54 @@ static const int NO_IMAGE = -1;
 
 #define PIXELS_PER_UNIT 10
 
+// ----------------------------------------------------------------------------
+// Aqua arrows
+// ----------------------------------------------------------------------------
+
+        /* XPM */
+        static char *aqua_arrow_right[] = {
+        /* columns rows colors chars-per-pixel */
+        "13 11 4 1",
+        "  c None",
+        "b c #C0C0C0",
+        "c c #707070",
+        "d c #A0A0A0",
+        /* pixels */
+        "    b        ",
+        "    ddb      ",
+        "    cccdb    ",
+        "    cccccd   ",
+        "    ccccccdb ",
+        "    ccccccccd",
+        "    ccccccdb ",
+        "    cccccb   ",
+        "    cccdb    ",
+        "    ddb      ",
+        "    b        "
+        };
+
+        /* XPM */
+        static char *aqua_arrow_down[] = {
+        /* columns rows colors chars-per-pixel */
+        "13 11 4 1",
+        "  c None",
+        "b c #C0C0C0",
+        "c c #707070",
+        "d c #A0A0A0",
+        /* pixels */
+        "             ",
+        "             ",
+        " bdcccccccdb ",
+        "  dcccccccd  ",
+        "  bcccccccb  ",
+        "   dcccccd   ",
+        "   bcccccb   ",
+        "    bcccd    ",
+        "     dcd     ",
+        "     bcb     ",
+        "      d      "
+        };
+
 // -----------------------------------------------------------------------------
 // private classes
 // -----------------------------------------------------------------------------
@@ -679,6 +727,16 @@ bool wxGenericTreeCtrl::Create(wxWindow *parent,
         style |= wxTR_AQUA_BUTTONS;
 #endif
 
+    if (style & wxTR_AQUA_BUTTONS)
+    {
+        m_arrowRight = new wxBitmap( aqua_arrow_right );
+        m_arrowDown = new wxBitmap( aqua_arrow_down );
+    }
+    else
+    {
+        m_arrowRight = NULL;
+        m_arrowDown = NULL;
+    }
 
     wxScrolledWindow::Create( parent, id, pos, size,
                               style|wxHSCROLL|wxVSCROLL, name );
@@ -708,6 +766,9 @@ wxGenericTreeCtrl::~wxGenericTreeCtrl()
 {
     delete m_hilightBrush;
     delete m_hilightUnfocusedBrush;
+    
+    if (m_arrowRight) delete m_arrowRight;
+    if (m_arrowDown) delete m_arrowDown;
 
     DeleteAllItems();
 
@@ -1140,6 +1201,11 @@ wxTreeItemId wxGenericTreeCtrl::AddRoot(const wxString& text,
 
     m_anchor = new wxGenericTreeItem((wxGenericTreeItem *)NULL, text,
                                    image, selImage, data);
+    if ( data != NULL )
+    {
+        data->m_pItem = (long) m_anchor;
+    }
+
     if (HasFlag(wxTR_HIDE_ROOT))
     {
         // if root is hidden, make sure we can navigate
@@ -1147,10 +1213,6 @@ wxTreeItemId wxGenericTreeCtrl::AddRoot(const wxString& text,
         m_anchor->SetHasPlus();
         Expand(m_anchor);
     }
-    if ( data != NULL )
-    {
-        data->m_pItem = (long) m_anchor;
-    }
 
     if (!HasFlag(wxTR_MULTIPLE))
     {
@@ -1416,7 +1478,13 @@ void wxGenericTreeCtrl::UnselectAllChildren(wxGenericTreeItem *item)
 
 void wxGenericTreeCtrl::UnselectAll()
 {
-    UnselectAllChildren((wxGenericTreeItem*) GetRootItem().m_pItem);
+    wxTreeItemId rootItem = GetRootItem();
+
+    // the tree might not have the root item at all
+    if ( rootItem )
+    {
+        UnselectAllChildren((wxGenericTreeItem*) rootItem.m_pItem);
+    }
 }
 
 // Recursive function !
@@ -2048,35 +2116,18 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level
             {
                 // draw the twisty button here
                 
-                wxPoint button[3];
-                dc.SetBrush(*m_hilightBrush);
-                
                 if (HasFlag(wxTR_AQUA_BUTTONS))
                 {
-                    dc.SetPen(*wxTRANSPARENT_PEN);
-                    
                     if (item->IsExpanded())
-                    {
-                        button[0].x = x-6;
-                        button[0].y = y_mid-2;
-                        button[1].x = x+6;
-                        button[1].y = y_mid-2;
-                        button[2].x = x;
-                        button[2].y = y_mid+7;
-                    }
+                        dc.DrawBitmap( *m_arrowDown, x-5, y_mid-6, TRUE );
                     else
-                    {
-                        button[0].y = y_mid-6;
-                        button[0].x = x-2;
-                        button[1].y = y_mid+6;
-                        button[1].x = x-2;
-                        button[2].y = y_mid;
-                        button[2].x = x+7;
-                    }
+                        dc.DrawBitmap( *m_arrowRight, x-5, y_mid-6, TRUE );
                 }
                 else
                 {
+                    dc.SetBrush(*m_hilightBrush);
                     dc.SetPen(*wxBLACK_PEN);
+                    wxPoint button[3];
 
                     if (item->IsExpanded())
                     {
@@ -2096,10 +2147,9 @@ void wxGenericTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level
                         button[2].y = y_mid;
                         button[2].x = x+3;
                     }
+                    dc.DrawPolygon(3, button);
+                    dc.SetPen(m_dottedPen);
                 }
-                dc.DrawPolygon(3, button);
-
-                dc.SetPen(m_dottedPen);
             }
             else // if (HasFlag(wxTR_HAS_BUTTONS))
             {