package com.eas.menu; import com.eas.core.HasPublished; import com.eas.ui.ButtonGroup; import com.eas.ui.HasEventsExecutor; import com.eas.ui.HasJsFacade; import com.eas.ui.HasPlatypusButtonGroup; import com.eas.ui.events.ActionEvent; import com.eas.ui.events.ActionHandler; import com.eas.ui.events.EventsExecutor; import com.eas.ui.events.HasActionHandlers; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.HandlerRegistration; public class PlatypusMenuItemCheckBox extends MenuItemCheckBox implements HasActionHandlers, HasJsFacade, HasPlatypusButtonGroup, HasEventsExecutor { protected EventsExecutor eventsExecutor; protected JavaScriptObject published; protected String name; // protected boolean settingValue; protected ButtonGroup group; public PlatypusMenuItemCheckBox() { super(false, "", false); } public PlatypusMenuItemCheckBox(Boolean aValue, String aText, boolean asHtml) { super(aValue, aText, asHtml); } protected int actionHandlers; protected HandlerRegistration valueChangeReg; @Override public HandlerRegistration addActionHandler(ActionHandler handler) { final HandlerRegistration superReg = super.addHandler(handler, ActionEvent.getType()); if (actionHandlers == 0) { valueChangeReg = addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { if (!settingValue) { ActionEvent.fire(PlatypusMenuItemCheckBox.this, PlatypusMenuItemCheckBox.this); } } }); } actionHandlers++; return new HandlerRegistration() { @Override public void removeHandler() { superReg.removeHandler(); actionHandlers--; if (actionHandlers == 0) { assert valueChangeReg != null : "Erroneous use of addActionHandler/removeHandler detected in PlatypusMenuItemCheckBox"; valueChangeReg.removeHandler(); valueChangeReg = null; } } }; } @Override public EventsExecutor getEventsExecutor() { return eventsExecutor; } @Override public void setEventsExecutor(EventsExecutor aExecutor) { eventsExecutor = aExecutor; } @Override public String getJsName() { return name; } @Override public void setJsName(String aValue) { name = aValue; } @Override public ButtonGroup getButtonGroup() { return group; } @Override public void setButtonGroup(ButtonGroup aValue) { group = aValue; } @Override public void mutateButtonGroup(ButtonGroup aGroup) { if (group != aGroup) { if (group != null) group.remove((HasPublished) this); group = aGroup; if (group != null) group.add((HasPublished) this); } } public boolean getPlainValue() { if (getValue() != null) return getValue(); else return false; } public void setPlainValue(boolean value) { settingValue = true; try { super.setValue(value, true); } finally { settingValue = false; } } @Override public JavaScriptObject getPublished() { return published; } @Override public void setPublished(JavaScriptObject aValue) { if (published != aValue) { published = aValue; if (published != null) { publish(this, aValue); } } } private native static void publish(HasPublished aWidget, JavaScriptObject published)/*-{ Object.defineProperty(published, "text", { get : function() { return aWidget.@com.eas.menu.PlatypusMenuItemCheckBox::getText()(); }, set : function(aValue) { aWidget.@com.eas.menu.PlatypusMenuItemCheckBox::setText(Ljava/lang/String;)(aValue); } }); Object.defineProperty(published, "selected", { get : function() { return aWidget.@com.eas.menu.PlatypusMenuItemCheckBox::getPlainValue()(); }, set : function(aValue) { aWidget.@com.eas.menu.PlatypusMenuItemCheckBox::setPlainValue(Z)(aValue != null && (false != aValue)); } }); Object.defineProperty(published, "buttonGroup", { get : function() { var buttonGroup = aWidget.@com.eas.ui.HasPlatypusButtonGroup::getButtonGroup()(); return @com.eas.core.Utils::checkPublishedComponent(Ljava/lang/Object;)(buttonGroup); }, set : function(aValue) { aWidget.@com.eas.ui.HasPlatypusButtonGroup::mutateButtonGroup(Lcom/eas/ui/ButtonGroup;)(aValue != null ? aValue.unwrap() : null); } }); }-*/; }