1 /*
2 * Copyright (c) 2003-2008 by Cosylab d. d.
3 *
4 * This file is part of CosyBeans-Common.
5 *
6 * CosyBeans-Common is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * CosyBeans-Common is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with CosyBeans-Common. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 package com.cosylab.gui.components.range2;
21
22 /**
23 * Defines value policy that maintains constant span. Whenever value moves
24 * outside the bounds of the range, min and max will be adjusted to follow the
25 * value or will be set to limit of the range.
26 *
27 * @author <a href="mailto:ales.pucelj@cosylab.com">Ales Pucelj</a>
28 * @version $id$
29 */
30 public class ShiftValuePolicy extends RangedValuePolicy
31 {
32 private double shiftFactor;
33
34 /**
35 * Default constructor for ShiftValuePolicy.
36 */
37 public ShiftValuePolicy()
38 {
39 this(0.25);
40 }
41
42 /**
43 * Default constructor for ShiftValuePolicy.
44 *
45 * @param factor double
46 */
47 public ShiftValuePolicy(double factor)
48 {
49 super();
50 setFactor(factor);
51 }
52
53 /**
54 * Calculates new limits for the range. If possible, the scale will only be
55 * shifted by ammount specified by factor. In case that is insufficient,
56 * the limit will be adjusted so the new limit is offset from value by
57 * factor ammount.
58 *
59 * @param params RangedValueHolder
60 *
61 * @see com.cosylab.gui.components.range.RangedValuePolicy#validate(RangedValueHolder)
62 */
63 public RangedValue validate(RangedValue params)
64 {
65 double minimum = params.getMinimum();
66 double maximum = params.getMaximum();
67 double value = params.getValue();
68 double span = maximum - minimum;
69 double delta = span * getFactor();
70
71 double newMinimum = minimum;
72 double newMaximum = maximum;
73
74 if (value < minimum) {
75 // move scale down
76 newMinimum = minimum - delta;
77
78 if (newMinimum > value) {
79 newMinimum = value - delta;
80 }
81
82 //newMaximum = maximum + newMinimum - minimum;
83 newMaximum = newMinimum + span;
84 }
85
86 if (value > maximum) {
87 // move scale up
88 newMaximum = maximum + delta;
89
90 if (newMaximum < value) {
91 newMaximum = value + delta;
92 }
93
94 //newMinimum = minimum + newMaximum - maximum;
95 newMinimum = newMaximum - span;
96 }
97
98 params = new RangedValue(newMinimum, newMaximum, params.getValue());
99
100 return validatePeerPolicy(params);
101 }
102
103 /**
104 * Returns factor ammount.
105 *
106 * @return double current factor ammount.
107 */
108 public double getFactor()
109 {
110 return shiftFactor;
111 }
112
113 /**
114 * Sets new shift factor. This ammount will be between 0 and 1 and will be
115 * adjusted to fit into this range.
116 *
117 * @param factor double
118 */
119 public void setFactor(double factor)
120 {
121 factor = Math.min(1.0, factor);
122 factor = Math.max(0.0, factor);
123
124 shiftFactor = factor;
125 }
126 }
127
128 /* __oOo__ */