diff options
Diffstat (limited to 'xml/impl')
32 files changed, 285 insertions, 235 deletions
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 @@ <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties/> - <border type="etched" title="XML"/> <clientProperties> <BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithIndent"/> </clientProperties> + <border type="etched" title="XML"/> <children> <component id="5cbfc" class="javax.swing.JCheckBox" binding="myShowAutoImportPopups" default-binding="true"> <constraints> <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="8" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> - <text resource-bundle="messages/ApplicationBundle" key="checkbox.show.import.popup"/> + <text value="Show import popup"/> </properties> </component> </children> 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<EmmetOptions>, 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<String> myFiltersEnabledByDefault = ContainerUtil.newHashSet(); @NotNull private Map<String, Integer> 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<String> getFiltersEnabledByDefault() { + return myFiltersEnabledByDefault; + } + + public void setFiltersEnabledByDefault(@NotNull Set<String> 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<EmmetOptions>, 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 @@ </clientProperties> <border type="none" title="XML"/> <children> - <component id="9ed4c" class="com.intellij.ui.components.JBCheckBox" binding="myEnableBEMFilterJBCheckBox" default-binding="true"> - <constraints> - <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/> - </constraints> - <properties> - <text resource-bundle="messages/XmlBundle" key="emmet.enable.bem.filter"/> - </properties> - </component> <component id="446a3" class="com.intellij.ui.components.JBCheckBox" binding="myEnableEmmetJBCheckBox" default-binding="true"> <constraints> <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/> @@ -37,12 +29,28 @@ </component> <component id="c52c1" class="com.intellij.ui.components.JBCheckBox" binding="myEnablePreviewJBCheckBox"> <constraints> - <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/> + <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="9" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> <text resource-bundle="messages/XmlBundle" key="emmet.enable.preview"/> </properties> </component> + <grid id="cdbb7" binding="myFiltersListPanel" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1"> + <margin top="0" left="0" bottom="0" right="0"/> + <constraints> + <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/> + </constraints> + <properties/> + <border type="none"/> + <children> + <component id="3282c" class="com.intellij.ui.CheckBoxList" binding="myFiltersCheckBoxList"> + <constraints> + <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/> + </constraints> + <properties/> + </component> + </children> + </grid> </children> </grid> <vspacer id="27c08"> 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<ZenCodingFilter> 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<ZenCodingFilter, String>() { + @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<String> enabledByDefault = emmetOptions.getFiltersEnabledByDefault(); + for (ZenCodingFilter filter : ZenCodingFilter.getInstances()) { + myFiltersCheckBoxList.setItemSelected(filter, enabledByDefault.contains(filter.getSuffix())); + } } @Override public void disposeUIResources() { } + + @NotNull + private Set<String> enabledFilters() { + Set<String> 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,58 +17,22 @@ 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<XmlEncodingReference> { - private final XmlAttributeValue myValue; - - private final String myCharsetName; - private final TextRange myRangeInElement; +public class XmlEncodingReference extends EncodingReference implements EmptyResolveMessageProvider, Comparable<XmlEncodingReference> { 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() { //noinspection UnresolvedPropertyKey @@ -76,43 +40,6 @@ public class XmlEncodingReference implements PsiReference, EmptyResolveMessagePr } @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<LookupElement> suggestions = new ArrayList<LookupElement>(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<Caret> 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, "</" + element.getText() + ">", false, 0); + EditorModificationUtil.insertStringAtCaret(editor, "</" + element.getText() + ">", false, 0); } return Result.CONTINUE; } @@ -205,7 +204,7 @@ public class XmlGtTypedHandler extends TypedHandlerDelegate { Collection<TextRange> cdataReformatRanges = null; final XmlElementDescriptor descriptor = tag.getDescriptor(); - EditorModificationUtil.typeInStringAtCaretHonorMultipleCarets(editor, "</" + name + ">", false, 0); + EditorModificationUtil.insertStringAtCaret(editor, "</" + name + ">", 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 = "><![CDATA["; final String inserted = cDataStart + "\n]]>"; - 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.<ZenCodingFilter>emptyList(), expandPrimitiveAbbreviations, 0); + ZenCodingTemplate.expand(templatePrefix, callback, generator, Collections.<ZenCodingFilter>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.<ZenCodingFilter>emptyList(), true, Registry.intValue("emmet.segments.limit")); + expand(key, callback, defaultGenerator, Collections.<ZenCodingFilter>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<? extends ZenCodingFilter> 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<TemplateImpl, String> template2Argument = templateManager.findMatchingTemplates(callback.getFile(), callback.getEditor(), null, TemplateSettings.getInstance()); @@ -204,13 +204,8 @@ public class ZenCodingTemplate extends CustomLiveTemplateBase { List<ZenCodingFilter> 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<SingleLineEmmetFilter> 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<BemState> 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; @@ -31,6 +46,12 @@ public class TrimZenCodingFilter extends ZenCodingFilter { @NotNull @Override + public String getDisplayName() { + return "Trim line markers"; + } + + @NotNull + @Override public String filterText(@NotNull String text, @NotNull TemplateToken token) { XmlDocument document = token.getFile().getDocument(); if (document != null) { @@ -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<ZenCodingFilter> EP_NAME = - new ExtensionPointName<ZenCodingFilter>("com.intellij.xml.zenCodingFilter"); + public static final ExtensionPointName<ZenCodingFilter> EP_NAME = new ExtensionPointName<ZenCodingFilter>("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<ZenCodingFilter> getInstances() { List<ZenCodingFilter> generators = new ArrayList<ZenCodingFilter>(); - 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<Element>, ModificationTracker { +public class WebBrowserManager extends SimpleModificationTracker implements PersistentStateComponent<Element> { 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<Element>, Mod private List<ConfigurableWebBrowser> browsers; - private long modificationCount; - DefaultBrowser defaultBrowser = DefaultBrowser.SYSTEM; public WebBrowserManager() { @@ -87,7 +79,7 @@ public class WebBrowserManager implements PersistentStateComponent<Element>, 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<Element>, 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<Element>, Mod void setList(@NotNull List<ConfigurableWebBrowser> value) { browsers = value; - modificationCount++; + incModificationCount(); } @NotNull @@ -286,7 +278,7 @@ public class WebBrowserManager implements PersistentStateComponent<Element>, 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<Element>, 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.<Url>emptySet() : Collections.singleton(Urls.newFromVirtualFile(virtualFile)); + return virtualFile instanceof LightVirtualFile || !request.getFile().getViewProvider().isPhysical() ? Collections.<Url>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 = "<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<String> 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); } |