/** * Copyright (c) 2002-2006 IBM Corporation 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: * IBM - Initial API and implementation */ package org.eclipse.emf.mapping.presentation; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IStatusLineManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.Widget; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.edit.provider.AdapterFactoryTreeIterator; import org.eclipse.emf.edit.provider.IStructuredItemContentProvider; import org.eclipse.emf.mapping.Mapping; import org.eclipse.emf.mapping.domain.MappingDomain; public class SimpleMappedObjectViewer extends TreeViewer { protected SimpleMappedObjectViewer otherViewer; protected MappingDomain mappingDomain; protected AdapterFactory adapterFactory; protected boolean isTop; protected class SelectObjectAction extends Action { protected Object objectToSelect; public SelectObjectAction(String text, ImageDescriptor imageDescriptor) { super(text, imageDescriptor); setEnabled(false); } public void setObjectToSelect(Object objectToSelect) { this.objectToSelect = objectToSelect; setEnabled(objectToSelect != null); } @Override public void run() { setSelection(new StructuredSelection(new Object [] { objectToSelect }), true); } } protected SelectObjectAction selectNextMappedObject; protected SelectObjectAction selectPreviousMappedObject; protected SelectObjectAction selectNextUnmappedObject; protected SelectObjectAction selectPreviousUnmappedObject; protected Action filterMappedObjects; protected Action selectOtherMappedObjects; public SimpleMappedObjectViewer(MappingDomain domain, Tree tree, boolean isTop) { super(tree); this.mappingDomain = domain; this.isTop = isTop; tree.addMouseListener (new MouseAdapter() { @Override public void mouseDoubleClick(MouseEvent event) { selectOtherMappedObjects(); } }); addSelectionChangedListener (new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { updateActions(); } }); } public void setAdapterFactory(AdapterFactory adapterFactory) { this.adapterFactory = adapterFactory; } public Action getFilterMappedObjectsAction() { return filterMappedObjects; } public void setOtherViewer(SimpleMappedObjectViewer otherViewer) { this.otherViewer = otherViewer; } protected ISelection doGetSelection() { return super.getSelection(); } public void updateActions() { Collection<?> selection = ((IStructuredSelection)doGetSelection()).toList(); boolean isReady = false; Object previousMapped = null; Object previousUnmapped = null; Object nextMapped = null; Object nextUnmapped = null; boolean selectionHasMappings = false; LOOP: for (Object object : ((IStructuredItemContentProvider)getInput()).getElements(getInput())) { for (TreeIterator<Object> treeIterator = new AdapterFactoryTreeIterator<Object>(adapterFactory, object); treeIterator.hasNext(); ) { Object child = treeIterator.next(); if (selection.contains(child)) { isReady = true; if (!selectionHasMappings) { for (Mapping mapping : mappingDomain.getMappingRoot().getMappings(child)) { if (mapping.getInputs().contains(child) && !mapping.getOutputs().isEmpty() || mapping.getOutputs().contains(child) && !mapping.getInputs().isEmpty()) { selectionHasMappings = true; break; } } } } else if (mappingDomain.getMappingRoot().getMappings(child).isEmpty()) { if (isReady) { if (nextUnmapped == null) { nextUnmapped = child; if (nextMapped != null) { break LOOP; } } } else { previousUnmapped = child; } } else { if (isReady) { if (nextMapped == null) { nextMapped = child; if (nextUnmapped != null) { break LOOP; } } } else { previousMapped = child; } } } } selectNextMappedObject.setObjectToSelect(nextMapped); selectPreviousMappedObject.setObjectToSelect(previousMapped); selectNextUnmappedObject.setObjectToSelect(nextUnmapped); selectPreviousUnmappedObject.setObjectToSelect(previousUnmapped); selectOtherMappedObjects.setEnabled(selectionHasMappings); } public void selectOtherMappedObjects() { Collection<Object> result = new HashSet<Object>(); for (Object object : ((IStructuredSelection)doGetSelection()).toList()) { Collection<? extends Mapping> mappings = mappingDomain.getMappingRoot().getMappings(object); if (mappingDomain.getMappingRoot().isInputObject(object)) { for (Mapping mapping : mappings) { result.addAll(mapping.getOutputs()); } } else if (mappingDomain.getMappingRoot().isOutputObject(object)) { for (Mapping mapping : mappings) { result.addAll(mapping.getInputs()); } } } otherViewer.setSelection(new StructuredSelection(result.toArray()), true); } @Override public ISelection getSelection() { ISelection basicSelection = doGetSelection(); if (otherViewer == null) { return basicSelection; } else { return new ComposedSelection(basicSelection, new ISelection [] {basicSelection, otherViewer.doGetSelection()}); } } public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager, IStatusLineManager statusLineManager) { String label = isTop ? "Top" : "Bottom"; String oppositeLabel = isTop ? "Bottom" : "Top"; selectNextMappedObject = new SelectObjectAction (MappingUIPlugin.getPlugin().getString("_UI_NextMappedObject_menu_item"), MappingUIPlugin.getPlugin().getImageDescriptor("full/elcl16/SelectNext" + label + "MappedObject")); selectNextMappedObject.setToolTipText(MappingUIPlugin.getPlugin().getString("_UI_NextMappedObject_description")); selectNextMappedObject.setHoverImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/clcl16/SelectNext" + label + "MappedObject")); selectNextMappedObject.setDisabledImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/dlcl16/SelectNext" + label + "MappedObject")); toolBarManager.add(selectNextMappedObject); menuManager.add(selectNextMappedObject); selectPreviousMappedObject = new SelectObjectAction (MappingUIPlugin.getPlugin().getString("_UI_PreviousMappedObject_menu_item"), MappingUIPlugin.getPlugin().getImageDescriptor("full/elcl16/SelectPrevious" + label + "MappedObject")); selectPreviousMappedObject.setToolTipText(MappingUIPlugin.getPlugin().getString("_UI_PreviousMappedObject_description")); selectPreviousMappedObject.setHoverImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/clcl16/SelectPrevious" + label + "MappedObject")); selectPreviousMappedObject.setDisabledImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/dlcl16/SelectPrevious" + label + "MappedObject")); toolBarManager.add(selectPreviousMappedObject); menuManager.add(selectPreviousMappedObject); menuManager.add(new Separator()); selectNextUnmappedObject = new SelectObjectAction (MappingUIPlugin.getPlugin().getString("_UI_NextUnmappedObject_menu_item"), MappingUIPlugin.getPlugin().getImageDescriptor("full/elcl16/SelectNext" + label + "UnmappedObject")); selectNextUnmappedObject.setToolTipText(MappingUIPlugin.getPlugin().getString("_UI_NextUnmappedObject_description")); selectNextUnmappedObject.setHoverImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/clcl16/SelectNext" + label + "UnmappedObject")); selectNextUnmappedObject.setDisabledImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/dlcl16/SelectNext" + label + "UnmappedObject")); toolBarManager.add(selectNextUnmappedObject); menuManager.add(selectNextUnmappedObject); selectPreviousUnmappedObject = new SelectObjectAction (MappingUIPlugin.getPlugin().getString("_UI_PreviousUnmappedObject_menu_item"), MappingUIPlugin.getPlugin().getImageDescriptor("full/elcl16/SelectPrevious" + label + "UnmappedObject")); selectPreviousUnmappedObject.setToolTipText(MappingUIPlugin.getPlugin().getString("_UI_PreviousUnmappedObject_description")); selectPreviousUnmappedObject.setHoverImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/clcl16/SelectPrevious" + label + "UnmappedObject")); selectPreviousUnmappedObject.setDisabledImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/dlcl16/SelectPrevious" + label + "UnmappedObject")); toolBarManager.add(selectPreviousUnmappedObject); menuManager.add(selectPreviousUnmappedObject); menuManager.add(new Separator()); filterMappedObjects = new Action (MappingUIPlugin.getPlugin().getString("_UI_FilterMappedObjects_menu_item"), MappingUIPlugin.getPlugin().getImageDescriptor("full/elcl16/HideAllMappedObjects")) { @Override public void run() { preserveState(); Object input = getInput(); setInput(input); restoreState(); updateActions(); } @Override public void setChecked(boolean checked) { super.setChecked(checked); setToolTipText (MappingUIPlugin.getPlugin().getString (checked ? "_UI_FilterMappedObjects_checked_description" : "_UI_FilterMappedObjects_unchecked_description")); } }; filterMappedObjects.setChecked(false); filterMappedObjects.setHoverImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/clcl16/HideAllMappedObjects")); filterMappedObjects.setDisabledImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/dlcl16/HideAllMappedObjects")); toolBarManager.add(filterMappedObjects); menuManager.add(filterMappedObjects); menuManager.add(new Separator()); selectOtherMappedObjects = new Action (MappingUIPlugin.getPlugin().getString("_UI_SelectOtherMappedObjects_menu_item"), MappingUIPlugin.getPlugin().getImageDescriptor("full/elcl16/Select" + oppositeLabel + "MappedObjects")) { @Override public void run() { selectOtherMappedObjects(); } }; selectOtherMappedObjects.setEnabled(false); selectOtherMappedObjects.setToolTipText(MappingUIPlugin.getPlugin().getString("_UI_SelectOtherMappedObjects_description")); selectOtherMappedObjects.setHoverImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/clcl16/Select" + oppositeLabel + "MappedObjects")); selectOtherMappedObjects.setDisabledImageDescriptor (MappingUIPlugin.getPlugin().getImageDescriptor("full/dlcl16/Select" + oppositeLabel + "MappedObjects")); toolBarManager.add(selectOtherMappedObjects); menuManager.add(selectOtherMappedObjects); toolBarManager.update(true); menuManager.update(true); } protected Collection<Object> expandedObjects = new HashSet<Object>(); protected Collection<Object> selectedObjects = new HashSet<Object>(); public void preserveState() { Collection<Object> oldExpandedObjects = expandedObjects; expandedObjects = new HashSet<Object>(Arrays.asList(getExpandedElements())); oldExpandedObjects.removeAll(expandedObjects); for (Object oldExpandedObject : oldExpandedObjects) { Widget item = findItem(oldExpandedObject); if (item == null) { expandedObjects.add(oldExpandedObject); } } Collection<Object> oldSelectedObjects = selectedObjects; List<?> list = ((IStructuredSelection)getSelection()).toList(); selectedObjects = new HashSet<Object>(list); if (selectedObjects.isEmpty()) { selectedObjects = oldSelectedObjects; } } public void restoreState() { setExpandedElements(expandedObjects.toArray()); setSelection(new StructuredSelection(selectedObjects.toArray()), true); } }