Skip to content

Commit 36ba098

Browse files
committed
Fix PSI access threading issues in CsvTableModelSwing
1 parent 6c18d0d commit 36ba098

1 file changed

Lines changed: 13 additions & 18 deletions

File tree

src/main/java/net/seesharpsoft/intellij/plugins/csv/editor/table/swing/CsvTableModelSwing.java

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

33
import com.intellij.openapi.application.ApplicationManager;
4+
import com.intellij.openapi.util.Computable;
45
import com.intellij.psi.PsiElement;
56
import net.seesharpsoft.intellij.plugins.csv.CsvHelper;
67
import net.seesharpsoft.intellij.plugins.csv.editor.table.CsvTableEditor;
@@ -25,12 +26,9 @@
2526

2627
public class CsvTableModelSwing extends CsvTableModelBase<CsvTableEditor> implements TableModel {
2728

28-
/**
29-
* List of listeners
30-
*/
3129
protected EventListenerList listenerList = new EventListenerList();
3230

33-
protected ScheduledFuture delayedUpdate;
31+
protected ScheduledFuture<?> delayedUpdate;
3432

3533
protected ScheduledExecutorService executorService;
3634

@@ -64,10 +62,7 @@ private void doNotifyUpdate() {
6462
}
6563

6664
protected void fireTableChanged(TableModelEvent e) {
67-
// Guaranteed to return a non-null array
6865
Object[] listeners = listenerList.getListenerList();
69-
// Process the listeners last to first, notifying
70-
// those that are interested in this event
7166
for (int i = listeners.length - 2; i >= 0; i -= 2) {
7267
if (listeners[i] == TableModelListener.class) {
7368
((TableModelListener) listeners[i + 1]).tableChanged(e);
@@ -97,17 +92,17 @@ public void removeTableModelListener(TableModelListener l) {
9792

9893
@Override
9994
public String getColumnName(int column) {
100-
PsiElement headerField = PsiHelper.findFirst(getPsiFile(), CsvTypes.FIELD);
101-
if (headerField != null) {
102-
headerField = PsiHelper.getNextNthSiblingOfType(headerField, column, CsvField.class);
103-
}
104-
String headerText = headerField == null ? "" : CsvHelper.unquoteCsvValue(headerField.getText(), getEscapeCharacter()).trim();
105-
106-
Map<String, Object> params = new HashMap<>();
107-
params.put("header", headerText);
108-
params.put("index", CsvEditorSettings.getInstance().isZeroBasedColumnNumbering() ? column : column + 1);
109-
110-
return CsvHelper.formatString("${header} (${index})", params);
95+
return ApplicationManager.getApplication().runReadAction((Computable<String>) () -> {
96+
PsiElement headerField = PsiHelper.findFirst(getPsiFile(), CsvTypes.FIELD);
97+
if (headerField != null) {
98+
headerField = PsiHelper.getNextNthSiblingOfType(headerField, column, CsvField.class);
99+
}
100+
String headerText = headerField == null ? "" : CsvHelper.unquoteCsvValue(headerField.getText(), getEscapeCharacter()).trim();
101+
Map<String, Object> params = new HashMap<>();
102+
params.put("header", headerText);
103+
params.put("index", CsvEditorSettings.getInstance().isZeroBasedColumnNumbering() ? column : column + 1);
104+
return CsvHelper.formatString("${header} (${index})", params);
105+
});
111106
}
112107

113108
@Override

0 commit comments

Comments
 (0)