--- /dev/null
+package tim.prune.function.weather;
+
+import javax.swing.table.AbstractTableModel;
+
+import tim.prune.I18nManager;
+
+
+/**
+ * Table model for results of weather forecast
+ */
+public class WeatherTableModel extends AbstractTableModel
+{
+ /** Weather results */
+ private WeatherResults _results;
+
+ /** Row indices */
+ public static final int ROW_DAY = 0;
+ public static final int ROW_DESC = 1;
+ public static final int ROW_WIND = 2;
+ public static final int ROW_ICON = 3;
+ public static final int ROW_TEMP = 4;
+ public static final int ROW_HUMID = 5;
+
+ /** String for degrees Celsius */
+ private static final String UNITS_DEGC = I18nManager.getText("units.degreescelsius.short");
+ /** String for degrees Fahrenheit */
+ private static final String UNITS_DEGF = I18nManager.getText("units.degreesfahrenheit.short");
+
+ /**
+ * @return column count
+ */
+ public int getColumnCount()
+ {
+ if (_results == null) {return 0;}
+ return _results.getNumForecasts();
+ }
+
+ /**
+ * @param inColNum column number
+ * @return column label for given column
+ */
+ public String getColumnName(int inColNum)
+ {
+ if (_results != null && inColNum >= 0 && inColNum < getColumnCount())
+ {
+ SingleForecast forecast = _results.getForecast(inColNum);
+ if (!forecast.hasTimes() || forecast.getTimeFrom().startsWith("00")) {
+ return forecast.getDate();
+ }
+ return forecast.getTimeFrom();
+ }
+ return "";
+ }
+
+ /**
+ * @return number of rows
+ */
+ public int getRowCount()
+ {
+ return 6;
+ }
+
+ /** @return true if there are no columns */
+ public boolean isEmpty()
+ {
+ return getColumnCount() == 0;
+ }
+
+ /**
+ * @param inRowNum row number
+ * @param inColNum column number
+ * @return cell entry at given row and column
+ */
+ public Object getValueAt(int inRowNum, int inColNum)
+ {
+ if (inColNum < 0 || inColNum >= getColumnCount()) {return "";}
+ SingleForecast forecast = _results.getForecast(inColNum);
+ if (forecast != null)
+ {
+ switch (inRowNum)
+ {
+ case ROW_DAY: {
+ final String dayDesc = forecast.getDayDesc() == null ? "now" : forecast.getDayDesc();
+ return buildDisplayString(null, I18nManager.getText("dialog.weather.day." + dayDesc));
+ }
+ case ROW_DESC: return buildDisplayString(null, forecast.getDescription());
+ case ROW_WIND: return buildDisplayString(I18nManager.getText("dialog.weather.wind"), forecast.getWindDescription());
+ case ROW_ICON: return forecast.getImageName();
+ case ROW_TEMP: return buildDisplayString(I18nManager.getText("dialog.weather.temp"), forecast.getTemps()
+ + (_results.isCelsius() ? UNITS_DEGC : UNITS_DEGF));
+ case ROW_HUMID: return buildDisplayString(I18nManager.getText("dialog.weather.humidity"), forecast.getHumidity());
+ }
+ }
+ return "";
+ }
+
+ /**
+ * Build a html string from the given title and value
+ */
+ private static final String buildDisplayString(String inTitle, String inValue)
+ {
+ if (inValue == null) {return null;}
+ return "<html>" + (inTitle == null ? "" : (inTitle + ": "))
+ + "<big>" + inValue.replaceAll(" ", " ") + "</big></html>";
+ }
+
+ /**
+ * Set the results
+ * @param inResults weather results including all forecasts
+ */
+ public void setResults(WeatherResults inResults)
+ {
+ _results = inResults;
+ fireTableStructureChanged();
+ }
+
+ /**
+ * Clear the list of forecasts
+ */
+ public void clear()
+ {
+ setResults(null);
+ }
+}