Gui.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. package holeg.ui.view.main;
  2. import holeg.interfaces.LocalMode;
  3. import holeg.model.*;
  4. import holeg.preferences.ColorPreference;
  5. import holeg.preferences.ImagePreference;
  6. import holeg.preferences.PreferenceKeys;
  7. import holeg.ui.controller.Control;
  8. import holeg.ui.model.GuiSettings;
  9. import holeg.ui.view.canvas.Canvas;
  10. import holeg.ui.view.category.CategoryPanel;
  11. import holeg.ui.view.component.ButtonTabComponent;
  12. import holeg.ui.view.dialog.*;
  13. import holeg.ui.view.image.Import;
  14. import holeg.ui.view.information.HolonInformationPanel;
  15. import holeg.ui.view.inspector.Inspector;
  16. import holeg.ui.view.inspector.UnitGraph;
  17. import holeg.ui.view.window.AddOnWindow;
  18. import holeg.ui.view.window.FlexWindow;
  19. import holeg.ui.view.window.Outliner;
  20. import holeg.utility.listener.WindowClosingListener;
  21. import javax.swing.*;
  22. import javax.swing.filechooser.FileNameExtensionFilter;
  23. import javax.swing.filechooser.FileSystemView;
  24. import java.awt.*;
  25. import java.awt.event.*;
  26. import java.io.File;
  27. import java.net.URI;
  28. import java.util.logging.Logger;
  29. import java.util.prefs.Preferences;
  30. /**
  31. * Graphical User Interface.
  32. *
  33. * @author Gruppe14
  34. */
  35. public class Gui extends JFrame{
  36. private static final Logger log = Logger.getLogger(Model.class.getName());
  37. private static final Preferences prefs = Preferences.userNodeForPackage(Gui.class);
  38. private final JSplitPane splitPane = new JSplitPane();
  39. private final JSplitPane splitPane1 = new JSplitPane();
  40. private final JPanel myPanel = new JPanel(new BorderLayout());
  41. // the tabbed canvas containing the different sub-net tabs of the grid (Main
  42. // Grid + Nodes of Nodes)
  43. private final JTabbedPane tabbedPaneInnerOriginal = new JTabbedPane(JTabbedPane.TOP);
  44. // the main canvas where we can see the grid currently displayed
  45. private final JScrollPane canvasSP = new JScrollPane();
  46. private final CategoryPanel categoryPanel;
  47. // private final JScrollPane holonSP = new JScrollPane();
  48. // the original tabbed Pane (containing tabs for view, statistics, holon,
  49. // flexibility)
  50. private final JTabbedPane tabbedPaneOriginal = new JTabbedPane(JTabbedPane.TOP);
  51. /******************************************
  52. ************* Right Container*************
  53. ******************************************
  54. * Right Container: here comes the information about the HolonObject, such as
  55. * HolonElements Information, Properties and Consumption/Production graph.
  56. **/
  57. private final Inspector inspector;
  58. private final HolonInformationPanel informationPanel;
  59. private final JSplitPane splitHolonElPro = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
  60. private final JScrollPane scrollProperties = new JScrollPane();
  61. // In this section is the graph for the selected HolonElement of the clicked
  62. private final Control control;
  63. // In this section are all the Holonelements that correspond to the clicked
  64. // HolonObject with consumption/production, name and amount.
  65. private final UnitGraph unitGraph;
  66. /**
  67. * Textfield to show the period of an element
  68. */
  69. private final JTextField unitGraphLocalPeriod = new JTextField(6);
  70. private final Canvas canvas;
  71. // tabbedPaneOriginal or tabbedPaneSplit
  72. private JTabbedPane tabTemp;
  73. private Canvas actualOpenCanvas;
  74. private JPanel contentPane;
  75. // Time Stuff
  76. private TimePanel timePanel;
  77. /**
  78. * Create the application.
  79. *
  80. * @param control the Controller
  81. */
  82. public Gui(Control control) {
  83. this.control = control;
  84. this.informationPanel = new HolonInformationPanel(control);
  85. inspector = new Inspector(control);
  86. control.calculateStateAndVisualForCurrentTimeStep();
  87. this.unitGraph = new UnitGraph(control);
  88. this.canvas = new Canvas(control, control.getModel().getCanvas());
  89. this.categoryPanel = new CategoryPanel(control, this);
  90. this.actualOpenCanvas = this.canvas;
  91. initialize();
  92. }
  93. public TimePanel getTimePanel() {
  94. return timePanel;
  95. }
  96. /**
  97. * Initialize the contents of the frame.
  98. */
  99. private void initialize() {
  100. this.setTitle("HOLEG Simulator");
  101. this.setBounds(new Rectangle(1200, 800));
  102. //Center
  103. this.setLocationRelativeTo(null);
  104. this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  105. this.addWindowListener((WindowClosingListener) e -> {
  106. if (JOptionPane.showConfirmDialog(this, "Are you sure you want to exit?", "HOLEG",
  107. JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
  108. System.exit(0);
  109. }
  110. });
  111. contentPane = (JPanel) this.getContentPane();
  112. int condition = JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT;
  113. InputMap inputMap = contentPane.getInputMap(condition);
  114. ActionMap actionMap = contentPane.getActionMap();
  115. String cntrlZDown = "controlZ";
  116. inputMap.put(KeyStroke.getKeyStroke("control Z"), cntrlZDown);
  117. actionMap.put(cntrlZDown, new AbstractAction() {
  118. @Override
  119. public void actionPerformed(ActionEvent e) {
  120. //TODO(Tom2022-01-27): CtrlZ
  121. }
  122. });
  123. String cntrlYDown = "controlY";
  124. inputMap.put(KeyStroke.getKeyStroke("control Y"), cntrlYDown);
  125. actionMap.put(cntrlYDown, new AbstractAction() {
  126. @Override
  127. public void actionPerformed(ActionEvent e) {
  128. //TODO Ctrl Y
  129. }
  130. });
  131. String cntrlADown = "controlA";
  132. inputMap.put(KeyStroke.getKeyStroke("control A"), cntrlADown);
  133. AbstractAction controlA = new AbstractAction() {
  134. @Override
  135. public void actionPerformed(ActionEvent e) {
  136. GuiSettings.getSelectedObjects().clear();
  137. //TODO(Tom2022-01-27): Ctrl A
  138. }
  139. };
  140. actionMap.put(cntrlADown, controlA);
  141. String delDown = "delete";
  142. inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0, false), delDown);
  143. actionMap.put(delDown, new AbstractAction() {
  144. private static final long serialVersionUID = 1L;
  145. @Override
  146. public void actionPerformed(ActionEvent e) {
  147. chooseTabTemp();
  148. //TODO(Tom2022-01-27): delete
  149. GuiSettings.getSelectedObjects().clear();
  150. }
  151. });
  152. String cntrlCDown = "controlC";
  153. inputMap.put(KeyStroke.getKeyStroke("control C"), cntrlCDown);
  154. AbstractAction controlC = new AbstractAction() {
  155. private static final long serialVersionUID = 1L;
  156. @Override
  157. public void actionPerformed(ActionEvent e) {
  158. chooseTabTemp();
  159. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  160. if (!GuiSettings.getSelectedObjects().isEmpty()) {
  161. if (scrollPane.getViewport().getComponent(0) instanceof Canvas groupNodeCanvas)
  162. control.copy(groupNodeCanvas.getGroupNode());
  163. else
  164. control.copy(null);
  165. if (!GuiSettings.getClipboardObjects().isEmpty()) {
  166. //TODO(Tom2022-01-14): old code changes itemPaste
  167. //OLD: canvas.itemPaste.setEnabled(true);
  168. }
  169. }
  170. }
  171. };
  172. actionMap.put(cntrlCDown, controlC);
  173. String cntrlVDown = "controlV";
  174. inputMap.put(KeyStroke.getKeyStroke("control V"), cntrlVDown);
  175. AbstractAction controlV = new AbstractAction() {
  176. private static final long serialVersionUID = 1L;
  177. @Override
  178. public void actionPerformed(ActionEvent e) {
  179. //TODO(Tom2022-01-27): Paste
  180. }
  181. };
  182. actionMap.put(cntrlVDown, controlV);
  183. String cntrlXDown = "controlX";
  184. inputMap.put(KeyStroke.getKeyStroke("control X"), cntrlXDown);
  185. AbstractAction controlX = new AbstractAction() {
  186. private static final long serialVersionUID = 1L;
  187. @Override
  188. public void actionPerformed(ActionEvent e) {
  189. chooseTabTemp();
  190. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  191. if (!GuiSettings.getSelectedObjects().isEmpty()) {
  192. if (scrollPane.getViewport().getComponent(0) instanceof Canvas groupNodeCanvas) {
  193. control.cut(groupNodeCanvas.getGroupNode());
  194. control.calculateStateAndVisualForCurrentTimeStep();
  195. scrollPane.getViewport().getComponent(0).repaint();
  196. } else {
  197. control.cut(null);
  198. control.calculateStateAndVisualForCurrentTimeStep();
  199. log.info("canvas.repaint3");
  200. canvas.repaint();
  201. }
  202. if (!GuiSettings.getClipboardObjects().isEmpty()) {
  203. //TODO(Tom2022-01-14): old code changes itemPaste
  204. //OLD: canvas.itemPaste.setEnabled(true);
  205. }
  206. }
  207. }
  208. };
  209. actionMap.put(cntrlXDown, controlX);
  210. this.setJMenuBar(new GuiMenuBar());
  211. this.setIconImage(Import.loadImage(ImagePreference.Logo, 30, 30));
  212. tabbedPaneInnerOriginal.addChangeListener(change -> {
  213. control.clearSelection();
  214. });
  215. /**
  216. * add Help Menu and its items
  217. */
  218. canvas.setBackground(Color.WHITE);
  219. canvas.setPreferredSize(new Dimension(GuiSettings.canvasSize.getX(), GuiSettings.canvasSize.getY()));
  220. /***********************
  221. * HolonElement Graph Actions
  222. **********************/
  223. /*
  224. * Update Local Period of an Element Graph
  225. */
  226. unitGraphLocalPeriod.addKeyListener(new KeyAdapter() {
  227. @Override
  228. public void keyReleased(KeyEvent e) {
  229. try {
  230. int localLength = Integer.parseInt(unitGraphLocalPeriod.getText());
  231. unitGraphLocalPeriod.setBackground(Color.WHITE);
  232. /**
  233. * set local graph Period
  234. */
  235. if (e.getKeyCode() == KeyEvent.VK_ENTER) {
  236. LocalMode.Period period = new LocalMode.Period(localLength);
  237. period.setInterval(localLength);
  238. unitGraph.setPeriod(period);
  239. }
  240. } catch (NumberFormatException ex) {
  241. unitGraphLocalPeriod.setBackground(ColorPreference.GUI.PALE_RED);
  242. }
  243. }
  244. });
  245. /*****************************
  246. * RIGHT CONTAINER DONE
  247. *****************************/
  248. this.getContentPane().setLayout(new BorderLayout(0, 0));
  249. /****************
  250. * Tree Stuff
  251. ****************/
  252. this.getContentPane().add(splitPane);
  253. timePanel = new TimePanel(control);
  254. timePanel.setBorder(null);
  255. timePanel.getTimeSlider().addChangeListener(changeEvent -> {
  256. // TimeSliderChanged event
  257. control.calculateStateAndVisualForTimeStep(timePanel.getTimeSlider().getValue());
  258. unitGraph.repaint();
  259. contentPane.updateUI();
  260. });
  261. splitPane1.setMinimumSize(new Dimension(0, 25));
  262. splitPane.setRightComponent(splitPane1);
  263. splitPane.setDividerLocation(200);
  264. splitPane1.setDividerLocation(500);
  265. splitPane.setLeftComponent(categoryPanel);
  266. tabbedPaneOriginal.addTab("View", tabbedPaneInnerOriginal);
  267. myPanel.add(canvasSP, BorderLayout.CENTER);
  268. tabbedPaneInnerOriginal.addTab("Main Grid", myPanel);
  269. splitPane1.setLeftComponent(tabbedPaneOriginal);
  270. splitPane1.setRightComponent(splitHolonElPro);
  271. splitPane1.setResizeWeight(0.9);
  272. splitHolonElPro.setDividerLocation(700);
  273. // containing the graph and the elements-list
  274. splitHolonElPro.setTopComponent(inspector);
  275. // containing the object's properties
  276. splitHolonElPro.setBottomComponent(scrollProperties);
  277. canvasSP.setViewportView(canvas);
  278. // Set up of the Properties section
  279. scrollProperties.setViewportView(this.informationPanel);
  280. scrollProperties.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
  281. scrollProperties.getVerticalScrollBar().setUnitIncrement(16);
  282. tabbedPaneOriginal.setBorder(null);
  283. scrollProperties.setBorder(null);
  284. splitPane.setBorder(null);
  285. splitPane1.setBorder(null);
  286. splitHolonElPro.setBorder(null);
  287. canvasSP.setBorder(null);
  288. this.getContentPane().add(timePanel, BorderLayout.SOUTH);
  289. canvasSP.addComponentListener(new ComponentAdapter() {
  290. @Override
  291. public void componentResized(ComponentEvent e) {
  292. GuiSettings.canvasSize.setX(Math.max(GuiSettings.canvasSize.getX(), canvasSP.getViewport().getWidth()));
  293. GuiSettings.canvasSize
  294. .setY(Math.max(GuiSettings.canvasSize.getY(), canvasSP.getViewport().getHeight()));
  295. log.info("canvas.repaint11");
  296. canvas.repaint();
  297. }
  298. });
  299. }
  300. /*
  301. * Open a new Tab with an UpperNodeCanvas
  302. */
  303. public void openNewUpperNodeTab(GroupNode node) {
  304. chooseTabTemp();
  305. JScrollPane scrollPane = getScrollPaneFromTabbedPane();
  306. if (scrollPane.getViewport().getComponent(0) instanceof Canvas canvasPanel) {
  307. actualOpenCanvas = new Canvas(control, node);
  308. }
  309. // check if tab already open for clicked NodeOfNode
  310. boolean dupl = false;
  311. for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
  312. JScrollPane paneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
  313. if (paneOriginal != null && ((Canvas) paneOriginal.getViewport().getComponent(0)).getGroupNode()
  314. .getId() == node.getId()) {
  315. dupl = true;
  316. // set selected component to view
  317. tabbedPaneOriginal.setSelectedComponent(tabbedPaneInnerOriginal);
  318. // set selected tab in view to found upper-node-canvas
  319. tabbedPaneInnerOriginal.setSelectedComponent(tabbedPaneInnerOriginal.getComponentAt(i));
  320. }
  321. // if we found a duplicate, break
  322. if (dupl) {
  323. break;
  324. }
  325. }
  326. if (!dupl) {
  327. JScrollPane sp = new JScrollPane(actualOpenCanvas);
  328. sp.setBorder(null);
  329. // Selected tabbed Pane = tabbedPaneOriginal or tabbedPaneSplit
  330. if (tabTemp == tabbedPaneOriginal) {
  331. this.tabbedPaneInnerOriginal.add(node.getName(), sp);
  332. this.tabbedPaneInnerOriginal.setSelectedComponent(sp);
  333. this.tabbedPaneInnerOriginal.setTabComponentAt(this.tabbedPaneInnerOriginal.getTabCount() - 1,
  334. new ButtonTabComponent(this.tabbedPaneInnerOriginal));
  335. }
  336. }
  337. }
  338. /**
  339. * Removes UpperNodeTab if UpperNode was deleted
  340. *
  341. * @param cps the CPS object that is currently selected
  342. */
  343. private void removeUpperNodeTab(AbstractCanvasObject cps) {
  344. if (cps instanceof GroupNode) {
  345. for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
  346. JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
  347. if (scrollPaneOriginal == null) {
  348. } else if (((Canvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode()
  349. .getId() == cps.getId()) {
  350. ((ButtonTabComponent) tabbedPaneInnerOriginal.getTabComponentAt(i)).removeTabs();
  351. break;
  352. }
  353. }
  354. }
  355. }
  356. /**
  357. * chooses whether to set the tabTemp to tabbedPaneOriginal or tabbedPaneSplit
  358. */
  359. private void chooseTabTemp() {
  360. // TODO(Tom2021-12-1) Remove tabTabbed
  361. tabTemp = tabbedPaneOriginal;
  362. }
  363. private JScrollPane getScrollPaneFromTabbedPane() {
  364. return getScrollPaneFromTabbedPane(-1);
  365. }
  366. private JScrollPane getScrollPaneFromTabbedPane(int index) {
  367. Component upperLevelSelectedComponent;
  368. if (tabTemp == null) {
  369. return null;
  370. }
  371. if (index == -1) {
  372. upperLevelSelectedComponent = tabTemp.getSelectedComponent();
  373. } else {
  374. upperLevelSelectedComponent = tabTemp.getComponentAt(index);
  375. }
  376. if (upperLevelSelectedComponent instanceof JTabbedPane) {
  377. Component nextLevel = ((JTabbedPane) upperLevelSelectedComponent).getSelectedComponent();
  378. if (nextLevel instanceof JPanel panel)
  379. return (JScrollPane) panel.getComponent(0);
  380. else
  381. return (JScrollPane) nextLevel;
  382. } else if (upperLevelSelectedComponent instanceof JScrollPane scrollPane) {
  383. return scrollPane;
  384. } else {
  385. return null;
  386. }
  387. }
  388. private void openWebpage(String URL) {
  389. try {
  390. java.awt.Desktop.getDesktop().browse(new URI(URL));
  391. } catch (Exception e) {
  392. e.printStackTrace();
  393. }
  394. }
  395. /**
  396. * closes all UpperNodeTabs, that don't have a valid UpperNode (e.g. if it was
  397. * ungrouped/deleted/replaced and so on)
  398. */
  399. private void closeInvalidUpperNodeTabs() {
  400. /**
  401. * close bugged Tabs
  402. */
  403. for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
  404. JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
  405. if (((Canvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode() == null) {
  406. ((ButtonTabComponent) tabbedPaneInnerOriginal.getTabComponentAt(i)).removeTabs();
  407. break;
  408. }
  409. }
  410. }
  411. public Canvas getCanvas() {
  412. return canvas;
  413. }
  414. public JFrame getFrame() {
  415. return this;
  416. }
  417. private class GuiMenuBar extends JMenuBar {
  418. //Menus
  419. private final JMenu fileMenu = new JMenu("File");
  420. private final JMenu editMenu = new JMenu("Edit");
  421. private final JMenu viewMenu = new JMenu("View");
  422. private final JMenu windowMenu = new JMenu("Window");
  423. private final JMenu helpMenu = new JMenu("Help");
  424. // FileMenu
  425. private final JMenuItem newMenuButton = new JMenuItem("New");
  426. private final JMenuItem openMenuButton = new JMenuItem("Open..");
  427. private final JMenuItem saveMenuButton = new JMenuItem("Save");
  428. private final JMenuItem saveAsMenuButton = new JMenuItem("Save..");
  429. // EditMenu
  430. private final JMenuItem undoButton = new JMenuItem("Undo");
  431. private final JMenuItem redoButton = new JMenuItem("Redo");
  432. private final JMenuItem edgePropertiesButton = new JMenuItem("Edge Properties");
  433. private final JMenuItem alignAllButton = new JMenuItem("Align All");
  434. private final JMenu resetMenu = new JMenu("Reset");
  435. private final JMenuItem resetCategoryButton = new JMenuItem("Categories");
  436. //HelpMenu
  437. private final JMenuItem introductionButton = new JMenuItem("Introduction");
  438. private final JMenuItem userManualButton = new JMenuItem("User Manual");
  439. private final JMenuItem algorithmHelpButton = new JMenuItem("Algorithm Introduction");
  440. private final JMenuItem codeDocumentationButton = new JMenuItem("Code Documentation");
  441. private final JMenuItem aboutUsButton = new JMenuItem("About Us");
  442. //ViewMenu
  443. private final JMenu appearanceMenu = new JMenu("Appearance");
  444. private final JMenuItem canvasSizeButton = new JMenuItem("Set View Size");
  445. private final JCheckBoxMenuItem showSupplyBarsCheckBox = new JCheckBoxMenuItem("Show supply bars.", true);
  446. private final JFileChooser fileChooser = initFileChooser();
  447. //WindowMenu
  448. JMenuItem algorithmButton = new JMenuItem("Algorithm Panel", new ImageIcon(Import
  449. .loadImage(ImagePreference.Button.Menu.Algo).getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
  450. JMenuItem outlinerButton = new JMenuItem("Outliner", new ImageIcon(Import
  451. .loadImage(ImagePreference.Button.Menu.Outliner).getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
  452. JMenuItem flexMenuButton = new JMenuItem("Flexibility Panel", new ImageIcon(Import
  453. .loadImage(ImagePreference.Button.Menu.Algo).getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
  454. GuiMenuBar() {
  455. initMenuLayout();
  456. initButtonActions();
  457. initButtonShortCuts();
  458. }
  459. private static JFileChooser initFileChooser() {
  460. JFileChooser safeLoadFileChooser = new JFileChooser(prefs.get(PreferenceKeys.Gui.DefaultFolder,
  461. FileSystemView.getFileSystemView().getDefaultDirectory().getPath()));
  462. safeLoadFileChooser.setFileFilter(new FileNameExtensionFilter("Holeg json files", "json"));
  463. safeLoadFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
  464. safeLoadFileChooser.setAcceptAllFileFilterUsed(false);
  465. return safeLoadFileChooser;
  466. }
  467. private void initMenuLayout() {
  468. add(fileMenu);
  469. add(editMenu);
  470. add(viewMenu);
  471. add(windowMenu);
  472. add(helpMenu);
  473. fileMenu.add(newMenuButton);
  474. fileMenu.add(openMenuButton);
  475. fileMenu.addSeparator();
  476. fileMenu.add(saveMenuButton);
  477. fileMenu.add(saveAsMenuButton);
  478. editMenu.add(undoButton);
  479. editMenu.add(redoButton);
  480. editMenu.add(edgePropertiesButton);
  481. editMenu.add(alignAllButton);
  482. editMenu.add(resetMenu);
  483. resetMenu.add(resetCategoryButton);
  484. helpMenu.add(introductionButton);
  485. helpMenu.add(userManualButton);
  486. helpMenu.add(algorithmHelpButton);
  487. helpMenu.add(codeDocumentationButton);
  488. helpMenu.add(aboutUsButton);
  489. viewMenu.add(appearanceMenu);
  490. appearanceMenu.add(showSupplyBarsCheckBox);
  491. viewMenu.add(canvasSizeButton);
  492. windowMenu.add(algorithmButton);
  493. windowMenu.add(outlinerButton);
  494. windowMenu.add(flexMenuButton);
  495. }
  496. private void initButtonActions() {
  497. newMenuButton.addActionListener(clicked -> newFile());
  498. openMenuButton.addActionListener(clicked -> openFile());
  499. saveMenuButton.addActionListener(clicked -> saveFile());
  500. saveAsMenuButton.addActionListener(clicked -> saveNewFile());
  501. edgePropertiesButton.addActionListener(actionEvent -> new EditEdgesPopUp(Gui.this, control));
  502. //TODO(Tom2022-01-14): recreateTryToAlignObjects
  503. alignAllButton.addActionListener(clicked -> {
  504. log.info("Not implemented yet.");
  505. });
  506. resetCategoryButton.addActionListener(clicked -> control.resetCategories());
  507. showSupplyBarsCheckBox.addActionListener(clicked -> toggleSupplyBarAppearance());
  508. canvasSizeButton.addActionListener(clicked -> new CanvasResizePopUp(control, canvas, tabbedPaneInnerOriginal,
  509. Gui.this));
  510. algorithmButton.addActionListener(clicked -> new AddOnWindow(Gui.this, control));
  511. outlinerButton.addActionListener(clicked -> new Outliner(Gui.this, control));
  512. flexMenuButton.addActionListener(clicked -> new FlexWindow(Gui.this, control));
  513. String tkWikiWebpage = "https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons/wiki/";
  514. introductionButton.addActionListener(clicked -> openWebpage(tkWikiWebpage + "Introduction+V2.1"));
  515. userManualButton.addActionListener(clicked -> openWebpage(tkWikiWebpage + "User+Manual+V2.1"));
  516. algorithmHelpButton.addActionListener(clicked -> openWebpage(tkWikiWebpage + "Algorithms+V2.1"));
  517. codeDocumentationButton.addActionListener(clicked -> openWebpage(tkWikiWebpage + "Code+documentation+V2.1"));
  518. aboutUsButton.addActionListener(clicked -> new AboutUsPopUp(Gui.this));
  519. }
  520. private void initButtonShortCuts() {
  521. int defaultModifier = Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx();
  522. saveMenuButton.setAccelerator(KeyStroke.getKeyStroke('S', defaultModifier));
  523. saveAsMenuButton.setAccelerator(KeyStroke.getKeyStroke('S', defaultModifier + InputEvent.SHIFT_DOWN_MASK));
  524. openMenuButton.setAccelerator(KeyStroke.getKeyStroke('O', defaultModifier));
  525. newMenuButton.setAccelerator(KeyStroke.getKeyStroke('N', defaultModifier));
  526. }
  527. private void toggleSupplyBarAppearance() {
  528. GuiSettings.showSupplyBars = showSupplyBarsCheckBox.isSelected();
  529. log.info("canvas.repaint4");
  530. canvas.repaint();
  531. }
  532. private void saveFile(){
  533. GuiSettings.getActualSaveFile().ifPresentOrElse(control::saveFile, this::saveNewFile);
  534. }
  535. private void saveNewFile() {
  536. if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
  537. String path = fileChooser.getSelectedFile().getPath();
  538. if (!path.endsWith(".json")) {
  539. path += ".json";
  540. }
  541. prefs.put(PreferenceKeys.Gui.DefaultFolder, fileChooser.getCurrentDirectory().getPath());
  542. control.saveFile(new File(path));
  543. }
  544. }
  545. private void openFile() {
  546. if (fileChooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
  547. prefs.put(PreferenceKeys.Gui.DefaultFolder, fileChooser.getCurrentDirectory().getPath());
  548. control.loadFile(fileChooser.getSelectedFile());
  549. //TODO(Tom2022-01-27): make better
  550. canvas.setGroupNode(control.getModel().getCanvas());
  551. canvas.repaint();
  552. }
  553. }
  554. private void newFile() {
  555. if (control.getModel().getCanvas().getObjectsInThisLayer().findAny().isPresent()) {
  556. int selectedOption = JOptionPane.showConfirmDialog(this, "Do you want to save your current model?",
  557. "Warning", JOptionPane.YES_NO_OPTION);
  558. if (selectedOption == JOptionPane.YES_OPTION) {
  559. saveNewFile();
  560. }
  561. }
  562. control.clearModel();
  563. }
  564. }
  565. }