/* AWE - Amanzi Wireless Explorer
* http://awe.amanzi.org
* (C) 2008-2009, AmanziTel AB
*
* This library is provided under the terms of the Eclipse Public License
* as described at http://www.eclipse.org/legal/epl-v10.html. Any use,
* reproduction or distribution of the library constitutes recipient's
* acceptance of this agreement.
*
* This library is distributed WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
package org.amanzi.awe.nem.ui.wizard;
import java.util.ArrayList;
import java.util.List;
import org.amanzi.awe.nem.exceptions.NemManagerOperationException;
import org.amanzi.awe.nem.managers.network.NetworkElementManager;
import org.amanzi.awe.nem.ui.messages.NEMMessages;
import org.amanzi.awe.nem.ui.wizard.pages.InitialNetworkPage;
import org.amanzi.awe.nem.ui.wizard.pages.PropertyEditorPage;
import org.amanzi.neo.nodetypes.INodeType;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
/**
* TODO Purpose of
* <p>
* </p>
*
* @author Vladislav_Kondratenko
* @since 1.0.0
*/
public class NetworkCreationWizard extends Wizard {
private NetworkDataContainer container;
private List<String> pagesOrder;
public NetworkCreationWizard() {
setForcePreviousAndNextButtons(true);
}
@Override
public void addPages() {
addPage(new InitialNetworkPage());
}
/**
* @param name
* @return
*/
private IWizardPage computeNextPage(final String name) {
if (name.equals(NEMMessages.CREATE_NEW_NETWORK)) {
return getPage(pagesOrder.get(0));
}
int currentPageIndex = pagesOrder.indexOf(name);
if (currentPageIndex == pagesOrder.size() - 1) {
return null;
}
String nextPageName = pagesOrder.get(++currentPageIndex);
return getPage(nextPageName);
}
/**
* @param name
* @return
*/
private IWizardPage computePreviousPage(final String name) {
int currentPageIndex = pagesOrder.indexOf(name);
if (currentPageIndex <= 0) {
return getPage(NEMMessages.CREATE_NEW_NETWORK);
}
String previousPageName = pagesOrder.get(--currentPageIndex);
return getPage(previousPageName);
}
protected NetworkDataContainer getDataContainer() {
if (container == null) {
container = new NetworkDataContainer();
}
return container;
}
@Override
public IWizardPage getNextPage(final IWizardPage page) {
if (page instanceof InitialNetworkPage) {
initContainerFromStartPage((InitialNetworkPage)page);
initializeNewPages((InitialNetworkPage)page, false);
} else {
handlePropertyPage((PropertyEditorPage)page);
}
return computeNextPage(page.getName());
}
@Override
public IWizardPage getPreviousPage(final IWizardPage page) {
if (page instanceof InitialNetworkPage) {
return null;
} else {
return computePreviousPage(page.getName());
}
}
/**
* @param iWizardPage
*/
protected void handleFirstPageOnFinish(final IWizardPage iWizardPage) {
if (getPages()[0] instanceof InitialNetworkPage) {
initContainerFromStartPage((InitialNetworkPage)getPages()[0]);
initializeNewPages((InitialNetworkPage)getPages()[0], true);
}
}
protected void handleModelRefreshing(final List<INodeType> types, final IProgressMonitor monitor) {
try {
InitialNetworkPage firstPage = (InitialNetworkPage)getPages()[0];
NetworkElementManager.getInstance().createModel(container.getName(), types, container.getTypeProperties(),
firstPage.getCrs(), monitor);
} catch (NemManagerOperationException e) {
return;
}
}
/**
* @param page
*/
protected void handlePropertyPage(final PropertyEditorPage page) {
container.putToTypeProperties(page.getType(), page.getProperties());
}
/**
* @param page
*/
private void initContainerFromStartPage(final InitialNetworkPage page) {
getDataContainer().setName(page.getNetworkName());
getDataContainer().setStructure(page.getNetworkStructure());
}
/**
* @param page
* @param b
*/
private void initializeNewPages(final InitialNetworkPage page, final boolean isFinished) {
pagesOrder = new ArrayList<String>();
for (int i = 1; i < page.getNetworkStructure().size(); i++) {
INodeType type = page.getNetworkStructure().get(i);
pagesOrder.add(type.getId());
if (getPage(type.getId()) == null) {
PropertyEditorPage propertyPage = new PropertyEditorPage(type);
propertyPage.initializeTypes();
if (isFinished) {
handlePropertyPage(propertyPage);
} else {
addPage(propertyPage);
}
}
}
}
@Override
public boolean performFinish() {
if (getPages().length == 1) {
handleFirstPageOnFinish(getPages()[0]);
}
final List<INodeType> types = NetworkElementManager.getInstance().updateNodeTypes(
getDataContainer().getStructure().toArray(new INodeType[getDataContainer().getStructure().size()]));
Job job = new Job("Finishup NEM opertion") {
@Override
protected IStatus run(final IProgressMonitor monitor) {
handleModelRefreshing(types, monitor);
return Status.OK_STATUS;
}
};
job.schedule();
return true;
}
}