Keyboard navigatino in tree ctrl

EnsureVisible()


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1122 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
1998-12-07 10:38:39 +00:00
parent 907789a0f7
commit 6daa06370b
7 changed files with 151 additions and 30 deletions

View File

@@ -44,9 +44,11 @@ this has no effect, but I tried...
wxWindows/GTK requires the GTK+ library to be installed on your system. wxWindows/GTK requires the GTK+ library to be installed on your system.
It has to be a stable version, preferebly version 1.0.6. When using It has to be a stable version, preferebly version 1.0.6. When using
a version previous to 1.0.6 you'll get crashes here and there. Although a version previous to 1.0.6 you'll get crashes here and there.
wxWindows/GTK now compiles with GTK+ 1.1.3, it does not set work
properly. Wait for a stable version GTK 1.2. wxWindows/GTK does NOT work with the 1.1.X versions of the GTK+ library
and we will wait until the 1.2 version comes out and has stabilized
until we'll work with that library.
You can get the newest version of the GTK+ from the GTK homepage You can get the newest version of the GTK+ from the GTK homepage
at at

View File

@@ -1,7 +1,7 @@
Welcome to wxWindows/Gtk, Welcome to wxWindows/Gtk,
you have downloaded version 1.97 of the GTK+ port of C++ library you have downloaded version 1.99 of the GTK+ port of C++ library
wxWindows. Information on how to install can be found in the wxWindows. Information on how to install can be found in the
file INSTALL.txt, but if you cannot wait, this should work on file INSTALL.txt, but if you cannot wait, this should work on
all systems all systems
@@ -19,9 +19,15 @@ YOUR PROBLEM, SUCH AS YOUR VERSION OF GTK, WXGTK, WHAT
DISTRIBUTION YOU USE AND WHAT ERROR WAS REPORTED. I know DISTRIBUTION YOU USE AND WHAT ERROR WAS REPORTED. I know
this has no effect, but I tried... this has no effect, but I tried...
wxWindows/Gtk is still in development and you can have a look This is the beta release which means that we have a feature
at the TODO.txt to see what's missing before an official beta freeze. We'll move up to versin 2.0 rather soon and from then
and - more important - before we can aim at binary compatibility. on there will be no more binary incompatible changes. We might
add more classes, but none that would alter the behaviour of
the existing ones. The library produced by the install process
of the final version will be called libwx_gtk_1_0.a (static)
and libwx_gtk_1_0.so.2.0.0 (shared) so that once a version
of wxWindows/Gtk for GTK 1.2 comes out we'll change the name
of the library to avoid linking problems.
More information is available from my homepage at More information is available from my homepage at
@@ -32,8 +38,8 @@ bug reports or comments to either the wxGTK mailing list or to
the wxWindows developers list. Information on how to subscribe the wxWindows developers list. Information on how to subscribe
is available from my homepage. is available from my homepage.
wxWindows/Gtk comes with no guarantee whatsoever. It might crash wxWindows/Gtk doesn't come with any guarantee whatsoever. It might
your harddisk or destroy your monitor. It doesn't claim to be crash your harddisk or destroy your monitor. It doesn't claim to be
suitable for any special purpose. suitable for any special purpose.
Regards, Regards,

View File

@@ -1,15 +1,9 @@
-------------------- High priority --------------------- -------------------- High priority ---------------------
wxTreeCtrl
-> Keyboard handling.
wxClipboard wxClipboard
-> On the way, but not functional yet. -> On the way, but not functional yet.
Fix printing of bitmaps
-> No idea.
-------------------- Low priority --------------------- -------------------- Low priority ---------------------
OwnerDraw for wxListCtrl and others OwnerDraw for wxListCtrl and others

View File

@@ -56,7 +56,7 @@ public:
wxTreeItemId(long itemId) { m_pItem = (wxGenericTreeItem *)itemId; } wxTreeItemId(long itemId) { m_pItem = (wxGenericTreeItem *)itemId; }
operator long() const { return (long)m_pItem; } operator long() const { return (long)m_pItem; }
//protected: //protected: // not for gcc
// for wxTreeCtrl usage only // for wxTreeCtrl usage only
wxTreeItemId(wxGenericTreeItem *pItem) { m_pItem = pItem; } wxTreeItemId(wxGenericTreeItem *pItem) { m_pItem = pItem; }
@@ -262,6 +262,8 @@ public:
// is the item visible (it might be outside the view or not expanded)? // is the item visible (it might be outside the view or not expanded)?
bool IsVisible(const wxTreeItemId& item) const; bool IsVisible(const wxTreeItemId& item) const;
// does the item has any children? // does the item has any children?
bool HasChildren(const wxTreeItemId& item) const
{ return ItemHasChildren(item); }
bool ItemHasChildren(const wxTreeItemId& item) const; bool ItemHasChildren(const wxTreeItemId& item) const;
// is the item expanded (only makes sense if HasChildren())? // is the item expanded (only makes sense if HasChildren())?
bool IsExpanded(const wxTreeItemId& item) const; bool IsExpanded(const wxTreeItemId& item) const;

