/*
* Copyright 2006-2017 ICEsoft Technologies Canada Corp.
*
* 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.icepdf.core.pobjects.acroform;
import org.icepdf.core.util.Library;
import java.util.HashMap;
/**
* The ButtonFieldDictionary contains all the dictionary entries specific to
* the button widget.
*
* @since 5.1
*/
public class ButtonFieldDictionary extends VariableTextFieldDictionary {
/**
* (Radio buttons only) If set, exactly one radio button shall be selected at
* all times; selecting the currently selected button has no effect. If clear,
* clicking the selected button deselects it, leaving no button selected.
*/
public static final int NO_TOGGLE_TO_OFF_BIT_FLAG = 0x4000;
/**
* If set, the field is a set of radio buttons; if clear, the field is a
* check box. This flag may be set only if the Push button flag is clear.
*/
public static final int RADIO_BIT_FLAG = 0x8000;
/**
* If set, the field is a push button that does not retain a permanent value.
*/
public static final int PUSH_BUTTON_BIT_FLAG = 0x10000;
/**
* (PDF 1.5) If set, a group of radio buttons within a radio button field
* that use the same value for the on state will turn on and off in unison;
* that is if one is checked, they are all checked. If clear, the buttons are
* mutually exclusive (the same behavior as HTML radio buttons).
*/
public static final int RADIO_IN_UNISON_BIT_FLAG = 0x1000000;
public enum ButtonFieldType {
PUSH_BUTTON, RADIO_BUTTON, CHECK_BUTTON
}
protected ButtonFieldType buttonFieldType;
@SuppressWarnings("unchecked")
public ButtonFieldDictionary(Library library, HashMap entries) {
super(library, entries);
}
/**
* (Radio buttons only) If set, exactly one radio button shall be selected at
* all times; selecting the currently selected button has no effect. If clear,
* clicking the selected button deselects it, leaving no button selected.
*
* @return true if only one button state should be selected at all times.
*/
public boolean isNoToggleToOff() {
return (getFlags() & NO_TOGGLE_TO_OFF_BIT_FLAG) == NO_TOGGLE_TO_OFF_BIT_FLAG;
}
/**
* If set, the field is a set of radio buttons; if clear, the field is a
* check box. This flag may be set only if the Push button flag is clear.
*
* @return true if button field is of type push button.
*/
public boolean isRadioButton() {
return (getFlags() & RADIO_BIT_FLAG) == RADIO_BIT_FLAG;
}
/**
* If set, the field is a push button that does not retain a permanent value.
*
* @return true if button field is of type push button.
*/
public boolean isPushButton() {
return (getFlags() & PUSH_BUTTON_BIT_FLAG) == PUSH_BUTTON_BIT_FLAG;
}
/**
* If set, a group of radio buttons within a radio button field
* that use the same value for the on state will turn on and off in unison;
* that is if one is checked, they are all checked. If clear, the buttons are
*
* @return true if radio buttons in unison; otherwise false.
*/
public boolean isRadioInUnison() {
return (getFlags() & RADIO_IN_UNISON_BIT_FLAG) == RADIO_IN_UNISON_BIT_FLAG;
}
public ButtonFieldType getButtonFieldType() {
// apply button bit logic
if ((getFlags() & PUSH_BUTTON_BIT_FLAG) ==
PUSH_BUTTON_BIT_FLAG) {
buttonFieldType = ButtonFieldType.PUSH_BUTTON;
} else {
// check for checkbox/radio.
if (isRadioButton()) {
buttonFieldType = ButtonFieldType.RADIO_BUTTON;
} else {
buttonFieldType = ButtonFieldType.CHECK_BUTTON;
}
}
return buttonFieldType;
}
public void setButtonFieldType(ButtonFieldType buttonFieldType) {
this.buttonFieldType = buttonFieldType;
}
}