Skip to content

Commit da2e992

Browse files
committed
MEGA WIP
- Compiling version of NWidget API. They're new! - Struct rename for good and awesome
1 parent 036fd87 commit da2e992

34 files changed

Lines changed: 981 additions & 400 deletions

pom.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.scijava</groupId>
77
<artifactId>pom-scijava</artifactId>
8-
<version>16.1.0</version>
8+
<version>17.0.0</version>
99
<relativePath />
1010
</parent>
1111

@@ -93,6 +93,8 @@
9393
<license.licenseName>bsd_2</license.licenseName>
9494
<license.copyrightOwners>Board of Regents of the University of
9595
Wisconsin-Madison and University of Konstanz.</license.copyrightOwners>
96+
<scijava-common.version>2.66.1-SNAPSHOT</scijava-common.version>
97+
<scijava-ui-swing.version>0.9.4-SNAPSHOT</scijava-ui-swing.version>
9698
</properties>
9799

98100
<repositories>
@@ -108,6 +110,10 @@ Wisconsin-Madison and University of Konstanz.</license.copyrightOwners>
108110
<groupId>org.scijava</groupId>
109111
<artifactId>scijava-common</artifactId>
110112
</dependency>
113+
<dependency>
114+
<groupId>org.scijava</groupId>
115+
<artifactId>scijava-ui-swing</artifactId>
116+
</dependency>
111117

