X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77ffb5937e89927b621128789401db8921fe580f..3c99602b795292c52aafd12c71cac668ffdbf08f:/src/msw/listbox.cpp diff --git a/src/msw/listbox.cpp b/src/msw/listbox.cpp index e45103c7b1..5f27c25a6e 100644 --- a/src/msw/listbox.cpp +++ b/src/msw/listbox.cpp @@ -6,7 +6,7 @@ // Created: // RCS-ID: $Id$ // Copyright: (c) Julian Smart -// Licence: wxWidgets licence +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) @@ -43,10 +43,6 @@ #include "wx/ownerdrw.h" #endif -#ifdef __GNUWIN32_OLD__ - #include "wx/msw/gnuwin32/extra.h" -#endif - #if wxUSE_EXTENDED_RTTI WX_DEFINE_FLAGS( wxListBoxStyle ) @@ -91,12 +87,12 @@ wxEND_FLAGS( wxListBoxStyle ) IMPLEMENT_DYNAMIC_CLASS_XTI(wxListBox, wxControl,"wx/listbox.h") wxBEGIN_PROPERTIES_TABLE(wxListBox) - wxEVENT_PROPERTY( Select , wxEVT_COMMAND_LISTBOX_SELECTED , wxCommandEvent ) - wxEVENT_PROPERTY( DoubleClick , wxEVT_COMMAND_LISTBOX_DOUBLECLICKED , wxCommandEvent ) + wxEVENT_PROPERTY( Select , wxEVT_COMMAND_LISTBOX_SELECTED , wxCommandEvent ) + wxEVENT_PROPERTY( DoubleClick , wxEVT_COMMAND_LISTBOX_DOUBLECLICKED , wxCommandEvent ) wxPROPERTY( Font , wxFont , SetFont , GetFont , EMPTY_MACROVALUE, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) wxPROPERTY_COLLECTION( Choices , wxArrayString , wxString , AppendString , GetStrings, 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) - wxPROPERTY( Selection ,int, SetSelection, GetSelection, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) + wxPROPERTY( Selection ,int, SetSelection, GetSelection, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group") ) wxPROPERTY_FLAGS( WindowStyle , wxListBoxStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style wxEND_PROPERTIES_TABLE() @@ -110,9 +106,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl) /* TODO PROPERTIES - selection - content - item + selection + content + item */ // ============================================================================ @@ -127,7 +123,7 @@ public: wxListBoxItem(const wxString& str = wxEmptyString); }; -wxListBoxItem::wxListBoxItem(const wxString& str) : wxOwnerDrawn(str, FALSE) +wxListBoxItem::wxListBoxItem(const wxString& str) : wxOwnerDrawn(str, false) { // no bitmaps/checkmarks SetMarginWidth(0); @@ -287,6 +283,8 @@ void wxListBox::Delete(int N) int wxListBox::DoAppend(const wxString& item) { + InvalidateBestSize(); + int index = ListBox_AddString(GetHwnd(), item); m_noItems++; @@ -388,7 +386,7 @@ void wxListBox::Free() } } -void wxListBox::SetSelection(int N, bool select) +void wxListBox::DoSetSelection(int N, bool select) { wxCHECK_RET( N == wxNOT_FOUND || (N >= 0 && N < m_noItems), @@ -406,10 +404,10 @@ void wxListBox::SetSelection(int N, bool select) bool wxListBox::IsSelected(int N) const { - wxCHECK_MSG( N >= 0 && N < m_noItems, FALSE, + wxCHECK_MSG( N >= 0 && N < m_noItems, false, wxT("invalid index in wxListBox::Selected") ); - return SendMessage(GetHwnd(), LB_GETSEL, N, 0) == 0 ? FALSE : TRUE; + return SendMessage(GetHwnd(), LB_GETSEL, N, 0) == 0 ? false : true; } wxClientData* wxListBox::DoGetItemClientObject(int n) const @@ -505,13 +503,13 @@ int wxListBox::GetSelection() const wxString wxListBox::GetString(int N) const { wxCHECK_MSG( N >= 0 && N < m_noItems, wxEmptyString, - wxT("invalid index in wxListBox::GetClientData") ); + wxT("invalid index in wxListBox::GetString") ); int len = ListBox_GetTextLen(GetHwnd(), N); // +1 for terminating NUL wxString result; - ListBox_GetText(GetHwnd(), N, wxStringBuffer(result, len + 1)); + ListBox_GetText(GetHwnd(), N, (wxChar*)wxStringBuffer(result, len + 1)); return result; } @@ -522,6 +520,8 @@ wxListBox::DoInsertItems(const wxArrayString& items, int pos) wxCHECK_RET( pos >= 0 && pos <= m_noItems, wxT("invalid index in wxListBox::InsertItems") ); + InvalidateBestSize(); + int nItems = items.GetCount(); for ( int i = 0; i < nItems; i++ ) { @@ -537,6 +537,8 @@ wxListBox::DoInsertItems(const wxArrayString& items, int pos) ListBox_SetItemData(GetHwnd(), idx, pNewItem); } +#else + wxUnusedVar(idx); #endif // wxUSE_OWNER_DRAWN } @@ -610,12 +612,12 @@ void wxListBox::SetHorizontalExtent(const wxString& s) return; TEXTMETRIC lpTextMetric; - if ( !s.IsEmpty() ) + if ( !s.empty() ) { int existingExtent = (int)SendMessage(GetHwnd(), LB_GETHORIZONTALEXTENT, 0, 0L); HDC dc = GetWindowDC(GetHwnd()); HFONT oldFont = 0; - if (GetFont().Ok() && GetFont().GetResourceHandle()) + if (GetFont().Ok() && GetFont().GetResourceHandle() != 0) oldFont = (HFONT) ::SelectObject(dc, (HFONT) GetFont().GetResourceHandle()); GetTextMetrics(dc, &lpTextMetric); @@ -635,19 +637,16 @@ void wxListBox::SetHorizontalExtent(const wxString& s) int largestExtent = 0; HDC dc = GetWindowDC(GetHwnd()); HFONT oldFont = 0; - if (GetFont().Ok() && GetFont().GetResourceHandle()) + if (GetFont().Ok() && GetFont().GetResourceHandle() != 0) oldFont = (HFONT) ::SelectObject(dc, (HFONT) GetFont().GetResourceHandle()); GetTextMetrics(dc, &lpTextMetric); - // FIXME: buffer overflow!! - wxChar buf[1024]; for (int i = 0; i < m_noItems; i++) { - int len = (int)SendMessage(GetHwnd(), LB_GETTEXT, i, (LPARAM)buf); - buf[len] = 0; + wxString str = GetString(i); SIZE extentXY; - ::GetTextExtentPoint(dc, buf, len, &extentXY); + ::GetTextExtentPoint(dc, str.c_str(), str.length(), &extentXY); int extentX = (int)(extentXY.cx + lpTextMetric.tmAveCharWidth); if (extentX > largestExtent) largestExtent = extentX; @@ -680,10 +679,13 @@ wxSize wxListBox::DoGetBestSize() const // the listbox should be slightly larger than the widest string int cx, cy; - wxGetCharSize(GetHWND(), &cx, &cy, &GetFont()); + wxGetCharSize(GetHWND(), &cx, &cy, GetFont()); wListbox += 3*cx; + // Add room for the scrollbar + wListbox += wxSystemSettings::GetMetric(wxSYS_VSCROLL_X); + // don't make the listbox too tall (limit height to 10 items) but don't // make it too small neither int hListbox = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy)* @@ -710,7 +712,7 @@ bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) else { // some event we're not interested in - return FALSE; + return false; } wxCommandEvent event(evtType, m_windowId); @@ -726,10 +728,10 @@ bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) event.SetClientData( GetClientData(n) ); event.SetString( GetString(n) ); - event.SetExtraLong( HasMultipleSelection() ? IsSelected(n) : TRUE ); + event.SetExtraLong( HasMultipleSelection() ? IsSelected(n) : true ); } - event.m_commandInt = n; + event.SetInt(n); return GetEventHandler()->ProcessEvent(event); } @@ -755,7 +757,7 @@ bool wxListBox::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) bool wxListBox::MSWOnMeasure(WXMEASUREITEMSTRUCT *item) { // only owner-drawn control should receive this message - wxCHECK( ((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), FALSE ); + wxCHECK( ((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), false ); MEASUREITEMSTRUCT *pStruct = (MEASUREITEMSTRUCT *)item; @@ -767,7 +769,7 @@ bool wxListBox::MSWOnMeasure(WXMEASUREITEMSTRUCT *item) wxDC dc; dc.SetHDC((WXHDC)hdc); - dc.SetFont(wxSystemSettings::GetFont(wxSYS_ANSI_VAR_FONT)); + dc.SetFont(GetFont()); pStruct->itemHeight = dc.GetCharHeight() + 2*OWNER_DRAWN_LISTBOX_EXTRA_SPACE; pStruct->itemWidth = dc.GetCharWidth(); @@ -776,31 +778,32 @@ bool wxListBox::MSWOnMeasure(WXMEASUREITEMSTRUCT *item) DeleteDC(hdc); - return TRUE; + return true; } // forward the message to the appropriate item bool wxListBox::MSWOnDraw(WXDRAWITEMSTRUCT *item) { // only owner-drawn control should receive this message - wxCHECK( ((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), FALSE ); + 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; + return false; long data = ListBox_GetItemData(GetHwnd(), pStruct->itemID); - wxCHECK( data && (data != LB_ERR), FALSE ); + wxCHECK( data && (data != LB_ERR), false ); wxListBoxItem *pItem = (wxListBoxItem *)data; wxDCTemp dc((WXHDC)pStruct->hDC); - wxRect rect(wxPoint(pStruct->rcItem.left, pStruct->rcItem.top), - wxPoint(pStruct->rcItem.right, pStruct->rcItem.bottom)); + wxPoint pt1(pStruct->rcItem.left, pStruct->rcItem.top); + wxPoint pt2(pStruct->rcItem.right, pStruct->rcItem.bottom); + wxRect rect(pt1, pt2); return pItem->OnDrawItem(dc, rect, (wxOwnerDrawn::wxODAction)pStruct->itemAction,