From: Vadim Zeitlin Date: Wed, 21 Nov 2001 00:43:54 +0000 (+0000) Subject: 1. restored wxEvent::operator=() X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/2d33aec94c9217b94ada107fbd125db4c51c22ab 1. restored wxEvent::operator=() 2. removed wxListEvent::CopyObject() 3. refresh fixes to MSW virtual list control git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12554 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/event.h b/include/wx/event.h index 49c7f58471..c13191c6f8 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -372,9 +372,6 @@ public: bool m_isCommandEvent; private: - // normally copying the events is a bad idea, so disable this - wxEvent& operator=(const wxEvent&); - DECLARE_ABSTRACT_CLASS(wxEvent) }; diff --git a/include/wx/listctrl.h b/include/wx/listctrl.h index b6ee6e27ef..63d8e981b0 100644 --- a/include/wx/listctrl.h +++ b/include/wx/listctrl.h @@ -359,21 +359,18 @@ private: class WXDLLEXPORT wxListEvent : public wxNotifyEvent { public: - wxListEvent(wxEventType commandType = wxEVT_NULL, int id = 0); - - int m_code; - long m_oldItemIndex; // only for wxEVT_COMMAND_LIST_CACHE_HINT - long m_itemIndex; - int m_col; - bool m_cancelled; - wxPoint m_pointDrag; - - wxListItem m_item; + wxListEvent(wxEventType commandType = wxEVT_NULL, int id = 0) + : wxNotifyEvent(commandType, id) + { + m_code = 0; + m_itemIndex = + m_oldItemIndex = 0; + m_col = 0; + } int GetCode() const { return m_code; } long GetIndex() const { return m_itemIndex; } int GetColumn() const { return m_col; } - bool Cancelled() const { return m_cancelled; } wxPoint GetPoint() const { return m_pointDrag; } const wxString& GetLabel() const { return m_item.m_text; } const wxString& GetText() const { return m_item.m_text; } @@ -392,7 +389,16 @@ public: long GetOldItem() const { return 0; } #endif // WXWIN_COMPATIBILITY_2_2 - void CopyObject(wxObject& object_dest) const; + virtual wxEvent *Clone() const { return new wxListEvent(*this); } + +//protected: -- not for backwards compatibility + int m_code; + long m_oldItemIndex; // only for wxEVT_COMMAND_LIST_CACHE_HINT + long m_itemIndex; + int m_col; + wxPoint m_pointDrag; + + wxListItem m_item; private: DECLARE_DYNAMIC_CLASS(wxListEvent) diff --git a/samples/listctrl/listtest.cpp b/samples/listctrl/listtest.cpp index 2de2923e32..c1fd9dc512 100644 --- a/samples/listctrl/listtest.cpp +++ b/samples/listctrl/listtest.cpp @@ -760,7 +760,8 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event) { switch ( event.GetCode() ) { - case 'c': + case 'c': // colorize + case 'C': { wxListItem info; info.m_itemId = event.GetIndex(); @@ -772,10 +773,29 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event) info.SetTextColour(*wxCYAN); SetItem(info); + + RefreshItem(info.m_itemId); } } break; + case 'n': // next + case 'N': + { + long item = GetNextItem(-1, + wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED); + if ( item++ == GetItemCount() - 1 ) + { + item = 0; + } + + wxLogMessage(_T("Focusing item %ld"), item); + + SetItemState(item, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); + EnsureVisible(item); + } + break; + case WXK_DELETE: { long item = GetNextItem(-1, @@ -818,7 +838,18 @@ void MyListCtrl::OnChar(wxKeyEvent& event) { wxLogMessage(_T("Got char event.")); - event.Skip(); + switch ( event.GetKeyCode() ) + { + case 'n': + case 'N': + case 'c': + case 'C': + // these are the keys we process ourselves + break; + + default: + event.Skip(); + } } void MyListCtrl::LogEvent(const wxListEvent& event, const wxChar *eventName) diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index 597e46e504..bdab497417 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -160,6 +160,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl) IMPLEMENT_DYNAMIC_CLASS(wxListView, wxListCtrl) IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxNotifyEvent) + BEGIN_EVENT_TABLE(wxListCtrl, wxControl) EVT_PAINT(wxListCtrl::OnPaint) END_EVENT_TABLE() @@ -168,41 +170,6 @@ END_EVENT_TABLE() // implementation // ============================================================================ -// ---------------------------------------------------------------------------- -// wxListEvent -// ---------------------------------------------------------------------------- - -void wxListEvent::CopyObject(wxObject& object_dest) const -{ - wxListEvent *obj = (wxListEvent *)&object_dest; - - wxNotifyEvent::CopyObject(object_dest); - - obj->m_code = m_code; - obj->m_itemIndex = m_itemIndex; - obj->m_oldItemIndex = m_oldItemIndex; - obj->m_col = m_col; - obj->m_cancelled = m_cancelled; - obj->m_pointDrag = m_pointDrag; - obj->m_item.m_mask = m_item.m_mask; - obj->m_item.m_itemId = m_item.m_itemId; - obj->m_item.m_col = m_item.m_col; - obj->m_item.m_state = m_item.m_state; - obj->m_item.m_stateMask = m_item.m_stateMask; - obj->m_item.m_text = m_item.m_text; - obj->m_item.m_image = m_item.m_image; - obj->m_item.m_data = m_item.m_data; - obj->m_item.m_format = m_item.m_format; - obj->m_item.m_width = m_item.m_width; - - if ( m_item.HasAttributes() ) - { - obj->m_item.SetTextColour(m_item.GetTextColour()); - obj->m_item.SetBackgroundColour(m_item.GetBackgroundColour()); - obj->m_item.SetFont(m_item.GetFont()); - } -} - // ---------------------------------------------------------------------------- // wxListCtrl construction // ---------------------------------------------------------------------------- @@ -702,12 +669,17 @@ bool wxListCtrl::SetItem(wxListItem& info) LV_ITEM item; wxConvertToMSWListItem(this, info, item); - item.cchTextMax = 0; - if ( !ListView_SetItem(GetHwnd(), &item) ) + // we could be changing only the attribute in which case we don't need to + // call ListView_SetItem() at all + if ( item.mask ) { - wxLogDebug(_T("ListView_SetItem() failed")); + item.cchTextMax = 0; + if ( !ListView_SetItem(GetHwnd(), &item) ) + { + wxLogDebug(_T("ListView_SetItem() failed")); - return FALSE; + return FALSE; + } } // we need to update the item immediately to show the new image @@ -732,7 +704,7 @@ bool wxListCtrl::SetItem(wxListItem& info) if ( updateNow ) { // we need this to make the change visible right now - ListView_Update(GetHwnd(), item.iItem); + RefreshItem(item.iItem); } return TRUE; @@ -779,6 +751,21 @@ bool wxListCtrl::SetItemState(long item, long state, long stateMask) wxConvertToMSWFlags(state, stateMask, lvItem); + // for the virtual list controls we need to refresh the previously focused + // item manually when changing focus programmatically because otherwise it + // keeps its focus rectangle until next repaint (yet another comctl32 bug) + long focusOld; + if ( IsVirtual() && + (stateMask & wxLIST_STATE_FOCUSED) && + (state & wxLIST_STATE_FOCUSED) ) + { + focusOld = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED); + } + else + { + focusOld = -1; + } + if ( !::SendMessage(GetHwnd(), LVM_SETITEMSTATE, (WPARAM)item, (LPARAM)&lvItem) ) { @@ -787,6 +774,11 @@ bool wxListCtrl::SetItemState(long item, long state, long stateMask) return FALSE; } + if ( focusOld != -1 ) + { + RefreshItem(focusOld); + } + return TRUE; } @@ -855,26 +847,33 @@ bool wxListCtrl::SetItemData(long item, long data) // Gets the item rectangle bool wxListCtrl::GetItemRect(long item, wxRect& rect, int code) const { - RECT rect2; + RECT rectWin; - int code2 = LVIR_BOUNDS; + int codeWin; if ( code == wxLIST_RECT_BOUNDS ) - code2 = LVIR_BOUNDS; + codeWin = LVIR_BOUNDS; else if ( code == wxLIST_RECT_ICON ) - code2 = LVIR_ICON; + codeWin = LVIR_ICON; else if ( code == wxLIST_RECT_LABEL ) - code2 = LVIR_LABEL; + codeWin = LVIR_LABEL; + else + { + wxFAIL_MSG( _T("incorrect code in GetItemRect()") ); + + codeWin = LVIR_BOUNDS; + } #ifdef __WXWINE__ - bool success = (ListView_GetItemRect(GetHwnd(), (int) item, &rect2 ) != 0); + bool success = ListView_GetItemRect(GetHwnd(), (int) item, &rectWin ) != 0; #else - bool success = (ListView_GetItemRect(GetHwnd(), (int) item, &rect2, code2) != 0); + bool success = ListView_GetItemRect(GetHwnd(), (int) item, &rectWin, codeWin) != 0; #endif - rect.x = rect2.left; - rect.y = rect2.top; - rect.width = rect2.right - rect2.left; - rect.height = rect2.bottom - rect2.top; + rect.x = rectWin.left; + rect.y = rectWin.top; + rect.width = rectWin.right - rectWin.left; + rect.height = rectWin.bottom - rectWin.top; + return success; } @@ -2108,10 +2107,18 @@ void wxListCtrl::SetItemCount(long count) void wxListCtrl::RefreshItem(long item) { + // strangely enough, ListView_Update() results in much more flicker here + // than a dumb Refresh() -- why? +#if 0 if ( !ListView_Update(GetHwnd(), item) ) { wxLogLastError(_T("ListView_Update")); } +#else // 1 + wxRect rect; + GetItemRect(item, rect); + RefreshRect(rect); +#endif // 0/1 } void wxListCtrl::RefreshItems(long itemFrom, long itemTo) @@ -2372,20 +2379,4 @@ static void wxConvertToMSWListCol(int col, const wxListItem& item, #endif } -// ---------------------------------------------------------------------------- -// List event -// ---------------------------------------------------------------------------- - -IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxNotifyEvent) - -wxListEvent::wxListEvent(wxEventType commandType, int id) - : wxNotifyEvent(commandType, id) -{ - m_code = 0; - m_itemIndex = 0; - m_oldItemIndex = 0; - m_col = 0; - m_cancelled = FALSE; -} - #endif // wxUSE_LISTCTRL