[nobug] add quickfix for removing attributes, do some cleanup
diff --git a/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIMessages.java b/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIMessages.java index 26956ba..3a601df 100644 --- a/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIMessages.java +++ b/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIMessages.java
@@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2005, 2019 IBM Corporation and others. All rights reserved. This + * Copyright (c) 2005, 2020 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/ @@ -73,6 +73,7 @@ public static String AddBlockComment_tooltip; // resource bundle public static String AddBlockComment_description; // resource bundle public static String Remove_inline; + public static String RemoveAttributes; public static String RemoveBlockComment_label; // resource bundle public static String RemoveBlockComment_tooltip; // resource bundle public static String RemoveBlockComment_description; // resource bundle
diff --git a/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIPluginResources.properties b/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIPluginResources.properties index c7bd27b..18fa139 100644 --- a/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIPluginResources.properties +++ b/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/HTMLUIPluginResources.properties
@@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2004, 2019 IBM Corporation and others. +# Copyright (c) 2004, 2020 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 @@ -200,3 +200,4 @@ DoNotValidateAttributeAddInfo=Adds the name of attribute to the list of ignored attributes for HTML Attribute Validator<br>You may edit the list of ignored attributes at <b>Web→HTML Files→Validation</b> Preference Page DoNotValidateAllAttributesAddInfo=Adds the pattern based on the attribute name to the list of ignored attributes for HTML Attribute Validator<br>You may edit the list of ignored attributes at <b>Web→HTML Files→Validation</b> Preference Page cannotGenerateImagePreview=Cannot generate image preview. Cause: {0} +RemoveAttributes=Remove attributes
diff --git a/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/HTMLEditorPluginImages.java b/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/HTMLEditorPluginImages.java index 63b767f..46151c0 100644 --- a/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/HTMLEditorPluginImages.java +++ b/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/editor/HTMLEditorPluginImages.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2013 IBM Corporation and others. + * Copyright (c) 2004, 2020 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 @@ -30,6 +30,7 @@ public static final String IMG_OBJ_TAG_TEMPLATE = "icons/full/obj16/tag-template.gif"; //$NON-NLS-1$ public static final String IMG_OBJ_TAG_TITLE = "icons/full/obj16/tag-title.gif"; //$NON-NLS-1$ public static final String IMG_OBJ_TAG = "icons/full/obj16/tag.gif"; //$NON-NLS-1$ + public static final String IMG_OBJ_ATTRIBUTE = "icons/full/obj16/attribute_obj.gif"; //$NON-NLS-1$ public static final String IMG_WIZBAN_NEWHTMLFILE = "icons/full/wizban/newhfile_wiz.png"; //$NON-NLS-1$ public static final String IMG_DTOOL_DO_NOT_VALIDATE = "icons/full/etool16/donotvalidate.png"; //$NON-NLS-1$ } \ No newline at end of file
diff --git a/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/correction/HTMLSyntaxValidationQuickFixProcessor.java b/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/correction/HTMLSyntaxValidationQuickFixProcessor.java index 1774986..cdf08ef 100644 --- a/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/correction/HTMLSyntaxValidationQuickFixProcessor.java +++ b/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/correction/HTMLSyntaxValidationQuickFixProcessor.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2014, 2015 IBM Corporation and others. + * Copyright (c) 2014, 2020 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 @@ -42,9 +42,11 @@ import org.eclipse.wst.html.core.internal.preferences.HTMLCorePreferenceNames; import org.eclipse.wst.html.core.internal.validate.StringMatcher; import org.eclipse.wst.html.ui.internal.HTMLUIMessages; +import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; import org.eclipse.wst.sse.ui.internal.contentassist.ContentAssistUtils; import org.eclipse.wst.sse.ui.internal.reconcile.TemporaryAnnotation; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; import org.w3c.dom.Element; public class HTMLSyntaxValidationQuickFixProcessor implements IQuickAssistProcessor { @@ -113,11 +115,11 @@ if (model == null) return null; - List proposals = new ArrayList(); + List<ICompletionProposal> proposals = new ArrayList<>(); if (model instanceof IAnnotationModelExtension2) { - Iterator iter = ((IAnnotationModelExtension2) model).getAnnotationIterator(documentOffset, length, true, true); + Iterator<Annotation> iter = ((IAnnotationModelExtension2) model).getAnnotationIterator(documentOffset, length, true, true); while (iter.hasNext()) { - Annotation anno = (Annotation) iter.next(); + Annotation anno = iter.next(); if (canFix(anno)) { int offset = -1; @@ -133,15 +135,21 @@ if (!(node instanceof Element)) continue; - Object adapter = (node instanceof IAdaptable ? ((IAdaptable)node).getAdapter(IResource.class) : null); - IProject project = (adapter instanceof IResource ? ((IResource)adapter).getProject() : null); + // dangling attributes + IStructuredDocumentRegion documentRegion = ContentAssistUtils.getStructuredDocumentRegion(viewer, documentOffset); + if (documentRegion != null && documentRegion.getNumberOfRegions() > 2 && DOMRegionContext.XML_END_TAG_OPEN.equals(documentRegion.getFirstRegion().getType())) { + proposals.add(new RemoveAttributesProposal(documentRegion, HTMLUIMessages.RemoveAttributes)); + } - IScopeContext[] fLookupOrder = new IScopeContext[] {new InstanceScope(), new DefaultScope()}; + Object adapter = (node instanceof IAdaptable ? ((IAdaptable) node).getAdapter(IResource.class) : null); + IProject project = (adapter instanceof IResource ? ((IResource) adapter).getProject() : null); + + IScopeContext[] fLookupOrder = new IScopeContext[] {InstanceScope.INSTANCE, DefaultScope.INSTANCE}; if (project != null) { ProjectScope projectScope = new ProjectScope(project); if(projectScope.getNode(getPreferenceNodeQualifier()) .getBoolean(getProjectSettingsKey(), false)) - fLookupOrder = new IScopeContext[] {projectScope, new InstanceScope(), new DefaultScope()}; + fLookupOrder = new IScopeContext[] {projectScope, InstanceScope.INSTANCE, DefaultScope.INSTANCE}; } boolean ignore = fPreferenceService.getBoolean( @@ -152,7 +160,7 @@ getPreferenceNodeQualifier(), HTMLCorePreferenceNames.ELEMENT_NAMES_TO_IGNORE, HTMLCorePreferenceNames.ELEMENT_NAMES_TO_IGNORE_DEFAULT, fLookupOrder); - Set result = new HashSet(); + Set<String> result = new HashSet<>(); if (ignoreList.trim().length() > 0) { String[] names = ignoreList.split(","); //$NON-NLS-1$ for (int i = 0; names != null && i < names.length; i++) { @@ -198,7 +206,7 @@ if (proposals.isEmpty()) return null; - return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[proposals.size()]); + return proposals.toArray(new ICompletionProposal[proposals.size()]); } @@ -206,9 +214,9 @@ return node.getNodeName(); } - private boolean shouldShowQuickFix(Set lcIgnoredPatterns, String attrName) { + private boolean shouldShowQuickFix(Set<String> lcIgnoredPatterns, String attrName) { // Check the attribute name absence in ignore list - String [] lcPatterns = (String[])lcIgnoredPatterns.toArray(new String[0]); + String [] lcPatterns = lcIgnoredPatterns.toArray(new String[0]); for (int i = 0; i < lcPatterns.length; i++) { StringMatcher strMatcher = new StringMatcher(lcPatterns[i]); if (strMatcher.match(attrName.toLowerCase())) {
diff --git a/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/correction/RemoveAttributesProposal.java b/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/correction/RemoveAttributesProposal.java new file mode 100644 index 0000000..8ee7aab --- /dev/null +++ b/web/bundles/org.eclipse.wst.html.ui/src/org/eclipse/wst/html/ui/internal/text/correction/RemoveAttributesProposal.java
@@ -0,0 +1,107 @@ +/******************************************************************************* + * Copyright (c) 2020 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 + *******************************************************************************/ +package org.eclipse.wst.html.ui.internal.text.correction; + +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.contentassist.ICompletionProposal; +import org.eclipse.jface.text.contentassist.IContextInformation; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.wst.html.ui.internal.Logger; +import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImageHelper; +import org.eclipse.wst.html.ui.internal.editor.HTMLEditorPluginImages; +import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; +import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList; +import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; + +public class RemoveAttributesProposal implements ICompletionProposal { + + private IStructuredDocumentRegion fTag; + private String fDisplayString; + + public RemoveAttributesProposal(IStructuredDocumentRegion tag, String displayString) { + fTag = tag; + fDisplayString = displayString; + } + + boolean isEndType(String regionType) { + return regionType.equals(DOMRegionContext.XML_TAG_CLOSE) || regionType.equals(DOMRegionContext.XML_EMPTY_TAG_CLOSE); + } + + /* + * @see ICompletionProposal#apply(IDocument) + */ + public void apply(IDocument document) { + ITextRegionList regions = fTag.getRegions(); + if (fTag.getNumberOfRegions() > 2) { + int removalStart = fTag.getTextEndOffset(regions.get(1)); + int removalEnd = fTag.getStartOffset(fTag.getLastRegion()); + if (!isEndType(fTag.getLastRegion().getType())) { + removalEnd = removalStart; + } + try { + document.replace(removalStart, removalEnd - removalStart, ""); + } + catch (BadLocationException e) { + Logger.logException(e); + } + } + } + + /* + * @see ICompletionProposal#getDisplayString() + */ + public String getDisplayString() { + return fDisplayString; + } + + /* + * @see ICompletionProposal#getAdditionalProposalInfo() + */ + public String getAdditionalProposalInfo() { + return null; + } + + /* + * @see ICompletionProposal#getImage() + */ + public Image getImage() { + return HTMLEditorPluginImageHelper.getInstance().getImage(HTMLEditorPluginImages.IMG_OBJ_ATTRIBUTE); + } + + /* + * @see ICompletionProposal#getSelection(IDocument) + */ + public Point getSelection(IDocument document) { + return new Point(fTag.getEndOffset(fTag.getRegions().get(1)), 0); + } + + /* + * @see ICompletionProposal#getContextInformation() + */ + public IContextInformation getContextInformation() { + return null; + } + + /* + * @see java.lang.Object#equals(java.lang.Object) + */ + public boolean equals(Object obj) { + if (obj instanceof RemoveAttributesProposal) { + RemoveAttributesProposal p = (RemoveAttributesProposal) obj; + return this.fTag.equals(p.fTag); + } + return false; + } +}