From 87dbe29bebdbb37b6fbcbdbd80670e641dc18d23 Mon Sep 17 00:00:00 2001 From: Alexander Zolotov Date: Wed, 9 Sep 2015 18:57:07 +0300 Subject: [PATCH] WEB-13515 Emmet: add settings for placing $END$ at the end of template text --- .../template/LiveTemplateBuilder.java | 41 +++++++++++-------- .../src/messages/XmlBundle.properties | 1 + .../options/emmet/EmmetOptions.java | 11 ++++- .../options/emmet/XmlEmmetConfigurable.form | 14 +++++-- .../options/emmet/XmlEmmetConfigurable.java | 6 ++- .../template/emmet/ZenCodingTemplate.java | 2 +- .../template/emmet/nodes/GenerationNode.java | 4 +- 7 files changed, 55 insertions(+), 24 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/LiveTemplateBuilder.java b/platform/lang-impl/src/com/intellij/codeInsight/template/LiveTemplateBuilder.java index 9678ef213f45..9333eeafc232 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/LiveTemplateBuilder.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/LiveTemplateBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -40,17 +40,19 @@ public class LiveTemplateBuilder { private final List myVariableOccurrences = new ArrayList(); private final List myMarkers = new ArrayList(); private final int mySegmentLimit; + private final boolean myAddEndVariableAtTheEndOfTemplate; private String myLastEndVarName; private boolean myIsToReformat = false; @SuppressWarnings("UnusedDeclaration") public LiveTemplateBuilder() { - this(Registry.intValue("emmet.segments.limit")); + this(false, Registry.intValue("emmet.segments.limit")); } - public LiveTemplateBuilder(int segmentLimit) { + public LiveTemplateBuilder(boolean addEndVariableAtTheEndOfTemplate, int segmentLimit) { mySegmentLimit = segmentLimit; + myAddEndVariableAtTheEndOfTemplate = addEndVariableAtTheEndOfTemplate; } public void setIsToReformat(boolean isToReformat) { @@ -98,22 +100,29 @@ public class LiveTemplateBuilder { } if (myLastEndVarName != null) { int endOffset = -1; - Iterator it = myVariableOccurrences.iterator(); - while (it.hasNext()) { - VarOccurence occurence = it.next(); - if (occurence.myName.equals(myLastEndVarName)) { - endOffset = occurence.myOffset; - break; + if (myAddEndVariableAtTheEndOfTemplate) { + endOffset = myText.length(); + } + else { + Iterator it = myVariableOccurrences.iterator(); + while (it.hasNext()) { + VarOccurence occurence = it.next(); + if (occurence.myName.equals(myLastEndVarName)) { + endOffset = occurence.myOffset; + break; + } + } + if (endOffset >= 0) { + for (Iterator it1 = variables.iterator(); it1.hasNext(); ) { + Variable variable = it1.next(); + if (myLastEndVarName.equals(variable.getName()) && variable.isAlwaysStopAt()) { + it.remove(); + it1.remove(); + } + } } } if (endOffset >= 0) { - for (Iterator it1 = variables.iterator(); it1.hasNext(); ) { - Variable variable = it1.next(); - if (myLastEndVarName.equals(variable.getName()) && variable.isAlwaysStopAt()) { - it.remove(); - it1.remove(); - } - } myVariableOccurrences.add(new VarOccurence(TemplateImpl.END, endOffset)); } } diff --git a/platform/platform-resources-en/src/messages/XmlBundle.properties b/platform/platform-resources-en/src/messages/XmlBundle.properties index aadeb2ae2a75..6fbf7fb1da98 100644 --- a/platform/platform-resources-en/src/messages/XmlBundle.properties +++ b/platform/platform-resources-en/src/messages/XmlBundle.properties @@ -232,6 +232,7 @@ emmet.filters.enabled.by.default=Filters enabled by default emmet.enable.preview=Enable &abbreviation preview emmet.expand.abbreviation.with=Expand &abbreviation with emmet.href.autodetect=Enable automatic &URL recognition while wrapping text with tag +emmet.add.edit.point.at.the.end.of.template=Add edit &point at the end of template title.cannot.create.html.file=Cannot create HTML file new.html.file.action=HTML File 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 684f9cdb1fee..9aea5cd349d4 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-2014 JetBrains s.r.o. + * Copyright 2000-2015 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. @@ -35,6 +35,7 @@ public class EmmetOptions implements PersistentStateComponent { private boolean myPreviewEnabled = false; private Set myFiltersEnabledByDefault = ContainerUtil.newHashSet(); private boolean myHrefAutoDetectEnabled = true; + private boolean myAddEditPointAtTheEndOfTemplate = false; @NotNull public Set getFiltersEnabledByDefault() { @@ -81,6 +82,14 @@ public class EmmetOptions implements PersistentStateComponent { return myHrefAutoDetectEnabled; } + public boolean isAddEditPointAtTheEndOfTemplate() { + return myAddEditPointAtTheEndOfTemplate; + } + + public void setAddEditPointAtTheEndOfTemplate(boolean addEditPointAtTheEndOfTemplate) { + myAddEditPointAtTheEndOfTemplate = addEditPointAtTheEndOfTemplate; + } + @Nullable @Override public EmmetOptions getState() { 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 dbb1daca8c19..34249970dc29 100644 --- a/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.form +++ b/xml/impl/src/com/intellij/application/options/emmet/XmlEmmetConfigurable.form @@ -1,9 +1,9 @@
- + - + @@ -27,7 +27,7 @@ - + @@ -41,6 +41,14 @@ + + + + + + + + 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 25eeab8ecae3..b3d4ba2cd59f 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-2014 JetBrains s.r.o. + * Copyright 2000-2015 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,6 +43,7 @@ public class XmlEmmetConfigurable implements SearchableConfigurable, Disposable, private JBCheckBox myEnablePreviewJBCheckBox; private JPanel myFiltersListPanel; private JBCheckBox myEnableHrefAutodetectJBCheckBox; + private JBCheckBox myAddEditPointAtTheEndOfTemplateJBCheckBox; private Map myFilterCheckboxes = ContainerUtil.newHashMap(); @@ -97,6 +98,7 @@ public class XmlEmmetConfigurable implements SearchableConfigurable, Disposable, return emmetOptions.isEmmetEnabled() != myEnableEmmetJBCheckBox.isSelected() || emmetOptions.isPreviewEnabled() != myEnablePreviewJBCheckBox.isSelected() || emmetOptions.isHrefAutoDetectEnabled() != myEnableHrefAutodetectJBCheckBox.isSelected() || + emmetOptions.isAddEditPointAtTheEndOfTemplate() != myAddEditPointAtTheEndOfTemplateJBCheckBox.isSelected() || !emmetOptions.getFiltersEnabledByDefault().equals(enabledFilters()); } @@ -106,6 +108,7 @@ public class XmlEmmetConfigurable implements SearchableConfigurable, Disposable, emmetOptions.setEmmetEnabled(myEnableEmmetJBCheckBox.isSelected()); emmetOptions.setPreviewEnabled(myEnablePreviewJBCheckBox.isSelected()); emmetOptions.setHrefAutoDetectEnabled(myEnableHrefAutodetectJBCheckBox.isSelected()); + emmetOptions.setAddEditPointAtTheEndOfTemplate(myAddEditPointAtTheEndOfTemplateJBCheckBox.isSelected()); emmetOptions.setFiltersEnabledByDefault(enabledFilters()); } @@ -118,6 +121,7 @@ public class XmlEmmetConfigurable implements SearchableConfigurable, Disposable, myEnablePreviewJBCheckBox.setSelected(emmetOptions.isPreviewEnabled()); myEnableHrefAutodetectJBCheckBox.setEnabled(emmetOptions.isEmmetEnabled()); myEnableHrefAutodetectJBCheckBox.setSelected(emmetOptions.isHrefAutoDetectEnabled()); + myAddEditPointAtTheEndOfTemplateJBCheckBox.setSelected(emmetOptions.isAddEditPointAtTheEndOfTemplate()); Set enabledByDefault = emmetOptions.getFiltersEnabledByDefault(); for (ZenCodingFilter filter : ZenCodingFilter.getInstances()) { 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 753977357815..2540fec6de44 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/ZenCodingTemplate.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/ZenCodingTemplate.java @@ -229,7 +229,7 @@ public class ZenCodingTemplate extends CustomLiveTemplateBase { } List genNodes = fakeParentNode.getChildren(); - LiveTemplateBuilder builder = new LiveTemplateBuilder(segmentsLimit); + LiveTemplateBuilder builder = new LiveTemplateBuilder(EmmetOptions.getInstance().isAddEditPointAtTheEndOfTemplate(), segmentsLimit); int end = -1; for (int i = 0, genNodesSize = genNodes.size(); i < genNodesSize; i++) { GenerationNode genNode = genNodes.get(i); diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/nodes/GenerationNode.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/nodes/GenerationNode.java index e2a3029715fd..bc515e31dcd0 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/nodes/GenerationNode.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/nodes/GenerationNode.java @@ -189,7 +189,7 @@ public class GenerationNode extends UserDataHolderBase { indentStr = StringUtil.repeatSymbol(' ', tabSize); } - LiveTemplateBuilder builder = new LiveTemplateBuilder(segmentsLimit); + LiveTemplateBuilder builder = new LiveTemplateBuilder(EmmetOptions.getInstance().isAddEditPointAtTheEndOfTemplate(), segmentsLimit); int end = -1; boolean hasChildren = myChildren.size() > 0; @@ -348,7 +348,7 @@ public class GenerationNode extends UserDataHolderBase { Map predefinedVarValues, String surroundedText, int segmentsLimit) { - LiveTemplateBuilder builder = new LiveTemplateBuilder(segmentsLimit); + LiveTemplateBuilder builder = new LiveTemplateBuilder(EmmetOptions.getInstance().isAddEditPointAtTheEndOfTemplate(), segmentsLimit); if (predefinedVarValues == null && surroundedText == null) { return template; }