| /******************************************************************************* |
| * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency |
| * All rights reserved. This program and the accompanying materials |
| * are 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: |
| * Pierre Allard, |
| * Regent L'Archeveque, |
| * Olivier L. Larouche - initial API and implementation |
| * |
| * SPDX-License-Identifier: EPL-1.0 |
| * |
| *******************************************************************************/ |
| package org.eclipse.apogy.common.emf.ui.composites; |
| |
| import org.eclipse.apogy.common.emf.ApogyCommonEMFFacade; |
| import org.eclipse.apogy.common.emf.ui.wizards.NewChildWizard; |
| import org.eclipse.core.databinding.observable.ChangeEvent; |
| import org.eclipse.core.databinding.observable.IChangeListener; |
| import org.eclipse.core.databinding.observable.value.WritableValue; |
| import org.eclipse.emf.common.command.Command; |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.edit.command.RemoveCommand; |
| import org.eclipse.emf.edit.command.SetCommand; |
| import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain; |
| import org.eclipse.emf.edit.domain.EditingDomain; |
| import org.eclipse.emf.edit.provider.ComposedAdapterFactory; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.TreeSelection; |
| 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.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.swt.widgets.Listener; |
| |
| public class EObjectEditorComposite extends Composite { |
| |
| private ISelectionChangedListener selectionChangedListener; |
| private EObjectComposite eObjectComposite; |
| |
| private Button btnNew; |
| |
| ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory( |
| ComposedAdapterFactory.Descriptor.Registry.INSTANCE); |
| |
| /** |
| * Creates the parentComposite. |
| * |
| * @param parent |
| * @param style |
| */ |
| public EObjectEditorComposite(Composite parent, int style) { |
| super(parent, style); |
| addDisposeListener(new DisposeListener() { |
| @Override |
| public void widgetDisposed(DisposeEvent e) { |
| dispose(); |
| } |
| }); |
| setLayout(new GridLayout(2, false)); |
| |
| this.eObjectComposite = new EObjectComposite(this, SWT.None) { |
| @Override |
| protected void newSelection(ISelection selection) { |
| EObjectEditorComposite.this.newSelection(selection); |
| checkEnableNewButton(getSelectedEObject()); |
| } |
| |
| @Override |
| protected AdapterFactoryLabelProvider getLabelProvider() { |
| return EObjectEditorComposite.this.getLabelProvider(); |
| } |
| |
| @Override |
| protected AdapterFactoryContentProvider getContentProvider() { |
| return EObjectEditorComposite.this.getContentProvider(); |
| } |
| }; |
| this.eObjectComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3)); |
| |
| this.btnNew = new Button(this, SWT.NONE); |
| this.btnNew.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); |
| this.btnNew.setText("New"); |
| this.btnNew.addListener(SWT.Selection, getBtnNewListener()); |
| |
| Button btnDelete = new Button(this, SWT.NONE); |
| btnDelete.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); |
| btnDelete.setText("Delete"); |
| btnDelete.addListener(SWT.Selection, getBtnDeleteListener()); |
| } |
| |
| protected void newSelection(ISelection selection) { |
| checkEnableNewButton((EObject) ((TreeSelection) selection).getFirstElement()); |
| } |
| |
| protected void refresh() { |
| this.eObjectComposite.refresh(); |
| } |
| |
| @Override |
| public void dispose() { |
| super.dispose(); |
| if (this.selectionChangedListener != null) { |
| this.eObjectComposite.removeListener(SWT.Selection, (Listener) this.selectionChangedListener); |
| } |
| } |
| |
| private void checkEnableNewButton(EObject eObject) { |
| if (eObject != null) { |
| this.btnNew.setEnabled(!ApogyCommonEMFFacade.INSTANCE.getSettableEReferences(eObject).isEmpty()); |
| } else { |
| this.btnNew.setEnabled(false); |
| } |
| |
| } |
| |
| /** |
| * Sets the root object for the parentComposite |
| * |
| * @param eObject The root eObject |
| */ |
| public void setEObject(EObject eObject) { |
| this.eObjectComposite.setEObject(eObject); |
| this.eObjectComposite.setSelectedEObject(eObject); |
| checkEnableNewButton(eObject); |
| } |
| |
| public EObject getSelectedEObject() { |
| return this.eObjectComposite.getSelectedEObject(); |
| } |
| |
| protected AdapterFactoryContentProvider getContentProvider() { |
| return new AdapterFactoryContentProvider(this.adapterFactory); |
| } |
| |
| protected AdapterFactoryLabelProvider getLabelProvider() { |
| return new AdapterFactoryLabelProvider(this.adapterFactory); |
| } |
| |
| protected Listener getBtnNewListener() { |
| return new Listener() { |
| @Override |
| public void handleEvent(Event event) { |
| if (event.type == SWT.Selection) { |
| /** |
| * Creates and opens the wizard to create a new child |
| */ |
| NewChildWizard newChildWizard = new NewChildWizard( |
| ApogyCommonEMFFacade.INSTANCE.getSettableEReferences( |
| EObjectEditorComposite.this.eObjectComposite.getSelectedEObject()), |
| EObjectEditorComposite.this.eObjectComposite.getSelectedEObject()); |
| // Listener that sets the new child as the selected item |
| newChildWizard.getCreatedChild().addChangeListener(new IChangeListener() { |
| @SuppressWarnings("unchecked") |
| @Override |
| public void handleChange(ChangeEvent event) { |
| EObjectEditorComposite.this.eObjectComposite |
| .setSelectedEObject(((WritableValue<EObject>) event.getObservable()).getValue()); |
| } |
| }); |
| WizardDialog dialog = new WizardDialog(getShell(), newChildWizard); |
| |
| dialog.open(); |
| } |
| } |
| }; |
| } |
| |
| protected Listener getBtnDeleteListener() { |
| return new Listener() { |
| @Override |
| public void handleEvent(Event event) { |
| if (event.type == SWT.Selection) { |
| // Get the editing domain of the object |
| EditingDomain editingDomain = AdapterFactoryEditingDomain |
| .getEditingDomainFor(EObjectEditorComposite.this.eObjectComposite.getSelectedEObject()); |
| |
| Command command = null; |
| if (editingDomain != null) { |
| // If the containing feature is a list, the object is |
| // removed from the list |
| if (EObjectEditorComposite.this.eObjectComposite.getSelectedEObject() |
| .eContainingFeature() != null) { |
| if (EObjectEditorComposite.this.eObjectComposite.getSelectedEObject().eContainingFeature() |
| .isMany()) { |
| command = new RemoveCommand(editingDomain, |
| (EList<?>) EObjectEditorComposite.this.eObjectComposite.getSelectedEObject() |
| .eContainer() |
| .eGet(EObjectEditorComposite.this.eObjectComposite.getSelectedEObject() |
| .eContainingFeature()), |
| EObjectEditorComposite.this.eObjectComposite.getSelectedEObject()); |
| } |
| // Otherwise, if the feature is not a list, the |
| // EStructuralFeature of the parent is set to null |
| else { |
| command = new SetCommand(editingDomain, |
| EObjectEditorComposite.this.eObjectComposite.getSelectedEObject().eContainer(), |
| EObjectEditorComposite.this.eObjectComposite.getSelectedEObject() |
| .eContainingFeature(), |
| null); |
| } |
| } |
| } |
| editingDomain.getCommandStack().execute(command); |
| } |
| |
| } |
| }; |
| } |
| } |