package de.urszeidler.shr5.scripting.ui.handlers; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import org.eclipse.core.commands.AbstractHandler; import org.eclipse.core.commands.ExecutionEvent; import org.eclipse.core.commands.ExecutionException; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.ItemPropertyDescriptor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.WorkbenchException; import org.eclipse.ui.handlers.HandlerUtil; import org.eclipse.ui.internal.WorkbenchWindow; import com.google.common.collect.Collections2; import de.urszeidler.commons.functors.Predicate; import de.urszeidler.eclipse.shr5.gameplay.GameplayFactory; import de.urszeidler.eclipse.shr5.runtime.RuntimeFactory; import de.urszeidler.eclipse.shr5.runtime.RuntimePackage; import de.urszeidler.eclipse.shr5.runtime.Team; import de.urszeidler.eclipse.shr5.util.AdapterFactoryUtil; import de.urszeidler.eclipse.shr5Management.GeneratorState; import de.urszeidler.eclipse.shr5Management.ManagedCharacter; import de.urszeidler.eclipse.shr5Management.Shr5managementPackage; import de.urszeidler.eclipse.shr5Management.util.ShadowrunManagmentTools; import de.urszeidler.emf.commons.ui.dialogs.OwnChooseDialog; import de.urszeidler.shr5.ecp.dialogs.FeatureEditorDialogWert; import de.urszeidler.shr5.ecp.dialogs.FeatureEditorDialogWert.DialogType; import de.urszeidler.shr5.ecp.handlers.Messages; import de.urszeidler.shr5.ecp.handlers.OpenObjectHandler; import de.urszeidler.shr5.ecp.service.ScriptService; import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools; import de.urszeidler.shr5.scripting.Placement; import de.urszeidler.shr5.scripting.Script; import de.urszeidler.shr5.scripting.ScriptingFactory; import de.urszeidler.shr5.scripting.ui.wizards.CombatScriptWizard; import de.urszeidler.shr5.webserver.Activator; import de.urszeidler.shr5.webserver.mgnt.ServerStatusDialog; /** * Our sample handler extends AbstractHandler, an IHandler base class. * * @see org.eclipse.core.commands.IHandler * @see org.eclipse.core.commands.AbstractHandler */ public class ScriptHandler extends AbstractHandler { private static final String START_WEBSERVER_DEFAULT = "START_WEBSERVER_DEFAULT";//$NON-NLS-1$ private ScriptService scriptService; /** * The constructor. */ public ScriptHandler() { } /** * the command has been executed, so extract extract the needed information * from the application context. */ public Object execute(ExecutionEvent event) throws ExecutionException { final String parameter = event.getParameter("de.urszeidler.shr5.webserver.webserver"); //$NON-NLS-1$ IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event); final Shell shell = window.getShell(); scriptService = (ScriptService)window.getService(ScriptService.class); if (parameter.equals("start")) {//$NON-NLS-1$ startWebserver(shell, scriptService); } else if (parameter.equals("stop")) {//$NON-NLS-1$ try { Activator.getDefault().cleanScriptWrapper(); Activator.getDefault().stopJetty(); setStatusMessage(de.urszeidler.shr5.scripting.ui.Messages.ScriptHandler_serverStopped_status_msg); } catch (Exception e) { Activator.logError("Could not stop jetty", e);//$NON-NLS-1$ } } else if (parameter.equals("manage")) {//$NON-NLS-1$ try { ServerStatusDialog serverStatusDialog = new ServerStatusDialog(shell); serverStatusDialog.open(); } catch (Exception e) { Activator.logError("Could not stop jetty", e);//$NON-NLS-1$ } } else if (parameter.equals("combat")) {//$NON-NLS-1$ CombatScriptWizard wizard = new CombatScriptWizard(); wizard.init(window.getWorkbench(), null); WizardDialog dialog = new WizardDialog(shell, wizard); dialog.create(); dialog.open(); return null; } else if (parameter.equals("openScript")) {//$NON-NLS-1$ openScript(shell, Messages.OpenObjectHandler_openScrip_titel, Messages.OpenObjectHandler_openScrip_message, false); } else if (parameter.equals("playScript")) {//$NON-NLS-1$ openScript(shell, Messages.OpenObjectHandler_playScript_titel, Messages.OpenObjectHandler_playScript_message, true); } return null; } /** * @param shell */ private static void startWebserver(final Shell shell, ScriptService scriptService) { try { if (scriptService.getCurrentScript() == null) { MessageBox messageBox = new MessageBox(shell); messageBox.setMessage(de.urszeidler.shr5.scripting.ui.Messages.ScriptHandler_no_script_started_dlg); messageBox.open(); return; } if (Activator.getDefault().getScriptViewerWrapper() != null) { MessageBox messageBox = new MessageBox(shell); messageBox.setMessage(de.urszeidler.shr5.scripting.ui.Messages.ScriptHandler_server_scrip_started_dlg); messageBox.open(); return; } Activator.getDefault().startJetty(); Activator.getDefault().setScriptService(scriptService); setStatusMessage(de.urszeidler.shr5.scripting.ui.Messages.ScriptHandler_server_scriptStarted_status_msg); } catch (Exception e) { Activator.logError("Could not start jetty", e);//$NON-NLS-1$ } } private void openScript(Shell shell, String titel, String message/* , IProgressMonitor monitor */, boolean start) { EditingDomain editingDomain = de.urszeidler.shr5.ecp.Activator.getDefault().getEdtingDomain(); Collection<EObject> filteredObject = ShadowrunEditingTools.findAllObjects(editingDomain, new Predicate<Object>() { @Override public boolean evaluate(Object input) { if (input instanceof Script) { return true; } return false; } }); OwnChooseDialog dialog = new OwnChooseDialog(shell, filteredObject.toArray(new Object[]{}), titel, message); dialog.setLabelProvider(AdapterFactoryUtil.getInstance().getLabelProvider()); int open = dialog.open(); if (open == Dialog.OK) { Object[] result = dialog.getResult(); if (result.length > 0) { Script eo = (Script)result[0]; if (start) startScript(eo, shell, scriptService); else OpenObjectHandler.openOneObject(shell, Collections.singleton((EObject)eo), titel, message); } } } @SuppressWarnings("restriction") public static void setStatusMessage(String msg){ IWorkbenchWindow activeWorkbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (activeWorkbenchWindow instanceof WorkbenchWindow) { WorkbenchWindow w = (WorkbenchWindow)activeWorkbenchWindow; w.getStatusLineManager().setMessage(msg); } } public static void startScript(Script eo, Shell shell, ScriptService scriptService) { Placement placement = eo.getEntry(); if (eo.getHistory() == null || eo.getHistory().getCommandStack() == null) { if(!initalizeScript(eo, shell)) return; } else { if (MessageDialog.open(MessageDialog.QUESTION, shell, Messages.OpenObjectHandler_playScript_titel, Messages.OpenObjectHandler_playScript_continue, SWT.NONE)) placement = eo.getHistory().getCurrentPlacement(); else { eo.getPlayer().getMembers().clear(); if(!initalizeScript(eo, shell)) return; } } try { PlatformUI.getWorkbench().showPerspective(OpenObjectHandler.RUNTIME_PERSPECTIVE, PlatformUI.getWorkbench().getActiveWorkbenchWindow()); } catch (WorkbenchException e) { Activator.logError(e); } scriptService.setScript(eo); scriptService.setPlacement(placement); if (!Activator.getDefault().isStarted()) { IPreferenceStore store = de.urszeidler.shr5.scripting.ui.Activator.getDefault().getPreferenceStore(); String value = store.getString(START_WEBSERVER_DEFAULT); if (MessageDialogWithToggle.ALWAYS.equals(value)) { startWebserver(shell, scriptService); return; } if (MessageDialogWithToggle.NEVER.equals(value)) { return; } MessageDialogWithToggle open = MessageDialogWithToggle.open(MessageDialogWithToggle.QUESTION_WITH_CANCEL, shell, de.urszeidler.shr5.scripting.ui.Messages.ScriptHandler_startWebserver_dlg_titel, de.urszeidler.shr5.scripting.ui.Messages.ScriptHandler_startWebserver_dlg_msg, de.urszeidler.shr5.scripting.ui.Messages.ScriptHandler_startWebserver_dlg_daa, false, store, START_WEBSERVER_DEFAULT, SWT.NONE); if (open.getReturnCode() == 2){ startWebserver(shell, scriptService); } } } protected static boolean initalizeScript(Script eo, Shell shell) { eo.setHistory(ScriptingFactory.eINSTANCE.createScriptHistory()); if (eo.getHistory().getCommandStack() == null) { eo.getHistory().setCommandStack(GameplayFactory.eINSTANCE.createExecutionStack()); eo.getHistory().getCommandStack().setProtocol(GameplayFactory.eINSTANCE.createExecutionProtocol()); } Collection<? extends EObject> choiceOfValues = ItemPropertyDescriptor.getReachableObjectsOfType(eo, Shr5managementPackage.Literals.PLAYER_CHARACTER); eo.getPlayer().getMembers().clear(); FeatureEditorDialogWert dialog = new FeatureEditorDialogWert(shell, AdapterFactoryUtil.getInstance().getLabelProvider(), eo.getPlayer(), RuntimePackage.Literals.TEAM__MEMBERS, Messages.OpenObjectHandler_select_combatans, new ArrayList<EObject>(Collections2.filter( (Collection<ManagedCharacter>)choiceOfValues, ShadowrunManagmentTools.characterGeneratorStatePredicate(GeneratorState.COMMITED))), eo, DialogType.simple); int result = dialog.open(); if (result == Window.OK) { EList<?> list = dialog.getResult(); Team player = eo.getPlayer(); if (player == null) player = RuntimeFactory.eINSTANCE.createTeam(); player.getMembers().addAll( Collections2.transform((Collection<ManagedCharacter>)list, ShadowrunEditingTools.managedCharacter2RuntimeFunction())); return true; } return false; } }