diff --git a/CHANGELOG.md b/CHANGELOG.md index 64725b18..2bea676b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,18 @@ ### Fixed +## [4.1.0] - Sep 07, 2025 + +### Fixed + +- Access is allowed with explicit read lock #898 #901 +- Rework CSV file detection for FileEditorProvider #904 +- Legacy configurable id calculation mode from localizable name will be used for configurable class CsvCodeStyleSettingsProvider. Please override getConfigurableId or getLanguage. #909 + +### Changed + +- Project structure refactoring to avoid circular dependencies + ## [4.0.2] - Dec 29, 2024 ### Added diff --git a/gradle.properties b/gradle.properties index 442acf8f..fbef94eb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ pluginName=CSV Editor pluginId=net.seesharpsoft.intellij.plugins.csv -pluginVersion=4.0.2 +pluginVersion=4.1.0 pluginSinceBuild=242 diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvEscapeCharacter.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvEscapeCharacter.java deleted file mode 100644 index 262abc08..00000000 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvEscapeCharacter.java +++ /dev/null @@ -1,114 +0,0 @@ -package net.seesharpsoft.intellij.plugins.csv; - -import com.intellij.util.xmlb.Converter; -import com.intellij.xml.util.XmlStringUtil; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; -import java.util.regex.Pattern; - -public class CsvEscapeCharacter { - private final String myCharacter; - private final String myDisplay; - private final Pattern myPattern; - private final String myRegexPattern; - private final String myName; - - private static final String CUSTOM_NAME = "CUSTOM"; - private static final String CUSTOM_DISPLAY = "Custom"; - - public static CsvEscapeCharacter QUOTE = new CsvEscapeCharacter("\"", "Double Quote (\")", "\"", "QUOTE"); - public static CsvEscapeCharacter BACKSLASH = new CsvEscapeCharacter("\\", "Backslash (\\)", "\\\\", "BACKSLASH"); - - public static CsvEscapeCharacter[] values() { - return new CsvEscapeCharacter[]{QUOTE, BACKSLASH}; - } - - public static CsvEscapeCharacter getDefaultEscapeCharacter(String character) { - if (character != null) { - switch (character) { - case "QUOTE": - case "\"": - return QUOTE; - case "BACKSLASH": - case "\\": - return BACKSLASH; - default: - break; - } - } - return null; - } - - public static CsvEscapeCharacter create(String character) { - if (character == null) { - return null; - } - CsvEscapeCharacter defaultEscapeCharacter = getDefaultEscapeCharacter(character); - return defaultEscapeCharacter == null ? new CsvEscapeCharacter(character) : defaultEscapeCharacter; - } - - public static class CsvEscapeCharacterConverter extends Converter { - public CsvEscapeCharacter fromString(@NotNull String value) { - return CsvEscapeCharacter.create(XmlStringUtil.unescapeIllegalXmlChars(value)); - } - - public String toString(CsvEscapeCharacter value) { - return XmlStringUtil.escapeIllegalXmlChars(value.getCharacter()); - } - } - - public CsvEscapeCharacter(String myCharacter) { - this(myCharacter, CUSTOM_DISPLAY + " (" + myCharacter + ")", Pattern.quote(myCharacter), CUSTOM_NAME); - } - - private CsvEscapeCharacter(String character, String display, String regexPattern, String name) { - myCharacter = character; - myDisplay = display; - myRegexPattern = regexPattern; - myPattern = Pattern.compile(Pattern.quote(myCharacter + "\"")); - myName = name; - } - - public String getCharacter() { - return myCharacter; - } - - public String getDisplay() { - return myDisplay; - } - - public String getRegexPattern() { - return myRegexPattern; - } - - public boolean isEscapedQuote(String text) { - return myPattern.matcher(text).matches(); - } - - public String getName() { - return myName; - } - - public boolean isCustom() { - return CUSTOM_NAME.equals(getName()); - } - - @Override - public int hashCode() { - return Objects.hash(getCharacter(), isCustom()); - } - - @Override - public boolean equals(Object obj) { - if (!(obj instanceof CsvEscapeCharacter otherObj)) { - return false; - } - return Objects.equals(otherObj.getCharacter(), this.getCharacter()) && Objects.equals(otherObj.isCustom(), this.isCustom()); - } - - @Override - public String toString() { - return getDisplay(); - } -} diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvHelper.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvHelper.java index 958c6be3..be03b01c 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvHelper.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvHelper.java @@ -2,6 +2,7 @@ import com.intellij.lang.*; import com.intellij.lexer.Lexer; +import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeRegistry; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; @@ -15,7 +16,9 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import net.seesharpsoft.intellij.lang.FileParserDefinition; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.components.CsvFileAttributes; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.psi.CsvField; import net.seesharpsoft.intellij.plugins.csv.psi.CsvFile; import net.seesharpsoft.intellij.plugins.csv.psi.CsvRecord; @@ -24,10 +27,7 @@ import net.seesharpsoft.intellij.psi.PsiHelper; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -51,32 +51,21 @@ public static PsiElement createEmptyCsvField(PsiFile psiFile) { return node.getPsi(); } - public static boolean isCsvFile(String extension) { - if (extension == null) { - return false; - } - Language language = LanguageUtil.getFileTypeLanguage( - FileTypeRegistry.getInstance().getFileTypeByExtension(extension) - ); + public static boolean isCsvFile(FileType fileType) { + Language language = LanguageUtil.getFileTypeLanguage(fileType); return language != null && language.isKindOf(CsvLanguage.INSTANCE); } - public static boolean isCsvFile(Project project, VirtualFile file) { - if (file == null) { - return false; - } - if (project == null) { - return isCsvFile(file.getExtension()); - } - final Language language = LanguageUtil.getLanguageForPsi(project, file); - return language != null && language.isKindOf(CsvLanguage.INSTANCE); + public static boolean isCsvFile(String extension) { + return extension != null && isCsvFile(FileTypeRegistry.getInstance().getFileTypeByExtension(extension)); + } + + public static boolean isCsvFile(VirtualFile file) { + return file != null && isCsvFile(file.getFileType()); } public static boolean isCsvFile(PsiFile file) { - if (file == null) { - return false; - } - return isCsvFile(file.getProject(), getVirtualFile(file)); + return file != null && isCsvFile(getVirtualFile(file)); } public static boolean isCommentElement(PsiElement element) { @@ -290,7 +279,7 @@ public static String unquoteCsvValue(String content, CsvEscapeCharacter escapeCh if (trimmedContent.length() > 1 && trimmedContent.startsWith("\"") && trimmedContent.endsWith("\"")) { result = trimmedContent.substring(1, trimmedContent.length() - 1); if (escapeCharacter != null) { - result = result.replaceAll("(?:" + escapeCharacter.getRegexPattern() + ")\"", "\""); + result = result.replaceAll("(?:" + escapeCharacter.getStringPattern() + ")\"", "\""); } } return result; @@ -310,7 +299,7 @@ public static String quoteCsvField(String content, } if (quotingEnforced || isQuotingRequired(content, valueSeparator)) { String result = content; - result = result.replaceAll("\"", escapeCharacter.getRegexPattern() + "\""); + result = result.replaceAll("\"", escapeCharacter.getStringPattern() + "\""); return "\"" + result + "\""; } return content; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexer.flex b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexer.flex index 3d2e1301..3f8cce89 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexer.flex +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexer.flex @@ -1,10 +1,11 @@ package net.seesharpsoft.intellij.plugins.csv; import com.intellij.psi.tree.IElementType; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.psi.CsvTypes; -import com.intellij.psi.TokenType; import com.intellij.lexer.FlexLexer; -import net.seesharpsoft.intellij.plugins.csv.CsvSeparatorHolder; +import net.seesharpsoft.intellij.plugins.csv.components.CsvSeparatorHolder; %% diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexerAdapter.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexerAdapter.java index 81bc23d7..c18bdafd 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexerAdapter.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexerAdapter.java @@ -1,6 +1,9 @@ package net.seesharpsoft.intellij.plugins.csv; import com.intellij.lexer.FlexAdapter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvSeparatorHolder; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; public class CsvLexerAdapter extends FlexAdapter implements CsvSeparatorHolder { diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexerFactory.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexerFactory.java index ddf086b9..f8b3b598 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexerFactory.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexerFactory.java @@ -4,11 +4,11 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings; import org.jetbrains.annotations.NotNull; -import static net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings.COMMENT_INDICATOR_DEFAULT; - public class CsvLexerFactory { protected static CsvLexerFactory INSTANCE = new CsvLexerFactory(); @@ -20,7 +20,7 @@ protected Lexer createLexer(@NotNull CsvValueSeparator separator, @NotNull CsvEs final String commentIndicator = CsvEditorSettings.getInstance().getCommentIndicator(); if (separator.requiresCustomLexer() || escapeCharacter.isCustom() || - (!commentIndicator.isEmpty() && !commentIndicator.equals(COMMENT_INDICATOR_DEFAULT))) { + (!commentIndicator.isEmpty() && !commentIndicator.equals(CsvEditorSettings.COMMENT_INDICATOR_DEFAULT))) { return new CsvSharpLexer(new CsvSharpLexer.Configuration( separator.getCharacter(), "\n", diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvPlugin.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvPlugin.java index f4bcb690..4810f928 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvPlugin.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvPlugin.java @@ -1,12 +1,8 @@ package net.seesharpsoft.intellij.plugins.csv; -import com.intellij.DynamicBundle; import com.intellij.ide.BrowserUtil; import com.intellij.ide.actions.ShowSettingsUtilImpl; -import com.intellij.ide.plugins.IdeaPluginDescriptor; -import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.notification.*; -import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; @@ -21,24 +17,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ResourceBundle; - public class CsvPlugin implements ProjectActivity, DumbAware { - private static ResourceBundle _resourceBundle; - - protected static IdeaPluginDescriptor getPluginDescriptor() { - return PluginManagerCore.getPlugin(PluginId.getId("net.seesharpsoft.intellij.plugins.csv")); - } - - protected static String getVersion() { - return getPluginDescriptor().getVersion(); - } - - protected static String getChangeNotes() { - return getPluginDescriptor().getChangeNotes(); - } - private static void openLink(Project project, String link) { if (project.isDisposed()) return; @@ -79,13 +59,13 @@ public void run(@NotNull ProgressIndicator progressIndicator) { doAsyncProjectMaintenance(project); NotificationGroup notificationGroup = NotificationGroupManager.getInstance().getNotificationGroup("net.seesharpsoft.intellij.plugins.csv"); - if (notificationGroup == null || CsvEditorSettings.getInstance().checkCurrentPluginVersion(getVersion())) { + if (notificationGroup == null || CsvEditorSettings.getInstance().checkCurrentPluginVersion(CsvPluginManager.getVersion())) { return continuation; } Notification notification = notificationGroup.createNotification( - "CSV Editor " + getVersion() + " - Change Notes", - getChangeNotes() + + "CSV Editor " + CsvPluginManager.getVersion() + " - Change Notes", + CsvPluginManager.getChangeNotes() + "

