• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Camelcade / Perl5-IDEA / #525521537

19 May 2025 08:07AM UTC coverage: 82.163% (-0.04%) from 82.204%
#525521537

push

github

hurricup
Got rid of exposed private members and inner classes

8 of 10 new or added lines in 5 files covered. (80.0%)

75 existing lines in 11 files now uncovered.

30862 of 37562 relevant lines covered (82.16%)

0.82 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

59.6
/plugin/core/src/main/java/com/perl5/lang/perl/idea/intellilang/PerlInjectionMarkersTable.java
1
/*
2
 * Copyright 2015-2025 Alexandr Evstigneev
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 * http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16

17
package com.perl5.lang.perl.idea.intellilang;
18

19
import com.intellij.lang.Language;
20
import com.intellij.lang.html.HTMLLanguage;
21
import com.intellij.openapi.options.Configurable;
22
import com.intellij.openapi.project.Project;
23
import com.intellij.openapi.ui.ComboBoxTableRenderer;
24
import com.intellij.openapi.ui.VerticalFlowLayout;
25
import com.intellij.openapi.util.text.StringUtil;
26
import com.intellij.ui.TableUtil;
27
import com.intellij.ui.ToolbarDecorator;
28
import com.intellij.ui.table.JBTable;
29
import com.intellij.util.ArrayUtil;
30
import com.intellij.util.FileContentUtil;
31
import com.intellij.util.ui.ColumnInfo;
32
import com.intellij.util.ui.FormBuilder;
33
import com.intellij.util.ui.ListTableModel;
34
import com.perl5.PerlBundle;
35
import org.jetbrains.annotations.Nls;
36
import org.jetbrains.annotations.NotNull;
37
import org.jetbrains.annotations.Nullable;
38

39
import javax.swing.*;
40
import javax.swing.table.TableCellEditor;
41
import javax.swing.table.TableColumn;
42
import java.awt.event.MouseEvent;
43
import java.util.*;
44
import java.util.stream.Collectors;
45

46
final class PerlInjectionMarkersTable extends JBTable implements Configurable {
47
  private final @NotNull Project myProject;
48

49
  public PerlInjectionMarkersTable(@NotNull Project project) {
50
    super(new MyModel());
1✔
51
    myProject = project;
1✔
52

53
    final TableColumn languageColumn = getColumnModel().getColumn(1);
1✔
54

55
    List<String> languageIds = Language.getRegisteredLanguages().stream()
1✔
56
      .map(Language::getID)
1✔
57
      .filter(it -> !it.isEmpty())
1✔
58
      .sorted()
1✔
59
      .collect(Collectors.toList());
1✔
60
    ComboBoxTableRenderer<String> roleComboBoxTableRenderer =
1✔
61
      new ComboBoxTableRenderer<>(ArrayUtil.toStringArray(languageIds)) {
1✔
62
        @Override
63
        public boolean isCellEditable(EventObject event) {
64
          if (event instanceof MouseEvent mouseEvent) {
×
65
            return mouseEvent.getClickCount() >= 1;
×
66
          }
67

68
          return true;
×
69
        }
70
      };
71
    languageColumn.setCellRenderer(roleComboBoxTableRenderer);
1✔
72
    languageColumn.setCellEditor(roleComboBoxTableRenderer);
1✔
73
    getColumnModel().getColumn(0).setPreferredWidth(200);
1✔
74
    languageColumn.setPreferredWidth(600);
1✔
75
    setVisibleRowCount(18);
1✔
76
  }
1✔
77

78
  @Override
79
  public @Nls(capitalization = Nls.Capitalization.Title) String getDisplayName() {
80
    return PerlBundle.message("perl.settings.markers.label.text");
1✔
81
  }
82

83
  @Override
84
  public @NotNull JComponent createComponent() {
85
    JTextPane textPane = new JTextPane();
1✔
86
    textPane.setText(PerlBundle.message("perl.settings.markers.language.description"));
1✔
87
    JPanel panel = FormBuilder.createFormBuilder()
1✔
88
      .addComponent(textPane)
1✔
89
      .addComponent(
1✔
90
        ToolbarDecorator.createDecorator(this).setAddAction(action -> {
1✔
91
          final TableCellEditor cellEditor = getCellEditor();
×
92
          if (cellEditor != null) {
×
93
            cellEditor.stopCellEditing();
×
94
          }
NEW
95
            var model = getMyModel();
×
96

97
          int indexToEdit = -1;
×
98

99
          for (Item item : model.getItems()) {
×
100
            if (StringUtil.isEmpty(item.marker)) {
×
101
              indexToEdit = model.indexOf(item);
×
102
              break;
×
103
            }
104
          }
×
105

106
          if (indexToEdit == -1) {
×
107
            model.addRow(new Item("marker" + model.getItems().size(), HTMLLanguage.INSTANCE.getID()));
×
108
            indexToEdit = model.getRowCount() - 1;
×
109
          }
110

111
          TableUtil.editCellAt(this, indexToEdit, 0);
×
112
        })
×
113
          .disableDownAction()
1✔
114
          .disableUpAction()
1✔
115
          .createPanel()
1✔
116
      ).getPanel();
1✔
117
    panel.setLayout(new VerticalFlowLayout());
1✔
118
    return panel;
1✔
119
  }
120

121
  private MyModel getMyModel() {
122
    return (MyModel)super.getModel();
1✔
123
  }
124

125
  @Override
126
  public boolean isModified() {
127
    return !new HashSet<>(computeItems()).equals(new HashSet<>(getMyModel().getItems()));
1✔
128
  }
129

130
  private List<Item> computeItems() {
131
    return PerlInjectionMarkersService.getInstance(myProject).computeMergedMarkersMap().entrySet().stream()
1✔
132
      .filter(it -> Language.findLanguageByID(it.getValue()) != null)
1✔
133
      .map(it -> new Item(it.getKey(), it.getValue()))
1✔
134
      .collect(Collectors.toList());
1✔
135
  }
136

137
  @Override
138
  public void reset() {
139
    getMyModel().setItems(computeItems());
1✔
140
  }
1✔
141

142
  @Override
143
  public void apply() {
144
    if (!isModified()) {
1✔
145
      return;
1✔
146
    }
147

148
    Map<String, String> result = new HashMap<>();
×
NEW
149
    getMyModel().getItems().forEach(item -> result.putIfAbsent(item.marker, item.languageId));
×
150
    PerlInjectionMarkersService.getInstance(myProject).setCustomMarkersMap(result);
×
151
    FileContentUtil.reparseOpenedFiles();
×
152
  }
×
153

154
  private static class Item {
155
    @NotNull
156
    String marker;
157
    @NotNull
158
    String languageId;
159

160
    public Item(@NotNull Map.Entry<String, String> entry) {
161
      this(entry.getKey(), entry.getValue());
×
162
    }
×
163

164
    public Item(@NotNull String marker, @NotNull String languageId) {
1✔
165
      this.marker = marker;
1✔
166
      this.languageId = languageId;
1✔
167
    }
1✔
168

169
    @Override
170
    public boolean equals(Object o) {
171
      if (this == o) {
1✔
172
        return true;
×
173
      }
174
      if (o == null || getClass() != o.getClass()) {
1✔
175
        return false;
×
176
      }
177

178
      Item item = (Item)o;
1✔
179

180
      if (!marker.equals(item.marker)) {
1✔
181
        return false;
×
182
      }
183
      return languageId.equals(item.languageId);
1✔
184
    }
185

186
    @Override
187
    public int hashCode() {
188
      int result = marker.hashCode();
1✔
189
      result = 31 * result + languageId.hashCode();
1✔
190
      return result;
1✔
191
    }
192
  }
193

194
  private static class MyModel extends ListTableModel<Item> {
195
    public MyModel() {
196
      super(new MarkerColumnInfo(), new LanguageColumnInfo());
1✔
197
      setSortable(true);
1✔
198
    }
1✔
199
  }
200

201
  private static class MarkerColumnInfo extends ColumnInfo<Item, String> {
202
    public MarkerColumnInfo() {
203
      super(PerlBundle.message("perl.settings.markers.column.marker.title"));
1✔
204
    }
1✔
205

206
    @Override
207
    public @Nullable Comparator<Item> getComparator() {
208
      return Comparator.comparing(it -> it.marker);
1✔
209
    }
210

211
    @Override
212
    public boolean isCellEditable(Item item) {
213
      return true;
×
214
    }
215

216
    @Override
217
    public @Nullable String valueOf(Item item) {
218
      return item.marker;
×
219
    }
220

221
    @Override
222
    public void setValue(Item item, String value) {
223
      item.marker = value;
×
224
    }
×
225
  }
226

227
  private static class LanguageColumnInfo extends ColumnInfo<Item, String> {
228
    public LanguageColumnInfo() {
229
      super(PerlBundle.message("perl.settings.markers.column.language.title"));
1✔
230
    }
1✔
231

232
    @Override
233
    public boolean isCellEditable(Item item) {
234
      return true;
×
235
    }
236

237
    @Override
238
    public @Nullable Comparator<Item> getComparator() {
239
      return Comparator.comparing(this::valueOf);
×
240
    }
241

242
    @Override
243
    public void setValue(Item item, String value) {
244
      item.languageId = value;
×
245
    }
×
246

247
    @Override
248
    public @Nullable String valueOf(Item item) {
249
      Language language = Language.findLanguageByID(item.languageId);
×
250
      return language == null ?
×
251
             PerlBundle.message("perl.settings.markers.language.unsupported", item.languageId) :
×
252
             language.getDisplayName();
×
253
    }
254
  }
255
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc