/*******************************************************************************
* Copyright (c) 2007, 2008 Edgar Espina.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.deved.antlride.internal.ui.views.interpreter;
import org.deved.antlride.core.model.evaluation.EvalElementKind;
import org.deved.antlride.core.model.evaluation.IEvalElement;
import org.deved.antlride.core.model.evaluation.IExceptionEvalElement;
import org.deved.antlride.core.model.evaluation.IRuleEvalElement;
import org.deved.antlride.core.model.evaluation.ITokenEvalElement;
import org.deved.antlride.ui.AntlrPreferenceConstants;
import org.eclipse.draw2d.BorderLayout;
import org.eclipse.draw2d.Clickable;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Cursors;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.LineBorder;
//import org.eclipse.draw2d.SimpleRaisedBorder;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Display;
public class AntlrFigure extends Clickable {
public int x;
public int y;
public int width;
public int height;
public final IEvalElement element;
private static final String RULE_TOOL_TIP_PATTERN = " select \"%1$s\" in editor";
private static final String LOCATION_TOOL_TIP_PATTERN = " \'%1$s\' found at %2$s:%3$s ";
public AntlrFigure(IEvalElement evalElement, int x, int y) {
//setStyle(Clickable.STYLE_BUTTON);
setCursor(Cursors.HAND);
this.element = evalElement;
setLayoutManager(new BorderLayout());
Font font = JFaceResources.getFont("Monospaced");
Label label = new Label();
Label tooltip = new Label();
EvalElementKind kind = evalElement.getElementKind();
String labelText = null;
String labelToolTipText = null;
Color foregroundColor = Display.getDefault().getSystemColor(
SWT.COLOR_BLACK);
switch (kind) {
case RULE: {
labelText = evalElement.getElementName();
labelToolTipText = String.format(RULE_TOOL_TIP_PATTERN, labelText);
if (!((IRuleEvalElement) evalElement).isLexerRule()) {
foregroundColor = JFaceResources.getColorRegistry().get(
AntlrPreferenceConstants.EDITOR_RULE_COLOR);
}
}
break;
case TOKEN: {
ITokenEvalElement token = (ITokenEvalElement) evalElement;
labelText = "'" + evalElement.getElementName() + "'";
labelToolTipText = String.format(LOCATION_TOOL_TIP_PATTERN,
evalElement.getElementName(), token.getLine(), token.getColumn() + 1);
foregroundColor = JFaceResources.getColorRegistry().get(
AntlrPreferenceConstants.EDITOR_STRING_COLOR);
}
break;
case EXCEPTION: {
IExceptionEvalElement exception = (IExceptionEvalElement) evalElement;
labelText = evalElement.getElementName();
// labelToolTipText = String.format(LOCATION_TOOL_TIP_PATTERN,
// labelText, exception.getLine(), exception.getColumn() + 1);
labelToolTipText = exception.getMessage();
foregroundColor = Display.getCurrent()
.getSystemColor(SWT.COLOR_RED);
}
break;
}
// text
label.setFont(font);
label.setText(labelText);
label.setForegroundColor(foregroundColor);
// tooltip
tooltip.setText(labelToolTipText);
setToolTip(tooltip);
// add text label
add(label, BorderLayout.CENTER);
//setBorder(new SimpleRaisedBorder());
setBorder(new LineBorder(ColorConstants.black, 1));
Dimension size = FigureUtilities.getTextExtents(labelText + " ", font);
this.x = x;
this.y = y;
this.width = size.width + (size.width * 2 / 10);
this.height = size.height + (size.height * 2 / 5);
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("{'");
builder.append(element.getElementName());
builder.append("' (x=");
builder.append(x);
builder.append("; y=");
builder.append(y);
builder.append("; w=");
builder.append(width);
builder.append("; h=");
builder.append(height);
builder.append(")}");
return builder.toString();
}
}