X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/07977ff28ee9c252770b2e120a484a44b81dfe9e..8cb1060f1e2f2cbbcaebcc668dccefdd79804662:/src/mac/carbon/listctrl_mac.cpp diff --git a/src/mac/carbon/listctrl_mac.cpp b/src/mac/carbon/listctrl_mac.cpp index 0b1aed45ad..01045405ec 100644 --- a/src/mac/carbon/listctrl_mac.cpp +++ b/src/mac/carbon/listctrl_mac.cpp @@ -654,12 +654,43 @@ void wxListCtrl::FireMouseEvent(wxEventType eventType, wxPoint position) void wxListCtrl::OnChar(wxKeyEvent& event) { + + if (m_dbImpl) { wxListEvent le( wxEVT_COMMAND_LIST_KEY_DOWN, GetId() ); le.SetEventObject(this); le.m_code = event.GetKeyCode(); le.m_itemIndex = -1; + + if (m_current == -1) + { + // if m_current isn't set, check if there's been a selection + // made before continuing + m_current = GetNextItem(-1, wxLIST_NEXT_BELOW, wxLIST_STATE_SELECTED); + } + + // We need to determine m_current ourselves when navigation keys + // are used. Note that PAGEUP and PAGEDOWN do not alter the current + // item on native Mac ListCtrl, so we only handle up and down keys. + switch ( event.GetKeyCode() ) + { + case WXK_UP: + if ( m_current > 0 ) + m_current -= 1; + else + m_current = 0; + + break; + + case WXK_DOWN: + if ( m_current < GetItemCount() - 1 ) + m_current += 1; + else + m_current = GetItemCount() - 1; + + break; + } if (m_current != -1) { @@ -1045,6 +1076,10 @@ int wxListCtrl::GetCountPerPage() const if (m_dbImpl) { + UInt16 height = 1; + m_dbImpl->GetDefaultRowHeight( &height ); + if (height > 0) + return GetClientSize().y / height; } return 1; @@ -1070,7 +1105,15 @@ bool wxListCtrl::GetItem(wxListItem& info) const if (!IsVirtual()) { if (info.m_itemId >= 0 && info.m_itemId < GetItemCount()) + { m_dbImpl->MacGetColumnInfo(info.m_itemId, info.m_col, info); + if (info.GetMask() & wxLIST_MASK_STATE) + { + DataBrowserItemID id = (DataBrowserItemID)m_dbImpl->GetItemFromLine(info.m_itemId); + if (IsDataBrowserItemSelected( m_dbImpl->GetControlRef(), id )) + info.SetState(info.GetState() | wxLIST_STATE_SELECTED); + } + } } else { @@ -1174,7 +1217,7 @@ bool wxListCtrl::SetItemState(long item, long state, long stateMask) if (m_dbImpl) { DataBrowserSetOption option = kDataBrowserItemsAdd; - if ( stateMask == wxLIST_STATE_SELECTED && state == 0 ) + if ( (stateMask & wxLIST_STATE_SELECTED) && state == 0 ) option = kDataBrowserItemsRemove; if (item == -1) @@ -1202,8 +1245,15 @@ bool wxListCtrl::SetItemState(long item, long state, long stateMask) if ( HasFlag(wxLC_VIRTUAL) ) { long itemID = item+1; + bool isSelected = IsDataBrowserItemSelected(m_dbImpl->GetControlRef(), (DataBrowserItemID)itemID ); + bool isSelectedState = (state == wxLIST_STATE_SELECTED); + + // toggle the selection state if wxListInfo state and actual state don't match. + if ( (stateMask & wxLIST_STATE_SELECTED) && isSelected != isSelectedState ) + { SetDataBrowserSelectedItems(m_dbImpl->GetControlRef(), 1, (DataBrowserItemID*)&itemID, option); } + } else { wxListItem info; @@ -1288,7 +1338,7 @@ long wxListCtrl::GetItemData(long item) const } // Sets the item data -bool wxListCtrl::SetItemData(long item, long data) +bool wxListCtrl::SetItemPtrData(long item, wxUIntPtr data) { if (m_genericImpl) return m_genericImpl->SetItemData(item, data); @@ -1579,7 +1629,7 @@ long wxListCtrl::GetNextItem(long item, int geom, int state) const } } - if ( geom == wxLIST_NEXT_ALL || geom == wxLIST_NEXT_ABOVE ) + if ( geom == wxLIST_NEXT_ABOVE ) { int item2 = item; if ( item2 == -1 ) @@ -3059,7 +3109,7 @@ void wxMacDataBrowserListCtrlControl::UpdateState(wxMacDataItem* dataItem, wxLis bool isSelectedState = (listItem->GetState() == wxLIST_STATE_SELECTED); // toggle the selection state if wxListInfo state and actual state don't match. - if ( isSelected != isSelectedState ) + if ( listItem->GetMask() & wxLIST_MASK_STATE && isSelected != isSelectedState ) { DataBrowserSetOption options = kDataBrowserItemsAdd; if (!isSelectedState)