]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/listctrl_mac.cpp
Updated list of subprojects.
[wxWidgets.git] / src / mac / carbon / listctrl_mac.cpp
index f41b579bc867d0663b5463a8d951599e2f79450b..5a3d06a173cdadfa5fd73d0555b41beb37b761fc 100644 (file)
@@ -116,6 +116,51 @@ WX_DECLARE_EXPORTED_LIST(wxListItem, wxListItemList);
 #include "wx/listimpl.cpp"
 WX_DEFINE_LIST(wxListItemList)
 
+// so we can check for column clicks
+static const EventTypeSpec eventList[] =
+{
+    { kEventClassControl, kEventControlHit },
+};
+
+static pascal OSStatus wxMacListCtrlEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+{
+    OSStatus result = eventNotHandledErr ;
+
+    wxMacCarbonEvent cEvent( event ) ;
+
+    ControlRef controlRef ;
+    cEvent.GetParameter( kEventParamDirectObject , &controlRef ) ;
+
+    wxListCtrl *window = (wxListCtrl*) data ;
+    wxListEvent le( wxEVT_COMMAND_LIST_COL_CLICK, window->GetId() );
+    le.SetEventObject( window );
+    
+    switch ( GetEventKind( event ) )
+    {
+        // check if the column was clicked on and fire an event if so
+        case kEventControlHit :
+            {
+                ControlPartCode result = cEvent.GetParameter<ControlPartCode>(kEventParamControlPart, typeControlPartCode) ;
+                if (result == kControlButtonPart){
+                    DataBrowserPropertyID col;
+                    GetDataBrowserSortProperty(controlRef, &col);
+                    int column = col - kMinColumnId;
+                    le.m_col = column;
+                    window->GetEventHandler()->ProcessEvent( le );
+                }
+                result = CallNextEventHandler(handler, event);
+                break; 
+            }
+        default :
+            break ;
+    }
+
+    
+    return result ;
+}
+
+DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacListCtrlEventHandler )
+
 class wxMacListCtrlItem : public wxMacListBoxItem
 {
 public:
@@ -134,7 +179,7 @@ public:
 
     virtual int GetColumnImageValue( unsigned int column );
     virtual void SetColumnImageValue( unsigned int column, int imageIndex );
-        
+
     virtual ~wxMacListCtrlItem();
 protected:
     wxListItemList m_rowItems;
@@ -149,7 +194,7 @@ public:
 
     // create a list item (can be a subclass of wxMacListBoxItem)
 
-    virtual wxMacListCtrlItem* CreateItem();
+    virtual wxMacDataItem* CreateItem();
 
     virtual void MacInsertItem( unsigned int n, wxListItem* item );
     virtual void MacSetColumnInfo( unsigned int row, unsigned int column, wxListItem* item );
@@ -167,7 +212,7 @@ protected:
                         DataBrowserItemID itemID,
                         DataBrowserItemNotification message,
                         DataBrowserItemDataRef itemData);
-                        
+
     virtual Boolean CompareItems(DataBrowserItemID itemOneID,
                         DataBrowserItemID itemTwoID,
                         DataBrowserPropertyID sortProperty);
@@ -177,7 +222,7 @@ protected:
 
 };
 
-// TODO: This gives errors, find out why. 
+// TODO: This gives errors, find out why.
 //BEGIN_EVENT_TABLE(wxListCtrl, wxControl)
 //    EVT_PAINT(wxListCtrl::OnPaint)
 //END_EVENT_TABLE()
@@ -200,7 +245,7 @@ void wxListCtrl::Init()
     m_imageListNormal = NULL;
     m_imageListSmall = NULL;
     m_imageListState = NULL;
-    
+
     // keep track of if we created our own image lists, or if they were assigned
     // to us.
     m_ownsImageListNormal = m_ownsImageListSmall = m_ownsImageListState = false;
@@ -209,6 +254,8 @@ void wxListCtrl::Init()
     m_textCtrl = NULL;
     m_genericImpl = NULL;
     m_dbImpl = NULL;
+    m_compareFunc = NULL;
+    m_compareFuncData = 0;
 }
 
 class wxGenericListCtrlHook : public wxGenericListCtrl
@@ -226,6 +273,7 @@ public:
     {
     }
 
+protected:
     virtual wxListItemAttr * OnGetItemAttr(long item) const
     {
         return m_nativeListCtrl->OnGetItemAttr(item);
@@ -246,7 +294,6 @@ public:
         return m_nativeListCtrl->OnGetItemText(item, column);
     }
 
-protected:
     wxListCtrl* m_nativeListCtrl;
 
 };
@@ -284,8 +331,12 @@ bool wxListCtrl::Create(wxWindow *parent,
             return false;
         m_dbImpl = new wxMacDataBrowserListCtrlControl( this, pos, size, style );
         m_peer = m_dbImpl;
-
+        
         MacPostControlCreate( pos, size );
+        
+        InstallControlEventHandler( m_peer->GetControlRef() , GetwxMacListCtrlEventHandlerUPP(),
+            GetEventTypeCount(eventList), eventList, this,
+            (EventHandlerRef *)&m_macListCtrlEventHandler);
     }
 
     return true;
