blob: 989701f69a6c3b60b8ff94d98732ebb611f6e3e8 [file] [log] [blame]
package org.eclipse.update.internal.ui.wizards;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import java.util.ArrayList;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.help.WorkbenchHelp;
import org.eclipse.update.configuration.IInstallConfiguration;
import org.eclipse.update.core.*;
import org.eclipse.update.internal.ui.*;
import org.eclipse.update.internal.ui.model.*;
import org.eclipse.update.internal.ui.parts.*;
public class NewUpdatesWizardPage extends BannerPage {
// NL keys
private static final String KEY_TITLE = "NewUpdatesWizard.MainPage.title";
private static final String KEY_DESC = "NewUpdatesWizard.MainPage.desc";
private static final String KEY_TABLE_LABEL =
"NewUpdatesWizard.MainPage.tableLabel";
private static final String KEY_SELECT_ALL =
"NewUpdatesWizard.MainPage.selectAll";
private static final String KEY_DESELECT_ALL =
"NewUpdatesWizard.MainPage.deselectAll";
private static final String KEY_COUNTER =
"NewUpdatesWizard.MainPage.counter";
private static final String KEY_C_FEATURE =
"NewUpdatesWizard.MainPage.column.feature";
private static final String KEY_C_PROVIDER =
"NewUpdatesWizard.MainPage.column.provider";
private static final String KEY_C_VERSION =
"NewUpdatesWizard.MainPage.column.version";
private static final String KEY_C_SIZE =
"NewUpdatesWizard.MainPage.column.size";
private static final String KEY_UNKNOWN_SIZE =
"NewUpdatesWizard.MainPage.column.sizeUnknown";
private static final String KEY_FILTER_CHECK =
"NewUpdatesWizard.MainPage.filterCheck";
private static final String KEY_DUPLICATE_WARNING =
"NewUpdatesWizard.MainPage.duplicateWarning";
private CheckboxTableViewer tableViewer;
private IInstallConfiguration config;
private PendingChange[] pendingChanges;
private Label counterLabel;
private Button filterCheck;
private ContainmentFilter filter = new ContainmentFilter();
class TableContentProvider
extends DefaultContentProvider
implements IStructuredContentProvider {
/**
* @see IStructuredContentProvider#getElements(Object)
*/
public Object[] getElements(Object parent) {
return pendingChanges;
}
}
class TableLabelProvider
extends LabelProvider
implements ITableLabelProvider {
/**
* @see ITableLabelProvider#getColumnImage(Object, int)
*/
public Image getColumnImage(Object obj, int col) {
if (col == 0) {
try {
IFeature feature = ((IFeatureAdapter) obj).getFeature(null);
boolean patch = feature.isPatch();
return UpdateUIPlugin.getDefault().getLabelProvider().get(
patch
? UpdateUIPluginImages.DESC_EFIX_OBJ
: UpdateUIPluginImages.DESC_FEATURE_OBJ);
} catch (CoreException e) {
return UpdateUIPlugin.getDefault().getLabelProvider().get(
UpdateUIPluginImages.DESC_FEATURE_OBJ,
UpdateLabelProvider.F_ERROR);
}
} else
return null;
}
/**
* @see ITableLabelProvider#getColumnText(Object, int)
*/
public String getColumnText(Object obj, int col) {
if (obj instanceof IFeatureAdapter) {
try {
IFeature feature = ((IFeatureAdapter) obj).getFeature(null);
switch (col) {
case 0 :
return feature.getLabel();
case 1 :
return feature
.getVersionedIdentifier()
.getVersion()
.toString();
case 2 :
return feature.getProvider();
case 3 :
long size = feature.getDownloadSize();
if (size == -1)
return UpdateUIPlugin.getResourceString(
KEY_UNKNOWN_SIZE);
else
return feature.getDownloadSize() + "KB";
}
} catch (CoreException e) {
UpdateUIPlugin.logException(e);
return "??";
}
}
return "";
}
}
class ContainmentFilter extends ViewerFilter {
public boolean select(Viewer v, Object parent, Object child) {
return !isContained((PendingChange) child);
}
private boolean isContained(PendingChange job) {
VersionedIdentifier vid = job.getFeature().getVersionedIdentifier();
Object[] selected = tableViewer.getCheckedElements();
for (int i = 0; i < selected.length; i++) {
PendingChange candidate = (PendingChange) selected[i];
if (candidate.equals(job))
continue;
IFeature feature = candidate.getFeature();
if (includes(feature, vid))
return true;
}
return false;
}
private boolean includes(IFeature feature, VersionedIdentifier vid) {
try {
IFeatureReference[] irefs =
feature.getIncludedFeatureReferences();
for (int i = 0; i < irefs.length; i++) {
IFeatureReference iref = irefs[i];
IFeature ifeature = iref.getFeature();
VersionedIdentifier ivid =
ifeature.getVersionedIdentifier();
if (ivid.equals(vid))
return true;
if (includes(ifeature, vid))
return true;
}
} catch (CoreException e) {
}
return false;
}
}
/**
* Constructor for ReviewPage
*/
public NewUpdatesWizardPage(
PendingChange[] changes,
IInstallConfiguration config) {
super("Target");
setTitle(UpdateUIPlugin.getResourceString(KEY_TITLE));
setDescription(UpdateUIPlugin.getResourceString(KEY_DESC));
this.config = config;
this.pendingChanges = changes;
UpdateUIPlugin.getDefault().getLabelProvider().connect(this);
setBannerVisible(false);
}
public void dispose() {
UpdateUIPlugin.getDefault().getLabelProvider().disconnect(this);
super.dispose();
}
/**
* @see DialogPage#createControl(Composite)
*/
public Control createContents(Composite parent) {
Composite client = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = layout.marginHeight = 0;
client.setLayout(layout);
createTableViewer(client);
Composite buttonContainer = new Composite(client, SWT.NULL);
GridLayout blayout = new GridLayout();
blayout.marginWidth = blayout.marginHeight = 0;
buttonContainer.setLayout(blayout);
GridData gd = new GridData(GridData.FILL_VERTICAL);
buttonContainer.setLayoutData(gd);
Button button = new Button(buttonContainer, SWT.PUSH);
button.setText(UpdateUIPlugin.getResourceString(KEY_SELECT_ALL));
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
selectAll(true);
}
});
gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
button.setLayoutData(gd);
SWTUtil.setButtonDimensionHint(button);
button = new Button(buttonContainer, SWT.PUSH);
button.setText(UpdateUIPlugin.getResourceString(KEY_DESELECT_ALL));
button.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
selectAll(false);
}
});
gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
button.setLayoutData(gd);
SWTUtil.setButtonDimensionHint(button);
tableViewer.setInput(UpdateUIPlugin.getDefault().getUpdateModel());
tableViewer.setCheckedElements(pendingChanges);
counterLabel = new Label(client, SWT.NULL);
gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
counterLabel.setLayoutData(gd);
filterCheck = new Button(client, SWT.CHECK);
filterCheck.setText(UpdateUIPlugin.getResourceString(KEY_FILTER_CHECK));
filterCheck.setSelection(true);
tableViewer.addFilter(filter);
filterCheck.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (filterCheck.getSelection())
tableViewer.addFilter(filter);
else
tableViewer.removeFilter(filter);
pageChanged();
}
});
gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
gd.horizontalSpan = 2;
filterCheck.setLayoutData(gd);
pageChanged();
WorkbenchHelp.setHelp(
client,
"org.eclipse.update.ui.NewUpdatesWizardPage");
return client;
}
private void selectAll(boolean state) {
tableViewer.setAllChecked(state);
pageChanged();
}
private void pageChanged() {
Object[] checked = tableViewer.getCheckedElements();
int totalCount = tableViewer.getTable().getItemCount();
setPageComplete(checked.length > 0);
String total = "" + totalCount;
String selected = "" + checked.length;
counterLabel.setText(
UpdateUIPlugin.getFormattedMessage(
KEY_COUNTER,
new String[] { selected, total }));
boolean duplicates = false;
for (int i = 0; i < checked.length; i++) {
PendingChange job = (PendingChange) checked[i];
if (filter.isContained(job)) {
duplicates = true;
break;
}
}
if (!duplicates)
setMessage(null);
else
setMessage(
UpdateUIPlugin.getResourceString(KEY_DUPLICATE_WARNING),
WARNING);
}
private void createTableViewer(Composite parent) {
Label label = new Label(parent, SWT.NULL);
label.setText(UpdateUIPlugin.getResourceString(KEY_TABLE_LABEL));
GridData gd = new GridData();
gd.horizontalSpan = 2;
label.setLayoutData(gd);
tableViewer =
CheckboxTableViewer.newCheckList(
parent,
SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
gd = new GridData(GridData.FILL_BOTH);
Table table = tableViewer.getTable();
table.setHeaderVisible(true);
TableColumn column = new TableColumn(table, SWT.NULL);
column.setText(UpdateUIPlugin.getResourceString(KEY_C_FEATURE));
column = new TableColumn(table, SWT.NULL);
column.setText(UpdateUIPlugin.getResourceString(KEY_C_VERSION));
column = new TableColumn(table, SWT.NULL);
column.setText(UpdateUIPlugin.getResourceString(KEY_C_PROVIDER));
column = new TableColumn(table, SWT.NULL);
column.setText(UpdateUIPlugin.getResourceString(KEY_C_SIZE));
TableLayout layout = new TableLayout();
layout.addColumnData(new ColumnWeightData(100, 200, true));
layout.addColumnData(new ColumnWeightData(100, 50, true));
layout.addColumnData(new ColumnWeightData(100, 100, true));
layout.addColumnData(new ColumnWeightData(100, true));
table.setLayout(layout);
table.setLayoutData(gd);
tableViewer.setContentProvider(new TableContentProvider());
tableViewer.setLabelProvider(new TableLabelProvider());
tableViewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
pageChanged();
}
});
}
public void setVisible(boolean visible) {
super.setVisible(visible);
if (visible) {
tableViewer.getTable().setFocus();
}
}
public PendingChange[] getSelectedJobs() {
Object[] selected = tableViewer.getCheckedElements();
PendingChange[] jobs = new PendingChange[selected.length];
System.arraycopy(selected, 0, jobs, 0, selected.length);
return jobs;
}
public PendingChange[] getSelectedJobsWithLicenses() {
Object[] selected = tableViewer.getCheckedElements();
ArrayList list = new ArrayList();
for (int i = 0; i < selected.length; i++) {
PendingChange job = (PendingChange) selected[i];
if (UpdateModel.hasLicense(job))
list.add(job);
}
return (PendingChange[]) list.toArray(new PendingChange[list.size()]);
}
}