Search in sources :

Example 1 with JPackage

use of jadx.gui.treemodel.JPackage in project jadx by skylot.

the class JPackagePopupMenu method makeRenameMenuItem.

@Nullable
private JMenuItem makeRenameMenuItem(JPackage pkg) {
    List<String> aliasShortParts = splitPackage(pkg.getName());
    int count = aliasShortParts.size();
    if (count == 0) {
        return null;
    }
    String rawPackage = getRawPackage(pkg);
    if (rawPackage == null) {
        return null;
    }
    List<String> aliasParts = splitPackage(pkg.getFullName());
    // can be longer then alias parts
    List<String> rawParts = splitPackage(rawPackage);
    int start = aliasParts.size() - count;
    if (count == 1) {
        // single case => no submenu
        JPackage renamePkg = new JPackage(concat(rawParts, start), aliasParts.get(start));
        JMenuItem pkgItem = new JMenuItem(NLS.str("popup.rename"));
        pkgItem.addActionListener(e -> rename(renamePkg));
        return pkgItem;
    }
    JMenuItem renameSubMenu = new JMenu(NLS.str("popup.rename"));
    for (int i = start; i < aliasParts.size(); i++) {
        String aliasShortPkg = aliasParts.get(i);
        JPackage pkgPart = new JPackage(concat(rawParts, i), aliasShortPkg);
        JMenuItem pkgPartItem = new JMenuItem(aliasShortPkg);
        pkgPartItem.addActionListener(e -> rename(pkgPart));
        renameSubMenu.add(pkgPartItem);
    }
    return renameSubMenu;
}
Also used : JPackage(jadx.gui.treemodel.JPackage) JMenuItem(javax.swing.JMenuItem) JMenu(javax.swing.JMenu) Nullable(org.jetbrains.annotations.Nullable)

Example 2 with JPackage

use of jadx.gui.treemodel.JPackage in project jadx by skylot.

the class RenameDialog method refreshState.

private void refreshState() {
    RootNode rootNode = mainWindow.getWrapper().getDecompiler().getRoot();
    new RenameVisitor().init(rootNode);
    JNodeCache nodeCache = cache.getNodeCache();
    JavaNode javaNode = node.getJavaNode();
    List<JavaNode> toUpdate = new ArrayList<>();
    if (source != null && source != node) {
        toUpdate.add(source.getJavaNode());
    }
    if (javaNode != null) {
        toUpdate.add(javaNode);
        toUpdate.addAll(javaNode.getUseIn());
        if (node instanceof JMethod) {
            toUpdate.addAll(((JMethod) node).getJavaMethod().getOverrideRelatedMethods());
        }
    } else if (node instanceof JPackage) {
        processPackage(toUpdate);
    } else {
        throw new JadxRuntimeException("Unexpected node type: " + node);
    }
    Set<JClass> updatedTopClasses = toUpdate.stream().map(JavaNode::getTopParentClass).map(nodeCache::makeFrom).filter(Objects::nonNull).collect(Collectors.toSet());
    LOG.debug("Classes to update: {}", updatedTopClasses);
    refreshTabs(mainWindow.getTabbedPane(), updatedTopClasses);
    if (!updatedTopClasses.isEmpty()) {
        mainWindow.getBackgroundExecutor().execute("Refreshing", () -> refreshClasses(updatedTopClasses), (status) -> {
            if (status == TaskStatus.CANCEL_BY_MEMORY) {
                mainWindow.showHeapUsageBar();
                UiUtils.errorMessage(this, NLS.str("message.memoryLow"));
            }
            if (node instanceof JPackage) {
                mainWindow.getTreeRoot().update();
            }
            mainWindow.reloadTree();
        });
    }
}
Also used : RootNode(jadx.core.dex.nodes.RootNode) JClass(jadx.gui.treemodel.JClass) ArrayList(java.util.ArrayList) JPackage(jadx.gui.treemodel.JPackage) JadxRuntimeException(jadx.core.utils.exceptions.JadxRuntimeException) RenameVisitor(jadx.core.dex.visitors.rename.RenameVisitor) JNodeCache(jadx.gui.utils.JNodeCache) JMethod(jadx.gui.treemodel.JMethod) JavaNode(jadx.api.JavaNode)

Example 3 with JPackage

use of jadx.gui.treemodel.JPackage in project jadx by skylot.

the class RenameDialog method buildRename.

