/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview 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.
*
* Jalview 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 Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.util.dialogrunner;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* daft gymnastics to allow Dialogs to extend from a Swing class and use this
* class to implement chained Response run() definition and execution.
*
* There is probably a better way of doing this.
*
* @author jprocter
*
* @param
* the actual dialog that will be shown - which will also initiate the
* response chain.
*/
public class DialogRunner implements DialogRunnerI
{
private Map callbacks = new java.util.HashMap<>();
public T dialog;
public DialogRunner(T ourDialog)
{
dialog = ourDialog;
}
/**
* clear all 'was ran' flags so responses can be called again, and firstRun will
* trigger response execution
*/
public void resetResponses()
{
for (RunResponse response : callbacks.values())
{
response.reset();
}
responses.clear();
firstRunWasCalled = false;
}
@Override
public T response(RunResponse action)
{
callbacks.put(action.ourTrigger, action);
return dialog;
}
/**
* handle a response
*
* @param responseCode
*/
public void run(int responseCode)
{
run(new Response(responseCode));
}
public void run(String responseString)
{
run(new Response(responseString));
}
public void run(Object responseObj)
{
run(new Response(responseObj));
}
/**
* start of response handling.
*
* @param responseCode
*/
public void firstRun(int responseCode)
{
doFirstRun(new Response(responseCode));
}
public void firstRun(String responseString)
{
doFirstRun(new Response(responseString));
}
public void firstRun(Object responseObj)
{
doFirstRun(new Response(responseObj));
}
boolean firstRunWasCalled = false;
private void doFirstRun(Response response)
{
if (firstRunWasCalled)
{
return;
}
firstRunWasCalled = true;
run(response);
}
private void run(Response response)
{
responses.add(response);
RunResponse action = callbacks.get(response);
if (action == null)
{
System.err.println("Doing nothing for " + response);
return;
}
if (action.wasRun)
{
System.err
.println("IMPLEMENTATION ERROR: Cycle in DialogRunner ! for "
+ action);
}
System.err.println("Executing action for " + response);
action.wasRun = true;
action.run();
if (action.returned != null)
{
run(action.returned);
}
}
List responses = new ArrayList<>();
}