From 65f60eb9011bb2c549a6d83ae31257480368ddc5 Mon Sep 17 00:00:00 2001 From: Tor Norbye Date: Wed, 16 Jul 2014 18:07:37 -0700 Subject: Snapshot idea/138.1029 from git://git.jetbrains.org/idea/community.git Update from idea/138.538 to idea/138.1029 Change-Id: I828f829a968439a99ec67640990c18ff7c9b58ce --- .../DomElementAnnotationsManagerImpl.java | 17 +---- .../util/xml/impl/DomCompletionContributor.java | 3 +- .../com/intellij/util/xml/impl/DomManagerImpl.java | 11 +-- .../util/xml/impl/DomReferenceContributor.java | 3 +- .../util/xml/tree/actions/DeleteDomElement.java | 10 +-- .../src/com/intellij/util/xml/DomManager.java | 11 ++- .../com/intellij/util/xml/ParentScopeProvider.java | 4 +- .../highlighting/DomElementAnnotationsManager.java | 5 +- .../intellij/util/xml/tree/DomModelTreeView.java | 2 +- .../tests/com/intellij/util/xml/DomBasicsTest.java | 3 +- .../options/XmlAutoImportOptionsProvider.form | 4 +- .../application/options/emmet/EmmetOptions.java | 38 ++++++++-- .../options/emmet/XmlEmmetConfigurable.form | 26 ++++--- .../options/emmet/XmlEmmetConfigurable.java | 50 ++++++++++--- .../completion/XmlCompletionContributor.java | 2 +- .../completion/XmlNoVariantsDelegator.java | 4 +- .../analysis/encoding/XmlEncodingReference.java | 77 +------------------ .../editorActions/XmlEqTypedHandler.java | 26 +++---- .../editorActions/XmlGtTypedHandler.java | 17 ++--- .../editorActions/XmlSlashTypedHandler.java | 4 +- .../template/emmet/EmmetPreviewAction.java | 4 +- .../template/emmet/EmmetPreviewHint.java | 3 +- .../template/emmet/EmmetPreviewUtil.java | 2 +- .../template/emmet/ZenCodingTemplate.java | 19 ++--- .../template/emmet/filters/BemEmmetFilter.java | 12 +-- .../emmet/filters/CommentZenCodingFilter.java | 8 +- .../emmet/filters/EscapeZenCodingFilter.java | 8 +- .../emmet/filters/SingleLineEmmetFilter.java | 8 +- .../emmet/filters/TrimZenCodingFilter.java | 22 +++++- .../template/emmet/filters/XslZenCodingFilter.java | 10 ++- .../template/emmet/filters/ZenCodingFilter.java | 15 ++-- .../emmet/generators/XmlZenCodingGenerator.java | 7 +- .../intellij/ide/actions/CreateHtmlFileAction.java | 4 +- .../intellij/ide/browsers/StartBrowserPanel.java | 22 ++++++ .../intellij/ide/browsers/WebBrowserManager.java | 29 ++------ .../browsers/actions/BaseOpenInBrowserAction.java | 7 +- .../actions/OpenInBrowserBaseGroupAction.java | 12 ++- .../ide/browsers/impl/WebBrowserServiceImpl.java | 2 +- .../intellij/javaee/MapExternalResourceDialog.java | 4 +- .../intellij/xml/util/XmlReferenceContributor.java | 2 +- .../documentation/HtmlDocumentationProvider.java | 70 +++++++++-------- .../documentation/XHtmlDocumentationProvider.java | 2 +- .../ide/browsers/WebBrowserUrlProvider.java | 70 +---------------- .../relaxNG/RelaxNGReferenceContributor.java | 3 +- .../relaxNG/compact/psi/impl/RncFileImpl.java | 1 + .../DefaultXmlSuppressionProvider.java | 2 +- .../codeInspection/XmlInspectionSuppressor.java | 31 ++++++++ .../XmlSuppressableInspectionTool.java | 87 ++++++++++++---------- .../codeInspection/XmlSuppressionProvider.java | 17 ++--- .../intellij/javaee/ExternalResourceManager.java | 7 +- .../javaee/CoreExternalResourceManager.java | 7 +- .../javaee/ExternalResourceManagerExImpl.java | 22 ++---- .../intellij/psi/impl/source/xml/XmlFileImpl.java | 3 +- 53 files changed, 421 insertions(+), 418 deletions(-) create mode 100644 xml/xml-psi-api/src/com/intellij/codeInspection/XmlInspectionSuppressor.java (limited to 'xml') diff --git a/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManagerImpl.java b/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManagerImpl.java index 19c4f06b1744..aec3931e6a45 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManagerImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,12 +24,10 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.codeInspection.ex.InspectionToolWrapper; import com.intellij.lang.annotation.HighlightSeverity; import com.intellij.openapi.Disposable; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.ModificationTracker; import com.intellij.profile.Profile; import com.intellij.profile.ProfileChangeAdapter; import com.intellij.profile.codeInspection.InspectionProfileManager; @@ -56,7 +54,6 @@ import java.util.List; public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManager { public static final Object LOCK = new Object(); - private static final Logger LOG = Logger.getInstance("#com.intellij.util.xml.highlighting.DomElementAnnotationsManagerImpl"); private static final Key DOM_PROBLEM_HOLDER_KEY = Key.create("DomProblemHolder"); private static final Key> CACHED_VALUE_KEY = Key.create("DomProblemHolderCachedValue"); private final EventDispatcher myDispatcher = EventDispatcher.create(DomHighlightingListener.class); @@ -109,18 +106,10 @@ public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManag } }; - private final ModificationTracker myModificationTracker; private final Project myProject; - private long myModificationCount; public DomElementAnnotationsManagerImpl(Project project) { myProject = project; - myModificationTracker = new ModificationTracker() { - @Override - public long getModificationCount() { - return myModificationCount; - } - }; final ProfileChangeAdapter profileChangeAdapter = new ProfileChangeAdapter() { @Override public void profileActivated(@NotNull Profile oldProfile, Profile profile) { @@ -145,7 +134,7 @@ public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManag @Override public void dropAnnotationsCache() { - myModificationCount++; + incModificationCount(); } public final List appendProblems(@NotNull DomFileElement element, @NotNull DomElementAnnotationHolder annotationHolder, Class inspectionClass) { @@ -171,7 +160,7 @@ public class DomElementAnnotationsManagerImpl extends DomElementAnnotationsManag final CachedValue cachedValue = CachedValuesManager.getManager(myProject).createCachedValue(new CachedValueProvider() { @Override public Result compute() { - return new Result(Boolean.FALSE, element, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, myModificationTracker, ProjectRootManager.getInstance(myProject)); + return new Result(Boolean.FALSE, element, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, DomElementAnnotationsManagerImpl.this, ProjectRootManager.getInstance(myProject)); } }, false); cachedValue.getValue(); diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomCompletionContributor.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomCompletionContributor.java index e0478c90a3d3..63b5d217018c 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomCompletionContributor.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomCompletionContributor.java @@ -27,6 +27,7 @@ import com.intellij.util.ProcessingContext; import com.intellij.util.containers.HashSet; import com.intellij.xml.XmlAttributeDescriptor; import com.intellij.xml.util.XmlUtil; +import org.jetbrains.annotations.NotNull; /** * @author peter @@ -35,7 +36,7 @@ public class DomCompletionContributor extends CompletionContributor{ private final GenericValueReferenceProvider myProvider = new GenericValueReferenceProvider(); @Override - public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet result) { + public void fillCompletionVariants(@NotNull final CompletionParameters parameters, @NotNull final CompletionResultSet result) { if (parameters.getCompletionType() != CompletionType.BASIC) return; if (domKnowsBetter(parameters, result)) { diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java index 7614c25ff4ad..591795941d29 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomManagerImpl.java @@ -83,10 +83,10 @@ public final class DomManagerImpl extends DomManager { private final SemService mySemService; private final DomApplicationComponent myApplicationComponent; - private long myModificationCount; private boolean myChanging; public DomManagerImpl(Project project) { + super(project); myProject = project; mySemService = SemService.getSemService(project); myApplicationComponent = DomApplicationComponent.getInstance(); @@ -221,7 +221,7 @@ public final class DomManagerImpl extends DomManager { final void fireEvent(DomEvent event) { if (mySemService.isInsideAtomicChange()) return; - myModificationCount++; + incModificationCount(); myListeners.getMulticaster().eventOccured(event); } @@ -490,15 +490,10 @@ public final class DomManagerImpl extends DomManager { return myApplicationComponent.getTypeChooserManager(); } - @Override - public long getModificationCount() { - return myModificationCount + PsiManager.getInstance(myProject).getModificationTracker().getOutOfCodeBlockModificationCount(); - } - public void performAtomicChange(@NotNull Runnable change) { mySemService.performAtomicChange(change); if (!mySemService.isInsideAtomicChange()) { - myModificationCount++; + incModificationCount(); } } diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/DomReferenceContributor.java b/xml/dom-impl/src/com/intellij/util/xml/impl/DomReferenceContributor.java index f44fe05c92d1..6fe7a0df71a4 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/DomReferenceContributor.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/DomReferenceContributor.java @@ -18,13 +18,14 @@ package com.intellij.util.xml.impl; import com.intellij.psi.PsiReferenceContributor; import com.intellij.psi.PsiReferenceRegistrar; import com.intellij.patterns.XmlPatterns; +import org.jetbrains.annotations.NotNull; /** * @author peter */ public class DomReferenceContributor extends PsiReferenceContributor{ @Override - public void registerReferenceProviders(final PsiReferenceRegistrar registrar) { + public void registerReferenceProviders(@NotNull final PsiReferenceRegistrar registrar) { GenericValueReferenceProvider provider = new GenericValueReferenceProvider(); registrar.registerReferenceProvider(XmlPatterns.xmlTag(), provider); diff --git a/xml/dom-impl/src/com/intellij/util/xml/tree/actions/DeleteDomElement.java b/xml/dom-impl/src/com/intellij/util/xml/tree/actions/DeleteDomElement.java index c293df56af66..9506608eef97 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/tree/actions/DeleteDomElement.java +++ b/xml/dom-impl/src/com/intellij/util/xml/tree/actions/DeleteDomElement.java @@ -30,6 +30,7 @@ import com.intellij.util.xml.ElementPresentation; import com.intellij.util.xml.tree.BaseDomElementNode; import com.intellij.util.xml.tree.DomFileElementNode; import com.intellij.util.xml.tree.DomModelTreeView; +import org.jetbrains.annotations.NotNull; /** * User: Sergey.Vasiliev @@ -56,12 +57,12 @@ public class DeleteDomElement extends BaseDomTreeAction { final DomElement domElement = ((BaseDomElementNode)selectedNode).getDomElement(); - final int ret = Messages.showOkCancelDialog(getPresentationText(selectedNode) + "?", ApplicationBundle.message("action.remove"), + final int ret = Messages.showOkCancelDialog(getPresentationText(selectedNode, "Remove") + "?", "Remove", Messages.getQuestionIcon()); if (ret == Messages.OK) { new WriteCommandAction(domElement.getManager().getProject(), DomUtil.getFile(domElement)) { @Override - protected void run(final Result result) throws Throwable { + protected void run(@NotNull final Result result) throws Throwable { domElement.undefine(); } }.execute(); @@ -90,7 +91,7 @@ public class DeleteDomElement extends BaseDomTreeAction { if (enabled) { - e.getPresentation().setText(getPresentationText(selectedNode)); + e.getPresentation().setText(getPresentationText(selectedNode, ApplicationBundle.message("action.remove"))); } else { e.getPresentation().setText(ApplicationBundle.message("action.remove")); @@ -99,8 +100,7 @@ public class DeleteDomElement extends BaseDomTreeAction { e.getPresentation().setIcon(AllIcons.General.Remove); } - private static String getPresentationText(final SimpleNode selectedNode) { - String removeString = ApplicationBundle.message("action.remove"); + private static String getPresentationText(final SimpleNode selectedNode, String removeString) { final ElementPresentation presentation = ((BaseDomElementNode)selectedNode).getDomElement().getPresentation(); removeString += " " + presentation.getTypeName() + (presentation.getElementName() == null || presentation.getElementName().trim().length() == 0? "" : ": " + presentation.getElementName()); diff --git a/xml/dom-openapi/src/com/intellij/util/xml/DomManager.java b/xml/dom-openapi/src/com/intellij/util/xml/DomManager.java index 01bc1d819596..49b2f759fca0 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/DomManager.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/DomManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.*; +import com.intellij.psi.PsiManager; import com.intellij.psi.PsiReferenceFactory; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlFile; @@ -35,15 +36,19 @@ import java.lang.reflect.Type; /** * @author peter */ -public abstract class DomManager implements ModificationTracker { +public abstract class DomManager extends CompositeModificationTracker implements ModificationTracker { public static final Key MOCK_ELEMENT_MODULE = Key.create("MockElementModule"); - private final static NotNullLazyKey INSTANCE_CACHE = ServiceManager.createLazyKey(DomManager.class); + private static final NotNullLazyKey INSTANCE_CACHE = ServiceManager.createLazyKey(DomManager.class); public static DomManager getDomManager(Project project) { return INSTANCE_CACHE.getValue(project); } + public DomManager(@NotNull Project project) { + super(PsiManager.getInstance(project).getModificationTracker().getOutOfCodeBlockModificationTracker()); + } + public abstract Project getProject(); /** diff --git a/xml/dom-openapi/src/com/intellij/util/xml/ParentScopeProvider.java b/xml/dom-openapi/src/com/intellij/util/xml/ParentScopeProvider.java index a476377ad097..2ecee3f52589 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/ParentScopeProvider.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/ParentScopeProvider.java @@ -15,12 +15,14 @@ */ package com.intellij.util.xml; +import org.jetbrains.annotations.NotNull; + /** * @author peter */ public class ParentScopeProvider extends ScopeProvider{ @Override - public DomElement getScope(DomElement element) { + public DomElement getScope(@NotNull DomElement element) { return element.getParent(); } } diff --git a/xml/dom-openapi/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManager.java b/xml/dom-openapi/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManager.java index 364aca490bc5..1aa27d4fd855 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManager.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/highlighting/DomElementAnnotationsManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,7 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.Disposable; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.SimpleModificationTracker; import com.intellij.util.xml.DomElement; import com.intellij.util.xml.DomFileElement; import org.jetbrains.annotations.NotNull; @@ -28,7 +29,7 @@ import org.jetbrains.annotations.NotNull; import java.util.EventListener; import java.util.List; -public abstract class DomElementAnnotationsManager { +public abstract class DomElementAnnotationsManager extends SimpleModificationTracker { public static DomElementAnnotationsManager getInstance(Project project) { return ServiceManager.getService(project, DomElementAnnotationsManager.class); diff --git a/xml/dom-openapi/src/com/intellij/util/xml/tree/DomModelTreeView.java b/xml/dom-openapi/src/com/intellij/util/xml/tree/DomModelTreeView.java index 1935228d86eb..15c3de313d43 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/tree/DomModelTreeView.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/tree/DomModelTreeView.java @@ -119,7 +119,7 @@ public class DomModelTreeView extends Wrapper implements DataProvider, Disposabl final Project project = myDomManager.getProject(); DomElementAnnotationsManager.getInstance(project).addHighlightingListener(new DomElementAnnotationsManager.DomHighlightingListener() { @Override - public void highlightingFinished(DomFileElement element) { + public void highlightingFinished(@NotNull DomFileElement element) { if (element.isValid()) { queueUpdate(DomUtil.getFile(element).getVirtualFile()); } diff --git a/xml/dom-tests/tests/com/intellij/util/xml/DomBasicsTest.java b/xml/dom-tests/tests/com/intellij/util/xml/DomBasicsTest.java index 630ad79f03d0..bd69d041ed41 100644 --- a/xml/dom-tests/tests/com/intellij/util/xml/DomBasicsTest.java +++ b/xml/dom-tests/tests/com/intellij/util/xml/DomBasicsTest.java @@ -30,6 +30,7 @@ import com.intellij.util.xml.reflect.DomAttributeChildDescription; import com.intellij.util.xml.reflect.DomCollectionChildDescription; import com.intellij.util.xml.reflect.DomFixedChildDescription; import com.intellij.util.xml.reflect.DomGenericInfo; +import org.jetbrains.annotations.NotNull; import java.lang.reflect.ParameterizedType; import java.util.*; @@ -39,7 +40,7 @@ import java.util.*; */ public class DomBasicsTest extends DomTestCase { @Override - protected void invokeTestRunnable(final Runnable runnable) throws Exception { + protected void invokeTestRunnable(@NotNull final Runnable runnable) throws Exception { new WriteCommandAction.Simple(null) { @Override protected void run() throws Throwable { diff --git a/xml/impl/src/com/intellij/application/options/XmlAutoImportOptionsProvider.form b/xml/impl/src/com/intellij/application/options/XmlAutoImportOptionsProvider.form index cd42e379619c..1a633fc60e83 100644 --- a/xml/impl/src/com/intellij/application/options/XmlAutoImportOptionsProvider.form +++ b/xml/impl/src/com/intellij/application/options/XmlAutoImportOptionsProvider.form @@ -14,17 +14,17 @@ - + - + diff --git a/xml/impl/src/com/intellij/application/options/emmet/EmmetOptions.java b/xml/impl/src/com/intellij/application/options/emmet/EmmetOptions.java index 1cf7a7730173..6781db72e93a 100644 --- a/xml/impl/src/com/intellij/application/options/emmet/EmmetOptions.java +++ b/xml/impl/src/com/intellij/application/options/emmet/EmmetOptions.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,8 @@ */ package com.intellij.application.options.emmet; +import com.intellij.codeInsight.template.emmet.filters.BemEmmetFilter; +import com.intellij.codeInsight.template.emmet.filters.ZenCodingFilter; import com.intellij.codeInsight.template.impl.TemplateSettings; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.*; @@ -26,11 +28,8 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.Map; +import java.util.Set; -/** - * User: zolotov - * Date: 2/20/13 - */ @State( name = "EmmetOptions", storages = { @@ -39,24 +38,46 @@ import java.util.Map; )} ) public class EmmetOptions implements PersistentStateComponent, ExportableComponent { + /** + * @deprecated delete after IDEA 14 + */ private boolean myBemFilterEnabledByDefault = false; private boolean myEmmetEnabled = true; private int myEmmetExpandShortcut = TemplateSettings.TAB_CHAR; private boolean myFuzzySearchEnabled = true; private boolean myAutoInsertCssPrefixedEnabled = true; private boolean myPreviewEnabled = false; + private Set myFiltersEnabledByDefault = ContainerUtil.newHashSet(); @NotNull private Map prefixes = ContainerUtil.newHashMap(); - + /** + * @deprecated delete after IDEA 14 + */ public boolean isBemFilterEnabledByDefault() { return myBemFilterEnabledByDefault; } + /** + * @deprecated delete after IDEA 14 + */ public void setBemFilterEnabledByDefault(boolean enableBemFilterByDefault) { myBemFilterEnabledByDefault = enableBemFilterByDefault; } + @NotNull + public Set getFiltersEnabledByDefault() { + return myFiltersEnabledByDefault; + } + + public void setFiltersEnabledByDefault(@NotNull Set filtersEnabledByDefault) { + myFiltersEnabledByDefault = filtersEnabledByDefault; + } + + public boolean isFilterEnabledByDefault(@NotNull ZenCodingFilter filter) { + return myFiltersEnabledByDefault.contains(filter.getSuffix()); + } + public void setEmmetExpandShortcut(int emmetExpandShortcut) { myEmmetExpandShortcut = emmetExpandShortcut; } @@ -126,6 +147,11 @@ public class EmmetOptions implements PersistentStateComponent, Exp @Override public void loadState(final EmmetOptions state) { XmlSerializerUtil.copyBean(state, this); + + // todo delete after IDEA 14 + if (myFiltersEnabledByDefault.isEmpty() && myBemFilterEnabledByDefault) { + myFiltersEnabledByDefault.add(BemEmmetFilter.SUFFIX); + } } public static EmmetOptions getInstance() { diff --git a/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.form b/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.form index 0c8dec3afcac..ec4cafb26fd0 100644 --- a/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.form +++ b/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.form @@ -19,14 +19,6 @@ - - - - - - - - @@ -37,12 +29,28 @@ - + + + + + + + + + + + + + + + + + diff --git a/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.java b/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.java index babbfc1d3046..764d74f94375 100644 --- a/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.java +++ b/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,34 +15,46 @@ */ package com.intellij.application.options.emmet; +import com.intellij.codeInsight.template.emmet.filters.ZenCodingFilter; import com.intellij.openapi.Disposable; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.UnnamedConfigurable; +import com.intellij.ui.CheckBoxList; +import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.components.JBCheckBox; +import com.intellij.util.Function; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.xml.XmlBundle; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Set; -/** - * User: zolotov - * Date: 2/20/13 - */ public class XmlEmmetConfigurable implements UnnamedConfigurable, Disposable, Configurable.NoScroll { - private JBCheckBox myEnableBEMFilterJBCheckBox; private JPanel myPanel; private JBCheckBox myEnableEmmetJBCheckBox; private JBCheckBox myEnablePreviewJBCheckBox; + private CheckBoxList myFiltersCheckBoxList; + private JPanel myFiltersListPanel; public XmlEmmetConfigurable() { myEnableEmmetJBCheckBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { boolean selected = myEnableEmmetJBCheckBox.isSelected(); - myEnableBEMFilterJBCheckBox.setEnabled(selected); myEnablePreviewJBCheckBox.setEnabled(selected); + myFiltersCheckBoxList.setEnabled(selected); + } + }); + myFiltersListPanel.setBorder(IdeBorderFactory.createTitledBorder(XmlBundle.message("emmet.filters.enabled.by.default"), false)); + myFiltersCheckBoxList.setItems(ZenCodingFilter.getInstances(), new Function() { + @Override + public String fun(ZenCodingFilter filter) { + return filter.getDisplayName(); } }); } @@ -62,29 +74,43 @@ public class XmlEmmetConfigurable implements UnnamedConfigurable, Disposable, Co EmmetOptions emmetOptions = EmmetOptions.getInstance(); return emmetOptions.isEmmetEnabled() != myEnableEmmetJBCheckBox.isSelected() || emmetOptions.isPreviewEnabled() != myEnablePreviewJBCheckBox.isSelected() || - emmetOptions.isBemFilterEnabledByDefault() != myEnableBEMFilterJBCheckBox.isSelected(); + !emmetOptions.getFiltersEnabledByDefault().equals(enabledFilters()); } - @Override public void apply() throws ConfigurationException { EmmetOptions emmetOptions = EmmetOptions.getInstance(); emmetOptions.setEmmetEnabled(myEnableEmmetJBCheckBox.isSelected()); - emmetOptions.setBemFilterEnabledByDefault(myEnableBEMFilterJBCheckBox.isSelected()); emmetOptions.setPreviewEnabled(myEnablePreviewJBCheckBox.isSelected()); + emmetOptions.setFiltersEnabledByDefault(enabledFilters()); } + @Override public void reset() { EmmetOptions emmetOptions = EmmetOptions.getInstance(); myEnableEmmetJBCheckBox.setSelected(emmetOptions.isEmmetEnabled()); - myEnableBEMFilterJBCheckBox.setEnabled(emmetOptions.isEmmetEnabled()); - myEnableBEMFilterJBCheckBox.setSelected(emmetOptions.isBemFilterEnabledByDefault()); myEnablePreviewJBCheckBox.setEnabled(emmetOptions.isEmmetEnabled()); myEnablePreviewJBCheckBox.setSelected(emmetOptions.isPreviewEnabled()); + + Set enabledByDefault = emmetOptions.getFiltersEnabledByDefault(); + for (ZenCodingFilter filter : ZenCodingFilter.getInstances()) { + myFiltersCheckBoxList.setItemSelected(filter, enabledByDefault.contains(filter.getSuffix())); + } } @Override public void disposeUIResources() { } + + @NotNull + private Set enabledFilters() { + Set result = ContainerUtil.newHashSet(); + for (ZenCodingFilter filter : ZenCodingFilter.getInstances()) { + if (myFiltersCheckBoxList.isItemSelected(filter)) { + result.add(filter.getSuffix()); + } + } + return result; + } } diff --git a/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java b/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java index 86a2155124dd..cc066a921447 100644 --- a/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java +++ b/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java @@ -122,7 +122,7 @@ public class XmlCompletionContributor extends CompletionContributor { } @Override - public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet result) { + public void fillCompletionVariants(@NotNull final CompletionParameters parameters, @NotNull final CompletionResultSet result) { super.fillCompletionVariants(parameters, result); if (result.isStopped()) { return; diff --git a/xml/impl/src/com/intellij/codeInsight/completion/XmlNoVariantsDelegator.java b/xml/impl/src/com/intellij/codeInsight/completion/XmlNoVariantsDelegator.java index 9166b67ab532..da991ac048f3 100644 --- a/xml/impl/src/com/intellij/codeInsight/completion/XmlNoVariantsDelegator.java +++ b/xml/impl/src/com/intellij/codeInsight/completion/XmlNoVariantsDelegator.java @@ -15,6 +15,8 @@ */ package com.intellij.codeInsight.completion; +import org.jetbrains.annotations.NotNull; + /** * @author Dmitry Avdeev * Date: 12/19/11 @@ -22,7 +24,7 @@ package com.intellij.codeInsight.completion; public class XmlNoVariantsDelegator extends CompletionContributor { @Override - public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet result) { + public void fillCompletionVariants(@NotNull final CompletionParameters parameters, @NotNull final CompletionResultSet result) { final boolean empty = result.runRemainingContributors(parameters, true).isEmpty(); if (!empty && parameters.getInvocationCount() == 0) { diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/encoding/XmlEncodingReference.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/encoding/XmlEncodingReference.java index d6ab939090fe..3515297f31de 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/encoding/XmlEncodingReference.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/encoding/XmlEncodingReference.java @@ -17,57 +17,21 @@ package com.intellij.codeInsight.daemon.impl.analysis.encoding; import com.intellij.codeInsight.daemon.EmptyResolveMessageProvider; import com.intellij.codeInsight.daemon.XmlErrorMessages; -import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.openapi.util.TextRange; -import com.intellij.openapi.vfs.CharsetToolkit; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiReference; import com.intellij.psi.xml.XmlAttributeValue; -import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; /** * @author cdr */ -public class XmlEncodingReference implements PsiReference, EmptyResolveMessageProvider, Comparable { - private final XmlAttributeValue myValue; - - private final String myCharsetName; - private final TextRange myRangeInElement; +public class XmlEncodingReference extends EncodingReference implements EmptyResolveMessageProvider, Comparable { private final int myPriority; public XmlEncodingReference(XmlAttributeValue value, final String charsetName, final TextRange rangeInElement, int priority) { - myValue = value; - myCharsetName = charsetName; - myRangeInElement = rangeInElement; + super(value, charsetName, rangeInElement); myPriority = priority; } - @Override - public PsiElement getElement() { - return myValue; - } - - @Override - public TextRange getRangeInElement() { - return myRangeInElement; - } - - @Override - @Nullable - public PsiElement resolve() { - return CharsetToolkit.forName(myCharsetName) == null ? null : myValue; - //if (ApplicationManager.getApplication().isUnitTestMode()) return myValue; // tests do not have full JDK - //String fqn = charset.getClass().getName(); - //return myValue.getManager().findClass(fqn, GlobalSearchScope.allScope(myValue.getProject())); - } - @Override @NotNull public String getUnresolvedMessagePattern() { @@ -75,43 +39,6 @@ public class XmlEncodingReference implements PsiReference, EmptyResolveMessagePr return XmlErrorMessages.message("unknown.encoding.0"); } - @Override - @NotNull - public String getCanonicalText() { - return myCharsetName; - } - - @Override - public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException { - return null; - } - - @Override - public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException { - return null; - } - - @Override - public boolean isReferenceTo(PsiElement element) { - return false; - } - - @Override - @NotNull - public Object[] getVariants() { - Charset[] charsets = CharsetToolkit.getAvailableCharsets(); - List suggestions = new ArrayList(charsets.length); - for (Charset charset : charsets) { - suggestions.add(LookupElementBuilder.create(charset.name()).withCaseSensitivity(false)); - } - return suggestions.toArray(new LookupElement[suggestions.size()]); - } - - @Override - public boolean isSoft() { - return false; - } - @Override public int compareTo(@NotNull XmlEncodingReference ref) { return myPriority - ref.myPriority; diff --git a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlEqTypedHandler.java b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlEqTypedHandler.java index 43084679f455..656a061b9b4a 100644 --- a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlEqTypedHandler.java +++ b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlEqTypedHandler.java @@ -18,20 +18,16 @@ package com.intellij.codeInsight.editorActions; import com.intellij.application.options.editor.WebEditorOptions; import com.intellij.codeInsight.AutoPopupController; import com.intellij.lang.xml.XMLLanguage; -import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlAttribute; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import java.util.List; - public class XmlEqTypedHandler extends TypedHandlerDelegate { - private final List caretsForInsertingQuotes = ContainerUtil.newSmartList(); + private boolean needToInsertQuotes = false; @Override public Result beforeCharTyped(char c, Project project, Editor editor, PsiFile file, FileType fileType) { @@ -39,12 +35,10 @@ public class XmlEqTypedHandler extends TypedHandlerDelegate { if (WebEditorOptions.getInstance().isInsertQuotesForAttributeValue()) { boolean inXml = file.getLanguage() instanceof XMLLanguage || file.getViewProvider().getBaseLanguage() instanceof XMLLanguage; if (c == '=' && inXml) { - for(Caret caret : editor.getCaretModel().getAllCarets()) { - PsiElement at = file.findElementAt(caret.getOffset() - 1); - PsiElement atParent = at != null ? at.getParent() : null; - if(atParent instanceof XmlAttribute && ((XmlAttribute)atParent).getValueElement() == null) { - caretsForInsertingQuotes.add(caret); - } + PsiElement at = file.findElementAt(editor.getCaretModel().getOffset() - 1); + PsiElement atParent = at != null ? at.getParent() : null; + if(atParent instanceof XmlAttribute && ((XmlAttribute)atParent).getValueElement() == null) { + needToInsertQuotes = atParent instanceof XmlAttribute && ((XmlAttribute)atParent).getValueElement() == null; } } } @@ -54,15 +48,13 @@ public class XmlEqTypedHandler extends TypedHandlerDelegate { @Override public Result charTyped(char c, Project project, @NotNull Editor editor, @NotNull PsiFile file) { - for (Caret caret : caretsForInsertingQuotes) { - int offset = caret.getOffset(); + if (needToInsertQuotes) { + int offset = editor.getCaretModel().getOffset(); editor.getDocument().insertString(offset, "\"\""); - caret.moveToOffset(offset + 1); - } - if (editor.getCaretModel().getAllCarets().size() == caretsForInsertingQuotes.size()) { + editor.getCaretModel().moveToOffset(offset + 1); AutoPopupController.getInstance(project).scheduleAutoPopup(editor); } - caretsForInsertingQuotes.clear(); + needToInsertQuotes = false; return super.charTyped(c, project, editor, file); } } diff --git a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlGtTypedHandler.java b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlGtTypedHandler.java index 2c0143ebeda6..bde429676d2a 100644 --- a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlGtTypedHandler.java +++ b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlGtTypedHandler.java @@ -20,7 +20,6 @@ import com.intellij.codeInsight.highlighting.BraceMatchingUtil; import com.intellij.lang.ASTNode; import com.intellij.lang.xml.XMLLanguage; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.editor.Caret; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorModificationUtil; import com.intellij.openapi.editor.ScrollType; @@ -94,7 +93,7 @@ public class XmlGtTypedHandler extends TypedHandlerDelegate { if (tokenType == XmlTokenType.XML_TAG_END || tokenType == XmlTokenType.XML_EMPTY_ELEMENT_END && element.getTextOffset() == offset - 1) { - EditorModificationUtil.moveAllCaretsRelatively(editor, 1); + EditorModificationUtil.moveCaretRelatively(editor, 1); editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE); return Result.STOP; } @@ -155,7 +154,7 @@ public class XmlGtTypedHandler extends TypedHandlerDelegate { element.getPrevSibling() !=null && element.getPrevSibling().getText().equals("<")) { // tag is started and there is another text in the end - EditorModificationUtil.typeInStringAtCaretHonorMultipleCarets(editor, "", false, 0); + EditorModificationUtil.insertStringAtCaret(editor, "", false, 0); } return Result.CONTINUE; } @@ -205,7 +204,7 @@ public class XmlGtTypedHandler extends TypedHandlerDelegate { Collection cdataReformatRanges = null; final XmlElementDescriptor descriptor = tag.getDescriptor(); - EditorModificationUtil.typeInStringAtCaretHonorMultipleCarets(editor, "", false, 0); + EditorModificationUtil.insertStringAtCaret(editor, "", false, 0); if (descriptor instanceof XmlElementDescriptorWithCDataContent) { final XmlElementDescriptorWithCDataContent cDataContainer = (XmlElementDescriptorWithCDataContent)descriptor; @@ -214,12 +213,10 @@ public class XmlGtTypedHandler extends TypedHandlerDelegate { if (cDataContainer.requiresCdataBracesInContext(tag)) { @NonNls final String cDataStart = ">"; - EditorModificationUtil.typeInStringAtCaretHonorMultipleCarets(editor, inserted, false, cDataStart.length()); - for (Caret caret : editor.getCaretModel().getAllCarets()) { - int caretOffset = caret.getOffset(); - if (caretOffset >= cDataStart.length()) { - cdataReformatRanges.add(TextRange.from(caretOffset - cDataStart.length(), inserted.length() + 1)); - } + EditorModificationUtil.insertStringAtCaret(editor, inserted, false, cDataStart.length()); + int caretOffset = editor.getCaretModel().getOffset(); + if (caretOffset >= cDataStart.length()) { + cdataReformatRanges.add(TextRange.from(caretOffset - cDataStart.length(), inserted.length() + 1)); } } } diff --git a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlSlashTypedHandler.java b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlSlashTypedHandler.java index fbfc6df08044..c5e0ff307a94 100644 --- a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlSlashTypedHandler.java +++ b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlSlashTypedHandler.java @@ -106,7 +106,7 @@ public class XmlSlashTypedHandler extends TypedHandlerDelegate { } } } - EditorModificationUtil.typeInStringAtCaretHonorMultipleCarets(editor, tag.getName() + ">", false); + EditorModificationUtil.insertStringAtCaret(editor, tag.getName() + ">", false); return Result.STOP; } } @@ -133,7 +133,7 @@ public class XmlSlashTypedHandler extends TypedHandlerDelegate { if (XmlUtil.getTokenOfType(tag, XmlTokenType.XML_EMPTY_ELEMENT_END) != null) return Result.CONTINUE; if (PsiTreeUtil.getParentOfType(element, XmlAttributeValue.class) != null) return Result.CONTINUE; - EditorModificationUtil.typeInStringAtCaretHonorMultipleCarets(editor, ">", false); + EditorModificationUtil.insertStringAtCaret(editor, ">", false); return Result.STOP; } return Result.CONTINUE; diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewAction.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewAction.java index f7f5fe50d58d..2bfb6fad8a7a 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewAction.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewAction.java @@ -55,10 +55,10 @@ public class EmmetPreviewAction extends BaseCodeInsightAction implements DumbAwa @Override protected boolean isValidForFile(@NotNull Project project, @NotNull Editor editor, @NotNull PsiFile file) { - int offset = editor.getCaretModel().getOffset(); return super.isValidForFile(project, editor, file) && file instanceof XmlFile && - ZenCodingTemplate.findApplicableDefaultGenerator(CustomTemplateCallback.getContext(file, offset), false) != null; + ZenCodingTemplate.findApplicableDefaultGenerator(CustomTemplateCallback.getContext(file, CustomTemplateCallback.getOffset(editor)), + false) != null; } @Override diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewHint.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewHint.java index 8d07047fc4d6..edde5a83a6d6 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewHint.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewHint.java @@ -65,7 +65,7 @@ public class EmmetPreviewHint extends LightweightHint implements Disposable { @Override public void editorReleased(@NotNull EditorFactoryEvent event) { if (event.getEditor() == myParentEditor || event.getEditor() == myEditor || event.getEditor() == topLevelEditor) { - hide(); + Disposer.dispose(EmmetPreviewHint.this); } } }, this); @@ -176,6 +176,7 @@ public class EmmetPreviewHint extends LightweightHint implements Disposable { maxHeight > contentSize.getHeight() ? (int)size.getHeight() : maxHeight); } + @NotNull @Override public Insets getInsets() { return new Insets(1, 2, 0, 0); diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewUtil.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewUtil.java index 948739d57b96..af106929bcea 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewUtil.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/EmmetPreviewUtil.java @@ -61,7 +61,7 @@ public class EmmetPreviewUtil { if (generator != null && generator instanceof XmlZenCodingGenerator) { final String templatePrefix = new ZenCodingTemplate().computeTemplateKeyWithoutContextChecking(callback); if (templatePrefix != null) { - ZenCodingTemplate.expand(templatePrefix, callback, null, generator, Collections.emptyList(), expandPrimitiveAbbreviations, 0); + ZenCodingTemplate.expand(templatePrefix, callback, generator, Collections.emptyList(), expandPrimitiveAbbreviations, 0); TemplateImpl template = generatedTemplate.get(); String templateText = template != null ? template.getTemplateText() : null; if (!StringUtil.isEmpty(templateText)) { diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/ZenCodingTemplate.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/ZenCodingTemplate.java index 46d5a5640f53..b0d623683912 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/ZenCodingTemplate.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/ZenCodingTemplate.java @@ -124,7 +124,7 @@ public class ZenCodingTemplate extends CustomLiveTemplateBase { public void expand(@NotNull String key, @NotNull CustomTemplateCallback callback) { ZenCodingGenerator defaultGenerator = findApplicableDefaultGenerator(callback.getContext(), false); assert defaultGenerator != null; - expand(key, callback, null, defaultGenerator, Collections.emptyList(), true, Registry.intValue("emmet.segments.limit")); + expand(key, callback, defaultGenerator, Collections.emptyList(), true, Registry.intValue("emmet.segments.limit")); } @Nullable @@ -179,15 +179,15 @@ public class ZenCodingTemplate extends CustomLiveTemplateBase { } - public static void expand(@NotNull String key, @NotNull CustomTemplateCallback callback, @Nullable String surroundedText, + public static void expand(@NotNull String key, @NotNull CustomTemplateCallback callback, @NotNull ZenCodingGenerator defaultGenerator, @NotNull Collection extraFilters, boolean expandPrimitiveAbbreviations, int segmentsLimit) { - final ZenCodingNode node = parse(key, callback, defaultGenerator, surroundedText); + final ZenCodingNode node = parse(key, callback, defaultGenerator, null); if (node == null) { return; } - if (surroundedText == null && node instanceof TemplateNode) { + if (node instanceof TemplateNode) { if (key.equals(((TemplateNode)node).getTemplateToken().getKey()) && callback.findApplicableTemplates(key).size() > 1) { TemplateManagerImpl templateManager = (TemplateManagerImpl)callback.getTemplateManager(); Map template2Argument = templateManager.findMatchingTemplates(callback.getFile(), callback.getEditor(), null, TemplateSettings.getInstance()); @@ -204,13 +204,8 @@ public class ZenCodingTemplate extends CustomLiveTemplateBase { List filters = getFilters(node, context); filters.addAll(extraFilters); - - if (surroundedText == null) { - callback.deleteTemplateKey(key); - // commit is required. otherwise injections placed after caret will be broken - PsiDocumentManager.getInstance(callback.getProject()).commitDocument(callback.getEditor().getDocument()); - } - expand(node, generator, filters, surroundedText, callback, expandPrimitiveAbbreviations, segmentsLimit); + callback.deleteTemplateKey(key); + expand(node, generator, filters, null, callback, expandPrimitiveAbbreviations, segmentsLimit); } private static void expand(ZenCodingNode node, @@ -514,7 +509,7 @@ public class ZenCodingTemplate extends CustomLiveTemplateBase { if (!regularTemplateWithSamePrefixExists) { // exclude perfect matches with existing templates because LiveTemplateCompletionContributor handles it final Collection extraFilters = ContainerUtil.newLinkedList(new SingleLineEmmetFilter()); - expand(templatePrefix, callback, null, generator, extraFilters, false, 0); + expand(templatePrefix, callback, generator, extraFilters, false, 0); if (!generatedTemplate.isNull()) { final TemplateImpl template = generatedTemplate.get(); template.setKey(templatePrefix); diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/BemEmmetFilter.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/BemEmmetFilter.java index 64d097d54777..e9de53d23d2e 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/BemEmmetFilter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/BemEmmetFilter.java @@ -20,7 +20,6 @@ import com.google.common.base.Joiner; import com.google.common.base.Predicate; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableSet; -import com.intellij.application.options.emmet.EmmetOptions; import com.intellij.codeInsight.template.emmet.nodes.GenerationNode; import com.intellij.lang.xml.XMLLanguage; import com.intellij.openapi.util.Couple; @@ -51,6 +50,8 @@ import static com.google.common.collect.Lists.newLinkedList; * And documentation here: http://docs.emmet.io/filters/bem/ */ public class BemEmmetFilter extends ZenCodingFilter { + public static final String SUFFIX = "bem"; + private static final Key BEM_STATE = Key.create("BEM_STATE"); private static final String ELEMENT_SEPARATOR = "__"; @@ -95,13 +96,14 @@ public class BemEmmetFilter extends ZenCodingFilter { @NotNull @Override - public String getSuffix() { - return "bem"; + public String getDisplayName() { + return "BEM"; } + @NotNull @Override - public boolean isAppliedByDefault(@NotNull PsiElement context) { - return EmmetOptions.getInstance().isBemFilterEnabledByDefault(); + public String getSuffix() { + return SUFFIX; } @Override diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/CommentZenCodingFilter.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/CommentZenCodingFilter.java index 82b6235a53c9..d2a7662dcbcb 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/CommentZenCodingFilter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/CommentZenCodingFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -68,4 +68,10 @@ public class CommentZenCodingFilter extends ZenCodingFilter { public boolean isMyContext(@NotNull PsiElement context) { return context.getLanguage() instanceof XMLLanguage; } + + @NotNull + @Override + public String getDisplayName() { + return "Comment tags"; + } } diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/EscapeZenCodingFilter.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/EscapeZenCodingFilter.java index 3249b5a156e4..d07654699e34 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/EscapeZenCodingFilter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/EscapeZenCodingFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,4 +43,10 @@ public class EscapeZenCodingFilter extends ZenCodingFilter { public boolean isMyContext(@NotNull PsiElement context) { return context.getLanguage() instanceof XMLLanguage; } + + @NotNull + @Override + public String getDisplayName() { + return "Escape"; + } } diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/SingleLineEmmetFilter.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/SingleLineEmmetFilter.java index acd047a26d1f..443db5edd88a 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/SingleLineEmmetFilter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/SingleLineEmmetFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -57,4 +57,10 @@ public class SingleLineEmmetFilter extends ZenCodingFilter { public boolean isMyContext(@NotNull PsiElement context) { return context.getLanguage() instanceof XMLLanguage; } + + @NotNull + @Override + public String getDisplayName() { + return "Single line"; + } } diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/TrimZenCodingFilter.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/TrimZenCodingFilter.java index 1c6369244074..ceb0d1dd61b9 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/TrimZenCodingFilter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/TrimZenCodingFilter.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.intellij.codeInsight.template.emmet.filters; import com.intellij.codeInsight.template.emmet.nodes.GenerationNode; @@ -29,6 +44,12 @@ public class TrimZenCodingFilter extends ZenCodingFilter { return context.getLanguage() instanceof XMLLanguage; } + @NotNull + @Override + public String getDisplayName() { + return "Trim line markers"; + } + @NotNull @Override public String filterText(@NotNull String text, @NotNull TemplateToken token) { @@ -65,7 +86,6 @@ public class TrimZenCodingFilter extends ZenCodingFilter { final String surroundedText = node.getSurroundedText(); if (surroundedText != null) { node.setSurroundedText(PATTERN.matcher(surroundedText).replaceAll("")); - } else if(node.getTemplateToken() == TemplateToken.EMPTY_TEMPLATE_TOKEN) { } for (GenerationNode child : node.getChildren()) { doFilter(child); diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/XslZenCodingFilter.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/XslZenCodingFilter.java index 685497f7bcd9..e97b72ed662b 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/XslZenCodingFilter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/XslZenCodingFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -90,6 +90,12 @@ public class XslZenCodingFilter extends ZenCodingFilter { @Override public boolean isAppliedByDefault(@NotNull PsiElement context) { - return XslTextContextType.isXslOrXsltFile(context.getContainingFile()); + return XslTextContextType.isXslOrXsltFile(context.getContainingFile()) || super.isAppliedByDefault(context); + } + + @NotNull + @Override + public String getDisplayName() { + return "XSL tuning"; } } diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/ZenCodingFilter.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/ZenCodingFilter.java index f5057f3e6d9c..1e4ffa713009 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/ZenCodingFilter.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/filters/ZenCodingFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.template.emmet.filters; +import com.intellij.application.options.emmet.EmmetOptions; import com.intellij.codeInsight.template.emmet.nodes.GenerationNode; import com.intellij.codeInsight.template.emmet.tokens.TemplateToken; import com.intellij.openapi.extensions.ExtensionPointName; @@ -29,10 +30,9 @@ import java.util.List; * @author Eugene.Kudelevsky */ public abstract class ZenCodingFilter { - public static final ExtensionPointName EP_NAME = - new ExtensionPointName("com.intellij.xml.zenCodingFilter"); + public static final ExtensionPointName EP_NAME = new ExtensionPointName("com.intellij.xml.zenCodingFilter"); - private static final ZenCodingFilter[] ourStandartFilters = new ZenCodingFilter[]{ + private static final ZenCodingFilter[] OUR_STANDARD_FILTERS = new ZenCodingFilter[]{ new XslZenCodingFilter(), new CommentZenCodingFilter(), new EscapeZenCodingFilter(), @@ -57,12 +57,15 @@ public abstract class ZenCodingFilter { public abstract boolean isMyContext(@NotNull PsiElement context); public boolean isAppliedByDefault(@NotNull PsiElement context) { - return false; + return EmmetOptions.getInstance().isFilterEnabledByDefault(this); } + + @NotNull + public abstract String getDisplayName(); public static List getInstances() { List generators = new ArrayList(); - Collections.addAll(generators, ourStandartFilters); + Collections.addAll(generators, OUR_STANDARD_FILTERS); Collections.addAll(generators, EP_NAME.getExtensions()); return generators; } diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/XmlZenCodingGenerator.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/XmlZenCodingGenerator.java index 62e752312126..ef57f5ed4e49 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/XmlZenCodingGenerator.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/XmlZenCodingGenerator.java @@ -24,6 +24,7 @@ import com.intellij.openapi.util.Couple; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; +import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; @@ -92,8 +93,7 @@ public abstract class XmlZenCodingGenerator extends ZenCodingGenerator { public String computeTemplateKey(@NotNull CustomTemplateCallback callback) { Editor editor = callback.getEditor(); int currentOffset = editor.getCaretModel().getOffset(); - int startOffset = editor.getDocument().getLineStartOffset(editor.getCaretModel().getLogicalPosition().line); - + int startOffset = Math.min(editor.getDocument().getLineStartOffset(editor.getDocument().getLineNumber(currentOffset)), currentOffset); CharSequence documentText = editor.getDocument().getCharsSequence(); PsiElement prevVisibleLeaf = callback.getContext(); while (prevVisibleLeaf != null) { @@ -101,7 +101,8 @@ public abstract class XmlZenCodingGenerator extends ZenCodingGenerator { if (textRange.getEndOffset() <= startOffset) { break; } - if (prevVisibleLeaf.getNode().getElementType() == XmlTokenType.XML_TAG_END) { + IElementType prevType = prevVisibleLeaf.getNode().getElementType(); + if (prevType == XmlTokenType.XML_TAG_END || prevType == XmlTokenType.XML_EMPTY_ELEMENT_END) { startOffset = textRange.getEndOffset(); break; } diff --git a/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java b/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java index cbf690cf4ceb..5ac605b5d450 100644 --- a/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java +++ b/xml/impl/src/com/intellij/ide/actions/CreateHtmlFileAction.java @@ -43,8 +43,8 @@ public class CreateHtmlFileAction extends CreateFileFromTemplateAction implement protected void buildDialog(Project project, PsiDirectory directory, CreateFileFromTemplateDialog.Builder builder) { builder .setTitle(XmlBundle.message("new.html.file.action")) - .addKind("HTML file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML5_TEMPLATE_NAME) - .addKind("HTML4 file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML_TEMPLATE_NAME) + .addKind("HTML 5 file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML5_TEMPLATE_NAME) + .addKind("HTML 4 file", StdFileTypes.HTML.getIcon(), FileTemplateManager.INTERNAL_HTML_TEMPLATE_NAME) .addKind("XHTML file", StdFileTypes.XHTML.getIcon(), FileTemplateManager.INTERNAL_XHTML_TEMPLATE_NAME); } diff --git a/xml/impl/src/com/intellij/ide/browsers/StartBrowserPanel.java b/xml/impl/src/com/intellij/ide/browsers/StartBrowserPanel.java index 342a274c0b30..603746bb3c60 100644 --- a/xml/impl/src/com/intellij/ide/browsers/StartBrowserPanel.java +++ b/xml/impl/src/com/intellij/ide/browsers/StartBrowserPanel.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.intellij.ide.browsers; import com.intellij.ide.DataManager; @@ -141,6 +156,13 @@ public class StartBrowserPanel { return browserSettings; } + public void setFromSettings(StartBrowserSettings settings) { + setSelected(settings.isSelected()); + setUrl(settings.getUrl()); + myStartJavaScriptDebuggerCheckBox.setSelected(settings.isStartJavaScriptDebugger()); + myBrowserSelector.setSelected(settings.getBrowser()); + } + public static void setupUrlField(@NotNull TextFieldWithBrowseButton field, @NotNull final Project project) { FileChooserDescriptor descriptor = new FileChooserDescriptor(true, false, false, false, false, false) { @Override diff --git a/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java b/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java index 7800d8821778..a2d78ccb898b 100644 --- a/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java +++ b/xml/impl/src/com/intellij/ide/browsers/WebBrowserManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,7 @@ package com.intellij.ide.browsers; import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Conditions; -import com.intellij.openapi.util.JDOMUtil; -import com.intellij.openapi.util.ModificationTracker; +import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.SmartList; import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters; @@ -29,13 +26,10 @@ import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.UUID; +import java.util.*; @State(name = "WebBrowsersConfiguration", storages = {@Storage(file = StoragePathMacros.APP_CONFIG + "/web-browsers.xml")}) -public class WebBrowserManager implements PersistentStateComponent, ModificationTracker { +public class WebBrowserManager extends SimpleModificationTracker implements PersistentStateComponent { private static final Logger LOG = Logger.getInstance(WebBrowserManager.class); // default standard browser ID must be constant across all IDE versions on all machines for all users @@ -48,8 +42,6 @@ public class WebBrowserManager implements PersistentStateComponent, Mod private List browsers; - private long modificationCount; - DefaultBrowser defaultBrowser = DefaultBrowser.SYSTEM; public WebBrowserManager() { @@ -87,7 +79,7 @@ public class WebBrowserManager implements PersistentStateComponent, Mod public Element getState() { Element state = new Element("state"); if (defaultBrowser != DefaultBrowser.SYSTEM) { - state.setAttribute("default", defaultBrowser.name().toLowerCase()); + state.setAttribute("default", defaultBrowser.name().toLowerCase(Locale.ENGLISH)); } for (ConfigurableWebBrowser browser : browsers) { @@ -185,7 +177,7 @@ public class WebBrowserManager implements PersistentStateComponent, Mod String defaultValue = element.getAttributeValue("default"); if (!StringUtil.isEmpty(defaultValue)) { try { - defaultBrowser = DefaultBrowser.valueOf(defaultValue.toUpperCase()); + defaultBrowser = DefaultBrowser.valueOf(defaultValue.toUpperCase(Locale.ENGLISH)); } catch (IllegalArgumentException e) { LOG.warn(e); @@ -245,7 +237,7 @@ public class WebBrowserManager implements PersistentStateComponent, Mod void setList(@NotNull List value) { browsers = value; - modificationCount++; + incModificationCount(); } @NotNull @@ -286,7 +278,7 @@ public class WebBrowserManager implements PersistentStateComponent, Mod final BrowserSpecificSettings specificSettings) { final ConfigurableWebBrowser browser = new ConfigurableWebBrowser(id, family, name, path, active, specificSettings); browsers.add(browser); - modificationCount++; + incModificationCount(); return browser; } @@ -371,9 +363,4 @@ public class WebBrowserManager implements PersistentStateComponent, Mod } return null; } - - @Override - public long getModificationCount() { - return modificationCount; - } } \ No newline at end of file diff --git a/xml/impl/src/com/intellij/ide/browsers/actions/BaseOpenInBrowserAction.java b/xml/impl/src/com/intellij/ide/browsers/actions/BaseOpenInBrowserAction.java index b01bcdfd9b52..8ec2a2e55b67 100644 --- a/xml/impl/src/com/intellij/ide/browsers/actions/BaseOpenInBrowserAction.java +++ b/xml/impl/src/com/intellij/ide/browsers/actions/BaseOpenInBrowserAction.java @@ -84,12 +84,11 @@ public abstract class BaseOpenInBrowserAction extends DumbAwareAction { StringBuilder builder = new StringBuilder(description); builder.append(" ("); Shortcut[] shortcuts = KeymapManager.getInstance().getActiveKeymap().getShortcuts("WebOpenInAction"); - if (shortcuts.length > 0) { - builder.append(KeymapUtil.getShortcutText(shortcuts[0])); - } + boolean exists = shortcuts.length > 0; + if (exists) builder.append(KeymapUtil.getShortcutText(shortcuts[0])); if (HtmlUtil.isHtmlFile(result.first.getFile())) { - builder.append(", hold Shift to open URL of local file"); + builder.append(exists ? ", " : "").append("hold Shift to open URL of local file"); } builder.append(')'); description = builder.toString(); diff --git a/xml/impl/src/com/intellij/ide/browsers/actions/OpenInBrowserBaseGroupAction.java b/xml/impl/src/com/intellij/ide/browsers/actions/OpenInBrowserBaseGroupAction.java index 2d5409fd6974..5dd70c03ec77 100644 --- a/xml/impl/src/com/intellij/ide/browsers/actions/OpenInBrowserBaseGroupAction.java +++ b/xml/impl/src/com/intellij/ide/browsers/actions/OpenInBrowserBaseGroupAction.java @@ -18,9 +18,7 @@ package com.intellij.ide.browsers.actions; import com.intellij.icons.AllIcons; import com.intellij.ide.browsers.WebBrowser; import com.intellij.ide.browsers.WebBrowserManager; -import com.intellij.openapi.actionSystem.ActionManager; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.ComputableActionGroup; +import com.intellij.openapi.actionSystem.*; import com.intellij.psi.util.CachedValueProvider; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,6 +30,10 @@ public abstract class OpenInBrowserBaseGroupAction extends ComputableActionGroup protected OpenInBrowserBaseGroupAction(boolean popup) { super(popup); + Presentation p = getTemplatePresentation(); + p.setText("Open in _Browser"); + p.setDescription("Open selected file in browser"); + p.setIcon(AllIcons.Nodes.PpWeb); } @NotNull @@ -75,4 +77,8 @@ public abstract class OpenInBrowserBaseGroupAction extends ComputableActionGroup super(false); } } + + public void update(@NotNull AnActionEvent e) { + e.getPresentation().setVisible(!ActionGroupUtil.isGroupEmpty(this, e)); + } } \ No newline at end of file diff --git a/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java b/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java index 5647e69af22c..5cd056f869d9 100644 --- a/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java +++ b/xml/impl/src/com/intellij/ide/browsers/impl/WebBrowserServiceImpl.java @@ -62,7 +62,7 @@ public class WebBrowserServiceImpl extends WebBrowserService { } } } - return virtualFile instanceof LightVirtualFile ? Collections.emptySet() : Collections.singleton(Urls.newFromVirtualFile(virtualFile)); + return virtualFile instanceof LightVirtualFile || !request.getFile().getViewProvider().isPhysical() ? Collections.emptySet() : Collections.singleton(Urls.newFromVirtualFile(virtualFile)); } @Nullable diff --git a/xml/impl/src/com/intellij/javaee/MapExternalResourceDialog.java b/xml/impl/src/com/intellij/javaee/MapExternalResourceDialog.java index e09101ab5cbe..62196a18e0bf 100644 --- a/xml/impl/src/com/intellij/javaee/MapExternalResourceDialog.java +++ b/xml/impl/src/com/intellij/javaee/MapExternalResourceDialog.java @@ -26,6 +26,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtilCore; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VfsUtilCore; @@ -105,7 +106,7 @@ public class MapExternalResourceDialog extends DialogWrapper { ColoredTreeCellRenderer renderer = new ColoredTreeCellRenderer() { @Override - public void customizeCellRenderer(JTree tree, + public void customizeCellRenderer(@NotNull JTree tree, Object value, boolean selected, boolean expanded, @@ -142,6 +143,7 @@ public class MapExternalResourceDialog extends DialogWrapper { }); myExplorer = new FileSystemTreeImpl(project, new FileChooserDescriptor(true, false, false, false, true, false)); + Disposer.register(getDisposable(), myExplorer); myExplorer.addListener(new FileSystemTree.Listener() { @Override diff --git a/xml/impl/src/com/intellij/xml/util/XmlReferenceContributor.java b/xml/impl/src/com/intellij/xml/util/XmlReferenceContributor.java index 7e5977abf9dc..e2267f53b770 100644 --- a/xml/impl/src/com/intellij/xml/util/XmlReferenceContributor.java +++ b/xml/impl/src/com/intellij/xml/util/XmlReferenceContributor.java @@ -39,7 +39,7 @@ import static com.intellij.patterns.XmlPatterns.*; */ public class XmlReferenceContributor extends PsiReferenceContributor { @Override - public void registerReferenceProviders(final PsiReferenceRegistrar registrar) { + public void registerReferenceProviders(@NotNull final PsiReferenceRegistrar registrar) { final IdReferenceProvider idReferenceProvider = new IdReferenceProvider(); diff --git a/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java b/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java index 11fb4a784c42..271fd5b6ff3d 100644 --- a/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java +++ b/xml/impl/src/com/intellij/xml/util/documentation/HtmlDocumentationProvider.java @@ -15,8 +15,11 @@ */ package com.intellij.xml.util.documentation; +import com.intellij.lang.Language; +import com.intellij.lang.LanguageDocumentation; import com.intellij.lang.documentation.DocumentationProvider; import com.intellij.lang.documentation.DocumentationUtil; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiManager; import com.intellij.psi.PsiWhiteSpace; @@ -36,22 +39,19 @@ import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.List; +import java.util.Locale; /** * @author maxim */ public class HtmlDocumentationProvider implements DocumentationProvider { - private static DocumentationProvider ourStyleProvider; + private DocumentationProvider myStyleProvider = null; private static DocumentationProvider ourScriptProvider; @NonNls public static final String ELEMENT_ELEMENT_NAME = "element"; @NonNls public static final String NBSP = ": "; @NonNls public static final String BR = "
"; - public static void registerStyleDocumentationProvider(DocumentationProvider documentationProvider) { - ourStyleProvider = documentationProvider; - } - @Override @Nullable public String getQuickNavigateInfo(PsiElement element, PsiElement originalElement) { @@ -63,10 +63,10 @@ public class HtmlDocumentationProvider implements DocumentationProvider { @Override public List getUrlFor(PsiElement element, PsiElement originalElement) { - String result = getUrlForHtml(element, PsiTreeUtil.getParentOfType(originalElement,XmlTag.class,false)); - - if (result == null && ourStyleProvider !=null) { - return ourStyleProvider.getUrlFor(element, originalElement); + String result = getUrlForHtml(element, PsiTreeUtil.getParentOfType(originalElement, XmlTag.class, false)); + DocumentationProvider styleProvider = getStyleProvider(); + if (result == null && styleProvider != null) { + return styleProvider.getUrlFor(element, originalElement); } return result != null ? Collections.singletonList(result) : null; @@ -126,7 +126,7 @@ public class HtmlDocumentationProvider implements DocumentationProvider { key = nameElement.getText(); } - key = (key != null)?key.toLowerCase():""; + key = StringUtil.notNullize(key).toLowerCase(Locale.US); int dotIndex = key.indexOf('.'); if (dotIndex > 0) { @@ -155,8 +155,9 @@ public class HtmlDocumentationProvider implements DocumentationProvider { final XmlTag tag = PsiTreeUtil.getParentOfType(originalElement, XmlTag.class, false); String result = generateDocForHtml(element, false, tag, originalElement); - if (result == null && ourStyleProvider !=null) { - result = ourStyleProvider.generateDoc(element, originalElement); + DocumentationProvider styleProvider = getStyleProvider(); + if (result == null && styleProvider !=null) { + result = styleProvider.generateDoc(element, originalElement); } if (result == null && ourScriptProvider !=null) { @@ -170,15 +171,11 @@ public class HtmlDocumentationProvider implements DocumentationProvider { return result; } - public String generateDocForHtml(PsiElement element) { - return generateDocForHtml(element,true, null, null); - } - - protected String generateDocForHtml(PsiElement element, boolean ommitHtmlSpecifics, XmlTag context, PsiElement originalElement) { + protected String generateDocForHtml(PsiElement element, boolean omitHtmlSpecifics, XmlTag context, PsiElement originalElement) { final EntityDescriptor descriptor = findDocumentationDescriptor(element,context); if (descriptor!=null) { - return generateJavaDoc(descriptor, ommitHtmlSpecifics, originalElement); + return generateJavaDoc(descriptor, omitHtmlSpecifics, originalElement); } if (element instanceof XmlEntityDecl) { final XmlEntityDecl entityDecl = (XmlEntityDecl)element; @@ -188,11 +185,11 @@ public class HtmlDocumentationProvider implements DocumentationProvider { return null; } - private static String generateJavaDoc(EntityDescriptor descriptor, boolean ommitHtmlSpecifics, PsiElement element) { + private static String generateJavaDoc(EntityDescriptor descriptor, boolean omitHtmlSpecifics, PsiElement element) { StringBuilder buf = new StringBuilder(); - final boolean istag = descriptor instanceof HtmlTagDescriptor; + final boolean isTag = descriptor instanceof HtmlTagDescriptor; - if (istag) { + if (isTag) { DocumentationUtil.formatEntityName(XmlBundle.message("xml.javadoc.tag.name.message"),descriptor.getName(),buf); } else { DocumentationUtil.formatEntityName(XmlBundle.message("xml.javadoc.attribute.name.message"),descriptor.getName(),buf); @@ -200,10 +197,10 @@ public class HtmlDocumentationProvider implements DocumentationProvider { buf.append(XmlBundle.message("xml.javadoc.description.message")).append(NBSP).append(descriptor.getDescription()).append(BR); - if (istag) { + if (isTag) { final HtmlTagDescriptor tagDescriptor = (HtmlTagDescriptor)descriptor; - if (!ommitHtmlSpecifics) { + if (!omitHtmlSpecifics) { boolean hasStartTag = tagDescriptor.isHasStartTag(); if (!hasStartTag) { buf.append(XmlBundle.message("xml.javadoc.start.tag.could.be.omitted.message")).append(BR); @@ -227,7 +224,7 @@ public class HtmlDocumentationProvider implements DocumentationProvider { char dtdId = descriptor.getDtd(); boolean deprecated = dtdId == EntityDescriptor.LOOSE_DTD; if (deprecated) { - buf.append(XmlBundle.message("xml.javadoc.deprecated.message", deprecated)).append(BR); + buf.append(XmlBundle.message("xml.javadoc.deprecated.message", true)).append(BR); } if (dtdId == EntityDescriptor.LOOSE_DTD) { @@ -240,7 +237,7 @@ public class HtmlDocumentationProvider implements DocumentationProvider { buf.append(XmlBundle.message("xml.javadoc.defined.in.any.dtd.message")); } - if (!istag) { + if (!isTag) { ColorSampleLookupValue.addColorPreviewAndCodeToLookup(element,buf); } @@ -255,8 +252,9 @@ public class HtmlDocumentationProvider implements DocumentationProvider { public PsiElement getDocumentationElementForLookupItem(PsiManager psiManager, Object object, PsiElement element) { PsiElement result = createNavigationElementHTML(psiManager, object.toString(),element); - if (result== null && ourStyleProvider !=null) { - result = ourStyleProvider.getDocumentationElementForLookupItem(psiManager, object, element); + DocumentationProvider styleProvider = getStyleProvider(); + if (result== null && styleProvider !=null) { + result = styleProvider.getDocumentationElementForLookupItem(psiManager, object, element); } if (result== null && ourScriptProvider !=null) { result = ourScriptProvider.getDocumentationElementForLookupItem(psiManager, object, element); @@ -271,8 +269,9 @@ public class HtmlDocumentationProvider implements DocumentationProvider { public PsiElement getDocumentationElementForLink(PsiManager psiManager, String link, PsiElement context) { PsiElement result = createNavigationElementHTML(psiManager, link, context); - if (result== null && ourStyleProvider !=null) { - result = ourStyleProvider.getDocumentationElementForLink(psiManager, link,context); + DocumentationProvider styleProvider = getStyleProvider(); + if (result== null && styleProvider !=null) { + result = styleProvider.getDocumentationElementForLink(psiManager, link, context); } if (result== null && ourScriptProvider !=null) { result = ourScriptProvider.getDocumentationElementForLink(psiManager, link,context); @@ -281,7 +280,7 @@ public class HtmlDocumentationProvider implements DocumentationProvider { } public PsiElement createNavigationElementHTML(PsiManager psiManager, String text, PsiElement context) { - String key = text.toLowerCase(); + String key = text.toLowerCase(Locale.US); final HtmlTagDescriptor descriptor = HtmlDescriptorsTable.getTagDescriptor(key); if (descriptor != null && !isAttributeContext(context) ) { @@ -332,4 +331,15 @@ public class HtmlDocumentationProvider implements DocumentationProvider { public static void registerScriptDocumentationProvider(final DocumentationProvider provider) { ourScriptProvider = provider; } + + @Nullable + private DocumentationProvider getStyleProvider() { + if (myStyleProvider == null) { + Language cssLanguage = Language.findLanguageByID("CSS"); + if (cssLanguage != null) { + myStyleProvider = LanguageDocumentation.INSTANCE.forLanguage(cssLanguage); + } + } + return myStyleProvider; + } } diff --git a/xml/impl/src/com/intellij/xml/util/documentation/XHtmlDocumentationProvider.java b/xml/impl/src/com/intellij/xml/util/documentation/XHtmlDocumentationProvider.java index 70ee74f59850..613f588c37f9 100644 --- a/xml/impl/src/com/intellij/xml/util/documentation/XHtmlDocumentationProvider.java +++ b/xml/impl/src/com/intellij/xml/util/documentation/XHtmlDocumentationProvider.java @@ -26,7 +26,7 @@ import com.intellij.psi.xml.XmlText; public class XHtmlDocumentationProvider extends HtmlDocumentationProvider { @Override - protected String generateDocForHtml(PsiElement element, boolean ommitHtmlSpecifics, XmlTag context, PsiElement originalElement) { + protected String generateDocForHtml(PsiElement element, boolean omitHtmlSpecifics, XmlTag context, PsiElement originalElement) { return super.generateDocForHtml(element, true, context, originalElement); } diff --git a/xml/openapi/src/com/intellij/ide/browsers/WebBrowserUrlProvider.java b/xml/openapi/src/com/intellij/ide/browsers/WebBrowserUrlProvider.java index 372c28a338b3..94a1a4b35a98 100644 --- a/xml/openapi/src/com/intellij/ide/browsers/WebBrowserUrlProvider.java +++ b/xml/openapi/src/com/intellij/ide/browsers/WebBrowserUrlProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,7 @@ package com.intellij.ide.browsers; import com.intellij.openapi.extensions.ExtensionPointName; -import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.util.Url; import com.intellij.util.containers.ContainerUtil; @@ -26,26 +24,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.Set; public abstract class WebBrowserUrlProvider { public static final ExtensionPointName EP_NAME = ExtensionPointName.create("com.intellij.webBrowserUrlProvider"); - private final boolean myDeprecatedMethodOverridden; - - protected WebBrowserUrlProvider() { - boolean deprecatedMethodOverridden; - try { - deprecatedMethodOverridden = - getClass().getMethod("canHandleElement", PsiElement.class, PsiFile.class, Ref.class).getDeclaringClass() != WebBrowserUrlProvider.class || - getClass().getMethod("canHandle", PsiElement.class, PsiFile.class, Ref.class).getDeclaringClass() != WebBrowserUrlProvider.class; - } - catch (Throwable ignored) { - deprecatedMethodOverridden = false; - } - myDeprecatedMethodOverridden = deprecatedMethodOverridden; - } - /** * Browser exceptions are printed in Error Dialog when user presses any browser button */ @@ -55,39 +37,7 @@ public abstract class WebBrowserUrlProvider { } } - @Deprecated - /** - * @deprecated to remove in IDEA 14 - */ - public boolean canHandleElement(@NotNull PsiElement element, @NotNull PsiFile psiFile, @NotNull Ref> result) { - Ref> ref = Ref.create(); - @SuppressWarnings("deprecation") - boolean canHandle = canHandle(element, psiFile, ref); - if (!ref.isNull()) { - result.set(ContainerUtil.newHashSet(ref.get())); - } - return canHandle; - } - - @SuppressWarnings("UnusedParameters") - @Deprecated - /** - * @deprecated to remove in IDEA 15 - */ - public boolean canHandle(@NotNull PsiElement element, @NotNull PsiFile psiFile, @NotNull Ref> result) { - return false; - } - public boolean canHandleElement(@NotNull OpenInBrowserRequest request) { - if (myDeprecatedMethodOverridden) { - Ref> resultRef = Ref.create(); - //noinspection deprecation - if (canHandleElement(request.getElement(), request.getFile(), resultRef)) { - request.setResult(resultRef.get()); - return true; - } - } - try { Collection urls = getUrls(request); if (!urls.isEmpty()) { @@ -103,17 +53,6 @@ public abstract class WebBrowserUrlProvider { @Nullable protected Url getUrl(@NotNull OpenInBrowserRequest request, @NotNull VirtualFile virtualFile) throws BrowserException { - //noinspection deprecation - return myDeprecatedMethodOverridden ? getUrl(request.getElement(), request.getFile(), virtualFile) : null; - } - - @SuppressWarnings("UnusedParameters") - @Deprecated - @Nullable - /** - * @deprecated to remove in IDEA 14 - */ - public Url getUrl(@NotNull PsiElement element, @NotNull PsiFile psiFile, @NotNull VirtualFile virtualFile) throws BrowserException { return null; } @@ -122,13 +61,6 @@ public abstract class WebBrowserUrlProvider { return ContainerUtil.createMaybeSingletonList(getUrl(request, request.getVirtualFile())); } - @SuppressWarnings({"UnusedParameters", "UnusedDeclaration"}) - @Nullable - @Deprecated - public String getOpenInBrowserActionText(@NotNull PsiFile file) { - return null; - } - @Nullable public String getOpenInBrowserActionDescription(@NotNull PsiFile file) { return null; diff --git a/xml/relaxng/src/org/intellij/plugins/relaxNG/RelaxNGReferenceContributor.java b/xml/relaxng/src/org/intellij/plugins/relaxNG/RelaxNGReferenceContributor.java index c9317dd79ac4..268f53d5d846 100644 --- a/xml/relaxng/src/org/intellij/plugins/relaxNG/RelaxNGReferenceContributor.java +++ b/xml/relaxng/src/org/intellij/plugins/relaxNG/RelaxNGReferenceContributor.java @@ -21,6 +21,7 @@ import com.intellij.psi.PsiReferenceRegistrar; import com.intellij.psi.filters.position.PatternFilter; import com.intellij.xml.util.XmlUtil; import org.intellij.plugins.relaxNG.references.PrefixReferenceProvider; +import org.jetbrains.annotations.NotNull; import static com.intellij.patterns.XmlPatterns.*; @@ -36,7 +37,7 @@ public class RelaxNGReferenceContributor extends PsiReferenceContributor { RNG_TAG_PATTERN.withLocalName("element", "attribute")); @Override - public void registerReferenceProviders(PsiReferenceRegistrar registrar) { + public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) { XmlUtil.registerXmlAttributeValueReferenceProvider(registrar, new String[]{ "name" }, new PatternFilter(xmlAttributeValue().withParent(NAME_PATTERN)), true, new PrefixReferenceProvider()); diff --git a/xml/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileImpl.java b/xml/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileImpl.java index 0bc22c5f407b..fcb398019b7b 100644 --- a/xml/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileImpl.java +++ b/xml/relaxng/src/org/intellij/plugins/relaxNG/compact/psi/impl/RncFileImpl.java @@ -115,6 +115,7 @@ public class RncFileImpl extends PsiFileBase implements RncFile, XmlFile { return false; } + @NotNull @Override public GlobalSearchScope getFileResolveScope() { return ProjectScope.getAllScope(getProject()); diff --git a/xml/xml-psi-api/src/com/intellij/codeInspection/DefaultXmlSuppressionProvider.java b/xml/xml-psi-api/src/com/intellij/codeInspection/DefaultXmlSuppressionProvider.java index 9430842053e3..e0775fd00573 100644 --- a/xml/xml-psi-api/src/com/intellij/codeInspection/DefaultXmlSuppressionProvider.java +++ b/xml/xml-psi-api/src/com/intellij/codeInspection/DefaultXmlSuppressionProvider.java @@ -36,7 +36,7 @@ import org.jetbrains.annotations.Nullable; /** * @author Dmitry Avdeev */ -public class DefaultXmlSuppressionProvider extends XmlSuppressionProvider { +public class DefaultXmlSuppressionProvider extends XmlSuppressionProvider implements InspectionSuppressor { public static final String SUPPRESS_MARK = "suppress"; diff --git a/xml/xml-psi-api/src/com/intellij/codeInspection/XmlInspectionSuppressor.java b/xml/xml-psi-api/src/com/intellij/codeInspection/XmlInspectionSuppressor.java new file mode 100644 index 000000000000..1ddc7f667ab6 --- /dev/null +++ b/xml/xml-psi-api/src/com/intellij/codeInspection/XmlInspectionSuppressor.java @@ -0,0 +1,31 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.codeInspection; + +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; + +public class XmlInspectionSuppressor implements InspectionSuppressor{ + @Override + public boolean isSuppressedFor(@NotNull PsiElement element, String toolId) { + return XmlSuppressionProvider.isSuppressed(element, toolId); + } + + @Override + public SuppressQuickFix[] getSuppressActions(@NotNull PsiElement element, String toolShortName) { + return XmlSuppressableInspectionTool.getSuppressFixes(toolShortName); + } +} diff --git a/xml/xml-psi-api/src/com/intellij/codeInspection/XmlSuppressableInspectionTool.java b/xml/xml-psi-api/src/com/intellij/codeInspection/XmlSuppressableInspectionTool.java index 5292a1ac6af1..a46cd41085fa 100644 --- a/xml/xml-psi-api/src/com/intellij/codeInspection/XmlSuppressableInspectionTool.java +++ b/xml/xml-psi-api/src/com/intellij/codeInspection/XmlSuppressableInspectionTool.java @@ -16,6 +16,7 @@ package com.intellij.codeInspection; +import com.intellij.codeInsight.daemon.HighlightDisplayKey; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; @@ -23,39 +24,31 @@ import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; public abstract class XmlSuppressableInspectionTool extends LocalInspectionTool implements BatchSuppressableTool { @NonNls static final String ALL = "ALL"; - @NotNull - @Override - public SuppressQuickFix[] getBatchSuppressActions(@Nullable PsiElement element) { - return new SuppressQuickFix[]{new SuppressTag(), new SuppressForFile(getID()), new SuppressAllForFile()}; + public static SuppressQuickFix[] getSuppressFixes(final String shortName) { + return getSuppressFixes(shortName, new DefaultXmlSuppressionProvider()); } - @Override - public boolean isSuppressedFor(@NotNull final PsiElement element) { - return XmlSuppressionProvider.isSuppressed(element, getID()); + public static SuppressQuickFix[] getSuppressFixes(final String shortName, XmlSuppressionProvider provider) { + final String id = HighlightDisplayKey.find(shortName).getID(); + return new SuppressQuickFix[]{new SuppressTagStatic(id, provider), new SuppressForFile(id, provider), new SuppressAllForFile(provider)}; } - public class SuppressTag extends SuppressTagStatic { - public SuppressTag() { - super(getID()); - } - } + public static abstract class XmlSuppressFix implements SuppressQuickFix { - public static class SuppressTagStatic implements SuppressQuickFix { - private final String id; + protected final String myId; + protected final XmlSuppressionProvider myProvider; - public SuppressTagStatic(@NotNull String id) { - this.id = id; + protected XmlSuppressFix(String inspectionId, XmlSuppressionProvider suppressionProvider) { + myId = inspectionId; + myProvider = suppressionProvider; } - @NotNull - @Override - public String getName() { - return InspectionsBundle.message("xml.suppressable.for.tag.title"); + protected XmlSuppressFix(String id) { + this(id, new DefaultXmlSuppressionProvider()); } @Override @@ -63,13 +56,6 @@ public abstract class XmlSuppressableInspectionTool extends LocalInspectionTool return context.isValid(); } - @Override - public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { - PsiElement element = descriptor.getPsiElement(); - if (PsiTreeUtil.getParentOfType(element, XmlTag.class) == null) return; - XmlSuppressionProvider.getProvider(element.getContainingFile()).suppressForTag(element, id); - } - @Override @NotNull public String getFamilyName() { @@ -77,39 +63,60 @@ public abstract class XmlSuppressableInspectionTool extends LocalInspectionTool } } - public static class SuppressForFile implements SuppressQuickFix { - private final String myInspectionId; + public static class SuppressTagStatic extends XmlSuppressFix { - public SuppressForFile(@NotNull String inspectionId) { - myInspectionId = inspectionId; + public SuppressTagStatic(String inspectionId, XmlSuppressionProvider suppressionProvider) { + super(inspectionId, suppressionProvider); + } + + public SuppressTagStatic(String id) { + super(id); } @NotNull @Override public String getName() { - return InspectionsBundle.message("xml.suppressable.for.file.title"); + return InspectionsBundle.message("xml.suppressable.for.tag.title"); } @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { PsiElement element = descriptor.getPsiElement(); - if (element == null || !element.isValid() || !(element.getContainingFile() instanceof XmlFile)) return; - XmlSuppressionProvider.getProvider(element.getContainingFile()).suppressForFile(element, myInspectionId); + if (PsiTreeUtil.getParentOfType(element, XmlTag.class) == null) return; + myProvider.suppressForTag(element, myId); + } + + } + + public static class SuppressForFile extends XmlSuppressFix { + + public SuppressForFile(String inspectionId, XmlSuppressionProvider suppressionProvider) { + super(inspectionId, suppressionProvider); + } + + public SuppressForFile(String id) { + super(id); } + @NotNull @Override - public boolean isAvailable(@NotNull Project project, @NotNull PsiElement context) { - return context.isValid(); + public String getName() { + return InspectionsBundle.message("xml.suppressable.for.file.title"); } @Override - @NotNull - public String getFamilyName() { - return getName(); + public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { + PsiElement element = descriptor.getPsiElement(); + if (element == null || !element.isValid() || !(element.getContainingFile() instanceof XmlFile)) return; + myProvider.suppressForFile(element, myId); } } public static class SuppressAllForFile extends SuppressForFile { + public SuppressAllForFile(XmlSuppressionProvider provider) { + super(ALL, provider); + } + public SuppressAllForFile() { super(ALL); } diff --git a/xml/xml-psi-api/src/com/intellij/codeInspection/XmlSuppressionProvider.java b/xml/xml-psi-api/src/com/intellij/codeInspection/XmlSuppressionProvider.java index de68c7a5a7ca..a047f44109ca 100644 --- a/xml/xml-psi-api/src/com/intellij/codeInspection/XmlSuppressionProvider.java +++ b/xml/xml-psi-api/src/com/intellij/codeInspection/XmlSuppressionProvider.java @@ -25,7 +25,7 @@ import org.jetbrains.annotations.NotNull; /** * @author Dmitry Avdeev */ -public abstract class XmlSuppressionProvider { +public abstract class XmlSuppressionProvider implements InspectionSuppressor { public static final ExtensionPointName EP_NAME = new ExtensionPointName("com.intellij.xml.xmlSuppressionProvider"); @@ -38,15 +38,6 @@ public abstract class XmlSuppressionProvider { return false; } - public static XmlSuppressionProvider getProvider(@NotNull PsiFile file) { - for (XmlSuppressionProvider provider : Extensions.getExtensions(EP_NAME)) { - if (provider.isProviderAvailable(file)) { - return provider; - } - } - throw new RuntimeException("No providers found for " + file); - } - public abstract boolean isProviderAvailable(@NotNull PsiFile file); public abstract boolean isSuppressedFor(@NotNull PsiElement element, @NotNull String inspectionId); @@ -55,4 +46,10 @@ public abstract class XmlSuppressionProvider { public abstract void suppressForTag(@NotNull PsiElement element, @NotNull String inspectionId); + @Override + public SuppressQuickFix[] getSuppressActions(@NotNull PsiElement element, String toolShortName) { + return XmlSuppressableInspectionTool.getSuppressFixes(toolShortName, this); + } + + } diff --git a/xml/xml-psi-api/src/com/intellij/javaee/ExternalResourceManager.java b/xml/xml-psi-api/src/com/intellij/javaee/ExternalResourceManager.java index 73f31e3393bf..fb8d7dfae5e9 100644 --- a/xml/xml-psi-api/src/com/intellij/javaee/ExternalResourceManager.java +++ b/xml/xml-psi-api/src/com/intellij/javaee/ExternalResourceManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ package com.intellij.javaee; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.ModificationTracker; +import com.intellij.openapi.util.SimpleModificationTracker; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -27,8 +27,7 @@ import org.jetbrains.annotations.Nullable; /** * author: lesya */ -public abstract class ExternalResourceManager implements ModificationTracker { - +public abstract class ExternalResourceManager extends SimpleModificationTracker { public static ExternalResourceManager getInstance() { return ServiceManager.getService(ExternalResourceManager.class); } diff --git a/xml/xml-psi-impl/src/com/intellij/javaee/CoreExternalResourceManager.java b/xml/xml-psi-impl/src/com/intellij/javaee/CoreExternalResourceManager.java index def0f85fd545..8e2202c697b4 100644 --- a/xml/xml-psi-impl/src/com/intellij/javaee/CoreExternalResourceManager.java +++ b/xml/xml-psi-impl/src/com/intellij/javaee/CoreExternalResourceManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -183,9 +183,4 @@ public class CoreExternalResourceManager extends ExternalResourceManagerEx { public String[] getResourceUrls(@Nullable FileType fileType, @NonNls String version, boolean includeStandard) { throw new UnsupportedOperationException(); } - - @Override - public long getModificationCount() { - return 0; - } } diff --git a/xml/xml-psi-impl/src/com/intellij/javaee/ExternalResourceManagerExImpl.java b/xml/xml-psi-impl/src/com/intellij/javaee/ExternalResourceManagerExImpl.java index 38f96f052c44..2eee2882613e 100644 --- a/xml/xml-psi-impl/src/com/intellij/javaee/ExternalResourceManagerExImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/javaee/ExternalResourceManagerExImpl.java @@ -92,7 +92,6 @@ public class ExternalResourceManagerExImpl extends ExternalResourceManagerEx { } private final List myListeners = ContainerUtil.createLockFreeCopyOnWriteList(); - private long myModificationCount = 0; private final PathMacrosImpl myPathMacros; @NonNls private static final String RESOURCE_ELEMENT = "resource"; @NonNls private static final String URL_ATTR = "url"; @@ -268,7 +267,7 @@ public class ExternalResourceManagerExImpl extends ExternalResourceManagerEx { assert map != null; map.put(url, location); myResourceLocations.add(location); - myModificationCount++; + incModificationCount(); } @Override @@ -285,7 +284,7 @@ public class ExternalResourceManagerExImpl extends ExternalResourceManagerEx { if (location != null) { myResourceLocations.remove(location); } - myModificationCount++; + incModificationCount(); fireExternalResourceChanged(); } } @@ -325,7 +324,7 @@ public class ExternalResourceManagerExImpl extends ExternalResourceManagerEx { ApplicationManager.getApplication().assertWriteAccessAllowed(); clearAllResources(); getProjectResources(project).clearAllResources(); - myModificationCount++; + incModificationCount(); fireExternalResourceChanged(); } @@ -338,14 +337,14 @@ public class ExternalResourceManagerExImpl extends ExternalResourceManagerEx { private void addIgnoredSilently(String url) { myIgnoredResources.add(url); - myModificationCount++; + incModificationCount(); } @Override public void removeIgnoredResource(String url) { ApplicationManager.getApplication().assertWriteAccessAllowed(); if (myIgnoredResources.remove(url)) { - myModificationCount++; + incModificationCount(); fireExternalResourceChanged(); } } @@ -370,11 +369,6 @@ public class ExternalResourceManagerExImpl extends ExternalResourceManagerEx { return ArrayUtil.toStringArray(myIgnoredResources); } - @Override - public long getModificationCount() { - return myModificationCount; - } - @Override public long getModificationCount(@NotNull Project project) { return getProjectResources(project).getModificationCount(); @@ -385,7 +379,7 @@ public class ExternalResourceManagerExImpl extends ExternalResourceManagerEx { myPathMacros.addMacroExpands(macroExpands); macroExpands.substitute(element, SystemInfo.isFileSystemCaseSensitive); - myModificationCount++; + incModificationCount(); for (final Object o1 : element.getChildren(RESOURCE_ELEMENT)) { Element e = (Element)o1; addSilently(e.getAttributeValue(URL_ATTR), DEFAULT_VERSION, e.getAttributeValue(LOCATION_ATTR).replace('/', File.separatorChar)); @@ -502,7 +496,7 @@ public class ExternalResourceManagerExImpl extends ExternalResourceManagerEx { public void setCatalogPropertiesFile(String filePath) { myCatalogManager = null; myCatalogPropertiesFile = filePath; - myModificationCount++; + incModificationCount(); } @Nullable @@ -514,7 +508,7 @@ public class ExternalResourceManagerExImpl extends ExternalResourceManagerEx { } private void setDefaultHtmlDoctype(String defaultHtmlDoctype) { - myModificationCount++; + incModificationCount(); if (Html5SchemaProvider.getHtml5SchemaLocation().equals(defaultHtmlDoctype)) { myDefaultHtmlDoctype = HTML5_DOCTYPE_ELEMENT; diff --git a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlFileImpl.java b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlFileImpl.java index 780eee70fb51..7fc96844ca09 100644 --- a/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlFileImpl.java +++ b/xml/xml-psi-impl/src/com/intellij/psi/impl/source/xml/XmlFileImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -113,6 +113,7 @@ public class XmlFileImpl extends PsiFileImpl implements XmlFile { } + @NotNull @Override public GlobalSearchScope getFileResolveScope() { return ProjectScope.getAllScope(getProject()); -- cgit v1.2.3