diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/AddBlockDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/AddBlockDialog.java index b34c472ac2..f14e991a1a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/AddBlockDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/AddBlockDialog.java @@ -201,6 +201,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { MemoryBlockType.BIT_MAPPED, MemoryBlockType.BYTE_MAPPED }; comboBox = new GhidraComboBox<>(items); + comboBox.getAccessibleContext().setAccessibleName("Block Type"); comboBox.addItemListener(e -> blockTypeSelected()); panel.add(comboBox); return panel; @@ -265,6 +266,9 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { initialValueLabel = new GDLabel("Initial Value"); initialValueField = new RegisterField(8, null, false); initialValueField.setName("Initial Value"); + initialValueField.getAccessibleContext().setAccessibleName("Initialized Block Value"); + initialValueField.getAccessibleContext() + .setAccessibleDescription("Enter the initial value for every byte in this block"); initialValueField.setChangeListener(e -> initialValueChanged()); @@ -299,6 +303,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { return preferredSize; } }; + fileBytesComboBox.getAccessibleContext().setAccessibleName("Byte Source"); fileBytesComboBox.addItemListener(e -> fileBytesChanged()); if (!allFileBytes.isEmpty()) { model.setFileBytes(allFileBytes.get(0)); @@ -477,6 +482,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { baseAddrField.setAddressFactory(addrFactory); baseAddrField.setName("Source Addr"); baseAddrField.addChangeListener(ev -> baseAddressChanged()); + baseAddrField.setAccessibleName("Source Address"); JPanel schemePanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); @@ -485,12 +491,14 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { schemeDestByteCountField.setAllowsHexPrefix(false); schemeDestByteCountField.setDecimalMode(); schemeDestByteCountField.addChangeListener(ev -> schemeDestByteCountChanged()); + schemeDestByteCountField.setAccessibleName("Mapping Ratio: Destination Size"); schemeSrcByteCountField = new IntegerTextField(4, 1); schemeSrcByteCountField.setAllowNegativeValues(false); schemeSrcByteCountField.setAllowsHexPrefix(false); schemeSrcByteCountField.setDecimalMode(); schemeSrcByteCountField.addChangeListener(ev -> schemeSrcByteCountChanged()); + schemeSrcByteCountField.setAccessibleName("Mapping Ratio: Source Size"); schemePanel.add(schemeDestByteCountField.getComponent()); schemePanel.add(new GLabel(" : ")); @@ -516,6 +524,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { private Component buildCommentField() { commentField = new JTextField(); commentField.setName("Comment"); + commentField.getAccessibleContext().setAccessibleName("Memory Block Comment"); commentField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { @@ -538,6 +547,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { private Component buildLengthField() { lengthField = new RegisterField(36, null, false); lengthField.setName("Length"); + lengthField.getAccessibleContext().setAccessibleName("Memory Block Length"); lengthField.setChangeListener(e -> lengthChanged()); return lengthField; } @@ -545,6 +555,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { private Component buildFileOffsetField() { fileOffsetField = new RegisterField(60, null, false); fileOffsetField.setName("File Offset"); + fileOffsetField.getAccessibleContext().setAccessibleName("File Offset"); fileOffsetField.setChangeListener(e -> fileOffsetChanged()); return fileOffsetField; } @@ -552,6 +563,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { private Component buildAddressField() { addrField = new AddressInput(); addrField.setName("Start Addr"); + addrField.setAccessibleName("Memory Block Start Address"); addrFactory = model.getProgram().getAddressFactory(); addrField.setAddressFactory(addrFactory, AddressInput.INCLUDE_ALL_MEMORY_SPACES); addrField.addChangeListener(ev -> addrChanged()); @@ -561,6 +573,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { private Component buildNameField() { nameField = new JTextField(); nameField.setName("Block Name"); + nameField.getAccessibleContext().setAccessibleName("Memory Block Name"); nameField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/ExpandBlockDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/ExpandBlockDialog.java index 95edc07940..1f6e981e22 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/ExpandBlockDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/ExpandBlockDialog.java @@ -114,9 +114,13 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene startAddressInput = new AddressInput(); startAddressInput.setName("NewStartAddress"); startAddressInput.setAddressFactory(addrFactory); + startAddressInput.setAccessibleName("New Start Address"); + endAddressInput = new AddressInput(); endAddressInput.setName("EndAddress"); endAddressInput.setAddressFactory(addrFactory); + endAddressInput.setAccessibleName("New End Address"); + Address start = block.getStart(); Address end = block.getEnd(); @@ -139,6 +143,7 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene lengthField = new RegisterField(32, null, false); lengthField.setName("BlockLength"); + lengthField.getAccessibleContext().setAccessibleName("Block Length"); lengthField.setValue(Long.valueOf(model.getLength())); panel.add( diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/ImageBaseDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/ImageBaseDialog.java index 7503618a07..aab6dc46c2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/ImageBaseDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/ImageBaseDialog.java @@ -67,6 +67,8 @@ class ImageBaseDialog extends DialogComponentProvider { JPanel panel = new JPanel(new MiddleLayout()); textField = new JTextField(20); textField.setText(currentAddr.toString()); + textField.getAccessibleContext().setAccessibleName("Image Base Address"); + textField.selectAll(); textField.addActionListener(e -> { if (addr != null) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/SplitBlockDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/SplitBlockDialog.java index 7e9ccf8693..667443eb2b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/SplitBlockDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/SplitBlockDialog.java @@ -94,14 +94,18 @@ class SplitBlockDialog extends DialogComponentProvider { panelOne.setBorder(BorderFactory.createTitledBorder("Block to Split")); blockOneNameField = new JTextField(10); blockOneNameField.setName("BlockOneName"); + blockOneNameField.getAccessibleContext().setAccessibleName("Name of Block To Split"); blockOneStartField = new JTextField(10); blockOneStartField.setName("BlockOneStart"); + blockOneStartField.getAccessibleContext().setAccessibleName("Address of Block To Split"); blockOneEnd = new AddressInput(); blockOneEnd.setName("BlockOneEnd"); + blockOneEnd.setAccessibleName("New Block End Adddress"); blockOneLengthField = new RegisterField(32, null, false); blockOneLengthField.setName("BlockOneLength"); + blockOneLengthField.getAccessibleContext().setAccessibleName("New Block Length"); panelOne.add(new GLabel("Block Name:", SwingConstants.RIGHT)); panelOne.add(blockOneNameField); @@ -116,13 +120,16 @@ class SplitBlockDialog extends DialogComponentProvider { panelTwo.setBorder(BorderFactory.createTitledBorder("New Block")); blockTwoNameField = new JTextField(10); blockTwoNameField.setName("BlockTwoName"); + blockTwoNameField.getAccessibleContext().setAccessibleName("Name of New Block"); blockTwoStart = new AddressInput(); blockTwoStart.setName("BlockTwoStart"); + blockTwoStart.setAccessibleName("New Block Start Address"); blockTwoEndField = new JTextField(10); blockTwoEndField.setName("BlockTwoEnd"); blockTwoLengthField = new RegisterField(32, null, false); blockTwoLengthField.setName("BlockTwoLength"); + blockTwoLengthField.getAccessibleContext().setAccessibleName("New Block Size"); panelTwo.add(new GLabel("Block Name:", SwingConstants.RIGHT)); panelTwo.add(blockTwoNameField); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/totd/TipOfTheDayDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/totd/TipOfTheDayDialog.java index 0562450361..d5de482527 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/totd/TipOfTheDayDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/totd/TipOfTheDayDialog.java @@ -56,7 +56,6 @@ class TipOfTheDayDialog extends ReusableDialogComponentProvider { Icon tipIcon = new GIcon("icon.plugin.totd.provider"); tipArea = new JTextArea(4, 30); - tipArea.setEditable(false); tipArea.setFont(Gui.getFont(FONT_ID)); tipArea.setWrapStyleWord(true); tipArea.setLineWrap(true); @@ -139,6 +138,8 @@ class TipOfTheDayDialog extends ReusableDialogComponentProvider { } String tip = tips.get(tipIndex); tipArea.setText(tip); + tipArea.getAccessibleContext().setAccessibleName("Ghidra Tip of The Day"); + tipArea.getAccessibleContext().setAccessibleDescription(tip); } int getTipIndex() { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressInput.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressInput.java index 75c8e934a6..e493a2f5ff 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressInput.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressInput.java @@ -77,6 +77,7 @@ public class AddressInput extends JPanel implements FocusableEditor { textField.setName("JTextField");//for JUnits... combo = new GComboBox<>(); combo.setName("JComboBox");//for JUnits... + combo.getAccessibleContext().setAccessibleName("Address Space"); add(textField, BorderLayout.CENTER); //add(combo, BorderLayout.WEST); comboAdded = false; @@ -367,6 +368,14 @@ public class AddressInput extends JPanel implements FocusableEditor { combo.setEnabled(enabled); } + /** + * Sets the accessible name for this address input field. + * @param name the accessible name for this address field + */ + public void setAccessibleName(String name) { + textField.getAccessibleContext().setAccessibleName(name); + } + /** * Set the text field to be editable according to the state param. */ diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/OptionDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/OptionDialog.java index c778c81fb3..6146a73b2c 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/OptionDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/OptionDialog.java @@ -270,7 +270,7 @@ public class OptionDialog extends DialogComponentProvider { if (savedDialogChoicePanel != null) { panel.add(savedDialogChoicePanel, BorderLayout.SOUTH); } - + setAccessibleDescription(message); addWorkPanel(panel); setRememberLocation(false); setRememberSize(false); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/IntegerTextField.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/IntegerTextField.java index 3b50c31f39..b2236767fa 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/IntegerTextField.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/IntegerTextField.java @@ -139,6 +139,14 @@ public class IntegerTextField { listeners.add(listener); } + /** + * Sets the accessible name for the component of this input field. + * @param name the accessible name for this field + */ + public void setAccessibleName(String name) { + textField.getAccessibleContext().setAccessibleName(name); + } + /** * Removes the changes listener. *