Files
jadx/jadx-gui/src/main/java/jadx/gui/ui/graphs/GraphDialog.java
T

171 lines
4.8 KiB
Java

package jadx.gui.ui.graphs;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import jadx.core.utils.ListUtils;
import jadx.gui.ui.MainWindow;
import jadx.gui.ui.filedialog.FileDialogWrapper;
import jadx.gui.ui.filedialog.FileOpenMode;
import jadx.gui.utils.NLS;
import jadx.gui.utils.UiUtils;
import jadx.gui.utils.layout.WrapLayout;
import jadx.gui.utils.ui.MouseListenerAdapter;
public abstract class GraphDialog extends JFrame {
private static final long serialVersionUID = 5840390965763493590L;
private static final Logger LOG = LoggerFactory.getLogger(GraphDialog.class);
private static final Dimension MIN_WINDOW_SIZE = new Dimension(800, 500);
private final MainWindow mainWindow;
private final GraphPanel panel;
private JMenuBar menuBar = null;
public static JTextArea graphError(String errorMessage) {
JTextArea errorText = new JTextArea();
errorText.setText(errorMessage);
errorText.setVisible(true);
errorText.setEditable(false);
errorText.setLineWrap(false);
return errorText;
}
public static JTextArea graphError(Exception error) {
JTextArea errorText = new JTextArea();
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
stringWriter.write(NLS.str("graph_viewer.default_error"));
stringWriter.write(": ");
error.printStackTrace(printWriter);
errorText.setText(stringWriter.toString());
errorText.setVisible(true);
errorText.setEditable(false);
errorText.setLineWrap(false);
return errorText;
}
protected GraphDialog(MainWindow mainWindow) {
this(mainWindow, NLS.str("graph_viewer.default_title"));
}
public GraphDialog(MainWindow mainWindow, String title) {
super(title);
this.mainWindow = mainWindow;
setMinimumSize(MIN_WINDOW_SIZE);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
UiUtils.addEscapeShortCutToDispose(this);
setLocationRelativeTo(null);
loadWindowPos();
panel = new GraphPanel(this);
panel.setFocusable(true);
panel.addMouseListener(new MouseListenerAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
requestFocusInWindow();
}
});
setLayout(new BorderLayout());
add(panel, BorderLayout.CENTER);
}
public JMenuBar addMenuBar() {
JMenuBar menuBar = new JMenuBar();
menuBar.setLayout(new WrapLayout(FlowLayout.LEFT));
add(menuBar, BorderLayout.PAGE_START);
this.menuBar = menuBar;
JButton saveButton = new JButton(NLS.str("graph_viewer.save_graph"));
saveButton.setEnabled(false);
saveButton.addActionListener(e -> {
try {
FileDialogWrapper fileDialog = new FileDialogWrapper(mainWindow, FileOpenMode.CUSTOM_SAVE);
fileDialog.setTitle(NLS.str("graph_viewer.save_graph"));
fileDialog.setFileExtList(Collections.singletonList("svg"));
fileDialog.setSelectionMode(JFileChooser.FILES_ONLY);
List<Path> savePaths = fileDialog.show();
if (!savePaths.isEmpty()) {
File saveFile = ListUtils.first(savePaths).toFile();
getPanel().exportSVG(saveFile);
}
} catch (Exception ex) {
LOG.error("Failed to save file: ", ex);
JOptionPane.showMessageDialog(this, NLS.str("graph_viewer.file_failure"),
NLS.str("graph_viewer.file_failure"),
JOptionPane.INFORMATION_MESSAGE);
}
});
JPanel menuBarPanel = new JPanel();
menuBarPanel.setOpaque(false);
menuBarPanel.add(saveButton);
menuBar.add(menuBarPanel);
return menuBar;
}
protected void enableMenu() {
JMenuBar menu = this.menuBar;
setAllEnabled(true, menu);
}
protected void disableMenu() {
JMenuBar menu = this.menuBar;
setAllEnabled(false, menu);
}
private void setAllEnabled(boolean isEnabled, JComponent component) {
component.setEnabled(isEnabled);
Component[] components = component.getComponents();
for (Component subComponent : components) {
if (subComponent instanceof JComponent) {
setAllEnabled(isEnabled, (JComponent) subComponent);
} else {
subComponent.setEnabled(isEnabled);
}
}
}
public void loadWindowPos() {
if (!mainWindow.getSettings().loadWindowPos(this)) {
setPreferredSize(MIN_WINDOW_SIZE);
}
}
@Override
public void dispose() {
try {
mainWindow.getSettings().saveWindowPos(this);
} catch (Exception e) {
LOG.warn("Failed to save window size and position", e);
}
super.dispose();
}
protected GraphPanel getPanel() {
return this.panel;
}
}