diff --git a/src/enginuity/logger/EcuLogger.java b/src/enginuity/logger/EcuLogger.java index dfda7c47..0a54b25f 100644 --- a/src/enginuity/logger/EcuLogger.java +++ b/src/enginuity/logger/EcuLogger.java @@ -6,6 +6,7 @@ import enginuity.logger.definition.EcuDataLoaderImpl; import enginuity.logger.definition.EcuParameter; import enginuity.logger.definition.EcuSwitch; import enginuity.logger.io.serial.SerialPortRefresher; +import enginuity.logger.ui.DashboardPanel; import enginuity.logger.ui.EcuLoggerMenuBar; import enginuity.logger.ui.LoggerDataTableModel; import enginuity.logger.ui.MessageListener; @@ -114,9 +115,9 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC fileUpdateHandler = new FileUpdateHandler(settings); dataTableModel = new LoggerDataTableModel(); liveDataUpdateHandler = new LiveDataUpdateHandler(dataTableModel); - graphPanel = new JPanel(); + graphPanel = new JPanel(new SpringLayout()); graphUpdateHandler = new GraphUpdateHandler(graphPanel); - dashboardPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + dashboardPanel = new DashboardPanel(new FlowLayout(FlowLayout.LEFT)); dashboardUpdateHandler = new DashboardUpdateHandler(dashboardPanel); } @@ -137,8 +138,7 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC setJMenuBar(buildMenubar()); // setup main panel - JPanel mainPanel = new JPanel(); - mainPanel.setLayout(new BorderLayout()); + JPanel mainPanel = new JPanel(new BorderLayout()); mainPanel.add(buildControlToolbar(), NORTH); mainPanel.add(buildTabbedPane(), CENTER); mainPanel.add(buildStatusBar(), SOUTH); @@ -213,8 +213,7 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC } private JComponent buildStatusBar() { - JPanel statusBar = new JPanel(); - statusBar.setLayout(new BorderLayout()); + JPanel statusBar = new JPanel(new BorderLayout()); statusBar.add(statusBarLabel, CENTER); statusBar.setBorder(new BevelBorder(LOWERED)); return statusBar; @@ -275,7 +274,6 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC } private JComponent buildGraphTab() { - graphPanel.setLayout(new SpringLayout()); return new JScrollPane(graphPanel, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_AS_NEEDED); } diff --git a/src/enginuity/logger/ui/DashboardPanel.java b/src/enginuity/logger/ui/DashboardPanel.java new file mode 100644 index 00000000..58948d45 --- /dev/null +++ b/src/enginuity/logger/ui/DashboardPanel.java @@ -0,0 +1,25 @@ +package enginuity.logger.ui; + +import javax.swing.*; +import java.awt.*; + +public final class DashboardPanel extends JPanel { + private boolean resizing = false; + + public DashboardPanel(LayoutManager layoutManager) { + super(layoutManager); + } + + //TODO: This thing is horrible and still dodgy - how to fix it properly??? + public void doLayout() { + if (!resizing && getSize().getWidth() > getVisibleRect().getWidth()) { + setSize(new Dimension((int) getVisibleRect().getWidth(), (int) getSize().getHeight())); + super.doLayout(); + resizing = true; + } else if (getSize().getWidth() <= getVisibleRect().getWidth()) { + super.doLayout(); + resizing = false; + } + + } +} diff --git a/src/enginuity/logger/ui/handler/DashboardUpdateHandler.java b/src/enginuity/logger/ui/handler/DashboardUpdateHandler.java index df66bd46..bc84b651 100644 --- a/src/enginuity/logger/ui/handler/DashboardUpdateHandler.java +++ b/src/enginuity/logger/ui/handler/DashboardUpdateHandler.java @@ -2,10 +2,8 @@ package enginuity.logger.ui.handler; import enginuity.logger.definition.ConvertorUpdateListener; import enginuity.logger.definition.EcuData; -import enginuity.logger.definition.EcuDataConvertor; import javax.swing.*; -import javax.swing.border.BevelBorder; import java.awt.*; import static java.util.Collections.synchronizedMap; import java.util.HashMap; @@ -13,27 +11,21 @@ import java.util.Map; public final class DashboardUpdateHandler implements DataUpdateHandler, ConvertorUpdateListener { private final JPanel dashboardPanel; - private final Map gauges = synchronizedMap(new HashMap()); + private final Map gauges = synchronizedMap(new HashMap()); public DashboardUpdateHandler(JPanel dashboardPanel) { this.dashboardPanel = dashboardPanel; } public void registerData(EcuData ecuData) { - JLabel label = new JLabel(); - label.setPreferredSize(new Dimension(100, 100)); - label.setBorder(new BevelBorder(BevelBorder.LOWERED)); - label.setFont(label.getFont().deriveFont(Font.PLAIN, 50F)); - label.setText(ecuData.getSelectedConvertor().format(0.0)); - gauges.put(ecuData, label); - dashboardPanel.add(label); + Gauge gauge = new PlainGauge(ecuData); + gauges.put(ecuData, gauge); + dashboardPanel.add(gauge); repaintDashboardPanel(); } public void handleDataUpdate(EcuData ecuData, byte[] value, long timestamp) { - JLabel label = gauges.get(ecuData); - EcuDataConvertor convertor = ecuData.getSelectedConvertor(); - label.setText(convertor.format(convertor.convert(value))); + gauges.get(ecuData).updateValue(value); } public void deregisterData(EcuData ecuData) { @@ -46,10 +38,16 @@ public final class DashboardUpdateHandler implements DataUpdateHandler, Converto } public void notifyConvertorUpdate(EcuData updatedEcuData) { + Gauge gauge = gauges.get(updatedEcuData); + gauge.resetValue(); + gauge.refreshTitle(); } private void repaintDashboardPanel() { dashboardPanel.doLayout(); + for (Component component : dashboardPanel.getComponents()) { + component.doLayout(); + } dashboardPanel.repaint(); } diff --git a/src/enginuity/logger/ui/handler/Gauge.java b/src/enginuity/logger/ui/handler/Gauge.java new file mode 100644 index 00000000..6108b7c2 --- /dev/null +++ b/src/enginuity/logger/ui/handler/Gauge.java @@ -0,0 +1,13 @@ +package enginuity.logger.ui.handler; + +import javax.swing.*; + +public abstract class Gauge extends JPanel { + + public abstract void refreshTitle(); + + public abstract void updateValue(byte[] value); + + public abstract void resetValue(); + +} diff --git a/src/enginuity/logger/ui/handler/PlainGauge.java b/src/enginuity/logger/ui/handler/PlainGauge.java new file mode 100644 index 00000000..b53ed3f4 --- /dev/null +++ b/src/enginuity/logger/ui/handler/PlainGauge.java @@ -0,0 +1,59 @@ +package enginuity.logger.ui.handler; + +import enginuity.logger.definition.EcuData; +import static enginuity.util.ParamChecker.checkNotNull; + +import javax.swing.*; +import javax.swing.border.BevelBorder; +import java.awt.*; +import static java.awt.BorderLayout.CENTER; +import static java.awt.BorderLayout.NORTH; + +public final class PlainGauge extends Gauge { + private static final double ZERO = 0.0; + private final EcuData ecuData; + private final JLabel data = new JLabel(); + private final JLabel title = new JLabel(); + + public PlainGauge(EcuData ecuData) { + checkNotNull(ecuData, "ecuData"); + this.ecuData = ecuData; + initLabelLayout(); + initGaugeLayout(); + } + + public void refreshTitle() { + title.setText(ecuData.getName() + " (" + ecuData.getSelectedConvertor().getUnits() + ')'); + } + + public void updateValue(byte[] value) { + refreshValue(ecuData.getSelectedConvertor().convert(value)); + } + + public void resetValue() { + refreshValue(ZERO); + } + + private void initLabelLayout() { + data.setMinimumSize(new Dimension(150, 100)); + data.setMaximumSize(new Dimension(150, 100)); + data.setPreferredSize(new Dimension(150, 100)); + data.setBorder(new BevelBorder(BevelBorder.LOWERED)); + data.setFont(data.getFont().deriveFont(Font.PLAIN, 50F)); + } + + private void initGaugeLayout() { + refreshValue(ZERO); + refreshTitle(); + setLayout(new BorderLayout()); + setPreferredSize(new Dimension(150, 150)); + setBackground(Color.GREEN); + add(data, CENTER); + add(title, NORTH); + } + + private void refreshValue(double value) { + data.setText(ecuData.getSelectedConvertor().format(value)); + } + +}