112118
<dependency>
113119
<groupId>junit</groupId>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
package org.scijava.nwidget;
3+
4+
import org.scijava.struct.StructInstance;
5+
6+
public class NAbstractWidgetPanel<C> implements NWidgetPanel<C> {
7+
8+
private StructInstance<C> struct;
9+
10+
public NAbstractWidgetPanel(StructInstance<C> struct) {
11+
this.struct = struct;
12+
}
13+
14+
@Override
15+
public StructInstance<C> struct() { return struct; }
16+
17+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
* #%L
3+
* SciJava Common shared library for SciJava software.
4+
* %%
5+
* Copyright (C) 2009 - 2017 Board of Regents of the University of
6+
* Wisconsin-Madison, Broad Institute of MIT and Harvard, Max Planck
7+
* Institute of Molecular Cell Biology and Genetics, University of
8+
* Konstanz, and KNIME GmbH.
9+
* %%
10+
* Redistribution and use in source and binary forms, with or without
11+
* modification, are permitted provided that the following conditions are met:
12+
*
13+
* 1. Redistributions of source code must retain the above copyright notice,
14+
* this list of conditions and the following disclaimer.
15+
* 2. Redistributions in binary form must reproduce the above copyright notice,
16+
* this list of conditions and the following disclaimer in the documentation
17+
* and/or other materials provided with the distribution.
18+
*
19+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
23+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29+
* POSSIBILITY OF SUCH DAMAGE.
30+
* #L%
31+
*/
32+
33+
package org.scijava.nwidget;
34+
35+
import java.util.ArrayList;
36+
import java.util.function.Predicate;
37+
38+
import org.scijava.param.Parameter;
39+
import org.scijava.plugin.Plugin;
40+
import org.scijava.plugin.PluginInfo;
41+
import org.scijava.plugin.PluginService;
42+
import org.scijava.service.AbstractService;
43+
import org.scijava.service.Service;
44+
import org.scijava.struct.Member;
45+
import org.scijava.struct.StructInstance;
46+
47+
@Plugin(type = Service.class)
48+
public class NDefaultWidgetService extends AbstractService implements
49+
NWidgetService
50+
{
51+
52+
@Parameter
53+
private PluginService pluginService;
54+
55+
@Override
56+
public <C, W extends NWidget> NWidgetPanel<C>
57+
createPanel(final StructInstance<C> struct, final Predicate<Member<?>> included,
58+
final Predicate<Member<?>> required,
59+
final NWidgetPanelFactory<C, W> factory)
60+
{
61+
final ArrayList<W> widgets = createWidgets(struct, factory.widgetType(),
62+
included, required);
63+
64+
return factory.create(struct, widgets);
65+
}
66+
67+
// -- Helper methods --
68+
69+
private <W extends NWidget> ArrayList<W> createWidgets(final StructInstance<?> struct,
70+
final Class<W> widgetType, final Predicate<Member<?>> included,
71+
final Predicate<Member<?>> required)
72+
{
73+
final ArrayList<W> widgets = new ArrayList<>();
74+
75+
for (final Member<?> item : struct.struct().members()) {
76+
if (!included.test(item)) continue;
77+
78+
final W widget = createWidget(struct, item, widgetType);
79+
if (widget == null && required.test(item)) {
80+
// fail - FIXME
81+
throw new RuntimeException(item + " is required but none exist.");
82+
}
83+
if (widget != null) widgets.add(widget);
84+
}
85+
return widgets;
86+
}
87+
88+
private <T extends NWidget> T createWidget(final StructInstance<?> struct,
89+
final Member<?> item, final Class<T> widgetType)
90+
{
91+
// FIXME FIX THIS CRAP
92+
for (final PluginInfo<NWidgetFactory> info : pluginService.getPluginsOfType(
93+
NWidgetFactory.class))
94+
{
95+
final NWidgetFactory<?> factory = pluginService.createInstance(info);
96+
if (widgetType.isAssignableFrom(factory.widgetType())) continue;
97+
if (!factory.supports(item)) continue;
98+
@SuppressWarnings("unchecked")
99+
final T tWidget = (T) factory.create(struct, item.getKey());
100+
return tWidget;
101+
}
102+
return null;
103+
}
104+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package org.scijava.nwidget;
2+
3+
import javax.swing.JPanel;
4+
5+
import net.miginfocom.swing.MigLayout;
6+
7+
import org.scijava.struct.Member;
8+
import org.scijava.struct.MemberInstance;
9+
import org.scijava.struct.StructInstance;
10+
import org.scijava.util.ClassUtils;
11+
12+
public class NSwingNumberWidgetFactory implements NSwingWidgetFactory {
13+
14+
@Override
15+
public boolean supports(final Member<?> member) {
16+
return ClassUtils.isNumber(member.getRawType());
17+
}
18+
19+
@Override
20+
public NWidget create(MemberInstance<?> memberInstance) {
21+
return new Widget(memberInstance);
22+
}
23+
24+
private class Widget implements NSwingWidget {
25+
26+
public Widget(final MemberInstance<?> memberInstance) {
27+
super(memberInstance);
28+
}
29+
30+
@Override
31+
public JPanel getComponent() {
32+
// TODO - lazy/null caching
33+
final JPanel panel = new JPanel();
34+
final MigLayout layout =
35+
new MigLayout("fillx,ins 3 0 3 0", "[fill,grow|pref]");
36+
panel.setLayout(layout);
37+
38+
/*
39+
final Number min = model.getMin();
40+
final Number max = model.getMax();
41+
final Number softMin = model.getSoftMin();
42+
final Number softMax = model.getSoftMax();
43+
final Number stepSize = model.getStepSize();
44+
45+
// add optional widgets, if specified
46+
if (model.isStyle(NumberWidget.SCROLL_BAR_STYLE)) {
47+
int smx = softMax.intValue();
48+
if (smx < Integer.MAX_VALUE) smx++;
49+
scrollBar =
50+
new JScrollBar(Adjustable.HORIZONTAL, softMin.intValue(), 1, softMin
51+
.intValue(), smx);
52+
scrollBar.setUnitIncrement(stepSize.intValue());
53+
setToolTip(scrollBar);
54+
getComponent().add(scrollBar);
55+
scrollBar.addAdjustmentListener(this);
56+
}
57+
else if (model.isStyle(NumberWidget.SLIDER_STYLE)) {
58+
slider =
59+
new JSlider(softMin.intValue(), softMax.intValue(), softMin.intValue());
60+
slider.setMajorTickSpacing((softMax.intValue() - softMin.intValue()) / 4);
61+
slider.setMinorTickSpacing(stepSize.intValue());
62+
slider.setPaintLabels(true);
63+
slider.setPaintTicks(true);
64+
setToolTip(slider);
65+
getComponent().add(slider);
66+
slider.addChangeListener(this);
67+
}
68+
69+
// add spinner widget
70+
final Class<?> type = model.getItem().getType();
71+
final Number value = (Number) model.getValue();
72+
final SpinnerNumberModel spinnerModel =
73+
new SpinnerNumberModelFactory().createModel(value, min, max, stepSize);
74+
spinner = new JSpinner(spinnerModel);
75+
fixSpinner(type);
76+
setToolTip(spinner);
77+
getComponent().add(spinner);
78+
limitWidth(200);
79+
spinner.addChangeListener(this);
80+
81+
refreshWidget();
82+
syncSliders();
83+
*/
84+
return panel;
85+
}
86+
}
87+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.scijava.nwidget;
2+
3+
import javax.swing.JPanel;
4+
5+
import org.scijava.widget.UIComponent;
6+
7+
public interface NSwingWidget extends NWidget, UIComponent<JPanel> {
8+
9+
@Override
10+
default Class<JPanel> getComponentType() {
11+
return JPanel.class;
12+
}
13+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.scijava.nwidget;
2+
3+
public interface NSwingWidgetFactory extends NWidgetFactory<NSwingWidget> {
4+
5+
@Override
6+
default Class<NSwingWidget> widgetType() {
7+
return NSwingWidget.class;
8+
}
9+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
2+
package org.scijava.nwidget;
3+
4+
import java.util.List;
5+
6+
import javax.swing.JPanel;
7+
8+
import org.scijava.struct.StructInstance;
9+
import org.scijava.widget.UIComponent;
10+
11+
public class NSwingWidgetPanel<C> extends NAbstractWidgetPanel<C> implements
12+
UIComponent<JPanel>
13+
{
14+
15+
private final List<? extends NSwingWidget> widgets;
16+
private JPanel panel;
17+
18+
public NSwingWidgetPanel(final StructInstance<C> struct,
19+
final List<? extends NSwingWidget> widgets)
20+
{
21+
super(struct);
22+
this.widgets = widgets;
23+
}
24+
25+
@Override
26+
public JPanel getComponent() {
27+
if (panel == null) {
28+
panel = new JPanel();
29+
widgets.stream().forEach(w -> panel.add(w.getComponent()));
30+
}
31+
return panel;
32+
}
33+
34+
@Override
35+
public Class<JPanel> getComponentType() {
36+
return JPanel.class;
37+
}
38+
39+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
2+
package org.scijava.nwidget;
3+
4+
import java.util.List;
5+
6+
import javax.swing.JPanel;
7+
8+
import org.scijava.struct.StructInstance;
9+
import org.scijava.widget.UIComponent;
10+
11+
public class NSwingWidgetPanelFactory<C> implements
12+
NWidgetPanelFactory<C, NSwingWidget>
13+
{
14+
15+
@Override
16+
public SwingWidgetPanel create(final StructInstance<C> struct,
17+
final List<? extends NSwingWidget> widgets)
18+
{
19+
return new SwingWidgetPanel(struct, widgets);
20+
}
21+
22+
@Override
23+
public Class<NSwingWidget> widgetType() {
24+
return NSwingWidget.class;
25+
}
26+
27+
// -- Helper classes --
28+
29+
private class SwingWidgetPanel extends NAbstractWidgetPanel<C> implements
30+
UIComponent<JPanel>
31+
{
32+
33+
private final List<? extends NSwingWidget> widgets;
34+
private JPanel panel;
35+
36+
public SwingWidgetPanel(final StructInstance<C> struct,
37+
final List<? extends NSwingWidget> widgets)
38+
{
39+
super(struct);
40+
this.widgets = widgets;
41+
}
42+
43+
@Override
44+
public JPanel getComponent() {
45+
if (panel == null) {
46+
panel = new JPanel();
47+
widgets.stream().forEach(w -> panel.add(w.getComponent()));
48+
}
49+
return panel;
50+
}
51+
52+
@Override
53+
public Class<JPanel> getComponentType() {
54+
return JPanel.class;
55+
}
56+
57+
}
58+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.scijava.nwidget;
2+
3+
import org.scijava.struct.MemberInstance;
4+
5+
public interface NWidget<T> {
6+
MemberInstance<T> member();
7+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.scijava.nwidget;
2+
3+
import org.scijava.plugin.SciJavaPlugin;
4+
import org.scijava.struct.StructInstance;
5+
import org.scijava.struct.Member;
6+
7+
public interface NWidgetFactory<W extends NWidget> extends SciJavaPlugin {
8+
9+
boolean supports(Member<?> item);
10+
NWidget create(StructInstance<?> struct, String key);
11+
12+
Class<W> widgetType();
13+
}

0 commit comments

Comments
 (0)