GUI.java 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713
  1. package ui.view.main;
  2. import java.awt.BorderLayout;
  3. import java.awt.Color;
  4. import java.awt.Component;
  5. import java.awt.Cursor;
  6. import java.awt.Dimension;
  7. import java.awt.GraphicsDevice;
  8. import java.awt.GraphicsEnvironment;
  9. import java.awt.HeadlessException;
  10. import java.awt.Image;
  11. import java.awt.Point;
  12. import java.awt.Rectangle;
  13. import java.awt.Toolkit;
  14. import java.awt.datatransfer.UnsupportedFlavorException;
  15. import java.awt.event.ActionEvent;
  16. import java.awt.event.ActionListener;
  17. import java.awt.event.ComponentAdapter;
  18. import java.awt.event.ComponentEvent;
  19. import java.awt.event.ItemEvent;
  20. import java.awt.event.KeyAdapter;
  21. import java.awt.event.KeyEvent;
  22. import java.awt.event.MouseAdapter;
  23. import java.awt.event.MouseEvent;
  24. import java.awt.event.MouseMotionAdapter;
  25. import java.io.File;
  26. import java.io.IOException;
  27. import java.net.URI;
  28. import java.util.ArrayList;
  29. import java.util.List;
  30. import java.util.ListIterator;
  31. import javax.swing.AbstractAction;
  32. import javax.swing.ActionMap;
  33. import javax.swing.Box;
  34. import javax.swing.BoxLayout;
  35. import javax.swing.GrayFilter;
  36. import javax.swing.ImageIcon;
  37. import javax.swing.InputMap;
  38. import javax.swing.JButton;
  39. import javax.swing.JCheckBoxMenuItem;
  40. import javax.swing.JComboBox;
  41. import javax.swing.JComponent;
  42. import javax.swing.JDialog;
  43. import javax.swing.JFileChooser;
  44. import javax.swing.JFrame;
  45. import javax.swing.JLabel;
  46. import javax.swing.JMenu;
  47. import javax.swing.JMenuBar;
  48. import javax.swing.JMenuItem;
  49. import javax.swing.JOptionPane;
  50. import javax.swing.JPanel;
  51. import javax.swing.JPopupMenu;
  52. import javax.swing.JScrollPane;
  53. import javax.swing.JSplitPane;
  54. import javax.swing.JTabbedPane;
  55. import javax.swing.JTextField;
  56. import javax.swing.JToolBar;
  57. import javax.swing.JTree;
  58. import javax.swing.KeyStroke;
  59. import javax.swing.SwingUtilities;
  60. import javax.swing.filechooser.FileNameExtensionFilter;
  61. import javax.swing.tree.DefaultMutableTreeNode;
  62. import javax.swing.tree.DefaultTreeModel;
  63. import javax.swing.tree.TreeCellRenderer;
  64. import org.apache.commons.compress.archivers.ArchiveException;
  65. import com.google.gson.JsonParseException;
  66. import classes.AbstractCanvasObject;
  67. import classes.Category;
  68. import classes.Edge;
  69. import classes.GroupNode;
  70. import classes.HolonObject;
  71. import classes.HolonSwitch;
  72. import classes.IdCounter;
  73. import classes.IdCounter.CounterType;
  74. import interfaces.GraphEditable;
  75. import ui.controller.Control;
  76. import ui.model.DecoratedState;
  77. import ui.model.Model;
  78. import ui.model.Model.FairnessModel;
  79. import ui.view.canvas.AbstractCanvas;
  80. import ui.view.canvas.Canvas;
  81. import ui.view.canvas.GroupNodeCanvas;
  82. import ui.view.component.ButtonTabComponent;
  83. import ui.view.dialog.AboutUsPopUp;
  84. import ui.view.dialog.AddObjectPopUp;
  85. import ui.view.dialog.BackgroundPopUp;
  86. import ui.view.dialog.CanvasResizePopUp;
  87. import ui.view.dialog.CreateNewDialog;
  88. import ui.view.dialog.CreateNewDialog.Option;
  89. import ui.view.inspector.Inspector;
  90. import ui.view.inspector.UnitGraph;
  91. import ui.view.dialog.EditEdgesPopUp;
  92. import ui.view.dialog.SearchPopUp;
  93. import ui.view.window.AddOnWindow;
  94. import ui.view.window.FlexWindow;
  95. import ui.view.window.Outliner;
  96. import utility.ImageImport;
  97. /**
  98. * Graphical User Interface.
  99. *
  100. * @author Gruppe14
  101. */
  102. public class GUI {
  103. static final Color PALE_RED = new Color(255, 192, 192);
  104. /**
  105. * Menu on the Top containing File, Edit View Help etc
  106. */
  107. private final JMenuBar menuBar = new JMenuBar();
  108. private final JMenu mnNewMenu = new JMenu("File");
  109. private final JMenu mnNewMenuEdit = new JMenu("Edit");
  110. private final JMenu mnNewMenuOptions = new JMenu("Options");
  111. private final JMenu mnNewMenuView = new JMenu("View");
  112. private final JMenu menuWindow = new JMenu("Window");
  113. /** Help Menu containing helpful Informations and the AboutUs Popup */
  114. private final JMenu mnHelp = new JMenu("Help");
  115. /**
  116. * Help -> Introduction A small Introduction of the Application, SmartGrids and
  117. * Holons
  118. */
  119. private final JMenuItem mntmIntroduction = new JMenuItem("Introduction");
  120. /**
  121. * Help -> UserManual
  122. */
  123. private final JMenuItem mntmUserManual = new JMenuItem("User Manual");
  124. /** Help -> Algorithm Help Menu */
  125. private final JMenuItem mntmAlgorithmHelp = new JMenuItem("Algorithm Introduction");
  126. /** Help -> CodeDocumentation */
  127. private final JMenuItem mntmCodeDoc = new JMenuItem("Code Documentation");
  128. /** Help -> AboutUs */
  129. private final JMenuItem mntmAboutUs = new JMenuItem("About Us");
  130. /** checked if supplyBars should be shown */
  131. private final JCheckBoxMenuItem showSupplyBarsCheckBox = new JCheckBoxMenuItem("Show supply bars.");
  132. /** menu for the different fairness Models */
  133. private final JMenu mnFairnessModel = new JMenu("Fairness Model");
  134. /** press to supply minimum demand first */
  135. private final JMenuItem mntmFairMinFirst = new JMenuItem("Minimum demand first");
  136. /** press to give everyone the same energy */
  137. private final JMenuItem mntmFairAlleEqual = new JMenuItem("Equal supply for everyone");
  138. private final JMenuItem mntmOpen = new JMenuItem("Open");
  139. private final JMenuItem mntmNew = new JMenuItem("New");
  140. private final JMenuItem mntmSave = new JMenuItem("Save");
  141. private final JMenuItem mntmCanvasSize = new JMenuItem("Set View Size");
  142. private final JMenuItem mntmBackground = new JMenuItem("Set Background Image");
  143. private final JSplitPane splitPane = new JSplitPane();
  144. private final JSplitPane splitPane1 = new JSplitPane();
  145. // the tabbed canvas containing the different sub-net tabs of the grid (Main
  146. // Grid + Nodes of Nodes)
  147. private final JPanel myPanel = new JPanel(new BorderLayout());
  148. private final JTabbedPane tabbedPaneInnerOriginal = new JTabbedPane(JTabbedPane.TOP);
  149. // the main canvas where we can see the grid currently displayed
  150. private final JScrollPane canvasSP = new JScrollPane();
  151. private final JScrollPane scrollPane1 = new JScrollPane();
  152. // private final JScrollPane holonSP = new JScrollPane();
  153. // the original tabbed Pane (containing tabs for view, statistics, holon,
  154. // flexibility)
  155. private final JTabbedPane tabbedPaneOriginal = new JTabbedPane(JTabbedPane.TOP);
  156. private final JPopupMenu popmenuEdit = new JPopupMenu();
  157. private final JMenuItem editItem = new JMenuItem("Edit Object");
  158. private final JLabel elementGraph = new JLabel("None ");
  159. private final JTree categoryTree = new JTree();
  160. /******************************************
  161. ************* Right Container*************
  162. ******************************************
  163. * Right Container: here comes the information about the HolonObject, such as
  164. * HolonElements Information, Properties and Consumption/Production graph.
  165. **/
  166. private final Inspector inspector;
  167. private final JSplitPane splitHolonElPro = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
  168. private final JSplitPane splitGraphHolonEl = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
  169. private final int distanceBetweenElementsAndGraph = 350;
  170. // Prechoosed local Periods
  171. private final JScrollPane scrollProperties = new JScrollPane();
  172. // In this section is the graph for the selected HolonElement of the clicked
  173. private final Model model;
  174. private final Control controller;
  175. // In this section are all the Holonelements that correspond to the clicked
  176. // HolonObject with consumption/production, name and amount.
  177. private final JPanel panel = new JPanel();
  178. private final JPanel panelHolonEl = new JPanel();
  179. // Buttons
  180. private final JButton btnAdd = new JButton();
  181. private final JPopupMenu btnAddPopUp = new JPopupMenu("Newacac");
  182. private final JMenuItem mItemNew = new JMenuItem("New..");
  183. private final JMenuItem mItemCategory = new JMenuItem("Category");
  184. private final JMenuItem mItemObject = new JMenuItem("Object");
  185. private final JMenuItem mItemSwitch = new JMenuItem("Switch");
  186. private final JButton btnDel = new JButton();
  187. private final JToolBar toolBar = new JToolBar();
  188. private final JToolBar toolBarHolonEl = new JToolBar();
  189. // Languages
  190. private final Canvas canvas;
  191. private final UnitGraph unitGraph;
  192. /** Textfield to show the period of an element */
  193. private final JTextField unitGraphLocalPeriod = new JTextField(6);
  194. private final JMenuItem mntmUndo = new JMenuItem("Undo");
  195. private final JMenuItem mntmRedo = new JMenuItem("Redo");
  196. private final JMenuItem mntmEditEdges = new JMenuItem("Edge Properties");
  197. private final JMenuItem mntmFindReplace = new JMenuItem("Find/ Replace");
  198. private final JMenuItem mntmAlignAll = new JMenuItem("Align All");
  199. private final JMenuItem mntmResetCategory = new JMenuItem("Reset Categories");
  200. // TODO make GUI a JFRAME and remove holegJFrame
  201. private JFrame holegJFrame;
  202. // tabbedPaneOriginal or tabbedPaneSplit
  203. private JTabbedPane tabTemp;
  204. private String catOfObjToBeEdited;
  205. private GroupNodeCanvas unc;
  206. private JPanel contentPane;
  207. // Pop up Windows
  208. private AddObjectPopUp addObjectPopUP;
  209. private AboutUsPopUp aboutUsPopUp;
  210. // variables
  211. private boolean dragging = false;
  212. private String actualObjectClicked;
  213. private Image img = null;
  214. private AbstractCanvasObject tempCps = null;
  215. // Time Stuff
  216. private TimePanel timePanel;
  217. public TimePanel getTimePanel() {
  218. return timePanel;
  219. }
  220. private AbstractCanvasObject temp = null;
  221. private String warningText = "Warning";
  222. private String saveBeforeNew = "Do you want to save your current data?";
  223. private String eraseCategory = "Do you really want to delete the Category ";
  224. private String selectObjBeforeErase = "Please select a Category or an Object in the left library in order to delete something.";
  225. private List<Outliner> outlinerList = new ArrayList<Outliner>();
  226. private List<FlexWindow> flexList = new ArrayList<FlexWindow>();
  227. private JMenuItem removeItem = new JMenuItem("Remove");
  228. /**
  229. * Create the application.
  230. *
  231. * @param control the Controller
  232. */
  233. GUI(Control control) {
  234. this.controller = control;
  235. this.model = control.getModel();
  236. inspector = new Inspector(control);
  237. control.setGui(this);
  238. control.calculateStateAndVisualForCurrentTimeStep();
  239. this.unitGraph = new UnitGraph(control);
  240. this.canvas = new Canvas(model, control, unitGraph);
  241. initialize();
  242. updateCategories(model.getCategories());
  243. control.OnCategoryChanged.addListener(() -> this.updateCategoryUI(model.getCategories()));
  244. }
  245. /**
  246. * Initialize the contents of the frame.
  247. */
  248. private void initialize() {
  249. holegJFrame = new JFrame();
  250. holegJFrame.setTitle("HOLEG Simulator");
  251. // try to restore old position/dimensions
  252. ArrayList<Integer> savedWindowDim = controller.loadSavedWindowDimensionsIfExistent();
  253. if (savedWindowDim.size() == 4) {
  254. holegJFrame.setBounds(savedWindowDim.get(0), savedWindowDim.get(1), savedWindowDim.get(2),
  255. savedWindowDim.get(3));
  256. }
  257. // if the upper part of the window is showing, the windows can still be
  258. // moved,
  259. // but if it is not, we need to move it to somewhere else
  260. if (savedWindowDim.size() != 4 || !isUpperPanelInsideBounds()) {
  261. holegJFrame.setBounds(100, 100, 1000, 800);
  262. holegJFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
  263. }
  264. holegJFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  265. holegJFrame.addWindowListener(new java.awt.event.WindowAdapter() {
  266. @Override
  267. public void windowClosing(java.awt.event.WindowEvent windowEvent) {
  268. if (JOptionPane.showConfirmDialog(holegJFrame, "Are you sure you want to exit?", "HOLEG",
  269. JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
  270. controller
  271. .deleteDirectory(new File(System.getProperty("user.home") + "/.config/HolonGUI/Autosave"));
  272. // try to save the position and size of the window, such
  273. // that (if possible)
  274. // it can be opened in the same position the next time
  275. try {
  276. controller.savePosAndSizeOfWindow(holegJFrame.getX(), holegJFrame.getY(),
  277. holegJFrame.getWidth(), holegJFrame.getHeight());
  278. } catch (Exception e) {
  279. e.printStackTrace();
  280. }
  281. System.exit(1);
  282. }
  283. System.exit(0);
  284. }
  285. });
  286. contentPane = (JPanel) holegJFrame.getContentPane();
  287. int condition = JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT;
  288. InputMap inputMap = contentPane.getInputMap(condition);
  289. ActionMap actionMap = contentPane.getActionMap();
  290. String cntrlZDown = "controlZ";
  291. inputMap.put(KeyStroke.getKeyStroke("control Z"), cntrlZDown);
  292. actionMap.put(cntrlZDown, new AbstractAction() {
  293. private static final long serialVersionUID = 1L;
  294. @Override
  295. public void actionPerformed(ActionEvent e) {
  296. try {
  297. controller.loadAutoSave(controller.getUndoSave());
  298. closeInvalidUpperNodeTabs();
  299. controller.calculateStateAndVisualForCurrentTimeStep();
  300. canvas.repaint();
  301. updateUpperNodes();
  302. } catch (IOException eex) {
  303. eex.printStackTrace();
  304. }
  305. }
  306. });
  307. String cntrlYDown = "controlY";
  308. inputMap.put(KeyStroke.getKeyStroke("control Y"), cntrlYDown);
  309. actionMap.put(cntrlYDown, new AbstractAction() {
  310. private static final long serialVersionUID = 1L;
  311. @Override
  312. public void actionPerformed(ActionEvent e) {
  313. try {
  314. controller.loadAutoSave(controller.getRedoSave());
  315. closeInvalidUpperNodeTabs();
  316. controller.calculateStateAndVisualForCurrentTimeStep();
  317. canvas.repaint();
  318. updateUpperNodes();
  319. } catch (IOException ex) {
  320. ex.printStackTrace();
  321. }
  322. }
  323. });
  324. String cntrlADown = "controlA";
  325. inputMap.put(KeyStroke.getKeyStroke("control A"), cntrlADown);
  326. AbstractAction controlA = new AbstractAction() {
  327. private static final long serialVersionUID = 1L;
  328. @Override
  329. public void actionPerformed(ActionEvent e) {
  330. chooseTabTemp();
  331. model.getSelectedObjects().clear();
  332. // Uppernode Canvas?
  333. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  334. Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
  335. if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
  336. GroupNodeCanvas uNC = (GroupNodeCanvas) canvasOrUpperNodeCanvas;
  337. controller.addSelectedObjects(uNC.getGroupNode().getNodes());
  338. uNC.repaint();
  339. // or Canvas?
  340. } else if (canvasOrUpperNodeCanvas instanceof Canvas) {
  341. controller.addSelectedObjects(model.getObjectsOnCanvas());
  342. canvas.repaint();
  343. }
  344. controller.getObjectsInDepth();
  345. }
  346. };
  347. actionMap.put(cntrlADown, controlA);
  348. String delDown = "delete";
  349. inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0, false), delDown);
  350. actionMap.put(delDown, new AbstractAction() {
  351. private static final long serialVersionUID = 1L;
  352. @Override
  353. public void actionPerformed(ActionEvent e) {
  354. chooseTabTemp();
  355. // Uppernode Canvas?
  356. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  357. Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
  358. // check whether a producer was deleted (this triggers a
  359. // complete re-evaluation of the net)
  360. boolean wasProducerDeleted = true;
  361. if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
  362. GroupNodeCanvas uNC = (GroupNodeCanvas) canvasOrUpperNodeCanvas;
  363. for (AbstractCanvasObject cps : model.getSelectedObjects()) {
  364. if (uNC.getGroupNode().getNodes().contains(cps)) {
  365. controller.delObjUpperNode(cps, uNC.getGroupNode());
  366. unc.setToolTip(false);
  367. // remove UpperNodeTab if UpperNode deleted
  368. removeUpperNodeTab(cps);
  369. }
  370. }
  371. uNC.repaint();
  372. controller.clearSelection();
  373. // or Canvas?
  374. } else if (canvasOrUpperNodeCanvas instanceof Canvas) {
  375. // Edge Deleting
  376. Edge edgeHighlight = model.getSelectedEdge();
  377. if (edgeHighlight != null) {
  378. controller.removeEdgesOnCanvas(edgeHighlight);
  379. ((Canvas) canvasOrUpperNodeCanvas).edgeHighlight = null;
  380. }
  381. canvas.setToolTip(false);
  382. for (AbstractCanvasObject cps : model.getSelectedObjects()) {
  383. controller.delCanvasObject(cps, false);
  384. // remove UpperNodeTab if UpperNode deleted
  385. removeUpperNodeTab(cps);
  386. }
  387. controller.clearSelection();
  388. controller.tryAutoSave();
  389. canvas.repaint();
  390. }
  391. // recalculate net if a producer was deleted
  392. if (wasProducerDeleted) {
  393. controller.resetSimulation();
  394. controller.calculateStateAndVisualForCurrentTimeStep();
  395. }
  396. model.getSelectedObjects().clear();
  397. }
  398. });
  399. String cntrlFDown = "controlF";
  400. inputMap.put(KeyStroke.getKeyStroke("control F"), cntrlFDown);
  401. actionMap.put(cntrlFDown, new AbstractAction() {
  402. private static final long serialVersionUID = 1L;
  403. @Override
  404. public void actionPerformed(ActionEvent e) {
  405. SearchPopUp dialog = new SearchPopUp(controller, canvas, holegJFrame);
  406. dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  407. dialog.setVisible(true);
  408. }
  409. });
  410. String cntrlCDown = "controlC";
  411. inputMap.put(KeyStroke.getKeyStroke("control C"), cntrlCDown);
  412. AbstractAction controlC = new AbstractAction() {
  413. private static final long serialVersionUID = 1L;
  414. @Override
  415. public void actionPerformed(ActionEvent e) {
  416. chooseTabTemp();
  417. System.out.println("heiCopy - control C");
  418. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  419. if (!model.getSelectedObjects().isEmpty()) {
  420. if (scrollPane.getViewport().getComponent(0) instanceof GroupNodeCanvas)
  421. controller.copy(((GroupNodeCanvas) scrollPane.getViewport().getComponent(0)).getGroupNode());
  422. else
  423. controller.copy(null);
  424. if (!model.getClipboradObjects().isEmpty()) {
  425. canvas.itemPaste.setEnabled(true);
  426. }
  427. }
  428. }
  429. };
  430. actionMap.put(cntrlCDown, controlC);
  431. String cntrlVDown = "controlV";
  432. inputMap.put(KeyStroke.getKeyStroke("control V"), cntrlVDown);
  433. AbstractAction controlV = new AbstractAction() {
  434. private static final long serialVersionUID = 1L;
  435. @Override
  436. public void actionPerformed(ActionEvent e) {
  437. try {
  438. tabTemp = null;
  439. if (tabbedPaneOriginal.getMousePosition() != null) {
  440. tabTemp = tabbedPaneOriginal;
  441. } else {
  442. }
  443. if (tabTemp == null)
  444. return;
  445. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  446. Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
  447. if (tabTemp != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
  448. controller.paste(((GroupNodeCanvas) canvasOrUpperNodeCanvas).getGroupNode(),
  449. canvasOrUpperNodeCanvas.getMousePosition());
  450. controller.calculateStateAndVisualForCurrentTimeStep();
  451. scrollPane.getViewport().getComponent(0).repaint();
  452. } else {
  453. controller.paste(null, canvas.getMousePosition());
  454. controller.calculateStateAndVisualForCurrentTimeStep();
  455. canvas.repaint();
  456. }
  457. } catch (HeadlessException | JsonParseException | UnsupportedFlavorException | IOException e1) {
  458. JLabel message = new JLabel("The Clipboard information cannot be pasted into Application.");
  459. JOptionPane.showMessageDialog(holegJFrame, message, "", JOptionPane.ERROR_MESSAGE);
  460. }
  461. }
  462. };
  463. actionMap.put(cntrlVDown, controlV);
  464. String cntrlXDown = "controlX";
  465. inputMap.put(KeyStroke.getKeyStroke("control X"), cntrlXDown);
  466. AbstractAction controlX = new AbstractAction() {
  467. private static final long serialVersionUID = 1L;
  468. @Override
  469. public void actionPerformed(ActionEvent e) {
  470. chooseTabTemp();
  471. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  472. if (!model.getSelectedObjects().isEmpty()) {
  473. if (scrollPane.getViewport().getComponent(0) instanceof GroupNodeCanvas) {
  474. controller.cut(((GroupNodeCanvas) scrollPane.getViewport().getComponent(0)).getGroupNode());
  475. controller.calculateStateAndVisualForCurrentTimeStep();
  476. scrollPane.getViewport().getComponent(0).repaint();
  477. } else {
  478. controller.cut(null);
  479. controller.calculateStateAndVisualForCurrentTimeStep();
  480. canvas.repaint();
  481. }
  482. if (!model.getClipboradObjects().isEmpty()) {
  483. canvas.itemPaste.setEnabled(true);
  484. }
  485. }
  486. }
  487. };
  488. actionMap.put(cntrlXDown, controlX);
  489. holegJFrame.setJMenuBar(menuBar);
  490. holegJFrame.setIconImage(ImageImport.loadImage("/Images/Holeg.png", 30, 30));
  491. menuBar.add(mnNewMenu);
  492. mnNewMenu.add(mntmNew);
  493. mnNewMenu.add(mntmOpen);
  494. mnNewMenu.add(mntmSave);
  495. menuBar.add(mnNewMenuEdit);
  496. mnNewMenuEdit.add(mntmUndo);
  497. mnNewMenuEdit.add(mntmRedo);
  498. mntmFindReplace.addActionListener(actionEvent -> {
  499. try {
  500. SearchPopUp dialog = new SearchPopUp(controller, canvas, holegJFrame);
  501. dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  502. dialog.setVisible(true);
  503. controller.getObjectsInDepth();
  504. } catch (Exception ex) {
  505. ex.printStackTrace();
  506. }
  507. });
  508. mnNewMenuEdit.add(mntmFindReplace);
  509. mnNewMenuEdit.add(mntmEditEdges);
  510. mntmEditEdges.addActionListener(actionEvent -> {
  511. EditEdgesPopUp edgePopUp = new EditEdgesPopUp(holegJFrame);
  512. edgePopUp.setCanvas(canvas);
  513. edgePopUp.setController(controller);
  514. edgePopUp.setVisible(true);
  515. });
  516. // Edit -> Align All
  517. mnNewMenuEdit.add(mntmAlignAll);
  518. mntmAlignAll.addActionListener(actionEvent -> {
  519. // getScrollPaneFromTabbedPane().getViewport().getComponent(0) is always the
  520. // active canvas
  521. AbstractCanvas activeCanvas = ((AbstractCanvas) getScrollPaneFromTabbedPane().getViewport()
  522. .getComponent(0));
  523. if (activeCanvas != null) {
  524. activeCanvas.tryToAlignObjects();
  525. activeCanvas.repaint();
  526. }
  527. });
  528. menuBar.add(mnNewMenuOptions);
  529. mnNewMenuOptions.add(mntmResetCategory);
  530. mntmResetCategory.addActionListener(actionEvent -> {
  531. ArrayList<Category> cat = model.getCategories();
  532. try {
  533. while (!cat.isEmpty()) {
  534. controller.deleteCategory(cat.get(0).getName());
  535. }
  536. controller.resetCategorys();
  537. } catch (Exception e2) {
  538. System.out.println(e2.getMessage());
  539. }
  540. categoryTree.revalidate();
  541. categoryTree.repaint();
  542. });
  543. /**
  544. * Add Fairness Model Option to the option Menu
  545. */
  546. mnNewMenuOptions.add(mnFairnessModel);
  547. mnFairnessModel.add(mntmFairMinFirst);
  548. mntmFairMinFirst.setForeground(Color.BLUE);
  549. mntmFairMinFirst
  550. .setToolTipText("HolonObjects with the smallest mininum Demand will be partially supplied first.\n"
  551. + "After that as many HolonObjects as possible will get fully supplied.");
  552. mntmFairMinFirst.addActionListener(arg0 -> {
  553. controller.setFairnessModel(FairnessModel.MininumDemandFirst);
  554. mntmFairMinFirst.setForeground(Color.BLUE);
  555. mntmFairAlleEqual.setForeground(mnFairnessModel.getForeground());
  556. controller.calculateStateAndVisualForCurrentTimeStep();
  557. // Update UpperNodes
  558. Component canvasOrUpperNodeCanvas = getScrollPaneFromTabbedPane().getViewport().getComponent(0);
  559. if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
  560. ((GroupNodeCanvas) canvasOrUpperNodeCanvas).repaint();
  561. }
  562. });
  563. mnFairnessModel.add(mntmFairAlleEqual);
  564. mntmFairAlleEqual.setToolTipText("HolonObjects will all get the same amount of energy.");
  565. mntmFairAlleEqual.addActionListener(arg0 -> {
  566. controller.setFairnessModel(FairnessModel.AllEqual);
  567. mntmFairAlleEqual.setForeground(Color.BLUE);
  568. mntmFairMinFirst.setForeground(mnFairnessModel.getForeground());
  569. controller.calculateStateAndVisualForCurrentTimeStep();
  570. // Update UpperNodes
  571. Component canvasOrUpperNodeCanvas = getScrollPaneFromTabbedPane().getViewport().getComponent(0);
  572. if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
  573. ((GroupNodeCanvas) canvasOrUpperNodeCanvas).repaint();
  574. }
  575. });
  576. menuBar.add(mnNewMenuView);
  577. mnNewMenuView.add(mntmCanvasSize);
  578. mntmCanvasSize.addActionListener(actionEvent -> {
  579. CanvasResizePopUp popUp = new CanvasResizePopUp(model, controller, canvas, this.tabbedPaneInnerOriginal,
  580. holegJFrame);
  581. popUp.setVisible(true);
  582. });
  583. tabbedPaneInnerOriginal.addChangeListener(change -> {
  584. controller.clearSelection();
  585. });
  586. mnNewMenuView.add(mntmCanvasSize);
  587. /*
  588. * Adds Checkbox to turn supply bars on/off
  589. */
  590. mnNewMenuView.add(showSupplyBarsCheckBox);
  591. showSupplyBarsCheckBox.setSelected(true);
  592. showSupplyBarsCheckBox.addActionListener(arg0 -> {
  593. controller.setShowSupplyBars(showSupplyBarsCheckBox.isSelected());
  594. canvas.repaint();
  595. // Update UpperNodes
  596. JScrollPane spane = getScrollPaneFromTabbedPane();
  597. if (spane != null) {
  598. Component canvasOrUpperNodeCanvas = spane.getViewport().getComponent(0);
  599. if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
  600. ((GroupNodeCanvas) canvasOrUpperNodeCanvas).repaint();
  601. }
  602. }
  603. });
  604. initWindowMenu();
  605. mnNewMenuView.add(mntmBackground);
  606. mntmBackground.addActionListener(actionEvent -> {
  607. tabTemp = tabbedPaneOriginal;
  608. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  609. if (scrollPane.getViewport().getComponent(0) instanceof Canvas) {
  610. BackgroundPopUp backgroundDialog = new BackgroundPopUp(model, controller, canvas, null, holegJFrame);
  611. backgroundDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  612. backgroundDialog.setVisible(true);
  613. } else if (scrollPane.getViewport().getComponent(0) instanceof GroupNodeCanvas) {
  614. GroupNodeCanvas uNodeCanvas = (GroupNodeCanvas) (scrollPane.getViewport().getComponent(0));
  615. BackgroundPopUp backgroundDialog = new BackgroundPopUp(model, controller, null,
  616. uNodeCanvas.getGroupNode(), holegJFrame);
  617. backgroundDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
  618. backgroundDialog.setVisible(true);
  619. uNodeCanvas.repaint();
  620. }
  621. });
  622. /**
  623. * add Help Menu and its items
  624. */
  625. menuBar.add(mnHelp);
  626. mnHelp.add(mntmIntroduction);
  627. mnHelp.add(mntmUserManual);
  628. mnHelp.add(mntmAlgorithmHelp);
  629. mnHelp.add(mntmCodeDoc);
  630. mnHelp.add(mntmAboutUs);
  631. canvas.setBackground(Color.WHITE);
  632. canvas.setPreferredSize(new Dimension(model.getCanvasX(), model.getCanvasY()));
  633. /********************
  634. * RIGHT CONTAINER (INFORMATION)
  635. **********************/
  636. panelHolonEl.setLayout(new BoxLayout(panelHolonEl, BoxLayout.X_AXIS));
  637. toolBarHolonEl.setFloatable(false);
  638. panelHolonEl.add(toolBarHolonEl);
  639. /***********************
  640. * HolonElement Graph Actions
  641. **********************/
  642. /*
  643. * Update Local Period of an Element Graph
  644. */
  645. unitGraphLocalPeriod.addKeyListener(new KeyAdapter() {
  646. @Override
  647. public void keyReleased(KeyEvent e) {
  648. try {
  649. int localLength = Integer.parseInt(unitGraphLocalPeriod.getText());
  650. unitGraphLocalPeriod.setBackground(Color.WHITE);
  651. /**
  652. * set local graph Period
  653. */
  654. if (e.getKeyCode() == KeyEvent.VK_ENTER)
  655. unitGraph.setLocalPeriod(localLength);
  656. } catch (NumberFormatException ex) {
  657. unitGraphLocalPeriod.setBackground(PALE_RED);
  658. }
  659. }
  660. });
  661. /*****************************
  662. * RIGHT CONTAINER DONE
  663. *****************************/
  664. holegJFrame.getContentPane().setLayout(new BorderLayout(0, 0));
  665. /****************
  666. * Tree Stuff
  667. ****************/
  668. // Override Key Actions
  669. inputMap = categoryTree.getInputMap();
  670. inputMap.put(KeyStroke.getKeyStroke("control C"), cntrlCDown);
  671. inputMap.put(KeyStroke.getKeyStroke("control V"), cntrlVDown);
  672. inputMap.put(KeyStroke.getKeyStroke("control X"), cntrlXDown);
  673. inputMap.put(KeyStroke.getKeyStroke("control A"), cntrlADown);
  674. TreeCellRenderer customRenderer = new TreeCellRenderer() {
  675. @Override
  676. public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
  677. boolean leaf, int row, boolean hasFocus) {
  678. JLabel label = new JLabel();
  679. Image imgR;
  680. if (leaf) {
  681. for (Category cat : model.getCategories()) {
  682. for (AbstractCanvasObject cps : cat.getObjects()) {
  683. if (value.toString().compareTo(cps.getName()) == 0) {
  684. imgR = ImageImport.loadImage(cps.getImage(), 50, 50);
  685. if (imgR != null) {
  686. label.setIcon(new ImageIcon(imgR));
  687. }
  688. label.setText(cps.getName());
  689. }
  690. }
  691. }
  692. }
  693. tree.setRowHeight(50);
  694. if (hasFocus) {
  695. label.setForeground(new Color(0, 0, 255));
  696. label.setOpaque(true);
  697. }
  698. if (label.getText().length() == 0) {
  699. label.setText(value.toString());
  700. if (value.toString().compareTo("Categories") != 0) {
  701. label.setIcon(new ImageIcon(ImageImport.loadImage("/Images/folder.png")));
  702. }
  703. }
  704. return label;
  705. }
  706. };
  707. categoryTree.setCellRenderer(customRenderer);
  708. categoryTree.addMouseMotionListener(new MouseMotionAdapter() {
  709. public void mouseDragged(MouseEvent e) {
  710. checkForDragAndDrop(e);
  711. }
  712. /**
  713. * checks if an object of the current Panel could be replaced by the dragged
  714. * object
  715. *
  716. * @param e
  717. */
  718. private void checkForDragAndDrop(MouseEvent e) {
  719. try {
  720. /**
  721. * if no object gets dragged -> finished
  722. */
  723. if (!dragging)
  724. return;
  725. /**
  726. * select the current Panel
  727. */
  728. chooseTabTemp();
  729. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  730. if (scrollPane == null)
  731. return;
  732. Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
  733. /**
  734. * check for replacements on the canvas
  735. */
  736. if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
  737. GroupNodeCanvas unc = (GroupNodeCanvas) canvasOrUpperNodeCanvas;
  738. if (unc.getMousePosition() == null)
  739. return;
  740. int x = (int) unc.getMousePosition().getX() + 16;
  741. int y = (int) unc.getMousePosition().getY() + 16;
  742. /**
  743. * check for replacement
  744. */
  745. unc.checkForReplacement(x, y);
  746. /**
  747. * repaint
  748. */
  749. unc.invalidate();
  750. unc.repaint();
  751. } else {
  752. if (canvas.getMousePosition() == null)
  753. return;
  754. int x = (int) canvas.getMousePosition().getX() + 16;
  755. int y = (int) canvas.getMousePosition().getY() + 16;
  756. /**
  757. * check for replacement
  758. */
  759. canvas.checkForReplacement(x, y);
  760. /**
  761. * repaint
  762. */
  763. canvas.invalidate();
  764. canvas.repaint();
  765. }
  766. contentPane.updateUI();
  767. } catch (Exception eex) {
  768. eex.printStackTrace();
  769. }
  770. }
  771. });
  772. categoryTree.addMouseListener(new MouseAdapter() {
  773. public void mouseReleased(MouseEvent e) {
  774. try {
  775. if (dragging) {
  776. chooseTabTemp();
  777. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  778. Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
  779. if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas) {
  780. GroupNodeCanvas unc = (GroupNodeCanvas) canvasOrUpperNodeCanvas;
  781. int x = (int) unc.getMousePosition().getX() + 16;
  782. int y = (int) unc.getMousePosition().getY() + 16;
  783. AbstractCanvasObject h = null;
  784. if (tempCps instanceof HolonObject) {
  785. h = new HolonObject((HolonObject) tempCps);
  786. }
  787. if (tempCps instanceof HolonSwitch) {
  788. h = new HolonSwitch(tempCps);
  789. }
  790. h.setPosition(x, y);
  791. /**
  792. * close UpperNodeTabs of replaced UpperNode
  793. */
  794. if (unc.mayBeReplaced != null && unc.mayBeReplaced instanceof GroupNode) {
  795. unc.closeUpperNodeTab(unc.mayBeReplaced.getId());
  796. }
  797. controller.addObjUpperNode(h, unc.getGroupNode());
  798. /**
  799. * object would be replaced
  800. */
  801. unc.mayBeReplaced = null;
  802. unc.invalidate();
  803. controller.calculateStateAndVisualForCurrentTimeStep();
  804. unc.repaint();
  805. unc.setXY((int) canvas.getMousePosition().getX(), (int) canvas.getMousePosition().getY());
  806. } else {
  807. int x = (int) canvas.getMousePosition().getX() + 16;
  808. int y = (int) canvas.getMousePosition().getY() + 16;
  809. AbstractCanvasObject h = null;
  810. if (tempCps instanceof HolonObject) {
  811. h = new HolonObject((HolonObject) tempCps);
  812. }
  813. if (tempCps instanceof HolonSwitch) {
  814. h = new HolonSwitch(tempCps);
  815. }
  816. h.setPosition(x, y);
  817. /**
  818. * close UpperNodeTabs of replaced UpperNode
  819. */
  820. if (canvas.mayBeReplaced != null && canvas.mayBeReplaced instanceof GroupNode) {
  821. canvas.closeUpperNodeTab(canvas.mayBeReplaced.getId());
  822. }
  823. controller.addObjectCanvas(h);
  824. /**
  825. * no object should get replaced
  826. */
  827. canvas.mayBeReplaced = null;
  828. canvas.invalidate();
  829. canvas.setXY((int) canvas.getMousePosition().getX(),
  830. (int) canvas.getMousePosition().getY());
  831. canvas.repaint();
  832. }
  833. controller.calculateStateAndVisualForCurrentTimeStep();
  834. contentPane.updateUI();
  835. dragging = false;
  836. }
  837. } catch (Exception eex) {
  838. }
  839. holegJFrame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
  840. }
  841. });
  842. popmenuEdit.add(editItem);
  843. popmenuEdit.add(removeItem);
  844. editItem.setEnabled(false);
  845. editItem.addActionListener(actionEvent -> {
  846. });
  847. categoryTree.addMouseListener(new MouseAdapter() {
  848. public void mousePressed(MouseEvent e) {
  849. try {
  850. actualObjectClicked = categoryTree.getPathForLocation(e.getX(), e.getY()).getLastPathComponent()
  851. .toString();
  852. // if an Object was selected, the porperties are shown in
  853. // the table
  854. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) categoryTree
  855. .getPathForLocation(e.getX(), e.getY()).getLastPathComponent();
  856. if (selectedNode.getLevel() == 2) {
  857. controller.searchCategoryObject(selectedNode.getParent().toString(), selectedNode.toString());
  858. // if (selected instanceof HolonObject && selected !=
  859. // null) {
  860. // selected = (HolonObject) selected;
  861. // fillElementTable(((HolonObject)
  862. // selected).getElements());
  863. // }
  864. }
  865. if (SwingUtilities.isRightMouseButton(e)) {
  866. for (Category cat : model.getCategories()) {
  867. for (AbstractCanvasObject cps : cat.getObjects()) {
  868. if (actualObjectClicked.compareTo(cps.getName()) == 0
  869. && !(cps instanceof HolonSwitch)) {
  870. editItem.setEnabled(true);
  871. popmenuEdit.show(e.getComponent(), e.getX(), e.getY());
  872. catOfObjToBeEdited = selectedNode.getParent().toString();
  873. tempCps = cps;
  874. }
  875. }
  876. }
  877. } else {
  878. for (Category cat : model.getCategories()) {
  879. for (AbstractCanvasObject cps : cat.getObjects()) {
  880. if (actualObjectClicked.compareTo(cps.getName()) == 0) {
  881. File checkPath = new File(cps.getImage());
  882. if (checkPath.exists()) {
  883. img = new ImageIcon(cps.getImage()).getImage().getScaledInstance(32, 32,
  884. java.awt.Image.SCALE_SMOOTH);
  885. } else {
  886. img = ImageImport.loadImage(cps.getImage(), 32, 32);
  887. }
  888. tempCps = cps;
  889. dragging = true;
  890. Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(img, new Point(0, 0),
  891. "Image");
  892. holegJFrame.setCursor(cursor);
  893. }
  894. }
  895. }
  896. }
  897. } catch (Exception eex) {
  898. }
  899. }
  900. });
  901. editItem.addActionListener(actionEvent -> {
  902. // Remove the selected Object object
  903. // AddObjectPopUp(boolean edit, AbstractCpsObject obj, String cat, JFrame
  904. // parentFrame)
  905. System.out.println("Edit");
  906. addObjectPopUP = new AddObjectPopUp(true, tempCps, catOfObjToBeEdited, holegJFrame);
  907. addObjectPopUP.setCategory(catOfObjToBeEdited);
  908. addObjectPopUP.setController(controller);
  909. addObjectPopUP.setVisible(true);
  910. });
  911. removeItem.addActionListener(actionEvent -> {
  912. // Remove the selected Object object
  913. try {
  914. System.out.println("catOfObjToBeEdited:" + catOfObjToBeEdited + ", tempCps:" + tempCps);
  915. controller.delObjectCategory(catOfObjToBeEdited, tempCps.getName());
  916. } catch (IOException e) {
  917. System.err.println("IOException");
  918. e.printStackTrace();
  919. }
  920. });
  921. scrollPane1.setViewportView(categoryTree);
  922. scrollPane1.setColumnHeaderView(panel);
  923. panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
  924. toolBar.setAlignmentX(Component.LEFT_ALIGNMENT);
  925. toolBar.setFloatable(false);
  926. panel.add(toolBar);
  927. btnAddPopUp.add(mItemNew);
  928. mItemNew.addActionListener(actionEvent -> {
  929. new CreateNewDialog(controller, holegJFrame);
  930. });
  931. btnAddPopUp.addSeparator();
  932. btnAddPopUp.add(mItemCategory);
  933. mItemCategory.addActionListener(actionEvent -> {
  934. new CreateNewDialog(controller, Option.Category, holegJFrame);
  935. });
  936. btnAddPopUp.add(mItemObject);
  937. mItemObject.addActionListener(actionEvent -> {
  938. new CreateNewDialog(controller, Option.Object, holegJFrame);
  939. });
  940. btnAddPopUp.add(mItemSwitch);
  941. mItemSwitch.addActionListener(actionEvent -> {
  942. new CreateNewDialog(controller, Option.Switch, holegJFrame);
  943. });
  944. btnAdd.addActionListener(actionEvent -> btnAddPopUp.show(btnAdd, -1, +20));
  945. btnAdd.setIcon(new ImageIcon(ImageImport.loadImage("Images/plus.png", 16, 16)));
  946. btnAdd.setToolTipText("<html><b>New</b><br>Add a new Category or Item to the library.</html>");
  947. toolBar.add(btnAdd);
  948. /**
  949. * Help Menu Action Listeners
  950. */
  951. /**
  952. * URL of the telecommunication git Wiki
  953. */
  954. String tkWikiWebpage = "https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons/wiki/";
  955. /** open Introduction Web Page */
  956. mntmIntroduction.addMouseListener(new MouseAdapter() {
  957. @Override
  958. public void mousePressed(MouseEvent e) {
  959. openWebpage(tkWikiWebpage + "Introduction+V2.1");
  960. }
  961. });
  962. /** open UserManual WebPage */
  963. mntmUserManual.addMouseListener(new MouseAdapter() {
  964. @Override
  965. public void mousePressed(MouseEvent e) {
  966. openWebpage(tkWikiWebpage + "User+Manual+V2.1");
  967. }
  968. });
  969. /** open Algorithm Help Web Page */
  970. mntmAlgorithmHelp.addMouseListener(new MouseAdapter() {
  971. @Override
  972. public void mousePressed(MouseEvent e) {
  973. openWebpage(tkWikiWebpage + "Algorithms+V2.1");
  974. }
  975. });
  976. /** open Code Documentation Web Page */
  977. mntmCodeDoc.addMouseListener(new MouseAdapter() {
  978. @Override
  979. public void mousePressed(MouseEvent e) {
  980. openWebpage(tkWikiWebpage + "Code+documentation+V2.1");
  981. }
  982. });
  983. /**
  984. * Pop up - About Us with some important information about the developers,
  985. * source and programming stuff
  986. */
  987. mntmAboutUs.addMouseListener(new MouseAdapter() {
  988. @Override
  989. public void mousePressed(MouseEvent e) {
  990. aboutUsPopUp = new AboutUsPopUp(holegJFrame);
  991. aboutUsPopUp.setVisible(true);
  992. }
  993. });
  994. // Del Button
  995. btnDel.addActionListener(actionEvent -> {
  996. Object nodeInfo = categoryTree.getLastSelectedPathComponent();
  997. if (nodeInfo != null) {
  998. DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) nodeInfo;
  999. String nodeName = selectedNode.getUserObject().toString();
  1000. int depthOfNode = selectedNode.getLevel();
  1001. try {
  1002. switch (depthOfNode) {
  1003. case 1:
  1004. int dialogResult = JOptionPane.showConfirmDialog(holegJFrame, eraseCategory + nodeName + "?",
  1005. warningText, JOptionPane.YES_NO_OPTION);
  1006. if (dialogResult == JOptionPane.YES_OPTION) {
  1007. controller.deleteCategory(nodeName);
  1008. }
  1009. break;
  1010. case 2:
  1011. DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();
  1012. controller.delObjectCategory(parent.getUserObject().toString(), nodeName);
  1013. break;
  1014. default:
  1015. JOptionPane.showMessageDialog(holegJFrame, selectObjBeforeErase);
  1016. }
  1017. } catch (Exception e2) {
  1018. }
  1019. } else {
  1020. JOptionPane.showMessageDialog(holegJFrame, selectObjBeforeErase);
  1021. }
  1022. categoryTree.repaint();
  1023. });
  1024. btnDel.setIcon(new ImageIcon(ImageImport.loadImage("Images/minus.png", 16, 16)));
  1025. btnDel.setToolTipText("<html><b>Delete</b><br>Removes a Category or a Category Item.</html>");
  1026. toolBar.add(btnDel);
  1027. holegJFrame.getContentPane().add(splitPane);
  1028. mntmNew.addActionListener(actionEvent -> {
  1029. if (model.getObjectsOnCanvas().size() != 0) {
  1030. int newWarning = JOptionPane.YES_NO_OPTION;
  1031. int dialogForNewWarning = JOptionPane.showConfirmDialog(holegJFrame, saveBeforeNew, warningText,
  1032. newWarning);
  1033. if (dialogForNewWarning == JOptionPane.YES_OPTION) {
  1034. mntmSave.doClick();
  1035. }
  1036. }
  1037. // Remove all but main tab
  1038. while (tabbedPaneInnerOriginal.getTabCount() > 1) {
  1039. tabbedPaneInnerOriginal.remove(1);
  1040. }
  1041. controller.clearSelection();
  1042. model.getEdgesOnCanvas().clear();
  1043. model.getObjectsOnCanvas().clear();
  1044. controller.OnSelectionChanged.broadcast();
  1045. controller.setSelectedObjectID(0);
  1046. controller.setSelecteEdge(null);
  1047. controller.setCurIteration(0);
  1048. elementGraph.setText("None");
  1049. canvas.tempCps = null;
  1050. canvas.repaint();
  1051. IdCounter.resetObjectCounter(CounterType.Object);
  1052. IdCounter.resetObjectCounter(CounterType.Element);
  1053. controller.calculateStateAndVisualForCurrentTimeStep();
  1054. });
  1055. mntmOpen.addActionListener(new ActionListener() {
  1056. @Override
  1057. public void actionPerformed(ActionEvent evt) {
  1058. menuFileExitActionPerformed();
  1059. }
  1060. private void menuFileExitActionPerformed() {
  1061. JFileChooser fileChooser = new JFileChooser();
  1062. fileChooser.setCurrentDirectory(new File(System.getProperty("user.dir") + "/exampleNetworks/"));
  1063. FileNameExtensionFilter holonFilter = new FileNameExtensionFilter("Holon Save File(*.holon)", "holon");
  1064. fileChooser.setFileFilter(holonFilter);
  1065. if (fileChooser.showOpenDialog(holegJFrame) == JFileChooser.APPROVE_OPTION) {
  1066. File file = fileChooser.getSelectedFile();
  1067. try {
  1068. while (tabbedPaneInnerOriginal.getTabCount() > 1) {
  1069. tabbedPaneInnerOriginal.remove(1);
  1070. }
  1071. model.getSelectedObjects().clear();
  1072. controller.loadFile(file.getAbsolutePath());
  1073. canvas.repaint();
  1074. categoryTree.repaint();
  1075. controller.calculateStateAndVisualForCurrentTimeStep();
  1076. } catch (IOException | ArchiveException e) {
  1077. e.printStackTrace();
  1078. JLabel message = new JLabel("The savefile is corrupt and cannot be opened.");
  1079. JOptionPane.showMessageDialog(holegJFrame, message, "", JOptionPane.ERROR_MESSAGE);
  1080. }
  1081. }
  1082. }
  1083. });
  1084. mntmSave.addActionListener(new ActionListener() {
  1085. @Override
  1086. public void actionPerformed(ActionEvent evt) {
  1087. menuSaveActionPerformed();
  1088. }
  1089. private void menuSaveActionPerformed() {
  1090. JFileChooser fileChooser = new JFileChooser();
  1091. FileNameExtensionFilter holonFilter = new FileNameExtensionFilter("Holon Save File(*.holon)", "holon");
  1092. fileChooser.setFileFilter(holonFilter);
  1093. if (fileChooser.showSaveDialog(holegJFrame) == JFileChooser.APPROVE_OPTION) {
  1094. File selectedFile = fileChooser.getSelectedFile();
  1095. String fileName = selectedFile.getName();
  1096. String fullPath = fileChooser.getSelectedFile().getPath();
  1097. if (fileChooser.getFileFilter().equals(holonFilter)) {
  1098. if (!fileName.contains("."))
  1099. fullPath += ".holon";
  1100. }
  1101. if (!fullPath.endsWith(".holon")) {
  1102. String suffix = fullPath.substring(fullPath.lastIndexOf("."), fullPath.length());
  1103. String[] options = new String[] { "keep .holon", "use " + suffix };
  1104. JLabel message = new JLabel(
  1105. "Are you sure to use the extension \"" + suffix + "\" instead of \".holon\"?");
  1106. int response = JOptionPane.showOptionDialog(holegJFrame, message, "",
  1107. JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]);
  1108. if (response == 0)
  1109. fullPath = fullPath.replace(suffix, ".holon");
  1110. }
  1111. try {
  1112. controller.saveFile(new File(fullPath).getAbsolutePath());
  1113. } catch (IOException | ArchiveException e) {
  1114. e.printStackTrace();
  1115. }
  1116. }
  1117. }
  1118. });
  1119. mntmUndo.addActionListener(new ActionListener() {
  1120. @Override
  1121. public void actionPerformed(ActionEvent evt) {
  1122. menuUndoActionPerformed();
  1123. }
  1124. private void menuUndoActionPerformed() {
  1125. try {
  1126. controller.loadAutoSave(controller.getUndoSave());
  1127. closeInvalidUpperNodeTabs();
  1128. controller.calculateStateAndVisualForCurrentTimeStep();
  1129. canvas.repaint();
  1130. } catch (IOException e) {
  1131. e.printStackTrace();
  1132. }
  1133. }
  1134. });
  1135. mntmRedo.addActionListener(new ActionListener() {
  1136. @Override
  1137. public void actionPerformed(ActionEvent evt) {
  1138. menuRedoActionPerformed();
  1139. }
  1140. private void menuRedoActionPerformed() {
  1141. try {
  1142. controller.loadAutoSave(controller.getRedoSave());
  1143. closeInvalidUpperNodeTabs();
  1144. controller.calculateStateAndVisualForCurrentTimeStep();
  1145. canvas.repaint();
  1146. } catch (IOException e) {
  1147. e.printStackTrace();
  1148. }
  1149. }
  1150. });
  1151. timePanel = new TimePanel(controller);
  1152. timePanel.setBorder(null);
  1153. timePanel.getTimeSlider().addChangeListener(changeEvent -> {
  1154. // TimeSliderChanged event
  1155. controller.calculateStateAndVisualForTimeStep(timePanel.getTimeSlider().getValue());
  1156. unitGraph.repaint();
  1157. contentPane.updateUI();
  1158. });
  1159. splitPane1.setMinimumSize(new Dimension(0, 25));
  1160. splitPane.setRightComponent(splitPane1);
  1161. splitPane.setDividerLocation(200);
  1162. splitPane1.setDividerLocation(500);
  1163. splitPane.setLeftComponent(scrollPane1);
  1164. tabbedPaneOriginal.addTab("View", tabbedPaneInnerOriginal);
  1165. myPanel.add(canvasSP, BorderLayout.CENTER);
  1166. tabbedPaneInnerOriginal.addTab("Main Grid", myPanel);
  1167. splitPane1.setLeftComponent(tabbedPaneOriginal);
  1168. splitPane1.setRightComponent(splitHolonElPro);
  1169. splitPane1.setResizeWeight(0.9);
  1170. splitHolonElPro.setDividerLocation(700);
  1171. // containing the graph and the elements-list
  1172. splitHolonElPro.setTopComponent(splitGraphHolonEl);
  1173. // containing the object's properties
  1174. splitHolonElPro.setBottomComponent(scrollProperties);
  1175. splitGraphHolonEl.setTopComponent(inspector);
  1176. splitGraphHolonEl.setDividerLocation(distanceBetweenElementsAndGraph);
  1177. canvasSP.setViewportView(canvas);
  1178. tabbedPaneOriginal.setBorder(null);
  1179. scrollProperties.setBorder(null);
  1180. splitPane.setBorder(null);
  1181. splitPane1.setBorder(null);
  1182. splitHolonElPro.setBorder(null);
  1183. splitGraphHolonEl.setBorder(null);
  1184. panelHolonEl.setBorder(null);
  1185. canvasSP.setBorder(null);
  1186. holegJFrame.getContentPane().add(timePanel, BorderLayout.SOUTH);
  1187. try {
  1188. controller.loadAutoSave(System.getProperty("user.home") + "/.config/HolonGUI/Category/Category.json");
  1189. } catch (IOException e1) {
  1190. }
  1191. String autoPath = System.getProperty("user.home") + "/.config/HolonGUI/Autosave/";
  1192. File dest = new File(autoPath);
  1193. ArrayList<File> oldAutoSaves = controller.filterOldAutoSaveFiles();
  1194. int nrOfOldSaves = oldAutoSaves.size();
  1195. if (nrOfOldSaves > 0) {
  1196. int dialogButton = JOptionPane.YES_NO_OPTION;
  1197. int dialogResult = JOptionPane.showConfirmDialog(holegJFrame,
  1198. "Old autosave file was found, should it be loaded?", warningText, dialogButton);
  1199. if (dialogResult == JOptionPane.YES_OPTION) {
  1200. if (dest.exists()) {
  1201. model.setAutoSaveNr(nrOfOldSaves - 1);
  1202. mntmRedo.doClick();
  1203. } else {
  1204. JOptionPane.showMessageDialog(holegJFrame, "Autosave could not be loaded.");
  1205. setUpAutoSave(dest);
  1206. }
  1207. } else {
  1208. setUpAutoSave(dest);
  1209. }
  1210. // after all: delete the obsolete/old autosave files from the
  1211. // directory
  1212. controller.deleteObsoleteAutoSaveFiles();
  1213. }
  1214. canvasSP.addComponentListener(new ComponentAdapter() {
  1215. @Override
  1216. public void componentResized(ComponentEvent e) {
  1217. controller.setCanvasX(Math.max(model.getCanvasX(), canvasSP.getViewport().getWidth()));
  1218. controller.setCanvasY(Math.max(model.getCanvasY(), canvasSP.getViewport().getHeight()));
  1219. canvas.repaint();
  1220. }
  1221. });
  1222. }
  1223. private void initWindowMenu() {
  1224. menuBar.add(menuWindow);
  1225. // Algo
  1226. JMenuItem openMenu = new JMenuItem("Open Algorithm Panel", new ImageIcon(ImageImport
  1227. .loadImage("/Button_Images/iconAlgo.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
  1228. openMenu.addActionListener(actionEvent -> {
  1229. new AddOnWindow(holegJFrame, controller);
  1230. });
  1231. openMenu.setAccelerator(KeyStroke.getKeyStroke('N', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()));
  1232. menuWindow.add(openMenu);
  1233. // Outliner
  1234. JMenuItem openOutliner = new JMenuItem("Open Outliner", new ImageIcon(ImageImport
  1235. .loadImage("/Button_Images/iconOutliner.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
  1236. openOutliner.addActionListener(actionEvent -> {
  1237. outlinerList.add(new Outliner(holegJFrame, model, controller));
  1238. });
  1239. openOutliner
  1240. .setAccelerator(KeyStroke.getKeyStroke('O', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()));
  1241. menuWindow.add(openOutliner);
  1242. // FlexWindow
  1243. JMenuItem openFlexMenuItem = new JMenuItem("Open Flexibility Panel", new ImageIcon(ImageImport
  1244. .loadImage("/Button_Images/iconAlgo.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
  1245. openFlexMenuItem.addActionListener(actionEvent -> {
  1246. flexList.add(new FlexWindow(holegJFrame, controller));
  1247. });
  1248. openFlexMenuItem
  1249. .setAccelerator(KeyStroke.getKeyStroke('L', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()));
  1250. menuWindow.add(openFlexMenuItem);
  1251. }
  1252. public void updateOutliners(DecoratedState state) {
  1253. // remove closed Outliner
  1254. ListIterator<Outliner> iter = outlinerList.listIterator();
  1255. while (iter.hasNext()) {
  1256. if (iter.next().isClosed)
  1257. iter.remove();
  1258. }
  1259. // update open Outliner
  1260. for (Outliner out : outlinerList) {
  1261. out.repaintWithDecoratedState(state);
  1262. }
  1263. }
  1264. public void updateFlexWindows() {
  1265. // remove closed Outliner
  1266. ListIterator<FlexWindow> iter = flexList.listIterator();
  1267. while (iter.hasNext()) {
  1268. if (iter.next().isClosed)
  1269. iter.remove();
  1270. }
  1271. // update open Flex
  1272. for (FlexWindow out : flexList) {
  1273. out.update();
  1274. }
  1275. }
  1276. private boolean isUpperPanelInsideBounds() {
  1277. int x = holegJFrame.getX();
  1278. int y = holegJFrame.getY();
  1279. int width = holegJFrame.getWidth();
  1280. // get all connected screen devices
  1281. GraphicsDevice[] screenDevices = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
  1282. boolean isUpperPanelVisible = false;
  1283. // and check whether they contain the upper left or upper right point of
  1284. // the frame
  1285. for (GraphicsDevice device : screenDevices) {
  1286. Rectangle bounds = device.getDefaultConfiguration().getBounds();
  1287. if (bounds.contains(x, y) || bounds.contains(x + width, y)) {
  1288. isUpperPanelVisible = true;
  1289. break;
  1290. }
  1291. }
  1292. return isUpperPanelVisible;
  1293. }
  1294. /**
  1295. * Sets up autosave if no old one is loaded at the beginning
  1296. *
  1297. * @param dest path to save-folder
  1298. */
  1299. private void setUpAutoSave(File dest) {
  1300. dest.mkdirs();
  1301. try {
  1302. controller.autoSave();
  1303. } catch (IOException e1) {
  1304. e1.printStackTrace();
  1305. }
  1306. }
  1307. /**
  1308. * reloads the Categories from Model.
  1309. *
  1310. * @param categories the current categories
  1311. */
  1312. private void updateCategories(final ArrayList<Category> categories) {
  1313. DefaultTreeModel treemodel = new DefaultTreeModel(new DefaultMutableTreeNode("Categories") {
  1314. private static final long serialVersionUID = 1L;
  1315. {
  1316. DefaultMutableTreeNode node1;
  1317. for (Category c : categories) {
  1318. node1 = new DefaultMutableTreeNode(c.getName());
  1319. for (AbstractCanvasObject obj : c.getObjects()) {
  1320. node1.add(new DefaultMutableTreeNode(obj.getName()));
  1321. }
  1322. add(node1);
  1323. }
  1324. }
  1325. });
  1326. categoryTree.setModel(treemodel);
  1327. }
  1328. /**
  1329. * When changes are made to the Categories.
  1330. *
  1331. * @param categories the Categories
  1332. */
  1333. public void updateCategoryUI(ArrayList<Category> categories) {
  1334. DefaultTreeModel model = (DefaultTreeModel) categoryTree.getModel();
  1335. updateCategories(categories);
  1336. model.reload();
  1337. }
  1338. void setVisible(boolean value) {
  1339. holegJFrame.setVisible(value);
  1340. }
  1341. /*
  1342. * Open a new Tab with an UpperNodeCanvas
  1343. */
  1344. public void openNewUpperNodeTab(GroupNode node) {
  1345. chooseTabTemp();
  1346. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  1347. if (scrollPane.getViewport().getComponent(0) instanceof Canvas) {
  1348. unc = new GroupNodeCanvas(model, controller, unitGraph, node, "",
  1349. scrollPane.getViewport().getComponent(0));
  1350. } else {
  1351. unc = new GroupNodeCanvas(model, controller, unitGraph, node,
  1352. ((GroupNodeCanvas) scrollPane.getViewport().getComponent(0)).getParentPath() + " -> ",
  1353. scrollPane.getViewport().getComponent(0));
  1354. }
  1355. // check if tab already open for clicked NodeOfNode
  1356. boolean dupl = false;
  1357. for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
  1358. JScrollPane paneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
  1359. if (paneOriginal != null && ((GroupNodeCanvas) paneOriginal.getViewport().getComponent(0)).getGroupNode()
  1360. .getId() == node.getId()) {
  1361. dupl = true;
  1362. // set selected component to view
  1363. tabbedPaneOriginal.setSelectedComponent(tabbedPaneInnerOriginal);
  1364. // set selected tab in view to found upper-node-canvas
  1365. tabbedPaneInnerOriginal.setSelectedComponent(tabbedPaneInnerOriginal.getComponentAt(i));
  1366. }
  1367. // if we found a duplicate, break
  1368. if (dupl) {
  1369. break;
  1370. }
  1371. }
  1372. if (!dupl) {
  1373. JScrollPane sp = new JScrollPane(unc);
  1374. sp.setBorder(null);
  1375. // Selected tabbed Pane = tabbedPaneOriginal or tabbedPaneSplit
  1376. if (tabTemp == tabbedPaneOriginal) {
  1377. this.tabbedPaneInnerOriginal.add(node.getName(), sp);
  1378. this.tabbedPaneInnerOriginal.setSelectedComponent(sp);
  1379. this.tabbedPaneInnerOriginal.setTabComponentAt(this.tabbedPaneInnerOriginal.getTabCount() - 1,
  1380. new ButtonTabComponent(this.tabbedPaneInnerOriginal));
  1381. }
  1382. }
  1383. }
  1384. // TODO refactor tabbedPane and access to groupNodeViews
  1385. private void updateUpperNodes() {
  1386. for (Component c : tabbedPaneInnerOriginal.getComponents()) {
  1387. if (!(c instanceof JScrollPane)) {
  1388. continue;
  1389. }
  1390. Component pane = ((JScrollPane) c).getViewport().getComponent(0);
  1391. if (pane instanceof GroupNodeCanvas) {
  1392. temp = model.getHashcodeMap().get(((GroupNodeCanvas) pane).hashCode());
  1393. ((GroupNodeCanvas) pane).setGroupNode((GroupNode) temp);
  1394. }
  1395. }
  1396. }
  1397. /**
  1398. * Removes UpperNodeTab if UpperNode was deleted
  1399. *
  1400. * @param cps the CPS object that is currently selected
  1401. */
  1402. private void removeUpperNodeTab(AbstractCanvasObject cps) {
  1403. if (cps instanceof GroupNode) {
  1404. for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
  1405. JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
  1406. if (scrollPaneOriginal == null) {
  1407. } else if (((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode()
  1408. .getId() == cps.getId()) {
  1409. ((ButtonTabComponent) tabbedPaneInnerOriginal.getTabComponentAt(i)).removeTabs();
  1410. break;
  1411. }
  1412. }
  1413. }
  1414. }
  1415. /**
  1416. * chooses whether to set the tabTemp to tabbedPaneOriginal or tabbedPaneSplit
  1417. */
  1418. private void chooseTabTemp() {
  1419. // TODO Remove tabTabbed
  1420. tabTemp = tabbedPaneOriginal;
  1421. }
  1422. private JScrollPane getScrollPaneFromTabbedPane() {
  1423. return getScrollPaneFromTabbedPane(-1);
  1424. }
  1425. private JScrollPane getScrollPaneFromTabbedPane(int index) {
  1426. Component upperLevelSelectedComponent;
  1427. if (tabTemp == null) {
  1428. return null;
  1429. }
  1430. if (index == -1) {
  1431. upperLevelSelectedComponent = tabTemp.getSelectedComponent();
  1432. } else {
  1433. upperLevelSelectedComponent = tabTemp.getComponentAt(index);
  1434. }
  1435. if (upperLevelSelectedComponent instanceof JTabbedPane) {
  1436. Component nextLevel = ((JTabbedPane) upperLevelSelectedComponent).getSelectedComponent();
  1437. if (nextLevel instanceof JPanel)
  1438. return (JScrollPane) ((JPanel) nextLevel).getComponent(0);
  1439. else
  1440. return (JScrollPane) nextLevel;
  1441. } else if (upperLevelSelectedComponent instanceof JScrollPane) {
  1442. return (JScrollPane) upperLevelSelectedComponent;
  1443. } else {
  1444. return null;
  1445. }
  1446. }
  1447. private void openWebpage(String URL) {
  1448. try {
  1449. java.awt.Desktop.getDesktop().browse(new URI(URL));
  1450. } catch (Exception e) {
  1451. e.printStackTrace();
  1452. }
  1453. }
  1454. /**
  1455. * closes all UpperNodeTabs, that don't have a valid UpperNode (e.g. if it was
  1456. * ungrouped/deleted/replaced and so on)
  1457. */
  1458. private void closeInvalidUpperNodeTabs() {
  1459. /**
  1460. * close bugged Tabs
  1461. */
  1462. for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
  1463. JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
  1464. if (((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode() == null) {
  1465. ((ButtonTabComponent) tabbedPaneInnerOriginal.getTabComponentAt(i)).removeTabs();
  1466. break;
  1467. }
  1468. }
  1469. }
  1470. public void repaintCanvas() {
  1471. tabbedPaneInnerOriginal.revalidate();
  1472. tabbedPaneInnerOriginal.repaint();
  1473. for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
  1474. JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
  1475. scrollPaneOriginal.revalidate();
  1476. }
  1477. }
  1478. /**
  1479. * TODO: Class should be reworked as soon as possible!
  1480. *
  1481. * @param state
  1482. */
  1483. public void guiDisable(boolean state) {
  1484. canvas.disabled = state;
  1485. for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
  1486. JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
  1487. if (((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode() != null) {
  1488. ((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).disabled = state;
  1489. }
  1490. }
  1491. }
  1492. }