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.IObservableValue;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
import org.eclipse.emf.databinding.edit.EMFEditObservables;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.databinding.fieldassist.ControlDecorationSupport;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.widgets.FormToolkit;
import de.urszeidler.eclipse.shr5.AbstraktPersona;
import de.urszeidler.eclipse.shr5.KiAdept;
import de.urszeidler.eclipse.shr5.KiKraft;
import de.urszeidler.eclipse.shr5.MysticAdept;
import de.urszeidler.eclipse.shr5.Zauberer;
import de.urszeidler.eclipse.shr5Management.Adept;
import de.urszeidler.eclipse.shr5Management.ManagedCharacter;
import de.urszeidler.eclipse.shr5Management.Shr5managementPackage.Literals;
import de.urszeidler.eclipse.shr5Management.SpecialType;
import de.urszeidler.eclipse.shr5Management.Spellcaster;
import de.urszeidler.eclipse.shr5Management.Technomancer;
import de.urszeidler.shr5.ecp.editor.pages.Messages;
import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools;
public class MagicGeneratorOption extends Composite {
private static final String EMPTY = ""; //$NON-NLS-1$
private DataBindingContext m_bindingContext;
private FormToolkit toolkit;// = new FormToolkit(Display.getCurrent());
private SpecialType object;
private ManagedCharacter context;
private EditingDomain editingDomain;
private Label lblspend;
private Label lblleft;
private Label lblSpellSpend;
private Label lblSpellLeft;
private Label lblCFormSpend;
private Label lblCFormLeft;
private int minSize = 40;
private Label lblSpellSpend1;
private Label lblSpellLeft1;
/**
* Create the composite.
*
* @param parent
* @param style
*/
public MagicGeneratorOption(Composite parent, int style) {
super(parent, style);
toolkit = new FormToolkit(Display.getCurrent());
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
toolkit.dispose();
}
});
createWidgets();
}
/**
* The main contructor.
*
* @param parent
* @param style
* @param object
* @param context
* @param toolkit
* @param editingDomain
*/
public MagicGeneratorOption(Composite parent, int style, SpecialType object, ManagedCharacter context, FormToolkit toolkit,
EditingDomain editingDomain) {
super(parent, style);
this.toolkit = toolkit;
this.object = object;
this.context = context;
this.editingDomain = editingDomain;
createWidgets();
}
private void createWidgets() {
toolkit.adapt(this);
toolkit.paintBordersFor(this);
GridLayout gridLayout = new GridLayout(3, false);
gridLayout.horizontalSpacing = 10;
setLayout(gridLayout);
toolkit.createLabel(this, Messages.GeneratorOption_m_skills_spend, SWT.NONE);
lblspend = new Label(this, SWT.NONE);
GridData gd_lblspend = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblspend.widthHint = minSize;
lblspend.setLayoutData(gd_lblspend);
toolkit.adapt(lblspend, true, true);
lblspend.setText(Messages.GeneratorOption_spend_to_much);
lblleft = new Label(this, SWT.NONE);
GridData gd_lblleft = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblleft.widthHint = minSize;
lblleft.setLayoutData(gd_lblleft);
toolkit.adapt(lblleft, true, true);
lblleft.setText(EMPTY);
AbstraktPersona persona = context.getPersona();
if (persona instanceof KiAdept) {
toolkit.createLabel(this, Messages.GeneratorOption_kipower_spend, SWT.NONE);
lblSpellSpend1 = new Label(this, SWT.NONE);
toolkit.adapt(lblSpellSpend1, true, true);
lblSpellSpend1.setText(Messages.GeneratorOption_spend_to_much);
gd_lblleft = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblleft.widthHint = minSize;
lblSpellSpend1.setLayoutData(gd_lblleft);
lblSpellLeft1 = new Label(this, SWT.NONE);
toolkit.adapt(lblSpellLeft1, true, true);
lblSpellLeft1.setText(EMPTY);
gd_lblleft = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblleft.widthHint = minSize;
lblSpellLeft1.setLayoutData(gd_lblleft);
}
if (persona instanceof Zauberer) {
toolkit.createLabel(this, Messages.GeneratorOption_spells_spend, SWT.NONE);
lblSpellSpend = new Label(this, SWT.NONE);
toolkit.adapt(lblSpellSpend, true, true);
lblSpellSpend.setText(Messages.GeneratorOption_spend_to_much);
gd_lblleft = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblleft.widthHint = minSize;
lblSpellSpend.setLayoutData(gd_lblleft);
lblSpellLeft = new Label(this, SWT.NONE);
toolkit.adapt(lblSpellLeft, true, true);
lblSpellLeft.setText(EMPTY);
gd_lblleft = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblleft.widthHint = minSize;
lblSpellLeft.setLayoutData(gd_lblleft);
}
if (persona instanceof de.urszeidler.eclipse.shr5.Technomancer) {
toolkit.createLabel(this, Messages.GeneratorOption_complex_forms_spend, SWT.NONE);
lblCFormSpend = new Label(this, SWT.NONE);
toolkit.adapt(lblCFormSpend, true, true);
lblCFormSpend.setText(Messages.GeneratorOption_spend_to_much);
gd_lblleft = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblleft.widthHint = minSize;
lblCFormSpend.setLayoutData(gd_lblleft);
lblCFormLeft = new Label(this, SWT.NONE);
toolkit.adapt(lblCFormLeft, true, true);
lblCFormLeft.setText(EMPTY);
gd_lblleft = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblleft.widthHint = minSize;
lblCFormLeft.setLayoutData(gd_lblleft);
}
m_bindingContext = initDataBindings();
internalBinding(m_bindingContext);
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
//
//
return bindingContext;
}
private void internalBinding(DataBindingContext bindingContext) {
IObservableValue observeTextLblspendObserveWidget = WidgetProperties.text().observe(lblspend);
IObservableValue objectAttibutePointsSpendObserveValue = EMFEditObservables.observeValue(editingDomain, context.getChracterSource(),
Literals.SHR5_GENERATOR__KARMA_SPEND);
EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy();
modelToTarget.setConverter(new Converter(Integer.class, String.class) {
@Override
public Object convert(Object fromObject) {
int calcAttributesSpend = object.calcSkillsSpend(context);
return calcAttributesSpend + EMPTY;
}
});
bindingContext.bindValue(observeTextLblspendObserveWidget, objectAttibutePointsSpendObserveValue, new UpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER), modelToTarget);
//
IObservableValue observeTextLblleftObserveWidget = WidgetProperties.text().observe(lblleft);
IObservableValue objectAttibutePointsLeftObserveValue = EMFEditObservables.observeValue(editingDomain, context.getChracterSource(),
Literals.SHR5_GENERATOR__KARMA_SPEND);
modelToTarget = new EMFUpdateValueStrategy();
modelToTarget.setConverter(new Converter(Integer.class, String.class) {
@Override
public Object convert(Object fromObject) {
int calcAttributesSpend = object.calcSkillsSpend(context);
return (object.getSkillNumber() - calcAttributesSpend + EMPTY);
}
});
bindingContext.bindValue(observeTextLblleftObserveWidget, objectAttibutePointsLeftObserveValue, new UpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER), modelToTarget);
// --
AbstraktPersona persona = context.getPersona();
if (persona instanceof Zauberer) {
final Spellcaster sc = (Spellcaster)object;
observeTextLblspendObserveWidget = WidgetProperties.text().observe(lblSpellSpend);
objectAttibutePointsSpendObserveValue = EMFEditObservables.observeValue(editingDomain, context.getChracterSource(),
Literals.SHR5_GENERATOR__SPELL_POINT_SPEND);
modelToTarget = new EMFUpdateValueStrategy();
Binding bindValue = bindingContext.bindValue(observeTextLblspendObserveWidget, objectAttibutePointsSpendObserveValue,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER), modelToTarget);
ControlDecorationSupport.create(bindValue, SWT.TOP | SWT.LEFT);
//
observeTextLblleftObserveWidget = WidgetProperties.text().observe(lblSpellLeft);
objectAttibutePointsLeftObserveValue = EMFEditObservables.observeValue(editingDomain, context.getChracterSource(),
Literals.SHR5_GENERATOR__SPELL_POINT_SPEND);
modelToTarget = new EMFUpdateValueStrategy();
modelToTarget.setConverter(new Converter(Integer.class, String.class) {
@Override
public Object convert(Object fromObject) {
int calcAttributesSpend = sc.calcSpellPointsSpend(context);
return (((Spellcaster)object).getSpellPoints() - calcAttributesSpend + EMPTY);
}
});
bindingContext.bindValue(observeTextLblleftObserveWidget, objectAttibutePointsLeftObserveValue, new UpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER), modelToTarget);
}
if (persona instanceof KiAdept) {
final KiAdept ka = (KiAdept)persona;
observeTextLblspendObserveWidget = WidgetProperties.text().observe(lblSpellSpend1);
objectAttibutePointsSpendObserveValue = EMFEditObservables.observeValue(editingDomain, context.getChracterSource(),
Literals.SHR5_GENERATOR__SPELL_POINT_SPEND);
modelToTarget = new EMFUpdateValueStrategy();
modelToTarget.setConverter(new Converter(Integer.class, String.class) {
@Override
public Object convert(Object fromObject) {
String powerPointsToFloat = ShadowrunEditingTools.powerPointsToFloat(Math.abs(getBasePowerPoints(ka)));
return powerPointsToFloat;
}
});
Binding bindValue = bindingContext.bindValue(observeTextLblspendObserveWidget, objectAttibutePointsSpendObserveValue,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER), modelToTarget);
ControlDecorationSupport.create(bindValue, SWT.TOP | SWT.LEFT);
//
observeTextLblleftObserveWidget = WidgetProperties.text().observe(lblSpellLeft1);
objectAttibutePointsLeftObserveValue = EMFEditObservables.observeValue(editingDomain, context.getChracterSource(),
Literals.SHR5_GENERATOR__SPELL_POINT_SPEND);
modelToTarget = new EMFUpdateValueStrategy();
modelToTarget.setConverter(new Converter(Integer.class, String.class) {
@Override
public Object convert(Object fromObject) {
int calcPowerpointsSpend = ((Adept)object).calcPowerPointsSpend(context);
int basePowerpoints = getBasePowerPoints(ka);
return ShadowrunEditingTools.powerPointsToFloat(Math.abs(basePowerpoints) - Math.abs(calcPowerpointsSpend));
}
});
bindingContext.bindValue(observeTextLblleftObserveWidget, objectAttibutePointsLeftObserveValue, new UpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER), modelToTarget);
}
if (persona instanceof Zauberer) {
final Spellcaster sc = (Spellcaster)object;
observeTextLblspendObserveWidget = WidgetProperties.text().observe(lblSpellSpend);
objectAttibutePointsSpendObserveValue = EMFEditObservables.observeValue(editingDomain, context.getChracterSource(),
Literals.SHR5_GENERATOR__SPELL_POINT_SPEND);
modelToTarget = new EMFUpdateValueStrategy();
Binding bindValue = bindingContext.bindValue(observeTextLblspendObserveWidget, objectAttibutePointsSpendObserveValue,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER), modelToTarget);
ControlDecorationSupport.create(bindValue, SWT.TOP | SWT.LEFT);
//
observeTextLblleftObserveWidget = WidgetProperties.text().observe(lblSpellLeft);
objectAttibutePointsLeftObserveValue = EMFEditObservables.observeValue(editingDomain, context.getChracterSource(),
Literals.SHR5_GENERATOR__SPELL_POINT_SPEND);
modelToTarget = new EMFUpdateValueStrategy();
modelToTarget.setConverter(new Converter(Integer.class, String.class) {
@Override
public Object convert(Object fromObject) {
int calcAttributesSpend = sc.calcSpellPointsSpend(context);
return (((Spellcaster)object).getSpellPoints() - calcAttributesSpend + EMPTY);
}
});
bindingContext.bindValue(observeTextLblleftObserveWidget, objectAttibutePointsLeftObserveValue, new UpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER), modelToTarget);
}
// ---
if (object instanceof Technomancer) {
final Technomancer sc = (Technomancer)object;
observeTextLblspendObserveWidget = WidgetProperties.text().observe(lblCFormSpend);
objectAttibutePointsSpendObserveValue = EMFEditObservables.observeValue(editingDomain, context.getChracterSource(),
Literals.SHR5_GENERATOR__SPELL_POINT_SPEND);
modelToTarget = new EMFUpdateValueStrategy();
Binding bindValue = bindingContext.bindValue(observeTextLblspendObserveWidget, objectAttibutePointsSpendObserveValue,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER), modelToTarget);
ControlDecorationSupport.create(bindValue, SWT.TOP | SWT.LEFT);
//
observeTextLblleftObserveWidget = WidgetProperties.text().observe(lblCFormLeft);
objectAttibutePointsLeftObserveValue = EMFEditObservables.observeValue(editingDomain, context.getChracterSource(),
Literals.SHR5_GENERATOR__SPELL_POINT_SPEND);
modelToTarget = new EMFUpdateValueStrategy();
modelToTarget.setConverter(new Converter(Integer.class, String.class) {
@Override
public Object convert(Object fromObject) {
int calcAttributesSpend = sc.calcComplexFormsSpend(context);
return (((Technomancer)object).getComplexForms() - calcAttributesSpend + EMPTY);
}
});
bindingContext.bindValue(observeTextLblleftObserveWidget, objectAttibutePointsLeftObserveValue, new UpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER), modelToTarget);
}
}
protected int getBasePowerPoints(KiAdept ka) {
if (ka instanceof MysticAdept) {
int sum = 0;
MysticAdept ma = (MysticAdept)ka;
EList<KiKraft> kikraft = ma.getKikraft();
for (KiKraft kraft : kikraft) {
sum = sum + kraft.getKraftpunkte();
}
sum = (int)Math.floor(sum / 100f);
return sum * 100;
}
int magieBasis = ka.getMagieBasis() * 100;
return magieBasis;
}
}