Right-Click Context Menu New File
Just a hack at this point, a lot of work is still needed including the new classfile option
This commit is contained in:
parent
4c2e72e78e
commit
9841ca151f
2 changed files with 144 additions and 0 deletions
|
@ -1,6 +1,7 @@
|
||||||
package the.bytecode.club.bytecodeviewer.gui.resourcelist.contextmenu;
|
package the.bytecode.club.bytecodeviewer.gui.resourcelist.contextmenu;
|
||||||
|
|
||||||
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
import the.bytecode.club.bytecodeviewer.Constants;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.resourcelist.ResourceTree;
|
import the.bytecode.club.bytecodeviewer.gui.resourcelist.ResourceTree;
|
||||||
import the.bytecode.club.bytecodeviewer.gui.resourcelist.contextmenu.impl.*;
|
import the.bytecode.club.bytecodeviewer.gui.resourcelist.contextmenu.impl.*;
|
||||||
|
|
||||||
|
@ -38,6 +39,7 @@ public class ContextMenu
|
||||||
|
|
||||||
static
|
static
|
||||||
{
|
{
|
||||||
|
addContext(new New());
|
||||||
addContext(new Remove());
|
addContext(new Remove());
|
||||||
addContext(new Open());
|
addContext(new Open());
|
||||||
addContext(new QuickOpen());
|
addContext(new QuickOpen());
|
||||||
|
|
|
@ -0,0 +1,142 @@
|
||||||
|
package the.bytecode.club.bytecodeviewer.gui.resourcelist.contextmenu.impl;
|
||||||
|
|
||||||
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
|
||||||
|
import the.bytecode.club.bytecodeviewer.decompilers.Decompiler;
|
||||||
|
import the.bytecode.club.bytecodeviewer.gui.resourcelist.contextmenu.ContextMenuItem;
|
||||||
|
import the.bytecode.club.bytecodeviewer.gui.resourcelist.contextmenu.ContextMenuType;
|
||||||
|
import the.bytecode.club.bytecodeviewer.translation.TranslatedStrings;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.tree.DefaultMutableTreeNode;
|
||||||
|
import javax.swing.tree.MutableTreeNode;
|
||||||
|
import javax.swing.tree.TreePath;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
|
||||||
|
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
|
||||||
|
* *
|
||||||
|
* This program is free software: you can redistribute it and/or modify *
|
||||||
|
* it under the terms of the GNU General Public License as published by *
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or *
|
||||||
|
* (at your option) any later version. *
|
||||||
|
* *
|
||||||
|
* This program is distributed in the hope that it will be useful, *
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||||
|
* GNU General Public License for more details. *
|
||||||
|
* *
|
||||||
|
* You should have received a copy of the GNU General Public License *
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Konloch
|
||||||
|
* @since 7/27/2021
|
||||||
|
*/
|
||||||
|
public class New extends ContextMenuItem
|
||||||
|
{
|
||||||
|
public New()
|
||||||
|
{
|
||||||
|
super(ContextMenuType.ALL, ((tree, selPath, menu) ->
|
||||||
|
{
|
||||||
|
JMenu quickOpen = new JMenu(TranslatedStrings.NEW.toString());
|
||||||
|
quickOpen.add(createMenu("Class", FileType.CLASS, selPath));
|
||||||
|
quickOpen.add(createMenu("File", FileType.FILE, selPath));
|
||||||
|
//quickOpen.add(createMenu("Directory", FileType.DIRECTORY, selPath));
|
||||||
|
menu.add(quickOpen);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static JMenuItem createMenu(String name, FileType fileType, TreePath selPath)
|
||||||
|
{
|
||||||
|
JMenuItem menu = new JMenuItem(name);
|
||||||
|
|
||||||
|
String separator = "/"; //fileType == FileType.CLASS ? "." : "/";
|
||||||
|
String firstPath = buildPath(0, 2, selPath, separator);
|
||||||
|
String path = buildPath(2, selPath.getPathCount(), selPath, separator);
|
||||||
|
String containerName = selPath.getPathComponent(1).toString();
|
||||||
|
|
||||||
|
menu.addActionListener((e)->{
|
||||||
|
String newPath = BytecodeViewer.showInput("Name", "Enter the file name", path);
|
||||||
|
|
||||||
|
if(newPath == null || newPath.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch(fileType)
|
||||||
|
{
|
||||||
|
case FILE:
|
||||||
|
BytecodeViewer.resourceContainers.get(containerName).resourceFiles.put(newPath, new byte[0]);
|
||||||
|
searchAndInsert(firstPath+"/"+newPath, BytecodeViewer.resourceContainers.get(containerName).treeNode);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CLASS:
|
||||||
|
//TODO needs to be an empty class file, asm can help with this
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String buildPath(int startsAt, int max, TreePath selPath, String separator)
|
||||||
|
{
|
||||||
|
StringBuilder tempSpot = new StringBuilder();
|
||||||
|
|
||||||
|
for(int counter = startsAt, maxCounter = max;counter < maxCounter; counter++)
|
||||||
|
{
|
||||||
|
if(counter > startsAt)
|
||||||
|
tempSpot.append(separator);
|
||||||
|
tempSpot.append(selPath.getPathComponent(counter));
|
||||||
|
}
|
||||||
|
|
||||||
|
return tempSpot.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String buildPath(int startsAt, int max, DefaultMutableTreeNode treeNode, String separator)
|
||||||
|
{
|
||||||
|
StringBuilder tempSpot = new StringBuilder();
|
||||||
|
|
||||||
|
for(int counter = startsAt, maxCounter = max;counter < maxCounter; counter++)
|
||||||
|
{
|
||||||
|
if(counter > startsAt)
|
||||||
|
tempSpot.append(separator);
|
||||||
|
tempSpot.append(treeNode.getPath()[counter]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tempSpot.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO this needs to be rewritten to support creating parent nodes that don't exist
|
||||||
|
public static boolean searchAndInsert(String path, DefaultMutableTreeNode treeNode)
|
||||||
|
{
|
||||||
|
Enumeration<DefaultMutableTreeNode> children = treeNode.children();
|
||||||
|
|
||||||
|
String findPath = FilenameUtils.getPath(path);
|
||||||
|
String currentPath = buildPath(0, treeNode.getPath().length, treeNode, "/");
|
||||||
|
String directory = FilenameUtils.getPath(currentPath);
|
||||||
|
|
||||||
|
if(currentPath.startsWith(findPath))
|
||||||
|
{
|
||||||
|
//TODO this can be written without the need for .getParent
|
||||||
|
((DefaultMutableTreeNode)treeNode.getParent()).add(new DefaultMutableTreeNode(FilenameUtils.getName(path)));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(children.hasMoreElements())
|
||||||
|
{
|
||||||
|
DefaultMutableTreeNode child = children.nextElement();
|
||||||
|
if(searchAndInsert(path, child))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum FileType
|
||||||
|
{
|
||||||
|
CLASS,
|
||||||
|
FILE,
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue