package addOns; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.GridLayout; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; import java.util.stream.Collectors; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import api.AddOn; import classes.AbstractCanvasObject; import classes.GroupNode; import classes.Flexibility; import classes.HolonElement; import classes.HolonElement.Priority; import classes.HolonObject; import classes.HolonSwitch; import ui.controller.Control; /** * A short algorithm to distribute the Priorities for the whole Canvas. * @author tom * */ public class RandomOfferdFlexibility implements AddOn { private Control control; private JPanel content = new JPanel(); private JSlider activeSlider = new JSlider(JSlider.HORIZONTAL,0, 100, 50); private JCheckBox lowCheckbox = new JCheckBox("Low", true); private JCheckBox mediumCheckbox = new JCheckBox("Medium", true); private JCheckBox highCheckbox = new JCheckBox("High", true); private JCheckBox essentialCheckbox = new JCheckBox("Essential", true); private JSlider lowFlexTargetSlider = new JSlider(JSlider.HORIZONTAL,0, 100, 50); private JSlider mediumFlexTargetSlider = new JSlider(JSlider.HORIZONTAL,0, 100, 50); private JSlider highFlexTargetSlider = new JSlider(JSlider.HORIZONTAL,0, 100, 50); private JSlider essentialFlexTargetSlider = new JSlider(JSlider.HORIZONTAL,0, 100, 50); private JLabel lowPositiveLabel = new JLabel("0(0)"); private JLabel mediumPositiveLabel = new JLabel("0(0)"); private JLabel highPositiveLabel = new JLabel("0(0)"); private JLabel essentialPositiveLabel = new JLabel("0(0)"); private JLabel lowNegativeLabel = new JLabel("0(0)"); private JLabel mediumNegativeLabel = new JLabel("0(0)"); private JLabel highNegativeLabel = new JLabel("0(0)"); private JLabel essentialNegativeLabel = new JLabel("0(0)"); public static void main(String[] args) { JFrame newFrame = new JFrame("exampleWindow"); RandomOfferdFlexibility instance = new RandomOfferdFlexibility(); newFrame.setContentPane(instance.getPanel()); newFrame.pack(); newFrame.setVisible(true); newFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public RandomOfferdFlexibility(){ content.setLayout(new BorderLayout()); content.add(createParameterPanel(), BorderLayout.CENTER); content.add(createFlexPanel(), BorderLayout.EAST); JButton buttonRun = new JButton("Run"); buttonRun.addActionListener(actionEvent -> run()); content.add(buttonRun, BorderLayout.PAGE_END); //content.setPreferredSize(new Dimension(300,500)); } private JPanel createFlexPanel() { JPanel flexPanel = new JPanel(); flexPanel.setBorder(BorderFactory.createTitledBorder("Flexibility")); GridLayout experimentLayout = new GridLayout(0,4); flexPanel.setLayout(experimentLayout); //Label flexPanel.add(new JLabel("Priority:")); flexPanel.add(new JLabel("Target:")); flexPanel.add(new JLabel("PositiveAmount:")); flexPanel.add(new JLabel("NegativeAmount:")); flexPanel.add(lowCheckbox); flexPanel.add(initVisualizeSliderFlexibility(this.lowFlexTargetSlider, "PositivNegativ")); flexPanel.add(this.lowPositiveLabel); flexPanel.add(this.lowNegativeLabel); flexPanel.add(mediumCheckbox); flexPanel.add(initVisualizeSliderFlexibility(this.mediumFlexTargetSlider, "PositivNegativ")); flexPanel.add(this.mediumPositiveLabel); flexPanel.add(this.mediumNegativeLabel); flexPanel.add(highCheckbox); flexPanel.add(initVisualizeSliderFlexibility(this.highFlexTargetSlider, "PositivNegativ")); flexPanel.add(this.highPositiveLabel); flexPanel.add(this.highNegativeLabel); flexPanel.add(essentialCheckbox); flexPanel.add(initVisualizeSliderFlexibility(this.essentialFlexTargetSlider, "PositivNegativ")); flexPanel.add(this.essentialPositiveLabel); flexPanel.add(this.essentialNegativeLabel); return flexPanel; } private JPanel createParameterPanel() { JPanel centerPanel = new JPanel(); JPanel parameterPanel = new JPanel(); parameterPanel.setBorder(BorderFactory.createTitledBorder("Priority")); parameterPanel.setLayout(new BoxLayout(parameterPanel, BoxLayout.PAGE_AXIS)); createParamaterSlider(parameterPanel); centerPanel.add(parameterPanel); return centerPanel; } private void createParamaterSlider(JPanel parameterPanel) { } private JSlider initVisualizeSliderFlexibility(JSlider jslider, String name) { jslider.setMajorTickSpacing(50); jslider.setMinorTickSpacing(5); jslider.setPaintTicks(true); Hashtable labelTable = new Hashtable(); labelTable.put( Integer.valueOf( 0 ), new JLabel("Positiv") ); labelTable.put( Integer.valueOf( 100 ), new JLabel("Negativ") ); jslider.setLabelTable( labelTable ); jslider.setPaintLabels(true); return jslider; } private void run() { //control.getModel().getObjectsOnCanvas().stream().filter(aCps -> aCps instanceof HolonObject) List elementList = createListOfHolonObjects(control.getModel().getObjectsOnCanvas()).stream().flatMap(hObject -> hObject.getElements().stream()).collect(Collectors.toList()); for(HolonElement element : elementList) { element.setActive(Math.random() * 100.0 < activeSlider.getValue()); // Generate a random number between 0 and 100 } control.calculateStateAndVisualForCurrentTimeStep(); control.updateCanvas(); List flexList = control.getSimManager().getActualFlexManager().getAllFlexWrapper().stream().filter(flexwrapper -> flexwrapper.getFlex().offered).map(flex -> flex.getFlex()).collect(Collectors.toList()); long amountOfEssential = flexList.stream().filter(flex -> flex.getElement().getPriority() == Priority.Essential).count(); long amountOfHigh = flexList.stream().filter(flex -> flex.getElement().getPriority() == Priority.High).count(); long amountOfMedium = flexList.stream().filter(flex -> flex.getElement().getPriority() == Priority.Medium).count(); long amountOfLow = flexList.stream().filter(flex -> flex.getElement().getPriority() == Priority.Low).count(); long overall = amountOfEssential + amountOfHigh + amountOfMedium + amountOfLow; System.out.println(" amountOfEssential: " + amountOfEssential + " amountOfHigh: " + amountOfHigh + " amountOfMedium: " +amountOfMedium + " amountOfLow: " +amountOfLow + " of overall " + overall + "Flexes"); } private List createListOfHolonObjects(List objectsOnCanvas) { List list = new ArrayList(); for(AbstractCanvasObject aCps : objectsOnCanvas) { if(aCps instanceof HolonObject) list.add((HolonObject) aCps); else if(aCps instanceof GroupNode)list.addAll(createListOfHolonObjects(((GroupNode)aCps).getNodes())); } return list; } @Override public JPanel getPanel() { return content; } @Override public void setController(Control control) { this.control = control; } }