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

Camelcade / Perl5-IDEA / #525521581

06 Jun 2025 08:26AM UTC coverage: 82.33% (-0.02%) from 82.354%
#525521581

push

github

hurricup
Moved debugger properties to the respective bundle

18 of 26 new or added lines in 8 files covered. (69.23%)

158 existing lines in 31 files now uncovered.

30858 of 37481 relevant lines covered (82.33%)

0.82 hits per line

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

58.62
/plugin/debugger/src/main/java/com/perl5/lang/perl/debugger/PerlDebuggerSettings.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.debugger;
18

19
import com.intellij.openapi.options.Configurable;
20
import com.intellij.openapi.options.SearchableConfigurable;
21
import com.intellij.openapi.ui.VerticalFlowLayout;
22
import com.intellij.openapi.util.text.StringUtil;
23
import com.intellij.ui.TableUtil;
24
import com.intellij.ui.ToolbarDecorator;
25
import com.intellij.ui.table.JBTable;
26
import com.intellij.util.containers.ContainerUtil;
27
import com.intellij.util.ui.ColumnInfo;
28
import com.intellij.util.ui.FormBuilder;
29
import com.intellij.util.ui.ListTableModel;
30
import com.intellij.util.xmlb.annotations.Attribute;
31
import com.intellij.util.xmlb.annotations.Tag;
32
import com.intellij.xdebugger.settings.DebuggerSettingsCategory;
33
import com.intellij.xdebugger.settings.XDebuggerSettings;
34
import org.jetbrains.annotations.Nls;
35
import org.jetbrains.annotations.NotNull;
36
import org.jetbrains.annotations.Nullable;
37
import org.jetbrains.annotations.TestOnly;
38

39
import javax.swing.*;
40
import javax.swing.table.TableCellEditor;
41
import java.util.*;
42

