/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.select;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.jboss.tools.common.model.XModelObject;
public class XModelObjectSelectionProvider implements ISelectionProvider, ISelectionChangedListener {
private List<ISelectionChangedListener> listeners;
private ISelectionProvider host = null;
private Map<String,ISelectionProvider> hostsMap = new HashMap<String,ISelectionProvider>();
private ISelectionProvider[] hosts = new ISelectionProvider[0];
boolean isFiringSelection = false;
public XModelObjectSelectionProvider() {
listeners = new ArrayList<ISelectionChangedListener>();
}
public boolean isFiringSelection() {
return isFiringSelection;
}
public void dispose() {
setHost(null);
listeners.clear();
hosts = new ISelectionProvider[0];
hostsMap.clear();
}
public void addHost(String name, ISelectionProvider host) {
addHost(name, host, false);
}
public void addHost(String name, ISelectionProvider host, boolean select) {
if(host == null) hostsMap.remove(name); else hostsMap.put(name, host);
hosts = (ISelectionProvider[])hostsMap.values().toArray(new ISelectionProvider[0]);
if(host != null && select) setHost(host);
}
public void setHost(ISelectionProvider host) {
if(this.host == host) return;
if(this.host != null) {
this.host.removeSelectionChangedListener(this);
}
this.host = host;
if(host != null)
host.addSelectionChangedListener(this);
}
public void addSelectionChangedListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
public ISelection getSelection() {
return (host == null) ? null : convertSelectionToAdapter(host.getSelection());
}
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
listeners.remove(listener);
}
public void setSelection(ISelection selection) {
if(host == null) return;
if(isFiringSelection) return;
ISelection s = convertSelectionFromAdapter(selection);
for (int i = 0; i < hosts.length; i++) hosts[i].setSelection(s);
}
public void selectionChanged(SelectionChangedEvent event) {
if(isFiringSelection) return;
isFiringSelection = true;
try {
if (!listeners.isEmpty()) {
SelectionChangedEvent newEvent = new SelectionChangedEvent(this, convertSelectionToAdapter(event.getSelection()));
Iterator<ISelectionChangedListener> iterator = listeners.iterator();
while (iterator.hasNext())
iterator.next().selectionChanged(newEvent);
}
} finally {
isFiringSelection = false;
}
}
public void postSelectionChanged(SelectionChangedEvent event) {
if(isFiringSelection) return;
isFiringSelection = true;
try {
if (!listeners.isEmpty()) {
Iterator<ISelectionChangedListener> iterator = listeners.iterator();
while (iterator.hasNext())
iterator.next().selectionChanged(event);
}
} finally {
isFiringSelection = false;
}
}
private ISelection convertSelectionToAdapter(ISelection selection) {
if(!(selection instanceof IStructuredSelection) || selection.isEmpty()) {
return selection;
}
IStructuredSelection structuredSelection = (IStructuredSelection)selection;
List<?> objects = structuredSelection.toList();
List<Object> adaptedObjects = new ArrayList<Object>();
Iterator<?> iterator = objects.iterator();
while (iterator.hasNext()) {
Object object = iterator.next();
if (object instanceof XModelObject) {
XModelObject xmo = (XModelObject)object;
if ("FileJAVA".equals(xmo.getModelEntity().getName())) { //$NON-NLS-1$
Object adapter = xmo.getAdapter(ICompilationUnit.class);
if(adapter != null) adaptedObjects.add(adapter);
} else {
adaptedObjects.add(xmo);
}
} else if(object instanceof IAdaptable) {
adaptedObjects.add(object);
}
}
return new StructuredSelection(adaptedObjects);
}
private ISelection convertSelectionFromAdapter(ISelection selection) {
if(!(selection instanceof IStructuredSelection) || selection.isEmpty()) {
return selection;
}
IStructuredSelection structuredSelection = (IStructuredSelection)selection;
List<?> objects = structuredSelection.toList();
List<XModelObject> modelObjects = new ArrayList<XModelObject>();
Iterator<?> iterator = objects.iterator();
while (iterator.hasNext()) {
Object object = iterator.next();
if (object instanceof XModelObject) {
modelObjects.add((XModelObject)object);
}
}
return new StructuredSelection(modelObjects);
}
}