/*
* RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2012 RomRaider.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.romraider.logger.ecu.ui.handler.dash;
import com.romraider.logger.ecu.comms.query.Response;
import com.romraider.logger.ecu.definition.ConvertorUpdateListener;
import com.romraider.logger.ecu.definition.LoggerData;
import com.romraider.logger.ecu.ui.handler.DataUpdateHandler;
import static com.romraider.util.ThreadUtil.run;
import static java.util.Collections.synchronizedMap;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import java.awt.Container;
import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
public final class DashboardUpdateHandler implements DataUpdateHandler, ConvertorUpdateListener {
private static final Class[] STYLES = {PlainGaugeStyle.class, SmallGaugeStyle.class, NoFrillsGaugeStyle.class, DialGaugeStyle.class, SmallDialGaugeStyle.class};
private final Map<LoggerData, Gauge> gauges = synchronizedMap(new HashMap<LoggerData, Gauge>());
private final JPanel dashboardPanel;
public int styleIndex;
public DashboardUpdateHandler(JPanel dashboardPanel, int styleIndex) {
this.dashboardPanel = dashboardPanel;
this.styleIndex = styleIndex;
}
public synchronized void registerData(final LoggerData loggerData) {
GaugeStyle style = getGaugeStyle(STYLES[styleIndex], loggerData);
Gauge gauge = new Gauge(style);
gauges.put(loggerData, gauge);
dashboardPanel.add(gauge);
repaintDashboardPanel();
}
public synchronized void handleDataUpdate(Response response) {
for (LoggerData loggerData : response.getData()) {
Gauge gauge = gauges.get(loggerData);
if (gauge != null) {
double value = response.getDataValue(loggerData);
gauge.updateValue(value);
}
}
}
public synchronized void deregisterData(LoggerData loggerData) {
dashboardPanel.remove(gauges.get(loggerData));
gauges.remove(loggerData);
repaintDashboardPanel();
}
public synchronized void cleanUp() {
}
public synchronized void reset() {
for (Gauge gauge : gauges.values()) {
gauge.resetValue();
}
}
public synchronized void notifyConvertorUpdate(LoggerData updatedLoggerData) {
Gauge gauge = gauges.get(updatedLoggerData);
if (gauge != null) {
gauge.resetValue();
gauge.refreshTitle();
}
}
public synchronized void toggleGaugeStyle() {
Class<? extends GaugeStyle> styleClass = getNextStyleClass();
for (Map.Entry<LoggerData, Gauge> entry : gauges.entrySet()) {
GaugeStyle style = getGaugeStyle(styleClass, entry.getKey());
entry.getValue().setGaugeStyle(style);
}
repaintDashboardPanel();
}
private Class<? extends GaugeStyle> getNextStyleClass() {
styleIndex = styleIndex == STYLES.length - 1 ? 0 : styleIndex + 1;
return STYLES[styleIndex];
}
private GaugeStyle getGaugeStyle(Class<? extends GaugeStyle> styleClass, LoggerData loggerData) {
try {
Constructor<? extends GaugeStyle> constructor = styleClass.getDeclaredConstructor(LoggerData.class);
return constructor.newInstance(loggerData);
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
private void repaintDashboardPanel() {
run(new Runnable() {
public void run() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Container parent = dashboardPanel.getParent();
if (parent != null) parent.validate();
else dashboardPanel.validate();
dashboardPanel.repaint();
}
});
}
});
}
}