/*******************************************************************************
* Copyright (c) 2008 Obeo.
* 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:
* Obeo - initial API and implementation
* Tatiana Fesenko(CEA) - improved look&feel
* Saadia Dhouib (CEA LIST) - Implementation of loading diagrams from template files (.uml, .di , .notation)
*******************************************************************************/
package org.eclipse.papyrus.uml.diagram.wizards.pages;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.papyrus.commands.CreationCommandRegistry;
import org.eclipse.papyrus.commands.ICreationCommandRegistry;
import org.eclipse.papyrus.infra.viewpoints.configuration.Category;
import org.eclipse.papyrus.infra.viewpoints.policy.ViewPrototype;
import org.eclipse.papyrus.uml.diagram.wizards.kind.DiagramKindComposite;
import org.eclipse.papyrus.uml.diagram.wizards.kind.DiagramKindLabelProvider;
import org.eclipse.papyrus.uml.diagram.wizards.messages.Messages;
import org.eclipse.papyrus.uml.diagram.wizards.template.ModelTemplateDescription;
import org.eclipse.papyrus.uml.diagram.wizards.template.SelectModelTemplateComposite;
import org.eclipse.papyrus.uml.diagram.wizards.widget.FileChooser;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
/**
* This WizardPage to select the kind of Papyrus Diagram. List all kind of diagrams registered with
* creationCommand attribute in PapyrusDiagram Eclipse extension.
*
* @author Jerome Benois
* @author Tatiana Fesenko
*/
public class SelectDiagramKindPage extends WizardPage {
/** The Constant PAGE_ID. */
public static final String PAGE_ID = "SelectDiagramKind"; //$NON-NLS-1$
/** The diagram name text field. */
private Text nameText;
/** The select template composite. */
private SelectModelTemplateComposite selectTemplateComposite;
/** the select diagram Kind composite */
private DiagramKindComposite diagramKindComposite;
/** The my category provider. */
private final CategoryProvider myCategoryProvider;
/** The allow templates. */
private final boolean allowTemplates;
/** The my creation command registry. */
private final ICreationCommandRegistry myCreationCommandRegistry;
private FileChooser filechooser;
/** The Constant DEFAULT_CREATION_COMMAND_REGISTRY. */
public static final ICreationCommandRegistry DEFAULT_CREATION_COMMAND_REGISTRY = CreationCommandRegistry.getInstance(org.eclipse.papyrus.infra.core.Activator.PLUGIN_ID);
/**
* Instantiates a new select diagram kind page.
*
* @param categoryProvider
* the category provider
*/
public SelectDiagramKindPage(CategoryProvider categoryProvider) {
this(true, categoryProvider, DEFAULT_CREATION_COMMAND_REGISTRY);
}
/**
* Instantiates a new select diagram kind page.
*
* @param allowTemplates
* the allow templates
* @param categoryProvider
* the category provider
* @param creationCommandRegistry
* the creation command registry
*/
public SelectDiagramKindPage(boolean allowTemplates, CategoryProvider categoryProvider, ICreationCommandRegistry creationCommandRegistry) {
super(PAGE_ID);
setTitle(Messages.SelectDiagramKindPage_page_title);
setDescription(Messages.SelectDiagramKindPage_page_desc);
this.allowTemplates = allowTemplates;
myCategoryProvider = categoryProvider;
myCreationCommandRegistry = creationCommandRegistry;
}
/**
* Creates the control.
*
* @param parent
* the parent {@inheritDoc}
*/
@Override
public void createControl(Composite parent) {
Composite pageComposite = new Composite(parent, SWT.NONE);
pageComposite.setLayout(new GridLayout());
pageComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
String[] categories = getDiagramCategories();
Composite nameFormComposite = new Composite(pageComposite, SWT.NONE);
nameFormComposite.setLayout(new GridLayout());
nameFormComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
createNameForm(nameFormComposite);
Composite diagramKindComposite = new Composite(pageComposite, SWT.NONE);
diagramKindComposite.setLayout(new GridLayout());
diagramKindComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
createDiagramKindForm(diagramKindComposite);
this.diagramKindComposite.setInput(categories);
Composite modelTemplateComposite = new Composite(pageComposite, SWT.NONE);
modelTemplateComposite.setLayout(new GridLayout());
modelTemplateComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
createModelTemplateComposite(modelTemplateComposite);
fillInTables(categories);
Composite profileChooserComposite = new Composite(pageComposite, SWT.NONE);
profileChooserComposite.setLayout(new GridLayout());
profileChooserComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
createProfileFileChooser(profileChooserComposite);
setControl(pageComposite);
}
/**
* Create the filechooser composite
*
* @param parent
*/
private void createProfileFileChooser(Composite parent) {
Group group = createGroup(parent, Messages.SelectDiagramKindPage_0);
filechooser = new FileChooser(group, false);
String[] filter = { "profile.uml" }; //$NON-NLS-1$
filechooser.setFilterExtensions(filter);
}
public String getProfileURI() {
return filechooser.getFilePath();
}
/**
* Sets the visible.
*
* @param visible
* the new visible
* @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
*/
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
fillInTables(getDiagramCategories());
validatePage();
if (!allowTemplates) {
selectTemplateComposite.disable();
}
}
}
/**
* Fill in tables.
*
* @param categories
* the categories
*/
private void fillInTables(String[] categories) {
if (categories == null || categories.length == 0) {
return;
}
diagramKindComposite.setInput(categories);
selectTemplateComposite.setInput(categories);
}
/**
* Gets the uml model template path.
*
* @return the template path
*/
public String getTemplatePath() {
return selectTemplateComposite.getTemplatePath();
}
/**
* Gets the notation model template path.
*
* @return the notation template path
*/
public String getNotationTemplatePath() {
return selectTemplateComposite.getNotationTemplatePath();
}
/**
* Gets the di model template path.
*
* @return the di template path
*/
public String getDiTemplatePath() {
return selectTemplateComposite.getDiTemplatePath();
}
/**
* Gets the template plugin id.
*
* @return the template plugin id
*/
public String getTemplatePluginId() {
return selectTemplateComposite.getTemplatePluginId();
}
/**
* Gets the diagram category.
*
* @return the diagram category
*/
private String[] getDiagramCategories() {
return myCategoryProvider.getCurrentCategories();
}
/**
* Gets the diagram name.
*
* @return the new diagram name
*/
public List getDiagramName() {
return diagramKindComposite.getDiagramName();
}
public String getRootElementName() {
return nameText.getText();
}
/**
* Templates enabled.
*
* @return true, if successful
*/
public boolean templatesEnabled() {
return allowTemplates;
}
/**
* Gets the selected command descriptors.
*
* @param categoryId
* the category id
* @return the selected command descriptors
*/
public List getSelectedPrototypes(String categoryId) {
ViewPrototype[] selected = getSelectedPrototypes();
List commands = new ArrayList();
for (int i = 0; i < selected.length; i++) {
for (Category category : selected[i].getCategories()) {
if (category.getName().equals(categoryId)) {
commands.add(selected[i]);
break;
}
}
}
return commands;
}
/**
* Creates the model template composite.
*
* @param composite
* the composite
*/
private void createModelTemplateComposite(Composite composite) {
Group group = createGroup(composite, Messages.SelectDiagramKindPage_load_template_group);
selectTemplateComposite = new SelectModelTemplateComposite(group);
}
/**
* Creates the diagram kind form.
*
* @param composite
* the composite
*/
private void createDiagramKindForm(Composite composite) {
Group group = createGroup(composite, Messages.SelectDiagramKindPage_select_kind_group);
diagramKindComposite = new DiagramKindComposite(group);
}
/**
* Creates the diagram kind label provider.
*
* @return the i base label provider
*/
protected IBaseLabelProvider createDiagramKindLabelProvider() {
return new DiagramKindLabelProvider();
}
/**
* Creates the group.
*
* @param parent
* the parent
* @param name
* the name
* @return the group
*/
private static Group createGroup(Composite parent, String name) {
Group group = new Group(parent, SWT.NONE);
group.setText(name);
GridLayout layout = new GridLayout(1, true);
// layout.marginHeight = 5;
// layout.marginWidth = 5;
group.setLayout(layout);
GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
group.setLayoutData(data);
return group;
}
/**
* Creates the name form.
*
* @param composite
* the composite
*/
private void createNameForm(Composite composite) {
Group group = createGroup(composite, Messages.SelectDiagramKindPage_diagram_name_group);
nameText = new Text(group, SWT.BORDER);
nameText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
nameText.setText(Messages.SelectDiagramKindPage_default_diagram_name);
nameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
validatePage();
}
});
}
/**
* Validate page.
*
* @return true, if successful
*/
private boolean validatePage() {
if (diagramKindComposite.getDiagramName().size() == 0) {
return false;
}
return true;
}
/**
* Gets the selected diagram kinds.
*
* @param categoryId
* the category id
* @return the selected diagram kinds
*/
public String[] getSelectedDiagramKinds(String categoryId) {
return new String[0];
}
/**
* Gets the selected diagram kind descriptors.
*
* @return the selected diagram kind descriptors
*/
protected ViewPrototype[] getSelectedPrototypes() {
List checked = diagramKindComposite.getCheckElement();
ViewPrototype[] result = checked.toArray(new ViewPrototype[checked.size()]);
return result;
}
/**
* Gets the creation command registry.
*
* @return the creation command registry
*/
protected final ICreationCommandRegistry getCreationCommandRegistry() {
return myCreationCommandRegistry;
}
/**
* The Interface CategoryProvider.
*/
public static interface CategoryProvider {
/**
* Gets the current categories.
*
* @return the current categories
*/
String[] getCurrentCategories();
}
public List getTemplateTransfo() {
return selectTemplateComposite.getTemplateTransfoPath();
}
@Override
public void performHelp() {
PlatformUI.getWorkbench().getHelpSystem().displayHelp("org.eclipse.papyrus.uml.diagram.wizards.Kind"); //$NON-NLS-1$
}
}