blob: a944b5f949a8cd0d218201f8474c113d5a64fe4a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2012 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
* Ericsson AB (Hamdan Msheik) - Bug 396420 - Control Install dialog through preference customization
*******************************************************************************/
package org.eclipse.equinox.p2.ui;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.equinox.internal.p2.ui.ProvUI;
import org.eclipse.equinox.p2.engine.query.UserVisibleRootQuery;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.operations.ProfileChangeOperation;
import org.eclipse.equinox.p2.operations.UpdateOperation;
import org.eclipse.equinox.p2.query.IQuery;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.statushandlers.StatusManager;
/**
* The Policy class is used to specify application specific policies that
* should be used in the standard p2 UI class libraries. The default policy
* is acquired using the OSGi service model.
*
* Policy allows clients to specify things such as how repositories
* are manipulated in the standard wizards and dialogs, and how the repositories
* or the installation itself should be traversed when displaying content.
*
* In some cases, the Policy is used only to define a default value that can
* be overridden by user choice and subsequently stored in dialog settings.
*
* Client applications should ensure that their Policy is registered before
* any of the p2 UI objects access the default Policy.
*
* @since 2.0
*/
public class Policy {
/**
* A constant indicating that restart should be forced (without
* confirmation) immediately after completion of a provisioning operation.
*
*/
public static final int RESTART_POLICY_FORCE = 1;
/**
* A constant indicating that the changes should be applied dynamically
* to the profile (without confirmation) immediately after completion of
* a provisioning operation.
*/
public static final int RESTART_POLICY_FORCE_APPLY = 2;
/**
* A constant indicating that the user should be prompted to
* restart after completion of a provisioning operation.
*/
public static final int RESTART_POLICY_PROMPT = 3;
/**
* A constant indicating that, where possible, the user should
* be given the option to restart or dynamically apply the changes
* after completion of a provisioning operation.
*/
public static final int RESTART_POLICY_PROMPT_RESTART_OR_APPLY = 4;
/**
* A constant indicating that the user should be presented with an
* update wizard that shows a list of IUs that can be updated.
* Even when only one update is available, a list showing the single
* update will be used. This option is recommended when the user's view
* of the system is a set of component updates and the user is expected
* to have knowledge of the composition of the system.
*
* @since 2.1
*/
public static final int UPDATE_STYLE_MULTIPLE_IUS = 1;
/**
* A constant indicating that the user should be presented with an
* update wizard that shows detail about a single IU that can be
* updated. If more than one IU can be updated, the user will be shown
* a list; however, this option is recommended to be used only when
* the user's view of the system is a single application that can be
* updated, and only one IU is expected to be available for update.
*
* @since 2.1
*/
public static final int UPDATE_STYLE_SINGLE_IUS = 2;
private IQuery<IInstallableUnit> visibleAvailableIUQuery = QueryUtil.createIUGroupQuery();
private IQuery<IInstallableUnit> visibleInstalledIUQuery = new UserVisibleRootQuery();
private boolean groupByCategory = true;
private boolean allowDrilldown = true;
private boolean repositoriesVisible = true;
private boolean contactAllSites = true;
private boolean hideAlreadyInstalled = true;
private boolean showLatestVersionsOnly = true;
private int restartPolicy = RESTART_POLICY_PROMPT;
private String repoPrefPageId;
private String repoPrefPageName;
private boolean filterOnEnv = false;
private int updateWizardStyle = UPDATE_STYLE_MULTIPLE_IUS;
private Point wizardDetailsPreferredSize = null;
/**
* Answer a boolean indicating whether the caller should continue to work with the
* specified operation. This method is used when an operation has been resolved, but
* the UI may have further restrictions on continuing with it.
*
* @param operation the operation in question. It must already be resolved.
* @param shell the shell to use for any interaction with the user
* @return <code>true</code> if processing of the operation should continue, <code>false</code> if
* not. It is up to the implementor to report any errors to the user when answering <code>false</code>.
*/
public boolean continueWorkingWithOperation(ProfileChangeOperation operation, Shell shell) {
Assert.isTrue(operation.getResolutionResult() != null);
IStatus status = operation.getResolutionResult();
// user cancelled
if (status.getSeverity() == IStatus.CANCEL)
return false;
// Special case those statuses where we would never want to open a wizard
if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) {
ProvUI.reportStatus(status, StatusManager.BLOCK);
return false;
}
// there is no plan, so we can't continue. Report any reason found
if (operation.getProvisioningPlan() == null && !status.isOK()) {
StatusManager.getManager().handle(status, StatusManager.LOG | StatusManager.SHOW);
return false;
}
// Allow the wizard to open otherwise.
return true;
}
/**
* Return a status that can be used to describe the failure to
* retrieve a profile.
* @return a status describing a failure to retrieve a profile,
* or <code>null</code> if there is no such status.
*/
public IStatus getNoProfileChosenStatus() {
return null;
}
/**
* Return a query that can be used to obtain the IInstallableUnits that
* should be presented to the user from the software repositories.
*
* @return the query used to retrieve user visible available IUs
*/
public IQuery<IInstallableUnit> getVisibleAvailableIUQuery() {
return visibleAvailableIUQuery;
}
/**
* Set the query that can be used to obtain the IInstallableUnits that
* should be presented to the user.
*
* @param query the query used to retrieve user visible available IUs
*/
public void setVisibleAvailableIUQuery(IQuery<IInstallableUnit> query) {
visibleAvailableIUQuery = query;
}
/**
* Return a query that can be used to obtain the IInstallableUnits in
* the profile that should be presented to the user.
*
* @return the query used to retrieve user visible installed IUs
*/
public IQuery<IInstallableUnit> getVisibleInstalledIUQuery() {
return visibleInstalledIUQuery;
}
/**
* Set the query that can be used to obtain the IInstallableUnits in
* the profile that should be presented to the user.
*
* @param query the query used to retrieve user visible installed IUs
*/
public void setVisibleInstalledIUQuery(IQuery<IInstallableUnit> query) {
visibleInstalledIUQuery = query;
}
/**
* Get the restart policy that should be used when the provisioning UI
* determines that a restart is required.
*
* @return an integer constant describing the restart policy
*
* @see #RESTART_POLICY_FORCE
* @see #RESTART_POLICY_FORCE_APPLY
* @see #RESTART_POLICY_PROMPT
* @see #RESTART_POLICY_PROMPT_RESTART_OR_APPLY
*/
public int getRestartPolicy() {
return restartPolicy;
}
/**
* Set the restart policy that should be used when the provisioning UI
* determines that a restart is required.
*
* @param restartPolicy an integer constant describing the restart policy
*
* @see #RESTART_POLICY_FORCE
* @see #RESTART_POLICY_FORCE_APPLY
* @see #RESTART_POLICY_PROMPT
* @see #RESTART_POLICY_PROMPT_RESTART_OR_APPLY
*/
public void setRestartPolicy(int restartPolicy) {
this.restartPolicy = restartPolicy;
}
/**
* Return a boolean indicating whether the repositories should
* be visible to the user, such that the user can add, remove, and
* otherwise manipulate the software site list.
*
* @return <code>true</code> if repositories are visible to the end
* user, <code>false</code> if they are not.
*/
public boolean getRepositoriesVisible() {
return repositoriesVisible;
}
/**
* Set a boolean indicating whether the repositories should
* be visible to the user, such that the user can add, remove, and
* otherwise manipulate the software site list.
*
* @param visible <code>true</code> if repositories are visible to the end
* user, <code>false</code> if they are not.
*/
public void setRepositoriesVisible(boolean visible) {
this.repositoriesVisible = visible;
}
/**
* Return a boolean indicating whether only the latest versions of
* updates and available software should be shown to the user.
*
* @return <code>true</code> if only the latest versions are shown,
* <code>false</code> if all versions should be shown.
*/
public boolean getShowLatestVersionsOnly() {
return showLatestVersionsOnly;
}
/**
* Set a boolean indicating whether only the latest versions of
* updates and available software should be shown to the user.
*
* @param showLatest <code>true</code> if only the latest versions are shown,
* <code>false</code> if all versions should be shown.
*/
public void setShowLatestVersionsOnly(boolean showLatest) {
this.showLatestVersionsOnly = showLatest;
}
/**
* Return a boolean indicating whether the user should be allowed drill
* down from a visible update or installed item into the requirements.
*
* @return <code>true</code> if drilldown is allowed,
* <code>false</code> if it is not.
*/
public boolean getShowDrilldownRequirements() {
return allowDrilldown;
}
/**
* Set a boolean indicating whether the user should be allowed drill
* down from a visible update or installed item into the requirements.
*
* @param drilldown <code>true</code> if drilldown is allowed,
* <code>false</code> if it is not.
*/
public void setShowDrilldownRequirements(boolean drilldown) {
this.allowDrilldown = drilldown;
}
/**
* Return a boolean value indicating whether or not the list of available
* software should be filtered based on the environment settings of the profile.
*
* @return <code>true</code> if the results should be filtered
* and <code>false</code> otherwise.
* @since 2.1
*/
public boolean getFilterOnEnv() {
return filterOnEnv;
}
/**
* Set a boolean value indicating whether or not the list of available
* software should be filtered based on the environment settings of the profile.
*
* @param filterOnEnv <code>true</code> if the results should be filtered
* and <code>false</code> otherwise.
* @since 2.1
*/
public void setFilterOnEnv(boolean filterOnEnv) {
this.filterOnEnv = filterOnEnv;
}
/**
* Return a boolean indicating whether available software should be
* grouped by category.
*
* @return <code>true</code> if items should be grouped by category,
* <code>false</code> if categories should not be shown.
*/
public boolean getGroupByCategory() {
return groupByCategory;
}
/**
* Set a boolean indicating whether available software should be
* grouped by category.
*
* @param group <code>true</code> if items should be grouped by category,
* <code>false</code> if categories should not be shown.
*/
public void setGroupByCategory(boolean group) {
this.groupByCategory = group;
}
/**
* Get the id of the preference page that should be used to link to the
* software sites page.
*
* @return the preference page id, or <code>null</code> if there is no
* preference page id showing the software sites.
*/
public String getRepositoryPreferencePageId() {
return repoPrefPageId;
}
/**
* Set the id of the preference page that should be used to link to the
* software sites page.
*
* @param id the preference page id, or <code>null</code> if there is no
* preference page id showing the software sites.
*/
public void setRepositoryPreferencePageId(String id) {
this.repoPrefPageId = id;
}
/**
* Get the localized name of the preference page that should be displayed in
* links to the software sites page.
*
* @return the preference page name, or <code>null</code> if there is no
* preference page.
*/
public String getRepositoryPreferencePageName() {
return repoPrefPageName;
}
/**
* Set the localized name of the preference page that should be displayed in
* links to the software sites page. This name is ignored if no id is specified
* for the preference page.
*
* @param name the preference page name, or <code>null</code> if there is no
* preference page.
*
* @see Policy#setRepositoryPreferencePageId(String)
*/
public void setRepositoryPreferencePageName(String name) {
this.repoPrefPageName = name;
}
/**
* Get the update wizard style that should be used to determine
* what to show the user when updates are available.
*
* @return an integer constant describing the update wizard style
*
* @see #UPDATE_STYLE_SINGLE_IUS
* @see #UPDATE_STYLE_MULTIPLE_IUS
*
* @since 2.1
*/
public int getUpdateWizardStyle() {
return updateWizardStyle;
}
/**
* Get the update wizard style that should be used to determine
* what to show the user when updates are available.
*
* @param updateWizardStyle an integer constant describing the update wizard style
*
* @see #UPDATE_STYLE_SINGLE_IUS
* @see #UPDATE_STYLE_MULTIPLE_IUS
*
* @since 2.1
*/
public void setUpdateWizardStyle(int updateWizardStyle) {
this.updateWizardStyle = updateWizardStyle;
}
/**
* Get a point describing the preferred size of the details area
* shown in single IU update wizards. This value may be null, in which case
* the wizard may compute a default size.
*
* @return a Point describing the preferred size of the update wizard details area.
*
* @see #UPDATE_STYLE_SINGLE_IUS
*
* @since 2.1
*/
public Point getUpdateDetailsPreferredSize() {
return wizardDetailsPreferredSize;
}
/**
* Set the preferred size of the details area shown in update wizards which
* notify the user of a single update. Clients can use this value to ensure
* that their product's branded update notifier is sized to fit the expected
* content.
*
* @param preferredSize a Point describing the preferred size
*
* @see #UPDATE_STYLE_SINGLE_IUS
*
* @since 2.1
*/
public void setUpdateDetailsPreferredSize(Point preferredSize) {
this.wizardDetailsPreferredSize = preferredSize;
}
/**
* Get a boolean value indicating whether to contact all sites.
*
* @return <code>true</code> true if all sites need to be contacted,
* <code>false</code> otherwise.
*
* @since 4.3
*/
public boolean getContactAllSites() {
return this.contactAllSites;
}
/**
* Set a boolean indicating whether all sites need to be contacted.
*
* @param contactAll <code>true</code> if all sites need to be contacted,
* <code>false</code> otherwise.
*
* @since 4.3
*/
public void setContactAllSites(boolean contactAll) {
this.contactAllSites = contactAll;
}
/**
* Get a boolean value indicating whether to hide already installed units.
*
* @return <code>true</code> if already installed units are to be hidden,
* <code>false</code> otherwise.
*
* @since 4.3
*/
public boolean getHideAlreadyInstalled() {
return this.hideAlreadyInstalled;
}
/**
* Set a boolean indicating whether to hide already installed units.
*
* @param hide <code>true</code> if already installed units need to be hidden,
* <code>false</code> otherwise.
*
* @since 4.3
*/
public void setHideAlreadyInstalled(boolean hide) {
this.hideAlreadyInstalled = hide;
}
}