/** * Copyright (c) 2009-2011, The HATS Consortium. All rights reserved. * This file is licensed under the terms of the Modified BSD License. */ package abs.backend.java.absunit; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.GridLayout; import java.lang.reflect.InvocationTargetException; import java.util.Vector; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class ABSUnitGUI extends JFrame implements TestModelListener { /** * generated serial number */ private static final long serialVersionUID = -5473702370941393581L; /** the two different views of the GUI */ private final static String FAILURE_LIST_VIEW = "Failure List View"; private final static String TRACE_VIEW = "Trace View"; /* JPanel */ private JPanel cards; private final TestModel model; private JLabel details; private JLabel statLabel; private JLabel testRunStatus; private Bar bar; private JList failureList; public ABSUnitGUI(TestModel model) { super("ABS Unit"); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.model = model; model.addTestModelListener(this); init(); } private void init() { cards = new JPanel(new CardLayout()); JPanel failureCard = new JPanel(); failureList = new JList(); failureList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); failureList.setVisibleRowCount(-1); JScrollPane listScroller = new JScrollPane(failureList); listScroller.setPreferredSize(new Dimension(250, 80)); failureCard.add(listScroller); JPanel traceCard = new JPanel(); JTextArea traceView = new JTextArea(); traceView.setEditable(false); traceCard.add(traceView, TRACE_VIEW); cards.add(failureCard, FAILURE_LIST_VIEW); cards.add(traceCard, TRACE_VIEW); final JPanel barPanel = new JPanel(); barPanel.setLayout(new GridLayout(3, 1)); testRunStatus = new JLabel(getTestRunStatus()); statLabel = new JLabel(getStatistics()); bar = new Bar(); barPanel.add(testRunStatus); barPanel.add(bar); barPanel.add(statLabel); final JPanel detailsPanel = new JPanel(); detailsPanel.setLayout(new BorderLayout()); details = new JLabel("") { private static final long serialVersionUID = 1320537354431551958L; public Dimension getPreferredSize() { return new Dimension(100, 100); } public Dimension getMinimumSize() { return new Dimension(100, 100); } }; details.setAutoscrolls(true); details.setVerticalAlignment(SwingConstants.NORTH); details.setHorizontalAlignment(SwingConstants.LEFT); JScrollPane detailsScroller = new JScrollPane(details); detailsScroller.setPreferredSize(new Dimension(250, 80)); detailsPanel.add(new JLabel("Details: "), BorderLayout.NORTH); detailsPanel.add(new JScrollPane(detailsScroller, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), BorderLayout.CENTER); getContentPane().setLayout(new BorderLayout()); getContentPane().add(barPanel, BorderLayout.NORTH); getContentPane().add(cards, BorderLayout.CENTER); getContentPane().add(detailsPanel, BorderLayout.SOUTH); pack(); } void updateBarPanels() { Runnable guiRun = new Runnable() { @Override public void run() { Vector<TestStatus> failedTests = new Vector<TestStatus>(); for (TestStatus status : model.getAllFinishedTests()) { if (status.getStatus() != TestStatus.Status.OK) { failedTests.add(status); } } failureList.setListData(failedTests); failureList.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent ev) { TestStatus value = (TestStatus) failureList.getSelectedValue(); details.setText(value.displayString()); } }); testRunStatus.setText(getTestRunStatus()); statLabel.setText(getStatistics()); bar.set(model.successful(), model.failed(), model.deadlocked(), model.error(), model.active()); repaint(); } }; if (SwingUtilities.isEventDispatchThread()) { guiRun.run(); } else { try { SwingUtilities.invokeAndWait(guiRun); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private String getTestRunStatus() { return "Tests Running: " + model.active() + "\t\t Tests Finished: " + model.sizeFinished(); } private String getStatistics() { return "Passed: " + model.successful() + "\t\t Failures: " + model.failed() + "\t\t Deadlocks: " + model.deadlocked() + "\t\t Errors: " + model.error(); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { ABSUnitGUI gui = new ABSUnitGUI(new TestModel()); gui.pack(); gui.setVisible(true); } }); } static class Bar extends JPanel { private static final long serialVersionUID = 1555451748887382403L; private static Color OK = Color.GREEN; private static Color FAILED = Color.RED; private static Color ERROR = Color.ORANGE; private static Color DEADLOCK = Color.BLUE; private static Color RUNNING = Color.GRAY; private float all; private float ok; private float failed; private float error; private float deadlock; private float running; Bar() { } public void set(int ok, int failed, int error, int deadlock, int running) { this.ok = ok; this.failed = failed; this.error = error; this.deadlock = deadlock; this.running = running; all = ok + failed + error + deadlock + running; } public void paint(Graphics g) { final int width = getWidth(); final int height = getHeight(); g.setColor(Color.BLACK); g.drawRect(0, 0, width, height); if (all == 0) { return; } // int widthUnit = (int) (width / all); int okWidth = Math.round(ok * widthUnit); int failedWidth = Math.round(failed * widthUnit); int errorWidth = Math.round(error * widthUnit); int deadlockWidth = Math.round(deadlock * widthUnit); int runningWidth = Math.round(running * widthUnit); g.setColor(OK); g.fillRect(0, 0, okWidth, height); g.setColor(FAILED); g.fillRect(okWidth, 0, failedWidth, height); g.setColor(ERROR); g.fillRect(okWidth + failedWidth, 0, errorWidth, height); g.setColor(DEADLOCK); g.fillRect(okWidth + failedWidth + errorWidth, 0, deadlockWidth, height); g.setColor(RUNNING); g.fillRect(okWidth + failedWidth + errorWidth + deadlockWidth, 0, runningWidth, height); } } @Override public void testStarted(TestStatus test) { updateBarPanels(); } @Override public void testFinished(TestStatus test) { updateBarPanels(); } @Override public void systemFinished() { updateBarPanels(); } }