<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>