diff --git a/.gitignore b/.gitignore index e77200d68..3e212e902 100644 --- a/.gitignore +++ b/.gitignore @@ -332,3 +332,6 @@ ASALocalRun/ # Temp build files src/settings/settings-html/200.html src/settings/settings-html/404.html + +# Temp telemetry files. +src/common/Telemetry/*.etl \ No newline at end of file diff --git a/PowerToys.sln b/PowerToys.sln index 584abee84..e00270c90 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.28803.452 @@ -130,6 +130,24 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "action_runner", "src\action EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msi_to_msix_upgrade_lib", "src\common\msi_to_msix_upgrade_lib\msi_to_msix_upgrade_lib.vcxproj", "{17DA04DF-E393-4397-9CF0-84DABE11032E}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "previewpane", "previewpane", "{2F305555-C296-497E-AC20-5FA1B237996A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PreviewHandlerCommon", "src\modules\previewpane\Common\PreviewHandlerCommon.csproj", "{AF2349B8-E5B6-4004-9502-687C1C7730B1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarkdownPreviewHandler", "src\modules\previewpane\MarkDownPreviewHandler\MarkdownPreviewHandler.csproj", "{6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests-MarkdownPreviewHandler", "src\modules\previewpane\PreviewPaneUnitTests\UnitTests-MarkdownPreviewHandler.csproj", "{A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SvgPreviewHandler", "src\modules\previewpane\SvgPreviewHandler\SvgPreviewHandler.csproj", "{DA425894-6E13-404F-8DCB-78584EC0557A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests-SvgPreviewHandler", "src\modules\previewpane\UnitTests-SvgPreviewHandler\UnitTests-SvgPreviewHandler.csproj", "{060D75DA-2D1C-48E6-A4A1-6F0718B64661}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests-PreviewHandlerCommon", "src\modules\previewpane\UnitTests-PreviewHandlerCommon\UnitTests-PreviewHandlerCommon.csproj", "{748417CA-F17E-487F-9411-CAFB6D3F4877}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "powerpreview", "src\modules\previewpane\powerpreview\powerpreview.vcxproj", "{217DF501-135C-4E38-BFC8-99D4821032EA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "powerpreviewTest", "src\modules\previewpane\powerpreviewTest\powerpreviewTest.vcxproj", "{47310AB4-9034-4BD1-8D8B-E88AD21A171B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -228,6 +246,38 @@ Global {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|x64.Build.0 = Debug|x64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x64.ActiveCfg = Release|x64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x64.Build.0 = Release|x64 + {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|x64.ActiveCfg = Debug|x64 + {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|x64.Build.0 = Debug|x64 + {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|x64.ActiveCfg = Release|x64 + {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|x64.Build.0 = Release|x64 + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|x64.ActiveCfg = Debug|x64 + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|x64.Build.0 = Debug|x64 + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|x64.ActiveCfg = Release|x64 + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|x64.Build.0 = Release|x64 + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|x64.ActiveCfg = Debug|x64 + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|x64.Build.0 = Debug|x64 + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|x64.ActiveCfg = Release|x64 + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|x64.Build.0 = Release|x64 + {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|x64.ActiveCfg = Debug|x64 + {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|x64.Build.0 = Debug|x64 + {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|x64.ActiveCfg = Release|x64 + {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|x64.Build.0 = Release|x64 + {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|x64.ActiveCfg = Debug|x64 + {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|x64.Build.0 = Debug|x64 + {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|x64.ActiveCfg = Release|x64 + {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|x64.Build.0 = Release|x64 + {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|x64.ActiveCfg = Debug|x64 + {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|x64.Build.0 = Debug|x64 + {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|x64.ActiveCfg = Release|x64 + {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|x64.Build.0 = Release|x64 + {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|x64.ActiveCfg = Debug|x64 + {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|x64.Build.0 = Debug|x64 + {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|x64.ActiveCfg = Release|x64 + {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|x64.Build.0 = Release|x64 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Debug|x64.ActiveCfg = Debug|x64 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Debug|x64.Build.0 = Debug|x64 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Release|x64.ActiveCfg = Release|x64 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -257,6 +307,15 @@ Global {B9BDF8BE-FED7-49B5-A7AE-DD4D1CA2D9EB} = {8DC78AF7-DC3E-4C57-A8FB-7E347DE74A03} {51D3BD1F-07A8-48EB-B2A0-0A249CD4E1A6} = {8DC78AF7-DC3E-4C57-A8FB-7E347DE74A03} {17DA04DF-E393-4397-9CF0-84DABE11032E} = {1AFB6476-670D-4E80-A464-657E01DFF482} + {2F305555-C296-497E-AC20-5FA1B237996A} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} + {AF2349B8-E5B6-4004-9502-687C1C7730B1} = {2F305555-C296-497E-AC20-5FA1B237996A} + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB} = {2F305555-C296-497E-AC20-5FA1B237996A} + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A} = {2F305555-C296-497E-AC20-5FA1B237996A} + {DA425894-6E13-404F-8DCB-78584EC0557A} = {2F305555-C296-497E-AC20-5FA1B237996A} + {060D75DA-2D1C-48E6-A4A1-6F0718B64661} = {2F305555-C296-497E-AC20-5FA1B237996A} + {748417CA-F17E-487F-9411-CAFB6D3F4877} = {2F305555-C296-497E-AC20-5FA1B237996A} + {217DF501-135C-4E38-BFC8-99D4821032EA} = {2F305555-C296-497E-AC20-5FA1B237996A} + {47310AB4-9034-4BD1-8D8B-E88AD21A171B} = {2F305555-C296-497E-AC20-5FA1B237996A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0} diff --git a/doc/images/preview_pane/general-settings.png b/doc/images/preview_pane/general-settings.png new file mode 100644 index 000000000..2700015fd Binary files /dev/null and b/doc/images/preview_pane/general-settings.png differ diff --git a/doc/images/preview_pane/markdown.gif b/doc/images/preview_pane/markdown.gif new file mode 100644 index 000000000..1c0d13549 Binary files /dev/null and b/doc/images/preview_pane/markdown.gif differ diff --git a/doc/images/preview_pane/settings-ui.png b/doc/images/preview_pane/settings-ui.png new file mode 100644 index 000000000..2da9ad0bf Binary files /dev/null and b/doc/images/preview_pane/settings-ui.png differ diff --git a/installer/MSIX/PackagingLayout.xml b/installer/MSIX/PackagingLayout.xml index 9bd2e40b6..636c95201 100644 --- a/installer/MSIX/PackagingLayout.xml +++ b/installer/MSIX/PackagingLayout.xml @@ -26,6 +26,13 @@ + + + + + + + diff --git a/installer/MSIX/appxmanifest.xml b/installer/MSIX/appxmanifest.xml index eed2b6e7f..3904a45ed 100644 --- a/installer/MSIX/appxmanifest.xml +++ b/installer/MSIX/appxmanifest.xml @@ -2,9 +2,12 @@ @@ -48,6 +51,30 @@ + + + + .md + + + + + + + + .svg + + + + + + + + + + + + diff --git a/installer/MSIX/registry.dat b/installer/MSIX/registry.dat new file mode 100644 index 000000000..a84323121 Binary files /dev/null and b/installer/MSIX/registry.dat differ diff --git a/installer/MSIX/registry.reg b/installer/MSIX/registry.reg new file mode 100644 index 000000000..b8cc53e4e Binary files /dev/null and b/installer/MSIX/registry.reg differ diff --git a/installer/PowerToysSetup/Product.wxs b/installer/PowerToysSetup/Product.wxs index a4601221f..d2a91443a 100644 --- a/installer/PowerToysSetup/Product.wxs +++ b/installer/PowerToysSetup/Product.wxs @@ -277,6 +277,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -323,6 +397,8 @@ + + diff --git a/src/common/UnitTests-CommonLib/Settings.Tests.cpp b/src/common/UnitTests-CommonLib/Settings.Tests.cpp index 853b33030..1d0ef8f36 100644 --- a/src/common/UnitTests-CommonLib/Settings.Tests.cpp +++ b/src/common/UnitTests-CommonLib/Settings.Tests.cpp @@ -433,7 +433,24 @@ namespace UnitTestsCommonLib compareJsons(expected, actual); } - TEST_METHOD (SettingsAddStringMultiline) + TEST_METHOD(SettingsAddLargeHeader) + { + const auto value = L"large header sample text "; + + Settings settings(nullptr, m_moduleName); + settings.add_header_szLarge(m_defaultSettingsName, m_defaultSettingsDescription, value); + + auto expected = m_defaultSettingsJson; + auto expectedProperties = createSettingsProperties(L"header_large"); + expectedProperties.SetNamedValue(L"value", json::JsonValue::CreateStringValue(value)); + expected.GetNamedObject(L"properties").SetNamedValue(m_defaultSettingsName, expectedProperties); + + const auto actual = json::JsonObject::Parse(settings.serialize()); + + compareJsons(expected, actual); + } + + TEST_METHOD(SettingsAddStringMultiline) { const auto value = L"Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit,\nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\nUt enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident,\nsunt in culpa qui officia deserunt mollit anim id est laborum."; diff --git a/src/common/settings_objects.cpp b/src/common/settings_objects.cpp index 450532116..3bb95c1fc 100644 --- a/src/common/settings_objects.cpp +++ b/src/common/settings_objects.cpp @@ -109,6 +109,17 @@ namespace PowerToysSettings m_json.GetNamedObject(L"properties").SetNamedValue(name, ml_string); } + void Settings::add_header_szLarge(std::wstring_view name, std::wstring_view description, std::wstring_view value) + { + json::JsonObject string; + string.SetNamedValue(L"display_name", json::value(description)); + string.SetNamedValue(L"editor_type", json::value(L"header_large")); + string.SetNamedValue(L"value", json::value(value)); + string.SetNamedValue(L"order", json::value(++m_curr_priority)); + + m_json.GetNamedObject(L"properties").SetNamedValue(name, string); + } + // add_color_picker overloads. void Settings::add_color_picker(std::wstring_view name, UINT description_resource_id, std::wstring_view value) { diff --git a/src/common/settings_objects.h b/src/common/settings_objects.h index 5001daf92..5bcd26f67 100644 --- a/src/common/settings_objects.h +++ b/src/common/settings_objects.h @@ -50,6 +50,7 @@ namespace PowerToysSettings void add_custom_action(std::wstring_view name, UINT description_resource_id, UINT button_text_resource_id, std::wstring_view value); void add_custom_action(std::wstring_view name, std::wstring_view description, std::wstring_view button_text, std::wstring_view value); + void add_header_szLarge(std::wstring_view name, std::wstring_view description, std::wstring_view value); // Serialize the internal json to a string. std::wstring serialize(); // Serialize the internal json to the input buffer. diff --git a/src/modules/previewpane/MarkDownPreviewHandler/HTMLParsingExtension.cs b/src/modules/previewpane/MarkDownPreviewHandler/HTMLParsingExtension.cs new file mode 100644 index 000000000..986670353 --- /dev/null +++ b/src/modules/previewpane/MarkDownPreviewHandler/HTMLParsingExtension.cs @@ -0,0 +1,117 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.IO; +using Markdig; +using Markdig.Extensions.Figures; +using Markdig.Extensions.Tables; +using Markdig.Renderers; +using Markdig.Renderers.Html; +using Markdig.Syntax; +using Markdig.Syntax.Inlines; + +namespace MarkdownPreviewHandler +{ + /// + /// Callback if extension blocks external images. + /// + public delegate void ImagesBlockedCallBack(); + + /// + /// Markdig Extension to process html nodes in markdown AST. + /// + public class HTMLParsingExtension : IMarkdownExtension + { + /// + /// Callback if extension blocks external images. + /// + private readonly ImagesBlockedCallBack imagesBlockedCallBack; + + /// + /// Initializes a new instance of the class. + /// + /// Callback function if image is blocked by extension. + /// Absolute path of markdown file. + public HTMLParsingExtension(ImagesBlockedCallBack imagesBlockedCallBack, string baseUrl = "") + { + this.imagesBlockedCallBack = imagesBlockedCallBack; + this.BaseUrl = baseUrl; + } + + /// + /// Gets or sets path to directory containing markdown file. + /// + public string BaseUrl { get; set; } + + /// + public void Setup(MarkdownPipelineBuilder pipeline) + { + // Make sure we don't have a delegate twice + pipeline.DocumentProcessed -= this.PipelineOnDocumentProcessed; + pipeline.DocumentProcessed += this.PipelineOnDocumentProcessed; + } + + /// + public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer) + { + } + + /// + /// Process nodes in markdown AST. + /// + /// Markdown Document. + public void PipelineOnDocumentProcessed(MarkdownDocument document) + { + foreach (var node in document.Descendants()) + { + if (node is Block) + { + if (node is Table) + { + node.GetAttributes().AddClass("table table-striped table-bordered"); + } + else if (node is QuoteBlock) + { + node.GetAttributes().AddClass("blockquote"); + } + else if (node is Figure) + { + node.GetAttributes().AddClass("figure"); + } + else if (node is FigureCaption) + { + node.GetAttributes().AddClass("figure-caption"); + } + } + else if (node is Inline) + { + if (node is LinkInline link) + { + if (link.IsImage) + { + link.GetAttributes().AddClass("img-fluid"); + } + + if (!Uri.TryCreate(link.Url, UriKind.Absolute, out _)) + { + link.Url = link.Url.TrimStart('/', '\\'); + this.BaseUrl = this.BaseUrl.TrimEnd('/', '\\'); + Uri uriLink = new Uri(Path.Combine(this.BaseUrl, link.Url)); + link.Url = uriLink.ToString(); + } + else + { + if (link.IsImage) + { + link.Url = "#"; + this.imagesBlockedCallBack(); + } + } + } + } + } + } + } +} diff --git a/src/modules/previewpane/MarkDownPreviewHandler/MarkDownPreviewHandler.csproj b/src/modules/previewpane/MarkDownPreviewHandler/MarkDownPreviewHandler.csproj new file mode 100644 index 000000000..b98ab4139 --- /dev/null +++ b/src/modules/previewpane/MarkDownPreviewHandler/MarkDownPreviewHandler.csproj @@ -0,0 +1,141 @@ + + + + + + + MarkdownPreviewHandler + Microsoft Corp. + Copyright (C) 2019 Microsoft Corp. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug + AnyCPU + {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB} + Library + Properties + MarkdownPreviewHandler + MarkdownPreviewHandler + v4.7.2 + 512 + true + + + + true + full + false + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + DEBUG;TRACE + prompt + 4 + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\MarkdownPreviewPaneDocumentation.xml + x64 + + + pdbonly + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + TRACE + prompt + 4 + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\MarkdownPreviewPaneDocumentation.xml + x64 + + + false + + + + + + + + + + + + + + + + + + + + + + Form + + + Code + + + + True + True + Resources.resx + + + + + 1.8.10 + + + 0.18.0 + + + 1.1.118 + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + StyleCop.json + + + + + {af2349b8-e5b6-4004-9502-687c1c7730b1} + PreviewHandlerCommon + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + \ No newline at end of file diff --git a/src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandler.cs b/src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandler.cs new file mode 100644 index 000000000..be0b9ac73 --- /dev/null +++ b/src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandler.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices; +using Common; + +namespace MarkdownPreviewHandler +{ + /// + /// Implementation of preview handler for markdown files. + /// + [Guid("45769bcc-e8fd-42d0-947e-02beef77a1f5")] + [ClassInterface(ClassInterfaceType.None)] + [ComVisible(true)] + public class MarkdownPreviewHandler : FileBasedPreviewHandler + { + private MarkdownPreviewHandlerControl markdownPreviewHandlerControl; + + /// + public override void DoPreview() + { + this.markdownPreviewHandlerControl.DoPreview(this.FilePath); + } + + /// + protected override IPreviewHandlerControl CreatePreviewHandlerControl() + { + this.markdownPreviewHandlerControl = new MarkdownPreviewHandlerControl(); + return this.markdownPreviewHandlerControl; + } + } +} diff --git a/src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs b/src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs new file mode 100644 index 000000000..4e77c8338 --- /dev/null +++ b/src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs @@ -0,0 +1,179 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Common; +using Markdig; +using MarkdownPreviewHandler.Properties; +using PreviewHandlerCommon; + +namespace MarkdownPreviewHandler +{ + /// + /// Win Form Implementation for Markdown Preview Handler. + /// + public class MarkdownPreviewHandlerControl : FormHandlerControl + { + /// + /// Extension to modify markdown AST. + /// + private readonly HTMLParsingExtension extension; + + /// + /// Markdig Pipeline builder. + /// + private readonly MarkdownPipelineBuilder pipelineBuilder; + + /// + /// Markdown HTML header. + /// + private readonly string htmlHeader = "
"; + + /// + /// Markdown HTML footer. + /// + private readonly string htmlFooter = "
"; + + /// + /// RichTextBox control to display if external images are blocked. + /// + private RichTextBox infoBar; + + /// + /// Extended Browser Control to display markdown html. + /// + private WebBrowserExt browser; + + /// + /// True if external image is blocked, false otherwise. + /// + private bool infoBarDisplayed = false; + + /// + /// Initializes a new instance of the class. + /// + public MarkdownPreviewHandlerControl() + { + this.extension = new HTMLParsingExtension(this.ImagesBlockedCallBack); + this.pipelineBuilder = new MarkdownPipelineBuilder().UseAdvancedExtensions().UseEmojiAndSmiley(); + this.pipelineBuilder.Extensions.Add(this.extension); + } + + /// + /// Start the preview on the Control. + /// + /// Path to the file. + public override void DoPreview(T dataSource) + { + this.InvokeOnControlThread(() => + { + try + { + this.infoBarDisplayed = false; + + StringBuilder sb = new StringBuilder(); + string filePath = dataSource as string; + string fileText = File.ReadAllText(filePath); + this.extension.BaseUrl = Path.GetDirectoryName(filePath); + + MarkdownPipeline pipeline = this.pipelineBuilder.Build(); + string parsedMarkdown = Markdown.ToHtml(fileText, pipeline); + sb.AppendFormat("{0}{1}{2}", this.htmlHeader, parsedMarkdown, this.htmlFooter); + string markdownHTML = sb.ToString(); + + this.browser = new WebBrowserExt + { + DocumentText = markdownHTML, + Dock = DockStyle.Fill, + IsWebBrowserContextMenuEnabled = false, + ScriptErrorsSuppressed = true, + ScrollBarsEnabled = true, + AllowNavigation = false, + }; + this.Controls.Add(this.browser); + + if (this.infoBarDisplayed) + { + this.infoBar = this.GetTextBoxControl(Resources.BlockedImageInfoText); + this.Controls.Add(this.infoBar); + } + + this.Resize += this.FormResized; + base.DoPreview(dataSource); + MarkdownTelemetry.Log.MarkdownFilePreviewed(); + } + catch (Exception e) + { + MarkdownTelemetry.Log.MarkdownFilePreviewError(e.Message); + this.infoBarDisplayed = true; + this.infoBar = this.GetTextBoxControl(Resources.MarkdownNotPreviewedError); + this.Resize += this.FormResized; + this.Controls.Clear(); + this.Controls.Add(this.infoBar); + base.DoPreview(dataSource); + } + }); + } + + /// + /// Gets a textbox control. + /// + /// Message to be displayed in textbox. + /// An object of type . + private RichTextBox GetTextBoxControl(string message) + { + RichTextBox richTextBox = new RichTextBox + { + Text = message, + BackColor = Color.LightYellow, + Multiline = true, + Dock = DockStyle.Top, + ReadOnly = true, + }; + richTextBox.ContentsResized += this.RTBContentsResized; + richTextBox.ScrollBars = RichTextBoxScrollBars.None; + richTextBox.BorderStyle = BorderStyle.None; + + return richTextBox; + } + + /// + /// Callback when RichTextBox is resized. + /// + /// Reference to resized control. + /// Provides data for the resize event. + private void RTBContentsResized(object sender, ContentsResizedEventArgs e) + { + RichTextBox richTextBox = (RichTextBox)sender; + richTextBox.Height = e.NewRectangle.Height + 5; + } + + /// + /// Callback when form is resized. + /// + /// Reference to resized control. + /// Provides data for the event. + private void FormResized(object sender, EventArgs e) + { + if (this.infoBarDisplayed) + { + this.infoBar.Width = this.Width; + } + } + + /// + /// Callback when image is blocked by extension. + /// + private void ImagesBlockedCallBack() + { + this.infoBarDisplayed = true; + } + } +} diff --git a/src/modules/previewpane/MarkdownPreviewHandler/MarkdownTelemetry.cs b/src/modules/previewpane/MarkdownPreviewHandler/MarkdownTelemetry.cs new file mode 100644 index 000000000..07bf17cd2 --- /dev/null +++ b/src/modules/previewpane/MarkdownPreviewHandler/MarkdownTelemetry.cs @@ -0,0 +1,71 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Diagnostics.Tracing; +using PreviewHandlerCommon.Telemetry; + +namespace MarkdownPreviewHandler +{ + /// + /// Telemetry helper class for markdown renderer. + /// + public class MarkdownTelemetry : TelemetryBase + { + /// + /// Name for ETW event. + /// + private const string EventSourceName = "Microsoft.PowerToys"; + + /// + /// ETW event name when markdown is previewed. + /// + private const string MarkdownFilePreviewedEventName = "PowerPreview_MDRenderer_Previewed"; + + /// + /// ETW event name when error is thrown during markdown preview. + /// + private const string MarkdownFilePreviewErrorEventName = "PowerPreview_MDRenderer_Error"; + + /// + /// Initializes a new instance of the class. + /// + public MarkdownTelemetry() + : base(EventSourceName) + { + return; + } + + /// + /// Gets an instance of the class. + /// + public static MarkdownTelemetry Log { get; } = new MarkdownTelemetry(); + + /// + /// Publishes ETW event when markdown is previewed successfully. + /// + public void MarkdownFilePreviewed() + { + this.Write(MarkdownFilePreviewedEventName, new EventSourceOptions() + { + Keywords = ProjectKeywordMeasure, + Tags = ProjectTelemetryTagProductAndServicePerformance, + }); + } + + /// + /// Publishes ETW event when markdown could not be previewed. + /// + public void MarkdownFilePreviewError(string message) + { + this.Write( + MarkdownFilePreviewErrorEventName, + new EventSourceOptions() + { + Keywords = ProjectKeywordMeasure, + Tags = ProjectTelemetryTagProductAndServicePerformance, + }, + new { Message = message, }); + } + } +} diff --git a/src/modules/previewpane/MarkdownPreviewHandler/Properties/Resources.Designer.cs b/src/modules/previewpane/MarkdownPreviewHandler/Properties/Resources.Designer.cs new file mode 100644 index 000000000..ea7599efd --- /dev/null +++ b/src/modules/previewpane/MarkdownPreviewHandler/Properties/Resources.Designer.cs @@ -0,0 +1,81 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MarkdownPreviewHandler.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MarkdownPreviewHandler.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Some pictures have been blocked to help prevent the sender from identifying this computer. Open this item to view pictures.. + /// + internal static string BlockedImageInfoText { + get { + return ResourceManager.GetString("BlockedImageInfoText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The markdown could not be preview due to an internal error.. + /// + internal static string MarkdownNotPreviewedError { + get { + return ResourceManager.GetString("MarkdownNotPreviewedError", resourceCulture); + } + } + } +} diff --git a/src/modules/previewpane/MarkdownPreviewHandler/Properties/Resources.resx b/src/modules/previewpane/MarkdownPreviewHandler/Properties/Resources.resx new file mode 100644 index 000000000..9beb635bd --- /dev/null +++ b/src/modules/previewpane/MarkdownPreviewHandler/Properties/Resources.resx @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Some pictures have been blocked to help prevent the sender from identifying this computer. Open this item to view pictures. + This text is displayed if image is blocked from being displayed. + + + The markdown could not be preview due to an internal error. + This text is displayed if markdown fails to preview + + \ No newline at end of file diff --git a/src/modules/previewpane/PreviewPaneUnitTests/HTMLParsingExtensionTest.cs b/src/modules/previewpane/PreviewPaneUnitTests/HTMLParsingExtensionTest.cs new file mode 100644 index 000000000..5967b2753 --- /dev/null +++ b/src/modules/previewpane/PreviewPaneUnitTests/HTMLParsingExtensionTest.cs @@ -0,0 +1,128 @@ +using System; +using Markdig; +using MarkdownPreviewHandler; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace PreviewPaneUnitTests +{ + [TestClass] + public class HTMLParsingExtensionTest + { + private MarkdownPipeline BuidPipeline(IMarkdownExtension extension) + { + MarkdownPipelineBuilder pipelineBuilder = new MarkdownPipelineBuilder().UseAdvancedExtensions(); + pipelineBuilder.Extensions.Add(extension); + return pipelineBuilder.Build(); + } + + [TestMethod] + public void Extension_UpdatesTablesClass_WhenUsed() + { + // Arrange + String mdString = "| A | B |\n| -- | -- | "; + HTMLParsingExtension htmlParsingExtension = new HTMLParsingExtension(() => { }); + MarkdownPipeline markdownPipeline = BuidPipeline(htmlParsingExtension); + + // Act + String html = Markdown.ToHtml(mdString, markdownPipeline); + + // Assert + Assert.AreEqual(html, "\n\n\n\n\n\n\n
AB
\n"); + } + + + [TestMethod] + public void Extension_UpdatesBlockQuotesClass_WhenUsed() + { + // Arrange + String mdString = "> Blockquotes."; + HTMLParsingExtension htmlParsingExtension = new HTMLParsingExtension(()=> { }); + MarkdownPipeline markdownPipeline = BuidPipeline(htmlParsingExtension); + + // Act + String html = Markdown.ToHtml(mdString, markdownPipeline); + + // Assert + Assert.AreEqual(html, "
\n

Blockquotes.

\n
\n"); + } + + [TestMethod] + public void Extension_UpdatesFigureClassAndRelativeUrltoAbsolute_WhenUsed() + { + // arrange + String mdString = "![text](a.jpg \"Figure\")"; + HTMLParsingExtension htmlParsingExtension = new HTMLParsingExtension(() => { }, "C:\\Users\\"); + MarkdownPipeline markdownPipeline = BuidPipeline(htmlParsingExtension); + + // Act + String html = Markdown.ToHtml(mdString, markdownPipeline); + + // Assert + Assert.AreEqual(html, "

\"text\"

\n"); + } + + [TestMethod] + public void Extension_CreatesCorrectAbsoluteLinkByTrimmingForwardSlash_WhenUsed() + { + // arrange + String mdString = "![text](\\document\\a.jpg \"Figure\")"; + HTMLParsingExtension htmlParsingExtension = new HTMLParsingExtension(() => { }, "C:\\Users\\"); + MarkdownPipeline markdownPipeline = BuidPipeline(htmlParsingExtension); + + // Act + String html = Markdown.ToHtml(mdString, markdownPipeline); + + // Assert + Assert.AreEqual(html, "

\"text\"

\n"); + } + + [TestMethod] + public void Extension_CreatesCorrectAbsoluteLinkByTrimmingBackwardSlash_WhenUsed() + { + // arrange + String mdString = "![text](/document/a.jpg \"Figure\")"; + HTMLParsingExtension htmlParsingExtension = new HTMLParsingExtension(() => { }, "C:/Users/"); + MarkdownPipeline markdownPipeline = BuidPipeline(htmlParsingExtension); + + // Act + String html = Markdown.ToHtml(mdString, markdownPipeline); + + // Assert + Assert.AreEqual(html, "

\"text\"

\n"); + } + + [TestMethod] + public void Extension_AddsClassToFigureCaption_WhenUsed() + { + // arrange + String mdString = "^^^ This is a caption"; + HTMLParsingExtension htmlParsingExtension = new HTMLParsingExtension(() => { }, "C:/Users/"); + MarkdownPipeline markdownPipeline = BuidPipeline(htmlParsingExtension); + + // Act + String html = Markdown.ToHtml(mdString, markdownPipeline); + + // Assert + Assert.AreEqual(html, "
\n
This is a caption
\n
\n"); + } + + [TestMethod] + public void Extension_RemovesExternalImageUrlAndMakeCallback_WhenUsed() + { + // arrange + int count = 0; + String mdString = "![text](http://dev.nodeca.com \"Figure\")"; + HTMLParsingExtension htmlParsingExtension = new HTMLParsingExtension(() => { count++; }); + MarkdownPipeline markdownPipeline = BuidPipeline(htmlParsingExtension); + + // Act + String html = Markdown.ToHtml(mdString, markdownPipeline); + + // Assert + Assert.AreEqual(count, 1); + Assert.AreEqual(html, "

\"text\"

\n"); + + } + + } +} diff --git a/src/modules/previewpane/PreviewPaneUnitTests/HelperFiles/MarkdownWithExternalImage.txt b/src/modules/previewpane/PreviewPaneUnitTests/HelperFiles/MarkdownWithExternalImage.txt new file mode 100644 index 000000000..1439071e7 --- /dev/null +++ b/src/modules/previewpane/PreviewPaneUnitTests/HelperFiles/MarkdownWithExternalImage.txt @@ -0,0 +1,2 @@ +![Minion](https://octodex.github.com/images/minion.png) + \ No newline at end of file diff --git a/src/modules/previewpane/PreviewPaneUnitTests/HelperFiles/MarkdownWithscript.txt b/src/modules/previewpane/PreviewPaneUnitTests/HelperFiles/MarkdownWithscript.txt new file mode 100644 index 000000000..d2311571c --- /dev/null +++ b/src/modules/previewpane/PreviewPaneUnitTests/HelperFiles/MarkdownWithscript.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/modules/previewpane/PreviewPaneUnitTests/MarkdownPreviewHandlerTest.cs b/src/modules/previewpane/PreviewPaneUnitTests/MarkdownPreviewHandlerTest.cs new file mode 100644 index 000000000..84c3196af --- /dev/null +++ b/src/modules/previewpane/PreviewPaneUnitTests/MarkdownPreviewHandlerTest.cs @@ -0,0 +1,96 @@ +using System; +using System.Drawing; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Forms; +using System.Xml.Linq; +using Markdig; +using MarkdownPreviewHandler; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using PreviewHandlerCommon; + +namespace PreviewPaneUnitTests +{ + [TestClass] + public class MarkdownPreviewHandlerTest + { + [TestMethod] + public void MarkdownPreviewHandlerControl__AddsBrowserToForm_WhenDoPreviewIsCalled() + { + // Arrange + MarkdownPreviewHandlerControl markdownPreviewHandlerControl = new MarkdownPreviewHandlerControl(); + + // Act + markdownPreviewHandlerControl.DoPreview("HelperFiles/MarkdownWithExternalImage.txt"); + + // Assert + Assert.AreEqual(markdownPreviewHandlerControl.Controls.Count, 2); + Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[0], typeof(WebBrowserExt)); + } + + [TestMethod] + public void MarkdownPreviewHandlerControl__AddsInfoBarToFormIfExternalImageLinkPresent_WhenDoPreviewIsCalled() + { + // Arrange + MarkdownPreviewHandlerControl markdownPreviewHandlerControl = new MarkdownPreviewHandlerControl(); + + // Act + markdownPreviewHandlerControl.DoPreview("HelperFiles/MarkdownWithExternalImage.txt"); + + // Assert + Assert.AreEqual(markdownPreviewHandlerControl.Controls.Count, 2); + Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[1], typeof(RichTextBox)); + } + + [TestMethod] + public void MarkdownPreviewHandlerControl__DoesNotAddInfoBarToFormIfExternalImageLinkNotPresent_WhenDoPreviewIsCalled() + { + // Arrange + MarkdownPreviewHandlerControl markdownPreviewHandlerControl = new MarkdownPreviewHandlerControl(); + + // Act + markdownPreviewHandlerControl.DoPreview("HelperFiles/MarkdownWithScript.txt"); + + // Assert + Assert.AreEqual(markdownPreviewHandlerControl.Controls.Count, 1); + Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[0], typeof(WebBrowserExt)); + } + + [TestMethod] + public void MarkdownPreviewHandlerControl__UpdatesWebBrowserSettings_WhenDoPreviewIsCalled() + { + // Arrange + MarkdownPreviewHandlerControl markdownPreviewHandlerControl = new MarkdownPreviewHandlerControl(); + + // Act + markdownPreviewHandlerControl.DoPreview("HelperFiles/MarkdownWithExternalImage.txt"); + + // Assert + Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[0], typeof(WebBrowserExt)); + Assert.IsNotNull(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).DocumentText); + Assert.AreEqual(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).Dock, DockStyle.Fill); + Assert.AreEqual(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).IsWebBrowserContextMenuEnabled, false); + Assert.AreEqual(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).ScriptErrorsSuppressed, true); + Assert.AreEqual(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).ScrollBarsEnabled, true); + Assert.AreEqual(((WebBrowser)markdownPreviewHandlerControl.Controls[0]).AllowNavigation, false); + } + + [TestMethod] + public void MarkdownPreviewHandlerControl__UpdateInfobarSettings_WhenDoPreviewIsCalled() + { + // Arrange + MarkdownPreviewHandlerControl markdownPreviewHandlerControl = new MarkdownPreviewHandlerControl(); + + // Act + markdownPreviewHandlerControl.DoPreview("HelperFiles/MarkdownWithExternalImage.txt"); + + // Assert + Assert.IsInstanceOfType(markdownPreviewHandlerControl.Controls[1], typeof(RichTextBox)); + Assert.IsNotNull(((RichTextBox)markdownPreviewHandlerControl.Controls[1]).Text); + Assert.AreEqual(((RichTextBox)markdownPreviewHandlerControl.Controls[1]).Dock, DockStyle.Top); + Assert.AreEqual(((RichTextBox)markdownPreviewHandlerControl.Controls[1]).BorderStyle, BorderStyle.None); + Assert.AreEqual(((RichTextBox)markdownPreviewHandlerControl.Controls[1]).BackColor, Color.LightYellow); + Assert.AreEqual(((RichTextBox)markdownPreviewHandlerControl.Controls[1]).Multiline, true); + } + } +} \ No newline at end of file diff --git a/src/modules/previewpane/PreviewPaneUnitTests/UnitTests-MarkdownPreviewHandler.csproj b/src/modules/previewpane/PreviewPaneUnitTests/UnitTests-MarkdownPreviewHandler.csproj new file mode 100644 index 000000000..b346770da --- /dev/null +++ b/src/modules/previewpane/PreviewPaneUnitTests/UnitTests-MarkdownPreviewHandler.csproj @@ -0,0 +1,124 @@ + + + + + + + PreviewPaneUnitTests + Microsoft Corp. + Copyright (C) 2019 Microsoft Corp. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug + AnyCPU + {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A} + Library + Properties + PreviewPaneUnitTests + PreviewPaneUnitTests + v4.7.2 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + + true + full + false + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + DEBUG;TRACE + prompt + 4 + x64 + + + pdbonly + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + TRACE + prompt + 4 + x64 + + + + + + + + + + + Code + + + + + + + 0.18.0 + + + 1.3.2 + + + 1.3.2 + + + + + {AF2349B8-E5B6-4004-9502-687C1C7730B1} + PreviewHandlerCommon + + + {6a71162e-fc4c-4a2c-b90f-3cf94f59a9bb} + MarkdownPreviewHandler + + + + + + Always + + + Always + + + + + \ No newline at end of file diff --git a/src/modules/previewpane/README.md b/src/modules/previewpane/README.md new file mode 100644 index 000000000..418204ebf --- /dev/null +++ b/src/modules/previewpane/README.md @@ -0,0 +1,174 @@ +
+ + + +# PowerPreview +> Adding Custom Preview Handlers to Windows File Explorer Preview Pane. + +[**Overview**](#overview) · +[**Developing**](#Developing) · +[**MSIX Integration**](#Install-With-MSIX) · +[**Contributing »**](#Contributing) +
+ +## Overview + +Preview handlers are called when an item is selected to show a lightweight, rich, read-only preview of the file's contents in the view's reading pane. This is done without launching the file's associated application. Figure 1 shows an example of a preview handler that preview a .md file type. Please follow this [documentation](https://docs.microsoft.com/en-us/archive/msdn-magazine/2007/january/windows-vista-and-office-writing-your-own-preview-handlers) to start developing a preview handler, when done, continue with this documentation to learn how to integrate a preview handler into PowerToys. + +
+ +
+ Mark Down Preview Handler Demo +
Figure 1 : Mark Down Preview Handler Demo
+
+ +
+ +## Developing + +We have already done most of the development work in the [PreviewHandlerCommon](./common/cominterop/IPreviewHandler.cs) common project. To add a preview for the file type of .xyz: + +- Add a new .NET project in the preview pane folder. +- Add a reference to the `PreviewHandlerCommon` common project. +- Create your preview handler class and extend the FileBasedPreviewHandler class. See an example below: + +```csharp +using System; +using System.Runtime.InteropServices; +using Common; + +namespace XYZPreviewHandler +{ + /// + /// Implementation of preview handler for .xyz files. + /// GUID = CLSID / CLASS ID. + /// + [Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx")] + [ClassInterface(ClassInterfaceType.None)] + [ComVisible(true)] + public class XYZPreviewHandler : FileBasedPreviewHandler + { + private XYZPreviewHandlerControl xyzPreviewHandlerControl; + + /// Call your rendering method here. + public override void DoPreview() + { + this.xyzPreviewHandlerControl.DoPreview(this.FilePath); + } + + protected override IPreviewHandlerControl CreatePreviewHandlerControl() + { + this.xyzPreviewHandlerControl = new xyzPreviewHandlerControl(); + return this.xyzPreviewHandlerControl; + } + } +} +``` + +Create a separate Preview Handler Control class and extend the `FormHandlerControl` Class. + +```csharp +using Common; + +namespace XYZPreviewHandler +{ + public class XYZPreviewHandlerControl : FormHandlerControl + { + public XYZPreviewHandlerControl() + { + // ... do your initializations here. + } + + public override void DoPreview(T dataSource) + { + // ... add your preview rendering code here. + } + } +} +``` + + +#### Integrate the Preview Handler into PowerToys Settings: + +Navigate to the [powerpreview](../previewpane/powerpreview/powerpreview.h) project and edit the `powerpreview.h` file. Add the following Settings Object instance to `m_previewHandlers` settings objects array in the constructor initialization: + +```cpp +// XYZ Preview Handler Settings Object. +FileExplorerPreviewSettings( + false, + L"<--YOUR_TOGGLE_CONTROL_ID-->", + L"<--A description of your preview handler-->", + L"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx", // your preview handler CLSID. + L"<--A display name for your preview handler-->") +``` + +## Install With MSIX + +<---To Do---> +```xml + +``` + +## Managing Preview Handlers + +After successful integration, your preview handler should appear in the PowerToys settings UI under the `File Explorer Preview` Tab as shown in Figure 2 below. In here you should be able to enable and disable your preview handler. + +
+ +
+ Settings UI - File Explorer Preview Tab +
Figure 2 : Settings UI - File Explorer Preview Tab
+
+ +
+ +In the general settings of the Settings UI, you should be able to disable and enable all the preview handlers all at once. See Figure 3. + +
+ +
+ Settings UI - General Settings Tab +
Figure 3 : Settings UI - General Settings Tab
+
+ +
+ +## Contributing + +### Coding Guidance + +#### Working With Strings + +**YOU SHOULD NOT** have hardcoded strings in your C++ code. Instead, use the following guidelines to add strings to your code. Add the ID of your string to the resource file. XXX must be a unique int in the list (mostly the int ID of the last string id plus one): + +- `resource.h`: + +```cpp +#define IDS_PREVPANE_XYZ_SETTINGS_DISPLAYNAME XXX +``` + +- `powerpreview.rc` under strings table: + +```cpp +IDS_PREVPANE_XYZ_SETTINGS_DISPLAYNAME L"XYZ Preview Handler" +``` + +- Use the `GET_RESOURCE_STRING(UINT resource_id)` method to consume strings in your code. +```cpp +#include + +extern "C" IMAGE_DOS_HEADER __ImageBase; + +std::wstring GET_RESOURCE_STRING(IDS_PREVPANE_XYZ_SETTINGS_DISPLAYNAME) +``` + +#### More On Coding Guidance +Please review these brief docs below relating to our coding standards etc. + +> 👉 If you find something missing from these docs, feel free to contribute to any of our documentation files anywhere in the repository (or make some new ones\!) + + + +* [Coding Style](../../../doc/devdocs/style.md) +* [Code Organization](../../../doc/devdocs/readme.md) + diff --git a/src/modules/previewpane/SvgPreviewHandler/Resource.Designer.cs b/src/modules/previewpane/SvgPreviewHandler/Resource.Designer.cs new file mode 100644 index 000000000..5ab162c03 --- /dev/null +++ b/src/modules/previewpane/SvgPreviewHandler/Resource.Designer.cs @@ -0,0 +1,81 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace SvgPreviewHandler { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resource { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resource() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SvgPreviewHandler.Resource", typeof(Resource).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Some elements have been blocked to help prevent the sender from identifying your computer. Open this item to view all elements.. + /// + internal static string BlockedElementInfoText { + get { + return ResourceManager.GetString("BlockedElementInfoText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The Svg could not be preview due to an internal error in Svg Preview Handler.. + /// + internal static string SvgNotPreviewedError { + get { + return ResourceManager.GetString("SvgNotPreviewedError", resourceCulture); + } + } + } +} diff --git a/src/modules/previewpane/SvgPreviewHandler/Resource.resx b/src/modules/previewpane/SvgPreviewHandler/Resource.resx new file mode 100644 index 000000000..e8d5827f1 --- /dev/null +++ b/src/modules/previewpane/SvgPreviewHandler/Resource.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Some elements have been blocked to help prevent the sender from identifying your computer. Open this item to view all elements. + + + The Svg could not be preview due to an internal error in Svg Preview Handler. + + \ No newline at end of file diff --git a/src/modules/previewpane/SvgPreviewHandler/SvgPreviewControl.cs b/src/modules/previewpane/SvgPreviewHandler/SvgPreviewControl.cs new file mode 100644 index 000000000..6ce5f4808 --- /dev/null +++ b/src/modules/previewpane/SvgPreviewHandler/SvgPreviewControl.cs @@ -0,0 +1,135 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices.ComTypes; +using System.Runtime.Versioning; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Linq; +using Common; +using Common.Utilities; +using PreviewHandlerCommon; + +namespace SvgPreviewHandler +{ + /// + /// Implementation of Control for Svg Preview Handler. + /// + public class SvgPreviewControl : FormHandlerControl + { + /// + /// Extended Browser Control to display Svg. + /// + private WebBrowserExt browser; + + /// + /// Text box to display the information about blocked elements from Svg. + /// + private RichTextBox textBox; + + /// + /// Represent if an text box info bar is added for showing message. + /// + private bool infoBarAdded = false; + + /// + /// Start the preview on the Control. + /// + /// Stream reference to access source file. + public override void DoPreview(T dataSource) + { + this.InvokeOnControlThread(() => + { + try + { + this.infoBarAdded = false; + string svgData = null; + using (var stream = new StreamWrapper(dataSource as IStream)) + { + using (var reader = new StreamReader(stream)) + { + svgData = reader.ReadToEnd(); + } + } + + this.AddBrowserControl(svgData); + this.Resize += this.FormResized; + base.DoPreview(dataSource); + SvgTelemetry.Log.SvgFilePreviewed(); + } + catch (Exception ex) + { + SvgTelemetry.Log.SvgFilePreviewError(ex.Message); + this.Controls.Clear(); + this.infoBarAdded = true; + this.AddTextBoxControl(Resource.SvgNotPreviewedError); + base.DoPreview(dataSource); + } + }); + } + + /// + /// Occurs when RichtextBox is resized. + /// + /// Reference to resized control. + /// Provides data for the ContentsResized event. + private void RTBContentsResized(object sender, ContentsResizedEventArgs e) + { + var richTextBox = sender as RichTextBox; + richTextBox.Height = e.NewRectangle.Height + 5; + } + + /// + /// Occurs when form is resized. + /// + /// Reference to resized control. + /// Provides data for the resize event. + private void FormResized(object sender, EventArgs e) + { + if (this.infoBarAdded) + { + this.textBox.Width = this.Width; + } + } + + /// + /// Adds a Web Browser Control to Control Collection. + /// + /// Svg to display on Browser Control. + private void AddBrowserControl(string svgData) + { + this.browser = new WebBrowserExt(); + this.browser.DocumentText = svgData; + this.browser.Dock = DockStyle.Fill; + this.browser.IsWebBrowserContextMenuEnabled = false; + this.browser.ScriptErrorsSuppressed = true; + this.browser.ScrollBarsEnabled = true; + this.browser.AllowNavigation = false; + this.Controls.Add(this.browser); + } + + /// + /// Adds a Text Box in Controls for showing information about blocked elements. + /// + /// Message to be displayed in textbox. + private void AddTextBoxControl(string message) + { + this.textBox = new RichTextBox(); + this.textBox.Text = message; + this.textBox.BackColor = Color.LightYellow; + this.textBox.Multiline = true; + this.textBox.Dock = DockStyle.Top; + this.textBox.ReadOnly = true; + this.textBox.ContentsResized += this.RTBContentsResized; + this.textBox.ScrollBars = RichTextBoxScrollBars.None; + this.textBox.BorderStyle = BorderStyle.None; + this.Controls.Add(this.textBox); + } + } +} diff --git a/src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.cs b/src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.cs new file mode 100644 index 000000000..9e3b09046 --- /dev/null +++ b/src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices; +using Common; + +namespace SvgPreviewHandler +{ + /// + /// Extends for Svg Preview Handler. + /// + [Guid("ddee2b8a-6807-48a6-bb20-2338174ff779")] + [ClassInterface(ClassInterfaceType.None)] + [ComVisible(true)] + public class SvgPreviewHandler : StreamBasedPreviewHandler + { + private SvgPreviewControl svgPreviewControl; + + /// + public override void DoPreview() + { + this.svgPreviewControl.DoPreview(this.Stream); + } + + /// + protected override IPreviewHandlerControl CreatePreviewHandlerControl() + { + this.svgPreviewControl = new SvgPreviewControl(); + return this.svgPreviewControl; + } + } +} diff --git a/src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj b/src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj new file mode 100644 index 000000000..c16521b80 --- /dev/null +++ b/src/modules/previewpane/SvgPreviewHandler/SvgPreviewHandler.csproj @@ -0,0 +1,136 @@ + + + + + + + SvgPreviewHandler + Microsoft Corp. + Copyright (C) 2019 Microsoft Corp. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug + AnyCPU + {DA425894-6E13-404F-8DCB-78584EC0557A} + Library + Properties + SvgPreviewHandler + SvgPreviewHandler + v4.7.2 + 512 + true + + + + false + + + + + + + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + DEBUG;TRACE + $(SolutionDir)$(Platform)\$(Configuration)\modules\SvgPreviewHandler.xml + 2 + true + full + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + TRACE + $(SolutionDir)$(Platform)\$(Configuration)\modules\SvgPreviewHandler.xml + true + true + pdbonly + x64 + 7.3 + prompt + MinimumRecommendedRules.ruleset + + + + + + + + + + + + + + + + Code + + + True + True + Resource.resx + + + Form + + + + + + + {af2349b8-e5b6-4004-9502-687c1c7730b1} + PreviewHandlerCommon + + + + + StyleCop.json + + + + + 1.1.118 + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + ResXFileCodeGenerator + Resource.Designer.cs + + + + \ No newline at end of file diff --git a/src/modules/previewpane/SvgPreviewHandler/SvgTelemetry.cs b/src/modules/previewpane/SvgPreviewHandler/SvgTelemetry.cs new file mode 100644 index 000000000..044077bab --- /dev/null +++ b/src/modules/previewpane/SvgPreviewHandler/SvgTelemetry.cs @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Diagnostics.Tracing; +using PreviewHandlerCommon.Telemetry; + +namespace SvgPreviewHandler +{ + /// + /// Telemetry helper class for Svg renderer. + /// + public class SvgTelemetry : TelemetryBase + { + /// + /// Name for ETW event. + /// + private const string EventSourceName = "Microsoft.PowerToys"; + + /// + /// ETW event name when Svg is previewed. + /// + private const string SvgFilePreviewedEventName = "PowerPreview_SVGRenderer_Previewed"; + + /// + /// ETW event name when error is thrown during Svg preview. + /// + private const string SvgFilePreviewErrorEventName = "PowerPreview_SVGRenderer_Error"; + + /// + /// Initializes a new instance of the class. + /// + public SvgTelemetry() + : base(EventSourceName) + { + } + + /// + /// Gets an instance of the class. + /// + public static SvgTelemetry Log { get; } = new SvgTelemetry(); + + /// + /// Publishes ETW event when svg is previewed successfully. + /// + public void SvgFilePreviewed() + { + this.Write(SvgFilePreviewedEventName, new EventSourceOptions() + { + Keywords = ProjectKeywordMeasure, + Tags = ProjectTelemetryTagProductAndServicePerformance, + }); + } + + /// + /// Publishes ETW event when svg could not be previewed. + /// + public void SvgFilePreviewError(string message) + { + this.Write( + SvgFilePreviewErrorEventName, + new EventSourceOptions() + { + Keywords = ProjectKeywordMeasure, + Tags = ProjectTelemetryTagProductAndServicePerformance, + }, + new { Message = message, }); + } + } +} diff --git a/src/modules/previewpane/UnitTests-PreviewHandlerCommon/FileBasedPreviewHandlerTests.cs b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/FileBasedPreviewHandlerTests.cs new file mode 100644 index 000000000..4b3aaa884 --- /dev/null +++ b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/FileBasedPreviewHandlerTests.cs @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Common; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; + +namespace UnitTests_PreviewHandlerCommon +{ + [TestClass] + public class FileBasedPreviewHandlerTests + { + public class TestFileBasedPreviewHandler : FileBasedPreviewHandler + { + public override void DoPreview() + { + throw new NotImplementedException(); + } + + protected override IPreviewHandlerControl CreatePreviewHandlerControl() + { + return new Mock().Object; + } + } + + [DataTestMethod] + [DataRow((uint)0)] + [DataRow((uint)1)] + public void FileBasedPreviewHandler_ShouldSetFilePath_WhenInitializeCalled(uint grfMode) + { + // Arrange + var fileBasedPreviewHandler = new TestFileBasedPreviewHandler(); + var filePath = "C:\\valid-path"; + + // Act + fileBasedPreviewHandler.Initialize(filePath, grfMode); + + // Assert + Assert.AreEqual(fileBasedPreviewHandler.FilePath, filePath); + } + } +} diff --git a/src/modules/previewpane/UnitTests-PreviewHandlerCommon/FormHandlerControlTests.cs b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/FormHandlerControlTests.cs new file mode 100644 index 000000000..c16c1e781 --- /dev/null +++ b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/FormHandlerControlTests.cs @@ -0,0 +1,181 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Common; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace UnitTests_PreviewHandlerCommon +{ + [TestClass] + public class FormHandlerControlTests + { + private class TestFormControl : FormHandlerControl + { } + + [TestMethod] + public void FormHandlerControl_ShouldCreateHandle_OnIntialization() + { + // Arrange and act + var testFormHandlerControl = new TestFormControl(); + + // Assert + Assert.IsTrue(testFormHandlerControl.IsHandleCreated); + } + + [TestMethod] + public void FormHandlerControl_ShouldSetVisibleFalse_OnIntialization() + { + // Arrange and act + var testFormHandlerControl = new TestFormControl(); + + // Assert + Assert.IsFalse(testFormHandlerControl.Visible); + } + + [TestMethod] + public void FormHandlerControl_ShouldSetFormBorderStyle_OnIntialization() + { + // Arrange and act + var testFormHandlerControl = new TestFormControl(); + + // Assert + Assert.AreEqual(FormBorderStyle.None, testFormHandlerControl.FormBorderStyle); + } + + [TestMethod] + public void FormHandlerControl_ShouldReturnValidHandle_WhenGetHandleCalled() + { + // Arrange + var testFormHandlerControl = new TestFormControl(); + + // Act + var handle = testFormHandlerControl.GetHandle(); + + // Assert + Assert.AreEqual(testFormHandlerControl.Handle, handle); + } + + [TestMethod] + public void FormHandlerControl_ShouldSetBackgroundColor_WhenSetBackgroundColorCalled() + { + // Arrange + var testFormHandlerControl = new TestFormControl(); + var color = Color.Navy; + + // Act + testFormHandlerControl.SetBackgroundColor(color); + + // Assert + Assert.AreEqual(color, testFormHandlerControl.BackColor); + } + + [TestMethod] + public void FormHandlerControl_ShouldSetFont_WhenSetFontCalled() + { + // Arrange + var testFormHandlerControl = new TestFormControl(); + var font = new Font("Arial", 20); + + // Act + testFormHandlerControl.SetFont(font); + + // Assert + Assert.AreEqual(font, testFormHandlerControl.Font); + } + + [TestMethod] + public void FormHandlerControl_ShouldUpdateBounds_WhenSetRectCalled() + { + // Arrange + var testFormHandlerControl = new TestFormControl(); + var bounds = new Rectangle(2, 2, 4, 4); + + // Act + testFormHandlerControl.SetRect(bounds); + + // Assert + Assert.AreEqual(bounds, testFormHandlerControl.Bounds); + } + + [TestMethod] + public void FormHandlerControl_ShouldSetTextColor_WhenSetTextColorCalled() + { + // Arrange + var testFormHandlerControl = new TestFormControl(); + var color = Color.Navy; + + // Act + testFormHandlerControl.SetTextColor(color); + + // Assert + Assert.AreEqual(color, testFormHandlerControl.ForeColor); + } + + [TestMethod] + public void FormHandlerControl_ShouldClearAllControls_WhenUnloadCalled() + { + // Arrange + var testFormHandlerControl = new TestFormControl(); + testFormHandlerControl.Controls.Add(new TextBox()); + testFormHandlerControl.Controls.Add(new RichTextBox()); + + // Act + testFormHandlerControl.Unload(); + + // Assert + Assert.AreEqual(0, testFormHandlerControl.Controls.Count); + } + + [TestMethod] + public void FormHandlerControl_ShouldSetVisibleFalse_WhenUnloadCalled() + { + // Arrange + var testFormHandlerControl = new TestFormControl(); + + // Act + testFormHandlerControl.Unload(); + + // Assert + Assert.IsFalse(testFormHandlerControl.Visible); + } + + [TestMethod] + public void FormHandlerControl_ShouldSetVisibletrue_WhenDoPreviewCalled() + { + // Arrange + var testFormHandlerControl = new TestFormControl(); + + // Act + testFormHandlerControl.DoPreview("valid-path"); + + // Assert + Assert.IsTrue(testFormHandlerControl.Visible); + } + + [TestMethod] + public void FormHandlerControl_ShouldSetParentHandle_WhenSetWindowCalled() + { + // Arrange + var testFormHandlerControl = new TestFormControl(); + var parentFormWindow = new UserControl(); + var parentHwnd = parentFormWindow.Handle; + var rect = new Rectangle(2, 2, 4, 4); + + // Act + testFormHandlerControl.SetWindow(parentHwnd, rect); + var actualParentHwnd = GetAncestor(testFormHandlerControl.Handle, 1); // GA_PARENT 1 + + // Assert + Assert.AreEqual(parentHwnd, actualParentHwnd); + } + + // Gets the ancestor window: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getancestor + [DllImport("user32.dll")] + private static extern IntPtr GetAncestor(IntPtr hWnd, uint gaFlags); + } +} diff --git a/src/modules/previewpane/UnitTests-PreviewHandlerCommon/PreviewHandlerBaseTests.cs b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/PreviewHandlerBaseTests.cs new file mode 100644 index 000000000..349949ac2 --- /dev/null +++ b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/PreviewHandlerBaseTests.cs @@ -0,0 +1,391 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Drawing.Drawing2D; +using Common; +using Common.ComInterlop; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; + +namespace UnitTests_PreviewHandlerCommon +{ + [TestClass] + public class PreviewHandlerBaseTests + { + private static IPreviewHandlerControl previewHandlerControl; + + public class TestPreviewHandler : PreviewHandlerBase + { + public override void DoPreview() + { + throw new NotImplementedException(); + } + + protected override IPreviewHandlerControl CreatePreviewHandlerControl() + { + return GetMockPreviewHandlerControl(); + } + } + + [TestMethod] + public void PreviewHandlerBase_ShouldCallPreviewControlSetWindow_WhenSetWindowCalled() + { + // Arrange + var mockPreviewControl = new Mock(); + var handle = new IntPtr(5); + var bounds = GetRectangle(2, 2, 4, 4); + + var actualHandle = IntPtr.Zero; + var actualBounds = Rectangle.Empty; + mockPreviewControl + .Setup(_ => _.SetWindow(It.IsAny(), It.IsAny())) + .Callback((hwnd, rect) => + { + actualHandle = hwnd; + actualBounds = rect; + }); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + + // Act + testPreviewHandler.SetWindow(handle, ref bounds); + + // Assert + Assert.AreEqual(actualHandle, handle); + Assert.AreEqual(actualBounds, bounds.ToRectangle()); + mockPreviewControl.Verify(_ => _.SetWindow(It.IsAny(), It.IsAny()), Times.Once); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldCallPreviewControlSetrect_WhenSetRectCalled() + { + // Arrange + var mockPreviewControl = new Mock(); + var bounds = GetRectangle(2, 2, 4, 4); + + var actualBounds = Rectangle.Empty; + mockPreviewControl + .Setup(_ => _.SetRect(It.IsAny())) + .Callback((rect) => + { + actualBounds = rect; + }); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + + // Act + testPreviewHandler.SetRect(ref bounds); + + // Assert + Assert.AreEqual(actualBounds, bounds.ToRectangle()); + mockPreviewControl.Verify(_ => _.SetRect(It.IsAny()), Times.Once); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldCallPreviewControlUnload_WhenUnloadCalled() + { + // Arrange + var mockPreviewControl = new Mock(); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + + // Act + testPreviewHandler.Unload(); + + // Assert + mockPreviewControl.Verify(_ => _.Unload(), Times.Once); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldCallPreviewControlSetBackgroundColor_WhenSetBackgroundColorCalled() + { + // Arrange + var mockPreviewControl = new Mock(); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + var color = new COLORREF(); + + // Act + testPreviewHandler.SetBackgroundColor(color); + + // Assert + mockPreviewControl.Verify(_ => _.SetBackgroundColor(It.Is(c => (c == color.Color))), Times.Once); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldCallPreviewControlSetTextColor_WhenSetTextColorCalled() + { + // Arrange + var mockPreviewControl = new Mock(); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + var color = new COLORREF(); + + // Act + testPreviewHandler.SetTextColor(color); + + // Assert + mockPreviewControl.Verify(_ => _.SetTextColor(It.Is(c => (c == color.Color))), Times.Once); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldCallPreviewControlSetFont_WhenSetFontCalled() + { + // Arrange + Font actualFont = null; + var mockPreviewControl = new Mock(); + mockPreviewControl + .Setup(x => x.SetFont(It.IsAny())) + .Callback((font) => + { + actualFont = font; + }); + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + var logFont = GetLogFont(); + + // Act + testPreviewHandler.SetFont(ref logFont); + + // Assert + mockPreviewControl.Verify(_ => _.SetFont(It.IsAny()), Times.Once); + Assert.AreEqual(Font.FromLogFont(logFont), actualFont); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldCallPreviewControlSetFocus_WhenSetFocusCalled() + { + // Arrange + var mockPreviewControl = new Mock(); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + + // Act + testPreviewHandler.SetFocus(); + + // Assert + mockPreviewControl.Verify(_ => _.SetFocus(), Times.Once); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldSetHandleOnQueryFocus_WhenPreviewControlsReturnValidHandle() + { + // Arrange + var hwnd = new IntPtr(5); + var mockPreviewControl = new Mock(); + mockPreviewControl.Setup(x => x.QueryFocus(out hwnd)); + var actualHwnd = IntPtr.Zero; + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + + // Act + testPreviewHandler.QueryFocus(out actualHwnd); + + // Assert + Assert.AreEqual(actualHwnd, hwnd); + mockPreviewControl.Verify(_ => _.QueryFocus(out hwnd), Times.Once); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldThrowOnQueryFocus_WhenPreviewControlsReturnNotValidHandle() + { + // Arrange + var hwnd = IntPtr.Zero; + var mockPreviewControl = new Mock(); + mockPreviewControl.Setup(x => x.QueryFocus(out hwnd)); + var actualHwnd = IntPtr.Zero; + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + Win32Exception exception = null; + + // Act + try + { + testPreviewHandler.QueryFocus(out actualHwnd); + } + catch (Win32Exception ex) + { + exception = ex; + } + + // Assert + Assert.IsNotNull(exception); + mockPreviewControl.Verify(_ => _.QueryFocus(out hwnd), Times.Once); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldDirectKeyStrokesToIPreviewHandlerFrame_IfIPreviewHandlerFrameIsSet() + { + // Arrange + var mockPreviewControl = new Mock(); + var mockPreviewHandlerFrame = new Mock(); + var msg = new MSG(); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + testPreviewHandler.SetSite(mockPreviewHandlerFrame.Object); + + // Act + testPreviewHandler.TranslateAccelerator(ref msg); + + // Assert + mockPreviewHandlerFrame.Verify(_ => _.TranslateAccelerator(ref msg), Times.Once); + } + + [DataTestMethod] + [DataRow((uint)0)] + [DataRow((uint)1)] + public void PreviewHandlerBase_ShouldReturnIPreviewHandlerFrameResponse_IfIPreviewHandlerFrameIsSet(uint resultCode) + { + // Arrange + var mockPreviewControl = new Mock(); + var mockPreviewHandlerFrame = new Mock(); + var msg = new MSG(); + mockPreviewHandlerFrame + .Setup(x => x.TranslateAccelerator(ref msg)) + .Returns(resultCode); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + testPreviewHandler.SetSite(mockPreviewHandlerFrame.Object); + + // Act + var actualResultCode = testPreviewHandler.TranslateAccelerator(ref msg); + + // Assert + Assert.AreEqual(resultCode, actualResultCode); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldReturnS_FALSE_IfIPreviewHandlerFrameIsNotSet() + { + // Arrange + var mockPreviewControl = new Mock(); + var msg = new MSG(); + uint S_FALSE = 1; + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + + // Act + var result = testPreviewHandler.TranslateAccelerator(ref msg); + + // Assert + Assert.AreEqual(result, S_FALSE); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldReturnPreviewControlHandle_IfGetWindowCalled() + { + // Arrange + var previewControlHandle = new IntPtr(5); + var mockPreviewControl = new Mock(); + mockPreviewControl.Setup(x => x.GetHandle()) + .Returns(previewControlHandle); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + var hwndReceived = IntPtr.Zero; + + // Act + testPreviewHandler.GetWindow(out hwndReceived); + + // Assert + Assert.AreEqual(hwndReceived, previewControlHandle); + } + + [DataTestMethod] + [DataRow(true)] + [DataRow(false)] + public void PreviewHandlerBase_ShouldThrowNotImplementedException_IfContextSensitiveHelpCalled(bool fEnterMode) + { + // Arrange + var mockPreviewControl = new Mock(); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + NotImplementedException exception = null; + + // Act + try + { + testPreviewHandler.ContextSensitiveHelp(fEnterMode); + } + catch (NotImplementedException ex) + { + exception = ex; + } + + // Assert + Assert.IsNotNull(exception); + } + + [TestMethod] + public void PreviewHandlerBase_ShouldReturnSite_WhenGetSiteCalled() + { + // Arrange + var mockPreviewControl = new Mock(); + + previewHandlerControl = mockPreviewControl.Object; + var testPreviewHandler = new TestPreviewHandler(); + var site = new Mock().Object; + testPreviewHandler.SetSite(site); + object actualSite = null; + var riid = Guid.Empty; + + // Act + testPreviewHandler.GetSite(ref riid, out actualSite); + + // Assert + Assert.AreEqual(actualSite, site); + } + + private LOGFONT GetLogFont() + { + var logFont = new LOGFONT(); + logFont.LfHeight = 12; + logFont.LfWidth = 0; + logFont.LfEscapement = 0; + logFont.LfWeight = 400; // FW_NORMAL + logFont.LfItalic = Convert.ToByte(false); + logFont.LfUnderline = Convert.ToByte(false); + logFont.LfStrikeOut = Convert.ToByte(0); + logFont.LfCharSet = Convert.ToByte(0); // ANSI_CHARSET + logFont.LfOutPrecision = Convert.ToByte(0); // OUT_DEFAULT_PRECIS + logFont.LfClipPrecision = Convert.ToByte(0); + logFont.LfQuality = Convert.ToByte(0); + logFont.LfPitchAndFamily = Convert.ToByte(0); + logFont.LfFaceName = "valid-font"; + + return logFont; + } + + private RECT GetRectangle(int left, int top, int right, int bottom) + { + var rect = new RECT(); + rect.Left = left; + rect.Top = top; + rect.Right = right; + rect.Bottom = bottom; + + return rect; + } + + private static IPreviewHandlerControl GetMockPreviewHandlerControl() + { + return previewHandlerControl; + } + } +} diff --git a/src/modules/previewpane/UnitTests-PreviewHandlerCommon/StreamBasedPreviewHandlerTests.cs b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/StreamBasedPreviewHandlerTests.cs new file mode 100644 index 000000000..fd6231787 --- /dev/null +++ b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/StreamBasedPreviewHandlerTests.cs @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices.ComTypes; +using Common; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; + +namespace UnitTests_PreviewHandlerCommon +{ + [TestClass] + public class StreamBasedPreviewHandlerTests + { + public class TestStreamBasedPreviewHandler : StreamBasedPreviewHandler + { + public override void DoPreview() + { + throw new NotImplementedException(); + } + + protected override IPreviewHandlerControl CreatePreviewHandlerControl() + { + return new Mock().Object; + } + } + + [DataTestMethod] + [DataRow((uint)0)] + [DataRow((uint)1)] + public void FileBasedPreviewHandler_ShouldSetFilePath_WhenInitializeCalled(uint grfMode) + { + // Arrange + var streamBasedPreviewHandler = new TestStreamBasedPreviewHandler(); + var stream = new Mock().Object; + + // Act + streamBasedPreviewHandler.Initialize(stream, grfMode); + + // Assert + Assert.AreEqual(streamBasedPreviewHandler.Stream, stream); + } + } +} diff --git a/src/modules/previewpane/UnitTests-PreviewHandlerCommon/StreamWrapperTests.cs b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/StreamWrapperTests.cs new file mode 100644 index 000000000..51ebec302 --- /dev/null +++ b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/StreamWrapperTests.cs @@ -0,0 +1,332 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Castle.Core.Logging; +using Common.Utilities; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using System; +using System.IO; +using System.Linq; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; + +namespace UnitTests_PreviewHandlerCommon +{ + [TestClass] + public class StreamWrapperTests + { + [TestMethod] + public void StreamWrapper_ShouldThrow_IfInitializeWithNullStream() + { + // Arrange + IStream stream = null; + ArgumentNullException exception = null; + + // Act + try + { + var streamWrapper = new StreamWrapper(stream); + } + catch (ArgumentNullException ex) + { + exception = ex; + } + + // Assert + Assert.IsNotNull(exception); + } + + [TestMethod] + public void StreamWrapper_ShouldReturnCanReadTrue() + { + // Arrange + var streamMock = new Mock(); + + // Act + var streamWrapper = new StreamWrapper(streamMock.Object); + + // Assert + Assert.AreEqual(streamWrapper.CanRead, true); + } + + [TestMethod] + public void StreamWrapper_ShouldReturnCanSeekTrue() + { + // Arrange + var streamMock = new Mock(); + + // Act + var streamWrapper = new StreamWrapper(streamMock.Object); + + // Assert + Assert.AreEqual(streamWrapper.CanSeek, true); + } + + [TestMethod] + public void StreamWrapper_ShouldReturnCanWriteFalse() + { + // Arrange + var streamMock = new Mock(); + + // Act + var streamWrapper = new StreamWrapper(streamMock.Object); + + // Assert + Assert.AreEqual(streamWrapper.CanWrite, false); + } + + [TestMethod] + public void StreamWrapper_ShouldReturnValidLength() + { + // Arrange + long streamLength = 5; + var stremMock = new Mock(); + var stat = new System.Runtime.InteropServices.ComTypes.STATSTG(); + stat.cbSize = streamLength; + + stremMock + .Setup(x => x.Stat(out stat, It.IsAny())); + var streamWrapper = new StreamWrapper(stremMock.Object); + + // Act + var actualLength = streamWrapper.Length; + + // Assert + Assert.AreEqual(actualLength, streamLength); + } + + [TestMethod] + public void StreamWrapper_ShouldReturnValidPosition() + { + // Arrange + int expectedDwOrigin = 1; // STREAM_SEEK_CUR + long expectedOffset = 0; + long currPosition = 5; + var stremMock = new Mock(); + + stremMock + .Setup(x => x.Seek(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((dlibMove, dwOrigin, plibNewPosition) => + { + Marshal.WriteInt64(plibNewPosition, currPosition); + }); + var streamWrapper = new StreamWrapper(stremMock.Object); + + // Act + var actualPosition = streamWrapper.Position; + + // Assert + Assert.AreEqual(actualPosition, currPosition); + stremMock.Verify(_ => _.Seek(It.Is(offset => offset == expectedOffset), It.Is(dworigin => dworigin == expectedDwOrigin), It.IsAny()), Times.Once); + } + + [TestMethod] + public void StreamWrapper_ShouldCallIStreamSeek_WhenSetPosition() + { + // Arrange + long positionToSet = 5; + int expectedDwOrigin = 0; // STREAM_SEEK_SET + var stremMock = new Mock(); + + var streamWrapper = new StreamWrapper(stremMock.Object); + + // Act + streamWrapper.Position = positionToSet; + + // Assert + stremMock.Verify(_ => _.Seek(It.Is(offset => offset == positionToSet), It.Is(dworigin => dworigin == expectedDwOrigin), It.IsAny()), Times.Once); + } + + [DataTestMethod] + [DataRow((long)0, SeekOrigin.Begin)] + [DataRow((long)5, SeekOrigin.Begin)] + [DataRow((long)0, SeekOrigin.Current)] + [DataRow((long)5, SeekOrigin.Current)] + [DataRow((long)0, SeekOrigin.End)] + [DataRow((long)5, SeekOrigin.End)] + public void StreamWrapper_ShouldCallIStreamSeekWithValidArguments_WhenSeekCalled(long offset, SeekOrigin origin) + { + // Arrange + int expectedDwOrigin = 0; + switch (origin) + { + case SeekOrigin.Begin: + expectedDwOrigin = 0; + break; + + case SeekOrigin.Current: + expectedDwOrigin = 1; + break; + + case SeekOrigin.End: + expectedDwOrigin = 2; + break; + } + + var stremMock = new Mock(); + var streamWrapper = new StreamWrapper(stremMock.Object); + + // Act + streamWrapper.Seek(offset, origin); + + // Assert + stremMock.Verify(_ => _.Seek(It.Is(actualOffset => actualOffset == offset), It.Is(actualDwOrigin => actualDwOrigin == expectedDwOrigin), It.IsAny()), Times.Once); + } + + [TestMethod] + public void StreamWrapper_ShouldReturnValidPosition_WhenSeekCalled() + { + // Arrange + long position = 5; + var stremMock = new Mock(); + + stremMock + .Setup(x => x.Seek(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((dlibMove, dwOrigin, plibNewPosition) => + { + Marshal.WriteInt64(plibNewPosition, position); + }); + + var streamWrapper = new StreamWrapper(stremMock.Object); + + // Act + var actualPosition = streamWrapper.Seek(0, SeekOrigin.Begin); + + // Assert + Assert.AreEqual(position, actualPosition); + } + + [DataTestMethod] + [DataRow(10, -1, 5)] + [DataRow(10, 0, -5)] + [DataRow(10, 0, 11)] + [DataRow(10, 5, 6)] + public void StreamWrapper_ShouldThrow_WhenReadCalledWithOutOfRangeArguments(int bufferLength, int offSet, int bytesToRead) + { + // Arrange + var buffer = new byte[bufferLength]; + var stremMock = new Mock(); + ArgumentOutOfRangeException exception = null; + + var streamWrapper = new StreamWrapper(stremMock.Object); + + // Act + try + { + streamWrapper.Read(buffer, offSet, bytesToRead); + } + catch (ArgumentOutOfRangeException ex) + { + exception = ex; + } + + // Assert + Assert.IsNotNull(exception); + } + + [DataTestMethod] + [DataRow(5, 0)] + [DataRow(5, 5)] + [DataRow(0, 5)] + public void StreamWrapper_ShouldSetValidBuffer_WhenReadCalled(int count, int offset) + { + // Arrange + var inputBuffer = new byte[1024]; + var streamBytes = new byte[count]; + for (int i = 0; i < count; i++) + { + streamBytes[i] = (byte)i; + } + + var stremMock = new Mock(); + + stremMock + .Setup(x => x.Read(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((buffer, countToRead , bytesReadPtr) => + { + Array.Copy(streamBytes, 0, buffer, 0, streamBytes.Length); + Marshal.WriteInt32(bytesReadPtr, count); + }); + + var streamWrapper = new StreamWrapper(stremMock.Object); + + // Act + var bytesRead = streamWrapper.Read(inputBuffer, offset, count); + + // Assert + CollectionAssert.AreEqual(streamBytes, inputBuffer.Skip(offset).Take(count).ToArray()); + Assert.AreEqual(count, bytesRead); + } + + [TestMethod] + public void StreamWrapper_ShouldThrowNotImplementedException_WhenFlushCalled() + { + // Arrange + var stremMock = new Mock(); + var streamWrapper = new StreamWrapper(stremMock.Object); + NotImplementedException exception = null; + + // Act + try + { + streamWrapper.Flush(); + } + catch (NotImplementedException ex) + { + exception = ex; + } + + // Assert + Assert.IsNotNull(exception); + } + + [TestMethod] + public void StreamWrapper_ShouldThrowNotImplementedException_WhenSetLengthCalled() + { + // Arrange + var stremMock = new Mock(); + var streamWrapper = new StreamWrapper(stremMock.Object); + NotImplementedException exception = null; + + // Act + try + { + streamWrapper.SetLength(5); + } + catch (NotImplementedException ex) + { + exception = ex; + } + + // Assert + Assert.IsNotNull(exception); + } + + [TestMethod] + public void StreamWrapper_ShouldThrowNotImplementedException_WhenWriteCalled() + { + // Arrange + var stremMock = new Mock(); + var streamWrapper = new StreamWrapper(stremMock.Object); + NotImplementedException exception = null; + + // Act + try + { + streamWrapper.Write(new byte[5], 0, 0); + } + catch (NotImplementedException ex) + { + exception = ex; + } + + // Assert + Assert.IsNotNull(exception); + } + + + } +} diff --git a/src/modules/previewpane/UnitTests-PreviewHandlerCommon/UnitTests-PreviewHandlerCommon.csproj b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/UnitTests-PreviewHandlerCommon.csproj new file mode 100644 index 000000000..6c261facb --- /dev/null +++ b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/UnitTests-PreviewHandlerCommon.csproj @@ -0,0 +1,116 @@ + + + + + + + UnitTests_PreviewHandlerCommon + Microsoft Corp. + Copyright (C) 2019 Microsoft Corp. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug + AnyCPU + {748417CA-F17E-487F-9411-CAFB6D3F4877} + Library + Properties + UnitTests_PreviewHandlerCommon + UnitTests-PreviewHandlerCommon + v4.7.2 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + + true + full + false + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + DEBUG;TRACE + prompt + 4 + x64 + + + pdbonly + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + TRACE + prompt + 4 + x64 + + + + + + + + + + Code + + + + + + + + Component + + + + + 4.13.1 + + + 1.3.2 + + + 1.3.2 + + + + + {af2349b8-e5b6-4004-9502-687c1c7730b1} + PreviewHandlerCommon + + + + + \ No newline at end of file diff --git a/src/modules/previewpane/UnitTests-PreviewHandlerCommon/WebBrowserExtUnitTests.cs b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/WebBrowserExtUnitTests.cs new file mode 100644 index 000000000..c41ab6f1b --- /dev/null +++ b/src/modules/previewpane/UnitTests-PreviewHandlerCommon/WebBrowserExtUnitTests.cs @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.VisualStudio.TestTools.UnitTesting; +using PreviewHandlerCommon; +using System.Reflection; + +namespace UnitTests_PreviewHandlerCommon +{ + [TestClass] + public class WebBrowserExtUnitTests : WebBrowserExt + { + private const string DISPIDAMBIENTDLCONTROL = "[DISPID=-5512]"; + + [TestMethod] + public void InvokeMember_ShouldSetValidFlags_WhenCalledWithValidDispId() + { + // Arrange + var extendedSite = CreateWebBrowserSiteBase() as WebBrowserSiteExt; + + // Act + var actualFlags = (int)extendedSite.InvokeMember(DISPIDAMBIENTDLCONTROL, BindingFlags.InvokeMethod, null, null, null, null, null, null); + + // Assert + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.PRAGMA_NO_CACHE) >= 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.FORCEOFFLINE) >= 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.NO_CLIENTPULL) >= 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.NO_SCRIPTS) >= 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.NO_JAVA) >= 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.NO_FRAMEDOWNLOAD) >= 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.NOFRAMES) >= 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.NO_DLACTIVEXCTLS) >= 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.NO_RUNACTIVEXCTLS) >= 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.NO_BEHAVIORS) >= 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.SILENT) >= 0); + } + + [TestMethod] + public void InvokeMember_ShouldOnlySetValidFlags_WhenCalledWithValidDispId() + { + // Arrange + var extendedSite = CreateWebBrowserSiteBase() as WebBrowserSiteExt; + + // Act + var actualFlags = (int)extendedSite.InvokeMember(DISPIDAMBIENTDLCONTROL, BindingFlags.InvokeMethod, null, null, null, null, null, null); + + // Assert + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.DLIMAGES) == 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.VIDEOS) == 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.BGSOUNDS) == 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.DOWNLOADONLY) == 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.RESYNCHRONIZE) == 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.NO_METACHARSET) == 0); + Assert.IsTrue((actualFlags & (int)WebBrowserDownloadControlFlags.URL_ENCODING_DISABLE_UTF8) == 0); + Assert.IsTrue((actualFlags & (uint)WebBrowserDownloadControlFlags.URL_ENCODING_ENABLE_UTF8) == 0); + } + } +} diff --git a/src/modules/previewpane/UnitTests-SvgPreviewHandler/SvgPreviewControlTests.cs b/src/modules/previewpane/UnitTests-SvgPreviewHandler/SvgPreviewControlTests.cs new file mode 100644 index 000000000..fe4568d19 --- /dev/null +++ b/src/modules/previewpane/UnitTests-SvgPreviewHandler/SvgPreviewControlTests.cs @@ -0,0 +1,186 @@ +using System; +using System.Drawing; +using System.IO; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Text; +using System.Windows.Forms; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using PreviewHandlerCommon; +using SvgPreviewHandler; + +namespace UnitTests_SvgPreviewHandler +{ + [TestClass] + public class SvgPreviewControlTests + { + [TestMethod] + public void SvgPreviewControl_ShouldAddExtendedBrowserControl_WhenDoPreviewCalled() + { + // Arrange + var svgPreviewControl = new SvgPreviewControl(); + + // Act + svgPreviewControl.DoPreview(GetMockStream("")); + + // Assert + Assert.AreEqual(svgPreviewControl.Controls.Count, 1); + Assert.IsInstanceOfType(svgPreviewControl.Controls[0], typeof(WebBrowserExt)); + } + + [TestMethod] + public void SvgPreviewControl_ShouldSetDocumentStream_WhenDoPreviewCalled() + { + // Arrange + var svgPreviewControl = new SvgPreviewControl(); + + // Act + svgPreviewControl.DoPreview(GetMockStream("")); + + // Assert + Assert.IsNotNull(((WebBrowser)svgPreviewControl.Controls[0]).DocumentStream); + } + + [TestMethod] + public void SvgPreviewControl_ShouldDisableWebBrowserContextMenu_WhenDoPreviewCalled() + { + // Arrange + var svgPreviewControl = new SvgPreviewControl(); + + // Act + svgPreviewControl.DoPreview(GetMockStream("")); + + // Assert + Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).IsWebBrowserContextMenuEnabled, false); + } + + [TestMethod] + public void SvgPreviewControl_ShouldFillDockForWebBrowser_WhenDoPreviewCalled() + { + // Arrange + var svgPreviewControl = new SvgPreviewControl(); + + // Act + svgPreviewControl.DoPreview(GetMockStream("")); + + // Assert + Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).Dock, DockStyle.Fill); + } + + [TestMethod] + public void SvgPreviewControl_ShouldSetScriptErrorsSuppressedProperty_WhenDoPreviewCalled() + { + // Arrange + var svgPreviewControl = new SvgPreviewControl(); + + // Act + svgPreviewControl.DoPreview(GetMockStream("")); + + // Assert + Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).ScriptErrorsSuppressed, true); + } + + [TestMethod] + public void SvgPreviewControl_ShouldSetScrollBarsEnabledProperty_WhenDoPreviewCalled() + { + // Arrange + var svgPreviewControl = new SvgPreviewControl(); + + // Act + svgPreviewControl.DoPreview(GetMockStream("")); + + // Assert + Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).ScrollBarsEnabled, true); + } + + [TestMethod] + public void SvgPreviewControl_ShouldDisableAllowNavigation_WhenDoPreviewCalled() + { + // Arrange + var svgPreviewControl = new SvgPreviewControl(); + + // Act + svgPreviewControl.DoPreview(GetMockStream("")); + + // Assert + Assert.AreEqual(((WebBrowser)svgPreviewControl.Controls[0]).AllowNavigation, false); + } + + [TestMethod] + public void SvgPreviewControl_ShouldAddValidInfoBar_IfSvgPreviewThrows() + { + // Arrange + var svgPreviewControl = new SvgPreviewControl(); + var mockStream = new Mock(); + mockStream + .Setup(x => x.Read(It.IsAny(), It.IsAny(), It.IsAny())) + .Throws(new Exception()); + + // Act + svgPreviewControl.DoPreview(mockStream.Object); + var textBox = svgPreviewControl.Controls[0] as RichTextBox; + + // Assert + Assert.IsFalse(string.IsNullOrWhiteSpace(textBox.Text)); + Assert.AreEqual(svgPreviewControl.Controls.Count, 1); + Assert.AreEqual(textBox.Dock, DockStyle.Top); + Assert.AreEqual(textBox.BackColor, Color.LightYellow); + Assert.IsTrue(textBox.Multiline); + Assert.IsTrue(textBox.ReadOnly); + Assert.AreEqual(textBox.ScrollBars, RichTextBoxScrollBars.None); + Assert.AreEqual(textBox.BorderStyle, BorderStyle.None); + } + + + [TestMethod] + public void SvgPreviewControl_InfoBarWidthShouldAdjustWithParentControlWidthChanges_IfSvgPreviewThrows() + { + // Arrange + var svgPreviewControl = new SvgPreviewControl(); + var mockStream = new Mock(); + mockStream + .Setup(x => x.Read(It.IsAny(), It.IsAny(), It.IsAny())) + .Throws(new Exception()); + svgPreviewControl.DoPreview(mockStream.Object); + var textBox = svgPreviewControl.Controls[0] as RichTextBox; + var incrementParentControlWidth = 5; + var intialParentWidth = svgPreviewControl.Width; + var intitialTextBoxWidth = textBox.Width; + var finalParentWidth = intialParentWidth + incrementParentControlWidth; + + // Act + svgPreviewControl.Width += incrementParentControlWidth; + + // Assert + Assert.AreEqual(intialParentWidth, intitialTextBoxWidth); + Assert.AreEqual(finalParentWidth, textBox.Width); + } + + private IStream GetMockStream(string streamData) + { + var mockStream = new Mock(); + var streamBytes = Encoding.UTF8.GetBytes(streamData); + + var streamMock = new Mock(); + var firstCall = true; + streamMock + .Setup(x => x.Read(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback((buffer, countToRead, bytesReadPtr) => + { + if (firstCall) + { + Array.Copy(streamBytes, 0, buffer, 0, streamBytes.Length); + Marshal.WriteInt32(bytesReadPtr, streamBytes.Length); + firstCall = false; + } + else + { + Marshal.WriteInt32(bytesReadPtr, 0); + } + }); + + return streamMock.Object; + } + } +} diff --git a/src/modules/previewpane/UnitTests-SvgPreviewHandler/UnitTests-SvgPreviewHandler.csproj b/src/modules/previewpane/UnitTests-SvgPreviewHandler/UnitTests-SvgPreviewHandler.csproj new file mode 100644 index 000000000..b363dafff --- /dev/null +++ b/src/modules/previewpane/UnitTests-SvgPreviewHandler/UnitTests-SvgPreviewHandler.csproj @@ -0,0 +1,115 @@ + + + + + + + UnitTests-SvgPreviewHandler + Microsoft Corp. + Copyright (C) 2019 Microsoft Corp. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug + AnyCPU + {060D75DA-2D1C-48E6-A4A1-6F0718B64661} + Library + Properties + UnitTests_SvgPreviewHandler + UnitTests-SvgPreviewHandler + v4.7.2 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + + true + full + false + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + DEBUG;TRACE + prompt + 4 + x64 + + + pdbonly + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + TRACE + prompt + 4 + x64 + + + + + + + + + + + Code + + + + + + 4.13.1 + + + 1.3.2 + + + 1.3.2 + + + + + {AF2349B8-E5B6-4004-9502-687C1C7730B1} + PreviewHandlerCommon + + + {DA425894-6E13-404F-8DCB-78584EC0557A} + SvgPreviewHandler + False + + + + + \ No newline at end of file diff --git a/src/modules/previewpane/common/PreviewHandlerCommon.csproj b/src/modules/previewpane/common/PreviewHandlerCommon.csproj new file mode 100644 index 000000000..3bca31819 --- /dev/null +++ b/src/modules/previewpane/common/PreviewHandlerCommon.csproj @@ -0,0 +1,140 @@ + + + + + + + PreviewHandlerCommon + Microsoft Corp. + Copyright (C) 2019 Microsoft Corp. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug + AnyCPU + {AF2349B8-E5B6-4004-9502-687C1C7730B1} + Library + Properties + PreviewHandlerCommon + PreviewHandlerCommon + v4.7.2 + 512 + true + + + + true + full + false + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + DEBUG;TRACE + prompt + 4 + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\PreviewHandlerCommonDocumentation.xml + x64 + + + pdbonly + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + TRACE + prompt + 4 + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\PreviewHandlerCommonDocumentation.xml + x64 + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Component + + + Form + + + + Form + + + Code + + + + + + + + + + + StyleCop.json + + + + + 1.1.118 + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + \ No newline at end of file diff --git a/src/modules/previewpane/common/Telemetry/TelemetryBase.cs b/src/modules/previewpane/common/Telemetry/TelemetryBase.cs new file mode 100644 index 000000000..1440aec9d --- /dev/null +++ b/src/modules/previewpane/common/Telemetry/TelemetryBase.cs @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Diagnostics.Eventing.Reader; +using System.Diagnostics.Tracing; + +namespace PreviewHandlerCommon.Telemetry +{ + /// + /// Base class for telemetry events. + /// + public class TelemetryBase : EventSource + { + /// + /// The event tag for this event source. + /// + public const EventTags ProjectTelemetryTagProductAndServicePerformance = (EventTags)0x0u; + + /// + /// The event keyword for this event source. + /// + public const EventKeywords ProjectKeywordMeasure = (EventKeywords)0x0; + + /// + /// Group ID for Powertoys project. + /// + private static readonly string[] PowerToysTelemetryTraits = { "ETW_GROUP", "{42749043-438c-46a2-82be-c6cbeb192ff2}" }; + + /// + /// Initializes a new instance of the class. + /// + /// . + public TelemetryBase( + string eventSourceName) + : base( + eventSourceName, + EventSourceSettings.EtwSelfDescribingEventFormat, + PowerToysTelemetryTraits) + { + return; + } + } +} diff --git a/src/modules/previewpane/common/Utilities/StreamWrapper.cs b/src/modules/previewpane/common/Utilities/StreamWrapper.cs new file mode 100644 index 000000000..8d31b9eff --- /dev/null +++ b/src/modules/previewpane/common/Utilities/StreamWrapper.cs @@ -0,0 +1,242 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; + +namespace Common.Utilities +{ + /// + /// Wraps interface into Class. + /// + /// + /// Implements only read from the stream functionality. + /// + public class StreamWrapper : Stream + { + private IStream stream; + + /// + /// Initializes a new instance of the class. + /// + /// A pointer to an interface that represents the stream source. + public StreamWrapper(IStream stream) + { + this.stream = stream ?? throw new ArgumentNullException(nameof(stream)); + } + + /// + /// Gets a value indicating whether the current stream supports reading. + /// + public override bool CanRead + { + get + { + return true; + } + } + + /// + /// Gets a value indicating whether the current stream supports seeking. + /// + public override bool CanSeek + { + get + { + return true; + } + } + + /// + /// Gets a value indicating whether the current stream supports writing. + /// + public override bool CanWrite + { + get + { + return false; + } + } + + /// + /// Gets the length in bytes of the stream. + /// + public override long Length + { + get + { + this.CheckDisposed(); + System.Runtime.InteropServices.ComTypes.STATSTG stat; + + // Stat called with STATFLAG_NONAME. The pwcsName is not required more details https://docs.microsoft.com/en-us/windows/win32/api/wtypes/ne-wtypes-statflag + this.stream.Stat(out stat, 1); // STATFLAG_NONAME + + return stat.cbSize; + } + } + + /// + /// Gets or Sets the position within the current. + /// + public override long Position + { + get + { + return this.Seek(0, SeekOrigin.Current); + } + + set + { + this.Seek(value, SeekOrigin.Begin); + } + } + + /// + /// Reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read. + /// + /// An array of bytes. When this method returns, the buffer contains the specified byte array with the values between offset and (offset + count - 1) replaced by the bytes read from the current source. + /// The zero-based byte offset in buffer at which to begin storing the data read from the current stream. + /// The maximum number of bytes to be read from the current stream. + /// The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero if the end of the stream has been reached. + public override int Read(byte[] buffer, int offset, int count) + { + this.CheckDisposed(); + + if (offset < 0 || count < 0 || offset + count > buffer.Length) + { + throw new ArgumentOutOfRangeException(); + } + + byte[] localBuffer = buffer; + + if (offset > 0) + { + localBuffer = new byte[count]; + } + + IntPtr bytesReadPtr = Marshal.AllocCoTaskMem(sizeof(int)); + + try + { + this.stream.Read(localBuffer, count, bytesReadPtr); + int bytesRead = Marshal.ReadInt32(bytesReadPtr); + + if (offset > 0) + { + Array.Copy(localBuffer, 0, buffer, offset, bytesRead); + } + + return bytesRead; + } + finally + { + Marshal.FreeCoTaskMem(bytesReadPtr); + } + } + + /// + /// Sets the position within the current stream. + /// + /// A byte offset relative to the origin parameter. + /// A value of type System.IO.SeekOrigin indicating the reference point used to obtain the new position. + /// The new position within the current stream. + public override long Seek(long offset, SeekOrigin origin) + { + this.CheckDisposed(); + int dwOrigin; + + // Maps the SeekOrigin with dworigin more details: https://docs.microsoft.com/en-us/windows/win32/api/objidl/ne-objidl-stream_seek + switch (origin) + { + case SeekOrigin.Begin: + dwOrigin = 0; // STREAM_SEEK_SET + break; + + case SeekOrigin.Current: + dwOrigin = 1; // STREAM_SEEK_CUR + break; + + case SeekOrigin.End: + dwOrigin = 2; // STREAM_SEEK_END + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + IntPtr posPtr = Marshal.AllocCoTaskMem(sizeof(long)); + + try + { + this.stream.Seek(offset, dwOrigin, posPtr); + return Marshal.ReadInt64(posPtr); + } + finally + { + Marshal.FreeCoTaskMem(posPtr); + } + } + + /// + /// Clears all buffers for this stream and causes any buffered data to be written to the underlying device. + /// + /// + /// Not implemented current implementation supports only read. + /// + public override void Flush() + { + throw new NotImplementedException(); + } + + /// + /// Sets the length of the current stream. + /// + /// The desired length of the current stream in bytes. + /// /// + /// Not implemented current implementation supports only read. + /// + public override void SetLength(long value) + { + throw new NotImplementedException(); + } + + /// + /// Writes a sequence of bytes to the current stream and advances the current position within this stream by the number of bytes written. + /// + /// An array of bytes. This method copies count bytes from buffer to the current stream. + /// The zero-based byte offset in buffer at which to begin copying bytes to the current stream. + /// The number of bytes to be written to the current stream. + /// + /// Not implemented current implementation supports only read. + /// + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotImplementedException(); + } + + /// + protected override void Dispose(bool disposing) + { + if (this.stream != null) + { + if (Marshal.IsComObject(this.stream)) + { + Marshal.ReleaseComObject(this.stream); + } + + this.stream = null; + } + } + + private void CheckDisposed() + { + if (this.stream == null) + { + throw new ObjectDisposedException(nameof(StreamWrapper)); + } + } + } +} diff --git a/src/modules/previewpane/common/cominterop/COLORREF.cs b/src/modules/previewpane/common/cominterop/COLORREF.cs new file mode 100644 index 000000000..ef9767516 --- /dev/null +++ b/src/modules/previewpane/common/cominterop/COLORREF.cs @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Drawing; +using System.Runtime.InteropServices; + +namespace Common.ComInterlop +{ + /// + /// The COLORREF value is used to specify an RGB color. + /// + [StructLayout(LayoutKind.Sequential)] + public struct COLORREF + { + /// + /// Stores an RGB color value in a 32 bit integer. + /// + public uint Dword; + + /// + /// Gets RGB value stored in in structure. + /// + public Color Color + { + get + { + return Color.FromArgb( + (int)(0x000000FFU & this.Dword), + (int)(0x0000FF00U & this.Dword) >> 8, + (int)(0x00FF0000U & this.Dword) >> 16); + } + } + } +} diff --git a/src/modules/previewpane/common/cominterop/IInitializeWithFile.cs b/src/modules/previewpane/common/cominterop/IInitializeWithFile.cs new file mode 100644 index 000000000..55eddeec5 --- /dev/null +++ b/src/modules/previewpane/common/cominterop/IInitializeWithFile.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices; + +namespace Common.Cominterop +{ + /// + /// Exposes a method to initialize a handler, such as a property handler, thumbnail handler, or preview handler, with a file path. + /// + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("b7d14566-0509-4cce-a71f-0a554233bd9b")] + public interface IInitializeWithFile + { + /// + /// Initializes a handler with a file path. + /// + /// File Path. + /// Indicate the Access Mode either STGM_READ (Read Only Access) or STGM_READWRITE (Read and Write Access). + void Initialize([MarshalAs(UnmanagedType.LPWStr)] string pszFilePath, uint grfMode); + } +} diff --git a/src/modules/previewpane/common/cominterop/IInitializeWithStream.cs b/src/modules/previewpane/common/cominterop/IInitializeWithStream.cs new file mode 100644 index 000000000..fc36cb3e8 --- /dev/null +++ b/src/modules/previewpane/common/cominterop/IInitializeWithStream.cs @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; + +namespace Common.ComInterlop +{ + /// + /// Exposes a method that initializes a handler, such as a property handler, thumbnail handler, or preview handler, with a stream. + /// + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("b824b49d-22ac-4161-ac8a-9916e8fa3f7f")] + public interface IInitializeWithStream + { + /// + /// Initializes a handler with a stream. + /// + /// A pointer to an interface that represents the stream source. + /// One of the STGM values that indicates the access mode for . + void Initialize(IStream pstream, uint grfMode); + } +} diff --git a/src/modules/previewpane/common/cominterop/IObjectWithSite.cs b/src/modules/previewpane/common/cominterop/IObjectWithSite.cs new file mode 100644 index 000000000..65aa60163 --- /dev/null +++ b/src/modules/previewpane/common/cominterop/IObjectWithSite.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices; + +namespace Common.ComInterlop +{ + /// + /// Provides a simplified way to support communication between an object and its site in the container. + /// + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("fc4801a3-2ba9-11cf-a229-00aa003d7352")] + public interface IObjectWithSite + { + /// + /// Provides the site's pointer to the site object. + /// + /// Address of an interface pointer to the site managing this object. + void SetSite([In, MarshalAs(UnmanagedType.IUnknown)] object pUnkSite); + + /// + /// Retrieves the last site set using the method. In cases where there is no known site, the object returns an exception. + /// + /// Provides the IID of the interface pointer returned in the parameter. + /// The address of the caller's void variable in which the object stores the interface pointer of the site last seen in the . + void GetSite(ref Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object ppvSite); + } +} diff --git a/src/modules/previewpane/common/cominterop/IOleWindow.cs b/src/modules/previewpane/common/cominterop/IOleWindow.cs new file mode 100644 index 000000000..0953a3cd9 --- /dev/null +++ b/src/modules/previewpane/common/cominterop/IOleWindow.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices; + +namespace Common.ComInterlop +{ + /// + /// The IOleWindow interface provides methods that allow an application to obtain the handle to the various windows that participate + /// in in-place activation, and also to enter and exit context-sensitive help mode. + /// + [ComImport] + [Guid("00000114-0000-0000-C000-000000000046")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IOleWindow + { + /// + /// Retrieves a handle to one of the windows participating in in-place activation (frame, document, parent, or in-place object window). + /// + /// A pointer to a variable that receives the window handle. + void GetWindow(out IntPtr phwnd); + + /// + /// Determines whether context-sensitive help mode should be entered during an in-place activation session. + /// + /// TRUE if help mode should be entered; FALSE if it should be exited. + void ContextSensitiveHelp([MarshalAs(UnmanagedType.Bool)] bool fEnterMode); + } +} diff --git a/src/modules/previewpane/common/cominterop/IPreviewHandler.cs b/src/modules/previewpane/common/cominterop/IPreviewHandler.cs new file mode 100644 index 000000000..4f9136449 --- /dev/null +++ b/src/modules/previewpane/common/cominterop/IPreviewHandler.cs @@ -0,0 +1,62 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices; + +namespace Common.ComInterlop +{ + /// + /// Exposes methods for the display of rich previews. + /// + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("8895b1c6-b41f-4c1c-a562-0d564250836f")] + public interface IPreviewHandler + { + /// + /// Sets the parent window of the previewer window, as well as the area within the parent to be used for the previewer window. + /// + /// A handle to the parent window. + /// A pointer to a defining the area for the previewer. + void SetWindow(IntPtr hwnd, ref RECT rect); + + /// + /// Directs the preview handler to change the area within the parent hwnd that it draws into. + /// + /// A pointer to a to be used for the preview. + void SetRect(ref RECT rect); + + /// + /// Directs the preview handler to load data from the source specified in an earlier Initialize method call, and to begin rendering to the previewer window. + /// + void DoPreview(); + + /// + /// Directs the preview handler to cease rendering a preview and to release all resources that have been allocated based on the item passed in during the initialization. + /// + void Unload(); + + /// + /// Directs the preview handler to set focus to itself. + /// + void SetFocus(); + + /// + /// Directs the preview handler to return the HWND from calling the GetFocus Function. + /// + /// When this method returns, contains a pointer to the HWND returned from calling the GetFocus Function from the preview handler's foreground thread. + void QueryFocus(out IntPtr phwnd); + + /// + /// Directs the preview handler to handle a keystroke passed up from the message pump of the process in which the preview handler is running. + /// + /// A pointer to a window message. + /// If the keystroke message can be processed by the preview handler, the handler will process it and return S_OK(0). If the preview handler cannot process the keystroke message, it + /// will offer it to the host using . If the host processes the message, this method will return S_OK(0). If the host does not process the message, this method will return S_FALSE(1). + /// + [PreserveSig] + uint TranslateAccelerator(ref MSG pmsg); + } +} diff --git a/src/modules/previewpane/common/cominterop/IPreviewHandlerFrame.cs b/src/modules/previewpane/common/cominterop/IPreviewHandlerFrame.cs new file mode 100644 index 000000000..e639e3a6d --- /dev/null +++ b/src/modules/previewpane/common/cominterop/IPreviewHandlerFrame.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices; + +namespace Common.ComInterlop +{ + /// + /// Enables preview handlers to pass keyboard shortcuts to the host. This interface retrieves a list of keyboard shortcuts and directs the host to handle a keyboard shortcut. + /// + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("fec87aaf-35f9-447a-adb7-20234491401a")] + public interface IPreviewHandlerFrame + { + /// + /// Gets a list of the keyboard shortcuts for the preview host. + /// + /// A pointer to a PREVIEWHANDLERFRAMEINFO structure + /// that receives accelerator table information. + void GetWindowContext(IntPtr pinfo); + + /// + /// Directs the host to handle an keyboard shortcut passed from the preview handler. + /// + /// A reference to that corresponds to a keyboard shortcut. + /// If the keyboard shortcut is one that the host intends to handle, the host will process it and return S_OK(0); otherwise, it returns S_FALSE(1). + [PreserveSig] + uint TranslateAccelerator(ref MSG pmsg); + } +} diff --git a/src/modules/previewpane/common/cominterop/IPreviewHandlerVisuals.cs b/src/modules/previewpane/common/cominterop/IPreviewHandlerVisuals.cs new file mode 100644 index 000000000..c1bc184df --- /dev/null +++ b/src/modules/previewpane/common/cominterop/IPreviewHandlerVisuals.cs @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices; + +namespace Common.ComInterlop +{ + /// + /// Exposes methods for applying color and font information to preview handlers. + /// + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("8327b13c-b63f-4b24-9b8a-d010dcc3f599")] + public interface IPreviewHandlerVisuals + { + /// + /// Sets the background color of the preview handler. + /// + /// A value of type to use for the preview handler background. + void SetBackgroundColor(COLORREF color); + + /// + /// Sets the font attributes to be used for text within the preview handler. + /// + /// A pointer to a Structure containing the necessary attributes for the font to use. + void SetFont(ref LOGFONT plf); + + /// + /// Sets the color of the text within the preview handler. + /// + /// A value of type to use for the preview handler text color. + void SetTextColor(COLORREF color); + } +} diff --git a/src/modules/previewpane/common/cominterop/LOGFONT.cs b/src/modules/previewpane/common/cominterop/LOGFONT.cs new file mode 100644 index 000000000..8f4e6add2 --- /dev/null +++ b/src/modules/previewpane/common/cominterop/LOGFONT.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Runtime.InteropServices; + +namespace Common.ComInterlop +{ + /// + /// Defines the attributes of a font. + /// + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + public struct LOGFONT + { + /// + /// Value of type INT that specifies the height, in logical units, of the font's character cell or character. + /// + public int LfHeight; + + /// + /// Value of type INT that specifies the width, in logical units, of characters in the font. + /// + public int LfWidth; + + /// + /// Value of type INT that contains the angle, in tenths of degrees, between the escapement vector and the x-axis of the device. The escapement + /// vector is parallel to the base line of a row of text. + /// + public int LfEscapement; + + /// + /// Value of type INT that specifies the angle, in tenths of degrees, between each character's base line and the x-axis of the device. + /// + public int LfOrientation; + + /// + /// Value of type INT that specifies the weight of the font in the range from 0 through 1000. + /// + public int LfWeight; + + /// + /// Value of type BYTE that specifies an italic font if set to TRUE. + /// + public byte LfItalic; + + /// + /// Value of type BYTE that specifies an underlined font if set to TRUE. + /// + public byte LfUnderline; + + /// + /// Value of type BYTE that specifies a strikeout font if set to TRUE. + /// + public byte LfStrikeOut; + + /// + /// Value of type BYTE that specifies the character set. + /// + public byte LfCharSet; + + /// + /// Value of type BYTE that specifies the output precision. The output precision defines how closely the output must match the requested + /// font's height, width, character orientation, escapement, pitch, and font type. + /// + public byte LfOutPrecision; + + /// + /// Value of type BYTE that specifies the clipping precision. The clipping precision defines how to clip characters that are partially outside the clipping region. + /// + public byte LfClipPrecision; + + /// + /// Value of type BYTE that specifies the output quality. The output quality defines how carefully the GDI must attempt to match the logical-font attributes to those of an actual physical font. + /// + public byte LfQuality; + + /// + /// Value of type BYTE that specifies the pitch and family of the font. + /// + public byte LfPitchAndFamily; + + /// + /// Array of wide characters that contains a null-terminated string that specifies the typeface name of the font. The length of the string must not exceed 32 characters, including the NULL terminator. + /// + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] + public string LfFaceName; + } +} diff --git a/src/modules/previewpane/common/cominterop/MSG.cs b/src/modules/previewpane/common/cominterop/MSG.cs new file mode 100644 index 000000000..ba2819ff6 --- /dev/null +++ b/src/modules/previewpane/common/cominterop/MSG.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.InteropServices; + +namespace Common.ComInterlop +{ + /// + /// Contains message information from a thread's message queue. + /// + [StructLayout(LayoutKind.Sequential)] + public struct MSG + { + /// + /// A handle to the window whose window procedure receives the message. This member is NULL when the message is a thread message. + /// + public IntPtr Hwnd; + + /// + /// The message identifier. Applications can only use the low word; the high word is reserved by the system. + /// + public int Message; + + /// + /// Additional information about the message. The exact meaning depends on the value of the message member. + /// + public IntPtr WParam; + + /// + /// Additional information about the message. The exact meaning depends on the value of the message member. + /// + public IntPtr LParam; + + /// + /// The time at which the message was posted. + /// + public int Time; + + /// + /// The x coordinate of cursor position, in screen coordinates, when the message was posted. + /// + public int PtX; + + /// + /// The y coordinate of cursor position, in screen coordinates, when the message was posted. + /// + public int PtY; + } +} diff --git a/src/modules/previewpane/common/cominterop/RECT.cs b/src/modules/previewpane/common/cominterop/RECT.cs new file mode 100644 index 000000000..932f80af0 --- /dev/null +++ b/src/modules/previewpane/common/cominterop/RECT.cs @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Drawing; +using System.Runtime.InteropServices; + +namespace Common.ComInterlop +{ + /// + /// The RECT structure defines a rectangle by the coordinates of its upper-left and lower-right corners. + /// + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + /// + /// Specifies the x-coordinate of the upper-left corner of the rectangle. + /// + public int Left; + + /// + /// Specifies the y-coordinate of the upper-left corner of the rectangle. + /// + public int Top; + + /// + /// Specifies the x-coordinate of the lower-right corner of the rectangle. + /// + public int Right; + + /// + /// Specifies the y-coordinate of the lower-right corner of the rectangle. + /// + public int Bottom; + + /// + /// Creates a structure with the edge locations specified in the struct. + /// + /// Return a . + public Rectangle ToRectangle() + { + return Rectangle.FromLTRB(this.Left, this.Top, this.Right, this.Bottom); + } + } +} diff --git a/src/modules/previewpane/common/controls/FormHandlerControl.cs b/src/modules/previewpane/common/controls/FormHandlerControl.cs new file mode 100644 index 000000000..7c5de7957 --- /dev/null +++ b/src/modules/previewpane/common/controls/FormHandlerControl.cs @@ -0,0 +1,166 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace Common +{ + /// + /// Form based implementation of . + /// + public abstract class FormHandlerControl : Form, IPreviewHandlerControl + { + /// + /// Holds the parent window handle. + /// + private IntPtr parentHwnd; + + /// + /// Initializes a new instance of the class. + /// + public FormHandlerControl() + { + // Gets the handle of the control to create the control on the VI thread. Invoking the Control.Handle get accessor forces the creation of the underlying window for the control. + // This is important, because the thread that instantiates the preview handler component and calls its constructor is a single-threaded apartment (STA) thread, but the thread that calls into the interface members later on is a multithreaded apartment (MTA) thread. Windows Forms controls are meant to run on STA threads. + // More details: https://docs.microsoft.com/en-us/archive/msdn-magazine/2007/january/windows-vista-and-office-writing-your-own-preview-handlers. + var forceCreation = this.Handle; + this.FormBorderStyle = FormBorderStyle.None; + this.Visible = false; + } + + /// + public IntPtr GetHandle() + { + return this.Handle; + } + + /// + public void QueryFocus(out IntPtr result) + { + var getResult = IntPtr.Zero; + this.InvokeOnControlThread(() => + { + getResult = GetFocus(); + }); + result = getResult; + } + + /// + public void SetBackgroundColor(Color argbColor) + { + this.InvokeOnControlThread(() => + { + this.BackColor = argbColor; + }); + } + + /// + public void SetFocus() + { + this.InvokeOnControlThread(() => + { + this.Focus(); + }); + } + + /// + public void SetFont(Font font) + { + this.InvokeOnControlThread(() => + { + this.Font = font; + }); + } + + /// + public void SetRect(Rectangle windowBounds) + { + this.UpdateWindowBounds(windowBounds); + } + + /// + public void SetTextColor(Color color) + { + this.InvokeOnControlThread(() => + { + this.ForeColor = color; + }); + } + + /// + public void SetWindow(IntPtr hwnd, Rectangle rect) + { + this.parentHwnd = hwnd; + this.UpdateWindowBounds(rect); + } + + /// + public virtual void Unload() + { + this.InvokeOnControlThread(() => + { + this.Visible = false; + foreach (Control c in this.Controls) + { + c.Dispose(); + } + + this.Controls.Clear(); + }); + + // Call garbage collection at the time of unloading of Preview. This is to mitigate issue with WebBrowser Control not able to dispose properly. + // Which is preventing prevhost.exe to exit at the time of closing File explorer. + // Preview Handlers run in a separate process from PowerToys. This will not affect the performance of other modules. + // Mitigate the following Github issue: https://github.com/microsoft/PowerToys/issues/1468 + GC.Collect(); + } + + /// + public virtual void DoPreview(T dataSource) + { + this.Visible = true; + } + + /// + /// Executes the specified delegate on the thread that owns the control's underlying window handle. + /// + /// Delegate to run. + public void InvokeOnControlThread(MethodInvoker func) + { + this.Invoke(func); + } + + /// + /// Changes the parent window of the specified child window. + /// + /// A handle to the child window. + /// A handle to the new parent window. + /// If the function succeeds, the return value is a handle to the previous parent window and NULL in case of failure. + [DllImport("user32.dll")] + private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); + + /// + /// Retrieves the handle to the window that has the keyboard focus, if the window is attached to the calling thread's message queue. + /// + /// The return value is the handle to the window with the keyboard focus. If the calling thread's message queue does not have an associated window with the keyboard focus, the return value is NULL. + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern IntPtr GetFocus(); + + /// + /// Update the Form Control window with the passed rectangle. + /// + /// An instance of rectangle. + private void UpdateWindowBounds(Rectangle windowBounds) + { + this.InvokeOnControlThread(() => + { + SetParent(this.Handle, this.parentHwnd); + this.Bounds = windowBounds; + }); + } + } +} diff --git a/src/modules/previewpane/common/controls/IPreviewHandlerControl.cs b/src/modules/previewpane/common/controls/IPreviewHandlerControl.cs new file mode 100644 index 000000000..77308e191 --- /dev/null +++ b/src/modules/previewpane/common/controls/IPreviewHandlerControl.cs @@ -0,0 +1,77 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Drawing; + +namespace Common +{ + /// + /// Interface defining methods requirement by the control. + /// + public interface IPreviewHandlerControl + { + /// + /// Directs the preview handler to return the HWND from calling the GetFocus function. + /// Source: https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ipreviewhandler-queryfocus. + /// + /// Returns the handle of the window with focus. + void QueryFocus(out IntPtr result); + + /// + /// Sets focus to the control. + /// + void SetFocus(); + + /// + /// Sets the font according to the font set in Windows Settings. + /// More details: https://docs.microsoft.com/en-us/windows/win32/shell/building-preview-handlers#ipreviewhandlervisualssetfont. + /// + /// Instance of Font. + void SetFont(Font font); + + /// + /// Sets the Text color according to the Windows Settings. + /// + /// Instance of color. + void SetTextColor(Color color); + + /// + /// Sets the Background color. For instance to fill the window when the handler renders to area smaller provided by SetWindow and SetRect. + /// + /// Instance of color. + void SetBackgroundColor(Color argbColor); + + /// + /// Gets the HWND of the control window. + /// + /// Pointer to the window handle. + IntPtr GetHandle(); + + /// + /// Hide the preview and free any resource used for the preview. + /// + void Unload(); + + /// + /// Directs the control to change the area within the parent hwnd that it draws into. + /// + /// Instance of Rectangle defining the area. + void SetRect(Rectangle windowBounds); + + /// + /// Sets the parent window of the previewer window, as well as the area within the parent to be used for the previewer window.. + /// + /// Pointer to the parent window handle. + /// Instance of Rectangle defining the area. + void SetWindow(IntPtr hwnd, Rectangle rect); + + /// + /// Called by Preview Handler to start the preview. + /// + /// File Path or Stream reference for the file. + /// Represents the source of preview data. + void DoPreview(T dataSource); + } +} diff --git a/src/modules/previewpane/common/controls/WebBrowserDownloadControlFlags.cs b/src/modules/previewpane/common/controls/WebBrowserDownloadControlFlags.cs new file mode 100644 index 000000000..6023950f8 --- /dev/null +++ b/src/modules/previewpane/common/controls/WebBrowserDownloadControlFlags.cs @@ -0,0 +1,108 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; + +/// +/// Flags to control download and execution in Web Browser Control. +/// Values of flags are defined in mshtmdid.h in distributed Windows Sdk. +/// +[Flags] +public enum WebBrowserDownloadControlFlags : int +{ + /// + /// Images will be downloaded from the server if this flag is set. + /// + DLIMAGES = 0x00000010, + + /// + /// Videos will be downloaded from the server if this flag is set. + /// + VIDEOS = 0x00000020, + + /// + /// Background sounds will be downloaded from the server if this flag is set. + /// + BGSOUNDS = 0x00000040, + + /// + /// Scripts will not be executed. + /// + NO_SCRIPTS = 0x00000080, + + /// + /// Java applets will not be executed. + /// + NO_JAVA = 0x00000100, + + /// + /// ActiveX controls will not be executed. + /// + NO_RUNACTIVEXCTLS = 0x00000200, + + /// + /// ActiveX controls will not be downloaded. + /// + NO_DLACTIVEXCTLS = 0x00000400, + + /// + /// The page will only be downloaded, not displayed. + /// + DOWNLOADONLY = 0x00000800, + + /// + /// WebBrowser Control will download and parse a frameSet, but not the individual frame objects within the frameSet. + /// + NO_FRAMEDOWNLOAD = 0x00001000, + + /// + /// The server will be asked for update status. Cached files will be used if the server indicates that the cached information is up-to-date. + /// + RESYNCHRONIZE = 0x00002000, + + /// + /// Files will be re-downloaded from the server regardless of the update status of the files. + /// + PRAGMA_NO_CACHE = 0x00004000, + + /// + /// Behaviors are not downloaded and are disabled in the document. + /// + NO_BEHAVIORS = 0x00008000, + + /// + /// Character sets specified in meta elements are suppressed. + /// + NO_METACHARSET = 0x00010000, + + /// + /// The browsing component will disable UTF-8 encoding. + /// + URL_ENCODING_DISABLE_UTF8 = 0x00020000, + + /// + /// The browsing component will enable UTF-8 encoding. + /// + URL_ENCODING_ENABLE_UTF8 = 0x00040000, + + /// + /// No Documentation Available. + /// + NOFRAMES = 0x00080000, + + /// + /// WebBrowser Control always operates in offline mode. + /// + FORCEOFFLINE = 0x10000000, + + /// + /// No client pull operations will be performed. + /// + NO_CLIENTPULL = 0x20000000, + + /// + /// No user interface will be displayed during downloads. + /// + SILENT = 0x40000000, +} diff --git a/src/modules/previewpane/common/controls/WebBrowserExt.cs b/src/modules/previewpane/common/controls/WebBrowserExt.cs new file mode 100644 index 000000000..9fb8b253a --- /dev/null +++ b/src/modules/previewpane/common/controls/WebBrowserExt.cs @@ -0,0 +1,138 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Globalization; +using System.Reflection; +using System.Windows.Forms; + +namespace PreviewHandlerCommon +{ + /// + /// Customized the WebBrowser to get control over what it downloads, displays and executes. + /// + public class WebBrowserExt : WebBrowser + { + /// + protected override WebBrowserSiteBase CreateWebBrowserSiteBase() + { + // Returns instance of WebBrowserSiteExt. + return new WebBrowserSiteExt(this); + } + + /// + /// Extend the WebBrowserSite with IDispatch implementation to handle the DISPID_AMBIENT_DLCONTROL. + /// More details: https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa770041(v=vs.85)?redirectedfrom=MSDN#controlling-download-and-execution. + /// + protected class WebBrowserSiteExt : WebBrowserSite, IReflect + { + // Dispid of DISPID_AMBIENT_DLCONTROL is defined in MsHtmdid.h header file in distributed Windows Sdk component. + private const string DISPIDAMBIENTDLCONTROL = "[DISPID=-5512]"; + private WebBrowserExt browserExtControl; + + /// + /// Initializes a new instance of the class. + /// + /// Browser Control Instance pass to the site. + public WebBrowserSiteExt(WebBrowserExt browserControl) + : base(browserControl) + { + this.browserExtControl = browserControl; + } + + /// + public Type UnderlyingSystemType + { + get { return this.GetType(); } + } + + /// + public object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) + { + object result; + if (name.Equals(DISPIDAMBIENTDLCONTROL)) + { + result = Convert.ToInt32( + WebBrowserDownloadControlFlags.PRAGMA_NO_CACHE | + WebBrowserDownloadControlFlags.FORCEOFFLINE | + WebBrowserDownloadControlFlags.NO_CLIENTPULL | + WebBrowserDownloadControlFlags.NO_SCRIPTS | + WebBrowserDownloadControlFlags.NO_JAVA | + WebBrowserDownloadControlFlags.NO_FRAMEDOWNLOAD | + WebBrowserDownloadControlFlags.NOFRAMES | + WebBrowserDownloadControlFlags.NO_DLACTIVEXCTLS | + WebBrowserDownloadControlFlags.NO_RUNACTIVEXCTLS | + WebBrowserDownloadControlFlags.NO_BEHAVIORS | + WebBrowserDownloadControlFlags.SILENT); + } + else + { + result = this.GetType().InvokeMember(name, invokeAttr, binder, target, args, modifiers, culture, namedParameters); + } + + return result; + } + + /// + public FieldInfo[] GetFields(BindingFlags bindingAttr) + { + return this.GetType().GetFields(bindingAttr); + } + + /// + public MethodInfo[] GetMethods(BindingFlags bindingAttr) + { + return this.GetType().GetMethods(bindingAttr); + } + + /// + public PropertyInfo[] GetProperties(BindingFlags bindingAttr) + { + return this.GetType().GetProperties(bindingAttr); + } + + /// + public FieldInfo GetField(string name, BindingFlags bindingAttr) + { + return this.GetType().GetField(name, bindingAttr); + } + + /// + public MemberInfo[] GetMember(string name, BindingFlags bindingAttr) + { + return this.GetType().GetMember(name, bindingAttr); + } + + /// + public MemberInfo[] GetMembers(BindingFlags bindingAttr) + { + return this.GetType().GetMembers(bindingAttr); + } + + /// + public MethodInfo GetMethod(string name, BindingFlags bindingAttr) + { + return this.GetType().GetMethod(name, bindingAttr); + } + + /// + public MethodInfo GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) + { + return this.GetType().GetMethod(name, bindingAttr, binder, types, modifiers); + } + + /// + public PropertyInfo GetProperty(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, ParameterModifier[] modifiers) + { + return this.GetType().GetProperty(name, bindingAttr, binder, returnType, types, modifiers); + } + + /// + public PropertyInfo GetProperty(string name, BindingFlags bindingAttr) + { + return this.GetType().GetProperty(name, bindingAttr); + } + } + } +} diff --git a/src/modules/previewpane/common/examplehandler/CustomControlTest.cs b/src/modules/previewpane/common/examplehandler/CustomControlTest.cs new file mode 100644 index 000000000..c06f28809 --- /dev/null +++ b/src/modules/previewpane/common/examplehandler/CustomControlTest.cs @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.IO; +using System.Windows.Forms; + +namespace Common +{ + /// + /// This is test custom control to test the implementation. + /// + public class CustomControlTest : FormHandlerControl + { + /// + /// Start the preview on the Control. + /// + /// Path to the file. + public override void DoPreview(T dataSource) + { + this.InvokeOnControlThread(() => + { + var filePath = dataSource as string; + WebBrowser browser = new WebBrowser(); + + browser.DocumentText = "Test"; + browser.Navigate(filePath); + browser.Dock = DockStyle.Fill; + browser.IsWebBrowserContextMenuEnabled = false; + this.Controls.Add(browser); + base.DoPreview(dataSource); + }); + } + } +} diff --git a/src/modules/previewpane/common/examplehandler/TestCustomHandler.cs b/src/modules/previewpane/common/examplehandler/TestCustomHandler.cs new file mode 100644 index 000000000..5abf68ee3 --- /dev/null +++ b/src/modules/previewpane/common/examplehandler/TestCustomHandler.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Runtime.InteropServices; + +namespace Common +{ + /// + /// This is a example custom handler to show how to extend the library. + /// + [Guid("22a1a8e8-e929-4732-90ce-91eaff38b614")] + [ClassInterface(ClassInterfaceType.None)] + [ComVisible(true)] + public class TestCustomHandler : FileBasedPreviewHandler + { + private CustomControlTest previewHandlerControl; + + /// + public override void DoPreview() + { + this.previewHandlerControl.DoPreview(this.FilePath); + } + + /// + protected override IPreviewHandlerControl CreatePreviewHandlerControl() + { + this.previewHandlerControl = new CustomControlTest(); + return this.previewHandlerControl; + } + } +} diff --git a/src/modules/previewpane/common/handlers/FileBasedPreviewHandler.cs b/src/modules/previewpane/common/handlers/FileBasedPreviewHandler.cs new file mode 100644 index 000000000..c4ca04c9e --- /dev/null +++ b/src/modules/previewpane/common/handlers/FileBasedPreviewHandler.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Runtime.InteropServices; +using Common.Cominterop; + +namespace Common +{ + /// + /// Extends the by implementing IInitializeWithFile. + /// + public abstract class FileBasedPreviewHandler : PreviewHandlerBase, IInitializeWithFile + { + /// + /// Gets the file path. + /// + public string FilePath { get; private set; } + + /// + public void Initialize([MarshalAs(UnmanagedType.LPWStr)] string pszFilePath, uint grfMode) + { + // Ignore the grfMode always use read mode to access the file. + this.FilePath = pszFilePath; + } + } +} diff --git a/src/modules/previewpane/common/handlers/PreviewHandlerBase.cs b/src/modules/previewpane/common/handlers/PreviewHandlerBase.cs new file mode 100644 index 000000000..7d84e0cc5 --- /dev/null +++ b/src/modules/previewpane/common/handlers/PreviewHandlerBase.cs @@ -0,0 +1,158 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.ComponentModel; +using System.Drawing; +using System.Runtime.InteropServices; +using Common.ComInterlop; +using Microsoft.Win32; + +namespace Common +{ + /// + /// Preview Handler base class implmenenting interfaces required by Preview Handler. + /// + public abstract class PreviewHandlerBase : IPreviewHandler, IOleWindow, IObjectWithSite, IPreviewHandlerVisuals + { + /// + /// An instance of Preview Control Used by the Handler. + /// + private IPreviewHandlerControl previewControl; + + /// + /// Hold reference for the window handle. + /// + private IntPtr parentHwnd; + + /// + /// Hold the bounds of the window. + /// + private Rectangle windowBounds; + + /// + /// Holds the site pointer. + /// + private object unkSite; + + /// + /// Holds reference for the IPreviewHandlerFrame. + /// + private IPreviewHandlerFrame frame; + + /// + /// Initializes a new instance of the class. + /// + public PreviewHandlerBase() + { + this.previewControl = this.CreatePreviewHandlerControl(); + } + + /// + public abstract void DoPreview(); + + /// + public void SetWindow(IntPtr hwnd, ref RECT rect) + { + this.parentHwnd = hwnd; + this.windowBounds = rect.ToRectangle(); + this.previewControl.SetWindow(hwnd, this.windowBounds); + } + + /// + public void SetRect(ref RECT rect) + { + this.windowBounds = rect.ToRectangle(); + this.previewControl.SetRect(this.windowBounds); + } + + /// + public void Unload() + { + this.previewControl.Unload(); + } + + /// + public void SetFocus() + { + this.previewControl.SetFocus(); + } + + /// + public void QueryFocus(out IntPtr phwnd) + { + this.previewControl.QueryFocus(out IntPtr result); + phwnd = result; + if (phwnd == IntPtr.Zero) + { + throw new Win32Exception(); + } + } + + /// + public uint TranslateAccelerator(ref MSG pmsg) + { + // Current implementation simply directs all Keystrokes to IPreviewHandlerFrame. This is the recommended approach to handle keystokes for all low-integrity preview handlers. + // Source: https://docs.microsoft.com/en-us/windows/win32/shell/building-preview-handlers#ipreviewhandlertranslateaccelerator + if (this.frame != null) + { + return this.frame.TranslateAccelerator(ref pmsg); + } + + const uint S_FALSE = 1; + return S_FALSE; + } + + /// + public void GetWindow(out IntPtr phwnd) + { + phwnd = this.previewControl.GetHandle(); + } + + /// + public void ContextSensitiveHelp(bool fEnterMode) + { + // Should always return NotImplementedException. Source: https://docs.microsoft.com/en-us/windows/win32/shell/building-preview-handlers#iolewindowcontextsensitivehelp + throw new NotImplementedException(); + } + + /// + public void SetSite(object pUnkSite) + { + // Implementation logic details: https://docs.microsoft.com/en-us/windows/win32/shell/building-preview-handlers#iobjectwithsitesetsite + this.unkSite = pUnkSite; + this.frame = this.unkSite as IPreviewHandlerFrame; + } + + /// + public void GetSite(ref Guid riid, out object ppvSite) + { + ppvSite = this.unkSite; + } + + /// + public void SetBackgroundColor(COLORREF color) + { + this.previewControl.SetBackgroundColor(color.Color); + } + + /// + public void SetFont(ref LOGFONT plf) + { + this.previewControl.SetFont(Font.FromLogFont(plf)); + } + + /// + public void SetTextColor(COLORREF color) + { + this.previewControl.SetTextColor(color.Color); + } + + /// + /// Provide instance of the implementation of . Should be overide by the implementation class with control object to be used. + /// + /// Instance of the . + protected abstract IPreviewHandlerControl CreatePreviewHandlerControl(); + } +} diff --git a/src/modules/previewpane/common/handlers/StreamBasedPreviewHandler.cs b/src/modules/previewpane/common/handlers/StreamBasedPreviewHandler.cs new file mode 100644 index 000000000..8412dd7b9 --- /dev/null +++ b/src/modules/previewpane/common/handlers/StreamBasedPreviewHandler.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Runtime.InteropServices.ComTypes; +using Common.ComInterlop; + +namespace Common +{ + /// + /// Extends the by implementing IInitializeWithStream. + /// + public abstract class StreamBasedPreviewHandler : PreviewHandlerBase, IInitializeWithStream + { + /// + /// Gets the stream object to access file. + /// + public IStream Stream { get; private set; } + + /// + public void Initialize(IStream pstream, uint grfMode) + { + // Ignore the grfMode always use read mode to access the file. + this.Stream = pstream; + } + } +} diff --git a/src/modules/previewpane/powerpreview/CLSID.h b/src/modules/previewpane/powerpreview/CLSID.h new file mode 100644 index 000000000..9c3c23ddd --- /dev/null +++ b/src/modules/previewpane/powerpreview/CLSID.h @@ -0,0 +1,23 @@ +#pragma once +#include + +// 74619BDA-A66B-451D-864C-A7726F5FE650 +// CLSID used in manifest file for Preview Handler. +const CLSID CLSID_SHIMActivateSvgPreviewHandler = { 0x74619BDA, 0xA66B, 0x451D, { 0x86, 0x4C, 0xA7, 0x72, 0x6F, 0x5F, 0xE6, 0x50 } }; + +// ddee2b8a-6807-48a6-bb20-2338174ff779 +// CLSID of the .Net Com Class for Preview Handler. Should be included in the registry.dat file under \Classes\CLSID\{guid}. +// More details here: https://docs.microsoft.com/en-us/dotnet/framework/interop/registering-assemblies-with-com +const CLSID CLSID_SvgPreviewHandler = { 0xddee2b8a, 0x6807, 0x48a6, { 0xbb, 0x20, 0x23, 0x38, 0x17, 0x4f, 0xf7, 0x79 } }; + +// E0907A95-6F9A-4D1B-A97A-7D9D2648881E +const CLSID CLSID_SHIMActivateMdPreviewHandler = { 0xE0907A95, 0x6F9A, 0x4D1B, { 0xA9, 0x7A, 0x7D, 0x9D, 0x26, 0x48, 0x88, 0x1E } }; + +// 45769bcc-e8fd-42d0-947e-02beef77a1f5 +const CLSID CLSID_MdPreviewHandler = { 0x45769bcc, 0xe8fd, 0x42d0, { 0x94, 0x7e, 0x02, 0xbe, 0xef, 0x77, 0xa1, 0xf5 } }; + +// Pairs of NativeClsid vs ManagedClsid used for preview handlers. +const std::vector> NativeToManagedClsid({ + { CLSID_SHIMActivateMdPreviewHandler, CLSID_MdPreviewHandler }, + { CLSID_SHIMActivateSvgPreviewHandler, CLSID_SvgPreviewHandler } +}); \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/dllmain.cpp b/src/modules/previewpane/powerpreview/dllmain.cpp new file mode 100644 index 000000000..aaee36bad --- /dev/null +++ b/src/modules/previewpane/powerpreview/dllmain.cpp @@ -0,0 +1,55 @@ +#include "pch.h" +#include +#include "trace.h" +#include "powerpreview.h" +#include "CLSID.h" + +// Logic to shim the Activation of .Net Assembly by calling CoGetClassObject. CLSID's of Preview Handlers should be present in the registry.dat under /Classes/CLSID/{guid}. +// See the existing Preview Handlers registry entry in registry.reg file. +// This is required since MSIX currently not support .Net Assembly for Com Activation for Preview Handlers. +HRESULT CALLBACK DllGetClassObject(REFCLSID clsid, REFIID riid, void** ppv) +{ + *ppv = NULL; + HRESULT hr = CLASS_E_CLASSNOTAVAILABLE; + + for (auto handler : NativeToManagedClsid) + { + if (handler.first == clsid) + { + hr = CoGetClassObject(handler.second, CLSCTX_INPROC_SERVER, NULL, riid, ppv); + break; + } + } + + // In case of failed error code return by CoGetClassObject return CLASS_E_CLASSNOTAVAILABLE to the caller. + if (FAILED(hr)) + { + hr = CLASS_E_CLASSNOTAVAILABLE; + *ppv = NULL; + } + + return hr; +} + +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + Trace::RegisterProvider(); + break; + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + case DLL_PROCESS_DETACH: + Trace::UnregisterProvider(); + break; + } + return TRUE; +} + + +extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create() +{ + return new PowerPreviewModule(); +} diff --git a/src/modules/previewpane/powerpreview/pch.cpp b/src/modules/previewpane/powerpreview/pch.cpp new file mode 100644 index 000000000..a3d1ff422 --- /dev/null +++ b/src/modules/previewpane/powerpreview/pch.cpp @@ -0,0 +1,3 @@ +#include "pch.h" +#pragma comment(lib, "windowsapp") +#pragma comment(lib, "shlwapi.lib") \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/pch.h b/src/modules/previewpane/powerpreview/pch.h new file mode 100644 index 000000000..f7efdb5cf --- /dev/null +++ b/src/modules/previewpane/powerpreview/pch.h @@ -0,0 +1,5 @@ +#pragma once +#define WIN32_LEAN_AND_MEAN +#include +#include +#include \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/powerpreview.cpp b/src/modules/previewpane/powerpreview/powerpreview.cpp new file mode 100644 index 000000000..67fd3fe9f --- /dev/null +++ b/src/modules/previewpane/powerpreview/powerpreview.cpp @@ -0,0 +1,134 @@ +#include "pch.h" +#include +#include +#include +#include +#include "powerpreview.h" +#include "trace.h" +#include "settings.h" +#include "resource.h" + +// Destroy the powertoy and free memory. +void PowerPreviewModule::destroy() +{ + Trace::Destroyed(); + for (FileExplorerPreviewSettings* previewHandler : this->m_previewHandlers) + { + if (previewHandler != NULL) + { + delete previewHandler; + } + } + + delete this; +} + +// Return the display name of the powertoy, this will be cached. +const wchar_t* PowerPreviewModule::get_name() +{ + return m_moduleName.c_str(); +} + +const wchar_t** PowerPreviewModule::get_events() +{ + return nullptr; +} + +// Return JSON with the configuration options. +bool PowerPreviewModule::get_config(_Out_ wchar_t* buffer, _Out_ int* buffer_size) +{ + HINSTANCE hinstance = reinterpret_cast(&__ImageBase); + + // Create a Settings object. + PowerToysSettings::Settings settings(hinstance, get_name()); + + // General Settings. + settings.set_description(GET_RESOURCE_STRING(IDS_GENERAL_DESCRIPTION)); + settings.set_icon_key(GET_RESOURCE_STRING(IDS_ICON_KEY_NAME)); + + // Preview Pane: Settings Group Header. + settings.add_header_szLarge( + GET_RESOURCE_STRING(IDS_PRVPANE_FILE_PREV_STTNGS_GROUP_HEADER_ID), + GET_RESOURCE_STRING(IDS_PRVPANE_FILE_PREV_STTNGS_GROUP_DESC), + GET_RESOURCE_STRING(IDS_PRVPANE_FILE_PREV_STTNGS_GROUP_TEXT)); + + for (FileExplorerPreviewSettings * previewHandler : this->m_previewHandlers) + { + settings.add_bool_toogle( + previewHandler->GetName(), + previewHandler->GetDescription(), + previewHandler->GetState()); + } + + return settings.serialize_to_buffer(buffer, buffer_size); +} + +// Called by the runner to pass the updated settings values as a serialized JSON. +void PowerPreviewModule::set_config(const wchar_t* config) +{ + try + { + PowerToysSettings::PowerToyValues values = PowerToysSettings::PowerToyValues::from_json_string(config); + + for (FileExplorerPreviewSettings * previewHandler : this->m_previewHandlers) + { + previewHandler->UpdateState(values); + } + + values.save_to_settings_file(); + } + catch (std::exception const& e) + { + Trace::SetConfigInvalidJSON(e.what()); + } +} + +// Enable preview handlers. +void PowerPreviewModule::enable() +{ + init_settings(); + this->m_enabled = true; +} + +// Disable all preview handlers. +void PowerPreviewModule::disable() +{ + for (FileExplorerPreviewSettings * previewHandler : this->m_previewHandlers) + { + previewHandler->DisablePreview(); + } + this->m_enabled = false; +} + +// Returns if the powertoys is enabled +bool PowerPreviewModule::is_enabled() +{ + return this->m_enabled; +} + +// Handle incoming event, data is event-specific +intptr_t PowerPreviewModule::signal_event(const wchar_t* name, intptr_t data) +{ + return 0; +} + +// Load the settings file. +void PowerPreviewModule::init_settings() +{ + try + { + // Load and parse the settings file for this PowerToy. + PowerToysSettings::PowerToyValues settings = + PowerToysSettings::PowerToyValues::load_from_settings_file(PowerPreviewModule::get_name()); + + // Load settings states. + for (FileExplorerPreviewSettings * previewHandler : this->m_previewHandlers) + { + previewHandler->LoadState(settings); + } + } + catch (std::exception const& e) + { + Trace::InitSetErrorLoadingFile(e.what()); + } +} \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/powerpreview.def b/src/modules/previewpane/powerpreview/powerpreview.def new file mode 100644 index 000000000..6e60979dc --- /dev/null +++ b/src/modules/previewpane/powerpreview/powerpreview.def @@ -0,0 +1,2 @@ +EXPORTS + DllGetClassObject PRIVATE \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/powerpreview.h b/src/modules/previewpane/powerpreview/powerpreview.h new file mode 100644 index 000000000..acfd2e081 --- /dev/null +++ b/src/modules/previewpane/powerpreview/powerpreview.h @@ -0,0 +1,59 @@ +#include "pch.h" +#include +#include +#include "trace.h" +#include "settings.h" +#include "registry_wrapper.h" + +using namespace PowerPreviewSettings; + +extern "C" IMAGE_DOS_HEADER __ImageBase; + +// Implement the PowerToy Module Interface and all the required methods. +class PowerPreviewModule : public PowertoyModuleIface +{ +private: + // The PowerToy state. + bool m_enabled = false; + std::wstring m_moduleName; + std::vector m_previewHandlers; + +public: + PowerPreviewModule() : + m_moduleName(GET_RESOURCE_STRING(IDS_MODULE_NAME)), + m_previewHandlers( + { // SVG Preview Hanlder settings object. + new FileExplorerPreviewSettings( + false, + GET_RESOURCE_STRING(IDS_PREVPANE_SVG_BOOL_TOGGLE_CONTROLL), + GET_RESOURCE_STRING(IDS_PREVPANE_SVG_SETTINGS_DESCRIPTION), + L"{ddee2b8a-6807-48a6-bb20-2338174ff779}", + GET_RESOURCE_STRING(IDS_PREVPANE_SVG_SETTINGS_DISPLAYNAME), + new RegistryWrapper()), + + // MarkDown Preview Handler Settings Object. + new FileExplorerPreviewSettings( + false, + GET_RESOURCE_STRING(IDS_PREVPANE_MD_BOOL_TOGGLE_CONTROLL), + GET_RESOURCE_STRING(IDS_PREVPANE_MD_SETTINGS_DESCRIPTION), + L"{45769bcc-e8fd-42d0-947e-02beef77a1f5}", + GET_RESOURCE_STRING(IDS_PREVPANE_MD_SETTINGS_DISPLAYNAME), + new RegistryWrapper()) + }) + { + init_settings(); + }; + + virtual void destroy(); + virtual const wchar_t* get_name(); + virtual const wchar_t** get_events(); + virtual bool get_config(_Out_ wchar_t* buffer, _Out_ int* buffer_size); + virtual void set_config(const wchar_t* config); + virtual void enable(); + virtual void disable(); + virtual bool is_enabled(); + virtual void init_settings(); + virtual intptr_t signal_event(const wchar_t* name, intptr_t data); + virtual void register_system_menu_helper(PowertoySystemMenuIface* helper) override {} + virtual void signal_system_menu_action(const wchar_t* name) override {} +}; \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/powerpreview.rc b/src/modules/previewpane/powerpreview/powerpreview.rc new file mode 100644 index 000000000..05d0ed538 --- /dev/null +++ b/src/modules/previewpane/powerpreview/powerpreview.rc @@ -0,0 +1,78 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE 9, 1 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// +STRINGTABLE +BEGIN + IDS_GENERAL_DESCRIPTION L"These settings allow you to manage your Windows File Explorer Addons."; + IDS_MODULE_NAME L"File Explorer Preview"; + IDS_ICON_KEY_NAME L"pt-power-preview"; + IDS_EXPLR_ICONS_PREV_STTNGS_GROUP_HEADER_ID L"EXPLR_ICONS_PREV_STTNGS_GROUP_HEADER_ID"; + IDS_EXPLR_ICONS_PREV_STTNGS_GROUP_DESC L"Settings Group Header Text"; + IDS_EXPLR_ICONS_PREV_STTNGS_GROUP_TEXT L"Explorer Icons"; + IDS_PRVPANE_FILE_PREV_STTNGS_GROUP_HEADER_ID L"PRVPANE_FILE_PREV_STTNGS_GROUP_HEADER_ID"; + IDS_PRVPANE_FILE_PREV_STTNGS_GROUP_DESC L"Settings Group Header Text"; + IDS_PRVPANE_FILE_PREV_STTNGS_GROUP_TEXT L"Preview Pane"; + IDS_PREVPANE_MD_BOOL_TOGGLE_CONTROLL L"PREVPANE_MD_BOOL_TOGGLE_CONTROLL_ID" + IDS_PREVPANE_MD_SETTINGS_DESCRIPTION L"Markdown Preview Handler" + IDS_PREVPANE_MD_SETTINGS_DISPLAYNAME L"Markdown Preview Handler" + IDS_PREVPANE_SVG_BOOL_TOGGLE_CONTROLL L"IDS_PREVPANE_SVG_BOOL_TOGGLE_CONTROLL" + IDS_PREVPANE_SVG_SETTINGS_DESCRIPTION L"Svg Preview Handler" + IDS_PREVPANE_SVG_SETTINGS_DISPLAYNAME L"SVG Preview Handler" + IDS_EXPLR_SVG_BOOL_TOGGLE_CONTROLL L"EXPLR_SVG_BOOL_TOGGLE_CONTROLL" + IDS_EXPLR_SVG_SETTINGS_DESCRIPTION L"Render SVG images" +END + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/src/modules/previewpane/powerpreview/powerpreview.vcxproj b/src/modules/previewpane/powerpreview/powerpreview.vcxproj new file mode 100644 index 000000000..83319e2ae --- /dev/null +++ b/src/modules/previewpane/powerpreview/powerpreview.vcxproj @@ -0,0 +1,136 @@ + + + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {217DF501-135C-4E38-BFC8-99D4821032EA} + Win32Proj + examplepowertoy + 10.0 + powerpreview + + + + DynamicLibrary + true + v142 + Unicode + + + DynamicLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + + + true + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\modules\ + + + + Use + Level3 + Disabled + true + _DEBUG;EXAMPLEPOWERTOY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + ..\;..\..\..\common;..\..\..\common\telemetry;..\..\;..\..\..\;..\..\..\..\deps\cpprestsdk\include;%(AdditionalIncludeDirectories) + MultiThreadedDebug + stdcpplatest + + + Windows + true + $(OutDir)$(TargetName)$(TargetExt) + powerpreview.def + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;EXAMPLEPOWERTOY_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + ..\..\..\common\Telemetry;..\..\..\common;..\..\common\inc;..\common\Telemetry;..\;..\..\;..\..\..\deps\cpprestsdk\include;%(AdditionalIncludeDirectories) + MultiThreaded + stdcpplatest + + + Windows + true + true + true + $(OutDir)$(TargetName)$(TargetExt) + powerpreview.def + + + + + + + + + + + + + + + Create + Create + pch.h + pch.h + + + + + + + + + + + + + {74485049-c722-400f-abe5-86ac52d929b3} + + + + + + + + + \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/powerpreview.vcxproj.filters b/src/modules/previewpane/powerpreview/powerpreview.vcxproj.filters new file mode 100644 index 000000000..6d1922795 --- /dev/null +++ b/src/modules/previewpane/powerpreview/powerpreview.vcxproj.filters @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/registry_wrapper.cpp b/src/modules/previewpane/powerpreview/registry_wrapper.cpp new file mode 100644 index 000000000..18ea8dd80 --- /dev/null +++ b/src/modules/previewpane/powerpreview/registry_wrapper.cpp @@ -0,0 +1,64 @@ +#include +#include "registry_wrapper.h" + +namespace PowerPreviewSettings +{ + LONG RegistryWrapper::SetRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName, DWORD dwType, CONST BYTE* data, DWORD cbData) + { + HKEY OpenResult; + LONG err = RegOpenKeyExW(keyScope, subKey, 0, KEY_WRITE, &OpenResult); + + if (err == ERROR_SUCCESS) + { + err = RegSetValueExW( + OpenResult, + valueName, + 0, // This parameter is reserved and must be zero. + dwType, + data, + cbData); + RegCloseKey(OpenResult); + } + + return err; + } + + LONG RegistryWrapper::GetRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName, DWORD dwType, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData) + { + HKEY OpenResult; + LONG err = RegOpenKeyExW(keyScope, subKey, 0, KEY_READ, &OpenResult); + + if (err == ERROR_SUCCESS) + { + err = RegGetValueW( + OpenResult, + NULL, + valueName, + RRF_RT_ANY, + pdwType, + pvData, + pcbData); + RegCloseKey(OpenResult); + } + + return err; + } + + LONG RegistryWrapper::DeleteRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName) + { + HKEY OpenResult; + LONG err = RegOpenKeyExW(keyScope, subKey, 0, KEY_WRITE, &OpenResult); + + if (err == ERROR_SUCCESS) + { + err = RegDeleteKeyValueW( + OpenResult, + NULL, + valueName); + RegCloseKey(OpenResult); + } + + return err; + } +} + \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/registry_wrapper.h b/src/modules/previewpane/powerpreview/registry_wrapper.h new file mode 100644 index 000000000..906040bce --- /dev/null +++ b/src/modules/previewpane/powerpreview/registry_wrapper.h @@ -0,0 +1,13 @@ +#pragma once +#include "registry_wrapper_interface.h" + +namespace PowerPreviewSettings +{ + class RegistryWrapper : public RegistryWrapperIface + { + public: + virtual LONG SetRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName, DWORD dwType, CONST BYTE* data, DWORD cbData); + virtual LONG DeleteRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName); + virtual LONG GetRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName, DWORD dwType, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData); + }; +} \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/registry_wrapper_interface.h b/src/modules/previewpane/powerpreview/registry_wrapper_interface.h new file mode 100644 index 000000000..2b1485271 --- /dev/null +++ b/src/modules/previewpane/powerpreview/registry_wrapper_interface.h @@ -0,0 +1,14 @@ +#pragma once + +class RegistryWrapperIface +{ +public: + // Sets a registry value under the mentioned scope(HKCR, HKLM, etc). + virtual LONG SetRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName, DWORD dwType, CONST BYTE* data, DWORD cbData) = 0; + + // Delete a registry value. + virtual LONG DeleteRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName) = 0; + + // Reads a registry value. + virtual LONG GetRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName, DWORD dwType, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData) = 0; +}; \ No newline at end of file diff --git a/src/modules/previewpane/powerpreview/resource.h b/src/modules/previewpane/powerpreview/resource.h new file mode 100644 index 000000000..939a5addf --- /dev/null +++ b/src/modules/previewpane/powerpreview/resource.h @@ -0,0 +1,32 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by powerpreview.rc + +#define IDS_GENERAL_DESCRIPTION 200 +#define IDS_MODULE_NAME 201 +#define IDS_ICON_KEY_NAME 202 +#define IDS_EXPLR_ICONS_PREV_STTNGS_GROUP_HEADER_ID 203 +#define IDS_EXPLR_ICONS_PREV_STTNGS_GROUP_DESC 204 +#define IDS_EXPLR_ICONS_PREV_STTNGS_GROUP_TEXT 205 +#define IDS_PRVPANE_FILE_PREV_STTNGS_GROUP_HEADER_ID 206 +#define IDS_PRVPANE_FILE_PREV_STTNGS_GROUP_DESC 207 +#define IDS_PRVPANE_FILE_PREV_STTNGS_GROUP_TEXT 208 +#define IDS_PREVPANE_MD_BOOL_TOGGLE_CONTROLL 209 +#define IDS_PREVPANE_MD_SETTINGS_DESCRIPTION 210 +#define IDS_PREVPANE_SVG_BOOL_TOGGLE_CONTROLL 211 +#define IDS_PREVPANE_SVG_SETTINGS_DESCRIPTION 212 +#define IDS_EXPLR_SVG_BOOL_TOGGLE_CONTROLL 213 +#define IDS_EXPLR_SVG_SETTINGS_DESCRIPTION 214 +#define IDS_PREVPANE_SVG_SETTINGS_DISPLAYNAME 215 +#define IDS_PREVPANE_MD_SETTINGS_DISPLAYNAME 216 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 101 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/src/modules/previewpane/powerpreview/settings.cpp b/src/modules/previewpane/powerpreview/settings.cpp new file mode 100644 index 000000000..bb3cf52c3 --- /dev/null +++ b/src/modules/previewpane/powerpreview/settings.cpp @@ -0,0 +1,146 @@ +#include "pch.h" +#include +#include "settings.h" +#include "trace.h" +#include +#include + +using namespace std; + +namespace PowerPreviewSettings +{ + extern "C" IMAGE_DOS_HEADER __ImageBase; + + // Relative(HKLM/HKCU) sub key path of Preview Handlers list in registry. + static LPCWSTR preview_handlers_subkey = L"Software\\Microsoft\\Windows\\CurrentVersion\\PreviewHandlers"; + + // Base Settinngs Class Implementation + FileExplorerPreviewSettings::FileExplorerPreviewSettings(bool enabled, const std::wstring& name, const std::wstring& description, LPCWSTR clsid, const std::wstring& displayname, RegistryWrapperIface * registryWrapper) : + m_isPreviewEnabled(enabled), + m_name(name), + m_description(description), + m_clsid(clsid), + m_displayName(displayname), + m_registryWrapper(registryWrapper) + { + } + + FileExplorerPreviewSettings::~FileExplorerPreviewSettings() + { + if (this->m_registryWrapper != NULL) + { + delete this->m_registryWrapper; + } + } + + bool FileExplorerPreviewSettings::GetState() const + { + return this->m_isPreviewEnabled; + } + + void FileExplorerPreviewSettings::SetState(bool state) + { + this->m_isPreviewEnabled = state; + } + + void FileExplorerPreviewSettings::LoadState(PowerToysSettings::PowerToyValues& settings) + { + auto toggle = settings.get_bool_value(this->GetName()); + if (toggle != std::nullopt) + { + this->m_isPreviewEnabled = toggle.value(); + } + } + + void FileExplorerPreviewSettings::UpdateState(PowerToysSettings::PowerToyValues& values) + { + auto toggle = values.get_bool_value(this->GetName()); + if (toggle != std::nullopt) + { + if (toggle.value()) + { + this->EnablePreview(); + } + else + { + this->DisablePreview(); + } + } + else + { + Trace::PowerPreviewSettingsUpDateFailed(this->GetName().c_str()); + } + } + + std::wstring FileExplorerPreviewSettings::GetName() const + { + return this->m_name; + } + + void FileExplorerPreviewSettings::SetName(const std::wstring& name) + { + this->m_name = name; + } + + std::wstring FileExplorerPreviewSettings::GetDescription() const + { + return this->m_description; + } + + void FileExplorerPreviewSettings::SetDescription(const std::wstring& description) + { + this->m_description = description; + } + + LPCWSTR FileExplorerPreviewSettings::GetSubKey() const + { + return preview_handlers_subkey; + } + + LPCWSTR FileExplorerPreviewSettings::GetCLSID() const + { + return this->m_clsid; + } + + std::wstring FileExplorerPreviewSettings::GetDisplayName() const + { + return this->m_displayName; + } + + void FileExplorerPreviewSettings::SetDisplayName(const std::wstring& displayName) + { + this->m_displayName = displayName; + } + + void FileExplorerPreviewSettings::EnablePreview() + { + // Add registry value to enable preview. + LONG err = this->m_registryWrapper->SetRegistryValue(HKEY_CURRENT_USER, this->GetSubKey(), this->GetCLSID(), REG_SZ, (LPBYTE)this->GetDisplayName().c_str(), (DWORD)(this->GetDisplayName().length() * sizeof(wchar_t))); + + if (err == ERROR_SUCCESS) + { + this->SetState(true); + Trace::PreviewHandlerEnabled(true, this->GetDisplayName().c_str()); + } + else + { + Trace::PowerPreviewSettingsUpDateFailed(this->GetName().c_str()); + } + } + + void FileExplorerPreviewSettings::DisablePreview() + { + // Delete the registry key to disable preview. + LONG err = this->m_registryWrapper->DeleteRegistryValue(HKEY_CURRENT_USER, this->GetSubKey(), this->GetCLSID()); + + if (err == ERROR_SUCCESS) + { + this->SetState(false); + Trace::PreviewHandlerEnabled(false, this->GetDisplayName().c_str()); + } + else + { + Trace::PowerPreviewSettingsUpDateFailed(this->GetName().c_str()); + } + } +} diff --git a/src/modules/previewpane/powerpreview/settings.h b/src/modules/previewpane/powerpreview/settings.h new file mode 100644 index 000000000..4fcf6d98e --- /dev/null +++ b/src/modules/previewpane/powerpreview/settings.h @@ -0,0 +1,41 @@ +#pragma once +#include +#include +#include "resource.h" +#include +#include "registry_wrapper_interface.h" + +namespace PowerPreviewSettings +{ + // PowerToy Winodws Explore File Preview Settings. + class FileExplorerPreviewSettings + { + private: + bool m_isPreviewEnabled; + std::wstring m_name; + std::wstring m_description; + std::wstring m_displayName; + RegistryWrapperIface * m_registryWrapper; + LPCWSTR m_clsid; + + + public: + FileExplorerPreviewSettings(bool enabled, const std::wstring& name, const std::wstring& description, LPCWSTR clsid, const std::wstring& displayname, RegistryWrapperIface* registryWrapper); + ~ FileExplorerPreviewSettings(); + + virtual bool GetState() const; + virtual void SetState(bool state); + virtual void LoadState(PowerToysSettings::PowerToyValues& settings); + virtual void UpdateState(PowerToysSettings::PowerToyValues& values); + virtual std::wstring GetName() const; + virtual void SetName(const std::wstring& name); + virtual std::wstring GetDescription() const; + virtual void SetDescription(const std::wstring& description); + virtual void SetDisplayName(const std::wstring& displayName); + virtual std::wstring GetDisplayName() const; + virtual LPCWSTR GetCLSID() const; + virtual LPCWSTR GetSubKey() const; + virtual void EnablePreview(); + virtual void DisablePreview(); + }; +} diff --git a/src/modules/previewpane/powerpreview/trace.cpp b/src/modules/previewpane/powerpreview/trace.cpp new file mode 100644 index 000000000..56c92f622 --- /dev/null +++ b/src/modules/previewpane/powerpreview/trace.cpp @@ -0,0 +1,86 @@ +#include "pch.h" +#include "trace.h" +#include + +/* +* +* This file captures the telemetry for the File Explorer Custom Renders project. +* The following telemetry is to be captured for this library: +* (1.) Is the previewer enabled. +* (2.) File rendered per user in 24 hrs per file time (one for MD, one for SVG) +* (3.) Crashes. +* +*/ + +TRACELOGGING_DEFINE_PROVIDER( + g_hProvider, + "Microsoft.PowerToys", + // {38e8889b-9731-53f5-e901-e8a7c1753074} + (0x38e8889b, 0x9731, 0x53f5, 0xe9, 0x01, 0xe8, 0xa7, 0xc1, 0x75, 0x30, 0x74), + TraceLoggingOptionProjectTelemetry()); + +void Trace::RegisterProvider() +{ + TraceLoggingRegister(g_hProvider); +} + +void Trace::UnregisterProvider() +{ + TraceLoggingUnregister(g_hProvider); +} + +void Trace::PreviewHandlerEnabled(bool enabled, LPCWSTR previewHandlerName) +{ + TraceLoggingWrite( + g_hProvider, + "PowerPreview_TweakUISettings_Enabled", + TraceLoggingWideString(previewHandlerName, "PreviewHanlder_FileType"), + TraceLoggingBoolean(enabled, "Enabled"), + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); +} + +void Trace::PowerPreviewSettingsUpDateFailed(LPCWSTR SettingsName) +{ + TraceLoggingWrite( + g_hProvider, + "PowerPreview_TweakUISettings_FailedUpdatingSettings", + TraceLoggingWideString(SettingsName, "ExceptionMessage"), + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); +} + +void Trace::SetConfigInvalidJSON(const char* exceptionMessage) +{ + TraceLoggingWrite( + g_hProvider, + "PowerPreview_TweakUISettings_SetConfig__InvalidJSONGiven", + TraceLoggingString(exceptionMessage, "ExceptionMessage"), + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); +} + +void Trace::Destroyed() +{ + TraceLoggingWrite( + g_hProvider, + "PowerPreview_TweakUISettings_Destroyed", + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); +} + +void Trace::InitSetErrorLoadingFile(const char* exceptionMessage) +{ + TraceLoggingWrite( + g_hProvider, + "PowerPreview_TweakUISettings_InitSet__ErrorLoadingFile", + TraceLoggingString(exceptionMessage, "ExceptionMessage"), + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); +} + diff --git a/src/modules/previewpane/powerpreview/trace.h b/src/modules/previewpane/powerpreview/trace.h new file mode 100644 index 000000000..1a05b5cea --- /dev/null +++ b/src/modules/previewpane/powerpreview/trace.h @@ -0,0 +1,13 @@ +#pragma once + +class Trace +{ +public: + static void RegisterProvider(); + static void UnregisterProvider(); + static void SetConfigInvalidJSON(const char* exceptionMessage); + static void InitSetErrorLoadingFile(const char* exceptionMessage); + static void PreviewHandlerEnabled(bool enabled, LPCWSTR previewHandlerName); + static void PowerPreviewSettingsUpDateFailed(LPCWSTR SettingsName); + static void Destroyed(); +}; diff --git a/src/modules/previewpane/powerpreviewTest/FileExplorerPreviewSettingsTest.cpp b/src/modules/previewpane/powerpreviewTest/FileExplorerPreviewSettingsTest.cpp new file mode 100644 index 000000000..4f40a453f --- /dev/null +++ b/src/modules/previewpane/powerpreviewTest/FileExplorerPreviewSettingsTest.cpp @@ -0,0 +1,229 @@ +#include "pch.h" +#include "CppUnitTest.h" +#include +#include +#include +#include +#include + +using namespace Microsoft::VisualStudio::CppUnitTestFramework; +using namespace PowerToysSettings; +using namespace PowerPreviewSettings; + +namespace PreviewHandlerSettingsTest +{ + extern "C" IMAGE_DOS_HEADER __ImageBase; + + struct FunctionProperties + { + public: + LONG ReturnValue = ERROR_SUCCESS; + int NumOfCalls = 0; + HKEY Scope; + LPCWSTR SubKey; + LPCWSTR ValueName; + }; + + class RegistryMock : public RegistryWrapperIface + { + public: + FunctionProperties SetRegistryMockProperties; + FunctionProperties DeleteRegistryMockProperties; + FunctionProperties GetRegistryMockProperties; + + LONG SetRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName, DWORD dwType, CONST BYTE* data, DWORD cbData) + { + SetRegistryMockProperties.NumOfCalls += 1; + SetRegistryMockProperties.Scope = keyScope; + SetRegistryMockProperties.SubKey = subKey; + SetRegistryMockProperties.ValueName = valueName; + return SetRegistryMockProperties.ReturnValue; + } + + LONG DeleteRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName) + { + DeleteRegistryMockProperties.NumOfCalls++; + DeleteRegistryMockProperties.Scope = keyScope; + DeleteRegistryMockProperties.SubKey = subKey; + DeleteRegistryMockProperties.ValueName = valueName; + return DeleteRegistryMockProperties.ReturnValue; + } + + LONG GetRegistryValue(HKEY keyScope, LPCWSTR subKey, LPCWSTR valueName, DWORD dwType, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData) + { + GetRegistryMockProperties.NumOfCalls++; + GetRegistryMockProperties.Scope = keyScope; + GetRegistryMockProperties.SubKey = subKey; + GetRegistryMockProperties.ValueName = valueName; + return GetRegistryMockProperties.ReturnValue; + } + }; + + TEST_CLASS(BaseSettingsTest) + { + public: + TEST_METHOD(LoadState_ShouldLoadNewState_WhenSucessfull) + { + // Arrange + FileExplorerPreviewSettings tempSettings = GetSttingsObjects(new RegistryMock()); + PowerToyValues values = PowerToyValues::from_json_string(GetJSONSettings(tempSettings.GetName(), L"true")); + tempSettings.SetState(false); + bool expectedState = true; + + // Act + tempSettings.LoadState(values); + bool actualState = tempSettings.GetState(); + + // Assert + Assert::AreEqual(actualState, expectedState); + } + + TEST_METHOD(UpdateState_ShouldChangeState_WhenSucessfull) + { + // Arrange + FileExplorerPreviewSettings tempSettings = GetSttingsObjects(new RegistryMock()); + PowerToyValues values = PowerToyValues::from_json_string(GetJSONSettings(tempSettings.GetName(), L"true")); + tempSettings.SetState(false); + bool expectedState = true; + + // Act + tempSettings.UpdateState(values); + bool actualState = tempSettings.GetState(); + + // Assert + Assert::AreEqual(actualState, expectedState); + } + + TEST_METHOD(EnableRender_ShouldUpdateStateToTrue_WhenSuccessful) + { + // Arrange + FileExplorerPreviewSettings tempSettings = GetSttingsObjects(new RegistryMock()); + tempSettings.SetState(false); //preview handler initially disabled + + // Act + tempSettings.EnablePreview(); + + // Assert + Assert::IsTrue(tempSettings.GetState()); + } + + TEST_METHOD(DisableRender_ShouldUpdateStateToFalse_WhenSuccessful) + { + // Arrange + FileExplorerPreviewSettings tempSettings = GetSttingsObjects(new RegistryMock()); + tempSettings.SetState(true); //preview handler initially enabled + + // Act + tempSettings.DisablePreview(); + + // Assert + Assert::IsFalse(tempSettings.GetState()); + } + + TEST_METHOD(EnablePreview_ShouldCallSetRegistryValueWithValidArguments_WhenCalled) + { + // Arrange + RegistryMock* mockRegistryWrapper = new RegistryMock(); + FileExplorerPreviewSettings tempSettings = GetSttingsObjects(mockRegistryWrapper); + + // Act + tempSettings.EnablePreview(); + + // Assert + Assert::AreEqual(mockRegistryWrapper->SetRegistryMockProperties.NumOfCalls, 1); + Assert::AreEqual(mockRegistryWrapper->SetRegistryMockProperties.SubKey, tempSettings.GetSubKey()); + Assert::AreEqual(mockRegistryWrapper->SetRegistryMockProperties.ValueName, tempSettings.GetCLSID()); + Assert::AreEqual((ULONG_PTR)(mockRegistryWrapper->SetRegistryMockProperties.Scope), (ULONG_PTR)(HKEY_CURRENT_USER)); + } + + TEST_METHOD(EnablePreview_ShouldNotSetStateToTrue_IfSetRegistryValueFailed) + { + // Arrange + RegistryMock* mockRegistryWrapper = new RegistryMock(); + mockRegistryWrapper->SetRegistryMockProperties.ReturnValue = ERROR_OUTOFMEMORY; + FileExplorerPreviewSettings tempSettings = GetSttingsObjects(mockRegistryWrapper); + tempSettings.SetState(false); + + // Act + tempSettings.EnablePreview(); + + // Assert + Assert::IsFalse(tempSettings.GetState()); + } + + TEST_METHOD(EnablePreview_ShouldSetStateToTrue_IfSetRegistryValueReturnSuccessErrorCode) + { + // Arrange + RegistryMock* mockRegistryWrapper = new RegistryMock(); + FileExplorerPreviewSettings tempSettings = GetSttingsObjects(mockRegistryWrapper); + tempSettings.SetState(false); + + // Act + tempSettings.EnablePreview(); + + // Assert + Assert::IsTrue(tempSettings.GetState()); + } + + TEST_METHOD(DisablePreview_ShouldCallDeleteRegistryValueWithValidArguments_WhenCalled) + { + // Arrange + RegistryMock* mockRegistryWrapper = new RegistryMock(); + FileExplorerPreviewSettings tempSettings = GetSttingsObjects(mockRegistryWrapper); + + // Act + tempSettings.DisablePreview(); + + // Assert + Assert::AreEqual(mockRegistryWrapper->DeleteRegistryMockProperties.NumOfCalls, 1); + Assert::AreEqual(mockRegistryWrapper->DeleteRegistryMockProperties.SubKey, tempSettings.GetSubKey()); + Assert::AreEqual(mockRegistryWrapper->DeleteRegistryMockProperties.ValueName, tempSettings.GetCLSID()); + Assert::AreEqual((ULONG_PTR)(mockRegistryWrapper->DeleteRegistryMockProperties.Scope), (ULONG_PTR)(HKEY_CURRENT_USER)); + } + + TEST_METHOD(DisablePreview_ShouldNotSetStateToFalse_IfDeleteRegistryValueFailed) + { + // Arrange + RegistryMock* mockRegistryWrapper = new RegistryMock(); + mockRegistryWrapper->DeleteRegistryMockProperties.ReturnValue = ERROR_OUTOFMEMORY; + FileExplorerPreviewSettings tempSettings = GetSttingsObjects(mockRegistryWrapper); + tempSettings.SetState(true); + + // Act + tempSettings.DisablePreview(); + + // Assert + Assert::IsTrue(tempSettings.GetState()); + } + + TEST_METHOD(DisablePreview_ShouldSetStateToFalse_IfDeleteRegistryValueReturnSuccessErrorCode) + { + // Arrange + RegistryMock* mockRegistryWrapper = new RegistryMock(); + FileExplorerPreviewSettings tempSettings = GetSttingsObjects(mockRegistryWrapper); + tempSettings.SetState(true); + + // Act + tempSettings.DisablePreview(); + + // Assert + Assert::IsFalse(tempSettings.GetState()); + } + + FileExplorerPreviewSettings GetSttingsObjects(RegistryMock * registryMock) + { + return FileExplorerPreviewSettings( + false, + GET_RESOURCE_STRING(IDS_PREVPANE_MD_BOOL_TOGGLE_CONTROLL), + GET_RESOURCE_STRING(IDS_PREVPANE_MD_SETTINGS_DESCRIPTION), + L"{test-guid}", + TEXT("Test Handler\0"), + registryMock); + } + + std::wstring GetJSONSettings(const std::wstring &_settingsNameId, const std::wstring &_value) const + { + return L"{\"name\":\"Module Name\",\"properties\" : {\"" + _settingsNameId + L"\":{\"value\":" + _value + L"}},\"version\" : \"1.0\" }"; + } + }; +} diff --git a/src/modules/previewpane/powerpreviewTest/pch.cpp b/src/modules/previewpane/powerpreviewTest/pch.cpp new file mode 100644 index 000000000..a3d1ff422 --- /dev/null +++ b/src/modules/previewpane/powerpreviewTest/pch.cpp @@ -0,0 +1,3 @@ +#include "pch.h" +#pragma comment(lib, "windowsapp") +#pragma comment(lib, "shlwapi.lib") \ No newline at end of file diff --git a/src/modules/previewpane/powerpreviewTest/pch.h b/src/modules/previewpane/powerpreviewTest/pch.h new file mode 100644 index 000000000..85bdb7bd5 --- /dev/null +++ b/src/modules/previewpane/powerpreviewTest/pch.h @@ -0,0 +1,15 @@ +// pch.h: This is a precompiled header file. +// Files listed below are compiled only once, improving build performance for future builds. +// This also affects IntelliSense performance, including code completion and many code browsing features. +// However, files listed here are ALL re-compiled if any one of them is updated between builds. +// Do not add files here that you will be updating frequently as this negates the performance advantage. + +#ifndef PCH_H +#define PCH_H + +// add headers that you want to pre-compile here +#include +#include +#include "CppUnitTest.h" + +#endif //PCH_H diff --git a/src/modules/previewpane/powerpreviewTest/powerpreviewTest.vcxproj b/src/modules/previewpane/powerpreviewTest/powerpreviewTest.vcxproj new file mode 100644 index 000000000..ee94961f2 --- /dev/null +++ b/src/modules/previewpane/powerpreviewTest/powerpreviewTest.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {47310AB4-9034-4BD1-8D8B-E88AD21A171B} + Win32Proj + powerpreviewTest + 10.0 + NativeUnitTestProject + + + + DynamicLibrary + true + v142 + Unicode + false + + + DynamicLibrary + false + v142 + true + Unicode + false + + + DynamicLibrary + true + v142 + Unicode + false + + + DynamicLibrary + false + v142 + true + Unicode + false + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + true + + + + Use + Level3 + true + ..\;..\..\..\common;..\..\..\common\telemetry;..\..\;..\..\..\;..\..\..\..\deps\cpprestsdk\include;..\..\..\..\;%(AdditionalIncludeDirectories) + _DEBUG;%(PreprocessorDefinitions) + true + pch.h + stdcpplatest + MultiThreadedDebug + + + Windows + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + Use + Level3 + true + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + WIN32;_DEBUG;%(PreprocessorDefinitions) + true + pch.h + + + Windows + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + Use + Level3 + true + true + true + $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) + WIN32;NDEBUG;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + true + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + Use + Level3 + true + true + true + ..\;..\..\..\common;..\..\..\common\telemetry;..\..\;..\..\..\;..\..\..\..\deps\cpprestsdk\include;..\..\..\..\;%(AdditionalIncludeDirectories) + NDEBUG;%(PreprocessorDefinitions) + true + pch.h + stdcpplatest + MultiThreaded + + + Windows + true + true + $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) + + + + + + Create + Create + Create + Create + + + + + + + + {74485049-c722-400f-abe5-86ac52d929b3} + + + + + + \ No newline at end of file diff --git a/src/modules/previewpane/powerpreviewTest/powerpreviewTest.vcxproj.filters b/src/modules/previewpane/powerpreviewTest/powerpreviewTest.vcxproj.filters new file mode 100644 index 000000000..4fc696fd5 --- /dev/null +++ b/src/modules/previewpane/powerpreviewTest/powerpreviewTest.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + \ No newline at end of file diff --git a/src/runner/main.cpp b/src/runner/main.cpp index 8b0ac14f8..bb33e494c 100644 --- a/src/runner/main.cpp +++ b/src/runner/main.cpp @@ -175,7 +175,8 @@ int runner(bool isProcessElevated) std::unordered_set known_dlls = { L"shortcut_guide.dll", L"fancyzones.dll", - L"PowerRenameExt.dll" + L"PowerRenameExt.dll", + L"powerpreview.dll" }; for (auto& file : std::filesystem::directory_iterator(L"modules/")) { diff --git a/src/settings-web/package-lock.json b/src/settings-web/package-lock.json index 744b97e65..844f89f9f 100644 --- a/src/settings-web/package-lock.json +++ b/src/settings-web/package-lock.json @@ -1139,9 +1139,9 @@ } }, "@microsoft/load-themed-styles": { - "version": "1.10.26", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.26.tgz", - "integrity": "sha512-N//pFTBL/iCSrMuDoLvBLpgGjlk+MgKX2kyFI3bJVb+LRozeyWCOZVRcR8aMKiYHdqwy5isu2Frp8drvWx7RbA==" + "version": "1.10.33", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.33.tgz", + "integrity": "sha512-6ke2PEMbjizIvqhSeb/K6iUStEJcfONndE1kfB46dstFYZ9jJmYgO6UHUZkA3VMufmjdI1z28bJKz3cMzmkZGw==" }, "@microsoft/package-deps-hash": { "version": "2.2.159", @@ -1422,25 +1422,54 @@ } }, "@uifabric/foundation": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.5.0.tgz", - "integrity": "sha512-eymMyV3e+MFCkcfC1AFIAzVP/h6/QvDcYb1l6K3IaG1QG47ZwijJJXseEvNDjimfUiJhez9H7cSsRZPIIJ5MaQ==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.5.2.tgz", + "integrity": "sha512-TNDVWjVDV/UbGOMbCsRblDY6yciTL9GPMOT1b4Ibuul6ytUVLaUCRchdnMf+8JIUNBwZIDMMJWwDVpdwURqpvQ==", "requires": { - "@uifabric/merge-styles": "^7.8.0", - "@uifabric/set-version": "^7.0.2", - "@uifabric/styling": "^7.7.2", - "@uifabric/utilities": "^7.5.0", - "tslib": "^1.7.1" + "@uifabric/merge-styles": "^7.8.2", + "@uifabric/set-version": "^7.0.3", + "@uifabric/styling": "^7.10.1", + "@uifabric/utilities": "^7.11.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@uifabric/merge-styles": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.8.2.tgz", + "integrity": "sha512-CiGZkOQegNdrXIaVvgd8pumeHLm3odSRE21rsrA7HiqdyF+fh6ArQ0RWsKTlJRIQklCUJjMkXaO54QIWNOlQyg==", + "requires": { + "@uifabric/set-version": "^7.0.3", + "tslib": "^1.10.0" + } + }, + "@uifabric/set-version": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.3.tgz", + "integrity": "sha512-03A68Fyfx3y75dUW9rjQ2fZv/9zmGgMeovVLAQa0wc/oVjQ++eVDlAEK0AjfgnOaujYmhk79lXbYAuW3n+YUXw==", + "requires": { + "tslib": "^1.10.0" + } + } } }, "@uifabric/icons": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.3.0.tgz", - "integrity": "sha512-wbcR8fJce20sPjsK2bbTC/cAZfAOFuE4dd4LHw194+8H+/dqotsowrQVp5Lu8aaHGQk+fXoiZmUy30WA9cAG4Q==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.3.1.tgz", + "integrity": "sha512-Jb2KjC6s+nY75H7U8/i23iKRwYFS3cavTXVYDz69guwLEhWh0aZ1QZqbAbUfF+YikVabJQmT8YT0Pup8/VbeWA==", "requires": { - "@uifabric/set-version": "^7.0.2", - "@uifabric/styling": "^7.7.1", - "tslib": "^1.7.1" + "@uifabric/set-version": "^7.0.3", + "@uifabric/styling": "^7.10.1", + "tslib": "^1.10.0" + }, + "dependencies": { + "@uifabric/set-version": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.3.tgz", + "integrity": "sha512-03A68Fyfx3y75dUW9rjQ2fZv/9zmGgMeovVLAQa0wc/oVjQ++eVDlAEK0AjfgnOaujYmhk79lXbYAuW3n+YUXw==", + "requires": { + "tslib": "^1.10.0" + } + } } }, "@uifabric/merge-styles": { @@ -1453,13 +1482,23 @@ } }, "@uifabric/react-hooks": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.0.1.tgz", - "integrity": "sha512-cIr/ToLvc48D7A+XJrH/rHmSa/YmonvyFGHykFqHKiFSYiGKvc50GIyRJ/gkOUDuaaYVThWRwBQNOIMr3iFCYA==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.0.2.tgz", + "integrity": "sha512-Ly2loVgrSJ3VYHvyOp6Q23aieOcX3w80Cf8t8+gXRZjLXgNh39omOhucD1nVnSlnUy+w88vDhr2aC1dCiw/o7w==", "requires": { - "@uifabric/set-version": "^7.0.2", - "@uifabric/utilities": "^7.0.10", - "tslib": "^1.7.1" + "@uifabric/set-version": "^7.0.3", + "@uifabric/utilities": "^7.11.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@uifabric/set-version": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.3.tgz", + "integrity": "sha512-03A68Fyfx3y75dUW9rjQ2fZv/9zmGgMeovVLAQa0wc/oVjQ++eVDlAEK0AjfgnOaujYmhk79lXbYAuW3n+YUXw==", + "requires": { + "tslib": "^1.10.0" + } + } } }, "@uifabric/set-version": { @@ -1471,26 +1510,64 @@ } }, "@uifabric/styling": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.8.0.tgz", - "integrity": "sha512-mRNQUvfasOWW0/RJARA5mPHmPMORJXrNDoOpjoTNt+J6uj1/sA8km0l/AQtZ6b36bqo6kkaQgB9+msRobmdpiQ==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.10.1.tgz", + "integrity": "sha512-/G0BbIS1tI1SEiUD4mNxfNXq6dLyff6Ey5YqeMGx6v1AyQ2dWBolhGSYK8l7XGlBQCNZ+gR+AV4M6+8gWOkAaw==", "requires": { - "@microsoft/load-themed-styles": "^1.7.13", - "@uifabric/merge-styles": "^7.8.1", - "@uifabric/set-version": "^7.0.2", - "@uifabric/utilities": "^7.8.0", - "tslib": "^1.7.1" + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/merge-styles": "^7.8.2", + "@uifabric/set-version": "^7.0.3", + "@uifabric/utilities": "^7.11.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "@uifabric/merge-styles": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.8.2.tgz", + "integrity": "sha512-CiGZkOQegNdrXIaVvgd8pumeHLm3odSRE21rsrA7HiqdyF+fh6ArQ0RWsKTlJRIQklCUJjMkXaO54QIWNOlQyg==", + "requires": { + "@uifabric/set-version": "^7.0.3", + "tslib": "^1.10.0" + } + }, + "@uifabric/set-version": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.3.tgz", + "integrity": "sha512-03A68Fyfx3y75dUW9rjQ2fZv/9zmGgMeovVLAQa0wc/oVjQ++eVDlAEK0AjfgnOaujYmhk79lXbYAuW3n+YUXw==", + "requires": { + "tslib": "^1.10.0" + } + } } }, "@uifabric/utilities": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.8.0.tgz", - "integrity": "sha512-ow3v9arBhe5C8GvklIuqD3PZMSNnY04HC7JoQVW301Q/gH+BGVECLTBzrFm/m66GCetMksDOMnkoBQSk0poPOQ==", + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.11.2.tgz", + "integrity": "sha512-PZnBsV3fyS6FiqZlP7byBosRNvmiIg9B8TLRl0YVQYr4LDDpLE05HKYxLLrp7SepPX9sxOh5AXgwrgDPojAkpg==", "requires": { - "@uifabric/merge-styles": "^7.8.1", - "@uifabric/set-version": "^7.0.2", + "@uifabric/merge-styles": "^7.8.2", + "@uifabric/set-version": "^7.0.3", "prop-types": "^15.5.10", - "tslib": "^1.7.1" + "tslib": "^1.10.0" + }, + "dependencies": { + "@uifabric/merge-styles": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.8.2.tgz", + "integrity": "sha512-CiGZkOQegNdrXIaVvgd8pumeHLm3odSRE21rsrA7HiqdyF+fh6ArQ0RWsKTlJRIQklCUJjMkXaO54QIWNOlQyg==", + "requires": { + "@uifabric/set-version": "^7.0.3", + "tslib": "^1.10.0" + } + }, + "@uifabric/set-version": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.3.tgz", + "integrity": "sha512-03A68Fyfx3y75dUW9rjQ2fZv/9zmGgMeovVLAQa0wc/oVjQ++eVDlAEK0AjfgnOaujYmhk79lXbYAuW3n+YUXw==", + "requires": { + "tslib": "^1.10.0" + } + } } }, "@webassemblyjs/ast": { @@ -8476,20 +8553,39 @@ "dev": true }, "office-ui-fabric-react": { - "version": "7.76.2", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.76.2.tgz", - "integrity": "sha512-rWQrkv1o4jOdYhNk3GsLDxJw8mo1+6HspGNILiodRj7RfJx/OmSyVM4KT2gGJ5k2PZGNCdp7f7kp1JuICd31Mg==", + "version": "7.83.1", + "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.83.1.tgz", + "integrity": "sha512-XDL+9baCqq8kDA1VHrAlRvfnWKEQRJVx9hlzsbFNxzMpZtXNH0ip4SHzahRRU0eqCXHBNkd5ZA4xUV532Uv8dQ==", "requires": { - "@microsoft/load-themed-styles": "^1.7.13", - "@uifabric/foundation": "^7.5.0", - "@uifabric/icons": "^7.3.0", - "@uifabric/merge-styles": "^7.8.1", - "@uifabric/react-hooks": "^7.0.1", - "@uifabric/set-version": "^7.0.2", - "@uifabric/styling": "^7.8.0", - "@uifabric/utilities": "^7.8.0", + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/foundation": "^7.5.2", + "@uifabric/icons": "^7.3.1", + "@uifabric/merge-styles": "^7.8.2", + "@uifabric/react-hooks": "^7.0.2", + "@uifabric/set-version": "^7.0.3", + "@uifabric/styling": "^7.10.1", + "@uifabric/utilities": "^7.11.2", "prop-types": "^15.5.10", - "tslib": "^1.7.1" + "tslib": "^1.10.0" + }, + "dependencies": { + "@uifabric/merge-styles": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.8.2.tgz", + "integrity": "sha512-CiGZkOQegNdrXIaVvgd8pumeHLm3odSRE21rsrA7HiqdyF+fh6ArQ0RWsKTlJRIQklCUJjMkXaO54QIWNOlQyg==", + "requires": { + "@uifabric/set-version": "^7.0.3", + "tslib": "^1.10.0" + } + }, + "@uifabric/set-version": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.3.tgz", + "integrity": "sha512-03A68Fyfx3y75dUW9rjQ2fZv/9zmGgMeovVLAQa0wc/oVjQ++eVDlAEK0AjfgnOaujYmhk79lXbYAuW3n+YUXw==", + "requires": { + "tslib": "^1.10.0" + } + } } }, "on-finished": { diff --git a/src/settings-web/package.json b/src/settings-web/package.json index e9d09b659..983ff89f9 100644 --- a/src/settings-web/package.json +++ b/src/settings-web/package.json @@ -30,7 +30,8 @@ "dependencies": { "@svgr/webpack": "^4.3.3", "@uifabric/azure-themes": "^7.0.10", - "office-ui-fabric-react": "^7.76.2", + "@uifabric/styling": "^7.10.1", + "office-ui-fabric-react": "^7.83.1", "react": "~16.8.0", "react-dom": "~16.8.0" }, diff --git a/src/settings-web/src/components/ModuleSettings.tsx b/src/settings-web/src/components/ModuleSettings.tsx index cc31d0780..7069e0d3e 100644 --- a/src/settings-web/src/components/ModuleSettings.tsx +++ b/src/settings-web/src/components/ModuleSettings.tsx @@ -163,6 +163,10 @@ export class ModuleSettings extends React.Component { on_change={this.parent_on_change} ref={(input) => {this.references[key]=input;}} />; + case 'header_large': + return {power_toys_properties[key].value}; default: return null; } diff --git a/src/settings-web/src/css/layout.css b/src/settings-web/src/css/layout.css index 3ccd4912f..ffe03a130 100644 --- a/src/settings-web/src/css/layout.css +++ b/src/settings-web/src/css/layout.css @@ -58,3 +58,6 @@ flex-direction: column; flex-grow: 1; } +.SubHeader{ + font-weight: bold; +} diff --git a/src/settings-web/src/icons/config/fabric-icons.json b/src/settings-web/src/icons/config/fabric-icons.json index 59e779e78..3a91c42eb 100644 --- a/src/settings-web/src/icons/config/fabric-icons.json +++ b/src/settings-web/src/icons/config/fabric-icons.json @@ -72,6 +72,10 @@ { "name": "CircleRing", "unicode": "EA3A" + }, + { + "name": "FabricReportLibrary", + "unicode": "F0A1" } ] } \ No newline at end of file diff --git a/src/settings-web/src/icons/css/fabric-icons-inline.css b/src/settings-web/src/icons/css/fabric-icons-inline.css index 86340e055..28c494dc7 100644 --- a/src/settings-web/src/icons/css/fabric-icons-inline.css +++ b/src/settings-web/src/icons/css/fabric-icons-inline.css @@ -3,7 +3,7 @@ */ @font-face { font-family: 'FabricMDL2Icons'; - src: url('data:application/octet-stream;base64,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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('truetype'); } .ms-Icon { @@ -32,3 +32,4 @@ .ms-Icon--ChevronLeftMed:before { content: "\E973"; } .ms-Icon--ChevronRightMed:before { content: "\E974"; } .ms-Icon--CircleRing:before { content: "\EA3A"; } +.ms-Icon--FabricReportLibrary:before { content: "\F0A1"; } diff --git a/src/settings-web/src/icons/css/fabric-icons.css b/src/settings-web/src/icons/css/fabric-icons.css index a0e2e4d0b..529cb871d 100644 --- a/src/settings-web/src/icons/css/fabric-icons.css +++ b/src/settings-web/src/icons/css/fabric-icons.css @@ -32,3 +32,4 @@ .ms-Icon--ChevronLeftMed:before { content: "\E973"; } .ms-Icon--ChevronRightMed:before { content: "\E974"; } .ms-Icon--CircleRing:before { content: "\EA3A"; } +.ms-Icon--FabricReportLibrary:before { content: "\F0A1"; } diff --git a/src/settings-web/src/icons/fabric-icons.html b/src/settings-web/src/icons/fabric-icons.html index 1beaeb3ec..4dddb7cab 100644 --- a/src/settings-web/src/icons/fabric-icons.html +++ b/src/settings-web/src/icons/fabric-icons.html @@ -271,6 +271,19 @@ +
+
+ +
+ +
+ FabricReportLibrary +
+ +
+ F0A1 +
+
\ No newline at end of file diff --git a/src/settings-web/src/icons/fonts/fabric-icons.woff b/src/settings-web/src/icons/fonts/fabric-icons.woff index 6b8d48adf..fd90f0ee2 100644 Binary files a/src/settings-web/src/icons/fonts/fabric-icons.woff and b/src/settings-web/src/icons/fonts/fabric-icons.woff differ diff --git a/src/settings-web/src/icons/scss/fabric-icons-inline.scss b/src/settings-web/src/icons/scss/fabric-icons-inline.scss index 44f8a1737..f73d7e13f 100644 --- a/src/settings-web/src/icons/scss/fabric-icons-inline.scss +++ b/src/settings-web/src/icons/scss/fabric-icons-inline.scss @@ -3,7 +3,7 @@ */ @font-face { font-family: 'FabricMDL2Icons'; - src: url('data:application/octet-stream;base64,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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('truetype'); } .ms-Icon { @@ -33,6 +33,7 @@ @mixin ms-Icon--ChevronLeftMed { content: "\E973"; } @mixin ms-Icon--ChevronRightMed { content: "\E974"; } @mixin ms-Icon--CircleRing { content: "\EA3A"; } +@mixin ms-Icon--FabricReportLibrary { content: "\F0A1"; } // Classes @@ -52,4 +53,5 @@ .ms-Icon--ChevronLeftMed:before { @include ms-Icon--ChevronLeftMed } .ms-Icon--ChevronRightMed:before { @include ms-Icon--ChevronRightMed } .ms-Icon--CircleRing:before { @include ms-Icon--CircleRing } +.ms-Icon--FabricReportLibrary:before { @include ms-Icon--FabricReportLibrary } diff --git a/src/settings-web/src/icons/scss/fabric-icons.scss b/src/settings-web/src/icons/scss/fabric-icons.scss index 2f7240013..42fa47b40 100644 --- a/src/settings-web/src/icons/scss/fabric-icons.scss +++ b/src/settings-web/src/icons/scss/fabric-icons.scss @@ -33,6 +33,7 @@ @mixin ms-Icon--ChevronLeftMed { content: "\E973"; } @mixin ms-Icon--ChevronRightMed { content: "\E974"; } @mixin ms-Icon--CircleRing { content: "\EA3A"; } +@mixin ms-Icon--FabricReportLibrary { content: "\F0A1"; } // Classes @@ -52,4 +53,5 @@ .ms-Icon--ChevronLeftMed:before { @include ms-Icon--ChevronLeftMed } .ms-Icon--ChevronRightMed:before { @include ms-Icon--ChevronRightMed } .ms-Icon--CircleRing:before { @include ms-Icon--CircleRing } +.ms-Icon--FabricReportLibrary:before { @include ms-Icon--FabricReportLibrary } diff --git a/src/settings-web/src/icons/src/IconNames.ts b/src/settings-web/src/icons/src/IconNames.ts index d1b5601db..82eb87772 100644 --- a/src/settings-web/src/icons/src/IconNames.ts +++ b/src/settings-web/src/icons/src/IconNames.ts @@ -2,1756 +2,1857 @@ * @deprecated Const enum use is deprecated. See GitHub issue #7110: https://github.com/OfficeDev/office-ui-fabric-react/issues/7110 */ export const enum IconNames { - GlobalNavButton = 'GlobalNavButton', - InternetSharing = 'InternetSharing', - Brightness = 'Brightness', - MapPin = 'MapPin', - Airplane = 'Airplane', - Tablet = 'Tablet', - QuickNote = 'QuickNote', - ChevronDown = 'ChevronDown', - ChevronUp = 'ChevronUp', - Edit = 'Edit', - Add = 'Add', - Cancel = 'Cancel', - More = 'More', - Settings = 'Settings', - Video = 'Video', - Mail = 'Mail', - People = 'People', - Phone = 'Phone', - Pin = 'Pin', - Shop = 'Shop', - Stop = 'Stop', - Link = 'Link', - Filter = 'Filter', - AllApps = 'AllApps', - Zoom = 'Zoom', - ZoomOut = 'ZoomOut', - Microphone = 'Microphone', - Search = 'Search', - Camera = 'Camera', - Attach = 'Attach', - Send = 'Send', - FavoriteList = 'FavoriteList', - PageSolid = 'PageSolid', - Forward = 'Forward', - Back = 'Back', - Refresh = 'Refresh', - Share = 'Share', - Lock = 'Lock', - BlockedSite = 'BlockedSite', - ReportHacked = 'ReportHacked', - EMI = 'EMI', - MiniLink = 'MiniLink', - Blocked = 'Blocked', - FavoriteStar = 'FavoriteStar', - FavoriteStarFill = 'FavoriteStarFill', - ReadingMode = 'ReadingMode', - Favicon = 'Favicon', - Remove = 'Remove', - Checkbox = 'Checkbox', - CheckboxComposite = 'CheckboxComposite', - CheckboxFill = 'CheckboxFill', - CheckboxIndeterminate = 'CheckboxIndeterminate', - CheckboxCompositeReversed = 'CheckboxCompositeReversed', - CheckMark = 'CheckMark', - BackToWindow = 'BackToWindow', - FullScreen = 'FullScreen', - Print = 'Print', - Up = 'Up', - Down = 'Down', - OEM = 'OEM', - Delete = 'Delete', - Save = 'Save', - ReturnKey = 'ReturnKey', - Cloud = 'Cloud', - Flashlight = 'Flashlight', - CommandPrompt = 'CommandPrompt', - Sad = 'Sad', - RealEstate = 'RealEstate', - SIPMove = 'SIPMove', - EraseTool = 'EraseTool', - GripperTool = 'GripperTool', - Dialpad = 'Dialpad', - PageLeft = 'PageLeft', - PageRight = 'PageRight', - MultiSelect = 'MultiSelect', - KeyboardClassic = 'KeyboardClassic', - Play = 'Play', - Pause = 'Pause', - ChevronLeft = 'ChevronLeft', - ChevronRight = 'ChevronRight', - InkingTool = 'InkingTool', - Emoji2 = 'Emoji2', - GripperBarHorizontal = 'GripperBarHorizontal', - System = 'System', - Personalize = 'Personalize', - SearchAndApps = 'SearchAndApps', - Globe = 'Globe', - EaseOfAccess = 'EaseOfAccess', - ContactInfo = 'ContactInfo', - Unpin = 'Unpin', - Contact = 'Contact', - Memo = 'Memo', - IncomingCall = 'IncomingCall', - Paste = 'Paste', - WindowsLogo = 'WindowsLogo', - Error = 'Error', - GripperBarVertical = 'GripperBarVertical', - Unlock = 'Unlock', - Slideshow = 'Slideshow', - Calendar = 'Calendar', - Megaphone = 'Megaphone', - AutoEnhanceOn = 'AutoEnhanceOn', - AutoEnhanceOff = 'AutoEnhanceOff', - Color = 'Color', - SaveAs = 'SaveAs', - Light = 'Light', - Filters = 'Filters', - AspectRatio = 'AspectRatio', - Contrast = 'Contrast', - Redo = 'Redo', - Undo = 'Undo', - Crop = 'Crop', - PhotoCollection = 'PhotoCollection', - Album = 'Album', - Rotate = 'Rotate', - PanoIndicator = 'PanoIndicator', - Translate = 'Translate', - RedEye = 'RedEye', - ThumbnailView = 'ThumbnailView', - Package = 'Package', - Telemarketer = 'Telemarketer', - Warning = 'Warning', - Financial = 'Financial', - Education = 'Education', - ShoppingCart = 'ShoppingCart', - Train = 'Train', - Flag = 'Flag', - Move = 'Move', - Page = 'Page', - TouchPointer = 'TouchPointer', - Merge = 'Merge', - TurnRight = 'TurnRight', - Ferry = 'Ferry', - Highlight = 'Highlight', - PowerButton = 'PowerButton', - Tab = 'Tab', - Admin = 'Admin', - TVMonitor = 'TVMonitor', - Speakers = 'Speakers', - Game = 'Game', - UnstackSelected = 'UnstackSelected', - StackIndicator = 'StackIndicator', - Nav2DMapView = 'Nav2DMapView', - StreetsideSplitMinimize = 'StreetsideSplitMinimize', - Car = 'Car', - Bus = 'Bus', - EatDrink = 'EatDrink', - SeeDo = 'SeeDo', - LocationCircle = 'LocationCircle', - Home = 'Home', - SwitcherStartEnd = 'SwitcherStartEnd', - ParkingLocation = 'ParkingLocation', - IncidentTriangle = 'IncidentTriangle', - Touch = 'Touch', - MapDirections = 'MapDirections', - CaretHollow = 'CaretHollow', - CaretSolid = 'CaretSolid', - History = 'History', - Location = 'Location', - MapLayers = 'MapLayers', - SearchNearby = 'SearchNearby', - Work = 'Work', - Recent = 'Recent', - Hotel = 'Hotel', - Bank = 'Bank', - LocationDot = 'LocationDot', - Dictionary = 'Dictionary', - ChromeBack = 'ChromeBack', - FolderOpen = 'FolderOpen', - Pinned = 'Pinned', - PinnedFill = 'PinnedFill', - RevToggleKey = 'RevToggleKey', - USB = 'USB', - View = 'View', - Previous = 'Previous', - Next = 'Next', - Clear = 'Clear', - Sync = 'Sync', - Download = 'Download', - Help = 'Help', - Upload = 'Upload', - Emoji = 'Emoji', - MailForward = 'MailForward', - ClosePane = 'ClosePane', - OpenPane = 'OpenPane', - PreviewLink = 'PreviewLink', - ZoomIn = 'ZoomIn', - Bookmarks = 'Bookmarks', - Document = 'Document', - ProtectedDocument = 'ProtectedDocument', - OpenInNewWindow = 'OpenInNewWindow', - MailFill = 'MailFill', - ViewAll = 'ViewAll', - Switch = 'Switch', - Rename = 'Rename', - Go = 'Go', - Remote = 'Remote', - SelectAll = 'SelectAll', - Orientation = 'Orientation', - Import = 'Import', - Folder = 'Folder', - Picture = 'Picture', - ChromeClose = 'ChromeClose', - ShowResults = 'ShowResults', - Message = 'Message', - CalendarDay = 'CalendarDay', - CalendarWeek = 'CalendarWeek', - MailReplyAll = 'MailReplyAll', - Read = 'Read', - Cut = 'Cut', - PaymentCard = 'PaymentCard', - Copy = 'Copy', - Important = 'Important', - MailReply = 'MailReply', - Sort = 'Sort', - GotoToday = 'GotoToday', - Font = 'Font', - FontColor = 'FontColor', - FolderFill = 'FolderFill', - Permissions = 'Permissions', - DisableUpdates = 'DisableUpdates', - Unfavorite = 'Unfavorite', - Italic = 'Italic', - Underline = 'Underline', - Bold = 'Bold', - MoveToFolder = 'MoveToFolder', - Dislike = 'Dislike', - Like = 'Like', - AlignRight = 'AlignRight', - AlignCenter = 'AlignCenter', - AlignLeft = 'AlignLeft', - OpenFile = 'OpenFile', - ClearSelection = 'ClearSelection', - FontDecrease = 'FontDecrease', - FontIncrease = 'FontIncrease', - FontSize = 'FontSize', - CellPhone = 'CellPhone', - Tag = 'Tag', - RepeatOne = 'RepeatOne', - RepeatAll = 'RepeatAll', - Calculator = 'Calculator', - Library = 'Library', - PostUpdate = 'PostUpdate', - NewFolder = 'NewFolder', - CalendarReply = 'CalendarReply', - UnsyncFolder = 'UnsyncFolder', - SyncFolder = 'SyncFolder', - BlockContact = 'BlockContact', - AddFriend = 'AddFriend', - Accept = 'Accept', - BulletedList = 'BulletedList', - Preview = 'Preview', - News = 'News', - Chat = 'Chat', - Group = 'Group', - World = 'World', - Comment = 'Comment', - DockLeft = 'DockLeft', - DockRight = 'DockRight', - Repair = 'Repair', - Accounts = 'Accounts', - Street = 'Street', - RadioBullet = 'RadioBullet', - Stopwatch = 'Stopwatch', - Clock = 'Clock', - WorldClock = 'WorldClock', - AlarmClock = 'AlarmClock', - Photo = 'Photo', - ActionCenter = 'ActionCenter', - Hospital = 'Hospital', - Timer = 'Timer', - FullCircleMask = 'FullCircleMask', - LocationFill = 'LocationFill', - ChromeMinimize = 'ChromeMinimize', - ChromeRestore = 'ChromeRestore', - Annotation = 'Annotation', - Fingerprint = 'Fingerprint', - Handwriting = 'Handwriting', - ChromeFullScreen = 'ChromeFullScreen', - Completed = 'Completed', - Label = 'Label', - FlickDown = 'FlickDown', - FlickUp = 'FlickUp', - FlickLeft = 'FlickLeft', - FlickRight = 'FlickRight', - MiniExpand = 'MiniExpand', - MiniContract = 'MiniContract', - Streaming = 'Streaming', - MusicInCollection = 'MusicInCollection', - OneDriveLogo = 'OneDriveLogo', - CompassNW = 'CompassNW', - Code = 'Code', - LightningBolt = 'LightningBolt', - Info = 'Info', - CalculatorMultiply = 'CalculatorMultiply', - CalculatorAddition = 'CalculatorAddition', - CalculatorSubtract = 'CalculatorSubtract', - CalculatorPercentage = 'CalculatorPercentage', - CalculatorEqualTo = 'CalculatorEqualTo', - PrintfaxPrinterFile = 'PrintfaxPrinterFile', - StorageOptical = 'StorageOptical', - Communications = 'Communications', - Headset = 'Headset', - Health = 'Health', - FrontCamera = 'FrontCamera', - ChevronUpSmall = 'ChevronUpSmall', - ChevronDownSmall = 'ChevronDownSmall', - ChevronLeftSmall = 'ChevronLeftSmall', - ChevronRightSmall = 'ChevronRightSmall', - ChevronUpMed = 'ChevronUpMed', - ChevronDownMed = 'ChevronDownMed', - ChevronLeftMed = 'ChevronLeftMed', - ChevronRightMed = 'ChevronRightMed', - Devices2 = 'Devices2', - PC1 = 'PC1', - PresenceChickletVideo = 'PresenceChickletVideo', - Reply = 'Reply', - HalfAlpha = 'HalfAlpha', - ConstructionCone = 'ConstructionCone', - DoubleChevronLeftMed = 'DoubleChevronLeftMed', - Volume0 = 'Volume0', - Volume1 = 'Volume1', - Volume2 = 'Volume2', - Volume3 = 'Volume3', - Chart = 'Chart', - Robot = 'Robot', - Manufacturing = 'Manufacturing', - LockSolid = 'LockSolid', - FitPage = 'FitPage', - FitWidth = 'FitWidth', - BidiLtr = 'BidiLtr', - BidiRtl = 'BidiRtl', - RightDoubleQuote = 'RightDoubleQuote', - Sunny = 'Sunny', - CloudWeather = 'CloudWeather', - Cloudy = 'Cloudy', - PartlyCloudyDay = 'PartlyCloudyDay', - PartlyCloudyNight = 'PartlyCloudyNight', - ClearNight = 'ClearNight', - RainShowersDay = 'RainShowersDay', - Rain = 'Rain', - Thunderstorms = 'Thunderstorms', - RainSnow = 'RainSnow', - Snow = 'Snow', - BlowingSnow = 'BlowingSnow', - Frigid = 'Frigid', - Fog = 'Fog', - Squalls = 'Squalls', - Duststorm = 'Duststorm', - Unknown = 'Unknown', - Precipitation = 'Precipitation', - SortLines = 'SortLines', - Ribbon = 'Ribbon', - AreaChart = 'AreaChart', - Assign = 'Assign', - FlowChart = 'FlowChart', - CheckList = 'CheckList', - Diagnostic = 'Diagnostic', - Generate = 'Generate', - LineChart = 'LineChart', - Equalizer = 'Equalizer', - BarChartHorizontal = 'BarChartHorizontal', - BarChartVertical = 'BarChartVertical', - Freezing = 'Freezing', - FunnelChart = 'FunnelChart', - Processing = 'Processing', - Quantity = 'Quantity', - ReportDocument = 'ReportDocument', - StackColumnChart = 'StackColumnChart', - SnowShowerDay = 'SnowShowerDay', - HailDay = 'HailDay', - WorkFlow = 'WorkFlow', - HourGlass = 'HourGlass', - StoreLogoMed20 = 'StoreLogoMed20', - TimeSheet = 'TimeSheet', - TriangleSolid = 'TriangleSolid', - UpgradeAnalysis = 'UpgradeAnalysis', - VideoSolid = 'VideoSolid', - RainShowersNight = 'RainShowersNight', - SnowShowerNight = 'SnowShowerNight', - Teamwork = 'Teamwork', - HailNight = 'HailNight', - PeopleAdd = 'PeopleAdd', - Glasses = 'Glasses', - DateTime2 = 'DateTime2', - Shield = 'Shield', - Header1 = 'Header1', - PageAdd = 'PageAdd', - NumberedList = 'NumberedList', - PowerBILogo = 'PowerBILogo', - Info2 = 'Info2', - MusicInCollectionFill = 'MusicInCollectionFill', - List = 'List', - Asterisk = 'Asterisk', - ErrorBadge = 'ErrorBadge', - CircleRing = 'CircleRing', - CircleFill = 'CircleFill', - Record2 = 'Record2', - AllAppsMirrored = 'AllAppsMirrored', - BookmarksMirrored = 'BookmarksMirrored', - BulletedListMirrored = 'BulletedListMirrored', - CaretHollowMirrored = 'CaretHollowMirrored', - CaretSolidMirrored = 'CaretSolidMirrored', - ChromeBackMirrored = 'ChromeBackMirrored', - ClearSelectionMirrored = 'ClearSelectionMirrored', - ClosePaneMirrored = 'ClosePaneMirrored', - DockLeftMirrored = 'DockLeftMirrored', - DoubleChevronLeftMedMirrored = 'DoubleChevronLeftMedMirrored', - GoMirrored = 'GoMirrored', - HelpMirrored = 'HelpMirrored', - ImportMirrored = 'ImportMirrored', - ImportAllMirrored = 'ImportAllMirrored', - ListMirrored = 'ListMirrored', - MailForwardMirrored = 'MailForwardMirrored', - MailReplyMirrored = 'MailReplyMirrored', - MailReplyAllMirrored = 'MailReplyAllMirrored', - MiniContractMirrored = 'MiniContractMirrored', - MiniExpandMirrored = 'MiniExpandMirrored', - OpenPaneMirrored = 'OpenPaneMirrored', - ParkingLocationMirrored = 'ParkingLocationMirrored', - SendMirrored = 'SendMirrored', - ShowResultsMirrored = 'ShowResultsMirrored', - ThumbnailViewMirrored = 'ThumbnailViewMirrored', - Media = 'Media', - Devices3 = 'Devices3', - Focus = 'Focus', - VideoLightOff = 'VideoLightOff', - Lightbulb = 'Lightbulb', - StatusTriangle = 'StatusTriangle', - VolumeDisabled = 'VolumeDisabled', - Puzzle = 'Puzzle', - EmojiNeutral = 'EmojiNeutral', - EmojiDisappointed = 'EmojiDisappointed', - HomeSolid = 'HomeSolid', - Ringer = 'Ringer', - PDF = 'PDF', - HeartBroken = 'HeartBroken', - StoreLogo16 = 'StoreLogo16', - MultiSelectMirrored = 'MultiSelectMirrored', - Broom = 'Broom', - AddToShoppingList = 'AddToShoppingList', - Cocktails = 'Cocktails', - Wines = 'Wines', - Articles = 'Articles', - Cycling = 'Cycling', - DietPlanNotebook = 'DietPlanNotebook', - Pill = 'Pill', - ExerciseTracker = 'ExerciseTracker', - HandsFree = 'HandsFree', - Medical = 'Medical', - Running = 'Running', - Weights = 'Weights', - Trackers = 'Trackers', - AddNotes = 'AddNotes', - AllCurrency = 'AllCurrency', - BarChart4 = 'BarChart4', - CirclePlus = 'CirclePlus', - Coffee = 'Coffee', - Cotton = 'Cotton', - Market = 'Market', - Money = 'Money', - PieDouble = 'PieDouble', - PieSingle = 'PieSingle', - RemoveFilter = 'RemoveFilter', - Savings = 'Savings', - Sell = 'Sell', - StockDown = 'StockDown', - StockUp = 'StockUp', - Lamp = 'Lamp', - Source = 'Source', - MSNVideos = 'MSNVideos', - Cricket = 'Cricket', - Golf = 'Golf', - Baseball = 'Baseball', - Soccer = 'Soccer', - MoreSports = 'MoreSports', - AutoRacing = 'AutoRacing', - CollegeHoops = 'CollegeHoops', - CollegeFootball = 'CollegeFootball', - ProFootball = 'ProFootball', - ProHockey = 'ProHockey', - Rugby = 'Rugby', - SubstitutionsIn = 'SubstitutionsIn', - Tennis = 'Tennis', - Arrivals = 'Arrivals', - Design = 'Design', - Website = 'Website', - Drop = 'Drop', - HistoricalWeather = 'HistoricalWeather', - SkiResorts = 'SkiResorts', - Snowflake = 'Snowflake', - BusSolid = 'BusSolid', - FerrySolid = 'FerrySolid', - AirplaneSolid = 'AirplaneSolid', - TrainSolid = 'TrainSolid', - Heart = 'Heart', - HeartFill = 'HeartFill', - Ticket = 'Ticket', - WifiWarning4 = 'WifiWarning4', - Devices4 = 'Devices4', - AzureLogo = 'AzureLogo', - BingLogo = 'BingLogo', - MSNLogo = 'MSNLogo', - OutlookLogoInverse = 'OutlookLogoInverse', - OfficeLogo = 'OfficeLogo', - SkypeLogo = 'SkypeLogo', - Door = 'Door', - EditMirrored = 'EditMirrored', - GiftCard = 'GiftCard', - DoubleBookmark = 'DoubleBookmark', - StatusErrorFull = 'StatusErrorFull', - Certificate = 'Certificate', - FastForward = 'FastForward', - Rewind = 'Rewind', - Photo2 = 'Photo2', - OpenSource = 'OpenSource', - Movers = 'Movers', - CloudDownload = 'CloudDownload', - Family = 'Family', - WindDirection = 'WindDirection', - Bug = 'Bug', - SiteScan = 'SiteScan', - BrowserScreenShot = 'BrowserScreenShot', - F12DevTools = 'F12DevTools', - CSS = 'CSS', - JS = 'JS', - DeliveryTruck = 'DeliveryTruck', - ReminderPerson = 'ReminderPerson', - ReminderGroup = 'ReminderGroup', - TabletMode = 'TabletMode', - Umbrella = 'Umbrella', - NetworkTower = 'NetworkTower', - CityNext = 'CityNext', - CityNext2 = 'CityNext2', - Section = 'Section', - OneNoteLogoInverse = 'OneNoteLogoInverse', - ToggleFilled = 'ToggleFilled', - ToggleBorder = 'ToggleBorder', - SliderThumb = 'SliderThumb', - ToggleThumb = 'ToggleThumb', - Documentation = 'Documentation', - Badge = 'Badge', - Giftbox = 'Giftbox', - VisualStudioLogo = 'VisualStudioLogo', - HomeGroup = 'HomeGroup', - ExcelLogoInverse = 'ExcelLogoInverse', - WordLogoInverse = 'WordLogoInverse', - PowerPointLogoInverse = 'PowerPointLogoInverse', - Cafe = 'Cafe', - SpeedHigh = 'SpeedHigh', - Commitments = 'Commitments', - ThisPC = 'ThisPC', - MusicNote = 'MusicNote', - MicOff = 'MicOff', - PlaybackRate1x = 'PlaybackRate1x', - EdgeLogo = 'EdgeLogo', - CompletedSolid = 'CompletedSolid', - AlbumRemove = 'AlbumRemove', - MessageFill = 'MessageFill', - TabletSelected = 'TabletSelected', - MobileSelected = 'MobileSelected', - LaptopSelected = 'LaptopSelected', - TVMonitorSelected = 'TVMonitorSelected', - DeveloperTools = 'DeveloperTools', - Shapes = 'Shapes', - InsertTextBox = 'InsertTextBox', - LowerBrightness = 'LowerBrightness', - WebComponents = 'WebComponents', - OfflineStorage = 'OfflineStorage', - DOM = 'DOM', - CloudUpload = 'CloudUpload', - ScrollUpDown = 'ScrollUpDown', - DateTime = 'DateTime', - Event = 'Event', - Cake = 'Cake', - Tiles = 'Tiles', - Org = 'Org', - PartyLeader = 'PartyLeader', - DRM = 'DRM', - CloudAdd = 'CloudAdd', - AppIconDefault = 'AppIconDefault', - Photo2Add = 'Photo2Add', - Photo2Remove = 'Photo2Remove', - Calories = 'Calories', - POI = 'POI', - AddTo = 'AddTo', - RadioBtnOff = 'RadioBtnOff', - RadioBtnOn = 'RadioBtnOn', - ExploreContent = 'ExploreContent', - Embed = 'Embed', - Product = 'Product', - ProgressLoopInner = 'ProgressLoopInner', - ProgressLoopOuter = 'ProgressLoopOuter', - Blocked2 = 'Blocked2', - FangBody = 'FangBody', - PageHeader = 'PageHeader', - Glimmer = 'Glimmer', - ChatInviteFriend = 'ChatInviteFriend', - Brush = 'Brush', - Shirt = 'Shirt', - Crown = 'Crown', - Diamond = 'Diamond', - ScaleUp = 'ScaleUp', - QRCode = 'QRCode', - Feedback = 'Feedback', - SharepointLogoInverse = 'SharepointLogoInverse', - YammerLogo = 'YammerLogo', - Hide = 'Hide', - Uneditable = 'Uneditable', - ReturnToSession = 'ReturnToSession', - OpenFolderHorizontal = 'OpenFolderHorizontal', - CalendarMirrored = 'CalendarMirrored', - SwayLogoInverse = 'SwayLogoInverse', - OutOfOffice = 'OutOfOffice', - Trophy = 'Trophy', - ReopenPages = 'ReopenPages', - EmojiTabSymbols = 'EmojiTabSymbols', - AADLogo = 'AADLogo', - AccessLogo = 'AccessLogo', - AdminALogoInverse32 = 'AdminALogoInverse32', - AdminCLogoInverse32 = 'AdminCLogoInverse32', - AdminDLogoInverse32 = 'AdminDLogoInverse32', - AdminELogoInverse32 = 'AdminELogoInverse32', - AdminLLogoInverse32 = 'AdminLLogoInverse32', - AdminMLogoInverse32 = 'AdminMLogoInverse32', - AdminOLogoInverse32 = 'AdminOLogoInverse32', - AdminPLogoInverse32 = 'AdminPLogoInverse32', - AdminSLogoInverse32 = 'AdminSLogoInverse32', - AdminYLogoInverse32 = 'AdminYLogoInverse32', - DelveLogoInverse = 'DelveLogoInverse', - ExchangeLogoInverse = 'ExchangeLogoInverse', - LyncLogo = 'LyncLogo', - OfficeVideoLogoInverse = 'OfficeVideoLogoInverse', - SocialListeningLogo = 'SocialListeningLogo', - VisioLogoInverse = 'VisioLogoInverse', - Balloons = 'Balloons', - Cat = 'Cat', - MailAlert = 'MailAlert', - MailCheck = 'MailCheck', - MailLowImportance = 'MailLowImportance', - MailPause = 'MailPause', - MailRepeat = 'MailRepeat', - SecurityGroup = 'SecurityGroup', - Table = 'Table', - VoicemailForward = 'VoicemailForward', - VoicemailReply = 'VoicemailReply', - Waffle = 'Waffle', - RemoveEvent = 'RemoveEvent', - EventInfo = 'EventInfo', - ForwardEvent = 'ForwardEvent', - WipePhone = 'WipePhone', - AddOnlineMeeting = 'AddOnlineMeeting', - JoinOnlineMeeting = 'JoinOnlineMeeting', - RemoveLink = 'RemoveLink', - PeopleBlock = 'PeopleBlock', - PeopleRepeat = 'PeopleRepeat', - PeopleAlert = 'PeopleAlert', - PeoplePause = 'PeoplePause', - TransferCall = 'TransferCall', - AddPhone = 'AddPhone', - UnknownCall = 'UnknownCall', - NoteReply = 'NoteReply', - NoteForward = 'NoteForward', - NotePinned = 'NotePinned', - RemoveOccurrence = 'RemoveOccurrence', - Timeline = 'Timeline', - EditNote = 'EditNote', - CircleHalfFull = 'CircleHalfFull', - Room = 'Room', - Unsubscribe = 'Unsubscribe', - Subscribe = 'Subscribe', - HardDrive = 'HardDrive', - RecurringTask = 'RecurringTask', - TaskManager = 'TaskManager', - TaskManagerMirrored = 'TaskManagerMirrored', - Combine = 'Combine', - Split = 'Split', - DoubleChevronUp = 'DoubleChevronUp', - DoubleChevronLeft = 'DoubleChevronLeft', - DoubleChevronRight = 'DoubleChevronRight', - Ascending = 'Ascending', - Descending = 'Descending', - TextBox = 'TextBox', - TextField = 'TextField', - NumberField = 'NumberField', - Dropdown = 'Dropdown', - PenWorkspace = 'PenWorkspace', - BookingsLogo = 'BookingsLogo', - ClassNotebookLogoInverse = 'ClassNotebookLogoInverse', - DelveAnalyticsLogo = 'DelveAnalyticsLogo', - DocsLogoInverse = 'DocsLogoInverse', - Dynamics365Logo = 'Dynamics365Logo', - DynamicSMBLogo = 'DynamicSMBLogo', - OfficeAssistantLogo = 'OfficeAssistantLogo', - OfficeStoreLogo = 'OfficeStoreLogo', - OneNoteEduLogoInverse = 'OneNoteEduLogoInverse', - PlannerLogo = 'PlannerLogo', - PowerApps = 'PowerApps', - Suitcase = 'Suitcase', - ProjectLogoInverse = 'ProjectLogoInverse', - CaretLeft8 = 'CaretLeft8', - CaretRight8 = 'CaretRight8', - CaretUp8 = 'CaretUp8', - CaretDown8 = 'CaretDown8', - CaretLeftSolid8 = 'CaretLeftSolid8', - CaretRightSolid8 = 'CaretRightSolid8', - CaretUpSolid8 = 'CaretUpSolid8', - CaretDownSolid8 = 'CaretDownSolid8', - ClearFormatting = 'ClearFormatting', - Superscript = 'Superscript', - Subscript = 'Subscript', - Strikethrough = 'Strikethrough', - Export = 'Export', - ExportMirrored = 'ExportMirrored', - SingleBookmark = 'SingleBookmark', - SingleBookmarkSolid = 'SingleBookmarkSolid', - DoubleChevronDown = 'DoubleChevronDown', - FollowUser = 'FollowUser', - ReplyAll = 'ReplyAll', - WorkforceManagement = 'WorkforceManagement', - RecruitmentManagement = 'RecruitmentManagement', - Questionnaire = 'Questionnaire', - ManagerSelfService = 'ManagerSelfService', - ProductRelease = 'ProductRelease', - ReplyMirrored = 'ReplyMirrored', - ReplyAllMirrored = 'ReplyAllMirrored', - Medal = 'Medal', - AddGroup = 'AddGroup', - QuestionnaireMirrored = 'QuestionnaireMirrored', - CloudImportExport = 'CloudImportExport', - TemporaryUser = 'TemporaryUser', - CaretSolid16 = 'CaretSolid16', - GroupedDescending = 'GroupedDescending', - GroupedAscending = 'GroupedAscending', - SortUp = 'SortUp', - SortDown = 'SortDown', - AwayStatus = 'AwayStatus', - MyMoviesTV = 'MyMoviesTV', - SyncToPC = 'SyncToPC', - GenericScan = 'GenericScan', - AustralianRules = 'AustralianRules', - WifiEthernet = 'WifiEthernet', - TrackersMirrored = 'TrackersMirrored', - DateTimeMirrored = 'DateTimeMirrored', - StopSolid = 'StopSolid', - DoubleChevronUp12 = 'DoubleChevronUp12', - DoubleChevronDown12 = 'DoubleChevronDown12', - DoubleChevronLeft12 = 'DoubleChevronLeft12', - DoubleChevronRight12 = 'DoubleChevronRight12', - CalendarAgenda = 'CalendarAgenda', - ConnectVirtualMachine = 'ConnectVirtualMachine', - AddEvent = 'AddEvent', - AssetLibrary = 'AssetLibrary', - DataConnectionLibrary = 'DataConnectionLibrary', - DocLibrary = 'DocLibrary', - FormLibrary = 'FormLibrary', - FormLibraryMirrored = 'FormLibraryMirrored', - ReportLibrary = 'ReportLibrary', - ReportLibraryMirrored = 'ReportLibraryMirrored', - ContactCard = 'ContactCard', - CustomList = 'CustomList', - CustomListMirrored = 'CustomListMirrored', - IssueTracking = 'IssueTracking', - IssueTrackingMirrored = 'IssueTrackingMirrored', - PictureLibrary = 'PictureLibrary', - OfficeAddinsLogo = 'OfficeAddinsLogo', - OfflineOneDriveParachute = 'OfflineOneDriveParachute', - OfflineOneDriveParachuteDisabled = 'OfflineOneDriveParachuteDisabled', - LargeGrid = 'LargeGrid', - TriangleSolidUp12 = 'TriangleSolidUp12', - TriangleSolidDown12 = 'TriangleSolidDown12', - TriangleSolidLeft12 = 'TriangleSolidLeft12', - TriangleSolidRight12 = 'TriangleSolidRight12', - TriangleUp12 = 'TriangleUp12', - TriangleDown12 = 'TriangleDown12', - TriangleLeft12 = 'TriangleLeft12', - TriangleRight12 = 'TriangleRight12', - ArrowUpRight8 = 'ArrowUpRight8', - ArrowDownRight8 = 'ArrowDownRight8', - DocumentSet = 'DocumentSet', - DelveAnalytics = 'DelveAnalytics', - ArrowUpRightMirrored8 = 'ArrowUpRightMirrored8', - ArrowDownRightMirrored8 = 'ArrowDownRightMirrored8', - CompanyDirectory = 'CompanyDirectory', - OpenEnrollment = 'OpenEnrollment', - CompanyDirectoryMirrored = 'CompanyDirectoryMirrored', - OneDriveAdd = 'OneDriveAdd', - ProfileSearch = 'ProfileSearch', - Header2 = 'Header2', - Header3 = 'Header3', - Header4 = 'Header4', - RingerSolid = 'RingerSolid', - Eyedropper = 'Eyedropper', - MarketDown = 'MarketDown', - CalendarWorkWeek = 'CalendarWorkWeek', - SidePanel = 'SidePanel', - GlobeFavorite = 'GlobeFavorite', - CaretTopLeftSolid8 = 'CaretTopLeftSolid8', - CaretTopRightSolid8 = 'CaretTopRightSolid8', - ViewAll2 = 'ViewAll2', - DocumentReply = 'DocumentReply', - PlayerSettings = 'PlayerSettings', - ReceiptForward = 'ReceiptForward', - ReceiptReply = 'ReceiptReply', - ReceiptCheck = 'ReceiptCheck', - Fax = 'Fax', - RecurringEvent = 'RecurringEvent', - ReplyAlt = 'ReplyAlt', - ReplyAllAlt = 'ReplyAllAlt', - EditStyle = 'EditStyle', - EditMail = 'EditMail', - Lifesaver = 'Lifesaver', - LifesaverLock = 'LifesaverLock', - InboxCheck = 'InboxCheck', - FolderSearch = 'FolderSearch', - CollapseMenu = 'CollapseMenu', - ExpandMenu = 'ExpandMenu', - Boards = 'Boards', - SunAdd = 'SunAdd', - SunQuestionMark = 'SunQuestionMark', - LandscapeOrientation = 'LandscapeOrientation', - DocumentSearch = 'DocumentSearch', - PublicCalendar = 'PublicCalendar', - PublicContactCard = 'PublicContactCard', - PublicEmail = 'PublicEmail', - PublicFolder = 'PublicFolder', - WordDocument = 'WordDocument', - PowerPointDocument = 'PowerPointDocument', - ExcelDocument = 'ExcelDocument', - GroupedList = 'GroupedList', - ClassroomLogo = 'ClassroomLogo', - Sections = 'Sections', - EditPhoto = 'EditPhoto', - Starburst = 'Starburst', - ShareiOS = 'ShareiOS', - AirTickets = 'AirTickets', - PencilReply = 'PencilReply', - Tiles2 = 'Tiles2', - SkypeCircleCheck = 'SkypeCircleCheck', - SkypeCircleClock = 'SkypeCircleClock', - SkypeCircleMinus = 'SkypeCircleMinus', - SkypeCheck = 'SkypeCheck', - SkypeClock = 'SkypeClock', - SkypeMinus = 'SkypeMinus', - SkypeMessage = 'SkypeMessage', - ClosedCaption = 'ClosedCaption', - ATPLogo = 'ATPLogo', - OfficeFormsLogoInverse = 'OfficeFormsLogoInverse', - RecycleBin = 'RecycleBin', - EmptyRecycleBin = 'EmptyRecycleBin', - Hide2 = 'Hide2', - Breadcrumb = 'Breadcrumb', - BirthdayCake = 'BirthdayCake', - ClearFilter = 'ClearFilter', - Flow = 'Flow', - TimeEntry = 'TimeEntry', - CRMProcesses = 'CRMProcesses', - PageEdit = 'PageEdit', - PageArrowRight = 'PageArrowRight', - PageRemove = 'PageRemove', - Database = 'Database', - DataManagementSettings = 'DataManagementSettings', - CRMServices = 'CRMServices', - EditContact = 'EditContact', - ConnectContacts = 'ConnectContacts', - AppIconDefaultAdd = 'AppIconDefaultAdd', - AppIconDefaultList = 'AppIconDefaultList', - ActivateOrders = 'ActivateOrders', - DeactivateOrders = 'DeactivateOrders', - ScatterChart = 'ScatterChart', - DocumentManagement = 'DocumentManagement', - CRMReport = 'CRMReport', - KnowledgeArticle = 'KnowledgeArticle', - Relationship = 'Relationship', - HomeVerify = 'HomeVerify', - ZipFolder = 'ZipFolder', - SurveyQuestions = 'SurveyQuestions', - TextDocument = 'TextDocument', - TextDocumentShared = 'TextDocumentShared', - PageCheckedOut = 'PageCheckedOut', - SaveAndClose = 'SaveAndClose', - Script = 'Script', - Archive = 'Archive', - ActivityFeed = 'ActivityFeed', - Compare = 'Compare', - EventDate = 'EventDate', - ArrowUpRight = 'ArrowUpRight', - CaretRight = 'CaretRight', - SetAction = 'SetAction', - CaretSolidLeft = 'CaretSolidLeft', - CaretSolidDown = 'CaretSolidDown', - CaretSolidRight = 'CaretSolidRight', - CaretSolidUp = 'CaretSolidUp', - PowerAppsLogo = 'PowerAppsLogo', - PowerApps2Logo = 'PowerApps2Logo', - SearchIssue = 'SearchIssue', - SearchIssueMirrored = 'SearchIssueMirrored', - FabricAssetLibrary = 'FabricAssetLibrary', - FabricDataConnectionLibrary = 'FabricDataConnectionLibrary', - FabricDocLibrary = 'FabricDocLibrary', - FabricFormLibrary = 'FabricFormLibrary', - FabricFormLibraryMirrored = 'FabricFormLibraryMirrored', - FabricReportLibrary = 'FabricReportLibrary', - FabricReportLibraryMirrored = 'FabricReportLibraryMirrored', - FabricPublicFolder = 'FabricPublicFolder', - FabricFolderSearch = 'FabricFolderSearch', - FabricMovetoFolder = 'FabricMovetoFolder', - FabricUnsyncFolder = 'FabricUnsyncFolder', - FabricSyncFolder = 'FabricSyncFolder', - FabricOpenFolderHorizontal = 'FabricOpenFolderHorizontal', - FabricFolder = 'FabricFolder', - FabricFolderFill = 'FabricFolderFill', - FabricNewFolder = 'FabricNewFolder', - FabricPictureLibrary = 'FabricPictureLibrary', - AddFavorite = 'AddFavorite', - AddFavoriteFill = 'AddFavoriteFill', - BufferTimeBefore = 'BufferTimeBefore', - BufferTimeAfter = 'BufferTimeAfter', - BufferTimeBoth = 'BufferTimeBoth', - PublishContent = 'PublishContent', - ClipboardList = 'ClipboardList', - ClipboardListMirrored = 'ClipboardListMirrored', - CannedChat = 'CannedChat', - SkypeForBusinessLogo = 'SkypeForBusinessLogo', - TabCenter = 'TabCenter', - PageCheckedin = 'PageCheckedin', - PageList = 'PageList', - ReadOutLoud = 'ReadOutLoud', - CaretBottomLeftSolid8 = 'CaretBottomLeftSolid8', - CaretBottomRightSolid8 = 'CaretBottomRightSolid8', - FolderHorizontal = 'FolderHorizontal', - MicrosoftStaffhubLogo = 'MicrosoftStaffhubLogo', - GiftboxOpen = 'GiftboxOpen', - StatusCircleOuter = 'StatusCircleOuter', - StatusCircleInner = 'StatusCircleInner', - StatusCircleRing = 'StatusCircleRing', - StatusTriangleOuter = 'StatusTriangleOuter', - StatusTriangleInner = 'StatusTriangleInner', - StatusTriangleExclamation = 'StatusTriangleExclamation', - StatusCircleExclamation = 'StatusCircleExclamation', - StatusCircleErrorX = 'StatusCircleErrorX', - StatusCircleCheckmark = 'StatusCircleCheckmark', - StatusCircleInfo = 'StatusCircleInfo', - StatusCircleBlock = 'StatusCircleBlock', - StatusCircleBlock2 = 'StatusCircleBlock2', - StatusCircleQuestionMark = 'StatusCircleQuestionMark', - StatusCircleSync = 'StatusCircleSync', - Toll = 'Toll', - ExploreContentSingle = 'ExploreContentSingle', - CollapseContent = 'CollapseContent', - CollapseContentSingle = 'CollapseContentSingle', - InfoSolid = 'InfoSolid', - GroupList = 'GroupList', - ProgressRingDots = 'ProgressRingDots', - CaloriesAdd = 'CaloriesAdd', - BranchFork = 'BranchFork', - AddHome = 'AddHome', - AddWork = 'AddWork', - MobileReport = 'MobileReport', - ScaleVolume = 'ScaleVolume', - HardDriveGroup = 'HardDriveGroup', - FastMode = 'FastMode', - ToggleLeft = 'ToggleLeft', - ToggleRight = 'ToggleRight', - TriangleShape = 'TriangleShape', - RectangleShape = 'RectangleShape', - CubeShape = 'CubeShape', - Trophy2 = 'Trophy2', - BucketColor = 'BucketColor', - BucketColorFill = 'BucketColorFill', - Taskboard = 'Taskboard', - SingleColumn = 'SingleColumn', - DoubleColumn = 'DoubleColumn', - TripleColumn = 'TripleColumn', - ColumnLeftTwoThirds = 'ColumnLeftTwoThirds', - ColumnRightTwoThirds = 'ColumnRightTwoThirds', - AccessLogoFill = 'AccessLogoFill', - AnalyticsLogo = 'AnalyticsLogo', - AnalyticsQuery = 'AnalyticsQuery', - NewAnalyticsQuery = 'NewAnalyticsQuery', - AnalyticsReport = 'AnalyticsReport', - WordLogo = 'WordLogo', - WordLogoFill = 'WordLogoFill', - ExcelLogo = 'ExcelLogo', - ExcelLogoFill = 'ExcelLogoFill', - OneNoteLogo = 'OneNoteLogo', - OneNoteLogoFill = 'OneNoteLogoFill', - OutlookLogo = 'OutlookLogo', - OutlookLogoFill = 'OutlookLogoFill', - PowerPointLogo = 'PowerPointLogo', - PowerPointLogoFill = 'PowerPointLogoFill', - PublisherLogo = 'PublisherLogo', - PublisherLogoFill = 'PublisherLogoFill', - ScheduleEventAction = 'ScheduleEventAction', - FlameSolid = 'FlameSolid', - ServerProcesses = 'ServerProcesses', - Server = 'Server', - SaveAll = 'SaveAll', - LinkedInLogo = 'LinkedInLogo', - Decimals = 'Decimals', - SidePanelMirrored = 'SidePanelMirrored', - ProtectRestrict = 'ProtectRestrict', - Blog = 'Blog', - UnknownMirrored = 'UnknownMirrored', - PublicContactCardMirrored = 'PublicContactCardMirrored', - GridViewSmall = 'GridViewSmall', - GridViewMedium = 'GridViewMedium', - GridViewLarge = 'GridViewLarge', - Step = 'Step', - StepInsert = 'StepInsert', - StepShared = 'StepShared', - StepSharedAdd = 'StepSharedAdd', - StepSharedInsert = 'StepSharedInsert', - ViewDashboard = 'ViewDashboard', - ViewList = 'ViewList', - ViewListGroup = 'ViewListGroup', - ViewListTree = 'ViewListTree', - TriggerAuto = 'TriggerAuto', - TriggerUser = 'TriggerUser', - PivotChart = 'PivotChart', - StackedBarChart = 'StackedBarChart', - StackedLineChart = 'StackedLineChart', - BuildQueue = 'BuildQueue', - BuildQueueNew = 'BuildQueueNew', - UserFollowed = 'UserFollowed', - ContactLink = 'ContactLink', - Stack = 'Stack', - Bullseye = 'Bullseye', - VennDiagram = 'VennDiagram', - FiveTileGrid = 'FiveTileGrid', - FocalPoint = 'FocalPoint', - RingerRemove = 'RingerRemove', - TeamsLogoInverse = 'TeamsLogoInverse', - TeamsLogo = 'TeamsLogo', - TeamsLogoFill = 'TeamsLogoFill', - SkypeForBusinessLogoFill = 'SkypeForBusinessLogoFill', - SharepointLogo = 'SharepointLogo', - SharepointLogoFill = 'SharepointLogoFill', - DelveLogo = 'DelveLogo', - DelveLogoFill = 'DelveLogoFill', - OfficeVideoLogo = 'OfficeVideoLogo', - OfficeVideoLogoFill = 'OfficeVideoLogoFill', - ExchangeLogo = 'ExchangeLogo', - ExchangeLogoFill = 'ExchangeLogoFill', - Signin = 'Signin', - DocumentApproval = 'DocumentApproval', - CloneToDesktop = 'CloneToDesktop', - InstallToDrive = 'InstallToDrive', - Blur = 'Blur', - Build = 'Build', - ProcessMetaTask = 'ProcessMetaTask', - BranchFork2 = 'BranchFork2', - BranchLocked = 'BranchLocked', - BranchCommit = 'BranchCommit', - BranchCompare = 'BranchCompare', - BranchMerge = 'BranchMerge', - BranchPullRequest = 'BranchPullRequest', - BranchSearch = 'BranchSearch', - BranchShelveset = 'BranchShelveset', - RawSource = 'RawSource', - MergeDuplicate = 'MergeDuplicate', - RowsGroup = 'RowsGroup', - RowsChild = 'RowsChild', - Deploy = 'Deploy', - Redeploy = 'Redeploy', - ServerEnviroment = 'ServerEnviroment', - VisioDiagram = 'VisioDiagram', - HighlightMappedShapes = 'HighlightMappedShapes', - TextCallout = 'TextCallout', - IconSetsFlag = 'IconSetsFlag', - VisioLogo = 'VisioLogo', - VisioLogoFill = 'VisioLogoFill', - VisioDocument = 'VisioDocument', - TimelineProgress = 'TimelineProgress', - TimelineDelivery = 'TimelineDelivery', - Backlog = 'Backlog', - TeamFavorite = 'TeamFavorite', - TaskGroup = 'TaskGroup', - TaskGroupMirrored = 'TaskGroupMirrored', - ScopeTemplate = 'ScopeTemplate', - AssessmentGroupTemplate = 'AssessmentGroupTemplate', - NewTeamProject = 'NewTeamProject', - CommentAdd = 'CommentAdd', - CommentNext = 'CommentNext', - CommentPrevious = 'CommentPrevious', - ShopServer = 'ShopServer', - LocaleLanguage = 'LocaleLanguage', - QueryList = 'QueryList', - UserSync = 'UserSync', - UserPause = 'UserPause', - StreamingOff = 'StreamingOff', - MoreVertical = 'MoreVertical', - ArrowTallUpLeft = 'ArrowTallUpLeft', - ArrowTallUpRight = 'ArrowTallUpRight', - ArrowTallDownLeft = 'ArrowTallDownLeft', - ArrowTallDownRight = 'ArrowTallDownRight', - FieldEmpty = 'FieldEmpty', - FieldFilled = 'FieldFilled', - FieldChanged = 'FieldChanged', - FieldNotChanged = 'FieldNotChanged', - RingerOff = 'RingerOff', - PlayResume = 'PlayResume', - BulletedList2 = 'BulletedList2', - BulletedList2Mirrored = 'BulletedList2Mirrored', - ImageCrosshair = 'ImageCrosshair', - GitGraph = 'GitGraph', - Repo = 'Repo', - RepoSolid = 'RepoSolid', - FolderQuery = 'FolderQuery', - FolderList = 'FolderList', - FolderListMirrored = 'FolderListMirrored', - LocationOutline = 'LocationOutline', - POISolid = 'POISolid', - CalculatorNotEqualTo = 'CalculatorNotEqualTo', - BoxSubtractSolid = 'BoxSubtractSolid', - BoxAdditionSolid = 'BoxAdditionSolid', - BoxMultiplySolid = 'BoxMultiplySolid', - BoxPlaySolid = 'BoxPlaySolid', - BoxCheckmarkSolid = 'BoxCheckmarkSolid', - CirclePauseSolid = 'CirclePauseSolid', - CirclePause = 'CirclePause', - MSNVideosSolid = 'MSNVideosSolid', - CircleStopSolid = 'CircleStopSolid', - CircleStop = 'CircleStop', - NavigateBack = 'NavigateBack', - NavigateBackMirrored = 'NavigateBackMirrored', - NavigateForward = 'NavigateForward', - NavigateForwardMirrored = 'NavigateForwardMirrored', - UnknownSolid = 'UnknownSolid', - UnknownMirroredSolid = 'UnknownMirroredSolid', - CircleAddition = 'CircleAddition', - CircleAdditionSolid = 'CircleAdditionSolid', - FilePDB = 'FilePDB', - FileTemplate = 'FileTemplate', - FileSQL = 'FileSQL', - FileJAVA = 'FileJAVA', - FileASPX = 'FileASPX', - FileCSS = 'FileCSS', - FileSass = 'FileSass', - FileLess = 'FileLess', - FileHTML = 'FileHTML', - JavaScriptLanguage = 'JavaScriptLanguage', - CSharpLanguage = 'CSharpLanguage', - CSharp = 'CSharp', - VisualBasicLanguage = 'VisualBasicLanguage', - VB = 'VB', - CPlusPlusLanguage = 'CPlusPlusLanguage', - CPlusPlus = 'CPlusPlus', - FSharpLanguage = 'FSharpLanguage', - FSharp = 'FSharp', - TypeScriptLanguage = 'TypeScriptLanguage', - PythonLanguage = 'PythonLanguage', - PY = 'PY', - CoffeeScript = 'CoffeeScript', - MarkDownLanguage = 'MarkDownLanguage', - FullWidth = 'FullWidth', - FullWidthEdit = 'FullWidthEdit', - Plug = 'Plug', - PlugSolid = 'PlugSolid', - PlugConnected = 'PlugConnected', - PlugDisconnected = 'PlugDisconnected', - UnlockSolid = 'UnlockSolid', - Variable = 'Variable', - Parameter = 'Parameter', - CommentUrgent = 'CommentUrgent', - Storyboard = 'Storyboard', - DiffInline = 'DiffInline', - DiffSideBySide = 'DiffSideBySide', - ImageDiff = 'ImageDiff', - ImagePixel = 'ImagePixel', - FileBug = 'FileBug', - FileCode = 'FileCode', - FileComment = 'FileComment', - BusinessHoursSign = 'BusinessHoursSign', - FileImage = 'FileImage', - FileSymlink = 'FileSymlink', - AutoFillTemplate = 'AutoFillTemplate', - WorkItem = 'WorkItem', - WorkItemBug = 'WorkItemBug', - LogRemove = 'LogRemove', - ColumnOptions = 'ColumnOptions', - Packages = 'Packages', - BuildIssue = 'BuildIssue', - AssessmentGroup = 'AssessmentGroup', - VariableGroup = 'VariableGroup', - FullHistory = 'FullHistory', - Wheelchair = 'Wheelchair', - SingleColumnEdit = 'SingleColumnEdit', - DoubleColumnEdit = 'DoubleColumnEdit', - TripleColumnEdit = 'TripleColumnEdit', - ColumnLeftTwoThirdsEdit = 'ColumnLeftTwoThirdsEdit', - ColumnRightTwoThirdsEdit = 'ColumnRightTwoThirdsEdit', - StreamLogo = 'StreamLogo', - PassiveAuthentication = 'PassiveAuthentication', - AlertSolid = 'AlertSolid', - MegaphoneSolid = 'MegaphoneSolid', - TaskSolid = 'TaskSolid', - ConfigurationSolid = 'ConfigurationSolid', - BugSolid = 'BugSolid', - CrownSolid = 'CrownSolid', - Trophy2Solid = 'Trophy2Solid', - QuickNoteSolid = 'QuickNoteSolid', - ConstructionConeSolid = 'ConstructionConeSolid', - PageListSolid = 'PageListSolid', - PageListMirroredSolid = 'PageListMirroredSolid', - StarburstSolid = 'StarburstSolid', - ReadingModeSolid = 'ReadingModeSolid', - SadSolid = 'SadSolid', - HealthSolid = 'HealthSolid', - ShieldSolid = 'ShieldSolid', - GiftBoxSolid = 'GiftBoxSolid', - ShoppingCartSolid = 'ShoppingCartSolid', - MailSolid = 'MailSolid', - ChatSolid = 'ChatSolid', - RibbonSolid = 'RibbonSolid', - FinancialSolid = 'FinancialSolid', - FinancialMirroredSolid = 'FinancialMirroredSolid', - HeadsetSolid = 'HeadsetSolid', - PermissionsSolid = 'PermissionsSolid', - ParkingSolid = 'ParkingSolid', - ParkingMirroredSolid = 'ParkingMirroredSolid', - DiamondSolid = 'DiamondSolid', - AsteriskSolid = 'AsteriskSolid', - OfflineStorageSolid = 'OfflineStorageSolid', - BankSolid = 'BankSolid', - DecisionSolid = 'DecisionSolid', - Parachute = 'Parachute', - ParachuteSolid = 'ParachuteSolid', - FiltersSolid = 'FiltersSolid', - ColorSolid = 'ColorSolid', - ReviewSolid = 'ReviewSolid', - ReviewRequestSolid = 'ReviewRequestSolid', - ReviewRequestMirroredSolid = 'ReviewRequestMirroredSolid', - ReviewResponseSolid = 'ReviewResponseSolid', - FeedbackRequestSolid = 'FeedbackRequestSolid', - FeedbackRequestMirroredSolid = 'FeedbackRequestMirroredSolid', - FeedbackResponseSolid = 'FeedbackResponseSolid', - WorkItemBar = 'WorkItemBar', - WorkItemBarSolid = 'WorkItemBarSolid', - Separator = 'Separator', - NavigateExternalInline = 'NavigateExternalInline', - PlanView = 'PlanView', - TimelineMatrixView = 'TimelineMatrixView', - EngineeringGroup = 'EngineeringGroup', - ProjectCollection = 'ProjectCollection', - CaretBottomRightCenter8 = 'CaretBottomRightCenter8', - CaretBottomLeftCenter8 = 'CaretBottomLeftCenter8', - CaretTopRightCenter8 = 'CaretTopRightCenter8', - CaretTopLeftCenter8 = 'CaretTopLeftCenter8', - DonutChart = 'DonutChart', - ChevronUnfold10 = 'ChevronUnfold10', - ChevronFold10 = 'ChevronFold10', - DoubleChevronDown8 = 'DoubleChevronDown8', - DoubleChevronUp8 = 'DoubleChevronUp8', - DoubleChevronLeft8 = 'DoubleChevronLeft8', - DoubleChevronRight8 = 'DoubleChevronRight8', - ChevronDownEnd6 = 'ChevronDownEnd6', - ChevronUpEnd6 = 'ChevronUpEnd6', - ChevronLeftEnd6 = 'ChevronLeftEnd6', - ChevronRightEnd6 = 'ChevronRightEnd6', - ContextMenu = 'ContextMenu', - AzureAPIManagement = 'AzureAPIManagement', - AzureServiceEndpoint = 'AzureServiceEndpoint', - VSTSLogo = 'VSTSLogo', - VSTSAltLogo1 = 'VSTSAltLogo1', - VSTSAltLogo2 = 'VSTSAltLogo2', - FileTypeSolution = 'FileTypeSolution', - WordLogoInverse16 = 'WordLogoInverse16', - WordLogo16 = 'WordLogo16', - WordLogoFill16 = 'WordLogoFill16', - PowerPointLogoInverse16 = 'PowerPointLogoInverse16', - PowerPointLogo16 = 'PowerPointLogo16', - PowerPointLogoFill16 = 'PowerPointLogoFill16', - ExcelLogoInverse16 = 'ExcelLogoInverse16', - ExcelLogo16 = 'ExcelLogo16', - ExcelLogoFill16 = 'ExcelLogoFill16', - OneNoteLogoInverse16 = 'OneNoteLogoInverse16', - OneNoteLogo16 = 'OneNoteLogo16', - OneNoteLogoFill16 = 'OneNoteLogoFill16', - OutlookLogoInverse16 = 'OutlookLogoInverse16', - OutlookLogo16 = 'OutlookLogo16', - OutlookLogoFill16 = 'OutlookLogoFill16', - PublisherLogoInverse16 = 'PublisherLogoInverse16', - PublisherLogo16 = 'PublisherLogo16', - PublisherLogoFill16 = 'PublisherLogoFill16', - VisioLogoInverse16 = 'VisioLogoInverse16', - VisioLogo16 = 'VisioLogo16', - VisioLogoFill16 = 'VisioLogoFill16', - TestBeaker = 'TestBeaker', - TestBeakerSolid = 'TestBeakerSolid', - TestExploreSolid = 'TestExploreSolid', - TestAutoSolid = 'TestAutoSolid', - TestUserSolid = 'TestUserSolid', - TestImpactSolid = 'TestImpactSolid', - TestPlan = 'TestPlan', - TestStep = 'TestStep', - TestParameter = 'TestParameter', - TestSuite = 'TestSuite', - TestCase = 'TestCase', - Sprint = 'Sprint', - SignOut = 'SignOut', - TriggerApproval = 'TriggerApproval', - Rocket = 'Rocket', - AzureKeyVault = 'AzureKeyVault', - Onboarding = 'Onboarding', - Transition = 'Transition', - LikeSolid = 'LikeSolid', - DislikeSolid = 'DislikeSolid', - CRMCustomerInsightsApp = 'CRMCustomerInsightsApp', - EditCreate = 'EditCreate', - SearchData = 'SearchData', - UnSetColor = 'UnSetColor', - DeclineCall = 'DeclineCall', - RectangularClipping = 'RectangularClipping', - TeamsLogo16 = 'TeamsLogo16', - TeamsLogoFill16 = 'TeamsLogoFill16', - Spacer = 'Spacer', - SkypeLogo16 = 'SkypeLogo16', - SkypeForBusinessLogo16 = 'SkypeForBusinessLogo16', - SkypeForBusinessLogoFill16 = 'SkypeForBusinessLogoFill16', - FilterSolid = 'FilterSolid', - MailUndelivered = 'MailUndelivered', - MailTentative = 'MailTentative', - MailTentativeMirrored = 'MailTentativeMirrored', - MailReminder = 'MailReminder', - ReceiptUndelivered = 'ReceiptUndelivered', - ReceiptTentative = 'ReceiptTentative', - ReceiptTentativeMirrored = 'ReceiptTentativeMirrored', - Inbox = 'Inbox', - IRMReply = 'IRMReply', - IRMReplyMirrored = 'IRMReplyMirrored', - IRMForward = 'IRMForward', - IRMForwardMirrored = 'IRMForwardMirrored', - VoicemailIRM = 'VoicemailIRM', - EventAccepted = 'EventAccepted', - EventTentative = 'EventTentative', - EventTentativeMirrored = 'EventTentativeMirrored', - EventDeclined = 'EventDeclined', - IDBadge = 'IDBadge', - BackgroundColor = 'BackgroundColor', - OfficeFormsLogoInverse16 = 'OfficeFormsLogoInverse16', - OfficeFormsLogo = 'OfficeFormsLogo', - OfficeFormsLogoFill = 'OfficeFormsLogoFill', - OfficeFormsLogo16 = 'OfficeFormsLogo16', - OfficeFormsLogoFill16 = 'OfficeFormsLogoFill16', - OfficeFormsLogoInverse24 = 'OfficeFormsLogoInverse24', - OfficeFormsLogo24 = 'OfficeFormsLogo24', - OfficeFormsLogoFill24 = 'OfficeFormsLogoFill24', - PageLock = 'PageLock', - NotExecuted = 'NotExecuted', - NotImpactedSolid = 'NotImpactedSolid', - FieldReadOnly = 'FieldReadOnly', - FieldRequired = 'FieldRequired', - BacklogBoard = 'BacklogBoard', - ExternalBuild = 'ExternalBuild', - ExternalTFVC = 'ExternalTFVC', - ExternalXAML = 'ExternalXAML', - IssueSolid = 'IssueSolid', - DefectSolid = 'DefectSolid', - LadybugSolid = 'LadybugSolid', - NugetLogo = 'NugetLogo', - TFVCLogo = 'TFVCLogo', - ProjectLogo32 = 'ProjectLogo32', - ProjectLogoFill32 = 'ProjectLogoFill32', - ProjectLogo16 = 'ProjectLogo16', - ProjectLogoFill16 = 'ProjectLogoFill16', - SwayLogo32 = 'SwayLogo32', - SwayLogoFill32 = 'SwayLogoFill32', - SwayLogo16 = 'SwayLogo16', - SwayLogoFill16 = 'SwayLogoFill16', - ClassNotebookLogo32 = 'ClassNotebookLogo32', - ClassNotebookLogoFill32 = 'ClassNotebookLogoFill32', - ClassNotebookLogo16 = 'ClassNotebookLogo16', - ClassNotebookLogoFill16 = 'ClassNotebookLogoFill16', - ClassNotebookLogoInverse32 = 'ClassNotebookLogoInverse32', - ClassNotebookLogoInverse16 = 'ClassNotebookLogoInverse16', - StaffNotebookLogo32 = 'StaffNotebookLogo32', - StaffNotebookLogoFill32 = 'StaffNotebookLogoFill32', - StaffNotebookLogo16 = 'StaffNotebookLogo16', - StaffNotebookLogoFill16 = 'StaffNotebookLogoFill16', - StaffNotebookLogoInverted32 = 'StaffNotebookLogoInverted32', - StaffNotebookLogoInverted16 = 'StaffNotebookLogoInverted16', - KaizalaLogo = 'KaizalaLogo', - TaskLogo = 'TaskLogo', - ProtectionCenterLogo32 = 'ProtectionCenterLogo32', - GallatinLogo = 'GallatinLogo', - Globe2 = 'Globe2', - Guitar = 'Guitar', - Breakfast = 'Breakfast', - Brunch = 'Brunch', - BeerMug = 'BeerMug', - Vacation = 'Vacation', - Teeth = 'Teeth', - Taxi = 'Taxi', - Chopsticks = 'Chopsticks', - SyncOccurence = 'SyncOccurence', - UnsyncOccurence = 'UnsyncOccurence', - GIF = 'GIF', - PrimaryCalendar = 'PrimaryCalendar', - SearchCalendar = 'SearchCalendar', - VideoOff = 'VideoOff', - MicrosoftFlowLogo = 'MicrosoftFlowLogo', - BusinessCenterLogo = 'BusinessCenterLogo', - ToDoLogoBottom = 'ToDoLogoBottom', - ToDoLogoTop = 'ToDoLogoTop', - EditSolid12 = 'EditSolid12', - EditSolidMirrored12 = 'EditSolidMirrored12', - UneditableSolid12 = 'UneditableSolid12', - UneditableSolidMirrored12 = 'UneditableSolidMirrored12', - UneditableMirrored = 'UneditableMirrored', - AdminALogo32 = 'AdminALogo32', - AdminALogoFill32 = 'AdminALogoFill32', - ToDoLogoInverse = 'ToDoLogoInverse', - Snooze = 'Snooze', - WaffleOffice365 = 'WaffleOffice365', - ImageSearch = 'ImageSearch', - NewsSearch = 'NewsSearch', - VideoSearch = 'VideoSearch', - R = 'R', - FontColorA = 'FontColorA', - FontColorSwatch = 'FontColorSwatch', - LightWeight = 'LightWeight', - NormalWeight = 'NormalWeight', - SemiboldWeight = 'SemiboldWeight', - GroupObject = 'GroupObject', - UngroupObject = 'UngroupObject', - AlignHorizontalLeft = 'AlignHorizontalLeft', - AlignHorizontalCenter = 'AlignHorizontalCenter', - AlignHorizontalRight = 'AlignHorizontalRight', - AlignVerticalTop = 'AlignVerticalTop', - AlignVerticalCenter = 'AlignVerticalCenter', - AlignVerticalBottom = 'AlignVerticalBottom', - HorizontalDistributeCenter = 'HorizontalDistributeCenter', - VerticalDistributeCenter = 'VerticalDistributeCenter', - Ellipse = 'Ellipse', - Line = 'Line', - Octagon = 'Octagon', - Hexagon = 'Hexagon', - Pentagon = 'Pentagon', - RightTriangle = 'RightTriangle', - HalfCircle = 'HalfCircle', - QuarterCircle = 'QuarterCircle', - ThreeQuarterCircle = 'ThreeQuarterCircle', - SixPointStar = 'SixPointStar', - TwelvePointStar = 'TwelvePointStar', - ArrangeBringToFront = 'ArrangeBringToFront', - ArrangeSendToBack = 'ArrangeSendToBack', - ArrangeSendBackward = 'ArrangeSendBackward', - ArrangeBringForward = 'ArrangeBringForward', - BorderDash = 'BorderDash', - BorderDot = 'BorderDot', - LineStyle = 'LineStyle', - LineThickness = 'LineThickness', - WindowEdit = 'WindowEdit', - HintText = 'HintText', - MediaAdd = 'MediaAdd', - AnchorLock = 'AnchorLock', - AutoHeight = 'AutoHeight', - ChartSeries = 'ChartSeries', - ChartXAngle = 'ChartXAngle', - ChartYAngle = 'ChartYAngle', - Combobox = 'Combobox', - LineSpacing = 'LineSpacing', - Padding = 'Padding', - PaddingTop = 'PaddingTop', - PaddingBottom = 'PaddingBottom', - PaddingLeft = 'PaddingLeft', - PaddingRight = 'PaddingRight', - NavigationFlipper = 'NavigationFlipper', - AlignJustify = 'AlignJustify', - TextOverflow = 'TextOverflow', - VisualsFolder = 'VisualsFolder', - VisualsStore = 'VisualsStore', - PictureCenter = 'PictureCenter', - PictureFill = 'PictureFill', - PicturePosition = 'PicturePosition', - PictureStretch = 'PictureStretch', - PictureTile = 'PictureTile', - Slider = 'Slider', - SliderHandleSize = 'SliderHandleSize', - DefaultRatio = 'DefaultRatio', - NumberSequence = 'NumberSequence', - GUID = 'GUID', - ReportAdd = 'ReportAdd', - DashboardAdd = 'DashboardAdd', - MapPinSolid = 'MapPinSolid', - WebPublish = 'WebPublish', - PieSingleSolid = 'PieSingleSolid', - BlockedSolid = 'BlockedSolid', - DrillDown = 'DrillDown', - DrillDownSolid = 'DrillDownSolid', - DrillExpand = 'DrillExpand', - DrillShow = 'DrillShow', - SpecialEvent = 'SpecialEvent', - OneDriveFolder16 = 'OneDriveFolder16', - FunctionalManagerDashboard = 'FunctionalManagerDashboard', - BIDashboard = 'BIDashboard', - CodeEdit = 'CodeEdit', - RenewalCurrent = 'RenewalCurrent', - RenewalFuture = 'RenewalFuture', - SplitObject = 'SplitObject', - BulkUpload = 'BulkUpload', - DownloadDocument = 'DownloadDocument', - Flower = 'Flower', - WaitlistConfirm = 'WaitlistConfirm', - WaitlistConfirmMirrored = 'WaitlistConfirmMirrored', - LaptopSecure = 'LaptopSecure', - DragObject = 'DragObject', - EntryView = 'EntryView', - EntryDecline = 'EntryDecline', - ContactCardSettings = 'ContactCardSettings', - ContactCardSettingsMirrored = 'ContactCardSettingsMirrored', - CalendarSettings = 'CalendarSettings', - CalendarSettingsMirrored = 'CalendarSettingsMirrored', - HardDriveLock = 'HardDriveLock', - HardDriveUnlock = 'HardDriveUnlock', - AccountManagement = 'AccountManagement', - TransitionPop = 'TransitionPop', - TransitionPush = 'TransitionPush', - TransitionEffect = 'TransitionEffect', - LookupEntities = 'LookupEntities', - ExploreData = 'ExploreData', - AddBookmark = 'AddBookmark', - SearchBookmark = 'SearchBookmark', - DrillThrough = 'DrillThrough', - MasterDatabase = 'MasterDatabase', - CertifiedDatabase = 'CertifiedDatabase', - MaximumValue = 'MaximumValue', - MinimumValue = 'MinimumValue', - VisualStudioIDELogo32 = 'VisualStudioIDELogo32', - PasteAsText = 'PasteAsText', - PasteAsCode = 'PasteAsCode', - BrowserTab = 'BrowserTab', - BrowserTabScreenshot = 'BrowserTabScreenshot', - DesktopScreenshot = 'DesktopScreenshot', - FileYML = 'FileYML', - ClipboardSolid = 'ClipboardSolid', - FabricUserFolder = 'FabricUserFolder', - FabricNetworkFolder = 'FabricNetworkFolder', - AnalyticsView = 'AnalyticsView', - Video360Generic = 'Video360Generic', - Leave = 'Leave', - Trending12 = 'Trending12', - Blocked12 = 'Blocked12', - Warning12 = 'Warning12', - CheckedOutByOther12 = 'CheckedOutByOther12', - CheckedOutByYou12 = 'CheckedOutByYou12', - CircleShapeSolid = 'CircleShapeSolid', - SquareShapeSolid = 'SquareShapeSolid', - TriangleShapeSolid = 'TriangleShapeSolid', - DropShapeSolid = 'DropShapeSolid', - RectangleShapeSolid = 'RectangleShapeSolid', - ZoomToFit = 'ZoomToFit', - InsertColumnsLeft = 'InsertColumnsLeft', - InsertColumnsRight = 'InsertColumnsRight', - InsertRowsAbove = 'InsertRowsAbove', - InsertRowsBelow = 'InsertRowsBelow', - DeleteColumns = 'DeleteColumns', - DeleteRows = 'DeleteRows', - DeleteRowsMirrored = 'DeleteRowsMirrored', - DeleteTable = 'DeleteTable', - AccountBrowser = 'AccountBrowser', - VersionControlPush = 'VersionControlPush', - StackedColumnChart2 = 'StackedColumnChart2', - TripleColumnWide = 'TripleColumnWide', - QuadColumn = 'QuadColumn', - WhiteBoardApp16 = 'WhiteBoardApp16', - WhiteBoardApp32 = 'WhiteBoardApp32', - PinnedSolid = 'PinnedSolid', - InsertSignatureLine = 'InsertSignatureLine', - ArrangeByFrom = 'ArrangeByFrom', - Phishing = 'Phishing', - CreateMailRule = 'CreateMailRule', - PublishCourse = 'PublishCourse', - DictionaryRemove = 'DictionaryRemove', - UserRemove = 'UserRemove', - UserEvent = 'UserEvent', - Encryption = 'Encryption', - PasswordField = 'PasswordField', - OpenInNewTab = 'OpenInNewTab', - Hide3 = 'Hide3', - VerifiedBrandSolid = 'VerifiedBrandSolid', - MarkAsProtected = 'MarkAsProtected', - AuthenticatorApp = 'AuthenticatorApp', - WebTemplate = 'WebTemplate', - DefenderTVM = 'DefenderTVM', - MedalSolid = 'MedalSolid', - D365TalentLearn = 'D365TalentLearn', - D365TalentInsight = 'D365TalentInsight', - D365TalentHRCore = 'D365TalentHRCore', - BacklogList = 'BacklogList', - ButtonControl = 'ButtonControl', - TableGroup = 'TableGroup', - MountainClimbing = 'MountainClimbing', - TagUnknown = 'TagUnknown', - TagUnknownMirror = 'TagUnknownMirror', - TagUnknown12 = 'TagUnknown12', - TagUnknown12Mirror = 'TagUnknown12Mirror', - Link12 = 'Link12', - Presentation = 'Presentation', - Presentation12 = 'Presentation12', - Lock12 = 'Lock12', - BuildDefinition = 'BuildDefinition', - ReleaseDefinition = 'ReleaseDefinition', - SaveTemplate = 'SaveTemplate', - UserGauge = 'UserGauge', - BlockedSiteSolid12 = 'BlockedSiteSolid12', - TagSolid = 'TagSolid', - OfficeChat = 'OfficeChat', - OfficeChatSolid = 'OfficeChatSolid', - MailSchedule = 'MailSchedule', - WarningSolid = 'WarningSolid', - Blocked2Solid = 'Blocked2Solid', - SkypeCircleArrow = 'SkypeCircleArrow', - SkypeArrow = 'SkypeArrow', - SyncStatus = 'SyncStatus', - SyncStatusSolid = 'SyncStatusSolid', - ProjectDocument = 'ProjectDocument', - ToDoLogoOutline = 'ToDoLogoOutline', - VisioOnlineLogoFill32 = 'VisioOnlineLogoFill32', - VisioOnlineLogo32 = 'VisioOnlineLogo32', - VisioOnlineLogoCloud32 = 'VisioOnlineLogoCloud32', - VisioDiagramSync = 'VisioDiagramSync', - Event12 = 'Event12', - EventDateMissed12 = 'EventDateMissed12', - UserOptional = 'UserOptional', - ResponsesMenu = 'ResponsesMenu', - DoubleDownArrow = 'DoubleDownArrow', - DistributeDown = 'DistributeDown', - BookmarkReport = 'BookmarkReport', - FilterSettings = 'FilterSettings', - GripperDotsVertical = 'GripperDotsVertical', - MailAttached = 'MailAttached', - AddIn = 'AddIn', - LinkedDatabase = 'LinkedDatabase', - TableLink = 'TableLink', - PromotedDatabase = 'PromotedDatabase', - BarChartVerticalFilter = 'BarChartVerticalFilter', - BarChartVerticalFilterSolid = 'BarChartVerticalFilterSolid', - MicrosoftTranslatorLogo = 'MicrosoftTranslatorLogo', - ShowTimeAs = 'ShowTimeAs', - FileRequest = 'FileRequest', - WorkItemAlert = 'WorkItemAlert', - PowerBILogo16 = 'PowerBILogo16', - PowerBILogoBackplate16 = 'PowerBILogoBackplate16', - BulletedListText = 'BulletedListText', - BulletedListBullet = 'BulletedListBullet', - BulletedListTextMirrored = 'BulletedListTextMirrored', - BulletedListBulletMirrored = 'BulletedListBulletMirrored', - NumberedListText = 'NumberedListText', - NumberedListNumber = 'NumberedListNumber', - NumberedListTextMirrored = 'NumberedListTextMirrored', - NumberedListNumberMirrored = 'NumberedListNumberMirrored', - RemoveLinkChain = 'RemoveLinkChain', - RemoveLinkX = 'RemoveLinkX', - FabricTextHighlight = 'FabricTextHighlight', - ClearFormattingA = 'ClearFormattingA', - ClearFormattingEraser = 'ClearFormattingEraser', - Photo2Fill = 'Photo2Fill', - IncreaseIndentText = 'IncreaseIndentText', - IncreaseIndentArrow = 'IncreaseIndentArrow', - DecreaseIndentText = 'DecreaseIndentText', - DecreaseIndentArrow = 'DecreaseIndentArrow', - IncreaseIndentTextMirrored = 'IncreaseIndentTextMirrored', - IncreaseIndentArrowMirrored = 'IncreaseIndentArrowMirrored', - DecreaseIndentTextMirrored = 'DecreaseIndentTextMirrored', - DecreaseIndentArrowMirrored = 'DecreaseIndentArrowMirrored', - CheckListText = 'CheckListText', - CheckListCheck = 'CheckListCheck', - CheckListTextMirrored = 'CheckListTextMirrored', - CheckListCheckMirrored = 'CheckListCheckMirrored', - NumberSymbol = 'NumberSymbol', - Coupon = 'Coupon', - VerifiedBrand = 'VerifiedBrand', - ReleaseGate = 'ReleaseGate', - ReleaseGateCheck = 'ReleaseGateCheck', - ReleaseGateError = 'ReleaseGateError', - M365InvoicingLogo = 'M365InvoicingLogo', - RemoveFromShoppingList = 'RemoveFromShoppingList', - ShieldAlert = 'ShieldAlert', - FabricTextHighlightComposite = 'FabricTextHighlightComposite', - Dataflows = 'Dataflows', - GenericScanFilled = 'GenericScanFilled', - DiagnosticDataBarTooltip = 'DiagnosticDataBarTooltip', - SaveToMobile = 'SaveToMobile', - Orientation2 = 'Orientation2', - ScreenCast = 'ScreenCast', - ShowGrid = 'ShowGrid', - SnapToGrid = 'SnapToGrid', - ContactList = 'ContactList', - NewMail = 'NewMail', - EyeShadow = 'EyeShadow', - FabricFolderConfirm = 'FabricFolderConfirm', - InformationBarriers = 'InformationBarriers', - CommentActive = 'CommentActive', - ColumnVerticalSectionEdit = 'ColumnVerticalSectionEdit', - WavingHand = 'WavingHand', - ShakeDevice = 'ShakeDevice', - SmartGlassRemote = 'SmartGlassRemote', - Rotate90Clockwise = 'Rotate90Clockwise', - Rotate90CounterClockwise = 'Rotate90CounterClockwise', - CampaignTemplate = 'CampaignTemplate', - ChartTemplate = 'ChartTemplate', - PageListFilter = 'PageListFilter', - SecondaryNav = 'SecondaryNav', - ColumnVerticalSection = 'ColumnVerticalSection', - SkypeCircleSlash = 'SkypeCircleSlash', - SkypeSlash = 'SkypeSlash', - CustomizeToolbar = 'CustomizeToolbar', - DuplicateRow = 'DuplicateRow', - RemoveFromTrash = 'RemoveFromTrash', - MailOptions = 'MailOptions', - Childof = 'Childof', - Footer = 'Footer', - Header = 'Header', - BarChartVerticalFill = 'BarChartVerticalFill', - StackedColumnChart2Fill = 'StackedColumnChart2Fill', - PlainText = 'PlainText', - AccessibiltyChecker = 'AccessibiltyChecker', - DatabaseSync = 'DatabaseSync', - ReservationOrders = 'ReservationOrders', - TabOneColumn = 'TabOneColumn', - TabTwoColumn = 'TabTwoColumn', - TabThreeColumn = 'TabThreeColumn', - MicrosoftTranslatorLogoGreen = 'MicrosoftTranslatorLogoGreen', - MicrosoftTranslatorLogoBlue = 'MicrosoftTranslatorLogoBlue', - InternalInvestigation = 'InternalInvestigation', - AddReaction = 'AddReaction', - ContactHeart = 'ContactHeart', - VisuallyImpaired = 'VisuallyImpaired', - EventToDoLogo = 'EventToDoLogo', - Variable2 = 'Variable2', - ModelingView = 'ModelingView', - DisconnectVirtualMachine = 'DisconnectVirtualMachine', - ReportLock = 'ReportLock', - Uneditable2 = 'Uneditable2', - Uneditable2Mirrored = 'Uneditable2Mirrored', - BarChartVerticalEdit = 'BarChartVerticalEdit', - GlobalNavButtonActive = 'GlobalNavButtonActive', - PollResults = 'PollResults', - Rerun = 'Rerun', - QandA = 'QandA', - QandAMirror = 'QandAMirror', - BookAnswers = 'BookAnswers', - AlertSettings = 'AlertSettings', - TableComputed = 'TableComputed', - DecreaseIndentLegacy = 'DecreaseIndentLegacy', - IncreaseIndentLegacy = 'IncreaseIndentLegacy', - SizeLegacy = 'SizeLegacy' -} - -// tslint:disable-next-line:deprecation -export type IconNamesInput = keyof typeof IconNames; \ No newline at end of file + PageLink = 'PageLink', + CommentSolid = 'CommentSolid', + ChangeEntitlements = 'ChangeEntitlements', + Installation = 'Installation', + WebAppBuilderModule = 'WebAppBuilderModule', + WebAppBuilderFragment = 'WebAppBuilderFragment', + WebAppBuilderSlot = 'WebAppBuilderSlot', + BullseyeTargetEdit = 'BullseyeTargetEdit', + WebAppBuilderFragmentCreate = 'WebAppBuilderFragmentCreate', + PageData = 'PageData', + PageHeaderEdit = 'PageHeaderEdit', + ProductList = 'ProductList', + UnpublishContent = 'UnpublishContent', + DependencyAdd = 'DependencyAdd', + DependencyRemove = 'DependencyRemove', + EntitlementPolicy = 'EntitlementPolicy', + EntitlementRedemption = 'EntitlementRedemption', + SchoolDataSyncLogo = 'SchoolDataSyncLogo', + PinSolid12 = 'PinSolid12', + PinSolidOff12 = 'PinSolidOff12', + AddLink = 'AddLink', + SharepointAppIcon16 = 'SharepointAppIcon16', + DataflowsLink = 'DataflowsLink', + TimePicker = 'TimePicker', + UserWarning = 'UserWarning', + ComplianceAudit = 'ComplianceAudit', + StickyNotesOutlineAppIcon = 'StickyNotesOutlineAppIcon', + StickyNotesSolidAppIcon = 'StickyNotesSolidAppIcon', + Webcam2Off = 'Webcam2Off', + eDiscovery = 'eDiscovery', + CalendarYear = 'CalendarYear', + IgnoreConversation = 'IgnoreConversation', + CommonDataServiceCDS = 'CommonDataServiceCDS', + Forum = 'Forum', + SentimentAnalysis = 'SentimentAnalysis', + TextRecognition = 'TextRecognition', + KeyPhraseExtraction = 'KeyPhraseExtraction', + AltText = 'AltText', + NumberedListMirrored = 'NumberedListMirrored', + IncreaseIndent = 'IncreaseIndent', + IncreaseIndentMirrored = 'IncreaseIndentMirrored', + DecreaseIndent = 'DecreaseIndent', + DecreaseIndentMirrored = 'DecreaseIndentMirrored', + IncreaseIndentHanging = 'IncreaseIndentHanging', + IncreaseIndentHangingMirrored = 'IncreaseIndentHangingMirrored', + ArchiveUndo = 'ArchiveUndo', + LeaveUser = 'LeaveUser', + FabricFolderUpload = 'FabricFolderUpload', + RedEye12 = 'RedEye12', + MapPin12 = 'MapPin12', + Insights = 'Insights', + TaskList = 'TaskList', + MachineLearning = 'MachineLearning', + HealthRefresh = 'HealthRefresh', + SharedDatabase = 'SharedDatabase', + WebEnvironment = 'WebEnvironment', + GlobalNavButton = 'GlobalNavButton', + InternetSharing = 'InternetSharing', + Brightness = 'Brightness', + MapPin = 'MapPin', + Airplane = 'Airplane', + Tablet = 'Tablet', + QuickNote = 'QuickNote', + ChevronDown = 'ChevronDown', + ChevronUp = 'ChevronUp', + Edit = 'Edit', + Add = 'Add', + Cancel = 'Cancel', + More = 'More', + Settings = 'Settings', + Video = 'Video', + Mail = 'Mail', + People = 'People', + Phone = 'Phone', + Pin = 'Pin', + Shop = 'Shop', + Stop = 'Stop', + Link = 'Link', + Filter = 'Filter', + AllApps = 'AllApps', + Zoom = 'Zoom', + ZoomOut = 'ZoomOut', + Microphone = 'Microphone', + Search = 'Search', + Camera = 'Camera', + Attach = 'Attach', + Send = 'Send', + FavoriteList = 'FavoriteList', + PageSolid = 'PageSolid', + Forward = 'Forward', + Back = 'Back', + Refresh = 'Refresh', + Share = 'Share', + Lock = 'Lock', + BlockedSite = 'BlockedSite', + ReportHacked = 'ReportHacked', + EMI = 'EMI', + MiniLink = 'MiniLink', + Blocked = 'Blocked', + FavoriteStar = 'FavoriteStar', + FavoriteStarFill = 'FavoriteStarFill', + ReadingMode = 'ReadingMode', + Favicon = 'Favicon', + Remove = 'Remove', + Checkbox = 'Checkbox', + CheckboxComposite = 'CheckboxComposite', + CheckboxFill = 'CheckboxFill', + CheckboxIndeterminate = 'CheckboxIndeterminate', + CheckboxCompositeReversed = 'CheckboxCompositeReversed', + CheckMark = 'CheckMark', + BackToWindow = 'BackToWindow', + FullScreen = 'FullScreen', + SwitchUser = 'SwitchUser', + Print = 'Print', + Up = 'Up', + Down = 'Down', + OEM = 'OEM', + Delete = 'Delete', + Save = 'Save', + ReturnKey = 'ReturnKey', + Cloud = 'Cloud', + Flashlight = 'Flashlight', + CommandPrompt = 'CommandPrompt', + Sad = 'Sad', + RealEstate = 'RealEstate', + SIPMove = 'SIPMove', + EraseTool = 'EraseTool', + GripperTool = 'GripperTool', + Dialpad = 'Dialpad', + PageLeft = 'PageLeft', + PageRight = 'PageRight', + MultiSelect = 'MultiSelect', + KeyboardClassic = 'KeyboardClassic', + Play = 'Play', + Pause = 'Pause', + ChevronLeft = 'ChevronLeft', + ChevronRight = 'ChevronRight', + InkingTool = 'InkingTool', + Emoji2 = 'Emoji2', + GripperBarHorizontal = 'GripperBarHorizontal', + System = 'System', + Personalize = 'Personalize', + SearchAndApps = 'SearchAndApps', + Globe = 'Globe', + EaseOfAccess = 'EaseOfAccess', + UpdateRestore = 'UpdateRestore', + ContactInfo = 'ContactInfo', + Unpin = 'Unpin', + Contact = 'Contact', + Memo = 'Memo', + IncomingCall = 'IncomingCall', + Paste = 'Paste', + WindowsLogo = 'WindowsLogo', + Error = 'Error', + GripperBarVertical = 'GripperBarVertical', + Unlock = 'Unlock', + Slideshow = 'Slideshow', + Calendar = 'Calendar', + Megaphone = 'Megaphone', + Trim = 'Trim', + AutoEnhanceOn = 'AutoEnhanceOn', + AutoEnhanceOff = 'AutoEnhanceOff', + Color = 'Color', + SaveAs = 'SaveAs', + Light = 'Light', + Filters = 'Filters', + AspectRatio = 'AspectRatio', + Contrast = 'Contrast', + Redo = 'Redo', + Undo = 'Undo', + Crop = 'Crop', + PhotoCollection = 'PhotoCollection', + Album = 'Album', + OpenWith = 'OpenWith', + Rotate = 'Rotate', + PanoIndicator = 'PanoIndicator', + Translate = 'Translate', + RedEye = 'RedEye', + ViewOriginal = 'ViewOriginal', + ThumbnailView = 'ThumbnailView', + Package = 'Package', + Telemarketer = 'Telemarketer', + Warning = 'Warning', + Financial = 'Financial', + Education = 'Education', + ShoppingCart = 'ShoppingCart', + Train = 'Train', + Flag = 'Flag', + Move = 'Move', + Page = 'Page', + TouchPointer = 'TouchPointer', + Merge = 'Merge', + TurnRight = 'TurnRight', + Ferry = 'Ferry', + Highlight = 'Highlight', + PowerButton = 'PowerButton', + Tab = 'Tab', + Admin = 'Admin', + TVMonitor = 'TVMonitor', + Speakers = 'Speakers', + Game = 'Game', + HorizontalTabKey = 'HorizontalTabKey', + UnstackSelected = 'UnstackSelected', + StackIndicator = 'StackIndicator', + Nav2DMapView = 'Nav2DMapView', + StreetsideSplitMinimize = 'StreetsideSplitMinimize', + Car = 'Car', + Bus = 'Bus', + EatDrink = 'EatDrink', + SeeDo = 'SeeDo', + LocationCircle = 'LocationCircle', + Home = 'Home', + SwitcherStartEnd = 'SwitcherStartEnd', + ParkingLocation = 'ParkingLocation', + IncidentTriangle = 'IncidentTriangle', + Touch = 'Touch', + MapDirections = 'MapDirections', + CaretHollow = 'CaretHollow', + CaretSolid = 'CaretSolid', + History = 'History', + Location = 'Location', + MapLayers = 'MapLayers', + SearchNearby = 'SearchNearby', + Work = 'Work', + Recent = 'Recent', + Hotel = 'Hotel', + Bank = 'Bank', + LocationDot = 'LocationDot', + Dictionary = 'Dictionary', + ChromeBack = 'ChromeBack', + FolderOpen = 'FolderOpen', + Pinned = 'Pinned', + PinnedFill = 'PinnedFill', + RevToggleKey = 'RevToggleKey', + USB = 'USB', + View = 'View', + Previous = 'Previous', + Next = 'Next', + Clear = 'Clear', + Sync = 'Sync', + Download = 'Download', + Help = 'Help', + Upload = 'Upload', + Emoji = 'Emoji', + MailForward = 'MailForward', + ClosePane = 'ClosePane', + OpenPane = 'OpenPane', + PreviewLink = 'PreviewLink', + ZoomIn = 'ZoomIn', + Bookmarks = 'Bookmarks', + Document = 'Document', + ProtectedDocument = 'ProtectedDocument', + OpenInNewWindow = 'OpenInNewWindow', + MailFill = 'MailFill', + ViewAll = 'ViewAll', + Switch = 'Switch', + Rename = 'Rename', + Go = 'Go', + Remote = 'Remote', + SelectAll = 'SelectAll', + Orientation = 'Orientation', + Import = 'Import', + Folder = 'Folder', + Picture = 'Picture', + ChromeClose = 'ChromeClose', + ShowResults = 'ShowResults', + Message = 'Message', + CalendarDay = 'CalendarDay', + CalendarWeek = 'CalendarWeek', + MailReplyAll = 'MailReplyAll', + Read = 'Read', + Cut = 'Cut', + PaymentCard = 'PaymentCard', + Copy = 'Copy', + Important = 'Important', + MailReply = 'MailReply', + Sort = 'Sort', + GotoToday = 'GotoToday', + Font = 'Font', + FontColor = 'FontColor', + FolderFill = 'FolderFill', + Permissions = 'Permissions', + DisableUpdates = 'DisableUpdates', + Unfavorite = 'Unfavorite', + Italic = 'Italic', + Underline = 'Underline', + Bold = 'Bold', + MoveToFolder = 'MoveToFolder', + Dislike = 'Dislike', + Like = 'Like', + AlignRight = 'AlignRight', + AlignCenter = 'AlignCenter', + AlignLeft = 'AlignLeft', + OpenFile = 'OpenFile', + ClearSelection = 'ClearSelection', + FontDecrease = 'FontDecrease', + FontIncrease = 'FontIncrease', + FontSize = 'FontSize', + CellPhone = 'CellPhone', + Tag = 'Tag', + RepeatOne = 'RepeatOne', + RepeatAll = 'RepeatAll', + Calculator = 'Calculator', + Library = 'Library', + PostUpdate = 'PostUpdate', + NewFolder = 'NewFolder', + CalendarReply = 'CalendarReply', + UnsyncFolder = 'UnsyncFolder', + SyncFolder = 'SyncFolder', + BlockContact = 'BlockContact', + AddFriend = 'AddFriend', + Accept = 'Accept', + BulletedList = 'BulletedList', + Preview = 'Preview', + News = 'News', + Chat = 'Chat', + Group = 'Group', + World = 'World', + Comment = 'Comment', + DockLeft = 'DockLeft', + DockRight = 'DockRight', + Repair = 'Repair', + Accounts = 'Accounts', + Street = 'Street', + RadioBullet = 'RadioBullet', + Stopwatch = 'Stopwatch', + Clock = 'Clock', + WorldClock = 'WorldClock', + AlarmClock = 'AlarmClock', + Photo = 'Photo', + ActionCenter = 'ActionCenter', + Hospital = 'Hospital', + Timer = 'Timer', + FullCircleMask = 'FullCircleMask', + LocationFill = 'LocationFill', + ChromeMinimize = 'ChromeMinimize', + ChromeRestore = 'ChromeRestore', + Annotation = 'Annotation', + Fingerprint = 'Fingerprint', + Handwriting = 'Handwriting', + ChromeFullScreen = 'ChromeFullScreen', + Completed = 'Completed', + Label = 'Label', + FlickDown = 'FlickDown', + FlickUp = 'FlickUp', + FlickLeft = 'FlickLeft', + FlickRight = 'FlickRight', + MiniExpand = 'MiniExpand', + MiniContract = 'MiniContract', + Streaming = 'Streaming', + MusicInCollection = 'MusicInCollection', + OneDriveLogo = 'OneDriveLogo', + CompassNW = 'CompassNW', + Code = 'Code', + LightningBolt = 'LightningBolt', + Info = 'Info', + CalculatorMultiply = 'CalculatorMultiply', + CalculatorAddition = 'CalculatorAddition', + CalculatorSubtract = 'CalculatorSubtract', + CalculatorPercentage = 'CalculatorPercentage', + CalculatorEqualTo = 'CalculatorEqualTo', + PrintfaxPrinterFile = 'PrintfaxPrinterFile', + StorageOptical = 'StorageOptical', + Communications = 'Communications', + Headset = 'Headset', + Health = 'Health', + Webcam2 = 'Webcam2', + FrontCamera = 'FrontCamera', + ChevronUpSmall = 'ChevronUpSmall', + ChevronDownSmall = 'ChevronDownSmall', + ChevronLeftSmall = 'ChevronLeftSmall', + ChevronRightSmall = 'ChevronRightSmall', + ChevronUpMed = 'ChevronUpMed', + ChevronDownMed = 'ChevronDownMed', + ChevronLeftMed = 'ChevronLeftMed', + ChevronRightMed = 'ChevronRightMed', + Devices2 = 'Devices2', + PC1 = 'PC1', + PresenceChickletVideo = 'PresenceChickletVideo', + Reply = 'Reply', + HalfAlpha = 'HalfAlpha', + ConstructionCone = 'ConstructionCone', + DoubleChevronLeftMed = 'DoubleChevronLeftMed', + Volume0 = 'Volume0', + Volume1 = 'Volume1', + Volume2 = 'Volume2', + Volume3 = 'Volume3', + Chart = 'Chart', + Robot = 'Robot', + Manufacturing = 'Manufacturing', + LockSolid = 'LockSolid', + FitPage = 'FitPage', + FitWidth = 'FitWidth', + BidiLtr = 'BidiLtr', + BidiRtl = 'BidiRtl', + RightDoubleQuote = 'RightDoubleQuote', + Sunny = 'Sunny', + CloudWeather = 'CloudWeather', + Cloudy = 'Cloudy', + PartlyCloudyDay = 'PartlyCloudyDay', + PartlyCloudyNight = 'PartlyCloudyNight', + ClearNight = 'ClearNight', + RainShowersDay = 'RainShowersDay', + Rain = 'Rain', + Thunderstorms = 'Thunderstorms', + RainSnow = 'RainSnow', + Snow = 'Snow', + BlowingSnow = 'BlowingSnow', + Frigid = 'Frigid', + Fog = 'Fog', + Squalls = 'Squalls', + Duststorm = 'Duststorm', + Unknown = 'Unknown', + Precipitation = 'Precipitation', + SortLines = 'SortLines', + Ribbon = 'Ribbon', + AreaChart = 'AreaChart', + Assign = 'Assign', + FlowChart = 'FlowChart', + CheckList = 'CheckList', + Diagnostic = 'Diagnostic', + Generate = 'Generate', + LineChart = 'LineChart', + Equalizer = 'Equalizer', + BarChartHorizontal = 'BarChartHorizontal', + BarChartVertical = 'BarChartVertical', + Freezing = 'Freezing', + FunnelChart = 'FunnelChart', + Processing = 'Processing', + Quantity = 'Quantity', + ReportDocument = 'ReportDocument', + StackColumnChart = 'StackColumnChart', + SnowShowerDay = 'SnowShowerDay', + HailDay = 'HailDay', + WorkFlow = 'WorkFlow', + HourGlass = 'HourGlass', + StoreLogoMed20 = 'StoreLogoMed20', + TimeSheet = 'TimeSheet', + TriangleSolid = 'TriangleSolid', + UpgradeAnalysis = 'UpgradeAnalysis', + VideoSolid = 'VideoSolid', + RainShowersNight = 'RainShowersNight', + SnowShowerNight = 'SnowShowerNight', + Teamwork = 'Teamwork', + HailNight = 'HailNight', + PeopleAdd = 'PeopleAdd', + Glasses = 'Glasses', + DateTime2 = 'DateTime2', + Shield = 'Shield', + Header1 = 'Header1', + PageAdd = 'PageAdd', + NumberedList = 'NumberedList', + PowerBILogo = 'PowerBILogo', + Info2 = 'Info2', + MusicInCollectionFill = 'MusicInCollectionFill', + List = 'List', + Asterisk = 'Asterisk', + ErrorBadge = 'ErrorBadge', + CircleRing = 'CircleRing', + CircleFill = 'CircleFill', + Record2 = 'Record2', + AllAppsMirrored = 'AllAppsMirrored', + BookmarksMirrored = 'BookmarksMirrored', + BulletedListMirrored = 'BulletedListMirrored', + CaretHollowMirrored = 'CaretHollowMirrored', + CaretSolidMirrored = 'CaretSolidMirrored', + ChromeBackMirrored = 'ChromeBackMirrored', + ClearSelectionMirrored = 'ClearSelectionMirrored', + ClosePaneMirrored = 'ClosePaneMirrored', + DockLeftMirrored = 'DockLeftMirrored', + DoubleChevronLeftMedMirrored = 'DoubleChevronLeftMedMirrored', + GoMirrored = 'GoMirrored', + HelpMirrored = 'HelpMirrored', + ImportMirrored = 'ImportMirrored', + ImportAllMirrored = 'ImportAllMirrored', + ListMirrored = 'ListMirrored', + MailForwardMirrored = 'MailForwardMirrored', + MailReplyMirrored = 'MailReplyMirrored', + MailReplyAllMirrored = 'MailReplyAllMirrored', + MiniContractMirrored = 'MiniContractMirrored', + MiniExpandMirrored = 'MiniExpandMirrored', + OpenPaneMirrored = 'OpenPaneMirrored', + OpenWithMirrored = 'OpenWithMirrored', + ParkingLocationMirrored = 'ParkingLocationMirrored', + SendMirrored = 'SendMirrored', + ShowResultsMirrored = 'ShowResultsMirrored', + ThumbnailViewMirrored = 'ThumbnailViewMirrored', + Media = 'Media', + Devices3 = 'Devices3', + Focus = 'Focus', + VideoLightOff = 'VideoLightOff', + Lightbulb = 'Lightbulb', + StatusTriangle = 'StatusTriangle', + VolumeDisabled = 'VolumeDisabled', + Puzzle = 'Puzzle', + EmojiNeutral = 'EmojiNeutral', + EmojiDisappointed = 'EmojiDisappointed', + HomeSolid = 'HomeSolid', + Ringer = 'Ringer', + PDF = 'PDF', + HeartBroken = 'HeartBroken', + StoreLogo16 = 'StoreLogo16', + MultiSelectMirrored = 'MultiSelectMirrored', + Broom = 'Broom', + AddToShoppingList = 'AddToShoppingList', + Cocktails = 'Cocktails', + Wines = 'Wines', + Articles = 'Articles', + Cycling = 'Cycling', + DietPlanNotebook = 'DietPlanNotebook', + Pill = 'Pill', + ExerciseTracker = 'ExerciseTracker', + HandsFree = 'HandsFree', + Medical = 'Medical', + Running = 'Running', + Weights = 'Weights', + Trackers = 'Trackers', + AddNotes = 'AddNotes', + AllCurrency = 'AllCurrency', + BarChart4 = 'BarChart4', + CirclePlus = 'CirclePlus', + Coffee = 'Coffee', + Cotton = 'Cotton', + Market = 'Market', + Money = 'Money', + PieDouble = 'PieDouble', + PieSingle = 'PieSingle', + RemoveFilter = 'RemoveFilter', + Savings = 'Savings', + Sell = 'Sell', + StockDown = 'StockDown', + StockUp = 'StockUp', + Lamp = 'Lamp', + Source = 'Source', + MSNVideos = 'MSNVideos', + Cricket = 'Cricket', + Golf = 'Golf', + Baseball = 'Baseball', + Soccer = 'Soccer', + MoreSports = 'MoreSports', + AutoRacing = 'AutoRacing', + CollegeHoops = 'CollegeHoops', + CollegeFootball = 'CollegeFootball', + ProFootball = 'ProFootball', + ProHockey = 'ProHockey', + Rugby = 'Rugby', + SubstitutionsIn = 'SubstitutionsIn', + Tennis = 'Tennis', + Arrivals = 'Arrivals', + Design = 'Design', + Website = 'Website', + Drop = 'Drop', + HistoricalWeather = 'HistoricalWeather', + SkiResorts = 'SkiResorts', + Snowflake = 'Snowflake', + BusSolid = 'BusSolid', + FerrySolid = 'FerrySolid', + EndPointSolid = 'EndPointSolid', + AirplaneSolid = 'AirplaneSolid', + TrainSolid = 'TrainSolid', + Heart = 'Heart', + HeartFill = 'HeartFill', + Ticket = 'Ticket', + WifiWarning4 = 'WifiWarning4', + Devices4 = 'Devices4', + AzureLogo = 'AzureLogo', + BingLogo = 'BingLogo', + MSNLogo = 'MSNLogo', + OutlookLogoInverse = 'OutlookLogoInverse', + OfficeLogo = 'OfficeLogo', + SkypeLogo = 'SkypeLogo', + Door = 'Door', + EditMirrored = 'EditMirrored', + GiftCard = 'GiftCard', + DoubleBookmark = 'DoubleBookmark', + StatusErrorFull = 'StatusErrorFull', + Certificate = 'Certificate', + FastForward = 'FastForward', + Rewind = 'Rewind', + Photo2 = 'Photo2', + OpenSource = 'OpenSource', + Movers = 'Movers', + CloudDownload = 'CloudDownload', + Family = 'Family', + WindDirection = 'WindDirection', + Bug = 'Bug', + SiteScan = 'SiteScan', + BrowserScreenShot = 'BrowserScreenShot', + F12DevTools = 'F12DevTools', + CSS = 'CSS', + JS = 'JS', + DeliveryTruck = 'DeliveryTruck', + ReminderPerson = 'ReminderPerson', + ReminderGroup = 'ReminderGroup', + ReminderTime = 'ReminderTime', + TabletMode = 'TabletMode', + Umbrella = 'Umbrella', + NetworkTower = 'NetworkTower', + CityNext = 'CityNext', + CityNext2 = 'CityNext2', + Section = 'Section', + OneNoteLogoInverse = 'OneNoteLogoInverse', + ToggleFilled = 'ToggleFilled', + ToggleBorder = 'ToggleBorder', + SliderThumb = 'SliderThumb', + ToggleThumb = 'ToggleThumb', + Documentation = 'Documentation', + Badge = 'Badge', + Giftbox = 'Giftbox', + VisualStudioLogo = 'VisualStudioLogo', + HomeGroup = 'HomeGroup', + ExcelLogoInverse = 'ExcelLogoInverse', + WordLogoInverse = 'WordLogoInverse', + PowerPointLogoInverse = 'PowerPointLogoInverse', + Cafe = 'Cafe', + SpeedHigh = 'SpeedHigh', + Commitments = 'Commitments', + ThisPC = 'ThisPC', + MusicNote = 'MusicNote', + MicOff = 'MicOff', + PlaybackRate1x = 'PlaybackRate1x', + EdgeOldLogo = 'EdgeOldLogo', + CompletedSolid = 'CompletedSolid', + AlbumRemove = 'AlbumRemove', + MessageFill = 'MessageFill', + TabletSelected = 'TabletSelected', + MobileSelected = 'MobileSelected', + LaptopSelected = 'LaptopSelected', + TVMonitorSelected = 'TVMonitorSelected', + DeveloperTools = 'DeveloperTools', + Shapes = 'Shapes', + InsertTextBox = 'InsertTextBox', + LowerBrightness = 'LowerBrightness', + WebComponents = 'WebComponents', + OfflineStorage = 'OfflineStorage', + DOM = 'DOM', + CloudUpload = 'CloudUpload', + ScrollUpDown = 'ScrollUpDown', + DateTime = 'DateTime', + Event = 'Event', + Cake = 'Cake', + Tiles = 'Tiles', + Org = 'Org', + PartyLeader = 'PartyLeader', + DRM = 'DRM', + CloudAdd = 'CloudAdd', + AppIconDefault = 'AppIconDefault', + Photo2Add = 'Photo2Add', + Photo2Remove = 'Photo2Remove', + Calories = 'Calories', + POI = 'POI', + RemoveContent = 'RemoveContent', + AddTo = 'AddTo', + RadioBtnOff = 'RadioBtnOff', + RadioBtnOn = 'RadioBtnOn', + ExploreContent = 'ExploreContent', + Embed = 'Embed', + Product = 'Product', + ProgressLoopInner = 'ProgressLoopInner', + ProgressLoopOuter = 'ProgressLoopOuter', + Blocked2 = 'Blocked2', + FangBody = 'FangBody', + Toolbox = 'Toolbox', + PageHeader = 'PageHeader', + Glimmer = 'Glimmer', + ChatInviteFriend = 'ChatInviteFriend', + Brush = 'Brush', + Shirt = 'Shirt', + Crown = 'Crown', + Diamond = 'Diamond', + ScaleUp = 'ScaleUp', + ResetDevice = 'ResetDevice', + QRCode = 'QRCode', + Feedback = 'Feedback', + SharepointLogoInverse = 'SharepointLogoInverse', + YammerLogo = 'YammerLogo', + Hide = 'Hide', + Uneditable = 'Uneditable', + ReturnToSession = 'ReturnToSession', + OpenFolderHorizontal = 'OpenFolderHorizontal', + CalendarMirrored = 'CalendarMirrored', + SwayLogoInverse = 'SwayLogoInverse', + OutOfOffice = 'OutOfOffice', + SkipBack10 = 'SkipBack10', + SkipForward30 = 'SkipForward30', + Trophy = 'Trophy', + ReopenPages = 'ReopenPages', + EmojiTabSymbols = 'EmojiTabSymbols', + AADLogo = 'AADLogo', + AccessLogo = 'AccessLogo', + AdminALogoInverse32 = 'AdminALogoInverse32', + AdminCLogoInverse32 = 'AdminCLogoInverse32', + AdminDLogoInverse32 = 'AdminDLogoInverse32', + AdminELogoInverse32 = 'AdminELogoInverse32', + AdminLLogoInverse32 = 'AdminLLogoInverse32', + AdminMLogoInverse32 = 'AdminMLogoInverse32', + AdminOLogoInverse32 = 'AdminOLogoInverse32', + AdminPLogoInverse32 = 'AdminPLogoInverse32', + AdminSLogoInverse32 = 'AdminSLogoInverse32', + AdminYLogoInverse32 = 'AdminYLogoInverse32', + DelveLogoInverse = 'DelveLogoInverse', + ExchangeLogoInverse = 'ExchangeLogoInverse', + LyncLogo = 'LyncLogo', + OfficeVideoLogoInverse = 'OfficeVideoLogoInverse', + SocialListeningLogo = 'SocialListeningLogo', + VisioLogoInverse = 'VisioLogoInverse', + Balloons = 'Balloons', + Cat = 'Cat', + MailAlert = 'MailAlert', + MailCheck = 'MailCheck', + MailLowImportance = 'MailLowImportance', + MailPause = 'MailPause', + MailRepeat = 'MailRepeat', + SecurityGroup = 'SecurityGroup', + Table = 'Table', + VoicemailForward = 'VoicemailForward', + VoicemailReply = 'VoicemailReply', + Waffle = 'Waffle', + RemoveEvent = 'RemoveEvent', + EventInfo = 'EventInfo', + ForwardEvent = 'ForwardEvent', + WipePhone = 'WipePhone', + AddOnlineMeeting = 'AddOnlineMeeting', + JoinOnlineMeeting = 'JoinOnlineMeeting', + RemoveLink = 'RemoveLink', + PeopleBlock = 'PeopleBlock', + PeopleRepeat = 'PeopleRepeat', + PeopleAlert = 'PeopleAlert', + PeoplePause = 'PeoplePause', + TransferCall = 'TransferCall', + AddPhone = 'AddPhone', + UnknownCall = 'UnknownCall', + NoteReply = 'NoteReply', + NoteForward = 'NoteForward', + NotePinned = 'NotePinned', + RemoveOccurrence = 'RemoveOccurrence', + Timeline = 'Timeline', + EditNote = 'EditNote', + CircleHalfFull = 'CircleHalfFull', + Room = 'Room', + Unsubscribe = 'Unsubscribe', + Subscribe = 'Subscribe', + HardDrive = 'HardDrive', + RecurringTask = 'RecurringTask', + TaskManager = 'TaskManager', + TaskManagerMirrored = 'TaskManagerMirrored', + Combine = 'Combine', + Split = 'Split', + DoubleChevronUp = 'DoubleChevronUp', + DoubleChevronLeft = 'DoubleChevronLeft', + DoubleChevronRight = 'DoubleChevronRight', + Ascending = 'Ascending', + Descending = 'Descending', + TextBox = 'TextBox', + TextField = 'TextField', + NumberField = 'NumberField', + Dropdown = 'Dropdown', + PenWorkspace = 'PenWorkspace', + BookingsLogo = 'BookingsLogo', + ClassNotebookLogoInverse = 'ClassNotebookLogoInverse', + DelveAnalyticsLogo = 'DelveAnalyticsLogo', + DocsLogoInverse = 'DocsLogoInverse', + Dynamics365Logo = 'Dynamics365Logo', + DynamicSMBLogo = 'DynamicSMBLogo', + OfficeAssistantLogo = 'OfficeAssistantLogo', + OfficeStoreLogo = 'OfficeStoreLogo', + OneNoteEduLogoInverse = 'OneNoteEduLogoInverse', + PlannerLogo = 'PlannerLogo', + PowerApps = 'PowerApps', + Suitcase = 'Suitcase', + ProjectLogoInverse = 'ProjectLogoInverse', + CaretLeft8 = 'CaretLeft8', + CaretRight8 = 'CaretRight8', + CaretUp8 = 'CaretUp8', + CaretDown8 = 'CaretDown8', + CaretLeftSolid8 = 'CaretLeftSolid8', + CaretRightSolid8 = 'CaretRightSolid8', + CaretUpSolid8 = 'CaretUpSolid8', + CaretDownSolid8 = 'CaretDownSolid8', + ClearFormatting = 'ClearFormatting', + Superscript = 'Superscript', + Subscript = 'Subscript', + Strikethrough = 'Strikethrough', + Export = 'Export', + ExportMirrored = 'ExportMirrored', + SingleBookmark = 'SingleBookmark', + SingleBookmarkSolid = 'SingleBookmarkSolid', + DoubleChevronDown = 'DoubleChevronDown', + FollowUser = 'FollowUser', + ReplyAll = 'ReplyAll', + WorkforceManagement = 'WorkforceManagement', + RecruitmentManagement = 'RecruitmentManagement', + Questionnaire = 'Questionnaire', + ManagerSelfService = 'ManagerSelfService', + ProductionFloorManagement = 'ProductionFloorManagement', + ProductRelease = 'ProductRelease', + ProductVariant = 'ProductVariant', + ReplyMirrored = 'ReplyMirrored', + ReplyAllMirrored = 'ReplyAllMirrored', + Medal = 'Medal', + AddGroup = 'AddGroup', + QuestionnaireMirrored = 'QuestionnaireMirrored', + CloudImportExport = 'CloudImportExport', + TemporaryUser = 'TemporaryUser', + CaretSolid16 = 'CaretSolid16', + GroupedDescending = 'GroupedDescending', + GroupedAscending = 'GroupedAscending', + SortUp = 'SortUp', + SortDown = 'SortDown', + AwayStatus = 'AwayStatus', + MyMoviesTV = 'MyMoviesTV', + SyncToPC = 'SyncToPC', + GenericScan = 'GenericScan', + AustralianRules = 'AustralianRules', + WifiEthernet = 'WifiEthernet', + TrackersMirrored = 'TrackersMirrored', + DateTimeMirrored = 'DateTimeMirrored', + StopSolid = 'StopSolid', + DoubleChevronUp12 = 'DoubleChevronUp12', + DoubleChevronDown12 = 'DoubleChevronDown12', + DoubleChevronLeft12 = 'DoubleChevronLeft12', + DoubleChevronRight12 = 'DoubleChevronRight12', + CalendarAgenda = 'CalendarAgenda', + ConnectVirtualMachine = 'ConnectVirtualMachine', + AddEvent = 'AddEvent', + AssetLibrary = 'AssetLibrary', + DataConnectionLibrary = 'DataConnectionLibrary', + DocLibrary = 'DocLibrary', + FormLibrary = 'FormLibrary', + FormLibraryMirrored = 'FormLibraryMirrored', + ReportLibrary = 'ReportLibrary', + ReportLibraryMirrored = 'ReportLibraryMirrored', + ContactCard = 'ContactCard', + CustomList = 'CustomList', + CustomListMirrored = 'CustomListMirrored', + IssueTracking = 'IssueTracking', + IssueTrackingMirrored = 'IssueTrackingMirrored', + PictureLibrary = 'PictureLibrary', + OfficeAddinsLogo = 'OfficeAddinsLogo', + OfflineOneDriveParachute = 'OfflineOneDriveParachute', + OfflineOneDriveParachuteDisabled = 'OfflineOneDriveParachuteDisabled', + LargeGrid = 'LargeGrid', + TriangleSolidUp12 = 'TriangleSolidUp12', + TriangleSolidDown12 = 'TriangleSolidDown12', + TriangleSolidLeft12 = 'TriangleSolidLeft12', + TriangleSolidRight12 = 'TriangleSolidRight12', + TriangleUp12 = 'TriangleUp12', + TriangleDown12 = 'TriangleDown12', + TriangleLeft12 = 'TriangleLeft12', + TriangleRight12 = 'TriangleRight12', + ArrowUpRight8 = 'ArrowUpRight8', + ArrowDownRight8 = 'ArrowDownRight8', + DocumentSet = 'DocumentSet', + GoToDashboard = 'GoToDashboard', + DelveAnalytics = 'DelveAnalytics', + ArrowUpRightMirrored8 = 'ArrowUpRightMirrored8', + ArrowDownRightMirrored8 = 'ArrowDownRightMirrored8', + CompanyDirectory = 'CompanyDirectory', + OpenEnrollment = 'OpenEnrollment', + CompanyDirectoryMirrored = 'CompanyDirectoryMirrored', + OneDriveAdd = 'OneDriveAdd', + ProfileSearch = 'ProfileSearch', + Header2 = 'Header2', + Header3 = 'Header3', + Header4 = 'Header4', + RingerSolid = 'RingerSolid', + Eyedropper = 'Eyedropper', + MarketDown = 'MarketDown', + CalendarWorkWeek = 'CalendarWorkWeek', + SidePanel = 'SidePanel', + GlobeFavorite = 'GlobeFavorite', + CaretTopLeftSolid8 = 'CaretTopLeftSolid8', + CaretTopRightSolid8 = 'CaretTopRightSolid8', + ViewAll2 = 'ViewAll2', + DocumentReply = 'DocumentReply', + PlayerSettings = 'PlayerSettings', + ReceiptForward = 'ReceiptForward', + ReceiptReply = 'ReceiptReply', + ReceiptCheck = 'ReceiptCheck', + Fax = 'Fax', + RecurringEvent = 'RecurringEvent', + ReplyAlt = 'ReplyAlt', + ReplyAllAlt = 'ReplyAllAlt', + EditStyle = 'EditStyle', + EditMail = 'EditMail', + Lifesaver = 'Lifesaver', + LifesaverLock = 'LifesaverLock', + InboxCheck = 'InboxCheck', + FolderSearch = 'FolderSearch', + CollapseMenu = 'CollapseMenu', + ExpandMenu = 'ExpandMenu', + Boards = 'Boards', + SunAdd = 'SunAdd', + SunQuestionMark = 'SunQuestionMark', + LandscapeOrientation = 'LandscapeOrientation', + DocumentSearch = 'DocumentSearch', + PublicCalendar = 'PublicCalendar', + PublicContactCard = 'PublicContactCard', + PublicEmail = 'PublicEmail', + PublicFolder = 'PublicFolder', + WordDocument = 'WordDocument', + PowerPointDocument = 'PowerPointDocument', + ExcelDocument = 'ExcelDocument', + GroupedList = 'GroupedList', + ClassroomLogo = 'ClassroomLogo', + Sections = 'Sections', + EditPhoto = 'EditPhoto', + Starburst = 'Starburst', + ShareiOS = 'ShareiOS', + AirTickets = 'AirTickets', + PencilReply = 'PencilReply', + Tiles2 = 'Tiles2', + SkypeCircleCheck = 'SkypeCircleCheck', + SkypeCircleClock = 'SkypeCircleClock', + SkypeCircleMinus = 'SkypeCircleMinus', + SkypeCheck = 'SkypeCheck', + SkypeClock = 'SkypeClock', + SkypeMinus = 'SkypeMinus', + SkypeMessage = 'SkypeMessage', + ClosedCaption = 'ClosedCaption', + ATPLogo = 'ATPLogo', + OfficeFormsLogoInverse = 'OfficeFormsLogoInverse', + RecycleBin = 'RecycleBin', + EmptyRecycleBin = 'EmptyRecycleBin', + Hide2 = 'Hide2', + Breadcrumb = 'Breadcrumb', + BirthdayCake = 'BirthdayCake', + ClearFilter = 'ClearFilter', + Flow = 'Flow', + FixedAssetManagement = 'FixedAssetManagement', + TimeEntry = 'TimeEntry', + CRMProcesses = 'CRMProcesses', + PageEdit = 'PageEdit', + PageArrowRight = 'PageArrowRight', + PageRemove = 'PageRemove', + Database = 'Database', + DataManagementSettings = 'DataManagementSettings', + CRMServices = 'CRMServices', + EditContact = 'EditContact', + ConnectContacts = 'ConnectContacts', + AppIconDefaultAdd = 'AppIconDefaultAdd', + AppIconDefaultList = 'AppIconDefaultList', + ActivateOrders = 'ActivateOrders', + DeactivateOrders = 'DeactivateOrders', + ProductCatalog = 'ProductCatalog', + ScatterChart = 'ScatterChart', + AccountActivity = 'AccountActivity', + DocumentManagement = 'DocumentManagement', + CRMReport = 'CRMReport', + KnowledgeArticle = 'KnowledgeArticle', + Relationship = 'Relationship', + HomeVerify = 'HomeVerify', + ZipFolder = 'ZipFolder', + SurveyQuestions = 'SurveyQuestions', + TextDocument = 'TextDocument', + TextDocumentShared = 'TextDocumentShared', + PageCheckedOut = 'PageCheckedOut', + PageShared = 'PageShared', + SaveAndClose = 'SaveAndClose', + Script = 'Script', + Archive = 'Archive', + MessageFriendRequest = 'MessageFriendRequest', + ActivityFeed = 'ActivityFeed', + Compare = 'Compare', + EventDate = 'EventDate', + ArrowUpRight = 'ArrowUpRight', + CaretRight = 'CaretRight', + SetAction = 'SetAction', + ChatBot = 'ChatBot', + CaretSolidLeft = 'CaretSolidLeft', + CaretSolidDown = 'CaretSolidDown', + CaretSolidRight = 'CaretSolidRight', + CaretSolidUp = 'CaretSolidUp', + PowerAppsLogo = 'PowerAppsLogo', + PowerApps2Logo = 'PowerApps2Logo', + SearchIssue = 'SearchIssue', + SearchIssueMirrored = 'SearchIssueMirrored', + FabricAssetLibrary = 'FabricAssetLibrary', + FabricDataConnectionLibrary = 'FabricDataConnectionLibrary', + FabricDocLibrary = 'FabricDocLibrary', + FabricFormLibrary = 'FabricFormLibrary', + FabricFormLibraryMirrored = 'FabricFormLibraryMirrored', + FabricReportLibrary = 'FabricReportLibrary', + FabricReportLibraryMirrored = 'FabricReportLibraryMirrored', + FabricPublicFolder = 'FabricPublicFolder', + FabricFolderSearch = 'FabricFolderSearch', + FabricMovetoFolder = 'FabricMovetoFolder', + FabricUnsyncFolder = 'FabricUnsyncFolder', + FabricSyncFolder = 'FabricSyncFolder', + FabricOpenFolderHorizontal = 'FabricOpenFolderHorizontal', + FabricFolder = 'FabricFolder', + FabricFolderFill = 'FabricFolderFill', + FabricNewFolder = 'FabricNewFolder', + FabricPictureLibrary = 'FabricPictureLibrary', + PhotoVideoMedia = 'PhotoVideoMedia', + AddFavorite = 'AddFavorite', + AddFavoriteFill = 'AddFavoriteFill', + BufferTimeBefore = 'BufferTimeBefore', + BufferTimeAfter = 'BufferTimeAfter', + BufferTimeBoth = 'BufferTimeBoth', + PublishContent = 'PublishContent', + ClipboardList = 'ClipboardList', + ClipboardListMirrored = 'ClipboardListMirrored', + CannedChat = 'CannedChat', + SkypeForBusinessLogo = 'SkypeForBusinessLogo', + TabCenter = 'TabCenter', + PageCheckedin = 'PageCheckedin', + PageList = 'PageList', + ReadOutLoud = 'ReadOutLoud', + CaretBottomLeftSolid8 = 'CaretBottomLeftSolid8', + CaretBottomRightSolid8 = 'CaretBottomRightSolid8', + FolderHorizontal = 'FolderHorizontal', + MicrosoftStaffhubLogo = 'MicrosoftStaffhubLogo', + GiftboxOpen = 'GiftboxOpen', + StatusCircleOuter = 'StatusCircleOuter', + StatusCircleInner = 'StatusCircleInner', + StatusCircleRing = 'StatusCircleRing', + StatusTriangleOuter = 'StatusTriangleOuter', + StatusTriangleInner = 'StatusTriangleInner', + StatusTriangleExclamation = 'StatusTriangleExclamation', + StatusCircleExclamation = 'StatusCircleExclamation', + StatusCircleErrorX = 'StatusCircleErrorX', + StatusCircleCheckmark = 'StatusCircleCheckmark', + StatusCircleInfo = 'StatusCircleInfo', + StatusCircleBlock = 'StatusCircleBlock', + StatusCircleBlock2 = 'StatusCircleBlock2', + StatusCircleQuestionMark = 'StatusCircleQuestionMark', + StatusCircleSync = 'StatusCircleSync', + Toll = 'Toll', + ExploreContentSingle = 'ExploreContentSingle', + CollapseContent = 'CollapseContent', + CollapseContentSingle = 'CollapseContentSingle', + InfoSolid = 'InfoSolid', + GroupList = 'GroupList', + ProgressRingDots = 'ProgressRingDots', + CaloriesAdd = 'CaloriesAdd', + BranchFork = 'BranchFork', + MuteChat = 'MuteChat', + AddHome = 'AddHome', + AddWork = 'AddWork', + MobileReport = 'MobileReport', + ScaleVolume = 'ScaleVolume', + HardDriveGroup = 'HardDriveGroup', + FastMode = 'FastMode', + ToggleLeft = 'ToggleLeft', + ToggleRight = 'ToggleRight', + FullView = 'FullView', + FocusView = 'FocusView', + TriangleShape = 'TriangleShape', + RectangleShape = 'RectangleShape', + CubeShape = 'CubeShape', + Trophy2 = 'Trophy2', + BucketColor = 'BucketColor', + BucketColorFill = 'BucketColorFill', + Taskboard = 'Taskboard', + SingleColumn = 'SingleColumn', + DoubleColumn = 'DoubleColumn', + TripleColumn = 'TripleColumn', + ColumnLeftTwoThirds = 'ColumnLeftTwoThirds', + ColumnRightTwoThirds = 'ColumnRightTwoThirds', + AccessLogoFill = 'AccessLogoFill', + AnalyticsLogo = 'AnalyticsLogo', + AnalyticsQuery = 'AnalyticsQuery', + NewAnalyticsQuery = 'NewAnalyticsQuery', + AnalyticsReport = 'AnalyticsReport', + WordLogo = 'WordLogo', + WordLogoFill = 'WordLogoFill', + ExcelLogo = 'ExcelLogo', + ExcelLogoFill = 'ExcelLogoFill', + OneNoteLogo = 'OneNoteLogo', + OneNoteLogoFill = 'OneNoteLogoFill', + OutlookLogo = 'OutlookLogo', + OutlookLogoFill = 'OutlookLogoFill', + PowerPointLogo = 'PowerPointLogo', + PowerPointLogoFill = 'PowerPointLogoFill', + PublisherLogo = 'PublisherLogo', + PublisherLogoFill = 'PublisherLogoFill', + ScheduleEventAction = 'ScheduleEventAction', + FlameSolid = 'FlameSolid', + PowerShell = 'PowerShell', + ServerProcesses = 'ServerProcesses', + Server = 'Server', + SaveAll = 'SaveAll', + LinkedInLogo = 'LinkedInLogo', + Decimals = 'Decimals', + SidePanelMirrored = 'SidePanelMirrored', + ProtectRestrict = 'ProtectRestrict', + Blog = 'Blog', + UnknownMirrored = 'UnknownMirrored', + PublicContactCardMirrored = 'PublicContactCardMirrored', + GridViewSmall = 'GridViewSmall', + GridViewMedium = 'GridViewMedium', + GridViewLarge = 'GridViewLarge', + Step = 'Step', + StepInsert = 'StepInsert', + StepShared = 'StepShared', + StepSharedAdd = 'StepSharedAdd', + StepSharedInsert = 'StepSharedInsert', + ViewDashboard = 'ViewDashboard', + ViewList = 'ViewList', + ViewListGroup = 'ViewListGroup', + ViewListTree = 'ViewListTree', + TriggerAuto = 'TriggerAuto', + TriggerUser = 'TriggerUser', + PivotChart = 'PivotChart', + StackedBarChart = 'StackedBarChart', + StackedLineChart = 'StackedLineChart', + BuildQueue = 'BuildQueue', + BuildQueueNew = 'BuildQueueNew', + UserFollowed = 'UserFollowed', + ContactLink = 'ContactLink', + Stack = 'Stack', + Bullseye = 'Bullseye', + VennDiagram = 'VennDiagram', + FiveTileGrid = 'FiveTileGrid', + FocalPoint = 'FocalPoint', + Insert = 'Insert', + RingerRemove = 'RingerRemove', + TeamsLogoInverse = 'TeamsLogoInverse', + TeamsLogo = 'TeamsLogo', + TeamsLogoFill = 'TeamsLogoFill', + SkypeForBusinessLogoFill = 'SkypeForBusinessLogoFill', + SharepointLogo = 'SharepointLogo', + SharepointLogoFill = 'SharepointLogoFill', + DelveLogo = 'DelveLogo', + DelveLogoFill = 'DelveLogoFill', + OfficeVideoLogo = 'OfficeVideoLogo', + OfficeVideoLogoFill = 'OfficeVideoLogoFill', + ExchangeLogo = 'ExchangeLogo', + ExchangeLogoFill = 'ExchangeLogoFill', + Signin = 'Signin', + DocumentApproval = 'DocumentApproval', + CloneToDesktop = 'CloneToDesktop', + InstallToDrive = 'InstallToDrive', + Blur = 'Blur', + Build = 'Build', + ProcessMetaTask = 'ProcessMetaTask', + BranchFork2 = 'BranchFork2', + BranchLocked = 'BranchLocked', + BranchCommit = 'BranchCommit', + BranchCompare = 'BranchCompare', + BranchMerge = 'BranchMerge', + BranchPullRequest = 'BranchPullRequest', + BranchSearch = 'BranchSearch', + BranchShelveset = 'BranchShelveset', + RawSource = 'RawSource', + MergeDuplicate = 'MergeDuplicate', + RowsGroup = 'RowsGroup', + RowsChild = 'RowsChild', + Deploy = 'Deploy', + Redeploy = 'Redeploy', + ServerEnviroment = 'ServerEnviroment', + VisioDiagram = 'VisioDiagram', + HighlightMappedShapes = 'HighlightMappedShapes', + TextCallout = 'TextCallout', + IconSetsFlag = 'IconSetsFlag', + VisioLogo = 'VisioLogo', + VisioLogoFill = 'VisioLogoFill', + VisioDocument = 'VisioDocument', + TimelineProgress = 'TimelineProgress', + TimelineDelivery = 'TimelineDelivery', + Backlog = 'Backlog', + TeamFavorite = 'TeamFavorite', + TaskGroup = 'TaskGroup', + TaskGroupMirrored = 'TaskGroupMirrored', + ScopeTemplate = 'ScopeTemplate', + AssessmentGroupTemplate = 'AssessmentGroupTemplate', + NewTeamProject = 'NewTeamProject', + CommentAdd = 'CommentAdd', + CommentNext = 'CommentNext', + CommentPrevious = 'CommentPrevious', + ShopServer = 'ShopServer', + LocaleLanguage = 'LocaleLanguage', + QueryList = 'QueryList', + UserSync = 'UserSync', + UserPause = 'UserPause', + StreamingOff = 'StreamingOff', + MoreVertical = 'MoreVertical', + ArrowTallUpLeft = 'ArrowTallUpLeft', + ArrowTallUpRight = 'ArrowTallUpRight', + ArrowTallDownLeft = 'ArrowTallDownLeft', + ArrowTallDownRight = 'ArrowTallDownRight', + FieldEmpty = 'FieldEmpty', + FieldFilled = 'FieldFilled', + FieldChanged = 'FieldChanged', + FieldNotChanged = 'FieldNotChanged', + RingerOff = 'RingerOff', + PlayResume = 'PlayResume', + BulletedList2 = 'BulletedList2', + BulletedList2Mirrored = 'BulletedList2Mirrored', + ImageCrosshair = 'ImageCrosshair', + GitGraph = 'GitGraph', + Repo = 'Repo', + RepoSolid = 'RepoSolid', + FolderQuery = 'FolderQuery', + FolderList = 'FolderList', + FolderListMirrored = 'FolderListMirrored', + LocationOutline = 'LocationOutline', + POISolid = 'POISolid', + CalculatorNotEqualTo = 'CalculatorNotEqualTo', + BoxSubtractSolid = 'BoxSubtractSolid', + BoxAdditionSolid = 'BoxAdditionSolid', + BoxMultiplySolid = 'BoxMultiplySolid', + BoxPlaySolid = 'BoxPlaySolid', + BoxCheckmarkSolid = 'BoxCheckmarkSolid', + CirclePauseSolid = 'CirclePauseSolid', + CirclePause = 'CirclePause', + MSNVideosSolid = 'MSNVideosSolid', + CircleStopSolid = 'CircleStopSolid', + CircleStop = 'CircleStop', + NavigateBack = 'NavigateBack', + NavigateBackMirrored = 'NavigateBackMirrored', + NavigateForward = 'NavigateForward', + NavigateForwardMirrored = 'NavigateForwardMirrored', + UnknownSolid = 'UnknownSolid', + UnknownMirroredSolid = 'UnknownMirroredSolid', + CircleAddition = 'CircleAddition', + CircleAdditionSolid = 'CircleAdditionSolid', + FilePDB = 'FilePDB', + FileTemplate = 'FileTemplate', + FileSQL = 'FileSQL', + FileJAVA = 'FileJAVA', + FileASPX = 'FileASPX', + FileCSS = 'FileCSS', + FileSass = 'FileSass', + FileLess = 'FileLess', + FileHTML = 'FileHTML', + JavaScriptLanguage = 'JavaScriptLanguage', + CSharpLanguage = 'CSharpLanguage', + CSharp = 'CSharp', + VisualBasicLanguage = 'VisualBasicLanguage', + VB = 'VB', + CPlusPlusLanguage = 'CPlusPlusLanguage', + CPlusPlus = 'CPlusPlus', + FSharpLanguage = 'FSharpLanguage', + FSharp = 'FSharp', + TypeScriptLanguage = 'TypeScriptLanguage', + PythonLanguage = 'PythonLanguage', + PY = 'PY', + CoffeeScript = 'CoffeeScript', + MarkDownLanguage = 'MarkDownLanguage', + FullWidth = 'FullWidth', + FullWidthEdit = 'FullWidthEdit', + Plug = 'Plug', + PlugSolid = 'PlugSolid', + PlugConnected = 'PlugConnected', + PlugDisconnected = 'PlugDisconnected', + UnlockSolid = 'UnlockSolid', + Variable = 'Variable', + Parameter = 'Parameter', + CommentUrgent = 'CommentUrgent', + Storyboard = 'Storyboard', + DiffInline = 'DiffInline', + DiffSideBySide = 'DiffSideBySide', + ImageDiff = 'ImageDiff', + ImagePixel = 'ImagePixel', + FileBug = 'FileBug', + FileCode = 'FileCode', + FileComment = 'FileComment', + BusinessHoursSign = 'BusinessHoursSign', + FileImage = 'FileImage', + FileSymlink = 'FileSymlink', + AutoFillTemplate = 'AutoFillTemplate', + WorkItem = 'WorkItem', + WorkItemBug = 'WorkItemBug', + LogRemove = 'LogRemove', + ColumnOptions = 'ColumnOptions', + Packages = 'Packages', + BuildIssue = 'BuildIssue', + AssessmentGroup = 'AssessmentGroup', + VariableGroup = 'VariableGroup', + FullHistory = 'FullHistory', + Wheelchair = 'Wheelchair', + SingleColumnEdit = 'SingleColumnEdit', + DoubleColumnEdit = 'DoubleColumnEdit', + TripleColumnEdit = 'TripleColumnEdit', + ColumnLeftTwoThirdsEdit = 'ColumnLeftTwoThirdsEdit', + ColumnRightTwoThirdsEdit = 'ColumnRightTwoThirdsEdit', + StreamLogo = 'StreamLogo', + PassiveAuthentication = 'PassiveAuthentication', + AlertSolid = 'AlertSolid', + MegaphoneSolid = 'MegaphoneSolid', + TaskSolid = 'TaskSolid', + ConfigurationSolid = 'ConfigurationSolid', + BugSolid = 'BugSolid', + CrownSolid = 'CrownSolid', + Trophy2Solid = 'Trophy2Solid', + QuickNoteSolid = 'QuickNoteSolid', + ConstructionConeSolid = 'ConstructionConeSolid', + PageListSolid = 'PageListSolid', + PageListMirroredSolid = 'PageListMirroredSolid', + StarburstSolid = 'StarburstSolid', + ReadingModeSolid = 'ReadingModeSolid', + SadSolid = 'SadSolid', + HealthSolid = 'HealthSolid', + ShieldSolid = 'ShieldSolid', + GiftBoxSolid = 'GiftBoxSolid', + ShoppingCartSolid = 'ShoppingCartSolid', + MailSolid = 'MailSolid', + ChatSolid = 'ChatSolid', + RibbonSolid = 'RibbonSolid', + FinancialSolid = 'FinancialSolid', + FinancialMirroredSolid = 'FinancialMirroredSolid', + HeadsetSolid = 'HeadsetSolid', + PermissionsSolid = 'PermissionsSolid', + ParkingSolid = 'ParkingSolid', + ParkingMirroredSolid = 'ParkingMirroredSolid', + DiamondSolid = 'DiamondSolid', + AsteriskSolid = 'AsteriskSolid', + OfflineStorageSolid = 'OfflineStorageSolid', + BankSolid = 'BankSolid', + DecisionSolid = 'DecisionSolid', + Parachute = 'Parachute', + ParachuteSolid = 'ParachuteSolid', + FiltersSolid = 'FiltersSolid', + ColorSolid = 'ColorSolid', + ReviewSolid = 'ReviewSolid', + ReviewRequestSolid = 'ReviewRequestSolid', + ReviewRequestMirroredSolid = 'ReviewRequestMirroredSolid', + ReviewResponseSolid = 'ReviewResponseSolid', + FeedbackRequestSolid = 'FeedbackRequestSolid', + FeedbackRequestMirroredSolid = 'FeedbackRequestMirroredSolid', + FeedbackResponseSolid = 'FeedbackResponseSolid', + WorkItemBar = 'WorkItemBar', + WorkItemBarSolid = 'WorkItemBarSolid', + Separator = 'Separator', + NavigateExternalInline = 'NavigateExternalInline', + PlanView = 'PlanView', + TimelineMatrixView = 'TimelineMatrixView', + EngineeringGroup = 'EngineeringGroup', + ProjectCollection = 'ProjectCollection', + CaretBottomRightCenter8 = 'CaretBottomRightCenter8', + CaretBottomLeftCenter8 = 'CaretBottomLeftCenter8', + CaretTopRightCenter8 = 'CaretTopRightCenter8', + CaretTopLeftCenter8 = 'CaretTopLeftCenter8', + DonutChart = 'DonutChart', + ChevronUnfold10 = 'ChevronUnfold10', + ChevronFold10 = 'ChevronFold10', + DoubleChevronDown8 = 'DoubleChevronDown8', + DoubleChevronUp8 = 'DoubleChevronUp8', + DoubleChevronLeft8 = 'DoubleChevronLeft8', + DoubleChevronRight8 = 'DoubleChevronRight8', + ChevronDownEnd6 = 'ChevronDownEnd6', + ChevronUpEnd6 = 'ChevronUpEnd6', + ChevronLeftEnd6 = 'ChevronLeftEnd6', + ChevronRightEnd6 = 'ChevronRightEnd6', + ContextMenu = 'ContextMenu', + AzureAPIManagement = 'AzureAPIManagement', + AzureServiceEndpoint = 'AzureServiceEndpoint', + VSTSLogo = 'VSTSLogo', + VSTSAltLogo1 = 'VSTSAltLogo1', + VSTSAltLogo2 = 'VSTSAltLogo2', + FileTypeSolution = 'FileTypeSolution', + DateTime12 = 'DateTime12', + WordLogoInverse16 = 'WordLogoInverse16', + WordLogo16 = 'WordLogo16', + WordLogoFill16 = 'WordLogoFill16', + PowerPointLogoInverse16 = 'PowerPointLogoInverse16', + PowerPointLogo16 = 'PowerPointLogo16', + PowerPointLogoFill16 = 'PowerPointLogoFill16', + ExcelLogoInverse16 = 'ExcelLogoInverse16', + ExcelLogo16 = 'ExcelLogo16', + ExcelLogoFill16 = 'ExcelLogoFill16', + OneNoteLogoInverse16 = 'OneNoteLogoInverse16', + OneNoteLogo16 = 'OneNoteLogo16', + OneNoteLogoFill16 = 'OneNoteLogoFill16', + OutlookLogoInverse16 = 'OutlookLogoInverse16', + OutlookLogo16 = 'OutlookLogo16', + OutlookLogoFill16 = 'OutlookLogoFill16', + PublisherLogoInverse16 = 'PublisherLogoInverse16', + PublisherLogo16 = 'PublisherLogo16', + PublisherLogoFill16 = 'PublisherLogoFill16', + VisioLogoInverse16 = 'VisioLogoInverse16', + VisioLogo16 = 'VisioLogo16', + VisioLogoFill16 = 'VisioLogoFill16', + TestBeaker = 'TestBeaker', + TestBeakerSolid = 'TestBeakerSolid', + TestExploreSolid = 'TestExploreSolid', + TestAutoSolid = 'TestAutoSolid', + TestUserSolid = 'TestUserSolid', + TestImpactSolid = 'TestImpactSolid', + TestPlan = 'TestPlan', + TestStep = 'TestStep', + TestParameter = 'TestParameter', + TestSuite = 'TestSuite', + TestCase = 'TestCase', + Sprint = 'Sprint', + SignOut = 'SignOut', + TriggerApproval = 'TriggerApproval', + Rocket = 'Rocket', + AzureKeyVault = 'AzureKeyVault', + Onboarding = 'Onboarding', + Transition = 'Transition', + LikeSolid = 'LikeSolid', + DislikeSolid = 'DislikeSolid', + D365CustomerInsights = 'D365CustomerInsights', + EditCreate = 'EditCreate', + PlayReverseResume = 'PlayReverseResume', + PlayReverse = 'PlayReverse', + SearchData = 'SearchData', + UnSetColor = 'UnSetColor', + AutoDeploySettings = 'AutoDeploySettings', + DeclineCall = 'DeclineCall', + RectangularClipping = 'RectangularClipping', + TeamsLogo16 = 'TeamsLogo16', + TeamsLogoFill16 = 'TeamsLogoFill16', + Spacer = 'Spacer', + SkypeLogo16 = 'SkypeLogo16', + SkypeForBusinessLogo16 = 'SkypeForBusinessLogo16', + SkypeForBusinessLogoFill16 = 'SkypeForBusinessLogoFill16', + FilterSolid = 'FilterSolid', + MailUndelivered = 'MailUndelivered', + MailTentative = 'MailTentative', + MailTentativeMirrored = 'MailTentativeMirrored', + MailReminder = 'MailReminder', + ReceiptUndelivered = 'ReceiptUndelivered', + ReceiptTentative = 'ReceiptTentative', + ReceiptTentativeMirrored = 'ReceiptTentativeMirrored', + Inbox = 'Inbox', + IRMReply = 'IRMReply', + IRMReplyMirrored = 'IRMReplyMirrored', + IRMForward = 'IRMForward', + IRMForwardMirrored = 'IRMForwardMirrored', + VoicemailIRM = 'VoicemailIRM', + EventAccepted = 'EventAccepted', + EventTentative = 'EventTentative', + EventTentativeMirrored = 'EventTentativeMirrored', + EventDeclined = 'EventDeclined', + IDBadge = 'IDBadge', + BackgroundColor = 'BackgroundColor', + OfficeFormsLogoInverse16 = 'OfficeFormsLogoInverse16', + OfficeFormsLogo = 'OfficeFormsLogo', + OfficeFormsLogoFill = 'OfficeFormsLogoFill', + OfficeFormsLogo16 = 'OfficeFormsLogo16', + OfficeFormsLogoFill16 = 'OfficeFormsLogoFill16', + OfficeFormsLogoInverse24 = 'OfficeFormsLogoInverse24', + OfficeFormsLogo24 = 'OfficeFormsLogo24', + OfficeFormsLogoFill24 = 'OfficeFormsLogoFill24', + PageLock = 'PageLock', + NotExecuted = 'NotExecuted', + NotImpactedSolid = 'NotImpactedSolid', + FieldReadOnly = 'FieldReadOnly', + FieldRequired = 'FieldRequired', + BacklogBoard = 'BacklogBoard', + ExternalBuild = 'ExternalBuild', + ExternalTFVC = 'ExternalTFVC', + ExternalXAML = 'ExternalXAML', + IssueSolid = 'IssueSolid', + DefectSolid = 'DefectSolid', + LadybugSolid = 'LadybugSolid', + NugetLogo = 'NugetLogo', + TFVCLogo = 'TFVCLogo', + ProjectLogo32 = 'ProjectLogo32', + ProjectLogoFill32 = 'ProjectLogoFill32', + ProjectLogo16 = 'ProjectLogo16', + ProjectLogoFill16 = 'ProjectLogoFill16', + SwayLogo32 = 'SwayLogo32', + SwayLogoFill32 = 'SwayLogoFill32', + SwayLogo16 = 'SwayLogo16', + SwayLogoFill16 = 'SwayLogoFill16', + ClassNotebookLogo32 = 'ClassNotebookLogo32', + ClassNotebookLogoFill32 = 'ClassNotebookLogoFill32', + ClassNotebookLogo16 = 'ClassNotebookLogo16', + ClassNotebookLogoFill16 = 'ClassNotebookLogoFill16', + ClassNotebookLogoInverse32 = 'ClassNotebookLogoInverse32', + ClassNotebookLogoInverse16 = 'ClassNotebookLogoInverse16', + StaffNotebookLogo32 = 'StaffNotebookLogo32', + StaffNotebookLogoFill32 = 'StaffNotebookLogoFill32', + StaffNotebookLogo16 = 'StaffNotebookLogo16', + StaffNotebookLogoFill16 = 'StaffNotebookLogoFill16', + StaffNotebookLogoInverted32 = 'StaffNotebookLogoInverted32', + StaffNotebookLogoInverted16 = 'StaffNotebookLogoInverted16', + KaizalaLogo = 'KaizalaLogo', + TaskLogo = 'TaskLogo', + ProtectionCenterLogo32 = 'ProtectionCenterLogo32', + GallatinLogo = 'GallatinLogo', + Globe2 = 'Globe2', + Guitar = 'Guitar', + Breakfast = 'Breakfast', + Brunch = 'Brunch', + BeerMug = 'BeerMug', + Vacation = 'Vacation', + Teeth = 'Teeth', + Taxi = 'Taxi', + Chopsticks = 'Chopsticks', + SyncOccurence = 'SyncOccurence', + UnsyncOccurence = 'UnsyncOccurence', + GIF = 'GIF', + PrimaryCalendar = 'PrimaryCalendar', + SearchCalendar = 'SearchCalendar', + VideoOff = 'VideoOff', + MicrosoftFlowLogo = 'MicrosoftFlowLogo', + BusinessCenterLogo = 'BusinessCenterLogo', + ToDoLogoBottom = 'ToDoLogoBottom', + ToDoLogoTop = 'ToDoLogoTop', + EditSolid12 = 'EditSolid12', + EditSolidMirrored12 = 'EditSolidMirrored12', + UneditableSolid12 = 'UneditableSolid12', + UneditableSolidMirrored12 = 'UneditableSolidMirrored12', + UneditableMirrored = 'UneditableMirrored', + AdminALogo32 = 'AdminALogo32', + AdminALogoFill32 = 'AdminALogoFill32', + ToDoLogoInverse = 'ToDoLogoInverse', + Snooze = 'Snooze', + WaffleOffice365 = 'WaffleOffice365', + ImageSearch = 'ImageSearch', + NewsSearch = 'NewsSearch', + VideoSearch = 'VideoSearch', + R = 'R', + FontColorA = 'FontColorA', + FontColorSwatch = 'FontColorSwatch', + LightWeight = 'LightWeight', + NormalWeight = 'NormalWeight', + SemiboldWeight = 'SemiboldWeight', + GroupObject = 'GroupObject', + UngroupObject = 'UngroupObject', + AlignHorizontalLeft = 'AlignHorizontalLeft', + AlignHorizontalCenter = 'AlignHorizontalCenter', + AlignHorizontalRight = 'AlignHorizontalRight', + AlignVerticalTop = 'AlignVerticalTop', + AlignVerticalCenter = 'AlignVerticalCenter', + AlignVerticalBottom = 'AlignVerticalBottom', + HorizontalDistributeCenter = 'HorizontalDistributeCenter', + VerticalDistributeCenter = 'VerticalDistributeCenter', + Ellipse = 'Ellipse', + Line = 'Line', + Octagon = 'Octagon', + Hexagon = 'Hexagon', + Pentagon = 'Pentagon', + RightTriangle = 'RightTriangle', + HalfCircle = 'HalfCircle', + QuarterCircle = 'QuarterCircle', + ThreeQuarterCircle = 'ThreeQuarterCircle', + SixPointStar = 'SixPointStar', + TwelvePointStar = 'TwelvePointStar', + ArrangeBringToFront = 'ArrangeBringToFront', + ArrangeSendToBack = 'ArrangeSendToBack', + ArrangeSendBackward = 'ArrangeSendBackward', + ArrangeBringForward = 'ArrangeBringForward', + BorderDash = 'BorderDash', + BorderDot = 'BorderDot', + LineStyle = 'LineStyle', + LineThickness = 'LineThickness', + WindowEdit = 'WindowEdit', + HintText = 'HintText', + MediaAdd = 'MediaAdd', + AnchorLock = 'AnchorLock', + AutoHeight = 'AutoHeight', + ChartSeries = 'ChartSeries', + ChartXAngle = 'ChartXAngle', + ChartYAngle = 'ChartYAngle', + Combobox = 'Combobox', + LineSpacing = 'LineSpacing', + Padding = 'Padding', + PaddingTop = 'PaddingTop', + PaddingBottom = 'PaddingBottom', + PaddingLeft = 'PaddingLeft', + PaddingRight = 'PaddingRight', + NavigationFlipper = 'NavigationFlipper', + AlignJustify = 'AlignJustify', + TextOverflow = 'TextOverflow', + VisualsFolder = 'VisualsFolder', + VisualsStore = 'VisualsStore', + PictureCenter = 'PictureCenter', + PictureFill = 'PictureFill', + PicturePosition = 'PicturePosition', + PictureStretch = 'PictureStretch', + PictureTile = 'PictureTile', + Slider = 'Slider', + SliderHandleSize = 'SliderHandleSize', + DefaultRatio = 'DefaultRatio', + NumberSequence = 'NumberSequence', + GUID = 'GUID', + ReportAdd = 'ReportAdd', + DashboardAdd = 'DashboardAdd', + MapPinSolid = 'MapPinSolid', + WebPublish = 'WebPublish', + PieSingleSolid = 'PieSingleSolid', + BlockedSolid = 'BlockedSolid', + DrillDown = 'DrillDown', + DrillDownSolid = 'DrillDownSolid', + DrillExpand = 'DrillExpand', + DrillShow = 'DrillShow', + SpecialEvent = 'SpecialEvent', + OneDriveFolder16 = 'OneDriveFolder16', + FunctionalManagerDashboard = 'FunctionalManagerDashboard', + BIDashboard = 'BIDashboard', + CodeEdit = 'CodeEdit', + RenewalCurrent = 'RenewalCurrent', + RenewalFuture = 'RenewalFuture', + SplitObject = 'SplitObject', + BulkUpload = 'BulkUpload', + DownloadDocument = 'DownloadDocument', + GreetingCard = 'GreetingCard', + Flower = 'Flower', + WaitlistConfirm = 'WaitlistConfirm', + WaitlistConfirmMirrored = 'WaitlistConfirmMirrored', + LaptopSecure = 'LaptopSecure', + DragObject = 'DragObject', + EntryView = 'EntryView', + EntryDecline = 'EntryDecline', + ContactCardSettings = 'ContactCardSettings', + ContactCardSettingsMirrored = 'ContactCardSettingsMirrored', + CalendarSettings = 'CalendarSettings', + CalendarSettingsMirrored = 'CalendarSettingsMirrored', + HardDriveLock = 'HardDriveLock', + HardDriveUnlock = 'HardDriveUnlock', + AccountManagement = 'AccountManagement', + ReportWarning = 'ReportWarning', + PlaySolid = 'PlaySolid', + TransitionPop = 'TransitionPop', + TransitionPush = 'TransitionPush', + TransitionEffect = 'TransitionEffect', + LookupEntities = 'LookupEntities', + ExploreData = 'ExploreData', + AddBookmark = 'AddBookmark', + SearchBookmark = 'SearchBookmark', + DrillThrough = 'DrillThrough', + MasterDatabase = 'MasterDatabase', + CertifiedDatabase = 'CertifiedDatabase', + MaximumValue = 'MaximumValue', + MinimumValue = 'MinimumValue', + VisualStudioIDELogo32 = 'VisualStudioIDELogo32', + PasteAsText = 'PasteAsText', + PasteAsCode = 'PasteAsCode', + BrowserTab = 'BrowserTab', + BrowserTabScreenshot = 'BrowserTabScreenshot', + DesktopScreenshot = 'DesktopScreenshot', + FileYML = 'FileYML', + ClipboardSolid = 'ClipboardSolid', + FabricUserFolder = 'FabricUserFolder', + FabricNetworkFolder = 'FabricNetworkFolder', + BullseyeTarget = 'BullseyeTarget', + AnalyticsView = 'AnalyticsView', + Video360Generic = 'Video360Generic', + Untag = 'Untag', + Leave = 'Leave', + Trending12 = 'Trending12', + Blocked12 = 'Blocked12', + Warning12 = 'Warning12', + CheckedOutByOther12 = 'CheckedOutByOther12', + CheckedOutByYou12 = 'CheckedOutByYou12', + CircleShapeSolid = 'CircleShapeSolid', + SquareShapeSolid = 'SquareShapeSolid', + TriangleShapeSolid = 'TriangleShapeSolid', + DropShapeSolid = 'DropShapeSolid', + RectangleShapeSolid = 'RectangleShapeSolid', + ContentSettings = 'ContentSettings', + ZoomToFit = 'ZoomToFit', + InsertColumnsLeft = 'InsertColumnsLeft', + InsertColumnsRight = 'InsertColumnsRight', + InsertRowsAbove = 'InsertRowsAbove', + InsertRowsBelow = 'InsertRowsBelow', + DeleteColumns = 'DeleteColumns', + DeleteRows = 'DeleteRows', + DeleteRowsMirrored = 'DeleteRowsMirrored', + DeleteTable = 'DeleteTable', + AccountBrowser = 'AccountBrowser', + VersionControlPush = 'VersionControlPush', + StackedColumnChart2 = 'StackedColumnChart2', + TripleColumnWide = 'TripleColumnWide', + QuadColumn = 'QuadColumn', + WhiteBoardApp16 = 'WhiteBoardApp16', + WhiteBoardApp32 = 'WhiteBoardApp32', + PinnedSolid = 'PinnedSolid', + InsertSignatureLine = 'InsertSignatureLine', + ArrangeByFrom = 'ArrangeByFrom', + Phishing = 'Phishing', + CreateMailRule = 'CreateMailRule', + PublishCourse = 'PublishCourse', + DictionaryRemove = 'DictionaryRemove', + UserRemove = 'UserRemove', + UserEvent = 'UserEvent', + Encryption = 'Encryption', + LiveSite = 'LiveSite', + PasswordField = 'PasswordField', + OpenInNewTab = 'OpenInNewTab', + Hide3 = 'Hide3', + VerifiedBrandSolid = 'VerifiedBrandSolid', + MarkAsProtected = 'MarkAsProtected', + AuthenticatorApp = 'AuthenticatorApp', + WebTemplate = 'WebTemplate', + DefenderTVM = 'DefenderTVM', + MedalSolid = 'MedalSolid', + D365TalentLearn = 'D365TalentLearn', + D365TalentInsight = 'D365TalentInsight', + D365CoreHR = 'D365CoreHR', + BacklogList = 'BacklogList', + ButtonControl = 'ButtonControl', + TableGroup = 'TableGroup', + MountainClimbing = 'MountainClimbing', + TagUnknown = 'TagUnknown', + TagUnknownMirror = 'TagUnknownMirror', + TagUnknown12 = 'TagUnknown12', + TagUnknown12Mirror = 'TagUnknown12Mirror', + Link12 = 'Link12', + Presentation = 'Presentation', + Presentation12 = 'Presentation12', + Lock12 = 'Lock12', + BuildDefinition = 'BuildDefinition', + ReleaseDefinition = 'ReleaseDefinition', + SaveTemplate = 'SaveTemplate', + UserGauge = 'UserGauge', + BlockedSiteSolid12 = 'BlockedSiteSolid12', + TagSolid = 'TagSolid', + OfficeChat = 'OfficeChat', + OfficeChatSolid = 'OfficeChatSolid', + MailSchedule = 'MailSchedule', + PowerShell2 = 'PowerShell2', + WarningSolid = 'WarningSolid', + Blocked2Solid = 'Blocked2Solid', + SkypeCircleArrow = 'SkypeCircleArrow', + SkypeArrow = 'SkypeArrow', + SyncStatus = 'SyncStatus', + SyncStatusSolid = 'SyncStatusSolid', + ProjectDocument = 'ProjectDocument', + ToDoLogoOutline = 'ToDoLogoOutline', + VisioDiagramSync = 'VisioDiagramSync', + Event12 = 'Event12', + EventDateMissed12 = 'EventDateMissed12', + UserOptional = 'UserOptional', + ResponsesMenu = 'ResponsesMenu', + DoubleDownArrow = 'DoubleDownArrow', + DistributeDown = 'DistributeDown', + BookmarkReport = 'BookmarkReport', + FilterSettings = 'FilterSettings', + GripperDotsVertical = 'GripperDotsVertical', + MailAttached = 'MailAttached', + AddIn = 'AddIn', + LinkedDatabase = 'LinkedDatabase', + TableLink = 'TableLink', + PromotedDatabase = 'PromotedDatabase', + BarChartVerticalFilter = 'BarChartVerticalFilter', + BarChartVerticalFilterSolid = 'BarChartVerticalFilterSolid', + MicOff2 = 'MicOff2', + MicrosoftTranslatorLogo = 'MicrosoftTranslatorLogo', + ShowTimeAs = 'ShowTimeAs', + FileRequest = 'FileRequest', + WorkItemAlert = 'WorkItemAlert', + PowerBILogo16 = 'PowerBILogo16', + PowerBILogoBackplate16 = 'PowerBILogoBackplate16', + BulletedListText = 'BulletedListText', + BulletedListBullet = 'BulletedListBullet', + BulletedListTextMirrored = 'BulletedListTextMirrored', + BulletedListBulletMirrored = 'BulletedListBulletMirrored', + NumberedListText = 'NumberedListText', + NumberedListNumber = 'NumberedListNumber', + NumberedListTextMirrored = 'NumberedListTextMirrored', + NumberedListNumberMirrored = 'NumberedListNumberMirrored', + RemoveLinkChain = 'RemoveLinkChain', + RemoveLinkX = 'RemoveLinkX', + FabricTextHighlight = 'FabricTextHighlight', + ClearFormattingA = 'ClearFormattingA', + ClearFormattingEraser = 'ClearFormattingEraser', + Photo2Fill = 'Photo2Fill', + IncreaseIndentText = 'IncreaseIndentText', + IncreaseIndentArrow = 'IncreaseIndentArrow', + DecreaseIndentText = 'DecreaseIndentText', + DecreaseIndentArrow = 'DecreaseIndentArrow', + IncreaseIndentTextMirrored = 'IncreaseIndentTextMirrored', + IncreaseIndentArrowMirrored = 'IncreaseIndentArrowMirrored', + DecreaseIndentTextMirrored = 'DecreaseIndentTextMirrored', + DecreaseIndentArrowMirrored = 'DecreaseIndentArrowMirrored', + CheckListText = 'CheckListText', + CheckListCheck = 'CheckListCheck', + CheckListTextMirrored = 'CheckListTextMirrored', + CheckListCheckMirrored = 'CheckListCheckMirrored', + NumberSymbol = 'NumberSymbol', + Coupon = 'Coupon', + VerifiedBrand = 'VerifiedBrand', + ReleaseGate = 'ReleaseGate', + ReleaseGateCheck = 'ReleaseGateCheck', + ReleaseGateError = 'ReleaseGateError', + M365InvoicingLogo = 'M365InvoicingLogo', + RemoveFromShoppingList = 'RemoveFromShoppingList', + ShieldAlert = 'ShieldAlert', + FabricTextHighlightComposite = 'FabricTextHighlightComposite', + LearningTools = 'LearningTools', + Dataflows = 'Dataflows', + ShowGrid = 'ShowGrid', + DiagnosticDataBarTooltip = 'DiagnosticDataBarTooltip', + SaveToMobile = 'SaveToMobile', + Orientation2 = 'Orientation2', + ScreenCast = 'ScreenCast', + GenericScanFilled = 'GenericScanFilled', + SnapToGrid = 'SnapToGrid', + ContactList = 'ContactList', + NewMail = 'NewMail', + EyeShadow = 'EyeShadow', + FabricFolderConfirm = 'FabricFolderConfirm', + InformationBarriers = 'InformationBarriers', + CommentActive = 'CommentActive', + ColumnVerticalSectionEdit = 'ColumnVerticalSectionEdit', + WavingHand = 'WavingHand', + ShakeDevice = 'ShakeDevice', + SmartGlassRemote = 'SmartGlassRemote', + Rotate90Clockwise = 'Rotate90Clockwise', + Rotate90CounterClockwise = 'Rotate90CounterClockwise', + CampaignTemplate = 'CampaignTemplate', + ChartTemplate = 'ChartTemplate', + PageListFilter = 'PageListFilter', + SecondaryNav = 'SecondaryNav', + ColumnVerticalSection = 'ColumnVerticalSection', + SkypeCircleSlash = 'SkypeCircleSlash', + SkypeSlash = 'SkypeSlash', + CustomizeToolbar = 'CustomizeToolbar', + DuplicateRow = 'DuplicateRow', + RemoveFromTrash = 'RemoveFromTrash', + MailOptions = 'MailOptions', + Childof = 'Childof', + Footer = 'Footer', + Header = 'Header', + BarChartVerticalFill = 'BarChartVerticalFill', + StackedColumnChart2Fill = 'StackedColumnChart2Fill', + PlainText = 'PlainText', + AccessibiltyChecker = 'AccessibiltyChecker', + DatabaseSync = 'DatabaseSync', + ReservationOrders = 'ReservationOrders', + TabOneColumn = 'TabOneColumn', + TabTwoColumn = 'TabTwoColumn', + TabThreeColumn = 'TabThreeColumn', + BulletedTreeList = 'BulletedTreeList', + MicrosoftTranslatorLogoGreen = 'MicrosoftTranslatorLogoGreen', + MicrosoftTranslatorLogoBlue = 'MicrosoftTranslatorLogoBlue', + InternalInvestigation = 'InternalInvestigation', + AddReaction = 'AddReaction', + ContactHeart = 'ContactHeart', + VisuallyImpaired = 'VisuallyImpaired', + EventToDoLogo = 'EventToDoLogo', + Variable2 = 'Variable2', + ModelingView = 'ModelingView', + DisconnectVirtualMachine = 'DisconnectVirtualMachine', + ReportLock = 'ReportLock', + Uneditable2 = 'Uneditable2', + Uneditable2Mirrored = 'Uneditable2Mirrored', + Spelling = 'Spelling', + BarChartVerticalEdit = 'BarChartVerticalEdit', + GlobalNavButtonActive = 'GlobalNavButtonActive', + PollResults = 'PollResults', + Rerun = 'Rerun', + QandA = 'QandA', + QandAMirror = 'QandAMirror', + BookAnswers = 'BookAnswers', + AlertSettings = 'AlertSettings', + TrimStart = 'TrimStart', + TrimEnd = 'TrimEnd', + TableComputed = 'TableComputed', + DecreaseIndentLegacy = 'DecreaseIndentLegacy', + IncreaseIndentLegacy = 'IncreaseIndentLegacy', + SizeLegacy = 'SizeLegacy' + } + + // tslint:disable-next-line:deprecation + export type IconNamesInput = keyof typeof IconNames; \ No newline at end of file diff --git a/src/settings-web/src/icons/src/data/AllIconNames.json b/src/settings-web/src/icons/src/data/AllIconNames.json index 3cc0c9b21..ace0cffd2 100644 --- a/src/settings-web/src/icons/src/data/AllIconNames.json +++ b/src/settings-web/src/icons/src/data/AllIconNames.json @@ -1,5 +1,61 @@ [ { "_comment": "Auto-generated by the UI Fabric Icon subsetter tool: https://uifabricicons.azurewebsites.net" }, + { "name": "PageLink", "unicode": "E302" }, + { "name": "CommentSolid", "unicode": "E30E" }, + { "name": "ChangeEntitlements", "unicode": "E310" }, + { "name": "Installation", "unicode": "E311" }, + { "name": "WebAppBuilderModule", "unicode": "E313" }, + { "name": "WebAppBuilderFragment", "unicode": "E314" }, + { "name": "WebAppBuilderSlot", "unicode": "E315" }, + { "name": "BullseyeTargetEdit", "unicode": "E319" }, + { "name": "WebAppBuilderFragmentCreate", "unicode": "E31B" }, + { "name": "PageData", "unicode": "E31C" }, + { "name": "PageHeaderEdit", "unicode": "E31D" }, + { "name": "ProductList", "unicode": "E31E" }, + { "name": "UnpublishContent", "unicode": "E31F" }, + { "name": "DependencyAdd", "unicode": "E344" }, + { "name": "DependencyRemove", "unicode": "E345" }, + { "name": "EntitlementPolicy", "unicode": "E346" }, + { "name": "EntitlementRedemption", "unicode": "E347" }, + { "name": "SchoolDataSyncLogo", "unicode": "E34C" }, + { "name": "PinSolid12", "unicode": "E352" }, + { "name": "PinSolidOff12", "unicode": "E353" }, + { "name": "AddLink", "unicode": "E35E" }, + { "name": "SharepointAppIcon16", "unicode": "E365" }, + { "name": "DataflowsLink", "unicode": "E366" }, + { "name": "TimePicker", "unicode": "E367" }, + { "name": "UserWarning", "unicode": "E368" }, + { "name": "ComplianceAudit", "unicode": "E369" }, + { "name": "StickyNotesOutlineAppIcon", "unicode": "E36A" }, + { "name": "StickyNotesSolidAppIcon", "unicode": "E36B" }, + { "name": "Webcam2Off", "unicode": "E36D" }, + { "name": "eDiscovery", "unicode": "E370" }, + { "name": "CalendarYear", "unicode": "E371" }, + { "name": "IgnoreConversation", "unicode": "E372" }, + { "name": "CommonDataServiceCDS", "unicode": "E377" }, + { "name": "Forum", "unicode": "E378" }, + { "name": "SentimentAnalysis", "unicode": "E393" }, + { "name": "TextRecognition", "unicode": "E394" }, + { "name": "KeyPhraseExtraction", "unicode": "E395" }, + { "name": "AltText", "unicode": "E397" }, + { "name": "NumberedListMirrored", "unicode": "E398" }, + { "name": "IncreaseIndent", "unicode": "E399" }, + { "name": "IncreaseIndentMirrored", "unicode": "E39A" }, + { "name": "DecreaseIndent", "unicode": "E39B" }, + { "name": "DecreaseIndentMirrored", "unicode": "E39C" }, + { "name": "IncreaseIndentHanging", "unicode": "E39D" }, + { "name": "IncreaseIndentHangingMirrored", "unicode": "E39E" }, + { "name": "ArchiveUndo", "unicode": "E3A1" }, + { "name": "LeaveUser", "unicode": "E3A8" }, + { "name": "FabricFolderUpload", "unicode": "E3AC" }, + { "name": "RedEye12", "unicode": "E3AD" }, + { "name": "MapPin12", "unicode": "E3AE" }, + { "name": "Insights", "unicode": "E3AF" }, + { "name": "TaskList", "unicode": "E3B6" }, + { "name": "MachineLearning", "unicode": "E3B8" }, + { "name": "HealthRefresh", "unicode": "E3BD" }, + { "name": "SharedDatabase", "unicode": "E3D9" }, + { "name": "WebEnvironment", "unicode": "E3DB" }, { "name": "GlobalNavButton", "unicode": "E700" }, { "name": "InternetSharing", "unicode": "E704" }, { "name": "Brightness", "unicode": "E706" }, @@ -56,6 +112,7 @@ { "name": "CheckMark", "unicode": "E73E" }, { "name": "BackToWindow", "unicode": "E73F" }, { "name": "FullScreen", "unicode": "E740" }, + { "name": "SwitchUser", "unicode": "E748" }, { "name": "Print", "unicode": "E749" }, { "name": "Up", "unicode": "E74A" }, { "name": "Down", "unicode": "E74B" }, @@ -88,6 +145,7 @@ { "name": "SearchAndApps", "unicode": "E773" }, { "name": "Globe", "unicode": "E774" }, { "name": "EaseOfAccess", "unicode": "E776" }, + { "name": "UpdateRestore", "unicode": "E777" }, { "name": "ContactInfo", "unicode": "E779" }, { "name": "Unpin", "unicode": "E77A" }, { "name": "Contact", "unicode": "E77B" }, @@ -101,6 +159,7 @@ { "name": "Slideshow", "unicode": "E786" }, { "name": "Calendar", "unicode": "E787" }, { "name": "Megaphone", "unicode": "E789" }, + { "name": "Trim", "unicode": "E78A" }, { "name": "AutoEnhanceOn", "unicode": "E78D" }, { "name": "AutoEnhanceOff", "unicode": "E78E" }, { "name": "Color", "unicode": "E790" }, @@ -114,10 +173,12 @@ { "name": "Crop", "unicode": "E7A8" }, { "name": "PhotoCollection", "unicode": "E7AA" }, { "name": "Album", "unicode": "E7AB" }, + { "name": "OpenWith", "unicode": "E7AC" }, { "name": "Rotate", "unicode": "E7AD" }, { "name": "PanoIndicator", "unicode": "E7B0" }, { "name": "Translate", "unicode": "E7B2" }, { "name": "RedEye", "unicode": "E7B3" }, + { "name": "ViewOriginal", "unicode": "E7B4" }, { "name": "ThumbnailView", "unicode": "E7B6" }, { "name": "Package", "unicode": "E7B8" }, { "name": "Telemarketer", "unicode": "E7B9" }, @@ -140,6 +201,7 @@ { "name": "TVMonitor", "unicode": "E7F4" }, { "name": "Speakers", "unicode": "E7F5" }, { "name": "Game", "unicode": "E7FC" }, + { "name": "HorizontalTabKey", "unicode": "E7FD" }, { "name": "UnstackSelected", "unicode": "E7FE" }, { "name": "StackIndicator", "unicode": "E7FF" }, { "name": "Nav2DMapView", "unicode": "E800" }, @@ -304,6 +366,7 @@ { "name": "Communications", "unicode": "E95A" }, { "name": "Headset", "unicode": "E95B" }, { "name": "Health", "unicode": "E95E" }, + { "name": "Webcam2", "unicode": "E960" }, { "name": "FrontCamera", "unicode": "E96B" }, { "name": "ChevronUpSmall", "unicode": "E96D" }, { "name": "ChevronDownSmall", "unicode": "E96E" }, @@ -419,6 +482,7 @@ { "name": "MiniContractMirrored", "unicode": "EA59" }, { "name": "MiniExpandMirrored", "unicode": "EA5A" }, { "name": "OpenPaneMirrored", "unicode": "EA5B" }, + { "name": "OpenWithMirrored", "unicode": "EA5C" }, { "name": "ParkingLocationMirrored", "unicode": "EA5E" }, { "name": "SendMirrored", "unicode": "EA63" }, { "name": "ShowResultsMirrored", "unicode": "EA65" }, @@ -493,6 +557,7 @@ { "name": "Snowflake", "unicode": "EB46" }, { "name": "BusSolid", "unicode": "EB47" }, { "name": "FerrySolid", "unicode": "EB48" }, + { "name": "EndPointSolid", "unicode": "EB4B" }, { "name": "AirplaneSolid", "unicode": "EB4C" }, { "name": "TrainSolid", "unicode": "EB4D" }, { "name": "Heart", "unicode": "EB51" }, @@ -529,6 +594,7 @@ { "name": "DeliveryTruck", "unicode": "EBF4" }, { "name": "ReminderPerson", "unicode": "EBF7" }, { "name": "ReminderGroup", "unicode": "EBF8" }, + { "name": "ReminderTime", "unicode": "EBF9" }, { "name": "TabletMode", "unicode": "EBFC" }, { "name": "Umbrella", "unicode": "EC04" }, { "name": "NetworkTower", "unicode": "EC05" }, @@ -555,7 +621,7 @@ { "name": "MusicNote", "unicode": "EC4F" }, { "name": "MicOff", "unicode": "EC54" }, { "name": "PlaybackRate1x", "unicode": "EC57" }, - { "name": "EdgeLogo", "unicode": "EC60" }, + { "name": "EdgeOldLogo", "unicode": "EC60" }, { "name": "CompletedSolid", "unicode": "EC61" }, { "name": "AlbumRemove", "unicode": "EC62" }, { "name": "MessageFill", "unicode": "EC70" }, @@ -585,6 +651,7 @@ { "name": "Photo2Remove", "unicode": "ECAC" }, { "name": "Calories", "unicode": "ECAD" }, { "name": "POI", "unicode": "ECAF" }, + { "name": "RemoveContent", "unicode": "ECC7" }, { "name": "AddTo", "unicode": "ECC8" }, { "name": "RadioBtnOff", "unicode": "ECCA" }, { "name": "RadioBtnOn", "unicode": "ECCB" }, @@ -595,6 +662,7 @@ { "name": "ProgressLoopOuter", "unicode": "ECDF" }, { "name": "Blocked2", "unicode": "ECE4" }, { "name": "FangBody", "unicode": "ECEB" }, + { "name": "Toolbox", "unicode": "ECED" }, { "name": "PageHeader", "unicode": "ECEE" }, { "name": "Glimmer", "unicode": "ECF4" }, { "name": "ChatInviteFriend", "unicode": "ECFE" }, @@ -603,6 +671,7 @@ { "name": "Crown", "unicode": "ED01" }, { "name": "Diamond", "unicode": "ED02" }, { "name": "ScaleUp", "unicode": "ED09" }, + { "name": "ResetDevice", "unicode": "ED10" }, { "name": "QRCode", "unicode": "ED14" }, { "name": "Feedback", "unicode": "ED15" }, { "name": "SharepointLogoInverse", "unicode": "ED18" }, @@ -614,6 +683,8 @@ { "name": "CalendarMirrored", "unicode": "ED28" }, { "name": "SwayLogoInverse", "unicode": "ED29" }, { "name": "OutOfOffice", "unicode": "ED34" }, + { "name": "SkipBack10", "unicode": "ED3C" }, + { "name": "SkipForward30", "unicode": "ED3D" }, { "name": "Trophy", "unicode": "ED3F" }, { "name": "ReopenPages", "unicode": "ED50" }, { "name": "EmojiTabSymbols", "unicode": "ED58" }, @@ -723,7 +794,9 @@ { "name": "RecruitmentManagement", "unicode": "EE12" }, { "name": "Questionnaire", "unicode": "EE19" }, { "name": "ManagerSelfService", "unicode": "EE23" }, + { "name": "ProductionFloorManagement", "unicode": "EE29" }, { "name": "ProductRelease", "unicode": "EE2E" }, + { "name": "ProductVariant", "unicode": "EE30" }, { "name": "ReplyMirrored", "unicode": "EE35" }, { "name": "ReplyAllMirrored", "unicode": "EE36" }, { "name": "Medal", "unicode": "EE38" }, @@ -780,6 +853,7 @@ { "name": "ArrowUpRight8", "unicode": "EED4" }, { "name": "ArrowDownRight8", "unicode": "EED5" }, { "name": "DocumentSet", "unicode": "EED6" }, + { "name": "GoToDashboard", "unicode": "EEED" }, { "name": "DelveAnalytics", "unicode": "EEEE" }, { "name": "ArrowUpRightMirrored8", "unicode": "EEEF" }, { "name": "ArrowDownRightMirrored8", "unicode": "EEF0" }, @@ -855,6 +929,7 @@ { "name": "BirthdayCake", "unicode": "EF8D" }, { "name": "ClearFilter", "unicode": "EF8F" }, { "name": "Flow", "unicode": "EF90" }, + { "name": "FixedAssetManagement", "unicode": "EF93" }, { "name": "TimeEntry", "unicode": "EF95" }, { "name": "CRMProcesses", "unicode": "EFB1" }, { "name": "PageEdit", "unicode": "EFB6" }, @@ -869,7 +944,9 @@ { "name": "AppIconDefaultList", "unicode": "EFDE" }, { "name": "ActivateOrders", "unicode": "EFE0" }, { "name": "DeactivateOrders", "unicode": "EFE1" }, + { "name": "ProductCatalog", "unicode": "EFE8" }, { "name": "ScatterChart", "unicode": "EFEB" }, + { "name": "AccountActivity", "unicode": "EFF4" }, { "name": "DocumentManagement", "unicode": "EFFC" }, { "name": "CRMReport", "unicode": "EFFE" }, { "name": "KnowledgeArticle", "unicode": "F000" }, @@ -880,15 +957,18 @@ { "name": "TextDocument", "unicode": "F029" }, { "name": "TextDocumentShared", "unicode": "F02B" }, { "name": "PageCheckedOut", "unicode": "F02C" }, + { "name": "PageShared", "unicode": "F02D" }, { "name": "SaveAndClose", "unicode": "F038" }, { "name": "Script", "unicode": "F03A" }, { "name": "Archive", "unicode": "F03F" }, + { "name": "MessageFriendRequest", "unicode": "F055" }, { "name": "ActivityFeed", "unicode": "F056" }, { "name": "Compare", "unicode": "F057" }, { "name": "EventDate", "unicode": "F059" }, { "name": "ArrowUpRight", "unicode": "F069" }, { "name": "CaretRight", "unicode": "F06B" }, { "name": "SetAction", "unicode": "F071" }, + { "name": "ChatBot", "unicode": "F08B" }, { "name": "CaretSolidLeft", "unicode": "F08D" }, { "name": "CaretSolidDown", "unicode": "F08E" }, { "name": "CaretSolidRight", "unicode": "F08F" }, @@ -914,6 +994,7 @@ { "name": "FabricFolderFill", "unicode": "F0AA" }, { "name": "FabricNewFolder", "unicode": "F0AB" }, { "name": "FabricPictureLibrary", "unicode": "F0AC" }, + { "name": "PhotoVideoMedia", "unicode": "F0B1" }, { "name": "AddFavorite", "unicode": "F0C8" }, { "name": "AddFavoriteFill", "unicode": "F0C9" }, { "name": "BufferTimeBefore", "unicode": "F0CF" }, @@ -956,6 +1037,7 @@ { "name": "ProgressRingDots", "unicode": "F16A" }, { "name": "CaloriesAdd", "unicode": "F172" }, { "name": "BranchFork", "unicode": "F173" }, + { "name": "MuteChat", "unicode": "F17A" }, { "name": "AddHome", "unicode": "F17B" }, { "name": "AddWork", "unicode": "F17C" }, { "name": "MobileReport", "unicode": "F18A" }, @@ -964,6 +1046,8 @@ { "name": "FastMode", "unicode": "F19A" }, { "name": "ToggleLeft", "unicode": "F19E" }, { "name": "ToggleRight", "unicode": "F19F" }, + { "name": "FullView", "unicode": "F1A2" }, + { "name": "FocusView", "unicode": "F1A3" }, { "name": "TriangleShape", "unicode": "F1A7" }, { "name": "RectangleShape", "unicode": "F1A9" }, { "name": "CubeShape", "unicode": "F1AA" }, @@ -995,6 +1079,7 @@ { "name": "PublisherLogoFill", "unicode": "F1EE" }, { "name": "ScheduleEventAction", "unicode": "F1EF" }, { "name": "FlameSolid", "unicode": "F1F3" }, + { "name": "PowerShell", "unicode": "F1FD" }, { "name": "ServerProcesses", "unicode": "F1FE" }, { "name": "Server", "unicode": "F201" }, { "name": "SaveAll", "unicode": "F203" }, @@ -1031,6 +1116,7 @@ { "name": "VennDiagram", "unicode": "F273" }, { "name": "FiveTileGrid", "unicode": "F274" }, { "name": "FocalPoint", "unicode": "F277" }, + { "name": "Insert", "unicode": "F278" }, { "name": "RingerRemove", "unicode": "F279" }, { "name": "TeamsLogoInverse", "unicode": "F27A" }, { "name": "TeamsLogo", "unicode": "F27B" }, @@ -1267,6 +1353,7 @@ { "name": "VSTSAltLogo1", "unicode": "F382" }, { "name": "VSTSAltLogo2", "unicode": "F383" }, { "name": "FileTypeSolution", "unicode": "F387" }, + { "name": "DateTime12", "unicode": "F38F" }, { "name": "WordLogoInverse16", "unicode": "F390" }, { "name": "WordLogo16", "unicode": "F391" }, { "name": "WordLogoFill16", "unicode": "F392" }, @@ -1308,10 +1395,13 @@ { "name": "Transition", "unicode": "F3BC" }, { "name": "LikeSolid", "unicode": "F3BF" }, { "name": "DislikeSolid", "unicode": "F3C0" }, - { "name": "CRMCustomerInsightsApp", "unicode": "F3C8" }, + { "name": "D365CustomerInsights", "unicode": "F3C8" }, { "name": "EditCreate", "unicode": "F3C9" }, + { "name": "PlayReverseResume", "unicode": "F3E4" }, + { "name": "PlayReverse", "unicode": "F3E5" }, { "name": "SearchData", "unicode": "F3F1" }, { "name": "UnSetColor", "unicode": "F3F9" }, + { "name": "AutoDeploySettings", "unicode": "F3FA" }, { "name": "DeclineCall", "unicode": "F405" }, { "name": "RectangularClipping", "unicode": "F407" }, { "name": "TeamsLogo16", "unicode": "F40A" }, @@ -1503,6 +1593,7 @@ { "name": "SplitObject", "unicode": "F547" }, { "name": "BulkUpload", "unicode": "F548" }, { "name": "DownloadDocument", "unicode": "F549" }, + { "name": "GreetingCard", "unicode": "F54B" }, { "name": "Flower", "unicode": "F54E" }, { "name": "WaitlistConfirm", "unicode": "F550" }, { "name": "WaitlistConfirmMirrored", "unicode": "F551" }, @@ -1517,6 +1608,8 @@ { "name": "HardDriveLock", "unicode": "F55A" }, { "name": "HardDriveUnlock", "unicode": "F55B" }, { "name": "AccountManagement", "unicode": "F55C" }, + { "name": "ReportWarning", "unicode": "F569" }, + { "name": "PlaySolid", "unicode": "F5B0" }, { "name": "TransitionPop", "unicode": "F5B2" }, { "name": "TransitionPush", "unicode": "F5B3" }, { "name": "TransitionEffect", "unicode": "F5B4" }, @@ -1539,8 +1632,10 @@ { "name": "ClipboardSolid", "unicode": "F5DC" }, { "name": "FabricUserFolder", "unicode": "F5E5" }, { "name": "FabricNetworkFolder", "unicode": "F5E6" }, + { "name": "BullseyeTarget", "unicode": "F5F0" }, { "name": "AnalyticsView", "unicode": "F5F1" }, { "name": "Video360Generic", "unicode": "F609" }, + { "name": "Untag", "unicode": "F60B" }, { "name": "Leave", "unicode": "F627" }, { "name": "Trending12", "unicode": "F62D" }, { "name": "Blocked12", "unicode": "F62E" }, @@ -1552,6 +1647,7 @@ { "name": "TriangleShapeSolid", "unicode": "F63E" }, { "name": "DropShapeSolid", "unicode": "F63F" }, { "name": "RectangleShapeSolid", "unicode": "F640" }, + { "name": "ContentSettings", "unicode": "F647" }, { "name": "ZoomToFit", "unicode": "F649" }, { "name": "InsertColumnsLeft", "unicode": "F64A" }, { "name": "InsertColumnsRight", "unicode": "F64B" }, @@ -1578,6 +1674,7 @@ { "name": "UserRemove", "unicode": "F69B" }, { "name": "UserEvent", "unicode": "F69C" }, { "name": "Encryption", "unicode": "F69D" }, + { "name": "LiveSite", "unicode": "F6A6" }, { "name": "PasswordField", "unicode": "F6AA" }, { "name": "OpenInNewTab", "unicode": "F6AB" }, { "name": "Hide3", "unicode": "F6AC" }, @@ -1589,7 +1686,7 @@ { "name": "MedalSolid", "unicode": "F6B9" }, { "name": "D365TalentLearn", "unicode": "F6BB" }, { "name": "D365TalentInsight", "unicode": "F6BC" }, - { "name": "D365TalentHRCore", "unicode": "F6BD" }, + { "name": "D365CoreHR", "unicode": "F6BD" }, { "name": "BacklogList", "unicode": "F6BF" }, { "name": "ButtonControl", "unicode": "F6C0" }, { "name": "TableGroup", "unicode": "F6D9" }, @@ -1611,6 +1708,7 @@ { "name": "OfficeChat", "unicode": "F70F" }, { "name": "OfficeChatSolid", "unicode": "F710" }, { "name": "MailSchedule", "unicode": "F72E" }, + { "name": "PowerShell2", "unicode": "F730" }, { "name": "WarningSolid", "unicode": "F736" }, { "name": "Blocked2Solid", "unicode": "F737" }, { "name": "SkypeCircleArrow", "unicode": "F747" }, @@ -1619,9 +1717,6 @@ { "name": "SyncStatusSolid", "unicode": "F752" }, { "name": "ProjectDocument", "unicode": "F759" }, { "name": "ToDoLogoOutline", "unicode": "F75B" }, - { "name": "VisioOnlineLogoFill32", "unicode": "F75F" }, - { "name": "VisioOnlineLogo32", "unicode": "F760" }, - { "name": "VisioOnlineLogoCloud32", "unicode": "F761" }, { "name": "VisioDiagramSync", "unicode": "F762" }, { "name": "Event12", "unicode": "F763" }, { "name": "EventDateMissed12", "unicode": "F764" }, @@ -1639,6 +1734,7 @@ { "name": "PromotedDatabase", "unicode": "F77D" }, { "name": "BarChartVerticalFilter", "unicode": "F77E" }, { "name": "BarChartVerticalFilterSolid", "unicode": "F77F" }, + { "name": "MicOff2", "unicode": "F781" }, { "name": "MicrosoftTranslatorLogo", "unicode": "F782" }, { "name": "ShowTimeAs", "unicode": "F787" }, { "name": "FileRequest", "unicode": "F789" }, @@ -1681,13 +1777,14 @@ { "name": "RemoveFromShoppingList", "unicode": "F7D5" }, { "name": "ShieldAlert", "unicode": "F7D7" }, { "name": "FabricTextHighlightComposite", "unicode": "F7DA" }, + { "name": "LearningTools", "unicode": "F7DB" }, { "name": "Dataflows", "unicode": "F7DD" }, - { "name": "GenericScanFilled", "unicode": "F7DE" }, + { "name": "ShowGrid", "unicode": "F7DE" }, { "name": "DiagnosticDataBarTooltip", "unicode": "F7DF" }, { "name": "SaveToMobile", "unicode": "F7E0" }, { "name": "Orientation2", "unicode": "F7E1" }, { "name": "ScreenCast", "unicode": "F7E2" }, - { "name": "ShowGrid", "unicode": "F7E3" }, + { "name": "GenericScanFilled", "unicode": "F7E3" }, { "name": "SnapToGrid", "unicode": "F7E4" }, { "name": "ContactList", "unicode": "F7E5" }, { "name": "NewMail", "unicode": "F7EA" }, @@ -1724,6 +1821,7 @@ { "name": "TabOneColumn", "unicode": "F849" }, { "name": "TabTwoColumn", "unicode": "F84A" }, { "name": "TabThreeColumn", "unicode": "F84B" }, + { "name": "BulletedTreeList", "unicode": "F84C" }, { "name": "MicrosoftTranslatorLogoGreen", "unicode": "F852" }, { "name": "MicrosoftTranslatorLogoBlue", "unicode": "F853" }, { "name": "InternalInvestigation", "unicode": "F854" }, @@ -1737,6 +1835,7 @@ { "name": "ReportLock", "unicode": "F875" }, { "name": "Uneditable2", "unicode": "F876" }, { "name": "Uneditable2Mirrored", "unicode": "F877" }, + { "name": "Spelling", "unicode": "F87B" }, { "name": "BarChartVerticalEdit", "unicode": "F89D" }, { "name": "GlobalNavButtonActive", "unicode": "F89F" }, { "name": "PollResults", "unicode": "F8A0" }, @@ -1745,6 +1844,8 @@ { "name": "QandAMirror", "unicode": "F8A3" }, { "name": "BookAnswers", "unicode": "F8A4" }, { "name": "AlertSettings", "unicode": "F8B6" }, + { "name": "TrimStart", "unicode": "F8BB" }, + { "name": "TrimEnd", "unicode": "F8BC" }, { "name": "TableComputed", "unicode": "F8F5" }, { "name": "DecreaseIndentLegacy", "unicode": "E290" }, { "name": "IncreaseIndentLegacy", "unicode": "E291" }, diff --git a/src/settings-web/src/icons/src/fabric-icons.ts b/src/settings-web/src/icons/src/fabric-icons.ts index 6416e5928..7a609cd4a 100644 --- a/src/settings-web/src/icons/src/fabric-icons.ts +++ b/src/settings-web/src/icons/src/fabric-icons.ts @@ -1,3 +1,4 @@ + // Your use of the content in the files referenced here is subject to the terms of the license at https://aka.ms/fabric-assets-license // tslint:disable:max-line-length @@ -23,7 +24,7 @@ export function initializeIcons( fontFace: { fontFamily: `"FabricMDL2Icons"`, // Inline Data, taken from ../css/fabric-icons-inline.css - src: `url('data:application/octet-stream;base64,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') format('truetype');` + src: `url('data:application/octet-stream;base64,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') format('truetype');` }, icons: { 'GlobalNavButton': '\uE700', @@ -41,7 +42,8 @@ export function initializeIcons( 'ChevronDownMed': '\uE972', 'ChevronLeftMed': '\uE973', 'ChevronRightMed': '\uE974', - 'CircleRing': '\uEA3A' + 'CircleRing': '\uEA3A', + 'FabricReportLibrary': '\uF0A1', } }; diff --git a/src/settings-web/src/icons/src/iconAliases.ts b/src/settings-web/src/icons/src/iconAliases.ts index 9e211daba..966e858a5 100644 --- a/src/settings-web/src/icons/src/iconAliases.ts +++ b/src/settings-web/src/icons/src/iconAliases.ts @@ -8,6 +8,10 @@ export const registerIconAliases = () => { registerIconAlias('twelvepointstar', '12pointstar'); registerIconAlias('toggleon', 'toggleleft'); registerIconAlias('toggleoff', 'toggleright'); + registerIconAlias('edgelogo', 'edgeoldlogo'); + registerIconAlias('powerappscds', 'commondataservicecds'); + registerIconAlias('d365talenthrcore', 'd365corehr'); + registerIconAlias('crmcustomerinsightsapp', 'insights'); } export default registerIconAliases; diff --git a/src/settings-web/src/setup_icons.tsx b/src/settings-web/src/setup_icons.tsx index 8f25b7905..148bf8cac 100644 --- a/src/settings-web/src/setup_icons.tsx +++ b/src/settings-web/src/setup_icons.tsx @@ -1,5 +1,6 @@ import React from 'react'; import {registerIcons} from 'office-ui-fabric-react'; +import {Icon} from 'office-ui-fabric-react/lib/Icon'; import {initializeIcons} from './icons/src'; // Import SVG files for the icons here. @@ -15,6 +16,7 @@ export function setup_powertoys_icons(): void { 'pt-fancy-zones': ( ), 'pt-power-rename': ( ), 'pt-shortcut-guide': ( ), + 'pt-power-preview': ( ), } }); } diff --git a/src/settings/settings-html/dist/bundle.js b/src/settings/settings-html/dist/bundle.js index 43aa2c7ec..b4259a894 100644 --- a/src/settings/settings-html/dist/bundle.js +++ b/src/settings/settings-html/dist/bundle.js @@ -1,9 +1,9 @@ -!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=34)}([function(e,t,n){"use strict";e.exports=n(25)},,,,,,,function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}(),e.exports=n(26)},,,,,function(e,t,n){"use strict";var o={},r=void 0;try{r=window}catch(e){}function i(e,t){if(void 0!==r){var n=r.__packages__=r.__packages__||{};if(!n[e]||!o[e])o[e]=t,(n[e]=n[e]||[]).push(t)}}n.d(t,"a",function(){return i}),i("@uifabric/set-version","6.0.0")},,,,function(e,t,n){"use strict"; +!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=35)}([function(e,t,n){"use strict";e.exports=n(26)},,,,,,,function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(e){console.error(e)}}}(),e.exports=n(27)},,,,,,,,,function(e,t,n){"use strict"; /* object-assign (c) Sindre Sorhus @license MIT -*/var o=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var o={};return"abcdefghijklmnopqrst".split("").forEach(function(e){o[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},o)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,l=a(e),u=1;u0&&p(t)})}function p(e,t){a.loadStyles?a.loadStyles(g(e).styleString,e):n?function(e,t){if("undefined"==typeof document)return;var n=document.getElementsByTagName("head")[0],o=a.registeredStyles,r=a.lastStyleElement,i=r?r.styleSheet:void 0,s=i?i.cssText:"",u=o[o.length-1],c=g(e).styleString;(!r||s.length+c.length>l)&&((r=document.createElement("style")).type="text/css",t?(n.replaceChild(r,t.styleElement),t.styleElement=r):n.appendChild(r),t||(u={styleElement:r,themableStyle:e},o.push(u)));r.styleSheet.cssText+=m(c),Array.prototype.push.apply(u.themableStyle,e),a.lastStyleElement=r}(e,t):function(e){if("undefined"==typeof document)return;var t=document.getElementsByTagName("head")[0],n=document.createElement("style"),o=g(e),r=o.styleString,s=o.themable;n.type="text/css",i&&n.setAttribute("nonce",i);n.appendChild(document.createTextNode(r)),a.perf.count++,t.appendChild(n);var l={styleElement:n,themableStyle:e};s?a.registeredThemableStyles.push(l):a.registeredStyles.push(l)}(e)}function f(e){void 0===e&&(e=3),3!==e&&2!==e||(h(a.registeredStyles),a.registeredStyles=[]),3!==e&&1!==e||(h(a.registeredThemableStyles),a.registeredThemableStyles=[])}function h(e){e.forEach(function(e){var t=e&&e.styleElement;t&&t.parentElement&&t.parentElement.removeChild(t)})}function m(e){return e&&(e=g(v(e)).styleString),e}function g(e){var t=a.theme,n=!1;return{styleString:(e||[]).map(function(e){var o=e.theme;if(o){n=!0;var r=t?t[o]:void 0,i=e.defaultValue||"inherit";return!t||r||!console||o in t||"undefined"==typeof DEBUG||!DEBUG||console.warn('Theming value not provided for "'+o+'". Falling back to "'+i+'".'),r||i}return e.rawString}).join(""),themable:n}}function v(e){var t=[];if(e){for(var n=0,o=void 0;o=s.exec(e);){var r=o.index;r>n&&t.push({rawString:e.substring(n,r)}),t.push({theme:o[1],defaultValue:o[2]}),n=s.lastIndex}t.push({rawString:e.substring(n)})}return t}t.loadStyles=function(e,t){void 0===t&&(t=!1),c(function(){var o=Array.isArray(e)?e:v(e);void 0===n&&(n=function(){var e=!1;if("undefined"!=typeof document){var t=document.createElement("style");t.type="text/css",e=!!t.styleSheet}return e}());var r=a.runState,i=r.mode,s=r.buffer,l=r.flushTimer;t||1===i?(s.push(o),l||(a.runState.flushTimer=setTimeout(function(){a.runState.flushTimer=0,d()},0))):p(o)})},t.configureLoadStyles=function(e){a.loadStyles=e},t.configureRunMode=function(e){a.runState.mode=e},t.flush=d,t.loadTheme=function(e){a.theme=e,function(){if(a.theme){for(var e=[],t=0,n=a.registeredThemableStyles;t0&&(f(1),p([].concat.apply([],e)))}}()},t.clearStyles=f,t.detokenize=m,t.splitStyles=v}).call(this,n(17))},,,,,,,function(e,t,n){"use strict"; +*/var o=Object.getOwnPropertySymbols,r=Object.prototype.hasOwnProperty,i=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var o={};return"abcdefghijklmnopqrst".split("").forEach((function(e){o[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},o)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,l=a(e),u=1;u0&&(!function(e){void 0===e&&(e=3);3!==e&&2!==e||(u(a.registeredStyles),a.registeredStyles=[]);3!==e&&1!==e||(u(a.registeredThemableStyles),a.registeredThemableStyles=[])}(1),s([].concat.apply([],e)))}}()}function u(e){e.forEach((function(e){var t=e&&e.styleElement;t&&t.parentElement&&t.parentElement.removeChild(t)}))}function c(e){var t=a.theme,n=!1;return{styleString:(e||[]).map((function(e){var o=e.theme;if(o){n=!0;var r=t?t[o]:void 0,i=e.defaultValue||"inherit";return!t||r||!console||o in t||"undefined"==typeof DEBUG||!DEBUG||console.warn('Theming value not provided for "'+o+'". Falling back to "'+i+'".'),r||i}return e.rawString})).join(""),themable:n}}}).call(this,n(17))},,,,,,,,function(e,t,n){"use strict"; /** @license React v16.8.6 * react.production.min.js * @@ -11,7 +11,7 @@ object-assign * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var o=n(16),r="function"==typeof Symbol&&Symbol.for,i=r?Symbol.for("react.element"):60103,a=r?Symbol.for("react.portal"):60106,s=r?Symbol.for("react.fragment"):60107,l=r?Symbol.for("react.strict_mode"):60108,u=r?Symbol.for("react.profiler"):60114,c=r?Symbol.for("react.provider"):60109,d=r?Symbol.for("react.context"):60110,p=r?Symbol.for("react.concurrent_mode"):60111,f=r?Symbol.for("react.forward_ref"):60112,h=r?Symbol.for("react.suspense"):60113,m=r?Symbol.for("react.memo"):60115,g=r?Symbol.for("react.lazy"):60116,v="function"==typeof Symbol&&Symbol.iterator;function y(e){for(var t=arguments.length-1,n="https://reactjs.org/docs/error-decoder.html?invariant="+e,o=0;oN.length&&N.push(e)}function F(e,t,n){return null==e?0:function e(t,n,o,r){var s=typeof t;"undefined"!==s&&"boolean"!==s||(t=null);var l=!1;if(null===t)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(t.$$typeof){case i:case a:l=!0}}if(l)return o(r,t,""===n?"."+O(t,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(t))for(var u=0;uD.length&&D.push(e)}function F(e,t,n){return null==e?0:function e(t,n,o,r){var s=typeof t;"undefined"!==s&&"boolean"!==s||(t=null);var l=!1;if(null===t)l=!0;else switch(s){case"string":case"number":l=!0;break;case"object":switch(t.$$typeof){case i:case a:l=!0}}if(l)return o(r,t,""===n?"."+O(t,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(t))for(var u=0;uthis.eventPool.length&&this.eventPool.push(e)}function de(e){e.eventPool=[],e.getPooled=ue,e.release=ce}r(le.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=ae)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=ae)},persist:function(){this.isPersistent=ae},isPersistent:se,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=se,this._dispatchInstances=this._dispatchListeners=null}}),le.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},le.extend=function(e){function t(){}function n(){return o.apply(this,arguments)}var o=this;t.prototype=o.prototype;var i=new t;return r(i,n.prototype),n.prototype=i,n.prototype.constructor=n,n.Interface=r({},o.Interface,e),n.extend=o.extend,de(n),n},de(le);var pe=le.extend({data:null}),fe=le.extend({data:null}),he=[9,13,27,32],me=V&&"CompositionEvent"in window,ge=null;V&&"documentMode"in document&&(ge=document.documentMode);var ve=V&&"TextEvent"in window&&!ge,ye=V&&(!me||ge&&8=ge),be=String.fromCharCode(32),_e={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},ke=!1;function xe(e,t){switch(e){case"keyup":return-1!==he.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"blur":return!0;default:return!1}}function Ce(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var we=!1;var Se={eventTypes:_e,extractEvents:function(e,t,n,o){var r=void 0,i=void 0;if(me)e:{switch(e){case"compositionstart":r=_e.compositionStart;break e;case"compositionend":r=_e.compositionEnd;break e;case"compositionupdate":r=_e.compositionUpdate;break e}r=void 0}else we?xe(e,n)&&(r=_e.compositionEnd):"keydown"===e&&229===n.keyCode&&(r=_e.compositionStart);return r?(ye&&"ko"!==n.locale&&(we||r!==_e.compositionStart?r===_e.compositionEnd&&we&&(i=ie()):(oe="value"in(ne=o)?ne.value:ne.textContent,we=!0)),r=pe.getPooled(r,t,n,o),i?r.data=i:null!==(i=Ce(n))&&(r.data=i),j(r),i=r):i=null,(e=ve?function(e,t){switch(e){case"compositionend":return Ce(t);case"keypress":return 32!==t.which?null:(ke=!0,be);case"textInput":return(e=t.data)===be&&ke?null:e;default:return null}}(e,n):function(e,t){if(we)return"compositionend"===e||!me&&xe(e,t)?(e=ie(),re=oe=ne=null,we=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1