/* * WBI Indicator Explorer * * Copyright 2015 Sebastian Nogara <snogaraleal@gmail.com> * * This file is part of WBI. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package client.managers.models; import java.util.ArrayList; import java.util.List; import rpc.client.ClientRequest; import models.Country; import client.managers.Manager; import client.services.WBIExplorationService; /** * {@link Manager} in charge of the current {@link Country} selection. * * @see Manager */ public class CountryManager implements Manager { /** * Interface for views that interact with a {@link CountryManager}. */ public static interface View extends Manager.View<CountryManager> {} /** * Interface for {@link CountryManager} listeners. */ public static interface Listener { /** * Handle search results. * * @param countries Search results. * @param selectedCountries Currently selected countries. */ void onSearch( List<Country> countries, List<Country> selectedCountries); /** * Handle added {@link Country}. * * @param country Country that was just added. */ void onAdd(Country country); /** * Handle removed {@link Country}. * * @param country Country that was just removed. */ void onRemove(Country country); /** * Clear the current selection. * * @param selectedCountries Selection before clearing. */ void onClear(List<Country> selectedCountries); } /** * {@code Listener} objects listening to changes in this manager. */ private List<Listener> listeners = new ArrayList<Listener>(); /** * {@code ClientRequest.Listener} for search requests. */ private ClientRequest.Listener<List<Country>> searchRequestListener; /** * Last search query. */ private String lastQuery; /** * Last search {@code ClientRequest}. */ private ClientRequest<List<Country>> lastSearchRequest; /** * Last search results. */ private List<Country> lastSearchCountries; /** * List of selected {@code Country} objects. */ private List<Country> selectedCountries = new ArrayList<Country>(); /** * Initialize {@code CountryManager}. */ public CountryManager() { /* * Initialize {@code ClientRequest.Listener} for search. */ searchRequestListener = new ClientRequest.Listener<List<Country>>() { @Override public void onSuccess(List<Country> list) { lastSearchCountries = list; for (Listener listener : listeners) { listener.onSearch(list, selectedCountries); } } @Override public void onFailure(ClientRequest.Error error) { } }; } /** * Get the list of selected {@link Country} objects. * * @return Selected countries. */ public List<Country> getSelectedCountries() { return selectedCountries; } /** * Attach {@code Listener}. * * @param listener Listener to attach. */ public void addListener(Listener listener) { if (lastSearchCountries != null) { listener.onSearch(lastSearchCountries, selectedCountries); } listeners.add(listener); } /** * Detach {@code Listener}. * * @param listener Listener to detach. */ public void removeListener(Listener listener) { listeners.remove(listener); } /** * Clear the current search. */ public void clearSearch() { lastQuery = null; } /** * Perform search. * * @param query Search terms. */ public void search(String query) { if (query.equals(lastQuery)) { return; } if (lastSearchRequest != null) { lastSearchRequest.cancel(); } lastQuery = query; // Make RPC request lastSearchRequest = WBIExplorationService.queryCountryList( query, searchRequestListener); } /** * Add country to selection. * * @param country {@link Country} to add. */ public void add(Country country) { if (!selectedCountries.contains(country)) { selectedCountries.add(country); for (Listener listener : listeners) { listener.onAdd(country); } } } /** * Remove country from selection. * * @param country {@link Country} to remove. */ public void remove(Country country) { if (selectedCountries.contains(country)) { selectedCountries.remove(country); for (Listener listener : listeners) { listener.onRemove(country); } } } /** * Toggle country selection. * * @param country {@link Country} to add or remove. */ public void toggle(Country country) { if (selectedCountries.contains(country)) { remove(country); } else { add(country); } } /** * Clear the current selection. */ public void clear() { for (Listener listener : listeners) { listener.onClear(selectedCountries); } selectedCountries.clear(); } }