| /** |
| * Copyright (c) 2005-2007 IBM Corporation 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: |
| * IBM - Initial API and implementation |
| */ |
| package org.eclipse.emf.converter.ui.contribution.base; |
| |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.jface.viewers.AbstractTreeViewer; |
| import org.eclipse.jface.viewers.CheckStateChangedEvent; |
| import org.eclipse.jface.viewers.CheckboxTableViewer; |
| import org.eclipse.jface.viewers.CheckboxTreeViewer; |
| import org.eclipse.jface.viewers.ColumnWeightData; |
| import org.eclipse.jface.viewers.ICheckStateListener; |
| import org.eclipse.jface.viewers.IContentProvider; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.viewers.TableLayout; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.jface.viewers.ViewerComparator; |
| import org.eclipse.jface.viewers.ViewerFilter; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.custom.SashForm; |
| 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.graphics.Image; |
| import org.eclipse.swt.layout.FormAttachment; |
| import org.eclipse.swt.layout.FormData; |
| import org.eclipse.swt.layout.FormLayout; |
| 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.Control; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Table; |
| import org.eclipse.swt.widgets.TableColumn; |
| import org.eclipse.swt.widgets.TableItem; |
| import org.eclipse.swt.widgets.Text; |
| import org.eclipse.swt.widgets.Tree; |
| |
| import org.eclipse.emf.codegen.ecore.genmodel.GenModel; |
| import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage; |
| import org.eclipse.emf.codegen.ecore.genmodel.GenPackage; |
| import org.eclipse.emf.codegen.ecore.genmodel.provider.GenBaseItemProvider; |
| import org.eclipse.emf.codegen.ecore.genmodel.provider.GenModelEditPlugin; |
| import org.eclipse.emf.codegen.ecore.genmodel.provider.GenModelItemProvider; |
| import org.eclipse.emf.codegen.ecore.genmodel.provider.GenModelItemProviderAdapterFactory; |
| import org.eclipse.emf.codegen.ecore.genmodel.provider.GenPackageItemProvider; |
| import org.eclipse.emf.common.notify.Adapter; |
| import org.eclipse.emf.common.notify.AdapterFactory; |
| import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl; |
| import org.eclipse.emf.common.ui.celleditor.SingleColumnTableEditor; |
| import org.eclipse.emf.common.ui.dialogs.WorkspaceResourceDialog; |
| import org.eclipse.emf.common.util.URI; |
| import org.eclipse.emf.common.util.UniqueEList; |
| import org.eclipse.emf.converter.ConverterPlugin; |
| import org.eclipse.emf.converter.ModelConverter; |
| import org.eclipse.emf.converter.util.ConverterUIUtil; |
| import org.eclipse.emf.converter.util.ConverterUtil; |
| import org.eclipse.emf.ecore.EPackage; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.ecore.resource.ResourceSet; |
| import org.eclipse.emf.ecore.util.EcoreUtil; |
| import org.eclipse.emf.edit.provider.ItemProvider; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; |
| import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry; |
| |
| |
| /** |
| * @since 2.2.0 |
| */ |
| public class ModelConverterPackagePage extends ModelConverterPage |
| { |
| protected CheckboxTableViewer ePackagesCheckboxTableViewer; |
| protected int ePackageDataTableColumn = 1; |
| protected CheckboxTreeViewer referencedGenModelsCheckboxTreeViewer; |
| protected List<EPackage> filteredEPackages = new ConverterUtil.EPackageList(); |
| protected boolean showReferencedGenModels = false; |
| protected boolean isCellEditing = false; |
| |
| protected ModelConverterPackagePage(ModelConverter modelConverter, String pageName) |
| { |
| super(modelConverter, pageName); |
| |
| setTitle(ConverterPlugin.INSTANCE.getString("_UI_PackageSelection_title")); |
| } |
| |
| @Override |
| public void dispose() |
| { |
| ePackagesCheckboxTableViewer = null; |
| referencedGenModelsCheckboxTreeViewer = null; |
| |
| if (filteredEPackages != null) |
| { |
| filteredEPackages.clear(); |
| filteredEPackages = null; |
| } |
| |
| super.dispose(); |
| } |
| |
| public void setShowReferencedGenModels(boolean showReferencedGenModels) |
| { |
| this.showReferencedGenModels = showReferencedGenModels; |
| } |
| |
| public boolean showReferencedGenModels() |
| { |
| return showReferencedGenModels; |
| } |
| |
| @Override |
| protected void pageActivated(final boolean firstTime, int cause) |
| { |
| getControl().getDisplay().asyncExec(new Runnable() |
| { |
| public void run() |
| { |
| filterEPackagesTable(true); |
| validate(); |
| getContainer().updateButtons(); |
| } |
| }); |
| } |
| |
| @Override |
| public boolean isPageComplete() |
| { |
| return super.isPageComplete() && !getModelConverter().getEPackages().isEmpty() && ePackagesCheckboxTableViewer != null |
| && ePackagesCheckboxTableViewer.getCheckedElements().length > 0 |
| && !isCellEditing; |
| } |
| |
| public void createControl(Composite parent) |
| { |
| Composite composite = null; |
| if (showReferencedGenModels()) |
| { |
| composite = new SashForm(parent, SWT.VERTICAL); |
| composite.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| } |
| else |
| { |
| composite = new Composite(parent, SWT.NONE); |
| GridLayout layout = new GridLayout(); |
| layout.verticalSpacing = 12; |
| composite.setLayout(layout); |
| composite.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL)); |
| } |
| |
| Composite packageComposite = new Composite(composite, SWT.NONE); |
| { |
| GridLayout layout = new GridLayout(); |
| layout.verticalSpacing = 12; |
| packageComposite.setLayout(layout); |
| packageComposite.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL)); |
| } |
| createPackageControl(packageComposite); |
| |
| if (showReferencedGenModels()) |
| { |
| Composite referencedGenModelComposite = new Composite(composite, SWT.NONE); |
| { |
| GridLayout layout = new GridLayout(); |
| layout.verticalSpacing = 12; |
| referencedGenModelComposite.setLayout(layout); |
| referencedGenModelComposite.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_VERTICAL)); |
| } |
| createReferencedGenModelControl(referencedGenModelComposite); |
| ((SashForm)composite).setWeights(new int []{ 60, 40 }); |
| } |
| |
| setControl(composite); |
| } |
| |
| protected void createPackageControl(Composite parent) |
| { |
| Composite composite = new Composite(parent, SWT.NONE); |
| composite.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| { |
| FormLayout layout = new FormLayout(); |
| layout.marginTop = 10; |
| layout.spacing = 10; |
| composite.setLayout(layout); |
| } |
| |
| Label packagesLabel = new Label(composite, SWT.LEFT); |
| packagesLabel.setText(getPackagesLabel()); |
| { |
| FormData data = new FormData(); |
| data.left = new FormAttachment(0); |
| packagesLabel.setLayoutData(data); |
| } |
| |
| Table packagesTable = new Table(composite, SWT.CHECK | SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION); |
| ePackagesCheckboxTableViewer = new CheckboxTableViewer(packagesTable); |
| { |
| FormData data = new FormData(); |
| data.top = new FormAttachment(packagesLabel, 5); |
| data.bottom = new FormAttachment(100); |
| data.left = new FormAttachment(0); |
| data.right = new FormAttachment(100); |
| data.height = 90; |
| packagesTable.setLayoutData(data); |
| } |
| |
| Composite selectionComposite = new Composite(composite, SWT.NONE); |
| { |
| FormData data = new FormData(); |
| data.top = new FormAttachment(packagesLabel, 0, SWT.CENTER); |
| data.right = new FormAttachment(100); |
| selectionComposite.setLayoutData(data); |
| |
| GridLayout layout = new GridLayout(2, true); |
| layout.marginLeft = -5; |
| layout.marginRight = -5; |
| layout.marginTop = -5; |
| layout.marginBottom = -5; |
| selectionComposite.setLayout(layout); |
| } |
| |
| Button selectAllButton = new Button(selectionComposite, SWT.PUSH); |
| selectAllButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| selectAllButton.setText(getSelectAllLabel()); |
| selectAllButton.addSelectionListener(new SelectionAdapter() |
| { |
| @Override |
| public void widgetSelected(SelectionEvent event) |
| { |
| ePackagesCheckboxTableViewer.setCheckedElements(getModelConverter().getEPackages().toArray()); |
| ePackageCheckStateChanged(); |
| } |
| }); |
| |
| Button deselectAllButton = new Button(selectionComposite, SWT.PUSH); |
| deselectAllButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| deselectAllButton.setText(getDeselectAllLabel()); |
| deselectAllButton.addSelectionListener(new SelectionAdapter() |
| { |
| @Override |
| public void widgetSelected(SelectionEvent event) |
| { |
| ePackagesCheckboxTableViewer.setCheckedElements(new Object [0]); |
| ePackageCheckStateChanged(); |
| } |
| }); |
| |
| packagesTable.setLinesVisible(true); |
| packagesTable.setLayout(new TableLayout()); |
| |
| ePackagesCheckboxTableViewer.addCheckStateListener(new ICheckStateListener() |
| { |
| public void checkStateChanged(CheckStateChangedEvent event) |
| { |
| ePackageCheckStateChanged(); |
| } |
| }); |
| |
| adjustEPackagesTableViewer(ePackagesCheckboxTableViewer); |
| } |
| |
| protected void addEPackagesTableColumns(CheckboxTableViewer ePackagesTableViewer) |
| { |
| ePackagesTableViewer.setColumnProperties(new String []{ "a", "b" }); |
| |
| Table table = ePackagesTableViewer.getTable(); |
| table.setHeaderVisible(true); |
| |
| TableLayout tableLayout = (TableLayout)table.getLayout(); |
| |
| TableColumn packageColumn = new TableColumn(table, SWT.NONE); |
| tableLayout.addColumnData(new ColumnWeightData(1, true)); |
| packageColumn.setText(getEPackageColumnLabel()); |
| packageColumn.setResizable(true); |
| |
| TableColumn dataColumn = new TableColumn(table, SWT.NONE); |
| tableLayout.addColumnData(new ColumnWeightData(1, true)); |
| dataColumn.setText(getEPackageDataColumnLabel()); |
| dataColumn.setResizable(true); |
| } |
| |
| protected void adjustEPackagesTableViewer(CheckboxTableViewer ePackagesTableViewer) |
| { |
| AdapterFactory adapterFactory = new AdapterFactoryImpl(); |
| ePackagesTableViewer.setContentProvider(getEPackagesTableViewerContentProvider(adapterFactory)); |
| ePackagesTableViewer.setLabelProvider(getEPackagesTableViewerLabelProvider(adapterFactory)); |
| addEPackagesTableColumns(ePackagesTableViewer); |
| } |
| |
| protected void createEPackagesTableEditor() |
| { |
| new SingleColumnTableEditor(ePackagesCheckboxTableViewer.getTable()) |
| { |
| @Override |
| protected Control createEditor(final TableItem item, final int column) |
| { |
| if (item.getChecked()) |
| { |
| validateEPackageData((EPackage)item.getData(), item.getText(column)); |
| } |
| |
| final Text text = super.createTextEditor(item, column); |
| text.addModifyListener(new ModifyListener() |
| { |
| public void modifyText(ModifyEvent event) |
| { |
| if (column == 1 && item.getChecked()) |
| { |
| validateEPackageData((EPackage)item.getData(), text.getText()); |
| } |
| } |
| }); |
| isCellEditing = true; |
| setPageComplete(false); |
| return text; |
| } |
| |
| @Override |
| protected void update(TableItem item, int column, Control editor) |
| { |
| String value = ((Text)editor).getText(); |
| item.setText(column, value); |
| setEPackageData((EPackage)item.getData(), value); |
| isCellEditing = false; |
| validate(); |
| setPageComplete(isPageComplete()); |
| } |
| }; |
| } |
| |
| protected boolean validateEPackageData(EPackage ePackage, String data) |
| { |
| return true; |
| } |
| |
| protected void setEPackageData(EPackage ePackage, String data) |
| { |
| // Subclasses may override |
| } |
| |
| protected String getEPackageData(EPackage ePackage) |
| { |
| return null; |
| } |
| |
| protected IContentProvider getEPackagesTableViewerContentProvider(AdapterFactory adapterFactory) |
| { |
| return new AdapterFactoryContentProvider(adapterFactory); |
| } |
| |
| protected ILabelProvider getEPackagesTableViewerLabelProvider(AdapterFactory adapterFactory) |
| { |
| return new AdapterFactoryLabelProvider(adapterFactory) |
| { |
| @Override |
| public Image getColumnImage(Object o, int columnIndex) |
| { |
| switch (columnIndex) |
| { |
| case 0: |
| { |
| return getEPackageImage(); |
| } |
| default: |
| { |
| return null; |
| } |
| } |
| } |
| |
| @Override |
| public String getColumnText(Object o, int columnIndex) |
| { |
| EPackage ePackage = (EPackage)o; |
| String text = columnIndex == 0 ? |
| getLabel(ePackage) : |
| columnIndex == ePackageDataTableColumn ? |
| getEPackageData(ePackage) : |
| null; |
| |
| return text == null ? "" : text; |
| } |
| }; |
| } |
| |
| protected String getLabel(EPackage ePackage) |
| { |
| GenPackage genPackage = getModelConverter().getGenModel().findGenPackage(ePackage); |
| if (genPackage != null) |
| { |
| return getLabel(genPackage); |
| } |
| |
| return supportsNestedPackages() ? |
| ConverterUtil.getQualifiedName(ePackage) : |
| ePackage.getName(); |
| } |
| |
| protected void ePackageCheckStateChanged() |
| { |
| validate(); |
| getContainer().updateButtons(); |
| |
| Set<Object> checkedElements = new HashSet<Object>(Arrays.asList(ePackagesCheckboxTableViewer.getCheckedElements())); |
| for (EPackage ePackage : getModelConverter().getEPackages()) |
| { |
| getModelConverter().getEPackageConvertInfo(ePackage).setConvert(checkedElements.contains(ePackage)); |
| } |
| } |
| |
| @SuppressWarnings("unchecked") |
| public List<EPackage> getCheckedEPackages() |
| { |
| return ePackagesCheckboxTableViewer != null ? |
| (List<EPackage>)(List<?>)Arrays.asList(ePackagesCheckboxTableViewer.getCheckedElements()) |
| : Collections.<EPackage>emptyList(); |
| } |
| |
| public List<GenPackage> getCheckedReferencedGenPackages() |
| { |
| if (referencedGenModelsCheckboxTreeViewer != null) |
| { |
| List<GenPackage> genPackages = new ConverterUtil.GenPackageList(); |
| Object[] checkedElements = referencedGenModelsCheckboxTreeViewer.getCheckedElements(); |
| for (int i = 0; i < checkedElements.length; i++) |
| { |
| if (checkedElements[i] instanceof GenPackage) |
| { |
| genPackages.add((GenPackage)checkedElements[i]); |
| } |
| } |
| return genPackages; |
| } |
| else |
| { |
| return Collections.emptyList(); |
| } |
| } |
| |
| protected String getEPackageColumnLabel() |
| { |
| return ConverterPlugin.INSTANCE.getString("_UI_Package_label"); |
| } |
| |
| protected String getEPackageDataColumnLabel() |
| { |
| return ConverterPlugin.INSTANCE.getString("_UI_EPackageData_label"); |
| } |
| |
| protected String getDeselectAllLabel() |
| { |
| return ConverterPlugin.INSTANCE.getString("_UI_DeselectAll_label"); |
| } |
| |
| protected String getSelectAllLabel() |
| { |
| return ConverterPlugin.INSTANCE.getString("_UI_SelectAll_label"); |
| } |
| |
| protected String getPackagesLabel() |
| { |
| return ConverterPlugin.INSTANCE.getString("_UI_Packages_label"); |
| } |
| |
| protected Image getEPackageImage() |
| { |
| return ExtendedImageRegistry.INSTANCE.getImage(new GenBaseItemProvider.UnderlayedImage( |
| GenModelEditPlugin.INSTANCE.getImage("full/obj16/EPackage"))); |
| } |
| |
| protected void createReferencedGenModelControl(Composite parent) |
| { |
| Composite composite = new Composite(parent, SWT.NONE); |
| composite.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| { |
| FormLayout layout = new FormLayout(); |
| layout.marginTop = 10; |
| layout.spacing = 10; |
| composite.setLayout(layout); |
| } |
| |
| Label referencedGenModelsLabel = new Label(composite, SWT.LEFT); |
| referencedGenModelsLabel.setText(getReferencedGenModelsLabel()); |
| { |
| FormData data = new FormData(); |
| data.left = new FormAttachment(0); |
| referencedGenModelsLabel.setLayoutData(data); |
| } |
| |
| Tree referencedGenModelsTree = new Tree(composite, SWT.CHECK | SWT.BORDER | SWT.SINGLE); |
| { |
| FormData data = new FormData(); |
| data.top = new FormAttachment(referencedGenModelsLabel, 5); |
| data.bottom = new FormAttachment(100); |
| data.left = new FormAttachment(0); |
| data.right = new FormAttachment(100); |
| referencedGenModelsTree.setLayoutData(data); |
| } |
| |
| Button referencedGenModelsAddButton = new Button(composite, SWT.PUSH); |
| referencedGenModelsAddButton.setText(getBrowseButtonLabel()); |
| { |
| FormData data = new FormData(); |
| data.top = new FormAttachment(referencedGenModelsLabel, 0, SWT.CENTER); |
| data.right = new FormAttachment(100); |
| referencedGenModelsAddButton.setLayoutData(data); |
| } |
| referencedGenModelsAddButton.addSelectionListener(new SelectionAdapter() |
| { |
| @Override |
| public void widgetSelected(SelectionEvent event) |
| { |
| referencedGenModelsBrowseSelected(referencedGenModelsCheckboxTreeViewer); |
| } |
| }); |
| |
| referencedGenModelsTree.setLinesVisible(true); |
| |
| referencedGenModelsCheckboxTreeViewer = new CheckboxTreeViewer(referencedGenModelsTree); |
| referencedGenModelsCheckboxTreeViewer.addCheckStateListener(new ICheckStateListener() |
| { |
| public void checkStateChanged(CheckStateChangedEvent event) |
| { |
| referencedGenModelsCheckboxTreeViewerCheckStateChanged(event); |
| } |
| }); |
| |
| adjustReferencedGenModelsTreeViewer(referencedGenModelsCheckboxTreeViewer); |
| } |
| |
| protected void addReferencedGenModelsTreeColumns(CheckboxTreeViewer referencedGenModelsTreeViewer) |
| { |
| // Subclasses may override |
| } |
| |
| protected boolean supportsNestedPackages() |
| { |
| return false; |
| } |
| |
| protected void adjustReferencedGenModelsTreeViewer(CheckboxTreeViewer referencedGenModelsTreeViewer) |
| { |
| GenModelItemProviderAdapterFactory genModelItemProviderAdapterFactory = new GenModelItemProviderAdapterFactory() |
| { |
| @Override |
| public Adapter createGenModelAdapter() |
| { |
| if (genModelItemProvider == null) |
| { |
| genModelItemProvider = new GenModelItemProvider(this) |
| { |
| @Override |
| public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) |
| { |
| return Collections.singleton(GenModelPackage.Literals.GEN_MODEL__GEN_PACKAGES); |
| } |
| }; |
| } |
| return genModelItemProvider; |
| } |
| |
| @Override |
| public Adapter createGenPackageAdapter() |
| { |
| if (genPackageItemProvider == null) |
| { |
| genPackageItemProvider = new GenPackageItemProvider(this) |
| { |
| @Override |
| public Collection<EStructuralFeature> getChildrenFeatures(Object object) |
| { |
| return supportsNestedPackages() ? |
| Collections.<EStructuralFeature>singleton(GenModelPackage.Literals.GEN_PACKAGE__NESTED_GEN_PACKAGES) : |
| Collections.<EStructuralFeature>emptyList(); |
| } |
| }; |
| } |
| return genPackageItemProvider; |
| } |
| }; |
| |
| // Sorting only the genModels |
| referencedGenModelsTreeViewer.setComparator(new ViewerComparator() |
| { |
| @Override |
| public void sort(Viewer viewer, Object[] elements) |
| { |
| if (elements.length > 0 && elements[0] instanceof GenModel) |
| { |
| super.sort(viewer, elements); |
| } |
| } |
| }); |
| |
| referencedGenModelsTreeViewer.setContentProvider(getReferencedGenModelsTreeViewerContentProvider(genModelItemProviderAdapterFactory)); |
| referencedGenModelsTreeViewer.setLabelProvider(getReferencedGenModelsTreeViewerLabelProvider(genModelItemProviderAdapterFactory)); |
| |
| addReferencedGenModelsTreeColumns(referencedGenModelsCheckboxTreeViewer); |
| addReferencedGenModelsTreeCheckStateManager(referencedGenModelsCheckboxTreeViewer.getTree()); |
| } |
| |
| protected void addReferencedGenModelsTreeCheckStateManager(Tree tree) |
| { |
| new ConverterUIUtil.TreeCheckStateManager(tree); |
| } |
| |
| protected IContentProvider getReferencedGenModelsTreeViewerContentProvider(AdapterFactory adapterFactory) |
| { |
| return new AdapterFactoryContentProvider(adapterFactory); |
| } |
| |
| protected ILabelProvider getReferencedGenModelsTreeViewerLabelProvider(AdapterFactory adapterFactory) |
| { |
| return new AdapterFactoryLabelProvider(adapterFactory) |
| { |
| @Override |
| public String getColumnText(Object object, int columnIndex) |
| { |
| return getLabel(object, super.getColumnText(object, 0)); |
| } |
| |
| @Override |
| public String getText(Object element) |
| { |
| return getLabel(element, super.getText(element)); |
| } |
| }; |
| } |
| |
| /** |
| * Returns the label of a given object. |
| */ |
| protected String getLabel(Object object, String defaultText) |
| { |
| if (object instanceof GenModel) |
| { |
| GenModel genModel = (GenModel)object; |
| Resource resource = genModel.eResource(); |
| URI uri = resource != null ? resource.getURI() : null; |
| if (uri != null) |
| { |
| String location = uri.toString(); |
| boolean plugin = uri.isPlatformPlugin(); |
| if (plugin || uri.isPlatformResource()) |
| { |
| String segment = URI.decode(uri.segment(1)); |
| location = ConverterPlugin.INSTANCE.getString(plugin ? "_UI_PlatformPlugin_label" : "_UI_PlatformResource_label", new String[]{segment}); |
| } |
| return ConverterPlugin.INSTANCE.getString("_UI_ReferencedGenModel_label", new Object [] { defaultText, location }); |
| } |
| } |
| else if (object instanceof GenPackage) |
| { |
| return getLabel((GenPackage)object); |
| } |
| return defaultText; |
| } |
| |
| protected String getLabel(GenPackage genPackage) |
| { |
| return genPackage.getInterfacePackageName(); |
| } |
| |
| /** |
| * @deprecated in 2.3.0. Use {@link #referencedGenModelsAddSelected(CheckboxTreeViewer)} |
| * instead. This method will be remove in future versions of the code. |
| */ |
| @Deprecated |
| protected void referencedGenModelsBrowseSelected(CheckboxTreeViewer treeViewer) |
| { |
| referencedGenModelsAddSelected(treeViewer); |
| } |
| |
| protected void referencedGenModelsAddSelected(CheckboxTreeViewer treeViewer) |
| { |
| IPath path = null; |
| Resource resource = getModelConverter().getGenModel().eResource(); |
| if (resource != null) |
| { |
| if (resource.getURI().isPlatformResource()) |
| { |
| path = new Path(resource.getURI().toPlatformString(true)).makeAbsolute(); |
| } |
| } |
| final IPath genModelPath = path; |
| |
| ResourceSet resourceSet = null; |
| List<GenModel> genModels = new UniqueEList.FastCompare<GenModel>(); |
| final Set<URI> genModelURIs = new HashSet<URI>(); |
| Object input = treeViewer.getInput(); |
| if (input instanceof ItemProvider) |
| { |
| Collection<?> elements = ((ItemProvider)input).getChildren(); |
| for (Object element : elements) |
| { |
| if (element instanceof GenModel) |
| { |
| GenModel genModel = (GenModel)element; |
| URI genModelURI = genModel.eResource().getURI(); |
| genModels.add(genModel); |
| genModelURIs.add(genModelURI); |
| if (resourceSet == null && genModelURI.isPlatformResource()) |
| { |
| resourceSet = genModel.eResource().getResourceSet(); |
| } |
| } |
| } |
| } |
| |
| ViewerFilter genModelFilter = new ViewerFilter() |
| { |
| @Override |
| public boolean select(Viewer viewer, Object parentElement, Object element) |
| { |
| if (element instanceof IFile) |
| { |
| IFile file = (IFile)element; |
| URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true); |
| String fileExtension = file.getFileExtension(); |
| return ("genmodel".equals(fileExtension) || "xcore".equals(fileExtension)) |
| && !file.getFullPath().equals(genModelPath) |
| && !genModelURIs.contains(uri); |
| } |
| return true; |
| } |
| }; |
| |
| IFile[] files = WorkspaceResourceDialog.openFileSelection(getShell(), |
| null, ConverterPlugin.INSTANCE.getString("_UI_SelectGenModel_message"), |
| true, null, Collections.singletonList(genModelFilter)); |
| |
| if (files.length > 0) |
| { |
| ResourceSet referencedGenModels = resourceSet != null ? |
| resourceSet : |
| getModelConverter().createResourceSet(); |
| |
| for (int i = 0; i < files.length; ++i) |
| { |
| URI genModelURI = URI.createPlatformResourceURI(files[i].getFullPath().toString(), true); |
| Resource genModelResource = referencedGenModels.getResource(genModelURI, true); |
| GenModel genModel = (GenModel)EcoreUtil.getObjectByType(genModelResource.getContents(), GenModelPackage.Literals.GEN_MODEL); |
| genModels.add(genModel); |
| } |
| |
| addExternalGenModels(genModels); |
| addReferencedGenModels(genModels); |
| |
| List<GenPackage> genPackagesToCheck = new ArrayList<GenPackage>(); |
| Object[] checkedElements = treeViewer.getCheckedElements(); |
| LOOP: |
| for (int i = 0; i < checkedElements.length; i++) |
| { |
| if (checkedElements[i] instanceof GenPackage) |
| { |
| GenPackage checkedGenPackage = (GenPackage)checkedElements[i]; |
| String nsURI = checkedGenPackage.getNSURI(); |
| for (GenModel genModel : genModels) |
| { |
| for (GenPackage genPackage : genModel.getGenPackages()) |
| { |
| if (nsURI.equals(genPackage.getNSURI())) |
| { |
| genPackagesToCheck.add(genPackage); |
| continue LOOP; |
| } |
| } |
| } |
| } |
| } |
| treeViewer.getTree().deselectAll(); |
| treeViewer.cancelEditing(); |
| treeViewer.setInput(new ItemProvider(genModels)); |
| for (Iterator<?> i = genModels.iterator(); i.hasNext();) |
| { |
| treeViewer.expandToLevel(i.next(), AbstractTreeViewer.ALL_LEVELS); |
| } |
| treeViewer.setCheckedElements(genPackagesToCheck.toArray()); |
| referencedGenModelsCheckboxTreeViewerCheckStateChanged(null); |
| } |
| } |
| |
| /** |
| * This method is invoked when one element in the referenced GenModels tree is |
| * checked or unchecked. The event argument can be <tt>null</tt>. |
| */ |
| protected void referencedGenModelsCheckboxTreeViewerCheckStateChanged(CheckStateChangedEvent event) |
| { |
| if (event == null || event.getElement() instanceof GenPackage) |
| { |
| filterEPackagesTable(false); |
| validate(); |
| getContainer().updateButtons(); |
| } |
| } |
| |
| protected String getAddButtonLabel() |
| { |
| return ConverterPlugin.INSTANCE.getString("_UI_Add_label"); |
| } |
| |
| /** |
| * @deprecated in 2.3.0. Use {@link #getAddButtonLabel()} instead. This |
| * method will be remove in future versions of the code. |
| */ |
| @Deprecated |
| protected String getBrowseButtonLabel() |
| { |
| return getAddButtonLabel(); |
| } |
| |
| protected String getReferencedGenModelsLabel() |
| { |
| return ConverterPlugin.INSTANCE.getString("_UI_ReferencedGeneratorModels_label"); |
| } |
| |
| protected String getSelectGenModelDialogMessage() |
| { |
| return ConverterPlugin.INSTANCE.getString("_UI_SelectAllGeneratorModels_description"); |
| } |
| |
| protected void validate() |
| { |
| String message = null; |
| |
| Map<String, GenPackage> nsURIToGenPackage = new HashMap<String, GenPackage>(); |
| List<GenPackage> referencedGenPackages = getModelConverter().getReferencedGenPackages(); |
| for (GenPackage genPackage : referencedGenPackages) |
| { |
| GenPackage previousGenPackage = nsURIToGenPackage.put(genPackage.getNSURI(), genPackage); |
| if (previousGenPackage != null) |
| { |
| message = ConverterPlugin.INSTANCE.getString("_UI_SameReferencedNSURI_error", new Object []{getLabel(previousGenPackage), getLabel(genPackage)}); |
| break; |
| } |
| } |
| |
| if (message == null) |
| { |
| List<EPackage> tableCheckedEPackages = getCheckedEPackages(); |
| |
| List<EPackage> referencedEPackages = new ConverterUtil.EPackageList(); |
| for (EPackage ePackage : getModelConverter().getEPackages()) |
| { |
| if (tableCheckedEPackages.contains(ePackage) || !filteredEPackages.contains(ePackage)) |
| { |
| referencedEPackages.addAll(ConverterUtil.computeRequiredPackages(ePackage)); |
| } |
| } |
| |
| for (EPackage ePackage : referencedEPackages) |
| { |
| while (ePackage.getESuperPackage() != null) |
| { |
| ePackage = ePackage.getESuperPackage(); |
| } |
| if (!tableCheckedEPackages.contains(ePackage) && filteredEPackages.contains(ePackage)) |
| { |
| message = ConverterPlugin.INSTANCE.getString("_UI_PackageIsUsedBySelectedPackage_message", new Object []{getLabel(ePackage)}); |
| break; |
| } |
| } |
| } |
| |
| setErrorMessage(message); |
| } |
| |
| protected void filterEPackagesTable(boolean reloadReferencedGenPackagesTable) |
| { |
| List<GenPackage> genPackagesToCheck = null; |
| if (referencedGenModelsCheckboxTreeViewer != null) |
| { |
| if (reloadReferencedGenPackagesTable) |
| { |
| if (!getModelConverter().getReferencedGenPackages().isEmpty() || !getModelConverter().getExternalGenModels().isEmpty()) |
| { |
| List<GenModel> genModels = new UniqueEList.FastCompare<GenModel>(); |
| genPackagesToCheck = new ConverterUtil.GenPackageList(); |
| for (GenPackage genPackage : getModelConverter().getReferencedGenPackages()) |
| { |
| genModels.add(genPackage.getGenModel()); |
| ModelConverter.ReferencedGenPackageConvertInfo genPackageInfo = |
| getModelConverter().getReferenceGenPackageConvertInfo(genPackage); |
| if (genPackageInfo.isValidReference()) |
| { |
| genPackagesToCheck.add(genPackage); |
| } |
| } |
| |
| addExternalGenModels(genModels); |
| referencedGenModelsCheckboxTreeViewer.setInput(new ItemProvider(genModels)); |
| referencedGenModelsCheckboxTreeViewer.expandAll(); |
| } |
| } |
| else |
| { |
| getModelConverter().getReferencedGenPackages().clear(); |
| Object[] checkedElements = referencedGenModelsCheckboxTreeViewer.getCheckedElements(); |
| for (int i = 0; i < checkedElements.length; i++) |
| { |
| if (checkedElements[i] instanceof GenPackage) |
| { |
| GenPackage genPackage = (GenPackage)checkedElements[i]; |
| getModelConverter().getReferencedGenPackages().add(genPackage); |
| getModelConverter().getReferenceGenPackageConvertInfo(genPackage).setValidReference(true); |
| } |
| } |
| referencedGenModelsCheckboxTreeViewer.refresh(); |
| genPackagesToCheck = getModelConverter().getReferencedGenPackages(); |
| } |
| } |
| |
| genPackagesToCheck = getReferencedGenPackagesToCheck(genPackagesToCheck == null ? Collections.<GenPackage>emptyList() : genPackagesToCheck, reloadReferencedGenPackagesTable); |
| if (genPackagesToCheck.isEmpty()) |
| { |
| filteredEPackages = getModelConverter().getEPackages(); |
| } |
| else |
| { |
| if (reloadReferencedGenPackagesTable) |
| { |
| referencedGenModelsCheckboxTreeViewer.setCheckedElements(genPackagesToCheck.toArray()); |
| referencedGenModelsCheckboxTreeViewer.setSelection(new StructuredSelection(genPackagesToCheck.toArray()), true); |
| } |
| filteredEPackages = getModelConverter().filterReferencedEPackages(getModelConverter().getEPackages(), genPackagesToCheck); |
| } |
| |
| List<EPackage> checkedEPackages = new ArrayList<EPackage>(); |
| for (EPackage ePackage : getModelConverter().getEPackages()) |
| { |
| ModelConverter.EPackageConvertInfo ePackageInfo = getModelConverter().getEPackageConvertInfo(ePackage); |
| if (filteredEPackages.contains(ePackage) && ePackageInfo.isConvert()) |
| { |
| checkedEPackages.add(ePackage); |
| } |
| else |
| { |
| ePackageInfo.setConvert(false); |
| } |
| } |
| ePackagesCheckboxTableViewer.setInput(new ItemProvider(filteredEPackages)); |
| ePackagesCheckboxTableViewer.setCheckedElements(checkedEPackages.toArray()); |
| } |
| |
| /** |
| * Returns a not null list with the GenPackages that should be selected |
| * in the referenced Tree Viewer. The list passed in the genPackage |
| * is not null and contains all GenPackages that can be marked. This list |
| * can be both changed and returned. |
| */ |
| protected List<GenPackage> getReferencedGenPackagesToCheck(List<GenPackage> genPackages, boolean reloadReferencedGenPackagesTable) |
| { |
| return genPackages; |
| } |
| |
| protected void addExternalGenModels(List<GenModel> genModels) |
| { |
| List<GenModel> externalGenModels = new ArrayList<GenModel>(getModelConverter().getExternalGenModels()); |
| if (!externalGenModels.isEmpty()) |
| { |
| GenModel exporterGenModel = getModelConverter().getGenModel(); |
| boolean hasExporterGenModel = exporterGenModel != null && genModels.contains(exporterGenModel); |
| if (!hasExporterGenModel) |
| { |
| genModels.add(exporterGenModel); |
| } |
| |
| for (GenModel genModel : genModels) |
| { |
| for (Iterator<GenModel> j = externalGenModels.iterator(); j.hasNext();) |
| { |
| GenModel externalGenModel = j.next(); |
| if (genModel == externalGenModel) |
| { |
| j.remove(); |
| } |
| else |
| { |
| URI uri = genModel.eResource() != null ? |
| genModel.eResource().getURI() : |
| null; |
| |
| if (uri != null) |
| { |
| URI externalURI = externalGenModel.eResource() != null ? |
| externalGenModel.eResource().getURI() : |
| null; |
| |
| if (uri.equals(externalURI)) |
| { |
| j.remove(); |
| } |
| } |
| } |
| } |
| } |
| genModels.addAll(externalGenModels); |
| |
| if (!hasExporterGenModel) |
| { |
| genModels.remove(exporterGenModel); |
| } |
| } |
| } |
| |
| protected void addReferencedGenModels(List<GenModel> genModels) |
| { |
| // Subclasses may override |
| } |
| } |