| /******************************************************************************* |
| * Copyright (c) 2003, 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 Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.pde.internal.ui.wizards.imports; |
| |
| import java.util.ArrayList; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.layout.GridLayoutFactory; |
| import org.eclipse.jface.viewers.IStructuredContentProvider; |
| import org.eclipse.jface.viewers.TableViewer; |
| import org.eclipse.jface.wizard.WizardPage; |
| import org.eclipse.pde.core.IModelProviderEvent; |
| import org.eclipse.pde.core.IModelProviderListener; |
| import org.eclipse.pde.core.plugin.*; |
| import org.eclipse.pde.internal.core.ClasspathUtilCore; |
| import org.eclipse.pde.internal.core.PDECore; |
| import org.eclipse.pde.internal.ui.PDEPlugin; |
| import org.eclipse.pde.internal.ui.PDEUIMessages; |
| import org.eclipse.pde.internal.ui.elements.DefaultContentProvider; |
| import org.eclipse.pde.internal.ui.wizards.ListUtil; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.*; |
| |
| public abstract class BaseImportWizardSecondPage extends WizardPage implements IModelProviderListener { |
| |
| protected static final String SETTINGS_ADD_FRAGMENTS = "addFragments"; //$NON-NLS-1$ |
| protected static final String SETTINGS_AUTOBUILD = "autobuild"; //$NON-NLS-1$ |
| |
| protected PluginImportWizardFirstPage fPage1; |
| protected IPluginModelBase[] fModels = new IPluginModelBase[0]; |
| private String fLocation; |
| protected Button fAddFragmentsButton; |
| private Button fAutoBuildButton; |
| protected TableViewer fImportListViewer; |
| private boolean fRefreshNeeded = true; |
| |
| class ContentProvider extends DefaultContentProvider implements IStructuredContentProvider { |
| public Object[] getElements(Object element) { |
| return new Object[0]; |
| } |
| } |
| |
| public BaseImportWizardSecondPage(String pageName, PluginImportWizardFirstPage page) { |
| super(pageName); |
| fPage1 = page; |
| PDEPlugin.getDefault().getLabelProvider().connect(this); |
| PDECore.getDefault().getModelManager().getExternalModelManager().addModelProviderListener(this); |
| } |
| |
| protected Composite createImportList(Composite parent) { |
| Composite container = new Composite(parent, SWT.NONE); |
| GridLayout layout = new GridLayout(); |
| layout.marginWidth = 0; |
| layout.marginHeight = 0; |
| container.setLayout(layout); |
| container.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| |
| Label label = new Label(container, SWT.NONE); |
| label.setText(PDEUIMessages.ImportWizard_DetailedPage_importList); |
| |
| Table table = new Table(container, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| gd.widthHint = 225; |
| table.setLayoutData(gd); |
| |
| fImportListViewer = new TableViewer(table); |
| fImportListViewer.setLabelProvider(PDEPlugin.getDefault().getLabelProvider()); |
| fImportListViewer.setContentProvider(new ContentProvider()); |
| fImportListViewer.setInput(PDECore.getDefault().getModelManager().getExternalModelManager()); |
| fImportListViewer.setComparator(ListUtil.PLUGIN_COMPARATOR); |
| return container; |
| } |
| |
| protected Composite createComputationsOption(Composite parent, int span) { |
| Composite composite = new Composite(parent, SWT.NONE); |
| composite.setLayout(GridLayoutFactory.swtDefaults().margins(5, 0).create()); |
| GridData gd = new GridData(); |
| gd.horizontalSpan = span; |
| composite.setLayoutData(gd); |
| |
| fAddFragmentsButton = new Button(composite, SWT.CHECK); |
| fAddFragmentsButton.setText(PDEUIMessages.ImportWizard_SecondPage_addFragments); |
| fAddFragmentsButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| if (getDialogSettings().get(SETTINGS_ADD_FRAGMENTS) != null) |
| fAddFragmentsButton.setSelection(getDialogSettings().getBoolean(SETTINGS_ADD_FRAGMENTS)); |
| else |
| fAddFragmentsButton.setSelection(true); |
| |
| if (!PDEPlugin.getWorkspace().isAutoBuilding()) { |
| fAutoBuildButton = new Button(composite, SWT.CHECK); |
| fAutoBuildButton.setText(PDEUIMessages.BaseImportWizardSecondPage_autobuild); |
| fAutoBuildButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| fAutoBuildButton.setSelection(getDialogSettings().getBoolean(SETTINGS_AUTOBUILD)); |
| } |
| return composite; |
| |
| } |
| |
| public void dispose() { |
| PDEPlugin.getDefault().getLabelProvider().disconnect(this); |
| PDECore.getDefault().getModelManager().getExternalModelManager().removeModelProviderListener(this); |
| } |
| |
| public void setVisible(boolean visible) { |
| super.setVisible(visible); |
| if (visible && isRefreshNeeded()) { |
| fModels = fPage1.getModels(); |
| refreshPage(); |
| } |
| } |
| |
| protected abstract void refreshPage(); |
| |
| protected boolean isRefreshNeeded() { |
| if (fRefreshNeeded) { |
| fRefreshNeeded = false; |
| fLocation = fPage1.getDropLocation(); |
| return true; |
| } |
| String currLocation = fPage1.getDropLocation(); |
| if (fLocation == null || !fLocation.equals(currLocation)) { |
| fLocation = fPage1.getDropLocation(); |
| return true; |
| } |
| return fPage1.isRefreshNeeded(); |
| } |
| |
| private IPluginModelBase findModel(String id) { |
| for (int i = 0; i < fModels.length; i++) { |
| String modelId = fModels[i].getPluginBase().getId(); |
| if (modelId != null && modelId.equals(id)) |
| return fModels[i]; |
| } |
| return null; |
| } |
| |
| private IFragmentModel[] findFragments(IPlugin plugin) { |
| ArrayList result = new ArrayList(); |
| for (int i = 0; i < fModels.length; i++) { |
| if (fModels[i] instanceof IFragmentModel) { |
| IFragment fragment = ((IFragmentModel) fModels[i]).getFragment(); |
| if (plugin.getId().equalsIgnoreCase(fragment.getPluginId())) { |
| result.add(fModels[i]); |
| } |
| } |
| } |
| return (IFragmentModel[]) result.toArray(new IFragmentModel[result.size()]); |
| } |
| |
| protected void addPluginAndDependencies(IPluginModelBase model, ArrayList selected, boolean addFragments) { |
| |
| boolean containsVariable = false; |
| if (!selected.contains(model)) { |
| selected.add(model); |
| boolean hasextensibleAPI = ClasspathUtilCore.hasExtensibleAPI(model); |
| if (!addFragments && !hasextensibleAPI && model instanceof IPluginModel) { |
| IPluginLibrary[] libraries = model.getPluginBase().getLibraries(); |
| for (int i = 0; i < libraries.length; i++) { |
| if (ClasspathUtilCore.containsVariables(libraries[i].getName())) { |
| containsVariable = true; |
| break; |
| } |
| } |
| } |
| addDependencies(model, selected, addFragments || containsVariable || hasextensibleAPI); |
| } |
| } |
| |
| protected void addDependencies(IPluginModelBase model, ArrayList selected, boolean addFragments) { |
| |
| IPluginImport[] required = model.getPluginBase().getImports(); |
| if (required.length > 0) { |
| for (int i = 0; i < required.length; i++) { |
| IPluginModelBase found = findModel(required[i].getId()); |
| if (found != null) { |
| addPluginAndDependencies(found, selected, addFragments); |
| } |
| } |
| } |
| |
| if (addFragments) { |
| if (model instanceof IPluginModel) { |
| IFragmentModel[] fragments = findFragments(((IPluginModel) model).getPlugin()); |
| for (int i = 0; i < fragments.length; i++) { |
| addPluginAndDependencies(fragments[i], selected, addFragments); |
| } |
| } else { |
| IFragment fragment = ((IFragmentModel) model).getFragment(); |
| IPluginModelBase found = findModel(fragment.getPluginId()); |
| if (found != null) { |
| addPluginAndDependencies(found, selected, addFragments); |
| } |
| } |
| } |
| } |
| |
| public IPluginModelBase[] getModelsToImport() { |
| TableItem[] items = fImportListViewer.getTable().getItems(); |
| ArrayList result = new ArrayList(); |
| for (int i = 0; i < items.length; i++) { |
| result.add(items[i].getData()); |
| } |
| return (IPluginModelBase[]) result.toArray(new IPluginModelBase[result.size()]); |
| } |
| |
| public void storeSettings() { |
| IDialogSettings settings = getDialogSettings(); |
| settings.put(SETTINGS_ADD_FRAGMENTS, fAddFragmentsButton.getSelection()); |
| if (fAutoBuildButton != null) |
| settings.put(SETTINGS_AUTOBUILD, fAutoBuildButton.getSelection()); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.pde.core.IModelProviderListener#modelsChanged(org.eclipse.pde.core.IModelProviderEvent) |
| */ |
| public void modelsChanged(IModelProviderEvent event) { |
| fRefreshNeeded = true; |
| } |
| |
| public boolean forceAutoBuild() { |
| return fAutoBuildButton != null && getDialogSettings().getBoolean(SETTINGS_AUTOBUILD); |
| } |
| |
| } |