X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2ee3ee1bc8ac2f95029835ebc115fac0a1fbd02a..0b7e6e7da208b6a95fb23cb50286a09dc90d96d2:/src/msw/listbox.cpp diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index 3d23429617..067fc11d90 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); @@ -230,12 +228,7 @@ bool wxListBox::Create(wxWindow *parent, wxListBox::~wxListBox() { -#if wxUSE_OWNER_DRAWN - size_t uiCount = m_aItems.Count(); - while ( uiCount-- != 0 ) { - delete m_aItems[uiCount]; - } -#endif // wxUSE_OWNER_DRAWN + Free(); } void wxListBox::SetupColours() @@ -261,6 +254,16 @@ void wxListBox::Delete(int N) wxCHECK_RET( N >= 0 && N < m_noItems, wxT("invalid index in wxListBox::Delete") ); + // 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--; @@ -278,6 +281,7 @@ int wxListBox::DoAppend(const wxString& item) pNewItem->SetName(item); m_aItems.Add(pNewItem); ListBox_SetItemData(GetHwnd(), index, pNewItem); + pNewItem->SetFont(GetFont()); } #endif @@ -300,7 +304,7 @@ void wxListBox::DoSetItems(const wxArrayString& choices, void** clientData) if ( clientData ) { #if wxUSE_OWNER_DRAWN - wxASSERT_MSG(clientData[ui] == NULL, + wxASSERT_MSG(clientData[i] == NULL, wxT("Can't use client data with owner-drawn listboxes")); #else // !wxUSE_OWNER_DRAWN ListBox_SetItemData(GetHwnd(), i, clientData[i]); @@ -343,19 +347,35 @@ int wxListBox::FindString(const wxString& s) const void wxListBox::Clear() { + Free(); + ListBox_ResetContent(GetHwnd()); + m_noItems = 0; + SetHorizontalExtent(); +} + +void wxListBox::Free() +{ #if wxUSE_OWNER_DRAWN - size_t uiCount = m_aItems.Count(); - while ( uiCount-- != 0 ) { - delete m_aItems[uiCount]; - } + if ( m_windowStyle & wxLB_OWNERDRAW ) + { + size_t uiCount = m_aItems.Count(); + while ( uiCount-- != 0 ) { + delete m_aItems[uiCount]; + } - m_aItems.Clear(); + m_aItems.Clear(); + } + else #endif // wxUSE_OWNER_DRAWN - - m_noItems = 0; - SetHorizontalExtent(); + if ( HasClientObjectData() ) + { + for ( size_t n = 0; n < (size_t)m_noItems; n++ ) + { + delete GetClientObject(n); + } + } } void wxListBox::SetSelection(int N, bool select) @@ -381,12 +401,12 @@ bool wxListBox::IsSelected(int N) const return SendMessage(GetHwnd(), LB_GETSEL, N, 0) == 0 ? FALSE : TRUE; } -wxClientData* wxListBox::DoGetClientObject(int n) const +wxClientData* wxListBox::DoGetItemClientObject(int n) const { - return (wxClientData *)DoGetClientData(n); + return (wxClientData *)DoGetItemClientData(n); } -void *wxListBox::DoGetClientData(int n) const +void *wxListBox::DoGetItemClientData(int n) const { wxCHECK_MSG( n >= 0 && n < m_noItems, NULL, wxT("invalid index in wxListBox::GetClientData") ); @@ -394,12 +414,12 @@ void *wxListBox::DoGetClientData(int n) const return (void *)SendMessage(GetHwnd(), LB_GETITEMDATA, n, 0); } -void wxListBox::DoSetClientObject(int n, wxClientData* clientData) +void wxListBox::DoSetItemClientObject(int n, wxClientData* clientData) { - DoSetClientData(n, clientData); + DoSetItemClientData(n, clientData); } -void wxListBox::DoSetClientData(int n, void *clientData) +void wxListBox::DoSetItemClientData(int n, void *clientData) { wxCHECK_RET( n >= 0 && n < m_noItems, wxT("invalid index in wxListBox::SetClientData") ); @@ -602,7 +622,7 @@ void wxListBox::SetHorizontalExtent(const wxString& s) } } -wxSize wxListBox::DoGetBestSize() +wxSize wxListBox::DoGetBestSize() const { // find the widest string int wLine; @@ -637,73 +657,41 @@ wxSize wxListBox::DoGetBestSize() bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) { - /* - if (param == LBN_SELCANCEL) - { - event.extraLong = FALSE; - } - */ - if (param == LBN_SELCHANGE) + if ( param == LBN_SELCHANGE ) { wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, m_windowId); + event.SetEventObject( this ); + wxArrayInt aSelections; - int count = GetSelections(aSelections); + int n, count = GetSelections(aSelections); if ( count > 0 ) { - event.m_commandInt = aSelections[0]; - event.m_clientData = GetClientData(event.m_commandInt); - wxString str(GetString(event.m_commandInt)); - if (str != wxT("")) - { - event.m_commandString = str; - } + n = aSelections[0]; + if ( HasClientObjectData() ) + event.SetClientObject( GetClientObject(n) ); + else if ( HasClientUntypedData() ) + event.SetClientData( GetClientData(n) ); + event.SetString( GetString(n) ); } else { - event.m_commandInt = -1; - event.m_commandString.Empty(); + n = -1; } - event.SetEventObject( this ); - ProcessCommand(event); - return TRUE; + event.m_commandInt = n; + + return GetEventHandler()->ProcessEvent(event); } - else if (param == LBN_DBLCLK) + else if ( param == LBN_DBLCLK ) { wxCommandEvent event(wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, m_windowId); event.SetEventObject( this ); - GetEventHandler()->ProcessEvent(event); - return TRUE; - } - - return FALSE; -} -WXHBRUSH wxListBox::OnCtlColor(WXHDC pDC, WXHWND pWnd, WXUINT nCtlColor, - WXUINT message, WXWPARAM wParam, WXLPARAM lParam) -{ -#if wxUSE_CTL3D - if ( m_useCtl3D ) - { - HBRUSH hbrush = Ctl3dCtlColorEx(message, wParam, lParam); - return (WXHBRUSH) hbrush; + return GetEventHandler()->ProcessEvent(event); } -#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())); + //else: - wxBrush *backgroundBrush = wxTheBrushList->FindOrCreateBrush(GetBackgroundColour(), wxSOLID); - - // Note that this will be cleaned up in wxApp::OnIdle, if backgroundBrush - // has a zero usage count. - backgroundBrush->RealizeResource(); - return (WXHBRUSH) backgroundBrush->GetResourceHandle(); + return FALSE; } // ---------------------------------------------------------------------------- @@ -731,13 +719,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; }