Skip to content

Commit

Permalink
Add class info button to bottom right
Browse files Browse the repository at this point in the history
  • Loading branch information
Col-E committed Aug 12, 2023
1 parent b6218d1 commit 49c9bbc
Show file tree
Hide file tree
Showing 6 changed files with 193 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package software.coley.recaf.ui.pane.editing;

import atlantafx.base.controls.Popover;
import atlantafx.base.theme.Styles;
import jakarta.annotation.Nonnull;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.control.Button;
import org.kordamp.ikonli.carbonicons.CarbonIcons;
import software.coley.recaf.info.ClassInfo;
import software.coley.recaf.path.ClassPathNode;
import software.coley.recaf.services.navigation.ClassNavigable;
import software.coley.recaf.ui.control.FontIconView;
import software.coley.recaf.ui.control.richtext.Editor;

/**
* Overlay component for {@link Editor} that allows quick display of class information.
*
* @author Matt Coley
*/
public abstract class AbstractClassInfoProvider<T extends ClassInfo> extends Button {
private final ClassNavigable classProvider;

/**
* @param toolsContainer
* Container to house tool buttons for display in the {@link Editor}.
* @param classProvider
* The provider of the latest class info.
*/
public AbstractClassInfoProvider(@Nonnull ToolsContainerComponent toolsContainer, @Nonnull ClassNavigable classProvider) {
this.classProvider = classProvider;
setGraphic(new FontIconView(CarbonIcons.INFORMATION));
getStyleClass().addAll(Styles.BUTTON_ICON, Styles.ACCENT, Styles.FLAT);
setOnAction(this::showClassInfoPopover);
toolsContainer.add(this);
}

@SuppressWarnings("unchecked")
private void showClassInfoPopover(ActionEvent e) {
ClassPathNode path = classProvider.getPath();
ClassInfo info = path.getValue();
Popover popover = new Popover(createInfoContent((T) info));
popover.setArrowLocation(Popover.ArrowLocation.BOTTOM_RIGHT);
popover.show(this);
}

@Nonnull
protected abstract Node createInfoContent(@Nonnull T info);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package software.coley.recaf.ui.pane.editing.android;

import atlantafx.base.theme.Styles;
import jakarta.annotation.Nonnull;
import javafx.geometry.HPos;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import software.coley.recaf.info.AndroidClassInfo;
import software.coley.recaf.info.JvmClassInfo;
import software.coley.recaf.services.navigation.ClassNavigable;
import software.coley.recaf.ui.control.BoundLabel;
import software.coley.recaf.ui.control.richtext.Editor;
import software.coley.recaf.ui.pane.editing.AbstractClassInfoProvider;
import software.coley.recaf.ui.pane.editing.ToolsContainerComponent;
import software.coley.recaf.util.Lang;

import java.util.Objects;

/**
* Overlay component for {@link Editor} that allows quick display of Android class information.
*
* @author Matt Coley
*/
public class AndroidClassInfoProvider extends AbstractClassInfoProvider<AndroidClassInfo> {
/**
* @param toolsContainer
* Container to house tool buttons for display in the {@link Editor}.
* @param classProvider
* The provider of the latest class info.
*/
public AndroidClassInfoProvider(@Nonnull ToolsContainerComponent toolsContainer, @Nonnull ClassNavigable classProvider) {
super(toolsContainer, classProvider);
}

@Nonnull
@Override
protected Node createInfoContent(@Nonnull AndroidClassInfo info) {
GridPane content = new GridPane();
ColumnConstraints col1 = new ColumnConstraints();
ColumnConstraints col2 = new ColumnConstraints();
col2.setFillWidth(true);
col2.setHgrow(Priority.ALWAYS);
col2.setHalignment(HPos.RIGHT);
content.getColumnConstraints().addAll(col1, col2);
content.setHgap(10);
content.setVgap(5);

Label titleLabel = new BoundLabel(Lang.getBinding("java.info"));
titleLabel.getStyleClass().addAll(Styles.TEXT_UNDERLINED, Styles.TITLE_4);

Label sourceLabel = new BoundLabel(Lang.getBinding("java.info.sourcefile"));
sourceLabel.getStyleClass().addAll(Styles.TEXT_BOLD);

Label sourceValueLabel = new Label(Objects.requireNonNullElse(info.getSourceFileName(), ""));

int row = 0;
content.add(titleLabel, 0, row++, 2, 1);

content.add(sourceLabel, 0, row);
content.add(sourceValueLabel, 1, row++);

return content;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public AndroidDecompilerPane(@Nonnull DecompilerPaneConfig config,

// Install tools container with configurator
new AndroidDecompilerPaneConfigurator(toolsContainer, config, decompiler, decompilerManager);
new AndroidClassInfoProvider(toolsContainer, this);
toolsContainer.install(editor);

// Setup keybindings
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package software.coley.recaf.ui.pane.editing.jvm;

import atlantafx.base.theme.Styles;
import jakarta.annotation.Nonnull;
import javafx.geometry.HPos;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import software.coley.recaf.info.JvmClassInfo;
import software.coley.recaf.services.navigation.ClassNavigable;
import software.coley.recaf.ui.control.BoundLabel;
import software.coley.recaf.ui.control.richtext.Editor;
import software.coley.recaf.ui.pane.editing.AbstractClassInfoProvider;
import software.coley.recaf.ui.pane.editing.ToolsContainerComponent;
import software.coley.recaf.util.Lang;

import java.util.Objects;

/**
* Overlay component for {@link Editor} that allows quick display of JVM class information.
*
* @author Matt Coley
*/
public class JvmClassInfoProvider extends AbstractClassInfoProvider<JvmClassInfo> {
/**
* @param toolsContainer
* Container to house tool buttons for display in the {@link Editor}.
* @param classProvider
* The provider of the latest class info.
*/
public JvmClassInfoProvider(@Nonnull ToolsContainerComponent toolsContainer, @Nonnull ClassNavigable classProvider) {
super(toolsContainer, classProvider);
}

@Nonnull
@Override
protected Node createInfoContent(@Nonnull JvmClassInfo info) {
GridPane content = new GridPane();
ColumnConstraints col1 = new ColumnConstraints();
ColumnConstraints col2 = new ColumnConstraints();
col2.setFillWidth(true);
col2.setHgrow(Priority.ALWAYS);
col2.setHalignment(HPos.RIGHT);
content.getColumnConstraints().addAll(col1, col2);
content.setHgap(10);
content.setVgap(5);

Label titleLabel = new BoundLabel(Lang.getBinding("java.info"));
titleLabel.getStyleClass().addAll(Styles.TEXT_UNDERLINED, Styles.TITLE_4);

Label versionLabel = new BoundLabel(Lang.getBinding("java.info.version"));
Label sourceLabel = new BoundLabel(Lang.getBinding("java.info.sourcefile"));
versionLabel.getStyleClass().addAll(Styles.TEXT_BOLD);
sourceLabel.getStyleClass().addAll(Styles.TEXT_BOLD);

Label versionValueLabel = new Label(String.valueOf(info.getVersion()));
Label sourceValueLabel = new Label(Objects.requireNonNullElse(info.getSourceFileName(), ""));

int row = 0;
content.add(titleLabel, 0, row++, 2, 1);

content.add(versionLabel, 0, row);
content.add(versionValueLabel, 1, row++);

content.add(sourceLabel, 0, row);
content.add(sourceValueLabel, 1, row++);

return content;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ public JvmDecompilerPane(@Nonnull DecompilerPaneConfig config,

// Install tools container with configurator
new JvmDecompilerPaneConfigurator(toolsContainer, config, decompiler, javacTarget, javacDownsampleTarget, javacDebug, decompilerManager);
new JvmClassInfoProvider(toolsContainer, this);
toolsContainer.install(editor);

// Setup keybindings
Expand Down
3 changes: 3 additions & 0 deletions recaf-ui/src/main/resources/translations/en_US.lang
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,9 @@ java.targetversion.auto=Match class file version
java.targetdownsampleversion=Downsample target version
java.targetdownsampleversion.disabled=Disabled
java.targetdebug=Compile with debug info
java.info=Class information
java.info.version=Class version
java.info.sourcefile=Source file name

## Search bar
find.replace=Replace
Expand Down

0 comments on commit 49c9bbc

Please sign in to comment.