/******************************************************************************* * Copyright (c) 2009 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.configuration.editors; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; import org.eclipse.emf.edit.provider.IItemPropertySource; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.forms.IFormColors; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.FormToolkit; import org.jboss.tools.smooks.configuration.editors.utils.FieldAssistDisposer; import org.jboss.tools.smooks.configuration.editors.utils.FieldMarkerWrapper; import org.jboss.tools.smooks.configuration.editors.utils.IFieldDialog; import org.jboss.tools.smooks.configuration.editors.utils.IModelProcsser; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; import org.jboss.tools.smooks.editor.ISmooksModelProvider; import org.jboss.tools.smooks.model.smooks.SmooksPackage; import org.jboss.tools.smooks.model.smooks.SmooksResourceListType; /** * @author Dart (dpeng@redhat.com) * <p> * Apr 9, 2009 */ public class PropertyUICreator implements IPropertyUICreator { protected IModelProcsser fileFiledEditorModelProcess; protected IHyperlinkListener fileFiledEditorLinkListener; protected List<ViewerFilter> viewerFilters = null; /* * (non-Javadoc) * * @seeorg.jboss.tools.smooks.configuration.editors.IPropertyUICreator# * createPropertyUI(org.eclipse.ui.forms.widgets.FormToolkit, * org.eclipse.swt.widgets.Composite, * org.eclipse.emf.edit.provider.IItemPropertyDescriptor, java.lang.Object, * org.eclipse.emf.ecore.EAttribute) */ public AttributeFieldEditPart createPropertyUI(FormToolkit toolkit, Composite parent, IItemPropertyDescriptor propertyDescriptor, Object model, EAttribute feature, ISmooksModelProvider formEditor, IEditorPart editorPart) { if (isBeanIDRefFieldFeature(feature)) { return createBeanIDRefFieldEditor(toolkit, parent, propertyDescriptor, model, feature, formEditor); } if (isSelectorFeature(feature)) { return createSelectorFieldEditor(toolkit, parent, propertyDescriptor, model, feature, formEditor, editorPart); } if (isJavaTypeFeature(feature)) { return createJavaTypeSearchEditor(toolkit, parent, propertyDescriptor, model, feature, formEditor); } if (isFileSelectionFeature(feature)) { return createFileSelectionFieldEditor(toolkit, parent, propertyDescriptor, model, feature, formEditor); } if (isConditionSelectionFeature(feature)) { return SmooksUIUtils.createConditionsChoiceFieldEditor(parent, toolkit, propertyDescriptor, model); // return parent; } if (feature == SmooksPackage.eINSTANCE.getAbstractReader_TargetProfile()) { } // EClassifier typeClazz = feature.getEType(); // if (typeClazz instanceof EEnum) { // return createEnumFieldEditor(detailsComposite, feature, (EEnum) typeClazz, formToolkit, // itemPropertyDescriptor); // } // if (typeClazz.getInstanceClass() == String.class) { // return createStringFieldEditor(detailsComposite, feature, formToolkit, itemPropertyDescriptor); // } // if (typeClazz.getInstanceClass() == Boolean.class || typeClazz.getInstanceClass() == boolean.class) { // return createBooleanFieldEditor(detailsComposite, feature, formToolkit, itemPropertyDescriptor); // } // if (typeClazz.getInstanceClass() == Integer.class || typeClazz.getInstanceClass() == int.class) { // return createIntegerFieldEditor(detailsComposite, feature, formToolkit, itemPropertyDescriptor); // } return null; } protected boolean isConditionSelectionFeature(EAttribute feature) { return false; } public IHyperlinkListener getFileFiledEditorLinkListener() { return fileFiledEditorLinkListener; } public void setFileFiledEditorLinkListener(IHyperlinkListener fileFiledEditorLinkListener) { this.fileFiledEditorLinkListener = fileFiledEditorLinkListener; } public IModelProcsser getFileFiledEditorModelProcess() { return fileFiledEditorModelProcess; } public void setFileFiledEditorModelProcess(IModelProcsser fileFiledEditorModelProcess) { this.fileFiledEditorModelProcess = fileFiledEditorModelProcess; } public List<ViewerFilter> getFileDialogViewerFilters() { return viewerFilters; } public void setDialogViewerFilters(List<ViewerFilter> viewerFilters) { this.viewerFilters = viewerFilters; } public IResource getResource(EObject model) { return SmooksUIUtils.getResource(model); } public IJavaProject getJavaProject(EObject model) { return SmooksUIUtils.getJavaProject(model); } public List<AttributeFieldEditPart> createExtendUIOnBottom(AdapterFactoryEditingDomain editingdomain, FormToolkit toolkit, Composite parent, Object model, ISmooksModelProvider formEditor, IEditorPart editorPart) { return Collections.emptyList(); } protected boolean isFileSelectionFeature(EAttribute attribute) { return false; } public AttributeFieldEditPart createFileSelectionFieldEditor(FormToolkit toolkit, Composite parent, IItemPropertyDescriptor propertyDescriptor, Object model, EAttribute feature, ISmooksModelProvider formEditor) { final ISmooksModelProvider provider = formEditor; IFieldDialog dialog = new IFieldDialog() { public Object open(Shell shell) { FileSelectionWizard wizard = new FileSelectionWizard(); EObject model = provider.getSmooksModel(); if (model != null) { URI uri = model.eResource().getURI(); if (uri.isPlatformResource()) { String path = uri.toPlatformString(true); IResource workspaceResource = ResourcesPlugin.getWorkspace().getRoot().findMember( new Path(path)); if (workspaceResource instanceof IFile) { workspaceResource = ((IFile) workspaceResource).getParent(); } wizard.setInitSelections(new Object[] { workspaceResource }); } } wizard.setViewerFilters(getFileDialogViewerFilters()); WizardDialog dialog = new WizardDialog(shell, wizard); if (dialog.open() == Dialog.OK) { IModelProcsser p = getModelProcesser(); String path = wizard.getFilePath(); if (p != null) { path = p.unwrapValue(path).toString(); } return path; } return null; } public IModelProcsser getModelProcesser() { return getFileFiledEditorModelProcess(); } public void setModelProcesser(IModelProcsser processer) { } }; return SmooksUIUtils.createDialogFieldEditor(parent, toolkit, propertyDescriptor, Messages.PropertyUICreator_browsebutton, dialog, (EObject) model, true, getFileFiledEditorLinkListener()); } protected boolean isSelectorFeature(EAttribute attribute) { return false; } public AttributeFieldEditPart createSelectorFieldEditor(FormToolkit toolkit, Composite parent, IItemPropertyDescriptor propertyDescriptor, Object model, EAttribute feature, ISmooksModelProvider formEditor, IEditorPart editorPart) { // SmooksGraphicsExtType ext = formEditor.getSmooksGraphicsExt(); return SmooksUIUtils.createSelectorFieldEditor(toolkit, parent, propertyDescriptor, model, editorPart); } public boolean isJavaTypeFeature(EAttribute attribute) { return false; } public AttributeFieldEditPart createJavaTypeSearchEditor(FormToolkit toolkit, Composite parent, IItemPropertyDescriptor propertyDescriptor, Object model, EAttribute feature, ISmooksModelProvider formEditor) { if (model instanceof EObject) return SmooksUIUtils.createJavaTypeSearchFieldEditor(parent, toolkit, propertyDescriptor, (EObject) model, formEditor); return null; } protected boolean isBeanIDRefFieldFeature(EAttribute attribute) { return false; } public AttributeFieldEditPart createBeanIDRefFieldEditor(FormToolkit toolkit, Composite parent, IItemPropertyDescriptor propertyDescriptor, Object model, EAttribute feature, ISmooksModelProvider formEditor) { if (model instanceof EObject) { AttributeFieldEditPart editPart = new AttributeFieldEditPart(); SmooksResourceListType smooksResourceList = getSmooksResourceList((EObject) model); if (smooksResourceList != null) { FieldMarkerWrapper wrapper = SmooksUIUtils.createFieldEditorLabel(null, parent, toolkit, propertyDescriptor, model, false); editPart.setFieldMarker(wrapper.getMarker()); Composite tcom = toolkit.createComposite(parent); GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginLeft = 0; layout.marginRight = 0; layout.horizontalSpacing = 0; tcom.setLayout(layout); FieldMarkerComposite notificationComposite = new FieldMarkerComposite(tcom, SWT.NONE); GridData gd = new GridData(); gd.heightHint = 8; gd.widthHint = 8; gd.horizontalAlignment = GridData.BEGINNING; gd.verticalAlignment = GridData.BEGINNING; notificationComposite.setLayoutData(gd); editPart.setFieldMarker(notificationComposite); final Combo combo = new Combo(tcom, SWT.BORDER); editPart.setContentControl(combo); gd = new GridData(GridData.FILL_HORIZONTAL); combo.setLayoutData(gd); tcom.setLayoutData(gd); Object editValue = SmooksUIUtils.getEditValue(propertyDescriptor, model); if (editValue != null) { combo.setText(editValue.toString()); } List<String> list = SmooksUIUtils.getBeanIdStringList(smooksResourceList); for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) { String beanId = (String) iterator.next(); combo.add(beanId); } int selectIndex = list.indexOf(editValue); if (selectIndex != -1) { combo.select(selectIndex); } final IItemPropertyDescriptor ip = propertyDescriptor; final Object cmodel = model; combo.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { if (combo.getText() == null || combo.getText().length() == 0) { ip.setPropertyValue(cmodel, null); return; } Object editValue = SmooksUIUtils.getEditValue(ip, cmodel); if (combo.getText().equals(editValue)) { return; } ip.setPropertyValue(cmodel, combo.getText()); } }); final FieldAssistDisposer disposer = SmooksUIUtils.addBeanIdRefAssistToCombo(combo, (EObject) model); combo.addDisposeListener(new DisposeListener() { /* * (non-Javadoc) * * @see * org.eclipse.swt.events.DisposeListener#widgetDisposed * (org.eclipse.swt.events.DisposeEvent) */ public void widgetDisposed(DisposeEvent e) { disposer.dispose(); } }); return editPart; } } return null; } protected SmooksResourceListType getSmooksResourceList(EObject model) { EObject parent = model.eContainer(); while (parent != null && !(parent instanceof SmooksResourceListType)) { parent = parent.eContainer(); } if (parent instanceof SmooksResourceListType) { return (SmooksResourceListType) parent; } return null; } public boolean ignoreProperty(EAttribute feature) { return false; } public IItemPropertyDescriptor getPropertyDescriptor(AdapterFactoryEditingDomain editingDomain, EAttribute attribute, Object model) { IItemPropertySource itemPropertySource = (IItemPropertySource) editingDomain.getAdapterFactory().adapt(model, IItemPropertySource.class); List<IItemPropertyDescriptor> list = itemPropertySource.getPropertyDescriptors(model); for (Iterator<?> iterator = list.iterator(); iterator.hasNext();) { IItemPropertyDescriptor itemPropertyDescriptor = (IItemPropertyDescriptor) iterator.next(); if (itemPropertyDescriptor.getFeature(model) == attribute) { return itemPropertyDescriptor; } } return null; } protected List<AttributeFieldEditPart> createElementSelectionSection(String sectionTitle, AdapterFactoryEditingDomain editingdomain, FormToolkit toolkit, Composite parent, Object model, ISmooksModelProvider formEditor, IEditorPart editorPart, EAttribute nameAttribute, EAttribute namespaceAttribute) { IItemPropertySource itemPropertySource = (IItemPropertySource) editingdomain.getAdapterFactory().adapt(model, IItemPropertySource.class); List<IItemPropertyDescriptor> propertyDes = itemPropertySource.getPropertyDescriptors(model); IItemPropertyDescriptor createOnElementFeature = null; IItemPropertyDescriptor createOnElementFeatureNS = null; for (Iterator<?> iterator = propertyDes.iterator(); iterator.hasNext();) { IItemPropertyDescriptor itemPropertyDescriptor = (IItemPropertyDescriptor) iterator.next(); if (itemPropertyDescriptor.getFeature(model) == nameAttribute) { createOnElementFeature = itemPropertyDescriptor; } if (itemPropertyDescriptor.getFeature(model) == namespaceAttribute) { createOnElementFeatureNS = itemPropertyDescriptor; } } if (createOnElementFeature == null || createOnElementFeatureNS == null) { return Collections.emptyList(); } return createElementSelectionSection(sectionTitle, editingdomain, toolkit, parent, model, formEditor, editorPart, createOnElementFeature, createOnElementFeatureNS); } protected List<AttributeFieldEditPart> createElementSelectionSection(String sectionTitle, AdapterFactoryEditingDomain editingdomain, FormToolkit toolkit, Composite parent, Object model, ISmooksModelProvider formEditor, IEditorPart editorPart, IItemPropertyDescriptor createOnElementFeature, IItemPropertyDescriptor createOnElementFeatureNS) { Group group = new Group(parent, SWT.NONE); // Section section = toolkit.createSection(parent, Section.TITLE_BAR); // section.setText(sectionTitle); if (sectionTitle != null) { sectionTitle = " " + sectionTitle + " "; //$NON-NLS-1$ //$NON-NLS-2$ } group.setText(sectionTitle); // FontData fd = new FontData(); // fd.setStyle(SWT.BOLD); // group.setForeground(toolkit.getColors().getForeground()); FillLayout layout = new FillLayout(); layout.marginHeight = 0; layout.marginWidth = 0; // section.setLayout(layout); group.setLayout(layout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); // gd.heightHint = 100; gd.horizontalSpan = 2; // section.setLayoutData(gd); group.setLayoutData(gd); group.setForeground(toolkit.getColors().getColor(IFormColors.TITLE)); // Composite backComposite = toolkit.createComposite(section); // section.setClient(backComposite); // GridLayout gl = new GridLayout(); // gl.marginHeight = 0; // gl.marginWidth = 0; // gl.marginLeft = 1; // gl.marginRight = 1; // gl.marginBottom = 1; // backComposite.setLayout(gl); // backComposite.setBackground(toolkit.getColors().getColor(IFormColors.BORDER)); Composite container = toolkit.createComposite(group); group.setBackground(container.getBackground()); Font f = container.getFont(); if (f != null) { FontData fd = f.getFontData()[0]; if (fd != null) group.setFont(new Font(null, new FontData(fd.getName(), fd.getHeight(), SWT.BOLD))); } GridLayout glayout = new GridLayout(); glayout.numColumns = 2; container.setLayout(glayout); String name = Messages.PropertyUICreator_namelabel; if (((EAttribute) createOnElementFeature.getFeature(model)).isRequired()) { name += "*"; //$NON-NLS-1$ } AttributeFieldEditPart editPart1 = SmooksUIUtils.createSelectorFieldEditor(name, toolkit, container, createOnElementFeature, model, editorPart); editPart1.setAttribute(createOnElementFeature.getFeature(model)); String namespace = Messages.PropertyUICreator_nslabel; if (((EAttribute) createOnElementFeatureNS.getFeature(model)).isRequired()) { namespace += "*"; //$NON-NLS-1$ } AttributeFieldEditPart editPart2 = SmooksUIUtils.createStringFieldEditor(namespace, container, editingdomain, toolkit, createOnElementFeatureNS, model, false, false, false, 0, null, SmooksUIUtils.VALUE_TYPE_VALUE, null); editPart2.setAttribute(createOnElementFeatureNS.getFeature(model)); // gd = new GridData(GridData.FILL_HORIZONTAL); // gd.horizontalSpan = 2; // // toolkit.createSeparator(parent, SWT.HORIZONTAL).setLayoutData(gd); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; gd.heightHint = 8; Composite ccc = toolkit.createComposite(parent); ccc.setLayoutData(gd); // ccc.setBackground(new Color(null,128,128,128)); List<AttributeFieldEditPart> list = new ArrayList<AttributeFieldEditPart>(); list.add(editPart1); list.add(editPart2); AttributeFieldEditPart dummyEditPart = new AttributeFieldEditPart(); dummyEditPart.setAttribute(null); dummyEditPart.setContentControl(container); list.add(dummyEditPart); return list; } public List<AttributeFieldEditPart> createExtendUIOnTop(AdapterFactoryEditingDomain editingDomain, FormToolkit formToolkit, Composite detailsComposite, Object model, ISmooksModelProvider formEditor, IEditorPart editorPart) { return null; } }