/**
*
*/
package de.urszeidler.shr5.ecp.wizards;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.command.AddCommand;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.SWT;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.wb.swt.ResourceManager;
import de.urszeidler.eclipse.shr5Management.CharacterGenerator;
import de.urszeidler.eclipse.shr5Management.CharacterGeneratorSystem;
import de.urszeidler.eclipse.shr5Management.CharacterGroup;
import de.urszeidler.eclipse.shr5Management.ManagedCharacter;
import de.urszeidler.eclipse.shr5Management.PlayerManagement;
import de.urszeidler.eclipse.shr5Management.Shr5Generator;
import de.urszeidler.eclipse.shr5Management.Shr5System;
import de.urszeidler.eclipse.shr5Management.Shr5managementFactory;
import de.urszeidler.eclipse.shr5Management.Shr5managementPackage;
import de.urszeidler.shr5.ecp.Activator;
import de.urszeidler.shr5.ecp.opener.ECPAttributModifikatorWertOpener;
import de.urszeidler.shr5.ecp.preferences.PreferenceConstants;
import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools;
/**
* @author urs
*/
public class NewShr5GeneratorWizard extends Wizard implements INewWizard {
private static final String CHARACTER_PERSPECTIVE = "de.urszeidler.shr5.product.application.ShadowrunCharacterPerspective";
protected List<EObject> container;
protected List<EObject> systems;
protected List<EObject> groups;
protected WritableValue selectedContainer = new WritableValue();
protected WritableValue selectedSystem = new WritableValue();
protected WritableValue selectedGroup = new WritableValue();
private String perspectivenId;
/**
*
*/
public NewShr5GeneratorWizard() {
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
*/
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
EditingDomain edtingDomain = Activator.getDefault().getEdtingDomain();
// EList<Resource> resources = edtingDomain.getResourceSet().getResources();
EObject selected = ShadowrunEditingTools.extractFirstEObject(selection);
if (selected instanceof ManagedCharacter) {
ManagedCharacter mc = (ManagedCharacter)selected;
selected = mc.eContainer();
}
if (selected instanceof CharacterGroup) {
CharacterGroup g = (CharacterGroup)selected;
selectedGroup.setValue(g);
if (g.eContainer() instanceof PlayerManagement) {
PlayerManagement pm = (PlayerManagement)g.eContainer();
selectedContainer.setValue(pm);
}
}
container = new ArrayList<EObject>();
systems = new ArrayList<EObject>();
groups = new ArrayList<EObject>();
TreeIterator<Notifier> allContents = edtingDomain.getResourceSet().getAllContents();
while (allContents.hasNext()) {
Notifier obj = allContents.next();
filterObjects(obj);
}
perspectivenId = workbench.getActiveWorkbenchWindow().getActivePage().getPerspective().getId();
}
/**
* Is called while iterating over the content.
*
* @param obj
*/
protected void filterObjects(Notifier obj) {
if (obj instanceof PlayerManagement) {
container.add((EObject)obj);
} else if (obj instanceof Shr5System) {
Shr5System t = (Shr5System)obj;
if (t.getApplicableGenerators().contains(Shr5managementPackage.Literals.SHR5_GENERATOR))
systems.add((EObject)obj);
} else if (obj instanceof CharacterGroup) {
groups.add((EObject)obj);
}
}
@Override
public void addPages() {
addPage(new NewCharacterWizardPage(container, systems, groups, selectedContainer, selectedSystem, selectedGroup,
Messages.NewShr5GeneratorWizard_name, Messages.NewShr5GeneratorWizard_titel, Messages.NewShr5GeneratorWizard_description,
ResourceManager.getPluginImageDescriptor("de.urszeidler.shr5.ecp", "images/CoreGenerator32.png"))); //$NON-NLS-1$ //$NON-NLS-2$
}
/*
* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#performFinish()
*/
@SuppressWarnings("unchecked")
@Override
public boolean performFinish() {
CharacterGenerator<CharacterGeneratorSystem> generator = (CharacterGenerator<CharacterGeneratorSystem>)createGenerator();
generator.setSelectedGroup((CharacterGroup)selectedGroup.getValue());
generator.setGenerator((CharacterGeneratorSystem)selectedSystem.getValue());
EditingDomain edtingDomain = Activator.getDefault().getEdtingDomain();
Command command = AddCommand.create(edtingDomain, selectedContainer.getValue(), Shr5managementPackage.Literals.PLAYER_MANAGEMENT__GENERATORS,
generator);
edtingDomain.getCommandStack().execute(command);
switchPerspective();
ECPAttributModifikatorWertOpener.openEditor(generator, Activator.getDefault().getDefaultEcpProject());
return true;
}
/**
* Factory method to create the generator object of this wizard.
*
* @return
*/
protected CharacterGenerator<?> createGenerator() {
Shr5Generator generator = Shr5managementFactory.eINSTANCE.createShr5Generator();
return generator;
}
/**
*
*/
private void switchPerspective() {
if (CHARACTER_PERSPECTIVE.equals(perspectivenId))
return;
boolean doSwitch = false;
IPreferenceStore store = Activator.getDefault().getPreferenceStore();
String value = store.getString(PreferenceConstants.SWITCH_CHARACTERBUILDING_PERSPECTIVE);
if (MessageDialogWithToggle.ALWAYS.equals(value)) {
doSwitch();
return;
}
if (MessageDialogWithToggle.NEVER.equals(value)) {
return;
}
MessageDialogWithToggle open = MessageDialogWithToggle.open(MessageDialogWithToggle.QUESTION_WITH_CANCEL, getShell(),
Messages.NewShr5GeneratorWizard_switch_perspective_titel, Messages.NewShr5GeneratorWizard_switch_perspective_message,
Messages.NewShr5GeneratorWizard_switch_perspective_not_again_message, false, store,
PreferenceConstants.SWITCH_CHARACTERBUILDING_PERSPECTIVE, SWT.NONE);
doSwitch = open.getReturnCode() == 2;
if (doSwitch)
doSwitch();
}
/**
*
*/
private void doSwitch() {
try {
PlatformUI.getWorkbench().showPerspective(CHARACTER_PERSPECTIVE, PlatformUI.getWorkbench().getActiveWorkbenchWindow());
} catch (WorkbenchException e) {
e.printStackTrace();
}
}
}