001: /*=============================================================================
002: * Copyright Texas Instruments 2002. All Rights Reserved.
003: *
004: * This program is free software; you can redistribute it and/or modify
005: * it under the terms of the GNU General Public License as published by
006: * the Free Software Foundation; either version 2 of the License, or
007: * (at your option) any later version.
008: *
009: * This program is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: * GNU General Public License for more details.
013: *
014: * You should have received a copy of the GNU General Public License
015: * along with this program; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018:
019: package ti.chimera.pref;
020:
021: import ti.exceptions.ProgrammingErrorException;
022:
023: /**
024: * A {@link NodeContract} which constrains the value to be a object matching
025: * one of the specified objects.
026: *
027: * @author ;Rob Clark;a0873619;San Diego;;
028: * @version 0.1
029: */
030: public class ChoiceNodeContract implements
031: ti.chimera.registry.NodeContract {
032: private Object[] choices;
033: private Object[] displayNames;
034:
035: /**
036: * Class Constructor.
037: *
038: * @param choices the set of acceptible values
039: */
040: public ChoiceNodeContract(Object[] choices) {
041: this (choices, choices);
042: }
043:
044: /**
045: * Class Constructor.
046: *
047: * @param choices the set of acceptible values
048: * @param displayNames the names to display to the user... the index into
049: * this array should correspond to the index into <code>choices</code>
050: * array for the value corresponding to the display name. The display
051: * name is simply used for an user interface constructed based on this
052: * contract.
053: */
054: public ChoiceNodeContract(Object[] choices, Object[] displayNames) {
055: if (choices.length != displayNames.length)
056: throw new ProgrammingErrorException(
057: "choices length must be same as displayNames length");
058:
059: this .choices = choices;
060: this .displayNames = displayNames;
061: }
062:
063: /**
064: * Get the number of valid choices.
065: *
066: * @return the number of valid values
067: */
068: public int getChoicesCount() {
069: return choices.length;
070: }
071:
072: /**
073: * Get the specified value
074: */
075: public Object getChoice(int idx) {
076: return choices[idx];
077: }
078:
079: /**
080: * Get the specified display name
081: */
082: public Object getDisplayName(int idx) {
083: return displayNames[idx];
084: }
085:
086: /**
087: * Determine if the specified <code>value</code> meets this contract.
088: *
089: * @param value the value to check
090: * @return <code>true</code> if meets contract
091: */
092: public boolean accepts(Object value) {
093: for (int i = 0; i < choices.length; i++)
094: if (choices[i].equals(value))
095: return true;
096:
097: return false;
098: }
099:
100: /**
101: * The contract implementation should overload <code>toString</code> so
102: * the contract can be displayed to the user in a sane format, for use
103: * in error messages, etc.
104: */
105: public String toString() {
106: StringBuffer sb = new StringBuffer();
107:
108: sb.append('(');
109:
110: for (int i = 0; i < choices.length; i++) {
111: if (i != 0)
112: sb.append(" || ");
113: sb.append("(value == ").append(choices[i]).append(')');
114: }
115:
116: sb.append(')');
117:
118: return sb.toString();
119: }
120: }
121:
122: /*
123: * Local Variables:
124: * tab-width: 2
125: * indent-tabs-mode: nil
126: * mode: java
127: * c-indentation-style: java
128: * c-basic-offset: 2
129: * eval: (c-set-offset 'substatement-open '0)
130: * eval: (c-set-offset 'case-label '+)
131: * eval: (c-set-offset 'inclass '+)
132: * eval: (c-set-offset 'inline-open '0)
133: * End:
134: */
|