From cb02db8313c62ed8898efbd71acfde22aee39d1e Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Fri, 16 Sep 2022 12:21:32 -0400 Subject: [PATCH] Updated module system so Help no longer depends on Docking. Docking can now have help content. --- .../java/ghidra/app/merge/MergeManager.java | 4 +- .../merge/ProgramMultiUserMergeManager.java | 4 +- .../plugin/core/analysis/AnalysisPanel.java | 4 +- .../compositeeditor/CompositeEditorPanel.java | 4 +- .../FunctionComparisonPanel.java | 4 +- .../MultiFunctionComparisonPanel.java | 4 +- .../core/overview/OverviewColorComponent.java | 2 +- .../core/scalartable/ScalarSearchDialog.java | 2 +- .../scalartable/ScalarSearchProvider.java | 2 +- .../debug/DomainEventDisplayPlugin.java | 4 +- .../app/plugin/debug/EventDisplayPlugin.java | 4 +- .../app/plugin/debug/JavaHelpPlugin.java | 2 + .../app/util/viewer/format/FieldHeader.java | 4 +- .../util/viewer/format/FieldHeaderComp.java | 4 +- .../ListingCodeComparisonPanel.java | 4 +- .../ghidra/base/help/GhidraHelpService.java | 1 + .../codebrowser/CodeBrowserOptionsTest.java | 4 +- .../core/byteviewer/ByteViewerComponent.java | 4 +- .../core/byteviewer/ByteViewerPanel.java | 4 +- .../plugin/core/diff/ProgramDiffPlugin.java | 4 +- .../feature/vt/gui/actions/HelpAction.java | 4 +- .../feature/vt/gui/plugin/VTPlugin.java | 4 +- .../VTMarkupItemsTableProvider.java | 2 +- .../matchtable/ApplyMarkupPropertyEditor.java | 2 +- .../matchtable/VTMatchTableProvider.java | 2 +- Ghidra/Framework/Docking/build.gradle | 9 +- .../Framework/Docking/certification.manifest | 12 + .../Docking/src/main/help/help/TOC_Source.xml | 54 +++ .../src/main/help/help/shared/Frontpage.css | 64 ++++ .../src/main/help/help/shared/arrow.gif | Bin 0 -> 69 bytes .../src/main/help/help/shared/close16.gif | Bin 0 -> 859 bytes .../src/main/help/help/shared/menu16.gif | Bin 0 -> 62 bytes .../src/main/help/help/shared/note-red.png | Bin 0 -> 4182 bytes .../src/main/help/help/shared/note.png | Bin 0 -> 4193 bytes .../src/main/help/help/shared/note.yellow.png | Bin 0 -> 4170 bytes .../src/main/help/help/shared/redo.png | Bin 0 -> 187 bytes .../Docking/src/main/help/help/shared/tip.png | Bin 0 -> 1641 bytes .../src/main/help/help/shared/undo.png | Bin 0 -> 185 bytes .../src/main/help/help/shared/warning.png | Bin 0 -> 1354 bytes .../topics/PlacheholderTopic/Placeholder.htm | 17 + .../src/main/java/docking/ComponentNode.java | 2 +- .../main/java/docking/ComponentProvider.java | 4 +- .../java/docking/DialogComponentProvider.java | 2 +- .../main/java/docking/DockableComponent.java | 2 +- .../src/main/java/docking/DockableHeader.java | 4 +- .../src/main/java/docking/DockingDialog.java | 2 +- .../java/docking/DockingWindowManager.java | 23 +- .../java/docking/action/DockingActionIf.java | 2 +- .../main/java/docking/action/HelpAction.java | 2 +- ...HelpBroker.java => DockingHelpBroker.java} | 336 +++--------------- .../java/docking/help/DockingHelpSet.java | 38 ++ .../main/java/docking/help/HelpManager.java | 11 +- .../docking/help/ToggleNavigationAid.java | 2 +- .../docking/menu/MultiStateDockingAction.java | 2 +- .../options/editor/OptionsEditorPanel.java | 4 +- .../docking/options/editor/OptionsPanel.java | 4 +- .../widgets/table/GTableFilterPanel.java | 2 +- .../docking/widgets/table/GTableHeader.java | 2 +- .../tree/DefaultGTreeFilterProvider.java | 2 +- .../java/docking/wizard/WizardManager.java | 4 +- .../ghidra/graph/viewer/GraphComponent.java | 2 +- Ghidra/Framework/Help/build.gradle | 9 +- .../main/java/docking/DefaultHelpService.java | 4 +- .../main/java}/help/CustomFavoritesView.java | 2 +- .../src/main/java}/help/CustomSearchView.java | 3 +- .../src/main/java}/help/CustomTOCView.java | 2 +- .../Help/src/main/java/help/GHelpBroker.java | 331 +++++++++++++++++ .../main/java}/help/GHelpHTMLEditorKit.java | 2 +- .../src/main/java}/help/GHelpSet.java | 2 +- .../src/main/java}/help/Help.java | 12 +- .../src/main/java}/help/HelpDescriptor.java | 11 +- .../src/main/java}/help/HelpService.java | 2 +- .../main/java/help/JavaHelpSetBuilder.java | 29 +- .../location/HelpModuleCollection.java | 2 +- .../location/JarHelpModuleLocation.java | 2 +- .../ghidra/framework/main/FrontEndTool.java | 4 +- .../java/ghidra/framework/main/LogPanel.java | 4 +- .../framework/main/ProjectDataPanel.java | 4 +- .../framework/main/ProjectInfoDialog.java | 4 +- .../ghidra/framework/main/ToolButton.java | 4 +- .../ghidra/framework/main/WorkspacePanel.java | 4 +- .../main/datatable/ProjectDataTablePanel.java | 4 +- .../main/datatree/ProjectDataTreePanel.java | 4 +- .../framework/plugintool/PluginTool.java | 4 +- .../dialog/ExtensionTablePanel.java | 4 +- .../plugintool/dialog/KeyBindingsPanel.java | 4 +- .../dialog/PluginInstallerDialog.java | 4 +- 87 files changed, 707 insertions(+), 445 deletions(-) create mode 100644 Ghidra/Framework/Docking/src/main/help/help/TOC_Source.xml create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/Frontpage.css create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/arrow.gif create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/close16.gif create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/menu16.gif create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/note-red.png create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/note.png create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/note.yellow.png create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/redo.png create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/tip.png create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/undo.png create mode 100644 Ghidra/Framework/Docking/src/main/help/help/shared/warning.png create mode 100644 Ghidra/Framework/Docking/src/main/help/help/topics/PlacheholderTopic/Placeholder.htm rename Ghidra/Framework/Docking/src/main/java/docking/help/{GHelpBroker.java => DockingHelpBroker.java} (60%) create mode 100644 Ghidra/Framework/Docking/src/main/java/docking/help/DockingHelpSet.java rename Ghidra/Framework/{Docking => Help}/src/main/java/docking/DefaultHelpService.java (97%) rename Ghidra/Framework/{Docking/src/main/java/docking => Help/src/main/java}/help/CustomFavoritesView.java (99%) rename Ghidra/Framework/{Docking/src/main/java/docking => Help/src/main/java}/help/CustomSearchView.java (98%) rename Ghidra/Framework/{Docking/src/main/java/docking => Help/src/main/java}/help/CustomTOCView.java (99%) create mode 100644 Ghidra/Framework/Help/src/main/java/help/GHelpBroker.java rename Ghidra/Framework/{Docking/src/main/java/docking => Help/src/main/java}/help/GHelpHTMLEditorKit.java (99%) rename Ghidra/Framework/{Docking/src/main/java/docking => Help/src/main/java}/help/GHelpSet.java (99%) rename Ghidra/Framework/{Docking/src/main/java/docking => Help/src/main/java}/help/Help.java (80%) rename Ghidra/Framework/{Docking/src/main/java/docking => Help/src/main/java}/help/HelpDescriptor.java (90%) rename Ghidra/Framework/{Docking/src/main/java/docking => Help/src/main/java}/help/HelpService.java (99%) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeManager.java index 76cbdea086..b2825e3951 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeManager.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeManager.java @@ -22,8 +22,6 @@ import java.util.Hashtable; import javax.swing.JComponent; import javax.swing.SwingUtilities; -import docking.help.Help; -import docking.help.HelpService; import generic.util.WindowUtilities; import ghidra.framework.data.DomainObjectMergeManager; import ghidra.framework.model.DomainFile; @@ -35,6 +33,8 @@ import ghidra.program.model.listing.DomainObjectChangeSet; import ghidra.util.*; import ghidra.util.exception.CancelledException; import ghidra.util.task.*; +import help.Help; +import help.HelpService; /** * Top level object that manages each step of the merge/resolve conflicts diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/ProgramMultiUserMergeManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/ProgramMultiUserMergeManager.java index fa20b07dd8..31e59c1e23 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/ProgramMultiUserMergeManager.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/ProgramMultiUserMergeManager.java @@ -19,8 +19,6 @@ import java.awt.*; import javax.swing.*; -import docking.help.Help; -import docking.help.HelpService; import generic.util.WindowUtilities; import ghidra.app.merge.datatypes.DataTypeMergeManager; import ghidra.app.merge.listing.*; @@ -43,6 +41,8 @@ import ghidra.program.model.listing.ProgramChangeSet; import ghidra.program.util.ProgramLocation; import ghidra.program.util.ProgramSelection; import ghidra.util.HelpLocation; +import help.Help; +import help.HelpService; /** * Top level object that manages each step of the merge/resolve conflicts 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 07723d28c6..61172d1192 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 @@ -32,8 +32,6 @@ import javax.swing.table.TableColumn; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FilenameUtils; -import docking.help.Help; -import docking.help.HelpService; import docking.options.editor.GenericOptionsComponent; import docking.widgets.OptionDialog; import docking.widgets.combobox.GhidraComboBox; @@ -51,6 +49,8 @@ import ghidra.util.HelpLocation; import ghidra.util.Msg; import ghidra.util.exception.AssertException; import ghidra.util.layout.VerticalLayout; +import help.Help; +import help.HelpService; import utilities.util.FileUtilities; class AnalysisPanel extends JPanel implements PropertyChangeListener { 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 df423b09bc..4bd980b492 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 @@ -35,8 +35,6 @@ import javax.swing.text.JTextComponent; import docking.DockingWindowManager; import docking.actions.KeyBindingUtils; import docking.dnd.*; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.DropDownSelectionTextField; import docking.widgets.OptionDialog; import docking.widgets.fieldpanel.support.FieldRange; @@ -58,6 +56,8 @@ import ghidra.util.*; import ghidra.util.data.DataTypeParser.AllowedDataTypes; import ghidra.util.exception.UsrException; import ghidra.util.layout.VerticalLayout; +import help.Help; +import help.HelpService; /** * Panel for editing a composite data type. Specific composite data type editors diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/FunctionComparisonPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/FunctionComparisonPanel.java index 4d7fa83e54..8ca6920578 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/FunctionComparisonPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/FunctionComparisonPanel.java @@ -29,8 +29,6 @@ import javax.swing.event.ChangeListener; import docking.ActionContext; import docking.ComponentProvider; import docking.action.*; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.fieldpanel.internal.FieldPanelCoordinator; import docking.widgets.tabbedpane.DockingTabRenderer; import ghidra.app.util.viewer.listingpanel.ListingCodeComparisonPanel; @@ -44,6 +42,8 @@ import ghidra.program.model.listing.*; import ghidra.util.HelpLocation; import ghidra.util.Msg; import ghidra.util.classfinder.ClassSearcher; +import help.Help; +import help.HelpService; import resources.ResourceManager; /** diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/MultiFunctionComparisonPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/MultiFunctionComparisonPanel.java index 37092e6dad..2c666f2b15 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/MultiFunctionComparisonPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/functioncompare/MultiFunctionComparisonPanel.java @@ -23,13 +23,13 @@ import java.util.Set; import javax.swing.*; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.fieldpanel.internal.FieldPanelCoordinator; import ghidra.app.services.FunctionComparisonModel; import ghidra.app.util.viewer.util.CodeComparisonPanel; import ghidra.framework.plugintool.PluginTool; import ghidra.program.model.listing.Function; +import help.Help; +import help.HelpService; /** * Extends the basic {@link FunctionComparisonPanel one-to-one comparison panel} diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/OverviewColorComponent.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/OverviewColorComponent.java index e6add5294e..5cd4bb09ef 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/OverviewColorComponent.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/overview/OverviewColorComponent.java @@ -25,7 +25,6 @@ import java.util.List; import javax.swing.*; import docking.action.DockingActionIf; -import docking.help.Help; import ghidra.app.nav.Navigatable; import ghidra.app.services.GoToService; import ghidra.app.util.viewer.listingpanel.OverviewProvider; @@ -34,6 +33,7 @@ import ghidra.framework.plugintool.PluginTool; import ghidra.program.model.address.Address; import ghidra.program.model.listing.Program; import ghidra.util.task.SwingUpdateManager; +import help.Help; /** * Overview bar component. Uses color to indicate various address based properties for a program. 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 4aa0da11ba..fe02e4353b 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 @@ -23,7 +23,6 @@ import javax.swing.border.TitledBorder; import docking.DialogComponentProvider; import docking.DockingWindowManager; -import docking.help.HelpService; import docking.widgets.button.GRadioButton; import docking.widgets.label.GLabel; import docking.widgets.textfield.IntegerTextField; @@ -31,6 +30,7 @@ import ghidra.app.plugin.core.scalartable.RangeFilterTextField.FilterType; import ghidra.framework.plugintool.PluginTool; import ghidra.program.util.ProgramSelection; import ghidra.util.HelpLocation; +import help.HelpService; /** * Dialog allowing the user to set parameters when initiating a scalar search on a program. 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 0e3e7d6b97..4c26b9fcdb 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 @@ -23,7 +23,6 @@ import javax.swing.*; import javax.swing.border.Border; import docking.*; -import docking.help.HelpService; import docking.widgets.label.GLabel; import docking.widgets.table.GTableFilterPanel; import docking.widgets.table.TableFilter; @@ -38,6 +37,7 @@ import ghidra.util.HelpLocation; import ghidra.util.table.*; import ghidra.util.table.actions.DeleteTableRowAction; import ghidra.util.table.actions.MakeProgramSelectionAction; +import help.HelpService; import resources.ResourceManager; /** diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/DomainEventDisplayPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/DomainEventDisplayPlugin.java index 74351bf01b..842f8e51df 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/DomainEventDisplayPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/DomainEventDisplayPlugin.java @@ -19,8 +19,6 @@ import java.awt.Font; import java.lang.reflect.Field; import java.util.Date; -import docking.help.Help; -import docking.help.HelpService; import ghidra.app.DeveloperPluginPackage; import ghidra.app.events.ProgramActivatedPluginEvent; import ghidra.app.plugin.PluginCategoryNames; @@ -30,6 +28,8 @@ import ghidra.framework.plugintool.util.PluginStatus; import ghidra.program.model.listing.Program; import ghidra.program.util.*; import ghidra.util.datastruct.IntObjectHashtable; +import help.Help; +import help.HelpService; /** * Debug Plugin to show domain object change events. diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/EventDisplayPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/EventDisplayPlugin.java index 34106a629d..aabbd9790b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/EventDisplayPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/EventDisplayPlugin.java @@ -15,12 +15,12 @@ */ package ghidra.app.plugin.debug; -import docking.help.Help; -import docking.help.HelpService; import ghidra.app.DeveloperPluginPackage; import ghidra.app.plugin.PluginCategoryNames; import ghidra.framework.plugintool.*; import ghidra.framework.plugintool.util.PluginStatus; +import help.Help; +import help.HelpService; /** * Plugin to demonstrate handling of Program within a plugin and how to diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/JavaHelpPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/JavaHelpPlugin.java index af2480d9a6..6cc07fca28 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/JavaHelpPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/debug/JavaHelpPlugin.java @@ -37,6 +37,8 @@ import ghidra.framework.plugintool.util.PluginStatus; import ghidra.util.HelpLocation; import ghidra.util.Msg; import ghidra.util.task.*; +import help.Help; +import help.HelpService; /** * Generate a file of all components and actions in the diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/format/FieldHeader.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/format/FieldHeader.java index 41dc4f7d1f..b2b0c6f056 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/format/FieldHeader.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/format/FieldHeader.java @@ -25,13 +25,13 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import docking.action.DockingActionIf; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.fieldpanel.FieldPanel; import docking.widgets.indexedscrollpane.IndexedScrollPane; import ghidra.app.util.viewer.field.FieldFactory; import ghidra.app.util.viewer.format.actions.*; import ghidra.util.HelpLocation; +import help.Help; +import help.HelpService; /** * Class to manage the tabbed panel for field formats. diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/format/FieldHeaderComp.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/format/FieldHeaderComp.java index e4ae6b1826..cd5573ebd2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/format/FieldHeaderComp.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/format/FieldHeaderComp.java @@ -21,11 +21,11 @@ import java.awt.event.*; import javax.swing.*; import javax.swing.border.Border; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.label.GDLabel; import ghidra.app.util.viewer.field.FieldFactory; import ghidra.util.HelpLocation; +import help.Help; +import help.HelpService; /** * Class manage a header for the FieldViewer. diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/ListingCodeComparisonPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/ListingCodeComparisonPanel.java index 5192bf79ec..d7d49f3337 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/ListingCodeComparisonPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/listingpanel/ListingCodeComparisonPanel.java @@ -26,8 +26,6 @@ import javax.swing.event.ChangeListener; import docking.*; import docking.action.*; -import docking.help.Help; -import docking.help.HelpService; import docking.menu.ActionState; import docking.menu.MultiStateDockingAction; import docking.widgets.EventTrigger; @@ -61,6 +59,8 @@ import ghidra.program.util.*; import ghidra.util.*; import ghidra.util.exception.CancelledException; import ghidra.util.task.TaskMonitor; +import help.Help; +import help.HelpService; import resources.Icons; import resources.ResourceManager; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/base/help/GhidraHelpService.java b/Ghidra/Features/Base/src/main/java/ghidra/base/help/GhidraHelpService.java index 6b89ae4188..320d271455 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/base/help/GhidraHelpService.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/base/help/GhidraHelpService.java @@ -26,6 +26,7 @@ import docking.help.*; import generic.jar.ResourceFile; import ghidra.framework.Application; import ghidra.util.Msg; +import help.HelpService; import resources.ResourceManager; /** diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/codebrowser/CodeBrowserOptionsTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/codebrowser/CodeBrowserOptionsTest.java index 9105c35223..ca9d948c3c 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/codebrowser/CodeBrowserOptionsTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/codebrowser/CodeBrowserOptionsTest.java @@ -23,8 +23,6 @@ import java.util.stream.Collectors; import org.junit.*; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.fieldpanel.field.*; import generic.test.TestUtils; import ghidra.GhidraOptions; @@ -50,6 +48,8 @@ import ghidra.program.util.BytesFieldLocation; import ghidra.test.AbstractGhidraHeadedIntegrationTest; import ghidra.test.TestEnv; import ghidra.util.HelpLocation; +import help.Help; +import help.HelpService; import util.CollectionUtils; public class CodeBrowserOptionsTest extends AbstractGhidraHeadedIntegrationTest { diff --git a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponent.java b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponent.java index b2c8fb1beb..f9eaf80da4 100644 --- a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponent.java +++ b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerComponent.java @@ -23,8 +23,6 @@ import java.math.BigInteger; import javax.swing.SwingUtilities; import docking.DockingUtils; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.EventTrigger; import docking.widgets.fieldpanel.FieldPanel; import docking.widgets.fieldpanel.Layout; @@ -34,6 +32,8 @@ import docking.widgets.fieldpanel.support.*; import ghidra.app.plugin.core.format.*; import ghidra.program.model.address.*; import ghidra.util.Msg; +import help.Help; +import help.HelpService; /** * FieldViewer to show data formatted according to the DataFormatModel that is passed in to the diff --git a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerPanel.java b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerPanel.java index a9d3e3841a..b395cd35a2 100644 --- a/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerPanel.java +++ b/Ghidra/Features/ByteViewer/src/main/java/ghidra/app/plugin/core/byteviewer/ByteViewerPanel.java @@ -23,8 +23,6 @@ import java.util.List; import javax.swing.*; import javax.swing.event.*; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.fieldpanel.*; import docking.widgets.fieldpanel.field.EmptyTextField; import docking.widgets.fieldpanel.field.Field; @@ -42,6 +40,8 @@ import ghidra.util.Msg; import ghidra.util.exception.InvalidInputException; import ghidra.util.layout.HorizontalLayout; import ghidra.util.layout.PairLayout; +import help.Help; +import help.HelpService; /** * Top level component that contains has a scrolled pane for the panel of components that show the diff --git a/Ghidra/Features/ProgramDiff/src/main/java/ghidra/app/plugin/core/diff/ProgramDiffPlugin.java b/Ghidra/Features/ProgramDiff/src/main/java/ghidra/app/plugin/core/diff/ProgramDiffPlugin.java index 21ce1b4ca4..74abc0e85d 100644 --- a/Ghidra/Features/ProgramDiff/src/main/java/ghidra/app/plugin/core/diff/ProgramDiffPlugin.java +++ b/Ghidra/Features/ProgramDiff/src/main/java/ghidra/app/plugin/core/diff/ProgramDiffPlugin.java @@ -26,8 +26,6 @@ import javax.swing.text.*; import javax.swing.tree.TreeSelectionModel; import docking.DockingUtils; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.EventTrigger; import docking.widgets.OptionDialog; import docking.widgets.fieldpanel.FieldPanel; @@ -62,6 +60,8 @@ import ghidra.util.*; import ghidra.util.exception.CancelledException; import ghidra.util.exception.VersionException; import ghidra.util.task.*; +import help.Help; +import help.HelpService; import resources.ResourceManager; /** diff --git a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/actions/HelpAction.java b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/actions/HelpAction.java index 208bd2460b..ee2ed7903b 100644 --- a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/actions/HelpAction.java +++ b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/actions/HelpAction.java @@ -21,12 +21,12 @@ import javax.swing.Icon; import docking.ActionContext; import docking.action.*; -import docking.help.Help; -import docking.help.HelpService; import docking.tool.ToolConstants; import ghidra.feature.vt.gui.plugin.VTPlugin; import ghidra.util.HelpLocation; import ghidra.util.Msg; +import help.Help; +import help.HelpService; import resources.ResourceManager; public class HelpAction extends DockingAction { diff --git a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/plugin/VTPlugin.java b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/plugin/VTPlugin.java index d0ccbde7f8..320e025640 100644 --- a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/plugin/VTPlugin.java +++ b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/plugin/VTPlugin.java @@ -22,8 +22,6 @@ import java.util.Set; import javax.swing.*; import docking.action.DockingActionIf; -import docking.help.Help; -import docking.help.HelpService; import docking.tool.ToolConstants; import docking.wizard.WizardManager; import ghidra.GhidraOptions; @@ -48,6 +46,8 @@ import ghidra.program.model.address.AddressSetView; import ghidra.program.model.listing.Program; import ghidra.program.util.ProgramLocation; import ghidra.util.*; +import help.Help; +import help.HelpService; import resources.MultiIcon; import resources.ResourceManager; import resources.icons.*; diff --git a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/markuptable/VTMarkupItemsTableProvider.java b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/markuptable/VTMarkupItemsTableProvider.java index 1f8abd13b7..36bf28cb45 100644 --- a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/markuptable/VTMarkupItemsTableProvider.java +++ b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/markuptable/VTMarkupItemsTableProvider.java @@ -31,7 +31,6 @@ import javax.swing.table.*; import docking.*; import docking.action.*; import docking.actions.PopupActionProvider; -import docking.help.HelpService; import docking.widgets.EventTrigger; import docking.widgets.fieldpanel.FieldPanel; import docking.widgets.fieldpanel.internal.FieldPanelCoordinator; @@ -63,6 +62,7 @@ import ghidra.program.util.ProgramLocation; import ghidra.util.HelpLocation; import ghidra.util.table.GhidraTable; import ghidra.util.table.GhidraThreadedTablePanel; +import help.HelpService; import resources.ResourceManager; /** diff --git a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/ApplyMarkupPropertyEditor.java b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/ApplyMarkupPropertyEditor.java index 2e98881e14..dcb718eee9 100644 --- a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/ApplyMarkupPropertyEditor.java +++ b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/ApplyMarkupPropertyEditor.java @@ -27,7 +27,6 @@ import javax.swing.*; import javax.swing.border.TitledBorder; import docking.DockingWindowManager; -import docking.help.HelpService; import docking.widgets.button.GRadioButton; import docking.widgets.checkbox.GCheckBox; import docking.widgets.combobox.GComboBox; @@ -42,6 +41,7 @@ import ghidra.framework.options.*; import ghidra.util.HelpLocation; import ghidra.util.exception.InvalidInputException; import ghidra.util.layout.*; +import help.HelpService; /** * The ApplyMarkupPropertyEditor provides a custom GUI layout for the options that are used when diff --git a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/VTMatchTableProvider.java b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/VTMatchTableProvider.java index 872078b8b1..e1e355c52e 100644 --- a/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/VTMatchTableProvider.java +++ b/Ghidra/Features/VersionTracking/src/main/java/ghidra/feature/vt/gui/provider/matchtable/VTMatchTableProvider.java @@ -30,7 +30,6 @@ import javax.swing.event.ListSelectionListener; import javax.swing.table.*; import docking.*; -import docking.help.HelpService; import docking.widgets.table.*; import docking.widgets.table.threaded.ThreadedTableModel; import ghidra.feature.vt.api.impl.VTChangeManager; @@ -54,6 +53,7 @@ import ghidra.util.layout.HorizontalLayout; import ghidra.util.table.GhidraTable; import ghidra.util.table.GhidraThreadedTablePanel; import ghidra.util.task.SwingUpdateManager; +import help.HelpService; public class VTMatchTableProvider extends ComponentProviderAdapter implements FilterDialogModel, VTControllerListener { diff --git a/Ghidra/Framework/Docking/build.gradle b/Ghidra/Framework/Docking/build.gradle index 233e2ba577..139ec36c1f 100644 --- a/Ghidra/Framework/Docking/build.gradle +++ b/Ghidra/Framework/Docking/build.gradle @@ -15,6 +15,7 @@ */ apply from: "$rootProject.projectDir/gradle/distributableGhidraModule.gradle" apply from: "$rootProject.projectDir/gradle/javaProject.gradle" +apply from: "$rootProject.projectDir/gradle/helpProject.gradle" apply from: "$rootProject.projectDir/gradle/jacocoProject.gradle" apply from: "$rootProject.projectDir/gradle/javaTestProject.gradle" apply from: "$rootProject.projectDir/gradle/javadoc.gradle" @@ -24,12 +25,8 @@ eclipse.project.name = 'Framework Docking' dependencies { api project(':Generic') - api 'net.java.dev.timingframework:timingframework:1.0' - - // Only include this debug version of the jh library if necessary. - //api name:'jh2.with.debug' - api 'javax.help:javahelp:2.0.05' - + api project(':Help') + // include code from src/test in Generic testImplementation project(path: ':Generic', configuration: 'testArtifacts') diff --git a/Ghidra/Framework/Docking/certification.manifest b/Ghidra/Framework/Docking/certification.manifest index 4efc981516..40ca041e72 100644 --- a/Ghidra/Framework/Docking/certification.manifest +++ b/Ghidra/Framework/Docking/certification.manifest @@ -10,6 +10,18 @@ ##MODULE IP: Tango Icons - Public Domain Module.manifest||GHIDRA||||END| data/ExtensionPoint.manifest||GHIDRA||||END| +src/main/help/help/TOC_Source.xml||GHIDRA||||END| +src/main/help/help/shared/arrow.gif||GHIDRA||||END| +src/main/help/help/shared/close16.gif||GHIDRA||||END| +src/main/help/help/shared/menu16.gif||GHIDRA||||END| +src/main/help/help/shared/note-red.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| +src/main/help/help/shared/note.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| +src/main/help/help/shared/note.yellow.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| +src/main/help/help/shared/redo.png||GHIDRA||||END| +src/main/help/help/shared/tip.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| +src/main/help/help/shared/undo.png||GHIDRA||||END| +src/main/help/help/shared/warning.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| +src/main/help/help/topics/PlacheholderTopic/Placeholder.htm||GHIDRA||||END| src/main/java/docking/dnd/package.html||GHIDRA||reviewed||END| src/main/java/docking/options/editor/package.html||GHIDRA||reviewed||END| src/main/java/docking/widgets/fieldpanel/package.html||GHIDRA||reviewed||END| diff --git a/Ghidra/Framework/Docking/src/main/help/help/TOC_Source.xml b/Ghidra/Framework/Docking/src/main/help/help/TOC_Source.xml new file mode 100644 index 0000000000..8a327c6107 --- /dev/null +++ b/Ghidra/Framework/Docking/src/main/help/help/TOC_Source.xml @@ -0,0 +1,54 @@ + + + + + + + + diff --git a/Ghidra/Framework/Docking/src/main/help/help/shared/Frontpage.css b/Ghidra/Framework/Docking/src/main/help/help/shared/Frontpage.css new file mode 100644 index 0000000000..b8471669f4 --- /dev/null +++ b/Ghidra/Framework/Docking/src/main/help/help/shared/Frontpage.css @@ -0,0 +1,64 @@ +/* ### + * 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. + */ +/* + WARNING! + This file is copied to all help directories. If you change this file, you must copy it + to each src/main/help/help/shared directory. + + + Java Help Note: JavaHelp does not accept sizes (like in 'margin-top') in anything but + px (pixel) or with no type marking. + +*/ + +body { margin-bottom: 50px; margin-left: 10px; margin-right: 10px; margin-top: 10px; } /* some padding to improve readability */ +li { font-family:times new roman; font-size:14pt; } +h1 { color:#000080; font-family:times new roman; font-size:36pt; font-style:italic; font-weight:bold; text-align:center; } +h2 { margin: 10px; margin-top: 20px; color:#984c4c; font-family:times new roman; font-size:18pt; font-weight:bold; } +h3 { margin-left: 10px; margin-top: 20px; color:#0000ff; font-family:times new roman; `font-size:14pt; font-weight:bold; } +h4 { margin-left: 10px; margin-top: 20px; font-family:times new roman; font-size:14pt; font-style:italic; } + +/* + P tag code. Most of the help files nest P tags inside of blockquote tags (the was the + way it had been done in the beginning). The net effect is that the text is indented. In + modern HTML we would use CSS to do this. We need to support the Ghidra P tags, nested in + blockquote tags, as well as naked P tags. The following two lines accomplish this. Note + that the 'blockquote p' definition will inherit from the first 'p' definition. +*/ +p { margin-left: 40px; font-family:times new roman; font-size:14pt; } +blockquote p { margin-left: 10px; } + +p.providedbyplugin { color:#7f7f7f; margin-left: 10px; font-size:14pt; margin-top:100px } +p.ProvidedByPlugin { color:#7f7f7f; margin-left: 10px; font-size:14pt; margin-top:100px } +p.relatedtopic { color:#800080; margin-left: 10px; font-size:14pt; } +p.RelatedTopic { color:#800080; margin-left: 10px; font-size:14pt; } + +/* + We wish for a tables to have space between it and the preceding element, so that text + is not too close to the top of the table. Also, nest the table a bit so that it is clear + the table relates to the preceding text. +*/ +table { margin-left: 20px; margin-top: 10px; width: 80%;} +td { font-family:times new roman; font-size:14pt; vertical-align: top; } +th { font-family:times new roman; font-size:14pt; font-weight:bold; background-color: #EDF3FE; } + +/* + Code-like formatting for things such as file system paths and proper names of classes, + methods, etc. To apply this to a file path, use this syntax: + ... +*/ +code { color: black; font-weight: bold; font-family: courier new, monospace; font-size: 14pt; white-space: nowrap; } +code.path { color: #4682B4; font-weight: bold; font-family: courier new, monospace; font-size: 14pt; white-space: nowrap; } diff --git a/Ghidra/Framework/Docking/src/main/help/help/shared/arrow.gif b/Ghidra/Framework/Docking/src/main/help/help/shared/arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..bcb3db70578a43a6aef37fbb13aeb0b3b0ca81be GIT binary patch literal 69 zcmZ?wbhEHb6k_0GXkY+=|Ns9h{$ycfU|?j>0r5dH3`{aT{VPwu<>#Lfcu7j_z|Sb& THV==isgesP{Mz8g$Y2csRcRCu literal 0 HcmV?d00001 diff --git a/Ghidra/Framework/Docking/src/main/help/help/shared/close16.gif b/Ghidra/Framework/Docking/src/main/help/help/shared/close16.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5238646392f8e1bc4b29109b96a7244fbf17182 GIT binary patch literal 859 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 literal 0 HcmV?d00001 diff --git a/Ghidra/Framework/Docking/src/main/help/help/shared/note.png b/Ghidra/Framework/Docking/src/main/help/help/shared/note.png new file mode 100644 index 0000000000000000000000000000000000000000..51e1c8f8c1fa1688a64436ed366e3dba15a6b750 GIT binary patch literal 4193 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 literal 0 HcmV?d00001 diff --git a/Ghidra/Framework/Docking/src/main/help/help/shared/note.yellow.png b/Ghidra/Framework/Docking/src/main/help/help/shared/note.yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..f8ab6489f2afca01576947572918d51cf3fa7978 GIT binary patch literal 4170 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 P&=3YsS3j3^P6Eyh)6Gs@ zkuH#=l-3Vj=tBr?aOgrIebHNKUeXuSHqbT@2!=vwFqBgK(n6XND2+?n*xB65R%I!c zEJasWSJK>V*7JR3lvk7V-devo-{C9+^W$SU3yBE&Vs>1~WBzdl`_>`vO$=Yn(FeT= zTsd0J!|*geF-0XPEei}QHlu!5D9h>f=D5v z(44pM#t%qrb6Gzad>#WUj1NHJL*Tz1JS*Mkk!$0hJIInfzkBttS zdJ%2*E3JI;%NrEMC-N)#Pw*jVd;s$1kuli`pUJAjYvNilnRO;600g4jyf3>o*mFAh zz_8I_bL6Si&y&+;EkR0#wn#V@pUoT^|qBR5R|W=2m+GZC_qdsEK8x9cvQ*C ztAnVo{RY4TeF-20K!n6}44Xzq#cc3^ zi>Z53di$9p`1hobkG>oA^bg1zN5{x;nFc>)LpHmFj4ki5Me-G>qO_+PjU5^us5ONg6~|;bbhArT)*wwNO)$d0-raKsNLlkBkZHZr zAUp1Y1X|{sjmA)ExY~(a2n?$yCv-fqN z;#{FDbC4{gVzzT42q}PIgpe~4bESfGtHXLAh>~Ki-PN|ETPX;DbaRR4nrK}ISv1$P z0NuN|NLtmcxa$)$2m%6Ru+oZ_*Tg3haXsR4+0Bb~HxlL8#sGq%k8C63)t{|X_^*sC z{GqRvkV^iq)z;RS%2OMF6h#pWGj_XFJZg7b-rLCCeU&5uiJ-uwO6}B!;M;%3$(6J} zfvofk%9EU0VHKP!K%|HRqa4pKMqbe-Frt)|w!j1yD#XNqI;}vp!U_fcZ2x<~=Wb+F z9hg;H^@EheE`)a-JXd(Vx!=FB>X)vrx}|IHmdcZdR3su0VMr1?s$M$?-+uuoS8D(F zZYVDgy~IIqfIo8As&bqhMAGVNT`6-;AT&a44^^`ag+OK$)oY_v-zd>cc8|5G|He%AQutjm?QM0*^v^9rME;sf>;PvH^i{onJTUg$_*OL|*TO%Ms znSsunfh65L_9ven1+XUqKYnqdwswo1r=I*OMu$AiUw#$L2FFj#;ERtwj>pdaP=Dd! zGnb#(D*-lUrPYb~?S&mRIdvHM{)a#yln$N5%9g@*GeHzZx6lI$y+Fw0Bte>{@IAjU zf~7U?zyAbU%_i#gI@;~FgT2ZCfl`wjilP`vnqYZ(8QS#$0!l#uOQ|9Q_MT;+I0AW| zmz9DN3LgLV6R7SR0yAT2X$g(3h7eJ6&+di=r$2q_*iP7d>DaMj<3TBa6k=KdfiySY ns8$E)H%9 literal 0 HcmV?d00001 diff --git a/Ghidra/Framework/Docking/src/main/help/help/shared/undo.png b/Ghidra/Framework/Docking/src/main/help/help/shared/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..edd57f5c15f02bf0fd9b572f42bcd1c67ed088ef GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU{r~?zkjc=%(9i&)fHaU; zv}jR7Ljy?SKLc1ENPt*CpgCP>15li?B*-tA!Qt7BG$6;^)5S5Q;#P8k0^bJiY0RE( z3b71HhFly>I~~qwL@)^HGZ?WrykcqKnIK|4gHc4QMe2Zt!xUczBN65o6N)Xj0gYhr MboFyt=akR{0Pznvr~m)} literal 0 HcmV?d00001 diff --git a/Ghidra/Framework/Docking/src/main/help/help/shared/warning.png b/Ghidra/Framework/Docking/src/main/help/help/shared/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9133789b0c5f9a2fd7cfd29fce85a35e8fa120 GIT binary patch literal 1354 zcmV-Q1-1H#P)E2L1Q&_V>FBm^-K zqXA4L(MT}7Nc71>ebr!yF~$TFjp&0f`pyGBX@Z#WqA!LtVgSFQAzIM3(C+TcZ0GZO zr#p3;-Bd|wC7$G$b29gyIsbEJ=VM7qiF;{G@jn)DmiRn(VavY+pHdOM#pCd2YY1=- z`{e9@C*VBgBAtI7wVxORB-rf7msy*?8#|=4`j_A$iAZBF26pGD=y)2U?J$BFeKfMf zO91iJ7Z4yPUG}nQe~Msq0GS?$j$;(rcm)@bUo`<~_u|#i>*`{?2LZ1-59@mjp;PFD z5GUh3t0$m_+Wvzj{;E*fm=gVS2z~@xf&2v!E);%(Utdo_FkN`asqs;^&NVGm-YjZ zHD8RgsuEx!bZX$d3dooWc>69TiVnd=-^vI$OL}0j_emel@=PBPHHvYe1gPRtO+n}t z05yd=Zsq|okO^$|VVrw+0*DA5*bvs~QQo;5AWM-HQblFmR#-|v6`%ynK$M0M*mNMy z1raS@z-Q3?fSo~htIo|#Tv$q23IQIiwfwoKmL}=5t zdlug#%3A=cGz72)+^B*)3*=j>V5M=KC+jo|t=tR0hCR5YZ3C8`g1}Pt2@J0syvy^$ z8W&RlbU-rz5{e8U0+{6-h--kZ1Gxx*Y#;$n1e%%<-t5E~{d4Ta<8bd>z$s$bCm!~0 zuwCYT)4<#h044LHm^jG8`z;UY+JI95++-~_*>GBSH|kg9PS(Tsic|C@UYF6G2^fJ< zzZJgC+IqMs{Qh_0)JMu!k?Cr53$8GcSSmmm(_p1;=FLu?79)5FK>ZGW1H{5ke%QO6 z9n*VVKt}^3!A!gc^gmle|M6O~-h{5uLYPAuyh$1j+xVe)vj6@;a+9*w7Z|5C8-{b6 zeg;_5Axoe%c7D{sG7{!Gf1&Hxr$n)5u*U}=r>_5$--_+cA1$o;8_yqS$NWmiMsr;i z&=xvLSk&pvg&c04E@I-160C7^q3d+NNZ=7N_Y>SnZKHpK9R-LjEnpBi=em4N-`GdI zFbN2xXsM5j`M(Nq!aUwDT3VPdniw@;+3PU3u7^7JNnAy?NkH1YJHcKEoSs2*Xfj@D zVeyIE57uFHsqO|s6b{sZ2(8G4SR%72fIDpt)~~VW<65o1fs0g}`G&3;+aBo2Zoag* zUfFaVm+a#!;ASmrLHfnyzq&|rg(*3RZ1bA7P8?peaN3ECO zD&^Ek#qSEtfcW`0mcBAnf{sc=AeHhz8zbi17A@AzSsdxu0^wj3XXKM zTq0&F4i~B>F$-lpVE{Lf$7PI3yJ-SV?|~5zR>Q7BHop(<`QP)u0Nfb>!wJQD)Bpeg M07*qoM6N<$g1EwNvj6}9 literal 0 HcmV?d00001 diff --git a/Ghidra/Framework/Docking/src/main/help/help/topics/PlacheholderTopic/Placeholder.htm b/Ghidra/Framework/Docking/src/main/help/help/topics/PlacheholderTopic/Placeholder.htm new file mode 100644 index 0000000000..13961916f5 --- /dev/null +++ b/Ghidra/Framework/Docking/src/main/help/help/topics/PlacheholderTopic/Placeholder.htm @@ -0,0 +1,17 @@ + + + + + Placholder Title + + + + +

Stub

+ +

Blah blah

+ +

Related Topics:

+ + + diff --git a/Ghidra/Framework/Docking/src/main/java/docking/ComponentNode.java b/Ghidra/Framework/Docking/src/main/java/docking/ComponentNode.java index 60668be738..daaa6405ba 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/ComponentNode.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/ComponentNode.java @@ -24,11 +24,11 @@ import javax.swing.event.ChangeListener; import org.jdom.Element; -import docking.help.HelpService; import docking.widgets.OptionDialog; import docking.widgets.tabbedpane.DockingTabRenderer; import ghidra.util.*; import ghidra.util.exception.AssertException; +import help.HelpService; import utilities.util.reflection.ReflectionUtilities; /** diff --git a/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java b/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java index 408ad63a14..cb71394ff5 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/ComponentProvider.java @@ -23,10 +23,10 @@ import java.util.*; import javax.swing.*; import docking.action.*; -import docking.help.HelpDescriptor; -import docking.help.HelpService; import ghidra.util.*; import ghidra.util.exception.AssertException; +import help.HelpDescriptor; +import help.HelpService; import utilities.util.reflection.ReflectionUtilities; /** diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DialogComponentProvider.java b/Ghidra/Framework/Docking/src/main/java/docking/DialogComponentProvider.java index b1fa3bd90d..605fb3d1f7 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DialogComponentProvider.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DialogComponentProvider.java @@ -29,13 +29,13 @@ import org.jdesktop.animation.timing.TimingTargetAdapter; import docking.action.*; import docking.actions.KeyBindingUtils; import docking.event.mouse.GMouseListenerAdapter; -import docking.help.HelpService; import docking.menu.DialogToolbarButton; import docking.util.AnimationUtils; import docking.widgets.label.GDHtmlLabel; import ghidra.util.*; import ghidra.util.exception.AssertException; import ghidra.util.task.*; +import help.HelpService; import utility.function.Callback; /** diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockableComponent.java b/Ghidra/Framework/Docking/src/main/java/docking/DockableComponent.java index d485574655..6dbc56f21f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockableComponent.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockableComponent.java @@ -23,9 +23,9 @@ import javax.swing.*; import javax.swing.FocusManager; import docking.action.DockingActionIf; -import docking.help.HelpService; import ghidra.util.CascadedDropTarget; import ghidra.util.HelpLocation; +import help.HelpService; /** * Wrapper class for user components. Adds the title, local toolbar and provides the drag target diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockableHeader.java b/Ghidra/Framework/Docking/src/main/java/docking/DockableHeader.java index 12ba963af6..3ad420264f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockableHeader.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockableHeader.java @@ -30,8 +30,6 @@ import org.jdesktop.animation.timing.Animator.RepeatBehavior; import org.jdesktop.animation.timing.TimingTargetAdapter; import org.jdesktop.animation.timing.interpolation.PropertySetter; -import docking.help.Help; -import docking.help.HelpService; import docking.util.AnimationUtils; import generic.util.WindowUtilities; import generic.util.image.ImageUtils; @@ -41,6 +39,8 @@ import ghidra.util.HelpLocation; import ghidra.util.Msg; import ghidra.util.bean.GGlassPane; import ghidra.util.bean.GGlassPanePainter; +import help.Help; +import help.HelpService; import resources.ResourceManager; /** diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockingDialog.java b/Ghidra/Framework/Docking/src/main/java/docking/DockingDialog.java index eec623712c..c75418fe9f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockingDialog.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockingDialog.java @@ -25,10 +25,10 @@ import javax.swing.*; import org.apache.commons.collections4.map.LazyMap; import docking.framework.ApplicationInformationDisplayFactory; -import docking.help.HelpDescriptor; import generic.util.WindowUtilities; import ghidra.framework.Application; import ghidra.util.bean.GGlassPane; +import help.HelpDescriptor; // NOTE: this class has a static focus component variable that is set whenever the dialog gets // activated and is scheduled to get focus at a later time. This variable is static so that only diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java b/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java index 2252f59a9e..ca5091f4bf 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockingWindowManager.java @@ -31,7 +31,6 @@ import org.jdom.Element; import docking.action.DockingActionIf; import docking.actions.*; -import docking.help.HelpService; import docking.widgets.PasswordDialog; import generic.util.WindowUtilities; import ghidra.framework.OperatingSystem; @@ -41,6 +40,8 @@ import ghidra.util.*; import ghidra.util.datastruct.*; import ghidra.util.exception.AssertException; import ghidra.util.task.SwingUpdateManager; +import help.Help; +import help.HelpService; import util.CollectionUtils; /** @@ -72,11 +73,6 @@ public class DockingWindowManager implements PropertyChangeListener, Placeholder public static final String DOCKING_WINDOWS_OWNER = "DockingWindows"; public static final String TOOL_PREFERENCES_XML_NAME = "PREFERENCES"; - /** - * The helpService field should be set to the appropriate help service provider. - */ - private static HelpService helpService = new DefaultHelpService(); - // we use a list to maintain order private static List instances = new ArrayList<>(); @@ -161,25 +157,13 @@ public class DockingWindowManager implements PropertyChangeListener, Placeholder return "DockingWindowManager: " + root.getTitle(); } - /** - * Sets the help service for the all docking window managers. - * - * @param helpSvc the help service to use. - */ - public static void setHelpService(HelpService helpSvc) { - if (helpSvc == null) { - throw new IllegalArgumentException("HelpService may not be null"); - } - helpService = helpSvc; - } - /** * Returns the global help service. * * @return the global help service. */ public static HelpService getHelpService() { - return helpService; + return Help.getHelpService(); } private static synchronized void addInstance(DockingWindowManager winMgr) { @@ -516,6 +500,7 @@ public class DockingWindowManager implements PropertyChangeListener, Placeholder } private void registerHelpLocation(ComponentProvider provider, HelpLocation helpLocation) { + HelpService helpService = Help.getHelpService(); HelpLocation registeredHelpLocation = helpService.getHelpLocation(provider); if (registeredHelpLocation != null) { return; // nothing to do; location already registered diff --git a/Ghidra/Framework/Docking/src/main/java/docking/action/DockingActionIf.java b/Ghidra/Framework/Docking/src/main/java/docking/action/DockingActionIf.java index c038bd7865..db769a66d6 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/action/DockingActionIf.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/action/DockingActionIf.java @@ -21,7 +21,7 @@ import java.util.Set; import javax.swing.*; import docking.ActionContext; -import docking.help.HelpDescriptor; +import help.HelpDescriptor; /** * The base interface for clients that wish to create commands to be registered with a tool. diff --git a/Ghidra/Framework/Docking/src/main/java/docking/action/HelpAction.java b/Ghidra/Framework/Docking/src/main/java/docking/action/HelpAction.java index c010ede426..98df527915 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/action/HelpAction.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/action/HelpAction.java @@ -20,9 +20,9 @@ import java.awt.*; import javax.swing.KeyStroke; import docking.*; -import docking.help.HelpService; import ghidra.util.HelpLocation; import ghidra.util.SystemUtilities; +import help.HelpService; public class HelpAction extends DockingAction { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpBroker.java b/Ghidra/Framework/Docking/src/main/java/docking/help/DockingHelpBroker.java similarity index 60% rename from Ghidra/Framework/Docking/src/main/java/docking/help/GHelpBroker.java rename to Ghidra/Framework/Docking/src/main/java/docking/help/DockingHelpBroker.java index 6c64cab968..04d8054c5d 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpBroker.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/help/DockingHelpBroker.java @@ -19,7 +19,6 @@ import java.awt.*; import java.awt.geom.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.io.IOException; import java.net.URL; import java.util.List; @@ -27,7 +26,8 @@ import javax.help.*; import javax.help.event.HelpModelEvent; import javax.help.event.HelpModelListener; import javax.swing.*; -import javax.swing.text.*; +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; import javax.swing.text.html.HTML; import javax.swing.text.html.HTMLDocument; @@ -39,108 +39,45 @@ import docking.util.AnimationPainter; import docking.util.AnimationUtils; import ghidra.framework.preferences.Preferences; import ghidra.util.Msg; +import ghidra.util.Swing; import ghidra.util.bean.GGlassPane; -import resources.ResourceManager; - -// NOTE: for JH 2.0, this class has been rewritten to not -// access the 'frame' and 'dialog' variable directly +import help.CustomTOCView; +import help.GHelpBroker; /** - * Ghidra help broker that displays the help set; sets the Ghidra icon on - * the help frame and attempts to maintain the user window size. + * An extension of the {@link GHelpBroker} that allows {@code Docking} classes to be installed. + *

+ * Additions include a search feature a navigation aid. */ -public class GHelpBroker extends DefaultHelpBroker { +public class DockingHelpBroker extends GHelpBroker { + private static final List ICONS = ApplicationInformationDisplayFactory.getWindowIcons(); + private static final int MAX_CALLOUT_RETRIES = 3; - private Dimension windowSize = new Dimension(1100, 700); - - private JEditorPane htmlEditorPane; - private Animator lastAnimator; - private URL loadingURL; private PropertyChangeListener pageLoadListener = new PageLoadingListener(); private HelpModelListener helpModelListener = new HelpIDChangedListener(); - private Window activationWindow; + private Animator lastAnimator; + private URL loadingURL; - // Create the zoom in/out icons that will be added to the default jHelp toolbar. - private static final ImageIcon ZOOM_OUT_ICON = - ResourceManager.loadImage("images/list-remove.png"); - private static final ImageIcon ZOOM_IN_ICON = ResourceManager.loadImage("images/list-add.png"); - - /** - * Construct a new GhidraHelpBroker. - * @param hs java help set associated with this help broker - */ - public GHelpBroker(HelpSet hs) { + public DockingHelpBroker(HelpSet hs) { super(hs); } @Override - // Overridden so that we can call the preferred version of setCurrentURL on the HelpModel, - // which fixes a bug with the history list (SCR 7639) - public void setCurrentURL(final URL URL) { - - HelpModel model = getHelpModel(); - if (model != null) { - model.setCurrentURL(URL, getHistoryName(URL), null); - } - else { - super.setCurrentURL(URL); - } + protected List getApplicationIcons() { + return ICONS; } - /* Perform some shenanigans to force Java Help to reload the given URL */ - void reloadHelpPage(URL url) { - clearContentViewer(); - prepareToCallout(url); - try { - htmlEditorPane.setPage(url); - } - catch (IOException e) { - Msg.error(this, "Unexpected error loading help page: " + url, e); - } - } - - private void clearContentViewer() { - htmlEditorPane.getDocument().putProperty(Document.StreamDescriptionProperty, null); - } - - private JScrollPane getScrollPane(JEditorPane editorPane) { - Container parent = editorPane.getParent(); - while (parent != null) { - if (parent instanceof JScrollPane) { - return (JScrollPane) parent; - } - parent = parent.getParent(); - } - return null; - } - - private JEditorPane getHTMLEditorPane(JHelpContentViewer contentViewer) { - // - // Intimate Knowledge - construction of the viewer: - // - // -BorderLayout - // -JScrollPane - // -Viewport - // -JHEditorPane extends JEditorPane - // - // - Component[] components = contentViewer.getComponents(); - JScrollPane scrollPane = (JScrollPane) components[0]; - JViewport viewport = scrollPane.getViewport(); - - return (JEditorPane) viewport.getView(); - } - - private HelpModel getHelpModel() { + @Override + protected HelpModel getCustomHelpModel() { // // Unusual Code Alert!: We have opened up access to the help system's HelpModel by way - // of our CustomTOCView object that we install elsewhere. We need - // access to the model because of a bug in the help system + // of our CustomTOCView object that we install elsewhere. We need + // access to the model because of a bug in the help system // (SCR 7639). Unfortunately, the Java Help system does not give us // access to the model directly, but we have opened up the access from - // one of our overriding components. The following code is + // one of our overriding components. The following code is // digging-out our custom component to get at the model. An // alternative approach would be to just use reflection and violate // security restrictions, but that seemed worse than this solution. @@ -160,133 +97,18 @@ public class GHelpBroker extends DefaultHelpBroker { } @Override - public void setDisplayed(boolean b) { - if (!b) { - super.setDisplayed(b); - return; - } - - // this must be before any call that triggers the help system to create its window - initializeScreenDevice(); - - WindowPresentation windowPresentation = getWindowPresentation(); - updateWindowSize(windowPresentation); - - // this has to be before getHelpWindow() or the value returned will be null - super.setDisplayed(b); - - initializeUIWindowPresentation(windowPresentation); - } - - private void initializeScreenDevice() { - if (isInitialized()) { - return; - } - - if (activationWindow == null) { - // This can happen when we show the 'What's New' help page on a fresh install. In - // that case, we were not activated from an existing window, thus, there may - // be no parent window. - return; - } - - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - GraphicsDevice[] gs = ge.getScreenDevices(); - GraphicsConfiguration config = activationWindow.getGraphicsConfiguration(); - GraphicsDevice parentDevice = config.getDevice(); - for (int i = 0; i < gs.length; i++) { - if (gs[i] == parentDevice) { - // update the help window's screen to match that of the parent - setScreen(i); - } - } - } - - private void initializeUIWindowPresentation(WindowPresentation windowPresentation) { - - Window helpWindow = windowPresentation.getHelpWindow(); - Container contentPane = null; - if (helpWindow instanceof JFrame) { - JFrame frame = (JFrame) helpWindow; - installRootPane(frame); - frame.setIconImages(ICONS); - contentPane = frame.getContentPane(); - } - else if (helpWindow instanceof JDialog) { - JDialog dialog = (JDialog) helpWindow; - installRootPane(dialog); - contentPane = dialog.getContentPane(); - } - - initializeUIComponents(contentPane); - } - - private boolean isInitialized() { - return htmlEditorPane != null; - } - - private void initializeUIComponents(Container contentPane) { - - if (isInitialized()) { - return;// already initialized - } - - Component[] components = contentPane.getComponents(); - JHelp jHelp = (JHelp) components[0]; - addCustomToolbarItems(jHelp); - JHelpContentViewer contentViewer = jHelp.getContentViewer(); - htmlEditorPane = getHTMLEditorPane(contentViewer); - - // just creating the search wires everything together - HelpModel helpModel = getHelpModel(); + protected void installHelpSearcher(JHelp jHelp, HelpModel helpModel) { helpModel.addHelpModelListener(helpModelListener); new HelpViewSearcher(jHelp, helpModel); - - installActions(jHelp); } - /** - * Create zoom in/out buttons on the default help window toolbar. - * @param jHelp the java help object used to retrieve the help components - */ - protected void addCustomToolbarItems(final JHelp jHelp) { - - for (Component component : jHelp.getComponents()) { - if (component instanceof JToolBar) { - JToolBar toolbar = (JToolBar) component; - toolbar.addSeparator(); - - ImageIcon zoomOutIcon = ResourceManager.getScaledIcon(ZOOM_OUT_ICON, 24, 24); - JButton zoomOutBtn = new JButton(zoomOutIcon); - zoomOutBtn.setToolTipText("Zoom out"); - zoomOutBtn.addActionListener(e -> { - GHelpHTMLEditorKit.zoomOut(); - - // Need to reload the page to force the scroll panes to resize properly. A - // simple revalidate/repaint won't do it. - reloadHelpPage(getCurrentURL()); - }); - toolbar.add(zoomOutBtn); - - ImageIcon zoomInIcon = ResourceManager.getScaledIcon(ZOOM_IN_ICON, 24, 24); - JButton zoomInBtn = new JButton(zoomInIcon); - zoomInBtn.setToolTipText("Zoom in"); - zoomInBtn.addActionListener(e -> { - GHelpHTMLEditorKit.zoomIn(); - - // Need to reload the page to force the scroll panes to resize properly. A - // simple revalidate/repaint won't do it. - reloadHelpPage(getCurrentURL()); - }); - toolbar.add(zoomInBtn); - - // Once we've found the toolbar we can break out of the loop and stop looking for it. - break; - } - } + @Override + protected void showNavigationAid(URL url) { + prepareToCallout(url); } - private void installActions(JHelp help) { + @Override + protected void installActions(JHelp help) { JToolBar toolbar = null; Component[] components = help.getComponents(); for (Component c : components) { @@ -308,79 +130,24 @@ public class GHelpBroker extends DefaultHelpBroker { toolbar.add(new JButton(action)); } - private String getHistoryName(URL URL) { - String text = URL.getFile(); - int index = text.lastIndexOf('/'); - if (index != -1) { - // we want just the filename - text = text.substring(index + 1); - } - - String ref = URL.getRef(); - if (ref != null) { - text += " - " + ref; - } - return text; + @Override // opened access + protected void reloadHelpPage(URL url) { + super.reloadHelpPage(url); } - private void installRootPane(JFrame frame) { - Component oldGlassPane = frame.getGlassPane(); - if (!(oldGlassPane instanceof GGlassPane)) { - GGlassPane gGlassPane = new GGlassPane(); - frame.setGlassPane(gGlassPane); - gGlassPane.setVisible(true); - } - } +//================================================================================================= +// Navigation Aid Section +//================================================================================================= - private void installRootPane(JDialog dialog) { - Component oldGlassPane = dialog.getGlassPane(); - if (!(oldGlassPane instanceof GGlassPane)) { - GGlassPane gGlassPane = new GGlassPane(); - dialog.setGlassPane(gGlassPane); - gGlassPane.setVisible(true); - } - } - - private void updateWindowSize(WindowPresentation presentation) { - if (windowSize == null) { - return; - } - - presentation.createHelpWindow(); - presentation.setSize(windowSize); - } - - @Override - public void setActivationWindow(Window window) { - WindowPresentation windowPresentation = getWindowPresentation(); - Window helpWindow = windowPresentation.getHelpWindow(); - if (helpWindow == null) { - activationWindow = window; - super.setActivationWindow(window); - return; - } - - windowSize = helpWindow.getSize();// remember the previous size - - boolean wasModal = isModalWindow(helpWindow); - boolean willBeModal = isModalWindow(window); - if (!wasModal && willBeModal) { - // in this condition, a new window will be shown, but the old one is not properly - // closed by JavaHelp - helpWindow.setVisible(false); - } - - super.setActivationWindow(window); - } - - private boolean isModalWindow(Window window) { - if (window instanceof Dialog) { - Dialog dialog = (Dialog) window; - if (dialog.isModal()) { - return true; + private JScrollPane getScrollPane(JEditorPane editorPane) { + Container parent = editorPane.getParent(); + while (parent != null) { + if (parent instanceof JScrollPane) { + return (JScrollPane) parent; } + parent = parent.getParent(); } - return false; + return null; } private void showNavigationAid() { @@ -398,7 +165,7 @@ public class GHelpBroker extends DefaultHelpBroker { } private void calloutReferenceLater() { - SwingUtilities.invokeLater(() -> calloutReference(loadingURL)); + Swing.runLater(() -> calloutReference(loadingURL)); } private void calloutReference(final URL url) { @@ -442,10 +209,10 @@ public class GHelpBroker extends DefaultHelpBroker { * help pages and when the UI is adjusted in response to those changes. *

* Note: this method will call itself if the view is not yet updated for the requested - * model change. In that case, this method will call itself again later. This may - * need to happen more than once. However, we will only try a few times and + * model change. In that case, this method will call itself again later. This may + * need to happen more than once. However, we will only try a few times and * then just give up. - * + * * @param area the area to call out * @param callCount the number number of times this method has already been called */ @@ -477,20 +244,20 @@ public class GHelpBroker extends DefaultHelpBroker { // // Unusual Code: Not yet rendered! Try again. // - SwingUtilities.invokeLater(() -> doCalloutReference(area, numberOfCalls)); + Swing.runLater(() -> doCalloutReference(area, numberOfCalls)); return; } // - // The area of the HTML content is absolute inside of the entire document. - // However, the user is viewing the document inside of a scroll pane. So, we + // The area of the HTML content is absolute inside of the entire document. + // However, the user is viewing the document inside of a scroll pane. So, we // want the offset of the element within the viewer, not the absolute position. // area.y -= viewPosition.y; // - // Update the coordinates to be relative to the content pane, which is where we + // Update the coordinates to be relative to the content pane, which is where we // are doing the painting. // Rectangle relativeArea = SwingUtilities.convertRectangle(scrollPane, area, contentPane); @@ -519,7 +286,6 @@ public class GHelpBroker extends DefaultHelpBroker { loadingURL = url; - // TODO // updateTitle(); if (isCurrentPage(loadingURL)) { @@ -650,8 +416,8 @@ public class GHelpBroker extends DefaultHelpBroker { // At 0%, with 100% opacity; at the end, paint with 0% opacity // Composite originalComposite = g2d.getComposite(); - AlphaComposite alphaComposite = AlphaComposite.getInstance( - AlphaComposite.SrcOver.getRule(), (float) (1 - percentComplete)); + AlphaComposite alphaComposite = AlphaComposite + .getInstance(AlphaComposite.SrcOver.getRule(), (float) (1 - percentComplete)); g2d.setComposite(alphaComposite); double transition = 1 - percentComplete; @@ -686,7 +452,7 @@ public class GHelpBroker extends DefaultHelpBroker { Shape box = scaler.createTransformedShape(b); g2d.setColor(Color.GREEN); g2d.fill(box); - + box = transform.createTransformedShape(box); g2d.setColor(Color.YELLOW); g2d.fill(box); diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/DockingHelpSet.java b/Ghidra/Framework/Docking/src/main/java/docking/help/DockingHelpSet.java new file mode 100644 index 0000000000..4b6dc05ab1 --- /dev/null +++ b/Ghidra/Framework/Docking/src/main/java/docking/help/DockingHelpSet.java @@ -0,0 +1,38 @@ +/* ### + * 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 docking.help; + +import java.net.URL; + +import javax.help.HelpBroker; +import javax.help.HelpSetException; + +import help.GHelpSet; + +/** + * An extension of the {@link GHelpSet} that allows {@code Docking} classes to be installed. + */ +public class DockingHelpSet extends GHelpSet { + + public DockingHelpSet(ClassLoader loader, URL helpset) throws HelpSetException { + super(loader, helpset); + } + + @Override + public HelpBroker createHelpBroker() { + return new DockingHelpBroker(this); + } +} diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/HelpManager.java b/Ghidra/Framework/Docking/src/main/java/docking/help/HelpManager.java index 55e64a85e9..dc3678c550 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/HelpManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/help/HelpManager.java @@ -38,6 +38,7 @@ import ghidra.util.*; import ghidra.util.exception.AssertException; import ghidra.util.exception.CancelledException; import ghidra.util.task.TaskMonitor; +import help.*; import resources.ResourceManager; import utilities.util.reflection.ReflectionUtilities; @@ -83,7 +84,7 @@ public class HelpManager implements HelpService { * @throws HelpSetException if HelpSet could not be created */ protected HelpManager(URL url) throws HelpSetException { - mainHS = new GHelpSet(new GHelpClassLoader(null), url); + mainHS = new DockingHelpSet(new GHelpClassLoader(null), url); mainHB = mainHS.createHelpBroker(); mainHS.setTitle(GHIDRA_HELP_TITLE); @@ -260,8 +261,8 @@ public class HelpManager implements HelpService { displayHelp(createHelpID(helpId), window); } catch (BadIDException e) { - Msg.info(this, "Could not find help for ID: \"" + helpId + - "\" from HelpLocation: " + loc); + Msg.info(this, + "Could not find help for ID: \"" + helpId + "\" from HelpLocation: " + loc); displayHelp(HELP_NOT_FOUND_PAGE_URL, window); } } @@ -565,12 +566,12 @@ public class HelpManager implements HelpService { /** This forces page to be redisplayed when location has not changed */ private void reloadPage(URL helpURL) { - if (!(mainHB instanceof GHelpBroker)) { + if (!(mainHB instanceof DockingHelpBroker)) { // not our broker installed; can't force a reload return; } - ((GHelpBroker) mainHB).reloadHelpPage(validateUrl(helpURL)); + ((DockingHelpBroker) mainHB).reloadHelpPage(validateUrl(helpURL)); } private URL getURLForID(ID ID) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/ToggleNavigationAid.java b/Ghidra/Framework/Docking/src/main/java/docking/help/ToggleNavigationAid.java index 8d110f5feb..5af1ff1b19 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/ToggleNavigationAid.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/help/ToggleNavigationAid.java @@ -54,7 +54,7 @@ public class ToggleNavigationAid extends AbstractAction { showingNavigationAid = Boolean.parseBoolean(value); } else { - // not yet in the preferences; save the default + // not yet in the preferences; save the default savePreference(); } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/menu/MultiStateDockingAction.java b/Ghidra/Framework/Docking/src/main/java/docking/menu/MultiStateDockingAction.java index 93355a3dd4..1fd1b5142c 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/menu/MultiStateDockingAction.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/menu/MultiStateDockingAction.java @@ -23,11 +23,11 @@ import javax.swing.JButton; import docking.ActionContext; import docking.action.*; -import docking.help.Help; import docking.widgets.EventTrigger; import ghidra.util.HelpLocation; import ghidra.util.Swing; import ghidra.util.exception.AssertException; +import help.Help; import resources.icons.EmptyIcon; /** diff --git a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsEditorPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsEditorPanel.java index b4eb4d7aea..2a407360aa 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsEditorPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsEditorPanel.java @@ -24,12 +24,12 @@ import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.border.Border; -import docking.help.Help; -import docking.help.HelpService; import ghidra.framework.options.*; import ghidra.util.HelpLocation; import ghidra.util.exception.AssertException; import ghidra.util.layout.VerticalLayout; +import help.Help; +import help.HelpService; /** * diff --git a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsPanel.java b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsPanel.java index 2527a16c01..d8640fab9b 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsPanel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/options/editor/OptionsPanel.java @@ -27,8 +27,6 @@ import javax.swing.*; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.MultiLineLabel; import docking.widgets.OptionDialog; import docking.widgets.label.GIconLabel; @@ -40,6 +38,8 @@ import ghidra.util.*; import ghidra.util.bean.opteditor.OptionsVetoException; import ghidra.util.layout.MiddleLayout; import ghidra.util.task.SwingUpdateManager; +import help.Help; +import help.HelpService; import resources.ResourceManager; public class OptionsPanel extends JPanel { 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 d72e15d92b..6839eaa01f 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 @@ -29,7 +29,6 @@ import javax.swing.table.TableModel; import org.jdom.Element; import docking.DockingWindowManager; -import docking.help.HelpService; import docking.menu.*; import docking.widgets.EmptyBorderButton; import docking.widgets.EventTrigger; @@ -45,6 +44,7 @@ import ghidra.util.datastruct.WeakDataStructureFactory; import ghidra.util.datastruct.WeakSet; import ghidra.util.exception.AssertException; import ghidra.util.task.SwingUpdateManager; +import help.HelpService; import resources.Icons; import resources.ResourceManager; import utilities.util.reflection.ReflectionUtilities; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableHeader.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableHeader.java index a8fe270267..e606960e1f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableHeader.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/table/GTableHeader.java @@ -22,10 +22,10 @@ import javax.swing.*; import javax.swing.table.*; import docking.DockingWindowManager; -import docking.help.HelpService; import docking.widgets.table.columnfilter.ColumnBasedTableFilter; import ghidra.util.HTMLUtilities; import ghidra.util.HelpLocation; +import help.HelpService; import resources.ResourceManager; /** 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 09a5acb3b0..fb2e2fc23f 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 @@ -23,7 +23,6 @@ import javax.swing.border.BevelBorder; import org.jdom.Element; import docking.DockingWindowManager; -import docking.help.HelpService; import docking.widgets.EmptyBorderButton; import docking.widgets.filter.*; import docking.widgets.label.GLabel; @@ -32,6 +31,7 @@ import docking.widgets.tree.support.GTreeFilter; import ghidra.framework.options.PreferenceState; import ghidra.util.FilterTransformer; import ghidra.util.HelpLocation; +import help.HelpService; public class DefaultGTreeFilterProvider implements GTreeFilterProvider { private static final String FILTER_STATE = "FILTER_STATE"; 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 fc2d67dbaa..3e8d1ba78a 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardManager.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/wizard/WizardManager.java @@ -25,11 +25,11 @@ import javax.swing.border.TitledBorder; import docking.DialogComponentProvider; import docking.DockingWindowManager; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.EmptyBorderButton; import docking.widgets.label.GDLabel; import ghidra.util.*; +import help.Help; +import help.HelpService; import resources.ResourceManager; /** 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 5b368651a8..39e307c99f 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 @@ -27,7 +27,6 @@ import com.google.common.base.Function; import docking.DockingUtils; import docking.DockingWindowManager; import docking.actions.KeyBindingUtils; -import docking.help.HelpService; import docking.widgets.EmptyBorderButton; import docking.widgets.PopupWindow; import docking.widgets.label.GIconLabel; @@ -58,6 +57,7 @@ import ghidra.graph.viewer.vertex.*; import ghidra.util.HTMLUtilities; import ghidra.util.HelpLocation; import ghidra.util.exception.AssertException; +import help.HelpService; import resources.Icons; import resources.ResourceManager; import util.CollectionUtils; diff --git a/Ghidra/Framework/Help/build.gradle b/Ghidra/Framework/Help/build.gradle index 9f9785185e..9e13b753c3 100644 --- a/Ghidra/Framework/Help/build.gradle +++ b/Ghidra/Framework/Help/build.gradle @@ -24,8 +24,13 @@ eclipse.project.name = 'Framework Help' dependencies { api project(':Utility') - api project(':Docking') + api project(':Generic') + + api 'net.java.dev.timingframework:timingframework:1.0' + + // Only include this debug version of the jh library if necessary. + //api name:'jh2.with.debug' + api 'javax.help:javahelp:2.0.05' -// api name:'jh' - provided by Docking } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DefaultHelpService.java b/Ghidra/Framework/Help/src/main/java/docking/DefaultHelpService.java similarity index 97% rename from Ghidra/Framework/Docking/src/main/java/docking/DefaultHelpService.java rename to Ghidra/Framework/Help/src/main/java/docking/DefaultHelpService.java index feb1e90b06..42ff57ade0 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DefaultHelpService.java +++ b/Ghidra/Framework/Help/src/main/java/docking/DefaultHelpService.java @@ -19,10 +19,10 @@ import java.awt.*; import javax.swing.JButton; -import docking.help.HelpDescriptor; -import docking.help.HelpService; import ghidra.util.HelpLocation; import ghidra.util.Msg; +import help.HelpDescriptor; +import help.HelpService; public class DefaultHelpService implements HelpService { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/CustomFavoritesView.java b/Ghidra/Framework/Help/src/main/java/help/CustomFavoritesView.java similarity index 99% rename from Ghidra/Framework/Docking/src/main/java/docking/help/CustomFavoritesView.java rename to Ghidra/Framework/Help/src/main/java/help/CustomFavoritesView.java index 425f286955..29f2cb8cf6 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/CustomFavoritesView.java +++ b/Ghidra/Framework/Help/src/main/java/help/CustomFavoritesView.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package docking.help; +package help; import java.awt.Component; import java.awt.event.KeyAdapter; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/CustomSearchView.java b/Ghidra/Framework/Help/src/main/java/help/CustomSearchView.java similarity index 98% rename from Ghidra/Framework/Docking/src/main/java/docking/help/CustomSearchView.java rename to Ghidra/Framework/Help/src/main/java/help/CustomSearchView.java index 03ac427283..bcc74b6d91 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/CustomSearchView.java +++ b/Ghidra/Framework/Help/src/main/java/help/CustomSearchView.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. @@ -14,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package docking.help; +package help; import ghidra.util.Msg; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/CustomTOCView.java b/Ghidra/Framework/Help/src/main/java/help/CustomTOCView.java similarity index 99% rename from Ghidra/Framework/Docking/src/main/java/docking/help/CustomTOCView.java rename to Ghidra/Framework/Help/src/main/java/help/CustomTOCView.java index a8b7a8ce9f..942bffb27d 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/CustomTOCView.java +++ b/Ghidra/Framework/Help/src/main/java/help/CustomTOCView.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package docking.help; +package help; import java.awt.Component; import java.net.MalformedURLException; diff --git a/Ghidra/Framework/Help/src/main/java/help/GHelpBroker.java b/Ghidra/Framework/Help/src/main/java/help/GHelpBroker.java new file mode 100644 index 0000000000..2912226ba5 --- /dev/null +++ b/Ghidra/Framework/Help/src/main/java/help/GHelpBroker.java @@ -0,0 +1,331 @@ +/* ### + * 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 help; + +import java.awt.*; +import java.io.IOException; +import java.net.URL; +import java.util.List; + +import javax.help.*; +import javax.swing.*; +import javax.swing.text.Document; + +import ghidra.util.Msg; +import ghidra.util.bean.GGlassPane; +import resources.ResourceManager; + +// NOTE: for JH 2.0, this class has been rewritten to not +// access the 'frame' and 'dialog' variable directly + +/** + * Ghidra help broker that displays the help set; sets the application icon on the help frame and + * attempts to maintain the user window size. + */ +public class GHelpBroker extends DefaultHelpBroker { + + // Create the zoom in/out icons that will be added to the default jHelp toolbar. + private static final ImageIcon ZOOM_OUT_ICON = + ResourceManager.loadImage("images/list-remove.png"); + private static final ImageIcon ZOOM_IN_ICON = ResourceManager.loadImage("images/list-add.png"); + + private Dimension windowSize = new Dimension(1100, 700); + + protected JEditorPane htmlEditorPane; + private Window activationWindow; + + /** + * Construct a new GhidraHelpBroker. + * @param hs java help set associated with this help broker + */ + public GHelpBroker(HelpSet hs) { + super(hs); + } + + @Override + // Overridden so that we can call the preferred version of setCurrentURL on the HelpModel, + // which fixes a bug with the history list (SCR 7639) + public void setCurrentURL(final URL URL) { + + HelpModel model = getCustomHelpModel(); + if (model != null) { + model.setCurrentURL(URL, getHistoryName(URL), null); + } + else { + super.setCurrentURL(URL); + } + } + + protected List getApplicationIcons() { + return null; + } + + protected HelpModel getCustomHelpModel() { + return null; + } + + /* Perform some shenanigans to force Java Help to reload the given URL */ + protected void reloadHelpPage(URL url) { + clearContentViewer(); + showNavigationAid(url); + try { + htmlEditorPane.setPage(url); + } + catch (IOException e) { + Msg.error(this, "Unexpected error loading help page: " + url, e); + } + } + + protected void showNavigationAid(URL url) { + // this base class does not have a navigation aid + } + + private void clearContentViewer() { + htmlEditorPane.getDocument().putProperty(Document.StreamDescriptionProperty, null); + } + + private JEditorPane getHTMLEditorPane(JHelpContentViewer contentViewer) { + // + // Intimate Knowledge - construction of the viewer: + // + // -BorderLayout + // -JScrollPane + // -Viewport + // -JHEditorPane extends JEditorPane + // + // + Component[] components = contentViewer.getComponents(); + JScrollPane scrollPane = (JScrollPane) components[0]; + JViewport viewport = scrollPane.getViewport(); + + return (JEditorPane) viewport.getView(); + } + + @Override + public void setDisplayed(boolean b) { + if (!b) { + super.setDisplayed(b); + return; + } + + // this must be before any call that triggers the help system to create its window + initializeScreenDevice(); + + WindowPresentation windowPresentation = getWindowPresentation(); + updateWindowSize(windowPresentation); + + // this has to be before getHelpWindow() or the value returned will be null + super.setDisplayed(b); + + initializeUIWindowPresentation(windowPresentation); + } + + private void initializeScreenDevice() { + if (isInitialized()) { + return; + } + + if (activationWindow == null) { + // This can happen when we show the 'What's New' help page on a fresh install. In + // that case, we were not activated from an existing window, thus, there may + // be no parent window. + return; + } + + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] gs = ge.getScreenDevices(); + GraphicsConfiguration config = activationWindow.getGraphicsConfiguration(); + GraphicsDevice parentDevice = config.getDevice(); + for (int i = 0; i < gs.length; i++) { + if (gs[i] == parentDevice) { + // update the help window's screen to match that of the parent + setScreen(i); + } + } + } + + private void initializeUIWindowPresentation(WindowPresentation windowPresentation) { + + Window helpWindow = windowPresentation.getHelpWindow(); + Container contentPane = null; + if (helpWindow instanceof JFrame) { + JFrame frame = (JFrame) helpWindow; + installRootPane(frame); + List icons = getApplicationIcons(); + if (icons != null) { + frame.setIconImages(icons); + } + contentPane = frame.getContentPane(); + } + else if (helpWindow instanceof JDialog) { + JDialog dialog = (JDialog) helpWindow; + installRootPane(dialog); + contentPane = dialog.getContentPane(); + } + + initializeUIComponents(contentPane); + } + + private boolean isInitialized() { + return htmlEditorPane != null; + } + + private void initializeUIComponents(Container contentPane) { + + if (isInitialized()) { + return;// already initialized + } + + Component[] components = contentPane.getComponents(); + JHelp jHelp = (JHelp) components[0]; + addCustomToolbarItems(jHelp); + JHelpContentViewer contentViewer = jHelp.getContentViewer(); + htmlEditorPane = getHTMLEditorPane(contentViewer); + + // just creating the search wires everything together + HelpModel helpModel = getCustomHelpModel(); + installHelpSearcher(jHelp, helpModel); + if (helpModel != null) { + installHelpSearcher(jHelp, helpModel); + } + + installActions(jHelp); + } + + protected void installHelpSearcher(JHelp jHelp, HelpModel helpModel) { + // this base class does not provide an in-page search feature + } + + /** + * Create zoom in/out buttons on the default help window toolbar. + * @param jHelp the java help object used to retrieve the help components + */ + protected void addCustomToolbarItems(final JHelp jHelp) { + + for (Component component : jHelp.getComponents()) { + if (component instanceof JToolBar) { + JToolBar toolbar = (JToolBar) component; + toolbar.addSeparator(); + + ImageIcon zoomOutIcon = ResourceManager.getScaledIcon(ZOOM_OUT_ICON, 24, 24); + JButton zoomOutBtn = new JButton(zoomOutIcon); + zoomOutBtn.setToolTipText("Zoom out"); + zoomOutBtn.addActionListener(e -> { + GHelpHTMLEditorKit.zoomOut(); + + // Need to reload the page to force the scroll panes to resize properly. A + // simple revalidate/repaint won't do it. + reloadHelpPage(getCurrentURL()); + }); + toolbar.add(zoomOutBtn); + + ImageIcon zoomInIcon = ResourceManager.getScaledIcon(ZOOM_IN_ICON, 24, 24); + JButton zoomInBtn = new JButton(zoomInIcon); + zoomInBtn.setToolTipText("Zoom in"); + zoomInBtn.addActionListener(e -> { + GHelpHTMLEditorKit.zoomIn(); + + // Need to reload the page to force the scroll panes to resize properly. A + // simple revalidate/repaint won't do it. + reloadHelpPage(getCurrentURL()); + }); + toolbar.add(zoomInBtn); + + // Once we've found the toolbar we can break out of the loop and stop looking for it. + break; + } + } + } + + protected void installActions(JHelp help) { + // subclasses may have actions + } + + private String getHistoryName(URL URL) { + String text = URL.getFile(); + int index = text.lastIndexOf('/'); + if (index != -1) { + // we want just the filename + text = text.substring(index + 1); + } + + String ref = URL.getRef(); + if (ref != null) { + text += " - " + ref; + } + return text; + } + + private void installRootPane(JFrame frame) { + Component oldGlassPane = frame.getGlassPane(); + if (!(oldGlassPane instanceof GGlassPane)) { + GGlassPane gGlassPane = new GGlassPane(); + frame.setGlassPane(gGlassPane); + gGlassPane.setVisible(true); + } + } + + private void installRootPane(JDialog dialog) { + Component oldGlassPane = dialog.getGlassPane(); + if (!(oldGlassPane instanceof GGlassPane)) { + GGlassPane gGlassPane = new GGlassPane(); + dialog.setGlassPane(gGlassPane); + gGlassPane.setVisible(true); + } + } + + private void updateWindowSize(WindowPresentation presentation) { + if (windowSize == null) { + return; + } + + presentation.createHelpWindow(); + presentation.setSize(windowSize); + } + + @Override + public void setActivationWindow(Window window) { + WindowPresentation windowPresentation = getWindowPresentation(); + Window helpWindow = windowPresentation.getHelpWindow(); + if (helpWindow == null) { + activationWindow = window; + super.setActivationWindow(window); + return; + } + + windowSize = helpWindow.getSize();// remember the previous size + + boolean wasModal = isModalWindow(helpWindow); + boolean willBeModal = isModalWindow(window); + if (!wasModal && willBeModal) { + // in this condition, a new window will be shown, but the old one is not properly + // closed by JavaHelp + helpWindow.setVisible(false); + } + + super.setActivationWindow(window); + } + + private boolean isModalWindow(Window window) { + if (window instanceof Dialog) { + Dialog dialog = (Dialog) window; + if (dialog.isModal()) { + return true; + } + } + return false; + } +} diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpHTMLEditorKit.java b/Ghidra/Framework/Help/src/main/java/help/GHelpHTMLEditorKit.java similarity index 99% rename from Ghidra/Framework/Docking/src/main/java/docking/help/GHelpHTMLEditorKit.java rename to Ghidra/Framework/Help/src/main/java/help/GHelpHTMLEditorKit.java index 4fd0f7b57f..9598c6100a 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpHTMLEditorKit.java +++ b/Ghidra/Framework/Help/src/main/java/help/GHelpHTMLEditorKit.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package docking.help; +package help; import java.awt.Desktop; import java.awt.Image; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpSet.java b/Ghidra/Framework/Help/src/main/java/help/GHelpSet.java similarity index 99% rename from Ghidra/Framework/Docking/src/main/java/docking/help/GHelpSet.java rename to Ghidra/Framework/Help/src/main/java/help/GHelpSet.java index b60a15a30f..6b1cd1cc22 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/GHelpSet.java +++ b/Ghidra/Framework/Help/src/main/java/help/GHelpSet.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package docking.help; +package help; import java.io.IOException; import java.io.InputStream; diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/Help.java b/Ghidra/Framework/Help/src/main/java/help/Help.java similarity index 80% rename from Ghidra/Framework/Docking/src/main/java/docking/help/Help.java rename to Ghidra/Framework/Help/src/main/java/help/Help.java index b1bc8faee7..93b3adbdd7 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/Help.java +++ b/Ghidra/Framework/Help/src/main/java/help/Help.java @@ -13,13 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package docking.help; +package help; import docking.DefaultHelpService; -import docking.DockingWindowManager; /** - * Creates the HelpManager for the application. This is just a glorified global variable for + * Creates the HelpManager for the application. This is just a glorified global variable for * the application. */ public class Help { @@ -28,17 +27,16 @@ public class Help { /** * Get the help service - * + * * @return null if the call to setMainHelpSetURL() failed */ public static HelpService getHelpService() { return helpService; } - // allows help services to install themselves - static void installHelpService(HelpService service) { + // allows help services to install themselves + public static void installHelpService(HelpService service) { helpService = service; - DockingWindowManager.setHelpService(helpService); } } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/HelpDescriptor.java b/Ghidra/Framework/Help/src/main/java/help/HelpDescriptor.java similarity index 90% rename from Ghidra/Framework/Docking/src/main/java/docking/help/HelpDescriptor.java rename to Ghidra/Framework/Help/src/main/java/help/HelpDescriptor.java index 7d517b7282..93ea38bb69 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/HelpDescriptor.java +++ b/Ghidra/Framework/Help/src/main/java/help/HelpDescriptor.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. @@ -14,18 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package docking.help; +package help; public interface HelpDescriptor { - + /** * Returns the object for which help locations are defined. This may be the implementor of * this interface or some other delegate object. + * @return the help object */ public Object getHelpObject(); - + /** - * Returns a descriptive String about the help object that this descriptor represents. + * Returns a descriptive String about the help object that this descriptor represents. + * @return the help info */ public String getHelpInfo(); } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/help/HelpService.java b/Ghidra/Framework/Help/src/main/java/help/HelpService.java similarity index 99% rename from Ghidra/Framework/Docking/src/main/java/docking/help/HelpService.java rename to Ghidra/Framework/Help/src/main/java/help/HelpService.java index 13faa88019..bdf2e643be 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/help/HelpService.java +++ b/Ghidra/Framework/Help/src/main/java/help/HelpService.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package docking.help; +package help; import java.awt.Component; import java.net.URL; diff --git a/Ghidra/Framework/Help/src/main/java/help/JavaHelpSetBuilder.java b/Ghidra/Framework/Help/src/main/java/help/JavaHelpSetBuilder.java index ef64829312..caf97ef9dd 100644 --- a/Ghidra/Framework/Help/src/main/java/help/JavaHelpSetBuilder.java +++ b/Ghidra/Framework/Help/src/main/java/help/JavaHelpSetBuilder.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,22 +15,14 @@ */ package help; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.nio.file.DirectoryStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Date; -import java.util.HashSet; -import java.util.Set; +import java.io.*; +import java.nio.file.*; +import java.util.*; public class JavaHelpSetBuilder { private static final String TAB = "\t"; - private static final Set searchFileNames = - new HashSet(Arrays.asList(new String[] { "DOCS", "DOCS.TAB", "OFFSETS", - "POSITIONS", "SCHEMA", "TMAP" })); + private static final Set searchFileNames = new HashSet(Arrays + .asList(new String[] { "DOCS", "DOCS.TAB", "OFFSETS", "POSITIONS", "SCHEMA", "TMAP" })); private static int indentionLevel; private final String moduleName; @@ -97,7 +88,7 @@ public class JavaHelpSetBuilder { indentionLevel++; writeLine("TOC", writer); writeLine("", writer); - writeLine("docking.help.CustomTOCView", writer); + writeLine("" + CustomTOCView.class.getName() + "", writer); writeLine("" + helpSetTOCFile.getFileName() + "", writer); indentionLevel--; @@ -116,7 +107,7 @@ public class JavaHelpSetBuilder { writeLine("Search", writer); writeLine("", writer); // writeLine("javax.help.SearchView", writer); - writeLine("docking.help.CustomSearchView", writer); + writeLine("" + CustomSearchView.class.getName() + "", writer); if (hasIndexerFiles(helpSearchDirectory)) { writeLine("" + @@ -148,7 +139,7 @@ public class JavaHelpSetBuilder { // writeLine( "", writer ); // writeLine( "javax.help.FavoritesView", writer ); writeLine("", writer); - writeLine("docking.help.CustomFavoritesView", writer); + writeLine("" + CustomFavoritesView.class.getName() + "", writer); indentionLevel--; writeLine("", writer); @@ -158,8 +149,8 @@ public class JavaHelpSetBuilder { throws IOException { writer.write(""); writer.newLine(); - writer.write(""); + writer.write(""); writer.newLine(); writer.newLine(); diff --git a/Ghidra/Framework/Help/src/main/java/help/validator/location/HelpModuleCollection.java b/Ghidra/Framework/Help/src/main/java/help/validator/location/HelpModuleCollection.java index a6d5c05057..d1cfbaaed9 100644 --- a/Ghidra/Framework/Help/src/main/java/help/validator/location/HelpModuleCollection.java +++ b/Ghidra/Framework/Help/src/main/java/help/validator/location/HelpModuleCollection.java @@ -26,9 +26,9 @@ import javax.help.Map.ID; import javax.help.TOCView; import javax.swing.tree.DefaultMutableTreeNode; -import docking.help.CustomTOCView.CustomTreeItemDecorator; import help.HelpBuildUtils; import help.TOCItemProvider; +import help.CustomTOCView.CustomTreeItemDecorator; import help.validator.model.*; /** diff --git a/Ghidra/Framework/Help/src/main/java/help/validator/location/JarHelpModuleLocation.java b/Ghidra/Framework/Help/src/main/java/help/validator/location/JarHelpModuleLocation.java index 7827499dea..9aa875dbac 100644 --- a/Ghidra/Framework/Help/src/main/java/help/validator/location/JarHelpModuleLocation.java +++ b/Ghidra/Framework/Help/src/main/java/help/validator/location/JarHelpModuleLocation.java @@ -26,8 +26,8 @@ import java.util.regex.Pattern; import javax.help.HelpSet; import javax.help.HelpSetException; -import docking.help.GHelpSet; import ghidra.util.exception.AssertException; +import help.GHelpSet; import help.validator.model.GhidraTOCFile; public class JarHelpModuleLocation extends HelpModuleLocation { diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/FrontEndTool.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/FrontEndTool.java index e69a7696da..2afa2f2b59 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/FrontEndTool.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/FrontEndTool.java @@ -37,8 +37,6 @@ import db.buffers.DataBuffer; import docking.*; import docking.action.DockingAction; import docking.action.MenuData; -import docking.help.Help; -import docking.help.HelpService; import docking.tool.ToolConstants; import docking.util.AnimationUtils; import docking.util.image.ToolIconURL; @@ -77,6 +75,8 @@ import ghidra.util.exception.VersionException; import ghidra.util.task.*; import ghidra.util.xml.GenericXMLOutputter; import ghidra.util.xml.XmlUtilities; +import help.Help; +import help.HelpService; /** * Tool that serves as the the Ghidra Project Window. Only those plugins that 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 2a74043fbc..bd339a3e40 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 @@ -25,14 +25,14 @@ import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; import docking.StatusBarSpacer; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.EmptyBorderButton; import docking.widgets.label.GDLabel; import ghidra.util.HelpLocation; import ghidra.util.Msg; import ghidra.util.layout.HorizontalLayout; import ghidra.util.task.BufferedSwingRunner; +import help.Help; +import help.HelpService; import log.LogListener; import log.LogPanelAppender; import resources.ResourceManager; diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectDataPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectDataPanel.java index 1266652123..6c6b795d3b 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectDataPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/ProjectDataPanel.java @@ -26,8 +26,6 @@ import javax.swing.*; import docking.ActionContext; import docking.ComponentProvider; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.tabbedpane.DockingTabRenderer; import ghidra.framework.main.datatable.ProjectDataTablePanel; import ghidra.framework.main.datatree.ProjectDataTreePanel; @@ -35,6 +33,8 @@ import ghidra.framework.model.*; import ghidra.framework.options.SaveState; import ghidra.util.HelpLocation; import ghidra.util.Msg; +import help.Help; +import help.HelpService; /** * Manages the data tree for the active project, and the trees for the 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 2b7dc12fe7..87e0cf7a16 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 @@ -26,8 +26,6 @@ import javax.swing.*; import javax.swing.border.BevelBorder; import docking.DialogComponentProvider; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.OptionDialog; import docking.widgets.label.GDLabel; import docking.widgets.label.GLabel; @@ -45,6 +43,8 @@ import ghidra.util.exception.CancelledException; import ghidra.util.layout.PairLayout; import ghidra.util.layout.VerticalLayout; import ghidra.util.task.*; +import help.Help; +import help.HelpService; import resources.ResourceManager; /** 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 1fb96282cc..38e5b42790 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 @@ -29,8 +29,6 @@ import org.jdesktop.animation.timing.TimingTargetAdapter; import docking.DockingWindowManager; import docking.dnd.*; -import docking.help.Help; -import docking.help.HelpService; import docking.tool.ToolConstants; import docking.util.image.ToolIconURL; import docking.widgets.EmptyBorderButton; @@ -40,6 +38,8 @@ import ghidra.framework.plugintool.PluginTool; import ghidra.util.*; import ghidra.util.bean.GGlassPane; import ghidra.util.exception.AssertException; +import help.Help; +import help.HelpService; /** * Component that is a drop target for a DataTreeTransferable object. 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 774b5049e9..f4c0ee02ab 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,8 +23,6 @@ import java.util.HashMap; import javax.swing.*; import javax.swing.border.Border; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.combobox.GComboBox; import docking.widgets.dialogs.InputDialog; import ghidra.framework.model.*; @@ -32,6 +30,8 @@ import ghidra.framework.plugintool.PluginTool; import ghidra.util.HelpLocation; import ghidra.util.Msg; import ghidra.util.exception.DuplicateNameException; +import help.Help; +import help.HelpService; class WorkspacePanel extends JPanel implements WorkspaceChangeListener { private final static long serialVersionUID = 1L; 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 d9333dcee4..559ea7631f 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,6 @@ import javax.swing.*; import docking.ActionContext; import docking.ComponentProvider; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.label.GHtmlLabel; import docking.widgets.table.*; import docking.widgets.table.threaded.*; @@ -36,6 +34,8 @@ import ghidra.framework.plugintool.PluginTool; import ghidra.util.*; import ghidra.util.bean.GGlassPane; import ghidra.util.bean.GGlassPanePainter; +import help.Help; +import help.HelpService; public class ProjectDataTablePanel extends JPanel { diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java index 7671fafffc..77aebb4327 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/ProjectDataTreePanel.java @@ -27,8 +27,6 @@ import javax.swing.tree.TreeSelectionModel; import docking.ActionContext; import docking.ComponentProvider; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.tree.GTreeNode; import docking.widgets.tree.support.GTreeSelectionListener; import ghidra.framework.main.FrontEndPlugin; @@ -36,6 +34,8 @@ import ghidra.framework.main.FrontEndTool; import ghidra.framework.model.*; import ghidra.framework.plugintool.PluginTool; import ghidra.util.HelpLocation; +import help.Help; +import help.HelpService; /** * Panel that contains a DataTree for showing project data. diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java index 8e94e0f681..6066598315 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java @@ -37,8 +37,6 @@ import docking.actions.PopupActionProvider; import docking.actions.ToolActions; import docking.framework.AboutDialog; import docking.framework.ApplicationInformationDisplayFactory; -import docking.help.Help; -import docking.help.HelpService; import docking.tool.ToolConstants; import docking.tool.util.DockingToolConstants; import docking.util.image.ToolIconURL; @@ -57,6 +55,8 @@ import ghidra.framework.plugintool.util.*; import ghidra.framework.project.ProjectDataService; import ghidra.util.*; import ghidra.util.task.*; +import help.Help; +import help.HelpService; /** * Base class that is a container to manage plugins and their actions, and to coordinate the diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ExtensionTablePanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ExtensionTablePanel.java index da59db975d..ea7daacfdc 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ExtensionTablePanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/dialog/ExtensionTablePanel.java @@ -23,12 +23,12 @@ import java.util.Set; import javax.swing.*; import javax.swing.table.TableColumn; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.table.*; import ghidra.app.util.GenericHelpTopics; import ghidra.framework.plugintool.PluginTool; import ghidra.util.HelpLocation; +import help.Help; +import help.HelpService; /** * Container for the {@link GTable} that displays ghidra extensions. 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 22293fc04b..93224434db 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 @@ -32,8 +32,6 @@ import docking.KeyEntryTextField; import docking.action.DockingActionIf; import docking.action.KeyBindingData; import docking.actions.KeyBindingUtils; -import docking.help.Help; -import docking.help.HelpService; import docking.tool.util.DockingToolConstants; import docking.widgets.*; import docking.widgets.label.GIconLabel; @@ -45,6 +43,8 @@ import ghidra.util.*; import ghidra.util.exception.AssertException; import ghidra.util.layout.PairLayout; import ghidra.util.layout.VerticalLayout; +import help.Help; +import help.HelpService; import resources.Icons; import resources.ResourceManager; 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 1c81c082d1..2847172ba2 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 @@ -22,14 +22,14 @@ import javax.swing.*; import javax.swing.table.TableColumn; import docking.DialogComponentProvider; -import docking.help.Help; -import docking.help.HelpService; import docking.widgets.table.*; import ghidra.app.util.GenericHelpTopics; import ghidra.framework.plugintool.PluginConfigurationModel; import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.util.PluginDescription; import ghidra.util.HelpLocation; +import help.Help; +import help.HelpService; /** * Dialog that displays plugins in a tabular format, allowing users to install or uninstall them. The