blob: 2ce0b1f232db1df9b2535d51e34a2ad6da606d6b [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2008-2013 See4sys, itemis and others.
* All rights reserved. This program and the accompanying materials
* are 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:
* See4sys - Initial API and implementation
* itemis - [418005] Add support for model files with multiple root elements
*
* </copyright>
*/
package org.eclipse.sphinx.emf.validation.ui.actions;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResourceRuleFactory;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.MultiRule;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.provider.IWrapperItemProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.sphinx.emf.util.EObjectUtil;
import org.eclipse.sphinx.emf.util.EcorePlatformUtil;
import org.eclipse.sphinx.emf.validation.markers.ValidationMarkerManager;
import org.eclipse.sphinx.emf.validation.ui.util.Messages;
import org.eclipse.sphinx.platform.util.ExtendedPlatform;
import org.eclipse.ui.actions.BaseSelectionListenerAction;
public class BasicCleanProblemMarkersAction extends BaseSelectionListenerAction {
public BasicCleanProblemMarkersAction() {
super(Messages._UI_Clean_menu_item);
setDescription(Messages._UI_Clean_simple_description);
}
@Override
public void run() {
final List<EObject> selectedModelObjects = getSelectedModelObjects();
if (!selectedModelObjects.isEmpty()) {
WorkspaceJob job = new WorkspaceJob(Messages._Job_Clean_Markers) {
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
for (EObject eObject : selectedModelObjects) {
ValidationMarkerManager.getInstance().removeMarkers(eObject, EObjectUtil.DEPTH_INFINITE, IMarker.PROBLEM);
}
return Status.OK_STATUS;
}
};
ArrayList<ISchedulingRule> myRules = new ArrayList<ISchedulingRule>();
for (EObject eObject : selectedModelObjects) {
IFile file = EcorePlatformUtil.getFile(eObject);
if (file != null) {
IResourceRuleFactory ruleFactory = file.getWorkspace().getRuleFactory();
myRules.add(ruleFactory.modifyRule(file));
myRules.add(ruleFactory.createRule(file));
}
}
job.setRule(new MultiRule(myRules.toArray(new ISchedulingRule[myRules.size()])));
job.setPriority(Job.BUILD);
job.schedule();
}
}
/**
* Due to performance overhead, its just called before running the action to init the list of selected model objects
*
* @param selection
* the current selection
*/
protected List<EObject> getSelectedModelObjects() {
IStructuredSelection selection = getStructuredSelection();
List<IFile> files = new ArrayList<IFile>();
List<EObject> result = new ArrayList<EObject>();
for (Object selectedObject : selection.toList()) {
if (selectedObject instanceof IProject) {
IProject project = (IProject) selectedObject;
if (project.isAccessible()) {
files.addAll(ExtendedPlatform.getAllFiles((IProject) selectedObject, true));
}
} else if (selectedObject instanceof IFolder) {
IFolder folder = (IFolder) selectedObject;
if (folder.isAccessible()) {
files.addAll(ExtendedPlatform.getAllFiles((IFolder) selectedObject));
}
} else if (selectedObject instanceof IFile) {
IFile file = (IFile) selectedObject;
if (file.isAccessible()) {
files.add((IFile) selectedObject);
}
} else if (selectedObject instanceof EObject) {
result.add((EObject) selectedObject);
} else if (selectedObject instanceof IWrapperItemProvider) {
Object object = AdapterFactoryEditingDomain.unwrap(selectedObject);
if (object instanceof EObject) {
result.add((EObject) object);
}
}
}
if (!files.isEmpty()) {
// If selected object is a file, get the mapped model root
for (IFile file : files) {
// Get model objects from workspace file
Resource resource = EcorePlatformUtil.getResource(file);
if (resource != null) {
result.addAll(resource.getContents());
}
}
}
return result;
}
}