Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/microsoft/vs-editor-api.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/Core/Def/Features/IFeatureService.cs')
-rw-r--r--src/Core/Def/Features/IFeatureService.cs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/Core/Def/Features/IFeatureService.cs b/src/Core/Def/Features/IFeatureService.cs
new file mode 100644
index 0000000..88a8c9f
--- /dev/null
+++ b/src/Core/Def/Features/IFeatureService.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Microsoft.VisualStudio.Utilities
+{
+ /// <summary>
+ /// Service that keeps track of <see cref="IFeatureController"/>'s requests to disable a feature in given scope.
+ /// When multiple <see cref="IFeatureController"/>s disable a feature and one <see cref="IFeatureController"/>
+ /// enables it back, it will not interfere with other disable requests, and feature will ultimately remain disabled.
+ ///
+ /// While this service does have a thread affinity, its implementation does not guarantee thread safety.
+ /// It is advised to change feature state from UI thread, otherwise simultaneous changes may result in race conditions.
+ /// </summary>
+ /// <example>
+ /// // In an exported MEF part:
+ /// [Import]
+ /// IFeatureServiceFactory FeatureServiceFactory;
+ ///
+ /// IFeatureService globalService = FeatureServiceFactory.GlobalFeatureService;
+ /// IFeatureService localService = FeatureServiceFactory.GetOrCreate(scope); // scope is an IPropertyOwner
+ ///
+ /// // Also have a reference to <see cref="IFeatureController"/>:
+ /// IFeatureController MyFeatureController;
+ /// // Interact with the <see cref="IFeatureService"/>:
+ /// globalService.Disable(PredefinedEditorFeatureNames.Popup, MyFeatureController);
+ /// localService.IsEnabled(PredefinedEditorFeatureNames.Completion); // returns false, because Popup is a base definition of Completion and because global scope is a superset of local scope.
+ /// </example>
+ public interface IFeatureService
+ {
+ /// <summary>
+ /// Checks if feature is enabled. By default, every feature is enabled.
+ /// </summary>
+ /// <param name="featureName">Name of the feature</param>
+ /// <returns>False if there are any disable requests. True otherwise.</returns>
+ bool IsEnabled(string featureName);
+
+ /// <summary>
+ /// Disables a feature.
+ /// </summary>
+ /// <param name="featureName">Name of the feature to disable</param>
+ /// <param name="controller">Object that uniquely identifies the caller.</param>
+ IFeatureDisableToken Disable(string featureName, IFeatureController controller);
+
+ /// <summary>
+ /// Provides a notification when this feature or its base feature was updated.
+ /// We use FeatureUpdatedEventArgs and not FeatureChangedEventArgs
+ /// because there are base features and disable requests from parent scopes that affect the factual state of given feature.
+ /// We use this event to let the interested parties (<see cref="IFeatureCookie"/>) recalculate the actual state of the feature.
+ /// </summary>
+ event EventHandler<FeatureUpdatedEventArgs> StateUpdated;
+
+ /// <summary>
+ /// Creates a new <see cref="IFeatureCookie"/> that provides O(1) access to the feature's value, in this service's scope.
+ /// The <see cref="IFeatureCookie" /> is updated when the feature or its base is updated in this scope or in the global scope.
+ /// </summary>
+ /// <param name="featureName">Name of the feature</param>
+ /// <returns>New instance of <see cref="IFeatureCookie"/></returns>
+ IFeatureCookie GetCookie(string featureName);
+ }
+}