blob: b54adc43db3e80c0b5eacefbb3213590bc1be3ab [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2006 Sybase, Inc. and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.dialog;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jdt.core.IType;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
import org.eclipse.jst.jsf.facesconfig.emf.ListEntriesType;
import org.eclipse.jst.jsf.facesconfig.emf.ManagedBeanType;
import org.eclipse.jst.jsf.facesconfig.emf.ManagedPropertyType;
import org.eclipse.jst.jsf.facesconfig.emf.MapEntriesType;
import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
import org.eclipse.jst.jsf.facesconfig.ui.section.AbstractFacesConfigSection;
import org.eclipse.jst.jsf.facesconfig.ui.util.JavaBeanProperty;
import org.eclipse.jst.jsf.facesconfig.ui.util.JavaBeanUtils;
import org.eclipse.jst.jsf.facesconfig.ui.util.JavaClassUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
/**
* The dialog is for adding and editing managed property.
*
* @author sfshi
*
*/
public class AddEditManagedPropertyDialog extends Dialog {
private static final int MIN_DIALOG_WIDTH = 300;
private static final int DEFAULT_CONTROL_WIDTH = 200;
private ComboDialogField nameField;
private ClassButtonDialogField classField;
private ComboDialogField valueTypeField;
private StringButtonDialogField valueField;
private IProject project;
private String propertyName;
private String propertyClass;
private String valueType;
/**
* the value could be a string, or instance of <code>NullValueType</code>,
* <code>MapEntriesType</code> and <code>ListEntriesType</code>.
*/
private Object valueObject;
private ManagedBeanType managedBean;
/**
* the list of this bean properties.
*/
private List beanPropertyList;
/**
* the managed-property object that is editing, but it will be read-only.
*/
private ManagedPropertyType managedProperty;
// private FormToolkit toolkit;
private Composite parent;
private static final String[] valueTypes = { IFacesConfigConstants.VALUE,
IFacesConfigConstants.NULL_VALUE,
IFacesConfigConstants.MAP_ENTRIES,
IFacesConfigConstants.LIST_ENTRIES };
private boolean isNew;
private AbstractFacesConfigSection section;
/**
* constructor for adding a managed property.
*
* @param parentShell
* @param managedBean
* @param section
*/
public AddEditManagedPropertyDialog(Shell parentShell,
ManagedBeanType managedBean, AbstractFacesConfigSection section) {
super(parentShell);
this.isNew = true;
this.managedBean = managedBean;
this.section = section;
}
/**
*
* @param parentShell
* @param managedProperty
* @param section
*/
public AddEditManagedPropertyDialog(Shell parentShell,
ManagedPropertyType managedProperty, AbstractFacesConfigSection section) {
super(parentShell);
this.isNew = false;
this.managedProperty = managedProperty;
this.managedBean = (ManagedBeanType) managedProperty.eContainer();
this.section = section;
}
/*
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
if (isNew)
newShell.setText(EditorMessages.AddEditManagedPropertyDialog_Add);
else
newShell.setText(EditorMessages.AddEditManagedPropertyDialog_Edit);
}
/*
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea(Composite parent_) {
Composite container = new Composite(parent_, SWT.FILL);
this.parent = container;
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = layout.marginHeight = 5;
container.setLayout(layout);
GridData gd = new GridData(GridData.FILL_BOTH);
container.setLayoutData(gd);
nameField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY
| SWT.BORDER);
nameField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_PropertyName);
int propertyCount = 0;
beanPropertyList = getBeanPropertyList(managedBean);
if (beanPropertyList != null)
propertyCount = beanPropertyList.size();
if (propertyCount > 0) {
String[] propertyNames = new String[propertyCount];
for (int i = 0; i < propertyCount; i++) {
JavaBeanProperty property = (JavaBeanProperty) beanPropertyList
.get(i);
propertyNames[i] = property.getName();
}
nameField.setItems(propertyNames);
}
nameField.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
public void dialogFieldApplied(DialogField field) {
handleNameSelection(((ComboDialogField) field).getText());
}
});
classField = new ClassButtonDialogField(null);
classField.setProject(getProject());
classField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_PropertyClass);
valueTypeField = new ComboDialogField(SWT.DROP_DOWN | SWT.READ_ONLY
| SWT.BORDER);
valueTypeField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_ValueType);
valueTypeField.setItems(valueTypes);
valueTypeField
.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
public void dialogFieldApplied(DialogField field) {
updateValueStatus();
}
});
valueField = new StringButtonDialogField(new IStringButtonAdapter() {
public void changeControlPressed(DialogField field) {
handleChangeValue(valueTypeField.getText(),
((StringButtonDialogField) field).getText());
}
});
valueField.setLabelText(EditorMessages.ManagedBeanPropertyEditDialog_Value);
valueField.setButtonLabel(EditorMessages.UI_Button_Edit_more);
valueField.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
public void dialogFieldApplied(DialogField field) {
valueObject = ((StringButtonDialogField) field).getText();
}
});
GridData data = new GridData(GridData.FILL_BOTH);
container.setLayoutData(data);
int numberOfColumns = 5;
GridLayout gl = new GridLayout(numberOfColumns, false);
container.setLayout(gl);
nameField.doFillIntoGrid(null, container, numberOfColumns);
LayoutUtil.setWidthHint(nameField.getComboControl(null, container),
DEFAULT_CONTROL_WIDTH);
classField.doFillIntoGrid(null, container, numberOfColumns - 1);
data = new GridData(SWT.FILL, SWT.CENTER, false, false);
data.horizontalSpan = 2;
classField.getChangeControl(null, container).setLayoutData(data);
LayoutUtil.setWidthHint(classField.getTextControl(null, container),
DEFAULT_CONTROL_WIDTH);
valueTypeField.doFillIntoGrid(null, container, numberOfColumns);
valueField.doFillIntoGrid(null, container, numberOfColumns);
LayoutUtil.setHorizontalGrabbing(classField.getTextControl(null,
container));
valueTypeField.selectItem(0);
if (!isNew && managedProperty != null) {
initFields();
}
return container;
}
private void initFields() {
if (managedProperty.getPropertyName() != null)
nameField.setText(managedProperty.getPropertyName()
.getTextContent());
if (managedProperty.getPropertyClass() != null)
classField.setText(managedProperty.getPropertyClass()
.getTextContent());
if (managedProperty.getValue() != null) {
valueTypeField.setText(valueTypes[0]);
valueField.setText(managedProperty.getValue().getTextContent());
} else if (managedProperty.getNullValue() != null)
valueTypeField.setText(valueTypes[1]);
else if (managedProperty.getMapEntries() != null)
valueTypeField.setText(valueTypes[2]);
else if (managedProperty.getListEntries() != null)
valueTypeField.setText(valueTypes[3]);
else
valueTypeField.setText(valueTypes[0]);
updateValueStatus();
}
/**
* @param text
*/
protected void handleNameSelection(String text) {
int propertyCount = 0;
if (beanPropertyList != null)
propertyCount = beanPropertyList.size();
if (propertyCount > 0) {
for (int i = 0; i < propertyCount; i++) {
JavaBeanProperty property = (JavaBeanProperty) beanPropertyList
.get(i);
if (property.getName().equals(text.trim())) {
classField.setText(property.getQualifiedType());
break;
}
}
}
}
private void updateValueStatus() {
if (valueField == null) {
return;
}
valueObject = null;
if (valueTypeField.getText().equalsIgnoreCase(
IFacesConfigConstants.NULL_VALUE)) {
valueField.setEnabled(false);
valueObject = FacesConfigFactory.eINSTANCE.createNullValueType();
} else if (valueTypeField.getText().equalsIgnoreCase(
IFacesConfigConstants.MAP_ENTRIES)
|| valueTypeField.getText().equalsIgnoreCase(
IFacesConfigConstants.LIST_ENTRIES)) {
valueField.getTextControl(null, parent).setEditable(false);
valueField.setEnabled(true);
} else {
valueObject = valueField.getText(); //Bug 173831
valueField.getTextControl(null, parent).setEditable(true);
valueField.setEnabled(true);
}
}
/**
* @param valueType_
* @param value
*/
protected void handleChangeValue(String valueType_, String value) {
if (valueType_.equalsIgnoreCase(IFacesConfigConstants.VALUE)) {
handleChangeLongStringValue(value);
} else if (valueType_
.equalsIgnoreCase(IFacesConfigConstants.MAP_ENTRIES)) {
handleChangeMapEntries();
} else if (valueType_
.equalsIgnoreCase(IFacesConfigConstants.LIST_ENTRIES)) {
handleChangeListEntries();
}
}
/**
* @param textControl
*/
private void handleChangeLongStringValue(String value) {
EditValueDialog valueDialog = new EditValueDialog(EditorPlugin
.getActiveShell(), value);
if (valueDialog.open() == Window.OK) {
valueField.setText((String) valueDialog.getResultData());
valueObject = valueDialog.getResultData();
}
}
/**
*
*/
private void handleChangeMapEntries() {
MapEntriesType mapEntries;
if (valueObject instanceof MapEntriesType)
mapEntries = (MapEntriesType) valueObject;
else if (isNew || managedProperty.getMapEntries() == null) {
mapEntries = FacesConfigFactory.eINSTANCE.createMapEntriesType();
} else {
mapEntries = EcoreUtil.copy(managedProperty
.getMapEntries());
}
EditMapEntriesDialog dialog = new EditMapEntriesDialog(EditorPlugin
.getActiveShell(), mapEntries, section);
if (dialog.open() == Dialog.OK) {
valueObject = dialog.getMapEntries();
} else {
//user cancel the dialog, then restore.
if (!isNew && managedProperty.getMapEntries() != null)
valueObject = EcoreUtil.copy(managedProperty
.getMapEntries());
// else
// valueObject = null;
}
}
private void handleChangeListEntries() {
ListEntriesType listEntries;
if (valueObject instanceof ListEntriesType)
listEntries = (ListEntriesType) valueObject;
else if (isNew || managedProperty.getListEntries() == null) {
listEntries = FacesConfigFactory.eINSTANCE.createListEntriesType();
} else {
listEntries = EcoreUtil.copy(managedProperty
.getListEntries());
}
EditListEntriesDialog dialog = new EditListEntriesDialog(EditorPlugin
.getActiveShell(), listEntries, section);
if (dialog.open() == Dialog.OK) {
valueObject = dialog.getListEntries();
} else {
//user cancel the dialog, then restore.
if (!isNew && managedProperty.getListEntries() != null)
valueObject = EcoreUtil.copy(managedProperty
.getListEntries());
// else
// valueObject = null;
}
}
/**
* Get a list of JavaBeanProperty that from the managed bean class.
*
* @return
*/
private List getBeanPropertyList(ManagedBeanType managedBean_) {
if (managedBean_.getManagedBeanClass() == null)
return null;
String beanClassName = managedBean_.getManagedBeanClass()
.getTextContent();
IType classType = JavaClassUtils.getType(getProject(), beanClassName);
if (classType == null) {
return null;
}
List list = new ArrayList();
JavaBeanProperty[] properties = JavaBeanUtils
.getBeanProperties(classType);
if (properties != null) {
for (int i = 0; i < properties.length; i++) {
list.add(properties[i]);
}
}
return list;
}
/*
* @see org.eclipse.jface.window.Window#getInitialSize()
*/
protected Point getInitialSize() {
Point shellSize = super.getInitialSize();
return new Point(Math.max(
convertHorizontalDLUsToPixels(MIN_DIALOG_WIDTH), shellSize.x),
shellSize.y);
}
/**
* @return the project
*/
public IProject getProject() {
if (project == null) {
project = (IProject) section.getPage().getEditor().getAdapter(
IProject.class);
}
return project;
}
/**
*
*/
protected void okPressed() {
propertyName = nameField.getText();
propertyClass = classField.getText();
valueType = valueTypeField.getText();
super.okPressed();
}
/**
* @return the property class
*/
public String getPropertyClass() {
return propertyClass;
}
/**
* @param attributeClass
*/
public void setAttributeClass(String attributeClass) {
this.propertyClass = attributeClass;
}
/**
* @return the property name
*/
public String getPropertyName() {
return propertyName;
}
/**
* @param attributeName
*/
public void setAttributeName(String attributeName) {
this.propertyName = attributeName;
}
/**
* @return the value type
*/
public String getValueType() {
return valueType;
}
/**
* @param defaultValue
*/
public void setValueType(String defaultValue) {
this.valueType = defaultValue;
}
/**
* @param project
*/
public void setProject(IProject project) {
this.project = project;
}
/**
* @return the value object
*/
public Object getValueObject() {
return valueObject;
}
/**
* @param valueObject
*/
public void setValueObject(Object valueObject) {
this.valueObject = valueObject;
}
}