package org.autoplot.renderer; import java.awt.BorderLayout; import java.awt.Color; import java.beans.PropertyChangeEvent; import java.util.LinkedHashMap; import java.util.Map; import org.das2.components.propertyeditor.ColorEditor; import org.das2.graph.Renderer; import org.jdesktop.beansbinding.AutoBinding.UpdateStrategy; import org.jdesktop.beansbinding.BeanProperty; import org.jdesktop.beansbinding.BindingGroup; import org.jdesktop.beansbinding.Bindings; import org.autoplot.PlotStylePanel.StylePanel; import org.autoplot.dom.PlotElement; import org.das2.components.propertyeditor.EnumerationEditor; import org.das2.graph.PsymConnector; /** * * @author faden@cottagesystems.com */ public class EventsStylePanel extends javax.swing.JPanel implements StylePanel { EnumerationEditor lineEditor; /** * Creates new form EventsStylePanel */ public EventsStylePanel() { initComponents(); colorEditor1= new ColorEditor(); colorEditor1.setValue(Color.BLACK); colorPanel.add( colorEditor1.getSmallEditor() ); colorEditor1.addPropertyChangeListener((PropertyChangeEvent evt) -> { update(); }); lineEditor = new EnumerationEditor(); lineEditor.addPropertyChangeListener((PropertyChangeEvent evt) -> { update(); }); lineEditor.setValue( PsymConnector.SOLID ); lineStylePanel.add(lineEditor.getCustomEditor(), BorderLayout.CENTER); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // //GEN-BEGIN:initComponents private void initComponents() { showLabelsCB = new javax.swing.JCheckBox(); jLabel1 = new javax.swing.JLabel(); fontSizeTF = new javax.swing.JTextField(); orbitModeCB = new javax.swing.JCheckBox(); ganttModeCB = new javax.swing.JCheckBox(); colorPanel = new javax.swing.JPanel(); colorCB = new javax.swing.JCheckBox(); jLabel10 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); lineStylePanel = new javax.swing.JPanel(); lineThickComboBox = new javax.swing.JComboBox<>(); opaqueCheckBox = new javax.swing.JCheckBox(); setBorder(javax.swing.BorderFactory.createTitledBorder("Events Bar")); showLabelsCB.setText("Show Labels"); showLabelsCB.setToolTipText("Show event labels along with bar."); showLabelsCB.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { showLabelsCBActionPerformed(evt); } }); jLabel1.setText("Font Size:"); jLabel1.setToolTipText("font size like \"16pt\" or where 0.5em is half the size of the parent font."); fontSizeTF.setText("1em"); fontSizeTF.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { fontSizeTFFocusLost(evt); } }); fontSizeTF.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { fontSizeTFActionPerformed(evt); } }); orbitModeCB.setText("Orbit Mode"); orbitModeCB.setToolTipText("Show the events in special orbit mode along the bottom with labels."); orbitModeCB.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { orbitModeCBActionPerformed(evt); } }); ganttModeCB.setText("Gantt Mode"); ganttModeCB.setToolTipText("Show events in a Gantt Chart, with instances enumerated along the vertical axis.\n"); ganttModeCB.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ganttModeCBActionPerformed(evt); } }); colorPanel.setLayout(new java.awt.BorderLayout()); colorCB.setText("Color:"); colorCB.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { colorCBActionPerformed(evt); } }); jLabel10.setText("Line Style:"); jLabel10.setToolTipText("style of the plot trace, or none"); jLabel3.setText("Line Thickness:"); jLabel3.setToolTipText("thickness of the plot trace"); lineStylePanel.setLayout(new java.awt.BorderLayout()); lineThickComboBox.setEditable(true); lineThickComboBox.setModel(new javax.swing.DefaultComboBoxModel<>(new String[] { "", "1pt", "0.5em", "1%" })); lineThickComboBox.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { lineThickComboBoxFocusLost(evt); } }); lineThickComboBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { lineThickComboBoxActionPerformed(evt); } }); opaqueCheckBox.setText("Opaque"); opaqueCheckBox.setToolTipText("By default events are drawn with some transparency, this instead makes them opaque."); opaqueCheckBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { opaqueCheckBoxActionPerformed(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() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(showLabelsCB) .addComponent(orbitModeCB) .addComponent(ganttModeCB) .addGroup(layout.createSequentialGroup() .addComponent(colorCB) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(colorPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 89, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(fontSizeTF, javax.swing.GroupLayout.PREFERRED_SIZE, 83, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel3) .addComponent(jLabel10) .addComponent(opaqueCheckBox)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lineStylePanel, javax.swing.GroupLayout.PREFERRED_SIZE, 125, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(lineThickComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) .addContainerGap(123, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(showLabelsCB) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(fontSizeTF, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(orbitModeCB) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(ganttModeCB) .addGap(6, 6, 6) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(colorPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(colorCB, javax.swing.GroupLayout.Alignment.TRAILING)) .addGap(2, 2, 2) .addComponent(opaqueCheckBox) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(lineStylePanel, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(layout.createSequentialGroup() .addGap(9, 9, 9) .addComponent(jLabel10))) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(lineThickComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(30, Short.MAX_VALUE)) ); }// //GEN-END:initComponents private void showLabelsCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showLabelsCBActionPerformed update(); }//GEN-LAST:event_showLabelsCBActionPerformed private void fontSizeTFActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fontSizeTFActionPerformed update(); }//GEN-LAST:event_fontSizeTFActionPerformed private void fontSizeTFFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_fontSizeTFFocusLost update(); }//GEN-LAST:event_fontSizeTFFocusLost private void orbitModeCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_orbitModeCBActionPerformed if ( orbitModeCB.isSelected() ) ganttModeCB.setSelected(false); update(); }//GEN-LAST:event_orbitModeCBActionPerformed private void ganttModeCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ganttModeCBActionPerformed if ( ganttModeCB.isSelected() ) orbitModeCB.setSelected(false); update(); }//GEN-LAST:event_ganttModeCBActionPerformed private void colorCBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_colorCBActionPerformed update(); }//GEN-LAST:event_colorCBActionPerformed private void lineThickComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lineThickComboBoxActionPerformed update(); }//GEN-LAST:event_lineThickComboBoxActionPerformed private void lineThickComboBoxFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_lineThickComboBoxFocusLost update(); }//GEN-LAST:event_lineThickComboBoxFocusLost private void opaqueCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_opaqueCheckBoxActionPerformed update(); }//GEN-LAST:event_opaqueCheckBoxActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox colorCB; private javax.swing.JPanel colorPanel; private javax.swing.JTextField fontSizeTF; private javax.swing.JCheckBox ganttModeCB; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel3; private javax.swing.JPanel lineStylePanel; private javax.swing.JComboBox lineThickComboBox; private javax.swing.JCheckBox opaqueCheckBox; private javax.swing.JCheckBox orbitModeCB; private javax.swing.JCheckBox showLabelsCB; // End of variables declaration//GEN-END:variables BindingGroup elementBindingContext; Renderer renderer; ColorEditor colorEditor1; private String control = ""; public static final String PROP_CONTROL = "control"; public String getControl() { return control; } /** * set the control string * @param control the control string, e.g. "levels=3,4,5&color=red" */ public void setControl(String control) { String oldControl = this.control; this.control = control; this.renderer.setControl(control); updateGUI(renderer); firePropertyChange(PROP_CONTROL, oldControl, control); } private void update() { String oldValue= this.control; Map controls= new LinkedHashMap(); controls.put( "fontSize", fontSizeTF.getText() ); controls.put( "showLabels", Renderer.encodeBooleanControl( showLabelsCB.isSelected() ) ); controls.put( "orbitMode", Renderer.encodeBooleanControl( orbitModeCB.isSelected() ) ); controls.put( "ganttMode", Renderer.encodeBooleanControl( ganttModeCB.isSelected() ) ); controls.put( Renderer.CONTROL_KEY_LINE_STYLE, Renderer.encodePlotSymbolConnectorControl( (PsymConnector) lineEditor.getCellEditorValue() ) ); controls.put("lineThick", lineThickComboBox.getSelectedItem().toString() ); if ( colorCB.isSelected() ) { controls.put( Renderer.CONTROL_KEY_COLOR, Renderer.encodeColorControl( (Color)colorEditor1.getValue() ) ); } controls.put("opaque", Renderer.encodeBooleanControl( opaqueCheckBox.isSelected() ) ); String c= Renderer.formatControl(controls); this.control= c; firePropertyChange( Renderer.PROP_CONTROL, oldValue, c ); } private void updateGUI( Renderer renderer ) { this.control= renderer.getControl(); fontSizeTF.setText( renderer.getControl("fontSize", "1em") ); lineThickComboBox.setSelectedItem( renderer.getControl("lineThick","") ); lineEditor.setAsText( renderer.getControl( Renderer.CONTROL_KEY_LINE_STYLE, lineEditor.getValue().toString() ) ); showLabelsCB.setSelected( renderer.getBooleanControl("showLabels", false) ); orbitModeCB.setSelected( renderer.getBooleanControl("orbitMode", false ) ); ganttModeCB.setSelected( renderer.getBooleanControl("ganttMode", false ) ); opaqueCheckBox.setSelected( renderer.getBooleanControl("opaque",false) ); if ( renderer.hasControl( Renderer.CONTROL_KEY_COLOR ) ) { colorCB.setSelected(true); colorEditor1.setValue( renderer.getColorControl( Renderer.CONTROL_KEY_COLOR, Color.BLACK ) ); } } @Override public void doElementBindings(PlotElement element) { this.renderer= element.getController().getRenderer(); updateGUI( renderer ); BindingGroup bc = new BindingGroup(); bc.addBinding( Bindings.createAutoBinding( UpdateStrategy.READ_WRITE, element, BeanProperty.create( PlotElement.PROP_RENDERCONTROL ), this, BeanProperty.create( Renderer.PROP_CONTROL ) ) ); if ( elementBindingContext!=null ) { releaseElementBindings(); } bc.bind(); repaint(); elementBindingContext= bc; } @Override public void releaseElementBindings() { if ( elementBindingContext!=null ) { elementBindingContext.unbind(); elementBindingContext= null; } } }