/** | |
* Copyright (c) 2015 Soft-Maint | |
* 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: | |
* Thomas Cicognani (Soft-Maint) - Bug 471020 - Ecore Explorer View | |
* Thomas Cicognani (Soft-Maint) - Bug 472041 - [New Browser] Add a customization counting instances by EClass in the same Resource | |
*/ | |
package org.eclipse.modisco.infra.browser.ecore.ui.internal.widget; | |
import java.util.Collection; | |
import java.util.HashSet; | |
import java.util.List; | |
import java.util.Set; | |
import org.eclipse.emf.ecore.EClass; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.emf.ecore.EPackage; | |
import org.eclipse.emf.ecore.resource.Resource; | |
import org.eclipse.emf.ecore.resource.ResourceSet; | |
import org.eclipse.jface.action.MenuManager; | |
import org.eclipse.modisco.infra.browser.ecore.ui.internal.exported.IEcoreExplorerWidget; | |
import org.eclipse.modisco.infra.browser.ecore.ui.internal.view.Utils; | |
import org.eclipse.modisco.infra.browser.ecore.ui.internal.widget.EcoreExplorerWidgetComposite.IEClassSelectionListener; | |
import org.eclipse.modisco.util.emf.core.allinstances.AllInstancesUtils; | |
import org.eclipse.swt.widgets.Composite; | |
public class EcoreExplorerWidget implements IEcoreExplorerWidget { | |
private final EcoreExplorerWidgetComposite composite; | |
private final Set<Resource> currentResources = new HashSet<Resource>(); | |
private final Set<EPackage> displayedEPkgs = new HashSet<EPackage>(); | |
EcoreExplorerWidget(final Composite parent) { | |
this(parent, new MenuManager(EcoreExplorerWidget.class.getName(), | |
EcoreExplorerWidget.class.getName())); | |
} | |
EcoreExplorerWidget(final Composite parent, final MenuManager menuManager) { | |
this.composite = new EcoreExplorerWidgetComposite(parent, menuManager); | |
this.composite.addEClassSelectionListener(new IEClassSelectionListener() { | |
public void onEClassSelected(final Set<EClass> eClasses) { | |
EcoreExplorerWidget.this.displayInstancesOf(eClasses); | |
} | |
}); | |
} | |
protected void displayInstancesOf(final Set<EClass> eClasses) { | |
final Set<EObject> allInstances = new HashSet<EObject>(); | |
for (EClass eClass : eClasses) { | |
final Set<EObject> eClassInstances = getInstancesOfFromCurrentResources(eClass); | |
allInstances.addAll(eClassInstances); | |
} | |
this.composite.displayInstances(allInstances); | |
} | |
public Set<EObject> getInstancesOfFromCurrentResources(final EClass eClass) { | |
final Set<EObject> allInstances = new HashSet<EObject>(); | |
for (Resource resource : this.currentResources) { | |
final List<EObject> instances = AllInstancesUtils | |
.allInstances(eClass, resource, false); | |
allInstances.addAll(instances); | |
} | |
return allInstances; | |
} | |
public Set<EObject> getInstancesOfFromCurrentResourceSets( | |
final EClass eClass) { | |
final Set<EObject> result = new HashSet<EObject>(); | |
final Set<Resource> allResources = new HashSet<Resource>(); | |
for (Resource resource : this.currentResources) { | |
final ResourceSet resourceSet = resource.getResourceSet(); | |
if (resourceSet != null) { | |
allResources.addAll(resourceSet.getResources()); | |
} | |
} | |
for (Resource resource : allResources) { | |
final List<EObject> instances = AllInstancesUtils.allInstances( | |
eClass, resource, false); | |
result.addAll(instances); | |
} | |
return result; | |
} | |
public Object getAdapter(@SuppressWarnings("rawtypes") final Class adapter) { | |
// @SuppressWarnings("rawtypes") Raw Type because of the implementation | |
Object result = null; | |
if (adapter.isInstance(this)) { | |
result = this; | |
} else if (adapter.isInstance(this.composite)) { | |
result = this.composite; | |
} | |
return result; | |
} | |
public void changeInput(final Collection<EObject> eObjects) { | |
for (EPackage ePackage : this.displayedEPkgs) { | |
removeAllAdapter(ePackage); | |
} | |
final Set<EPackage> pkgsToDisplay = new HashSet<EPackage>(); | |
for (EObject eObject : eObjects) { | |
final Resource eResource = eObject.eResource(); | |
this.currentResources.add(eResource); | |
final EPackage ePackage = Utils.getEPackage(eObject); | |
pkgsToDisplay.add(ePackage); | |
} | |
for (EPackage ePackage : pkgsToDisplay) { | |
removeAllAdapter(ePackage); | |
@SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops") | |
/* | |
* @SuppressWarnings("PMD.AvoidInstantiatingObjectsInLoops"): tci> | |
* We have to create a new adapter for each package | |
*/ | |
final EcoreExplorerAdapter adapter = new EcoreExplorerAdapter(this); | |
ePackage.eAdapters().add(adapter); | |
} | |
this.displayedEPkgs.clear(); | |
this.displayedEPkgs.addAll(pkgsToDisplay); | |
this.composite.changeInput(pkgsToDisplay); | |
} | |
private static void removeAllAdapter(final EPackage ePackage) { | |
final List<EcoreExplorerAdapter> adaptersToRemove = InternalUtils | |
.getEcoreExplorerAdapters(ePackage); | |
ePackage.eAdapters().removeAll(adaptersToRemove); | |
} | |
} |