package org.ovirt.engine.ui.common.widget.form;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicompat.IEventListener;
import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
public class FormBuilder {
private final AbstractFormPanel formPanel;
private final List<FormItem> items = new ArrayList<>();
// Maps model property names to corresponding items, used to update
// form items whenever the given model property changes its value
private final Map<String, List<FormItem>> propertyNameMap = new HashMap<>();
private EntityModel<?> model;
public FormBuilder(AbstractFormPanel formPanel, int numOfColumns, int numOfRows) {
this.formPanel = formPanel;
formPanel.addFormDetailView(numOfRows, numOfColumns);
}
/**
* Set the relative width of the column in bootstrap grid columns, acceptable values are between 1 and 12.
* Make sure your total for all columns does not exceed 12 or your results will be unpredictable.
* @param columnNum The column you want to set the relative width for.
* @param widthInColumns The number of grid columns you want your column to occupy.
*/
public void setRelativeColumnWidth(int columnNum, int widthInGridColumns) {
if (widthInGridColumns < 1 || widthInGridColumns > 12) {
throw new IllegalArgumentException("The widthInGridColumns has to be between 1 and 12"); //$NON-NLS-1$
}
formPanel.setRelativeColumnWidth(columnNum, widthInGridColumns);
}
public void addFormItem(FormItem item) {
addFormItem(item, 6, 6);
}
/**
* Adds new item to the form panel.
*/
public void addFormItem(FormItem item, int labelWidth, int valueWidth) {
// Adopt item
item.setFormPanel(formPanel);
// Validate and add item
if (item.isValid()) {
formPanel.addFormItem(item, labelWidth, valueWidth);
items.add(item);
// Update property name mapping, if necessary
String isAvailablePropertyName = item.getIsAvailablePropertyName();
if (isAvailablePropertyName != null) {
getItemsForPropertyName(isAvailablePropertyName).add(item);
}
}
}
List<FormItem> getItemsForPropertyName(String propertyName) {
if (!propertyNameMap.containsKey(propertyName)) {
propertyNameMap.put(propertyName, new ArrayList<FormItem>());
}
return propertyNameMap.get(propertyName);
}
/**
* Updates all items within the form panel.
*/
public void update(EntityModel<?> model) {
// Detach property change listener from old model
if (this.model != null) {
this.model.getPropertyChangedEvent().removeListener(propertyChangedEventListener);
}
// Adopt new model
this.model = model;
// Attach property change listener to new model
this.model.getPropertyChangedEvent().addListener(propertyChangedEventListener);
// Update all form items
for (FormItem item : items) {
item.update();
}
}
private final IEventListener<PropertyChangedEventArgs> propertyChangedEventListener = (ev, sender, args) -> {
String propertyName = args.propertyName;
List<FormItem> formItems = propertyNameMap.get(propertyName);
if (formItems != null) {
for (FormItem item : formItems) {
item.update();
}
}
};
}