Author: tilman
Date: Sat Jul 25 14:37:38 2026
New Revision: 1936580

Log:
PDFBOX-6224: support the NoToggleToOff flag by Valery Bokov; closes #490

Modified:
   
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java
   
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestRadioButtons.java

Modified: 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java
      Sat Jul 25 14:37:35 2026        (r1936579)
+++ 
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDRadioButton.java
      Sat Jul 25 14:37:38 2026        (r1936580)
@@ -82,6 +82,29 @@ public final class PDRadioButton extends
     }
 
     /**
+     * From the PDF Spec <br>
+     * If set, exactly one radio button shall be selected at all times; 
clicking the currently
+     * selected button has no effect. If clear, clicking the selected button 
deselects it, leaving
+     * no button selected. This flag is meaningful only if the radio buttons 
are mutually exclusive,
+     * i.e. {@link #isRadiosInUnison()} is false.
+     *
+     * @param noToggleToOff The new flag for noToggleToOff.
+     */
+    public void setNoToggleToOff(boolean noToggleToOff)
+    {
+        getCOSObject().setFlag(COSName.FF, FLAG_NO_TOGGLE_TO_OFF, 
noToggleToOff);
+    }
+
+    /**
+     *
+     * @return true if the flag is set preventing a radio button from being 
toggled to off.
+     */
+    public boolean isNoToggleToOff()
+    {
+        return getCOSObject().getFlag(COSName.FF, FLAG_NO_TOGGLE_TO_OFF);
+    }
+
+    /**
      * This will get the selected index.
      * <p>
      * A RadioButton might have multiple same value options which are not 
selected jointly if

Modified: 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestRadioButtons.java
==============================================================================
--- 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestRadioButtons.java
   Sat Jul 25 14:37:35 2026        (r1936579)
+++ 
pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/interactive/form/TestRadioButtons.java
   Sat Jul 25 14:37:38 2026        (r1936580)
@@ -144,6 +144,34 @@ public class TestRadioButtons
     }
 
     /**
+     * Test getting/setting the NoToggleToOff flag (PDF spec Ff bit 15).
+     *
+     * @throws IOException If there is an error creating the field.
+     */
+    @Test
+    public void testNoToggleToOff() throws IOException
+    {
+        PDDocument doc = new PDDocument();
+        PDAcroForm acroForm = new PDAcroForm(doc);
+        PDRadioButton radioButton = new PDRadioButton(acroForm);
+
+        // default shall be false/unset
+        assertFalse(radioButton.isNoToggleToOff());
+
+        radioButton.setNoToggleToOff(true);
+        assertTrue(radioButton.isNoToggleToOff());
+        // spec bit 15 -> mask 1 << 14
+        assertEquals(1 << 14,
+                radioButton.getCOSObject().getInt(COSName.FF) & (1 << 14));
+
+        radioButton.setNoToggleToOff(false);
+        assertFalse(radioButton.isNoToggleToOff());
+        assertEquals(0, radioButton.getCOSObject().getInt(COSName.FF) & (1 << 
14));
+
+        doc.close();
+    }
+
+    /**
      * PDFBOX-3656 Radio button field with FLAG_RADIOS_IN_UNISON false
      * 
      * @throws IOException

Reply via email to