package de.urszeidler.shr5.ecp.editor; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.databinding.observable.IObservable; import org.eclipse.core.databinding.observable.list.IObservableList; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator; import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; import org.eclipse.emf.edit.provider.ItemPropertyDescriptor; import org.eclipse.emf.edit.ui.celleditor.FeatureEditorDialog; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableList; import de.urszeidler.commons.functors.Transformer; import de.urszeidler.eclipse.shr5.AbstraktGegenstand; import de.urszeidler.eclipse.shr5.AbstraktPersona; import de.urszeidler.eclipse.shr5.Cyberware; import de.urszeidler.eclipse.shr5.CyberwareEnhancement; import de.urszeidler.eclipse.shr5.Fahrzeug; import de.urszeidler.eclipse.shr5.Identifiable; import de.urszeidler.eclipse.shr5.Koerpermods; import de.urszeidler.eclipse.shr5.MartialartStyle; import de.urszeidler.eclipse.shr5.Modifizierbar; import de.urszeidler.eclipse.shr5.PersonaFertigkeit; import de.urszeidler.eclipse.shr5.PersonaFertigkeitsGruppe; import de.urszeidler.eclipse.shr5.PersonaMartialartStyle; import de.urszeidler.eclipse.shr5.PersonaZauber; import de.urszeidler.eclipse.shr5.Shr5Factory; import de.urszeidler.eclipse.shr5.Shr5Package; import de.urszeidler.eclipse.shr5.ShrList; import de.urszeidler.eclipse.shr5.SourceBook; import de.urszeidler.eclipse.shr5.Vertrag; import de.urszeidler.eclipse.shr5.Zauber; import de.urszeidler.eclipse.shr5.util.AdapterFactoryUtil; import de.urszeidler.eclipse.shr5.util.ShadowrunTools; import de.urszeidler.eclipse.shr5Management.AttributeChange; import de.urszeidler.eclipse.shr5Management.Changes; import de.urszeidler.eclipse.shr5Management.CharacterDiary; import de.urszeidler.eclipse.shr5Management.CharacterGenerator; import de.urszeidler.eclipse.shr5Management.ManagedCharacter; import de.urszeidler.eclipse.shr5Management.PersonaChange; import de.urszeidler.eclipse.shr5Management.PersonaValueChange; import de.urszeidler.eclipse.shr5Management.Shr5RuleGenerator; import de.urszeidler.eclipse.shr5Management.Shr5managementFactory; import de.urszeidler.eclipse.shr5Management.Shr5managementPackage; import de.urszeidler.eclipse.shr5Management.TrainingsTime; import de.urszeidler.emf.commons.ui.dialogs.OwnChooseDialog; import de.urszeidler.emf.commons.ui.util.DefaultReferenceManager; import de.urszeidler.emf.commons.ui.util.FormbuilderEntry; import de.urszeidler.emf.commons.ui.util.NullObject; import de.urszeidler.shr5.ecp.dialogs.CreateAttributModifikatorDialog; import de.urszeidler.shr5.ecp.dialogs.FeatureEditorDialogMagazine; import de.urszeidler.shr5.ecp.dialogs.FeatureEditorDialogWert; import de.urszeidler.shr5.ecp.dialogs.FeatureEditorDialogWert.DialogType; import de.urszeidler.shr5.ecp.dialogs.GenericEObjectDialog; import de.urszeidler.shr5.ecp.dialogs.ReferenceValueDialog; import de.urszeidler.shr5.ecp.editor.pages.Messages; import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools; public class ShrReferenceManager extends DefaultReferenceManager { /** * */ private final AbstractShr5Editor shadowrunEditor; private EditingDomain editingDomain; public ShrReferenceManager(AbstractShr5Editor shadowrunEditor, AdapterFactoryItemDelegator itemDelegator, EditingDomain editingDomain) { super(itemDelegator); this.shadowrunEditor = shadowrunEditor; this.editingDomain = editingDomain; } @Override public Object handleAdd(FormbuilderEntry e, EObject object) { Object handleAdd = super.handleAdd(e, object); if (handleAdd != null && handleAdd instanceof EObject) ShadowrunEditingTools.openEObject((EObject)handleAdd); return handleAdd; } public void handleManage(FormbuilderEntry e, EObject object) { if (Shr5managementPackage.Literals.FREE_STYLE_GENERATOR__SELECTED_TYPE.equals(e.getFeature())) { Collection<EClass> filteredEClasses = ShadowrunEditingTools.provideNewClassTypes(Shr5managementFactory.eINSTANCE.createPlayerCharacter(), Shr5managementPackage.Literals.MANAGED_CHARACTER__PERSONA, editingDomain); OwnChooseDialog dialog = new OwnChooseDialog(this.shadowrunEditor.getEditorSite().getShell(), filteredEClasses.toArray(new Object[]{}), Messages.ShadowrunEditor_dlg_select_type, Messages.ShadowrunEditor_dlg_select_persona_type); dialog.setLabelProvider(AdapterFactoryUtil.getInstance().getLabelProvider()); setSingleRefernceFromDialog(e, dialog); return; } else if (Shr5Package.Literals.GEBUNDENER_GEIST__GEIST.equals(e.getFeature()) || Shr5Package.Literals.SUBSTANCE_CONTAINER__SUBSTANCE.equals(e.getFeature()) || Shr5Package.Literals.QI_FOKUS__POWER.equals(e.getFeature()) || Shr5Package.Literals.ABTRAKT_GRANATE__CHEMICAL.equals(e.getFeature()) || Shr5Package.Literals.FAHRZEUG__SENSOR_ARRAY.equals(e.getFeature()) || Shr5Package.Literals.WEAPON_MOUNT__WEAPON.equals(e.getFeature())) { Object eGet = object.eGet(e.getFeature()); if(eGet!=null) if( MessageDialog.openQuestion(this.shadowrunEditor.getEditorSite().getShell(), "Open or change", String.format("Open %s for editing.",itemDelegator.getText(eGet)))){ ShadowrunEditingTools.openEObject((EObject)eGet); return; } EObject copyAddToPersona = handleCopySingleAddToPersona((EReference)e.getFeature(), object); if (copyAddToPersona != null) { IObservable observable = e.getObservable(); if (observable instanceof IObservableValue) { IObservableValue ov = (IObservableValue)e.getObservable(); ov.setValue(copyAddToPersona); } } return; } else if (Shr5Package.Literals.MAGAZIN__BULLETS.equals(e.getFeature())) { // super.handleManage(e, object); IItemPropertyDescriptor propertyDescriptor = itemDelegator.getPropertyDescriptor(object, e.getFeature()); List<?> values = (List<?>)propertyDescriptor.getChoiceOfValues(object); Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); FeatureEditorDialogWert featureEditorDialog = new FeatureEditorDialogMagazine(shell, this, object, e.getFeature(), "Manage magazine", values); int result = featureEditorDialog.open(); if (result == Window.OK) { EList<?> eList = featureEditorDialog.getResult(); IObservable observable = e.getObservable(); if (observable instanceof IObservableList) { IObservableList ol = (IObservableList)observable; ol.clear(); ol.addAll(eList); } } return; } else if (Shr5Package.Literals.FEUERWAFFE__MAGAZIN.equals(e.getFeature())) { IItemPropertyDescriptor propertyDescriptor = itemDelegator.getPropertyDescriptor(object, e.getFeature()); List<?> values = (List<?>)propertyDescriptor.getChoiceOfValues(object); Object[] choises = NullObject.toChoises(values); OwnChooseDialog dialog = new OwnChooseDialog(this.shadowrunEditor.getEditorSite().getShell(), choises, "Select the magazine", ""); dialog.setLabelProvider(AdapterFactoryUtil.getInstance().getLabelProvider()); setSingleRefernceFromDialog(e, dialog); return; } else if (Shr5Package.Literals.CYBER_IMPLANT_WEAPON__WEAPON.equals(e.getFeature())) { Object eGet = object.eGet(e.getFeature()); if(eGet!=null) if( MessageDialog.openQuestion(this.shadowrunEditor.getEditorSite().getShell(), "Open or change", String.format("Open %s for editing.",itemDelegator.getText(eGet)))){ ShadowrunEditingTools.openEObject((EObject)eGet); return; } EObject newWeapon = defaultCreationDialog(e, object); setValue(e, newWeapon); } else if (Shr5managementPackage.Literals.MODULE_SKILL_CHANGE__SKILL.equals(e.getFeature())) { Collection<EObject> objectsOfType = ItemPropertyDescriptor.getReachableObjectsOfType(object, Shr5Package.Literals.FERTIGKEIT); Object[] choises = NullObject.toChoises(objectsOfType); OwnChooseDialog dialog = new OwnChooseDialog(this.shadowrunEditor.getEditorSite().getShell(), choises, "Select skill", ""); dialog.setLabelProvider(AdapterFactoryUtil.getInstance().getLabelProvider()); setSingleRefernceFromDialog(e, dialog); return; } else if (Shr5managementPackage.Literals.CHARACTER_CHANGE__CHANGE.equals(e.getFeature())) { if (object instanceof TrainingsTime) { TrainingsTime tt = (TrainingsTime)object; if (tt.getDaysTrained() == 0) createTrainingsTimes(tt, e); return; } } internHandleManage(e, object); } /** * Creates a set of possible trainig times to choose from * * @param tt * @param e */ private void createTrainingsTimes(TrainingsTime tt, FormbuilderEntry e) { EObject eContainer = tt.eContainer(); if (eContainer instanceof CharacterDiary && eContainer.eContainer() instanceof ManagedCharacter) { final ManagedCharacter character = (ManagedCharacter)eContainer.eContainer(); AbstraktPersona p = character.getPersona(); List<EAttribute> orderedAttibutes = ShadowrunTools.getOrderedAttibutes(p); orderedAttibutes.remove(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE_BASIS); orderedAttibutes.remove(Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE_BASIS); ImmutableList<AttributeChange> list = FluentIterable.from(orderedAttibutes).filter(new Predicate<EAttribute>() { @Override public boolean apply(EAttribute input) { int base = (Integer)character.getPersona().getSpezies().eGet(ShadowrunTools.base2SpeciesMax(input)); Integer eGet = (Integer)character.getPersona().eGet(input); return 1 + eGet < base * 1.5; } }).transform(new Function<EAttribute, AttributeChange>() { @Override public AttributeChange apply(EAttribute input) { AttributeChange attributeChange = Shr5managementFactory.eINSTANCE.createAttributeChange(); attributeChange.setAttibute(input); Integer eGet = (Integer)character.getPersona().eGet(input); attributeChange.setFrom(eGet); attributeChange.setTo(eGet + 1); return attributeChange; } }).toList(); ImmutableList<PersonaChange> list2 = FluentIterable.from(p.getFertigkeitsGruppen()) .transform(new Function<PersonaFertigkeitsGruppe, PersonaChange>() { @Override public PersonaChange apply(PersonaFertigkeitsGruppe input) { PersonaChange attributeChange = Shr5managementFactory.eINSTANCE.createPersonaChange(); attributeChange.setChangeable(input); attributeChange.setFrom(input.getStufe()); attributeChange.setTo(input.getStufe() + 1); return attributeChange; } }).toList(); ImmutableList<PersonaChange> list3 = FluentIterable.from(p.getFertigkeiten()).transform(new Function<PersonaFertigkeit, PersonaChange>() { @Override public PersonaChange apply(PersonaFertigkeit input) { PersonaChange attributeChange = Shr5managementFactory.eINSTANCE.createPersonaChange(); attributeChange.setChangeable(input); attributeChange.setFrom(input.getStufe()); attributeChange.setTo(input.getStufe() + 1); return attributeChange; } }).toList(); // Collection<EObject> mss = ItemPropertyDescriptor.getReachableObjectsOfType(p, Shr5Package.Literals.MARTIALART_STYLE); // HashMap<Fertigkeit, List<MartialartStyle>> map = new HashMap<Fertigkeit, List<MartialartStyle>>(); // for (EObject eObject : mss) { // if (eObject instanceof MartialartStyle) { // MartialartStyle ms = (MartialartStyle)eObject; // EList<Fertigkeit> usableWith = ms.getUsableWith(); // for (Fertigkeit fertigkeit : usableWith) { // List<MartialartStyle> wl = map.get(fertigkeit); // if (wl == null) { // wl = new ArrayList<MartialartStyle>(); // map.put(fertigkeit, wl); // } // wl.add(ms); // } // } // } // FluentIterable.from(p.getFertigkeiten()).filter(type) ArrayList<PersonaValueChange> a = new ArrayList<PersonaValueChange>(); a.addAll(list); a.addAll(list2); a.addAll(list3); a.add(Shr5managementFactory.eINSTANCE.createPersonaMartialArtChange()); Object[] choises = NullObject.toChoises(a); OwnChooseDialog dialog = new OwnChooseDialog(this.shadowrunEditor.getEditorSite().getShell(), choises, "Select Training", ""); dialog.setLabelProvider(AdapterFactoryUtil.getInstance().getLabelProvider()); PersonaValueChange singleRefernceFromDialog = (PersonaValueChange)getSingleRefernceFromDialog(dialog); if (singleRefernceFromDialog == null) return; Changes oldChanges = tt.getChange(); setValue(e, singleRefernceFromDialog); character.getChanges().remove(oldChanges); character.getChanges().add(singleRefernceFromDialog); } } /** * Set the value to the formbuilder entry. * * @param e * @param dialog * @return */ protected Object getSingleRefernceFromDialog(OwnChooseDialog dialog) { int open = dialog.open(); if (open == Dialog.OK) { Object[] result = dialog.getResult(); if (result.length > 0) return result[0]; } return null; } /** * Set the value to the formbuilder entry. * * @param e * @param dialog */ protected void setSingleRefernceFromDialog(FormbuilderEntry e, OwnChooseDialog dialog) { setValue(e, getSingleRefernceFromDialog(dialog)); } /** * @param e * @param value */ private void setValue(FormbuilderEntry e, Object value) { IObservable observable = e.getObservable(); if (observable instanceof IObservableValue) { IObservableValue ov = (IObservableValue)e.getObservable(); ov.setValue(value); } } @SuppressWarnings("unchecked") @Override protected Object provideObject(FormbuilderEntry e, EObject object) { if (Shr5Package.Literals.MODIFIZIERBAR__MODS.equals(e.getFeature())) { de.urszeidler.eclipse.shr5.AttributModifikatorWert amw = Shr5Factory.eINSTANCE.createAttributModifikatorWert(); CreateAttributModifikatorDialog dialog = new CreateAttributModifikatorDialog(this.shadowrunEditor.getSite().getShell(), amw, (Modifizierbar)object, Messages.ShadowrunEditor_dlg_add_AttibuteModificator); if (dialog.open() == Dialog.OK) return amw; else return null; } else if (Shr5Package.Literals.KOERPER_PERSONA__KOERPER_MODS.equals(e.getFeature()) || Shr5Package.Literals.KOERPER_PERSONA__EIGENSCHAFTEN.equals(e.getFeature()) || Shr5Package.Literals.KI_ADEPT__KIKRAFT.equals(e.getFeature()) || Shr5Package.Literals.COMMLINK__STORED_PROGRAMS.equals(e.getFeature()) || Shr5Package.Literals.RIGGER_COMMAND_CONSOLE__STORED_PROGRAMS.equals(e.getFeature()) || Shr5Package.Literals.CYBERDECK__STORED_PROGRAMS.equals(e.getFeature()) || Shr5Package.Literals.LIFESTYLE__OPTIONS.equals(e.getFeature()) || Shr5Package.Literals.FAHRZEUG__MODIFIZIERUNGEN.equals(e.getFeature()) || Shr5Package.Literals.DROHNE__STORED_PROGRAMS.equals(e.getFeature()) || Shr5Package.Literals.CYBERWARE__EINBAU.equals(e.getFeature()) || Shr5Package.Literals.FEUERWAFFE__EINBAU.equals(e.getFeature()) || Shr5Package.Literals.KLEIDUNG__KMODS.equals(e.getFeature()) || Shr5managementPackage.Literals.MANAGED_CHARACTER__CONTRACTS.equals(e.getFeature()) || Shr5managementPackage.Literals.MANAGED_CHARACTER__VEHICELS.equals(e.getFeature()) || Shr5managementPackage.Literals.MANAGED_CHARACTER__INVENTAR.equals(e.getFeature())) { return handleCopyAddToPersona((EReference)e.getFeature(), object); } else if (Shr5managementPackage.Literals.PACK__ITEMS.equals(e.getFeature())) { Collection<EObject> collection = ItemPropertyDescriptor.getReachableObjectsOfType(object, ((EReference)e.getFeature()).getEType()); collection = filterProvidedObjects(collection); collection = FluentIterable .from(collection) .filter(Predicates.or(Predicates.instanceOf(Vertrag.class), Predicates.instanceOf(AbstraktGegenstand.class), Predicates.instanceOf(Koerpermods.class), Predicates.instanceOf(Fahrzeug.class))).toList(); ShrList basicList = Shr5Factory.eINSTANCE.createShrList(); FeatureEditorDialog dialog = new FeatureEditorDialogWert(this.shadowrunEditor.getSite().getShell(), AdapterFactoryUtil.getInstance() .getLabelProvider(), basicList, Shr5Package.Literals.SHR_LIST__ENTRIES, "Add to " + AdapterFactoryUtil.getInstance().getLabelProvider().getText(object), new ArrayList<EObject>(collection), object, DialogType.simple); return copyObjectsFromDialog(dialog); } else if (Shr5Package.Literals.ABSTRAKT_PERSONA__FERTIGKEITEN.equals(e.getFeature())) { Collection<EObject> objectsOfType = ItemPropertyDescriptor.getReachableObjectsOfType(object, Shr5Package.Literals.FERTIGKEIT); PersonaFertigkeit personaFertigkeit = Shr5Factory.eINSTANCE.createPersonaFertigkeit(); ReferenceValueDialog dialog = new ReferenceValueDialog(this.shadowrunEditor.getSite().getShell(), personaFertigkeit, Shr5Package.Literals.PERSONA_FERTIGKEIT__FERTIGKEIT, Shr5Package.Literals.STEIGERBAR__STUFE, objectsOfType.toArray()); if (dialog.open() == Dialog.OK) return personaFertigkeit; else return null; } else if (Shr5Package.Literals.ABSTRAKT_PERSONA__FERTIGKEITS_GRUPPEN.equals(e.getFeature())) { Collection<EObject> objectsOfType = ItemPropertyDescriptor.getReachableObjectsOfType(object, Shr5Package.Literals.FERTIGKEITS_GRUPPE); PersonaFertigkeitsGruppe personaFertigkeit = Shr5Factory.eINSTANCE.createPersonaFertigkeitsGruppe(); ReferenceValueDialog dialog = new ReferenceValueDialog(this.shadowrunEditor.getSite().getShell(), personaFertigkeit, Shr5Package.Literals.PERSONA_FERTIGKEITS_GRUPPE__GRUPPE, Shr5Package.Literals.STEIGERBAR__STUFE, objectsOfType.toArray()); if (dialog.open() == Dialog.OK) return personaFertigkeit; else return null; } else if (Shr5Package.Literals.ABSTRAKT_PERSONA__MARTIALART_STYLES.equals(e.getFeature())) { Collection<EObject> objectsOfType = ItemPropertyDescriptor.getReachableObjectsOfType(object, Shr5Package.Literals.MARTIALART_STYLE); return provideTransformendObjects(object, objectsOfType, ShadowrunEditingTools.martialArt2PersonaMartialArtTransformer()); } else if (Shr5Package.Literals.PERSONA_MARTIALART_STYLE__TECHNIQUES.equals(e.getFeature())) { if (object instanceof PersonaMartialartStyle) { PersonaMartialartStyle mt = (PersonaMartialartStyle)object; MartialartStyle technique = mt.getStyle(); if (technique != null) return provideTransformendObjects(object, new ArrayList<EObject>(technique.getTechniques()), ShadowrunEditingTools.martialArtTechnique2PersonaMartialArtTransformer()); } Collection<EObject> objectsOfType = ItemPropertyDescriptor.getReachableObjectsOfType(object, Shr5Package.Literals.MARTIALART_TECHNIQUE); return provideTransformendObjects(object, objectsOfType, ShadowrunEditingTools.martialArtTechnique2PersonaMartialArtTransformer()); } else if (Shr5Package.Literals.ZAUBERER__ZAUBER.equals(e.getFeature())) { Collection<EObject> objectsOfType = ItemPropertyDescriptor.getReachableObjectsOfType(object, Shr5Package.Literals.ZAUBER); ShrList basicList = Shr5Factory.eINSTANCE.createShrList(); Transformer<Zauber, PersonaZauber> transformer = ShadowrunEditingTools.zauber2PersonaZauberTransformer(); FeatureEditorDialog dialog = new FeatureEditorDialogWert(this.shadowrunEditor.getSite().getShell(), AdapterFactoryUtil.getInstance() .getLabelProvider(), basicList, Shr5Package.Literals.SHR_LIST__ENTRIES, Messages.ShadowrunEditor_dlg_select_spells, new ArrayList<EObject>(objectsOfType), 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((Zauber)object1)); } } return objectList; } } else if (Shr5managementPackage.Literals.MANAGED_CHARACTER__CONNECTIONS.equals(e.getFeature())) { final EClass type_lookup_class = Shr5managementPackage.Literals.MANAGED_CHARACTER; final EReference inner_feature = Shr5managementPackage.Literals.CONNECTION__CHARACTER; return provideInnerObject(e, object, type_lookup_class, inner_feature); } else if (Shr5Package.Literals.ZAUBERER__GEBUNDENE_GEISTER.equals(e.getFeature())) { final EClass type_lookup_class = Shr5Package.Literals.GEIST; final EReference inner_feature = Shr5Package.Literals.GEBUNDENER_GEIST__GEIST; return provideInnerObject(e, object, type_lookup_class, inner_feature); } // else if (Shr5Package.Literals.CREDSTICK__TRANSACTIONLOG.equals(e.getFeature())) { // // EClass eClass = (EClass)e.getFeature().getEType();// .eClass(); // // Collection<EObject> objectsOfType = ItemPropertyDescriptor.getReachableObjectsOfType(object, eClass); // EObject eObject = eClass.getEPackage().getEFactoryInstance().create(eClass); // Shr5managementFactory.eINSTANCE.createConnection(); // GenericEObjectDialog dialog = new GenericEObjectDialog(this.shadowrunEditor.getSite().getShell(), eObject, itemDelegator, this, this); // // if (dialog.open() == Dialog.OK) // return eObject; // else // return null; // } return defaultCreationDialog(e, object); } /** * @param object * @param objectsOfType * @param transformer * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) private List<EObject> provideTransformendObjects(EObject object, Collection<EObject> objectsOfType, Transformer transformer) { ShrList basicList = Shr5Factory.eINSTANCE.createShrList(); FeatureEditorDialog dialog = new FeatureEditorDialogWert(this.shadowrunEditor.getSite().getShell(), AdapterFactoryUtil.getInstance() .getLabelProvider(), basicList, Shr5Package.Literals.SHR_LIST__ENTRIES, Messages.ShadowrunEditor_dlg_select_spells, new ArrayList<EObject>(objectsOfType), 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((EObject)transformer.transform(object1)); } } return objectList; } return null; } /** * @param e * @param object * @param type_lookup_class * @param inner_feature * @return */ private Object provideInnerObject(FormbuilderEntry e, EObject object, final EClass type_lookup_class, final EReference inner_feature) { final EObject contextObject = object; EClass eClass = (EClass)e.getFeature().getEType(); EObject eObject = eClass.getEPackage().getEFactoryInstance().create(eClass); GenericEObjectDialog dialog = new GenericEObjectDialog(this.shadowrunEditor.getSite().getShell(), eObject, itemDelegator, this, new DefaultReferenceManager(itemDelegator) { @Override public void handleManage(FormbuilderEntry e, EObject object) { if (inner_feature.equals(e.getFeature())) { Collection<EObject> objectsOfType = ItemPropertyDescriptor.getReachableObjectsOfType(contextObject, type_lookup_class); OwnChooseDialog dialog = new OwnChooseDialog(Display.getCurrent().getActiveShell(), objectsOfType.toArray(new Object[]{}), "Choose connection", ""); dialog.setLabelProvider(AdapterFactoryUtil.getInstance().getLabelProvider()); setSingleRefernceFromDialog(e, dialog); } else super.handleManage(e, object); } }); if (dialog.open() == Dialog.OK) return eObject; else return null; } protected EObject defaultCreationDialog(FormbuilderEntry e, EObject object) { Collection<EClass> filteredEClasses = ShadowrunEditingTools.provideNewClassTypes(object, e.getFeature(), editingDomain);// provideNewClassTypes(object, // e.getFeature()); if (filteredEClasses.size() == 1) { EClass eClass = filteredEClasses.iterator().next(); return eClass.getEPackage().getEFactoryInstance().create(eClass); } OwnChooseDialog dialog = new OwnChooseDialog(this.shadowrunEditor.getEditorSite().getShell(), filteredEClasses.toArray(new Object[]{}), ShadowrunEditingTools.toFeatureName(object, e.getFeature()), ""); dialog.setLabelProvider(AdapterFactoryUtil.getInstance().getLabelProvider()); int open = dialog.open(); if (open == Dialog.OK) { Object[] result = dialog.getResult(); if (result.length > 0) { EClass eClass = (EClass)result[0]; return eClass.getEPackage().getEFactoryInstance().create(eClass); } } return null; } /** * Select one object and returns a copy. * * @param object_ref * @param orgObject * @return */ protected EObject handleCopySingleAddToPersona(EReference object_ref, EObject orgObject) { Collection<EObject> collection = ItemPropertyDescriptor.getReachableObjectsOfType(orgObject, object_ref.getEType()); collection = filterProvidedObjects(collection); OwnChooseDialog dialog = new OwnChooseDialog(this.shadowrunEditor.getEditorSite().getShell(), NullObject.toChoises(collection), String.format("Add a %s object.", ShadowrunEditingTools.toFeatureName(orgObject, object_ref)), ""); dialog.setLabelProvider(AdapterFactoryUtil.getInstance().getLabelProvider()); int result = dialog.open(); if (result == Window.OK) { Object[] list = dialog.getResult(); if (list != null && list.length == 1 && list[0] instanceof EObject) { EObject eo = (EObject)list[0]; EObject copy = copyWithParentId(eo); return copy; } } return null; } /** * Select a list of object for the feature and return a list of copied objects. * * @param object_ref * @param orgObject * @return */ protected List<EObject> handleCopyAddToPersona(EReference object_ref, EObject orgObject) { Collection<EObject> collection = ItemPropertyDescriptor.getReachableObjectsOfType(orgObject, object_ref.getEType()); collection = filterProvidedObjects(collection); ShrList basicList = Shr5Factory.eINSTANCE.createShrList(); FeatureEditorDialogWert dialog = new FeatureEditorDialogWert(this.shadowrunEditor.getSite().getShell(), AdapterFactoryUtil.getInstance() .getLabelProvider(), basicList, Shr5Package.Literals.SHR_LIST__ENTRIES, "Add " + AdapterFactoryUtil.getInstance().getLabelProvider().getText(object_ref), new ArrayList<EObject>(collection), orgObject); dialog.setIsUnique(false); return copyObjectsFromDialog(dialog); } /** * @param dialog * @return */ private List<EObject> copyObjectsFromDialog(FeatureEditorDialog dialog) { int result = dialog.open(); if (result == Window.OK) { EList<?> list = dialog.getResult(); List<EObject> objectList = new ArrayList<EObject>(); for (Object object : list) { if (object instanceof EObject) { EObject eo = (EObject)object; EObject copy = copyWithParentId(eo); objectList.add(copy); } } return objectList; } return null; } public Collection<EObject> filterProvidedObjects(Collection<EObject> collection) { EObject theEObject = shadowrunEditor.getEObject(); FluentIterable<EObject> fluentIterable = FluentIterable.from(collection); // filter the cyberwaretypes if (theEObject instanceof Cyberware) { final Cyberware cw = (Cyberware)theEObject; fluentIterable = fluentIterable.filter(new Predicate<EObject>() { @Override public boolean apply(EObject input) { if (input instanceof CyberwareEnhancement) { CyberwareEnhancement ce = (CyberwareEnhancement)input; return ce.getType().equals(cw.getType()); } return true; } }); } // filter the allowed sources if (theEObject instanceof CharacterGenerator) { CharacterGenerator<?> generatorSrc = (CharacterGenerator<?>)theEObject; if (generatorSrc instanceof Shr5RuleGenerator) { Shr5RuleGenerator<?> srg = (Shr5RuleGenerator<?>)generatorSrc; EList<SourceBook> allowedSources = srg.getAllowedSources(); if (!allowedSources.isEmpty()) fluentIterable = fluentIterable.filter(ShadowrunTools.allowedSourcePredicate(allowedSources)); // return FluentIterable.from(collection).filter(ShadowrunTools.allowedSourcePredicate(allowedSources)).toList(); } } // if (theEObject instanceof CharacterGenerator) { // CharacterGenerator<?> generatorSrc = (CharacterGenerator<?>)theEObject; // if (generatorSrc instanceof Shr5RuleGenerator) { // Shr5RuleGenerator srg = (Shr5RuleGenerator)generatorSrc; // EList<SourceBook> allowedSources = srg.getAllowedSources(); // if (!allowedSources.isEmpty()) // return FluentIterable.from(collection).filter(ShadowrunTools.allowedSourcePredicate(allowedSources)).toList(); // } // } return fluentIterable.toList(); // collection; } /** * Creates a copy of the eobject, when it is an {@link Identifiable} the parent id will be set to the id of the org object when the org object has * no parentId set. So the copied object has the org id as parentId or the parentId. * * @param eo the org {@link EObject} * @return the copy */ public static EObject copyWithParentId(EObject eo) { return ShadowrunEditingTools.copyWithParentId(eo); } /* * (non-Javadoc) * * @seede.urszeidler.emf.commons.ui.util.EmfFormBuilder.ReferenceManager# * handleManage(de.urszeidler.emf.commons.ui.util.EmfFormBuilder.Entry, * org.eclipse.emf.ecore.EObject) */ public void internHandleManage(FormbuilderEntry e, EObject object) { IItemPropertyDescriptor propertyDescriptor = itemDelegator.getPropertyDescriptor(object, e.getFeature()); List<?> values = (List<?>) propertyDescriptor.getChoiceOfValues(object); // ManagedCharacter containedInCharacter = ShadowrunManagmentTools.getContainedInCharacter(object); // if(containedInCharacter!=null) // values = FluentIterable.from(values).filter(EObject.class).filter(ShadowrunManagmentTools.containedInCharaterPredicate(containedInCharacter)).toList(); Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); if (e.getFeature() instanceof EReference) { EReference ref = (EReference) e.getFeature(); if (ref.isContainment()) { } else { if (ref.isMany()) { handleManyFeature(e, object, values, shell); } else { handleSingleReference(e, values, shell); } } } else if (e.getFeature() instanceof EAttribute) { EAttribute att = (EAttribute) e.getFeature(); if (att.isMany()) handleManyFeature(e, object, values, shell); else handleSingleReference(e, values, shell); } } private void handleManyFeature(FormbuilderEntry e, EObject object, List<?> values, Shell shell) { FeatureEditorDialog featureEditorDialog = new FeatureEditorDialogWert( shell, AdapterFactoryUtil.getInstance().getLabelProvider(), object, e.getFeature(), "", values,object); int result = featureEditorDialog.open(); if (result == Window.OK) { EList<?> eList = featureEditorDialog.getResult(); IObservable observable = e.getObservable(); if (observable instanceof IObservableList) { IObservableList ol = (IObservableList) observable; ol.clear(); ol.addAll(eList); } else if (observable instanceof IObservableValue) { IObservableValue ov = (IObservableValue) observable; } } } }