package jeql.monitor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Timer; import javax.swing.UIManager; import jeql.api.row.RowList; import jeql.api.table.Table; import jeql.monitor.MonitorRowList.MonitorRowIterator; import jeql.monitor.ui.MonitorController; /** * The Controller class for the Monitor module, * and provides a simpler facade for clients * * @author Martin Davis * */ public class Monitor { private static final int MAX_COUNT = 100; private static final int PAUSE_DURATION = 1000; private static MonitorController view; //private static PrintLogger logger; private static boolean isViewEnabled = false; private static boolean isEnabled = false; private static boolean isPaused = false; private static boolean isEnded = false; private static boolean isKeepingData = false; public static Object wrap(int line, String name, String tag, Object o) { if (! Monitor.isEnabled()) return o; if (o instanceof RowList) { RowList rs = (RowList) o; MonitorRowList mrl = new MonitorRowList(line, name, tag, rs, isKeepingData); //INSTANCE.getModel().add(line, tag, mrl); return mrl; } else if (o instanceof Table) { Table t = (Table) o; MonitorRowList mrl = new MonitorRowList(line, name, tag, t.getRows(), isKeepingData); //INSTANCE.getModel().add(line, tag, mrl); return Table.replace(t, mrl); } return o; } public static void enableView() { isViewEnabled = true; isEnabled = true; isKeepingData = false; init(); initView(); } public static void enableWorkbench(boolean isKeepData) { isEnabled = true; isKeepingData = isKeepData; init(); } public static void setPaused(boolean paused) { isPaused = paused; } public static boolean isEnabled() { return isEnabled; } public static void setScript(String script) { if (! isEnabled) return; if (view != null) view.setScript(script); } public static void end() { if (! isEnabled) return; INSTANCE.end(); isEnded = true; } public static boolean isEnded() { return isEnded; } public static void add(MonitorRowIterator mri) { if (! isEnabled) return; INSTANCE.getModel().add(mri); } public static void init() { if (INSTANCE != null) return; try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { ex.printStackTrace(); return; } INSTANCE = new MonitorInstance(); INSTANCE.startTimer(); } public static void initView() { view = new MonitorController(INSTANCE.getModel()); view.setVisible(true); } public static void clear() { INSTANCE = null; isEnded = false; } public static void checkStatus() { try { while (isPaused && ! isEnded()) { Thread.sleep(PAUSE_DURATION); } } catch (InterruptedException e) { // do nothing - just continue } if (isEnded()) { throw new TerminationException(); } } public static MonitorModel model() { return INSTANCE.getModel(); } private static MonitorInstance INSTANCE; private static class MonitorInstance { private MonitorModel model = new MonitorModel(); private MonitorInstance() { } public MonitorModel getModel() { return model; } public void end() { model.stop(); if (view == null) return; updateDisplay(); updateTimer.stop(); //if (true) return; // update display one last time, to clear active colour updateDisplay(); view.end(); while (true) { // loop until MonitorView is closed } } private int count = 0; private void update() { count++; if (count < MAX_COUNT) return; count = 0; // updateDisplay(); } private void updateDisplay() { init(); if (view != null) view.update(); } private Timer updateTimer; private long runMillis = 0; private static final int TIMER_DELAY_IN_MILLIS = 100; private void startTimer() { // System.out.println("timer started"); updateTimer = new Timer(TIMER_DELAY_IN_MILLIS, new ActionListener() { public void actionPerformed(ActionEvent e) { runMillis += TIMER_DELAY_IN_MILLIS; // System.out.println("timer: " + runMillis); updateDisplay(); } }); updateTimer.setInitialDelay(0); updateTimer.start(); } } }