Skip to content

Commit 91851ed

Browse files
author
Sommer
committed
[INTERNAL] support for PSV files incl file based separator fixes
1 parent 619f486 commit 91851ed

File tree

14 files changed

+150
-31
lines changed

14 files changed

+150
-31
lines changed

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

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

3+
import com.intellij.openapi.project.Project;
34
import com.intellij.openapi.util.Key;
4-
import com.intellij.psi.PsiFile;
5+
import com.intellij.openapi.vfs.VirtualFile;
56
import com.intellij.util.PathUtil;
67
import org.jetbrains.annotations.NotNull;
78

@@ -12,13 +13,13 @@ public final class CsvStorageHelper {
1213

1314
public static final Key<String> RELATIVE_FILE_URL = Key.create("CSV_PLUGIN_RELATIVE_URL");
1415

15-
public static String getRelativeFileUrl(@NotNull PsiFile psiFile) {
16-
String url = psiFile.getUserData(RELATIVE_FILE_URL);
16+
public static String getRelativeFileUrl(@NotNull Project project, @NotNull VirtualFile virtualFile) {
17+
String url = virtualFile.getUserData(RELATIVE_FILE_URL);
1718
if (url == null) {
18-
String projectDir = PathUtil.getLocalPath(psiFile.getProject().getBasePath());
19-
url = PathUtil.getLocalPath(psiFile.getOriginalFile().getVirtualFile().getPath())
19+
String projectDir = PathUtil.getLocalPath(project.getBasePath());
20+
url = PathUtil.getLocalPath(virtualFile.getPath())
2021
.replaceFirst("^" + Pattern.quote(projectDir), "");
21-
psiFile.putUserData(RELATIVE_FILE_URL, url);
22+
virtualFile.putUserData(RELATIVE_FILE_URL, url);
2223
}
2324
return url;
2425
}

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.intellij.openapi.components.PersistentStateComponent;
44
import com.intellij.openapi.components.State;
55
import com.intellij.openapi.components.Storage;
6+
import com.intellij.openapi.project.Project;
7+
import com.intellij.openapi.vfs.VirtualFile;
68
import com.intellij.psi.PsiFile;
79
import com.intellij.util.xmlb.XmlSerializerUtil;
810
import net.seesharpsoft.intellij.plugins.csv.CsvStorageHelper;
@@ -37,7 +39,11 @@ public void loadState(@NotNull CsvFileAttributes state) {
3739
}
3840

3941
protected String generateMapKey(@NotNull PsiFile psiFile) {
40-
return CsvStorageHelper.getRelativeFileUrl(psiFile);
42+
return generateMapKey(psiFile.getProject(), psiFile.getOriginalFile().getVirtualFile());
43+
}
44+
45+
protected String generateMapKey(@NotNull Project project, @NotNull VirtualFile virtualFile) {
46+
return CsvStorageHelper.getRelativeFileUrl(project, virtualFile);
4147
}
4248

4349
public void setFileSeparator(@NotNull PsiFile psiFile, @NotNull String separator) {
@@ -53,11 +59,15 @@ public void removeFileSeparator(@NotNull PsiFile psiFile) {
5359
attributeMap.remove(generateMapKey(psiFile));
5460
}
5561

56-
public String getFileSeparator(@NotNull PsiFile psiFile) {
57-
Attribute state = attributeMap.get(generateMapKey(psiFile));
62+
public String getFileSeparator(@NotNull Project project, @NotNull VirtualFile virtualFile) {
63+
Attribute state = attributeMap.get(generateMapKey(project, virtualFile));
5864
if (state != null) {
5965
return state.separator;
6066
}
6167
return null;
6268
}
69+
70+
public String getFileSeparator(@NotNull PsiFile psiFile) {
71+
return getFileSeparator(psiFile.getProject(), psiFile.getOriginalFile().getVirtualFile());
72+
}
6373
}

src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/CsvAnnotator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ protected boolean handleSeparatorElement(@NotNull PsiElement element, @NotNull A
8282
if (elementType == CsvTypes.COMMA) {
8383
TextAttributes textAttributes = holder.getCurrentAnnotationSession().getUserData(TAB_SEPARATOR_HIGHLIGHT_COLOR_KEY);
8484
if (!Boolean.TRUE.equals(holder.getCurrentAnnotationSession().getUserData(TAB_SEPARATOR_HIGHLIGHT_COLOR_DETERMINED_KEY))) {
85-
String separator = CsvCodeStyleSettings.getCurrentSeparator(csvFile.getProject(), csvFile.getLanguage());
85+
String separator = CsvCodeStyleSettings.getCurrentSeparator(csvFile);
8686
if (CsvEditorSettingsExternalizable.getInstance().isHighlightTabSeparator() && separator.equals(CsvCodeStyleSettings.TAB_SEPARATOR)) {
8787
textAttributes = new TextAttributes(null,
8888
CsvEditorSettingsExternalizable.getInstance().getTabHighlightColor(),

src/main/java/net/seesharpsoft/intellij/plugins/csv/highlighter/CsvSyntaxHighlighter.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
package net.seesharpsoft.intellij.plugins.csv.highlighter;
22

3-
import com.intellij.lang.Language;
43
import com.intellij.lexer.Lexer;
54
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
65
import com.intellij.openapi.editor.HighlighterColors;
76
import com.intellij.openapi.editor.colors.TextAttributesKey;
8-
import com.intellij.openapi.fileTypes.LanguageFileType;
97
import com.intellij.openapi.fileTypes.SyntaxHighlighterBase;
108
import com.intellij.openapi.project.Project;
119
import com.intellij.openapi.vfs.VirtualFile;
@@ -38,19 +36,17 @@ public class CsvSyntaxHighlighter extends SyntaxHighlighterBase {
3836
private static final TextAttributesKey[] EMPTY_KEYS = new TextAttributesKey[0];
3937

4038
private Project myProject;
41-
private Language myLanguage;
39+
private VirtualFile myVirtualFile;
4240

4341
public CsvSyntaxHighlighter(Project project, VirtualFile virtualFile) {
4442
this.myProject = project;
45-
if (virtualFile != null && virtualFile.getFileType() instanceof LanguageFileType) {
46-
this.myLanguage = ((LanguageFileType)virtualFile.getFileType()).getLanguage();
47-
}
43+
this.myVirtualFile = virtualFile;
4844
}
4945

5046
@NotNull
5147
@Override
5248
public Lexer getHighlightingLexer() {
53-
return new CsvLexerAdapter(CsvCodeStyleSettings.getCurrentSeparator(this.myProject, this.myLanguage));
49+
return new CsvLexerAdapter(CsvCodeStyleSettings.getCurrentSeparator(this.myProject, this.myVirtualFile));
5450
}
5551

5652
@NotNull

src/main/java/net/seesharpsoft/intellij/plugins/csv/inspection/CsvValidationInspection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descri
148148
try {
149149
PsiElement element = descriptor.getPsiElement();
150150
Document document = PsiDocumentManager.getInstance(project).getDocument(element.getContainingFile());
151-
String separator = CsvCodeStyleSettings.getCurrentSeparator(element.getProject(), element.getContainingFile().getLanguage());
151+
String separator = CsvCodeStyleSettings.getCurrentSeparator(element.getContainingFile());
152152
String text = document.getText();
153153
document.setText(text.substring(0, element.getTextOffset()) + separator + text.substring(element.getTextOffset()));
154154
} catch (IncorrectOperationException e) {

src/main/java/net/seesharpsoft/intellij/plugins/csv/intention/CsvShiftColumnIntentionAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ protected static void changeLeftAndRightColumnOrder(@NotNull Project project,
2525
CsvColumnInfo<PsiElement> rightColumnInfo) {
2626
Document document = PsiDocumentManager.getInstance(project).getDocument(csvFile);
2727
document.setText(
28-
changeLeftAndRightColumnOrder(document.getText(), CsvCodeStyleSettings.getCurrentSeparator(project, csvFile.getLanguage()), leftColumnInfo, rightColumnInfo)
28+
changeLeftAndRightColumnOrder(document.getText(), CsvCodeStyleSettings.getCurrentSeparator(csvFile), leftColumnInfo, rightColumnInfo)
2929
);
3030
}
3131

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

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import com.intellij.lang.Language;
44
import com.intellij.openapi.application.ApplicationManager;
55
import com.intellij.openapi.components.ServiceManager;
6+
import com.intellij.openapi.fileTypes.LanguageFileType;
67
import com.intellij.openapi.project.Project;
8+
import com.intellij.openapi.vfs.VirtualFile;
79
import com.intellij.psi.PsiFile;
810
import com.intellij.psi.codeStyle.CodeStyleSettings;
911
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
@@ -31,8 +33,9 @@ public class CsvCodeStyleSettings extends CustomCodeStyleSettings {
3133

3234
public static final String DEFAULT_SEPARATOR = ",";
3335
public static final String TAB_SEPARATOR = "\t";
34-
public static final String[] SUPPORTED_SEPARATORS = new String[]{",", ";", "|", TAB_SEPARATOR};
35-
public static final String[] SUPPORTED_SEPARATORS_DISPLAY = new String[]{"Comma (,)", "Semicolon (;)", "Pipe (|)", "Tab (↹)"};
36+
public static final String PIPE_SEPARATOR = "|";
37+
public static final String[] SUPPORTED_SEPARATORS = new String[] {",", ";", PIPE_SEPARATOR, TAB_SEPARATOR};
38+
public static final String[] SUPPORTED_SEPARATORS_DISPLAY = new String[] {"Comma (,)", "Semicolon (;)", "Pipe (|)", "Tab (↹)"};
3639
public static final Pattern REPLACE_DEFAULT_SEPARATOR_PATTERN = Pattern.compile(CsvCodeStyleSettings.DEFAULT_SEPARATOR);
3740

3841
public static String getCurrentSeparator(CodeStyleSettings codeStyleSettings) {
@@ -45,28 +48,34 @@ public static String getCurrentSeparator(CodeStyleSettings codeStyleSettings) {
4548
return DEFAULT_SEPARATOR;
4649
}
4750

48-
public static String getCurrentSeparator(@Nullable Project project) {
51+
private static String getCurrentSeparator(@Nullable Project project) {
4952
if (!ApplicationManager.getApplication().isUnitTestMode() && project != null) {
5053
return getCurrentSeparator(CodeStyleSettingsManager.getInstance(project).getCurrentSettings());
5154
}
5255
return DEFAULT_SEPARATOR;
5356
}
5457

55-
public static String getCurrentSeparator(@Nullable Project project, @Nullable Language language) {
58+
private static String getCurrentSeparator(@Nullable Project project, @Nullable Language language) {
5659
if (language != null && language instanceof CsvSeparatorHolder) {
57-
return ((CsvSeparatorHolder)language).getSeparator();
60+
return ((CsvSeparatorHolder) language).getSeparator();
5861
}
5962
return getCurrentSeparator(project);
6063
}
6164

62-
public static String getCurrentSeparator(@Nullable PsiFile psiFile) {
63-
if (psiFile == null) {
64-
return getCurrentSeparator((Project)null);
65+
public static String getCurrentSeparator(@Nullable Project project, @Nullable VirtualFile virtualFile) {
66+
if (virtualFile == null) {
67+
return getCurrentSeparator((Project) null);
6568
}
66-
Project project = psiFile.getProject();
6769
CsvFileAttributes csvFileAttributes = project != null ? ServiceManager.getService(project, CsvFileAttributes.class) : null;
68-
String separator = csvFileAttributes != null ? csvFileAttributes.getFileSeparator(psiFile) : null;
69-
return separator != null ? separator : getCurrentSeparator(project, psiFile.getLanguage());
70+
String separator = csvFileAttributes != null ? csvFileAttributes.getFileSeparator(project, virtualFile) : null;
71+
return separator != null ? separator :
72+
virtualFile.getFileType() instanceof LanguageFileType ?
73+
getCurrentSeparator(project, ((LanguageFileType) virtualFile.getFileType()).getLanguage()) :
74+
getCurrentSeparator(project);
75+
}
76+
77+
public static String getCurrentSeparator(@Nullable PsiFile psiFile) {
78+
return getCurrentSeparator(psiFile.getProject(), psiFile.getOriginalFile().getVirtualFile());
7079
}
7180

7281
public static String getSeparatorDisplayText(String separator) {
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package net.seesharpsoft.intellij.plugins.psv;
2+
3+
import com.intellij.openapi.fileTypes.LanguageFileType;
4+
import com.intellij.openapi.util.IconLoader;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.jetbrains.annotations.Nullable;
7+
8+
import javax.swing.*;
9+
10+
public final class PsvFileType extends LanguageFileType {
11+
public static final PsvFileType INSTANCE = new PsvFileType();
12+
13+
public static final Icon ICON = IconLoader.getIcon("/media/icons/psv-icon.png");
14+
15+
private PsvFileType() {
16+
super(PsvLanguage.INSTANCE);
17+
}
18+
19+
@NotNull
20+
@Override
21+
public String getName() {
22+
return "PSV";
23+
}
24+
25+
@NotNull
26+
@Override
27+
public String getDescription() {
28+
return "PSV file";
29+
}
30+
31+
@NotNull
32+
@Override
33+
public String getDefaultExtension() {
34+
return "psv";
35+
}
36+
37+
@Nullable
38+
@Override
39+
public Icon getIcon() {
40+
return ICON;
41+
}
42+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package net.seesharpsoft.intellij.plugins.psv;
2+
3+
import com.intellij.openapi.fileTypes.FileTypeConsumer;
4+
import com.intellij.openapi.fileTypes.FileTypeFactory;
5+
import org.jetbrains.annotations.NotNull;
6+
7+
public class PsvFileTypeFactory extends FileTypeFactory {
8+
@Override
9+
public void createFileTypes(@NotNull FileTypeConsumer fileTypeConsumer) {
10+
fileTypeConsumer.consume(PsvFileType.INSTANCE, String.join(FileTypeConsumer.EXTENSION_DELIMITER, new String[]{"psv"}));
11+
}
12+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package net.seesharpsoft.intellij.plugins.psv;
2+
3+
import com.intellij.lang.Language;
4+
import net.seesharpsoft.intellij.plugins.csv.CsvLanguage;
5+
import net.seesharpsoft.intellij.plugins.csv.CsvSeparatorHolder;
6+
import net.seesharpsoft.intellij.plugins.csv.settings.CsvCodeStyleSettings;
7+
8+
public final class PsvLanguage extends Language implements CsvSeparatorHolder {
9+
public static final PsvLanguage INSTANCE = new PsvLanguage();
10+
11+
private PsvLanguage() {
12+
super(CsvLanguage.INSTANCE, "psv");
13+
}
14+
15+
@Override
16+
public String getDisplayName() {
17+
return "PSV";
18+
}
19+
20+
@Override
21+
public String getSeparator() {
22+
return CsvCodeStyleSettings.PIPE_SEPARATOR;
23+
}
24+
}

0 commit comments

Comments
 (0)