a236aa2058
1. the main function for item insertion is now DoInsertItems() which allows for much more efficient addition of many new items at once 2. the items client data management is done entirely in wxItemContainer itself, the derived classes don't have to distinguish between void and object client data 3. many fixes for sorted controls, in particular implemented wxCB_SORT support in wxGTK combobox git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47730 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
305 lines
11 KiB
C++
305 lines
11 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: wx/univ/listbox.h
|
|
// Purpose: the universal listbox
|
|
// Author: Vadim Zeitlin
|
|
// Modified by:
|
|
// Created: 30.08.00
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
|
|
// Licence: wxWindows licence
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef _WX_UNIV_LISTBOX_H_
|
|
#define _WX_UNIV_LISTBOX_H_
|
|
|
|
#include "wx/scrolwin.h" // for wxScrollHelper
|
|
#include "wx/dynarray.h"
|
|
#include "wx/arrstr.h"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// the actions supported by this control
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// change the current item
|
|
#define wxACTION_LISTBOX_SETFOCUS _T("setfocus") // select the item
|
|
#define wxACTION_LISTBOX_MOVEDOWN _T("down") // select item below
|
|
#define wxACTION_LISTBOX_MOVEUP _T("up") // select item above
|
|
#define wxACTION_LISTBOX_PAGEDOWN _T("pagedown") // go page down
|
|
#define wxACTION_LISTBOX_PAGEUP _T("pageup") // go page up
|
|
#define wxACTION_LISTBOX_START _T("start") // go to first item
|
|
#define wxACTION_LISTBOX_END _T("end") // go to last item
|
|
#define wxACTION_LISTBOX_FIND _T("find") // find item by 1st letter
|
|
|
|
// do something with the current item
|
|
#define wxACTION_LISTBOX_ACTIVATE _T("activate") // activate (choose)
|
|
#define wxACTION_LISTBOX_TOGGLE _T("toggle") // togglee selected state
|
|
#define wxACTION_LISTBOX_SELECT _T("select") // sel this, unsel others
|
|
#define wxACTION_LISTBOX_SELECTADD _T("selectadd") // add to selection
|
|
#define wxACTION_LISTBOX_UNSELECT _T("unselect") // unselect
|
|
#define wxACTION_LISTBOX_ANCHOR _T("selanchor") // anchor selection
|
|
|
|
// do something with the selection globally (not for single selection ones)
|
|
#define wxACTION_LISTBOX_SELECTALL _T("selectall") // select all items
|
|
#define wxACTION_LISTBOX_UNSELECTALL _T("unselectall") // unselect all items
|
|
#define wxACTION_LISTBOX_SELTOGGLE _T("togglesel") // invert the selection
|
|
#define wxACTION_LISTBOX_EXTENDSEL _T("extend") // extend to item
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// wxListBox: a list of selectable items
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class WXDLLEXPORT wxListBox : public wxListBoxBase, public wxScrollHelper
|
|
{
|
|
public:
|
|
// ctors and such
|
|
wxListBox() : wxScrollHelper(this) { Init(); }
|
|
wxListBox(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
int n = 0, const wxString choices[] = (const wxString *) NULL,
|
|
long style = 0,
|
|
const wxValidator& validator = wxDefaultValidator,
|
|
const wxString& name = wxListBoxNameStr )
|
|
: wxScrollHelper(this)
|
|
{
|
|
Init();
|
|
|
|
Create(parent, id, pos, size, n, choices, style, validator, name);
|
|
}
|
|
wxListBox(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxPoint& pos,
|
|
const wxSize& size,
|
|
const wxArrayString& choices,
|
|
long style = 0,
|
|
const wxValidator& validator = wxDefaultValidator,
|
|
const wxString& name = wxListBoxNameStr );
|
|
|
|
virtual ~wxListBox();
|
|
|
|
bool Create(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
int n = 0, const wxString choices[] = (const wxString *) NULL,
|
|
long style = 0,
|
|
const wxValidator& validator = wxDefaultValidator,
|
|
const wxString& name = wxListBoxNameStr);
|
|
bool Create(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxPoint& pos,
|
|
const wxSize& size,
|
|
const wxArrayString& choices,
|
|
long style = 0,
|
|
const wxValidator& validator = wxDefaultValidator,
|
|
const wxString& name = wxListBoxNameStr);
|
|
|
|
// implement the listbox interface defined by wxListBoxBase
|
|
virtual void DoClear();
|
|
virtual void DoDeleteOneItem(unsigned int n);
|
|
|
|
virtual unsigned int GetCount() const
|
|
{ return (unsigned int)m_strings->GetCount(); }
|
|
virtual wxString GetString(unsigned int n) const
|
|
{ return m_strings->Item(n); }
|
|
virtual void SetString(unsigned int n, const wxString& s);
|
|
virtual int FindString(const wxString& s, bool bCase = false) const
|
|
{ return m_strings->Index(s, bCase); }
|
|
|
|
virtual bool IsSelected(int n) const
|
|
{ return m_selections.Index(n) != wxNOT_FOUND; }
|
|
virtual int GetSelection() const;
|
|
virtual int GetSelections(wxArrayInt& aSelections) const;
|
|
|
|
protected:
|
|
virtual void DoSetSelection(int n, bool select);
|
|
|
|
virtual int DoInsertItems(const wxArrayStringsAdapter& items,
|
|
unsigned int pos,
|
|
void **clientData,
|
|
wxClientDataType type);
|
|
|
|
// universal wxComboBox implementation internally uses wxListBox
|
|
friend class WXDLLEXPORT wxComboBox;
|
|
|
|
virtual void DoSetFirstItem(int n);
|
|
|
|
virtual void DoSetItemClientData(unsigned int n, void* clientData);
|
|
virtual void* DoGetItemClientData(unsigned int n) const;
|
|
|
|
public:
|
|
// override some more base class methods
|
|
virtual bool SetFont(const wxFont& font);
|
|
|
|
// the wxUniversal-specific methods
|
|
// --------------------------------
|
|
|
|
// the current item is the same as the selected one for wxLB_SINGLE
|
|
// listboxes but for the other ones it is just the focused item which may
|
|
// be selected or not
|
|
int GetCurrentItem() const { return m_current; }
|
|
void SetCurrentItem(int n);
|
|
|
|
// select the item which is diff items below the current one
|
|
void ChangeCurrent(int diff);
|
|
|
|
// activate (i.e. send a LISTBOX_DOUBLECLICKED message) the specified or
|
|
// current (if -1) item
|
|
void Activate(int item = -1);
|
|
|
|
// select or unselect the specified or current (if -1) item
|
|
void DoSelect(int item = -1, bool sel = true);
|
|
|
|
// more readable wrapper
|
|
void DoUnselect(int item) { DoSelect(item, false); }
|
|
|
|
// select an item and send a notification about it
|
|
void SelectAndNotify(int item);
|
|
|
|
// ensure that the given item is visible by scrolling it into view
|
|
virtual void EnsureVisible(int n);
|
|
|
|
// find the first item [strictly] after the current one which starts with
|
|
// the given string and make it the current one, return true if the current
|
|
// item changed
|
|
bool FindItem(const wxString& prefix, bool strictlyAfter = false);
|
|
bool FindNextItem(const wxString& prefix) { return FindItem(prefix, true); }
|
|
|
|
// extend the selection to span the range from the anchor (see below) to
|
|
// the specified or current item
|
|
void ExtendSelection(int itemTo = -1);
|
|
|
|
// make this item the new selection anchor: extending selection with
|
|
// ExtendSelection() will work with it
|
|
void AnchorSelection(int itemFrom) { m_selAnchor = itemFrom; }
|
|
|
|
// get, calculating it if necessary, the number of items per page, the
|
|
// height of each line and the max width of an item
|
|
int GetItemsPerPage() const;
|
|
wxCoord GetLineHeight() const;
|
|
wxCoord GetMaxWidth() const;
|
|
|
|
// override the wxControl virtual methods
|
|
virtual bool PerformAction(const wxControlAction& action,
|
|
long numArg = 0l,
|
|
const wxString& strArg = wxEmptyString);
|
|
|
|
static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef);
|
|
virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef)
|
|
{
|
|
return GetStdInputHandler(handlerDef);
|
|
}
|
|
|
|
// idle processing
|
|
virtual void OnInternalIdle();
|
|
|
|
protected:
|
|
// geometry
|
|
virtual wxSize DoGetBestClientSize() const;
|
|
virtual void DoSetSize(int x, int y,
|
|
int width, int height,
|
|
int sizeFlags = wxSIZE_AUTO);
|
|
|
|
virtual void DoDraw(wxControlRenderer *renderer);
|
|
virtual wxBorder GetDefaultBorder() const;
|
|
|
|
// special hook for wxCheckListBox which allows it to update its internal
|
|
// data when a new item is inserted into the listbox
|
|
virtual void OnItemInserted(unsigned int WXUNUSED(pos)) { }
|
|
|
|
|
|
// common part of all ctors
|
|
void Init();
|
|
|
|
// event handlers
|
|
void OnSize(wxSizeEvent& event);
|
|
|
|
// refresh the given item(s) or everything
|
|
void RefreshItems(int from, int count);
|
|
void RefreshItem(int n);
|
|
void RefreshFromItemToEnd(int n);
|
|
void RefreshAll();
|
|
|
|
// send an event of the given type (using m_current by default)
|
|
bool SendEvent(wxEventType type, int item = -1);
|
|
|
|
// calculate the number of items per page using our current size
|
|
void CalcItemsPerPage();
|
|
|
|
// can/should we have a horz scrollbar?
|
|
bool HasHorzScrollbar() const
|
|
{ return (m_windowStyle & wxLB_HSCROLL) != 0; }
|
|
|
|
// redraw the items in the given range only: called from DoDraw()
|
|
virtual void DoDrawRange(wxControlRenderer *renderer,
|
|
int itemFirst, int itemLast);
|
|
|
|
// update the scrollbars and then ensure that the item is visible
|
|
void DoEnsureVisible(int n);
|
|
|
|
// mark horz scrollbar for updating
|
|
void RefreshHorzScrollbar();
|
|
|
|
// update (show/hide/adjust) the scrollbars
|
|
void UpdateScrollbars();
|
|
|
|
// refresh the items specified by m_updateCount and m_updateFrom
|
|
void UpdateItems();
|
|
|
|
// the array containing all items (it is sorted if the listbox has
|
|
// wxLB_SORT style)
|
|
wxArrayString* m_strings;
|
|
|
|
// this array contains the indices of the selected items (for the single
|
|
// selection listboxes only the first element of it is used and contains
|
|
// the current selection)
|
|
wxArrayInt m_selections;
|
|
|
|
// and this one the client data (either void or wxClientData)
|
|
wxArrayPtrVoid m_itemsClientData;
|
|
|
|
// the current item
|
|
int m_current;
|
|
|
|
private:
|
|
// the range of elements which must be updated: if m_updateCount is 0 no
|
|
// update is needed, if it is -1 everything must be updated, otherwise
|
|
// m_updateCount items starting from m_updateFrom have to be redrawn
|
|
int m_updateFrom,
|
|
m_updateCount;
|
|
|
|
// the height of one line in the listbox (all lines have the same height)
|
|
wxCoord m_lineHeight;
|
|
|
|
// the maximal width of a listbox item and the item which has it
|
|
wxCoord m_maxWidth;
|
|
int m_maxWidthItem;
|
|
|
|
// the extents of horz and vert scrollbars
|
|
int m_scrollRangeX,
|
|
m_scrollRangeY;
|
|
|
|
// the number of items per page
|
|
size_t m_itemsPerPage;
|
|
|
|
// if the number of items has changed we may need to show/hide the
|
|
// scrollbar
|
|
bool m_updateScrollbarX, m_updateScrollbarY,
|
|
m_showScrollbarX, m_showScrollbarY;
|
|
|
|
// if the current item has changed, we might need to scroll if it went out
|
|
// of the window
|
|
bool m_currentChanged;
|
|
|
|
// the anchor from which the selection is extended for the listboxes with
|
|
// wxLB_EXTENDED style - this is set to the last item which was selected
|
|
// by not extending the selection but by choosing it directly
|
|
int m_selAnchor;
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
DECLARE_DYNAMIC_CLASS(wxListBox)
|
|
};
|
|
|
|
#endif // _WX_UNIV_LISTBOX_H_
|