]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
Need to reset count when all items are deleted
[wxWidgets.git] / src / generic / listctrl.cpp
index ee4d53272ecb00ffd9d8933144f532e8576c61bd..40acbcc1a756f4712443cf34753ddc8849e14bd4 100644 (file)
 #endif // HAVE_NATIVE_LISTCTRL/!HAVE_NATIVE_LISTCTRL
 
 #include "wx/selstore.h"
 #endif // HAVE_NATIVE_LISTCTRL/!HAVE_NATIVE_LISTCTRL
 
 #include "wx/selstore.h"
-
 #include "wx/renderer.h"
 #include "wx/renderer.h"
+#include "wx/math.h"
 
 #ifdef __WXMAC__
     #include "wx/mac/private.h"
 #endif
 
 
 #ifdef __WXMAC__
     #include "wx/mac/private.h"
 #endif
 
-#include <math.h>
 
 
 // NOTE: If using the wxListBox visual attributes works everywhere then this can
 
 
 // NOTE: If using the wxListBox visual attributes works everywhere then this can
@@ -94,8 +93,10 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_END_LABEL_EDIT)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ITEM)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_END_LABEL_EDIT)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ITEM)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS)
+#if WXWIN_COMPATIBILITY_2_4
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_GET_INFO)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_SET_INFO)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_GET_INFO)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_SET_INFO)
+#endif
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_SELECTED)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_DESELECTED)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_KEY_DOWN)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_SELECTED)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_ITEM_DESELECTED)
 DEFINE_EVENT_TYPE(wxEVT_COMMAND_LIST_KEY_DOWN)
@@ -164,7 +165,7 @@ public:
 
     void SetItem( const wxListItem &info );
     void SetImage( int image ) { m_image = image; }
 
     void SetItem( const wxListItem &info );
     void SetImage( int image ) { m_image = image; }
-    void SetData( long data ) { m_data = data; }
+    void SetData( wxUIntPtr data ) { m_data = data; }
     void SetPosition( int x, int y );
     void SetSize( int width, int height );
 
     void SetPosition( int x, int y );
     void SetSize( int width, int height );
 
@@ -203,7 +204,7 @@ public:
     int m_image;
 
     // user data associated with the item
     int m_image;
 
     // user data associated with the item
-    long m_data;
+    wxUIntPtr m_data;
 
     // the item coordinates are not used in report mode, instead this pointer
     // is NULL and the owner window is used to retrieve the item position and
 
     // the item coordinates are not used in report mode, instead this pointer
     // is NULL and the owner window is used to retrieve the item position and
@@ -518,6 +519,8 @@ public:
 
     virtual ~wxListMainWindow();
 
 
     virtual ~wxListMainWindow();
 
+    wxWindow *GetMainWindowOfCompositeControl() { return GetParent(); }
+
     bool HasFlag(int flag) const { return m_parent->HasFlag(flag); }
 
     // return true if this is a virtual list control
     bool HasFlag(int flag) const { return m_parent->HasFlag(flag); }
 
     // return true if this is a virtual list control
@@ -602,8 +605,6 @@ public:
     void Freeze();
     void Thaw();
 
     void Freeze();
     void Thaw();
 
-    void SetFocus();
-
     void OnRenameTimer();
     bool OnRenameAccept(size_t itemEdit, const wxString& value);
     void OnRenameCancelled(size_t itemEdit);
     void OnRenameTimer();
     bool OnRenameAccept(size_t itemEdit, const wxString& value);
     void OnRenameCancelled(size_t itemEdit);
@@ -679,7 +680,7 @@ public:
     void DeleteEverything();
     void EnsureVisible( long index );
     long FindItem( long start, const wxString& str, bool partial = false );
     void DeleteEverything();
     void EnsureVisible( long index );
     long FindItem( long start, const wxString& str, bool partial = false );
-    long FindItem( long start, long data);
+    long FindItem( long start, wxUIntPtr data);
     long FindItem( const wxPoint& pt );
     long HitTest( int x, int y, int &flags );
     void InsertItem( wxListItem &item );
     long FindItem( const wxPoint& pt );
     long HitTest( int x, int y, int &flags );
     void InsertItem( wxListItem &item );
