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 * This class represents adjustable policies for <code>RangedValue</code>. 24 * Whenever a change any of the values (minimum, maximum or value) is made in 25 * <code>RangedValue</code> validate method will be called giving the 26 * implementor of this interface the chance to adjust the values before they 27 * are set and property change events invoked.<br> 28 * Note: Regardles of the changes proposed by validate method, 29 * <code>RangedValue</code> will always ensure the proper relation between the 30 * values: values must always form increasing order (minimum, value, 31 * maximum). 32 * 33 * @author <a href="mailto:ales.pucelj@cosylab.com">Ales Pucelj</a> 34 * @version $id$ 35 */ 36 public abstract class RangedValuePolicy 37 { 38 RangedValuePolicy peer; 39 40 /** 41 * Passes the value triplet <code>params</code> that may be modified by 42 * validate method. Regardles of the changes made, all three values will 43 * still be made to comply with the basic definition of <code> 44 * RangedValue</code>. 45 * 46 * <p>Before or after this policy has been executed it must call protected method validatePeerPolicy(RangedValue). 47 * 48 * @param params Triplet of values to validate. 49 * 50 * @return if the validation require the change of value or bounds of the RangedValue 51 * a new RangedValue with appropriate values should be returned 52 */ 53 public abstract RangedValue validate(RangedValue params); 54 55 /** 56 * Inserts provided polici as first policy in chain, here next peer policy is this policy. 57 * @param p new first policy in chain 58 * @return returns new first policy in chain, the p parameter. 59 */ 60 public RangedValuePolicy insertPeerPolicy(RangedValuePolicy p) { 61 p.peer=this; 62 return p; 63 } 64 65 /** 66 * Adds provided policy to the end of the chin 67 * @param p 68 */ 69 public void addPeerPolicy(RangedValuePolicy p) { 70 if (p == this) return; 71 if (peer!=null) { 72 peer.addPeerPolicy(p); 73 } else { 74 peer=p; 75 } 76 } 77 78 /** 79 * Returns the peer policy. 80 * 81 * @return 82 */ 83 public RangedValuePolicy getPeerPolicy() { 84 return peer; 85 } 86 87 /** 88 * Removes provided policy from the chain, and returnes first policy in chain. 89 * @param p policy to be removed from chain 90 * @return returns new first policy in chain, this or peer policy 91 */ 92 public RangedValuePolicy removePeerPolicy(RangedValuePolicy p) { 93 if (p==this) { 94 p.peer=null; 95 return peer; 96 } 97 if (peer != null) { 98 peer=peer.removePeerPolicy(p); 99 } 100 return this; 101 } 102 103 /** 104 * Removes provided policy from the chain, and returnes first policy in chain. 105 * @param p policy to be removed from chain 106 * @return returns new first policy in chain, this or peer policy 107 */ 108 public RangedValuePolicy removePeerPolicyByType(Class<? extends RangedValuePolicy> c) { 109 if (c.isAssignableFrom(this.getClass())) { 110 peer=null; 111 return peer; 112 } 113 if (peer != null) { 114 peer=peer.removePeerPolicyByType(c); 115 } 116 return this; 117 } 118 119 protected RangedValue validatePeerPolicy(RangedValue p) { 120 if (peer !=null) { 121 return peer.validate(p); 122 } 123 return p; 124 } 125 126 } 127 128 /* __oOo__ */