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:
@@ -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)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user