@@ -812,7 +863,7 @@ wxColour wxListCtrl::GetTextColour() const
     // TODO: we need owner drawn list items to customize text color.
     if (m_dbImpl)
         return *wxBLACK;
-        
+
     return wxNullColour;
 }
 
@@ -957,7 +1008,7 @@ bool wxListCtrl::DeleteItem(long item)
         wxListEvent event( wxEVT_COMMAND_LIST_DELETE_ITEM, GetId() );
         event.SetEventObject( this );
         event.m_itemIndex = item;
-        GetEventHandler()->ProcessEvent( event );   
+        GetEventHandler()->ProcessEvent( event );
 
     }
     return true;
@@ -1224,7 +1275,7 @@ long wxListCtrl::InsertColumn(long col, wxListItem& item)
         verify_noerr(m_dbImpl->GetPropertyFlags(id, &flags));
         if (GetWindowStyleFlag() & wxLC_EDIT_LABELS)
             flags |= kDataBrowserPropertyIsEditable;
-                
+
         if (GetWindowStyleFlag() & wxLC_VIRTUAL){
             flags &= ~kDataBrowserListViewSortableColumn;
         }
@@ -1274,6 +1325,12 @@ bool wxListCtrl::SortItems(wxListCtrlCompare fn, long data)
 {
     if (m_genericImpl)
         return m_genericImpl->SortItems(fn, data);
+        
+    if (m_dbImpl)
+    {
+        m_compareFunc = fn;
+        m_compareFuncData = data;
+    }
 
     return true;
 }
@@ -1414,7 +1471,7 @@ void wxMacListCtrlItem::Notification(wxMacDataItemBrowserControl *owner ,
         bool trigger = false;
 
         wxListEvent event( wxEVT_COMMAND_LIST_ITEM_SELECTED, list->GetId() );
-        bool isSingle = list->GetWindowStyle() | wxLC_SINGLE_SEL;
+        bool isSingle = (list->GetWindowStyle() & wxLC_SINGLE_SEL) != 0;
 
         event.SetEventObject( list );
         event.m_itemIndex = owner->GetLineFromItem( this ) ;
@@ -1472,7 +1529,7 @@ wxMacDataBrowserListCtrlControl::wxMacDataBrowserListCtrlControl( wxWindow *peer
     OSStatus err = noErr;
     m_clientDataItemsType = wxClientData_None;
     m_isVirtual = false;
-    
+
     if ( style & wxLC_VIRTUAL )
         m_isVirtual = true;
 
@@ -1576,15 +1633,15 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI
                 if ( property >= kMinColumnId )
                 {
                     wxMacCFStringHolder cfStr;
-                    
+
                     if (text){
                         cfStr.Assign( text, wxLocale::GetSystemEncoding() );
                         err = ::SetDataBrowserItemDataText( itemData, cfStr );
                         err = noErr;
                     }
-                    
 
-                        
+
+
                     if ( imgIndex != -1 )
                     {
                         wxImageList* imageList = list->GetImageList(wxIMAGE_LIST_SMALL);
@@ -1594,11 +1651,11 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI
                             ::SetDataBrowserItemDataIcon(itemData, icon);
                         }
                     }
-                        
+
                 }
                 break ;
         }
-                
+
     }
     else
     {
@@ -1621,7 +1678,7 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI
                         if (lcItem)
                             lcItem->SetColumnTextValue( listColumn, cfStr.AsString() );
                     }
-                    err = noErr ;                        
+                    err = noErr ;
                 }
                 break;
         }
@@ -1642,7 +1699,7 @@ void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID,
     else if ( message == kDataBrowserItemAdded )
     {
         // we don't issue events on adding, the item is not really stored in the list yet, so we
-        // avoid asserts by gettting out now
+        // avoid asserts by getting out now
         return  ;
     }
 
