From e7b230ecd2542f0f45958807f98bb0dabd7c1b58 Mon Sep 17 00:00:00 2001 From: Roman Chernyatchik Date: Mon, 24 Nov 2008 18:37:06 +0300 Subject: [PATCH] 1. Added ability to specify defaul attributes and selection for all templates attributes 2. Test-Spec file template was added --- .../fileTemplates/actions/AttributesDefaults.java | 65 ++++++++++++++++++++++ .../actions/CreateFromTemplateActionBase.java | 4 +- .../fileTemplates/ui/CreateFromTemplateDialog.java | 5 +- .../fileTemplates/ui/CreateFromTemplatePanel.java | 62 ++++++++++++++++----- 4 files changed, 119 insertions(+), 17 deletions(-) create mode 100644 lang-impl/src/com/intellij/ide/fileTemplates/actions/AttributesDefaults.java diff --git a/lang-impl/src/com/intellij/ide/fileTemplates/actions/AttributesDefaults.java b/lang-impl/src/com/intellij/ide/fileTemplates/actions/AttributesDefaults.java new file mode 100644 index 0000000000..1647e77f3a --- /dev/null +++ b/lang-impl/src/com/intellij/ide/fileTemplates/actions/AttributesDefaults.java @@ -0,0 +1,65 @@ +package com.intellij.ide.fileTemplates.actions; + +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.TextRange; +import com.intellij.util.containers.HashMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NonNls; + +import java.util.Map; + +/** + * @author Roman Chernyatchik +*/ +public class AttributesDefaults { + private final String myDefaultName; + private final TextRange myDefaultRange; + private final Map> myNamesToValueAndRangeMap = new HashMap>(); + + public AttributesDefaults(@NonNls @Nullable final String defaultName, + @Nullable final TextRange defaultRange) { + myDefaultName = defaultName; + myDefaultRange = defaultRange; + } + + public AttributesDefaults(@NonNls @Nullable final String defaultName) { + this(defaultName, null); + } + + public AttributesDefaults() { + this(null, null); + } + + @Nullable + public String getDefaultFileName() { + return myDefaultName; + } + @Nullable + public TextRange getDefaultFileNameSelection() { + return myDefaultRange; + } + + public void add(@NonNls @NotNull final String attributeKey, + @NonNls @NotNull final String value, + @Nullable final TextRange selectionRange) { + myNamesToValueAndRangeMap.put(attributeKey, new Pair(value, selectionRange)); + } + + public void add(@NonNls @NotNull final String attributeKey, + @NonNls @NotNull final String value) { + add(attributeKey, value, null); + } + + @Nullable + public TextRange getRangeFor(@NonNls @NotNull final String attributeKey) { + final Pair valueAndRange = myNamesToValueAndRangeMap.get(attributeKey); + return valueAndRange == null ? null : valueAndRange.second; + } + + @Nullable + public String getDefaultValueFor(@NonNls @NotNull final String attributeKey) { + final Pair valueAndRange = myNamesToValueAndRangeMap.get(attributeKey); + return valueAndRange == null ? null : valueAndRange.first; + } +} diff --git a/lang-impl/src/com/intellij/ide/fileTemplates/actions/CreateFromTemplateActionBase.java b/lang-impl/src/com/intellij/ide/fileTemplates/actions/CreateFromTemplateActionBase.java index 578b7b03d9..78a5c5307d 100644 --- a/lang-impl/src/com/intellij/ide/fileTemplates/actions/CreateFromTemplateActionBase.java +++ b/lang-impl/src/com/intellij/ide/fileTemplates/actions/CreateFromTemplateActionBase.java @@ -39,7 +39,7 @@ public abstract class CreateFromTemplateActionBase extends AnAction { } else { FileTemplateManager.getInstance().addRecentName(selectedTemplate.getName()); - PsiElement createdElement = new CreateFromTemplateDialog(project, dir, selectedTemplate, getDefaultFileName()).create(); + PsiElement createdElement = new CreateFromTemplateDialog(project, dir, selectedTemplate, getAttributesDefaults()).create(); if (createdElement != null) { view.selectElement(createdElement); } @@ -53,7 +53,7 @@ public abstract class CreateFromTemplateActionBase extends AnAction { protected abstract FileTemplate getTemplate(final Project project, final PsiDirectory dir); @Nullable - public String getDefaultFileName() { + public AttributesDefaults getAttributesDefaults() { return null; } } diff --git a/lang-impl/src/com/intellij/ide/fileTemplates/ui/CreateFromTemplateDialog.java b/lang-impl/src/com/intellij/ide/fileTemplates/ui/CreateFromTemplateDialog.java index d82bb65d57..ea59aa1343 100644 --- a/lang-impl/src/com/intellij/ide/fileTemplates/ui/CreateFromTemplateDialog.java +++ b/lang-impl/src/com/intellij/ide/fileTemplates/ui/CreateFromTemplateDialog.java @@ -5,6 +5,7 @@ import com.intellij.ide.IdeBundle; import com.intellij.ide.fileTemplates.FileTemplate; import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.ide.fileTemplates.FileTemplateUtil; +import com.intellij.ide.fileTemplates.actions.AttributesDefaults; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; @@ -30,7 +31,7 @@ public class CreateFromTemplateDialog extends DialogWrapper { private Properties myDefaultProperties; public CreateFromTemplateDialog(@NotNull Project project, @NotNull PsiDirectory directory, @NotNull FileTemplate template, - @Nullable final String defaultFileName) { + @Nullable final AttributesDefaults attributesDefaults) { super(project, true); myDirectory = directory; myProject = project; @@ -49,7 +50,7 @@ public class CreateFromTemplateDialog extends DialogWrapper { } if (unsetAttributes != null) { - myAttrPanel = new CreateFromTemplatePanel(unsetAttributes, !myTemplate.isJavaClassTemplate(), defaultFileName); + myAttrPanel = new CreateFromTemplatePanel(unsetAttributes, !myTemplate.isJavaClassTemplate(), attributesDefaults); myAttrComponent = myAttrPanel.getComponent(); init(); } diff --git a/lang-impl/src/com/intellij/ide/fileTemplates/ui/CreateFromTemplatePanel.java b/lang-impl/src/com/intellij/ide/fileTemplates/ui/CreateFromTemplatePanel.java index 18e481a660..886b7b1f19 100644 --- a/lang-impl/src/com/intellij/ide/fileTemplates/ui/CreateFromTemplatePanel.java +++ b/lang-impl/src/com/intellij/ide/fileTemplates/ui/CreateFromTemplatePanel.java @@ -2,9 +2,11 @@ package com.intellij.ide.fileTemplates.ui; import com.intellij.ide.IdeBundle; import com.intellij.ide.fileTemplates.FileTemplate; +import com.intellij.ide.fileTemplates.actions.AttributesDefaults; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.Pair; import com.intellij.openapi.ui.impl.DialogWrapperPeerImpl; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.TextRange; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -31,13 +33,13 @@ public class CreateFromTemplatePanel{ private int myHorisontalMargin = -1; private int myVerticalMargin = -1; private boolean myMustEnterName; - private String myDefaultFileName; + private AttributesDefaults myAttributesDefaults; public CreateFromTemplatePanel(final String[] unsetAttributes, final boolean mustEnterName, - @Nullable final String defaultFilename){ + @Nullable final AttributesDefaults attributesDefaults){ myMustEnterName = mustEnterName; myUnsetAttributes = unsetAttributes; - myDefaultFileName = defaultFilename; + myAttributesDefaults = attributesDefaults; Arrays.sort(myUnsetAttributes); } @@ -100,18 +102,36 @@ public class CreateFromTemplatePanel{ } private void updateShown() { - Insets insets = new Insets(2, 2, 2, 2); + final Insets insets = new Insets(2, 2, 2, 2); myAttrPanel.add(Box.createHorizontalStrut(200), new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, insets, 0, 0)); if(myMustEnterName || Arrays.asList(myUnsetAttributes).contains(FileTemplate.ATTRIBUTE_NAME)){ final JLabel filenameLabel = new JLabel(IdeBundle.message("label.file.name")); myAttrPanel.add(filenameLabel, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, insets, 0, 0)); myFilenameField = new JTextField(); - if (myDefaultFileName != null) { - myFilenameField.setText(myDefaultFileName); - final int dot = myDefaultFileName.indexOf('.'); - if (dot > 0) { - myFilenameField.select(0, dot); - myFilenameField.putClientProperty(DialogWrapperPeerImpl.HAVE_INITIAL_SELECTION, true); + + // if default settings specified + if (myAttributesDefaults != null) { + final String fileName = myAttributesDefaults.getDefaultFileName(); + // if default file name specified + if (fileName != null) { + // set predefined file name value + myFilenameField.setText(fileName); + final TextRange selectionRange; + // select range from default attrubutes or select file name without extension + if (myAttributesDefaults.getDefaultFileNameSelection() != null) { + selectionRange = myAttributesDefaults.getDefaultFileNameSelection(); + } else { + final int dot = fileName.indexOf('.'); + if (dot > 0) { + selectionRange = new TextRange(0, dot); + } else { + selectionRange = null; + } + } + // set selection in editor + if (selectionRange != null) { + setPredefinedSelectionFor(myFilenameField, selectionRange); + } } } myAttrPanel.add(myFilenameField, new GridBagConstraints(0, 2, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, insets, 0, 0)); @@ -121,8 +141,19 @@ public class CreateFromTemplatePanel{ if (attribute.equals(FileTemplate.ATTRIBUTE_NAME)) { // already asked above continue; } - JLabel label = new JLabel(attribute.replace('_', ' ') + ":"); - JTextField field = new JTextField(); + final JLabel label = new JLabel(attribute.replace('_', ' ') + ":"); + final JTextField field = new JTextField(); + if (myAttributesDefaults != null) { + final String defaultValue = myAttributesDefaults.getDefaultValueFor(attribute); + final TextRange selectionRange = myAttributesDefaults.getRangeFor(attribute); + if (defaultValue != null) { + field.setText(defaultValue); + // set default selection + if (selectionRange != null) { + setPredefinedSelectionFor(field, selectionRange); + } + } + } myAttributes.add(new Pair(attribute, field)); myAttrPanel.add(label, new GridBagConstraints(0, myLastRow * 2 + 3, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, insets, 0, 0)); @@ -153,5 +184,10 @@ public class CreateFromTemplatePanel{ } return result; } + + private void setPredefinedSelectionFor(final JTextField field, final TextRange selectionRange) { + field.select(selectionRange.getStartOffset(), selectionRange.getEndOffset()); + field.putClientProperty(DialogWrapperPeerImpl.HAVE_INITIAL_SELECTION, true); + } } -- 2.11.4.GIT