package de.urszeidler.shr5.ecp.editor.widgets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
import org.eclipse.emf.databinding.edit.EMFEditObservables;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.nebula.jface.cdatetime.CDateTimeObservableValue;
import org.eclipse.nebula.widgets.cdatetime.CDT;
import org.eclipse.nebula.widgets.cdatetime.CDateTime;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.forms.widgets.FormToolkit;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
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.BaseMagischePersona;
import de.urszeidler.eclipse.shr5.Fertigkeit;
import de.urszeidler.eclipse.shr5.FertigkeitsGruppe;
import de.urszeidler.eclipse.shr5.Fokus;
import de.urszeidler.eclipse.shr5.KiAdept;
import de.urszeidler.eclipse.shr5.MagieFokus;
import de.urszeidler.eclipse.shr5.PersonaFertigkeit;
import de.urszeidler.eclipse.shr5.PersonaFertigkeitsGruppe;
import de.urszeidler.eclipse.shr5.QiFokus;
import de.urszeidler.eclipse.shr5.Shr5Factory;
import de.urszeidler.eclipse.shr5.Shr5Package;
import de.urszeidler.eclipse.shr5.Spezialisierung;
import de.urszeidler.eclipse.shr5.WaffenFokus;
import de.urszeidler.eclipse.shr5.Zauberer;
import de.urszeidler.eclipse.shr5.util.AdapterFactoryUtil;
import de.urszeidler.eclipse.shr5Management.AttributeChange;
import de.urszeidler.eclipse.shr5Management.Changes;
import de.urszeidler.eclipse.shr5Management.CharacterChange;
import de.urszeidler.eclipse.shr5Management.CharacterDiary;
import de.urszeidler.eclipse.shr5Management.DiaryEntry;
import de.urszeidler.eclipse.shr5Management.KarmaGaint;
import de.urszeidler.eclipse.shr5Management.ManagedCharacter;
import de.urszeidler.eclipse.shr5Management.PersonaChange;
import de.urszeidler.eclipse.shr5Management.PersonaValueChange;
import de.urszeidler.eclipse.shr5Management.PlayerCharacter;
import de.urszeidler.eclipse.shr5Management.Shr5managementFactory;
import de.urszeidler.eclipse.shr5Management.Shr5managementPackage;
import de.urszeidler.eclipse.shr5Management.Shr5managementPackage.Literals;
import de.urszeidler.eclipse.shr5Management.TrainingsTime;
import de.urszeidler.eclipse.shr5Management.util.ShadowrunManagmentTools;
import de.urszeidler.emf.commons.ui.util.DefaultReferenceManager;
import de.urszeidler.emf.commons.ui.util.EmfFormBuilder;
import de.urszeidler.emf.commons.ui.util.EmfFormBuilder.ReferenceManager;
import de.urszeidler.emf.commons.ui.util.FormbuilderEntry;
import de.urszeidler.shr5.ecp.editor.pages.Messages;
import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools;
public class CharacterAdvacementWidget extends Composite {
private class ChangeOperation {
EClass type;
EStructuralFeature feature;
boolean add = true;
Changes changeToApply;
}
private ManagedCharacter character;
private Changes currentChange;
private EditingDomain editingDomain;
private ReferenceManager mananger = new DefaultReferenceManager(AdapterFactoryUtil.getInstance().getItemDelegator()) {
public void handleManage(FormbuilderEntry e, EObject object) {
if (Shr5managementPackage.Literals.PERSONA_CHANGE.equals(currentOperation.type)) {
if (!currentOperation.add) {
Object eGet = character.getPersona().eGet(currentOperation.feature);
if (eGet instanceof List<?>) {
List<?> list = (List<?>)eGet;
handleSingleReference(e, list, getShell());
updateToolbars();
return;
}
} else if (Shr5Package.Literals.ZAUBERER__ZAUBER.equals(currentOperation.feature)) {
Collection<EObject> list = ItemPropertyDescriptor.getReachableObjectsOfType(character.getPersona(), Shr5Package.Literals.ZAUBER);
handleSingleReference(ShadowrunEditingTools.zauber2PersonaZauberTransformer(), e, list, getShell());
updateToolbars();
return;
} else if (Shr5Package.Literals.TECHNOMANCER__COMPLEX_FORMS.equals(currentOperation.feature)) {
Collection<EObject> list = ItemPropertyDescriptor.getReachableObjectsOfType(character.getPersona(),
Shr5Package.Literals.KOMPLEXE_FORM);
handleSingleReference(ShadowrunEditingTools.complexForm2PersonaComplexFormTransformer(), e, list, getShell());
updateToolbars();
return;
} else if (Shr5Package.Literals.ABSTRAKT_PERSONA__FERTIGKEITS_GRUPPEN.equals(currentOperation.feature)) {
Collection<EObject> list = ItemPropertyDescriptor.getReachableObjectsOfType(character.getPersona(),
Shr5Package.Literals.FERTIGKEITS_GRUPPE);
Transformer<FertigkeitsGruppe, PersonaFertigkeitsGruppe> transformer = ShadowrunEditingTools
.fertigkeitsGruppe2PersonafertigkeitsGruppeTransformer(character);
handleSingleReference(transformer, e, list, getShell());
updateToolbars();
return;
} else if (Shr5Package.Literals.ABSTRAKT_PERSONA__FERTIGKEITEN.equals(currentOperation.feature)) {
Collection<EObject> list = ItemPropertyDescriptor.getReachableObjectsOfType(character.getPersona(),
Shr5Package.Literals.FERTIGKEIT);
Transformer<Fertigkeit, PersonaFertigkeit> transformer = ShadowrunEditingTools.fertigkeit2PersonafertigkeitTransformer(character);
handleSingleReference(transformer, e, list, getShell());
updateToolbars();
return;
} else if (Shr5Package.Literals.PERSONA_FERTIGKEIT__SPEZIALISIERUNGEN.equals(currentOperation.feature)) {
EList<PersonaFertigkeit> fertigkeiten = character.getPersona().getFertigkeiten();
ArrayList<Spezialisierung> arrayList = new ArrayList<Spezialisierung>();
for (PersonaFertigkeit personaFertigkeit : fertigkeiten) {
Fertigkeit fertigkeit = personaFertigkeit.getFertigkeit();
if (fertigkeit != null) {
arrayList.addAll(fertigkeit.getSpezialisierungen());
}
}
// Transformer<Fertigkeit, PersonaFertigkeit> transformer =
// ShadowrunEditingTools.fertigkeit2PersonafertigkeitTransformer(character);
handleSingleReference(e, arrayList, getShell());
updateToolbars();
return;
}
else if (Shr5Package.Literals.FOKUS_BINDING__FOKUS.equals(currentOperation.feature)) {
EList<AbstraktGegenstand> inventar = character.getInventar();
ArrayList<Fokus> list = new ArrayList<Fokus>();
for (AbstraktGegenstand abstraktGegenstand : inventar) {
if (abstraktGegenstand instanceof WaffenFokus)
list.add((Fokus)abstraktGegenstand);
if (abstraktGegenstand instanceof QiFokus) {
if (character.getPersona() instanceof KiAdept)
list.add((Fokus)abstraktGegenstand);
} else if (abstraktGegenstand instanceof MagieFokus)
if (character.getPersona() instanceof Zauberer)
list.add((Fokus)abstraktGegenstand);
}
handleSingleReference(e, list, getShell());
updateToolbars();
return;
}
}
if (currentOperation.feature != null) {
Collection<EObject> list = ItemPropertyDescriptor.getReachableObjectsOfType(character.getPersona(),
currentOperation.feature.getEType());
handleSingleReference(e, list, getShell());
} else
super.handleManage(e, object);
updateToolbars();
};
};
// private EmfFormBuilder emfFormBuilder;
private FormToolkit toolkit;
private Composite composite_detail;
private Collection<ChangeOperation> selectableChanges;
private DataBindingContext m_bindingContext;
private Composite composite_form;
private Combo combo;
private ChangeOperation currentOperation;
private ToolItem tltmCommit;
private ToolItem tltmCancel;
private Label lblInstruction;
private EContentAdapter contentAdapter;
/**
* Create the composite.
*
* @param parent
* @param style
*/
public CharacterAdvacementWidget(Composite parent, int style) {
super(parent, style);
toolkit = new FormToolkit(Display.getCurrent());
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
toolkit.dispose();
if (character instanceof PlayerCharacter) {
PlayerCharacter pl = (PlayerCharacter)character;
contentAdapter.unsetTarget(pl);
}
}
});
character = Shr5managementFactory.eINSTANCE.createPlayerCharacter();
character.setPersona(Shr5Factory.eINSTANCE.createMudanPersona());
initalizeData();
createParts();
}
/**
* Create the composite.
*
* @param parent
* @param style
*/
public CharacterAdvacementWidget(Composite parent, int style, EditingDomain editingDomain, ManagedCharacter character1, FormToolkit toolkit2) {
super(parent, style);
toolkit = toolkit2;
this.character = character1;
this.editingDomain = editingDomain;
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
if (character instanceof PlayerCharacter) {
PlayerCharacter pl = (PlayerCharacter)character;
contentAdapter.unsetTarget(pl);
pl.eAdapters().remove(contentAdapter);
}
}
});
initalizeData();
createParts();
}
/**
* Creates the necessary parts for this widget.
*/
private void createParts() {
toolkit.adapt(this);
toolkit.paintBordersFor(this);
setLayout(new GridLayout(8, false));
Composite composite = new Composite(this, SWT.NONE);
composite.setLayout(new GridLayout(3, false));
composite.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1));
toolkit.adapt(composite);
toolkit.paintBordersFor(composite);
Label lblAdvacement = toolkit.createLabel(composite, Messages.CharacterAdvacementWidget_advacment_type, SWT.NONE);
lblAdvacement.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1));
final ComboViewer comboViewer = new ComboViewer(composite, SWT.READ_ONLY);
comboViewer.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
ChangeOperation element2 = (ChangeOperation)element;
String typeName = AdapterFactoryUtil.getInstance().getLabelProvider().getText(element2.type);
if (element2.changeToApply != null)
return AdapterFactoryUtil.getInstance().getLabelProvider().getText(element2.changeToApply);
if (element2.feature != null) {
String featureName = AdapterFactoryUtil.getInstance().getLabelProvider().getText(element2.feature);
typeName = typeName + " " + featureName; //$NON-NLS-1$
if (!element2.add)
typeName = Messages.CharacterAdvacementWidget_type_remove + typeName;
}
return typeName;
}
});
comboViewer.setContentProvider(new ArrayContentProvider());
comboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
StructuredSelection ss = (StructuredSelection)event.getSelection();
ChangeOperation co = (ChangeOperation)ss.getFirstElement();
currentOperation = co;
if (co.type != null)
handleSelect(co.type);
}
});
comboViewer.setInput(selectableChanges);
combo = comboViewer.getCombo();
combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
toolkit.paintBordersFor(combo);
new Label(composite, SWT.NONE);
ToolBar toolBar = new ToolBar(composite, SWT.FLAT | SWT.RIGHT);
toolBar.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
toolkit.adapt(toolBar);
toolkit.paintBordersFor(toolBar);
tltmCommit = new ToolItem(toolBar, SWT.NONE);
tltmCommit.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
commitChange();
}
});
tltmCommit.setText(Messages.CharacterAdvacementWidget_commit);
tltmCancel = new ToolItem(toolBar, SWT.NONE);
tltmCancel.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
cancelChange();
}
});
tltmCancel.setText(Messages.CharacterAdvacementWidget_cancel);
new Label(composite, SWT.NONE);
lblInstruction = toolkit.createLabel(composite, Messages.CharacterAdvacementWidget_instruction, SWT.NONE);
lblInstruction.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
new Label(composite, SWT.NONE);
composite_detail = new Composite(this, SWT.NONE);
GridLayout gl_composite_detail = new GridLayout(1, false);
gl_composite_detail.marginHeight = 0;
gl_composite_detail.marginWidth = 0;
gl_composite_detail.verticalSpacing = 0;
composite_detail.setLayout(gl_composite_detail);
composite_detail.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
toolkit.adapt(composite_detail);
toolkit.paintBordersFor(composite_detail);
composite_form = toolkit.createComposite(composite_detail, SWT.NONE);
composite_form.setLayout(new GridLayout(1, false));
composite_form.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
composite_form.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
toolkit.paintBordersFor(composite_form);
new Label(this, SWT.NONE);
new Label(this, SWT.NONE);
new Label(this, SWT.NONE);
new Label(this, SWT.NONE);
new Label(this, SWT.NONE);
new Label(this, SWT.NONE);
m_bindingContext = initDataBindings();
updateToolbars();
contentAdapter = new EContentAdapter() {
@Override
public void notifyChanged(Notification notification) {
super.notifyChanged(notification);
Object feature = notification.getFeature();
if (// Shr5managementPackage.Literals.CHARACTER_DIARY__ENTRIES.equals(feature)
Shr5managementPackage.Literals.CHANGES__DATE_APPLIED.equals(feature)
|| Shr5managementPackage.Literals.TRAININGS_TIME__DAYS_TRAINED.equals(feature)
|| Shr5managementPackage.Literals.CHARACTER_CHANGE__CHANGE.equals(feature)
|| Shr5managementPackage.Literals.MANAGED_CHARACTER__CHANGES.equals(feature)) {
initalizeData();
comboViewer.setInput(selectableChanges);
}
}
};
if (character instanceof PlayerCharacter) {
PlayerCharacter pl = (PlayerCharacter)character;
contentAdapter.setTarget(pl);
pl.eAdapters().add(contentAdapter);
}
}
/**
* @param parent
* @return
*/
private void createPersonaValueChangeWidget(Composite parent) {
Composite composite_ValueChange = parent;
GridLayout gl_composite_ValueChange = new GridLayout(1, false);
gl_composite_ValueChange.verticalSpacing = 0;
gl_composite_ValueChange.marginWidth = 0;
composite_ValueChange.setLayout(gl_composite_ValueChange);
Composite composite_type = toolkit.createComposite(composite_ValueChange, SWT.NONE);
composite_type.setLayout(new GridLayout(6, false));
composite_type.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
toolkit.paintBordersFor(composite_type);
Composite composite_date = toolkit.createComposite(composite_ValueChange, SWT.NONE);
composite_date.setLayout(new GridLayout(6, false));
composite_date.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
toolkit.paintBordersFor(composite_date);
Label lblAt = new Label(composite_date, SWT.NONE);
toolkit.adapt(lblAt, true, true);
lblAt.setText(Messages.CharacterAdvacementWidget_lbl_at);
CDateTime datewidget = new CDateTime(composite_date, CDT.DROP_DOWN);
datewidget.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 5, 1));
Composite composite_descr = toolkit.createComposite(composite_ValueChange, SWT.NONE);
composite_descr.setLayout(new GridLayout(7, false));
composite_descr.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
toolkit.paintBordersFor(composite_descr);
Label lblDate = new Label(composite_descr, SWT.NONE);
toolkit.adapt(lblDate, true, true);
lblDate.setText(Messages.CharacterAdvacementWidget_lbl_from);
Label lblXxx = new Label(composite_descr, SWT.NONE);
GridData gd_lblXxx = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblXxx.widthHint = 20;
lblXxx.setLayoutData(gd_lblXxx);
toolkit.adapt(lblXxx, true, true);
lblXxx.setText(Messages.CharacterAdvacementWidget_xxx);
Label lblTo = new Label(composite_descr, SWT.NONE);
toolkit.adapt(lblTo, true, true);
lblTo.setText(Messages.CharacterAdvacementWidget_lbl_to);
Label lblXxx_1 = new Label(composite_descr, SWT.NONE);
GridData gd_lblXxx_1 = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblXxx_1.widthHint = 20;
lblXxx_1.setLayoutData(gd_lblXxx_1);
toolkit.adapt(lblXxx_1, true, true);
lblXxx_1.setText(Messages.CharacterAdvacementWidget_xxx);
Label lblKarmaCost = new Label(composite_descr, SWT.NONE);
toolkit.adapt(lblKarmaCost, true, true);
lblKarmaCost.setText(Messages.CharacterAdvacementWidget_lbl_karma_cost);
Label lblKc = toolkit.createLabel(composite_descr, "New Label", SWT.NONE); //$NON-NLS-1$
GridData gd_lblKc = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_lblKc.widthHint = 20;
gd_lblKc.minimumWidth = 20;
lblKc.setLayoutData(gd_lblKc);
IObservableValue observeTextLbl_KarmaCostObserveWidget = WidgetProperties.text().observe(lblKc);
IObservableValue currentChangeKarmaCostObserveValue = EMFEditObservables.observeValue(editingDomain, currentChange,
Literals.CHANGES__KARMA_COST);
m_bindingContext.bindValue(observeTextLbl_KarmaCostObserveWidget, currentChangeKarmaCostObserveValue, new UpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER), new EMFUpdateValueStrategy());
//
IObservableValue observeTextLblXxxObserveWidget = WidgetProperties.text().observe(lblXxx);
IObservableValue pchangeFromObserveValue = EMFEditObservables.observeValue(editingDomain, currentChange, Literals.PERSONA_VALUE_CHANGE__FROM);
m_bindingContext.bindValue(observeTextLblXxxObserveWidget, pchangeFromObserveValue,
new UpdateValueStrategy(UpdateValueStrategy.POLICY_NEVER), new EMFUpdateValueStrategy());
//
IObservableValue observeTextLblXxx_1ObserveWidget = WidgetProperties.text().observe(lblXxx_1);
IObservableValue pchangeKarmaCostObserveValue = EMFEditObservables.observeValue(editingDomain, currentChange,
Literals.PERSONA_VALUE_CHANGE__TO);
m_bindingContext.bindValue(observeTextLblXxx_1ObserveWidget, pchangeKarmaCostObserveValue, new UpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER), new EMFUpdateValueStrategy());
//
IObservableValue observeLocationDatewidgetObserveWidget = new CDateTimeObservableValue(datewidget);
IObservableValue currentChangeDateObserveValue = EMFEditObservables.observeValue(editingDomain, currentChange, Literals.CHANGES__DATE);
m_bindingContext.bindValue(observeLocationDatewidgetObserveWidget, currentChangeDateObserveValue, null, null);
EmfFormBuilder emfFormBuilder = new EmfFormBuilder(toolkit, AdapterFactoryUtil.getInstance().getItemDelegator(), AdapterFactoryUtil
.getInstance().getLabelProvider(), editingDomain);
emfFormBuilder.setManager(mananger);
emfFormBuilder.setBorderStyle(SWT.NONE);
if (currentChange instanceof AttributeChange) {
emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.ATTRIBUTE_CHANGE__ATTIBUTE, composite_type);
} else if (currentChange instanceof PersonaChange) {
emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.PERSONA_CHANGE__CHANGEABLE, composite_type);
}
emfFormBuilder.buildinComposite(m_bindingContext, composite_type, currentChange);
}
/**
* @param parent
* @return
*/
private void createKarmaGaintWidget(Composite parent) {
Composite composite_ValueChange = parent;
GridLayout gl_composite_ValueChange = new GridLayout(1, false);
gl_composite_ValueChange.verticalSpacing = 0;
gl_composite_ValueChange.marginWidth = 0;
composite_ValueChange.setLayout(gl_composite_ValueChange);
Composite composite_type = toolkit.createComposite(composite_ValueChange, SWT.NONE);
composite_type.setLayout(new GridLayout(3, false));
composite_type.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
toolkit.paintBordersFor(composite_type);
Composite composite_date = toolkit.createComposite(composite_ValueChange, SWT.NONE);
composite_date.setLayout(new GridLayout(6, false));
composite_date.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
toolkit.paintBordersFor(composite_date);
Label lblAt = new Label(composite_date, SWT.NONE);
toolkit.adapt(lblAt, true, true);
lblAt.setText(Messages.CharacterAdvacementWidget_lbl_at);
CDateTime datewidget = new CDateTime(composite_date, CDT.DROP_DOWN);
datewidget.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 5, 1));
IObservableValue observeLocationDatewidgetObserveWidget = new CDateTimeObservableValue(datewidget);
IObservableValue currentChangeDateObserveValue = EMFEditObservables.observeValue(editingDomain, currentChange, Literals.CHANGES__DATE);
m_bindingContext.bindValue(observeLocationDatewidgetObserveWidget, currentChangeDateObserveValue, null, null);
EmfFormBuilder emfFormBuilder = new EmfFormBuilder(toolkit, AdapterFactoryUtil.getInstance().getItemDelegator(), AdapterFactoryUtil
.getInstance().getLabelProvider(), editingDomain);
emfFormBuilder.setManager(mananger);
emfFormBuilder.setBorderStyle(SWT.NONE);
emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.KARMA_GAINT__KARMA, composite_type);
emfFormBuilder.buildinComposite(m_bindingContext, composite_type, currentChange);
}
protected void cancelChange() {
clearChangeWidget();
if (currentOperation.changeToApply == null)
character.getChanges().remove(currentChange);
currentChange = null;
updateToolbars();
}
private void clearChangeWidget() {
combo.select(0);
combo.setEnabled(true);
Composite parent = composite_form.getParent();
composite_form.dispose();
composite_form = new Composite(parent, SWT.NONE);
composite_form.setLayout(new GridLayout(1, false));
composite_form.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
toolkit.adapt(composite_form);
toolkit.paintBordersFor(composite_form);
}
protected void commitChange() {
clearChangeWidget();
if (currentChange != null) {
currentChange.applyChanges();
if (character instanceof PlayerCharacter && currentOperation.changeToApply == null) {
PlayerCharacter pl = (PlayerCharacter)character;
CharacterChange characterChange = Shr5managementFactory.eINSTANCE.createCharacterChange();
characterChange.setChange(currentChange);
characterChange.setDate(currentChange.getDate());
characterChange.setMessage(String.format("%s", AdapterFactoryUtil.getInstance().getLabelProvider().getText(currentChange)));
CharacterDiary diary = pl.getDiary();
if (diary != null)
diary.getEntries().add(characterChange);
}
}
currentChange = null;
updateToolbars();
}
protected void handleSelect(EClass eClass) {
Composite parent = composite_form.getParent();
composite_form.dispose();
composite_form = new Composite(parent, SWT.NONE);
composite_form.setLayout(new GridLayout(1, false));
composite_form.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
toolkit.adapt(composite_form);
toolkit.paintBordersFor(composite_form);
combo.setEnabled(false);
if (currentOperation.changeToApply != null)
currentChange = currentOperation.changeToApply;
else {
currentChange = (Changes)eClass.getEPackage().getEFactoryInstance().create(eClass);
character.getChanges().add(currentChange);
}
currentChange.setDate(ShadowrunManagmentTools.findCorrenspondingDate(character));
if (currentChange instanceof PersonaValueChange) {
createPersonaValueChangeWidget(composite_form);
} else if (currentChange instanceof KarmaGaint) {
createKarmaGaintWidget(composite_form);
}
// composite_form.layout();
composite_form.getParent().layout();
updateToolbars();
}
private void updateToolbars() {
boolean enabled = currentChange != null && !currentChange.isChangeApplied();
boolean canSpend = currentChange == null ? false : 0 <= currentChange.getKarmaCost() + character.getCurrentKarma();
boolean changeableSelected = false;
if (currentChange instanceof PersonaChange) {
PersonaChange pc = (PersonaChange)currentChange;
changeableSelected = pc.getChangeable() != null;
} else if (currentChange instanceof KarmaGaint) {
changeableSelected = true;
canSpend = true;
} else if (currentChange instanceof AttributeChange) {
AttributeChange ac = (AttributeChange)currentChange;
changeableSelected = ac.getAttibute() != null;
}
tltmCancel.setEnabled(enabled);
boolean commitEnabled = enabled && canSpend && changeableSelected;
tltmCommit.setEnabled(commitEnabled);
if (!enabled && !canSpend) {
lblInstruction.setText(Messages.CharacterAdvacementWidget_inst_select_advacment_type);
} else if (!changeableSelected) {
lblInstruction.setText(Messages.CharacterAdvacementWidget_inst_select_type);
} else if (enabled && !canSpend) {
lblInstruction.setText(Messages.CharacterAdvacementWidget_inst_not_enought_karma);
} else if (commitEnabled) {
lblInstruction.setText(Messages.CharacterAdvacementWidget_inst_commit);
}
}
private void initalizeData() {
selectableChanges = new ArrayList<CharacterAdvacementWidget.ChangeOperation>();
selectableChanges.add(new ChangeOperation());
ChangeOperation op = new ChangeOperation();
op.type = Shr5managementPackage.Literals.KARMA_GAINT;
selectableChanges.add(op);
if (character instanceof PlayerCharacter) {
addPlayerChanges(selectableChanges);
} else {
op = new ChangeOperation();
op.type = Shr5managementPackage.Literals.ATTRIBUTE_CHANGE;
selectableChanges.add(op);
}
EClass eClass = character.getPersona().eClass();
EList<EReference> eAllContainments = eClass.getEAllContainments();
for (EReference eReference : eAllContainments) {
if (!Shr5Package.Literals.PERSONA_EIGENSCHAFT.equals(eReference.getEReferenceType()) && !Shr5Package.Literals.PERSONA_MARTIALART_STYLE.equals(eReference.getEReferenceType()))
if (Shr5Package.Literals.ERLERNBAR.isSuperTypeOf(eReference.getEReferenceType())) {
op = new ChangeOperation();
op.type = Shr5managementPackage.Literals.PERSONA_CHANGE;
op.feature = eReference;
selectableChanges.add(op);
}
}
op = new ChangeOperation();
op.type = Shr5managementPackage.Literals.PERSONA_CHANGE;
op.add = true;
op.feature = Shr5Package.Literals.PERSONA_FERTIGKEIT__SPEZIALISIERUNGEN;
selectableChanges.add(op);
op = new ChangeOperation();
op.type = Shr5managementPackage.Literals.PERSONA_CHANGE;
op.add = true;
op.feature = Shr5Package.Literals.KOERPER_PERSONA__EIGENSCHAFTEN;
selectableChanges.add(op);
op = new ChangeOperation();
op.type = Shr5managementPackage.Literals.PERSONA_CHANGE;
op.add = false;
op.feature = Shr5Package.Literals.KOERPER_PERSONA__EIGENSCHAFTEN;
selectableChanges.add(op);
if (character.getPersona() instanceof BaseMagischePersona) {
op = new ChangeOperation();
op.type = Shr5managementPackage.Literals.PERSONA_CHANGE;
op.add = true;
op.feature = Shr5Package.Literals.FOKUS_BINDING__FOKUS;
selectableChanges.add(op);
}
}
/**
* Add the possible changes for a player character.
*
* @param selectableChanges2
*/
private void addPlayerChanges(Collection<ChangeOperation> selectableChanges2) {
PlayerCharacter pc = (PlayerCharacter)character;
EList<DiaryEntry> entries = pc.getDiary().getEntries();
ImmutableList<ChangeOperation> list = FluentIterable.from(entries).filter(TrainingsTime.class).filter(new Predicate<TrainingsTime>() {
@Override
public boolean apply(TrainingsTime input) {
return input.getChange()!=null && !input.getChange().isChangeApplied() && input.getDaysRemains() == 0;
}
}).transform(new Function<TrainingsTime, ChangeOperation>() {
@Override
public ChangeOperation apply(TrainingsTime input) {
ChangeOperation op = new ChangeOperation();
op.type = Shr5managementPackage.Literals.PERSONA_CHANGE;
op.add = true;
op.changeToApply = input.getChange();
return op;
}
}).toList();
selectableChanges2.addAll(list);
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
//
return bindingContext;
}
}