]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
added ScrollLines/Pages
[wxWidgets.git] / src / generic / listctrl.cpp
index 23f67b2520cc17be46a53d9fe52d387851b065da..ded1c6718d076bc10e83d707f9d7299842776e48 100644 (file)
@@ -417,10 +417,10 @@ private:
     // get the mode (i.e. style)  of the list control
     inline int GetMode() const;
 
-    void SetAttributes(wxDC *dc,
+    // prepare the DC for drawing with these item's attributes, return true if
+    // we need to draw the items background to highlight it, false otherwise
+    bool SetAttributes(wxDC *dc,
                        const wxListItemAttr *attr,
-                       const wxColour& colText,
-                       const wxFont& font,
                        bool highlight);
 
     // these are only used by GetImage/SetImage above, we don't support images
@@ -1518,32 +1518,68 @@ void wxListLineData::SetAttr(wxListItemAttr *attr)
     item->SetAttr(attr);
 }
 
-void wxListLineData::SetAttributes(wxDC *dc,
+bool wxListLineData::SetAttributes(wxDC *dc,
                                    const wxListItemAttr *attr,
-                                   const wxColour& colText,
-                                   const wxFont& font,
-                                   bool highlight)
+                                   bool highlighted)
 {
-    // don't use foregroud colour for drawing highlighted items - this might
+    wxWindow *listctrl = m_owner->GetParent();
+
+    // fg colour
+
+    // don't use foreground colour for drawing highlighted items - this might
     // make them completely invisible (and there is no way to do bit
     // arithmetics on wxColour, unfortunately)
-    if ( !highlight && attr && attr->HasTextColour() )
+    wxColour colText;
+    if ( highlighted )
     {
-        dc->SetTextForeground(attr->GetTextColour());
+        colText = wxSystemSettings::GetSystemColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
     }
     else
     {
-        dc->SetTextForeground(colText);
+        if ( attr && attr->HasTextColour() )
+        {
+            colText = attr->GetTextColour();
+        }
+        else
+        {
+            colText = listctrl->GetForegroundColour();
+        }
     }
 
+    dc->SetTextForeground(colText);
+
+    // font
+    wxFont font;
     if ( attr && attr->HasFont() )
     {
-        dc->SetFont(attr->GetFont());
+        font = attr->GetFont();
     }
     else
     {
-        dc->SetFont(font);
+        font = listctrl->GetFont();
     }
+
+    dc->SetFont(font);
+
+    // bg colour
+    bool hasBgCol = attr && attr->HasBackgroundColour();
+    if ( highlighted || hasBgCol )
+    {
+        if ( highlighted )
+        {
+            dc->SetBrush( *m_owner->m_highlightBrush );
+        }
+        else
+        {
+            dc->SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID));
+        }
+
+        dc->SetPen( *wxTRANSPARENT_PEN );
+
+        return TRUE;
+    }
+
+    return FALSE;
 }
 
 void wxListLineData::Draw( wxDC *dc )
@@ -1551,6 +1587,15 @@ void wxListLineData::Draw( wxDC *dc )
     wxListItemDataList::Node *node = m_items.GetFirst();
     wxCHECK_RET( node, _T("no subitems at all??") );
 
+    bool highlighted = IsHighlighted();
+
+    wxListItemAttr *attr = GetAttr();
+
+    if ( SetAttributes(dc, attr, highlighted) )
+    {
+        dc->DrawRectangle( m_gi->m_rectHighlight );
+    }
+
     wxListItemData *item = node->GetData();
     if (item->HasImage())
     {
@@ -1575,43 +1620,12 @@ void wxListLineData::DrawInReportMode( wxDC *dc,
     if ( !IsVirtual() )
         highlighted = m_highlighted;
 
-    // default foreground colour
-    wxWindow *listctrl = m_owner->GetParent();
-    wxColour colText;
-    if ( highlighted )
-    {
-        colText = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_HIGHLIGHTTEXT );
-    }
-    else
-    {
-        colText = listctrl->GetForegroundColour();
-    }
-
-    // default font
-    wxFont font = listctrl->GetFont();
-
     // TODO: later we should support setting different attributes for
     //       different columns - to do it, just add "col" argument to
-    //       GetAttr() and move this code into the loop below
+    //       GetAttr() and move these lines into the loop below
     wxListItemAttr *attr = GetAttr();
-    SetAttributes(dc, attr, colText, font, highlighted);
-
-    bool hasBgCol = attr && attr->HasBackgroundColour();
-    if ( highlighted || hasBgCol )
+    if ( SetAttributes(dc, attr, highlighted) )
     {
-        if ( highlighted )
-        {
-            dc->SetBrush( *m_owner->m_highlightBrush );
-        }
-        else
-        {
-            if ( hasBgCol )
-                dc->SetBrush(wxBrush(attr->GetBackgroundColour(), wxSOLID));
-            else
-                dc->SetBrush( * wxWHITE_BRUSH );
-        }
-
-        dc->SetPen( * wxTRANSPARENT_PEN );
         dc->DrawRectangle( rectHL );
     }
 
@@ -3813,10 +3827,16 @@ void wxListMainWindow::DeleteItem( long lindex )
 
     size_t index = (size_t)lindex;
 
-    // select the next item when the selected one is deleted
-    if ( m_current >= index )
+    // we don't need to adjust the index for the previous items
+    if ( HasCurrent() && m_current >= index )
     {
-        m_current--;
+        // if the current item is being deleted, we want the next one to
+        // become selected - unless there is no next one - so don't adjust
+        // m_current in this case
+        if ( m_current != index || m_current == count - 1 )
+        {
+            m_current--;
+        }
     }
 
     if ( InReportView() )
@@ -4372,36 +4392,35 @@ void wxListCtrl::SetWindowStyleFlag( long flag )
     {
         m_mainWin->DeleteEverything();
 
-        int width = 0;
-        int height = 0;
-        GetClientSize( &width, &height );
+        // has the header visibility changed?
+        bool hasHeader = HasFlag(wxLC_REPORT) && !HasFlag(wxLC_NO_HEADER),
+             willHaveHeader = (flag & wxLC_REPORT) && !(flag & wxLC_NO_HEADER);
 
-        if (flag & wxLC_REPORT)
+        if ( hasHeader != willHaveHeader )
         {
-            if (!HasFlag(wxLC_REPORT))
+            // toggle it
+            if ( hasHeader )
+            {
+                if ( m_headerWin )
+                {
+                    // don't delete, just hide, as we can reuse it later
+                    m_headerWin->Show(FALSE);
+                }
+                //else: nothing to do
+            }
+            else // must show header
             {
                 if (!m_headerWin)
                 {
                     CreateHeaderWindow();
-
-                    if (HasFlag(wxLC_NO_HEADER))
-                        m_headerWin->Show( FALSE );
                 }
-                else
+                else // already have it, just show
                 {
-                    if (flag & wxLC_NO_HEADER)
-                        m_headerWin->Show( FALSE );
-                    else
-                        m_headerWin->Show( TRUE );
+                    m_headerWin->Show( TRUE );
                 }
             }
-        }
-        else // !report
-        {
-            if ( m_mainWin->HasHeader() )
-            {
-                m_headerWin->Show( FALSE );
-            }
+
+            ResizeReportView(willHaveHeader);
         }
     }
 
@@ -4792,10 +4811,17 @@ void wxListCtrl::OnSize(wxSizeEvent& event)
     if ( !m_mainWin )
         return;
 
+    ResizeReportView(m_mainWin->HasHeader());
+
+    m_mainWin->RecalculatePositions();
+}
+
+void wxListCtrl::ResizeReportView(bool showHeader)
+{
     int cw, ch;
     GetClientSize( &cw, &ch );
 
-    if ( m_mainWin->HasHeader() )
+    if ( showHeader )
     {
         m_headerWin->SetSize( 0, 0, cw, HEADER_HEIGHT );
         m_mainWin->SetSize( 0, HEADER_HEIGHT + 1, cw, ch - HEADER_HEIGHT - 1 );
@@ -4804,8 +4830,6 @@ void wxListCtrl::OnSize(wxSizeEvent& event)
     {
         m_mainWin->SetSize( 0, 0, cw, ch );
     }
-
-    m_mainWin->RecalculatePositions();
 }
 
 void wxListCtrl::OnIdle( wxIdleEvent & event )