/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2013 The ZAP Development Team
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.zaproxy.zap.view;
import javax.swing.BoundedRangeModel;
import javax.swing.DefaultBoundedRangeModel;
import javax.swing.JSlider;
/**
* A {@code JSlider} which only allows values greater than zero and has the minimum value always set to zero. Setting a value
* less than or equal to zero will change the current value to the value one.
* <p>
* The default values for minor and major tick spacings are 1 and 5, respectively. The tick and label painting and snap to ticks
* are enabled by default.
* </p>
*
* @see JSlider
*/
public class PositiveValuesSlider extends JSlider {
private static final long serialVersionUID = 1L;
/**
* Default value of minor tick spacing.
*/
private static final int DEFAULT_MINOR_TICK_SPACING = 1;
/**
* Default value of major tick spacing.
*/
private static final int DEFAULT_MAJOR_TICK_SPACING = 5;
/**
* Constructs a new {@code PositiveValuesSlider} with {@code max} as the maximum value allowed.
* <p>
* The current value will be set to the value one.
* </p>
*
* @param max the maximum value allowed
* @throws IllegalArgumentException if {@code max} is lesser than or equal to zero.
*/
public PositiveValuesSlider(int max) {
this(1, max);
}
/**
* Constructs a new {@code PositiveValuesSlider} with {@code value} as the current value and {@code max} as the maximum
* value allowed.
* <p>
* If {@code value} is not greater than zero the value set as the current value will be the value one.
* </p>
*
* @param value the value that will be set as the current value (if greater than zero)
* @param max the maximum value allowed
* @throws IllegalArgumentException if {@code max} is lesser than or equal to zero.
*/
public PositiveValuesSlider(int value, int max) {
super(new PositiveValuesBoundedRangeModel(value, max));
setMinorTickSpacing(DEFAULT_MINOR_TICK_SPACING);
setMajorTickSpacing(DEFAULT_MAJOR_TICK_SPACING);
setPaintTicks(true);
setPaintLabels(true);
setSnapToTicks(true);
setPaintTrack(true);
}
@Override
public void setMajorTickSpacing(int n) {
// Set the label table to null to force the creation of (new) major tick labels,
// if it's not called the major tick labels are not updated with the new values.
setLabelTable(null);
super.setMajorTickSpacing(n);
}
/**
* Calling this method has <strong>no</strong> effect. It's using a custom {@code BoundedRangeModel}.
*/
@Override
public void setModel(BoundedRangeModel newModel) {
if (!(newModel instanceof PositiveValuesBoundedRangeModel)) {
return;
}
super.setModel(newModel);
}
/**
* A BoundedRangeModel that allows only values greater than zero and has the minimum always set to zero.
*/
private static class PositiveValuesBoundedRangeModel extends DefaultBoundedRangeModel {
private static final long serialVersionUID = 1L;
/**
* Constructs a new {@code PositiveValuesBoundedRangeModel} with {@code value} as the current value and {@code max} as
* maximum value allowed.
*
* <p>
* If {@code value} is not greater than zero, the value set as the current value will be the value one.
* </p>
*
* @param value the value that will be set as the current value if greater than zero
* @param max the maximum value allowed
* @throws IllegalArgumentException if {@code max} is lesser than or equal to zero.
*/
public PositiveValuesBoundedRangeModel(int value, int max) {
super(getValueGreaterThanZero(value), 0, 0, max);
}
/**
* Calling this method has <strong>no</strong> effect. The minimum is always zero.
*/
@Override
public void setMinimum(int n) {
}
/**
* Sets the current value.
* <p>
* If {@code value} is not greater than zero the value set will be the value one.
* </p>
*/
@Override
public void setValue(int value) {
super.setValue(getValueGreaterThanZero(value));
}
/**
* Returns a value greater than zero.
* <p>
* It the {@code value} is greater than zero its value is returned otherwise it's returned the value one.
* </p>
*
* @param value the value that will be checked
* @return the {@code value} if greater than zero otherwise the value one
*/
private static int getValueGreaterThanZero(int value) {
return Math.max(value, 1);
}
}
}