/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.antlr.works.editor.grammar.debugger;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import javax.swing.text.AttributeSet;
import javax.swing.text.JTextComponent;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import org.netbeans.api.editor.mimelookup.MimeRegistration;
import org.netbeans.lib.editor.util.swing.DocumentUtilities;
import org.netbeans.spi.editor.highlighting.HighlightsContainer;
import org.netbeans.spi.editor.highlighting.HighlightsLayer;
import org.netbeans.spi.editor.highlighting.HighlightsLayerFactory;
import org.netbeans.spi.editor.highlighting.ZOrder;
import org.netbeans.spi.editor.highlighting.support.OffsetsBag;
/**
*
* @author Sam Harwell
*/
@MimeRegistration(mimeType=LexerDebuggerEditorKit.LEXER_DEBUGGER_MIME_TYPE, service=HighlightsLayerFactory.class)
public class LexerDebuggerSelectedTokenHighlighterLayerFactory implements HighlightsLayerFactory {
private static final AttributeSet[] SelectedTokenAttributes =
{
createSelectedTokenAttributeSet(0),
createSelectedTokenAttributeSet(1),
createSelectedTokenAttributeSet(2),
createSelectedTokenAttributeSet(3),
createSelectedTokenAttributeSet(4),
createSelectedTokenAttributeSet(5),
createSelectedTokenAttributeSet(6),
createSelectedTokenAttributeSet(7),
createSelectedTokenAttributeSet(8),
};
@Override
public HighlightsLayer[] createLayers(Context context) {
HighlightsContainer container = createSelectedTokensContainer(context.getComponent());
return new HighlightsLayer[] { HighlightsLayer.create(getClass().getName(), ZOrder.SYNTAX_RACK, true, container) };
}
private HighlightsContainer createSelectedTokensContainer(JTextComponent component) {
final OffsetsBag container = new OffsetsBag(component.getDocument());
DocumentUtilities.addPropertyChangeListener(component.getDocument(), new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
switch (evt.getPropertyName()) {
case LexerDebuggerEditorKit.PROP_SELECTED_TOKENS:
container.clear();
List<?> tokens = (List<?>)evt.getNewValue();
for (Object obj : tokens) {
if (obj instanceof TraceToken) {
TraceToken token = (TraceToken)obj;
container.addHighlight(token.getStartIndex(), token.getStopIndex() + 1, getSelectedTokenAttributes(token.getMode()));
}
}
break;
case LexerDebuggerEditorKit.PROP_SELECTED_CHARACTERS:
container.clear();
TupleIntInt[] characters = (TupleIntInt[])evt.getNewValue();
if (characters != null) {
for (TupleIntInt character : characters) {
container.addHighlight(character.getItem1(), character.getItem1() + 1, getSelectedTokenAttributes(character.getItem2() - 1));
}
}
break;
default:
break;
}
}
});
return container;
}
private static AttributeSet getSelectedTokenAttributes(int mode) {
if (mode >= 0 && mode < SelectedTokenAttributes.length) {
return SelectedTokenAttributes[mode];
}
return SelectedTokenAttributes[SelectedTokenAttributes.length - 1];
}
private static AttributeSet createSelectedTokenAttributeSet(int mode) {
MutableAttributeSet attributes = new SimpleAttributeSet();
attributes.addAttribute(StyleConstants.Background, LexerDebuggerTokenHighlighterLayerFactory.getColorForMode(mode, 0.15));
return attributes;
}
}