blob: f8e7da08b662d6e72b57d0c5ce636cb513e21045 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 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.update.internal.ui.views;
import java.io.*;
import java.lang.reflect.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.action.*;
import org.eclipse.jface.operation.*;
import org.eclipse.jface.resource.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.*;
import org.eclipse.ui.branding.*;
import org.eclipse.ui.dialogs.*;
import org.eclipse.ui.model.IWorkbenchAdapter;
import org.eclipse.ui.part.*;
import org.eclipse.update.configuration.*;
import org.eclipse.update.core.*;
import org.eclipse.update.internal.core.LocalSite;
import org.eclipse.update.internal.operations.*;
import org.eclipse.update.internal.ui.*;
import org.eclipse.update.internal.ui.model.*;
import org.eclipse.update.internal.ui.parts.*;
import org.eclipse.update.operations.*;
import org.osgi.framework.*;
import org.eclipse.core.runtime.Path;
/**
* Insert the type's description here.
* @see ViewPart
*/
public class ConfigurationView
implements
IInstallConfigurationChangedListener,
IConfiguredSiteChangedListener,
ILocalSiteChangedListener {
private TreeViewer treeViewer;
private DrillDownAdapter drillDownAdapter;
private Action collapseAllAction;
private static final String STATE_SHOW_UNCONF = "ConfigurationView.showUnconf"; //$NON-NLS-1$
private static final String STATE_SHOW_SITES = "ConfigurationView.showSites"; //$NON-NLS-1$
private static final String STATE_SHOW_NESTED_FEATURES =
"ConfigurationView.showNestedFeatures"; //$NON-NLS-1$
private Action showSitesAction;
private Action showNestedFeaturesAction;
private ReplaceVersionAction swapVersionAction;
private FeatureStateAction featureStateAction;
private UninstallFeatureAction uninstallFeatureAction;
private UnconfigureAndUninstallFeatureAction unconfigureAndUninstallFeatureAction;
private FeaturesStateAction featuresStateAction;
private UninstallFeaturesAction uninstallFeaturesAction;
private UnconfigureAndUninstallFeaturesAction unconfigureAndUninstallFeaturesAction;
private InstallOptionalFeatureAction installOptFeatureAction;
private Action showUnconfFeaturesAction;
private RevertConfigurationAction revertAction;
private ShowActivitiesAction showActivitiesAction;
private Action propertiesAction;
private SiteStateAction siteStateAction;
private Action installationHistoryAction;
private Action newExtensionLocationAction;
private FindUpdatesAction findUpdatesAction;
private SashForm splitter;
private ConfigurationPreview preview;
private Hashtable previewTasks;
private IUpdateModelChangedListener modelListener;
private boolean refreshLock = false;
private Image eclipseImage;
private boolean initialized;
private ConfigurationManagerWindow configurationWindow;
class ConfigurationSorter extends ViewerSorter {
public int category(Object obj) {
// sites
if (obj instanceof IConfiguredSiteAdapter) {
IConfiguredSite csite =
((IConfiguredSiteAdapter) obj).getConfiguredSite();
if (csite.isProductSite())
return 1;
if (csite.isExtensionSite())
return 2;
return 3;
}
return super.category(obj);
}
}
class LocalSiteProvider
extends DefaultContentProvider
implements ITreeContentProvider {
public void inputChanged(
Viewer viewer,
Object oldInput,
Object newInput) {
if (newInput == null)
return;
}
public Object[] getChildren(Object parent) {
if (parent instanceof UpdateModel) {
LocalSiteWorkbenchAdapter localSite = getUIReadyLocalSite(getLocalSite());
return (localSite != null) ? new Object[] { localSite }
: new Object[0];
}
if (parent instanceof ILocalSite) {
Object[] csites = openLocalSite();
if (showSitesAction.isChecked())
return csites;
ArrayList result = new ArrayList();
boolean showUnconf = showUnconfFeaturesAction.isChecked();
for (int i = 0; i < csites.length; i++) {
IConfiguredSiteAdapter adapter =
(IConfiguredSiteAdapter) csites[i];
Object[] roots = getFeatures(adapter, !showUnconf);
for (int j = 0; j < roots.length; j++) {
result.add(roots[j]);
}
}
return result.toArray();
}
if (parent instanceof IConfiguredSiteAdapter) {
return getFeatures(
(IConfiguredSiteAdapter) parent,
!showUnconfFeaturesAction.isChecked());
}
if (parent instanceof ConfiguredFeatureAdapter
&& showNestedFeaturesAction.isChecked()) {
IFeatureAdapter[] nested =
((ConfiguredFeatureAdapter) parent).getIncludedFeatures(
null);
if (showUnconfFeaturesAction.isChecked())
return nested;
ArrayList result = new ArrayList();
for (int i = 0; i < nested.length; i++) {
if (((ConfiguredFeatureAdapter) nested[i]).isConfigured())
result.add(nested[i]);
}
return (IFeatureAdapter[]) result.toArray(
new IFeatureAdapter[result.size()]);
}
return new Object[0];
}
public Object getParent(Object child) {
return null;
}
public boolean hasChildren(Object parent) {
if (parent instanceof ConfiguredFeatureAdapter) {
if (!showNestedFeaturesAction.isChecked())
return false;
IFeatureAdapter[] features =
((ConfiguredFeatureAdapter) parent).getIncludedFeatures(
null);
if (showUnconfFeaturesAction.isChecked())
return features.length > 0;
for (int i = 0; i < features.length; i++) {
if (((ConfiguredFeatureAdapter) features[i])
.isConfigured())
return true;
}
return false;
}
if (parent instanceof ConfiguredSiteAdapter) {
IConfiguredSite site =
((ConfiguredSiteAdapter) parent).getConfiguredSite();
if (site.isEnabled()) {
if (!showUnconfFeaturesAction.isChecked())
return site.getConfiguredFeatures().length > 0;
return site.getFeatureReferences().length > 0;
}
return (showUnconfFeaturesAction.isChecked());
}
return true;
}
public Object[] getElements(Object input) {
return getChildren(input);
}
}
class LocalSiteLabelProvider extends LabelProvider {
public String getText(Object obj) {
if (obj instanceof ILocalSite) {
IProduct product = Platform.getProduct();
if (product != null)
return product.getName();
return UpdateUIMessages.ConfigurationView_current;
}
if (obj instanceof IConfiguredSiteAdapter) {
IConfiguredSite csite =
((IConfiguredSiteAdapter) obj).getConfiguredSite();
ISite site = csite.getSite();
return new File(site.getURL().getFile()).toString();
}
if (obj instanceof IFeatureAdapter) {
try {
IFeature feature = ((IFeatureAdapter) obj).getFeature(null);
if (feature instanceof MissingFeature) {
return NLS.bind(UpdateUIMessages.ConfigurationView_missingFeature, feature.getLabel());
}
String version = feature.getVersionedIdentifier().getVersion().toString();
String pending = ""; //$NON-NLS-1$
if (OperationsManager.findPendingOperation(feature)
!= null)
pending = UpdateUIMessages.ConfigurationView_pending;
return feature.getLabel() + " " + version + pending; //$NON-NLS-1$
} catch (CoreException e) {
return UpdateUIMessages.ConfigurationView_error;
}
}
return super.getText(obj);
}
public Image getImage(Object obj) {
UpdateLabelProvider provider =
UpdateUI.getDefault().getLabelProvider();
if (obj instanceof ILocalSite)
return eclipseImage;
if (obj instanceof ConfiguredFeatureAdapter)
return getFeatureImage(
provider,
(ConfiguredFeatureAdapter) obj);
if (obj instanceof IConfiguredSiteAdapter) {
IConfiguredSite csite =
((IConfiguredSiteAdapter) obj).getConfiguredSite();
int flags =
csite.isUpdatable() ? 0 : UpdateLabelProvider.F_LINKED;
if (!csite.isEnabled())
flags |= UpdateLabelProvider.F_UNCONFIGURED;
return provider.get(
provider.getLocalSiteDescriptor(csite),
flags);
}
return null;
}
private Image getFeatureImage(
UpdateLabelProvider provider,
ConfiguredFeatureAdapter adapter) {
try {
IFeature feature = adapter.getFeature(null);
if (feature instanceof MissingFeature) {
if (((MissingFeature) feature).isOptional())
return provider.get(
UpdateUIImages.DESC_NOTINST_FEATURE_OBJ);
return provider.get(
UpdateUIImages.DESC_FEATURE_OBJ,
UpdateLabelProvider.F_ERROR);
}
boolean efix = feature.isPatch();
ImageDescriptor baseDesc =
efix
? UpdateUIImages.DESC_EFIX_OBJ
: (adapter.isConfigured()
? UpdateUIImages.DESC_FEATURE_OBJ
: UpdateUIImages.DESC_UNCONF_FEATURE_OBJ);
int flags = 0;
if (efix && !adapter.isConfigured())
flags |= UpdateLabelProvider.F_UNCONFIGURED;
if (OperationsManager.findPendingOperation(feature) == null) {
ILocalSite localSite = getLocalSite();
if (localSite != null) {
int code =
getStatusCode(
feature,
localSite.getFeatureStatus(feature));
switch (code) {
case IFeature.STATUS_UNHAPPY :
flags |= UpdateLabelProvider.F_ERROR;
break;
case IFeature.STATUS_AMBIGUOUS :
flags |= UpdateLabelProvider.F_WARNING;
break;
default :
if (adapter.isConfigured()
&& adapter.isUpdated())
flags |= UpdateLabelProvider.F_UPDATED;
break;
}
}
}
return provider.get(baseDesc, flags);
} catch (CoreException e) {
return provider.get(
UpdateUIImages.DESC_FEATURE_OBJ,
UpdateLabelProvider.F_ERROR);
}
}
}
class PreviewTask implements IPreviewTask {
private String name;
private String desc;
private IAction action;
public PreviewTask(String name, String desc, IAction action) {
this.name = name;
this.desc = desc;
this.action = action;
}
public IAction getAction() {
return action;
}
public String getName() {
if (name != null)
return name;
return action.getText();
}
public String getDescription() {
return desc;
}
public void setDescription(String desc) {
this.desc = desc;
}
public void run() {
action.run();
}
public boolean isEnabled() {
return action.isEnabled();
}
}
public ConfigurationView(ConfigurationManagerWindow window) {
UpdateUI.getDefault().getLabelProvider().connect(this);
configurationWindow=window;
initializeImages();
}
private void initializeImages() {
IProduct product = Platform.getProduct();
if (product != null) {
eclipseImage = getProductImage16(product);
}
if (eclipseImage==null) {
ImageDescriptor edesc = UpdateUIImages.DESC_APP_OBJ;
eclipseImage = UpdateUI.getDefault().getLabelProvider().get(edesc);
}
}
private Image getProductImage16(IProduct product) {
// Loop through the product window images and
// pick the first whose size is 16x16 and does not
// alpha transparency type.
String windowImagesUrls = product.getProperty(IProductConstants.WINDOW_IMAGES);
Image png=null, gif=null, other = null;
if (windowImagesUrls != null ) {
StringTokenizer st = new StringTokenizer(windowImagesUrls, ","); //$NON-NLS-1$
while (st.hasMoreTokens()) {
String windowImageURL = st.nextToken();
ImageDescriptor edesc=null;
try {
edesc = ImageDescriptor.createFromURL(new URL(windowImageURL));
} catch (MalformedURLException e) {
// must be a path relative to the product bundle
Bundle productBundle = product.getDefiningBundle();
if (productBundle != null) {
URL url = FileLocator.find(productBundle, new Path(windowImageURL), null);
if (url != null)
edesc = ImageDescriptor.createFromURL(url);
}
}
if (edesc!=null) {
Image image = UpdateUI.getDefault().getLabelProvider().get(edesc);
Rectangle bounds = image.getBounds();
if (bounds.width==16 && bounds.height==16) {
// avoid images with TRANSPARENCY_ALPHA
//if (image.getImageData().getTransparencyType()!=SWT.TRANSPARENCY_ALPHA)
// return image;
//Instead of returning, just store the image based on the
// extension.
if (windowImageURL.toLowerCase().endsWith(".gif")) //$NON-NLS-1$
gif = image;
else if (windowImageURL.toLowerCase().endsWith(".png")) //$NON-NLS-1$
png = image;
else
other = image;
}
}
}
}
Image choice = null;
// Pick png first because of transparency
if (png!=null) {
choice = png;
}
// Pick other format
else if (other!=null)
choice = other;
// Pick gif
else if (gif!=null)
choice = gif;
return choice;
}
public void initProviders() {
treeViewer.setContentProvider(new LocalSiteProvider());
treeViewer.setLabelProvider(new LocalSiteLabelProvider());
treeViewer.setInput(UpdateUI.getDefault().getUpdateModel());
treeViewer.setSorter(new ConfigurationSorter());
ILocalSite localSite = getLocalSite();
if (localSite != null)
localSite.addLocalSiteChangedListener(this);
modelListener = new IUpdateModelChangedListener() {
public void objectsAdded(Object parent, Object[] children) {
}
public void objectsRemoved(Object parent, Object[] children) {
}
public void objectChanged(final Object obj, String property) {
if (refreshLock)
return;
Control control = getControl();
if (!control.isDisposed()) {
control.getDisplay().asyncExec(new Runnable() {
public void run() {
treeViewer.refresh();
handleSelectionChanged(
(IStructuredSelection) treeViewer
.getSelection());
}
});
}
}
};
OperationsManager.addUpdateModelChangedListener(modelListener);
PlatformUI.getWorkbench().getHelpSystem().setHelp(
getControl(),
"org.eclipse.update.ui.ConfigurationView"); //$NON-NLS-1$
}
private ILocalSite getLocalSite() {
try {
return SiteManager.getLocalSite();
} catch (CoreException e) {
UpdateUI.logException(e);
return null;
}
}
private Object[] openLocalSite() {
final Object[][] bag = new Object[1][];
BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() {
public void run() {
ILocalSite localSite = getLocalSite();
if (localSite == null)
return;
IInstallConfiguration config =
getLocalSite().getCurrentConfiguration();
IConfiguredSite[] sites = config.getConfiguredSites();
Object[] result = new Object[sites.length];
for (int i = 0; i < sites.length; i++) {
result[i] = new ConfiguredSiteAdapter(config, sites[i]);
}
if (!initialized) {
config.addInstallConfigurationChangedListener(
ConfigurationView.this);
initialized = true;
}
bag[0] = result;
}
});
return bag[0];
}
public void dispose() {
UpdateUI.getDefault().getLabelProvider().disconnect(this);
if (initialized) {
ILocalSite localSite = getLocalSite();
if (localSite != null) {
localSite.removeLocalSiteChangedListener(this);
IInstallConfiguration config =
localSite.getCurrentConfiguration();
config.removeInstallConfigurationChangedListener(this);
}
initialized = false;
}
OperationsManager.removeUpdateModelChangedListener(modelListener);
if (preview != null)
preview.dispose();
//super.dispose();
}
protected void makeActions() {
collapseAllAction = new Action() {
public void run() {
treeViewer.getControl().setRedraw(false);
treeViewer.collapseToLevel(
treeViewer.getInput(),
TreeViewer.ALL_LEVELS);
treeViewer.getControl().setRedraw(true);
}
};
collapseAllAction.setText(UpdateUIMessages.ConfigurationView_collapseLabel);
collapseAllAction.setToolTipText(UpdateUIMessages.ConfigurationView_collapseTooltip);
collapseAllAction.setImageDescriptor(UpdateUIImages.DESC_COLLAPSE_ALL);
drillDownAdapter = new DrillDownAdapter(treeViewer);
featureStateAction = new FeatureStateAction(this.getConfigurationWindow().getShell(), ""); //$NON-NLS-1$
featuresStateAction = new FeaturesStateAction(this.getConfigurationWindow().getShell(), ""); //$NON-NLS-1$
siteStateAction = new SiteStateAction(getConfigurationWindow().getShell());
revertAction = new RevertConfigurationAction(getConfigurationWindow().getShell(),UpdateUIMessages.ConfigurationView_revertLabel);
PlatformUI.getWorkbench().getHelpSystem().setHelp(
revertAction,
"org.eclipse.update.ui.CofigurationView_revertAction"); //$NON-NLS-1$
installationHistoryAction =
new InstallationHistoryAction(getConfigurationWindow().getShell(),
UpdateUIMessages.ConfigurationView_installHistory,
UpdateUIImages.DESC_HISTORY_OBJ);
installationHistoryAction.setToolTipText(installationHistoryAction.getText());
newExtensionLocationAction =
new NewExtensionLocationAction(getConfigurationWindow().getShell(),
UpdateUIMessages.ConfigurationView_extLocation,
UpdateUIImages.DESC_ESITE_OBJ);
propertiesAction =
new PropertyDialogAction(
getConfigurationWindow(),
treeViewer);
PlatformUI.getWorkbench().getHelpSystem().setHelp(
propertiesAction,
"org.eclipse.update.ui.CofigurationView_propertiesAction"); //$NON-NLS-1$
uninstallFeatureAction = new UninstallFeatureAction(getConfigurationWindow().getShell(), UpdateUIMessages.ConfigurationView_uninstall);
unconfigureAndUninstallFeatureAction = new UnconfigureAndUninstallFeatureAction(getConfigurationWindow().getShell(), UpdateUIMessages.ConfigurationView_uninstall);
uninstallFeaturesAction = new UninstallFeaturesAction(getConfigurationWindow().getShell(), UpdateUIMessages.ConfigurationView_uninstall);
unconfigureAndUninstallFeaturesAction = new UnconfigureAndUninstallFeaturesAction(getConfigurationWindow().getShell(), UpdateUIMessages.ConfigurationView_unconfigureAndUninstall);
installOptFeatureAction =
new InstallOptionalFeatureAction(
getControl().getShell(),
UpdateUIMessages.ConfigurationView_install);
swapVersionAction = new ReplaceVersionAction(getConfigurationWindow().getShell(), UpdateUIMessages.ConfigurationView_anotherVersion);
findUpdatesAction =
new FindUpdatesAction(configurationWindow, UpdateUIMessages.ConfigurationView_findUpdates);
showActivitiesAction = new ShowActivitiesAction(getControl().getShell(), UpdateUIMessages.ConfigurationView_showActivitiesLabel);
PlatformUI.getWorkbench().getHelpSystem().setHelp(
showActivitiesAction,
"org.eclipse.update.ui.ConfigurationView_showActivitiesAction"); //$NON-NLS-1$
makeShowUnconfiguredFeaturesAction();
makeShowSitesAction();
makeShowNestedFeaturesAction();
makePreviewTasks();
configurationWindow.setPropertiesActionHandler(propertiesAction);
}
private void makeShowNestedFeaturesAction() {
final Preferences pref = UpdateUI.getDefault().getPluginPreferences();
pref.setDefault(STATE_SHOW_NESTED_FEATURES, true);
showNestedFeaturesAction = new Action() {
public void run() {
treeViewer.refresh();
pref.setValue(
STATE_SHOW_NESTED_FEATURES,
showNestedFeaturesAction.isChecked());
}
};
showNestedFeaturesAction.setText(UpdateUIMessages.ConfigurationView_showNestedFeatures);
showNestedFeaturesAction.setImageDescriptor(
UpdateUIImages.DESC_SHOW_HIERARCHY);
showNestedFeaturesAction.setDisabledImageDescriptor(
UpdateUIImages.DESC_SHOW_HIERARCHY_D);
showNestedFeaturesAction.setChecked(
pref.getBoolean(STATE_SHOW_NESTED_FEATURES));
showNestedFeaturesAction.setToolTipText(UpdateUIMessages.ConfigurationView_showNestedTooltip);
}
private void makeShowSitesAction() {
final Preferences pref = UpdateUI.getDefault().getPluginPreferences();
pref.setDefault(STATE_SHOW_SITES, true);
showSitesAction = new Action() {
public void run() {
treeViewer.refresh();
pref.setValue(STATE_SHOW_SITES, showSitesAction.isChecked());
UpdateUI.getDefault().savePluginPreferences();
}
};
showSitesAction.setText(UpdateUIMessages.ConfigurationView_showInstall);
showSitesAction.setImageDescriptor(UpdateUIImages.DESC_LSITE_OBJ);
showSitesAction.setChecked(pref.getBoolean(STATE_SHOW_SITES));
showSitesAction.setToolTipText(UpdateUIMessages.ConfigurationView_showInstallTooltip);
}
private void makeShowUnconfiguredFeaturesAction() {
final Preferences pref = UpdateUI.getDefault().getPluginPreferences();
pref.setDefault(STATE_SHOW_UNCONF, false);
showUnconfFeaturesAction = new Action() {
public void run() {
pref.setValue(
STATE_SHOW_UNCONF,
showUnconfFeaturesAction.isChecked());
UpdateUI.getDefault().savePluginPreferences();
treeViewer.refresh();
}
};
PlatformUI.getWorkbench().getHelpSystem().setHelp(
showUnconfFeaturesAction,
"org.eclipse.update.ui.CofigurationView_showUnconfFeaturesAction"); //$NON-NLS-1$
showUnconfFeaturesAction.setText(UpdateUIMessages.ConfigurationView_showDisabled);
showUnconfFeaturesAction.setImageDescriptor(
UpdateUIImages.DESC_UNCONF_FEATURE_OBJ);
showUnconfFeaturesAction.setChecked(pref.getBoolean(STATE_SHOW_UNCONF));
showUnconfFeaturesAction.setToolTipText(UpdateUIMessages.ConfigurationView_showDisabledTooltip);
}
protected void fillActionBars(ToolBarManager tbm) {
tbm.add(showSitesAction);
tbm.add(showNestedFeaturesAction);
tbm.add(showUnconfFeaturesAction);
tbm.add(new Separator());
drillDownAdapter.addNavigationActions(tbm);
tbm.add(new Separator());
tbm.add(collapseAllAction);
tbm.add(new Separator());
tbm.add(installationHistoryAction);
}
protected Object getSelectedObject() {
ISelection selection = treeViewer.getSelection();
if (selection instanceof IStructuredSelection
&& !selection.isEmpty()) {
IStructuredSelection ssel = (IStructuredSelection) selection;
if (ssel.size() == 1)
return ssel.getFirstElement();
else
return ssel.toArray();
}
return null;
}
protected void fillContextMenu(IMenuManager manager) {
Object obj = getSelectedObject();
boolean areMultipleFeaturesSelected = true;
if ( obj instanceof Object[]) {
Object[] array = (Object[])obj;
for( int i = 0; i < array.length; i++) {
if (!(array[i] instanceof ConfiguredFeatureAdapter)) {
areMultipleFeaturesSelected = false;
}
}
} else {
areMultipleFeaturesSelected = false;
}
if (obj instanceof ILocalSite) {
manager.add(findUpdatesAction);
manager.add(revertAction);
} else if (obj instanceof IConfiguredSiteAdapter) {
manager.add(siteStateAction);
}
if (obj instanceof ILocalSite
|| obj instanceof IConfiguredSiteAdapter) {
manager.add(new Separator());
MenuManager mgr = new MenuManager(UpdateUIMessages.ConfigurationView_new);
mgr.add(newExtensionLocationAction);
manager.add(mgr);
manager.add(new Separator());
} else if ( (obj instanceof ConfiguredFeatureAdapter) && !areMultipleFeaturesSelected){
try {
MenuManager mgr = new MenuManager(UpdateUIMessages.ConfigurationView_replaceWith);
manager.add(findUpdatesAction);
manager.add(new Separator());
mgr.add(swapVersionAction);
manager.add(mgr);
manager.add(featureStateAction);
IFeature feature =
((ConfiguredFeatureAdapter) obj).getFeature(null);
if (feature instanceof MissingFeature) {
manager.add(installOptFeatureAction);
} else {
boolean configured = ((ConfiguredFeatureAdapter)obj).isConfigured();
if (!configured)
manager.add(uninstallFeatureAction);
else
manager.add(unconfigureAndUninstallFeatureAction);
}
manager.add(new Separator());
} catch (CoreException e) {
}
} else if (areMultipleFeaturesSelected) {
manager.add(findUpdatesAction);
manager.add(new Separator());
manager.add(featuresStateAction);
manager.add(uninstallFeaturesAction);
manager.add(unconfigureAndUninstallFeaturesAction);
manager.add(new Separator());
}
drillDownAdapter.addNavigationActions(manager);
if (obj instanceof ILocalSite) {
manager.add(new Separator());
manager.add(installationHistoryAction);
}
if (obj instanceof IFeatureAdapter
|| obj instanceof ILocalSite
|| obj instanceof IConfiguredSiteAdapter) {
manager.add(new Separator());
manager.add(propertiesAction);
}
}
public void installSiteAdded(IConfiguredSite csite) {
asyncRefresh();
}
public void installSiteRemoved(IConfiguredSite site) {
asyncRefresh();
}
public void featureInstalled(IFeature feature) {
asyncRefresh();
}
public void featureRemoved(IFeature feature) {
asyncRefresh();
}
public void featureConfigured(IFeature feature) {
}
public void featureUnconfigured(IFeature feature) {
}
public void currentInstallConfigurationChanged(IInstallConfiguration configuration) {
asyncRefresh();
}
public void installConfigurationRemoved(IInstallConfiguration configuration) {
asyncRefresh();
}
private void asyncRefresh() {
Display display = SWTUtil.getStandardDisplay();
if (display == null)
return;
if (getControl().isDisposed())
return;
display.asyncExec(new Runnable() {
public void run() {
if (!getControl().isDisposed())
treeViewer.refresh();
}
});
}
private Object[] getFeatures(
final IConfiguredSiteAdapter siteAdapter,
final boolean configuredOnly) {
final IConfiguredSite csite = siteAdapter.getConfiguredSite();
final Object[][] bag = new Object[1][];
refreshLock = true;
IRunnableWithProgress op = new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) {
ArrayList result = new ArrayList();
IFeatureReference[] refs;
if (configuredOnly)
refs = csite.getConfiguredFeatures();
else {
ISite site = csite.getSite();
refs = site.getFeatureReferences();
}
monitor.beginTask(
UpdateUIMessages.ConfigurationView_loading,
refs.length);
for (int i = 0; i < refs.length; i++) {
IFeatureReference ref = refs[i];
IFeature feature;
try {
monitor.subTask(ref.getURL().toString());
feature = ref.getFeature(null);
} catch (CoreException e) {
feature =
new MissingFeature(ref.getSite(), ref.getURL());
}
monitor.worked(1);
result.add(
new ConfiguredFeatureAdapter(
siteAdapter,
feature,
csite.isConfigured(feature),
false,
false));
}
monitor.done();
bag[0] = getRootFeatures(result);
}
};
try {
if (configurationWindow.getShell().isVisible())
configurationWindow.run(true, false, op);
else
op.run(new NullProgressMonitor());
} catch (InterruptedException e) {
} catch (InvocationTargetException e) {
} finally {
refreshLock = false;
}
return bag[0];
}
private Object[] getRootFeatures(ArrayList list) {
ArrayList children = new ArrayList();
ArrayList result = new ArrayList();
try {
for (int i = 0; i < list.size(); i++) {
ConfiguredFeatureAdapter cf =
(ConfiguredFeatureAdapter) list.get(i);
IFeature feature = cf.getFeature(null);
if (feature != null)
addChildFeatures(
feature,
children,
cf.isConfigured());
}
for (int i = 0; i < list.size(); i++) {
ConfiguredFeatureAdapter cf =
(ConfiguredFeatureAdapter) list.get(i);
IFeature feature = cf.getFeature(null);
if (feature != null
&& isChildFeature(feature, children) == false)
result.add(cf);
}
} catch (CoreException e) {
return list.toArray();
}
return result.toArray();
}
private void addChildFeatures(
IFeature feature,
ArrayList children,
boolean configured) {
try {
IIncludedFeatureReference[] included =
feature.getIncludedFeatureReferences();
for (int i = 0; i < included.length; i++) {
IFeature childFeature;
try {
childFeature =
included[i].getFeature(null);
} catch (CoreException e) {
childFeature = new MissingFeature(included[i]);
}
children.add(childFeature);
}
} catch (CoreException e) {
UpdateUI.logException(e);
}
}
private boolean isChildFeature(IFeature feature, ArrayList children) {
for (int i = 0; i < children.size(); i++) {
IFeature child = (IFeature) children.get(i);
if (feature
.getVersionedIdentifier()
.equals(child.getVersionedIdentifier()))
return true;
}
return false;
}
protected void handleDoubleClick(DoubleClickEvent e) {
if (e.getSelection() instanceof IStructuredSelection) {
IStructuredSelection ssel = (IStructuredSelection) e.getSelection();
Object obj = ssel.getFirstElement();
if (obj!=null)
propertiesAction.run();
}
}
public void createPartControl(Composite parent) {
splitter = new SashForm(parent, SWT.HORIZONTAL);
splitter.setLayoutData(new GridData(GridData.FILL_BOTH));
Composite leftContainer = createLineContainer(splitter);
Composite rightContainer = createLineContainer(splitter);
createTreeViewer(leftContainer);
makeActions();
createVerticalLine(leftContainer);
createVerticalLine(rightContainer);
preview = new ConfigurationPreview(this);
preview.createControl(rightContainer);
preview.getControl().setLayoutData(
new GridData(GridData.FILL_BOTH));
splitter.setWeights(new int[] { 2, 3 });
fillActionBars(getConfigurationWindow().getToolBarManager());
treeViewer.expandToLevel(2);
if (treeViewer.getTree().getItemCount() > 0) {
TreeItem[] items = treeViewer.getTree().getItems();
treeViewer.getTree().setSelection(new TreeItem[] { items[0] });
handleSelectionChanged(new StructuredSelection(items[0].getData()));
}
}
private void createTreeViewer(Composite parent) {
treeViewer =
new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
treeViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
treeViewer.setUseHashlookup(true);
initProviders();
MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
menuMgr.setRemoveAllWhenShown(true);
menuMgr.addMenuListener(new IMenuListener() {
public void menuAboutToShow(IMenuManager manager) {
manager.add(new GroupMarker("additions")); //$NON-NLS-1$
fillContextMenu(manager);
}
});
treeViewer.getControl().setMenu(
menuMgr.createContextMenu(treeViewer.getControl()));
treeViewer
.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
handleSelectionChanged(event);
}
});
treeViewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
handleDoubleClick(event);
}
});
}
public TreeViewer getTreeViewer() {
return treeViewer;
}
private Composite createLineContainer(Composite parent) {
Composite container = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout();
layout.numColumns = 2;
layout.marginWidth = layout.marginHeight = 0;
layout.horizontalSpacing = 0;
container.setLayout(layout);
return container;
}
private void createVerticalLine(Composite parent) {
Label line = new Label(parent, SWT.SEPARATOR | SWT.VERTICAL);
GridData gd = new GridData(GridData.VERTICAL_ALIGN_FILL);
gd.widthHint = 1;
line.setLayoutData(gd);
}
public Control getControl() {
return splitter;
}
private int getStatusCode(IFeature feature, IStatus status) {
int code = status.getCode();
if (code == IFeature.STATUS_UNHAPPY) {
if (status.isMultiStatus()) {
IStatus[] children = status.getChildren();
for (int i = 0; i < children.length; i++) {
IStatus child = children[i];
if (child.isMultiStatus()
|| child.getCode() != IFeature.STATUS_DISABLED)
return code;
}
// If we are here, global status is unhappy
// because one or more included features
// is disabled.
if (UpdateUtils.hasObsoletePatches(feature)) {
// The disabled included features
// are old patches that are now
// subsumed by better versions of
// the features they were designed to
// patch.
return IFeature.STATUS_HAPPY;
}
}
}
return code;
}
protected void handleSelectionChanged(IStructuredSelection ssel) {
Object obj = ssel.getFirstElement();
boolean areMultipleFeaturesSelected = true;
if (ssel.size() > 1) {
Object[] array = ssel.toArray();
for( int i = 0; i < array.length; i++) {
if (!(array[i] instanceof ConfiguredFeatureAdapter)) {
areMultipleFeaturesSelected = false;
}
}
} else {
areMultipleFeaturesSelected = false;
}
if (ssel.size()>1)
obj = null;
if (obj!=null) {
ILabelProvider labelProvider = (ILabelProvider)treeViewer.getLabelProvider();
String text = labelProvider.getText(obj);
//Image img = labelProvider.getImage(obj);
Image img = null;
configurationWindow.updateStatusLine(text, img);
}
else
configurationWindow.updateStatusLine(null, null);
if (areMultipleFeaturesSelected && (ssel.size() > 1)) {
uninstallFeaturesAction.setSelection(ssel);
uninstallFeaturesAction.setEnabled(uninstallFeatureAction.canExecuteAction());
unconfigureAndUninstallFeaturesAction.setSelection(ssel);
unconfigureAndUninstallFeaturesAction.setEnabled(unconfigureAndUninstallFeatureAction.canExecuteAction());
featuresStateAction.setSelection(ssel);
featuresStateAction.setEnabled(featuresStateAction.canExecuteAction());
propertiesAction.setEnabled(false);
preview.setSelection(ssel);
return;
}
if (obj instanceof IFeatureAdapter) {
try {
propertiesAction.setEnabled(true);
ConfiguredFeatureAdapter adapter = (ConfiguredFeatureAdapter) obj;
IFeature feature = adapter.getFeature(null);
boolean missing = feature instanceof MissingFeature;
boolean enable = !missing
&& ((adapter.isOptional() || !adapter.isIncluded()));
uninstallFeatureAction.setSelection(ssel);
uninstallFeatureAction.setEnabled(enable
&& uninstallFeatureAction.canExecuteAction());
unconfigureAndUninstallFeatureAction.setSelection(ssel);
unconfigureAndUninstallFeatureAction.setEnabled(enable && unconfigureAndUninstallFeatureAction.canExecuteAction());
if (adapter.isConfigured())
setDescriptionOnTask(
uninstallFeatureAction,
adapter,
UpdateUIMessages.ConfigurationView_uninstallDesc2);
else
setDescriptionOnTask(
uninstallFeatureAction,
adapter,
UpdateUIMessages.ConfigurationView_uninstallDesc);
featureStateAction.setSelection(ssel);
featureStateAction.setEnabled(enable);
swapVersionAction.setEnabled(false);
if (enable) {
IFeature[] features = UpdateUtils.getInstalledFeatures(
feature, false);
if (features.length > 1) {
if (adapter.isConfigured()) {
// We only enable replace action if configured
// and selected. bug 74019
swapVersionAction.setEnabled(true);
swapVersionAction.setCurrentFeature(feature);
swapVersionAction.setFeatures(features);
} else {
// If we are not configured and another version is
// we want to disable StateAction. bug 74019
features = UpdateUtils.getInstalledFeatures(
feature, true);
if (features.length > 0) {
featureStateAction.setEnabled(false);
}
}
}
}
findUpdatesAction.setEnabled(false);
if (enable && adapter.isConfigured()) {
if (feature.getUpdateSiteEntry() != null) {
findUpdatesAction.setFeature(feature);
findUpdatesAction.setEnabled(true);
}
}
if (missing) {
MissingFeature mf = (MissingFeature) feature;
installOptFeatureAction.setEnabled(mf.isOptional()
&& mf.getOriginatingSiteURL() != null);
installOptFeatureAction.setFeature(mf);
} else {
installOptFeatureAction.setEnabled(false);
}
} catch (CoreException ex) {
UpdateUI.logException(ex);
}
}
if (obj instanceof ILocalSite) {
propertiesAction.setEnabled(true);
findUpdatesAction.setEnabled(true);
findUpdatesAction.setFeature(null);
ILocalSite site = getLocalSite();
revertAction.setEnabled(site != null
&& site.getConfigurationHistory().length > 1);
} else if (obj instanceof IConfiguredSiteAdapter) {
siteStateAction.setSite(((IConfiguredSiteAdapter) obj)
.getConfiguredSite());
siteStateAction.setEnabled(true);
}
if (areMultipleFeaturesSelected) {
uninstallFeaturesAction.setSelection(ssel);
uninstallFeaturesAction.setEnabled(uninstallFeatureAction.canExecuteAction());
unconfigureAndUninstallFeaturesAction.setSelection(ssel);
unconfigureAndUninstallFeaturesAction.setEnabled(unconfigureAndUninstallFeatureAction.canExecuteAction());
featuresStateAction.setSelection(ssel);
featuresStateAction.setEnabled(featuresStateAction.canExecuteAction());
}
preview.setSelection(ssel);
}
protected void handleSelectionChanged(SelectionChangedEvent e) {
handleSelectionChanged(((IStructuredSelection) e.getSelection()));
}
private void setDescriptionOnTask(IAction action, ConfiguredFeatureAdapter adapter, String desc) {
IPreviewTask[] tasks = getPreviewTasks(adapter);
if (tasks == null)
return;
for (int i=0; i<tasks.length; i++)
if (tasks[i].getAction() == action)
tasks[i].setDescription(desc);
}
private void makePreviewTasks() {
previewTasks = new Hashtable();
Class key;
ArrayList array = new ArrayList();
// local site tasks
key = ILocalSite.class;
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_updateLabel,
UpdateUIMessages.ConfigurationView_updateDesc,
findUpdatesAction));
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_installHistLabel,
UpdateUIMessages.ConfigurationView_installHistDesc,
installationHistoryAction));
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_activitiesLabel,
UpdateUIMessages.ConfigurationView_activitiesDesc,
showActivitiesAction));
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_extLocLabel,
UpdateUIMessages.ConfigurationView_extLocDesc,
newExtensionLocationAction));
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_revertPreviousLabel,
UpdateUIMessages.ConfigurationView_revertPreviousDesc,
revertAction));
previewTasks.put(key, array.toArray(new IPreviewTask[array.size()]));
// configured site tasks
array.clear();
key = IConfiguredSiteAdapter.class;
array.add(
new PreviewTask(
null,
UpdateUIMessages.ConfigurationView_enableLocDesc,
siteStateAction));
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_extLocLabel,
UpdateUIMessages.ConfigurationView_extLocDesc,
newExtensionLocationAction));
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_propertiesLabel,
UpdateUIMessages.ConfigurationView_installPropDesc,
propertiesAction));
previewTasks.put(key, array.toArray(new IPreviewTask[array.size()]));
// feature adapter tasks
array.clear();
key = IFeatureAdapter.class;
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_scanLabel,
UpdateUIMessages.ConfigurationView_scanDesc,
findUpdatesAction));
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_replaceVersionLabel,
UpdateUIMessages.ConfigurationView_replaceVersionDesc,
swapVersionAction));
array.add(
new PreviewTask(
null,
UpdateUIMessages.ConfigurationView_enableFeatureDesc,
featureStateAction));
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_installOptionalLabel,
UpdateUIMessages.ConfigurationView_installOptionalDesc,
installOptFeatureAction));
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_uninstallLabel,
UpdateUIMessages.ConfigurationView_uninstallDesc,
uninstallFeatureAction));
array.add(
new PreviewTask(
UpdateUIMessages.ConfigurationView_featurePropLabel,
UpdateUIMessages.ConfigurationView_featurePropDesc,
propertiesAction));
previewTasks.put(key, array.toArray(new IPreviewTask[array.size()]));
}
public IPreviewTask[] getPreviewTasks(Object object) {
IPreviewTask[] tasks = null;
if (object instanceof IFeatureAdapter)
tasks = (IPreviewTask[]) previewTasks.get(IFeatureAdapter.class);
if (object instanceof ILocalSite)
tasks = (IPreviewTask[]) previewTasks.get(ILocalSite.class);
if (object instanceof IConfiguredSiteAdapter)
tasks =
(IPreviewTask[]) previewTasks.get(IConfiguredSiteAdapter.class);
return (tasks != null) ? tasks : new IPreviewTask[0];
}
ConfigurationManagerWindow getConfigurationWindow(){
return configurationWindow;
}
private LocalSiteWorkbenchAdapter getUIReadyLocalSite(ILocalSite localSite) {
return new LocalSiteWorkbenchAdapter(localSite);
}
}
class LocalSiteWorkbenchAdapter extends LocalSite implements IWorkbenchAdapter {
private ILocalSite localSite;
public LocalSiteWorkbenchAdapter(ILocalSite localSite) {
this.localSite = localSite;
}
public Object[] getChildren(Object o) {
return null;
}
public ImageDescriptor getImageDescriptor(Object object) {
return null;
}
public String getLabel(Object o) {
return Platform.getProduct().getName();
}
public Object getParent(Object o) {
return null;
}
public void addConfiguration(IInstallConfiguration config) {
localSite.addConfiguration(config);
}
public void addLocalSiteChangedListener(ILocalSiteChangedListener listener) {
localSite.addLocalSiteChangedListener(listener);
}
public IInstallConfiguration addToPreservedConfigurations(IInstallConfiguration configuration) throws CoreException {
return localSite.addToPreservedConfigurations(configuration);
}
public IInstallConfiguration cloneCurrentConfiguration() throws CoreException {
return localSite.cloneCurrentConfiguration();
}
public IInstallConfiguration[] getConfigurationHistory() {
return localSite.getConfigurationHistory();
}
public IInstallConfiguration getCurrentConfiguration() {
return localSite.getCurrentConfiguration();
}
public IStatus getFeatureStatus(IFeature feature) throws CoreException {
return localSite.getFeatureStatus(feature);
}
public int getMaximumHistoryCount() {
return localSite.getMaximumHistoryCount();
}
public IInstallConfiguration[] getPreservedConfigurations() {
return localSite.getPreservedConfigurations();
}
public void removeFromPreservedConfigurations(IInstallConfiguration configuration) {
localSite.removeFromPreservedConfigurations(configuration);
}
public void removeLocalSiteChangedListener(ILocalSiteChangedListener listener) {
localSite.removeLocalSiteChangedListener(listener);
}
public void revertTo(IInstallConfiguration configuration, IProgressMonitor monitor, IProblemHandler handler) throws CoreException {
localSite.revertTo(configuration, monitor, handler);
}
public boolean save() throws CoreException {
return localSite.save();
}
public void setMaximumHistoryCount(int history) {
localSite.setMaximumHistoryCount(history);
}
}