singrdk/base/Windows/csic/Browser/ILTextView.cs

129 lines
3.5 KiB
C#
Raw Permalink Normal View History

2008-11-17 18:29:00 -05:00
using System;
using System.Collections;
using System.Windows.Forms;
namespace Browser {
public class ILTextView {
public string Text { set { rtb.Text = value; } }
public AST ASTRoot;
Tracking tracking;
private TextBox rtb;
private Model model;
public ILTextView(Model model, TextBox rtb) {
this.model = model;
this.rtb = rtb;
model.ObjectChangedHandler += new ObjectChangedEventHandler(this.ObjectChanged);
this.ObjectChanged();
}
public static Control NewControl(Model model, object o) {
IHasCoordinate ihc = (IHasCoordinate) o;
TextBox rtb = new TextBox();
rtb.Multiline = true;
rtb.ScrollBars = ScrollBars.Both;
rtb.WordWrap = false;
rtb.HideSelection = false;
ILTextView stv = new ILTextView(model, rtb);
if (ihc is AST) {
AST p = (AST) ihc;
while (p.parent != null && p.parent.begin.file == ihc.begin.file && !(p is compilation_unit)) {
p = p.parent;
}
stv.ASTRoot = p;
if (stv.ASTRoot is compilation_unit) {
compilation_unit c = (compilation_unit) stv.ASTRoot;
Tracking tracking = new Tracking();
tracking_ilgen ti = new tracking_ilgen(tracking, c);
tracking.tracked = ti;
stv.tracking = ti.create(c);
stv.Text = stv.tracking.Text;
}
}
rtb.MouseUp += new MouseEventHandler(stv.Select);
stv.ObjectChanged();
return rtb;
}
public static Control NewBrowser(Model model) {
TabControl tab = new TabControl();
tab.Alignment = TabAlignment.Bottom;
new SourceTabView(model, tab, new NewControl(ILTextView.NewControl));
return tab;
}
public void Select(object o, MouseEventArgs args) {
Select();
}
public void Select() {
FindObject fo = new FindObject(tracking, rtb.SelectionStart, rtb.SelectionStart+rtb.SelectionLength);
ASTVisitor visit = new ASTVisitor(fo.Visitor);
this.ASTRoot.visit(visit);
model.ChangeObject(fo.FoundObject);
}
public class FindObject {
private Tracking tracking;
private int lo;
private int hi;
public FindObject(Tracking tracking, int lo, int hi) {
this.tracking = tracking;
this.lo = lo;
this.hi = hi;
}
public object FoundObject;
public void Visitor(AST ast) {
Tracking.Pair pair = tracking.Span(ast);
if (pair != null && pair.begin <= lo && pair.end >= hi) {
this.FoundObject = ast;
}
}
}
public class FindSpan {
public Tracking.Pair pair;
private Tracking tracking;
public FindSpan(Tracking tracking) {
this.tracking = tracking;
}
public void Visitor(AST ast) {
Tracking.Pair span = tracking.Span(ast);
if (span != null) {
if (pair == null) {
pair = span;
} else {
if (pair.begin > span.begin) pair.begin = span.begin;
if (pair.end < span.end) pair.end = span.end;
}
}
}
}
public void ObjectChanged() {
object o = model.CurrentObject;
if (o != null && tracking != null) {
Tracking.Pair span = null;
if (o is AST) {
AST ast = (AST) o;
FindSpan fs = new FindSpan(tracking);
ASTVisitor visit = new ASTVisitor(fs.Visitor);
ast.visit(visit);
span = fs.pair;
}
if (span != null) {
rtb.SelectionLength = 0;
rtb.SelectionStart = span.begin;
rtb.SelectionLength = span.end - span.begin;
rtb.HideSelection = false;
} else {
rtb.HideSelection = true;
}
} else {
rtb.HideSelection = true;
}
}
}
}