12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634 |
- package holeg.ui.view.main;
- import java.awt.BorderLayout;
- import java.awt.Color;
- import java.awt.Component;
- import java.awt.Cursor;
- import java.awt.Dimension;
- import java.awt.GraphicsDevice;
- import java.awt.GraphicsEnvironment;
- import java.awt.HeadlessException;
- import java.awt.Image;
- import java.awt.Point;
- import java.awt.Rectangle;
- import java.awt.Toolkit;
- import java.awt.datatransfer.UnsupportedFlavorException;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.event.ComponentAdapter;
- import java.awt.event.ComponentEvent;
- import java.awt.event.KeyAdapter;
- import java.awt.event.KeyEvent;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.awt.event.MouseMotionAdapter;
- import java.io.File;
- import java.io.IOException;
- import java.net.URI;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Optional;
- import java.util.logging.Logger;
- import java.util.stream.Collectors;
- import javax.swing.AbstractAction;
- import javax.swing.ActionMap;
- import javax.swing.BoxLayout;
- import javax.swing.ImageIcon;
- import javax.swing.InputMap;
- import javax.swing.JButton;
- import javax.swing.JCheckBoxMenuItem;
- import javax.swing.JComponent;
- import javax.swing.JDialog;
- import javax.swing.JFileChooser;
- import javax.swing.JFrame;
- import javax.swing.JLabel;
- import javax.swing.JMenu;
- import javax.swing.JMenuBar;
- import javax.swing.JMenuItem;
- import javax.swing.JOptionPane;
- import javax.swing.JPanel;
- import javax.swing.JPopupMenu;
- import javax.swing.JScrollPane;
- import javax.swing.JSplitPane;
- import javax.swing.JTabbedPane;
- import javax.swing.JTextField;
- import javax.swing.JToolBar;
- import javax.swing.JTree;
- import javax.swing.KeyStroke;
- import javax.swing.SwingUtilities;
- import javax.swing.filechooser.FileNameExtensionFilter;
- import javax.swing.tree.DefaultMutableTreeNode;
- import javax.swing.tree.DefaultTreeModel;
- import javax.swing.tree.TreeCellRenderer;
- import org.apache.commons.compress.archivers.ArchiveException;
- import com.google.gson.JsonParseException;
- import holeg.model.AbstractCanvasObject;
- import holeg.model.Edge;
- import holeg.model.GroupNode;
- import holeg.model.HolonObject;
- import holeg.model.HolonSwitch;
- import holeg.preferences.ColorPreference;
- import holeg.ui.controller.Control;
- import holeg.ui.model.GuiSettings;
- import holeg.ui.model.IdCounter;
- import holeg.ui.model.Model;
- import holeg.ui.model.IdCounter.CounterType;
- import holeg.ui.model.Model.FairnessModel;
- import holeg.ui.view.canvas.AbstractCanvas;
- import holeg.ui.view.canvas.Canvas;
- import holeg.ui.view.canvas.GroupNodeCanvas;
- import holeg.ui.view.component.ButtonTabComponent;
- import holeg.ui.view.dialog.AboutUsPopUp;
- import holeg.ui.view.dialog.AddObjectPopUp;
- import holeg.ui.view.dialog.CanvasResizePopUp;
- import holeg.ui.view.dialog.CreateNewDialog;
- import holeg.ui.view.dialog.EditEdgesPopUp;
- import holeg.ui.view.dialog.SearchPopUp;
- import holeg.ui.view.dialog.CreateNewDialog.Option;
- import holeg.ui.view.information.HolonInformationPanel;
- import holeg.ui.view.inspector.Inspector;
- import holeg.ui.view.inspector.UnitGraph;
- import holeg.ui.view.window.AddOnWindow;
- import holeg.ui.view.window.FlexWindow;
- import holeg.ui.view.window.Outliner;
- import holeg.utility.ImageImport;
- /**
- * Graphical User Interface.
- *
- * @author Gruppe14
- */
- public class GUI {
- private static final Logger log = Logger.getLogger(Model.class.getName());
- /**
- * Menu on the Top containing File, Edit View Help etc
- */
- private final JMenuBar menuBar = new JMenuBar();
- private final JMenu mnNewMenu = new JMenu("File");
- private final JMenu mnNewMenuEdit = new JMenu("Edit");
- private final JMenu mnNewMenuOptions = new JMenu("Options");
- private final JMenu mnNewMenuView = new JMenu("View");
- private final JMenu menuWindow = new JMenu("Window");
- /** Help Menu containing helpful Informations and the AboutUs Popup */
- private final JMenu mnHelp = new JMenu("Help");
- /**
- * Help -> Introduction A small Introduction of the Application, SmartGrids and
- * Holons
- */
- private final JMenuItem mntmIntroduction = new JMenuItem("Introduction");
- /**
- * Help -> UserManual
- */
- private final JMenuItem mntmUserManual = new JMenuItem("User Manual");
- /** Help -> Algorithm Help Menu */
- private final JMenuItem mntmAlgorithmHelp = new JMenuItem("Algorithm Introduction");
- /** Help -> CodeDocumentation */
- private final JMenuItem mntmCodeDoc = new JMenuItem("Code Documentation");
- /** Help -> AboutUs */
- private final JMenuItem mntmAboutUs = new JMenuItem("About Us");
- /** checked if supplyBars should be shown */
- private final JCheckBoxMenuItem showSupplyBarsCheckBox = new JCheckBoxMenuItem("Show supply bars.");
- /** menu for the different fairness Models */
- private final JMenu mnFairnessModel = new JMenu("Fairness Model");
- /** press to supply minimum demand first */
- private final JMenuItem mntmFairMinFirst = new JMenuItem("Minimum demand first");
- /** press to give everyone the same energy */
- private final JMenuItem mntmFairAlleEqual = new JMenuItem("Equal supply for everyone");
- private final JMenuItem mntmOpen = new JMenuItem("Open");
- private final JMenuItem mntmNew = new JMenuItem("New");
- private final JMenuItem mntmSave = new JMenuItem("Save");
- private final JMenuItem mntmCanvasSize = new JMenuItem("Set View Size");
- private final JSplitPane splitPane = new JSplitPane();
- private final JSplitPane splitPane1 = new JSplitPane();
- // the tabbed canvas containing the different sub-net tabs of the grid (Main
- // Grid + Nodes of Nodes)
- private final JPanel myPanel = new JPanel(new BorderLayout());
- private final JTabbedPane tabbedPaneInnerOriginal = new JTabbedPane(JTabbedPane.TOP);
- // the main canvas where we can see the grid currently displayed
- private final JScrollPane canvasSP = new JScrollPane();
- private final JScrollPane scrollPane1 = new JScrollPane();
- // private final JScrollPane holonSP = new JScrollPane();
- // the original tabbed Pane (containing tabs for view, statistics, holon,
- // flexibility)
- private final JTabbedPane tabbedPaneOriginal = new JTabbedPane(JTabbedPane.TOP);
- private final JPopupMenu popmenuEdit = new JPopupMenu();
- private final JMenuItem editItem = new JMenuItem("Edit Object");
- private final JLabel elementGraph = new JLabel("None ");
- private final JTree categoryTree = new JTree();
- /******************************************
- ************* Right Container*************
- ******************************************
- * Right Container: here comes the information about the HolonObject, such as
- * HolonElements Information, Properties and Consumption/Production graph.
- **/
- private final Inspector inspector;
- private final HolonInformationPanel informationPanel;
- private final JSplitPane splitHolonElPro = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
- // Prechoosed local Periods
- private final JScrollPane scrollProperties = new JScrollPane();
- // In this section is the graph for the selected HolonElement of the clicked
- private final Model model;
- private final Control control;
- // In this section are all the Holonelements that correspond to the clicked
- // HolonObject with consumption/production, name and amount.
- private final JPanel panel = new JPanel();
- private final JPanel panelHolonEl = new JPanel();
- // Buttons
- private final JButton btnAdd = new JButton();
- private final JPopupMenu btnAddPopUp = new JPopupMenu("Newacac");
- private final JMenuItem mItemNew = new JMenuItem("New..");
- private final JMenuItem mItemCategory = new JMenuItem("Category");
- private final JMenuItem mItemObject = new JMenuItem("Object");
- private final JMenuItem mItemSwitch = new JMenuItem("Switch");
- private final JButton btnDel = new JButton();
- private final JToolBar toolBar = new JToolBar();
- private final JToolBar toolBarHolonEl = new JToolBar();
- // Languages
- private final Canvas canvas;
- private final UnitGraph unitGraph;
- /** Textfield to show the period of an element */
- private final JTextField unitGraphLocalPeriod = new JTextField(6);
- private final JMenuItem mntmUndo = new JMenuItem("Undo");
- private final JMenuItem mntmRedo = new JMenuItem("Redo");
- private final JMenuItem mntmEditEdges = new JMenuItem("Edge Properties");
- private final JMenuItem mntmFindReplace = new JMenuItem("Find/ Replace");
- private final JMenuItem mntmAlignAll = new JMenuItem("Align All");
- private final JMenuItem mntmResetCategory = new JMenuItem("Reset Categories");
- // TODO(Tom2021-12-1) make GUI a JFRAME and remove holegJFrame
- private JFrame holegJFrame;
- // tabbedPaneOriginal or tabbedPaneSplit
- private JTabbedPane tabTemp;
- private String catOfObjToBeEdited;
- private GroupNodeCanvas unc;
- private JPanel contentPane;
- // Pop up Windows
- private AddObjectPopUp addObjectPopUP;
- private AboutUsPopUp aboutUsPopUp;
- // variables
- private boolean dragging = false;
- private String actualObjectClicked;
- private Image img = null;
- private AbstractCanvasObject tempCps = null;
- // Time Stuff
- private TimePanel timePanel;
- public TimePanel getTimePanel() {
- return timePanel;
- }
- private AbstractCanvasObject temp = null;
- private String warningText = "Warning";
- private String saveBeforeNew = "Do you want to save your current data?";
- private String eraseCategory = "Do you really want to delete the Category ";
- private String selectObjBeforeErase = "Please select a Category or an Object in the left library in order to delete something.";
- private JMenuItem removeItem = new JMenuItem("Remove");
- /**
- * Create the application.
- *
- * @param control the Controller
- */
- GUI(Control control) {
- this.control = control;
- this.informationPanel = new HolonInformationPanel(control);
- this.model = control.getModel();
- inspector = new Inspector(control);
- control.setGui(this);
- control.calculateStateAndVisualForCurrentTimeStep();
- this.unitGraph = new UnitGraph(control);
- this.canvas = new Canvas(model, control, unitGraph);
- initialize();
- updateCategories(GuiSettings.getCategories());
- control.OnCategoryChanged.addListener(() -> this.updateCategoryUI(GuiSettings.getCategories()));
- }
- /**
- * Initialize the contents of the frame.
- */
- private void initialize() {
- holegJFrame = new JFrame();
- holegJFrame.setTitle("HOLEG Simulator");
- // try to restore old position/dimensions
- ArrayList<Integer> savedWindowDim = control.loadSavedWindowDimensionsIfExistent();
- if (savedWindowDim.size() == 4) {
- holegJFrame.setBounds(savedWindowDim.get(0), savedWindowDim.get(1), savedWindowDim.get(2),
- savedWindowDim.get(3));
- }
- // if the upper part of the window is showing, the windows can still be
- // moved,
- // but if it is not, we need to move it to somewhere else
- if (savedWindowDim.size() != 4 || !isUpperPanelInsideBounds()) {
- holegJFrame.setBounds(100, 100, 1000, 800);
- holegJFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
- }
- holegJFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
- holegJFrame.addWindowListener(new java.awt.event.WindowAdapter() {
- @Override
- public void windowClosing(java.awt.event.WindowEvent windowEvent) {
- if (JOptionPane.showConfirmDialog(holegJFrame, "Are you sure you want to exit?", "HOLEG",
- JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
- control
- .deleteDirectory(new File(System.getProperty("user.home") + "/.config/HolonGUI/Autosave"));
- // try to save the position and size of the window, such
- // that (if possible)
- // it can be opened in the same position the next time
- try {
- control.savePosAndSizeOfWindow(holegJFrame.getX(), holegJFrame.getY(),
- holegJFrame.getWidth(), holegJFrame.getHeight());
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.exit(1);
- }
- System.exit(0);
- }
- });
- contentPane = (JPanel) holegJFrame.getContentPane();
- int condition = JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT;
- InputMap inputMap = contentPane.getInputMap(condition);
- ActionMap actionMap = contentPane.getActionMap();
- String cntrlZDown = "controlZ";
- inputMap.put(KeyStroke.getKeyStroke("control Z"), cntrlZDown);
- actionMap.put(cntrlZDown, new AbstractAction() {
- private static final long serialVersionUID = 1L;
- @Override
- public void actionPerformed(ActionEvent e) {
- try {
- control.loadAutoSave(control.getUndoSave());
- closeInvalidUpperNodeTabs();
- control.calculateStateAndVisualForCurrentTimeStep();
- canvas.repaint();
- updateUpperNodes();
- } catch (IOException eex) {
- eex.printStackTrace();
- }
- }
- });
- String cntrlYDown = "controlY";
- inputMap.put(KeyStroke.getKeyStroke("control Y"), cntrlYDown);
- actionMap.put(cntrlYDown, new AbstractAction() {
- private static final long serialVersionUID = 1L;
- @Override
- public void actionPerformed(ActionEvent e) {
- try {
- control.loadAutoSave(control.getRedoSave());
- closeInvalidUpperNodeTabs();
- control.calculateStateAndVisualForCurrentTimeStep();
- canvas.repaint();
- updateUpperNodes();
- } catch (IOException ex) {
- ex.printStackTrace();
- }
- }
- });
- String cntrlADown = "controlA";
- inputMap.put(KeyStroke.getKeyStroke("control A"), cntrlADown);
- AbstractAction controlA = new AbstractAction() {
- private static final long serialVersionUID = 1L;
- @Override
- public void actionPerformed(ActionEvent e) {
- chooseTabTemp();
- GuiSettings.getSelectedObjects().clear();
- // Uppernode Canvas?
- JScrollPane scrollPane = getScrollPaneFromTabbedPane();
- Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
- if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
- control.addSelectedObjects(
- groupNodeCanvas.getGroupNode().getObjectsInThisLayer().collect(Collectors.toSet()));
- groupNodeCanvas.repaint();
- // or Canvas?
- } else if (canvasOrUpperNodeCanvas instanceof Canvas) {
- control.addSelectedObjects(model.getObjectsOnCanvas());
- canvas.repaint();
- }
- control.getObjectsInDepth();
- }
- };
- actionMap.put(cntrlADown, controlA);
- String delDown = "delete";
- inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0, false), delDown);
- actionMap.put(delDown, new AbstractAction() {
- private static final long serialVersionUID = 1L;
- @Override
- public void actionPerformed(ActionEvent e) {
- chooseTabTemp();
- // Uppernode Canvas?
- JScrollPane scrollPane = getScrollPaneFromTabbedPane();
- Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
- // check whether a producer was deleted (this triggers a
- // complete re-evaluation of the net)
- boolean wasProducerDeleted = true;
- if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
- for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
- if (groupNodeCanvas.getGroupNode().getObjectsInThisLayer().anyMatch(object -> object == cps)) {
- control.deleteObjectInGroupNode(cps, groupNodeCanvas.getGroupNode());
- unc.setToolTip(false);
- // remove UpperNodeTab if UpperNode deleted
- removeUpperNodeTab(cps);
- }
- }
- groupNodeCanvas.repaint();
- control.clearSelection();
- // or Canvas?
- } else if (canvasOrUpperNodeCanvas instanceof Canvas canvasPanel) {
- // Edge Deleting
- Optional<Edge> edgeHighlight = GuiSettings.getSelectedEdges().stream().findAny();
- edgeHighlight.ifPresent(edge -> {
- control.removeEdgesOnCanvas(edge);
- // TODO(Tom2021-12-20): Convert to Optional
- canvasPanel.edgeHighlight = null;
- });
- canvas.setToolTip(false);
- for (AbstractCanvasObject cps : GuiSettings.getSelectedObjects()) {
- control.delCanvasObject(cps, false);
- // remove UpperNodeTab if UpperNode deleted
- removeUpperNodeTab(cps);
- }
- control.clearSelection();
- control.tryAutoSave();
- canvas.repaint();
- }
- // recalculate net if a producer was deleted
- if (wasProducerDeleted) {
- control.resetSimulation();
- control.calculateStateAndVisualForCurrentTimeStep();
- }
- GuiSettings.getSelectedObjects().clear();
- }
- });
- String cntrlFDown = "controlF";
- inputMap.put(KeyStroke.getKeyStroke("control F"), cntrlFDown);
- actionMap.put(cntrlFDown, new AbstractAction() {
- private static final long serialVersionUID = 1L;
- @Override
- public void actionPerformed(ActionEvent e) {
- SearchPopUp dialog = new SearchPopUp(control, canvas, holegJFrame);
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- dialog.setVisible(true);
- }
- });
- String cntrlCDown = "controlC";
- inputMap.put(KeyStroke.getKeyStroke("control C"), cntrlCDown);
- AbstractAction controlC = new AbstractAction() {
- private static final long serialVersionUID = 1L;
- @Override
- public void actionPerformed(ActionEvent e) {
- chooseTabTemp();
- System.out.println("heiCopy - control C");
- JScrollPane scrollPane = getScrollPaneFromTabbedPane();
- if (!GuiSettings.getSelectedObjects().isEmpty()) {
- if (scrollPane.getViewport().getComponent(0)instanceof GroupNodeCanvas groupNodeCanvas)
- control.copy(groupNodeCanvas.getGroupNode());
- else
- control.copy(null);
- if (!GuiSettings.getClipboardObjects().isEmpty()) {
- canvas.itemPaste.setEnabled(true);
- }
- }
- }
- };
- actionMap.put(cntrlCDown, controlC);
- String cntrlVDown = "controlV";
- inputMap.put(KeyStroke.getKeyStroke("control V"), cntrlVDown);
- AbstractAction controlV = new AbstractAction() {
- private static final long serialVersionUID = 1L;
- @Override
- public void actionPerformed(ActionEvent e) {
- try {
- tabTemp = null;
- if (tabbedPaneOriginal.getMousePosition() != null) {
- tabTemp = tabbedPaneOriginal;
- } else {
- }
- if (tabTemp == null)
- return;
- JScrollPane scrollPane = getScrollPaneFromTabbedPane();
- Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
- if (tabTemp != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
- control.paste(groupNodeCanvas.getGroupNode(), canvasOrUpperNodeCanvas.getMousePosition());
- control.calculateStateAndVisualForCurrentTimeStep();
- scrollPane.getViewport().getComponent(0).repaint();
- } else {
- control.paste(null, canvas.getMousePosition());
- control.calculateStateAndVisualForCurrentTimeStep();
- canvas.repaint();
- }
- } catch (HeadlessException | JsonParseException | UnsupportedFlavorException | IOException e1) {
- JLabel message = new JLabel("The Clipboard information cannot be pasted into Application.");
- JOptionPane.showMessageDialog(holegJFrame, message, "", JOptionPane.ERROR_MESSAGE);
- }
- }
- };
- actionMap.put(cntrlVDown, controlV);
- String cntrlXDown = "controlX";
- inputMap.put(KeyStroke.getKeyStroke("control X"), cntrlXDown);
- AbstractAction controlX = new AbstractAction() {
- private static final long serialVersionUID = 1L;
- @Override
- public void actionPerformed(ActionEvent e) {
- chooseTabTemp();
- JScrollPane scrollPane = getScrollPaneFromTabbedPane();
- if (!GuiSettings.getSelectedObjects().isEmpty()) {
- if (scrollPane.getViewport().getComponent(0)instanceof GroupNodeCanvas groupNodeCanvas) {
- control.cut(groupNodeCanvas.getGroupNode());
- control.calculateStateAndVisualForCurrentTimeStep();
- scrollPane.getViewport().getComponent(0).repaint();
- } else {
- control.cut(null);
- control.calculateStateAndVisualForCurrentTimeStep();
- canvas.repaint();
- }
- if (!GuiSettings.getClipboardObjects().isEmpty()) {
- canvas.itemPaste.setEnabled(true);
- }
- }
- }
- };
- actionMap.put(cntrlXDown, controlX);
- holegJFrame.setJMenuBar(menuBar);
- holegJFrame.setIconImage(ImageImport.loadImage("/Images/Holeg.png", 30, 30));
- menuBar.add(mnNewMenu);
- mnNewMenu.add(mntmNew);
- mnNewMenu.add(mntmOpen);
- mnNewMenu.add(mntmSave);
- menuBar.add(mnNewMenuEdit);
- mnNewMenuEdit.add(mntmUndo);
- mnNewMenuEdit.add(mntmRedo);
- mntmFindReplace.addActionListener(actionEvent -> {
- try {
- SearchPopUp dialog = new SearchPopUp(control, canvas, holegJFrame);
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- dialog.setVisible(true);
- control.getObjectsInDepth();
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- });
- mnNewMenuEdit.add(mntmFindReplace);
- mnNewMenuEdit.add(mntmEditEdges);
- mntmEditEdges.addActionListener(actionEvent -> {
- EditEdgesPopUp edgePopUp = new EditEdgesPopUp(holegJFrame);
- edgePopUp.setCanvas(canvas);
- edgePopUp.setController(control);
- edgePopUp.setVisible(true);
- });
- // Edit -> Align All
- mnNewMenuEdit.add(mntmAlignAll);
- mntmAlignAll.addActionListener(actionEvent -> {
- // getScrollPaneFromTabbedPane().getViewport().getComponent(0) is always the
- // active canvas
- AbstractCanvas activeCanvas = ((AbstractCanvas) getScrollPaneFromTabbedPane().getViewport()
- .getComponent(0));
- if (activeCanvas != null) {
- activeCanvas.tryToAlignObjects();
- activeCanvas.repaint();
- }
- });
- menuBar.add(mnNewMenuOptions);
- mnNewMenuOptions.add(mntmResetCategory);
- mntmResetCategory.addActionListener(actionEvent -> {
- control.resetCategories();
- categoryTree.revalidate();
- categoryTree.repaint();
- });
- /**
- * Add Fairness Model Option to the option Menu
- */
- mnNewMenuOptions.add(mnFairnessModel);
- mnFairnessModel.add(mntmFairMinFirst);
- mntmFairMinFirst.setForeground(Color.BLUE);
- mntmFairMinFirst
- .setToolTipText("HolonObjects with the smallest mininum Demand will be partially supplied first.\n"
- + "After that as many HolonObjects as possible will get fully supplied.");
- mntmFairMinFirst.addActionListener(arg0 -> {
- control.getModel().setFairnessModel(FairnessModel.MininumDemandFirst);
- mntmFairMinFirst.setForeground(Color.BLUE);
- mntmFairAlleEqual.setForeground(mnFairnessModel.getForeground());
- control.calculateStateAndVisualForCurrentTimeStep();
- // Update UpperNodes
- Component canvasOrUpperNodeCanvas = getScrollPaneFromTabbedPane().getViewport().getComponent(0);
- if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
- groupNodeCanvas.repaint();
- }
- });
- mnFairnessModel.add(mntmFairAlleEqual);
- mntmFairAlleEqual.setToolTipText("HolonObjects will all get the same amount of energy.");
- mntmFairAlleEqual.addActionListener(arg0 -> {
- control.getModel().setFairnessModel(FairnessModel.AllEqual);
- mntmFairAlleEqual.setForeground(Color.BLUE);
- mntmFairMinFirst.setForeground(mnFairnessModel.getForeground());
- control.calculateStateAndVisualForCurrentTimeStep();
- // Update UpperNodes
- Component canvasOrUpperNodeCanvas = getScrollPaneFromTabbedPane().getViewport().getComponent(0);
- if (canvasOrUpperNodeCanvas != null && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
- groupNodeCanvas.repaint();
- }
- });
- menuBar.add(mnNewMenuView);
- mnNewMenuView.add(mntmCanvasSize);
- mntmCanvasSize.addActionListener(actionEvent -> {
- CanvasResizePopUp popUp = new CanvasResizePopUp(model, control, canvas, this.tabbedPaneInnerOriginal,
- holegJFrame);
- popUp.setVisible(true);
- });
- tabbedPaneInnerOriginal.addChangeListener(change -> {
- control.clearSelection();
- });
- mnNewMenuView.add(mntmCanvasSize);
- /*
- * Adds Checkbox to turn supply bars on/off
- */
- mnNewMenuView.add(showSupplyBarsCheckBox);
- showSupplyBarsCheckBox.setSelected(true);
- showSupplyBarsCheckBox.addActionListener(arg0 -> {
- GuiSettings.showSupplyBars = showSupplyBarsCheckBox.isSelected();
- canvas.repaint();
- // Update UpperNodes
- JScrollPane spane = getScrollPaneFromTabbedPane();
- if (spane != null) {
- Component canvasOrUpperNodeCanvas = spane.getViewport().getComponent(0);
- if (canvasOrUpperNodeCanvas != null
- && canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
- groupNodeCanvas.repaint();
- }
- }
- });
- initWindowMenu();
- /**
- * add Help Menu and its items
- */
- menuBar.add(mnHelp);
- mnHelp.add(mntmIntroduction);
- mnHelp.add(mntmUserManual);
- mnHelp.add(mntmAlgorithmHelp);
- mnHelp.add(mntmCodeDoc);
- mnHelp.add(mntmAboutUs);
- canvas.setBackground(Color.WHITE);
- canvas.setPreferredSize(new Dimension(GuiSettings.canvasSize.getX(), GuiSettings.canvasSize.getY()));
- /********************
- * RIGHT CONTAINER (INFORMATION)
- **********************/
- panelHolonEl.setLayout(new BoxLayout(panelHolonEl, BoxLayout.X_AXIS));
- toolBarHolonEl.setFloatable(false);
- panelHolonEl.add(toolBarHolonEl);
- /***********************
- * HolonElement Graph Actions
- **********************/
- /*
- * Update Local Period of an Element Graph
- */
- unitGraphLocalPeriod.addKeyListener(new KeyAdapter() {
- @Override
- public void keyReleased(KeyEvent e) {
- try {
- int localLength = Integer.parseInt(unitGraphLocalPeriod.getText());
- unitGraphLocalPeriod.setBackground(Color.WHITE);
- /**
- * set local graph Period
- */
- if (e.getKeyCode() == KeyEvent.VK_ENTER)
- unitGraph.setLocalPeriod(localLength);
- } catch (NumberFormatException ex) {
- unitGraphLocalPeriod.setBackground(ColorPreference.GUI.PALE_RED);
- }
- }
- });
- /*****************************
- * RIGHT CONTAINER DONE
- *****************************/
- holegJFrame.getContentPane().setLayout(new BorderLayout(0, 0));
- /****************
- * Tree Stuff
- ****************/
- // Override Key Actions
- inputMap = categoryTree.getInputMap();
- inputMap.put(KeyStroke.getKeyStroke("control C"), cntrlCDown);
- inputMap.put(KeyStroke.getKeyStroke("control V"), cntrlVDown);
- inputMap.put(KeyStroke.getKeyStroke("control X"), cntrlXDown);
- inputMap.put(KeyStroke.getKeyStroke("control A"), cntrlADown);
- TreeCellRenderer customRenderer = new TreeCellRenderer() {
- @Override
- public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
- boolean leaf, int row, boolean hasFocus) {
- JLabel label = new JLabel();
- Image imgR;
- if (leaf) {
- for (Category cat : GuiSettings.getCategories()) {
- for (AbstractCanvasObject cps : cat.getObjects()) {
- if (value.toString().equals(cps.getName())) {
- imgR = ImageImport.loadImage(cps.getImage(), 50, 50);
- if (imgR != null) {
- label.setIcon(new ImageIcon(imgR));
- }
- label.setText(cps.getName());
- }
- }
- }
- }
- tree.setRowHeight(50);
- if (hasFocus) {
- label.setForeground(ColorPreference.Category.Focus);
- label.setOpaque(true);
- }
- if (label.getText().isEmpty()) {
- label.setText(value.toString());
- if (!value.toString().equals("Categories")) {
- label.setIcon(new ImageIcon(ImageImport.loadImage("/Images/folder.png")));
- }
- }
- return label;
- }
- };
- categoryTree.setCellRenderer(customRenderer);
- categoryTree.addMouseMotionListener(new MouseMotionAdapter() {
- public void mouseDragged(MouseEvent e) {
- checkForDragAndDrop(e);
- }
- /**
- * checks if an object of the current Panel could be replaced by the dragged
- * object
- *
- * @param e
- */
- private void checkForDragAndDrop(MouseEvent e) {
- try {
- /**
- * if no object gets dragged -> finished
- */
- if (!dragging)
- return;
- /**
- * select the current Panel
- */
- chooseTabTemp();
- JScrollPane scrollPane = getScrollPaneFromTabbedPane();
- if (scrollPane == null)
- return;
- Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
- /**
- * check for replacements on the canvas
- */
- if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
- if (unc.getMousePosition() == null)
- return;
- int x = (int) unc.getMousePosition().getX() + 16;
- int y = (int) unc.getMousePosition().getY() + 16;
- /**
- * check for replacement
- */
- groupNodeCanvas.checkForReplacement(x, y);
- /**
- * repaint
- */
- unc.invalidate();
- unc.repaint();
- } else {
- if (canvas.getMousePosition() == null)
- return;
- int x = (int) canvas.getMousePosition().getX() + 16;
- int y = (int) canvas.getMousePosition().getY() + 16;
- /**
- * check for replacement
- */
- canvas.checkForReplacement(x, y);
- /**
- * repaint
- */
- canvas.invalidate();
- canvas.repaint();
- }
- contentPane.updateUI();
- } catch (Exception eex) {
- eex.printStackTrace();
- }
- }
- });
- categoryTree.addMouseListener(new MouseAdapter() {
- public void mouseReleased(MouseEvent e) {
- try {
- if (dragging) {
- chooseTabTemp();
- JScrollPane scrollPane = getScrollPaneFromTabbedPane();
- Component canvasOrUpperNodeCanvas = scrollPane.getViewport().getComponent(0);
- if (canvasOrUpperNodeCanvas instanceof GroupNodeCanvas groupNodeCanvas) {
- int x = (int) groupNodeCanvas.getMousePosition().getX() + 16;
- int y = (int) groupNodeCanvas.getMousePosition().getY() + 16;
- AbstractCanvasObject h = null;
- if (tempCps instanceof HolonObject hO) {
- h = new HolonObject(hO);
- }
- if (tempCps instanceof HolonSwitch sw) {
- h = new HolonSwitch(sw);
- }
- h.setPosition(x, y);
- /**
- * close UpperNodeTabs of replaced UpperNode
- */
- if (groupNodeCanvas.mayBeReplaced != null
- && groupNodeCanvas.mayBeReplaced instanceof GroupNode) {
- groupNodeCanvas.closeUpperNodeTab(groupNodeCanvas.mayBeReplaced.getId());
- }
- control.addObjectInGroupNode(h, groupNodeCanvas.getGroupNode());
- /**
- * object would be replaced
- */
- groupNodeCanvas.mayBeReplaced = null;
- groupNodeCanvas.invalidate();
- control.calculateStateAndVisualForCurrentTimeStep();
- groupNodeCanvas.repaint();
- groupNodeCanvas.setXY((int) canvas.getMousePosition().getX(),
- (int) canvas.getMousePosition().getY());
- } else {
- int x = (int) canvas.getMousePosition().getX() + 16;
- int y = (int) canvas.getMousePosition().getY() + 16;
- AbstractCanvasObject h = null;
- if (tempCps instanceof HolonObject hO) {
- h = new HolonObject(hO);
- }
- if (tempCps instanceof HolonSwitch sw) {
- h = new HolonSwitch(sw);
- }
- h.setPosition(x, y);
- /**
- * close UpperNodeTabs of replaced UpperNode
- */
- if (canvas.mayBeReplaced != null && canvas.mayBeReplaced instanceof GroupNode) {
- canvas.closeUpperNodeTab(canvas.mayBeReplaced.getId());
- }
- control.addObjectCanvas(h);
- /**
- * no object should get replaced
- */
- canvas.mayBeReplaced = null;
- canvas.invalidate();
- canvas.setXY((int) canvas.getMousePosition().getX(),
- (int) canvas.getMousePosition().getY());
- canvas.repaint();
- }
- control.calculateStateAndVisualForCurrentTimeStep();
- contentPane.updateUI();
- dragging = false;
- }
- } catch (Exception eex) {
- }
- holegJFrame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
- }
- });
- popmenuEdit.add(editItem);
- popmenuEdit.add(removeItem);
- editItem.setEnabled(false);
- editItem.addActionListener(actionEvent -> {
- });
- categoryTree.addMouseListener(new MouseAdapter() {
- public void mousePressed(MouseEvent e) {
- try {
- actualObjectClicked = categoryTree.getPathForLocation(e.getX(), e.getY()).getLastPathComponent()
- .toString();
- // if an Object was selected, the porperties are shown in
- // the table
- DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) categoryTree
- .getPathForLocation(e.getX(), e.getY()).getLastPathComponent();
- if (SwingUtilities.isRightMouseButton(e)) {
- for (Category cat : GuiSettings.getCategories()) {
- for (AbstractCanvasObject cps : cat.getObjects()) {
- if (actualObjectClicked.equals(cps.getName())
- && !(cps instanceof HolonSwitch)) {
- editItem.setEnabled(true);
- popmenuEdit.show(e.getComponent(), e.getX(), e.getY());
- catOfObjToBeEdited = selectedNode.getParent().toString();
- tempCps = cps;
- }
- }
- }
- } else {
- for (Category cat : GuiSettings.getCategories()) {
- for (AbstractCanvasObject cps : cat.getObjects()) {
- if (actualObjectClicked.equals(cps.getName())) {
- File checkPath = new File(cps.getImage());
- if (checkPath.exists()) {
- img = new ImageIcon(cps.getImage()).getImage().getScaledInstance(32, 32,
- java.awt.Image.SCALE_SMOOTH);
- } else {
- img = ImageImport.loadImage(cps.getImage(), 32, 32);
- }
- tempCps = cps;
- dragging = true;
- Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(img, new Point(0, 0),
- "Image");
- holegJFrame.setCursor(cursor);
- }
- }
- }
- }
- } catch (Exception eex) {
- }
- }
- });
- editItem.addActionListener(actionEvent -> {
- // Remove the selected Object object
- // AddObjectPopUp(boolean edit, AbstractCpsObject obj, String cat, JFrame
- // parentFrame)
- System.out.println("Edit");
- addObjectPopUP = new AddObjectPopUp(true, tempCps, catOfObjToBeEdited, holegJFrame);
- addObjectPopUP.setCategory(catOfObjToBeEdited);
- addObjectPopUP.setController(control);
- addObjectPopUP.setVisible(true);
- });
- removeItem.addActionListener(actionEvent -> {
- // Remove the selected Object object
- log.info("catOfObjToBeEdited:" + catOfObjToBeEdited + ", tempCps:" + tempCps);
- control.findCategoryWithName(catOfObjToBeEdited).ifPresent(cat -> {
- cat.removeObjectsWithName(tempCps.getName());
- });
- });
- scrollPane1.setViewportView(categoryTree);
- scrollPane1.setColumnHeaderView(panel);
- panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
- toolBar.setAlignmentX(Component.LEFT_ALIGNMENT);
- toolBar.setFloatable(false);
- panel.add(toolBar);
- btnAddPopUp.add(mItemNew);
- mItemNew.addActionListener(actionEvent -> {
- new CreateNewDialog(control, holegJFrame);
- });
- btnAddPopUp.addSeparator();
- btnAddPopUp.add(mItemCategory);
- mItemCategory.addActionListener(actionEvent -> {
- new CreateNewDialog(control, Option.Category, holegJFrame);
- });
- btnAddPopUp.add(mItemObject);
- mItemObject.addActionListener(actionEvent -> {
- new CreateNewDialog(control, Option.Object, holegJFrame);
- });
- btnAddPopUp.add(mItemSwitch);
- mItemSwitch.addActionListener(actionEvent -> {
- new CreateNewDialog(control, Option.Switch, holegJFrame);
- });
- btnAdd.addActionListener(actionEvent -> btnAddPopUp.show(btnAdd, -1, +20));
- btnAdd.setIcon(new ImageIcon(ImageImport.loadImage("Images/plus.png", 16, 16)));
- btnAdd.setToolTipText("<html><b>New</b><br>Add a new Category or Item to the library.</html>");
- toolBar.add(btnAdd);
- /**
- * Help Menu Action Listeners
- */
- /**
- * URL of the telecommunication git Wiki
- */
- String tkWikiWebpage = "https://git.tk.informatik.tu-darmstadt.de/carlos.garcia/praktikum-holons/wiki/";
- /** open Introduction Web Page */
- mntmIntroduction.addMouseListener(new MouseAdapter() {
- @Override
- public void mousePressed(MouseEvent e) {
- openWebpage(tkWikiWebpage + "Introduction+V2.1");
- }
- });
- /** open UserManual WebPage */
- mntmUserManual.addMouseListener(new MouseAdapter() {
- @Override
- public void mousePressed(MouseEvent e) {
- openWebpage(tkWikiWebpage + "User+Manual+V2.1");
- }
- });
- /** open Algorithm Help Web Page */
- mntmAlgorithmHelp.addMouseListener(new MouseAdapter() {
- @Override
- public void mousePressed(MouseEvent e) {
- openWebpage(tkWikiWebpage + "Algorithms+V2.1");
- }
- });
- /** open Code Documentation Web Page */
- mntmCodeDoc.addMouseListener(new MouseAdapter() {
- @Override
- public void mousePressed(MouseEvent e) {
- openWebpage(tkWikiWebpage + "Code+documentation+V2.1");
- }
- });
- /**
- * Pop up - About Us with some important information about the developers,
- * source and programming stuff
- */
- mntmAboutUs.addMouseListener(new MouseAdapter() {
- @Override
- public void mousePressed(MouseEvent e) {
- aboutUsPopUp = new AboutUsPopUp(holegJFrame);
- aboutUsPopUp.setVisible(true);
- }
- });
- // Del Button
- btnDel.addActionListener(actionEvent -> {
- Object nodeInfo = categoryTree.getLastSelectedPathComponent();
- if (nodeInfo != null) {
- DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) nodeInfo;
- String nodeName = selectedNode.getUserObject().toString();
- int depthOfNode = selectedNode.getLevel();
- try {
- switch (depthOfNode) {
- case 1:
- int dialogResult = JOptionPane.showConfirmDialog(holegJFrame, eraseCategory + nodeName + "?",
- warningText, JOptionPane.YES_NO_OPTION);
- if (dialogResult == JOptionPane.YES_OPTION) {
- GuiSettings.getCategories().stream().filter(cat -> cat.getName() == nodeName).findAny()
- .ifPresent(cat -> {
- control.deleteCategory(cat);
- });
- }
- break;
- case 2:
- DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();
- control.findCategoryWithName(parent.getUserObject().toString()).ifPresent(cat -> {
- cat.removeObjectsWithName(nodeName);
- });
- break;
- default:
- JOptionPane.showMessageDialog(holegJFrame, selectObjBeforeErase);
- }
- } catch (Exception e2) {
- }
- } else {
- JOptionPane.showMessageDialog(holegJFrame, selectObjBeforeErase);
- }
- categoryTree.repaint();
- });
- btnDel.setIcon(new ImageIcon(ImageImport.loadImage("Images/minus.png", 16, 16)));
- btnDel.setToolTipText("<html><b>Delete</b><br>Removes a Category or a Category Item.</html>");
- toolBar.add(btnDel);
- holegJFrame.getContentPane().add(splitPane);
- mntmNew.addActionListener(actionEvent -> {
- if (model.getObjectsOnCanvas().size() != 0) {
- int newWarning = JOptionPane.YES_NO_OPTION;
- int dialogForNewWarning = JOptionPane.showConfirmDialog(holegJFrame, saveBeforeNew, warningText,
- newWarning);
- if (dialogForNewWarning == JOptionPane.YES_OPTION) {
- mntmSave.doClick();
- }
- }
- // Remove all but main tab
- while (tabbedPaneInnerOriginal.getTabCount() > 1) {
- tabbedPaneInnerOriginal.remove(1);
- }
- control.clearSelection();
- model.getEdgesOnCanvas().clear();
- model.getObjectsOnCanvas().clear();
- control.OnSelectionChanged.broadcast();
- GuiSettings.getSelectedEdges().clear();
- control.getModel().setCurrentIteration(0);
- elementGraph.setText("None");
- canvas.tempCps = null;
- canvas.repaint();
- IdCounter.resetObjectCounter(CounterType.Object);
- IdCounter.resetObjectCounter(CounterType.Element);
- control.calculateStateAndVisualForCurrentTimeStep();
- });
- mntmOpen.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent evt) {
- menuFileExitActionPerformed();
- }
- private void menuFileExitActionPerformed() {
- JFileChooser fileChooser = new JFileChooser();
- fileChooser.setCurrentDirectory(new File(System.getProperty("user.dir") + "/exampleNetworks/"));
- FileNameExtensionFilter holonFilter = new FileNameExtensionFilter("Holon Save File(*.holon)", "holon");
- fileChooser.setFileFilter(holonFilter);
- if (fileChooser.showOpenDialog(holegJFrame) == JFileChooser.APPROVE_OPTION) {
- File file = fileChooser.getSelectedFile();
- try {
- while (tabbedPaneInnerOriginal.getTabCount() > 1) {
- tabbedPaneInnerOriginal.remove(1);
- }
- GuiSettings.getSelectedObjects().clear();
- control.loadFile(file.getAbsolutePath());
- canvas.repaint();
- categoryTree.repaint();
- control.calculateStateAndVisualForCurrentTimeStep();
- } catch (IOException | ArchiveException e) {
- e.printStackTrace();
- JLabel message = new JLabel("The savefile is corrupt and cannot be opened.");
- JOptionPane.showMessageDialog(holegJFrame, message, "", JOptionPane.ERROR_MESSAGE);
- }
- }
- }
- });
- mntmSave.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent evt) {
- menuSaveActionPerformed();
- }
- private void menuSaveActionPerformed() {
- JFileChooser fileChooser = new JFileChooser();
- FileNameExtensionFilter holonFilter = new FileNameExtensionFilter("Holon Save File(*.holon)", "holon");
- fileChooser.setFileFilter(holonFilter);
- if (fileChooser.showSaveDialog(holegJFrame) == JFileChooser.APPROVE_OPTION) {
- File selectedFile = fileChooser.getSelectedFile();
- String fileName = selectedFile.getName();
- String fullPath = fileChooser.getSelectedFile().getPath();
- if (fileChooser.getFileFilter().equals(holonFilter)) {
- if (!fileName.contains("."))
- fullPath += ".holon";
- }
- if (!fullPath.endsWith(".holon")) {
- String suffix = fullPath.substring(fullPath.lastIndexOf("."), fullPath.length());
- String[] options = new String[] { "keep .holon", "use " + suffix };
- JLabel message = new JLabel(
- "Are you sure to use the extension \"" + suffix + "\" instead of \".holon\"?");
- int response = JOptionPane.showOptionDialog(holegJFrame, message, "",
- JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[1]);
- if (response == 0)
- fullPath = fullPath.replace(suffix, ".holon");
- }
- try {
- control.saveFile(new File(fullPath).getAbsolutePath());
- } catch (IOException | ArchiveException e) {
- e.printStackTrace();
- }
- }
- }
- });
- mntmUndo.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent evt) {
- menuUndoActionPerformed();
- }
- private void menuUndoActionPerformed() {
- try {
- control.loadAutoSave(control.getUndoSave());
- closeInvalidUpperNodeTabs();
- control.calculateStateAndVisualForCurrentTimeStep();
- canvas.repaint();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- });
- mntmRedo.addActionListener(new ActionListener() {
- @Override
- public void actionPerformed(ActionEvent evt) {
- menuRedoActionPerformed();
- }
- private void menuRedoActionPerformed() {
- try {
- control.loadAutoSave(control.getRedoSave());
- closeInvalidUpperNodeTabs();
- control.calculateStateAndVisualForCurrentTimeStep();
- canvas.repaint();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- });
- timePanel = new TimePanel(control);
- timePanel.setBorder(null);
- timePanel.getTimeSlider().addChangeListener(changeEvent -> {
- // TimeSliderChanged event
- control.calculateStateAndVisualForTimeStep(timePanel.getTimeSlider().getValue());
- unitGraph.repaint();
- contentPane.updateUI();
- });
- splitPane1.setMinimumSize(new Dimension(0, 25));
- splitPane.setRightComponent(splitPane1);
- splitPane.setDividerLocation(200);
- splitPane1.setDividerLocation(500);
- splitPane.setLeftComponent(scrollPane1);
- tabbedPaneOriginal.addTab("View", tabbedPaneInnerOriginal);
- myPanel.add(canvasSP, BorderLayout.CENTER);
- tabbedPaneInnerOriginal.addTab("Main Grid", myPanel);
- splitPane1.setLeftComponent(tabbedPaneOriginal);
- splitPane1.setRightComponent(splitHolonElPro);
- splitPane1.setResizeWeight(0.9);
- splitHolonElPro.setDividerLocation(700);
- // containing the graph and the elements-list
- splitHolonElPro.setTopComponent(inspector);
- // containing the object's properties
- splitHolonElPro.setBottomComponent(scrollProperties);
- canvasSP.setViewportView(canvas);
- // Set up of the Properties section
- scrollProperties.setViewportView(this.informationPanel);
- scrollProperties.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
- scrollProperties.getVerticalScrollBar().setUnitIncrement(16);
- tabbedPaneOriginal.setBorder(null);
- scrollProperties.setBorder(null);
- splitPane.setBorder(null);
- splitPane1.setBorder(null);
- splitHolonElPro.setBorder(null);
- panelHolonEl.setBorder(null);
- canvasSP.setBorder(null);
- holegJFrame.getContentPane().add(timePanel, BorderLayout.SOUTH);
- try {
- control.loadAutoSave(System.getProperty("user.home") + "/.config/HolonGUI/Category/Category.json");
- } catch (IOException e1) {
- }
- String autoPath = System.getProperty("user.home") + "/.config/HolonGUI/Autosave/";
- File dest = new File(autoPath);
- ArrayList<File> oldAutoSaves = control.filterOldAutoSaveFiles();
- int nrOfOldSaves = oldAutoSaves.size();
- if (nrOfOldSaves > 0) {
- int dialogButton = JOptionPane.YES_NO_OPTION;
- int dialogResult = JOptionPane.showConfirmDialog(holegJFrame,
- "Old autosave file was found, should it be loaded?", warningText, dialogButton);
- if (dialogResult == JOptionPane.YES_OPTION) {
- if (dest.exists()) {
- GuiSettings.autoSaveNr = (nrOfOldSaves - 1);
- mntmRedo.doClick();
- } else {
- JOptionPane.showMessageDialog(holegJFrame, "Autosave could not be loaded.");
- setUpAutoSave(dest);
- }
- } else {
- setUpAutoSave(dest);
- }
- // after all: delete the obsolete/old autosave files from the
- // directory
- control.deleteObsoleteAutoSaveFiles();
- }
- canvasSP.addComponentListener(new ComponentAdapter() {
- @Override
- public void componentResized(ComponentEvent e) {
- GuiSettings.canvasSize.setX(Math.max(GuiSettings.canvasSize.getX(), canvasSP.getViewport().getWidth()));
- GuiSettings.canvasSize
- .setY(Math.max(GuiSettings.canvasSize.getY(), canvasSP.getViewport().getHeight()));
- canvas.repaint();
- }
- });
- }
- private void initWindowMenu() {
- menuBar.add(menuWindow);
- // Algo
- JMenuItem openMenu = new JMenuItem("Open Algorithm Panel", new ImageIcon(ImageImport
- .loadImage("/Button_Images/iconAlgo.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
- openMenu.addActionListener(actionEvent -> {
- new AddOnWindow(holegJFrame, control);
- });
- openMenu.setAccelerator(KeyStroke.getKeyStroke('N', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()));
- menuWindow.add(openMenu);
- // Outliner
- JMenuItem openOutliner = new JMenuItem("Open Outliner", new ImageIcon(ImageImport
- .loadImage("/Button_Images/iconOutliner.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
- openOutliner.addActionListener(actionEvent -> {
- new Outliner(holegJFrame, model, control);
- });
- openOutliner
- .setAccelerator(KeyStroke.getKeyStroke('O', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()));
- menuWindow.add(openOutliner);
- // FlexWindow
- JMenuItem openFlexMenuItem = new JMenuItem("Open Flexibility Panel", new ImageIcon(ImageImport
- .loadImage("/Button_Images/iconAlgo.png").getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH)));
- openFlexMenuItem.addActionListener(actionEvent -> {
- new FlexWindow(holegJFrame, control);
- });
- openFlexMenuItem
- .setAccelerator(KeyStroke.getKeyStroke('L', Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()));
- menuWindow.add(openFlexMenuItem);
- }
- private boolean isUpperPanelInsideBounds() {
- int x = holegJFrame.getX();
- int y = holegJFrame.getY();
- int width = holegJFrame.getWidth();
- // get all connected screen devices
- GraphicsDevice[] screenDevices = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices();
- boolean isUpperPanelVisible = false;
- // and check whether they contain the upper left or upper right point of
- // the frame
- for (GraphicsDevice device : screenDevices) {
- Rectangle bounds = device.getDefaultConfiguration().getBounds();
- if (bounds.contains(x, y) || bounds.contains(x + width, y)) {
- isUpperPanelVisible = true;
- break;
- }
- }
- return isUpperPanelVisible;
- }
- /**
- * Sets up autosave if no old one is loaded at the beginning
- *
- * @param dest path to save-folder
- */
- private void setUpAutoSave(File dest) {
- dest.mkdirs();
- control.tryAutoSave();
- }
- /**
- * reloads the Categories from Model.
- *
- * @param categories the current categories
- */
- private void updateCategories(Collection<Category> categories) {
- DefaultTreeModel treemodel = new DefaultTreeModel(new DefaultMutableTreeNode("Categories") {
- private static final long serialVersionUID = 1L;
- {
- DefaultMutableTreeNode node1;
- for (Category c : categories) {
- node1 = new DefaultMutableTreeNode(c.getName());
- for (AbstractCanvasObject obj : c.getObjects()) {
- node1.add(new DefaultMutableTreeNode(obj.getName()));
- }
- add(node1);
- }
- }
- });
- categoryTree.setModel(treemodel);
- }
- /**
- * When changes are made to the Categories.
- *
- * @param categories the Categories
- */
- public void updateCategoryUI(Collection<Category> categories) {
- DefaultTreeModel model = (DefaultTreeModel) categoryTree.getModel();
- updateCategories(categories);
- model.reload();
- }
- void setVisible(boolean value) {
- holegJFrame.setVisible(value);
- }
- /*
- * Open a new Tab with an UpperNodeCanvas
- */
- public void openNewUpperNodeTab(GroupNode node) {
- chooseTabTemp();
- JScrollPane scrollPane = getScrollPaneFromTabbedPane();
- if (scrollPane.getViewport().getComponent(0)instanceof Canvas canvasPanel) {
- unc = new GroupNodeCanvas(model, control, unitGraph, node, "", canvasPanel);
- } else if (scrollPane.getViewport().getComponent(0)instanceof GroupNodeCanvas groupNodeCanvas) {
- unc = new GroupNodeCanvas(model, control, unitGraph, node, groupNodeCanvas.getParentPath() + " -> ",
- scrollPane.getViewport().getComponent(0));
- }
- // check if tab already open for clicked NodeOfNode
- boolean dupl = false;
- for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
- JScrollPane paneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
- if (paneOriginal != null && ((GroupNodeCanvas) paneOriginal.getViewport().getComponent(0)).getGroupNode()
- .getId() == node.getId()) {
- dupl = true;
- // set selected component to view
- tabbedPaneOriginal.setSelectedComponent(tabbedPaneInnerOriginal);
- // set selected tab in view to found upper-node-canvas
- tabbedPaneInnerOriginal.setSelectedComponent(tabbedPaneInnerOriginal.getComponentAt(i));
- }
- // if we found a duplicate, break
- if (dupl) {
- break;
- }
- }
- if (!dupl) {
- JScrollPane sp = new JScrollPane(unc);
- sp.setBorder(null);
- // Selected tabbed Pane = tabbedPaneOriginal or tabbedPaneSplit
- if (tabTemp == tabbedPaneOriginal) {
- this.tabbedPaneInnerOriginal.add(node.getName(), sp);
- this.tabbedPaneInnerOriginal.setSelectedComponent(sp);
- this.tabbedPaneInnerOriginal.setTabComponentAt(this.tabbedPaneInnerOriginal.getTabCount() - 1,
- new ButtonTabComponent(this.tabbedPaneInnerOriginal));
- }
- }
- }
- // TODO(Tom2021-12-1) refactor tabbedPane and access to groupNodeViews
- private void updateUpperNodes() {
- for (Component c : tabbedPaneInnerOriginal.getComponents()) {
- if (!(c instanceof JScrollPane)) {
- continue;
- }
- Component pane = ((JScrollPane) c).getViewport().getComponent(0);
- if (pane instanceof GroupNodeCanvas groupNodeCanvas) {
- //TODO(Tom2021-12-20) maybe
- if(temp instanceof GroupNode node) {
- groupNodeCanvas.setGroupNode(node);
- }else {
- log.warning("TODO tabbedPane confickt");
- }
- }
- }
- }
- /**
- * Removes UpperNodeTab if UpperNode was deleted
- *
- * @param cps the CPS object that is currently selected
- */
- private void removeUpperNodeTab(AbstractCanvasObject cps) {
- if (cps instanceof GroupNode) {
- for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
- JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
- if (scrollPaneOriginal == null) {
- } else if (((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode()
- .getId() == cps.getId()) {
- ((ButtonTabComponent) tabbedPaneInnerOriginal.getTabComponentAt(i)).removeTabs();
- break;
- }
- }
- }
- }
- /**
- * chooses whether to set the tabTemp to tabbedPaneOriginal or tabbedPaneSplit
- */
- private void chooseTabTemp() {
- // TODO(Tom2021-12-1) Remove tabTabbed
- tabTemp = tabbedPaneOriginal;
- }
- private JScrollPane getScrollPaneFromTabbedPane() {
- return getScrollPaneFromTabbedPane(-1);
- }
- private JScrollPane getScrollPaneFromTabbedPane(int index) {
- Component upperLevelSelectedComponent;
- if (tabTemp == null) {
- return null;
- }
- if (index == -1) {
- upperLevelSelectedComponent = tabTemp.getSelectedComponent();
- } else {
- upperLevelSelectedComponent = tabTemp.getComponentAt(index);
- }
- if (upperLevelSelectedComponent instanceof JTabbedPane) {
- Component nextLevel = ((JTabbedPane) upperLevelSelectedComponent).getSelectedComponent();
- if (nextLevel instanceof JPanel panel)
- return (JScrollPane) panel.getComponent(0);
- else
- return (JScrollPane) nextLevel;
- } else if (upperLevelSelectedComponent instanceof JScrollPane scrollPane) {
- return scrollPane;
- } else {
- return null;
- }
- }
- private void openWebpage(String URL) {
- try {
- java.awt.Desktop.getDesktop().browse(new URI(URL));
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * closes all UpperNodeTabs, that don't have a valid UpperNode (e.g. if it was
- * ungrouped/deleted/replaced and so on)
- */
- private void closeInvalidUpperNodeTabs() {
- /**
- * close bugged Tabs
- */
- for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
- JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
- if (((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode() == null) {
- ((ButtonTabComponent) tabbedPaneInnerOriginal.getTabComponentAt(i)).removeTabs();
- break;
- }
- }
- }
- public void repaintCanvas() {
- tabbedPaneInnerOriginal.revalidate();
- tabbedPaneInnerOriginal.repaint();
- for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
- JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
- scrollPaneOriginal.revalidate();
- }
- }
- /**
- * TODO(Tom2021-12-1): Class should be reworked as soon as possible!
- *
- * @param state
- */
- public void guiDisable(boolean state) {
- canvas.disabled = state;
- for (int i = 1; i < tabbedPaneInnerOriginal.getTabCount(); i++) {
- JScrollPane scrollPaneOriginal = (JScrollPane) tabbedPaneInnerOriginal.getComponentAt(i);
- if (((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).getGroupNode() != null) {
- ((GroupNodeCanvas) scrollPaneOriginal.getViewport().getComponent(0)).disabled = state;
- }
- }
- }
- }
|