/**
	 * Stores the values of the spinners in the {@link BookView model}.
	 * In order to do it
	 * <ul>
	 * <li>commits the edited values to all spinners,</li>
	 * <li>sets the {@link BookPlot#setZoom(double, double, double, double)
	 * zoom} in the {@link BookPlot book plot},</li>
	 * <li>sets the {@link ZoomBookTool#setPreserveRatio(boolean) preserve
	 * ratio} in the {@link ZoomBookTool}.</li></ul>
	 * @param view the model
	 */
	public void fillModelFromPanel(BookView view) {

		BookPlot plot = view.getPlot();
		StandardBookSegment segment = plot.getSegment();

		if (segment == null) {
			return;
		}

		// XXX update broken spinners...
		try {
			getMinPositionSpinner().commitEdit();
		} catch (ParseException ex) {
			JComponent editor = getMinPositionSpinner().getEditor();
			if (editor instanceof DefaultEditor) {
				((DefaultEditor) editor).getTextField().setValue(getMinPositionSpinner().getValue());
			}
		}

		try {
			getMaxPositionSpinner().commitEdit();
		} catch (ParseException ex) {
			JComponent editor = getMaxPositionSpinner().getEditor();
			if (editor instanceof DefaultEditor) {
				((DefaultEditor) editor).getTextField().setValue(getMaxPositionSpinner().getValue());
			}
		}

		try {
			getMinFrequencySpinner().commitEdit();
		} catch (ParseException ex) {
			JComponent editor = getMinFrequencySpinner().getEditor();
			if (editor instanceof DefaultEditor) {
				((DefaultEditor) editor).getTextField().setValue(getMinFrequencySpinner().getValue());
			}
		}

		try {
			getMaxFrequencySpinner().commitEdit();
		} catch (ParseException ex) {
			JComponent editor = getMaxFrequencySpinner().getEditor();
			if (editor instanceof DefaultEditor) {
				((DefaultEditor) editor).getTextField().setValue(getMaxFrequencySpinner().getValue());
			}
		}

		double minPosition = ((Number) getMinPositionSpinner().getValue()).doubleValue();
		double maxPosition = ((Number) getMaxPositionSpinner().getValue()).doubleValue();
		double minFrequency = ((Number) getMinFrequencySpinner().getValue()).doubleValue();
		double maxFrequency = ((Number) getMaxFrequencySpinner().getValue()).doubleValue();

		plot.setZoom(minPosition, maxPosition, minFrequency, maxFrequency);

		view.getZoomBookTool().setPreserveRatio(getPreserveRatioCheckBox().isSelected());

	}
  /** @param model */
  public DoubleWidget(PropertyModel model, AbstractController controller) {
    super(model, controller);

    double min, max, inc;
    if (model.hasValueForParameter(MIN_VALUE_PARAM)) {
      min = model.getDoubleValueForParameter(MIN_VALUE_PARAM);
    } else {
      min = DEFAULT_MIN_VALUE;
    }
    if (model.hasValueForParameter(MAX_VALUE_PARAM)) {
      max = model.getDoubleValueForParameter(MAX_VALUE_PARAM);
    } else {
      max = DEFAULT_MAX_VALUE;
    }
    if (model.hasValueForParameter(INCREMENT_VALUE_PARAM)) {
      inc = model.getDoubleValueForParameter(INCREMENT_VALUE_PARAM);
    } else {
      inc = DEFAULT_INC_VALUE;
    }

    SpinnerNumberModel valueModel = new SpinnerNumberModel(min, min, max, inc);
    valueChooser = new JSpinner(valueModel);
    valueChooser.setEditor(new JSpinner.NumberEditor(valueChooser /*, "#.##"*/));
    valueChooser.addChangeListener(
        new ChangeListener() {
          @Override
          public void stateChanged(ChangeEvent e) {
            if (e.getSource() == valueChooser) {
              updateModelFromWidget();
            }
          }
        });
    valueChooser.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
    JComponent editor = valueChooser.getEditor();
    if (editor instanceof DefaultEditor) {
      ((DefaultEditor) editor).getTextField().setHorizontalAlignment(SwingConstants.LEFT);
      if (ToolBox.getPLATFORM() != ToolBox.MACOS) {
        ((DefaultEditor) editor)
            .getTextField()
            .setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 0));
      }
    }
    if (model.hasValueForParameter(READONLY_TEXTFIELD)
        && model.getBooleanValueForParameter(READONLY_TEXTFIELD)) {
      valueChooser.setEnabled(false);
    }

    getDynamicComponent().addFocusListener(new WidgetFocusListener(this));
  }