@@ -2043,7 +2044,7 @@ void wxListTextCtrl::Finish()
 
         m_finished = true;
 
 
         m_finished = true;
 
-        m_owner->SetFocus();
+        m_owner->SetFocusIgnoringChildren();
     }
 }
 
     }
 }
 
@@ -3295,26 +3296,6 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
 // focus handling
 // ----------------------------------------------------------------------------
 
 // focus handling
 // ----------------------------------------------------------------------------
 
-void wxListMainWindow::SetFocus()
-{
-    // VS: wxListMainWindow derives from wxPanel (via wxScrolledWindow) and wxPanel
-    //     overrides SetFocus in such way that it does never change focus from
-    //     panel's child to the panel itself. Unfortunately, we must be able to change
-    //     focus to the panel from wxListTextCtrl because the text control should
-    //     disappear when the user clicks outside it.
-
-    wxWindow *oldFocus = FindFocus();
-
-    if ( oldFocus && oldFocus->GetParent() == this )
-    {
-        wxWindow::SetFocus();
-    }
-    else
-    {
-        wxScrolledWindow::SetFocus();
-    }
-}
-
 void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) )
 {
     if ( GetParent() )
 void wxListMainWindow::OnSetFocus( wxFocusEvent &WXUNUSED(event) )
 {
     if ( GetParent() )
@@ -3864,7 +3845,7 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
         iconSpacing = 0;
 
     // Note that we do not call GetClientSize() here but
         iconSpacing = 0;
 
     // Note that we do not call GetClientSize() here but
-    // GetSize() and substract the border size for sunken
+    // GetSize() and subtract the border size for sunken
     // borders manually. This is technically incorrect,
     // but we need to know the client area's size WITHOUT
     // scrollbars here. Since we don't know if there are
     // borders manually. This is technically incorrect,
     // but we need to know the client area's size WITHOUT
     // scrollbars here. Since we don't know if there are
@@ -4271,7 +4252,7 @@ long wxListMainWindow::FindItem(long start, const wxString& str, bool WXUNUSED(p
     return wxNOT_FOUND;
 }
 
     return wxNOT_FOUND;
 }
 
-long wxListMainWindow::FindItem(long start, long data)
+long wxListMainWindow::FindItem(long start, wxUIntPtr data)
 {
     long pos = start;
     if (pos < 0)
 {
     long pos = start;
     if (pos < 0)
@@ -4350,7 +4331,7 @@ void wxListMainWindow::InsertItem( wxListItem &item )
 
     if (item.m_itemId > count)
         item.m_itemId = count;
 
     if (item.m_itemId > count)
         item.m_itemId = count;
-    
+
     size_t id = item.m_itemId;
 
     m_dirty = true;
     size_t id = item.m_itemId;
 
     m_dirty = true;
@@ -4395,7 +4376,7 @@ void wxListMainWindow::InsertItem( wxListItem &item )
 
     wxListLineData *line = new wxListLineData(this);
 
 
     wxListLineData *line = new wxListLineData(this);
 
-    line->SetItem( 0, item );
+    line->SetItem( item.m_col, item );
 
     m_lines.Insert( line, id );
 
 
     m_lines.Insert( line, id );
 
@@ -4466,9 +4447,9 @@ int LINKAGEMODE list_ctrl_compare_func_1( wxListLineData **arg1, wxListLineData
     wxListLineData *line2 = *arg2;
     wxListItem item;
     line1->GetItem( 0, item );
     wxListLineData *line2 = *arg2;
     wxListItem item;
     line1->GetItem( 0, item );
-    long data1 = item.m_data;
+    wxUIntPtr data1 = item.m_data;
     line2->GetItem( 0, item );
     line2->GetItem( 0, item );
-    long data2 = item.m_data;
+    wxUIntPtr data2 = item.m_data;
     return list_ctrl_compare_func_2( data1, data2, list_ctrl_compare_data );
 }
 
     return list_ctrl_compare_func_2( data1, data2, list_ctrl_compare_data );
 }
 
@@ -4658,10 +4639,14 @@ bool wxGenericListCtrl::Create(wxWindow *parent,
 
     m_mainWin = new wxListMainWindow( this, wxID_ANY, wxPoint(0,0), size, style );
 
 
     m_mainWin = new wxListMainWindow( this, wxID_ANY, wxPoint(0,0), size, style );
 
-#if defined( __WXMAC__ ) && __WXMAC_CARBON__
-    wxFont font ;
-    font.MacCreateThemeFont( kThemeViewsFont ) ;
-    SetFont( font ) ;
+#ifdef  __WXMAC_CARBON__
+    // Human Interface Guidelines ask us for a special font in this case
+    if ( GetWindowVariant() == wxWINDOW_VARIANT_NORMAL )
+    {
+        wxFont font ;
+        font.MacCreateThemeFont( kThemeViewsFont ) ;
+        SetFont( font ) ;
+    }
 #endif
     if ( InReportView() )
     {
 #endif
     if ( InReportView() )
     {
@@ -4816,7 +4801,8 @@ bool wxGenericListCtrl::SetItemState( long item, long state, long stateMask )
     return true;
 }
 
     return true;
 }
 
-bool wxGenericListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) )
+bool
+wxGenericListCtrl::SetItemImage( long item, int image, int WXUNUSED(selImage) )
 {
     wxListItem info;
     info.m_image = image;
 {
     wxListItem info;
     info.m_image = image;
@@ -4836,7 +4822,7 @@ void wxGenericListCtrl::SetItemText( long item, const wxString& str )
     m_mainWin->SetItemText(item, str);
 }
 
     m_mainWin->SetItemText(item, str);
 }
 
-long wxGenericListCtrl::GetItemData( long item ) const
+wxUIntPtr wxGenericListCtrl::GetItemData( long item ) const
 {
     wxListItem info;
     info.m_itemId = item;
 {
     wxListItem info;
     info.m_itemId = item;
@@ -5076,7 +5062,7 @@ long wxGenericListCtrl::FindItem( long start, const wxString& str,  bool partial
     return m_mainWin->FindItem( start, str, partial );
 }
 
     return m_mainWin->FindItem( start, str, partial );
 }
 
-long wxGenericListCtrl::FindItem( long start, long data )
+long wxGenericListCtrl::FindItem( long start, wxUIntPtr data )
 {
     return m_mainWin->FindItem( start, data );
 }
 {
     return m_mainWin->FindItem( start, data );
 }
@@ -5347,10 +5333,18 @@ void wxGenericListCtrl::SetFocus()
 {
     /* The test in window.cpp fails as we are a composite
        window, so it checks against "this", but not m_mainWin. */
 {
     /* The test in window.cpp fails as we are a composite
        window, so it checks against "this", but not m_mainWin. */
-    if ( FindFocus() != this )
+    if ( DoFindFocus() != this )
         m_mainWin->SetFocus();
 }
 
         m_mainWin->SetFocus();
 }
 
+wxSize wxGenericListCtrl::DoGetBestSize() const
+{
+    // Something is better than nothing...
+    // 100x80 is what the MSW version will get from the default
+    // wxControl::DoGetBestSize
+    return wxSize(100,80);
+}
+
 // ----------------------------------------------------------------------------
 // virtual list control support
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // virtual list control support
 // ----------------------------------------------------------------------------
@@ -5366,9 +5360,9 @@ wxString wxGenericListCtrl::OnGetItemText(long WXUNUSED(item), long WXUNUSED(col
 
 int wxGenericListCtrl::OnGetItemImage(long WXUNUSED(item)) const
 {
 
 int wxGenericListCtrl::OnGetItemImage(long WXUNUSED(item)) const
 {
-    // same as above
-    wxFAIL_MSG( _T("wxGenericListCtrl::OnGetItemImage not supposed to be called") );
-
+    wxCHECK_MSG(!GetImageList(wxIMAGE_LIST_SMALL),
+                -1,
+                wxT("List control has an image list, OnGetItemImage should be overridden."));
     return -1;
 }
 
     return -1;
 }