001: /**
002: * Copyright (c) 2003-2005, www.pdfbox.org
003: * All rights reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions are met:
007: *
008: * 1. Redistributions of source code must retain the above copyright notice,
009: * this list of conditions and the following disclaimer.
010: * 2. Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: * 3. Neither the name of pdfbox; nor the names of its
014: * contributors may be used to endorse or promote products derived from this
015: * software without specific prior written permission.
016: *
017: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
018: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
019: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
020: * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
021: * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
022: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
023: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
024: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
026: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027: *
028: * http://www.pdfbox.org
029: *
030: */package org.pdfbox.pdmodel.interactive.form;
031:
032: import java.io.IOException;
033: import java.util.ArrayList;
034: import java.util.List;
035:
036: import org.pdfbox.cos.COSArray;
037: import org.pdfbox.cos.COSDictionary;
038: import org.pdfbox.cos.COSName;
039:
040: import org.pdfbox.pdmodel.common.COSArrayList;
041: import org.pdfbox.util.BitFlagHelper;
042:
043: /**
044: * A class for handling the PDF field as a Radio Collection.
045: * This class automatically keeps track of the child radio buttons
046: * in the collection.
047: *
048: * @see PDCheckbox
049: * @author sug
050: * @version $Revision: 1.13 $
051: */
052: public class PDRadioCollection extends PDChoiceButton {
053: /**
054: * A Ff flag.
055: */
056: public static final int FLAG_RADIOS_IN_UNISON = 1 << 25;
057:
058: /**
059: * @param theAcroForm The acroForm for this field.
060: * @param field The field that makes up the radio collection.
061: *
062: * {@inheritDoc}
063: */
064: public PDRadioCollection(PDAcroForm theAcroForm, COSDictionary field) {
065: super (theAcroForm, field);
066: }
067:
068: /**
069: * From the PDF Spec <br/>
070: * If set, a group of radio buttons within a radio button field that
071: * use the same value for the on state will turn on and off in unison; that is if
072: * one is checked, they are all checked. If clear, the buttons are mutually exclusive
073: * (the same behavior as HTML radio buttons).
074: *
075: * @param radiosInUnison The new flag for radiosInUnison.
076: */
077: public void setRadiosInUnison(boolean radiosInUnison) {
078: BitFlagHelper.setFlag(getDictionary(), "Ff",
079: FLAG_RADIOS_IN_UNISON, radiosInUnison);
080: }
081:
082: /**
083: *
084: * @return true If the flag is set for radios in unison.
085: */
086: public boolean isRadiosInUnison() {
087: return BitFlagHelper.getFlag(getDictionary(), "Ff",
088: FLAG_RADIOS_IN_UNISON);
089: }
090:
091: /**
092: * This setValue method iterates the collection of radiobuttons
093: * and checks or unchecks each radiobutton according to the
094: * given value.
095: * If the value is not represented by any of the radiobuttons,
096: * then none will be checked.
097: *
098: * {@inheritDoc}
099: */
100: public void setValue(String value) throws IOException {
101: getDictionary().setString("V", value);
102: List kids = getKids();
103: for (int i = 0; i < kids.size(); i++) {
104: PDCheckbox btn = (PDCheckbox) kids.get(i);
105: if (btn.getOnValue().equals(value)) {
106: btn.check();
107: } else {
108: btn.unCheck();
109: }
110: }
111: }
112:
113: /**
114: * getValue gets the fields value to as a string.
115: *
116: * @return The string value of this field.
117: *
118: * @throws IOException If there is an error getting the value.
119: */
120: public String getValue() throws IOException {
121: String retval = null;
122: List kids = getKids();
123: for (int i = 0; i < kids.size(); i++) {
124: PDCheckbox btn = (PDCheckbox) kids.get(i);
125: if (btn.isChecked()) {
126: retval = btn.getOnValue();
127: }
128: }
129: if (retval == null) {
130: retval = getDictionary().getNameAsString("V");
131: }
132: return retval;
133: }
134:
135: /**
136: * This will return a list of PDField objects that are part of this radio collection.
137: *
138: * @see PDField#getWidget()
139: * @return A list of PDWidget objects.
140: * @throws IOException if there is an error while creating the children objects.
141: */
142: public List getKids() throws IOException {
143: List retval = null;
144: COSArray kids = (COSArray) getDictionary().getDictionaryObject(
145: COSName.KIDS);
146: if (kids != null) {
147: List kidsList = new ArrayList();
148: for (int i = 0; i < kids.size(); i++) {
149: kidsList.add(PDFieldFactory.createField(getAcroForm(),
150: (COSDictionary) kids.getObject(i)));
151: }
152: retval = new COSArrayList(kidsList, kids);
153: }
154: return retval;
155: }
156: }
|