blob: 76c62496e9ce908468ccc576f6215564562a26b6 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2013, 2017 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* CEA LIST - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.cdo.internal.ui.views;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.eresource.CDOResourceFolder;
import org.eclipse.emf.cdo.explorer.CDOExplorerUtil;
import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout;
import org.eclipse.emf.cdo.ui.CDOItemProvider;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.net4j.util.ui.views.IElementFilter;
import org.eclipse.papyrus.cdo.ui.Activator;
import org.eclipse.papyrus.cdo.ui.SharedImages;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.IWorkbenchPage;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
/**
* This is the ModelRepositoryItemProvider type. Enjoy.
*/
public class CheckoutItemProvider extends CDOItemProvider {
private final Predicate<Object> isDIResource = new Predicate<Object>() {
@Override
public boolean apply(Object input) {
return (input instanceof CDOResource) && DIResourceQuery.getDIResources(((CDOResource) input).cdoView()).contains(input);
}
};
private final Predicate<Object> isUnaffiliatedResource = new Predicate<Object>() {
@Override
public boolean apply(Object input) {
return !(input instanceof CDOResource) || DIResourceQuery.isUnaffiliatedResource((CDOResource) input);
}
};
@SuppressWarnings("unchecked")
private final Predicate<Object> resourceFilter = Predicates.or(Predicates.instanceOf(CDOResourceFolder.class), isDIResource, isUnaffiliatedResource);
private final Function<Object, Object> resourceNodeTransformer = new Function<Object, Object>() {
@Override
public Object apply(Object input) {
if (isDIResource.apply(input)) {
return DIModel.getInstance((CDOResource) input, true);
} else {
return input;
}
}
};
private final Predicate<Object> extensibleFilter;
public CheckoutItemProvider(IWorkbenchPage page, IElementFilter rootElementFilter) {
super(page, rootElementFilter);
extensibleFilter = ItemProviderFilterRegistry.INSTANCE.createFilter(this);
}
public CheckoutItemProvider(IWorkbenchPage page, Object rootElementToShow) {
this(page, Collections.singleton(rootElementToShow));
}
public CheckoutItemProvider(IWorkbenchPage page, final Collection<?> rootElementsToShow) {
this(page, new IElementFilter() {
@Override
public boolean filter(Object element) {
return rootElementsToShow.contains(element);
}
});
}
public CheckoutItemProvider(IWorkbenchPage page) {
this(page, (IElementFilter) null);
}
@Override
public Object[] getChildren(Object element) {
if (element instanceof CDOCheckout) {
// initialize query for DI resources
CDOCheckout checkout = (CDOCheckout) element;
if (checkout.isOpen()) {
DIResourceQuery.initialize(getViewer(), checkout.getView());
}
}
Iterable<?> result;
if (element instanceof DIModel) {
result = Arrays.asList(((DIModel) element).getChildren());
} else {
result = Arrays.asList(super.getChildren(element));
if ((element instanceof CDOResourceFolder) || (element instanceof CDOCheckout)) {
result = filterDIResources(result);
}
}
return Iterables.toArray(Iterables.filter(result, extensibleFilter), Object.class);
}
@Override
public Object getParent(Object element) {
Object result;
if (element instanceof CDOResource) {
CDOResource di = DIResourceQuery.getAffiliateResource((CDOResource) element);
if (di != null) {
result = DIModel.getInstance(di, true);
} else {
result = super.getParent(element);
}
} else if (element instanceof DIModel) {
CDOResource resource = ((DIModel) element).getResource();
CDOView view = resource.cdoView();
// can't query the parent of an object in a closed view
result = ((view != null) && view.isClosed()) ? null : super.getParent(resource);
} else {
CDOView view = null;
if (element instanceof CDOObject) {
view = ((CDOObject) element).cdoView();
}
// can't query the parent of an object in a closed view
result = ((view != null) && view.isClosed()) ? null : super.getParent(element);
// we don't show the view
if (result instanceof CDOView) {
result = CDOExplorerUtil.getCheckout((CDOView) result);
}
}
return result;
}
protected Iterable<?> filter(Iterable<?> elements, Predicate<Object> predicate) {
return Iterables.transform(Iterables.filter(elements, predicate), resourceNodeTransformer);
}
protected Iterable<?> filterDIResources(Iterable<?> elements) {
return filter(elements, resourceFilter);
}
@Override
public Image getImage(Object obj) {
Image result;
if (obj instanceof CDOCheckout) {
boolean open = ((CDOCheckout) obj).isOffline();
result = SharedImages.getImage(open ? Activator.ICON_OPEN_REPOSITORY : Activator.ICON_CLOSED_REPOSITORY);
} else if (obj instanceof DIModel) {
result = ((DIModel) obj).getImage();
} else {
result = super.getImage(obj);
}
return result;
}
@Override
public String getText(Object obj) {
String result;
if (obj instanceof CDOCheckout) {
result = ((CDOCheckout) obj).getLabel();
} else if (obj instanceof DIModel) {
result = ((DIModel) obj).getName();
} else {
result = super.getText(obj);
}
return result;
}
}