GP-4520 fixing accessibility for SaveDataDialog and DomainFilePanel

This commit is contained in:
ghidragon 2024-04-12 19:59:56 +00:00
parent 6c60bd0313
commit e1352bf7cc
4 changed files with 58 additions and 5 deletions

View file

@ -87,6 +87,7 @@ public class ByteViewerOptionsDialog extends DialogComponentProvider
addressInputField.setAddress(getAlignmentAddress());
panel.add(addressInputField);
addressInputField.addChangeListener(this);
addressInputField.setAccessibleName("Alignment Address");
}
}
@ -97,6 +98,7 @@ public class ByteViewerOptionsDialog extends DialogComponentProvider
bytesPerLineField.setValue(BigInteger.valueOf(provider.getBytesPerLine()));
panel.add(bytesPerLineField);
bytesPerLineField.addChangeListener(this);
bytesPerLineField.getAccessibleContext().setAccessibleName("Bytes Per Line");
panel.add(new GLabel("Group size (Hex View Only):"));
groupSizeField = new FixedBitSizeValueField(8, false, true);
@ -105,6 +107,7 @@ public class ByteViewerOptionsDialog extends DialogComponentProvider
groupSizeField.setValue(BigInteger.valueOf(provider.getGroupSize()));
panel.add(groupSizeField);
groupSizeField.addChangeListener(this);
groupSizeField.getAccessibleContext().setAccessibleName("Group Size");
return panel;
}

View file

@ -33,6 +33,7 @@ public class ListPanel<T> extends JPanel {
private ListSelectionListener listSelectionListener;
private ActionListener doubleClickActionListener;
private MouseListener mouseListener;
private KeyListener keyListener;
private JScrollPane scrollpane;
private JList<T> list;
@ -258,6 +259,14 @@ public class ListPanel<T> extends JPanel {
mouseListener = l;
}
public void setKeyListener(KeyListener l) {
if (keyListener != null) {
list.removeKeyListener(keyListener);
}
list.addKeyListener(l);
keyListener = l;
}
/**
* Displays a standard warning message about no selected objects
* in the list.

View file

@ -16,8 +16,7 @@
package ghidra.framework.main;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
@ -159,6 +158,7 @@ public class SaveDataDialog extends DialogComponentProvider {
listPanel = new ListPanel<>();
listPanel.setCellRenderer(new DataCellRenderer());
listPanel.setMouseListener(new ListMouseListener());
listPanel.setKeyListener(new ListKeyListener());
parentPanel.add(myButtonPanel, BorderLayout.EAST);
parentPanel.add(listPanel, BorderLayout.CENTER);
@ -255,11 +255,15 @@ public class SaveDataDialog extends DialogComponentProvider {
boldFont = font.deriveFont(font.getStyle() | Font.BOLD);
}
Color fg = isSelected ? list.getSelectionForeground() : list.getForeground();
Color bg = isSelected ? list.getSelectionBackground() : list.getBackground();
// set color to red if file cannot be saved 'as is'
if (!saveable[index]) {
checkboxes[index].setForeground(Colors.ERROR);
fg = Colors.ERROR;
checkboxes[index].setFont(boldFont);
}
checkboxes[index].setForeground(fg);
checkboxes[index].setBackground(bg);
return checkboxes[index];
}
}
@ -290,6 +294,23 @@ public class SaveDataDialog extends DialogComponentProvider {
}
}
private class ListKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
e.consume();
JList<?> list = (JList<?>) e.getSource();
int index = list.getSelectedIndex();
if (index < 0) {
return;
}
boolean selected = checkboxes[index].isSelected();
checkboxes[index].setSelected(!selected);
listPanel.repaint();
}
}
}
private class SaveTask extends Task {
private DomainFile[] domainFiles;

View file

@ -16,8 +16,7 @@
package ghidra.framework.main.datatree;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
@ -63,6 +62,7 @@ class DomainFilesPanel extends JPanel {
listPanel = new ListPanel<>();
listPanel.setCellRenderer(new DataCellRenderer());
listPanel.setMouseListener(new ListMouseListener());
listPanel.setKeyListener(new ListKeyListener());
if (listTitle != null) {
listPanel.setListTitle(listTitle);
}
@ -107,6 +107,10 @@ class DomainFilesPanel extends JPanel {
}
index = selected;
}
Color fg = isSelected ? list.getSelectionForeground() : list.getForeground();
Color bg = isSelected ? list.getSelectionBackground() : list.getBackground();
checkboxes[index].setForeground(fg);
checkboxes[index].setBackground(bg);
return checkboxes[index];
}
}
@ -137,4 +141,20 @@ class DomainFilesPanel extends JPanel {
}
}
private class ListKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
e.consume();
JList<?> list = (JList<?>) e.getSource();
int index = list.getSelectedIndex();
if (index < 0) {
return;
}
boolean selected = checkboxes[index].isSelected();
checkboxes[index].setSelected(!selected);
listPanel.repaint();
}
}
}
}