git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10826 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
255 lines
7.0 KiB
C++
255 lines
7.0 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: univ/checklst.cpp
|
|
// Purpose: wxCheckListBox implementation
|
|
// Author: Vadim Zeitlin
|
|
// Modified by:
|
|
// Created: 12.09.00
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 2000 SciTech Software, Inc. (www.scitechsoft.com)
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ============================================================================
|
|
// declarations
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#ifdef __GNUG__
|
|
#pragma implementation "univchecklst.h"
|
|
#endif
|
|
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#if wxUSE_CHECKLISTBOX
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/log.h"
|
|
|
|
#include "wx/dcclient.h"
|
|
#include "wx/checklst.h"
|
|
#include "wx/validate.h"
|
|
#endif
|
|
|
|
#include "wx/univ/renderer.h"
|
|
#include "wx/univ/inphand.h"
|
|
#include "wx/univ/theme.h"
|
|
|
|
// ============================================================================
|
|
// implementation of wxCheckListBox
|
|
// ============================================================================
|
|
|
|
IMPLEMENT_DYNAMIC_CLASS(wxCheckListBox, wxListBox)
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// creation
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxCheckListBox::Init()
|
|
{
|
|
}
|
|
|
|
bool wxCheckListBox::Create(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxPoint &pos,
|
|
const wxSize &size,
|
|
int n,
|
|
const wxString choices[],
|
|
long style,
|
|
const wxValidator& validator,
|
|
const wxString &name)
|
|
{
|
|
if ( !wxListBox::Create(parent, id, pos, size,
|
|
n, choices, style, validator, name) )
|
|
return FALSE;
|
|
|
|
CreateInputHandler(wxINP_HANDLER_CHECKLISTBOX);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxCheckListBox functions
|
|
// ----------------------------------------------------------------------------
|
|
|
|
bool wxCheckListBox::IsChecked(size_t item) const
|
|
{
|
|
wxCHECK_MSG( item < m_checks.GetCount(), FALSE,
|
|
_T("invalid index in wxCheckListBox::IsChecked") );
|
|
|
|
return m_checks[item] != 0;
|
|
}
|
|
|
|
void wxCheckListBox::Check(size_t item, bool check)
|
|
{
|
|
wxCHECK_RET( item < m_checks.GetCount(),
|
|
_T("invalid index in wxCheckListBox::Check") );
|
|
|
|
// intermediate var is needed to avoid compiler warning with VC++
|
|
bool isChecked = m_checks[item] != 0;
|
|
if ( check != isChecked )
|
|
{
|
|
m_checks[item] = check;
|
|
|
|
RefreshItem(item);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// methods forwarded to wxListBox
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxCheckListBox::Delete(int n)
|
|
{
|
|
wxCHECK_RET( n < GetCount(), _T("invalid index in wxListBox::Delete") );
|
|
|
|
wxListBox::Delete(n);
|
|
|
|
m_checks.RemoveAt(n);
|
|
}
|
|
|
|
int wxCheckListBox::DoAppend(const wxString& item)
|
|
{
|
|
int pos = wxListBox::DoAppend(item);
|
|
|
|
// the item is initially unchecked
|
|
m_checks.Insert(FALSE, pos);
|
|
|
|
return pos;
|
|
}
|
|
|
|
void wxCheckListBox::DoInsertItems(const wxArrayString& items, int pos)
|
|
{
|
|
wxListBox::DoInsertItems(items, pos);
|
|
|
|
size_t count = items.GetCount();
|
|
for ( size_t n = 0; n < count; n++ )
|
|
{
|
|
m_checks.Insert(FALSE, pos + n);
|
|
}
|
|
}
|
|
|
|
void wxCheckListBox::DoSetItems(const wxArrayString& items, void **clientData)
|
|
{
|
|
// call it first as it does DoClear()
|
|
wxListBox::DoSetItems(items, clientData);
|
|
|
|
size_t count = items.GetCount();
|
|
for ( size_t n = 0; n < count; n++ )
|
|
{
|
|
m_checks.Add(FALSE);
|
|
}
|
|
}
|
|
|
|
void wxCheckListBox::DoClear()
|
|
{
|
|
m_checks.Empty();
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// drawing
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxSize wxCheckListBox::DoGetBestClientSize() const
|
|
{
|
|
wxSize size = wxListBox::DoGetBestClientSize();
|
|
size.x += GetRenderer()->GetCheckBitmapSize().x;
|
|
|
|
return size;
|
|
}
|
|
|
|
void wxCheckListBox::DoDrawRange(wxControlRenderer *renderer,
|
|
int itemFirst, int itemLast)
|
|
{
|
|
renderer->DrawCheckItems(this, itemFirst, itemLast);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// actions
|
|
// ----------------------------------------------------------------------------
|
|
|
|
bool wxCheckListBox::PerformAction(const wxControlAction& action,
|
|
long numArg,
|
|
const wxString& strArg)
|
|
{
|
|
if ( action == wxACTION_CHECKLISTBOX_TOGGLE )
|
|
{
|
|
int sel = (int)numArg;
|
|
if ( sel == -1 )
|
|
{
|
|
sel = GetSelection();
|
|
}
|
|
|
|
if ( sel != -1 )
|
|
{
|
|
Check(sel, !IsChecked(sel));
|
|
|
|
SendEvent(wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, sel);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return wxListBox::PerformAction(action, numArg, strArg);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxStdCheckListboxInputHandler
|
|
// ----------------------------------------------------------------------------
|
|
|
|
wxStdCheckListboxInputHandler::
|
|
wxStdCheckListboxInputHandler(wxInputHandler *inphand)
|
|
: wxStdListboxInputHandler(inphand)
|
|
{
|
|
}
|
|
|
|
bool wxStdCheckListboxInputHandler::HandleKey(wxControl *control,
|
|
const wxKeyEvent& event,
|
|
bool pressed)
|
|
{
|
|
if ( pressed && (event.GetKeyCode() == WXK_SPACE) )
|
|
control->PerformAction(wxACTION_CHECKLISTBOX_TOGGLE);
|
|
|
|
return wxStdListboxInputHandler::HandleKey(control, event, pressed);
|
|
}
|
|
|
|
bool wxStdCheckListboxInputHandler::HandleMouse(wxControl *control,
|
|
const wxMouseEvent& event)
|
|
{
|
|
if ( event.LeftDown() || event.LeftDClick() )
|
|
{
|
|
wxCheckListBox *lbox = wxStaticCast(control, wxCheckListBox);
|
|
int x, y;
|
|
|
|
wxPoint pt = event.GetPosition();
|
|
pt -= control->GetClientAreaOrigin();
|
|
lbox->CalcUnscrolledPosition(pt.x, pt.y, &x, &y);
|
|
|
|
wxRenderer *renderer = lbox->GetRenderer();
|
|
x -= renderer->GetCheckItemMargin();
|
|
|
|
int item = y / lbox->GetLineHeight();
|
|
if ( x >= 0 &&
|
|
x < renderer->GetCheckBitmapSize().x &&
|
|
item >= 0 &&
|
|
item < lbox->GetCount() )
|
|
{
|
|
lbox->PerformAction(wxACTION_CHECKLISTBOX_TOGGLE, item);
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return wxStdListboxInputHandler::HandleMouse(control, event);
|
|
}
|
|
|
|
#endif // wxUSE_CHECKLISTBOX
|