/**
*
*/
package de.urszeidler.shr5.ecp.editor.pages.generator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
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.notify.Notification;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
import org.eclipse.emf.databinding.edit.EMFEditObservables;
import org.eclipse.emf.ecore.util.Diagnostician;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.fieldassist.ControlDecoration;
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.Spinner;
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.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.eclipse.shr5.util.AdapterFactoryUtil;
import de.urszeidler.eclipse.shr5Management.GeneratorState;
import de.urszeidler.eclipse.shr5Management.Resourcen;
import de.urszeidler.eclipse.shr5Management.Shr5KarmaGenerator;
import de.urszeidler.eclipse.shr5Management.Shr5managementFactory;
import de.urszeidler.eclipse.shr5Management.Shr5managementPackage;
import de.urszeidler.eclipse.shr5Management.Shr5managementPackage.Literals;
import de.urszeidler.eclipse.shr5Management.util.ShadowrunManagmentTools;
import de.urszeidler.emf.commons.ui.util.EmfFormBuilder.ReferenceManager;
import de.urszeidler.shr5.ecp.editor.pages.Messages;
import de.urszeidler.shr5.ecp.editor.widgets.ResourceGeneratorOption;
/**
* @author urs
*/
public class Shr5KarmaGeneratorPage extends AbstractGeneratorPage {
protected static final String EMPTY = ""; //$NON-NLS-1$
private Shr5KarmaGenerator object;// = Shr5managementFactory.eINSTANCE.createShr5KarmaGenerator();
private EditingDomain editingDomain;
private DataBindingContext m_bindingContext;
private Button btnPlayerButton;
private ToolItem tltmNewItem;
private ToolItem tltmCommit;
private ToolItem restItem;
private ToolItem tltmChoose;
private Section sctnChoose;
private Section sctnCreate;
// private DiagnosticComposite diagnosticComposite;
private Label lblInstruction;
private Spinner spinner;
private Label lblPhasestate;
private Label lblKarmaToResorcen;
private Label lblKarmaSpend;
private ResourceGeneratorOption resourceGeneratorOption;
private boolean optionWidgetsCreated;
private Resourcen resourcen;
private Group grpResources;
private Set<String> changeSet;
public Shr5KarmaGeneratorPage(FormEditor editor, String id, String title) {
super(editor, id, title);
}
/**
* The main constructor.
*
* @param editor
* @param id
* @param title
* @param object
* @param editingDomain
* @param manager
*/
public Shr5KarmaGeneratorPage(FormEditor editor, String id, String title, Shr5KarmaGenerator object, EditingDomain editingDomain,
ReferenceManager manager) {
super(editor, id, title, manager);
this.object = object;
this.editingDomain = editingDomain;
context = createValidationContext();
}
/**
* Create contents of the form.
*
* @param managedForm
*/
@Override
protected void createFormContent(IManagedForm managedForm) {
FormToolkit toolkit = managedForm.getToolkit();
ScrolledForm form = managedForm.getForm();
form.setText(AdapterFactoryUtil.getInstance().getLabelProvider().getText(object));
Composite body = form.getBody();
toolkit.decorateFormHeading(form.getForm());
toolkit.paintBordersFor(body);
managedForm.getForm().setEnabled(object.getState() != GeneratorState.COMMITED);
managedForm.getForm().getBody().setLayout(new GridLayout(1, false));
ToolBar toolBar = new ToolBar(managedForm.getForm().getBody(), SWT.FLAT | SWT.RIGHT | SWT.SHADOW_OUT);
managedForm.getToolkit().adapt(toolBar);
managedForm.getToolkit().paintBordersFor(toolBar);
tltmChoose = new ToolItem(toolBar, SWT.NONE);
tltmChoose.setText(Messages.GeneratorPage_Step_One);
tltmChoose.setImage(ResourceManager.getPluginImage("de.urszeidler.shr5.ecp", "images/btn_1.png")); //$NON-NLS-1$ //$NON-NLS-2$
tltmChoose.setToolTipText(Messages.Shr5KarmaGeneratorPage_Step_One_tooltip);
tltmNewItem = new ToolItem(toolBar, SWT.NONE);
tltmNewItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
createManagedCharacter();
}
});
tltmNewItem.setText(Messages.GeneratorPage_Step_Two);
tltmNewItem.setImage(ResourceManager.getPluginImage("de.urszeidler.shr5.ecp", "images/btn_2.png")); //$NON-NLS-1$ //$NON-NLS-2$
tltmNewItem.setToolTipText(Messages.GeneratorPage_Step_Two_tooltip);
tltmCommit = new ToolItem(toolBar, SWT.NONE);
tltmCommit.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
commitCharacter();
}
});
tltmCommit.setText(Messages.GeneratorPage_Step_Three);
tltmCommit.setImage(ResourceManager.getPluginImage("de.urszeidler.shr5.ecp", "images/btn_3.png")); //$NON-NLS-1$ //$NON-NLS-2$
tltmCommit.setToolTipText(Messages.GeneratorPage_Step_Tree_tooltip);
restItem = new ToolItem(toolBar, SWT.NONE);
restItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
resetCharacter(object);
}
});
restItem.setText(Messages.GeneratorPage_reset);
restItem.setImage(ResourceManager.getPluginImage("de.urszeidler.shr5.ecp", "images/btn_4.png")); //$NON-NLS-1$ //$NON-NLS-2$
restItem.setToolTipText(Messages.GeneratorPage_Reset_tooltip);
Group grpOverview = new Group(managedForm.getForm().getBody(), SWT.NONE);
grpOverview.setLayout(new GridLayout(1, false));
grpOverview.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1));
grpOverview.setText(Messages.GeneratorPage_overview);
managedForm.getToolkit().adapt(grpOverview);
managedForm.getToolkit().paintBordersFor(grpOverview);
Composite composite_overview = managedForm.getToolkit().createComposite(grpOverview, SWT.NONE);
composite_overview.setLayout(new GridLayout(3, false));
composite_overview.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
managedForm.getToolkit().paintBordersFor(composite_overview);
Composite composite_1 = managedForm.getToolkit().createComposite(grpOverview, SWT.NONE);
composite_1.setLayout(new FillLayout(SWT.HORIZONTAL));
composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
managedForm.getToolkit().paintBordersFor(composite_1);
lblInstruction = managedForm.getToolkit().createLabel(composite_1, "ttt", SWT.NONE); //$NON-NLS-1$
sctnChoose = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TWISTIE | Section.TITLE_BAR);
sctnChoose.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
managedForm.getToolkit().paintBordersFor(sctnChoose);
sctnChoose.setText(Messages.GeneratorPage_Step_One);
sctnChoose.setExpanded(true);
Composite grpAuswahl = new Composite(sctnChoose, SWT.NONE);
sctnChoose.setClient(grpAuswahl);
grpAuswahl.setLayout(new GridLayout(3, false));
managedForm.getToolkit().adapt(grpAuswahl);
managedForm.getToolkit().paintBordersFor(grpAuswahl);
Composite grpTyp = new Composite(grpAuswahl, SWT.NONE);
managedForm.getToolkit().adapt(grpTyp);
managedForm.getToolkit().paintBordersFor(grpTyp);
grpTyp.setLayout(new GridLayout(1, false));
btnPlayerButton = new Button(grpTyp, SWT.RADIO);
btnPlayerButton.setSelection(true);
managedForm.getToolkit().adapt(btnPlayerButton, true, true);
btnPlayerButton.setText(Messages.GeneratorPage_player);
Button btnRadioButton_1 = new Button(grpTyp, SWT.RADIO);
managedForm.getToolkit().adapt(btnRadioButton_1, true, true);
btnRadioButton_1.setText(Messages.GeneratorPage_non_player);
Composite compositePrio = new Composite(grpAuswahl, SWT.NONE);
compositePrio.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
compositePrio.setLayout(new GridLayout(3, false));
managedForm.getToolkit().adapt(compositePrio);
managedForm.getToolkit().paintBordersFor(compositePrio);
Composite compositeAllowedSource = new Composite(grpAuswahl, SWT.NONE);
compositeAllowedSource.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
compositeAllowedSource.setLayout(new GridLayout(1, false));
managedForm.getToolkit().adapt(compositeAllowedSource);
managedForm.getToolkit().paintBordersFor(compositeAllowedSource);
Composite composite_group = new Composite(grpAuswahl, SWT.NONE);
composite_group.setLayout(new GridLayout(3, false));
composite_group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
managedForm.getToolkit().adapt(composite_group);
managedForm.getToolkit().paintBordersFor(composite_group);
sctnCreate = managedForm.getToolkit().createSection(managedForm.getForm().getBody(), Section.TWISTIE | Section.TITLE_BAR);
sctnCreate.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
managedForm.getToolkit().paintBordersFor(sctnCreate);
sctnCreate.setText(Messages.GeneratorPage_Step_Two);
sctnCreate.setExpanded(true);
Composite composite_3 = managedForm.getToolkit().createComposite(sctnCreate, SWT.NONE);
managedForm.getToolkit().paintBordersFor(composite_3);
sctnCreate.setClient(composite_3);
composite_3.setLayout(new GridLayout(3, false));
managedForm.getToolkit().createLabel(composite_3, Messages.GeneratorPage_phase, SWT.NONE);
lblPhasestate = managedForm.getToolkit().createLabel(composite_3, "phase_State", SWT.NONE); //$NON-NLS-1$
GridData gd_lblPhasestate = new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1);
gd_lblPhasestate.widthHint = 150;
lblPhasestate.setLayoutData(gd_lblPhasestate);
lblKarmaToResorcen = new Label(composite_3, SWT.NONE);
managedForm.getToolkit().adapt(lblKarmaToResorcen, true, true);
lblKarmaToResorcen.setText(Messages.GeneratorPage_karma2Resource);
spinner = new Spinner(composite_3, SWT.BORDER);
GridData gd_spinner = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_spinner.widthHint = 40;
spinner.setLayoutData(gd_spinner);
managedForm.getToolkit().adapt(spinner);
managedForm.getToolkit().paintBordersFor(spinner);
ControlDecoration controlDecorationKarma = new ControlDecoration(spinner, SWT.LEFT | SWT.TOP);
controlDecorationKarma.setDescriptionText("Some description"); //$NON-NLS-1$
lblKarmaSpend = new Label(composite_3, SWT.NONE);
GridData gd_lblKarmaSpend = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
gd_lblKarmaSpend.widthHint = 60;
lblKarmaSpend.setLayoutData(gd_lblKarmaSpend);
managedForm.getToolkit().adapt(lblKarmaSpend, true, true);
lblKarmaSpend.setText("New Label"); //$NON-NLS-1$
resourcen = Shr5managementFactory.eINSTANCE.createResourcen();
resourcen.setResource(0);
grpResources = new Group(composite_3, SWT.NONE);
grpResources.setLayout(new GridLayout(3, false));
grpResources.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1));
grpResources.setText(Messages.Shr5KarmaGeneratorPage_grpResources_text);
managedForm.getToolkit().adapt(grpResources);
managedForm.getToolkit().paintBordersFor(grpResources);
new Label(composite_3, SWT.NONE);
new Label(composite_3, SWT.NONE);
new Label(composite_3, SWT.NONE);
m_bindingContext = initDataBindings();
// --------------
ownBinding(m_bindingContext);
createFormBuilder(managedForm);
emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.CHARACTER_GENERATOR__SELECTED_GROUP, composite_group);
emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.CHARACTER_GENERATOR__CHARACTER_NAME, composite_overview);
emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.CHARACTER_GENERATOR__GENERATOR, composite_overview);
emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.KARMA_GENERATOR__META_TYPE, compositePrio);
emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.KARMA_GENERATOR__CHARACTER_CONCEPT, compositePrio);
emfFormBuilder.addSeperatorEntry(compositePrio);
emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.KARMA_GENERATOR__CHOISE_KARMA_COST, compositePrio, labelEntryFactory);
// emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.FREE_STYLE_GENERATOR__SELECTED_PERSONA, compositePrio);
GridData controlGridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 3);
controlGridData.heightHint = 150;
emfFormBuilder.addTextEntry(Shr5managementPackage.Literals.SHR5_RULE_GENERATOR__ALLOWED_SOURCES, compositeAllowedSource, controlGridData);
emfFormBuilder.buildinComposite(m_bindingContext, managedForm.getForm().getBody(), object);
managedForm.reflow(true);
if (!object.eAdapters().contains(this))
object.eAdapters().add(this);
if (object.getCharacter() != null && object.getCharacter().getPersona() != null && object.getState() != GeneratorState.COMMITED) {
addPersonaPage(object.getCharacter());
}
validateChange();
}
/**
* Commit the character.
*/
protected void commitCharacter() {
final int calcResourcesLeft = ShadowrunManagmentTools.calcResourcesLeft(object);
int startMoney = calcResourcesLeft;
startMoney = lifeStyleToStartMoneyDialog(calcResourcesLeft, startMoney, object);
if (startMoney == -1)
return;
moveGeneratorToCharacterCommit(object);
validateChange();
}
protected void createManagedCharacter() {
createManagedCharacter(object.getCharacterConcept().getSelectableTypes(), object.getMetaType().getChoosableTypes(),
btnPlayerButton.getSelection(), object);
addPersonaPage(object.getCharacter());
// createOptionWidgets();
validateChange();
}
/**
* Validates the changes.
*/
@Override
protected void validateChange() {
if (object.getState() == GeneratorState.COMMITED) {
tltmNewItem.setEnabled(false);
tltmChoose.setEnabled(false);
tltmCommit.setEnabled(false);
restItem.setEnabled(false);
// grpAuswahl.setEnabled(false);
sctnCreate.setEnabled(false);
return;
}
Diagnostic validate = Diagnostician.INSTANCE.validate(object, context);
Set<String> newChangeset = new HashSet<String>();
List<Diagnostic> children = validate.getChildren();
for (Diagnostic diagnostic : children) {
updateGeneratorState(diagnostic, object);
newChangeset.add(diagnostic.getMessage());
}
if (newChangeset.equals(changeSet))
return;
changeSet = newChangeset;
if (object.getGenerator() != null)
spinner.setMaximum(object.getGenerator().getMaxKarmaToResources());
if ((object.getCharacterConcept() == null || object.getMetaType() == null))
object.setState(GeneratorState.NEW);
if (object.getState() == GeneratorState.PERSONA_CREATED)
createOptionWidgets();
tltmNewItem.setEnabled(object.getState() == GeneratorState.READY_FOR_CREATION);
tltmChoose.setEnabled(object.getState() == GeneratorState.NEW);
tltmCommit.setEnabled(object.getState() == GeneratorState.PERSONA_CREATED && validate.getChildren().isEmpty());
sctnChoose.setExpanded(object.getState() == GeneratorState.NEW || object.getState() == GeneratorState.READY_FOR_CREATION);
sctnCreate.setExpanded(object.getState() == GeneratorState.PERSONA_CREATED);
restItem.setEnabled(object.getCharacter() != null);
validationService.updateValidation(object, validate);
}
@Override
protected boolean notificationIsRequierd(Notification notification) {
return true;
}
@Override
protected EditingDomain getEditingDomain() {
return editingDomain;
}
@Override
public void dispose() {
if (object != null)
object.eAdapters().remove(this);
super.dispose();
}
protected DataBindingContext initDataBindings() {
DataBindingContext bindingContext = new DataBindingContext();
//
IObservableValue observeTextLblInstructionObserveWidget = WidgetProperties.text().observe(lblInstruction);
IObservableValue objectCurrentInstructionObserveValue = EMFEditObservables.observeValue(editingDomain, object,
Literals.CHARACTER_GENERATOR__CURRENT_INSTRUCTION);
bindingContext.bindValue(observeTextLblInstructionObserveWidget, objectCurrentInstructionObserveValue, new UpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER), null);
//
IObservableValue observeSelectionSpinnerObserveWidget = WidgetProperties.selection().observe(spinner);
IObservableValue objectKarmaToResourceObserveValue = EMFEditObservables.observeValue(editingDomain, object,
Literals.KARMA_GENERATOR__KARMA_TO_RESOURCE);
UpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy();
bindingContext.bindValue(observeSelectionSpinnerObserveWidget, objectKarmaToResourceObserveValue, modelToTarget, modelToTarget);
//
IObservableValue observeTextLblPhasestateObserveWidget = WidgetProperties.text().observe(lblPhasestate);
IObservableValue objectStateObserveValue = EMFEditObservables.observeValue(editingDomain, object, Literals.CHARACTER_GENERATOR__STATE);
bindingContext.bindValue(observeTextLblPhasestateObserveWidget, objectStateObserveValue, new EMFUpdateValueStrategy(),
new EMFUpdateValueStrategy());
//
//
return bindingContext;
}
/**
* Creates the option widget lazy.
*/
private void createOptionWidgets() {
if (object.getCharacter() == null || optionWidgetsCreated)
return;
if (resourceGeneratorOption != null)
resourceGeneratorOption.dispose();
resourceGeneratorOption = new ResourceGeneratorOption(grpResources, SWT.NONE, resourcen, object.getCharacter(),
getManagedForm().getToolkit(), editingDomain, Literals.KARMA_GENERATOR__RESOURCE_SPEND);
resourceGeneratorOption.layout();
optionWidgetsCreated = true;
}
private void ownBinding(DataBindingContext bindingContext) {
IObservableValue observeTextLblKarmaSpendObserveWidget = WidgetProperties.text().observe(lblKarmaSpend);
IObservableValue objectKarmaSpendObserveValue = EMFEditObservables.observeValue(editingDomain, object, Literals.KARMA_GENERATOR__KARMA_SPEND);
EMFUpdateValueStrategy modelToTarget = new EMFUpdateValueStrategy();
modelToTarget.setConverter(new Converter(Integer.class, String.class) {
@Override
public Object convert(Object fromObject) {
if (object.getGenerator() == null)
return Messages.GeneratorPage_left1;
return Messages.GeneratorPage_left + (ShadowrunManagmentTools.calcKarmaLeft(object) + EMPTY);
}
});
bindingContext.bindValue(observeTextLblKarmaSpendObserveWidget, objectKarmaSpendObserveValue, new UpdateValueStrategy(
UpdateValueStrategy.POLICY_NEVER), modelToTarget);
// ----
}
}