Skip to content

Commit

Permalink
ghidra: add variant to enable native file picker and menubar
Browse files Browse the repository at this point in the history
  • Loading branch information
crowell committed Oct 10, 2024
1 parent 4d721f2 commit ba4740f
Show file tree
Hide file tree
Showing 3 changed files with 175 additions and 0 deletions.
10 changes: 10 additions & 0 deletions devel/ghidra/Portfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ PortGroup java 1.0
PortGroup app 1.0

github.setup NationalSecurityAgency ghidra 11.2 Ghidra_ _build
revision 1
checksums rmd160 570f95ba37cae4180b815bc968dab1497803c005 \
sha256 1b893066b55ae58e2f7ca006b4665a2604f47ddbf5de4498f77e2673a1e84105 \
size 70354834
Expand Down Expand Up @@ -33,6 +34,12 @@ build.env-append _JAVA_OPTIONS=-Duser.home=${worksrcpath}
build.cmd gradle
build.target buildGhidra

variant nativefilepicker description {Enable native file picker widget} { }
variant nativemenubar description {Enable native macOS menu bar} {
patchfiles-append launch.properties.diff
}
default_variants +nativefilepicker +nativemenubar

set ghidra_copy_list \
[list \
Extensions \
Expand All @@ -52,6 +59,9 @@ destroot {
foreach item ${ghidra_copy_list} {
copy ${worksrcpath}/ghbuild/ghidra_${version}_DEV/${item} ${destroot}${javadest}/
}
if {[variant_isset nativefilepicker]} {
system "javac -d ${destroot}${javadest}/Ghidra/patch/ -cp \"\$(find ${destroot}${javadest}/ | egrep '.jar\$' | tr '\n' ':')\" ${filespath}/docking/widgets/filechooser/GhidraFileChooser.java"
}
}

# app settings
Expand Down
154 changes: 154 additions & 0 deletions devel/ghidra/files/docking/widgets/filechooser/GhidraFileChooser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
package docking.widgets.filechooser;

import docking.DialogComponentProvider;
import ghidra.util.filechooser.GhidraFileChooserModel;
import ghidra.util.filechooser.GhidraFileFilter;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.FileDialog;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class GhidraFileChooser extends DialogComponentProvider {
private GhidraFileChooserModel model;
private GhidraFileFilter filter;
private FileDialog fileDialog;
private int mode = FILES_AND_DIRECTORIES;

public static final int FILES_ONLY = 0;
public static final int DIRECTORIES_ONLY = 1;
public static final int FILES_AND_DIRECTORIES = 2;

public GhidraFileChooser(Component parent) {
this(new LocalFileChooserModel(), parent);
}

GhidraFileChooser(GhidraFileChooserModel model, Component parent) {
super("File Chooser", true, true, true, false);
this.model = model;
Component root = SwingUtilities.getRoot(parent);
if (root instanceof Dialog) {
fileDialog = new FileDialog((Dialog)root);
} else {
fileDialog = new FileDialog((JFrame)root);
}
}

public void setShowDetails(boolean showDetails) {
}

public void setFileSelectionMode(int mode) {
this.mode = mode;
}

public void setFileSelectionMode(GhidraFileChooserMode mode) {
switch (mode) {
case FILES_ONLY:
this.mode = 0;
break;
case DIRECTORIES_ONLY:
this.mode = 1;
break;
case FILES_AND_DIRECTORIES:
this.mode = 2;
break;
}
}

public boolean isMultiSelectionEnabled() {
return fileDialog.isMultipleMode();
}

public void setMultiSelectionEnabled(boolean b) {
fileDialog.setMultipleMode(b);
}

public void setApproveButtonText(String buttonText) {
}

public void setApproveButtonToolTipText(String tooltipText) {
}

public void setLastDirectoryPreference(String newKey) {
}

public File getSelectedFile() {
show();
String path = fileDialog.getFile();
return path != null ? new File(fileDialog.getDirectory(), path) : null;
}

public List<File> getSelectedFiles() {
show();
return Arrays.asList(fileDialog.getFiles());
}

public File getSelectedFile(boolean show) {
return getSelectedFile();
}

public void setSelectedFile(File file) {
fileDialog.setFile(file != null ? file.getPath() : null);
}

public void show() {
fileDialog.setVisible(true);
}

public void close() {
fileDialog.setVisible(false);
}

public File getCurrentDirectory() {
return new File(fileDialog.getDirectory());
}

public void setCurrentDirectory(File directory) {
fileDialog.setDirectory(directory.getPath());
}

public void rescanCurrentDirectory() {
}

private class _FilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
File file = new File(dir, name);
switch (mode) {
case DIRECTORIES_ONLY:
if (file.isFile()) {
return false;
}
break;
case FILES_AND_DIRECTORIES:
default:
break;
}
return filter.accept(file, model);
}
}

public void addFileFilter(GhidraFileFilter f) {
}

public void setSelectedFileFilter(GhidraFileFilter filter) {
this.filter = filter;
}

public void setFileFilter(GhidraFileFilter filter) {
this.filter = filter;
}

public boolean wasCancelled() {
return fileDialog.getFile() == null;
}

@Override
public void setTitle(String title) {
fileDialog.setTitle(title);
}
}
11 changes: 11 additions & 0 deletions devel/ghidra/files/launch.properties.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--- Ghidra/RuntimeScripts/Common/support/launch.properties.orig 2024-10-10 13:05:57
+++ Ghidra/RuntimeScripts/Common/support/launch.properties 2024-10-10 13:06:13
@@ -71,7 +71,7 @@
VMARGS_MACOS=-Declipse.filelock.disable=true

# Where the menu bar is displayed on macOS
-VMARGS_MACOS=-Dapple.laf.useScreenMenuBar=false
+VMARGS_MACOS=-Dapple.laf.useScreenMenuBar=true

# Make the title bar adaptable to macOS theme
VMARGS_MACOS=-Dapple.awt.application.appearance=system

0 comments on commit ba4740f

Please sign in to comment.