package org.ovirt.engine.ui.common.widget.table.cell;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSessionConfiguration;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.SelectionCell;
import com.google.gwt.cell.client.TextInputCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.BrowserEvents;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.dom.client.SelectElement;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.view.client.CellPreviewEvent;
public class GlusterConfigAwareCell extends AbstractCell<GlusterGeoRepSessionConfiguration> implements EventHandlingCell {
private SelectionCell delegate;
private TextInputCell textInputCell;
public GlusterConfigAwareCell() {
super(BrowserEvents.CHANGE);
delegate = new SelectionCell(new ArrayList<String>());
textInputCell = new TextInputCell();
}
private void setOptions(List<String> allowedValues) {
delegate = new SelectionCell(allowedValues);
}
@Override
public boolean handlesEvent(CellPreviewEvent<EntityModel> event) {
return BrowserEvents.CLICK.equals(event.getNativeEvent().getType());
}
@Override
public void onBrowserEvent(Context context, final Element parent, final GlusterGeoRepSessionConfiguration configInRow, NativeEvent event, ValueUpdater<GlusterGeoRepSessionConfiguration> valueUpdater) {
final List<String> allowedValuesList = configInRow.getAllowedValues();
boolean isValuesConstrained =
isValueConstrained(allowedValuesList);
if (isValuesConstrained) {
delegate.onBrowserEvent(context, parent, configInRow.getValue(), event, value -> {
SelectElement select = parent.getFirstChild().cast();
int selectedIndex = select.getSelectedIndex();
configInRow.setValue(allowedValuesList.get(selectedIndex));
});
} else {
textInputCell.onBrowserEvent(context, parent, configInRow.getValue(), event, value -> {
if (value != null) {
configInRow.setValue(value);
}
});
}
}
private boolean isValueConstrained(List<String> allowedValuesList) {
return allowedValuesList != null && !allowedValuesList.isEmpty()
&& !(allowedValuesList.size() == 1 && allowedValuesList.get(0).isEmpty());
}
@Override
public void render(Context context, GlusterGeoRepSessionConfiguration value, SafeHtmlBuilder sb) {
List<String> allowedValues = value.getAllowedValues();
boolean isValuesConstrained = isValueConstrained(allowedValues);
SafeHtmlBuilder sbDelegate = new SafeHtmlBuilder();
if (isValuesConstrained) {
setOptions(allowedValues);
delegate.render(context, value.getDefaultValue(), sbDelegate);
} else {
textInputCell.render(context, value.getDefaultValue(), sbDelegate);
}
sb.append(sbDelegate.toSafeHtml());
}
}