Skip to content

Commit

Permalink
Add option to File and context menu to open biffed version of overridden
Browse files Browse the repository at this point in the history
resources
  • Loading branch information
Argent77 committed Mar 31, 2024
1 parent 2b9bcb5 commit b2cf36b
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 8 deletions.
33 changes: 27 additions & 6 deletions src/org/infinity/gui/ResourceTree.java
Original file line number Diff line number Diff line change
Expand Up @@ -668,7 +668,8 @@ private void maybeShowPopup(MouseEvent e) {

private final class TreePopupMenu extends JPopupMenu implements ActionListener, PopupMenuListener {
private final JMenuItem miOpen = new JMenuItem("Open");
private final JMenuItem miOpennew = new JMenuItem("Open in new window");
private final JMenuItem miOpenNew = new JMenuItem("Open in new window");
private final JMenuItem miOpenBiffedNew = new JMenuItem("Open biffed resource in new window");
private final JMenuItem miReference = new JMenuItem("Find references");
private final JMenuItem miExport = new JMenuItem("Export");
private final JMenuItem miAddCopy = new JMenuItem("Add copy of");
Expand All @@ -681,8 +682,8 @@ private final class TreePopupMenu extends JPopupMenu implements ActionListener,
miReference.setEnabled(false);
miZip.setToolTipText("Create a zip archive out of the selected saved game.");
Font fnt = miOpen.getFont().deriveFont(Font.PLAIN);
for (JMenuItem mi : new JMenuItem[] { miOpen, miOpennew, miReference, miExport, miZip, miAddCopy, miRename,
miDelete, miRestore }) {
for (JMenuItem mi : new JMenuItem[] { miOpen, miOpenNew, miOpenBiffedNew, miReference, miExport,
miZip, miAddCopy, miRename, miDelete, miRestore }) {
add(mi);
mi.addActionListener(this);
mi.setFont(fnt);
Expand All @@ -701,7 +702,7 @@ private ResourceEntry getResourceEntry() {
@Override
public void actionPerformed(ActionEvent event) {
showResource = true;
ResourceEntry node = getResourceEntry();
final ResourceEntry node = getResourceEntry();
if (event.getSource() == miOpen && node != null) {
if (prevNextNode != null) {
prevStack.push(prevNextNode);
Expand All @@ -712,11 +713,24 @@ public void actionPerformed(ActionEvent event) {
prevNextNode = node;
shownResource = node;
NearInfinity.getInstance().setViewable(ResourceFactory.getResource(node));
} else if (event.getSource() == miOpennew && node != null) {
} else if (event.getSource() == miOpenNew && node != null) {
Resource res = ResourceFactory.getResource(node);
if (res != null) {
new ViewFrame(NearInfinity.getInstance(), res);
}
} else if (event.getSource() == miOpenBiffedNew && node != null) {
try {
final BIFFResourceEntry biffedNode =
new BIFFResourceEntry(ResourceFactory.getKeyfile().getResourceEntry(node.getResourceName()), false);
final Resource res = ResourceFactory.getResource(biffedNode);
if (res != null) {
new ViewFrame(NearInfinity.getInstance(), res);
}
} catch (NullPointerException e) {
System.err.println("Does not exist in BIFF: " + node);
JOptionPane.showMessageDialog(NearInfinity.getInstance(),
"Does not exist in BIFF: " + node, "Error", JOptionPane.ERROR_MESSAGE);
}
} else if (event.getSource() == miReference && node != null) {
Resource res = ResourceFactory.getResource(node);
if (res != null && res instanceof Referenceable) {
Expand Down Expand Up @@ -764,7 +778,14 @@ public void actionPerformed(ActionEvent event) {

@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent event) {
ResourceEntry entry = getResourceEntry();
final ResourceEntry entry = getResourceEntry();

boolean biffEnable =
(!BrowserMenuBar.getInstance().getOptions().ignoreOverrides() ||
BrowserMenuBar.getInstance().getOptions().getOverrideMode() == OverrideMode.InOverride) &&
entry.hasOverride();
miOpenBiffedNew.setEnabled(biffEnable);

Class<? extends Resource> cls = ResourceFactory.getResourceType(entry);
miReference.setEnabled(cls != null && Referenceable.class.isAssignableFrom(cls));
miRename.setEnabled(entry instanceof FileResourceEntry);
Expand Down
9 changes: 8 additions & 1 deletion src/org/infinity/gui/ViewFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.infinity.resource.Viewable;
import org.infinity.resource.ViewableContainer;
import org.infinity.resource.graphics.BamResource;
import org.infinity.resource.key.BIFFResourceEntry;
import org.infinity.resource.key.Keyfile;
import org.infinity.resource.key.ResourceEntry;

Expand Down Expand Up @@ -82,7 +83,13 @@ public void setViewable(Viewable viewable) {
ResourceEntry entry = ((Resource) viewable).getResourceEntry();
// setTitle(entry.toString());
setIconImage(entry.getIcon().getImage());
statusBar.setMessage(entry.getActualPath().toString());
final String path;
if (entry instanceof BIFFResourceEntry) {
path = ((BIFFResourceEntry) entry).getActualPath(!entry.hasOverride()).toString();
} else {
path = entry.getActualPath().toString();
}
statusBar.setMessage(path);
} else {
setIconImage(Keyfile.ICON_STRUCT.getImage());
setTitle(((StructEntry) viewable).getName());
Expand Down
28 changes: 28 additions & 0 deletions src/org/infinity/gui/menu/FileMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.infinity.resource.Resource;
import org.infinity.resource.ResourceFactory;
import org.infinity.resource.StructureFactory;
import org.infinity.resource.key.BIFFResourceEntry;
import org.infinity.resource.key.FileResourceEntry;
import org.infinity.resource.key.ResourceEntry;

Expand Down Expand Up @@ -78,6 +79,7 @@ public class FileMenu extends JMenu implements BrowserSubMenu, ActionListener {

private final JMenu newFileMenu;
private final JMenuItem fileOpenNew;
private final JMenuItem fileOpenBiffedNew;
private final JMenuItem fileReference;
private final JMenuItem fileExport;
private final JMenuItem fileAddCopy;
Expand All @@ -98,6 +100,10 @@ public FileMenu(BrowserMenuBar parent) {
fileOpenNew = BrowserMenuBar.makeMenuItem("Open in New Window", KeyEvent.VK_W, Icons.ICON_OPEN_16.getIcon(), -1, this);
fileOpenNew.setEnabled(false);
add(fileOpenNew);
fileOpenBiffedNew = BrowserMenuBar.makeMenuItem("Open Biffed Resource in New Window", KeyEvent.VK_W,
Icons.ICON_OPEN_16.getIcon(), -1, this);
fileOpenBiffedNew.setEnabled(false);
add(fileOpenBiffedNew);
fileReference = BrowserMenuBar.makeMenuItem("Find references...", KeyEvent.VK_F, Icons.ICON_FIND_16.getIcon(), -1, this);
fileReference.setEnabled(false);
add(fileReference);
Expand Down Expand Up @@ -136,9 +142,17 @@ public void gameLoaded() {
}

public void resourceEntrySelected(ResourceEntry entry) {
boolean biffEnable = entry != null &&
(!BrowserMenuBar.getInstance().getOptions().ignoreOverrides() ||
BrowserMenuBar.getInstance().getOptions().getOverrideMode() == OverrideMode.InOverride) &&
entry.hasOverride();
fileOpenBiffedNew.setEnabled(biffEnable);

fileOpenNew.setEnabled(entry != null);

Class<? extends Resource> cls = ResourceFactory.getResourceType(entry);
fileReference.setEnabled(cls != null && Referenceable.class.isAssignableFrom(cls));

fileExport.setEnabled(entry != null);
fileAddCopy.setEnabled(entry != null);
fileRename.setEnabled(entry instanceof FileResourceEntry);
Expand All @@ -158,6 +172,20 @@ public void actionPerformed(ActionEvent event) {
if (res != null) {
new ViewFrame(NearInfinity.getInstance(), res);
}
} else if (event.getSource() == fileOpenBiffedNew) {
final ResourceEntry node = NearInfinity.getInstance().getResourceTree().getSelected();
try {
final BIFFResourceEntry biffedNode =
new BIFFResourceEntry(ResourceFactory.getKeyfile().getResourceEntry(node.getResourceName()), false);
final Resource res = ResourceFactory.getResource(biffedNode);
if (res != null) {
new ViewFrame(NearInfinity.getInstance(), res);
}
} catch (NullPointerException e) {
System.err.println("Does not exist in BIFF: " + node);
JOptionPane.showMessageDialog(NearInfinity.getInstance(),
"Does not exist in BIFF: " + node, "Error", JOptionPane.ERROR_MESSAGE);
}
} else if (event.getSource() == fileReference) {
Resource res = ResourceFactory.getResource(NearInfinity.getInstance().getResourceTree().getSelected());
if (res instanceof Referenceable) {
Expand Down
12 changes: 11 additions & 1 deletion src/org/infinity/resource/key/BIFFResourceEntry.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,16 @@ public BIFFResourceEntry(BIFFEntry bifEntry, String resourceName, int offset) {
}
}

public BIFFResourceEntry(BIFFResourceEntry entry, boolean hasOverride) {
Objects.requireNonNull(entry);
this.keyFile = entry.keyFile;
this.resourceName = entry.resourceName;
this.type = entry.type;
this.extension = entry.extension;
this.locator = entry.locator;
this.hasOverride = hasOverride;
}

BIFFResourceEntry(Path keyFile, ByteBuffer buffer, int offset) {
if (keyFile == null || buffer == null) {
throw new NullPointerException("Path to KEY file and byte buffer with BIFF content must not be null");
Expand Down Expand Up @@ -192,7 +202,7 @@ public int getLocator() {

@Override
public ByteBuffer getResourceBuffer(boolean ignoreOverride) throws Exception {
if (!ignoreOverride) {
if (!ignoreOverride && hasOverride) {
List<Path> overrides = Profile.getOverrideFolders(false);
Path file = FileManager.query(overrides, getResourceName());
if (file != null && FileEx.create(file).isFile()) {
Expand Down

0 comments on commit b2cf36b

Please sign in to comment.