package de.unisiegen.gtitool.ui.jgraph;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;
import org.jgraph.graph.CellViewRenderer;
import org.jgraph.graph.VertexRenderer;
import org.jgraph.graph.VertexView;
import de.unisiegen.gtitool.core.entities.regex.LeafNode;
import de.unisiegen.gtitool.core.entities.regex.RegexNode;
import de.unisiegen.gtitool.core.parser.style.PrettyString;
import de.unisiegen.gtitool.core.parser.style.PrettyToken;
import de.unisiegen.gtitool.ui.preferences.PreferenceManager;
/**
* A {@link VertexView} for {@link RegexNode}s
*/
public class NodeView extends VertexView
{
/**
* The {@link JGTIGraph} ellipse renderer.
*
* @author Benjamin Mies
* @author Christian Fehler
*/
public static class JGraphEllipseRenderer extends VertexRenderer
{
/**
* The serial version uid.
*/
private static final long serialVersionUID = 3497283943770041140L;
/**
* The {@link StateView}.
*/
private NodeView nodeView;
/**
* Allocates a new {@link JGraphEllipseRenderer}.
*
* @param nodeView The {@link StateView}.
*/
public JGraphEllipseRenderer ( NodeView nodeView )
{
super ();
this.nodeView = nodeView;
}
/**
* {@inheritDoc}
*
* @see JComponent#getPreferredSize()
*/
@Override
public final Dimension getPreferredSize ()
{
Dimension d = super.getPreferredSize ();
d.width += d.width / 8;
d.height += d.height / 2;
return d;
}
/**
* {@inheritDoc}
*
* @see VertexRenderer#paint(Graphics)
*/
@Override
public final void paint ( Graphics g )
{
RegexNode node = null;
DefaultNodeView defaultNodeView = null;
if ( this.nodeView.getCell () instanceof DefaultNodeView )
{
defaultNodeView = ( DefaultNodeView ) this.nodeView.getCell ();
node = defaultNodeView.getNode ();
}
else
{
return;
}
boolean b = false;
if ( b && super.isOpaque () )
{
Color background = Color.CYAN;
Graphics2D g2 = ( Graphics2D ) g;
Dimension d = getSize ();
g.setColor ( background );
if ( ( this.gradientColor != null ) && !this.preview )
{
setOpaque ( false );
g2.setPaint ( new GradientPaint ( 0, 0, background, getWidth (),
getHeight (), this.gradientColor, true ) );
}
g.fillRoundRect ( 0, 0, d.width, d.height, 2, 2 );
}
Dimension d = getSize ();
int dx = 0;
int dy = 0;
try
{
setOpaque ( false );
FontMetrics metrics = g.getFontMetrics ();
dx = ( d.width / 2 )
- ( metrics.stringWidth ( node.getNodeString ().toString () ) / 2 )
- 1;
dy = ( d.height / 2 ) + ( metrics.getHeight () / 2 );
g.setFont ( getFont () );
PrettyString prettyString = new PrettyString ();
prettyString.add ( node.toPrettyString () );
for ( PrettyToken currentToken : prettyString )
{
Font font = null;
if ( !currentToken.isBold () && !currentToken.isItalic () )
{
font = g.getFont ().deriveFont ( Font.PLAIN );
}
else if ( currentToken.isBold () && currentToken.isItalic () )
{
font = g.getFont ().deriveFont ( Font.BOLD | Font.ITALIC );
}
else if ( currentToken.isBold () )
{
font = g.getFont ().deriveFont ( Font.BOLD );
}
else if ( currentToken.isItalic () )
{
font = g.getFont ().deriveFont ( Font.ITALIC );
}
g.setFont ( font );
}
}
finally
{
if ( node instanceof LeafNode )
{
LeafNode leaf = ( LeafNode ) node;
FontMetrics metrics = g.getFontMetrics ();
if ( this.selected )
{
g.setColor ( PreferenceManager.getInstance ()
.getColorItemRegexSelectedNode ().getColor () );
}
else if ( leaf.isActive () )
{
g.setColor ( PreferenceManager.getInstance ()
.getColorItemRegexMarkedNode ().getColor () );
}
else
{
g.setColor ( PreferenceManager.getInstance ()
.getColorItemRegexToken ().getColor () );
}
g.drawString ( node.getNodeString ().toString (), dx, metrics
.getHeight () );
if ( leaf.isPositionShown () )
{
String position = String.valueOf ( leaf.getPosition () );
dx = ( d.width / 2 ) - ( metrics.stringWidth ( position ) / 2 );
if ( this.selected )
{
g.setColor ( PreferenceManager.getInstance ()
.getColorItemRegexSelectedNode ().getColor () );
}
else if ( leaf.isActive () )
{
g.setColor ( PreferenceManager.getInstance ()
.getColorItemRegexMarkedNode ().getColor () );
}
else
{
g.setColor ( PreferenceManager.getInstance ()
.getColorItemRegexPosition ().getColor () );
}
g.drawString ( position, dx, 2 * metrics.getHeight () );
}
}
else
{
if ( this.selected )
{
g.setColor ( PreferenceManager.getInstance ()
.getColorItemRegexSelectedNode ().getColor () );
}
else if ( node.isActive () )
{
g.setColor ( PreferenceManager.getInstance ()
.getColorItemRegexMarkedNode ().getColor () );
}
else
{
g.setColor ( PreferenceManager.getInstance ()
.getColorItemRegexSymbol ().getColor () );
}
g.drawString ( node.getNodeString ().toString (), dx, dy );
}
}
}
}
/**
* The serial version uid.
*/
private static final long serialVersionUID = 7696001267184494753L;
/**
* The {@link JGraphEllipseRenderer} for this view.
*/
public transient VertexRenderer ellipseRenderer;
/**
* Creates a new {@link NodeView}
*/
public NodeView ()
{
super ();
this.ellipseRenderer = new JGraphEllipseRenderer ( this );
}
/**
* Creates a new {@link NodeView}
*
* @param cell The object for this view
*/
public NodeView ( Object cell )
{
super ( cell );
this.ellipseRenderer = new JGraphEllipseRenderer ( this );
}
/**
* {@inheritDoc}
*
* @see VertexView#getRenderer()
*/
@Override
public final CellViewRenderer getRenderer ()
{
return this.ellipseRenderer;
}
}