#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:
virtual int GetColumnImageValue( unsigned int column );
virtual void SetColumnImageValue( unsigned int column, int imageIndex );
-
+
virtual ~wxMacListCtrlItem();
protected:
wxListItemList m_rowItems;
// 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 );
DataBrowserItemID itemID,
DataBrowserItemNotification message,
DataBrowserItemDataRef itemData);
-
+
virtual Boolean CompareItems(DataBrowserItemID itemOneID,
DataBrowserItemID itemTwoID,
DataBrowserPropertyID sortProperty);
};
-// 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()
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;
m_textCtrl = NULL;
m_genericImpl = NULL;
m_dbImpl = NULL;
+ m_compareFunc = NULL;
+ m_compareFuncData = 0;
}
class wxGenericListCtrlHook : public wxGenericListCtrl
{
}
+protected:
virtual wxListItemAttr * OnGetItemAttr(long item) const
{
return m_nativeListCtrl->OnGetItemAttr(item);
return m_nativeListCtrl->OnGetItemText(item, column);
}
-protected:
wxListCtrl* m_nativeListCtrl;
};
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;
// TODO: we need owner drawn list items to customize text color.
if (m_dbImpl)
return *wxBLACK;
-
+
return wxNullColour;
}
wxListEvent event( wxEVT_COMMAND_LIST_DELETE_ITEM, GetId() );
event.SetEventObject( this );
event.m_itemIndex = item;
- GetEventHandler()->ProcessEvent( event );
+ GetEventHandler()->ProcessEvent( event );
}
return true;
verify_noerr(m_dbImpl->GetPropertyFlags(id, &flags));
if (GetWindowStyleFlag() & wxLC_EDIT_LABELS)
flags |= kDataBrowserPropertyIsEditable;
-
+
if (GetWindowStyleFlag() & wxLC_VIRTUAL){
flags &= ~kDataBrowserListViewSortableColumn;
}
{
if (m_genericImpl)
return m_genericImpl->SortItems(fn, data);
+
+ if (m_dbImpl)
+ {
+ m_compareFunc = fn;
+ m_compareFuncData = data;
+ }
return true;
}
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 ) ;
OSStatus err = noErr;
m_clientDataItemsType = wxClientData_None;
m_isVirtual = false;
-
+
if ( style & wxLC_VIRTUAL )
m_isVirtual = true;
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);
::SetDataBrowserItemDataIcon(itemData, icon);
}
}
-
+
}
break ;
}
-
+
}
else
{
if (lcItem)
lcItem->SetColumnTextValue( listColumn, cfStr.AsString() );
}
- err = noErr ;
+ err = noErr ;
}
break;
}
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 ;
}
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;
{
event.m_itemIndex = (long)itemID;
}
-
+
switch (message)
{
case kDataBrowserItemDeselected:
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
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))
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;
}
void wxMacDataBrowserListCtrlControl::MacSetColumnInfo( unsigned int row, unsigned int column, wxListItem* item )
-{
+{
wxMacDataItem* dataItem = GetItemFromLine(row);
if (item)
{
}
}
-// 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;
}
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
MacSetColumnInfo(n, 0, item);
}
-wxMacListCtrlItem* wxMacDataBrowserListCtrlControl::CreateItem()
+wxMacDataItem* wxMacDataBrowserListCtrlControl::CreateItem()
{
return new wxMacListCtrlItem();
}
if ( column >= m_rowItems.GetCount() )
{
- wxListItem* listItem = new wxListItem(*item);
+ wxListItem* listItem = new wxListItem(*item);
m_rowItems.Append( listItem );
}
else