NodeView.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package view;
  2. import java.awt.BasicStroke;
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Dimension;
  6. import java.awt.Graphics;
  7. import java.awt.Graphics2D;
  8. import java.awt.Point;
  9. import javax.swing.*;
  10. import javax.swing.border.Border;
  11. import bk.ExtremalLayoutCalc.LayoutType;
  12. import graph.LayeredGraphNode;
  13. /**
  14. * A drawable representation of a node.
  15. * @author kolja
  16. *
  17. */
  18. public class NodeView extends JPanel {
  19. private static final long serialVersionUID = 1L;
  20. private LayeredGraphNode model;
  21. private LayoutType layout;
  22. public NodeView( LayeredGraphNode model, LayoutType lt ) {
  23. this.model = model;
  24. layout = lt;
  25. setSize( (int)model.getWidth( layout ), (int)model.getHeight( layout ) );
  26. }
  27. @Override
  28. public Point getLocation()
  29. {
  30. return new Point( (int)model.getX( layout ), (int)model.getY( layout ) );
  31. }
  32. @Override
  33. public Dimension getPreferredSize()
  34. {
  35. return new Dimension( (int)model.getWidth( layout ), (int)model.getHeight( layout ) );
  36. }
  37. @Override
  38. public void paint( Graphics g )
  39. {
  40. if( layout == LayoutType.COMBINED && model.getColor( layout ) == null )
  41. return;
  42. double scale = Math.min( (double)super.getWidth() / (int)model.getWidth( layout ), (double)super.getHeight() / (int)model.getHeight( layout ));
  43. ((Graphics2D)g).scale( scale, scale );
  44. int x = 0;
  45. int y = 0;
  46. int width = (int)(super.getWidth() / scale);
  47. int height = (int)(super.getHeight() / scale);
  48. if( scale == (double)super.getWidth() / (int)model.getWidth( layout ) )
  49. y += (super.getHeight() - (model.getHeight( layout ) * scale )) / scale / 2;
  50. if( scale == (double)super.getHeight() / (int)model.getHeight( layout ) )
  51. x += (super.getWidth() - (model.getWidth( layout ) * scale )) / scale / 2;
  52. paintComponent( g.create( x, y, width, height ) );
  53. double minX = Double.POSITIVE_INFINITY;
  54. for( Component c : getComponents() )
  55. {
  56. minX = Math.min( c.getLocation().x, minX);
  57. }
  58. for( Component c : getComponents() )
  59. {
  60. c.paint( g.create(
  61. c.getLocation().x + 25 - (int)minX + x,
  62. c.getLocation().y + 25 + y,
  63. Math.min( (int)model.getWidth( layout ) - 25, c.getPreferredSize().width + Math.abs(c.getLocation().x) + 25 ),
  64. Math.min( (int)model.getHeight( layout ) - 25, c.getPreferredSize().height + Math.abs(c.getLocation().y) + 25 ) ) );
  65. }
  66. }
  67. @Override
  68. public void paintComponent( Graphics g )
  69. {
  70. Graphics2D g2 = (Graphics2D)g;
  71. g2.setColor( model.getColor( layout ) );
  72. g2.setStroke(new BasicStroke(5));
  73. if( model.getContainedNodes().size() == 0 )
  74. {
  75. if( model.getRoot( layout ) == model )
  76. g2.fillOval( 0, 0, (int)model.getWidth( layout )-1, (int)model.getHeight( layout )-1 );
  77. else
  78. g2.fillRect( 0, 0, (int)model.getWidth( layout )-1, (int)model.getHeight( layout )-1 );
  79. }
  80. boolean selected = model.isSelected( layout );
  81. if( selected )
  82. {
  83. g.setColor( Color.BLACK );
  84. if( model.getContainedNodes().size() > 0 )
  85. g.setColor( Color.GRAY );
  86. g.fillRect( 0, 0, (int)model.getWidth( layout )-1, (int)model.getHeight( layout )-1 );
  87. }
  88. Border linebor = BorderFactory.createLineBorder(model.getColor( layout ), 5);
  89. if( model.getRoot( layout ) != model || model.getContainedNodes().size() != 0 )
  90. linebor.paintBorder( this, g2, 0, 0, (int)model.getWidth( layout )-1, (int)model.getHeight( layout )-1 );
  91. if( layout != LayoutType.COMBINED && model.getRoot( layout ).getSink( layout ).getColor( layout ) != model.getColor( layout ))
  92. {
  93. g.setColor( model.getRoot( layout ).getSink( layout ).getColor( layout ) );
  94. if( model.getContainedNodes().size() == 0 )
  95. {
  96. if( selected )
  97. 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 );
  98. else
  99. 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 );
  100. }
  101. }
  102. }
  103. }