package ui.view; import java.io.File; import java.text.AttributedCharacterIterator; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JTree; import javax.swing.BoxLayout; import javax.swing.JSplitPane; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeCellRenderer; import ui.controller.Control; import ui.model.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.JEditorPane; import javax.swing.JFileChooser; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; import java.awt.Shape; import java.awt.Toolkit; import java.awt.BorderLayout; import javax.swing.JPanel; import javax.swing.JToolBar; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.DefaultComboBoxModel; import javax.swing.ImageIcon; import classes.Category; import classes.CpsObject; import classes.HolonElement; import classes.HolonObject; import classes.HolonSwitch; import classes.HolonTransformer; import Interfaces.CategoryListener; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.ImageObserver; import java.awt.event.ActionEvent; import javax.swing.JSlider; import javax.swing.event.ChangeListener; import javax.swing.event.ChangeEvent; import javax.swing.SwingConstants; public class GUI implements CategoryListener { private JFrame frmCyberPhysical; private final JMenuBar menuBar = new JMenuBar(); private final JMenu mnNewMenu = new JMenu("File"); private final JMenu mnNewMenu_1 = new JMenu("Edit"); private final JMenu mnNewMenu_2 = new JMenu("Options"); private final JMenu mnNewMenu_3 = new JMenu("View"); private final JMenu mnHelp = new JMenu("Help"); private final JMenuItem mntmOpen = new JMenuItem("Open"); private final JMenuItem mntmNew = new JMenuItem("New"); private final JMenuItem mntmSave = new JMenuItem("Save"); private final JSplitPane splitPane = new JSplitPane(); private final JSplitPane splitPane_1 = new JSplitPane(); private final JScrollPane scrollPane_1 = new JScrollPane(); private final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP); private final JScrollPane scrollPane_2 = new JScrollPane(); private final JTree tree = new JTree(); private final JEditorPane dtrpnHereWillBe = new JEditorPane(); private final JSplitPane splitPane_2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT); private JTable table = new JTable(); private DefaultTableModel tableModel = new DefaultTableModel(); private final Model model; private final Control controller; private AddObjectPopUp addObjectPopUP; private final JPanel panel = new JPanel(); private final JComboBox comboBox = new JComboBox(); // Buttons private final JButton btnAdd = new JButton("+"); private final JButton btnDel = new JButton("-"); private final JToolBar toolBar = new JToolBar(); // variables private boolean dragging = false; private String actualObjectClicked; private Image img = null; private CpsObject tempCps = null; private MyCanvas canvas; private final JSplitPane splitPane_3 = new JSplitPane(); private final JSlider slider = new JSlider(); private final JLabel lblImageSize = new JLabel("Image Size"); /** * Create the application. */ public GUI(Control control) { this.controller = control; this.model = control.getModel(); this.canvas = new MyCanvas(model, control); control.initListener(this); initialize(); updateCategories(model.getCategories()); } /** * Initialize the contents of the frame. */ @SuppressWarnings({ "serial", "unchecked" }) private void initialize() { frmCyberPhysical = new JFrame(); frmCyberPhysical.setTitle("Cyber Physical Systems Model"); frmCyberPhysical.setBounds(100, 100, 1000, 800); frmCyberPhysical.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frmCyberPhysical.setJMenuBar(menuBar); menuBar.add(mnNewMenu); mnNewMenu.add(mntmNew); mnNewMenu.add(mntmOpen); mnNewMenu.add(mntmSave); menuBar.add(mnNewMenu_1); menuBar.add(mnNewMenu_2); menuBar.add(mnNewMenu_3); mnNewMenu_3.add(splitPane_3); slider.setMinimum(15); slider.setMaximum(115); slider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { controller.setScale(slider.getValue()); tree.setRowHeight(model.getScale()); canvas.objectSelectionHighlighting(); canvas.repaint(); } }); splitPane_3.setRightComponent(slider); splitPane_3.setLeftComponent(lblImageSize); menuBar.add(mnHelp); canvas.setBackground(Color.WHITE); canvas.setPreferredSize(new Dimension(10000, 10000)); JScrollPane canvasSP = new JScrollPane(canvas); tabbedPane.addTab("Modeling", new ImageIcon(new ImageIcon(this.getClass().getResource("/Images/home.png")) .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH)), canvasSP, "Model a CPS"); tabbedPane.addTab("Simulation", new ImageIcon(new ImageIcon(this.getClass().getResource("/Images/Dummy_House.png")).getImage() .getScaledInstance(30, 30, Image.SCALE_SMOOTH)), scrollPane_2, "Simulate the CPS"); dtrpnHereWillBe.setText("Here will be the Simulation"); scrollPane_2.setViewportView(dtrpnHereWillBe); JScrollPane scrollPane = new JScrollPane(); // Table Set up Object[] columnNames = { "Device", "Type", "Energy", "Quantity" }; tableModel.setColumnIdentifiers(columnNames); table.setModel(tableModel); scrollPane.setViewportView(table); table.setFillsViewportHeight(true); table.setCellSelectionEnabled(true); table.setColumnSelectionAllowed(true); frmCyberPhysical.getContentPane().setLayout(new BorderLayout(0, 0)); 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 = null; if (leaf) { for (Category cat : model.getCategories()) { for (CpsObject cps : cat.getObjects()) { if (value.toString().compareTo(cps.getCompareName()) == 0) { imgR = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage() .getScaledInstance(controller.getScale(), controller.getScale(), java.awt.Image.SCALE_SMOOTH); if (imgR != null) { label.setIcon(new ImageIcon(imgR)); } label.setText(cps.getName()); } } } } tree.setRowHeight(controller.getScale()); if (hasFocus) { label.setForeground(new Color(0, 0, 255)); label.setOpaque(true); } if (label.getText().length() == 0) { label.setText(value.toString()); if (value.toString().compareTo("Categories") != 0) { label.setIcon(new ImageIcon(this.getClass().getResource("/Images/folder.png"))); } } return label; } }; tree.setCellRenderer(customRenderer); tree.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { try { if (dragging) { int x = (int) canvas.getMousePosition().getX(); int y = (int) canvas.getMousePosition().getY(); CpsObject h = null; if (tempCps.getClass() == HolonObject.class) { h = new HolonObject(tempCps); } if (tempCps.getClass() == HolonSwitch.class) { h = new HolonSwitch(tempCps); } if (tempCps.getClass() == HolonTransformer.class) { h = new HolonTransformer(tempCps); } h.setPosition(x, y); controller.addObjectCanvas(h); for (int i = 0; i < model.getObjectsOnCanvas().size(); i++) { CpsObject temp = model.getObjectsOnCanvas().get(i); String output = "Element: " + temp.getObjName() + " with ID: " + temp.getID(); if (temp.getClass() == HolonObject.class) { output = output + " and Elements: " + ((HolonObject) temp).toStringElements(); } System.out.println(output); } canvas.repaint(); dragging = false; } } catch (Exception e2) { } frmCyberPhysical.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } }); tree.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { try { actualObjectClicked = tree.getPathForLocation(e.getX(), e.getY()).getLastPathComponent().toString(); for (Category cat : model.getCategories()) { for (CpsObject cps : cat.getObjects()) { if (actualObjectClicked.compareTo(cps.getCompareName()) == 0) { img = new ImageIcon(this.getClass().getResource(cps.getImage())).getImage() .getScaledInstance(controller.getScale(), controller.getScale(), java.awt.Image.SCALE_SMOOTH); tempCps = cps; dragging = true; Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(img, new Point(0, 0), "Image"); frmCyberPhysical.setCursor(cursor); } } } } catch (Exception e2) { } } }); scrollPane_1.setViewportView(tree); scrollPane_1.setColumnHeaderView(panel); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); toolBar.setFloatable(false); panel.add(toolBar); toolBar.add(comboBox); comboBox.setModel(new DefaultComboBoxModel(new String[] { "Category", "Object", "Transformer", "Switch" })); // Add Button btnAdd.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { Object nodeInfo = tree.getLastSelectedPathComponent(); String selectedOption = comboBox.getSelectedItem().toString(); DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) nodeInfo; switch (selectedOption) { case "Category": String catName = JOptionPane.showInputDialog("Please enter a Name for Category "); if (catName.length() != 0) { controller.addCategory(catName); } break; case "Object": if (selectedNode == null) { JOptionPane.showMessageDialog(new JFrame(), "Please select a Category first before adding " + selectedOption + "."); } if (selectedNode.getLevel() == 1) { addObjectPopUP = new AddObjectPopUp(); addObjectPopUP.setVisible(true); addObjectPopUP.setController(controller); addObjectPopUP.setCategory(selectedNode.toString()); } break; default: addObjectAction(selectedOption, selectedNode); break; } } }); canvas.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { if (tableModel.getRowCount() > 0) { for (int i = tableModel.getRowCount() - 1; i > -1; i--) { tableModel.removeRow(i); } } if (canvas.dataSelected != null) { for (HolonElement he : canvas.dataSelected) { Object[] temp = { he.getEleName(), he.getSign(), he.getEnergy(), he.getAmount() }; tableModel.addRow(temp); } } table.clearSelection(); } }); toolBar.add(btnAdd); // Del Button btnDel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { Object nodeInfo = tree.getLastSelectedPathComponent(); if (nodeInfo != null) { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) nodeInfo; String nodeName = selectedNode.getUserObject().toString(); int depthOfNode = selectedNode.getLevel(); switch (depthOfNode) { case 1: int dialogResult = JOptionPane.showConfirmDialog(null, "Do you realy want to delete the Category " + nodeName + "?", "Warning", JOptionPane.YES_NO_OPTION); if (dialogResult == JOptionPane.YES_OPTION) { controller.deleteCategory(nodeName); break; } else { break; } case 2: DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent(); controller.delObjectCategory(nodeName, parent.getUserObject().toString()); break; default: JOptionPane.showMessageDialog(new JFrame(), "Please select a Category or an Object in order to delete something."); } } else { JOptionPane.showMessageDialog(new JFrame(), "Please select a Category or an Object in order to delete something."); } } }); toolBar.add(btnDel); frmCyberPhysical.getContentPane().add(splitPane); mntmOpen.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { menuFileExitActionPerformed(evt); } private void menuFileExitActionPerformed(java.awt.event.ActionEvent evt) { JFileChooser fileChooser = new JFileChooser(); JFrame test = new JFrame(); if (fileChooser.showOpenDialog(test) == JFileChooser.APPROVE_OPTION) { File file = fileChooser.getSelectedFile(); System.out.println("File Path is: " + file.toString()); } } }); splitPane.setRightComponent(splitPane_1); splitPane.setDividerLocation(200); splitPane_1.setDividerLocation(500); splitPane.setLeftComponent(scrollPane_1); splitPane_1.setLeftComponent(tabbedPane); splitPane_1.setRightComponent(scrollPane); } /* * adds a specific object type to selected Category also handles input * windows and illegal inputs */ public void addObjectAction(String objType, DefaultMutableTreeNode selectedNode) { if (selectedNode == null) { JOptionPane.showMessageDialog(new JFrame(), "Please select a Category first before adding " + objType + "."); } // if selected node is a directory for Categories else { if (selectedNode.getLevel() == 1) { String objname = JOptionPane.showInputDialog("Please enter a Name for the " + objType); Category cat = controller.searchCategory(selectedNode.getUserObject().toString()); if (objname.length() != 0) { switch (objType) { case "Switch": controller.addSwitch(cat, objname, objType); break; case "Transformer": controller.addTransformer(cat, objname, objType); break; } } } else { JOptionPane.showMessageDialog(new JFrame(), "Objects can not be added to Objects. Please select a Category."); } } } /** * reloads the Categories from Model */ public void updateCategories(final ArrayList categories) { tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode("Categories") { { DefaultMutableTreeNode node_1; for (Category c : categories) { node_1 = new DefaultMutableTreeNode(c.getName()); // kann eventuell umgeƤndert werden for (CpsObject obj : c.getObjects()) { node_1.add(new DefaultMutableTreeNode(obj.getObjName())); } add(node_1); } } })); } /** * */ public void onChange(ArrayList categories) { DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); updateCategories(categories); model.reload(); } /** * * @return */ public JFrame getFrmCyberPhysical() { return frmCyberPhysical; } }