blob: 27ce02ffae00851b97a4ba82b35abd37091a7c5d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Jens Lukowski/Innoopract - initial renaming/restructuring
* David Carver - STAR - [205989] - [validation] validate XML after XInclude resolution
* Angelo Zerr <angelo.zerr@gmail.com> - copied from org.eclipse.wst.xml.ui.internal.preferences.XMLValidatorPreferencePage
* modified in order to process JSON Objects.
*******************************************************************************/
package org.eclipse.wst.json.ui.internal.preferences;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.dialogs.ControlEnableState;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.ui.IWorkbench;
import org.eclipse.wst.json.core.JSONCorePlugin;
import org.eclipse.wst.json.core.preferences.JSONCorePreferenceNames;
import org.eclipse.wst.json.ui.internal.JSONUIMessages;
import org.eclipse.wst.json.ui.internal.JSONUIPlugin;
import org.eclipse.wst.sse.core.internal.validate.ValidationMessage;
import org.eclipse.wst.sse.ui.internal.preferences.ui.AbstractValidationSettingsPage;
import org.osgi.service.prefs.BackingStoreException;
public class JSONValidatorPreferencePage extends AbstractValidationSettingsPage {
private static final String SETTINGS_SECTION_NAME = "JSONValidationSeverities";//$NON-NLS-1$
boolean fOriginalUseExtendedSyntaxValidation;
private Combo fIndicateNoGrammar = null;
private Combo fIndicateNoDocumentElement = null;
private Button fExtendedSyntaxValidation;
private Combo fMissingStartTag;
private Combo fMissingEndTag;
private Combo fMissingTagName;
private Combo fEmptyElementTag;
private Combo fEndTagWithAttributes;
private Combo fInvalidWhitespaceBeforeTagname;
private Combo fMissingClosingBracket;
private Combo fMissingClosingQuote;
private Combo fMissingQuotes;
private Combo fInvalidNamespaceInPI;
private Combo fInvalidWhitespaceAtStart;
private Group fSyntaxValidationGroup;
private ControlEnableState fSyntaxState;
private boolean fOriginalUseSchemaValidation;
private Button fSchemaValidation;
private static final int[] JSON_SEVERITIES = { ValidationMessage.WARNING,
ValidationMessage.ERROR, ValidationMessage.IGNORE };
private static final String[] SYNTAX_SEVERITIES = {
JSONUIMessages.Severity_error, JSONUIMessages.Severity_warning,
JSONUIMessages.Severity_ignore };
private boolean getBooleanPreference(String key, boolean defaultValue,
IScopeContext[] contexts) {
return Platform.getPreferencesService().getBoolean(
getPreferenceNodeQualifier(), key, defaultValue, contexts);
}
private void handleSyntaxSeveritySelection(boolean selection) {
if (selection) {
if (fSyntaxState != null) {
fSyntaxState.restore();
fSyntaxState = null;
}
} else {
if (fSyntaxState == null)
fSyntaxState = ControlEnableState
.disable(fSyntaxValidationGroup);
}
}
protected void createContentsForSyntaxValidationGroup(Composite parent) {
IScopeContext[] contexts = createPreferenceScopes();
fOriginalUseExtendedSyntaxValidation = getBooleanPreference(
JSONCorePreferenceNames.SYNTAX_VALIDATION, false, contexts);
fExtendedSyntaxValidation = createCheckBox(parent,
JSONUIMessages.SyntaxValidation_files);
((GridData) fExtendedSyntaxValidation.getLayoutData()).horizontalSpan = 2;
fExtendedSyntaxValidation
.setSelection(fOriginalUseExtendedSyntaxValidation);
fExtendedSyntaxValidation.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleSyntaxSeveritySelection(fExtendedSyntaxValidation
.getSelection());
}
});
fOriginalUseSchemaValidation = getBooleanPreference(
JSONCorePreferenceNames.SCHEMA_VALIDATION, false, contexts);
fSchemaValidation = createCheckBox(parent,
JSONUIMessages.EnableSchemaValidation);
((GridData) fSchemaValidation.getLayoutData()).horizontalSpan = 2;
fSchemaValidation
.setSelection(fOriginalUseSchemaValidation);
fSyntaxValidationGroup = createGroup(parent, 3);
((GridLayout) fSyntaxValidationGroup.getLayout()).makeColumnsEqualWidth = false;
fSyntaxValidationGroup
.setText(JSONUIMessages.SyntaxValidation_files_label);
GridLayout layout = new GridLayout(3, false);
fSyntaxValidationGroup.setLayout(layout);
if (fMissingStartTag == null) {
fMissingStartTag = addComboBox(fSyntaxValidationGroup,
JSONUIMessages.Missing_start_object,
JSONCorePreferenceNames.MISSING_START_OBJECT, JSON_SEVERITIES,
SYNTAX_SEVERITIES, 0);
}
if (fMissingEndTag == null) {
fMissingEndTag = addComboBox(fSyntaxValidationGroup,
JSONUIMessages.Missing_end_object,
JSONCorePreferenceNames.MISSING_END_OBJECT, JSON_SEVERITIES,
SYNTAX_SEVERITIES, 0);
}
// if (fMissingEndTag == null)
// fMissingEndTag = addComboBox(fSyntaxValidationGroup,
// JSONUIMessages.Missing_end_tag,
// JSONCorePreferenceNames.MISSING_END_TAG, JSON_SEVERITIES,
// SYNTAX_SEVERITIES, 0);
// if (fMissingTagName == null)
// fMissingTagName = addComboBox(fSyntaxValidationGroup,
// JSONUIMessages.Tag_name_missing,
// JSONCorePreferenceNames.MISSING_TAG_NAME, JSON_SEVERITIES,
// SYNTAX_SEVERITIES, 0);
// if (fMissingQuotes == null)
// fMissingQuotes = addComboBox(fSyntaxValidationGroup,
// JSONUIMessages.Missing_quotes,
// JSONCorePreferenceNames.MISSING_QUOTES, JSON_SEVERITIES,
// SYNTAX_SEVERITIES, 0);
// if (fMissingClosingBracket == null)
// fMissingClosingBracket = addComboBox(fSyntaxValidationGroup,
// JSONUIMessages.Missing_closing_bracket,
// JSONCorePreferenceNames.MISSING_CLOSING_BRACKET,
// JSON_SEVERITIES, SYNTAX_SEVERITIES, 0);
// if (fMissingClosingQuote == null)
// fMissingClosingQuote = addComboBox(fSyntaxValidationGroup,
// JSONUIMessages.Missing_closing_quote,
// JSONCorePreferenceNames.MISSING_CLOSING_QUOTE,
// JSON_SEVERITIES, SYNTAX_SEVERITIES, 0);
// if (fEmptyElementTag == null)
// fEmptyElementTag = addComboBox(fSyntaxValidationGroup,
// JSONUIMessages.Empty_element_tag,
// JSONCorePreferenceNames.ATTRIBUTE_HAS_NO_VALUE,
// JSON_SEVERITIES, SYNTAX_SEVERITIES, 0);
// if (fEndTagWithAttributes == null)
// fEndTagWithAttributes = addComboBox(fSyntaxValidationGroup,
// JSONUIMessages.End_tag_with_attributes,
// JSONCorePreferenceNames.END_TAG_WITH_ATTRIBUTES,
// JSON_SEVERITIES, SYNTAX_SEVERITIES, 0);
// if (fInvalidWhitespaceBeforeTagname == null)
// fInvalidWhitespaceBeforeTagname = addComboBox(
// fSyntaxValidationGroup,
// JSONUIMessages.Invalid_whitespace_before_tagname,
// JSONCorePreferenceNames.WHITESPACE_BEFORE_TAGNAME,
// JSON_SEVERITIES, SYNTAX_SEVERITIES, 0);
// if (fInvalidNamespaceInPI == null)
// fInvalidNamespaceInPI = addComboBox(fSyntaxValidationGroup,
// JSONUIMessages.Namespace_in_pi_target,
// JSONCorePreferenceNames.NAMESPACE_IN_PI_TARGET,
// JSON_SEVERITIES, SYNTAX_SEVERITIES, 0);
// if (fInvalidWhitespaceAtStart == null)
// fInvalidWhitespaceAtStart = addComboBox(fSyntaxValidationGroup,
// JSONUIMessages.Whitespace_at_start,
// JSONCorePreferenceNames.WHITESPACE_AT_START,
// JSON_SEVERITIES, SYNTAX_SEVERITIES, 0);
handleSyntaxSeveritySelection(fOriginalUseExtendedSyntaxValidation);
}
// protected void performDefaultsForValidatingGroup() {
// IEclipsePreferences modelPreferences = new DefaultScope()
// .getNode(getPreferenceNodeQualifier());
// boolean useXIncludeButtonSelected = modelPreferences.getBoolean(
// JSONCorePreferenceNames.USE_XINCLUDE, false);
//
// if (fUseXinclude != null) {
// fUseXinclude.setSelection(useXIncludeButtonSelected);
// }
// boolean useHonourAllButtonSelected = modelPreferences.getBoolean(
// JSONCorePreferenceNames.HONOUR_ALL_SCHEMA_LOCATIONS, true);
// if (fHonourAllSchemaLocations != null) {
// fHonourAllSchemaLocations.setSelection(useHonourAllButtonSelected);
// }
// }
protected void performDefaultsForSyntaxValidationGroup() {
IEclipsePreferences modelPreferences = new DefaultScope()
.getNode(getPreferenceNodeQualifier());
boolean useExtendedSyntaxValidation = modelPreferences.getBoolean(
JSONCorePreferenceNames.SYNTAX_VALIDATION, false);
boolean useSchemaValidation = modelPreferences.getBoolean(
JSONCorePreferenceNames.SCHEMA_VALIDATION, false);
if (fSchemaValidation != null) {
fSchemaValidation.setSelection(useSchemaValidation);
}
if (fExtendedSyntaxValidation != null) {
if (fExtendedSyntaxValidation.getSelection() != useExtendedSyntaxValidation) {
handleSyntaxSeveritySelection(useExtendedSyntaxValidation);
}
fExtendedSyntaxValidation.setSelection(useExtendedSyntaxValidation);
}
}
// protected void storeValuesForValidatingGroup(IScopeContext[] contexts) {
// if (fUseXinclude != null) {
// boolean useXIncludeButtonSelected = fUseXinclude.getSelection();
// contexts[0].getNode(getPreferenceNodeQualifier()).putBoolean(
// JSONCorePreferenceNames.USE_XINCLUDE,
// useXIncludeButtonSelected);
// }
// if (fHonourAllSchemaLocations != null) {
// boolean honourAllButtonSelected = fHonourAllSchemaLocations
// .getSelection();
// contexts[0].getNode(getPreferenceNodeQualifier()).putBoolean(
// JSONCorePreferenceNames.HONOUR_ALL_SCHEMA_LOCATIONS,
// honourAllButtonSelected);
// }
// }
protected void storeValuesForSyntaxValidationGroup(IScopeContext[] contexts) {
if (fExtendedSyntaxValidation != null) {
boolean extendedSyntaxValidation = fExtendedSyntaxValidation
.getSelection();
contexts[0].getNode(getPreferenceNodeQualifier()).putBoolean(
JSONCorePreferenceNames.SYNTAX_VALIDATION,
extendedSyntaxValidation);
}
if (fSchemaValidation != null) {
contexts[0].getNode(getPreferenceNodeQualifier()).putBoolean(
JSONCorePreferenceNames.SCHEMA_VALIDATION,
fSchemaValidation.getSelection());
}
}
@Override
protected void performDefaults() {
resetSeverities();
//performDefaultsForValidatingGroup();
performDefaultsForSyntaxValidationGroup();
super.performDefaults();
}
protected Preferences getModelPreferences() {
return JSONCorePlugin.getDefault().getPluginPreferences();
}
protected void doSavePreferenceStore() {
JSONCorePlugin.getDefault().savePluginPreferences(); // model
}
@Override
protected void storeValues() {
super.storeValues();
IScopeContext[] contexts = createPreferenceScopes();
//storeValuesForValidatingGroup(contexts);
storeValuesForSyntaxValidationGroup(contexts);
}
@Override
protected Control createCommonContents(Composite parent) {
final Composite page = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
page.setLayout(layout);
//Group validatingGroup = createGroup(page, 3);
//validatingGroup.setText(JSONUIMessages.Validating_files);
//createContentsForValidatingGroup(validatingGroup);
createContentsForSyntaxValidationGroup(page);
return page;
}
@Override
protected String getPreferenceNodeQualifier() {
return JSONCorePlugin.getDefault().getBundle().getSymbolicName();
}
@Override
protected String getPreferencePageID() {
return "org.eclipse.wst.sse.ui.preferences.json.validation";//$NON-NLS-1$
}
@Override
protected String getProjectSettingsKey() {
return JSONCorePreferenceNames.USE_PROJECT_SETTINGS;
}
@Override
protected String getPropertyPageID() {
return "org.eclipse.wst.json.ui.propertyPage.project.validation";//$NON-NLS-1$
}
@Override
public void init(IWorkbench workbench) {
}
private Group createGroup(Composite parent, int numColumns) {
Group group = new Group(parent, SWT.NULL);
// GridLayout
GridLayout layout = new GridLayout();
layout.numColumns = numColumns;
group.setLayout(layout);
// GridData
GridData data = new GridData(GridData.FILL);
data.horizontalIndent = 0;
data.verticalAlignment = GridData.FILL;
data.horizontalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
group.setLayoutData(data);
return group;
}
private Button createCheckBox(Composite group, String label) {
Button button = new Button(group, SWT.CHECK | SWT.LEFT);
button.setText(label);
// button.setLayoutData(GridDataFactory.fillDefaults().create());
// GridData
GridData data = new GridData(GridData.FILL);
data.verticalAlignment = GridData.CENTER;
data.horizontalAlignment = GridData.FILL;
button.setLayoutData(data);
return button;
}
@Override
public void dispose() {
storeSectionExpansionStates(getDialogSettings().addNewSection(
SETTINGS_SECTION_NAME));
super.dispose();
}
protected IDialogSettings getDialogSettings() {
return JSONUIPlugin.getDefault().getDialogSettings();
}
@Override
protected boolean shouldRevalidateOnSettingsChange() {
return fOriginalUseSchemaValidation != fSchemaValidation.getSelection()
|| fOriginalUseExtendedSyntaxValidation != fExtendedSyntaxValidation.getSelection()
|| super.shouldRevalidateOnSettingsChange();
}
}