blob: 92bafe6cfd19a95bb3daf86784f2db123e47631c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 Borland Software Corporation and others.
*
* 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:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.emf.util.ui.controls;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfUtil;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ModelContent;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ui.provider.EmfModelContentProvider;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ui.provider.EmfModelLabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
public class SelectUriControl extends Composite {
public static interface ISelectionListener {
void selectionChanged(URI uri);
}
public SelectUriControl(Composite parentComposite, String defaultFileName, boolean isConsiderAdaptes, ResourceSet resourceSet) {
super(parentComposite,SWT.NULL);
mySelectionListeners = new ArrayList<ISelectionListener>();
myDefaultFileName = defaultFileName;
myIsConsiderAdaptes = isConsiderAdaptes;
myResourceSet = resourceSet;
setLayout(new GridLayout());
myViewer = new TreeViewer(this, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
Label secondLabel = new Label(this, SWT.LEFT);
secondLabel.setText(Messages.SelectFileControl_SelectedFile);
myUriText = new Text(this, SWT.BORDER);
myUriText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
myUriText.setEnabled(false);
myUriText.addModifyListener(FNAME_LISTENER);
myViewer.setContentProvider(CONTENT_PROVIDER);
myViewer.setLabelProvider(LABEL_PROVIDER);
myViewer.setAutoExpandLevel(DEFAUL_AUTO_EXPAND_LEVEL);
myViewer.setSorter(VIEWER_SORTER);
myViewer.addSelectionChangedListener(VIEWER_LISTENER);
myViewer.setColumnProperties(new String[] {NAME_COLUMN});
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
data.grabExcessVerticalSpace = true;
data.heightHint = 250;
data.widthHint = 350;
myViewer.getControl().setLayoutData(data);
IResource root = ResourcesPlugin.getWorkspace().getRoot();
myViewer.setInput(root);
}
public void addSelectionListener(ISelectionListener listener) {
mySelectionListeners.add(listener);
}
public void removeSelectionListener(ISelectionListener listener) {
mySelectionListeners.remove(listener);
}
public void setSelection(ISelection selection) {
myViewer.setSelection(selection);
}
private void fireSelectionChanged(URI uri) {
for (Iterator<ISelectionListener> it = new ArrayList<ISelectionListener>(mySelectionListeners).iterator(); it.hasNext();) {
ISelectionListener listener = it.next();
try {
listener.selectionChanged(uri);
}
catch(Exception e) {
}
}
}
public URI getSelectedUri() {
return myUri;
}
public TreeViewer getViewer() {
return myViewer;
}
private Object getAdapterSafe(Object adaptable, Class<?> adapterType) {
if (adaptable == null || !myIsConsiderAdaptes) {
return null;
}
return org.eclipse.core.runtime.Platform.getAdapterManager().getAdapter(adaptable, adapterType);
}
private final TreeViewer myViewer;
private final Text myUriText;
private URI myUri;
private Object myResource;
private final String myDefaultFileName;
private final boolean myIsConsiderAdaptes;
private final List<ISelectionListener> mySelectionListeners;
private final ResourceSet myResourceSet;
private static final int DEFAUL_AUTO_EXPAND_LEVEL = 0;
private static final String NAME_COLUMN = "name"; //$NON-NLS-1$
private ITreeContentProvider CONTENT_PROVIDER = new ITreeContentProvider () {
private final ITreeContentProvider myWorkbenchProvider = new WorkbenchContentProvider();
public Object[] getChildren(Object parentElement) {
if(parentElement instanceof IFile) {
IFile file = (IFile)parentElement;
List<EmfModelContentProvider.Node> children = new ArrayList<EmfModelContentProvider.Node>();
try {
ModelContent res = EmfUtil.loadModel(URI.createPlatformResourceURI(file.getFullPath().toString(), false), myResourceSet);
for(EObject obj : res.getContent()) {
children.add(new EmfModelContentProvider.EObjectNode(obj, file));
}
}
catch(RuntimeException ignore) {
}
return children.toArray();
}
else if(parentElement instanceof EmfModelContentProvider.Node) {
return ((EmfModelContentProvider.Node)parentElement).getChildren();
}
else {
return myWorkbenchProvider.getChildren(parentElement);
}
}
public Object getParent(Object element) {
if(element instanceof EmfModelContentProvider.Node) {
return ((EmfModelContentProvider.Node)element).getParent();
}
else {
return myWorkbenchProvider.getParent(element);
}
}
public boolean hasChildren(Object element) {
if(element instanceof IFile) {
return true;
}
else if(element instanceof EmfModelContentProvider.Node) {
return ((EmfModelContentProvider.Node)element).hasChildren();
}
else {
return myWorkbenchProvider.hasChildren(element);
}
}
public Object[] getElements(Object inputElement) {
Object[] elements = myWorkbenchProvider.getElements(inputElement);
Object[] clonedElems = new Object[elements.length];
for (int i = 0; i < elements.length; ++i) {
EObject eObject = (EObject) getAdapterSafe(elements[i], EObject.class);
if (eObject != null) {
clonedElems[i] = new EmfModelContentProvider.EObjectNode(eObject, null);
}
else {
clonedElems[i] = elements[i];
}
}
return clonedElems;
}
public void dispose() {
myWorkbenchProvider.dispose();
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
myWorkbenchProvider.inputChanged(viewer, oldInput, newInput);
}
};
private ILabelProvider LABEL_PROVIDER = new LabelProvider() {
private final ILabelProvider myWorkbenchLabelProvider = new WorkbenchLabelProvider();
private final ILabelProvider myEmfModelLabelProvider = new EmfModelLabelProvider();
private final ILabelProvider myEObjectLabelProvider = new AdapterFactoryLabelProvider(
new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE));
@Override
public String getText(Object element) {
if(element instanceof EmfModelContentProvider.Node) {
return myEmfModelLabelProvider.getText(element);
}
else {
EObject eObject = (EObject) getAdapterSafe(element, EObject.class);
if (eObject != null) {
return myEObjectLabelProvider.getText(eObject);
}
return myWorkbenchLabelProvider.getText(element);
}
};
@Override
public Image getImage(Object element) {
if(element instanceof EmfModelContentProvider.Node) {
return myEmfModelLabelProvider.getImage(element);
}
else {
EObject eObject = (EObject) getAdapterSafe(element, EObject.class);
if (eObject != null) {
return myEObjectLabelProvider.getImage(eObject);
}
return myWorkbenchLabelProvider.getImage(element);
}
}
};
private static final ViewerSorter VIEWER_SORTER = new ViewerSorter() {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
boolean folderLeft = (e1 instanceof IContainer);
boolean folderRight = (e2 instanceof IContainer);
if (folderLeft == folderRight) {
return super.compare(viewer, e1, e2);
}
return folderLeft ? -1 : 1;
}
};
private final ISelectionChangedListener VIEWER_LISTENER = new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
URI uri;
if(selection instanceof IStructuredSelection == false) {
uri = null;
}
else {
Object selected = ((IStructuredSelection)selection).getFirstElement();
if (selected instanceof IFile) {
IFile file = (IFile)selected;
uri = URI.createPlatformResourceURI(file.getFullPath().toString(), false);
}
else if(selected instanceof EmfModelContentProvider.EObjectNode) {
EObject obj = ((EmfModelContentProvider.EObjectNode)selected).getObject();
uri = EcoreUtil.getURI(obj);
}
else {
EObject eObject = (EObject) getAdapterSafe(selected, EObject.class);
if (eObject != null) {
uri = EcoreUtil.getURI(eObject);
}
else {
uri = null;
}
}
}
myUriText.setEnabled(false);
myResource = null;
myUriText.setText(uri == null ? "" : uri.toString()); //$NON-NLS-1$
if (uri == null && selection instanceof IStructuredSelection && myDefaultFileName != null) {
myResource = ((IStructuredSelection) selection).getFirstElement();
if(myResource instanceof IContainer) {
myUriText.setEnabled(true);
myUriText.setText(myDefaultFileName);
return;
}
}
fireSelectionChanged(myUri = uri);
}
};
private final ModifyListener FNAME_LISTENER = new ModifyListener() {
public void modifyText(ModifyEvent e) {
if (myResource instanceof IContainer) {
URI uri = IPathUtils.getUri(IPathUtils.computePath((IResource) myResource, myUriText.getText()));
fireSelectionChanged(myUri = uri);
}
}
};
}