/*
* RHQ Management Platform
* Copyright (C) 2010-2011 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.coregui.client.components.form;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import com.smartgwt.client.types.DSOperationType;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.BooleanItem;
import com.smartgwt.client.widgets.form.fields.CanvasItem;
import com.smartgwt.client.widgets.form.fields.CheckboxItem;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.HiddenItem;
import com.smartgwt.client.widgets.form.fields.SpacerItem;
import com.smartgwt.client.widgets.form.fields.StaticTextItem;
import org.rhq.coregui.client.CoreGUI;
import org.rhq.coregui.client.Messages;
/**
* A subclass of SmartGWT's DynamicForm widget that can provides additional layout settings and features.
*
* @author Ian Springer
*/
public class EnhancedDynamicForm extends DynamicForm {
protected Messages MSG = CoreGUI.getMessages();
public static final String OUTPUT_AS_HTML_ATTRIBUTE = "outputAsHTML";
private static final String FIELD_ID = "id";
private boolean isReadOnly;
public EnhancedDynamicForm() {
this(false);
}
public EnhancedDynamicForm(boolean readOnly) {
this(readOnly, false);
}
public EnhancedDynamicForm(boolean readOnly, boolean isNewRecord) {
super();
this.isReadOnly = readOnly;
if (isNewRecord) {
setSaveOperationType(DSOperationType.ADD);
}
// Layout Settings
//setWidth(640);
//setWidth100();
setCellPadding(3);
// Default to 4 columns, i.e.: itemOneTitle | itemOneValue | itemTwoTitle | itemTwoValue
setNumCols(4);
setColWidths(75, 200, 75, 200);
//setTitleWidth(100);
setWrapItemTitles(false);
// Other Display Settings
if (readOnly) {
setHiliteRequiredFields(false);
} else {
setHiliteRequiredFields(true);
setRequiredTitleSuffix(" <span class='requiredFieldMarker'>*</span> :");
}
// DataSource Settings
setUseAllDataSourceFields(false);
setAutoFetchData(false);
// Validation Settings
setStopOnError(false);
}
@Override
// NOTE: It's important to override setFields(), rather than setItems(), since setItems() is an alias method
// which simply delegates to setFields().
public void setFields(FormItem... items) {
List<FormItem> itemsList = new ArrayList<FormItem>();
boolean hasIdField = false;
for (FormItem item : items) {
if (item.getName().equals(FIELD_ID)) {
hasIdField = true;
}
if (this.isReadOnly) {
if ((item instanceof StaticTextItem) || (item instanceof CanvasItem) || (item instanceof SpacerItem)) {
// note: EditableFormItem is a subclass of CanvasItem
if (item instanceof EditableFormItem) {
((EditableFormItem) item).setReadOnly(true);
}
itemsList.add(item);
} else {
StaticTextItem staticItem = new StaticTextItem(item.getName(), item.getTitle());
Boolean showTitle = (item.getShowTitle() != null) ? item.getShowTitle() : true;
staticItem.setShowTitle(showTitle);
staticItem.setTooltip(item.getTooltip());
String displayValue = item.getDisplayValue();
staticItem.setValue(displayValue);
staticItem.setColSpan(item.getAttribute("colSpan"));
Boolean outputAsHtml = item.getAttributeAsBoolean(OUTPUT_AS_HTML_ATTRIBUTE);
if (Boolean.TRUE.equals(outputAsHtml) && null != displayValue && !displayValue.isEmpty()) {
staticItem.setEscapeHTML(true);
}
// TODO: Any other fields we should copy? icons?
if ((item instanceof BooleanItem) || (item instanceof CheckboxItem)) {
LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>();
valueMap.put("true", MSG.common_val_yes());
valueMap.put("false", MSG.common_val_no());
staticItem.setValueMap(valueMap);
}
itemsList.add(staticItem);
}
} else {
itemsList.add(item);
}
}
// If the dataSource has an "id" field, make sure the form does too.
if (!hasIdField && getDataSource() != null && getDataSource().getField(FIELD_ID) != null) {
FormItem idItem;
if (isNewRecord() != null && isNewRecord() || !CoreGUI.isDebugMode()) {
idItem = new HiddenItem(FIELD_ID);
} else {
idItem = new StaticTextItem(FIELD_ID, MSG.common_title_id());
}
itemsList.add(0, idItem);
}
for (FormItem item : itemsList) {
if (item instanceof StaticTextItem) {
item.setRequired(false);
} else {
item.setValidateOnExit(true);
}
//item.setWidth("*"); // this causes a JavaScript exception ... :-(
item.setWidth(195);
}
super.setFields((FormItem[]) itemsList.toArray(new FormItem[itemsList.size()]));
}
public boolean isReadOnly() {
return isReadOnly;
}
}