/*
* [The "BSD license"]
* Copyright (c) 2011 Terence Parr
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.stringtemplate.v4.gui;
import org.stringtemplate.v4.Interpreter;
import org.stringtemplate.v4.ST;
import org.stringtemplate.v4.StringRenderer;
import org.stringtemplate.v4.debug.EvalTemplateEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
public class JTreeSTModel implements TreeModel {
public Interpreter interp;
public Wrapper root;
public static class Wrapper {
EvalTemplateEvent event;
public Wrapper(EvalTemplateEvent event) { this.event = event; }
@Override
public int hashCode() {
return event.hashCode();
}
@Override
public boolean equals(Object o) {
if ( o == null ) return false;
//System.out.println(event+"=="+((Wrapper)o).event+" is "+(this.event == ((Wrapper)o).event));
return this.event == ((Wrapper)o).event;
}
@Override
public String toString() {
ST st = event.scope.st;
if ( st.isAnonSubtemplate() ) return "{...}";
if ( st.debugState!=null && st.debugState.newSTEvent!=null ) {
String label = st.toString()+" @ "+st.debugState.newSTEvent.getFileName()+":"+
st.debugState.newSTEvent.getLine();
return "<html><b>" + StringRenderer.escapeHTML(label) + "</b></html>";
}
else {
return st.toString();
}
}
}
public JTreeSTModel(Interpreter interp, EvalTemplateEvent root) {
this.interp = interp;
this.root = new Wrapper(root);
}
@Override
public Object getChild(Object parent, int index) {
EvalTemplateEvent e = ((Wrapper)parent).event;
return new Wrapper(e.scope.childEvalTemplateEvents.get(index));
}
@Override
public int getChildCount(Object parent) {
EvalTemplateEvent e = ((Wrapper)parent).event;
return e.scope.childEvalTemplateEvents.size();
}
@Override
public int getIndexOfChild(Object parent, Object child) {
EvalTemplateEvent p = ((Wrapper)parent).event;
EvalTemplateEvent c = ((Wrapper)parent).event;
int i = 0;
for (EvalTemplateEvent e : p.scope.childEvalTemplateEvents) {
if ( e.scope.st == c.scope.st ) {
// System.out.println(i);
// System.out.println("found "+e.self+" as child of "+parentST);
return i;
}
i++;
}
return -1;
}
@Override
public boolean isLeaf(Object node) {
return getChildCount(node) == 0;
}
@Override
public Object getRoot() { return root; }
@Override
public void valueForPathChanged(TreePath treePath, Object o) {
}
@Override
public void addTreeModelListener(TreeModelListener treeModelListener) {
}
@Override
public void removeTreeModelListener(TreeModelListener treeModelListener) {
}
}