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..dd931a119 100644 --- a/src/org/infinity/check/BCSIDSChecker.java +++ b/src/org/infinity/check/BCSIDSChecker.java @@ -65,9 +65,10 @@ 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, () -> { + final 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..23a8aeecf 100644 --- a/src/org/infinity/check/CreInvChecker.java +++ b/src/org/infinity/check/CreInvChecker.java @@ -68,9 +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); - ((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 d8e5841f4..3d0915621 100644 --- a/src/org/infinity/check/DialogChecker.java +++ b/src/org/infinity/check/DialogChecker.java @@ -84,9 +84,10 @@ 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, + () -> ((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..096dc2b99 100644 --- a/src/org/infinity/check/ScriptChecker.java +++ b/src/org/infinity/check/ScriptChecker.java @@ -76,9 +76,10 @@ 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, + () -> ((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..05f751c4e 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,39 @@ 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..609b46248 100644 --- a/src/org/infinity/search/ReferenceHitFrame.java +++ b/src/org/infinity/search/ReferenceHitFrame.java @@ -130,12 +130,13 @@ 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, () -> { + 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..08484ff87 100644 --- a/src/org/infinity/search/TextHitFrame.java +++ b/src/org/infinity/search/TextHitFrame.java @@ -119,11 +119,12 @@ 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, () -> { + 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..5796bf657 100644 --- a/src/org/infinity/search/advanced/AdvancedSearch.java +++ b/src/org/infinity/search/advanced/AdvancedSearch.java @@ -819,12 +819,13 @@ 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, () -> { + Viewable viewable = NearInfinity.getInstance().getViewable(); + showEntryInViewer(row, viewable); + if (viewable instanceof DlgResource) { + NearInfinity.getInstance().toFront(); + } + }); } } } else if (event.getSource() == bOpenNew) {