1
1
package net .seesharpsoft .intellij .plugins .csv .editor .table ;
2
2
3
- import com .intellij .psi .PsiElement ;
4
- import com .intellij .psi .PsiFile ;
5
- import com .intellij .psi .PsiTreeAnyChangeAbstractAdapter ;
6
- import com .intellij .psi .PsiTreeChangeListener ;
3
+ import com .intellij .psi .*;
7
4
import com .intellij .psi .util .PsiTreeUtil ;
8
5
import net .seesharpsoft .intellij .plugins .csv .CsvEscapeCharacter ;
9
6
import net .seesharpsoft .intellij .plugins .csv .CsvHelper ;
@@ -25,10 +22,8 @@ public class CsvTableModelBase<T extends PsiFileHolder> implements CsvTableModel
25
22
private int myCachedColumnCount = -1 ;
26
23
private CsvEscapeCharacter myCachedEscapeCharacter ;
27
24
private Boolean myCachedHasErrors = null ;
28
-
29
25
private int myPointedRow = -1 ;
30
26
private PsiElement myPointedRecord = null ;
31
-
32
27
private final CsvPsiTreeUpdater myPsiTreeUpdater ;
33
28
34
29
private final PsiTreeChangeListener myPsiTreeChangeListener = new PsiTreeAnyChangeAbstractAdapter () {
@@ -42,18 +37,34 @@ public CsvTableModelBase(@NotNull T psiFileHolder) {
42
37
myPsiFileHolder = psiFileHolder ;
43
38
myPsiTreeUpdater = new CsvPsiTreeUpdater (psiFileHolder );
44
39
myPsiTreeUpdater .addCommitListener (() -> onPsiTreeChanged (getPsiFile ()));
45
- getPsiFile (). getManager (). addPsiTreeChangeListener (myPsiTreeChangeListener , myPsiFileHolder );
40
+ addPsiTreeChangeListener ();
46
41
}
47
42
48
43
public T getPsiFileHolder () {
49
44
return myPsiFileHolder ;
50
45
}
51
46
47
+ protected void addPsiTreeChangeListener () {
48
+ PsiFile psiFile = getPsiFile ();
49
+ if (psiFile == null ) return ;
50
+ PsiManager manager = psiFile .getManager ();
51
+ if (manager == null ) return ;
52
+ manager .addPsiTreeChangeListener (myPsiTreeChangeListener , myPsiFileHolder );
53
+ }
54
+
55
+ protected void removePsiTreeChangeListener () {
56
+ PsiFile psiFile = getPsiFile ();
57
+ if (psiFile == null ) return ;
58
+ PsiManager manager = psiFile .getManager ();
59
+ if (manager == null ) return ;
60
+ manager .removePsiTreeChangeListener (myPsiTreeChangeListener );
61
+ }
62
+
52
63
@ Override
53
64
public void dispose () {
54
65
CsvTableModel .super .dispose ();
55
- getPsiFile ().getManager ().removePsiTreeChangeListener (myPsiTreeChangeListener );
56
66
myPsiTreeUpdater .dispose ();
67
+ removePsiTreeChangeListener ();
57
68
}
58
69
59
70
private void onPsiTreeChanged (@ Nullable PsiFile file ) {
@@ -80,10 +91,9 @@ private void resetCachedValues() {
80
91
myCachedEscapeCharacter = null ;
81
92
}
82
93
83
- private PsiElement resetPointer () {
94
+ private void resetPointer () {
84
95
myPointedRecord = PsiTreeUtil .findChildOfType (getPsiFile (), CsvRecord .class );
85
96
myPointedRow = 0 ;
86
- return myPointedRecord ;
87
97
}
88
98
89
99
protected CsvPsiTreeUpdater getPsiTreeUpdater () {
@@ -104,9 +114,7 @@ public PsiElement getFieldAt(int row, int column) {
104
114
resetPointer ();
105
115
diffToCurrent = row ;
106
116
}
107
- // fail gracefully or not?!
108
117
if (myPointedRecord == null ) return null ;
109
- assert myPointedRecord != null ;
110
118
111
119
CsvRecord record = PsiHelper .getNthSiblingOfType (myPointedRecord , diffToCurrent , CsvRecord .class , myPointedRow > row );
112
120
if (record == null ) return null ;
@@ -176,14 +184,15 @@ public void setValueAt(String value, int rowIndex, int columnIndex, boolean comm
176
184
}
177
185
178
186
@ Override
179
- public String getValue (int rowIndex , int columnIndex ) {
187
+ public @ NotNull String getValue (int rowIndex , int columnIndex ) {
180
188
PsiElement field = getFieldAt (rowIndex , columnIndex );
181
189
return CsvHelper .getFieldValue (field , getEscapeCharacter ());
182
190
}
183
191
184
192
@ Override
185
193
public void addRow (int anchorRowIndex , boolean before ) {
186
194
CsvRecord row = PsiHelper .getNthChildOfType (getPsiFile (), anchorRowIndex , CsvRecord .class );
195
+ if (row == null ) return ;
187
196
getPsiTreeUpdater ().addRow (row , before );
188
197
getPsiTreeUpdater ().commit ();
189
198
}
0 commit comments