/*
 * Copyright (c) 2014 Paul Scherrer Institute. All rights reserved.
 */

import ch.psi.pshell.device.Motor;
import ch.psi.pshell.ui.Panel;
import ch.psi.pshell.ui.Plugin;
import ch.psi.utils.State;
import ch.psi.utils.swing.SwingUtils;
import java.awt.Component;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.JCheckBox;
import javax.swing.SpinnerNumberModel;

/**
 *
 */
public class ManipulatorScan extends Panel {

    public ManipulatorScan() {
        initComponents();
    }

    //Overridable callbacks
    @Override
    public void onInitialize(int runCount) {
        comboMotorActionPerformed(null);
    }

    @Override
    public void onStateChange(State state, State former) {
        setEnabled(isEnabled());
    }

    @Override
    public void onExecutedFile(String fileName, Object result) {
    }

    @Override
    public void setEnabled(boolean value) {
        super.setEnabled(value);
        buttonAbort.setEnabled(value && getState().isInitialized());

        boolean enableControls = (value && (getState() == State.Ready));
        for (Component c : panelSensors.getComponents()) {
            c.setEnabled(enableControls);
        }
        for (Component c : panelPositioner.getComponents()) {
            c.setEnabled(enableControls);
        }
        buttonStart.setEnabled(enableControls);
        spinnerStepSize.setEnabled(enableControls && radioStepSize.isSelected());
        spinnerSteps.setEnabled(enableControls && radioSteps.isSelected());

        spinnerFrom.setEnabled(enableControls && radioAbsolute.isSelected());
        spinnerTo.setEnabled(enableControls && radioAbsolute.isSelected());
        spinnerRange.setEnabled(enableControls && !radioAbsolute.isSelected());

    }
    
    void updateTable(){
        
    }

