///////////////////////////////////////////////////////////////////////////////
-// Name: listbox.cpp
+// Name: src/os2/listbox.cpp
// Purpose: wxListBox
// Author: David Webster
// Modified by:
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
-#include "wx/window.h"
-#include "wx/os2/private.h"
+#if wxUSE_LISTBOX
-#ifndef WX_PRECOMP
#include "wx/listbox.h"
-#include "wx/settings.h"
-#include "wx/brush.h"
-#include "wx/font.h"
-#include "wx/dc.h"
-#include "wx/utils.h"
-#include "wx/scrolwin.h"
+
+#ifndef WX_PRECOMP
+ #include "wx/dynarray.h"
+ #include "wx/settings.h"
+ #include "wx/brush.h"
+ #include "wx/font.h"
+ #include "wx/dc.h"
+ #include "wx/dcscreen.h"
+ #include "wx/utils.h"
+ #include "wx/scrolwin.h"
+ #include "wx/log.h"
+ #include "wx/window.h"
#endif
+#include "wx/os2/dcclient.h"
+#include "wx/os2/private.h"
+
#define INCL_M
#include <os2.h>
-#include "wx/dynarray.h"
-#include "wx/log.h"
-
-#if wxUSE_LISTBOX
-
#if wxUSE_OWNER_DRAWN
#include "wx/ownerdrw.h"
#endif
- IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControl)
+IMPLEMENT_DYNAMIC_CLASS(wxListBox, wxControlWithItems)
// ============================================================================
// list box item declaration and implementation
class wxListBoxItem : public wxOwnerDrawn
{
public:
- wxListBoxItem(const wxString& rsStr = "");
+ wxListBoxItem(const wxString& rsStr = wxEmptyString);
};
wxListBoxItem::wxListBoxItem(
const wxString& rsStr
)
: wxOwnerDrawn( rsStr
- ,FALSE
+ ,false
)
{
//
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
, wxWindowID vId
, const wxPoint& rPos
, const wxSize& rSize
-, int n
-, const wxString asChoices[]
+, const wxArrayString& asChoices
, long lStyle
-#if wxUSE_VALIDATORS
, const wxValidator& rValidator
-#endif
, 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,
+ const wxPoint& rPos,
+ const wxSize& rSize,
+ int n,
+ const wxString asChoices[],
+ long lStyle,
+ const wxValidator& rValidator,
+ const wxString& rsName )
{
m_nNumItems = 0;
m_hWnd = 0;
wxSystemSettings vSettings;
- SetBackgroundColour(vSettings.GetSystemColour(wxSYS_COLOUR_WINDOW));
+ SetBackgroundColour(vSettings.GetColour(wxSYS_COLOUR_WINDOW));
SetForegroundColour(pParent->GetForegroundColour());
m_windowId = (vId == -1) ? (int)NewControlId() : vId;
);
if (m_hWnd == 0)
{
- return FALSE;
+ return false;
}
//
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();
,sizeof(LONG)
,(PVOID)&lColor
);
- vColour.Set(wxString("NAVY"));
+ vColour = wxSystemSettingsNative::GetColour(wxSYS_COLOUR_HIGHLIGHT);
lColor = (LONG)vColour.GetPixel();
::WinSetPresParam( m_hWnd
,PP_HILITEBACKGROUNDCOLOR
,(PVOID)&lColor
);
+ SetXComp(0);
+ SetYComp(0);
SetSize( nX
,nY
,nWidth
,nHeight
);
delete pTextFont;
- return TRUE;
+ return true;
} // end of wxListBox::Create
wxListBox::~wxListBox()
{
#if wxUSE_OWNER_DRAWN
- size_t lUiCount = m_aItems.Count();
+ size_t lUiCount = m_aItems.Count();
while (lUiCount-- != 0)
{
// implementation of wxListBoxBase methods
// ----------------------------------------------------------------------------
-void wxListBox::DoSetFirstItem(
- int N
-)
+void wxListBox::DoSetFirstItem(int N)
{
- wxCHECK_RET( N >= 0 && N < m_nNumItems,
+ wxCHECK_RET( IsValid(N),
wxT("invalid index in wxListBox::SetFirstItem") );
::WinSendMsg(GetHwnd(), LM_SETTOPINDEX, MPFROMLONG(N), (MPARAM)0);
} // end of wxListBox::DoSetFirstItem
-void wxListBox::Delete(
- int N
-)
+void wxListBox::DoDeleteOneItem(unsigned int n)
{
- wxCHECK_RET( N >= 0 && N < m_nNumItems,
+ wxCHECK_RET( IsValid(n),
wxT("invalid index in wxListBox::Delete") );
#if wxUSE_OWNER_DRAWN
- delete m_aItems[N];
- m_aItems.RemoveAt(N);
-#else // !wxUSE_OWNER_DRAWN
- if (HasClientObjectData())
- {
- delete GetClientObject(N);
- }
+ delete m_aItems[n];
+ m_aItems.RemoveAt(n);
#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
- ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)N, (MPARAM)0);
+ ::WinSendMsg(GetHwnd(), LM_DELETEITEM, (MPARAM)n, (MPARAM)0);
m_nNumItems--;
} // end of wxListBox::DoSetFirstItem
-int wxListBox::DoAppend(
- const wxString& rsItem
-)
+int wxListBox::DoInsertItems(const wxArrayStringsAdapter & items,
+ unsigned int pos,
+ void **clientData,
+ wxClientDataType type)
{
- int nIndex = 0;
- SHORT nIndexType = 0;
-
- if (m_windowStyle & wxLB_SORT)
- nIndexType = LIT_SORTASCENDING;
+ long lIndex = 0;
+ LONG lIndexType = 0;
+ bool incrementPos = false;
+
+ if (IsSorted())
+ lIndexType = LIT_SORTASCENDING;
+ else if (pos == GetCount())
+ lIndexType = LIT_END;
else
- nIndexType = LIT_END;
- nIndex = (int)::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)nIndexType, (MPARAM)rsItem.c_str());
- m_nNumItems++;
-
-#if wxUSE_OWNER_DRAWN
- if (m_windowStyle & wxLB_OWNERDRAW)
{
- wxOwnerDrawn* pNewItem = CreateItem(nIndex); // dummy argument
-
- pNewItem->SetName(rsItem);
- m_aItems.Insert(pNewItem, nIndex);
- ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, (MPARAM)((SHORT)nIndex), MPFROMP(pNewItem));
- pNewItem->SetFont(GetFont());
+ lIndexType = (LONG)pos;
+ incrementPos = true;
}
-#endif
- return nIndex;
-} // end of wxListBox::DoAppend
-void wxListBox::DoSetItems(
- const wxArrayString& raChoices
-, void** ppClientData
-)
-{
- BOOL bHideAndShow = IsShown();
- int nCount = 0;
- int i;
- SHORT nIndexType = 0;
+ int n = wxNOT_FOUND;
- if (bHideAndShow)
- {
- ::WinShowWindow(GetHwnd(), FALSE);
- }
- ::WinSendMsg(GetHwnd(), LM_DELETEALL, (MPARAM)0, (MPARAM)0);
- m_nNumItems = raChoices.GetCount();
- for (i = 0; i < m_nNumItems; i++)
+ unsigned int count = items.GetCount();
+ for (unsigned int i = 0; i < count; i++)
{
-
- if (m_windowStyle & wxLB_SORT)
- nIndexType = LIT_SORTASCENDING;
- else
- nIndexType = LIT_END;
- ::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)nIndexType, (MPARAM)raChoices[i].c_str());
-
- if (ppClientData)
+ n = (int)::WinSendMsg(GetHwnd(), LM_INSERTITEM, (MPARAM)lIndexType, (MPARAM)items[i].wx_str());
+ if (n < 0)
{
-#if wxUSE_OWNER_DRAWN
- wxASSERT_MSG(ppClientData[i] == NULL,
- wxT("Can't use client data with owner-drawn listboxes"));
-#else // !wxUSE_OWNER_DRAWN
- ::WinSendMsg(WinUtil_GetHwnd(), LM_SETITEMHANDLE, MPFROMLONG(lCount), MPFROMP(ppClientData[i]));
-#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
+ wxLogLastError(wxT("WinSendMsg(LM_INSERTITEM)"));
+ n = wxNOT_FOUND;
+ break;
}
- }
+ ++m_nNumItems;
#if wxUSE_OWNER_DRAWN
- if ( m_windowStyle & wxLB_OWNERDRAW )
- {
- //
- // First delete old items
- //
- WX_CLEAR_ARRAY(m_aItems);
-
- //
- // Then create new ones
- //
- for (size_t ui = 0; ui < (size_t)m_nNumItems; ui++)
+ if (HasFlag(wxLB_OWNERDRAW))
{
- wxOwnerDrawn* pNewItem = CreateItem(ui);
+ wxOwnerDrawn* pNewItem = CreateItem(n); // dummy argument
+ wxScreenDC vDc; // FIXME: is it really needed here?
- pNewItem->SetName(raChoices[ui]);
- m_aItems.Add(pNewItem);
- ::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, MPFROMLONG(ui), MPFROMP(pNewItem));
+ pNewItem->SetName(items[i]);
+ m_aItems.Insert(pNewItem, n);
+ pNewItem->SetFont(GetFont());
}
- }
-#endif // wxUSE_OWNER_DRAWN
- ::WinShowWindow(GetHwnd(), TRUE);
-} // end of wxListBox::DoSetItems
-
-int wxListBox::FindString(
- const wxString& rsString
-) const
-{
- int nPos;
- LONG lTextLength;
- PSZ zStr;
-
+#endif
+ AssignNewItemClientData(n, clientData, i, type);
- 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;
+ if (incrementPos)
+ ++lIndexType;
}
- return nPos;
-} // end of wxListBox::FindString
-void wxListBox::Clear()
+ return n;
+} // end of wxListBox::DoInsertAppendItemsWithData
+
+void wxListBox::DoClear()
{
#if wxUSE_OWNER_DRAWN
- size_t lUiCount = m_aItems.Count();
+ unsigned int lUiCount = m_aItems.Count();
while (lUiCount-- != 0)
{
}
m_aItems.Clear();
-#else // !wxUSE_OWNER_DRAWN
- if (HasClientObjectData())
- {
- for (size_t n = 0; n < (size_t)m_lNumItems; n++)
- {
- delete GetClientObject(n);
- }
- }
-#endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
+#endif // wxUSE_OWNER_DRAWN
::WinSendMsg(GetHwnd(), LM_DELETEALL, (MPARAM)0, (MPARAM)0);
m_nNumItems = 0;
} // end of wxListBox::Clear
-void wxListBox::SetSelection(
- int N
-, bool bSelect
-)
+void wxListBox::DoSetSelection( int N, bool bSelect)
{
- wxCHECK_RET( N >= 0 && N < m_nNumItems,
+ wxCHECK_RET( IsValid(N),
wxT("invalid index in wxListBox::SetSelection") );
::WinSendMsg( GetHwnd()
,LM_SELECTITEM
,MPFROMLONG(N)
,(MPARAM)bSelect
);
+ if(m_windowStyle & wxLB_OWNERDRAW)
+ Refresh();
} // end of wxListBox::SetSelection
-bool wxListBox::IsSelected(
- int N
-) const
+bool wxListBox::IsSelected( int N ) const
{
- wxCHECK_MSG( N >= 0 && N < m_nNumItems, FALSE,
+ wxCHECK_MSG( IsValid(N), 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(
- int n
-) const
+void* wxListBox::DoGetItemClientData(unsigned int n) const
{
- return (wxClientData *)DoGetItemClientData(n);
-}
-
-void* wxListBox::DoGetItemClientData(
- int n
-) const
-{
- wxCHECK_MSG( n >= 0 && n < m_nNumItems, NULL,
+ wxCHECK_MSG( IsValid(n), NULL,
wxT("invalid index in wxListBox::GetClientData") );
return((void *)::WinSendMsg(GetHwnd(), LM_QUERYITEMHANDLE, MPFROMLONG(n), (MPARAM)0));
} // end of wxListBox::DoGetItemClientData
-void wxListBox::DoSetItemClientObject(
- int n
-, wxClientData* pClientData
-)
+void wxListBox::DoSetItemClientData(unsigned int n, void* pClientData)
{
- DoSetItemClientData( n
- ,pClientData
- );
-} // end of wxListBox::DoSetItemClientObject
-
-void wxListBox::DoSetItemClientData(
- int n
-, void* pClientData
-)
-{
- wxCHECK_RET( n >= 0 && n < m_nNumItems,
+ wxCHECK_RET( IsValid(n),
wxT("invalid index in wxListBox::SetClientData") );
-#if wxUSE_OWNER_DRAWN
- if ( m_windowStyle & wxLB_OWNERDRAW )
- {
- //
- // Client data must be pointer to wxOwnerDrawn, otherwise we would crash
- // in OnMeasure/OnDraw.
- //
- wxFAIL_MSG(wxT("Can't use client data with owner-drawn listboxes"));
- }
-#endif // wxUSE_OWNER_DRAWN
-
::WinSendMsg(GetHwnd(), LM_SETITEMHANDLE, MPFROMLONG(n), MPFROMP(pClientData));
} // end of wxListBox::DoSetItemClientData
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;
+ int nCount = 0;
+ LONG lItem;
raSelections.Empty();
}
return nCount;
}
- return 0;
}
else // single-selection listbox
{
));
} // end of wxListBox::GetSelection
-wxString wxListBox::GetString(
- int N
-) const
+wxString wxListBox::GetString(unsigned int n) const
{
- LONG lLen = 0;
- char* zBuf;
- wxString sResult;
+ LONG lLen = 0;
+ wxChar* zBuf;
+ wxString sResult;
- wxCHECK_MSG( N >= 0 && N < m_nNumItems, "",
+ wxCHECK_MSG( IsValid(n), wxEmptyString,
wxT("invalid index in wxListBox::GetClientData") );
- lLen = LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXTLENGTH, (MPARAM)N, (MPARAM)0));
- zBuf = new char[lLen + 1];
- ::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXT, MPFROM2SHORT((SHORT)N, (SHORT)lLen), (MPARAM)zBuf);
+ lLen = LONGFROMMR(::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXTLENGTH, (MPARAM)n, (MPARAM)0));
+ zBuf = new wxChar[lLen + 1];
+ ::WinSendMsg(GetHwnd(), LM_QUERYITEMTEXT, MPFROM2SHORT((SHORT)n, (SHORT)lLen), (MPARAM)zBuf);
zBuf[lLen] = '\0';
sResult = zBuf;
delete [] zBuf;
return sResult;
} // end of wxListBox::GetString
-void wxListBox::DoInsertItems(
- const wxArrayString& asItems
-, int nPos
-)
+void wxListBox::SetString(unsigned int n, const wxString& rsString)
{
- wxCHECK_RET( nPos >= 0 && nPos <= m_nNumItems,
- wxT("invalid index in wxListBox::InsertItems") );
-
- int nItems = asItems.GetCount();
-
- for (int i = 0; i < nItems; i++)
- {
- 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)((SHORT)nIndex)
- ,MPFROMP(pNewItem)
- );
- m_nNumItems += nItems;
- }
-} // end of wxListBox::DoInsertItems
-
-void wxListBox::SetString(
- int N
-, const wxString& rsString
-)
-{
- wxCHECK_RET( N >= 0 && N < m_nNumItems,
+ wxCHECK_RET( IsValid(n),
wxT("invalid index in wxListBox::SetString") );
//
// Remember the state of the item
//
- bool bWasSelected = IsSelected(N);
- void* pOldData = NULL;
- wxClientData* pOldObjData = NULL;
+ bool bWasSelected = IsSelected(n);
+ void* pOldData = NULL;
+ wxClientData* pOldObjData = NULL;
- if (m_clientDataItemsType == wxClientData_Void)
- pOldData = GetClientData(N);
- else if (m_clientDataItemsType == wxClientData_Object)
- pOldObjData = GetClientObject(N);
+ if ( HasClientUntypedData() )
+ pOldData = GetClientData(n);
+ else if ( HasClientObjectData() )
+ pOldObjData = GetClientObject(n);
//
// Delete and recreate it
//
::WinSendMsg( GetHwnd()
,LM_DELETEITEM
- ,(MPARAM)N
+ ,(MPARAM)n
,(MPARAM)0
);
- int nNewN = N;
+ int nNewN = n;
- if (N == m_nNumItems - 1)
+ if (n == (m_nNumItems - 1))
nNewN = -1;
::WinSendMsg( GetHwnd()
,LM_INSERTITEM
,(MPARAM)nNewN
- ,(MPARAM)rsString.c_str()
+ ,(MPARAM)rsString.wx_str()
);
//
// Restore the client data
//
if (pOldData)
- SetClientData( N
- ,pOldData
- );
+ SetClientData(n, pOldData);
else if (pOldObjData)
- SetClientObject( N
- ,pOldObjData
- );
+ SetClientObject(n, pOldObjData);
//
// We may have lost the selection
//
if (bWasSelected)
- Select(N);
+ Select(n);
#if wxUSE_OWNER_DRAWN
if (m_windowStyle & wxLB_OWNERDRAW)
//
// Update item's text
//
- m_aItems[N]->SetName(rsString);
+ m_aItems[n]->SetName(rsString);
#endif //USE_OWNER_DRAWN
} // end of wxListBox::SetString
-int wxListBox::GetCount() const
+unsigned int wxListBox::GetCount() const
{
return m_nNumItems;
}
//
// Find the widest string
//
- int nLine;
- int nListbox = 0;
- int nCx;
- int nCy;
+ int nLine;
+ int nListbox = 0;
+ int nCx;
+ int nCy;
+ wxFont vFont = (wxFont)GetFont();
- for (int i = 0; i < m_nNumItems; i++)
+ for (unsigned int i = 0; i < m_nNumItems; i++)
{
- wxString vStr(GetString(i));
+ wxString vStr(GetString(i));
- GetTextExtent( vStr
- ,&nLine
- ,NULL
- );
+ GetTextExtent( vStr, &nLine, NULL );
if (nLine > nListbox)
nListbox = nLine;
}
wxGetCharSize( GetHWND()
,&nCx
,&nCy
- ,(wxFont*)&GetFont()
+ ,&vFont
);
nListbox += 3 * nCx;
- int hListbox = EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * (wxMax(m_nNumItems, 7));
+ int hListbox = EDIT_HEIGHT_FROM_CHAR_HEIGHT(nCy) * (wxMax(m_nNumItems, 7));
return wxSize( nListbox
,hListbox
{
eEvtType = wxEVT_COMMAND_LISTBOX_SELECTED;
}
- if (uParam == LN_ENTER)
+ else if (uParam == LN_ENTER)
{
eEvtType = wxEVT_COMMAND_LISTBOX_DOUBLECLICKED;
}
//
// Some event we're not interested in
//
- return FALSE;
+ return false;
}
wxCommandEvent vEvent( eEvtType
,m_windowId
vEvent.SetEventObject(this);
- wxArrayInt aSelections;
- int n;
- int nCount = GetSelections(aSelections);
+ wxArrayInt aSelections;
+ int n;
+ int nCount = GetSelections(aSelections);
if (nCount > 0)
{
{
n = -1;
}
- vEvent.m_commandInt = n;
- return GetEventHandler()->ProcessEvent(vEvent);
+ vEvent.SetInt(n);
+ return HandleWindowEvent(vEvent);
} // end of 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 );
-bool wxListBox::OS2OnDraw(WXDRAWITEMSTRUCT *item)
+ 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;
+
+ 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;
+ int eAction = 0;
+ int eStatus = 0;
+
//
- // TODO: Get to this eventually
+ // Only owner-drawn control should receive this message
//
- return FALSE;
-}
-#endif // ndef for wxUSE_OWNER_DRAWN
+ wxCHECK(((m_windowStyle & wxLB_OWNERDRAW) == wxLB_OWNERDRAW), false);
+
+
+ //
+ // The item may be -1 for an empty listbox
+ //
+ if (pDrawStruct->idItem == -1L)
+ return false;
+
+ wxListBoxItem* pData = (wxListBoxItem*)m_aItems[pDrawStruct->idItem];
+
+ wxClientDC vDc(this);
+ wxPMDCImpl *impl = (wxPMDCImpl*) vDc.GetImpl();
+ wxPoint pt1( pDrawStruct->rclItem.xLeft, pDrawStruct->rclItem.yTop );
+ wxPoint pt2( pDrawStruct->rclItem.xRight, pDrawStruct->rclItem.yBottom );
+ wxRect vRect( pt1, pt2 );
-#endif // ndef for wxUSE_LISTBOX
+ impl->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 // wxUSE_LISTBOX