package org.eclipse.iee.editor.text.edit; import org.eclipse.iee.core.document.text.Document; import org.eclipse.iee.core.document.text.ICompositeNode; import org.eclipse.iee.core.document.text.INode; import org.eclipse.iee.core.document.text.INodeVisitor; import org.eclipse.iee.core.document.text.Span; import org.eclipse.iee.core.document.text.Text; import com.google.common.base.Supplier; public class ChangeStyleVisitor implements INodeVisitor<ChangeStyleCtx, CompositeCommand>{ @Override public CompositeCommand visitText(final Text text, final ChangeStyleCtx ctx) { int from; int to; if (ctx.isFrom(text)) { ctx.setStarted(true); from = ctx.getFrom().getOffset(); } else { from = 0; } if (ctx.isTo(text) ) { ctx.setStarted(false); to = ctx.getTo().getOffset(); } else { to = text.getText().length(); } if (from != 0 || to != text.getText().length()) { ctx.append(new WrapCommand(text, from, to)); } ctx.append(ctx.do_(new Supplier<Span>() { @Override public Span get() { return (Span) text.getParent(); } })); return ctx.getCommand(); } @Override public CompositeCommand visitDocument(Document document, ChangeStyleCtx ctx) { traverse(document, ctx); return ctx.getCommand(); } @Override public CompositeCommand visitSpan(final Span span, final ChangeStyleCtx ctx) { if (ctx.isStarted() && !span.isOrContains(ctx.getTo().getModel())) { ctx.append(ctx.do_(new Supplier<Span>() { @Override public Span get() { return span; } })); } else { traverse(span, ctx); } return ctx.getCommand(); } protected void traverse(ICompositeNode<?> composite, ChangeStyleCtx ctx) { boolean started = ctx.isStarted(); for (INode node : composite.getChildren()) { if (started) { node.accept(this, ctx); } else if (node.isOrContains(ctx.getFrom().getModel())) { started = true; node.accept(this, ctx); } if (node.isOrContains(ctx.getTo().getModel())) { started = false; } } } }