/*
* RHQ Management Platform
* Copyright (C) 2005-2010 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 as published by
* the Free Software Foundation version 2 of the License.
*
* 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.coregui.client.components.table;
import java.util.Map;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.events.EditorEnterEvent;
import com.smartgwt.client.widgets.grid.events.EditorEnterHandler;
import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
/**
* A PropertyGrid based on a {@link ListGrid} that automatically creates two
* fields (one for name column and other for values column) and can display a
* custom editor for every row
*
* @author Dan Mihai Ile
*/
public class PropertyGrid extends ListGrid {
/**
* Map to hold the editors
*/
private Map<String, FormItem> editorsMap;
/**
* Hold the name of the attribute on a {@link Record} which contains the
* editorsMap key
*/
private String valueFieldAttribute;
/**
* Create a new {@link PropertyGrid} with two column fields (first for
* names, second for values)
*/
public PropertyGrid() {
// Create the 2 fields - one for names, other for values.
ListGridField nameField = new ListGridField();
nameField.setCanEdit(false);
ListGridField valueField = new ListGridField();
valueField.setCanEdit(true);
setFields(nameField, valueField);
// listeners to intercept when the user starts to edit data
addEditorEnterHandler(new EditorEnterHandler() {
public void onEditorEnter(EditorEnterEvent event) {
Record record = event.getRecord();
enableSpecificEditor(record);
}
});
addRecordClickHandler(new RecordClickHandler() {
public void onRecordClick(RecordClickEvent event) {
Record record = event.getRecord();
enableSpecificEditor(record);
}
});
}
/**
* The name column field
*
* @return
*/
public ListGridField getNameField() {
return getField(0);
}
/**
* The values column field
*
* @return
*/
public ListGridField getValuesField() {
return getField(1);
}
/**
* Set the name of the attribute from where the row will get the editor name
* to be used on the {@link Map} from where the rows will get its editors
* <p/>
* When an edit starts the {@link PropertyGrid} will retrieve the key of the
* editor form the row's attributes and use that key on the map to get the
* editor to be used
*
* @param attribute the name of the attribute on the rows that contains the key of
* the editor
* @param map a map that contains the key of the editor and the editor
*/
public void setEditorsMap(String attribute, Map<String, FormItem> map) {
this.valueFieldAttribute = attribute;
this.editorsMap = map;
}
/**
* Enable the specific editor for the given record
*
* @param record the record
*/
public void enableSpecificEditor(Record record) {
boolean readOnly = record.getAttributeAsBoolean("readOnly");
if (editorsMap != null && !readOnly) {
String attribute = record.getAttribute(valueFieldAttribute);
if (editorsMap.containsKey(attribute)) {
FormItem formItem = editorsMap.get(attribute);
getField(1).setEditorType(formItem);
}
}
}
}