]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
added wxArtProvider
[wxWidgets.git] / src / generic / listctrl.cpp
index 8bb4d60e1d77bda0307fa97f9102ff22febeb512..c23e25e96d861359450ec6b09b700e00be0c49bb 100644 (file)
@@ -124,7 +124,7 @@ static const int IMAGE_MARGIN_IN_REPORT_MODE = 5;
 
 int CMPFUNC_CONV wxSizeTCmpFn(size_t n1, size_t n2) { return n1 - n2; }
 
-WX_DEFINE_SORTED_EXPORTED_ARRAY(size_t, wxIndexArray);
+WX_DEFINE_SORTED_EXPORTED_ARRAY_LONG(size_t, wxIndexArray);
 
 // this class is used to store the selected items in the virtual list control
 // (but it is not tied to list control and so can be used with other controls
@@ -435,7 +435,7 @@ protected:
     wxCursor          *m_resizeCursor;
     bool               m_isDragging;
 
-    // column being resized
+    // column being resized or -1
     int m_column;
 
     // divider line position in logical (unscrolled) coords
@@ -518,7 +518,7 @@ public:
     void OnKillFocus( wxFocusEvent &event );
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxListTextCtrl);
+    DECLARE_DYNAMIC_CLASS(wxListTextCtrl)
     DECLARE_EVENT_TABLE()
 };
 
@@ -859,7 +859,7 @@ private:
     // if this is > 0, the control is frozen and doesn't redraw itself
     size_t m_freezeCount;
 
-    DECLARE_DYNAMIC_CLASS(wxListMainWindow);
+    DECLARE_DYNAMIC_CLASS(wxListMainWindow)
     DECLARE_EVENT_TABLE()
 };
 
@@ -1751,7 +1751,7 @@ void wxListLineData::ReverseHighlight( void )
 //  wxListHeaderWindow
 //-----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxListHeaderWindow,wxWindow);
+IMPLEMENT_DYNAMIC_CLASS(wxListHeaderWindow,wxWindow)
 
 BEGIN_EVENT_TABLE(wxListHeaderWindow,wxWindow)
     EVT_PAINT         (wxListHeaderWindow::OnPaint)
@@ -2022,8 +2022,9 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event )
         int xpos = 0;
 
         // find the column where this event occured
-        int countCol = m_owner->GetColumnCount();
-        for (int col = 0; col < countCol; col++)
+        int col,
+            countCol = m_owner->GetColumnCount();
+        for (col = 0; col < countCol; col++)
         {
             xpos += m_owner->GetColumnWidth( col );
             m_column = col;
@@ -2044,6 +2045,9 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event )
             m_minX = xpos;
         }
 
+        if ( col == countCol )
+            m_column = -1;
+
         if (event.LeftDown() || event.RightUp())
         {
             if (hit_border && event.LeftDown())
@@ -2116,7 +2120,7 @@ void wxListRenameTimer::Notify()
 // wxListTextCtrl (internal)
 //-----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxListTextCtrl,wxTextCtrl);
+IMPLEMENT_DYNAMIC_CLASS(wxListTextCtrl,wxTextCtrl)
 
 BEGIN_EVENT_TABLE(wxListTextCtrl,wxTextCtrl)
     EVT_CHAR           (wxListTextCtrl::OnChar)
@@ -2226,7 +2230,7 @@ void wxListTextCtrl::OnKillFocus( wxFocusEvent &event )
 //  wxListMainWindow
 //-----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxListMainWindow,wxScrolledWindow);
+IMPLEMENT_DYNAMIC_CLASS(wxListMainWindow,wxScrolledWindow)
 
 BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledWindow)
   EVT_PAINT          (wxListMainWindow::OnPaint)
@@ -2474,7 +2478,10 @@ long wxListMainWindow::HitTestLine(size_t line, int x, int y) const
     if ( ld->HasImage() && GetLineIconRect(line).Inside(x, y) )
         return wxLIST_HITTEST_ONITEMICON;
 
-    if ( ld->HasText() )
+    // VS: Testing for "ld->HasText() || InReportView()" instead of
+    //     "ld->HasText()" is needed to make empty lines in report view
+    //     possible
+    if ( ld->HasText() || InReportView() )
     {
         wxRect rect = InReportView() ? GetLineRect(line)
                                      : GetLineLabelRect(line);
@@ -2662,14 +2669,6 @@ void wxListMainWindow::RefreshSelected()
         to = GetItemCount() - 1;
     }
 
