From 0564334f93beffc402c067bd1f64210c20858b58 Mon Sep 17 00:00:00 2001 From: Flare Microsystems Date: Thu, 7 Mar 2024 14:12:38 -0800 Subject: [PATCH] Added providers --- CanadaDatamartProvider.jar | Bin 0 -> 12993 bytes CanadaDatamartProvider.properties | 4 + EnvironmentCanadaProvider.properties | 4 + MockForecastProvider.jar | Bin 0 -> 3704 bytes .../visualforecast/PropertyManager.java | 53 ------- .../visualforecast/flavour/Flavour.java | 15 -- .../visualforecast/interfaces/Tickable.java | 5 - .../providerapi/ForecastProvider.java | 12 -- .../providerapi/ForecastProviderManager.java | 70 ---------- .../providerapi/MockForecastProvider.java | 125 ----------------- .../visualforecast/Executor.java | 4 +- .../visualforecast/PropertyManager.java | 72 ++++++++++ .../visualforecast/RenderPanel.java | 69 ++++++--- .../visualforecast/TickThread.java | 4 +- .../visualforecast/VisualForecastFrame.java | 80 ++++++----- .../visualforecast/api/ForecastProvider.java | 59 ++++++++ .../api/ForecastProviderManager.java | 113 +++++++++++++++ .../displays/BootupDisplay.java | 105 ++++++++++++++ .../displays/DayForecastDisplay.java} | 132 ++++++++++-------- .../DayForecastDisplayOldAnimation.java} | 85 +++++------ .../visualforecast/displays/Display.java | 16 +++ .../displays/TextDisplay.java} | 40 +++--- .../visualforecast/forecast/DayForecast.java | 11 +- .../forecast/ForecastDetails.java | 2 +- .../visualforecast/forecast/TownForecast.java | 2 +- .../visualforecast/forecast/ValueCheck.java | 2 +- .../visualforecast/graphics/DrawingUtil.java | 2 +- .../visualforecast/graphics/FontManager.java | 2 +- .../graphics/RenderConstants.java | 2 +- .../visualforecast/icons/Icon.java | 2 +- .../visualforecast/icons/IconProvider.java | 36 ++--- .../icons/impl/BlizzardIcon.java | 4 +- .../visualforecast/icons/impl/ButterIcon.java | 4 +- .../visualforecast/icons/impl/CloudIcon.java | 4 +- .../visualforecast/icons/impl/FogIcon.java | 4 +- .../icons/impl/IceCubeIcon.java | 4 +- .../icons/impl/InvalidIcon.java | 9 +- .../icons/impl/LightningCloudIcon.java | 5 +- .../icons/impl/LightningIcon.java | 4 +- .../icons/impl/LightningOverlay.java | 5 +- .../icons/impl/LightningStormIcon.java | 5 +- .../icons/impl/PartlyCloudyIcon.java | 4 +- .../visualforecast/icons/impl/RainIcon.java | 4 +- .../icons/impl/RainSnowIcon.java | 5 +- .../visualforecast/icons/impl/SleetIcon.java | 4 +- .../icons/impl/SmallCloudIcon.java | 5 +- .../visualforecast/icons/impl/SnowIcon.java | 4 +- .../icons/impl/SnowflakeIcon.java | 4 +- .../visualforecast/icons/impl/SunIcon.java | 4 +- .../visualforecast/interfaces/Tickable.java | 5 + vf1000.properties | 3 + 51 files changed, 690 insertions(+), 528 deletions(-) create mode 100644 CanadaDatamartProvider.jar create mode 100644 CanadaDatamartProvider.properties create mode 100644 EnvironmentCanadaProvider.properties create mode 100644 MockForecastProvider.jar delete mode 100644 src/com/flaremicro/flaretv/visualforecast/PropertyManager.java delete mode 100644 src/com/flaremicro/flaretv/visualforecast/flavour/Flavour.java delete mode 100644 src/com/flaremicro/flaretv/visualforecast/interfaces/Tickable.java delete mode 100644 src/com/flaremicro/flaretv/visualforecast/providerapi/ForecastProvider.java delete mode 100644 src/com/flaremicro/flaretv/visualforecast/providerapi/ForecastProviderManager.java delete mode 100644 src/com/flaremicro/flaretv/visualforecast/providerapi/MockForecastProvider.java rename src/com/flaremicro/{flaretv => }/visualforecast/Executor.java (87%) create mode 100644 src/com/flaremicro/visualforecast/PropertyManager.java rename src/com/flaremicro/{flaretv => }/visualforecast/RenderPanel.java (78%) rename src/com/flaremicro/{flaretv => }/visualforecast/TickThread.java (86%) rename src/com/flaremicro/{flaretv => }/visualforecast/VisualForecastFrame.java (67%) create mode 100644 src/com/flaremicro/visualforecast/api/ForecastProvider.java create mode 100644 src/com/flaremicro/visualforecast/api/ForecastProviderManager.java create mode 100644 src/com/flaremicro/visualforecast/displays/BootupDisplay.java rename src/com/flaremicro/{flaretv/visualforecast/flavour/DayForecastFlavour.java => visualforecast/displays/DayForecastDisplay.java} (74%) rename src/com/flaremicro/{flaretv/visualforecast/flavour/DayForecastFlavourOldAnimation.java => visualforecast/displays/DayForecastDisplayOldAnimation.java} (81%) create mode 100644 src/com/flaremicro/visualforecast/displays/Display.java rename src/com/flaremicro/{flaretv/visualforecast/flavour/TextFlavour.java => visualforecast/displays/TextDisplay.java} (55%) rename src/com/flaremicro/{flaretv => }/visualforecast/forecast/DayForecast.java (64%) rename src/com/flaremicro/{flaretv => }/visualforecast/forecast/ForecastDetails.java (83%) rename src/com/flaremicro/{flaretv => }/visualforecast/forecast/TownForecast.java (86%) rename src/com/flaremicro/{flaretv => }/visualforecast/forecast/ValueCheck.java (95%) rename src/com/flaremicro/{flaretv => }/visualforecast/graphics/DrawingUtil.java (98%) rename src/com/flaremicro/{flaretv => }/visualforecast/graphics/FontManager.java (97%) rename src/com/flaremicro/{flaretv => }/visualforecast/graphics/RenderConstants.java (95%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/Icon.java (82%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/IconProvider.java (74%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/BlizzardIcon.java (91%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/ButterIcon.java (96%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/CloudIcon.java (96%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/FogIcon.java (93%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/IceCubeIcon.java (96%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/InvalidIcon.java (74%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/LightningCloudIcon.java (87%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/LightningIcon.java (94%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/LightningOverlay.java (89%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/LightningStormIcon.java (87%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/PartlyCloudyIcon.java (85%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/RainIcon.java (94%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/RainSnowIcon.java (90%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/SleetIcon.java (96%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/SmallCloudIcon.java (94%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/SnowIcon.java (90%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/SnowflakeIcon.java (96%) rename src/com/flaremicro/{flaretv => }/visualforecast/icons/impl/SunIcon.java (95%) create mode 100644 src/com/flaremicro/visualforecast/interfaces/Tickable.java create mode 100644 vf1000.properties diff --git a/CanadaDatamartProvider.jar b/CanadaDatamartProvider.jar new file mode 100644 index 0000000000000000000000000000000000000000..76803c581cdd0c654bb0a10628e5c7d2602ee917 GIT binary patch literal 12993 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 Q*xxVy-~Qyl^yl6G0wAKmp8x;= literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d6144df5f398dae5281bfedd1dbc5022f4f103be GIT binary patch literal 3704 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 bFvkC}XhsNXnzKt(r=Qbl<&RIV0RaC14Nru5 literal 0 HcmV?d00001 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