/* * The MIT License (MIT) * * Copyright (c) 2015 Camil Staps * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package com.camilstaps.week10; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; /** * Controller for the main window * @author Camil Staps, s4498062 */ public class OverviewController { /** * Location of the Buienradar API XML */ private final static String XML_LOCATION = "http://xml.buienradar.nl"; private final OverviewWindow overviewWindow; private List weatherStations; /** * Refresh button: * 1. Store selected weatherstation id * 2. Reload XML * 3. Restore previously selected weatherstation */ private final ActionListener refreshActionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { if (ae.getActionCommand().equals("Refresh")) { int id = ((WeatherStation) overviewWindow.getWeatherStationPicker().getSelectedItem()).getId(); loadXML(); for (WeatherStation ws : weatherStations) { if (ws.getId() == id) { overviewWindow.getWeatherStationPicker().setSelectedItem(ws); break; } } loadWeatherInfo(); } } }; /** * When the ComboBox changes, change the information in the label accordingly */ private final ActionListener newStationActionListener = new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { if (ae.getActionCommand().equals("comboBoxChanged")) { loadWeatherInfo(); } } }; /** * Load the XML for the first time, register ActionListeners and display info * @param ow */ public OverviewController(OverviewWindow ow) { overviewWindow = ow; loadXML(); overviewWindow.getRefreshButton().addActionListener(refreshActionListener); overviewWindow.getWeatherStationPicker().addActionListener(newStationActionListener); loadWeatherInfo(); } /** * Load XML from the Buienradar API and store in the weatherStations List. */ private void loadXML() { try { DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); Document doc = docBuilder.parse(XML_LOCATION); doc.getDocumentElement().normalize(); NodeList weatherstationsList = doc.getElementsByTagName("weerstation"); weatherStations = new ArrayList<>(); for (int i = 0; i < weatherstationsList.getLength(); i++) { weatherStations.add(new WeatherStation((Element) weatherstationsList.item(i))); } Collections.sort(weatherStations); JComboBox comboBox = overviewWindow.getWeatherStationPicker(); comboBox.removeAllItems(); for (WeatherStation ws : weatherStations) { comboBox.addItem(ws); } } catch (ParserConfigurationException | SAXException | IOException ex) { Logger.getLogger(Week10WeatherGUI.class.getName()).log(Level.SEVERE, null, ex); } } /** * Show the weather information in the display. */ private void loadWeatherInfo() { WeatherStation selected = (WeatherStation) overviewWindow.getWeatherStationPicker().getSelectedItem(); if (selected != null) { overviewWindow.getWeatherInformationDisplay().setText(selected.getWeatherDescription()); overviewWindow.getWeatherInformationDisplay().setIcon(new ImageIcon(selected.getWeatherIcon())); } } }