package de.urszeidler.shr5.ecp.wizards.createItem;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import de.urszeidler.eclipse.shr5.Shr5Factory;
import de.urszeidler.eclipse.shr5.Shr5Package;
import de.urszeidler.eclipse.shr5.ShrList;
import de.urszeidler.eclipse.shr5Management.Shr5managementFactory;
import de.urszeidler.eclipse.shr5Management.Shr5managementPackage;
import de.urszeidler.shr5.ecp.Activator;
import de.urszeidler.shr5.ecp.util.ShadowrunEditingTools;
public class AbstractNewItemWizard extends Wizard implements INewWizard {
private List<EObject> allContainers;
private Collection<EClass> allTypes;
// private EObject selectedContainer;
protected WritableValue selectedContainerValue = new WritableValue();
protected WritableValue selectedType = new WritableValue();
protected WritableValue selectedName = new WritableValue();
protected EditingDomain editingDomain;
private EObject newObject;
public AbstractNewItemWizard() {
}
@Override
public void addPages() {
addPage(new NewItemWizardPage(this));
// addPage(new NewItemDetailWizardPage(this));
}
@Override
public IWizardPage getNextPage(IWizardPage page) {
if (page instanceof NewItemWizardPage) {
NewItemWizardPage nip = (NewItemWizardPage)page;
if (nip.isPageComplete())
return new NewItemDetailWizardPage(this);
}
return super.getNextPage(page);
}
@Override
public boolean performFinish() {
if (getCreatedObject() == null)
return false;
ShadowrunEditingTools.openEObject(newObject);
return true;
}
@Override
public boolean performCancel() {
if (getCreatedObject() == null)
return true;
ShrList sl = (ShrList)selectedContainerValue.getValue();
sl.getEntries().remove(getCreatedObject());
newObject = null;
return true;
}
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
editingDomain = Activator.getDefault().getEdtingDomain();
selectedContainerValue.setValue(ShadowrunEditingTools.extractFirstEObject(selection));
allContainers = new ArrayList<EObject>();
//
TreeIterator<Notifier> allContents = editingDomain.getResourceSet().getAllContents();
while (allContents.hasNext()) {
Notifier obj = allContents.next();
filterObjects(obj);
}
// perspectivenId = workbench.getActiveWorkbenchWindow().getActivePage().getPerspective().getId();
allTypes = provideClasses();
if(!(selectedContainerValue.getValue() instanceof ShrList)&& allContainers.size()>0)
selectedContainerValue.setValue(allContainers.get(0));
}
/**
* Provide the list of created able objects.
*
* @return
*/
protected Collection<EClass> provideClasses() {
if(!(selectedContainerValue.getValue() instanceof ShrList)&& allContainers.size()>0)
selectedContainerValue.setValue(allContainers.get(0));
Collection<EClass> filteredEClasses = ShadowrunEditingTools.provideNewClassTypes((EObject)selectedContainerValue.getValue(),
Shr5Package.Literals.SHR_LIST__ENTRIES, editingDomain);// provideNewClassTypes(object,
if (!filteredEClasses.contains(Shr5managementPackage.Literals.PACK))
filteredEClasses.add(Shr5managementPackage.Literals.PACK);
filteredEClasses.add(Shr5managementPackage.Literals.SHR5_SYSTEM);
filteredEClasses.add(Shr5managementPackage.Literals.FREE_STYLE);
return filteredEClasses;
}
private void filterObjects(Notifier obj) {
if (obj instanceof ShrList) {
allContainers.add((EObject)obj);
}
}
public List<EObject> getAllContainers() {
return allContainers;
}
public Collection<EClass> getAllTypes() {
return allTypes;
}
// public EObject getSelectedContainer() {
// return selectedContainer;
// }
public WritableValue getSelectedContainerValue() {
return selectedContainerValue;
}
public WritableValue getSelectedType() {
return selectedType;
}
public WritableValue getSelectedName() {
return selectedName;
}
public EditingDomain getEditingDomain() {
return editingDomain;
}
public EObject getCreatedObject() {
if (newObject == null) {
EClass value = (EClass)selectedType.getValue();
if(value==null)
return null;
newObject = null;
try {
EPackage ePackage = value.getEPackage();
EFactory eFactoryInstance = ePackage.getEFactoryInstance();
newObject = eFactoryInstance.create(value);
} catch (Exception e) {
try {
newObject = Shr5Factory.eINSTANCE.create(value);
} catch (Exception e1) {
newObject = Shr5managementFactory.eINSTANCE.create(value);
}
}
ShrList value2 = (ShrList)selectedContainerValue.getValue();
value2.getEntries().add(newObject);
}
return newObject;
}
}