#endif
#ifndef __TWIN32__
- #if defined(__GNUWIN32__)
- #ifndef wxUSE_NORLANDER_HEADERS
- #include "wx/msw/gnuwin32/extra.h"
- #endif
+ #ifdef __GNUWIN32_OLD__
+ #include "wx/msw/gnuwin32/extra.h"
#endif
#endif
m_selected = 0;
SetName(name);
+#if wxUSE_VALIDATORS
SetValidator(validator);
+#endif // wxUSE_VALIDATORS
if (parent)
parent->AddChild(this);
m_windowStyle = style;
DWORD wstyle = WS_VISIBLE | WS_VSCROLL | WS_TABSTOP |
- LBS_NOTIFY | LBS_HASSTRINGS;
+ LBS_NOTIFY | LBS_HASSTRINGS /* | WS_CLIPSIBLINGS */;
+
+ wxASSERT_MSG( !(style & wxLB_MULTIPLE) || !(style & wxLB_EXTENDED),
+ _T("only one of listbox selection modes can be specified") );
+
if (m_windowStyle & wxLB_MULTIPLE)
wstyle |= LBS_MULTIPLESEL;
else if (m_windowStyle & wxLB_EXTENDED)
SetSize(x, y, width, height);
- Show(TRUE);
-
return TRUE;
}
void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData)
{
- ShowWindow(GetHwnd(), SW_HIDE);
+ // avoid flicker - but don't need to do this for a hidden listbox
+ bool hideAndShow = IsShown();
+ if ( hideAndShow )
+ {
+ ShowWindow(GetHwnd(), SW_HIDE);
+ }
ListBox_ResetContent(GetHwnd());
if ( clientData )
{
#if wxUSE_OWNER_DRAWN
- wxASSERT_MSG(clientData[i] == NULL,
- wxT("Can't use client data with owner-drawn listboxes"));
+ if ( m_windowStyle & wxLB_OWNERDRAW )
+ {
+ wxASSERT_MSG(clientData[i] == NULL,
+ wxT("Can't use client data with owner-drawn listboxes"));
+ }
+ ListBox_SetItemData(GetHwnd(), i, clientData[i]);
#else // !wxUSE_OWNER_DRAWN
ListBox_SetItemData(GetHwnd(), i, clientData[i]);
#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
SetHorizontalExtent();
- ShowWindow(GetHwnd(), SW_SHOW);
+ if ( hideAndShow )
+ {
+ // show the listbox back if we hid it
+ ShowWindow(GetHwnd(), SW_SHOW);
+ }
}
int wxListBox::FindString(const wxString& s) const
}
else // single-selection listbox
{
- aSelections.Add(ListBox_GetCurSel(GetHwnd()));
+ if (ListBox_GetCurSel(GetHwnd()) > -1)
+ aSelections.Add(ListBox_GetCurSel(GetHwnd()));
- return 1;
+ return aSelections.Count();
}
}
{
wxCHECK_MSG( !HasMultipleSelection(),
-1,
- wxT("GetSelection() can't be used with multiple-selection "
- "listboxes, use GetSelections() instead.") );
+ wxT("GetSelection() can't be used with multiple-selection listboxes, use GetSelections() instead.") );
return ListBox_GetCurSel(GetHwnd());
}
bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id))
{
+ wxEventType evtType;
if ( param == LBN_SELCHANGE )
{
- wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId);
- event.SetEventObject( this );
-
- wxArrayInt aSelections;
- int n, count = GetSelections(aSelections);
- if ( count > 0 )
- {
- n = aSelections[0];
- if ( HasClientObjectData() )
- event.SetClientObject( GetClientObject(n) );
- else if ( HasClientUntypedData() )
- event.SetClientData( GetClientData(n) );
- event.SetString( GetString(n) );
- }
- else
- {
- n = -1;
- }
-
- event.m_commandInt = n;
-
- return GetEventHandler()->ProcessEvent(event);
+ evtType = wxEVT_COMMAND_LISTBOX_SELECTED;
}
else if ( param == LBN_DBLCLK )
{
- wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId);
- event.SetEventObject( this );
+ evtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED;
+ }
+ else
+ {
+ // some event we're not interested in
+ return FALSE;
+ }
+
+ wxCommandEvent event(evtType, m_windowId);
+ event.SetEventObject( this );
- return GetEventHandler()->ProcessEvent(event);
+ wxArrayInt aSelections;
+ int n, count = GetSelections(aSelections);
+ if ( count > 0 )
+ {
+ n = aSelections[0];
+ if ( HasClientObjectData() )
+ event.SetClientObject( GetClientObject(n) );
+ else if ( HasClientUntypedData() )
+ event.SetClientData( GetClientData(n) );
+ event.SetString( GetString(n) );
+ }
+ else
+ {
+ n = -1;
}
- //else:
- return FALSE;
+ event.m_commandInt = n;
+
+ return GetEventHandler()->ProcessEvent(event);
}
// ----------------------------------------------------------------------------
wxCHECK( ((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), FALSE );
DRAWITEMSTRUCT *pStruct = (DRAWITEMSTRUCT *)item;
+ UINT itemID = pStruct->itemID;
+
+ // the item may be -1 for an empty listbox
+ if ( itemID == (UINT)-1 )
+ return FALSE;
long data = ListBox_GetItemData(GetHwnd(), pStruct->itemID);
wxDC dc;
dc.SetHDC((WXHDC)pStruct->hDC, FALSE);
wxRect rect(wxPoint(pStruct->rcItem.left, pStruct->rcItem.top),
- wxPoint(pStruct->rcItem.right, pStruct->rcItem.bottom));
+ wxPoint(pStruct->rcItem.right, pStruct->rcItem.bottom));
return pItem->OnDrawItem(dc, rect,
(wxOwnerDrawn::wxODAction)pStruct->itemAction,