<pre style='margin:0'>
Renee Otten (reneeotten) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/49b17b2376fb023dcec64f34a9fd5776787e846f">https://github.com/macports/macports-ports/commit/49b17b2376fb023dcec64f34a9fd5776787e846f</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 49b17b2376f ghidra: add variant to enable native file picker and menubar
</span>49b17b2376f is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 49b17b2376fb023dcec64f34a9fd5776787e846f
</span>Author: Jeffrey Crowell <jeff@crowell.biz>
AuthorDate: Thu Oct 10 13:43:21 2024 -0700
<span style='display:block; white-space:pre;color:#404040;'> ghidra: add variant to enable native file picker and menubar
</span>---
devel/ghidra/Portfile | 4 +
.../widgets/filechooser/GhidraFileChooser.java | 154 +++++++++++++++++++++
devel/ghidra/files/launch.properties.diff | 11 ++
3 files changed, 169 insertions(+)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/ghidra/Portfile b/devel/ghidra/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 88411d611d6..eec1cdf040f 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/devel/ghidra/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/ghidra/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -6,6 +6,7 @@ PortGroup java 1.0
</span> PortGroup app 1.0
github.setup NationalSecurityAgency ghidra 11.2 Ghidra_ _build
<span style='display:block; white-space:pre;background:#e0ffe0;'>+revision 1
</span> checksums rmd160 570f95ba37cae4180b815bc968dab1497803c005 \
sha256 1b893066b55ae58e2f7ca006b4665a2604f47ddbf5de4498f77e2673a1e84105 \
size 70354834
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -33,6 +34,8 @@ build.env-append _JAVA_OPTIONS=-Duser.home=${worksrcpath}
</span> build.cmd gradle
build.target buildGhidra
<span style='display:block; white-space:pre;background:#e0ffe0;'>+patchfiles launch.properties.diff
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> set ghidra_copy_list \
[list \
Extensions \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -52,6 +55,7 @@ destroot {
</span> foreach item ${ghidra_copy_list} {
copy ${worksrcpath}/ghbuild/ghidra_${version}_DEV/${item} ${destroot}${javadest}/
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ system "javac -d ${destroot}${javadest}/Ghidra/patch/ -cp \"\$(find ${destroot}${javadest}/ | egrep '.jar\$' | tr '\n' ':')\" ${filespath}/docking/widgets/filechooser/GhidraFileChooser.java"
</span> }
# app settings
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/ghidra/files/docking/widgets/filechooser/GhidraFileChooser.java b/devel/ghidra/files/docking/widgets/filechooser/GhidraFileChooser.java
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..1630588927b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/ghidra/files/docking/widgets/filechooser/GhidraFileChooser.java
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,154 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+package docking.widgets.filechooser;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import docking.DialogComponentProvider;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import ghidra.util.filechooser.GhidraFileChooserModel;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import ghidra.util.filechooser.GhidraFileFilter;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import java.awt.Component;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import java.awt.Dialog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import java.awt.FileDialog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import java.io.File;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import java.io.FilenameFilter;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import java.util.Arrays;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import java.util.List;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import javax.swing.JFrame;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+import javax.swing.SwingUtilities;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+public class GhidraFileChooser extends DialogComponentProvider {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ private GhidraFileChooserModel model;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ private GhidraFileFilter filter;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ private FileDialog fileDialog;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ private int mode = FILES_AND_DIRECTORIES;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public static final int FILES_ONLY = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public static final int DIRECTORIES_ONLY = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public static final int FILES_AND_DIRECTORIES = 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public GhidraFileChooser(Component parent) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ this(new LocalFileChooserModel(), parent);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ GhidraFileChooser(GhidraFileChooserModel model, Component parent) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ super("File Chooser", true, true, true, false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ this.model = model;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Component root = SwingUtilities.getRoot(parent);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (root instanceof Dialog) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fileDialog = new FileDialog((Dialog)root);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fileDialog = new FileDialog((JFrame)root);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setShowDetails(boolean showDetails) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setFileSelectionMode(int mode) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ this.mode = mode;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setFileSelectionMode(GhidraFileChooserMode mode) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch (mode) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case FILES_ONLY:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ this.mode = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case DIRECTORIES_ONLY:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ this.mode = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case FILES_AND_DIRECTORIES:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ this.mode = 2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public boolean isMultiSelectionEnabled() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return fileDialog.isMultipleMode();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setMultiSelectionEnabled(boolean b) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fileDialog.setMultipleMode(b);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setApproveButtonText(String buttonText) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setApproveButtonToolTipText(String tooltipText) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setLastDirectoryPreference(String newKey) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public File getSelectedFile() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ show();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ String path = fileDialog.getFile();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return path != null ? new File(fileDialog.getDirectory(), path) : null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public List<File> getSelectedFiles() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ show();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return Arrays.asList(fileDialog.getFiles());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public File getSelectedFile(boolean show) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return getSelectedFile();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setSelectedFile(File file) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fileDialog.setFile(file != null ? file.getPath() : null);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void show() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fileDialog.setVisible(true);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void close() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fileDialog.setVisible(false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public File getCurrentDirectory() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return new File(fileDialog.getDirectory());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setCurrentDirectory(File directory) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fileDialog.setDirectory(directory.getPath());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void rescanCurrentDirectory() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ private class _FilenameFilter implements FilenameFilter {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @Override
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public boolean accept(File dir, String name) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ File file = new File(dir, name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch (mode) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case DIRECTORIES_ONLY:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (file.isFile()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case FILES_AND_DIRECTORIES:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return filter.accept(file, model);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void addFileFilter(GhidraFileFilter f) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setSelectedFileFilter(GhidraFileFilter filter) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ this.filter = filter;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setFileFilter(GhidraFileFilter filter) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ this.filter = filter;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public boolean wasCancelled() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return fileDialog.getFile() == null;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ @Override
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ public void setTitle(String title) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fileDialog.setTitle(title);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/devel/ghidra/files/launch.properties.diff b/devel/ghidra/files/launch.properties.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..deddf368b1a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/devel/ghidra/files/launch.properties.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- Ghidra/RuntimeScripts/Common/support/launch.properties.orig 2024-10-10 13:05:57
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ Ghidra/RuntimeScripts/Common/support/launch.properties 2024-10-10 13:06:13
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -71,7 +71,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VMARGS_MACOS=-Declipse.filelock.disable=true
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Where the menu bar is displayed on macOS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-VMARGS_MACOS=-Dapple.laf.useScreenMenuBar=false
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++VMARGS_MACOS=-Dapple.laf.useScreenMenuBar=true
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Make the title bar adaptable to macOS theme
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ VMARGS_MACOS=-Dapple.awt.application.appearance=system
</span></pre><pre style='margin:0'>
</pre>