/** * Copyright (c) 2005-2006 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 implementa * tion */ package org.eclipse.emf.exporter.ui.contribution.base; import java.util.Iterator; import java.util.List; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.TreeEditor; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.swt.widgets.Widget; import org.eclipse.emf.codegen.ecore.genmodel.GenPackage; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.converter.ui.contribution.base.ModelConverterPackagePage; import org.eclipse.emf.converter.util.ConverterUIUtil; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.emf.exporter.ExporterPlugin; import org.eclipse.emf.exporter.ModelExporter; import org.eclipse.emf.exporter.ModelExporter.ReferencedGenPackageExportInfo; import org.eclipse.emf.exporter.ui.contribution.ModelExporterDescriptor; import org.eclipse.emf.exporter.ui.contribution.ModelExporterManager; import org.eclipse.emf.exporter.util.ExporterUIUtil; /** * @since 2.2.0 */ public class ModelExporterPackagePage extends ModelConverterPackagePage implements IModelExporterPage { public class ReferencedGenPackageTreeEditorHelper extends ExporterUIUtil.TreeEditorHelper { public ReferencedGenPackageTreeEditorHelper(Tree tree) { super(tree); } @Override public void handleEvent(Event event) { if (event.widget instanceof CCombo) { comboSelected(event); } else { super.handleEvent(event); } } protected void comboSelected(Event event) { CCombo combo = (CCombo)event.widget; TreeItem treeItem = ((TreeEditor)compositeEditor).getItem(); String text = combo.getItem(combo.getSelectionIndex()); treeItem.setText(getColumn(), text); boolean validate = true; Object[] itemData = (Object[])combo.getData(text); if (itemData != null) { String exporterID = (String)itemData[0]; URI artifactURI = (URI)itemData[1]; GenPackage genPackage = (GenPackage)combo.getData(); ModelExporter.ReferencedGenPackageExportInfo genPackageInfo = getModelExporter().getReferencedGenPackageExportInfo(genPackage); genPackageInfo.setModelExporterID(exporterID); genPackageInfo.setArtifactURI(artifactURI); if (treeItem.getChecked() != (artifactURI != null)) { referencedGenModelsCheckboxTreeViewerCheckStateChanged(null); validate = false; } } if (validate) { validate(); getContainer().updateButtons(); } } @Override protected Control createEditorControl(Widget item) { TreeItem treeItem = (TreeItem)item; if (treeItem != null) { Object data = treeItem.getData(); if (data instanceof GenPackage) { GenPackage genPackage = (GenPackage)data; ModelExporter.ReferencedGenPackageExportInfo genPackageInfo = getModelExporter().getReferencedGenPackageExportInfo(genPackage); if (genPackageInfo.isValidReference()) { CCombo combo = new CCombo(treeItem.getParent(), SWT.READ_ONLY | SWT.FLAT); combo.addListener(SWT.Selection, this); initializeCombo(combo, genPackage); return combo; } } } return null; } protected void initializeCombo(CCombo combo, GenPackage genPackage) { combo.setData(genPackage); String exporterID = getModelExporter().getID(); for (URI uri : getModelExporter().getArtifactURIs(genPackage)) { String item = getArtifactText(exporterID, uri); combo.setData(item, new Object[]{exporterID, uri}); combo.add(item); } ModelExporter.ReferencedGenPackageExportInfo genPackageInfo = getModelExporter().getReferencedGenPackageExportInfo(genPackage); if (genPackageInfo.getArtifactURI() != null) { combo.setText(getArtifactText(genPackageInfo.getModelExporterID(), genPackageInfo.getArtifactURI())); } } } public ModelExporterPackagePage(ModelExporter modelExporter, String pageName) { super(modelExporter, pageName); setDescription(ExporterPlugin.INSTANCE.getString("_UI_PackageSelection_description")); } public ModelExporter getModelExporter() { return (ModelExporter)getModelConverter(); } @Override protected void adjustEPackagesTableViewer(CheckboxTableViewer ePackagesTableViewer) { super.adjustEPackagesTableViewer(ePackagesTableViewer); createEPackagesTableEditor(); } @Override protected boolean validateEPackageData(EPackage ePackage, String data) { Diagnostic diagnostic = getModelExporter().checkEPackageArtifactLocation(data, getLabel(ePackage)); handleDiagnostic(diagnostic); return diagnostic.getSeverity() == Diagnostic.OK; } @Override protected void setEPackageData(EPackage ePackage, String data) { ModelExporter.EPackageExportInfo ePackageInfo = getModelExporter().getEPackageExportInfo(ePackage); ePackageInfo.setArtifactLocation(data); } @Override protected String getEPackageData(EPackage ePackage) { return getModelExporter().getEPackageExportInfo(ePackage).getArtifactLocation(); } @Override protected String getEPackageDataColumnLabel() { return ExporterPlugin.INSTANCE.getString("_UI_ArtifactName_label"); } @Override protected void addReferencedGenModelsTreeColumns(CheckboxTreeViewer referencedGenModelsTreeViewer) { Tree tree = referencedGenModelsTreeViewer.getTree(); tree.setHeaderVisible(true); TreeColumn genObjectColumn = new TreeColumn(tree, SWT.NONE); genObjectColumn.setText(ExporterPlugin.INSTANCE.getString("_UI_GenObjectsColumn_title")); genObjectColumn.setResizable(true); genObjectColumn.setWidth(250); TreeColumn artifactColumn = new TreeColumn(tree, SWT.NONE); artifactColumn.setText(ExporterPlugin.INSTANCE.getString("_UI_ExporterAndArtifactColumn_title")); artifactColumn.setResizable(true); artifactColumn.setWidth(200); ReferencedGenPackageTreeEditorHelper treeEditorHelper = new ReferencedGenPackageTreeEditorHelper(tree); treeEditorHelper.setColumn(1); } @Override protected void addReferencedGenModelsTreeCheckStateManager(Tree tree) { new ConverterUIUtil.TreeCheckStateManager(tree) { @Override protected void setCheck(TreeItem item, boolean check) { Object data = item.getData(); if (!(data instanceof GenPackage) || getModelExporter().getReferencedGenPackageExportInfo((GenPackage)data).isValidReference()) { super.setCheck(item, check); } } }; } @Override protected void referencedGenModelsCheckboxTreeViewerCheckStateChanged(CheckStateChangedEvent event) { if (event != null && event.getChecked()) { Object element = event.getElement(); if (element instanceof GenPackage) { GenPackage genPackage = (GenPackage)element; ReferencedGenPackageExportInfo genPackageInfo = getModelExporter().getReferencedGenPackageExportInfo(genPackage); if (!genPackageInfo.isValidReference()) { ((CheckboxTreeViewer)event.getSource()).setChecked(genPackage, false); return; } } } super.referencedGenModelsCheckboxTreeViewerCheckStateChanged(event); } @Override protected boolean supportsNestedPackages() { return true; } @Override protected ILabelProvider getReferencedGenModelsTreeViewerLabelProvider(AdapterFactory adapterFactory) { return new AdapterFactoryLabelProvider(adapterFactory) { @Override public String getColumnText(Object object, int columnIndex) { if (columnIndex == 0) { return getLabel(object, super.getColumnText(object, 0)); } else if (object instanceof GenPackage) { GenPackage genPackage = (GenPackage)object; ModelExporter.ReferencedGenPackageExportInfo genPackageInfo = getModelExporter().getReferencedGenPackageExportInfo(genPackage); if (genPackageInfo.isValidReference()) { return getArtifactText(genPackageInfo.getModelExporterID(), genPackageInfo.getArtifactURI()); } else { return ExporterPlugin.INSTANCE.getString("_UI_NotAvailable_text"); } } else { return ""; } } @Override public Image getColumnImage(Object object, int columnIndex) { return columnIndex == 0 ? super.getColumnImage(object, columnIndex) : null; } }; } protected String getArtifactText(String modelExporterId, URI artifactURI) { if (artifactURI != null) { String modelExporterLabel = artifactURI.toString(); if (modelExporterId != null) { ModelExporterDescriptor modelExporterDescriptor = ModelExporterManager.INSTANCE.getModelExporterDescriptor(modelExporterId); modelExporterLabel = (modelExporterDescriptor != null ? modelExporterDescriptor.getName() : modelExporterId) + " - " + modelExporterLabel; } return modelExporterLabel; } else { return ""; } } @Override protected void validate() { super.validate(); if (getErrorMessage() == null) { List<EPackage> tableCheckedEPackages = getCheckedEPackages(); for (EPackage ePackage : tableCheckedEPackages) { if ( !validateEPackageData(ePackage, getModelExporter().getEPackageExportInfo(ePackage).getArtifactLocation())) { return; } } List<GenPackage> tableCheckedGenPackages = getCheckedReferencedGenPackages(); for (GenPackage genPackage : tableCheckedGenPackages) { if (getModelExporter().getReferencedGenPackageExportInfo(genPackage).getArtifactURI() == null) { setErrorMessage(ExporterPlugin.INSTANCE.getString("_UI_ReferencedGenPackageNoArtifact_error")); return; } } } } @Override protected List<GenPackage> getReferencedGenPackagesToCheck(List<GenPackage> genPackages, boolean reloadReferencedGenPackagesTable) { if (reloadReferencedGenPackagesTable) { for (Iterator<GenPackage> i = genPackages.iterator(); i.hasNext();) { GenPackage genPackage = i.next(); if (getModelExporter().getReferencedGenPackageExportInfo(genPackage).getArtifactURI() == null) { i.remove(); } } } return genPackages; } }