package org.geogebra.web.web.gui.menubar; import org.geogebra.common.util.debug.Log; import com.google.gwt.core.client.Scheduler.ScheduledCommand; 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.safehtml.shared.SafeHtml; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.MenuItem; /** * @author gabor * * Menuitem that uses checkbox * */ public class GCheckBoxMenuItem extends MenuItem { private FlowPanel panel; /** * CheckBox to store */ CheckBox checkbox; /** * stored valuechangehandler (can be only one with this implementation) */ ValueChangeHandler<Boolean> valueChangeHandler; /** * @param html * creates a new GCheckbox menuitem */ public GCheckBoxMenuItem(SafeHtml html) { super(html); initGui(html, true); } private void initGui(SafeHtml html, boolean showCheckbox) { addStyleName("GCheckBoxMenuItem"); checkbox = new CheckBox(); checkbox.addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { if (valueChangeHandler != null) { valueChangeHandler.onValueChange(event); } setSelected(event.getValue()); } }); this.setScheduledCommand(new ScheduledCommand() { @Override public void execute() { if (valueChangeHandler != null) { checkbox.setValue(!checkbox.getValue()); valueChangeHandler.onValueChange(new MyValueChangeEvent(checkbox.getValue())); } setSelected(checkbox.getValue()); } }); panel = new FlowPanel(); if (showCheckbox) { panel.add(checkbox); } panel.add(new HTML(html)); this.setHTML(panel.getElement().getInnerHTML()); } /** * @param html menuItems html * @param showCheckbox wether to show checkbox */ public GCheckBoxMenuItem(SafeHtml html, boolean showCheckbox) { super(html); initGui(html, showCheckbox); } /** * @param selected wether the checbox selected or not */ public void setSelected(boolean selected) { Log.debug("setselected called"); checkbox.setValue(selected); this.setHTML(panel.getElement().getInnerHTML()); setSelectedClass(checkbox.getValue()); } private void setSelectedClass(Boolean selected) { if (selected) { this.addStyleName("selected"); } else { this.removeStyleName("selected"); } } /** * @param handler the valuechangehandler to add * @return new handlerregistration object */ public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Boolean> handler) { valueChangeHandler = handler; return new HandlerRegistration() { @Override public void removeHandler() { valueChangeHandler = null; } }; } /** * @return wether the checbox selected or not */ public boolean isSelected() { return checkbox.getValue(); } private class MyValueChangeEvent extends ValueChangeEvent<Boolean> { protected MyValueChangeEvent(Boolean value) { super(value); setSource(GCheckBoxMenuItem.this); } } }