/** * */ package de.urszeidler.shr5.runtime.ui.editor; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.provider.ItemPropertyDescriptor; import org.eclipse.emf.edit.ui.celleditor.FeatureEditorDialog; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.window.Window; import org.eclipse.ui.PartInitException; import com.google.common.collect.Collections2; import de.urszeidler.commons.functors.Transformer; import de.urszeidler.eclipse.shr5.Shr5Factory; import de.urszeidler.eclipse.shr5.Shr5Package; import de.urszeidler.eclipse.shr5.ShrList; import de.urszeidler.eclipse.shr5.runtime.GruntTeam; import de.urszeidler.eclipse.shr5.runtime.RuntimeCharacter; import de.urszeidler.eclipse.shr5.runtime.RuntimePackage; import de.urszeidler.eclipse.shr5.runtime.Team; import de.urszeidler.eclipse.shr5.runtime.util.RuntimeSwitch; 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.util.FormbuilderEntry; import de.urszeidler.shr5.ecp.dialogs.FeatureEditorDialogWert; import de.urszeidler.shr5.ecp.editor.AbstractShr5Editor; import de.urszeidler.shr5.ecp.editor.ShrEditingState; import de.urszeidler.shr5.ecp.editor.ShrReferenceManager; import de.urszeidler.shr5.ecp.editor.pages.BeschreibbarContainterPage; import de.urszeidler.shr5.ecp.editor.pages.DefaultEmfFormsPage; import de.urszeidler.shr5.ecp.editor.pages.Messages; import de.urszeidler.shr5.ecp.editor.pages.PrintPreviewPage; import de.urszeidler.shr5.ecp.editor.pages.VariousDescriptionPage; import de.urszeidler.shr5.ecp.editor.pages.character.AbstraktPersonaPage; import de.urszeidler.shr5.ecp.editor.pages.character.ManagedCharacterPage; import de.urszeidler.shr5.ecp.editor.pages.generator.AbstractGeneratorPage; import de.urszeidler.shr5.ecp.printer.ScriptPrinter; import de.urszeidler.shr5.ecp.util.DefaultLabelProvider; import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools; import de.urszeidler.shr5.runtime.ui.editor.pages.EObjectPage; import de.urszeidler.shr5.runtime.ui.editor.pages.PlacementPage; import de.urszeidler.shr5.runtime.ui.editor.pages.PlacementSimulationPage; import de.urszeidler.shr5.runtime.ui.editor.pages.RuntimeCharacterPage; import de.urszeidler.shr5.runtime.ui.editor.pages.ScriptPage; import de.urszeidler.shr5.runtime.ui.editor.pages.VariousPage; import de.urszeidler.shr5.scripting.Handout; import de.urszeidler.shr5.scripting.Placement; import de.urszeidler.shr5.scripting.Script; import de.urszeidler.shr5.scripting.ScriptHistory; import de.urszeidler.shr5.scripting.ScriptingPackage; import de.urszeidler.shr5.scripting.Scripts; import de.urszeidler.shr5.scripting.util.ScriptingSwitch; /** * @author urs */ public class RuntimeEditor extends AbstractShr5Editor { private static final String EMPTY = ""; //$NON-NLS-1$ private ShrEditingState editingMode = ShrEditingState.CUSTOM; public static final String id = "de.urszeidler.eclipse.shadowrun.presentation.editors.RuntimeEditorID"; //$NON-NLS-1$ private ILabelProvider defaultLabelProvider = new DefaultLabelProvider(); /** * @return */ protected ShrReferenceManager createReferenceManager() { return new ShrReferenceManager(this, AdapterFactoryUtil.getInstance().getItemDelegator(), getEditingDomain()) { @Override protected Object provideObject(FormbuilderEntry e, EObject object) { if (RuntimePackage.Literals.TEAM__MEMBERS.equals(e.getFeature())) { EClass type = Shr5managementPackage.Literals.MANAGED_CHARACTER; if(ScriptingPackage.Literals.SCRIPT__PLAYER.equals(object.eContainingFeature())) type = Shr5managementPackage.Literals.PLAYER_CHARACTER; Collection<? extends EObject> objectsOfType = ItemPropertyDescriptor.getReachableObjectsOfType(theEObject, type); ShrList basicList = Shr5Factory.eINSTANCE.createShrList(); Transformer<ManagedCharacter, RuntimeCharacter> transformer = ShadowrunEditingTools.managedCharacter2RuntimeTransformer(); FeatureEditorDialog dialog = new FeatureEditorDialogWert(getSite().getShell(), defaultLabelProvider, basicList, Shr5Package.Literals.SHR_LIST__ENTRIES, "Select members for the team.", new ArrayList<EObject>(Collections2.filter( (Collection<ManagedCharacter>)objectsOfType, ShadowrunManagmentTools.characterGeneratorStatePredicate(GeneratorState.COMMITED))), object); int result = dialog.open(); if (result == Window.OK) { EList<?> list = dialog.getResult(); List<EObject> objectList = new ArrayList<EObject>(); for (Object object1 : list) { if (object1 instanceof EObject) { objectList.add(transformer.transform((ManagedCharacter)object1)); } } return objectList; } else return null; } return defaultCreationDialog(e, object); } }; } @Override protected void addPages() { RuntimeSwitch<Object> runtimeSwitchEditor = new RuntimeSwitch<Object>() { @Override public Object caseRuntimeCharacter(RuntimeCharacter object) { try { addPage(new RuntimeCharacterPage(RuntimeEditor.this, EMPTY, defaultLabelProvider.getText(object.eClass()), object, editingDomain, manager)); if (object.getCharacter() != null) addPage(new ManagedCharacterPage(RuntimeEditor.this, AbstractGeneratorPage.PERSONA_INVENTAR, Messages.ShadowrunEditor_page_character, object.getCharacter(), editingDomain, manager)); if (object.getCharacter() != null && object.getCharacter().getPersona() != null) addPage(new AbstraktPersonaPage(RuntimeEditor.this, AbstractGeneratorPage.PERSONA, Messages.ShadowrunEditor_page_persona, object.getCharacter().getPersona(), editingDomain, manager)); } catch (PartInitException e) { logError("error creating SpeziesPage", e);//$NON-NLS-1$ } return null; } @Override public Object caseGruntTeam(GruntTeam object) { try { addPage(new VariousPage(RuntimeEditor.this, EMPTY, defaultLabelProvider.getText(object.eClass()), object, editingDomain, manager)); } catch (PartInitException e) { logError("error creating VariousPage", e);//$NON-NLS-1$ } return this; } @Override public Object caseTeam(Team object) { try { addPage(new BeschreibbarContainterPage(RuntimeEditor.this, EMPTY, defaultLabelProvider.getText(object.eClass()), object, editingDomain, manager, RuntimePackage.Literals.TEAM__MEMBERS)); } catch (PartInitException e) { logError("error creating FertigkeitPage", e);//$NON-NLS-1$ } return this; } }; // RuntimeSwitch<Object> runtimeSwitchView = new RuntimeSwitch<Object>(){ // // // }; // ScriptingSwitch<Object> scriptingSwitchView = new ScriptingSwitch<Object>() { @Override public Object caseScriptHistory(ScriptHistory object) { try { addPage(new EObjectPage(RuntimeEditor.this, EMPTY, defaultLabelProvider.getText(object.eClass()), object, editingDomain, manager)); } catch (PartInitException e) { logError("error creating EObjectPage", e);//$NON-NLS-1$ } return this; } @Override public Object caseScripts(Scripts object) { try { addPage(new EObjectPage(RuntimeEditor.this, EMPTY, defaultLabelProvider.getText(object.eClass()), object, editingDomain, manager)); } catch (PartInitException e) { logError("error creating EObjectPage", e);//$NON-NLS-1$ } return this; } @Override public Object caseScript(Script object) { try { addPage(new ScriptPage(RuntimeEditor.this, EMPTY, defaultLabelProvider.getText(object.eClass()), object, editingDomain, manager)); addPage(new PrintPreviewPage(RuntimeEditor.this, "id1", "script print", ScriptPrinter .getInstance().createPrintFactory(object))); } catch (PartInitException e) { logError("error creating ScriptPage", e);//$NON-NLS-1$ } return null; } @Override public Object casePlacement(Placement object) { try { addPage(new PlacementPage(RuntimeEditor.this, EMPTY, defaultLabelProvider.getText(object.eClass()), object, editingDomain, manager)); addPage(new PlacementSimulationPage(RuntimeEditor.this, EMPTY,"simulation", object, editingDomain, manager)); } catch (PartInitException e) { logError("error creating placement pages", e);//$NON-NLS-1$ } return null; } @Override public Object caseHandout(Handout object) { try { addPage(new VariousDescriptionPage(RuntimeEditor.this, EMPTY, defaultLabelProvider.getText(object.eClass()), object, editingDomain, manager)); } catch (PartInitException e) { logError("error creating VariousDescriptionPage pages", e);//$NON-NLS-1$ } return null; } }; if (editingMode == ShrEditingState.CUSTOM) { runtimeSwitchEditor.doSwitch(theEObject); scriptingSwitchView.doSwitch(theEObject); } try { addPage(new DefaultEmfFormsPage(RuntimeEditor.this, "Default_EMF_Form_Page", "default form", theEObject)); //$NON-NLS-1$ } catch (PartInitException e) { logError("error creating DefaultEmfFormsPage", e);//$NON-NLS-1$ } } }