/*
* 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.ribbon.client;
import com.google.gwt.core.client.GWT;
import org.geomajas.configuration.client.ClientLayerInfo;
import org.geomajas.configuration.client.ClientToolInfo;
import org.geomajas.gwt.client.action.ToolbarBaseAction;
import org.geomajas.gwt.client.action.toolbar.ButtonGroup;
import org.geomajas.gwt.client.action.toolbar.DropDownButtonAction;
import org.geomajas.gwt.client.action.toolbar.ToolbarRegistry;
import org.geomajas.gwt.client.map.event.MapModelChangedEvent;
import org.geomajas.gwt.client.map.event.MapModelChangedHandler;
import org.geomajas.gwt.client.widget.MapWidget;
import org.geomajas.widget.searchandfilter.client.action.ConfiguredSearchAction;
import org.geomajas.widget.searchandfilter.ribbon.client.i18n.SearchAndFilterRibbonMessages;
import org.geomajas.widget.searchandfilter.search.dto.ConfiguredSearch;
import org.geomajas.widget.searchandfilter.search.dto.ConfiguredSearchesInfo;
import org.geomajas.widget.utility.gwt.client.action.ButtonAction;
import org.geomajas.widget.utility.gwt.client.action.ToolbarButtonAction;
import org.geomajas.widget.utility.gwt.client.ribbon.RibbonColumnRegistry;
import org.geomajas.widget.utility.gwt.client.ribbon.dropdown.DropDownRibbonButton;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* Extension of {@link DropDownRibbonButton}: will show the configured list and will add the list of
* saved searches for the layers of the map.
*
* @author Jan Venstermans
*/
public class DropDownWithConfiguredSearchesRibbonButton extends DropDownRibbonButton
implements MapModelChangedHandler {
private MapWidget mapWidget;
private static final SearchAndFilterRibbonMessages RIBBON_MESSAGES
= GWT.create(SearchAndFilterRibbonMessages.class);
public DropDownWithConfiguredSearchesRibbonButton(final DropDownButtonAction action,
List<ClientToolInfo> tools, MapWidget mapWidget) {
this(action, 24, TitleAlignment.BOTTOM, tools, mapWidget);
}
public DropDownWithConfiguredSearchesRibbonButton(final DropDownButtonAction action, int iconSize,
TitleAlignment titleAlignment, List<ClientToolInfo> tools,
MapWidget mapWidget) {
super(action, iconSize, titleAlignment, tools, mapWidget);
this.mapWidget = mapWidget;
mapWidget.getMapModel().addMapModelChangedHandler(this);
addSavedSearches();
}
private void addSavedSearches() {
if (mapWidget.getMapModel().isInitialized()) {
Map<String, List<ConfiguredSearch>> searches = new LinkedHashMap<String, List<ConfiguredSearch>>();
for (ClientLayerInfo clientLayerInfo : mapWidget.getMapModel().getMapInfo().getLayers()) {
if (clientLayerInfo.getWidgetInfo().containsKey(ConfiguredSearchesInfo.IDENTIFIER)) {
ConfiguredSearchesInfo searchesInfo = (ConfiguredSearchesInfo) clientLayerInfo.getWidgetInfo().
get(ConfiguredSearchesInfo.IDENTIFIER);
List<ConfiguredSearch> searchConfigs = searchesInfo.getSearchConfigs();
if (searchConfigs != null && searchConfigs.size() > 0) {
searches.put(clientLayerInfo.getId(), searchConfigs);
}
}
}
if (searches.size() > 0) {
List<ButtonAction> actions = new ArrayList<ButtonAction>();
for (Map.Entry<String, List<ConfiguredSearch>> entry : searches.entrySet()) {
for (ConfiguredSearch searchConfig : entry.getValue()) {
// only add configured searches that have at least one search attribute
if (searchConfig.getAttributes() != null && searchConfig.getAttributes().size() > 0) {
ClientToolInfo info = new ClientToolInfo();
info.setId(ConfiguredSearchAction.IDENTIFIER);
ButtonAction innerAction = RibbonColumnRegistry.getAction(info, mapWidget);
((ConfiguredSearchAction) ((ToolbarButtonAction) innerAction).getToolbarAction()).
setSearchConfig(searchConfig, entry.getKey());
actions.add(innerAction);
}
}
}
// it is possible all searches don't have search attributes, so do extra check
if (actions.size() > 0) {
getPanel().addGroup(createGroup(), actions);
// hard coded style names, that have been set before
getPanel().setStyleName(getPanel().getStyleName());
}
}
}
}
@Override
public void onMapModelChanged(MapModelChangedEvent event) {
addSavedSearches();
}
private ButtonGroup createGroup() {
ButtonGroup buttonGroup = null;
ToolbarBaseAction toolbarAction = ToolbarRegistry.getToolbarAction("ButtonGroup", mapWidget);
if (toolbarAction != null) {
if (toolbarAction instanceof ButtonGroup) {
buttonGroup = (ButtonGroup) toolbarAction;
buttonGroup.setTitle(RIBBON_MESSAGES.dropDownConfiguredSearchesGroupTitle());
//TODO: make configurable?
buttonGroup.configure("buttonLayout", "ICON_TITLE_AND_DESCRIPTION");
}
}
return buttonGroup;
}
}