You can always customize plugin settings to your likings (shortcuts below)!

" + "
" + "

Visit the CSV Editor homepage to read more about the available features & settings, " + @@ -112,17 +92,4 @@ public void run(@NotNull ProgressIndicator progressIndicator) { return continuation; } - - public static ResourceBundle getResourceBundle() { - if (_resourceBundle == null) { - _resourceBundle = DynamicBundle.getPluginBundle(getPluginDescriptor()); - } - return _resourceBundle; - } - - public static String getLocalizedText(String token) { - return getResourceBundle().getString(token); - } - - } \ No newline at end of file diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvPluginManager.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvPluginManager.java new file mode 100644 index 00000000..4eb3d2c8 --- /dev/null +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvPluginManager.java @@ -0,0 +1,39 @@ +package net.seesharpsoft.intellij.plugins.csv; + +import com.intellij.DynamicBundle; +import com.intellij.ide.plugins.IdeaPluginDescriptor; +import com.intellij.ide.plugins.PluginManagerCore; +import com.intellij.openapi.extensions.PluginId; + +import java.util.ResourceBundle; + +public final class CsvPluginManager { + private static ResourceBundle _resourceBundle; + + public static ResourceBundle getResourceBundle() { + if (_resourceBundle == null) { + _resourceBundle = DynamicBundle.getPluginBundle(getPluginDescriptor()); + } + return _resourceBundle; + } + + public static String getLocalizedText(String token) { + return getResourceBundle().getString(token); + } + + public static IdeaPluginDescriptor getPluginDescriptor() { + return PluginManagerCore.getPlugin(PluginId.getId("net.seesharpsoft.intellij.plugins.csv")); + } + + public static String getVersion() { + return getPluginDescriptor().getVersion(); + } + + public static String getChangeNotes() { + return getPluginDescriptor().getChangeNotes(); + } + + private CsvPluginManager() { + // static + } +} diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvSharpLexer.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvSharpLexer.java index 70ff0fc0..0b00e4b4 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvSharpLexer.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvSharpLexer.java @@ -4,6 +4,8 @@ import com.intellij.psi.tree.IElementType; import net.seesharpsoft.UnhandledSwitchCaseException; import net.seesharpsoft.commons.util.Tokenizer; +import net.seesharpsoft.intellij.plugins.csv.components.CsvSeparatorHolder; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.psi.CsvTypes; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvValueSeparator.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvValueSeparator.java deleted file mode 100644 index 083a7aa1..00000000 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvValueSeparator.java +++ /dev/null @@ -1,138 +0,0 @@ -package net.seesharpsoft.intellij.plugins.csv; - -import com.intellij.util.xmlb.Converter; -import com.intellij.xml.util.XmlStringUtil; - -import java.util.Objects; -import java.util.regex.Pattern; - -public class CsvValueSeparator { - private final String myCharacter; - private final String myDisplay; - private final Pattern myPattern; - private final String myName; - private final boolean myRequiresCustomLexer; - - private static final String CUSTOM_NAME = "CUSTOM"; - private static final String CUSTOM_DISPLAY = "Custom"; - - public static final CsvValueSeparator COMMA = new CsvValueSeparator(",", "Comma (,)", "COMMA"); - public static final CsvValueSeparator SEMICOLON = new CsvValueSeparator(";", "Semicolon (;)", "SEMICOLON"); - public static final CsvValueSeparator PIPE = new CsvValueSeparator("|", "Pipe (|)", "PIPE"); - public static final CsvValueSeparator TAB = new CsvValueSeparator("\t", "Tab (↹)", "TAB"); - public static final CsvValueSeparator COLON = new CsvValueSeparator(":", "Colon (:)", "COLON"); - public static final CsvValueSeparator RS = new CsvValueSeparator("\u001E", "Record Separator ([RS])", "RS", true); - - public static CsvValueSeparator getDefaultValueSeparator(String character) { - if (character != null) { - switch (character) { - case "COMMA": - case ",": - return COMMA; - case "SEMICOLON": - case ";": - return SEMICOLON; - case "PIPE": - case "|": - return PIPE; - case "TAB": - case "\t": - return TAB; - case "COLON": - case ":": - return COLON; - case "RS": - case "\u001E": - return RS; - default: - break; - } - } - return null; - } - - public static CsvValueSeparator create(String character) { - if (character == null) { - return null; - } - CsvValueSeparator defaultValueSeparator = getDefaultValueSeparator(character); - return defaultValueSeparator == null ? new CsvValueSeparator(character) : defaultValueSeparator; - } - - public static CsvValueSeparator[] values() { - return new CsvValueSeparator[]{COMMA, SEMICOLON, PIPE, TAB, COLON, RS}; - } - - public static class CsvValueSeparatorConverter extends Converter { - public CsvValueSeparator fromString(String value) { - return CsvValueSeparator.create(XmlStringUtil.unescapeIllegalXmlChars(value)); - } - - public String toString(CsvValueSeparator value) { - return XmlStringUtil.escapeIllegalXmlChars(value.getCharacter()); - } - } - - public CsvValueSeparator(String myCharacter) { - this(myCharacter, CUSTOM_DISPLAY + " (" + myCharacter + ")", CUSTOM_NAME, true); - } - - private CsvValueSeparator(String character, String display, String name) { - this(character, display, name, false); - } - - private CsvValueSeparator(String character, String display, String name, boolean requiresCustomLexer) { - myCharacter = character; - myDisplay = display; - myPattern = Pattern.compile(Pattern.quote(myCharacter)); - myName = name; - myRequiresCustomLexer = requiresCustomLexer; - } - - public String getCharacter() { - return myCharacter; - } - - public String getDisplay() { - return myDisplay; - } - - public boolean isValueSeparator(String text) { - return myPattern.matcher(text).matches(); - } - - public boolean isValueSeparator(char c) { - return myCharacter.charAt(0) == c; - } - - public String getName() { - return myName; - } - - public boolean isCustom() { - return CUSTOM_NAME.equals(getName()); - } - - public boolean requiresCustomLexer() { - return myRequiresCustomLexer || isCustom(); - } - - @Override - public int hashCode() { - return Objects.hash(getCharacter(), isCustom()); - } - - @Override - public boolean equals(Object obj) { - if (obj == null || !(obj instanceof CsvValueSeparator)) { - return false; - } - CsvValueSeparator otherObj = (CsvValueSeparator) obj; - return Objects.equals(otherObj.getCharacter(), this.getCharacter()) && Objects.equals(otherObj.isCustom(), this.isCustom()); - } - - @Override - public String toString() { - return getDisplay(); - } -} diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterAction.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterAction.java index 37ef53db..c1a00086 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterAction.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterAction.java @@ -4,7 +4,7 @@ import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.psi.PsiFile; import com.intellij.util.FileContentUtilCore; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; import net.seesharpsoft.intellij.plugins.csv.components.CsvFileAttributes; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterActionGroup.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterActionGroup.java index 761412b1..dc45ee50 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterActionGroup.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterActionGroup.java @@ -2,7 +2,7 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.psi.PsiFile; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; import net.seesharpsoft.intellij.plugins.csv.CsvLanguage; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorAction.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorAction.java index 97f80411..75364a2f 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorAction.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorAction.java @@ -6,8 +6,8 @@ import com.intellij.psi.PsiFile; import com.intellij.util.FileContentUtilCore; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; -import net.seesharpsoft.intellij.plugins.csv.CsvSeparatorHolder; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvSeparatorHolder; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.components.CsvFileAttributes; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorActionGroup.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorActionGroup.java index 17a18567..562790f7 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorActionGroup.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorActionGroup.java @@ -3,7 +3,7 @@ import com.intellij.openapi.actionSystem.*; import com.intellij.psi.PsiFile; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.components.CsvFileAttributes; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvCustomSeparatorAction.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvCustomSeparatorAction.java index cfdb1177..c2ba4d8b 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvCustomSeparatorAction.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvCustomSeparatorAction.java @@ -5,7 +5,7 @@ import com.intellij.psi.PsiFile; import com.intellij.util.FileContentUtilCore; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.components.CsvFileAttributes; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvCustomizableElement.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvCustomizableElement.java new file mode 100644 index 00000000..aa7a2c26 --- /dev/null +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvCustomizableElement.java @@ -0,0 +1,57 @@ +package net.seesharpsoft.intellij.plugins.csv.components; + +import java.util.Objects; +import java.util.regex.Pattern; + +public class CsvCustomizableElement { + private final String myCharacter; + private final String myDisplay; + private final Pattern myPattern; + private final String myName; + + protected static final String CUSTOM_NAME = "CUSTOM"; + protected static final String CUSTOM_DISPLAY = "Custom"; + + protected CsvCustomizableElement(String character, String display, String regexPattern, String name) { + myCharacter = character; + myDisplay = display; + myPattern = Pattern.compile(regexPattern); + myName = name; + } + + public String getCharacter() { + return myCharacter; + } + + public String getDisplay() { + return myDisplay; + } + + public Pattern getPattern() { return myPattern; } + + public String getName() { + return myName; + } + + public boolean isCustom() { + return CUSTOM_NAME.equals(getName()); + } + + @Override + public int hashCode() { + return Objects.hash(getCharacter(), isCustom()); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof CsvCustomizableElement otherObj) || !obj.getClass().equals(this.getClass())) { + return false; + } + return Objects.equals(otherObj.getCharacter(), this.getCharacter()) && Objects.equals(otherObj.isCustom(), this.isCustom()); + } + + @Override + public String toString() { + return getDisplay(); + } +} diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvEscapeCharacter.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvEscapeCharacter.java new file mode 100644 index 00000000..2fff93ca --- /dev/null +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvEscapeCharacter.java @@ -0,0 +1,63 @@ +package net.seesharpsoft.intellij.plugins.csv.components; + +import com.intellij.util.xmlb.Converter; +import com.intellij.xml.util.XmlStringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.regex.Pattern; + +public class CsvEscapeCharacter extends CsvCustomizableElement { + private final String myStringPattern; + + public static CsvEscapeCharacter QUOTE = new CsvEscapeCharacter("\"", "Double Quote (\")", "\"", "QUOTE"); + public static CsvEscapeCharacter BACKSLASH = new CsvEscapeCharacter("\\", "Backslash (\\)", "\\\\", "BACKSLASH"); + + public static CsvEscapeCharacter[] values() { + return new CsvEscapeCharacter[]{ QUOTE, BACKSLASH }; + } + + private static @Nullable CsvEscapeCharacter getDefaultEscapeCharacter(@NotNull String character) { + for (CsvEscapeCharacter defaultEC : values()) { + if (defaultEC.getCharacter().equals(character) || defaultEC.getName().equals(character)) { + return defaultEC; + } + } + return null; + } + + public static CsvEscapeCharacter create(String character) { + if (character == null) { + return null; + } + CsvEscapeCharacter defaultEscapeCharacter = getDefaultEscapeCharacter(character); + return defaultEscapeCharacter == null ? new CsvEscapeCharacter(character) : defaultEscapeCharacter; + } + + public static class CsvEscapeCharacterConverter extends Converter { + public CsvEscapeCharacter fromString(@NotNull String value) { + return CsvEscapeCharacter.create(XmlStringUtil.unescapeIllegalXmlChars(value)); + } + + public String toString(CsvEscapeCharacter value) { + return XmlStringUtil.escapeIllegalXmlChars(value.getCharacter()); + } + } + + public CsvEscapeCharacter(String myCharacter) { + this(myCharacter, CUSTOM_DISPLAY + " (" + myCharacter + ")", Pattern.quote(myCharacter), CUSTOM_NAME); + } + + private CsvEscapeCharacter(String character, String display, String regexPattern, String name) { + super(character, display, Pattern.quote(character + "\""), name); + myStringPattern = regexPattern; + } + + public boolean isEscapedQuote(String text) { + return getPattern().matcher(text).matches(); + } + + public String getStringPattern() { + return myStringPattern; + } +} diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvEscapeCharacterHolder.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvEscapeCharacterHolder.java similarity index 61% rename from src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvEscapeCharacterHolder.java rename to src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvEscapeCharacterHolder.java index 19625bca..f4626a80 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvEscapeCharacterHolder.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvEscapeCharacterHolder.java @@ -1,4 +1,4 @@ -package net.seesharpsoft.intellij.plugins.csv; +package net.seesharpsoft.intellij.plugins.csv.components; public interface CsvEscapeCharacterHolder { CsvEscapeCharacter getEscapeCharacter(); diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributes.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributes.java index 7b17649d..77ea080f 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributes.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributes.java @@ -14,7 +14,9 @@ import com.intellij.util.xmlb.XmlSerializerUtil; import com.intellij.util.xmlb.annotations.OptionTag; import net.seesharpsoft.commons.collection.Pair; -import net.seesharpsoft.intellij.plugins.csv.*; +import net.seesharpsoft.intellij.plugins.csv.CsvHelper; +import net.seesharpsoft.intellij.plugins.csv.CsvLanguage; +import net.seesharpsoft.intellij.plugins.csv.CsvStorageHelper; import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings; import net.seesharpsoft.intellij.util.StringUtils; import org.jetbrains.annotations.NotNull; @@ -83,7 +85,7 @@ private synchronized Attribute getFileAttribute(@NotNull Project project, @NotNu Attribute attribute = attributeMap.get(key); if (attribute == null && createIfMissing) { attribute = new Attribute(); - if (!CsvHelper.isCsvFile(project, virtualFile)) { + if (!CsvHelper.isCsvFile(virtualFile)) { LOG.error("CSV file attribute requested for non CSV file: " + virtualFile.toString()); } else { attributeMap.put(key, attribute); @@ -167,7 +169,7 @@ private CsvValueSeparator autoDetectSeparator(Project project, VirtualFile virtu @NotNull public CsvValueSeparator getValueSeparator(Project project, VirtualFile virtualFile) { - if (!CsvHelper.isCsvFile(project, virtualFile)) { + if (!CsvHelper.isCsvFile(virtualFile)) { return CsvEditorSettings.getInstance().getDefaultValueSeparator(); } FileType fileType = virtualFile.getFileType(); @@ -207,7 +209,7 @@ public void resetEscapeSeparator(@NotNull PsiFile psiFile) { @NotNull public CsvEscapeCharacter getEscapeCharacter(Project project, VirtualFile virtualFile) { - if (!CsvHelper.isCsvFile(project, virtualFile)) { + if (!CsvHelper.isCsvFile(virtualFile)) { return CsvEditorSettings.getInstance().getDefaultEscapeCharacter(); } FileType fileType = virtualFile.getFileType(); diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvSeparatorHolder.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvSeparatorHolder.java similarity index 57% rename from src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvSeparatorHolder.java rename to src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvSeparatorHolder.java index 0daf604d..f44bebcb 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvSeparatorHolder.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvSeparatorHolder.java @@ -1,4 +1,4 @@ -package net.seesharpsoft.intellij.plugins.csv; +package net.seesharpsoft.intellij.plugins.csv.components; public interface CsvSeparatorHolder { CsvValueSeparator getSeparator(); diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvValueSeparator.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvValueSeparator.java new file mode 100644 index 00000000..6abc2471 --- /dev/null +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvValueSeparator.java @@ -0,0 +1,75 @@ +package net.seesharpsoft.intellij.plugins.csv.components; + +import com.intellij.util.xmlb.Converter; +import com.intellij.xml.util.XmlStringUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.regex.Pattern; + +public class CsvValueSeparator extends CsvCustomizableElement { + private final boolean myRequiresCustomLexer; + + public static final CsvValueSeparator COMMA = new CsvValueSeparator(",", "Comma (,)", "COMMA"); + public static final CsvValueSeparator SEMICOLON = new CsvValueSeparator(";", "Semicolon (;)", "SEMICOLON"); + public static final CsvValueSeparator PIPE = new CsvValueSeparator("|", "Pipe (|)", "PIPE"); + public static final CsvValueSeparator TAB = new CsvValueSeparator("\t", "Tab (↹)", "TAB"); + public static final CsvValueSeparator COLON = new CsvValueSeparator(":", "Colon (:)", "COLON"); + public static final CsvValueSeparator RS = new CsvValueSeparator("\u001E", "Record Separator ([RS])", "RS", true); + + public static CsvValueSeparator @NotNull [] values() { + return new CsvValueSeparator[]{ COMMA, SEMICOLON, PIPE, TAB, COLON, RS }; + } + + private static @Nullable CsvValueSeparator getDefaultValueSeparator(@NotNull String character) { + for (CsvValueSeparator defaultVS : values()) { + if (defaultVS.getCharacter().equals(character) || defaultVS.getName().equals(character)) { + return defaultVS; + } + } + return null; + } + + public static CsvValueSeparator create(String character) { + if (character == null) { + return null; + } + CsvValueSeparator defaultValueSeparator = getDefaultValueSeparator(character); + return defaultValueSeparator == null ? new CsvValueSeparator(character) : defaultValueSeparator; + } + + public static class CsvValueSeparatorConverter extends Converter { + public CsvValueSeparator fromString(@NotNull String value) { + return CsvValueSeparator.create(XmlStringUtil.unescapeIllegalXmlChars(value)); + } + + public String toString(CsvValueSeparator value) { + return XmlStringUtil.escapeIllegalXmlChars(value.getCharacter()); + } + } + + public CsvValueSeparator(String myCharacter) { + this(myCharacter, CUSTOM_DISPLAY + " (" + myCharacter + ")", CUSTOM_NAME, true); + } + + private CsvValueSeparator(String character, String display, String name) { + this(character, display, name, false); + } + + private CsvValueSeparator(String character, String display, String name, boolean requiresCustomLexer) { + super(character, display, Pattern.quote(character), name); + myRequiresCustomLexer = requiresCustomLexer; + } + + public boolean isValueSeparator(String text) { + return getPattern().matcher(text).matches(); + } + + public boolean isValueSeparator(char c) { + return getCharacter().charAt(0) == c; + } + + public boolean requiresCustomLexer() { + return myRequiresCustomLexer || isCustom(); + } +} diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/CsvAnnotator.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/CsvAnnotator.java index 7efed1f5..3df77ba6 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/CsvAnnotator.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/CsvAnnotator.java @@ -8,7 +8,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.xml.util.XmlStringUtil; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.psi.CsvField; import net.seesharpsoft.intellij.plugins.csv.psi.CsvFile; import net.seesharpsoft.intellij.plugins.csv.psi.CsvTypes; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/CsvFileEditorProvider.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/CsvFileEditorProvider.java index 76c961f2..cbace8ba 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/CsvFileEditorProvider.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/CsvFileEditorProvider.java @@ -22,7 +22,7 @@ public static boolean acceptCsvFile(@NotNull Project project, @NotNull VirtualFi return !SingleRootFileViewProvider.isTooLargeForContentLoading(file) && !SingleRootFileViewProvider.isTooLargeForIntelligence(file) && !(file instanceof DiffViewerVirtualFile) - && CsvHelper.isCsvFile(project, file); + && CsvHelper.isCsvFile(file); } catch(Exception exc) { return false; } diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableEditor.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableEditor.java index 61a9f71b..a5b5dc02 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableEditor.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableEditor.java @@ -2,6 +2,7 @@ import com.intellij.ide.structureView.StructureViewBuilder; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorFontType; @@ -14,9 +15,9 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.util.ui.UIUtil; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.psi.CsvFile; import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings; import net.seesharpsoft.intellij.psi.PsiFileHolder; @@ -213,12 +214,11 @@ public final CsvFile getCsvFile() { return null; } if (this.psiFile == null || !this.psiFile.isValid()) { - this.document = FileDocumentManager.getInstance().getDocument(this.file); - - PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); - - this.psiFile = documentManager.getPsiFile(this.document); - + this.psiFile = ReadAction.compute(() -> { + this.document = FileDocumentManager.getInstance().getDocument(this.file); + PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); + return documentManager.getPsiFile(this.document); + }); this.currentSeparator = CsvHelper.getValueSeparator(this.psiFile); this.currentEscapeCharacter = CsvHelper.getEscapeCharacter(this.psiFile); } diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableEditorState.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableEditorState.java index ff4057fe..afc09a4a 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableEditorState.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableEditorState.java @@ -6,7 +6,6 @@ import com.intellij.openapi.util.text.StringUtilRt; import com.intellij.openapi.vfs.VirtualFile; import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings; -import org.jdom.Attribute; import org.jdom.Element; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelBase.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelBase.java index 76bd38c7..65b7f853 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelBase.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelBase.java @@ -2,7 +2,7 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; import net.seesharpsoft.intellij.plugins.csv.psi.CsvField; import net.seesharpsoft.intellij.plugins.csv.psi.CsvPsiTreeUpdater; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/swing/CsvMultiLineCellRenderer.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/swing/CsvMultiLineCellRenderer.java index f502aefd..74517e7f 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/swing/CsvMultiLineCellRenderer.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/swing/CsvMultiLineCellRenderer.java @@ -7,7 +7,7 @@ import com.intellij.ui.components.JBScrollPane; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; -import net.seesharpsoft.intellij.plugins.csv.settings.CsvColorSettings; +import net.seesharpsoft.intellij.plugins.csv.highlighter.CsvTextAttributeKeys; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -48,7 +48,7 @@ public CsvMultiLineCellRenderer(CsvTableEditorKeyListener keyListener, UserDataH } protected TextAttributes getColumnTextAttributes(int column) { - return CsvColorSettings.getTextAttributesOfColumn(column, myUserDataHolder); + return CsvTextAttributeKeys.getTextAttributesOfColumn(column, myUserDataHolder); } private Color getColumnForegroundColor(int column, Color fallback) { @@ -194,7 +194,7 @@ public Comment(CsvTableEditorKeyListener keyListener, UserDataHolder userDataHol @Override protected TextAttributes getColumnTextAttributes(int column) { - return CsvColorSettings.getCommentTextAttributes(); + return CsvTextAttributeKeys.getCommentTextAttributes(); } } } diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/highlighter/CsvHighlightingElement.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/highlighter/CsvHighlightingElement.java index 8f2142a4..a3bc3f20 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/highlighter/CsvHighlightingElement.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/highlighter/CsvHighlightingElement.java @@ -5,7 +5,6 @@ import com.intellij.psi.tree.IElementType; import net.seesharpsoft.intellij.plugins.csv.CsvLanguage; import net.seesharpsoft.intellij.plugins.csv.psi.CsvTypes; -import net.seesharpsoft.intellij.plugins.csv.settings.CsvColorSettings; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -13,11 +12,11 @@ public interface CsvHighlightingElement { TextAttributesKey[] getTextAttributesKeys(); class TokenBased extends IElementType implements CsvHighlightingElement { - public static final TokenBased COMMA = new TokenBased(CsvTypes.COMMA.toString(), CsvColorSettings.COMMA); - public static final TokenBased QUOTE = new TokenBased(CsvTypes.QUOTE.toString(), CsvColorSettings.QUOTE); - public static final TokenBased TEXT = new TokenBased(CsvTypes.TEXT.toString(), CsvColorSettings.TEXT); - public static final TokenBased COMMENT = new TokenBased(CsvTypes.COMMENT.toString(), CsvColorSettings.COMMENT); - public static final TokenBased BAD_CHARACTER = new TokenBased(HighlighterColors.BAD_CHARACTER.getExternalName(), CsvColorSettings.BAD_CHARACTER); + public static final TokenBased COMMA = new TokenBased(CsvTypes.COMMA.toString(), CsvTextAttributeKeys.COMMA); + public static final TokenBased QUOTE = new TokenBased(CsvTypes.QUOTE.toString(), CsvTextAttributeKeys.QUOTE); + public static final TokenBased TEXT = new TokenBased(CsvTypes.TEXT.toString(), CsvTextAttributeKeys.TEXT); + public static final TokenBased COMMENT = new TokenBased(CsvTypes.COMMENT.toString(), CsvTextAttributeKeys.COMMENT); + public static final TokenBased BAD_CHARACTER = new TokenBased(HighlighterColors.BAD_CHARACTER.getExternalName(), CsvTextAttributeKeys.BAD_CHARACTER); private final TextAttributesKey[] myTextAttributesKeys; @@ -36,18 +35,18 @@ class ColumnBased extends TokenBased { private static final ColumnBased[] COLUMNS; static { - COLUMNS = new ColumnBased[CsvColorSettings.MAX_COLUMN_COLORING_COLORS]; - for (int i = 0; i < CsvColorSettings.MAX_COLUMN_COLORING_COLORS; ++i) { + COLUMNS = new ColumnBased[CsvTextAttributeKeys.MAX_COLUMN_COLORING_COLORS]; + for (int i = 0; i < CsvTextAttributeKeys.MAX_COLUMN_COLORING_COLORS; ++i) { COLUMNS[i] = new ColumnBased(String.format("Column %s", i), i); } } public static ColumnBased forIndex(int index) { - return COLUMNS[index % CsvColorSettings.MAX_COLUMN_COLORING_COLORS]; + return COLUMNS[index % CsvTextAttributeKeys.MAX_COLUMN_COLORING_COLORS]; } private ColumnBased(@NonNls @NotNull String debugName, int index) { - super(debugName, CsvColorSettings.getTextAttributesKeys(index)); + super(debugName, CsvTextAttributeKeys.getTextAttributesKeys(index)); } } } diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/highlighter/CsvTextAttributeKeys.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/highlighter/CsvTextAttributeKeys.java new file mode 100644 index 00000000..b519620a --- /dev/null +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/highlighter/CsvTextAttributeKeys.java @@ -0,0 +1,107 @@ +package net.seesharpsoft.intellij.plugins.csv.highlighter; + +import com.intellij.openapi.editor.DefaultLanguageHighlighterColors; +import com.intellij.openapi.editor.HighlighterColors; +import com.intellij.openapi.editor.colors.EditorColorsManager; +import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.TextAttributesKey; +import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.options.colors.AttributesDescriptor; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.UserDataHolder; +import net.seesharpsoft.UnhandledSwitchCaseException; +import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings; + +import java.util.ArrayList; +import java.util.List; +import java.util.ResourceBundle; + +import static com.intellij.openapi.editor.colors.TextAttributesKey.createTextAttributesKey; +import static net.seesharpsoft.intellij.plugins.csv.CsvPluginManager.getResourceBundle; + +public final class CsvTextAttributeKeys { + public static final TextAttributesKey COMMA = + createTextAttributesKey("CSV_DEFAULT_COMMA", DefaultLanguageHighlighterColors.COMMA); + public static final TextAttributesKey QUOTE = + createTextAttributesKey("CSV_DEFAULT_QUOTE", DefaultLanguageHighlighterColors.CONSTANT); + public static final TextAttributesKey TEXT = + createTextAttributesKey("CSV_DEFAULT_STRING", DefaultLanguageHighlighterColors.STRING); + public static final TextAttributesKey ESCAPED_TEXT = + createTextAttributesKey("CSV_ESCAPED_STRING", DefaultLanguageHighlighterColors.VALID_STRING_ESCAPE); + public static final TextAttributesKey COMMENT = + createTextAttributesKey("CSV_DEFAULT_COMMENT", DefaultLanguageHighlighterColors.LINE_COMMENT); + public static final TextAttributesKey BAD_CHARACTER = + createTextAttributesKey("CSV_BAD_CHARACTER", HighlighterColors.BAD_CHARACTER); + + public static final Integer MAX_COLUMN_COLORING_COLORS = 10; + public static final AttributesDescriptor[] DESCRIPTORS; + private static final List COLUMN_COLORING_ATTRIBUTES; + private static final Key> COLUMN_COLORING_TEXT_ATTRIBUTES = Key.create("CSV_PLUGIN_COLUMN_COLORING_ATTRIBUTES"); + + static { + List attributesDescriptors = new ArrayList<>(); + ResourceBundle bundle = getResourceBundle(); + attributesDescriptors.add(new AttributesDescriptor(bundle.getString("color.attribute.separator"), CsvTextAttributeKeys.COMMA)); + attributesDescriptors.add(new AttributesDescriptor(bundle.getString("color.attribute.quote"), CsvTextAttributeKeys.QUOTE)); + attributesDescriptors.add(new AttributesDescriptor(bundle.getString("color.attribute.text"), CsvTextAttributeKeys.TEXT)); + attributesDescriptors.add(new AttributesDescriptor(bundle.getString("color.attribute.text.escaped"), CsvTextAttributeKeys.ESCAPED_TEXT)); + attributesDescriptors.add(new AttributesDescriptor(bundle.getString("color.attribute.comment"), CsvTextAttributeKeys.COMMENT)); + + COLUMN_COLORING_ATTRIBUTES = new ArrayList<>(); + for (int i = 0; i < MAX_COLUMN_COLORING_COLORS; ++i) { + TextAttributesKey textAttributesKey = createTextAttributesKey(String.format("CSV_PLUGIN_COLUMN_COLORING_ATTRIBUTE_%d", i), CsvTextAttributeKeys.TEXT); + COLUMN_COLORING_ATTRIBUTES.add(textAttributesKey); + attributesDescriptors.add(new AttributesDescriptor(String.format(bundle.getString("color.attribute.column.nr"), i + 1), textAttributesKey)); + } + DESCRIPTORS = attributesDescriptors.toArray(new AttributesDescriptor[0]); + } + + public static TextAttributesKey getTextAttributesKeys(int columnIndex) { + return COLUMN_COLORING_ATTRIBUTES.get(columnIndex % 10); + } + + public static TextAttributes getCommentTextAttributes() { + EditorColorsScheme editorColorsScheme = EditorColorsManager.getInstance().getGlobalScheme(); + return editorColorsScheme.getAttributes(CsvTextAttributeKeys.COMMENT); + } + + public static TextAttributes getTextAttributesOfColumn(int columnIndex, UserDataHolder userDataHolder) { + List textAttributeList = userDataHolder.getUserData(COLUMN_COLORING_TEXT_ATTRIBUTES); + if (textAttributeList == null) { + EditorColorsScheme editorColorsScheme = EditorColorsManager.getInstance().getGlobalScheme(); + textAttributeList = new ArrayList<>(); + int maxIndex = 0; + switch (CsvEditorSettings.getInstance().getValueColoring()) { + case RAINBOW: + maxIndex = applyColumnTextAttributes(editorColorsScheme, textAttributeList); + break; + case SIMPLE: + textAttributeList.add(editorColorsScheme.getAttributes(CsvTextAttributeKeys.TEXT)); + break; + default: + throw new UnhandledSwitchCaseException(CsvEditorSettings.getInstance().getValueColoring()); + } + textAttributeList = textAttributeList.subList(0, maxIndex + 1); + userDataHolder.putUserData(COLUMN_COLORING_TEXT_ATTRIBUTES, textAttributeList); + } + return textAttributeList.isEmpty() ? null : textAttributeList.get(columnIndex % textAttributeList.size()); + } + + private static int applyColumnTextAttributes(EditorColorsScheme editorColorsScheme, List textAttributeList) { + int maxIndex = 0; + TextAttributes defaultTextAttributes = editorColorsScheme.getAttributes(CsvTextAttributeKeys.TEXT); + for (int colorDescriptorIndex = 0; colorDescriptorIndex < MAX_COLUMN_COLORING_COLORS; ++colorDescriptorIndex) { + TextAttributesKey textAttributesKey = COLUMN_COLORING_ATTRIBUTES.get(colorDescriptorIndex); + TextAttributes textAttributes = editorColorsScheme.getAttributes(textAttributesKey); + textAttributeList.add(textAttributes); + if (!textAttributes.equals(defaultTextAttributes)) { + maxIndex = colorDescriptorIndex; + } + } + return maxIndex; + } + + private CsvTextAttributeKeys() { + // static utility class + } +} diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/inspection/CsvValidationInspection.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/inspection/CsvValidationInspection.java index 87a3fb1b..cc9dd572 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/inspection/CsvValidationInspection.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/inspection/CsvValidationInspection.java @@ -15,7 +15,7 @@ import com.intellij.util.IncorrectOperationException; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; import net.seesharpsoft.intellij.plugins.csv.CsvLanguage; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.intention.CsvIntentionHelper; import net.seesharpsoft.intellij.plugins.csv.psi.CsvTypes; import net.seesharpsoft.intellij.psi.PsiHelper; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/intention/CsvShiftColumnIntentionAction.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/intention/CsvShiftColumnIntentionAction.java index 5cb3e095..4e11d136 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/intention/CsvShiftColumnIntentionAction.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/intention/CsvShiftColumnIntentionAction.java @@ -7,7 +7,7 @@ import com.intellij.psi.PsiElement; import net.seesharpsoft.intellij.plugins.csv.CsvColumnInfo; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.psi.CsvFile; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/psi/CsvPsiParserFileType.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/psi/CsvPsiParserFileType.java index 1f0e31ee..5f7fae18 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/psi/CsvPsiParserFileType.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/psi/CsvPsiParserFileType.java @@ -4,6 +4,10 @@ import com.intellij.openapi.util.NlsContexts; import com.intellij.openapi.util.NlsSafe; import net.seesharpsoft.intellij.plugins.csv.*; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacterHolder; +import net.seesharpsoft.intellij.plugins.csv.components.CsvSeparatorHolder; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/psi/CsvPsiTreeUpdater.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/psi/CsvPsiTreeUpdater.java index 6ee85fe1..d78b55c0 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/psi/CsvPsiTreeUpdater.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/psi/CsvPsiTreeUpdater.java @@ -1,6 +1,7 @@ package net.seesharpsoft.intellij.plugins.csv.psi; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileTypes.FileType; @@ -515,27 +516,25 @@ private static class DocumentPsiAction extends PsiAction { @Override public void execute() { - ApplicationManager.getApplication().runWriteAction( - () -> { - PsiFile psiFile = (PsiFile) getAnchor(); + WriteAction.run(() -> { + PsiFile psiFile = (PsiFile) getAnchor(); - PsiDocumentManager manager = PsiDocumentManager.getInstance(psiFile.getProject()); - Document document = manager.getDocument(psiFile); - if (document == null) return; + PsiDocumentManager manager = PsiDocumentManager.getInstance(psiFile.getProject()); + Document document = manager.getDocument(psiFile); + if (document == null) return; - manager.doPostponedOperationsAndUnblockDocument(document); + manager.doPostponedOperationsAndUnblockDocument(document); - int offset = 0; - for (Pair replacement : myReplacements) { - TextRange textRange = replacement.getFirst().shiftRight(offset); - String text = replacement.getSecond(); - document.replaceString(textRange.getStartOffset(), textRange.getEndOffset(), text); - offset += text.length() - textRange.getLength(); - } + int offset = 0; + for (Pair replacement : myReplacements) { + TextRange textRange = replacement.getFirst().shiftRight(offset); + String text = replacement.getSecond(); + document.replaceString(textRange.getStartOffset(), textRange.getEndOffset(), text); + offset += text.length() - textRange.getLength(); + } - manager.commitDocument(document); - } - ); + manager.commitDocument(document); + }); } } } diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvCodeStyleSettingsProvider.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvCodeStyleSettingsProvider.java index ef75f206..41b56da7 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvCodeStyleSettingsProvider.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvCodeStyleSettingsProvider.java @@ -4,14 +4,16 @@ import com.intellij.application.options.CodeStyleAbstractPanel; import com.intellij.application.options.IndentOptionsEditor; import com.intellij.application.options.TabbedLanguageCodeStylePanel; +import com.intellij.lang.Language; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.*; import net.seesharpsoft.intellij.plugins.csv.CsvLanguage; -import net.seesharpsoft.intellij.plugins.csv.CsvPlugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import static net.seesharpsoft.intellij.plugins.csv.CsvPluginManager.getLocalizedText; + public class CsvCodeStyleSettingsProvider extends CodeStyleSettingsProvider { @Override public CustomCodeStyleSettings createCustomSettings(@NotNull CodeStyleSettings settings) { @@ -21,7 +23,7 @@ public CustomCodeStyleSettings createCustomSettings(@NotNull CodeStyleSettings s @Nullable @Override public String getConfigurableDisplayName() { - return CsvPlugin.getLocalizedText("settings.title"); + return getLocalizedText("settings.title"); } @NotNull @@ -41,6 +43,11 @@ public String getHelpTopic() { }; } + @Override + public Language getLanguage() { + return CsvLanguage.INSTANCE; + } + private static class CsvCodeStyleMainPanel extends TabbedLanguageCodeStylePanel { CsvCodeStyleMainPanel(CodeStyleSettings currentSettings, CodeStyleSettings settings) { super(CsvLanguage.INSTANCE, currentSettings, settings); @@ -66,7 +73,7 @@ public CsvWrappingPanel(CodeStyleSettings settings) { @Override public @NotNull String getTabTitle() { - return CsvPlugin.getLocalizedText("settings.codestyle.wrapping"); + return getLocalizedText("settings.codestyle.wrapping"); } } @@ -77,7 +84,7 @@ public CsvSpacesPanel(CodeStyleSettings settings) { @Override protected @NotNull String getTabTitle() { - return CsvPlugin.getLocalizedText("settings.codestyle.spaces"); + return getLocalizedText("settings.codestyle.spaces"); } @Override diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvColorSettings.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvColorSettings.java index 6bc92c67..c6cb9936 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvColorSettings.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvColorSettings.java @@ -1,115 +1,22 @@ package net.seesharpsoft.intellij.plugins.csv.settings; -import com.intellij.openapi.editor.DefaultLanguageHighlighterColors; -import com.intellij.openapi.editor.HighlighterColors; -import com.intellij.openapi.editor.colors.EditorColorsManager; -import com.intellij.openapi.editor.colors.EditorColorsScheme; import com.intellij.openapi.editor.colors.TextAttributesKey; -import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.options.colors.AttributesDescriptor; import com.intellij.openapi.options.colors.ColorDescriptor; import com.intellij.openapi.options.colors.ColorSettingsPage; -import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.UserDataHolder; -import net.seesharpsoft.UnhandledSwitchCaseException; import net.seesharpsoft.intellij.plugins.csv.CsvIconProvider; -import net.seesharpsoft.intellij.plugins.csv.CsvPlugin; import net.seesharpsoft.intellij.plugins.csv.highlighter.CsvSyntaxHighlighter; +import net.seesharpsoft.intellij.plugins.csv.highlighter.CsvTextAttributeKeys; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.ArrayList; -import java.util.List; import java.util.Map; -import java.util.ResourceBundle; -import static com.intellij.openapi.editor.colors.TextAttributesKey.createTextAttributesKey; +import static net.seesharpsoft.intellij.plugins.csv.CsvPluginManager.getLocalizedText; public class CsvColorSettings implements ColorSettingsPage { - - public static final TextAttributesKey COMMA = - createTextAttributesKey("CSV_DEFAULT_COMMA", DefaultLanguageHighlighterColors.COMMA); - public static final TextAttributesKey QUOTE = - createTextAttributesKey("CSV_DEFAULT_QUOTE", DefaultLanguageHighlighterColors.CONSTANT); - public static final TextAttributesKey TEXT = - createTextAttributesKey("CSV_DEFAULT_STRING", DefaultLanguageHighlighterColors.STRING); - public static final TextAttributesKey ESCAPED_TEXT = - createTextAttributesKey("CSV_ESCAPED_STRING", DefaultLanguageHighlighterColors.VALID_STRING_ESCAPE); - public static final TextAttributesKey COMMENT = - createTextAttributesKey("CSV_DEFAULT_COMMENT", DefaultLanguageHighlighterColors.LINE_COMMENT); - public static final TextAttributesKey BAD_CHARACTER = - createTextAttributesKey("CSV_BAD_CHARACTER", HighlighterColors.BAD_CHARACTER); - - public static final Integer MAX_COLUMN_COLORING_COLORS = 10; - private static final AttributesDescriptor[] DESCRIPTORS; - private static final List COLUMN_COLORING_ATTRIBUTES; - private static final Key> COLUMN_COLORING_TEXT_ATTRIBUTES = Key.create("CSV_PLUGIN_COLUMN_COLORING_ATTRIBUTES"); - - static { - List attributesDescriptors = new ArrayList<>(); - ResourceBundle bundle = CsvPlugin.getResourceBundle(); - attributesDescriptors.add(new AttributesDescriptor(bundle.getString("color.attribute.separator"), COMMA)); - attributesDescriptors.add(new AttributesDescriptor(bundle.getString("color.attribute.quote"), QUOTE)); - attributesDescriptors.add(new AttributesDescriptor(bundle.getString("color.attribute.text"), TEXT)); - attributesDescriptors.add(new AttributesDescriptor(bundle.getString("color.attribute.text.escaped"), ESCAPED_TEXT)); - attributesDescriptors.add(new AttributesDescriptor(bundle.getString("color.attribute.comment"), COMMENT)); - - COLUMN_COLORING_ATTRIBUTES = new ArrayList<>(); - for (int i = 0; i < MAX_COLUMN_COLORING_COLORS; ++i) { - TextAttributesKey textAttributesKey = createTextAttributesKey(String.format("CSV_PLUGIN_COLUMN_COLORING_ATTRIBUTE_%d", i), TEXT); - COLUMN_COLORING_ATTRIBUTES.add(textAttributesKey); - attributesDescriptors.add(new AttributesDescriptor(String.format(bundle.getString("color.attribute.column.nr"), i + 1), textAttributesKey)); - } - DESCRIPTORS = attributesDescriptors.toArray(new AttributesDescriptor[0]); - } - - public static TextAttributesKey getTextAttributesKeys(int columnIndex) { - return COLUMN_COLORING_ATTRIBUTES.get(columnIndex % 10); - } - - public static TextAttributes getCommentTextAttributes() { - EditorColorsScheme editorColorsScheme = EditorColorsManager.getInstance().getGlobalScheme(); - return editorColorsScheme.getAttributes(COMMENT); - } - - public static TextAttributes getTextAttributesOfColumn(int columnIndex, UserDataHolder userDataHolder) { - List textAttributeList = userDataHolder.getUserData(COLUMN_COLORING_TEXT_ATTRIBUTES); - if (textAttributeList == null) { - EditorColorsScheme editorColorsScheme = EditorColorsManager.getInstance().getGlobalScheme(); - textAttributeList = new ArrayList<>(); - int maxIndex = 0; - switch (CsvEditorSettings.getInstance().getValueColoring()) { - case RAINBOW: - maxIndex = applyColumnTextAttributes(editorColorsScheme, textAttributeList); - break; - case SIMPLE: - textAttributeList.add(editorColorsScheme.getAttributes(TEXT)); - break; - default: - throw new UnhandledSwitchCaseException(CsvEditorSettings.getInstance().getValueColoring()); - } - textAttributeList = textAttributeList.subList(0, maxIndex + 1); - userDataHolder.putUserData(COLUMN_COLORING_TEXT_ATTRIBUTES, textAttributeList); - } - return textAttributeList.isEmpty() ? null : textAttributeList.get(columnIndex % textAttributeList.size()); - } - - private static int applyColumnTextAttributes(EditorColorsScheme editorColorsScheme, List textAttributeList) { - int maxIndex = 0; - TextAttributes defaultTextAttributes = editorColorsScheme.getAttributes(TEXT); - for (int colorDescriptorIndex = 0; colorDescriptorIndex < MAX_COLUMN_COLORING_COLORS; ++colorDescriptorIndex) { - TextAttributesKey textAttributesKey = COLUMN_COLORING_ATTRIBUTES.get(colorDescriptorIndex); - TextAttributes textAttributes = editorColorsScheme.getAttributes(textAttributesKey); - textAttributeList.add(textAttributes); - if (!textAttributes.equals(defaultTextAttributes)) { - maxIndex = colorDescriptorIndex; - } - } - return maxIndex; - } - @Nullable @Override public Icon getIcon() { @@ -141,7 +48,7 @@ public Map getAdditionalHighlightingTagToDescriptorMa @NotNull @Override public AttributesDescriptor[] getAttributeDescriptors() { - return DESCRIPTORS; + return CsvTextAttributeKeys.DESCRIPTORS; } @NotNull @@ -153,6 +60,6 @@ public ColorDescriptor[] getColorDescriptors() { @NotNull @Override public String getDisplayName() { - return CsvPlugin.getLocalizedText("settings.title"); + return getLocalizedText("settings.title"); } } \ No newline at end of file diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvEditorSettings.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvEditorSettings.java index e7262642..8ca09f17 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvEditorSettings.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvEditorSettings.java @@ -8,10 +8,9 @@ import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; import com.intellij.util.xmlb.annotations.OptionTag; import com.intellij.util.xmlb.annotations.Transient; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; -import net.seesharpsoft.intellij.plugins.csv.CsvPlugin; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.CsvStorageHelper; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import org.jetbrains.annotations.NotNull; import java.awt.*; @@ -19,6 +18,8 @@ import java.beans.PropertyChangeSupport; import java.util.Objects; +import static net.seesharpsoft.intellij.plugins.csv.CsvPluginManager.getLocalizedText; + @State( name = "CsvEditorSettings", storages = {@Storage(CsvStorageHelper.CSV_STATE_STORAGE_FILE)} @@ -41,9 +42,9 @@ public class CsvEditorSettings implements PersistentStateComponent(CsvEditorSettings.ValueColoring.values()); comboValueColoring.setRenderer(new CustomDisplayListCellRenderer<>(CsvEditorSettings.ValueColoring::getDisplay)); - cbTabHighlightColor = new CheckBoxWithColorChooser(CsvPlugin.getLocalizedText("settings.editor.highlight.tab.separator")); + cbTabHighlightColor = new CheckBoxWithColorChooser(getLocalizedText("settings.editor.highlight.tab.separator")); cbTabHighlightColor.setColor(JBColor.CYAN); NumberFormat numberFormat = NumberFormat.getIntegerInstance(); diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvLanguageCodeStyleSettingsProvider.java b/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvLanguageCodeStyleSettingsProvider.java index 810e4b9c..48be98e5 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvLanguageCodeStyleSettingsProvider.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvLanguageCodeStyleSettingsProvider.java @@ -5,11 +5,12 @@ import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider; import net.seesharpsoft.intellij.plugins.csv.CsvLanguage; -import net.seesharpsoft.intellij.plugins.csv.CsvPlugin; import org.jetbrains.annotations.NotNull; import java.util.ResourceBundle; +import static net.seesharpsoft.intellij.plugins.csv.CsvPluginManager.getResourceBundle; + public class CsvLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSettingsProvider { @NotNull @Override @@ -19,7 +20,7 @@ public Language getLanguage() { @Override public void customizeSettings(@NotNull CodeStyleSettingsCustomizable consumer, @NotNull SettingsType settingsType) { - ResourceBundle bundle = CsvPlugin.getResourceBundle(); + ResourceBundle bundle = getResourceBundle(); if (settingsType == SettingsType.LANGUAGE_SPECIFIC) { consumer.showCustomOption(CsvCodeStyleSettings.class, "SPACE_BEFORE_SEPARATOR", diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/psv/PsvFileType.java b/src/main/java/net/seesharpsoft/intellij/plugins/psv/PsvFileType.java index f3f62416..680d619c 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/psv/PsvFileType.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/psv/PsvFileType.java @@ -3,8 +3,8 @@ import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.util.IconLoader; import net.seesharpsoft.intellij.plugins.csv.CsvLanguage; -import net.seesharpsoft.intellij.plugins.csv.CsvSeparatorHolder; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvSeparatorHolder; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/net/seesharpsoft/intellij/plugins/tsv/TsvFileType.java b/src/main/java/net/seesharpsoft/intellij/plugins/tsv/TsvFileType.java index 2e760f68..96fa949d 100644 --- a/src/main/java/net/seesharpsoft/intellij/plugins/tsv/TsvFileType.java +++ b/src/main/java/net/seesharpsoft/intellij/plugins/tsv/TsvFileType.java @@ -3,8 +3,8 @@ import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.util.IconLoader; import net.seesharpsoft.intellij.plugins.csv.CsvLanguage; -import net.seesharpsoft.intellij.plugins.csv.CsvSeparatorHolder; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvSeparatorHolder; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 47b3b07e..35de7398 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -49,9 +49,9 @@ org.jetbrains.plugins.github - - - + + + @@ -60,6 +60,10 @@ implementationClass="net.seesharpsoft.intellij.plugins.csv.highlighter.CsvSyntaxHighlighterFactory"/> + + diff --git a/src/test/java/net/seesharpsoft/intellij/plugins/csv/CsvHelperTest.java b/src/test/java/net/seesharpsoft/intellij/plugins/csv/CsvHelperTest.java index f46913de..67ef2d5d 100644 --- a/src/test/java/net/seesharpsoft/intellij/plugins/csv/CsvHelperTest.java +++ b/src/test/java/net/seesharpsoft/intellij/plugins/csv/CsvHelperTest.java @@ -1,6 +1,8 @@ package net.seesharpsoft.intellij.plugins.csv; import com.intellij.testFramework.PlatformLiteFixture; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; public class CsvHelperTest extends PlatformLiteFixture { diff --git a/src/test/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterActionTest.java b/src/test/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterActionTest.java index 15821c9e..34b8513d 100644 --- a/src/test/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterActionTest.java +++ b/src/test/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeEscapeCharacterActionTest.java @@ -1,7 +1,7 @@ package net.seesharpsoft.intellij.plugins.csv.actions; import com.intellij.openapi.actionSystem.Presentation; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; public class CsvChangeEscapeCharacterActionTest extends CsvActionTestBase { diff --git a/src/test/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorActionTest.java b/src/test/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorActionTest.java index 55b46eaf..ff92858b 100644 --- a/src/test/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorActionTest.java +++ b/src/test/java/net/seesharpsoft/intellij/plugins/csv/actions/CsvChangeSeparatorActionTest.java @@ -2,7 +2,7 @@ import com.intellij.openapi.actionSystem.Presentation; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; public class CsvChangeSeparatorActionTest extends CsvActionTestBase { diff --git a/src/test/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributesTest.java b/src/test/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributesTest.java index 541278aa..68a50927 100644 --- a/src/test/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributesTest.java +++ b/src/test/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributesTest.java @@ -1,7 +1,6 @@ package net.seesharpsoft.intellij.plugins.csv.components; import net.seesharpsoft.intellij.plugins.csv.CsvBasePlatformTestCase; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.CsvHelper; import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings; diff --git a/src/test/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelBaseTest.java b/src/test/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelBaseTest.java index eddad7d7..9727cdf2 100644 --- a/src/test/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelBaseTest.java +++ b/src/test/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelBaseTest.java @@ -6,7 +6,7 @@ import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.testFramework.PsiTestUtil; import net.seesharpsoft.intellij.plugins.csv.CsvBasePlatformTestCase; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.settings.CsvCodeStyleSettings; import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings; import net.seesharpsoft.intellij.psi.PsiFileHolder; diff --git a/src/test/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelCustomizedTest.java b/src/test/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelCustomizedTest.java index 0a5d7188..a64b2c77 100644 --- a/src/test/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelCustomizedTest.java +++ b/src/test/java/net/seesharpsoft/intellij/plugins/csv/editor/table/CsvTableModelCustomizedTest.java @@ -1,7 +1,7 @@ package net.seesharpsoft.intellij.plugins.csv.editor.table; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings; public class CsvTableModelCustomizedTest extends CsvTableModelBaseTest { diff --git a/src/test/java/net/seesharpsoft/intellij/plugins/csv/intention/CsvIntentionTest.java b/src/test/java/net/seesharpsoft/intellij/plugins/csv/intention/CsvIntentionTest.java index 0f169878..6f593afd 100644 --- a/src/test/java/net/seesharpsoft/intellij/plugins/csv/intention/CsvIntentionTest.java +++ b/src/test/java/net/seesharpsoft/intellij/plugins/csv/intention/CsvIntentionTest.java @@ -2,7 +2,7 @@ import com.intellij.codeInsight.intention.IntentionAction; import net.seesharpsoft.intellij.plugins.csv.CsvBasePlatformTestCase; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings; public class CsvIntentionTest extends CsvBasePlatformTestCase { diff --git a/src/test/java/net/seesharpsoft/intellij/plugins/csv/parser/CsvParsingTest.java b/src/test/java/net/seesharpsoft/intellij/plugins/csv/parser/CsvParsingTest.java index 3c2c9331..126debd8 100644 --- a/src/test/java/net/seesharpsoft/intellij/plugins/csv/parser/CsvParsingTest.java +++ b/src/test/java/net/seesharpsoft/intellij/plugins/csv/parser/CsvParsingTest.java @@ -1,9 +1,9 @@ package net.seesharpsoft.intellij.plugins.csv.parser; import com.intellij.testFramework.ParsingTestCase; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; import net.seesharpsoft.intellij.plugins.csv.CsvParserDefinition; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings; import static net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings.COMMENT_INDICATOR_DEFAULT; diff --git a/src/test/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvEditorSettingsProviderTest.java b/src/test/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvEditorSettingsProviderTest.java index fd89d848..6e58ec9b 100644 --- a/src/test/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvEditorSettingsProviderTest.java +++ b/src/test/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvEditorSettingsProviderTest.java @@ -2,8 +2,8 @@ import com.intellij.openapi.options.ConfigurationException; import net.seesharpsoft.intellij.plugins.csv.CsvBasePlatformTestCase; -import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter; -import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator; +import net.seesharpsoft.intellij.plugins.csv.components.CsvEscapeCharacter; +import net.seesharpsoft.intellij.plugins.csv.components.CsvValueSeparator; import java.awt.*;