blob: a9a42a16e7e767153a78a36b9e973dca003417b3 [file] [log] [blame]
package org.eclipse.update.internal.ui.views;
import java.util.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.*;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Widget;
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.SharedLabelProvider;
import org.eclipse.update.internal.ui.wizards.*;
/**
*
*/
public class ItemsView extends BaseTableView {
private UpdateModelChangedListener modelListener;
private Action deleteAction;
private Action processAction;
private Action processAllAction;
class ViewContentProvider implements IStructuredContentProvider {
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object parent) {
return UpdateUI
.getDefault()
.getUpdateModel()
.getPendingChanges();
}
}
class ViewLabelProvider
extends LabelProvider
implements ITableLabelProvider {
public String getColumnText(Object obj, int col) {
return getText(obj);
}
public String getText(Object obj) {
if (obj instanceof IFeatureAdapter) {
try {
IFeature feature = ((IFeatureAdapter) obj).getFeature(null);
VersionedIdentifier versionedIdentifier =
(feature != null)
? feature.getVersionedIdentifier()
: null;
String version = "";
if (versionedIdentifier != null)
version = versionedIdentifier.getVersion().toString();
String label = (feature != null) ? feature.getLabel() : "";
return label + " " + version;
} catch (CoreException e) {
}
}
return super.getText(obj);
}
public Image getColumnImage(Object obj, int index) {
PendingChange job = (PendingChange) obj;
int flags = 0;
switch (job.getJobType()) {
case PendingChange.INSTALL :
flags = SharedLabelProvider.F_ADD;
break;
case PendingChange.UNINSTALL :
flags = SharedLabelProvider.F_DEL;
break;
case PendingChange.CONFIGURE :
break;
case PendingChange.UNCONFIGURE :
flags = SharedLabelProvider.F_UNCONFIGURED;
break;
}
boolean patch = job.getFeature().isPatch();
ImageDescriptor desc = patch?UpdateUIImages.DESC_EFIX_OBJ:
UpdateUIImages.DESC_FEATURE_OBJ;
return UpdateUI.getDefault().getLabelProvider().get(
desc,
flags);
}
}
class UpdateModelChangedListener implements IUpdateModelChangedListener {
/**
* @see org.eclipse.update.internal.ui.model.IUpdateModelChangedListener#objectChanged(java.lang.Object, java.lang.String)
*/
public void objectChanged(final Object object, String property) {
if (object instanceof PendingChange) {
getTableViewer()
.getControl()
.getDisplay()
.asyncExec(new Runnable() {
public void run() {
getTableViewer().update(object, null);
updateTitle();
}
});
}
}
/**
* @see org.eclipse.update.internal.ui.model.IUpdateModelChangedListener#objectsAdded(java.lang.Object, java.lang.Object)
*/
public void objectsAdded(Object parent, final Object[] children) {
if (children[0] instanceof PendingChange) {
getTableViewer()
.getControl()
.getDisplay()
.asyncExec(new Runnable() {
public void run() {
getTableViewer().add(children);
updateTitle();
}
});
}
}
/**
* @see org.eclipse.update.internal.ui.model.IUpdateModelChangedListener#objectsRemoved(java.lang.Object, java.lang.Object)
*/
public void objectsRemoved(Object parent, final Object[] children) {
if (children[0] instanceof PendingChange) {
getTableViewer()
.getControl()
.getDisplay()
.asyncExec(new Runnable() {
public void run() {
getTableViewer().remove(children);
updateTitle();
}
});
}
}
}
public ItemsView() {
modelListener = new UpdateModelChangedListener();
UpdateUI.getDefault().getLabelProvider().connect(this);
}
/**
* @see org.eclipse.update.internal.ui.views.BaseView#initProviders()
*/
public void initProviders() {
TableViewer viewer = getTableViewer();
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setInput(UpdateUI.getDefault().getUpdateModel());
}
protected void fillContextMenu(IMenuManager manager) {
processAction.setEnabled(canProcess());
manager.add(processAction);
manager.add(processAllAction);
manager.add(new Separator());
deleteAction.setEnabled(canDelete());
manager.add(deleteAction);
manager.add(new Separator());
super.fillContextMenu(manager);
}
protected void makeActions() {
deleteAction = new Action() {
public void run() {
doDelete();
}
};
deleteAction.setText(
UpdateUI.getString("ItemsView.popup.delete"));
processAction = new Action() {
public void run() {
doProcess();
}
};
processAction.setText(
UpdateUI.getString("ItemsView.popup.process"));
processAllAction = new Action() {
public void run() {
doProcessAll();
}
};
processAllAction.setText(
UpdateUI.getString("ItemsView.popup.processAll"));
super.makeActions();
}
public void dispose() {
hookListeners(false);
UpdateUI.getDefault().getLabelProvider().disconnect(this);
super.dispose();
}
protected void partControlCreated() {
UpdateModel model = UpdateUI.getDefault().getUpdateModel();
hookListeners(true);
}
protected void hookListeners(boolean add) {
UpdateModel model = UpdateUI.getDefault().getUpdateModel();
if (add)
model.addUpdateModelChangedListener(modelListener);
else
model.removeUpdateModelChangedListener(modelListener);
}
protected void deleteKeyPressed(Widget widget) {
if (canDelete())
doDelete();
}
private boolean canProcess() {
return canDelete();
}
private void doProcess() {
IStructuredSelection ssel =
(IStructuredSelection) getViewer().getSelection();
ArrayList jobs = new ArrayList();
for (Iterator iter = ssel.iterator(); iter.hasNext();) {
PendingChange job = (PendingChange) iter.next();
if (job.isProcessed() == false)
jobs.add(job);
}
PendingChange[] result =
(PendingChange[]) jobs.toArray(new PendingChange[jobs.size()]);
doProcess(result);
}
private void doProcessAll() {
UpdateModel model = UpdateUI.getDefault().getUpdateModel();
PendingChange[] jobs = model.getPendingChanges();
doProcess(jobs);
}
private void doProcess(final PendingChange[] jobs) {
BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() {
public void run() {
MultiInstallWizard wizard = new MultiInstallWizard(jobs);
WizardDialog dialog =
new InstallWizardDialog(
getControl().getShell(),
wizard);
dialog.create();
dialog.getShell().setSize(600, 500);
dialog.open();
if (wizard.isSuccessfulInstall())
UpdateUI.informRestartNeeded();
}
});
}
private void doDelete() {
if (!confirmDeletion())
return;
IStructuredSelection ssel =
(IStructuredSelection) getViewer().getSelection();
UpdateModel model = UpdateUI.getDefault().getUpdateModel();
for (Iterator iter = ssel.iterator(); iter.hasNext();) {
model.removePendingChange((PendingChange) iter.next());
}
}
private boolean canDelete() {
return getViewer().getSelection().isEmpty() == false;
}
private void updateTitle() {
UpdateModel model = UpdateUI.getDefault().getUpdateModel();
PendingChange[] changes = model.getPendingChanges();
int total = changes.length;
int completed = 0;
for (int i = 0; i < changes.length; i++) {
PendingChange job = changes[i];
if (job.isProcessed())
completed++;
}
String baseName = getSite().getRegisteredName();
String title =
UpdateUI.getFormattedMessage(
"ItemsView.title",
new String[] {
getSite().getRegisteredName(),
"" + total,
"" + completed });
setTitle(title);
}
}