package ui.view; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Image; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.Timer; import javax.swing.border.LineBorder; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.basic.BasicSliderUI; import javax.swing.plaf.synth.SynthSliderUI; import ui.controller.Control; import ui.model.Model; /** * This Class represents a Panel where the User can start and stop the * Simulation. He Can also reset the Simulation and click through every * Iteration. * * @author Gruppe14 */ public class TimePanel extends JPanel { private Model model; private Control controller; JLabel simSpeedLabel = new JLabel(Languages.getLanguage()[84]); private JTextField simSpeedText = new JTextField("1000"); JSlider timeSlider = new JSlider(){ { // Make the slider jump to mouse position on left click MouseListener[] listeners = getMouseListeners(); for (MouseListener l : listeners) removeMouseListener(l); // remove UI-installed TrackListener final BasicSliderUI ui = (BasicSliderUI) getUI(); BasicSliderUI.TrackListener tl = ui.new TrackListener() { // this is where we jump to absolute value of click @Override public void mouseClicked(MouseEvent e) { Point p = e.getPoint(); int value = ui.valueForXPosition(p.x); setValue(value); } // disable check that will invoke scrollDueToClickInTrack @Override public boolean shouldScroll(int dir) { return false; } }; addMouseListener(tl); } };; private final JPanel timeBtnPanel = new JPanel(); final JButton playBtn = new JButton(); final JButton timeResetBtn = new JButton(); final JButton timeForwardBtn = new JButton(); final JButton timeBackwardBtn = new JButton(); private Timer timer; private boolean running = false; private static final long serialVersionUID = 1L; /** * Constructor. * * @param mod * the Model * @param cont * the Controller */ public TimePanel(Model mod, Control cont) { super(); this.model = mod; this.controller = cont; // One Iteration timer = new Timer(0, new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { timeSlider.setValue(timeSlider.getValue() + 1); controller.setCurIteration(timeSlider.getValue()); timer.setDelay(model.getTimerSpeed()); if (timeSlider.getValue() == model.getIterations() - 1) { running = false; playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png")) .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH))); timer.stop(); } } }); // Time Slider. Panels and Buttons this.setLayout(new BorderLayout(0, 0)); this.setBorder(null); // Slider timeSlider.setPaintTicks(true); timeSlider.setPaintLabels(true); timeSlider.setMinorTickSpacing(1); timeSlider.setMajorTickSpacing(5); timeSlider.setToolTipText(Languages.getLanguage()[93]); timeSlider.setMaximum(model.getIterations() - 1); timeSlider.setValue(0); timeSlider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { controller.setCurIteration(timeSlider.getValue()); } }); timeSlider.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { controller.resetSimulation(); } }); timeSlider.addMouseMotionListener(new MouseAdapter() { @Override public void mouseDragged(MouseEvent e) { controller.resetSimulation(); } }); // Panel timeBtnPanel.setBorder(null); timeBtnPanel.setLayout(new FlowLayout(FlowLayout.CENTER)); // Buttons playBtn.setToolTipText(Languages.getLanguage()[89]); playBtn.setContentAreaFilled(false); playBtn.setBorderPainted(false); playBtn.setBorder(null); playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png")).getImage() .getScaledInstance(30, 30, Image.SCALE_SMOOTH))); playBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { running = !running; if (running) { timer.start(); timer.setDelay(model.getTimerSpeed()); playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/pause.png")) .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH))); } else { timer.stop(); playBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/play.png")) .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH))); } } }); timeResetBtn.setToolTipText(Languages.getLanguage()[90]); timeResetBtn.setContentAreaFilled(false); timeResetBtn.setBorder(null); timeResetBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/reset.png")) .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH))); timeResetBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { timeSlider.setValue(timeSlider.getMinimum()); controller.setCurIteration(timeSlider.getValue()); // controller.calculateStateForCurrentTimeStep(); controller.resetSimulation(); } }); timeForwardBtn.setToolTipText(Languages.getLanguage()[91]); timeForwardBtn.setContentAreaFilled(false); timeForwardBtn.setBorder(null); timeForwardBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/forward.png")) .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH))); timeForwardBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { timeSlider.setValue(timeSlider.getValue() + 1); controller.setCurIteration(timeSlider.getValue()); } }); timeBackwardBtn.setToolTipText(Languages.getLanguage()[92]); timeBackwardBtn.setBorder(null); timeBackwardBtn.setIcon(new ImageIcon(new ImageIcon(this.getClass().getResource("/Button_Images/backward.png")) .getImage().getScaledInstance(30, 30, Image.SCALE_SMOOTH))); timeBackwardBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { timeSlider.setValue(timeSlider.getValue() - 1); controller.setCurIteration(timeSlider.getValue()); } }); // timerSpeed simSpeedText.addCaretListener(new CaretListener() { @Override public void caretUpdate(CaretEvent e) { try { controller.setTimerSpeed(Integer.parseInt(simSpeedText.getText())); } catch (Exception ex) { // TODO: handle exception } } }); timeBtnPanel.add(simSpeedLabel); timeBtnPanel.add(simSpeedText); timeBtnPanel.add(playBtn); timeBtnPanel.add(timeResetBtn); /* * the backwards button isnt used anymore */ // timeBtnPanel.add(timeBackwardBtn); timeBtnPanel.add(timeForwardBtn); this.add(timeBtnPanel, BorderLayout.WEST); this.add(timeSlider); } /** * Retunrs the TimeSlider. * * @return the TimeSlider */ public JSlider getTimeSlider() { return timeSlider; } }