package ui.view; import java.io.File; import java.util.ArrayList; import java.util.Enumeration; import javax.swing.JFrame; import javax.swing.JList; 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.MutableTreeNode; import javax.swing.tree.TreeNode; import ui.controller.Control; import ui.model.*; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.JEditorPane; import javax.swing.JFileChooser; import javax.swing.table.DefaultTableModel; import java.awt.Color; import java.awt.Cursor; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; import java.awt.dnd.DragSource; import java.awt.BorderLayout; import javax.swing.JPanel; import javax.swing.JToolBar; import javax.swing.JButton; import javax.swing.TransferHandler; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.JComboBox; import javax.swing.DefaultComboBoxModel; import javax.swing.Icon; import javax.swing.ImageIcon; import classes.Category; import classes.CpsObject; import classes.HolonObject; import Interfaces.CategoryListener; import java.awt.event.ActionListener; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.ActionEvent; 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; private JTable table_2 = new JTable(); 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 boolean dragging = false; String actualObjectClicked; private final MyCanvas canvas; /** * Create the application. */ public GUI(Control control) { this.controller = control; this.model = control.getModel(); this.canvas = new MyCanvas(model); control.initListener(this); initialize(); } /** * Initialize the contents of the frame. */ @SuppressWarnings("serial") private void initialize() { frmCyberPhysical = new JFrame(); frmCyberPhysical.setTitle("Cyber Physical Systems Model"); frmCyberPhysical.setBounds(100, 100, 891, 467); 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); menuBar.add(mnHelp); // Table String[] columnNames = { "Gadget", "Consumption", "Quantity" }; Object[][] data = { { "TV", "20", "1" }, { "PC", "30", "2" }, { "Fridge", "40", "1" } }; splitPane.setRightComponent(splitPane_1); splitPane.setDividerLocation(200); splitPane_1.setDividerLocation(500); canvas.setBackground(Color.WHITE); tabbedPane.addTab("Modeling", null, canvas, null); tabbedPane.addTab("Simulation", null, scrollPane_2, null); dtrpnHereWillBe.setText("Here will be the Simulation"); scrollPane_2.setViewportView(dtrpnHereWillBe); splitPane_1.setLeftComponent(tabbedPane); JScrollPane scrollPane = new JScrollPane(); splitPane_1.setRightComponent(splitPane_2); splitPane_2.setLeftComponent(scrollPane); table = new JTable(data, columnNames); scrollPane.setViewportView(table); table.setFillsViewportHeight(true); table.setModel(new DefaultTableModel(data, columnNames)); table.setCellSelectionEnabled(true); table.setColumnSelectionAllowed(true); JScrollPane scrollPane_3 = new JScrollPane(); splitPane_2.setRightComponent(scrollPane_3); scrollPane_3.setViewportView(table_2); table_2.setFillsViewportHeight(true); table_2.setModel( new DefaultTableModel( new Object[][] { { "Solar", "23", "10" }, { "Generator", "24", "1" }, { "Something Else", "25", "3" }, }, new String[] { "Gadget", "Production", "Quantity" })); table_2.getColumnModel().getColumn(0).setPreferredWidth(103); table_2.getColumnModel().getColumn(1).setPreferredWidth(107); table_2.getColumnModel().getColumn(2).setPreferredWidth(125); frmCyberPhysical.getContentPane().setLayout(new BorderLayout(0, 0)); splitPane_2.setDividerLocation(200); splitPane.setLeftComponent(scrollPane_1); final Image img = new ImageIcon(this.getClass().getResource("/Images/Dummy_House.png")).getImage() .getScaledInstance(30, 30, java.awt.Image.SCALE_SMOOTH); Icon icon = new ImageIcon(img); DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree.getCellRenderer(); renderer.setLeafIcon(icon); // renderer.setClosedIcon(icon); // renderer.setOpenIcon(icon); tree.setRowHeight(icon.getIconHeight()); tree.setCellRenderer(renderer); tree.addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { try { if (dragging) { HolonObject h = new HolonObject(actualObjectClicked); h.setPos((int) canvas.getMousePosition().getX(), (int) canvas.getMousePosition().getY()); controller.addObject(h); 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(); // System.out.println(name); if (actualObjectClicked.compareTo("Power Plant") == 0 || actualObjectClicked.compareTo("House") == 0 || actualObjectClicked.compareTo("Switch") == 0 || actualObjectClicked.compareTo("Transformer") == 0) { dragging = true; Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(img, new Point(0, 0), "Image"); frmCyberPhysical.setCursor(cursor); } } catch (Exception e2) { } } }); /* * tree.addTreeSelectionListener(new TreeSelectionListener() { * * @Override public void valueChanged(TreeSelectionEvent e) { try { * String name = tree.getLastSelectedPathComponent().toString(); * System.out.println(name); if (name.compareTo("Power Plant") == 0 || * name.compareTo("House") == 0 || name.compareTo("Switch") == 0 || * name.compareTo("Transformer") == 0) { dragging = true; Cursor cursor * = Toolkit.getDefaultToolkit().createCustomCursor(img, new Point(0, * 0), "red Cursor"); 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.addNewCategory(catName); } break; default: addObjectAction(selectedOption, selectedNode); break; } } }); 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.deleteObjectInCat(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()); } } }); } /* * 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.equals("show")){ addObjectPopUP = new AddObjectPopUp(); addObjectPopUP.setVisible(true); } if(objname.length() != 0){ switch (objType) { case "Object": controller.addNewObject(cat, objname); break; case "Switch": controller.addNewSwitch(cat, objname); case "Transformer": controller.addNewTransformer(cat, objname); } } } 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; } }