]> git.saurik.com Git - wxWidgets.git/blobdiff - wxPython/contrib/gizmos/wxCode/src/treelistctrl.cpp
Use our own getters and properties for wxVisualAttributes
[wxWidgets.git] / wxPython / contrib / gizmos / wxCode / src / treelistctrl.cpp
index 5d97fe6f357ac95e9401e65d4f51ac40c5475fef..1fbe0b94e9b02a70e5a00971c90c6d7362290ca1 100644 (file)
 // headers
 // ---------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(__APPLE__)
-  #pragma implementation "treelistctrl.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -1340,7 +1336,7 @@ int wxTreeListHeaderWindow::XToCol(int x)
 
 void wxTreeListHeaderWindow::RefreshColLabel(int col)
 {
-    if ( col > GetColumnCount() )
+    if ( col >= GetColumnCount() )
         return;
     
     int x = 0;
@@ -1856,8 +1852,6 @@ bool wxTreeListMainWindow::Create (wxTreeListCtrl *parent,
                                    const wxString& name) {
 
 #ifdef __WXMAC__
-    if (style & wxTR_HAS_BUTTONS) style |= wxTR_MAC_BUTTONS;
-    if (style & wxTR_HAS_BUTTONS) style &= ~wxTR_HAS_BUTTONS;
     style &= ~wxTR_LINES_AT_ROOT;
     style |= wxTR_NO_LINES;
 
@@ -2675,7 +2669,7 @@ void wxTreeListMainWindow::SelectItem (const wxTreeItemId& itemId,
 }
 
 void wxTreeListMainWindow::SelectAll() {
-    wxCHECK_RET (HasFlag(wxTR_MULTIPLE), _T("invalid tree style"));
+    wxCHECK_RET (HasFlag(wxTR_MULTIPLE), _T("invalid tree style, must have wxTR_MULTIPLE style to select all items"));
 
     // send event to user code
     wxTreeEvent event (wxEVT_COMMAND_TREE_SEL_CHANGING, m_owner->GetId());
@@ -2696,6 +2690,7 @@ void wxTreeListMainWindow::SelectAll() {
     wxTreeItemId root = GetRootItem();
     wxTreeListItem *first = (wxTreeListItem *)GetFirstChild (root, cookie).m_pItem;
     wxTreeListItem *last = (wxTreeListItem *)GetLastChild (root, cookie).m_pItem;
+    if (!first || !last) return;
     if (!TagAllChildrenUntilLast (first, last)) {
         TagNextChildren (first, last);
     }
@@ -3026,24 +3021,34 @@ void wxTreeListMainWindow::PaintItem (wxTreeListItem *item, wxDC& dc) {
 #endif // !__WXMAC__
             dc.SetTextForeground (colTextHilight);
         }else if (item->IsSelected()) {
+#if defined(__WXGTK2__) || defined(__WXMAC__)
+        int flags = wxCONTROL_SELECTED;
+        if (m_hasFocus)
+        {
+            flags |= wxCONTROL_FOCUSED;
+#ifdef __WXMAC__
+            dc.SetTextForeground( *wxWHITE );
+#endif
+        }
+        wxRendererNative::GetDefault().DrawItemSelectionRect( m_owner, dc, wxRect( 0, item->GetY() + off_h, total_w, total_h - off_h ), flags); 
+#else
             if (!m_isDragging && m_hasFocus) {
                 dc.SetBrush (*m_hilightBrush);
-#ifndef __WXMAC__ // don't draw rect outline if we already have the background color
                 dc.SetPen (*wxBLACK_PEN);
-#endif // !__WXMAC__
             }else{
                 dc.SetBrush (*m_hilightUnfocusedBrush);
-#ifndef __WXMAC__ // don't draw rect outline if we already have the background color
                 dc.SetPen (*wxTRANSPARENT_PEN);
-#endif // !__WXMAC__
             }
             dc.SetTextForeground (colTextHilight);
+#endif // defined(__WXGTK2__) || defined(__WXMAC__)
         }else if (item == m_curItem) {
             dc.SetPen (m_hasFocus? *wxBLACK_PEN: *wxTRANSPARENT_PEN);
         }else{
             dc.SetTextForeground (colText);
         }
+#if !defined(__WXGTK2__) && !defined(__WXMAC__)
         dc.DrawRectangle (0, item->GetY() + off_h, total_w, total_h - off_h);
+#endif 
     }else{
         dc.SetTextForeground (colText);
     }
@@ -3104,24 +3109,34 @@ void wxTreeListMainWindow::PaintItem (wxTreeListItem *item, wxDC& dc) {
 #endif // !__WXMAC__
                     dc.SetTextForeground (colTextHilight);
                 }else if (item->IsSelected()) {
+#if defined(__WXGTK2__) || defined(__WXMAC__)
+                    int flags = wxCONTROL_SELECTED;
+                    if (m_hasFocus)
+                    {
+                        flags |= wxCONTROL_FOCUSED;
+#ifdef __WXMAC__
+                        dc.SetTextForeground( *wxWHITE );
+#endif
+                    }
+                    wxRendererNative::GetDefault().DrawItemSelectionRect( m_owner, dc, wxRect( 0, item->GetY() + off_h, total_w, total_h - off_h ), flags); 
+#else 
                     if (!m_isDragging && m_hasFocus) {
                         dc.SetBrush (*m_hilightBrush);
-#ifndef __WXMAC__ // don't draw rect outline if we already have the background color
                         dc.SetPen (*wxBLACK_PEN);
-#endif // !__WXMAC__
                     }else{
                         dc.SetBrush (*m_hilightUnfocusedBrush);
-#ifndef __WXMAC__ // don't draw rect outline if we already have the background color
-                      dc.SetPen (*wxTRANSPARENT_PEN);
-#endif // !__WXMAC__
+                        dc.SetPen (*wxTRANSPARENT_PEN);
                     }
                     dc.SetTextForeground (colTextHilight);
+#endif // defined(__WXGTK2__) || defined(__WXMAC__)
                 }else if (item == m_curItem) {
                     dc.SetPen (m_hasFocus? *wxBLACK_PEN: *wxTRANSPARENT_PEN);
                 }else{
                     dc.SetTextForeground (colText);
                 }
+#if !defined(__WXGTK2__) && !defined(__WXMAC__)
                 dc.DrawRectangle (text_x, item->GetY() + off_h, text_w, total_h - off_h);
+#endif
             }else{
                 dc.SetTextForeground (colText);
             }
@@ -3585,7 +3600,7 @@ void wxTreeListMainWindow::OnChar (wxKeyEvent &event) {
         default:
             if (event.GetKeyCode() >= (int)' ') {
                 if (!m_findTimer->IsRunning()) m_findStr.Clear();
-                m_findStr.Append (event.GetKeyCode());
+                m_findStr.Append ((char)event.GetKeyCode());
                 m_findTimer->Start (FIND_TIMER_TICKS, wxTIMER_ONE_SHOT);
                 wxTreeItemId prev = m_curItem? (wxTreeItemId*)m_curItem: (wxTreeItemId*)NULL;
                 while (true) {
@@ -3795,6 +3810,7 @@ void wxTreeListMainWindow::OnMouse (wxMouseEvent &event) {
 #else
         nevent.SetItem (item); // the item the drag is ended
 #endif
+        nevent.SetPoint (p);
         nevent.Veto(); // dragging must be explicit allowed!
         m_owner->GetEventHandler()->ProcessEvent (nevent);
 
@@ -4620,8 +4636,7 @@ void wxTreeListCtrl::ScrollTo(const wxTreeItemId& item)
 
 wxTreeItemId wxTreeListCtrl::HitTest(const wxPoint& pos, int& flags, int& column)
 {
-    wxPoint p = m_main_win->ScreenToClient (ClientToScreen (pos));
-    return m_main_win->HitTest (p, flags, column);
+    return m_main_win->HitTest (pos, flags, column);
 }
 
 bool wxTreeListCtrl::GetBoundingRect(const wxTreeItemId& item, wxRect& rect,
@@ -4666,6 +4681,18 @@ int wxTreeListCtrl::GetColumnCount() const
 
 void wxTreeListCtrl::SetColumnWidth(int column, int width)
 {
+    if (width == wxLIST_AUTOSIZE_USEHEADER)
+    {
+        wxFont font = m_header_win->GetFont();
+        m_header_win->GetTextExtent(m_header_win->GetColumnText(column), &width, NULL, NULL, NULL, font.Ok()? &font: NULL);
+        //search wxTreeListHeaderWindow::OnPaint to understand this:
+        width += 2*EXTRA_WIDTH + MARGIN;
+    }
+    else if (width == wxLIST_AUTOSIZE)
+    {
+        width = m_main_win->GetBestColumnWidth(column);
+    }
+    
     m_header_win->SetColumnWidth (column, width);
     m_header_win->Refresh();
 }