package com.project.website.canvas.client.canvastools.sketch; import java.util.HashMap; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HTMLPanel; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.ToggleButton; import com.google.gwt.user.client.ui.Widget; import com.project.shared.client.events.SimpleEvent; import com.project.shared.utils.ArrayUtils; import com.project.shared.utils.StringUtils; import com.project.website.canvas.client.canvastools.sketch.SketchTool.SpiroCurveType; import com.project.website.canvas.client.shared.widgets.ColorPicker; import com.project.website.canvas.client.shared.widgets.Slider; import com.project.website.canvas.client.shared.widgets.ToggleButtonPanel; import com.project.website.canvas.shared.data.SketchOptions; public class SketchToolbar extends Composite { private static SketchToolbarUiBinder uiBinder = GWT.create(SketchToolbarUiBinder.class); interface SketchToolbarUiBinder extends UiBinder<Widget, SketchToolbar>{} private static final String DEFAULT_STROKE_COLOR = "#000000"; @UiField ColorPicker paintColor; @UiField ToggleButton eraseButton; @UiField ToggleButton paintButton; @UiField ToggleButton spiroButton; @UiField ToggleButtonPanel toolTogglePanel; @UiField HTMLPanel paintOptionsPanel; @UiField HTMLPanel eraseOptionsPanel; @UiField HTMLPanel spiroOptionsPanel; @UiField Slider paintWidthSlider; @UiField Slider eraseWidthSlider; @UiField ListBox spiroTypeListBox; private final SimpleEvent<SketchOptions> optionsChangedEvent = new SimpleEvent<SketchOptions>(); private final HashMap<ToggleButton, DrawingTool> buttonToolMap = new HashMap<ToggleButton, DrawingTool>(); private boolean _initialized = false; private SketchOptions _sketchOptions = new SketchOptions(); public SketchToolbar() { initWidget(uiBinder.createAndBindUi(this)); buttonToolMap.put(this.eraseButton, DrawingTool.ERASE); buttonToolMap.put(this.paintButton, DrawingTool.PAINT); buttonToolMap.put(this.spiroButton, DrawingTool.SPIRO); for (SpiroCurveType spiroType : SpiroCurveType.values()) { spiroTypeListBox.addItem(spiroType.getFriendlyName(), spiroType.name()); } spiroTypeListBox.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { updateOptionsFromToolbar(); handleOptionChanged(true); } }); ValueChangeHandler<Double> barValueChangedHandler = new ValueChangeHandler<Double>() { @Override public void onValueChange(ValueChangeEvent<Double> event) { updateOptionsFromToolbar(); handleOptionChanged(true); }}; ValueChangeHandler<Boolean> optionsChangedHandleBool = new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { updateOptionsFromToolbar(); handleOptionChanged(true); } }; this.paintColor.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { updateOptionsFromToolbar(); handleOptionChanged(true); } }); this.paintWidthSlider.addValueChangeHandler(barValueChangedHandler); this.paintWidthSlider.setShowText(true); this.eraseWidthSlider.addValueChangeHandler(barValueChangedHandler); this.eraseWidthSlider.setShowText(true); this.eraseButton.addValueChangeHandler(optionsChangedHandleBool); this.paintButton.addValueChangeHandler(optionsChangedHandleBool); this.spiroButton.addValueChangeHandler(optionsChangedHandleBool); // TODO: replace with set default values? this.paintButton.setValue(true, false); } protected void handleOptionChanged(boolean fireEvent) { hideAllOptionPanels(); switch (this._sketchOptions.drawingTool) { case ERASE: this.eraseOptionsPanel.setVisible(true); break; case SPIRO: this.spiroOptionsPanel.setVisible(true); // fall through case PAINT: // fall through default: this.paintOptionsPanel.setVisible(true); break; } this.updateButtonStatesFromOptions(); this.paintColor.setColor(StringUtils.defaultIfNullOrEmpty(this._sketchOptions.penColor, DEFAULT_STROKE_COLOR)); this.paintWidthSlider.setValue(Double.valueOf(this._sketchOptions.penWidth), false); this.eraseWidthSlider.setValue(Double.valueOf(this._sketchOptions.eraserWidth), false); this.spiroTypeListBox.setItemSelected(ArrayUtils.indexOf(SpiroCurveType.values(), this._sketchOptions.spiroCurveType), true); if (fireEvent) { this.optionsChangedEvent.dispatch(new SketchOptions(this._sketchOptions)); } } private void updateButtonStatesFromOptions() { switch (this._sketchOptions.drawingTool) { case ERASE: this.eraseButton.setValue(true, false); break; case SPIRO: this.spiroButton.setValue(true, false); break; case PAINT: // fall through default: this.paintButton.setValue(true, false); break; } } protected void hideAllOptionPanels() { this.eraseOptionsPanel.setVisible(false); this.paintOptionsPanel.setVisible(false); this.spiroOptionsPanel.setVisible(false); } /** * Returns a <strong>copy</strong> of the current options used in the toolbar. */ public SketchOptions getOptions() { this.updateOptionsFromToolbar(); return new SketchOptions(this._sketchOptions); } private void updateOptionsFromToolbar() { this._sketchOptions.drawingTool = this.buttonToolMap.get(toolTogglePanel.getActiveButton()); this._sketchOptions.penWidth = Math.max(1, this.paintWidthSlider.getValue().intValue()); this._sketchOptions.penColor = this.paintColor.getColor(); this._sketchOptions.eraserWidth = Math.max(1, this.eraseWidthSlider.getValue().intValue()); this._sketchOptions.spiroCurveType = SpiroCurveType.valueOf(spiroTypeListBox.getValue(spiroTypeListBox.getSelectedIndex())); } /** * <strong>Copies</strong> the given option object and updates the toolbar to reflect the set options. */ public void setOptions(SketchOptions options) { this._sketchOptions = new SketchOptions(options); this.handleOptionChanged(false); } @Override protected void onLoad() { super.onLoad(); if (false == this._initialized) { this._initialized = true; this.setOptions(this._sketchOptions); } } @Override protected void onUnload() { super.onUnload(); } public HandlerRegistration addOptionsChangedHandler(SimpleEvent.Handler<SketchOptions> handler) { return this.optionsChangedEvent.addHandler(handler); } }