X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/89c33c4831a62c628ebdbba02c2c05ec6b9169c0..b3cec67186d678d2c3985923bdb8c787455cf369:/src/osx/carbon/listctrl_mac.cpp diff --git a/src/osx/carbon/listctrl_mac.cpp b/src/osx/carbon/listctrl_mac.cpp index c916795c59..034b4d073d 100644 --- a/src/osx/carbon/listctrl_mac.cpp +++ b/src/osx/carbon/listctrl_mac.cpp @@ -148,10 +148,10 @@ static pascal OSStatus wxMacListCtrlEventHandler( EventHandlerCallRef handler , if (result == kControlButtonPart){ DataBrowserPropertyID col; GetDataBrowserSortProperty(controlRef, &col); - + DataBrowserTableViewColumnIndex column = 0; verify_noerr( GetDataBrowserTableViewColumnPosition( controlRef, col, &column ) ); - + le.m_col = column; // FIXME: we can't use the sort property for virtual listctrls // so we need to find a better way to determine which column was clicked... @@ -300,6 +300,9 @@ wxMacListCtrlEventDelegate::wxMacListCtrlEventDelegate( wxListCtrl* list, int id bool wxMacListCtrlEventDelegate::ProcessEvent( wxEvent& event ) { + int id = event.GetId(); + wxObject* obj = event.GetEventObject(); + // even though we use a generic list ctrl underneath, make sure // we present ourselves as wxListCtrl. event.SetEventObject( m_list ); @@ -307,10 +310,20 @@ bool wxMacListCtrlEventDelegate::ProcessEvent( wxEvent& event ) if ( !event.IsKindOf( CLASSINFO( wxCommandEvent ) ) ) { - if (m_list->HandleWindowEvent( event )) + if (m_list->GetEventHandler()->ProcessEvent( event )) + { + event.SetId(id); + event.SetEventObject(obj); return true; + } } - return wxEvtHandler::ProcessEvent(event); + // Also try with the original id + bool success = wxEvtHandler::ProcessEvent(event); + event.SetId(id); + event.SetEventObject(obj); + if (!success && id != m_id) + success = wxEvtHandler::ProcessEvent(event); + return success; } //----------------------------------------------------------------------------- @@ -482,7 +495,7 @@ void wxListCtrlTextCtrlWrapper::OnKeyUp( wxKeyEvent &event ) wxPoint myPos = m_text->GetPosition(); wxSize mySize = m_text->GetSize(); int sx, sy; - m_text->GetTextExtent(m_text->GetValue() + _T("MM"), &sx, &sy); + m_text->GetTextExtent(m_text->GetValue() + wxT("MM"), &sx, &sy); if (myPos.x + sx > parentSize.x) sx = parentSize.x - myPos.x; if (mySize.x > sx) @@ -616,7 +629,8 @@ void wxListCtrl::OnLeftDown(wxMouseEvent& event) void wxListCtrl::OnDblClick(wxMouseEvent& event) { - m_current = -1; + if ( m_renameTimer->IsRunning() ) + m_renameTimer->Stop(); event.Skip(); } @@ -656,21 +670,21 @@ 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. @@ -681,7 +695,7 @@ void wxListCtrl::OnChar(wxKeyEvent& event) m_current -= 1; else m_current = 0; - + break; case WXK_DOWN: @@ -689,7 +703,7 @@ void wxListCtrl::OnChar(wxKeyEvent& event) m_current += 1; else m_current = GetItemCount() - 1; - + break; } @@ -771,7 +785,7 @@ wxListCtrl::~wxListCtrl() delete m_imageListState; delete m_renameTimer; - + WX_CLEAR_LIST(wxColumnList, m_colsInfo); } @@ -783,7 +797,7 @@ wxListCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant)) attr.colFg = wxSystemSettings::GetColour( wxSYS_COLOUR_WINDOWTEXT ); attr.colBg = wxSystemSettings::GetColour( wxSYS_COLOUR_LISTBOX ); - attr.font.MacCreateFromThemeFont(kThemeViewsFont); + attr.font.CreateSystemFont(wxOSX_SYSTEM_FONT_VIEWS); return attr; } @@ -919,7 +933,7 @@ bool wxListCtrl::GetColumn(int col, wxListItem& item) const if (m_dbImpl) { wxColumnList::compatibility_iterator node = m_colsInfo.Item( col ); - wxASSERT_MSG( node, _T("invalid column index in wxMacListCtrlItem") ); + wxASSERT_MSG( node, wxT("invalid column index in wxMacListCtrlItem") ); wxListItem* column = node->GetData(); long mask = column->GetMask(); @@ -948,8 +962,8 @@ bool wxListCtrl::SetColumn(int col, wxListItem& item) if (m_dbImpl) { - wxASSERT_MSG( col < (int)m_colsInfo.GetCount(), _T("invalid column index in wxMacListCtrlItem") ); - + wxASSERT_MSG( col < (int)m_colsInfo.GetCount(), wxT("invalid column index in wxMacListCtrlItem") ); + long mask = item.GetMask(); { wxListItem listItem; @@ -1128,6 +1142,8 @@ bool wxListCtrl::GetItem(wxListItem& info) const if (info.m_itemId >= 0 && info.m_itemId < GetItemCount()) { m_dbImpl->MacGetColumnInfo(info.m_itemId, info.m_col, info); + // MacGetColumnInfo returns erroneous information in the state field, so zero it. + info.SetState(0); if (info.GetMask() & wxLIST_MASK_STATE) { DataBrowserItemID id = (DataBrowserItemID)m_dbImpl->GetItemFromLine(info.m_itemId); @@ -1376,7 +1392,7 @@ bool wxListCtrl::SetItemPtrData(long item, wxUIntPtr data) wxRect wxListCtrl::GetViewRect() const { wxASSERT_MSG( !HasFlag(wxLC_REPORT | wxLC_LIST), - _T("wxListCtrl::GetViewRect() only works in icon mode") ); + wxT("wxListCtrl::GetViewRect() only works in icon mode") ); if (m_genericImpl) return m_genericImpl->GetViewRect(); @@ -1388,9 +1404,9 @@ wxRect wxListCtrl::GetViewRect() const bool wxListCtrl::GetSubItemRect( long item, long subItem, wxRect& rect, int code ) const { if (m_genericImpl) - return m_genericImpl->GetItemRect(item, rect, code); + return m_genericImpl->GetSubItemRect(item, subItem, rect, code); - // TODO: implement for DataBrowser implementation + // TODO: implement for DataBrowser implementation return false; } @@ -1407,7 +1423,7 @@ bool wxListCtrl::GetItemRect(long item, wxRect& rect, int code) const DataBrowserTableViewColumnID col = 0; verify_noerr( m_dbImpl->GetColumnIDFromIndex( 0, &col ) ); - + Rect bounds; DataBrowserPropertyPart part = kDataBrowserPropertyEnclosingPart; if ( code == wxLIST_RECT_LABEL ) @@ -1654,6 +1670,9 @@ long wxListCtrl::GetNextItem(long item, int geom, int state) const if ( !IsVirtual() ) id = (DataBrowserItemID)m_dbImpl->GetItemFromLine(line); + if ( (state & wxLIST_STATE_FOCUSED) && (m_current == line)) + return line; + if ( (state == wxLIST_STATE_DONTCARE ) ) return line; @@ -1674,6 +1693,9 @@ long wxListCtrl::GetNextItem(long item, int geom, int state) const if ( !IsVirtual() ) id = (DataBrowserItemID)m_dbImpl->GetItemFromLine(line); + if ( (state & wxLIST_STATE_FOCUSED) && (m_current == line)) + return line; + if ( (state == wxLIST_STATE_DONTCARE ) ) return line; @@ -1785,6 +1807,7 @@ bool wxListCtrl::DeleteItem(long item) // Deletes all items bool wxListCtrl::DeleteAllItems() { + m_current = -1; if (m_genericImpl) return m_genericImpl->DeleteAllItems(); @@ -2053,7 +2076,7 @@ int wxListCtrl::GetScrollPos(int orient) const // -1 otherwise. long wxListCtrl::InsertItem(wxListItem& info) { - wxASSERT_MSG( !IsVirtual(), _T("can't be used with virtual controls") ); + wxASSERT_MSG( !IsVirtual(), wxT("can't be used with virtual controls") ); if (m_genericImpl) return m_genericImpl->InsertItem(info); @@ -2147,7 +2170,7 @@ long wxListCtrl::InsertColumn(long col, wxListItem& item) just = teFlushRight; } m_dbImpl->InsertColumn(col, type, item.GetText(), just, width); - + wxListItem* listItem = new wxListItem(item); m_colsInfo.Insert( col, listItem ); SetColumn(col, item); @@ -2205,7 +2228,7 @@ bool wxListCtrl::ScrollList(int dx, int dy) } -bool wxListCtrl::SortItems(wxListCtrlCompare fn, long data) +bool wxListCtrl::SortItems(wxListCtrlCompare fn, wxIntPtr data) { if (m_genericImpl) return m_genericImpl->SortItems(fn, data); @@ -2266,7 +2289,7 @@ wxString wxListCtrl::OnGetItemText(long WXUNUSED(item), long WXUNUSED(col)) cons { // this is a pure virtual function, in fact - which is not really pure // because the controls which are not virtual don't need to implement it - wxFAIL_MSG( _T("wxListCtrl::OnGetItemText not supposed to be called") ); + wxFAIL_MSG( wxT("wxListCtrl::OnGetItemText not supposed to be called") ); return wxEmptyString; } @@ -2290,7 +2313,7 @@ int wxListCtrl::OnGetItemColumnImage(long item, long column) const wxListItemAttr *wxListCtrl::OnGetItemAttr(long WXUNUSED_UNLESS_DEBUG(item)) const { wxASSERT_MSG( item >= 0 && item < GetItemCount(), - _T("invalid item index in OnGetItemAttr()") ); + wxT("invalid item index in OnGetItemAttr()") ); // no attributes by default return NULL; @@ -2298,7 +2321,7 @@ wxListItemAttr *wxListCtrl::OnGetItemAttr(long WXUNUSED_UNLESS_DEBUG(item)) cons void wxListCtrl::SetItemCount(long count) { - wxASSERT_MSG( IsVirtual(), _T("this is for virtual controls only") ); + wxASSERT_MSG( IsVirtual(), wxT("this is for virtual controls only") ); if (m_genericImpl) { @@ -2680,10 +2703,10 @@ void wxMacDataBrowserListCtrlControl::DrawItem( wxString text; wxFont font = wxNullFont; int imgIndex = -1; - + DataBrowserTableViewColumnIndex listColumn = 0; - OSStatus err = GetColumnPosition( property, &listColumn ); - + GetColumnPosition( property, &listColumn ); + wxListCtrl* list = wxDynamicCast( GetWXPeer() , wxListCtrl ); wxMacListCtrlItem* lcItem; wxColour color = *wxBLACK; @@ -2853,7 +2876,7 @@ void wxMacDataBrowserListCtrlControl::DrawItem( if (font.Ok()) { info.fontID = kThemeSpecifiedFont; - info.font = (CTFontRef) font.MacGetCTFont(); + info.font = (CTFontRef) font.OSXGetCTFont(); setup = true; } } @@ -2868,7 +2891,7 @@ void wxMacDataBrowserListCtrlControl::DrawItem( { info.fontID = font.MacGetThemeFontID(); - ::TextSize( (short)(font.MacGetFontSize()) ) ; + ::TextSize( (short)(font.GetPointSize()) ) ; ::TextFace( font.MacGetFontStyle() ) ; } } @@ -3026,7 +3049,7 @@ void wxMacDataBrowserListCtrlControl::ItemNotification(DataBrowserItemID itemID, { item = (wxMacListCtrlItem *) itemID; } - + // we want to depend on as little as possible to make sure tear-down of controls is safe if ( message == kDataBrowserItemRemoved ) { @@ -3187,7 +3210,7 @@ wxMacDataBrowserListCtrlControl::~wxMacDataBrowserListCtrlControl() void wxMacDataBrowserListCtrlControl::MacSetColumnInfo( unsigned int row, unsigned int column, wxListItem* item ) { wxMacDataItem* dataItem = GetItemFromLine(row); - wxASSERT_MSG( dataItem, _T("could not obtain wxMacDataItem for row in MacSetColumnInfo. Is row a valid wxListCtrl row?") ); + wxASSERT_MSG( dataItem, wxT("could not obtain wxMacDataItem for row in MacSetColumnInfo. Is row a valid wxListCtrl row?") ); if (item) { wxMacListCtrlItem* listItem = static_cast(dataItem); @@ -3233,7 +3256,7 @@ void wxMacDataBrowserListCtrlControl::UpdateState(wxMacDataItem* dataItem, wxLis void wxMacDataBrowserListCtrlControl::MacGetColumnInfo( unsigned int row, unsigned int column, wxListItem& item ) { wxMacDataItem* dataItem = GetItemFromLine(row); - wxASSERT_MSG( dataItem, _T("could not obtain wxMacDataItem in MacGetColumnInfo. Is row a valid wxListCtrl row?") ); + wxASSERT_MSG( dataItem, wxT("could not obtain wxMacDataItem in MacGetColumnInfo. Is row a valid wxListCtrl row?") ); // CS should this guard against dataItem = 0 ? , as item is not a pointer if (item) is not appropriate //if (item) { @@ -3270,10 +3293,10 @@ void wxMacDataBrowserListCtrlControl::MacGetColumnInfo( unsigned int row, unsign } } } - + void wxMacDataBrowserListCtrlControl::MacInsertItem( unsigned int n, wxListItem* item ) { - + wxMacDataItemBrowserControl::MacInsert(n, new wxMacListCtrlItem() ); MacSetColumnInfo(n, 0, item); } @@ -3323,7 +3346,7 @@ void wxMacListCtrlItem::SetColumnTextValue( unsigned int column, const wxString& wxListItem* wxMacListCtrlItem::GetColumnInfo( unsigned int column ) { - wxASSERT_MSG( HasColumnInfo(column), _T("invalid column index in wxMacListCtrlItem") ); + wxASSERT_MSG( HasColumnInfo(column), wxT("invalid column index in wxMacListCtrlItem") ); return m_rowItems[column]; }