View File

@@ -64,7 +64,7 @@ BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl)
EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsing) EVT_TREE_ITEM_COLLAPSING(TreeTest_Ctrl, MyTreeCtrl::OnItemCollapsing)
EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, MyTreeCtrl::OnSelChanged) EVT_TREE_SEL_CHANGED(TreeTest_Ctrl, MyTreeCtrl::OnSelChanged)
EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, MyTreeCtrl::OnSelChanging) EVT_TREE_SEL_CHANGING(TreeTest_Ctrl, MyTreeCtrl::OnSelChanging)
EVT_CHAR(MyTreeCtrl::OnKeyDown) EVT_TREE_KEY_DOWN(TreeTest_Ctrl, MyTreeCtrl::OnTreeKeyDown)
END_EVENT_TABLE() END_EVENT_TABLE()
IMPLEMENT_APP(MyApp) IMPLEMENT_APP(MyApp)
@@ -317,7 +317,7 @@ void MyTreeCtrl::OnItemCollapsing(wxTreeEvent& event)
} }
} }
void MyTreeCtrl::OnKeyDown(wxTreeEvent& WXUNUSED(event)) void MyTreeCtrl::OnTreeKeyDown(wxTreeEvent&WXUNUSED(event))
{ {
// show some info about this item // show some info about this item
wxTreeItemId itemId = GetSelection(); wxTreeItemId itemId = GetSelection();
@@ -328,7 +328,7 @@ void MyTreeCtrl::OnKeyDown(wxTreeEvent& WXUNUSED(event))
item->ShowInfo(this); item->ShowInfo(this);
} }
wxLogMessage("OnKeyDown"); wxLogMessage("OnTreeKeyDown");
} }
static inline const char *Bool2String(bool b) static inline const char *Bool2String(bool b)
@@ -336,7 +336,7 @@ static inline const char *Bool2String(bool b)
return b ? "" : "not "; return b ? "" : "not ";
} }
void MyTreeItemData::ShowInfo(wxTreeCtrl *tree) void MyTreeItemData::ShowInfo(wxTreeCtrl */*tree*/)
{ {
/* /*
wxLogMessage("Item '%s': %sselected, %sexpanded, %sbold,\n" wxLogMessage("Item '%s': %sselected, %sexpanded, %sbold,\n"

View File

@@ -54,7 +54,7 @@ public:
void OnItemCollapsing(wxTreeEvent& event); void OnItemCollapsing(wxTreeEvent& event);
void OnSelChanged(wxTreeEvent& event); void OnSelChanged(wxTreeEvent& event);
void OnSelChanging(wxTreeEvent& event); void OnSelChanging(wxTreeEvent& event);
void OnKeyDown(wxTreeEvent& event); void OnTreeKeyDown(wxTreeEvent& event);
void GetItemsRecursively(const wxTreeItemId& idParent, long cookie); void GetItemsRecursively(const wxTreeItemId& idParent, long cookie);
@@ -88,8 +88,8 @@ public:
void OnDeleteAll(wxCommandEvent& event); void OnDeleteAll(wxCommandEvent& event);
void OnRecreate(wxCommandEvent& event); void OnRecreate(wxCommandEvent& event);
void OnSetBold(wxCommandEvent& event) { DoSetBold(TRUE); } void OnSetBold(wxCommandEvent& WXUNUSED(event)) { DoSetBold(TRUE); }
void OnClearBold(wxCommandEvent& event) { DoSetBold(FALSE); } void OnClearBold(wxCommandEvent& WXUNUSED(event)) { DoSetBold(FALSE); }
private: private:
MyTreeCtrl *m_treeCtrl; MyTreeCtrl *m_treeCtrl;

View File

@@ -779,7 +779,7 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& itemId)
event.m_item = item; event.m_item = item;
event.m_itemOld = m_current; event.m_itemOld = m_current;
event.SetEventObject( this ); event.SetEventObject( this );
if ( ProcessEvent( event ) && event.WasVetoed() ) if ( GetEventHandler()->ProcessEvent( event ) && event.WasVetoed() )
return; return;
if ( m_current ) if ( m_current )
@@ -793,13 +793,46 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& itemId)
RefreshLine( m_current ); RefreshLine( m_current );
event.SetEventType(wxEVT_COMMAND_TREE_SEL_CHANGED); event.SetEventType(wxEVT_COMMAND_TREE_SEL_CHANGED);
ProcessEvent( event ); GetEventHandler()->ProcessEvent( event );
} }
} }
void wxTreeCtrl::EnsureVisible(const wxTreeItemId& WXUNUSED(item)) void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
{ {
wxFAIL_MSG("not implemented"); wxGenericTreeItem *gitem = item.m_pItem;
int item_y = gitem->GetY();
int start_x = 0;
int start_y = 0;
ViewStart( &start_x, &start_y );
start_y *= 10;
if (item_y < start_y+3)
{
int x = 0;
int y = 0;
m_anchor->GetSize( x, y );
y += 2*m_lineHeight;
int x_pos = GetScrollPos( wxHORIZONTAL );
SetScrollbars( 10, 10, x/10, y/10, x_pos, item_y/10 );
return;
}
int w = 0;
int h = 0;
GetClientSize( &w, &h );
if (item_y > start_y+h-26)
{
int x = 0;
int y = 0;
m_anchor->GetSize( x, y );
y += 2*m_lineHeight;
int x_pos = GetScrollPos( wxHORIZONTAL );
SetScrollbars( 10, 10, x/10, y/10, x_pos, (item_y-h+30)/10 );
return;
}
} }
void wxTreeCtrl::ScrollTo(const wxTreeItemId& WXUNUSED(item)) void wxTreeCtrl::ScrollTo(const wxTreeItemId& WXUNUSED(item))
@@ -1033,7 +1066,91 @@ void wxTreeCtrl::OnKillFocus( wxFocusEvent &WXUNUSED(event) )
void wxTreeCtrl::OnChar( wxKeyEvent &event ) void wxTreeCtrl::OnChar( wxKeyEvent &event )
{ {
// TODO process '+', '-' (expand/collapse branch) and cursor keys if (m_current == 0)
{
event.Skip();
return;
}
switch (event.KeyCode())
{
case '+':
case WXK_ADD:
{
if (HasChildren(m_current) && !IsExpanded(m_current))
{
Expand(m_current);
}
return;
}
case '-':
case WXK_SUBTRACT:
{
if (IsExpanded(m_current))
{
Collapse(m_current);
}
return;
}
case ' ':
case WXK_RETURN:
{
wxTreeEvent event( wxEVT_COMMAND_TREE_KEY_DOWN, GetId() );
event.m_item = m_current;
event.m_code = 0;
event.SetEventObject( this );
GetEventHandler()->ProcessEvent( event );
return;
}
case WXK_UP:
{
wxTreeItemId prev = GetPrevSibling( m_current );
if (prev != 0)
{
SelectItem( prev );
EnsureVisible( prev );
}
else
{
prev = GetParent( m_current );
if (prev)
{
EnsureVisible( prev );
SelectItem( prev );
}
}
return;
}
case WXK_DOWN:
{
if (IsExpanded(m_current))
{
long cookie = 0;
wxTreeItemId child = GetFirstChild( m_current, cookie );
SelectItem( child );
EnsureVisible( child );
}
else
{
wxTreeItemId next = GetNextSibling( m_current );
if (next == 0)
{
wxTreeItemId current = m_current;
while (current && !next)
{
current = GetParent( current );
if (current) next = GetNextSibling( current );
}
}
if (next != 0)
{
SelectItem( next );
EnsureVisible( next );
}
}
return;
}
}
event.Skip(); event.Skip();
} }
@@ -1055,7 +1172,7 @@ void wxTreeCtrl::OnMouse( wxMouseEvent &event )
if ( item == NULL ) if ( item == NULL )
return; return;
SelectItem(item); if (!IsSelected(item)) SelectItem(item);
if ( event.LeftDClick() ) if ( event.LeftDClick() )
{ {
@@ -1063,7 +1180,7 @@ void wxTreeCtrl::OnMouse( wxMouseEvent &event )
event.m_item = item; event.m_item = item;
event.m_code = 0; event.m_code = 0;
event.SetEventObject( this ); event.SetEventObject( this );
ProcessEvent( event ); GetEventHandler()->ProcessEvent( event );
} }
if ( onButton ) if ( onButton )