/** * */ package de.urszeidler.shr5.ecp.editor.widgets; import org.eclipse.core.databinding.Binding; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.conversion.Converter; import org.eclipse.core.databinding.observable.value.ComputedValue; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.databinding.EMFObservables; import org.eclipse.emf.databinding.EMFUpdateValueStrategy; import org.eclipse.emf.databinding.edit.EMFEditObservables; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator; import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; import org.eclipse.jface.databinding.swt.ISWTObservableValue; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Spinner; import org.eclipse.ui.forms.widgets.FormToolkit; import de.urszeidler.eclipse.shr5.AbstraktPersona; import de.urszeidler.eclipse.shr5.BaseMagischePersona; import de.urszeidler.eclipse.shr5.Shr5Package; import de.urszeidler.eclipse.shr5.Spezies; import de.urszeidler.eclipse.shr5.Technomancer; import de.urszeidler.eclipse.shr5.Zauberer; import de.urszeidler.eclipse.shr5.util.AdapterFactoryUtil; import de.urszeidler.eclipse.shr5.util.ShadowrunTools; import de.urszeidler.eclipse.shr5Management.ManagedCharacter; import de.urszeidler.eclipse.shr5Management.util.ShadowrunManagmentTools; import de.urszeidler.shr5.ecp.binding.ModificatedAttributeLabelValue; import de.urszeidler.shr5.ecp.editor.pages.Messages; import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools; /** * A UI tollkit for personas * * @author urs */ public class PersonaUIToolkit { /** * Converts the int value to the float the essens represent. * * @author urs */ private final class EssenzConverter extends Converter { private EssenzConverter(Object fromType, Object toType) { super(fromType, toType); } @Override public Object convert(Object fromObject) { if (fromObject instanceof Integer) { return ShadowrunEditingTools.powerPointsToFloat((Integer)fromObject); // Integer v = (Integer) fromObject; // float f = v / 100; // return "" + f; } return null; } } protected AdapterFactoryItemDelegator itemDelegator = AdapterFactoryUtil.getInstance().getItemDelegator(); protected FormToolkit toolkit; protected DataBindingContext ctx; protected AbstraktPersona eObject; protected EditingDomain editingDomain; private boolean karmaMode = false; private ManagedCharacter character; public PersonaUIToolkit(DataBindingContext ctx, IObservableValue selection, AbstraktPersona object, EditingDomain editingDomain, FormToolkit toolkit) { super(); if (ctx == null) this.ctx = new DataBindingContext(); else this.ctx = ctx; // this.selection = selection; eObject = object; this.editingDomain = editingDomain; this.toolkit = toolkit; } public PersonaUIToolkit(DataBindingContext ctx, IObservableValue selection, ManagedCharacter character, EditingDomain editingDomain, FormToolkit toolkit) { super(); if (ctx == null) this.ctx = new DataBindingContext(); else this.ctx = ctx; // this.selection = selection; karmaMode = true; this.character = character; eObject = character.getPersona(); this.editingDomain = editingDomain; this.toolkit = toolkit; } private void createEssenzWidget(Composite client) { EAttribute attribute = Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__ESSENZ; getToolkit().createLabel(client, toFeatureName(attribute, eObject));// itemDelegator.getText(attribute)); Label text = getToolkit().createLabel(client, "");//$NON-NLS-1$ IObservableValue observeValue = createObservableValue(attribute); ISWTObservableValue observeEditable = SWTObservables.observeText(text); EMFUpdateValueStrategy updateStrategie1 = new EMFUpdateValueStrategy(); updateStrategie1.setConverter(new EssenzConverter(1, 1)); bindObservable(observeValue, observeEditable, updateStrategie1); // Binding binding = ctx.bindValue(observeEditable, observeValue, // updateStrategie1, updateStrategie1); // ctx.addBinding(binding); getToolkit().createLabel(client, ""); //$NON-NLS-1$ getToolkit().createLabel(client, "");//$NON-NLS-1$ } private void createAttributeWidget(final EAttribute basefeature, final EAttribute calcFeature, Composite client) { getToolkit().createLabel(client, toFeatureName(calcFeature, eObject));// itemDelegator.getText(calcFeature)); // final Text text = getToolkit().createText(client, "_", SWT.BORDER);//$NON-NLS-1$ final Spinner text = new Spinner(client, SWT.BORDER); GridData gd_spinner = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gd_spinner.widthHint = 40; text.setLayoutData(gd_spinner); getToolkit().adapt(text); getToolkit().paintBordersFor(text); text.setMinimum(0); setDefaultLayout(text); IObservableValue calcObserveValue = createObservableValue(calcFeature); EMFUpdateValueStrategy updateStrategie; if (karmaMode) updateStrategie = new EMFUpdateValueStrategy() { protected IStatus doSet(IObservableValue observableValue, Object value) { int aValue = ShadowrunManagmentTools.changeAttributeByAdvacement(character, basefeature, (Integer)value);// (Integer)value); text.setSelection(aValue); // text.setText(Integer.toString(aValue)); return Status.OK_STATUS; } }; else updateStrategie = new EMFUpdateValueStrategy(); final IObservableValue feature = bindTextFeature(text, basefeature, updateStrategie); ComputedValue computedValue = new ModificatedAttributeLabelValue(calcObserveValue, feature); Label label2 = getToolkit().createLabel(client, "");//$NON-NLS-1$ // setDefaultLayout(label2); bindObservable(computedValue, SWTObservables.observeText(label2)); final Spezies spezies = eObject.getSpezies(); if (ShadowrunTools.base2SpeciesMin(basefeature) != null && spezies != null) { text.setMinimum((Integer)spezies.eGet(ShadowrunTools.base2SpeciesMin(basefeature))); Label minMaxLabel = getToolkit().createLabel(client, ""); ComputedValue computedValue2 = new ComputedValue() { @Override protected Object calculate() { return String.format("[%s/%s]", spezies.eGet(ShadowrunTools.base2SpeciesMin(basefeature)), spezies.eGet(ShadowrunTools.base2SpeciesMax(basefeature))); } }; bindObservable(computedValue2, SWTObservables.observeText(minMaxLabel)); } } private IObservableValue bindTextFeature(Spinner spinner, EAttribute basefeature, EMFUpdateValueStrategy targetToModel) { IObservableValue observeWidget = WidgetProperties.selection().observe(spinner); IObservableValue observeValue = EMFEditObservables.observeValue(editingDomain, eObject, basefeature); Binding binding = ctx.bindValue(observeWidget, observeValue, targetToModel, new EMFUpdateValueStrategy()); ctx.addBinding(binding); return observeValue; } private void bindObservable(IObservableValue observeValue, ISWTObservableValue observeText) { bindObservable(observeValue, observeText, new EMFUpdateValueStrategy()); } /** * The the min width. * * @param text */ private void setDefaultLayout(Control text) { GridData gridData = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gridData.widthHint = 16; text.setLayoutData(gridData); } private void createAttributeWidgetRO(final EAttribute basefeature, final EAttribute calcFeature, Composite client) { getToolkit().createLabel(client, toFeatureName(calcFeature, eObject));// itemDelegator.getText(calcFeature)); Label text = getToolkit().createLabel(client, "__");//$NON-NLS-1$ setDefaultLayout(text); final IObservableValue feature = bindLabelFeature(text, basefeature, new EMFUpdateValueStrategy()); IObservableValue calcObserveValue = createObservableValue(calcFeature); ComputedValue computedValue = new ModificatedAttributeLabelValue(calcObserveValue, feature); Label label2 = getToolkit().createLabel(client, "");//$NON-NLS-1$ // setDefaultLayout(label2); bindObservable(computedValue, SWTObservables.observeText(label2)); label2 = getToolkit().createLabel(client, "");//$NON-NLS-1$ } private void createReaktionAttWidgets(EAttribute basefeature, EAttribute calcFeature, Composite client) { getToolkit().createLabel(client, toFeatureName(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__INITATIVE, eObject)); Label label = getToolkit().createLabel(client, "ini");//$NON-NLS-1$ setDefaultLayout(label); bindLabelFeature(label, Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__INITATIVE, new EMFUpdateValueStrategy()); final IObservableValue reaktWValue = createObservableValue(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__INITATIV_WUERFEL); ComputedValue computedValue = new ComputedValue() { @Override protected Object calculate() { return reaktWValue.getValue() + Messages.PersonaUIToolkit_dice; } }; Label label2 = getToolkit().createLabel(client, "");//$NON-NLS-1$ bindObservable(computedValue, SWTObservables.observeText(label2)); label2 = getToolkit().createLabel(client, "");//$NON-NLS-1$ } /** * Creates bound widget for the koeperlichen attributes. * * @param client */ public void createKoerperlicheAttributes(Composite client) { createAttributeWidget(Shr5Package.Literals.ABSTRAKT_PERSONA__KONSTITUTION_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__KONSTITUTION, client); createAttributeWidget(Shr5Package.Literals.ABSTRAKT_PERSONA__STAERKE_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__STAERKE, client); createAttributeWidget(Shr5Package.Literals.ABSTRAKT_PERSONA__GESCHICKLICHKEIT_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__GESCHICKLICHKEIT, client); createAttributeWidget(Shr5Package.Literals.ABSTRAKT_PERSONA__REAKTION_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__REAKTION, client); } /** * Creates bound widget for the koeperlichen attributes. * * @param client */ public void createKoerperlicheAttributesRO(Composite client) { createAttributeWidgetRO(Shr5Package.Literals.ABSTRAKT_PERSONA__KONSTITUTION_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__KONSTITUTION, client); createAttributeWidgetRO(Shr5Package.Literals.ABSTRAKT_PERSONA__STAERKE_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__STAERKE, client); createAttributeWidgetRO(Shr5Package.Literals.ABSTRAKT_PERSONA__GESCHICKLICHKEIT_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__GESCHICKLICHKEIT, client); createAttributeWidgetRO(Shr5Package.Literals.ABSTRAKT_PERSONA__REAKTION_BASIS, Shr5Package.Literals.KOERPERLICHE_ATTRIBUTE__REAKTION, client); } /** * Creates bound widget for the koeperlichen attributes. * * @param client */ public void createLimits(Composite client) { createAttributeWidgetRO(Shr5Package.Literals.CHRAKTER_LIMITS__KOERPERLICH, Shr5Package.Literals.CHRAKTER_LIMITS__KOERPERLICH, client); createAttributeWidgetRO(Shr5Package.Literals.CHRAKTER_LIMITS__GEISTIG, Shr5Package.Literals.CHRAKTER_LIMITS__GEISTIG, client); createAttributeWidgetRO(Shr5Package.Literals.CHRAKTER_LIMITS__SOZIAL, Shr5Package.Literals.CHRAKTER_LIMITS__SOZIAL, client); } /** * Creates bound widget for the koeperlichen attributes. * * @param client */ public void createSpezielleAttributes(Composite client) { createEssenzWidget(client); createReaktionAttWidgets(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__INITATIVE, Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__INITATIVE, client); createAttributeWidgetRO(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__AUSWEICHEN, Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__AUSWEICHEN, client); createAttributeWidget(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE_BASIS, Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE_BASIS, client); createAttributeWidgetRO(Shr5Package.Literals.PANZERUNG__PANZER, Shr5Package.Literals.PANZERUNG__PANZER, client); if (eObject instanceof BaseMagischePersona) { createAttributeWidget(Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE_BASIS, Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE, client); } else if (eObject instanceof Technomancer) { createAttributeWidget(Shr5Package.Literals.RESONANZ_PERSONA__RESONANZ_BASIS, Shr5Package.Literals.RESONANZ_PERSONA__RESONANZ, client); } // if(eObject instanceof Zauberer) // createAttributeWidgetRO(Shr5Package.Literals.ZAUBERER__ENZUG, Shr5Package.Literals.ZAUBERER__ENZUG, client); } /** * Creates bound widget for the koeperlichen attributes. * * @param client */ public void createSpezielleAttributesRO(Composite client) { createEssenzWidget(client); createReaktionAttWidgets(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__INITATIVE, Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__INITATIVE, client); createAttributeWidgetRO(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__AUSWEICHEN, Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__AUSWEICHEN, client); createAttributeWidgetRO(Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE_BASIS, Shr5Package.Literals.SPEZIELLE_ATTRIBUTE__EDGE_BASIS, client); createAttributeWidgetRO(Shr5Package.Literals.PANZERUNG__PANZER, Shr5Package.Literals.PANZERUNG__PANZER, client); if (eObject instanceof BaseMagischePersona) { createAttributeWidgetRO(Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE_BASIS, Shr5Package.Literals.BASE_MAGISCHE_PERSONA__MAGIE, client); } else if (eObject instanceof Technomancer) { createAttributeWidgetRO(Shr5Package.Literals.RESONANZ_PERSONA__RESONANZ_BASIS, Shr5Package.Literals.RESONANZ_PERSONA__RESONANZ, client); } if (eObject instanceof Zauberer) createAttributeWidgetRO(Shr5Package.Literals.ZAUBERER__ENZUG, Shr5Package.Literals.ZAUBERER__ENZUG, client); } /** * Creates bound widget for the koeperlichen attributes. * * @param client */ public void createGeistigeAttributes(Composite client) { createAttributeWidget(Shr5Package.Literals.ABSTRAKT_PERSONA__CHARISMA_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__CHARISMA, client); createAttributeWidget(Shr5Package.Literals.ABSTRAKT_PERSONA__WILLENSKRAFT_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__WILLENSKRAFT, client); createAttributeWidget(Shr5Package.Literals.ABSTRAKT_PERSONA__INTUITION_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__INTUITION, client); createAttributeWidget(Shr5Package.Literals.ABSTRAKT_PERSONA__LOGIK_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__LOGIK, client); } /** * Creates bound widget for the koeperlichen attributes. * * @param client */ public void createGeistigeAttributesRO(Composite client) { createAttributeWidgetRO(Shr5Package.Literals.ABSTRAKT_PERSONA__CHARISMA_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__CHARISMA, client); createAttributeWidgetRO(Shr5Package.Literals.ABSTRAKT_PERSONA__WILLENSKRAFT_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__WILLENSKRAFT, client); createAttributeWidgetRO(Shr5Package.Literals.ABSTRAKT_PERSONA__INTUITION_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__INTUITION, client); createAttributeWidgetRO(Shr5Package.Literals.ABSTRAKT_PERSONA__LOGIK_BASIS, Shr5Package.Literals.GEISTIGE_ATTRIBUTE__LOGIK, client); } // private IObservableValue bindTextFeature(Text text, EAttribute feature, EMFUpdateValueStrategy updateStrategie, // EMFUpdateValueStrategy targetToModel) { // IObservableValue observeValue = createObservableValue(feature); // ISWTObservableValue observeEditable = SWTObservables.observeText(text, SWT.Modify); // Binding binding = ctx.bindValue(observeEditable, observeValue, targetToModel, updateStrategie); // ctx.addBinding(binding); // // return observeValue; // // } /** * binds a label to the feature * * @param formText * @return */ private IObservableValue bindLabelFeature(Label formText, EStructuralFeature feature, EMFUpdateValueStrategy updateStrategie) { IObservableValue observeValue = createObservableValue(feature); ISWTObservableValue observeEditable = SWTObservables.observeText(formText); bindObservable(observeValue, observeEditable, updateStrategie); return observeValue; } /** * create an observable for a feature, uses the selection if there is one, * or the editing Domain * * @param feature * @return */ private IObservableValue createObservableValue(EStructuralFeature feature) { if (editingDomain != null) return EMFEditObservables.observeValue(editingDomain, eObject, feature); return EMFObservables.observeValue(ctx.getValidationRealm(), eObject, feature); } /** * @param observeValue * @param observeEditable * @param aUpdateStrategie */ private void bindObservable(IObservableValue observeValue, ISWTObservableValue observeEditable, UpdateValueStrategy aUpdateStrategie) { Binding binding = ctx.bindValue(observeEditable, observeValue, new EMFUpdateValueStrategy(), aUpdateStrategie); ctx.addBinding(binding); } private FormToolkit getToolkit() { return toolkit; } /** * Returns the localized feature name. * * @param e * @param object * @return */ private String toFeatureName(EStructuralFeature feature, final EObject object) { IItemPropertyDescriptor propertyDescriptor = itemDelegator.getPropertyDescriptor(object, feature); String displayName = propertyDescriptor.getDisplayName(feature); return displayName; } }