/*******************************************************************************
* Copyright (c) 2015 - 2016
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*******************************************************************************/
package jsettlers.mapcreator.main.window.sidebar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import jsettlers.mapcreator.tools.Tool;
import jsettlers.mapcreator.tools.shapes.EShapeProperty;
import jsettlers.mapcreator.tools.shapes.EShapeType;
import jsettlers.mapcreator.tools.shapes.ShapeProperty;
import jsettlers.mapcreator.tools.shapes.ShapeType;
/**
* Panel to select shape
*
* @author Andreas Butti
*/
public class ShapeSelectionPanel extends Box {
private static final long serialVersionUID = 1L;
/**
* Active shape
*/
private ShapeType activeShape = null;
/**
* All buttons
*/
private Map<EShapeType, JToggleButton> buttons = new LinkedHashMap<>();
/**
* All sliders
*/
private Map<EShapeProperty, StrokenSlider> properties = new HashMap<>();
/**
* Listener for activated shape
*/
private final class ShapeActionListener implements ActionListener {
private final ShapeType shape;
private ShapeActionListener(ShapeType shape) {
this.shape = shape;
}
@Override
public void actionPerformed(ActionEvent arg0) {
activeShape = shape;
updateStrokeProperties();
}
}
/**
* Constructor
*/
public ShapeSelectionPanel() {
super(BoxLayout.Y_AXIS);
JToolBar tb = new JToolBar();
tb.setFloatable(false);
ButtonGroup group = new ButtonGroup();
for (EShapeType type : EShapeType.values()) {
JToggleButton bt = new JToggleButton(type.getIcon());
bt.setDisabledIcon(type.getIcon().createDisabledIcon());
bt.setSelectedIcon(type.getIcon().createSelectedIcon());
bt.setToolTipText(type.getShape().getName());
bt.addActionListener(new ShapeActionListener(type.getShape()));
bt.setEnabled(false);
tb.add(bt);
group.add(bt);
buttons.put(type, bt);
}
add(tb);
for (EShapeProperty p : EShapeProperty.values()) {
StrokenSlider slider = new StrokenSlider(p);
properties.put(p, slider);
add(slider);
}
updateStrokeProperties();
}
/**
* @return The active shape
*/
public ShapeType getActiveShape() {
return activeShape;
}
/**
* Update the property slider
*/
private void updateStrokeProperties() {
for (StrokenSlider s : properties.values()) {
s.setProperty(null);
}
if (activeShape == null) {
return;
}
Hashtable<EShapeProperty, ShapeProperty> props = activeShape.getProperties();
for (Entry<EShapeProperty, ShapeProperty> e : props.entrySet()) {
StrokenSlider slider = properties.get(e.getKey());
slider.setProperty(e.getValue());
}
}
/**
* Enable / Disable tool buttons
*
* @param tool
* Tool
*/
public void updateShapeSettings(Tool tool) {
if (tool == null) {
for (JToggleButton b : buttons.values()) {
b.setEnabled(false);
}
updateStrokeProperties();
return;
}
Set<EShapeType> supportedShapes = tool.getSupportedShapes();
for (Entry<EShapeType, JToggleButton> e : buttons.entrySet()) {
EShapeType type = e.getKey();
JToggleButton button = e.getValue();
button.setEnabled(supportedShapes.contains(type));
}
for (JToggleButton b : buttons.values()) {
if (b.isSelected() && b.isEnabled()) {
// already a valid selection
updateStrokeProperties();
return;
}
}
for (Entry<EShapeType, JToggleButton> e : buttons.entrySet()) {
if (e.getValue().isEnabled()) {
e.getValue().setSelected(true);
this.activeShape = e.getKey().getShape();
break;
}
}
updateStrokeProperties();
}
}