X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/185fa6bf6f5f19944cf4ce6385df7a4a04c595db..56bd6aaca9d758663e202816e1861ee8674526e7:/src/msw/listbox.cpp diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index 5b2e30ab63..19a8753d28 100644 --- a/src/msw/listbox.cpp +++ b/src/msw/listbox.cpp @@ -48,10 +48,8 @@ #endif #ifndef __TWIN32__ - #if defined(__GNUWIN32__) - #ifndef wxUSE_NORLANDER_HEADERS - #include - #endif + #ifdef __GNUWIN32_OLD__ + #include "wx/msw/gnuwin32/extra.h" #endif #endif @@ -82,9 +80,7 @@ #endif #endif -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) -#endif // ============================================================================ // list box item declaration and implementation @@ -140,7 +136,9 @@ bool wxListBox::Create(wxWindow *parent, m_selected = 0; SetName(name); +#if wxUSE_VALIDATORS SetValidator(validator); +#endif // wxUSE_VALIDATORS if (parent) parent->AddChild(this); @@ -158,7 +156,7 @@ bool wxListBox::Create(wxWindow *parent, m_windowStyle = style; DWORD wstyle = WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | - LBS_NOTIFY | LBS_HASSTRINGS; + LBS_NOTIFY | LBS_HASSTRINGS /* | WS_CLIPSIBLINGS */; if (m_windowStyle & wxLB_MULTIPLE) wstyle |= LBS_MULTIPLESEL; else if (m_windowStyle & wxLB_EXTENDED) @@ -223,8 +221,6 @@ bool wxListBox::Create(wxWindow *parent, SetSize(x, y, width, height); - Show(TRUE); - return TRUE; } @@ -256,15 +252,15 @@ void wxListBox::Delete(int N) wxCHECK_RET( N >= 0 && N < m_noItems, wxT("invalid index in wxListBox::Delete") ); -#if wxUSE_OWNER_DRAWN - delete m_aItems[N]; - m_aItems.Remove(N); -#else // !wxUSE_OWNER_DRAWN - if ( HasClientObjectData() ) - { - delete GetClientObject(N); - } -#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN + // for owner drawn objects, the data is used for storing wxOwnerDrawn + // pointers and we shouldn't touch it +#if !wxUSE_OWNER_DRAWN + if ( !(m_windowStyle & wxLB_OWNERDRAW) ) +#endif // !wxUSE_OWNER_DRAWN + if ( HasClientObjectData() ) + { + delete GetClientObject(N); + } SendMessage(GetHwnd(), LB_DELETESTRING, N, 0); m_noItems--; @@ -283,6 +279,7 @@ int wxListBox::DoAppend(const wxString& item) pNewItem->SetName(item); m_aItems.Add(pNewItem); ListBox_SetItemData(GetHwnd(), index, pNewItem); + pNewItem->SetFont(GetFont()); } #endif @@ -293,7 +290,12 @@ int wxListBox::DoAppend(const wxString& item) 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()); @@ -305,8 +307,12 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) 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 @@ -334,7 +340,11 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) 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 @@ -468,9 +478,10 @@ int wxListBox::GetSelections(wxArrayInt& aSelections) 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(); } } @@ -479,8 +490,7 @@ int wxListBox::GetSelection() const { 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()); } @@ -623,7 +633,7 @@ void wxListBox::SetHorizontalExtent(const wxString& s) } } -wxSize wxListBox::DoGetBestSize() +wxSize wxListBox::DoGetBestSize() const { // find the widest string int wLine; @@ -658,68 +668,43 @@ wxSize wxListBox::DoGetBestSize() 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 ); - - return GetEventHandler()->ProcessEvent(event); + evtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED; + } + else + { + // some event we're not interested in + return FALSE; } - //else: - return FALSE; -} + wxCommandEvent event(evtType, m_windowId); + event.SetEventObject( this ); -WXHBRUSH wxListBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, - WXUINT message, WXWPARAM wParam, WXLPARAM lParam) -{ -#if wxUSE_CTL3D - if ( m_useCtl3D ) + wxArrayInt aSelections; + int n, count = GetSelections(aSelections); + if ( count > 0 ) { - HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam); - return (WXHBRUSH) hbrush; + n = aSelections[0]; + if ( HasClientObjectData() ) + event.SetClientObject( GetClientObject(n) ); + else if ( HasClientUntypedData() ) + event.SetClientData( GetClientData(n) ); + event.SetString( GetString(n) ); } -#endif - - if (GetParent()->GetTransparentBackground()) - SetBkMode((HDC) pDC, TRANSPARENT); else - SetBkMode((HDC) pDC, OPAQUE); - - ::SetBkColor((HDC) pDC, RGB(GetBackgroundColour().Red(), GetBackgroundColour().Green(), GetBackgroundColour().Blue())); - ::SetTextColor((HDC) pDC, RGB(GetForegroundColour().Red(), GetForegroundColour().Green(), GetForegroundColour().Blue())); + { + n = -1; + } - wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID); + event.m_commandInt = n; - // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush - // has a zero usage count. - backgroundBrush->RealizeResource(); - return (WXHBRUSH) backgroundBrush->GetResourceHandle(); + return GetEventHandler()->ProcessEvent(event); } // ---------------------------------------------------------------------------- @@ -747,13 +732,19 @@ bool wxListBox::MSWOnMeasure(WXMEASUREITEMSTRUCT *item) MEASUREITEMSTRUCT *pStruct = (MEASUREITEMSTRUCT *)item; + HDC hdc = CreateIC(wxT("DISPLAY"), NULL, NULL, 0); + wxDC dc; - dc.SetHDC((WXHDC)CreateIC(wxT("DISPLAY"), NULL, NULL, 0)); + dc.SetHDC((WXHDC)hdc); dc.SetFont(wxSystemSettings::GetSystemFont(wxSYS_ANSI_VAR_FONT)); pStruct->itemHeight = dc.GetCharHeight() + 2*OWNER_DRAWN_LISTBOX_EXTRA_SPACE; pStruct->itemWidth = dc.GetCharWidth(); + dc.SetHDC(0); + + DeleteDC(hdc); + return TRUE; } @@ -764,6 +755,11 @@ bool wxListBox::MSWOnDraw(WXDRAWITEMSTRUCT *item) 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); @@ -774,7 +770,7 @@ bool wxListBox::MSWOnDraw(WXDRAWITEMSTRUCT *item) 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,