@NotNull
private JadxCodeRename buildRename(JNode node, String newName, Set<ICodeRename> renames) {
    if (node instanceof JMethod) {
        JavaMethod javaMethod = ((JMethod) node).getJavaMethod();
        List<JavaMethod> relatedMethods = javaMethod.getOverrideRelatedMethods();
        if (!relatedMethods.isEmpty()) {
            for (JavaMethod relatedMethod : relatedMethods) {
                renames.remove(new JadxCodeRename(JadxNodeRef.forMth(relatedMethod), ""));
            }
        }
        return new JadxCodeRename(JadxNodeRef.forMth(javaMethod), newName);
    }
    if (node instanceof JField) {
        return new JadxCodeRename(JadxNodeRef.forFld(((JField) node).getJavaField()), newName);
    }
    if (node instanceof JClass) {
        return new JadxCodeRename(JadxNodeRef.forCls(((JClass) node).getCls()), newName);
    }
    if (node instanceof JPackage) {
        return new JadxCodeRename(JadxNodeRef.forPkg(((JPackage) node).getFullName()), newName);
    }
    if (node instanceof JVariable) {
        JavaVariable javaVar = ((JVariable) node).getJavaVarNode();
        return new JadxCodeRename(JadxNodeRef.forMth(javaVar.getMth()), JadxCodeRef.forVar(javaVar), newName);
    }
    throw new JadxRuntimeException("Failed to build rename node for: " + node);
}
Also used : JVariable(jadx.gui.treemodel.JVariable) JField(jadx.gui.treemodel.JField) JavaVariable(jadx.api.JavaVariable) JClass(jadx.gui.treemodel.JClass) JPackage(jadx.gui.treemodel.JPackage) JavaMethod(jadx.api.JavaMethod) JadxRuntimeException(jadx.core.utils.exceptions.JadxRuntimeException) JMethod(jadx.gui.treemodel.JMethod) JadxCodeRename(jadx.api.data.impl.JadxCodeRename) NotNull(org.jetbrains.annotations.NotNull)

Example 4 with JPackage

use of jadx.gui.treemodel.JPackage in project jadx by skylot.

the class MainWindow method initUI.

private void initUI() {
    setMinimumSize(new Dimension(200, 150));
    mainPanel = new JPanel(new BorderLayout());
    splitPane = new JSplitPane();
    splitPane.setResizeWeight(SPLIT_PANE_RESIZE_WEIGHT);
    mainPanel.add(splitPane);
    DefaultMutableTreeNode treeRootNode = new DefaultMutableTreeNode(NLS.str("msg.open_file"));
    treeModel = new DefaultTreeModel(treeRootNode);
    tree = new JTree(treeModel);
    ToolTipManager.sharedInstance().registerComponent(tree);
    tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    tree.setFocusable(false);
    tree.addFocusListener(new FocusAdapter() {

        @Override
        public void focusLost(FocusEvent e) {
            tree.setFocusable(false);
        }
    });
    tree.addMouseListener(new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e)) {
                if (!nodeClickAction(getJNodeUnderMouse(e))) {
                    // click ignored -> switch to focusable mode
                    tree.setFocusable(true);
                    tree.requestFocus();
                }
            } else if (SwingUtilities.isRightMouseButton(e)) {
                treeRightClickAction(e);
            }
        }
    });
    tree.addKeyListener(new KeyAdapter() {

        @Override
        public void keyPressed(KeyEvent e) {
            if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                nodeClickAction(tree.getLastSelectedPathComponent());
            }
        }
    });
    tree.setCellRenderer(new DefaultTreeCellRenderer() {

        @Override
        public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean isLeaf, int row, boolean focused) {
            Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, isLeaf, row, focused);
            if (value instanceof JNode) {
                JNode jNode = (JNode) value;
                setText(jNode.makeStringHtml());
                setIcon(jNode.getIcon());
                setToolTipText(jNode.getTooltip());
            } else {
                setToolTipText(null);
            }
            if (value instanceof JPackage) {
                setEnabled(((JPackage) value).isEnabled());
            }
            return c;
        }
    });
    tree.addTreeWillExpandListener(new TreeWillExpandListener() {

        @Override
        public void treeWillExpand(TreeExpansionEvent event) {
            TreePath path = event.getPath();
            Object node = path.getLastPathComponent();
            if (node instanceof JLoadableNode) {
                ((JLoadableNode) node).loadNode();
            }
            if (!treeReloading) {
                project.addTreeExpansion(getPathExpansion(event.getPath()));
                update();
            }
        }

        @Override
        public void treeWillCollapse(TreeExpansionEvent event) {
            if (!treeReloading) {
                project.removeTreeExpansion(getPathExpansion(event.getPath()));
                update();
            }
        }
    });
    progressPane = new ProgressPanel(this, true);
    IssuesPanel issuesPanel = new IssuesPanel(this);
    JPanel leftPane = new JPanel(new BorderLayout());
    JScrollPane treeScrollPane = new JScrollPane(tree);
    treeScrollPane.setMinimumSize(new Dimension(100, 150));
    JPanel bottomPane = new JPanel(new BorderLayout());
    bottomPane.add(issuesPanel, BorderLayout.PAGE_START);
    bottomPane.add(progressPane, BorderLayout.PAGE_END);
    leftPane.add(treeScrollPane, BorderLayout.CENTER);
    leftPane.add(bottomPane, BorderLayout.PAGE_END);
    splitPane.setLeftComponent(leftPane);
    tabbedPane = new TabbedPane(this);
    tabbedPane.setMinimumSize(new Dimension(150, 150));
    splitPane.setRightComponent(tabbedPane);
    new DropTarget(this, DnDConstants.ACTION_COPY, new MainDropTarget(this));
    heapUsageBar = new HeapUsageBar();
    mainPanel.add(heapUsageBar, BorderLayout.SOUTH);
    verticalSplitter = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
    verticalSplitter.setTopComponent(splitPane);
    verticalSplitter.setResizeWeight(SPLIT_PANE_RESIZE_WEIGHT);
    mainPanel.add(verticalSplitter, BorderLayout.CENTER);
    setContentPane(mainPanel);
    setTitle(DEFAULT_TITLE);
}
Also used : JPanel(javax.swing.JPanel) FocusAdapter(java.awt.event.FocusAdapter) DefaultMutableTreeNode(javax.swing.tree.DefaultMutableTreeNode) JLoadableNode(jadx.gui.treemodel.JLoadableNode) KeyAdapter(java.awt.event.KeyAdapter) IssuesPanel(jadx.gui.ui.panel.IssuesPanel) FocusEvent(java.awt.event.FocusEvent) DefaultTreeCellRenderer(javax.swing.tree.DefaultTreeCellRenderer) KeyEvent(java.awt.event.KeyEvent) BorderLayout(java.awt.BorderLayout) JNode(jadx.gui.treemodel.JNode) Component(java.awt.Component) TreeExpansionEvent(javax.swing.event.TreeExpansionEvent) TreeWillExpandListener(javax.swing.event.TreeWillExpandListener) JScrollPane(javax.swing.JScrollPane) MouseEvent(java.awt.event.MouseEvent) ProgressPanel(jadx.gui.ui.panel.ProgressPanel) MouseAdapter(java.awt.event.MouseAdapter) JPackage(jadx.gui.treemodel.JPackage) Dimension(java.awt.Dimension) DefaultTreeModel(javax.swing.tree.DefaultTreeModel) JTree(javax.swing.JTree) TreePath(javax.swing.tree.TreePath) CacheObject(jadx.gui.utils.CacheObject) DropTarget(java.awt.dnd.DropTarget) JSplitPane(javax.swing.JSplitPane)

Example 5 with JPackage

use of jadx.gui.treemodel.JPackage in project jadx by skylot.

the class MainWindow method treeRightClickAction.

