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

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

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

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);
        }
    }