/* * 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 com.google.gwt.core.client.GWT; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.Overflow; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.HTMLPane; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.Window; import com.smartgwt.client.widgets.layout.VLayout; import org.geomajas.annotation.Api; import org.geomajas.gwt.client.Geomajas; import org.geomajas.gwt.client.map.feature.Feature; import org.geomajas.gwt.client.map.layer.VectorLayer; import org.geomajas.gwt.client.widget.MapWidget; import org.geomajas.widget.featureinfo.client.widget.DockableWindow; import org.geomajas.widget.searchandfilter.client.SearchAndFilterMessages; import org.geomajas.widget.searchandfilter.client.util.DataCallback; import org.geomajas.widget.searchandfilter.client.util.SearchCommService; import org.geomajas.widget.searchandfilter.client.widget.search.SearchWidget.SearchRequestEvent; import org.geomajas.widget.searchandfilter.client.widget.search.SearchWidget.SearchRequestHandler; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * Controller to handle the searches. * * @see SearchWidgetRegistry * @author Kristof Heirwegh * @since 1.0.0 */ @Api public class SearchController implements SearchRequestHandler { private final SearchAndFilterMessages messages = GWT.create(SearchAndFilterMessages.class); private final Set<SearchHandler> searchHandlers = new HashSet<SearchHandler>(); private MapWidget mapWidget; private boolean modalSearch; private Window window; /** * Construct search controller. * * @param mapWidget map widget * @param modalSearch should result be shown in a modal window */ public SearchController(MapWidget mapWidget, boolean modalSearch) { this.mapWidget = mapWidget; this.modalSearch = modalSearch; } // ---------------------------------------------------------- public void onSearchRequested(SearchRequestEvent event) { final SearchEvent searchEvent = new SearchEvent(); searchEvent.setCriterion(event.getCriterion()); fireSearchStartEvent(searchEvent); SearchCommService.searchByCriterion(event.getCriterion(), mapWidget, new DataCallback<Map<VectorLayer, List<Feature>>>() { public void execute(Map<VectorLayer, List<Feature>> result) { searchEvent.setResult(result); fireSearchDoneEvent(searchEvent); fireSearchEndEvent(searchEvent); } }, new Runnable() { public void run() { fireSearchEndEvent(searchEvent); destroyWindow(); SC.say(messages.searchControllerFailureMessage()); } }); } public void onCancelRequested(SearchRequestEvent event) { } /** * Add a search handler, for example an instance of * {@link org.geomajas.widget.searchandfilter.client.widget.multifeaturelistgrid.MultiFeatureListGrid}. * * @param handler handler to process the search results */ public void addSearchHandler(SearchHandler handler) { searchHandlers.add(handler); } public void removeSearchHandler(SearchHandler handler) { searchHandlers.remove(handler); } public boolean isModalSearch() { return modalSearch; } public void setModalSearch(boolean modalSearch) { this.modalSearch = modalSearch; } // ---------------------------------------------------------- private void fireSearchStartEvent(SearchEvent event) { showWindow(); for (SearchHandler handler : searchHandlers) { handler.onSearchStart(event); } } private void fireSearchDoneEvent(SearchEvent event) { for (SearchHandler handler : searchHandlers) { handler.onSearchDone(event); } } private void fireSearchEndEvent(SearchEvent event) { for (SearchHandler handler : searchHandlers) { handler.onSearchEnd(event); } hideWindow(); } private void showWindow() { if (window == null) { window = createWindow(); if (isModalSearch()) { window.setIsModal(true); window.setShowModalMask(true); } } window.show(); } private void hideWindow() { if (window != null) { window.hide(); } } private void destroyWindow() { if (window != null) { window.destroy(); window = null; } } private Window createWindow() { VLayout layout = new VLayout(5); layout.setLayoutAlign(Alignment.CENTER); layout.setAlign(Alignment.CENTER); layout.setWidth100(); Label label = new Label(messages.searchControllerSearchingMessage()); label.setWidth100(); label.setHeight(30); label.setAlign(Alignment.CENTER); layout.addMember(label); HTMLPane img = new HTMLPane(); img.setLayoutAlign(Alignment.CENTER); img.setAlign(Alignment.CENTER); img.setWidth(20); img.setHeight(20); img.setOverflow(Overflow.HIDDEN); img.setContents("<img src=\"" + Geomajas.getIsomorphicDir() + "/geomajas/ajax-loader.gif\" width=\"18\" height=\"18\" />"); layout.addMember(img); Window w = new DockableWindow(); w.setTitle(messages.searchControllerSearchingTitle()); w.setAlign(Alignment.CENTER); w.setPadding(5); w.setHeight(100); w.setWidth(300); w.addItem(layout); w.setShowMinimizeButton(false); w.setShowCloseButton(false); w.setKeepInParentRect(true); w.setAutoCenter(true); return w; } }