/*******************************************************************************
* Copyright (c) 2011 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.jsf.ui.marker;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IMarkerResolution2;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.validation.IMutableValidator;
import org.eclipse.wst.validation.MutableProjectSettings;
import org.eclipse.wst.validation.MutableWorkspaceSettings;
import org.eclipse.wst.validation.ValidationFramework;
import org.jboss.tools.jsf.ui.JsfUIMessages;
import org.jboss.tools.jsf.ui.JsfUiPlugin;
/**
* @author Daniel Azarov
*/
public class DisableFaceletHTMLValidatorMarkerResolution implements
IMarkerResolution2 {
private static final String MARKER_TYPE = "org.eclipse.jst.jsf.facelet.ui.FaceletValidationMarker";
private IFile file;
private String label;
public DisableFaceletHTMLValidatorMarkerResolution(IFile file){
this.file = file;
label = JsfUIMessages.DISABLE_FACELET_HTML_VALIDATOR_MARKER_RESOLUTION_TITLE;
}
public String getLabel() {
return label;
}
public static Shell getShell() {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window == null) {
IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
if (windows.length > 0) {
return windows[0].getShell();
}
}
else {
return window.getShell();
}
return null;
}
public void run(IMarker marker) {
MessageDialog dialog = null;
dialog = new MessageDialog(getShell(), label, null,
NLS.bind(JsfUIMessages.DISABLE_FACELET_HTML_VALIDATOR_MARKER_RESOLUTION_MESSAGE, file.getName())+
NLS.bind(JsfUIMessages.DISABLE_FACELET_HTML_VALIDATOR_MARKER_RESOLUTION_PROJECT_QUESTION, file.getProject().getName()),
MessageDialog.QUESTION_WITH_CANCEL,
new String[]{"Cancel", "Workspace", file.getProject().getName()},
0);
int result = dialog.open();
if(result == 1){
disableOnWorkspace();
}else if(result == 2){
disableOnProject();
}
}
private void disableOnWorkspace(){
IMutableValidator[] validators;
try {
MutableWorkspaceSettings workspaceSettings = ValidationFramework.getDefault().getWorkspaceSettings();
validators = workspaceSettings.getValidators();
if(disableValidator(validators, DisableFaceletHTMLValidatorResolutionGenerator.VALIDATOR_ID)){
ValidationFramework.getDefault().applyChanges(workspaceSettings, true);
try {
file.getProject().getParent().deleteMarkers(MARKER_TYPE, true, IResource.DEPTH_INFINITE);
} catch (CoreException e) {
JsfUiPlugin.getPluginLog().logError(e);
}
}
} catch (InvocationTargetException e) {
JsfUiPlugin.getPluginLog().logError(e);
}
}
private void disableOnProject(){
MutableProjectSettings projectSettings = ValidationFramework.getDefault().getProjectSettings(file.getProject());
projectSettings.setOverride(true);
IMutableValidator[] validators = projectSettings.getValidators();
if(!disableValidator(validators, DisableFaceletHTMLValidatorResolutionGenerator.VALIDATOR_ID)){
projectSettings = null;
MutableWorkspaceSettings workspaceSettings=null;
try {
workspaceSettings = ValidationFramework.getDefault().getWorkspaceSettings();
} catch (InvocationTargetException e) {
JsfUiPlugin.getPluginLog().logError(e);
}
if(workspaceSettings != null){
IMutableValidator[] workspaceValidators = workspaceSettings.getValidators();
IMutableValidator faceletHTMLValidator = findValidator(workspaceValidators, DisableFaceletHTMLValidatorResolutionGenerator.VALIDATOR_ID);
if(faceletHTMLValidator != null){
faceletHTMLValidator.setBuildValidation(false);
faceletHTMLValidator.setManualValidation(false);
validators = new IMutableValidator[1];
validators[0] = faceletHTMLValidator;
projectSettings = new MutableProjectSettings(file.getProject(), validators);
projectSettings.setOverride(true);
}
}
}
if(projectSettings != null){
ValidationFramework.getDefault().applyChanges(projectSettings, true);
try {
file.getProject().deleteMarkers(MARKER_TYPE, true, IResource.DEPTH_INFINITE);
} catch (CoreException e) {
JsfUiPlugin.getPluginLog().logError(e);
}
}
}
public static boolean disableValidator(IMutableValidator[] validators, String id){
IMutableValidator validator = findValidator(validators, id);
if(validator != null){
validator.setBuildValidation(false);
validator.setManualValidation(false);
return true;
}
return false;
}
public static IMutableValidator findValidator(IMutableValidator[] validators, String id){
for(IMutableValidator validator : validators){
if(validator.getId().equals(id))
return validator;
}
return null;
}
public String getDescription() {
return label;
}
public Image getImage() {
return null;
}
}