Fixed interpretation of selection and added selection/check notification
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37709 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -65,6 +65,8 @@ public:
|
|||||||
virtual bool IsSelected(int n) const;
|
virtual bool IsSelected(int n) const;
|
||||||
virtual void SetString(int n, const wxString& s);
|
virtual void SetString(int n, const wxString& s);
|
||||||
|
|
||||||
|
// Implementation
|
||||||
|
virtual bool MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result);
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void OnSize(wxSizeEvent& event);
|
void OnSize(wxSizeEvent& event);
|
||||||
|
@@ -211,16 +211,25 @@ int wxCheckListBox::GetCount() const
|
|||||||
|
|
||||||
int wxCheckListBox::GetSelection() const
|
int wxCheckListBox::GetSelection() const
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < GetCount(); i++)
|
||||||
|
{
|
||||||
|
int selState = ListView_GetItemState(GetHwnd(), i, LVIS_SELECTED);
|
||||||
|
if (selState == LVIS_SELECTED)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
return wxNOT_FOUND;
|
return wxNOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxCheckListBox::GetSelections(wxArrayInt& aSelections) const
|
int wxCheckListBox::GetSelections(wxArrayInt& aSelections) const
|
||||||
{
|
{
|
||||||
int n = GetCount();
|
int i;
|
||||||
while ( n > 0 )
|
for (i = 0; i < GetCount(); i++)
|
||||||
{
|
{
|
||||||
n--;
|
int selState = ListView_GetItemState(GetHwnd(), i, LVIS_SELECTED);
|
||||||
if(IsChecked(n)) aSelections.Insert(n,0);
|
if (selState == LVIS_SELECTED)
|
||||||
|
aSelections.Add(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
return aSelections.GetCount();
|
return aSelections.GetCount();
|
||||||
@@ -238,7 +247,8 @@ wxString wxCheckListBox::GetString(int n) const
|
|||||||
|
|
||||||
bool wxCheckListBox::IsSelected(int n) const
|
bool wxCheckListBox::IsSelected(int n) const
|
||||||
{
|
{
|
||||||
return IsChecked(n);
|
int selState = ListView_GetItemState(GetHwnd(), n, LVIS_SELECTED);
|
||||||
|
return (selState == LVIS_SELECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxCheckListBox::SetString(int n, const wxString& s)
|
void wxCheckListBox::SetString(int n, const wxString& s)
|
||||||
@@ -317,7 +327,93 @@ void wxCheckListBox::DoSetItems(const wxArrayString& items, void **clientData)
|
|||||||
|
|
||||||
void wxCheckListBox::DoSetSelection(int n, bool select)
|
void wxCheckListBox::DoSetSelection(int n, bool select)
|
||||||
{
|
{
|
||||||
Check(n,select);
|
ListView_SetItemState(GetHwnd(), n, select ? LVIS_SELECTED : 0, LVIS_SELECTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool wxCheckListBox::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM *result)
|
||||||
|
{
|
||||||
|
// prepare the event
|
||||||
|
// -----------------
|
||||||
|
|
||||||
|
wxCommandEvent event(wxEVT_NULL, m_windowId);
|
||||||
|
event.SetEventObject(this);
|
||||||
|
|
||||||
|
wxEventType eventType = wxEVT_NULL;
|
||||||
|
|
||||||
|
NMHDR *nmhdr = (NMHDR *)lParam;
|
||||||
|
|
||||||
|
if ( nmhdr->hwndFrom == GetHwnd() )
|
||||||
|
{
|
||||||
|
// almost all messages use NM_LISTVIEW
|
||||||
|
NM_LISTVIEW *nmLV = (NM_LISTVIEW *)nmhdr;
|
||||||
|
|
||||||
|
const int iItem = nmLV->iItem;
|
||||||
|
|
||||||
|
bool processed = true;
|
||||||
|
switch ( nmhdr->code )
|
||||||
|
{
|
||||||
|
case LVN_ITEMCHANGED:
|
||||||
|
// we translate this catch all message into more interesting
|
||||||
|
// (and more easy to process) wxWidgets events
|
||||||
|
|
||||||
|
// first of all, we deal with the state change events only and
|
||||||
|
// only for valid items (item == -1 for the virtual list
|
||||||
|
// control)
|
||||||
|
if ( nmLV->uChanged & LVIF_STATE && iItem != -1 )
|
||||||
|
{
|
||||||
|
// temp vars for readability
|
||||||
|
const UINT stOld = nmLV->uOldState;
|
||||||
|
const UINT stNew = nmLV->uNewState;
|
||||||
|
|
||||||
|
// Check image changed
|
||||||
|
if ((stOld & LVIS_STATEIMAGEMASK) != (stNew & LVIS_STATEIMAGEMASK))
|
||||||
|
{
|
||||||
|
event.SetEventType(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED);
|
||||||
|
event.SetInt(IsChecked(iItem));
|
||||||
|
(void) GetEventHandler()->ProcessEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (stNew & LVIS_SELECTED) != (stOld & LVIS_SELECTED) )
|
||||||
|
{
|
||||||
|
eventType = wxEVT_COMMAND_LISTBOX_SELECTED;
|
||||||
|
|
||||||
|
event.SetExtraLong( (stNew & LVIS_SELECTED) != 0 ); // is a selection
|
||||||
|
event.SetInt(iItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( eventType == wxEVT_NULL )
|
||||||
|
{
|
||||||
|
// not an interesting event for us
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
processed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !processed )
|
||||||
|
return wxControl::MSWOnNotify(idCtrl, lParam, result);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// where did this one come from?
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// process the event
|
||||||
|
// -----------------
|
||||||
|
|
||||||
|
event.SetEventType(eventType);
|
||||||
|
|
||||||
|
bool processed = GetEventHandler()->ProcessEvent(event);
|
||||||
|
if ( processed )
|
||||||
|
*result = 0;
|
||||||
|
|
||||||
|
return processed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user