/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.forms;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
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.Label;
import org.jboss.tools.common.editor.form.RightFormContainer;
import org.jboss.tools.common.meta.XModelEntity;
import org.jboss.tools.common.meta.key.WizardKeys;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.ui.ModelUIMessages;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.attribute.XAttributeSupport;
import org.jboss.tools.common.model.ui.attribute.adapter.XChildrenTableStructuredAdapter;
import org.jboss.tools.common.model.ui.attribute.editor.ExtendedFieldEditor;
import org.jboss.tools.common.model.ui.attribute.editor.IFieldEditor;
import org.jboss.tools.common.model.ui.attribute.editor.IPropertyEditor;
import org.jboss.tools.common.model.ui.attribute.editor.IPropertyFieldEditor;
import org.jboss.tools.common.model.ui.attribute.editor.JavaEclipseChoicerEditor;
import org.jboss.tools.common.model.ui.attribute.editor.TableStructuredEditor;
import org.jboss.tools.common.model.ui.attribute.editor.TableStructuredFieldEditor;
import org.jboss.tools.common.model.ui.widgets.IWidgetSettings;
/**
* @author Igels
*
*/
public class Form extends ExpandableForm {
private XAttributeSupport support;
private XModelObject xmo;
// private XModel model;
private TableStructuredEditor tableEditor;
private XChildrenTableStructuredAdapter tableAdapter;
// private IPropertyEditor[] editors;
private IFormData formData;
private boolean table = false;
private ArrayList<ExtendedFieldEditor> fieldEditors = new ArrayList<ExtendedFieldEditor>();
private Form() {}
protected XAttributeSupport getSupport() {
return support;
}
protected XModelObject getModelObject() {
return xmo;
}
public void dispose() {
super.dispose();
if (support!=null) support.dispose();
support = null;
if (tableEditor!=null) tableEditor.dispose();
tableEditor = null;
if (tableAdapter!=null) tableAdapter.dispose();
tableAdapter = null;
if (fieldEditors!=null) {
Object object;
Iterator i = fieldEditors.iterator();
while (i.hasNext()) {
object = i.next();
if (object instanceof ExtendedFieldEditor) ((ExtendedFieldEditor)object).dispose();
}
fieldEditors.clear();
}
fieldEditors = null;
}
public Form(IFormData formData) {
this.formData = formData;
table = formData.getEntities()!=null;
if(!table) {
/// editors = new IPropertyEditor[formData.getAttributes().length];
}
this.setHeadingText(formData.getHeader());
support = new XAttributeSupport(formData.getWidgetSettings());
this.setCollapsable(Boolean.TRUE.booleanValue());
}
protected Control createClientArea(Composite parent, IWidgetSettings settings) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setBackgroundMode(SWT.INHERIT_DEFAULT);
settings.setupControl(composite);
GridLayout layout = new GridLayout(2, Boolean.FALSE.booleanValue());
layout.horizontalSpacing = 5;
layout.verticalSpacing = 5;
layout.marginHeight = 5;
layout.marginWidth = 5;
composite.setLayout(layout);
Control[] control = null;
GridData gd = null;
String description = formData.getDescription();
if(description!=null && description.length()>0) {
Label label = new Label(composite, SWT.WRAP);
label.setText(description);
settings.setupControl(label);
gd = new GridData();
gd.horizontalSpan = 2;
label.setLayoutData(gd);
}
if (xmo==null) return composite;
IFormAttributeData[] attributes = formData.getAttributes();
if(!table) {
for(int i=0; i<attributes.length; i++) {
IPropertyEditor editor = support.getPropertyEditorByName(attributes[i].getName());
if(editor != null) {
if(attributes[i].getWraperClassName()!=null
&& !(editor instanceof JavaEclipseChoicerEditor)) {
try {
Class wraperClass = Class.forName(attributes[i].getWraperClassName());
Constructor wraperConstructor = wraperClass.getConstructor(new Class[]{IWidgetSettings.class});
IPropertyFieldEditor wraper = (IPropertyFieldEditor)wraperConstructor.newInstance(new Object[]{formData.getWidgetSettings()});
((ExtendedFieldEditor)wraper).setLabelText(editor.getLabelText());
wraper.setPropertyEditor(editor);
((ExtendedFieldEditor)wraper).fillIntoGrid(composite, 2);
((ExtendedFieldEditor)wraper).setEnabled(xmo.isAttributeEditable(attributes[i].getName()));
fieldEditors.add((ExtendedFieldEditor)wraper);
support.registerFieldEditor(editor.getAttributeName(), (ExtendedFieldEditor)wraper);
} catch (ClassNotFoundException e) {
ModelUIPlugin.getPluginLog().logError(e);
} catch (NoSuchMethodException e) {
ModelUIPlugin.getPluginLog().logError(e);
} catch (InstantiationException e) {
ModelUIPlugin.getPluginLog().logError(e);
} catch (IllegalAccessException e) {
ModelUIPlugin.getPluginLog().logError(e);
} catch (InvocationTargetException e) {
ModelUIPlugin.getPluginLog().logError(e);
}
} else {
ExtendedFieldEditor fieldEditor = (ExtendedFieldEditor)((IFieldEditor)editor.getFieldEditor(composite));
fieldEditors.add(fieldEditor);
control = ((IFieldEditor)fieldEditor).getControls(composite);
control[0].setLayoutData(attributes[i].getLayoutDataFactory().createLayoutData(AttributeControlType.LABEL));
control[1].setLayoutData(attributes[i].getLayoutDataFactory().createLayoutData(AttributeControlType.EDITOR));
fieldEditor.setEnabled(xmo.isAttributeEditable(attributes[i].getName()));
support.registerFieldEditor(editor.getAttributeName(), (ExtendedFieldEditor)fieldEditor);
}
} else {
ModelUIPlugin.getPluginLog().logInfo( NLS.bind(ModelUIMessages.Form_CANNOT_LOAD_ATTRIBUTE, attributes[i].getName()));
}
}
} else {
ExtendedFieldEditor fieldEditor = (ExtendedFieldEditor)((IFieldEditor)tableEditor.getFieldEditor(composite));
fieldEditors.add(fieldEditor);
control = ((IFieldEditor)fieldEditor).getControls(composite);
control[0].dispose(); // cannot show label
if(fieldEditor instanceof TableStructuredFieldEditor) {
((TableStructuredFieldEditor)fieldEditor).updateTableLayoutData();
gd = (GridData)control[1].getLayoutData();
}
if(gd == null) {
gd = new GridData(GridData.FILL_HORIZONTAL);
gd.heightHint = 300;
}
gd.horizontalSpan = 2;
control[1].setLayoutData(gd);
fieldEditor.setEnabled(xmo.isObjectEditable());
}
return composite;
}
public void initialize(Object model) {
this.xmo = (XModelObject)model;
if(xmo == null) {
ModelUIPlugin.getPluginLog().logInfo( "Error to create form "+formData.getHeader()+". Model object cannot be null.", new IllegalArgumentException("Parameter cannot be null")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return;
}
this.model = xmo.getModel();
this.support.init(xmo);
this.support.setAutoStore(Boolean.TRUE.booleanValue());
IFormAttributeData[] attributes = formData.getAttributes();
IFormActionData[] actions = formData.getActions();
String[] entities = formData.getEntities();
if(!table) {
} else {
this.tableAdapter = new XChildrenTableStructuredAdapter();
this.tableAdapter.setShownEntities(entities/*new String[]{entities[0]}*/);
this.tableAdapter.getActionMapping().clear();
XModelEntity childEntity = null;
if(entities != null) for (int i = 0; i < entities.length && childEntity == null; i++) {
childEntity = xmo.getModel().getMetaData().getEntity(entities[i]);
}
for(int i=0; i<actions.length; i++) {
this.tableAdapter.getActionMapping().put(actions[i].getActionLabel(), actions[i].getActionPath());
}
String[] shownProperties = new String[attributes.length];
String[] columnLabels = new String[attributes.length];
int[] widths = new int[attributes.length];
for(int i=0; i<attributes.length; i++) {
shownProperties[i] = attributes[i].getName();
String label = null;
if(attributes[i].getDisplayName() != null && attributes[i].getDisplayName().length() > 0) {
label = attributes[i].getDisplayName();
} else if(childEntity != null && childEntity.getAttribute(attributes[i].getName()) != null) {
label = WizardKeys.getAttributeDisplayName(childEntity.getAttribute(attributes[i].getName()), true);
}
columnLabels[i] = label != null ? label : "";
widths[i] = attributes[i].getWidth();
}
this.tableAdapter.setShownProperties(shownProperties);
this.tableAdapter.setColumnLabels(columnLabels);
this.tableAdapter.setWidths(widths);
this.tableAdapter.setModelObject(xmo);
this.tableEditor = new TableStructuredEditor(formData.getWidgetSettings());
this.tableEditor.setLabelText(""); //$NON-NLS-1$
this.tableEditor.setInput(this.tableAdapter);
}
}
private ISelectionChangedListener findSelectionChangedListener(IFormContainer container) {
if (container==null) {
return null;
}
if (container instanceof RightFormContainer) {
return ((RightFormContainer)container).getSelectionChangedListener();
}
return findSelectionChangedListener(container.getParent());
}
public void setParent(IFormContainer container) {
super.setParent(container);
if (this.tableAdapter!=null) {
this.tableAdapter.setSelectionChangedListener(findSelectionChangedListener(container));
}
}
public void update() {
if (support != null) {
support.load();
support.updateEnablementByModelObject();
}
}
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
/*
if (this.support!=null) {
support.setEnabled(enabled);
}
if (fieldEditors!=null && fieldEditors.size()>0) {
Iterator i = fieldEditors.iterator();
while (i.hasNext()) ((ExtendedFieldEditor)i.next()).setEnabled(enabled);
}
*/
}
/* (non-Javadoc)
* @see org.jboss.tools.common.model.ui.forms.IForm#doGlobalAction(java.lang.String)
*/
public boolean doGlobalAction(String actionId) {
return support.doGlobalAction(actionId);
}
}