GroupNodeCanvas.java 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272
  1. package ui.view;
  2. import java.awt.BasicStroke;
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Font;
  6. import java.awt.Graphics;
  7. import java.awt.Graphics2D;
  8. import java.awt.RenderingHints;
  9. import java.awt.datatransfer.UnsupportedFlavorException;
  10. import java.awt.event.MouseEvent;
  11. import java.awt.event.MouseListener;
  12. import java.awt.event.MouseMotionListener;
  13. import java.awt.geom.Line2D;
  14. import java.awt.image.BufferedImage;
  15. import java.io.IOException;
  16. import java.util.ArrayList;
  17. import java.util.HashSet;
  18. import javax.swing.ImageIcon;
  19. import javax.swing.JFrame;
  20. import javax.swing.JLabel;
  21. import javax.swing.JOptionPane;
  22. import javax.swing.JScrollPane;
  23. import javax.swing.JTabbedPane;
  24. import javax.swing.SwingUtilities;
  25. import com.google.gson.JsonParseException;
  26. import classes.AbstractCanvasObject;
  27. import classes.Edge;
  28. import classes.GroupNode;
  29. import classes.HolonObject;
  30. import classes.HolonSwitch;
  31. import classes.Node;
  32. import classes.Vector2dInt;
  33. import classes.Vector2dFloat;
  34. import ui.controller.Control;
  35. import ui.controller.UpdateController;
  36. import ui.model.Consumer;
  37. import ui.model.DecoratedCable;
  38. import ui.model.DecoratedGroupNode;
  39. import ui.model.DecoratedHolonObject;
  40. import ui.model.DecoratedHolonObject.HolonObjectState;
  41. import ui.model.DecoratedSwitch;
  42. import ui.model.ExitCable;
  43. import ui.model.DecoratedSwitch.SwitchState;
  44. import ui.model.Model;
  45. import ui.model.Passiv;
  46. import ui.model.Supplier;
  47. import utility.ImageImport;
  48. /**
  49. * This Class is the Canvas. All Objects will be visualized here
  50. *
  51. * @author Gruppe14
  52. */
  53. public class GroupNodeCanvas extends AbstractCanvas implements MouseListener, MouseMotionListener {
  54. private static final long serialVersionUID = 1L;
  55. // The UpperNode
  56. public GroupNode upperNode;
  57. // Path
  58. protected String path;
  59. int code;
  60. public boolean disable = false;
  61. /**
  62. * Constructor.
  63. *
  64. * @param mod the Model
  65. * @param control the Controller
  66. * @param unitGraph
  67. */
  68. GroupNodeCanvas(Model mod, Control control, UnitGraph unitGraph, GroupNode UpperNode, String parentPath, Component parentComponent) {
  69. toolTip = false;
  70. this.controller = control;
  71. this.model = mod;
  72. this.upperNode = UpperNode;
  73. this.code = UpperNode.hashCode();
  74. this.path = parentPath + upperNode.getName();
  75. scalediv20 = model.getScale() / 20;
  76. // Cps objecte aus dem border links schieben
  77. upperNode.setLeftBorder(/*(int) (50 + scalediv20 + scalediv20 + 10)*/ 0);
  78. for (AbstractCanvasObject cps : upperNode.getNodes()) {
  79. if (cps.getPosition().getX() < model.getScaleDiv2() + upperNode.getLeftBorder() + 5) {
  80. cps.setPosition(
  81. new Vector2dInt(upperNode.getLeftBorder() + 5 + model.getScaleDiv2(), cps.getPosition().getY()));
  82. }
  83. }
  84. showedInformation[0] = true;
  85. showedInformation[1] = true;
  86. showedInformation[4] = true;
  87. popmenu.add(itemCut);
  88. popmenu.add(itemCopy);
  89. popmenu.add(itemPaste);
  90. popmenu.add(itemDelete);
  91. popmenu.add(itemAlign);
  92. popmenu.addSeparator();
  93. popmenu.add(itemGroup);
  94. popmenu.add(itemUngroup);
  95. popmenu.add(itemCreateTemplate);
  96. itemAlign.setEnabled(true);
  97. itemDelete.setEnabled(false);
  98. itemCut.setEnabled(false);
  99. itemCopy.setEnabled(false);
  100. itemPaste.setEnabled(true);
  101. itemGroup.setEnabled(false);
  102. itemUngroup.setEnabled(false);
  103. updCon = new UpdateController(model, controller);
  104. itemAlign.addActionListener(actionEvent -> {
  105. for(AbstractCanvasObject cps: model.getSelectedCpsObjects())
  106. align(cps, model.getScaleDiv2());
  107. repaint();
  108. });
  109. itemGroup.addActionListener(actionEvent -> {
  110. // calculate uppernode pos (taken from the controller)
  111. unPos = new Vector2dInt(0, 0);
  112. animCps = new ArrayList<>();
  113. for (AbstractCanvasObject cps : model.getSelectedCpsObjects()) {
  114. animCps.add(cps); // add to animation Cps ArrayList
  115. unPos = unPos.add(cps.getPosition());
  116. }
  117. unPos = unPos.divide(animCps.size());
  118. // save old Position
  119. savePos = new ArrayList<>();
  120. for (int i = 0; i < animCps.size(); i++) {
  121. savePos.add(animCps.get(i).getPosition().clone());
  122. }
  123. animT = new javax.swing.Timer(animDelay, actionEvent1 -> {
  124. if (animDuration - animDelay > 0 && animCps.size() > 1) {
  125. for (AbstractCanvasObject currentAnimCps : animCps) {
  126. Vector2dInt pos = currentAnimCps.getPosition();
  127. Vector2dInt difference = pos.subtract(unPos);
  128. Vector2dInt result = pos.subtract(difference.divide(animSteps));
  129. pos.set(result);
  130. }
  131. repaint();
  132. animDuration -= animDelay;
  133. animSteps--;
  134. } else {
  135. animDuration = ANIMTIME;
  136. animSteps = animDuration / animDelay;
  137. animT.stop();
  138. for (int i = 0; i < animCps.size(); i++) {
  139. animCps.get(i).getPosition().set(savePos.get(i));
  140. }
  141. controller.addUpperNode("GroupNode", upperNode, model.getSelectedCpsObjects());
  142. controller.calculateStateAndVisualForCurrentTimeStep();
  143. repaint();
  144. }
  145. });
  146. animT.start();
  147. });
  148. itemUngroup.addActionListener(actionEvent -> {
  149. // save old Position
  150. closeUpperNodeTab(tempCps.getId());
  151. savePos = new ArrayList<>();
  152. animCps = ((GroupNode) tempCps).getNodes();
  153. controller.ungroupGroupNode((GroupNode) tempCps, upperNode);
  154. for (int i = 0; i < animCps.size(); i++) {
  155. savePos.add(animCps.get(i).getPosition().clone());
  156. }
  157. for (AbstractCanvasObject cps : animCps) {
  158. cps.setPosition(tempCps.getPosition().clone());
  159. }
  160. animT = new javax.swing.Timer(animDelay, actionEvent1 -> {
  161. if (animDuration - animDelay >= 0) {
  162. for (int i = 0; i < animCps.size(); i++) {
  163. Vector2dInt pos = animCps.get(i).getPosition();
  164. Vector2dInt difference = pos.subtract(savePos.get(i));
  165. Vector2dInt result = pos.subtract(difference.divide(animSteps));
  166. pos.set(result);
  167. }
  168. repaint();
  169. animDuration -= animDelay;
  170. animSteps--;
  171. } else {
  172. animDuration = ANIMTIME;
  173. animSteps = animDuration / animDelay;
  174. animT.stop();
  175. for (int i = 0; i < animCps.size(); i++) {
  176. animCps.get(i).getPosition().set(savePos.get(i));
  177. }
  178. controller.calculateStateAndVisualForCurrentTimeStep();
  179. repaint();
  180. }
  181. });
  182. animT.start();
  183. });
  184. itemDelete.addActionListener(actionEvent -> {
  185. // Remove the selected Object objects
  186. for (AbstractCanvasObject cps : model.getSelectedCpsObjects()) {
  187. if (upperNode.getNodes().contains(cps)) {
  188. controller.delObjUpperNode(cps, upperNode);
  189. // Remove UpperNodeTab if UpperNode deleted
  190. if (cps instanceof GroupNode) {
  191. JTabbedPane tabbedPane = (JTabbedPane) getParent().getParent().getParent().getParent();
  192. // Look if the uppernode is open in a Tab
  193. for (int i = 4; i < tabbedPane.getTabCount(); i++) {
  194. if (tabbedPane.getComponentAt(i) != null &&
  195. ((GroupNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
  196. .getComponent(0)).upperNode.getId() == cps.getId()) {
  197. ((ButtonTabComponent) tabbedPane.getTabComponentAt(i)).removeTabs();
  198. break;
  199. }
  200. }
  201. }
  202. }
  203. }
  204. toolTip = false;
  205. model.getSelectedCpsObjects().clear();
  206. tempCps = null;
  207. repaint();
  208. });
  209. itemCut.addActionListener(actionEvent -> {
  210. controller.cut(upperNode);
  211. itemPaste.setEnabled(true);
  212. repaint();
  213. });
  214. itemCopy.addActionListener(actionEvent -> {
  215. if(tempCps instanceof GroupNode)
  216. controller.getObjectsInDepth();
  217. controller.copy(upperNode);
  218. itemPaste.setEnabled(true);
  219. repaint();
  220. });
  221. itemPaste.addActionListener(actionEvent -> {
  222. try {
  223. controller.paste(upperNode, mousePosition);
  224. } catch (JsonParseException | UnsupportedFlavorException | IOException e1) {
  225. JLabel message = new JLabel("The Clipboard information cannot be pastet into Application.");
  226. JOptionPane.showMessageDialog(null, message, "", JOptionPane.ERROR_MESSAGE);
  227. }
  228. repaint();
  229. });
  230. /*
  231. * create Template
  232. */
  233. itemCreateTemplate.addActionListener(actionEvent -> {
  234. controller.createTemplate((HolonObject)tempCps, (JFrame)SwingUtilities.getRoot(this));
  235. });
  236. this.addMouseListener(this);
  237. this.addMouseMotionListener(this);
  238. }
  239. /**
  240. * Paints all Components on the Canvas.
  241. *
  242. * @param g
  243. * Graphics
  244. */
  245. private Color getStateColor(HolonObjectState state) {
  246. switch(state) {
  247. case NOT_SUPPLIED:
  248. return new Color(230, 120, 100);
  249. case NO_ENERGY:
  250. return Color.white;
  251. case OVER_SUPPLIED:
  252. return new Color(166, 78, 229);
  253. case PARTIALLY_SUPPLIED:
  254. return Color.yellow;
  255. case PRODUCER:
  256. return Color.lightGray;
  257. case SUPPLIED:
  258. return new Color(13, 175, 28);
  259. default:
  260. return Color.BLACK;
  261. }
  262. }
  263. private void paintCanvasObject(Graphics2D g, DecoratedHolonObject decoratedHolonObject){
  264. Vector2dInt pos = decoratedHolonObject.getModel().getPosition();
  265. Color statecolor = getStateColor(decoratedHolonObject.getState());
  266. g.setColor(statecolor);
  267. g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() - controller.getScaleDiv2(), controller.getScale(), controller.getScale());
  268. drawCanvasObject(g, decoratedHolonObject.getModel().getImage(), pos);
  269. }
  270. private void drawCanvasObjectString(Graphics2D g, Vector2dInt posOfCanvasObject, float energy) {
  271. g.setColor(Color.BLACK);
  272. g.setFont(new Font("TimesNewRoman", Font.PLAIN, (int) (controller.getScale() / 4f) ));
  273. g.drawString((energy > 0)? "+" + Float.toString(energy): Float.toString(energy), posOfCanvasObject.getX() - controller.getScaleDiv2(), posOfCanvasObject.getY() - controller.getScaleDiv2() - 1);
  274. }
  275. private void paintConsumer(Graphics2D g, Consumer con){
  276. paintCanvasObject(g, con);
  277. paintSupplyBar(g,con.getSupplyBarPercentage(), getStateColor(con.getState()), con.getModel().getPosition());
  278. drawCanvasObjectString(g, con.getModel().getPosition(), -con.getEnergyNeededFromNetwork());
  279. }
  280. private void paintSupplier(Graphics2D g, Supplier sup){
  281. paintCanvasObject(g, sup);
  282. drawCanvasObjectString(g, sup.getModel().getPosition(), sup.getEnergyToSupplyNetwork());
  283. }
  284. private void drawCanvasObject(Graphics2D g, String Image, Vector2dInt pos) {
  285. g.drawImage(ImageImport.loadImage(Image, controller.getScale(), controller.getScale()) ,
  286. pos.getX() - controller.getScaleDiv2(),
  287. pos.getY() - controller.getScaleDiv2(),
  288. controller.getScale(), controller.getScale() , null);
  289. }
  290. private void paintCable(Graphics2D g, DecoratedCable cable, boolean isSelected)
  291. {
  292. Vector2dInt start = cable.getModel().getA().getPosition();
  293. Vector2dInt end = cable.getModel().getB().getPosition();
  294. float currentEnergy = cable.getFlowEnergy();
  295. float capacity = cable.getModel().getCapacity();
  296. boolean unlimited = cable.getModel().isUnlimitedCapacity();
  297. switch(cable.getState()) {
  298. case Burned:
  299. g.setColor(Color.RED);
  300. g.setStroke(new BasicStroke(2));
  301. break;
  302. case Working:
  303. g.setColor(new Color(13, 175, 28));
  304. g.setStroke(new BasicStroke(unlimited?2f:(currentEnergy / capacity * 2f) + 1));
  305. break;
  306. }
  307. if(isSelected){
  308. g.setColor(Color.lightGray);
  309. }
  310. g.drawLine(start.getX(), start.getY(), end.getX(), end.getY());
  311. Vector2dInt middle = new Vector2dInt((start.getX() + end.getX()) / 2, (start.getY() + end.getY()) / 2);
  312. g.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) ));
  313. g.drawString(currentEnergy + "/" + (unlimited?"\u221E":capacity) , middle.getX(), middle.getY());
  314. }
  315. private void paintSwitch(Graphics2D g, DecoratedSwitch dSwitch)
  316. {
  317. drawCanvasObject(g, dSwitch.getState() == SwitchState.Open ? HolonSwitch.getSwitchOpenImage(): HolonSwitch.getSwitchClosedImage() , dSwitch.getModel().getPosition());
  318. }
  319. private void paintGroupNode(Graphics2D g, DecoratedGroupNode dGroupNode) {
  320. Vector2dInt pos = dGroupNode.getModel().getPosition();
  321. g.setColor(Color.lightGray);
  322. g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() - controller.getScaleDiv2(), controller.getScale(), controller.getScale());
  323. drawCanvasObject(g, "/Images/upper_node.png" , pos);
  324. paintGroupNodeBar(g, dGroupNode, pos);
  325. }
  326. private void paintGroupNodeBar(Graphics2D g, DecoratedGroupNode dGroupNode , Vector2dInt pos) {
  327. // +1, -2, -1 little Adjustment for pixel perfect alignment
  328. int barWidth = (int) (controller.getScale());
  329. int barHeight = (int) (controller.getScale() / 5);
  330. g.setColor(Color.WHITE);
  331. g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) barWidth, barHeight);
  332. float[] percentages = getGroupNodeBarPercentages(dGroupNode);
  333. Color[] colors = new Color[6];
  334. colors[0] = getStateColor(HolonObjectState.PRODUCER);
  335. colors[1] = getStateColor(HolonObjectState.NOT_SUPPLIED);
  336. colors[2] = getStateColor(HolonObjectState.PARTIALLY_SUPPLIED);
  337. colors[3] = getStateColor(HolonObjectState.SUPPLIED);
  338. colors[4] = getStateColor(HolonObjectState.OVER_SUPPLIED);
  339. colors[5] = getStateColor(HolonObjectState.NO_ENERGY);
  340. for(int i = 5; i>=0; i--) {
  341. g.setColor(colors[i]);
  342. g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) (barWidth * percentages[i] - 1), barHeight);
  343. }
  344. // g.setColor(color);
  345. // g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) (barWidth * (percentage < 1 ? percentage : 1.0f) - 1), barHeight);
  346. g.setColor(Color.BLACK);
  347. g.setStroke(new BasicStroke(1));
  348. g.drawRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, barWidth - 1 , barHeight);
  349. }
  350. /**
  351. * HardCoded Stuff dont try at Home ;)
  352. * @param dGroupNode
  353. * @return
  354. */
  355. public float[] getGroupNodeBarPercentages(DecoratedGroupNode dGroupNode) {
  356. int[] amountOfObjects = new int[6];
  357. amountOfObjects[0] = dGroupNode.getAmountOfSupplier();
  358. amountOfObjects[1] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.NOT_SUPPLIED);
  359. amountOfObjects[2] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.PARTIALLY_SUPPLIED);
  360. amountOfObjects[3] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.SUPPLIED);
  361. amountOfObjects[4] = dGroupNode.getAmountOfConsumerWithState(HolonObjectState.OVER_SUPPLIED);
  362. amountOfObjects[5] = dGroupNode.getAmountOfPassiv();
  363. int countHolonObjects = amountOfObjects[0] + amountOfObjects[1] + amountOfObjects[2] + amountOfObjects[3] + amountOfObjects[4] + amountOfObjects[5];
  364. float[] percentages = new float[6];
  365. int count = 0;
  366. for(int i = 0; i < 6; i++) {
  367. count += amountOfObjects[i];
  368. percentages[i] = (float)count / (float)countHolonObjects;
  369. }
  370. return percentages;
  371. }
  372. private void paintExitCable(Graphics2D g, ExitCable eCable) {
  373. if(eCable.getStart() == null || eCable.getFinish() == null) {
  374. System.out.println("Null wrong exitcable");
  375. System.out.println(" wrongCable: " + " start:" +eCable.getStart() + " end:" +eCable.getFinish() + " state:" + eCable.getState());
  376. return;
  377. }
  378. Vector2dInt start = eCable.getStart().getPosition();
  379. Vector2dInt end = eCable.getFinish().getPosition();
  380. float currentEnergy = eCable.getCable().getFlowEnergy();
  381. float capacity = eCable.getCable().getModel().getCapacity();
  382. boolean unlimited = eCable.getCable().getModel().isUnlimitedCapacity();
  383. switch(eCable.getCable().getState()) {
  384. case Burned:
  385. g.setColor(Color.RED);
  386. g.setStroke(new BasicStroke(2));
  387. break;
  388. case Working:
  389. g.setColor(new Color(13, 175, 28));
  390. g.setStroke(new BasicStroke(unlimited?2f:(currentEnergy / capacity * 2f) + 1));
  391. break;
  392. }
  393. switch(eCable.getState()) {
  394. case DOWN:
  395. case DOWNDOWN:
  396. g.drawLine(start.getX(), start.getY(), end.getX(), end.getY());
  397. Vector2dInt middle = new Vector2dInt((start.getX() + end.getX()) / 2, (start.getY() + end.getY()) / 2);
  398. g.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) ));
  399. g.drawString(currentEnergy + "/" + (unlimited?"\u221E":capacity) , middle.getX(), middle.getY());
  400. break;
  401. case DOWNUP:
  402. case UP:
  403. Vector2dFloat vStart = new Vector2dFloat(start.getX(), start.getY());
  404. Vector2dFloat vEnd = new Vector2dFloat(end.getX(), end.getY());
  405. float stretchFactor = 4 * model.getScale();
  406. stretchFactor = (stretchFactor > vStart.getDistance(vEnd))? vStart.getDistance(vEnd) : stretchFactor;
  407. Vector2dFloat vPosition = vStart.add((vEnd.subtract(vStart)).normalize().multiply(stretchFactor));
  408. Vector2dInt result = new Vector2dInt(Math.round(vPosition.getX()),Math.round(vPosition.getY()));
  409. g.drawLine(start.getX(), start.getY(), result.getX(), result.getY());
  410. Vector2dInt middle1 = new Vector2dInt((start.getX() +result.getX()) / 2, (start.getY() + +result.getY()) / 2);
  411. g.setFont(new Font("TimesRoman", Font.PLAIN, Math.max((int) (controller.getScale() / 3.5f), 10) ));
  412. g.drawString(currentEnergy + "/" + (unlimited?"\u221E":capacity) , middle1.getX(), middle1.getY());
  413. drawCanvasObject(g, "/Images/arrowUp.png" , result);
  414. break;
  415. default:
  416. System.out.println("Error");
  417. break;
  418. }
  419. }
  420. private void paintSupplyBar(Graphics2D g, float percentage, Color color, Vector2dInt pos) {
  421. // +1, -2, -1 little Adjustment for pixel perfect alignment
  422. int barWidth = (int) (controller.getScale());
  423. int barHeight = (int) (controller.getScale() / 5);
  424. g.setColor(Color.WHITE);
  425. g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) barWidth, barHeight);
  426. g.setColor(color);
  427. g.fillRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, (int) (barWidth * (percentage < 1 ? percentage : 1.0f) - 1), barHeight);
  428. g.setColor(Color.BLACK);
  429. g.setStroke(new BasicStroke(1));
  430. g.drawRect(pos.getX() - controller.getScaleDiv2(), pos.getY() + controller.getScaleDiv2() - 1, barWidth - 1 , barHeight);
  431. g.setFont(new Font("TimesNewRoman", Font.PLAIN, (int) (barHeight * 1.5) - 2));
  432. String percentageString = (Math.round((percentage * 100))) + "%";
  433. int stringWidth = (int) g.getFontMetrics().getStringBounds(percentageString, g).getWidth();
  434. if(percentage > 1.0f) g.setColor(Color.WHITE); //Just to see better on purple
  435. g.drawString(percentageString, pos.getX() + 1 - stringWidth / 2, pos.getY() + controller.getScaleDiv2() - 1+ barHeight);
  436. }
  437. //old code
  438. void drawMarker(Graphics2D g) {
  439. Color transparentGrey = new Color(128, 174, 247, 40);
  440. if (sx > x && sy > y) {
  441. g.drawRect(x, y, sx - x, sy - y);
  442. g.setColor(transparentGrey);
  443. g.fillRect(x, y, sx - x, sy - y);
  444. } else if (sx < x && sy < y) {
  445. g.drawRect(sx, sy, x - sx, y - sy);
  446. g.setColor(transparentGrey);
  447. g.fillRect(sx, sy, x - sx, y - sy);
  448. } else if (sx >= x) {
  449. g.drawRect(x, sy, sx - x, y - sy);
  450. g.setColor(transparentGrey);
  451. g.fillRect(x, sy, sx - x, y - sy);
  452. } else if (sy >= y) {
  453. g.drawRect(sx, y, x - sx, sy - y);
  454. g.setColor(transparentGrey);
  455. g.fillRect(sx, y, x - sx, sy - y);
  456. }
  457. }
  458. public void paintComponent(Graphics g) {
  459. super.paintComponent(g);
  460. Graphics2D g2d = (Graphics2D) g;
  461. g2d.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING,
  462. RenderingHints.VALUE_ANTIALIAS_ON));
  463. //-->Old code
  464. if (drawEdge) {
  465. g2d.setColor(Color.BLACK);
  466. g2d.setStroke(new BasicStroke(1));
  467. g2d.drawLine(tempCps.getPosition().getX(), tempCps.getPosition().getY(), x, y);
  468. }
  469. //<--
  470. //SelectedCable
  471. HashSet<Edge> selectedEdges = new HashSet<Edge>();
  472. for(AbstractCanvasObject aCps: model.getSelectedCpsObjects()) {
  473. for(Edge edge: aCps.getConnections()) {
  474. selectedEdges.add(edge);
  475. }
  476. }
  477. if(model.getSelectedEdge() != null) selectedEdges.add(model.getSelectedEdge());
  478. DecoratedGroupNode actualGroupNode = controller.getSimManager().getActualVisualRepresentationalState().getCreatedGroupNodes().get(upperNode);
  479. //VisualState Representation:
  480. for(ExitCable cable : actualGroupNode.getExitCableList()) {
  481. paintExitCable(g2d, cable);
  482. }
  483. for(DecoratedCable cable : actualGroupNode.getInternCableList()) {
  484. paintCable(g2d, cable, selectedEdges.contains(cable.getModel()));
  485. }
  486. for(DecoratedGroupNode dGroupNode : actualGroupNode.getGroupNodeList()) {
  487. paintGroupNode(g2d, dGroupNode);
  488. }
  489. for(Consumer con: actualGroupNode.getConsumerList()) {
  490. paintConsumer(g2d, con);
  491. }
  492. for(Supplier sup: actualGroupNode.getSupplierList()) {
  493. paintSupplier(g2d, sup);
  494. }
  495. for(Passiv pas: actualGroupNode.getPassivList()) {
  496. paintCanvasObject(g2d, pas);
  497. }
  498. for(DecoratedSwitch dSwitch : actualGroupNode.getSwitchList()) {
  499. paintSwitch(g2d, dSwitch);
  500. }
  501. for(Node node : actualGroupNode.getNodeList()) {
  502. drawCanvasObject(g2d, "/Images/node.png" , node.getPosition());
  503. }
  504. //-->oldCode
  505. if (doMark) {
  506. g2d.setColor(Color.BLACK);
  507. g2d.setStroke(new BasicStroke(0));
  508. drawMarker(g2d);
  509. }
  510. //Test Selection
  511. //Objects:
  512. g2d.setColor(Color.BLUE);
  513. g2d.setStroke(new BasicStroke(1));
  514. Color transparentGrey = new Color(128, 174, 247, 40);
  515. for(AbstractCanvasObject aCps: model.getSelectedCpsObjects()) {
  516. if(aCps instanceof Node) {
  517. Vector2dInt pos = aCps.getPosition();
  518. g2d.setColor(transparentGrey);
  519. g2d.fillOval(pos.getX() - (int) (controller.getScaleDiv2()), pos.getY() - (int) (controller.getScaleDiv2()), controller.getScale(), controller.getScale());
  520. g2d.setColor(Color.LIGHT_GRAY);
  521. g2d.setStroke(new BasicStroke(2));
  522. g2d.drawOval(pos.getX() - (int) (controller.getScaleDiv2()), pos.getY() - (int) (controller.getScaleDiv2()), controller.getScale(), controller.getScale());
  523. }
  524. else {
  525. Vector2dInt pos = aCps.getPosition();
  526. g2d.setColor(transparentGrey);
  527. g2d.fillRect(pos.getX() - (int) (controller.getScaleDiv2()* 1.5f), pos.getY() - (int) (controller.getScaleDiv2()* 1.5f), (int) (controller.getScale()* 1.5f) , (int) (controller.getScale()* 1.5f));
  528. g2d.setColor(Color.LIGHT_GRAY);
  529. g2d.setStroke(new BasicStroke(2));
  530. g2d.drawRect(pos.getX() - (int) (controller.getScaleDiv2()* 1.5f), pos.getY() - (int) (controller.getScaleDiv2()* 1.5f), (int) (controller.getScale()* 1.5f) , (int) (controller.getScale()* 1.5f));
  531. }
  532. }
  533. //maybeReplace:
  534. if(mayBeReplaced != null){
  535. g2d.setColor(Color.RED);
  536. Vector2dInt pos = mayBeReplaced.getPosition();
  537. g.drawImage(ImageImport.loadImage("/Images/replace.png") ,
  538. pos.getX() + controller.getScaleDiv2(),
  539. pos.getY() - controller.getScale(),
  540. controller.getScaleDiv2(), controller.getScaleDiv2(), null);
  541. }
  542. //<-- OldCode
  543. }
  544. @Override
  545. public void mouseClicked(MouseEvent e) {
  546. if(!disable){
  547. triggerUpdateController();
  548. stopEditing();
  549. }
  550. }
  551. @Override
  552. public void mouseEntered(MouseEvent e) {
  553. }
  554. @Override
  555. public void mouseExited(MouseEvent e) {
  556. }
  557. @Override
  558. public void mousePressed(MouseEvent e) {
  559. if(!disable){
  560. stopEditing();
  561. tempCps = null;
  562. dataSelected = null;
  563. edgeHighlight = null;
  564. controller.setSelecteEdge(null);
  565. controller.setSelectedObjectID(-1);
  566. // Object Selection
  567. // Erase old data in the PropertyTable
  568. if (model.getPropertyTable().getRowCount() > 0) {
  569. for (int i = model.getPropertyTable().getRowCount() - 1; i > -1; i--) {
  570. model.getPropertyTable().removeRow(i);
  571. }
  572. }
  573. if (e.getX() > upperNode.getLeftBorder()) {
  574. for (AbstractCanvasObject cps : upperNode.getNodes()) {
  575. cx = cps.getPosition().getX() - model.getScaleDiv2();
  576. cy = cps.getPosition().getY() - model.getScaleDiv2();
  577. if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy) {
  578. tempCps = cps;
  579. dragging = true;
  580. if (e.isControlDown() && tempCps != null) {
  581. if (model.getSelectedCpsObjects().contains(tempCps)) {
  582. controller.deleteSelectedObject(tempCps);
  583. } else {
  584. controller.addSelectedObject(tempCps);
  585. if(tempCps instanceof GroupNode)
  586. controller.getObjectsInDepth();
  587. }
  588. }
  589. // If drawing an Edge (CTRL down)
  590. if (tempCps.getClass() == HolonObject.class) {
  591. HolonObject tempObj = ((HolonObject) tempCps);
  592. dataSelected = tempObj.getElements();
  593. }
  594. if (e.isShiftDown()) {
  595. drawEdge = true;
  596. dragging = false;
  597. }
  598. break;
  599. }
  600. }
  601. } else {
  602. // look for objects connected to uppernode
  603. int count = 0;
  604. for (Edge ed : upperNode.getConnections()) {
  605. AbstractCanvasObject cps;
  606. if (ed.getA().equals(this.upperNode)) {
  607. cps = ed.getB();
  608. } else {
  609. cps = ed.getA();
  610. }
  611. if (x - controller.getScale() <= ((upperNode.getLeftBorder() >> 1) - model.getScaleDiv2())
  612. && y - controller.getScale() <= (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count)
  613. && x >= (upperNode.getLeftBorder() >> 1) - model.getScaleDiv2()
  614. && y >= (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count)) {
  615. tempCps = cps;
  616. // If drawing an Edge (CTRL down)
  617. if (tempCps.getClass() == HolonObject.class) {
  618. HolonObject tempObj = ((HolonObject) tempCps);
  619. dataSelected = tempObj.getElements();
  620. }
  621. if (e.isShiftDown()) {
  622. drawEdge = true;
  623. }
  624. }
  625. count++;
  626. }
  627. }
  628. // Selection of CpsObject
  629. // model.setSelectedCpsObject(tempCps);
  630. // Edge Selection
  631. if (e.getButton() == MouseEvent.BUTTON1) {
  632. if (tempCps == null) {
  633. edgeHighlight = mousePositionOnEdge(x, y);
  634. controller.setSelecteEdge(edgeHighlight);
  635. controller.setSelectedObjectID(0);
  636. if (!e.isControlDown() && e.getButton() != MouseEvent.BUTTON3) {
  637. model.getSelectedCpsObjects().clear();
  638. }
  639. updCon.deleteRows(model.getMultiTable());
  640. updCon.deleteRows(model.getSingleTable());
  641. }
  642. if (edgeHighlight == null && tempCps == null) {
  643. sx = e.getX();
  644. sy = e.getY();
  645. doMark = true;
  646. }
  647. // System.out.println("Selected Objects");
  648. // for (AbstractCpsObject temp : model.getSelectedCpsObjects()) {
  649. // System.out.println(temp.getName() + " " + temp.getID());
  650. // }
  651. repaint();
  652. }
  653. }
  654. }
  655. @Override
  656. public void mouseReleased(MouseEvent e) {
  657. if(!disable){
  658. x = e.getX();
  659. y = e.getY();
  660. dragging = false;
  661. if (model.getSelectedCpsObjects().size() > 1) {
  662. model.getTableHolonElement().setModel(model.getMultiTable());
  663. } else if (model.getSelectedCpsObjects().size() == 1) {
  664. model.getTableHolonElement().setModel(model.getSingleTable());
  665. }
  666. if (drawEdge) {
  667. drawEdge = false;
  668. drawDeleteEdge();
  669. }
  670. if (dragged) {
  671. try {
  672. /**
  673. * Save State before performing NodePlacement, replacement e.g.
  674. */
  675. controller.autoSave();
  676. } catch (IOException ex) {
  677. ex.printStackTrace();
  678. }
  679. /**
  680. * check if tempCps could replace an Object on the UpperNodeanvas
  681. */
  682. if(model.getSelectedCpsObjects().size() == 1 && checkForReplacement(upperNode.getNodes(), tempCps, tempCps.getPosition().getX(), tempCps.getPosition().getY())){
  683. /**
  684. * if UpperNode would be replaced, close its tabs
  685. */
  686. if(mayBeReplaced instanceof GroupNode)
  687. closeUpperNodeTab(mayBeReplaced.getId());
  688. /**
  689. * replace on canvas
  690. */
  691. controller.replaceObjUpperNode(mayBeReplaced, tempCps, upperNode);
  692. mayBeReplaced=null;
  693. }
  694. }
  695. if (!e.isControlDown() && !dragged && tempCps != null && MouseEvent.BUTTON3 != e.getButton()) {
  696. model.getSelectedCpsObjects().clear();
  697. controller.addSelectedObject(tempCps);
  698. if(tempCps instanceof GroupNode)
  699. controller.getObjectsInDepth();
  700. }
  701. dragged = false;
  702. // Rightclick List
  703. setRightClickMenu(e);
  704. markObjects();
  705. if (doubleClick() && tempCps != null && tempCps instanceof HolonSwitch) {
  706. ((HolonSwitch) tempCps).switchState();
  707. }
  708. controller.calculateStateAndVisualForTimeStep(model.getCurIteration());
  709. triggerUpdateController();
  710. repaint();
  711. }
  712. }
  713. @Override
  714. public void mouseDragged(MouseEvent e) {
  715. if(!disable){
  716. // If Edge is drawn
  717. x = e.getX();
  718. y = e.getY();
  719. if (!model.getSelectedCpsObjects().contains(tempCps) && !doMark) {
  720. model.getSelectedCpsObjects().clear();
  721. if (tempCps != null) {
  722. controller.addSelectedObject(tempCps);
  723. }
  724. }
  725. if (dragging) {
  726. try {
  727. // tempCps in the upperNode? else its a connected Object from
  728. // outside
  729. if (upperNode.getNodes().contains(tempCps)) {
  730. dragged = true;
  731. float xDist, yDist; // Distance
  732. x = e.getX();
  733. y = e.getY();
  734. // Make sure its in bounds
  735. if (e.getX() < controller.getScaleDiv2() + upperNode.getLeftBorder() + 5)
  736. x = controller.getScaleDiv2() + upperNode.getLeftBorder() + 5;
  737. else if (e.getX() > this.getWidth() - controller.getScaleDiv2())
  738. x = this.getWidth() - controller.getScaleDiv2();
  739. if (e.getY() < controller.getScaleDiv2())
  740. y = controller.getScaleDiv2();
  741. else if (e.getY() > this.getHeight() - controller.getScaleDiv2())
  742. y = this.getHeight() - controller.getScaleDiv2();
  743. // Distance
  744. xDist = x - tempCps.getPosition().getX();
  745. yDist = y - tempCps.getPosition().getY();
  746. tempCps.setPosition(x, y); // Drag Position
  747. // TipText Position and name
  748. toolTip = true;
  749. toolTipText = tempCps.getName() + ", " + tempCps.getId();
  750. toolTipPos.setX(tempCps.getPosition().getX() - model.getScaleDiv2());
  751. toolTipPos.setY(tempCps.getPosition().getY() - model.getScaleDiv2());
  752. // All Selected Objects
  753. for (AbstractCanvasObject cps : model.getSelectedCpsObjects()) {
  754. if (cps != tempCps) {
  755. x = (int) (cps.getPosition().getX() + xDist);
  756. y = (int) (cps.getPosition().getY() + yDist);
  757. // Make sure its in bounds
  758. if (x < upperNode.getLeftBorder() + 5 + controller.getScaleDiv2())
  759. x = controller.getScaleDiv2() + upperNode.getLeftBorder() + 5;
  760. else if (x > this.getWidth() - controller.getScaleDiv2())
  761. x = this.getWidth() - controller.getScaleDiv2();
  762. if (y <= controller.getScaleDiv2())
  763. y = controller.getScaleDiv2();
  764. else if (y > this.getHeight() - controller.getScaleDiv2())
  765. y = this.getHeight() - controller.getScaleDiv2();
  766. cps.setPosition(x, y);
  767. }
  768. }
  769. }
  770. /**
  771. * check if something would be replaced
  772. */
  773. if(model.getSelectedCpsObjects().size()==1)
  774. checkForReplacement(upperNode.getNodes(), tempCps, x, y);
  775. repaint();
  776. } catch (Exception eex) {
  777. }
  778. }
  779. // Mark Objects
  780. if (doMark) {
  781. tempSelected.clear();
  782. for (AbstractCanvasObject cps : upperNode.getNodes()) {
  783. int x1 = sx, x2 = x, y1 = sy, y2 = y;
  784. if (sx >= x) {
  785. x1 = x;
  786. x2 = sx;
  787. }
  788. if (sy >= y) {
  789. y1 = y;
  790. y2 = sy;
  791. }
  792. if (x1 <= cps.getPosition().getX() + model.getScaleDiv2() && y1 <= cps.getPosition().getY() + model.getScaleDiv2()
  793. && x2 >= cps.getPosition().getX() && y2 >= cps.getPosition().getY()) {
  794. tempSelected.add(cps);
  795. }
  796. }
  797. int count = 0;
  798. for (Edge ed : upperNode.getConnections()) {
  799. AbstractCanvasObject cps;
  800. if (ed.getA().equals(upperNode)) {
  801. cps = ed.getB();
  802. } else {
  803. cps = ed.getA();
  804. }
  805. int x1 = sx, x2 = x, y1 = sy, y2 = y;
  806. if (sx >= x) {
  807. x1 = x;
  808. x2 = sx;
  809. }
  810. if (sy >= y) {
  811. y1 = y;
  812. y2 = sy;
  813. }
  814. if (x1 <= upperNode.getLeftBorder() >> 1
  815. && y1 <= (int) (5 + (model.getScale() + scalediv20 + 10) * count) + model.getScaleDiv2()
  816. && x2 >= upperNode.getLeftBorder() >> 1
  817. && y2 >= (int) (5 + (model.getScale() + scalediv20 + 10) * count)) {
  818. tempSelected.add(cps);
  819. }
  820. count++;
  821. }
  822. }
  823. repaint();
  824. }
  825. }
  826. @Override
  827. public void mouseMoved(MouseEvent e) {
  828. {
  829. x = e.getX();
  830. y = e.getY();
  831. // Everything for the tooltip :)
  832. boolean on = false;
  833. for (AbstractCanvasObject cps : upperNode.getNodes()) {
  834. cx = cps.getPosition().getX() - controller.getScaleDiv2();
  835. cy = cps.getPosition().getY() - controller.getScaleDiv2();
  836. on = setToolTipInfoAndPosition(on, cps);
  837. }
  838. int count = 0;
  839. for (Edge ed : upperNode.getConnections()) {
  840. AbstractCanvasObject cps;
  841. if (ed.getA().equals(this.upperNode)) {
  842. cps = ed.getB();
  843. } else {
  844. cps = ed.getA();
  845. }
  846. cx = upperNode.getLeftBorder() >> 1;
  847. cy = (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count);
  848. if (x - 50 <= cx && y - 50 <= cy && x >= cx && y >= cy) {
  849. on = true;
  850. toolTipPos.setX(cx - 25);
  851. toolTipPos.setY(cy + 50);
  852. toolTipText = cps.getName() + ", " + cps.getId();
  853. }
  854. count++;
  855. }
  856. toolTip = on;
  857. repaint();
  858. }
  859. }
  860. /**
  861. * Draws or Deletes an Edge.
  862. */
  863. void drawDeleteEdge() {
  864. boolean node = true; // new node?
  865. boolean newEdge = true;
  866. boolean onEdge = true;
  867. boolean deleteNode = false;
  868. boolean outsideCon = !upperNode.getNodes().contains(tempCps); // Connection to the outside
  869. boolean found = false; // dont search for outside connetion if inside
  870. // connection is found
  871. Edge e = null;
  872. for (AbstractCanvasObject cps : upperNode.getNodes()) {
  873. cx = cps.getPosition().getX() - controller.getScaleDiv2();
  874. cy = cps.getPosition().getY() - controller.getScaleDiv2();
  875. if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy
  876. && cps != tempCps) {
  877. found = true;
  878. node = false;
  879. onEdge = false;
  880. for (Edge p : tempCps.getConnections()) {
  881. if ((p.getA() == tempCps && p.getB() == cps) || (p.getB() == tempCps && p.getA() == cps)) {
  882. newEdge = false;
  883. e = p;
  884. }
  885. }
  886. if (!newEdge) {
  887. if (outsideCon) {
  888. } else {
  889. controller.removeEdgesOnCanvas(e);
  890. }
  891. // Node ohne Edge?
  892. if (e.getA().getClass() == Node.class && e.getA().getConnections().isEmpty()) {
  893. tempCps = e.getA();
  894. deleteNode = true;
  895. }
  896. if (e.getB().getClass() == Node.class && e.getB().getConnections().isEmpty()) {
  897. deleteNode = true;
  898. }
  899. } else {
  900. if(!(cps instanceof GroupNode || tempCps instanceof GroupNode)) {
  901. e = new Edge(cps, tempCps, model.getMaxCapacity());
  902. controller.addEdgeOnCanvas(e);
  903. }else if (cps instanceof GroupNode && !(tempCps instanceof GroupNode)){
  904. GroupNode thisUpperNode = (GroupNode)cps;
  905. Object[] possibilities = thisUpperNode.getNodes().stream().map(aCps -> new ACpsHandle(aCps)).filter(aCpsHandle -> !(aCpsHandle.object instanceof GroupNode)).toArray();
  906. if(possibilities.length != 0) {
  907. ACpsHandle selected = (ACpsHandle) JOptionPane.showInputDialog(this, "Select a inside Object:", "Connection To?", JOptionPane.OK_OPTION,new ImageIcon(new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)) , possibilities, "");
  908. if(selected != null) {
  909. e = new Edge(selected.object, tempCps, model.getMaxCapacity());
  910. controller.addEdgeOnCanvas(e);
  911. }
  912. }else {
  913. Node n = new Node("Node");
  914. n.setPosition(x, y);
  915. controller.addObjUpperNode(n, thisUpperNode);
  916. e = new Edge(n, tempCps, model.getMaxCapacity());
  917. controller.addEdgeOnCanvas(e);
  918. }
  919. }
  920. }
  921. }
  922. }
  923. if (!found && !outsideCon) {
  924. int count = 0;
  925. for (Edge ed : upperNode.getConnections()) {
  926. AbstractCanvasObject cps;
  927. if (ed.getA().equals(upperNode)) {
  928. cps = ed.getB();
  929. } else {
  930. cps = ed.getA();
  931. }
  932. cx = upperNode.getLeftBorder() >> 1;
  933. cy = (int) (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count);
  934. if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy
  935. && cps != tempCps) {
  936. outsideCon = true;
  937. node = false;
  938. onEdge = false;
  939. for (Edge p : tempCps.getConnections()) {
  940. if ((p.getA() == tempCps && p.getB() == cps) || (p.getB() == tempCps && p.getA() == cps)) {
  941. newEdge = false;
  942. e = p;
  943. }
  944. }
  945. if (!newEdge) {
  946. // Node ohne Edge?
  947. if (e.getA().getClass() == Node.class && e.getA().getConnections().isEmpty()) {
  948. tempCps = e.getA();
  949. deleteNode = true;
  950. }
  951. if (e.getB().getClass() == Node.class && e.getB().getConnections().isEmpty()) {
  952. deleteNode = true;
  953. }
  954. } else {
  955. Edge edge = new Edge(cps, tempCps, model.getMaxCapacity());
  956. if (outsideCon) {
  957. } else {
  958. controller.addEdgeOnCanvas(edge);
  959. }
  960. }
  961. }
  962. count++;
  963. }
  964. }
  965. // Edge auf eine Edge gezogen?
  966. if (onEdge && !checkForReplacement(x, y)) {
  967. Edge p = mousePositionOnEdge(x, y);
  968. if (p != null) {
  969. Edge e1;
  970. Edge e2;
  971. node = false;
  972. Node n = new Node("Node");
  973. n.setPosition(x, y);
  974. controller.addObjUpperNode(n, upperNode);
  975. AbstractCanvasObject r, k;
  976. r = p.getA();
  977. k = p.getB();
  978. e = new Edge(n, tempCps, model.getMaxCapacity());
  979. e1 = new Edge(n, r, model.getMaxCapacity());
  980. e2 = new Edge(n, k, model.getMaxCapacity());
  981. controller.addEdgeOnCanvas(e1);
  982. controller.addEdgeOnCanvas(e2);
  983. }
  984. }else{
  985. mayBeReplaced = null;
  986. }
  987. // ins leere Gedragged
  988. if (node && x > upperNode.getLeftBorder() && !checkForReplacement(x, y)) {
  989. Node n = new Node("Node");
  990. n.setPosition(x, y);
  991. controller.addObjUpperNode(n, upperNode);
  992. e = new Edge(n, tempCps, model.getMaxCapacity());
  993. }else{
  994. mayBeReplaced = null;
  995. }
  996. // Wenn ein Node ohne Connections da ist
  997. if (deleteNode) {
  998. controller.delCanvasObject(tempCps, true);
  999. tempCps = null;
  1000. }
  1001. }
  1002. /**
  1003. * Checks if the mouse is on an Edge.
  1004. *
  1005. * @param x Position of the Mouse
  1006. * @param y Position of the Mouse
  1007. * @return CpsEdge the Mouse is on, null if the mouse is not on an Edge
  1008. */
  1009. private Edge mousePositionOnEdge(int x, int y) {
  1010. x += controller.getScaleDiv2();
  1011. y += controller.getScaleDiv2();
  1012. int lx, ly, hx, hy;
  1013. //TODO: is this right
  1014. // for (CpsEdge p : upperNode.getNodeEdges()) {
  1015. // Line2D l = new Line2D.Float(p.getA().getPosition().getX(), p.getA().getPosition().getY(), p.getB().getPosition().getX(),
  1016. // p.getB().getPosition().getY());
  1017. //
  1018. // int[] positions = determineMousePositionOnEdge(p);
  1019. // lx = positions[0];
  1020. // ly = positions[1];
  1021. // hx = positions[2];
  1022. // hy = positions[3];
  1023. //
  1024. // // distance from a point to a line and between both Objects
  1025. // if (l.ptLineDistSq(x - model.getScaleDiv2(), y - model.getScaleDiv2()) < 20 && x > lx && x < hx && y > ly
  1026. // && y < hy) {
  1027. // return p;
  1028. // }
  1029. // }
  1030. // edge to outside connection
  1031. int count = 0;
  1032. for (Edge e : upperNode.getConnections()) {
  1033. AbstractCanvasObject cps;
  1034. if (e.getA().equals(this.upperNode)) {
  1035. cps = e.getB();
  1036. } else {
  1037. cps = e.getA();
  1038. }
  1039. for (Edge p : cps.getConnections()) {
  1040. AbstractCanvasObject obj = null;
  1041. boolean doTest = false;
  1042. if (upperNode.getNodes().contains(p.getA())) {
  1043. obj = p.getA();
  1044. doTest = true;
  1045. } else if (upperNode.getNodes().contains(p.getB())) {
  1046. obj = p.getB();
  1047. doTest = true;
  1048. }
  1049. // g2.drawImage(img, (borderPos >> 1) - 25, (int) (scalediv20 +
  1050. // 5 + (50 + scalediv20 + 10) * count), 50, 50, null);
  1051. if (doTest) {
  1052. Line2D l = new Line2D.Float((upperNode.getLeftBorder() >> 1) - 25,
  1053. (int) (scalediv20 + 5 + 25 + (50 + scalediv20 + 10) * count), obj.getPosition().getX(),
  1054. obj.getPosition().getY());
  1055. if ((upperNode.getLeftBorder() >> 1) > obj.getPosition().getX()) {
  1056. hx = (upperNode.getLeftBorder() >> 1) - 25 + model.getScaleDiv2() + 7;
  1057. lx = obj.getPosition().getX() + model.getScaleDiv2() - 7;
  1058. } else {
  1059. lx = (upperNode.getLeftBorder() >> 1) - 25 + model.getScaleDiv2() - 7;
  1060. hx = obj.getPosition().getX() + model.getScaleDiv2() + 7;
  1061. }
  1062. if ((int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) > obj.getPosition().getY()) {
  1063. hy = (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) + model.getScaleDiv2() + 7;
  1064. ly = obj.getPosition().getY() + model.getScaleDiv2() - 7;
  1065. } else {
  1066. ly = (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) + model.getScaleDiv2() - 7;
  1067. hy = obj.getPosition().getY() + model.getScaleDiv2() + 7;
  1068. }
  1069. // distance from a point to a line and between both Objects
  1070. if (l.ptLineDistSq(x - model.getScaleDiv2(), y - model.getScaleDiv2()) < 20 && x > lx && x < hx
  1071. && y > ly && y < hy) {
  1072. return p;
  1073. }
  1074. }
  1075. }
  1076. count++;
  1077. }
  1078. return null;
  1079. }
  1080. /**
  1081. * copies a set of given informations
  1082. *
  1083. * @param informations
  1084. */
  1085. protected void setShowedInformation(boolean[] informations) {
  1086. showedInformation = informations;
  1087. }
  1088. /**
  1089. * set tooltIp
  1090. *
  1091. * @param bool
  1092. */
  1093. void setToolTip(boolean bool) {
  1094. this.toolTip = bool;
  1095. }
  1096. /**
  1097. * Set the Mouse Position on the UpperNodeCanvas;
  1098. *
  1099. * @param x
  1100. * @param y
  1101. */
  1102. void setXY(int x, int y) {
  1103. this.x = x;
  1104. this.y = y;
  1105. }
  1106. @Override
  1107. public boolean checkForReplacement(int x, int y) {
  1108. return checkForReplacement(upperNode.getNodes(), null, x, y);
  1109. }
  1110. @Override
  1111. public void tryToAlignObjects(){
  1112. /**
  1113. * Align all Objects
  1114. */
  1115. for(AbstractCanvasObject cps: upperNode.getNodes())
  1116. align(cps,3*model.getScaleDiv2());
  1117. /**
  1118. * AutoSave new Positons
  1119. */
  1120. try{
  1121. controller.autoSave();
  1122. } catch (IOException ex) {
  1123. System.err.println("AutoSave error by aligning");
  1124. ex.printStackTrace();
  1125. }
  1126. }
  1127. @Override
  1128. public void closeUpperNodeTab(int upperNodeId) {
  1129. JTabbedPane tabbedPane = (JTabbedPane) getParent().getParent().getParent();
  1130. for (int i = 4; i < tabbedPane.getTabCount(); i++) {
  1131. if (((GroupNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
  1132. .getComponent(0)).upperNode.getId() == upperNodeId) {
  1133. tabbedPane.remove(i);
  1134. break;
  1135. }
  1136. }
  1137. }
  1138. }