129 lines
3.5 KiB
C#
129 lines
3.5 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|