/** * */ package de.urszeidler.shr5.ecp.service; import java.util.Date; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import org.eclipse.core.databinding.observable.Realm; import org.eclipse.emf.ecp.core.ECPProject; import org.eclipse.emf.edit.command.CommandParameter; import org.eclipse.emf.edit.command.SetCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.services.IServiceLocator; import de.urszeidler.eclipse.shr5.gameplay.CombatTurn; import de.urszeidler.eclipse.shr5.gameplay.Command; import de.urszeidler.eclipse.shr5.runtime.RuntimeCharacter; import de.urszeidler.shr5.ecp.Activator; import de.urszeidler.shr5.scripting.Placement; import de.urszeidler.shr5.scripting.Script; import de.urszeidler.shr5.scripting.ScriptingPackage; /** * @author urs */ public class ScriptServiceImpl implements ScriptService { protected static final String COMBAT_PERSPECTIVE = "de.urszeidler.shr5.product.application.CombatPerspective"; private Lock lock = new ReentrantLock(); private Script script; private Placement placement; private IServiceLocator locator; private ScriptViewer scriptViewer; private CombatViewer combatViewer; public ScriptServiceImpl(IServiceLocator locator) { this.locator = locator; } @Override public Script getCurrentScript() { return script; } @Override public void setScript(Script script) { this.script = script; if (scriptViewer != null) scriptViewer.setScript(script); } public Placement getPlacement() { return placement; } public void setPlacement(Placement placement) { this.placement = placement; if (script != null) { ECPProject defaultEcpProject = Activator.getDefault().getDefaultEcpProject(); EditingDomain editingDomain = defaultEcpProject.getEditingDomain(); org.eclipse.emf.common.command.Command createCommand = editingDomain.createCommand(SetCommand.class, new CommandParameter(script.getHistory(), ScriptingPackage.Literals.SCRIPT_HISTORY__CURRENT_PLACEMENT, placement)); editingDomain.getCommandStack().execute(createCommand); // script.getHistory().setCurrentPlacement(placement); } if (scriptViewer != null){ if (Realm.getDefault() == null) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { scriptViewer.setPlacement(ScriptServiceImpl.this.placement); } }); } else scriptViewer.setPlacement(placement); } } @Override public void sendMessage(RuntimeCharacter character, String message) { if (scriptViewer != null) scriptViewer.sendMessage(character, message); } @Override public void registerScriptViewer(ScriptViewer viewer) { this.scriptViewer = viewer; } @Override public void registerCombatViewer(CombatViewer viewer) { this.combatViewer = viewer; } @Override public void setCombatTurn(CombatTurn kr) { if (script.getHistory().getCommandStack().getCurrentCommand() instanceof CombatTurn) { CombatTurn ct = (CombatTurn)script.getHistory().getCommandStack().getCurrentCommand(); kr.setSequence(ct.getSequence() + 1); } else kr.setSequence(1); executeCommand(kr); if (combatViewer != null) combatViewer.setCombatTurn(kr); } @Override public void executeCommand(final Command command) { if (Realm.getDefault() == null) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { doExecution(command); } }); } else doExecution(command); } /** * @param command */ private void doExecution(Command command) { try { lock.lock(); if (script != null && script.getHistory() != null && script.getHistory().getCommandStack() != null) { if (placement != null) { Date actualDate = placement.getActualDate(); if (actualDate != null && command.getDate() == null) { command.setDate(actualDate); script.getHistory().setCurrentDate(actualDate); } } if (scriptViewer != null && scriptViewer.getCmdCallback() != null) command.setCmdCallback(scriptViewer.getCmdCallback()); script.getHistory().getCommandStack().setCurrentCommand(command); script.getHistory().getCommandStack().redo(); } } finally { lock.unlock(); } } @Override public ScriptViewer getScriptViewer() { return scriptViewer; } }