X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b3260bce473ab247edd8ca1d3aee4eb648b4b97e..a7d5151df02bf70a9f6ff1c5c7fd33ab07bf409c:/src/os2/listbox.cpp diff --git a/src/os2/listbox.cpp b/src/os2/listbox.cpp index 2e7ffc1757..d5e6bc01fa 100644 --- a/src/os2/listbox.cpp +++ b/src/os2/listbox.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: listbox.cpp +// Name: src/os2/listbox.cpp // Purpose: wxListBox // Author: David Webster // Modified by: @@ -21,6 +21,7 @@ #include "wx/brush.h" #include "wx/font.h" #include "wx/dc.h" +#include "wx/dcscreen.h" #include "wx/utils.h" #include "wx/scrolwin.h" #endif @@ -48,14 +49,14 @@ class wxListBoxItem : public wxOwnerDrawn { public: - wxListBoxItem(const wxString& rsStr = ""); + wxListBoxItem(const wxString& rsStr = wxEmptyString); }; wxListBoxItem::wxListBoxItem( const wxString& rsStr ) : wxOwnerDrawn( rsStr - ,FALSE + ,false ) { // @@ -64,9 +65,7 @@ wxListBoxItem::wxListBoxItem( SetMarginWidth(0); } // end of wxListBoxItem::wxListBoxItem -wxOwnerDrawn* wxListBox::CreateItem( - size_t n -) +wxOwnerDrawn* wxListBox::CreateItem( size_t WXUNUSED(n) ) { return new wxListBoxItem(); } // end of wxListBox::CreateItem @@ -84,6 +83,23 @@ wxListBox::wxListBox() m_nSelected = 0; } // end of wxListBox::wxListBox +bool wxListBox::Create( + wxWindow* pParent +, wxWindowID vId +, const wxPoint& rPos +, const wxSize& rSize +, const wxArrayString& asChoices +, long lStyle +, const wxValidator& rValidator +, const wxString& rsName +) +{ + wxCArrayString chs(asChoices); + + return Create(pParent, vId, rPos, rSize, chs.GetCount(), chs.GetStrings(), + lStyle, rValidator, rsName); +} + bool wxListBox::Create( wxWindow* pParent , wxWindowID vId @@ -92,9 +108,7 @@ bool wxListBox::Create( , int n , const wxString asChoices[] , long lStyle -#if wxUSE_VALIDATORS , const wxValidator& rValidator -#endif , const wxString& rsName ) { @@ -112,7 +126,7 @@ bool wxListBox::Create( wxSystemSettings vSettings; - SetBackgroundColour(vSettings.GetSystemColour(wxSYS_COLOUR_WINDOW)); + SetBackgroundColour(vSettings.GetColour(wxSYS_COLOUR_WINDOW)); SetForegroundColour(pParent->GetForegroundColour()); m_windowId = (vId == -1) ? (int)NewControlId() : vId; @@ -156,7 +170,7 @@ bool wxListBox::Create( ); if (m_hWnd == 0) { - return FALSE; + return false; } // @@ -178,11 +192,11 @@ bool wxListBox::Create( SetFont(*pTextFont); // - // Set standard wxWindows colors for Listbox items and highlighting + // Set OS/2 system colours for Listbox items and highlighting // wxColour vColour; - vColour.Set(wxString("WHITE")); + vColour = wxSystemSettingsNative::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT); LONG lColor = (LONG)vColour.GetPixel(); @@ -191,7 +205,7 @@ bool wxListBox::Create( ,sizeof(LONG) ,(PVOID)&lColor ); - vColour.Set(wxString("NAVY")); + vColour = wxSystemSettingsNative::GetColour(wxSYS_COLOUR_HIGHLIGHT); lColor = (LONG)vColour.GetPixel(); ::WinSetPresParam( m_hWnd ,PP_HILITEBACKGROUNDCOLOR @@ -199,13 +213,15 @@ bool wxListBox::Create( ,(PVOID)&lColor ); + SetXComp(0); + SetYComp(0); SetSize( nX ,nY ,nWidth ,nHeight ); delete pTextFont; - return TRUE; + return true; } // end of wxListBox::Create wxListBox::~wxListBox() @@ -265,28 +281,30 @@ int wxListBox::DoAppend( const wxString& rsItem ) { - int nIndex = 0; - SHORT nIndexType = 0; + long lIndex = 0; + LONG lIndexType = 0; if (m_windowStyle & wxLB_SORT) - nIndexType = LIT_SORTASCENDING; + lIndexType = LIT_SORTASCENDING; else - nIndexType = LIT_END; - nIndex = (int)::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)nIndexType, (MPARAM)rsItem.c_str()); + lIndexType = LIT_END; + lIndex = (long)::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)lIndexType, (MPARAM)rsItem.c_str()); m_nNumItems++; #if wxUSE_OWNER_DRAWN if (m_windowStyle & wxLB_OWNERDRAW) { - wxOwnerDrawn* pNewItem = CreateItem(nIndex); // dummy argument + wxOwnerDrawn* pNewItem = CreateItem(lIndex); // dummy argument + wxScreenDC vDc; + pNewItem->SetName(rsItem); - m_aItems.Add(pNewItem); - ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, (MPARAM)((SHORT)nIndex), MPFROMP(pNewItem)); + m_aItems.Insert(pNewItem, lIndex); + ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, (MPARAM)lIndex, MPFROMP(pNewItem)); pNewItem->SetFont(GetFont()); } #endif - return nIndex; + return (int)lIndex; } // end of wxListBox::DoAppend void wxListBox::DoSetItems( @@ -295,9 +313,8 @@ void wxListBox::DoSetItems( ) { BOOL bHideAndShow = IsShown(); - int nCount = 0; int i; - SHORT nIndexType = 0; + LONG lIndexType = 0; if (bHideAndShow) { @@ -309,10 +326,10 @@ void wxListBox::DoSetItems( { if (m_windowStyle & wxLB_SORT) - nIndexType = LIT_SORTASCENDING; + lIndexType = LIT_SORTASCENDING; else - nIndexType = LIT_END; - ::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)nIndexType, (MPARAM)raChoices[i].c_str()); + lIndexType = LIT_END; + ::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)lIndexType, (MPARAM)raChoices[i].c_str()); if (ppClientData) { @@ -331,54 +348,24 @@ void wxListBox::DoSetItems( // // First delete old items // - size_t lUi = m_aItems.Count(); - - while (lUi-- != 0) - { - delete m_aItems[lUi]; - } - m_aItems.Empty(); + WX_CLEAR_ARRAY(m_aItems); // // Then create new ones // - for (lUi = 0; lUi < (size_t)m_nNumItems; lUi++) + for (size_t ui = 0; ui < (size_t)m_nNumItems; ui++) { - wxOwnerDrawn* pNewItem = CreateItem(lUi); + wxOwnerDrawn* pNewItem = CreateItem(ui); - pNewItem->SetName(raChoices[lUi]); + pNewItem->SetName(raChoices[ui]); m_aItems.Add(pNewItem); - ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, MPFROMLONG(lUi), MPFROMP(pNewItem)); + ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, MPFROMLONG(ui), MPFROMP(pNewItem)); } } #endif // wxUSE_OWNER_DRAWN ::WinShowWindow(GetHwnd(), TRUE); } // end of wxListBox::DoSetItems -int wxListBox::FindString( - const wxString& rsString -) const -{ - int nPos; - LONG lTextLength; - PSZ zStr; - - - for (nPos = 0; nPos < m_nNumItems; nPos++) - { - lTextLength = LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXTLENGTH, (MPARAM)nPos, (MPARAM)0)); - zStr = new char[lTextLength + 1]; - ::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXT, MPFROM2SHORT(nPos, (SHORT)lTextLength), (MPARAM)zStr); - if (rsString == (char*)zStr) - { - delete [] zStr; - break; - } - delete [] zStr; - } - return nPos; -} // end of wxListBox::FindString - void wxListBox::Clear() { #if wxUSE_OWNER_DRAWN @@ -404,7 +391,7 @@ void wxListBox::Clear() m_nNumItems = 0; } // end of wxListBox::Clear -void wxListBox::SetSelection( +void wxListBox::DoSetSelection( int N , bool bSelect ) @@ -416,19 +403,31 @@ void wxListBox::SetSelection( ,MPFROMLONG(N) ,(MPARAM)bSelect ); + if(m_windowStyle & wxLB_OWNERDRAW) + Refresh(); } // end of wxListBox::SetSelection bool wxListBox::IsSelected( int N ) const { - wxCHECK_MSG( N >= 0 && N < m_nNumItems, FALSE, + wxCHECK_MSG( N >= 0 && N < m_nNumItems, false, wxT("invalid index in wxListBox::Selected") ); LONG lItem; - lItem = LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYSELECTION, (MPARAM)N, (MPARAM)0)); - return (lItem != LIT_NONE); + if (GetWindowStyleFlag() & wxLB_EXTENDED) + { + if (N == 0) + lItem = LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYSELECTION, (MPARAM)LIT_FIRST, (MPARAM)0)); + else + lItem = LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYSELECTION, (MPARAM)(N - 1), (MPARAM)0)); + } + else + { + lItem = LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYSELECTION, (MPARAM)LIT_FIRST, (MPARAM)0)); + } + return (lItem == (LONG)N && lItem != LIT_NONE); } // end of wxListBox::IsSelected wxClientData* wxListBox::DoGetItemClientObject( @@ -485,9 +484,7 @@ bool wxListBox::HasMultipleSelection() const return (m_windowStyle & wxLB_MULTIPLE) || (m_windowStyle & wxLB_EXTENDED); } // end of wxListBox::HasMultipleSelection -int wxListBox::GetSelections( - wxArrayInt& raSelections -) const +int wxListBox::GetSelections( wxArrayInt& raSelections ) const { int nCount = 0; LONG lItem; @@ -534,7 +531,6 @@ int wxListBox::GetSelections( } return nCount; } - return 0; } else // single-selection listbox { @@ -570,14 +566,14 @@ wxString wxListBox::GetString( ) const { LONG lLen = 0; - char* zBuf; + wxChar* zBuf; wxString sResult; - wxCHECK_MSG( N >= 0 && N < m_nNumItems, "", + wxCHECK_MSG( N >= 0 && N < m_nNumItems, wxEmptyString, wxT("invalid index in wxListBox::GetClientData") ); lLen = LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXTLENGTH, (MPARAM)N, (MPARAM)0)); - zBuf = new char[lLen + 1]; + zBuf = new wxChar[lLen + 1]; ::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXT, MPFROM2SHORT((SHORT)N, (SHORT)lLen), (MPARAM)zBuf); zBuf[lLen] = '\0'; sResult = zBuf; @@ -596,8 +592,25 @@ void wxListBox::DoInsertItems( int nItems = asItems.GetCount(); for (int i = 0; i < nItems; i++) - ::WinSendMsg(GetHwnd(), LM_INSERTITEM, MPFROMLONG((LONG)(i + nPos)), (MPARAM)asItems[i].c_str()); - m_nNumItems += nItems; + { + int nIndex = (int)::WinSendMsg( GetHwnd() + ,LM_INSERTITEM + ,MPFROMLONG((LONG)(i + nPos)) + ,(MPARAM)asItems[i].c_str() + ); + + wxOwnerDrawn* pNewItem = CreateItem(nIndex); + + pNewItem->SetName(asItems[i]); + pNewItem->SetFont(GetFont()); + m_aItems.Insert(pNewItem, nIndex); + ::WinSendMsg( GetHwnd() + ,LM_SETITEMHANDLE + ,(MPARAM)((LONG)nIndex) + ,MPFROMP(pNewItem) + ); + m_nNumItems += nItems; + } } // end of wxListBox::DoInsertItems void wxListBox::SetString( @@ -685,6 +698,7 @@ wxSize wxListBox::DoGetBestSize() const int nListbox = 0; int nCx; int nCy; + wxFont vFont = (wxFont)GetFont(); for (int i = 0; i < m_nNumItems; i++) { @@ -711,7 +725,7 @@ wxSize wxListBox::DoGetBestSize() const wxGetCharSize( GetHWND() ,&nCx ,&nCy - ,(wxFont*)&GetFont() + ,&vFont ); nListbox += 3 * nCx; @@ -736,7 +750,7 @@ bool wxListBox::OS2Command( { eEvtType = wxEVT_COMMAND_LISTBOX_SELECTED; } - if (uParam == LN_ENTER) + else if (uParam == LN_ENTER) { eEvtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED; } @@ -745,7 +759,7 @@ bool wxListBox::OS2Command( // // Some event we're not interested in // - return FALSE; + return false; } wxCommandEvent vEvent( eEvtType ,m_windowId @@ -770,7 +784,7 @@ bool wxListBox::OS2Command( { n = -1; } - vEvent.m_commandInt = n; + vEvent.SetInt(n); return GetEventHandler()->ProcessEvent(vEvent); } // end of wxListBox::OS2Command @@ -786,22 +800,148 @@ bool wxListBox::OS2Command( // #define OWNER_DRAWN_LISTBOX_EXTRA_SPACE (1) -bool wxListBox::OS2OnMeasure(WXMEASUREITEMSTRUCT *item) +long wxListBox::OS2OnMeasure( + WXMEASUREITEMSTRUCT* pItem +) { + if (!pItem) + pItem = (WXMEASUREITEMSTRUCT*)new OWNERITEM; + + POWNERITEM pMeasureStruct = (POWNERITEM)pItem; + wxScreenDC vDc; + // - // TODO: Get to this eventually + // Only owner-drawn control should receive this message // - return TRUE; -} + wxCHECK( ((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), FALSE ); + + vDc.SetFont(GetFont()); + + wxCoord vHeight; + wxCoord vWidth; + + GetSize( &vWidth + ,NULL + ); + + pMeasureStruct->rclItem.xRight = (USHORT)vWidth; + pMeasureStruct->rclItem.xLeft = 0; + pMeasureStruct->rclItem.yTop = 0; + pMeasureStruct->rclItem.yBottom = 0; -bool wxListBox::OS2OnDraw(WXDRAWITEMSTRUCT *item) + vHeight = (wxCoord)(vDc.GetCharHeight() * 2.5); + pMeasureStruct->rclItem.yTop = (USHORT)vHeight; + + return long(MRFROM2SHORT((USHORT)vHeight, (USHORT)vWidth)); +} // end of wxListBox::OS2OnMeasure + +bool wxListBox::OS2OnDraw ( + WXDRAWITEMSTRUCT* pItem +) { + POWNERITEM pDrawStruct = (POWNERITEM)pItem; + LONG lItemID = pDrawStruct->idItem; + int eAction = 0; + int eStatus = 0; + // - // TODO: Get to this eventually + // Only owner-drawn control should receive this message // - return FALSE; -} + wxCHECK(((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), false); + + + // + // The item may be -1 for an empty listbox + // + if (lItemID == -1L) + return false; + + wxListBoxItem* pData = (wxListBoxItem*)PVOIDFROMMR( ::WinSendMsg( GetHwnd() + ,LM_QUERYITEMHANDLE + ,MPFROMLONG(pDrawStruct->idItem) + ,(MPARAM)0 + ) + ); + + wxCHECK(pData, false ); + + wxDC vDc; + wxPoint pt1( pDrawStruct->rclItem.xLeft, pDrawStruct->rclItem.yTop ); + wxPoint pt2( pDrawStruct->rclItem.xRight, pDrawStruct->rclItem.yBottom ); + wxRect vRect( pt1, pt2 ); + + vDc.SetHPS(pDrawStruct->hps); + + if (pDrawStruct->fsAttribute == pDrawStruct->fsAttributeOld) + { + // + // Entire Item needs to be redrawn (either it has reappeared from + // behind another window or is being displayed for the first time + // + eAction = wxOwnerDrawn::wxODDrawAll; + + if (pDrawStruct->fsAttribute & MIA_HILITED) + { + // + // If it is currently selected we let the system handle it + // + eStatus |= wxOwnerDrawn::wxODSelected; + } + if (pDrawStruct->fsAttribute & MIA_CHECKED) + { + // + // If it is currently checked we draw our own + // + eStatus |= wxOwnerDrawn::wxODChecked; + pDrawStruct->fsAttributeOld = pDrawStruct->fsAttribute &= ~MIA_CHECKED; + } + if (pDrawStruct->fsAttribute & MIA_DISABLED) + { + // + // If it is currently disabled we let the system handle it + // + eStatus |= wxOwnerDrawn::wxODDisabled; + } + // + // Don't really care about framed (indicationg focus) or NoDismiss + // + } + else + { + if (pDrawStruct->fsAttribute & MIA_HILITED) + { + eAction = wxOwnerDrawn::wxODDrawAll; + eStatus |= wxOwnerDrawn::wxODSelected; + // + // Keep the system from trying to highlight with its bogus colors + // + pDrawStruct->fsAttributeOld = pDrawStruct->fsAttribute &= ~MIA_HILITED; + } + else if (!(pDrawStruct->fsAttribute & MIA_HILITED)) + { + eAction = wxOwnerDrawn::wxODDrawAll; + eStatus = 0; + // + // Keep the system from trying to highlight with its bogus colors + // + pDrawStruct->fsAttribute = pDrawStruct->fsAttributeOld &= ~MIA_HILITED; + } + else + { + // + // For now we don't care about anything else + // just ignore the entire message! + // + return true; + } + } + return pData->OnDrawItem( vDc + ,vRect + ,(wxOwnerDrawn::wxODAction)eAction + ,(wxOwnerDrawn::wxODStatus)eStatus + ); +} // end of wxListBox::OS2OnDraw + #endif // ndef for wxUSE_OWNER_DRAWN #endif // ndef for wxUSE_LISTBOX -