Index: ctl/ctlTree.cpp
===================================================================
--- ctl/ctlTree.cpp	(revision 7666)
+++ ctl/ctlTree.cpp	(working copy)
@@ -20,7 +20,78 @@
 #include "schema/pgCollection.h"
 #include "schema/pgServer.h"
 
+#ifdef __LINUX__ 
+BEGIN_EVENT_TABLE(ctlTree, wxTreeCtrl)
+    EVT_CHAR(ctlTree::OnChar)
+END_EVENT_TABLE()
 
+int level = 0;
+
+wxTreeItemId ctlTree::FindItem(const wxTreeItemId& item, const wxString& str)
+{
+    wxTreeItemId resultItem;
+    wxTreeItemId currItem = item;
+    if (!currItem.IsOk())
+        return currItem;
+    
+    wxString val = GetItemText(currItem);
+
+    // Ignore Dummy Nodes
+    if (!(val == wxT("Dummy") && GetItemData(item) == NULL) && val.Lower().StartsWith(str))
+    {
+        return currItem;
+    }
+    
+    if (HasChildren(currItem))
+    {
+        wxTreeItemIdValue cookie;
+        wxTreeItemId childItem = GetFirstChild(currItem, cookie);
+        level++;
+        resultItem = FindItem(childItem, str);
+        if (resultItem.IsOk())
+        {
+            level--;
+            return resultItem;
+        }
+        level--;
+    }
+    
+    currItem = GetNextSibling(currItem);
+    
+    if (currItem.IsOk())
+        resultItem = FindItem(currItem, str);
+
+    return resultItem;
+}
+
+void ctlTree::OnChar(wxKeyEvent& event)
+{
+    int keyCode = event.GetKeyCode();
+    if ( !event.HasModifiers() &&
+         ((keyCode >= '0' && keyCode <= '9') ||
+          (keyCode >= 'a' && keyCode <= 'z') ||
+          (keyCode >= 'A' && keyCode <= 'Z')))
+    {
+        wxChar ch = (wxChar)keyCode;
+        wxTreeItemId currItem = GetSelection();
+        if (!currItem.IsOk())
+            return;
+
+        wxTreeItemId matchItem = FindItem(currItem, wxString(ch).Lower());
+        if (matchItem.IsOk())
+        {
+            EnsureVisible(matchItem);
+            SelectItem(matchItem);
+        }
+    }
+    else
+    {
+        event.Skip(true);
+    }
+}
+#endif
+
+
 ctlTree::ctlTree(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style)
 : wxTreeCtrl(parent, id, pos, size, style)
 {
Index: include/ctl/ctlTree.h
===================================================================
--- include/ctl/ctlTree.h	(revision 7666)
+++ include/ctl/ctlTree.h	(working copy)
@@ -36,6 +36,14 @@
     pgCollection *GetParentCollection(wxTreeItemId id);
     pgObject *FindObject(pgaFactory &factory, wxTreeItemId parent);
     pgCollection *FindCollection(pgaFactory &factory, wxTreeItemId parent);
+    wxTreeItemId FindItem(const wxTreeItemId& item, const wxString& str);
+
+#ifdef __LINUX__ 
+    DECLARE_EVENT_TABLE()
+private:
+    void OnChar(wxKeyEvent& event);
+#endif
+
 };
 
 
