📄 processpanel.java
字号:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.Vector;
import javax.swing.JPanel;
import org.cip4.jdflib.node.JDFNode;
/*
* FooProcessPanel.java
* @author SvenoniusI
*/
public class ProcessPanel extends JPanel
{
/**
* Comment for <code>serialVersionUID</code>
*/
private static final long serialVersionUID = 5217687675396163701L;
public int width;
public int height;
private Vector vPoints = new Vector();
private Vector vDirPoints = new Vector();
private Vector vParts = new Vector();
private Font procFont = new Font("Verdana", Font.PLAIN, 10);
private Font resourceFont = new Font("Verdana", Font.PLAIN, 9);
private Font parentFont = new Font("Verdana", Font.BOLD, 12);
private double zoom;
private ProcessPart parent = null;
public ProcessPanel()
{
super();
this.zoom = 1.0;
}
public void paintComponent(Graphics g)
{
this.width = 0;
this.height = 0;
super.paintComponent(g);
((Graphics2D) g).scale(zoom, zoom);
if (parent != null)
{
g.setFont(getFont(parent));
g.setColor(parent.getgColor());
g.fillRoundRect(parent.getxPos(), parent.getyPos(), parent.width, parent.height, 25, 25);
g.setColor(Color.black);
g.drawRoundRect(parent.getxPos(), parent.getyPos(), parent.width, parent.height, 25, 25);
final String[] s = parent.getgString();
final int xMarg = 15;
int yMarg = 2;
for (int i = 0; i < s.length; i++)
{
yMarg += 15;
g.drawString(s[i], parent.getxPos() + xMarg, parent.getyPos() + yMarg);
}
parent.setBounds((int) (parent.getxPos() * zoom),
(int) (parent.getyPos() * zoom),
(int) (parent.width * zoom),
(int) (parent.height * zoom));
add(parent, -1);
width = width < parent.width ? parent.width : width;
height = height < parent.height ? parent.height : height;
}
for (int i = 0; i < vParts.size(); i++)
{
final ProcessPart part = (ProcessPart) vParts.get(i);
g.setFont(getFont(part));
g.setColor(part.getgColor());
if (part.getElem() instanceof JDFNode)
{
g.fillRoundRect(part.getxPos(), part.getyPos(), part.width, part.height, 10, 10);
g.setColor(Color.black);
g.drawRoundRect(part.getxPos(), part.getyPos(), part.width, part.height, 10, 10);
}
else
{
g.fillRect(part.getxPos(), part.getyPos(), part.width, part.height);
g.setColor(Color.black);
g.drawRect(part.getxPos(), part.getyPos(), part.width, part.height);
}
final String[] s = part.getgString();
final int xMarg = 15;
int yMarg = 2;
for (int j = 0; j < s.length; j++)
{
yMarg += 15;
g.drawString(s[j], part.getxPos() + xMarg, part.getyPos() + yMarg);
}
part.setBounds((int) (part.getxPos() * zoom),
(int) (part.getyPos() * zoom),
(int) (part.width * zoom),
(int) (part.height * zoom));
add(part, 0);
width = width < part.getxPos() + part.width + 20 ? part.getxPos() + part.width + 20 : width;
height = height < part.getyPos() + part.height + 20 ? part.getyPos() + part.height + 20 : height;
}
for (int i = 0; i < vPoints.size(); i += 2)
{
final int x1 = (int) ((Point) vPoints.get(i)).getX();
final int y1 = (int) ((Point) vPoints.get(i)).getY();
final int x2 = (int) ((Point) vPoints.get(i + 1)).getX();
final int y2 = (int) ((Point) vPoints.get(i + 1)).getY();
final int xm = x1 < x2 ? x2 - 20 : x2 + 20;
g.drawLine(x1, y1, xm, y1);
g.drawLine(xm, y1, xm, y2);
g.drawLine(xm, y2, x2, y2);
}
for (int i = 0; i < vDirPoints.size(); i += 2)
{
g.setColor(Color.blue);
final int x1 = (int) ((Point) vDirPoints.get(i)).getX();
final int y1 = (int) ((Point) vDirPoints.get(i)).getY() - 5;
final int x2 = (int) ((Point) vDirPoints.get(i + 1)).getX();
final int y2 = (int) ((Point) vDirPoints.get(i + 1)).getY() - 5;
final int xm = x1 < x2 ? x2 - 20 : x2 + 20;
g.drawLine(x1, y1, xm, y1);
g.drawLine(xm, y1, xm, y2);
g.drawLine(xm, y2, x2, y2);
final int xa = x1 < x2 ? x2 - 6 : x2 + 6;
final int angle = x1 < x2 ? 270 : 90;
final int arrowX[] = {xa, x2, xa};
final int arrowY[] = {y2 - 4, y2, y2 + 4};
g.fillPolygon(arrowX, arrowY, 3);
g.fillArc(x1 - 4, y1 - 3, 8, 6, angle, 180);
}
}
/**
* Sorts the panels for the process view so that those who share resources are next to another
* @param panelVector
* @return Vector
*/
public Vector sortPanels(Vector v)
{
final Vector vSorted = new Vector();
final Vector vUnsorted = new Vector();
for (int i = 0; i < v.size(); i++)
{
final ProcessPart part = (ProcessPart) v.get(i);
final Vector vRes = part.getvAllRes();
if (vRes.isEmpty())
vUnsorted.add(part);
else
{
boolean connected = false;
v.remove(i);
check : for (int j = 0; j < v.size(); j++)
{
final ProcessPart nextPart = (ProcessPart) v.get(j);
final Vector vnextRes = nextPart.getvAllRes();
for (int n = 0; n < vRes.size(); n++)
{
final ProcessPart resLink = (ProcessPart) vRes.get(n);
final String rRefRL = resLink.getElem().getID();
if (!rRefRL.equals(""))
{
for (int m = 0; m < vnextRes.size(); m++)
{
final ProcessPart nextResLink = (ProcessPart) vnextRes.get(m);
final String rRefnRL = nextResLink.getElem().getID();
if (rRefRL.equals(rRefnRL))
{
connected = true;
break check;
}
}
}
}
}
v.add(i, part);
if (connected)
vSorted.add(part);
else
vUnsorted.add(0, part);
}
}
for (int i = 0; i < vSorted.size() - 1; i ++)
{
ProcessPart partOne = (ProcessPart) vSorted.get(i);
final Vector vResOne = partOne.getvInRes();
for (int j = 1; j < vSorted.size(); j++)
{
boolean change = false;
ProcessPart partTwo = (ProcessPart) vSorted.get(j);
final Vector vResTwo = partTwo.getvOutRes();
check: for (int n = 0; n < vResOne.size(); n++)
{
final ProcessPart linkOne = (ProcessPart) vResOne.get(n);
final String rRefOne = linkOne.getElem().getID();
if (!rRefOne.equals(""))
{
for (int m = 0; m < vResTwo.size(); m++)
{
final ProcessPart linkTwo = (ProcessPart) vResTwo.get(m);
final String rRefTwo = linkTwo.getElem().getID();
if (rRefOne.equals(rRefTwo))
{
if (linkTwo.getElem().getAttribute("Usage", "", "").equals("Output")
&& linkOne.getElem().getAttribute("Usage", "", "").equals("Input"))
{
change = true;
break check;
}
}
}
}
}
if (change)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -