package org.ovirt.engine.ui.userportal.client.components; import com.google.gwt.core.client.GWT; import org.ovirt.engine.core.compat.EventArgs; import org.ovirt.engine.core.compat.PropertyChangedEventArgs; import org.ovirt.engine.ui.uicommon.models.EntityModel; import org.ovirt.engine.ui.uicommon.models.ListModel; import org.ovirt.engine.ui.uicommon.models.Model; import org.ovirt.engine.core.compat.Event; import org.ovirt.engine.core.compat.IEventListener; import org.ovirt.engine.ui.userportal.client.binders.ModelBindedComponent; import org.ovirt.engine.ui.userportal.client.parsers.UPParser; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.widgets.form.fields.SelectItem; import com.smartgwt.client.widgets.form.fields.TextItem; import com.smartgwt.client.widgets.form.fields.events.BlurEvent; import com.smartgwt.client.widgets.form.fields.events.BlurHandler; import com.smartgwt.client.widgets.form.fields.events.KeyUpEvent; import com.smartgwt.client.widgets.form.fields.events.KeyUpHandler; public class TextItemEntityModelBinded extends UPTextItem implements ModelBindedComponent { EntityModel entityModel; UPParser parser; public TextItemEntityModelBinded(String title, EntityModel model) { this(true, title, model, false); } public TextItemEntityModelBinded(String title, EntityModel model, boolean isIntField) { this(true, title, model, isIntField, null); } public TextItemEntityModelBinded(String title, EntityModel model, boolean isIntField, UPParser parser) { this(true, title, model, isIntField, parser); } public TextItemEntityModelBinded(boolean async, String title, EntityModel model, boolean isIntField) { this(async, title, model, isIntField, null); } public TextItemEntityModelBinded(boolean async, String title, EntityModel model, boolean isIntField, UPParser parser) { this.parser = parser; entityModel = model; setDisabled(!model.getIsChangable()); setTitle("<nobr>" + title + "</nobr>"); setTitleAlign(Alignment.LEFT); String value = ""; if (model.getEntity() instanceof String) value = (String)model.getEntity(); if (model.getEntity() instanceof Integer) { value = ((Integer)model.getEntity()).toString(); } if (parser != null) { value = parser.format(value); } setValue(value); addKeyUpHandler(new NewVmTextItemKeyUpHandler(isIntField)); addBlurHandler(new NewVmTextItemBlurHandler(isIntField)); model.getEntityChangedEvent().addListener(new TextItemChangedEventListener(this)); model.getPropertyChangedEvent().addListener(new TextItemPropertyChangedEventListener(this)); if (!async) { entityModel.getEntityChangedEvent().raise(model, EventArgs.Empty); } } public class NewVmTextItemKeyUpHandler implements KeyUpHandler { boolean convertToInt = false; public NewVmTextItemKeyUpHandler(boolean convertToInt) { this.convertToInt = convertToInt; } @Override public void onKeyUp(KeyUpEvent event) { TextItemEntityModelBinded source = (TextItemEntityModelBinded) event.getSource(); String title = source.getTitle(); Object inputValue = source.getValue(); Object currentValue = entityModel.getEntity(); GWT.log("Getting:" + currentValue); // parse if (parser != null) { inputValue = parser.parse((String) inputValue); } // convert int if (convertToInt) { try { inputValue = Integer.parseInt((String) inputValue); } catch (NumberFormatException e) { return; } } // do not set if value has not changed if (currentValue != null && currentValue.equals(inputValue)) { return; } // set GWT.log("Setting " + title + " to: " + inputValue); entityModel.setEntity(inputValue); } } public class NewVmTextItemBlurHandler implements BlurHandler { boolean convertToInt = false; public NewVmTextItemBlurHandler(boolean convertToInt) { this.convertToInt = convertToInt; } @Override public void onBlur(BlurEvent event) { TextItemEntityModelBinded source = (TextItemEntityModelBinded) event.getSource(); String inputValue = (String) source.getValue(); // display formatted value if a parser exists if (parser != null) { String displayValue = parser.format((String) inputValue); source.setValue(displayValue); } } } public class TextItemChangedEventListener implements IEventListener { private TextItemEntityModelBinded textItem; public TextItemChangedEventListener(TextItemEntityModelBinded textItem) { this.textItem = textItem; } @Override public void eventRaised(Event ev, Object sender, EventArgs args) { GWT.log("Text item changed: " + textItem.getTitle() + " Changed to: " + ((EntityModel)sender).getEntity()); if (((EntityModel)sender).getEntity() != null) { String newValue = ((EntityModel)sender).getEntity().toString(); // if the value is same as the current one, do nothing if (newValue.equals(textItem.getValue())) { return; } if (parser == null) { textItem.setValue(newValue); } else { textItem.setValue(parser.format(newValue)); } textItem.redraw(); } else { textItem.setValue(""); } } } public class TextItemPropertyChangedEventListener implements IEventListener { private TextItemEntityModelBinded textItem; public TextItemPropertyChangedEventListener(TextItemEntityModelBinded textItem) { this.textItem = textItem; } @Override public void eventRaised(Event ev, Object sender, EventArgs args) { String property = ((PropertyChangedEventArgs)args).PropertyName; if (property.equals("IsChangable")) { textItem.setDisabled(!((Model)sender).getIsChangable()); } else if (property.equals("IsAvailable")) { if (!entityModel.getIsAvailable()) { hide(); } else { show(); } } else if (property.equals("IsValid")) { if (!entityModel.getIsValid()) { setTextBoxStyle("textBoxInvalid"); if (entityModel.getInvalidityReasons() != null && entityModel.getInvalidityReasons().size()>0) { setTooltip("<nobr>" + entityModel.getInvalidityReasons().iterator().next() + "</nobr>"); setHoverStyle("gridToolTipStyle"); setHoverWidth(1); setHoverDelay(100); } } else { setTextBoxStyle("engineTextItem"); setTooltip(""); } } } } public Model getModel() { return entityModel; } }