Package org.eclipse.bpmn2.modeler.ui.property

Source Code of org.eclipse.bpmn2.modeler.ui.property.MainPropertiesComposite

/*******************************************************************************
* 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.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.eclipse.bpmn2.GatewayDirection;
import org.eclipse.bpmn2.Participant;
import org.eclipse.bpmn2.di.BPMNShape;
import org.eclipse.bpmn2.di.BpmnDiPackage;
import org.eclipse.bpmn2.modeler.core.Bpmn2Preferences;
import org.eclipse.bpmn2.modeler.core.ModelHandler;
import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
import org.eclipse.bpmn2.modeler.ui.Activator;
import org.eclipse.bpmn2.provider.Bpmn2ItemProviderAdapterFactory;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.Enumerator;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.emf.edit.ui.celleditor.FeatureEditorDialog;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;

public class MainPropertiesComposite extends AbstractBpmn2PropertiesComposite {
  private final AdapterFactoryLabelProvider LABEL_PROVIDER = new AdapterFactoryLabelProvider(ADAPTER_FACTORY);
  private ModelHandler modelHandler;
  private BPMNShape shape;

  /**
   * Create the composite.
   *
   * @param parent
   * @param style
   */
  public MainPropertiesComposite(Composite parent, int style) {
    super(parent, style);
  }

  @SuppressWarnings("restriction")
  @Override
  public void createBindings() {
    try {
      modelHandler = ModelHandlerLocator.getModelHandler(bpmn2Editor.getDiagramTypeProvider().getDiagram()
          .eResource());
    } catch (IOException e1) {
      Activator.showErrorWithLogging(e1);
      return;
    }

    ItemProviderAdapter itemProviderAdapter = (ItemProviderAdapter) new Bpmn2ItemProviderAdapterFactory().adapt(be,
        ItemProviderAdapter.class);

    EList<EAttribute> eAllAttributes = be.eClass().getEAllAttributes();
    Bpmn2Preferences preferences = Bpmn2Preferences.getPreferences(project);

    for (EAttribute a : eAllAttributes) {

      if (preferences.isEnabled(be.eClass(), a)) {
        IItemPropertyDescriptor propertyDescriptor = itemProviderAdapter.getPropertyDescriptor(be, a);

        if (String.class.equals(a.getEType().getInstanceClass())) {
          bind(a, createTextInput(propertyDescriptor.getDisplayName(be), propertyDescriptor.isMultiLine(be)));
        } else if (boolean.class.equals(a.getEType().getInstanceClass())) {
          bindBoolean(a, createBooleanInput(propertyDescriptor.getDisplayName(be)));
        } else if (int.class.equals(a.getEType().getInstanceClass())) {
          bindInt(a, createIntInput(propertyDescriptor.getDisplayName(be)));
        } else if (propertyDescriptor != null) {
          propertyDescriptor.getChoiceOfValues(be);
          createLabel(propertyDescriptor.getDisplayName(be));
          createSingleItemEditor(a, be.eGet(a), propertyDescriptor.getChoiceOfValues(be));
        }
      }
    }

    EList<EReference> eAllContainments = be.eClass().getEAllContainments();
    for (EReference e : be.eClass().getEAllReferences()) {
      if (preferences.isEnabled(be.eClass(), e) && !eAllContainments.contains(e)) {
        IItemPropertyDescriptor propertyDescriptor = itemProviderAdapter.getPropertyDescriptor(be, e);
        bindReference(e, propertyDescriptor.getDisplayName(e));
      }
    }

    if (be instanceof Participant) {
      Diagram diagram = bpmn2Editor.getDiagramTypeProvider().getDiagram();
      if (shape != null && shape.getParticipantBandKind() != null) {
        bindBoolean(shape.eClass().getEStructuralFeature(BpmnDiPackage.BPMN_SHAPE__IS_MESSAGE_VISIBLE),
            createBooleanInput("Is Message Visible"), shape);
      }

    }
  }

  public void bindReference(final EReference reference, final String name) {
    Object eGet = be.eGet(reference);

    createLabel(name);
    if (eGet instanceof List) {
      createListEditor(reference, eGet);
    } else {
      createSingleItemEditor(reference, eGet, null);
    }
  }

  private void createListEditor(final EReference reference, Object eGet) {

    final Text text = new Text(this, SWT.BORDER);
    text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
    toolkit.adapt(text, true, true);
    widgets.add(text);

    Button editButton = new Button(this, SWT.NONE);
    editButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
    editButton.setText("Edit ...");
    toolkit.adapt(editButton, true, true);
    widgets.add(editButton);

    final List<EObject> refs = (List<EObject>) eGet;
    updateTextField(refs, text);

    SelectionAdapter editListener = new SelectionAdapter() {

      @SuppressWarnings("unchecked")
      @Override
      public void widgetSelected(SelectionEvent e) {
        List<EObject> l = null;

        if (modelHandler != null) {
          l = (List<EObject>) modelHandler.getAll(reference.getEType().getInstanceClass());
        }

        FeatureEditorDialog featureEditorDialog = new FeatureEditorDialog(getShell(), LABEL_PROVIDER, be,
            reference, "Select elements", l);

        if (featureEditorDialog.open() == Window.OK) {

          updateEObject(refs, (EList<EObject>) featureEditorDialog.getResult());
          updateTextField(refs, text);
        }
      }

      public void updateEObject(final List<EObject> refs, final EList<EObject> result) {
        TransactionalEditingDomain domain = bpmn2Editor.getEditingDomain();
        domain.getCommandStack().execute(new RecordingCommand(domain) {
          @Override
          protected void doExecute() {

            if (result == null) {
              refs.clear();
              return;
            }
            refs.retainAll(result);
            for (EObject di : result) {
              if (!refs.contains(di)) {
                refs.add(di);
              }
            }
          }
        });
      }
    };
    editButton.addSelectionListener(editListener);
  }

  private void createSingleItemEditor(final EStructuralFeature reference, Object eGet, Collection values) {
    final ComboViewer combo = new ComboViewer(this, SWT.BORDER);
    Combo c = combo.getCombo();
    combo.setLabelProvider(LABEL_PROVIDER);
    c.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
    toolkit.adapt(c, true, true);
    widgets.add(c);

    List<Object> l = null;

    if (values != null) {
      l = Arrays.asList(values.toArray());
    } else if (modelHandler != null) {
      l = (List<Object>) modelHandler.getAll(reference.getEType().getInstanceClass());
    }

    combo.add("");
    combo.add(l.toArray());
    if (eGet != null) {
      combo.setSelection(new StructuredSelection(eGet));
    }

    combo.addSelectionChangedListener(new ISelectionChangedListener() {

      @Override
      public void selectionChanged(SelectionChangedEvent event) {
        ISelection selection = combo.getSelection();
        if (selection instanceof StructuredSelection) {
          Object firstElement = ((StructuredSelection) selection).getFirstElement();
          if (firstElement instanceof EObject) {
            updateEObject(firstElement);
          } else if (firstElement instanceof GatewayDirection) {
            updateGatewayDirection(firstElement);
          } else {
            updateEObject(null);
          }
        }
      }

      public void updateEObject(final Object result) {
        TransactionalEditingDomain domain = bpmn2Editor.getEditingDomain();
        domain.getCommandStack().execute(new RecordingCommand(domain) {
          @Override
          protected void doExecute() {
            be.eSet(reference, result);
          }
        });
      }
     
      public void updateGatewayDirection(final Object result) {
        TransactionalEditingDomain domain = bpmn2Editor.getEditingDomain();
        domain.getCommandStack().execute(new RecordingCommand(domain) {
          @Override
          protected void doExecute() {
            GatewayDirection direction = (GatewayDirection) result;
            be.eSet(reference, direction);
          }
        });
      }
     
    });
  }

  private void updateTextField(final List<EObject> refs, Text text) {
    String listText = "";
    if (refs != null) {
      for (int i = 0; i < refs.size() - 1; i++) {
        listText += LABEL_PROVIDER.getText(refs.get(i)) + ", ";
      }
      if (refs.size() > 0) {
        listText += LABEL_PROVIDER.getText(refs.get(refs.size() - 1));
      }
    }

    text.setText(listText);
  }

  public void setShape(BPMNShape shape) {
    this.shape = shape;
  }
}
TOP

Related Classes of org.eclipse.bpmn2.modeler.ui.property.MainPropertiesComposite

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.