]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
made wxFFile a bit more safe: don't crash when Tell() and Length() are called on...
[wxWidgets.git] / src / generic / listctrl.cpp
index ef36a4b8370d4c27d3139848c4fe62322758e9af..394e27505cde8397c53863c66c1ed48cf09b144b 100644 (file)
@@ -106,9 +106,7 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_CACHE_HINT)
 // // the height of the header window (FIXME: should depend on its font!)
 // static const int HEADER_HEIGHT = 23;
 
 // // the height of the header window (FIXME: should depend on its font!)
 // static const int HEADER_HEIGHT = 23;
 
-// the scrollbar units
 static const int SCROLL_UNIT_X = 15;
 static const int SCROLL_UNIT_X = 15;
-static const int SCROLL_UNIT_Y = 15;
 
 // the spacing between the lines (in report mode)
 static const int LINE_SPACING = 0;
 
 // the spacing between the lines (in report mode)
 static const int LINE_SPACING = 0;
@@ -1147,8 +1145,6 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
             else // has label
             {
                 dc->GetTextExtent( s, &lw, &lh );
             else // has label
             {
                 dc->GetTextExtent( s, &lw, &lh );
-                if (lh < SCROLL_UNIT_Y)
-                    lh = SCROLL_UNIT_Y;
                 lw += EXTRA_WIDTH;
                 lh += EXTRA_HEIGHT;
 
                 lw += EXTRA_WIDTH;
                 lh += EXTRA_HEIGHT;
 
@@ -1189,8 +1185,6 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
             s = item->GetTextForMeasuring();
 
             dc->GetTextExtent( s, &lw, &lh );
             s = item->GetTextForMeasuring();
 
             dc->GetTextExtent( s, &lw, &lh );
-            if (lh < SCROLL_UNIT_Y)
-                lh = SCROLL_UNIT_Y;
             lw += EXTRA_WIDTH;
             lh += EXTRA_HEIGHT;
 
             lw += EXTRA_WIDTH;
             lh += EXTRA_HEIGHT;
 
@@ -2199,7 +2193,7 @@ wxListMainWindow::wxListMainWindow( wxWindow *parent,
     wxSize sz = size;
     sz.y = 25;
 
     wxSize sz = size;
     sz.y = 25;
 
-    SetScrollbars( SCROLL_UNIT_X, SCROLL_UNIT_Y, 0, 0, 0, 0 );
+    SetScrollbars( 0, 0, 0, 0, 0, 0 );
 
     SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX ) );
 }
 
     SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX ) );
 }
