Sample Layer Property Panel Implementation for your own layer
In this implementation, we provide an property panel for a triangle mesh layer. This panel only contains a field for a layer name, as well as line attributes.
Extending JPanel
Extending JPanel
In this example, the JPanel class was created by hand.
TRIANGLEMESHLAYERDISPLAYPANEL.JAVA
package com.interactive.intviewer.tmesh.editor;
import com.interactive.intviewer.util.gui.LineProperties;
import com.interactive.intviewerapi.IDisposable;
import com.interactive.intviewerapi.layers.ILayer2D;
import com.interactive.intviewerapi.layers.NamedProps;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import org.netbeans.validation.api.builtin.Validators;
import org.netbeans.validation.api.ui.ValidationGroup;
import com.interactive.intviewerapi.editors.utils.LineAttributesPanel;
public class TriangleMeshLayerDisplayPanel extends JPanel implements IDisposable {
private static final long serialVersionUID = 2463020299625836800L;
private JTextField _nameField;
private LineAttributesPanel _lineEditor;
private ILayer2D layer;
public TriangleMeshLayerDisplayPanel() {
initComponents();
}
public void init(ILayer2D layer) {
this.layer = layer;
}
private void initComponents() {
_nameField = new JTextField("");
_lineEditor = new LineAttributesPanel();
_lineEditor.setBorder(new TitledBorder("Line Attributes"));
JPanel layerPanel = new JPanel(new GridLayout(1, 2));
layerPanel.setBorder(new TitledBorder("Layer"));
layerPanel.add(new JLabel(" Layer Name"));
layerPanel.add(_nameField);
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalStrut(10));
box.add(layerPanel);
box.add(Box.createVerticalStrut(10));
box.add(_lineEditor);
box.add(Box.createVerticalStrut(10));
setLayout(new BorderLayout());
setBorder(BorderFactory.createEmptyBorder(10, 25, 10, 25));
add(box, BorderLayout.CENTER);
}
public void setUp(NamedProps lp) {
_nameField.setText(lp.getProperty(ILayer2D.DISPLAY_NAME));
_lineEditor.setLineStyle(lp.getProperty(LineProperties.LINE_STYLE));
_lineEditor.setLineColor(lp.getProperty(LineProperties.LINE_COLOR));
_lineEditor.setLineWidth(lp.getProperty(LineProperties.LINE_WIDTH).intValue());
}
public void getProps(NamedProps lp) {
lp.putProperty(ILayer2D.DISPLAY_NAME, _nameField.getText());
lp.putProperty(LineProperties.LINE_STYLE, _lineEditor.getLineStyle());
lp.putProperty(LineProperties.LINE_COLOR, _lineEditor.getLineColor());
lp.putProperty(LineProperties.LINE_WIDTH, (float) _lineEditor.getLineWidth());
}
@SuppressWarnings("unchecked")
public void setUpValidationGroup(ValidationGroup validationGroup) {
_nameField.setName("Layer Name");
validationGroup.add(_nameField, Validators.REQUIRE_NON_EMPTY_STRING);
}
@Override
public void dispose() {
this.layer = null;
}
public void refresh() {
this.setUp(this.layer.getProperties());
}
}
Implementing IObjectEditorNode
Implementing IObjectEditorNode
TRIANGLEMESHLAYERDISPLAYEDITOR.JAVA
package com.interactive.intviewer.tmesh.editor;
import com.interactive.intviewer.view2d.util.HelpCtxUtils;
import com.interactive.intviewerapi.IVisual;
import com.interactive.intviewerapi.editors.IObjectEditorNode;
import com.interactive.intviewerapi.editors.VisualPropertyEditor;
import com.interactive.intviewerapi.events.EventBroadcaster;
import com.interactive.intviewerapi.events.IEventSubscriber;
import com.interactive.intviewerapi.events.PropertyProviderEvent;
import com.interactive.intviewerapi.layers.ILayer2D;
import com.interactive.intviewerapi.layers.NamedProps;
import javax.swing.JDialog;
import javax.swing.JPanel;
import org.netbeans.validation.api.ui.ValidationPanel;
import org.openide.util.HelpCtx;
public class TriangleMeshLayerDisplayEditor extends VisualPropertyEditor<ILayer2D>
implements IEventSubscriber<PropertyProviderEvent> {
private static final long serialVersionUID = 2463020299625836800L;
private TriangleMeshLayerDisplayPanel panel;
private ValidationPanel validationPanel;
private boolean isReady = true;
public TriangleMeshLayerDisplayEditor() {
}
@Override
public VisualPropertyEditor getInstance(ILayer2D visual) {
return new TriangleMeshLayerDisplayEditor(visual);
}
public TriangleMeshLayerDisplayEditor(ILayer2D layer) {
super(layer);
}
@Override
public boolean isFolder() {
return false;
}
@Override
public IObjectEditorNode[] getChildren() {
return null;
}
@Override
public JPanel getPanel() {
if (this.panel == null) {
this.validationPanel = new ValidationPanel();
this.panel = new TriangleMeshLayerDisplayPanel();
this.panel.init(this.getVisual());
this.panel.setUp(this.getVisual().getProperties());
this.panel.setUpValidationGroup(this.validationPanel.getValidationGroup());
this.validationPanel.setInnerComponent(this.panel);
}
return this.validationPanel;
}
@Override
public HelpCtx getHelpCtx() {
return new HelpCtx(HelpCtxUtils.PROPERTY_DISPLAY_PARAMETERS);
}
@Override
public String getDisplayName() {
return "Display Parameters";
}
@Override
public void apply() {
try {
isReady = false;
NamedProps props = new NamedProps();
panel.getProps(props);
this.getVisual().setProperties(props, this);
} finally {
isReady = true;
}
}
@Override
public void dispose() {
this.unsubscribe();
super.dispose();
if (panel != null) {
panel.dispose();
panel = null;
}
}
@Override
public boolean canDetach() {
return true;
}
@Override
public JDialog onDetach(JPanel panel) {
JDialog dialog = super.onDetach(panel);
this.subscribe();
return dialog;
}
@Override
public void onEvent(PropertyProviderEvent t) {
if (!(isReady)) {
return;
}
IVisual visual = getVisual();
if (visual == null) {
return;
}
if (this.panel == null) {
return;
}
if (t.getPropertyProvider() != visual) {
return;
}
panel.refresh();
}
public void subscribe() {
EventBroadcaster.getInstance().subscribe(PropertyProviderEvent.class, this, true);
}
public void unsubscribe() {
EventBroadcaster.getInstance().unsubscribe(PropertyProviderEvent.class, this);
}
}
Implementing IObjectEditorNodeProvider
Implementing IObjectEditorNodeProvider
XSECTIONTRIANGLEMESHLAYER.JAVA (EXTRACT)
@Override
public IObjectEditorNode getObjectEditorNode() {
VisualPropertyEditor rpe = new VisualPropertyEditor (this);
rpe.addEditor(new TriangleMeshLayerDisplayEditor(this));
return rpe;
}
@Override
public void setObjectEditorNodeVisible(boolean visible) {
if (visible) {
IObjectEditorNode editor = this.getObjectEditorNode();
HelpCtx help = new HelpCtx(HelpCtxUtils.PROPERTY);
TabPropertiesPanel pp = new TabPropertiesPanel();
PanelManager pm = new PanelManager(editor);
pp.setPanelManager(pm);
IntViewerDialogDisplayer.getDefault().notify(pp, editor.getDisplayName(), IntViewerDialogDisplayer.OK_APPLY_CANCEL_OPTION, help, pm);
}
}