first commit
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Aga.Controls.Tree.NodeControls;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Aga.Controls.Tree
|
||||
{
|
||||
internal class IncrementalSearch
|
||||
{
|
||||
private const int SearchTimeout = 300; //end of incremental search timeot in msec
|
||||
|
||||
private TreeViewAdv _tree;
|
||||
private TreeNodeAdv _currentNode;
|
||||
private string _searchString = "";
|
||||
private DateTime _lastKeyPressed = DateTime.Now;
|
||||
|
||||
public IncrementalSearch(TreeViewAdv tree)
|
||||
{
|
||||
_tree = tree;
|
||||
}
|
||||
|
||||
public void Search(Char value)
|
||||
{
|
||||
if (!Char.IsControl(value))
|
||||
{
|
||||
Char ch = Char.ToLowerInvariant(value);
|
||||
DateTime dt = DateTime.Now;
|
||||
TimeSpan ts = dt - _lastKeyPressed;
|
||||
_lastKeyPressed = dt;
|
||||
if (ts.TotalMilliseconds < SearchTimeout)
|
||||
{
|
||||
if (_searchString == value.ToString())
|
||||
FirstCharSearch(ch);
|
||||
else
|
||||
ContinuousSearch(ch);
|
||||
}
|
||||
else
|
||||
{
|
||||
FirstCharSearch(ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ContinuousSearch(Char value)
|
||||
{
|
||||
if (value == ' ' && String.IsNullOrEmpty(_searchString))
|
||||
return; //Ingnore leading space
|
||||
|
||||
_searchString += value;
|
||||
DoContinuousSearch();
|
||||
}
|
||||
|
||||
private void FirstCharSearch(Char value)
|
||||
{
|
||||
if (value == ' ')
|
||||
return;
|
||||
|
||||
_searchString = value.ToString();
|
||||
TreeNodeAdv node = null;
|
||||
if (_tree.SelectedNode != null)
|
||||
node = _tree.SelectedNode.NextVisibleNode;
|
||||
if (node == null)
|
||||
node = _tree.Root.NextVisibleNode;
|
||||
|
||||
if (node != null)
|
||||
foreach (string label in IterateNodeLabels(node))
|
||||
{
|
||||
if (label.StartsWith(_searchString))
|
||||
{
|
||||
_tree.SelectedNode = _currentNode;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public virtual void EndSearch()
|
||||
{
|
||||
_currentNode = null;
|
||||
_searchString = "";
|
||||
}
|
||||
|
||||
protected IEnumerable<string> IterateNodeLabels(TreeNodeAdv start)
|
||||
{
|
||||
_currentNode = start;
|
||||
while(_currentNode != null)
|
||||
{
|
||||
foreach (string label in GetNodeLabels(_currentNode))
|
||||
yield return label;
|
||||
|
||||
_currentNode = _currentNode.NextVisibleNode;
|
||||
if (_currentNode == null)
|
||||
_currentNode = _tree.Root;
|
||||
|
||||
if (start == _currentNode)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerable<string> GetNodeLabels(TreeNodeAdv node)
|
||||
{
|
||||
foreach (NodeControl nc in _tree.NodeControls)
|
||||
{
|
||||
BindableControl bc = nc as BindableControl;
|
||||
if (bc != null && bc.IncrementalSearchEnabled)
|
||||
{
|
||||
object obj = bc.GetValue(node);
|
||||
if (obj != null)
|
||||
yield return obj.ToString().ToLowerInvariant();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool DoContinuousSearch()
|
||||
{
|
||||
bool found = false;
|
||||
if (!String.IsNullOrEmpty(_searchString))
|
||||
{
|
||||
TreeNodeAdv node = null;
|
||||
if (_tree.SelectedNode != null)
|
||||
node = _tree.SelectedNode;
|
||||
if (node == null)
|
||||
node = _tree.Root.NextVisibleNode;
|
||||
|
||||
if (!String.IsNullOrEmpty(_searchString))
|
||||
{
|
||||
foreach (string label in IterateNodeLabels(node))
|
||||
{
|
||||
if (label.StartsWith(_searchString))
|
||||
{
|
||||
found = true;
|
||||
_tree.SelectedNode = _currentNode;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user