From e4afa7961e751b895478e0d473cb1446eeccb464 Mon Sep 17 00:00:00 2001 From: kruland2607 Date: Wed, 9 Oct 2013 14:00:33 -0500 Subject: [PATCH] Fixed jdk7 problem in Multislider and NPE when there is no motor in the ThrustCurveMotorSelectionPanel. --- .../ThrustCurveMotorSelectionPanel.java | 13 +- .../openrocket/gui/widgets/MultiSlider.java | 965 +++++++++--------- 2 files changed, 498 insertions(+), 480 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java index e12b07dd9..e0eb134d1 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/motor/thrustcurve/ThrustCurveMotorSelectionPanel.java @@ -95,7 +95,7 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec private final JComboBox curveSelectionBox; private final DefaultComboBoxModel curveSelectionModel; private final JComboBox delayBox; - + private final MotorInformationPanel motorInformationPanel; private final MotorFilterPanel motorFilterPanel; @@ -140,7 +140,7 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec scrollSelectionVisible(); } }; - + } //// GUI @@ -303,7 +303,7 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec // Vertical split this.add(new JSeparator(JSeparator.VERTICAL), "growy, gap para para"); - + JTabbedPane rightSide = new JTabbedPane(); rightSide.add(trans.get("TCMotorSelPan.btn.filter"), motorFilterPanel); rightSide.add(trans.get("TCMotorSelPan.btn.details"), motorInformationPanel); @@ -323,7 +323,7 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec if ( mount != null ) { diameter = mount.getMotorMountDiameter(); } - + if (currentConfig != null && mount != null) { MotorConfiguration motorConf = mount.getMotorConfiguration().get(currentConfig); selectedMotor = (ThrustCurveMotor) motorConf.getMotor(); @@ -454,14 +454,14 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec curveSelectionBox.setEnabled(false); curveSelectionLabel.setEnabled(false); } - + motorInformationPanel.updateData(motors, selectedMotor); } List getFilteredCurves() { List motors = selectedMotorSet.getMotors(); - if (hideSimilarBox.isSelected()) { + if (hideSimilarBox.isSelected() && selectedMotor != null) { List filtered = new ArrayList(motors.size()); for (int i = 0; i < motors.size(); i++) { ThrustCurveMotor m = motors.get(i); @@ -469,7 +469,6 @@ public class ThrustCurveMotorSelectionPanel extends JPanel implements MotorSelec filtered.add(m); continue; } - double similarity = MotorCorrelation.similarity(selectedMotor, m); log.debug("Motor similarity: " + similarity); if (similarity < MOTOR_SIMILARITY_THRESHOLD) { diff --git a/swing/src/net/sf/openrocket/gui/widgets/MultiSlider.java b/swing/src/net/sf/openrocket/gui/widgets/MultiSlider.java index 5b956c5a6..544b91287 100644 --- a/swing/src/net/sf/openrocket/gui/widgets/MultiSlider.java +++ b/swing/src/net/sf/openrocket/gui/widgets/MultiSlider.java @@ -48,505 +48,524 @@ import javax.swing.plaf.SliderUI; */ public class MultiSlider extends JSlider { - /*** - * @see #getUIClassID - * @see #readObject - */ - private static final String uiClassID = "MultiSliderUI"; + /*** + * @see #getUIClassID + * @see #readObject + */ + private static final String uiClassID = "MultiSliderUI"; - /*** - * An array of data models that handle the numeric maximum values, - * minimum values, and current-position values for the multi slider. - */ - private BoundedRangeModel[] sliderModels; + /*** + * An array of data models that handle the numeric maximum values, + * minimum values, and current-position values for the multi slider. + */ + private BoundedRangeModel[] sliderModels; - /*** - * If it is true, a thumb is bounded by adjacent thumbs. - */ - private boolean bounded = false; + /*** + * If it is true, a thumb is bounded by adjacent thumbs. + */ + private boolean bounded = false; - /*** - * This is a color to paint the current thumb - */ - private Color currentThumbColor = Color.red; + /*** + * This is a color to paint the current thumb + */ + private Color currentThumbColor = Color.red; - transient private int valueBeforeStateChange; + transient private int valueBeforeStateChange; - /*** - * Creates a slider with the specified orientation and the - * specified mimimum, maximum, and initial values. - * - * @exception IllegalArgumentException if orientation is not one of VERTICAL, HORIZONTAL - * - * @see #setOrientation - * @see #setMinimum - * @see #setMaximum - * @see #setValue - */ - public MultiSlider(int orientation, int min, int max, - int val1, int val2) { - checkOrientation(orientation); - this.orientation = orientation; - setNumberOfThumbs(min,max,new int[]{val1,val2}); - } - - /*** - * Creates a slider with the specified orientation and the - * specified mimimum, maximum, and the number of thumbs. - * - * @exception IllegalArgumentException if orientation is not one of VERTICAL, HORIZONTAL - * - * @see #setOrientation - * @see #setMinimum - * @see #setMaximum - * @see #setValue - */ - public MultiSlider(int orientation, int min, int max) { - checkOrientation(orientation); - this.orientation = orientation; - setNumberOfThumbs(min, max, 2); - } - - /*** - * Creates a horizontal slider with the range 0 to 100 and - * an intitial value of 50. - */ - public MultiSlider() { - this(HORIZONTAL, 0, 100); - } - - - /*** - * Creates a slider using the specified orientation with the - * range 0 to 100 and an intitial value of 50. - */ - public MultiSlider(int orientation) { - this(orientation, 0, 100); - } - - - /*** - * Creates a horizontal slider using the specified min and max - * with an intitial value of 50. - */ - public MultiSlider(int min, int max) { - this(HORIZONTAL, min, max); - } - - public void setCurrentThumbColor(Color c) { - this.currentThumbColor = c; - } - - public Color getCurrentThumbColor() { - return this.currentThumbColor; - } - - public int getTrackBuffer() { - return ((MultiSliderUI) this.ui).getTrackBuffer(); - } - - /*** - * Validates the orientation parameter. - */ - private void checkOrientation(int orientation) { - switch (orientation) { - case VERTICAL: - case HORIZONTAL: - break; - default: - throw new IllegalArgumentException("orientation must be one of: VERTICAL, HORIZONTAL"); - } - } - - /*** - * Notification from the UIFactory that the L&F has changed. - * Called to replace the UI with the latest version from the - * default UIFactory. - * - * @see JComponent#updateUI - */ - public void updateUI() { - updateLabelUIs(); - MultiSliderUI ui = new MultiSliderUI(); - if (this.sliderModels != null) { - ui.setThumbCount(this.sliderModels.length); - } - setUI((SliderUI) ui); - } - - /*** - * Returns the number of thumbs in the slider. - */ - public int getNumberOfThumbs() { - return this.sliderModels.length; - } - - /*** - * Sets the number of thumbs with the specified parameters. - */ - private void setNumberOfThumbs(int min, int max, int num, boolean useEndPoints) { - int [] values = createDefaultValues(min, max, num, useEndPoints); - setNumberOfThumbs(min, max, values); - } - - /*** - * Sets the number of thumbs with the specified parameters. - */ - private void setNumberOfThumbs(int min, int max, int num) { - setNumberOfThumbs(min, max, num, false); - } - - /*** - * Sets the number of thumbs with the specified parameters. - */ - private void setNumberOfThumbs(int min, int max, int[] values) { - if (values == null || values.length < 1) { - values = new int[] {50}; - } - int num = values.length; - this.sliderModels = new BoundedRangeModel[num]; - for (int i = 0; i < num; i++) { - this.sliderModels[i] = new DefaultBoundedRangeModel(values[i], 0, min, max); - this.sliderModels[i].addChangeListener(changeListener); - } - updateUI(); - } - - /*** - * Sets the number of thumbs. - */ - private void setNumberOfThumbs(int num) { - setNumberOfThumbs(num, false); - } - - /*** - * Sets the number of thumbs. - */ - private void setNumberOfThumbs(int num, boolean useEndPoints) { - if (getNumberOfThumbs() != num) { - setNumberOfThumbs(getMinimum(), getMaximum(), num, useEndPoints); - } - } - - /*** - * Sets the number of thumbs by specifying the initial values. - */ - private void setNumberOfThumbs(int[] values) { - setNumberOfThumbs(getMinimum(), getMaximum(), values); - } - - /*** - * creates evenly spaced values for thumbs. - */ - private int[] createDefaultValues(int min, int max, int num_of_values, boolean useEndPoints) { - int[] values = new int[num_of_values]; - int range = max - min; - - if (!useEndPoints) { - int step = range / (num_of_values + 1); - for (int i = 0; i < num_of_values; i++) { - values[i] = min + (i + 1) * step; - } - } else { - if (num_of_values < 1) { - return new int[0]; - } - values[0] = getMinimum(); - values[num_of_values - 1] = getMaximum(); - int[] def = createDefaultValues(getMinimum(), getMaximum(), num_of_values - 2, false); - for (int i = 0; i < def.length; i++) { - values[i + 1] = def[i]; - } - } - return values; - } - - /*** - * Returns the index number of currently operated thumb. - */ - public int getCurrentThumbIndex() { - return ((MultiSliderUI)ui).getCurrentIndex(); - } - - /*** - * Returns data model that handles the sliders three - * fundamental properties: minimum, maximum, value. - * - * @see #setModel - */ - public BoundedRangeModel getModel() { - return getModelAt(getCurrentThumbIndex()); - } - - /*** - * Returns data model that handles the sliders three - * fundamental properties: minimum, maximum, value. - * - * @see #setModel - */ - public BoundedRangeModel getModelAt(int index) { - if (this.sliderModels == null || index >= this.sliderModels.length) { - return null; - } - return this.sliderModels[index]; - } - - /*** - * Returns data model that handles the sliders three - * fundamental properties: minimum, maximum, value. - * - * @see #setModel - */ - public BoundedRangeModel[] getModels() { - return this.sliderModels; - } - - /*** - * Sets the model that handles the sliders three - * fundamental properties: minimum, maximum, value. - * - * @see #getModel - * @beaninfo - * bound: true - * description: The sliders BoundedRangeModel. - */ - public void setModel(BoundedRangeModel newModel) { - setModelAt(getCurrentThumbIndex(), newModel); - } - - /*** - * Sets the model that handles the sliders three - * fundamental properties: minimum, maximum, value. - * - * @see #getModel - * @beaninfo - * bound: true - * description: The sliders BoundedRangeModel. - */ - public void setModelAt(int index, BoundedRangeModel newModel) { - BoundedRangeModel oldModel = getModelAt(index); - - if (oldModel != null) { - oldModel.removeChangeListener(changeListener); + /*** + * Creates a slider with the specified orientation and the + * specified mimimum, maximum, and initial values. + * + * @exception IllegalArgumentException if orientation is not one of VERTICAL, HORIZONTAL + * + * @see #setOrientation + * @see #setMinimum + * @see #setMaximum + * @see #setValue + */ + public MultiSlider(int orientation, int min, int max, + int val1, int val2) { + checkOrientation(orientation); + this.orientation = orientation; + setNumberOfThumbs(min,max,new int[]{val1,val2}); } - this.sliderModels[index] = newModel; - - if (newModel != null) { - newModel.addChangeListener(changeListener); - - if (accessibleContext != null) { - accessibleContext.firePropertyChange( - AccessibleContext.ACCESSIBLE_VALUE_PROPERTY, - (oldModel == null - ? null : new Integer(oldModel.getValue())), - (newModel == null - ? null : new Integer(newModel.getValue()))); - } + /*** + * Creates a slider with the specified orientation and the + * specified mimimum, maximum, and the number of thumbs. + * + * @exception IllegalArgumentException if orientation is not one of VERTICAL, HORIZONTAL + * + * @see #setOrientation + * @see #setMinimum + * @see #setMaximum + * @see #setValue + */ + public MultiSlider(int orientation, int min, int max) { + checkOrientation(orientation); + this.orientation = orientation; + setNumberOfThumbs(min, max, 2); } - firePropertyChange("model", oldModel, this.sliderModels[index]); - } - - /*** - * Sets the models minimum property. - * - * @see #getMinimum - * @see BoundedRangeModel#setMinimum - * @beaninfo - * bound: true - * preferred: true - * description: The sliders minimum value. - */ - public void setMinimum(int minimum) { - int count = getNumberOfThumbs(); - int oldMin = getModel().getMinimum(); - for (int i = 0; i < count; i++) { - getModelAt(i).setMinimum(minimum); + /*** + * Creates a horizontal slider with the range 0 to 100 and + * an intitial value of 50. + */ + public MultiSlider() { + this(HORIZONTAL, 0, 100); } - firePropertyChange( "minimum", new Integer( oldMin ), new Integer( minimum ) ); - } - /*** - * Sets the models maximum property. - * - * @see #getMaximum - * @see BoundedRangeModel#setMaximum - * @beaninfo - * bound: true - * preferred: true - * description: The sliders maximum value. - */ - public void setMaximum(int maximum) { - int count = getNumberOfThumbs(); - int oldMax = getModel().getMaximum(); - for (int i = 0; i < count; i++) { - getModelAt(i).setMaximum(maximum); + + /*** + * Creates a slider using the specified orientation with the + * range 0 to 100 and an intitial value of 50. + */ + public MultiSlider(int orientation) { + this(orientation, 0, 100); } - firePropertyChange( "maximum", new Integer( oldMax ), new Integer( maximum ) ); - } - /*** - * Returns the sliders value. - * @return the models value property - * @see #setValue - */ - public int getValue() { - return getValueAt(getCurrentThumbIndex()); - } - /*** - * Returns the sliders value. - * @return the models value property - * @see #setValue - */ - public int getValueAt(int index) { - return getModelAt(index).getValue(); - } - - /*** - * Sets the sliders current value. This method just forwards - * the value to the model. - * - * @see #getValue - * @beaninfo - * preferred: true - * description: The sliders current value. - */ - public void setValue(int n) { - setValueAt(getCurrentThumbIndex(), n); - } - - /*** - * Sets the sliders current value. This method just forwards - * the value to the model. - * - * @see #getValue - * @beaninfo - * preferred: true - * description: The sliders current value. - */ - public void setValueAt(int index, int n) { - BoundedRangeModel m = getModelAt(index); - int oldValue = m.getValue(); - m.setValue(n); - - if (accessibleContext != null) { - accessibleContext.firePropertyChange( - AccessibleContext.ACCESSIBLE_VALUE_PROPERTY, - new Integer(oldValue), - new Integer(m.getValue())); + /*** + * Creates a horizontal slider using the specified min and max + * with an intitial value of 50. + */ + public MultiSlider(int min, int max) { + this(HORIZONTAL, min, max); } - } - /*** - * True if the slider knob is being dragged. - * - * @return the value of the models valueIsAdjusting property - * @see #setValueIsAdjusting - */ - public boolean getValueIsAdjusting() { - boolean result = false; - int count = getNumberOfThumbs(); - for (int i = 0; i < count; i++) { - result = (result || getValueIsAdjustingAt(i)); + public void setCurrentThumbColor(Color c) { + this.currentThumbColor = c; } - return result; - } - /*** - * True if the slider knob is being dragged. - */ - public boolean getValueIsAdjustingAt(int index) { - return getModelAt(index).getValueIsAdjusting(); - } - - /*** - * Sets the models valueIsAdjusting property. Slider look and - * feel implementations should set this property to true when - * a knob drag begins, and to false when the drag ends. The - * slider model will not generate ChangeEvents while - * valueIsAdjusting is true. - * - * @see #getValueIsAdjusting - * @see BoundedRangeModel#setValueIsAdjusting - * @beaninfo - * expert: true - * description: True if the slider knob is being dragged. - */ - public void setValueIsAdjusting(boolean b) { - setValueIsAdjustingAt(getCurrentThumbIndex(), b); - } - - /*** - * Sets the models valueIsAdjusting property. Slider look and - * feel implementations should set this property to true when - * a knob drag begins, and to false when the drag ends. The - * slider model will not generate ChangeEvents while - * valueIsAdjusting is true. - */ - public void setValueIsAdjustingAt(int index, boolean b) { - BoundedRangeModel m = getModelAt(index); - boolean oldValue = m.getValueIsAdjusting(); - m.setValueIsAdjusting(b); - - if ((oldValue != b) && (accessibleContext != null)) { - accessibleContext.firePropertyChange( - AccessibleContext.ACCESSIBLE_STATE_PROPERTY, - ((oldValue) ? AccessibleState.BUSY : null), - ((b) ? AccessibleState.BUSY : null)); + public Color getCurrentThumbColor() { + return this.currentThumbColor; } - } - /*** - * Sets the size of the range "covered" by the knob. Most look - * and feel implementations will change the value by this amount - * if the user clicks on either side of the knob. - * - * @see #getExtent - * @see BoundedRangeModel#setExtent - * @beaninfo - * expert: true - * description: Size of the range covered by the knob. - */ - public void setExtent(int extent) { - int count = getNumberOfThumbs(); - for (int i = 0; i < count; i++) { - getModelAt(i).setExtent(extent); + public int getTrackBuffer() { + return ((MultiSliderUI) this.ui).getTrackBuffer(); + } + + /*** + * Validates the orientation parameter. + */ + private void checkOrientation(int orientation) { + switch (orientation) { + case VERTICAL: + case HORIZONTAL: + break; + default: + throw new IllegalArgumentException("orientation must be one of: VERTICAL, HORIZONTAL"); + } + } + + /*** + * Notification from the UIFactory that the L&F has changed. + * Called to replace the UI with the latest version from the + * default UIFactory. + * + * @see JComponent#updateUI + */ + public void updateUI() { + updateLabelUIs(); + MultiSliderUI ui = new MultiSliderUI(); + if (this.sliderModels != null) { + ui.setThumbCount(this.sliderModels.length); + } + setUI((SliderUI) ui); + } + + /*** + * Returns the number of thumbs in the slider. + */ + public int getNumberOfThumbs() { + return this.sliderModels.length; + } + + /*** + * Sets the number of thumbs with the specified parameters. + */ + private void setNumberOfThumbs(int min, int max, int num, boolean useEndPoints) { + int [] values = createDefaultValues(min, max, num, useEndPoints); + setNumberOfThumbs(min, max, values); + } + + /*** + * Sets the number of thumbs with the specified parameters. + */ + private void setNumberOfThumbs(int min, int max, int num) { + setNumberOfThumbs(min, max, num, false); + } + + /*** + * Sets the number of thumbs with the specified parameters. + */ + private void setNumberOfThumbs(int min, int max, int[] values) { + if (values == null || values.length < 1) { + values = new int[] {50}; + } + int num = values.length; + this.sliderModels = new BoundedRangeModel[num]; + for (int i = 0; i < num; i++) { + this.sliderModels[i] = new DefaultBoundedRangeModel(values[i], 0, min, max); + this.sliderModels[i].addChangeListener(changeListener); + } + updateUI(); + } + + /*** + * Sets the number of thumbs. + */ + private void setNumberOfThumbs(int num) { + setNumberOfThumbs(num, false); + } + + /*** + * Sets the number of thumbs. + */ + private void setNumberOfThumbs(int num, boolean useEndPoints) { + if (getNumberOfThumbs() != num) { + setNumberOfThumbs(getMinimum(), getMaximum(), num, useEndPoints); + } + } + + /*** + * Sets the number of thumbs by specifying the initial values. + */ + private void setNumberOfThumbs(int[] values) { + setNumberOfThumbs(getMinimum(), getMaximum(), values); + } + + /*** + * creates evenly spaced values for thumbs. + */ + private int[] createDefaultValues(int min, int max, int num_of_values, boolean useEndPoints) { + int[] values = new int[num_of_values]; + int range = max - min; + + if (!useEndPoints) { + int step = range / (num_of_values + 1); + for (int i = 0; i < num_of_values; i++) { + values[i] = min + (i + 1) * step; + } + } else { + if (num_of_values < 1) { + return new int[0]; + } + values[0] = getMinimum(); + values[num_of_values - 1] = getMaximum(); + int[] def = createDefaultValues(getMinimum(), getMaximum(), num_of_values - 2, false); + for (int i = 0; i < def.length; i++) { + values[i + 1] = def[i]; + } + } + return values; + } + + /*** + * Returns the index number of currently operated thumb. + */ + public int getCurrentThumbIndex() { + return ((MultiSliderUI)ui).getCurrentIndex(); + } + + /*** + * Returns data model that handles the sliders three + * fundamental properties: minimum, maximum, value. + * + * @see #setModel + */ + public BoundedRangeModel getModel() { + return getModelAt(getCurrentThumbIndex()); + } + + /*** + * Returns data model that handles the sliders three + * fundamental properties: minimum, maximum, value. + * + * @see #setModel + */ + public BoundedRangeModel getModelAt(int index) { + if (this.sliderModels == null || index >= this.sliderModels.length) { + return null; + } + return this.sliderModels[index]; + } + + /*** + * Returns data model that handles the sliders three + * fundamental properties: minimum, maximum, value. + * + * @see #setModel + */ + public BoundedRangeModel[] getModels() { + return this.sliderModels; + } + + /*** + * Sets the model that handles the sliders three + * fundamental properties: minimum, maximum, value. + * + * @see #getModel + * @beaninfo + * bound: true + * description: The sliders BoundedRangeModel. + */ + public void setModel(BoundedRangeModel newModel) { + // Hack around jdk 7 problem: http://code.google.com/p/geoviz/issues/detail?id=80 + + try + { + setModelAt(getCurrentThumbIndex(), newModel); + + } + catch (Exception e) + { + this.sliderModel = newModel; + } + } + + /*** + * Sets the model that handles the sliders three + * fundamental properties: minimum, maximum, value. + * + * @see #getModel + * @beaninfo + * bound: true + * description: The sliders BoundedRangeModel. + */ + public void setModelAt(int index, BoundedRangeModel newModel) { + BoundedRangeModel oldModel = getModelAt(index); + + if (oldModel != null) { + oldModel.removeChangeListener(changeListener); + } + + this.sliderModels[index] = newModel; + + if (newModel != null) { + newModel.addChangeListener(changeListener); + + if (accessibleContext != null) { + accessibleContext.firePropertyChange( + AccessibleContext.ACCESSIBLE_VALUE_PROPERTY, + (oldModel == null + ? null : new Integer(oldModel.getValue())), + (newModel == null + ? null : new Integer(newModel.getValue()))); + } + } + + firePropertyChange("model", oldModel, this.sliderModels[index]); + } + + /*** + * Sets the models minimum property. + * + * @see #getMinimum + * @see BoundedRangeModel#setMinimum + * @beaninfo + * bound: true + * preferred: true + * description: The sliders minimum value. + */ + public void setMinimum(int minimum) { + int count = getNumberOfThumbs(); + int oldMin = getModel().getMinimum(); + for (int i = 0; i < count; i++) { + getModelAt(i).setMinimum(minimum); + } + firePropertyChange( "minimum", new Integer( oldMin ), new Integer( minimum ) ); + } + + /*** + * Sets the models maximum property. + * + * @see #getMaximum + * @see BoundedRangeModel#setMaximum + * @beaninfo + * bound: true + * preferred: true + * description: The sliders maximum value. + */ + public void setMaximum(int maximum) { + int count = getNumberOfThumbs(); + int oldMax = getModel().getMaximum(); + for (int i = 0; i < count; i++) { + getModelAt(i).setMaximum(maximum); + } + firePropertyChange( "maximum", new Integer( oldMax ), new Integer( maximum ) ); + } + + /*** + * Returns the sliders value. + * @return the models value property + * @see #setValue + */ + public int getValue() { + // Hack around jdk 7 problem: http://code.google.com/p/geoviz/issues/detail?id=80 + try + { + return getValueAt(getCurrentThumbIndex()); + + } + catch (Exception e) + { + return 0; + } + } + + /*** + * Returns the sliders value. + * @return the models value property + * @see #setValue + */ + public int getValueAt(int index) { + return getModelAt(index).getValue(); + } + + /*** + * Sets the sliders current value. This method just forwards + * the value to the model. + * + * @see #getValue + * @beaninfo + * preferred: true + * description: The sliders current value. + */ + public void setValue(int n) { + setValueAt(getCurrentThumbIndex(), n); + } + + /*** + * Sets the sliders current value. This method just forwards + * the value to the model. + * + * @see #getValue + * @beaninfo + * preferred: true + * description: The sliders current value. + */ + public void setValueAt(int index, int n) { + BoundedRangeModel m = getModelAt(index); + int oldValue = m.getValue(); + m.setValue(n); + + if (accessibleContext != null) { + accessibleContext.firePropertyChange( + AccessibleContext.ACCESSIBLE_VALUE_PROPERTY, + new Integer(oldValue), + new Integer(m.getValue())); + } + } + + /*** + * True if the slider knob is being dragged. + * + * @return the value of the models valueIsAdjusting property + * @see #setValueIsAdjusting + */ + public boolean getValueIsAdjusting() { + boolean result = false; + int count = getNumberOfThumbs(); + for (int i = 0; i < count; i++) { + result = (result || getValueIsAdjustingAt(i)); + } + return result; + } + + /*** + * True if the slider knob is being dragged. + */ + public boolean getValueIsAdjustingAt(int index) { + return getModelAt(index).getValueIsAdjusting(); + } + + /*** + * Sets the models valueIsAdjusting property. Slider look and + * feel implementations should set this property to true when + * a knob drag begins, and to false when the drag ends. The + * slider model will not generate ChangeEvents while + * valueIsAdjusting is true. + * + * @see #getValueIsAdjusting + * @see BoundedRangeModel#setValueIsAdjusting + * @beaninfo + * expert: true + * description: True if the slider knob is being dragged. + */ + public void setValueIsAdjusting(boolean b) { + setValueIsAdjustingAt(getCurrentThumbIndex(), b); + } + + /*** + * Sets the models valueIsAdjusting property. Slider look and + * feel implementations should set this property to true when + * a knob drag begins, and to false when the drag ends. The + * slider model will not generate ChangeEvents while + * valueIsAdjusting is true. + */ + public void setValueIsAdjustingAt(int index, boolean b) { + BoundedRangeModel m = getModelAt(index); + boolean oldValue = m.getValueIsAdjusting(); + m.setValueIsAdjusting(b); + + if ((oldValue != b) && (accessibleContext != null)) { + accessibleContext.firePropertyChange( + AccessibleContext.ACCESSIBLE_STATE_PROPERTY, + ((oldValue) ? AccessibleState.BUSY : null), + ((b) ? AccessibleState.BUSY : null)); + } + } + + /*** + * Sets the size of the range "covered" by the knob. Most look + * and feel implementations will change the value by this amount + * if the user clicks on either side of the knob. + * + * @see #getExtent + * @see BoundedRangeModel#setExtent + * @beaninfo + * expert: true + * description: Size of the range covered by the knob. + */ + public void setExtent(int extent) { + int count = getNumberOfThumbs(); + for (int i = 0; i < count; i++) { + getModelAt(i).setExtent(extent); + } } - } - /*** - * Sets a bounded attribute of a slider thumb. - *
-     * 
- * - * @param b - * @return void - */ - public void setBounded(boolean b) { - this.bounded = b; - } + /*** + * Sets a bounded attribute of a slider thumb. + *
+	 * 
+ * + * @param b + * @return void + */ + public void setBounded(boolean b) { + this.bounded = b; + } - /*** - * Returns a bounded attribute of a slider thumb. - *
-     * 
- * - * @return boolean - */ - public boolean isBounded() { - return this.bounded; - } + /*** + * Returns a bounded attribute of a slider thumb. + *
+	 * 
+ * + * @return boolean + */ + public boolean isBounded() { + return this.bounded; + } - public int getValueBeforeStateChange() { - return this.valueBeforeStateChange; - } + public int getValueBeforeStateChange() { + return this.valueBeforeStateChange; + } - void setValueBeforeStateChange(int v) { - this.valueBeforeStateChange = v; - } + void setValueBeforeStateChange(int v) { + this.valueBeforeStateChange = v; + } }