Skip to content
Closed

Pr 1038 #1039

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public class WindowManager implements Service {
public static final String WIN_CONFIG = "config";
public static final String WIN_INFO = "system-information";
public static final String WIN_SCRIPTS = "script-manager";
public static final String WIN_PLUGINS = "plugin-manager";
public static final String WIN_MAP_PROGRESS = "mapping-progress";
public static final String WIN_QUICK_NAV = "quick-nav";
// Manager instance data
Expand Down Expand Up @@ -230,6 +231,14 @@ public Stage getScriptManagerWindow() {
return Objects.requireNonNull(getWindow(WIN_SCRIPTS));
}

/**
* @return Window for the plugin manager display.
*/
@Nonnull
public Stage getPluginManagerWindow() {
return Objects.requireNonNull(getWindow(WIN_PLUGINS));
}

/**
* @return Window for the current mapping preview display.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public class MainMenu extends MenuBar {
private final MappingMenu mappingMenu;
private final AnalysisMenu analysisMenu;
private final ScriptMenu scriptMenu;
private final PluginMenu pluginMenu;
private final HelpMenu helpMenu;

/**
Expand All @@ -36,6 +37,8 @@ public class MainMenu extends MenuBar {
* Analysis menu instance.
* @param scriptMenu
* Script menu instance.
* @param pluginMenu
* Plugin menu instance.
* @param helpMenu
* Help menu instance.
*/
Expand All @@ -45,16 +48,18 @@ public class MainMenu extends MenuBar {
@Nonnull MappingMenu mappingMenu,
@Nonnull AnalysisMenu analysisMenu,
@Nonnull ScriptMenu scriptMenu,
@Nonnull PluginMenu pluginMenu,
@Nonnull HelpMenu helpMenu) {
this.fileMenu = fileMenu;
this.configMenu = configMenu;
this.searchMenu = searchMenu;
this.mappingMenu = mappingMenu;
this.analysisMenu = analysisMenu;
this.scriptMenu = scriptMenu;
this.pluginMenu = pluginMenu;
this.helpMenu = helpMenu;

getMenus().addAll(fileMenu, configMenu, searchMenu, mappingMenu, analysisMenu, scriptMenu, helpMenu);
getMenus().addAll(fileMenu, configMenu, searchMenu, mappingMenu, analysisMenu, scriptMenu, pluginMenu, helpMenu);
setPadding(new Insets(0, 0, 2, 0));
}

Expand Down Expand Up @@ -94,6 +99,12 @@ public ScriptMenu getScriptMenu() {
return scriptMenu;
}

/** @return Plugin menu instance. */
@Nonnull
public PluginMenu getPluginMenu() {
return pluginMenu;
}

/** @return Help menu instance. */
@Nonnull
public HelpMenu getHelpMenu() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@ public MainMenuProvider(@Nonnull FileMenu fileMenu,
@Nonnull MappingMenu mappingMenu,
@Nonnull AnalysisMenu analysisMenu,
@Nonnull ScriptMenu scriptMenu,
@Nonnull PluginMenu pluginMenu,
@Nonnull HelpMenu helpMenu) {
this.mainMenu = new MainMenu(fileMenu, configMenu, searchMenu, mappingMenu, analysisMenu, scriptMenu, helpMenu);
this.mainMenu = new MainMenu(fileMenu, configMenu, searchMenu, mappingMenu, analysisMenu, scriptMenu, pluginMenu, helpMenu);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package software.coley.recaf.ui.menubar;

import jakarta.annotation.Nonnull;
import jakarta.enterprise.context.Dependent;
import jakarta.inject.Inject;
import javafx.scene.control.Menu;
import javafx.stage.Stage;
import org.kordamp.ikonli.carbonicons.CarbonIcons;
import org.slf4j.Logger;
import software.coley.recaf.analytics.logging.Logging;
import software.coley.recaf.services.window.WindowManager;
import software.coley.recaf.ui.control.FontIconView;
import software.coley.recaf.ui.pane.PluginManagerPane;
import software.coley.recaf.util.DesktopUtil;

import java.net.URI;

import static software.coley.recaf.util.Lang.getBinding;
import static software.coley.recaf.util.Menus.action;

/**
* Plugin menu component for {@link MainMenu}.
*
* @author Canrad
* @see PluginManagerPane The manager display this menu links to.
*/
@Dependent
public class PluginMenu extends Menu {
private static final Logger logger = Logging.get(PluginMenu.class);
private final WindowManager windowManager;

@Inject
public PluginMenu(@Nonnull WindowManager windowManager) {
this.windowManager = windowManager;

textProperty().bind(getBinding("menu.plugin"));
setGraphic(new FontIconView(CarbonIcons.PLUG));

// Browsing the plugin directory lives inside the manager panel, so the menu only opens the panel + doc links.
getItems().add(action("menu.plugin.manage", CarbonIcons.SETTINGS_ADJUST, this::openManager));
getItems().add(action("menu.plugin.devguide", CarbonIcons.NOTEBOOK_REFERENCE, this::openDevGuide));
getItems().add(action("menu.plugin.template", CarbonIcons.LOGO_GITHUB, this::openTemplate));
}

/**
* Display the plugin manager window.
*/
private void openManager() {
Stage pluginWindow = windowManager.getPluginManagerWindow();
pluginWindow.show();
pluginWindow.requestFocus();
}

/**
* Opens the online plugin development guide.
*/
private void openDevGuide() {
browseUrl(PluginManagerPane.URL_DEV_GUIDE);
}

/**
* Opens the template workspace for starting a new plugin project.
*/
private void openTemplate() {
browseUrl(PluginManagerPane.URL_TEMPLATE_WORKSPACE);
}

private static void browseUrl(@Nonnull String uri) {
try {
DesktopUtil.showDocument(new URI(uri));
} catch (Exception ex) {
logger.error("Failed to open link: {}", uri, ex);
}
}
}
Loading
Loading