|
@@ -0,0 +1,386 @@
|
|
|
+package ui.view;
|
|
|
+
|
|
|
+import java.awt.BorderLayout;
|
|
|
+import java.awt.Color;
|
|
|
+import java.awt.Component;
|
|
|
+import java.util.ArrayList;
|
|
|
+import javax.swing.ImageIcon;
|
|
|
+import javax.swing.JFrame;
|
|
|
+
|
|
|
+import javax.swing.JPanel;
|
|
|
+import javax.swing.JScrollPane;
|
|
|
+import javax.swing.JTabbedPane;
|
|
|
+import javax.swing.JTree;
|
|
|
+import javax.swing.event.TreeModelEvent;
|
|
|
+import javax.swing.event.TreeModelListener;
|
|
|
+import javax.swing.tree.DefaultMutableTreeNode;
|
|
|
+import javax.swing.tree.DefaultTreeCellRenderer;
|
|
|
+import javax.swing.tree.DefaultTreeModel;
|
|
|
+
|
|
|
+import classes.AbstractCpsObject;
|
|
|
+import classes.CpsEdge;
|
|
|
+import classes.HolonObject;
|
|
|
+import ui.controller.CalculataModel;
|
|
|
+import ui.controller.Control;
|
|
|
+import ui.controller.UpdateController;
|
|
|
+import ui.model.Consumer;
|
|
|
+import ui.model.Consumer.SupplierListEntry;
|
|
|
+import ui.model.DecoratedHolonObject;
|
|
|
+import ui.model.DecoratedHolonObject.HolonObjectState;
|
|
|
+import ui.model.DecoratedNetwork;
|
|
|
+import ui.model.MinimumModel;
|
|
|
+import ui.model.MinimumNetwork;
|
|
|
+import ui.model.Model;
|
|
|
+import ui.model.Supplier;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+public class Outliner extends JFrame {
|
|
|
+ private static final long serialVersionUID = 1L;
|
|
|
+ private JTree tree;
|
|
|
+ DefaultMutableTreeNode objects = new DefaultMutableTreeNode("HolonObjects");
|
|
|
+ DefaultMutableTreeNode cables = new DefaultMutableTreeNode("Cable");
|
|
|
+ DefaultMutableTreeNode switches = new DefaultMutableTreeNode("Switches");
|
|
|
+ DefaultMutableTreeNode nodes = new DefaultMutableTreeNode("Nodes");
|
|
|
+
|
|
|
+ ArrayList<MinimumNetwork> list;
|
|
|
+
|
|
|
+ Outliner(JFrame parentFrame, Model model, Control controller, GUI gui){
|
|
|
+ setBounds(0, 0, 400, parentFrame.getHeight());
|
|
|
+ this.setIconImage(Util.loadImage("/Images/Holeg.png", 30, 30));
|
|
|
+ this.setTitle("Outliner");
|
|
|
+ setLocationRelativeTo(parentFrame);
|
|
|
+ this.setVisible(true);
|
|
|
+ JTabbedPane tabbedPane = new JTabbedPane();
|
|
|
+ JPanel listPanel = createOutlinerListPanel(model, controller, gui);
|
|
|
+ tabbedPane.addTab("List", listPanel);
|
|
|
+ MinimumModel mm = new MinimumModel(model.getObjectsOnCanvas(), model.getEdgesOnCanvas());
|
|
|
+ list = CalculataModel.calculateNetworks(mm, model.getCurIteration());
|
|
|
+ JPanel networkPanel = createNetworkPanel();
|
|
|
+ tabbedPane.addTab("Networks", networkPanel);
|
|
|
+ ArrayList<DecoratedNetwork> computedList = new ArrayList<DecoratedNetwork>();
|
|
|
+ for (MinimumNetwork net : list) {
|
|
|
+ computedList.add(new DecoratedNetwork(net, model.getCurIteration()));
|
|
|
+ }
|
|
|
+ JPanel decoratedNetworkPanel = generateDecoratedNetworkPanel(computedList);
|
|
|
+ tabbedPane.addTab("Computed Networks", decoratedNetworkPanel);
|
|
|
+ this.getContentPane().add(tabbedPane);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private JPanel generateDecoratedNetworkPanel(ArrayList<DecoratedNetwork> computedList) {
|
|
|
+ JPanel decoratedNetworkPanel = new JPanel(new BorderLayout());
|
|
|
+ DefaultMutableTreeNode top = new DefaultMutableTreeNode();
|
|
|
+ for (DecoratedNetwork dNet : computedList) {
|
|
|
+ DefaultMutableTreeNode networkNode = new DefaultMutableTreeNode("Network");
|
|
|
+ DefaultMutableTreeNode consumerListNode = new DefaultMutableTreeNode("ConsumerList");
|
|
|
+ DefaultMutableTreeNode supplierListNode = new DefaultMutableTreeNode("SupplierList");
|
|
|
+ if (!dNet.getConsumerList().isEmpty() || !dNet.getConsumerSelfSuppliedList().isEmpty()) {
|
|
|
+ for (Consumer con : dNet.getConsumerList()) {
|
|
|
+ DefaultMutableTreeNode consumerNode = new ColoredTreeNode(con.toString(),con.getState().toString(), getStateColor(con.getState()) );
|
|
|
+ for(Consumer.SupplierListEntry sup: con.getSupplierList())
|
|
|
+ {
|
|
|
+ consumerNode.add(new DefaultMutableTreeNode(sup.supplier.getModel().getName() + " Energy:" + sup.energyFromSupplier));
|
|
|
+ }
|
|
|
+ consumerListNode.add(consumerNode);
|
|
|
+ }
|
|
|
+ for (Consumer con : dNet.getConsumerSelfSuppliedList()) {
|
|
|
+ DefaultMutableTreeNode consumerNode = new DefaultMutableTreeNode(con.toString() + con.getState());
|
|
|
+ for(Consumer.SupplierListEntry sup: con.getSupplierList())
|
|
|
+ {
|
|
|
+ consumerNode.add(new DefaultMutableTreeNode(sup.supplier.getModel().getName() + " Energy:" + sup.energyFromSupplier));
|
|
|
+ }
|
|
|
+ consumerListNode.add(consumerNode);
|
|
|
+ }
|
|
|
+ networkNode.add(consumerListNode);
|
|
|
+ }
|
|
|
+ if (!dNet.getSupplierList().isEmpty()) {
|
|
|
+ networkNode.add(supplierListNode);
|
|
|
+ for (Supplier sup : dNet.getSupplierList()) {
|
|
|
+ supplierListNode.add(new DefaultMutableTreeNode(new AbstractCpsObjectInfo(sup.getModel())));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ top.add(networkNode);
|
|
|
+ }
|
|
|
+ JTree networkTree = new JTree(top);
|
|
|
+ signIconsForTree(networkTree);
|
|
|
+ networkTree.setRootVisible(false);
|
|
|
+ for (int i = 0; i < networkTree.getRowCount(); i++) {
|
|
|
+ networkTree.expandRow(i);
|
|
|
+ }
|
|
|
+ JScrollPane listScroller = new JScrollPane(networkTree);
|
|
|
+ decoratedNetworkPanel.add(listScroller);
|
|
|
+ return decoratedNetworkPanel;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private JPanel createNetworkPanel() {
|
|
|
+ JPanel networkPanel = new JPanel(new BorderLayout());
|
|
|
+ DefaultMutableTreeNode top = new DefaultMutableTreeNode();
|
|
|
+ for (MinimumNetwork net : list) {
|
|
|
+ DefaultMutableTreeNode networkNode = new DefaultMutableTreeNode("Network");
|
|
|
+ for (HolonObject hObject : net.getHolonObjectList()) {
|
|
|
+ networkNode.add(new DefaultMutableTreeNode(new AbstractCpsObjectInfo(hObject)));
|
|
|
+ }
|
|
|
+ top.add(networkNode);
|
|
|
+ }
|
|
|
+
|
|
|
+ JTree networkTree = new JTree(top);
|
|
|
+ signIconsForTree(networkTree);
|
|
|
+ networkTree.setRootVisible(false);
|
|
|
+ for (int i = 0; i < networkTree.getRowCount(); i++) {
|
|
|
+ networkTree.expandRow(i);
|
|
|
+ }
|
|
|
+ JScrollPane listScroller = new JScrollPane(networkTree);
|
|
|
+ networkPanel.add(listScroller);
|
|
|
+ return networkPanel;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private JPanel createOutlinerListPanel(Model model, Control controller, GUI gui) {
|
|
|
+ JPanel contentPanel = new JPanel(new BorderLayout());
|
|
|
+ DefaultMutableTreeNode top =new DefaultMutableTreeNode();
|
|
|
+ DefaultTreeModel treeModel = new DefaultTreeModel(top);
|
|
|
+ treeModel.addTreeModelListener(new MyTreeModelListener());
|
|
|
+
|
|
|
+ createCategorys(top);
|
|
|
+ popullateCategorys(model);
|
|
|
+ tree = new JTree(treeModel);
|
|
|
+ tree.setRootVisible(false);
|
|
|
+ UpdateController updCon = new UpdateController(model, controller);
|
|
|
+ tree.addTreeSelectionListener(tsl -> {
|
|
|
+ if(tree.getSelectionPath() == null) return;
|
|
|
+ DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tsl.getPath().getLastPathComponent();
|
|
|
+ System.out.println(tsl.getPath().getPathCount());
|
|
|
+ if(tsl.getPath().getPathCount() == 3) // 2 is Category 3 is ObjectIn Category
|
|
|
+ {
|
|
|
+ if(selectedNode.getParent().equals(objects))
|
|
|
+ {
|
|
|
+ AbstractCpsObjectInfo info = (AbstractCpsObjectInfo)selectedNode.getUserObject();
|
|
|
+ //treeModel.nodeChanged(selectedNode);
|
|
|
+
|
|
|
+ model.getSelectedCpsObjects().clear();
|
|
|
+ controller.addSelectedObject(info.getAbstractCpsObject());
|
|
|
+ if(info.getAbstractCpsObject() instanceof HolonObject)
|
|
|
+ {
|
|
|
+ HolonObject hO = (HolonObject) info.getAbstractCpsObject();
|
|
|
+ System.out.println("HolonObject" + hO);
|
|
|
+ System.out.println("getEnergyAtTimestep:" + hO.getEnergyAtTimeStep(0));
|
|
|
+ System.out.println("getEnergyNeededFromConsumingElements:" + hO.getEnergyNeededFromConsumingElements(0));
|
|
|
+ System.out.println("getEnergySelfProducing:" + hO.getEnergySelfProducingFromProducingElements(0));
|
|
|
+ System.out.println("getMinimumConsumingElement:" + hO.getMinimumConsumingElement(0));
|
|
|
+ System.out.println("countConsumingElements:" + hO.countConsumingElements(0));
|
|
|
+ System.out.println("countProducingElements:" + hO.countProducingElements(0));
|
|
|
+ }
|
|
|
+ DefaulTable propertyTable = model.getPropertyTable();
|
|
|
+ if (propertyTable.getRowCount() > 0) {
|
|
|
+ for (int i = propertyTable.getRowCount() - 1; i > -1; i--) {
|
|
|
+ propertyTable.removeRow(i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ updCon.paintProperties(info.getAbstractCpsObject());
|
|
|
+ updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
|
|
|
+ updCon.refreshTableProperties(model.getPropertyTable());
|
|
|
+ gui.getFrmCyberPhysical().repaint();
|
|
|
+ }
|
|
|
+ else if(selectedNode.getParent().equals(cables))
|
|
|
+ {
|
|
|
+ EdgeInfo info = (EdgeInfo)selectedNode.getUserObject();
|
|
|
+ model.setSelectedEdge(info.getEdge());
|
|
|
+ DefaulTable propertyTable = model.getPropertyTable();
|
|
|
+ if (propertyTable.getRowCount() > 0) {
|
|
|
+ for (int i = propertyTable.getRowCount() - 1; i > -1; i--) {
|
|
|
+ propertyTable.removeRow(i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ controller.setSelecteEdge(info.getEdge());
|
|
|
+ //controller.setSelectedObjectID(0);
|
|
|
+ updCon.refreshTableHolonElement(model.getMultiTable(), model.getSingleTable());
|
|
|
+ updCon.refreshTableProperties(model.getPropertyTable());
|
|
|
+ gui.getFrmCyberPhysical().repaint();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ signIconsForTree(tree);
|
|
|
+ for (int i = 0; i < tree.getRowCount(); i++) {
|
|
|
+ tree.expandRow(i);
|
|
|
+ }
|
|
|
+ JScrollPane listScroller = new JScrollPane(tree);
|
|
|
+ contentPanel.add(listScroller);
|
|
|
+ return contentPanel;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private void signIconsForTree(JTree t) {
|
|
|
+ ImageIcon ClosedIcon = new ImageIcon(Util.loadImage("/Button_Images/Close.png",9,9));
|
|
|
+ ImageIcon OpenIcon = new ImageIcon(Util.loadImage("/Button_Images/Open.png",9,9));
|
|
|
+ ImageIcon LeafIcon = new ImageIcon(Util.loadImage("/Button_Images/Leaf.png",9,9));
|
|
|
+ if (ClosedIcon != null && OpenIcon != null && LeafIcon!= null) {
|
|
|
+ DefaultTreeCellRenderer renderer =
|
|
|
+ new DefaultTreeCellRenderer();
|
|
|
+ renderer.setClosedIcon(ClosedIcon);
|
|
|
+ renderer.setOpenIcon(OpenIcon);
|
|
|
+ renderer.setLeafIcon(LeafIcon);
|
|
|
+ t.setCellRenderer(renderer);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private void createCategorys(DefaultMutableTreeNode top) {
|
|
|
+ top.add(objects);
|
|
|
+ top.add(cables);
|
|
|
+ top.add(switches);
|
|
|
+ top.add(nodes);
|
|
|
+ }
|
|
|
+ private void popullateCategorys(Model m)
|
|
|
+ {
|
|
|
+ m.defineLists();
|
|
|
+ for(AbstractCpsObject aCps :m.getHolonObjectsOnCanvas())
|
|
|
+ {
|
|
|
+ objects.add(new DefaultMutableTreeNode(new AbstractCpsObjectInfo(aCps)));
|
|
|
+ }
|
|
|
+ for(AbstractCpsObject aCps :m.getNodesOnCanvas())
|
|
|
+ {
|
|
|
+ nodes.add(new DefaultMutableTreeNode(new AbstractCpsObjectInfo(aCps)));
|
|
|
+ }
|
|
|
+ for(AbstractCpsObject aCps :m.getSwitchsOnCanvas())
|
|
|
+ {
|
|
|
+ switches.add(new DefaultMutableTreeNode(new AbstractCpsObjectInfo(aCps)));
|
|
|
+ }
|
|
|
+ for(CpsEdge edge :m.getEdgesOnCanvas())
|
|
|
+ {
|
|
|
+ cables.add(new DefaultMutableTreeNode(new EdgeInfo(edge)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ class MyTreeModelListener implements TreeModelListener {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void treeNodesChanged(TreeModelEvent tmE) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ System.out.println("treeNodesChanged");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void treeNodesInserted(TreeModelEvent tmE) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ System.out.println("treeNodesInserted");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void treeNodesRemoved(TreeModelEvent tmE) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ System.out.println("treeNodesRemoved");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void treeStructureChanged(TreeModelEvent tmE) {
|
|
|
+ // TODO Auto-generated method stub
|
|
|
+ System.out.println("treeStructureChanged");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ *
|
|
|
+ * case NO_ENERGY:
|
|
|
+ stateColor = Color.WHITE;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case NOT_SUPPLIED:
|
|
|
+ stateColor = new Color(230, 120, 100);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case SUPPLIED:
|
|
|
+ stateColor = Color.GREEN;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case PRODUCER:
|
|
|
+ stateColor = Color.lightGray;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case PARTIALLY_SUPPLIED:
|
|
|
+ stateColor = Color.YELLOW;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case OVER_SUPPLIED:
|
|
|
+ // find different purple-tones at
|
|
|
+ // http://www.rapidtables.com/web/color/purple-color.htm
|
|
|
+ stateColor = new Color(138, 43, 226);
|
|
|
+ */
|
|
|
+ private Color getStateColor(HolonObjectState state) {
|
|
|
+ switch(state) {
|
|
|
+ case NOT_SUPPLIED:
|
|
|
+ return new Color(230, 120, 100);
|
|
|
+ case NO_ENERGY:
|
|
|
+ return Color.WHITE;
|
|
|
+ case OVER_SUPPLIED:
|
|
|
+ return new Color(138, 43, 226);
|
|
|
+ case PARTIALLY_SUPPLIED:
|
|
|
+ return Color.YELLOW;
|
|
|
+ case PRODUCER:
|
|
|
+ return Color.lightGray;
|
|
|
+ case SUPPLIED:
|
|
|
+ return Color.GREEN;
|
|
|
+ default:
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @SuppressWarnings("serial")
|
|
|
+ class ColoredTreeNode extends DefaultMutableTreeNode{
|
|
|
+ private Color color;
|
|
|
+ public ColoredTreeNode(String string, String state, Color color) {
|
|
|
+ //"<html>Some text <font color='red'>" + "bla" + "some text in red</font></html>"
|
|
|
+ //Integer.toHexString(color.getRGB()).substring(2)
|
|
|
+ //String c = string + "<html><font bgcolor='#132122'>" + state +"</font></html>";
|
|
|
+ super(( "<html>" + string + "<font bgcolor='#" + Integer.toHexString(color.getRGB()).substring(2) + "'>" + state +"</font></html>"));
|
|
|
+ //this.color = color;
|
|
|
+ }
|
|
|
+ public Color getColor(){
|
|
|
+ return color;
|
|
|
+ }
|
|
|
+ public void setColor(Color color) {
|
|
|
+ this.color = color;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ class AbstractCpsObjectInfo {
|
|
|
+ private AbstractCpsObject aCps;
|
|
|
+ AbstractCpsObjectInfo(AbstractCpsObject aCps){
|
|
|
+ this.aCps = aCps;
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public String toString(){
|
|
|
+ return aCps.getName() + " Id:"+ aCps.getId();
|
|
|
+ }
|
|
|
+
|
|
|
+ public AbstractCpsObject getAbstractCpsObject()
|
|
|
+ {
|
|
|
+ return aCps;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ class EdgeInfo {
|
|
|
+ private CpsEdge aEdge;
|
|
|
+ EdgeInfo(CpsEdge aEdge){
|
|
|
+ this.aEdge = aEdge;
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public String toString(){
|
|
|
+ return aEdge.toString();
|
|
|
+ }
|
|
|
+ public CpsEdge getEdge()
|
|
|
+ {
|
|
|
+ return aEdge;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|