| /******************************************************************************* |
| * Copyright (c) 2000, 2003 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.update.internal.ui.wizards; |
| import java.io.*; |
| import java.util.*; |
| |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.jface.dialogs.*; |
| import org.eclipse.jface.dialogs.Dialog; |
| import org.eclipse.jface.resource.*; |
| import org.eclipse.jface.viewers.*; |
| import org.eclipse.swt.*; |
| import org.eclipse.swt.events.*; |
| import org.eclipse.swt.graphics.*; |
| import org.eclipse.swt.layout.*; |
| import org.eclipse.swt.widgets.*; |
| import org.eclipse.ui.help.*; |
| import org.eclipse.update.configuration.*; |
| import org.eclipse.update.core.*; |
| import org.eclipse.update.internal.operations.*; |
| import org.eclipse.update.internal.ui.*; |
| import org.eclipse.update.internal.ui.parts.*; |
| import org.eclipse.update.operations.*; |
| |
| public class TargetPage extends BannerPage implements IDynamicPage { |
| private TableViewer jobViewer; |
| private TableViewer siteViewer; |
| private IInstallConfiguration config; |
| private ConfigListener configListener; |
| private Label requiredSpaceLabel; |
| private Label availableSpaceLabel; |
| private IInstallFeatureOperation[] jobs; |
| private Button addButton; |
| private Button deleteButton; |
| private HashSet added; |
| private JobTargetSites targetSites; |
| |
| class JobsContentProvider |
| extends DefaultContentProvider |
| implements IStructuredContentProvider { |
| public Object[] getElements(Object parent) { |
| return jobs; |
| } |
| } |
| |
| class SitesContentProvider |
| extends DefaultContentProvider |
| implements IStructuredContentProvider { |
| |
| public Object[] getElements(Object parent) { |
| return config.getConfiguredSites(); |
| } |
| } |
| |
| class JobsLabelProvider |
| extends LabelProvider |
| implements ITableLabelProvider { |
| |
| public Image getColumnImage(Object obj, int col) { |
| UpdateLabelProvider provider = UpdateUI.getDefault().getLabelProvider(); |
| |
| IInstallFeatureOperation job = (IInstallFeatureOperation) obj; |
| ImageDescriptor base = |
| job.getFeature().isPatch() |
| ? UpdateUIImages.DESC_EFIX_OBJ |
| : UpdateUIImages.DESC_FEATURE_OBJ; |
| int flags = 0; |
| JobTargetSite jobSite = (JobTargetSite) targetSites.get(job); |
| if (jobSite == null || jobSite.targetSite == null) |
| flags = UpdateLabelProvider.F_ERROR; |
| return provider.get(base, flags); |
| } |
| |
| public String getColumnText(Object obj, int col) { |
| if (col == 0) { |
| IFeature feature = ((IInstallFeatureOperation) obj).getFeature(); |
| return feature.getLabel() |
| + " " //$NON-NLS-1$ |
| + feature.getVersionedIdentifier().getVersion().toString(); |
| } |
| return null; |
| } |
| } |
| |
| class SitesLabelProvider |
| extends LabelProvider |
| implements ITableLabelProvider { |
| |
| public Image getColumnImage(Object obj, int col) { |
| UpdateLabelProvider provider = UpdateUI.getDefault().getLabelProvider(); |
| return provider.getLocalSiteImage((IConfiguredSite) obj); |
| } |
| |
| public String getColumnText(Object obj, int col) { |
| if (col == 0) { |
| ISite site = ((IConfiguredSite) obj).getSite(); |
| return site.getURL().getFile(); |
| } |
| return null; |
| } |
| } |
| |
| class ConfigListener implements IInstallConfigurationChangedListener { |
| public void installSiteAdded(IConfiguredSite csite) { |
| siteViewer.add(csite); |
| if (added == null) |
| added = new HashSet(); |
| added.add(csite); |
| siteViewer.setSelection(new StructuredSelection(csite)); |
| siteViewer.getControl().setFocus(); |
| } |
| |
| public void installSiteRemoved(IConfiguredSite csite) { |
| siteViewer.remove(csite); |
| if (added != null) |
| added.remove(csite); |
| IInstallFeatureOperation job = (IInstallFeatureOperation) siteViewer.getInput(); |
| if (job != null) { |
| JobTargetSite jobSite = (JobTargetSite) targetSites.get(job); |
| IConfiguredSite defaultSite = targetSites.computeTargetSite(jobSite); |
| if (defaultSite != null) |
| siteViewer.setSelection(new StructuredSelection(defaultSite)); |
| } |
| siteViewer.getControl().setFocus(); |
| } |
| } |
| |
| /** |
| * Constructor for ReviewPage2 |
| */ |
| public TargetPage(IInstallConfiguration config) { |
| super("Target"); //$NON-NLS-1$ |
| setTitle(UpdateUI.getString("InstallWizard.TargetPage.title")); //$NON-NLS-1$ |
| setDescription(UpdateUI.getString("InstallWizard.TargetPage.desc")); //$NON-NLS-1$ |
| this.config = config; |
| UpdateUI.getDefault().getLabelProvider().connect(this); |
| configListener = new ConfigListener(); |
| targetSites = new JobTargetSites(config); |
| } |
| |
| public void setJobs(IInstallFeatureOperation[] jobs) { |
| this.jobs = jobs; |
| targetSites.setJobs(jobs); |
| } |
| |
| public void dispose() { |
| UpdateUI.getDefault().getLabelProvider().disconnect(this); |
| config.removeInstallConfigurationChangedListener(configListener); |
| super.dispose(); |
| } |
| |
| public Control createContents(Composite parent) { |
| Composite client = new Composite(parent, SWT.NULL); |
| GridLayout layout = new GridLayout(); |
| layout.numColumns = 3; |
| layout.marginWidth = layout.marginHeight = 0; |
| client.setLayout(layout); |
| |
| Label label = new Label(client, SWT.NULL); |
| label.setText(UpdateUI.getString("InstallWizard.TargetPage.jobsLabel")); //$NON-NLS-1$ |
| |
| label = new Label(client, SWT.NULL); |
| label.setText(UpdateUI.getString("InstallWizard.TargetPage.siteLabel")); //$NON-NLS-1$ |
| |
| new Label(client, SWT.NULL); |
| |
| createJobViewer(client); |
| createSiteViewer(client); |
| |
| Composite buttonContainer = new Composite(client, SWT.NULL); |
| GridLayout blayout = new GridLayout(); |
| blayout.marginWidth = blayout.marginHeight = 0; |
| buttonContainer.setLayout(blayout); |
| buttonContainer.setLayoutData(new GridData(GridData.FILL_VERTICAL)); |
| |
| addButton = new Button(buttonContainer, SWT.PUSH); |
| addButton.setText(UpdateUI.getString("InstallWizard.TargetPage.new")); //$NON-NLS-1$ |
| addButton.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| addTargetLocation(); |
| } |
| }); |
| addButton.setEnabled(false); |
| addButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER)); |
| SWTUtil.setButtonDimensionHint(addButton); |
| |
| deleteButton = new Button(buttonContainer, SWT.PUSH); |
| deleteButton.setText(UpdateUI.getString("InstallWizard.TargetPage.delete")); //$NON-NLS-1$ |
| deleteButton.addSelectionListener(new SelectionAdapter() { |
| public void widgetSelected(SelectionEvent e) { |
| try { |
| removeSelection(); |
| } |
| catch (CoreException ex) { |
| UpdateUI.logException(ex); |
| } |
| } |
| }); |
| deleteButton.setEnabled(false); |
| deleteButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER)); |
| SWTUtil.setButtonDimensionHint(deleteButton); |
| |
| |
| Composite status = new Composite(client, SWT.NULL); |
| GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); |
| gd.horizontalSpan = 3; |
| status.setLayoutData(gd); |
| layout = new GridLayout(); |
| layout.numColumns = 2; |
| status.setLayout(layout); |
| label = new Label(status, SWT.NULL); |
| label.setText(UpdateUI.getString("InstallWizard.TargetPage.requiredSpace")); //$NON-NLS-1$ |
| requiredSpaceLabel = new Label(status, SWT.NULL); |
| requiredSpaceLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| label = new Label(status, SWT.NULL); |
| label.setText(UpdateUI.getString("InstallWizard.TargetPage.availableSpace")); //$NON-NLS-1$ |
| availableSpaceLabel = new Label(status, SWT.NULL); |
| availableSpaceLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| |
| WorkbenchHelp.setHelp(client, "org.eclipse.update.ui.MultiTargetPage2"); //$NON-NLS-1$ |
| |
| Dialog.applyDialogFont(parent); |
| |
| return client; |
| } |
| |
| private void createJobViewer(Composite parent) { |
| jobViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| gd.widthHint = 150; |
| jobViewer.getTable().setLayoutData(gd); |
| jobViewer.setContentProvider(new JobsContentProvider()); |
| jobViewer.setLabelProvider(new JobsLabelProvider()); |
| |
| jobViewer.addSelectionChangedListener(new ISelectionChangedListener() { |
| public void selectionChanged(SelectionChangedEvent event) { |
| IStructuredSelection selection = (IStructuredSelection) event.getSelection(); |
| IInstallFeatureOperation job = (IInstallFeatureOperation) selection.getFirstElement(); |
| if (job != null) { |
| siteViewer.setInput(job); |
| JobTargetSite jobSite = (JobTargetSite) targetSites.get(job); |
| addButton.setEnabled(jobSite.affinitySite == null); |
| if (jobSite.targetSite != null) { |
| siteViewer.setSelection(new StructuredSelection(jobSite.targetSite)); |
| } |
| } |
| } |
| }); |
| } |
| |
| private void createSiteViewer(Composite parent) { |
| siteViewer = new TableViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); |
| GridData gd = new GridData(GridData.FILL_BOTH); |
| gd.widthHint = 200; |
| siteViewer.getTable().setLayoutData(gd); |
| siteViewer.setContentProvider(new SitesContentProvider()); |
| siteViewer.setLabelProvider(new SitesLabelProvider()); |
| siteViewer.addFilter(new ViewerFilter() { |
| public boolean select(Viewer v, Object parent, Object obj) { |
| IInstallFeatureOperation job = (IInstallFeatureOperation) siteViewer.getInput(); |
| JobTargetSite jobSite = (JobTargetSite) targetSites.get(job); |
| return targetSites.getSiteVisibility((IConfiguredSite) obj, jobSite); |
| } |
| }); |
| siteViewer.addSelectionChangedListener(new ISelectionChangedListener() { |
| public void selectionChanged(SelectionChangedEvent event) { |
| IStructuredSelection ssel = (IStructuredSelection) event.getSelection(); |
| selectTargetSite(ssel); |
| updateDeleteButton(ssel); |
| } |
| }); |
| |
| if (config != null) |
| config.addInstallConfigurationChangedListener(configListener); |
| } |
| |
| private void updateDeleteButton(IStructuredSelection selection) { |
| boolean enable = added != null && !added.isEmpty(); |
| if (enable) { |
| for (Iterator iter = selection.iterator(); iter.hasNext();) { |
| if (!added.contains(iter.next())) { |
| enable = false; |
| break; |
| } |
| } |
| } |
| deleteButton.setEnabled(enable); |
| } |
| |
| public void setVisible(boolean visible) { |
| if (visible) { |
| targetSites.computeDefaultTargetSites(); |
| jobViewer.setInput(jobs); |
| if (jobViewer.getSelection().isEmpty() && jobs.length > 0) |
| jobViewer.setSelection(new StructuredSelection(jobs[0])); |
| } |
| |
| super.setVisible(visible); |
| } |
| |
| private void verifyNotEmpty(boolean empty) { |
| String errorMessage = null; |
| if (empty) |
| errorMessage = UpdateUI.getString("InstallWizard.TargetPage.location.empty"); //$NON-NLS-1$ |
| setErrorMessage(errorMessage); |
| setPageComplete(!empty); |
| } |
| |
| private void selectTargetSite(IStructuredSelection selection) { |
| IConfiguredSite site = (IConfiguredSite) selection.getFirstElement(); |
| IInstallFeatureOperation job = (IInstallFeatureOperation) siteViewer.getInput(); |
| if (job != null) { |
| JobTargetSite jobSite = (JobTargetSite) targetSites.get(job); |
| if (site != null) |
| jobSite.targetSite = site; |
| pageChanged(); |
| } |
| updateStatus(site); |
| } |
| |
| private void addTargetLocation() { |
| DirectoryDialog dd = new DirectoryDialog(getContainer().getShell()); |
| dd.setMessage(UpdateUI.getString("InstallWizard.TargetPage.location.message")); //$NON-NLS-1$ |
| String path = dd.open(); |
| if (path != null) { |
| addConfiguredSite(getContainer().getShell(), config, new File(path)); |
| } |
| } |
| |
| private void removeSelection() throws CoreException { |
| IStructuredSelection selection = (IStructuredSelection) siteViewer.getSelection(); |
| for (Iterator iter = selection.iterator(); iter.hasNext();) { |
| config.removeConfiguredSite((IConfiguredSite) iter.next()); |
| } |
| } |
| |
| private IConfiguredSite addConfiguredSite( |
| Shell shell, |
| IInstallConfiguration config, |
| File file) { |
| try { |
| IConfiguredSite csite = config.createConfiguredSite(file); |
| IStatus status = csite.verifyUpdatableStatus(); |
| if (status.isOK()) |
| config.addConfiguredSite(csite); |
| else |
| throw new CoreException(status); |
| |
| return csite; |
| } catch (CoreException e) { |
| String title = UpdateUI.getString("InstallWizard.TargetPage.location.error.title"); //$NON-NLS-1$ |
| ErrorDialog.openError(shell, title, null, e.getStatus()); |
| UpdateUI.logException(e); |
| return null; |
| } |
| } |
| |
| private void updateStatus(Object element) { |
| if (element == null) { |
| requiredSpaceLabel.setText(""); //$NON-NLS-1$ |
| availableSpaceLabel.setText(""); //$NON-NLS-1$ |
| return; |
| } |
| IConfiguredSite site = (IConfiguredSite) element; |
| File file = new File(site.getSite().getURL().getFile()); |
| long available = LocalSystemInfo.getFreeSpace(file); |
| long required = computeRequiredSizeFor(site); |
| if (required == -1) |
| requiredSpaceLabel.setText(UpdateUI.getString("InstallWizard.TargetPage.unknownSize")); //$NON-NLS-1$ |
| else |
| requiredSpaceLabel.setText( |
| UpdateUI.getFormattedMessage("InstallWizard.TargetPage.size", "" + required)); //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| if (available == LocalSystemInfo.SIZE_UNKNOWN) |
| availableSpaceLabel.setText(UpdateUI.getString("InstallWizard.TargetPage.unknownSize")); //$NON-NLS-1$ |
| else |
| availableSpaceLabel.setText( |
| UpdateUI.getFormattedMessage("InstallWizard.TargetPage.size", "" + available)); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| private long computeRequiredSizeFor(IConfiguredSite site) { |
| long totalSize = 0; |
| for (int i = 0; i < jobs.length; i++) { |
| JobTargetSite jobSite = (JobTargetSite) targetSites.get(jobs[i]); |
| if (site.equals(jobSite.targetSite)) { |
| long jobSize = site.getSite().getInstallSizeFor(jobs[i].getFeature()); |
| if (jobSize == -1) |
| return -1; |
| totalSize += jobSize; |
| } |
| } |
| return totalSize; |
| } |
| |
| private void pageChanged() { |
| boolean empty = false; |
| for (Iterator enum = targetSites.keySet().iterator(); enum.hasNext();) { |
| JobTargetSite jobSite = (JobTargetSite) targetSites.get(enum.next()); |
| if (jobSite.targetSite == null) { |
| empty = true; |
| break; |
| } |
| IFeature feature = jobSite.job.getFeature(); |
| if (feature.isPatch()) { |
| // Patches must go together with the features |
| // they are patching. |
| JobTargetSite patchedSite = targetSites.findPatchedFeature(feature); |
| if (patchedSite != null |
| && jobSite.targetSite != null |
| && patchedSite.targetSite != null |
| && jobSite.targetSite.equals(patchedSite.targetSite) == false) { |
| UpdateUI.getFormattedMessage( |
| "IntallWizard.TargetPage.patchError", //$NON-NLS-1$ |
| new String[] { |
| feature.getLabel(), |
| patchedSite.job.getFeature().getLabel()}); |
| setPageComplete(false); |
| return; |
| } |
| } |
| } |
| verifyNotEmpty(empty); |
| } |
| |
| public IConfiguredSite getTargetSite(IInstallFeatureOperation job) { |
| return targetSites.getTargetSite(job); |
| } |
| |
| public JobTargetSite[] getTargetSites() { |
| JobTargetSite[] sites = new JobTargetSite[jobs.length]; |
| for (int i = 0; i < jobs.length; i++) { |
| JobTargetSite jobSite = (JobTargetSite) targetSites.get(jobs[i]); |
| sites[i] = jobSite; |
| } |
| return sites; |
| } |
| |
| void removeAddedSites() { |
| if (added != null) { |
| for (Iterator it = added.iterator(); it.hasNext(); ) |
| config.removeConfiguredSite((IConfiguredSite) it.next()); |
| } |
| |
| } |
| } |