43
public class PerlDebuggerSettings extends XDebuggerSettings<PerlDebuggerSettings> {
44
  @Tag("dataRenderers")
1✔
45
  private List<Item> myDataRenderers = new ArrayList<>();
46

47
  public PerlDebuggerSettings() {
48
    super("perl5");
1✔
49
  }
1✔
50

51
  @Override
52
  public @NotNull Collection<? extends Configurable> createConfigurables(@NotNull DebuggerSettingsCategory category) {
53
    if (category == DebuggerSettingsCategory.DATA_VIEWS) {
1✔
54
      return Collections.singletonList(new DataViewsConfigurable());
1✔
55
    }
56
    return super.createConfigurables(category);
×
57
  }
58

59
  @Override
60
  public @Nullable PerlDebuggerSettings getState() {
61
    return this;
×
62
  }
63

64
  public List<Item> getDataRenderers() {
65
    return new ArrayList<>(ContainerUtil.map(myDataRenderers, Item::new));
1✔
66
  }
67

68
  @Override
69
  public void loadState(@NotNull PerlDebuggerSettings state) {
70
    myDataRenderers = new ArrayList<>(ContainerUtil.filter(state.myDataRenderers, Item::isValid));
×
71
  }
×
72

73
  @TestOnly
74
  public void setDataRenderers(@NotNull List<? extends Item> renderers) {
75
    myDataRenderers = new ArrayList<>(renderers);
1✔
76
  }
1✔
77

78
  public static @NotNull PerlDebuggerSettings getInstance() {
79
    return getInstance(PerlDebuggerSettings.class);
1✔
80
  }
81

82
  @Tag("entry")
83
  public static class Item {
84
    @Attribute("package")
85
    String namespaceName;
86
    @Attribute("expression")
87
    String renderExpression;
88

89
    public Item() {
×
90
    }
×
91

92
    public Item(@NotNull String namespaceName, @NotNull String renderExpression) {
1✔
93
      this.namespaceName = namespaceName;
1✔
94
      this.renderExpression = renderExpression;
1✔
95
    }
1✔
96

97
    public Item(Item copy) {
1✔
98
      this.namespaceName = copy.namespaceName;
1✔
99
      this.renderExpression = copy.renderExpression;
1✔
100
    }
1✔
101

102
    public boolean isValid() {
103
      return StringUtil.isNotEmpty(namespaceName) && StringUtil.isNotEmpty(renderExpression);
1✔
104
    }
105

106
    @Override
107
    public boolean equals(Object o) {
108
      if (this == o) {
1✔
109
        return true;
×
110
      }
111
      if (o == null || getClass() != o.getClass()) {
1✔
112
        return false;
×
113
      }
114

115
      Item item = (Item)o;
1✔
116

117
      if (!Objects.equals(namespaceName, item.namespaceName)) {
1✔
118
        return false;
×
119
      }
120
      return Objects.equals(renderExpression, item.renderExpression);
1✔
121
    }
122

123
    @Override
124
    public int hashCode() {
125
      int result = namespaceName != null ? namespaceName.hashCode() : 0;
×
126
      result = 31 * result + (renderExpression != null ? renderExpression.hashCode() : 0);
×
127
      return result;
×
128
    }
129
  }
130

131
  private static class MyModel extends ListTableModel<Item> {
132
    public MyModel() {
133
      super(new ClassColumnInfo(), new RendererColumnInfo());
1✔
134
      setSortable(true);
1✔
135
    }
1✔
136
  }
137

138
  private static class ClassColumnInfo extends ColumnInfo<Item, String> {
139
    public ClassColumnInfo() {
140
      super(PerlDebuggerBundle.message("perl.debugger.settings.class.column.title"));
1✔
141
    }
1✔
142

143
    @Override
144
    public @Nullable String valueOf(Item item) {
145
      return item.namespaceName;
×
146
    }
147

148
    @Override
149
    public void setValue(Item item, String value) {
150
      item.namespaceName = value;
×
151
    }
×
152

153
    @Override
154
    public boolean isCellEditable(Item item) {
155
      return true;
×
156
    }
157
  }
158

159
  private static class RendererColumnInfo extends ColumnInfo<Item, String> {
160
    public RendererColumnInfo() {
161
      super(PerlDebuggerBundle.message("perl.debugger.settings.renderer.column.title"));
1✔
162
    }
1✔
163

164
    @Override
165
    public @Nullable String valueOf(Item entry) {
166
      return entry.renderExpression;
×
167
    }
168

169
    @Override
170
    public void setValue(Item item, String value) {
171
      item.renderExpression = value;
×
172
    }
×
173

174
    @Override
175
    public boolean isCellEditable(Item item) {
176
      return true;
×
177
    }
178
  }
179

180
  private class DataViewsConfigurable extends JBTable implements SearchableConfigurable {
181
    public DataViewsConfigurable() {
1✔
182
      super(new MyModel());
1✔
183
    }
1✔
184

185
    @Override
186
    public @NotNull String getId() {
187
      return "perl5.debugger.type.renderers";
×
188
    }
189

190
    @Override
191
    public @Nls(capitalization = Nls.Capitalization.Title) String getDisplayName() {
NEW
192
      return PerlDebuggerBundle.message("perl.debugger.settings.type.renderers.title");
×
193
    }
194

195
    @Override
196
    public @Nullable JComponent createComponent() {
197
      JTextPane textPane = new JTextPane();
1✔
198
      textPane.setText(PerlDebuggerBundle.message("perl.debugger.settings.type.renderers.explanation"));
1✔
199
      JPanel panel = FormBuilder.createFormBuilder()
1✔
200
        .addComponent(textPane)
1✔
201
        .addComponent(ToolbarDecorator.createDecorator(this).setAddAction(action -> {
1✔
202
          final TableCellEditor cellEditor = getCellEditor();
×
203
          if (cellEditor != null) {
×
204
            cellEditor.stopCellEditing();
×
205
          }
206
          MyModel model = getModel();
×
207

208
          int indexToEdit = -1;
×
209

210
          for (Item item : model.getItems()) {
×
211
            if (StringUtil.isEmpty(item.namespaceName)) {
×
212
              indexToEdit = model.indexOf(item);
×
213
              break;
×
214
            }
215
          }
×
216

217
          if (indexToEdit == -1) {
×
218
            model.addRow(new Item("Foo::Bar", "$it->to_string()"));
×
219
            indexToEdit = model.getRowCount() - 1;
×
220
          }
221

222
          TableUtil.editCellAt(this, indexToEdit, 0);
×
223
        }).createPanel())
1✔
224
        .getPanel();
1✔
225
      panel.setLayout(new VerticalFlowLayout());
1✔
226

227
      getColumnModel().getColumn(0).setPreferredWidth(200);
1✔
228
      getColumnModel().getColumn(1).setPreferredWidth(600);
1✔
229

230
      return panel;
1✔
231
    }
232

233
    @Override
234
    public boolean isModified() {
235
      return !myDataRenderers.equals(getModelState());
1✔
236
    }
237

238
    @Override
239
    public void apply() {
240
      myDataRenderers = new ArrayList<>(ContainerUtil.map(getModelState(), Item::new));
1✔
241
    }
1✔
242

243
    private List<Item> getModelState() {
244
      return new ArrayList<>(ContainerUtil.filter(getModel().getItems(), Item::isValid));
1✔
245
    }
246

247
    @Override
248
    public MyModel getModel() {
249
      return (MyModel)super.getModel();
1✔
250
    }
251

252
    @Override
253
    public void reset() {
254
      getModel().setItems(getDataRenderers());
1✔
255
    }
1✔
256
  }
257
}
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