@@ -2267,8 +2261,6 @@ wxListLineData *wxListMainWindow::GetDummyLine() const
 
 wxCoord wxListMainWindow::GetLineHeight() const
 {
 
 wxCoord wxListMainWindow::GetLineHeight() const
 {
-    wxASSERT_MSG( HasFlag(wxLC_REPORT), _T("only works in report mode") );
-
     // we cache the line height as calling GetTextExtent() is slow
     if ( !m_lineHeight )
     {
     // we cache the line height as calling GetTextExtent() is slow
     if ( !m_lineHeight )
     {
@@ -2280,9 +2272,6 @@ wxCoord wxListMainWindow::GetLineHeight() const
         wxCoord y;
         dc.GetTextExtent(_T("H"), NULL, &y);
 
         wxCoord y;
         dc.GetTextExtent(_T("H"), NULL, &y);
 
-        if ( y < SCROLL_UNIT_Y )
-            y = SCROLL_UNIT_Y;
-
         if ( m_small_image_list && m_small_image_list->GetImageCount() )
         {
             int iw = 0;
         if ( m_small_image_list && m_small_image_list->GetImageCount() )
         {
             int iw = 0;
@@ -2682,7 +2671,6 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
         {
             wxPen pen(GetRuleColour(), 1, wxSOLID);
 
         {
             wxPen pen(GetRuleColour(), 1, wxSOLID);
 
-            int col = 0;
             wxRect firstItemRect;
             wxRect lastItemRect;
             GetItemRect(visibleFrom, firstItemRect);
             wxRect firstItemRect;
             wxRect lastItemRect;
             GetItemRect(visibleFrom, firstItemRect);
@@ -2690,7 +2678,7 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
             int x = firstItemRect.GetX();
             dc.SetPen(pen);
             dc.SetBrush(* wxTRANSPARENT_BRUSH);
             int x = firstItemRect.GetX();
             dc.SetPen(pen);
             dc.SetBrush(* wxTRANSPARENT_BRUSH);
-            for (col = 0; col < GetColumnCount(); col++)
+            for (int col = 0; col < GetColumnCount(); col++)
             {
                 int colWidth = GetColumnWidth(col);
                 x += colWidth;
             {
                 int colWidth = GetColumnWidth(col);
                 x += colWidth;
@@ -2834,7 +2822,7 @@ bool wxListMainWindow::OnRenameAccept(size_t itemEdit, const wxString& value)
                 le.IsAllowed();
 }
 
                 le.IsAllowed();
 }
 
-void wxListMainWindow::OnRenameCancelled(size_t WXUNUSED(itemEdit))
+void wxListMainWindow::OnRenameCancelled(size_t itemEdit)
 {
     // let owner know that the edit was cancelled
     wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() );
 {
     // let owner know that the edit was cancelled
     wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() );
@@ -3037,8 +3025,10 @@ void wxListMainWindow::MoveToItem(size_t item)
     int client_w, client_h;
     GetClientSize( &client_w, &client_h );
 
     int client_w, client_h;
     GetClientSize( &client_w, &client_h );
 
+    const int hLine = GetLineHeight();
+
     int view_x = SCROLL_UNIT_X*GetScrollPos( wxHORIZONTAL );
     int view_x = SCROLL_UNIT_X*GetScrollPos( wxHORIZONTAL );
-    int view_y = SCROLL_UNIT_Y*GetScrollPos( wxVERTICAL );
+    int view_y = hLine*GetScrollPos( wxVERTICAL );
 
     if ( HasFlag(wxLC_REPORT) )
     {
 
     if ( HasFlag(wxLC_REPORT) )
     {
@@ -3047,9 +3037,9 @@ void wxListMainWindow::MoveToItem(size_t item)
         ResetVisibleLinesRange();
 
         if (rect.y < view_y )
         ResetVisibleLinesRange();
 
         if (rect.y < view_y )
-            Scroll( -1, rect.y/SCROLL_UNIT_Y );
+            Scroll( -1, rect.y/hLine );
         if (rect.y+rect.height+5 > view_y+client_h)
         if (rect.y+rect.height+5 > view_y+client_h)
-            Scroll( -1, (rect.y+rect.height-client_h+SCROLL_UNIT_Y)/SCROLL_UNIT_Y );
+            Scroll( -1, (rect.y+rect.height-client_h+hLine)/hLine );
     }
     else // !report
     {
     }
     else // !report
     {
@@ -3196,15 +3186,7 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
 
         case WXK_PRIOR:
             {
 
         case WXK_PRIOR:
             {
-                int steps = 0;
-                if ( HasFlag(wxLC_REPORT) )
-                {
-                    steps = m_linesPerPage - 1;
-                }
-                else
-                {
-                    steps = m_current % m_linesPerPage;
-                }
+                int steps = HasFlag(wxLC_REPORT) ? m_linesPerPage - 1 : m_current % m_linesPerPage;
 
                 int index = m_current - steps;
                 if (index < 0)
 
                 int index = m_current - steps;
                 if (index < 0)
@@ -3216,15 +3198,9 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
 
         case WXK_NEXT:
             {
 
         case WXK_NEXT:
             {
-                int steps = 0;
-                if ( HasFlag(wxLC_REPORT) )
-                {
-                    steps = m_linesPerPage - 1;
-                }
-                else
-                {
-                    steps = m_linesPerPage - (m_current % m_linesPerPage) - 1;
-                }
+                int steps = HasFlag(wxLC_REPORT)
+                               ? m_linesPerPage - 1
+                               : m_linesPerPage - (m_current % m_linesPerPage) - 1;
 
                 size_t index = m_current + steps;
                 size_t count = GetItemCount();
 
                 size_t index = m_current + steps;
                 size_t count = GetItemCount();
@@ -3877,11 +3853,11 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
         clientHeight;
     GetSize( &clientWidth, &clientHeight );
 
         clientHeight;
     GetSize( &clientWidth, &clientHeight );
 
+    const int lineHeight = GetLineHeight();
+
     if ( HasFlag(wxLC_REPORT) )
     {
         // all lines have the same height and we scroll one line per step
     if ( HasFlag(wxLC_REPORT) )
     {
         // all lines have the same height and we scroll one line per step
-        int lineHeight = GetLineHeight();
-
         int entireHeight = count*lineHeight + LINE_SPACING;
 
         m_linesPerPage = clientHeight / lineHeight;
         int entireHeight = count*lineHeight + LINE_SPACING;
 
         m_linesPerPage = clientHeight / lineHeight;
@@ -3945,9 +3921,9 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
             SetScrollbars
             (
                 SCROLL_UNIT_X,
             SetScrollbars
             (
                 SCROLL_UNIT_X,
-                SCROLL_UNIT_Y,
+                lineHeight,
                 (x + SCROLL_UNIT_X) / SCROLL_UNIT_X,
                 (x + SCROLL_UNIT_X) / SCROLL_UNIT_X,
-                (y + SCROLL_UNIT_Y) / SCROLL_UNIT_Y,
+                (y + lineHeight) / lineHeight,
                 GetScrollPos( wxHORIZONTAL ),
                 GetScrollPos( wxVERTICAL ),
                 TRUE
                 GetScrollPos( wxHORIZONTAL ),
                 GetScrollPos( wxVERTICAL ),
                 TRUE
@@ -3960,18 +3936,10 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
             // scrollbar
 
             int entireWidth = 0;
             // scrollbar
 
             int entireWidth = 0;
-            #if 0
-            // entireHeight is not used so no need to define it
-            int entireHeight = 0;
-            #endif
 
             for (int tries = 0; tries < 2; tries++)
             {
                 entireWidth = 2*EXTRA_BORDER_X;
 
             for (int tries = 0; tries < 2; tries++)
             {
                 entireWidth = 2*EXTRA_BORDER_X;
-                #if 0
-                // entireHeight is not used so no need to define it
-                entireHeight = 2*EXTRA_BORDER_Y;
-                #endif
 
                 if (tries == 1)
                 {
 
                 if (tries == 1)
                 {
@@ -4023,7 +3991,6 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
                         clientHeight -= wxSystemSettings::
                                             GetMetric(wxSYS_HSCROLL_Y);
                         m_linesPerPage = 0;
                         clientHeight -= wxSystemSettings::
                                             GetMetric(wxSYS_HSCROLL_Y);
                         m_linesPerPage = 0;
-                        currentlyVisibleLines = 0;
                         break;
                     }
 
                         break;
                     }
 
@@ -4035,7 +4002,7 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
             SetScrollbars
             (
                 SCROLL_UNIT_X,
             SetScrollbars
             (
                 SCROLL_UNIT_X,
-                SCROLL_UNIT_Y,
+                lineHeight,
                 (entireWidth + SCROLL_UNIT_X) / SCROLL_UNIT_X,
                 0,
                 GetScrollPos( wxHORIZONTAL ),
                 (entireWidth + SCROLL_UNIT_X) / SCROLL_UNIT_X,
                 0,
                 GetScrollPos( wxHORIZONTAL ),
@@ -4628,6 +4595,8 @@ bool wxGenericListCtrl::Create(wxWindow *parent,
     m_mainWin = (wxListMainWindow*) NULL;
     m_headerWin = (wxListHeaderWindow*) NULL;
 
     m_mainWin = (wxListMainWindow*) NULL;
     m_headerWin = (wxListHeaderWindow*) NULL;
 
+    m_headerHeight = 0;
+
     if ( !(style & wxLC_MASK_TYPE) )
     {
         style = style | wxLC_LIST;
     if ( !(style & wxLC_MASK_TYPE) )
     {
         style = style | wxLC_LIST;
@@ -5325,7 +5294,8 @@ int wxGenericListCtrl::OnGetItemImage(long WXUNUSED(item)) const
     return -1;
 }
 
     return -1;
 }
 
-wxListItemAttr *wxGenericListCtrl::OnGetItemAttr(long item) const
+wxListItemAttr *
+wxGenericListCtrl::OnGetItemAttr(long WXUNUSED_UNLESS_DEBUG(item)) const
 {
     wxASSERT_MSG( item >= 0 && item < GetItemCount(),
                   _T("invalid item index in OnGetItemAttr()") );
 {
     wxASSERT_MSG( item >= 0 && item < GetItemCount(),
                   _T("invalid item index in OnGetItemAttr()") );