    void startScan() throws Exception {
        HashMap<String, Object> args = new HashMap<>();
        args.put("MOTOR", comboMotor.getSelectedItem().toString());
        ArrayList<String> sensors = new ArrayList();
        for (Component c : panelSensors.getComponents()) {
            if ((c instanceof JCheckBox) && ((JCheckBox) c).isSelected()) {
                sensors.add(c.getName());
            }
        }
        args.put("SENSORS", sensors);
        if (radioRelative.isSelected()) {
            args.put("RANGE", new Double[]{-(Double) spinnerRange.getValue() / 2, (Double) spinnerRange.getValue() / 2});
        } else {
            args.put("RANGE", new Double[]{(Double) spinnerFrom.getValue(), (Double) spinnerTo.getValue()});
        }
        if (radioStepSize.isSelected()) {
            ArrayList<Double> steps = new ArrayList();
            steps.add((Double) spinnerStepSize.getValue());
            args.put("STEPS", steps);
        } else {
            args.put("STEPS", (Integer) spinnerSteps.getValue());
        }
        args.put("LATENCY", (Double) spinnerLatency.getValue());
        args.put("RELATIVE", radioRelative.isSelected());
        
        runAsync("ManipulatorScan", args);

        /*
         getContext().setExecutingContext("manip_scan");
         String scan ="lscan(" + comboMotor.getSelectedItem().toString() + ", ( " ; 
         for (Component c : panelSensors.getComponents()) {
         if ((c instanceof JCheckBox) && ((JCheckBox)c).isSelected())
         scan += c.getName() + ", ";
         }          
         scan+="), ";
         if (radioRelative.isSelected()){
         double halfRange = (Double)spinnerRange.getValue()/2;
         scan+= (-halfRange) + ", " + (halfRange)+ ", ";
         } else {
         Double from = (Double)spinnerFrom.getValue();
         Double to = (Double)spinnerTo.getValue();

         if (to <= from){
         throw new Exception ("Invalid range");
         }
         scan+= from + ", " + to + ", ";
         }

         scan+= (radioStepSize.isSelected()) ? "(" +((Double)spinnerStepSize.getValue())+",)" :((Integer)spinnerSteps.getValue());
         scan+=", " + (Double)spinnerLatency.getValue() + ", ";
         if (radioRelative.isSelected()){
         scan+="True, "; //Relative            
         }
         scan+="before_read=trig_scienta)"; //Relative   

         if (checkImageIntegration.isSelected()){
         scan = "set_preference(Preference.PLOT_TYPES,{'integration':1}); " + scan;
         }

         evalAsync(scan);
         */
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonGroup1 = new javax.swing.ButtonGroup();
        buttonGroup2 = new javax.swing.ButtonGroup();
        panelPositioner = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        comboMotor = new javax.swing.JComboBox();
        motorPanel = new ch.psi.pshell.swing.MotorReadoutPanel();
        txtSize = new javax.swing.JLabel();
        spinnerRange = new javax.swing.JSpinner();
        radioStepSize = new javax.swing.JRadioButton();
        radioSteps = new javax.swing.JRadioButton();
        spinnerStepSize = new javax.swing.JSpinner();
        spinnerSteps = new javax.swing.JSpinner();
        jLabel3 = new javax.swing.JLabel();
        spinnerLatency = new javax.swing.JSpinner();
        radioAbsolute = new javax.swing.JRadioButton();
        spinnerFrom = new javax.swing.JSpinner();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        spinnerTo = new javax.swing.JSpinner();
        radioRelative = new javax.swing.JRadioButton();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        panelSensors = new javax.swing.JPanel();
        checkImage = new javax.swing.JCheckBox();
        checkImageIntegration = new javax.swing.JCheckBox();
        checkSpectrum = new javax.swing.JCheckBox();
        checkCounts1 = new javax.swing.JCheckBox();
        checkTotalCount = new javax.swing.JCheckBox();
        checkCounts2 = new javax.swing.JCheckBox();
        checkCounts3 = new javax.swing.JCheckBox();
        checkCounts4 = new javax.swing.JCheckBox();
        checkCurrent = new javax.swing.JCheckBox();
        checkCur1 = new javax.swing.JCheckBox();
        checkCur2 = new javax.swing.JCheckBox();
        checkCur3 = new javax.swing.JCheckBox();
        buttonScientaSetup = new javax.swing.JButton();
        jPanel3 = new javax.swing.JPanel();
        buttonStart = new javax.swing.JButton();
        buttonAbort = new javax.swing.JButton();

        panelPositioner.setBorder(javax.swing.BorderFactory.createTitledBorder("Positioner"));

        jLabel1.setText("Motor:");

        comboMotor.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "motor", "x", "y", "z", "theta", "tilt", "phi" }));
        comboMotor.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                comboMotorActionPerformed(evt);
            }
        });

        txtSize.setText("Size:");

        spinnerRange.setModel(new javax.swing.SpinnerNumberModel(1.0d, 0.001d, 100.0d, 1.0d));
        spinnerRange.setEnabled(false);

        buttonGroup1.add(radioStepSize);
        radioStepSize.setSelected(true);
        radioStepSize.setText("Step Size");
        radioStepSize.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioStepSizeActionPerformed(evt);
            }
        });

        buttonGroup1.add(radioSteps);
        radioSteps.setText("Number of Steps");
        radioSteps.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioStepSizeActionPerformed(evt);
            }
        });

        spinnerStepSize.setModel(new javax.swing.SpinnerNumberModel(0.1d, 0.001d, 10.0d, 0.1d));

        spinnerSteps.setModel(new javax.swing.SpinnerNumberModel(10, 1, 1000, 1));
        spinnerSteps.setEnabled(false);

        jLabel3.setText("Latency(s):");

        spinnerLatency.setModel(new javax.swing.SpinnerNumberModel(0.0d, 0.0d, 10.0d, 0.1d));

        buttonGroup2.add(radioAbsolute);
        radioAbsolute.setSelected(true);
        radioAbsolute.setText("Absolute Scan");
        radioAbsolute.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioAbsoluteActionPerformed(evt);
            }
        });

        spinnerFrom.setModel(new javax.swing.SpinnerNumberModel(1.0d, 0.0d, 1.0d, 1.0d));

        jLabel4.setText("From:");

        jLabel5.setText("To:");

        spinnerTo.setModel(new javax.swing.SpinnerNumberModel(1.0d, 0.0d, 1.0d, 1.0d));

        buttonGroup2.add(radioRelative);
        radioRelative.setText("Relative Scan");
        radioRelative.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                radioAbsoluteActionPerformed(evt);
            }
        });

        jLabel6.setText("Position:");

        jLabel7.setText("Range:");

        jLabel8.setText("Steps:");

        javax.swing.GroupLayout panelPositionerLayout = new javax.swing.GroupLayout(panelPositioner);
        panelPositioner.setLayout(panelPositionerLayout);
        panelPositionerLayout.setHorizontalGroup(
            panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelPositionerLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(radioSteps, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(panelPositionerLayout.createSequentialGroup()
                        .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel6)
                            .addComponent(jLabel1))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(motorPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(comboMotor, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                    .addGroup(panelPositionerLayout.createSequentialGroup()
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 85, Short.MAX_VALUE)
                        .addComponent(spinnerLatency, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelPositionerLayout.createSequentialGroup()
                        .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(radioStepSize)
                            .addComponent(radioAbsolute)
                            .addComponent(radioRelative))
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPositionerLayout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPositionerLayout.createSequentialGroup()
                                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(jLabel4)
                                    .addComponent(jLabel5)
                                    .addComponent(jLabel7))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                    .addComponent(spinnerFrom, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(spinnerRange, javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addComponent(spinnerTo, javax.swing.GroupLayout.Alignment.TRAILING)))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPositionerLayout.createSequentialGroup()
                                .addComponent(jLabel8)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(spinnerSteps, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPositionerLayout.createSequentialGroup()
                                .addComponent(txtSize)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(spinnerStepSize, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                .addContainerGap())
        );

        panelPositionerLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spinnerLatency, spinnerRange, spinnerStepSize, spinnerSteps});

        panelPositionerLayout.setVerticalGroup(
            panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelPositionerLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(comboMotor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                    .addComponent(jLabel6)
                    .addComponent(motorPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(radioAbsolute)
                .addGap(3, 3, 3)
                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(spinnerFrom, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4))
                .addGap(3, 3, 3)
                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(spinnerTo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5))
                .addGap(18, 18, 18)
                .addComponent(radioRelative)
                .addGap(1, 1, 1)
                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(spinnerRange, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel7))
                .addGap(18, 18, 18)
                .addComponent(radioStepSize)
                .addGap(0, 0, 0)
                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(spinnerStepSize, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(txtSize))
                .addGap(12, 12, 12)
                .addComponent(radioSteps)
                .addGap(0, 0, 0)
                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(spinnerSteps, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel8))
                .addGap(18, 18, 18)
                .addGroup(panelPositionerLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(spinnerLatency, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        panelSensors.setBorder(javax.swing.BorderFactory.createTitledBorder("Sensors"));

        checkImage.setSelected(true);
        checkImage.setText("Scienta Image");
        checkImage.setToolTipText("");
        checkImage.setContentAreaFilled(false);
        checkImage.setName("det.dataMatrix"); // NOI18N

        checkImageIntegration.setSelected(true);
        checkImageIntegration.setText("Scienta Image Integration");
        checkImageIntegration.setToolTipText("");
        checkImageIntegration.setContentAreaFilled(false);
        checkImageIntegration.setName("integration"); // NOI18N

        checkSpectrum.setSelected(true);
        checkSpectrum.setText("Scienta Spectrum");
        checkSpectrum.setName("scienta.spectrum"); // NOI18N

        checkCounts1.setText("Counts Region 1");
        checkCounts1.setName("countsr1"); // NOI18N

        checkTotalCount.setSelected(true);
        checkTotalCount.setText("Total Counts");
        checkTotalCount.setName("scienta.stats[0]"); // NOI18N

        checkCounts2.setText("Counts Region 2");
        checkCounts2.setName("countsr2"); // NOI18N

        checkCounts3.setText("Counts Region 3");
        checkCounts3.setName("countsr3"); // NOI18N

        checkCounts4.setText("Counts Region 4");
        checkCounts4.setName("countsr4"); // NOI18N

        checkCurrent.setText("Current");
        checkCurrent.setName("current"); // NOI18N

        checkCur1.setText("Cur 1");
        checkCur1.setName("cur1"); // NOI18N

        checkCur2.setText("Cur 2");
        checkCur2.setName("cur2"); // NOI18N

        checkCur3.setText("Cur 3");
        checkCur3.setName("cur3"); // NOI18N

        buttonScientaSetup.setText("Scienta Setup");
        buttonScientaSetup.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonScientaSetupActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelSensorsLayout = new javax.swing.GroupLayout(panelSensors);
        panelSensors.setLayout(panelSensorsLayout);
        panelSensorsLayout.setHorizontalGroup(
            panelSensorsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelSensorsLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelSensorsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(buttonScientaSetup, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(panelSensorsLayout.createSequentialGroup()
                        .addGroup(panelSensorsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(checkImage)
                            .addComponent(checkImageIntegration)
                            .addComponent(checkSpectrum)
                            .addComponent(checkCounts1)
                            .addComponent(checkTotalCount)
                            .addComponent(checkCounts2)
                            .addComponent(checkCounts3)
                            .addComponent(checkCurrent)
                            .addComponent(checkCur1)
                            .addComponent(checkCur2)
                            .addComponent(checkCur3)
                            .addComponent(checkCounts4))
                        .addGap(0, 52, Short.MAX_VALUE)))
                .addContainerGap())
        );
        panelSensorsLayout.setVerticalGroup(
            panelSensorsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelSensorsLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(checkImage)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkImageIntegration)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkSpectrum)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkTotalCount)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkCounts1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkCounts2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkCounts3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkCounts4)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkCurrent)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkCur1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkCur2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(checkCur3)
                .addGap(18, 18, Short.MAX_VALUE)
                .addComponent(buttonScientaSetup)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Scan Control"));

        buttonStart.setText("Start");
        buttonStart.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonStartActionPerformed(evt);
            }
        });

        buttonAbort.setText("Abort");
        buttonAbort.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                buttonAbortActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(buttonStart, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(buttonAbort, javax.swing.GroupLayout.DEFAULT_SIZE, 203, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(buttonStart)
                .addGap(18, 18, 18)
                .addComponent(buttonAbort)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        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(panelSensors, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(panelPositioner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jPanel3, panelPositioner, panelSensors});

        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(panelPositioner, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(panelSensors, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void buttonScientaSetupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonScientaSetupActionPerformed
        try {
            showDevicePanel("scienta");
        } catch (Exception ex) {
            SwingUtils.showException(this, ex);
        }
    }//GEN-LAST:event_buttonScientaSetupActionPerformed

    private void buttonStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonStartActionPerformed
        try {
            startScan();
        } catch (Exception ex) {
            SwingUtils.showException(this, ex);
        }
    }//GEN-LAST:event_buttonStartActionPerformed

    private void buttonAbortActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonAbortActionPerformed
        abort();
    }//GEN-LAST:event_buttonAbortActionPerformed

    private void radioStepSizeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioStepSizeActionPerformed
        setEnabled(isEnabled());
    }//GEN-LAST:event_radioStepSizeActionPerformed

    private void comboMotorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_comboMotorActionPerformed
        try {
            Motor motor = (Motor) getDevice(comboMotor.getSelectedItem().toString());
            motorPanel.setDevice(motor);
            spinnerFrom.setModel(new SpinnerNumberModel(motor.getMinValue(), motor.getMinValue(), motor.getMaxValue(), 1.0));
            spinnerTo.setModel(new SpinnerNumberModel(motor.getMaxValue(), motor.getMinValue(), motor.getMaxValue(), 1.0));
            txtSize.setText("Size (" + motor.getUnit() +")");
            //spinnerFrom.setModel(new javax.swing.SpinnerNumberModel(3.0, 0.001, 100.0, 1.0));
            //spinnerTo.setModel(new javax.swing.SpinnerNumberModel(2.0, 0.001, 100.0, 1.0));
        } catch (Exception ex) {
            SwingUtils.showException(this, ex);
        }
    }//GEN-LAST:event_comboMotorActionPerformed

    private void radioAbsoluteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_radioAbsoluteActionPerformed
        setEnabled(isEnabled());
    }//GEN-LAST:event_radioAbsoluteActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton buttonAbort;
    private javax.swing.ButtonGroup buttonGroup1;
    private javax.swing.ButtonGroup buttonGroup2;
    private javax.swing.JButton buttonScientaSetup;
    private javax.swing.JButton buttonStart;
    private javax.swing.JCheckBox checkCounts1;
    private javax.swing.JCheckBox checkCounts2;
    private javax.swing.JCheckBox checkCounts3;
    private javax.swing.JCheckBox checkCounts4;
    private javax.swing.JCheckBox checkCur1;
    private javax.swing.JCheckBox checkCur2;
    private javax.swing.JCheckBox checkCur3;
    private javax.swing.JCheckBox checkCurrent;
    private javax.swing.JCheckBox checkImage;
    private javax.swing.JCheckBox checkImageIntegration;
    private javax.swing.JCheckBox checkSpectrum;
    private javax.swing.JCheckBox checkTotalCount;
    private javax.swing.JComboBox comboMotor;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JPanel jPanel3;
    private ch.psi.pshell.swing.MotorReadoutPanel motorPanel;
    private javax.swing.JPanel panelPositioner;
    private javax.swing.JPanel panelSensors;
    private javax.swing.JRadioButton radioAbsolute;
    private javax.swing.JRadioButton radioRelative;
    private javax.swing.JRadioButton radioStepSize;
    private javax.swing.JRadioButton radioSteps;
    private javax.swing.JSpinner spinnerFrom;
    private javax.swing.JSpinner spinnerLatency;
    private javax.swing.JSpinner spinnerRange;
    private javax.swing.JSpinner spinnerStepSize;
    private javax.swing.JSpinner spinnerSteps;
    private javax.swing.JSpinner spinnerTo;
    private javax.swing.JLabel txtSize;
    // End of variables declaration//GEN-END:variables
}
