/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.diagram.ui.editor; import java.util.ArrayList; import java.util.Iterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.teiid.designer.ui.common.eventsupport.SelectionUtilities; /** * DiagramEditorSelectionProvider is the ModelObjectSelectionProvider for the DiagramViewer. * It handles diagram selection for the viewer, plus an optional provider for the DiagramController. * * @since 8.0 */ public class DiagramEditorSelectionProvider implements ISelectionProvider, ISelectionChangedListener { ISelection currentSelection; ArrayList listenerList = new ArrayList(); /** * Construct an instance of DiagramEditorSelectionProvider. */ public DiagramEditorSelectionProvider(DiagramViewer viewer) { viewer.addSelectionChangedListener(this); } public void setDiagramController(DiagramController controller) { ISelectionProvider provider = controller.getSelectionSource(); if ( provider != null ) { provider.addSelectionChangedListener(this); } } public void removeDiagramController(DiagramController controller) { ISelectionProvider provider = controller.getSelectionSource(); if ( provider != null ) { provider.removeSelectionChangedListener(this); } } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ @Override public synchronized void addSelectionChangedListener(ISelectionChangedListener listener) { if ( ! listenerList.contains(listener) ) { listenerList.add(listener); } } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection() */ @Override public synchronized ISelection getSelection() { return currentSelection; } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener) */ @Override public synchronized void removeSelectionChangedListener(ISelectionChangedListener listener) { listenerList.remove(listener); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection) */ @Override public synchronized void setSelection(ISelection selection) { currentSelection = selection; fireSelectionChanged(new SelectionChangedEvent(this, selection)); } /* (non-Javadoc) * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent) */ @Override public synchronized void selectionChanged(SelectionChangedEvent event) { currentSelection = event.getSelection(); fireSelectionChanged(event); } private void fireSelectionChanged(SelectionChangedEvent event) { SelectionChangedEvent theEvent = event; ISelection selection = event.getSelection(); boolean invalidSelection = false; for( Object eobj : SelectionUtilities.getSelectedEObjects(selection)) { if( ((EObject)eobj).eResource() == null ) { invalidSelection = true; } if( invalidSelection ) break; } if( invalidSelection ) { theEvent = new SelectionChangedEvent(event.getSelectionProvider(), new StructuredSelection()); } for ( Iterator iter = listenerList.iterator() ; iter.hasNext() ; ) { ((ISelectionChangedListener) iter.next()).selectionChanged(theEvent); } } }