private void treeRightClickAction(MouseEvent e) {
    JNode obj = getJNodeUnderMouse(e);
    if (obj instanceof JPackage) {
        JPackagePopupMenu menu = new JPackagePopupMenu(this, (JPackage) obj);
        menu.show(e.getComponent(), e.getX(), e.getY());
    } else if (obj instanceof JClass || obj instanceof JField || obj instanceof JMethod) {
        JMenuItem jmi = new JMenuItem(NLS.str("popup.rename"));
        jmi.addActionListener(action -> RenameDialog.rename(this, obj));
        JPopupMenu menu = new JPopupMenu();
        menu.add(jmi);
        menu.show(e.getComponent(), e.getX(), e.getY());
    }
}
Also used : DropTarget(java.awt.dnd.DropTarget) Arrays(java.util.Arrays) Link(jadx.gui.utils.Link) AbstractCodeArea(jadx.gui.ui.codearea.AbstractCodeArea) GraphicsEnvironment(java.awt.GraphicsEnvironment) JCheckBoxMenuItem(javax.swing.JCheckBoxMenuItem) JadxSettings(jadx.gui.settings.JadxSettings) SearchDialog(jadx.gui.ui.dialog.SearchDialog) EMPTY_RUNNABLE(io.reactivex.internal.functions.Functions.EMPTY_RUNNABLE) ExportTask(jadx.gui.jobs.ExportTask) SummaryNode(jadx.gui.ui.treenodes.SummaryNode) JFileChooser(javax.swing.JFileChooser) TimerTask(java.util.TimerTask) JFrame(javax.swing.JFrame) Path(java.nio.file.Path) FileUtils(jadx.core.utils.files.FileUtils) EnumSet(java.util.EnumSet) JToolBar(javax.swing.JToolBar) Release(jadx.gui.update.data.Release) FileUtils.fileNamesToPaths(jadx.gui.utils.FileUtils.fileNamesToPaths) ToolTipManager(javax.swing.ToolTipManager) TreePath(javax.swing.tree.TreePath) StringUtils(jadx.core.utils.StringUtils) Set(java.util.Set) ContentPanel(jadx.gui.ui.panel.ContentPanel) KeyEvent(java.awt.event.KeyEvent) WindowAdapter(java.awt.event.WindowAdapter) Component(java.awt.Component) Executors(java.util.concurrent.Executors) Box(javax.swing.Box) DefaultMutableTreeNode(javax.swing.tree.DefaultMutableTreeNode) AbstractAction(javax.swing.AbstractAction) AboutDialog(jadx.gui.ui.dialog.AboutDialog) JadxProject(jadx.gui.settings.JadxProject) JPanel(javax.swing.JPanel) WindowConstants(javax.swing.WindowConstants) AbstractCodeContentPanel(jadx.gui.ui.codearea.AbstractCodeContentPanel) ActionListener(java.awt.event.ActionListener) JSplitPane(javax.swing.JSplitPane) TreeExpansionEvent(javax.swing.event.TreeExpansionEvent) TaskStatus(jadx.gui.jobs.TaskStatus) DnDConstants(java.awt.dnd.DnDConstants) Action(javax.swing.Action) KeyAdapter(java.awt.event.KeyAdapter) ArrayList(java.util.ArrayList) JumpPosition(jadx.gui.utils.JumpPosition) ImageIcon(javax.swing.ImageIcon) CacheObject(jadx.gui.utils.CacheObject) QuarkDialog(jadx.gui.plugins.quark.QuarkDialog) DefaultTreeCellRenderer(javax.swing.tree.DefaultTreeCellRenderer) JMethod(jadx.gui.treemodel.JMethod) ResourceFile(jadx.api.ResourceFile) ProgressPanel(jadx.gui.ui.panel.ProgressPanel) Files(java.nio.file.Files) TreeSelectionModel(javax.swing.tree.TreeSelectionModel) MouseEvent(java.awt.event.MouseEvent) JScrollPane(javax.swing.JScrollPane) JadxSettingsWindow(jadx.gui.settings.JadxSettingsWindow) JadxUpdate(jadx.gui.update.JadxUpdate) MenuEvent(javax.swing.event.MenuEvent) JavaNode(jadx.api.JavaNode) FontUtils(jadx.gui.utils.FontUtils) Utils(jadx.core.utils.Utils) IndexTask(jadx.gui.jobs.IndexTask) JDebuggerPanel(jadx.gui.ui.panel.JDebuggerPanel) SystemInfo(jadx.gui.utils.SystemInfo) LogViewerDialog(jadx.gui.ui.dialog.LogViewerDialog) JDialog(javax.swing.JDialog) LafManager(jadx.gui.utils.LafManager) JToggleButton(javax.swing.JToggleButton) LoggerFactory(org.slf4j.LoggerFactory) Timer(java.util.Timer) IndexService(jadx.gui.jobs.IndexService) JField(jadx.gui.treemodel.JField) Locale(java.util.Locale) ApkSignature(jadx.gui.treemodel.ApkSignature) CommentsIndex(jadx.gui.utils.search.CommentsIndex) MouseAdapter(java.awt.event.MouseAdapter) IssuesPanel(jadx.gui.ui.panel.IssuesPanel) HeadlessException(java.awt.HeadlessException) BorderLayout(java.awt.BorderLayout) JLoadableNode(jadx.gui.treemodel.JLoadableNode) DefaultTreeModel(javax.swing.tree.DefaultTreeModel) JMenuBar(javax.swing.JMenuBar) Font(java.awt.Font) IUpdateCallback(jadx.gui.update.JadxUpdate.IUpdateCallback) JMenu(javax.swing.JMenu) LogCollector(jadx.gui.utils.logs.LogCollector) Collectors(java.util.stream.Collectors) WindowEvent(java.awt.event.WindowEvent) Theme(org.fife.ui.rsyntaxtextarea.Theme) MenuListener(javax.swing.event.MenuListener) Nullable(org.jetbrains.annotations.Nullable) RenameDialog(jadx.gui.ui.dialog.RenameDialog) Dimension(java.awt.Dimension) List(java.util.List) JadxArgs(jadx.api.JadxArgs) TextSearchIndex(jadx.gui.utils.search.TextSearchIndex) Toolkit(java.awt.Toolkit) Rectangle(java.awt.Rectangle) FileNameExtensionFilter(javax.swing.filechooser.FileNameExtensionFilter) TreeNode(javax.swing.tree.TreeNode) ADBDialog(jadx.gui.ui.dialog.ADBDialog) GraphicsDevice(java.awt.GraphicsDevice) NLS(jadx.gui.utils.NLS) HashSet(java.util.HashSet) JPackagePopupMenu(jadx.gui.ui.popupmenu.JPackagePopupMenu) AWTEvent(java.awt.AWTEvent) FocusAdapter(java.awt.event.FocusAdapter) SwingUtilities(javax.swing.SwingUtilities) KeyStroke.getKeyStroke(javax.swing.KeyStroke.getKeyStroke) JMenuItem(javax.swing.JMenuItem) UiUtils(jadx.gui.utils.UiUtils) DisplayMode(java.awt.DisplayMode) BreakpointManager(jadx.gui.device.debugger.BreakpointManager) JNode(jadx.gui.treemodel.JNode) JClass(jadx.gui.treemodel.JClass) TreeWillExpandListener(javax.swing.event.TreeWillExpandListener) EditorViewState(jadx.gui.ui.codearea.EditorViewState) ExecutorService(java.util.concurrent.ExecutorService) ProcessResult(jadx.gui.jobs.ProcessResult) JPackage(jadx.gui.treemodel.JPackage) Logger(org.slf4j.Logger) DecompileTask(jadx.gui.jobs.DecompileTask) JPopupMenu(javax.swing.JPopupMenu) FileInputStream(java.io.FileInputStream) JOptionPane(javax.swing.JOptionPane) JTree(javax.swing.JTree) ActionEvent(java.awt.event.ActionEvent) JadxWrapper(jadx.gui.JadxWrapper) BackgroundExecutor(jadx.gui.jobs.BackgroundExecutor) Level(ch.qos.logback.classic.Level) JResource(jadx.gui.treemodel.JResource) FocusEvent(java.awt.event.FocusEvent) JRoot(jadx.gui.treemodel.JRoot) Collections(java.util.Collections) FileUtils.toPaths(jadx.gui.utils.FileUtils.toPaths) InputStream(java.io.InputStream) JPackagePopupMenu(jadx.gui.ui.popupmenu.JPackagePopupMenu) JField(jadx.gui.treemodel.JField) JClass(jadx.gui.treemodel.JClass) JPackage(jadx.gui.treemodel.JPackage) JNode(jadx.gui.treemodel.JNode) JMethod(jadx.gui.treemodel.JMethod) JMenuItem(javax.swing.JMenuItem) JPopupMenu(javax.swing.JPopupMenu)

Aggregations

JPackage (jadx.gui.treemodel.JPackage)6 JClass (jadx.gui.treemodel.JClass)3 JMethod (jadx.gui.treemodel.JMethod)3 JavaNode (jadx.api.JavaNode)2 JadxRuntimeException (jadx.core.utils.exceptions.JadxRuntimeException)2 JField (jadx.gui.treemodel.JField)2 JLoadableNode (jadx.gui.treemodel.JLoadableNode)2 JNode (jadx.gui.treemodel.JNode)2 Level (ch.qos.logback.classic.Level)1 EMPTY_RUNNABLE (io.reactivex.internal.functions.Functions.EMPTY_RUNNABLE)1 JadxArgs (jadx.api.JadxArgs)1 JavaClass (jadx.api.JavaClass)1 JavaMethod (jadx.api.JavaMethod)1 JavaVariable (jadx.api.JavaVariable)1 ResourceFile (jadx.api.ResourceFile)1 JadxCodeRename (jadx.api.data.impl.JadxCodeRename)1 RootNode (jadx.core.dex.nodes.RootNode)1 RenameVisitor (jadx.core.dex.visitors.rename.RenameVisitor)1 StringUtils (jadx.core.utils.StringUtils)1 Utils (jadx.core.utils.Utils)1