package de.unisiegen.gtitool.ui.jgraph; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.util.ArrayList; import org.jgraph.graph.DefaultGraphModel; import de.unisiegen.gtitool.core.entities.regex.RegexNode; import de.unisiegen.gtitool.ui.model.DefaultMachineModel; /** * A {@link JGTIGraph} with BlackBoxes */ public class JGTIBlackboxGraph extends JGTIGraph { /** * The serial version uid. */ private static final long serialVersionUID = 3156000727862499906L; /** * The {@link DefaultBlackboxView}s */ private ArrayList < DefaultBlackboxView > defaultBlackboxViews; /** * The x space */ public static int X_SPACE = 8; /** * The y space */ public static int Y_SPACE = 8; /** * The scale factor */ public static double SCALE_FACTOR = 0.8; /** * Creates new {@link JGTIBlackboxGraph} * * @param defaultMachineModel * @param defaultGraphModel */ public JGTIBlackboxGraph ( DefaultMachineModel defaultMachineModel, DefaultGraphModel defaultGraphModel ) { super ( defaultMachineModel, defaultGraphModel ); this.defaultBlackboxViews = new ArrayList < DefaultBlackboxView > (); } /** * Adds a BlackBox for a specified {@link DefaultBlackboxView} * * @param defaultBlackboxView The {@link DefaultBlackboxView} */ public void addBlackBox ( DefaultBlackboxView defaultBlackboxView ) { if ( defaultBlackboxView == null ) { throw new IllegalArgumentException ( "black box view is null" ); //$NON-NLS-1$ } if ( this.defaultBlackboxViews.contains ( defaultBlackboxView ) ) { repaint (); return; } this.defaultBlackboxViews.add ( defaultBlackboxView ); repaint (); } /** * Returns the {@link DefaultBlackboxView} for a specified {@link RegexNode} * * @param n The {@link RegexNode} * @return The {@link DefaultBlackboxView} if exists, else <code>null</code> */ public DefaultBlackboxView getBlackboxViewForRegexNode ( RegexNode n ) { for ( DefaultBlackboxView b : this.defaultBlackboxViews ) { if ( b.getContent ().equals ( n ) ) { return b; } } return null; } /** * {@inheritDoc} * * @see de.unisiegen.gtitool.ui.jgraph.JGTIGraph#getToolTipText(java.awt.event.MouseEvent) */ @Override public String getToolTipText ( MouseEvent event ) { for ( DefaultBlackboxView bview : this.defaultBlackboxViews ) { if ( bview.containsPoint ( event.getPoint () ) && bview.needsToolTip () ) { return bview.getContent ().toString (); } } return super.getToolTipText ( event ); } /** * {@inheritDoc} * * @see JGTIGraph#paintComponent(java.awt.Graphics) */ @Override protected void paintComponent ( Graphics graphics ) { super.paintComponent ( graphics ); Graphics2D g = ( Graphics2D ) graphics; g.scale ( SCALE_FACTOR, SCALE_FACTOR ); for ( DefaultBlackboxView bview : this.defaultBlackboxViews ) { DefaultStateView startView = bview.getStartState (); DefaultStateView endView = bview.getFinalState (); int x0 = ( int ) ( bview.getStartState ().getPositionX () - JGTIBlackboxGraph.X_SPACE ); int y0 = ( int ) ( bview.getStartState ().getPositionY () - JGTIBlackboxGraph.Y_SPACE ); int y1 = ( int ) ( bview.getStartState ().getHeight () + 2 * JGTIBlackboxGraph.Y_SPACE ); int x1 = ( int ) ( endView.getPositionX () - startView.getPositionX () + endView.getWidth () + 2 * X_SPACE ); g.drawRoundRect ( x0, y0, x1, y1, 20, 20 ); int xString = ( int ) ( bview.getStartState ().getPositionX () + bview.getStartState ().getWidth () + 2 * JGTIBlackboxGraph.X_SPACE ); int yString = ( int ) ( bview.getStartState ().getPositionY () + bview .getStartState ().getHeight () / 2 ); g.drawString ( bview.getContentString (), xString, yString ); } } /** * Removes the blackbox for a specified {@link DefaultBlackboxView} * * @param defaultBlackboxView The {@link DefaultBlackboxView} */ public void removeBlackBox ( DefaultBlackboxView defaultBlackboxView ) { if ( defaultBlackboxView == null ) { throw new IllegalArgumentException ( "black box view is null" ); //$NON-NLS-1$ } this.defaultBlackboxViews.remove ( defaultBlackboxView ); repaint (); } /** * Removes the black box for a specified {@link RegexNode} * * @param n The {@link RegexNode} */ public void removeBlackBox ( RegexNode n ) { if ( getBlackboxViewForRegexNode ( n ) != null ) { removeBlackBox ( getBlackboxViewForRegexNode ( n ) ); } } }