| /*------------------------------------------------------------------------------ |
| - |
| - Copyright (c) 2015-2016 University of Padova, ITALY - Intecs SpA |
| - 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: |
| - |
| - Alessandro Zovi azovi@math.unipd.it |
| - Stefano Puri stefano.puri@intecs.it |
| - Laura Baracchi laura.baracchi@intecs.it |
| - Nicholas Pacini nicholas.pacini@intecs.it |
| - |
| - Initial API and implementation and/or initial documentation |
| ------------------------------------------------------------------------------*/package org.polarsys.chess.multicore.dialogs; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.LinkedHashSet; |
| import java.util.Map; |
| |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.jface.dialogs.TrayDialog; |
| import org.eclipse.jface.viewers.DoubleClickEvent; |
| import org.eclipse.jface.viewers.IDoubleClickListener; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.ISelectionChangedListener; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.SelectionChangedEvent; |
| import org.eclipse.jface.viewers.TreeViewer; |
| import org.eclipse.papyrus.MARTE.MARTE_Foundations.Alloc.Assign; |
| import org.eclipse.papyrus.infra.widgets.Activator; |
| import org.eclipse.papyrus.infra.widgets.editors.IElementSelectionListener; |
| import org.eclipse.papyrus.infra.widgets.messages.Messages; |
| import org.eclipse.papyrus.infra.widgets.providers.CollectionContentProvider; |
| import org.eclipse.papyrus.infra.widgets.selectors.ReferenceSelector; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.custom.ScrolledComposite; |
| import org.eclipse.swt.events.ControlAdapter; |
| import org.eclipse.swt.events.ControlEvent; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.events.SelectionListener; |
| import org.eclipse.swt.layout.FillLayout; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.layout.RowData; |
| import org.eclipse.swt.layout.RowLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Control; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.swt.widgets.Tree; |
| import org.eclipse.uml2.uml.InstanceSpecification; |
| import org.polarsys.chess.multicore.model.CHCore; |
| import org.polarsys.chess.multicore.utils.QueryUtils; |
| |
| /** |
| * The Class CoreSelectorDialog. |
| */ |
| public class CoreSelectorDialog extends TrayDialog implements |
| SelectionListener, ISelectionChangedListener, IDoubleClickListener, IElementSelectionListener { |
| |
| /** The Constant PARTITIONS_TO_CORES. */ |
| public static final int PARTITIONS_TO_CORES = 0; |
| |
| /** The Constant COMPONENTS_TO_CORES. */ |
| public static final int COMPONENTS_TO_CORES = 1; |
| |
| /** The Constant TASKS_TO_CORES. */ |
| public static final int TASKS_TO_CORES = 2; |
| |
| /** The cores. */ |
| private EList<CHCore> cores; |
| |
| /** The map. */ |
| Map<CHCore, LinkedHashSet<Object>> map; |
| |
| /** The selector section. */ |
| private Composite selectorSection; |
| |
| /** The buttons section. */ |
| private Composite buttonsSection; |
| |
| /** The add. */ |
| private Button add; |
| |
| /** The remove. */ |
| private Button remove; |
| |
| /** The add all. */ |
| private Button addAll; |
| |
| /** The remove all. */ |
| private Button removeAll; |
| |
| /** The selected elements. */ |
| private Tree selectedElements; |
| |
| /** The label provider. */ |
| //private TreeViewer selectedElementsViewer; |
| private ILabelProvider labelProvider; |
| //@Deprecated |
| //protected final Collection<Object> allElements; |
| /** The selector. */ |
| //private TreeViewer treeViewer; |
| private ReferenceSelector selector; |
| |
| /** The partition selected. */ |
| private CHCore partitionSelected; |
| |
| /** The selected elements viewers. */ |
| private HashMap<CHCore, TreeViewer> selectedElementsViewers; |
| |
| /** The result. */ |
| private Map<CHCore, LinkedHashSet<Object>> result; |
| |
| /** |
| * Open core selector dialog for Assign partition to cores or assign components to cores or assign tasks to cores. |
| * |
| * @param parentShell the parent shell |
| * @param referenceSelector the reference selector |
| * @param cores the cores |
| * @param pack the pack |
| * @param assignments the assignments |
| * @param mode PARTITIONS_TO_CORES | COMPONENTS_TO_CORES | TASKS_TO_CORES |
| * @param title the title |
| */ |
| public CoreSelectorDialog(Shell parentShell, |
| ReferenceSelector referenceSelector, |
| EList<CHCore> cores, org.eclipse.uml2.uml.Package pack, EList<Assign> assignments, int mode, String title) { |
| // super(parentShell, selector, title, unique, ordered, upperBound); |
| super(parentShell); |
| this.cores = cores; |
| this.selector = referenceSelector; |
| map = new HashMap<CHCore, LinkedHashSet<Object>>(); |
| if(mode==PARTITIONS_TO_CORES) { |
| for (CHCore core : cores) { |
| // LB 20150708 look at assignments that already exist in the model before opening the selector |
| LinkedHashSet<Object> theCoresPartitions = QueryUtils.getPartitionsAssigned2Core(core, assignments); |
| map.put(core, theCoresPartitions); |
| //map.put(core, new LinkedHashSet<Object>()); |
| } |
| } |
| if(mode==COMPONENTS_TO_CORES) { |
| for (CHCore core : cores) { |
| // LB 20150708 look at assignments that already exist in the model before opening the selector |
| LinkedHashSet<Object> theCoresComponents = QueryUtils.getComponentsAssigned2Core(core, assignments); |
| map.put(core, theCoresComponents); |
| } |
| } |
| if(mode==TASKS_TO_CORES) { |
| for (CHCore core : cores) { |
| // LB 20150708 look at assignments that already exist in the model before opening the selector |
| LinkedHashSet<Object> theCoresTasks = QueryUtils.getTasksAssigned2Core(core, pack, assignments); |
| map.put(core, theCoresTasks); |
| } |
| } |
| //this.allElements = new LinkedHashSet<Object>(); |
| |
| selector.addElementSelectionListener(this); |
| |
| selectedElementsViewers = new HashMap<CHCore, TreeViewer>(); |
| setTitle(title); |
| } |
| |
| /** |
| * Gets the display. |
| * |
| * @return the display |
| */ |
| public static Display getDisplay() { |
| Display display = Display.getCurrent(); |
| // may be null if outside the UI thread |
| if (display == null) |
| display = Display.getDefault(); |
| return display; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite) |
| */ |
| @Override |
| protected Control createDialogArea(Composite parent) { |
| GridLayout layout = (GridLayout) parent.getLayout(); |
| layout.numColumns = 2; |
| layout.makeColumnsEqualWidth = true; |
| |
| |
| |
| Composite selectorPane = new Composite(parent, SWT.NONE); |
| selectorPane.setLayout(new GridLayout(1, false)); |
| selectorPane |
| .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| |
| final ScrolledComposite sc2 = new ScrolledComposite(parent, |
| SWT.V_SCROLL | SWT.BORDER); |
| sc2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| sc2.setExpandHorizontal(true); |
| sc2.setExpandVertical(true); |
| |
| final Composite selectedPane = new Composite(sc2, SWT.NONE); |
| selectedPane.setLayout(new GridLayout(1,false)); |
| selectedPane |
| .setLayoutData(new GridData(SWT.RIGHT, SWT.FILL, true, true)); |
| for (CHCore object : cores) { |
| Composite selectedPane_ = new Composite(selectedPane, SWT.NONE); |
| selectedPane_.setLayout(new GridLayout(2, false)); |
| selectedPane_.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); |
| |
| createListSection(object, selectedPane_); |
| } |
| |
| sc2.setContent(selectedPane); |
| sc2.setMinSize(sc2.computeSize(SWT.DEFAULT, SWT.DEFAULT)); |
| |
| |
| sc2.addControlListener(new ControlAdapter() { |
| @Override |
| public void controlResized(ControlEvent e) { |
| sc2.setMinSize(sc2.computeSize(SWT.DEFAULT, SWT.DEFAULT)); |
| } |
| }); |
| |
| createSelectorSection(selectorPane); |
| |
| |
| return super.createDialogArea(parent); |
| } |
| |
| /** |
| * Creates the selector section. |
| * |
| * @param parent the parent |
| */ |
| private void createSelectorSection(Composite parent) { |
| selectorSection = new Composite(parent, SWT.NONE); |
| selectorSection.setLayout(new FillLayout()); |
| selectorSection.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, |
| true)); |
| |
| selector.createControls(selectorSection); |
| //selector.setSelectedElements(allElements.toArray()); |
| |
| |
| } |
| |
| /** |
| * Creates the controls section. |
| * |
| * @param partition the partition |
| * @param parent the parent |
| */ |
| private void createControlsSection(CHCore partition, |
| Composite parent) { |
| buttonsSection = new Composite(parent, SWT.NONE); |
| buttonsSection.setLayout(new GridLayout(1, true)); |
| |
| add = new Button(buttonsSection, SWT.PUSH); |
| add.setImage(Activator.getDefault().getImage("/icons/arrow_right.gif")); //$NON-NLS-1$ |
| add.addSelectionListener(this); |
| add.setToolTipText(Messages.MultipleValueSelectorDialog_AddSelectedElements); |
| add.setData(new WidgetData(WidgetData.ADD, partition)); |
| |
| remove = new Button(buttonsSection, SWT.PUSH); |
| remove.setImage(Activator.getDefault() |
| .getImage("/icons/arrow_left.gif")); //$NON-NLS-1$ |
| remove.addSelectionListener(this); |
| remove.setToolTipText(Messages.MultipleValueEditor_RemoveSelectedElements); |
| remove.setData(new WidgetData(WidgetData.REMOVE, partition)); |
| |
| addAll = new Button(buttonsSection, SWT.PUSH); |
| addAll.setImage(Activator.getDefault().getImage( |
| "/icons/arrow_double.gif")); //$NON-NLS-1$ |
| addAll.addSelectionListener(this); |
| addAll.setToolTipText(Messages.MultipleValueSelectorDialog_AddAllElements); |
| addAll.setData(new WidgetData(WidgetData.AALL, partition)); |
| |
| removeAll = new Button(buttonsSection, SWT.PUSH); |
| removeAll.setImage(Activator.getDefault().getImage( |
| "/icons/arrow_left_double.gif")); //$NON-NLS-1$ |
| removeAll.addSelectionListener(this); |
| removeAll |
| .setToolTipText(Messages.MultipleValueSelectorDialog_RemoveAllElements); |
| removeAll.setData(new WidgetData(WidgetData.RALL, partition)); |
| } |
| |
| /** |
| * Gets the instance specification name. |
| * |
| * @param instanceSpecification the instance specification |
| * @return the instance specification name |
| */ |
| private String getInstanceSpecificationName( |
| CHCore instanceSpecification) { |
| |
| return instanceSpecification.toString(); |
| } |
| |
| /** |
| * Creates the list section. |
| * |
| * @param core the core |
| * @param parent the parent |
| */ |
| private void createListSection(CHCore core, |
| Composite parent) { |
| |
| Label lbl = new Label(parent, SWT.NONE); |
| lbl.setText(getInstanceSpecificationName(core)); |
| |
| GridData lLbl = new GridData(SWT.CENTER, SWT.TOP, true, true, 2, 1); |
| // gd_lblNewLabel.horizontalIndent = 1; |
| lbl.setLayoutData(lLbl); |
| |
| createControlsSection(core, parent); |
| |
| selectedElements = new Tree(parent, SWT.MULTI | SWT.BORDER |
| | SWT.V_SCROLL | SWT.H_SCROLL); |
| // selectedElements.addSelectionListener(this); |
| GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); |
| selectedElements.setLayoutData(data); |
| |
| |
| TreeViewer selectedElementsViewer = new TreeViewer(selectedElements); |
| |
| selectedElementsViewer.addSelectionChangedListener(this); |
| selectedElementsViewer.addDoubleClickListener(this); |
| |
| selectedElementsViewer |
| .setContentProvider(CollectionContentProvider.instance); |
| |
| if (labelProvider != null) { |
| selectedElementsViewer.setLabelProvider(labelProvider); |
| } |
| |
| selectedElementsViewer.setInput(map.get(core)); |
| |
| selectedElementsViewers.put(core, selectedElementsViewer); |
| |
| |
| //selector.setSelectedElements(allElements.toArray()); |
| |
| } |
| |
| /** |
| * The Class WidgetData. |
| */ |
| class WidgetData { |
| |
| /** The type. */ |
| int type; |
| |
| /** The partition. */ |
| CHCore partition; |
| |
| /** The Constant AALL. */ |
| final static int ADD = 1, REMOVE = 2, RALL = 3, AALL = 4; |
| |
| /** |
| * Instantiates a new widget data. |
| * |
| * @param type the type |
| * @param partition the partition |
| */ |
| public WidgetData(int type, CHCore partition) { |
| this.partition = partition; |
| this.type = type; |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent) |
| */ |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| Object data = e.widget.getData(); |
| if (data != null && data instanceof WidgetData) { |
| WidgetData wData = (WidgetData) data; |
| if (wData.type == WidgetData.ADD) { |
| addAction(wData.partition); |
| } else if (wData.type == WidgetData.REMOVE) { |
| removeAction(wData.partition); |
| } else if (wData.type == WidgetData.AALL) { |
| addAllAction(wData.partition); |
| } else if (wData.type == WidgetData.RALL) { |
| removeAllAction(wData.partition); |
| } |
| } |
| } |
| |
| |
| |
| /** |
| * Removes the all action. |
| * |
| * @param partition the partition |
| */ |
| private void removeAllAction(CHCore partition) { |
| TreeViewer selectedElementsViewer = selectedElementsViewers.get(partition); |
| |
| LinkedHashSet<Object> el = new LinkedHashSet<Object>(); |
| for (LinkedHashSet<Object> values : map.values()) { |
| el.addAll(values); |
| } |
| |
| |
| |
| LinkedHashSet<Object> el1 = map.get(partition); |
| |
| for(Object element : el1.toArray()) { |
| el.remove(element); |
| el1.remove(element); |
| } |
| |
| selector.setSelectedElements(el.toArray()); |
| selectedElementsViewer.setSelection(null); |
| selectedElementsViewer.refresh(); |
| } |
| |
| /** |
| * Adds the all action. |
| * |
| * @param partition the partition |
| */ |
| private void addAllAction(CHCore partition) { |
| Object[] elements = selector.getAllElements(); |
| partitionSelected = partition; |
| addElements(elements); |
| } |
| |
| /** |
| * Removes the action. |
| * |
| * @param partition the partition |
| */ |
| private void removeAction(CHCore partition) { |
| TreeViewer selectedElementsViewer = selectedElementsViewers.get(partition); |
| |
| LinkedHashSet<Object> el = new LinkedHashSet<Object>(); |
| for (LinkedHashSet<Object> values : map.values()) { |
| el.addAll(values); |
| } |
| |
| IStructuredSelection selection = (IStructuredSelection)selectedElementsViewer.getSelection(); |
| if(selection.isEmpty()) { |
| return; |
| } |
| |
| LinkedHashSet<Object> el1 = map.get(partition); |
| |
| for(Object element : selection.toArray()) { |
| el.remove(element); |
| el1.remove(element); |
| } |
| |
| selector.setSelectedElements(el.toArray()); |
| selectedElementsViewer.setSelection(null); |
| selectedElementsViewer.refresh(); |
| } |
| |
| /** |
| * Adds the action. |
| * |
| * @param partition the partition |
| */ |
| private void addAction(CHCore partition) { |
| Object[] elements = selector.getSelectedElements(); |
| partitionSelected = partition; |
| addElements(elements); |
| } |
| |
| /** |
| * Gets the selected elements. |
| * |
| * @return the selected elements |
| */ |
| private InstanceSpecification[] getSelectedElements() { |
| return null; |
| /*ISelection selection = treeViewer.getSelection(); |
| |
| if(selection instanceof IStructuredSelection) { |
| Object[] containerElementsToMove = getElementsToMove(((IStructuredSelection)selection).toArray()); |
| Object[] semanticElementsToMove = getSemanticElements(containerElementsToMove); |
| addSelectedElements(semanticElementsToMove); |
| return semanticElementsToMove; |
| } |
| |
| return new Object[0];*/ |
| } |
| |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent) |
| */ |
| @Override |
| public void widgetDefaultSelected(SelectionEvent e) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent) |
| */ |
| @Override |
| public void doubleClick(DoubleClickEvent event) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) |
| */ |
| @Override |
| public void selectionChanged(SelectionChangedEvent event) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| /** |
| * Sets the label provider. |
| * |
| * @param serv the new label provider |
| */ |
| public void setLabelProvider(ILabelProvider serv) { |
| labelProvider = serv; |
| } |
| |
| /** |
| * Sets the message. |
| * |
| * @param string the new message |
| */ |
| public void setMessage(String string) { |
| // TODO Auto-generated method stub |
| } |
| |
| /** |
| * Sets the title. |
| * |
| * @param string the new title |
| */ |
| public void setTitle(String string) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.papyrus.infra.widgets.editors.IElementSelectionListener#addElements(java.lang.Object[]) |
| */ |
| @Override |
| public void addElements(Object[] elements) { |
| if(elements != null && partitionSelected != null) { |
| |
| |
| Collection<InstanceSpecification> t = new ArrayList<InstanceSpecification>(); |
| LinkedHashSet<Object> l = map.get(partitionSelected); |
| |
| l.addAll(Arrays.asList(elements)); |
| |
| TreeViewer selectedElementsViewer = selectedElementsViewers.get(partitionSelected); |
| selectedElementsViewer.refresh(); |
| |
| } |
| } |
| |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.dialogs.Dialog#okPressed() |
| */ |
| @Override |
| protected void okPressed() { |
| setResult(map); |
| |
| super.okPressed(); |
| } |
| |
| |
| /** |
| * Sets the result. |
| * |
| * @param map_ the map |
| */ |
| protected void setResult(Map<CHCore, LinkedHashSet<Object>> map_) { |
| result = map_; |
| } |
| |
| |
| /** |
| * Gets the result. |
| * |
| * @return the result |
| */ |
| public Map<CHCore, LinkedHashSet<Object>> getResult() { |
| return result; |
| } |
| } |