// Near Infinity - An Infinity Engine Browser and Editor
// Copyright (C) 2001 - 2005 Jon Olav Hauglid
// See LICENSE.txt for license information
package org.infinity.search;
import java.awt.Component;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.ProgressMonitor;
import org.infinity.resource.StructEntry;
import org.infinity.resource.dlg.AbstractCode;
import org.infinity.resource.dlg.Action;
import org.infinity.resource.dlg.DlgResource;
import org.infinity.resource.dlg.ResponseTrigger;
import org.infinity.resource.dlg.State;
import org.infinity.resource.dlg.StateTrigger;
import org.infinity.resource.dlg.Transition;
public class DialogItemRefSearcher implements Runnable {
private final DlgResource dlg;
private final Object item;
private final Component parent;
private final ReferenceHitFrame hitFrame;
public DialogItemRefSearcher(DlgResource dlg, Object item, Component parent) {
this.dlg = dlg;
this.parent = parent;
this.item = item;
hitFrame = new ReferenceHitFrame(item, parent);
new Thread(this).start();
}
@Override
public void run() {
List<StructEntry> searchItems = dlg.getList();
ProgressMonitor progress = new ProgressMonitor(parent, "Searching...", null, 0, searchItems.size());
progress.setMillisToDecideToPopup(100);
long startTime = System.currentTimeMillis();
for (int i = 0; i < searchItems.size(); i++) {
StructEntry entry = searchItems.get(i);
if (entry instanceof State || entry instanceof Transition || entry instanceof AbstractCode) {
search(entry);
}
progress.setProgress(i + 1);
if (progress.isCanceled()) {
JOptionPane.showMessageDialog(parent, "Search canceled", "Info", JOptionPane.INFORMATION_MESSAGE);
return;
}
}
System.out.println("Search completed: " + (System.currentTimeMillis() - startTime) + "ms.");
hitFrame.setVisible(true);
}
void search(StructEntry entry) {
boolean found = false;
// ugly dispatching, depending on what we have and what we look for
if (item instanceof State) {
// check transitions
if (entry instanceof Transition) {
State state = (State) item;
int stateNumber = state.getNumber();
Transition trans = (Transition) entry;
String nextDialog = trans.getNextDialog().getResourceName();
if ((trans.getNextDialogState() == stateNumber)
&& (nextDialog.equalsIgnoreCase(dlg.getName()))) {
found = true;
}
}
}
else if (item instanceof Transition) {
// check states
if (entry instanceof State) {
Transition trans = (Transition) item;
State state = (State) entry;
int transNumber = trans.getNumber();
int firstTrans = state.getFirstTrans();
int transCount = state.getTransCount();
if ((transNumber >= firstTrans)
&& (transNumber < (firstTrans + transCount))) {
found = true;
}
}
}
else if (item instanceof StateTrigger) {
// check states
if (entry instanceof State) {
StateTrigger trigger = (StateTrigger) item;
State state = (State) entry;
int triggerNumber = getIndexFromName(trigger.getName());
if (triggerNumber == state.getTriggerIndex()) {
found = true;
}
}
}
else if (item instanceof ResponseTrigger) {
// check transitions
if (entry instanceof Transition) {
ResponseTrigger trigger = (ResponseTrigger) item;
Transition trans = (Transition) entry;
int triggerNumber = getIndexFromName(trigger.getName());
if (triggerNumber == trans.getTriggerIndex()) {
found = true;
}
}
}
else if (item instanceof Action) {
// check transitions
if (entry instanceof Transition) {
Action action = (Action) item;
Transition trans = (Transition) entry;
int actionNumber = getIndexFromName(action.getName());
if (actionNumber == trans.getActionIndex()) {
found = true;
}
}
}
if (found) {
hitFrame.addHit(dlg.getResourceEntry(), entry.getName(), entry);
}
}
// tries to return the last number in the name
private int getIndexFromName(String name) {
int posSpace = name.lastIndexOf(' ');
if (posSpace != -1) {
try {
return Integer.parseInt(name.substring(posSpace + 1));
} catch (NumberFormatException nfe) {}
}
return -1;
}
}