/*****************************************************************************
* Copyright (c) 2010 CEA LIST.
*
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tatiana Fesenko (CEA LIST) - Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.uml.diagram.wizards;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.papyrus.infra.core.utils.DiResourceSet;
import org.eclipse.papyrus.uml.diagram.wizards.pages.NewModelFilePage;
import org.eclipse.papyrus.uml.diagram.wizards.pages.SelectDiagramCategoryPage;
import org.eclipse.papyrus.uml.diagram.wizards.pages.SelectDiagramKindPage;
import org.eclipse.ui.IWorkbench;
/**
* Creates several new model files - one each selected diagram category.
* This functionality in under development now.
*/
// TODO: Provide proper file names for the new model file pages after the first one
// TODO: Allow the user to skip NewModelFile page and invoke finish in advance.
public class CreateSeveralModelsWizard extends CreateModelWizard {
/** The my category2model file page map. */
private Map<String, NewModelFilePage> myCategory2modelFilePageMap = new TreeMap<String, NewModelFilePage>();
/** The my selection. */
private IStructuredSelection mySelection;
/* (non-Javadoc)
* @see org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard#createNewModelFilePage(org.eclipse.jface.viewers.IStructuredSelection)
*/
@Override
protected NewModelFilePage createNewModelFilePage(IStructuredSelection selection) {
return null;
}
/* (non-Javadoc)
* @see org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
*/
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
super.init(workbench, selection);
this.mySelection = selection;
}
/* (non-Javadoc)
* @see org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard#diagramCategoryChanged(java.lang.String[])
*/
@Override
public IStatus diagramCategoryChanged(String... newCategories) {
// clean pages
List<String> newCategoriesList = Arrays.asList(newCategories);
Collection<String> keys = new HashSet<String>(myCategory2modelFilePageMap.keySet());
for(String oldCategory : keys) {
if(!newCategoriesList.contains(oldCategory)) {
myCategory2modelFilePageMap.remove(oldCategory);
}
}
for(String newCategory : newCategories) {
if(!myCategory2modelFilePageMap.containsKey(newCategory)) {
NewModelFilePage newPage = createNewModelFilePage(mySelection, newCategory);
myCategory2modelFilePageMap.put(newCategory, newPage);
}
}
return Status.OK_STATUS;
}
/**
* Creates the new model file page.
*
* @param selection the selection
* @param categoryId the category id
* @return the new model file page
*/
protected NewModelFilePage createNewModelFilePage(IStructuredSelection selection, String categoryId) {
NewModelFilePage newPage = new NewModelFilePage(createModelFilePageId(categoryId), selection);
newPage.setWizard(this);
newPage.setDescription(Messages.bind(Messages.CreateSeveralModelsWizard_new_model_file_page_title, categoryId));
return newPage;
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
*/
@Override
public IWizardPage getNextPage(IWizardPage page) {
String pageId = page.getName();
if (SelectDiagramKindPage.PAGE_ID.equals(pageId)) {
String nextKey = myCategory2modelFilePageMap.keySet().iterator().next();
return myCategory2modelFilePageMap.get(nextKey);
}
if (isModelFilePageId(pageId) && myCategory2modelFilePageMap.containsKey(getCategoryForPage(pageId))) {
String category = getCategoryForPage(pageId);
Iterator<String> iterator = myCategory2modelFilePageMap.keySet().iterator();
while (iterator.hasNext()) {
if (category.equals(iterator.next())) {
if (iterator.hasNext()) {
String nextKey = iterator.next();
return myCategory2modelFilePageMap.get(nextKey);
}
}
}
return null;
}
return super.getNextPage(page);
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#getPreviousPage(org.eclipse.jface.wizard.IWizardPage)
*/
@Override
public IWizardPage getPreviousPage(IWizardPage page) {
// TODO allow navigation between pages
return super.getPreviousPage(page);
}
/* (non-Javadoc)
* @see org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard#createSelectDiagramCategoryPage()
*/
@Override
protected SelectDiagramCategoryPage createSelectDiagramCategoryPage() {
return new SelectDiagramCategoryPage(true);
}
/**
* Perform finish.
*
* @return true, if successful
* {@inheritDoc}
*/
@Override
public boolean performFinish() {
for (String category: getDiagramCategoryIds()) {
final IFile newFile = createNewModelFile(category);
DiResourceSet diResourceSet = new DiResourceSet();
createAndOpenPapyrusModel(diResourceSet, newFile, category);
}
saveDiagramCategorySettings();
saveDiagramKindSettings();
return true;
}
/* (non-Javadoc)
* @see org.eclipse.papyrus.uml.diagram.wizards.CreateModelWizard#createNewModelFile(java.lang.String)
*/
@Override
protected IFile createNewModelFile(String category) {
NewModelFilePage newModelFilePage = myCategory2modelFilePageMap.get(category);
if (newModelFilePage == null) {
Activator.log.error(Messages.bind(Messages.CreateSeveralModelsWizard_cannot_initiate_page, category), new Exception());
return null;
}
return newModelFilePage.createNewFile();
}
/**
* Creates the model file page id.
*
* @param categoryId the category id
* @return the string
*/
private static String createModelFilePageId(String categoryId) {
return NEW_MODEL_FILE_PAGE_PREFIX + categoryId;
}
/**
* Checks if is model file page id.
*
* @param pageId the page id
* @return true, if is model file page id
*/
private static boolean isModelFilePageId(String pageId) {
return pageId.startsWith(NEW_MODEL_FILE_PAGE_PREFIX);
}
/**
* Gets the category for page.
*
* @param pageId the page id
* @return the category for page
*/
private static String getCategoryForPage(String pageId) {
return pageId.substring(NEW_MODEL_FILE_PAGE_PREFIX.length());
}
/** The Constant NEW_MODEL_FILE_PAGE_PREFIX. */
private static final String NEW_MODEL_FILE_PAGE_PREFIX = NewModelFilePage.PAGE_ID + "_"; //$NON-NLS-1$
}