package org.ovirt.engine.ui.webadmin.widget.form;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.ovirt.engine.core.compat.Event;
import org.ovirt.engine.core.compat.EventArgs;
import org.ovirt.engine.core.compat.IEventListener;
import org.ovirt.engine.core.compat.PropertyChangedEventArgs;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import com.google.gwt.editor.client.SimpleBeanEditorDriver;
public class FormBuilder {
// A panel in which the builder assemble FormItems
AbstractFormPanel formPanel;
// A list of available FormItems
List<FormItem> formItems = new ArrayList<FormItem>();
// A map between property name and a FormItem
HashMap<String, FormItem> propertyNamesMap = new HashMap<String, FormItem>();
@SuppressWarnings("rawtypes")
SimpleBeanEditorDriver driver;
EntityModel model;
public FormBuilder(AbstractFormPanel formPanel, int numOfColumns, int numOfRows) {
this.formPanel = formPanel;
// Add columns of form items formatted bt the specified dimensions
for (int column = 0; column < numOfColumns; column++) {
formPanel.addFormDetailView(numOfRows);
}
}
public void addFormItem(FormItem item) {
// Add the specified item to the list
formItems.add(item);
// Add the item to the map if needed
if (item.getIsVisiblePropertyName() != null) {
propertyNamesMap.put(item.getIsVisiblePropertyName(), item);
}
}
@SuppressWarnings("rawtypes")
public void showForm(EntityModel model, SimpleBeanEditorDriver driver) {
this.model = model;
this.driver = driver;
// Clear the form panel
formPanel.clear();
// Add each FormItem to the form panel iff the item should be visible
for (FormItem item : formItems) {
if (item.isVisible()) {
formPanel.addFormItem(item);
}
}
model.getPropertyChangedEvent().removeListener(propertyChangedEventListener);
model.getPropertyChangedEvent().addListener(propertyChangedEventListener);
}
private final IEventListener propertyChangedEventListener = new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
String propertyName = ((PropertyChangedEventArgs) args).PropertyName;
if (propertyNamesMap.containsKey(propertyName)) {
FormItem item = propertyNamesMap.get(propertyName);
// Update the item that is correlated to the property name:
// remove the old item and add the new one iff should be visible
formPanel.removeFormItem(item);
if (item.isVisible()) {
formPanel.addFormItem(item);
}
}
}
};
public void setColumnsWidth(String... columnsWidth) {
formPanel.setColumnsWidth(columnsWidth);
}
}