diff --git a/CanadaDatamartProvider.jar b/CanadaDatamartProvider.jar new file mode 100644 index 0000000..76803c5 Binary files /dev/null and b/CanadaDatamartProvider.jar differ diff --git a/CanadaDatamartProvider.properties b/CanadaDatamartProvider.properties new file mode 100644 index 0000000..01cb82c --- /dev/null +++ b/CanadaDatamartProvider.properties @@ -0,0 +1,4 @@ +#VisualForecast 1000 Properties file. Functional provider must be set for successful boot! +#Thu Mar 07 14:12:25 PST 2024 +towns-by-code= +towns-by-name-and-province=Vancouver,BC;Kamloops,BC;Kelowna,BC diff --git a/EnvironmentCanadaProvider.properties b/EnvironmentCanadaProvider.properties new file mode 100644 index 0000000..c19bcfa --- /dev/null +++ b/EnvironmentCanadaProvider.properties @@ -0,0 +1,4 @@ +#VisualForecast 1000 Properties file. Functional provider must be set for successful boot! +#Thu Mar 07 14:12:28 PST 2024 +towns-by-code= +towns-by-name-and-province=Vancouver,BC;Kamloops,BC;Kelowna,BC diff --git a/MockForecastProvider.jar b/MockForecastProvider.jar new file mode 100644 index 0000000..d6144df Binary files /dev/null and b/MockForecastProvider.jar differ diff --git a/src/com/flaremicro/flaretv/visualforecast/PropertyManager.java b/src/com/flaremicro/flaretv/visualforecast/PropertyManager.java deleted file mode 100644 index 3efc6df..0000000 --- a/src/com/flaremicro/flaretv/visualforecast/PropertyManager.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.flaremicro.flaretv.visualforecast; - -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.Reader; -import java.io.Writer; -import java.util.Properties; - -import com.flaremicro.util.Util; - -public class PropertyManager { - private final Properties underlyingProperties = new Properties(); - private static File propFile = new File("./vf1000.properties"); - - public boolean load() { - Reader reader = null; - try - { - reader = new FileReader(propFile); - underlyingProperties.load(reader); - return true; - } - catch (IOException e) - { - e.printStackTrace(); - } - finally - { - Util.cleanClose(reader); - } - return false; - } - - public boolean store() { - Writer writer = null; - try - { - writer = new FileWriter(propFile); - underlyingProperties.store(writer, "VisualForecast 1000 Properties file. Functional provider must be set for successful boot!"); - return true; - } - catch (IOException e) - { - e.printStackTrace(); - } - finally{ - Util.cleanClose(writer); - } - return false; - } -} diff --git a/src/com/flaremicro/flaretv/visualforecast/flavour/Flavour.java b/src/com/flaremicro/flaretv/visualforecast/flavour/Flavour.java deleted file mode 100644 index 0f5ddab..0000000 --- a/src/com/flaremicro/flaretv/visualforecast/flavour/Flavour.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.flaremicro.flaretv.visualforecast.flavour; - -import java.awt.Graphics2D; -import java.awt.Rectangle; - -import com.flaremicro.flaretv.visualforecast.RenderPanel; -import com.flaremicro.flaretv.visualforecast.forecast.ForecastDetails; - -public interface Flavour { - public void tick(RenderPanel renderer, long ticks, int iconTicks); - public void initFlavour(RenderPanel renderer, ForecastDetails details, long ticks, int iconTicks); - public void drawFlavour(RenderPanel renderer, Graphics2D g, long ticks, int iconTicks); - public void drawBoundLimitedFlavour(RenderPanel renderer, Graphics2D g, Rectangle bounds, long ticks, int iconTicks); - public void redrawRegionlost(RenderPanel renderer); -} diff --git a/src/com/flaremicro/flaretv/visualforecast/interfaces/Tickable.java b/src/com/flaremicro/flaretv/visualforecast/interfaces/Tickable.java deleted file mode 100644 index 27ce33a..0000000 --- a/src/com/flaremicro/flaretv/visualforecast/interfaces/Tickable.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.flaremicro.flaretv.visualforecast.interfaces; - -public interface Tickable { - public void tick(); -} diff --git a/src/com/flaremicro/flaretv/visualforecast/providerapi/ForecastProvider.java b/src/com/flaremicro/flaretv/visualforecast/providerapi/ForecastProvider.java deleted file mode 100644 index c3b3dc8..0000000 --- a/src/com/flaremicro/flaretv/visualforecast/providerapi/ForecastProvider.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.flaremicro.flaretv.visualforecast.providerapi; - -public abstract class ForecastProvider { - ForecastProviderManager pluginManager; - - protected final void setAsProvider(String authority) - { - - } - - public abstract void init(); -} diff --git a/src/com/flaremicro/flaretv/visualforecast/providerapi/ForecastProviderManager.java b/src/com/flaremicro/flaretv/visualforecast/providerapi/ForecastProviderManager.java deleted file mode 100644 index b158b6e..0000000 --- a/src/com/flaremicro/flaretv/visualforecast/providerapi/ForecastProviderManager.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.flaremicro.flaretv.visualforecast.providerapi; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.Properties; -import java.util.logging.Logger; - -import com.flaremicro.util.Util; - -public class ForecastProviderManager { - public static final float API_VERSION = 0.0F; - private Logger log = Util.getDefaultLogger(); - private ForecastProvider loadedProvider; - - public void loadProviders(File file) { - Util.getDefaultLogger().info("Loading provider " + file.getName()); - - try - { - URLClassLoader classLoader = new URLClassLoader(new URL[] { file.toURI().toURL() }); - Properties properties = new Properties(); - InputStream propStream = classLoader.getResourceAsStream("provider.inf"); - properties.load(propStream); - Util.cleanClose(propStream); - - String mainClassStr = properties.getProperty("main-class", ""); - Class mainClass = classLoader.loadClass(mainClassStr); - Object instance = mainClass.newInstance(); - if (instance instanceof ForecastProvider) - { - loadedProvider = (ForecastProvider) instance; - loadedProvider.init(); - log.info("Provider " + file.getName() + " loaded!"); - } - else - { - log.info("Provider " + file.getName() + " main class is wrong object type"); - log.info("(Does main class not extend ForecastProvider?)"); - } - - } - catch (ClassNotFoundException e) - { - log.info("Provider " + file.getName() + " main class not found:"); - e.printStackTrace(); - log.info("(Is the information file invalid?)"); - } - catch (IOException e) - { - log.info("Provider " + file.getName() + " failed to read information file:"); - e.printStackTrace(); - log.info("(Is the information file defined?)"); - } - catch (InstantiationException e) - { - log.info("Provider " + file.getName() + " failed to instantiate main class:"); - e.printStackTrace(); - log.info("(Does main class not implement empty constructor?)"); - } - catch (IllegalAccessException e) - { - e.printStackTrace(); - } - - } - -} diff --git a/src/com/flaremicro/flaretv/visualforecast/providerapi/MockForecastProvider.java b/src/com/flaremicro/flaretv/visualforecast/providerapi/MockForecastProvider.java deleted file mode 100644 index b844e2c..0000000 --- a/src/com/flaremicro/flaretv/visualforecast/providerapi/MockForecastProvider.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.flaremicro.flaretv.visualforecast.providerapi; - -import java.util.Random; - -import com.flaremicro.flaretv.visualforecast.forecast.DayForecast; -import com.flaremicro.flaretv.visualforecast.forecast.ForecastDetails; -import com.flaremicro.flaretv.visualforecast.forecast.TownForecast; -import com.flaremicro.flaretv.visualforecast.forecast.ValueCheck; -import com.flaremicro.flaretv.visualforecast.icons.IconProvider; - -public class MockForecastProvider { - - - private static final String[] townNames = { - "Vancouver", - "Burnaby", - "Kamloops", - "Kelona", - "Lytton" - }; - - private final static WeatherType[] possibleWeather = { - new WeatherType(IconProvider.BLIZZARD.id, "Blizzard", true), - new WeatherType(IconProvider.CLOUD.id, "Cloudy", false), - new WeatherType(IconProvider.CLOUDY_CLOUDY.id, "Very", "Cloudy", false), - new WeatherType(IconProvider.FREEZING_RAIN.id, "Freezing", "Rain", true), - new WeatherType(IconProvider.LIGHTNING_STORM.id, "Thunder", "Storm", true), - new WeatherType(IconProvider.LIGHTNING_BLIZZARD.id, "Blizzard", "T'Storm", true), - new WeatherType(IconProvider.PARTLY_CLOUDY.id, "Partly", "Cloudy", false), - new WeatherType(IconProvider.RAIN.id, "Rain", true), - new WeatherType(IconProvider.RAIN_HEAVIEST.id, "Extreme","Rain", true), - new WeatherType(IconProvider.RAIN_HEAVY.id, "Heavy","Rain", true), - new WeatherType(IconProvider.RAIN_LIGHT.id, "Light","Rain", true), - new WeatherType(IconProvider.RAIN_LIGHTEST.id, "Drizzle", true), - new WeatherType(IconProvider.RAIN_SNOW.id, "Rain","Snow", true), - new WeatherType(IconProvider.RAIN_VANCOUVER.id, "Vancouver","Rain", true), - new WeatherType(IconProvider.SCATTERD_SHOWERS.id, "Scattered","Showers", true), - new WeatherType(IconProvider.SCATTERD_THUNDERSTORMS.id, "Scattered","T'Storms", true), - new WeatherType(IconProvider.SNOW.id, "Snow", true), - new WeatherType(IconProvider.SUN.id, "Sun", false), - new WeatherType(IconProvider.FOG.id, "Fog", false), - new WeatherType(IconProvider.HAIL.id, "Hail", false), - new WeatherType(IconProvider.BUTTER_RAIN.id, "Paula", "Dean", false), - new WeatherType(IconProvider.BUTTER.id, "Unsalted", "Butter", false), - //new WeatherType(IconProvider.INVALID_RAIN.id, "Your", "Mom", false), - }; - - - public static ForecastDetails provideMockForecast() - { - Random random = new Random(); - ForecastDetails fd = new ForecastDetails(); - fd.setTownForecast(provideTownForecast(random)); - return fd; - - } - - private static TownForecast[] provideTownForecast(Random random) { - TownForecast[] tf = new TownForecast[townNames.length]; - for(int i = 0; i < tf.length; i++) - { - tf[i] = new TownForecast(townNames[i], provideDayForecast(random)); - } - return tf; - } - - private static DayForecast[] provideDayForecast(Random random) - { - DayForecast[] df = new DayForecast[8]; - for(int i = 0; i < df.length; i++) - { - if(random.nextInt(11) == 10) - { - df[i] = new DayForecast(ValueCheck.NO_DATA_BYTE, ValueCheck.NO_DATA_BYTE, (byte)0, null, null, ValueCheck.NO_DATA_FLOAT); - } - else - { - byte hiTemp = (byte)(random.nextInt(60)-20); - byte loTemp = (byte)(random.nextInt(60)-20); - if(hiTemp < loTemp) - { - byte temp = hiTemp; - hiTemp = loTemp; - loTemp = temp; - } - - byte iconId = 0; - String weatherLine1 = null; - String weatherLine2 = null; - float percipPercent = ValueCheck.NO_DATA_FLOAT; - - WeatherType wt = possibleWeather[random.nextInt(possibleWeather.length)]; - iconId = wt.iconId; - weatherLine1 = wt.line1; - weatherLine2 = wt.line2; - - if(wt.hasPercipitation) - { - percipPercent = random.nextFloat() * 100; - } - - df[i] = new DayForecast(hiTemp, loTemp, iconId, weatherLine1, weatherLine2, percipPercent); - } - } - return df; - } - -} - -class WeatherType{ - byte iconId; - String line1; - String line2; - boolean hasPercipitation; - - public WeatherType(byte iconId, String line1, boolean hasPercipitation){ - this(iconId, line1, null, hasPercipitation); - } - public WeatherType(byte iconId, String line1, String line2, boolean hasPercipitation){ - this.iconId = iconId; - this.line1 = line1; - this.line2 = line2; - this.hasPercipitation = hasPercipitation; - } -} \ No newline at end of file diff --git a/src/com/flaremicro/flaretv/visualforecast/Executor.java b/src/com/flaremicro/visualforecast/Executor.java similarity index 87% rename from src/com/flaremicro/flaretv/visualforecast/Executor.java rename to src/com/flaremicro/visualforecast/Executor.java index ce6af6b..5645e28 100644 --- a/src/com/flaremicro/flaretv/visualforecast/Executor.java +++ b/src/com/flaremicro/visualforecast/Executor.java @@ -1,10 +1,10 @@ -package com.flaremicro.flaretv.visualforecast; +package com.flaremicro.visualforecast; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import com.flaremicro.flaretv.visualforecast.interfaces.Tickable; +import com.flaremicro.visualforecast.interfaces.Tickable; public class Executor { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); diff --git a/src/com/flaremicro/visualforecast/PropertyManager.java b/src/com/flaremicro/visualforecast/PropertyManager.java new file mode 100644 index 0000000..b9bfd05 --- /dev/null +++ b/src/com/flaremicro/visualforecast/PropertyManager.java @@ -0,0 +1,72 @@ +package com.flaremicro.visualforecast; + +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; +import java.util.Properties; + +import com.flaremicro.util.Util; + +public class PropertyManager { + private final Properties prop = new Properties(); + private File propFile = new File("./vf1000.properties"); + + public PropertyManager() { + } + + public PropertyManager(String filename) { + propFile = new File("./"+filename+".properties"); + } + + public boolean load() { + Reader reader = null; + try + { + if (propFile.exists()) + { + reader = new FileReader(propFile); + prop.load(reader); + return true; + } + return false; + } + catch (IOException e) + { + e.printStackTrace(); + } + finally + { + Util.cleanClose(reader); + } + return false; + } + + public boolean store() { + Writer writer = null; + try + { + writer = new FileWriter(propFile); + prop.store(writer, "VisualForecast 1000 Properties file. Functional provider must be set for successful boot!"); + return true; + } + catch (IOException e) + { + e.printStackTrace(); + } + finally + { + Util.cleanClose(writer); + } + return false; + } + + public String getString(String key, String fallback) { + String result = prop.getProperty(key, fallback); + System.out.println(result); + prop.setProperty(key, result); + return result; + } +} diff --git a/src/com/flaremicro/flaretv/visualforecast/RenderPanel.java b/src/com/flaremicro/visualforecast/RenderPanel.java similarity index 78% rename from src/com/flaremicro/flaretv/visualforecast/RenderPanel.java rename to src/com/flaremicro/visualforecast/RenderPanel.java index bd74c49..4b26f48 100644 --- a/src/com/flaremicro/flaretv/visualforecast/RenderPanel.java +++ b/src/com/flaremicro/visualforecast/RenderPanel.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast; +package com.flaremicro.visualforecast; import java.awt.BasicStroke; import java.awt.Color; @@ -16,14 +16,16 @@ import java.util.Calendar; import javax.swing.JPanel; -import static com.flaremicro.flaretv.visualforecast.graphics.RenderConstants.*; +import static com.flaremicro.visualforecast.graphics.RenderConstants.*; -import com.flaremicro.flaretv.visualforecast.flavour.DayForecastFlavour; -import com.flaremicro.flaretv.visualforecast.flavour.Flavour; -import com.flaremicro.flaretv.visualforecast.graphics.DrawingUtil; -import com.flaremicro.flaretv.visualforecast.graphics.FontManager; -import com.flaremicro.flaretv.visualforecast.interfaces.Tickable; -import com.flaremicro.flaretv.visualforecast.providerapi.MockForecastProvider; +import com.flaremicro.visualforecast.api.ForecastProvider; +import com.flaremicro.visualforecast.displays.BootupDisplay; +import com.flaremicro.visualforecast.displays.DayForecastDisplay; +import com.flaremicro.visualforecast.displays.Display; +import com.flaremicro.visualforecast.forecast.ForecastDetails; +import com.flaremicro.visualforecast.graphics.DrawingUtil; +import com.flaremicro.visualforecast.graphics.FontManager; +import com.flaremicro.visualforecast.interfaces.Tickable; public class RenderPanel extends JPanel implements Tickable, ComponentListener { @@ -36,7 +38,7 @@ public class RenderPanel extends JPanel implements Tickable, ComponentListener { private Font font = null; - private Flavour currentFlavour = new DayForecastFlavour(); + private Display currentFlavour = new BootupDisplay(); private int iconAnimationTicks = 0; private long ticks = 0; @@ -47,11 +49,16 @@ public class RenderPanel extends JPanel implements Tickable, ComponentListener { private String currentTown = ""; private String currentForecast = ""; - public RenderPanel() { + private ForecastProvider forecastProvider = null; + + private PropertyManager propManager; + + public RenderPanel(PropertyManager propManager) { this.addComponentListener(this); this.setDoubleBuffered(true); + this.propManager = propManager; font = FontManager.getInstance().getOrCreateFont(Font.TRUETYPE_FONT, this.getClass().getResource("/Star4000.ttf")); - currentFlavour.initFlavour(this, MockForecastProvider.provideMockForecast(), ticks, iconAnimationTicks); + currentFlavour.initDisplay(this, null, ticks, iconAnimationTicks); //new Thread(new TickThread(this, 30)).start(); } @@ -92,9 +99,9 @@ public class RenderPanel extends JPanel implements Tickable, ComponentListener { if (currentFlavour != null) { if (this.getBounds().equals(g.getClipBounds())) - this.currentFlavour.drawFlavour(this, g2d, ticks, iconAnimationTicks); + this.currentFlavour.drawDisplay(this, g2d, ticks, iconAnimationTicks); if (g.getClipBounds() != null) - this.currentFlavour.drawBoundLimitedFlavour(this, g2d, g.getClipBounds(), ticks, iconAnimationTicks); + this.currentFlavour.drawBoundLimitedDisplay(this, g2d, g.getClipBounds(), ticks, iconAnimationTicks); } g2d.dispose(); g.drawImage(frameBuffer, 0, 0, getWidth(), getHeight(), this); @@ -167,13 +174,13 @@ public class RenderPanel extends JPanel implements Tickable, ComponentListener { public BufferedImage getSnapshot() { return frameBuffer.getSnapshot(); } - - private void addRedrawBound(int x, int y, int w, int h, boolean isExclusive){ + + private void addRedrawBound(int x, int y, int w, int h, boolean isExclusive) { float wScale = getWidth() / (float) W; float hScale = getHeight() / (float) H; Rectangle rect = new Rectangle((int) (x * wScale), (int) (y * hScale), (int) (w * wScale), (int) (h * hScale)); - if(isExclusive) + if (isExclusive) this.exclusiveRedrawBound = rect; if (redrawBound == null) this.redrawBound = new Rectangle((int) (x * wScale), (int) (y * hScale), (int) (w * wScale), (int) (h * hScale)); @@ -214,16 +221,32 @@ public class RenderPanel extends JPanel implements Tickable, ComponentListener { } - public void nextFlavour() { - this.currentFlavour = new DayForecastFlavour(); - this.currentFlavour.initFlavour(this, MockForecastProvider.provideMockForecast(), ticks, iconAnimationTicks); + public void setForecastProvider(ForecastProvider forecastProvider) { + this.forecastProvider = forecastProvider; + this.currentFlavour.notifyForecastProviderUpdate(this, forecastProvider); } - public void setCurrentTown(String currentTown){ + public void notifyForecastProviderUpdate() + { + this.currentFlavour.notifyForecastProviderUpdate(this, forecastProvider); + } + + public ForecastDetails getForecast() { + return forecastProvider.getForecast(); + } + + public void nextDisplay() { + this.currentFlavour = new DayForecastDisplay(); + this.currentFlavour.initDisplay(this, forecastProvider, ticks, iconAnimationTicks); + this.loseRedrawRegion(); + this.requestFullRepaint(); + } + + public void setCurrentTown(String currentTown) { this.currentTown = currentTown; } - - public void setCurrentForecast(String currentForecast){ + + public void setCurrentForecast(String currentForecast) { this.currentForecast = currentForecast; } @@ -234,7 +257,7 @@ public class RenderPanel extends JPanel implements Tickable, ComponentListener { public void requestBoundedRepaint() { repaint(redrawBound); } - + public void requestExclusiveBoundedRepaint() { repaint(exclusiveRedrawBound); } diff --git a/src/com/flaremicro/flaretv/visualforecast/TickThread.java b/src/com/flaremicro/visualforecast/TickThread.java similarity index 86% rename from src/com/flaremicro/flaretv/visualforecast/TickThread.java rename to src/com/flaremicro/visualforecast/TickThread.java index 4556df1..ee6b43f 100644 --- a/src/com/flaremicro/flaretv/visualforecast/TickThread.java +++ b/src/com/flaremicro/visualforecast/TickThread.java @@ -1,8 +1,8 @@ -package com.flaremicro.flaretv.visualforecast; +package com.flaremicro.visualforecast; import java.util.concurrent.locks.LockSupport; -import com.flaremicro.flaretv.visualforecast.interfaces.Tickable; +import com.flaremicro.visualforecast.interfaces.Tickable; public class TickThread implements Runnable { private final Tickable tickable; diff --git a/src/com/flaremicro/flaretv/visualforecast/VisualForecastFrame.java b/src/com/flaremicro/visualforecast/VisualForecastFrame.java similarity index 67% rename from src/com/flaremicro/flaretv/visualforecast/VisualForecastFrame.java rename to src/com/flaremicro/visualforecast/VisualForecastFrame.java index a467588..a12df52 100644 --- a/src/com/flaremicro/flaretv/visualforecast/VisualForecastFrame.java +++ b/src/com/flaremicro/visualforecast/VisualForecastFrame.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast; +package com.flaremicro.visualforecast; import java.awt.BorderLayout; import java.awt.EventQueue; @@ -6,12 +6,14 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; +import java.io.File; import javax.swing.JFrame; -import com.flaremicro.flaretv.visualforecast.providerapi.ForecastProviderManager; +import com.flaremicro.visualforecast.api.ForecastProvider; +import com.flaremicro.visualforecast.api.ForecastProviderManager; -public class VisualForecastFrame extends JFrame implements WindowListener, KeyListener{ +public class VisualForecastFrame extends JFrame implements WindowListener, KeyListener { /** * @@ -20,7 +22,7 @@ public class VisualForecastFrame extends JFrame implements WindowListener, KeyLi private RenderPanel renderPane; private ForecastProviderManager forecastProviderManager; private Executor executor; - private PropertyManager propertyManager; + private PropertyManager propertyManager = new PropertyManager(); private boolean isFullscreen = false; /** @@ -29,42 +31,54 @@ public class VisualForecastFrame extends JFrame implements WindowListener, KeyLi public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { - try { + try + { VisualForecastFrame frame = new VisualForecastFrame(); frame.setVisible(true); frame.init(); //GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[1].setFullScreenWindow(frame); - frame.createBufferStrategy(2); - } catch (Exception e) { + frame.createBufferStrategy(2); + } + catch (Exception e) + { e.printStackTrace(); } } }); } - - public void end() - { - if(executor != null) + + public void end() { + if (executor != null) executor.end(); + if (forecastProviderManager != null) + forecastProviderManager.end(); + propertyManager.store(); } - public void init() - { - end(); + public void init() { executor = new Executor(this.renderPane, 30); executor.begin(); - - forecastProviderManager = new ForecastProviderManager(); - + + new Thread() { + public void run() { + forecastProviderManager = new ForecastProviderManager(renderPane); + propertyManager.load(); + String forecastProvider = propertyManager.getString("forecast-provider-jar", ""); + propertyManager.store(); + ForecastProvider provider = forecastProviderManager.loadProvider(new File(forecastProvider)); + renderPane.setForecastProvider(provider); + } + }.start(); + } - + /** * Create the frame. */ public VisualForecastFrame() { setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - setBounds(100, 100, 640*2, 480*2); - renderPane = new RenderPanel(); + setBounds(100, 100, 640 * 2, 480 * 2); + renderPane = new RenderPanel(propertyManager); renderPane.setBorder(null); renderPane.setLayout(new BorderLayout(0, 0)); setContentPane(renderPane); @@ -76,61 +90,61 @@ public class VisualForecastFrame extends JFrame implements WindowListener, KeyLi @Override public void windowOpened(WindowEvent e) { // TODO Auto-generated method stub - + } @Override public void windowClosing(WindowEvent e) { - + end(); } @Override public void windowClosed(WindowEvent e) { // TODO Auto-generated method stub - + } @Override public void windowIconified(WindowEvent e) { // TODO Auto-generated method stub - + } @Override public void windowDeiconified(WindowEvent e) { // TODO Auto-generated method stub - + } @Override public void windowActivated(WindowEvent e) { // TODO Auto-generated method stub - + } @Override public void windowDeactivated(WindowEvent e) { // TODO Auto-generated method stub - + } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub - + } @Override public void keyPressed(KeyEvent e) { - if(e.getKeyCode() == KeyEvent.VK_F11) + if (e.getKeyCode() == KeyEvent.VK_F11) { - if(isFullscreen) + if (isFullscreen) { isFullscreen = false; this.getGraphicsConfiguration().getDevice().setFullScreenWindow(null); - setBounds(100, 100, 640*2, 480*2); - + setBounds(100, 100, 640 * 2, 480 * 2); + } else { @@ -143,7 +157,7 @@ public class VisualForecastFrame extends JFrame implements WindowListener, KeyLi @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub - + } } diff --git a/src/com/flaremicro/visualforecast/api/ForecastProvider.java b/src/com/flaremicro/visualforecast/api/ForecastProvider.java new file mode 100644 index 0000000..e40186c --- /dev/null +++ b/src/com/flaremicro/visualforecast/api/ForecastProvider.java @@ -0,0 +1,59 @@ +package com.flaremicro.visualforecast.api; + +import com.flaremicro.visualforecast.PropertyManager; +import com.flaremicro.visualforecast.RenderPanel; +import com.flaremicro.visualforecast.forecast.ForecastDetails; + +public abstract class ForecastProvider { + ForecastProviderManager forecastProviderManager; + /** + * Initialize the provider. This is called in a separate thread to any other function call. + * The VisualForecast 1000 software will wait on the BootupDisplay until this function completes. + */ + public abstract void init(); + + /** + * Get the current forecast. + * This should delay as little as possible, as this is called in the main action thread. + * + * @return ForecastDetails + */ + public abstract ForecastDetails getForecast(); + + /** + * Should generally be true unless forecast information is collected somewhere other than init. + * In the case that forecast information is still unavailable by the time this is called, + * this should return false and upon completion and state change, should notify listeners by calling + * notifyForecastProviderUpdate() + * @return + */ + public abstract boolean isForecastReady(); + + public abstract void deinit(); + + public final void notifyForecastProviderUpdate() + { + getRenderPanel().notifyForecastProviderUpdate(); + } + + public final ForecastProviderManager getManager() + { + return forecastProviderManager; + } + + public final RenderPanel getRenderPanel() + { + return forecastProviderManager.getRenderPanel(); + } + + /** + * Gets a property manager specific to the forecast provider. + * The property manager is already loaded. + * @return + */ + public PropertyManager getOwnPropertyManager() { + PropertyManager propertyManager = new PropertyManager(forecastProviderManager.getProviderName(this)); + propertyManager.load(); + return propertyManager; + } +} diff --git a/src/com/flaremicro/visualforecast/api/ForecastProviderManager.java b/src/com/flaremicro/visualforecast/api/ForecastProviderManager.java new file mode 100644 index 0000000..1448ff6 --- /dev/null +++ b/src/com/flaremicro/visualforecast/api/ForecastProviderManager.java @@ -0,0 +1,113 @@ +package com.flaremicro.visualforecast.api; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Properties; +import java.util.logging.Logger; + +import com.flaremicro.util.Util; +import com.flaremicro.visualforecast.RenderPanel; + +public class ForecastProviderManager { + public static final float API_VERSION = 0.0F; + private Logger log = Util.getDefaultLogger(); + private ForecastProvider loadedProvider; + private String loadedProviderName; + private RenderPanel mainPanel; + + public ForecastProviderManager(RenderPanel mainPanel) + { + this.mainPanel = mainPanel; + } + + public RenderPanel getRenderPanel() + { + return this.mainPanel; + } + + public ForecastProvider loadProvider(File file) { + Util.getDefaultLogger().info("Loading provider " + file.getName()); + try + { + URLClassLoader classLoader = new URLClassLoader(new URL[] { file.toURI().toURL() }); + Properties properties = new Properties(); + InputStream propStream = classLoader.getResourceAsStream("provider.properties"); + if (propStream != null) + { + properties.load(propStream); + Util.cleanClose(propStream); + + String mainClassStr = properties.getProperty("main-class", ""); + Class mainClass = classLoader.loadClass(mainClassStr); + Object instance = mainClass.newInstance(); + if (instance instanceof ForecastProvider) + { + loadedProvider = (ForecastProvider) instance; + loadedProvider.forecastProviderManager = this; + loadedProviderName = file.getName().substring(0, file.getName().length() - 4); + loadedProvider.init(); + log.info("Provider " + file.getName() + " loaded! (Name set to " + loadedProviderName +")"); + return loadedProvider; + } + else + { + log.info("Provider " + file.getName() + " main class is wrong object type"); + log.info("(Does main class not extend ForecastProvider?)"); + } + } + else + { + log.info("Provider " + file.getName() + " properties file was not found"); + log.info("(Is the jar path correct?)"); + } + } + catch (ClassNotFoundException e) + { + log.info("Provider " + file.getName() + " main class not found:"); + e.printStackTrace(); + log.info("(Is the information file invalid?)"); + } + catch (IOException e) + { + log.info("Provider " + file.getName() + " failed to read information file:"); + e.printStackTrace(); + log.info("(Is the information file defined?)"); + } + catch (InstantiationException e) + { + log.info("Provider " + file.getName() + " failed to instantiate main class:"); + e.printStackTrace(); + log.info("(Does main class not implement empty constructor?)"); + } + catch (IllegalAccessException e) + { + log.info("Provider " + file.getName() + " failed to instantiate main class:"); + e.printStackTrace(); + log.info("(Does the program have reflection permission?)"); + } + catch (Exception e) + { + log.info("Provider " + file.getName() + " failed while loading:"); + e.printStackTrace(); + } + catch (Throwable e) + { + log.info("Provider " + file.getName() + " failed catastrophically while loading:"); + e.printStackTrace(); + } + return null; + } + + public void end() { + if (loadedProvider != null) + this.loadedProvider.deinit(); + } + + public String getProviderName(ForecastProvider forecastProvider) { + return loadedProviderName; + } + +} diff --git a/src/com/flaremicro/visualforecast/displays/BootupDisplay.java b/src/com/flaremicro/visualforecast/displays/BootupDisplay.java new file mode 100644 index 0000000..e88be81 --- /dev/null +++ b/src/com/flaremicro/visualforecast/displays/BootupDisplay.java @@ -0,0 +1,105 @@ +package com.flaremicro.visualforecast.displays; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.Rectangle; + +import com.flaremicro.visualforecast.RenderPanel; +import com.flaremicro.visualforecast.api.ForecastProvider; +import com.flaremicro.visualforecast.graphics.DrawingUtil; +import com.flaremicro.visualforecast.graphics.FontManager; +import com.flaremicro.visualforecast.graphics.RenderConstants; +import com.flaremicro.visualforecast.icons.IconProvider; + +public class BootupDisplay implements Display { + private Font font; + //private Font smallFont; + + private long ticks = 0; + private boolean forecastReady = false; + + private boolean failed = false; + + public BootupDisplay() { + font = FontManager.getInstance().getOrCreateFont(Font.TRUETYPE_FONT, this.getClass().getResource("/Star4000.ttf")); + //smallFont = FontManager.getInstance().getOrCreateFont(Font.TRUETYPE_FONT, this.getClass().getResource("/Star4000 Small.ttf")); + } + + @Override + public void tick(RenderPanel renderer, long ticks, int iconTicks) { + + this.ticks++; + if (this.ticks <= 92) + { + renderer.requestFullRepaint(); + } + if (forecastReady) + { + renderer.nextDisplay(); + } + } + + @Override + public void initDisplay(RenderPanel renderer, ForecastProvider provider, long ticks, int iconTicks) { + renderer.setCurrentForecast("Welcome to the"); + renderer.setCurrentTown("VisualForecast 1000"); + } + + @Override + public void drawDisplay(RenderPanel renderer, Graphics2D g2d, long ticks, int iconTicks) { + + } + + @Override + public void drawBoundLimitedDisplay(RenderPanel renderer, Graphics2D g2d, Rectangle bounds, long ticks, int iconTicks) { + if (this.ticks < 80) + { + g2d.setColor(Color.BLACK); + g2d.fillRect(0, 0, RenderConstants.W, RenderConstants.H); + for (int i = 0; i < Math.min(this.ticks, IconProvider.INDEXED_ICONS.length); i++) + { + int x = (i % 8) * 80; + int y = (i / 8) * 80; + IconProvider.drawIcon(g2d, IconProvider.INDEXED_ICONS[i], x, y, 80, iconTicks); + } + g2d.setFont(font.deriveFont(40F)); + DrawingUtil.drawOutlinedString(g2d, RenderConstants.W / 2 - g2d.getFontMetrics().stringWidth("VisualForecast 1000") / 2, RenderConstants.H / 2, "VisualForecast 1000", Color.WHITE, Color.BLACK, 2); + } + else if (this.ticks > 90) + { + if (!failed) + { + DrawingUtil.drawGradientRect(g2d, RenderConstants.SIDE_OFFSET + 80, RenderConstants.TOPBAR_HEIGHT + 90, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 160, (RenderConstants.TOPBAR_HEIGHT + 20), 10, new Color(0x220088), new Color(0x110055)); + g2d.setFont(font.deriveFont(26F)); + DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 60 + (RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 120) / 2 - (g2d.getFontMetrics().stringWidth("VisualForecast 1000") / 2), RenderConstants.TOPBAR_HEIGHT + 130, "VisualForecast 1000", Color.WHITE, Color.BLACK, 2); + DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 60 + (RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 120) / 2 - (g2d.getFontMetrics().stringWidth("Waiting for forecast data") / 2), RenderConstants.TOPBAR_HEIGHT + 160, "Waiting for forecast data", Color.WHITE, Color.BLACK, 2); + } + else + { + DrawingUtil.drawGradientRect(g2d, RenderConstants.SIDE_OFFSET + 80, RenderConstants.TOPBAR_HEIGHT + 90, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 160, (RenderConstants.TOPBAR_HEIGHT + 20), 10, new Color(0x220088), new Color(0x110055)); + g2d.setFont(font.deriveFont(26F)); + DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 60 + (RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 120) / 2 - (g2d.getFontMetrics().stringWidth("Forecast provider failure") / 2), RenderConstants.TOPBAR_HEIGHT + 130, "Forecast provider failure", Color.WHITE, Color.BLACK, 2); + DrawingUtil.drawOutlinedString(g2d, RenderConstants.SIDE_OFFSET + 60 + (RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 120) / 2 - (g2d.getFontMetrics().stringWidth("Provider failed to load") / 2), RenderConstants.TOPBAR_HEIGHT + 160, "Provider failed to load", Color.WHITE, Color.BLACK, 2); + } + } + } + + @Override + public void redrawRegionlost(RenderPanel renderer) { + + } + + @Override + public void notifyForecastProviderUpdate(RenderPanel renderer, ForecastProvider provider) { + if (provider == null) + { + this.failed = true; + renderer.requestFullRepaint(); + } + else + { + this.forecastReady = provider.isForecastReady(); + } + } +} diff --git a/src/com/flaremicro/flaretv/visualforecast/flavour/DayForecastFlavour.java b/src/com/flaremicro/visualforecast/displays/DayForecastDisplay.java similarity index 74% rename from src/com/flaremicro/flaretv/visualforecast/flavour/DayForecastFlavour.java rename to src/com/flaremicro/visualforecast/displays/DayForecastDisplay.java index d11eb35..92413e6 100644 --- a/src/com/flaremicro/flaretv/visualforecast/flavour/DayForecastFlavour.java +++ b/src/com/flaremicro/visualforecast/displays/DayForecastDisplay.java @@ -1,6 +1,6 @@ -package com.flaremicro.flaretv.visualforecast.flavour; +package com.flaremicro.visualforecast.displays; -import static com.flaremicro.flaretv.visualforecast.graphics.RenderConstants.MAINBAR_HEIGHT; +import static com.flaremicro.visualforecast.graphics.RenderConstants.MAINBAR_HEIGHT; import java.awt.BasicStroke; import java.awt.Color; @@ -14,17 +14,18 @@ import java.awt.image.BufferedImage; import java.util.Calendar; import java.util.Locale; -import com.flaremicro.flaretv.visualforecast.RenderPanel; -import com.flaremicro.flaretv.visualforecast.forecast.DayForecast; -import com.flaremicro.flaretv.visualforecast.forecast.ForecastDetails; -import com.flaremicro.flaretv.visualforecast.forecast.TownForecast; -import com.flaremicro.flaretv.visualforecast.forecast.ValueCheck; -import com.flaremicro.flaretv.visualforecast.graphics.DrawingUtil; -import com.flaremicro.flaretv.visualforecast.graphics.FontManager; -import com.flaremicro.flaretv.visualforecast.graphics.RenderConstants; -import com.flaremicro.flaretv.visualforecast.icons.IconProvider; +import com.flaremicro.visualforecast.RenderPanel; +import com.flaremicro.visualforecast.api.ForecastProvider; +import com.flaremicro.visualforecast.forecast.DayForecast; +import com.flaremicro.visualforecast.forecast.ForecastDetails; +import com.flaremicro.visualforecast.forecast.TownForecast; +import com.flaremicro.visualforecast.forecast.ValueCheck; +import com.flaremicro.visualforecast.graphics.DrawingUtil; +import com.flaremicro.visualforecast.graphics.FontManager; +import com.flaremicro.visualforecast.graphics.RenderConstants; +import com.flaremicro.visualforecast.icons.IconProvider; -public class DayForecastFlavour implements Flavour { +public class DayForecastDisplay implements Display { private int dayOffset = 0; private Font font; private Font smallFont; @@ -39,17 +40,17 @@ public class DayForecastFlavour implements Flavour { private int ticksBeforeChange = 200; private int animationTicks = -1; - public DayForecastFlavour() { + public DayForecastDisplay() { font = FontManager.getInstance().getOrCreateFont(Font.TRUETYPE_FONT, this.getClass().getResource("/Star4000.ttf")); smallFont = FontManager.getInstance().getOrCreateFont(Font.TRUETYPE_FONT, this.getClass().getResource("/Star4000 Small.ttf")); } @Override public void tick(RenderPanel renderer, long ticks, int iconTicks) { - if(animationTicks >= 0) + if (animationTicks >= 0) { animationTicks += 8; - if(animationTicks > RenderConstants.W - 60) + if (animationTicks > RenderConstants.W - 60) { animationTicks = -1; prevBound.flush(); @@ -64,16 +65,7 @@ public class DayForecastFlavour implements Flavour { ticksBeforeChange--; if (ticksBeforeChange < 0) { - animationTicks = 0; - if(prevBound != null) - prevBound.flush(); - if(mainBound != null) - mainBound.flush(); - prevBound = renderer.getGraphicsConfiguration().createCompatibleImage(526, MAINBAR_HEIGHT - 28, Transparency.BITMASK); - mainBound = renderer.getGraphicsConfiguration().createCompatibleImage(526, MAINBAR_HEIGHT - 28, Transparency.BITMASK); - mainBound.setAccelerationPriority(1); - prevBound.setAccelerationPriority(1); - + ticksBeforeChange = 200; dayOffset = dayOffset + 4; if (dayOffset >= 8) @@ -82,7 +74,8 @@ public class DayForecastFlavour implements Flavour { townIndex++; if (townIndex >= details.getTownForecast().length) { - renderer.nextFlavour(); + renderer.nextDisplay(); + return; } else { @@ -91,14 +84,24 @@ public class DayForecastFlavour implements Flavour { renderer.setCurrentTown(currentTown.getTownName()); } } - + + animationTicks = 0; + if (prevBound != null) + prevBound.flush(); + if (mainBound != null) + mainBound.flush(); + prevBound = renderer.getGraphicsConfiguration().createCompatibleImage(526, MAINBAR_HEIGHT - 28, Transparency.BITMASK); + mainBound = renderer.getGraphicsConfiguration().createCompatibleImage(526, MAINBAR_HEIGHT - 28, Transparency.BITMASK); + mainBound.setAccelerationPriority(1); + prevBound.setAccelerationPriority(1); + //Flicker workaround BufferedImage throwaway = new BufferedImage(1, 1, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g2d = throwaway.createGraphics(); - this.drawFlavour(renderer, g2d, ticks, iconTicks); + this.drawDisplay(renderer, g2d, ticks, iconTicks); g2d.dispose(); throwaway.flush(); - + renderer.loseRedrawRegion(); renderer.requestFullRepaint(); } @@ -106,8 +109,8 @@ public class DayForecastFlavour implements Flavour { } @Override - public void initFlavour(RenderPanel renderer, ForecastDetails details, long ticks, int iconTicks) { - this.details = details; + public void initDisplay(RenderPanel renderer, ForecastProvider forecastProvider, long ticks, int iconTicks) { + this.details = forecastProvider != null ? forecastProvider.getForecast() : null; renderer.setCurrentForecast("7 Day Forecast"); if (details == null || details.getTownForecast() == null || details.getTownForecast().length <= 0) this.details = null; @@ -129,7 +132,7 @@ public class DayForecastFlavour implements Flavour { } @Override - public void drawFlavour(RenderPanel renderer, Graphics2D g2d, long ticks, int iconTicks) { + public void drawDisplay(RenderPanel renderer, Graphics2D g2d, long ticks, int iconTicks) { if (details == null || currentTown == null || currentTown.getDayForecast() == null || currentTown.getDayForecast().length <= 0) { DrawingUtil.drawGradientRect(g2d, RenderConstants.SIDE_OFFSET + 80, RenderConstants.TOPBAR_HEIGHT + 90, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 160, (RenderConstants.TOPBAR_HEIGHT + 20), 10, new Color(0x220088), new Color(0x110055)); @@ -139,7 +142,7 @@ public class DayForecastFlavour implements Flavour { } else { - if(animationTicks < 0) + if (animationTicks < 0) { drawTownForecast(g2d, currentTown, dayOffset); } @@ -147,38 +150,39 @@ public class DayForecastFlavour implements Flavour { { Graphics2D gimg = prevBound.createGraphics(); Graphics2D gimg2 = mainBound.createGraphics(); - gimg.translate(-RenderConstants.SIDE_OFFSET+1, -RenderConstants.TOPBAR_HEIGHT - 14); - gimg2.translate(-RenderConstants.SIDE_OFFSET+1, -RenderConstants.TOPBAR_HEIGHT - 14); + gimg.translate(-RenderConstants.SIDE_OFFSET + 1, -RenderConstants.TOPBAR_HEIGHT - 14); + gimg2.translate(-RenderConstants.SIDE_OFFSET + 1, -RenderConstants.TOPBAR_HEIGHT - 14); gimg.setStroke(new BasicStroke(2)); gimg2.setStroke(new BasicStroke(2)); - if(dayOffset == 0) + if (dayOffset == 0) { drawTownForecast(gimg, previousTown, dayOffset + 4); drawTownForecast(gimg2, currentTown, dayOffset); - } else { + } + else + { drawTownForecast(gimg, currentTown, dayOffset - 4); drawTownForecast(gimg2, currentTown, dayOffset); } gimg.dispose(); gimg2.dispose(); - g2d.setClip(animationTicks + RenderConstants.SIDE_OFFSET, RenderConstants.TOPBAR_HEIGHT+14, 526-animationTicks, MAINBAR_HEIGHT - 28); - g2d.drawImage(prevBound, RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); - g2d.setClip(0, RenderConstants.TOPBAR_HEIGHT+15, animationTicks, MAINBAR_HEIGHT - 28); - g2d.drawImage(mainBound, RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); + g2d.setClip(animationTicks + RenderConstants.SIDE_OFFSET, RenderConstants.TOPBAR_HEIGHT + 14, 526 - animationTicks, MAINBAR_HEIGHT - 28); + g2d.drawImage(prevBound, RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); + g2d.setClip(0, RenderConstants.TOPBAR_HEIGHT + 15, animationTicks, MAINBAR_HEIGHT - 28); + g2d.drawImage(mainBound, RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); g2d.setClip(null); } } - if(animationTicks < 0) + if (animationTicks < 0) { - mainBound = renderer.getSnapshot().getSubimage(RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT + 14, 526, MAINBAR_HEIGHT - 28); + mainBound = renderer.getSnapshot().getSubimage(RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, 526, MAINBAR_HEIGHT - 28); mainBound.setAccelerationPriority(1); } } - - private void drawTownForecast(Graphics2D g2d, TownForecast townForecast, int dayOffset) - { + + private void drawTownForecast(Graphics2D g2d, TownForecast townForecast, int dayOffset) { for (int i = 0; i < Math.min(4, townForecast.getDayForecast().length - dayOffset); i++) { @@ -233,38 +237,38 @@ public class DayForecastFlavour implements Flavour { } @Override - public void drawBoundLimitedFlavour(RenderPanel renderer, Graphics2D g2d, Rectangle bounds, long ticks, int iconTicks) { + public void drawBoundLimitedDisplay(RenderPanel renderer, Graphics2D g2d, Rectangle bounds, long ticks, int iconTicks) { if (details != null && currentTown != null && currentTown.getDayForecast() != null && currentTown.getDayForecast().length > 0) { - if(animationTicks < 0) + if (animationTicks < 0) { - g2d.drawImage(mainBound, RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); + g2d.drawImage(mainBound, RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); drawIcons(g2d, currentTown, dayOffset, iconTicks); } else { - g2d.setClip(animationTicks + RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT+14, 526, MAINBAR_HEIGHT - 28); - g2d.drawImage(prevBound, RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); - if(dayOffset == 0) + g2d.setClip(animationTicks + RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, 526, MAINBAR_HEIGHT - 28); + g2d.drawImage(prevBound, RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); + if (dayOffset == 0) { drawIcons(g2d, previousTown, dayOffset + 4, iconTicks); - g2d.setClip(0, RenderConstants.TOPBAR_HEIGHT+14, animationTicks, MAINBAR_HEIGHT - 28); - g2d.drawImage(mainBound, RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); + g2d.setClip(0, RenderConstants.TOPBAR_HEIGHT + 14, animationTicks, MAINBAR_HEIGHT - 28); + g2d.drawImage(mainBound, RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); drawIcons(g2d, currentTown, dayOffset, iconTicks); } else - { + { drawIcons(g2d, currentTown, dayOffset - 4, iconTicks); - g2d.setClip(0, RenderConstants.TOPBAR_HEIGHT+14, animationTicks, MAINBAR_HEIGHT - 28); - g2d.drawImage(mainBound, RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); + g2d.setClip(0, RenderConstants.TOPBAR_HEIGHT + 14, animationTicks, MAINBAR_HEIGHT - 28); + g2d.drawImage(mainBound, RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); drawIcons(g2d, currentTown, dayOffset, iconTicks); } g2d.setClip(null); } } } - - private void drawIcons(Graphics2D g2d, TownForecast currentTown, int dayOffset, int iconTicks){ + + private void drawIcons(Graphics2D g2d, TownForecast currentTown, int dayOffset, int iconTicks) { for (int i = 0; i < Math.min(4, currentTown.getDayForecast().length - dayOffset); i++) { @@ -275,9 +279,13 @@ public class DayForecastFlavour implements Flavour { @Override public void redrawRegionlost(RenderPanel renderer) { - if(animationTicks >= 0) + if (animationTicks >= 0) renderer.addRedrawBound(0, RenderConstants.TOPBAR_HEIGHT, RenderConstants.W, RenderConstants.MAINBAR_HEIGHT); - else - renderer.addRedrawBound(RenderConstants.SIDE_OFFSET + 24, RenderConstants.TOPBAR_HEIGHT + 60, 604, 84); + else renderer.addRedrawBound(RenderConstants.SIDE_OFFSET + 24, RenderConstants.TOPBAR_HEIGHT + 60, 604, 84); + } + + @Override + public void notifyForecastProviderUpdate(RenderPanel renderer, ForecastProvider forecastProvider) { + } } diff --git a/src/com/flaremicro/flaretv/visualforecast/flavour/DayForecastFlavourOldAnimation.java b/src/com/flaremicro/visualforecast/displays/DayForecastDisplayOldAnimation.java similarity index 81% rename from src/com/flaremicro/flaretv/visualforecast/flavour/DayForecastFlavourOldAnimation.java rename to src/com/flaremicro/visualforecast/displays/DayForecastDisplayOldAnimation.java index 2013a2a..ab88824 100644 --- a/src/com/flaremicro/flaretv/visualforecast/flavour/DayForecastFlavourOldAnimation.java +++ b/src/com/flaremicro/visualforecast/displays/DayForecastDisplayOldAnimation.java @@ -1,6 +1,6 @@ -package com.flaremicro.flaretv.visualforecast.flavour; +package com.flaremicro.visualforecast.displays; -import static com.flaremicro.flaretv.visualforecast.graphics.RenderConstants.MAINBAR_HEIGHT; +import static com.flaremicro.visualforecast.graphics.RenderConstants.MAINBAR_HEIGHT; import java.awt.BasicStroke; import java.awt.Color; @@ -14,17 +14,18 @@ import java.awt.image.BufferedImage; import java.util.Calendar; import java.util.Locale; -import com.flaremicro.flaretv.visualforecast.RenderPanel; -import com.flaremicro.flaretv.visualforecast.forecast.DayForecast; -import com.flaremicro.flaretv.visualforecast.forecast.ForecastDetails; -import com.flaremicro.flaretv.visualforecast.forecast.TownForecast; -import com.flaremicro.flaretv.visualforecast.forecast.ValueCheck; -import com.flaremicro.flaretv.visualforecast.graphics.DrawingUtil; -import com.flaremicro.flaretv.visualforecast.graphics.FontManager; -import com.flaremicro.flaretv.visualforecast.graphics.RenderConstants; -import com.flaremicro.flaretv.visualforecast.icons.IconProvider; +import com.flaremicro.visualforecast.RenderPanel; +import com.flaremicro.visualforecast.api.ForecastProvider; +import com.flaremicro.visualforecast.forecast.DayForecast; +import com.flaremicro.visualforecast.forecast.ForecastDetails; +import com.flaremicro.visualforecast.forecast.TownForecast; +import com.flaremicro.visualforecast.forecast.ValueCheck; +import com.flaremicro.visualforecast.graphics.DrawingUtil; +import com.flaremicro.visualforecast.graphics.FontManager; +import com.flaremicro.visualforecast.graphics.RenderConstants; +import com.flaremicro.visualforecast.icons.IconProvider; -public class DayForecastFlavourOldAnimation implements Flavour { +public class DayForecastDisplayOldAnimation implements Display { private int dayOffset = 0; private Font font; private Font smallFont; @@ -38,17 +39,17 @@ public class DayForecastFlavourOldAnimation implements Flavour { private int ticksBeforeChange = 200; private int animationTicks = -1; - public DayForecastFlavourOldAnimation() { + public DayForecastDisplayOldAnimation() { font = FontManager.getInstance().getOrCreateFont(Font.TRUETYPE_FONT, this.getClass().getResource("/Star4000.ttf")); smallFont = FontManager.getInstance().getOrCreateFont(Font.TRUETYPE_FONT, this.getClass().getResource("/Star4000 Small.ttf")); } @Override public void tick(RenderPanel renderer, long ticks, int iconTicks) { - if(animationTicks >= 0) + if (animationTicks >= 0) { animationTicks += 8; - if(animationTicks > RenderConstants.W - 60) + if (animationTicks > RenderConstants.W - 60) { animationTicks = -1; renderer.requestFullRepaint(); @@ -62,7 +63,7 @@ public class DayForecastFlavourOldAnimation implements Flavour { if (ticksBeforeChange < 0) { animationTicks = 0; - lastBound = renderer.getGraphicsConfiguration().createCompatibleImage(526*2+RenderConstants.SIDE_OFFSET, MAINBAR_HEIGHT - 28, Transparency.BITMASK); + lastBound = renderer.getGraphicsConfiguration().createCompatibleImage(526 * 2 + RenderConstants.SIDE_OFFSET, MAINBAR_HEIGHT - 28, Transparency.BITMASK); lastBound.setAccelerationPriority(1); ticksBeforeChange = 200; dayOffset = dayOffset + 4; @@ -72,7 +73,7 @@ public class DayForecastFlavourOldAnimation implements Flavour { townIndex++; if (townIndex >= details.getTownForecast().length) { - renderer.nextFlavour(); + renderer.nextDisplay(); } else { @@ -88,8 +89,8 @@ public class DayForecastFlavourOldAnimation implements Flavour { } @Override - public void initFlavour(RenderPanel renderer, ForecastDetails details, long ticks, int iconTicks) { - this.details = details; + public void initDisplay(RenderPanel renderer, ForecastProvider forecastProvider, long ticks, int iconTicks) { + this.details = forecastProvider != null ? forecastProvider.getForecast() : null; renderer.setCurrentForecast("7 Day Forecast"); if (details == null || details.getTownForecast() == null || details.getTownForecast().length <= 0) this.details = null; @@ -111,7 +112,7 @@ public class DayForecastFlavourOldAnimation implements Flavour { } @Override - public void drawFlavour(RenderPanel renderer, Graphics2D g2d, long ticks, int iconTicks) { + public void drawDisplay(RenderPanel renderer, Graphics2D g2d, long ticks, int iconTicks) { if (details == null || currentTown == null || currentTown.getDayForecast() == null || currentTown.getDayForecast().length <= 0) { DrawingUtil.drawGradientRect(g2d, RenderConstants.SIDE_OFFSET + 80, RenderConstants.TOPBAR_HEIGHT + 90, RenderConstants.W - RenderConstants.SIDE_OFFSET * 2 - 160, (RenderConstants.TOPBAR_HEIGHT + 20), 10, new Color(0x220088), new Color(0x110055)); @@ -121,22 +122,24 @@ public class DayForecastFlavourOldAnimation implements Flavour { } else { - if(animationTicks < 0) + if (animationTicks < 0) { drawTownForecast(g2d, currentTown, dayOffset); } else { Graphics2D gimg = lastBound.createGraphics(); - gimg.translate(-RenderConstants.SIDE_OFFSET+1, -RenderConstants.TOPBAR_HEIGHT - 14); + gimg.translate(-RenderConstants.SIDE_OFFSET + 1, -RenderConstants.TOPBAR_HEIGHT - 14); gimg.setStroke(new BasicStroke(2)); - if(dayOffset == 0) + if (dayOffset == 0) { drawTownForecast(gimg, previousTown, dayOffset + 4); gimg.translate(RenderConstants.W - (RenderConstants.SIDE_OFFSET), 0); drawTownForecast(gimg, currentTown, dayOffset); gimg.translate(RenderConstants.SIDE_OFFSET - RenderConstants.W, 0); - } else { + } + else + { drawTownForecast(gimg, currentTown, dayOffset - 4); gimg.translate(RenderConstants.W - (RenderConstants.SIDE_OFFSET), 0); drawTownForecast(gimg, currentTown, dayOffset); @@ -149,15 +152,14 @@ public class DayForecastFlavourOldAnimation implements Flavour { g2d.translate(animationTicks, 0); } } - if(animationTicks < 0) + if (animationTicks < 0) { - lastBound = renderer.getSnapshot().getSubimage(RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT + 14, 526, MAINBAR_HEIGHT - 28); + lastBound = renderer.getSnapshot().getSubimage(RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, 526, MAINBAR_HEIGHT - 28); lastBound.setAccelerationPriority(1); } } - - private void drawTownForecast(Graphics2D g2d, TownForecast townForecast, int dayOffset) - { + + private void drawTownForecast(Graphics2D g2d, TownForecast townForecast, int dayOffset) { for (int i = 0; i < Math.min(4, townForecast.getDayForecast().length - dayOffset); i++) { @@ -212,19 +214,19 @@ public class DayForecastFlavourOldAnimation implements Flavour { } @Override - public void drawBoundLimitedFlavour(RenderPanel renderer, Graphics2D g2d, Rectangle bounds, long ticks, int iconTicks) { + public void drawBoundLimitedDisplay(RenderPanel renderer, Graphics2D g2d, Rectangle bounds, long ticks, int iconTicks) { if (details != null && currentTown != null && currentTown.getDayForecast() != null && currentTown.getDayForecast().length > 0) { - if(animationTicks < 0) + if (animationTicks < 0) { - g2d.drawImage(lastBound, RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); + g2d.drawImage(lastBound, RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); drawIcons(g2d, currentTown, dayOffset, iconTicks); } else { g2d.translate(-animationTicks, 0); - g2d.drawImage(lastBound, RenderConstants.SIDE_OFFSET-1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); - if(dayOffset == 0) + g2d.drawImage(lastBound, RenderConstants.SIDE_OFFSET - 1, RenderConstants.TOPBAR_HEIGHT + 14, renderer); + if (dayOffset == 0) { drawIcons(g2d, previousTown, dayOffset + 4, iconTicks); @@ -232,7 +234,7 @@ public class DayForecastFlavourOldAnimation implements Flavour { drawIcons(g2d, currentTown, dayOffset, iconTicks); } else - { + { drawIcons(g2d, currentTown, dayOffset - 4, iconTicks); g2d.translate(RenderConstants.W - (RenderConstants.SIDE_OFFSET), 0); drawIcons(g2d, currentTown, dayOffset, iconTicks); @@ -241,8 +243,8 @@ public class DayForecastFlavourOldAnimation implements Flavour { } } } - - private void drawIcons(Graphics2D g2d, TownForecast currentTown, int dayOffset, int iconTicks){ + + private void drawIcons(Graphics2D g2d, TownForecast currentTown, int dayOffset, int iconTicks) { for (int i = 0; i < Math.min(4, currentTown.getDayForecast().length - dayOffset); i++) { @@ -253,9 +255,12 @@ public class DayForecastFlavourOldAnimation implements Flavour { @Override public void redrawRegionlost(RenderPanel renderer) { - if(animationTicks >= 0) + if (animationTicks >= 0) renderer.addRedrawBound(0, RenderConstants.TOPBAR_HEIGHT, RenderConstants.W, RenderConstants.MAINBAR_HEIGHT); - else - renderer.addRedrawBound(RenderConstants.SIDE_OFFSET + 24, RenderConstants.TOPBAR_HEIGHT + 60, 604, 84); + else renderer.addRedrawBound(RenderConstants.SIDE_OFFSET + 24, RenderConstants.TOPBAR_HEIGHT + 60, 604, 84); + } + + @Override + public void notifyForecastProviderUpdate(RenderPanel renderer, ForecastProvider forecastProvider) { } } diff --git a/src/com/flaremicro/visualforecast/displays/Display.java b/src/com/flaremicro/visualforecast/displays/Display.java new file mode 100644 index 0000000..df8eb0a --- /dev/null +++ b/src/com/flaremicro/visualforecast/displays/Display.java @@ -0,0 +1,16 @@ +package com.flaremicro.visualforecast.displays; + +import java.awt.Graphics2D; +import java.awt.Rectangle; + +import com.flaremicro.visualforecast.RenderPanel; +import com.flaremicro.visualforecast.api.ForecastProvider; + +public interface Display { + public void tick(RenderPanel renderer, long ticks, int iconTicks); + public void initDisplay(RenderPanel renderer, ForecastProvider forecastProvider, long ticks, int iconTicks); + public void drawDisplay(RenderPanel renderer, Graphics2D g, long ticks, int iconTicks); + public void drawBoundLimitedDisplay(RenderPanel renderer, Graphics2D g, Rectangle bounds, long ticks, int iconTicks); + public void redrawRegionlost(RenderPanel renderer); + public void notifyForecastProviderUpdate(RenderPanel renderPanel, ForecastProvider forecastProvider); +} diff --git a/src/com/flaremicro/flaretv/visualforecast/flavour/TextFlavour.java b/src/com/flaremicro/visualforecast/displays/TextDisplay.java similarity index 55% rename from src/com/flaremicro/flaretv/visualforecast/flavour/TextFlavour.java rename to src/com/flaremicro/visualforecast/displays/TextDisplay.java index 2c0e82c..56832c6 100644 --- a/src/com/flaremicro/flaretv/visualforecast/flavour/TextFlavour.java +++ b/src/com/flaremicro/visualforecast/displays/TextDisplay.java @@ -1,22 +1,21 @@ -package com.flaremicro.flaretv.visualforecast.flavour; +package com.flaremicro.visualforecast.displays; import java.awt.Graphics2D; import java.awt.Rectangle; -import com.flaremicro.flaretv.visualforecast.RenderPanel; -import com.flaremicro.flaretv.visualforecast.forecast.ForecastDetails; -import com.flaremicro.flaretv.visualforecast.graphics.DrawingUtil; +import com.flaremicro.visualforecast.RenderPanel; +import com.flaremicro.visualforecast.api.ForecastProvider; +import com.flaremicro.visualforecast.graphics.DrawingUtil; -import static com.flaremicro.flaretv.visualforecast.graphics.RenderConstants.*; +import static com.flaremicro.visualforecast.graphics.RenderConstants.*; -public class TextFlavour implements Flavour{ - - public TextFlavour(String title, String scrollText) - { +public class TextDisplay implements Display { + + public TextDisplay(String title, String scrollText) { /* int w2 = g2d.getFontMetrics().stringWidth("EXTREME WEATHER ADVISORY"); drawOutlinedString(g2d, (W >> 1) - (w2 >> 1), TOPBAR_HEIGHT + 48, "EXTREME WEATHER ADVISORY", Color.RED, Color.BLACK, 2); - + g2d.setFont(font.deriveFont(30F)); for (int i = 0; i < testString.length; i++) { @@ -27,35 +26,30 @@ public class TextFlavour implements Flavour{ @Override public void tick(RenderPanel renderer, long ticks, int iconTicks) { - // TODO Auto-generated method stub - } @Override - public void initFlavour(RenderPanel renderer, ForecastDetails details, long ticks, int iconTicks) { - // TODO Auto-generated method stub - + public void initDisplay(RenderPanel renderer, ForecastProvider forecastProvider, long ticks, int iconTicks) { } @Override - public void drawFlavour(RenderPanel renderer, Graphics2D g2d, long ticks, int iconTicks) { + public void drawDisplay(RenderPanel renderer, Graphics2D g2d, long ticks, int iconTicks) { DrawingUtil.drawGradientRect(g2d, 60, TOPBAR_HEIGHT, W - 120, MAINBAR_HEIGHT, 20, BG_BLUE.brighter(), BG_BLUE.darker()); g2d.setColor(BG_BLUE.brighter()); g2d.drawRect(60 + STROKE_OFFSET, TOPBAR_HEIGHT + STROKE_OFFSET, W - 120 - STROKE_WIDTH, MAINBAR_HEIGHT - STROKE_WIDTH); - + } @Override - public void drawBoundLimitedFlavour(RenderPanel renderer, Graphics2D g2d, Rectangle bounds, long ticks, int iconTicks) { - // TODO Auto-generated method stub - + public void drawBoundLimitedDisplay(RenderPanel renderer, Graphics2D g2d, Rectangle bounds, long ticks, int iconTicks) { } @Override public void redrawRegionlost(RenderPanel renderer) { - // TODO Auto-generated method stub - } - + @Override + public void notifyForecastProviderUpdate(RenderPanel renderer, ForecastProvider forecastProvider) { + } + } diff --git a/src/com/flaremicro/flaretv/visualforecast/forecast/DayForecast.java b/src/com/flaremicro/visualforecast/forecast/DayForecast.java similarity index 64% rename from src/com/flaremicro/flaretv/visualforecast/forecast/DayForecast.java rename to src/com/flaremicro/visualforecast/forecast/DayForecast.java index 281ac55..5a68f71 100644 --- a/src/com/flaremicro/flaretv/visualforecast/forecast/DayForecast.java +++ b/src/com/flaremicro/visualforecast/forecast/DayForecast.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast.forecast; +package com.flaremicro.visualforecast.forecast; public class DayForecast { public byte hiTemp; @@ -16,4 +16,13 @@ public class DayForecast { this.weatherLine2 = weatherLine2; this.percipPercent = percipPercent; } + + public DayForecast() { + this.hiTemp = ValueCheck.NO_DATA_BYTE; + this.loTemp = ValueCheck.NO_DATA_BYTE; + this.iconId = 0; + this.weatherLine1 = null; + this.weatherLine2 = null; + this.percipPercent = ValueCheck.NO_DATA_FLOAT; + } } diff --git a/src/com/flaremicro/flaretv/visualforecast/forecast/ForecastDetails.java b/src/com/flaremicro/visualforecast/forecast/ForecastDetails.java similarity index 83% rename from src/com/flaremicro/flaretv/visualforecast/forecast/ForecastDetails.java rename to src/com/flaremicro/visualforecast/forecast/ForecastDetails.java index 37eefb8..ac4cb68 100644 --- a/src/com/flaremicro/flaretv/visualforecast/forecast/ForecastDetails.java +++ b/src/com/flaremicro/visualforecast/forecast/ForecastDetails.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast.forecast; +package com.flaremicro.visualforecast.forecast; public class ForecastDetails { //Perhaps could be hashmap? diff --git a/src/com/flaremicro/flaretv/visualforecast/forecast/TownForecast.java b/src/com/flaremicro/visualforecast/forecast/TownForecast.java similarity index 86% rename from src/com/flaremicro/flaretv/visualforecast/forecast/TownForecast.java rename to src/com/flaremicro/visualforecast/forecast/TownForecast.java index 693716a..553ff45 100644 --- a/src/com/flaremicro/flaretv/visualforecast/forecast/TownForecast.java +++ b/src/com/flaremicro/visualforecast/forecast/TownForecast.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast.forecast; +package com.flaremicro.visualforecast.forecast; public class TownForecast { public TownForecast(String townName, DayForecast[] dayForecast){ diff --git a/src/com/flaremicro/flaretv/visualforecast/forecast/ValueCheck.java b/src/com/flaremicro/visualforecast/forecast/ValueCheck.java similarity index 95% rename from src/com/flaremicro/flaretv/visualforecast/forecast/ValueCheck.java rename to src/com/flaremicro/visualforecast/forecast/ValueCheck.java index f718147..418c889 100644 --- a/src/com/flaremicro/flaretv/visualforecast/forecast/ValueCheck.java +++ b/src/com/flaremicro/visualforecast/forecast/ValueCheck.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast.forecast; +package com.flaremicro.visualforecast.forecast; public class ValueCheck { //Utility for no data diff --git a/src/com/flaremicro/flaretv/visualforecast/graphics/DrawingUtil.java b/src/com/flaremicro/visualforecast/graphics/DrawingUtil.java similarity index 98% rename from src/com/flaremicro/flaretv/visualforecast/graphics/DrawingUtil.java rename to src/com/flaremicro/visualforecast/graphics/DrawingUtil.java index 86a08a5..7729f8a 100644 --- a/src/com/flaremicro/flaretv/visualforecast/graphics/DrawingUtil.java +++ b/src/com/flaremicro/visualforecast/graphics/DrawingUtil.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast.graphics; +package com.flaremicro.visualforecast.graphics; import java.awt.Color; import java.awt.GradientPaint; diff --git a/src/com/flaremicro/flaretv/visualforecast/graphics/FontManager.java b/src/com/flaremicro/visualforecast/graphics/FontManager.java similarity index 97% rename from src/com/flaremicro/flaretv/visualforecast/graphics/FontManager.java rename to src/com/flaremicro/visualforecast/graphics/FontManager.java index 59ad676..65ad88d 100644 --- a/src/com/flaremicro/flaretv/visualforecast/graphics/FontManager.java +++ b/src/com/flaremicro/visualforecast/graphics/FontManager.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast.graphics; +package com.flaremicro.visualforecast.graphics; import java.awt.Font; import java.awt.FontFormatException; diff --git a/src/com/flaremicro/flaretv/visualforecast/graphics/RenderConstants.java b/src/com/flaremicro/visualforecast/graphics/RenderConstants.java similarity index 95% rename from src/com/flaremicro/flaretv/visualforecast/graphics/RenderConstants.java rename to src/com/flaremicro/visualforecast/graphics/RenderConstants.java index 20be0be..4e033d8 100644 --- a/src/com/flaremicro/flaretv/visualforecast/graphics/RenderConstants.java +++ b/src/com/flaremicro/visualforecast/graphics/RenderConstants.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast.graphics; +package com.flaremicro.visualforecast.graphics; import java.awt.Color; import java.text.DateFormat; diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/Icon.java b/src/com/flaremicro/visualforecast/icons/Icon.java similarity index 82% rename from src/com/flaremicro/flaretv/visualforecast/icons/Icon.java rename to src/com/flaremicro/visualforecast/icons/Icon.java index 71d54f3..ae6e027 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/Icon.java +++ b/src/com/flaremicro/visualforecast/icons/Icon.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast.icons; +package com.flaremicro.visualforecast.icons; import java.awt.Graphics2D; diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/IconProvider.java b/src/com/flaremicro/visualforecast/icons/IconProvider.java similarity index 74% rename from src/com/flaremicro/flaretv/visualforecast/icons/IconProvider.java rename to src/com/flaremicro/visualforecast/icons/IconProvider.java index 6f0897d..e7a66bb 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/IconProvider.java +++ b/src/com/flaremicro/visualforecast/icons/IconProvider.java @@ -1,24 +1,24 @@ -package com.flaremicro.flaretv.visualforecast.icons; +package com.flaremicro.visualforecast.icons; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; -import com.flaremicro.flaretv.visualforecast.icons.impl.BlizzardIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.ButterIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.CloudIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.FogIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.IceCubeIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.InvalidIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.LightningIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.LightningOverlay; -import com.flaremicro.flaretv.visualforecast.icons.impl.LightningStormIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.PartlyCloudyIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.RainIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.RainSnowIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.SmallCloudIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.SnowIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.SnowflakeIcon; -import com.flaremicro.flaretv.visualforecast.icons.impl.SunIcon; +import com.flaremicro.visualforecast.icons.impl.BlizzardIcon; +import com.flaremicro.visualforecast.icons.impl.ButterIcon; +import com.flaremicro.visualforecast.icons.impl.CloudIcon; +import com.flaremicro.visualforecast.icons.impl.FogIcon; +import com.flaremicro.visualforecast.icons.impl.IceCubeIcon; +import com.flaremicro.visualforecast.icons.impl.InvalidIcon; +import com.flaremicro.visualforecast.icons.impl.LightningIcon; +import com.flaremicro.visualforecast.icons.impl.LightningOverlay; +import com.flaremicro.visualforecast.icons.impl.LightningStormIcon; +import com.flaremicro.visualforecast.icons.impl.PartlyCloudyIcon; +import com.flaremicro.visualforecast.icons.impl.RainIcon; +import com.flaremicro.visualforecast.icons.impl.RainSnowIcon; +import com.flaremicro.visualforecast.icons.impl.SmallCloudIcon; +import com.flaremicro.visualforecast.icons.impl.SnowIcon; +import com.flaremicro.visualforecast.icons.impl.SnowflakeIcon; +import com.flaremicro.visualforecast.icons.impl.SunIcon; public class IconProvider { @@ -51,6 +51,8 @@ public class IconProvider { public static final Icon HAIL = registerIcon(new BlizzardIcon(24, CLOUD, ICE_CUBE)); public static final Icon BUTTER = registerIcon(new ButterIcon(25)); public static final Icon BUTTER_RAIN = registerIcon(new BlizzardIcon(26, CLOUD, BUTTER)); + public static final Icon RAIN_STORM = registerIcon(new LightningOverlay(27, SMALL_CLOUD, LIGHTNING_BOLT, RAIN_HEAVY)); + //public static final Icon INVALID_RAIN = registerIcon(new LightningOverlay(27, SUN, BUTTER, new BlizzardIcon(-1, LIGHTNING_BOLT, INVALID))); private static Icon registerIcon(Icon icon) diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/BlizzardIcon.java b/src/com/flaremicro/visualforecast/icons/impl/BlizzardIcon.java similarity index 91% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/BlizzardIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/BlizzardIcon.java index bbdf4b6..f6516e6 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/BlizzardIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/BlizzardIcon.java @@ -1,9 +1,9 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class BlizzardIcon extends Icon { private final Icon cloudIcon; diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/ButterIcon.java b/src/com/flaremicro/visualforecast/icons/impl/ButterIcon.java similarity index 96% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/ButterIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/ButterIcon.java index 98ede5f..8de7abc 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/ButterIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/ButterIcon.java @@ -1,11 +1,11 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Path2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class ButterIcon extends Icon { diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/CloudIcon.java b/src/com/flaremicro/visualforecast/icons/impl/CloudIcon.java similarity index 96% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/CloudIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/CloudIcon.java index 658cdfa..9c07245 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/CloudIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/CloudIcon.java @@ -1,11 +1,11 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Ellipse2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class CloudIcon extends Icon { private final Ellipse2D.Float[] cloudCircles = new Ellipse2D.Float[]{ diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/FogIcon.java b/src/com/flaremicro/visualforecast/icons/impl/FogIcon.java similarity index 93% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/FogIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/FogIcon.java index 108b1b0..815725d 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/FogIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/FogIcon.java @@ -1,11 +1,11 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Path2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class FogIcon extends Icon { private final Icon cloudIcon; diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/IceCubeIcon.java b/src/com/flaremicro/visualforecast/icons/impl/IceCubeIcon.java similarity index 96% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/IceCubeIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/IceCubeIcon.java index 9e8bc92..950fb5d 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/IceCubeIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/IceCubeIcon.java @@ -1,11 +1,11 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Path2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class IceCubeIcon extends Icon { diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/InvalidIcon.java b/src/com/flaremicro/visualforecast/icons/impl/InvalidIcon.java similarity index 74% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/InvalidIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/InvalidIcon.java index ec502e7..d089a0f 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/InvalidIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/InvalidIcon.java @@ -1,11 +1,12 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; -import com.flaremicro.flaretv.visualforecast.graphics.DrawingUtil; -import com.flaremicro.flaretv.visualforecast.graphics.FontManager; -import com.flaremicro.flaretv.visualforecast.icons.Icon; + +import com.flaremicro.visualforecast.graphics.DrawingUtil; +import com.flaremicro.visualforecast.graphics.FontManager; +import com.flaremicro.visualforecast.icons.Icon; public class InvalidIcon extends Icon { diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningCloudIcon.java b/src/com/flaremicro/visualforecast/icons/impl/LightningCloudIcon.java similarity index 87% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningCloudIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/LightningCloudIcon.java index 5d1834b..1f94137 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningCloudIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/LightningCloudIcon.java @@ -1,7 +1,8 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.Graphics2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; + +import com.flaremicro.visualforecast.icons.Icon; public class LightningCloudIcon extends Icon { diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningIcon.java b/src/com/flaremicro/visualforecast/icons/impl/LightningIcon.java similarity index 94% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/LightningIcon.java index aaec729..e496a3d 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/LightningIcon.java @@ -1,11 +1,11 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Path2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class LightningIcon extends Icon { Path2D.Float boltPath = new Path2D.Float(); diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningOverlay.java b/src/com/flaremicro/visualforecast/icons/impl/LightningOverlay.java similarity index 89% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningOverlay.java rename to src/com/flaremicro/visualforecast/icons/impl/LightningOverlay.java index 03766c2..71c589e 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningOverlay.java +++ b/src/com/flaremicro/visualforecast/icons/impl/LightningOverlay.java @@ -1,7 +1,8 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.Graphics2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; + +import com.flaremicro.visualforecast.icons.Icon; public class LightningOverlay extends Icon { diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningStormIcon.java b/src/com/flaremicro/visualforecast/icons/impl/LightningStormIcon.java similarity index 87% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningStormIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/LightningStormIcon.java index 6f3a8ae..1f3fc29 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/LightningStormIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/LightningStormIcon.java @@ -1,8 +1,9 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Graphics2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; + +import com.flaremicro.visualforecast.icons.Icon; public class LightningStormIcon extends Icon { private final Icon boltIcon; diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/PartlyCloudyIcon.java b/src/com/flaremicro/visualforecast/icons/impl/PartlyCloudyIcon.java similarity index 85% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/PartlyCloudyIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/PartlyCloudyIcon.java index d0c5e9c..9621d62 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/PartlyCloudyIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/PartlyCloudyIcon.java @@ -1,8 +1,8 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.Graphics2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class PartlyCloudyIcon extends Icon { private Icon cloud; diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/RainIcon.java b/src/com/flaremicro/visualforecast/icons/impl/RainIcon.java similarity index 94% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/RainIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/RainIcon.java index ec8b7c5..a8a12d0 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/RainIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/RainIcon.java @@ -1,11 +1,11 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Path2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class RainIcon extends Icon { private final int rainCount; diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/RainSnowIcon.java b/src/com/flaremicro/visualforecast/icons/impl/RainSnowIcon.java similarity index 90% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/RainSnowIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/RainSnowIcon.java index 5e7a1bd..e83d49e 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/RainSnowIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/RainSnowIcon.java @@ -1,7 +1,8 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.Graphics2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; + +import com.flaremicro.visualforecast.icons.Icon; public class RainSnowIcon extends Icon { private final Icon rainIcon; diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/SleetIcon.java b/src/com/flaremicro/visualforecast/icons/impl/SleetIcon.java similarity index 96% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/SleetIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/SleetIcon.java index bc9fbac..3337f47 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/SleetIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/SleetIcon.java @@ -1,11 +1,11 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Path2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class SleetIcon extends Icon { diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/SmallCloudIcon.java b/src/com/flaremicro/visualforecast/icons/impl/SmallCloudIcon.java similarity index 94% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/SmallCloudIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/SmallCloudIcon.java index 39a5dff..8c8c04c 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/SmallCloudIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/SmallCloudIcon.java @@ -1,10 +1,11 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Ellipse2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; + +import com.flaremicro.visualforecast.icons.Icon; public class SmallCloudIcon extends Icon { public SmallCloudIcon(int id) { diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/SnowIcon.java b/src/com/flaremicro/visualforecast/icons/impl/SnowIcon.java similarity index 90% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/SnowIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/SnowIcon.java index 58d1c26..49c796a 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/SnowIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/SnowIcon.java @@ -1,9 +1,9 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class SnowIcon extends Icon { private final Icon cloudIcon; diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/SnowflakeIcon.java b/src/com/flaremicro/visualforecast/icons/impl/SnowflakeIcon.java similarity index 96% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/SnowflakeIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/SnowflakeIcon.java index 6a971ec..28780af 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/SnowflakeIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/SnowflakeIcon.java @@ -1,11 +1,11 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Path2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class SnowflakeIcon extends Icon { Path2D.Float flakePath = new Path2D.Float(); diff --git a/src/com/flaremicro/flaretv/visualforecast/icons/impl/SunIcon.java b/src/com/flaremicro/visualforecast/icons/impl/SunIcon.java similarity index 95% rename from src/com/flaremicro/flaretv/visualforecast/icons/impl/SunIcon.java rename to src/com/flaremicro/visualforecast/icons/impl/SunIcon.java index 307ea46..ee6ebeb 100644 --- a/src/com/flaremicro/flaretv/visualforecast/icons/impl/SunIcon.java +++ b/src/com/flaremicro/visualforecast/icons/impl/SunIcon.java @@ -1,4 +1,4 @@ -package com.flaremicro.flaretv.visualforecast.icons.impl; +package com.flaremicro.visualforecast.icons.impl; import java.awt.BasicStroke; import java.awt.Color; @@ -6,7 +6,7 @@ import java.awt.Graphics2D; import java.awt.geom.Ellipse2D; import java.awt.geom.Path2D; -import com.flaremicro.flaretv.visualforecast.icons.Icon; +import com.flaremicro.visualforecast.icons.Icon; public class SunIcon extends Icon { Path2D.Float sunPath = new Path2D.Float(); diff --git a/src/com/flaremicro/visualforecast/interfaces/Tickable.java b/src/com/flaremicro/visualforecast/interfaces/Tickable.java new file mode 100644 index 0000000..6b892bc --- /dev/null +++ b/src/com/flaremicro/visualforecast/interfaces/Tickable.java @@ -0,0 +1,5 @@ +package com.flaremicro.visualforecast.interfaces; + +public interface Tickable { + public void tick(); +} diff --git a/vf1000.properties b/vf1000.properties new file mode 100644 index 0000000..b1a623c --- /dev/null +++ b/vf1000.properties @@ -0,0 +1,3 @@ +#VisualForecast 1000 Properties file. Functional provider must be set for successful boot! +#Thu Mar 07 14:12:28 PST 2024 +forecast-provider-jar=EnvironmentCanadaProvider.jar