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
This commit is contained in:
Vadim Zeitlin
2001-11-21 00:43:54 +00:00
parent 050c9e3c90
commit 2d33aec94c
4 changed files with 109 additions and 84 deletions

View File

@@ -372,9 +372,6 @@ public:
bool m_isCommandEvent; bool m_isCommandEvent;
private: private:
// normally copying the events is a bad idea, so disable this
wxEvent& operator=(const wxEvent&);
DECLARE_ABSTRACT_CLASS(wxEvent) DECLARE_ABSTRACT_CLASS(wxEvent)
}; };

View File

@@ -359,21 +359,18 @@ private:
class WXDLLEXPORT wxListEvent : public wxNotifyEvent class WXDLLEXPORT wxListEvent : public wxNotifyEvent
{ {
public: public:
wxListEvent(wxEventType commandType = wxEVT_NULL, int id = 0); wxListEvent(wxEventType commandType = wxEVT_NULL, int id = 0)
: wxNotifyEvent(commandType, id)
int m_code; {
long m_oldItemIndex; // only for wxEVT_COMMAND_LIST_CACHE_HINT m_code = 0;
long m_itemIndex; m_itemIndex =
int m_col; m_oldItemIndex = 0;
bool m_cancelled; m_col = 0;
wxPoint m_pointDrag; }
wxListItem m_item;
int GetCode() const { return m_code; } int GetCode() const { return m_code; }
long GetIndex() const { return m_itemIndex; } long GetIndex() const { return m_itemIndex; }
int GetColumn() const { return m_col; } int GetColumn() const { return m_col; }
bool Cancelled() const { return m_cancelled; }
wxPoint GetPoint() const { return m_pointDrag; } wxPoint GetPoint() const { return m_pointDrag; }
const wxString& GetLabel() const { return m_item.m_text; } const wxString& GetLabel() const { return m_item.m_text; }
const wxString& GetText() 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; } long GetOldItem() const { return 0; }
#endif // WXWIN_COMPATIBILITY_2_2 #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: private:
DECLARE_DYNAMIC_CLASS(wxListEvent) DECLARE_DYNAMIC_CLASS(wxListEvent)

View File

@@ -760,7 +760,8 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event)
{ {
switch ( event.GetCode() ) switch ( event.GetCode() )
{ {
case 'c': case 'c': // colorize
case 'C':
{ {
wxListItem info; wxListItem info;
info.m_itemId = event.GetIndex(); info.m_itemId = event.GetIndex();
@@ -772,10 +773,29 @@ void MyListCtrl::OnListKeyDown(wxListEvent& event)
info.SetTextColour(*wxCYAN); info.SetTextColour(*wxCYAN);
SetItem(info); SetItem(info);
RefreshItem(info.m_itemId);
} }
} }
break; 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: case WXK_DELETE:
{ {
long item = GetNextItem(-1, long item = GetNextItem(-1,
@@ -818,8 +838,19 @@ void MyListCtrl::OnChar(wxKeyEvent& event)
{ {
wxLogMessage(_T("Got char event.")); wxLogMessage(_T("Got char event."));
switch ( event.GetKeyCode() )
{
case 'n':
case 'N':
case 'c':
case 'C':
// these are the keys we process ourselves
break;
default:
event.Skip(); event.Skip();
} }
}
void MyListCtrl::LogEvent(const wxListEvent& event, const wxChar *eventName) void MyListCtrl::LogEvent(const wxListEvent& event, const wxChar *eventName)
{ {

View File

@@ -160,6 +160,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxListCtrl, wxControl)
IMPLEMENT_DYNAMIC_CLASS(wxListView, wxListCtrl) IMPLEMENT_DYNAMIC_CLASS(wxListView, wxListCtrl)
IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject) IMPLEMENT_DYNAMIC_CLASS(wxListItem, wxObject)
IMPLEMENT_DYNAMIC_CLASS(wxListEvent, wxNotifyEvent)
BEGIN_EVENT_TABLE(wxListCtrl, wxControl) BEGIN_EVENT_TABLE(wxListCtrl, wxControl)
EVT_PAINT(wxListCtrl::OnPaint) EVT_PAINT(wxListCtrl::OnPaint)
END_EVENT_TABLE() END_EVENT_TABLE()
@@ -168,41 +170,6 @@ END_EVENT_TABLE()
// implementation // 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 // wxListCtrl construction
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -702,6 +669,10 @@ bool wxListCtrl::SetItem(wxListItem& info)
LV_ITEM item; LV_ITEM item;
wxConvertToMSWListItem(this, info, item); wxConvertToMSWListItem(this, info, item);
// we could be changing only the attribute in which case we don't need to
// call ListView_SetItem() at all
if ( item.mask )
{
item.cchTextMax = 0; item.cchTextMax = 0;
if ( !ListView_SetItem(GetHwnd(), &item) ) if ( !ListView_SetItem(GetHwnd(), &item) )
{ {
@@ -709,6 +680,7 @@ bool wxListCtrl::SetItem(wxListItem& info)
return FALSE; return FALSE;
} }
}
// we need to update the item immediately to show the new image // we need to update the item immediately to show the new image
bool updateNow = (info.m_mask & wxLIST_MASK_IMAGE) != 0; bool updateNow = (info.m_mask & wxLIST_MASK_IMAGE) != 0;
@@ -732,7 +704,7 @@ bool wxListCtrl::SetItem(wxListItem& info)
if ( updateNow ) if ( updateNow )
{ {
// we need this to make the change visible right now // we need this to make the change visible right now
ListView_Update(GetHwnd(), item.iItem); RefreshItem(item.iItem);
} }
return TRUE; return TRUE;
@@ -779,6 +751,21 @@ bool wxListCtrl::SetItemState(long item, long state, long stateMask)
wxConvertToMSWFlags(state, stateMask, lvItem); 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, if ( !::SendMessage(GetHwnd(), LVM_SETITEMSTATE,
(WPARAM)item, (LPARAM)&lvItem) ) (WPARAM)item, (LPARAM)&lvItem) )
{ {
@@ -787,6 +774,11 @@ bool wxListCtrl::SetItemState(long item, long state, long stateMask)
return FALSE; return FALSE;
} }
if ( focusOld != -1 )
{
RefreshItem(focusOld);
}
return TRUE; return TRUE;
} }
@@ -855,26 +847,33 @@ bool wxListCtrl::SetItemData(long item, long data)
// Gets the item rectangle // Gets the item rectangle
bool wxListCtrl::GetItemRect(long item, wxRect& rect, int code) const 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 ) if ( code == wxLIST_RECT_BOUNDS )
code2 = LVIR_BOUNDS; codeWin = LVIR_BOUNDS;
else if ( code == wxLIST_RECT_ICON ) else if ( code == wxLIST_RECT_ICON )
code2 = LVIR_ICON; codeWin = LVIR_ICON;
else if ( code == wxLIST_RECT_LABEL ) 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__ #ifdef __WXWINE__
bool success = (ListView_GetItemRect(GetHwnd(), (int) item, &rect2 ) != 0); bool success = ListView_GetItemRect(GetHwnd(), (int) item, &rectWin ) != 0;
#else #else
bool success = (ListView_GetItemRect(GetHwnd(), (int) item, &rect2, code2) != 0); bool success = ListView_GetItemRect(GetHwnd(), (int) item, &rectWin, codeWin) != 0;
#endif #endif
rect.x = rect2.left; rect.x = rectWin.left;
rect.y = rect2.top; rect.y = rectWin.top;
rect.width = rect2.right - rect2.left; rect.width = rectWin.right - rectWin.left;
rect.height = rect2.bottom - rect2.top; rect.height = rectWin.bottom - rectWin.top;
return success; return success;
} }
@@ -2108,10 +2107,18 @@ void wxListCtrl::SetItemCount(long count)
void wxListCtrl::RefreshItem(long item) 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) ) if ( !ListView_Update(GetHwnd(), item) )
{ {
wxLogLastError(_T("ListView_Update")); wxLogLastError(_T("ListView_Update"));
} }
#else // 1
wxRect rect;
GetItemRect(item, rect);
RefreshRect(rect);
#endif // 0/1
} }
void wxListCtrl::RefreshItems(long itemFrom, long itemTo) void wxListCtrl::RefreshItems(long itemFrom, long itemTo)
@@ -2372,20 +2379,4 @@ static void wxConvertToMSWListCol(int col, const wxListItem& item,
#endif #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 #endif // wxUSE_LISTCTRL