/******************************************************************************* * 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.javabean12; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.events.IHyperlinkListener; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Hyperlink; import org.jboss.tools.smooks.configuration.editors.AttributeFieldEditPart; import org.jboss.tools.smooks.configuration.editors.PropertyUICreator; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; import org.jboss.tools.smooks.editor.ISmooksModelProvider; import org.jboss.tools.smooks.model.javabean12.BeanType; import org.jboss.tools.smooks.model.javabean12.Javabean12Factory; import org.jboss.tools.smooks.model.javabean12.Javabean12Package; import org.jboss.tools.smooks.model.javabean12.ValueType; import org.jboss.tools.smooks.model.javabean12.WiringType; /** * @author Dart (dpeng@redhat.com) * <p> * Apr 8, 2009 */ public class JavaBean12PropertyUICreator extends PropertyUICreator { /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.configuration.editors.IPropertyUICreator#canCreate * (org.eclipse.emf.edit.provider.IItemPropertyDescriptor, java.lang.Object, * org.eclipse.emf.ecore.EAttribute) */ public boolean canCreate(IItemPropertyDescriptor itemPropertyDescriptor, Object model, EAttribute feature) { if (feature == Javabean12Package.eINSTANCE.getBeanType_Class()) { return true; } return false; } /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.configuration.editors.PropertyUICreator#ignoreProperty * (org.eclipse.emf.ecore.EAttribute) */ @Override public boolean ignoreProperty(EAttribute feature) { if (feature == Javabean12Package.eINSTANCE.getBeanType_CreateOnElement()) { return true; } if (feature == Javabean12Package.eINSTANCE.getBeanType_CreateOnElementNS()) { return true; } return super.ignoreProperty(feature); } /* * (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 part) { if (feature == Javabean12Package.eINSTANCE.getBeanType_Class()) { return createBeanClassTextWithButton(parent, toolkit, propertyDescriptor, model , formEditor); } return super.createPropertyUI(toolkit, parent, propertyDescriptor, model, feature, formEditor, part); } /* * (non-Javadoc) * * @see * org.jboss.tools.smooks.configuration.editors.PropertyUICreator#createExtendUI * (org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain, * org.eclipse.ui.forms.widgets.FormToolkit, * org.eclipse.swt.widgets.Composite, java.lang.Object, * org.jboss.tools.smooks.configuration.editors.SmooksMultiFormEditor) */ @Override public List<AttributeFieldEditPart> createExtendUIOnTop(AdapterFactoryEditingDomain editingdomain, FormToolkit toolkit, Composite parent, Object model, ISmooksModelProvider formEditor, IEditorPart part) { return super.createExtendUIOnTop(editingdomain, toolkit, parent, model, formEditor, part); } /* * (non-Javadoc) * * @seeorg.jboss.tools.smooks.configuration.editors.PropertyUICreator# * createExtendUIOnBottom * (org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain, * org.eclipse.ui.forms.widgets.FormToolkit, * org.eclipse.swt.widgets.Composite, java.lang.Object, * org.jboss.tools.smooks.configuration.editors.SmooksMultiFormEditor) */ @Override public List<AttributeFieldEditPart> createExtendUIOnBottom(AdapterFactoryEditingDomain editingdomain, FormToolkit toolkit, Composite parent, Object model, ISmooksModelProvider formEditor, IEditorPart part) { List<AttributeFieldEditPart> lists = super.createExtendUIOnBottom(editingdomain, toolkit, parent, model, formEditor, part); Composite separator = toolkit.createCompositeSeparator(parent); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.heightHint = 1; gd.horizontalSpan = 2; separator.setLayoutData(gd); Hyperlink link = toolkit.createHyperlink(parent, "Add Binding", SWT.NONE); //$NON-NLS-1$ link.setEnabled(false); link.setVisible(false); final Composite fp = parent; final BeanType fb = (BeanType) model; final IEditorPart ff = part; link.addHyperlinkListener(new IHyperlinkListener() { /* * (non-Javadoc) * * @see * org.eclipse.ui.forms.events.IHyperlinkListener#linkActivated( * org.eclipse.ui.forms.events.HyperlinkEvent) */ public void linkActivated(HyperlinkEvent e) { addValueWiringAuto(fp, fb, ff); } /* * (non-Javadoc) * * @see * org.eclipse.ui.forms.events.IHyperlinkListener#linkEntered(org * .eclipse.ui.forms.events.HyperlinkEvent) */ public void linkEntered(HyperlinkEvent e) { // TODO Auto-generated method stub } /* * (non-Javadoc) * * @see * org.eclipse.ui.forms.events.IHyperlinkListener#linkExited(org * .eclipse.ui.forms.events.HyperlinkEvent) */ public void linkExited(HyperlinkEvent e) { // TODO Auto-generated method stub } }); gd = new GridData(); gd.horizontalSpan = 2; link.setLayoutData(gd); return lists; } private void addValueWiringAuto(Composite parent, BeanType bindings, IEditorPart formEditor) { boolean haveClassValue = false; if (bindings.eIsSet(Javabean12Package.Literals.BEAN_TYPE__CLASS)) { haveClassValue = true; } if (!haveClassValue) { MessageDialog.openError(parent.getShell(), Messages.JavaBean12PropertyUICreator_ErrorDialogTitle, Messages.JavaBean12PropertyUICreator_CantGetClassValueErrorMessage); return; } String className = bindings.getClass_(); if (className == null || className.length() == 0) { MessageDialog.openError(parent.getShell(), Messages.JavaBean12PropertyUICreator_ErrorDialogTitle, Messages.JavaBean12PropertyUICreator_ClassValueEmptyErrorMessage); return; } try { Class<?> clazz = SmooksUIUtils.loadClass(className, ((IFileEditorInput) formEditor.getEditorInput()) .getFile()); JavaBeanModel beanModel = JavaBeanModelFactory.getJavaBeanModelWithLazyLoad(clazz); if (beanModel != null) { String[] ignores = findoutIgnoreProperty(bindings); ValueWiringBindingSelectionDialog dialog = new ValueWiringBindingSelectionDialog(parent.getShell(), beanModel, ignores); if (dialog.open() == Dialog.OK) { Object[] checkedModels = dialog.getCheckedObject(); if (checkedModels == null) return; if (formEditor instanceof IEditingDomainProvider) { generateValueWiringModel(checkedModels, (IEditingDomainProvider)formEditor, bindings); } } } } catch (JavaModelException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private void generateValueWiringModel(Object[] models, IEditingDomainProvider editor, BeanType owner) { EditingDomain domain = editor.getEditingDomain(); CompoundCommand command = new CompoundCommand(); command.setDescription("Add Binding"); //$NON-NLS-1$ command.setLabel("Auto add binding"); //$NON-NLS-1$ for (int i = 0; i < models.length; i++) { Object model = models[i]; if (model instanceof JavaBeanModel) { Command c = generateAddCommand((JavaBeanModel) model, domain, owner); command.append(c); } } domain.getCommandStack().execute(command); } private Command generateAddCommand(JavaBeanModel beanModel, EditingDomain domain, BeanType owner) { if (beanModel.isPrimitive()) { ValueType valueType = Javabean12Factory.eINSTANCE.createValueType(); valueType.setProperty(beanModel.getName()); return AddCommand.create(domain, owner, Javabean12Package.Literals.BEAN_TYPE__VALUE, valueType); } else { WiringType wiring = Javabean12Factory.eINSTANCE.createWiringType(); wiring.setProperty(beanModel.getName()); return AddCommand.create(domain, owner, Javabean12Package.Literals.BEAN_TYPE__WIRING, wiring); } } private String[] findoutIgnoreProperty(BeanType bindings) { List<String> ignores = new ArrayList<String>(); List<ValueType> valueList = bindings.getValue(); for (Iterator<?> iterator = valueList.iterator(); iterator.hasNext();) { ValueType valueType = (ValueType) iterator.next(); // boolean unset = // valueType.eIsSet(JavabeanPackage.Literals.VALUE_TYPE__PROPERTY); // if(unset) continue; String pro = valueType.getProperty(); if (pro != null && pro.length() != 0) { ignores.add(pro); } } List<WiringType> wiringList = bindings.getWiring(); for (Iterator<?> iterator = wiringList.iterator(); iterator.hasNext();) { WiringType wiringType = (WiringType) iterator.next(); // boolean unset = // wiringType.eIsSet(JavabeanPackage.Literals.WIRING_TYPE__PROPERTY); // if(unset) continue; String pro = wiringType.getProperty(); if (pro != null && pro.length() != 0) { ignores.add(pro); } } if (ignores.isEmpty()) return null; return ignores.toArray(new String[] {}); } @Override public boolean isSelectorFeature(EAttribute attribute) { return super.isSelectorFeature(attribute); } protected AttributeFieldEditPart createBeanClassTextWithButton(Composite composite, FormToolkit toolkit, final IItemPropertyDescriptor propertyDescriptor, final Object model , ISmooksModelProvider provider) { return SmooksUIUtils.createJavaTypeSearchFieldEditor(composite, toolkit, propertyDescriptor, (EObject) model , provider); } }