package org.ovirt.engine.ui.common.widget;
import org.ovirt.engine.ui.common.view.popup.FocusableComponentsContainer;
import org.ovirt.engine.ui.uicommonweb.HasCleanup;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicompat.IEventListener;
import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.HasClickHandlers;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HasEnabled;
import com.google.gwt.user.client.ui.HasText;
import com.google.gwt.user.client.ui.Widget;
/**
* Abstract button widget bound to UiCommon {@linkplain UICommand command}.
*
* The command isn't invoked automatically when using the button. You must attach a command,
* and then also invoke it in a handler (usually this logic goes in your Presenter). Example:
*
* <pre>
* {@code
* getView().getLoginButton().setCommand(loginModel.getLoginCommand());
* registerHandler(getView().getLoginButton().addClickHandler(new ClickHandler() {
* @Override
* public void onClick(ClickEvent event) {
* getView().getLoginButton().getCommand().execute();
* }
* }));
* }
* </pre>
*/
public abstract class AbstractUiCommandButton extends Composite
implements HasUiCommandClickHandlers, HasLabel, FocusableComponentsContainer, HasCleanup {
private final IEventListener<PropertyChangedEventArgs> listener = (ev, sender, args) -> updateButton();
private UICommand command;
@Override
public HandlerRegistration addClickHandler(ClickHandler handler) {
Widget widget = getButtonWidget();
if (widget instanceof HasClickHandlers) {
return ((HasClickHandlers)widget).addClickHandler(handler);
} else {
return null;
}
}
@Override
public UICommand getCommand() {
return command;
}
@Override
public void setCommand(UICommand command) {
this.command = command;
command.getPropertyChangedEvent().addListener(listener);
updateButton();
}
@Override
public String getLabel() {
Widget widget = getButtonWidget();
String result = null;
if (widget instanceof HasText) {
result = ((HasText)widget).getText();
}
return result;
}
@Override
public void setLabel(String label) {
Widget widget = getButtonWidget();
if (widget instanceof HasText) {
((HasText)widget).setText(label);
}
}
protected void updateButton() {
Widget widget = getButtonWidget();
widget.setVisible(command.getIsAvailable() && command.getIsVisible());
if (widget instanceof HasEnabled) {
((HasEnabled)widget).setEnabled(command.getIsExecutionAllowed());
}
String label = getLabel();
if (command.getTitle() == null) {
setLabel(""); //$NON-NLS-1$
}
else if (label != null && label.equals("")) { //$NON-NLS-1$
setLabel(command.getTitle());
}
}
protected abstract Widget getButtonWidget();
@Override
public void cleanup() {
if (getCommand() != null) {
getCommand().getPropertyChangedEvent().removeListener(listener);
}
}
}