Skip to content

Commit 6bec316

Browse files
committed
Add option to create a filter from a log line
1 parent cca49d1 commit 6bec316

File tree

6 files changed

+128
-29
lines changed

6 files changed

+128
-29
lines changed

src/main/java/com/tibagni/logviewer/LogViewer.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public interface Presenter {
4949
void init();
5050
void addFilter(String group, Filter newFilter);
5151
String addGroup(String group);
52+
List<String> getGroups();
5253
void removeFilters(String group, int[] indices);
5354
void reorderFilters(String group, int orig, int dest);
5455
int getNextFilteredLogForFilter(Filter filter, int firstLogIndexSearch);

src/main/java/com/tibagni/logviewer/LogViewerPresenter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ public String addGroup(String group) {
110110
return null;
111111
}
112112

113+
@Override
114+
public List<String> getGroups() {
115+
return new ArrayList<>(filters.keySet());
116+
}
117+
113118
@Override
114119
public void removeFilters(String group, int[] indices) {
115120
// Iterate backwards otherwise the indices will change

src/main/java/com/tibagni/logviewer/LogViewerView.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.tibagni.logviewer.view.Toast;
1919

2020
import javax.swing.*;
21+
import javax.swing.border.EmptyBorder;
2122
import javax.swing.filechooser.FileNameExtensionFilter;
2223
import java.awt.*;
2324
import java.awt.event.*;
@@ -95,6 +96,7 @@ public void onDefaultLogsPathChanged() {
9596

9697
logList.setDefaultRenderer(LogEntry.class, logRenderer);
9798
filteredLogList.setDefaultRenderer(LogEntry.class, logRenderer);
99+
setupLogsContextActions();
98100
setupFilteredLogsContextActions();
99101

100102
// Configure file drop
@@ -290,7 +292,7 @@ public void onFiltersApplied() {
290292
public void onEditFilter(Filter filter) {
291293
// The filter is automatically updated by this dialog. We only check the result
292294
// to determine if the dialog was canceled or not
293-
Filter edited = EditFilterDialog.showEditFilterDialog(parent, parent, filter);
295+
Filter edited = EditFilterDialog.showEditFilterDialog(parent, filter);
294296

295297
if (edited != null) {
296298
// Tell the presenter a filter was edited. It will not update the filters
@@ -346,6 +348,23 @@ public void onSaveFilters(String group) {
346348
});
347349
}
348350

351+
private void setupLogsContextActions() {
352+
logList.addMouseListener(new MouseAdapter() {
353+
@Override
354+
public void mouseClicked(MouseEvent e) {
355+
if (SwingUtilities.isRightMouseButton(e) && logList.getSelectedRowCount() == 1) {
356+
JPopupMenu popup = new JPopupMenu();
357+
JMenuItem createFilterItem = popup.add("Create Filter from this line...");
358+
createFilterItem.addActionListener(l -> {
359+
LogEntry entry = (LogEntry) logListTableModel.getValueAt(logList.getSelectedRow(), 0);
360+
addFilterFromLogLine(entry.getLogText());
361+
});
362+
popup.show(logList, e.getX(), e.getY());
363+
}
364+
}
365+
});
366+
}
367+
349368
private void setupFilteredLogsContextActions() {
350369
filteredLogList.addMouseListener(new MouseAdapter() {
351370
@Override
@@ -376,12 +395,38 @@ private void addGroup() {
376395
}
377396

378397
private void addFilter(String group) {
379-
Filter newFilter = EditFilterDialog.showEditFilterDialog(parent, parent);
398+
Filter newFilter = EditFilterDialog.showEditFilterDialog(parent);
380399
if (newFilter != null) {
381400
presenter.addFilter(group, newFilter);
382401
}
383402
}
384403

404+
private void addFilterFromLogLine(String logLine) {
405+
Filter filter = EditFilterDialog.showEditFilterDialogWithText(parent, logLine);
406+
if (filter != null) {
407+
List<String> groups = presenter.getGroups();
408+
String group = groups.size() == 1 ? groups.get(0) : null;
409+
410+
if (StringUtils.isEmpty(group)) {
411+
String[] options = groups.toArray(new String[0]);
412+
int choice = JOptionPane.showOptionDialog(null,
413+
"Which group do you want to add this filter to?",
414+
"Select Filter group",
415+
-1,
416+
JOptionPane.QUESTION_MESSAGE,
417+
null, options, null);
418+
419+
if (choice >= 0) {
420+
group = options[choice];
421+
}
422+
}
423+
424+
if (!StringUtils.isEmpty(group)) {
425+
presenter.addFilter(group, filter);
426+
}
427+
}
428+
}
429+
385430
private void openLogs() {
386431
logFileChooser.resetChoosableFileFilters();
387432
logFileChooser.setMultiSelectionEnabled(true);

src/main/java/com/tibagni/logviewer/filter/EditFilterDialog.java

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public class EditFilterDialog extends JDialog {
4747
private JColorChooser colorChooser;
4848

4949
private Filter filter;
50+
private String previewText;
5051

5152
private final DocumentListener regexDocumentListener = new DocumentListener() {
5253
@Override
@@ -66,7 +67,12 @@ public void changedUpdate(DocumentEvent e) {
6667
};
6768

6869
private EditFilterDialog(Frame owner, Filter editingFilter) {
70+
this(owner, editingFilter, null);
71+
}
72+
73+
private EditFilterDialog(Frame owner, Filter editingFilter, String preDefinedText) {
6974
super(owner);
75+
previewText = preDefinedText;
7076

7177
setContentPane(contentPane);
7278
setModal(true);
@@ -117,6 +123,16 @@ public void mouseClicked(MouseEvent e) {
117123
}
118124

119125
SwingUtilities.invokeLater(() -> regexTxt.requestFocus());
126+
127+
if (!StringUtils.isEmpty(preDefinedText)) {
128+
regexTxt.setText(preDefinedText);
129+
addWindowListener(new WindowAdapter() {
130+
@Override
131+
public void windowOpened(WindowEvent e) {
132+
regexEditorBtn.doClick();
133+
}
134+
});
135+
}
120136
}
121137

122138
private void onOK() {
@@ -148,27 +164,14 @@ private void onCancel() {
148164

149165
private void onEditRegex() {
150166
RegexEditorDialog.Result edited = RegexEditorDialog.showEditRegexDialog(this, this,
151-
regexTxt.getText(), caseSensitiveCbx.isSelected());
167+
regexTxt.getText(), previewText, caseSensitiveCbx.isSelected());
152168

153169
if (edited != null) {
154170
regexTxt.setText(edited.pattern);
155171
caseSensitiveCbx.setSelected(edited.caseSensitive);
156172
}
157173
}
158174

159-
public static Filter showEditFilterDialog(Frame parent, Component relativeTo, Filter editingFilter) {
160-
EditFilterDialog dialog = new EditFilterDialog(parent, editingFilter);
161-
dialog.pack();
162-
dialog.setLocationRelativeTo(relativeTo);
163-
dialog.setVisible(true);
164-
165-
return dialog.filter;
166-
}
167-
168-
public static Filter showEditFilterDialog(Frame parent, Component relativeTo) {
169-
return showEditFilterDialog(parent, relativeTo, null);
170-
}
171-
172175
private void createUIComponents() {
173176
colorChooser = new JColorChooser();
174177
AbstractColorChooserPanel swatchPanel = getSwatchPanel(colorChooser.getChooserPanels());
@@ -197,4 +200,28 @@ private Color getInitialColor() {
197200
final Random r = new Random();
198201
return INITIAL_COLORS[r.nextInt(INITIAL_COLORS.length)];
199202
}
203+
204+
public static Filter showEditFilterDialog(Frame parent, Filter editingFilter) {
205+
EditFilterDialog dialog = new EditFilterDialog(parent, editingFilter);
206+
dialog.pack();
207+
dialog.setLocationRelativeTo(parent);
208+
dialog.setVisible(true);
209+
210+
return dialog.filter;
211+
}
212+
213+
public static Filter showEditFilterDialog(Frame parent) {
214+
return showEditFilterDialog(parent, null);
215+
}
216+
217+
// This is used to create a Filter from an existing predefined String
218+
// It will open the Edit Dialog directly on the RegEx Editor
219+
public static Filter showEditFilterDialogWithText(Frame parent, String preDefinedText) {
220+
EditFilterDialog dialog = new EditFilterDialog(parent, null, preDefinedText);
221+
dialog.pack();
222+
dialog.setLocationRelativeTo(parent);
223+
dialog.setVisible(true);
224+
225+
return dialog.filter;
226+
}
200227
}

src/main/java/com/tibagni/logviewer/filter/regex/RegexEditorDialog.form

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,6 @@
7474
<text value="Regex:"/>
7575
</properties>
7676
</component>
77-
<component id="29f33" class="javax.swing.JTextField" binding="regexEdit">
78-
<constraints>
79-
<grid row="2" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false">
80-
<preferred-size width="150" height="-1"/>
81-
</grid>
82-
<forms defaultalign-horz="false"/>
83-
</constraints>
84-
<properties/>
85-
</component>
8677
<component id="2ccf5" class="javax.swing.JLabel">
8778
<constraints>
8879
<grid row="4" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
@@ -97,15 +88,19 @@
9788
<grid row="4" column="2" row-span="1" col-span="1" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
9889
<forms defaultalign-horz="false" defaultalign-vert="false"/>
9990
</constraints>
100-
<properties/>
91+
<properties>
92+
<preferredSize width="500" height="200"/>
93+
<requestFocusEnabled value="true"/>
94+
</properties>
10195
<border type="none"/>
10296
<children>
10397
<component id="6073a" class="javax.swing.JTextArea" binding="regexPreview">
10498
<constraints/>
10599
<properties>
106100
<lineWrap value="true"/>
107101
<maximumSize width="-1" height="-1"/>
108-
<preferredSize width="500" height="180"/>
102+
<preferredSize width="500" height="340"/>
103+
<rows value="20"/>
109104
<text value="Sample text for testing: &#10;abcdefghijklmnopqrstuvwxyz &#10;ABCDEFGHIJKLMNOPQRSTUVWXYZ &#10;0123456789 _+-.,!@#$%^&amp;*();\/|&lt;&gt;&quot;'&#10;12345 -98.7 3.141 .6180 9,000 &#10;+42 555.123.4567 +1-(800)-555-2468 &#10;foo@demo.net bar.ba@test.co.uk &#10;www.demo.com http://foo.co.uk/"/>
110105
<wrapStyleWord value="true"/>
111106
</properties>
@@ -130,6 +125,27 @@
130125
<text value="Flags:"/>
131126
</properties>
132127
</component>
128+
<scrollpane id="1e727">
129+
<constraints>
130+
<grid row="2" column="2" row-span="1" col-span="1" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
131+
<forms defaultalign-horz="false" defaultalign-vert="false"/>
132+
</constraints>
133+
<properties>
134+
<preferredSize width="0" height="50"/>
135+
</properties>
136+
<border type="none"/>
137+
<children>
138+
<component id="fb1b3" class="javax.swing.JTextArea" binding="regexEdit">
139+
<constraints/>
140+
<properties>
141+
<lineWrap value="true"/>
142+
<preferredSize width="0" height="85"/>
143+
<requestFocusEnabled value="true"/>
144+
<rows value="5"/>
145+
</properties>
146+
</component>
147+
</children>
148+
</scrollpane>
133149
</children>
134150
</grid>
135151
</children>

src/main/java/com/tibagni/logviewer/filter/regex/RegexEditorDialog.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class RegexEditorDialog extends JDialog {
1616
private JPanel contentPane;
1717
private JButton buttonOK;
1818
private JButton buttonCancel;
19-
private JTextField regexEdit;
19+
private JTextArea regexEdit;
2020
private JTextArea regexPreview;
2121
private JCheckBox caseSensitive;
2222

@@ -115,10 +115,15 @@ private Result(String pattern, boolean caseSensitive) {
115115
}
116116
}
117117

118-
public static Result showEditRegexDialog(Dialog parent, Component relativeTo, String pattern, boolean caseSensitive) {
118+
public static Result showEditRegexDialog(Dialog parent, Component relativeTo,
119+
String pattern, String previewText,
120+
boolean caseSensitive) {
119121
RegexEditorDialog dialog = new RegexEditorDialog(parent);
120122
dialog.caseSensitive.setSelected(caseSensitive);
121123
dialog.regexEdit.setText(pattern);
124+
if (!StringUtils.isEmpty(previewText)) {
125+
dialog.regexPreview.setText(previewText);
126+
}
122127
dialog.applyRegexToPreview();
123128
dialog.updateOkButton();
124129

0 commit comments

Comments
 (0)