/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.studio.scripts.execution; import java.awt.Dimension; import java.awt.Window; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; import com.opendoorlogistics.api.ODLApi; import com.opendoorlogistics.api.components.ComponentControlLauncherApi.ControlLauncherCallback; import com.opendoorlogistics.api.components.ComponentExecutionApi.ClosedStateListener; import com.opendoorlogistics.api.components.ComponentExecutionApi.ClosedStatusObservable; import com.opendoorlogistics.api.components.ComponentExecutionApi.ModalDialogResult; import com.opendoorlogistics.api.components.ODLComponent; import com.opendoorlogistics.api.tables.ODLDatastore; import com.opendoorlogistics.api.tables.ODLTable; import com.opendoorlogistics.core.scripts.execution.dependencyinjection.AbstractDependencyInjector; import com.opendoorlogistics.core.tables.decorators.datastores.dependencies.DataDependencies; import com.opendoorlogistics.core.utils.strings.StandardisedStringTreeMap; import com.opendoorlogistics.core.utils.ui.ModalDialog; abstract class ScriptsDependencyInjector extends AbstractDependencyInjector { private final Window parentWindow; private final ArrayList<RecordedLauncherCallback> controlLauncherCallbacks = new ArrayList<>(); private final StandardisedStringTreeMap<DataDependencies> dependenciesByInstructionId = new StandardisedStringTreeMap<>(false); public static class RecordedLauncherCallback { final private ControlLauncherCallback cb; final private String instructionId; final private ODLComponent callingComponent; final private ODLDatastore<? extends ODLTable> paramsDs; final private String reportTopLabel; public RecordedLauncherCallback(ControlLauncherCallback cb, String instructionId , ODLComponent callingComponent,ODLDatastore<? extends ODLTable> immutableParamsDs,String reportTopLabel) { super(); this.cb = cb; this.instructionId = instructionId; this.callingComponent = callingComponent; this.paramsDs = immutableParamsDs; this.reportTopLabel = reportTopLabel; } public ControlLauncherCallback getCb() { return cb; } public String getInstructionId() { return instructionId; } public ODLComponent getComponent(){ return callingComponent; } public ODLDatastore<? extends ODLTable> getParamsDs() { return paramsDs; } public String getReportTopLabel() { return reportTopLabel; } } ScriptsDependencyInjector(Window parentWindow, ODLApi api) { super(api); this.parentWindow = parentWindow; } @Override public ModalDialogResult showModalPanel(JPanel panel, String title, Dimension minSize, ModalDialogResult... buttons) { ModalDialog md = new ModalDialog(parentWindow, panel, title, buttons); if(minSize!=null){ md.setMinimumSize(minSize); } return showModal(md); } @Override public ModalDialogResult showModalPanel(JPanel panel, String title, ModalDialogResult... buttons) { return showModalPanel(panel, title, null, buttons); } @Override public <T extends JPanel & ClosedStatusObservable> void showModalPanel(T panel, String title) { final ModalDialog md = new ModalDialog(parentWindow, panel, title); ClosedStateListener listener = new ClosedStateListener(){ @Override public void onClosed() { md.dispose(); } }; panel.addClosedStatusListener(listener); try { showModal(md); } finally { panel.removeClosedStatusListener(listener); } } protected ModalDialogResult showModal(ModalDialog md) { return md.showModal(); } @Override public void addInstructionDependencies(String instructionId, DataDependencies dependencies) { DataDependencies found = dependenciesByInstructionId.get(instructionId); if(found==null){ // keep our own copy so we don't rely on it not being modified after calling this method found = new DataDependencies(dependencies); dependenciesByInstructionId.put(instructionId, found); }else{ found.add(dependencies); } } DataDependencies getDependenciesByInstructionId(String instructionId) { return dependenciesByInstructionId.get(instructionId); } // @Override // public JPanel getRegisteredPanel(final String instructionId, final String panelId) { // // class Found { // JPanel panel; // } // final Found found = new Found(); // // SwingUtils.runAndWaitOnEDT(new Runnable() { // // @Override // public void run() { // ReporterFrameIdentifier id = getReporterFrameId(instructionId, panelId); // ReporterFrame<?> rf = getReporterFrame(id); // if (rf != null) { // found.panel = rf.getUserPanel(); // } // } // }); // // return found.panel; // } @Override public void submitControlLauncher(String instructionId,ODLComponent component, ODLDatastore<? extends ODLTable> parametersTableCopy,String reportTopLabel, ControlLauncherCallback cb) { controlLauncherCallbacks.add(new RecordedLauncherCallback(cb, instructionId,component,parametersTableCopy,reportTopLabel)); } public List<RecordedLauncherCallback> getControlLauncherCallbacks() { return controlLauncherCallbacks; } // String getScriptName() { // return scriptName; // } // JDialog createProgressDialog(JFrame frame, String title, boolean showButtons){ // // return new ProgressDlg(frame, title, showButtons); // } }