wxCheckListBox cleanup.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35761 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Włodzimierz Skiba 2005-09-29 10:00:16 +00:00
parent c2b77b4301
commit 84882850e5
2 changed files with 132 additions and 205 deletions

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////
// Name: checklst.h
// Name: wx/os2/checklst.h
// Purpose: wxCheckListBox class - a listbox with checkable items
// Note: this is an optional class.
// Author: David Webster
@ -15,13 +15,11 @@
#include <stddef.h>
#include "wx/setup.h"
#include "wx/defs.h"
class wxOwnerDrawn; // so the compiler knows, it is a class.
class wxCheckListBoxItem; // fwd decl, define in checklst.cpp
class WXDLLEXPORT wxCheckListBox : public wxListBox
class WXDLLEXPORT wxCheckListBox : public wxCheckListBoxBase
{
public:
//
@ -52,10 +50,6 @@ public:
// Override base class virtuals
//
virtual void Delete(int n);
virtual void InsertItems( int nItems
,const wxString asItems[]
,int nPos
);
virtual bool SetFont(const wxFont &rFont);
@ -64,7 +58,7 @@ public:
//
bool IsChecked(size_t uiIndex) const;
void Check( size_t uiIndex
,bool bCheck = TRUE
,bool bCheck = true
);
//
@ -80,6 +74,8 @@ protected:
virtual wxOwnerDrawn* CreateItem(size_t n);
virtual long OS2OnMeasure(WXMEASUREITEMSTRUCT* pItem);
virtual void DoInsertItems(const wxArrayString& items, int pos);
//
// Pressing space or clicking the check box toggles the item
//
@ -91,7 +87,7 @@ private:
DECLARE_DYNAMIC_CLASS(wxCheckListBox)
DECLARE_EVENT_TABLE()
}; // end of CLASS wxCheckListBoxItem
}; // end of CLASS wxCheckListBox
#endif
// _WX_CHECKLST_H_

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////
// Name: checklst.cpp
// Name: src/os2/checklst.cpp
// Purpose: implementation of wxCheckListBox class
// Author: David Webster
// Modified by:
@ -16,7 +16,7 @@
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#if wxUSE_OWNER_DRAWN
#if wxUSE_CHECKLISTBOX && wxUSE_OWNER_DRAWN
#include "wx/object.h"
#include "wx/colour.h"
@ -28,7 +28,7 @@
#include "wx/settings.h"
#include "wx/dcmemory.h"
#include "wx/dcscreen.h"
#include "wx/os2/checklst.h"
#include "wx/checklst.h"
#include "wx/log.h"
#define INCL_PM
@ -58,17 +58,17 @@ public:
//
// ctor
//
wxCheckListBoxItem( wxCheckListBox* pParent
,size_t nIndex
wxCheckListBoxItem( wxCheckListBox* pParent,
size_t nIndex
);
//
// Drawing functions
//
virtual bool OnDrawItem( wxDC& rDc
,const wxRect& rRect
,wxODAction eAct
,wxODStatus eStat
virtual bool OnDrawItem( wxDC& rDc,
const wxRect& rRect,
wxODAction eAct,
wxODStatus eStat
);
//
@ -79,20 +79,18 @@ public:
void Toggle(void) { Check(!IsChecked()); }
private:
bool m_bChecked;
wxCheckListBox* m_pParent;
size_t m_nIndex;
bool m_bChecked;
wxCheckListBox* m_pParent;
size_t m_nIndex;
}; // end of CLASS wxCheckListBoxItem
wxCheckListBoxItem::wxCheckListBoxItem (
wxCheckListBox* pParent
, size_t nIndex
)
: wxOwnerDrawn( wxEmptyString
,TRUE // checkable
)
wxCheckListBoxItem::wxCheckListBoxItem ( wxCheckListBox* pParent,
size_t nIndex)
:wxOwnerDrawn( wxEmptyString, true /* checkable */ )
{
m_bChecked = FALSE;
m_bChecked = false;
m_pParent = pParent;
m_nIndex = nIndex;
@ -104,18 +102,16 @@ wxCheckListBoxItem::wxCheckListBoxItem (
SetMarginWidth(GetDefaultMarginWidth());
} // end of wxCheckListBoxItem::wxCheckListBoxItem
bool wxCheckListBoxItem::OnDrawItem (
wxDC& rDc
, const wxRect& rRect
, wxODAction eAct
, wxODStatus eStat
)
{
wxRect vRect = rRect;
::WinQueryWindowRect( m_pParent->GetHWND()
,&rDc.m_vRclPaint
);
bool wxCheckListBoxItem::OnDrawItem ( wxDC& rDc,
const wxRect& rRect,
wxODAction eAct,
wxODStatus eStat )
{
wxRect vRect = rRect;
::WinQueryWindowRect( m_pParent->GetHWND(), &rDc.m_vRclPaint );
if (IsChecked())
eStat = (wxOwnerDrawn::wxODStatus)(eStat | wxOwnerDrawn::wxODChecked);
@ -126,39 +122,28 @@ bool wxCheckListBoxItem::OnDrawItem (
//
vRect.x += 5;
vRect.y -= 3;
if (wxOwnerDrawn::OnDrawItem( rDc
,vRect
,eAct
,eStat))
if (wxOwnerDrawn::OnDrawItem( rDc, vRect, eAct, eStat))
{
size_t nCheckWidth = GetDefaultMarginWidth();
size_t nCheckHeight = m_pParent->GetItemHeight();
int nParentHeight;
int nX = rRect.GetX();
int nY = rRect.GetY();
int nOldY = nY;
wxColour vColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
wxPen vPenBack;
wxPen vPenGray;
wxPen vPenPrev;
size_t nCheckWidth = GetDefaultMarginWidth();
size_t nCheckHeight = m_pParent->GetItemHeight();
int nParentHeight;
int nX = rRect.GetX();
int nY = rRect.GetY();
int nOldY = nY;
wxColour vColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
wxPen vPenBack;
wxPen vPenPrev;
m_pParent->GetSize( NULL
,&nParentHeight
);
m_pParent->GetSize( NULL, &nParentHeight);
nY = nParentHeight - nY - nCheckHeight;
vPenBack = wxPen(vColour, 1, wxSOLID);
vPenGray = wxPen(wxColour(127, 127, 127), 1, wxSOLID);
//
// Erase the 1-pixel border
//
rDc.SetPen(vPenBack);
rDc.DrawRectangle( nX
,nY
,nCheckWidth
,nCheckHeight
);
rDc.DrawRectangle( nX, nY, nCheckWidth, nCheckHeight );
//
// Now we draw the smaller rectangle
@ -170,12 +155,8 @@ bool wxCheckListBoxItem::OnDrawItem (
//
// Draw hollow gray rectangle
//
rDc.SetPen(vPenGray);
rDc.DrawRectangle( nX
,nY
,nCheckWidth
,nCheckHeight
);
rDc.SetPen(*wxGREY_PEN);
rDc.DrawRectangle( nX, nY, nCheckWidth, nCheckHeight );
nX++;
if (IsChecked())
@ -183,31 +164,27 @@ bool wxCheckListBoxItem::OnDrawItem (
//
// Draw the check by loading the sys standard bitmap and drawing it
//
HBITMAP hChkBmp = ::WinGetSysBitmap( HWND_DESKTOP
,SBMP_MENUCHECK
);
POINTL vPoint = {nX, nOldY + 3};
HBITMAP hChkBmp = ::WinGetSysBitmap( HWND_DESKTOP, SBMP_MENUCHECK );
POINTL vPoint = {nX, nOldY + 3};
::WinDrawBitmap( rDc.GetHPS()
,hChkBmp
,NULL
,&vPoint
,NULL
,NULL
,DBM_NORMAL
::WinDrawBitmap( rDc.GetHPS(),
hChkBmp,
NULL,
&vPoint,
NULL,
NULL,
DBM_NORMAL
);
}
return TRUE;
return true;
}
return FALSE;
return false;
} // end of wxCheckListBoxItem::OnDrawItem
//
// Change the state of the item and redraw it
//
void wxCheckListBoxItem::Check (
bool bCheck
)
void wxCheckListBoxItem::Check ( bool bCheck )
{
m_bChecked = bCheck;
@ -219,7 +196,7 @@ void wxCheckListBoxItem::Check (
//
// Update it
//
int nIndex = m_pParent->GetItemIndex(this);
int nIndex = m_pParent->GetItemIndex(this);
wxASSERT_MSG(nIndex != wxNOT_FOUND, wxT("what does this item do here?"));
@ -227,15 +204,14 @@ void wxCheckListBoxItem::Check (
}
wxCommandEvent vEvent( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED
,m_pParent->GetId()
);
wxCommandEvent vEvent( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED,m_pParent->GetId());
vEvent.SetInt(m_nIndex);
vEvent.SetEventObject(m_pParent);
m_pParent->ProcessCommand(vEvent);
} // end of wxCheckListBoxItem::Check
// ----------------------------------------------------------------------------
// implementation of wxCheckListBox class
// ----------------------------------------------------------------------------
@ -243,10 +219,12 @@ void wxCheckListBoxItem::Check (
// define event table
// ------------------
BEGIN_EVENT_TABLE(wxCheckListBox, wxListBox)
EVT_CHAR(wxCheckListBox::OnChar)
EVT_LEFT_DOWN(wxCheckListBox::OnLeftClick)
EVT_CHAR(wxCheckListBox::OnChar)
EVT_LEFT_DOWN(wxCheckListBox::OnLeftClick)
END_EVENT_TABLE()
//
// Control creation
// ----------------
@ -256,119 +234,84 @@ END_EVENT_TABLE()
// Default ctor: use Create() to really create the control
//
wxCheckListBox::wxCheckListBox()
: wxListBox()
:wxCheckListBoxBase()
{
} // end of wxCheckListBox::wxCheckListBox
//
// Ctor which creates the associated control
//
wxCheckListBox::wxCheckListBox (
wxWindow* pParent
, wxWindowID vId
, const wxPoint& rPos
, const wxSize& rSize
, int nStrings
, const wxString asChoices[]
, long lStyle
, const wxValidator& rVal
, const wxString& rsName
)
: wxListBox()
wxCheckListBox::wxCheckListBox ( wxWindow* pParent,
wxWindowID vId,
const wxPoint& rPos,
const wxSize& rSize,
int nStrings,
const wxString asChoices[],
long lStyle,
const wxValidator& rVal,
const wxString& rsName)
:wxCheckListBoxBase()
{
Create( pParent
,vId
,rPos
,rSize
,nStrings
,asChoices
,lStyle | wxLB_OWNERDRAW
,rVal
,rsName
);
Create( pParent, vId, rPos, rSize, nStrings, asChoices, lStyle | wxLB_OWNERDRAW, rVal, rsName );
} // end of wxCheckListBox::wxCheckListBox
wxCheckListBox::wxCheckListBox (
wxWindow* pParent
, wxWindowID vId
, const wxPoint& rPos
, const wxSize& rSize
, const wxArrayString& asChoices
, long lStyle
, const wxValidator& rVal
, const wxString& rsName
)
: wxListBox()
wxCheckListBox::wxCheckListBox ( wxWindow* pParent,
wxWindowID vId,
const wxPoint& rPos,
const wxSize& rSize,
const wxArrayString& asChoices,
long lStyle,
const wxValidator& rVal,
const wxString& rsName )
:wxCheckListBoxBase()
{
wxCArrayString chs(asChoices);
Create( pParent
,vId
,rPos
,rSize
,chs.GetCount()
,chs.GetStrings()
,lStyle | wxLB_OWNERDRAW
,rVal
,rsName
);
Create( pParent, vId, rPos, rSize, chs.GetCount(), chs.GetStrings(),
lStyle | wxLB_OWNERDRAW, rVal, rsName );
} // end of wxCheckListBox::wxCheckListBox
void wxCheckListBox::Delete(
int N
)
void wxCheckListBox::Delete( int n )
{
wxCHECK_RET( N >= 0 && N < m_nNumItems,
wxT("invalid index in wxListBox::Delete") );
wxListBox::Delete(N);
wxCHECK_RET( n >= 0 && n < m_nNumItems,
wxT("invalid index in wxCheckListBox::Delete") );
wxListBox::Delete(n);
//
// Free memory
//
delete m_aItems[N];
m_aItems.RemoveAt(N);
delete m_aItems[n];
m_aItems.RemoveAt(n);
} // end of wxCheckListBox::Delete
void wxCheckListBox::InsertItems (
int nItems
, const wxString asItems[]
, int nPos
)
void wxCheckListBox::DoInsertItems(const wxArrayString& items, int pos)
{
int i;
wxCHECK_RET( nPos >= 0 && nPos <= m_nNumItems,
wxT("invalid index in wxCheckListBox::InsertItems") );
wxListBox::InsertItems( nItems
,asItems
,nPos
);
for (i = 0; i < nItems; i++)
// pos is validated in wxListBox
wxListBox::DoInsertItems( items, pos );
int n = items.GetCount();
for (int i = 0; i < n; i++)
{
wxOwnerDrawn* pNewItem = CreateItem((size_t)(nPos + i));
wxOwnerDrawn* pNewItem = CreateItem((size_t)(pos + i));
pNewItem->SetName(asItems[i]);
m_aItems.Insert(pNewItem, (size_t)(nPos + i));
::WinSendMsg( (HWND)GetHWND()
,LM_SETITEMHANDLE
,(MPARAM)(i + nPos)
,MPFROMP(pNewItem)
pNewItem->SetName(items[i]);
m_aItems.Insert(pNewItem, (size_t)(pos + i));
::WinSendMsg( (HWND)GetHWND(),
LM_SETITEMHANDLE,
(MPARAM)(i + pos),
MPFROMP(pNewItem)
);
}
} // end of wxCheckListBox::InsertItems
bool wxCheckListBox::SetFont (
const wxFont& rFont
)
bool wxCheckListBox::SetFont ( const wxFont& rFont )
{
size_t i;
for (i = 0; i < m_aItems.GetCount(); i++)
for (size_t i = 0; i < m_aItems.GetCount(); i++)
m_aItems[i]->SetFont(rFont);
wxListBox::SetFont(rFont);
return TRUE;
return true;
} // end of wxCheckListBox::SetFont
//
// Create/retrieve item
// --------------------
@ -377,29 +320,25 @@ bool wxCheckListBox::SetFont (
//
// Create a check list box item
//
wxOwnerDrawn* wxCheckListBox::CreateItem (
size_t nIndex
)
wxOwnerDrawn* wxCheckListBox::CreateItem ( size_t nIndex )
{
wxCheckListBoxItem* pItem = new wxCheckListBoxItem( this
,nIndex
);
wxCheckListBoxItem* pItem = new wxCheckListBoxItem( this, nIndex );
return pItem;
} // end of wxCheckListBox::CreateItem
//
// Return item size
// ----------------
//
long wxCheckListBox::OS2OnMeasure (
WXMEASUREITEMSTRUCT* pItem
)
long wxCheckListBox::OS2OnMeasure ( WXMEASUREITEMSTRUCT* pItem )
{
if (!pItem)
pItem = (WXMEASUREITEMSTRUCT*)new OWNERITEM;
if (wxListBox::OS2OnMeasure(pItem) )
if (wxListBox::OS2OnMeasure(pItem))
{
POWNERITEM pStruct = (POWNERITEM)pItem;
POWNERITEM pStruct = (POWNERITEM)pItem;
//
// Save item height
@ -415,32 +354,29 @@ long wxCheckListBox::OS2OnMeasure (
return 0L;
} // end of wxCheckListBox::CreateItem
//
// Check items
// -----------
//
bool wxCheckListBox::IsChecked (
size_t uiIndex
) const
bool wxCheckListBox::IsChecked ( size_t uiIndex) const
{
return GetItem(uiIndex)->IsChecked();
} // end of wxCheckListBox::IsChecked
void wxCheckListBox::Check (
size_t uiIndex
, bool bCheck
)
void wxCheckListBox::Check ( size_t uiIndex, bool bCheck )
{
GetItem(uiIndex)->Check(bCheck);
} // end of wxCheckListBox::Check
//
// Process events
// --------------
//
void wxCheckListBox::OnChar (
wxKeyEvent& rEvent
)
void wxCheckListBox::OnChar ( wxKeyEvent& rEvent )
{
if (rEvent.GetKeyCode() == WXK_SPACE)
GetItem(GetSelection())->Toggle();
@ -448,9 +384,7 @@ void wxCheckListBox::OnChar (
rEvent.Skip();
} // end of wxCheckListBox::OnChar
void wxCheckListBox::OnLeftClick (
wxMouseEvent& rEvent
)
void wxCheckListBox::OnLeftClick ( wxMouseEvent& rEvent )
{
//
// Clicking on the item selects it, clicking on the checkmark toggles
@ -461,20 +395,18 @@ void wxCheckListBox::OnLeftClick (
wxScreenDC vDc;
wxCoord vHeight;
GetSize( NULL
,&nParentHeight
);
GetSize( NULL, &nParentHeight );
vDc.SetFont(GetFont());
vHeight = (wxCoord)(vDc.GetCharHeight() * 2.5);
//
// This, of course, will not work if the LB is scrolled
//
int nY = rEvent.GetY();
int nY = rEvent.GetY();
nY = nParentHeight - (nY + vHeight);
size_t nItem = (size_t)(nY / vHeight);
size_t nItem = (size_t)(nY / vHeight);
if (nItem < (size_t)m_nNumItems)
GetItem(nItem)->Toggle();
@ -491,5 +423,4 @@ void wxCheckListBox::OnLeftClick (
}
} // end of wxCheckListBox::OnLeftClick
#endif
#endif // wxUSE_CHECKLISTBOX && wxUSE_OWNER_DRAWN