UpperNodeCanvas.java 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598
  1. package ui.view;
  2. import java.awt.BasicStroke;
  3. import java.awt.Color;
  4. import java.awt.Graphics;
  5. import java.awt.Graphics2D;
  6. import java.awt.Image;
  7. import java.awt.Point;
  8. import java.awt.RenderingHints;
  9. import java.awt.datatransfer.UnsupportedFlavorException;
  10. import java.awt.event.ActionEvent;
  11. import java.awt.event.ActionListener;
  12. import java.awt.event.MouseEvent;
  13. import java.awt.event.MouseListener;
  14. import java.awt.event.MouseMotionListener;
  15. import java.awt.geom.Line2D;
  16. import java.io.File;
  17. import java.io.IOException;
  18. import java.util.ArrayList;
  19. import java.util.Timer;
  20. import java.util.TimerTask;
  21. import javax.swing.ImageIcon;
  22. import javax.swing.JLabel;
  23. import javax.swing.JMenuItem;
  24. import javax.swing.JOptionPane;
  25. import javax.swing.JPanel;
  26. import javax.swing.JPopupMenu;
  27. import javax.swing.JScrollPane;
  28. import javax.swing.JSplitPane;
  29. import javax.swing.JTabbedPane;
  30. import com.google.gson.JsonParseException;
  31. import classes.CpsEdge;
  32. import classes.CpsNode;
  33. import classes.CpsUpperNode;
  34. import classes.AbstractCpsObject;
  35. import classes.HolonElement;
  36. import classes.HolonObject;
  37. import classes.HolonSwitch;
  38. import classes.Position;
  39. import classes.SubNet;
  40. import ui.controller.Control;
  41. import ui.controller.UpdateController;
  42. import ui.model.Model;
  43. /**
  44. * This Class is the Canvas. All Objects will be visualized here
  45. *
  46. * @author Gruppe14
  47. */
  48. public class UpperNodeCanvas extends JPanel implements MouseListener, MouseMotionListener {
  49. private static final long serialVersionUID = 1L;
  50. private Image img = null; // Contains the image to draw on MyCanvas
  51. private int x = 0;
  52. private int y = 0;
  53. // edge Object Start Point
  54. private Model model;
  55. private final Control controller;
  56. Graphics2D g2; // For Painting
  57. private int cx, cy;
  58. private int sx, sy; // Mark Coords
  59. private float scalediv20;
  60. // Path
  61. public String path;
  62. private JLabel breadCrumb;
  63. ArrayList<HolonElement> dataSelected = new ArrayList<HolonElement>();
  64. ArrayList<AbstractCpsObject> tempSelected = new ArrayList<AbstractCpsObject>();
  65. // The UpperNode
  66. public CpsUpperNode upperNode;
  67. public int code;
  68. private boolean[] showedInformation = new boolean[5];
  69. private boolean dragging = false; // for dragging
  70. private boolean dragged = false; // if an object/objects was/were dragged
  71. private boolean drawEdge = false; // for drawing edges
  72. private boolean click = false; // for double click
  73. private boolean doMark = false; // for double click
  74. public AbstractCpsObject tempCps = null;
  75. private CpsEdge edgeHighlight = null;
  76. // PopUpMenu
  77. private JPopupMenu popmenu = new JPopupMenu();
  78. private JMenuItem itemDelete = new JMenuItem("Delete");
  79. private JMenuItem itemCut = new JMenuItem("Cut");
  80. private JMenuItem itemCopy = new JMenuItem("Copy");
  81. public JMenuItem itemPaste = new JMenuItem("Paste");
  82. public JMenuItem itemGroup = new JMenuItem("Group");
  83. public JMenuItem itemUngroup = new JMenuItem("Ungroup");
  84. public JMenuItem itemTrack = new JMenuItem("Track");
  85. public JMenuItem itemUntrack = new JMenuItem("Untrack");
  86. // Tooltip
  87. private boolean toolTip; // Tooltip on or off
  88. private Position toolTipPos = new Position(); // Tooltip Position
  89. private String toolTipText = "";
  90. private Point mousePosition = new Point(); // Mouse Position when
  91. // rightclicked
  92. // contains the value of the Capacity for new created Edges
  93. private UpdateController updCon;
  94. // Animation Stuff
  95. javax.swing.Timer animT; // animation Timer
  96. private final int ANIMTIME = 500; // animation Time
  97. private ArrayList<AbstractCpsObject> animCps = null;
  98. private int animFPS = 60;
  99. private int animDuration = ANIMTIME; // animation Duration
  100. private int animDelay = 1000 / animFPS; // animation Delay
  101. private int animSteps = animDuration / animDelay; // animation Steps;
  102. private Position unPos;
  103. private ArrayList<Position> savePos;
  104. /**
  105. * Constructor.
  106. *
  107. * @param mod
  108. * the Model
  109. * @param control
  110. * the Controller
  111. * @param unitGraph
  112. */
  113. public UpperNodeCanvas(Model mod, Control control, UnitGraph unitGraph, CpsUpperNode UpperNode, String parentPath) {
  114. toolTip = false;
  115. this.controller = control;
  116. this.model = mod;
  117. this.upperNode = UpperNode;
  118. this.code = UpperNode.hashCode();
  119. this.path = parentPath + upperNode.getName();
  120. this.breadCrumb = new JLabel(path);
  121. // this.add(breadCrumb);
  122. scalediv20 = model.getScale() / 20;
  123. // Cps objecte aus dem border links schieben
  124. upperNode.setLeftBorder((int) (50 + scalediv20 + scalediv20 + 10));
  125. for (AbstractCpsObject cps : upperNode.getNodes()) {
  126. if (cps.getPosition().x < model.getScaleDiv2() + upperNode.getLeftBorder() + 5) {
  127. cps.setPosition(
  128. new Position(upperNode.getLeftBorder() + 5 + model.getScaleDiv2(), cps.getPosition().y));
  129. }
  130. }
  131. showedInformation[0] = true;
  132. showedInformation[1] = true;
  133. showedInformation[4] = true;
  134. popmenu.add(itemCut);
  135. popmenu.add(itemCopy);
  136. popmenu.add(itemPaste);
  137. popmenu.add(itemDelete);
  138. popmenu.addSeparator();
  139. popmenu.add(itemGroup);
  140. popmenu.add(itemUngroup);
  141. popmenu.add(itemTrack);
  142. popmenu.add(itemUntrack);
  143. itemDelete.setEnabled(false);
  144. itemCut.setEnabled(false);
  145. itemCopy.setEnabled(false);
  146. itemPaste.setEnabled(true);
  147. itemGroup.setEnabled(false);
  148. itemUngroup.setEnabled(false);
  149. itemTrack.setEnabled(false);
  150. itemUntrack.setEnabled(false);
  151. updCon = new UpdateController(model, controller);
  152. itemGroup.addActionListener(new ActionListener() {
  153. @Override
  154. public void actionPerformed(ActionEvent e) {
  155. // calculate uppernode pos (taken from the controller)
  156. unPos = new Position(0, 0);
  157. animCps = new ArrayList<>();
  158. for (AbstractCpsObject cps : model.getSelectedCpsObjects()) {
  159. animCps.add(cps); // add to animation Cps ArrayList
  160. unPos.x += cps.getPosition().x;
  161. unPos.y += cps.getPosition().y;
  162. }
  163. unPos.x /= animCps.size();
  164. unPos.y /= animCps.size();
  165. // save old Position
  166. savePos = new ArrayList<>();
  167. for (int i = 0; i < animCps.size(); i++) {
  168. savePos.add(new Position(0, 0));
  169. savePos.get(i).x = animCps.get(i).getPosition().x;
  170. savePos.get(i).y = animCps.get(i).getPosition().y;
  171. }
  172. animT = new javax.swing.Timer(animDelay, new ActionListener() {
  173. @Override
  174. public void actionPerformed(ActionEvent e) {
  175. if (animDuration - animDelay > 0 && animCps.size() > 1) {
  176. for (int i = 0; i < animCps.size(); i++) {
  177. double x1 = animCps.get(i).getPosition().x - unPos.x;
  178. double y1 = animCps.get(i).getPosition().y - unPos.y;
  179. animCps.get(i).getPosition().x -= x1 / animSteps;
  180. animCps.get(i).getPosition().y -= y1 / animSteps;
  181. }
  182. repaint();
  183. animDuration -= animDelay;
  184. animSteps--;
  185. } else {
  186. animDuration = ANIMTIME;
  187. animSteps = animDuration / animDelay;
  188. animT.stop();
  189. for (int i = 0; i < animCps.size(); i++) {
  190. animCps.get(i).getPosition().x = savePos.get(i).x;
  191. animCps.get(i).getPosition().y = savePos.get(i).y;
  192. }
  193. controller.addUpperNode("NodeOfNode", upperNode, model.getSelectedCpsObjects());
  194. controller.calculateStateForCurrentTimeStep();
  195. repaint();
  196. }
  197. }
  198. });
  199. animT.start();
  200. }
  201. });
  202. itemUngroup.addActionListener(new ActionListener() {
  203. @Override
  204. public void actionPerformed(ActionEvent e) {
  205. // save old Position
  206. JTabbedPane tabbedPane = (JTabbedPane) getParent().getParent().getParent();
  207. for (int i = 4; i < tabbedPane.getTabCount(); i++) {
  208. if (((UpperNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
  209. .getComponent(0)).upperNode.getId() == ((CpsUpperNode) tempCps).getId()) {
  210. tabbedPane.remove(i);
  211. break;
  212. }
  213. }
  214. savePos = new ArrayList<>();
  215. animCps = ((CpsUpperNode) tempCps).getNodes();
  216. controller.delUpperNode((CpsUpperNode) tempCps, upperNode);
  217. for (int i = 0; i < animCps.size(); i++) {
  218. savePos.add(new Position(0, 0));
  219. savePos.get(i).x = animCps.get(i).getPosition().x;
  220. savePos.get(i).y = animCps.get(i).getPosition().y;
  221. }
  222. for (AbstractCpsObject cps : animCps) {
  223. int x = ((CpsUpperNode) tempCps).getPosition().x;
  224. int y = ((CpsUpperNode) tempCps).getPosition().y;
  225. cps.setPosition(new Position(x, y));
  226. }
  227. animT = new javax.swing.Timer(animDelay, new ActionListener() {
  228. @Override
  229. public void actionPerformed(ActionEvent e) {
  230. if (animDuration - animDelay >= 0) {
  231. for (int i = 0; i < animCps.size(); i++) {
  232. double x1 = animCps.get(i).getPosition().x - savePos.get(i).x;
  233. double y1 = animCps.get(i).getPosition().y - savePos.get(i).y;
  234. animCps.get(i).getPosition().x -= x1 / animSteps;
  235. animCps.get(i).getPosition().y -= y1 / animSteps;
  236. }
  237. repaint();
  238. animDuration -= animDelay;
  239. animSteps--;
  240. } else {
  241. animDuration = ANIMTIME;
  242. animSteps = animDuration / animDelay;
  243. animT.stop();
  244. for (int i = 0; i < animCps.size(); i++) {
  245. animCps.get(i).getPosition().x = savePos.get(i).x;
  246. animCps.get(i).getPosition().y = savePos.get(i).y;
  247. }
  248. controller.calculateStateForCurrentTimeStep();
  249. repaint();
  250. }
  251. }
  252. });
  253. animT.start();
  254. }
  255. });
  256. itemTrack.addActionListener(new ActionListener() {
  257. @Override
  258. public void actionPerformed(ActionEvent e) {
  259. for (AbstractCpsObject o : model.getSelectedCpsObjects()) {
  260. if (o instanceof HolonObject) {
  261. boolean found = false;
  262. if (controller.getTrackingObj() != null) {
  263. for (AbstractCpsObject obj : controller.getTrackingObj()) {
  264. if (obj instanceof HolonObject) {
  265. if (obj.getId() == o.getId()) {
  266. found = true;
  267. }
  268. }
  269. }
  270. }
  271. if (!found) {
  272. controller.addTrackingObj((HolonObject) o);
  273. ((HolonObject) o).updateTrackingInfo();
  274. }
  275. if (model.getShowConsoleLog()) {
  276. controller.addTextToConsole("Tracking: ", Color.BLACK, 12, false, false, false);
  277. controller.addTextToConsole("" + o.getName(), Color.BLUE, 12, true, false, false);
  278. controller.addTextToConsole(", ID:", Color.BLACK, 12, false, false, false);
  279. controller.addTextToConsole("" + o.getId(), Color.RED, 12, true, false, true);
  280. }
  281. }
  282. }
  283. }
  284. });
  285. itemUntrack.addActionListener(new ActionListener() {
  286. @Override
  287. public void actionPerformed(ActionEvent e) {
  288. for (AbstractCpsObject o : model.getSelectedCpsObjects()) {
  289. if (o instanceof HolonObject) {
  290. boolean found = false;
  291. if (controller.getTrackingObj() != null) {
  292. for (AbstractCpsObject obj : controller.getTrackingObj()) {
  293. if (obj instanceof HolonObject) {
  294. if (obj.getId() == o.getId()) {
  295. found = true;
  296. }
  297. }
  298. }
  299. }
  300. if (found) {
  301. // Removed from tracking array and tracking
  302. // information reseted
  303. controller.removeTrackingObj((HolonObject) o);
  304. ((HolonObject) o).setTrackingProd(new float[100]);
  305. ((HolonObject) o).setTrackingCons(new float[100]);
  306. }
  307. }
  308. }
  309. System.out.println(controller.getTrackingObj());
  310. }
  311. });
  312. itemDelete.addActionListener(new ActionListener() {
  313. @Override
  314. public void actionPerformed(ActionEvent e) {
  315. // Remove the selected Object objects
  316. for (AbstractCpsObject cps : model.getSelectedCpsObjects()) {
  317. if (upperNode.getNodes().contains(cps)) {
  318. controller.delObjUpperNode(cps, upperNode);
  319. // Removes the object from the tracked objects, in case
  320. // it was tracked
  321. controller.removeTrackingObj(cps);
  322. // Remove UpperNodeTab if UpperNode deleted
  323. if (cps instanceof CpsUpperNode) {
  324. boolean splitView = false;
  325. JSplitPane tempSplit = (JSplitPane) getParent().getParent().getParent().getParent();
  326. JTabbedPane tabbedPane;
  327. JTabbedPane tabbedPane2;
  328. // if SplitView is activated
  329. if (tempSplit.getLeftComponent() instanceof JTabbedPane
  330. && tempSplit.getRightComponent() instanceof JTabbedPane) {
  331. splitView = true;
  332. tabbedPane = (JTabbedPane) tempSplit.getLeftComponent();
  333. tabbedPane2 = (JTabbedPane) tempSplit.getRightComponent();
  334. } else {
  335. tabbedPane = (JTabbedPane) tempSplit.getLeftComponent();
  336. tabbedPane2 = null;
  337. }
  338. // Look if the uppernode is open in a Tab
  339. for (int i = 4; i < tabbedPane.getTabCount(); i++) {
  340. if (tabbedPane.getComponentAt(i) == null) {
  341. } else if (((UpperNodeCanvas) ((JScrollPane) tabbedPane.getComponentAt(i)).getViewport()
  342. .getComponent(0)).upperNode.getId() == cps.getId()) {
  343. ((ButtonTabComponent) tabbedPane.getTabComponentAt(i)).removeTabs();
  344. break;
  345. }
  346. }
  347. // If SplitView is on and the view on
  348. // tabbedPane2 is the deleted upperNode
  349. try {
  350. if (tabbedPane2 != null
  351. && ((UpperNodeCanvas) ((JScrollPane) tabbedPane2.getSelectedComponent())
  352. .getViewport().getComponent(0)).upperNode.getId() == cps.getId()) {
  353. ((ButtonTabComponent) tabbedPane.getTabComponentAt(tabbedPane2.getSelectedIndex()))
  354. .removeTabs();
  355. }
  356. } catch (Exception e2) {
  357. }
  358. }
  359. }
  360. }
  361. toolTip = false;
  362. model.getSelectedCpsObjects().clear();
  363. tempCps = null;
  364. repaint();
  365. }
  366. });
  367. itemCut.addActionListener(new ActionListener() {
  368. @Override
  369. public void actionPerformed(ActionEvent e) {
  370. controller.cut(upperNode);
  371. itemPaste.setEnabled(true);
  372. repaint();
  373. }
  374. });
  375. itemCopy.addActionListener(new ActionListener() {
  376. @Override
  377. public void actionPerformed(ActionEvent e) {
  378. controller.copy(upperNode);
  379. itemPaste.setEnabled(true);
  380. repaint();
  381. }
  382. });
  383. itemPaste.addActionListener(new ActionListener() {
  384. @Override
  385. public void actionPerformed(ActionEvent e) {
  386. try {
  387. controller.paste(upperNode, mousePosition);
  388. unitGraph.update(model.getSelectedCpsObjects());
  389. } catch (JsonParseException | UnsupportedFlavorException | IOException e1) {
  390. // TODO Auto-generated catch block
  391. JLabel message = new JLabel("The Clipboard information cannot be pastet into Application.");
  392. JOptionPane.showMessageDialog(null, message, "", JOptionPane.ERROR_MESSAGE);
  393. }
  394. repaint();
  395. }
  396. });
  397. this.addMouseListener(this);
  398. this.addMouseMotionListener(this);
  399. }
  400. /**
  401. * Paints all Components on the Canvas.
  402. *
  403. * @param g
  404. * Graphics
  405. */
  406. public void paintComponent(Graphics g) {
  407. String maxCap;
  408. super.paintComponent(g);
  409. ((JScrollPane) this.getParent().getParent()).setColumnHeaderView(breadCrumb);
  410. // Rendering
  411. g2 = (Graphics2D) g;
  412. RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  413. g2.setRenderingHints(rh);
  414. // Paint the Background
  415. if (!upperNode.getImagePath().isEmpty()) {
  416. img = new ImageIcon(upperNode.getImagePath()).getImage();
  417. switch (upperNode.getBackgroundMode()) {
  418. case BackgroundPopUp.IMAGE_PIXELS:
  419. g2.drawImage(img, upperNode.getLeftBorder(), 0, img.getWidth(null), img.getHeight(null), null);
  420. break;
  421. case BackgroundPopUp.STRETCHED:
  422. g2.drawImage(img, upperNode.getLeftBorder(), 0, model.getCanvasX(), model.getCanvasY(), null);
  423. break;
  424. case BackgroundPopUp.CUSTOM:
  425. g2.drawImage(img, upperNode.getLeftBorder(), 0, upperNode.getImageWidht(), upperNode.getImageHeight(),
  426. null);
  427. break;
  428. default:
  429. break;
  430. }
  431. }
  432. // Draw Left Border
  433. g2.setColor(new Color(230, 230, 230));
  434. g2.fillRect(0, 0, upperNode.getLeftBorder(), this.getHeight());
  435. g2.setColor(Color.BLACK);
  436. g2.drawLine(0, 0, this.getWidth(), 0);
  437. // Test SubNet Coloring
  438. int i = 0;
  439. for (SubNet s : controller.getSimManager().getSubNets()) {
  440. if (model.getSubNetColors().size() - 1 < i) {
  441. controller.addSubNetColor(new Color((int) (Math.random() * 255), (int) (Math.random() * 255),
  442. (int) (Math.random() * 255)));
  443. }
  444. for (HolonObject cps : s.getObjects()) {
  445. cps.setBorderColor(model.getSubNetColors().get(i));
  446. }
  447. i++;
  448. }
  449. // drawEdges that is being dragged
  450. if (drawEdge) {
  451. g2.setColor(Color.BLACK);
  452. g2.setStroke(new BasicStroke(2));
  453. // If TempCps is an outside Object
  454. if (!upperNode.getNodes().contains(tempCps)) {
  455. int count = 0;
  456. for (CpsEdge e : upperNode.getConnections()) {
  457. if (e.getA().equals(tempCps)) {
  458. g2.drawLine(upperNode.getLeftBorder() >> 1, (int) (model.getScaleDiv2() + scalediv20 + 5
  459. + (model.getScale() + scalediv20 + 10) * count), x, y);
  460. } else if (e.getB().equals(tempCps)) {
  461. g2.drawLine(upperNode.getLeftBorder() >> 1, (int) (model.getScaleDiv2() + scalediv20 + 5
  462. + (model.getScale() + scalediv20 + 10) * count), x, y);
  463. }
  464. count++;
  465. }
  466. } else {
  467. g2.drawLine(tempCps.getPosition().x, tempCps.getPosition().y, x, y);
  468. }
  469. }
  470. // draw Edges
  471. for (CpsEdge con : upperNode.getNodeEdges()) {
  472. if (con.getA().getId() != model.getSelectedObjectID() && con.getB().getId() != model.getSelectedObjectID()
  473. && con != edgeHighlight) {
  474. if (con.getConnected() == 0) {
  475. if (con.getState()) {
  476. g2.setColor(Color.GREEN);
  477. if (con.getCapacity() != -1) {
  478. g2.setStroke(new BasicStroke(Math.min(((con.getFlow() / con.getCapacity() * 3) + 1), 4)));
  479. }
  480. } else {
  481. g2.setColor(Color.RED);
  482. g2.setStroke(new BasicStroke(2));
  483. }
  484. } else {
  485. g2.setColor(Color.DARK_GRAY);
  486. g2.setStroke(new BasicStroke(2));
  487. }
  488. g2.drawLine(con.getA().getPosition().x, con.getA().getPosition().y, con.getB().getPosition().x,
  489. con.getB().getPosition().y);
  490. if (con.getCapacity() == -1) {
  491. maxCap = Character.toString('\u221e');
  492. } else if (con.getCapacity() == -2) {
  493. maxCap = "???";
  494. } else {
  495. maxCap = String.valueOf(con.getCapacity());
  496. }
  497. if (showedInformation[0]) {
  498. if (con.getConnected() == 0 || con.getConnected() == 1) {
  499. g2.drawString(con.getFlow() + "/" + maxCap,
  500. (con.getA().getPosition().x + con.getB().getPosition().x) / 2,
  501. (con.getA().getPosition().y + con.getB().getPosition().y) / 2);
  502. } else {
  503. g2.drawString("not connected", (con.getA().getPosition().x + con.getB().getPosition().x) / 2,
  504. (con.getA().getPosition().y + con.getB().getPosition().y) / 2);
  505. }
  506. }
  507. }
  508. }
  509. // Objects connected to upperNode
  510. int count = 0;
  511. for (CpsEdge e : upperNode.getConnections()) {
  512. AbstractCpsObject cps;
  513. if (e.getA().equals(this.upperNode)) {
  514. cps = e.getB();
  515. } else {
  516. cps = e.getA();
  517. }
  518. // Show and Highlight
  519. if (model.getSelectedCpsObjects().contains(cps) || showedInformation[4] == true) {
  520. for (CpsEdge ed : cps.getConnections()) {
  521. AbstractCpsObject obj = null;
  522. if (upperNode.getNodes().contains(ed.getA())) {
  523. obj = ed.getA();
  524. } else if (upperNode.getNodes().contains(ed.getB())) {
  525. obj = ed.getB();
  526. }
  527. if (obj != null) {
  528. if (ed.getConnected() == 0) {
  529. if (ed.getState()) {
  530. g2.setColor(Color.GREEN);
  531. if (ed.getCapacity() != -1) {
  532. g2.setStroke(
  533. new BasicStroke(Math.min(((ed.getFlow() / ed.getCapacity() * 3) + 1), 4)));
  534. }
  535. } else {
  536. g2.setColor(Color.RED);
  537. g2.setStroke(new BasicStroke(2));
  538. }
  539. if (ed.getA().getId() == model.getSelectedObjectID()
  540. || ed.getB().getId() == model.getSelectedObjectID() || edgeHighlight == ed)
  541. g2.setColor(Color.BLUE);
  542. } else {
  543. g2.setColor(Color.DARK_GRAY);
  544. g2.setStroke(new BasicStroke(2));
  545. }
  546. g2.drawLine(obj.getPosition().x, obj.getPosition().y, (upperNode.getLeftBorder() >> 1),
  547. (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) + 25);
  548. if (showedInformation[0]) {
  549. if (ed.getCapacity() == -1) {
  550. maxCap = Character.toString('\u221e');
  551. } else if (ed.getCapacity() == -2) {
  552. maxCap = "???";
  553. } else {
  554. maxCap = String.valueOf(ed.getCapacity());
  555. }
  556. if (ed.getConnected() == 0 || ed.getConnected() == 1) {
  557. g2.drawString(ed.getFlow() + "/" + maxCap,
  558. (obj.getPosition().x + (upperNode.getLeftBorder() >> 1)) / 2,
  559. (obj.getPosition().y + (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count)
  560. + 25) / 2);
  561. } else {
  562. g2.drawString("not connected",
  563. (obj.getPosition().x + (upperNode.getLeftBorder() >> 1)) / 2,
  564. (obj.getPosition().y + (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count)
  565. + 25) / 2);
  566. }
  567. }
  568. }
  569. }
  570. }
  571. // Border Highlighting
  572. if (showedInformation[3]) {
  573. g2.setColor(cps.getBorderColor());
  574. if (g2.getColor() != Color.WHITE) {
  575. g2.fillRect((int) ((upperNode.getLeftBorder() >> 1) - 25 - scalediv20) - 3,
  576. (int) (scalediv20 + 5 + (25 + scalediv20 + 10) * count - scalediv20) - 3,
  577. (int) (50 + ((scalediv20 + 3) * 2)), (int) (50 + ((scalediv20 + 3) * 2)));
  578. }
  579. }
  580. // node image
  581. if (cps instanceof CpsNode && (cps == tempCps || model.getSelectedCpsObject() == cps
  582. || model.getSelectedCpsObjects().contains(cps) || tempSelected.contains(cps))) {
  583. img = new ImageIcon(this.getClass().getResource("/Images/node_selected.png")).getImage();
  584. } else {
  585. if (cps instanceof HolonSwitch) {
  586. if (((HolonSwitch) cps).getActiveAt()[model.getCurIteration()]) {
  587. ((HolonSwitch) cps).setAutoState(true);
  588. } else {
  589. ((HolonSwitch) cps).setAutoState(false);
  590. }
  591. }
  592. // Highlighting
  593. if ((cps == tempCps && model.getSelectedCpsObjects().size() == 0 && tempSelected.size() == 0)
  594. || model.getSelectedCpsObjects().contains(cps) || tempSelected.contains(cps)) {
  595. g2.setColor(Color.BLUE);
  596. g2.fillRect((int) ((upperNode.getLeftBorder() >> 1) - 25 - scalediv20),
  597. (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count - scalediv20),
  598. (int) (50 + (scalediv20 * 2)), (int) (50 + (scalediv20 * 2)));
  599. } else if (cps instanceof HolonObject) {
  600. g2.setColor(((HolonObject) cps).getColor());
  601. g2.fillRect((int) ((upperNode.getLeftBorder() >> 1) - 25 - scalediv20),
  602. (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count - scalediv20),
  603. (int) (50 + (scalediv20 * 2)), (int) (50 + (scalediv20 * 2)));
  604. }
  605. // draw image
  606. File checkPath = new File(cps.getImage());
  607. if (checkPath.exists()) {
  608. img = new ImageIcon(cps.getImage()).getImage();
  609. } else {
  610. img = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage();
  611. }
  612. }
  613. g2.drawImage(img, (upperNode.getLeftBorder() >> 1) - 25,
  614. (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count), 50, 50, null);
  615. count++;
  616. }
  617. // Highlighted Edge
  618. if (model.getSelectedObjectID() > 0 || !model.getSelectedCpsObjects().isEmpty() || !tempSelected.isEmpty()) {
  619. g2.setColor(Color.BLUE);
  620. for (CpsEdge con : upperNode.getNodeEdges()) {
  621. if (con.getFlow() <= con.getCapacity()) {
  622. g2.setStroke(new BasicStroke(Math.min((con.getFlow() / con.getCapacity() * 3) + 1, 4)));
  623. } else {
  624. g2.setStroke(new BasicStroke(2));
  625. }
  626. if (con.getA().getId() == model.getSelectedObjectID()
  627. || model.getSelectedCpsObjects().contains(con.getA()) || tempSelected.contains(con.getA())
  628. || con.getB().getId() == model.getSelectedObjectID()
  629. || model.getSelectedCpsObjects().contains(con.getB())
  630. || tempSelected.contains(con.getB()) && con != edgeHighlight) {
  631. g2.drawLine(con.getA().getPosition().x, con.getA().getPosition().y, con.getB().getPosition().x,
  632. con.getB().getPosition().y);
  633. if (con.getCapacity() == -1) {
  634. maxCap = Character.toString('\u221e');
  635. } else if (con.getCapacity() == -2) {
  636. maxCap = "???";
  637. } else {
  638. maxCap = String.valueOf(con.getCapacity());
  639. }
  640. if (showedInformation[0]) {
  641. if (con.getConnected() == 0 || con.getConnected() == 1) {
  642. g2.drawString(con.getFlow() + "/" + maxCap,
  643. (con.getA().getPosition().x + con.getB().getPosition().x) / 2,
  644. (con.getA().getPosition().y + con.getB().getPosition().y) / 2);
  645. } else {
  646. g2.drawString("not connected",
  647. (con.getA().getPosition().x + con.getB().getPosition().x) / 2,
  648. (con.getA().getPosition().y + con.getB().getPosition().y) / 2);
  649. }
  650. }
  651. }
  652. }
  653. } else if (edgeHighlight != null) {
  654. g2.setColor(Color.BLUE);
  655. if (edgeHighlight.getFlow() <= edgeHighlight.getCapacity()) {
  656. g2.setStroke(
  657. new BasicStroke(Math.min((edgeHighlight.getFlow() / edgeHighlight.getCapacity() * 3) + 1, 4)));
  658. } else {
  659. g2.setStroke(new BasicStroke(2));
  660. }
  661. if (upperNode.getNodeEdges().contains(edgeHighlight)) {
  662. g2.drawLine(edgeHighlight.getA().getPosition().x, edgeHighlight.getA().getPosition().y,
  663. edgeHighlight.getB().getPosition().x, edgeHighlight.getB().getPosition().y);
  664. if (edgeHighlight.getCapacity() == -1) {
  665. maxCap = Character.toString('\u221e');
  666. } else if (edgeHighlight.getCapacity() == -2) {
  667. maxCap = "???";
  668. } else {
  669. maxCap = String.valueOf(edgeHighlight.getCapacity());
  670. }
  671. if (showedInformation[0]) {
  672. g2.drawString(edgeHighlight.getFlow() + "/" + maxCap,
  673. (edgeHighlight.getA().getPosition().x + edgeHighlight.getB().getPosition().x) / 2,
  674. (edgeHighlight.getA().getPosition().y + edgeHighlight.getB().getPosition().y) / 2);
  675. }
  676. }
  677. }
  678. // Objects in upper node
  679. for (AbstractCpsObject cps : upperNode.getNodes()) {
  680. // Border Highlighting
  681. if (showedInformation[3]) {
  682. g2.setColor(cps.getBorderColor());
  683. if (g2.getColor() != Color.WHITE) {
  684. g2.fillRect((int) (cps.getPosition().x - controller.getScaleDiv2() - scalediv20 - 3),
  685. (int) (cps.getPosition().y - model.getScaleDiv2() - scalediv20 - 3),
  686. (int) (controller.getScale() + ((scalediv20 + 3) * 2)),
  687. (int) (controller.getScale() + ((scalediv20 + 3) * 2)));
  688. }
  689. }
  690. // node image
  691. if (cps instanceof CpsNode && (cps == tempCps || model.getSelectedCpsObject() == cps
  692. || model.getSelectedCpsObjects().contains(cps) || tempSelected.contains(cps))) {
  693. img = new ImageIcon(this.getClass().getResource("/Images/node_selected.png")).getImage();
  694. } else {
  695. if (cps instanceof HolonSwitch) {
  696. if (((HolonSwitch) cps).getActiveAt()[model.getCurIteration()]) {
  697. ((HolonSwitch) cps).setAutoState(true);
  698. } else {
  699. ((HolonSwitch) cps).setAutoState(false);
  700. }
  701. }
  702. // Highlighting
  703. if ((cps == tempCps && model.getSelectedCpsObjects().size() == 0 && tempSelected.size() == 0)
  704. || model.getSelectedCpsObjects().contains(cps) || tempSelected.contains(cps)) {
  705. g2.setColor(Color.BLUE);
  706. g2.fillRect((int) (cps.getPosition().x - model.getScaleDiv2() - scalediv20),
  707. (int) (cps.getPosition().y - model.getScaleDiv2() - scalediv20),
  708. (int) (controller.getScale() + (scalediv20 * 2)),
  709. (int) (controller.getScale() + (scalediv20 * 2)));
  710. if (showedInformation[1] && cps instanceof HolonObject) {
  711. g2.setColor(Color.BLACK);
  712. float totalEnergy = ((HolonObject) cps).getCurrentEnergyAtTimeStep(model.getCurIteration());
  713. g2.drawString(Float.toString(totalEnergy), cps.getPosition().x - model.getScaleDiv2(),
  714. cps.getPosition().y - model.getScaleDiv2() - 10);
  715. }
  716. } else if (cps instanceof HolonObject) {
  717. g2.setColor(((HolonObject) cps).getColor());
  718. g2.fillRect((int) (cps.getPosition().x - model.getScaleDiv2() - scalediv20),
  719. (int) (cps.getPosition().y - model.getScaleDiv2() - scalediv20),
  720. (int) (controller.getScale() + (scalediv20 * 2)),
  721. (int) (controller.getScale() + (scalediv20 * 2)));
  722. if (showedInformation[1]) {
  723. g2.setColor(Color.BLACK);
  724. float totalEnergy = ((HolonObject) cps).getCurrentEnergyAtTimeStep(model.getCurIteration());
  725. g2.drawString(Float.toString(totalEnergy), cps.getPosition().x - model.getScaleDiv2(),
  726. cps.getPosition().y - model.getScaleDiv2() - 10);
  727. }
  728. }
  729. // draw image
  730. File checkPath = new File(cps.getImage());
  731. if (checkPath.exists()) {
  732. img = new ImageIcon(cps.getImage()).getImage();
  733. } else {
  734. img = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage();
  735. }
  736. }
  737. g2.drawImage(img, cps.getPosition().x - model.getScaleDiv2(), cps.getPosition().y - model.getScaleDiv2(),
  738. controller.getScale(), controller.getScale(), null);
  739. }
  740. // Dragg Highlighting
  741. g2.setStroke(new BasicStroke(1));
  742. if (doMark) {
  743. g2.setColor(Color.BLACK);
  744. if (sx > x && sy > y) {
  745. g2.drawRect(x, y, sx - x, sy - y);
  746. } else if (sx < x && sy < y) {
  747. g2.drawRect(sx, sy, x - sx, y - sy);
  748. } else if (sx >= x) {
  749. g2.drawRect(x, sy, sx - x, y - sy);
  750. } else if (sy >= y) {
  751. g2.drawRect(sx, y, x - sx, sy - y);
  752. }
  753. }
  754. // Border Line
  755. g2.setColor(Color.BLACK);
  756. g2.drawLine(upperNode.getLeftBorder(), 0, upperNode.getLeftBorder(), this.getHeight());
  757. // Tooltip
  758. if (toolTip) {
  759. g2.setColor(new Color(255, 225, 150));
  760. g2.setStroke(new BasicStroke(1));
  761. int textWidth = g.getFontMetrics().stringWidth(toolTipText) + 2; // Text
  762. // width
  763. int fixXPos = toolTipPos.x - (textWidth >> 1) + model.getScaleDiv2(); // Position
  764. // fixed
  765. // x
  766. // Position
  767. // to
  768. // the
  769. // screen
  770. int fixYPos = toolTipPos.y; //// Position fixed y Position to the
  771. //// screen
  772. if (fixXPos < 0) {
  773. fixXPos = 0;
  774. } else if (fixXPos + textWidth + 1 > this.getWidth()) {
  775. fixXPos -= (fixXPos + textWidth + 1) - this.getWidth();
  776. }
  777. if (fixYPos + 16 > this.getHeight()) {
  778. fixYPos -= (fixYPos + 16) - this.getHeight();
  779. }
  780. g2.fillRect(fixXPos, fixYPos, textWidth, 15);
  781. g2.setColor(Color.BLACK);
  782. g2.drawRect(fixXPos, fixYPos, textWidth, 15);
  783. g2.drawString(toolTipText, fixXPos + 2, fixYPos + 12);
  784. }
  785. }
  786. @Override
  787. public void mouseClicked(MouseEvent e) {
  788. updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
  789. }
  790. @Override
  791. public void mouseEntered(MouseEvent e) {
  792. }
  793. @Override
  794. public void mouseExited(MouseEvent e) {
  795. }
  796. @Override
  797. public void mousePressed(MouseEvent e) {
  798. tempCps = null;
  799. dataSelected = null;
  800. edgeHighlight = null;
  801. controller.setSelecteEdge(null);
  802. controller.setSelectedObjectID(-1);
  803. // Object Selection
  804. // Erase old data in the PropertyTable
  805. if (model.getPropertyTable().getRowCount() > 0) {
  806. for (int i = model.getPropertyTable().getRowCount() - 1; i > -1; i--) {
  807. model.getPropertyTable().removeRow(i);
  808. }
  809. }
  810. if (e.getX() > upperNode.getLeftBorder()) {
  811. for (AbstractCpsObject cps : upperNode.getNodes()) {
  812. cx = cps.getPosition().x - model.getScaleDiv2();
  813. cy = cps.getPosition().y - model.getScaleDiv2();
  814. if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy) {
  815. tempCps = cps;
  816. if (model.getShowConsoleLog()) {
  817. controller.addTextToConsole("Selected: ", Color.BLACK, 12, false, false, false);
  818. controller.addTextToConsole("" + cps.getName(), Color.BLUE, 12, true, false, false);
  819. controller.addTextToConsole(", ID:", Color.BLACK, 12, false, false, false);
  820. controller.addTextToConsole("" + cps.getId(), Color.RED, 12, true, false, true);
  821. }
  822. dragging = true;
  823. if (e.isControlDown() && tempCps != null) {
  824. if (model.getSelectedCpsObjects().contains(tempCps)) {
  825. controller.deleteSelectedObject(tempCps);
  826. } else {
  827. controller.addSelectedObject(tempCps);
  828. }
  829. }
  830. // If drawing an Edge (CTRL down)
  831. if (tempCps.getClass() == HolonObject.class) {
  832. HolonObject tempObj = ((HolonObject) tempCps);
  833. dataSelected = tempObj.getElements();
  834. }
  835. if (e.isShiftDown()) {
  836. drawEdge = true;
  837. dragging = false;
  838. }
  839. break;
  840. }
  841. }
  842. } else {
  843. // look for objects connected to uppernode
  844. int count = 0;
  845. for (CpsEdge ed : upperNode.getConnections()) {
  846. AbstractCpsObject cps;
  847. if (ed.getA().equals(this.upperNode)) {
  848. cps = ed.getB();
  849. } else {
  850. cps = ed.getA();
  851. }
  852. if (x - controller.getScale() <= ((upperNode.getLeftBorder() >> 1) - model.getScaleDiv2())
  853. && y - controller.getScale() <= (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count)
  854. && x >= (upperNode.getLeftBorder() >> 1) - model.getScaleDiv2()
  855. && y >= (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count)) {
  856. tempCps = cps;
  857. if (model.getShowConsoleLog()) {
  858. controller.addTextToConsole("Selected: ", Color.BLACK, 12, false, false, false);
  859. controller.addTextToConsole("" + cps.getName(), Color.BLUE, 12, true, false, false);
  860. controller.addTextToConsole(", ID:", Color.BLACK, 12, false, false, false);
  861. controller.addTextToConsole("" + cps.getId(), Color.RED, 12, true, false, true);
  862. controller.setSelectedObjectID(tempCps.getId());
  863. }
  864. // If drawing an Edge (CTRL down)
  865. if (tempCps.getClass() == HolonObject.class) {
  866. HolonObject tempObj = ((HolonObject) tempCps);
  867. dataSelected = tempObj.getElements();
  868. }
  869. if (e.isShiftDown()) {
  870. drawEdge = true;
  871. }
  872. }
  873. count++;
  874. }
  875. }
  876. // Selection of CpsObject
  877. // model.setSelectedCpsObject(tempCps);
  878. // Edge Selection
  879. if (e.getButton() == e.BUTTON1) {
  880. if (tempCps == null) {
  881. edgeHighlight = mousePositionOnEdge(x, y);
  882. controller.setSelecteEdge(edgeHighlight);
  883. controller.setSelectedObjectID(0);
  884. if (!e.isControlDown() && e.getButton() != MouseEvent.BUTTON3) {
  885. model.getSelectedCpsObjects().clear();
  886. }
  887. updCon.deleteRows(model.getMultiTable());
  888. updCon.deleteRows(model.getSingleTable());
  889. }
  890. if (edgeHighlight == null && tempCps == null) {
  891. sx = e.getX();
  892. sy = e.getY();
  893. doMark = true;
  894. }
  895. // System.out.println("Selected Objects");
  896. // for (AbstractCpsObject temp : model.getSelectedCpsObjects()) {
  897. // System.out.println(temp.getName() + " " + temp.getID());
  898. // }
  899. repaint();
  900. }
  901. }
  902. @Override
  903. public void mouseReleased(MouseEvent e) {
  904. x = e.getX();
  905. y = e.getY();
  906. dragging = false;
  907. if (model.getSelectedCpsObjects().size() > 1) {
  908. model.getTableHolonElement().setModel(model.getMultiTable());
  909. } else if (model.getSelectedCpsObjects().size() == 1) {
  910. model.getTableHolonElement().setModel(model.getSingleTable());
  911. }
  912. if (drawEdge) {
  913. drawEdge = false;
  914. drawDeleteEdge();
  915. }
  916. if (dragged == true) {
  917. try {
  918. controller.autoSave();
  919. } catch (IOException ex) {
  920. // TODO Auto-generated catch block
  921. ex.printStackTrace();
  922. }
  923. }
  924. if (!e.isControlDown() && dragged == false && tempCps != null && MouseEvent.BUTTON3 != e.getButton()) {
  925. model.getSelectedCpsObjects().clear();
  926. controller.addSelectedObject(tempCps);
  927. }
  928. dragged = false;
  929. // Rightclick List
  930. if (e.getButton() == MouseEvent.BUTTON3) {
  931. if (tempCps != null) {
  932. itemDelete.setEnabled(true);
  933. itemCut.setEnabled(true);
  934. itemCopy.setEnabled(true);
  935. if (tempCps != null) {
  936. itemGroup.setEnabled(true);
  937. itemTrack.setEnabled(true);
  938. itemUntrack.setEnabled(true);
  939. }
  940. if (tempCps instanceof CpsUpperNode)
  941. itemUngroup.setEnabled(true);
  942. else
  943. itemUngroup.setEnabled(false);
  944. if (model.getSelectedCpsObjects().size() == 0) {
  945. controller.addSelectedObject(tempCps);
  946. }
  947. } else {
  948. itemCut.setEnabled(false);
  949. itemCopy.setEnabled(false);
  950. itemDelete.setEnabled(false);
  951. itemGroup.setEnabled(false);
  952. itemUngroup.setEnabled(false);
  953. itemTrack.setEnabled(false);
  954. itemUntrack.setEnabled(false);
  955. }
  956. mousePosition = this.getMousePosition();
  957. popmenu.show(e.getComponent(), e.getX(), e.getY());
  958. }
  959. if (doMark) {
  960. doMark = false;
  961. for (AbstractCpsObject cps : tempSelected) {
  962. if (!model.getSelectedCpsObjects().contains(cps)) {
  963. controller.addSelectedObject(cps);
  964. }
  965. }
  966. controller.getObjectsInDepth();
  967. tempSelected.clear();
  968. }
  969. if (doubleClick() && tempCps != null && tempCps instanceof HolonSwitch) {
  970. ((HolonSwitch) tempCps).switchState();
  971. }
  972. controller.calculateStateForTimeStep(model.getCurIteration());
  973. updCon.paintProperties(tempCps);
  974. updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
  975. updCon.refreshTableProperties(model.getPropertyTable());
  976. repaint();
  977. }
  978. @Override
  979. public void mouseDragged(MouseEvent e) {
  980. // If Edge is drawn
  981. x = e.getX();
  982. y = e.getY();
  983. if (!model.getSelectedCpsObjects().contains(tempCps) && doMark == false) {
  984. model.getSelectedCpsObjects().clear();
  985. if (tempCps != null) {
  986. controller.addSelectedObject(tempCps);
  987. }
  988. }
  989. if (dragging) {
  990. try {
  991. // tempCps in the upperNode? else its a connected Object from
  992. // outside
  993. if (upperNode.getNodes().contains(tempCps)) {
  994. dragged = true;
  995. float xDist, yDist; // Distance
  996. x = e.getX();
  997. y = e.getY();
  998. // Make sure its in bounds
  999. if (e.getX() < controller.getScaleDiv2() + upperNode.getLeftBorder() + 5)
  1000. x = controller.getScaleDiv2() + upperNode.getLeftBorder() + 5;
  1001. else if (e.getX() > this.getWidth() - controller.getScaleDiv2())
  1002. x = this.getWidth() - controller.getScaleDiv2();
  1003. if (e.getY() < controller.getScaleDiv2())
  1004. y = controller.getScaleDiv2();
  1005. else if (e.getY() > this.getHeight() - controller.getScaleDiv2())
  1006. y = this.getHeight() - controller.getScaleDiv2();
  1007. // Distance
  1008. xDist = x - tempCps.getPosition().x;
  1009. yDist = y - tempCps.getPosition().y;
  1010. tempCps.setPosition(x, y); // Drag Position
  1011. // TipText Position and name
  1012. toolTip = true;
  1013. toolTipText = tempCps.getName() + ", " + tempCps.getId();
  1014. toolTipPos.x = tempCps.getPosition().x - model.getScaleDiv2();
  1015. toolTipPos.y = tempCps.getPosition().y + model.getScaleDiv2();
  1016. // All Selected Objects
  1017. for (AbstractCpsObject cps : model.getSelectedCpsObjects()) {
  1018. if (cps != tempCps) {
  1019. x = (int) (cps.getPosition().x + xDist);
  1020. y = (int) (cps.getPosition().y + yDist);
  1021. // Make sure its in bounds
  1022. if (x < upperNode.getLeftBorder() + 5 + controller.getScaleDiv2())
  1023. x = controller.getScaleDiv2() + upperNode.getLeftBorder() + 5;
  1024. else if (x > this.getWidth() - controller.getScaleDiv2())
  1025. x = this.getWidth() - controller.getScaleDiv2();
  1026. if (y <= controller.getScaleDiv2())
  1027. y = controller.getScaleDiv2();
  1028. else if (y > this.getHeight() - controller.getScaleDiv2())
  1029. y = this.getHeight() - controller.getScaleDiv2();
  1030. cps.setPosition(x, y);
  1031. }
  1032. }
  1033. }
  1034. repaint();
  1035. } catch (Exception eex) {
  1036. }
  1037. }
  1038. // Mark Objects
  1039. if (doMark) {
  1040. tempSelected.clear();
  1041. for (AbstractCpsObject cps : upperNode.getNodes()) {
  1042. int x1 = sx, x2 = x, y1 = sy, y2 = y;
  1043. if (sx >= x) {
  1044. x1 = x;
  1045. x2 = sx;
  1046. }
  1047. if (sy >= y) {
  1048. y1 = y;
  1049. y2 = sy;
  1050. }
  1051. if (x1 <= cps.getPosition().x + model.getScaleDiv2() && y1 <= cps.getPosition().y + model.getScaleDiv2()
  1052. && x2 >= cps.getPosition().x && y2 >= cps.getPosition().y) {
  1053. tempSelected.add(cps);
  1054. }
  1055. }
  1056. int count = 0;
  1057. for (CpsEdge ed : upperNode.getConnections()) {
  1058. AbstractCpsObject cps = null;
  1059. if (ed.getA().equals(upperNode)) {
  1060. cps = ed.getB();
  1061. } else {
  1062. cps = ed.getA();
  1063. }
  1064. int x1 = sx, x2 = x, y1 = sy, y2 = y;
  1065. if (sx >= x) {
  1066. x1 = x;
  1067. x2 = sx;
  1068. }
  1069. if (sy >= y) {
  1070. y1 = y;
  1071. y2 = sy;
  1072. }
  1073. if (x1 <= upperNode.getLeftBorder() >> 1
  1074. && y1 <= (int) (5 + (model.getScale() + scalediv20 + 10) * count) + model.getScaleDiv2()
  1075. && x2 >= upperNode.getLeftBorder() >> 1
  1076. && y2 >= (int) (5 + (model.getScale() + scalediv20 + 10) * count)) {
  1077. tempSelected.add(cps);
  1078. }
  1079. count++;
  1080. }
  1081. }
  1082. repaint();
  1083. }
  1084. @Override
  1085. public void mouseMoved(MouseEvent e) {
  1086. x = e.getX();
  1087. y = e.getY();
  1088. // Everytghing for the tooltip :)
  1089. boolean on = false;
  1090. for (AbstractCpsObject cps : upperNode.getNodes()) {
  1091. cx = cps.getPosition().x - controller.getScaleDiv2();
  1092. cy = cps.getPosition().y - controller.getScaleDiv2();
  1093. if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy) {
  1094. on = true;
  1095. toolTipPos.x = cps.getPosition().x - model.getScaleDiv2();
  1096. toolTipPos.y = cps.getPosition().y + model.getScaleDiv2();
  1097. toolTipText = cps.getName() + ", " + cps.getId();
  1098. }
  1099. }
  1100. int count = 0;
  1101. for (CpsEdge ed : upperNode.getConnections()) {
  1102. AbstractCpsObject cps;
  1103. if (ed.getA().equals(this.upperNode)) {
  1104. cps = ed.getB();
  1105. } else {
  1106. cps = ed.getA();
  1107. }
  1108. cx = upperNode.getLeftBorder() >> 1;
  1109. cy = (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count);
  1110. if (x - 50 <= cx && y - 50 <= cy && x >= cx && y >= cy) {
  1111. on = true;
  1112. toolTipPos.x = cx - 25;
  1113. toolTipPos.y = cy + 50;
  1114. toolTipText = cps.getName() + ", " + cps.getId();
  1115. }
  1116. count++;
  1117. }
  1118. if (on) {
  1119. toolTip = true;
  1120. } else {
  1121. toolTip = false;
  1122. }
  1123. repaint();
  1124. }
  1125. /**
  1126. * Draws or Deletes an Edge.
  1127. */
  1128. private void drawDeleteEdge() {
  1129. boolean node = true; // new node?
  1130. boolean newEdge = true;
  1131. boolean onEdge = true;
  1132. boolean deleteNode = false;
  1133. boolean outsideCon = !upperNode.getNodes().contains(tempCps); // Connection
  1134. // to
  1135. // the
  1136. // outside
  1137. boolean found = false; // dont search for outside connetion if inside
  1138. // connection is found
  1139. CpsEdge e = null;
  1140. for (AbstractCpsObject cps : upperNode.getNodes()) {
  1141. cx = cps.getPosition().x - controller.getScaleDiv2();
  1142. cy = cps.getPosition().y - controller.getScaleDiv2();
  1143. if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy
  1144. && cps != tempCps) {
  1145. found = true;
  1146. node = false;
  1147. onEdge = false;
  1148. for (CpsEdge p : tempCps.getConnections()) {
  1149. if ((p.getA() == tempCps && p.getB() == cps) || (p.getB() == tempCps && p.getA() == cps)) {
  1150. newEdge = false;
  1151. e = p;
  1152. }
  1153. }
  1154. if (!newEdge) {
  1155. if (outsideCon) {
  1156. controller.disconnectNodes(e, upperNode);
  1157. } else {
  1158. controller.delEdgeUpperNode(e, upperNode);
  1159. }
  1160. // Node ohne Edge?
  1161. if (e.getA().getClass() == CpsNode.class && e.getA().getConnections().isEmpty()) {
  1162. tempCps = e.getA();
  1163. deleteNode = true;
  1164. }
  1165. if (e.getB().getClass() == CpsNode.class && e.getB().getConnections().isEmpty()) {
  1166. deleteNode = true;
  1167. }
  1168. }
  1169. if (newEdge) {
  1170. e = new CpsEdge(cps, tempCps, model.getMaxCapacity());
  1171. if (outsideCon) {
  1172. controller.connectNodes(e, upperNode);
  1173. } else {
  1174. controller.addEdgeUpperNode(e, upperNode);
  1175. }
  1176. }
  1177. }
  1178. }
  1179. if (!found && !outsideCon) {
  1180. int count = 0;
  1181. for (CpsEdge ed : upperNode.getConnections()) {
  1182. AbstractCpsObject cps = null;
  1183. if (ed.getA().equals(upperNode)) {
  1184. cps = ed.getB();
  1185. } else {
  1186. cps = ed.getA();
  1187. }
  1188. cx = upperNode.getLeftBorder() >> 1;
  1189. cy = (int) (scalediv20 + 5 + (model.getScale() + scalediv20 + 10) * count);
  1190. if (x - controller.getScale() <= cx && y - controller.getScale() <= cy && x >= cx && y >= cy
  1191. && cps != tempCps) {
  1192. outsideCon = true;
  1193. node = false;
  1194. onEdge = false;
  1195. for (CpsEdge p : tempCps.getConnections()) {
  1196. if ((p.getA() == tempCps && p.getB() == cps) || (p.getB() == tempCps && p.getA() == cps)) {
  1197. newEdge = false;
  1198. e = p;
  1199. }
  1200. }
  1201. if (!newEdge) {
  1202. if (outsideCon) {
  1203. controller.disconnectNodes(e, upperNode);
  1204. } else {
  1205. controller.delEdgeUpperNode(e, upperNode);
  1206. }
  1207. // Node ohne Edge?
  1208. if (e.getA().getClass() == CpsNode.class && e.getA().getConnections().isEmpty()) {
  1209. tempCps = e.getA();
  1210. deleteNode = true;
  1211. }
  1212. if (e.getB().getClass() == CpsNode.class && e.getB().getConnections().isEmpty()) {
  1213. deleteNode = true;
  1214. }
  1215. }
  1216. if (newEdge) {
  1217. CpsEdge edge = new CpsEdge(cps, tempCps, model.getMaxCapacity());
  1218. if (outsideCon) {
  1219. controller.connectNodes(edge, upperNode);
  1220. } else {
  1221. controller.addEdgeUpperNode(edge, upperNode);
  1222. }
  1223. }
  1224. }
  1225. count++;
  1226. }
  1227. }
  1228. // Edge auf eine Edge gezogen?
  1229. if (onEdge) {
  1230. CpsEdge p = mousePositionOnEdge(x, y);
  1231. if (p != null) {
  1232. CpsEdge e1 = null;
  1233. CpsEdge e2 = null;
  1234. node = false;
  1235. CpsNode n = new CpsNode("Node");
  1236. n.setPosition(x, y);
  1237. controller.addObjUpperNode(n, upperNode);
  1238. AbstractCpsObject r, k;
  1239. r = p.getA();
  1240. k = p.getB();
  1241. e = new CpsEdge(n, tempCps, model.getMaxCapacity());
  1242. e1 = new CpsEdge(n, r, model.getMaxCapacity());
  1243. e2 = new CpsEdge(n, k, model.getMaxCapacity());
  1244. controller.delEdgeUpperNode(p, upperNode);
  1245. if (outsideCon) {
  1246. controller.connectNodes(e, upperNode);
  1247. } else {
  1248. controller.addEdgeUpperNode(e, upperNode);
  1249. }
  1250. controller.addEdgeUpperNode(e1, upperNode);
  1251. controller.addEdgeUpperNode(e2, upperNode);
  1252. }
  1253. }
  1254. // ins leere Gedragged
  1255. if (node && x > upperNode.getLeftBorder()) {
  1256. CpsNode n = new CpsNode("Node");
  1257. n.setPosition(x, y);
  1258. controller.addObjUpperNode(n, upperNode);
  1259. e = new CpsEdge(n, tempCps, model.getMaxCapacity());
  1260. if (outsideCon) {
  1261. controller.connectNodes(e, upperNode);
  1262. } else {
  1263. controller.addEdgeUpperNode(e, upperNode);
  1264. }
  1265. }
  1266. // Wenn ein Node ohne Connections da ist
  1267. if (deleteNode) {
  1268. controller.delCanvasObject(tempCps, true);
  1269. tempCps = null;
  1270. }
  1271. }
  1272. /**
  1273. * Checks if the mouse is on an Edge.
  1274. *
  1275. * @param x
  1276. * Position of the Mouse
  1277. * @param y
  1278. * Position of the Mouse
  1279. *
  1280. * @return CpsEdge the Mouse is on, null if the mouse is not on an Edge
  1281. */
  1282. public CpsEdge mousePositionOnEdge(int x, int y) {
  1283. x += controller.getScaleDiv2();
  1284. y += controller.getScaleDiv2();
  1285. int lx, ly, hx, hy;
  1286. for (CpsEdge p : upperNode.getNodeEdges()) {
  1287. Line2D l = new Line2D.Float(p.getA().getPosition().x, p.getA().getPosition().y, p.getB().getPosition().x,
  1288. p.getB().getPosition().y);
  1289. if (p.getA().getPosition().x > p.getB().getPosition().x) {
  1290. hx = p.getA().getPosition().x + model.getScaleDiv2() + 7;
  1291. lx = p.getB().getPosition().x + model.getScaleDiv2() - 7;
  1292. } else {
  1293. lx = p.getA().getPosition().x + model.getScaleDiv2() - 7;
  1294. hx = p.getB().getPosition().x + model.getScaleDiv2() + 7;
  1295. }
  1296. if (p.getA().getPosition().y > p.getB().getPosition().y) {
  1297. hy = p.getA().getPosition().y + model.getScaleDiv2() + 7;
  1298. ly = p.getB().getPosition().y + model.getScaleDiv2() - 7;
  1299. } else {
  1300. ly = p.getA().getPosition().y + model.getScaleDiv2() - 7;
  1301. hy = p.getB().getPosition().y + model.getScaleDiv2() + 7;
  1302. }
  1303. // distance from a point to a line and between both Objects
  1304. if (l.ptLineDistSq(x - model.getScaleDiv2(), y - model.getScaleDiv2()) < 20 && x > lx && x < hx && y > ly
  1305. && y < hy) {
  1306. return p;
  1307. }
  1308. }
  1309. // edge to outside connection
  1310. int count = 0;
  1311. for (CpsEdge e : upperNode.getConnections()) {
  1312. AbstractCpsObject cps;
  1313. if (e.getA().equals(this.upperNode)) {
  1314. cps = e.getB();
  1315. } else {
  1316. cps = e.getA();
  1317. }
  1318. for (CpsEdge p : cps.getConnections()) {
  1319. AbstractCpsObject obj = null;
  1320. boolean doTest = false;
  1321. if (upperNode.getNodes().contains(p.getA())) {
  1322. obj = p.getA();
  1323. doTest = true;
  1324. } else if (upperNode.getNodes().contains(p.getB())) {
  1325. obj = p.getB();
  1326. doTest = true;
  1327. }
  1328. // g2.drawImage(img, (borderPos >> 1) - 25, (int) (scalediv20 +
  1329. // 5 + (50 + scalediv20 + 10) * count), 50, 50, null);
  1330. if (doTest) {
  1331. Line2D l = new Line2D.Float((upperNode.getLeftBorder() >> 1) - 25,
  1332. (int) (scalediv20 + 5 + 25 + (50 + scalediv20 + 10) * count), obj.getPosition().x,
  1333. obj.getPosition().y);
  1334. if ((upperNode.getLeftBorder() >> 1) > obj.getPosition().x) {
  1335. hx = (upperNode.getLeftBorder() >> 1) - 25 + model.getScaleDiv2() + 7;
  1336. lx = obj.getPosition().x + model.getScaleDiv2() - 7;
  1337. } else {
  1338. lx = (upperNode.getLeftBorder() >> 1) - 25 + model.getScaleDiv2() - 7;
  1339. hx = obj.getPosition().x + model.getScaleDiv2() + 7;
  1340. }
  1341. if ((int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) > obj.getPosition().y) {
  1342. hy = (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) + model.getScaleDiv2() + 7;
  1343. ly = obj.getPosition().y + model.getScaleDiv2() - 7;
  1344. } else {
  1345. ly = (int) (scalediv20 + 5 + (50 + scalediv20 + 10) * count) + model.getScaleDiv2() - 7;
  1346. hy = obj.getPosition().y + model.getScaleDiv2() + 7;
  1347. }
  1348. // distance from a point to a line and between both Objects
  1349. if (l.ptLineDistSq(x - model.getScaleDiv2(), y - model.getScaleDiv2()) < 20 && x > lx && x < hx
  1350. && y > ly && y < hy) {
  1351. return p;
  1352. }
  1353. }
  1354. }
  1355. count++;
  1356. }
  1357. return null;
  1358. }
  1359. /**
  1360. * Checks if a double click was made.
  1361. *
  1362. * @return true if doublecklick, false if not
  1363. */
  1364. private boolean doubleClick() {
  1365. if (click) {
  1366. click = false;
  1367. return true;
  1368. } else {
  1369. click = true;
  1370. Timer t = new Timer("doubleclickTimer", false);
  1371. t.schedule(new TimerTask() {
  1372. @Override
  1373. public void run() {
  1374. click = false;
  1375. }
  1376. }, 500);
  1377. }
  1378. return false;
  1379. }
  1380. /**
  1381. * sets the Edge Capacity.
  1382. *
  1383. * @param cap
  1384. * capacity
  1385. */
  1386. public void setEdgeCapacity(float cap) {
  1387. controller.setMaxCapacity(cap);
  1388. }
  1389. /**
  1390. * Set if Information should be shown.
  1391. *
  1392. * @param connection
  1393. * boolean for conecction
  1394. * @param object
  1395. * boolean for objects
  1396. */
  1397. public void setShowedInformation(boolean connection, boolean object, boolean nodeOfnode) {
  1398. showedInformation[0] = connection;
  1399. showedInformation[1] = object;
  1400. showedInformation[4] = nodeOfnode;
  1401. }
  1402. /**
  1403. * copies a set of given informations
  1404. *
  1405. * @param informations
  1406. */
  1407. public void setShowedInformation(boolean[] informations) {
  1408. showedInformation = informations;
  1409. }
  1410. /**
  1411. * Returns if Information should be shown.
  1412. *
  1413. * @return Array of boolean [0] = connection, [1] = objects
  1414. */
  1415. public boolean[] getShowedInformation() {
  1416. return showedInformation;
  1417. }
  1418. /**
  1419. * Set the Background Image;
  1420. *
  1421. * @param imagePath
  1422. * Image Path
  1423. * @param mode
  1424. * Image Mode
  1425. * @param width
  1426. * Image custom width
  1427. * @param height
  1428. * Image custom height
  1429. */
  1430. public void setBackgroundImage(String imagePath, int mode, int width, int height) {
  1431. upperNode.setBackgroundImage(imagePath, mode, width, height);
  1432. }
  1433. /**
  1434. * set tooltIp
  1435. *
  1436. * @param bool
  1437. */
  1438. public void setToolTip(boolean bool) {
  1439. this.toolTip = bool;
  1440. }
  1441. /**
  1442. * Set the Mouse Position on the UpperNodeCanvas;
  1443. *
  1444. * @param x
  1445. * @param y
  1446. */
  1447. public void setXY(int x, int y) {
  1448. this.x = x;
  1449. this.y = y;
  1450. }
  1451. }