package org.ovirt.engine.ui.webadmin.widget.host;
import java.util.ArrayList;
import java.util.List;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.constants.IconType;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.ui.common.css.OvirtCss;
import org.ovirt.engine.ui.common.widget.AddRemoveRowWidget;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.hosts.FenceProxyModel;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import org.ovirt.engine.ui.webadmin.uicommon.model.FenceProxyModelProvider;
import com.google.gwt.core.client.GWT;
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.Label;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
public class HostProxySourceEditor extends AddRemoveRowWidget<ListModel<FenceProxyModel>, FenceProxyModel,
HostProxySourceWidget> {
interface WidgetUiBinder extends UiBinder<Widget, HostProxySourceEditor> {
WidgetUiBinder uiBinder = GWT.create(WidgetUiBinder.class);
}
private static final ApplicationConstants constants = AssetProvider.getConstants();
@UiField
@Ignore
Label header;
@UiField
@Ignore
Label newProxyLabel;
@UiField
Button newProxyButton;
private final FenceProxyModelProvider modelProvider;
private HandlerRegistration addClickHandlerRegistration;
private ListModel<FenceProxyModel> listModel;
private boolean isEnabled;
@Inject
public HostProxySourceEditor(FenceProxyModelProvider modelProvider) {
showGhost = false;
showAddButton = false;
this.modelProvider = modelProvider;
initWidget(WidgetUiBinder.uiBinder.createAndBindUi(this));
newProxyButton.setIcon(IconType.PLUS);
addHandlers();
}
private void addHandlers() {
if (addClickHandlerRegistration != null) {
addClickHandlerRegistration.removeHandler();
}
addClickHandlerRegistration = newProxyButton.addClickHandler(event -> {
if (!items.isEmpty()) {
Pair<FenceProxyModel, HostProxySourceWidget> modelWidgetPair = items.get(items.size() - 1);
getEntry(modelWidgetPair.getSecond()).removeLastButton();
}
Pair<FenceProxyModel, HostProxySourceWidget> item = addGhostEntry();
onAdd(item.getFirst(), item.getSecond());
item.getFirst().edit(listModel);
});
}
@Override
protected HostProxySourceWidget createWidget(FenceProxyModel value) {
modelProvider.initializeModel(value);
final HostProxySourceWidget widget = new HostProxySourceWidget();
widget.addUpClickHandler(event -> {
proxyUp(widget.getModel());
updateButtonState();
});
widget.addDownClickHandler(event -> {
proxyDown(widget.getModel());
updateButtonState();
});
widget.edit(value);
return widget;
}
@Override
protected void init(ListModel<FenceProxyModel> listModel) {
this.listModel = listModel;
super.init(listModel);
header.setText(constants.hostPopupSourceText());
newProxyLabel.setText(constants.hostPopupAddProxyPreferenceType());
setEnabled(listModel.getIsChangable());
updateButtonState();
}
@Override
protected FenceProxyModel createGhostValue() {
return new FenceProxyModel();
}
@Override
protected boolean isGhost(FenceProxyModel value) {
return value == null || value.getEntity() == null || "".equals(value.getEntity()); //$NON-NLS-1$
}
public void setValue(ListModel<FenceProxyModel> value) {
this.listModel = value;
}
private void updateButtonState() {
if (!items.isEmpty()) {
for (Pair<FenceProxyModel, HostProxySourceWidget> pair: items) {
pair.getSecond().enableUpButton(!pair.equals(items.get(0)) && isEnabled);
pair.getSecond().enableDownButton(!pair.equals(items.get(items.size() - 1)) && isEnabled);
pair.getSecond().setOrder(items.indexOf(pair) + 1);
}
}
}
@Override
protected void onRemove(FenceProxyModel value, HostProxySourceWidget widget) {
super.onRemove(value, widget);
updateButtonState();
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
isEnabled = enabled;
if (enabled) {
header.removeStyleName(OvirtCss.LABEL_DISABLED);
newProxyLabel.removeStyleName(OvirtCss.LABEL_DISABLED);
} else {
header.addStyleName(OvirtCss.LABEL_DISABLED);
newProxyLabel.addStyleName(OvirtCss.LABEL_DISABLED);
}
newProxyButton.setEnabled(enabled);
updateButtonState();
}
private void proxyUp(FenceProxyModel model) {
if (listModel.getItems() == null) {
return;
}
List<FenceProxyModel> list = new ArrayList<>(listModel.getItems());
int selectedItemIndex = list.indexOf(model);
// Check whether the selected item is first in the list.
if (selectedItemIndex > 0) {
list.remove(selectedItemIndex);
list.add(selectedItemIndex - 1, model);
listModel.setItems(list);
listModel.setSelectedItem(model);
}
}
private void proxyDown(FenceProxyModel model) {
if (listModel.getItems() == null) {
return;
}
List<FenceProxyModel> list = new ArrayList<>(listModel.getItems());
int selectedItemIndex = list.indexOf(model);
// Check whether the selected item is first in the list.
if (selectedItemIndex < list.size()) {
list.remove(selectedItemIndex);
list.add(selectedItemIndex + 1, model);
listModel.setItems(list);
listModel.setSelectedItem(model);
}
}
@Override
protected boolean vetoRemoveWidget(Pair<FenceProxyModel, HostProxySourceWidget> item,
FenceProxyModel value, HostProxySourceWidget widget) {
boolean veto = false;
if (listModel.getItems().size() <= 1) {
veto = true;
value.warnUserOnLimit();
}
return veto;
}
}