blob: 2b6eb711394d5da8f08638df0a879586d23a71e5 [file] [log] [blame]
/**
* 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
}
}