package de.urszeidler.shr5.ecp.editor.pages.character; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.observable.ChangeEvent; import org.eclipse.core.databinding.observable.IChangeListener; import org.eclipse.core.databinding.observable.IObservable; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.ItemPropertyDescriptor; import org.eclipse.emf.edit.ui.celleditor.FeatureEditorDialog; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.databinding.viewers.IViewerObservableList; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.events.ExpansionEvent; import org.eclipse.ui.forms.events.IExpansionListener; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.wb.swt.ResourceManager; import de.urszeidler.commons.functors.Transformer; import de.urszeidler.eclipse.shr5.AbstraktPersona; import de.urszeidler.eclipse.shr5.AspektMagier; import de.urszeidler.eclipse.shr5.Erlernbar; import de.urszeidler.eclipse.shr5.KiAdept; import de.urszeidler.eclipse.shr5.KoerperPersona; 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.Technomancer; import de.urszeidler.eclipse.shr5.Zauber; import de.urszeidler.eclipse.shr5.Zauberer; import de.urszeidler.eclipse.shr5.util.AdapterFactoryUtil; import de.urszeidler.eclipse.shr5Management.ManagedCharacter; import de.urszeidler.eclipse.shr5Management.util.ShadowrunManagmentTools; import de.urszeidler.emf.commons.ui.util.DefaultReferenceManager; import de.urszeidler.emf.commons.ui.util.EmfFormBuilder.ReferenceManager; import de.urszeidler.emf.commons.ui.util.FormbuilderEntry; import de.urszeidler.shr5.ecp.dialogs.FeatureEditorDialogWert; import de.urszeidler.shr5.ecp.editor.pages.AbstractShr5Page; import de.urszeidler.shr5.ecp.editor.pages.Messages; import de.urszeidler.shr5.ecp.editor.widgets.BeschreibbarWidget; import de.urszeidler.shr5.ecp.editor.widgets.PersonaFertigkeitenWidget; import de.urszeidler.shr5.ecp.editor.widgets.PersonaUIToolkit; import de.urszeidler.shr5.ecp.editor.widgets.TreeTableWidget; import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools; public class AbstraktPersonaPage extends AbstractShr5Page<AbstraktPersona> { private AbstraktPersona object = Shr5Factory.eINSTANCE.createMysticAdept(); private ManagedCharacter character; private EditingDomain editingDomain; private DataBindingContext m_bindingContext; private Composite compositeEigenschaften; private Composite compositeWares; private WritableValue filter = new WritableValue("", String.class); //$NON-NLS-1$ private ReferenceManager karmaBaseManager = new DefaultReferenceManager(AdapterFactoryUtil.getInstance().getItemDelegator()) { @Override protected Object provideObject(FormbuilderEntry e, EObject object) { if (Shr5Package.Literals.ZAUBERER__ZAUBER.equals(e.getFeature())) { Transformer<Zauber, PersonaZauber> transformer = ShadowrunEditingTools.zauber2PersonaZauberTransformer(); String displayName = Messages.ShadowrunEditor_dlg_select_spells; EClass zauber = Shr5Package.Literals.ZAUBER; return provideTransformedObject(object, transformer, displayName, zauber); } else if (Shr5Package.Literals.KOERPER_PERSONA__EIGENSCHAFTEN.equals(e.getFeature())) { Transformer<EObject, EObject> transformer = ShadowrunEditingTools.copyTransformer(); String displayName = Messages.AbstraktPersonaPage_dlg_select_quallities; EClass quallity = Shr5Package.Literals.PERSONA_EIGENSCHAFT; return provideTransformedObject(object, transformer, displayName, quallity); } return null; } @Override public void handleRemove(FormbuilderEntry e, EObject object) { IObservable uiObservable = e.getUiObservable(); boolean remove = true; if (uiObservable instanceof IViewerObservableList) { IViewerObservableList vol = (IViewerObservableList)uiObservable; ISelection selection = vol.getViewer().getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection ss = (IStructuredSelection)selection; List<?> list = ss.toList(); for (Object object2 : list) { if (object2 instanceof Erlernbar) { remove &= ShadowrunManagmentTools.changeErlernbarByAdvacement(character, (Erlernbar)object2); } } } } if(remove) super.handleRemove(e, object); } /** * @param object the object to provide the child for * @param transformer the transformer * @param displayName text for the dialog * @param zauber */ @SuppressWarnings("rawtypes") private Object provideTransformedObject(EObject object, Transformer transformer, String displayName, EClass zauber) { Collection<EObject> objectsOfType = ItemPropertyDescriptor.getReachableObjectsOfType(object, zauber); ShrList basicList = Shr5Factory.eINSTANCE.createShrList(); FeatureEditorDialog dialog = new FeatureEditorDialogWert(getSite().getShell(), AdapterFactoryUtil.getInstance().getLabelProvider(), basicList, Shr5Package.Literals.SHR_LIST__ENTRIES, displayName, 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) { ShadowrunManagmentTools.changeErlernbarByAdvacement(character, (Erlernbar)transformer.transform((EObject)object1)); } } return objectList; } return null; } }; private Text text; /** * Create the form page. * * @param editor * @param id * @param title * @wbp.parser.constructor * @wbp.eval.method.parameter id "Some id" * @wbp.eval.method.parameter title "Some title" */ public AbstraktPersonaPage(FormEditor editor, String id, String title) { super(editor, id, title); this.object = Shr5Factory.eINSTANCE.createKiAdept(); } public AbstraktPersonaPage(FormEditor editor, String id, String title, AbstraktPersona object, EditingDomain editingDomain, ReferenceManager manager) { super(editor, id, title, manager); this.object = object; this.editingDomain = editingDomain; } public AbstraktPersonaPage(FormEditor editor, String id, String title, ManagedCharacter character, EditingDomain editingDomain, ReferenceManager manager) { super(editor, id, title, manager); this.character = character; this.object = character.getPersona(); this.editingDomain = editingDomain; } /** * Create contents of the form. * * @param managedForm */ @Override protected void createFormContent(IManagedForm managedForm) { FormToolkit toolkit = managedForm.getToolkit(); final ScrolledForm form = managedForm.getForm(); form.setText(AdapterFactoryUtil.getInstance().getLabelProvider().getText(object)); final Composite body = form.getBody(); toolkit.decorateFormHeading(form.getForm()); toolkit.paintBordersFor(body); body.setLayout(new GridLayout(1, false)); BeschreibbarWidget beschreibbarWidget = new BeschreibbarWidget(body, SWT.NONE, object, toolkit, editingDomain); beschreibbarWidget.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1)); toolkit.adapt(beschreibbarWidget); toolkit.paintBordersFor(beschreibbarWidget); Composite compositeMetaType = new Composite(body, SWT.NONE); compositeMetaType.setLayout(new GridLayout(3, false)); compositeMetaType.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); toolkit.adapt(compositeMetaType); toolkit.paintBordersFor(compositeMetaType); Section sctnAttributes = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TWISTIE | Section.TITLE_BAR); sctnAttributes.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); managedForm.getToolkit().paintBordersFor(sctnAttributes); sctnAttributes.setText(Messages.AbstraktPersonaPage_sctnAttributes_text); sctnAttributes.setExpanded(true); Composite grpAttribute = new Composite(sctnAttributes, SWT.NONE); sctnAttributes.setClient(grpAttribute); grpAttribute.setLayout(new GridLayout(4, true)); toolkit.adapt(grpAttribute); toolkit.paintBordersFor(grpAttribute); Group grpKrperlicheAttribute = new Group(grpAttribute, SWT.NONE); grpKrperlicheAttribute.setText(Messages.AbstraktPersonaPage_Body); grpKrperlicheAttribute.setToolTipText(Messages.AbstraktPersonaPage_Body_Attributes); grpKrperlicheAttribute.setLayout(new GridLayout(4, false)); grpKrperlicheAttribute.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); toolkit.adapt(grpKrperlicheAttribute); toolkit.paintBordersFor(grpKrperlicheAttribute); Group grpGeistigeAttribute = new Group(grpAttribute, SWT.NONE); grpGeistigeAttribute.setText(Messages.AbstraktPersonaPage_Mental); grpGeistigeAttribute.setToolTipText(Messages.AbstraktPersonaPage_Mental_Attributes); grpGeistigeAttribute.setLayout(new GridLayout(4, false)); grpGeistigeAttribute.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); toolkit.adapt(grpGeistigeAttribute); toolkit.paintBordersFor(grpGeistigeAttribute); Group grpSpezielleAttribute = new Group(grpAttribute, SWT.NONE); grpSpezielleAttribute.setText(Messages.AbstraktPersonaPage_Special); grpSpezielleAttribute.setToolTipText(Messages.AbstraktPersonaPage_Special_Attributes); grpSpezielleAttribute.setLayout(new GridLayout(4, false)); grpSpezielleAttribute.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); toolkit.adapt(grpSpezielleAttribute); toolkit.paintBordersFor(grpSpezielleAttribute); Group compositelimits = new Group(grpAttribute, SWT.NONE); compositelimits.setText(Messages.AbstraktPersonaPage_Limits); compositelimits.setToolTipText(Messages.AbstraktPersonaPage_The_Limits); compositelimits.setLayout(new GridLayout(4, false)); compositelimits.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); toolkit.adapt(compositelimits); toolkit.paintBordersFor(compositelimits); final Composite composite_1 = managedForm.getToolkit().createComposite(managedForm.getForm().getBody(), SWT.NONE); composite_1.setLayout(new FillLayout(SWT.HORIZONTAL)); final GridData gd_composite_1 = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); gd_composite_1.heightHint = 350; composite_1.setLayoutData(gd_composite_1); managedForm.getToolkit().paintBordersFor(composite_1); Section sctnSkill = managedForm.getToolkit().createSection(composite_1, Section.TWISTIE | Section.TITLE_BAR); sctnSkill.addExpansionListener(new IExpansionListener() { public void expansionStateChanged(ExpansionEvent e) { if (e.getState()) { gd_composite_1.heightHint = 350; form.reflow(true); } else { gd_composite_1.heightHint = 30; form.reflow(true); } } public void expansionStateChanging(ExpansionEvent e) { } }); Composite composite_2 = managedForm.getToolkit().createComposite(sctnSkill, SWT.NONE); sctnSkill.setDescriptionControl(composite_2); composite_2.setLayout(new GridLayout(3, false)); Label lblFilter = managedForm.getToolkit().createLabel(composite_2, Messages.AbstraktPersonaPage_lblFilter_text, SWT.NONE); lblFilter.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false, 1, 1)); managedForm.getToolkit().adapt(lblFilter, true, true); text = managedForm.getToolkit().createText(composite_2, "", SWT.BORDER); text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1)); Button button = managedForm.getToolkit().createButton(composite_2, "", SWT.PUSH); button.setToolTipText(Messages.AbstraktPersonaPage_button_toolTipText); button.setImage(ResourceManager.getPluginImage("de.urszeidler.shr5.ecp", "images/clear.gif")); button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { filter.setValue(""); } }); managedForm.getToolkit().paintBordersFor(sctnSkill); sctnSkill.setText(Messages.AbstraktPersonaPage_Fertigkeiten); sctnSkill.setExpanded(true); final PersonaFertigkeitenWidget personaFertigkeitenWidget; if (character == null) { personaFertigkeitenWidget = new PersonaFertigkeitenWidget(sctnSkill, SWT.NONE, object, toolkit, editingDomain); } else { personaFertigkeitenWidget = new PersonaFertigkeitenWidget(sctnSkill, SWT.NONE, character, toolkit, editingDomain); } filter.addChangeListener(new IChangeListener() { @Override public void handleChange(ChangeEvent event) { personaFertigkeitenWidget.setStringFilter((String)filter.getValue()); } }); // GridData gd_composite_1 = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); // gd_composite_1.heightHint = 200; // final PersonaFertigkeitenWidget = p; sctnSkill.setClient(personaFertigkeitenWidget); managedForm.getToolkit().adapt(personaFertigkeitenWidget); managedForm.getToolkit().paintBordersFor(personaFertigkeitenWidget); ToolBar toolBar = new ToolBar(sctnSkill, SWT.FLAT | SWT.RIGHT); // managedForm.getToolkit().adapt(toolBar); // managedForm.getToolkit().paintBordersFor(toolBar); sctnSkill.setTextClient(toolBar); final ToolItem filterOnlyPersonaSkillsToolItem = new ToolItem(toolBar, SWT.CHECK); filterOnlyPersonaSkillsToolItem.setToolTipText(Messages.AbstraktPersonaPage_filterOnlyPersonaSkillsToolItem_toolTipText); filterOnlyPersonaSkillsToolItem.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e) { personaFertigkeitenWidget.setFilterOnlyPersona(filterOnlyPersonaSkillsToolItem.getSelection()); } @Override public void widgetSelected(SelectionEvent e) { personaFertigkeitenWidget.setFilterOnlyPersona(filterOnlyPersonaSkillsToolItem.getSelection()); } }); filterOnlyPersonaSkillsToolItem.setImage(ResourceManager.getPluginImage("de.urszeidler.shr5.ecp", "images/toList.gif")); //$NON-NLS-1$ //$NON-NLS-2$ int height = 200; if (object instanceof KoerperPersona) { // Composite grpFertigkeitGruppe = new Composite(body, SWT.NONE); // grpFertigkeitGruppe.setLayout(new GridLayout(3, true)); // final GridData gd_grpFertigkeitGruppe = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1); // gd_grpFertigkeitGruppe.heightHint = height; // grpFertigkeitGruppe.setLayoutData(gd_grpFertigkeitGruppe); // toolkit.adapt(grpFertigkeitGruppe); // toolkit.paintBordersFor(grpFertigkeitGruppe); Composite grpFertigkeitGruppe = managedForm.getForm().getBody(); compositeEigenschaften = new Composite(grpFertigkeitGruppe, SWT.NONE); compositeEigenschaften.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); compositeEigenschaften.setLayout(new FillLayout(SWT.HORIZONTAL)); toolkit.adapt(compositeEigenschaften); toolkit.paintBordersFor(compositeEigenschaften); ReferenceManager mananger2 = mananger; if (character != null) mananger2 = karmaBaseManager; TreeTableWidget treeTableWidgetEigenschaften = new TreeTableWidget(compositeEigenschaften, Messages.AbstraktPersonaPage_sct_quallities, SWT.NONE, object, Shr5Package.Literals.KOERPER_PERSONA__EIGENSCHAFTEN, toolkit, mananger2, editingDomain, this,this); managedForm.getToolkit().adapt(treeTableWidgetEigenschaften); managedForm.getToolkit().paintBordersFor(treeTableWidgetEigenschaften); compositeWares = new Composite(grpFertigkeitGruppe, SWT.NONE); compositeWares.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); compositeWares.setLayout(new FillLayout(SWT.HORIZONTAL)); toolkit.adapt(compositeWares); toolkit.paintBordersFor(compositeWares); TreeTableWidget treeTableWidgetInventar = new TreeTableWidget(compositeWares, Messages.AbstraktPersonaPage_sct_Augmentation, SWT.NONE, object, Shr5Package.Literals.KOERPER_PERSONA__KOERPER_MODS, toolkit, mananger, editingDomain, this,this); managedForm.getToolkit().adapt(treeTableWidgetInventar); managedForm.getToolkit().paintBordersFor(treeTableWidgetInventar); Composite compositeWares1 = new Composite(grpFertigkeitGruppe, SWT.NONE); compositeWares1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); compositeWares1.setLayout(new FillLayout(SWT.HORIZONTAL)); toolkit.adapt(compositeWares1); toolkit.paintBordersFor(compositeWares1); treeTableWidgetInventar = new TreeTableWidget(compositeWares1, labelprovider.getText(Shr5Package.Literals.ABSTRAKT_PERSONA__MARTIALART_STYLES), SWT.NONE, object, Shr5Package.Literals.ABSTRAKT_PERSONA__MARTIALART_STYLES, toolkit, mananger, editingDomain, this,this); managedForm.getToolkit().adapt(treeTableWidgetInventar); managedForm.getToolkit().paintBordersFor(treeTableWidgetInventar); } if (object instanceof KiAdept) { Composite grpKikrfte = new Composite(body, SWT.NONE); grpKikrfte.setLayout(new FillLayout(SWT.HORIZONTAL)); GridData layoutData = new GridData(SWT.FILL, SWT.TOP, true, true, 1, 1); layoutData.minimumHeight = height; grpKikrfte.setLayoutData(layoutData); toolkit.adapt(grpKikrfte); toolkit.paintBordersFor(grpKikrfte); TreeTableWidget treeTableWidgetKiPower = new TreeTableWidget(grpKikrfte, Messages.AbstraktPersonaPage_KiPowers, SWT.NONE, object, Shr5Package.Literals.KI_ADEPT__KIKRAFT, toolkit, mananger, editingDomain, this,this); managedForm.getToolkit().adapt(treeTableWidgetKiPower); managedForm.getToolkit().paintBordersFor(treeTableWidgetKiPower); } if (object instanceof Zauberer) { Composite grpKikrfte = new Composite(body, SWT.NONE); grpKikrfte.setLayout(new FillLayout(SWT.HORIZONTAL)); GridData layoutData = new GridData(SWT.FILL, SWT.TOP, true, true, 1, 1); layoutData.minimumHeight = height; grpKikrfte.setLayoutData(layoutData); toolkit.adapt(grpKikrfte); toolkit.paintBordersFor(grpKikrfte); ReferenceManager mananger2 = mananger; if (character != null) mananger2 = karmaBaseManager; TreeTableWidget treeTableWidgetKiPower = new TreeTableWidget(grpKikrfte, Messages.AbstraktPersonaPage_Spells, SWT.NONE, object, Shr5Package.Literals.ZAUBERER__ZAUBER, toolkit, mananger2, editingDomain, this,this); managedForm.getToolkit().adapt(treeTableWidgetKiPower); managedForm.getToolkit().paintBordersFor(treeTableWidgetKiPower); treeTableWidgetKiPower = new TreeTableWidget(grpKikrfte, Messages.AbstraktPersonaPage_sct_bound_spririts, SWT.NONE, object, Shr5Package.Literals.ZAUBERER__GEBUNDENE_GEISTER, toolkit, mananger, editingDomain, this,this); managedForm.getToolkit().adapt(treeTableWidgetKiPower); managedForm.getToolkit().paintBordersFor(treeTableWidgetKiPower); } if (object instanceof Technomancer) { Composite grpKikrfte = new Composite(body, SWT.NONE); grpKikrfte.setLayout(new FillLayout(SWT.HORIZONTAL)); GridData layoutData = new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1); layoutData.minimumHeight = height; grpKikrfte.setLayoutData(layoutData); toolkit.adapt(grpKikrfte); toolkit.paintBordersFor(grpKikrfte); ReferenceManager mananger2 = mananger; if (character != null) mananger2 = karmaBaseManager; TreeTableWidget treeTableWidgetKiPower = new TreeTableWidget(grpKikrfte, Messages.AbstraktPersonaPage_sct_complex_forms, SWT.NONE, object, Shr5Package.Literals.TECHNOMANCER__COMPLEX_FORMS, toolkit, mananger2, editingDomain, this,this); managedForm.getToolkit().adapt(treeTableWidgetKiPower); managedForm.getToolkit().paintBordersFor(treeTableWidgetKiPower); } m_bindingContext = initDataBindings(); PersonaUIToolkit personaUIToolkit; if (character == null) { personaUIToolkit = new PersonaUIToolkit(m_bindingContext, null, object, editingDomain, toolkit); } else personaUIToolkit = new PersonaUIToolkit(m_bindingContext, null, character, editingDomain, toolkit); personaUIToolkit.createKoerperlicheAttributes(grpKrperlicheAttribute); personaUIToolkit.createGeistigeAttributes(grpGeistigeAttribute); personaUIToolkit.createSpezielleAttributes(grpSpezielleAttribute); personaUIToolkit.createLimits(compositelimits); createFormBuilder(managedForm); emfFormBuilder.addTextEntry(Messages.AbstraktPersonaPage_MethaType, Shr5Package.Literals.ABSTRAKT_PERSONA__SPEZIES, compositeMetaType); if (object instanceof Zauberer) { emfFormBuilder.addTextEntry(Shr5Package.Literals.ZAUBERER__TRADITION, compositeMetaType); } if (object instanceof AspektMagier) { emfFormBuilder.addTextEntry(Shr5Package.Literals.ASPEKT_MAGIER__ASPEKT, compositeMetaType); } emfFormBuilder.buildinComposite(m_bindingContext, body, object); // managedForm.getForm().pack(); managedForm.reflow(true); } @Override protected EditingDomain getEditingDomain() { return editingDomain; } protected DataBindingContext initDataBindings() { DataBindingContext bindingContext = new DataBindingContext(); // IObservableValue observeTextTextObserveWidget = WidgetProperties.text(SWT.Modify).observeDelayed(500, text); bindingContext.bindValue(observeTextTextObserveWidget, filter, null, null); // return bindingContext; } }