blob: fdf2aeb1dd4c7665c71648ff70a84313fc7ddfd8 [file] [log] [blame]
/**
* Copyright (c) 2012, 2015 CEA-LIST, and Mia-Software.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Vincent Lorenzo (CEA-LIST) - Bug 357621 - Improve the label displayed for Customization and Facets
* Gregoire Dupe (Mia-Software) - Bug 357621 - Improve the label displayed for Customization and Facets
* Gregoire Dupe (Mia-Software) - Bug 372626 - Aggregates
* Nicolas Bros (Mia-Software) - Bug 370806 - [table] rewrite the "allowed contents" query selection dialog for v0.2
* Thomas Cicognani (Mia-Software) - Bug 472075 - Update API to create UI shortcuts to activate FacetSets
*/
package org.eclipse.modisco.facet.efacet.ui.internal.widget;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.modisco.facet.efacet.ui.internal.Activator;
import org.eclipse.modisco.facet.efacet.ui.internal.preferences.PreferenceConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.ui.dialogs.FilteredTree;
public class ETypedElementSelectionControlManager implements
IETypedElementSelectionControlManager {
// this map does the link between the tabItem and the filtered trees
private final Map<TabItem, IETypedElementTabSelectionWidgetInternal> trees;
private TabFolder tabFolder;
private final Composite parentComposite;
private final int selectionMaxSize;
/**
* true if empty selection is allowed
*/
private final boolean emptySelection;
private Collection<? extends ETypedElement> availableElements;
private final Collection<? extends EObject> knownEPackage;
public ETypedElementSelectionControlManager(
final Composite parentComposite, final int selectionMaxSize,
final boolean emptySelection,
final Collection<? extends EObject> knownEPackage) {
this.trees = new HashMap<TabItem, IETypedElementTabSelectionWidgetInternal>();
this.parentComposite = parentComposite;
this.selectionMaxSize = selectionMaxSize;
this.emptySelection = emptySelection;
this.knownEPackage = knownEPackage;
}
private static Composite createComposite(final Composite parent) {
final Composite composite = new Composite(parent, SWT.NONE);
final GridLayout layout = new GridLayout();
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
return composite;
}
private void init() {
this.tabFolder = new TabFolder(this.parentComposite, SWT.TOP);
this.tabFolder.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
true));
// we create the flat tree
final TabItem flatItem = new TabItem(this.tabFolder, SWT.NONE);
final Composite flatComposite = createComposite(this.tabFolder);
IETypedElementTabSelectionWidgetInternal filteredTree = new ETypedElementSelectionControl(
flatComposite, this.selectionMaxSize, this.emptySelection,
this.knownEPackage);
flatItem.setText(filteredTree.getTitle());
flatItem.setToolTipText(filteredTree.getToolTipText());
flatItem.setImage(filteredTree.getImage());
this.trees.put(flatItem, filteredTree);
flatItem.setControl(flatComposite);
// we create the sortedTabItem
final TabItem sortedItem = new TabItem(this.tabFolder, SWT.NONE);
final Composite sortedComposite = createComposite(this.tabFolder);
filteredTree = new ETypedElementSelectionSortedControl(sortedComposite,
this.selectionMaxSize, this.emptySelection, this.knownEPackage);
sortedItem.setText(filteredTree.getTitle());
sortedItem.setToolTipText(filteredTree.getToolTipText());
sortedItem.setImage(filteredTree.getImage());
sortedItem.setControl(sortedComposite);
this.trees.put(sortedItem, filteredTree);
initSelectedTabItem();
}
private IETypedElementTabSelectionWidgetInternal getActiveTree() {
// selectionIndex: Index of the selected tab
final int selectionIndex = this.tabFolder.getSelectionIndex();
final TabItem currentTabItem = this.tabFolder
.getItem(selectionIndex);
return this.trees.get(currentTabItem);
}
public void addOpenListener(final IOpenListener openListener) {
for (IETypedElementSelectionWidgetInternal tree : this.trees.values()) {
tree.addOpenListener(openListener);
}
}
public void addSelectionChangedListener(
final ISelectionChangedListener listener) {
for (IETypedElementSelectionWidgetInternal tree : this.trees.values()) {
tree.addSelectionChangedListener(listener);
}
}
/**
* Set the focus on the last selected TabItem
*/
private void initSelectedTabItem() {
final IPreferenceStore store = Activator.getDefault()
.getPreferenceStore();
final String value = store
.getString(PreferenceConstants.TE_SELECTION_TAB);
for (TabItem item : this.tabFolder.getItems()) {
if (item.getText().equals(value)) {
this.tabFolder.setSelection(item);
return;
}
}
}
public IStatus getValidationStatus() {
return getActiveTree().getValidationStatus();
}
public void setAvailableETypedElements(
final Collection<? extends ETypedElement> availableTE) {
this.availableElements = availableTE;
for (IETypedElementSelectionWidgetInternal current : this.trees
.values()) {
current.setAvailableETypedElements(availableTE);
}
}
public List<ETypedElement> getSelectedETypedElements() {
return getActiveTree().getSelectedETypedElements();
}
private void updatePreferenceValue() {
final IPreferenceStore store = Activator.getDefault()
.getPreferenceStore();
final String value = getActiveTree().getTitle();
store.setValue(
PreferenceConstants.TE_SELECTION_TAB,
value);
}
public void setSelectedETypedElements(
final Collection<? extends ETypedElement> newSelection) {
if (newSelection == null) {
throw new IllegalArgumentException();
}
// only select elements that match the filter
final List<ETypedElement> filteredSelection = new ArrayList<ETypedElement>();
for (ETypedElement typedElement : newSelection) {
if (this.availableElements.contains(typedElement)) {
filteredSelection.add(typedElement);
}
}
setSelection(new StructuredSelection(filteredSelection));
}
public void setSelection(final IStructuredSelection selection) {
for (IETypedElementSelectionWidgetInternal filteredTree : this.trees
.values()) {
filteredTree.setSelection(selection);
}
}
public List<ETypedElement> computeResult() {
// we save the last visible item :
updatePreferenceValue();
return getActiveTree().getSelectedETypedElements();
}
public boolean isDisposed() {
return this.tabFolder == null || this.tabFolder.isDisposed() || getActiveTree().isDisposed();
}
public FilteredTree getFilteredTree() {
return getActiveTree().getFilteredTree();
}
public void createContents() {
init();
for (IETypedElementSelectionWidgetInternal current : this.trees
.values()) {
current.createContents();
}
}
}