From 34e4e7e5bd977149f0e324caa6a59e84c02b2fe3 Mon Sep 17 00:00:00 2001 From: Heiko <61519853+htcfreek@users.noreply.github.com> Date: Thu, 17 Mar 2022 20:33:05 +0100 Subject: [PATCH] [PT Run] TimeDate plugin (#16662) * create plugin * Update plugin code * fix deps * last changes * unix * new results and small changes * Update settings name * make spellcheck happy * new time/date formats * add comment * code cleanup, installer, signing pipeline * fix unix result * UnitTests * spell fix * Update tests, Timestamp query feature * new formats * last changes * last changes * unit tests and fixes * cjhanges and fixes * fix installer * fix settings class init * context menu * fix tests * add settings tests * update/fix DateTimeResult tests * small improvements * update pipeline * enable analyzer * fixes and improvements * spell fix * dev docs * doc fixes * spell fix * last changes * changes and fixes * fixes and test updates * improvements * last changes * try to fix tests * remove obsolete code * add info to test log * fix search * tag fix * tests * change tests * update dev docs * fix spelling * fix culture for ui strings * improvements based on feedback * improve global search * improve text * docs improvement * add settings note * fix and update tests * fix spelling --- .github/actions/spell-check/expect.txt | 4 + .pipelines/ESRPSigning_core.json | 1 + .../ci/templates/build-powertoys-steps.yml | 3 +- PowerToys.sln | 23 +- .../modules/launcher/plugins/timedate.md | 148 +++++ doc/devdocs/modules/launcher/readme.md | 1 + doc/images/launcher/plugins/timedate.png | Bin 0 -> 73336 bytes doc/images/launcher/plugins/timedate2.png | Bin 0 -> 95280 bytes installer/PowerToysSetup/Product.wxs | 30 +- src/codeAnalysis/GlobalSuppressions.cs | 4 + .../ImageTests.cs | 131 +++++ ...rToys.Run.Plugin.TimeDate.UnitTests.csproj | 46 ++ .../PluginSettingsTests.cs | 63 +++ .../QueryTests.cs | 243 ++++++++ .../StringParserTests.cs | 60 ++ .../TimeDateResultTests.cs | 313 +++++++++++ .../Components/AvailableResult.cs | 55 ++ .../Components/AvailableResultsList.cs | 267 +++++++++ .../Components/ResultHelper.cs | 92 +++ .../Components/SearchController.cs | 182 ++++++ .../Components/TimeAndDateHelper.cs | 129 +++++ .../Components/TimeDateSettings.cs | 154 +++++ .../Images/Warning.dark.png | Bin 0 -> 566 bytes .../Images/Warning.light.png | Bin 0 -> 580 bytes .../Images/calendar.dark.png | Bin 0 -> 7718 bytes .../Images/calendar.light.png | Bin 0 -> 7910 bytes .../Images/time.dark.png | Bin 0 -> 8394 bytes .../Images/time.light.png | Bin 0 -> 8550 bytes .../Images/timeDate.dark.png | Bin 0 -> 8499 bytes .../Images/timeDate.light.png | Bin 0 -> 8951 bytes .../Main.cs | 115 ++++ ...osoft.PowerToys.Run.Plugin.TimeDate.csproj | 128 +++++ .../Properties/Resources.Designer.cs | 532 ++++++++++++++++++ .../Properties/Resources.resx | 294 ++++++++++ .../plugin.json | 13 + .../Wox.Infrastructure/StringMatcher.cs | 1 + 36 files changed, 3028 insertions(+), 4 deletions(-) create mode 100644 doc/devdocs/modules/launcher/plugins/timedate.md create mode 100644 doc/images/launcher/plugins/timedate.png create mode 100644 doc/images/launcher/plugins/timedate2.png create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/ImageTests.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests.csproj create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/PluginSettingsTests.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/QueryTests.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/StringParserTests.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeDateResultTests.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResult.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/ResultHelper.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/SearchController.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeAndDateHelper.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeDateSettings.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/Warning.dark.png create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/Warning.light.png create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/calendar.dark.png create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/calendar.light.png create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/time.dark.png create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/time.light.png create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/timeDate.dark.png create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/timeDate.light.png create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Main.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Microsoft.PowerToys.Run.Plugin.TimeDate.csproj create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.Designer.cs create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.resx create mode 100644 src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/plugin.json diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt index 6ec373861c..bfffbbe886 100644 --- a/.github/actions/spell-check/expect.txt +++ b/.github/actions/spell-check/expect.txt @@ -373,6 +373,7 @@ DARKYELLOW datareader Datavalue DATAW +David davidegiacometti Dayof Dbg @@ -1214,6 +1215,7 @@ MONITORINFOEXW monitorinfof Monthand Moq +Morton MOUSEACTIVATE MOUSEHWHEEL MOUSEINPUT @@ -1925,6 +1927,7 @@ subquery substr Sul Superbar +supressions Suri sut SVE @@ -1992,6 +1995,7 @@ testzones TEXCOORD textblock TEXTINCLUDE +THH THICKFRAME THISCOMPONENT THotkey diff --git a/.pipelines/ESRPSigning_core.json b/.pipelines/ESRPSigning_core.json index f4f9ddb5f2..37eda37735 100644 --- a/.pipelines/ESRPSigning_core.json +++ b/.pipelines/ESRPSigning_core.json @@ -94,6 +94,7 @@ "modules\\launcher\\Plugins\\VSCodeWorkspaces\\Community.PowerToys.Run.Plugin.VSCodeWorkspaces.dll", "modules\\launcher\\Plugins\\Service\\Microsoft.PowerToys.Run.Plugin.Service.dll", "modules\\launcher\\Plugins\\System\\Microsoft.PowerToys.Run.Plugin.System.dll", + "modules\\launcher\\Plugins\\TimeDate\\Microsoft.PowerToys.Run.Plugin.TimeDate.dll", "modules\\launcher\\Plugins\\TimeZone\\Microsoft.PowerToys.Run.Plugin.TimeZone.dll", "modules\\launcher\\Plugins\\WebSearch\\Community.PowerToys.Run.Plugin.WebSearch.dll", "modules\\launcher\\Plugins\\WindowsTerminal\\Microsoft.PowerToys.Run.Plugin.WindowsTerminal.dll", diff --git a/.pipelines/ci/templates/build-powertoys-steps.yml b/.pipelines/ci/templates/build-powertoys-steps.yml index 3c9d828741..78f216a6ab 100644 --- a/.pipelines/ci/templates/build-powertoys-steps.yml +++ b/.pipelines/ci/templates/build-powertoys-steps.yml @@ -130,7 +130,8 @@ steps: **\Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest.dll **\Microsoft.Plugin.Uri.UnitTests.dll **\Wox.Test.dll - **\Microsoft.PowerToys.Run.Plugin.System.UnitTests.dll + **\Microsoft.PowerToys.Run.Plugin.System.UnitTests.dll + **\Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests.dll **\Microsoft.Plugin.WindowsTerminal.UnitTests.dll **\Microsoft.Plugin.WindowWalker.UnitTests.dll !**\obj\** diff --git a/PowerToys.sln b/PowerToys.sln index b19e84e078..f56d438622 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -136,6 +136,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PowerLauncher", "src\module {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} = {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0} {0351ADA4-0C32-4652-9BA0-41F7B602372B} = {0351ADA4-0C32-4652-9BA0-41F7B602372B} {787B8AA6-CA93-4C84-96FE-DF31110AD1C4} = {787B8AA6-CA93-4C84-96FE-DF31110AD1C4} + {F44934A8-36F3-49B0-9465-3831BE041CDE} = {F44934A8-36F3-49B0-9465-3831BE041CDE} + {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF} = {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF} {5043CECE-E6A7-4867-9CBE-02D27D83747A} = {5043CECE-E6A7-4867-9CBE-02D27D83747A} {F8B870EB-D5F5-45BA-9CF7-A5C459818820} = {F8B870EB-D5F5-45BA-9CF7-A5C459818820} {74F1B9ED-F59C-4FE7-B473-7B453E30837E} = {74F1B9ED-F59C-4FE7-B473-7B453E30837E} @@ -399,6 +401,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonacoPreviewHandler", "src EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plugin.TimeZone", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.TimeZone\Microsoft.PowerToys.Run.Plugin.TimeZone.csproj", "{F44934A8-36F3-49B0-9465-3831BE041CDE}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plugin.TimeDate", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.TimeDate\Microsoft.PowerToys.Run.Plugin.TimeDate.csproj", "{5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests\Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests.csproj", "{FD464B4C-2F68-4D06-91E7-4208146C41F5}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Plugin.WindowWalker.UnitTests", "src\modules\launcher\Plugins\Microsoft.Plugin.WindowWalker.UnitTests\Microsoft.Plugin.WindowWalker.UnitTests.csproj", "{8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}" EndProject Global @@ -1087,11 +1092,25 @@ Global {F44934A8-36F3-49B0-9465-3831BE041CDE}.Debug|x64.ActiveCfg = Debug|x64 {F44934A8-36F3-49B0-9465-3831BE041CDE}.Debug|x64.Build.0 = Debug|x64 {F44934A8-36F3-49B0-9465-3831BE041CDE}.Debug|x86.ActiveCfg = Debug|x64 - {F44934A8-36F3-49B0-9465-3831BE041CDE}.Debug|x86.Build.0 = Debug|x64 {F44934A8-36F3-49B0-9465-3831BE041CDE}.Release|x64.ActiveCfg = Release|x64 {F44934A8-36F3-49B0-9465-3831BE041CDE}.Release|x64.Build.0 = Release|x64 {F44934A8-36F3-49B0-9465-3831BE041CDE}.Release|x86.ActiveCfg = Release|x64 {F44934A8-36F3-49B0-9465-3831BE041CDE}.Release|x86.Build.0 = Release|x64 + {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Debug|x64.ActiveCfg = Debug|x64 + {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Debug|x64.Build.0 = Debug|x64 + {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Debug|x86.ActiveCfg = Debug|x64 + {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Release|x64.ActiveCfg = Release|x64 + {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Release|x64.Build.0 = Release|x64 + {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Release|x86.ActiveCfg = Release|x64 + {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Release|x86.Build.0 = Release|x64 + {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Debug|x64.ActiveCfg = Debug|x64 + {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Debug|x64.Build.0 = Debug|x64 + {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Debug|x86.ActiveCfg = Debug|x64 + {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Debug|x86.Build.0 = Debug|x64 + {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Release|x64.ActiveCfg = Release|x64 + {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Release|x64.Build.0 = Release|x64 + {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Release|x86.ActiveCfg = Release|x64 + {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Release|x86.Build.0 = Release|x64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Debug|x64.ActiveCfg = Debug|x64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Debug|x64.Build.0 = Debug|x64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Debug|x86.ActiveCfg = Debug|x64 @@ -1232,6 +1251,8 @@ Global {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC} = {2F305555-C296-497E-AC20-5FA1B237996A} {04B193D7-3E21-46B8-A958-89B63A8A69DE} = {2F305555-C296-497E-AC20-5FA1B237996A} {F44934A8-36F3-49B0-9465-3831BE041CDE} = {4AFC9975-2456-4C70-94A4-84073C1CED93} + {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF} = {4AFC9975-2456-4C70-94A4-84073C1CED93} + {FD464B4C-2F68-4D06-91E7-4208146C41F5} = {4AFC9975-2456-4C70-94A4-84073C1CED93} {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1} = {4AFC9975-2456-4C70-94A4-84073C1CED93} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution diff --git a/doc/devdocs/modules/launcher/plugins/timedate.md b/doc/devdocs/modules/launcher/plugins/timedate.md new file mode 100644 index 0000000000..4103beeaca --- /dev/null +++ b/doc/devdocs/modules/launcher/plugins/timedate.md @@ -0,0 +1,148 @@ +# 'Time and Date' plugin +The 'Time and Date' plugin shows the date and time in different formats. For the date and time formats the plugin uses the culture setting in Windows, if the format is not commonly defined. The user can search for the system date/time or a custom date/time. The value of each result can be copied to clipboard. + +**Query examples:** +- Format: `time` +- Date/time: `10:30 AM` +- Format and date/time: `Week number::10/10/2022` + +!['Time and Date' plugin](/doc/images/launcher/plugins/timedate.png) + +![Search for a date in a specified format](/doc/images/launcher/plugins/timedate2.png) + + +## Formats + +### Available formats + +**Remarks** +- The following formats requires a prefix in the query: + - Unix Timestamp: `u` + - Windows file time: `ft` +- On invalid number inputs we show a warning that tells the user which prefixes are allowed/required. + +**List of available formats** + +The following formats are currently available: + +| Format | Example (Based on default settings) | As result | As input | +|--------------|-----------|------------|------------| +| Time | 5:10 PM | x | x | +| Date | 3/5/2022 | x | x | +| Now | 3/5/2022 5:10 PM | x | x | +| Time UTC | 4:10 PM | x | x | +| Now UTC | 3/5/2022 4:10 PM | x | x | +| Unix Timestamp | 1646496622 | x | x | +| Hour | 10 | x | | +| Minute | 30 | x | | +| Second | 45 | x | | +| Millisecond | 678 | x | | +| Day (Week day) | Saturday | x | | +| Day of the week | 6 | x | | +| Day of the month | 5 | x | | +| Day of the year | 64 | x | | +| Week of the month | 1 | x | | +| Week of the year (Calendar week, Week number) | 10 | x | | +| Month | March | x | | +| Month of the year | 3 | x | | +| Month and day | March 7 | x | x | +| Year | 2022 | x | | +| Era | AD | x | | +| Era abbreviation | A | x | | +| Month and year | March 2022 | x | x | +| Windows file time (Int64 number) | 637820976123938199 | x | x | +| Universal time format: YYYY-MM-DD hh:mm:ss| 2022-03-05 16:20:12Z | x | x | +| ISO 8601 | 2022-03-05T17:23:04 | x | x | +| ISO 8601 UTC | 2022-03-05T16:23:04 | x | x | +| ISO 8601 with time zone | 2022-03-05T17:23:04+01:00 | x | x | +| ISO 8601 UTC with time zone | 2022-03-05T16:23:04Z | x | x | +| RFC1123 | Sat, 05 Mar 2022 16:23:04 GMT | x | x | + +### Add new formats +- To add a new formats you have to add them to the method `GetList()` of the [`AvailableResultsList`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs) class. + - Please add the new formats in the second range. The first one is reserved for the three main formats (Time, Date, Now). +- After adding the new formats you have to update the Unit Tests! + + +## Optional plugin settings +- The optional plugin settings are implemented via the [`ISettingProvider`](/src/modules/launcher/Wox.Plugin/ISettingProvider.cs) interface from `Wox.Plugin` project. +- All available settings for the plugin are defined in the [`TimeDateSettings`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeDateSettings.cs) class of the plugin. The settings can be accessed everywhere in the plugin code via the static class instance `TimeDateSettings.Instance`. +- We have the following settings that the user can configure to change the behavior of the plugin: + + | Key | Default value | Name/Description | + |--------------|-----------|------------| + | `OnlyDateTimeNowGlobal` | `true` | Show only 'Time', 'Date', and 'Now' result on global queries | + | `TimeWithSeconds` | `false` | Show time with seconds (Applies to 'Time' and 'Now' result) | + | `DateWithWeekday` | `false` | Show date with weekday and name of month (Applies to 'Date' and 'Now' result) | + | `HideNumberMessageOnGlobalQuery` | `false` | Hide 'Invalid number input' error message on global queries | + + +## Classes + +### [`AvailableResult.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResult.cs) +- Each instance of the [`AvailableResult`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResult.cs) class represents a time/date result/format that the user can search for. +- The results/formats are defined in the `AvailableResultsList` class. + +### [`AvailableResultsList.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs) +- The [`AvailableResultsList`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs) class contains the list of available formats/results in its method `GetList()`. + +### [`ResultHelper.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/ResultHelper.cs) +- The [`ResultHelper`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/ResultHelper.cs) class contains methods for some of the result features (tool tip, copy to clipboard) and the error result on incorrect number input. +- And it contains the `SelectStringFromResources()` method for getting the resource strings based on the user input. + - The method has a parameter for the `stringId` which is the name of the string in the resource file. By default the word `Now` is automatically added at the end to get the string for a system time/date search. + - If a different/custom string is needed for a system time/date search the parameter `stringIdNow` can be used to override the default behavior of the method. + - If only a string for the system time/date search is required, you can set `stringId` to `string.Empty` and only `stringIdNow` to a valid string id. + +### [`TimeAndDateHelper.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeAndDateHelper.cs) +- The [`TimeAndDateHelper`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeAndDateHelper.cs) class contains methods to format/convert date and time formats/strings. + +### [`TimeDateSettings.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeDateSettings.cs) +- The [`TimeDateSettings`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeDateSettings.cs) class provides access to all optional plugin settings. +- The class has a static property called `Instance` that holds an instance of the class itself. This allows us to access the settings from everywhere in the plugin code without having additional parameters in our methods. + +### [`SearchController.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/SearchController.cs) +- The [`SearchController`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/SearchController.cs) encapsulates the methods needed to search and find matches. + + +## Search + +### Tags +- We compare the user input with the label of each results. If it doesn't match we search the tags of the result too. +- For each result two tag strings are defined. One for a search with system time/date and one for a search with a custom time/date. Most of the results (except the era results) are using one of the generic tag lists: Date, Time or Format +- The selection of the tag (for "system time/date" or "custom time/date") is happening at search time in the `AvailableResultsList.cs` class. +- The different tags in a list are split by the `;` character. + +### Score +- The plugin uses `FuzzyMatching` to get the matching formats, if the user searches for a specific format. The score is set based on the `FuzzySearch` result. +- To achieve a better balance between sub title matches and tag matches the score of tag matches is divided by two. + +### Match requirements for global queries +On global queries the high score returned by `FuzzySearch` has negative impacts on the user experience and the search results priority/order of other plugins. To mitigate this we defined some matching requirements: +- If the query is a word of the following conjunction list, we don't return any results: for, and, nor, but, or, so + - We don't have 'yet' (synonym of 'now') on the list, because this could block results in some languages. +- The first word of the query has to be a full match with a word in the label or tag list. +- For both requirements we compare case-insensitive. + + +## [Unit Tests](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests) +We have a [Unit Test project](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests) that executes various test to ensure that the plugin works as expected. + +### [`TimeDateResultTests.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeDateResultTests.cs) +- The [`TimeDateResultTests.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeDateResultTests.cs) class contains tests to validate that the time and date values are correctly formatted/calculated. +- That we can execute the tests at any time on any machine, we use a specified date/time value and set the thread culture always to `en-us` while executing the tests. +- Some tests contain checks that calculate the expected result at runtime instead of using an expected value written fix in the code. This is done to get valid results on every machine at any time. + +### [`ImageTests.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/ImageTests.cs) +- The [`ImageTests.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/ImageTests.cs) class contains tests to validate that each result shows the expected and correct image. +- That we can execute the tests at any time on any machine, we set the thread culture always to `en-us` while executing the tests. + +### [`PluginSettingsTests.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/PluginSettingsTests.cs) +- The [`PluginSettingsTests.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/PluginSettingsTests.cs) class contains tests to validate that all settings exist and that they have the correct default values. + +### [`QueryTests.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/QueryTests.cs) +- The [`QueryTests.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/QueryTests.cs) class contains tests to validate that the user gets the correct results when searching., +- That we can execute the tests at any time on any machine, we set the thread culture always to `en-us` while executing the tests. + +### [`StringParserTests.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/StringParserTests.cs) +- The [`StringParserTests.cs`](/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/StringParserTests.cs) class contains tests to validate that the typed string gets converted correctly into a `DateTime` object. +- That we can execute the tests at any time on any machine, we set the thread culture always to `en-us` while executing the tests. \ No newline at end of file diff --git a/doc/devdocs/modules/launcher/readme.md b/doc/devdocs/modules/launcher/readme.md index 6d22cc6ed9..b217507ba5 100644 --- a/doc/devdocs/modules/launcher/readme.md +++ b/doc/devdocs/modules/launcher/readme.md @@ -11,6 +11,7 @@ - [Program](/doc/devdocs/modules/launcher/plugins/program.md) - [Registry](/doc/devdocs/modules/launcher/plugins/registry.md) - [Shell](/doc/devdocs/modules/launcher/plugins/shell.md) + - [Time and Date](/doc/devdocs/modules/launcher/plugins/timedate.md) - [Windows System Commands](/doc/devdocs/modules/launcher/plugins/system.md) - [Uri](/doc/devdocs/modules/launcher/plugins/uri.md) - [Window Walker](/doc/devdocs/modules/launcher/plugins/windowwalker.md) diff --git a/doc/images/launcher/plugins/timedate.png b/doc/images/launcher/plugins/timedate.png new file mode 100644 index 0000000000000000000000000000000000000000..41fa86b3698022e1bda977281cb16a2b8760a5af GIT binary patch literal 73336 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

Hj^(|zIm2+zQx6+E%fu5|BWWv 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 Hu0mjfs{Wtl literal 0 HcmV?d00001 diff --git a/doc/images/launcher/plugins/timedate2.png b/doc/images/launcher/plugins/timedate2.png new file mode 100644 index 0000000000000000000000000000000000000000..251f4cd9d6f8acdda410bf526e24d66191005c8f GIT binary patch literal 95280 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 literal 0 HcmV?d00001 diff --git a/installer/PowerToysSetup/Product.wxs b/installer/PowerToysSetup/Product.wxs index 24adac58a6..dac3cda854 100644 --- a/installer/PowerToysSetup/Product.wxs +++ b/installer/PowerToysSetup/Product.wxs @@ -90,7 +90,11 @@ - + + + + + @@ -481,6 +485,10 @@ + + + + @@ -1094,7 +1102,7 @@ - + @@ -1367,6 +1375,12 @@ Guid="$(var.CompGUIDPrefix)17" Directory="Resource$(var.IdSafeLanguage)UnitConverterPluginFolder"> + + + @@ -1573,6 +1587,18 @@ + + + + + + + + + + + + diff --git a/src/codeAnalysis/GlobalSuppressions.cs b/src/codeAnalysis/GlobalSuppressions.cs index 5645159cb3..fc6291173c 100644 --- a/src/codeAnalysis/GlobalSuppressions.cs +++ b/src/codeAnalysis/GlobalSuppressions.cs @@ -49,6 +49,10 @@ using System.Diagnostics.CodeAnalysis; [assembly: SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Microsoft.Templates.Core.Locations.JunctionNativeMethods.ThrowLastWin32Error(System.String)", Scope = "member", Target = "Microsoft.Templates.Core.Locations.JunctionNativeMethods.#InternalGetTarget(Microsoft.Win32.SafeHandles.SafeFileHandle)", Justification = "Only used for local generation")] [assembly: SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "Microsoft.Templates.Core.Locations.JunctionNativeMethods.ThrowLastWin32Error(System.String)", Scope = "member", Target = "Microsoft.Templates.Core.Locations.JunctionNativeMethods.#OpenReparsePoint(System.String,Microsoft.Templates.Core.Locations.JunctionNativeMethods+EFileAccess)", Justification = "Only used for local generation")] [assembly: SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", MessageId = "System.Windows.Documents.InlineCollection.Add(System.String)", Scope = "member", Target = "Microsoft.Templates.UI.Extensions.TextBlockExtensions.#OnSequentialFlowStepChanged(System.Windows.DependencyObject,System.Windows.DependencyPropertyChangedEventArgs)", Justification = "No text here")] +[assembly: SuppressMessage("Globalization", "CA1309:Use ordinal string comparison", Justification = "The user's search term should be compared with culture based rules.", Scope = "type", Target = "~T:Microsoft.PowerToys.Run.Plugin.TimeDate.Components.SearchController")] // FxCop warning suppression for uninstantiated TestFixture classes [assembly: SuppressMessage("Microsoft.Performance", "CA1812: Avoid uninstantiated internal classes", Scope = "module", Justification = "CA1812 will be thrown for every file in the test project. This is mentioned here: dotnet/roslyn-analyzers#1830")] + +// Code quality +[assembly: SuppressMessage("CodeQuality", "IDE0076:Invalid global 'SuppressMessageAttribute'", Justification = "Affect predefined supressions.")] diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/ImageTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/ImageTests.cs new file mode 100644 index 0000000000..156bfd9541 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/ImageTests.cs @@ -0,0 +1,131 @@ +// 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.Globalization; +using System.Linq; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using Wox.Infrastructure; +using Wox.Plugin; + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests +{ + [TestClass] + public class ImageTests + { + private CultureInfo originalCulture; + private CultureInfo originalUiCulture; + + [TestInitialize] + public void Setup() + { + StringMatcher.Instance = new StringMatcher(); + + // Set culture to 'en-us' + originalCulture = CultureInfo.CurrentCulture; + CultureInfo.CurrentCulture = new CultureInfo("en-us"); + originalUiCulture = CultureInfo.CurrentUICulture; + CultureInfo.CurrentUICulture = new CultureInfo("en-us"); + } + + [DataTestMethod] + [DataRow("time", "Time -", "Images\\time.dark.png")] + [DataRow("time u", "Time UTC -", "Images\\time.dark.png")] + [DataRow("date", "Date -", "Images\\calendar.dark.png")] + [DataRow("now", "Now -", "Images\\timeDate.dark.png")] + [DataRow("now u", "Now UTC -", "Images\\timeDate.dark.png")] + [DataRow("unix", "Unix epoch time -", "Images\\timeDate.dark.png")] + [DataRow("hour", "Hour -", "Images\\time.dark.png")] + [DataRow("minute", "Minute -", "Images\\time.dark.png")] + [DataRow("second", "Second -", "Images\\time.dark.png")] + [DataRow("millisecond", "Millisecond -", "Images\\time.dark.png")] + [DataRow("file", "Windows file time (Int64 number) -", "Images\\timeDate.dark.png")] + [DataRow("day", "Day (Week day) -", "Images\\calendar.dark.png")] + [DataRow("day of week", "Day of the week (Week day) -", "Images\\calendar.dark.png")] + [DataRow("day of month", "Day of the month -", "Images\\calendar.dark.png")] + [DataRow("day of year", "Day of the year -", "Images\\calendar.dark.png")] + [DataRow("week of month", "Week of the month -", "Images\\calendar.dark.png")] + [DataRow("week of year", "Week of the year (Calendar week, Week number) -", "Images\\calendar.dark.png")] + [DataRow("month", "Month -", "Images\\calendar.dark.png")] + [DataRow("month of year", "Month of the year -", "Images\\calendar.dark.png")] + [DataRow("month and", "Month and day -", "Images\\calendar.dark.png")] + [DataRow("year", "Year -", "Images\\calendar.dark.png")] + [DataRow("era", "Era -", "Images\\calendar.dark.png")] + [DataRow("era abb", "Era abbreviation -", "Images\\calendar.dark.png")] + [DataRow("month and", "Month and year -", "Images\\calendar.dark.png")] + [DataRow("universal", "Universal time format: YYYY-MM-DD hh:mm:ss -", "Images\\timeDate.dark.png")] + [DataRow("iso", "ISO 8601 -", "Images\\timeDate.dark.png")] + [DataRow("iso utc", "ISO 8601 UTC - ", "Images\\timeDate.dark.png")] + [DataRow("iso zone", "ISO 8601 with time zone - ", "Images\\timeDate.dark.png")] + [DataRow("iso utc zone", "ISO 8601 UTC with time zone - ", "Images\\timeDate.dark.png")] + [DataRow("rfc", "RFC1123 -", "Images\\timeDate.dark.png")] + public void IconThemeDarkTest(string typedString, string subTitleMatch, string expectedResult) + { + // Setup + Mock

main = new (); + main.Object.IconTheme = "dark"; + Query expectedQuery = new ("(" + typedString, "("); + + // Act + string result = main.Object.Query(expectedQuery).FirstOrDefault(predicate: x => x.SubTitle.StartsWith(subTitleMatch, System.StringComparison.CurrentCulture)).IcoPath; + + // Assert + Assert.AreEqual(expectedResult, result); + } + + [DataTestMethod] + [DataRow("time", "Time -", "Images\\time.light.png")] + [DataRow("time u", "Time UTC -", "Images\\time.light.png")] + [DataRow("date", "Date -", "Images\\calendar.light.png")] + [DataRow("now", "Now -", "Images\\timeDate.light.png")] + [DataRow("now u", "Now UTC -", "Images\\timeDate.light.png")] + [DataRow("unix", "Unix epoch time -", "Images\\timeDate.light.png")] + [DataRow("hour", "Hour -", "Images\\time.light.png")] + [DataRow("minute", "Minute -", "Images\\time.light.png")] + [DataRow("second", "Second -", "Images\\time.light.png")] + [DataRow("millisecond", "Millisecond -", "Images\\time.light.png")] + [DataRow("file", "Windows file time (Int64 number) -", "Images\\timeDate.light.png")] + [DataRow("day", "Day (Week day) -", "Images\\calendar.light.png")] + [DataRow("day of week", "Day of the week (Week day) -", "Images\\calendar.light.png")] + [DataRow("day of month", "Day of the month -", "Images\\calendar.light.png")] + [DataRow("day of year", "Day of the year -", "Images\\calendar.light.png")] + [DataRow("week of month", "Week of the month -", "Images\\calendar.light.png")] + [DataRow("week of year", "Week of the year (Calendar week, Week number) -", "Images\\calendar.light.png")] + [DataRow("month", "Month -", "Images\\calendar.light.png")] + [DataRow("month of year", "Month of the year -", "Images\\calendar.light.png")] + [DataRow("month and", "Month and day -", "Images\\calendar.light.png")] + [DataRow("year", "Year -", "Images\\calendar.light.png")] + [DataRow("era", "Era -", "Images\\calendar.light.png")] + [DataRow("era abb", "Era abbreviation -", "Images\\calendar.light.png")] + [DataRow("Month and", "Month and year -", "Images\\calendar.light.png")] + [DataRow("universal", "Universal time format: YYYY-MM-DD hh:mm:ss -", "Images\\timeDate.light.png")] + [DataRow("iso", "ISO 8601 -", "Images\\timeDate.light.png")] + [DataRow("iso utc", "ISO 8601 UTC - ", "Images\\timeDate.light.png")] + [DataRow("iso zone", "ISO 8601 with time zone - ", "Images\\timeDate.light.png")] + [DataRow("iso utc zone", "ISO 8601 UTC with time zone - ", "Images\\timeDate.light.png")] + [DataRow("rfc", "RFC1123 -", "Images\\timeDate.light.png")] + public void IconThemeLightTest(string typedString, string subTitleMatch, string expectedResult) + { + // Setup + Mock
main = new (); + main.Object.IconTheme = "light"; + Query expectedQuery = new ("(" + typedString, "("); + + // Act + var result = main.Object.Query(expectedQuery).FirstOrDefault(x => x.SubTitle.StartsWith(subTitleMatch, System.StringComparison.CurrentCulture)).IcoPath; + + // Assert + Assert.AreEqual(expectedResult, result); + } + + [TestCleanup] + public void CleanUp() + { + // Set culture to original value + CultureInfo.CurrentCulture = originalCulture; + CultureInfo.CurrentUICulture = originalUiCulture; + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests.csproj b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests.csproj new file mode 100644 index 0000000000..1930fb1d31 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests.csproj @@ -0,0 +1,46 @@ + + + + net6.0-windows + false + x64 + Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests + true + true + Recommended + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + GlobalSuppressions.cs + + + StyleCop.json + + + + + 1.1.118 + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/PluginSettingsTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/PluginSettingsTests.cs new file mode 100644 index 0000000000..d87bf92f0a --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/PluginSettingsTests.cs @@ -0,0 +1,63 @@ +// 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.Reflection; +using Microsoft.PowerToys.Run.Plugin.TimeDate.Components; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests +{ + [TestClass] + public class PluginSettingsTests + { + [TestMethod] + public void SettingsCount() + { + // Setup + PropertyInfo[] settings = TimeDateSettings.Instance?.GetType()?.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance); + + // Act + var result = settings?.Length; + + // Assert + Assert.AreEqual(4, result); + } + + [DataTestMethod] + [DataRow("OnlyDateTimeNowGlobal")] + [DataRow("TimeWithSeconds")] + [DataRow("DateWithWeekday")] + [DataRow("HideNumberMessageOnGlobalQuery")] + public void DoesSettingExist(string name) + { + // Setup + Type settings = TimeDateSettings.Instance?.GetType(); + + // Act + var result = settings?.GetProperty(name, BindingFlags.NonPublic | BindingFlags.Instance); + + // Assert + Assert.IsNotNull(result); + } + + [DataTestMethod] + [DataRow("OnlyDateTimeNowGlobal", true)] + [DataRow("TimeWithSeconds", false)] + [DataRow("DateWithWeekday", false)] + [DataRow("HideNumberMessageOnGlobalQuery", false)] + public void DefaultValues(string name, bool valueExpected) + { + // Setup + TimeDateSettings setting = TimeDateSettings.Instance; + + // Act + PropertyInfo propertyInfo = setting?.GetType()?.GetProperty(name, BindingFlags.NonPublic | BindingFlags.Instance); + var result = propertyInfo?.GetValue(setting); + + // Assert + Assert.AreEqual(valueExpected, result); + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/QueryTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/QueryTests.cs new file mode 100644 index 0000000000..98606a638b --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/QueryTests.cs @@ -0,0 +1,243 @@ +// 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.Linq; +using System.Threading; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using Wox.Infrastructure; +using Wox.Plugin; + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests +{ + [TestClass] + public class QueryTests + { + private CultureInfo originalCulture; + private CultureInfo originalUiCulture; + + [TestInitialize] + public void Setup() + { + StringMatcher.Instance = new StringMatcher(); + + // Set culture to 'en-us' + originalCulture = CultureInfo.CurrentCulture; + CultureInfo.CurrentCulture = new CultureInfo("en-us"); + originalUiCulture = CultureInfo.CurrentUICulture; + CultureInfo.CurrentUICulture = new CultureInfo("en-us"); + } + + [DataTestMethod] + [DataRow("time", 2)] + [DataRow("date", 2)] + [DataRow("now", 3)] + [DataRow("current", 3)] + [DataRow("year", 0)] + [DataRow("", 0)] + [DataRow("time::10:10:10", 2)] + [DataRow("date::10/10/10", 2)] + public void CountWithoutPluginKeyword(string typedString, int expectedResultCount) + { + // Setup + Mock
main = new (); + Query expectedQuery = new (typedString); + + // Act + var result = main.Object.Query(expectedQuery).Count; + + // Assert + Assert.AreEqual(expectedResultCount, result, "Result depends on default plugin settings!"); + } + + [DataTestMethod] + [DataRow("(time", 16)] + [DataRow("(date", 24)] + [DataRow("(year", 7)] + [DataRow("(now", 30)] + [DataRow("(current", 30)] + [DataRow("(", 30)] + [DataRow("(now::10:10:10", 1)] // Windows file time + [DataRow("(current::10:10:10", 0)] + public void CountWithPluginKeyword(string typedString, int expectedResultCount) + { + // Setup + Mock
main = new (); + Query expectedQuery = new (typedString, "("); + + // Act + var result = main.Object.Query(expectedQuery); + + // Assert + Assert.AreEqual(expectedResultCount, result.Count, result.ToString()); + } + + [DataTestMethod] + [DataRow("time", 2)] // Match if first word is a full word match + [DataRow("ime", 0)] // Don't match if first word is not a full match + [DataRow("and", 0)] // Don't match for only conjunctions + [DataRow("and time", 1)] // match if term is conjunction and other words + [DataRow("date and time", 1)] // Match if first word is a full word match + [DataRow("ate and time", 0)] // Don't match if first word is not a full word match + public void ValidateBehaviorOnGlobalQueries(string typedString, int expectedResultCount) + { + // Setup + Mock
main = new (); + Query expectedQuery = new (typedString); + + // Act + var result = main.Object.Query(expectedQuery); + + // Assert + Assert.AreEqual(expectedResultCount, result.Count, result.ToString()); + } + + [DataTestMethod] + [DataRow("(time", "Time -")] + [DataRow("(time u", "Time UTC -")] + [DataRow("(date", "Date -")] + [DataRow("(now", "Now -")] + [DataRow("(now u", "Now UTC -")] + [DataRow("(unix", "Unix epoch time -")] + [DataRow("(file", "Windows file time (Int64 number) ")] + [DataRow("(hour", "Hour -")] + [DataRow("(minute", "Minute -")] + [DataRow("(second", "Second -")] + [DataRow("(millisecond", "Millisecond -")] + [DataRow("(day", "Day (Week day) -")] + [DataRow("(day of week", "Day of the week (Week day) -")] + [DataRow("(day of month", "Day of the month -")] + [DataRow("(day of year", "Day of the year -")] + [DataRow("(week of month", "Week of the month -")] + [DataRow("(week of year", "Week of the year (Calendar week, Week number) -")] + [DataRow("(month", "Month -")] + [DataRow("(month of year", "Month of the year -")] + [DataRow("(month and d", "Month and day -")] + [DataRow("(month and y", "Month and year -")] + [DataRow("(year", "Year -")] + [DataRow("(era", "Era -")] + [DataRow("(era a", "Era abbreviation -")] + [DataRow("(universal", "Universal time format: YYYY-MM-DD hh:mm:ss -")] + [DataRow("(iso", "ISO 8601 -")] + [DataRow("(iso utc", "ISO 8601 UTC -")] + [DataRow("(iso zone", "ISO 8601 with time zone - ")] + [DataRow("(iso utc zone", "ISO 8601 UTC with time zone -")] + [DataRow("(rfc", "RFC1123 -")] + [DataRow("(time::12:30", "Time -")] + [DataRow("(date::10.10.2022", "Date -")] + [DataRow("(time::u1646408119", "Time -")] + [DataRow("(time::ft637820085517321977", "Time -")] + [DataRow("(year", "Era -")] + [DataRow("(date", "Era -")] + [DataRow("(week day", "Day (Week day) -")] + [DataRow("(week day", "Day of the week (Week day) -")] + [DataRow("(cal week", "Week of the year (Calendar week, Week number) -")] + [DataRow("(week num", "Week of the year (Calendar week, Week number) -")] + public void CanFindFormatResult(string typedString, string expectedResult) + { + // Setup + Mock
main = new (); + Query expectedQuery = new (typedString, "("); + + // Act + var result = main.Object.Query(expectedQuery).FirstOrDefault(x => x.SubTitle.StartsWith(expectedResult, StringComparison.CurrentCulture)); + + // Assert + Assert.IsNotNull(result); + Assert.IsTrue(result?.Score >= 1, $"Score: {result?.Score}"); + } + + [DataTestMethod] + [DataRow("(12:30", "Time -")] + [DataRow("(10.10.2022", "Date -")] + [DataRow("(u1646408119", "Date and time -")] + [DataRow("(ft637820085517321977", "Date and time -")] + public void DateTimeNumberOnlyInput(string typedString, string expectedResult) + { + // Setup + Mock
main = new (); + Query expectedQuery = new (typedString, "("); + + // Act + var result = main.Object.Query(expectedQuery).FirstOrDefault(x => x.SubTitle.StartsWith(expectedResult, StringComparison.CurrentCulture)); + + // Assert + Assert.IsNotNull(result); + } + + // [DataRow("(::")] -> Behaves different to PT Run user interface + // [DataRow("(time::")] -> Behaves different to PT Run user interface + // [DataRow("(::time")] -> Behaves different to PT Run user interface + [DataTestMethod] + [DataRow("(abcdefg")] + [DataRow("(timmmmeeee")] + [DataRow("(10.10.20.aa.22")] + [DataRow("(12::55")] + [DataRow("(12:aa:55")] + [DataRow("(timtaaaetetaae::u1646408119")] + [DataRow("(time:eeee")] + [DataRow("(time::eeee")] + [DataRow("(time//eeee")] + [DataRow("(date::12::55")] + [DataRow("(date::12:aa:55")] + public void InvalidInputNotShowsResults(string typedString) + { + // Setup + Mock
main = new (); + Query expectedQuery = new (typedString, "("); + + // Act + var result = main.Object.Query(expectedQuery).FirstOrDefault(); + + // Assert + Assert.IsNull(result, result?.ToString()); + } + + [DataTestMethod] + [DataRow("(ug1646408119")] // Invalid prefix + [DataRow("(u9999999999999")] // Unix number + prefix is longer than 12 characters + [DataRow("(0123456")] // Missing prefix + [DataRow("(ft63782008ab55173dasdas21977")] // Number contains letters + public void InvalidNumberInputShowsErrorMessage(string typedString) + { + // Setup + Mock
main = new (); + Query expectedQuery = new (typedString, "("); + + // Act + var result = main.Object.Query(expectedQuery).FirstOrDefault().Title; + + // Assert + Assert.IsTrue(result.StartsWith("Error:", StringComparison.CurrentCulture)); + } + + [DataTestMethod] + [DataRow("(ft12..548")] // Number contains punctuation + [DataRow("(ft12..54//8")] // Number contains punctuation and other characters + [DataRow("(12..54//8")] // Number contains punctuation and other characters + [DataRow("(ft::1288gg8888")] // Number contains delimiter and other characters + public void InvalidInputNotShowsErrorMessage(string typedString) + { + // Setup + Mock
main = new (); + Query expectedQuery = new (typedString, "("); + + // Act + var result = main.Object.Query(expectedQuery).FirstOrDefault(); + + // Assert + Assert.IsNull(result); + } + + [TestCleanup] + public void CleanUp() + { + // Set culture to original value + CultureInfo.CurrentCulture = originalCulture; + CultureInfo.CurrentUICulture = originalUiCulture; + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/StringParserTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/StringParserTests.cs new file mode 100644 index 0000000000..a31b45c560 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/StringParserTests.cs @@ -0,0 +1,60 @@ +// 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.Threading; +using Microsoft.PowerToys.Run.Plugin.TimeDate.Components; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests +{ + [TestClass] + public class StringParserTests + { + private CultureInfo originalCulture; + private CultureInfo originalUiCulture; + + [TestInitialize] + public void Setup() + { + // Set culture to 'en-us' + originalCulture = CultureInfo.CurrentCulture; + CultureInfo.CurrentCulture = new CultureInfo("en-us"); + originalUiCulture = CultureInfo.CurrentUICulture; + CultureInfo.CurrentUICulture = new CultureInfo("en-us"); + } + + [DataTestMethod] + [DataRow("10/29/2022 17:05:10", true, "G", "10/29/2022 5:05:10 PM")] + [DataRow("Saturday, October 29, 2022 5:05:10 PM", true, "G", "10/29/2022 5:05:10 PM")] + [DataRow("10/29/2022", true, "d", "10/29/2022")] + [DataRow("Saturday, October 29, 2022", true, "d", "10/29/2022")] + [DataRow("17:05:10", true, "T", "5:05:10 PM")] + [DataRow("5:05:10 PM", true, "T", "5:05:10 PM")] + [DataRow("10456", false, "", "")] + [DataRow("u10456", true, "", "")] // Value is UTC and can be different based on system + [DataRow("ft10456", true, "", "")] // Value is UTC and can be different based on system + public void ConvertStringToDateTime(string typedString, bool expectedBool, string stringType, string expectedString) + { + // Act + bool boolResult = TimeAndDateHelper.ParseStringAsDateTime(in typedString, out DateTime result); + + // Assert + Assert.AreEqual(expectedBool, boolResult); + if (!string.IsNullOrEmpty(expectedString)) + { + Assert.AreEqual(expectedString, result.ToString(stringType, CultureInfo.CurrentCulture)); + } + } + + [TestCleanup] + public void CleanUp() + { + // Set culture to original value + CultureInfo.CurrentCulture = originalCulture; + CultureInfo.CurrentUICulture = originalUiCulture; + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeDateResultTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeDateResultTests.cs new file mode 100644 index 0000000000..741a14fe6c --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests/TimeDateResultTests.cs @@ -0,0 +1,313 @@ +// 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.Linq; +using Microsoft.PowerToys.Run.Plugin.TimeDate.Components; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests +{ + [TestClass] + public class TimeDateResultTests + { + private CultureInfo originalCulture; + private CultureInfo originalUiCulture; + + [TestInitialize] + public void Setup() + { + // Set culture to 'en-us' + originalCulture = CultureInfo.CurrentCulture; + CultureInfo.CurrentCulture = new CultureInfo("en-us"); + originalUiCulture = CultureInfo.CurrentUICulture; + CultureInfo.CurrentUICulture = new CultureInfo("en-us"); + } + + [DataTestMethod] + [DataRow("time", "10:30 AM")] + [DataRow("date", "3/2/2022")] + [DataRow("date and time", "3/2/2022 10:30 AM")] + [DataRow("hour", "10")] + [DataRow("minute", "30")] + [DataRow("second", "45")] + [DataRow("millisecond", "0")] + [DataRow("day (week day)", "Wednesday")] + [DataRow("day of the week (week day)", "4")] + [DataRow("day of the month", "2")] + [DataRow("day of the year", "61")] + [DataRow("week of the month", "1")] + [DataRow("week of the year (calendar week, week number)", "10")] + [DataRow("month", "March")] + [DataRow("month of the year", "3")] + [DataRow("month and day", "March 2")] + [DataRow("year", "2022")] + [DataRow("month and year", "March 2022")] + [DataRow("ISO 8601", "2022-03-02T10:30:45")] + [DataRow("ISO 8601 with time zone", "2022-03-02T10:30:45")] + [DataRow("RFC1123", "Wed, 02 Mar 2022 10:30:45 GMT")] + public void LocalFormatsWithShortTimeAndShortDate(string formatLabel, string expectedResult) + { + // Setup + var helperResults = AvailableResultsList.GetList(true, false, false, new DateTime(2022, 03, 02, 10, 30, 45)); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value, $"Culture {CultureInfo.CurrentCulture.Name}, Culture UI: {CultureInfo.CurrentUICulture.Name}, Calendar: {CultureInfo.CurrentCulture.Calendar}, Region: {RegionInfo.CurrentRegion.Name}"); + } + + [DataTestMethod] + [DataRow("time", "10:30 AM")] + [DataRow("date", "Wednesday, March 2, 2022")] + [DataRow("date and time", "Wednesday, March 2, 2022 10:30 AM")] + [DataRow("hour", "10")] + [DataRow("minute", "30")] + [DataRow("second", "45")] + [DataRow("millisecond", "0")] + [DataRow("day (week day)", "Wednesday")] + [DataRow("day of the week (week day)", "4")] + [DataRow("day of the month", "2")] + [DataRow("day of the year", "61")] + [DataRow("week of the month", "1")] + [DataRow("week of the year (calendar week, week number)", "10")] + [DataRow("month", "March")] + [DataRow("month of the year", "3")] + [DataRow("month and day", "March 2")] + [DataRow("year", "2022")] + [DataRow("month and year", "March 2022")] + [DataRow("ISO 8601", "2022-03-02T10:30:45")] + [DataRow("ISO 8601 with time zone", "2022-03-02T10:30:45")] + [DataRow("RFC1123", "Wed, 02 Mar 2022 10:30:45 GMT")] + public void LocalFormatsWithShortTimeAndLongDate(string formatLabel, string expectedResult) + { + // Setup + var helperResults = AvailableResultsList.GetList(true, false, true, new DateTime(2022, 03, 02, 10, 30, 45)); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value); + } + + [DataTestMethod] + [DataRow("time", "10:30:45 AM")] + [DataRow("date", "3/2/2022")] + [DataRow("date and time", "3/2/2022 10:30:45 AM")] + [DataRow("hour", "10")] + [DataRow("minute", "30")] + [DataRow("second", "45")] + [DataRow("millisecond", "0")] + [DataRow("day (week day)", "Wednesday")] + [DataRow("day of the week (week day)", "4")] + [DataRow("day of the month", "2")] + [DataRow("day of the year", "61")] + [DataRow("week of the month", "1")] + [DataRow("week of the year (calendar week, week number)", "10")] + [DataRow("month", "March")] + [DataRow("month of the year", "3")] + [DataRow("month and day", "March 2")] + [DataRow("year", "2022")] + [DataRow("month and year", "March 2022")] + [DataRow("ISO 8601", "2022-03-02T10:30:45")] + [DataRow("ISO 8601 with time zone", "2022-03-02T10:30:45")] + [DataRow("RFC1123", "Wed, 02 Mar 2022 10:30:45 GMT")] + public void LocalFormatsWithLongTimeAndShortDate(string formatLabel, string expectedResult) + { + // Setup + var helperResults = AvailableResultsList.GetList(true, true, false, new DateTime(2022, 03, 02, 10, 30, 45)); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value); + } + + [DataTestMethod] + [DataRow("time", "10:30:45 AM")] + [DataRow("date", "Wednesday, March 2, 2022")] + [DataRow("date and time", "Wednesday, March 2, 2022 10:30:45 AM")] + [DataRow("hour", "10")] + [DataRow("minute", "30")] + [DataRow("second", "45")] + [DataRow("millisecond", "0")] + [DataRow("day (week day)", "Wednesday")] + [DataRow("day of the week (week day)", "4")] + [DataRow("day of the month", "2")] + [DataRow("day of the year", "61")] + [DataRow("week of the month", "1")] + [DataRow("week of the year (calendar week, week number)", "10")] + [DataRow("month", "March")] + [DataRow("month of the year", "3")] + [DataRow("month and day", "March 2")] + [DataRow("year", "2022")] + [DataRow("month and year", "March 2022")] + [DataRow("ISO 8601", "2022-03-02T10:30:45")] + [DataRow("ISO 8601 with time zone", "2022-03-02T10:30:45")] + [DataRow("RFC1123", "Wed, 02 Mar 2022 10:30:45 GMT")] + public void LocalFormatsWithLongTimeAndLongDate(string formatLabel, string expectedResult) + { + // Setup + var helperResults = AvailableResultsList.GetList(true, true, true, new DateTime(2022, 03, 02, 10, 30, 45)); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value); + } + + [DataTestMethod] + [DataRow("time utc", "t")] + [DataRow("date and time utc", "g")] + [DataRow("ISO 8601 UTC", "yyyy-MM-ddTHH:mm:ss")] + [DataRow("ISO 8601 UTC with time zone", "yyyy-MM-ddTHH:mm:ss'Z'")] + [DataRow("Universal time format: YYYY-MM-DD hh:mm:ss", "u")] + public void UtcFormatsWithShortTimeAndShortDate(string formatLabel, string expectedFormat) + { + // Setup + var helperResults = AvailableResultsList.GetList(true, false, false, new DateTime(2022, 03, 02, 10, 30, 45)); + var expectedResult = new DateTime(2022, 03, 02, 10, 30, 45).ToUniversalTime().ToString(expectedFormat, CultureInfo.CurrentCulture); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value); + } + + [DataTestMethod] + [DataRow("time utc", "t")] + [DataRow("date and time utc", "f")] + [DataRow("ISO 8601 UTC", "yyyy-MM-ddTHH:mm:ss")] + [DataRow("ISO 8601 UTC with time zone", "yyyy-MM-ddTHH:mm:ss'Z'")] + [DataRow("Universal time format: YYYY-MM-DD hh:mm:ss", "u")] + public void UtcFormatsWithShortTimeAndLongDate(string formatLabel, string expectedFormat) + { + // Setup + var helperResults = AvailableResultsList.GetList(true, false, true, new DateTime(2022, 03, 02, 10, 30, 45)); + var expectedResult = new DateTime(2022, 03, 02, 10, 30, 45).ToUniversalTime().ToString(expectedFormat, CultureInfo.CurrentCulture); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value); + } + + [DataTestMethod] + [DataRow("time utc", "T")] + [DataRow("date and time utc", "G")] + [DataRow("ISO 8601 UTC", "yyyy-MM-ddTHH:mm:ss")] + [DataRow("ISO 8601 UTC with time zone", "yyyy-MM-ddTHH:mm:ss'Z'")] + [DataRow("Universal time format: YYYY-MM-DD hh:mm:ss", "u")] + public void UtcFormatsWithLongTimeAndShortDate(string formatLabel, string expectedFormat) + { + // Setup + var helperResults = AvailableResultsList.GetList(true, true, false, new DateTime(2022, 03, 02, 10, 30, 45)); + var expectedResult = new DateTime(2022, 03, 02, 10, 30, 45).ToUniversalTime().ToString(expectedFormat, CultureInfo.CurrentCulture); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value); + } + + [DataTestMethod] + [DataRow("time utc", "T")] + [DataRow("date and time utc", "F")] + [DataRow("ISO 8601 UTC", "yyyy-MM-ddTHH:mm:ss")] + [DataRow("ISO 8601 UTC with time zone", "yyyy-MM-ddTHH:mm:ss'Z'")] + [DataRow("Universal time format: YYYY-MM-DD hh:mm:ss", "u")] + public void UtcFormatsWithLongTimeAndLongDate(string formatLabel, string expectedFormat) + { + // Setup + var helperResults = AvailableResultsList.GetList(true, true, true, new DateTime(2022, 03, 02, 10, 30, 45)); + var expectedResult = new DateTime(2022, 03, 02, 10, 30, 45).ToUniversalTime().ToString(expectedFormat, CultureInfo.CurrentCulture); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value); + } + + [TestMethod] + public void UnixTimestampFormat() + { + // Setup + string formatLabel = "Unix epoch time"; + DateTime timeValue = DateTime.Now.ToUniversalTime(); + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue); + var expectedResult = (long)timeValue.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult.ToString(CultureInfo.CurrentCulture), result?.Value); + } + + [TestMethod] + public void WindowsFileTimeFormat() + { + // Setup + string formatLabel = "Windows file time (Int64 number)"; + DateTime timeValue = DateTime.Now; + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue); + var expectedResult = timeValue.Ticks.ToString(CultureInfo.CurrentCulture); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value); + } + + [TestMethod] + public void ValidateEraResult() + { + // Setup + string formatLabel = "Era"; + DateTime timeValue = DateTime.Now; + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue); + var expectedResult = DateTimeFormatInfo.CurrentInfo.GetEraName(CultureInfo.CurrentCulture.Calendar.GetEra(timeValue)); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value); + } + + [TestMethod] + public void ValidateEraAbbreviationResult() + { + // Setup + string formatLabel = "Era abbreviation"; + DateTime timeValue = DateTime.Now; + var helperResults = AvailableResultsList.GetList(true, false, false, timeValue); + var expectedResult = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedEraName(CultureInfo.CurrentCulture.Calendar.GetEra(timeValue)); + + // Act + var result = helperResults.FirstOrDefault(x => x.Label.Equals(formatLabel, StringComparison.OrdinalIgnoreCase)); + + // Assert + Assert.AreEqual(expectedResult, result?.Value); + } + + [TestCleanup] + public void CleanUp() + { + // Set culture to original value + CultureInfo.CurrentCulture = originalCulture; + CultureInfo.CurrentUICulture = originalUiCulture; + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResult.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResult.cs new file mode 100644 index 0000000000..2741de6e51 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResult.cs @@ -0,0 +1,55 @@ +// 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.CompilerServices; + +[assembly: InternalsVisibleTo("Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests")] + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.Components +{ + internal class AvailableResult + { + /// + /// Gets or sets the time/date value + /// + internal string Value { get; set; } + + /// + /// Gets or sets the text used for the subtitle and as search term + /// + internal string Label { get; set; } + + /// + /// Gets or sets an an alternative search tag that will be evaluated if label doesn't match. For example we like to show the era on searches for 'year' too. + /// + internal string AlternativeSearchTag { get; set; } + + /// + /// Gets or sets a value indicating the type of result + /// + internal ResultIconType IconType { get; set; } + + /// + /// Returns the path to the icon + /// + /// Theme + /// Path + internal string GetIconPath(string theme) + { + return IconType switch + { + ResultIconType.Time => $"Images\\time.{theme}.png", + ResultIconType.Date => $"Images\\calendar.{theme}.png", + ResultIconType.DateTime => $"Images\\timeDate.{theme}.png", + _ => string.Empty, + }; + } + } + + internal enum ResultIconType + { + Time, + Date, + DateTime, + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs new file mode 100644 index 0000000000..2dfc374485 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/AvailableResultsList.cs @@ -0,0 +1,267 @@ +// 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.Globalization; +using System.Linq; +using Microsoft.PowerToys.Run.Plugin.TimeDate.Properties; + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.Components +{ + internal class AvailableResultsList + { + /// + /// Returns a list with all available date time formats + /// + /// Is this a search with plugin activation keyword or not + /// Required for UnitTest: Show time in long format + /// Required for UnitTest: Show date in long format + /// Required for UnitTest: Use custom object to calculate results + /// List of results + internal static List GetList(bool isKeywordSearch, bool? timeLong = null, bool? dateLong = null, DateTime? timestamp = null) + { + List results = new List(); + bool timeExtended = timeLong ?? TimeDateSettings.Instance.TimeWithSeconds; + bool dateExtended = dateLong ?? TimeDateSettings.Instance.DateWithWeekday; + bool isSystemDateTime = timestamp == null; + Calendar calendar = CultureInfo.CurrentCulture.Calendar; + DateTime dateTimeNow = timestamp ?? DateTime.Now; + DateTime dateTimeNowUtc = dateTimeNow.ToUniversalTime(); + + results.AddRange(new[] + { + // This range is reserved for the following three results: Time, Date, Now + // Don't add any new result in this range! For new results, please use the next range. + new AvailableResult() + { + Value = dateTimeNow.ToString(TimeAndDateHelper.GetStringFormat(FormatStringType.Time, timeExtended, dateExtended), CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_Time, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, string.Empty, "Microsoft_plugin_timedate_SearchTagTimeNow"), + IconType = ResultIconType.Time, + }, + new AvailableResult() + { + Value = dateTimeNow.ToString(TimeAndDateHelper.GetStringFormat(FormatStringType.Date, timeExtended, dateExtended), CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_Date, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, string.Empty, "Microsoft_plugin_timedate_SearchTagDateNow"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = dateTimeNow.ToString(TimeAndDateHelper.GetStringFormat(FormatStringType.DateTime, timeExtended, dateExtended), CultureInfo.CurrentCulture), + Label = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_DateAndTime", "Microsoft_plugin_timedate_Now"), + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFormat"), + IconType = ResultIconType.DateTime, + }, + }); + + if (isKeywordSearch || !TimeDateSettings.Instance.OnlyDateTimeNowGlobal) + { + // We use long instead of int for unix time stamp because int ist to small after 03:14:07 UTC 2038-01-19 + long unixTimestamp = (long)dateTimeNowUtc.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; + int weekOfYear = calendar.GetWeekOfYear(dateTimeNow, DateTimeFormatInfo.CurrentInfo.CalendarWeekRule, DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek); + string era = DateTimeFormatInfo.CurrentInfo.GetEraName(calendar.GetEra(dateTimeNow)); + string eraShort = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedEraName(calendar.GetEra(dateTimeNow)); + + results.AddRange(new[] + { + new AvailableResult() + { + Value = dateTimeNowUtc.ToString(TimeAndDateHelper.GetStringFormat(FormatStringType.Time, timeExtended, dateExtended), CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_TimeUtc, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, string.Empty, "Microsoft_plugin_timedate_SearchTagTimeNow"), + IconType = ResultIconType.Time, + }, + new AvailableResult() + { + Value = dateTimeNowUtc.ToString(TimeAndDateHelper.GetStringFormat(FormatStringType.DateTime, timeExtended, dateExtended), CultureInfo.CurrentCulture), + Label = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_DateAndTimeUtc", "Microsoft_plugin_timedate_NowUtc"), + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFormat"), + IconType = ResultIconType.DateTime, + }, + new AvailableResult() + { + Value = unixTimestamp.ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_Unix, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFormat"), + IconType = ResultIconType.DateTime, + }, + new AvailableResult() + { + Value = dateTimeNow.Hour.ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_Hour, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagTime"), + IconType = ResultIconType.Time, + }, + new AvailableResult() + { + Value = dateTimeNow.Minute.ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_Minute, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagTime"), + IconType = ResultIconType.Time, + }, + new AvailableResult() + { + Value = dateTimeNow.Second.ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_Second, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagTime"), + IconType = ResultIconType.Time, + }, + new AvailableResult() + { + Value = dateTimeNow.Millisecond.ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_Millisecond, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagTime"), + IconType = ResultIconType.Time, + }, + new AvailableResult() + { + Value = DateTimeFormatInfo.CurrentInfo.GetDayName(dateTimeNow.DayOfWeek), + Label = Resources.Microsoft_plugin_timedate_Day, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = TimeAndDateHelper.GetNumberOfDayInWeek(dateTimeNow).ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_DayOfWeek, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = dateTimeNow.Day.ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_DayOfMonth, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = dateTimeNow.DayOfYear.ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_DayOfYear, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = TimeAndDateHelper.GetWeekOfMonth(dateTimeNow).ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_WeekOfMonth, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = weekOfYear.ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_WeekOfYear, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = DateTimeFormatInfo.CurrentInfo.GetMonthName(dateTimeNow.Month), + Label = Resources.Microsoft_plugin_timedate_Month, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = dateTimeNow.Month.ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_MonthOfYear, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = dateTimeNow.ToString("M", CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_DayMonth, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = calendar.GetYear(dateTimeNow).ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_Year, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = era, + Label = Resources.Microsoft_plugin_timedate_Era, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagEra"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = era != eraShort ? eraShort : string.Empty, // Setting value to empty string if 'era == eraShort'. This result will be filtered later. + Label = Resources.Microsoft_plugin_timedate_EraAbbreviation, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagEra"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = dateTimeNow.ToString("Y", CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_MonthYear, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagDate"), + IconType = ResultIconType.Date, + }, + new AvailableResult() + { + Value = dateTimeNow.Ticks.ToString(CultureInfo.CurrentCulture), + Label = Resources.Microsoft_plugin_timedate_WindowsFileTime, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFormat"), + IconType = ResultIconType.DateTime, + }, + new AvailableResult() + { + Value = dateTimeNowUtc.ToString("u"), + Label = Resources.Microsoft_plugin_timedate_UniversalTime, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFormat"), + IconType = ResultIconType.DateTime, + }, + new AvailableResult() + { + Value = dateTimeNow.ToString("s"), + Label = Resources.Microsoft_plugin_timedate_Iso8601, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFormat"), + IconType = ResultIconType.DateTime, + }, + new AvailableResult() + { + Value = dateTimeNowUtc.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture), + Label = Resources.Microsoft_plugin_timedate_Iso8601Utc, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFormat"), + IconType = ResultIconType.DateTime, + }, + new AvailableResult() + { + Value = dateTimeNow.ToString("yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture), + Label = Resources.Microsoft_plugin_timedate_Iso8601Zone, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFormat"), + IconType = ResultIconType.DateTime, + }, + new AvailableResult() + { + Value = dateTimeNowUtc.ToString("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture), + Label = Resources.Microsoft_plugin_timedate_Iso8601ZoneUtc, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFormat"), + IconType = ResultIconType.DateTime, + }, + new AvailableResult() + { + Value = dateTimeNow.ToString("R"), + Label = Resources.Microsoft_plugin_timedate_Rfc1123, + AlternativeSearchTag = ResultHelper.SelectStringFromResources(isSystemDateTime, "Microsoft_plugin_timedate_SearchTagFormat"), + IconType = ResultIconType.DateTime, + }, + }); + } + + // Return only results where value is not empty + // This can happen, for example, when we can't read the 'era' or when 'era == era abbreviation' and we set value explicitly to an empty string. + return results.Where(x => !string.IsNullOrEmpty(x.Value)).ToList(); + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/ResultHelper.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/ResultHelper.cs new file mode 100644 index 0000000000..a2f3dfe6af --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/ResultHelper.cs @@ -0,0 +1,92 @@ +// 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.Runtime.CompilerServices; +using System.Windows; +using Microsoft.PowerToys.Run.Plugin.TimeDate.Properties; +using Wox.Plugin; +using Wox.Plugin.Logger; + +[assembly: InternalsVisibleTo("Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests")] + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.Components +{ + internal static class ResultHelper + { + /// + /// Get the string based on the requested type + /// + /// Does the user search for system date/time? + /// Id of the string. (Example: `MyString` for `MyString` and `MyStringNow`) + /// Optional string id for now case + /// The string from the resource file, or otherwise. + internal static string SelectStringFromResources(bool isSystemTimeDate, string stringId, string stringIdNow = default) + { + if (!isSystemTimeDate) + { + return Resources.ResourceManager.GetString(stringId, CultureInfo.CurrentUICulture) ?? string.Empty; + } + else if (!string.IsNullOrEmpty(stringIdNow)) + { + return Resources.ResourceManager.GetString(stringIdNow, CultureInfo.CurrentUICulture) ?? string.Empty; + } + else + { + return Resources.ResourceManager.GetString(stringId + "Now", CultureInfo.CurrentUICulture) ?? string.Empty; + } + } + + /// + /// Copy the given text to the clipboard + /// + /// The text to copy to the clipboard + /// The text successful copy to the clipboard, otherwise + /// Code copied from TimeZone plugin + internal static bool CopyToClipBoard(in string text) + { + try + { + Clipboard.Clear(); + Clipboard.SetText(text); + return true; + } + catch (Exception exception) + { + Log.Exception("Can't copy to clipboard", exception, typeof(ResultHelper)); + return false; + } + } + + /// + /// Create a tool tip for the alternative search tags + /// + /// The . + /// New object or null if is empty. + internal static ToolTipData GetSearchTagToolTip(AvailableResult result, out Visibility visibility) + { + switch (string.IsNullOrEmpty(result.AlternativeSearchTag)) + { + case true: + visibility = Visibility.Hidden; + return null; + default: + visibility = Visibility.Visible; + return new ToolTipData(Resources.Microsoft_plugin_timedate_ToolTipAlternativeSearchTag, result.AlternativeSearchTag); + } + } + + /// + /// Gets a result with an error message that only numbers can't be parsed + /// + /// Element of type . + internal static Result CreateNumberErrorResult(string theme) => new Result() + { + Title = Resources.Microsoft_plugin_timedate_ErrorResultTitle, + SubTitle = Resources.Microsoft_plugin_timedate_ErrorResultSubTitle, + IcoPath = $"Images\\Warning.{theme}.png", + }; + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/SearchController.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/SearchController.cs new file mode 100644 index 0000000000..fef883818f --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/SearchController.cs @@ -0,0 +1,182 @@ +// 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.Linq; +using System.Text.RegularExpressions; +using System.Windows; +using Microsoft.PowerToys.Run.Plugin.TimeDate.Properties; +using Wox.Infrastructure; +using Wox.Plugin; + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.Components +{ + /// + /// SearchController: Class tot hold the search method that filter available date time formats + /// Extra class to simplify code in class + /// + internal static class SearchController + { + /// + /// Var that holds the delimiter between format and date + /// + private const string InputDelimiter = "::"; + + /// + /// A list of conjunctions that we ignore on search + /// + private static readonly string[] _conjunctionList = Resources.Microsoft_plugin_timedate_Search_ConjunctionList.Split("; "); + + /// + /// Searches for results + /// + /// Search query object + /// List of Wox s. + internal static List ExecuteSearch(Query query, string iconTheme) + { + List availableFormats = new List(); + List results = new List(); + bool isKeywordSearch = !string.IsNullOrEmpty(query.ActionKeyword); + bool isEmptySearchInput = string.IsNullOrEmpty(query.Search); + string searchTerm = query.Search; + + // Empty search without keyword => return no results + if (!isKeywordSearch && isEmptySearchInput) + { + return results; + } + + // Conjunction search without keyword => return no results + // (This improves the results on global queries.) + if (!isKeywordSearch && _conjunctionList.Any(x => x.Equals(searchTerm, StringComparison.CurrentCultureIgnoreCase))) + { + return results; + } + + // Switch search type + if (isEmptySearchInput) + { + // Return all results for system time/date on empty keyword search + availableFormats.AddRange(AvailableResultsList.GetList(isKeywordSearch)); + } + else if (Regex.IsMatch(searchTerm, @".+" + Regex.Escape(InputDelimiter) + @".+")) + { + // Search for specified format with specified time/date value + var userInput = searchTerm.Split(InputDelimiter); + if (TimeAndDateHelper.ParseStringAsDateTime(userInput[1], out DateTime timestamp)) + { + availableFormats.AddRange(AvailableResultsList.GetList(isKeywordSearch, null, null, timestamp)); + searchTerm = userInput[0]; + } + } + else if (TimeAndDateHelper.ParseStringAsDateTime(searchTerm, out DateTime timestamp)) + { + // Return all formats for specified time/date value + availableFormats.AddRange(AvailableResultsList.GetList(isKeywordSearch, null, null, timestamp)); + searchTerm = string.Empty; + } + else + { + // Search for specified format with system time/date + availableFormats.AddRange(AvailableResultsList.GetList(isKeywordSearch)); + } + + // Check searchTerm after getting results to select type of result list + if (string.IsNullOrEmpty(searchTerm)) + { + // Generate list with all results + foreach (var f in availableFormats) + { + results.Add(new Result + { + Title = f.Value, + SubTitle = $"{f.Label} - {Resources.Microsoft_plugin_timedate_SubTitleNote}", + ToolTipData = ResultHelper.GetSearchTagToolTip(f, out Visibility v), + ToolTipVisibility = v, + IcoPath = f.GetIconPath(iconTheme), + Action = _ => ResultHelper.CopyToClipBoard(f.Value), + ContextData = f, + }); + } + } + else + { + // Generate filtered list of results + foreach (var f in availableFormats) + { + var resultMatchScore = GetMatchScore(searchTerm, f.Label, f.AlternativeSearchTag, !isKeywordSearch); + + if (resultMatchScore > 0) + { + results.Add(new Result + { + Title = f.Value, + SubTitle = $"{f.Label} - {Resources.Microsoft_plugin_timedate_SubTitleNote}", + ToolTipData = ResultHelper.GetSearchTagToolTip(f, out Visibility v), + ToolTipVisibility = v, + IcoPath = f.GetIconPath(iconTheme), + Action = _ => ResultHelper.CopyToClipBoard(f.Value), + Score = resultMatchScore, + ContextData = f, + }); + } + } + } + + // If search term is only a number that can't be parsed return an error message + if (!isEmptySearchInput && results.Count == 0 && searchTerm.Any(char.IsNumber) && Regex.IsMatch(searchTerm, @"\w+\d+$") && + !searchTerm.Contains(InputDelimiter) && !searchTerm.Any(char.IsWhiteSpace) && !searchTerm.Any(char.IsPunctuation)) + { + // Without plugin key word show only if message is not hidden by setting + if (isKeywordSearch || !TimeDateSettings.Instance.HideNumberMessageOnGlobalQuery) + { + results.Add(ResultHelper.CreateNumberErrorResult(iconTheme)); + } + } + + return results; + } + + /// + /// Checks the format for a match with the user query and returns the score. + /// + /// The user query. + /// The label of the format. + /// The search tag list as string. + /// Is this a global search? + /// The score for the result. + private static int GetMatchScore(string query, string label, string tags, bool isGlobalSearch) + { + // The query is global and the first word don't match any word in the label or tags => Return score of zero + if (isGlobalSearch) + { + char[] chars = new char[] { ' ', ',', ';', '(', ')' }; + string queryFirstWord = query.Split(chars)[0]; + string[] words = $"{label} {tags}".Split(chars); + + if (!words.Any(x => x.Trim().Equals(queryFirstWord, StringComparison.CurrentCultureIgnoreCase))) + { + return 0; + } + } + + // Get match for label (or for tags if label score is <1) + int score = StringMatcher.FuzzySearch(query, label).Score; + if (score < 1) + { + foreach (string t in tags.Split(";")) + { + var tagScore = StringMatcher.FuzzySearch(query, t.Trim()).Score / 2; + if (tagScore > score) + { + score = tagScore / 2; + } + } + } + + return score; + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeAndDateHelper.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeAndDateHelper.cs new file mode 100644 index 0000000000..a066331455 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeAndDateHelper.cs @@ -0,0 +1,129 @@ +// 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.Runtime.CompilerServices; +using System.Text.RegularExpressions; + +[assembly: InternalsVisibleTo("Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests")] + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.Components +{ + internal static class TimeAndDateHelper + { + /// + /// Get the format for the time string + /// + /// Type of format + /// Show date with weekday and name of month (long format) + /// Show time with seconds (long format) + /// String that identifies the time/date format () + internal static string GetStringFormat(FormatStringType targetFormat, bool timeLong, bool dateLong) + { + switch (targetFormat) + { + case FormatStringType.Time: + return timeLong ? "T" : "t"; + case FormatStringType.Date: + return dateLong ? "D" : "d"; + case FormatStringType.DateTime: + if (timeLong & dateLong) + { + return "F"; // Friday, October 31, 2008 5:04:32 PM + } + else if (timeLong & !dateLong) + { + return "G"; // 10/31/2008 5:04:32 PM + } + else if (!timeLong & dateLong) + { + return "f"; // Friday, October 31, 2008 5:04 PM + } + else + { + // (!timeLong & !dateLong) + return "g"; // 10/31/2008 5:04 PM + } + + default: + return string.Empty; // Windows default based on current culture settings + } + } + + /// + /// Returns the number week in the month (Used code from 'David Morton' from ) + /// + /// date + /// Number of week in the month + internal static int GetWeekOfMonth(DateTime date) + { + DateTime beginningOfMonth = new DateTime(date.Year, date.Month, 1); + + while (date.Date.AddDays(1).DayOfWeek != CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek) + { + date = date.AddDays(1); + } + + return (int)Math.Truncate((double)date.Subtract(beginningOfMonth).TotalDays / 7f) + 1; + } + + /// + /// Returns the number of the day in the week + /// + /// Date + /// Number of the day in the week + internal static int GetNumberOfDayInWeek(DateTime date) + { + int daysInWeek = 7; + int adjustment = 1; // We count from 1 to 7 and not from 0 to 6 + int formatSettingFirstDayOfWeek = (int)CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek; + + return ((int)(date.DayOfWeek + daysInWeek - formatSettingFirstDayOfWeek) % daysInWeek) + adjustment; + } + + /// + /// Convert input string to a object in local time + /// + /// String with date/time + /// The new object + /// True on success, otherwise false + internal static bool ParseStringAsDateTime(in string input, out DateTime timestamp) + { + if (DateTime.TryParse(input, out timestamp)) + { + // Known date/time format + return true; + } + else if (Regex.IsMatch(input, @"^u\d+") && input.Length <= 12 && long.TryParse(input.TrimStart('u'), out long secondsInt)) + { + // unix time stamp + // we use long instead of int because int ist to small after 03:14:07 UTC 2038-01-19 + timestamp = new DateTime(1970, 1, 1).AddSeconds(secondsInt).ToLocalTime(); + return true; + } + else if (Regex.IsMatch(input, @"^ft\d+") && long.TryParse(input.TrimStart("ft".ToCharArray()), out long secondsLong)) + { + // windows file time + timestamp = new DateTime(secondsLong); + return true; + } + else + { + timestamp = new DateTime(1, 1, 1, 1, 1, 1); + return false; + } + } + } + + /// + /// Type of time/date format + /// + internal enum FormatStringType + { + Time, + Date, + DateTime, + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeDateSettings.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeDateSettings.cs new file mode 100644 index 0000000000..a554caac95 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Components/TimeDateSettings.cs @@ -0,0 +1,154 @@ +// 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.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using Microsoft.PowerToys.Run.Plugin.TimeDate.Properties; +using Microsoft.PowerToys.Settings.UI.Library; + +[assembly: InternalsVisibleTo("Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests")] + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate.Components +{ + /// + /// Additional settings for the WindowWalker plugin. + /// + /// Some code parts reused from TimeZone plugin. + internal sealed class TimeDateSettings + { + /// + /// Are the class properties initialized with default values + /// + private readonly bool _initialized; + + /// + /// An instance of the class + /// + private static TimeDateSettings instance; + + /// + /// Gets a value indicating whether to show only the time and date in global results or not + /// + internal bool OnlyDateTimeNowGlobal { get; private set; } + + /// + /// Gets a value indicating whether to show the time with seconds or not + /// + internal bool TimeWithSeconds { get; private set; } + + /// + /// Gets a value indicating whether the date with the weekday or not + /// + internal bool DateWithWeekday { get; private set; } + + /// + /// Gets a value indicating whether to hide the number input error message on global results + /// + internal bool HideNumberMessageOnGlobalQuery { get; private set; } + + /// + /// Initializes a new instance of the class. + /// Private constructor to make sure there is never more than one instance of this class + /// + private TimeDateSettings() + { + // Init class properties with default values + UpdateSettings(null); + _initialized = true; + } + + /// + /// Gets an instance property of this class that makes sure that the first instance gets created + /// and that all the requests end up at that one instance. + /// The benefit of this is that we don't need additional variables/parameters + /// to communicate the settings between plugin's classes/methods. + /// We can simply access this one instance, whenever we need the actual settings. + /// + internal static TimeDateSettings Instance + { + get + { + if (instance == null) + { + instance = new TimeDateSettings(); + } + + return instance; + } + } + + /// + /// Return a list with all additional plugin options. + /// + /// A list with all additional plugin options. + internal static List GetAdditionalOptions() + { + var optionList = new List + { + new PluginAdditionalOption() + { + // ToDo: When description property is implemented (#15853), move the note in brackets to description. + Key = nameof(OnlyDateTimeNowGlobal), + DisplayLabel = Resources.Microsoft_plugin_timedate_SettingOnlyDateTimeNowGlobal, + Value = true, + }, + new PluginAdditionalOption() + { + // ToDo: When description property is implemented (#15853), move the note in brackets to description. + Key = nameof(TimeWithSeconds), + DisplayLabel = Resources.Microsoft_plugin_timedate_SettingTimeWithSeconds, + Value = false, + }, + new PluginAdditionalOption() + { + // ToDo: When description property is implemented (#15853), move the note in brackets to description. + Key = nameof(DateWithWeekday), + DisplayLabel = Resources.Microsoft_plugin_timedate_SettingDateWithWeekday, + Value = false, + }, + new PluginAdditionalOption() + { + Key = nameof(HideNumberMessageOnGlobalQuery), + DisplayLabel = Resources.Microsoft_plugin_timedate_SettingHideNumberMessageOnGlobalQuery, + Value = false, + }, + }; + + return optionList; + } + + /// + /// Update this settings. + /// + /// The settings for all power launcher plugins. + internal void UpdateSettings(PowerLauncherPluginSettings settings) + { + if ((settings is null || settings.AdditionalOptions is null) & _initialized) + { + return; + } + + OnlyDateTimeNowGlobal = GetSettingOrDefault(settings, nameof(OnlyDateTimeNowGlobal)); + TimeWithSeconds = GetSettingOrDefault(settings, nameof(TimeWithSeconds)); + DateWithWeekday = GetSettingOrDefault(settings, nameof(DateWithWeekday)); + HideNumberMessageOnGlobalQuery = GetSettingOrDefault(settings, nameof(HideNumberMessageOnGlobalQuery)); + } + + /// + /// Return one setting of the given settings list with the given name. + /// + /// The object that contain all settings. + /// The name of the setting. + /// A settings value. + private static bool GetSettingOrDefault(PowerLauncherPluginSettings settings, string name) + { + var option = settings?.AdditionalOptions?.FirstOrDefault(x => x.Key == name); + + // If a setting isn't available, we use the value defined in the method GetAdditionalOptions() as fallback. + // We can use First() instead of FirstOrDefault() because the values must exist. Otherwise, we made a mistake when defining the settings. + return option?.Value ?? GetAdditionalOptions().First(x => x.Key == name).Value; + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/Warning.dark.png b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/Warning.dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9ae30c0548f9e9ed370873e6e97ea7f29f01f7ed GIT binary patch literal 566 zcmV-60?GY}P)@4J?l_4XHULYNr^79P>pqy!;KIv=YJfuJc?R&10DkwecA*|1ll!s5B0vvhS&^y$ zN@^AX4&MnT-MJ2+RQC%GSh}DFpmMq7zyM(6f*ydV`xJnc3n~DPdMp3~7jyueu1lN& ztG*xx;HaN+JX=PmotC>^t~<*C80t#^YR`fQK%!Rc@Pvr_p%b?_F5Pb=>(1Aa0Wj5< zT*hk80vn)4B@U2weLjFteNGvjgK6$aEC7uT`o#8YkV41{l?k*dyS*COE;|^E8%xM=Anj-Z%wum<%nxsZszRh-gj1&@b{C zT3nf3CG>Il%p}i%&$f1}ZUA;#>Q>qu(CKD3YxNHN0I3xoK=-1gxBvhE07*qoM6N<$ Ef|pYB=Kufz literal 0 HcmV?d00001 diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/Warning.light.png b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/Warning.light.png new file mode 100644 index 0000000000000000000000000000000000000000..30e0d9737ed2bc41f1b37b1fb37194206e255bfe GIT binary patch literal 580 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 TqggoE1Q2s$E2HyUJr4d4>PJQT literal 0 HcmV?d00001 diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/calendar.light.png b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/calendar.light.png new file mode 100644 index 0000000000000000000000000000000000000000..7f3ba03780457b5823cdac3070b4a5fc89dd1e59 GIT binary patch literal 7910 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 literal 0 HcmV?d00001 diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/time.light.png b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Images/time.light.png new file mode 100644 index 0000000000000000000000000000000000000000..3e394677602c6c0cc0a96669a62510b9de76237b GIT binary patch literal 8550 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 literal 0 HcmV?d00001 diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Main.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Main.cs new file mode 100644 index 0000000000..3a7347a61f --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Main.cs @@ -0,0 +1,115 @@ +// 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.Diagnostics; +using System.Globalization; +using System.Threading; +using System.Windows.Controls; +using System.Windows.Input; +using ManagedCommon; +using Microsoft.PowerToys.Run.Plugin.TimeDate.Components; +using Microsoft.PowerToys.Run.Plugin.TimeDate.Properties; +using Microsoft.PowerToys.Settings.UI.Library; +using Wox.Plugin; + +namespace Microsoft.PowerToys.Run.Plugin.TimeDate +{ + public class Main : IPlugin, IPluginI18n, ISettingProvider, IContextMenu + { + private PluginInitContext _context; + + public string IconTheme { get; set; } + + public string Name => Resources.Microsoft_plugin_timedate_plugin_name; + + public string Description => GetTranslatedPluginDescription(); + + public IEnumerable AdditionalOptions + { + get + { + return TimeDateSettings.GetAdditionalOptions(); + } + } + + public List LoadContextMenus(Result selectedResult) + { + if (!(selectedResult?.ContextData is AvailableResult data)) + { + return new List(0); + } + + return new List() + { + new ContextMenuResult + { + AcceleratorKey = Key.C, + AcceleratorModifiers = ModifierKeys.Control, + FontFamily = "Segoe MDL2 Assets", + Glyph = "\xE8C8", // E8C8 => Symbol: Copy + Title = Resources.Microsoft_plugin_timedate_CopyToClipboard, + Action = _ => ResultHelper.CopyToClipBoard(data.Value), + }, + }; + } + + public void Init(PluginInitContext context) + { + _context = context; + _context.API.ThemeChanged += OnThemeChanged; + UpdateIconTheme(_context.API.GetCurrentTheme()); + } + + public List Query(Query query) + { + if (query == null) + { + throw new ArgumentNullException(paramName: nameof(query)); + } + + return SearchController.ExecuteSearch(query, IconTheme); + } + + private void UpdateIconTheme(Theme theme) + { + if (theme == Theme.Light || theme == Theme.HighContrastWhite) + { + IconTheme = "light"; + } + else + { + IconTheme = "dark"; + } + } + + private void OnThemeChanged(Theme currentTheme, Theme newTheme) + { + UpdateIconTheme(newTheme); + } + + public string GetTranslatedPluginDescription() + { + string timeExample = DateTime.Now.ToString("T", CultureInfo.CurrentCulture); + string dateExample = DateTime.Now.ToString("d", CultureInfo.CurrentCulture); + return string.Format(CultureInfo.CurrentCulture, Resources.Microsoft_plugin_timedate_plugin_description, dateExample, timeExample); + } + + public string GetTranslatedPluginTitle() + { + return Resources.Microsoft_plugin_timedate_plugin_name; + } + + public Control CreateSettingPanel() + { + throw new NotImplementedException(); + } + + public void UpdateSettings(PowerLauncherPluginSettings settings) + { + TimeDateSettings.Instance.UpdateSettings(settings); + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Microsoft.PowerToys.Run.Plugin.TimeDate.csproj b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Microsoft.PowerToys.Run.Plugin.TimeDate.csproj new file mode 100644 index 0000000000..0cd4d83e73 --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Microsoft.PowerToys.Run.Plugin.TimeDate.csproj @@ -0,0 +1,128 @@ + + + + + Library + net6.0-windows + Properties + Microsoft.PowerToys.Run.Plugin.TimeDate + Microsoft.PowerToys.Run.Plugin.TimeDate + $(Version).0 + true + false + false + x64 + en-US + true + Recommended + + + + true + ..\..\..\..\..\x64\Debug\modules\launcher\Plugins\TimeDate\ + DEBUG;TRACE + full + x64 + 8.0 + prompt + MinimumRecommendedRules.ruleset + 4 + false + + + + ..\..\..\..\..\x64\Release\modules\launcher\Plugins\TimeDate\ + TRACE + true + pdbonly + x64 + 8.0 + prompt + MinimumRecommendedRules.ruleset + 4 + + + true + + + + true + + + + + + + + + GlobalSuppressions.cs + + + StyleCop.json + + + + + 1.1.118 + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + PreserveNewest + + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.Designer.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.Designer.cs new file mode 100644 index 0000000000..33195f13ce --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.Designer.cs @@ -0,0 +1,532 @@ +//------------------------------------------------------------------------------ +// +// 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 Microsoft.PowerToys.Run.Plugin.TimeDate.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", "17.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("Microsoft.PowerToys.Run.Plugin.TimeDate.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 Copy value (Ctrl+C). + /// + internal static string Microsoft_plugin_timedate_CopyToClipboard { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_CopyToClipboard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date. + /// + internal static string Microsoft_plugin_timedate_Date { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Date", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date and time. + /// + internal static string Microsoft_plugin_timedate_DateAndTime { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_DateAndTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date and time UTC. + /// + internal static string Microsoft_plugin_timedate_DateAndTimeUtc { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_DateAndTimeUtc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Day (Week day). + /// + internal static string Microsoft_plugin_timedate_Day { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Day", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Month and day. + /// + internal static string Microsoft_plugin_timedate_DayMonth { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_DayMonth", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Day of the month. + /// + internal static string Microsoft_plugin_timedate_DayOfMonth { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_DayOfMonth", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Day of the week (Week day). + /// + internal static string Microsoft_plugin_timedate_DayOfWeek { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_DayOfWeek", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Day of the year. + /// + internal static string Microsoft_plugin_timedate_DayOfYear { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_DayOfYear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Era. + /// + internal static string Microsoft_plugin_timedate_Era { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Era", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Era abbreviation. + /// + internal static string Microsoft_plugin_timedate_EraAbbreviation { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_EraAbbreviation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Valid prefixes: 'u' for Unix Timestamp, 'ft' for Windows file time. + /// + internal static string Microsoft_plugin_timedate_ErrorResultSubTitle { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_ErrorResultSubTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error: Invalid number input. + /// + internal static string Microsoft_plugin_timedate_ErrorResultTitle { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_ErrorResultTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hour. + /// + internal static string Microsoft_plugin_timedate_Hour { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Hour", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ISO 8601. + /// + internal static string Microsoft_plugin_timedate_Iso8601 { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Iso8601", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ISO 8601 UTC. + /// + internal static string Microsoft_plugin_timedate_Iso8601Utc { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Iso8601Utc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ISO 8601 with time zone. + /// + internal static string Microsoft_plugin_timedate_Iso8601Zone { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Iso8601Zone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ISO 8601 UTC with time zone. + /// + internal static string Microsoft_plugin_timedate_Iso8601ZoneUtc { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Iso8601ZoneUtc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Millisecond. + /// + internal static string Microsoft_plugin_timedate_Millisecond { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Millisecond", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minute. + /// + internal static string Microsoft_plugin_timedate_Minute { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Minute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Month. + /// + internal static string Microsoft_plugin_timedate_Month { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Month", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Month of the year. + /// + internal static string Microsoft_plugin_timedate_MonthOfYear { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_MonthOfYear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Month and year. + /// + internal static string Microsoft_plugin_timedate_MonthYear { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_MonthYear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Now. + /// + internal static string Microsoft_plugin_timedate_Now { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Now", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Now UTC. + /// + internal static string Microsoft_plugin_timedate_NowUtc { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_NowUtc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Provides time and date values for the system time or a custom time stamp (Examples: 'day', 'day::{0}', 'time::{1}', 'calendar week::{0}'). + /// + internal static string Microsoft_plugin_timedate_plugin_description { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_plugin_description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Time and Date. + /// + internal static string Microsoft_plugin_timedate_plugin_name { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_plugin_name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to RFC1123. + /// + internal static string Microsoft_plugin_timedate_Rfc1123 { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Rfc1123", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to for; and; nor; but; or; so. + /// + internal static string Microsoft_plugin_timedate_Search_ConjunctionList { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Search_ConjunctionList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date. + /// + internal static string Microsoft_plugin_timedate_SearchTagDate { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SearchTagDate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current date; Now. + /// + internal static string Microsoft_plugin_timedate_SearchTagDateNow { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SearchTagDateNow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Year; Calendar era; Date. + /// + internal static string Microsoft_plugin_timedate_SearchTagEra { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SearchTagEra", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current year; Current calendar era; Current date; Now. + /// + internal static string Microsoft_plugin_timedate_SearchTagEraNow { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SearchTagEraNow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Date and time; Time and Date. + /// + internal static string Microsoft_plugin_timedate_SearchTagFormat { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SearchTagFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current date and time; Current time and date; Now. + /// + internal static string Microsoft_plugin_timedate_SearchTagFormatNow { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SearchTagFormatNow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Time. + /// + internal static string Microsoft_plugin_timedate_SearchTagTime { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SearchTagTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current Time; Now. + /// + internal static string Microsoft_plugin_timedate_SearchTagTimeNow { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SearchTagTimeNow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Second. + /// + internal static string Microsoft_plugin_timedate_Second { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Second", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show date with weekday and name of month (Applies to 'Date' and 'Now' result). + /// + internal static string Microsoft_plugin_timedate_SettingDateWithWeekday { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SettingDateWithWeekday", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hide 'Invalid number input' error message on global queries. + /// + internal static string Microsoft_plugin_timedate_SettingHideNumberMessageOnGlobalQuery { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SettingHideNumberMessageOnGlobalQuery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show only 'Time', 'Date' and 'Now' result on global queries + ///(Regardless of this setting, on global queries the first search word has to be a full match.). + /// + internal static string Microsoft_plugin_timedate_SettingOnlyDateTimeNowGlobal { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SettingOnlyDateTimeNowGlobal", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show time with seconds (Applies to 'Time' and 'Now' result). + /// + internal static string Microsoft_plugin_timedate_SettingTimeWithSeconds { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SettingTimeWithSeconds", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select or press Ctrl+C to copy. + /// + internal static string Microsoft_plugin_timedate_SubTitleNote { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_SubTitleNote", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Time. + /// + internal static string Microsoft_plugin_timedate_Time { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Time", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Time UTC. + /// + internal static string Microsoft_plugin_timedate_TimeUtc { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_TimeUtc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Alternative search tags:. + /// + internal static string Microsoft_plugin_timedate_ToolTipAlternativeSearchTag { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_ToolTipAlternativeSearchTag", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Universal time format: YYYY-MM-DD hh:mm:ss. + /// + internal static string Microsoft_plugin_timedate_UniversalTime { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_UniversalTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unix epoch time. + /// + internal static string Microsoft_plugin_timedate_Unix { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Unix", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Week of the month. + /// + internal static string Microsoft_plugin_timedate_WeekOfMonth { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_WeekOfMonth", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Week of the year (Calendar week, Week number). + /// + internal static string Microsoft_plugin_timedate_WeekOfYear { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_WeekOfYear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Windows file time (Int64 number). + /// + internal static string Microsoft_plugin_timedate_WindowsFileTime { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_WindowsFileTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Year. + /// + internal static string Microsoft_plugin_timedate_Year { + get { + return ResourceManager.GetString("Microsoft_plugin_timedate_Year", resourceCulture); + } + } + } +} diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.resx b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.resx new file mode 100644 index 0000000000..a3081c320f --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/Properties/Resources.resx @@ -0,0 +1,294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Copy value (Ctrl+C) + 'Ctrl+C' is a shortcut + + + Date + + + Date and time + + + Date and time UTC + 'UTC' means here 'Universal Time Convention' + + + Day (Week day) + + + Month and day + + + Day of the month + + + Day of the week (Week day) + + + Day of the year + + + Era + + + Era abbreviation + + + Valid prefixes: 'u' for Unix Timestamp, 'ft' for Windows file time + + + Error: Invalid number input + + + Hour + + + ISO 8601 + + + ISO 8601 UTC + 'UTC' means here 'Universal Time Convention' + + + ISO 8601 with time zone + + + ISO 8601 UTC with time zone + 'UTC' means here 'Universal Time Convention' + + + Millisecond + + + Minute + + + Month + + + Month of the year + + + Month and year + + + Now + + + Now UTC + 'UTC' means here 'Universal Time Convention' + + + Provides time and date values for the system time or a custom time stamp (Examples: 'day', 'day::{0}', 'time::{1}', 'calendar week::{0}') + The character sequence '::' is a fixed delimiter in plugin code. Do not translate the placeholders '{0}' and '{1}' because it will be replaced in code. + + + Time and Date + + + RFC1123 + + + Date + Don't change order + + + Current date; Now + Don't change order + + + Year; Calendar era; Date + Don't change order + + + Current year; Current calendar era; Current date; Now + Don't change order + + + Date and time; Time and Date + Don't change order + + + Current date and time; Current time and date; Now + Don't change order + + + Time + Don't change order + + + Current Time; Now + Don't change order + + + for; and; nor; but; or; so + List of conjunctions. We don't add 'yet' because this can be a synonym of 'now' which might be problematic on localized searches. + + + Second + + + Show date with weekday and name of month (Applies to 'Date' and 'Now' result) + + + Hide 'Invalid number input' error message on global queries + + + Show only 'Time', 'Date' and 'Now' result on global queries +(Regardless of this setting, on global queries the first search word has to be a full match.) + + + Show time with seconds (Applies to 'Time' and 'Now' result) + + + Select or press Ctrl+C to copy + 'Ctrl+C' is a shortcut + + + Time + + + Time UTC + 'UTC' means here 'Universal Time Convention' + + + Alternative search tags: + + + Universal time format: YYYY-MM-DD hh:mm:ss + + + Unix epoch time + + + Week of the month + + + Week of the year (Calendar week, Week number) + + + Windows file time (Int64 number) + + + Year + + \ No newline at end of file diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/plugin.json b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/plugin.json new file mode 100644 index 0000000000..55dfcd511a --- /dev/null +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.TimeDate/plugin.json @@ -0,0 +1,13 @@ +{ + "ID": "5D69806A5A474115821C3E4C56B9C793", + "ActionKeyword": "(", + "IsGlobal": true, + "Name": "Time and date", + "Author": "htcfreek", + "Version": "1.0.0", + "Language": "csharp", + "Website": "https://aka.ms/powertoys", + "ExecuteFileName": "Microsoft.PowerToys.Run.Plugin.TimeDate.dll", + "IcoPathDark": "Images\\timeDate.dark.png", + "IcoPathLight": "Images\\timeDate.light.png" +} diff --git a/src/modules/launcher/Wox.Infrastructure/StringMatcher.cs b/src/modules/launcher/Wox.Infrastructure/StringMatcher.cs index 8390c8a20d..ad4e3378ac 100644 --- a/src/modules/launcher/Wox.Infrastructure/StringMatcher.cs +++ b/src/modules/launcher/Wox.Infrastructure/StringMatcher.cs @@ -10,6 +10,7 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft.Plugin.Program.UnitTests")] [assembly: InternalsVisibleTo("Microsoft.PowerToys.Run.Plugin.System.UnitTests")] +[assembly: InternalsVisibleTo("Microsoft.PowerToys.Run.Plugin.TimeDate.UnitTests")] namespace Wox.Infrastructure {