@@ -1650,14 +1707,13 @@ void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID,
     if ( list )
     {
         bool trigger = false;
-            
+
         wxListEvent event( wxEVT_COMMAND_LIST_ITEM_SELECTED, list->GetId() );
-        bool isSingle = list->GetWindowStyle() | wxLC_SINGLE_SEL;
-        
+        bool isSingle = (list->GetWindowStyle() & wxLC_SINGLE_SEL) != 0;
+
         event.SetEventObject( list );
         if ( !list->IsVirtual() )
         {
-            wxMacDataItem* item = (wxMacDataItem*)itemID;
             DataBrowserTableViewRowIndex result = 0;
             verify_noerr( GetItemRow( itemID, &result ) ) ;
             event.m_itemIndex = result;
@@ -1669,7 +1725,7 @@ void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID,
         {
             event.m_itemIndex = (long)itemID;
         }
-        
+
         switch (message)
         {
             case kDataBrowserItemDeselected:
@@ -1692,7 +1748,7 @@ void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID,
                 event.SetEventType( wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT ) ;
                 trigger = true ;
                 break ;
-                
+
             case kDataBrowserEditStopped :
                 // TODO probably trigger only upon the value store callback, because
                 // here IIRC we cannot veto
@@ -1723,16 +1779,20 @@ Boolean wxMacDataBrowserListCtrlControl::CompareItems(DataBrowserItemID itemOneI
     int colId = sortProperty - kMinColumnId;
     long itemNum = 0;
     long otherItemNum = 0;
-    
+
     wxListCtrl* list = wxDynamicCast( GetPeer() , wxListCtrl );
-    
-    // means we need to 
+
+    // means we need to
     if (colId >= 0)
     {
         if (!m_isVirtual)
         {
             wxMacListCtrlItem* item = (wxMacListCtrlItem*)itemOneID;
             wxMacListCtrlItem* otherItem = (wxMacListCtrlItem*)itemTwoID;
+            wxListCtrlCompare func = list->GetCompareFunc();
+            if (func != NULL && item->HasColumnInfo(colId) && otherItem->HasColumnInfo(colId))
+                return func(item->GetColumnInfo(colId)->GetData(), otherItem->GetColumnInfo(colId)->GetData(), list->GetCompareFuncData()) >= 0;
+
             itemNum = item->GetOrder();
             otherItemNum = otherItem->GetOrder();
             if (item->HasColumnInfo(colId))
@@ -1746,12 +1806,12 @@ Boolean wxMacDataBrowserListCtrlControl::CompareItems(DataBrowserItemID itemOneI
             otherItemNum = (long)itemTwoID;
             itemText = list->OnGetItemText( itemNum-1, colId );
             otherItemText = list->OnGetItemText( otherItemNum-1, colId );
-            
+
         }
-        
+
         DataBrowserSortOrder sort;
-        verify_noerr(GetSortOrder(&sort)); 
-        
+        verify_noerr(GetSortOrder(&sort));
+
         if ( sort == kDataBrowserOrderIncreasing )
         {
             retval = itemText.CmpNoCase( otherItemText ) > 0;
@@ -1774,7 +1834,7 @@ wxMacDataBrowserListCtrlControl::~wxMacDataBrowserListCtrlControl()
 }
 
 void wxMacDataBrowserListCtrlControl::MacSetColumnInfo( unsigned int row, unsigned int column, wxListItem* item )
-{ 
+{
     wxMacDataItem* dataItem = GetItemFromLine(row);
     if (item)
     {
@@ -1784,14 +1844,14 @@ void wxMacDataBrowserListCtrlControl::MacSetColumnInfo( unsigned int row, unsign
     }
 }
 
-// apply changes that need to happen immediately, rather than when the 
+// apply changes that need to happen immediately, rather than when the
 // databrowser control fires a callback.
 void wxMacDataBrowserListCtrlControl::UpdateState(wxMacDataItem* dataItem, wxListItem* listItem)
 {
     bool isSelected = IsItemSelected( dataItem );
     bool isSelectedState = (listItem->GetState() == wxLIST_STATE_SELECTED);
 
-    // toggle the selection state if wxListInfo state and actual state don't match.    
+    // toggle the selection state if wxListInfo state and actual state don't match.
     if ( isSelected != isSelectedState )
     {
         DataBrowserSetOption options = kDataBrowserItemsAdd;
@@ -1803,14 +1863,14 @@ void wxMacDataBrowserListCtrlControl::UpdateState(wxMacDataItem* dataItem, wxLis
 }
 
 void wxMacDataBrowserListCtrlControl::MacGetColumnInfo( unsigned int row, unsigned int column, wxListItem& item )
-{ 
+{
     wxMacDataItem* dataItem = GetItemFromLine(row);
     // CS should this guard against dataItem = 0 ? , as item is not a pointer if (item) is not appropriate
-    //if (item) 
+    //if (item)
     {
         wxMacListCtrlItem* listItem = dynamic_cast<wxMacListCtrlItem*>(dataItem);
         wxListItem* oldItem = listItem->GetColumnInfo( column );
-        
+
         long mask = item.GetMask();
         if ( !mask )
             // by default, get everything for backwards compatibility
@@ -1841,7 +1901,7 @@ void wxMacDataBrowserListCtrlControl::MacInsertItem( unsigned int n, wxListItem*
     MacSetColumnInfo(n, 0, item);
 }
 
-wxMacListCtrlItem* wxMacDataBrowserListCtrlControl::CreateItem()
+wxMacDataItem* wxMacDataBrowserListCtrlControl::CreateItem()
 {
     return new wxMacListCtrlItem();
 }
@@ -1896,7 +1956,7 @@ void wxMacListCtrlItem::SetColumnInfo( unsigned int column, wxListItem* item )
 
     if ( column >= m_rowItems.GetCount() )
     {
-        wxListItem* listItem = new wxListItem(*item);    
+        wxListItem* listItem = new wxListItem(*item);
         m_rowItems.Append( listItem );
     }
     else