From d34292c293ccf62f81ff47dfc91730e2286fa83c Mon Sep 17 00:00:00 2001 From: Bubb13 <36863623+Bubb13@users.noreply.github.com> Date: Wed, 11 Oct 2023 17:18:46 -0700 Subject: [PATCH 1/2] Fix advanced search not opening the correct viewable - showResourceEntry() runs on the background thread, so subsequent calls to NearInfinity.getInstance().getViewable() might fetch the old viewable. --- src/org/infinity/NearInfinity.java | 6 ++- src/org/infinity/check/BCSIDSChecker.java | 11 ++++-- src/org/infinity/check/CreInvChecker.java | 11 ++++-- src/org/infinity/check/DialogChecker.java | 12 ++++-- src/org/infinity/check/ScriptChecker.java | 12 ++++-- src/org/infinity/gui/ResourceTree.java | 39 +++++++++++++------ .../infinity/search/ReferenceHitFrame.java | 17 +++++--- src/org/infinity/search/TextHitFrame.java | 15 ++++--- .../search/advanced/AdvancedSearch.java | 17 +++++--- 9 files changed, 98 insertions(+), 42 deletions(-) diff --git a/src/org/infinity/NearInfinity.java b/src/org/infinity/NearInfinity.java index 716c9958e..251f25904 100644 --- a/src/org/infinity/NearInfinity.java +++ b/src/org/infinity/NearInfinity.java @@ -888,7 +888,11 @@ public boolean removeViewable() { } public void showResourceEntry(ResourceEntry resourceEntry) { - tree.select(resourceEntry); + showResourceEntry(resourceEntry, null); + } + + public void showResourceEntry(ResourceEntry resourceEntry, Operation doneOperation) { + tree.select(resourceEntry, doneOperation); } public void quit() { diff --git a/src/org/infinity/check/BCSIDSChecker.java b/src/org/infinity/check/BCSIDSChecker.java index 30eb6a78d..e4e28163d 100644 --- a/src/org/infinity/check/BCSIDSChecker.java +++ b/src/org/infinity/check/BCSIDSChecker.java @@ -41,6 +41,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; +import org.infinity.util.Operation; /** Performs checking {@link BcsResource BCS} & {@code BS} resources. */ public final class BCSIDSChecker extends AbstractSearcher implements Runnable, ActionListener, ListSelectionListener { @@ -65,9 +66,13 @@ public void actionPerformed(ActionEvent event) { int row = table.getSelectedRow(); if (row != -1) { ResourceEntry resourceEntry = (ResourceEntry) table.getValueAt(row, 0); - NearInfinity.getInstance().showResourceEntry(resourceEntry); - BcsResource bcsfile = (BcsResource) NearInfinity.getInstance().getViewable(); - bcsfile.highlightText(((Integer) table.getValueAt(row, 2)), null); + NearInfinity.getInstance().showResourceEntry(resourceEntry, new Operation() { + @Override + public void perform() { + BcsResource bcsfile = (BcsResource) NearInfinity.getInstance().getViewable(); + bcsfile.highlightText(((Integer) table.getValueAt(row, 2)), null); + } + }); } } else if (event.getSource() == bopennew) { int row = table.getSelectedRow(); diff --git a/src/org/infinity/check/CreInvChecker.java b/src/org/infinity/check/CreInvChecker.java index f15a0baaf..f991d8f86 100644 --- a/src/org/infinity/check/CreInvChecker.java +++ b/src/org/infinity/check/CreInvChecker.java @@ -44,6 +44,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; +import org.infinity.util.Operation; /** Performs checking {@link CreResource CRE} & {@code CHR} resources. */ public final class CreInvChecker extends AbstractSearcher implements Runnable, ActionListener, ListSelectionListener { @@ -68,9 +69,13 @@ public void actionPerformed(ActionEvent event) { int row = table.getSelectedRow(); if (row != -1) { ResourceEntry resourceEntry = (ResourceEntry) table.getValueAt(row, 0); - NearInfinity.getInstance().showResourceEntry(resourceEntry); - ((AbstractStruct) NearInfinity.getInstance().getViewable()).getViewer() - .selectEntry(((Item) table.getValueAt(row, 2)).getName()); + NearInfinity.getInstance().showResourceEntry(resourceEntry, new Operation() { + @Override + public void perform() { + ((AbstractStruct) NearInfinity.getInstance().getViewable()).getViewer() + .selectEntry(((Item) table.getValueAt(row, 2)).getName()); + } + }); } } else if (event.getSource() == bopennew) { int row = table.getSelectedRow(); diff --git a/src/org/infinity/check/DialogChecker.java b/src/org/infinity/check/DialogChecker.java index d8e5841f4..2abe82778 100644 --- a/src/org/infinity/check/DialogChecker.java +++ b/src/org/infinity/check/DialogChecker.java @@ -48,6 +48,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; +import org.infinity.util.Operation; /** Performs checking {@link DlgResource DLG} resources. */ public final class DialogChecker extends AbstractSearcher @@ -84,9 +85,14 @@ public void actionPerformed(ActionEvent event) { int row = table.getSelectedRow(); if (row != -1) { ResourceEntry resourceEntry = (ResourceEntry) table.getValueAt(row, 0); - NearInfinity.getInstance().showResourceEntry(resourceEntry); - ((AbstractStruct) NearInfinity.getInstance().getViewable()).getViewer() - .selectEntry((String) table.getValueAt(row, 1)); + final SortableTable tableCapture = table; + NearInfinity.getInstance().showResourceEntry(resourceEntry, new Operation() { + @Override + public void perform() { + ((AbstractStruct) NearInfinity.getInstance().getViewable()).getViewer() + .selectEntry((String) tableCapture.getValueAt(row, 1)); + } + }); } } else if (event.getSource() == bopennew) { int row = table.getSelectedRow(); diff --git a/src/org/infinity/check/ScriptChecker.java b/src/org/infinity/check/ScriptChecker.java index 93d56cf35..ff4a5949c 100644 --- a/src/org/infinity/check/ScriptChecker.java +++ b/src/org/infinity/check/ScriptChecker.java @@ -43,6 +43,7 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; +import org.infinity.util.Operation; /** Performs checking {@link BcsResource BCS} & {@code BS} resources. */ public final class ScriptChecker extends AbstractSearcher @@ -76,9 +77,14 @@ public void actionPerformed(ActionEvent event) { int row = table.getSelectedRow(); if (row != -1) { ResourceEntry resourceEntry = (ResourceEntry) table.getValueAt(row, 0); - NearInfinity.getInstance().showResourceEntry(resourceEntry); - ((BcsResource) NearInfinity.getInstance().getViewable()).highlightText(((Integer) table.getValueAt(row, 2)), - null); + final SortableTable tableCapture = table; + NearInfinity.getInstance().showResourceEntry(resourceEntry, new Operation() { + @Override + public void perform() { + ((BcsResource) NearInfinity.getInstance().getViewable()) + .highlightText(((Integer) tableCapture.getValueAt(row, 2)), null); + } + }); } } else if (event.getSource() == bopennew) { int row = table.getSelectedRow(); diff --git a/src/org/infinity/gui/ResourceTree.java b/src/org/infinity/gui/ResourceTree.java index c1e61779d..9b7330c93 100644 --- a/src/org/infinity/gui/ResourceTree.java +++ b/src/org/infinity/gui/ResourceTree.java @@ -68,6 +68,7 @@ import org.infinity.resource.key.ResourceTreeFolder; import org.infinity.resource.key.ResourceTreeModel; import org.infinity.util.IconCache; +import org.infinity.util.Operation; import org.infinity.util.io.FileEx; import org.infinity.util.io.FileManager; import org.infinity.util.io.StreamUtils; @@ -192,24 +193,38 @@ public void select(ResourceEntry entry) { } public void select(ResourceEntry entry, boolean forced) { + select(entry, forced, null); + } + + public void select(ResourceEntry entry, Operation doneOperation) { + select(entry, false, doneOperation); + } + + public void select(ResourceEntry entry, boolean forced, Operation doneOperation) { new SwingWorker() { @Override protected Void doInBackground() throws Exception { - if (entry == null) { - tree.clearSelection(); - } else if (forced || entry != shownResource) { - TreePath tp = ResourceFactory.getResourceTreeModel().getPathToNode(entry); - try { - expandListener.treeWillExpand(new TreeExpansionEvent(tree, tp)); - tree.scrollPathToVisible(tp); - tree.addSelectionPath(tp); - tree.repaint(); - } finally { - expandListener.treeExpanded(new TreeExpansionEvent(tree, tp)); - } + if (entry == null) { + tree.clearSelection(); + } else if (forced || entry != shownResource) { + TreePath tp = ResourceFactory.getResourceTreeModel().getPathToNode(entry); + try { + expandListener.treeWillExpand(new TreeExpansionEvent(tree, tp)); + tree.scrollPathToVisible(tp); + tree.addSelectionPath(tp); + tree.repaint(); + } finally { + expandListener.treeExpanded(new TreeExpansionEvent(tree, tp)); } + } return null; } + @Override + protected void done() { + if (doneOperation != null) { + doneOperation.perform(); + } + } }.execute(); } diff --git a/src/org/infinity/search/ReferenceHitFrame.java b/src/org/infinity/search/ReferenceHitFrame.java index ae290c188..d43f88c07 100644 --- a/src/org/infinity/search/ReferenceHitFrame.java +++ b/src/org/infinity/search/ReferenceHitFrame.java @@ -43,6 +43,7 @@ import org.infinity.resource.key.FileResourceEntry; import org.infinity.resource.key.ResourceEntry; import org.infinity.util.Misc; +import org.infinity.util.Operation; public final class ReferenceHitFrame extends ChildFrame implements ActionListener, ListSelectionListener { private static final String QUERY_STRING = "string reference"; @@ -130,12 +131,16 @@ public void actionPerformed(ActionEvent event) { ((ViewFrame) parent).toFront(); } } else { - NearInfinity.getInstance().showResourceEntry(entry); - Viewable viewable = NearInfinity.getInstance().getViewable(); - showEntryInViewer(row, viewable); - if (viewable instanceof DlgResource) { - NearInfinity.getInstance().toFront(); - } + NearInfinity.getInstance().showResourceEntry(entry, new Operation() { + @Override + public void perform() { + Viewable viewable = NearInfinity.getInstance().getViewable(); + showEntryInViewer(row, viewable); + if (viewable instanceof DlgResource) { + NearInfinity.getInstance().toFront(); + } + } + }); } } } else if (event.getSource() == bopennew) { diff --git a/src/org/infinity/search/TextHitFrame.java b/src/org/infinity/search/TextHitFrame.java index 5c1a11f4a..a4438836a 100644 --- a/src/org/infinity/search/TextHitFrame.java +++ b/src/org/infinity/search/TextHitFrame.java @@ -36,6 +36,7 @@ import org.infinity.resource.Viewable; import org.infinity.resource.key.ResourceEntry; import org.infinity.util.Misc; +import org.infinity.util.Operation; final class TextHitFrame extends ChildFrame implements ActionListener, ListSelectionListener { private final Component parent; @@ -119,11 +120,15 @@ public void actionPerformed(ActionEvent event) { ((TextResource) res).highlightText(((Integer) table.getValueAt(row, 2)), query); } } else { - NearInfinity.getInstance().showResourceEntry(entry); - Viewable viewable = NearInfinity.getInstance().getViewable(); - if (viewable instanceof TextResource) { - ((TextResource) viewable).highlightText(((Integer) table.getValueAt(row, 2)), query); - } + NearInfinity.getInstance().showResourceEntry(entry, new Operation() { + @Override + public void perform() { + Viewable viewable = NearInfinity.getInstance().getViewable(); + if (viewable instanceof TextResource) { + ((TextResource) viewable).highlightText(((Integer) table.getValueAt(row, 2)), query); + } + } + }); } } } else if (event.getSource() == bopennew) { diff --git a/src/org/infinity/search/advanced/AdvancedSearch.java b/src/org/infinity/search/advanced/AdvancedSearch.java index ef82f8f22..69d76f552 100644 --- a/src/org/infinity/search/advanced/AdvancedSearch.java +++ b/src/org/infinity/search/advanced/AdvancedSearch.java @@ -77,6 +77,7 @@ import org.infinity.search.ReferenceHitFrame; import org.infinity.util.Debugging; import org.infinity.util.Misc; +import org.infinity.util.Operation; import org.infinity.util.SimpleListModel; public class AdvancedSearch extends ChildFrame implements Runnable { @@ -819,12 +820,16 @@ public void actionPerformed(ActionEvent event) { if (row != -1) { ResourceEntry entry = (ResourceEntry) listResults.getValueAt(row, 0); if (entry != null) { - NearInfinity.getInstance().showResourceEntry(entry); - Viewable viewable = NearInfinity.getInstance().getViewable(); - showEntryInViewer(row, viewable); - if (viewable instanceof DlgResource) { - NearInfinity.getInstance().toFront(); - } + NearInfinity.getInstance().showResourceEntry(entry, new Operation() { + @Override + public void perform() { + Viewable viewable = NearInfinity.getInstance().getViewable(); + showEntryInViewer(row, viewable); + if (viewable instanceof DlgResource) { + NearInfinity.getInstance().toFront(); + } + } + }); } } } else if (event.getSource() == bOpenNew) { From 4037ee7b8acd9170b3576f2e5a3c1fba5bed7ae0 Mon Sep 17 00:00:00 2001 From: Argent77 <4519923+Argent77@users.noreply.github.com> Date: Thu, 12 Oct 2023 10:30:46 +0200 Subject: [PATCH 2/2] Code cleanup --- src/org/infinity/check/BCSIDSChecker.java | 10 +++------- src/org/infinity/check/CreInvChecker.java | 11 +++-------- src/org/infinity/check/DialogChecker.java | 11 +++-------- src/org/infinity/check/ScriptChecker.java | 11 +++-------- src/org/infinity/gui/ResourceTree.java | 1 + src/org/infinity/search/ReferenceHitFrame.java | 14 +++++--------- src/org/infinity/search/TextHitFrame.java | 12 ++++-------- .../infinity/search/advanced/AdvancedSearch.java | 14 +++++--------- 8 files changed, 27 insertions(+), 57 deletions(-) diff --git a/src/org/infinity/check/BCSIDSChecker.java b/src/org/infinity/check/BCSIDSChecker.java index e4e28163d..dd931a119 100644 --- a/src/org/infinity/check/BCSIDSChecker.java +++ b/src/org/infinity/check/BCSIDSChecker.java @@ -41,7 +41,6 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; -import org.infinity.util.Operation; /** Performs checking {@link BcsResource BCS} & {@code BS} resources. */ public final class BCSIDSChecker extends AbstractSearcher implements Runnable, ActionListener, ListSelectionListener { @@ -66,12 +65,9 @@ public void actionPerformed(ActionEvent event) { int row = table.getSelectedRow(); if (row != -1) { ResourceEntry resourceEntry = (ResourceEntry) table.getValueAt(row, 0); - NearInfinity.getInstance().showResourceEntry(resourceEntry, new Operation() { - @Override - public void perform() { - BcsResource bcsfile = (BcsResource) NearInfinity.getInstance().getViewable(); - bcsfile.highlightText(((Integer) table.getValueAt(row, 2)), null); - } + NearInfinity.getInstance().showResourceEntry(resourceEntry, () -> { + final BcsResource bcsfile = (BcsResource) NearInfinity.getInstance().getViewable(); + bcsfile.highlightText(((Integer) table.getValueAt(row, 2)), null); }); } } else if (event.getSource() == bopennew) { diff --git a/src/org/infinity/check/CreInvChecker.java b/src/org/infinity/check/CreInvChecker.java index f991d8f86..23a8aeecf 100644 --- a/src/org/infinity/check/CreInvChecker.java +++ b/src/org/infinity/check/CreInvChecker.java @@ -44,7 +44,6 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; -import org.infinity.util.Operation; /** Performs checking {@link CreResource CRE} & {@code CHR} resources. */ public final class CreInvChecker extends AbstractSearcher implements Runnable, ActionListener, ListSelectionListener { @@ -69,13 +68,9 @@ public void actionPerformed(ActionEvent event) { int row = table.getSelectedRow(); if (row != -1) { ResourceEntry resourceEntry = (ResourceEntry) table.getValueAt(row, 0); - NearInfinity.getInstance().showResourceEntry(resourceEntry, new Operation() { - @Override - public void perform() { - ((AbstractStruct) NearInfinity.getInstance().getViewable()).getViewer() - .selectEntry(((Item) table.getValueAt(row, 2)).getName()); - } - }); + NearInfinity.getInstance().showResourceEntry(resourceEntry, + () -> ((AbstractStruct)NearInfinity.getInstance().getViewable()).getViewer() + .selectEntry(((Item)table.getValueAt(row, 2)).getName())); } } else if (event.getSource() == bopennew) { int row = table.getSelectedRow(); diff --git a/src/org/infinity/check/DialogChecker.java b/src/org/infinity/check/DialogChecker.java index 2abe82778..3d0915621 100644 --- a/src/org/infinity/check/DialogChecker.java +++ b/src/org/infinity/check/DialogChecker.java @@ -48,7 +48,6 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; -import org.infinity.util.Operation; /** Performs checking {@link DlgResource DLG} resources. */ public final class DialogChecker extends AbstractSearcher @@ -86,13 +85,9 @@ public void actionPerformed(ActionEvent event) { if (row != -1) { ResourceEntry resourceEntry = (ResourceEntry) table.getValueAt(row, 0); final SortableTable tableCapture = table; - NearInfinity.getInstance().showResourceEntry(resourceEntry, new Operation() { - @Override - public void perform() { - ((AbstractStruct) NearInfinity.getInstance().getViewable()).getViewer() - .selectEntry((String) tableCapture.getValueAt(row, 1)); - } - }); + NearInfinity.getInstance().showResourceEntry(resourceEntry, + () -> ((AbstractStruct)NearInfinity.getInstance().getViewable()).getViewer() + .selectEntry((String)tableCapture.getValueAt(row, 1))); } } else if (event.getSource() == bopennew) { int row = table.getSelectedRow(); diff --git a/src/org/infinity/check/ScriptChecker.java b/src/org/infinity/check/ScriptChecker.java index ff4a5949c..096dc2b99 100644 --- a/src/org/infinity/check/ScriptChecker.java +++ b/src/org/infinity/check/ScriptChecker.java @@ -43,7 +43,6 @@ import org.infinity.resource.key.ResourceEntry; import org.infinity.search.AbstractSearcher; import org.infinity.util.Misc; -import org.infinity.util.Operation; /** Performs checking {@link BcsResource BCS} & {@code BS} resources. */ public final class ScriptChecker extends AbstractSearcher @@ -78,13 +77,9 @@ public void actionPerformed(ActionEvent event) { if (row != -1) { ResourceEntry resourceEntry = (ResourceEntry) table.getValueAt(row, 0); final SortableTable tableCapture = table; - NearInfinity.getInstance().showResourceEntry(resourceEntry, new Operation() { - @Override - public void perform() { - ((BcsResource) NearInfinity.getInstance().getViewable()) - .highlightText(((Integer) tableCapture.getValueAt(row, 2)), null); - } - }); + NearInfinity.getInstance().showResourceEntry(resourceEntry, + () -> ((BcsResource)NearInfinity.getInstance().getViewable()) + .highlightText(((Integer)tableCapture.getValueAt(row, 2)), null)); } } else if (event.getSource() == bopennew) { int row = table.getSelectedRow(); diff --git a/src/org/infinity/gui/ResourceTree.java b/src/org/infinity/gui/ResourceTree.java index 9b7330c93..05f751c4e 100644 --- a/src/org/infinity/gui/ResourceTree.java +++ b/src/org/infinity/gui/ResourceTree.java @@ -219,6 +219,7 @@ protected Void doInBackground() throws Exception { } return null; } + @Override protected void done() { if (doneOperation != null) { diff --git a/src/org/infinity/search/ReferenceHitFrame.java b/src/org/infinity/search/ReferenceHitFrame.java index d43f88c07..609b46248 100644 --- a/src/org/infinity/search/ReferenceHitFrame.java +++ b/src/org/infinity/search/ReferenceHitFrame.java @@ -43,7 +43,6 @@ import org.infinity.resource.key.FileResourceEntry; import org.infinity.resource.key.ResourceEntry; import org.infinity.util.Misc; -import org.infinity.util.Operation; public final class ReferenceHitFrame extends ChildFrame implements ActionListener, ListSelectionListener { private static final String QUERY_STRING = "string reference"; @@ -131,14 +130,11 @@ public void actionPerformed(ActionEvent event) { ((ViewFrame) parent).toFront(); } } else { - NearInfinity.getInstance().showResourceEntry(entry, new Operation() { - @Override - public void perform() { - Viewable viewable = NearInfinity.getInstance().getViewable(); - showEntryInViewer(row, viewable); - if (viewable instanceof DlgResource) { - NearInfinity.getInstance().toFront(); - } + NearInfinity.getInstance().showResourceEntry(entry, () -> { + Viewable viewable = NearInfinity.getInstance().getViewable(); + showEntryInViewer(row, viewable); + if (viewable instanceof DlgResource) { + NearInfinity.getInstance().toFront(); } }); } diff --git a/src/org/infinity/search/TextHitFrame.java b/src/org/infinity/search/TextHitFrame.java index a4438836a..08484ff87 100644 --- a/src/org/infinity/search/TextHitFrame.java +++ b/src/org/infinity/search/TextHitFrame.java @@ -36,7 +36,6 @@ import org.infinity.resource.Viewable; import org.infinity.resource.key.ResourceEntry; import org.infinity.util.Misc; -import org.infinity.util.Operation; final class TextHitFrame extends ChildFrame implements ActionListener, ListSelectionListener { private final Component parent; @@ -120,13 +119,10 @@ public void actionPerformed(ActionEvent event) { ((TextResource) res).highlightText(((Integer) table.getValueAt(row, 2)), query); } } else { - NearInfinity.getInstance().showResourceEntry(entry, new Operation() { - @Override - public void perform() { - Viewable viewable = NearInfinity.getInstance().getViewable(); - if (viewable instanceof TextResource) { - ((TextResource) viewable).highlightText(((Integer) table.getValueAt(row, 2)), query); - } + NearInfinity.getInstance().showResourceEntry(entry, () -> { + Viewable viewable = NearInfinity.getInstance().getViewable(); + if (viewable instanceof TextResource) { + ((TextResource) viewable).highlightText(((Integer) table.getValueAt(row, 2)), query); } }); } diff --git a/src/org/infinity/search/advanced/AdvancedSearch.java b/src/org/infinity/search/advanced/AdvancedSearch.java index 69d76f552..5796bf657 100644 --- a/src/org/infinity/search/advanced/AdvancedSearch.java +++ b/src/org/infinity/search/advanced/AdvancedSearch.java @@ -77,7 +77,6 @@ import org.infinity.search.ReferenceHitFrame; import org.infinity.util.Debugging; import org.infinity.util.Misc; -import org.infinity.util.Operation; import org.infinity.util.SimpleListModel; public class AdvancedSearch extends ChildFrame implements Runnable { @@ -820,14 +819,11 @@ public void actionPerformed(ActionEvent event) { if (row != -1) { ResourceEntry entry = (ResourceEntry) listResults.getValueAt(row, 0); if (entry != null) { - NearInfinity.getInstance().showResourceEntry(entry, new Operation() { - @Override - public void perform() { - Viewable viewable = NearInfinity.getInstance().getViewable(); - showEntryInViewer(row, viewable); - if (viewable instanceof DlgResource) { - NearInfinity.getInstance().toFront(); - } + NearInfinity.getInstance().showResourceEntry(entry, () -> { + Viewable viewable = NearInfinity.getInstance().getViewable(); + showEntryInViewer(row, viewable); + if (viewable instanceof DlgResource) { + NearInfinity.getInstance().toFront(); } }); }