package ui.view; import javax.swing.JSplitPane; import javax.swing.JScrollPane; import javax.swing.JPanel; import java.util.ArrayList; import java.util.Hashtable; import java.util.Random; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JLabel; import javax.swing.LayoutStyle.ComponentPlacement; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.MutableTreeNode; import javax.swing.tree.TreeNode; import DataSets.GraphDataSet; import DataSets.PropertyDataSet; import classes.HolonObject; import interfaces.GraphListener; import ui.controller.Control; import javax.swing.JTextField; import javax.swing.JComboBox; import javax.swing.JButton; import javax.swing.JTree; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.border.LineBorder; import javax.swing.JPopupMenu; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JMenuItem; import javax.swing.BoxLayout; public class splitPane extends JSplitPane implements GraphListener { private JTextField graphNrTxtField; private JTextField redField; private JTextField greenField; private JTextField blueField; private JTree objectTree; private DefaultTreeModel treeModel; private DefaultMutableTreeNode objectsNode; private DefaultMutableTreeNode wholeHolon; private Hashtable objectHashtable; private JPanel colorPanel; private PropertyDataSet currentProperty = new PropertyDataSet(); private JComboBox colorComboBox; private Control controller; private JPanel graphPanel; JLabel showObjectlbl; JLabel showPropertylbl; public splitPane(Control cont) { //this.rightComponent this.controller = cont; objectHashtable = new Hashtable(); JScrollPane dataPane = new JScrollPane(); setLeftComponent(dataPane); JPanel panel = new JPanel(); dataPane.setViewportView(panel); JScrollPane treeScrollPane = new JScrollPane(); JLabel lblObject = new JLabel("Object(s):"); showObjectlbl = new JLabel("..."); JLabel lblProperty = new JLabel("Property:"); showPropertylbl = new JLabel("..."); JLabel lblGraph = new JLabel("Graph:"); JLabel lblColor = new JLabel("Color:"); colorComboBox = new JComboBox(); colorComboBox.addItem(""); colorComboBox.addItem("Red"); colorComboBox.addItem("Blue"); colorComboBox.addItem("Green"); colorComboBox.addItem("Yellow"); colorComboBox.addItem("Orange"); colorComboBox.addItem("Cyan"); colorComboBox.addItem("Magenta"); colorComboBox.addItem("Pink"); colorComboBox.addItem("Gray"); colorComboBox.addItem("Random"); colorComboBox.addItemListener(new ItemListener(){ @Override public void itemStateChanged(ItemEvent e) { String colorName = (String) colorComboBox.getSelectedItem(); Color tmpColor = Color.WHITE; switch(colorName){ case "" : tmpColor = currentProperty.getColor(); break; case "Red": tmpColor = Color.RED; colorChanged(tmpColor); break; case "Blue":tmpColor = Color.BLUE; colorChanged(tmpColor); break; case "Green":tmpColor = Color.GREEN; colorChanged(tmpColor); break; case "Yellow":tmpColor = Color.YELLOW; colorChanged(tmpColor); break; case "Orange":tmpColor = Color.ORANGE; colorChanged(tmpColor); break; case "Cyan":tmpColor = Color.CYAN; colorChanged(tmpColor); break; case "Magenta":tmpColor = Color.MAGENTA; colorChanged(tmpColor); break; case "Pink":tmpColor = Color.PINK; colorChanged(tmpColor); break; case "Gray":tmpColor = Color.GRAY; colorChanged(tmpColor); break; case "Random":Random rdm = new Random(); tmpColor = new Color(rdm.nextInt(255),rdm.nextInt(255),rdm.nextInt(255)); } redField.setText(Integer.toString(tmpColor.getRed())); greenField.setText(Integer.toString(tmpColor.getGreen())); blueField.setText(Integer.toString(tmpColor.getBlue())); } }); //====================GRAPH NR TEXTFIELD======================// graphNrTxtField = new JTextField(); graphNrTxtField.setColumns(10); graphNrTxtField.getDocument().addDocumentListener(new DocumentListener(){ /* * if textField for Red changes, changes will applied in the DataStructure "currentProperty" * if Value is legit */ @Override public void insertUpdate(DocumentEvent e) { if(currentProperty != null){ currentProperty.setGraph(graphNrTxtField.getText()); } } @Override public void removeUpdate(DocumentEvent e) { if(currentProperty != null){ currentProperty.setGraph(graphNrTxtField.getText()); } } @Override public void changedUpdate(DocumentEvent e) { } }); //====================GRAPH NR TEXTFIELD END==================// //====================RED TEXTFIELD===========================// redField = new JTextField(); redField.setColumns(10); redField.getDocument().addDocumentListener(new DocumentListener(){ /* * if textField for Red changes, changes will applied in the DataStructure "currentProperty" * if Value is legit */ @Override public void insertUpdate(DocumentEvent e) { int tmp = -1; try{ tmp = Integer.parseInt(redField.getText()); }catch(NumberFormatException e1){ } if(tmp > -1 && tmp <= 255){ if(currentProperty != null){ Color oldColor = currentProperty.getColor(); Color color = new Color(tmp, oldColor.getGreen(), oldColor.getBlue()); currentProperty.setColor(color); colorChanged(color); } } } @Override public void removeUpdate(DocumentEvent e) { int tmp = -1; try{ tmp = Integer.parseInt(redField.getText()); }catch(NumberFormatException e1){ } if(tmp > -1 && tmp <= 255){ if(currentProperty != null){ Color oldColor = currentProperty.getColor(); Color color = new Color(tmp, oldColor.getGreen(), oldColor.getBlue()); currentProperty.setColor(color); colorChanged(color); } } } @Override public void changedUpdate(DocumentEvent e) { } }); //======================RED TEXTFIELD END==========================// //======================GREEN TEXTFIELD============================// greenField = new JTextField(); greenField.setColumns(10); greenField.getDocument().addDocumentListener(new DocumentListener(){ /* * if textField for Red changes, changes will applied in the DataStructure "currentProperty" * if Value is legit */ @Override public void insertUpdate(DocumentEvent e) { int tmp = -1; try{ tmp = Integer.parseInt(greenField.getText()); }catch(NumberFormatException e1){ } if(tmp > -1 && tmp <= 255){ if(currentProperty != null){ Color oldColor = currentProperty.getColor(); Color color = new Color(oldColor.getRed(), tmp, oldColor.getBlue()); currentProperty.setColor(color); colorChanged(color); } } } @Override public void removeUpdate(DocumentEvent e) { int tmp = -1; try{ tmp = Integer.parseInt(greenField.getText()); }catch(NumberFormatException e1){ } if(tmp > -1 && tmp <= 255){ if(currentProperty != null){ Color oldColor = currentProperty.getColor(); Color color = new Color(oldColor.getRed(), tmp, oldColor.getBlue()); currentProperty.setColor(color); colorChanged(color); } } } @Override public void changedUpdate(DocumentEvent e) { } }); //======================GREEN TEXTFIELD END========================// //======================BLUE TEXTFIELD=============================// blueField = new JTextField(); blueField.setColumns(10); blueField.getDocument().addDocumentListener(new DocumentListener(){ /* * if textField for Red changes, changes will applied in the DataStructure "currentProperty" * if Value is legit */ @Override public void insertUpdate(DocumentEvent e) { int tmp = -1; try{ tmp = Integer.parseInt(blueField.getText()); }catch(NumberFormatException e1){ } if(tmp > -1 && tmp <= 255){ if(currentProperty != null){ Color oldColor = currentProperty.getColor(); Color color = new Color(oldColor.getRed(), oldColor.getGreen(), tmp); currentProperty.setColor(color); colorChanged(color); } } } @Override public void removeUpdate(DocumentEvent e) { int tmp = -1; try{ tmp = Integer.parseInt(blueField.getText()); }catch(NumberFormatException e1){ } if(tmp > -1 && tmp <= 255){ if(currentProperty != null){ Color oldColor = currentProperty.getColor(); Color color = new Color(oldColor.getRed(), oldColor.getGreen(), tmp); currentProperty.setColor(color); colorChanged(color); } } } @Override public void changedUpdate(DocumentEvent e) { } }); //======================BLUE TEXTFIELD END=========================// JLabel lblR = new JLabel("R:"); JLabel lblG = new JLabel("G:"); JLabel lblB = new JLabel("B:"); JButton btnAdd = new JButton("Add"); btnAdd.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { graphPanel.add(new JButton("new")); graphPanel.updateUI(); } }); colorPanel = new JPanel(); colorPanel.setBorder(new LineBorder(new Color(0, 0, 0))); colorPanel.setBackground(Color.WHITE); GroupLayout gl_panel = new GroupLayout(panel); gl_panel.setHorizontalGroup( gl_panel.createParallelGroup(Alignment.LEADING) .addGroup(gl_panel.createSequentialGroup() .addContainerGap() .addGroup(gl_panel.createParallelGroup(Alignment.LEADING) .addGroup(gl_panel.createSequentialGroup() .addComponent(treeScrollPane, GroupLayout.DEFAULT_SIZE, 187, Short.MAX_VALUE) .addContainerGap()) .addGroup(gl_panel.createSequentialGroup() .addGroup(gl_panel.createParallelGroup(Alignment.LEADING) .addComponent(lblGraph) .addComponent(lblObject) .addComponent(lblProperty) .addComponent(lblColor) .addGroup(gl_panel.createSequentialGroup() .addComponent(lblR) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panel.createParallelGroup(Alignment.LEADING, false) .addComponent(colorPanel, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(redField, GroupLayout.DEFAULT_SIZE, 37, Short.MAX_VALUE)))) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panel.createParallelGroup(Alignment.LEADING, false) .addComponent(showObjectlbl, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(showPropertylbl, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(colorComboBox, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(graphNrTxtField) .addGroup(gl_panel.createSequentialGroup() .addGroup(gl_panel.createParallelGroup(Alignment.TRAILING) .addComponent(btnAdd) .addGroup(gl_panel.createSequentialGroup() .addComponent(lblG) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(greenField, GroupLayout.PREFERRED_SIZE, 37, GroupLayout.PREFERRED_SIZE))) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(lblB) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(blueField, GroupLayout.PREFERRED_SIZE, 37, GroupLayout.PREFERRED_SIZE))) .addGap(32)))) ); gl_panel.setVerticalGroup( gl_panel.createParallelGroup(Alignment.LEADING) .addGroup(gl_panel.createSequentialGroup() .addContainerGap() .addComponent(treeScrollPane, GroupLayout.PREFERRED_SIZE, 174, GroupLayout.PREFERRED_SIZE) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panel.createParallelGroup(Alignment.BASELINE) .addComponent(lblObject, GroupLayout.PREFERRED_SIZE, 14, GroupLayout.PREFERRED_SIZE) .addComponent(showObjectlbl)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panel.createParallelGroup(Alignment.BASELINE) .addComponent(lblProperty) .addComponent(showPropertylbl)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panel.createParallelGroup(Alignment.BASELINE) .addComponent(lblGraph) .addComponent(graphNrTxtField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_panel.createParallelGroup(Alignment.BASELINE) .addComponent(lblColor) .addComponent(colorComboBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addGap(18) .addGroup(gl_panel.createParallelGroup(Alignment.BASELINE) .addComponent(lblR) .addComponent(redField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(lblG) .addComponent(greenField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(lblB) .addComponent(blueField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(colorPanel, GroupLayout.PREFERRED_SIZE, 33, GroupLayout.PREFERRED_SIZE) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(btnAdd) .addContainerGap(35, Short.MAX_VALUE)) ); objectTree = new JTree(); treeModel = (DefaultTreeModel)objectTree.getModel(); DefaultMutableTreeNode root = new DefaultMutableTreeNode("Statistics"); wholeHolon = new DefaultMutableTreeNode("whole Holon"); wholeHolon.add(new DefaultMutableTreeNode("total Production")); wholeHolon.add(new DefaultMutableTreeNode("total Consumption")); wholeHolon.add(new DefaultMutableTreeNode("Percentage of Supplied Objects")); wholeHolon.add(new DefaultMutableTreeNode("Percentage of not Supplied Objects")); wholeHolon.add(new DefaultMutableTreeNode("Percentage of partially Supplied Objects")); objectsNode = new DefaultMutableTreeNode("Objects"); DefaultMutableTreeNode defaultNode = new DefaultMutableTreeNode("empty"); objectsNode.add(defaultNode); treeModel.setRoot(root); root.add(wholeHolon); root.add(objectsNode); objectTree.setModel(treeModel); treeScrollPane.setViewportView(objectTree); JPopupMenu popupMenu = new JPopupMenu(); addPopup(objectTree, popupMenu); JMenuItem mntmUntrack = new JMenuItem("Untrack"); mntmUntrack.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)objectTree.getLastSelectedPathComponent(); if(selectedNode.getLevel() == 2 && !selectedNode.getParent().toString().equals("whole Holon")){ String object = selectedNode.toString(); controller.removeTrackingObj((HolonObject)objectHashtable.get(object).getObject()); } } }); popupMenu.add(mntmUntrack); objectTree.addTreeSelectionListener(new TreeSelectionListener(){ @Override public void valueChanged(TreeSelectionEvent e) { resetFields(); showObjectlbl.setText("..."); showPropertylbl.setText("..."); DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode)objectTree.getLastSelectedPathComponent(); if(selectedNode == null){ return; }else{ if(selectedNode.getLevel() == 0){ disableFields(); } if(selectedNode.getLevel() == 1){ disableFields(); currentProperty = null; showObjectlbl.setText(selectedNode.toString()); } if(selectedNode.getLevel() == 2){ if(((DefaultMutableTreeNode)selectedNode.getParent()).toString().equals("whole Holon")){ enableFields(); showPropertylbl.setText(selectedNode.toString()); showObjectlbl.setText(selectedNode.getParent().toString()); }else{ disableFields(); currentProperty = null; showObjectlbl.setText(selectedNode.toString()); } } if(selectedNode.getLevel() == 3){ enableFields(); String object = ((DefaultMutableTreeNode)selectedNode.getParent()).toString(); String property = selectedNode.toString(); currentProperty = objectHashtable.get(object).getPropertytTable().get(property); Color color = currentProperty.getColor(); redField.setText(Integer.toString(color.getRed())); greenField.setText(Integer.toString(color.getGreen())); blueField.setText(Integer.toString(color.getBlue())); showObjectlbl.setText(object); showPropertylbl.setText(property); graphNrTxtField.setText(currentProperty.getAssignedGraph()); colorPanel.setBackground(color); } } } }); panel.setLayout(gl_panel); JScrollPane graphScrollPane = new JScrollPane(); setRightComponent(graphScrollPane); graphPanel = new JPanel(); graphScrollPane.setViewportView(graphPanel); graphPanel.setLayout(new BoxLayout(graphPanel, BoxLayout.Y_AXIS)); repaintGraph(); } @Override public void repaintGraph() { treeModel.reload(); } @Override public void addTrackedObject(ArrayList hlList) { objectsNode.removeAllChildren(); objectHashtable.clear(); if(hlList.size() > 0 && hlList != null){ for(HolonObject hO : hlList){ Hashtable tmpHash = new Hashtable(); String name = hO.getName() + " " + hO.getID(); DefaultMutableTreeNode tmp = new DefaultMutableTreeNode(name); tmp.add(new DefaultMutableTreeNode("total Production")); tmp.add(new DefaultMutableTreeNode("total Consumption")); tmp.add(new DefaultMutableTreeNode("number of activated Elements")); tmpHash.put("total Production", new PropertyDataSet()); tmpHash.put("total Consumption", new PropertyDataSet()); tmpHash.put("number of activated Elements", new PropertyDataSet()); GraphDataSet gS = new GraphDataSet(hO, tmpHash); objectHashtable.put(name, gS); objectsNode.add(tmp); } }else{ objectsNode.add(new DefaultMutableTreeNode("empty")); } } public void colorChanged(Color color){ colorPanel.setBackground(color); } public void resetFields(){ colorPanel.setBackground(Color.WHITE); redField.setText(""); greenField.setText(""); blueField.setText(""); //graphNrTxtField.setText(""); colorComboBox.setSelectedIndex(0); } public void disableFields(){ redField.setEnabled(false); greenField.setEnabled(false); blueField.setEnabled(false); graphNrTxtField.setEnabled(false); colorComboBox.setEnabled(false); colorPanel.setBackground(Color.LIGHT_GRAY); } public void enableFields(){ redField.setEnabled(true); greenField.setEnabled(true); blueField.setEnabled(true); graphNrTxtField.setEnabled(true); colorComboBox.setEnabled(true); colorPanel.setBackground(Color.WHITE); } private static void addPopup(Component component, final JPopupMenu popup) { component.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (e.isPopupTrigger()) { showMenu(e); } } public void mouseReleased(MouseEvent e) { if (e.isPopupTrigger()) { showMenu(e); } } private void showMenu(MouseEvent e) { popup.show(e.getComponent(), e.getX(), e.getY()); } }); } }