/******************************************************************************* * Copyright (c) 2005, 2007 committers of openArchitectureWare and others. * 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: * committers of openArchitectureWare - initial API and implementation *******************************************************************************/ package org.eclipse.xtend.shared.ui.wizards; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.xtend.shared.ui.Messages; import org.eclipse.xtend.shared.ui.core.metamodel.Contributor; import org.eclipse.xtend.shared.ui.core.metamodel.MetamodelContributorRegistry; import org.eclipse.xtend.shared.ui.core.properties.MetamodelContributorsPropertyAndPreferencePage; /** * The "New" wizard page allows setting the container for the new file as well * as the file name. The page will only accept file name without the extension * OR with the extension that matches the expected one (xtxt). */ public class XtendXpandProjectWizardPage extends WizardPage { private Text projectText; private Button generateSimpleExample; private Button useWorkspaceDefinedMetaModels; private Button useProjectSpecificMetaModels; private Button downButton; private Button upButton; private List<Contributor> availableMetamodelContributors; private Table table; private Composite tableContainer; private CheckboxTableViewer checkboxTableViewer; private String storeString; public String getStoreString() { return storeString; } /** * Renders a human readable representation of the meta model contributors. */ class TableLabelProvider extends LabelProvider implements ITableLabelProvider { public String getColumnText(final Object element, final int columnIndex) { if (element instanceof Contributor) { final Contributor contributor = (Contributor) element; return contributor.getDisplayName(); } return element.toString(); } public Image getColumnImage(final Object element, final int columnIndex) { return null; } } private List<Contributor> getMetamodelContributors(final boolean includeDisabled) { final Map<String, Contributor> availableMetamodelContributors = MetamodelContributorRegistry .getRegisteredMetamodelContributors(); final List<Contributor> result = new ArrayList<Contributor>(); if (includeDisabled) { for (final Contributor contributor : availableMetamodelContributors.values()) { if (!result.contains(contributor)) { result.add(contributor); } } } return result; } private void updateButtonStates() { final int index = table.getSelectionIndex(); if (index == 0) { upButton.setEnabled(false); } else { upButton.setEnabled(true); } if (index >= checkboxTableViewer.getTable().getItemCount() - 1) { downButton.setEnabled(false); } else { downButton.setEnabled(true); } storeString = MetamodelContributorsPropertyAndPreferencePage.createStoreString(checkboxTableViewer.getCheckedElements()); } private void enableMetamodelContributorTable(final boolean enabled) { checkboxTableViewer.setAllGrayed(!enabled); checkboxTableViewer.getTable().deselectAll(); tableContainer.setEnabled(enabled); upButton.setEnabled(enabled); downButton.setEnabled(enabled); if (enabled) updateButtonStates(); } /** * Constructor for SampleNewWizardPage. * * @param pageName */ public XtendXpandProjectWizardPage() { super(Messages.XtendXpandProjectWizardPage_Name); setTitle(Messages.XtendXpandProjectWizardPage_Title); setDescription(Messages.XtendXpandProjectWizardPage_Description); } /** * @see IDialogPage#createControl(Composite) */ public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); container.setLayout(layout); layout.numColumns = 2; layout.verticalSpacing = 9; GridData gd = new GridData(GridData.FILL_HORIZONTAL); Label label = new Label(container, SWT.NULL); label.setText(Messages.XtendXpandProjectWizardPage_ProjectLabel); projectText = new Text(container, SWT.BORDER | SWT.SINGLE); gd = new GridData(GridData.FILL_HORIZONTAL); projectText.setLayoutData(gd); projectText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { dialogChanged(); } }); final Group mm_list = new Group(container, SWT.SHADOW_IN); layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.horizontalSpacing = 0; layout.marginWidth = 0; mm_list.setLayout(layout); gd = new GridData(); gd.horizontalSpan = 2; gd.horizontalAlignment = SWT.FILL; gd.grabExcessHorizontalSpace = true; gd.verticalAlignment = SWT.FILL; gd.grabExcessVerticalSpace = true; mm_list.setLayoutData(gd); mm_list.setText("Meta Models"); useWorkspaceDefinedMetaModels = new Button(mm_list, SWT.RADIO); label = new Label(mm_list, SWT.NULL); label.setText("Use workspace defaults"); useProjectSpecificMetaModels = new Button (mm_list, SWT.RADIO); label = new Label(mm_list, SWT.NULL); label.setText("Use project specific metamodels:"); tableContainer = new Composite(mm_list, SWT.NULL); gd = new GridData(); gd.horizontalSpan = 2; gd.horizontalIndent = 22; layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.horizontalSpacing = 0; layout.marginWidth = 0; tableContainer.setLayoutData(gd); tableContainer.setLayout(layout); checkboxTableViewer = CheckboxTableViewer.newCheckList(tableContainer, SWT.BORDER); checkboxTableViewer.setLabelProvider(new TableLabelProvider()); checkboxTableViewer.setContentProvider(new ArrayContentProvider()); table = checkboxTableViewer.getTable(); table.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { updateButtonStates(); dialogChanged(); } }); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); final Composite composite = new Composite(tableContainer, SWT.NONE); composite.setLayoutData(new GridData(SWT.CENTER, SWT.TOP, false, false)); final GridLayout gridLayout_1 = new GridLayout(); composite.setLayout(gridLayout_1); upButton = new Button(composite, SWT.NONE); upButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { final ISelection selection = checkboxTableViewer.getSelection(); if (selection instanceof IStructuredSelection) { final IStructuredSelection structuredSelection = (IStructuredSelection) selection; final Object firstElement = structuredSelection.getFirstElement(); if (firstElement instanceof Contributor) { final Contributor contributor = (Contributor) firstElement; final int index = availableMetamodelContributors.indexOf(contributor); availableMetamodelContributors.remove(contributor); availableMetamodelContributors.add(index - 1, contributor); checkboxTableViewer.refresh(); } } updateButtonStates(); } }); final GridData gridData_1 = new GridData(SWT.FILL, SWT.CENTER, false, false); gridData_1.widthHint = 75; upButton.setLayoutData(gridData_1); upButton.setText(Messages.MetamodelContributorsPropertyAndPreferencePage_UpButton); downButton = new Button(composite, SWT.NONE); downButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { final ISelection selection = checkboxTableViewer.getSelection(); if (selection instanceof IStructuredSelection) { final IStructuredSelection structuredSelection = (IStructuredSelection) selection; final Object firstElement = structuredSelection.getFirstElement(); if (firstElement instanceof Contributor) { final Contributor contributor = (Contributor) firstElement; final int index = availableMetamodelContributors.indexOf(contributor); availableMetamodelContributors.remove(contributor); availableMetamodelContributors.add(index + 1, contributor); checkboxTableViewer.refresh(); } } updateButtonStates(); } }); final GridData gridData = new GridData(SWT.FILL, SWT.CENTER, false, false); gridData.widthHint = 75; downButton.setLayoutData(gridData); downButton.setText(Messages.MetamodelContributorsPropertyAndPreferencePage_DownButton); generateSimpleExample = new Button(mm_list, SWT.RADIO); label = new Label(mm_list, SWT.NULL); label.setText("Generate a sample EMF based Xpand project"); generateSimpleExample.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { dialogChanged(); enableMetamodelContributorTable(false); } public void widgetSelected(SelectionEvent e) { dialogChanged(); enableMetamodelContributorTable(false); } }); useWorkspaceDefinedMetaModels.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { dialogChanged(); enableMetamodelContributorTable(false); } public void widgetSelected(SelectionEvent e) { dialogChanged(); enableMetamodelContributorTable(false); } }); useProjectSpecificMetaModels.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { dialogChanged(); enableMetamodelContributorTable(true); } public void widgetSelected(SelectionEvent e) { dialogChanged(); enableMetamodelContributorTable(true); } }); setupData(); initialize(); dialogChanged(); setControl(container); } /** * Fills the table viewer with a list of available metamodel contributors * and visually checks the ones that are enabled. */ private void setupData() { availableMetamodelContributors = getMetamodelContributors(true); checkboxTableViewer.setInput(availableMetamodelContributors); final Collection<Contributor> enabledMetamodelContributors = getMetamodelContributors(false); checkboxTableViewer.setCheckedElements(enabledMetamodelContributors.toArray()); } /** * Tests if the current workbench selection is a suitable container to use. */ private void initialize() { projectText.setText(Messages.XtendXpandProjectWizardPage_DefaultFileName); tableContainer.setEnabled(false); useWorkspaceDefinedMetaModels.setSelection(true); } /** * Ensures that both text fields are set. */ void dialogChanged() { if (projectText.getText().trim().length() == 0) { setErrorMessage(Messages.XtendXpandProjectWizardPage_ProjectName_Error); return; } if (useProjectSpecificMetaModels.getSelection() && checkboxTableViewer.getCheckedElements().length == 0) { setErrorMessage(Messages.XtendXpandProjectWizardPage_NoMMSelected_Error); return; } setErrorMessage(null); setPageComplete(true); } public String getProjectName() { return projectText.getText(); } public boolean isCreateExample() { return generateSimpleExample.getSelection(); } public boolean isUseWorkspaceDefinedMM() { return useWorkspaceDefinedMetaModels.getSelection(); } public boolean isProjectSpecificMM() { return useProjectSpecificMetaModels.getSelection(); } }