/** {@inheritDoc} */
 @Override
 public void loadAdditionalSettingsFrom(
     final NodeSettingsRO settings, final PortObjectSpec[] specs) throws NotConfigurableException {
   IntensityBins bins = null;
   try {
     bins = new IntensityBins(settings.getNodeSettings(IntensityBinnerNodeModel.KEY_BIN_SETTINGS));
   } catch (InvalidSettingsException e) {
     // TODO
     throw new NotConfigurableException(e.getMessage(), e);
   }
   m_intervalPanel.removeAllIntervalItems();
   for (int i = 0; i < bins.getNumBins(); i++) {
     double binValue = bins.getBinValue(i);
     boolean leftOpen = bins.isLeftOpen(i);
     double left = bins.getLeftValue(i);
     boolean rightOpen = bins.isRightOpen(i);
     double right = bins.getRightValue(i);
     IntervalItemPanel item =
         new IntervalItemPanel(
             m_intervalPanel, leftOpen, left, rightOpen, right, binValue, DoubleCell.TYPE);
     m_intervalPanel.addIntervalItem(item);
   }
   updateInfo();
   getPanel().validate();
   getPanel().repaint();
 }
 /**
  * Helper method to create the {@link IntensityBins}-object from the IntervalPanel.
  *
  * @return
  */
 private IntensityBins createPixelBins() {
   IntensityBins bins = new IntensityBins(m_intervalPanel.getNumIntervals());
   for (int j = 0; j < m_intervalPanel.getNumIntervals(); j++) {
     IntervalItemPanel p = m_intervalPanel.getInterval(j);
     bins.setBinAtIndex(
         j,
         p.getBinValue(),
         p.isLeftOpen(),
         p.getLeftValue(false),
         p.isRightOpen(),
         p.getRightValue(false));
   }
   return bins;
 }
 /**
  * Checks the current, previous, and next interval for consistency; and updates the intervals if
  * necessary.
  */
 public void updateInterval() {
   IntervalItemPanel prev = m_parent.getPrevious(this);
   IntervalItemPanel next = m_parent.getNext(this);
   if (prev == null && next == null) {
     this.setLeftValue(null);
     this.setRightValue(null);
     this.setLeftOpen(true);
     this.setRightOpen(true);
   } else {
     repairPrev(getLeftValue(true));
     repairNext(getRightValue(true));
   }
   myRepaint();
 }
 /** Helper method that determines the result pixel type and updates the info label. */
 private void updateInfo() {
   if (m_intervalPanel.getNumIntervals() > 0) {
     // determine the result pixel type
     // and update the info label
     m_info.setText(createPixelBins().getPixelType().getClass().getSimpleName());
   } else {
     m_info.setText("No bins specified.");
   }
 }
 /** {@inheritDoc} */
 @Override
 public void saveAdditionalSettingsTo(final NodeSettingsWO settings)
     throws InvalidSettingsException {
   if (m_intervalPanel.getNumIntervals() == 0) {
     throw new InvalidSettingsException("No pixel bins have been specified.");
   }
   createPixelBins()
       .saveToSettings(settings.addNodeSettings(IntensityBinnerNodeModel.KEY_BIN_SETTINGS));
 }
  /** Creates a new binner dialog. */
  public IntensityBinnerNodeDialog() {
    super(true);

    // panel in tab
    final JPanel intervalTabPanel = new JPanel(new BorderLayout());
    m_intervalPanel = new IntervalPanel(intervalTabPanel, DoubleCell.TYPE);

    // numeric column intervals
    m_intervalPanel.setBorder(BorderFactory.createTitledBorder("Intervals"));
    m_intervalPanel.setMinimumSize(new Dimension(350, 300));
    m_intervalPanel.setPreferredSize(new Dimension(350, 300));
    intervalTabPanel.add(m_intervalPanel, BorderLayout.CENTER);

    final JPanel infoPanel = new JPanel();
    infoPanel.setBorder(BorderFactory.createTitledBorder("Result Pixel Type"));
    m_info = new JLabel("");
    infoPanel.add(m_info);
    intervalTabPanel.add(infoPanel, BorderLayout.SOUTH);

    super.addTab(" Intervals ", intervalTabPanel);
    super.buildDialog();
  }
 private void repairNext(final double value) {
   IntervalItemPanel next = m_parent.getNext(this);
   if (next != null) {
     if (next.getLeftValue(false) != value) {
       next.setLeftValue(value);
       if (next.getRightValue(false) < value) {
         next.setRightValue(value);
       }
     }
     if (next.isLeftOpen() == isRightOpen()) {
       next.setLeftOpen(!isRightOpen());
     }
   } else {
     setRightValue(null);
     setRightOpen(true);
   }
 }
 private void repairPrev(final double value) {
   IntervalItemPanel prev = m_parent.getPrevious(this);
   if (prev != null) {
     if (prev.getRightValue(false) != value) {
       prev.setRightValue(value);
       if (prev.getLeftValue(false) > value) {
         prev.setLeftValue(value);
       }
     }
     if (prev.isRightOpen() == isLeftOpen()) {
       prev.setRightOpen(!isLeftOpen());
     }
   } else {
     setLeftValue(null);
     setLeftOpen(true);
   }
 }