Sample Attributes Shortcut Panel Implementation
In this implementation, we provide an attributes shortcut panel for a triangle mesh layer. This panel only contains a button for the selection of a line color.
Extending AbstractVisualAttributesShortcutPanel
The following panel class was created using the Netbeans Matisse editor, then customized to extend com.interactive.intviewerapi.editors.AbstractVisualAttributesShortcutPanel.
TRIANGLEMESHLAYERATTRIBUTESSHORTCUTPANEL.JAVA
package com.interactive.intviewer.tmesh.editor.shortcut;
import com.interactive.intviewerapi.events.PropertyProviderEvent;
import com.interactive.intviewerapi.editors.AbstractVisualAttributesShortcutPanel;
import com.interactive.intviewer.util.gui.LineColorButton;
import com.interactive.intviewerapi.layers.ITriangleMeshLayer;
import com.interactive.intviewerapi.layers.NamedProps;
import java.awt.Color;
public class TriangleMeshLayerAttributesShortcutPanel extends AbstractVisualAttributesShortcutPanel {
public TriangleMeshLayerAttributesShortcutPanel(ITriangleMeshLayer tmeshLayer) {
super(tmeshLayer);
initComponents();
initGUI();
this.setReady(true);
}
/**
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
colorBtn = new LineColorButton("", Color.black);
jLabel1.setText(org.openide.util.NbBundle.getMessage(TriangleMeshLayerAttributesShortcutPanel.class, "TriangleMeshLayerAttributesShortcutPanel.jLabel1.text")); // NOI18N
colorBtn.setText(org.openide.util.NbBundle.getMessage(TriangleMeshLayerAttributesShortcutPanel.class, "TriangleMeshLayerAttributesShortcutPanel.colorBtn.text")); // NOI18N
colorBtn.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
public void propertyChange(java.beans.PropertyChangeEvent evt) {
colorBtnPropertyChange(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel1)
.addGap(27, 27, 27)
.addComponent(colorBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 72, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(12, 12, 12)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(colorBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jLabel1))
.addContainerGap(24, Short.MAX_VALUE))
);
}// </editor-fold>
private void colorBtnPropertyChange(java.beans.PropertyChangeEvent evt) {
// TODO add your handling code here:
if (!isReady()) {
return;
}
if (this.getVisual() == null) {
return;
}
if (evt.getSource() == colorBtn && evt.getPropertyName().equals(LineColorButton.COLOR_PROPERTY)) {
Color c = ((LineColorButton) colorBtn).getSelectedColor();
NamedProps prop = new NamedProps();
prop.putProperty(ITriangleMeshLayer.LINE_COLOR, c);
getVisual().setProperties(prop, this);
}
}
// Variables declaration - do not modify
private javax.swing.JButton colorBtn;
private javax.swing.JLabel jLabel1;
// End of variables declaration
private void initGUI() {
Color c = getVisual().getProperties().getProperty(ITriangleMeshLayer.LINE_COLOR);
((LineColorButton) colorBtn).setSelectedColor(c);
}
@Override
protected void processEvent(PropertyProviderEvent e) {
this.setReady(false);
initGUI();
this.setReady(true);
}
}
Extending AbstractVisualAttributesShortcutEditor
The following editor class does a lazy-instantiation of the panel created earlier.
TRIANGLEMESHLAYERATTRIBUTESSHORTCUTEDITOR.JAVA
package com.interactive.intviewer.tmesh.editor.shortcut;
import com.interactive.intviewerapi.editors.AbstractVisualAttributesShortcutEditor;
import com.interactive.intviewerapi.layers.ILayer2D;
import com.interactive.intviewerapi.layers.IVisual;
import com.interactive.intviewerapi.layers.ITriangleMeshLayer;
import javax.swing.JComponent;
public class TriangleMeshLayerAttributesShortcutEditor extends AbstractVisualAttributesShortcutEditor {
private TriangleMeshLayerAttributesShortcutPanel panel;
public TriangleMeshLayerAttributesShortcutEditor(ILayer2D layer) {
super(layer);
}
@Override
public JComponent getComponent() {
if (panel == null) {
panel = new TriangleMeshLayerAttributesShortcutPanel((ITriangleMeshLayer) this.getVisual());
}
return panel;
}
@Override
public void dispose() {
super.dispose();
if (panel != null) {
panel.dispose();
panel = null;
}
}
}
Implementing IAttributesShortcutAdapter
The following adapter class verifies that the object is a xsection triangle mesh layer, and vends the editor created earlier.
XSECTIONTRIANGLEMESHLAYERSHORTCUTADAPTER.JAVA
package com.interactive.intviewer.tmesh.editor.shortcut;
import com.interactive.intviewer.tmesh.layer2d.XSectionTriangleMeshLayer;
import com.interactive.intviewerapi.editors.IAttributesShortcutAdapter;
import com.interactive.intviewerapi.editors.IAttributesShortcutProvider;
import com.interactive.intviewerapi.editors.IAttributesShortcutProvider.IAttributesShortcutEditor;
public class XSectionTriangleMeshLayerShortcutAdapter implements IAttributesShortcutAdapter {
@Override
public Class<?> getSupportedClass() {
return XSectionTriangleMeshLayer.class;
}
@Override
public boolean canProcess(Object o) {
return (o instanceof XSectionTriangleMeshLayer);
}
@Override
public IAttributesShortcutProvider getProvider(Object o) {
if (o instanceof XSectionTriangleMeshLayer) {
return new TriangleMeshShortcutProvider((XSectionTriangleMeshLayer) o);
} else {
return null;
}
}
class TriangleMeshShortcutProvider implements IAttributesShortcutProvider {
private XSectionTriangleMeshLayer layer;
public TriangleMeshShortcutProvider(XSectionTriangleMeshLayer tmeshLayer) {
layer = tmeshLayer;
}
@Override
public IAttributesShortcutEditor[] getEditors() {
return new IAttributesShortcutEditor[]{new TriangleMeshLayerAttributesShortcutEditor(layer)};
}
}
}
Important: In the getSupportedClass method, indicate the implementation class, not the interface. To get the implementation class of a layer, use layer.getClass().
Registering the adapter
The following layer registration adds the adapter created earlier to the INTViewer desktop.
LAYER.XML
<folder name="ShortcutEditors">
<folder name="AttributesShortcut">
<file name="com-interactive-intviewer-tmesh-editor-shortcut-XSectionTriangleMeshLayerShortcutAdapter.instance"/>
</folder>
</folder>