diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/osgi/BundleStatusComponentProvider.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/osgi/BundleStatusComponentProvider.java index 3125ae9df7..5f4239ac34 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/osgi/BundleStatusComponentProvider.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/osgi/BundleStatusComponentProvider.java @@ -343,7 +343,7 @@ public class BundleStatusComponentProvider extends ComponentProviderAdapter { * cleanup this component */ public void dispose() { - bundleStatusTable.dispose(); + filterPanel.dispose(); } void selectModelRow(int modelRowIndex) { 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 2c3ce5a431..0e3e7d6b97 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 @@ -27,7 +27,6 @@ import docking.help.HelpService; import docking.widgets.label.GLabel; import docking.widgets.table.GTableFilterPanel; import docking.widgets.table.TableFilter; -import ghidra.app.events.ProgramSelectionPluginEvent; import ghidra.app.plugin.core.scalartable.RangeFilterTextField.FilterType; import ghidra.app.services.GoToService; import ghidra.framework.plugintool.ComponentProviderAdapter; @@ -116,8 +115,12 @@ public class ScalarSearchProvider extends ComponentProviderAdapter { buffy.append(" [filter: ").append(minValueText).append(']'); // single scalar search } else if (!isDefaultFilterRange(minValueText, maxValueText)) { - buffy.append(" [filter: ").append(minValueText).append(" - ").append( - maxValueText).append(']'); + buffy.append(" [filter: ") + .append(minValueText) + .append(" - ") + .append( + maxValueText) + .append(']'); } setTitle(buffy.toString()); @@ -139,12 +142,6 @@ public class ScalarSearchProvider extends ComponentProviderAdapter { return min.equals(Integer.toString(minValue)) && max.equals(Integer.toString(maxValue)); } - private void selectDataInProgramFromTable(ProgramSelection selection) { - ProgramSelectionPluginEvent pspe = - new ProgramSelectionPluginEvent("Selection", selection, plugin.getCurrentProgram()); - plugin.firePluginEvent(pspe); - } - @Override public void componentShown() { scalarModel.reload(); @@ -183,7 +180,6 @@ public class ScalarSearchProvider extends ComponentProviderAdapter { closeComponent(); threadedTablePanel.dispose(); filter.dispose(); - scalarTable.dispose(); } ProgramSelection getSelection() { diff --git a/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ByteSequencePanelBuilder.java b/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ByteSequencePanelBuilder.java index 4ef5b284cd..48e17402a2 100644 --- a/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ByteSequencePanelBuilder.java +++ b/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ByteSequencePanelBuilder.java @@ -16,8 +16,6 @@ package ghidra.bitpatterns.gui; import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.util.List; import javax.swing.*; @@ -42,13 +40,14 @@ public class ByteSequencePanelBuilder extends ContextRegisterFilterablePanelBuil private JButton applyLengthFilterButton; private JButton clearLengthFilterButton; private JTextField numSeqsField; + private GFilterTable filterTable; private static final String APPLY_LENGTH_FILTER_BUTTON_TEXT = "Apply Length Filter"; private static final String CLEAR_LENGTH_FILTER_BUTTON_TEXT = "Clear Length Filter"; private static final String BYTE_SEQUENCE_LENGTH_FILTER_CREATER_TEXT = "Set Length Filter"; private static final String NUM_SEQS_LABEL_TEXT = " Number of Sequences "; /** - * Creates a {@link ByteSequencePanelBuilder} in a given {@link FunctionBitPatternPlugin} for sequences of a + * Creates a {@link ByteSequencePanelBuilder} in a given {@link FunctionBitPatternsExplorerPlugin} for sequences of a * given {@PatternType} * @param plugin plugin * @param type {@PatternType} of sequences @@ -59,7 +58,7 @@ public class ByteSequencePanelBuilder extends ContextRegisterFilterablePanelBuil } /** - * Returns the last selected {@link ByteSequenceRowObjects}s of the table associated to + * Returns the last selected {@link ByteSequenceRowObject}s of the table associated to * this panel * @return the selected objects */ @@ -121,7 +120,7 @@ public class ByteSequencePanelBuilder extends ContextRegisterFilterablePanelBuil mainPanel.add(getButtonPanel(), BorderLayout.SOUTH); byteSeqTable = new DisassembledByteSequenceTableModel(plugin, rowObjects); - GFilterTable filterTable = new GFilterTable<>(byteSeqTable); + filterTable = new GFilterTable<>(byteSeqTable); mainPanel.add(filterTable, BorderLayout.CENTER, TABLE_INDEX); addLengthFilterAndAnalysisButtons(); mainPanel.setVisible(true); @@ -133,10 +132,12 @@ public class ByteSequencePanelBuilder extends ContextRegisterFilterablePanelBuil */ public void updateTable() { mainPanel.remove(TABLE_INDEX); + filterTable.dispose(); + rowObjects = ByteSequenceRowObject.getFilteredRowObjects(fsReader.getFInfoList(), type, getContextRegisterFilter(), lengthFilter); byteSeqTable = new DisassembledByteSequenceTableModel(plugin, rowObjects); - GFilterTable filterTable = new GFilterTable<>(byteSeqTable); + filterTable = new GFilterTable<>(byteSeqTable); int totalNumSeqs = 0; for (ByteSequenceRowObject row : rowObjects) { @@ -149,7 +150,7 @@ public class ByteSequencePanelBuilder extends ContextRegisterFilterablePanelBuil } /** - * Sets the {@link FileBitsPatternInfoReader} object to use a data source + * Sets the {@link FileBitPatternInfoReader} object to use a data source * @param fsReader {@link FileBitPatternInfoReader} object containing the sequences to analyze */ public void setFsReader(FileBitPatternInfoReader fsReader) { @@ -163,43 +164,40 @@ public class ByteSequencePanelBuilder extends ContextRegisterFilterablePanelBuil applyLengthFilterButton = new JButton(APPLY_LENGTH_FILTER_BUTTON_TEXT); getButtonPanel().add(applyLengthFilterButton); - applyLengthFilterButton.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - ByteSequenceLengthFilterInputDialog filterCreator = - new ByteSequenceLengthFilterInputDialog( - BYTE_SEQUENCE_LENGTH_FILTER_CREATER_TEXT, mainPanel); - if (filterCreator.isCanceled()) { - return; - } - lengthFilter = filterCreator.getValue(); - applyFilterAction(); + applyLengthFilterButton.addActionListener(e -> { + ByteSequenceLengthFilterInputDialog filterCreator = + new ByteSequenceLengthFilterInputDialog( + BYTE_SEQUENCE_LENGTH_FILTER_CREATER_TEXT, mainPanel); + if (filterCreator.isCanceled()) { + return; } + lengthFilter = filterCreator.getValue(); + applyFilterAction(); }); clearLengthFilterButton = new JButton(CLEAR_LENGTH_FILTER_BUTTON_TEXT); getButtonPanel().add(clearLengthFilterButton); - clearLengthFilterButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - lengthFilter = null; - updateTable(); - } + clearLengthFilterButton.addActionListener(e -> { + lengthFilter = null; + updateTable(); }); } /** * Enables the "Apply Length Filter" and "Clear Length Filter" buttons based on a boolean input - * @param buttons will be enabled precisely when this parameter is {@code true} + * @param enabled will be enabled precisely when this parameter is {@code true} */ - public void enableLengthFilterButtons(boolean x) { + public void enableLengthFilterButtons(boolean enabled) { if (applyLengthFilterButton != null) { - applyLengthFilterButton.setEnabled(x); + applyLengthFilterButton.setEnabled(enabled); } if (clearLengthFilterButton != null) { - clearLengthFilterButton.setEnabled(x); + clearLengthFilterButton.setEnabled(enabled); } return; } + + public void dispose() { + filterTable.dispose(); + } } diff --git a/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ClipboardPanel.java b/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ClipboardPanel.java index c4fda96534..b42ee0c644 100644 --- a/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ClipboardPanel.java +++ b/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ClipboardPanel.java @@ -88,13 +88,10 @@ public class ClipboardPanel extends JPanel { buttonPanel = new JPanel(new FlowLayout()); JButton deletedButton = new JButton("Remove Selected Patterns"); - deletedButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - List selected = filterTable.getSelectedRowObjects(); - plugin.removePatterns(selected); - updateClipboard(); - } + deletedButton.addActionListener(e -> { + List selected = filterTable.getSelectedRowObjects(); + plugin.removePatterns(selected); + updateClipboard(); }); buttonPanel.add(deletedButton); @@ -415,6 +412,7 @@ public class ClipboardPanel extends JPanel { */ public void updateClipboard() { remove(filterTable); + filterTable.dispose(); patternInfoTable = new PatternInfoTableModel(plugin); filterTable = new GFilterTable<>(patternInfoTable); add(filterTable, 0); @@ -495,4 +493,7 @@ public class ClipboardPanel extends JPanel { return patternInfoTable.getLastSelectedObjects(); } + public void dispose() { + filterTable.dispose(); + } } diff --git a/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ClosedPatternTableDialog.java b/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ClosedPatternTableDialog.java index fdfe49dd68..150e28a72b 100644 --- a/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ClosedPatternTableDialog.java +++ b/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/ClosedPatternTableDialog.java @@ -41,8 +41,9 @@ public class ClosedPatternTableDialog extends DialogComponentProvider { private DockingAction sendToClipboardAction; private static final String TITLE = "Closed Patterns"; private ClosedPatternTableModel closedPatternTableModel; - private FunctionBitPatternsExplorerPlugin plugin; + private GThreadedTablePanel tablePanel; private JPanel mainPanel; + private FunctionBitPatternsExplorerPlugin plugin; private PatternType type; private ContextRegisterFilter cRegFilter; @@ -77,9 +78,8 @@ public class ClosedPatternTableDialog extends DialogComponentProvider { private JPanel createMainPanel() { JPanel panel = new JPanel(new BorderLayout()); - GThreadedTablePanel table = - new GThreadedTablePanel<>(closedPatternTableModel); - panel.add(table, BorderLayout.CENTER); + tablePanel = new GThreadedTablePanel<>(closedPatternTableModel); + panel.add(tablePanel, BorderLayout.CENTER); return panel; } @@ -122,4 +122,8 @@ public class ClosedPatternTableDialog extends DialogComponentProvider { this.addAction(sendToClipboardAction); } + @Override + public void close() { + tablePanel.dispose(); + } } diff --git a/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/FunctionBitPatternsMainProvider.java b/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/FunctionBitPatternsMainProvider.java index 1be6594634..1391731958 100644 --- a/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/FunctionBitPatternsMainProvider.java +++ b/Ghidra/Features/BytePatterns/src/main/java/ghidra/bitpatterns/gui/FunctionBitPatternsMainProvider.java @@ -451,6 +451,8 @@ public class FunctionBitPatternsMainProvider extends ComponentProviderAdapter * Removes the action from the tool. */ public void dispose() { + firstBytesPanel.dispose(); + clipboard.dispose(); tool.removeAction(gatherDataFromProgramAction); } diff --git a/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchResultFrame.java b/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchResultFrame.java index 4de8444526..2824cb401a 100644 --- a/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchResultFrame.java +++ b/Ghidra/Features/FunctionID/src/main/java/ghidra/feature/fid/debug/FidSearchResultFrame.java @@ -308,6 +308,7 @@ public class FidSearchResultFrame extends JFrame implements FidQueryCloseListene @Override public void dispose() { + table.dispose(); dbService.removeCloseListener(this); super.dispose(); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/ListSelectionTableDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/ListSelectionTableDialog.java index b335f2ba93..df92360ee2 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/ListSelectionTableDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/ListSelectionTableDialog.java @@ -70,6 +70,11 @@ public class ListSelectionTableDialog extends DialogComponentProvider { } } + @Override + public void close() { + filterPanel.dispose(); + } + private JComponent build() { JPanel panel = new JPanel(new BorderLayout()); panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); @@ -127,7 +132,7 @@ public class ListSelectionTableDialog extends DialogComponentProvider { public void setMultiSelectionMode(boolean enable) { if (enable) { gTable.getSelectionModel() - .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); } else { gTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/ObjectChooserDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/ObjectChooserDialog.java index f87b8325e4..f5e4173c62 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/ObjectChooserDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/ObjectChooserDialog.java @@ -89,4 +89,9 @@ public class ObjectChooserDialog extends DialogComponentProvider { public void setFilterText(String text) { table.setFilterText(text); } + + @Override + public void close() { + table.dispose(); + } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/TableChooserDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/TableChooserDialog.java index b7e29405da..4640bfd686 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/TableChooserDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/dialogs/TableChooserDialog.java @@ -93,12 +93,14 @@ public class TableChooserDialog extends DialogComponentProvider { protected void okCallback() { selectedItems = gFilterTable.getSelectedRowObjects(); close(); + gFilterTable.dispose(); } @Override protected void cancelCallback() { selectedItems = null; close(); + gFilterTable.dispose(); } @Override diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GDynamicColumnTableModel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GDynamicColumnTableModel.java index 7f9039a0db..adf84dcde6 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GDynamicColumnTableModel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GDynamicColumnTableModel.java @@ -555,4 +555,16 @@ public abstract class GDynamicColumnTableModel DynamicTableColumn column = tableColumns.get(index); return column.getMaxLines(columnSettings.get(column)); } + + @Override + public void dispose() { + super.dispose(); + disposeDynamicColumnData(); + } + + protected void disposeDynamicColumnData() { + tableColumns.clear(); + defaultTableColumns.clear(); + columnSettings.clear(); + } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GFilterTable.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GFilterTable.java index a7597c88ed..32414f6ff6 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GFilterTable.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GFilterTable.java @@ -42,7 +42,6 @@ public class GFilterTable extends JPanel { public void dispose() { filterPanel.dispose(); - table.dispose(); } private void buildTable() { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTable.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTable.java index a1baa9caa5..029daab4a1 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTable.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTable.java @@ -279,8 +279,9 @@ public class GTable extends JTable { * Call this when the table will no longer be used */ public void dispose() { - if (dataModel instanceof AbstractGTableModel) { - ((AbstractGTableModel) dataModel).dispose(); + TableModel unwrappedeModel = getUnwrappedTableModel(); + if (unwrappedeModel instanceof AbstractGTableModel) { + ((AbstractGTableModel) unwrappedeModel).dispose(); } if (columnModel instanceof GTableColumnModel) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableWidget.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableWidget.java index 7aff12e175..a018aa3a05 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableWidget.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableWidget.java @@ -223,4 +223,8 @@ public class GTableWidget extends JPanel { public void setFilterText(String text) { gFilterTable.setFiterText(text); } + + public void dispose() { + gFilterTable.dispose(); + } } 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 4083ded6f3..7bfe866425 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 @@ -23,6 +23,7 @@ import javax.swing.*; import docking.widgets.EmptyBorderButton; import docking.widgets.label.GLabel; import docking.widgets.table.GTable; +import ghidra.util.Swing; import ghidra.util.task.TaskMonitor; import ghidra.util.task.TaskMonitorComponent; import resources.Icons; @@ -30,6 +31,8 @@ import resources.Icons; /** * A convenience component designed specifically for rendering threaded table models. * This panel will automatically create a threaded table and a task monitor component. + * + * @param the type */ public class GThreadedTablePanel extends JPanel { @@ -135,7 +138,6 @@ public class GThreadedTablePanel extends JPanel { public void dispose() { threadedModel.dispose(); - table.dispose(); } public TaskMonitor getTaskMonitor() { @@ -162,22 +164,23 @@ public class GThreadedTablePanel extends JPanel { } /** - * Returns the underlying table. + * Returns the underlying table + * @return the table */ public GTable getTable() { return table; } private void handleUpdatePending() { - SwingUtilities.invokeLater(showPendingRunnable); + Swing.runLater(showPendingRunnable); } private void handleUpdating() { - SwingUtilities.invokeLater(showProgressRunnable); + Swing.runLater(showProgressRunnable); } private void handleUpdateComplete() { - SwingUtilities.invokeLater(updateCompleteRunnable); + Swing.runLater(updateCompleteRunnable); } private void doUpdateComplete() { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/ThreadedTableModel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/ThreadedTableModel.java index 549e41fc14..6439ef4edd 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/ThreadedTableModel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/ThreadedTableModel.java @@ -24,6 +24,7 @@ import docking.widgets.table.*; import docking.widgets.table.sort.DefaultColumnComparator; import generic.concurrent.ConcurrentListenerSet; import ghidra.framework.plugintool.ServiceProvider; +import ghidra.util.Swing; import ghidra.util.SystemUtilities; import ghidra.util.datastruct.*; import ghidra.util.exception.*; @@ -123,7 +124,7 @@ public abstract class ThreadedTableModel TaskMonitor monitor, boolean loadIncrementally) { super(serviceProvider); - if (!SwingUtilities.isEventDispatchThread()) { + if (!Swing.isSwingThread()) { throw new AssertException( "You must create the ThreadedTableModel in the AWT Event Dispatch Thread"); } @@ -143,7 +144,7 @@ public abstract class ThreadedTableModel // We are expecting to be in the swing thread. We want the reload to happen after our // constructor is fully completed since the reload will cause our initialize method to // be called in another thread, thereby creating a possible race condition. - SwingUtilities.invokeLater(() -> updateManager.reload()); + Swing.runLater(() -> updateManager.reload()); } public boolean isLoadIncrementally() { @@ -617,12 +618,11 @@ public abstract class ThreadedTableModel */ @Override public void fireTableChanged(TableModelEvent e) { - if (SwingUtilities.isEventDispatchThread()) { + if (Swing.isSwingThread()) { super.fireTableChanged(e); return; } - final TableModelEvent e1 = e; - SwingUtilities.invokeLater(() -> ThreadedTableModel.super.fireTableChanged(e1)); + Swing.runLater(() -> ThreadedTableModel.super.fireTableChanged(e)); } /** @@ -636,6 +636,7 @@ public abstract class ThreadedTableModel worker.dispose(); } doClearData(); + disposeDynamicColumnData(); } /** diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/FindCheckoutsDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/FindCheckoutsDialog.java index 346f8264de..e9fa07aa10 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/FindCheckoutsDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/FindCheckoutsDialog.java @@ -21,14 +21,12 @@ import java.awt.event.MouseEvent; import java.util.*; import javax.swing.BorderFactory; -import javax.swing.JTable; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import docking.ActionContext; import docking.DialogComponentProvider; -import docking.widgets.table.GTableCellRenderer; -import docking.widgets.table.GTableCellRenderingData; +import docking.widgets.table.*; import docking.widgets.table.threaded.GThreadedTablePanel; import docking.widgets.table.threaded.ThreadedTableModelListener; import ghidra.framework.main.datatable.ProjectDataContext; @@ -46,7 +44,7 @@ public class FindCheckoutsDialog extends DialogComponentProvider { private FindCheckoutsTableModel model; private Plugin plugin; private DomainFolder folder; - private JTable table; + private GTable table; private boolean showMessage = true; private GThreadedTablePanel threadedTablePanel; @@ -123,7 +121,7 @@ public class FindCheckoutsDialog extends DialogComponentProvider { @Override public void close() { super.close(); - model.dispose(); + threadedTablePanel.dispose(); } @Override 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 a26d2bd26e..22293fc04b 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 @@ -99,8 +99,6 @@ public class KeyBindingsPanel extends JPanel { public void dispose() { tableFilterPanel.dispose(); - tableModel.dispose(); - actionTable.dispose(); propertyChangeListener = null; } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginInstallerDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginInstallerDialog.java index a5a07b4073..4291be7dd8 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginInstallerDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/PluginInstallerDialog.java @@ -71,7 +71,7 @@ public class PluginInstallerDialog extends DialogComponentProvider { @Override protected void dialogShown() { - // users often wish to start typing in the filter when the dialog appeears + // users often wish to start typing in the filter when the dialog appears tableFilterPanel.requestFocus(); } @@ -84,7 +84,6 @@ public class PluginInstallerDialog extends DialogComponentProvider { public void close() { super.close(); tableFilterPanel.dispose(); - table.dispose(); } /** @@ -173,10 +172,14 @@ public class PluginInstallerDialog extends DialogComponentProvider { TableSortState.createDefaultSortState(PluginInstallerTableModel.NAME_COL)); tableModel.refresh(); - table.getColumnModel().getColumn(PluginInstallerTableModel.NAME_COL).setCellRenderer( - new NameCellRenderer()); - table.getColumnModel().getColumn(PluginInstallerTableModel.STATUS_COL).setCellRenderer( - new StatusCellRenderer()); + table.getColumnModel() + .getColumn(PluginInstallerTableModel.NAME_COL) + .setCellRenderer( + new NameCellRenderer()); + table.getColumnModel() + .getColumn(PluginInstallerTableModel.STATUS_COL) + .setCellRenderer( + new StatusCellRenderer()); HelpService help = Help.getHelpService(); help.registerHelp(table, new HelpLocation(GenericHelpTopics.TOOL, "PluginDialog"));