diff --git a/Ghidra/Extensions/SampleTablePlugin/src/main/java/ghidra/examples/SampleTableProvider.java b/Ghidra/Extensions/SampleTablePlugin/src/main/java/ghidra/examples/SampleTableProvider.java index 5138a5bee0..f07eaf3297 100644 --- a/Ghidra/Extensions/SampleTablePlugin/src/main/java/ghidra/examples/SampleTableProvider.java +++ b/Ghidra/Extensions/SampleTablePlugin/src/main/java/ghidra/examples/SampleTableProvider.java @@ -162,7 +162,7 @@ public class SampleTableProvider extends ComponentProviderAdapter implements Opt StringBuilder buffer = new StringBuilder(); buffer.append("Writing the following objects to file: "); - buffer.append(fileChooserPanel.getFileName()); + buffer.append(HTMLUtilities.friendlyEncodeHTML(fileChooserPanel.getFileName())); List selectedObjects = filterTable.getSelectedRowObjects(); for (FunctionStatsRowObject stats : selectedObjects) { diff --git a/Ghidra/Extensions/sample/src/main/java/ghidra/examples/graph/SampleGraphProvider.java b/Ghidra/Extensions/sample/src/main/java/ghidra/examples/graph/SampleGraphProvider.java index aef597aad7..e5de5cc567 100644 --- a/Ghidra/Extensions/sample/src/main/java/ghidra/examples/graph/SampleGraphProvider.java +++ b/Ghidra/Extensions/sample/src/main/java/ghidra/examples/graph/SampleGraphProvider.java @@ -28,8 +28,7 @@ import javax.swing.event.DocumentListener; import org.apache.commons.lang3.StringUtils; -import docking.ActionContext; -import docking.ComponentProvider; +import docking.*; import docking.action.ToggleDockingAction; import docking.action.ToolBarData; import docking.menu.ActionState; @@ -146,7 +145,7 @@ public class SampleGraphProvider extends ComponentProviderAdapter { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS)); - JLabel label = new JLabel("Vertex Filter: "); + JLabel label = DockingUtils.createNonHtmlLabel("Vertex Filter: "); label.setToolTipText( "Vertices with names matching the filter will remain, along with connected vertices"); panel.add(label); @@ -198,7 +197,7 @@ public class SampleGraphProvider extends ComponentProviderAdapter { fadedButton.setSelected(true); JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); - panel.add(new JLabel("Filtered Display: ")); + panel.add(DockingUtils.createNonHtmlLabel("Filtered Display: ")); panel.add(fadedButton); panel.add(removedButton); return panel; @@ -207,7 +206,7 @@ public class SampleGraphProvider extends ComponentProviderAdapter { private void installTooltipProvider() { VertexTooltipProvider tooltipProvider = - new VertexTooltipProvider() { + new VertexTooltipProvider<>() { @Override public JComponent getTooltip(SampleVertex v) { @@ -342,8 +341,7 @@ public class SampleGraphProvider extends ComponentProviderAdapter { private void addLayoutAction() { MultiStateDockingAction> layoutAction = - new MultiStateDockingAction>( - RELAYOUT_GRAPH_ACTION_NAME, plugin.getName()) { + new MultiStateDockingAction<>(RELAYOUT_GRAPH_ACTION_NAME, plugin.getName()) { @Override protected void doActionPerformed(ActionContext context) { diff --git a/Ghidra/Features/Base/ghidra_scripts/SearchGuiSingle.java b/Ghidra/Features/Base/ghidra_scripts/SearchGuiSingle.java index 17eaa38f51..ba1ed4b279 100644 --- a/Ghidra/Features/Base/ghidra_scripts/SearchGuiSingle.java +++ b/Ghidra/Features/Base/ghidra_scripts/SearchGuiSingle.java @@ -23,6 +23,8 @@ import java.awt.event.ActionListener; import javax.swing.*; +import docking.DockingUtils; + public class SearchGuiSingle extends SearchBaseExtended { private JButton searchButton; @@ -48,7 +50,7 @@ public class SearchGuiSingle extends SearchBaseExtended { opTwoCheckBox = new JCheckBox("Operand 2", false); constCheckBox = new JCheckBox("Constants", false); searchButton = new JButton(); - jLabel1 = new JLabel(); + jLabel1 = DockingUtils.createNonHtmlLabel(); GroupLayout jPanel1Layout = new GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeManagerProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeManagerProvider.java index 85b715718b..05528e6412 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeManagerProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeManagerProvider.java @@ -20,8 +20,7 @@ import java.awt.event.*; import javax.swing.*; -import docking.ActionContext; -import docking.WindowPosition; +import docking.*; import docking.options.editor.ButtonPanelFactory; import docking.widgets.OptionDialog; import ghidra.app.context.ListingActionContext; @@ -106,9 +105,9 @@ class MergeManagerProvider extends ComponentProviderAdapter { ListingMergePanel listingMergePanel = (ListingMergePanel) currentComponent; Object actionContext = listingMergePanel.getActionContext(event); if (actionContext instanceof ProgramLocation) { - ListingActionContext listingActionContext = - new ListingActionContext(this, navigatable, (ProgramLocation) actionContext); - return listingActionContext; + ListingActionContext listingActionContext = new ListingActionContext(this, + navigatable, (ProgramLocation) actionContext); + return listingActionContext; } } ProgramLocation programLocation = navigatable.getLocation(); @@ -206,11 +205,11 @@ class MergeManagerProvider extends ComponentProviderAdapter { mainPanel.setLayout(new BorderLayout(0, 10)); mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - nameLabel = new JLabel("Merge Programs", SwingConstants.LEFT); + nameLabel = DockingUtils.createNonHtmlLabel("Merge Programs", SwingConstants.LEFT); JPanel iconPanel = new JPanel(); new BoxLayout(iconPanel, BoxLayout.X_AXIS); - JLabel iconLabel = new JLabel(MERGE_ICON); + JLabel iconLabel = DockingUtils.createNonHtmlLabel(MERGE_ICON); iconPanel.add(Box.createHorizontalStrut(5)); iconPanel.add(iconLabel); iconPanel.add(Box.createHorizontalStrut(5)); @@ -248,9 +247,8 @@ class MergeManagerProvider extends ComponentProviderAdapter { } }); - JPanel panel = - ButtonPanelFactory.createButtonPanel(new JButton[] { applyButton, cancelButton }, - ButtonPanelFactory.X_AXIS); + JPanel panel = ButtonPanelFactory.createButtonPanel( + new JButton[] { applyButton, cancelButton }, ButtonPanelFactory.X_AXIS); return panel; } @@ -264,7 +262,7 @@ class MergeManagerProvider extends ComponentProviderAdapter { phasePanel = new PhaseProgressPanel("Progress In Current Phase"); defaultPanel.add(progressPanel); // panel with each phase and their status indicators. - defaultPanel.add(new JLabel(" ")); // Blank separator label. + defaultPanel.add(DockingUtils.createNonHtmlLabel(" ")); // Blank separator label. defaultPanel.add(phasePanel); // panel for the current phase's progress and message. conflictPanel.add(defaultPanel, DEFAULT_ID); conflictPanel.setPreferredSize(new Dimension(610, 500)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeProgressPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeProgressPanel.java index d42e85f127..b3a534523d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeProgressPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeProgressPanel.java @@ -22,6 +22,7 @@ import java.util.HashMap; import javax.swing.*; import javax.swing.border.Border; +import docking.DockingUtils; import ghidra.util.Msg; import ghidra.util.layout.VerticalLayout; import resources.ResourceManager; @@ -36,7 +37,7 @@ public class MergeProgressPanel extends JPanel { public static ImageIcon IN_PROGRESS_ICON = ResourceManager.loadImage("images/right.png"); public static ImageIcon COMPLETED_ICON = ResourceManager.loadImage("images/checkmark_green.gif"); - private HashMap imageMap = new HashMap(); + private HashMap imageMap = new HashMap<>(); private static int INDENT_IN_PIXELS = 20; /** @@ -56,18 +57,18 @@ public class MergeProgressPanel extends JPanel { BoxLayout bl = new BoxLayout(phasesTitlePanel, BoxLayout.X_AXIS); phasesTitlePanel.setLayout(bl); phasesTitlePanel.add(Box.createHorizontalStrut(5)); - phasesTitlePanel.add(new JLabel("Merge Status")); + phasesTitlePanel.add(DockingUtils.createNonHtmlLabel("Merge Status")); phasesTitlePanel.add(Box.createHorizontalStrut(15)); - phasesTitlePanel.add(new JLabel("( ")); - phasesTitlePanel.add(new JLabel(DEFINED_ICON)); - phasesTitlePanel.add(new JLabel(" = Pending")); + phasesTitlePanel.add(DockingUtils.createNonHtmlLabel("( ")); + phasesTitlePanel.add(DockingUtils.createNonHtmlLabel(DEFINED_ICON)); + phasesTitlePanel.add(DockingUtils.createNonHtmlLabel(" = Pending")); phasesTitlePanel.add(Box.createHorizontalStrut(10)); - phasesTitlePanel.add(new JLabel(IN_PROGRESS_ICON)); - phasesTitlePanel.add(new JLabel(" = In Progress")); + phasesTitlePanel.add(DockingUtils.createNonHtmlLabel(IN_PROGRESS_ICON)); + phasesTitlePanel.add(DockingUtils.createNonHtmlLabel(" = In Progress")); phasesTitlePanel.add(Box.createHorizontalStrut(10)); - phasesTitlePanel.add(new JLabel(COMPLETED_ICON)); - phasesTitlePanel.add(new JLabel(" = Completed")); - phasesTitlePanel.add(new JLabel(" )")); + phasesTitlePanel.add(DockingUtils.createNonHtmlLabel(COMPLETED_ICON)); + phasesTitlePanel.add(DockingUtils.createNonHtmlLabel(" = Completed")); + phasesTitlePanel.add(DockingUtils.createNonHtmlLabel(" )")); phasesTitlePanel.add(Box.createHorizontalStrut(5)); return phasesTitlePanel; } @@ -83,8 +84,8 @@ public class MergeProgressPanel extends JPanel { */ public JPanel addInfo(String[] phase) { int phaseDepth = phase.length - 1; - JLabel imageLabel = new JLabel(DEFINED_ICON); - JLabel infoLabel = new JLabel(phase[phaseDepth]); + JLabel imageLabel = DockingUtils.createNonHtmlLabel(DEFINED_ICON); + JLabel infoLabel = DockingUtils.createNonHtmlLabel(phase[phaseDepth]); JPanel labelPanel = new JPanel(); labelPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); BoxLayout bl = new BoxLayout(labelPanel, BoxLayout.X_AXIS); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/PhaseProgressPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/PhaseProgressPanel.java index 8b2daeb0eb..255b297d75 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/PhaseProgressPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/PhaseProgressPanel.java @@ -22,9 +22,9 @@ import java.awt.event.ActionListener; import javax.swing.*; +import docking.DockingUtils; import resources.ResourceManager; - /** * The PhaseProgressPanel provides a title, progress bar and message for the current phase that is * in progress @@ -33,7 +33,7 @@ public class PhaseProgressPanel extends JPanel { private final static String DEFAULT_INFO = "Merge programs in progress..."; private ImageIcon INFORM_ICON = ResourceManager.loadImage("images/information.png"); - + private JLabel titleLabel; private JProgressBar progressBar; private JPanel progressMessagePanel; @@ -43,13 +43,13 @@ public class PhaseProgressPanel extends JPanel { private boolean isShowingMessage = false; private String title; private SpringLayout progressLayout; - + private Timer updateTimer; private boolean isTimerRunning; private String message; private int progress; - private int lastProgress =-1; - + private int lastProgress = -1; + public PhaseProgressPanel(String title) { this.title = title; progressLayout = new SpringLayout(); @@ -57,13 +57,13 @@ public class PhaseProgressPanel extends JPanel { createProgressPanel(); adjustPreferredSize(); } - + /** * Determines and sets the preferred size of this panel. */ private void adjustPreferredSize() { - int width = titleLabel.getPreferredSize().width+5; - int height = titleLabel.getPreferredSize().height+5; + int width = titleLabel.getPreferredSize().width + 5; + int height = titleLabel.getPreferredSize().height + 5; if (isShowingProgress) { height += 5; height += progressBar.getPreferredSize().height; @@ -79,28 +79,30 @@ public class PhaseProgressPanel extends JPanel { } private void createProgressPanel() { - - titleLabel = new JLabel(title); + + titleLabel = DockingUtils.createNonHtmlLabel(title); add(titleLabel); progressLayout.putConstraint(SpringLayout.WEST, titleLabel, 5, SpringLayout.WEST, this); progressLayout.putConstraint(SpringLayout.NORTH, titleLabel, 5, SpringLayout.NORTH, this); - + progressBar = new JProgressBar(SwingConstants.HORIZONTAL); Dimension dim = progressBar.getPreferredSize(); - progressBar.setPreferredSize(new Dimension(500, (int)dim.getHeight())); + progressBar.setPreferredSize(new Dimension(500, (int) dim.getHeight())); progressBar.setMaximum(100); - progressLayout.putConstraint(SpringLayout.NORTH, progressBar, 5, SpringLayout.SOUTH, titleLabel); - progressLayout.putConstraint(SpringLayout.WEST, progressBar, 0, SpringLayout.WEST, titleLabel); + progressLayout.putConstraint(SpringLayout.NORTH, progressBar, 5, SpringLayout.SOUTH, + titleLabel); + progressLayout.putConstraint(SpringLayout.WEST, progressBar, 0, SpringLayout.WEST, + titleLabel); doSetProgress(0); - + progressMessagePanel = new JPanel(new BorderLayout()); - messageIcon = new JLabel(INFORM_ICON); + messageIcon = DockingUtils.createNonHtmlLabel(INFORM_ICON); messageIcon.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); - messageLabel = new JLabel(DEFAULT_INFO); + messageLabel = DockingUtils.createNonHtmlLabel(DEFAULT_INFO); progressMessagePanel.add(messageIcon, BorderLayout.WEST); progressMessagePanel.add(messageLabel, BorderLayout.CENTER); doSetMessage(DEFAULT_INFO); - + // Sets up the timer for updating the GUI. updateTimer = new Timer(250, new ActionListener() { @Override @@ -109,7 +111,7 @@ public class PhaseProgressPanel extends JPanel { } }); } - + // Method for use by the timer to update the progress bar or message. private synchronized void update() { boolean changed = false; @@ -128,7 +130,7 @@ public class PhaseProgressPanel extends JPanel { isTimerRunning = false; } } - + /** * Method to get the panel to update with changes when already on the screen. */ @@ -137,7 +139,7 @@ public class PhaseProgressPanel extends JPanel { repaint(); adjustPreferredSize(); } - + /** * Sets the title line displayed by this panel. * @param newTitle the new title string @@ -146,7 +148,7 @@ public class PhaseProgressPanel extends JPanel { titleLabel.setText(newTitle); doValidate(); } - + /** * Sets the progress message within this panel. * @param newMessage the new message text to be displayed. @@ -155,15 +157,15 @@ public class PhaseProgressPanel extends JPanel { messageLabel.setText(newMessage); if (!isShowingMessage) { add(progressMessagePanel); - progressLayout.putConstraint(SpringLayout.WEST, progressMessagePanel, 0, - SpringLayout.WEST, titleLabel); - progressLayout.putConstraint(SpringLayout.NORTH, progressMessagePanel, 5, - SpringLayout.SOUTH, (isShowingProgress ? progressBar : titleLabel)); - isShowingMessage = true; - } - doValidate(); + progressLayout.putConstraint(SpringLayout.WEST, progressMessagePanel, 0, + SpringLayout.WEST, titleLabel); + progressLayout.putConstraint(SpringLayout.NORTH, progressMessagePanel, 5, + SpringLayout.SOUTH, (isShowingProgress ? progressBar : titleLabel)); + isShowingMessage = true; + } + doValidate(); } - + /** * Sets the progress message within this panel. * @param message the new message text to be displayed. @@ -175,23 +177,24 @@ public class PhaseProgressPanel extends JPanel { isTimerRunning = true; } } - + /** * Fills in the progress bar to the indicated percent. * @param progressPercentage total percent of the progress bar that should be filled in. */ private void doSetProgress(final int progressPercentage) { if (progressPercentage < 0 || progressPercentage > 100) { - throw new RuntimeException("Invalid progress value ("+progressPercentage+"). Must be from 0 to 100."); + throw new RuntimeException( + "Invalid progress value (" + progressPercentage + "). Must be from 0 to 100."); } if (!isShowingProgress) { add(progressBar); - isShowingProgress = true; - } + isShowingProgress = true; + } progressBar.setValue(progressPercentage); doValidate(); } - + /** * Fills in the progress bar to the indicated percent. * @param progressPercentage total percent of the progress bar that should be filled in. @@ -203,7 +206,7 @@ public class PhaseProgressPanel extends JPanel { isTimerRunning = true; } } - + /** * Removes the message from being displayed by this panel. * Setting the message text will cause it to get added again. @@ -213,7 +216,7 @@ public class PhaseProgressPanel extends JPanel { isShowingMessage = false; doValidate(); } - + /** * Removes the progress bar from being displayed by this panel. * Setting progress will cause it to get added again. @@ -221,12 +224,13 @@ public class PhaseProgressPanel extends JPanel { public void removeProgress() { remove(progressBar); if (isShowingMessage) { - progressLayout.putConstraint(SpringLayout.NORTH, messageIcon, 5, SpringLayout.SOUTH, titleLabel); + progressLayout.putConstraint(SpringLayout.NORTH, messageIcon, 5, SpringLayout.SOUTH, + titleLabel); } isShowingProgress = false; doValidate(); } - + // /** // * @param args // */ diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/CategoryConflictPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/CategoryConflictPanel.java index 68aad009bc..a4d038e01f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/CategoryConflictPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/CategoryConflictPanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +22,7 @@ import java.awt.event.ItemListener; import javax.swing.*; import javax.swing.event.ChangeListener; +import docking.DockingUtils; import ghidra.app.merge.MergeConstants; /** @@ -31,10 +31,10 @@ import ghidra.app.merge.MergeConstants; * */ class CategoryConflictPanel extends JPanel { - - public static final String LATEST_BUTTON_NAME = "LatestVersionRB"; - public static final String CHECKED_OUT_BUTTON_NAME = "CheckedOutVersionRB"; - public static final String ORIGINAL_BUTTON_NAME = "OriginalVersionRB"; + + public static final String LATEST_BUTTON_NAME = "LatestVersionRB"; + public static final String CHECKED_OUT_BUTTON_NAME = "CheckedOutVersionRB"; + public static final String ORIGINAL_BUTTON_NAME = "OriginalVersionRB"; private ChangeListener listener; private JRadioButton latestRB; private JRadioButton myRB; @@ -42,7 +42,6 @@ class CategoryConflictPanel extends JPanel { private ButtonGroup group; private JPanel rbPanel; private JLabel categoryLabel; - CategoryConflictPanel(String title, ChangeListener listener) { super(new BorderLayout()); @@ -50,24 +49,24 @@ class CategoryConflictPanel extends JPanel { create(); this.listener = listener; } - void setConflictInfo(String categoryName, - String latestStr, String myStr, String origStr) { + + void setConflictInfo(String categoryName, String latestStr, String myStr, String origStr) { categoryLabel.setText(categoryName); group.remove(latestRB); group.remove(myRB); group.remove(originalRB); - - latestRB.setText(latestStr); - + + latestRB.setText(latestStr); + myRB.setText(myStr); originalRB.setText(origStr); - + latestRB.setSelected(false); myRB.setSelected(false); originalRB.setSelected(false); addToButtonGroup(); } - + int getSelectedOption() { if (latestRB.isSelected()) { return DataTypeMergeManager.OPTION_LATEST; @@ -85,39 +84,40 @@ class CategoryConflictPanel extends JPanel { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - - JLabel clabel = new JLabel("Category: "); - categoryLabel = new JLabel("CategoryName"); + + JLabel clabel = DockingUtils.createNonHtmlLabel("Category: "); + categoryLabel = DockingUtils.createNonHtmlLabel("CategoryName"); categoryLabel.setForeground(MergeConstants.CONFLICT_COLOR); - + JPanel labelPanel = new JPanel(); labelPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); labelPanel.setLayout(new BoxLayout(labelPanel, BoxLayout.X_AXIS)); labelPanel.add(clabel); labelPanel.add(Box.createHorizontalStrut(5)); labelPanel.add(categoryLabel); - + latestRB = new JRadioButton("Use Latest"); myRB = new JRadioButton("Use My Version"); originalRB = new JRadioButton("Use Original"); latestRB.setName(LATEST_BUTTON_NAME); myRB.setName(CHECKED_OUT_BUTTON_NAME); originalRB.setName(ORIGINAL_BUTTON_NAME); - + group = new ButtonGroup(); addToButtonGroup(); - + rbPanel = new JPanel(); rbPanel.setLayout(new BoxLayout(rbPanel, BoxLayout.Y_AXIS)); - + rbPanel.add(latestRB); rbPanel.add(myRB); rbPanel.add(originalRB); panel.add(labelPanel, BorderLayout.NORTH); panel.add(rbPanel, BorderLayout.CENTER); - + add(panel); ItemListener itemListener = new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { if (listener != null) { listener.stateChanged(null); @@ -129,9 +129,10 @@ class CategoryConflictPanel extends JPanel { originalRB.addItemListener(itemListener); } + private void addToButtonGroup() { group.add(latestRB); group.add(myRB); group.add(originalRB); - } + } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/DataTypeMergePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/DataTypeMergePanel.java index a7a060817e..f07a753e96 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/DataTypeMergePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/DataTypeMergePanel.java @@ -22,6 +22,7 @@ import java.awt.event.ItemListener; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.MultiLineLabel; import ghidra.app.merge.MergeConstants; import ghidra.app.merge.util.ConflictCountPanel; @@ -178,13 +179,13 @@ class DataTypeMergePanel extends JPanel { private JPanel createInfoPanel() { Icon icon = ResourceManager.loadImage("images/information.png"); - JLabel imageLabel = new JLabel(icon); + JLabel imageLabel = DockingUtils.createNonHtmlLabel(icon); MultiLineLabel label = - new MultiLineLabel("A data type change in your checked out version conflicts with a " - + "data type change in the latest version.\n" - + "Select the data type change you want included in the version " - + "that will result from this check-in."); + new MultiLineLabel("A data type change in your checked out version conflicts with a " + + "data type change in the latest version.\n" + + "Select the data type change you want included in the version " + + "that will result from this check-in."); JPanel labelPanel = new JPanel(); labelPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 0)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/SourceArchiveMergePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/SourceArchiveMergePanel.java index a81d670004..75182486c2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/SourceArchiveMergePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/SourceArchiveMergePanel.java @@ -22,6 +22,7 @@ import java.awt.event.ItemListener; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.MultiLineLabel; import ghidra.app.merge.MergeConstants; import ghidra.app.merge.util.ConflictCountPanel; @@ -173,14 +174,13 @@ class SourceArchiveMergePanel extends JPanel { private JPanel createInfoPanel() { Icon icon = ResourceManager.loadImage("images/information.png"); - JLabel imageLabel = new JLabel(icon); + JLabel imageLabel = DockingUtils.createNonHtmlLabel(icon); - MultiLineLabel label = - new MultiLineLabel( - "A source archive change in your checked out version conflicts with a " - + "source archive change in the latest version.\n" - + "Select the source archive you want included in the version " - + "that will result from this check-in."); + MultiLineLabel label = new MultiLineLabel( + "A source archive change in your checked out version conflicts with a " + + "source archive change in the latest version.\n" + + "Select the source archive you want included in the version " + + "that will result from this check-in."); JPanel labelPanel = new JPanel(); labelPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 0)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ConflictInfoPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ConflictInfoPanel.java index ae1a11d240..dbafaf919e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ConflictInfoPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ConflictInfoPanel.java @@ -20,8 +20,10 @@ import java.awt.BorderLayout; import javax.swing.*; import javax.swing.border.TitledBorder; +import docking.DockingUtils; import ghidra.app.merge.util.ConflictUtility; import ghidra.program.model.address.*; +import ghidra.util.HTMLUtilities; /** * ConflictInfoPanel appears above the 4 listings in the ListingMergeWindow. @@ -58,8 +60,8 @@ public class ConflictInfoPanel extends JPanel { setLayout(new BorderLayout()); setBorder(BorderFactory.createTitledBorder("Resolve Current Conflict")); - westLabel = new JLabel(""); - eastLabel = new JLabel(""); + westLabel = DockingUtils.createHtmlLabel(""); + eastLabel = DockingUtils.createHtmlLabel(""); add(westLabel, BorderLayout.WEST); add(eastLabel, BorderLayout.EAST); } @@ -154,7 +156,8 @@ public class ConflictInfoPanel extends JPanel { } private void addAddress(StringBuffer buf, Address addr) { - buf.append("" + addr.toString() + ""); + buf.append("" + HTMLUtilities.friendlyEncodeHTML(addr.toString()) + + ""); } private void updateWest() { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalAddConflictPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalAddConflictPanel.java index 0688a5be51..cbfe2f8cca 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalAddConflictPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalAddConflictPanel.java @@ -21,6 +21,7 @@ import java.awt.event.ItemListener; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.EmptyBorderButton; import docking.widgets.fieldpanel.FieldPanel; import docking.widgets.fieldpanel.internal.FieldPanelCoordinator; @@ -253,7 +254,7 @@ class ExternalAddConflictPanel extends JPanel implements CodeFormatService { myTitlePanel = new TitledPanel(MergeConstants.MY_TITLE, myPanel, 5); latestTitlePanel.addTitleComponent(new ShowHeaderButton()); - myTitlePanel.addTitleComponent(new JLabel(new EmptyIcon(22, 22))); + myTitlePanel.addTitleComponent(DockingUtils.createNonHtmlLabel(new EmptyIcon(22, 22))); JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); splitPane.setResizeWeight(0.5); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalConflictInfoPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalConflictInfoPanel.java index 360324f0b2..8827800f26 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalConflictInfoPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ExternalConflictInfoPanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,14 @@ */ package ghidra.app.merge.listing; -import ghidra.app.merge.util.ConflictUtility; - import java.awt.BorderLayout; import javax.swing.*; import javax.swing.border.TitledBorder; +import docking.DockingUtils; +import ghidra.app.merge.util.ConflictUtility; + /** * ExternalConflictInfoPanel appears above the 4 listings in the ListingMergeWindow. * It indicates the Externals phase. @@ -54,8 +54,8 @@ public class ExternalConflictInfoPanel extends JPanel { setLayout(new BorderLayout()); setBorder(BorderFactory.createTitledBorder("Resolve External Location Conflict")); - westLabel = new JLabel(""); - eastLabel = new JLabel(""); + westLabel = DockingUtils.createHtmlLabel(""); + eastLabel = DockingUtils.createHtmlLabel(""); add(westLabel, BorderLayout.WEST); add(eastLabel, BorderLayout.EAST); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ScrollingListChoicesPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ScrollingListChoicesPanel.java index c49987b247..a261a70fcd 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ScrollingListChoicesPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/ScrollingListChoicesPanel.java @@ -25,6 +25,7 @@ import javax.swing.border.TitledBorder; import javax.swing.event.ChangeListener; import javax.swing.table.TableModel; +import docking.DockingUtils; import docking.widgets.table.AbstractSortedTableModel; import docking.widgets.table.GTable; import ghidra.app.merge.util.ConflictUtility; @@ -69,7 +70,7 @@ public class ScrollingListChoicesPanel extends ConflictPanel { gbl = new GridBagLayout(); rowPanel = new JPanel(gbl); setLayout(new BorderLayout()); - headerLabel = new JLabel(" "); + headerLabel = DockingUtils.createNonHtmlLabel(" "); headerLabel.setHorizontalAlignment(SwingConstants.CENTER); add(headerLabel, BorderLayout.NORTH); setHeader(null); @@ -257,7 +258,7 @@ class ListChoice extends JPanel { group.add(rb); add(rb, BorderLayout.NORTH); - model = new AbstractSortedTableModel() { + model = new AbstractSortedTableModel<>() { @Override public Object getColumnValueForRow(String[] t, int columnIndex) { return t[columnIndex]; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VariousChoicesPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VariousChoicesPanel.java index 405680f883..e93327d7ba 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VariousChoicesPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VariousChoicesPanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +15,6 @@ */ package ghidra.app.merge.listing; -import ghidra.app.merge.util.ConflictUtility; -import ghidra.util.layout.MaximizeSpecificColumnGridLayout; - import java.awt.*; import java.awt.event.*; import java.util.ArrayList; @@ -29,6 +25,11 @@ import javax.swing.border.Border; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeListener; +import docking.DockingUtils; +import ghidra.app.merge.util.ConflictUtility; +import ghidra.util.HTMLUtilities; +import ghidra.util.layout.MaximizeSpecificColumnGridLayout; + /** * VariousChoicesPanel provides a table type of format for resolving * multiple conflicts in one panel. Each row that has choices represents the @@ -40,8 +41,8 @@ import javax.swing.event.ChangeListener; public class VariousChoicesPanel extends ConflictPanel { private final static long serialVersionUID = 1; - private static final Border UNDERLINE_BORDER = BorderFactory.createMatteBorder(0, 0, 1, 0, - Color.BLACK); + private static final Border UNDERLINE_BORDER = + BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK); private JPanel rowPanel; private JLabel headerLabel; @@ -71,12 +72,12 @@ public class VariousChoicesPanel extends ConflictPanel { private void init() { setBorder(BorderFactory.createTitledBorder("Resolve Conflict")); - rows = new ArrayList(); + rows = new ArrayList<>(); layout = new MaximizeSpecificColumnGridLayout(5, 5, columnCount); rowPanel = new JPanel(layout); rowPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); setLayout(new BorderLayout()); - headerLabel = new JLabel(" "); + headerLabel = DockingUtils.createNonHtmlLabel(" "); headerLabel.setHorizontalAlignment(SwingConstants.CENTER); add(headerLabel, BorderLayout.NORTH); setHeader(null); @@ -86,9 +87,8 @@ public class VariousChoicesPanel extends ConflictPanel { indent = Math.max(rb.getPreferredSize().width, cb.getPreferredSize().width); int radioButtonOffset = (rb.getPreferredSize().height - lbl.getPreferredSize().height) / 2; int checkBoxOffset = (cb.getPreferredSize().height - lbl.getPreferredSize().height) / 2; - radioButtonBorder = - BorderFactory.createEmptyBorder((radioButtonOffset > 0 ? radioButtonOffset : 0), 0, 0, - 0); + radioButtonBorder = BorderFactory.createEmptyBorder( + (radioButtonOffset > 0 ? radioButtonOffset : 0), 0, 0, 0); checkBoxBorder = BorderFactory.createEmptyBorder((checkBoxOffset > 0 ? checkBoxOffset : 0), 0, 0, 0); @@ -171,7 +171,8 @@ public class VariousChoicesPanel extends ConflictPanel { * @param listener listener that gets notified whenever the state of * one of the radiobuttons in this row changes. */ - void addSingleChoice(final String title, final String[] choices, final ChangeListener listener) { + void addSingleChoice(final String title, final String[] choices, + final ChangeListener listener) { adjustColumnCount(choices.length + 1); for (int i = 0; i < choices.length; i++) { if (choices[i] == null) { @@ -225,7 +226,8 @@ public class VariousChoicesPanel extends ConflictPanel { * @param listener listener that gets notified whenever the state of * one of the checkboxes in this row changes. */ - void addMultipleChoice(final String title, final String[] choices, final ChangeListener listener) { + void addMultipleChoice(final String title, final String[] choices, + final ChangeListener listener) { adjustColumnCount(choices.length + 1); MyLabel titleComp = new MyLabel(title); MyCheckBox[] cb = new MyCheckBox[choices.length]; @@ -506,6 +508,7 @@ public class VariousChoicesPanel extends ConflictPanel { */ public MyLabel(final String text) { super(text); + DockingUtils.turnOffHTMLRendering(this); addComponentListener(new ComponentListener() { @Override @@ -522,7 +525,9 @@ public class VariousChoicesPanel extends ConflictPanel { (displayedFont != null) ? getFontMetrics(displayedFont) : null; int stringWidth = (fontMetrics != null) ? fontMetrics.stringWidth(displayedText) : 0; - setToolTipText((stringWidth > displayedWidth) ? text : null); + setToolTipText((stringWidth > displayedWidth) + ? "" + HTMLUtilities.friendlyEncodeHTML(text) + : null); } @Override diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VerticalChoicesPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VerticalChoicesPanel.java index 887777efcf..17633906ce 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VerticalChoicesPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/listing/VerticalChoicesPanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +15,6 @@ */ package ghidra.app.merge.listing; -import ghidra.app.merge.util.ConflictUtility; -import ghidra.util.datastruct.LongArrayList; -import ghidra.util.layout.MaximizeSpecificColumnGridLayout; - import java.awt.*; import java.awt.event.*; import java.util.*; @@ -29,6 +24,12 @@ import javax.swing.border.Border; import javax.swing.border.TitledBorder; import javax.swing.event.ChangeListener; +import docking.DockingUtils; +import ghidra.app.merge.util.ConflictUtility; +import ghidra.util.HTMLUtilities; +import ghidra.util.datastruct.LongArrayList; +import ghidra.util.layout.MaximizeSpecificColumnGridLayout; + /** * VerticalChoicesPanel is a conflict panel for the Listing Merge. * It lays out rows of information vertically in a table format. @@ -88,12 +89,12 @@ public class VerticalChoicesPanel extends ConflictPanel { setBorder(BorderFactory.createTitledBorder("Resolve Conflict")); setLayout(new BorderLayout()); - headerLabel = new JLabel(" "); + headerLabel = DockingUtils.createNonHtmlLabel(" "); headerLabel.setHorizontalAlignment(SwingConstants.CENTER); add(headerLabel, BorderLayout.NORTH); - rowComps = new ArrayList>(); - rows = new ArrayList(); + rowComps = new ArrayList<>(); + rows = new ArrayList<>(); rowTypes = new LongArrayList(); group = new ButtonGroup(); layout = new MaximizeSpecificColumnGridLayout(5, 5, columnCount); @@ -107,26 +108,24 @@ public class VerticalChoicesPanel extends ConflictPanel { indent = Math.max(rb.getPreferredSize().width, cb.getPreferredSize().width); defaultInsets = new Insets(DEFAULT_TOP, DEFAULT_LEFT, DEFAULT_BOTTOM, DEFAULT_RIGHT); - int labelHeight = (int) new JLabel("A").getPreferredSize().getHeight(); - double buttonHeight = - new MyRadioButton("A", ListingMergeConstants.KEEP_LATEST).getPreferredSize().getHeight(); + int labelHeight = (int) DockingUtils.createNonHtmlLabel("A").getPreferredSize().getHeight(); + double buttonHeight = new MyRadioButton("A", + ListingMergeConstants.KEEP_LATEST).getPreferredSize().getHeight(); int borderHeight; borderHeight = (int) ((buttonHeight - labelHeight) / 2); if (borderHeight < 0) { borderHeight = 0; } - textVsButtonInsets = - new Insets(DEFAULT_TOP + borderHeight, DEFAULT_LEFT, DEFAULT_BOTTOM + borderHeight, - DEFAULT_RIGHT); + textVsButtonInsets = new Insets(DEFAULT_TOP + borderHeight, DEFAULT_LEFT, + DEFAULT_BOTTOM + borderHeight, DEFAULT_RIGHT); double checkBoxHeight = new MyCheckBox("A", ListingMergeConstants.KEEP_LATEST).getPreferredSize().getHeight(); borderHeight = (int) ((checkBoxHeight - labelHeight) / 2); if (borderHeight < 0) { borderHeight = 0; } - textVsCheckBoxInsets = - new Insets(DEFAULT_TOP + borderHeight, DEFAULT_LEFT, DEFAULT_BOTTOM + borderHeight, - DEFAULT_RIGHT); + textVsCheckBoxInsets = new Insets(DEFAULT_TOP + borderHeight, DEFAULT_LEFT, + DEFAULT_BOTTOM + borderHeight, DEFAULT_RIGHT); add(createUseForAllCheckBox(), BorderLayout.SOUTH); } @@ -461,6 +460,7 @@ public class VerticalChoicesPanel extends ConflictPanel { */ public MyLabel(final String text) { super(text); + DockingUtils.turnOffHTMLRendering(this); addComponentListener(new ComponentListener() { @Override @@ -481,7 +481,9 @@ public class VerticalChoicesPanel extends ConflictPanel { (displayedFont != null) ? getFontMetrics(displayedFont) : null; int stringWidth = (fontMetrics != null) ? fontMetrics.stringWidth(displayedText) : 0; - setToolTipText((stringWidth > displayedWidth) ? text : null); + setToolTipText((stringWidth > displayedWidth) + ? "" + HTMLUtilities.friendlyEncodeHTML(text) + : null); } @Override @@ -622,7 +624,8 @@ public class VerticalChoicesPanel extends ConflictPanel { JComponent[] comps = getRowComponents(row); for (int i = 0; i < comps.length; i++) { JComponent component = comps[i]; - if (component instanceof MyRadioButton && ((MyRadioButton) component).isSelected()) { + if (component instanceof MyRadioButton && + ((MyRadioButton) component).isSelected()) { conflictOption |= ((MyRadioButton) component).option; } else if (component instanceof MyCheckBox && ((MyCheckBox) component).isSelected()) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/propertylist/ConflictPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/propertylist/ConflictPanel.java index 24b7ca50f6..4d76dc39d4 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/propertylist/ConflictPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/propertylist/ConflictPanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +15,6 @@ */ package ghidra.app.merge.propertylist; -import ghidra.app.merge.MergeConstants; - import java.awt.BorderLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; @@ -25,6 +22,9 @@ import java.awt.event.ItemListener; import javax.swing.*; import javax.swing.event.ChangeListener; +import docking.DockingUtils; +import ghidra.app.merge.MergeConstants; + /** * Panel that shows differences for properties in Property Lists. */ @@ -63,27 +63,27 @@ class ConflictPanel extends JPanel { } if (info.isTypeMatch()) { - setBorder(BorderFactory.createTitledBorder("Resolve Type Mismatch for Property " + - info.getDisplayedPropertyName())); + setBorder(BorderFactory.createTitledBorder( + "Resolve Type Mismatch for Property " + info.getDisplayedPropertyName())); latestRB.setText("Use type '" + info.getLatestTypeString() + "', value = '" + info.getLatestValue() + "' (" + MergeConstants.LATEST_TITLE + ")"); myRB.setText("Use type '" + info.getMyTypeString() + "', value = '" + info.getMyValue() + "' (" + MergeConstants.MY_TITLE + ")"); if (origValue != null) { - origText = - "Use type '" + info.getOrigTypeString() + "', value = '" + info.getOrigValue() + - "' (" + MergeConstants.ORIGINAL_TITLE + ")"; + origText = "Use type '" + info.getOrigTypeString() + "', value = '" + + info.getOrigValue() + "' (" + MergeConstants.ORIGINAL_TITLE + ")"; } } else { - setBorder(BorderFactory.createTitledBorder("Resolve Property Conflict for " + - info.getDisplayedPropertyName())); + setBorder(BorderFactory.createTitledBorder( + "Resolve Property Conflict for " + info.getDisplayedPropertyName())); - latestRB.setText("Use value '" + info.getLatestValue() + "' (" + - MergeConstants.LATEST_TITLE + ")"); - myRB.setText("Use value '" + info.getMyValue() + "' (" + MergeConstants.MY_TITLE + " )"); + latestRB.setText( + "Use value '" + info.getLatestValue() + "' (" + MergeConstants.LATEST_TITLE + ")"); + myRB.setText( + "Use value '" + info.getMyValue() + "' (" + MergeConstants.MY_TITLE + " )"); if (origValue != null) { origText = "Use value '" + origValue + "' (" + MergeConstants.ORIGINAL_TITLE + " )"; } @@ -133,7 +133,7 @@ class ConflictPanel extends JPanel { panel.setLayout(new BorderLayout()); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - propertyGroupLabel = new JLabel("Property Group: "); + propertyGroupLabel = DockingUtils.createNonHtmlLabel("Property Group: "); JPanel namePanel = new JPanel(new BorderLayout()); namePanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 10, 5)); @@ -163,6 +163,7 @@ class ConflictPanel extends JPanel { panel.add(createUseForAllCheckBox(), BorderLayout.SOUTH); ItemListener itemListener = new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { if (listener != null) { listener.stateChanged(null); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/tree/NameConflictsPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/tree/NameConflictsPanel.java index ffe6a88478..ef7759fae0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/tree/NameConflictsPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/tree/NameConflictsPanel.java @@ -22,6 +22,7 @@ import java.awt.event.ItemListener; import javax.swing.*; import javax.swing.event.ChangeListener; +import docking.DockingUtils; import ghidra.app.merge.MergeConstants; import ghidra.program.model.listing.Program; import resources.ResourceManager; @@ -58,17 +59,15 @@ class NameConflictsPanel extends JPanel { text = "Use name '" + latestName + "' (" + MergeConstants.LATEST_TITLE + ")"; } else { - text = - "Use '" + latestName + "' (" + MergeConstants.LATEST_TITLE + ") & lose '" + myName + - "' (" + MergeConstants.MY_TITLE + ")"; + text = "Use '" + latestName + "' (" + MergeConstants.LATEST_TITLE + ") & lose '" + + myName + "' (" + MergeConstants.MY_TITLE + ")"; } keepOtherRB.setText(text); String myText; if (myName.equals(latestName)) { - myText = - "Add '" + myName + "' (" + MergeConstants.MY_TITLE + ") as '" + - ProgramTreeMergeManager.getUniqueTreeName(resultProgram, myName) + "'"; + myText = "Add '" + myName + "' (" + MergeConstants.MY_TITLE + ") as '" + + ProgramTreeMergeManager.getUniqueTreeName(resultProgram, myName) + "'"; } else { myText = "Add tree '" + myName + "' (" + MergeConstants.MY_TITLE + ")"; @@ -82,15 +81,13 @@ class NameConflictsPanel extends JPanel { } else { if (origName.equals(latestName)) { - origText = - "Restore '" + origName + "' (" + MergeConstants.ORIGINAL_TITLE + ") as '" + - ProgramTreeMergeManager.getUniqueTreeName(resultProgram, origName) + "'" + - " & lose '" + myName + "' (" + MergeConstants.MY_TITLE + ")"; + origText = "Restore '" + origName + "' (" + MergeConstants.ORIGINAL_TITLE + + ") as '" + ProgramTreeMergeManager.getUniqueTreeName(resultProgram, origName) + + "'" + " & lose '" + myName + "' (" + MergeConstants.MY_TITLE + ")"; } else { - origText = - "Restore '" + origName + "' (" + MergeConstants.ORIGINAL_TITLE + ") & lose '" + - myName + "' (" + MergeConstants.MY_TITLE + ")"; + origText = "Restore '" + origName + "' (" + MergeConstants.ORIGINAL_TITLE + + ") & lose '" + myName + "' (" + MergeConstants.MY_TITLE + ")"; } } originalRB.setText(origText); @@ -129,9 +126,10 @@ class NameConflictsPanel extends JPanel { JPanel iconPanel = new JPanel(); iconPanel.setLayout(new BoxLayout(iconPanel, BoxLayout.X_AXIS)); - conflictsLabel = new JLabel("'My' name already exists in Latest Version"); + conflictsLabel = + DockingUtils.createNonHtmlLabel("'My' name already exists in Latest Version"); ImageIcon icon = ResourceManager.loadImage("images/information.png"); - iconPanel.add(new JLabel(icon)); + iconPanel.add(DockingUtils.createNonHtmlLabel(icon)); iconPanel.add(Box.createHorizontalStrut(5)); iconPanel.add(conflictsLabel); iconPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/tree/TreeChangePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/tree/TreeChangePanel.java index a7bd796994..2d6b316fa6 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/tree/TreeChangePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/tree/TreeChangePanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,12 +15,12 @@ */ package ghidra.app.merge.tree; -import ghidra.util.layout.PairLayout; - import java.awt.*; import javax.swing.*; +import docking.DockingUtils; +import ghidra.util.layout.PairLayout; import resources.ResourceManager; /** @@ -30,7 +29,7 @@ import resources.ResourceManager; * */ class TreeChangePanel extends JPanel { - + private JLabel treeNameLabel; private JLabel nameLabel; private JLabel structureLabel; @@ -38,67 +37,67 @@ class TreeChangePanel extends JPanel { private JPanel structurePanel; private JLabel nameIconLabel; private JLabel structureIconLabel; - - private final static ImageIcon CHANGED_ICON = - ResourceManager.loadImage("images/changed16.gif"); + + private final static ImageIcon CHANGED_ICON = ResourceManager.loadImage("images/changed16.gif"); private final static ImageIcon NO_CHANGE_ICON = ResourceManager.loadImage("images/EmptyIcon16.gif"); private final static Color CHANGED_COLOR = Color.BLACK; private final static Color NO_CHANGE_COLOR = Color.GRAY; - + TreeChangePanel(String title) { super(new BorderLayout()); setBorder(BorderFactory.createTitledBorder(title)); create(); } - + void setStates(String treeName, boolean nameChanged, boolean structureChanged) { - + treeNameLabel.setText(treeName); - nameLabel.setText(nameChanged? "Name Changed" : "Name Not Changed"); - nameLabel.setForeground(nameChanged? CHANGED_COLOR : NO_CHANGE_COLOR); + nameLabel.setText(nameChanged ? "Name Changed" : "Name Not Changed"); + nameLabel.setForeground(nameChanged ? CHANGED_COLOR : NO_CHANGE_COLOR); namePanel.remove(nameIconLabel); - nameIconLabel = new JLabel(nameChanged? CHANGED_ICON : NO_CHANGE_ICON); + nameIconLabel = + DockingUtils.createNonHtmlLabel(nameChanged ? CHANGED_ICON : NO_CHANGE_ICON); namePanel.add(nameIconLabel, 0); - - structureLabel.setText(structureChanged? - "Structure Changed" : "Structure Not Changed"); - structureLabel.setForeground(structureChanged? CHANGED_COLOR : NO_CHANGE_COLOR); + + structureLabel.setText(structureChanged ? "Structure Changed" : "Structure Not Changed"); + structureLabel.setForeground(structureChanged ? CHANGED_COLOR : NO_CHANGE_COLOR); structurePanel.remove(structureIconLabel); - structureIconLabel = new JLabel(structureChanged? CHANGED_ICON : NO_CHANGE_ICON); + structureIconLabel = + DockingUtils.createNonHtmlLabel(structureChanged ? CHANGED_ICON : NO_CHANGE_ICON); structurePanel.add(structureIconLabel, 0); } - + private void create() { JPanel panel = new JPanel(new BorderLayout(0, 5)); panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - - treeNameLabel = new JLabel("Tree Name"); + + treeNameLabel = DockingUtils.createNonHtmlLabel("Tree Name"); Font font = treeNameLabel.getFont(); font = new Font(font.getName(), Font.BOLD, font.getSize()); treeNameLabel.setFont(font); - nameLabel = new JLabel("Name Changed"); - nameIconLabel = new JLabel(CHANGED_ICON); - - structureLabel = new JLabel("Structure Changed"); - structureIconLabel = new JLabel(CHANGED_ICON); - - namePanel = new JPanel(new PairLayout(0,5)); + nameLabel = DockingUtils.createNonHtmlLabel("Name Changed"); + nameIconLabel = DockingUtils.createNonHtmlLabel(CHANGED_ICON); + + structureLabel = DockingUtils.createNonHtmlLabel("Structure Changed"); + structureIconLabel = DockingUtils.createNonHtmlLabel(CHANGED_ICON); + + namePanel = new JPanel(new PairLayout(0, 5)); namePanel.add(nameIconLabel); namePanel.add(nameLabel); - - structurePanel = new JPanel(new PairLayout(0,5)); + + structurePanel = new JPanel(new PairLayout(0, 5)); structurePanel.add(structureIconLabel); structurePanel.add(structureLabel); - + JPanel labelPanel = new JPanel(); labelPanel.setLayout(new BoxLayout(labelPanel, BoxLayout.Y_AXIS)); labelPanel.add(namePanel); labelPanel.add(structurePanel); - + panel.add(treeNameLabel, BorderLayout.NORTH); panel.add(labelPanel, BorderLayout.CENTER); - add(panel); + add(panel); } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/util/ConflictUtility.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/util/ConflictUtility.java index 2aead5a191..a59a41e779 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/util/ConflictUtility.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/util/ConflictUtility.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +18,7 @@ package ghidra.app.merge.util; import ghidra.program.model.address.Address; import ghidra.program.model.address.AddressRange; import ghidra.program.util.DiffUtility; +import ghidra.util.HTMLUtilities; /** * ConflictUtility provides some constants and static methods @@ -169,7 +169,8 @@ public class ConflictUtility { * @param isRange true if the current conflict is for an address range. * @return the message string containing HTML tags. */ - public static String getAddressConflictCount(int addressNum, int totalAddresses, boolean isRange) { + public static String getAddressConflictCount(int addressNum, int totalAddresses, + boolean isRange) { StringBuffer buf = new StringBuffer(); if (isRange) { buf.append("Address range #"); @@ -238,7 +239,8 @@ public class ConflictUtility { * @return the message string containing HTML tags. */ public static String getAddressString(Address address) { - return colorString(ADDRESS_COLOR, ((address != null) ? address.toString() : "")); + return colorString(ADDRESS_COLOR, + ((address != null) ? HTMLUtilities.friendlyEncodeHTML(address.toString()) : "")); } /** @@ -248,8 +250,10 @@ public class ConflictUtility { * @return the message string containing HTML tags. */ public static String getAddressString(Address address, boolean showAddressSpace) { - return colorString(ADDRESS_COLOR, ((address != null) ? address.toString(showAddressSpace) - : "")); + return colorString(ADDRESS_COLOR, + ((address != null) + ? HTMLUtilities.friendlyEncodeHTML(address.toString(showAddressSpace)) + : "")); } /** diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AnalysisPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AnalysisPanel.java index a21fd902b4..6184d0896e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AnalysisPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AnalysisPanel.java @@ -30,6 +30,7 @@ import javax.swing.table.*; import org.apache.commons.collections4.CollectionUtils; +import docking.DockingUtils; import docking.options.editor.GenericOptionsComponent; import docking.widgets.OptionDialog; import docking.widgets.table.*; @@ -62,8 +63,7 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { private List analyzerEnablement = new ArrayList<>(); private Set prototypeAnalyzers = new HashSet<>(); private Map analyzerToOptionsPanelMap = new HashMap<>(); - private Map> analyzerManagedComponentsMap = - new HashMap<>(); + private Map> analyzerManagedComponentsMap = new HashMap<>(); private EditorStateFactory editorStateFactory; private JPanel noOptionsPanel; @@ -79,7 +79,7 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { PropertyChangeListener propertyChangeListener) { this(List.of(program), editorStateFactory, propertyChangeListener); } - + /** * Constructor * @@ -89,23 +89,23 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { */ AnalysisPanel(List programs, EditorStateFactory editorStateFactory, PropertyChangeListener propertyChangeListener) { - + // Do a quick check to make sure we have at least one program. If not, we // shouldn't even be here (the menus should be disabled). if (CollectionUtils.isEmpty(programs)) { throw new AssertException("Must provide a program to run analysis"); } - + this.programs = programs; this.propertyChangeListener = propertyChangeListener; this.editorStateFactory = editorStateFactory; analysisOptions = programs.get(0).getOptions(Program.ANALYSIS_PROPERTIES); - + setName("Analysis Panel"); build(); load(); } - + private void load() { editorList.clear(); analyzerNames.clear(); @@ -127,9 +127,9 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { } private void loadAnalyzers() { - + AutoAnalysisManager manager = AutoAnalysisManager.getAnalysisManager(programs.get(0)); - + List propertyNames = analysisOptions.getOptionNames(); Collections.sort(propertyNames, new Comparator() { @Override @@ -475,7 +475,7 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { boolean origEnabled = analysisOptions.getBoolean(analyzerName, false); if (currEnabled != origEnabled) { propertyChangeListener.propertyChange( - new PropertyChangeEvent(this, analyzerName, origEnabled, currEnabled)); + new PropertyChangeEvent(this, analyzerName, origEnabled, currEnabled)); return true; } } @@ -495,11 +495,11 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { * analyzed. */ void applyChanges() { - + for (int i = 0; i < analyzerNames.size(); ++i) { String analyzerName = analyzerNames.get(i); boolean enabled = analyzerEnablement.get(i); - + int id = programs.get(0).startTransaction("setting analysis options"); boolean commit = false; try { @@ -512,7 +512,7 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { updateOptionForAllPrograms(analyzerName, enabled); } - + for (EditorState info : editorList) { info.applyValue(); } @@ -522,7 +522,7 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { List optionGroups = analysisOptions.getChildOptions(); noOptionsPanel = new JPanel(new VerticalLayout(5)); noOptionsPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 5)); - noOptionsPanel.add(new JLabel("No options available.")); + noOptionsPanel.add(DockingUtils.createNonHtmlLabel("No options available.")); for (Options optionsGroup : optionGroups) { String analyzerName = optionsGroup.getName(); @@ -539,8 +539,7 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { List optionNames = getOptionNames(optionsGroup); Collections.sort(optionNames); - List optionComponents = - new ArrayList<>(); + List optionComponents = new ArrayList<>(); for (String childOptionName : optionNames) { EditorState childState = @@ -579,7 +578,7 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { PropertyEditor editor = options.getPropertyEditor(optionName); return options.getObject(optionName, null) != null || editor != null; } - + /** * Updates the enablement of the given analyzer for all programs being analyzed. *

@@ -602,21 +601,21 @@ class AnalysisPanel extends JPanel implements PropertyChangeListener { */ public void updateOptionForAllPrograms(String analyzerName, boolean enabled) { for (Program program : programs) { - + boolean commit = false; int id = program.startTransaction("Setting analysis property"); try { Options options = program.getOptions(Program.ANALYSIS_PROPERTIES); - + // Sanity check to make sure that the analyzer is appropriate for // this program. This should always be the case but it doesn't // hurt to check. if (!options.getOptionNames().contains(analyzerName)) { continue; } - + options.setBoolean(analyzerName, enabled); - + commit = true; } finally { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AnalyzeAllOpenProgramsTask.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AnalyzeAllOpenProgramsTask.java index f06935a77a..bb013958a9 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AnalyzeAllOpenProgramsTask.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AnalyzeAllOpenProgramsTask.java @@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import javax.swing.*; import javax.swing.text.html.HTMLEditorKit; +import docking.DockingUtils; import docking.widgets.OptionDialog; import ghidra.GhidraOptions; import ghidra.app.services.ProgramManager; @@ -35,6 +36,7 @@ import ghidra.program.model.lang.CompilerSpecID; import ghidra.program.model.lang.LanguageID; import ghidra.program.model.listing.Program; import ghidra.program.util.GhidraProgramUtilities; +import ghidra.util.HTMLUtilities; import ghidra.util.Msg; import ghidra.util.exception.CancelledException; import ghidra.util.task.*; @@ -98,7 +100,7 @@ class AnalyzeAllOpenProgramsTask extends Task { } else { // no options dialog--analyze all programs - validPrograms = new ArrayList(programs); + validPrograms = new ArrayList<>(programs); } analyzePrograms(prototypeAnalysisOptions, validPrograms, monitor); @@ -175,7 +177,8 @@ class AnalyzeAllOpenProgramsTask extends Task { SwingUtilities.invokeAndWait(new Runnable() { @Override public void run() { - AnalysisOptionsDialog dialog = new AnalysisOptionsDialog(getValidProgramsByArchitecture()); + AnalysisOptionsDialog dialog = + new AnalysisOptionsDialog(getValidProgramsByArchitecture()); tool.showDialog(dialog); boolean shouldAnalyze = dialog.wasAnalyzeButtonSelected(); analyze.set(shouldAnalyze); @@ -202,7 +205,7 @@ class AnalyzeAllOpenProgramsTask extends Task { return true; } - + /** * Returns a list of all programs that should be analyzed. *

@@ -213,7 +216,7 @@ class AnalyzeAllOpenProgramsTask extends Task { * @return the list of programs to analyze */ private List getValidProgramsByArchitecture() { - List validList = new ArrayList(programs); + List validList = new ArrayList<>(programs); ProgramID protoTypeProgramID = new ProgramID(prototypeProgram); @@ -223,7 +226,7 @@ class AnalyzeAllOpenProgramsTask extends Task { validList.remove(program); } } - + return validList; } @@ -244,7 +247,7 @@ class AnalyzeAllOpenProgramsTask extends Task { List validList = getValidProgramsByArchitecture(); if (validList.size() != programs.size()) { - List invalidList = new ArrayList(programs); + List invalidList = new ArrayList<>(programs); invalidList.removeAll(validList); if (!showNonMatchingArchitecturesWarning(validList, invalidList)) { @@ -274,7 +277,8 @@ class AnalyzeAllOpenProgramsTask extends Task { StringBuilder buffy = new StringBuilder(); buffy.append("
"); - buffy.append("Found open programs with architectures differing from the current program.


"); + buffy.append( + "Found open programs with architectures differing from the current program.


"); buffy.append("These programs will be analyzed:

"); buffy.append(""); @@ -294,7 +298,7 @@ class AnalyzeAllOpenProgramsTask extends Task { buffy.append(""); buffy.append(""); buffy.append(""); buffy.append(""); buffy.append("
"); buffy.append(specialFontOpen); - buffy.append(program.getName()); + buffy.append(HTMLUtilities.friendlyEncodeHTML(program.getName())); buffy.append(specialFontClose); buffy.append(""); @@ -321,7 +325,7 @@ class AnalyzeAllOpenProgramsTask extends Task { for (Program program : invalidList) { buffy.append("
"); - buffy.append(program.getName()); + buffy.append(HTMLUtilities.friendlyEncodeHTML(program.getName())); buffy.append(""); buffy.append(program.getLanguageID()); @@ -334,9 +338,8 @@ class AnalyzeAllOpenProgramsTask extends Task { buffy.append("
"); - OptionDialog dialog = - new ScrollingOptionDialog("Found Differing Architectures--Continue?", - buffy.toString(), "Continue", OptionDialog.WARNING_MESSAGE); + OptionDialog dialog = new ScrollingOptionDialog("Found Differing Architectures--Continue?", + buffy.toString(), "Continue", OptionDialog.WARNING_MESSAGE); dialog.show(null); return dialog.getResult() == OptionDialog.OPTION_ONE; } @@ -467,8 +470,9 @@ class AnalyzeAllOpenProgramsTask extends Task { } if (compilerSpecID == null) { - if (other.compilerSpecID != null) + if (other.compilerSpecID != null) { return false; + } } else if (!compilerSpecID.equals(other.compilerSpecID)) { return false; @@ -491,7 +495,8 @@ class AnalyzeAllOpenProgramsTask extends Task { private class ScrollingOptionDialog extends OptionDialog { - public ScrollingOptionDialog(String title, String message, String option1, int messageType) { + public ScrollingOptionDialog(String title, String message, String option1, + int messageType) { super(title, message, option1, messageType, null); } @@ -503,8 +508,7 @@ class AnalyzeAllOpenProgramsTask extends Task { editorPane.setName("MESSAGE-COMPONENT"); editorPane.setText(message); - JLabel label = new JLabel(); - editorPane.setBackground(label.getBackground()); + editorPane.setBackground(DockingUtils.createNonHtmlLabel().getBackground()); JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisManager.java index 18d9000fef..60052a1064 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisManager.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/analysis/AutoAnalysisManager.java @@ -1098,7 +1098,7 @@ public class AutoAnalysisManager implements DomainObjectListener, DomainObjectCl } if (GhidraProgramUtilities.shouldAskToAnalyze(program)) { int answer = OptionDialog.showYesNoDialog(tool.getToolFrame(), "Analyze", - program.getDomainFile().getName() + + "" + HTMLUtilities.friendlyEncodeHTML(program.getDomainFile().getName()) + " has not been analyzed. Would you like to analyze it now?"); boolean analyzed = answer == OptionDialog.OPTION_ONE; GhidraProgramUtilities.setAnalyzedFlag(program, analyzed); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/ArchiveDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/ArchiveDialog.java index ed5aeb44a5..9f8d1c02e5 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/ArchiveDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/ArchiveDialog.java @@ -21,6 +21,7 @@ import java.io.File; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.OptionDialog; import docking.widgets.filechooser.GhidraFileChooser; import ghidra.framework.GenericRunInfo; @@ -75,7 +76,7 @@ public class ArchiveDialog extends DialogComponentProvider { GridBagLayout gbl = new GridBagLayout(); JPanel outerPanel = new JPanel(gbl); - archiveLabel = new JLabel(" Archive File "); + archiveLabel = DockingUtils.createNonHtmlLabel(" Archive File "); archiveField = new JTextField(); archiveField.setName("archiveField"); archiveField.setColumns(NUM_TEXT_COLUMNS); @@ -153,7 +154,7 @@ public class ArchiveDialog extends DialogComponentProvider { } File file = new File(archive); if (file.exists() && OptionDialog.showOptionDialog(rootPanel, "Archive File Exists", - archive + " exists.\n " + "Do you want to overwrite existing file?", + "File " + archive + " exists.\n " + "Do you want to overwrite existing file?", "Yes") != OptionDialog.OPTION_ONE) { return; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/ProjectJarReader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/ProjectJarReader.java deleted file mode 100644 index cec59cbddb..0000000000 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/ProjectJarReader.java +++ /dev/null @@ -1,315 +0,0 @@ -/* ### - * IP: GHIDRA - * - * 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 ghidra.app.plugin.core.archive; - -import java.awt.Component; -import java.awt.Font; -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.jar.JarEntry; -import java.util.jar.JarInputStream; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.swing.*; - -import generic.io.JarReader; -import ghidra.framework.model.*; -import ghidra.framework.plugintool.PluginTool; -import ghidra.util.*; -import ghidra.util.task.TaskMonitor; -import utilities.util.FileUtilities; - -/** - * Class containing some methods for creating project files from a - * Ghidra Version 1 archive file - * that is input via the JarInputStream parameter. - */ -class ProjectJarReader extends JarReader { - - private static final String PROJECT_FILE_SUFFIX = ProjectLocator.getProjectExtension(); - private static final String PROJECT_DIR_SUFFIX = ProjectLocator.getProjectDirExtension(); - private static final String XML_FILE_SUFFIX = ".xml"; - private static final String PROPERTIES_FILE_NAME = ".properties"; - private static final String ORIGINAL_PROPERTIES_FILE_NAME = "original" + PROPERTIES_FILE_NAME; - private static final int READ_BLOCK_SIZE = 4096; - - /** - * Construct a new ProjectJarReader. - * @param jarIn the the jar file input stream the zip entries are - * read from. - */ - ProjectJarReader(JarInputStream jarIn) { - super(jarIn); - } - - private static final Pattern PROJECT_DATA_FILE_PATTERN = Pattern.compile(".+\\.rep/data(/.+)"); - - private static String filterDataPathsOnly(String path) { - path = path.replace('\\', '/'); - Matcher matcher = PROJECT_DATA_FILE_PATTERN.matcher(path); - if (matcher.find()) { - return matcher.group(1); - } - return null; - } - - /** - * Writes the all zip entries from the jar input stream out to the specified - * project using the reader and any needed services from the service registry. - * - * @param reader the reader for processing special files (entries). - * @param services the service registry - * @param project the project that the files are to be added to. - * @param monitor a task monitor for indicating progress to the user. - * - * @return true if all files are successfully created. - */ - boolean createRecursively(XmlDataReader reader, File restoreDir, PluginTool tool, - Project project, TaskMonitor monitor) throws IOException { - boolean succeeded = true; - StringBuffer errorBuf = new StringBuffer(); - - List xmlFiles = new ArrayList<>(); - - boolean done = false; - while (!done && succeeded) { - if (monitor.isCancelled()) { - return false; - } - try { - //Get the zip entry. - JarEntry entry = jarIn.getNextJarEntry(); - if (entry == null) { - done = true; - break; - } - String name = entry.getName(); - - // discard property files - if (name.endsWith(PropertyFile.PROPERTY_EXT) || - name.endsWith(ORIGINAL_PROPERTIES_FILE_NAME)) { - continue; - } - - name = filterDataPathsOnly(name); - if (name == null) { - continue; - } - - File file = new File(restoreDir, name); - FileUtilities.mkdirs(file.getParentFile()); - - // Write it out to the file along with its data. - FileOutputStream out = null; - try { - out = new FileOutputStream(file); - } - catch (FileNotFoundException fnfe) { - String msg = fnfe.getMessage(); - if (msg == null) { - msg = fnfe.toString(); - } - Msg.showError(this, null, "Restore Failed", - "Couldn't create file " + file.getAbsolutePath() + "\n" + msg); - return false; - } - byte[] bytes = new byte[READ_BLOCK_SIZE]; - int numRead = 0; - try { - while ((numRead = jarIn.read(bytes)) != -1) { - if (monitor.isCancelled()) { - break; - } - out.write(bytes, 0, numRead); - } - } - catch (IOException ioe) { - succeeded = false; - String msg = ioe.getMessage(); - if (msg == null) { - msg = ioe.toString(); - } - errorBuf.append( - "Couldn't create file " + file.getAbsolutePath() + "\n" + msg + "\n"); - Msg.error(this, "Unexpected Exception: " + ioe.getMessage(), ioe); - } - finally { - try { - out.close(); - } - catch (IOException ioe) { - Msg.error(this, "Unexpected Exception: " + ioe.getMessage(), ioe); - } - } - if (monitor.isCancelled()) { - return false; - } - - if (name.endsWith(XML_FILE_SUFFIX) && - !name.endsWith("projectDataTypes" + XML_FILE_SUFFIX)) { - // the extra check is for backwards compatibility - xmlFiles.add(name); - } - - } - catch (IOException ioe) { - succeeded = false; - String msg = ioe.getMessage(); - if (msg == null) { - msg = ioe.toString(); - } - errorBuf.append("Failed to restore archive entry.\n" + msg + "\n"); - done = true; - break; - } - } - - // Post-process the XML files that we created specially - for (int i = 0; i < xmlFiles.size(); i++) { - if (monitor.isCancelled()) { - return false; - } - String relName = xmlFiles.get(i); - try { - if (!reader.addXMLObject(tool, restoreDir.getAbsolutePath(), relName, true, - monitor) && !monitor.isCancelled()) { - succeeded = false; - errorBuf.append("Couldn't restore " + relName + ".\n" + "\n"); - } - } - catch (Exception e) { - succeeded = false; - String msg = e.getMessage(); - if (msg == null) { - msg = e.toString(); - } - errorBuf.append("Couldn't restore " + relName + ".\n" + e.getMessage() + "\n"); - } - } - - // Post-process the .property files to restore ghidra ownership. -// for (int i = 0; i < propertyFiles.size(); i++) { -// if (monitor.isCancelled()) { -// return false; -// } -// String pName = propertyFiles.get(i); -// if (!replacePropertyFile(basePath + pName)) { -// succeeded = false; -// errorBuf.append("Couldn't restore " + pName + ".\n" + "\n"); -// } -// } - - if (monitor.isCancelled()) { - return false; - } - - final String summary = reader.getSummary(); - if (summary != null) { - SystemUtilities.runSwingNow( - () -> showErrorDialog(null, "Please review the messages below:", summary)); - } - - //TODO: Will still need to add code for changing actual file - // ownership on the file system for the files that have been - // created on behalf of restoring other users' stuff. - - if (!succeeded) { - String message = errorBuf.toString(); - String title = "Error Restoring Project Archive"; - project.releaseFiles(tool); - Msg.showError(this, null, title, message); - } - return succeeded; - } - - /** - * Displays an error dialog. - * - * @param parent component to which dialog should be parented - * @param title title of error dialog - * @param message message(s) to display, can be multiple lines - */ - private static void showErrorDialog(Component parent, String title, String message) { - if (message.indexOf("\n") >= 0) { - showMultiLineMessage(parent, title, message, JOptionPane.ERROR_MESSAGE); - } - else { - showSingleLineMessage(parent, title, message, JOptionPane.ERROR_MESSAGE); - } - } - - private static void showMultiLineMessage(Component parent, String title, String message, - int type) { - JTextArea textArea = new JTextArea(20, 60); - textArea.setFont(new Font("Monospaced", Font.BOLD, 12)); - textArea.setEditable(false); - textArea.setText(message); - textArea.setOpaque(false); - JScrollPane scrollPane = new JScrollPane(textArea); - JOptionPane.showMessageDialog(parent, scrollPane, title, type); - } - - private static void showSingleLineMessage(Component parent, String title, String message, - int type) { - JLabel textLabel = new JLabel(); - textLabel.setText(message); - JOptionPane.showMessageDialog(parent, textLabel, title, type); - } - - private boolean replacePropertyFile(String filepath) { - if (!filepath.endsWith(ORIGINAL_PROPERTIES_FILE_NAME)) { - return false; - } - File origFile = new File(filepath); - int endOffset = filepath.length() - ORIGINAL_PROPERTIES_FILE_NAME.length(); - filepath = filepath.substring(0, endOffset) + PROPERTIES_FILE_NAME; - - File newFile = new File(filepath); - if (newFile.exists() && !newFile.delete()) { - return false; - } - - // Need to rename the file from original.properties to .properties - return origFile.renameTo(newFile); - } - - private String modifyName(String name, String projectName) { - // Project File? - name = name.replace("\\", File.separator); - if (name.endsWith(PROJECT_FILE_SUFFIX)) { - int start = name.lastIndexOf(File.separator); - if (start == -1) { - return projectName + PROJECT_FILE_SUFFIX; - } - String first = name.substring(0, start); - return first + projectName + PROJECT_FILE_SUFFIX; - } - // Project Folder? - int suffixIndex = name.indexOf(PROJECT_DIR_SUFFIX); - if (suffixIndex > -1) { - String prefix = name.substring(0, suffixIndex); - String suffix = name.substring(suffixIndex); - int end = prefix.lastIndexOf(File.separator); - if (end == -1) { - return projectName + suffix; - } - return prefix.substring(0, end) + projectName + suffix; - } - return name; - } -} diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/RestoreDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/RestoreDialog.java index dce34bed9f..f0069d9879 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/RestoreDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/archive/RestoreDialog.java @@ -23,6 +23,7 @@ import java.io.File; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.filechooser.GhidraFileChooser; import ghidra.framework.GenericRunInfo; import ghidra.framework.model.ProjectLocator; @@ -76,7 +77,7 @@ public class RestoreDialog extends DialogComponentProvider { protected JPanel buildMainPanel() { // Create the individual components that make up the panel. - archiveLabel = new JLabel(" Archive File "); + archiveLabel = DockingUtils.createNonHtmlLabel(" Archive File "); archiveField = new JTextField(); archiveField.setColumns(NUM_TEXT_COLUMNS); archiveField.setName("archiveField"); @@ -115,7 +116,7 @@ public class RestoreDialog extends DialogComponentProvider { Font font = archiveBrowse.getFont(); archiveBrowse.setFont(new Font(font.getName(), Font.BOLD, font.getSize())); - restoreLabel = new JLabel(" Restore Directory "); + restoreLabel = DockingUtils.createNonHtmlLabel(" Restore Directory "); restoreField = new JTextField(); restoreField.setName("restoreField"); restoreField.setColumns(RestoreDialog.NUM_TEXT_COLUMNS); @@ -132,7 +133,7 @@ public class RestoreDialog extends DialogComponentProvider { font = restoreBrowse.getFont(); restoreBrowse.setFont(new Font(font.getName(), Font.BOLD, font.getSize())); - projectNameLabel = new JLabel(" Project Name "); + projectNameLabel = DockingUtils.createNonHtmlLabel(" Project Name "); projectNameField = new JTextField(); projectNameField.setName("projectNameField"); projectNameField.setColumns(RestoreDialog.NUM_TEXT_COLUMNS); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/assembler/AssemblyDualTextField.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/assembler/AssemblyDualTextField.java index 6e2f10bd66..a90cf40744 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/assembler/AssemblyDualTextField.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/assembler/AssemblyDualTextField.java @@ -23,6 +23,7 @@ import java.util.concurrent.atomic.AtomicReference; import javax.swing.*; import javax.swing.text.BadLocationException; +import docking.DockingUtils; import docking.EmptyBorderToggleButton; import docking.widgets.autocomplete.*; import docking.widgets.textfield.TextFieldLinker; @@ -705,7 +706,7 @@ public class AssemblyDualTextField { Box hbox = Box.createHorizontalBox(); dialog.add(hbox, BorderLayout.NORTH); - JLabel addrlabel = new JLabel(String.format(ADDR_FORMAT, curAddr)); + JLabel addrlabel = DockingUtils.createNonHtmlLabel(String.format(ADDR_FORMAT, curAddr)); hbox.add(addrlabel); AssemblyDualTextField input = new AssemblyDualTextField(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/BookmarkNavigator.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/BookmarkNavigator.java index 029a4222dc..1546b97a9b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/BookmarkNavigator.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/BookmarkNavigator.java @@ -26,6 +26,7 @@ import ghidra.program.model.address.AddressSet; import ghidra.program.model.listing.*; import ghidra.program.util.MarkerLocation; import ghidra.program.util.ProgramLocation; +import ghidra.util.HTMLUtilities; import resources.ResourceManager; /** @@ -93,9 +94,8 @@ public class BookmarkNavigator { color = DEFAULT_COLOR; } - markerSet = - markerService.createPointMarker(type + " Bookmarks", type + " Bookmarks", - bookmarkMgr.getProgram(), priority, true, true, false, color, icon); + markerSet = markerService.createPointMarker(type + " Bookmarks", type + " Bookmarks", + bookmarkMgr.getProgram(), priority, true, true, false, color, icon); markerSet.setNavigationListener(new MarkerListener() { @Override @@ -118,11 +118,11 @@ public class BookmarkNavigator { String cat = bookmarks[i].getCategory(); if (cat != null && cat.length() != 0) { buf.append(" ["); - buf.append(cat); + buf.append(HTMLUtilities.friendlyEncodeHTML(cat)); buf.append("]"); } buf.append(": "); - buf.append(bookmarks[i].getComment()); + buf.append(HTMLUtilities.friendlyEncodeHTML(bookmarks[i].getComment())); } return buf.toString(); } @@ -203,10 +203,10 @@ public class BookmarkNavigator { */ public static void defineBookmarkTypes(Program program) { BookmarkManager mgr = program.getBookmarkManager(); - mgr.defineType(BookmarkType.NOTE, BookmarkNavigator.NOTE_ICON, - BookmarkNavigator.NOTE_COLOR, BookmarkNavigator.NOTE_PRIORITY); - mgr.defineType(BookmarkType.INFO, BookmarkNavigator.INFO_ICON, - BookmarkNavigator.INFO_COLOR, BookmarkNavigator.INFO_PRIORITY); + mgr.defineType(BookmarkType.NOTE, BookmarkNavigator.NOTE_ICON, BookmarkNavigator.NOTE_COLOR, + BookmarkNavigator.NOTE_PRIORITY); + mgr.defineType(BookmarkType.INFO, BookmarkNavigator.INFO_ICON, BookmarkNavigator.INFO_COLOR, + BookmarkNavigator.INFO_PRIORITY); mgr.defineType(BookmarkType.WARNING, BookmarkNavigator.WARNING_ICON, BookmarkNavigator.WARNING_COLOR, BookmarkNavigator.WARNING_PRIORITY); mgr.defineType(BookmarkType.ERROR, BookmarkNavigator.ERROR_ICON, diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/CreateBookmarkDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/CreateBookmarkDialog.java index 81e385d8a3..3ef8699e16 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/CreateBookmarkDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/CreateBookmarkDialog.java @@ -112,7 +112,7 @@ public class CreateBookmarkDialog extends DialogComponentProvider { } } }; - + // Some items in the dialog change depending on whether we have multiple selection // ranges, so capture that information here. int ranges = 0; @@ -120,11 +120,11 @@ public class CreateBookmarkDialog extends DialogComponentProvider { ranges = plugin.getProgramSelection().getNumAddressRanges(); } - JLabel locationLabel = new JLabel("Address: ", SwingConstants.RIGHT); + JLabel locationLabel = DockingUtils.createNonHtmlLabel("Address: ", SwingConstants.RIGHT); locationTextField = new JTextField(50); locationTextField.setText(address.toString()); if (hasSelection && ranges > 1) { - locationTextField.setText(address.toString() + " (plus " + (ranges-1) + " more)"); + locationTextField.setText(address.toString() + " (plus " + (ranges - 1) + " more)"); } locationTextField.setCaretPosition(0); locationTextField.setEditable(false); @@ -132,7 +132,7 @@ public class CreateBookmarkDialog extends DialogComponentProvider { locationTextField.setMinimumSize(locationTextField.getPreferredSize()); locationTextField.addKeyListener(listener); - JLabel categoryLabel = new JLabel("Category: ", SwingConstants.RIGHT); + JLabel categoryLabel = DockingUtils.createNonHtmlLabel("Category: ", SwingConstants.RIGHT); categoryComboBox = new GhidraComboBox<>(getModel()); categoryComboBox.setEditable(true); categoryComboBox.addKeyListener(listener); @@ -140,7 +140,8 @@ public class CreateBookmarkDialog extends DialogComponentProvider { categoryTextField = (JTextField) categoryComboBox.getEditor().getEditorComponent(); categoryTextField.addKeyListener(listener); - JLabel commentLabel = new JLabel("Description: ", SwingConstants.RIGHT); + JLabel commentLabel = + DockingUtils.createNonHtmlLabel("Description: ", SwingConstants.RIGHT); commentTextField = new JTextField(20); commentTextField.addKeyListener(listener); @@ -203,7 +204,7 @@ public class CreateBookmarkDialog extends DialogComponentProvider { mainPanel.add(commentTextField, gbc); ImageIcon icon = BookmarkNavigator.NOTE_ICON; - JLabel imageLabel = new JLabel(icon); + JLabel imageLabel = DockingUtils.createNonHtmlLabel(icon); imageLabel.setPreferredSize( new Dimension(icon.getIconWidth() + 20, icon.getIconHeight() + 20)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/FilterDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/FilterDialog.java index f1c0e9231f..4c31a28aa4 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/FilterDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/FilterDialog.java @@ -22,6 +22,7 @@ import java.util.List; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import ghidra.app.util.HelpTopics; import ghidra.program.model.listing.*; import ghidra.util.HelpLocation; @@ -59,8 +60,8 @@ class FilterDialog extends DialogComponentProvider { JPanel p = new JPanel(new BorderLayout()); p.add(buttons[i], BorderLayout.WEST); buttons[i].setSelected(provider.isShowingType(types[i].getTypeString())); - JLabel l = - new JLabel(types[i].getTypeString(), types[i].getIcon(), SwingConstants.LEFT); + JLabel l = DockingUtils.createNonHtmlLabel(types[i].getTypeString(), types[i].getIcon(), + SwingConstants.LEFT); p.add(l, BorderLayout.CENTER); panel.add(p); } @@ -69,7 +70,7 @@ class FilterDialog extends DialogComponentProvider { @Override protected void okCallback() { - List typesList = new ArrayList(types.length); + List typesList = new ArrayList<>(types.length); for (int i = 0; i < types.length; i++) { if (buttons[i].isSelected()) { typesList.add(types[i].getTypeString()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/calltree/CallTreeProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/calltree/CallTreeProvider.java index fa6ec70a56..d06794c1d7 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/calltree/CallTreeProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/calltree/CallTreeProvider.java @@ -24,8 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger; import javax.swing.*; import javax.swing.tree.TreePath; -import docking.ActionContext; -import docking.WindowPosition; +import docking.*; import docking.action.*; import docking.util.GraphicsUtils; import docking.widgets.dialogs.NumberInputDialog; @@ -792,10 +791,8 @@ public class CallTreeProvider extends ComponentProviderAdapter implements Domain private JPanel createTreePanel(boolean isIncoming, GTree tree) { JPanel panel = new JPanel(new BorderLayout()); - String name = isIncoming ? "Incoming Calls" : "Outgoing Calls"; - JLabel label = new JLabel(name); - - panel.add(label, BorderLayout.NORTH); + panel.add(DockingUtils.createNonHtmlLabel(isIncoming ? "Incoming Calls" : "Outgoing Calls"), + BorderLayout.NORTH); panel.add(tree, BorderLayout.CENTER); return panel; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/checksums/ComputeChecksumsProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/checksums/ComputeChecksumsProvider.java index 9151ca6946..d16ef2b1aa 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/checksums/ComputeChecksumsProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/checksums/ComputeChecksumsProvider.java @@ -23,6 +23,7 @@ import java.util.List; import javax.swing.*; import docking.ActionContext; +import docking.DockingUtils; import docking.action.*; import ghidra.app.context.ProgramContextAction; import ghidra.framework.plugintool.ComponentProviderAdapter; @@ -92,7 +93,7 @@ public class ComputeChecksumsProvider extends ComponentProviderAdapter { resultsMainPanel.add(tablePanel); main.add(resultsMainPanel, BorderLayout.CENTER); - errorStatus = new JLabel(" "); + errorStatus = DockingUtils.createNonHtmlLabel(" "); errorStatus.setName("message"); errorStatus.setHorizontalAlignment(SwingConstants.CENTER); errorStatus.setForeground(Color.RED); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearDialog.java index 6453c0339e..bfc37d9390 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +15,6 @@ */ package ghidra.app.plugin.core.clear; -import ghidra.app.context.ListingActionContext; -import ghidra.util.HelpLocation; - import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.*; @@ -28,6 +24,9 @@ import java.util.List; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; +import ghidra.app.context.ListingActionContext; +import ghidra.util.HelpLocation; /** * Dialog that shows options for "Clear All." User can choose to clear @@ -115,7 +114,7 @@ public class ClearDialog extends DialogComponentProvider { panel = new JPanel(); panel.setLayout(new BorderLayout(10, 10)); - JLabel label = new JLabel("Clear Options:"); + JLabel label = DockingUtils.createNonHtmlLabel("Clear Options:"); panel.add(label, BorderLayout.NORTH); JPanel cbPanel = new JPanel(); @@ -123,9 +122,8 @@ public class ClearDialog extends DialogComponentProvider { cbPanel.setLayout(bl); symbolsCb = new JCheckBox("Symbols"); - commentsCb = - new JCheckBox( - "Comments (does not affect automatic comments)"); + commentsCb = new JCheckBox( + "Comments (does not affect automatic comments)"); commentsCb.setVerticalTextPosition(SwingConstants.TOP); propertiesCb = new JCheckBox("Properties"); codeCb = new JCheckBox("Code"); @@ -179,6 +177,7 @@ public class ClearDialog extends DialogComponentProvider { // if a user clears the code, then we will force them // to clear all user references... codeCb.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { if (codeCb.isSelected()) { userReferencesCb.setSelected(true); @@ -205,7 +204,7 @@ public class ClearDialog extends DialogComponentProvider { systemReferencesCb.setEnabled(false); // record the checkboxes for later use - final List checkBoxList = new ArrayList(10); + final List checkBoxList = new ArrayList<>(10); checkBoxList.add(symbolsCb); checkBoxList.add(commentsCb); checkBoxList.add(propertiesCb); @@ -222,6 +221,7 @@ public class ClearDialog extends DialogComponentProvider { JPanel buttonPanel = new JPanel(); JButton selectAllButton = new JButton("Select All"); selectAllButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setAllCheckBoxesSelected(true, checkBoxList); } @@ -229,6 +229,7 @@ public class ClearDialog extends DialogComponentProvider { JButton deselectAllbutton = new JButton("Deselect All"); deselectAllbutton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setAllCheckBoxesSelected(false, checkBoxList); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearFlowDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearFlowDialog.java index 837b1f4bb7..5b5bd59cdc 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearFlowDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/clear/ClearFlowDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +15,6 @@ */ package ghidra.app.plugin.core.clear; -import ghidra.app.context.ListingActionContext; -import ghidra.util.HelpLocation; - import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.*; @@ -26,6 +22,9 @@ import java.awt.event.*; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; +import ghidra.app.context.ListingActionContext; +import ghidra.util.HelpLocation; /** * Dialog that shows options for "Clear Flow and Repair." User can choose to clear @@ -92,7 +91,7 @@ public class ClearFlowDialog extends DialogComponentProvider { panel = new JPanel(); panel.setLayout(new BorderLayout(10, 10)); - JLabel label = new JLabel("Clear Flow Options:"); + JLabel label = DockingUtils.createNonHtmlLabel("Clear Flow Options:"); panel.add(label, BorderLayout.NORTH); JPanel cbPanel = new JPanel(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/hover/ProgramAddressRelationshipListingHover.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/hover/ProgramAddressRelationshipListingHover.java index 0bb8274df1..08fb056106 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/hover/ProgramAddressRelationshipListingHover.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/codebrowser/hover/ProgramAddressRelationshipListingHover.java @@ -32,6 +32,7 @@ import ghidra.program.model.listing.*; import ghidra.program.model.mem.MemoryBlock; import ghidra.program.util.AddressFieldLocation; import ghidra.program.util.ProgramLocation; +import ghidra.util.HTMLUtilities; /** * A hover service to show tool tip text for hovering over a program address in the listing. @@ -92,7 +93,8 @@ public class ProgramAddressRelationshipListingHover extends AbstractConfigurable MemoryBlock block = program.getMemory().getBlock(loc); long memblockOffset = loc.subtract(block.getStart()); - appendTableRow(sb, "Memory Block Offset", block.getName(), memblockOffset); + appendTableRow(sb, "Memory Block Offset", HTMLUtilities.friendlyEncodeHTML(block.getName()), + memblockOffset); addFunctionInfo(program, loc, sb); addDataInfo(program, loc, sb); @@ -141,7 +143,8 @@ public class ProgramAddressRelationshipListingHover extends AbstractConfigurable Function function = program.getFunctionManager().getFunctionContaining(loc); if (function != null) { long functionOffset = loc.subtract(function.getEntryPoint()); - appendTableRow(sb, "Function Offset", function.getName(), functionOffset); + appendTableRow(sb, "Function Offset", + HTMLUtilities.friendlyEncodeHTML(function.getName()), functionOffset); } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentsDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentsDialog.java index 85836ce25d..56b6b84fb7 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentsDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentsDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,12 +15,6 @@ */ package ghidra.app.plugin.core.comments; -import ghidra.app.util.viewer.field.AnnotatedStringHandler; -import ghidra.app.util.viewer.field.Annotation; -import ghidra.framework.plugintool.PluginTool; -import ghidra.program.model.listing.CodeUnit; -import ghidra.util.HelpLocation; - import java.awt.BorderLayout; import java.awt.event.*; import java.util.*; @@ -33,6 +26,12 @@ import javax.swing.text.JTextComponent; import docking.*; import docking.widgets.OptionDialog; +import docking.widgets.combobox.GhidraComboBox; +import ghidra.app.util.viewer.field.AnnotatedStringHandler; +import ghidra.app.util.viewer.field.Annotation; +import ghidra.framework.plugintool.PluginTool; +import ghidra.program.model.listing.CodeUnit; +import ghidra.util.HelpLocation; /** * Dialog for setting the comments for a CodeUnit. @@ -45,8 +44,7 @@ public class CommentsDialog extends DialogComponentProvider implements KeyListen private JTextArea plateField; private JTextArea repeatableField; - private Map documentUndoRedoMap = - new HashMap(9); + private Map documentUndoRedoMap = new HashMap<>(9); private String preComment; private String postComment; @@ -168,9 +166,8 @@ public class CommentsDialog extends DialogComponentProvider implements KeyListen protected void cancelCallback() { if (wasChanged) { - int result = - OptionDialog.showYesNoCancelDialog(getComponent(), "Save Changes?", - "Some comments were modified.\nSave Changes?"); + int result = OptionDialog.showYesNoCancelDialog(getComponent(), "Save Changes?", + "Some comments were modified.\nSave Changes?"); if (result == OptionDialog.OPTION_ONE) { applyCallback(); } @@ -267,9 +264,9 @@ public class CommentsDialog extends DialogComponentProvider implements KeyListen JPanel auxiliaryControlPanel = new JPanel(new BorderLayout()); auxiliaryControlPanel.add(enterBox, BorderLayout.SOUTH); - final AnnotationAdapterWrapper[] annotations = getAnnotationAdapterWrappers(); + AnnotationAdapterWrapper[] annotations = getAnnotationAdapterWrappers(); Arrays.sort(annotations); - final JComboBox annotationsComboBox = new JComboBox(annotations); + JComboBox annotationsComboBox = new GhidraComboBox<>(annotations); JButton addAnnotationButton = new JButton("Add Annotation"); addAnnotationButton.addActionListener(new ActionListener() { @Override @@ -277,7 +274,8 @@ public class CommentsDialog extends DialogComponentProvider implements KeyListen JTextArea currentTextArea = getSelectedTextArea(); AnnotationAdapterWrapper aaw = (AnnotationAdapterWrapper) annotationsComboBox.getSelectedItem(); - currentTextArea.insert(aaw.getPrototypeString(), currentTextArea.getCaretPosition()); + currentTextArea.insert(aaw.getPrototypeString(), + currentTextArea.getCaretPosition()); currentTextArea.setCaretPosition(currentTextArea.getCaretPosition() - 1); } }); @@ -289,6 +287,7 @@ public class CommentsDialog extends DialogComponentProvider implements KeyListen panel.add(auxiliaryControlPanel, BorderLayout.SOUTH); preField = new JTextArea(5, 80) { + @Override public boolean getScrollableTracksViewportWidth() { boolean b = super.getScrollableTracksViewportWidth(); return b; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorModel.java index a3f5c12753..f903e0f7c0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorModel.java @@ -23,8 +23,7 @@ import ghidra.program.database.data.DataTypeUtilities; import ghidra.program.model.data.*; import ghidra.program.model.data.Composite.AlignmentType; import ghidra.program.model.lang.InsufficientBytesException; -import ghidra.util.InvalidNameException; -import ghidra.util.Msg; +import ghidra.util.*; import ghidra.util.exception.*; public abstract class CompEditorModel extends CompositeEditorModel { @@ -1417,8 +1416,9 @@ public abstract class CompEditorModel extends CompositeEditorModel { */ @Override public boolean isMoveUpAllowed() { - if (!isContiguousSelection()) + if (!isContiguousSelection()) { return false; + } int start = selection.getFieldRange(0).getStart().getIndex().intValue(); return ((start > 0) && (start < getNumComponents())); } @@ -1466,7 +1466,8 @@ public abstract class CompEditorModel extends CompositeEditorModel { originalIsChanging = true; try { if (hadChanges) { - String message = oldName + " has changed outside the editor.\n" + + String message = "" + HTMLUtilities.friendlyEncodeHTML(oldName) + + " has changed outside the editor.
" + "Discard edits & reload the " + getTypeName() + "?"; String title = "Reload " + getTypeName() + " Editor?"; int response = OptionDialog.showYesNoDialogWithNoAsDefaultButton( @@ -1569,7 +1570,8 @@ public abstract class CompEditorModel extends CompositeEditorModel { consideringReplacedDataType = true; try { String message = - oldPath.getPath() + " has changed outside the editor.\n" + + "" + HTMLUtilities.friendlyEncodeHTML(oldPath.getPath()) + + " has changed outside the editor.
" + "Discard edits & reload the " + getTypeName() + "?"; String title = "Reload " + getTypeName() + " Editor?"; int response = OptionDialog.showYesNoDialogWithNoAsDefaultButton( diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java index 7fabef5f51..a4ae34e294 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompEditorPanel.java @@ -25,6 +25,7 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document; +import docking.DockingUtils; import docking.ToolTipManager; import docking.widgets.OptionDialog; import ghidra.program.model.data.Category; @@ -185,7 +186,7 @@ public class CompEditorPanel extends CompositeEditorPanel { private void setupName() { GridBagConstraints gridBagConstraints = new GridBagConstraints(); - nameLabel = new JLabel("Name:"); + nameLabel = DockingUtils.createNonHtmlLabel("Name:"); gridBagConstraints.insets = LEFT_INSETS; gridBagConstraints.anchor = GridBagConstraints.LINE_END; gridBagConstraints.fill = GridBagConstraints.NONE; @@ -216,7 +217,7 @@ public class CompEditorPanel extends CompositeEditorPanel { private void setupDescription() { GridBagConstraints gridBagConstraints = new GridBagConstraints(); - descriptionLabel = new JLabel("Description:"); + descriptionLabel = DockingUtils.createNonHtmlLabel("Description:"); gridBagConstraints.insets = LEFT_INSETS; gridBagConstraints.anchor = GridBagConstraints.LINE_END; gridBagConstraints.fill = GridBagConstraints.NONE; @@ -247,7 +248,7 @@ public class CompEditorPanel extends CompositeEditorPanel { private void setupCategory() { GridBagConstraints gridBagConstraints = new GridBagConstraints(); - categoryLabel = new JLabel("Category:"); + categoryLabel = DockingUtils.createNonHtmlLabel("Category:"); gridBagConstraints.insets = LEFT_INSETS; gridBagConstraints.anchor = GridBagConstraints.LINE_END; gridBagConstraints.fill = GridBagConstraints.NONE; @@ -486,7 +487,7 @@ public class CompEditorPanel extends CompositeEditorPanel { "aligning this data type inside another data type." + ""; JPanel actualAlignmentPanel = new JPanel(new BorderLayout()); - actualAlignmentLabel = new JLabel("Alignment:"); + actualAlignmentLabel = DockingUtils.createNonHtmlLabel("Alignment:"); gridBagConstraints.insets = new Insets(2, 7, 2, 2); gridBagConstraints.anchor = GridBagConstraints.EAST; gridBagConstraints.fill = GridBagConstraints.NONE; @@ -718,7 +719,7 @@ public class CompEditorPanel extends CompositeEditorPanel { protected void setupSize() { GridBagConstraints gridBagConstraints = new GridBagConstraints(); - sizeLabel = new JLabel("Size:"); + sizeLabel = DockingUtils.createNonHtmlLabel("Size:"); ToolTipManager.setToolTipText(sizeLabel, "The current size in bytes."); gridBagConstraints.anchor = GridBagConstraints.LINE_END; gridBagConstraints.fill = GridBagConstraints.NONE; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorPanel.java index 44f1081637..496a7fe05e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/CompositeEditorPanel.java @@ -26,13 +26,13 @@ import java.util.EventObject; import java.util.List; import javax.swing.*; -import javax.swing.border.BevelBorder; import javax.swing.border.Border; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.*; import javax.swing.text.JTextComponent; +import docking.DockingUtils; import docking.ToolTipManager; import docking.action.DockingActionIf; import docking.dnd.*; @@ -603,7 +603,7 @@ public abstract class CompositeEditorPanel extends JPanel private JPanel createStatusPanel() { JPanel panel = new JPanel(new BorderLayout()); - statusLabel = new JLabel(" "); + statusLabel = DockingUtils.createNonHtmlLabel(" "); statusLabel.setHorizontalAlignment(SwingConstants.CENTER); statusLabel.setForeground(Color.blue); statusLabel.addComponentListener(new ComponentAdapter() { @@ -620,7 +620,7 @@ public abstract class CompositeEditorPanel extends JPanel /** * Sets the currently displayed status message. * - * @param id the new size + * @param status non-html message string to be displayed. */ public void setStatus(String status) { if (statusLabel != null) { @@ -657,7 +657,7 @@ public abstract class CompositeEditorPanel extends JPanel JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); - JLabel label = new JLabel(name + ":", SwingConstants.RIGHT); + JLabel label = DockingUtils.createNonHtmlLabel(name + ":", SwingConstants.RIGHT); label.setPreferredSize(new Dimension(label.getPreferredSize())); panel.add(label); panel.add(Box.createHorizontalStrut(2)); @@ -1190,7 +1190,6 @@ public abstract class CompositeEditorPanel extends JPanel implements TableCellEditor { private static final long serialVersionUID = 1L; private DataTypeSelectionEditor editor; - private JLabel label = new JLabel(); private DataType dt; private int maxLength; @@ -1199,11 +1198,6 @@ public abstract class CompositeEditorPanel extends JPanel @Override public Component getTableCellEditorComponent(JTable table1, Object value, boolean isSelected, int row, int column) { - if (label == null) { - label = new JLabel(); - label.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - } - model.clearStatus(); maxLength = model.getMaxAddLength(row); init(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/SearchControlPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/SearchControlPanel.java index 3a27019275..4a6d197d89 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/SearchControlPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/compositeeditor/SearchControlPanel.java @@ -23,6 +23,7 @@ import javax.swing.border.Border; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import docking.DockingUtils; import docking.widgets.EmptyBorderButton; import resources.ResourceManager; @@ -42,7 +43,7 @@ public class SearchControlPanel extends JPanel { this.editorPanel = editorPanel; setLayout(new BorderLayout()); - JLabel label = new JLabel("Search: "); + JLabel label = DockingUtils.createNonHtmlLabel("Search: "); add(label, BorderLayout.WEST); textField = new JTextField(20); add(textField, BorderLayout.CENTER); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java index 8274056f38..0620659ba1 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java @@ -41,8 +41,7 @@ import ghidra.framework.plugintool.util.ToolConstants; import ghidra.program.database.data.ProgramDataTypeManager; import ghidra.program.model.data.*; import ghidra.program.model.listing.Program; -import ghidra.util.HelpLocation; -import ghidra.util.Msg; +import ghidra.util.*; import ghidra.util.task.TaskMonitor; //@formatter:off @@ -302,7 +301,8 @@ public class CParserPlugin extends ProgramPlugin { } list.add(openDTmanagers[i]); if (!(openDTmanagers[i] instanceof BuiltInDataTypeManager)) { - htmlNamesList += "

  • " + openDTmanagers[i].getName() + "
  • "; + htmlNamesList += "
  • " + + HTMLUtilities.friendlyEncodeHTML(openDTmanagers[i].getName()) + "
  • "; } } openDTmanagers = list.toArray(new DataTypeManager[0]); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/CreateStructureDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/CreateStructureDialog.java index 13d0c7d458..97e3bca79c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/CreateStructureDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/CreateStructureDialog.java @@ -35,8 +35,7 @@ import ghidra.app.util.ToolTipUtils; import ghidra.framework.plugintool.PluginTool; import ghidra.program.model.data.*; import ghidra.program.model.listing.Program; -import ghidra.util.HelpLocation; -import ghidra.util.InvalidNameException; +import ghidra.util.*; import ghidra.util.exception.DuplicateNameException; import ghidra.util.table.GhidraTable; import ghidra.util.table.GhidraTableFilterPanel; @@ -174,7 +173,7 @@ public class CreateStructureDialog extends DialogComponentProvider { structurePanel.setBorder(structureBorder); GTable table = buildMatchingStructuresTable(); - filterPanel = new GhidraTableFilterPanel(table, structureTableModel) { + filterPanel = new GhidraTableFilterPanel<>(table, structureTableModel) { // make sure our height doesn't stretch @Override public Dimension getMaximumSize() { @@ -570,7 +569,8 @@ public class CreateStructureDialog extends DialogComponentProvider { message = EXISITING_STRUCTURE_STATUS_PREFIX; } - setStatusText("" + message + "
    \"" + name + "\""); + setStatusText( + "" + message + "
    \"" + HTMLUtilities.friendlyEncodeHTML(name) + "\""); } // this class is used instead of a cell renderer so that sorting will diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/DataSettingsDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/DataSettingsDialog.java index b755b44b9b..826a06b781 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/DataSettingsDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/data/DataSettingsDialog.java @@ -719,7 +719,7 @@ public class DataSettingsDialog extends DialogComponentProvider { final static int BOOLEAN = 1; private int mode; - private JComboBox comboBox = new JComboBox(); + private JComboBox comboBox = new JComboBox<>(); SettingsEditor() { comboBox.addItemListener(new ItemListener() { @@ -747,7 +747,7 @@ public class DataSettingsDialog extends DialogComponentProvider { private StringChoices getComboBoxEnum() { String[] items = new String[comboBox.getItemCount()]; for (int i = 0; i < items.length; i++) { - items[i] = (String) comboBox.getItemAt(i); + items[i] = comboBox.getItemAt(i); } StringChoices enuum = new StringChoices(items); enuum.setSelectedValue(comboBox.getSelectedIndex()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataOrganizationDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataOrganizationDialog.java index 1cbc2560bc..0085aefb3b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataOrganizationDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataOrganizationDialog.java @@ -17,11 +17,12 @@ package ghidra.app.plugin.core.datamgr; import java.awt.BorderLayout; -import javax.swing.JLabel; import javax.swing.JPanel; import docking.DialogComponentProvider; +import docking.DockingUtils; import ghidra.program.model.data.*; +import ghidra.util.HTMLUtilities; /** * The DataOrganizationDialog @@ -34,8 +35,8 @@ public class DataOrganizationDialog extends DialogComponentProvider { private JPanel mainPanel; private DataOrganizationPanel alignPanel; private SizeAlignmentPanel sizePanel; - private boolean actionComplete; - + private boolean actionComplete; + /** * Creates a data type organization dialog for specifying data type alignment information * for a single data type manager. This dialog allows the user to align all data types in @@ -46,52 +47,52 @@ public class DataOrganizationDialog extends DialogComponentProvider { */ public DataOrganizationDialog(DataTypeManager dataTypeManager, DataOrganizationImpl dataOrganization) { - super(TITLE, true); - this.dataTypeManager = dataTypeManager; - this.dataOrganization = dataOrganization; - + super(TITLE, true); + this.dataTypeManager = dataTypeManager; + this.dataOrganization = dataOrganization; + JPanel headerPanel = new JPanel(); - headerPanel.add(new JLabel("Alignment Information for " + - dataTypeManager.getName() + ".")); - + headerPanel.add(DockingUtils.createHtmlLabel("Alignment Information for " + + HTMLUtilities.friendlyEncodeHTML(dataTypeManager.getName()) + ".")); + alignPanel = new DataOrganizationPanel(); alignPanel.setOrganization(dataOrganization); sizePanel = new SizeAlignmentPanel(); sizePanel.setOrganization(dataOrganization); - + JPanel infoPanel = new JPanel(new BorderLayout()); infoPanel.add(alignPanel, BorderLayout.NORTH); infoPanel.add(sizePanel, BorderLayout.CENTER); - - mainPanel = new JPanel(new BorderLayout()); - mainPanel.add(headerPanel, BorderLayout.NORTH); - mainPanel.add(infoPanel, BorderLayout.CENTER); - addWorkPanel(mainPanel); - initialize(); - } - private void initialize() { - actionComplete = false; - addOKButton(); - setOkButtonText("Set"); - addCancelButton(); + mainPanel = new JPanel(new BorderLayout()); + mainPanel.add(headerPanel, BorderLayout.NORTH); + mainPanel.add(infoPanel, BorderLayout.CENTER); + addWorkPanel(mainPanel); + initialize(); + } + + private void initialize() { + actionComplete = false; + addOKButton(); + setOkButtonText("Set"); + addCancelButton(); // setHelpLocation(new HelpLocation(plugin, "Align_Data_Types_In_Archive")); - } - - public boolean userCanceled() { - return !actionComplete && !isVisible(); - } + } + + public boolean userCanceled() { + return !actionComplete && !isVisible(); + } @Override protected void okCallback() { - actionComplete = true; + actionComplete = true; close(); } @Override protected void cancelCallback() { super.cancelCallback(); - actionComplete = false; + actionComplete = false; } public DataOrganization getDataOrganization() { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataOrganizationPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataOrganizationPanel.java index 4be2ab9643..17c45b5700 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataOrganizationPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataOrganizationPanel.java @@ -21,6 +21,7 @@ import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import docking.DockingUtils; import ghidra.program.model.data.DataOrganizationImpl; import ghidra.util.layout.PairLayout; @@ -61,41 +62,41 @@ public class DataOrganizationPanel extends JPanel { setUpDoubleSize(); setUpLongDoubleSize(); - add(new JLabel("")); - add(new JLabel("")); - add(new JLabel("Absolute Max Alignment")); + add(DockingUtils.createNonHtmlLabel("")); + add(DockingUtils.createNonHtmlLabel("")); + add(DockingUtils.createNonHtmlLabel("Absolute Max Alignment")); add(absoluteMaxAlignComponent); - add(new JLabel("Machine Alignment")); + add(DockingUtils.createNonHtmlLabel("Machine Alignment")); add(machineAlignComponent); - add(new JLabel("Default Alignment")); + add(DockingUtils.createNonHtmlLabel("Default Alignment")); add(defaultAlignComponent); - add(new JLabel("Default Pointer Alignment")); + add(DockingUtils.createNonHtmlLabel("Default Pointer Alignment")); add(pointerAlignComponent); - add(new JLabel("")); - add(new JLabel("")); - add(new JLabel("Signed-Char:")); + add(DockingUtils.createNonHtmlLabel("")); + add(DockingUtils.createNonHtmlLabel("")); + add(DockingUtils.createNonHtmlLabel("Signed-Char:")); add(charIsSignedCheckbox); - add(new JLabel("Char Size")); + add(DockingUtils.createNonHtmlLabel("Char Size")); add(charSizeComponent); - add(new JLabel("Wide-Char Size")); + add(DockingUtils.createNonHtmlLabel("Wide-Char Size")); add(wcharSizeComponent); - add(new JLabel("Short Size")); + add(DockingUtils.createNonHtmlLabel("Short Size")); add(shortSizeComponent); - add(new JLabel("Integer Size")); + add(DockingUtils.createNonHtmlLabel("Integer Size")); add(integerSizeComponent); - add(new JLabel("Long Size")); + add(DockingUtils.createNonHtmlLabel("Long Size")); add(longSizeComponent); - add(new JLabel("LongLong Size")); + add(DockingUtils.createNonHtmlLabel("LongLong Size")); add(longLongSizeComponent); - add(new JLabel("Float Size")); + add(DockingUtils.createNonHtmlLabel("Float Size")); add(floatSizeComponent); - add(new JLabel("Double Size")); + add(DockingUtils.createNonHtmlLabel("Double Size")); add(doubleSizeComponent); - add(new JLabel("LongDouble Size")); + add(DockingUtils.createNonHtmlLabel("LongDouble Size")); add(longDoubleSizeComponent); - add(new JLabel("")); - add(new JLabel("")); + add(DockingUtils.createNonHtmlLabel("")); + add(DockingUtils.createNonHtmlLabel("")); } public void setOrganization(DataOrganizationImpl dataOrganization) { @@ -133,7 +134,7 @@ public class DataOrganizationPanel extends JPanel { doubleSizeComponent.setText(Integer.toString(doubleSize)); longDoubleSizeComponent.setText(Integer.toString(longDoubleSize)); } - + private void setUpSignedChar() { charIsSignedCheckbox = new JCheckBox(); charIsSignedCheckbox.addChangeListener(new ChangeListener() { @@ -143,19 +144,22 @@ public class DataOrganizationPanel extends JPanel { } }); } - + private void setUpCharSize() { charSizeComponent = new JTextField(3); charSizeComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedCharSize(); } }); charSizeComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedCharSize(); } @@ -165,15 +169,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpWideCharSize() { wcharSizeComponent = new JTextField(3); wcharSizeComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedWideCharSize(); } }); wcharSizeComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedWideCharSize(); } @@ -183,15 +190,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpShortSize() { shortSizeComponent = new JTextField(3); shortSizeComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedShortSize(); } }); shortSizeComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedShortSize(); } @@ -201,15 +211,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpIntegerSize() { integerSizeComponent = new JTextField(3); integerSizeComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedIntegerSize(); } }); integerSizeComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedIntegerSize(); } @@ -219,15 +232,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpLongSize() { longSizeComponent = new JTextField(3); longSizeComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedLongSize(); } }); longSizeComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedLongSize(); } @@ -237,15 +253,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpLongLongSize() { longLongSizeComponent = new JTextField(3); longLongSizeComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedLongLongSize(); } }); longLongSizeComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedLongLongSize(); } @@ -255,15 +274,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpFloatSize() { floatSizeComponent = new JTextField(3); floatSizeComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedFloatSize(); } }); floatSizeComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedFloatSize(); } @@ -273,15 +295,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpDoubleSize() { doubleSizeComponent = new JTextField(3); doubleSizeComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedDoubleSize(); } }); doubleSizeComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedDoubleSize(); } @@ -291,15 +316,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpLongDoubleSize() { longDoubleSizeComponent = new JTextField(3); longDoubleSizeComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedLongDoubleSize(); } }); longDoubleSizeComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedLongDoubleSize(); } @@ -309,15 +337,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpAbsoluteMaxAlignment() { absoluteMaxAlignComponent = new JTextField(3); absoluteMaxAlignComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedAbsoluteMaxAlignment(); } }); absoluteMaxAlignComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedAbsoluteMaxAlignment(); } @@ -327,15 +358,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpMachineAlignment() { machineAlignComponent = new JTextField(3); machineAlignComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedMachineAlignment(); } }); machineAlignComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedMachineAlignment(); } @@ -345,15 +379,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpDefaultAlignment() { defaultAlignComponent = new JTextField(3); defaultAlignComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedDefaultAlignment(); } }); defaultAlignComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedDefaultAlignment(); } @@ -363,15 +400,18 @@ public class DataOrganizationPanel extends JPanel { private void setUpPointerAlignment() { pointerAlignComponent = new JTextField(3); pointerAlignComponent.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { updatedDefaultPointerAlignment(); } }); pointerAlignComponent.addFocusListener(new FocusListener() { + @Override public void focusGained(FocusEvent e) { // TODO } + @Override public void focusLost(FocusEvent e) { updatedDefaultPointerAlignment(); } @@ -382,7 +422,7 @@ public class DataOrganizationPanel extends JPanel { boolean isSigned = charIsSignedCheckbox.isSelected(); dataOrganization.setCharIsSigned(isSigned); } - + protected void updatedCharSize() { int charSize = Integer.decode(charSizeComponent.getText()).intValue(); dataOrganization.setCharSize(charSize); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeComparePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeComparePanel.java index 594830c324..80d644a142 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeComparePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeComparePanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,17 +15,18 @@ */ package ghidra.app.plugin.core.datamgr; -import ghidra.app.util.ToolTipUtils; -import ghidra.app.util.html.HTMLDataTypeRepresentation; -import ghidra.program.model.data.DataType; -import ghidra.util.HTMLUtilities; - import java.awt.*; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import docking.DockingUtils; +import ghidra.app.util.ToolTipUtils; +import ghidra.app.util.html.HTMLDataTypeRepresentation; +import ghidra.program.model.data.DataType; +import ghidra.util.HTMLUtilities; + /** * Panel that displays two data types side by side. */ @@ -60,22 +60,22 @@ class DataTypeComparePanel extends JPanel { leftPanel = new JPanel(new BorderLayout()); rightPanel = new JPanel(new BorderLayout()); - leftPanelLabel = new JLabel(); - rightPanelLabel = new JLabel(); + leftPanelLabel = DockingUtils.createHtmlLabel(); + rightPanelLabel = DockingUtils.createHtmlLabel(); leftPanelLabel.setBorder(BorderFactory.createEmptyBorder(2, 8, 2, 0)); rightPanelLabel.setBorder(BorderFactory.createEmptyBorder(2, 8, 2, 0)); - setLabelText(leftPanelLabel, clientName + ":"); - setLabelText(rightPanelLabel, sourceName + ":"); + setLabelText(leftPanelLabel, HTMLUtilities.friendlyEncodeHTML(clientName) + ":"); + setLabelText(rightPanelLabel, HTMLUtilities.friendlyEncodeHTML(sourceName) + ":"); add(leftPanel); add(rightPanel); - dtLabel1 = new JLabel(); + dtLabel1 = DockingUtils.createHtmlLabel(); dtLabel1.setOpaque(true); dtLabel1.setBackground(Color.WHITE); dtLabel1.setBorder(BorderFactory.createEmptyBorder(2, 8, 0, 0)); dtLabel1.setVerticalAlignment(SwingConstants.TOP); - dtLabel2 = new JLabel(); + dtLabel2 = DockingUtils.createHtmlLabel(); dtLabel2.setOpaque(true); dtLabel2.setBackground(Color.WHITE); dtLabel2.setBorder(BorderFactory.createEmptyBorder(2, 8, 0, 0)); @@ -97,12 +97,14 @@ class DataTypeComparePanel extends JPanel { final JViewport viewport1 = leftScrollPane.getViewport(); final JViewport viewport2 = rightScrollPane.getViewport(); viewport1.addChangeListener(new ChangeListener() { + @Override public void stateChanged(ChangeEvent e) { int y = viewport1.getViewPosition().y; viewport2.setViewPosition(new Point(0, y)); } }); viewport2.addChangeListener(new ChangeListener() { + @Override public void stateChanged(ChangeEvent e) { int y = viewport2.getViewPosition().y; viewport1.setViewPosition(new Point(0, y)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeSynchronizer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeSynchronizer.java index efb50470d2..1e9fb516b0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeSynchronizer.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeSynchronizer.java @@ -23,6 +23,7 @@ import javax.swing.SwingUtilities; import org.apache.commons.lang3.StringUtils; +import docking.DockingUtils; import ghidra.app.plugin.core.datamgr.archive.DataTypeManagerHandler; import ghidra.app.plugin.core.datamgr.archive.SourceArchive; import ghidra.app.util.ToolTipUtils; @@ -324,7 +325,7 @@ public class DataTypeSynchronizer { // this string allows us to force both tables to be the same width, which is // aesthetically pleasing String spacerString = createHTMLSpacerString(htmlContent, otherContent); - StringBuffer buffy = new StringBuffer(); + StringBuilder buffy = new StringBuilder(); buffy.append(""); // -we use CELLPADDING here to allow us to create a narrow column within the table @@ -333,7 +334,8 @@ public class DataTypeSynchronizer { buffy.append(""); buffy.append(""); - buffy.append("").append(dataTypeManager.getName()).append("
    "); + buffy.append("").append( + HTMLUtilities.friendlyEncodeHTML(dataTypeManager.getName())).append("
    "); buffy.append(htmlContent); // horizontal spacer below the inner table in order to force a minimum width @@ -345,7 +347,8 @@ public class DataTypeSynchronizer { buffy.append(""); buffy.append(""); - buffy.append("").append(sourceArchive.getName()).append("
    "); + buffy.append("").append( + HTMLUtilities.friendlyEncodeHTML(sourceArchive.getName())).append("
    "); buffy.append(otherContent); @@ -372,17 +375,15 @@ public class DataTypeSynchronizer { * an HTML string of spaces that is wide enough to represent that width. */ private static String createHTMLSpacerString(String htmlContent, String otherHTMLContent) { - StringBuffer buffy = new StringBuffer(); - // unfortunately, to get the displayed widths, we have to have rendered content, which // is what the JLabels below are doing for us - JLabel label1 = new JLabel("" + htmlContent); - JLabel label2 = new JLabel("" + otherHTMLContent); + JLabel label1 = DockingUtils.createHtmlLabel("" + htmlContent); + JLabel label2 = DockingUtils.createHtmlLabel("" + otherHTMLContent); int maxPixelWidth = Math.max(label1.getPreferredSize().width, label2.getPreferredSize().width); FontMetrics fontMetrics = label1.getFontMetrics(label1.getFont()); - StringBuffer bigBuffy = new StringBuffer(); + StringBuilder bigBuffy = new StringBuilder(); String HTMLSpace = " "; int invisibleCharCount = HTMLSpace.length(); for (int i = 0; i < 150; i++) { @@ -396,7 +397,7 @@ public class DataTypeSynchronizer { } } - return buffy.toString(); + return bigBuffy.toString(); } public String getClientName() { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/OpenDomainFileTask.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/OpenDomainFileTask.java index 15fe6ebd3b..955bdca1f2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/OpenDomainFileTask.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/OpenDomainFileTask.java @@ -197,8 +197,8 @@ class OpenDomainFileTask extends Task { if (dfile.isInWritableProject() && dfile.canRecover()) { Runnable r = () -> { int option = OptionDialog.showYesNoDialog(null, "Crash Recovery Data Found", - dfile.getName() + " has crash data.\n" + - "Would you like to recover unsaved changes?"); + "" + HTMLUtilities.friendlyEncodeHTML(dfile.getName()) + + " has crash data.
    " + "Would you like to recover unsaved changes?"); recoverFile[0] = (option == OptionDialog.OPTION_ONE); }; SwingUtilities.invokeAndWait(r); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/CreatePointerAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/CreatePointerAction.java index 2072cee311..b7c9de34cc 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/CreatePointerAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/CreatePointerAction.java @@ -62,7 +62,7 @@ public class CreatePointerAction extends DockingAction { Msg.showInfo(getClass(), gTree, "Pointers Filter Enabled", "Newly created pointer is filtered out of view.

    Toggle the " + "Filter Pointers " + "Action to view the pointer
    Pointer: " + - newManager.getName() + newPath); + HTMLUtilities.friendlyEncodeHTML(newManager.getName() + newPath)); return; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/CreateTypeDefDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/CreateTypeDefDialog.java index 1ce4c4f037..ba9476a041 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/CreateTypeDefDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/CreateTypeDefDialog.java @@ -15,15 +15,15 @@ */ package ghidra.app.plugin.core.datamgr.actions; -import java.awt.Component; - import javax.swing.*; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.tree.TreePath; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.combobox.GhidraComboBox; +import docking.widgets.list.GListCellRenderer; import ghidra.app.plugin.core.datamgr.DataTypeManagerPlugin; import ghidra.app.plugin.core.datamgr.tree.ArchiveNode; import ghidra.app.plugin.core.datamgr.tree.DataTypeTreeNode; @@ -59,18 +59,18 @@ public class CreateTypeDefDialog extends DialogComponentProvider { JPanel panel = new JPanel(new PairLayout()); // category info - panel.add(new JLabel("Category:")); - panel.add(new JLabel(category.getCategoryPath().getPath())); + panel.add(DockingUtils.createNonHtmlLabel("Category:")); + panel.add(DockingUtils.createNonHtmlLabel(category.getCategoryPath().getPath())); // name info nameTextField = new JTextField(15); - panel.add(new JLabel("Name:")); + panel.add(DockingUtils.createNonHtmlLabel("Name:")); panel.add(nameTextField); // data type info dataTypeEditor = new DataTypeSelectionEditor(plugin.getTool(), Integer.MAX_VALUE, AllowedDataTypes.ALL); - panel.add(new JLabel("Data type:")); + panel.add(DockingUtils.createNonHtmlLabel("Data type:")); panel.add(dataTypeEditor.getEditorComponent()); dataTypeEditor.addCellEditorListener(new CellEditorListener() { @@ -88,21 +88,9 @@ public class CreateTypeDefDialog extends DialogComponentProvider { dataTypeEditor.setDefaultSelectedTreePath(selectedTreePath); dataTypeManagerBox = new GhidraComboBox<>(); - dataTypeManagerBox.setRenderer(new DefaultListCellRenderer() { - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - JLabel label = - (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, - cellHasFocus); - - if (value != null) { - label.setText(((DataTypeManager) value).getName()); - } - - return label; - } - }); + dataTypeManagerBox.setRenderer( + GListCellRenderer.createDefaultCellTextRenderer(dtm -> dtm.getName())); + DockingUtils.turnOffHTMLRendering(dataTypeManagerBox); DataTypeManager[] dataTypeManagers = plugin.getDataTypeManagers(); for (DataTypeManager manager : dataTypeManagers) { @@ -127,7 +115,7 @@ public class CreateTypeDefDialog extends DialogComponentProvider { dataTypeManagerBox.setSelectedItem(itemToSelect); - panel.add(new JLabel("Archive:")); + panel.add(DockingUtils.createNonHtmlLabel("Archive:")); panel.add(dataTypeManagerBox); panel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/DeleteArchiveAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/DeleteArchiveAction.java index 5736fa7964..55e8764c51 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/DeleteArchiveAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/DeleteArchiveAction.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,12 +15,6 @@ */ package ghidra.app.plugin.core.datamgr.actions; -import ghidra.app.plugin.core.datamgr.DataTypeManagerPlugin; -import ghidra.app.plugin.core.datamgr.DataTypesActionContext; -import ghidra.app.plugin.core.datamgr.archive.FileArchive; -import ghidra.app.plugin.core.datamgr.tree.*; -import ghidra.util.Msg; - import java.awt.event.KeyEvent; import java.io.IOException; @@ -31,6 +24,12 @@ import docking.ActionContext; import docking.action.*; import docking.widgets.OptionDialog; import docking.widgets.tree.GTree; +import ghidra.app.plugin.core.datamgr.DataTypeManagerPlugin; +import ghidra.app.plugin.core.datamgr.DataTypesActionContext; +import ghidra.app.plugin.core.datamgr.archive.FileArchive; +import ghidra.app.plugin.core.datamgr.tree.*; +import ghidra.util.HTMLUtilities; +import ghidra.util.Msg; public class DeleteArchiveAction extends DockingAction { @@ -92,10 +91,13 @@ public class DeleteArchiveAction extends DockingAction { TreePath[] selectionPaths = gTree.getSelectionPaths(); FileArchiveNode node = (FileArchiveNode) selectionPaths[0].getLastPathComponent(); - if (OptionDialog.showOptionDialogWithCancelAsDefaultButton(gTree, "Confirm Delete Operation", - "Are you sure you want to delete archive: " + node.getName() + "?

    " + + if (OptionDialog.showOptionDialogWithCancelAsDefaultButton(gTree, + "Confirm Delete Operation", + "Are you sure you want to delete archive: " + + HTMLUtilities.friendlyEncodeHTML(node.getName()) + "?

    " + "(WARNING: This action will permanently " + - "delete the file from disk.)
    ", "Yes", OptionDialog.QUESTION_MESSAGE) != OptionDialog.OPTION_ONE) { + "delete the file from disk.)
    ", + "Yes", OptionDialog.QUESTION_MESSAGE) != OptionDialog.OPTION_ONE) { return; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/RemoveInvalidArchiveFromProgramAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/RemoveInvalidArchiveFromProgramAction.java index b5dde75cc3..8989f60f44 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/RemoveInvalidArchiveFromProgramAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/actions/RemoveInvalidArchiveFromProgramAction.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +15,6 @@ */ package ghidra.app.plugin.core.datamgr.actions; -import ghidra.app.plugin.core.datamgr.DataTypeManagerPlugin; -import ghidra.app.plugin.core.datamgr.DataTypesActionContext; -import ghidra.app.plugin.core.datamgr.archive.*; -import ghidra.app.plugin.core.datamgr.tree.InvalidArchiveNode; - import javax.swing.tree.TreePath; import docking.ActionContext; @@ -29,6 +23,11 @@ import docking.action.MenuData; import docking.widgets.OptionDialog; import docking.widgets.tree.GTree; import docking.widgets.tree.GTreeNode; +import ghidra.app.plugin.core.datamgr.DataTypeManagerPlugin; +import ghidra.app.plugin.core.datamgr.DataTypesActionContext; +import ghidra.app.plugin.core.datamgr.archive.*; +import ghidra.app.plugin.core.datamgr.tree.InvalidArchiveNode; +import ghidra.util.HTMLUtilities; public class RemoveInvalidArchiveFromProgramAction extends DockingAction { @@ -38,7 +37,8 @@ public class RemoveInvalidArchiveFromProgramAction extends DockingAction { super("Remove Invalid Archive", plugin.getName()); this.plugin = plugin; - setPopupMenuData(new MenuData(new String[] { "Remove Archive From Program" }, null, "File")); + setPopupMenuData( + new MenuData(new String[] { "Remove Archive From Program" }, null, "File")); setDescription("Removes the archive from program and tool"); setEnabled(true); @@ -76,11 +76,12 @@ public class RemoveInvalidArchiveFromProgramAction extends DockingAction { InvalidArchiveNode invalidArchiveNode = (InvalidArchiveNode) pathComponent; if (OptionDialog.showOptionDialog(gtree, "Confirm Remove Invalid Archive(s)", - "Are you sure you want to delete archive: " + invalidArchiveNode.getName() + + "Are you sure you want to delete archive: " + + HTMLUtilities.friendlyEncodeHTML(invalidArchiveNode.getName()) + " from the program?

    " + "(WARNING: This action will disassociate " + - "all datatypes in the program from this archive.)
    ", "Yes", - OptionDialog.QUESTION_MESSAGE) != OptionDialog.OPTION_ONE) { + "all datatypes in the program from this archive.)
    ", + "Yes", OptionDialog.QUESTION_MESSAGE) != OptionDialog.OPTION_ONE) { return; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/ChooseArchiveDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/ChooseArchiveDialog.java deleted file mode 100644 index be46346d39..0000000000 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/ChooseArchiveDialog.java +++ /dev/null @@ -1,296 +0,0 @@ -/* ### - * IP: GHIDRA - * REVIEWED: YES - * - * 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 ghidra.app.plugin.core.datamgr.archive; - -import ghidra.framework.plugintool.Plugin; -import ghidra.util.HelpLocation; -import ghidra.util.UniversalID; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.*; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; - -import docking.DialogComponentProvider; - -public class ChooseArchiveDialog extends DialogComponentProvider { - - private JPanel archiveListPanel; - private JTextField filterField; - private boolean removeWasCanceled; - private Archive currentArchive; - private List archiveList; - private JList list; - private DefaultListModel listModel; - - public ChooseArchiveDialog(Plugin plugin, String title, Archive currentArchive, - List archiveList) { - super(title); - this.currentArchive = currentArchive; - this.archiveList = archiveList; - createArchiveListPanel(); - filterField = getFilterField(); - addWorkPanel(archiveListPanel); - addOKButton(); - setOkToolTip("Choose the archive file to synchronize."); - addCancelButton(); - setHelpLocation(new HelpLocation(plugin.getName(), "Choose_Archive")); - } - - public boolean wasCanceled() { - return removeWasCanceled; - } - - @Override - protected void cancelCallback() { - removeWasCanceled = true; - clearStatusText(); - close(); - } - - @Override - protected void okCallback() { - clearStatusText(); - Archive selectedArchive = getSelectedArchive(); - - if (selectedArchive == null) { - setStatusText("Please select an archive to synchronize."); - return; - } - close(); - return; - } - - /** - * Return the JList component. - */ - JList getList() { - return list; - } - - JTextField getFilterField() { - return filterField; - } - - /** - * Return the selected data type archive in the JList. - * @return null if no object is selected - */ - public Archive getSelectedArchive() { - int index = list.getSelectedIndex(); - if (index >= 0) { - return (Archive) listModel.get(index); - } - return null; - } - - void selectArchive(Archive archive) { - int index = listModel.indexOf(archive); - list.setSelectedIndex(index); - } - -// @Override -// public void requestFocus() { -// filterField.requestFocus(); -// filterField.selectAll(); -// filterList( filterField.getText() ); -// } - - private void createArchiveListPanel() { - - archiveListPanel = new JPanel(new BorderLayout()); - JPanel northPanel = new JPanel(); - String instructions = - "Choose the archive to synchronize with " + currentArchive.getName() + - "."; - JLabel instructionLabel = new JLabel(instructions); - northPanel.add(instructionLabel, BorderLayout.NORTH); - northPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 8, 3)); - archiveListPanel.add(northPanel, BorderLayout.NORTH); - - // Create the list - listModel = new DefaultListModel(); - initListModel(); - list = new JList(listModel); - list.setCellRenderer(new MyListCellRenderer()); - list.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if ((e.getClickCount() == 2) && (e.getButton() == MouseEvent.BUTTON1)) { - if (list.getSelectedValue() != null) { - okCallback(); - } - } - } - }); - - // Set the preferred row count. This affects the preferredSize - // of the JList when it's in a scrollpane. - int size = listModel.getSize(); - list.setVisibleRowCount(size); - - JScrollPane scrollPane = new JScrollPane(list); - scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); - scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - scrollPane.setBorder(BorderFactory.createEmptyBorder()); - - JPanel southPanel = new JPanel(); - southPanel.setLayout(new BoxLayout(southPanel, BoxLayout.X_AXIS)); - - filterField = createFilterField(); - southPanel.add(new JLabel("Filter: ")); - southPanel.add(filterField); - southPanel.setBorder(BorderFactory.createEmptyBorder(8, 3, 8, 3)); - - archiveListPanel.add(southPanel, BorderLayout.SOUTH); - - // Add list to a scrollpane - JPanel listPanel = new JPanel(new BorderLayout()); - listPanel.add(scrollPane, BorderLayout.CENTER); - listPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); - archiveListPanel.add(listPanel); - } - - private JTextField createFilterField() { - JTextField newFilterField = new JTextField(20); -// newFilterField.setBackground( BACKGROUND_COLOR ); -// newFilterField.setBorder( BorderFactory.createEmptyBorder( 0, 0, 5, 0 ) ); - - newFilterField.getDocument().addDocumentListener(new DocumentListener() { - public void changedUpdate(DocumentEvent e) { - filter(e.getDocument()); - } - - public void insertUpdate(DocumentEvent e) { - filter(e.getDocument()); - } - - public void removeUpdate(DocumentEvent e) { - filter(e.getDocument()); - } - - private void filter(Document document) { - try { - String text = document.getText(0, document.getLength()); - filterList(text); - } - catch (BadLocationException e) { - // shouldn't happen; don't care - } - } - }); - - return newFilterField; - } - - private void filterList(String filterText) { - List allDataList = new ArrayList(); - allDataList.addAll(archiveList); - - boolean hasFilter = filterText.trim().length() != 0; - if (hasFilter) { - String lowerCaseFilterText = filterText.toLowerCase(); - for (Iterator iterator = allDataList.iterator(); iterator.hasNext();) { - Archive archive = iterator.next(); - String archiveString = getStringUsedInList(archive).toLowerCase(); - if (archiveString.indexOf(lowerCaseFilterText) < 0) { - iterator.remove(); - } - } - } - - listModel.clear(); - for (Archive archive : allDataList) { - listModel.addElement(archive); - } - - // select something in the list so that the user can make a selection from the keyboard - int totalListSize = archiveList.size(); - int shownListSize = listModel.getSize(); - if (shownListSize > 0) { - int selectedIndex = list.getSelectedIndex(); - if (selectedIndex < 0) { - list.setSelectedIndex(0); - } - if (shownListSize == totalListSize) { - clearStatusText(); - } - else { - setStatusText("Filter is hiding " + (totalListSize - shownListSize) + - " of the archive choices."); - } - } - else { - setStatusText("Filter is hiding all possible archive choices."); - } - } - - private String getStringUsedInList(Archive archive) { - return archive.getName(); - } - - private void initListModel() { - listModel.clear(); - for (int i = 0; i < archiveList.size(); i++) { - Archive archive = archiveList.get(i); - UniversalID sourceID = currentArchive.getDataTypeManager().getUniversalID(); - SourceArchive sourceArchive = archive.getDataTypeManager().getSourceArchive(sourceID); - if (sourceArchive != null) { - // This archive at least had a data type from the source archive at one time. - listModel.addElement(archive); - } - } - } - - private class MyListCellRenderer extends JLabel implements ListCellRenderer { - - MyListCellRenderer() { - setOpaque(true); - } - - /* (non-Javadoc) - * @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean) - */ - public Component getListCellRendererComponent(JList localList, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - - Archive archive = (Archive) value; - setIcon(archive.getIcon(false)); - setIconTextGap(5); - - String text = getStringUsedInList(archive); - setText(text); - if (isSelected) { - setBackground(localList.getSelectionBackground()); - setForeground(localList.getSelectionForeground()); - } - else { - setBackground(localList.getBackground()); - setForeground(localList.getForeground()); - } - setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 10)); - return this; - } - } -} diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/DataTypeManagerHandler.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/DataTypeManagerHandler.java index 1728ee6297..7bb8ea5c2f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/DataTypeManagerHandler.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/archive/DataTypeManagerHandler.java @@ -1316,7 +1316,7 @@ public class DataTypeManagerHandler { private boolean acquireSaveLock(UndoableDomainObject undoableDomainObject) { if (!undoableDomainObject.lock(null)) { String title = "Save " + CONTENT_NAME + " (Busy)"; - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append("The " + CONTENT_NAME + " is currently being modified by \n"); buf.append("the following actions:\n "); Transaction t = undoableDomainObject.getCurrentTransaction(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/DataTypeEditorManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/DataTypeEditorManager.java index c61c16e6d0..8d2695c99d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/DataTypeEditorManager.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/DataTypeEditorManager.java @@ -21,6 +21,7 @@ import java.util.List; import javax.swing.*; import docking.ComponentProvider; +import docking.DockingUtils; import docking.widgets.combobox.GhidraComboBox; import ghidra.app.plugin.core.compositeeditor.*; import ghidra.app.plugin.core.datamgr.DataTypeManagerPlugin; @@ -574,7 +575,7 @@ public class DataTypeEditorManager } setCallingConventionChoices(choices); - parentPanel.add(new JLabel("Calling Convention:")); + parentPanel.add(DockingUtils.createNonHtmlLabel("Calling Convention:")); parentPanel.add(callingConventionComboBox); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/EnumEditorPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/EnumEditorPanel.java index 4045050a18..b917270202 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/EnumEditorPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/EnumEditorPanel.java @@ -24,6 +24,7 @@ import javax.swing.event.*; import javax.swing.table.TableCellEditor; import javax.swing.table.TableModel; +import docking.DockingUtils; import docking.widgets.OptionDialog; import docking.widgets.combobox.GhidraComboBox; import docking.widgets.table.GTableCellRenderer; @@ -381,7 +382,7 @@ class EnumEditorPanel extends JPanel { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); - JLabel label = new JLabel("Name:", SwingConstants.RIGHT); + JLabel label = DockingUtils.createNonHtmlLabel("Name:", SwingConstants.RIGHT); label.setPreferredSize(new Dimension(descLabel.getPreferredSize())); panel.add(label); panel.add(Box.createHorizontalStrut(2)); @@ -397,7 +398,7 @@ class EnumEditorPanel extends JPanel { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); - descLabel = new JLabel("Description:", SwingConstants.RIGHT); + descLabel = DockingUtils.createNonHtmlLabel("Description:", SwingConstants.RIGHT); panel.add(descLabel); panel.add(Box.createHorizontalStrut(2)); @@ -430,13 +431,13 @@ class EnumEditorPanel extends JPanel { } }); - JLabel label = new JLabel("Category:", SwingConstants.RIGHT); + JLabel label = DockingUtils.createNonHtmlLabel("Category:", SwingConstants.RIGHT); label.setPreferredSize(new Dimension(descLabel.getPreferredSize())); panel.add(label); panel.add(Box.createHorizontalStrut(2)); panel.add(categoryField); panel.add(Box.createHorizontalStrut(20)); - panel.add(new JLabel("Size:")); + panel.add(DockingUtils.createNonHtmlLabel("Size:")); panel.add(Box.createHorizontalStrut(5)); panel.add(sizeComboBox); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/EnumEditorProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/EnumEditorProvider.java index 25edf959e2..a0ea09c89a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/EnumEditorProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/editor/EnumEditorProvider.java @@ -398,7 +398,8 @@ public class EnumEditorProvider extends ComponentProviderAdapter newVal = "Missing"; } msg.append(String.format("
  • %s: 0x%s \u2192 %s
  • ", - field, Long.toHexString(originalEnum.getValue(field)), newVal)); + HTMLUtilities.friendlyEncodeHTML(field), + Long.toHexString(originalEnum.getValue(field)), newVal)); } msg.append(""); msg.append( diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/CategoryNode.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/CategoryNode.java index 051a6dd1be..07afb274d1 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/CategoryNode.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/CategoryNode.java @@ -23,8 +23,7 @@ import docking.widgets.tree.GTreeLazyNode; import docking.widgets.tree.GTreeNode; import ghidra.app.plugin.core.datamgr.util.DataTypeUtils; import ghidra.program.model.data.*; -import ghidra.util.InvalidNameException; -import ghidra.util.Msg; +import ghidra.util.*; import ghidra.util.exception.AssertException; import ghidra.util.exception.DuplicateNameException; @@ -67,8 +66,7 @@ public class CategoryNode extends GTreeLazyNode implements DataTypeTreeNode { Category[] subCategories = category.getCategories(); DataType[] dataTypes = category.getDataTypes(); - List children = - new ArrayList<>(subCategories.length + dataTypes.length); + List children = new ArrayList<>(subCategories.length + dataTypes.length); for (Category subCategory : subCategories) { children.add(new CategoryNode(subCategory)); } @@ -142,7 +140,7 @@ public class CategoryNode extends GTreeLazyNode implements DataTypeTreeNode { @Override public String getToolTip() { - return category.getCategoryPathName(); + return "" + HTMLUtilities.friendlyEncodeHTML(category.getCategoryPathName()); } @Override diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/DomainFileArchiveNode.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/DomainFileArchiveNode.java index 8200ed1ae9..2f0b9dff2b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/DomainFileArchiveNode.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/DomainFileArchiveNode.java @@ -22,6 +22,7 @@ import ghidra.app.plugin.core.datamgr.archive.DomainFileArchive; import ghidra.framework.model.DomainFile; import ghidra.framework.model.DomainObject; import ghidra.program.model.listing.Program; +import ghidra.util.HTMLUtilities; import resources.MultiIcon; import resources.ResourceManager; import resources.icons.TranslateIcon; @@ -102,7 +103,7 @@ public class DomainFileArchiveNode extends ArchiveNode { public String getToolTip() { DomainFile file = ((DomainFileArchive) archive).getDomainFile(); if (file != null) { - return file.getPathname(); + return "" + HTMLUtilities.friendlyEncodeHTML(file.getPathname()); } return "[Unsaved New Domain File Archive]"; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/FileArchiveNode.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/FileArchiveNode.java index 291e0a9877..2a4502c07e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/FileArchiveNode.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/FileArchiveNode.java @@ -20,6 +20,7 @@ import javax.swing.ImageIcon; import generic.jar.ResourceFile; import ghidra.app.plugin.core.datamgr.archive.FileArchive; +import ghidra.util.HTMLUtilities; import resources.MultiIcon; import resources.ResourceManager; import resources.icons.TranslateIcon; @@ -53,7 +54,7 @@ public class FileArchiveNode extends ArchiveNode { public String getToolTip() { ResourceFile file = fileArchive.getFile(); if (file != null) { - return file.getAbsolutePath(); + return "" + HTMLUtilities.friendlyEncodeHTML(file.getAbsolutePath()); } return "[Unsaved New Archive]"; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/InvalidArchiveNode.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/InvalidArchiveNode.java index af45f99319..a182cfa8e8 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/InvalidArchiveNode.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/InvalidArchiveNode.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,13 @@ */ package ghidra.app.plugin.core.datamgr.tree; -import ghidra.app.plugin.core.datamgr.archive.Archive; -import ghidra.app.plugin.core.datamgr.archive.InvalidFileArchive; -import ghidra.program.model.data.ArchiveType; - import java.util.List; import docking.widgets.tree.GTreeNode; +import ghidra.app.plugin.core.datamgr.archive.Archive; +import ghidra.app.plugin.core.datamgr.archive.InvalidFileArchive; +import ghidra.program.model.data.ArchiveType; +import ghidra.util.HTMLUtilities; public class InvalidArchiveNode extends ArchiveNode { @@ -44,7 +43,8 @@ public class InvalidArchiveNode extends ArchiveNode { public String getToolTip() { ArchiveType archiveType = ((InvalidFileArchive) archive).getArchiveType(); String type = archiveType == ArchiveType.FILE ? "File" : "Project"; - return "Unable to locate " + type + " data type archive: " + archive.getName(); + return "Unable to locate " + type + " data type archive: " + + HTMLUtilities.friendlyEncodeHTML(archive.getName()); } @Override diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/ProgramArchiveNode.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/ProgramArchiveNode.java index 335a1311ab..ad028cc367 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/ProgramArchiveNode.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/ProgramArchiveNode.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +17,7 @@ package ghidra.app.plugin.core.datamgr.tree; import ghidra.app.plugin.core.datamgr.archive.ProgramArchive; import ghidra.framework.model.DomainFile; +import ghidra.util.HTMLUtilities; public class ProgramArchiveNode extends DomainFileArchiveNode { @@ -29,7 +29,7 @@ public class ProgramArchiveNode extends DomainFileArchiveNode { public String getToolTip() { DomainFile file = ((ProgramArchive) archive).getDomainFile(); if (file != null) { - return file.getPathname(); + return "" + HTMLUtilities.friendlyEncodeHTML(file.getPathname()); } return "[Unsaved New Program Archive]"; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/ProjectArchiveNode.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/ProjectArchiveNode.java index ceac353087..1799990639 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/ProjectArchiveNode.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/tree/ProjectArchiveNode.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +17,7 @@ package ghidra.app.plugin.core.datamgr.tree; import ghidra.app.plugin.core.datamgr.archive.ProjectArchive; import ghidra.framework.model.DomainFile; +import ghidra.util.HTMLUtilities; public class ProjectArchiveNode extends DomainFileArchiveNode { @@ -37,7 +37,7 @@ public class ProjectArchiveNode extends DomainFileArchiveNode { public String getToolTip() { DomainFile file = ((ProjectArchive) archive).getDomainFile(); if (file != null) { - return file.getPathname(); + return "" + HTMLUtilities.friendlyEncodeHTML(file.getPathname()); } return "[Unsaved New Project Archive]"; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/ConflictDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/ConflictDialog.java index e7777fd20f..21140a0dd0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/ConflictDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/ConflictDialog.java @@ -21,6 +21,7 @@ import java.awt.event.*; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import ghidra.util.HelpLocation; import resources.ResourceManager; @@ -140,9 +141,10 @@ public class ConflictDialog extends DialogComponentProvider { } private JPanel createLabelPanel(String dtName, String categoryPath) { - JLabel imageLabel = new JLabel(INFORM_ICON); + JLabel imageLabel = DockingUtils.createNonHtmlLabel(INFORM_ICON); - JLabel infoLabel = new JLabel("Conflict exists in " + categoryPath + " for " + dtName); + JLabel infoLabel = DockingUtils.createNonHtmlLabel( + "Conflict exists in " + categoryPath + " for " + dtName); JPanel labelPanel = new JPanel(); labelPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 20)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeChooserDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeChooserDialog.java index e9101cd81a..5293a21630 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeChooserDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeChooserDialog.java @@ -24,6 +24,7 @@ import javax.swing.*; import javax.swing.tree.TreePath; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.filter.FilterOptions; import docking.widgets.filter.TextFilterStrategy; import docking.widgets.tree.*; @@ -98,8 +99,7 @@ public class DataTypeChooserDialog extends DialogComponentProvider { private JComponent createWorkPanel() { JPanel panel = new JPanel(new BorderLayout()); - String message = "Choose the data type you wish to use."; - messageLabel = new JLabel(message); + messageLabel = DockingUtils.createNonHtmlLabel("Choose the data type you wish to use."); messageLabel.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 2)); panel.add(messageLabel, BorderLayout.NORTH); panel.add(this.tree, BorderLayout.CENTER); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeUtils.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeUtils.java index d7aba3e0e4..77152229e4 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeUtils.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeUtils.java @@ -490,11 +490,11 @@ public class DataTypeUtils { // JFrame frame = new JFrame(); // JPanel panel = new JPanel(); // -// JLabel label1 = new JLabel(); +// JLabel label1 = DockingUtils.createNonHtmlLabel(); // Icon icon = getOpenFolderIcon( false ); // label1.setIcon( icon ); // -// JLabel label2 = new JLabel(); +// JLabel label2 = DockingUtils.createNonHtmlLabel(); // Icon icon2 = ResourceManager.getDisabledIcon( (ImageIcon) icon ); // label2.setIcon( icon2 ); // diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datawindow/FilterAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datawindow/FilterAction.java index 5f5c077dfb..e66d88fd11 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datawindow/FilterAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datawindow/FilterAction.java @@ -317,7 +317,7 @@ class FilterAction extends ToggleDockingAction { JPanel filterPanel = new JPanel(new BorderLayout()); filterField = new FilterTextField(checkboxPanel); filterPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); - filterPanel.add(new JLabel("Filter:"), BorderLayout.WEST); + filterPanel.add(DockingUtils.createNonHtmlLabel("Filter:"), BorderLayout.WEST); filterPanel.add(filterField, BorderLayout.CENTER); filterField.addFilterListener(filterListener); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/AddressTableDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/AddressTableDialog.java index d97ac11204..1d83bb760e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/AddressTableDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/AddressTableDialog.java @@ -23,8 +23,7 @@ import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import docking.ActionContext; -import docking.DialogComponentProvider; +import docking.*; import docking.ToolTipManager; import docking.action.*; import ghidra.app.events.ProgramSelectionPluginEvent; @@ -148,7 +147,7 @@ public class AddressTableDialog extends DialogComponentProvider { JPanel searchOptionsPanel = new JPanel(new BorderLayout()); searchOptionsPanel.setBorder(BorderFactory.createTitledBorder("Search Options")); - JLabel minLengthLabel = new JLabel("Minimum Length: "); + JLabel minLengthLabel = DockingUtils.createNonHtmlLabel("Minimum Length: "); ToolTipManager.setToolTipText(minLengthLabel, "The minimum number of consecutive addresses that will make an address table."); minLengthField = new JTextField(5); @@ -159,7 +158,7 @@ public class AddressTableDialog extends DialogComponentProvider { minLengthPanel.add(minLengthLabel); minLengthPanel.add(minLengthField); - alignLabel = new JLabel("Alignment: "); + alignLabel = DockingUtils.createNonHtmlLabel("Alignment: "); alignField = new JTextField(5); alignField.setName("Alignment"); ToolTipManager.setToolTipText(alignLabel, @@ -170,7 +169,7 @@ public class AddressTableDialog extends DialogComponentProvider { } alignField.setText("" + align); - skipLabel = new JLabel("Skip Length: "); + skipLabel = DockingUtils.createNonHtmlLabel("Skip Length: "); skipField = new JTextField(5); skipField.setName("Skip"); ToolTipManager.setToolTipText(skipLabel, @@ -230,12 +229,12 @@ public class AddressTableDialog extends DialogComponentProvider { ToolTipManager.setToolTipText(autoLabelCB, "Label the top of the address table and all members of the table."); - offsetLabel = new JLabel("Offset: "); + offsetLabel = DockingUtils.createNonHtmlLabel("Offset: "); ToolTipManager.setToolTipText(offsetLabel, "Offset from the beginning of the selected table(s)"); offsetLabel.setEnabled(false); - JLabel viewOffsetLabel = new JLabel(" "); + JLabel viewOffsetLabel = DockingUtils.createNonHtmlLabel(" "); viewOffsetLabel.setEnabled(false); viewOffset = new HintTextField(20); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/DisassembledViewPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/DisassembledViewPlugin.java index 6993657b38..346e9ff2dd 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/DisassembledViewPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/DisassembledViewPlugin.java @@ -23,6 +23,7 @@ import javax.swing.*; import javax.swing.event.ChangeListener; import docking.WindowPosition; +import docking.widgets.list.GListCellRenderer; import ghidra.GhidraOptions; import ghidra.app.CorePluginPackage; import ghidra.app.plugin.PluginCategoryNames; @@ -42,8 +43,7 @@ import ghidra.program.model.address.AddressOverflowException; import ghidra.program.model.listing.*; import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramSelection; -import ghidra.util.HelpLocation; -import ghidra.util.Msg; +import ghidra.util.*; import ghidra.util.exception.UsrException; /** @@ -421,23 +421,26 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec initializeDisplay(); // we need to do some custom rendering - contentList.setCellRenderer(new DefaultListCellRenderer() { + contentList.setCellRenderer(new GListCellRenderer() { + @Override - public Component getListCellRendererComponent(JList list, Object value, - int index, boolean isSelected, boolean cellHasFocus) { - JLabel renderer = (JLabel) super.getListCellRendererComponent(list, value, - index, isSelected, cellHasFocus); + protected String getItemText(DisassembledAddressInfo value) { + return value.getAddressPreview(addressPreviewFormat); + } - renderer.setFont(font); + @Override + public Component getListCellRendererComponent( + JList list, + DisassembledAddressInfo value, int index, boolean isSelected, + boolean cellHasFocus) { - renderer.setToolTipText(TOOLTIP_TEXT_PREPEND + currentLocation.getAddress()); + super.getListCellRendererComponent(list, value, index, isSelected, + cellHasFocus); - // first let's set the text to the user-defined option, if - // we have the correct type of class - if (value instanceof DisassembledAddressInfo) { - renderer.setText(((DisassembledAddressInfo) value).getAddressPreview( - addressPreviewFormat)); - } + setFont(font); + + setToolTipText(TOOLTIP_TEXT_PREPEND + + HTMLUtilities.friendlyEncodeHTML(currentLocation.getAddress().toString())); // make sure the first value is highlighted to indicate // that it is the selected program location @@ -450,13 +453,12 @@ public class DisassembledViewPlugin extends ProgramPlugin implements DomainObjec background = background.darker(); } - renderer.setForeground(foreground); - renderer.setBackground(background); + setForeground(foreground); + setBackground(background); } - return renderer; + return this; } - }); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/ProcessorStateDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/ProcessorStateDialog.java index 662e3800fb..1e724e1c38 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/ProcessorStateDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/ProcessorStateDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +15,6 @@ */ package ghidra.app.plugin.core.disassembler; -import ghidra.app.util.bean.FixedBitSizeValueField; -import ghidra.program.model.lang.Register; -import ghidra.program.model.lang.RegisterValue; -import ghidra.program.model.listing.ProgramContext; -import ghidra.util.HelpLocation; -import ghidra.util.layout.PairLayout; - import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; @@ -33,107 +25,114 @@ import java.util.ArrayList; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; +import ghidra.app.util.bean.FixedBitSizeValueField; +import ghidra.program.model.lang.Register; +import ghidra.program.model.lang.RegisterValue; +import ghidra.program.model.listing.ProgramContext; +import ghidra.util.HelpLocation; +import ghidra.util.layout.PairLayout; public class ProcessorStateDialog extends DialogComponentProvider { - private JPanel mainPanel; + private JPanel mainPanel; - private final static String TITLE = "Specify Processor Disassembly Options"; + private final static String TITLE = "Specify Processor Disassembly Options"; - private FixedBitSizeValueField[] fields; - private java.util.List registerList; + private FixedBitSizeValueField[] fields; + private java.util.List registerList; private ProgramContext programContext; - + public ProcessorStateDialog(ProgramContext programContext) { - super(TITLE, true, false, true, false); + super(TITLE, true, false, true, false); this.programContext = programContext; Register[] contextRegisters = programContext.getProcessorStateRegisters(); - registerList = new ArrayList(); + registerList = new ArrayList<>(); for (Register register : contextRegisters) { if (!register.isBaseRegister()) { registerList.add(register); } } - RegisterValue currentContext = programContext.getDefaultDisassemblyContext(); - addOKButton(); - addCancelButton(); + RegisterValue currentContext = programContext.getDefaultDisassemblyContext(); + addOKButton(); + addCancelButton(); - JPanel workPanel = new JPanel(new PairLayout(4,4)); - workPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); - fields = new FixedBitSizeValueField[registerList.size()]; - for (int i = 0; i < fields.length; i++) { - Register register = registerList.get(i); - int numbits = register.getBitLength(); - JLabel label = new JLabel(register.getName()+" [ "+register.getBitLength() - + " bit" + ((numbits == 1) ? "" : "s") + " ] :"); - label.setHorizontalAlignment(SwingConstants.TRAILING); - label.setToolTipText(register.getDescription()); - workPanel.add(label); + JPanel workPanel = new JPanel(new PairLayout(4, 4)); + workPanel.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); + fields = new FixedBitSizeValueField[registerList.size()]; + for (int i = 0; i < fields.length; i++) { + Register register = registerList.get(i); + int numbits = register.getBitLength(); + JLabel label = DockingUtils.createNonHtmlLabel(register.getName() + " [ " + + register.getBitLength() + " bit" + ((numbits == 1) ? "" : "s") + " ] :"); + label.setHorizontalAlignment(SwingConstants.TRAILING); + label.setToolTipText(register.getDescription()); + workPanel.add(label); fields[i] = new FixedBitSizeValueField(register.getBitLength(), false, false); - fields[i].setValue( currentContext.getRegisterValue(register).getUnsignedValue() ); + fields[i].setValue(currentContext.getRegisterValue(register).getUnsignedValue()); workPanel.add(fields[i]); } - mainPanel = new JPanel(new BorderLayout()); - JScrollPane scrollPane = new JScrollPane(workPanel); - mainPanel.add(scrollPane, BorderLayout.CENTER); - JPanel radioPanel = new JPanel(new FlowLayout()); - mainPanel.add(radioPanel, BorderLayout.SOUTH); - JRadioButton hexButton = new JRadioButton("Hex"); - JRadioButton decimalButton = new JRadioButton("Decimal"); - hexButton.setSelected(true); - ButtonGroup group = new ButtonGroup(); - group.add(hexButton); - group.add(decimalButton); - radioPanel.add(hexButton); - radioPanel.add(decimalButton); - hexButton.addActionListener(new ActionListener() { + mainPanel = new JPanel(new BorderLayout()); + JScrollPane scrollPane = new JScrollPane(workPanel); + mainPanel.add(scrollPane, BorderLayout.CENTER); + JPanel radioPanel = new JPanel(new FlowLayout()); + mainPanel.add(radioPanel, BorderLayout.SOUTH); + JRadioButton hexButton = new JRadioButton("Hex"); + JRadioButton decimalButton = new JRadioButton("Decimal"); + hexButton.setSelected(true); + ButtonGroup group = new ButtonGroup(); + group.add(hexButton); + group.add(decimalButton); + radioPanel.add(hexButton); + radioPanel.add(decimalButton); + hexButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setRadix(16); } }); - decimalButton.addActionListener(new ActionListener() { + decimalButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setRadix(10); } }); - - addWorkPanel(mainPanel); - setHelpLocation(new HelpLocation("DisassemblerPlugin","ProcessorOptions")); - setRememberSize( false ); - } - - - protected void setRadix(int radix) { - for (FixedBitSizeValueField field : fields) { + addWorkPanel(mainPanel); + setHelpLocation(new HelpLocation("DisassemblerPlugin", "ProcessorOptions")); + setRememberSize(false); + + } + + protected void setRadix(int radix) { + for (FixedBitSizeValueField field : fields) { field.setFormat(radix, false); } } - private RegisterValue setRegisterValue(RegisterValue registerValue, Register register, BigInteger value) { + private RegisterValue setRegisterValue(RegisterValue registerValue, Register register, + BigInteger value) { RegisterValue newValue = new RegisterValue(register, value); return registerValue.combineValues(newValue); } - /** - * The callback method for when the "OK" button is pressed. - */ - @Override - public void okCallback() { - RegisterValue newValue = new RegisterValue(programContext.getBaseContextRegister()); - for (int i = 0; i < fields.length; i++) { - BigInteger value = fields[i].getValue(); - if (value != null) { - newValue = setRegisterValue(newValue, registerList.get(i), value); - } + * The callback method for when the "OK" button is pressed. + */ + @Override + public void okCallback() { + RegisterValue newValue = new RegisterValue(programContext.getBaseContextRegister()); + for (int i = 0; i < fields.length; i++) { + BigInteger value = fields[i].getValue(); + if (value != null) { + newValue = setRegisterValue(newValue, registerList.get(i), value); + } } - programContext.setDefaultDisassemblyContext(newValue); - close(); - } - + programContext.setDefaultDisassemblyContext(newValue); + close(); + } + public void dispose() { close(); } } - diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/SetFlowOverrideDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/SetFlowOverrideDialog.java index 0d92489d82..da2389924d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/SetFlowOverrideDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/disassembler/SetFlowOverrideDialog.java @@ -18,6 +18,7 @@ package ghidra.app.plugin.core.disassembler; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.combobox.GhidraComboBox; import ghidra.app.cmd.disassemble.SetFlowOverrideCmd; import ghidra.framework.plugintool.PluginTool; @@ -96,8 +97,8 @@ class SetFlowOverrideDialog extends DialogComponentProvider { FlowType flowType = instruction.getFlowType(); - panel.add(new JLabel("Current Flow: " + flowType.getName() + - (flowType.isConditional() ? "*" : ""))); + panel.add(DockingUtils.createNonHtmlLabel( + "Current Flow: " + flowType.getName() + (flowType.isConditional() ? "*" : ""))); panel.add(Box.createGlue()); panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); @@ -110,7 +111,7 @@ class SetFlowOverrideDialog extends DialogComponentProvider { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS)); - panel.add(new JLabel(note)); + panel.add(DockingUtils.createNonHtmlLabel(note)); panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); @@ -139,7 +140,7 @@ class SetFlowOverrideDialog extends DialogComponentProvider { flowOverrideComboBox.setSelectedItem(flowOverride); } - panel.add(new JLabel("Instruction Flow:")); + panel.add(DockingUtils.createNonHtmlLabel("Instruction Flow:")); panel.add(flowOverrideComboBox); panel.add(Box.createGlue()); @@ -191,8 +192,8 @@ class SetFlowOverrideDialog extends DialogComponentProvider { return true; } else { - tool.executeBackgroundCommand( - new SetFlowOverrideCmd(instruction.getMinAddress(), flow), program); + tool.executeBackgroundCommand(new SetFlowOverrideCmd(instruction.getMinAddress(), flow), + program); } return true; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquateTableProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquateTableProvider.java index d4dbc60ba3..dcff539f36 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquateTableProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/equate/EquateTableProvider.java @@ -24,6 +24,7 @@ import javax.swing.*; import javax.swing.table.*; import docking.ActionContext; +import docking.DockingUtils; import docking.action.*; import docking.widgets.OptionDialog; import ghidra.app.context.ProgramActionContext; @@ -218,7 +219,8 @@ public class EquateTableProvider extends ComponentProviderAdapter { setEquateTableRenderer(); JPanel equatesPanel = new JPanel(new BorderLayout()); - equatesPanel.add(new JLabel("Equates", SwingConstants.CENTER), BorderLayout.NORTH); + equatesPanel.add(DockingUtils.createNonHtmlLabel("Equates", SwingConstants.CENTER), + BorderLayout.NORTH); equatesPanel.add(equatesTablePane, BorderLayout.CENTER); equatesPanel.add(equatesFilterPanel, BorderLayout.SOUTH); @@ -245,7 +247,8 @@ public class EquateTableProvider extends ComponentProviderAdapter { setReferenceTableRenderer(); JPanel referencesPanel = new JPanel(new BorderLayout()); - referencesPanel.add(new JLabel("References", SwingConstants.CENTER), "North"); + referencesPanel.add(DockingUtils.createNonHtmlLabel("References", SwingConstants.CENTER), + "North"); referencesPanel.add(referencesTablePane, "Center"); ////////////////////////////////////////////////////////////// diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/exporter/ExporterDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/exporter/ExporterDialog.java index 16f638880f..659a4616c6 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/exporter/ExporterDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/exporter/ExporterDialog.java @@ -27,6 +27,7 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.options.editor.ButtonPanelFactory; import docking.widgets.OptionDialog; import docking.widgets.combobox.GhidraComboBox; @@ -183,16 +184,16 @@ public class ExporterDialog extends DialogComponentProvider implements AddressFa private Component buildMainPanel() { JPanel panel = new JPanel(new PairLayout(5, 5)); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - panel.add(new JLabel("Format: ", SwingConstants.RIGHT)); + panel.add(DockingUtils.createNonHtmlLabel("Format: ", SwingConstants.RIGHT)); panel.add(buildFormatChooser()); - panel.add(new JLabel("Output File: ", SwingConstants.RIGHT)); + panel.add(DockingUtils.createNonHtmlLabel("Output File: ", SwingConstants.RIGHT)); panel.add(buildFilePanel()); return panel; } private Component buildSelectionCheckboxPanel() { JPanel panel = new JPanel(new PairLayout(5, 5)); - selectionOnlyLabel = new JLabel("Selection Only:"); + selectionOnlyLabel = DockingUtils.createNonHtmlLabel("Selection Only:"); panel.add(selectionOnlyLabel); panel.add(buildSelectionCheckbox()); return panel; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/fallthrough/FallThroughDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/fallthrough/FallThroughDialog.java index f54fa755f0..99b9f65b2e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/fallthrough/FallThroughDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/fallthrough/FallThroughDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +15,6 @@ */ package ghidra.app.plugin.core.fallthrough; -import ghidra.app.util.AddressInput; -import ghidra.program.model.address.Address; -import ghidra.util.HelpLocation; - import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -30,9 +25,13 @@ import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import resources.ResourceManager; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.ToolTipManager; +import ghidra.app.util.AddressInput; +import ghidra.program.model.address.Address; +import ghidra.util.HelpLocation; +import resources.ResourceManager; /** * Dialog to prompt for overriding a fallthrough address on an @@ -48,11 +47,11 @@ class FallThroughDialog extends DialogComponentProvider implements ChangeListene private JButton homeButton; private FallThroughPlugin plugin; private FallThroughModel model; - private AddressInput addrField; + private AddressInput addrField; private JRadioButton defaultRB; - private JRadioButton userRB; + private JRadioButton userRB; private boolean changing; - + FallThroughDialog(FallThroughPlugin plugin, FallThroughModel model) { super("Set Fallthrough Address", true); setHelpLocation(new HelpLocation(plugin.getName(), "Set Fallthrough")); @@ -65,11 +64,12 @@ class FallThroughDialog extends DialogComponentProvider implements ChangeListene updateState(); model.setChangeListener(this); } + /** * @see ghidra.util.bean.GhidraDialog#applyCallback() */ @Override - protected void applyCallback() { + protected void applyCallback() { model.execute(); } @@ -77,14 +77,15 @@ class FallThroughDialog extends DialogComponentProvider implements ChangeListene * @see ghidra.util.bean.GhidraDialog#cancelCallback() */ @Override - protected void cancelCallback() { + protected void cancelCallback() { close(); } + /** * @see ghidra.util.bean.GhidraDialog#okCallback() */ @Override - protected void okCallback() { + protected void okCallback() { if (model.execute()) { cancelCallback(); } @@ -99,18 +100,18 @@ class FallThroughDialog extends DialogComponentProvider implements ChangeListene cancelCallback(); return; } - + changing = true; addressLabel.setText(addr.toString()); instLabel.setText(model.getInstructionRepresentation()); - + if (model.isDefaultFallthrough()) { defaultRB.setSelected(true); } else if (model.isUserDefinedFallthrough()) { userRB.setSelected(true); } - + Address ftAddr = model.getCurrentFallthrough(); if (ftAddr != null) { if (!ftAddr.equals(addrField.getAddress())) { @@ -122,7 +123,7 @@ class FallThroughDialog extends DialogComponentProvider implements ChangeListene } boolean enabled = model.allowAddressEdits(); addrField.setEnabled(enabled); - + changing = false; if (model.isValidInput()) { setOkEnabled(true); @@ -133,12 +134,14 @@ class FallThroughDialog extends DialogComponentProvider implements ChangeListene setStatusText(msg); } } + private void addressChanged() { if (changing) { return; } Runnable r = new Runnable() { + @Override public void run() { Address addr = addrField.getAddress(); if (addr != null || addrField.getValue().length() == 0) { @@ -153,20 +156,22 @@ class FallThroughDialog extends DialogComponentProvider implements ChangeListene }; SwingUtilities.invokeLater(r); } - + private JPanel create() { JPanel panel = new JPanel(new BorderLayout(0, 10)); - panel.setBorder(BorderFactory.createEmptyBorder(5,0,0,0)); + panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); addrField = new AddressInput(); addrField.setAddressFactory(model.getProgram().getAddressFactory()); addrField.addChangeListener(new ChangeListener() { + @Override public void stateChanged(ChangeEvent e) { addressChanged(); } }); addrField.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { - model.setCurrentFallthrough(addrField.getAddress()); + model.setCurrentFallthrough(addrField.getAddress()); } }); panel.add(createHomePanel(), BorderLayout.NORTH); @@ -180,92 +185,98 @@ class FallThroughDialog extends DialogComponentProvider implements ChangeListene panel.add(addrField, BorderLayout.NORTH); panel.add(createRadioButtonPanel(), BorderLayout.CENTER); - return panel; - } + return panel; + } private JPanel createHomePanel() { JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(new TitledBorder("Home")); - - addressLabel = new JLabel("01001000"); - - Font font = addressLabel.getFont(); - Font monoFont = new Font("monospaced", font.getStyle(), - font.getSize()); - addressLabel.setFont(monoFont); - - instLabel = new JLabel("jmp DAT_01001000"); - instLabel.setFont(monoFont); - - homeButton = createButton("images/go-home.png", "Home"); + + addressLabel = DockingUtils.createNonHtmlLabel("01001000"); + + Font font = addressLabel.getFont(); + Font monoFont = new Font("monospaced", font.getStyle(), font.getSize()); + addressLabel.setFont(monoFont); + + instLabel = DockingUtils.createNonHtmlLabel("jmp DAT_01001000"); + instLabel.setFont(monoFont); + + homeButton = createButton("images/go-home.png", "Home"); homeButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { plugin.goTo(model.getAddress()); } }); - - JPanel innerPanel = new JPanel(); - BoxLayout bl = new BoxLayout(innerPanel,BoxLayout.X_AXIS); - innerPanel.setLayout(bl); - - innerPanel.add(Box.createHorizontalStrut(5)); - innerPanel.add(homeButton); - innerPanel.add(Box.createHorizontalStrut(10)); - innerPanel.add(addressLabel); - innerPanel.add(Box.createHorizontalStrut(20)); - innerPanel.add(instLabel); - innerPanel.add(Box.createHorizontalStrut(10)); - panel.add(innerPanel, BorderLayout.CENTER); - return panel; + + JPanel innerPanel = new JPanel(); + BoxLayout bl = new BoxLayout(innerPanel, BoxLayout.X_AXIS); + innerPanel.setLayout(bl); + + innerPanel.add(Box.createHorizontalStrut(5)); + innerPanel.add(homeButton); + innerPanel.add(Box.createHorizontalStrut(10)); + innerPanel.add(addressLabel); + innerPanel.add(Box.createHorizontalStrut(20)); + innerPanel.add(instLabel); + innerPanel.add(Box.createHorizontalStrut(10)); + panel.add(innerPanel, BorderLayout.CENTER); + return panel; } + private JPanel createRadioButtonPanel() { - + JPanel panel = new JPanel(); BoxLayout bl = new BoxLayout(panel, BoxLayout.X_AXIS); panel.setLayout(bl); - + ButtonGroup group = new ButtonGroup(); defaultRB = new JRadioButton("Default", true); defaultRB.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent ev) { model.defaultSelected(); } }); ToolTipManager.setToolTipText(defaultRB, "Use default fallthrough address"); - + userRB = new JRadioButton("User", false); userRB.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent ev) { model.userSelected(); } }); ToolTipManager.setToolTipText(userRB, "Override default fallthrough address"); - + group.add(defaultRB); group.add(userRB); - + panel.add(defaultRB); panel.add(userRB); - + JPanel outerPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); outerPanel.add(panel); return outerPanel; - } - private JButton createButton(String filename, String altText) { - JButton button = new JButton(); - URL imageURL = ResourceManager.getResource(filename); - if (imageURL != null) { - ImageIcon icon = new ImageIcon(imageURL); - button = new JButton(icon); - Insets noInsets = new Insets(0,0,0,0); - button.setMargin(noInsets); - } - else { - button = new JButton(altText); - } + } + + private JButton createButton(String filename, String altText) { + JButton button = new JButton(); + URL imageURL = ResourceManager.getResource(filename); + if (imageURL != null) { + ImageIcon icon = new ImageIcon(imageURL); + button = new JButton(icon); + Insets noInsets = new Insets(0, 0, 0, 0); + button.setMargin(noInsets); + } + else { + button = new JButton(altText); + } ToolTipManager.setToolTipText(button, "Go back to home address"); - return button; - } + return button; + } + + @Override public void stateChanged(ChangeEvent e) { updateState(); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/flowarrow/FlowArrow.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/flowarrow/FlowArrow.java index 6bd6749997..0ce903adf1 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/flowarrow/FlowArrow.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/flowarrow/FlowArrow.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +15,17 @@ */ package ghidra.app.plugin.core.flowarrow; -import ghidra.program.model.address.*; -import ghidra.program.model.symbol.RefType; -import ghidra.util.exception.AssertException; - import java.awt.*; import java.awt.geom.PathIterator; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.List; +import ghidra.program.model.address.*; +import ghidra.program.model.symbol.RefType; +import ghidra.util.HTMLUtilities; +import ghidra.util.exception.AssertException; + abstract class FlowArrow { private static final int MIN_LINE_SPACING = 9; @@ -50,7 +50,7 @@ abstract class FlowArrow { protected Shape arrowHead; /** The shape of the arrow body, but with added size */ - private List clickableShapes = new ArrayList(); + private List clickableShapes = new ArrayList<>(); FlowArrow(FlowArrowPlugin plugin, Component canvas, Address start, Address end, RefType referenceType) { @@ -153,7 +153,7 @@ abstract class FlowArrow { } private void createClickableShapes() { - List shapes = new ArrayList(); + List shapes = new ArrayList<>(); Rectangle r = null; PathIterator it = arrowBody.getPathIterator(null); float[] coords = new float[6]; @@ -242,13 +242,11 @@ abstract class FlowArrow { int displayWidth = canvas.getWidth();// - FlowArrowPlugin.LEFT_OFFSET; int lineWidth = calculateLineWidth(displayWidth); - arrowBody = - FlowArrowShapeFactory.createArrowBody(plugin, this, displayWidth, displayHeight, - lineWidth); + arrowBody = FlowArrowShapeFactory.createArrowBody(plugin, this, displayWidth, displayHeight, + lineWidth); - arrowHead = - FlowArrowShapeFactory.createArrowHead(plugin, this, displayWidth, displayHeight, - lineWidth); + arrowHead = FlowArrowShapeFactory.createArrowHead(plugin, this, displayWidth, displayHeight, + lineWidth); } private int calculateLineWidth(int displayWidth) { @@ -323,8 +321,10 @@ abstract class FlowArrow { } public String getDisplayString() { - return "
    start" + start + "
    end" + end + - "
    ref type" + refType + "
    "; + return "
    start" + + HTMLUtilities.friendlyEncodeHTML(start.toString()) + "
    end" + + HTMLUtilities.friendlyEncodeHTML(end.toString()) + "
    ref type" + + refType + "
    "; } @Override diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/EditFunctionSignatureDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/EditFunctionSignatureDialog.java index 89637a0711..984cfad724 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/EditFunctionSignatureDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/EditFunctionSignatureDialog.java @@ -22,6 +22,7 @@ import java.util.List; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.combobox.GhidraComboBox; import ghidra.app.cmd.function.ApplyFunctionSignatureCmd; import ghidra.app.services.DataTypeManagerService; @@ -127,7 +128,7 @@ public class EditFunctionSignatureDialog extends DialogComponentProvider { String signature = function.getPrototypeString(false, false); signatureField = new JTextField(signature.length()); // add some extra room to edit signatureField.setText(signature); - signatureLabel = new JLabel("Signature:"); + signatureLabel = DockingUtils.createNonHtmlLabel("Signature:"); signaturePanel.add(signatureLabel); signaturePanel.add(signatureField); @@ -164,7 +165,7 @@ public class EditFunctionSignatureDialog extends DialogComponentProvider { function.getProgram().getFunctionManager().getCallingConventionNames(); String[] choices = callingConventions.toArray(new String[callingConventions.size()]); setCallingConventionChoices(choices); - parentPanel.add(new JLabel("Calling Convention:")); + parentPanel.add(DockingUtils.createNonHtmlLabel("Calling Convention:")); parentPanel.add(callingConventionComboBox); } @@ -214,7 +215,7 @@ public class EditFunctionSignatureDialog extends DialogComponentProvider { callFixupComboBox.setSelectedItem(callFixupName); } - callFixupPanel.add(new JLabel("Call-Fixup:")); + callFixupPanel.add(DockingUtils.createNonHtmlLabel("Call-Fixup:")); callFixupPanel.add(callFixupComboBox); callFixupPanel.add(Box.createGlue()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/FunctionPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/FunctionPlugin.java index 0275014256..20ce5b113f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/FunctionPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/FunctionPlugin.java @@ -389,7 +389,7 @@ public class FunctionPlugin extends Plugin implements DataService { return program.getFunctionManager().getFunctionsOverlapping(new AddressSet(loc, loc)); } //return an empty iterator.... - return new Iterator() { + return new Iterator<>() { @Override public void remove() { // not supported @@ -580,8 +580,8 @@ public class FunctionPlugin extends Plugin implements DataService { catch (VariableSizeException e) { tool.setStatusInfo(e.getMessage()); if (e.canForce() && promptForConflictRemoval) { - String msg = variable.getName() + " size change resulted in \n" + e.getMessage() + - "\n \nDelete conflicting " + varType + "(s)"; + String msg = varType + " " + variable.getName() + " size change resulted in \n" + + e.getMessage() + "\n \nDelete conflicting " + varType + "(s)"; if (OptionDialog.YES_OPTION == OptionDialog.showYesNoDialog(tool.getActiveWindow(), varType + " Conflict", msg)) { tool.setStatusInfo(""); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/ThunkReferenceAddressDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/ThunkReferenceAddressDialog.java index 15e8c09e0f..715149ee30 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/ThunkReferenceAddressDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/ThunkReferenceAddressDialog.java @@ -21,6 +21,7 @@ import java.util.List; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import ghidra.app.util.*; import ghidra.framework.plugintool.PluginTool; import ghidra.program.model.address.Address; @@ -357,7 +358,7 @@ public class ThunkReferenceAddressDialog extends DialogComponentProvider { JPanel mainPanel = new JPanel(new PairLayout(5, 5)); refFunctionField = new JTextField(20); - mainPanel.add(new JLabel("Destination Function/Address:")); + mainPanel.add(DockingUtils.createNonHtmlLabel("Destination Function/Address:")); mainPanel.add(refFunctionField); mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/FunctionEditorDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/FunctionEditorDialog.java index 7579120472..d019639feb 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/FunctionEditorDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/FunctionEditorDialog.java @@ -290,9 +290,9 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod panel.setBorder(BorderFactory.createEmptyBorder(0, 5, 15, 15)); JPanel leftPanel = new JPanel(new PairLayout(4, 8)); - leftPanel.add(new JLabel("Function Name:")); + leftPanel.add(DockingUtils.createNonHtmlLabel("Function Name:")); leftPanel.add(createNameField()); - leftPanel.add(new JLabel("Calling Convention")); + leftPanel.add(DockingUtils.createNonHtmlLabel("Calling Convention")); leftPanel.add(createCallingConventionCombo()); leftPanel.setBorder(BorderFactory.createEmptyBorder(14, 0, 0, 10)); @@ -601,7 +601,8 @@ public class FunctionEditorDialog extends DialogComponentProvider implements Mod color = Color.red; } String toolTipText = ToolTipUtils.getToolTipText(dataType); - String headerText = "" + dataType.getPathName() + "
    "; + String headerText = "" + + HTMLUtilities.friendlyEncodeHTML(dataType.getPathName()) + "
    "; toolTipText = toolTipText.replace("", headerText); setToolTipText(toolTipText); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/ParameterDataTypeCellEditor.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/ParameterDataTypeCellEditor.java index 2ad56f5eef..e82d6c94d0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/ParameterDataTypeCellEditor.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/ParameterDataTypeCellEditor.java @@ -20,7 +20,6 @@ import java.awt.event.*; import java.util.EventObject; import javax.swing.*; -import javax.swing.border.BevelBorder; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.TableCellEditor; @@ -35,7 +34,6 @@ import ghidra.util.data.DataTypeParser; class ParameterDataTypeCellEditor extends AbstractCellEditor implements TableCellEditor { private DataTypeSelectionEditor editor; - private JLabel label = new JLabel(); private DropDownSelectionTextField textField; private JButton dataTypeChooserButton; private DataType dt; @@ -44,8 +42,7 @@ class ParameterDataTypeCellEditor extends AbstractCellEditor implements TableCel private DataTypeManagerService service; private DialogComponentProvider dialog; - ParameterDataTypeCellEditor(DialogComponentProvider dialog, - DataTypeManagerService service) { + ParameterDataTypeCellEditor(DialogComponentProvider dialog, DataTypeManagerService service) { this.dialog = dialog; this.service = service; @@ -54,11 +51,6 @@ class ParameterDataTypeCellEditor extends AbstractCellEditor implements TableCel @Override public Component getTableCellEditorComponent(JTable table1, Object value, boolean isSelected, int row, int column) { - if (label == null) { - label = new JLabel(); - label.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - } - init(); dt = (DataType) value; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java index fd7f6d43bb..44e51504ee 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/StorageAddressEditorDialog.java @@ -25,6 +25,7 @@ import javax.swing.event.*; import javax.swing.table.TableCellEditor; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.DropDownSelectionTextField; import docking.widgets.table.GTable; import ghidra.app.services.DataTypeManagerService; @@ -37,8 +38,8 @@ import ghidra.util.Msg; import ghidra.util.layout.PairLayout; import ghidra.util.layout.VerticalLayout; -public class StorageAddressEditorDialog extends DialogComponentProvider implements - ModelChangeListener { +public class StorageAddressEditorDialog extends DialogComponentProvider + implements ModelChangeListener { private FunctionVariableData variableData; private StorageAddressModel model; private VarnodeTableModel varnodeTableModel; @@ -160,10 +161,9 @@ public class StorageAddressEditorDialog extends DialogComponentProvider implemen JPanel panel = new JPanel(new PairLayout(10, 4)); panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); - panel.add(new JLabel("Datatype: ")); + panel.add(DockingUtils.createNonHtmlLabel("Datatype: ")); - dataTypeEditor = - new ParameterDataTypeCellEditor(this, service); + dataTypeEditor = new ParameterDataTypeCellEditor(this, service); dataTypeEditor.addCellEditorListener(new CellEditorListener() { @@ -211,11 +211,11 @@ public class StorageAddressEditorDialog extends DialogComponentProvider implemen }); panel.add(dataTypeEditComponent); - panel.add(new JLabel("Datatype Size: ")); - sizeLabel = new JLabel("" + size); + panel.add(DockingUtils.createNonHtmlLabel("Datatype Size: ")); + sizeLabel = DockingUtils.createNonHtmlLabel("" + size); panel.add(sizeLabel); - panel.add(new JLabel("Allocated Size:")); - currentSizeLabel = new JLabel(""); + panel.add(DockingUtils.createNonHtmlLabel("Allocated Size:")); + currentSizeLabel = DockingUtils.createNonHtmlLabel(""); panel.add(currentSizeLabel); setFocusComponent(textField); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagList.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagList.java index 3cc3cbe347..68e941692b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagList.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagList.java @@ -21,7 +21,9 @@ import java.awt.event.MouseEvent; import javax.swing.*; +import docking.widgets.list.GListCellRenderer; import ghidra.program.model.listing.FunctionTag; +import ghidra.util.HTMLUtilities; /** * Simple list for displaying {@link FunctionTag} items. The only part of the tag @@ -48,7 +50,7 @@ public class FunctionTagList extends JList { return ""; } - return tag.getComment(); + return "" + HTMLUtilities.friendlyEncodeHTML(tag.getComment()); } return ""; @@ -62,25 +64,29 @@ public class FunctionTagList extends JList { */ @Override public ListCellRenderer getCellRenderer() { - return new DefaultListCellRenderer() { + return new GListCellRenderer<>() { @Override - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - FunctionTag tag = (FunctionTag) value; - Component listCellRendererComponent = super.getListCellRendererComponent(list, - tag.getName(), index, isSelected, cellHasFocus); + protected String getItemText(FunctionTag value) { + return value.getName(); + } + + @Override + public Component getListCellRendererComponent(JList list, + FunctionTag value, int index, boolean isSelected, boolean cellHasFocus) { + + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); // If this tag is a temporary one (ie: read-in from a file), then it is // read-only and should be indicated to the user as a different color. if (value instanceof FunctionTagTemp) { if (cellHasFocus) { - listCellRendererComponent.setForeground(Color.white); + setForeground(Color.white); } else { - listCellRendererComponent.setForeground(Color.blue); + setForeground(Color.blue); } } - return listCellRendererComponent; + return this; } }; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagsComponentProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagsComponentProvider.java index c0b0d7585e..9fd8730474 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagsComponentProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/FunctionTagsComponentProvider.java @@ -23,6 +23,7 @@ import java.util.List; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.textfield.HintTextField; import ghidra.app.cmd.function.CreateFunctionTagCmd; import ghidra.app.context.ProgramActionContext; @@ -376,7 +377,7 @@ public class FunctionTagsComponentProvider extends ComponentProviderAdapter */ private JPanel createFilterPanel() { filterPanel = new JPanel(new BorderLayout()); - JLabel label = new JLabel(" Filter:"); + JLabel label = DockingUtils.createNonHtmlLabel(" Filter:"); filterInputTF = new HintTextField(""); filterInputTF.setName("filterInputTF"); @@ -411,7 +412,7 @@ public class FunctionTagsComponentProvider extends ComponentProviderAdapter private JPanel createInputPanel() { inputPanel = new JPanel(new BorderLayout()); - JLabel label = new JLabel(" Create new tag(s):"); + JLabel label = DockingUtils.createNonHtmlLabel(" Create new tag(s):"); tagInputTF = new HintTextField("tag 1, tag 2, ..."); tagInputTF.setName("tagInputTF"); tagInputTF.addActionListener(e -> processCreates()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/TagListPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/TagListPanel.java index 4490647e61..1819107cec 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/TagListPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/tags/TagListPanel.java @@ -22,6 +22,7 @@ import java.util.*; import javax.swing.*; +import docking.DockingUtils; import docking.DockingWindowManager; import docking.widgets.OptionDialog; import docking.widgets.dialogs.InputDialog; @@ -64,8 +65,7 @@ public abstract class TagListPanel extends JPanel { * @param tool the plugin tool * @param title the title of the panel */ - public TagListPanel(FunctionTagsComponentProvider provider, PluginTool tool, - String title) { + public TagListPanel(FunctionTagsComponentProvider provider, PluginTool tool, String title) { this.tool = tool; setLayout(new BorderLayout()); @@ -97,18 +97,18 @@ public abstract class TagListPanel extends JPanel { // If the tag is a temporary one, it's not editable. Show a message to the user. if (tag instanceof FunctionTagTemp) { - Msg.showWarn(list, list, "Tag Not Editable", - "Tag " + "\"" + tag.getName() + "\"" + - " was loaded from an external source and cannot be edited or deleted"); + Msg.showWarn(list, list, "Tag Not Editable", "Tag " + "\"" + tag.getName() + + "\"" + + " was loaded from an external source and cannot be edited or deleted"); return; } String[] labels = new String[] { "Name:", "Comment:" }; String[] init = new String[] { tag.getName(), tag.getComment() }; - + InputDialog dialog = new InputDialog("Edit Tag", labels, init, true, d -> { String[] results = d.getValues(); - + if (results == null || results.length != 2) { Msg.error(this, "Error retrieving data from edit dialog"); // shouldn't happen return false; @@ -139,10 +139,10 @@ public abstract class TagListPanel extends JPanel { } return true; }); - + dialog.setPreferredSize(400, 150); DockingWindowManager.showDialog(list, dialog); - + if (dialog.isCanceled()) { return; } @@ -150,7 +150,7 @@ public abstract class TagListPanel extends JPanel { } }); - JLabel label = new JLabel(title); + JLabel label = DockingUtils.createNonHtmlLabel(title); add(label, BorderLayout.NORTH); add(list, BorderLayout.CENTER); @@ -245,8 +245,8 @@ public abstract class TagListPanel extends JPanel { // Show a confirmation message - users may not be aware that deleting a tag is more // than just removing it from a function. int option = OptionDialog.showOptionDialog(this, "Function Tag Delete", - "Are you sure? \nThis will delete the tag from all functions in the program.", - "OK", OptionDialog.WARNING_MESSAGE); + "Are you sure? \nThis will delete the tag from all functions in the program.", "OK", + OptionDialog.WARNING_MESSAGE); switch (option) { case OptionDialog.OPTION_ONE: diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/FunctionChoiceComparisonPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/FunctionChoiceComparisonPanel.java index 98dbd8297d..2f285539d3 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/FunctionChoiceComparisonPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/FunctionChoiceComparisonPanel.java @@ -21,8 +21,7 @@ import java.util.*; import javax.swing.*; -import docking.ActionContext; -import docking.ComponentProvider; +import docking.*; import docking.action.*; import docking.help.Help; import docking.help.HelpService; @@ -161,6 +160,7 @@ public abstract class FunctionChoiceComparisonPanel extends FunctionComparisonPa private Component createLeftChoicePanel() { JPanel panel = new JPanel(new BorderLayout()); leftComboBox = new JComboBox<>(leftWrappedFunctions); + DockingUtils.turnOffHTMLRendering(leftComboBox); adjustSelectedLeftFunction(); leftComboBox.addItemListener(e -> { WrappedFunction wrappedFunction = (WrappedFunction) leftComboBox.getSelectedItem(); @@ -174,6 +174,7 @@ public abstract class FunctionChoiceComparisonPanel extends FunctionComparisonPa private Component createRightChoicePanel() { JPanel panel = new JPanel(new BorderLayout()); rightComboBox = new JComboBox<>(rightWrappedFunctions); + DockingUtils.turnOffHTMLRendering(rightComboBox); adjustSelectedRightFunction(); rightComboBox.addItemListener(e -> { WrappedFunction wrappedFunction = (WrappedFunction) rightComboBox.getSelectedItem(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/MessagePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/MessagePanel.java index f71d776767..a98fb3214d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/MessagePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/instructionsearch/ui/MessagePanel.java @@ -21,6 +21,8 @@ import java.awt.FlowLayout; import javax.swing.JLabel; import javax.swing.JPanel; +import docking.DockingUtils; + /** * Simple panel containing a JLabel for displaying error messages. * @@ -35,14 +37,14 @@ public class MessagePanel extends JPanel { */ public MessagePanel() { setLayout(new FlowLayout(FlowLayout.CENTER)); - msgLabel = new JLabel(NO_STATUS); + msgLabel = DockingUtils.createNonHtmlLabel(NO_STATUS); add(msgLabel); } /** * Sets the text to be displayed. * - * @param text the new text + * @param text the new non-html text * @param foregroundColor the text color */ public void setMessageText(String text, Color foregroundColor) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/OperandLabelDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/OperandLabelDialog.java index 6b78a162a6..5db644c631 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/OperandLabelDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/OperandLabelDialog.java @@ -18,6 +18,7 @@ package ghidra.app.plugin.core.label; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.combobox.GhidraComboBox; import ghidra.app.cmd.label.AddLabelCmd; import ghidra.app.cmd.refs.AssociateSymbolCmd; @@ -59,7 +60,7 @@ public class OperandLabelDialog extends DialogComponentProvider { JPanel mainPanel = new JPanel(new PairLayout(5, 5)); mainPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - label = new JLabel("Label: "); + label = DockingUtils.createNonHtmlLabel("Label: "); myChoice = new GhidraComboBox<>(); myChoice.setName("MYCHOICE"); 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 a3c9af3696..3d8f852cab 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 @@ -22,6 +22,7 @@ import javax.swing.*; import javax.swing.event.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.combobox.GhidraComboBox; import ghidra.app.plugin.core.misc.RegisterField; import ghidra.app.util.*; @@ -144,31 +145,31 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { lengthField.setChangeListener(e -> lengthChanged()); addrField.addChangeListener(ev -> addrChanged()); - JLabel readLabel = new JLabel("Read"); + JLabel readLabel = DockingUtils.createNonHtmlLabel("Read"); readCB = new JCheckBox(); readCB.setName("Read"); - JLabel writeLabel = new JLabel("Write"); + JLabel writeLabel = DockingUtils.createNonHtmlLabel("Write"); writeCB = new JCheckBox(); writeCB.setName("Write"); - JLabel executeLabel = new JLabel("Execute"); + JLabel executeLabel = DockingUtils.createNonHtmlLabel("Execute"); executeCB = new JCheckBox(); executeCB.setName("Execute"); - JLabel volatileLabel = new JLabel("Volatile"); + JLabel volatileLabel = DockingUtils.createNonHtmlLabel("Volatile"); volatileCB = new JCheckBox(); volatileCB.setName("Volatile"); JPanel topPanel = new JPanel(new PairLayout(4, 10, 150)); topPanel.setBorder(BorderFactory.createEmptyBorder(5, 7, 4, 5)); - topPanel.add(new JLabel("Block Name:", SwingConstants.RIGHT)); + topPanel.add(DockingUtils.createNonHtmlLabel("Block Name:", SwingConstants.RIGHT)); topPanel.add(nameField); - topPanel.add(new JLabel("Start Addr:", SwingConstants.RIGHT)); + topPanel.add(DockingUtils.createNonHtmlLabel("Start Addr:", SwingConstants.RIGHT)); topPanel.add(addrField); - topPanel.add(new JLabel("Length:", SwingConstants.RIGHT)); + topPanel.add(DockingUtils.createNonHtmlLabel("Length:", SwingConstants.RIGHT)); topPanel.add(lengthField); - topPanel.add(new JLabel("Comment:", SwingConstants.RIGHT)); + topPanel.add(DockingUtils.createNonHtmlLabel("Comment:", SwingConstants.RIGHT)); topPanel.add(commentField); JPanel execPanel = new JPanel(); @@ -234,7 +235,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { nameField.setText(""); addrField.setAddress(model.getStartAddress()); - lengthField.setValue(new Long(0)); + lengthField.setValue(Long.valueOf(0)); model.setLength(0); commentField.setText(""); @@ -243,7 +244,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { executeCB.setSelected(false); volatileCB.setSelected(false); - initialValueField.setValue(new Long(0)); + initialValueField.setValue(Long.valueOf(0)); model.setBlockType(MemoryBlockType.DEFAULT); model.setIsInitialized(initializedRB.isSelected()); model.setInitialValue(0); @@ -411,7 +412,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { } private void createInitializedPanel() { - initialValueLabel = new JLabel("Initial Value"); + initialValueLabel = DockingUtils.createNonHtmlLabel("Initial Value"); initialValueField = new RegisterField(8, null, false); initialValueField.setName("Initial Value"); initialValueField.setEnabled(false); @@ -427,7 +428,7 @@ class AddBlockDialog extends DialogComponentProvider implements ChangeListener { private JPanel createAddressPanel() { JPanel addressPanel = new JPanel(new PairLayout()); - JLabel addrToAddLabel = new JLabel("Source Addr:"); + JLabel addrToAddLabel = DockingUtils.createNonHtmlLabel("Source Addr:"); baseAddrField = new AddressInput(); baseAddrField.setAddressFactory(addrFactory); baseAddrField.setName("Source Addr"); 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 6db3324ce4..c6814a55ea 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 @@ -24,8 +24,7 @@ import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import docking.ComponentProvider; -import docking.DialogComponentProvider; +import docking.*; import ghidra.app.plugin.core.misc.RegisterField; import ghidra.app.util.*; import ghidra.framework.plugintool.PluginTool; @@ -42,10 +41,10 @@ import ghidra.util.layout.PairLayout; * */ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListener { - + final static int EXPAND_UP = 0; final static int EXPAND_DOWN = 1; - + private final static String EXPAND_UP_TITLE = "Expand Block Up"; private final static String EXPAND_DOWN_TITLE = "Expand Block Down"; private int dialogType; @@ -58,6 +57,7 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene private ExpandBlockModel model; private boolean isChanging; private PluginTool tool; + /** * Constructor * @param parent @@ -65,15 +65,14 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene * @param af * @param dialogType */ - ExpandBlockDialog(PluginTool tool, ExpandBlockModel model, MemoryBlock block, - AddressFactory af, int dialogType) { - super(dialogType == EXPAND_UP? EXPAND_UP_TITLE : EXPAND_DOWN_TITLE, - true); + ExpandBlockDialog(PluginTool tool, ExpandBlockModel model, MemoryBlock block, AddressFactory af, + int dialogType) { + super(dialogType == EXPAND_UP ? EXPAND_UP_TITLE : EXPAND_DOWN_TITLE, true); this.tool = tool; this.model = model; this.dialogType = dialogType; setHelpLocation(new HelpLocation(HelpTopics.MEMORY_MAP, - dialogType == EXPAND_UP? EXPAND_UP_TITLE : EXPAND_DOWN_TITLE)); + dialogType == EXPAND_UP ? EXPAND_UP_TITLE : EXPAND_DOWN_TITLE)); addrFactory = af; model.setChangeListener(this); addWorkPanel(create(block)); @@ -88,9 +87,10 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene * @see ghidra.util.bean.GhidraDialog#okCallback() */ @Override - protected void okCallback() { - + protected void okCallback() { + Runnable doExpand = new Runnable() { + @Override public void run() { if (model.execute()) { close(); @@ -102,18 +102,18 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene rootPanel.setCursor(Cursor.getDefaultCursor()); } }; - + rootPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); SwingUtilities.invokeLater(doExpand); } - + /** * Create the main work panel. * @return JPanel */ private JPanel create(MemoryBlock block) { - JPanel panel = new JPanel(new PairLayout(5,5, 150)); - startAddressInput = new AddressInput(); + JPanel panel = new JPanel(new PairLayout(5, 5, 150)); + startAddressInput = new AddressInput(); startAddressInput.setName("NewStartAddress"); startAddressInput.setAddressFactory(addrFactory); endAddressInput = new AddressInput(); @@ -121,22 +121,22 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene endAddressInput.setAddressFactory(addrFactory); Address start = block.getStart(); Address end = block.getEnd(); - + startAddressInput.setAddress(start); startAddressInput.setAddressSpaceEditable(false); endAddressInput.setAddress(end); endAddressInput.setAddressSpaceEditable(false); - + startField = new JTextField(10); startField.setName("StartAddress"); endField = new JTextField(10); endField.setName("EndAddress"); startField.setText(start.toString()); endField.setText(end.toString()); - - JLabel startLabel = new JLabel("Start Address:", SwingConstants.RIGHT); - JLabel endLabel = new JLabel("End Address:", SwingConstants.RIGHT); - + + JLabel startLabel = DockingUtils.createNonHtmlLabel("Start Address:", SwingConstants.RIGHT); + JLabel endLabel = DockingUtils.createNonHtmlLabel("End Address:", SwingConstants.RIGHT); + if (dialogType == EXPAND_UP) { endField.setEnabled(false); startLabel.setText("New Start Address:"); @@ -147,29 +147,28 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene } lengthField = new RegisterField(32, null, false); lengthField.setName("BlockLength"); - lengthField.setValue(new Long(model.getLength())); - + lengthField.setValue(Long.valueOf(model.getLength())); + panel.add(startLabel); - panel.add((dialogType == EXPAND_UP)? - (JComponent)startAddressInput : startField); + panel.add((dialogType == EXPAND_UP) ? (JComponent) startAddressInput : startField); panel.add(endLabel); - panel.add((dialogType == EXPAND_UP)? - (JComponent)endField : endAddressInput); - panel.add(new JLabel("Block Length:", SwingConstants.RIGHT)); + panel.add((dialogType == EXPAND_UP) ? (JComponent) endField : endAddressInput); + panel.add(DockingUtils.createNonHtmlLabel("Block Length:", SwingConstants.RIGHT)); panel.add(lengthField); - + JPanel mainPanel = new JPanel(new BorderLayout()); mainPanel.add(panel, BorderLayout.CENTER); return mainPanel; } private void addListeners() { - + startAddressInput.addChangeListener(new AddressChangeListener()); endAddressInput.addChangeListener(new AddressChangeListener()); lengthField.setChangeListener(new LengthChangeListener()); - + ActionListener al = new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setStatusText(""); } @@ -180,13 +179,14 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene startAddressInput.addActionListener(al); endAddressInput.addActionListener(al); } - + /** * Listener on the length text fields; update other fields * according to the entered value. */ private class LengthChangeListener implements ChangeListener { + @Override public void stateChanged(ChangeEvent e) { if (isChanging) { return; @@ -194,7 +194,7 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene setStatusText(""); lengthChanged(); } - + private void lengthChanged() { long length = 0; Long val = lengthField.getValue(); @@ -207,13 +207,14 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene model.setLength(length); } } - + /** * Listener on the AddressInput field; update length field when the * address input field changes. */ private class AddressChangeListener implements ChangeListener { - + + @Override public void stateChanged(ChangeEvent event) { if (isChanging) { return; @@ -221,8 +222,8 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene setStatusText(""); addressChanged(); } - - private void addressChanged() { + + private void addressChanged() { if (dialogType == EXPAND_UP) { Address startAddr = startAddressInput.getAddress(); if (startAddr == null) { @@ -238,34 +239,35 @@ class ExpandBlockDialog extends DialogComponentProvider implements ChangeListene if (endAddr == null) { if (endAddressInput.hasInput()) { setStatusText("Invalid Address"); - } + } setOkEnabled(false); } model.setEndAddress(endAddr); } } } - + /** * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent) */ + @Override public void stateChanged(ChangeEvent e) { - + String message = model.getMessage(); setStatusText(message); setOkEnabled(message.length() == 0); lengthField.setValue(new Long(model.getLength())); - Address startAddr = model.getStartAddress(); - Address endAddr = model.getEndAddress(); - isChanging = true; - if (dialogType == EXPAND_UP && startAddr != null) { - startAddressInput.setAddress(startAddr); - } - else if (endAddr != null) { - endAddressInput.setAddress(endAddr); - } - isChanging = false; - + Address startAddr = model.getStartAddress(); + Address endAddr = model.getEndAddress(); + isChanging = true; + if (dialogType == EXPAND_UP && startAddr != null) { + startAddressInput.setAddress(startAddr); + } + else if (endAddr != null) { + endAddressInput.setAddress(endAddr); + } + isChanging = false; + if (!isVisible()) { setOkEnabled(false); ComponentProvider provider = tool.getComponentProvider(PluginConstants.MEMORY_MAP); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/MemoryMapProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/MemoryMapProvider.java index 2be2949674..a7653307fb 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/MemoryMapProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/MemoryMapProvider.java @@ -24,6 +24,7 @@ import javax.swing.table.TableColumn; import javax.swing.table.TableModel; import docking.ActionContext; +import docking.DockingUtils; import docking.action.DockingAction; import docking.action.ToolBarData; import docking.widgets.table.*; @@ -176,7 +177,8 @@ class MemoryMapProvider extends ComponentProviderAdapter { enableOptions(model); }); - memPanel.add(new JLabel("Memory Blocks", SwingConstants.CENTER), BorderLayout.NORTH); + memPanel.add(DockingUtils.createNonHtmlLabel("Memory Blocks", SwingConstants.CENTER), + BorderLayout.NORTH); memPanel.add(memPane, BorderLayout.CENTER); return memPanel; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/MoveBlockDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/MoveBlockDialog.java index 26607e4419..f9c286165c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/MoveBlockDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/memory/MoveBlockDialog.java @@ -22,6 +22,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import docking.DialogComponentProvider; +import docking.DockingUtils; import ghidra.app.cmd.memory.MoveBlockListener; import ghidra.app.cmd.memory.MoveBlockTask; import ghidra.app.util.*; @@ -156,16 +157,16 @@ public class MoveBlockDialog extends DialogComponentProvider implements MoveBloc private JPanel buildMainPanel() { JPanel panel = new JPanel(new PairLayout(5, 20, 150)); panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); - blockNameLabel = new JLabel(".text"); + blockNameLabel = DockingUtils.createNonHtmlLabel(".text"); blockNameLabel.setName("blockName"); // name components for junits - origStartLabel = new JLabel("1001000"); + origStartLabel = DockingUtils.createNonHtmlLabel("1001000"); origStartLabel.setName("origStart"); - origEndLabel = new JLabel("1002000"); + origEndLabel = DockingUtils.createNonHtmlLabel("1002000"); origEndLabel.setName("origEnd"); - lengthLabel = new JLabel("4096 (0x1000)"); + lengthLabel = DockingUtils.createNonHtmlLabel("4096 (0x1000)"); lengthLabel.setName("length"); newStartField = new AddressInput(); @@ -187,17 +188,17 @@ public class MoveBlockDialog extends DialogComponentProvider implements MoveBloc } }); - panel.add(new JLabel("Name:", SwingConstants.RIGHT)); + panel.add(DockingUtils.createNonHtmlLabel("Name:", SwingConstants.RIGHT)); panel.add(blockNameLabel); - panel.add(new JLabel("Start Address:", SwingConstants.RIGHT)); + panel.add(DockingUtils.createNonHtmlLabel("Start Address:", SwingConstants.RIGHT)); panel.add(origStartLabel); - panel.add(new JLabel("End Address:", SwingConstants.RIGHT)); + panel.add(DockingUtils.createNonHtmlLabel("End Address:", SwingConstants.RIGHT)); panel.add(origEndLabel); - panel.add(new JLabel("Length:", SwingConstants.RIGHT)); + panel.add(DockingUtils.createNonHtmlLabel("Length:", SwingConstants.RIGHT)); panel.add(lengthLabel); - panel.add(new JLabel("New Start Address:", SwingConstants.RIGHT)); + panel.add(DockingUtils.createNonHtmlLabel("New Start Address:", SwingConstants.RIGHT)); panel.add(newStartField); - panel.add(new JLabel("New End Address:", SwingConstants.RIGHT)); + panel.add(DockingUtils.createNonHtmlLabel("New End Address:", SwingConstants.RIGHT)); panel.add(newEndField); return panel; } 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 987f0c05f0..972b4ca521 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 @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,16 +15,6 @@ */ package ghidra.app.plugin.core.memory; -import ghidra.app.plugin.core.misc.RegisterField; -import ghidra.app.util.AddressInput; -import ghidra.app.util.HelpTopics; -import ghidra.program.model.address.*; -import ghidra.program.model.mem.MemoryBlock; -import ghidra.util.HelpLocation; -import ghidra.util.NamingUtilities; -import ghidra.util.exception.InvalidInputException; -import ghidra.util.layout.PairLayout; - import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -35,6 +24,16 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import docking.DialogComponentProvider; +import docking.DockingUtils; +import ghidra.app.plugin.core.misc.RegisterField; +import ghidra.app.util.AddressInput; +import ghidra.app.util.HelpTopics; +import ghidra.program.model.address.*; +import ghidra.program.model.mem.MemoryBlock; +import ghidra.util.HelpLocation; +import ghidra.util.NamingUtilities; +import ghidra.util.exception.InvalidInputException; +import ghidra.util.layout.PairLayout; /** * @@ -119,13 +118,13 @@ class SplitBlockDialog extends DialogComponentProvider { blockOneLengthField = new RegisterField(32, null, false); blockOneLengthField.setName("BlockOneLength"); - panelOne.add(new JLabel("Block Name:", SwingConstants.RIGHT)); + panelOne.add(DockingUtils.createNonHtmlLabel("Block Name:", SwingConstants.RIGHT)); panelOne.add(blockOneNameField); - panelOne.add(new JLabel("Start Address:", SwingConstants.RIGHT)); + panelOne.add(DockingUtils.createNonHtmlLabel("Start Address:", SwingConstants.RIGHT)); panelOne.add(blockOneStartField); - panelOne.add(new JLabel("End Address:", SwingConstants.RIGHT)); + panelOne.add(DockingUtils.createNonHtmlLabel("End Address:", SwingConstants.RIGHT)); panelOne.add(blockOneEnd); - panelOne.add(new JLabel("Block Length:", SwingConstants.RIGHT)); + panelOne.add(DockingUtils.createNonHtmlLabel("Block Length:", SwingConstants.RIGHT)); panelOne.add(blockOneLengthField); JPanel panelTwo = new JPanel(new PairLayout(5, 5, 150)); @@ -140,13 +139,13 @@ class SplitBlockDialog extends DialogComponentProvider { blockTwoLengthField = new RegisterField(32, null, false); blockTwoLengthField.setName("BlockTwoLength"); - panelTwo.add(new JLabel("Block Name:", SwingConstants.RIGHT)); + panelTwo.add(DockingUtils.createNonHtmlLabel("Block Name:", SwingConstants.RIGHT)); panelTwo.add(blockTwoNameField); - panelTwo.add(new JLabel("Start Address:", SwingConstants.RIGHT)); + panelTwo.add(DockingUtils.createNonHtmlLabel("Start Address:", SwingConstants.RIGHT)); panelTwo.add(blockTwoStart); - panelTwo.add(new JLabel("End Address:", SwingConstants.RIGHT)); + panelTwo.add(DockingUtils.createNonHtmlLabel("End Address:", SwingConstants.RIGHT)); panelTwo.add(blockTwoEndField); - panelTwo.add(new JLabel("Block Length:", SwingConstants.RIGHT)); + panelTwo.add(DockingUtils.createNonHtmlLabel("Block Length:", SwingConstants.RIGHT)); panelTwo.add(blockTwoLengthField); JPanel mainPanel = new JPanel(); @@ -202,6 +201,7 @@ class SplitBlockDialog extends DialogComponentProvider { blockTwoStart.addChangeListener(new AddressChangeListener(blockTwoStart)); ActionListener al = new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setStatusText(""); } @@ -227,6 +227,7 @@ class SplitBlockDialog extends DialogComponentProvider { this.source = source; } + @Override public void stateChanged(ChangeEvent event) { setStatusText(""); boolean ok = false; @@ -331,6 +332,7 @@ class SplitBlockDialog extends DialogComponentProvider { this.source = source; } + @Override public void stateChanged(ChangeEvent event) { setStatusText(""); boolean ok = false; @@ -385,8 +387,8 @@ class SplitBlockDialog extends DialogComponentProvider { } long blockSize = block.getSize(); if (length > blockSize) { - setStatusText("End address must be less than original block end (" + - block.getEnd() + ")"); + setStatusText( + "End address must be less than original block end (" + block.getEnd() + ")"); return false; } blockOneLengthField.setValue(new Long(length)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/addresstype/AddressTypeOverviewColorService.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/addresstype/AddressTypeOverviewColorService.java index dca7e3b869..d94ce22913 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/addresstype/AddressTypeOverviewColorService.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/addresstype/AddressTypeOverviewColorService.java @@ -90,11 +90,11 @@ public class AddressTypeOverviewColorService AddressType addressType = getAddressType(address); StringBuffer buffer = new StringBuffer(); buffer.append(""); - buffer.append(getName()); + buffer.append(HTMLUtilities.friendlyEncodeHTML(getName())); buffer.append("\n"); buffer.append(addressType.getDescription()); buffer.append(" ("); - buffer.append(getBlockName(address)); + buffer.append(HTMLUtilities.friendlyEncodeHTML(getBlockName(address))); buffer.append(" "); buffer.append(address); buffer.append(" )"); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/addresstype/AddressTypeOverviewLegendPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/addresstype/AddressTypeOverviewLegendPanel.java index bc85918c60..e450ee0eee 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/addresstype/AddressTypeOverviewLegendPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/addresstype/AddressTypeOverviewLegendPanel.java @@ -21,6 +21,7 @@ import java.awt.event.MouseEvent; import javax.swing.*; +import docking.DockingUtils; import ghidra.util.layout.PairLayout; /** @@ -50,7 +51,7 @@ public class AddressTypeOverviewLegendPanel extends JPanel { for (AddressType addressType : values) { JPanel panel = new ColorPanel(addressType); add(panel); - add(new JLabel(addressType.getDescription())); + add(DockingUtils.createNonHtmlLabel(addressType.getDescription())); } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewColorService.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewColorService.java index 608851ddcd..bbab0fbcad 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewColorService.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/EntropyOverviewColorService.java @@ -86,19 +86,19 @@ public class EntropyOverviewColorService implements OverviewColorService { } int entropyScaled = computeEntropy(address); double entropy = (entropyScaled * 8.0d) / 255; // convert back from palette scale to original entropy value - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); buffer.append(""); - buffer.append(getName()); + buffer.append(HTMLUtilities.friendlyEncodeHTML(getName())); buffer.append("\n"); buffer.append(" "); buffer.append(formatter.format(entropy)); buffer.append(" "); - buffer.append(getKnotName(entropyScaled)); + buffer.append(HTMLUtilities.friendlyEncodeHTML(getKnotName(entropyScaled))); buffer.append(" "); buffer.append("    ("); - buffer.append(getBlockName(address)); + buffer.append(HTMLUtilities.friendlyEncodeHTML(getBlockName(address))); buffer.append(" "); - buffer.append(address); + buffer.append(HTMLUtilities.friendlyEncodeHTML(address.toString())); buffer.append(" )"); return HTMLUtilities.toWrappedHTML(buffer.toString(), 0); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotPanel.java index fbb9ab3193..793ebae356 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/KnotPanel.java @@ -25,6 +25,7 @@ import javax.swing.border.LineBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import docking.DockingUtils; import docking.util.GraphicsUtils; /** @@ -133,7 +134,7 @@ public class KnotPanel extends JPanel implements ComponentListener { ArrayList knots = palette.getKnots(); for (KnotRecord record : knots) { - JLabel label = new JLabel(record.name); + JLabel label = DockingUtils.createNonHtmlLabel(record.name); label.setFont(FONT); label.setBorder(new ToplessLineBorder(Color.BLACK)); label.setHorizontalAlignment(SwingConstants.CENTER); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/LegendPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/LegendPanel.java index 737efa64d4..e466589ab4 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/LegendPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/entropy/LegendPanel.java @@ -17,7 +17,8 @@ package ghidra.app.plugin.core.overview.entropy; import java.awt.*; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.JPanel; /** * Panel for display the Entropy color legend. @@ -33,22 +34,12 @@ public class LegendPanel extends JPanel { add(buildHeader(), BorderLayout.NORTH); add(palettePanel, BorderLayout.WEST); add(knotPanel, BorderLayout.CENTER); -// add(buildFooter(), BorderLayout.SOUTH); setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); } private Component buildHeader() { JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); -// panel.add(new JLabel("Entropy range: 0.0 - 8.0"), BorderLayout.CENTER); -// panel.add(new JLabel("Min Entropy (0.0)"), BorderLayout.CENTER); - return panel; - } - - private Component buildFooter() { - JPanel panel = new JPanel(new BorderLayout()); - panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); - panel.add(new JLabel("Max Entropy (8.0)"), BorderLayout.CENTER); return panel; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/processors/LanguageProviderPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/processors/LanguageProviderPlugin.java index c576d77680..3ea4561ed6 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/processors/LanguageProviderPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/processors/LanguageProviderPlugin.java @@ -113,11 +113,12 @@ public final class LanguageProviderPlugin extends Plugin implements FrontEndable } }; - setLanguageAction.setPopupMenuData(new MenuData(new String[] { "Set Language..." }, - "Language")); + setLanguageAction.setPopupMenuData( + new MenuData(new String[] { "Set Language..." }, "Language")); setLanguageAction.setEnabled(true); - setLanguageAction.setHelpLocation(new HelpLocation("LanguageProviderPlugin", "set language")); + setLanguageAction.setHelpLocation( + new HelpLocation("LanguageProviderPlugin", "set language")); tool.addAction(setLanguageAction); } @@ -142,22 +143,23 @@ public final class LanguageProviderPlugin extends Plugin implements FrontEndable String dfName = domainFile.getName(); if (domainFile.isReadOnly()) { - Msg.showInfo(getClass(), tool.getToolFrame(), "Permission Denied", dfName + + Msg.showInfo(getClass(), tool.getToolFrame(), "Permission Denied", "Program " + dfName + " is read-only!\n" + "Set language may not be done on a read-only Program."); return; } if (!domainFile.getConsumers().isEmpty() || domainFile.isBusy()) { - Msg.showInfo(getClass(), tool.getToolFrame(), "File In-Use", dfName + " is in-use!\n" + - "Set language may not be done while the associated file is\n" + - "open or in-use. Be sure the file is not open in a tool."); + Msg.showInfo(getClass(), tool.getToolFrame(), "File In-Use", + "Program " + dfName + " is in-use!\n" + + "Set language may not be done while the associated file is\n" + + "open or in-use. Be sure the file is not open in a tool."); return; } if (domainFile.isCheckedOut() && !domainFile.isCheckedOutExclusive()) { - String msg = - (domainFile.modifiedSinceCheckout() || domainFile.isChanged()) ? "check-in this file" - : "undo your checkout"; + String msg = (domainFile.modifiedSinceCheckout() || domainFile.isChanged()) + ? "check-in this file" + : "undo your checkout"; Msg.showInfo(getClass(), tool.getToolFrame(), "Exclusive Checkout Required", "You do not have an exclusive checkout of: " + dfName + "\n \n" + @@ -171,28 +173,25 @@ public final class LanguageProviderPlugin extends Plugin implements FrontEndable String msg = "Setting the language can not be undone!\n"; if (domainFile.modifiedSinceCheckout()) { - msg += - "\nIt is highly recommended that you check-in your recent\n" - + "changes before performing this operation."; + msg += "\nIt is highly recommended that you check-in your recent\n" + + "changes before performing this operation."; } else if (!domainFile.isCheckedOut()) { - msg += - "\nIt is highly recommended that you make a copy of the\n" - + "selected file before performing this operation."; + msg += "\nIt is highly recommended that you make a copy of the\n" + + "selected file before performing this operation."; } ToolTemplate defaultToolTemplate = tool.getToolServices().getDefaultToolTemplate(domainFile); - String toolMsg = - defaultToolTemplate == null ? "WARNING! Without a default tool the file " - + "will be overwritten\nwhen the Set Language is complete." - : "When complete you can Save the results or Open the results\nin the " + - defaultToolTemplate.getName() + " tool"; + String toolMsg = defaultToolTemplate == null + ? "WARNING! Without a default tool the file " + + "will be overwritten\nwhen the Set Language is complete." + : "When complete you can Save the results or Open the results\nin the " + + defaultToolTemplate.getName() + " tool"; - int result = - OptionDialog.showOptionDialog(tool.getToolFrame(), "Set Language: " + dfName, msg + - "\n \n" + toolMsg + "\n \nDo you want to continue?", "Ok", - OptionDialog.WARNING_MESSAGE); + int result = OptionDialog.showOptionDialog(tool.getToolFrame(), "Set Language: " + dfName, + msg + "\n \n" + toolMsg + "\n \nDo you want to continue?", "Ok", + OptionDialog.WARNING_MESSAGE); if (result > 0) { final SetLanguageTask task = new SetLanguageTask(domainFile); new TaskLauncher(task, tool.getToolFrame(), 0); @@ -326,8 +325,7 @@ public final class LanguageProviderPlugin extends Plugin implements FrontEndable try { SwingUtilities.invokeAndWait(() -> { ToolServices toolServices = tool.getToolServices(); - String defaultToolName = - toolServices.getDefaultToolTemplate(file).getName(); + String defaultToolName = toolServices.getDefaultToolTemplate(file).getName(); for (Tool t : toolServices.getRunningTools()) { if (t.getName().equals(defaultToolName)) { openTool = (PluginTool) t; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/processors/ShowInstructionInfoPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/processors/ShowInstructionInfoPlugin.java index 7130af471f..f158073fd4 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/processors/ShowInstructionInfoPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/processors/ShowInstructionInfoPlugin.java @@ -27,8 +27,7 @@ import java.util.List; import javax.swing.JLabel; import javax.swing.JPanel; -import docking.ActionContext; -import docking.ToolTipManager; +import docking.*; import docking.action.DockingAction; import docking.action.MenuData; import ghidra.app.CorePluginPackage; @@ -95,7 +94,7 @@ public class ShowInstructionInfoPlugin extends ProgramPlugin { private void createStatusPanels() { instructionPanel = new JPanel(new BorderLayout()); - instructionLabel = new JLabel(" "); + instructionLabel = DockingUtils.createNonHtmlLabel(" "); instructionPanel.setPreferredSize( new Dimension(200, instructionLabel.getPreferredSize().height)); ToolTipManager.setToolTipText(instructionLabel, CURRENT_INSTRUCTION_PREPEND_STRING); @@ -104,7 +103,7 @@ public class ShowInstructionInfoPlugin extends ProgramPlugin { tool.addStatusComponent(instructionPanel, true, false); functionPanel = new JPanel(new BorderLayout()); - functionLabel = new JLabel(" "); + functionLabel = DockingUtils.createNonHtmlLabel(" "); functionLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { @@ -122,7 +121,7 @@ public class ShowInstructionInfoPlugin extends ProgramPlugin { tool.addStatusComponent(functionPanel, true, false); addressPanel = new JPanel(new BorderLayout()); - addressLabel = new JLabel(" "); + addressLabel = DockingUtils.createNonHtmlLabel(" "); addressPanel.setPreferredSize(new Dimension(95, addressLabel.getPreferredSize().height)); ToolTipManager.setToolTipText(addressLabel, "Current Address"); addressPanel.add(addressLabel); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiTabPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiTabPanel.java index 38caa3a58d..d4a931c337 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiTabPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/MultiTabPanel.java @@ -24,6 +24,7 @@ import java.util.Map.Entry; import javax.swing.*; import javax.swing.border.*; +import docking.DockingUtils; import docking.util.KeyBindingUtils; import generic.util.WindowUtilities; import ghidra.framework.model.ProjectLocator; @@ -227,7 +228,7 @@ public class MultiTabPanel extends JPanel { final JPanel labelPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 1)); labelPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 10)); - final JLabel nameLabel = new JLabel(); + JLabel nameLabel = DockingUtils.createNonHtmlLabel(); nameLabel.setIconTextGap(1); nameLabel.setName("objectName"); // junit access nameLabel.setFont(LABEL_FONT); @@ -236,7 +237,7 @@ public class MultiTabPanel extends JPanel { labelPanel.add(nameLabel); - final JLabel iconLabel = new JLabel(EMPTY16_ICON); + JLabel iconLabel = DockingUtils.createNonHtmlLabel(EMPTY16_ICON); Icon icon = isSelected ? CLOSE_ICON : EMPTY16_ICON; iconLabel.setIcon(icon); @@ -642,7 +643,7 @@ public class MultiTabPanel extends JPanel { } private JLabel createLabel() { - final JLabel newLabel = new JLabel(LIST_ICON, SwingConstants.LEFT); + JLabel newLabel = DockingUtils.createNonHtmlLabel(LIST_ICON, SwingConstants.LEFT); newLabel.setIconTextGap(0); newLabel.setFont(LIST_LABEL_FONT); newLabel.setBorder(BorderFactory.createEmptyBorder(4, 4, 0, 4)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramListPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramListPanel.java index 86051d0889..1a05165d30 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramListPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramListPanel.java @@ -29,10 +29,13 @@ import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import javax.swing.text.Document; +import docking.widgets.list.GListCellRenderer; import ghidra.program.model.listing.Program; /** - * Panel that shows a JList + * Panel that displays the overflow of currently open programs that can be choosen. + *

    + * Programs that don't have a visible tab are displayed in bold. */ class ProgramListPanel extends JPanel { @@ -123,7 +126,7 @@ class ProgramListPanel extends JPanel { } }); - programList.setCellRenderer(new MyListCellRenderer()); + programList.setCellRenderer(new ProgramListCellRenderer()); JScrollPane sp = new JScrollPane(); sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); @@ -187,7 +190,7 @@ class ProgramListPanel extends JPanel { } private void filterList(String filterText) { - List allDataList = new ArrayList(); + List allDataList = new ArrayList<>(); allDataList.addAll(hiddenList); allDataList.addAll(shownList); @@ -227,31 +230,20 @@ class ProgramListPanel extends JPanel { } } - private class MyListCellRenderer extends JLabel implements ListCellRenderer { - private Font boldFont; - private Font font; + private class ProgramListCellRenderer extends GListCellRenderer { - MyListCellRenderer() { - setOpaque(true); + @Override + protected String getItemText(Program program) { + return multiTabPlugin.getStringUsedInList(program); } @Override - public Component getListCellRendererComponent(JList list, T value, int index, - boolean isSelected, boolean cellHasFocus) { + public Component getListCellRendererComponent(JList list, Program value, + int index, boolean isSelected, boolean hasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, hasFocus); - if (font == null) { - font = list.getFont(); - font = new Font(font.getName(), Font.PLAIN, font.getSize()); - boldFont = new Font(font.getName(), Font.BOLD, font.getSize()); - } - - String text = multiTabPlugin.getStringUsedInList((Program) value); - setText(text); if (hiddenList.contains(value)) { - setFont(boldFont); - } - else { - setFont(font); + setBold(); } if (isSelected) { setBackground(list.getSelectionBackground()); @@ -261,7 +253,7 @@ class ProgramListPanel extends JPanel { setBackground(list.getBackground()); setForeground(list.getForeground()); } - setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 10)); + return this; } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramManagerPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramManagerPlugin.java index aaac0d6095..ee53560928 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramManagerPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramManagerPlugin.java @@ -45,7 +45,8 @@ import ghidra.framework.main.OpenVersionedFileDialog; import ghidra.framework.model.*; import ghidra.framework.options.*; import ghidra.framework.plugintool.*; -import ghidra.framework.plugintool.util.*; +import ghidra.framework.plugintool.util.PluginStatus; +import ghidra.framework.plugintool.util.ToolConstants; import ghidra.framework.protocol.ghidra.*; import ghidra.program.database.ProgramContentHandler; import ghidra.program.model.address.*; @@ -557,7 +558,7 @@ public class ProgramManagerPlugin extends Plugin implements ProgramManager { Program program = context.getProgram(); String programName = "'" + program.getDomainFile().getName() + "'"; getMenuBarData().setMenuItemName("&Close " + programName); - setDescription("Close " + programName); + setDescription("Close " + HTMLUtilities.friendlyEncodeHTML(programName)); return true; } }; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramSaveManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramSaveManager.java index cc14e3dd64..e1a680695b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramSaveManager.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/ProgramSaveManager.java @@ -76,8 +76,8 @@ class ProgramSaveManager { boolean canCloseAll() { Program[] programs = programMgr.getAllOpenPrograms(); - List saveList = new ArrayList(); - List lockList = new ArrayList(); + List saveList = new ArrayList<>(); + List lockList = new ArrayList<>(); try { for (int i = 0; i < programs.length; i++) { // if (programs[i].isTemporary()) { @@ -144,12 +144,12 @@ class ProgramSaveManager { } } if (saveCnt != 0) { - Msg.showInfo(getClass(), tool.getToolFrame(), "Save All...", "Saved " + saveCnt + - " modified programs."); + Msg.showInfo(getClass(), tool.getToolFrame(), "Save All...", + "Saved " + saveCnt + " modified programs."); } if (unsavedCnt != 0) { - Msg.showWarn(getClass(), tool.getToolFrame(), "Save All...", "Unable to save " + - unsavedCnt + " read-only programs!"); + Msg.showWarn(getClass(), tool.getToolFrame(), "Save All...", + "Unable to save " + unsavedCnt + " read-only programs!"); } } @@ -162,10 +162,10 @@ class ProgramSaveManager { SaveDataDialog saveDataDialog = new SaveDataDialog(tool); // don't modify the original list, as it is used by the caller to perform cleanup - List saveProgramsList = new ArrayList(openProgramList); + List saveProgramsList = new ArrayList<>(openProgramList); // make sure we have some files to save - List domainFilesToSaveList = new ArrayList(); + List domainFilesToSaveList = new ArrayList<>(); Iterator iter = saveProgramsList.iterator(); while (iter.hasNext()) { Program program = iter.next(); @@ -265,23 +265,26 @@ class ProgramSaveManager { if (!df.isInWritableProject()) { return OptionDialog.showOptionDialog(tool.getToolFrame(), "Program Changed", - "Viewed file '" + filename + "' has been changed. \n" + - "If you continue, your changes will be lost!", "Continue", - OptionDialog.QUESTION_MESSAGE) != OptionDialog.CANCEL_OPTION; + HTMLUtilities.lineWrapWithHTMLLineBreaks( + "Viewed file '" + HTMLUtilities.friendlyEncodeHTML(filename) + + "' has been changed. \n" + "If you continue, your changes will be lost!"), + "Continue", OptionDialog.QUESTION_MESSAGE) != OptionDialog.CANCEL_OPTION; } if (df.isReadOnly()) { return OptionDialog.showOptionDialog(tool.getToolFrame(), "Program Changed", - "Read-only file '" + filename + "' has been changed. \n" + - "If you continue, your changes will be lost!", "Continue", - OptionDialog.QUESTION_MESSAGE) != OptionDialog.CANCEL_OPTION; + HTMLUtilities.lineWrapWithHTMLLineBreaks( + "Read-only file '" + HTMLUtilities.friendlyEncodeHTML(filename) + + "' has been changed. \n" + "If you continue, your changes will be lost!"), + "Continue", OptionDialog.QUESTION_MESSAGE) != OptionDialog.CANCEL_OPTION; } - int result = - OptionDialog.showOptionDialog(tool.getToolFrame(), "Save Program?", filename + - " has changed. Do you want to save it?", "&Save", "Do&n't Save", - OptionDialog.QUESTION_MESSAGE); + int result = OptionDialog.showOptionDialog(tool.getToolFrame(), "Save Program?", + HTMLUtilities.lineWrapWithHTMLLineBreaks( + "" + HTMLUtilities.friendlyEncodeHTML(filename) + + " has changed.\nDo you want to save it?"), + "&Save", "Do&n't Save", OptionDialog.QUESTION_MESSAGE); if (result == OptionDialog.CANCEL_OPTION) { return false; @@ -366,8 +369,9 @@ class ProgramSaveManager { private boolean acquireSaveLock(Program program, String actionName) { if (!program.lock(null)) { String title = actionName + " Program" + " (Busy)"; - StringBuffer buf = new StringBuffer(); - buf.append("The Program is currently being modified by the following actions/tasks:\n "); + StringBuilder buf = new StringBuilder(); + buf.append( + "The Program is currently being modified by the following actions/tasks:\n "); Transaction t = program.getCurrentTransaction(); List list = t.getOpenSubTransactions(); Iterator it = list.iterator(); @@ -379,12 +383,13 @@ class ProgramSaveManager { buf.append("WARNING! The above task(s) should be cancelled before attempting a " + actionName + ".\n"); buf.append("Only proceed if unable to cancel them.\n \n"); - buf.append("If you continue, all changes made by these tasks, as well as any other overlapping task,\n"); - buf.append("will be LOST and subsequent transaction errors may occur while these tasks remain active.\n \n"); + buf.append( + "If you continue, all changes made by these tasks, as well as any other overlapping task,\n"); + buf.append( + "will be LOST and subsequent transaction errors may occur while these tasks remain active.\n \n"); - int result = - OptionDialog.showOptionDialog(tool.getToolFrame(), title, buf.toString(), - actionName + "!", OptionDialog.WARNING_MESSAGE); + int result = OptionDialog.showOptionDialog(tool.getToolFrame(), title, buf.toString(), + actionName + "!", OptionDialog.WARNING_MESSAGE); if (result == OptionDialog.OPTION_ONE) { program.forceLock(true, "Save Program"); @@ -399,7 +404,8 @@ class ProgramSaveManager { if (!program.lock(null)) { String title = "Save Program As (Busy)"; StringBuffer buf = new StringBuffer(); - buf.append("The Program is currently being modified by the following actions/tasks:\n "); + buf.append( + "The Program is currently being modified by the following actions/tasks:\n "); Transaction t = program.getCurrentTransaction(); List list = t.getOpenSubTransactions(); Iterator it = list.iterator(); @@ -408,18 +414,19 @@ class ProgramSaveManager { buf.append(it.next()); } buf.append("\n \n"); - buf.append("WARNING! The above task(s) should be cancelled before attempting a Save As...\n"); + buf.append( + "WARNING! The above task(s) should be cancelled before attempting a Save As...\n"); buf.append("Only proceed if unable to cancel them.\n \n"); buf.append("If you click 'Save As (Rollback)' {recommended}, all changes made\n"); buf.append("by these tasks, as well as any other overlapping task, will be LOST!\n"); - buf.append("If you click 'Save As (As Is)', the program will be saved in its current\n"); + buf.append( + "If you click 'Save As (As Is)', the program will be saved in its current\n"); buf.append("state which may contain some incomplete data.\n"); buf.append("Any forced save may also result in subsequent transaction errors while\n"); buf.append("the above tasks remain active.\n "); - int result = - OptionDialog.showOptionDialog(tool.getToolFrame(), title, buf.toString(), - "Save As (Rollback)!", "Save As (As Is)!", OptionDialog.WARNING_MESSAGE); + int result = OptionDialog.showOptionDialog(tool.getToolFrame(), title, buf.toString(), + "Save As (Rollback)!", "Save As (As Is)!", OptionDialog.WARNING_MESSAGE); if (result == OptionDialog.OPTION_ONE) { program.forceLock(true, "Save Program As"); @@ -462,7 +469,8 @@ class ProgramSaveManager { new DataTreeDialog(null, "Save As", DataTreeDialog.SAVE, domainFileFilter); dataTreeSaveDialog.addOkActionListener(listener); - dataTreeSaveDialog.setHelpLocation(new HelpLocation(HelpTopics.PROGRAM, "Save_As_File")); + dataTreeSaveDialog.setHelpLocation( + new HelpLocation(HelpTopics.PROGRAM, "Save_As_File")); } return dataTreeSaveDialog; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/RedoAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/RedoAction.java index bd06c138ea..a6fc77d483 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/RedoAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/RedoAction.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +15,13 @@ */ package ghidra.app.plugin.core.progmgr; +import java.awt.event.InputEvent; +import java.io.IOException; + +import javax.swing.Icon; + +import docking.ActionContext; +import docking.action.*; import ghidra.app.context.ProgramActionContext; import ghidra.app.context.ProgramContextAction; import ghidra.app.services.GoToService; @@ -24,15 +30,7 @@ import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.util.ToolConstants; import ghidra.program.model.listing.Program; import ghidra.util.*; - -import java.awt.event.InputEvent; -import java.io.IOException; - -import javax.swing.Icon; - import resources.ResourceManager; -import docking.ActionContext; -import docking.action.*; public class RedoAction extends ProgramContextAction { private final PluginTool tool; @@ -70,7 +68,8 @@ public class RedoAction extends ProgramContextAction { if (program.canRedo()) { String programName = program.getDomainFile().getName(); getMenuBarData().setMenuItemName("Redo " + programName); - String tip = HTMLUtilities.toWrappedHTML("Redo " + program.getRedoName()); + String tip = HTMLUtilities.toWrappedHTML( + "Redo " + HTMLUtilities.friendlyEncodeHTML(program.getRedoName())); setDescription(tip); return true; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/UndoAction.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/UndoAction.java index e79804f0d6..6cbda5e2b2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/UndoAction.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/progmgr/UndoAction.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +15,13 @@ */ package ghidra.app.plugin.core.progmgr; +import java.awt.event.InputEvent; +import java.io.IOException; + +import javax.swing.Icon; + +import docking.ActionContext; +import docking.action.*; import ghidra.app.context.ProgramActionContext; import ghidra.app.context.ProgramContextAction; import ghidra.app.services.GoToService; @@ -24,15 +30,7 @@ import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.util.ToolConstants; import ghidra.program.model.listing.Program; import ghidra.util.*; - -import java.awt.event.InputEvent; -import java.io.IOException; - -import javax.swing.Icon; - import resources.ResourceManager; -import docking.ActionContext; -import docking.action.*; public class UndoAction extends ProgramContextAction { private final PluginTool tool; @@ -77,7 +75,8 @@ public class UndoAction extends ProgramContextAction { if (program.canUndo()) { String programName = program.getDomainFile().getName(); getMenuBarData().setMenuItemName("Undo " + programName); - String tip = HTMLUtilities.toWrappedHTML("Undo " + program.getUndoName()); + String tip = HTMLUtilities.toWrappedHTML( + "Undo " + HTMLUtilities.friendlyEncodeHTML(program.getUndoName())); setDescription(tip); return true; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/programtree/DnDTreeCellRenderer.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/programtree/DnDTreeCellRenderer.java index d963eed301..8f409d0c85 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/programtree/DnDTreeCellRenderer.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/programtree/DnDTreeCellRenderer.java @@ -23,6 +23,7 @@ import javax.swing.*; import javax.swing.tree.DefaultTreeCellRenderer; import docking.ToolTipManager; +import docking.widgets.AbstractGCellRenderer; import ghidra.program.model.listing.Group; import resources.ResourceManager; @@ -71,10 +72,24 @@ class DnDTreeCellRenderer extends DefaultTreeCellRenderer { defaultSelectionColor = getBackgroundSelectionColor(); rowForFeedback = -1; + // disable HTML rendering + setHTMLRenderingEnabled(false); + loadImages(); } + /** + * Enables and disables the rendering of HTML content in this renderer. If enabled, this + * renderer will interpret HTML content when the text this renderer is showing begins with + * <html> + * + * @param enable true to enable HTML rendering; false to disable it + */ + public void setHTMLRenderingEnabled(boolean enable) { + putClientProperty(AbstractGCellRenderer.HTML_DISABLE_STRING, !enable); + } + void setSelectionForDrag(Color color) { selectionForDragColor = color; } @@ -133,7 +148,8 @@ class DnDTreeCellRenderer extends DefaultTreeCellRenderer { * @param node node to render * @param dtree tree */ - private void setSelectionColors(boolean selected, int row, ProgramNode node, DragNDropTree dtree) { + private void setSelectionColors(boolean selected, int row, ProgramNode node, + DragNDropTree dtree) { if (dtree.getDrawFeedbackState()) { if (row == rowForFeedback) { if (!selected) { @@ -291,19 +307,17 @@ class DnDTreeCellRenderer extends DefaultTreeCellRenderer { */ private void loadImages() { // try to load icon images - iconMap = new HashMap(); + iconMap = new HashMap<>(); String[] filenames = { DOCS, FRAGMENT, EMPTY_FRAGMENT, VIEWED_FRAGMENT, VIEWED_EMPTY_FRAGMENT, VIEWED_CLOSED_FOLDER, VIEWED_OPEN_FOLDER, VIEWED_CLOSED_FOLDER_WITH_DESC, // descendants in view CLOSED_FOLDER, // closed folder not in view OPEN_FOLDER, // opened folder not in the view }; - String[] disabledFilenames = - { DISABLED_DOCS, DISABLED_FRAGMENT, DISABLED_EMPTY_FRAGMENT, - DISABLED_VIEWED_EMPTY_FRAGMENT, DISABLED_VIEWED_FRAGMENT, - DISABLED_VIEWED_CLOSED_FOLDER, DISABLED_VIEWED_OPEN_FOLDER, - DISABLED_VIEWED_CLOSED_FOLDER_WITH_DESC, DISABLED_CLOSED_FOLDER, - DISABLED_OPEN_FOLDER, }; + String[] disabledFilenames = { DISABLED_DOCS, DISABLED_FRAGMENT, DISABLED_EMPTY_FRAGMENT, + DISABLED_VIEWED_EMPTY_FRAGMENT, DISABLED_VIEWED_FRAGMENT, DISABLED_VIEWED_CLOSED_FOLDER, + DISABLED_VIEWED_OPEN_FOLDER, DISABLED_VIEWED_CLOSED_FOLDER_WITH_DESC, + DISABLED_CLOSED_FOLDER, DISABLED_OPEN_FOLDER, }; for (int i = 0; i < filenames.length; i++) { ImageIcon icon = ResourceManager.loadImage(filenames[i]); @@ -326,9 +340,8 @@ class DnDTreeCellRenderer extends DefaultTreeCellRenderer { static Icon getDisabledIcon(String imageName, ImageIcon icon) { Image cutImage = icon.getImage(); - BufferedImage bufferedImage = - new BufferedImage(cutImage.getWidth(null), cutImage.getHeight(null), - BufferedImage.TYPE_INT_ARGB); + BufferedImage bufferedImage = new BufferedImage(cutImage.getWidth(null), + cutImage.getHeight(null), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bufferedImage.createGraphics(); g2d.drawImage(cutImage, 0, 0, null); g2d.setColor(new Color(255, 255, 255, 128)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/reachability/FunctionReachabilityProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/reachability/FunctionReachabilityProvider.java index 6dd2f22f5b..10ad5ecbb0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/reachability/FunctionReachabilityProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/reachability/FunctionReachabilityProvider.java @@ -21,8 +21,7 @@ import java.util.List; import javax.swing.*; -import docking.ComponentProvider; -import docking.WindowPosition; +import docking.*; import ghidra.app.services.GoToService; import ghidra.framework.plugintool.PluginTool; import ghidra.program.model.address.Address; @@ -127,7 +126,7 @@ public class FunctionReachabilityProvider extends ComponentProvider { inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.PAGE_AXIS)); fromAddressField = new JTextField(15); - fromFunctionLabel = new JLabel(); + fromFunctionLabel = DockingUtils.createNonHtmlLabel(); JButton swapButton = new JButton("Swap"); swapButton.addActionListener(e -> { @@ -138,7 +137,7 @@ public class FunctionReachabilityProvider extends ComponentProvider { }); toAddressField = new JTextField(15); - toFunctionLabel = new JLabel(); + toFunctionLabel = DockingUtils.createNonHtmlLabel(); JButton goButton = new JButton("Go"); goButton.addActionListener(e -> findPaths()); @@ -162,7 +161,7 @@ public class FunctionReachabilityProvider extends ComponentProvider { resultsModel = new FunctionReachabilityTableModel(plugin.getTool(), program); GhidraThreadedTablePanel tablePanel = - new GhidraThreadedTablePanel(resultsModel); + new GhidraThreadedTablePanel<>(resultsModel); resultsTable = tablePanel.getTable(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditExternalReferencePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditExternalReferencePanel.java index f8c4c02b9f..1a6cd0e61c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditExternalReferencePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditExternalReferencePanel.java @@ -15,16 +15,6 @@ */ package ghidra.app.plugin.core.references; -import ghidra.app.util.AddressInput; -import ghidra.framework.main.DataTreeDialog; -import ghidra.framework.model.DomainFile; -import ghidra.program.model.address.Address; -import ghidra.program.model.address.AddressSpace; -import ghidra.program.model.listing.*; -import ghidra.program.model.symbol.*; -import ghidra.util.layout.PairLayout; -import ghidra.util.layout.VerticalLayout; - import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.*; @@ -35,8 +25,18 @@ import javax.swing.border.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import docking.DockingUtils; import docking.ToolTipManager; import docking.widgets.combobox.GhidraComboBox; +import ghidra.app.util.AddressInput; +import ghidra.framework.main.DataTreeDialog; +import ghidra.framework.model.DomainFile; +import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressSpace; +import ghidra.program.model.listing.*; +import ghidra.program.model.symbol.*; +import ghidra.util.layout.PairLayout; +import ghidra.util.layout.VerticalLayout; class EditExternalReferencePanel extends EditReferencePanel { @@ -51,7 +51,7 @@ class EditExternalReferencePanel extends EditReferencePanel { private JButton clearButton; private JButton editButton; - private GhidraComboBox extLibName; + private GhidraComboBox extLibName; private JTextField extLibPath; private JTextField extLabel; private AddressInput extAddr; @@ -67,13 +67,13 @@ class EditExternalReferencePanel extends EditReferencePanel { private void buildPanel() { JPanel topPanel = new JPanel(new PairLayout(5, 10, 160)); - topPanel.setBorder(new CompoundBorder(new TitledBorder("External Program"), - new EmptyBorder(0, 5, 5, 5))); + topPanel.setBorder( + new CompoundBorder(new TitledBorder("External Program"), new EmptyBorder(0, 5, 5, 5))); - JLabel label = new JLabel("Name:"); + JLabel label = DockingUtils.createNonHtmlLabel("Name:"); label.setHorizontalAlignment(SwingConstants.RIGHT); topPanel.add(label); - extLibName = new GhidraComboBox(); + extLibName = new GhidraComboBox<>(); extLibName.setEditable(true); extLibName.addDocumentListener(new DocumentListener() { @Override @@ -130,7 +130,7 @@ class EditExternalReferencePanel extends EditReferencePanel { buttonPanel.add(editButton); pathPanel.add(buttonPanel, BorderLayout.EAST); - label = new JLabel("Path:"); + label = DockingUtils.createNonHtmlLabel("Path:"); label.setHorizontalAlignment(SwingConstants.RIGHT); topPanel.add(label); topPanel.add(pathPanel); @@ -139,13 +139,13 @@ class EditExternalReferencePanel extends EditReferencePanel { bottomPanel.setBorder(new CompoundBorder(new TitledBorder("External Reference Data"), new EmptyBorder(0, 5, 5, 5))); - label = new JLabel("Label:"); + label = DockingUtils.createNonHtmlLabel("Label:"); label.setHorizontalAlignment(SwingConstants.RIGHT); bottomPanel.add(label); extLabel = new JTextField(); bottomPanel.add(extLabel); - label = new JLabel("Address:"); + label = DockingUtils.createNonHtmlLabel("Address:"); label.setHorizontalAlignment(SwingConstants.RIGHT); bottomPanel.add(label); extAddr = new AddressInput(); @@ -318,16 +318,18 @@ class EditExternalReferencePanel extends EditReferencePanel { return false; } if (addr == null && (label == null || label.length() == 0)) { - showInputErr("Either (or both) an external 'Label' and/or 'Address' must be specified."); + showInputErr( + "Either (or both) an external 'Label' and/or 'Address' must be specified."); return false; } // FIXME The following needs to handle labels in external namespaces too. if (editRef != null) { - return plugin.updateReference(editRef, fromCodeUnit, name, libraryProgramPathname, - addr, label); + return plugin.updateReference(editRef, fromCodeUnit, name, libraryProgramPathname, addr, + label); } - return plugin.addReference(fromCodeUnit, opIndex, name, libraryProgramPathname, addr, label); + return plugin.addReference(fromCodeUnit, opIndex, name, libraryProgramPathname, addr, + label); } @Override diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditMemoryReferencePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditMemoryReferencePanel.java index f18cbbb256..fa37ae91af 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditMemoryReferencePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditMemoryReferencePanel.java @@ -30,6 +30,7 @@ import javax.swing.table.AbstractTableModel; import org.jdom.Element; +import docking.DockingUtils; import docking.widgets.combobox.GhidraComboBox; import ghidra.app.util.AddressInput; import ghidra.program.model.address.*; @@ -49,10 +50,8 @@ class EditMemoryReferencePanel extends EditReferencePanel { private static final int MAX_HISTORY_LENGTH = 10; - private WeakHashMap> addrHistoryMap = - new WeakHashMap>(); + private WeakHashMap> addrHistoryMap = new WeakHashMap<>(); - private ReferencesPlugin plugin; // Fields required for ADD @@ -104,7 +103,7 @@ class EditMemoryReferencePanel extends EditReferencePanel { }); offsetField = new JTextField(); - addrLabel = new JLabel("Base Address:"); + addrLabel = DockingUtils.createNonHtmlLabel("Base Address:"); addrLabel.setHorizontalAlignment(SwingConstants.RIGHT); Dimension d = addrLabel.getPreferredSize(); addrLabel.setPreferredSize(d); @@ -143,7 +142,7 @@ class EditMemoryReferencePanel extends EditReferencePanel { add(addrLabel); add(addrPanel); - JLabel label = new JLabel("Ref-Type:"); + JLabel label = DockingUtils.createNonHtmlLabel("Ref-Type:"); label.setHorizontalAlignment(SwingConstants.RIGHT); add(label); add(refTypes); @@ -305,9 +304,8 @@ class EditMemoryReferencePanel extends EditReferencePanel { toAddr = fromCu.getAddress(fromOpIndex); } if (toAddr != null) { - Reference r = - p.getReferenceManager().getReference(fromCu.getMinAddress(), toAddr, - fromOpIndex); + Reference r = p.getReferenceManager().getReference(fromCu.getMinAddress(), toAddr, + fromOpIndex); if (r != null) { toAddr = null; if (r.isOffsetReference()) { @@ -425,13 +423,13 @@ class EditMemoryReferencePanel extends EditReferencePanel { space.getMaxAddress().toString(false)); return false; } - + // Don't try to process an address that is not valid. if (!toAddr.isMemoryAddress()) { showInputErr("Invalid memory address specified"); return false; } - + addHistoryAddress(fromCodeUnit.getProgram(), toAddr); toAddr = plugin.checkMemoryAddress(this, fromCodeUnit.getProgram(), toAddr, offset); @@ -466,7 +464,7 @@ class EditMemoryReferencePanel extends EditReferencePanel { private void addHistoryAddress(Program program, Address addr) { List

    list = addrHistoryMap.get(program); if (list == null) { - list = new ArrayList
    (); + list = new ArrayList<>(); addrHistoryMap.put(program, list); } list.remove(addr); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditRegisterReferencePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditRegisterReferencePanel.java index e933896ff7..0fcb1de6a0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditRegisterReferencePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditRegisterReferencePanel.java @@ -21,6 +21,7 @@ import javax.swing.JLabel; import javax.swing.SwingConstants; import javax.swing.border.EmptyBorder; +import docking.DockingUtils; import docking.widgets.combobox.GhidraComboBox; import ghidra.program.model.address.Address; import ghidra.program.model.lang.Register; @@ -29,47 +30,47 @@ import ghidra.program.model.symbol.*; import ghidra.util.layout.PairLayout; class EditRegisterReferencePanel extends EditReferencePanel { - + private static final RefType[] REGISTER_REF_TYPES = RefTypeFactory.getDataRefTypes(); private ReferencesPlugin plugin; - + // Fields required for ADD private CodeUnit fromCodeUnit; private GhidraComboBox regList; private GhidraComboBox refTypes; private int opIndex; - + // Fields required for EDIT private Reference editRef; private boolean isValidState; - + EditRegisterReferencePanel(ReferencesPlugin plugin) { super("REG"); this.plugin = plugin; buildPanel(); } - + private void buildPanel() { - setLayout(new PairLayout(10,10,160)); + setLayout(new PairLayout(10, 10, 160)); setBorder(new EmptyBorder(0, 5, 5, 5)); - + regList = new GhidraComboBox<>(); - + refTypes = new GhidraComboBox<>(REGISTER_REF_TYPES); - - JLabel label = new JLabel("Register:"); + + JLabel label = DockingUtils.createNonHtmlLabel("Register:"); label.setHorizontalAlignment(SwingConstants.RIGHT); add(label); add(regList); - - label = new JLabel("Ref-Type:"); + + label = DockingUtils.createNonHtmlLabel("Ref-Type:"); label.setHorizontalAlignment(SwingConstants.RIGHT); add(label); add(refTypes); } - + private void populateRefTypes(RefType adhocType) { refTypes.clearModel(); for (int i = 0; i < REGISTER_REF_TYPES.length; i++) { @@ -82,7 +83,7 @@ class EditRegisterReferencePanel extends EditReferencePanel { refTypes.addItem(adhocType); } } - + private void populateRegisterList(Collection registers, Register selectedRegister) { regList.clearModel(); for (Register reg : registers) { @@ -92,7 +93,7 @@ class EditRegisterReferencePanel extends EditReferencePanel { regList.setSelectedItem(selectedRegister); } } - + private TreeSet getAllowedRegisters(Instruction instr, Register requiredReg) { Program program = instr.getProgram(); Register stackPointer = program.getCompilerSpec().getStackPointer(); @@ -103,12 +104,12 @@ class EditRegisterReferencePanel extends EditReferencePanel { reg = (Register) obj; } else if (obj instanceof Address) { - reg = program.getRegister((Address)obj); + reg = program.getRegister((Address) obj); } if (reg != null) { reg = reg.getBaseRegister(); - if (!reg.isHidden() && !reg.isProcessorContext() && !reg.isProgramCounter() && - (stackPointer == null || !stackPointer.equals(reg))) { + if (!reg.isHidden() && !reg.isProcessorContext() && !reg.isProgramCounter() && + (stackPointer == null || !stackPointer.equals(reg))) { regSet.add(reg); addChildRegisters(reg, regSet); } @@ -119,16 +120,16 @@ class EditRegisterReferencePanel extends EditReferencePanel { } return regSet; } - + private void addChildRegisters(Register reg, Set regSet) { for (Register child : reg.getChildRegisters()) { regSet.add(child); addChildRegisters(child, regSet); } } - + @Override - public void initialize(CodeUnit fromCu, Reference editReference) { + public void initialize(CodeUnit fromCu, Reference editReference) { isValidState = false; if (!(fromCu instanceof Instruction)) { throw new IllegalArgumentException("Valid instruction required"); @@ -139,57 +140,58 @@ class EditRegisterReferencePanel extends EditReferencePanel { } this.fromCodeUnit = fromCu; this.editRef = editReference; - - populateRegisterList(getAllowedRegisters((Instruction)fromCu, toReg), toReg); - + + populateRegisterList(getAllowedRegisters((Instruction) fromCu, toReg), toReg); + RefType rt = editRef.getReferenceType(); populateRefTypes(rt); refTypes.setSelectedItem(rt); - + isValidState = true; } @Override - public boolean initialize(CodeUnit fromCu, int fromOpIndex, int fromSubIndex) { + public boolean initialize(CodeUnit fromCu, int fromOpIndex, int fromSubIndex) { isValidState = false; this.editRef = null; this.fromCodeUnit = fromCu; return setOpIndex(fromOpIndex); } - + private static Register findOperandRegister(Instruction instr, int opIndex) { Object[] objs = instr.getOpObjects(opIndex); if (objs.length == 1) { if (objs[0] instanceof Register) { - return (Register)objs[0]; + return (Register) objs[0]; } if (objs[0] instanceof Address) { - return instr.getProgram().getRegister((Address)objs[0]); + return instr.getProgram().getRegister((Address) objs[0]); } } return null; } - + @Override - public boolean setOpIndex(int fromOpIndex) { - + public boolean setOpIndex(int fromOpIndex) { + if (editRef != null) { throw new IllegalStateException("setOpIndex only permitted for ADD case"); } - + isValidState = false; this.opIndex = fromOpIndex; - + if (!(fromCodeUnit instanceof Instruction)) { return false; } - - Function f = fromCodeUnit.getProgram().getFunctionManager().getFunctionContaining(fromCodeUnit.getMinAddress()); + + Function f = fromCodeUnit.getProgram().getFunctionManager().getFunctionContaining( + fromCodeUnit.getMinAddress()); if (f == null) { return false; } - + Instruction instr = (Instruction) fromCodeUnit; TreeSet allowedRegisters = getAllowedRegisters(instr, null); if (allowedRegisters.isEmpty()) { @@ -197,39 +199,41 @@ class EditRegisterReferencePanel extends EditReferencePanel { } Register preferredReg = findOperandRegister(instr, fromOpIndex); populateRegisterList(allowedRegisters, preferredReg); - + populateRefTypes(null); refTypes.setSelectedItem(RefType.WRITE); - + isValidState = true; return true; } @Override - public boolean applyReference() { + public boolean applyReference() { if (!isValidState) { throw new IllegalStateException(); } - - Function f = fromCodeUnit.getProgram().getFunctionManager().getFunctionContaining(fromCodeUnit.getMinAddress()); + + Function f = fromCodeUnit.getProgram().getFunctionManager().getFunctionContaining( + fromCodeUnit.getMinAddress()); if (f == null) { // Function no longer exists - showInputErr("Register reference not permitted!\nAddress " + fromCodeUnit.getMinAddress() + " is no longer contained within a function."); + showInputErr("Register reference not permitted!\nAddress " + + fromCodeUnit.getMinAddress() + " is no longer contained within a function."); return false; } - + RefType refType = (RefType) refTypes.getSelectedItem(); if (refType == null) { showInputErr("A 'Ref-Type' must be selected."); return false; } - + Register toReg = (Register) regList.getSelectedItem(); if (toReg == null) { showInputErr("A 'Register' must be selected."); return false; } - + if (editRef != null) { return plugin.updateReference(editRef, fromCodeUnit, toReg, refType); } @@ -237,15 +241,14 @@ class EditRegisterReferencePanel extends EditReferencePanel { } @Override - public void cleanup() { + public void cleanup() { isValidState = false; fromCodeUnit = null; editRef = null; } @Override - public boolean isValidContext() { + public boolean isValidContext() { return isValidState; } } - diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditStackReferencePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditStackReferencePanel.java index 4ddb680655..1228a3ad5b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditStackReferencePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/EditStackReferencePanel.java @@ -18,6 +18,7 @@ package ghidra.app.plugin.core.references; import javax.swing.*; import javax.swing.border.EmptyBorder; +import docking.DockingUtils; import docking.widgets.combobox.GhidraComboBox; import ghidra.app.cmd.function.CallDepthChangeInfo; import ghidra.program.model.address.AddressSpace; @@ -27,49 +28,49 @@ import ghidra.program.model.symbol.*; import ghidra.util.layout.PairLayout; class EditStackReferencePanel extends EditReferencePanel { - + private static final RefType[] STACK_REF_TYPES = RefTypeFactory.getStackRefTypes(); private ReferencesPlugin plugin; - + // Fields required for ADD private CodeUnit fromCodeUnit; private int opIndex; - + // Fields required for EDIT private StackReference editRef; - + private JTextField stackOffset; private GhidraComboBox refTypes; - + private boolean isValidStackRef; private boolean isValidState; - + EditStackReferencePanel(ReferencesPlugin plugin) { super("STACK"); this.plugin = plugin; buildPanel(); } - + private void buildPanel() { - setLayout(new PairLayout(10,10,160)); + setLayout(new PairLayout(10, 10, 160)); setBorder(new EmptyBorder(0, 5, 5, 5)); - + stackOffset = new JTextField(); - + refTypes = new GhidraComboBox<>(STACK_REF_TYPES); - - JLabel label = new JLabel("Stack Offset:"); + + JLabel label = DockingUtils.createNonHtmlLabel("Stack Offset:"); label.setHorizontalAlignment(SwingConstants.RIGHT); add(label); add(stackOffset); - - label = new JLabel("Ref-Type:"); + + label = DockingUtils.createNonHtmlLabel("Ref-Type:"); label.setHorizontalAlignment(SwingConstants.RIGHT); add(label); add(refTypes); } - + private void populateRefTypes(RefType adhocType) { refTypes.clearModel(); for (RefType element : STACK_REF_TYPES) { @@ -82,107 +83,110 @@ class EditStackReferencePanel extends EditReferencePanel { refTypes.addItem(adhocType); } } - + boolean isValidStackRef() { return isValidStackRef; } - + @Override - public void initialize(CodeUnit fromCu, Reference editReference) { + public void initialize(CodeUnit fromCu, Reference editReference) { isValidState = false; if (!(fromCu instanceof Instruction) || !(editReference instanceof StackReference)) { throw new IllegalArgumentException("Valid instruction and stack reference required"); } this.fromCodeUnit = fromCu; - this.editRef = (StackReference)editReference; + this.editRef = (StackReference) editReference; if (!editRef.isStackReference()) { throw new IllegalArgumentException("Valid stack reference required"); } - + stackOffset.setText(toHexString(editRef.getStackOffset())); - + RefType rt = editRef.getReferenceType(); populateRefTypes(rt); refTypes.setSelectedItem(rt); - + isValidState = true; } @Override - public boolean initialize(CodeUnit fromCu, int fromOpIndex, int fromSubIndex) { + public boolean initialize(CodeUnit fromCu, int fromOpIndex, int fromSubIndex) { isValidState = false; this.editRef = null; this.fromCodeUnit = fromCu; - + return setOpIndex(fromOpIndex); } - + @Override - public boolean setOpIndex(int opIndex) { - + public boolean setOpIndex(int opIndex) { + if (editRef != null) { throw new IllegalStateException("setOpIndex only permitted for ADD case"); } - + isValidState = false; this.opIndex = opIndex; - - if (opIndex == EditReferencesProvider.MNEMONIC_OPINDEX || !(fromCodeUnit instanceof Instruction)) { + + if (opIndex == EditReferencesProvider.MNEMONIC_OPINDEX || + !(fromCodeUnit instanceof Instruction)) { return false; } - - Function f = fromCodeUnit.getProgram().getFunctionManager().getFunctionContaining(fromCodeUnit.getMinAddress()); + + Function f = fromCodeUnit.getProgram().getFunctionManager().getFunctionContaining( + fromCodeUnit.getMinAddress()); if (f == null) { return false; } - + RefType rt = RefTypeFactory.getDefaultStackRefType(fromCodeUnit, opIndex); CallDepthChangeInfo depth = new CallDepthChangeInfo(f); - int offset = depth.getStackOffset((Instruction)fromCodeUnit, opIndex); + int offset = depth.getStackOffset((Instruction) fromCodeUnit, opIndex); isValidStackRef = (offset != Function.INVALID_STACK_DEPTH_CHANGE); if (!isValidStackRef) { Scalar s = null; - Object[] opObjs = ((Instruction)fromCodeUnit).getOpObjects(opIndex); + Object[] opObjs = ((Instruction) fromCodeUnit).getOpObjects(opIndex); for (Object obj : opObjs) { if (obj instanceof Scalar) { if (s != null) { s = null; break; } - s = (Scalar)obj; + s = (Scalar) obj; } } - offset = s != null ? (int)s.getValue() : 0; + offset = s != null ? (int) s.getValue() : 0; } stackOffset.setText(toHexString(offset)); - + populateRefTypes(rt); refTypes.setSelectedItem(rt); - + isValidState = true; return true; } - + private String toHexString(long val) { boolean neg = (val < 0); - return (neg ? "-" : "+") + "0x" + - Long.toHexString(neg ? -val : val); + return (neg ? "-" : "+") + "0x" + Long.toHexString(neg ? -val : val); } @Override - public boolean applyReference() { + public boolean applyReference() { if (!isValidState) { throw new IllegalStateException(); } - + Program program = fromCodeUnit.getProgram(); - Function f = program.getFunctionManager().getFunctionContaining(fromCodeUnit.getMinAddress()); + Function f = + program.getFunctionManager().getFunctionContaining(fromCodeUnit.getMinAddress()); if (f == null) { // Function no longer exists - showInputErr("Stack reference not permitted!\nAddress " + fromCodeUnit.getMinAddress() + " is no longer contained within a function."); + showInputErr("Stack reference not permitted!\nAddress " + fromCodeUnit.getMinAddress() + + " is no longer contained within a function."); return false; } - + String str = stackOffset.getText(); long offset; try { @@ -192,41 +196,39 @@ class EditStackReferencePanel extends EditReferencePanel { showInputErr("Valid 'Stack Offset' is required."); return false; } - + AddressSpace stackSpace = program.getAddressFactory().getStackSpace(); long minOffset = stackSpace.getMinAddress().getOffset(); long maxOffset = stackSpace.getMaxAddress().getOffset(); if (offset < minOffset || offset > maxOffset) { - showInputErr("'Stack Offset' value too " + (offset > 0 ? "large" : "small") + - "\nMust be between " + toHexString(minOffset) + " and " + - toHexString(maxOffset)); + showInputErr("'Stack Offset' value too " + (offset > 0 ? "large" : "small") + + "\nMust be between " + toHexString(minOffset) + " and " + toHexString(maxOffset)); return false; } - + RefType refType = (RefType) refTypes.getSelectedItem(); if (refType == null) { showInputErr("A 'Ref-Type' must be selected."); return false; } - + if (editRef != null) { - return plugin.updateReference(editRef, fromCodeUnit, (int)offset, refType); + return plugin.updateReference(editRef, fromCodeUnit, (int) offset, refType); } - return plugin.addReference(fromCodeUnit, opIndex, (int)offset, refType); + return plugin.addReference(fromCodeUnit, opIndex, (int) offset, refType); } @Override - public void cleanup() { + public void cleanup() { isValidState = false; fromCodeUnit = null; editRef = null; } @Override - public boolean isValidContext() { + public boolean isValidContext() { return isValidState; } } - diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/InstructionPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/InstructionPanel.java index 95411fd0c5..5d74b17f53 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/InstructionPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/InstructionPanel.java @@ -27,6 +27,7 @@ import javax.swing.border.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import docking.DockingUtils; import docking.action.DockingAction; import docking.dnd.DropTgtAdapter; import docking.dnd.Droppable; @@ -216,21 +217,21 @@ class InstructionPanel extends JPanel implements ChangeListener { Border border = new TitledBorder(new EtchedBorder(), "Source"); setBorder(border); - addressLabel = new JLabel("FFFFFFFF"); // use a default + addressLabel = DockingUtils.createNonHtmlLabel("FFFFFFFF"); // use a default Font font = addressLabel.getFont(); monoFont = new Font("monospaced", font.getStyle(), font.getSize()); addressLabel.setFont(monoFont); addressLabel.setName("addressLabel"); - mnemonicLabel = new JLabel("movl"); + mnemonicLabel = DockingUtils.createNonHtmlLabel("movl"); mnemonicLabel.setFont(monoFont); mnemonicLabel.setName("mnemonicLabel"); mnemonicLabel.addMouseListener(mouseListener); operandLabels = new JLabel[Program.MAX_OPERANDS]; for (int i = 0; i < operandLabels.length; i++) { - operandLabels[i] = new JLabel("%ebp, "); + operandLabels[i] = DockingUtils.createNonHtmlLabel("%ebp, "); operandLabels[i].setName("operandLabels[" + i + "]"); operandLabels[i].setFont(monoFont); operandLabels[i].addMouseListener(mouseListener); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/OffsetTableDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/OffsetTableDialog.java index 55a132a656..1a5581ff95 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/OffsetTableDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/references/OffsetTableDialog.java @@ -23,6 +23,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import docking.DialogComponentProvider; +import docking.DockingUtils; import ghidra.app.util.AddressInput; import ghidra.app.util.HelpTopics; import ghidra.framework.plugintool.PluginTool; @@ -130,11 +131,13 @@ public class OffsetTableDialog extends DialogComponentProvider { panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 10, 20)); addrInput = new AddressInput(); addrInput.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { okCallback(); } }); addrInput.addChangeListener(new ChangeListener() { + @Override public void stateChanged(ChangeEvent e) { clearStatusText(); } @@ -142,12 +145,13 @@ public class OffsetTableDialog extends DialogComponentProvider { addrInput.setAddressFactory(addrFactory); addrInput.setAddress(defaultAddress); - JLabel label = new JLabel("Enter Base Address:", SwingConstants.RIGHT); + JLabel label = DockingUtils.createNonHtmlLabel("Enter Base Address:", SwingConstants.RIGHT); panel.add(label); panel.add(addrInput); - JLabel sizeLabel = new JLabel("Select Data Size (Bytes):", SwingConstants.RIGHT); - comboBox = new JComboBox(new String[] { "1", "2", "4", "8" }); + JLabel sizeLabel = + DockingUtils.createNonHtmlLabel("Select Data Size (Bytes):", SwingConstants.RIGHT); + comboBox = new JComboBox<>(new String[] { "1", "2", "4", "8" }); int pointerSize = defaultAddress.getPointerSize(); comboBox.setSelectedItem(Integer.toString(pointerSize)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/EditRegisterValueDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/EditRegisterValueDialog.java index e782983d5b..3e3dfe7246 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/EditRegisterValueDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/EditRegisterValueDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +15,6 @@ */ package ghidra.app.plugin.core.register; -import ghidra.app.util.AddressInput; -import ghidra.app.util.bean.FixedBitSizeValueField; -import ghidra.program.model.address.*; -import ghidra.program.model.lang.Register; -import ghidra.util.HelpLocation; -import ghidra.util.MessageType; -import ghidra.util.layout.PairLayout; - import java.math.BigInteger; import javax.swing.*; @@ -31,6 +22,14 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import docking.DialogComponentProvider; +import docking.DockingUtils; +import ghidra.app.util.AddressInput; +import ghidra.app.util.bean.FixedBitSizeValueField; +import ghidra.program.model.address.*; +import ghidra.program.model.lang.Register; +import ghidra.util.HelpLocation; +import ghidra.util.MessageType; +import ghidra.util.layout.PairLayout; class EditRegisterValueDialog extends DialogComponentProvider { @@ -51,10 +50,10 @@ class EditRegisterValueDialog extends DialogComponentProvider { private JComponent buildWorkPanel(Register register, Address start, Address end, BigInteger value, AddressFactory factory) { - JLabel regLabel = new JLabel("Register:"); - JLabel startAddrLabel = new JLabel("Start Address:"); - JLabel endAddrLabel = new JLabel("End Address:"); - JLabel valueLabel = new JLabel("Value:"); + JLabel regLabel = DockingUtils.createNonHtmlLabel("Register:"); + JLabel startAddrLabel = DockingUtils.createNonHtmlLabel("Start Address:"); + JLabel endAddrLabel = DockingUtils.createNonHtmlLabel("End Address:"); + JLabel valueLabel = DockingUtils.createNonHtmlLabel("Value:"); JTextField registerField = new JTextField(register.getName() + " (" + register.getBitLength() + ")"); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/SetRegisterValueDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/SetRegisterValueDialog.java index 4a8d8605f3..c539f90d84 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/SetRegisterValueDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/register/SetRegisterValueDialog.java @@ -26,6 +26,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import docking.DialogComponentProvider; +import docking.DockingUtils; import ghidra.app.util.bean.FixedBitSizeValueField; import ghidra.program.model.address.*; import ghidra.program.model.lang.Register; @@ -34,7 +35,7 @@ import ghidra.program.model.listing.Program; import ghidra.util.HelpLocation; public class SetRegisterValueDialog extends DialogComponentProvider { - private JComboBox registerComboBox; + private JComboBox registerComboBox; private FixedBitSizeValueField registerValueField; private JList addressRangeList; private BigInteger registerValue; @@ -61,8 +62,8 @@ public class SetRegisterValueDialog extends DialogComponentProvider { registerChanged(); updateOkEnablement(); setDefaultButton(okButton); - setHelpLocation(new HelpLocation("RegisterPlugin", useValueField ? "SetRegisterValues" - : "ClearRegisterValues")); + setHelpLocation(new HelpLocation("RegisterPlugin", + useValueField ? "SetRegisterValues" : "ClearRegisterValues")); setRememberSize(false); } @@ -73,12 +74,12 @@ public class SetRegisterValueDialog extends DialogComponentProvider { } private JComponent buildWorkPanel(Register[] registers) { - JLabel regLabel = new JLabel("Register:"); - JLabel valueLabel = new JLabel("Value:"); - JLabel addressLabel = new JLabel("Address(es):"); + JLabel regLabel = DockingUtils.createNonHtmlLabel("Register:"); + JLabel valueLabel = DockingUtils.createNonHtmlLabel("Value:"); + JLabel addressLabel = DockingUtils.createNonHtmlLabel("Address(es):"); addressLabel.setVerticalAlignment(SwingConstants.TOP); - registerComboBox = new JComboBox(wrapRegisters(registers)); + registerComboBox = new JComboBox<>(wrapRegisters(registers)); Font f = registerComboBox.getFont().deriveFont(13f); registerComboBox.setFont(f); registerValueField = new FixedBitSizeValueField(32, true, false); @@ -159,7 +160,7 @@ public class SetRegisterValueDialog extends DialogComponentProvider { void setSelectedRegister(Register register) { int n = registerComboBox.getItemCount(); for (int i = 0; i < n; i++) { - RegisterWrapper rw = (RegisterWrapper) registerComboBox.getItemAt(i); + RegisterWrapper rw = registerComboBox.getItemAt(i); if (rw.register == register) { registerComboBox.setSelectedIndex(i); return; @@ -185,11 +186,8 @@ public class SetRegisterValueDialog extends DialogComponentProvider { } - Object[] wrapRegisters(Register[] registers) { - if (registers.length == 0) { - return registers; - } - Object[] registerWrappers = new Object[registers.length]; + RegisterWrapper[] wrapRegisters(Register[] registers) { + RegisterWrapper[] registerWrappers = new RegisterWrapper[registers.length]; for (int i = 0; i < registers.length; i++) { registerWrappers[i] = new RegisterWrapper(registers[i]); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchDialog.java index e16d9b8888..c71d51e572 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchDialog.java @@ -21,8 +21,7 @@ import java.awt.Component; import javax.swing.*; import javax.swing.border.TitledBorder; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; +import docking.*; import docking.help.HelpService; import docking.widgets.textfield.IntegerTextField; import ghidra.app.plugin.core.scalartable.RangeFilterTextField.FilterType; @@ -326,13 +325,13 @@ public class ScalarSearchDialog extends DialogComponentProvider { setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS)); add(Box.createHorizontalStrut(4)); - add(new JLabel("Min:")); + add(DockingUtils.createNonHtmlLabel("Min:")); add(Box.createHorizontalStrut(5)); add(createMinFilterWidget()); add(Box.createHorizontalStrut(10)); - add(new JLabel("Max:")); + add(DockingUtils.createNonHtmlLabel("Max:")); add(Box.createHorizontalStrut(5)); add(createMaxFilterWidget()); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchProvider.java index 8ea3c89fa6..fe93ac93e4 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/scalartable/ScalarSearchProvider.java @@ -331,7 +331,7 @@ public class ScalarSearchProvider extends ComponentProviderAdapter setBorder(lowerBorder); add(Box.createHorizontalStrut(4)); - add(new JLabel("Min:")); + add(DockingUtils.createNonHtmlLabel("Min:")); add(Box.createHorizontalStrut(19)); minField = createFilterWidget(FilterType.MIN); @@ -339,7 +339,7 @@ public class ScalarSearchProvider extends ComponentProviderAdapter add(Box.createHorizontalStrut(10)); - add(new JLabel("Max:")); + add(DockingUtils.createNonHtmlLabel("Max:")); add(Box.createHorizontalStrut(5)); maxField = createFilterWidget(FilterType.MAX); add(maxField.getComponent()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/DraggableScriptTable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/DraggableScriptTable.java index d681cf81ed..e301edef32 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/DraggableScriptTable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/DraggableScriptTable.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +15,14 @@ */ package ghidra.app.plugin.core.script; -import generic.jar.ResourceFile; -import ghidra.util.table.GhidraTable; - import java.awt.Point; import java.awt.datatransfer.Transferable; import java.awt.dnd.*; import java.util.ArrayList; import docking.dnd.*; +import generic.jar.ResourceFile; +import ghidra.util.table.GhidraTable; public class DraggableScriptTable extends GhidraTable implements Draggable { private DragSrcAdapter dragSourceAdapter; @@ -40,8 +38,6 @@ public class DraggableScriptTable extends GhidraTable implements Draggable { super(provider.getTableModel()); this.provider = provider; - // we want to render the descriptions with newline characters - setHTMLRenderingEnabled(true); initDragNDrop(); } @@ -85,7 +81,7 @@ public class DraggableScriptTable extends GhidraTable implements Draggable { */ @Override public Transferable getTransferable(Point p) { - ArrayList arrayList = new ArrayList(); + ArrayList arrayList = new ArrayList<>(); int[] selectedRows = getSelectedRows(); for (int element : selectedRows) { arrayList.add(provider.getScriptAt(element)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptComponentProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptComponentProvider.java index 51acec58f1..ef86fbe131 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptComponentProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptComponentProvider.java @@ -630,7 +630,7 @@ public class GhidraScriptComponentProvider extends ComponentProviderAdapter { return; } if (!script.exists()) { - plugin.getTool().setStatusInfo(script.getName() + " does not exist."); + plugin.getTool().setStatusInfo("Script " + script.getName() + " does not exist."); return; } @@ -644,7 +644,7 @@ public class GhidraScriptComponentProvider extends ComponentProviderAdapter { return; } if (!script.exists()) { - plugin.getTool().setStatusInfo(script.getName() + " does not exist."); + plugin.getTool().setStatusInfo("Script " + script.getName() + " does not exist."); return; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptEditorComponentProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptEditorComponentProvider.java index d8bbaf1f0e..966f0e3b47 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptEditorComponentProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/GhidraScriptEditorComponentProvider.java @@ -324,7 +324,7 @@ public class GhidraScriptEditorComponentProvider extends ComponentProvider { return; } int result = OptionDialog.showYesNoDialog(getComponent(), getName(), - scriptSourceFile.getName() + + "File " + scriptSourceFile.getName() + " has changed. Do you want to save it first?\n"); if (result == OptionDialog.OPTION_ONE) { save(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/KeyBindingInputDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/KeyBindingInputDialog.java index 145260d59a..86e7e166e0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/KeyBindingInputDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/KeyBindingInputDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,78 +15,73 @@ */ package ghidra.app.plugin.core.script; +import java.awt.BorderLayout; +import java.awt.Component; + +import javax.swing.*; + +import docking.*; import ghidra.framework.plugintool.Plugin; import ghidra.util.HelpLocation; import ghidra.util.ReservedKeyBindings; -import java.awt.BorderLayout; -import java.awt.Component; - -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.KeyStroke; - -import docking.DialogComponentProvider; -import docking.DockingWindowManager; -import docking.KeyEntryListener; -import docking.KeyEntryTextField; - - class KeyBindingInputDialog extends DialogComponentProvider implements KeyEntryListener { - private KeyEntryTextField kbField; - private KeyStroke ks; - private boolean isCancelled; + private KeyEntryTextField kbField; + private KeyStroke ks; + private boolean isCancelled; - KeyBindingInputDialog(Component parent, String scriptName, KeyStroke currentKeyStroke, Plugin plugin, HelpLocation help) { - super("Assign Script Key Binding", true, true, true, false); + KeyBindingInputDialog(Component parent, String scriptName, KeyStroke currentKeyStroke, + Plugin plugin, HelpLocation help) { + super("Assign Script Key Binding", true, true, true, false); - JLabel label = new JLabel(scriptName); - kbField = new KeyEntryTextField(20, this); - kbField.setName("KEY_BINDING"); - kbField.setText( currentKeyStroke == null ? "" : KeyEntryTextField.parseKeyStroke(currentKeyStroke) ); + JLabel label = DockingUtils.createNonHtmlLabel(scriptName); + kbField = new KeyEntryTextField(20, this); + kbField.setName("KEY_BINDING"); + kbField.setText( + currentKeyStroke == null ? "" : KeyEntryTextField.parseKeyStroke(currentKeyStroke)); - JPanel panel = new JPanel(new BorderLayout(10,10)); - panel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); - panel.add(label, BorderLayout.NORTH); - panel.add(kbField, BorderLayout.CENTER); + JPanel panel = new JPanel(new BorderLayout(10, 10)); + panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + panel.add(label, BorderLayout.NORTH); + panel.add(kbField, BorderLayout.CENTER); - addWorkPanel(panel); - addOKButton(); - addCancelButton(); - setHelpLocation(help); + addWorkPanel(panel); + addOKButton(); + addCancelButton(); + setHelpLocation(help); - DockingWindowManager.showDialog(parent, this); - } + DockingWindowManager.showDialog(parent, this); + } - @Override - protected void okCallback() { - if ( ks != null && ReservedKeyBindings.isReservedKeystroke( ks ) ) { - setStatusText( kbField.getText() + " is a reserved keystroke" ); - return; - } - - close(); - } + @Override + protected void okCallback() { + if (ks != null && ReservedKeyBindings.isReservedKeystroke(ks)) { + setStatusText(kbField.getText() + " is a reserved keystroke"); + return; + } - @Override - protected void cancelCallback() { - super.cancelCallback(); - isCancelled = true; - } + close(); + } - boolean isCancelled() { - return isCancelled; - } + @Override + protected void cancelCallback() { + super.cancelCallback(); + isCancelled = true; + } - /** - * @see docking.KeyEntryListener#processEntry(javax.swing.KeyStroke) - */ - public void processEntry(KeyStroke keyStroke) { - ks = keyStroke; - } + boolean isCancelled() { + return isCancelled; + } - KeyStroke getKeyStroke() { - return ks; - } + /** + * @see docking.KeyEntryListener#processEntry(javax.swing.KeyStroke) + */ + @Override + public void processEntry(KeyStroke keyStroke) { + ks = keyStroke; + } + + KeyStroke getKeyStroke() { + return ks; + } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/SaveDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/SaveDialog.java index 01302f5224..a71e97aa97 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/SaveDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/script/SaveDialog.java @@ -25,8 +25,7 @@ import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; +import docking.*; import docking.widgets.MultiLineLabel; import docking.widgets.list.ListPanel; import generic.jar.ResourceFile; @@ -100,7 +99,7 @@ public class SaveDialog extends DialogComponentProvider implements ListSelection } private JPanel buildNamePanel() { - JLabel label = new JLabel("Enter script file name:"); + JLabel label = DockingUtils.createNonHtmlLabel("Enter script file name:"); nameField = new JTextField(20); nameField.setText(scriptFile == null ? "" : scriptFile.getName()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/AsciiSearchFormat.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/AsciiSearchFormat.java index ec8ec388dc..5acf4a0f08 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/AsciiSearchFormat.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/AsciiSearchFormat.java @@ -27,6 +27,7 @@ import javax.swing.border.TitledBorder; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import docking.DockingUtils; import ghidra.util.StringUtilities; public class AsciiSearchFormat extends SearchFormat { @@ -54,7 +55,7 @@ public class AsciiSearchFormat extends SearchFormat { changeListener.stateChanged(new ChangeEvent(this)); } }; - searchType = new JLabel("Encoding: "); + searchType = DockingUtils.createNonHtmlLabel("Encoding: "); encodingCB = new JComboBox<>(supportedCharsets); encodingCB.setName("Encoding Options"); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/MemSearchDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/MemSearchDialog.java index 955f11b948..4428c61be3 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/MemSearchDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchmem/MemSearchDialog.java @@ -63,7 +63,7 @@ class MemSearchDialog extends DialogComponentProvider { private JButton allButton; private JTextField valueField; private GhidraComboBox valueComboBox; - private List history = new LinkedList(); + private List history = new LinkedList<>(); private JLabel hexSeqField; private CardLayout formatOptionsLayout; private JRadioButton searchSelectionRadioButton; @@ -214,7 +214,7 @@ class MemSearchDialog extends DialogComponentProvider { private void updateCombo() { String[] list = new String[history.size()]; history.toArray(list); - valueComboBox.setModel(new DefaultComboBoxModel(list)); + valueComboBox.setModel(new DefaultComboBoxModel<>(list)); } private void truncateHistoryAsNeeded() { @@ -231,8 +231,8 @@ class MemSearchDialog extends DialogComponentProvider { } private CodeUnitSearchInfo createCodeUnitSearchInfo() { - return new CodeUnitSearchInfo(codeUnitTypesList.get(0).isSelected(), codeUnitTypesList.get( - 1).isSelected(), codeUnitTypesList.get(2).isSelected()); + return new CodeUnitSearchInfo(codeUnitTypesList.get(0).isSelected(), + codeUnitTypesList.get(1).isSelected(), codeUnitTypesList.get(2).isSelected()); } private void nextPreviousCallback(boolean forward) { @@ -248,8 +248,8 @@ class MemSearchDialog extends DialogComponentProvider { } if (searchData.isValidSearchData()) { if (plugin.searchOnce(new SearchInfo(searchData, 1, - searchSelectionRadioButton.isSelected(), forward, alignment, - allBlocks.isSelected(), createCodeUnitSearchInfo(), plugin.createTaskListener()))) { + searchSelectionRadioButton.isSelected(), forward, alignment, allBlocks.isSelected(), + createCodeUnitSearchInfo(), plugin.createTaskListener()))) { addToHistory(valueField.getText()); setStatusText("Searching..."); isSearching = true; @@ -294,9 +294,9 @@ class MemSearchDialog extends DialogComponentProvider { JPanel labelPanel = new JPanel(); labelPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); labelPanel.setLayout(new GridLayout(0, 1)); - JLabel valueLabel = new JLabel("Search Value: "); + JLabel valueLabel = DockingUtils.createNonHtmlLabel("Search Value: "); labelPanel.add(valueLabel); - JLabel hexSeqLabel = new JLabel("Hex Sequence: "); + JLabel hexSeqLabel = DockingUtils.createNonHtmlLabel("Hex Sequence: "); labelPanel.add(hexSeqLabel); JPanel inputPanel = new JPanel(); @@ -315,7 +315,7 @@ class MemSearchDialog extends DialogComponentProvider { }); inputPanel.add(valueComboBox); - hexSeqField = new JLabel(); + hexSeqField = DockingUtils.createNonHtmlLabel(); hexSeqField.setName("HexSequenceField"); hexSeqField.setBorder(BorderFactory.createLoweredBevelBorder()); inputPanel.add(hexSeqField); @@ -425,7 +425,7 @@ class MemSearchDialog extends DialogComponentProvider { ItemListener stateListener = e -> validate(); - codeUnitTypesList = new ArrayList(); + codeUnitTypesList = new ArrayList<>(); codeUnitTypesList.add(instructionsCheckBox); codeUnitTypesList.add(definedCheckBox); codeUnitTypesList.add(undefinedCheckBox); @@ -468,7 +468,7 @@ class MemSearchDialog extends DialogComponentProvider { } private Component buildAlignmentPanel() { - alignLabel = new JLabel("Alignment: "); + alignLabel = DockingUtils.createNonHtmlLabel("Alignment: "); alignField = new JTextField(5); alignField.setName("Alignment"); alignField.setText("0"); @@ -578,10 +578,12 @@ class MemSearchDialog extends DialogComponentProvider { memoryBlockGroup.add(loadedBlocks); memoryBlockGroup.add(allBlocks); - loadedBlocks.setToolTipText(HTMLUtilities.toHTML("Only searches memory blocks that are loaded in a running executable.\n " - + "Ghidra now includes memory blocks for other data such as section headers.\n" - + "This option exludes these OTHER (non loaded) blocks.")); - allBlocks.setToolTipText("Searches all memory blocks including blocks that are not actually loaded in a running executable"); + loadedBlocks.setToolTipText(HTMLUtilities.toHTML( + "Only searches memory blocks that are loaded in a running executable.\n " + + "Ghidra now includes memory blocks for other data such as section headers.\n" + + "This option exludes these OTHER (non loaded) blocks.")); + allBlocks.setToolTipText( + "Searches all memory blocks including blocks that are not actually loaded in a running executable"); JPanel directionPanel = new JPanel(); directionPanel.setLayout(new BoxLayout(directionPanel, BoxLayout.Y_AXIS)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchtext/SearchTextDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchtext/SearchTextDialog.java index f4d070a836..5a9f9525d5 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchtext/SearchTextDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/searchtext/SearchTextDialog.java @@ -216,7 +216,7 @@ class SearchTextDialog extends DialogComponentProvider { panel.setBorder(BorderFactory.createEmptyBorder(4, 4, 10, 4)); panel.setLayout(new BorderLayout()); - JLabel searchLabel = new JLabel("Search for:"); + JLabel searchLabel = DockingUtils.createNonHtmlLabel("Search for:"); valueComboBox = new GhidraComboBox<>(); valueComboBox.setEditable(true); valueField = (JTextField) valueComboBox.getEditor().getEditorComponent(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/select/SelectBlockDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/select/SelectBlockDialog.java index 329eebd5b6..be9d952085 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/select/SelectBlockDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/select/SelectBlockDialog.java @@ -22,8 +22,7 @@ import java.math.BigInteger; import javax.swing.*; -import docking.ComponentProvider; -import docking.DialogComponentProvider; +import docking.*; import docking.widgets.textfield.IntegerTextField; import ghidra.app.nav.Navigatable; import ghidra.app.nav.NavigationUtils; @@ -91,13 +90,13 @@ class SelectBlockDialog extends DialogComponentProvider { gbc.gridx = 0; gbc.gridy = 0; - main.add(new JLabel("Ending Address:"), gbc); + main.add(DockingUtils.createNonHtmlLabel("Ending Address:"), gbc); gbc.gridx++; toAddressField = new JTextField(10); main.add(toAddressField, gbc); gbc.gridx = 0; gbc.gridy++; - main.add(new JLabel("Length: "), gbc); + main.add(DockingUtils.createNonHtmlLabel("Length: "), gbc); gbc.gridx++; numberInputField = new IntegerTextField(10); numberInputField.setMaxValue(BigInteger.valueOf(Integer.MAX_VALUE)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/SearchStringDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/SearchStringDialog.java index 5427455c7d..9db883233c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/SearchStringDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/SearchStringDialog.java @@ -25,6 +25,7 @@ import javax.swing.*; import javax.swing.border.TitledBorder; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.options.editor.ButtonPanelFactory; import docking.widgets.filechooser.GhidraFileChooser; import docking.widgets.textfield.IntegerTextField; @@ -39,7 +40,7 @@ import ghidra.util.layout.PairLayout; * Dialog that allows users to search for strings within a program. */ public class SearchStringDialog extends DialogComponentProvider { - + private IntegerTextField alignField; private IntegerTextField minLengthField; private JTextField wordModelField; @@ -47,12 +48,12 @@ public class SearchStringDialog extends DialogComponentProvider { private JCheckBox pascalStringsCheckbox; private AddressSetView selectedAddressSet; private StringTablePlugin plugin; - + private JRadioButton loadedBlocksRB; private JRadioButton allBlocksRB; private JRadioButton searchSelectionRB; private JRadioButton searchAllRB; - + public SearchStringDialog(StringTablePlugin plugin, AddressSetView addressSet) { super("Search For Strings"); this.plugin = plugin; @@ -97,7 +98,8 @@ public class SearchStringDialog extends DialogComponentProvider { options.setWordModelFile(wordModelFile); } catch (IOException ioe) { - setStatusText("Select a valid model file (e.g., 'StringModel.sng') or leave blank."); + setStatusText( + "Select a valid model file (e.g., 'StringModel.sng') or leave blank."); return; } } @@ -124,21 +126,21 @@ public class SearchStringDialog extends DialogComponentProvider { */ private Component buildLeftPanel() { JPanel panel = new JPanel(); - panel.setLayout(new BorderLayout()); - panel.add(buildOptionsPanelLeft(), BorderLayout.NORTH); + panel.setLayout(new BorderLayout()); + panel.add(buildOptionsPanelLeft(), BorderLayout.NORTH); panel.add(Box.createVerticalStrut(15), BorderLayout.CENTER); panel.add(buildMemoryBlocksPanel(), BorderLayout.SOUTH); return panel; } - + /** * Returns a panel containing the widgets on the right side of the main panel. */ private Component buildRightPanel() { - + JPanel panel = new JPanel(); - panel.setLayout(new BorderLayout()); + panel.setLayout(new BorderLayout()); panel.add(buildOptionsPanelRight(), BorderLayout.NORTH); panel.add(Box.createVerticalStrut(15), BorderLayout.CENTER); panel.add(buildSelectionScopePanel(), BorderLayout.SOUTH); @@ -153,16 +155,16 @@ public class SearchStringDialog extends DialogComponentProvider { *
  • Pascal Strings
  • */ private JPanel buildOptionsPanelLeft() { - + JPanel panel = new JPanel(new GridLayout(3, 1, 10, 14)); - + nullTerminateCheckbox = new JCheckBox("Require Null Termination"); pascalStringsCheckbox = new JCheckBox("Pascal Strings"); nullTerminateCheckbox.setSelected(true); - + panel.add(nullTerminateCheckbox); panel.add(pascalStringsCheckbox); - + return panel; } @@ -174,32 +176,33 @@ public class SearchStringDialog extends DialogComponentProvider { *
  • Word Model
  • */ private JPanel buildOptionsPanelRight() { - + JPanel panel = new JPanel(new PairLayout(10, 2)); - JLabel minLengthLabel = new JLabel("Minimum Length: "); + JLabel minLengthLabel = DockingUtils.createNonHtmlLabel("Minimum Length: "); minLengthLabel.setName("minLen"); - minLengthLabel.setToolTipText("Searches for valid ascii or ascii unicode strings " - + "greater or equal to minimum search length.
    The null characters are not included " - + "in the minimum string length."); + minLengthLabel.setToolTipText("Searches for valid ascii or ascii unicode strings " + + "greater or equal to minimum search length.
    The null characters are not included " + + "in the minimum string length."); panel.add(minLengthLabel); minLengthField = new IntegerTextField(5, 5L); minLengthField.getComponent().setName("minDefault"); panel.add(minLengthField.getComponent()); - JLabel alignLabel = new JLabel("Alignment: "); + JLabel alignLabel = DockingUtils.createNonHtmlLabel("Alignment: "); alignLabel.setName("alignment"); - alignLabel.setToolTipText("Searches for strings that start on the given alignment
    " - + "value. The default alignment is processor dependent."); + alignLabel.setToolTipText( + "Searches for strings that start on the given alignment
    " + + "value. The default alignment is processor dependent."); panel.add(alignLabel); alignField = new IntegerTextField(5, 1L); alignField.getComponent().setName("alignDefault"); panel.add(alignField.getComponent()); - + createModelFieldPanel(panel); - + return panel; } @@ -209,13 +212,13 @@ public class SearchStringDialog extends DialogComponentProvider { * @param panel the parent panel this is to be added to (uses Pair layout) */ private void createModelFieldPanel(JPanel panel) { - - JLabel modelLabel = new JLabel("Word Model: "); + + JLabel modelLabel = DockingUtils.createNonHtmlLabel("Word Model: "); modelLabel.setName("wordModel"); - modelLabel.setToolTipText("" - + "Strings Analyzer model used to detect high-confidence words.
    " - + "Model files are built using Ghidra's BuildStringModels class.

    " - + "(see help for updating model)"); + modelLabel.setToolTipText( + "" + "Strings Analyzer model used to detect high-confidence words.
    " + + "Model files are built using Ghidra's BuildStringModels class.

    " + + "(see help for updating model)"); panel.add(modelLabel); JPanel modelFieldPanel = new JPanel(); @@ -223,7 +226,7 @@ public class SearchStringDialog extends DialogComponentProvider { wordModelField = new JTextField("StringModel.sng"); wordModelField.setName("modelDefault"); modelFieldPanel.add(wordModelField); - + // Set up a file chooser that allows the user to select a new *.sng file. JButton browseButton = ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE); browseButton.addActionListener(new ActionListener() { @@ -233,23 +236,23 @@ public class SearchStringDialog extends DialogComponentProvider { chooser.setTitle("Select Word Model File"); chooser.setMultiSelectionEnabled(false); chooser.setFileFilter(new ExtensionFileFilter("sng", "Word File")); - + File selectedFile = chooser.getSelectedFile(); if (selectedFile == null) { return; } - + // Important to only save off the name of the file. The NGramUtils call that // loads the file will search for the file given this name. wordModelField.setText(selectedFile.getName()); } }); - + modelFieldPanel.add(browseButton); - + panel.add(modelFieldPanel); } - + /** * Returns a panel containing the options for choosing what types of memory blocks * to use when doing a search. @@ -261,31 +264,33 @@ public class SearchStringDialog extends DialogComponentProvider { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.setBorder(BorderFactory.createTitledBorder("Memory Block Types")); - + ButtonGroup memoryBlockGroup = new ButtonGroup(); loadedBlocksRB = new JRadioButton("Loaded Blocks", true); allBlocksRB = new JRadioButton("All Blocks", false); memoryBlockGroup.add(loadedBlocksRB); memoryBlockGroup.add(allBlocksRB); - loadedBlocksRB.setToolTipText(HTMLUtilities.toHTML("Only searches memory blocks that are loaded in a running executable.\n " - + "Ghidra now includes memory blocks for other data such as section headers.\n" - + "This option exludes these other (non-loaded) blocks.")); - allBlocksRB.setToolTipText("Searches all memory blocks including blocks that are not actually loaded in a running executable"); + loadedBlocksRB.setToolTipText(HTMLUtilities.toHTML( + "Only searches memory blocks that are loaded in a running executable.\n " + + "Ghidra now includes memory blocks for other data such as section headers.\n" + + "This option exludes these other (non-loaded) blocks.")); + allBlocksRB.setToolTipText( + "Searches all memory blocks including blocks that are not actually loaded in a running executable"); panel.add(loadedBlocksRB); panel.add(allBlocksRB); - + return panel; } - + /** * Returns a panel containing the options for choosing the selection scope for the search. *
  • Search All
  • *
  • Search Selection
  • */ private JPanel buildSelectionScopePanel() { - + JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.setBorder(new TitledBorder("Selection Scope")); @@ -301,17 +306,17 @@ public class SearchStringDialog extends DialogComponentProvider { searchSelectionRB.setSelected(hasSelection()); panel.add(searchAllRB); panel.add(searchSelectionRB); - + // Disable the selection radio button if there is no selection. searchSelectionRB.setEnabled(hasSelection()); JPanel selectionPanel = new JPanel(); selectionPanel.setLayout(new BorderLayout()); selectionPanel.add(panel, BorderLayout.NORTH); - + return selectionPanel; } - + /** * Returns true if there is a user-selection in the listing. */ diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/StringTableProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/StringTableProvider.java index 6983d938f8..0309e57a4c 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/StringTableProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/string/StringTableProvider.java @@ -377,12 +377,12 @@ public class StringTableProvider extends ComponentProviderAdapter implements Dom } private Component buildOffsetPanel() { - JLabel offsetLabel = new JLabel("Offset: "); + JLabel offsetLabel = DockingUtils.createNonHtmlLabel("Offset: "); offsetField = new IntegerTextField(4, 0L); offsetField.setAllowNegativeValues(false); offsetField.addChangeListener(e -> updatePreview()); - JLabel previewLabel = new JLabel("Preview: "); + JLabel previewLabel = DockingUtils.createNonHtmlLabel("Preview: "); preview = new JTextField(5); preview.setEditable(false); preview.setEnabled(false); @@ -552,7 +552,7 @@ public class StringTableProvider extends ComponentProviderAdapter implements Dom private JComponent buildTablePanel() { stringModel = new StringTableModel(tool, options); - threadedTablePanel = new GhidraThreadedTablePanel(stringModel, 1000) { + threadedTablePanel = new GhidraThreadedTablePanel<>(stringModel, 1000) { @Override protected GTable createTable(ThreadedTableModel model) { return new StringTable(model); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symboltree/EditExternalLocationPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symboltree/EditExternalLocationPanel.java index 7037feb702..535b8f0d63 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symboltree/EditExternalLocationPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symboltree/EditExternalLocationPanel.java @@ -25,6 +25,7 @@ import javax.swing.border.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import docking.DockingUtils; import docking.DockingWindowManager; import docking.ToolTipManager; import docking.widgets.OptionDialog; @@ -119,7 +120,7 @@ class EditExternalLocationPanel extends JPanel { topPanel.setBorder( new CompoundBorder(new TitledBorder("External Program"), new EmptyBorder(0, 5, 5, 5))); - JLabel label = new JLabel("Name:"); + JLabel label = DockingUtils.createNonHtmlLabel("Name:"); label.setHorizontalAlignment(SwingConstants.RIGHT); topPanel.add(label); extLibNameComboBox = new GhidraComboBox<>(); @@ -169,7 +170,7 @@ class EditExternalLocationPanel extends JPanel { buttonPanel.add(editButton); pathPanel.add(buttonPanel, BorderLayout.EAST); - label = new JLabel("Path:"); + label = DockingUtils.createNonHtmlLabel("Path:"); label.setHorizontalAlignment(SwingConstants.RIGHT); topPanel.add(label); topPanel.add(pathPanel); @@ -178,27 +179,27 @@ class EditExternalLocationPanel extends JPanel { bottomPanel.setBorder( new CompoundBorder(new TitledBorder("External Location"), new EmptyBorder(0, 5, 5, 5))); - label = new JLabel("Type:"); + label = DockingUtils.createNonHtmlLabel("Type:"); label.setHorizontalAlignment(SwingConstants.RIGHT); bottomPanel.add(label); - extTypeLabel = new JLabel("Function"); + extTypeLabel = DockingUtils.createNonHtmlLabel("Function"); bottomPanel.add(extTypeLabel); - label = new JLabel("Label:"); + label = DockingUtils.createNonHtmlLabel("Label:"); label.setHorizontalAlignment(SwingConstants.RIGHT); bottomPanel.add(label); extLabelTextField = new JTextField(); bottomPanel.add(extLabelTextField); - label = new JLabel("Address:"); + label = DockingUtils.createNonHtmlLabel("Address:"); label.setHorizontalAlignment(SwingConstants.RIGHT); bottomPanel.add(label); extAddressInputWidget = new AddressInput(); bottomPanel.add(extAddressInputWidget); if (startingOriginalName != null) { - label = new JLabel("Original Label:"); + label = DockingUtils.createNonHtmlLabel("Original Label:"); label.setHorizontalAlignment(SwingConstants.RIGHT); bottomPanel.add(label); bottomPanel.add(buildOriginalLableFieldAndRestoreButton()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symboltree/nodes/SymbolNode.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symboltree/nodes/SymbolNode.java index d873c2ead3..0c984efe74 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symboltree/nodes/SymbolNode.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symboltree/nodes/SymbolNode.java @@ -28,6 +28,7 @@ import ghidra.program.model.address.GlobalNamespace; import ghidra.program.model.listing.CircularDependencyException; import ghidra.program.model.listing.Program; import ghidra.program.model.symbol.*; +import ghidra.util.HTMLUtilities; import ghidra.util.Msg; import ghidra.util.exception.DuplicateNameException; import ghidra.util.exception.InvalidInputException; @@ -137,7 +138,7 @@ public class SymbolNode extends GTreeSlowLoadingNode implements SymbolTreeNode { @Override public String getToolTip() { - return symbol.getName(true); + return "" + HTMLUtilities.friendlyEncodeHTML(symbol.getName(true)); } @Override diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symtable/FilterDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symtable/FilterDialog.java index 20ce6d72e2..72be4a705e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symtable/FilterDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/symtable/FilterDialog.java @@ -24,8 +24,7 @@ import javax.swing.*; import org.jdom.Element; -import docking.ComponentProvider; -import docking.DialogComponentProvider; +import docking.*; import ghidra.app.util.HelpTopics; import ghidra.framework.plugintool.PluginTool; import ghidra.util.*; @@ -161,15 +160,15 @@ public class FilterDialog extends DialogComponentProvider { JPanel infoPanel = new JPanel(new HorizontalLayout(20)); Icon icon = ResourceManager.loadImage("images/information.png"); - JLabel infoLabel = - new JLabel(HTMLUtilities.toHTML("Advanced filters do not apply to all symbol types.\n" + + JLabel infoLabel = DockingUtils.createHtmlLabel( + HTMLUtilities.toHTML("Advanced filters do not apply to all symbol types.\n" + "All symbols without applicable advanced filters will\n" + "be included. If more than one advanced filter is\n" + "applicable to a symbol type, then those symbols will\n" + "be included if any of the applicable filters match. \n" + "Filters that are not applicable to any of the selected\n" + "symbol types are disabled.")); - infoPanel.add(new JLabel(icon)); + infoPanel.add(DockingUtils.createNonHtmlLabel(icon)); infoPanel.add(infoLabel); JPanel filtersPanel = new JPanel(new GridLayout(0, 2)); 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 78f8d87512..cda763d3bf 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 @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +15,6 @@ */ package ghidra.app.plugin.core.totd; - import java.awt.*; import java.awt.event.*; import java.util.List; @@ -24,13 +22,12 @@ import java.util.List; import javax.swing.*; import javax.swing.border.Border; +import docking.*; import resources.ResourceManager; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; class TipOfTheDayDialog extends DialogComponentProvider { private static final int _24_HOURS = 86400000; - private TipOfTheDayPlugin plugin; + private TipOfTheDayPlugin plugin; private JCheckBox showTipsCheckbox; private JButton nextTipButton; private JButton closeButton; @@ -44,13 +41,14 @@ class TipOfTheDayDialog extends DialogComponentProvider { this.plugin = plugin; this.tips = tips; - if ( tips.isEmpty() ) { - tips.add( "Could not find any tips!" ); + if (tips.isEmpty()) { + tips.add("Could not find any tips!"); } - + ImageIcon tipIcon = ResourceManager.loadImage("images/help-hint.png"); - JLabel label = new JLabel("Did you know...", tipIcon, SwingConstants.LEFT); + JLabel label = + DockingUtils.createNonHtmlLabel("Did you know...", tipIcon, SwingConstants.LEFT); label.setFont(new Font("dialog", Font.BOLD, 12)); tipArea = new JTextArea(4, 30); @@ -58,7 +56,7 @@ class TipOfTheDayDialog extends DialogComponentProvider { tipArea.setFont(new Font("dialog", Font.PLAIN, 12)); tipArea.setWrapStyleWord(true); tipArea.setLineWrap(true); - tipArea.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + tipArea.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); JScrollPane tipScroll = new JScrollPane(tipArea); tipScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); @@ -69,6 +67,7 @@ class TipOfTheDayDialog extends DialogComponentProvider { showTipsCheckbox = new JCheckBox("Show Tips on Startup?"); showTipsCheckbox.setSelected(true); // TODO (FixMe) Moved this before its listener to prevent project save for now. showTipsCheckbox.addItemListener(new ItemListener() { + @Override public void itemStateChanged(ItemEvent e) { showTipsChanged(); } @@ -76,6 +75,7 @@ class TipOfTheDayDialog extends DialogComponentProvider { nextTipButton = new JButton("Next Tip"); nextTipButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { incrementTipIndex(); loadNextTip(); @@ -85,6 +85,7 @@ class TipOfTheDayDialog extends DialogComponentProvider { closeButton = new JButton("Close"); closeButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { close(); } @@ -92,16 +93,16 @@ class TipOfTheDayDialog extends DialogComponentProvider { addButton(closeButton); JPanel panel = new JPanel(new BorderLayout()); - Border panelBorder = BorderFactory.createCompoundBorder( - BorderFactory.createEmptyBorder(10,10,10,10), + Border panelBorder = + BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10), BorderFactory.createLineBorder(Color.BLACK)); panel.setBorder(panelBorder); panel.setBackground(Color.WHITE); panel.add(label, BorderLayout.NORTH); panel.add(tipScroll, BorderLayout.CENTER); - JPanel panel2 = new JPanel(new BorderLayout(5,5)); - panel2.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + JPanel panel2 = new JPanel(new BorderLayout(5, 5)); + panel2.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); panel2.add(panel, BorderLayout.CENTER); panel2.add(showTipsCheckbox, BorderLayout.SOUTH); @@ -115,18 +116,18 @@ class TipOfTheDayDialog extends DialogComponentProvider { private static long lastTipTime = 0; void show(Component parent) { - long now = System.currentTimeMillis(); - if (now - lastTipTime > _24_HOURS) { - doShow( parent ); - } - lastTipTime = now; + long now = System.currentTimeMillis(); + if (now - lastTipTime > _24_HOURS) { + doShow(parent); + } + lastTipTime = now; } - void doShow( Component parent ) { - loadNextTip(); - DockingWindowManager.showDialog(parent, this); + void doShow(Component parent) { + loadNextTip(); + DockingWindowManager.showDialog(parent, this); } - + private void incrementTipIndex() { tipIndex = (++tipIndex) % tips.size(); plugin.writePreferences(); @@ -136,7 +137,7 @@ class TipOfTheDayDialog extends DialogComponentProvider { if (tips.isEmpty()) { return; } - if (tipIndex < 0 || tipIndex > tips.size()-1) { + if (tipIndex < 0 || tipIndex > tips.size() - 1) { return; } String tip = tips.get(tipIndex); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/DbViewerComponent.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/DbViewerComponent.java index 0992bc0415..46de61bf07 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/DbViewerComponent.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/DbViewerComponent.java @@ -26,6 +26,7 @@ import javax.swing.*; import javax.swing.table.TableModel; import db.*; +import docking.DockingUtils; import docking.widgets.table.GTable; import ghidra.app.plugin.debug.dbtable.*; import ghidra.util.Msg; @@ -36,7 +37,7 @@ class DbViewerComponent extends JPanel { private static Table[] NO_TABLES = new Table[0]; - private static Comparator TABLE_NAME_COMPARATOR = new Comparator
    () { + private static Comparator
    TABLE_NAME_COMPARATOR = new Comparator<>() { @Override public int compare(Table o1, Table o2) { return (o1).getName().compareTo((o2).getName()); @@ -49,8 +50,7 @@ class DbViewerComponent extends JPanel { private JLabel dbLabel; private JComboBox combo; private Table[] tables = NO_TABLES; - private Hashtable tableStats = - new Hashtable(); + private Hashtable tableStats = new Hashtable<>(); private SwingUpdateManager updateMgr; @@ -59,10 +59,10 @@ class DbViewerComponent extends JPanel { JPanel northPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JPanel subNorthPanel = new JPanel(new PairLayout(4, 10)); - subNorthPanel.add(new JLabel("Database:")); - dbLabel = new JLabel(""); + subNorthPanel.add(DockingUtils.createNonHtmlLabel("Database:")); + dbLabel = DockingUtils.createNonHtmlLabel(); subNorthPanel.add(dbLabel); - subNorthPanel.add(new JLabel("Tables:")); + subNorthPanel.add(DockingUtils.createNonHtmlLabel("Tables:")); combo = new JComboBox<>(); combo.addActionListener(new ActionListener() { @Override @@ -226,9 +226,8 @@ class DbViewerComponent extends JPanel { size += " / " + Integer.toString(stats[1].size / 1024); } } - JLabel statsLabel = - new JLabel(recCnt + " " + intNodeCnt + " " + recNodeCnt + " " + chainBufCnt + - " " + size); + JLabel statsLabel = DockingUtils.createNonHtmlLabel( + recCnt + " " + intNodeCnt + " " + recNodeCnt + " " + chainBufCnt + " " + size); panel.add(statsLabel, BorderLayout.SOUTH); return panel; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/ShowMemoryDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/ShowMemoryDialog.java index a0025dba21..222b7ed9a0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/ShowMemoryDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/ShowMemoryDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +15,6 @@ */ package ghidra.app.plugin.debug; -import ghidra.util.layout.PairLayout; - import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.DecimalFormat; @@ -25,6 +22,8 @@ import java.text.DecimalFormat; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; +import ghidra.util.layout.PairLayout; class ShowMemoryDialog extends DialogComponentProvider { private MemoryUsagePlugin plugin; @@ -49,8 +48,8 @@ class ShowMemoryDialog extends DialogComponentProvider { maxMem.setText(df.format(runtime.maxMemory() / 1000) + "K"); totalMem.setText(df.format(runtime.totalMemory() / 1000) + "K"); freeMem.setText(df.format(runtime.freeMemory() / 1000) + "K"); - usedMem.setText(df.format((runtime.totalMemory() - runtime.freeMemory()) / 1000) + - "K"); + usedMem.setText( + df.format((runtime.totalMemory() - runtime.freeMemory()) / 1000) + "K"); } }); timer.start(); @@ -82,18 +81,18 @@ class ShowMemoryDialog extends DialogComponentProvider { private JComponent createWorkPanel() { JPanel panel = new JPanel(new PairLayout()); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - maxMem = new JLabel("00000000000", SwingConstants.RIGHT); - totalMem = new JLabel("00000000000", SwingConstants.RIGHT); - freeMem = new JLabel("00000000000", SwingConstants.RIGHT); - usedMem = new JLabel("00000000000", SwingConstants.RIGHT); + maxMem = DockingUtils.createNonHtmlLabel("00000000000", SwingConstants.RIGHT); + totalMem = DockingUtils.createNonHtmlLabel("00000000000", SwingConstants.RIGHT); + freeMem = DockingUtils.createNonHtmlLabel("00000000000", SwingConstants.RIGHT); + usedMem = DockingUtils.createNonHtmlLabel("00000000000", SwingConstants.RIGHT); - panel.add(new JLabel("Max Memory:")); + panel.add(DockingUtils.createNonHtmlLabel("Max Memory:")); panel.add(maxMem); - panel.add(new JLabel("Total Memory:")); + panel.add(DockingUtils.createNonHtmlLabel("Total Memory:")); panel.add(totalMem); - panel.add(new JLabel("Free Memory:")); + panel.add(DockingUtils.createNonHtmlLabel("Free Memory:")); panel.add(freeMem); - panel.add(new JLabel("Used Memory:")); + panel.add(DockingUtils.createNonHtmlLabel("Used Memory:")); panel.add(usedMem); return panel; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/script/AskDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/script/AskDialog.java index db743d592a..2b7c201692 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/script/AskDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/script/AskDialog.java @@ -21,8 +21,7 @@ import java.util.List; import javax.swing.*; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; +import docking.*; import generic.util.WindowUtilities; import ghidra.framework.preferences.Preferences; import ghidra.util.NumericUtilities; @@ -74,7 +73,7 @@ public class AskDialog extends DialogComponentProvider { JPanel panel = new JPanel(new BorderLayout(10, 10)); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - label = new JLabel(message); + label = DockingUtils.createNonHtmlLabel(message); panel.add(label, BorderLayout.WEST); if (choices == null) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/script/GatherParamPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/script/GatherParamPanel.java index 2091e19549..fbfcef2c99 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/script/GatherParamPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/script/GatherParamPanel.java @@ -20,8 +20,10 @@ import java.awt.GridLayout; import java.io.File; import java.util.HashMap; -import javax.swing.*; +import javax.swing.JPanel; +import javax.swing.JTextField; +import docking.DockingUtils; import docking.widgets.filechooser.GhidraFileChooserMode; import docking.widgets.filechooser.GhidraFileChooserPanel; import ghidra.app.util.AddressInput; @@ -96,8 +98,7 @@ public class GatherParamPanel extends JPanel { displayComponent = textField; parameters.put(key, new ParamComponent(displayComponent, type)); } - JLabel displayLabel = new JLabel(label); - add(displayLabel); + add(DockingUtils.createNonHtmlLabel(label)); add(displayComponent); shown = false; } @@ -110,7 +111,7 @@ public class GatherParamPanel extends JPanel { } public void setParamsInState() { - for (String string2 : parameters.keySet()) {//OMG!! + for (String string2 : parameters.keySet()) { String key = string2.toString(); ParamComponent pc = parameters.get(key); switch (pc.getType()) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScript.java b/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScript.java index 80973df175..6c5ac7a1a0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScript.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/script/GhidraScript.java @@ -387,7 +387,8 @@ public abstract class GhidraScript extends FlatProgramAPI { protected boolean promptToKeepChangesOnException() { - String message = "Encountered exception running script \"" + sourceFile.getName() + + String message = "Encountered exception running script \"" + + HTMLUtilities.friendlyEncodeHTML(sourceFile.getName()) + "\".

    Keep the changes to the program?"; //@formatter:off int choice = diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/script/MultipleOptionsDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/script/MultipleOptionsDialog.java index 44529b2ac5..390f6eb19f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/script/MultipleOptionsDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/script/MultipleOptionsDialog.java @@ -24,8 +24,7 @@ import java.util.List; import javax.swing.*; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; +import docking.*; import ghidra.util.Msg; public class MultipleOptionsDialog extends DialogComponentProvider { @@ -70,7 +69,7 @@ public class MultipleOptionsDialog extends DialogComponentProvider { JPanel panel = new JPanel(new GridLayout(0, 1)); panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JLabel label = new JLabel(message); + JLabel label = DockingUtils.createNonHtmlLabel(message); panel.add(label, BorderLayout.WEST); if (includeSelectAll) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/script/ScriptInfo.java b/Ghidra/Features/Base/src/main/java/ghidra/app/script/ScriptInfo.java index 7a3877626e..04ed59f735 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/script/ScriptInfo.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/script/ScriptInfo.java @@ -15,7 +15,8 @@ */ package ghidra.app.script; -import static ghidra.util.HTMLUtilities.*; +import static ghidra.util.HTMLUtilities.HTML_NEW_LINE; +import static ghidra.util.HTMLUtilities.HTML_SPACE; import java.io.*; import java.util.List; @@ -77,8 +78,8 @@ public class ScriptInfo { this.sourceFile = sourceFile; if (!sourceFile.exists()) { - throw new IllegalArgumentException("Source file for script does not exist!: " + - sourceFile); + throw new IllegalArgumentException( + "Source file for script does not exist!: " + sourceFile); } } @@ -92,7 +93,7 @@ public class ScriptInfo { toolbarImage = null; keybindingErrorMessage = null; } - + /** * Setting the toolbar image to null forces it to be reloaded on the next request. */ @@ -402,7 +403,7 @@ public class ScriptInfo { * @return the script tool bar icon */ public ImageIcon getToolBarImage(boolean scaled) { - + parseHeader(); if (toolbar == null) { return null; @@ -432,21 +433,23 @@ public class ScriptInfo { * @return a string designed to be used as a tool tip */ public String getToolTipText() { - String htmlDescription = - description == null ? "No Description" : description.replaceAll("\n", HTML_NEW_LINE + - HTML_SPACE); - String htmlAuthor = HTMLUtilities.bold("Author:") + HTML_SPACE + (toToolTip(author)); + String htmlDescription = (description == null) ? "No Description" + : HTMLUtilities.friendlyEncodeHTML(description).replaceAll("\n", + HTML_NEW_LINE + HTML_SPACE); + String htmlAuthor = HTMLUtilities.bold("Author:") + HTML_SPACE + + HTMLUtilities.friendlyEncodeHTML(toToolTip(author)); String htmlCategory = - HTMLUtilities.bold("Category:") + HTML_SPACE + - toToolTip(StringUtilities.convertStringArray(category, ".")); + HTMLUtilities.bold("Category:") + HTML_SPACE + HTMLUtilities.friendlyEncodeHTML( + toToolTip(StringUtilities.convertStringArray(category, "."))); String htmlKeyBinding = HTMLUtilities.bold("Key Binding:") + HTML_SPACE + getKeybindingToolTip(); String htmlMenuPath = - HTMLUtilities.bold("Menu Path:") + HTML_SPACE + - toToolTip(StringUtilities.convertStringArray(menupath, ".")); + HTMLUtilities.bold("Menu Path:") + HTML_SPACE + HTMLUtilities.friendlyEncodeHTML( + toToolTip(StringUtilities.convertStringArray(menupath, "."))); - StringBuffer buffer = new StringBuffer(); - buffer.append("

    ").append(HTML_SPACE).append(getName()).append("

    "); + StringBuilder buffer = new StringBuilder(); + buffer.append("

    ").append(HTML_SPACE).append( + HTMLUtilities.friendlyEncodeHTML(getName())).append("

    "); buffer.append(HTML_NEW_LINE); buffer.append(HTML_SPACE).append(htmlDescription); buffer.append(HTML_NEW_LINE); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddEditDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddEditDialog.java index 8dadf81ea7..00668fbfce 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddEditDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddEditDialog.java @@ -24,8 +24,7 @@ import javax.swing.border.*; import org.apache.commons.lang3.StringUtils; -import docking.ComponentProvider; -import docking.DialogComponentProvider; +import docking.*; import docking.widgets.combobox.GhidraComboBox; import ghidra.app.cmd.label.*; import ghidra.framework.cmd.CompoundCmd; @@ -428,7 +427,9 @@ public class AddEditDialog extends DialogComponentProvider { */ private JPanel create() { labelNameChoices = new GhidraComboBox<>(); + DockingUtils.turnOffHTMLRendering(labelNameChoices); GhidraComboBox comboBox = new GhidraComboBox<>(); + DockingUtils.turnOffHTMLRendering(comboBox); comboBox.setEnterKeyForwarding(true); namespaceChoices = comboBox; 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 5b3f18feb8..622a5664bc 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 @@ -25,6 +25,7 @@ import java.util.Comparator; import javax.swing.*; import javax.swing.event.*; +import docking.DockingUtils; import ghidra.program.model.address.*; /** @@ -41,9 +42,9 @@ public class AddressInput extends JPanel { private boolean updateSpaceField; private boolean stateChanging; private JTextField spaceField; - + private static final Comparator ADDRESS_SPACE_SORT_COMPARATOR = - new Comparator() { + new Comparator<>() { @Override public int compare(AddressSpace s1, AddressSpace s2) { if (s1.isOverlaySpace()) { @@ -68,6 +69,7 @@ public class AddressInput extends JPanel { textField.setName("JTextField");//for JUnits... combo = new JComboBox<>(); combo.setName("JComboBox");//for JUnits... + DockingUtils.turnOffHTMLRendering(combo); add(textField, BorderLayout.CENTER); //add(combo, BorderLayout.WEST); comboAdded = false; @@ -194,7 +196,7 @@ public class AddressInput extends JPanel { // We don't want to let users create functions in certain memory spaces (eg: OTHER), // so don't populate the model with them. if (!spaces[i].isLoadedMemorySpace()) { - continue; + //continue; } String s = spaces[i].toString(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressSetEditorPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressSetEditorPanel.java index 41edca851a..673aa3e1cb 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressSetEditorPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/AddressSetEditorPanel.java @@ -24,6 +24,7 @@ import java.util.List; import javax.swing.*; import javax.swing.event.*; +import docking.DockingUtils; import ghidra.program.model.address.*; import ghidra.util.layout.MiddleLayout; import resources.ResourceManager; @@ -39,7 +40,7 @@ public class AddressSetEditorPanel extends JPanel { private JButton removeRangeButton; private AddressSetListModel listModel; private JList list; - private HashSet listeners = new HashSet(); + private HashSet listeners = new HashSet<>(); private JButton subtractRangeButton; private final AddressSet addressSet; private final AddressFactory addressFactory; @@ -62,7 +63,7 @@ public class AddressSetEditorPanel extends JPanel { private JPanel createAddRangePanel() { JPanel minAddressPanel = new JPanel(); minAddressPanel.setLayout(new BorderLayout()); - JLabel minLabel = new JLabel("Min:"); + JLabel minLabel = DockingUtils.createNonHtmlLabel("Min:"); minLabel.setToolTipText("Enter minimum address to add or remove"); minAddressPanel.add(minLabel, BorderLayout.WEST); minAddressField = new AddressInput(); @@ -78,7 +79,7 @@ public class AddressSetEditorPanel extends JPanel { JPanel maxAddressPanel = new JPanel(); maxAddressPanel.setLayout(new BorderLayout()); - JLabel maxLabel = new JLabel("Max:"); + JLabel maxLabel = DockingUtils.createNonHtmlLabel("Max:"); maxLabel.setToolTipText("Enter maximum address to add or remove"); maxAddressPanel.add(maxLabel, BorderLayout.WEST); maxAddressField = new AddressInput(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/BlockPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/BlockPanel.java index 3d219f1350..80d9f05b19 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/BlockPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/BlockPanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +15,16 @@ */ package ghidra.app.util; -import ghidra.app.util.viewer.util.AddressPixelMap; -import ghidra.program.model.mem.MemoryBlock; - import java.awt.*; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import javax.swing.*; +import docking.DockingUtils; +import ghidra.app.util.viewer.util.AddressPixelMap; +import ghidra.program.model.mem.MemoryBlock; + public class BlockPanel extends JPanel implements ComponentListener { private static final long serialVersionUID = 1L; private static final int SPACING = 5; @@ -37,8 +37,8 @@ public class BlockPanel extends JPanel implements ComponentListener { setBackground(Color.WHITE); addComponentListener(this); metrics = getFontMetrics(FONT); - setPreferredSize(new Dimension(100, SPACING + metrics.getMaxAscent() + - metrics.getMaxDescent())); + setPreferredSize( + new Dimension(100, SPACING + metrics.getMaxAscent() + metrics.getMaxDescent())); } @Override @@ -49,8 +49,9 @@ public class BlockPanel extends JPanel implements ComponentListener { int height = getHeight(); MemoryBlock[] blocks = map.getBlocks(); - if (blocks == null) + if (blocks == null) { return; + } for (int i = 0; i < blocks.length; i++) { Rectangle rect = map.getBlockPosition(blocks[i]); @@ -93,7 +94,7 @@ public class BlockPanel extends JPanel implements ComponentListener { } for (MemoryBlock block : blocks) { - final JLabel label = new JLabel(block.getName()); + JLabel label = DockingUtils.createNonHtmlLabel(block.getName()); label.setFont(FONT); label.setHorizontalAlignment(SwingConstants.CENTER); label.setToolTipText(block.getName()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/OptionsEditorPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/OptionsEditorPanel.java index 4226c6c286..6d92524bd8 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/OptionsEditorPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/OptionsEditorPanel.java @@ -27,6 +27,7 @@ import javax.swing.event.DocumentListener; import org.apache.commons.collections4.map.LazyMap; +import docking.DockingUtils; import docking.DockingWindowManager; import docking.widgets.textfield.IntegerTextField; import ghidra.app.util.opinion.AbstractLibrarySupportLoader; @@ -70,7 +71,7 @@ public class OptionsEditorPanel extends JPanel { panel.setBorder(createBorder(group)); for (Option option : optionGroup) { - panel.add(new JLabel(option.getName(), SwingConstants.RIGHT)); + panel.add(DockingUtils.createNonHtmlLabel(option.getName(), SwingConstants.RIGHT)); Component editorComponent = getEditorComponent(option); editorComponent.setName(option.getName()); // set the component name to the option name panel.add(editorComponent); @@ -234,6 +235,7 @@ public class OptionsEditorPanel extends JPanel { private Component getAddressSpaceEditorComponent(Option option) { JComboBox combo = new JComboBox<>(); + DockingUtils.turnOffHTMLRendering(combo); AddressFactory addressFactory = addressFactoryService.getAddressFactory(); AddressSpace[] spaces = addressFactory == null ? new AddressSpace[0] : addressFactory.getAddressSpaces(); @@ -244,6 +246,9 @@ public class OptionsEditorPanel extends JPanel { if (space != null) { combo.setSelectedItem(space); } + combo.addActionListener(e -> { + option.setValue(combo.getSelectedItem()); + }); return combo; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bean/SelectLanguagePanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bean/SelectLanguagePanel.java index f40c3bb396..b48ce1c38f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bean/SelectLanguagePanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bean/SelectLanguagePanel.java @@ -28,6 +28,7 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.table.TableColumnModel; +import docking.DockingUtils; import docking.widgets.table.AbstractSortedTableModel; import docking.widgets.table.TableSortingContext; import ghidra.program.model.lang.*; @@ -109,7 +110,7 @@ public class SelectLanguagePanel extends JPanel { }); JPanel filterPanel = new JPanel(new BorderLayout()); - filterPanel.add(new JLabel("Filter:"), BorderLayout.WEST); + filterPanel.add(DockingUtils.createNonHtmlLabel("Filter:"), BorderLayout.WEST); filterPanel.add(filterField, BorderLayout.CENTER); setLayout(new BorderLayout(10, 10)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bean/SetEquateDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bean/SetEquateDialog.java index a089499d08..b3a9060910 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bean/SetEquateDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bean/SetEquateDialog.java @@ -28,6 +28,7 @@ import javax.swing.table.TableColumnModel; import org.apache.commons.lang3.StringUtils; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.filter.FilterListener; import docking.widgets.table.GTableCellRenderingData; import ghidra.app.context.ListingActionContext; @@ -222,13 +223,13 @@ public class SetEquateDialog extends DialogComponentProvider { */ protected JPanel buildMainPanel() { - titleLabel = new JLabel("Possible Matches"); + titleLabel = DockingUtils.createNonHtmlLabel("Possible Matches"); titleLabel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); //long value = scalar.getSignedValue(); String labelText = "Scalar Value: " + scalar.toString(16, false, true, "0x", "") + " (" + scalar.toString(10, false, true, "", "") + ")"; - JLabel label = new JLabel(labelText); + JLabel label = DockingUtils.createNonHtmlLabel(labelText); label.setName("EquateField"); applyToCurrent = new JRadioButton("Current location", true); applyToCurrent.setName("applyToCurrent"); @@ -315,7 +316,7 @@ public class SetEquateDialog extends DialogComponentProvider { JPanel scopePanel = new JPanel(new HorizontalLayout(2)); scopePanel.setBorder(BorderFactory.createEmptyBorder(10, 5, 0, 5)); - scopePanel.add(new JLabel("Apply To: ")); + scopePanel.add(DockingUtils.createNonHtmlLabel("Apply To: ")); scopePanel.add(applyToCurrent); scopePanel.add(applyToSelection); scopePanel.add(applyToAll); @@ -323,7 +324,7 @@ public class SetEquateDialog extends DialogComponentProvider { JPanel optionsPanel = new JPanel(new HorizontalLayout(2)); optionsPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5)); - optionsPanel.add(new JLabel("Options: ")); + optionsPanel.add(DockingUtils.createNonHtmlLabel("Options: ")); optionsPanel.add(overwriteExistingEquates); JPanel southPanel = new JPanel(new VerticalLayout(0)); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/COMDescriptorDataDirectory.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/COMDescriptorDataDirectory.java index 6a36eef849..03bd95146d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/COMDescriptorDataDirectory.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/COMDescriptorDataDirectory.java @@ -86,7 +86,7 @@ public class COMDescriptorDataDirectory extends DataDirectory { NTHeader ntHeader) throws DuplicateNameException, CodeUnitInsertionException, IOException, MemoryAccessException { - monitor.setMessage(program.getName() + ": com descriptor(s)..."); + monitor.setMessage("[" + program.getName() + "]: com descriptor(s)..."); Address addr = PeUtils.getMarkupAddress(program, isBinary, ntHeader, virtualAddress); if (!program.getMemory().contains(addr)) { return; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ExportDataDirectory.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ExportDataDirectory.java index 96691c5918..3ddd1ef447 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ExportDataDirectory.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ExportDataDirectory.java @@ -97,8 +97,9 @@ public class ExportDataDirectory extends DataDirectory { throws IOException { processDataDirectory(ntHeader, reader); - if (exports == null) + if (exports == null) { exports = new ExportInfo[0]; + } } /** @@ -161,7 +162,7 @@ public class ExportDataDirectory extends DataDirectory { public void markup(Program program, boolean isBinary, TaskMonitor monitor, MessageLog log, NTHeader ntHeader) throws DuplicateNameException, CodeUnitInsertionException, DataTypeConflictException, IOException { - monitor.setMessage(program.getName() + ": exports..."); + monitor.setMessage("[" + program.getName() + "]: exports..."); Address addr = PeUtils.getMarkupAddress(program, isBinary, ntHeader, virtualAddress); if (!program.getMemory().contains(addr)) { @@ -310,7 +311,7 @@ public class ExportDataDirectory extends DataDirectory { numberOfNames = 0; } - List exportList = new ArrayList(); + List exportList = new ArrayList<>(); for (int i = 0; i < numberOfFunctions; ++i) { int entryPointRVA = reader.readInt(pointerToFunctions); @@ -348,9 +349,8 @@ public class ExportDataDirectory extends DataDirectory { } } - String cmt = - "0x" + Integer.toHexString(entryPointRVA) + " " + Integer.toString(i + base) + - " " + lname; + String cmt = "0x" + Integer.toHexString(entryPointRVA) + " " + + Integer.toString(i + base) + " " + lname; boolean forwarded = false; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ImportDataDirectory.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ImportDataDirectory.java index 771d783a94..2499be4385 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ImportDataDirectory.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ImportDataDirectory.java @@ -60,10 +60,12 @@ public class ImportDataDirectory extends DataDirectory { throws IOException { processDataDirectory(ntHeader, reader); - if (imports == null) + if (imports == null) { imports = new ImportInfo[0]; - if (descriptors == null) + } + if (descriptors == null) { descriptors = new ImportDescriptor[0]; + } } /** @@ -95,7 +97,7 @@ public class ImportDataDirectory extends DataDirectory { if (imports == null || descriptors == null) { return; } - monitor.setMessage(program.getName() + ": import(s)..."); + monitor.setMessage("[" + program.getName() + "]: import(s)..."); Address addr = PeUtils.getMarkupAddress(program, isBinary, ntHeader, virtualAddress); if (!program.getMemory().contains(addr)) { return; @@ -122,11 +124,13 @@ public class ImportDataDirectory extends DataDirectory { String dll = descriptor.getDLL(); if (dll != null && dll.startsWith(program.getName())) { - Msg.warn(this, program.getName()+" potentially modified via import of local exports"); + Msg.warn(this, + program.getName() + " potentially modified via import of local exports"); DataDirectory[] dataDirectories = ntHeader.getOptionalHeader().getDataDirectories(); - exportDirectory = (ExportDataDirectory) dataDirectories[OptionalHeader.IMAGE_DIRECTORY_ENTRY_EXPORT]; + exportDirectory = + (ExportDataDirectory) dataDirectories[OptionalHeader.IMAGE_DIRECTORY_ENTRY_EXPORT]; } - + long nameAddr = va(descriptor.getName(), isBinary); Address nameAddress = space.getAddress(nameAddr); @@ -148,8 +152,10 @@ public class ImportDataDirectory extends DataDirectory { try { markupINT(intptr, iatptr, isBinary, program, thunks[j], log); markupIAT(iatptr, isBinary, program, log); - } catch (MemoryAccessException mae) { - Msg.error(this, "Invalid memory access for iaptr "+Integer.toHexString(iatptr)); + } + catch (MemoryAccessException mae) { + Msg.error(this, + "Invalid memory access for iaptr " + Integer.toHexString(iatptr)); break; } @@ -158,14 +164,17 @@ public class ImportDataDirectory extends DataDirectory { ExportInfo exportInfo = exportDirectory.getExports()[j]; long address = exportInfo.getAddress(); long thunkAddr = va(intptr, isBinary); - byte[] bytes = ntHeader.getOptionalHeader().is64bit() ? conv.getBytes(address) : conv.getBytes((int)address); + byte[] bytes = ntHeader.getOptionalHeader().is64bit() ? conv.getBytes(address) + : conv.getBytes((int) address); try { - program.getMemory().setBytes(program.getImageBase().getAddress(Long.toHexString(thunkAddr)), bytes); - } catch (AddressFormatException e) { - Msg.warn(this, "Unable to convert "+thunkAddr); + program.getMemory().setBytes( + program.getImageBase().getAddress(Long.toHexString(thunkAddr)), bytes); + } + catch (AddressFormatException e) { + Msg.warn(this, "Unable to convert " + thunkAddr); } } - + intptr += thunks[j].getStructSize(); iatptr += thunks[j].getStructSize(); @@ -178,7 +187,7 @@ public class ImportDataDirectory extends DataDirectory { Address ibnNameAddress = ibnAddress.add(WORD.getLength()); PeUtils.createData(program, ibnNameAddress, tsdt, log); } - + } } } @@ -220,8 +229,8 @@ public class ImportDataDirectory extends DataDirectory { @Override public boolean parse() throws IOException { - List importList = new ArrayList(); - List descriptorsList = new ArrayList(); + List importList = new ArrayList<>(); + List descriptorsList = new ArrayList<>(); int ptr = getPointer(); if (ptr < 0) { @@ -238,54 +247,55 @@ public class ImportDataDirectory extends DataDirectory { } descriptorsList.add(id); - if (id.getName() == 0 && id.getTimeDateStamp() == 0) + if (id.getName() == 0 && id.getTimeDateStamp() == 0) { break; + } int tmpPtr = ntHeader.rvaToPointer(id.getName()); - if (tmpPtr < 0) { - //Msg.error(this, "Invalid RVA "+id.getName()); + if (tmpPtr < 0) { + //Msg.error(this, "Invalid RVA "+id.getName()); id = ImportDescriptor.createImportDescriptor(reader, ptr); - continue; - } + continue; + } String dllName = reader.readAsciiString(tmpPtr); id.setDLL(dllName); - if (id.getOriginalFirstThunk() == 0 && id.getFirstThunk() == 0) + if (id.getOriginalFirstThunk() == 0 && id.getFirstThunk() == 0) { return false; + } int intptr = -1; - if (id.getOriginalFirstThunk() != 0) { + if (id.getOriginalFirstThunk() != 0) { intptr = ntHeader.rvaToPointer(id.getOriginalFirstThunk()); } if (intptr < 0) { intptr = ntHeader.rvaToPointer(id.getFirstThunk()); } - if (intptr < 0) { - Msg.error(this, "Invalid RVA "+Integer.toHexString(id.getOriginalFirstThunk())+" : "+Integer.toHexString(id.getFirstThunk())); + if (intptr < 0) { + Msg.error(this, "Invalid RVA " + Integer.toHexString(id.getOriginalFirstThunk()) + + " : " + Integer.toHexString(id.getFirstThunk())); id = ImportDescriptor.createImportDescriptor(reader, ptr); - return false; - } + return false; + } int iatptr = ntHeader.rvaToPointer(id.getFirstThunk()); int nextPosToCreateExternalRef = 0; while (true) { - if (!ntHeader.checkPointer(intptr)) { - Msg.error(this, "Invalid file index "+Integer.toHexString(intptr)); - break; - } - if (!ntHeader.checkPointer(iatptr)) { - Msg.error(this, "Invalid file index "+Integer.toHexString(iatptr)); - break; - } - - ThunkData intThunk = - ThunkData.createThunkData(reader, intptr, - ntHeader.getOptionalHeader().is64bit()); + if (!ntHeader.checkPointer(intptr)) { + Msg.error(this, "Invalid file index " + Integer.toHexString(intptr)); + break; + } + if (!ntHeader.checkPointer(iatptr)) { + Msg.error(this, "Invalid file index " + Integer.toHexString(iatptr)); + break; + } + + ThunkData intThunk = ThunkData.createThunkData(reader, intptr, + ntHeader.getOptionalHeader().is64bit()); intptr += intThunk.getStructSize(); - ThunkData iatThunk = - ThunkData.createThunkData(reader, iatptr, - ntHeader.getOptionalHeader().is64bit()); + ThunkData iatThunk = ThunkData.createThunkData(reader, iatptr, + ntHeader.getOptionalHeader().is64bit()); iatptr += iatThunk.getStructSize(); if (intThunk.getAddressOfData() == 0) { @@ -308,10 +318,11 @@ public class ImportDataDirectory extends DataDirectory { else { // retrieve the IMAGE_IMPORT_BY_NAME struct, but do so in pieces int ptrToData = ntHeader.rvaToPointer((int) intThunk.getAddressOfData()); - if (ptrToData < 0) { - Msg.error(this, "Invalid RVA "+Long.toHexString(intThunk.getAddressOfData())); - break; - } + if (ptrToData < 0) { + Msg.error(this, + "Invalid RVA " + Long.toHexString(intThunk.getAddressOfData())); + break; + } ImportByName ibn = ImportByName.createImportByName(reader, ptrToData); intThunk.setImportByName(ibn); @@ -338,8 +349,8 @@ public class ImportDataDirectory extends DataDirectory { Msg.error(this, "Too many imports"); return false; } - importList.add(new ImportInfo(addr, cmt.toString(), dllName, boundName, - id.isBound())); + importList.add( + new ImportInfo(addr, cmt.toString(), dllName, boundName, id.isBound())); } id = ImportDescriptor.createImportDescriptor(reader, ptr); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PeUtils.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PeUtils.java index 3aef21b306..54ede958c8 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PeUtils.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/PeUtils.java @@ -54,8 +54,8 @@ public class PeUtils { return program.getListing().getDefinedDataAt(addr); } catch (CodeUnitInsertionException e) { - log.appendMsg(program.getName() + ": failed to create " + datatype.getDisplayName() + - " at " + addr + ": " + e.getMessage()); + log.appendMsg("[" + program.getName() + "]: failed to create " + + datatype.getDisplayName() + " at " + addr + ": " + e.getMessage()); } catch (Exception e) { log.appendMsg(e.getMessage()); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ResourceDataDirectory.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ResourceDataDirectory.java index 58e6fdc07e..df61233577 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ResourceDataDirectory.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/ResourceDataDirectory.java @@ -198,7 +198,7 @@ public class ResourceDataDirectory extends DataDirectory { if (rootDirectory == null) { return; } - monitor.setMessage(program.getName() + ": resources..."); + monitor.setMessage("[" + program.getName() + "]: resources..."); Address addr = PeUtils.getMarkupAddress(program, isBinary, ntHeader, virtualAddress); if (!program.getMemory().contains(addr)) { return; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/cli/CliMetadataDirectory.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/cli/CliMetadataDirectory.java index 9505f221a6..3893b3d511 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/cli/CliMetadataDirectory.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/cli/CliMetadataDirectory.java @@ -32,25 +32,27 @@ import ghidra.util.task.TaskMonitor; * The Metadata directory pointed found in {@link ImageCor20Header}. */ public class CliMetadataDirectory extends DataDirectory { - + private final static String NAME = "CLI_METADATA_DIRECTORY"; private CliMetadataRoot metadataRoot; public static CliMetadataDirectory createCliMetadataDirectory(NTHeader ntHeader, FactoryBundledWithBinaryReader reader) throws IOException { - CliMetadataDirectory cliMetadataDirectory = (CliMetadataDirectory) reader.getFactory().create(CliMetadataDirectory.class); + CliMetadataDirectory cliMetadataDirectory = + (CliMetadataDirectory) reader.getFactory().create(CliMetadataDirectory.class); cliMetadataDirectory.initCliMetadataDirectory(ntHeader, reader); - return cliMetadataDirectory; + return cliMetadataDirectory; } - /** - * DO NOT USE THIS CONSTRUCTOR, USE create*(GenericFactory ...) FACTORY METHODS INSTEAD. - */ - public CliMetadataDirectory() {} + /** + * DO NOT USE THIS CONSTRUCTOR, USE create*(GenericFactory ...) FACTORY METHODS INSTEAD. + */ + public CliMetadataDirectory() { + } - private void initCliMetadataDirectory(NTHeader ntHeader, - FactoryBundledWithBinaryReader reader) throws IOException { + private void initCliMetadataDirectory(NTHeader ntHeader, FactoryBundledWithBinaryReader reader) + throws IOException { this.ntHeader = ntHeader; this.reader = reader; @@ -72,31 +74,31 @@ public class CliMetadataDirectory extends DataDirectory { return NAME; } - @Override + @Override public boolean parse() throws IOException { int ptr = getPointer(); if (ptr < 0 || this.size == 0) { return false; } - - long origIndex = reader.getPointerIndex(); - reader.setPointerIndex(ptr); + + long origIndex = reader.getPointerIndex(); + reader.setPointerIndex(ptr); metadataRoot = new CliMetadataRoot(reader, virtualAddress); hasParsed = metadataRoot.parse(); reader.setPointerIndex(origIndex); return hasParsed; - } + } @Override public void markup(Program program, boolean isBinary, TaskMonitor monitor, MessageLog log, NTHeader ntHeader) throws DuplicateNameException, CodeUnitInsertionException, IOException, MemoryAccessException { - + if (metadataRoot == null) { return; } - monitor.setMessage(program.getName() + ": CLI metadata..."); + monitor.setMessage("[" + program.getName() + "]: CLI metadata..."); // Get our program address Address addr = PeUtils.getMarkupAddress(program, isBinary, ntHeader, virtualAddress); @@ -116,12 +118,12 @@ public class CliMetadataDirectory extends DataDirectory { metadataRoot.markup(program, isBinary, monitor, log, ntHeader); } - @Override + @Override public DataType toDataType() throws DuplicateNameException { - StructureDataType ddstruct = new StructureDataType(NAME,0); - ddstruct.add(DWordDataType.dataType, "VirtualAddress", null); - ddstruct.add(DWordDataType.dataType, "Size", null); + StructureDataType ddstruct = new StructureDataType(NAME, 0); + ddstruct.add(DWordDataType.dataType, "VirtualAddress", null); + ddstruct.add(DWordDataType.dataType, "Size", null); ddstruct.setCategoryPath(new CategoryPath("/PE/CLI")); - return ddstruct; - } + return ddstruct; + } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/cli/streams/CliAbstractStream.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/cli/streams/CliAbstractStream.java index 02c0ba3c7f..eb664c4b21 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/cli/streams/CliAbstractStream.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/cli/streams/CliAbstractStream.java @@ -42,14 +42,14 @@ import ghidra.util.task.TaskMonitor; * with calling them streams because using both terms can get confusing. */ public abstract class CliAbstractStream implements StructConverter, PeMarkupable { - + public static final String PATH = "/PE/CLI/Streams"; - + protected CliStreamHeader header; protected long offset; protected int rva; protected BinaryReader reader; - + /** * Creates a new generic CLI stream type. This is intended to be called by a subclass * stream during its creation. @@ -90,13 +90,13 @@ public abstract class CliAbstractStream implements StructConverter, PeMarkupable @Override public void markup(Program program, boolean isBinary, TaskMonitor monitor, MessageLog log, NTHeader ntHeader) throws DuplicateNameException, IOException { - - monitor.setMessage(program.getName() + ": CLI stream..."); + + monitor.setMessage("[" + program.getName() + "]: CLI stream..."); Address addr = PeUtils.getMarkupAddress(program, isBinary, ntHeader, rva); - + program.getBookmarkManager().setBookmark(addr, BookmarkType.INFO, "CLI Stream", header.getName()); - + try { program.getSymbolTable().createLabel(addr, "CLI_Stream_" + header.getName(), SourceType.ANALYSIS); @@ -114,7 +114,7 @@ public abstract class CliAbstractStream implements StructConverter, PeMarkupable dt.setCategoryPath(new CategoryPath(PATH)); PeUtils.createData(program, addr, dt, log); } - + /** * Gets this stream's header. * diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/cparser/C/CParserUtils.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/cparser/C/CParserUtils.java index f7b724e348..9a14183377 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/cparser/C/CParserUtils.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/cparser/C/CParserUtils.java @@ -313,7 +313,8 @@ public class CParserUtils { // -wrap on the given length // -remove newlines because the line wrapping utility always breaks on those parseMessage = errorMessage.replaceAll("\n", " "); - parseMessage = HTMLUtilities.lineWrapWithHTMLLineBreaks(parseMessage, 80); + parseMessage = HTMLUtilities.lineWrapWithHTMLLineBreaks( + HTMLUtilities.friendlyEncodeHTML(parseMessage), 80); parseMessage = "

    " + parseMessage + "
    "; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/ApplyEnumDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/ApplyEnumDialog.java index 113f423580..8e8d4ccfff 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/ApplyEnumDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/ApplyEnumDialog.java @@ -17,6 +17,7 @@ package ghidra.app.util.datatype; import javax.swing.*; +import docking.DockingUtils; import ghidra.framework.plugintool.PluginTool; import ghidra.program.model.data.DataTypeManager; import ghidra.util.data.DataTypeParser; @@ -32,12 +33,12 @@ public class ApplyEnumDialog extends DataTypeSelectionDialog { @Override protected JComponent createEditorPanel(DataTypeSelectionEditor dtEditor) { setTitle("Apply Enum"); - + JPanel updatedPanel = new JPanel(); updatedPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 10, 0)); updatedPanel.setLayout(new VerticalLayout(5)); - - JLabel label = new JLabel("Choose an Enum data type to apply."); + + JLabel label = DockingUtils.createNonHtmlLabel("Choose an Enum data type to apply."); label.setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0)); JCheckBox subOpCB = new JCheckBox("Apply to sub-operands", shouldApplyOnSubOps); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/DataTypeDropDownSelectionDataModel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/DataTypeDropDownSelectionDataModel.java index 123ed125d3..b7e6645140 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/DataTypeDropDownSelectionDataModel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/DataTypeDropDownSelectionDataModel.java @@ -15,6 +15,14 @@ */ package ghidra.app.util.datatype; +import java.awt.Component; +import java.util.*; + +import javax.swing.*; + +import docking.widgets.DropDownSelectionTextField; +import docking.widgets.DropDownTextFieldDataModel; +import docking.widgets.list.GListCellRenderer; import ghidra.app.plugin.core.datamgr.util.DataTypeUtils; import ghidra.app.services.DataTypeManagerService; import ghidra.app.util.ToolTipUtils; @@ -22,14 +30,6 @@ import ghidra.framework.plugintool.ServiceProvider; import ghidra.program.model.data.*; import ghidra.util.exception.AssertException; -import java.awt.Component; -import java.util.*; - -import javax.swing.*; - -import docking.widgets.DropDownTextFieldDataModel; -import docking.widgets.DropDownSelectionTextField; - /** * The data model for {@link DropDownSelectionTextField} that allows the text field to work with * {@link DataType}s. @@ -84,7 +84,7 @@ public class DataTypeDropDownSelectionDataModel implements DropDownTextFieldData * Remove any unwanted data type items, like arrays. */ private List filterDataTypeList(List dataTypeList) { - List matchingList = new ArrayList(dataTypeList.size()); + List matchingList = new ArrayList<>(dataTypeList.size()); for (DataType dataType : dataTypeList) { if (!(dataType instanceof Array)) { matchingList.add(dataType); @@ -127,33 +127,24 @@ public class DataTypeDropDownSelectionDataModel implements DropDownTextFieldData return -1; // we only get here when the list is empty } - /** - * Renderer for data types. It uses delegation instead of inheritance, due typing issues - * (DefaultListCellRenderer is already typed on Object). - */ - private class DataTypeDropDownRenderer implements ListCellRenderer { + private class DataTypeDropDownRenderer extends GListCellRenderer { - private DefaultListCellRenderer delegate = new DefaultListCellRenderer(); + @Override + protected String getItemText(DataType dt) { + DataTypeManager dtm = dt.getDataTypeManager(); + String dtmName = (dtm != null) ? dtm.getName() : ""; + return dt.getName() + " - " + dtmName + dt.getPathName(); + } @Override public Component getListCellRendererComponent(JList list, DataType value, int index, boolean isSelected, boolean cellHasFocus) { - JLabel renderLabel = - (JLabel) delegate.getListCellRendererComponent(list, value, index, isSelected, - cellHasFocus); - - // set the data - DataType dt = value; - renderLabel.setIcon(DataTypeUtils.getIconForDataType(dt, false)); - DataTypeManager dtm = dt.getDataTypeManager(); - String dtmName = dtm != null ? dtm.getName() : ""; - renderLabel.setText(dt.getName() + " - " + dtmName + dt.getPathName()); - - renderLabel.setVerticalAlignment(SwingConstants.TOP); - - return renderLabel; + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + setIcon(DataTypeUtils.getIconForDataType(value, false)); + setVerticalAlignment(SwingConstants.TOP); + return this; } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/dialog/AskAddrDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/dialog/AskAddrDialog.java index f75c99835f..41810db39d 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/dialog/AskAddrDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/dialog/AskAddrDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,84 +15,82 @@ */ package ghidra.app.util.dialog; -import ghidra.app.util.AddressInput; -import ghidra.program.model.address.Address; -import ghidra.program.model.address.AddressFactory; - import java.awt.BorderLayout; import java.lang.reflect.InvocationTargetException; import javax.swing.*; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; - +import docking.*; +import ghidra.app.util.AddressInput; +import ghidra.program.model.address.Address; +import ghidra.program.model.address.AddressFactory; public class AskAddrDialog extends DialogComponentProvider { - private boolean isCanceled; - private JLabel label; - private AddressInput addrInput; + private boolean isCanceled; + private AddressInput addrInput; - public AskAddrDialog(final String title, final String message, AddressFactory af, Address lastAddr) { - super(title, true, true, true, false); + public AskAddrDialog(final String title, final String message, AddressFactory af, + Address lastAddr) { + super(title, true, true, true, false); - label = new JLabel(message); + addrInput = new AddressInput(); + addrInput.setAddressFactory(af); + addrInput.selectDefaultAddressSpace(); + if (lastAddr != null) { + addrInput.setAddress(lastAddr); + } + addrInput.select(); - addrInput = new AddressInput(); - addrInput.setAddressFactory(af); - addrInput.selectDefaultAddressSpace(); - if (lastAddr != null) { - addrInput.setAddress(lastAddr); - } - addrInput.select(); + JPanel panel = new JPanel(new BorderLayout(10, 10)); + panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + panel.add(DockingUtils.createNonHtmlLabel(message), BorderLayout.WEST); + panel.add(addrInput, BorderLayout.CENTER); - JPanel panel = new JPanel(new BorderLayout(10,10)); - panel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); - panel.add(label, BorderLayout.WEST); - panel.add(addrInput, BorderLayout.CENTER); + addWorkPanel(panel); + addOKButton(); + addCancelButton(); + setDefaultButton(okButton); - addWorkPanel(panel); - addOKButton(); - addCancelButton(); - setDefaultButton(okButton); - - if (SwingUtilities.isEventDispatchThread()) { - DockingWindowManager.showDialog(null, this); - } - else { - try { - SwingUtilities.invokeAndWait(new Runnable(){ + if (SwingUtilities.isEventDispatchThread()) { + DockingWindowManager.showDialog(null, this); + } + else { + try { + SwingUtilities.invokeAndWait(new Runnable() { + @Override public void run() { - DockingWindowManager.showDialog(null, AskAddrDialog.this); + DockingWindowManager.showDialog(null, AskAddrDialog.this); } }); } - catch (InterruptedException e) {} - catch (InvocationTargetException e) {} - } - } + catch (InterruptedException e) { + } + catch (InvocationTargetException e) { + } + } + } - @Override - protected void okCallback() { + @Override + protected void okCallback() { isCanceled = false; if (addrInput.getAddress() == null) { - setStatusText("Please enter a valid ADDRESS."); - return; + setStatusText("Please enter a valid ADDRESS."); + return; } close(); } - + @Override - protected void cancelCallback() { - isCanceled = true; - close(); + protected void cancelCallback() { + isCanceled = true; + close(); } - + public boolean isCanceled() { - return isCanceled; + return isCanceled; } - + public Address getValueAsAddress() { - return addrInput.getAddress(); + return addrInput.getAddress(); } } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/dialog/CheckoutDialog.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/dialog/CheckoutDialog.java index e9d6c5cf7f..158199d9e2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/dialog/CheckoutDialog.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/dialog/CheckoutDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,21 +15,19 @@ */ package ghidra.app.util.dialog; -import ghidra.app.util.HelpTopics; -import ghidra.framework.model.DomainFile; -import ghidra.framework.remote.User; -import ghidra.util.HelpLocation; - import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; +import docking.*; import docking.widgets.MultiLineLabel; import docking.widgets.OptionDialog; +import ghidra.app.util.HelpTopics; +import ghidra.framework.model.DomainFile; +import ghidra.framework.remote.User; +import ghidra.util.HelpLocation; /** * @@ -55,6 +52,7 @@ public class CheckoutDialog extends DialogComponentProvider { JButton checkoutButton = new JButton("Yes"); checkoutButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { actionID = CHECKOUT; close(); @@ -64,6 +62,7 @@ public class CheckoutDialog extends DialogComponentProvider { JButton noCheckoutButton = new JButton("No"); noCheckoutButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { actionID = DO_NOT_CHECKOUT; close(); @@ -84,6 +83,7 @@ public class CheckoutDialog extends DialogComponentProvider { else { try { SwingUtilities.invokeAndWait(new Runnable() { + @Override public void run() { DockingWindowManager.showDialog(null, CheckoutDialog.this); } @@ -105,15 +105,15 @@ public class CheckoutDialog extends DialogComponentProvider { innerPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); JPanel msgPanel = new JPanel(new BorderLayout()); - JLabel warnIcon = - new JLabel(OptionDialog.getIconForMessageType(OptionDialog.WARNING_MESSAGE)); - msgPanel.add(warnIcon, BorderLayout.WEST); + msgPanel.add( + DockingUtils.createNonHtmlLabel( + OptionDialog.getIconForMessageType(OptionDialog.WARNING_MESSAGE)), + BorderLayout.WEST); - MultiLineLabel msgText = - new MultiLineLabel(df.getName() + " file is NOT CHECKED OUT.\n" + - "If you want to make changes and save them\n" + - "to THIS file, then you must first check out the file.\n" + - "Do you want to Check Out this file?"); + MultiLineLabel msgText = new MultiLineLabel("File " + df.getName() + + " is NOT CHECKED OUT.\n" + "If you want to make changes and save them\n" + + "to THIS file, then you must first check out the file.\n" + + "Do you want to Check Out this file?"); msgText.setMaximumSize(msgText.getPreferredSize()); msgPanel.add(msgText, BorderLayout.CENTER); @@ -126,6 +126,7 @@ public class CheckoutDialog extends DialogComponentProvider { final JCheckBox exclusiveCB = new JCheckBox("Request exclusive check out"); exclusiveCB.setSelected(false); exclusiveCB.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { exclusiveCheckout = exclusiveCB.isSelected(); } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/exporter/IntelHexExporter.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/exporter/IntelHexExporter.java index 47ba38d9ef..4fc1110390 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/exporter/IntelHexExporter.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/exporter/IntelHexExporter.java @@ -47,12 +47,12 @@ public class IntelHexExporter extends Exporter { /** Option allowing the user to select the address space */ protected Option addressSpaceOption; - + /** Option allowing the user to select the number of bytes in each line of output */ protected RecordSizeOption recordSizeOption; - + private static final int DEFAULT_RECORD_SIZE = 0x10; - + /** * Constructs a new Intel Hex exporter. This will use a record size of 16 (the default) * and will export ALL bytes in the program or selection (even if the total length @@ -61,7 +61,7 @@ public class IntelHexExporter extends Exporter { public IntelHexExporter() { this("Intel Hex", "hex", new HelpLocation("ExporterPlugin", "intel_hex")); } - + /** * Constructs a new Intel Hex exporter with a custom record size. * @@ -75,7 +75,7 @@ public class IntelHexExporter extends Exporter { recordSizeOption.setRecordSize(recordSize); recordSizeOption.setDropBytes(dropBytes); } - + /** * Constructor * @@ -97,8 +97,8 @@ public class IntelHexExporter extends Exporter { } Program program = (Program) domainObject; - addressSpaceOption = - new Option("Address Space", program.getAddressFactory().getDefaultAddressSpace()); + addressSpaceOption = new Option("Address Space", + program.getAddressFactory().getDefaultAddressSpace(), AddressSpace.class, null); if (recordSizeOption == null) { recordSizeOption = new RecordSizeOption("Record Size", Integer.class); @@ -114,10 +114,10 @@ public class IntelHexExporter extends Exporter { public void setOptions(List
    " + "" + "" + + "" + HTMLUtilities.friendlyEncodeHTML(file.getName()) + "" + "" + + "" + "" + "
    " + (isDir ? "Directory: " : "File: ") + "" + - "" + file.getName() + "" + "
    Size:" + - (isDir ? "0" : file.length()) + " bytes" + "
    Size:" + (isDir ? "0" : file.length()) + " bytes" + "
    Last modified:" + GhidraFileChooser.format.format(new Date(file.lastModified())) + "
    "; @@ -155,30 +156,23 @@ public class FileDropDownSelectionDataModel implements DropDownTextFieldDataMode } } - /** - * Renderer for data types. It uses delegation instead of inheritance, due typing issues - * (DefaultListCellRenderer is already typed on Object). - */ - private class FileDropDownRenderer implements ListCellRenderer { - - private DefaultListCellRenderer delegate = new DefaultListCellRenderer(); + private class FileDropDownRenderer extends GListCellRenderer { @Override - public Component getListCellRendererComponent(JList list, File value, + protected String getItemText(File file) { + return file.getName(); + } + + @Override + public Component getListCellRendererComponent(JList list, File file, int index, boolean isSelected, boolean cellHasFocus) { - JLabel renderer = - (JLabel) delegate.getListCellRendererComponent(list, value, index, isSelected, - cellHasFocus); + super.getListCellRendererComponent(list, file, index, isSelected, cellHasFocus); - File file = value; - renderer.setText(file.getName()); + setIcon(fileSystemView.getSystemIcon(file)); + setVerticalAlignment(SwingConstants.TOP); - renderer.setIcon(fileSystemView.getSystemIcon(file)); - - renderer.setVerticalAlignment(SwingConstants.TOP); - - return renderer; + return this; } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java index 5c3178ce6c..d67a4a164e 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileEditor.java @@ -15,9 +15,6 @@ */ package docking.widgets.filechooser; -import ghidra.util.Msg; -import ghidra.util.filechooser.GhidraFileChooserModel; - import java.awt.*; import java.awt.event.*; import java.io.File; @@ -26,6 +23,10 @@ import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.table.TableCellEditor; +import docking.DockingUtils; +import ghidra.util.Msg; +import ghidra.util.filechooser.GhidraFileChooserModel; + class FileEditor extends AbstractCellEditor implements TableCellEditor { private GhidraFileChooser chooser; @@ -43,7 +44,7 @@ class FileEditor extends AbstractCellEditor implements TableCellEditor { this.directoryTable = table; this.model = model; - iconLabel = new JLabel(); + iconLabel = DockingUtils.createNonHtmlLabel(); iconLabel.addMouseListener(new MouseAdapter() { @Override public void mouseReleased(MouseEvent e) { @@ -97,8 +98,9 @@ class FileEditor extends AbstractCellEditor implements TableCellEditor { editor.add(nameField, BorderLayout.CENTER); // match the spacing of non-editing cells - editor.setBorder(BorderFactory.createCompoundBorder( - BorderFactory.createEmptyBorder(0, 5, 0, 0), BorderFactory.createLineBorder(Color.GRAY))); + editor.setBorder( + BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0), + BorderFactory.createLineBorder(Color.GRAY))); } private void handleDoubleClick(Point p) { @@ -144,15 +146,14 @@ class FileEditor extends AbstractCellEditor implements TableCellEditor { private File getNewFile() { GhidraFileChooserModel fileChooserModel = chooser.getModel(); - File newFile = - new GhidraFile(originalFile.getParentFile(), nameField.getText(), - fileChooserModel.getSeparator()); + File newFile = new GhidraFile(originalFile.getParentFile(), nameField.getText(), + fileChooserModel.getSeparator()); if (fileChooserModel.renameFile(originalFile, newFile)) { return newFile; } - Msg.showError(this, chooser.getComponent(), "Rename Failed", "Unable to rename file: " + - originalFile); + Msg.showError(this, chooser.getComponent(), "Rename Failed", + "Unable to rename file: " + originalFile); return null; } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileListCellRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileListCellRenderer.java index 66e48ec03a..714cec4134 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileListCellRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileListCellRenderer.java @@ -18,11 +18,12 @@ package docking.widgets.filechooser; import java.awt.Component; import java.io.File; -import javax.swing.*; +import javax.swing.JList; +import docking.widgets.list.GListCellRenderer; import ghidra.util.filechooser.GhidraFileChooserModel; -class FileListCellRenderer extends DefaultListCellRenderer { +class FileListCellRenderer extends GListCellRenderer { private GhidraFileChooser chooser; private GhidraFileChooserModel model; @@ -33,18 +34,18 @@ class FileListCellRenderer extends DefaultListCellRenderer { } @Override - public Component getListCellRendererComponent(JList list, Object value, int index, + protected String getItemText(File file) { + return chooser.getDisplayName(file); + } + + @Override + public Component getListCellRendererComponent(JList list, File file, int index, boolean isSelected, boolean cellHasFocus) { - File file = (File) value; - - Component c = super.getListCellRendererComponent(list, chooser.getDisplayName(file), index, - isSelected, cellHasFocus); - if (c instanceof JLabel) { - ((JLabel) c).setIcon(model.getIcon(file)); - } - return c; + super.getListCellRendererComponent(list, file, index, isSelected, cellHasFocus); + setIcon(model.getIcon(file)); + return this; } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GFileChooserOptionsDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GFileChooserOptionsDialog.java index 8653def0db..fdc88e5653 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GFileChooserOptionsDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GFileChooserOptionsDialog.java @@ -18,6 +18,7 @@ package docking.widgets.filechooser; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import ghidra.framework.preferences.Preferences; import ghidra.util.layout.PairLayout; @@ -50,7 +51,7 @@ class GFileChooserOptionsDialog extends DialogComponentProvider { showDotFilesCheckBox = new JCheckBox(); showDotFilesCheckBox.setSelected(true); - JLabel label = new JLabel("Show '.' files"); + JLabel label = DockingUtils.createNonHtmlLabel("Show '.' files"); label.setToolTipText("When toggled on the file chooser will show files " + "with names that begin with a '.' character"); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java index c981a13816..f25abca607 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java @@ -32,6 +32,7 @@ import javax.swing.filechooser.FileSystemView; import docking.*; import docking.framework.DockingApplicationConfiguration; import docking.widgets.*; +import docking.widgets.list.GListCellRenderer; import ghidra.GhidraApplicationLayout; import ghidra.framework.*; import ghidra.framework.preferences.Preferences; @@ -354,7 +355,7 @@ public class GhidraFileChooser extends DialogComponentProvider } private JPanel buildFileNamePanel() { - JLabel filenameLabel = new JLabel("File name:"); + JLabel filenameLabel = DockingUtils.createNonHtmlLabel("File name:"); FileDropDownSelectionDataModel model = new FileDropDownSelectionDataModel(this); filenameTextField = new DropDownSelectionTextField<>(model); filenameTextField.setMatchingWindowHeight(200); @@ -383,28 +384,11 @@ public class GhidraFileChooser extends DialogComponentProvider filenameTextField.setName("filenameTextField"); - JLabel filterLabel = new JLabel("Type:"); + JLabel filterLabel = DockingUtils.createNonHtmlLabel("Type:"); filterCombo = new JComboBox<>(); - filterCombo.setRenderer(new DefaultListCellRenderer() { - private static final long serialVersionUID = 1L; - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - - JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, - isSelected, cellHasFocus); - GhidraFileFilter filter = (GhidraFileFilter) value; - - // we can have null filters in the case that the combo box has - // no selected item - if (filter != null) { - label.setText(filter.getDescription()); - } - - return label; - } - }); + DockingUtils.turnOffHTMLRendering(filterCombo); + filterCombo.setRenderer(GListCellRenderer.createDefaultCellTextRenderer( + gff -> gff != null ? gff.getDescription() : "")); filterCombo.addItemListener(e -> rescanCurrentDirectory()); filterModel = (DefaultComboBoxModel) filterCombo.getModel(); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooserPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooserPanel.java index 6da9a36c2f..163300f2b4 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooserPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooserPanel.java @@ -25,6 +25,7 @@ import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import docking.DockingUtils; import docking.dnd.DropTgtAdapter; import docking.dnd.Droppable; import docking.widgets.OptionDialog; @@ -157,7 +158,7 @@ public class GhidraFileChooserPanel extends JPanel implements Droppable { gbc.gridy = 0; if (!createBorder && title != null) { - add(new JLabel(title), gbc); + add(DockingUtils.createNonHtmlLabel(title), gbc); } gbc.fill = GridBagConstraints.HORIZONTAL; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filter/FilterOptions.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filter/FilterOptions.java index c3924200c0..d8b02765f1 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filter/FilterOptions.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filter/FilterOptions.java @@ -67,6 +67,14 @@ public class FilterOptions { .sorted() .map(c -> Character.toString(c)) .collect(Collectors.joining("")); + + public static final String[] VALID_MULTITERM_DELIMITERS_ARRAY = + DELIMITER_NAME_MAP.keySet() + .stream() + .sorted() + .map(c -> Character.toString(c)) + .collect(Collectors.toList()) + .toArray(new String[DELIMITER_NAME_MAP.size()]); // @formatter:on public static final Character DEFAULT_DELIMITER = ','; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filter/FilterOptionsEditorDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filter/FilterOptionsEditorDialog.java index a8895a51e5..ab92531b0e 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filter/FilterOptionsEditorDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filter/FilterOptionsEditorDialog.java @@ -24,8 +24,7 @@ import java.util.List; import javax.swing.*; import javax.swing.border.EmptyBorder; -import docking.DialogComponentProvider; -import docking.DisabledComponentLayerFactory; +import docking.*; import docking.widgets.InlineComponentTitledPanel; import docking.widgets.list.GListCellRenderer; import ghidra.util.HelpLocation; @@ -210,13 +209,17 @@ public class FilterOptionsEditorDialog extends DialogComponentProvider { } add(containsButton); - add(new JLabel(FilterOptions.getIcon(TextFilterStrategy.CONTAINS))); + add(DockingUtils.createNonHtmlLabel( + FilterOptions.getIcon(TextFilterStrategy.CONTAINS))); add(startsWithButton); - add(new JLabel(FilterOptions.getIcon(TextFilterStrategy.STARTS_WITH))); + add(DockingUtils.createNonHtmlLabel( + FilterOptions.getIcon(TextFilterStrategy.STARTS_WITH))); add(matchesExactlyButton); - add(new JLabel(FilterOptions.getIcon(TextFilterStrategy.MATCHES_EXACTLY))); + add(DockingUtils.createNonHtmlLabel( + FilterOptions.getIcon(TextFilterStrategy.MATCHES_EXACTLY))); add(regularExpressionButton); - add(new JLabel(FilterOptions.getIcon(TextFilterStrategy.REGULAR_EXPRESSION))); + add(DockingUtils.createNonHtmlLabel( + FilterOptions.getIcon(TextFilterStrategy.REGULAR_EXPRESSION))); } } @@ -403,22 +406,21 @@ public class FilterOptionsEditorDialog extends DialogComponentProvider { * Creates the main panel for this dialog. */ private void createPanel() { - + getContentPane().setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); - + JPanel outerPanel = new JPanel(); outerPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); JPanel optionsPanel = new JPanel(); optionsPanel.setLayout(new PairLayout()); - + // Delimiter Row - JLabel delimiterCharacterFieldName = new JLabel("Delimiter:"); + JLabel delimiterCharacterFieldName = DockingUtils.createNonHtmlLabel("Delimiter:"); delimiterCharacterFieldName.setToolTipText( "Set the character used to separate filter terms."); - delimiterCharacterCB = - new JComboBox(FilterOptions.VALID_MULTITERM_DELIMITERS.split("(?!^)")); + delimiterCharacterCB = new JComboBox<>(FilterOptions.VALID_MULTITERM_DELIMITERS_ARRAY); delimiterCharacterCB.setRenderer(new DelimiterListCellRenderer()); JPanel fixedSizePanel = new JPanel(); @@ -429,7 +431,7 @@ public class FilterOptionsEditorDialog extends DialogComponentProvider { optionsPanel.add(fixedSizePanel); // Mode Row - JLabel label = new JLabel("Evaluation Mode:"); + JLabel label = DockingUtils.createNonHtmlLabel("Evaluation Mode:"); JPanel buttonGroupPanel = new JPanel(); buttonGroupPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); @@ -465,19 +467,13 @@ public class FilterOptionsEditorDialog extends DialogComponentProvider { } @Override - protected String getText(Object value) { - String label = ""; - - char char0 = ((String) value).charAt(0); - - label = FilterOptions.DELIMITER_NAME_MAP.get(char0); - if (label == null) { - label = "Unrecognized"; - } + protected String getItemText(String value) { + char char0 = value.length() > 0 ? value.charAt(0) : ' '; + String delimiterName = + FilterOptions.DELIMITER_NAME_MAP.getOrDefault(char0, "Unrecognized"); return String.format("%s    %s", - char0 == ' ' ? " " : char0, label); - + char0 == ' ' ? " " : char0, delimiterName); } } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GList.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GList.java index a87ce46475..d163e396df 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GList.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GList.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,11 +19,11 @@ import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.Vector; -import javax.swing.JList; -import javax.swing.ListModel; +import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import docking.DockingUtils; import docking.widgets.table.GTable; /** @@ -81,7 +80,12 @@ public class GList extends JList { } private void init() { + DockingUtils.turnOffHTMLRendering(this); + if (getCellRenderer() instanceof JComponent) { + DockingUtils.turnOffHTMLRendering(((JComponent) getCellRenderer())); + } addKeyListener(new KeyListener() { + @Override public void keyPressed(KeyEvent e) { // if (e.isActionKey() || // e.getKeyChar() == KeyEvent.CHAR_UNDEFINED || @@ -105,13 +109,16 @@ public class GList extends JList { // e.consume(); } + @Override public void keyReleased(KeyEvent e) { } + @Override public void keyTyped(KeyEvent e) { } }); addListSelectionListener(new ListSelectionListener() { + @Override public void valueChanged(ListSelectionEvent e) { ensureIndexIsVisible(getSelectedIndex()); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GListCellRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GListCellRenderer.java index bbba8a4e6d..561aaf43b5 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GListCellRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/list/GListCellRenderer.java @@ -16,6 +16,7 @@ package docking.widgets.list; import java.awt.*; +import java.util.function.Function; import javax.swing.*; @@ -28,6 +29,25 @@ import docking.widgets.AbstractGCellRenderer; */ public class GListCellRenderer extends AbstractGCellRenderer implements ListCellRenderer { + /** + * Returns a new ListCellRenderer that maps the list's data instance to a string used in the cell. + *

    + * Use this if you only need to provide a way to get the string value from the type being shown + * in the list. + * + * @param cellTextFunc a function that maps a custom type to a string value + * @return new GListCellRenderer instance + */ + public static GListCellRenderer createDefaultCellTextRenderer( + Function cellTextFunc) { + return new GListCellRenderer<>() { + @Override + protected String getItemText(E value) { + return cellTextFunc.apply(value); + } + }; + } + /** * Constructs a new GListCellRenderer. */ diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tabbedpane/DockingTabRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tabbedpane/DockingTabRenderer.java index 345e6ddbdb..a0dc327b5a 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tabbedpane/DockingTabRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tabbedpane/DockingTabRenderer.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,8 +20,9 @@ import java.awt.event.*; import javax.swing.*; -import resources.ResourceManager; +import docking.DockingUtils; import docking.widgets.EmptyBorderButton; +import resources.ResourceManager; /** * A widget that can be used to render an icon, title and close button for JTabbedPane. You would @@ -31,10 +31,10 @@ import docking.widgets.EmptyBorderButton; public class DockingTabRenderer extends JPanel { private static final int MAX_TITLE_LENGTH = 25; - private Icon EMPTY_ICON = ResourceManager.getScaledIcon( - ResourceManager.loadImage("images/close16.gif"), 8, 8); - private Icon CLOSE_ICON = ResourceManager.getScaledIcon( - ResourceManager.loadImage("images/close16.gif"), 8, 8); + private Icon EMPTY_ICON = + ResourceManager.getScaledIcon(ResourceManager.loadImage("images/close16.gif"), 8, 8); + private Icon CLOSE_ICON = + ResourceManager.getScaledIcon(ResourceManager.loadImage("images/close16.gif"), 8, 8); private JLabel titleLabel; private JLabel iconLabel; @@ -50,8 +50,8 @@ public class DockingTabRenderer extends JPanel { final ForwardingMouseListener eventForwardingListener = new ForwardingMouseListener(tabbedPane); - titleLabel = new JLabel(); - iconLabel = new JLabel(); + titleLabel = DockingUtils.createNonHtmlLabel(); + iconLabel = DockingUtils.createNonHtmlLabel(); closeButton = new EmptyBorderButton(); setTitle(tabTitle, fullTitle); @@ -105,7 +105,8 @@ public class DockingTabRenderer extends JPanel { @Override public void hierarchyChanged(HierarchyEvent e) { long changeFlags = e.getChangeFlags(); - if (HierarchyEvent.DISPLAYABILITY_CHANGED == (changeFlags & HierarchyEvent.DISPLAYABILITY_CHANGED)) { + if (HierarchyEvent.DISPLAYABILITY_CHANGED == (changeFlags & + HierarchyEvent.DISPLAYABILITY_CHANGED)) { Container myParent = getParent(); // should be a TabContainer diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableCellRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableCellRenderer.java index bd57ef2bfb..5f488d8f49 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableCellRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableCellRenderer.java @@ -66,6 +66,15 @@ public class GTableCellRenderer extends AbstractGCellRenderer implements TableCe setFont(f); } + /** + * Return the cell renderer text + * @param value Cell object value + * @return A string interpretation of value; generated by calling value.toString() + */ + protected String getText(Object value) { + return value == null ? "" : value.toString(); + } + /** * Satisfies the Java {@link javax.swing.table.TableCellRenderer} interface; retrieves * column data via a GTableCellRenderingData object, and defers painting to diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableFilterPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableFilterPanel.java index 7899ab6095..1943ccb6af 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableFilterPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableFilterPanel.java @@ -28,8 +28,7 @@ import javax.swing.table.TableModel; import org.jdom.Element; -import docking.ActionContext; -import docking.DockingWindowManager; +import docking.*; import docking.help.HelpService; import docking.menu.*; import docking.widgets.EmptyBorderButton; @@ -348,7 +347,7 @@ public class GTableFilterPanel extends JPanel { setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - searchLabel = new JLabel(filterLabel); + searchLabel = DockingUtils.createNonHtmlLabel(filterLabel); searchLabel.setToolTipText("Include only table elements that match the given search text"); filterField = new FilterTextField(table); @@ -401,7 +400,7 @@ public class GTableFilterPanel extends JPanel { RowObjectFilterModel tableModel = (RowObjectFilterModel) table.getModel(); - columnFilterAction = new NonToolbarMultiStateAction>( + columnFilterAction = new NonToolbarMultiStateAction<>( "Column Filter", "GTableFilterPanel") { @Override diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableHeaderRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableHeaderRenderer.java index dcdce48268..8db24e877d 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableHeaderRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableHeaderRenderer.java @@ -24,6 +24,7 @@ import javax.swing.*; import javax.swing.border.*; import javax.swing.table.*; +import docking.DockingUtils; import resources.*; import resources.icons.EmptyIcon; import resources.icons.TranslateIcon; @@ -51,8 +52,8 @@ public class GTableHeaderRenderer extends JPanel implements TableCellRenderer { private static final Icon FILTER_ICON = ResourceManager.getScaledIcon(ResourceManager.loadImage("images/filter_off.png"), 12, 12); - private JLabel textLabel = new JLabel(); - private JLabel iconLabel = new JLabel(); + private JLabel textLabel = DockingUtils.createNonHtmlLabel(); + private JLabel iconLabel = DockingUtils.createNonHtmlLabel(); private Icon helpIcon = null; private CustomPaddingBorder customBorder; protected boolean isPaintingPrimarySortColumn; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterArchiveDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterArchiveDialog.java index 0d36d773ed..611be2ba24 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterArchiveDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterArchiveDialog.java @@ -28,6 +28,7 @@ import javax.swing.*; import org.apache.commons.lang3.StringUtils; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.table.columnfilter.ColumnBasedTableFilter; import docking.widgets.table.columnfilter.ColumnFilterSaveManager; import ghidra.util.HTMLUtilities; @@ -152,7 +153,7 @@ public class ColumnFilterArchiveDialog extends DialogComponentProvider { panel.setBorder(BorderFactory.createTitledBorder( BorderFactory.createEmptyBorder(19, 0, 26, 5), "Preview")); - previewLabel = new JLabel(); + previewLabel = DockingUtils.createHtmlLabel(); previewLabel.setVerticalAlignment(SwingConstants.TOP); panel.add(new JScrollPane(previewLabel)); return panel; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java index 671bfb2525..006f8d46e5 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterDialog.java @@ -360,7 +360,7 @@ public class ColumnFilterDialog extends DialogComponentProvider } private Component createLogicalOperationLabel(LogicOperation op) { - JLabel jLabel = new JLabel("<" + op + ">", SwingConstants.CENTER); + JLabel jLabel = DockingUtils.createNonHtmlLabel("<" + op + ">", SwingConstants.CENTER); jLabel.setForeground(Color.GRAY); return jLabel; } @@ -368,9 +368,9 @@ public class ColumnFilterDialog extends DialogComponentProvider private JComponent buildHeaderPanel() { JPanel headerPanel = new JPanel(new FilterPanelLayout(200, 0)); - headerPanel.add(new JLabel("Table Column", SwingConstants.CENTER)); - headerPanel.add(new JLabel("Filter", SwingConstants.CENTER)); - headerPanel.add(new JLabel("Filter Value", SwingConstants.CENTER)); + headerPanel.add(DockingUtils.createNonHtmlLabel("Table Column", SwingConstants.CENTER)); + headerPanel.add(DockingUtils.createNonHtmlLabel("Filter", SwingConstants.CENTER)); + headerPanel.add(DockingUtils.createNonHtmlLabel("Filter Value", SwingConstants.CENTER)); headerPanel.setBorder(new CompoundBorder( BorderFactory.createMatteBorder(0, 0, 1, 0, Color.DARK_GRAY.brighter().brighter()), diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterPanel.java index eda62108ef..3d6affbb52 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ColumnFilterPanel.java @@ -23,6 +23,7 @@ import java.util.Vector; import javax.swing.*; import javax.swing.border.BevelBorder; +import docking.DockingUtils; import docking.widgets.EmptyBorderButton; import docking.widgets.combobox.GhidraComboBox; import docking.widgets.list.GListCellRenderer; @@ -114,7 +115,7 @@ class ColumnFilterPanel extends JPanel { } private Component createOrLabel() { - JLabel jLabel = new JLabel("", SwingConstants.CENTER); + JLabel jLabel = DockingUtils.createNonHtmlLabel("", SwingConstants.CENTER); jLabel.setForeground(Color.GRAY); return jLabel; } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ConstraintFilterPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ConstraintFilterPanel.java index 4d7a2924c9..c3b8029089 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ConstraintFilterPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constraint/dialog/ConstraintFilterPanel.java @@ -121,15 +121,8 @@ public class ConstraintFilterPanel extends JPanel { private class ConstraintComboBoxCellRenderer extends GListCellRenderer> { @Override - public Component getListCellRendererComponent(JList> list, - ColumnConstraint value, int index, boolean isSelected, boolean cellHasFocus) { - - JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, - isSelected, cellHasFocus); - - label.setText(value.getName()); - - return label; + protected String getItemText(ColumnConstraint value) { + return value.getName(); } @Override diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AutocompletingStringConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AutocompletingStringConstraintEditor.java index 457cec87ae..71d62c63ed 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AutocompletingStringConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/AutocompletingStringConstraintEditor.java @@ -28,6 +28,7 @@ import org.apache.commons.lang3.StringUtils; import docking.widgets.DropDownTextField; import docking.widgets.DropDownTextFieldDataModel; +import docking.widgets.list.GListCellRenderer; import docking.widgets.table.constraint.*; import ghidra.util.HTMLUtilities; @@ -200,14 +201,13 @@ public class AutocompletingStringConstraintEditor extends DataLoadingConstraintE * Cell renderer for suggestion nominees. Substrings that match the models' query * are highlighted for ease-of-use. */ - private class AutocompleteListCellRenderer implements ListCellRenderer { - - private DefaultListCellRenderer delegate = new DefaultListCellRenderer(); + private class AutocompleteListCellRenderer extends GListCellRenderer { private final AutocompleteDataModel model; public AutocompleteListCellRenderer(AutocompleteDataModel autocompleteDataModel) { this.model = autocompleteDataModel; + this.setHTMLRenderingEnabled(true); } private String formatListValue(String value, boolean isSelected) { @@ -216,7 +216,7 @@ public class AutocompletingStringConstraintEditor extends DataLoadingConstraintE Color color = isSelected ? Color.YELLOW : Color.MAGENTA; - StringBuffer sb = new StringBuffer(""); + StringBuilder sb = new StringBuilder(""); // find and highlight all instances of the user-defined pattern while (matcher.find()) { String group = matcher.group(1); @@ -226,19 +226,17 @@ public class AutocompletingStringConstraintEditor extends DataLoadingConstraintE matcher.appendTail(sb); return sb.toString(); - } @Override public Component getListCellRendererComponent(JList list, String value, int index, boolean isSelected, boolean cellHasFocus) { - JLabel label = (JLabel) delegate.getListCellRendererComponent(list, value, index, - isSelected, cellHasFocus); + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); String valueString = formatListValue(value, isSelected); - label.setText(valueString); - return label; + setText(valueString); + return this; } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DataLoadingConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DataLoadingConstraintEditor.java index 45f6e65512..52e00e4d03 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DataLoadingConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DataLoadingConstraintEditor.java @@ -25,6 +25,7 @@ import java.util.concurrent.TimeUnit; import javax.swing.*; import docking.DisabledComponentLayerFactory; +import docking.DockingUtils; import docking.widgets.EmptyBorderButton; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.ColumnData; @@ -90,7 +91,7 @@ public abstract class DataLoadingConstraintEditor extends AbstractColumnConst @Override protected Component buildInlineEditorComponent() { JPanel editorPanel = new JPanel(new BorderLayout()); - statusLabel = new JLabel(); + statusLabel = DockingUtils.createHtmlLabel(); statusLabel.setHorizontalAlignment(SwingConstants.CENTER); taskMonitorComponent = new TaskMonitorComponent(); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DateRangeConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DateRangeConstraintEditor.java index df6536da75..169c0257fb 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DateRangeConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/DateRangeConstraintEditor.java @@ -23,6 +23,7 @@ import java.util.Calendar; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.RangeColumnConstraint; import docking.widgets.table.constraint.provider.DateColumnConstraintProvider; @@ -107,7 +108,7 @@ public class DateRangeConstraintEditor extends AbstractColumnConstraintEditor implements ColumnConstraintEditor public Component getInlineComponent() { JPanel panel = new JPanel(); - JLabel errorLabel = new JLabel( + JLabel errorLabel = DockingUtils.createHtmlLabel( "" + HTMLUtilities.bold(HTMLUtilities.colorString(Color.RED, message))); panel.add(errorLabel); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/EnumConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/EnumConstraintEditor.java index acf48886f4..e06e5ba908 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/EnumConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/EnumConstraintEditor.java @@ -21,6 +21,7 @@ import java.util.*; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.EnumColumnConstraint; @@ -76,7 +77,7 @@ public class EnumConstraintEditor> extends AbstractColumnConst JPanel outerPanel = new JPanel(new BorderLayout()); outerPanel.add(panel, BorderLayout.CENTER); - infoLabel = new JLabel(""); + infoLabel = DockingUtils.createHtmlLabel(""); infoLabel.setForeground(Color.GRAY); infoLabel.setHorizontalAlignment(SwingConstants.CENTER); outerPanel.add(infoLabel, BorderLayout.SOUTH); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerConstraintEditor.java index 677c1acfaf..4fc3d22ad5 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerConstraintEditor.java @@ -21,6 +21,7 @@ import javax.swing.*; import org.apache.commons.lang3.StringUtils; +import docking.DockingUtils; import docking.widgets.spinner.IntegerSpinner; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.SingleValueColumnConstraint; @@ -70,7 +71,7 @@ public class IntegerConstraintEditor extends AbstractColumnCon spinnerModel.addChangeListener(e -> valueChanged()); panel.add(spinner.getSpinner(), BorderLayout.CENTER); - statusLabel = new JLabel(); + statusLabel = DockingUtils.createHtmlLabel(); panel.add(statusLabel, BorderLayout.SOUTH); statusLabel.setForeground(Color.RED); statusLabel.setHorizontalAlignment(SwingConstants.CENTER); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerRangeConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerRangeConstraintEditor.java index 9c08ce1b65..4ed120bffc 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerRangeConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/IntegerRangeConstraintEditor.java @@ -20,6 +20,7 @@ import java.math.BigInteger; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.spinner.IntegerSpinner; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.RangeColumnConstraint; @@ -103,7 +104,7 @@ public class IntegerRangeConstraintEditor panel.add(rangeControlPanel); - infoLabel = new JLabel(); + infoLabel = DockingUtils.createHtmlLabel(); infoLabel.setForeground(Color.GRAY); infoLabel.setHorizontalAlignment(SwingConstants.CENTER); panel.add(infoLabel); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/StringConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/StringConstraintEditor.java index 58134dcd4d..cc3a4c6716 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/StringConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/StringConstraintEditor.java @@ -19,6 +19,7 @@ import java.awt.*; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.StringColumnConstraint; @@ -51,7 +52,7 @@ public class StringConstraintEditor extends AbstractColumnConstraintEditor valueChanged()); panel.add(field.getComponent(), BorderLayout.CENTER); - statusLabel = new JLabel(); + statusLabel = DockingUtils.createHtmlLabel(); panel.add(statusLabel, BorderLayout.SOUTH); statusLabel.setForeground(Color.RED); statusLabel.setHorizontalAlignment(SwingConstants.CENTER); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/UnsignedLongRangeConstraintEditor.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/UnsignedLongRangeConstraintEditor.java index f9bae811b4..bd9bb0ff12 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/UnsignedLongRangeConstraintEditor.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/constrainteditor/UnsignedLongRangeConstraintEditor.java @@ -20,6 +20,7 @@ import java.math.BigInteger; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.table.constraint.ColumnConstraint; import docking.widgets.table.constraint.RangeColumnConstraint; import docking.widgets.textfield.IntegerTextField; @@ -68,7 +69,7 @@ public class UnsignedLongRangeConstraintEditor extends AbstractColumnConstraintE panel.add(rangeControlPanel); - infoLabel = new JLabel(); + infoLabel = DockingUtils.createHtmlLabel(); infoLabel.setForeground(Color.GRAY); infoLabel.setHorizontalAlignment(SwingConstants.CENTER); panel.add(infoLabel); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/GThreadedTablePanel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/GThreadedTablePanel.java index 52392462f9..0e6cc06979 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/GThreadedTablePanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/GThreadedTablePanel.java @@ -20,6 +20,7 @@ import java.awt.FlowLayout; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.EmptyBorderButton; import docking.widgets.table.GTable; import ghidra.util.task.TaskMonitor; @@ -150,13 +151,14 @@ public class GThreadedTablePanel extends JPanel { } private void buildPending() { - JLabel label = new JLabel("Update pending...", SwingConstants.CENTER); refreshButton = new EmptyBorderButton(Icons.REFRESH_ICON); refreshButton.addActionListener(e -> threadedModel.reload()); refreshButton.setToolTipText("Force Refresh Now"); pendingPanel = new JPanel(new FlowLayout()); pendingPanel.setName("Pending Panel"); - pendingPanel.add(label, BorderLayout.CENTER); + pendingPanel.add( + DockingUtils.createNonHtmlLabel("Update pending...", SwingConstants.CENTER), + BorderLayout.CENTER); pendingPanel.add(refreshButton, BorderLayout.EAST); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/TextFieldLinker.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/TextFieldLinker.java index ace8bf78f7..120ac9b4cd 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/TextFieldLinker.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/textfield/TextFieldLinker.java @@ -31,6 +31,8 @@ import javax.swing.text.Caret; import org.apache.commons.lang3.StringUtils; +import docking.DockingUtils; + /** * A class that links text fields into a "formatted text field", separated by expressions. * @@ -54,7 +56,7 @@ import org.apache.commons.lang3.StringUtils; * * JTextField second = new JTextField(); * hbox.add(second); - * hbox.add(new JLabel("-")); + * hbox.add(DockingUtils.createNonHtmlLabel("-")); * linker.linkField(second, "-", "-"); * * JTextField third = new JTextField(); @@ -881,7 +883,7 @@ public class TextFieldLinker { JTextField second = new JTextField(); hbox.add(second); - hbox.add(new JLabel("-")); + hbox.add(DockingUtils.createNonHtmlLabel("-")); linker.linkField(second, "-", "-"); JTextField third = new JTextField(); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/DefaultGTreeFilterProvider.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/DefaultGTreeFilterProvider.java index 9c04fe3226..04707af0fe 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/DefaultGTreeFilterProvider.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/DefaultGTreeFilterProvider.java @@ -22,6 +22,7 @@ import javax.swing.border.BevelBorder; import org.jdom.Element; +import docking.DockingUtils; import docking.DockingWindowManager; import docking.help.HelpService; import docking.widgets.EmptyBorderButton; @@ -120,7 +121,7 @@ public class DefaultGTreeFilterProvider implements GTreeFilterProvider { private JPanel createFilterPanel() { JPanel newFilterPanel = new JPanel(new BorderLayout()); newFilterPanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - JLabel filterLabel = new JLabel(" Filter: "); + JLabel filterLabel = DockingUtils.createNonHtmlLabel(" Filter: "); newFilterPanel.add(filterLabel, BorderLayout.WEST); filterField = new FilterTextField(gTree.getJTree()); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeRenderer.java index 1238942616..f6dedb5cac 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/tree/support/GTreeRenderer.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,54 +21,59 @@ import javax.swing.Icon; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; +import docking.DockingUtils; import docking.widgets.tree.GTree; import docking.widgets.tree.GTreeNode; public class GTreeRenderer extends DefaultTreeCellRenderer { private static final long serialVersionUID = 1L; - private static final Color VALID_DROP_TARGET_COLOR = new Color( 200, 200, 255 ); + private static final Color VALID_DROP_TARGET_COLOR = new Color(200, 200, 255); private static final int DEFAULT_MIN_ICON_WIDTH = 22; - + private Object dropTarget; private boolean paintDropTarget; - + private Font cachedDefaultFont; private Font cachedBoldFont; private int minIconWidth = DEFAULT_MIN_ICON_WIDTH; - + + public GTreeRenderer() { + DockingUtils.turnOffHTMLRendering(this); + } + /** * * @see javax.swing.tree.DefaultTreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean) */ @Override - public Component getTreeCellRendererComponent(JTree tree, Object value, - boolean selected1, boolean expanded, boolean leaf, int row, boolean hasFocus1) { + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected1, + boolean expanded, boolean leaf, int row, boolean hasFocus1) { - super.getTreeCellRendererComponent(tree, value, selected1, expanded, leaf, row, hasFocus1); - GTreeNode node = (GTreeNode)value; + super.getTreeCellRendererComponent(tree, value, selected1, expanded, leaf, row, hasFocus1); + GTreeNode node = (GTreeNode) value; String text = node.getName(); setText(text); setToolTipText(node.getToolTip()); Icon icon = node.getIcon(expanded); - if ( icon == null ) { + if (icon == null) { icon = getIcon(); } else { - setIcon( icon ); + setIcon(icon); } - + updateIconTextGap(icon, minIconWidth); - - paintDropTarget = (value==dropTarget); - + + paintDropTarget = (value == dropTarget); + GTree gtree = node.getTree(); - + GTreeFilter filter = gtree == null ? null : gtree.getFilter(); boolean isBold = (filter != null) && filter.showFilterMatches() && filter.acceptsNode(node); - setFont( getFont( isBold ) ); - return this; + setFont(getFont(isBold)); + return this; } protected void updateIconTextGap(Icon icon, int minWidth) { @@ -77,15 +81,15 @@ public class GTreeRenderer extends DefaultTreeCellRenderer { if (icon != null) { iconWidth = icon.getIconWidth(); } - setIconTextGap(Math.max(minWidth-iconWidth, 2)); + setIconTextGap(Math.max(minWidth - iconWidth, 2)); } @Override // overridden to recalculate icon text gaps - public void setIcon( Icon icon ) { - super.setIcon( icon ); - updateIconTextGap( icon, minIconWidth ); + public void setIcon(Icon icon) { + super.setIcon(icon); + updateIconTextGap(icon, minIconWidth); } - + public int getMinIconWidth() { return minIconWidth; } @@ -98,29 +102,29 @@ public class GTreeRenderer extends DefaultTreeCellRenderer { private Font getFont(boolean bold) { Font font = getFont(); // check if someone set a new font on the renderer - if ( font != cachedDefaultFont && font != cachedBoldFont ) { + if (font != cachedDefaultFont && font != cachedBoldFont) { cachedDefaultFont = font; - + // Bug Alert!: // We must create a new font here and not use deriveFont(). Using derive font has // bugs when calculating the string width for a bold derived font. - cachedBoldFont = new Font( font.getFamily(), Font.BOLD, font.getSize() ); + cachedBoldFont = new Font(font.getFamily(), Font.BOLD, font.getSize()); } return bold ? cachedBoldFont : cachedDefaultFont; } - + // our parent makes this call in the paint() method so we cannot just call setBackground() in // getTreeCellRendererComponent(), but we must instead make sure that the paint() method gets // the correct color @Override public Color getBackgroundNonSelectionColor() { - if ( paintDropTarget ) { + if (paintDropTarget) { return VALID_DROP_TARGET_COLOR; } return super.getBackgroundNonSelectionColor(); } - - public void setRendererDropTarget( Object target ) { + + public void setRendererDropTarget(Object target) { this.dropTarget = target; } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardManager.java b/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardManager.java index 6ba1910f31..3692d978ea 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardManager.java @@ -23,8 +23,7 @@ import java.io.IOException; import javax.swing.*; import javax.swing.border.TitledBorder; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; +import docking.*; import docking.help.Help; import docking.help.HelpService; import docking.widgets.EmptyBorderButton; @@ -215,8 +214,8 @@ public class WizardManager extends DialogComponentProvider implements WizardPane } }); - titleLabel = (wizardIcon == null ? new JLabel(INIT_TITLE) - : new JLabel(INIT_TITLE, wizardIcon, SwingConstants.TRAILING)); + titleLabel = (wizardIcon == null ? DockingUtils.createNonHtmlLabel(INIT_TITLE) + : DockingUtils.createNonHtmlLabel(INIT_TITLE, wizardIcon, SwingConstants.TRAILING)); EmptyBorderButton helpButton = new EmptyBorderButton(ResourceManager.loadImage("images/information.png")); diff --git a/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskDialog.java b/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskDialog.java index 4fb7b4e74c..a620db9d0b 100644 --- a/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskDialog.java @@ -22,8 +22,7 @@ import java.util.concurrent.atomic.AtomicInteger; import javax.swing.*; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; +import docking.*; import docking.util.AnimatedIcon; import docking.widgets.OptionDialog; import ghidra.util.*; @@ -181,7 +180,7 @@ public class TaskDialog extends DialogComponentProvider implements TaskMonitor { AnimatedIcon icon = new AnimatedIcon(iconList, 200, 0); JPanel panel = new JPanel(new BorderLayout()); panel.setSize(new Dimension(200, 100)); - panel.add(new JLabel(icon)); + panel.add(DockingUtils.createNonHtmlLabel(icon)); mainPanel.add(panel, BorderLayout.CENTER); repack(); diff --git a/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskMonitorComponent.java b/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskMonitorComponent.java index bbdd7cfbcc..b42036c360 100644 --- a/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskMonitorComponent.java +++ b/Ghidra/Framework/Docking/src/main/java/ghidra/util/task/TaskMonitorComponent.java @@ -25,6 +25,7 @@ import java.util.concurrent.atomic.AtomicInteger; import javax.swing.*; +import docking.DockingUtils; import docking.ToolTipManager; import docking.util.AnimatedIcon; import docking.widgets.EmptyBorderButton; @@ -485,7 +486,7 @@ public class TaskMonitorComponent extends JPanel implements TaskMonitor { iconList.add(ResourceManager.loadImage("images/hourglass24_10.png")); iconList.add(ResourceManager.loadImage("images/hourglass24_11.png")); AnimatedIcon progressIcon = new AnimatedIcon(iconList, 150, 0); - imageLabel = new JLabel(progressIcon); + imageLabel = DockingUtils.createNonHtmlLabel(progressIcon); } /** diff --git a/Ghidra/Framework/Docking/src/test.slow/java/docking/StatusBarTest.java b/Ghidra/Framework/Docking/src/test.slow/java/docking/StatusBarTest.java index 1589c13f2b..37f48cca11 100644 --- a/Ghidra/Framework/Docking/src/test.slow/java/docking/StatusBarTest.java +++ b/Ghidra/Framework/Docking/src/test.slow/java/docking/StatusBarTest.java @@ -107,8 +107,8 @@ public class StatusBarTest extends AbstractDockingTest { } private void addAndRemoveStatusItems() { - final JLabel label1 = new JLabel("Test Label 1"); - final JLabel label2 = new JLabel("Test Label 2"); + final JLabel label1 = DockingUtils.createNonHtmlLabel("Test Label 1"); + final JLabel label2 = DockingUtils.createNonHtmlLabel("Test Label 2"); // normal add/remove operations runSwing(new Runnable() { @@ -165,7 +165,7 @@ public class StatusBarTest extends AbstractDockingTest { @Override public void run() { try { - statusBar.removeStatusItem(new JLabel("Test Label 3")); + statusBar.removeStatusItem(DockingUtils.createNonHtmlLabel("Test Label 3")); Assert.fail("Did not receive an expected NullPointerException."); } diff --git a/Ghidra/Framework/Docking/src/test/java/docking/PlaceholderSetTest.java b/Ghidra/Framework/Docking/src/test/java/docking/PlaceholderSetTest.java index 2b0b8fa066..6a3fe9a585 100644 --- a/Ghidra/Framework/Docking/src/test/java/docking/PlaceholderSetTest.java +++ b/Ghidra/Framework/Docking/src/test/java/docking/PlaceholderSetTest.java @@ -160,7 +160,7 @@ public class PlaceholderSetTest extends AbstractGenericTest { } private class TestProvider extends ComponentProvider { - JLabel label = new JLabel(); + JLabel label = DockingUtils.createNonHtmlLabel(); public TestProvider() { super(null, null, null); diff --git a/Ghidra/Framework/Generic/src/main/java/generic/util/FileLocker.java b/Ghidra/Framework/Generic/src/main/java/generic/util/FileLocker.java index 6de7a12bef..051e88c7f5 100644 --- a/Ghidra/Framework/Generic/src/main/java/generic/util/FileLocker.java +++ b/Ghidra/Framework/Generic/src/main/java/generic/util/FileLocker.java @@ -23,6 +23,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; +import ghidra.util.HTMLUtilities; import ghidra.util.SystemUtilities; public class FileLocker { @@ -120,14 +121,15 @@ public class FileLocker { return "no properties in lock file"; } - StringBuffer buf = new StringBuffer("

    "); + StringBuilder buf = new StringBuilder("

    "); for (String name : PROPERTY_KEYS) { buf.append(""); } buf.append("
    "); buf.append("     "); - buf.append(name); + buf.append(HTMLUtilities.friendlyEncodeHTML(name)); buf.append(": "); buf.append(""); - buf.append(existingLockProperties.get(name)); + buf.append( + HTMLUtilities.friendlyEncodeHTML(existingLockProperties.get(name).toString())); buf.append("
    "); diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/ErrorPropertyEditor.java b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/ErrorPropertyEditor.java index 130875b1c1..cc9517f8c1 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/ErrorPropertyEditor.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/framework/options/ErrorPropertyEditor.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,15 +25,16 @@ public class ErrorPropertyEditor extends PropertyEditorSupport { private JLabel errorLabel; private Object editorValue; - public ErrorPropertyEditor( String errorMessage, Object value ) { + public ErrorPropertyEditor(String errorMessage, Object value) { editorValue = value; String message = errorMessage; - if ( editorValue != null ) { + if (editorValue != null) { message += " - value: " + value.toString(); } - - errorLabel = new JLabel( message ); - errorLabel.setForeground( Color.RED ); + + errorLabel = new JLabel(message); + errorLabel.setForeground(Color.RED); + errorLabel.putClientProperty("html.disable", true); } @Override @@ -45,5 +45,5 @@ public class ErrorPropertyEditor extends PropertyEditorSupport { @Override public boolean supportsCustomEditor() { return true; - } + } } diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/HTMLUtilities.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/HTMLUtilities.java index d16bc53dea..b2a788c11e 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/HTMLUtilities.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/HTMLUtilities.java @@ -481,12 +481,39 @@ public class HTMLUtilities { } /** - * This is just a convenience call to {@link #friendlyEncodeHTML(String, boolean)} with a - * value of true. + * Converts any special or reserved characters in the specified string into HTML-escaped + * entities. Use this method when you have content containing HTML that you do not want + * interpreted as HTML, such as when displaying text that uses angle brackets around words. + * + *

    For example, consider the following

    + * + * + * + * + * + * + * + * + * + * + * + *
    InputOutputRendered as(Without Friendly Encoding)
    + * Hi <b>mom </b> + * + * Hi + * &nbsp;&lt;b&gt;mom + * &nbsp;&lt;/b&gt; + * + * + * Hi <b>mom </b> + * + * Hi mom + *
    + * + *


    * * @param text string to be encoded * @return the encoded HTML string - * @see #friendlyEncodeHTML(String, boolean) */ public static String friendlyEncodeHTML(String text) { return friendlyEncodeHTML(text, true); diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/ColumnLayout.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/ColumnLayout.java index b35959c36f..91f62f3051 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/ColumnLayout.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/ColumnLayout.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +17,6 @@ package ghidra.util.layout; import java.awt.*; -import javax.swing.*; - /** * This layout arranges components in columns, putting as many components as possible in a * column and using as many columns as necessary. @@ -42,117 +39,97 @@ public class ColumnLayout implements LayoutManager { this.vgap = vgap; this.preferredNumCols = preferredNumCols; } + /** * @see LayoutManager#addLayoutComponent(String, Component) */ + @Override public void addLayoutComponent(String name, Component comp) { } /** * @see LayoutManager#removeLayoutComponent(Component) */ + @Override public void removeLayoutComponent(Component comp) { } /** * @see LayoutManager#preferredLayoutSize(Container) */ + @Override public Dimension preferredLayoutSize(Container parent) { Insets insets = parent.getInsets(); int n = parent.getComponentCount(); computeComponentSize(parent); - - int numRows = (n + preferredNumCols-1) / preferredNumCols; - int numCols = (n+numRows-1) / numRows; - - int height = numRows*compHeight + (numRows-1)*vgap; - int width = numCols*compWidth + (numCols-1)*hgap; - Dimension d = new Dimension(width+insets.left+insets.right+2, - height+insets.top + insets.bottom+2); + + int numRows = (n + preferredNumCols - 1) / preferredNumCols; + int numCols = (n + numRows - 1) / numRows; + + int height = numRows * compHeight + (numRows - 1) * vgap; + int width = numCols * compWidth + (numCols - 1) * hgap; + Dimension d = new Dimension(width + insets.left + insets.right + 2, + height + insets.top + insets.bottom + 2); return d; - } + } /** * @see LayoutManager#minimumLayoutSize(Container) */ + @Override public Dimension minimumLayoutSize(Container parent) { Insets insets = parent.getInsets(); return new Dimension(compWidth + insets.left + insets.right, - compHeight+insets.top+insets.bottom); + compHeight + insets.top + insets.bottom); } /** * @see LayoutManager#layoutContainer(Container) */ + @Override public void layoutContainer(Container parent) { int n = parent.getComponentCount(); if (n == 0) { - return; + return; } computeComponentSize(parent); Dimension d = parent.getSize(); Insets insets = parent.getInsets(); int parentWidth = d.width - insets.left - insets.right; int parentHeight = d.height - insets.top - insets.bottom; - int maxRows = (parentHeight +vgap)/compHeight+vgap; + int maxRows = (parentHeight + vgap) / compHeight + vgap; if (maxRows == 0) { - return; + return; } - int numCols = (n + maxRows -1) / maxRows; - int numRows = (n + numCols -1) / numCols; - int left = insets.left + (parentWidth - numCols*compWidth- (numCols-1)*hgap)/2; + int numCols = (n + maxRows - 1) / maxRows; + int numRows = (n + numCols - 1) / numCols; + int left = insets.left + (parentWidth - numCols * compWidth - (numCols - 1) * hgap) / 2; int top = insets.top; - - for(int i = 0;i 1 ? (n-1)*hgap : 0; + int width = n > 1 ? (n - 1) * hgap : 0; - for(int i=0;iMaximizeSpecificColumnGridLayout is a row oriented grid type of layout. * It lays out rows of information in a table format using a specific number of columns. @@ -181,9 +178,9 @@ public class MaximizeSpecificColumnGridLayout implements LayoutManager { } } } - averageMaximizedWidth = - (remainingMaximizedCount > 0) ? (remainingMaximizedWidth / remainingMaximizedCount) - : 0; + averageMaximizedWidth = (remainingMaximizedCount > 0) + ? (remainingMaximizedWidth / remainingMaximizedCount) + : 0; } // Now just divide up whatever width remains among whatever maximized columns remain. @@ -283,175 +280,4 @@ public class MaximizeSpecificColumnGridLayout implements LayoutManager { public void removeLayoutComponent(Component comp) { // ignore } - - /** - * Test main - * @param args - */ - public static void main(String[] args) { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } - catch (Exception exc) { - System.out.println("Error loading L&F: " + exc); - } - - JFrame frame = new JFrame("Test"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - MaximizeSpecificColumnGridLayout layout = new MaximizeSpecificColumnGridLayout(5, 5, 3); - layout.maximizeColumn(0); - layout.maximizeColumn(2); - JPanel panel = new JPanel(layout); - panel.add(new MyLabel("Version", SwingConstants.LEFT)); - panel.add(new MyLabel("Description", SwingConstants.LEFT)); - panel.add(new MyLabel("Other", SwingConstants.LEFT)); - panel.add(new MyRadioButton("Latest")); - panel.add(new MyLabel("What else?", SwingConstants.LEFT)); - panel.add(new MyLabel("Some sample text.\nOnce upon a time in a land far far away", - SwingConstants.LEFT)); - panel.add(new MyRadioButton("CheckedOut")); - panel.add(new MyLabel("Six", SwingConstants.LEFT)); - panel.add(new MyLabel("Seven", SwingConstants.LEFT)); - panel.add(new MyCheckBox("Test Check Box")); - panel.add(new MyLabel("AAA", SwingConstants.LEFT)); - panel.add(new MyLabel("BBB", SwingConstants.LEFT)); - panel.setBorder(BorderFactory.createEmptyBorder(8, 25, 10, 10)); - frame.getContentPane().add(panel); - frame.pack(); - frame.setVisible(true); - } -} - -class MyCheckBox extends JCheckBox { - - public MyCheckBox() { - super(); - initialize(); - } - - public MyCheckBox(Action a) { - super(a); - initialize(); - } - - public MyCheckBox(Icon icon, boolean selected) { - super(icon, selected); - initialize(); - } - - public MyCheckBox(Icon icon) { - super(icon); - initialize(); - } - - public MyCheckBox(String text, boolean selected) { - super(text, selected); - initialize(); - } - - public MyCheckBox(String text, Icon icon, boolean selected) { - super(text, icon, selected); - initialize(); - } - - public MyCheckBox(String text, Icon icon) { - super(text, icon); - initialize(); - } - - public MyCheckBox(String text) { - super(text); - initialize(); - } - - private void initialize() { - setVerticalAlignment(SwingConstants.TOP); - setToolTipText(getText()); - } -} - -class MyRadioButton extends JRadioButton { - - public MyRadioButton() { - super(); - initialize(); - } - - public MyRadioButton(Action a) { - super(a); - initialize(); - } - - public MyRadioButton(Icon icon, boolean selected) { - super(icon, selected); - initialize(); - } - - public MyRadioButton(Icon icon) { - super(icon); - initialize(); - } - - public MyRadioButton(String text, boolean selected) { - super(text, selected); - initialize(); - } - - public MyRadioButton(String text, Icon icon, boolean selected) { - super(text, icon, selected); - initialize(); - } - - public MyRadioButton(String text, Icon icon) { - super(text, icon); - initialize(); - } - - public MyRadioButton(String text) { - super(text); - initialize(); - } - - private void initialize() { - setVerticalAlignment(SwingConstants.TOP); - setToolTipText(getText()); - } -} - -class MyLabel extends JLabel { - - public MyLabel() { - super(); - initialize(); - } - - public MyLabel(Icon image, int horizontalAlignment) { - super(image, horizontalAlignment); - initialize(); - } - - public MyLabel(Icon image) { - super(image); - initialize(); - } - - public MyLabel(String text, Icon icon, int horizontalAlignment) { - super(text, icon, horizontalAlignment); - initialize(); - } - - public MyLabel(String text, int horizontalAlignment) { - super(text, horizontalAlignment); - initialize(); - } - - public MyLabel(String text) { - super(text); - initialize(); - } - - private void initialize() { - setVerticalAlignment(SwingConstants.TOP); - setToolTipText(getText()); - } } diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/PairLayout.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/PairLayout.java index d8611253ed..a4749e4a64 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/PairLayout.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/PairLayout.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +17,6 @@ package ghidra.util.layout; import java.awt.*; -import javax.swing.*; - /** * LayoutManger for arranging components into exactly two columns. The right column and the * left column may have differing widths. Also, each row is the same height, @@ -29,15 +26,15 @@ public class PairLayout implements LayoutManager { private static final int MINIMUM_RIGHT_COLUMN_WIDTH = 80; private int vgap; private int hgap; - - private int preferredRightColumnWidth; + + private int preferredRightColumnWidth; private int leftColumnWidth; private int rowHeight; - + public PairLayout() { - this(0,0,MINIMUM_RIGHT_COLUMN_WIDTH); + this(0, 0, MINIMUM_RIGHT_COLUMN_WIDTH); } - + /** * Constructs a new PairLayout. * @param vgap the gap (in pixels) between rows. @@ -46,7 +43,7 @@ public class PairLayout implements LayoutManager { public PairLayout(int vgap, int hgap) { this(vgap, hgap, MINIMUM_RIGHT_COLUMN_WIDTH); } - + /** * Constructs a new PairLayout. * @param vgap the gap (in pixels) between rows. @@ -58,51 +55,59 @@ public class PairLayout implements LayoutManager { this.hgap = hgap; this.preferredRightColumnWidth = minimumRightColumnWidth; } - + /** * @see LayoutManager#addLayoutComponent(String, Component) */ - public void addLayoutComponent(String name, Component comp) {} + @Override + public void addLayoutComponent(String name, Component comp) { + } /** * @see LayoutManager#removeLayoutComponent(Component) */ - public void removeLayoutComponent(Component comp) {} + @Override + public void removeLayoutComponent(Component comp) { + } /** * @see LayoutManager#preferredLayoutSize(Container) */ + @Override public Dimension preferredLayoutSize(Container parent) { computeSizes(parent); int rowCount = (parent.getComponentCount() + 1) / 2; Insets insets = parent.getInsets(); - Dimension d = new Dimension(0,0); + Dimension d = new Dimension(0, 0); d.width = leftColumnWidth + hgap + preferredRightColumnWidth + insets.left + insets.right; - d.height = rowHeight * rowCount + vgap * (rowCount-1) + insets.top + insets.bottom; + d.height = rowHeight * rowCount + vgap * (rowCount - 1) + insets.top + insets.bottom; return d; - } - + } + + @Override public Dimension minimumLayoutSize(Container parent) { return preferredLayoutSize(parent); } + @Override public void layoutContainer(Container parent) { computeSizes(parent); int componentCount = parent.getComponentCount(); - int rowCount = (componentCount+1) / 2; + int rowCount = (componentCount + 1) / 2; Dimension d = parent.getSize(); Insets insets = parent.getInsets(); int width = d.width - (insets.left + insets.right); int x = insets.left; int y = insets.top; - int rightColumnWidth = width - (leftColumnWidth + hgap); + int rightColumnWidth = width - (leftColumnWidth + hgap); - for(int i=0;i i*2+1) { - Component rightColumnComponent = parent.getComponent(i*2+1); - rightColumnComponent.setBounds(x+leftColumnWidth+hgap, y, rightColumnWidth, rowHeight); + for (int i = 0; i < rowCount; i++) { + Component leftColumnComponent = parent.getComponent(i * 2); + leftColumnComponent.setBounds(x, y, leftColumnWidth, rowHeight); + if (componentCount > i * 2 + 1) { + Component rightColumnComponent = parent.getComponent(i * 2 + 1); + rightColumnComponent.setBounds(x + leftColumnWidth + hgap, y, rightColumnWidth, + rowHeight); y += rowHeight + vgap; } } @@ -110,52 +115,25 @@ public class PairLayout implements LayoutManager { private void computeSizes(Container parent) { int componentCount = parent.getComponentCount(); - int rowCount = (componentCount+1) / 2; + int rowCount = (componentCount + 1) / 2; leftColumnWidth = 0; - rowHeight = 0; + rowHeight = 0; - for( int i = 0; i < rowCount; i++ ) { - Component leftColumnComponent = parent.getComponent(i*2); + for (int i = 0; i < rowCount; i++) { + Component leftColumnComponent = parent.getComponent(i * 2); Dimension d = leftColumnComponent.getPreferredSize(); leftColumnWidth = Math.max(leftColumnWidth, d.width); rowHeight = Math.max(rowHeight, d.height); - - if ( componentCount > i*2+1 ) { - Component rightColumnComponent = parent.getComponent(i*2+1); + + if (componentCount > i * 2 + 1) { + Component rightColumnComponent = parent.getComponent(i * 2 + 1); d = rightColumnComponent.getPreferredSize(); rowHeight = Math.max(rowHeight, d.height); preferredRightColumnWidth = Math.max(preferredRightColumnWidth, d.width); } - } - + } + } - /** - * Test main - * @param args - */ - public static void main(String[] args) { - try { - UIManager.setLookAndFeel( - UIManager.getSystemLookAndFeelClassName()); - } - catch (Exception exc) { - System.out.println("Error loading L&F: " + exc); - } - - JFrame frame = new JFrame("Test"); - frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); - JPanel panel = new JPanel(new PairLayout(10,20,100)); - panel.add(new JLabel("One",SwingConstants.RIGHT)); - panel.add(new JTextField()); - panel.add(new JLabel("Two",SwingConstants.RIGHT)); - panel.add(new JTextField()); - panel.add(new JLabel("Three",SwingConstants.RIGHT)); - panel.add(new JTextField()); - panel.setBorder(BorderFactory.createEmptyBorder(8,25,10,10)); - frame.getContentPane().add(panel); - frame.pack(); - frame.setVisible(true); - } } diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/RowColumnLayout.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/RowColumnLayout.java index e7537068eb..87ec0cb69c 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/RowColumnLayout.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/RowColumnLayout.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,62 +52,68 @@ public class RowColumnLayout implements LayoutManager { this.maxSize = maxSize; this.fillOrder = LEFT_TO_RIGHT; } + /** * @see LayoutManager#addLayoutComponent(String, Component) */ + @Override public void addLayoutComponent(String name, Component comp) { } /** * @see LayoutManager#removeLayoutComponent(Component) */ + @Override public void removeLayoutComponent(Component comp) { } /** * @see LayoutManager#preferredLayoutSize(Container) */ + @Override public Dimension preferredLayoutSize(Container parent) { Insets insets = parent.getInsets(); int n = parent.getComponentCount(); computeComponentSize(parent); - + int numRows = 1; int numCols = 1; - + if (orientation == ROW) { - int width = Math.max(maxSize-insets.left-insets.right, compWidth); - numCols = (width+hgap)/(compWidth + hgap); - numRows = (n+numCols-1) / numCols; - numCols = (n+numRows-1) / numRows; + int width = Math.max(maxSize - insets.left - insets.right, compWidth); + numCols = (width + hgap) / (compWidth + hgap); + numRows = (n + numCols - 1) / numCols; + numCols = (n + numRows - 1) / numRows; } - else { - int height = Math.max(maxSize-insets.top-insets.left, compHeight); - numRows = (height+vgap)/(compHeight + vgap); - numCols = (n+numRows-1) / numRows; - numRows = (n+numCols-1) / numCols; + else { + int height = Math.max(maxSize - insets.top - insets.left, compHeight); + numRows = (height + vgap) / (compHeight + vgap); + numCols = (n + numRows - 1) / numRows; + numRows = (n + numCols - 1) / numCols; } - - int height = numRows*compHeight + (numRows-1)*vgap; - int width = numCols*compWidth + (numCols-1)*hgap; - Dimension d = new Dimension(width+insets.left+insets.right+2, - height+insets.top + insets.bottom+2); + + int height = numRows * compHeight + (numRows - 1) * vgap; + int width = numCols * compWidth + (numCols - 1) * hgap; + Dimension d = new Dimension(width + insets.left + insets.right + 2, + height + insets.top + insets.bottom + 2); return d; - } + } /** * @see LayoutManager#minimumLayoutSize(Container) */ + @Override public Dimension minimumLayoutSize(Container parent) { Insets insets = parent.getInsets(); return new Dimension(compWidth + insets.left + insets.right, - compHeight+insets.top+insets.bottom); + compHeight + insets.top + insets.bottom); } /** * @see LayoutManager#layoutContainer(Container) */ + @Override public void layoutContainer(Container parent) { computeComponentSize(parent); @@ -117,83 +122,61 @@ public class RowColumnLayout implements LayoutManager { Insets insets = parent.getInsets(); int parentWidth = d.width - insets.left - insets.right; int parentHeight = d.height - insets.top - insets.bottom; - + int numRows = 1; int numCols = 1; if (orientation == ROW) { - numCols = (parentWidth +hgap)/(compWidth+hgap); - if (numCols < 1) numCols = 1; - numRows = (n + numCols -1) / numCols; - numCols = (n + numRows -1) / numRows; + numCols = (parentWidth + hgap) / (compWidth + hgap); + if (numCols < 1) { + numCols = 1; + } + numRows = (n + numCols - 1) / numCols; + numCols = (n + numRows - 1) / numRows; } else { - numRows = (parentHeight +vgap)/(compHeight+vgap); - if (numRows < 1) numRows = 1; - numCols = (n + numRows -1) / numRows; - numRows = (n + numCols -1) / numCols; + numRows = (parentHeight + vgap) / (compHeight + vgap); + if (numRows < 1) { + numRows = 1; + } + numCols = (n + numRows - 1) / numRows; + numRows = (n + numCols - 1) / numCols; } - // int left = insets.left + (parentWidth - numCols*compWidth- (numCols-1)*hgap)/2; // int top = insets.top + (parentHeight - numRows*compHeight - (numRows-1)*vgap)/2; int left = insets.left; int top = insets.top; - - for(int i = 0;i= componentCount ) { - // this implies uneven components (can't fill the last row) - return rowHeight; - } - - Component component = parent.getComponent( ordinal ); - Dimension d = component.getPreferredSize(); - rowHeight = Math.max( rowHeight, d.height ); - } - return rowHeight; - } - - private int getPreferredColumnWidth( Container parent ) { - int width = 0; - int componentCount = parent.getComponentCount(); - for ( int i = 0; i < componentCount; i++ ) { - Component component = parent.getComponent( i ); - Dimension d = component.getPreferredSize(); - width = Math.max( width, d.width ); - } - return width; - } - - public Dimension minimumLayoutSize(Container parent) { - return preferredLayoutSize(parent); - } + public VariableRowHeightGridLayout(int columnCount) { + this(0, 0, columnCount); + } - public void layoutContainer(Container parent) { - int componentCount = parent.getComponentCount(); - int rowCount = (componentCount + (columnCount-1) ) / columnCount; - Dimension d = parent.getSize(); - Insets insets = parent.getInsets(); - int width = d.width - (insets.left + insets.right); - int totalColumns = Math.min( columnCount, componentCount ); - int availableColumnWidth = (width - (columnCount - 1) * hgap) / totalColumns; - int columnWidth = getColumnWidth( parent, availableColumnWidth ); - int y = insets.top; - for ( int i = 0; i < rowCount; i++ ) { - int x = insets.left; - int rowHeight = getRowHeight( parent, i ); - for ( int j = 0; j < columnCount; j++ ) { - int ordinal = i * columnCount + j; - if ( ordinal >= componentCount ) { - // this implies uneven components (can't fill the last row) - break; - } - Component component = parent.getComponent( ordinal ); - component.setBounds( x, y, columnWidth, rowHeight ); - x += columnWidth + hgap; - } - y += rowHeight + vgap; - } - } + /** + * Constructs a new PairLayout. + * @param vgap the gap (in pixels) between rows. + * @param hgap the gap (in pixels) between the two columns. + * @param columnCount the number of columns in this grid + */ + public VariableRowHeightGridLayout(int vgap, int hgap, int columnCount) { + this.vgap = vgap; + this.hgap = hgap; - private int getColumnWidth( Container parent, int availableColumnWidth ) { - return availableColumnWidth; - } + if (columnCount <= 0) { + columnCount = 1; + } - public void addLayoutComponent(String name, Component comp) { - // ignore - } + this.columnCount = columnCount; + } + + @Override + public Dimension preferredLayoutSize(Container parent) { + int componentCount = parent.getComponentCount(); + int rowCount = (componentCount + (columnCount - 1)) / columnCount; + Insets insets = parent.getInsets(); + Dimension d = new Dimension(0, 0); + int totalComponentHeight = 0; + for (int i = 0; i < rowCount; i++) { + totalComponentHeight += getRowHeight(parent, i); + } + + int totalColumns = Math.min(columnCount, componentCount); + int totalComponentWidth = getPreferredColumnWidth(parent) * totalColumns; + d.width = totalComponentWidth + hgap * (columnCount - 1) + insets.left + insets.right; + d.height = totalComponentHeight + vgap * (rowCount - 1) + insets.top + insets.bottom; + return d; + } + + private int getRowHeight(Container parent, int row) { + int rowHeight = 0; + int componentCount = parent.getComponentCount(); + for (int i = 0; i < columnCount; i++) { + int ordinal = row * columnCount + i; + if (ordinal >= componentCount) { + // this implies uneven components (can't fill the last row) + return rowHeight; + } + + Component component = parent.getComponent(ordinal); + Dimension d = component.getPreferredSize(); + rowHeight = Math.max(rowHeight, d.height); + } + return rowHeight; + } + + private int getPreferredColumnWidth(Container parent) { + int width = 0; + int componentCount = parent.getComponentCount(); + for (int i = 0; i < componentCount; i++) { + Component component = parent.getComponent(i); + Dimension d = component.getPreferredSize(); + width = Math.max(width, d.width); + } + return width; + } + + @Override + public Dimension minimumLayoutSize(Container parent) { + return preferredLayoutSize(parent); + } + + @Override + public void layoutContainer(Container parent) { + int componentCount = parent.getComponentCount(); + int rowCount = (componentCount + (columnCount - 1)) / columnCount; + Dimension d = parent.getSize(); + Insets insets = parent.getInsets(); + int width = d.width - (insets.left + insets.right); + int totalColumns = Math.min(columnCount, componentCount); + int availableColumnWidth = (width - (columnCount - 1) * hgap) / totalColumns; + int columnWidth = getColumnWidth(parent, availableColumnWidth); + int y = insets.top; + for (int i = 0; i < rowCount; i++) { + int x = insets.left; + int rowHeight = getRowHeight(parent, i); + for (int j = 0; j < columnCount; j++) { + int ordinal = i * columnCount + j; + if (ordinal >= componentCount) { + // this implies uneven components (can't fill the last row) + break; + } + Component component = parent.getComponent(ordinal); + component.setBounds(x, y, columnWidth, rowHeight); + x += columnWidth + hgap; + } + y += rowHeight + vgap; + } + } + + private int getColumnWidth(Container parent, int availableColumnWidth) { + return availableColumnWidth; + } + + @Override + public void addLayoutComponent(String name, Component comp) { + // ignore + } + + @Override + public void removeLayoutComponent(Component comp) { + // ignore + } - public void removeLayoutComponent(Component comp) { - // ignore - } - - /** - * Test main - * @param args - */ - public static void main(String[] args) { - try { - UIManager.setLookAndFeel( - UIManager.getSystemLookAndFeelClassName()); - } - catch (Exception exc) { - System.out.println("Error loading L&F: " + exc); - } - - JFrame frame = new JFrame("Test"); - frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); - JPanel panel = new JPanel(new VariableRowHeightGridLayout(1, 5, 15)); - panel.add(new JLabel("One",SwingConstants.RIGHT)); - panel.add(new JTextField()); - panel.add(new JLabel("Two",SwingConstants.RIGHT)); - panel.add(new JTextField()); - panel.add(new JLabel("Three",SwingConstants.RIGHT)); - panel.add(new JTextField()); - panel.setBorder(BorderFactory.createEmptyBorder(8,25,10,10)); - frame.getContentPane().add(panel); - frame.pack(); - frame.setVisible(true); - } } diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/VerticalLayout.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/VerticalLayout.java index 70226f4d16..25e4b48f37 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/VerticalLayout.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/layout/VerticalLayout.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +17,6 @@ package ghidra.util.layout; import java.awt.*; -import javax.swing.*; - /** * LayoutManager for arranging components in a single column. All components * retain their preferred heights, but are sized to the same width. @@ -67,8 +64,8 @@ public class VerticalLayout implements LayoutManager { width = Math.max(width, d.width); height += d.height; } - return new Dimension(width + insets.left + insets.right, height + insets.top + - insets.bottom); + return new Dimension(width + insets.left + insets.right, + height + insets.top + insets.bottom); } /** @@ -101,26 +98,4 @@ public class VerticalLayout implements LayoutManager { } } - /** - * Test main - * @param args execution arguments - */ - public static void main(String[] args) { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } - catch (Exception exc) { - System.out.println("Error loading L&F: " + exc); - } - - JFrame frame = new JFrame("Test"); - JPanel panel = new JPanel(new VerticalLayout(10)); - panel.add(new JLabel("One", SwingConstants.LEFT)); - panel.add(new JLabel("Two", SwingConstants.RIGHT)); - panel.add(new JLabel("Three", SwingConstants.CENTER)); - panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - frame.getContentPane().add(panel); - frame.pack(); - frame.setVisible(true); - } } diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java index 5e8418f2ce..b092deecad 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/GraphComponent.java @@ -24,6 +24,7 @@ import javax.swing.*; import com.google.common.base.Function; +import docking.DockingUtils; import docking.DockingWindowManager; import docking.ToolTipManager; import docking.help.HelpService; @@ -417,7 +418,7 @@ public class GraphComponent, G e String tooltip = "Bring satellite view to the front"; Icon icon = ResourceManager.loadImage("images/network-wireless.png"); - JLabel iconLabel = new JLabel(icon); + JLabel iconLabel = DockingUtils.createNonHtmlLabel(icon); iconLabel.setOpaque(false); iconLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); iconLabel.setToolTipText(tooltip); @@ -457,7 +458,7 @@ public class GraphComponent, G e "options to have the graph update automatically."; Icon icon = Icons.REFRESH_ICON; - JLabel iconLabel = new JLabel(icon); + JLabel iconLabel = DockingUtils.createNonHtmlLabel(icon); iconLabel.setOpaque(false); iconLabel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); iconLabel.setToolTipText(tooltip); diff --git a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/VisualGraphView.java b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/VisualGraphView.java index fa2331f53b..072a2a46fb 100644 --- a/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/VisualGraphView.java +++ b/Ghidra/Framework/Graph/src/main/java/ghidra/graph/viewer/VisualGraphView.java @@ -23,6 +23,7 @@ import java.util.function.Supplier; import javax.swing.*; +import docking.DockingUtils; import edu.uci.ics.jung.visualization.RenderContext; import edu.uci.ics.jung.visualization.VisualizationViewer; import edu.uci.ics.jung.visualization.control.ScalingControl; @@ -341,7 +342,7 @@ public class VisualGraphView(); + listModel = new DefaultListModel<>(); setPluginPathsListData(Preferences.getPluginPaths()); // construct the bottom error message panel JPanel statusMessagePanel = new JPanel(); - statusMessage = new JLabel("Ready to set User Plugin Paths"); + statusMessage = DockingUtils.createNonHtmlLabel("Ready to set User Plugin Paths"); statusMessage.setName("statusLabel"); statusMessage.setForeground(STATUS_MESSAGE_COLOR); @@ -370,9 +371,8 @@ class EditPluginPathDialog extends DialogComponentProvider { Dimension d = addJarButton.getPreferredSize(); addDirButton.setPreferredSize(d); removeButton.setPreferredSize(d); - JPanel otherButtonsPanel = - ButtonPanelFactory.createButtonPanel(new JButton[] { addJarButton, addDirButton, - removeButton }, SIDE_MARGIN); + JPanel otherButtonsPanel = ButtonPanelFactory.createButtonPanel( + new JButton[] { addJarButton, addDirButton, removeButton }, SIDE_MARGIN); // put the right-side buttons panel together JPanel listButtonPanel = new JPanel(new BorderLayout(0, 0)); @@ -383,7 +383,7 @@ class EditPluginPathDialog extends DialogComponentProvider { // construct the plugin paths list // JPanel scrollListPanel = new JPanel(new BorderLayout(10, 15)); - pluginPathsList = new JList(); + pluginPathsList = new JList<>(); pluginPathsList.addListSelectionListener(new PathListSelectionListener()); pluginPathsList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); @@ -555,46 +555,20 @@ class EditPluginPathDialog extends DialogComponentProvider { } /** - * special class that renders the path values in the list, + * ListCellRenderer that renders the path values in the list, * coloring paths that are no longer readable in red. */ - private class PluginPathRenderer extends JLabel implements ListCellRenderer { - public PluginPathRenderer() { - super(); - setOpaque(true); - } + private class PluginPathRenderer extends GListCellRenderer { @Override public Component getListCellRendererComponent(JList list, String value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + boolean pathOK = new File(value).canRead(); + if (!pathOK) { + setForeground(isSelected ? INVALID_SELECTED_PATH_COLOR : INVALID_PATH_COLOR); + } - // validate the paths, setting invalid paths to red in the list - // Invalid paths are defined as: - // Jar files or directories that are no longer accessible; - // - String pathName = listModel.get(index); - setText(pathName); - setFont(list.getFont()); - boolean pathOK = new File(pathName).canRead(); - if (isSelected) { - if (!pathOK) { - setForeground(INVALID_SELECTED_PATH_COLOR); - } - else { - setForeground(list.getSelectionForeground()); - } - setBackground(list.getSelectionBackground()); - } - else { - // set color to red if no longer accessible - if (!pathOK) { - setForeground(INVALID_PATH_COLOR); - } - else { - setForeground(list.getForeground()); - } - setBackground(list.getBackground()); - } return this; } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/FrontEndPlugin.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/FrontEndPlugin.java index 84274ec744..69fc4a6a0e 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/FrontEndPlugin.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/FrontEndPlugin.java @@ -774,7 +774,7 @@ public class FrontEndPlugin extends Plugin connectionIconPanel.remove(connectionButton); } if (project == null || project.getRepository() == null) { - connectionLabel = new JLabel(emptyIcon); + connectionLabel = DockingUtils.createNonHtmlLabel(emptyIcon); connectionIconPanel.add(connectionLabel); return; } @@ -924,10 +924,10 @@ public class FrontEndPlugin extends Plugin JPanel connectionPanel = new JPanel(); connectionPanel.setLayout(new BorderLayout()); - repositoryLabel = new JLabel(""); + repositoryLabel = DockingUtils.createNonHtmlLabel(); repositoryLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); connectionIconPanel = new JPanel(); - connectionLabel = new JLabel(""); + connectionLabel = DockingUtils.createNonHtmlLabel(); connectionIconPanel.add(connectionLabel); connectionPanel.add(repositoryLabel, BorderLayout.CENTER); connectionPanel.add(connectionIconPanel, BorderLayout.EAST); @@ -1189,7 +1189,8 @@ public class FrontEndPlugin extends Plugin if (defaultToolTemplate == null) { // assume no tools in the tool chest Msg.showInfo(this, tool.getToolFrame(), "Cannot Find Tool", - "Cannot find tool to open file: " + domainFile.getName() + + "Cannot find tool to open file: " + + HTMLUtilities.friendlyEncodeHTML(domainFile.getName()) + ".

    Make sure you have an appropriate tool installed
    from the " + "Tools->Import Default Tools... menu. Alternatively, you can " + "use Tool->Set Tool Associations menu to change how Ghidra " + diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/LogPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/LogPanel.java index d675836bec..cae32fddd4 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/LogPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/LogPanel.java @@ -24,6 +24,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; +import docking.DockingUtils; import docking.StatusBarSpacer; import docking.ToolTipManager; import docking.help.Help; @@ -50,7 +51,7 @@ public class LogPanel extends JPanel implements LogListener { JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createEmptyBorder(8, 4, 4, 2)); button = new EmptyBorderButton(ResourceManager.loadImage("images/monitor.png")); - label = new JLabel(); + label = DockingUtils.createNonHtmlLabel(); label.setName("Details"); defaultColor = label.getForeground(); panel.add(label, BorderLayout.CENTER); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectAccessPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectAccessPanel.java index 4b74bcbc2c..7a89bcbfb2 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectAccessPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectAccessPanel.java @@ -24,6 +24,7 @@ import java.util.List; import javax.swing.*; import docking.options.editor.ButtonPanelFactory; +import docking.widgets.list.GListCellRenderer; import docking.widgets.table.GTable; import docking.wizard.AbstractWizardJPanel; import ghidra.app.util.GenericHelpTopics; @@ -554,9 +555,9 @@ public class ProjectAccessPanel extends AbstractWizardJPanel { /** * Renderer for the {@link KnownUsersPanel}. This is to ensure that we render the - * correct icon for each user in the list, and that the text is colored properly. + * correct icon for each user in the list */ - private class UserListCellRenderer extends JLabel implements ListCellRenderer { + private class UserListCellRenderer extends GListCellRenderer { private Icon icon; private Icon inProjectIcon; @@ -566,30 +567,18 @@ public class ProjectAccessPanel extends AbstractWizardJPanel { inProjectIcon = ResourceManager.loadImage("images/user.png"); icon = ResourceManager.getScaledIcon(icon, inProjectIcon.getIconWidth(), inProjectIcon.getIconHeight()); - setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); - setOpaque(true); } @Override - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { + public Component getListCellRendererComponent(JList list, + String username, int index, boolean isSelected, boolean cellHasFocus) { - String name = (String) value; + super.getListCellRendererComponent(list, username, index, isSelected, cellHasFocus); if (userAccessPanel != null) { - setIcon(userAccessPanel.isInProjectAccessList(name) ? inProjectIcon : icon); + setIcon(userAccessPanel.isInProjectAccessList(username) ? inProjectIcon : icon); } - setText(name); - - if (isSelected) { - setBackground(list.getSelectionBackground()); - setForeground(list.getSelectionForeground()); - } - else { - setBackground(list.getBackground()); - setForeground(list.getForeground()); - } return this; } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectInfoDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectInfoDialog.java index 746d318336..8babea8819 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectInfoDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectInfoDialog.java @@ -24,6 +24,7 @@ import javax.swing.*; import javax.swing.border.BevelBorder; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.help.Help; import docking.help.HelpService; import docking.widgets.OptionDialog; @@ -124,13 +125,15 @@ public class ProjectInfoDialog extends DialogComponentProvider { JPanel infoPanel = new JPanel(new PairLayout(5, 10)); infoPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - JLabel dirLabel = new JLabel("Directory Location:", SwingConstants.RIGHT); + JLabel dirLabel = + DockingUtils.createNonHtmlLabel("Directory Location:", SwingConstants.RIGHT); dirLabel.setToolTipText("Directory where your project files reside."); infoPanel.add(dirLabel); - projectDirLabel = new JLabel(dir.getAbsolutePath()); + projectDirLabel = DockingUtils.createNonHtmlLabel(dir.getAbsolutePath()); infoPanel.add(projectDirLabel); - infoPanel.add(new JLabel("Project Storage Type:", SwingConstants.RIGHT)); + infoPanel.add( + DockingUtils.createNonHtmlLabel("Project Storage Type:", SwingConstants.RIGHT)); Class fsClass = project.getProjectData().getLocalStorageClass(); String fsClassName = ""; if (IndexedV1LocalFileSystem.class.equals(fsClass)) { @@ -143,11 +146,11 @@ public class ProjectInfoDialog extends DialogComponentProvider { fsClassName = "Mangled Filesystem"; } - JLabel label = new JLabel(fsClassName); + JLabel label = DockingUtils.createNonHtmlLabel(fsClassName); label.setName("Project Storage Type"); infoPanel.add(label); - infoPanel.add(new JLabel("Project Name:", SwingConstants.RIGHT)); - label = new JLabel(project.getName()); + infoPanel.add(DockingUtils.createNonHtmlLabel("Project Name:", SwingConstants.RIGHT)); + label = DockingUtils.createNonHtmlLabel(project.getName()); label.setName("Project Name"); infoPanel.add(label); @@ -226,25 +229,26 @@ public class ProjectInfoDialog extends DialogComponentProvider { JPanel panel = new JPanel(new PairLayout(5, 10)); panel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10)); - JLabel sLabel = new JLabel("Server Name:", SwingConstants.RIGHT); + JLabel sLabel = DockingUtils.createNonHtmlLabel("Server Name:", SwingConstants.RIGHT); panel.add(sLabel); - serverLabel = new JLabel(serverName); + serverLabel = DockingUtils.createNonHtmlLabel(serverName); serverLabel.setName("Server Name"); panel.add(serverLabel); - JLabel pLabel = new JLabel("Port Number:", SwingConstants.RIGHT); + JLabel pLabel = DockingUtils.createNonHtmlLabel("Port Number:", SwingConstants.RIGHT); panel.add(pLabel); - portLabel = new JLabel(portNumberStr); + portLabel = DockingUtils.createNonHtmlLabel(portNumberStr); portLabel.setName("Port Number"); panel.add(portLabel); - JLabel repLabel = new JLabel("Repository Name:", SwingConstants.RIGHT); + JLabel repLabel = DockingUtils.createNonHtmlLabel("Repository Name:", SwingConstants.RIGHT); panel.add(repLabel); - repNameLabel = new JLabel(repositoryName); + repNameLabel = DockingUtils.createNonHtmlLabel(repositoryName); repNameLabel.setName("Repository Name"); panel.add(repNameLabel); - JLabel connectLabel = new JLabel("Connection Status:", SwingConstants.RIGHT); + JLabel connectLabel = + DockingUtils.createNonHtmlLabel("Connection Status:", SwingConstants.RIGHT); panel.add(connectLabel); connectionButton = new JButton( @@ -266,7 +270,8 @@ public class ProjectInfoDialog extends DialogComponentProvider { buttonPanel.add(connectionButton); panel.add(buttonPanel); - JLabel userLabel = new JLabel("User Access Level:", SwingConstants.RIGHT); + JLabel userLabel = + DockingUtils.createNonHtmlLabel("User Access Level:", SwingConstants.RIGHT); userLabel.setToolTipText("Indicates your privileges in the shared repository"); panel.add(userLabel); User user = null; @@ -278,7 +283,7 @@ public class ProjectInfoDialog extends DialogComponentProvider { Msg.error(this, "Unable to get the current user", e); } } - userAccessLabel = new JLabel(getAccessString(user)); + userAccessLabel = DockingUtils.createNonHtmlLabel(getAccessString(user)); userAccessLabel.setName("User Access Level"); panel.add(userLabel); panel.add(userAccessLabel); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/RepositoryChooser.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/RepositoryChooser.java index 279da3f92c..fe716aab7c 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/RepositoryChooser.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/RepositoryChooser.java @@ -15,15 +15,6 @@ */ package ghidra.framework.main; -import ghidra.framework.client.*; -import ghidra.framework.model.ServerInfo; -import ghidra.framework.protocol.ghidra.GhidraURL; -import ghidra.framework.remote.GhidraServerHandle; -import ghidra.util.MessageType; -import ghidra.util.Msg; -import ghidra.util.layout.MiddleLayout; -import ghidra.util.layout.PairLayout; - import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.event.*; @@ -34,8 +25,17 @@ import java.net.URL; import javax.swing.*; import javax.swing.event.*; -import resources.ResourceManager; import docking.DialogComponentProvider; +import docking.DockingUtils; +import ghidra.framework.client.*; +import ghidra.framework.model.ServerInfo; +import ghidra.framework.protocol.ghidra.GhidraURL; +import ghidra.framework.remote.GhidraServerHandle; +import ghidra.util.MessageType; +import ghidra.util.Msg; +import ghidra.util.layout.MiddleLayout; +import ghidra.util.layout.PairLayout; +import resources.ResourceManager; class RepositoryChooser extends DialogComponentProvider { @@ -73,6 +73,7 @@ class RepositoryChooser extends DialogComponentProvider { serverInfoComponent = new ServerInfoComponent(); serverInfoComponent.setStatusListener(this); serverInfoComponent.setChangeListener(new ChangeListener() { + @Override public void stateChanged(ChangeEvent e) { serverInfoChanged(); } @@ -83,6 +84,7 @@ class RepositoryChooser extends DialogComponentProvider { queryButton.setToolTipText("Refresh Repository Names List"); setDefaultButton(queryButton); queryButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { queryServer(); } @@ -94,14 +96,16 @@ class RepositoryChooser extends DialogComponentProvider { serverInfoPanel.add(topPanel, BorderLayout.NORTH); JPanel lowerPanel = new JPanel(new BorderLayout()); - JLabel label = new JLabel("Repository Names", SwingConstants.LEFT); + JLabel label = DockingUtils.createNonHtmlLabel("Repository Names", SwingConstants.LEFT); label.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 5)); lowerPanel.add(label, BorderLayout.NORTH); - listModel = new DefaultListModel(); - nameList = new JList(listModel); + listModel = new DefaultListModel<>(); + nameList = new JList<>(listModel); + DockingUtils.turnOffHTMLRendering(nameList); nameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); nameList.addListSelectionListener(new ListSelectionListener() { + @Override public void valueChanged(ListSelectionEvent e) { selectionChanged(); } @@ -134,7 +138,7 @@ class RepositoryChooser extends DialogComponentProvider { urlTextField = new JTextField("ghidra:"); JPanel panel = new JPanel(new PairLayout()); - panel.add(new JLabel("URL:")); + panel.add(DockingUtils.createNonHtmlLabel("URL:")); panel.add(urlTextField); urlPanel.add(panel, BorderLayout.NORTH); @@ -172,6 +176,7 @@ class RepositoryChooser extends DialogComponentProvider { radioButtonPanel.setBorder(BorderFactory.createTitledBorder("Repository Specification")); ChangeListener choiceListener = new ChangeListener() { + @Override public void stateChanged(ChangeEvent e) { Object src = e.getSource(); if (src instanceof JRadioButton) { @@ -225,9 +230,8 @@ class RepositoryChooser extends DialogComponentProvider { listModel.clear(); - RepositoryServerAdapter repositoryServer = - ClientUtil.getRepositoryServer(serverInfoComponent.getServerName(), - serverInfoComponent.getPortNumber(), true); + RepositoryServerAdapter repositoryServer = ClientUtil.getRepositoryServer( + serverInfoComponent.getServerName(), serverInfoComponent.getPortNumber(), true); if (repositoryServer == null) { return; diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/RepositoryPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/RepositoryPanel.java index cc75f75a04..9bbf7d250b 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/RepositoryPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/RepositoryPanel.java @@ -22,6 +22,7 @@ import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.event.*; +import docking.DockingUtils; import docking.wizard.*; import ghidra.app.util.GenericHelpTopics; import ghidra.util.HelpLocation; @@ -58,6 +59,7 @@ public class RepositoryPanel extends AbstractWizardJPanel { /* (non Javadoc) * @see ghidra.util.bean.wizard.WizardPanel#getTitle() */ + @Override public String getTitle() { return "Specify Repository Name on " + serverName; } @@ -65,6 +67,7 @@ public class RepositoryPanel extends AbstractWizardJPanel { /* (non Javadoc) * @see ghidra.util.bean.wizard.WizardPanel#initialize() */ + @Override public void initialize() { existingRepButton.setSelected(true); nameList.clearSelection(); @@ -74,6 +77,7 @@ public class RepositoryPanel extends AbstractWizardJPanel { /** * Return whether the user entry is valid */ + @Override public boolean isValidInformation() { if (createRepButton.isSelected()) { String name = nameField.getText(); @@ -147,7 +151,7 @@ public class RepositoryPanel extends AbstractWizardJPanel { buttonGroup.add(existingRepButton); JPanel innerPanel = new JPanel(new BorderLayout()); - JLabel label = new JLabel("Repository Names", SwingConstants.LEFT); + JLabel label = DockingUtils.createNonHtmlLabel("Repository Names", SwingConstants.LEFT); label.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 5)); innerPanel.add(label, BorderLayout.NORTH); @@ -156,6 +160,7 @@ public class RepositoryPanel extends AbstractWizardJPanel { listModel.addElement(repositoryName); } nameList = new JList<>(listModel); + DockingUtils.turnOffHTMLRendering(nameList); nameList.setEnabled(existingRepButton.isSelected()); JScrollPane sp = new JScrollPane(nameList); innerPanel.add(sp); @@ -174,19 +179,22 @@ public class RepositoryPanel extends AbstractWizardJPanel { createRepButton = new JRadioButton("Create Repository", !existingRepButton.isSelected()); buttonGroup.add(createRepButton); - nameLabel = new JLabel("Repository Name:", SwingConstants.RIGHT); + nameLabel = DockingUtils.createNonHtmlLabel("Repository Name:", SwingConstants.RIGHT); nameLabel.setEnabled(createRepButton.isSelected()); nameField = new JTextField(20); DocumentListener dl = new DocumentListener() { + @Override public void insertUpdate(DocumentEvent e) { validateName(); } + @Override public void removeUpdate(DocumentEvent e) { validateName(); } + @Override public void changedUpdate(DocumentEvent e) { validateName(); } @@ -226,6 +234,7 @@ public class RepositoryPanel extends AbstractWizardJPanel { private void addListeners() { ActionListener listener = new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { boolean existingRepSelected = existingRepButton.isSelected(); nameList.setEnabled(existingRepSelected); @@ -249,6 +258,7 @@ public class RepositoryPanel extends AbstractWizardJPanel { /* (non Javadoc) * @see javax.swing.event.ListSelectionListener#valueChanged(javax.swing.event.ListSelectionEvent) */ + @Override public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) { return; diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SaveDataDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SaveDataDialog.java index a11b9ad621..831061565e 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SaveDataDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SaveDataDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +15,6 @@ */ package ghidra.framework.main; -import ghidra.framework.model.DomainFile; -import ghidra.framework.model.ProjectLocator; -import ghidra.framework.plugintool.PluginTool; -import ghidra.util.HelpLocation; -import ghidra.util.Msg; -import ghidra.util.exception.CancelledException; -import ghidra.util.task.*; - import java.awt.*; import java.awt.event.*; import java.lang.reflect.InvocationTargetException; @@ -33,10 +24,16 @@ import java.util.List; import javax.swing.*; import javax.swing.border.TitledBorder; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; +import docking.*; import docking.options.editor.ButtonPanelFactory; import docking.widgets.list.ListPanel; +import ghidra.framework.model.DomainFile; +import ghidra.framework.model.ProjectLocator; +import ghidra.framework.plugintool.PluginTool; +import ghidra.util.HelpLocation; +import ghidra.util.Msg; +import ghidra.util.exception.CancelledException; +import ghidra.util.task.*; /** * Modal dialog to display a list of domain objects that have changed. @@ -136,7 +133,7 @@ public class SaveDataDialog extends DialogComponentProvider { @Override protected void okCallback() { - List list = new ArrayList(); + List list = new ArrayList<>(); for (int i = 0; i < checkboxes.length; i++) { if (checkboxes[i].isSelected()) { @@ -180,8 +177,8 @@ public class SaveDataDialog extends DialogComponentProvider { deselectAllButton = new JButton(DESELECT_ALL); deselectAllButton.setMnemonic('N'); - JPanel buttonPanel = - ButtonPanelFactory.createButtonPanel(new JButton[] { selectAllButton, deselectAllButton }); + JPanel buttonPanel = ButtonPanelFactory.createButtonPanel( + new JButton[] { selectAllButton, deselectAllButton }); // // List Panel @@ -247,7 +244,7 @@ public class SaveDataDialog extends DialogComponentProvider { private List checkForUnsavedFiles(List domainFiles) { - List unsavedFiles = new ArrayList(); + List unsavedFiles = new ArrayList<>(); for (DomainFile domainFile : domainFiles) { if (domainFile.isChanged()) { unsavedFiles.add(domainFile); @@ -267,6 +264,7 @@ public class SaveDataDialog extends DialogComponentProvider { yesButton.setEnabled(false); for (int i = 0; i < files.size(); i++) { checkboxes[i] = new JCheckBox(files.get(i).getName()); + DockingUtils.turnOffHTMLRendering(checkboxes[i]); checkboxes[i].setBackground(Color.white); saveable[i] = files.get(i).canSave(); if (!saveable[i]) { @@ -274,9 +272,8 @@ public class SaveDataDialog extends DialogComponentProvider { if (!files.get(i).isInWritableProject()) { ProjectLocator projectLocator = files.get(i).getProjectLocator(); if (projectLocator != null) { - text = - files.get(i).getName() + " (Read-Only from " + - files.get(i).getProjectLocator().getName() + ")"; + text = files.get(i).getName() + " (Read-Only from " + + files.get(i).getProjectLocator().getName() + ")"; } } checkboxes[i].setText(text); @@ -295,13 +292,13 @@ public class SaveDataDialog extends DialogComponentProvider { /** * Cell renderer to show the checkboxes for the changed data files. */ - private class DataCellRenderer implements ListCellRenderer { + private class DataCellRenderer implements ListCellRenderer { private Font boldFont; @Override - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { + public Component getListCellRendererComponent(JList list, + JCheckBox value, int index, boolean isSelected, boolean cellHasFocus) { if (boldFont == null) { Font font = list.getFont(); @@ -313,7 +310,7 @@ public class SaveDataDialog extends DialogComponentProvider { checkboxes[index].setForeground(Color.red); checkboxes[index].setFont(boldFont); } - return (checkboxes[index]); + return checkboxes[index]; } } @@ -333,8 +330,8 @@ public class SaveDataDialog extends DialogComponentProvider { } if (!saveable[index]) { - setStatusText(files.get(index).getPathname() + - " cannot be saved to current location"); + setStatusText( + files.get(index).getPathname() + " cannot be saved to current location"); return; } boolean selected = checkboxes[index].isSelected(); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SelectProjectPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SelectProjectPanel.java index a5b61e170d..e8e498b4c3 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SelectProjectPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/SelectProjectPanel.java @@ -25,6 +25,7 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.Document; +import docking.DockingUtils; import docking.options.editor.ButtonPanelFactory; import docking.widgets.filechooser.GhidraFileChooser; import docking.wizard.AbstractWizardJPanel; @@ -72,6 +73,7 @@ class SelectProjectPanel extends AbstractWizardJPanel { /* (non Javadoc) * @see ghidra.util.bean.wizard.WizardPanel#getTitle() */ + @Override public String getTitle() { if (panelManager.isSharedProject()) { return "Select Local Project Location for Repository " + @@ -83,6 +85,7 @@ class SelectProjectPanel extends AbstractWizardJPanel { /* (non Javadoc) * @see ghidra.util.bean.wizard.WizardPanel#initialize() */ + @Override public void initialize() { projectLocator = null; Document doc = projectNameField.getDocument(); @@ -95,6 +98,7 @@ class SelectProjectPanel extends AbstractWizardJPanel { /** * Return true if the user has entered a valid project file */ + @Override public boolean isValidInformation() { return projectLocator != null; } @@ -131,7 +135,8 @@ class SelectProjectPanel extends AbstractWizardJPanel { GridBagLayout gbl = new GridBagLayout(); outerPanel.setLayout(gbl); - JLabel dirLabel = new JLabel("Project Directory:", SwingConstants.RIGHT); + JLabel dirLabel = + DockingUtils.createNonHtmlLabel("Project Directory:", SwingConstants.RIGHT); directoryField = new JTextField(25); directoryField.setName("Project Directory"); @@ -144,24 +149,29 @@ class SelectProjectPanel extends AbstractWizardJPanel { directoryField.setText(projectDirectory.getAbsolutePath()); } directoryField.setCaretPosition(directoryField.getText().length() - 1); - JLabel projectNameLabel = new JLabel("Project Name:", SwingConstants.RIGHT); + JLabel projectNameLabel = + DockingUtils.createNonHtmlLabel("Project Name:", SwingConstants.RIGHT); projectNameField = new JTextField(25); projectNameField.setName("Project Name"); projectNameField.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setProjectFile(); } }); docListener = new DocumentListener() { + @Override public void insertUpdate(DocumentEvent e) { setProjectFile(); } + @Override public void removeUpdate(DocumentEvent e) { setProjectFile(); } + @Override public void changedUpdate(DocumentEvent e) { setProjectFile(); } @@ -171,6 +181,7 @@ class SelectProjectPanel extends AbstractWizardJPanel { browseButton = ButtonPanelFactory.createButton(ButtonPanelFactory.BROWSE_TYPE); browseButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { displayFileChooser(); } @@ -281,9 +292,8 @@ class SelectProjectPanel extends AbstractWizardJPanel { } else if (projectLocator.getMarkerFile().exists() || projectLocator.getProjectDir().exists()) { - msg = - getProjectName("A project named " + projectLocator.getName() + - " already exists in " + parentDir.getAbsolutePath()); + msg = getProjectName("A project named " + projectLocator.getName() + + " already exists in " + parentDir.getAbsolutePath()); } else { this.projectLocator = projectLocator; @@ -336,10 +346,12 @@ class SelectProjectPanel extends AbstractWizardJPanel { } fileChooser.setFileSelectionMode(GhidraFileChooser.DIRECTORIES_ONLY); fileChooser.setFileFilter(new GhidraFileFilter() { + @Override public String getDescription() { return "All Directories"; } + @Override public boolean accept(File f, GhidraFileChooserModel model) { return model.isDirectory(f) && !f.getName().endsWith(ProjectLocator.getProjectDirExtension()); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ServerInfoComponent.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ServerInfoComponent.java index 5df61b7218..f9d571d205 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ServerInfoComponent.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ServerInfoComponent.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,12 +15,6 @@ */ package ghidra.framework.main; -import ghidra.framework.model.ServerInfo; -import ghidra.framework.remote.GhidraServerHandle; -import ghidra.util.MessageType; -import ghidra.util.StatusListener; -import ghidra.util.layout.PairLayout; - import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -29,7 +22,13 @@ import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.event.*; +import docking.DockingUtils; import docking.ToolTipManager; +import ghidra.framework.model.ServerInfo; +import ghidra.framework.remote.GhidraServerHandle; +import ghidra.util.MessageType; +import ghidra.util.StatusListener; +import ghidra.util.layout.PairLayout; /** * Component that allows the user to specify the host name and port @@ -95,49 +94,57 @@ public class ServerInfoComponent extends JPanel { } private void buildMainPanel() { - JLabel nameLabel = new JLabel("Server Name:", SwingConstants.RIGHT); + JLabel nameLabel = DockingUtils.createNonHtmlLabel("Server Name:", SwingConstants.RIGHT); nameField = new JTextField(20); nameField.setName("Server Name"); nameField.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { nameField.transferFocus(); } }); nameDocListener = new DocumentListener() { + @Override public void changedUpdate(DocumentEvent e) { notifyChange(); } + @Override public void insertUpdate(DocumentEvent e) { notifyChange(); } + @Override public void removeUpdate(DocumentEvent e) { notifyChange(); } }; nameField.getDocument().addDocumentListener(nameDocListener); - JLabel portLabel = new JLabel("Port Number:", SwingConstants.RIGHT); + JLabel portLabel = DockingUtils.createNonHtmlLabel("Port Number:", SwingConstants.RIGHT); portNumberField = new JTextField(20); portNumberField.setName("Port Number"); portNumberField.setText(Integer.toString(GhidraServerHandle.DEFAULT_PORT)); portNumberField.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { portNumberField.transferFocus(); } }); portDocListener = new DocumentListener() { + @Override public void insertUpdate(DocumentEvent e) { notifyChange(); } + @Override public void removeUpdate(DocumentEvent e) { notifyChange(); } + @Override public void changedUpdate(DocumentEvent e) { notifyChange(); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolButton.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolButton.java index c6dd9402e8..fd6eaa14de 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolButton.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolButton.java @@ -36,8 +36,7 @@ import ghidra.framework.main.datatree.*; import ghidra.framework.model.*; import ghidra.framework.plugintool.PluginTool; import ghidra.framework.project.tool.ToolIconURL; -import ghidra.util.HelpLocation; -import ghidra.util.Msg; +import ghidra.util.*; import ghidra.util.bean.GGlassPane; import ghidra.util.exception.AssertException; @@ -140,12 +139,13 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { public String getToolTipText(MouseEvent event) { if (associatedRunningTool != null) { if (associatedRunningTool instanceof PluginTool) { - return ((PluginTool) associatedRunningTool).getToolFrame().getTitle(); + return "" + HTMLUtilities.friendlyEncodeHTML( + ((PluginTool) associatedRunningTool).getToolFrame().getTitle()); } - return associatedRunningTool.getName(); + return "" + HTMLUtilities.friendlyEncodeHTML(associatedRunningTool.getName()); } - return template.getName(); + return "" + HTMLUtilities.friendlyEncodeHTML(template.getName()); } public void launchTool(DomainFile domainFile) { @@ -359,8 +359,9 @@ class ToolButton extends EmptyBorderButton implements Draggable, Droppable { } Class c = file.getDomainObjectClass(); - Class[] classes = (associatedRunningTool != null) - ? associatedRunningTool.getSupportedDataTypes() : template.getSupportedDataTypes(); + Class[] classes = + (associatedRunningTool != null) ? associatedRunningTool.getSupportedDataTypes() + : template.getSupportedDataTypes(); for (Class element : classes) { if (element.isAssignableFrom(c)) { return true; diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolConnectionPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolConnectionPanel.java index a6e497b83c..fdf439a25c 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolConnectionPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ToolConnectionPanel.java @@ -24,6 +24,8 @@ import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import docking.DockingUtils; +import docking.widgets.list.GListCellRenderer; import ghidra.framework.model.*; import ghidra.util.Msg; @@ -230,8 +232,10 @@ class ToolConnectionPanel extends JPanel implements ListSelectionListener { } }); eventList.setCellRenderer(new DataCellRenderer()); - producerList.setCellRenderer(new ToolListCellRenderer()); - consumerList.setCellRenderer(new ToolListCellRenderer()); + producerList.setCellRenderer( + GListCellRenderer.createDefaultCellTextRenderer(tool -> tool.getName())); + consumerList.setCellRenderer( + GListCellRenderer.createDefaultCellTextRenderer(tool -> tool.getName())); producerModel = (DefaultListModel) producerList.getModel(); consumerModel = (DefaultListModel) consumerList.getModel(); } @@ -419,9 +423,9 @@ class ToolConnectionPanel extends JPanel implements ListSelectionListener { JComponent[] row1 = null; JComponent[] row2 = null; - JLabel producerLabel = new JLabel("Event Producer:"); - JLabel consumerLabel = new JLabel("Event Consumer:"); - JLabel eventLabel = new JLabel("Event Names:"); + JLabel producerLabel = DockingUtils.createNonHtmlLabel("Event Producer:"); + JLabel consumerLabel = DockingUtils.createNonHtmlLabel("Event Consumer:"); + JLabel eventLabel = DockingUtils.createNonHtmlLabel("Event Names:"); JComponent[] c1 = { producerLabel, consumerLabel, eventLabel }; JComponent[] c2 = { producerListScrollPane, consumerListScrollPane, eventListScrollPane }; @@ -481,34 +485,4 @@ class ToolConnectionPanel extends JPanel implements ListSelectionListener { } } - private class ToolListCellRenderer extends JLabel implements ListCellRenderer { - ToolListCellRenderer() { - setOpaque(true); - setVerticalAlignment(CENTER); - } - - @Override - public Component getListCellRendererComponent(JList list, Tool value, - int index, boolean isSelected, boolean cellHasFocus) { - Tool tool = null; - if (list == consumerList) { - tool = consumerModel.elementAt(index); - } - else { - tool = producerModel.elementAt(index); - } - - if (isSelected) { - setBackground(list.getSelectionBackground()); - setForeground(list.getSelectionForeground()); - } - else { - setBackground(list.getBackground()); - setForeground(list.getForeground()); - } - - setText(tool.getName()); - return this; - } - } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/UserAgreementDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/UserAgreementDialog.java index 8d1fe12920..99e9e2e663 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/UserAgreementDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/UserAgreementDialog.java @@ -21,8 +21,7 @@ import java.io.InputStream; import javax.swing.*; import javax.swing.text.html.HTMLEditorKit; -import docking.DialogComponentProvider; -import docking.DockingWindowManager; +import docking.*; import ghidra.util.HTMLUtilities; import ghidra.util.Msg; import ghidra.util.layout.VerticalLayout; @@ -54,7 +53,8 @@ public class UserAgreementDialog extends DialogComponentProvider { private JComponent buildWorkPanel() { Font font = new Font("Default", Font.PLAIN, 16); JPanel panel = new JPanel(new BorderLayout()); - JLabel label = new JLabel("Ghidra User Agreement", SwingConstants.CENTER); + JLabel label = + DockingUtils.createNonHtmlLabel("Ghidra User Agreement", SwingConstants.CENTER); label.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); label.setFont(font.deriveFont(Font.ITALIC, 22f)); panel.add(label, BorderLayout.NORTH); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ViewProjectAccessPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ViewProjectAccessPanel.java index e5422cd56b..5633cc7125 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ViewProjectAccessPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ViewProjectAccessPanel.java @@ -22,6 +22,7 @@ import java.util.List; import javax.swing.*; +import docking.DockingUtils; import ghidra.framework.client.RepositoryAdapter; import ghidra.framework.plugintool.PluginTool; import ghidra.framework.remote.User; @@ -79,7 +80,8 @@ public class ViewProjectAccessPanel extends ProjectAccessPanel { mainPanel.add(userAccessPanel, BorderLayout.CENTER); if (anonymousServerAccessAllowed && origAnonymousAccessEnabled) { - JLabel anonymousAccessLabel = new JLabel("Anonymous Read-Only Access Enabled"); + JLabel anonymousAccessLabel = + DockingUtils.createNonHtmlLabel("Anonymous Read-Only Access Enabled"); anonymousAccessLabel.setBorder(BorderFactory.createEmptyBorder(5, 2, 0, 0)); Font f = anonymousAccessLabel.getFont().deriveFont(Font.ITALIC); anonymousAccessLabel.setFont(f); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/WorkspacePanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/WorkspacePanel.java index 2dbbdf57c5..8f3d0dac2c 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/WorkspacePanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/WorkspacePanel.java @@ -23,6 +23,7 @@ import java.util.HashMap; import javax.swing.*; import javax.swing.border.Border; +import docking.DockingUtils; import docking.help.Help; import docking.help.HelpService; import docking.widgets.dialogs.InputDialog; @@ -66,6 +67,7 @@ class WorkspacePanel extends JPanel implements WorkspaceChangeListener { // workspace becomes active workspaceModel = new DefaultComboBoxModel<>(); workspaceChooser = new JComboBox<>(workspaceModel); + DockingUtils.turnOffHTMLRendering(workspaceChooser); workspaceChooser.addItemListener(e -> { if (e.getStateChange() == ItemEvent.SELECTED) { chooseWorkspace((String) workspaceModel.getSelectedItem()); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java index 0f7ab9b912..990822d725 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java @@ -25,8 +25,7 @@ import java.util.List; import javax.swing.*; -import docking.ActionContext; -import docking.ComponentProvider; +import docking.*; import docking.action.DockingActionIf; import docking.help.Help; import docking.help.HelpService; @@ -79,12 +78,12 @@ public class ProjectDataTablePanel extends JPanel { private void buildContent() { model = new ProjectDataTableModel(tool); model.addThreadedTableModelListener(new SelectPendingFilesListener()); - table = new GFilterTable(model) { + table = new GFilterTable<>(model) { @Override protected GThreadedTablePanel createThreadedTablePanel( ThreadedTableModel threadedModel) { - return new GThreadedTablePanel(threadedModel) { + return new GThreadedTablePanel<>(threadedModel) { @Override protected GTable createTable(ThreadedTableModel m) { // the table's default actions aren't that useful in the Front End @@ -221,8 +220,8 @@ public class ProjectDataTablePanel extends JPanel { } } - private JLabel capacityExceededText = - new JLabel("

    Table view disabled for very large projects, or
    " + + private JLabel capacityExceededText = DockingUtils.createHtmlLabel( + "
    Table view disabled for very large projects, or
    " + "if an older project/repository filesystem is in use.
    " + "View will remain disabled until project is closed.
    "); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/CheckoutDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/CheckoutDialog.java index 96a53994f7..96fead1358 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/CheckoutDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/CheckoutDialog.java @@ -20,6 +20,7 @@ import java.awt.BorderLayout; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.MultiLineLabel; import docking.widgets.OptionDialog; import ghidra.app.util.GenericHelpTopics; @@ -77,8 +78,8 @@ public class CheckoutDialog extends DialogComponentProvider { innerPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); JPanel msgPanel = new JPanel(new BorderLayout()); - JLabel warnIcon = - new JLabel(OptionDialog.getIconForMessageType(OptionDialog.QUESTION_MESSAGE)); + JLabel warnIcon = DockingUtils.createNonHtmlLabel( + OptionDialog.getIconForMessageType(OptionDialog.QUESTION_MESSAGE)); msgPanel.add(warnIcon, BorderLayout.WEST); MultiLineLabel msgText = new MultiLineLabel("Check out selected file(s)?"); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DomainFilesPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DomainFilesPanel.java index 3947ba5385..03f47fddab 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DomainFilesPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/DomainFilesPanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +15,6 @@ */ package ghidra.framework.main.datatree; -import ghidra.framework.model.DomainFile; - import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -27,17 +24,18 @@ import java.util.List; import javax.swing.*; import docking.widgets.list.ListPanel; +import ghidra.framework.model.DomainFile; /** * Reusable Panel that shows a list of checkboxes for each domain * file in a list. */ class DomainFilesPanel extends JPanel { - + private List fileList; - private JCheckBox []checkboxes; - private ListPanel listPanel; - + private JCheckBox[] checkboxes; + private ListPanel listPanel; + /** * Constructor * @param fileList list of DomainFile objects @@ -45,96 +43,96 @@ class DomainFilesPanel extends JPanel { DomainFilesPanel(List fileList, String listTitle) { super(); this.fileList = fileList; - setLayout(new BorderLayout()); - setBorder(BorderFactory.createEmptyBorder(5, 5, 0, 5)); - - JPanel innerPanel = new JPanel(new BorderLayout()); - checkboxes = new JCheckBox[fileList.size()]; - for (int i=0; i list = new ArrayList(); - for (int i=0; i list = new ArrayList<>(); + for (int i = 0; i < checkboxes.length; i++) { if (checkboxes[i].isSelected()) { list.add(fileList.get(i)); } } DomainFile[] files = new DomainFile[list.size()]; - return list.toArray(files); + return list.toArray(files); } - - /** - * Cell renderer to show the checkboxes for the changed data files. - */ - private class DataCellRenderer implements ListCellRenderer { - public Component getListCellRendererComponent(JList list, - Object value, int index, boolean isSelected, - boolean cellHasFocus) { + /** + * Cell renderer to show the checkboxes for the changed data files. + */ + private class DataCellRenderer implements ListCellRenderer { - if (index == -1) { - int selected = list.getSelectedIndex(); - if (selected == -1) { - return null; - } - index = selected; - } - return(checkboxes[index]); - } - } - /** - * Mouse listener to get the selected cell in the list. - */ - private class ListMouseListener extends MouseAdapter { + @Override + public Component getListCellRendererComponent(JList list, + JCheckBox value, int index, boolean isSelected, boolean cellHasFocus) { - @Override - public void mouseClicked(MouseEvent e) { - if ( e.getClickCount() != 1 ) { - return; - } - - JList list = (JList)e.getSource(); - int index = list.locationToIndex(e.getPoint()); - if (index < 0) { - return; - } - boolean selected = checkboxes[index].isSelected(); - checkboxes[index].setSelected(!selected); - // The following repaint() is to get the check box state to get refreshed on the screen. - // Prior to adding this the check box did not refresh the display of its state in the - // list when selected multiple times in a row. It only seemed to repaint when focus - // was lost. - list.repaint(); - } - } + if (index == -1) { + int selected = list.getSelectedIndex(); + if (selected == -1) { + return null; + } + index = selected; + } + return checkboxes[index]; + } + } + /** + * Mouse listener to get the selected cell in the list. + */ + private class ListMouseListener extends MouseAdapter { + + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() != 1) { + return; + } + + JList list = (JList) e.getSource(); + int index = list.locationToIndex(e.getPoint()); + if (index < 0) { + return; + } + boolean selected = checkboxes[index].isSelected(); + checkboxes[index].setSelected(!selected); + // The following repaint() is to get the check box state to get refreshed on the screen. + // Prior to adding this the check box did not refresh the display of its state in the + // list when selected multiple times in a row. It only seemed to repaint when focus + // was lost. + list.repaint(); + } + } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/UndoActionDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/UndoActionDialog.java index 5dceee5f4c..883d2cf6a9 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/UndoActionDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/UndoActionDialog.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,17 +15,17 @@ */ package ghidra.framework.main.datatree; -import ghidra.app.util.GenericHelpTopics; -import ghidra.framework.model.DomainFile; -import ghidra.framework.plugintool.PluginTool; -import ghidra.util.HelpLocation; - import java.awt.BorderLayout; import java.util.List; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; +import ghidra.app.util.GenericHelpTopics; +import ghidra.framework.model.DomainFile; +import ghidra.framework.plugintool.PluginTool; +import ghidra.util.HelpLocation; /** * Dialog that confirms undo of an action; specify whether a .keep file @@ -103,9 +102,9 @@ public class UndoActionDialog extends DialogComponentProvider { JPanel cbPanel = new JPanel(new BorderLayout()); cbPanel.add(saveCopyCB); - JLabel label = - new JLabel("Undo " + actionString + " of the selected files:", SwingConstants.LEFT); - JLabel iconLabel = new JLabel(icon); + JLabel label = DockingUtils.createNonHtmlLabel( + "Undo " + actionString + " of the selected files:", SwingConstants.LEFT); + JLabel iconLabel = DockingUtils.createNonHtmlLabel(icon); JPanel iconPanel = new JPanel(new BorderLayout(10, 0)); iconPanel.add(iconLabel, BorderLayout.WEST); iconPanel.add(label, BorderLayout.CENTER); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionControlDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionControlDialog.java index 14b73ebbde..80371f5fd6 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionControlDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionControlDialog.java @@ -21,6 +21,7 @@ import java.awt.Component; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import ghidra.app.util.GenericHelpTopics; import ghidra.framework.plugintool.PluginTool; import ghidra.util.HelpLocation; @@ -144,14 +145,15 @@ public class VersionControlDialog extends DialogComponentProvider { ImageIcon icon = resources.ResourceManager.loadImage( addToVersionControl ? "images/vcAdd.png" : "images/vcCheckIn.png"); - descriptionLabel = new JLabel(addToVersionControl ? "Add comments to describe the file." - : "Add comments to describe changes", + descriptionLabel = DockingUtils.createNonHtmlLabel( + addToVersionControl ? "Add comments to describe the file." + : "Add comments to describe changes", SwingConstants.LEFT); JPanel dPanel = new JPanel(new BorderLayout(10, 0)); - dPanel.add(new JLabel(icon), BorderLayout.WEST); + dPanel.add(DockingUtils.createNonHtmlLabel(icon), BorderLayout.WEST); dPanel.add(descriptionLabel, BorderLayout.CENTER); - JLabel commentsLabel = new JLabel("Comments:", SwingConstants.LEFT); + JLabel commentsLabel = DockingUtils.createNonHtmlLabel("Comments:", SwingConstants.LEFT); JPanel cPanel = new JPanel(new BorderLayout()); cPanel.add(commentsLabel); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataDeleteAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataDeleteAction.java index ba9b4d2af4..66e9be467c 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataDeleteAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataDeleteAction.java @@ -29,6 +29,7 @@ import ghidra.framework.main.datatable.ProjectDataActionContext; import ghidra.framework.main.datatable.ProjectDataContextAction; import ghidra.framework.model.DomainFile; import ghidra.framework.model.DomainFolder; +import ghidra.util.HTMLUtilities; import ghidra.util.task.TaskLauncher; import resources.ResourceManager; import util.CollectionUtils; @@ -89,7 +90,7 @@ public class ProjectDataDeleteAction extends ProjectDataContextAction { if (!selectedFiles.isEmpty()) { DomainFile file = CollectionUtils.any(selectedFiles); return "Are you sure you want to permanently delete \"" + - file.getName() + "\"?"; + HTMLUtilities.friendlyEncodeHTML(file.getName()) + "\"?"; } // only folders are selected, but they contain files diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataOpenToolAction.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataOpenToolAction.java index 8e46608f25..fe9e779244 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataOpenToolAction.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/projectdata/actions/ProjectDataOpenToolAction.java @@ -24,6 +24,7 @@ import ghidra.framework.main.AppInfo; import ghidra.framework.main.datatable.ProjectDataActionContext; import ghidra.framework.main.datatable.ProjectDataContextAction; import ghidra.framework.model.*; +import ghidra.util.HTMLUtilities; import ghidra.util.HelpLocation; public class ProjectDataOpenToolAction extends ProjectDataContextAction { @@ -32,7 +33,7 @@ public class ProjectDataOpenToolAction extends ProjectDataContextAction { public ProjectDataOpenToolAction(String owner, String group, String toolName, Icon icon) { super("Open" + toolName, owner); this.toolName = toolName; - String[] menuPath = { "Open With", toolName }; + String[] menuPath = { "Open With", HTMLUtilities.friendlyEncodeHTML(toolName) }; setPopupMenuData(new MenuData(menuPath, icon, "Open")); setHelpLocation(new HelpLocation(owner, "Open_File_With")); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/AbstractDetailsPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/AbstractDetailsPanel.java index c6bcf0ed1e..76f9bf83a1 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/AbstractDetailsPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/AbstractDetailsPanel.java @@ -24,6 +24,9 @@ import javax.swing.text.StyleConstants; import org.apache.commons.lang3.StringUtils; +import docking.DockingUtils; +import ghidra.util.HTMLUtilities; + /** * Abstract class that defines a panel for displaying name/value pairs with html-formatting. *

    @@ -61,7 +64,7 @@ public abstract class AbstractDetailsPanel extends JPanel { SimpleAttributeSet attrSet = new SimpleAttributeSet(); attrSet.addAttribute(StyleConstants.FontFamily, fontFamily); - attrSet.addAttribute(StyleConstants.FontSize, new Integer(fontSize)); + attrSet.addAttribute(StyleConstants.FontSize, Integer.valueOf(fontSize)); attrSet.addAttribute(StyleConstants.Bold, bold); attrSet.addAttribute(StyleConstants.Foreground, color); @@ -83,7 +86,7 @@ public abstract class AbstractDetailsPanel extends JPanel { SimpleAttributeSet attrSet = new SimpleAttributeSet(); attrSet.addAttribute(StyleConstants.FontFamily, "Tahoma"); - attrSet.addAttribute(StyleConstants.FontSize, new Integer(11)); + attrSet.addAttribute(StyleConstants.FontSize, Integer.valueOf(11)); attrSet.addAttribute(StyleConstants.Bold, Boolean.TRUE); attrSet.addAttribute(StyleConstants.Foreground, color); @@ -102,7 +105,7 @@ public abstract class AbstractDetailsPanel extends JPanel { */ protected void createMainPanel() { setLayout(new BorderLayout()); - textLabel = new JLabel(""); + textLabel = DockingUtils.createHtmlLabel(""); textLabel.setVerticalAlignment(SwingConstants.TOP); textLabel.setOpaque(true); textLabel.setBackground(Color.WHITE); @@ -172,7 +175,7 @@ public abstract class AbstractDetailsPanel extends JPanel { buffer.append(""); } - buffer.append(string); + buffer.append(HTMLUtilities.friendlyEncodeHTML(string)); if (isBold) { buffer.append(""); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/IconUrlRenderer.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/IconUrlRenderer.java deleted file mode 100644 index d28ce44f5d..0000000000 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/IconUrlRenderer.java +++ /dev/null @@ -1,57 +0,0 @@ -/* ### - * IP: GHIDRA - * REVIEWED: YES - * - * 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 ghidra.framework.plugintool.dialog; - -import ghidra.framework.project.tool.ToolIconURL; - -import java.awt.Color; -import java.awt.Component; - -import javax.swing.*; -import javax.swing.border.Border; - -class IconUrlRenderer extends JLabel implements ListCellRenderer { - private Border emptyBorder = BorderFactory.createEmptyBorder(5,5,5,5); - private Border blueLineBorder = BorderFactory.createLineBorder(Color.BLUE,2); - private Border emptyBlueBorder = BorderFactory.createEmptyBorder(3,3,3,3); - private Border blueCompoundBorder = BorderFactory.createCompoundBorder(emptyBlueBorder, blueLineBorder); - - IconUrlRenderer() { - super(); - setBorder(emptyBorder); - } - - public Component getListCellRendererComponent(JList list, - Object value, - int index, - boolean isSelected, - boolean cellHasFocus) { - if ((value instanceof ToolIconURL)) { - ToolIconURL url = (ToolIconURL)value; - - setIcon(url.getIcon()); - setText(null);//setText(url.getLocation()); - } - if (isSelected) { - setBorder(blueCompoundBorder); - } - else { - setBorder(emptyBorder); - } - return this; - } -} diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/KeyBindingsPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/KeyBindingsPanel.java index 3c9503b522..77961643d7 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/KeyBindingsPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/KeyBindingsPanel.java @@ -38,6 +38,7 @@ import ghidra.framework.options.Options; import ghidra.framework.options.ToolOptions; import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.util.ToolConstants; +import ghidra.util.HTMLUtilities; import ghidra.util.ReservedKeyBindings; import ghidra.util.exception.AssertException; import ghidra.util.layout.PairLayout; @@ -273,8 +274,8 @@ public class KeyBindingsPanel extends JPanel { JPanel keyPanel = new JPanel(new BorderLayout()); JPanel defaultPanel = new JPanel(new BorderLayout()); - Icon icon = ResourceManager.loadImage("images/information.png"); - JLabel imageLabel = new JLabel(icon); + JLabel imageLabel = + DockingUtils.createNonHtmlLabel(ResourceManager.loadImage("images/information.png")); // the content of the left-hand side label MultiLineLabel mlabel = @@ -720,7 +721,7 @@ public class KeyBindingsPanel extends JPanel { if (description == null || description.trim().isEmpty()) { description = actions.get(0).getName(); } - statusLabel.setText(description); + statusLabel.setText("" + HTMLUtilities.friendlyEncodeHTML(description)); } catch (Exception ex) { statusLabel.setText(""); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginInstallerTableModel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginInstallerTableModel.java index e3a3cf0200..f0347780be 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginInstallerTableModel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginInstallerTableModel.java @@ -29,6 +29,7 @@ import ghidra.docking.settings.Settings; import ghidra.framework.plugintool.*; import ghidra.framework.plugintool.util.PluginDescription; import ghidra.framework.plugintool.util.PluginStatus; +import ghidra.util.HTMLUtilities; import ghidra.util.datastruct.Accumulator; import ghidra.util.exception.CancelledException; import ghidra.util.task.TaskLauncher; @@ -136,12 +137,13 @@ class PluginInstallerTableModel model.getDependencies(targetPluginDescription); String dependenciesToUnloadHtmlList = pluginsThatUseTarget.stream().map(PluginDescription::getName).sorted().collect( - Collectors.joining("

  • ", "
    • ", "
    ")); + Collectors.joining("
  • ", "
    • ", "
    ")); if (pluginsThatUseTarget.isEmpty() || OptionDialog.showYesNoDialog(parentComponent, "Confirm plugin removal", - "Other plugins depend on " + targetPluginDescription.getName() + "

    " + - "Removing it will also remove:" + dependenciesToUnloadHtmlList + + "Other plugins depend on " + + HTMLUtilities.friendlyEncodeHTML(targetPluginDescription.getName()) + + "

    " + "Removing it will also remove:" + dependenciesToUnloadHtmlList + "

    " + "Continue?") == OptionDialog.YES_OPTION) { model.removePlugin(targetPluginDescription); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginManagerComponent.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginManagerComponent.java index 58d81476d1..f6b433551a 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginManagerComponent.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginManagerComponent.java @@ -25,6 +25,7 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.HyperlinkEvent.EventType; +import docking.DockingUtils; import docking.EmptyBorderToggleButton; import docking.widgets.HyperlinkComponent; import ghidra.framework.plugintool.PluginConfigurationModel; @@ -95,8 +96,8 @@ public class PluginManagerComponent extends JPanel implements ChangeListener, Sc jCheckBox.setBackground(BG); panel.add(jCheckBox); panel.add(Box.createHorizontalStrut(10)); - JLabel label = - new JLabel(ResourceManager.getScaledIcon(pluginPackage.getIcon(), 32, 32, 32)); + JLabel label = DockingUtils.createNonHtmlLabel( + ResourceManager.getScaledIcon(pluginPackage.getIcon(), 32, 32, 32)); label.setBackground(BG); panel.add(label); panel.add(Box.createHorizontalStrut(10)); @@ -105,7 +106,7 @@ public class PluginManagerComponent extends JPanel implements ChangeListener, Sc JPanel labelPanel = new JPanel(new VerticalLayout(3)); labelPanel.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); labelPanel.setBackground(BG); - label = new JLabel(pluginPackage.getName()); + label = DockingUtils.createNonHtmlLabel(pluginPackage.getName()); //label.setVerticalAlignment(SwingConstants.TOP); label.setFont(label.getFont().deriveFont(18f)); label.setForeground(Color.BLACK); @@ -123,7 +124,7 @@ public class PluginManagerComponent extends JPanel implements ChangeListener, Sc add(labelPanel); String htmlDescription = getHTMLDescription(); - JLabel descriptionlabel = new JLabel(htmlDescription); + JLabel descriptionlabel = DockingUtils.createHtmlLabel(htmlDescription); descriptionlabel.setForeground(Color.GRAY); descriptionlabel.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); descriptionlabel.setVerticalAlignment(SwingConstants.TOP); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/SaveToolConfigDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/SaveToolConfigDialog.java index 5d5058b3c2..5197a4be1b 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/SaveToolConfigDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/SaveToolConfigDialog.java @@ -26,6 +26,7 @@ import javax.swing.border.TitledBorder; import javax.swing.event.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.options.editor.ButtonPanelFactory; import docking.widgets.OptionDialog; import docking.widgets.filechooser.GhidraFileChooser; @@ -280,7 +281,7 @@ public class SaveToolConfigDialog extends DialogComponentProvider implements Lis nameField = new JTextField(11); nameField.setName("ToolName"); - namePanel.add(new JLabel("Tool Name:", SwingConstants.RIGHT)); + namePanel.add(DockingUtils.createNonHtmlLabel("Tool Name:", SwingConstants.RIGHT)); namePanel.add(nameField); return namePanel; @@ -293,7 +294,7 @@ public class SaveToolConfigDialog extends DialogComponentProvider implements Lis iconList = new JList<>(iconListModel); iconList.setLayoutOrientation(JList.HORIZONTAL_WRAP); iconList.setName("IconList"); - iconList.setCellRenderer(new IconUrlRenderer()); + iconList.setCellRenderer(new ToolIconUrlRenderer()); iconList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); iconList.setSelectedIndex(0); iconList.setVisibleRowCount(2); @@ -315,7 +316,7 @@ public class SaveToolConfigDialog extends DialogComponentProvider implements Lis JPanel panel = new JPanel(new BorderLayout(5, 0)); panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - panel.add(new JLabel("Icon Name:"), BorderLayout.WEST); + panel.add(DockingUtils.createNonHtmlLabel("Icon Name:"), BorderLayout.WEST); panel.add(iconField, BorderLayout.CENTER); panel.add(browseButton, BorderLayout.EAST); return panel; @@ -405,8 +406,8 @@ public class SaveToolConfigDialog extends DialogComponentProvider implements Lis iconFileChooser.setFileSelectionMode(GhidraFileChooser.FILES_ONLY); iconFileChooser.setTitle("Choose Icon"); iconFileChooser.setApproveButtonToolTipText("Choose Icon"); - iconFileChooser.setFileFilter(new ExtensionFileFilter(new String[] { "gif", "jpg", "bmp", - "png" }, "Image Files")); + iconFileChooser.setFileFilter( + new ExtensionFileFilter(new String[] { "gif", "jpg", "bmp", "png" }, "Image Files")); String iconDir = Preferences.getProperty(LAST_ICON_DIRECTORY); if (iconDir != null) { iconFileChooser.setCurrentDirectory(new File(iconDir)); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ToolIconUrlRenderer.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ToolIconUrlRenderer.java new file mode 100644 index 0000000000..036a349485 --- /dev/null +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ToolIconUrlRenderer.java @@ -0,0 +1,56 @@ +/* ### + * IP: GHIDRA + * + * 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 ghidra.framework.plugintool.dialog; + +import java.awt.Color; +import java.awt.Component; + +import javax.swing.BorderFactory; +import javax.swing.JList; +import javax.swing.border.Border; + +import docking.widgets.list.GListCellRenderer; +import ghidra.framework.project.tool.ToolIconURL; + +class ToolIconUrlRenderer extends GListCellRenderer { + private Border emptyBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5); + private Border blueLineBorder = BorderFactory.createLineBorder(Color.BLUE, 2); + private Border emptyBlueBorder = BorderFactory.createEmptyBorder(3, 3, 3, 3); + private Border blueCompoundBorder = + BorderFactory.createCompoundBorder(emptyBlueBorder, blueLineBorder); + + ToolIconUrlRenderer() { + setBorder(emptyBorder); + setShouldAlternateRowBackgroundColors(false); + } + + @Override + protected String getItemText(ToolIconURL value) { + return ""; + } + + @Override + public Component getListCellRendererComponent(JList list, + ToolIconURL toolIconUrl, int index, boolean isSelected, boolean cellHasFocus) { + + // lie to our parent about the selected status to disable the background selection color + super.getListCellRendererComponent(list, toolIconUrl, index, false, cellHasFocus); + setIcon(toolIconUrl.getIcon()); + setBorder(isSelected ? blueCompoundBorder : emptyBorder); + return this; + } + +} diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/DefaultProject.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/DefaultProject.java index d56d9b431d..3a514ccb0d 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/DefaultProject.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/DefaultProject.java @@ -209,8 +209,9 @@ public class DefaultProject implements Project { return null; } - String projectStr = "Project: " + locator.getLocation() + - System.getProperty("file.separator") + locator.getName(); + String projectStr = "Project: " + HTMLUtilities.friendlyEncodeHTML(locator.getLocation()) + + System.getProperty("file.separator") + + HTMLUtilities.friendlyEncodeHTML(locator.getName()); String lockInformation = lock.getExistingLockFileInformation(); if (!lock.canForceLock()) { Msg.showInfo(getClass(), null, "Project Locked", diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/tool/SelectChangedToolDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/tool/SelectChangedToolDialog.java index 169d903219..410a336b6d 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/tool/SelectChangedToolDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/project/tool/SelectChangedToolDialog.java @@ -15,10 +15,6 @@ */ package ghidra.framework.project.tool; -import ghidra.framework.model.Tool; -import ghidra.util.HTMLUtilities; -import ghidra.util.layout.VerticalLayout; - import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ItemEvent; @@ -28,7 +24,11 @@ import java.util.List; import javax.swing.*; import docking.DialogComponentProvider; +import docking.DockingUtils; import docking.widgets.OptionDialog; +import ghidra.framework.model.Tool; +import ghidra.util.HTMLUtilities; +import ghidra.util.layout.VerticalLayout; public class SelectChangedToolDialog extends DialogComponentProvider { @@ -36,85 +36,89 @@ public class SelectChangedToolDialog extends DialogComponentProvider { private boolean wasCancelled; private Tool selectedTool; - - public SelectChangedToolDialog( List toolList ) { - super( "Save Tool Changes?", true, false, true, false ); + + public SelectChangedToolDialog(List toolList) { + super("Save Tool Changes?", true, false, true, false); this.toolList = toolList; - - addWorkPanel( buildWorkPanel() ); - + + addWorkPanel(buildWorkPanel()); + addOKButton(); addCancelButton(); Dimension preferredSize = getPreferredSize(); - setPreferredSize( preferredSize.width, Math.min( 300, preferredSize.height) ); - setRememberLocation( false ); - setRememberSize( false ); + setPreferredSize(preferredSize.width, Math.min(300, preferredSize.height)); + setRememberLocation(false); + setRememberSize(false); } - + private JPanel buildWorkPanel() { - - JPanel panel = new JPanel( new BorderLayout() ); - + + JPanel panel = new JPanel(new BorderLayout()); + String toolName = toolList.get(0).getToolName(); - JLabel descriptionLabel = new JLabel( - HTMLUtilities.toHTML( "There are multiple changed instances of "+toolName+ - " running.

    Which one would like to save to your tool chest?" ) ); - descriptionLabel.setIconTextGap( 15 ); - descriptionLabel.setIcon( - OptionDialog.getIconForMessageType( OptionDialog.WARNING_MESSAGE ) ); - descriptionLabel.setBorder( BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) ); - panel.add( descriptionLabel, BorderLayout.NORTH ); - JScrollPane scrollPane = new JScrollPane( buildRadioButtonPanel() ); - scrollPane.setBorder( BorderFactory.createEmptyBorder( 10, 10, 10, 10 ) ); - panel.add( scrollPane ); + JLabel descriptionLabel = DockingUtils.createHtmlLabel( + HTMLUtilities.toHTML("There are multiple changed instances of " + + HTMLUtilities.friendlyEncodeHTML(toolName) + + " running.

    Which one would like to save to your tool chest?")); + descriptionLabel.setIconTextGap(15); + descriptionLabel.setIcon(OptionDialog.getIconForMessageType(OptionDialog.WARNING_MESSAGE)); + descriptionLabel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + panel.add(descriptionLabel, BorderLayout.NORTH); + JScrollPane scrollPane = new JScrollPane(buildRadioButtonPanel()); + scrollPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + panel.add(scrollPane); return panel; } - + private JPanel buildRadioButtonPanel() { - JPanel panel = new JPanel( new VerticalLayout( 5 ) ); - + JPanel panel = new JPanel(new VerticalLayout(5)); + ButtonGroup buttonGroup = new ButtonGroup(); - - JRadioButton noneButton = new JRadioButton( "None" ); + + JRadioButton noneButton = new JRadioButton("None"); ItemListener listener = new ItemListener() { - public void itemStateChanged( ItemEvent e ) { + @Override + public void itemStateChanged(ItemEvent e) { selectedTool = null; } }; - noneButton.addItemListener( listener ); - buttonGroup.add( noneButton ); - panel.add( noneButton ); - - for ( final Tool tool : toolList ) { - JRadioButton radioButton = new JRadioButton( tool.getName() ); - radioButton.addItemListener( new ItemListener() { - public void itemStateChanged( ItemEvent e ) { + noneButton.addItemListener(listener); + buttonGroup.add(noneButton); + panel.add(noneButton); + + for (final Tool tool : toolList) { + JRadioButton radioButton = new JRadioButton(tool.getName()); + radioButton.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { selectedTool = tool; } - } ); - buttonGroup.add( radioButton ); - panel.add( radioButton ); + }); + buttonGroup.add(radioButton); + panel.add(radioButton); } - - buttonGroup.setSelected( noneButton.getModel(), true ); - + + buttonGroup.setSelected(noneButton.getModel(), true); + return panel; } - + @Override protected void cancelCallback() { super.cancelCallback(); wasCancelled = true; } + @Override protected void okCallback() { close(); } + boolean wasCancelled() { return wasCancelled; } - + Tool getSelectedTool() { return selectedTool; } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/task/gui/GProgressBar.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/task/gui/GProgressBar.java index 29eb284923..6219f0d54d 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/task/gui/GProgressBar.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/task/gui/GProgressBar.java @@ -23,6 +23,7 @@ import java.util.List; import javax.swing.*; +import docking.DockingUtils; import docking.ToolTipManager; import docking.util.AnimatedIcon; import docking.widgets.EmptyBorderButton; @@ -369,7 +370,7 @@ public class GProgressBar extends JPanel { iconList.add(ResourceManager.loadImage("images/hourglass24_10.png")); iconList.add(ResourceManager.loadImage("images/hourglass24_11.png")); AnimatedIcon progressIcon = new AnimatedIcon(iconList, 150, 0); - imageLabel = new JLabel(progressIcon); + imageLabel = DockingUtils.createNonHtmlLabel(progressIcon); } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/task/gui/taskview/ScheduledTaskPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/task/gui/taskview/ScheduledTaskPanel.java index e9a04e6b53..0a8774a04b 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/task/gui/taskview/ScheduledTaskPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/task/gui/taskview/ScheduledTaskPanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,12 +15,13 @@ */ package ghidra.framework.task.gui.taskview; -import ghidra.framework.task.gui.GProgressBar; - import java.awt.*; import javax.swing.*; +import docking.DockingUtils; +import ghidra.framework.task.gui.GProgressBar; + public class ScheduledTaskPanel extends JPanel { private int scrollOffset = 0; private int indention = 0; @@ -37,7 +37,7 @@ public class ScheduledTaskPanel extends JPanel { layout = new ScheduledElementLayout(); setLayout(layout); - label = new JLabel(labelText); + label = DockingUtils.createNonHtmlLabel(labelText); setBackground(Color.WHITE); add(label); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeArchiveTransformer.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeArchiveTransformer.java index 12d45edb80..8114f751e4 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeArchiveTransformer.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeArchiveTransformer.java @@ -26,6 +26,7 @@ import javax.swing.*; import org.apache.commons.lang3.StringUtils; +import docking.DockingUtils; import docking.framework.DockingApplicationConfiguration; import ghidra.GhidraApplicationLayout; import ghidra.GhidraLaunchable; @@ -788,7 +789,7 @@ public class DataTypeArchiveTransformer implements GhidraLaunchable { monitorComponent.setVisible(true); statusPanel.add(monitorComponent, BorderLayout.EAST); // Add the status message to the status area. - final JLabel statusLabel = new JLabel(" "); + JLabel statusLabel = DockingUtils.createNonHtmlLabel(" "); statusPanel.add(statusLabel, BorderLayout.CENTER); Dimension preferredSize = statusLabel.getPreferredSize(); preferredSize.height = monitorComponent.getPreferredSize().height; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeArchiveTransformerPanel.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeArchiveTransformerPanel.java index 659c8bcb3b..c1391f864d 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeArchiveTransformerPanel.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeArchiveTransformerPanel.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +15,6 @@ */ package ghidra.program.database.data; -import ghidra.framework.preferences.Preferences; -import ghidra.util.exception.*; -import ghidra.util.task.TaskMonitor; - import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -28,7 +23,11 @@ import java.io.IOException; import javax.swing.*; +import docking.DockingUtils; import docking.widgets.filechooser.GhidraFileChooser; +import ghidra.framework.preferences.Preferences; +import ghidra.util.exception.*; +import ghidra.util.task.TaskMonitor; public class DataTypeArchiveTransformerPanel extends JPanel { @@ -61,10 +60,10 @@ public class DataTypeArchiveTransformerPanel extends JPanel { private void setupDescription() { String description = - "" + "Specify the files for converting a new data type archive (.gdt)
    " - + "to match the IDs of data types in an old data type archive.
    " - + "The result will be saved to the destination archive." + ""; - JLabel label = new JLabel(description); + "" + "Specify the files for converting a new data type archive (.gdt)
    " + + "to match the IDs of data types in an old data type archive.
    " + + "The result will be saved to the destination archive." + ""; + JLabel label = DockingUtils.createHtmlLabel(description); label.setBorder(BorderFactory.createEmptyBorder(0, 0, 8, 0)); label.setHorizontalAlignment(SwingConstants.CENTER); add(label, BorderLayout.NORTH); @@ -77,7 +76,7 @@ public class DataTypeArchiveTransformerPanel extends JPanel { gbc.gridy = 0; gbc.gridx = 0; gbc.gridwidth = 1; - filePanel.add(new JLabel("Old file name "), gbc); + filePanel.add(DockingUtils.createNonHtmlLabel("Old file name "), gbc); gbc.gridx = 1; gbc.gridwidth = 1; @@ -88,6 +87,7 @@ public class DataTypeArchiveTransformerPanel extends JPanel { gbc.gridwidth = 1; JButton oldBrowseButton = new JButton(DOT_DOT_DOT); oldBrowseButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setCursor(WAIT_CURSOR); File file = chooseFile("Choose old data type archive"); @@ -114,7 +114,7 @@ public class DataTypeArchiveTransformerPanel extends JPanel { gbc.gridy = 1; gbc.gridx = 0; gbc.gridwidth = 1; - filePanel.add(new JLabel("New file name "), gbc); + filePanel.add(DockingUtils.createNonHtmlLabel("New file name "), gbc); gbc.gridx = 1; gbc.gridwidth = 1; @@ -125,6 +125,7 @@ public class DataTypeArchiveTransformerPanel extends JPanel { gbc.gridwidth = 1; JButton newBrowseButton = new JButton(DOT_DOT_DOT); newBrowseButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setCursor(WAIT_CURSOR); File file = chooseFile("Choose new data type archive"); @@ -146,7 +147,7 @@ public class DataTypeArchiveTransformerPanel extends JPanel { gbc.gridy = 2; gbc.gridx = 0; gbc.gridwidth = 1; - filePanel.add(new JLabel("Destination file name "), gbc); + filePanel.add(DockingUtils.createNonHtmlLabel("Destination file name "), gbc); gbc.gridx = 1; gbc.gridwidth = 1; @@ -157,6 +158,7 @@ public class DataTypeArchiveTransformerPanel extends JPanel { gbc.gridwidth = 1; JButton destinationBrowseButton = new JButton(DOT_DOT_DOT); destinationBrowseButton.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { setCursor(WAIT_CURSOR); File file = chooseFile("Choose destination file"); @@ -192,14 +194,13 @@ public class DataTypeArchiveTransformerPanel extends JPanel { } File getLastDataTypeArchiveDirectory() { - String lastDirStr = - Preferences.getProperty(Preferences.LAST_OPENED_ARCHIVE_DIRECTORY, - System.getProperty("user.home")); + String lastDirStr = Preferences.getProperty(Preferences.LAST_OPENED_ARCHIVE_DIRECTORY, + System.getProperty("user.home")); return new File(lastDirStr); } - protected void transform(TaskMonitor monitor) throws InvalidInputException, - DuplicateFileException, IOException, CancelledException { + protected void transform(TaskMonitor monitor) + throws InvalidInputException, DuplicateFileException, IOException, CancelledException { DataTypeArchiveTransformer.transform(getOldFile(), getNewFile(), getDestinationFile(), useOldFileIDCheckBox.isSelected(), monitor); diff --git a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramManagerPluginScreenShots.java b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramManagerPluginScreenShots.java index 34ee8170ef..9da1fce4ab 100644 --- a/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramManagerPluginScreenShots.java +++ b/Ghidra/Test/IntegrationTest/src/screen/java/help/screenshot/ProgramManagerPluginScreenShots.java @@ -278,7 +278,7 @@ public class ProgramManagerPluginScreenShots extends GhidraScreenShotGenerator @Test public void testSaveProgram() { runSwing(() -> OptionDialog.showOptionDialog(tool.getToolFrame(), "Save Program?", - "program1" + " has changed. Do you want to save it?", "&Save", "Do&n't Save", + "program1 has changed. Do you want to save it?", "&Save", "Do&n't Save", OptionDialog.QUESTION_MESSAGE), false); captureDialog(); }