Project: BPMN2-Editor-for-Eclipse
/******************************************************************************* 
 * Copyright (c) 2011 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.eclipse.bpmn2.modeler.ui.property; 
 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.List; 
 
import org.eclipse.bpmn2.Task; 
import org.eclipse.bpmn2.modeler.core.Bpmn2Preferences; 
import org.eclipse.bpmn2.modeler.ui.property.AbstractBpmn2PropertiesComposite; 
import org.eclipse.core.databinding.Binding; 
import org.eclipse.emf.common.util.EList; 
import org.eclipse.emf.ecore.EAttribute; 
import org.eclipse.emf.ecore.EStructuralFeature; 
import org.eclipse.emf.ecore.util.BasicFeatureMap; 
import org.eclipse.emf.ecore.util.FeatureMap.Entry; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.events.SelectionListener; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.MessageBox; 
import org.eclipse.swt.widgets.Text; 
 
public class JbpmPropertiesComposite extends AbstractBpmn2PropertiesComposite { 
 
 private ArrayList<EStructuralFeature> attributes; 
 private Button customEditorButton; 
 private GridData buttonGridData; 
 
 public JbpmPropertiesComposite(Composite parent, int none) { 
  super(parent, none); 
  customEditorButton = new Button(this, SWT.None); 
  customEditorButton.setText("Open Custom Editor"); 
  buttonGridData = new GridData(SWT.LEFT, SWT.CENTER, falsefalse31); 
  customEditorButton.setLayoutData(buttonGridData); 
  toolkit.adapt(customEditorButton, truetrue); 
  customEditorButton.addSelectionListener(new SelectionListener() { 
 
   @Override 
   public void widgetSelected(SelectionEvent e) { 
    MessageBox box = new MessageBox(getShell()); 
    box.setText("Custom Editor"); 
 
    updateDialogContents(box); 
    box.open(); 
   
 
   @Override 
   public void widgetDefaultSelected(SelectionEvent e) { 
 
   
  }); 
 
 
 @Override 
 public void createBindings() { 
  boolean showCustomButton = be.eClass().getInstanceClass() 
    .equals(Task.class); 
  customEditorButton.setVisible(showCustomButton); 
  buttonGridData.exclude = !showCustomButton; 
 
  EList<EAttribute> eAllAttributes = be.eClass().getEAllAttributes(); 
 
  for (EAttribute attrib : eAllAttributes) { 
   if ("anyAttribute".equals(attrib.getName())) { 
    attributes = Bpmn2Preferences.getAttributes(be.eClass()); 
 
    replaceExistingAnyAttributes(attrib); 
 
    Collections.sort(attributes, 
      new Comparator<EStructuralFeature>() { 
 
       @Override 
       public int compare(EStructuralFeature o1, 
         EStructuralFeature o2) { 
        return o1.getName().compareTo(o2.getName()); 
 
       
      }); 
 
    for (EStructuralFeature a : attributes) { 
     if (Object.class.equals(a.getEType().getInstanceClass())) { 
      Text t = createTextInput(a.getName(), false); 
      bind(a, t); 
     
    
   
  
  parent.setSize(parent.computeSize(parent.getSize().x, SWT.DEFAULT, true)); 
 
 
 /**
  * EMF creates new StructuralFeatures for each unspecified anyAttribute 
  * element. For bindings to work, we must replace these features with EMF 
  * generated instance, or there would be two or more attributes with the 
  * same name, but different values. 
  */
 
 private void replaceExistingAnyAttributes(EAttribute attrib) { 
  HashMap<EStructuralFeature, EStructuralFeature> replace = new HashMap<EStructuralFeature, EStructuralFeature>(); 
  for (EStructuralFeature a : attributes) { 
   List<Entry> basicList = ((BasicFeatureMap) be.eGet(attrib)) 
     .basicList(); 
   for (Entry entry : basicList) { 
    if (entry.getEStructuralFeature().getName().equals(a.getName())) { 
     replace.put(a, entry.getEStructuralFeature()); 
    
   
  
  for (EStructuralFeature a : replace.keySet()) { 
   attributes.remove(a); 
   attributes.add(replace.get(a)); 
  
 
 
 private void updateDialogContents(MessageBox box) { 
  for (EStructuralFeature eStructuralFeature : attributes) { 
   if (eStructuralFeature.getName().equals("taskName")) 
    box.setMessage("Here should be a custom editor for " 
      + be.eGet(eStructuralFeature) + " !"); 
  
 
}