implement wxListBox::EnsureVisible() in wxGTK; add a test for it to the widgets sample

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51659 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-02-11 16:03:23 +00:00
parent 067fd8b47e
commit 0d29a4828e
3 changed files with 80 additions and 8 deletions

View File

@@ -73,6 +73,8 @@ public:
virtual int GetSelection() const; virtual int GetSelection() const;
virtual int GetSelections(wxArrayInt& aSelections) const; virtual int GetSelections(wxArrayInt& aSelections) const;
virtual void EnsureVisible(int n);
static wxVisualAttributes static wxVisualAttributes
GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
@@ -124,6 +126,9 @@ protected:
// set the specified item // set the specified item
void GtkSetItem(_GtkTreeIter& iter, const _GtkTreeEntry *entry); void GtkSetItem(_GtkTreeIter& iter, const _GtkTreeEntry *entry);
// common part of DoSetFirstItem() and EnsureVisible()
void DoScrollToCell(int n, float alignY, float alignX);
private: private:
void Init(); //common construction void Init(); //common construction

View File

@@ -68,6 +68,8 @@ enum
ListboxPage_DeleteText, ListboxPage_DeleteText,
ListboxPage_DeleteSel, ListboxPage_DeleteSel,
ListboxPage_Listbox, ListboxPage_Listbox,
ListboxPage_EnsureVisible,
ListboxPage_EnsureVisibleText,
ListboxPage_ContainerTests ListboxPage_ContainerTests
}; };
@@ -91,6 +93,7 @@ protected:
// event handlers // event handlers
void OnButtonReset(wxCommandEvent& event); void OnButtonReset(wxCommandEvent& event);
void OnButtonChange(wxCommandEvent& event); void OnButtonChange(wxCommandEvent& event);
void OnButtonEnsureVisible(wxCommandEvent& event);
void OnButtonDelete(wxCommandEvent& event); void OnButtonDelete(wxCommandEvent& event);
void OnButtonDeleteSel(wxCommandEvent& event); void OnButtonDeleteSel(wxCommandEvent& event);
void OnButtonClear(wxCommandEvent& event); void OnButtonClear(wxCommandEvent& event);
@@ -106,6 +109,7 @@ protected:
void OnUpdateUIAddSeveral(wxUpdateUIEvent& event); void OnUpdateUIAddSeveral(wxUpdateUIEvent& event);
void OnUpdateUIClearButton(wxUpdateUIEvent& event); void OnUpdateUIClearButton(wxUpdateUIEvent& event);
void OnUpdateUIEnsureVisibleButton(wxUpdateUIEvent& event);
void OnUpdateUIDeleteButton(wxUpdateUIEvent& event); void OnUpdateUIDeleteButton(wxUpdateUIEvent& event);
void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event); void OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event);
void OnUpdateUIResetButton(wxUpdateUIEvent& event); void OnUpdateUIResetButton(wxUpdateUIEvent& event);
@@ -116,6 +120,11 @@ protected:
// (re)create the listbox // (re)create the listbox
void CreateLbox(); void CreateLbox();
// read the value of a listbox item index from the given control, return
// false if it's invalid
bool GetValidIndexFromText(const wxTextCtrl *text, int *n = NULL) const;
// listbox parameters // listbox parameters
// ------------------ // ------------------
@@ -160,6 +169,7 @@ protected:
// the text entries for "Add/change string" and "Delete" buttons // the text entries for "Add/change string" and "Delete" buttons
wxTextCtrl *m_textAdd, wxTextCtrl *m_textAdd,
*m_textChange, *m_textChange,
*m_textEnsureVisible,
*m_textDelete; *m_textDelete;
private: private:
@@ -176,6 +186,7 @@ BEGIN_EVENT_TABLE(ListboxWidgetsPage, WidgetsPage)
EVT_BUTTON(ListboxPage_Change, ListboxWidgetsPage::OnButtonChange) EVT_BUTTON(ListboxPage_Change, ListboxWidgetsPage::OnButtonChange)
EVT_BUTTON(ListboxPage_Delete, ListboxWidgetsPage::OnButtonDelete) EVT_BUTTON(ListboxPage_Delete, ListboxWidgetsPage::OnButtonDelete)
EVT_BUTTON(ListboxPage_DeleteSel, ListboxWidgetsPage::OnButtonDeleteSel) EVT_BUTTON(ListboxPage_DeleteSel, ListboxWidgetsPage::OnButtonDeleteSel)
EVT_BUTTON(ListboxPage_EnsureVisible, ListboxWidgetsPage::OnButtonEnsureVisible)
EVT_BUTTON(ListboxPage_Clear, ListboxWidgetsPage::OnButtonClear) EVT_BUTTON(ListboxPage_Clear, ListboxWidgetsPage::OnButtonClear)
EVT_BUTTON(ListboxPage_Add, ListboxWidgetsPage::OnButtonAdd) EVT_BUTTON(ListboxPage_Add, ListboxWidgetsPage::OnButtonAdd)
EVT_BUTTON(ListboxPage_AddSeveral, ListboxWidgetsPage::OnButtonAddSeveral) EVT_BUTTON(ListboxPage_AddSeveral, ListboxWidgetsPage::OnButtonAddSeveral)
@@ -184,6 +195,7 @@ BEGIN_EVENT_TABLE(ListboxWidgetsPage, WidgetsPage)
EVT_TEXT_ENTER(ListboxPage_AddText, ListboxWidgetsPage::OnButtonAdd) EVT_TEXT_ENTER(ListboxPage_AddText, ListboxWidgetsPage::OnButtonAdd)
EVT_TEXT_ENTER(ListboxPage_DeleteText, ListboxWidgetsPage::OnButtonDelete) EVT_TEXT_ENTER(ListboxPage_DeleteText, ListboxWidgetsPage::OnButtonDelete)
EVT_TEXT_ENTER(ListboxPage_EnsureVisibleText, ListboxWidgetsPage::OnButtonEnsureVisible)
EVT_UPDATE_UI(ListboxPage_Reset, ListboxWidgetsPage::OnUpdateUIResetButton) EVT_UPDATE_UI(ListboxPage_Reset, ListboxWidgetsPage::OnUpdateUIResetButton)
EVT_UPDATE_UI(ListboxPage_AddSeveral, ListboxWidgetsPage::OnUpdateUIAddSeveral) EVT_UPDATE_UI(ListboxPage_AddSeveral, ListboxWidgetsPage::OnUpdateUIAddSeveral)
@@ -193,6 +205,7 @@ BEGIN_EVENT_TABLE(ListboxWidgetsPage, WidgetsPage)
EVT_UPDATE_UI(ListboxPage_Change, ListboxWidgetsPage::OnUpdateUIDeleteSelButton) EVT_UPDATE_UI(ListboxPage_Change, ListboxWidgetsPage::OnUpdateUIDeleteSelButton)
EVT_UPDATE_UI(ListboxPage_ChangeText, ListboxWidgetsPage::OnUpdateUIDeleteSelButton) EVT_UPDATE_UI(ListboxPage_ChangeText, ListboxWidgetsPage::OnUpdateUIDeleteSelButton)
EVT_UPDATE_UI(ListboxPage_DeleteSel, ListboxWidgetsPage::OnUpdateUIDeleteSelButton) EVT_UPDATE_UI(ListboxPage_DeleteSel, ListboxWidgetsPage::OnUpdateUIDeleteSelButton)
EVT_UPDATE_UI(ListboxPage_EnsureVisible, ListboxWidgetsPage::OnUpdateUIEnsureVisibleButton)
EVT_LISTBOX(ListboxPage_Listbox, ListboxWidgetsPage::OnListbox) EVT_LISTBOX(ListboxPage_Listbox, ListboxWidgetsPage::OnListbox)
EVT_LISTBOX_DCLICK(ListboxPage_Listbox, ListboxWidgetsPage::OnListboxDClick) EVT_LISTBOX_DCLICK(ListboxPage_Listbox, ListboxWidgetsPage::OnListboxDClick)
@@ -306,6 +319,13 @@ void ListboxWidgetsPage::CreateContent()
sizerRow->Add(m_textChange, 1, wxLEFT, 5); sizerRow->Add(m_textChange, 1, wxLEFT, 5);
sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5); sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
sizerRow = new wxBoxSizer(wxHORIZONTAL);
btn = new wxButton(this, ListboxPage_EnsureVisible, _T("Make item &visible"));
m_textEnsureVisible = new wxTextCtrl(this, ListboxPage_EnsureVisibleText, wxEmptyString);
sizerRow->Add(btn, 0, wxRIGHT, 5);
sizerRow->Add(m_textEnsureVisible, 1, wxLEFT, 5);
sizerMiddle->Add(sizerRow, 0, wxALL | wxGROW, 5);
sizerRow = new wxBoxSizer(wxHORIZONTAL); sizerRow = new wxBoxSizer(wxHORIZONTAL);
btn = new wxButton(this, ListboxPage_Delete, _T("&Delete this item")); btn = new wxButton(this, ListboxPage_Delete, _T("&Delete this item"));
m_textDelete = new wxTextCtrl(this, ListboxPage_DeleteText, wxEmptyString); m_textDelete = new wxTextCtrl(this, ListboxPage_DeleteText, wxEmptyString);
@@ -414,6 +434,30 @@ void ListboxWidgetsPage::CreateLbox()
m_sizerLbox->Layout(); m_sizerLbox->Layout();
} }
// ----------------------------------------------------------------------------
// miscellaneous helpers
// ----------------------------------------------------------------------------
bool
ListboxWidgetsPage::GetValidIndexFromText(const wxTextCtrl *text, int *n) const
{
unsigned long idx;
if ( !text->GetValue().ToULong(&idx) || (idx >= m_lbox->GetCount()) )
{
// don't give the warning if we're just testing but do give it if we
// want to retrieve the value as this is only done in answer to a user
// action
if ( n )
wxLogWarning("Invalid index \"%s\"", text->GetValue());
return false;
}
if ( n )
*n = idx;
return true;
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// event handlers // event handlers
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -436,11 +480,21 @@ void ListboxWidgetsPage::OnButtonChange(wxCommandEvent& WXUNUSED(event))
} }
} }
void ListboxWidgetsPage::OnButtonEnsureVisible(wxCommandEvent& WXUNUSED(event))
{
int n;
if ( !GetValidIndexFromText(m_textEnsureVisible, &n) )
{
return;
}
m_lbox->EnsureVisible(n);
}
void ListboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event)) void ListboxWidgetsPage::OnButtonDelete(wxCommandEvent& WXUNUSED(event))
{ {
unsigned long n; int n;
if ( !m_textDelete->GetValue().ToULong(&n) || if ( !GetValidIndexFromText(m_textDelete, &n) )
(n >= (unsigned)m_lbox->GetCount()) )
{ {
return; return;
} }
@@ -504,11 +558,14 @@ void ListboxWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event)
m_chkVScroll->GetValue() ); m_chkVScroll->GetValue() );
} }
void ListboxWidgetsPage::OnUpdateUIEnsureVisibleButton(wxUpdateUIEvent& event)
{
event.Enable(GetValidIndexFromText(m_textEnsureVisible));
}
void ListboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event) void ListboxWidgetsPage::OnUpdateUIDeleteButton(wxUpdateUIEvent& event)
{ {
unsigned long n; event.Enable(GetValidIndexFromText(m_textDelete));
event.Enable(m_textDelete->GetValue().ToULong(&n) &&
(n < (unsigned)m_lbox->GetCount()));
} }
void ListboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event) void ListboxWidgetsPage::OnUpdateUIDeleteSelButton(wxUpdateUIEvent& event)

