]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/listctrl_mac.cpp
adding the 0.5 offset for odd pen widths
[wxWidgets.git] / src / mac / carbon / listctrl_mac.cpp
index 46d53fe1bc821a2161882bb96765643cec060962..4d6cf5726ae9ced0545bef560a2bb44486d82906 100644 (file)
@@ -134,7 +134,7 @@ public:
 
     virtual int GetColumnImageValue( unsigned int column );
     virtual void SetColumnImageValue( unsigned int column, int imageIndex );
-        
+
     virtual ~wxMacListCtrlItem();
 protected:
     wxListItemList m_rowItems;
@@ -149,7 +149,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 +167,7 @@ protected:
                         DataBrowserItemID itemID,
                         DataBrowserItemNotification message,
                         DataBrowserItemDataRef itemData);
-                        
+
     virtual Boolean CompareItems(DataBrowserItemID itemOneID,
                         DataBrowserItemID itemTwoID,
                         DataBrowserPropertyID sortProperty);
@@ -177,7 +177,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 +200,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;
@@ -226,6 +226,7 @@ public:
     {
     }
 
+protected:
     virtual wxListItemAttr * OnGetItemAttr(long item) const
     {
         return m_nativeListCtrl->OnGetItemAttr(item);
@@ -246,7 +247,6 @@ public:
         return m_nativeListCtrl->OnGetItemText(item, column);
     }
 
-protected:
     wxListCtrl* m_nativeListCtrl;
 
 };
@@ -266,7 +266,7 @@ bool wxListCtrl::Create(wxWindow *parent,
     // Also, use generic list control in VIRTUAL mode.
     if ( (wxSystemOptions::HasOption( wxMAC_ALWAYS_USE_GENERIC_LISTCTRL )
             && (wxSystemOptions::GetOptionInt( wxMAC_ALWAYS_USE_GENERIC_LISTCTRL ) == 1)) ||
-            (style & wxLC_ICON) || (style & wxLC_SMALL_ICON) || (style & wxLC_LIST) || (style & wxLC_VIRTUAL)  )
+            (style & wxLC_ICON) || (style & wxLC_SMALL_ICON) || (style & wxLC_LIST) /* || (style & wxLC_VIRTUAL) */ )
     {
         m_macIsUserPane = true;
 
@@ -812,7 +812,7 @@ wxColour wxListCtrl::GetTextColour() const
     // TODO: we need owner drawn list items to customize text color.
     if (m_dbImpl)
         return *wxBLACK;
-        
+
     return wxNullColour;
 }
 
@@ -852,6 +852,18 @@ long wxListCtrl::GetNextItem(long item, int geom, int state) const
     if (m_genericImpl)
         return m_genericImpl->GetNextItem(item, geom, state);
 
+    if (m_dbImpl && geom == wxLIST_NEXT_ALL && state == wxLIST_STATE_SELECTED )
+    {
+        long count = m_dbImpl->MacGetCount() ;
+        for ( long line = item + 1 ; line < count; line++ )
+        {
+            wxMacDataItem* id = m_dbImpl->GetItemFromLine(line);
+            if ( m_dbImpl->IsItemSelected(id ) )
+                return line;
+        }
+        return -1;
+    }
+
     return 0;
 }
 
@@ -945,7 +957,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;
@@ -1205,15 +1217,18 @@ long wxListCtrl::InsertColumn(long col, wxListItem& item)
         }
         m_dbImpl->InsertColumn(col, type, item.GetText(), just, item.GetWidth());
 
+        // set/remove options based on the wxListCtrl type.
+        DataBrowserTableViewColumnID id;
+        m_dbImpl->GetColumnIDFromIndex(col, &id);
+        DataBrowserPropertyFlags flags;
+        verify_noerr(m_dbImpl->GetPropertyFlags(id, &flags));
         if (GetWindowStyleFlag() & wxLC_EDIT_LABELS)
-        {
-            DataBrowserTableViewColumnID id;
-            m_dbImpl->GetColumnIDFromIndex(col, &id);
-            DataBrowserPropertyFlags flags;
-            verify_noerr(m_dbImpl->GetPropertyFlags(id, &flags));
             flags |= kDataBrowserPropertyIsEditable;
-            verify_noerr(m_dbImpl->SetPropertyFlags(id, flags));
+
+        if (GetWindowStyleFlag() & wxLC_VIRTUAL){
+            flags &= ~kDataBrowserListViewSortableColumn;
         }
+        verify_noerr(m_dbImpl->SetPropertyFlags(id, flags));
     }
 
     return col;
@@ -1399,7 +1414,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 ) ;
@@ -1457,7 +1472,7 @@ wxMacDataBrowserListCtrlControl::wxMacDataBrowserListCtrlControl( wxWindow *peer
     OSStatus err = noErr;
     m_clientDataItemsType = wxClientData_None;
     m_isVirtual = false;
-    
+
     if ( style & wxLC_VIRTUAL )
         m_isVirtual = true;
 
@@ -1483,7 +1498,10 @@ wxMacDataBrowserListCtrlControl::wxMacDataBrowserListCtrlControl( wxWindow *peer
     if ( style & wxLC_LIST || style & wxLC_NO_HEADER )
         verify_noerr( SetHeaderButtonHeight( 0 ) );
 
-    SetSortProperty( kMinColumnId );
+    if ( m_isVirtual )
+        SetSortProperty( kMinColumnId - 1 );
+    else
+        SetSortProperty( kMinColumnId );
     if ( style & wxLC_SORT_ASCENDING )
     {
         m_sortOrder = SortOrder_Text_Ascending;
@@ -1558,15 +1576,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);
@@ -1576,11 +1594,11 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI
                             ::SetDataBrowserItemDataIcon(itemData, icon);
                         }
                     }
-                        
+
                 }
                 break ;
         }
-                
+
     }
     else
     {
@@ -1603,7 +1621,7 @@ OSStatus wxMacDataBrowserListCtrlControl::GetSetItemData(DataBrowserItemID itemI
                         if (lcItem)
                             lcItem->SetColumnTextValue( listColumn, cfStr.AsString() );
                     }
-                    err = noErr ;                        
+                    err = noErr ;
                 }
                 break;
         }
@@ -1624,7 +1642,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  ;
     }
 
@@ -1632,14 +1650,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;
@@ -1651,7 +1668,7 @@ void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID,
         {
             event.m_itemIndex = (long)itemID;
         }
-        
+
         switch (message)
         {
             case kDataBrowserItemDeselected:
@@ -1674,7 +1691,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
@@ -1705,10 +1722,10 @@ 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)
@@ -1728,12 +1745,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;
@@ -1756,7 +1773,7 @@ wxMacDataBrowserListCtrlControl::~wxMacDataBrowserListCtrlControl()
 }
 
 void wxMacDataBrowserListCtrlControl::MacSetColumnInfo( unsigned int row, unsigned int column, wxListItem* item )
-{ 
+{
     wxMacDataItem* dataItem = GetItemFromLine(row);
     if (item)
     {
@@ -1766,14 +1783,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;
@@ -1785,14 +1802,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
@@ -1823,7 +1840,7 @@ void wxMacDataBrowserListCtrlControl::MacInsertItem( unsigned int n, wxListItem*
     MacSetColumnInfo(n, 0, item);
 }
 
-wxMacListCtrlItem* wxMacDataBrowserListCtrlControl::CreateItem()
+wxMacDataItem* wxMacDataBrowserListCtrlControl::CreateItem()
 {
     return new wxMacListCtrlItem();
 }
@@ -1878,7 +1895,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