/** * 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 implementation */ package org.eclipse.emf.converter.ui; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.wizard.IWizard; import org.eclipse.jface.wizard.IWizardNode; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardSelectionPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchWizard; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.emf.codegen.ecore.genmodel.provider.GenModelEditPlugin; import org.eclipse.emf.converter.ConverterPlugin; import org.eclipse.emf.converter.ui.contribution.ModelConverterDescriptor; import org.eclipse.emf.converter.ui.contribution.ModelConverterManager; import org.eclipse.emf.converter.ui.contribution.ModelConverterManager.ModelConverterDescriptorWizardNode; import org.osgi.service.prefs.BackingStoreException; /** * @since 2.2.0 */ public abstract class ModelConverterDescriptorSelectionPage extends WizardSelectionPage implements ISelectionChangedListener { protected ModelConverterManager<?> modelConverterManager; protected ModelConverterDescriptor descriptor; protected TableViewer descriptorTableViewer; protected ImageDescriptor modeConverterWizardDefaultImageDescriptor; protected Map<? extends ModelConverterDescriptor, ModelConverterDescriptorWizardNode> modelConverterWizardNodeMap; protected IStructuredSelection selection; protected IWorkbench workbench; protected boolean firstTime = true; protected Set<IWizard> initializedWizards = new HashSet<IWizard>(); public ModelConverterDescriptorSelectionPage(String pageId, ModelConverterManager<?> modelConverterManager, IWorkbench workbench, IStructuredSelection selection) { super(pageId); this.modelConverterManager = modelConverterManager; this.workbench = workbench; this.selection = selection; } @Override public void dispose() { if (descriptorTableViewer != null) { descriptorTableViewer.removeSelectionChangedListener(this); descriptorTableViewer = null; } if (initializedWizards != null) { initializedWizards.clear(); initializedWizards = null; } modeConverterWizardDefaultImageDescriptor = null; descriptor = null; modelConverterManager = null; clearCache(); super.dispose(); } public void clearCache() { if (modelConverterWizardNodeMap != null) { for (IWizardNode wizardNode : modelConverterWizardNodeMap.values()) { wizardNode.dispose(); } modelConverterWizardNodeMap.clear(); modelConverterWizardNodeMap = null; } selection = null; workbench = null; } public void setModeConverterWizardDefaultImageDescriptor(ImageDescriptor imageDescriptor) { this.modeConverterWizardDefaultImageDescriptor = imageDescriptor; } public String getLastModelConverterDescriptorId() { return Platform.getPreferencesService().getString(ConverterPlugin.ID, modelConverterManager.getClass().getName(), "", null); } @SuppressWarnings("deprecation") private static final InstanceScope INSTANCE_SCOPE = new InstanceScope(); public void performFinish() { if (descriptor != null) { IEclipsePreferences node = INSTANCE_SCOPE.getNode(ConverterPlugin.ID); node.put(modelConverterManager.getClass().getName(), descriptor.getID()); try { node.flush(); } catch (BackingStoreException exception) { ConverterPlugin.INSTANCE.log(exception); } } } public void setModelConverterDescriptor(ModelConverterDescriptor descriptor) { if (getModelConverterDescriptor() != descriptor) { this.descriptor = descriptor; if (descriptorTableViewer != null) { if (descriptor != null) { descriptorTableViewer.setSelection(new StructuredSelection(descriptor), true); } else { descriptorTableViewer.setSelection(StructuredSelection.EMPTY); } } } } public ModelConverterDescriptor getModelConverterDescriptor() { return descriptor; } @Override public void setVisible(boolean visible) { super.setVisible(visible); if (visible && firstTime) { firstTime = false; Table table = descriptorTableViewer.getTable(); firstTimeVisible(table); table.setFocus(); } } protected void firstTimeVisible(Table descriptorTable) { if(descriptorTable.getItemCount() > 0) { ModelConverterDescriptor descriptor = getModelConverterDescriptor(); if (descriptor == null) { descriptor = modelConverterManager.getModelConverterDescriptor(getLastModelConverterDescriptorId()); if (descriptor == null) { descriptor = (ModelConverterDescriptor)descriptorTable.getItem(0).getData(); } setModelConverterDescriptor(descriptor); } } else { setErrorMessage(getNoModelConverterMessage()); } } protected String getNoModelConverterMessage() { return GenModelEditPlugin.INSTANCE.getString("_UI_NoModelConverter_error"); } abstract protected String getSelectModelConverterLabel(); abstract protected Object[] getTableInput(); public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); { GridLayout layout = new GridLayout(); layout.numColumns = 1; layout.verticalSpacing = 12; composite.setLayout(layout); GridData data = new GridData(); data.verticalAlignment = GridData.FILL; data.grabExcessVerticalSpace = true; data.horizontalAlignment = GridData.FILL; composite.setLayoutData(data); } Label label = new Label(composite, SWT.NONE); label.setText(getSelectModelConverterLabel()); { GridData data = new GridData(); data.verticalAlignment = SWT.FILL; data.horizontalAlignment = SWT.FILL; label.setLayoutData(data); } Table descriptorTable = new Table(composite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER); { GridData data = new GridData(); data.widthHint = Display.getCurrent().getBounds().width / 5; data.heightHint = Display.getCurrent().getBounds().height / 3; data.verticalAlignment = SWT.FILL; data.horizontalAlignment = SWT.FILL; data.grabExcessHorizontalSpace = true; data.grabExcessVerticalSpace = true; descriptorTable.setLayoutData(data); } descriptorTableViewer = new TableViewer(descriptorTable); descriptorTableViewer.setContentProvider(new ArrayContentProvider()); descriptorTableViewer.setLabelProvider(new ModelConverterManager.ModelConverterDescriptorLabelProvider()); descriptorTableViewer.setSorter(new ViewerSorter()); descriptorTableViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { if (canFlipToNextPage()) { getContainer().showPage(getNextPage()); } } }); descriptorTableViewer.setInput(getTableInput()); descriptorTableViewer.addSelectionChangedListener(this); if (getModelConverterDescriptor() != null) { descriptorTableViewer.setSelection(new StructuredSelection(getModelConverterDescriptor()), true); } setControl(composite); } public void selectionChanged(SelectionChangedEvent event) { ISelection selection = event.getSelection(); if (!selection.isEmpty() && selection instanceof IStructuredSelection) { Object selectedObject = ((IStructuredSelection)selection).getFirstElement(); if (selectedObject instanceof ModelConverterDescriptor) { descriptor = (ModelConverterDescriptor)selectedObject; if (modelConverterWizardNodeMap == null) { modelConverterWizardNodeMap = modelConverterManager.createModelConverterDescriptorWizardNodeMap(); } setMessage(descriptor.getDescription(), IMessageProvider.NONE); setSelectedNode(modelConverterWizardNodeMap.get(descriptor)); return; } } setPageComplete(false); } @Override public boolean isPageComplete() { return descriptor != null; } @Override public IWizardPage getNextPage() { IWizard modelConverterWizard = getSelectedNode().getWizard(); if (initializedWizards.add(modelConverterWizard)) { if (modelConverterWizard instanceof Wizard) { Wizard wizard = (Wizard)modelConverterWizard; if (modeConverterWizardDefaultImageDescriptor != null) { wizard.setDefaultPageImageDescriptor(modeConverterWizardDefaultImageDescriptor); } if (wizard.getWindowTitle() == null) { wizard.setWindowTitle(getWizard().getWindowTitle()); } } if (modelConverterWizard instanceof IWorkbenchWizard) { ((IWorkbenchWizard)modelConverterWizard).init(workbench, selection); } } adjustModelConverterWizard(modelConverterWizard); IWizardPage wizardPage = super.getNextPage(); IWizardNode wizardNode = getSelectedNode(); if (wizardNode instanceof ModelConverterManager.ModelConverterDescriptorWizardNode) { ((ModelConverterManager.ModelConverterDescriptorWizardNode)wizardNode).setContentCreated(true); } return wizardPage; } protected void adjustModelConverterWizard(IWizard modelConverterWizard) { // Subclasses may overrride } }