View File

@@ -846,7 +846,7 @@ void wxListBox::GtkSetSelection(int n, const bool select, const bool blockEvent)
m_blockEvent = false; m_blockEvent = false;
} }
void wxListBox::DoSetFirstItem( int n ) void wxListBox::DoScrollToCell(int n, float alignY, float alignX)
{ {
wxCHECK_RET( m_treeview, wxT("invalid listbox") ); wxCHECK_RET( m_treeview, wxT("invalid listbox") );
wxCHECK_RET( IsValid(n), wxT("invalid index")); wxCHECK_RET( IsValid(n), wxT("invalid index"));
@@ -864,11 +864,21 @@ void wxListBox::DoSetFirstItem( int n )
// Scroll to the desired cell (0.0 == topleft alignment) // Scroll to the desired cell (0.0 == topleft alignment)
gtk_tree_view_scroll_to_cell(m_treeview, path, NULL, gtk_tree_view_scroll_to_cell(m_treeview, path, NULL,
TRUE, 0.0f, 0.0f); TRUE, alignY, alignX);
gtk_tree_path_free(path); gtk_tree_path_free(path);
} }
void wxListBox::DoSetFirstItem(int n)
{
DoScrollToCell(n, 0, 0);
}
void wxListBox::EnsureVisible(int n)
{
DoScrollToCell(n, 0.5, 0);
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// hittest // hittest
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------