info.SetImage( OnGetItemColumnImage(info.m_itemId, info.m_col) );
if (info.GetMask() & wxLIST_MASK_STATE)
{
- if (IsDataBrowserItemSelected( m_dbImpl->GetControlRef(), info.m_itemId+1 ))
+ if (IsDataBrowserItemSelected( m_dbImpl->GetControlRef(), info.m_itemId+1 ))
info.SetState(info.GetState() | wxLIST_STATE_SELECTED);
}
-
+
wxListItemAttr* attrs = OnGetItemAttr( info.m_itemId );
if (attrs)
{
if ( HasFlag(wxLC_VIRTUAL) )
{
if (stateMask == wxLIST_STATE_SELECTED)
- {
- if (IsDataBrowserItemSelected( m_dbImpl->GetControlRef(), item+1 ))
+ {
+ if (IsDataBrowserItemSelected( m_dbImpl->GetControlRef(), item+1 ))
return wxLIST_STATE_SELECTED;
else
- return 0;
+ return 0;
}
}
else
return info.m_state;
}
}
+
+ return 0;
}
// Sets the item state
{
if (m_genericImpl)
return m_genericImpl->SetItemState(item, state, stateMask);
-
+
if (m_dbImpl)
{
DataBrowserSetOption option = kDataBrowserItemsAdd;
if ( stateMask == wxLIST_STATE_SELECTED && state == 0 )
option = kDataBrowserItemsRemove;
-
+
if (item == -1)
{
if ( HasFlag(wxLC_VIRTUAL) )
if (m_genericImpl)
return m_genericImpl->FindItem(start, str, partial);
- return -1;
+ wxString str_upper = str.Upper();
+
+ long idx = start;
+ if (idx < 0)
+ idx = 0;
+ long count = GetItemCount();
+
+ while (idx < count)
+ {
+ wxString line_upper = GetItemText(idx).Upper();
+ if (!partial)
+ {
+ if (line_upper == str_upper )
+ return idx;
+ }
+ else
+ {
+ if (line_upper.find(str_upper) == 0)
+ return idx;
+ }
+
+ idx++;
+ };
+
+ return wxNOT_FOUND;
}
// Find an item whose data matches this data, starting from the item after 'start'
if (m_genericImpl)
return m_genericImpl->FindItem(start, data);
- long idx = start + 1;
+ long idx = start;
+ if (idx < 0)
+ idx = 0;
long count = GetItemCount();
while (idx < count)
idx++;
};
- return -1;
+ return wxNOT_FOUND;
}
// Find an item nearest this position in the specified direction, starting from
{
if (m_genericImpl)
return m_genericImpl->GetScrollPos(orient);
-
+
if (m_dbImpl)
{
UInt32 offsetX, offsetY;
info.m_itemId = count;
m_dbImpl->MacInsertItem(info.m_itemId, &info );
+ wxMacDataItem* dataItem = m_dbImpl->GetItemFromLine(info.m_itemId);
+
wxListEvent event( wxEVT_COMMAND_LIST_INSERT_ITEM, GetId() );
event.SetEventObject( this );
event.m_itemIndex = info.m_itemId;
{
m_compareFunc = fn;
m_compareFuncData = data;
+ SortDataBrowserContainer( m_dbImpl->GetControlRef(), kDataBrowserNoItem, true);
+
+ // we need to do this after each call, else we get a crash from wxPython when
+ // SortItems is called the second time.
+ m_compareFunc = NULL;
+ m_compareFuncData = 0;
}
return true;
// we need to temporarily disable the new item creation notification
// procedure to speed things up
// FIXME: Even this doesn't seem to help much...
-
+
// FIXME: Find a more efficient way to do this.
m_dbImpl->MacClear();
-
+
DataBrowserCallbacks callbacks;
DataBrowserItemNotificationUPP itemUPP;
GetDataBrowserCallbacks(m_dbImpl->GetControlRef(), &callbacks);
#if wxUSE_DRAG_AND_DROP
if (m_genericImpl)
m_genericImpl->SetDropTarget( dropTarget );
-
+
if (m_dbImpl)
wxWindow::SetDropTarget( dropTarget );
#endif
#if wxUSE_DRAG_AND_DROP
if (m_genericImpl)
return m_genericImpl->GetDropTarget();
-
+
if (m_dbImpl)
return wxWindow::GetDropTarget();
#endif
}
else
{
- event.m_itemIndex = (long)itemID;
+ event.m_itemIndex = (long)itemID-1;
}
switch (message)
{
wxMacListCtrlItem* item = (wxMacListCtrlItem*)itemOneID;
wxMacListCtrlItem* otherItem = (wxMacListCtrlItem*)itemTwoID;
-
- // FIXME: This code causes a crash in wxPython for some reason
- // and moreover, further testing shows that the column click event
- // is only sent to the list ctrl after the native control has finished
- // sorting items anyway. So just disable this for now.
-
- //wxListCtrlCompare func = list->GetCompareFunc();
- //long item1 = GetLineFromItem(item);
- //long item2 = GetLineFromItem(otherItem);
-
- //if (func != NULL && item->HasColumnInfo(colId) && otherItem->HasColumnInfo(colId))
- // return func(item1, item2, list->GetCompareFuncData()) >= 0;
+ wxListCtrlCompare func = list->GetCompareFunc();
+ if (func != NULL)
+ {
+ long item1 = -1;
+ long item2 = -1;
+ if (item && item->HasColumnInfo(0))
+ item1 = item->GetColumnInfo(0)->GetData();
+ if (otherItem && otherItem->HasColumnInfo(0))
+ item2 = otherItem->GetColumnInfo(0)->GetData();
+
+ if (item1 > -1 && item2 > -1)
+ {
+ int result = func(item1, item2, list->GetCompareFuncData());
+ return result >= 0;
+ }
+ }
if (item->HasColumnInfo(colId))
itemText = item->GetColumnInfo(colId)->GetText();
if (otherItem->HasColumnInfo(colId))
if (item)
{
wxMacListCtrlItem* listItem = dynamic_cast<wxMacListCtrlItem*>(dataItem);
+ bool hasInfo = listItem->HasColumnInfo( column );
listItem->SetColumnInfo( column, item );
UpdateState(dataItem, item);
+
+ wxListCtrl* list = wxDynamicCast( GetPeer() , wxListCtrl );
+
+ // NB: When this call was made before a control was completely shown, it would
+ // update the item prematurely (i.e. no text would be listed) and, on show,
+ // only the sorted column would be refreshed, meaning only first column text labels
+ // would be shown. Making sure not to update items until the control is visible
+ // seems to fix this issue.
+ if (hasInfo && list->IsShown())
+ UpdateItem( wxMacDataBrowserRootContainer, listItem , kMinColumnId + column );
}
}