123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- package view;
- import java.awt.BasicStroke;
- import java.awt.Color;
- import java.awt.Component;
- import java.awt.Dimension;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.Point;
- import javax.swing.*;
- import javax.swing.border.Border;
- import bk.ExtremalLayoutCalc.LayoutType;
- import graph.LayeredGraphNode;
- /**
- * A drawable representation of a node.
- * @author kolja
- *
- */
- public class NodeView extends JPanel {
- private static final long serialVersionUID = 1L;
- private LayeredGraphNode model;
- private LayoutType layout;
- public NodeView( LayeredGraphNode model, LayoutType lt ) {
- this.model = model;
- layout = lt;
- setSize( (int)model.getWidth( layout ), (int)model.getHeight( layout ) );
- }
- @Override
- public Point getLocation()
- {
- return new Point( (int)model.getX( layout ), (int)model.getY( layout ) );
- }
-
- @Override
- public Dimension getPreferredSize()
- {
- return new Dimension( (int)model.getWidth( layout ), (int)model.getHeight( layout ) );
- }
-
- @Override
- public void paint( Graphics g )
- {
- if( layout == LayoutType.COMBINED && model.getColor( layout ) == null )
- return;
- double scale = Math.min( (double)super.getWidth() / (int)model.getWidth( layout ), (double)super.getHeight() / (int)model.getHeight( layout ));
- ((Graphics2D)g).scale( scale, scale );
- int x = 0;
- int y = 0;
- int width = (int)(super.getWidth() / scale);
- int height = (int)(super.getHeight() / scale);
- if( scale == (double)super.getWidth() / (int)model.getWidth( layout ) )
- y += (super.getHeight() - (model.getHeight( layout ) * scale )) / scale / 2;
- if( scale == (double)super.getHeight() / (int)model.getHeight( layout ) )
- x += (super.getWidth() - (model.getWidth( layout ) * scale )) / scale / 2;
- paintComponent( g.create( x, y, width, height ) );
- double minX = Double.POSITIVE_INFINITY;
- for( Component c : getComponents() )
- {
- minX = Math.min( c.getLocation().x, minX);
- }
- for( Component c : getComponents() )
- {
- c.paint( g.create(
- c.getLocation().x + 25 - (int)minX + x,
- c.getLocation().y + 25 + y,
- Math.min( (int)model.getWidth( layout ) - 25, c.getPreferredSize().width + Math.abs(c.getLocation().x) + 25 ),
- Math.min( (int)model.getHeight( layout ) - 25, c.getPreferredSize().height + Math.abs(c.getLocation().y) + 25 ) ) );
- }
- }
- @Override
- public void paintComponent( Graphics g )
- {
- Graphics2D g2 = (Graphics2D)g;
- g2.setColor( model.getColor( layout ) );
- g2.setStroke(new BasicStroke(5));
- if( model.getContainedNodes().size() == 0 )
- {
- if( model.getRoot( layout ) == model )
- g2.fillOval( 0, 0, (int)model.getWidth( layout )-1, (int)model.getHeight( layout )-1 );
- else
- g2.fillRect( 0, 0, (int)model.getWidth( layout )-1, (int)model.getHeight( layout )-1 );
- }
- boolean selected = model.isSelected( layout );
- if( selected )
- {
- g.setColor( Color.BLACK );
- if( model.getContainedNodes().size() > 0 )
- g.setColor( Color.GRAY );
- g.fillRect( 0, 0, (int)model.getWidth( layout )-1, (int)model.getHeight( layout )-1 );
- }
- Border linebor = BorderFactory.createLineBorder(model.getColor( layout ), 5);
- if( model.getRoot( layout ) != model || model.getContainedNodes().size() != 0 )
- linebor.paintBorder( this, g2, 0, 0, (int)model.getWidth( layout )-1, (int)model.getHeight( layout )-1 );
- if( layout != LayoutType.COMBINED && model.getRoot( layout ).getSink( layout ).getColor( layout ) != model.getColor( layout ))
- {
- g.setColor( model.getRoot( layout ).getSink( layout ).getColor( layout ) );
- if( model.getContainedNodes().size() == 0 )
- {
- if( selected )
- g.fillOval( (int)model.getWidth( layout ) / 2 - (int)model.getWidth( layout ) / 5, (int)model.getHeight( layout ) / 2 - (int)model.getHeight( layout ) / 5, (int)model.getWidth( layout ) / 5 * 2, (int)model.getHeight( layout ) / 5 * 2 );
- else
- g.fillOval( (int)model.getWidth( layout ) / 2 - (int)model.getWidth( layout ) / 3, (int)model.getHeight( layout ) / 2 - (int)model.getHeight( layout ) / 3, (int)model.getWidth( layout ) / 3 * 2, (int)model.getHeight( layout ) / 3 * 2 );
- }
- }
- }
- }
|