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

@@ -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