Skip to content

Commit 85b2ae0

Browse files
authored
Merge pull request #225 from SeeSharpSoft/fb_separator_change
[FIX] handle separator in EditorSettings correct & refresh CsvFile
2 parents ed66a79 + ea0ea02 commit 85b2ae0

File tree

4 files changed

+93
-11
lines changed

4 files changed

+93
-11
lines changed

src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvValueSeparator.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package net.seesharpsoft.intellij.plugins.csv;
22

3+
import com.intellij.util.xmlb.Converter;
4+
5+
import java.util.Objects;
36
import java.util.regex.Pattern;
47

58
public class CsvValueSeparator {
@@ -17,34 +20,61 @@ public class CsvValueSeparator {
1720
public static final CsvValueSeparator TAB = new CsvValueSeparator("\t", "Tab (↹)", "TAB");
1821
public static final CsvValueSeparator COLON = new CsvValueSeparator(":", "Colon (:)", "COLON");
1922

20-
public static CsvValueSeparator create(String name, String character) {
23+
public static CsvValueSeparator getDefaultValueSeparator(String name) {
2124
if (name != null) {
2225
switch (name) {
2326
case "COMMA":
27+
case ",":
2428
return COMMA;
2529
case "SEMICOLON":
30+
case ";":
2631
return SEMICOLON;
2732
case "PIPE":
33+
case "|":
2834
return PIPE;
2935
case "TAB":
36+
case "\t":
3037
return TAB;
3138
case "COLON":
39+
case ":":
3240
return COLON;
3341
default:
3442
break;
3543
}
3644
}
45+
return null;
46+
}
47+
48+
public static CsvValueSeparator create(String name, String character) {
49+
CsvValueSeparator defaultValueSeparator = getDefaultValueSeparator(name);
50+
if (defaultValueSeparator != null) {
51+
return defaultValueSeparator;
52+
}
3753
return create(character);
3854
}
3955

4056
public static CsvValueSeparator create(String character) {
57+
if (character == null) {
58+
return null;
59+
}
4160
return new CsvValueSeparator(character);
4261
}
4362

4463
public static CsvValueSeparator[] values() {
4564
return new CsvValueSeparator[]{COMMA, SEMICOLON, PIPE, TAB, COLON};
4665
}
4766

67+
public static class CsvValueSeparatorConverter extends Converter<CsvValueSeparator> {
68+
public CsvValueSeparator fromString(String value) {
69+
int index = value.indexOf("@");
70+
return index == -1 ? CsvValueSeparator.create(value, value) : CsvValueSeparator.create(value.substring(0, index), value.substring(index + 1));
71+
}
72+
73+
public String toString(CsvValueSeparator value) {
74+
return value.getName() + "@" + value.getCharacter();
75+
}
76+
}
77+
4878
public CsvValueSeparator(String myCharacter) {
4979
this(myCharacter, CUSTOM_DISPLAY + " (" + myCharacter + ")", CUSTOM_NAME);
5080
}
@@ -75,4 +105,23 @@ public String getName() {
75105
public boolean isCustom() {
76106
return CUSTOM_NAME.equals(getName());
77107
}
108+
109+
@Override
110+
public int hashCode() {
111+
return Objects.hash(getCharacter(), isCustom());
112+
}
113+
114+
@Override
115+
public boolean equals(Object obj) {
116+
if (obj == null || !(obj instanceof CsvValueSeparator)) {
117+
return false;
118+
}
119+
CsvValueSeparator otherObj = (CsvValueSeparator)obj;
120+
return Objects.equals(otherObj.getCharacter(), this.getCharacter()) && Objects.equals(otherObj.isCustom(), this.isCustom());
121+
}
122+
123+
@Override
124+
public String toString() {
125+
return getDisplay();
126+
}
78127
}

src/main/java/net/seesharpsoft/intellij/plugins/csv/components/CsvFileAttributes.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
import com.intellij.openapi.vfs.VirtualFile;
1111
import com.intellij.psi.PsiFile;
1212
import com.intellij.util.xmlb.XmlSerializerUtil;
13+
import com.intellij.util.xmlb.annotations.OptionTag;
1314
import net.seesharpsoft.intellij.plugins.csv.*;
1415
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;
1516
import org.jetbrains.annotations.NotNull;
1617
import org.jetbrains.annotations.Nullable;
1718

18-
import java.util.Arrays;
1919
import java.util.HashMap;
2020
import java.util.Map;
2121

@@ -29,8 +29,9 @@ public class CsvFileAttributes implements PersistentStateComponent<CsvFileAttrib
2929
public Map<String, Attribute> attributeMap = new HashMap<>();
3030

3131
static class Attribute {
32-
public String separator;
33-
public String valueSeparator;
32+
// holds the actual separator character
33+
@OptionTag(converter = CsvValueSeparator.CsvValueSeparatorConverter.class)
34+
public CsvValueSeparator separator;
3435
public CsvEscapeCharacter escapeCharacter;
3536
}
3637

@@ -91,8 +92,7 @@ public void setFileSeparator(@NotNull PsiFile psiFile, @NotNull CsvValueSeparato
9192
return;
9293
}
9394
Attribute attribute = getFileAttribute(psiFile.getProject(), psiFile.getOriginalFile().getVirtualFile(), true);
94-
attribute.valueSeparator = separator.getName();
95-
attribute.separator = separator.getCharacter();
95+
attribute.separator = separator;
9696
}
9797

9898
public void resetValueSeparator(@NotNull PsiFile psiFile) {
@@ -101,7 +101,7 @@ public void resetValueSeparator(@NotNull PsiFile psiFile) {
101101
}
102102
Attribute attribute = getFileAttribute(psiFile.getProject(), psiFile.getOriginalFile().getVirtualFile());
103103
if (attribute != null) {
104-
attribute.valueSeparator = null;
104+
attribute.separator = null;
105105
}
106106
}
107107

@@ -115,14 +115,14 @@ CsvValueSeparator getValueSeparator(Project project, VirtualFile virtualFile) {
115115
return ((CsvSeparatorHolder) language).getSeparator();
116116
}
117117
Attribute attribute = getFileAttribute(project, virtualFile);
118-
return attribute == null || attribute.valueSeparator == null ?
118+
return attribute == null || attribute.separator == null ?
119119
CsvEditorSettings.getInstance().getDefaultValueSeparator() :
120-
CsvValueSeparator.create(attribute.valueSeparator, attribute.separator);
120+
attribute.separator;
121121
}
122122

123123
public boolean hasValueSeparatorAttribute(@NotNull Project project, @NotNull VirtualFile virtualFile) {
124124
Attribute attribute = getFileAttribute(project, virtualFile);
125-
return attribute != null && attribute.valueSeparator != null;
125+
return attribute != null && attribute.separator != null;
126126
}
127127

128128
public void setEscapeCharacter(@NotNull PsiFile psiFile, @NotNull CsvEscapeCharacter escapeCharacter) {

src/main/java/net/seesharpsoft/intellij/plugins/csv/psi/CsvFile.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,41 @@
55
import com.intellij.openapi.fileTypes.LanguageFileType;
66
import com.intellij.psi.FileViewProvider;
77
import com.intellij.psi.PsiElement;
8+
import com.intellij.util.FileContentUtilCore;
89
import net.seesharpsoft.intellij.plugins.csv.CsvColumnInfoMap;
910
import net.seesharpsoft.intellij.plugins.csv.CsvHelper;
11+
import net.seesharpsoft.intellij.plugins.csv.settings.CsvEditorSettings;
1012
import org.jetbrains.annotations.NotNull;
1113

1214
import javax.swing.*;
15+
import java.beans.PropertyChangeEvent;
16+
import java.beans.PropertyChangeListener;
1317

1418
public class CsvFile extends PsiFileBase {
19+
1520
private final LanguageFileType myFileType;
1621
private CsvColumnInfoMap<PsiElement> myColumnInfoMap;
1722
private long myColumnInfoMapModifiedStamp;
1823

24+
private class CsvEditorSettingsPropertyChangeListener implements PropertyChangeListener{
25+
@Override
26+
public void propertyChange(PropertyChangeEvent evt) {
27+
switch (evt.getPropertyName()) {
28+
case "defaultEscapeCharacter":
29+
case "defaultValueSeparator":
30+
FileContentUtilCore.reparseFiles(CsvFile.this.getVirtualFile());
31+
break;
32+
default:
33+
// does not influence file
34+
break;
35+
}
36+
}
37+
}
38+
1939
public CsvFile(@NotNull FileViewProvider viewProvider, LanguageFileType fileType) {
2040
super(viewProvider, fileType.getLanguage());
2141
myFileType = fileType;
42+
CsvEditorSettings.getInstance().addPropertyChangeListener(new CsvEditorSettingsPropertyChangeListener());
2243
}
2344

2445
public CsvColumnInfoMap<PsiElement> getColumnInfoMap() {

src/main/java/net/seesharpsoft/intellij/plugins/csv/settings/CsvEditorSettings.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.intellij.openapi.components.State;
66
import com.intellij.openapi.components.Storage;
77
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
8+
import com.intellij.util.xmlb.annotations.OptionTag;
89
import net.seesharpsoft.intellij.plugins.csv.CsvEscapeCharacter;
910
import net.seesharpsoft.intellij.plugins.csv.CsvStorageHelper;
1011
import net.seesharpsoft.intellij.plugins.csv.CsvValueSeparator;
@@ -13,6 +14,7 @@
1314
import java.awt.*;
1415
import java.beans.PropertyChangeListener;
1516
import java.beans.PropertyChangeSupport;
17+
import java.util.Objects;
1618

1719
@State(
1820
name = "CsvEditorSettings",
@@ -57,6 +59,7 @@ public static final class OptionSet {
5759
public boolean QUOTING_ENFORCED = false;
5860
public boolean FILE_END_LINE_BREAK = true;
5961
public CsvEscapeCharacter DEFAULT_ESCAPE_CHARACTER = ESCAPE_CHARACTER_DEFAULT;
62+
@OptionTag(converter = CsvValueSeparator.CsvValueSeparatorConverter.class)
6063
public CsvValueSeparator DEFAULT_VALUE_SEPARATOR = VALUE_SEPARATOR_DEFAULT;
6164
public boolean KEEP_TRAILING_SPACES = false;
6265

@@ -235,19 +238,28 @@ public void setTableAutoColumnWidthOnOpen(boolean tableAutoColumnWidthOnOpen) {
235238
}
236239

237240
public void setDefaultEscapeCharacter(CsvEscapeCharacter defaultEscapeCharacter) {
241+
CsvEscapeCharacter oldValue = getDefaultEscapeCharacter();
238242
getState().DEFAULT_ESCAPE_CHARACTER = defaultEscapeCharacter;
243+
if (!Objects.equals(oldValue, defaultEscapeCharacter)) {
244+
myPropertyChangeSupport.firePropertyChange("defaultEscapeCharacter", oldValue, defaultEscapeCharacter);
245+
}
239246
}
240247

241248
public CsvEscapeCharacter getDefaultEscapeCharacter() {
242249
return getState().DEFAULT_ESCAPE_CHARACTER;
243250
}
244251

245252
public void setDefaultValueSeparator(CsvValueSeparator defaultValueSeparator) {
253+
CsvValueSeparator oldValue = getDefaultValueSeparator();
246254
getState().DEFAULT_VALUE_SEPARATOR = defaultValueSeparator;
255+
if (!Objects.equals(oldValue, defaultValueSeparator)) {
256+
myPropertyChangeSupport.firePropertyChange("defaultValueSeparator", oldValue, defaultValueSeparator);
257+
}
247258
}
248259

249260
public CsvValueSeparator getDefaultValueSeparator() {
250-
return getState().DEFAULT_VALUE_SEPARATOR;
261+
CsvValueSeparator csvValueSeparator = getState().DEFAULT_VALUE_SEPARATOR;
262+
return csvValueSeparator == null ? VALUE_SEPARATOR_DEFAULT : csvValueSeparator;
251263
}
252264

253265
public void setKeepTrailingSpaces(boolean keepTrailingSpaces) {

0 commit comments

Comments
 (0)