|
| 1 | +/* |
| 2 | + * #%L |
| 3 | + * SciJava UI components for Java Swing. |
| 4 | + * %% |
| 5 | + * Copyright (C) 2010 - 2019 Board of Regents of the University of |
| 6 | + * Wisconsin-Madison. |
| 7 | + * %% |
| 8 | + * Redistribution and use in source and binary forms, with or without |
| 9 | + * modification, are permitted provided that the following conditions are met: |
| 10 | + * |
| 11 | + * 1. Redistributions of source code must retain the above copyright notice, |
| 12 | + * this list of conditions and the following disclaimer. |
| 13 | + * 2. Redistributions in binary form must reproduce the above copyright notice, |
| 14 | + * this list of conditions and the following disclaimer in the documentation |
| 15 | + * and/or other materials provided with the distribution. |
| 16 | + * |
| 17 | + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| 18 | + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 19 | + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| 20 | + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE |
| 21 | + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| 22 | + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| 23 | + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| 24 | + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| 25 | + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| 26 | + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| 27 | + * POSSIBILITY OF SUCH DAMAGE. |
| 28 | + * #L% |
| 29 | + */ |
| 30 | + |
1 | 31 | package org.scijava.ui.swing.viewer; |
2 | 32 |
|
| 33 | +import java.awt.BorderLayout; |
| 34 | + |
| 35 | +import javax.swing.JPanel; |
| 36 | + |
| 37 | +import org.scijava.command.Command; |
3 | 38 | import org.scijava.display.Display; |
4 | 39 | import org.scijava.display.event.DisplayDeletedEvent; |
5 | 40 | import org.scijava.object.ObjectService; |
|
8 | 43 | import org.scijava.ui.swing.SwingUI; |
9 | 44 | import org.scijava.ui.viewer.AbstractDisplayViewer; |
10 | 45 | import org.scijava.ui.viewer.DisplayPanel; |
11 | | -import org.scijava.ui.viewer.DisplayViewer; |
12 | 46 | import org.scijava.ui.viewer.DisplayWindow; |
13 | 47 |
|
14 | | -import javax.swing.JPanel; |
15 | | -import java.awt.BorderLayout; |
16 | | - |
17 | 48 | /** |
18 | | - * Class helping to build a simple Swing JPanel viewer for any object of class T |
19 | | - * declared as a {@link org.scijava.ItemIO} output {@link Parameter} |
20 | | - * in a {@link org.scijava.command.Command} Command |
21 | | - * |
22 | | - * Usage example see: |
23 | | - * https://github.com/maarzt/example-imagej-display |
24 | | - * |
25 | | - * Image.sc forum thread : |
26 | | - * https://forum.image.sc/t/displaying-and-using-and-any-object-in-a-scijava-fiji-command |
27 | | - * |
| 49 | + * Class helping to build a simple Swing {@link JPanel} viewer for any object of |
| 50 | + * class T declared as a {@link org.scijava.ItemIO} output {@link Parameter} in |
| 51 | + * a {@link Command}. |
| 52 | + * |
28 | 53 | * @param <T> class of object needed to be displayed in a Swing UI |
29 | 54 | * @author Matthias Arzt |
| 55 | + * @see <a href="https://github.com/maarzt/example-imagej-display">Usage |
| 56 | + * example</a> |
| 57 | + * @see <a href= |
| 58 | + * "https://forum.image.sc/t/displaying-and-using-and-any-object-in-a-scijava-fiji-command">Image.sc |
| 59 | + * forum thread</a> |
30 | 60 | */ |
31 | | - |
32 | | -abstract public class EasySwingDisplayViewer<T> extends |
33 | | - AbstractDisplayViewer<T> implements DisplayViewer<T> |
| 61 | +public abstract class EasySwingDisplayViewer<T> extends |
| 62 | + AbstractDisplayViewer<T> |
34 | 63 | { |
35 | | - private final Class<T> classOfObject; |
36 | | - |
37 | | - @Parameter |
38 | | - ObjectService objectService; |
39 | | - |
40 | | - protected EasySwingDisplayViewer( Class< T > classOfObject ) |
41 | | - { |
42 | | - this.classOfObject = classOfObject; |
43 | | - } |
44 | | - |
45 | | - @Override |
46 | | - public boolean isCompatible(final UserInterface ui) { |
47 | | - return ui instanceof SwingUI; |
48 | | - } |
49 | | - |
50 | | - @Override |
51 | | - public boolean canView(final Display<?> d) { |
52 | | - Object object = d.get( 0 ); |
53 | | - if(! classOfObject.isInstance( object ) ) |
54 | | - return false; |
55 | | - T value = ( T ) object; |
56 | | - return canView( value ); |
57 | | - } |
58 | | - |
59 | | - protected abstract boolean canView( T value ); |
60 | | - protected abstract void redoLayout(); |
61 | | - protected abstract void setLabel(final String s); |
62 | | - protected abstract void redraw(); |
63 | | - protected abstract JPanel createDisplayPanel(T value); |
64 | | - |
65 | | - @Override |
66 | | - public void onDisplayDeletedEvent( DisplayDeletedEvent e ) |
67 | | - { |
68 | | - super.onDisplayDeletedEvent( e ); |
69 | | - objectService.removeObject( getDisplay().get( 0 ) ); |
70 | | - } |
71 | | - |
72 | | - @Override |
73 | | - public void view(final DisplayWindow w, final Display<?> d) { |
74 | | - objectService.addObject( d.get( 0 ) ); |
75 | | - super.view(w, d); |
76 | | - final JPanel content = createDisplayPanel( getDisplay().get(0) ); |
77 | | - setPanel( new SwingDisplayPanel(w, d, this, content) ); |
78 | | - } |
79 | | - |
80 | | - |
81 | | - public static class SwingDisplayPanel extends JPanel implements DisplayPanel |
82 | | - { |
83 | | - |
84 | | - // -- instance variables -- |
85 | | - |
86 | | - private final EasySwingDisplayViewer< ? > viewer; |
87 | | - private final DisplayWindow window; |
88 | | - private final Display< ? > display; |
89 | | - |
90 | | - // -- PlotDisplayPanel methods -- |
91 | | - |
92 | | - public SwingDisplayPanel( DisplayWindow window, Display< ? > display, EasySwingDisplayViewer< ? > viewer, JPanel panel ) |
93 | | - { |
94 | | - this.window = window; |
95 | | - this.display = display; |
96 | | - this.viewer = viewer; |
97 | | - window.setContent(this); |
98 | | - setLayout( new BorderLayout() ); |
99 | | - add(panel); |
100 | | - } |
101 | | - |
102 | | - @Override |
103 | | - public Display< ? > getDisplay() { |
104 | | - return display; |
105 | | - } |
106 | | - |
107 | | - // -- DisplayPanel methods -- |
108 | | - |
109 | | - @Override |
110 | | - public DisplayWindow getWindow() { |
111 | | - return window; |
112 | | - } |
113 | | - |
114 | | - @Override |
115 | | - public void redoLayout() |
116 | | - { |
117 | | - viewer.redoLayout(); |
118 | | - } |
119 | | - |
120 | | - @Override |
121 | | - public void setLabel( String s ) |
122 | | - { |
123 | | - viewer.setLabel( s ); |
124 | | - } |
125 | | - |
126 | | - @Override |
127 | | - public void redraw() |
128 | | - { |
129 | | - viewer.redraw(); |
130 | | - } |
131 | | - } |
132 | | -} |
133 | 64 |
|
| 65 | + private final Class<T> classOfObject; |
| 66 | + |
| 67 | + @Parameter |
| 68 | + ObjectService objectService; |
| 69 | + |
| 70 | + protected EasySwingDisplayViewer(Class<T> classOfObject) { |
| 71 | + this.classOfObject = classOfObject; |
| 72 | + } |
| 73 | + |
| 74 | + @Override |
| 75 | + public boolean isCompatible(final UserInterface ui) { |
| 76 | + return ui instanceof SwingUI; |
| 77 | + } |
| 78 | + |
| 79 | + @Override |
| 80 | + public boolean canView(final Display<?> d) { |
| 81 | + final Object object = d.get(0); |
| 82 | + if (!classOfObject.isInstance(object)) return false; |
| 83 | + @SuppressWarnings("unchecked") |
| 84 | + final T value = (T) object; |
| 85 | + return canView(value); |
| 86 | + } |
| 87 | + |
| 88 | + protected abstract boolean canView(T value); |
| 89 | + |
| 90 | + protected abstract void redoLayout(); |
| 91 | + |
| 92 | + protected abstract void setLabel(final String s); |
| 93 | + |
| 94 | + protected abstract void redraw(); |
| 95 | + |
| 96 | + protected abstract JPanel createDisplayPanel(T value); |
| 97 | + |
| 98 | + @Override |
| 99 | + public void onDisplayDeletedEvent(DisplayDeletedEvent e) { |
| 100 | + super.onDisplayDeletedEvent(e); |
| 101 | + objectService.removeObject(getDisplay().get(0)); |
| 102 | + } |
| 103 | + |
| 104 | + @Override |
| 105 | + public void view(final DisplayWindow w, final Display<?> d) { |
| 106 | + objectService.addObject(d.get(0)); |
| 107 | + super.view(w, d); |
| 108 | + final JPanel content = createDisplayPanel(getDisplay().get(0)); |
| 109 | + setPanel(new SwingDisplayPanel(w, d, this, content)); |
| 110 | + } |
| 111 | + |
| 112 | + public static class SwingDisplayPanel extends JPanel implements DisplayPanel { |
| 113 | + |
| 114 | + // -- instance variables -- |
| 115 | + |
| 116 | + private final EasySwingDisplayViewer<?> viewer; |
| 117 | + private final DisplayWindow window; |
| 118 | + private final Display<?> display; |
| 119 | + |
| 120 | + // -- PlotDisplayPanel methods -- |
| 121 | + |
| 122 | + public SwingDisplayPanel(DisplayWindow window, Display<?> display, |
| 123 | + EasySwingDisplayViewer<?> viewer, JPanel panel) |
| 124 | + { |
| 125 | + this.window = window; |
| 126 | + this.display = display; |
| 127 | + this.viewer = viewer; |
| 128 | + window.setContent(this); |
| 129 | + setLayout(new BorderLayout()); |
| 130 | + add(panel); |
| 131 | + } |
| 132 | + |
| 133 | + @Override |
| 134 | + public Display<?> getDisplay() { |
| 135 | + return display; |
| 136 | + } |
| 137 | + |
| 138 | + // -- DisplayPanel methods -- |
| 139 | + |
| 140 | + @Override |
| 141 | + public DisplayWindow getWindow() { |
| 142 | + return window; |
| 143 | + } |
| 144 | + |
| 145 | + @Override |
| 146 | + public void redoLayout() { |
| 147 | + viewer.redoLayout(); |
| 148 | + } |
| 149 | + |
| 150 | + @Override |
| 151 | + public void setLabel(String s) { |
| 152 | + viewer.setLabel(s); |
| 153 | + } |
| 154 | + |
| 155 | + @Override |
| 156 | + public void redraw() { |
| 157 | + viewer.redraw(); |
| 158 | + } |
| 159 | + } |
| 160 | +} |
0 commit comments