/** * Copyright (c) 2012 committers of YAKINDU and others. * 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: * committers of YAKINDU - initial API and implementation * */ package org.yakindu.sct.ui.editor.propertysheets; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.commands.operations.OperationHistoryFactory; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.draw2d.ColorConstants; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.EcoreFactory; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor; import org.eclipse.gmf.runtime.emf.commands.core.commands.RepositionEObjectCommand; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.viewers.ArrayContentProvider; 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.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TableItem; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.forms.widgets.FormToolkit; import org.yakindu.base.gmf.runtime.util.EditPartUtils; import org.yakindu.base.xtext.utils.jface.viewers.util.ActiveEditorTracker; import org.yakindu.sct.model.sgraph.provider.SGraphItemProviderAdapterFactory; /** * * @author andreas muelder - Initial contribution and API * */ public class OrderElementControl extends Composite { private FormToolkit toolkit; private Button btnUp; private Button btnDown; private TableViewer viewer; private ButtonSelectionListener upButtonListener; private ButtonSelectionListener downButtonListener; private EditPartSelectionListener editPartSelectionListener; private EnableButtonListener enableButtonListener; private EStructuralFeature toManyFeature; public interface ISourceObjectCallback { public EObject getEObject(); } private ISourceObjectCallback callback; private String placeholder; public OrderElementControl(Composite parent, EStructuralFeature toManyFeature, ISourceObjectCallback callback, String placeholder) { super(parent, SWT.NONE); this.toManyFeature = toManyFeature; this.callback = callback; this.placeholder = placeholder; toolkit = new FormToolkit(parent.getDisplay()); upButtonListener = new ButtonSelectionListener(-1); downButtonListener = new ButtonSelectionListener(1); editPartSelectionListener = new EditPartSelectionListener(); enableButtonListener = new EnableButtonListener(); setBackground(ColorConstants.white); init(); } public OrderElementControl(Composite parent, EStructuralFeature toManyFeature, ISourceObjectCallback callback) { this(parent, toManyFeature, callback, ""); } private void init() { this.setLayout(new GridLayout(2, false)); viewer = new TableViewer(this, SWT.SINGLE | SWT.BORDER); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new AdapterFactoryLabelProvider(new SGraphItemProviderAdapterFactory())); Composite buttonComposite = getToolkit().createComposite(this); buttonComposite.setLayout(new FillLayout(SWT.VERTICAL)); btnUp = getToolkit().createButton(buttonComposite, "up", SWT.PUSH); btnDown = getToolkit().createButton(buttonComposite, "down", SWT.PUSH); viewer.addSelectionChangedListener(enableButtonListener); viewer.addSelectionChangedListener(editPartSelectionListener); btnUp.addSelectionListener(upButtonListener); btnDown.addSelectionListener(downButtonListener); GridDataFactory.fillDefaults().applyTo(viewer.getControl()); GridDataFactory.fillDefaults().applyTo(buttonComposite); GridDataFactory.fillDefaults().grab(true, false).applyTo(viewer.getControl()); GridDataFactory.fillDefaults().grab(true, false).applyTo(this); } public TableViewer getListViewer() { return viewer; } public FormToolkit getToolkit() { return toolkit; } protected EObject getSelectedObject() { return (EObject) ((StructuredSelection) viewer.getSelection()).getFirstElement(); } @SuppressWarnings("unchecked") private EList<EObject> getListInput() { return (EList<EObject>) callback.getEObject().eGet(toManyFeature); } public void refreshInput() { ISelection selection = viewer.getSelection(); EList<EObject> listInput = getListInput(); viewer.setInput(listInput); if (listInput.isEmpty()) { viewer.getTable().clearAll(); TableItem item = new TableItem(viewer.getTable(), SWT.NONE); item.setData(EcoreFactory.eINSTANCE.createEObject()); item.setText(placeholder); } else { viewer.setSelection(selection); } viewer.setSelection(selection); } private final class ButtonSelectionListener extends SelectionAdapter { private final int displacement; public ButtonSelectionListener(int displacement) { this.displacement = displacement; } public void widgetSelected(SelectionEvent e) { RepositionEObjectCommand command = new RepositionEObjectCommand( TransactionUtil.getEditingDomain(callback.getEObject()), "Reorder Elements", getListInput(), getSelectedObject(), displacement); try { OperationHistoryFactory.getOperationHistory().execute(command, new NullProgressMonitor(), null); } catch (ExecutionException e1) { e1.printStackTrace(); } refreshInput(); } } private final class EnableButtonListener implements ISelectionChangedListener { public void selectionChanged(SelectionChangedEvent event) { EList<EObject> listInput = getListInput(); int indexOf = listInput.indexOf(getSelectedObject()); if (indexOf == -1 || listInput.size() <= 1) { btnUp.setEnabled(false); btnDown.setEnabled(false); } else if (indexOf == 0) { btnUp.setEnabled(false); btnDown.setEnabled(true); } else if (indexOf == listInput.size() - 1) { btnUp.setEnabled(true); btnDown.setEnabled(false); } else { btnUp.setEnabled(true); btnDown.setEnabled(true); } } } private final class EditPartSelectionListener implements ISelectionChangedListener { public void selectionChanged(SelectionChangedEvent event) { IEditorPart lastActiveEditor = ActiveEditorTracker.getLastActiveEditor(); EObject selectedObject = getSelectedObject(); if (lastActiveEditor instanceof DiagramDocumentEditor && selectedObject != null) { IGraphicalEditPart editPart = EditPartUtils.findEditPartForSemanticElement( ((DiagramDocumentEditor) lastActiveEditor).getDiagramGraphicalViewer().getRootEditPart(), selectedObject); if (editPart != null) { ((DiagramDocumentEditor) lastActiveEditor).getDiagramGraphicalViewer().select(editPart); ((DiagramDocumentEditor) lastActiveEditor).getDiagramGraphicalViewer().reveal(editPart); } } } } @Override public void dispose() { viewer.removeSelectionChangedListener(editPartSelectionListener); viewer.removeSelectionChangedListener(enableButtonListener); if (!btnUp.isDisposed()) { btnUp.removeSelectionListener(upButtonListener); btnUp.dispose(); } if (!btnDown.isDisposed()) { btnDown.removeSelectionListener(downButtonListener); btnDown.dispose(); } super.dispose(); } }