/******************************************************************************* | |
* Copyright (c) 2010, 2011 Mia-Software 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: | |
* Nicolas Bros (Mia-Software) - initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.modisco.infra.browser.custom.examples.generation.popup.actions; | |
import java.io.IOException; | |
import java.util.Iterator; | |
import org.eclipse.core.resources.IFile; | |
import org.eclipse.emf.common.util.EList; | |
import org.eclipse.emf.common.util.URI; | |
import org.eclipse.emf.ecore.EAttribute; | |
import org.eclipse.emf.ecore.EClass; | |
import org.eclipse.emf.ecore.EClassifier; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.emf.ecore.EPackage; | |
import org.eclipse.emf.ecore.EReference; | |
import org.eclipse.emf.ecore.resource.Resource; | |
import org.eclipse.emf.ecore.resource.ResourceSet; | |
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; | |
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; | |
import org.eclipse.jface.action.IAction; | |
import org.eclipse.jface.viewers.ISelection; | |
import org.eclipse.jface.viewers.IStructuredSelection; | |
import org.eclipse.modisco.infra.browser.custom.AttributeView; | |
import org.eclipse.modisco.infra.browser.custom.CustomView; | |
import org.eclipse.modisco.infra.browser.custom.CustomViewFeature; | |
import org.eclipse.modisco.infra.browser.custom.CustomizableFeatures; | |
import org.eclipse.modisco.infra.browser.custom.MetamodelView; | |
import org.eclipse.modisco.infra.browser.custom.ReferenceView; | |
import org.eclipse.modisco.infra.browser.custom.StaticFeatureValue; | |
import org.eclipse.modisco.infra.browser.custom.TypeView; | |
import org.eclipse.modisco.infra.browser.custom.emf.UicustomFactory; | |
import org.eclipse.modisco.infra.browser.custom.examples.generation.Activator; | |
import org.eclipse.modisco.infra.common.core.internal.utils.ModelUtils; | |
import org.eclipse.modisco.infra.common.core.logging.MoDiscoLogger; | |
import org.eclipse.ui.IActionDelegate; | |
import org.eclipse.ui.IObjectActionDelegate; | |
import org.eclipse.ui.IWorkbenchPart; | |
public class HideAllReferencesAction implements IObjectActionDelegate { | |
private ISelection fSelection; | |
public HideAllReferencesAction() { | |
super(); | |
} | |
/** | |
* @see IActionDelegate#run(IAction) | |
*/ | |
public void run(final IAction action) { | |
if (this.fSelection instanceof IStructuredSelection) { | |
IStructuredSelection structuredSelection = (IStructuredSelection) this.fSelection; | |
Iterator<?> iterator = structuredSelection.iterator(); | |
while (iterator.hasNext()) { | |
Object selectedObject = iterator.next(); | |
if (selectedObject instanceof IFile) { | |
IFile file = (IFile) selectedObject; | |
handleSelectedFile(file); | |
} | |
} | |
} | |
} | |
private void handleSelectedFile(final IFile file) { | |
MetamodelView metamodelView = loadResource(file); | |
if (metamodelView != null) { | |
transformUiCustom(metamodelView); | |
saveResource(metamodelView); | |
} | |
} | |
private void saveResource(final MetamodelView metamodelView) { | |
Resource resource = metamodelView.eResource(); | |
try { | |
resource.save(null); | |
} catch (IOException e) { | |
MoDiscoLogger.logError(e, Activator.getDefault()); | |
} | |
} | |
protected void transformUiCustom(final MetamodelView metamodelView) { | |
String metamodelURI = metamodelView.getMetamodelURI(); | |
final EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(metamodelURI); | |
if (ePackage == null) { | |
MoDiscoLogger.logError( | |
"Cannot find customization metamodel: " + metamodelURI, Activator.getDefault()); //$NON-NLS-1$ | |
return; | |
} | |
EList<EClassifier> eClassifiers = ePackage.getEClassifiers(); | |
for (EClassifier eClassifier : eClassifiers) { | |
if (eClassifier instanceof EClass) { | |
EClass eClass = (EClass) eClassifier; | |
EList<EReference> eAllReferences = eClass.getEAllReferences(); | |
for (EReference eReference : eAllReferences) { | |
addReferenceCustomization(eClass, eReference, metamodelView); | |
} | |
} | |
} | |
} | |
/** | |
* Adds a customization that sets <code>visible</code> to <code>false</code> | |
* for the given {@link EReference} from the given {@link EClass}, so that | |
* it is hidden. | |
*/ | |
private void addReferenceCustomization(final EClass eClass, final EReference eReference, | |
final MetamodelView metamodelView) { | |
ReferenceView referenceView = findOrCreateReferenceView(eClass, eReference, metamodelView); | |
CustomViewFeature customViewFeature = findOrCreateCustomizedFeature(referenceView, | |
CustomizableFeatures.VISIBLE); | |
final StaticFeatureValue featureValue = UicustomFactory.eINSTANCE | |
.createStaticFeatureValue(); | |
featureValue.setValue("false"); //$NON-NLS-1$ | |
customViewFeature.setDefaultValue(featureValue); | |
} | |
/** | |
* Find an existing {@link TypeView} for the given {@link EClass}, or create | |
* it if it doesn't exist yet | |
*/ | |
protected static TypeView findOrCreateTypeView(final EClass eClass, | |
final MetamodelView metamodelView) { | |
final String className = ModelUtils.getMetaclassQualifiedName(eClass); | |
if (className == null) { | |
return null; | |
} | |
final EList<TypeView> types = metamodelView.getTypes(); | |
for (final TypeView typeView : types) { | |
if (className.equals(typeView.getMetaclassName())) { | |
return typeView; | |
} | |
} | |
final TypeView typeView = UicustomFactory.eINSTANCE.createTypeView(); | |
typeView.setMetaclassName(className); | |
metamodelView.getTypes().add(typeView); | |
return typeView; | |
} | |
/** | |
* Find an existing {@link AttributeView} for the given {@link EAttribute}, | |
* or create it if it doesn't exist yet | |
*/ | |
protected static AttributeView findOrCreateAttributeView(final EClass eClass, | |
final EAttribute attribute, final MetamodelView metamodelView) { | |
final TypeView typeView = findOrCreateTypeView(eClass, metamodelView); | |
final String attributeName = attribute.getName(); | |
final EList<AttributeView> attributeViews = typeView.getAttributes(); | |
for (final AttributeView attributeView : attributeViews) { | |
if (attributeName.equals(attributeView.getAttributeName())) { | |
return attributeView; | |
} | |
} | |
final AttributeView attributeView = UicustomFactory.eINSTANCE.createAttributeView(); | |
attributeView.setAttributeName(attributeName); | |
typeView.getAttributes().add(attributeView); | |
return attributeView; | |
} | |
/** | |
* Find an existing {@link CustomViewFeature} which customizes the given | |
* <code>customizableFeature</code> for the given {@link CustomView}, or | |
* create it if it doesn't exist yet | |
*/ | |
protected static CustomViewFeature findOrCreateCustomizedFeature(final CustomView customView, | |
final CustomizableFeatures customizableFeature) { | |
EList<CustomViewFeature> customizedFeatures = customView.getCustomizedFeatures(); | |
for (CustomViewFeature customViewFeature : customizedFeatures) { | |
if (customViewFeature.getCustomizedFeature() == customizableFeature) { | |
return customViewFeature; | |
} | |
} | |
final CustomViewFeature customViewFeature = UicustomFactory.eINSTANCE | |
.createCustomViewFeature(); | |
customizedFeatures.add(customViewFeature); | |
customViewFeature.setCustomizedFeature(customizableFeature); | |
return customViewFeature; | |
} | |
/** | |
* Find an existing {@link ReferenceView} for the given {@link EReference}, | |
* or create it if it doesn't exist yet | |
*/ | |
protected static ReferenceView findOrCreateReferenceView(final EClass eClass, | |
final EReference reference, final MetamodelView metamodelView) { | |
final TypeView typeView = findOrCreateTypeView(eClass, metamodelView); | |
final String referenceName = reference.getName(); | |
final EList<ReferenceView> referenceViews = typeView.getReferences(); | |
for (final ReferenceView referenceView : referenceViews) { | |
if (referenceName.equals(referenceView.getReferenceName())) { | |
return referenceView; | |
} | |
} | |
final ReferenceView referenceView = UicustomFactory.eINSTANCE.createReferenceView(); | |
referenceView.setReferenceName(referenceName); | |
typeView.getReferences().add(referenceView); | |
return referenceView; | |
} | |
/** | |
* Loads the MetamodelView (root of the UiCustom metamodel) from the given | |
* workspace file | |
*/ | |
private MetamodelView loadResource(final IFile file) { | |
final ResourceSet resourceSet = new ResourceSetImpl(); | |
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap() | |
.put("uiCustom", new XMIResourceFactoryImpl()); //$NON-NLS-1$ | |
final URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true); | |
final Resource resource = resourceSet.createResource(uri); | |
try { | |
resource.load(null); | |
} catch (final IOException e) { | |
MoDiscoLogger.logError(e, Activator.getDefault()); | |
} | |
EList<EObject> contents = resource.getContents(); | |
if (contents.size() == 0) { | |
MoDiscoLogger.logError("Resource is empty", Activator.getDefault()); //$NON-NLS-1$ | |
return null; | |
} | |
EObject eObject = contents.get(0); | |
if (eObject instanceof MetamodelView) { | |
return (MetamodelView) eObject; | |
} | |
MoDiscoLogger.logError("Resource does not contain a MetamodelView", Activator.getDefault()); //$NON-NLS-1$ | |
return null; | |
} | |
/** | |
* @see IActionDelegate#selectionChanged(IAction, ISelection) | |
*/ | |
public void selectionChanged(final IAction action, final ISelection selection) { | |
this.fSelection = selection; | |
} | |
/** | |
* @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart) | |
*/ | |
public void setActivePart(final IAction action, final IWorkbenchPart targetPart) { | |
// nothing | |
} | |
} |