Class: HexaPDF::Type::AcroForm::ButtonField
- Inherits:
-
Field
- Object
- Object
- Dictionary
- Field
- HexaPDF::Type::AcroForm::ButtonField
- Defined in:
- lib/hexapdf/type/acro_form/button_field.rb
Overview
AcroForm button fields represent interactive controls to be used with the mouse.
They are divided into push buttons (things to click on), check boxes and radio buttons. All of these are represented with this class.
To create a push button, check box or radio button field, use the appropriate convenience methods on the main Form instance (HexaPDF::Document#acro_form). By using those methods, everything needed is automatically set up.
Type Specific Field Flags
- :no_toggle_to_off
-
Only used with radio buttons fields. If this flag is set, one button needs to be selected at all times. Otherwise, clicking on the selected button deselects it.
- :radio
-
If this flag is set, the field is a set of radio buttons. Otherwise it is a check box. Additionally, the :pushbutton flag needs to be clear.
- :push_button
-
The field represents a pushbutton without a permanent value.
- :radios_in_unison
-
A group of radio buttons with the same value for the on state will turn on or off in unison.
See: PDF1.7 s12.7.4.2
Constant Summary collapse
- INHERITABLE_FIELDS =
All inheritable dictionary fields for button fields.
(superclass::INHERITABLE_FIELDS + [:Opt]).freeze
- FLAGS_BIT_MAPPING =
Updated list of field flags.
superclass::FLAGS_BIT_MAPPING.merge( { no_toggle_to_off: 14, radio: 15, push_button: 16, radios_in_unison: 25, } ).freeze
Constants included from DictionaryFields
DictionaryFields::Boolean, DictionaryFields::PDFByteString, DictionaryFields::PDFDate
Instance Attribute Summary
Attributes inherited from Object
#data, #document, #must_be_indirect
Instance Method Summary collapse
-
#check_box? ⇒ Boolean
Returns
true
if this button field represents a check box. -
#check_box_on_name ⇒ Object
Returns the name (a Symbol) used for setting the check box to the on state.
-
#concrete_field_type ⇒ Object
Returns the concrete button field type, either :push_button, :check_box or :radio_button.
-
#create_appearances(force: false) ⇒ Object
Creates appropriate appearances for all widgets if they don’t already exist.
-
#create_widget(page, defaults: true, value: nil, **values) ⇒ Object
Creates a widget for the button field.
-
#default_field_value ⇒ Object
Returns the default field value.
-
#default_field_value=(value) ⇒ Object
Sets the default field value.
-
#field_value ⇒ Object
Returns the field value which depends on the concrete type.
-
#field_value=(value) ⇒ Object
Sets the field value which depends on the concrete type.
-
#initialize_as_check_box ⇒ Object
Initializes the button field to be a check box.
-
#initialize_as_push_button ⇒ Object
Initializes the button field to be a push button.
-
#initialize_as_radio_button ⇒ Object
Initializes the button field to be a radio button.
-
#push_button? ⇒ Boolean
Returns
true
if this button field represents a push button. -
#radio_button? ⇒ Boolean
Returns
true
if this button field represents a radio button set. -
#radio_button_values ⇒ Object
Returns the array of Symbol values that can be used for the field value of the radio button.
-
#update_widgets ⇒ Object
Updates the widgets so that they reflect the current field value.
Methods inherited from Field
#[], #alternate_field_name, #alternate_field_name=, #delete_widget, #each_widget, #embedded_widget?, #field_name, #field_type, #flags, #full_field_name, inherited_value, #must_be_indirect?, #terminal_field?
Methods included from Utils::BitField
Methods inherited from Dictionary
#[], #[]=, define_field, define_type, #delete, #each, each_field, #empty?, field, #key?, #to_h, type, #type
Methods inherited from Object
#<=>, #==, #cache, #cached?, #clear_cache, deep_copy, #deep_copy, #document?, #eql?, #gen, #gen=, #hash, #indirect?, #initialize, #inspect, #must_be_indirect?, #null?, #oid, #oid=, #type, #validate, #value, #value=
Constructor Details
This class inherits a constructor from HexaPDF::Object
Instance Method Details
#check_box? ⇒ Boolean
Returns true
if this button field represents a check box.
121 122 123 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 121 def check_box? ! && !flagged?(:radio) end |
#check_box_on_name ⇒ Object
Returns the name (a Symbol) used for setting the check box to the on state.
Defaults to :Yes if no other name could be determined.
186 187 188 189 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 186 def check_box_on_name .to_a.first&.appearance&.normal_appearance&.value&.each_key&. find {|key| key != :Off } || :Yes end |
#concrete_field_type ⇒ Object
Returns the concrete button field type, either :push_button, :check_box or :radio_button.
173 174 175 176 177 178 179 180 181 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 173 def concrete_field_type if :push_button elsif :radio_button else :check_box end end |
#create_appearances(force: false) ⇒ Object
Creates appropriate appearances for all widgets if they don’t already exist.
The created appearance streams depend on the actual type of the button field. See AppearanceGenerator for the details.
By setting force
to true
the creation of the appearances can be forced.
233 234 235 236 237 238 239 240 241 242 243 244 245 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 233 def create_appearances(force: false) appearance_generator_class = document.config.constantize('acro_form.appearance_generator') do || next if !force && .appearance? if check_box? appearance_generator_class.new().create_check_box_appearances elsif appearance_generator_class.new(). else raise HexaPDF::Error, "Push buttons not yet supported" end end end |
#create_widget(page, defaults: true, value: nil, **values) ⇒ Object
Creates a widget for the button field.
If defaults
is true
, then default values will be set on the widget so that it uses a default appearance.
If the widget is created for a radio button field, the value
argument needs to set to the value (a Symbol or an object responding to #to_sym
) this widget represents. It can be used with #field_value= to set this specific widget of the radio button set to on.
See: Field#create_widget, AppearanceGenerator button field methods
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 209 def (page, defaults: true, value: nil, **values) super(page, allow_embedded: !, **values).tap do || if check_box? [:AP] = {N: {Yes: nil, Off: nil}} elsif unless value.respond_to?(:to_sym) raise ArgumentError, "Argument 'value' has to be provided for radio buttons " \ "and needs to respond to #to_sym" end [:AP] = {N: {value.to_sym => nil, Off: nil}} end next unless defaults .border_style(color: 0, width: 1, style: ( ? :beveled : :solid)) .background_color( ? 0.5 : 255) .marker_style(style: check_box? ? :check : :circle) unless end end |
#default_field_value ⇒ Object
Returns the default field value.
See: #field_value
161 162 163 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 161 def default_field_value normalized_field_value(:DV) end |
#default_field_value=(value) ⇒ Object
Sets the default field value.
See: #field_value=
168 169 170 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 168 def default_field_value=(value) normalized_field_value_set(:DV, value) end |
#field_value ⇒ Object
Returns the field value which depends on the concrete type.
- Push buttons
-
They don’t have a value, so
nil
is always returned. - Check boxes
-
For check boxes that are in the on state the value
true
is returned. Otherwisefalse
is returned. - Radio buttons
-
If no radio button is selected,
nil
is returned. Otherwise the value (a Symbol) of the specific radio button that is selected is returned.
139 140 141 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 139 def field_value normalized_field_value(:V) end |
#field_value=(value) ⇒ Object
Sets the field value which depends on the concrete type.
- Push buttons
-
Since push buttons don’t store any value, the given value is ignored and nothing is stored for them (e.g a no-op).
- Check boxes
-
Use
true
for checking the box, i.e. toggling it to the on state, andfalse
for unchecking it. - Radio buttons
-
To turn all radio buttons off, provide
nil
as value. Otherwise provide the value (a Symbol or an object responding to#to_sym
) of a radio button that should be turned on.
154 155 156 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 154 def field_value=(value) normalized_field_value_set(:V, value) end |
#initialize_as_check_box ⇒ Object
Initializes the button field to be a check box.
This method should only be called directly after creating a new button field because it doesn’t completely reset the object.
99 100 101 102 103 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 99 def initialize_as_check_box self[:V] = :Off unflag(:push_button) unflag(:radio) end |
#initialize_as_push_button ⇒ Object
Initializes the button field to be a push button.
This method should only be called directly after creating a new button field because it doesn’t completely reset the object.
89 90 91 92 93 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 89 def self[:V] = nil flag(:push_button) unflag(:radio) end |
#initialize_as_radio_button ⇒ Object
Initializes the button field to be a radio button.
This method should only be called directly after creating a new button field because it doesn’t completely reset the object.
109 110 111 112 113 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 109 def self[:V] = :Off unflag(:push_button) flag(:radio) end |
#push_button? ⇒ Boolean
Returns true
if this button field represents a push button.
116 117 118 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 116 def flagged?(:push_button) end |
#radio_button? ⇒ Boolean
Returns true
if this button field represents a radio button set.
126 127 128 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 126 def ! && flagged?(:radio) end |
#radio_button_values ⇒ Object
Returns the array of Symbol values that can be used for the field value of the radio button.
193 194 195 196 197 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 193 def .map do || .appearance&.normal_appearance&.value&.each_key&.find {|key| key != :Off } end.compact end |
#update_widgets ⇒ Object
Updates the widgets so that they reflect the current field value.
248 249 250 251 252 253 254 255 |
# File 'lib/hexapdf/type/acro_form/button_field.rb', line 248 def return if create_appearances value = self[:V] do || [:AS] = (.appearance&.normal_appearance&.value&.key?(value) ? value : :Off) end end |