/* * 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<>(); }