Skip to content

Commit f9a7e35

Browse files
committed
check box headers for toggling enabled status
1 parent d99d341 commit f9a7e35

File tree

2 files changed

+51
-15
lines changed

2 files changed

+51
-15
lines changed

src/main/java/org/scijava/search/Searcher.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ public interface Searcher extends SciJavaPlugin {
2222
*/
2323
String title();
2424

25+
/** Whether this plugin is currently enabled to do searches. */
26+
default boolean enabled() {
27+
return true;
28+
}
29+
2530
/** Gets whether this plugin wants exclusive rights to the given text. */
2631
default boolean exclusive(@SuppressWarnings("unused") final String text) {
2732
return false;

src/main/java/org/scijava/ui/swing/search/SwingSearchBar.java

Lines changed: 46 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.awt.Color;
3636
import java.awt.Component;
3737
import java.awt.Dimension;
38+
import java.awt.Font;
3839
import java.awt.GridLayout;
3940
import java.awt.Window;
4041
import java.awt.event.FocusEvent;
@@ -55,6 +56,7 @@
5556
import javax.swing.DefaultListModel;
5657
import javax.swing.ImageIcon;
5758
import javax.swing.JButton;
59+
import javax.swing.JCheckBox;
5860
import javax.swing.JDialog;
5961
import javax.swing.JLabel;
6062
import javax.swing.JList;
@@ -65,9 +67,7 @@
6567
import javax.swing.ScrollPaneConstants;
6668
import javax.swing.SwingConstants;
6769
import javax.swing.SwingUtilities;
68-
import javax.swing.border.CompoundBorder;
6970
import javax.swing.border.EmptyBorder;
70-
import javax.swing.border.MatteBorder;
7171
import javax.swing.event.DocumentEvent;
7272
import javax.swing.event.DocumentListener;
7373

@@ -96,7 +96,7 @@ public class SwingSearchBar extends JTextField {
9696
private static final int MAX_RESULTS = 8;
9797

9898
private static final Color SELECTED_COLOR = new Color(70, 152, 251);
99-
private static final Color HEADER_COLOR = new Color(128, 128, 128);
99+
private static final Color HEADER_COLOR = new Color(234, 234, 234);
100100
private static final int ICON_SIZE = 16;
101101
private static final int PAD = 5;
102102

@@ -249,25 +249,38 @@ private class SwingSearchPanel extends JPanel {
249249

250250
private final SearchOperation operation;
251251
private final Map<Class<?>, SearchEvent> allResults;
252+
private final Map<Class<?>, JCheckBox> headerCheckboxes;
252253
private final JList<SearchResult> resultsList;
253254

254255
public SwingSearchPanel() {
255256
operation = searchService.search(//
256257
event -> threadService.queue(() -> update(event)));
257258

258259
allResults = new HashMap<>();
260+
headerCheckboxes = new HashMap<>();
259261

260262
resultsList = new JList<>();
261263
resultsList.setCellRenderer((list, value, index, isSelected,
262264
cellHasFocus) -> {
263265
if (isHeader(value)) {
264-
final JLabel header = new JLabel(value.name());
265-
header.setBorder(new CompoundBorder(//
266-
new EmptyBorder(PAD, PAD, 0, PAD),
267-
new MatteBorder(0, 0, 1, 0, Color.gray)));
268-
header.setBackground(HEADER_COLOR);
269-
header.setEnabled(false);
270-
return header;
266+
final Searcher searcher = ((SearchResultHeader) value).searcher();
267+
final JCheckBox headerBox = //
268+
new JCheckBox(searcher.title(), searcher.enabled());
269+
headerBox.setFont(smaller(headerBox.getFont(), 2));
270+
headerBox.setBackground(HEADER_COLOR);
271+
headerCheckboxes.put(searcher.getClass(), headerBox);
272+
273+
final JPanel headerInnerPane = new JPanel();
274+
headerInnerPane.setLayout(new GridLayout(1, 1));
275+
headerInnerPane.add(headerBox);
276+
headerInnerPane.setBackground(HEADER_COLOR);
277+
278+
final JPanel headerOuterPane = new JPanel();
279+
headerOuterPane.setLayout(new GridLayout(1, 1));
280+
headerOuterPane.add(headerInnerPane);
281+
headerOuterPane.setBackground(list.getBackground());
282+
headerOuterPane.setBorder(new EmptyBorder(PAD, 0, 0, 0));
283+
return headerOuterPane;
271284
}
272285
final JPanel item = new JPanel();
273286
item.setLayout(new BoxLayout(item, BoxLayout.X_AXIS));
@@ -303,6 +316,16 @@ public SwingSearchPanel() {
303316
if (lse.getValueIsAdjusting()) return;
304317
final SearchResult result = resultsList.getSelectedValue();
305318
if (result == null || isHeader(result)) {
319+
if (result != null) {
320+
final JCheckBox checkBox = headerCheckboxes.get(
321+
((SearchResultHeader) result).searcher().getClass());
322+
System.out.println("GOT A CHECKBOX: " + checkBox);
323+
checkBox.setSelected(!checkBox.isSelected());
324+
checkBox.repaint();
325+
resultsList.repaint();
326+
System.out.println("TOGGLED IT: state -> " + checkBox.isSelected());
327+
}
328+
306329
// clear details pane
307330
detailsTitle.setText("");
308331
detailsProps.removeAll();
@@ -392,6 +415,10 @@ private int rowCount() {
392415
return resultsList.getModel().getSize();
393416
}
394417

418+
private Font smaller(Font font, int decrement) {
419+
return new Font(font.getFontName(), font.getStyle(), font.getSize() - decrement);
420+
}
421+
395422
/** Executes the default search action. */
396423
private void execute() {
397424
assertDispatchThread();
@@ -425,7 +452,7 @@ private void rebuild() {
425452
.limit(MAX_RESULTS).collect(Collectors.toList());
426453

427454
// Add section header.
428-
listModel.addElement(new SearchResultHeader(searcher.title()));
455+
listModel.addElement(new SearchResultHeader(searcher));
429456

430457
// Add results as entries.
431458
for (final SearchResult result : results) {
@@ -514,15 +541,19 @@ public void keyPressed(final KeyEvent e) {
514541
/** A header dividing search result entries. */
515542
private class SearchResultHeader implements SearchResult {
516543

517-
private final String title;
544+
private final Searcher searcher;
545+
546+
public SearchResultHeader(final Searcher searcher) {
547+
this.searcher = searcher;
548+
}
518549

519-
public SearchResultHeader(final String title) {
520-
this.title = title;
550+
public Searcher searcher() {
551+
return searcher;
521552
}
522553

523554
@Override
524555
public String name() {
525-
return title;
556+
return searcher.title();
526557
}
527558

528559
@Override

0 commit comments

Comments
 (0)