/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium. * * The program is available in open source according to the GNU Affero * General Public License. All contributions in this program are covered * by the Geomajas Contributors License Agreement. For full licensing * details, see LICENSE.txt in the project root. */ package org.geomajas.widget.searchandfilter.client.widget.search; import java.util.LinkedHashMap; import java.util.Map; import org.geomajas.gwt.client.widget.MapWidget; import org.geomajas.widget.searchandfilter.client.SearchAndFilterMessages; import org.geomajas.widget.searchandfilter.client.widget.multifeaturelistgrid.MultiFeatureListGrid; import org.geomajas.widget.searchandfilter.client.widget.search.FavouritesController.FavouriteChangeHandler; import org.geomajas.widget.searchandfilter.search.dto.AndCriterion; import org.geomajas.widget.searchandfilter.search.dto.AttributeCriterion; import org.geomajas.widget.searchandfilter.search.dto.Criterion; import org.geomajas.widget.searchandfilter.search.dto.GeometryCriterion; import org.geomajas.widget.searchandfilter.search.dto.OrCriterion; import com.google.gwt.core.client.GWT; import com.smartgwt.client.util.SC; /** * Registry of {@link SearchWidget}s. * <p> * TODO explain architecture. * <p> * Caveat: Please keep in mind that search widgets always work on a specific map. * As there is only one SearchController, which also operates on a specific map, so * the search system can only work with one map. * * @author Kristof Heirwegh */ public final class SearchWidgetRegistry { private static final SearchAndFilterMessages MESSAGES = GWT.create(SearchAndFilterMessages.class); private static final Map<String, SearchWidgetCreator> REGISTRY = new LinkedHashMap<String, SearchWidgetCreator>(); private static SearchController searchController; private static FavouritesController favouritesController; private static MapWidget mapWidget; private SearchWidgetRegistry() { // utility class, hide constructor } // TODO favouriteController // ---------------------------------------------------------- public static void initialize(MapWidget mapWidget, SearchHandler searchResultGrid, boolean modalSearch) { SearchWidgetRegistry.mapWidget = mapWidget; searchController = new SearchController(mapWidget, modalSearch); favouritesController = new FavouritesController(); if (searchResultGrid != null) { searchController.addSearchHandler(searchResultGrid); } } /** * Initialize search registry. * * @param mapWidget map widget for registry * @param searchResultGrid * can be null, add your own handler to be notified then */ public static void initialize(MapWidget mapWidget, MultiFeatureListGrid searchResultGrid) { initialize(mapWidget, searchResultGrid, true); } public static void addSearchHandler(SearchHandler handler) { if (checkState()) { searchController.addSearchHandler(handler); } } public static void removeSearchHandler(SearchHandler handler) { if (checkState()) { searchController.removeSearchHandler(handler); } } public static void addFavouriteChangeHandler(FavouriteChangeHandler handler) { if (checkState()) { favouritesController.addFavouriteChangeHandler(handler); } } public static void removeFavouriteChangeHandler(FavouriteChangeHandler handler) { if (checkState()) { favouritesController.removeFavouriteChangeHandler(handler); } } public static FavouritesController getFavouritesController() { if (checkState()) { return favouritesController; } else { return null; } } public static void put(SearchWidgetCreator widgetCreator) { if (checkState()) { if (null != widgetCreator) { REGISTRY.put(widgetCreator.getSearchWidgetId(), widgetCreator); } } } public static SearchWidget getSearchWidgetInstance(String searchWidgetId) { final SearchWidget sw = REGISTRY.get(searchWidgetId).createInstance(mapWidget); sw.addSearchRequestHandler(searchController); sw.addFavouriteRequestHandler(favouritesController); SearchHandler sh = new SearchHandler() { public void onSearchStart(SearchEvent event) { sw.onSearchStart(); } public void onSearchEnd(SearchEvent event) { sw.onSearchEnd(); } public void onSearchDone(SearchEvent event) { } }; searchController.addSearchHandler(sh); return sw; } public static SearchController getSearchController() { return searchController; } /** * Get a list with all the ids + names of the search widgets in the registry. * * @return list of widget id/name pairs */ public static LinkedHashMap<String, String> getSearchWidgetMapping() { LinkedHashMap<String, String> map = new LinkedHashMap<String, String>(); for (SearchWidgetCreator swc : REGISTRY.values()) { map.put(swc.getSearchWidgetId(), swc.getSearchWidgetName()); } return map; } public static boolean isInitialized() { return (searchController != null); } private static boolean checkState() { if (isInitialized()) { return true; } else { String msg = "SearchWidgetRegistry has not been initialized. " + "Call initialize from your entry point on program startup."; SC.logWarn(msg); GWT.log(msg); return false; } } public static String getI18nTypeName(Criterion criterion) { if (criterion instanceof AndCriterion) { return MESSAGES.searchWidgetRegistryCriterionTypeAnd(); } else if (criterion instanceof OrCriterion) { return MESSAGES.searchWidgetRegistryCriterionTypeOr(); } else if (criterion instanceof AttributeCriterion) { return MESSAGES.searchWidgetRegistryCriterionTypeAttribute(); } else if (criterion instanceof GeometryCriterion) { return MESSAGES.searchWidgetRegistryCriterionTypeGeometry(); } else { return "??"; } } }