-    // VZ: this code would work fine if wxGTK wxWindow::Refresh() were
-    //     reasonable, i.e. if it only generated one expose event for
-    //     several calls to it - as it is, each Refresh() results in a
-    //     repaint which provokes flicker too horrible to be seen
-    //
-    //     when/if wxGTK is fixed, this code should be restored as normally it
-    //     should generate _less_ flicker than the version below
-#ifndef __WXGTK__
     if ( HasCurrent() && m_current >= from && m_current <= to )
     {
         RefreshLine(m_current);
@@ -2683,26 +2682,6 @@ void wxListMainWindow::RefreshSelected()
             RefreshLine(line);
         }
     }
-#else // __WXGTK__
-    size_t selMin = (size_t)-1,
-           selMax = 0;
-
-    for ( size_t line = from; line <= to; line++ )
-    {
-        if ( IsHighlighted(line) || (line == m_current) )
-        {
-            if ( line < selMin )
-                selMin = line;
-            if ( line > selMax )
-                selMax = line;
-        }
-    }
-
-    if ( selMin != (size_t)-1 )
-    {
-        RefreshLines(selMin, selMax);
-    }
-#endif // !__WXGTK__/__WXGTK__
 }
 
 void wxListMainWindow::Freeze()
@@ -2938,14 +2917,10 @@ void wxListMainWindow::EditLabel( long item )
     if (m_dirty)
         wxSafeYield();
 
-    wxClientDC dc(this);
-    PrepareDC( dc );
-
     wxString s = data->GetText(0);
     wxRect rectLabel = GetLineLabelRect(m_currentEdit);
 
-    rectLabel.x = dc.LogicalToDeviceX( rectLabel.x );
-    rectLabel.y = dc.LogicalToDeviceY( rectLabel.y );
+    CalcScrolledPosition(rectLabel.x, rectLabel.y, &rectLabel.x, &rectLabel.y);
 
     wxListTextCtrl *text = new wxListTextCtrl
                                (
@@ -3076,7 +3051,15 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event )
         m_renameTimer->Stop();
         m_lastOnSame = FALSE;
 
+#ifdef __WXGTK__
+        // FIXME: wxGTK generates bad sequence of events prior to doubleclick
+        //        ("down, up, down, double, up" while other ports 
+        //        do "down, up, double, up"). We have to have this hack
+        //        in place till somebody fixes wxGTK...
         if ( current == m_lineBeforeLastClicked )
+#else
+        if ( current == m_lineLastClicked )
+#endif
         {
             SendNotify( current, wxEVT_COMMAND_LIST_ITEM_ACTIVATED );
 
@@ -3426,10 +3409,6 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
 // focus handling
 // ----------------------------------------------------------------------------
 
-#ifdef __WXGTK__
-extern wxWindow *g_focusWindow;
-#endif
-
 void wxListMainWindow::SetFocus()
 {
     // VS: wxListMainWindow derives from wxPanel (via wxScrolledWindow) and wxPanel
@@ -3440,7 +3419,7 @@ void wxListMainWindow::SetFocus()
 
     wxWindow *oldFocus = FindFocus();
     
-    if ( oldFocus->GetParent() == this )
+    if ( oldFocus && oldFocus->GetParent() == this )
     {
         wxWindow::SetFocus();
     }
@@ -3466,10 +3445,6 @@ void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) )
     if ( !GetParent() )
         return;
 
-#ifdef __WXGTK__
-    g_focusWindow = GetParent();
-#endif
-
     wxFocusEvent event( wxEVT_SET_FOCUS, GetParent()->GetId() );
     event.SetEventObject( GetParent() );
     GetParent()->GetEventHandler()->ProcessEvent( event );
@@ -4191,6 +4166,9 @@ void wxListMainWindow::DeleteColumn( int col )
 
     m_dirty = TRUE;
     m_columns.DeleteNode( node );
+
+    // invalidate it as it has to be recalculated
+    m_headerWidth = 0;
 }
 
 void wxListMainWindow::DoDeleteAllItems()
@@ -4385,6 +4363,9 @@ void wxListMainWindow::InsertColumn( long col, wxListItem &item )
         {
             m_columns.Append( column );
         }
+
+        // invalidate it as it has to be recalculated
+        m_headerWidth = 0;
     }
 }
 
@@ -4437,10 +4418,8 @@ void wxListMainWindow::OnScroll(wxScrollWinEvent& event)
         wxListCtrl* lc = GetListCtrl();
         wxCHECK_RET( lc, _T("no listctrl window?") );
 
-        lc->m_headerWin->Refresh() ;
-#ifdef __WXMAC__
-        lc->m_headerWin->MacUpdateImmediately() ;
-#endif
+        lc->m_headerWin->Refresh();
+        lc->m_headerWin->Update();
     }
 }