/*
* 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.utility.gwt.client.ribbon.dropdown;
import java.util.ArrayList;
import java.util.List;
import org.geomajas.configuration.Parameter;
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.widget.MapWidget;
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.RibbonButton;
import org.geomajas.widget.utility.gwt.client.ribbon.RibbonColumnRegistry;
import org.geomajas.widget.utility.gwt.client.util.GuwLayout;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.layout.Layout;
/**
* RibbonColumn implementation that displays a button, which opens a drop-down panel with more buttons.
* Panel can contain {@link org.geomajas.widget.utility.gwt.client.ribbon.RibbonColumnCanvas}ses as well,
* so everything that extends {@link com.smartgwt.client.widgets.Canvas} can be included.
*
* @author Emiel Ackermann
*/
public class DropDownRibbonButton extends RibbonButton {
private DropDownPanel dropDownPanel;
public DropDownRibbonButton(final DropDownButtonAction action, List<ClientToolInfo> tools, MapWidget mapWidget) {
this(action, 24, TitleAlignment.BOTTOM, tools, mapWidget);
}
public DropDownRibbonButton(final DropDownButtonAction action, int iconSize,
TitleAlignment titleAlignment, List<ClientToolInfo> tools, MapWidget mapWidget) {
super(new ToolbarButtonAction(action), iconSize, titleAlignment);
createPanel(action, tools, mapWidget);
}
private void createPanel(final DropDownButtonAction action, List<ClientToolInfo> tools, MapWidget mapWidget) {
dropDownPanel = new DropDownPanel(this);
dropDownPanel.hide();
setTitle(action.getTitle());
setTooltip(action.getTooltip());
setIcon(action.getIcon());
action.setDropDownPanel(dropDownPanel);
ButtonGroup group = null;
List<ButtonAction> actions = new ArrayList<ButtonAction>();
for (ClientToolInfo tool : tools) {
ToolbarBaseAction toolbarAction = ToolbarRegistry.getToolbarAction(tool.getToolId(), mapWidget);
if (toolbarAction != null) {
if (toolbarAction instanceof ButtonGroup) {
// First wrap currently found actions into a group (previous group can be null).
if (actions.size() > 0) {
dropDownPanel.addGroup(group, actions);
}
group = (ButtonGroup) toolbarAction;
group.setTitle(tool.getTitle());
for (Parameter parameter : tool.getParameters()) {
group.configure(parameter.getName(), parameter.getValue());
}
actions = new ArrayList<ButtonAction>();
} else {
ButtonAction innerAction = RibbonColumnRegistry.getAction(tool, mapWidget);
actions.add(innerAction);
}
}
}
// Always add the last actions as a group to the panel (also if group is null)
dropDownPanel.addGroup(group, actions);
}
@Override
public void configure(String key, String value) {
if ("title".equals(key)) {
setTitle(value);
} else if ("titleAlignment".equals(key)) {
setTitleAlignment(TitleAlignment.valueOf(value.toUpperCase()));
} else if ("icon".equals(key)) {
setIcon(value);
} else if ("toolTip".equals(key)) {
setTooltip(value);
} else if ("panelWidth".equals(key)) {
dropDownPanel.setWidth(Integer.parseInt(value));
} else {
super.configure(key, value);
}
}
@Override
protected void onDraw() {
updateGui();
Layout outer = getOuter();
if (GuwLayout.DropDown.showDropDownImage) {
Img arrow = new Img("[ISOMORPHIC]/images/arrow_down.png", 9, 9);
arrow.setLayoutAlign(Alignment.CENTER);
outer.addMember(arrow);
}
addChild(outer);
}
// ------------------------------------------------------------------------
// Class specific methods:
// ------------------------------------------------------------------------
@Override
public void setButtonBaseStyle(String baseStyle) {
this.setBaseStyle(baseStyle.replace("Button", "DropDownButton"));
dropDownPanel.setStyleName(baseStyle.replace("Button", "Panel"));
}
/**
* Get the {@link DropDownPanel} of this button.
* @return dropDownPanel
* The {@link DropDownPanel} of this button.
*/
public DropDownPanel getPanel() {
return dropDownPanel;
}
}