From 666434f886ddad0a7de9119aafb8b9df4e57396a Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 22 Jul 2017 11:42:42 +0000 Subject: [PATCH 01/71] #467: Update the test DLLs for VS2017. --- lib/Microsoft.VSSDK.TestHostFramework.dll | Bin 26376 -> 26376 bytes lib/Microsoft.VSSDK.UnitTestLibrary.dll | Bin 52640 -> 52640 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/Microsoft.VSSDK.TestHostFramework.dll b/lib/Microsoft.VSSDK.TestHostFramework.dll index 718d79b94f65a1dda804840dbba745ac6e64a441..58bf6771dfe38abf99fc6a24fe677ec7c8a8bdaa 100644 GIT binary patch delta 6903 zcma)=2{=^k-^cGWGj?O&$-Xn1F&HG-mt@~%-?A$zv<+iPWIeV=C|lVpOL&kaDH0M= zJZU2;BudKi9{xT3xA(oS_gr&6^ZWkJeeP?{egE$7IcE}wpu{04JrNURVe6Q2Spcff zsN9d{{{k|mB(UxW0Wb&1rUk%57z^=JNoxQg0274dVMj;`YJp=AK7=bFdxb2d?e1oT z>?lA5x@2%sY%8NiN*z&@lE z1_0Iz49GW*Gh7A$`sm$wFA*w>NP74d#v3{gb5a>Xm+X2?zO`pg2o3xpyrp#q&bd^5fIru zmO)E^{LpmZz@EyX4WtS}l-(~CLv0hb|x`f683uMBOAH!2Yor);uJ(UA&K_;Rieycn* z6Uh3d<)*(UM#Q|^FjsG7l8;A4^lxlI1F+DFEm9{1S&xZwE!SMCDg3o z3G&-Y_gIN=H~$3qfhICwLJB7sq6Lhg3t|E+;64&_fN3P=0k07X01S!=-~kb#5(q)4 zijWp)fZGVQz#W8oNX&%PavQ=UU<9EBSU_k405Sj$Kn9^RP(h4Q|T=G%_JnyVV7hp=)RW;;G6I zuF>ogMO}f=h`I)0D|8#4p+9J;4BWsOfQbfx898TngOL3Zs7EFh`TX8mf%;xd`#S?b z4syTh{NYQia&H~wz9Jq!ZGuJx4g22I6UOU*-MPT0;r z{FFzKu=UAP-u|IIbpQ|{pwLq(3|rW7X7cjzvOxe#P*%VzD5@wC@d^ZG0I(3CB`Cvq zUT(;s!H9PRO+GW=v160h@uUB*LFxCpZ0qq?6YGTx-3EL&kF+HmR4}(J`guG?4d$aJ}>luDb0$@otyMNq=IQM`tG+_1Ade%rrFfdtow=g`p4UHlaehAvW*q2 z(G#11y1K_K!&RTrAU;{obg`aa3!m`>M;ofL(ZJ`wc%7UzT@f=D`z2sM$=NCINt_(h z&MH=|RLuoOtBNvO=NF`ENNG1I-jW#c<|YJKHfG-9u#v)Rk~X=FEE@XUHH9i`O=!Jz zj^1R3s5PhFVS7lMjR_|kR_TxV+dr8S*g16hPge;Ui|v*W-?1c(Bz}$XB-ZadCHG$2 zlMH)IgE+_+w3OU0}!kXBCf2oWB*io3k#Eg`g=CR#k z+x>>~gx#S5ctcnWy56u)vQ6X++pnxn=1)vC2kY!5TiwQuvAw$#)LfZg7 zcwNjKDRM2OxxKj9|J5AM5XV8v4V~gTPzIin4i6Ap0HE<;1FPgRlA+0z_UEx@bHCTD znE!SC8#&Hg&lrN*_Fub3;f#f2q}iDVAGNT5bP2=h?_MPsgiEDU_*C#}coKo6tg5Wy z#Em7W{!_waX9^QRNmUo8tE8ibQ^c#Nz^t}Xu!@TaxqIp84c!NyCaQ6>=nJ)a-*Y1! zUKm{Q7iM*S#OD=#xo7)cmOZ-?lg|9qwsDbe z&Ppe|ex&f#qpEkzqpXOr%_o&oylOmT`-~N{7P$Q;FrkUtyDxuM|naOF1sf@)eqGe)=dCXcy1ar

4B6S)>1dy>P7pyKzF$FlVog7ap2d3XM=0j@5eq3-RT&a^0$h1H-2IJobTtE z?b%hc^5IM6z1p%|J1aeAlRZOFDTB?o4CTkAUsNO%PV=JB5P(W45FMTZQQ`Mdqiy#w zVYo0HUyJj7$1~oW``oN~&H)N@b*>Co!Dezl$T=~%B>wdq0;xZp4ay~U3NKt@g5BaP z#3lKEkk)TKa@T5(OmA4A75YYgROj<{W*t*_S?-R}O7Pg`nf8JjSJRlKMpuu0U7v&5 z>f`rsA1~xmk2w8eJtz2f`hAt2ZL{0;P>fTuPlA>73Q>Bm(+7Uq}v^VC%c_x$Y+PG(zFmyF$bneW%9TM++KNj%STw%^< zGCn1Q3Zp|XHT^hZ+*S4T=H{XRDszcpgmWUpv(NIHHeWe<(^9Mc#hH#@JBNRM$46VDgLQ!tBo3VQq+8U>+H>_o(zwQ?$# zj@xYy((L*)qy-1y(gaoTssvRwOYBPJXYO z@^1Re=v$?3knmi@n$G;<|R^ifVyZx8(j15&*HF2iwJmI=&hutt2!S7I9 zpg{2I(l|b8$%ntFnN~pN0^ITCyv}J=(Xq4V)>>Lm6y3{Oqa-L(uAl5c5r5bu#Ft9k zt-9p;M$Ju9JCE;W>zqM+WSgZT%J9>>4WSN<<*7NgE2lrk=W>YB7qc_3d;DF39!Lqg zzz_Ee`xVU22UG0pNa8O)xK{SMrSBVheim=FTbryH6TESmAzq(=#WNrY3{btQi-&2P>r~vv}Q%Jul!HcWbA&i%#3w=pPjPt1xwnjZxdTx<6Xk~Te`;PQA^&u zWOuVSy#v-}LO-1{uty(@$DRwH@7IZ7b0bLh-x{(`@~~O&NeTO7<^G+07pl_ZFzUHc zs9N_1RmC9&sx3T4dIM(AyvY2Y)m*IUz|p{9oSCrxKutEmzn#riOamrOUxu-VlF66P z*iMmL?j)lvT5s!qvQ6Cbq1PNy_)2Z`(XYj4LzBY zC3}~FDC@$~CU~$2F1Y*PWbl)LEAREQ+jOHSl&|tu%=34r2>LCwgR5>zT4BleI+;vH zn2+5d?{Kcn)m)v-e<_sw^ZkvNZ~JfGRDX0me#y#*NYHTo6cV+h5~shFRCD)Tq#*U- z!^IRyKe#}v;J@xmhT3Wb5?)17ji9EigjaLIi&4|bCKx5GV<9>W0Wn#XoRyVE_lK{G zx4w^5bCFV_Up@_kZ)>xYZ*~QiOq3LVF6jd=4R)Sp#hzl3XcRJE-XJPf@v`;Y<0Cxl zv1x_HTD{vj?HbhQl0+^3I$?98Mf_UautPOqe*Dg>^~L=1yt;go;nA9cq|o6R*#6dQ zhvlwYR+ip|TCMJ`9-)HKt1X9EmzO3xFk2^{sp}c-U&tussnDRiL1t!)ev+F1{LhF# zl0QY{xOEFEEdv(jFe?46N70_VK8UhK)D$p0x`W z;3qi$L30*!xH4($L4PnVLJdz5*Py1CqlPdLg@nRD1d6ykl9T>Df;6aW6mec8#R)I# zSQ%LC*S#p~TZdb*Z65Flmy2!dW3I4qIGZ&m>ht~JGl%cjC|DRzp=L#ld*h$R4N@;= zl-cvS4QTE?N~FRUb+ZIj2m}HNv1&C%!ap7*6o1QqHSUp%V>)sd3ZM6#87sN>mNRqI zx-gr&-%90&O=mUB&4vE=gOb+wdcr${C%`P2UI;j*g#X6H-3XOupG$5nlb=gI5cN%r zF)D4LmPemB(>w&0a-%TBp zBVNggyjmuAmFcq$qtBxI)b5RmPTM+1=Vl&#vAq?>0V4^?i9oJA(aktZVYi{-2j#aBkEwYl2*wCk&d$$0Dl3BDM2q zTDS*GZo7TzShYA-`Yh}7XtHgZ_4RCcuHJXJpXB$>i~L~tZ{v-vXBlG^_N{!YZ>35s&!o_J-v zmx>PwM^aHD;FOdIzBo@WB@e{vl~f5nN(5zZyefR&V3VwO30327z1n-HZS1nU_4|RK z3S)oYyXE=Xf2dCuj@qLv1AcT~$(gz?d7jR0etJ>j)R}Tas|rCAF6-4L=KOn@Y?*FK zT$vqV^IB3yc2lR*P$eYfZBRTnu=4EW+0IN_OV@Kml&j@|E3=adZm1)41$??MPAtBA z{=VeJNqO#C@+@N$&sQ6|vAY7{kA=^c{dhPvIi+6rBmI79N48I$0nT2=VIuQ$&i88PEMXLRlsLz?O!u6EcZ;_>pIEr081~p_ z(A*#o$81S<7d-cKdupC0ie|l-sJcy;Kb3a&j(SIYLd#(Lc?jQpc3-6nf5)IH_j-sS zaa?OAU_imLrKxrJ9_HzR*|!TUmp|V4^JSR=F+gTN$Kelx-J+_>RPoC_7=R7zp3LDe z;=Fmm>Q;+;uT|4wN^`s{FqV~!m2%R4*)i^G+|E#di9Al%-VkLRLqkQ2r*L859gEA% z|GDn-EklLdQ&J|z`06t|Eb%v8`i9iZOkA}a4)qWF4*0kgT@J9>yWQy(^TaTbhArp~ zT_)(t+M7b1*ecWtEn1rd2zu%t9I2WM#2imAWIHnoOP@X6ZS$2j?ak^V&%|N>I#(}E zs46Y#INgI2$w{nyYoihBJdSr_*3{llIXN>+8jKe68DA>%yL|k#MhJCtj?I&ZhXyL5 zZDrxQmZCQgOHOpr$1jDEnW=7^>G2<;Ouc6b&zD*fDYfg$>%B@=B55T&aE?!w$o2Ip zq4^nd=B|FuS(};9ao&9gXL8+m+LDLQdCe7yLqf(iH^hB9ZnvurBx)UL@+(Jmw~&|Q z)25GII8xB!D`MjzJ5^^SA=8LHXJe}IFkdg!!GRY`C{Qkoa390W5eOp16m}Clh28M? zDo3LccV;IcIpV*$GrKsF5{BPeTO0bnBNzLql7Z;)Q_S@d-?G2YYWp`lS`O8ls8>UMeFE0QW&cVY#|FB9$cT+c-6(@J>BRl>x(Jq2s{Pl2Isn`{CAm3!Hyp6 z9PM#G3y-qBc%Tx0Aknv|l#6G4Pymkhc;-F5b2}d|%ESD70g&)YiYiWjCy2Z2VmE<5 zg+K6X>BTwHBM(M6yd0h$MFn;{KtTXcivWcND<^i>4M3rI9rh0Y1)=%i4o`D3_ZC(( z{gO!0LROVasWhq}M+yQ6^Xjy66~ZRA~VXs2`T3$Eeuf*?agH`DhYd`mZ@rtxCEEL4k7)A3ek}0=sUmY8Y?={Tm zo%vs8QR}TG>@8JSKCBi0b%CKoKT@F3ShHGqN9sdRj!$z2or5QS4aWKi{_it*$mcTo zKkNsOJm7mCZ2+pDUqAKlDjHpURAxgzu+ELg{&q=-feK(K5J-_;6|b|s5@+Ne@CnE& z^*hW`F|5{pdo^Lyat@!Z;^a+Sw?6BP(%g(%j1Dt$M@9K#yQPP}`Mx<{v|PWQVA8Vh zgpe57?HJQ2Uh@t$dN#~4GW6=!6G3U3*9;s9y%OBKP}Xw^<&5f~FWO(03#xu}bP!LD z1kkPSTkKGd!JIGYlgmSgHlVC&s@#3^KCx8r#ntl0=%20$`<@2v*nBr4$9Kdwn(+F| zzp9<}tn$BRkyV;pd-2n`3ESG!Mblv$#{yq09J-r^S34kBg1Rxp#=E>`6(}yo`d0no tShsEAcFLC!oTM8!Zodn2D1w#QOCZxdsl8Sefg`9HN&f?ogt delta 6933 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 diff --git a/lib/Microsoft.VSSDK.UnitTestLibrary.dll b/lib/Microsoft.VSSDK.UnitTestLibrary.dll index 6104a3718226116c541e1f722aad8d2154c7c51b..e53bc7fe848469a29c7198741b736afe0ab0ac3b 100644 GIT binary patch delta 19121 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 delta 19195 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 Date: Mon, 28 Aug 2017 09:09:16 +0300 Subject: [PATCH 02/71] TEST --- CodeMaid/CodeMaidPackage.cs | 930 ++++++++++++++++++------------------ 1 file changed, 478 insertions(+), 452 deletions(-) diff --git a/CodeMaid/CodeMaidPackage.cs b/CodeMaid/CodeMaidPackage.cs index 72881ab4..a58fdb5a 100644 --- a/CodeMaid/CodeMaidPackage.cs +++ b/CodeMaid/CodeMaidPackage.cs @@ -25,456 +25,482 @@ namespace SteveCadwallader.CodeMaid { - ///

- /// This is the class that implements the package exposed by this assembly. - /// - /// The minimum requirement for a class to be considered a valid package for Visual Studio is to - /// implement the IVsPackage interface and register itself with the shell. This package uses the - /// helper classes defined inside the Managed Package Framework (MPF) to do it: it derives from - /// the Package class that provides the implementation of the IVsPackage interface and uses the - /// registration attributes defined in the framework to register itself and its components with - /// the shell. - /// - [PackageRegistration(UseManagedResourcesOnly = true)] // Tells Visual Studio utilities that this is a package that needs registered. - [InstalledProductRegistration("#110", "#112", Vsix.Version, IconResourceID = 400, LanguageIndependentName = "CodeMaid")] // VS Help/About details (Name, Description, Version, Icon). - [ProvideAutoLoad("ADFC4E64-0397-11D1-9F4E-00A0C911004F")] // Force CodeMaid to load on startup so menu items can determine their state. - [ProvideBindingPath] - [ProvideMenuResource(1000, 1)] // This attribute is needed to let the shell know that this package exposes some menus. - [ProvideToolWindow(typeof(BuildProgressToolWindow), MultiInstances = false, Height = 40, Width = 500, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Bottom, Window = EnvDTE.Constants.vsWindowKindMainWindow)] - [ProvideToolWindow(typeof(SpadeToolWindow), MultiInstances = false, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Left, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)] - [ProvideToolWindowVisibility(typeof(SpadeToolWindow), "{F1536EF8-92EC-443C-9ED7-FDADF150DA82}")] - [Guid(PackageGuids.GuidCodeMaidPackageString)] // Package unique GUID. - public sealed class CodeMaidPackage : Package, IVsInstalledProduct - { - #region Fields - - /// - /// The build progress tool window. - /// - private BuildProgressToolWindow _buildProgress; - - /// - /// An internal collection of the commands registered by this package. - /// - private readonly ICollection _commands = new List(); - - /// - /// The IComponentModel service. - /// - private IComponentModel _componentModel; - - /// - /// The top level application instance of the VS IDE that is executing this package. - /// - private DTE2 _ide; - - /// - /// The service provider. - /// - private IServiceProvider _serviceProvider; - - /// - /// The Spade tool window. - /// - private SpadeToolWindow _spade; - - /// - /// The theme manager. - /// - private ThemeManager _themeManager; - - #endregion Fields - - #region Constructors - - /// - /// Default constructor of the package. Inside this method you can place any initialization - /// code that does not require any Visual Studio service because at this point the package - /// object is created but not sited yet inside Visual Studio environment. The place to do - /// all the other initialization is the Initialize method. - /// - public CodeMaidPackage() - { - Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this)); - - if (Application.Current != null) - { - Application.Current.DispatcherUnhandledException += OnDispatcherUnhandledException; - } - - // If an existing user settings file cannot be found, perform a one-time settings upgrade. - if (!File.Exists(SettingsContextHelper.GetUserSettingsPath())) - { - Settings.Default.Upgrade(); - Settings.Default.Save(); - } - } - - #endregion Constructors - - #region Public Integration Properties - - /// - /// Gets the currently active document, otherwise null. - /// - public Document ActiveDocument - { - get - { - try - { - return IDE.ActiveDocument; - } - catch (Exception) - { - // If a project property page is active, accessing the ActiveDocument causes an exception. - return null; - } - } - } - - /// - /// Gets the build progress tool window, creating it if necessary. - /// - public BuildProgressToolWindow BuildProgress => - _buildProgress ?? (_buildProgress = (FindToolWindow(typeof(BuildProgressToolWindow), 0, true) as BuildProgressToolWindow)); - - /// - /// Gets the IComponentModel service. - /// - public IComponentModel ComponentModel => - _componentModel ?? (_componentModel = GetGlobalService(typeof(SComponentModel)) as IComponentModel); - - /// - /// Gets the top level application instance of the VS IDE that is executing this package. - /// - public DTE2 IDE => _ide ?? (_ide = (DTE2)GetService(typeof(DTE))); - - /// - /// Gets the version of the running IDE instance. - /// - public double IDEVersion => Convert.ToDouble(IDE.Version, CultureInfo.InvariantCulture); - - /// - /// Gets or sets a flag indicating if CodeMaid is running inside an AutoSave context. - /// - public bool IsAutoSaveContext { get; set; } - - /// - /// Gets the menu command service. - /// - public OleMenuCommandService MenuCommandService => GetService(typeof(IMenuCommandService)) as OleMenuCommandService; - - /// - /// Gets the service provider. - /// - public IServiceProvider ServiceProvider => _serviceProvider ?? (_serviceProvider = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)IDE)); - - /// - /// Gets the Spade tool window, iff it already exists. - /// - public SpadeToolWindow Spade => - _spade ?? (_spade = (FindToolWindow(typeof(SpadeToolWindow), 0, false) as SpadeToolWindow)); - - /// - /// Gets the Spade tool window, creating it if necessary. - /// - public SpadeToolWindow SpadeForceLoad => - _spade ?? (_spade = (FindToolWindow(typeof(SpadeToolWindow), 0, true) as SpadeToolWindow)); - - /// - /// Gets the theme manager. - /// - public ThemeManager ThemeManager => _themeManager ?? (_themeManager = ThemeManager.GetInstance(this)); - - #endregion Public Integration Properties - - #region Private Event Listener Properties - - /// - /// Gets or sets the build progress event listener. - /// - private BuildProgressEventListener BuildProgressEventListener { get; set; } - - /// - /// Gets or sets the document event listener. - /// - private DocumentEventListener DocumentEventListener { get; set; } - - /// - /// Gets or sets the running document table event listener. - /// - private RunningDocumentTableEventListener RunningDocumentTableEventListener { get; set; } - - /// - /// Gets or sets the shell event listener. - /// - private ShellEventListener ShellEventListener { get; set; } - - /// - /// Gets or sets the solution event listener. - /// - private SolutionEventListener SolutionEventListener { get; set; } - - /// - /// Gets or sets the text editor event listener. - /// - private TextEditorEventListener TextEditorEventListener { get; set; } - - /// - /// Gets or sets the window event listener. - /// - private WindowEventListener WindowEventListener { get; set; } - - #endregion Private Event Listener Properties - - #region Private Service Properties - - /// - /// Gets the shell service. - /// - private IVsShell ShellService => GetService(typeof(SVsShell)) as IVsShell; - - #endregion Private Service Properties - - #region Package Members - - /// - /// Initialization of the package; this method is called right after the package is sited, - /// so this is the place where you can put all the initialization code that rely on services - /// provided by VisualStudio. - /// - protected override void Initialize() - { - Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this)); - base.Initialize(); - - RegisterCommands(); - RegisterShellEventListener(); - } - - #endregion Package Members - - #region IVsInstalledProduct Members - - public int IdBmpSplash(out uint pIdBmp) - { - pIdBmp = 400; - return VSConstants.S_OK; - } - - public int IdIcoLogoForAboutbox(out uint pIdIco) - { - pIdIco = 400; - return VSConstants.S_OK; - } - - public int OfficialName(out string pbstrName) - { - pbstrName = GetResourceString("@110"); - return VSConstants.S_OK; - } - - public int ProductDetails(out string pbstrProductDetails) - { - pbstrProductDetails = GetResourceString("@112"); - return VSConstants.S_OK; - } - - public int ProductID(out string pbstrPID) - { - pbstrPID = GetResourceString("@114"); - return VSConstants.S_OK; - } - - public string GetResourceString(string resourceName) - { - string resourceValue; - var resourceManager = (IVsResourceManager)GetService(typeof(SVsResourceManager)); - if (resourceManager == null) - { - throw new InvalidOperationException( - "Could not get SVsResourceManager service. Make sure that the package is sited before calling this method"); - } - - Guid packageGuid = GetType().GUID; - int hr = resourceManager.LoadResourceString( - ref packageGuid, -1, resourceName, out resourceValue); - ErrorHandler.ThrowOnFailure(hr); - - return resourceValue; - } - - #endregion IVsInstalledProduct Members - - #region Private Methods - - /// - /// Called when a DispatcherUnhandledException is raised by Visual Studio. - /// - /// The sender. - /// - /// The instance containing the event data. - /// - private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) - { - if (!Settings.Default.General_DiagnosticsMode) return; - - OutputWindowHelper.ExceptionWriteLine("Diagnostics mode caught and marked as handled the following DispatcherUnhandledException raised in Visual Studio", e.Exception); - e.Handled = true; - } - - /// - /// Called when a solution is closed to conditionally show the start page. - /// - private void OnSolutionClosedShowStartPage() - { - if (!Settings.Default.General_ShowStartPageOnSolutionClose) return; - - IDE.ExecuteCommand("View.StartPage"); - } - - /// - /// Register the package commands (which must exist in the .vsct file). - /// - private void RegisterCommands() - { - var menuCommandService = MenuCommandService; - if (menuCommandService != null) - { - // Create the individual commands, which internally register for command events. - _commands.Add(new AboutCommand(this)); - _commands.Add(new BuildProgressToolWindowCommand(this)); - _commands.Add(new CleanupActiveCodeCommand(this)); - _commands.Add(new CleanupAllCodeCommand(this)); - _commands.Add(new CleanupOpenCodeCommand(this)); - _commands.Add(new CleanupSelectedCodeCommand(this)); - _commands.Add(new CloseAllReadOnlyCommand(this)); - _commands.Add(new CollapseAllSolutionExplorerCommand(this)); - _commands.Add(new CollapseSelectedSolutionExplorerCommand(this)); - _commands.Add(new CommentFormatCommand(this)); - _commands.Add(new FindInSolutionExplorerCommand(this)); - _commands.Add(new JoinLinesCommand(this)); - _commands.Add(new OptionsCommand(this)); - _commands.Add(new ReadOnlyToggleCommand(this)); - _commands.Add(new RemoveRegionCommand(this)); - _commands.Add(new ReorganizeActiveCodeCommand(this)); - _commands.Add(new SettingCleanupOnSaveCommand(this)); - _commands.Add(new SortLinesCommand(this)); - _commands.Add(new SpadeContextDeleteCommand(this)); - _commands.Add(new SpadeContextFindReferencesCommand(this)); - _commands.Add(new SpadeContextInsertRegionCommand(this)); - _commands.Add(new SpadeContextRemoveRegionCommand(this)); - _commands.Add(new SpadeOptionsCommand(this)); - _commands.Add(new SpadeRefreshCommand(this)); - _commands.Add(new SpadeSearchCommand(this)); - _commands.Add(new SpadeSortOrderAlphaCommand(this)); - _commands.Add(new SpadeSortOrderFileCommand(this)); - _commands.Add(new SpadeSortOrderTypeCommand(this)); - _commands.Add(new SpadeToolWindowCommand(this)); - _commands.Add(new SwitchFileCommand(this)); - - // Add all commands to the menu command service. - foreach (var command in _commands) - { - menuCommandService.AddCommand(command); - } - } - } - - /// - /// Registers the shell event listener. - /// - /// - /// This event listener is registered by itself and first to wait for the shell to be ready - /// for other event listeners to be registered. - /// - private void RegisterShellEventListener() - { - ShellEventListener = new ShellEventListener(this, ShellService); - ShellEventListener.EnvironmentColorChanged += () => ThemeManager.ApplyTheme(); - ShellEventListener.ShellAvailable += RegisterNonShellEventListeners; - } - - /// - /// Register the package event listeners. - /// - /// - /// This must occur after the DTE service is available since many of the events are based - /// off of the DTE object. - /// - private void RegisterNonShellEventListeners() - { - // Create event listeners and register for events. - var menuCommandService = MenuCommandService; - if (menuCommandService != null) - { - var buildProgressToolWindowCommand = _commands.OfType().First(); - var cleanupActiveCodeCommand = _commands.OfType().First(); - var collapseAllSolutionExplorerCommand = _commands.OfType().First(); - var spadeToolWindowCommand = _commands.OfType().First(); - - var codeModelManager = CodeModelManager.GetInstance(this); - var settingsContextHelper = SettingsContextHelper.GetInstance(this); - - BuildProgressEventListener = new BuildProgressEventListener(this); - BuildProgressEventListener.BuildBegin += buildProgressToolWindowCommand.OnBuildBegin; - BuildProgressEventListener.BuildProjConfigBegin += buildProgressToolWindowCommand.OnBuildProjConfigBegin; - BuildProgressEventListener.BuildProjConfigDone += buildProgressToolWindowCommand.OnBuildProjConfigDone; - BuildProgressEventListener.BuildDone += buildProgressToolWindowCommand.OnBuildDone; - - DocumentEventListener = new DocumentEventListener(this); - DocumentEventListener.OnDocumentClosing += codeModelManager.OnDocumentClosing; - - RunningDocumentTableEventListener = new RunningDocumentTableEventListener(this); - RunningDocumentTableEventListener.BeforeSave += cleanupActiveCodeCommand.OnBeforeDocumentSave; - RunningDocumentTableEventListener.AfterSave += spadeToolWindowCommand.OnAfterDocumentSave; - - SolutionEventListener = new SolutionEventListener(this); - SolutionEventListener.OnSolutionOpened += collapseAllSolutionExplorerCommand.OnSolutionOpened; - SolutionEventListener.OnSolutionOpened += settingsContextHelper.OnSolutionOpened; - SolutionEventListener.OnSolutionClosed += settingsContextHelper.OnSolutionClosed; - SolutionEventListener.OnSolutionClosed += OnSolutionClosedShowStartPage; - - // Check if a solution has already been opened before CodeMaid was initialized. - if (IDE.Solution != null && IDE.Solution.IsOpen) - { - collapseAllSolutionExplorerCommand.OnSolutionOpened(); - } - - TextEditorEventListener = new TextEditorEventListener(this); - TextEditorEventListener.OnLineChanged += codeModelManager.OnDocumentChanged; - - WindowEventListener = new WindowEventListener(this); - WindowEventListener.OnWindowChange += spadeToolWindowCommand.OnWindowChange; - } - } - - #endregion Private Methods - - #region IDisposable Members - - /// - /// Releases unmanaged and - optionally - managed resources - /// - /// - /// true to release both managed and unmanaged resources; false to release - /// only unmanaged resources. - /// - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - - // Dispose of any event listeners. - BuildProgressEventListener?.Dispose(); - DocumentEventListener?.Dispose(); - RunningDocumentTableEventListener?.Dispose(); - ShellEventListener?.Dispose(); - SolutionEventListener?.Dispose(); - TextEditorEventListener?.Dispose(); - WindowEventListener?.Dispose(); - } - - #endregion IDisposable Members - } + /// + /// This is the class that implements the package exposed by this assembly. + /// + /// The minimum requirement for a class to be considered a valid package for Visual Studio is to + /// implement the IVsPackage interface and register itself with the shell. This package uses the + /// helper classes defined inside the Managed Package Framework (MPF) to do it: it derives from + /// the Package class that provides the implementation of the IVsPackage interface and uses the + /// registration attributes defined in the framework to register itself and its components with + /// the shell. + /// + [PackageRegistration(UseManagedResourcesOnly = true)] // Tells Visual Studio utilities that this is a package that needs registered. + [InstalledProductRegistration("#110", "#112", Vsix.Version, IconResourceID = 400, LanguageIndependentName = "CodeMaid")] // VS Help/About details (Name, Description, Version, Icon). + [ProvideAutoLoad("ADFC4E64-0397-11D1-9F4E-00A0C911004F")] // Force CodeMaid to load on startup so menu items can determine their state. + [ProvideBindingPath] + [ProvideMenuResource(1000, 1)] // This attribute is needed to let the shell know that this package exposes some menus. + [ProvideToolWindow(typeof(BuildProgressToolWindow), MultiInstances = false, Height = 40, Width = 500, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Bottom, Window = EnvDTE.Constants.vsWindowKindMainWindow)] + [ProvideToolWindow(typeof(SpadeToolWindow), MultiInstances = false, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Left, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)] + [ProvideToolWindowVisibility(typeof(SpadeToolWindow), "{F1536EF8-92EC-443C-9ED7-FDADF150DA82}")] + [Guid(PackageGuids.GuidCodeMaidPackageString)] // Package unique GUID. + public sealed class CodeMaidPackage : Package, IVsInstalledProduct + { + #region Fields + + /// + /// The build progress tool window. + /// + private BuildProgressToolWindow _buildProgress; + + /// + /// An internal collection of the commands registered by this package. + /// + private readonly ICollection _commands = new List(); + + /// + /// The IComponentModel service. + /// + private IComponentModel _componentModel; + + /// + /// The top level application instance of the VS IDE that is executing this package. + /// + private DTE2 _ide; + + /// + /// The service provider. + /// + private IServiceProvider _serviceProvider; + + /// + /// The Spade tool window. + /// + private SpadeToolWindow _spade; + + /// + /// The theme manager. + /// + private ThemeManager _themeManager; + + #endregion Fields + + #region Constructors + + /// + /// Default constructor of the package. Inside this method you can place any initialization + /// code that does not require any Visual Studio service because at this point the package + /// object is created but not sited yet inside Visual Studio environment. The place to do + /// all the other initialization is the Initialize method. + /// + public CodeMaidPackage() + { + Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this)); + + if (Application.Current != null) + { + Application.Current.DispatcherUnhandledException += OnDispatcherUnhandledException; + } + + // If an existing user settings file cannot be found, perform a one-time settings upgrade. + if (!File.Exists(SettingsContextHelper.GetUserSettingsPath())) + { + Settings.Default.Upgrade(); + Settings.Default.Save(); + } + } + + #endregion Constructors + + #region Public Integration Properties + + /// + /// Gets the currently active document, otherwise null. + /// + public Document ActiveDocument + { + get + { + try + { + return IDE.ActiveDocument; + } + catch (Exception) + { + // If a project property page is active, accessing the ActiveDocument causes an exception. + return null; + } + } + } + + /// + /// Gets the build progress tool window, creating it if necessary. + /// + public BuildProgressToolWindow BuildProgress => + _buildProgress ?? (_buildProgress = (FindToolWindow(typeof(BuildProgressToolWindow), 0, true) as BuildProgressToolWindow)); + + /// + /// Gets the IComponentModel service. + /// + public IComponentModel ComponentModel => + _componentModel ?? (_componentModel = GetGlobalService(typeof(SComponentModel)) as IComponentModel); + + /// + /// Gets the top level application instance of the VS IDE that is executing this package. + /// + public DTE2 IDE => _ide ?? (_ide = (DTE2)GetService(typeof(DTE))); + + /// + /// Gets the version of the running IDE instance. + /// + public double IDEVersion => Convert.ToDouble(IDE.Version, CultureInfo.InvariantCulture); + + /// + /// Gets or sets a flag indicating if CodeMaid is running inside an AutoSave context. + /// + public bool IsAutoSaveContext + { + get; set; + } + + /// + /// Gets the menu command service. + /// + public OleMenuCommandService MenuCommandService => GetService(typeof(IMenuCommandService)) as OleMenuCommandService; + + /// + /// Gets the service provider. + /// + public IServiceProvider ServiceProvider => _serviceProvider ?? (_serviceProvider = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)IDE)); + + /// + /// Gets the Spade tool window, iff it already exists. + /// + public SpadeToolWindow Spade => + _spade ?? (_spade = (FindToolWindow(typeof(SpadeToolWindow), 0, false) as SpadeToolWindow)); + + /// + /// Gets the Spade tool window, creating it if necessary. + /// + public SpadeToolWindow SpadeForceLoad => + _spade ?? (_spade = (FindToolWindow(typeof(SpadeToolWindow), 0, true) as SpadeToolWindow)); + + /// + /// Gets the theme manager. + /// + public ThemeManager ThemeManager => _themeManager ?? (_themeManager = ThemeManager.GetInstance(this)); + + #endregion Public Integration Properties + + #region Private Event Listener Properties + + /// + /// Gets or sets the build progress event listener. + /// + private BuildProgressEventListener BuildProgressEventListener + { + get; set; + } + + /// + /// Gets or sets the document event listener. + /// + private DocumentEventListener DocumentEventListener + { + get; set; + } + + /// + /// Gets or sets the running document table event listener. + /// + private RunningDocumentTableEventListener RunningDocumentTableEventListener + { + get; set; + } + + /// + /// Gets or sets the shell event listener. + /// + private ShellEventListener ShellEventListener + { + get; set; + } + + /// + /// Gets or sets the solution event listener. + /// + private SolutionEventListener SolutionEventListener + { + get; set; + } + + /// + /// Gets or sets the text editor event listener. + /// + private TextEditorEventListener TextEditorEventListener + { + get; set; + } + + /// + /// Gets or sets the window event listener. + /// + private WindowEventListener WindowEventListener + { + get; set; + } + + #endregion Private Event Listener Properties + + #region Private Service Properties + + /// + /// Gets the shell service. + /// + private IVsShell ShellService => GetService(typeof(SVsShell)) as IVsShell; + + #endregion Private Service Properties + + #region Package Members + + /// + /// Initialization of the package; this method is called right after the package is sited, + /// so this is the place where you can put all the initialization code that rely on services + /// provided by VisualStudio. + /// + protected override void Initialize() + { + Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this)); + base.Initialize(); + + RegisterCommands(); + RegisterShellEventListener(); + } + + #endregion Package Members + + #region IVsInstalledProduct Members + + public int IdBmpSplash(out uint pIdBmp) + { + pIdBmp = 400; + return VSConstants.S_OK; + } + + public int IdIcoLogoForAboutbox(out uint pIdIco) + { + pIdIco = 400; + return VSConstants.S_OK; + } + + public int OfficialName(out string pbstrName) + { + pbstrName = GetResourceString("@110"); + return VSConstants.S_OK; + } + + public int ProductDetails(out string pbstrProductDetails) + { + pbstrProductDetails = GetResourceString("@112"); + return VSConstants.S_OK; + } + + public int ProductID(out string pbstrPID) + { + pbstrPID = GetResourceString("@114"); + return VSConstants.S_OK; + } + + public string GetResourceString(string resourceName) + { + string resourceValue; + var resourceManager = (IVsResourceManager)GetService(typeof(SVsResourceManager)); + if (resourceManager == null) + { + throw new InvalidOperationException( + "Could not get SVsResourceManager service. Make sure that the package is sited before calling this method"); + } + + Guid packageGuid = GetType().GUID; + int hr = resourceManager.LoadResourceString( + ref packageGuid, -1, resourceName, out resourceValue); + ErrorHandler.ThrowOnFailure(hr); + + return resourceValue; + } + + #endregion IVsInstalledProduct Members + + #region Private Methods + + /// + /// Called when a DispatcherUnhandledException is raised by Visual Studio. + /// + /// The sender. + /// + /// The instance containing the event data. + /// + private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) + { + if (!Settings.Default.General_DiagnosticsMode) + return; + + OutputWindowHelper.ExceptionWriteLine("Diagnostics mode caught and marked as handled the following DispatcherUnhandledException raised in Visual Studio", e.Exception); + e.Handled = true; + } + + /// + /// Called when a solution is closed to conditionally show the start page. + /// + private void OnSolutionClosedShowStartPage() + { + if (!Settings.Default.General_ShowStartPageOnSolutionClose) + return; + + IDE.ExecuteCommand("View.StartPage"); + } + + /// + /// Register the package commands (which must exist in the .vsct file). + /// + private void RegisterCommands() + { + var menuCommandService = MenuCommandService; + if (menuCommandService != null) + { + // Create the individual commands, which internally register for command events. + _commands.Add(new AboutCommand(this)); + _commands.Add(new BuildProgressToolWindowCommand(this)); + _commands.Add(new CleanupActiveCodeCommand(this)); + _commands.Add(new CleanupAllCodeCommand(this)); + _commands.Add(new CleanupOpenCodeCommand(this)); + _commands.Add(new CleanupSelectedCodeCommand(this)); + _commands.Add(new CloseAllReadOnlyCommand(this)); + _commands.Add(new CollapseAllSolutionExplorerCommand(this)); + _commands.Add(new CollapseSelectedSolutionExplorerCommand(this)); + _commands.Add(new CommentFormatCommand(this)); + _commands.Add(new FindInSolutionExplorerCommand(this)); + _commands.Add(new JoinLinesCommand(this)); + _commands.Add(new OptionsCommand(this)); + _commands.Add(new ReadOnlyToggleCommand(this)); + _commands.Add(new RemoveRegionCommand(this)); + _commands.Add(new ReorganizeActiveCodeCommand(this)); + _commands.Add(new SettingCleanupOnSaveCommand(this)); + _commands.Add(new SortLinesCommand(this)); + _commands.Add(new SpadeContextDeleteCommand(this)); + _commands.Add(new SpadeContextFindReferencesCommand(this)); + _commands.Add(new SpadeContextInsertRegionCommand(this)); + _commands.Add(new SpadeContextRemoveRegionCommand(this)); + _commands.Add(new SpadeOptionsCommand(this)); + _commands.Add(new SpadeRefreshCommand(this)); + _commands.Add(new SpadeSearchCommand(this)); + _commands.Add(new SpadeSortOrderAlphaCommand(this)); + _commands.Add(new SpadeSortOrderFileCommand(this)); + _commands.Add(new SpadeSortOrderTypeCommand(this)); + _commands.Add(new SpadeToolWindowCommand(this)); + _commands.Add(new SwitchFileCommand(this)); + + // Add all commands to the menu command service. + foreach (var command in _commands) + { + menuCommandService.AddCommand(command); + } + } + } + + /// + /// Registers the shell event listener. + /// + /// + /// This event listener is registered by itself and first to wait for the shell to be ready + /// for other event listeners to be registered. + /// + private void RegisterShellEventListener() + { + ShellEventListener = new ShellEventListener(this, ShellService); + ShellEventListener.EnvironmentColorChanged += () => ThemeManager.ApplyTheme(); + ShellEventListener.ShellAvailable += RegisterNonShellEventListeners; + } + + /// + /// Register the package event listeners. + /// + /// + /// This must occur after the DTE service is available since many of the events are based + /// off of the DTE object. + /// + private void RegisterNonShellEventListeners() + { + // Create event listeners and register for events. + var menuCommandService = MenuCommandService; + if (menuCommandService != null) + { + var buildProgressToolWindowCommand = _commands.OfType().First(); + var cleanupActiveCodeCommand = _commands.OfType().First(); + var collapseAllSolutionExplorerCommand = _commands.OfType().First(); + var spadeToolWindowCommand = _commands.OfType().First(); + + var codeModelManager = CodeModelManager.GetInstance(this); + var settingsContextHelper = SettingsContextHelper.GetInstance(this); + + BuildProgressEventListener = new BuildProgressEventListener(this); + BuildProgressEventListener.BuildBegin += buildProgressToolWindowCommand.OnBuildBegin; + BuildProgressEventListener.BuildProjConfigBegin += buildProgressToolWindowCommand.OnBuildProjConfigBegin; + BuildProgressEventListener.BuildProjConfigDone += buildProgressToolWindowCommand.OnBuildProjConfigDone; + BuildProgressEventListener.BuildDone += buildProgressToolWindowCommand.OnBuildDone; + + DocumentEventListener = new DocumentEventListener(this); + DocumentEventListener.OnDocumentClosing += codeModelManager.OnDocumentClosing; + + RunningDocumentTableEventListener = new RunningDocumentTableEventListener(this); + RunningDocumentTableEventListener.BeforeSave += cleanupActiveCodeCommand.OnBeforeDocumentSave; + RunningDocumentTableEventListener.AfterSave += spadeToolWindowCommand.OnAfterDocumentSave; + + SolutionEventListener = new SolutionEventListener(this); + SolutionEventListener.OnSolutionOpened += collapseAllSolutionExplorerCommand.OnSolutionOpened; + SolutionEventListener.OnSolutionOpened += settingsContextHelper.OnSolutionOpened; + SolutionEventListener.OnSolutionClosed += settingsContextHelper.OnSolutionClosed; + SolutionEventListener.OnSolutionClosed += OnSolutionClosedShowStartPage; + + // Check if a solution has already been opened before CodeMaid was initialized. + if (IDE.Solution != null && IDE.Solution.IsOpen) + { + collapseAllSolutionExplorerCommand.OnSolutionOpened(); + } + + TextEditorEventListener = new TextEditorEventListener(this); + TextEditorEventListener.OnLineChanged += codeModelManager.OnDocumentChanged; + + WindowEventListener = new WindowEventListener(this); + WindowEventListener.OnWindowChange += spadeToolWindowCommand.OnWindowChange; + } + } + + #endregion Private Methods + + #region IDisposable Members + + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// + /// true to release both managed and unmanaged resources; false to release + /// only unmanaged resources. + /// + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + // Dispose of any event listeners. + BuildProgressEventListener?.Dispose(); + DocumentEventListener?.Dispose(); + RunningDocumentTableEventListener?.Dispose(); + ShellEventListener?.Dispose(); + SolutionEventListener?.Dispose(); + TextEditorEventListener?.Dispose(); + WindowEventListener?.Dispose(); + } + + #endregion IDisposable Members + } } \ No newline at end of file From d1f215850bea103c528ffe42f625c93ffec40c6f Mon Sep 17 00:00:00 2001 From: Dmytro Ovcharov Date: Mon, 28 Aug 2017 10:12:55 +0300 Subject: [PATCH 03/71] Implemented RadialProgressBar in SpadeToolbar --- CodeMaid/CodeMaid.csproj | 8 + CodeMaid/CodeMaidPackage.cs | 930 +++++++++--------- .../ToolWindows/Spade/RadialProgressBar.xaml | 139 +++ .../Spade/RadialProgressBar.xaml.cs | 12 + CodeMaid/UI/ToolWindows/Spade/SpadeView.xaml | 19 +- .../UI/ToolWindows/Spade/WidthConverter.cs | 19 + 6 files changed, 642 insertions(+), 485 deletions(-) create mode 100644 CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml create mode 100644 CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml.cs create mode 100644 CodeMaid/UI/ToolWindows/Spade/WidthConverter.cs diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 5fbf19fa..419499e1 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -392,11 +392,15 @@ + + RadialProgressBar.xaml + SpadeView.xaml + @@ -765,6 +769,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + MSBuild:Compile Designer diff --git a/CodeMaid/CodeMaidPackage.cs b/CodeMaid/CodeMaidPackage.cs index a58fdb5a..72881ab4 100644 --- a/CodeMaid/CodeMaidPackage.cs +++ b/CodeMaid/CodeMaidPackage.cs @@ -25,482 +25,456 @@ namespace SteveCadwallader.CodeMaid { - /// - /// This is the class that implements the package exposed by this assembly. - /// - /// The minimum requirement for a class to be considered a valid package for Visual Studio is to - /// implement the IVsPackage interface and register itself with the shell. This package uses the - /// helper classes defined inside the Managed Package Framework (MPF) to do it: it derives from - /// the Package class that provides the implementation of the IVsPackage interface and uses the - /// registration attributes defined in the framework to register itself and its components with - /// the shell. - /// - [PackageRegistration(UseManagedResourcesOnly = true)] // Tells Visual Studio utilities that this is a package that needs registered. - [InstalledProductRegistration("#110", "#112", Vsix.Version, IconResourceID = 400, LanguageIndependentName = "CodeMaid")] // VS Help/About details (Name, Description, Version, Icon). - [ProvideAutoLoad("ADFC4E64-0397-11D1-9F4E-00A0C911004F")] // Force CodeMaid to load on startup so menu items can determine their state. - [ProvideBindingPath] - [ProvideMenuResource(1000, 1)] // This attribute is needed to let the shell know that this package exposes some menus. - [ProvideToolWindow(typeof(BuildProgressToolWindow), MultiInstances = false, Height = 40, Width = 500, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Bottom, Window = EnvDTE.Constants.vsWindowKindMainWindow)] - [ProvideToolWindow(typeof(SpadeToolWindow), MultiInstances = false, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Left, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)] - [ProvideToolWindowVisibility(typeof(SpadeToolWindow), "{F1536EF8-92EC-443C-9ED7-FDADF150DA82}")] - [Guid(PackageGuids.GuidCodeMaidPackageString)] // Package unique GUID. - public sealed class CodeMaidPackage : Package, IVsInstalledProduct - { - #region Fields - - /// - /// The build progress tool window. - /// - private BuildProgressToolWindow _buildProgress; - - /// - /// An internal collection of the commands registered by this package. - /// - private readonly ICollection _commands = new List(); - - /// - /// The IComponentModel service. - /// - private IComponentModel _componentModel; - - /// - /// The top level application instance of the VS IDE that is executing this package. - /// - private DTE2 _ide; - - /// - /// The service provider. - /// - private IServiceProvider _serviceProvider; - - /// - /// The Spade tool window. - /// - private SpadeToolWindow _spade; - - /// - /// The theme manager. - /// - private ThemeManager _themeManager; - - #endregion Fields - - #region Constructors - - /// - /// Default constructor of the package. Inside this method you can place any initialization - /// code that does not require any Visual Studio service because at this point the package - /// object is created but not sited yet inside Visual Studio environment. The place to do - /// all the other initialization is the Initialize method. - /// - public CodeMaidPackage() - { - Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this)); - - if (Application.Current != null) - { - Application.Current.DispatcherUnhandledException += OnDispatcherUnhandledException; - } - - // If an existing user settings file cannot be found, perform a one-time settings upgrade. - if (!File.Exists(SettingsContextHelper.GetUserSettingsPath())) - { - Settings.Default.Upgrade(); - Settings.Default.Save(); - } - } - - #endregion Constructors - - #region Public Integration Properties - - /// - /// Gets the currently active document, otherwise null. - /// - public Document ActiveDocument - { - get - { - try - { - return IDE.ActiveDocument; - } - catch (Exception) - { - // If a project property page is active, accessing the ActiveDocument causes an exception. - return null; - } - } - } - - /// - /// Gets the build progress tool window, creating it if necessary. - /// - public BuildProgressToolWindow BuildProgress => - _buildProgress ?? (_buildProgress = (FindToolWindow(typeof(BuildProgressToolWindow), 0, true) as BuildProgressToolWindow)); - - /// - /// Gets the IComponentModel service. - /// - public IComponentModel ComponentModel => - _componentModel ?? (_componentModel = GetGlobalService(typeof(SComponentModel)) as IComponentModel); - - /// - /// Gets the top level application instance of the VS IDE that is executing this package. - /// - public DTE2 IDE => _ide ?? (_ide = (DTE2)GetService(typeof(DTE))); - - /// - /// Gets the version of the running IDE instance. - /// - public double IDEVersion => Convert.ToDouble(IDE.Version, CultureInfo.InvariantCulture); - - /// - /// Gets or sets a flag indicating if CodeMaid is running inside an AutoSave context. - /// - public bool IsAutoSaveContext - { - get; set; - } - - /// - /// Gets the menu command service. - /// - public OleMenuCommandService MenuCommandService => GetService(typeof(IMenuCommandService)) as OleMenuCommandService; - - /// - /// Gets the service provider. - /// - public IServiceProvider ServiceProvider => _serviceProvider ?? (_serviceProvider = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)IDE)); - - /// - /// Gets the Spade tool window, iff it already exists. - /// - public SpadeToolWindow Spade => - _spade ?? (_spade = (FindToolWindow(typeof(SpadeToolWindow), 0, false) as SpadeToolWindow)); - - /// - /// Gets the Spade tool window, creating it if necessary. - /// - public SpadeToolWindow SpadeForceLoad => - _spade ?? (_spade = (FindToolWindow(typeof(SpadeToolWindow), 0, true) as SpadeToolWindow)); - - /// - /// Gets the theme manager. - /// - public ThemeManager ThemeManager => _themeManager ?? (_themeManager = ThemeManager.GetInstance(this)); - - #endregion Public Integration Properties - - #region Private Event Listener Properties - - /// - /// Gets or sets the build progress event listener. - /// - private BuildProgressEventListener BuildProgressEventListener - { - get; set; - } - - /// - /// Gets or sets the document event listener. - /// - private DocumentEventListener DocumentEventListener - { - get; set; - } - - /// - /// Gets or sets the running document table event listener. - /// - private RunningDocumentTableEventListener RunningDocumentTableEventListener - { - get; set; - } - - /// - /// Gets or sets the shell event listener. - /// - private ShellEventListener ShellEventListener - { - get; set; - } - - /// - /// Gets or sets the solution event listener. - /// - private SolutionEventListener SolutionEventListener - { - get; set; - } - - /// - /// Gets or sets the text editor event listener. - /// - private TextEditorEventListener TextEditorEventListener - { - get; set; - } - - /// - /// Gets or sets the window event listener. - /// - private WindowEventListener WindowEventListener - { - get; set; - } - - #endregion Private Event Listener Properties - - #region Private Service Properties - - /// - /// Gets the shell service. - /// - private IVsShell ShellService => GetService(typeof(SVsShell)) as IVsShell; - - #endregion Private Service Properties - - #region Package Members - - /// - /// Initialization of the package; this method is called right after the package is sited, - /// so this is the place where you can put all the initialization code that rely on services - /// provided by VisualStudio. - /// - protected override void Initialize() - { - Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this)); - base.Initialize(); - - RegisterCommands(); - RegisterShellEventListener(); - } - - #endregion Package Members - - #region IVsInstalledProduct Members - - public int IdBmpSplash(out uint pIdBmp) - { - pIdBmp = 400; - return VSConstants.S_OK; - } - - public int IdIcoLogoForAboutbox(out uint pIdIco) - { - pIdIco = 400; - return VSConstants.S_OK; - } - - public int OfficialName(out string pbstrName) - { - pbstrName = GetResourceString("@110"); - return VSConstants.S_OK; - } - - public int ProductDetails(out string pbstrProductDetails) - { - pbstrProductDetails = GetResourceString("@112"); - return VSConstants.S_OK; - } - - public int ProductID(out string pbstrPID) - { - pbstrPID = GetResourceString("@114"); - return VSConstants.S_OK; - } - - public string GetResourceString(string resourceName) - { - string resourceValue; - var resourceManager = (IVsResourceManager)GetService(typeof(SVsResourceManager)); - if (resourceManager == null) - { - throw new InvalidOperationException( - "Could not get SVsResourceManager service. Make sure that the package is sited before calling this method"); - } - - Guid packageGuid = GetType().GUID; - int hr = resourceManager.LoadResourceString( - ref packageGuid, -1, resourceName, out resourceValue); - ErrorHandler.ThrowOnFailure(hr); - - return resourceValue; - } - - #endregion IVsInstalledProduct Members - - #region Private Methods - - /// - /// Called when a DispatcherUnhandledException is raised by Visual Studio. - /// - /// The sender. - /// - /// The instance containing the event data. - /// - private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) - { - if (!Settings.Default.General_DiagnosticsMode) - return; - - OutputWindowHelper.ExceptionWriteLine("Diagnostics mode caught and marked as handled the following DispatcherUnhandledException raised in Visual Studio", e.Exception); - e.Handled = true; - } - - /// - /// Called when a solution is closed to conditionally show the start page. - /// - private void OnSolutionClosedShowStartPage() - { - if (!Settings.Default.General_ShowStartPageOnSolutionClose) - return; - - IDE.ExecuteCommand("View.StartPage"); - } - - /// - /// Register the package commands (which must exist in the .vsct file). - /// - private void RegisterCommands() - { - var menuCommandService = MenuCommandService; - if (menuCommandService != null) - { - // Create the individual commands, which internally register for command events. - _commands.Add(new AboutCommand(this)); - _commands.Add(new BuildProgressToolWindowCommand(this)); - _commands.Add(new CleanupActiveCodeCommand(this)); - _commands.Add(new CleanupAllCodeCommand(this)); - _commands.Add(new CleanupOpenCodeCommand(this)); - _commands.Add(new CleanupSelectedCodeCommand(this)); - _commands.Add(new CloseAllReadOnlyCommand(this)); - _commands.Add(new CollapseAllSolutionExplorerCommand(this)); - _commands.Add(new CollapseSelectedSolutionExplorerCommand(this)); - _commands.Add(new CommentFormatCommand(this)); - _commands.Add(new FindInSolutionExplorerCommand(this)); - _commands.Add(new JoinLinesCommand(this)); - _commands.Add(new OptionsCommand(this)); - _commands.Add(new ReadOnlyToggleCommand(this)); - _commands.Add(new RemoveRegionCommand(this)); - _commands.Add(new ReorganizeActiveCodeCommand(this)); - _commands.Add(new SettingCleanupOnSaveCommand(this)); - _commands.Add(new SortLinesCommand(this)); - _commands.Add(new SpadeContextDeleteCommand(this)); - _commands.Add(new SpadeContextFindReferencesCommand(this)); - _commands.Add(new SpadeContextInsertRegionCommand(this)); - _commands.Add(new SpadeContextRemoveRegionCommand(this)); - _commands.Add(new SpadeOptionsCommand(this)); - _commands.Add(new SpadeRefreshCommand(this)); - _commands.Add(new SpadeSearchCommand(this)); - _commands.Add(new SpadeSortOrderAlphaCommand(this)); - _commands.Add(new SpadeSortOrderFileCommand(this)); - _commands.Add(new SpadeSortOrderTypeCommand(this)); - _commands.Add(new SpadeToolWindowCommand(this)); - _commands.Add(new SwitchFileCommand(this)); - - // Add all commands to the menu command service. - foreach (var command in _commands) - { - menuCommandService.AddCommand(command); - } - } - } - - /// - /// Registers the shell event listener. - /// - /// - /// This event listener is registered by itself and first to wait for the shell to be ready - /// for other event listeners to be registered. - /// - private void RegisterShellEventListener() - { - ShellEventListener = new ShellEventListener(this, ShellService); - ShellEventListener.EnvironmentColorChanged += () => ThemeManager.ApplyTheme(); - ShellEventListener.ShellAvailable += RegisterNonShellEventListeners; - } - - /// - /// Register the package event listeners. - /// - /// - /// This must occur after the DTE service is available since many of the events are based - /// off of the DTE object. - /// - private void RegisterNonShellEventListeners() - { - // Create event listeners and register for events. - var menuCommandService = MenuCommandService; - if (menuCommandService != null) - { - var buildProgressToolWindowCommand = _commands.OfType().First(); - var cleanupActiveCodeCommand = _commands.OfType().First(); - var collapseAllSolutionExplorerCommand = _commands.OfType().First(); - var spadeToolWindowCommand = _commands.OfType().First(); - - var codeModelManager = CodeModelManager.GetInstance(this); - var settingsContextHelper = SettingsContextHelper.GetInstance(this); - - BuildProgressEventListener = new BuildProgressEventListener(this); - BuildProgressEventListener.BuildBegin += buildProgressToolWindowCommand.OnBuildBegin; - BuildProgressEventListener.BuildProjConfigBegin += buildProgressToolWindowCommand.OnBuildProjConfigBegin; - BuildProgressEventListener.BuildProjConfigDone += buildProgressToolWindowCommand.OnBuildProjConfigDone; - BuildProgressEventListener.BuildDone += buildProgressToolWindowCommand.OnBuildDone; - - DocumentEventListener = new DocumentEventListener(this); - DocumentEventListener.OnDocumentClosing += codeModelManager.OnDocumentClosing; - - RunningDocumentTableEventListener = new RunningDocumentTableEventListener(this); - RunningDocumentTableEventListener.BeforeSave += cleanupActiveCodeCommand.OnBeforeDocumentSave; - RunningDocumentTableEventListener.AfterSave += spadeToolWindowCommand.OnAfterDocumentSave; - - SolutionEventListener = new SolutionEventListener(this); - SolutionEventListener.OnSolutionOpened += collapseAllSolutionExplorerCommand.OnSolutionOpened; - SolutionEventListener.OnSolutionOpened += settingsContextHelper.OnSolutionOpened; - SolutionEventListener.OnSolutionClosed += settingsContextHelper.OnSolutionClosed; - SolutionEventListener.OnSolutionClosed += OnSolutionClosedShowStartPage; - - // Check if a solution has already been opened before CodeMaid was initialized. - if (IDE.Solution != null && IDE.Solution.IsOpen) - { - collapseAllSolutionExplorerCommand.OnSolutionOpened(); - } - - TextEditorEventListener = new TextEditorEventListener(this); - TextEditorEventListener.OnLineChanged += codeModelManager.OnDocumentChanged; - - WindowEventListener = new WindowEventListener(this); - WindowEventListener.OnWindowChange += spadeToolWindowCommand.OnWindowChange; - } - } - - #endregion Private Methods - - #region IDisposable Members - - /// - /// Releases unmanaged and - optionally - managed resources - /// - /// - /// true to release both managed and unmanaged resources; false to release - /// only unmanaged resources. - /// - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - - // Dispose of any event listeners. - BuildProgressEventListener?.Dispose(); - DocumentEventListener?.Dispose(); - RunningDocumentTableEventListener?.Dispose(); - ShellEventListener?.Dispose(); - SolutionEventListener?.Dispose(); - TextEditorEventListener?.Dispose(); - WindowEventListener?.Dispose(); - } - - #endregion IDisposable Members - } + /// + /// This is the class that implements the package exposed by this assembly. + /// + /// The minimum requirement for a class to be considered a valid package for Visual Studio is to + /// implement the IVsPackage interface and register itself with the shell. This package uses the + /// helper classes defined inside the Managed Package Framework (MPF) to do it: it derives from + /// the Package class that provides the implementation of the IVsPackage interface and uses the + /// registration attributes defined in the framework to register itself and its components with + /// the shell. + /// + [PackageRegistration(UseManagedResourcesOnly = true)] // Tells Visual Studio utilities that this is a package that needs registered. + [InstalledProductRegistration("#110", "#112", Vsix.Version, IconResourceID = 400, LanguageIndependentName = "CodeMaid")] // VS Help/About details (Name, Description, Version, Icon). + [ProvideAutoLoad("ADFC4E64-0397-11D1-9F4E-00A0C911004F")] // Force CodeMaid to load on startup so menu items can determine their state. + [ProvideBindingPath] + [ProvideMenuResource(1000, 1)] // This attribute is needed to let the shell know that this package exposes some menus. + [ProvideToolWindow(typeof(BuildProgressToolWindow), MultiInstances = false, Height = 40, Width = 500, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Bottom, Window = EnvDTE.Constants.vsWindowKindMainWindow)] + [ProvideToolWindow(typeof(SpadeToolWindow), MultiInstances = false, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Left, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)] + [ProvideToolWindowVisibility(typeof(SpadeToolWindow), "{F1536EF8-92EC-443C-9ED7-FDADF150DA82}")] + [Guid(PackageGuids.GuidCodeMaidPackageString)] // Package unique GUID. + public sealed class CodeMaidPackage : Package, IVsInstalledProduct + { + #region Fields + + /// + /// The build progress tool window. + /// + private BuildProgressToolWindow _buildProgress; + + /// + /// An internal collection of the commands registered by this package. + /// + private readonly ICollection _commands = new List(); + + /// + /// The IComponentModel service. + /// + private IComponentModel _componentModel; + + /// + /// The top level application instance of the VS IDE that is executing this package. + /// + private DTE2 _ide; + + /// + /// The service provider. + /// + private IServiceProvider _serviceProvider; + + /// + /// The Spade tool window. + /// + private SpadeToolWindow _spade; + + /// + /// The theme manager. + /// + private ThemeManager _themeManager; + + #endregion Fields + + #region Constructors + + /// + /// Default constructor of the package. Inside this method you can place any initialization + /// code that does not require any Visual Studio service because at this point the package + /// object is created but not sited yet inside Visual Studio environment. The place to do + /// all the other initialization is the Initialize method. + /// + public CodeMaidPackage() + { + Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this)); + + if (Application.Current != null) + { + Application.Current.DispatcherUnhandledException += OnDispatcherUnhandledException; + } + + // If an existing user settings file cannot be found, perform a one-time settings upgrade. + if (!File.Exists(SettingsContextHelper.GetUserSettingsPath())) + { + Settings.Default.Upgrade(); + Settings.Default.Save(); + } + } + + #endregion Constructors + + #region Public Integration Properties + + /// + /// Gets the currently active document, otherwise null. + /// + public Document ActiveDocument + { + get + { + try + { + return IDE.ActiveDocument; + } + catch (Exception) + { + // If a project property page is active, accessing the ActiveDocument causes an exception. + return null; + } + } + } + + /// + /// Gets the build progress tool window, creating it if necessary. + /// + public BuildProgressToolWindow BuildProgress => + _buildProgress ?? (_buildProgress = (FindToolWindow(typeof(BuildProgressToolWindow), 0, true) as BuildProgressToolWindow)); + + /// + /// Gets the IComponentModel service. + /// + public IComponentModel ComponentModel => + _componentModel ?? (_componentModel = GetGlobalService(typeof(SComponentModel)) as IComponentModel); + + /// + /// Gets the top level application instance of the VS IDE that is executing this package. + /// + public DTE2 IDE => _ide ?? (_ide = (DTE2)GetService(typeof(DTE))); + + /// + /// Gets the version of the running IDE instance. + /// + public double IDEVersion => Convert.ToDouble(IDE.Version, CultureInfo.InvariantCulture); + + /// + /// Gets or sets a flag indicating if CodeMaid is running inside an AutoSave context. + /// + public bool IsAutoSaveContext { get; set; } + + /// + /// Gets the menu command service. + /// + public OleMenuCommandService MenuCommandService => GetService(typeof(IMenuCommandService)) as OleMenuCommandService; + + /// + /// Gets the service provider. + /// + public IServiceProvider ServiceProvider => _serviceProvider ?? (_serviceProvider = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)IDE)); + + /// + /// Gets the Spade tool window, iff it already exists. + /// + public SpadeToolWindow Spade => + _spade ?? (_spade = (FindToolWindow(typeof(SpadeToolWindow), 0, false) as SpadeToolWindow)); + + /// + /// Gets the Spade tool window, creating it if necessary. + /// + public SpadeToolWindow SpadeForceLoad => + _spade ?? (_spade = (FindToolWindow(typeof(SpadeToolWindow), 0, true) as SpadeToolWindow)); + + /// + /// Gets the theme manager. + /// + public ThemeManager ThemeManager => _themeManager ?? (_themeManager = ThemeManager.GetInstance(this)); + + #endregion Public Integration Properties + + #region Private Event Listener Properties + + /// + /// Gets or sets the build progress event listener. + /// + private BuildProgressEventListener BuildProgressEventListener { get; set; } + + /// + /// Gets or sets the document event listener. + /// + private DocumentEventListener DocumentEventListener { get; set; } + + /// + /// Gets or sets the running document table event listener. + /// + private RunningDocumentTableEventListener RunningDocumentTableEventListener { get; set; } + + /// + /// Gets or sets the shell event listener. + /// + private ShellEventListener ShellEventListener { get; set; } + + /// + /// Gets or sets the solution event listener. + /// + private SolutionEventListener SolutionEventListener { get; set; } + + /// + /// Gets or sets the text editor event listener. + /// + private TextEditorEventListener TextEditorEventListener { get; set; } + + /// + /// Gets or sets the window event listener. + /// + private WindowEventListener WindowEventListener { get; set; } + + #endregion Private Event Listener Properties + + #region Private Service Properties + + /// + /// Gets the shell service. + /// + private IVsShell ShellService => GetService(typeof(SVsShell)) as IVsShell; + + #endregion Private Service Properties + + #region Package Members + + /// + /// Initialization of the package; this method is called right after the package is sited, + /// so this is the place where you can put all the initialization code that rely on services + /// provided by VisualStudio. + /// + protected override void Initialize() + { + Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this)); + base.Initialize(); + + RegisterCommands(); + RegisterShellEventListener(); + } + + #endregion Package Members + + #region IVsInstalledProduct Members + + public int IdBmpSplash(out uint pIdBmp) + { + pIdBmp = 400; + return VSConstants.S_OK; + } + + public int IdIcoLogoForAboutbox(out uint pIdIco) + { + pIdIco = 400; + return VSConstants.S_OK; + } + + public int OfficialName(out string pbstrName) + { + pbstrName = GetResourceString("@110"); + return VSConstants.S_OK; + } + + public int ProductDetails(out string pbstrProductDetails) + { + pbstrProductDetails = GetResourceString("@112"); + return VSConstants.S_OK; + } + + public int ProductID(out string pbstrPID) + { + pbstrPID = GetResourceString("@114"); + return VSConstants.S_OK; + } + + public string GetResourceString(string resourceName) + { + string resourceValue; + var resourceManager = (IVsResourceManager)GetService(typeof(SVsResourceManager)); + if (resourceManager == null) + { + throw new InvalidOperationException( + "Could not get SVsResourceManager service. Make sure that the package is sited before calling this method"); + } + + Guid packageGuid = GetType().GUID; + int hr = resourceManager.LoadResourceString( + ref packageGuid, -1, resourceName, out resourceValue); + ErrorHandler.ThrowOnFailure(hr); + + return resourceValue; + } + + #endregion IVsInstalledProduct Members + + #region Private Methods + + /// + /// Called when a DispatcherUnhandledException is raised by Visual Studio. + /// + /// The sender. + /// + /// The instance containing the event data. + /// + private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) + { + if (!Settings.Default.General_DiagnosticsMode) return; + + OutputWindowHelper.ExceptionWriteLine("Diagnostics mode caught and marked as handled the following DispatcherUnhandledException raised in Visual Studio", e.Exception); + e.Handled = true; + } + + /// + /// Called when a solution is closed to conditionally show the start page. + /// + private void OnSolutionClosedShowStartPage() + { + if (!Settings.Default.General_ShowStartPageOnSolutionClose) return; + + IDE.ExecuteCommand("View.StartPage"); + } + + /// + /// Register the package commands (which must exist in the .vsct file). + /// + private void RegisterCommands() + { + var menuCommandService = MenuCommandService; + if (menuCommandService != null) + { + // Create the individual commands, which internally register for command events. + _commands.Add(new AboutCommand(this)); + _commands.Add(new BuildProgressToolWindowCommand(this)); + _commands.Add(new CleanupActiveCodeCommand(this)); + _commands.Add(new CleanupAllCodeCommand(this)); + _commands.Add(new CleanupOpenCodeCommand(this)); + _commands.Add(new CleanupSelectedCodeCommand(this)); + _commands.Add(new CloseAllReadOnlyCommand(this)); + _commands.Add(new CollapseAllSolutionExplorerCommand(this)); + _commands.Add(new CollapseSelectedSolutionExplorerCommand(this)); + _commands.Add(new CommentFormatCommand(this)); + _commands.Add(new FindInSolutionExplorerCommand(this)); + _commands.Add(new JoinLinesCommand(this)); + _commands.Add(new OptionsCommand(this)); + _commands.Add(new ReadOnlyToggleCommand(this)); + _commands.Add(new RemoveRegionCommand(this)); + _commands.Add(new ReorganizeActiveCodeCommand(this)); + _commands.Add(new SettingCleanupOnSaveCommand(this)); + _commands.Add(new SortLinesCommand(this)); + _commands.Add(new SpadeContextDeleteCommand(this)); + _commands.Add(new SpadeContextFindReferencesCommand(this)); + _commands.Add(new SpadeContextInsertRegionCommand(this)); + _commands.Add(new SpadeContextRemoveRegionCommand(this)); + _commands.Add(new SpadeOptionsCommand(this)); + _commands.Add(new SpadeRefreshCommand(this)); + _commands.Add(new SpadeSearchCommand(this)); + _commands.Add(new SpadeSortOrderAlphaCommand(this)); + _commands.Add(new SpadeSortOrderFileCommand(this)); + _commands.Add(new SpadeSortOrderTypeCommand(this)); + _commands.Add(new SpadeToolWindowCommand(this)); + _commands.Add(new SwitchFileCommand(this)); + + // Add all commands to the menu command service. + foreach (var command in _commands) + { + menuCommandService.AddCommand(command); + } + } + } + + /// + /// Registers the shell event listener. + /// + /// + /// This event listener is registered by itself and first to wait for the shell to be ready + /// for other event listeners to be registered. + /// + private void RegisterShellEventListener() + { + ShellEventListener = new ShellEventListener(this, ShellService); + ShellEventListener.EnvironmentColorChanged += () => ThemeManager.ApplyTheme(); + ShellEventListener.ShellAvailable += RegisterNonShellEventListeners; + } + + /// + /// Register the package event listeners. + /// + /// + /// This must occur after the DTE service is available since many of the events are based + /// off of the DTE object. + /// + private void RegisterNonShellEventListeners() + { + // Create event listeners and register for events. + var menuCommandService = MenuCommandService; + if (menuCommandService != null) + { + var buildProgressToolWindowCommand = _commands.OfType().First(); + var cleanupActiveCodeCommand = _commands.OfType().First(); + var collapseAllSolutionExplorerCommand = _commands.OfType().First(); + var spadeToolWindowCommand = _commands.OfType().First(); + + var codeModelManager = CodeModelManager.GetInstance(this); + var settingsContextHelper = SettingsContextHelper.GetInstance(this); + + BuildProgressEventListener = new BuildProgressEventListener(this); + BuildProgressEventListener.BuildBegin += buildProgressToolWindowCommand.OnBuildBegin; + BuildProgressEventListener.BuildProjConfigBegin += buildProgressToolWindowCommand.OnBuildProjConfigBegin; + BuildProgressEventListener.BuildProjConfigDone += buildProgressToolWindowCommand.OnBuildProjConfigDone; + BuildProgressEventListener.BuildDone += buildProgressToolWindowCommand.OnBuildDone; + + DocumentEventListener = new DocumentEventListener(this); + DocumentEventListener.OnDocumentClosing += codeModelManager.OnDocumentClosing; + + RunningDocumentTableEventListener = new RunningDocumentTableEventListener(this); + RunningDocumentTableEventListener.BeforeSave += cleanupActiveCodeCommand.OnBeforeDocumentSave; + RunningDocumentTableEventListener.AfterSave += spadeToolWindowCommand.OnAfterDocumentSave; + + SolutionEventListener = new SolutionEventListener(this); + SolutionEventListener.OnSolutionOpened += collapseAllSolutionExplorerCommand.OnSolutionOpened; + SolutionEventListener.OnSolutionOpened += settingsContextHelper.OnSolutionOpened; + SolutionEventListener.OnSolutionClosed += settingsContextHelper.OnSolutionClosed; + SolutionEventListener.OnSolutionClosed += OnSolutionClosedShowStartPage; + + // Check if a solution has already been opened before CodeMaid was initialized. + if (IDE.Solution != null && IDE.Solution.IsOpen) + { + collapseAllSolutionExplorerCommand.OnSolutionOpened(); + } + + TextEditorEventListener = new TextEditorEventListener(this); + TextEditorEventListener.OnLineChanged += codeModelManager.OnDocumentChanged; + + WindowEventListener = new WindowEventListener(this); + WindowEventListener.OnWindowChange += spadeToolWindowCommand.OnWindowChange; + } + } + + #endregion Private Methods + + #region IDisposable Members + + /// + /// Releases unmanaged and - optionally - managed resources + /// + /// + /// true to release both managed and unmanaged resources; false to release + /// only unmanaged resources. + /// + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + // Dispose of any event listeners. + BuildProgressEventListener?.Dispose(); + DocumentEventListener?.Dispose(); + RunningDocumentTableEventListener?.Dispose(); + ShellEventListener?.Dispose(); + SolutionEventListener?.Dispose(); + TextEditorEventListener?.Dispose(); + WindowEventListener?.Dispose(); + } + + #endregion IDisposable Members + } } \ No newline at end of file diff --git a/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml b/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml new file mode 100644 index 00000000..9f81c005 --- /dev/null +++ b/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml.cs b/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml.cs new file mode 100644 index 00000000..975cc45b --- /dev/null +++ b/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml.cs @@ -0,0 +1,12 @@ +using System.Windows.Controls; + +namespace SteveCadwallader.CodeMaid.UI.ToolWindows.Spade +{ + public partial class RadialProgressBar : UserControl + { + public RadialProgressBar() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/CodeMaid/UI/ToolWindows/Spade/SpadeView.xaml b/CodeMaid/UI/ToolWindows/Spade/SpadeView.xaml index a208d555..b94bebe9 100644 --- a/CodeMaid/UI/ToolWindows/Spade/SpadeView.xaml +++ b/CodeMaid/UI/ToolWindows/Spade/SpadeView.xaml @@ -174,23 +174,28 @@ - + - + - + - + - + diff --git a/CodeMaid/UI/ToolWindows/Spade/WidthConverter.cs b/CodeMaid/UI/ToolWindows/Spade/WidthConverter.cs new file mode 100644 index 00000000..706823b2 --- /dev/null +++ b/CodeMaid/UI/ToolWindows/Spade/WidthConverter.cs @@ -0,0 +1,19 @@ +using System; +using System.Globalization; + +namespace SteveCadwallader.CodeMaid.UI.ToolWindows.Spade +{ + public class CenterConverter : System.Windows.Data.IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var result = (double)value / 2.0; + return result; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file From 87682e0ae7342c77d27cf2d717a4dc0f6f53f514 Mon Sep 17 00:00:00 2001 From: Dmytro Ovcharov Date: Tue, 29 Aug 2017 14:56:03 +0300 Subject: [PATCH 04/71] Release --- CodeMaid/CodeMaid.csproj | 8 + .../UI/ToolWindows/Spade/CenterConverter.cs | 19 +++ .../ToolWindows/Spade/RadialProgressBar.xaml | 139 ++++++++++++++++++ .../Spade/RadialProgressBar.xaml.cs | 12 ++ CodeMaid/UI/ToolWindows/Spade/SpadeView.xaml | 19 ++- 5 files changed, 190 insertions(+), 7 deletions(-) create mode 100644 CodeMaid/UI/ToolWindows/Spade/CenterConverter.cs create mode 100644 CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml create mode 100644 CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml.cs diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 5fbf19fa..8199ac86 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -392,11 +392,15 @@ + + RadialProgressBar.xaml + SpadeView.xaml + @@ -765,6 +769,10 @@ MSBuild:Compile Designer + + MSBuild:Compile + Designer + MSBuild:Compile Designer diff --git a/CodeMaid/UI/ToolWindows/Spade/CenterConverter.cs b/CodeMaid/UI/ToolWindows/Spade/CenterConverter.cs new file mode 100644 index 00000000..706823b2 --- /dev/null +++ b/CodeMaid/UI/ToolWindows/Spade/CenterConverter.cs @@ -0,0 +1,19 @@ +using System; +using System.Globalization; + +namespace SteveCadwallader.CodeMaid.UI.ToolWindows.Spade +{ + public class CenterConverter : System.Windows.Data.IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var result = (double)value / 2.0; + return result; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml b/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml new file mode 100644 index 00000000..9f81c005 --- /dev/null +++ b/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml.cs b/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml.cs new file mode 100644 index 00000000..975cc45b --- /dev/null +++ b/CodeMaid/UI/ToolWindows/Spade/RadialProgressBar.xaml.cs @@ -0,0 +1,12 @@ +using System.Windows.Controls; + +namespace SteveCadwallader.CodeMaid.UI.ToolWindows.Spade +{ + public partial class RadialProgressBar : UserControl + { + public RadialProgressBar() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/CodeMaid/UI/ToolWindows/Spade/SpadeView.xaml b/CodeMaid/UI/ToolWindows/Spade/SpadeView.xaml index a208d555..b94bebe9 100644 --- a/CodeMaid/UI/ToolWindows/Spade/SpadeView.xaml +++ b/CodeMaid/UI/ToolWindows/Spade/SpadeView.xaml @@ -174,23 +174,28 @@ - + - + - + - + - + From 225e083472f1a5ac6d831bf88a371f3ec2128873 Mon Sep 17 00:00:00 2001 From: Dmytro Ovcharov Date: Tue, 29 Aug 2017 15:03:32 +0300 Subject: [PATCH 05/71] Last Commit --- CodeMaid/CodeMaid.csproj | 1 - .../UI/ToolWindows/Spade/WidthConverter.cs | 19 ------------------- 2 files changed, 20 deletions(-) delete mode 100644 CodeMaid/UI/ToolWindows/Spade/WidthConverter.cs diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 2b7acb85..8199ac86 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -401,7 +401,6 @@ - diff --git a/CodeMaid/UI/ToolWindows/Spade/WidthConverter.cs b/CodeMaid/UI/ToolWindows/Spade/WidthConverter.cs deleted file mode 100644 index 706823b2..00000000 --- a/CodeMaid/UI/ToolWindows/Spade/WidthConverter.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Globalization; - -namespace SteveCadwallader.CodeMaid.UI.ToolWindows.Spade -{ - public class CenterConverter : System.Windows.Data.IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - var result = (double)value / 2.0; - return result; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file From 79e3a5ac7672e84e319db01c41a89f381379efa7 Mon Sep 17 00:00:00 2001 From: Dave Grochocki Date: Thu, 7 Sep 2017 00:19:08 -0700 Subject: [PATCH 06/71] ThirdParty: Fixes XAML Styler command reference for new versions of XAML Styler extension Fixes #401 --- CodeMaid/Logic/Cleaning/CodeCleanupManager.cs | 2 +- CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs index a036f048..b44cfa52 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs @@ -580,7 +580,7 @@ private void RunXAMLStylerCleanup(TextDocument textDocument) { if (!Settings.Default.ThirdParty_UseXAMLStylerCleanup) return; - _commandHelper.ExecuteCommand(textDocument, "EditorContextMenus.XAMLEditor.BeautifyXaml", "EditorContextMenus.XAMLEditor.FormatXAML"); + _commandHelper.ExecuteCommand(textDocument, "EditorContextMenus.XAMLEditor.BeautifyXaml", "EditorContextMenus.XAMLEditor.FormatXAML", "EditorContextMenus.CodeWindow.FormatXAML"); } /// diff --git a/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs b/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs index a4ed93bf..8f14ef1f 100644 --- a/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs @@ -101,7 +101,7 @@ public string OtherCleaningCommandsExpression /// /// Gets a flag indicating if the UseXAMLStylerCleanup option should be enabled. /// - public bool IsEnabledUseXAMLStylerCleanup => _commandHelper.FindCommand("EditorContextMenus.XAMLEditor.BeautifyXaml", "EditorContextMenus.XAMLEditor.FormatXAML") != null; + public bool IsEnabledUseXAMLStylerCleanup => _commandHelper.FindCommand("EditorContextMenus.XAMLEditor.BeautifyXaml", "EditorContextMenus.XAMLEditor.FormatXAML", "EditorContextMenus.CodeWindow.FormatXAML") != null; #endregion Enables } From c1478f9919178c7b5e38596e6d46bed50f92c1b8 Mon Sep 17 00:00:00 2001 From: MysticBoy Date: Tue, 19 Dec 2017 15:00:52 +0800 Subject: [PATCH 07/71] Extract all strings and WPF strings that need to be translated And the use of TomEnglert.ResXManager for translation work, of which Chinese has been translated. --- CodeMaid/CodeMaid.csproj | 15 + CodeMaid/CodeMaid.vsct | 25 + CodeMaid/Integration/Commands/BaseCommand.cs | 4 + .../Commands/CleanupAllCodeCommand.cs | 8 +- .../Commands/CommentFormatCommand.cs | 10 +- .../Commands/ReadOnlyToggleCommand.cs | 2 +- .../Commands/RemoveRegionCommand.cs | 6 +- .../Commands/SettingCleanupOnSaveCommand.cs | 4 +- .../SpadeContextInsertRegionCommand.cs | 2 +- .../Integration/Commands/SwitchFileCommand.cs | 4 +- .../Cleaning/CodeCleanupAvailabilityLogic.cs | 6 +- CodeMaid/Properties/Resources.Designer.cs | 1994 +++++++++++++++++ CodeMaid/Properties/Resources.resx | 762 +++++++ CodeMaid/Properties/Resources.zh-Hans.resx | 762 +++++++ CodeMaid/StringResourceKey.cs | 34 + .../CleanupProgressViewModel.cs | 2 +- .../CleanupProgressWindow.xaml | 8 +- .../CleaningFileTypesDataTemplate.xaml | 11 +- .../Cleaning/CleaningFileTypesViewModel.cs | 2 +- .../Cleaning/CleaningGeneralDataTemplate.xaml | 11 +- .../Cleaning/CleaningGeneralViewModel.cs | 2 +- .../Cleaning/CleaningInsertDataTemplate.xaml | 13 +- .../Cleaning/CleaningInsertViewModel.cs | 2 +- .../Cleaning/CleaningParentDataTemplate.xaml | 3 +- .../Cleaning/CleaningParentViewModel.cs | 2 +- .../Cleaning/CleaningRemoveDataTemplate.xaml | 33 +- .../Cleaning/CleaningRemoveViewModel.cs | 2 +- .../Cleaning/CleaningUpdateDataTemplate.xaml | 13 +- .../Cleaning/CleaningUpdateViewModel.cs | 2 +- .../CleaningVisualStudioDataTemplate.xaml | 11 +- .../Collapsing/CollapsingDataTemplate.xaml | 5 +- .../Options/Collapsing/CollapsingViewModel.cs | 2 +- .../Options/Digging/DiggingDataTemplate.xaml | 45 +- .../Options/Digging/DiggingViewModel.cs | 2 +- .../Options/Finding/FindingDataTemplate.xaml | 5 +- .../Options/Finding/FindingViewModel.cs | 2 +- .../Formatting/FormattingDataTemplate.xaml | 23 +- .../Options/Formatting/FormattingViewModel.cs | 2 +- .../Options/General/GeneralDataTemplate.xaml | 22 +- .../Options/General/GeneralViewModel.cs | 2 +- .../UI/Dialogs/Options/OptionsViewModel.cs | 18 +- .../UI/Dialogs/Options/OptionsWindow.xaml | 14 +- .../Progressing/ProgressingDataTemplate.xaml | 9 +- .../Progressing/ProgressingViewModel.cs | 2 +- .../ReorganizingGeneralDataTemplate.xaml | 25 +- .../ReorganizingGeneralViewModel.cs | 2 +- .../ReorganizingParentDataTemplate.xaml | 3 +- .../ReorganizingParentViewModel.cs | 2 +- .../ReorganizingRegionsDataTemplate.xaml | 17 +- .../ReorganizingRegionsViewModel.cs | 2 +- .../ReorganizingTypesDataTemplate.xaml | 7 +- .../ReorganizingTypesViewModel.cs | 2 +- .../Switching/SwitchingDataTemplate.xaml | 5 +- .../Options/Switching/SwitchingViewModel.cs | 2 +- .../ThirdParty/ThirdPartyDataTemplate.xaml | 13 +- .../Options/ThirdParty/ThirdPartyViewModel.cs | 2 +- CodeMaid/UI/ThemeManager.cs | 2 +- .../BuildProgress/BuildProgressToolWindow.cs | 12 +- .../BuildProgress/BuildProgressView.xaml | 3 +- .../UI/ToolWindows/Spade/SpadeToolWindow.cs | 4 +- CodeMaid/source.extension.zh-Hans.resx | 126 ++ 61 files changed, 3940 insertions(+), 197 deletions(-) create mode 100644 CodeMaid/Properties/Resources.Designer.cs create mode 100644 CodeMaid/Properties/Resources.resx create mode 100644 CodeMaid/Properties/Resources.zh-Hans.resx create mode 100644 CodeMaid/StringResourceKey.cs create mode 100644 CodeMaid/source.extension.zh-Hans.resx diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 8199ac86..6ed8513b 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -172,6 +172,7 @@ Properties\CodeMaid.snk + True True @@ -304,6 +305,11 @@ + + True + True + Resources.resx + True True @@ -791,6 +797,12 @@ + + PublicResXFileCodeGenerator + Resources.Designer.cs + Designer + + True True @@ -798,6 +810,9 @@ true VSPackage + + source.extension.vsixmanifest + true diff --git a/CodeMaid/CodeMaid.vsct b/CodeMaid/CodeMaid.vsct index cb4be8a7..2c266d53 100644 --- a/CodeMaid/CodeMaid.vsct +++ b/CodeMaid/CodeMaid.vsct @@ -288,6 +288,7 @@ If you do not want an image next to your command, remove the Icon node or set it to --> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CodeMaid/CodeMaid.zh-Hans.vsct b/CodeMaid/CodeMaid.zh-Hans.vsct new file mode 100644 index 00000000..8f356b5a --- /dev/null +++ b/CodeMaid/CodeMaid.zh-Hans.vsct @@ -0,0 +1,1389 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + &CodeMaid + &CodeMaid + + + + DefaultDocked + + CodeMaid Spade Toolbar + CodeMaid码锹工具栏 + + + + + CodeMaid Spade Context Menu + CodeMaid Spade Context Menu + + + + + + CodeMaid + + + + + + CodeMaid + + + + + + CodeMaid + + + + + + CodeMaid + + + + + + CodeMaid + + + + + + CodeMaid + + + + + + CodeMaid + + + + + + CodeMaid + + + + + + CodeMaid + + + + + + CodeMaid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CodeMaid/CodeMaidPackage.cs b/CodeMaid/CodeMaidPackage.cs index 72881ab4..bae46f73 100644 --- a/CodeMaid/CodeMaidPackage.cs +++ b/CodeMaid/CodeMaidPackage.cs @@ -39,7 +39,7 @@ namespace SteveCadwallader.CodeMaid [InstalledProductRegistration("#110", "#112", Vsix.Version, IconResourceID = 400, LanguageIndependentName = "CodeMaid")] // VS Help/About details (Name, Description, Version, Icon). [ProvideAutoLoad("ADFC4E64-0397-11D1-9F4E-00A0C911004F")] // Force CodeMaid to load on startup so menu items can determine their state. [ProvideBindingPath] - [ProvideMenuResource(1000, 1)] // This attribute is needed to let the shell know that this package exposes some menus. + [ProvideMenuResource("Menus.ctmenu", 1)] // This attribute is needed to let the shell know that this package exposes some menus. [ProvideToolWindow(typeof(BuildProgressToolWindow), MultiInstances = false, Height = 40, Width = 500, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Bottom, Window = EnvDTE.Constants.vsWindowKindMainWindow)] [ProvideToolWindow(typeof(SpadeToolWindow), MultiInstances = false, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Left, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)] [ProvideToolWindowVisibility(typeof(SpadeToolWindow), "{F1536EF8-92EC-443C-9ED7-FDADF150DA82}")] diff --git a/CodeMaid/Integration/Commands/BaseCommand.cs b/CodeMaid/Integration/Commands/BaseCommand.cs index 883aa565..fffe3100 100644 --- a/CodeMaid/Integration/Commands/BaseCommand.cs +++ b/CodeMaid/Integration/Commands/BaseCommand.cs @@ -46,10 +46,10 @@ protected BaseCommand(CodeMaidPackage package, CommandID id) private static void BaseCommand_BeforeQueryStatus(object sender, EventArgs e) { BaseCommand command = sender as BaseCommand; - if (string.IsNullOrEmpty(command.Text)) - { - command.Text = StringResourceKey.GetResourceText(command); - } + //if (string.IsNullOrEmpty(command.Text)) + //{ + // command.Text = StringResourceKey.GetResourceText(command); + //} command?.OnBeforeQueryStatus(); } diff --git a/CodeMaid/Properties/Resources.en-US.resx b/CodeMaid/Properties/Resources.en-US.resx new file mode 100644 index 00000000..454bffe9 --- /dev/null +++ b/CodeMaid/Properties/Resources.en-US.resx @@ -0,0 +1,762 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Build Progress + + + Cancel + + + Canceling... + + + Are you ready for CodeMaid to clean everything in the solution? + + + Cleanup cannot run while debugging. + + + CodeMaid: Cleanup All Code + + + CodeMaid: Confirmation for Cleanup All Code + + + CodeMaid: Cleanup External File + + + Do you want to perform a partial cleanup? + + + is not in the solution so some cleanup actions may be unavailable. + + + CodeMaid Format Comment + + + CodeMaid did not find a non-code comment {0} to reformat. + + + CodeMaid finished formatting the comment. + + + CodeMaid finished formatting the comments {0}. + + + in the selection + + + under the cursor + + + About CodeMaid... + + + &Build Progress + + + &Cleanup Active Document + + + Cleanup &All Code... + + + &Cleanup Open Code + + + &Cleanup Selected Code + + + Close All &Read-Only + + + Co&llapse All Recursively + + + Co&llapse Recursively + + + Format Comme&amp;nt + + + &Find In Solution Explorer + + + &Join Lines + + + &Options... + + + &Read-Only Toggle + + + &Remove All Regions + + + Reorgani&ze Active Document + + + &Automatic Cleanup On Save + + + &Sort Lines + + + &Delete + + + &Find References + + + &Insert Region + + + &Remove Region + + + &Options... + + + Refresh Spade + + + Search Spade + + + Sort alphabetically + + + Sort by file order + + + Sort by type + + + &Spade + + + &Switch File + + + Unable to toggle read only state on + + + &Remove All Regions + + + &Remove Current Region + + + &Remove Selected Regions + + + Automatic Cleanup On Save - + + + CodeMaid turned automatic cleanup on save + + + New Region + + + S&witch File + + + S&witch to + + + Cleaning {0}... + + + CodeMaid: Cleanup Progress + + + CodeMaid Spade + + + Search CodeMaid Spade (Ctrl+M, ;) + + + Rebuilding + + + Deploying + + + Cleaning + + + Building + + + Batch + + + CodeMaid failed to load theme '{0}'. See output window for more details. + + + Reset to Defaults + + + Export + + + Import + + + Options will be saved to '{0}'. + + + Save + + + CodeMaid: Import + + + Config files (*.config)|*.config|All Files (*.*)|*.* + + + CodeMaid Options + + + Close + + + Theme + + + Font + + + Cache file code models + + + Load models asynchronously + + + Diagnostics mode + + + Show start page when a solution is closed + + + Use undo transactions + + + Skip during automatic cleanup on save + + + Icons + + + Show build progress window when a build starts + + + Hide build progress window when a build stops + + + Show build progress on Visual Studio icon in Windows taskbar + + + Build progress window + + + Wrap comments at column + + + General + + + Skip wrapping on the last word + + + Extra indent for values inside XML comments + + + Add spacing around XML tags + + + Add space inside self closing tags + + + Keep XML tags together + + + Align XML &lt;param&gt; tags + + + Always split &lt;summary&gt; tags onto multiple lines + + + Always split all XML tags onto multiple lines + + + Run format comments during cleanup + + + Clear Solution Explorer search filtering to find filtered items + + + Temporarily open solution folders to find nested items + + + Synchronize outlining with the code file + + + Display + + + Show method parameters + + + Show item metadata + + + Show item complexity (McCabe) + + + Warning threshold + + + Alert threshold + + + Sort + + + Primary sort should be by + + + file order + + + type + + + alphabetical + + + When sorting by type, secondary sort should be by + + + When navigating center on + + + whole item + + + name only + + + Indentation margin + + + Collapse solutions when they are opened + + + If there is only one project in a solution, keep it expanded but still collapse its children + + + Everything else (ex: .txt, README) + + + Regular expressions that match path names to exclude (ex: \.resx$ or \\lib\\ ) + + + Place each regular expression on a separate line + + + Automatically run cleanup on file save + + + Automatically save and close documents opened by cleanup + + + Perform partial cleanup if file is not in the solution + + + Insert blank line padding before + + + Insert blank line padding between + + + Insert blank line padding after + + + Insert blank space before + + + Insert explicit access modifiers on + + + Insert end of file trailing new line + + + Select a sub-category to set options. + + + Whitespace + + + Remove blank lines + + + Remove blank spaces + + + at top of file + + + after attributes + + + after opening braces + + + before closing braces + + + before closing tags + + + between chained statements + + + at bottom of file + + + before closing angle brackets + + + Remove end of file trailing new line + + + Remove end of line whitespace + + + Remove multiple consecutive blank lines + + + Regions + + + Remove regions + + + Update accessors to both be single-line or multi-line (SA1504) + + + Update #endregion tags with region name + + + Ex: #endregion Methods + + + Update single line methods by placing braces on separate lines (SA1502) + + + File Header + + + Run format document + + + Run remove and sort using statements + + + Using statements to re-insert when removed (ex: using System; ) + + + Place each using statement on a separate line + + + Alphabetize members of the same group + + + Keep members within regions + + + Place explicit interface members at the end of their group + + + Primary ordering should be by + + + type then access + + + access then type + + + Access levels should be ordered by + + + Run reorganize at start of cleanup + + + Cleanup + + + Conditions + + + Perform reorganization when preprocessor conditionals are present + + + Include access level in regions + + + Ex: #region Public Methods, #region Private Methods + + + Insert/keep regions even if they are empty + + + Insert + + + Insert new regions + + + Remove + + + Remove existing regions + + + Member type order, grouping and preferred names + + + Split + + + Drag to reorder, drag over to group, right click to split, double-click to rename + + + Sets of related file extensions (ex: .cpp .h ) + + + Place each set on a separate line + + + While Cleaning + + + Run JetBrains ReSharper cleanup + + + Run Telerik JustCode cleanup + + + Run XAML Styler cleanup + + + Other cleaning commands (ex: ReSharper.ReSharper_SilentCleanupCode) + + + Place each command on a separate line + + + CodeMaid: Export + + + CodeMaid has successfully exported + + + to '{0}'. + + + Successful + + + CodeMaid was unable to export + + + . See output window for more details. + + + Unsuccessful + + + Third Party + + + Switching + + + Reorganizing + + + Types + + + Progressing + + + Formatting + + + Finding + + + Digging (Spade) + + + Collapsing + + + File Types + + + Update + + + User Settings + + + Solution-Specific Settings + + + Automatic + + + External + + + Exclude + + + T4 generated code + + + Navigation + + + Visuals + + + ON + + + OFF + + \ No newline at end of file diff --git a/CodeMaid/source.extension.en-US.resx b/CodeMaid/source.extension.en-US.resx new file mode 100644 index 00000000..c0f9b16e --- /dev/null +++ b/CodeMaid/source.extension.en-US.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + CodeMaid + + + CodeMaid is an open source Visual Studio extension to cleanup and simplify our C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding. + + + + source.extension.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/CodeMaid/source.extension.zh-Hans.resx b/CodeMaid/source.extension.zh-Hans.resx index d31215dc..2c2b854e 100644 --- a/CodeMaid/source.extension.zh-Hans.resx +++ b/CodeMaid/source.extension.zh-Hans.resx @@ -123,4 +123,8 @@ CodeMaid 是一个开源Visual Studio 扩展, 用于整理和简化我们的 c#、c++、f#、VB、PHP、PowerShell、R、JSON、XAML、XML、ASP、HTML、CSS、LESS、SCSS、JavaScript 和TypeScript编码。 + + + source.extension.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file From e279ed86150b93d1fb93cc5d6af641458c18c6ee Mon Sep 17 00:00:00 2001 From: MysticBoy Date: Thu, 4 Jan 2018 00:00:04 +0800 Subject: [PATCH 10/71] Refactoring a very long localized string variable name --- .../Commands/CleanupAllCodeCommand.cs | 8 +- .../Commands/CommentFormatCommand.cs | 10 +- .../Commands/ReadOnlyToggleCommand.cs | 2 +- .../Commands/RemoveRegionCommand.cs | 6 +- .../Commands/SettingCleanupOnSaveCommand.cs | 4 +- .../SpadeContextInsertRegionCommand.cs | 2 +- .../Integration/Commands/SwitchFileCommand.cs | 4 +- .../Cleaning/CodeCleanupAvailabilityLogic.cs | 6 +- CodeMaid/Properties/Resources.Designer.cs | 870 +++++++----------- CodeMaid/Properties/Resources.en-US.resx | 193 ++-- CodeMaid/Properties/Resources.resx | 191 ++-- CodeMaid/Properties/Resources.zh-Hans.resx | 191 ++-- CodeMaid/StringResourceKey.cs | 23 - .../Cleaning/CleaningParentViewModel.cs | 2 +- .../Options/General/GeneralDataTemplate.xaml | 8 +- .../UI/Dialogs/Options/OptionsViewModel.cs | 18 +- .../Progressing/ProgressingDataTemplate.xaml | 2 +- .../ReorganizingParentViewModel.cs | 2 +- CodeMaid/UI/ThemeManager.cs | 2 +- .../BuildProgress/BuildProgressToolWindow.cs | 12 +- .../UI/ToolWindows/Spade/SpadeToolWindow.cs | 4 +- 21 files changed, 523 insertions(+), 1037 deletions(-) diff --git a/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs index 4b94ea12..f1e17be3 100644 --- a/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs @@ -48,12 +48,12 @@ protected override void OnExecute() if (!CodeCleanupAvailabilityLogic.IsCleanupEnvironmentAvailable()) { - MessageBox.Show(StringResourceKey.CleanupAllCodeCommand_OnExecute_CleanupCannotRunWhileDebugging, - StringResourceKey.CleanupAllCodeCommand_OnExecute_CodeMaidCleanupAllCode, + MessageBox.Show(StringResourceKey.CleanupCannotRunWhileDebugging, + StringResourceKey.CodeMaidCleanupAllCode, MessageBoxButton.OK, MessageBoxImage.Warning); } - else if (MessageBox.Show(StringResourceKey.CleanupAllCodeCommand_OnExecute_AreYouReadyForCodeMaidToCleanEverythingInTheSolution, - StringResourceKey.CleanupAllCodeCommand_OnExecute_CodeMaidConfirmationForCleanupAllCode, + else if (MessageBox.Show(StringResourceKey.AreYouReadyForCodeMaidToCleanEverythingInTheSolution, + StringResourceKey.CodeMaidConfirmationForCleanupAllCode, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes) { diff --git a/CodeMaid/Integration/Commands/CommentFormatCommand.cs b/CodeMaid/Integration/Commands/CommentFormatCommand.cs index 69a71a92..233adc4e 100644 --- a/CodeMaid/Integration/Commands/CommentFormatCommand.cs +++ b/CodeMaid/Integration/Commands/CommentFormatCommand.cs @@ -27,7 +27,7 @@ internal CommentFormatCommand(CodeMaidPackage package) : base(package, new CommandID(PackageGuids.GuidCodeMaidCommandCommentFormat, PackageIds.CmdIDCodeMaidCommentFormat)) { - _undoTransactionHelper = new UndoTransactionHelper(package, StringResourceKey.CommentFormatCommand_CommentFormatCommand_CodeMaidFormatComment); + _undoTransactionHelper = new UndoTransactionHelper(package, StringResourceKey.CodeMaidFormatComment); _commentFormatLogic = CommentFormatLogic.GetInstance(package); } @@ -81,15 +81,15 @@ protected override void OnExecute() if (foundComments) { - Package.IDE.StatusBar.Text = StringResourceKey.CommentFormatCommand_OnExecute_CodeMaidFinishedFormattingTheComment; + Package.IDE.StatusBar.Text = StringResourceKey.CodeMaidFinishedFormattingTheComment; } else { Package.IDE.StatusBar.Text = string.Format( foundComments - ? StringResourceKey.CommentFormatCommand_OnExecute_CodeMaidFinishedFormattingTheComments0 - : StringResourceKey.CommentFormatCommand_OnExecute_CodeMaidDidNotFindANonCodeComment0ToReformat, - selection.IsEmpty ? StringResourceKey.CommentFormatCommand_OnExecute_UnderTheCursor : StringResourceKey.CommentFormatCommand_OnExecute_InTheSelection + ? StringResourceKey.CodeMaidFinishedFormattingTheComments0 + : StringResourceKey.CodeMaidDidNotFindANonCodeComment0ToReformat, + selection.IsEmpty ? StringResourceKey.UnderTheCursor : StringResourceKey.InTheSelection ); } } diff --git a/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs b/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs index 4171bc16..169ac188 100644 --- a/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs +++ b/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs @@ -54,7 +54,7 @@ protected override void OnExecute() } catch (Exception ex) { - OutputWindowHelper.ExceptionWriteLine($"{StringResourceKey.ReadOnlyToggleCommand_OnExecute_UnableToToggleReadOnlyStateOn}'{document.FullName}'", ex); + OutputWindowHelper.ExceptionWriteLine($"{StringResourceKey.UnableToToggleReadOnlyStateOn}'{document.FullName}'", ex); } } } diff --git a/CodeMaid/Integration/Commands/RemoveRegionCommand.cs b/CodeMaid/Integration/Commands/RemoveRegionCommand.cs index 26c6ba8a..a60cb5bc 100644 --- a/CodeMaid/Integration/Commands/RemoveRegionCommand.cs +++ b/CodeMaid/Integration/Commands/RemoveRegionCommand.cs @@ -63,15 +63,15 @@ protected override void OnBeforeQueryStatus() switch (regionCommandScope) { case RegionCommandScope.CurrentLine: - Text = StringResourceKey.RemoveRegionCommand_OnBeforeQueryStatus_RemoveCurrentRegion; + Text = StringResourceKey.RemoveCurrentRegion; break; case RegionCommandScope.Selection: - Text = StringResourceKey.RemoveRegionCommand_OnBeforeQueryStatus_RemoveSelectedRegions; + Text = StringResourceKey.RemoveSelectedRegions; break; default: - Text = StringResourceKey.RemoveRegionCommand_OnBeforeQueryStatus_RemoveAllRegions; + Text = StringResourceKey.RemoveAllRegions; break; } } diff --git a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs index bddfb3d3..d30a94e9 100644 --- a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs +++ b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs @@ -48,7 +48,7 @@ public bool CleanupOnSave protected override void OnBeforeQueryStatus() { Checked = CleanupOnSave; - Text = StringResourceKey.SettingCleanupOnSaveCommand_OnBeforeQueryStatus_AutomaticCleanupOnSave + CleanupOnSaveStateText; + Text = StringResourceKey.AutomaticCleanupOnSave + CleanupOnSaveStateText; } /// @@ -61,7 +61,7 @@ protected override void OnExecute() CleanupOnSave = !CleanupOnSave; Settings.Default.Save(); - Package.IDE.StatusBar.Text = $"{StringResourceKey.SettingCleanupOnSaveCommand_OnExecute_CodeMaidTurnedAutomaticCleanupOnSave }{CleanupOnSaveStateText}."; + Package.IDE.StatusBar.Text = $"{StringResourceKey.CodeMaidTurnedAutomaticCleanupOnSave }{CleanupOnSaveStateText}."; } #endregion BaseCommand Methods diff --git a/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs b/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs index 94972363..560d06b8 100644 --- a/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs @@ -65,7 +65,7 @@ protected override void OnExecute() var spade = Package.Spade; if (spade != null) { - var region = new CodeItemRegion { Name = StringResourceKey.SpadeContextInsertRegionCommand_OnExecute_NewRegion }; + var region = new CodeItemRegion { Name = StringResourceKey.NewRegion }; var startPoint = spade.SelectedItems.OrderBy(x => x.StartOffset).First().StartPoint; var endPoint = spade.SelectedItems.OrderBy(x => x.EndOffset).Last().EndPoint; diff --git a/CodeMaid/Integration/Commands/SwitchFileCommand.cs b/CodeMaid/Integration/Commands/SwitchFileCommand.cs index a60185e6..7a322f24 100644 --- a/CodeMaid/Integration/Commands/SwitchFileCommand.cs +++ b/CodeMaid/Integration/Commands/SwitchFileCommand.cs @@ -41,11 +41,11 @@ protected override void OnBeforeQueryStatus() Enabled = canAlterate; if (canAlterate) { - Text = StringResourceKey.SwitchFileCommand_OnBeforeQueryStatus_SWitchTo + Path.GetFileName(alternatePath); + Text = StringResourceKey.SWitchTo + Path.GetFileName(alternatePath); } else { - Text = StringResourceKey.SwitchFileCommand_OnBeforeQueryStatus_SWitchFile; + Text = StringResourceKey.SWitchFile; } } diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs b/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs index 3f178d95..75da89bf 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs @@ -415,10 +415,10 @@ private static bool PromptUserAboutCleaningExternalFiles(Document document) { var viewModel = new YesNoPromptViewModel { - Title = StringResourceKey.CodeCleanupAvailabilityLogic_PromptUserAboutCleaningExternalFiles_CodeMaidCleanupExternalFile, - Message = document.Name + StringResourceKey.CodeCleanupAvailabilityLogic_PromptUserAboutCleaningExternalFiles_IsNotInTheSolutionSoSomeCleanupActionsMayBeUnavailable + + Title = StringResourceKey.CodeMaidCleanupExternalFile, + Message = document.Name + StringResourceKey.IsNotInTheSolutionSoSomeCleanupActionsMayBeUnavailable + Environment.NewLine + Environment.NewLine + - StringResourceKey.CodeCleanupAvailabilityLogic_PromptUserAboutCleaningExternalFiles_DoYouWantToPerformAPartialCleanup, + StringResourceKey.DoYouWantToPerformAPartialCleanup, CanRemember = true }; diff --git a/CodeMaid/Properties/Resources.Designer.cs b/CodeMaid/Properties/Resources.Designer.cs index 87f4f70a..00b4895f 100644 --- a/CodeMaid/Properties/Resources.Designer.cs +++ b/CodeMaid/Properties/Resources.Designer.cs @@ -168,6 +168,15 @@ public static string AlwaysSplitLtSummaryGtTagsOntoMultipleLines { } } + /// + /// 查找类似 Are you ready for CodeMaid to clean everything in the solution? 的本地化字符串。 + /// + public static string AreYouReadyForCodeMaidToCleanEverythingInTheSolution { + get { + return ResourceManager.GetString("AreYouReadyForCodeMaidToCleanEverythingInTheSolution", resourceCulture); + } + } + /// /// 查找类似 at bottom of file 的本地化字符串。 /// @@ -214,92 +223,74 @@ public static string AutomaticallySaveAndCloseDocumentsOpenedByCleanup { } /// - /// 查找类似 before closing angle brackets 的本地化字符串。 + /// 查找类似 Automatic Cleanup On Save - 的本地化字符串。 /// - public static string BeforeClosingAngleBrackets { + public static string AutomaticCleanupOnSave { get { - return ResourceManager.GetString("BeforeClosingAngleBrackets", resourceCulture); + return ResourceManager.GetString("AutomaticCleanupOnSave", resourceCulture); } } /// - /// 查找类似 before closing braces 的本地化字符串。 + /// 查找类似 Batch 的本地化字符串。 /// - public static string BeforeClosingBraces { + public static string Batch { get { - return ResourceManager.GetString("BeforeClosingBraces", resourceCulture); + return ResourceManager.GetString("Batch", resourceCulture); } } /// - /// 查找类似 before closing tags 的本地化字符串。 + /// 查找类似 before closing angle brackets 的本地化字符串。 /// - public static string BeforeClosingTags { + public static string BeforeClosingAngleBrackets { get { - return ResourceManager.GetString("BeforeClosingTags", resourceCulture); + return ResourceManager.GetString("BeforeClosingAngleBrackets", resourceCulture); } } /// - /// 查找类似 between chained statements 的本地化字符串。 + /// 查找类似 before closing braces 的本地化字符串。 /// - public static string BetweenChainedStatements { + public static string BeforeClosingBraces { get { - return ResourceManager.GetString("BetweenChainedStatements", resourceCulture); + return ResourceManager.GetString("BeforeClosingBraces", resourceCulture); } } /// - /// 查找类似 Build Progress 的本地化字符串。 + /// 查找类似 before closing tags 的本地化字符串。 /// - public static string BuildProgressToolWindow_BuildProgress { + public static string BeforeClosingTags { get { - return ResourceManager.GetString("BuildProgressToolWindow_BuildProgress", resourceCulture); + return ResourceManager.GetString("BeforeClosingTags", resourceCulture); } } /// - /// 查找类似 Batch 的本地化字符串。 + /// 查找类似 between chained statements 的本地化字符串。 /// - public static string BuildProgressToolWindow_GetBuildTypeString_Batch { + public static string BetweenChainedStatements { get { - return ResourceManager.GetString("BuildProgressToolWindow_GetBuildTypeString_Batch", resourceCulture); + return ResourceManager.GetString("BetweenChainedStatements", resourceCulture); } } /// /// 查找类似 Building 的本地化字符串。 /// - public static string BuildProgressToolWindow_GetBuildTypeString_Building { - get { - return ResourceManager.GetString("BuildProgressToolWindow_GetBuildTypeString_Building", resourceCulture); - } - } - - /// - /// 查找类似 Cleaning 的本地化字符串。 - /// - public static string BuildProgressToolWindow_GetBuildTypeString_Cleaning { + public static string Building { get { - return ResourceManager.GetString("BuildProgressToolWindow_GetBuildTypeString_Cleaning", resourceCulture); + return ResourceManager.GetString("Building", resourceCulture); } } /// - /// 查找类似 Deploying 的本地化字符串。 - /// - public static string BuildProgressToolWindow_GetBuildTypeString_Deploying { - get { - return ResourceManager.GetString("BuildProgressToolWindow_GetBuildTypeString_Deploying", resourceCulture); - } - } - - /// - /// 查找类似 Rebuilding 的本地化字符串。 + /// 查找类似 Build Progress 的本地化字符串。 /// - public static string BuildProgressToolWindow_GetBuildTypeString_Rebuilding { + public static string BuildProgress { get { - return ResourceManager.GetString("BuildProgressToolWindow_GetBuildTypeString_Rebuilding", resourceCulture); + return ResourceManager.GetString("BuildProgress", resourceCulture); } } @@ -339,6 +330,15 @@ public static string Canceling { } } + /// + /// 查找类似 Cleaning 的本地化字符串。 + /// + public static string Cleaning { + get { + return ResourceManager.GetString("Cleaning", resourceCulture); + } + } + /// /// 查找类似 Cleaning {0}... 的本地化字符串。 /// @@ -375,40 +375,12 @@ public static string Cleanup { } } - /// - /// 查找类似 Are you ready for CodeMaid to clean everything in the solution? 的本地化字符串。 - /// - public static string CleanupAllCodeCommand_OnExecute_AreYouReadyForCodeMaidToCleanEverythingInTheSolution { - get { - return ResourceManager.GetString("CleanupAllCodeCommand_OnExecute_AreYouReadyForCodeMaidToCleanEverythingInTheSolut" + - "ion", resourceCulture); - } - } - /// /// 查找类似 Cleanup cannot run while debugging. 的本地化字符串。 /// - public static string CleanupAllCodeCommand_OnExecute_CleanupCannotRunWhileDebugging { + public static string CleanupCannotRunWhileDebugging { get { - return ResourceManager.GetString("CleanupAllCodeCommand_OnExecute_CleanupCannotRunWhileDebugging", resourceCulture); - } - } - - /// - /// 查找类似 CodeMaid: Cleanup All Code 的本地化字符串。 - /// - public static string CleanupAllCodeCommand_OnExecute_CodeMaidCleanupAllCode { - get { - return ResourceManager.GetString("CleanupAllCodeCommand_OnExecute_CodeMaidCleanupAllCode", resourceCulture); - } - } - - /// - /// 查找类似 CodeMaid: Confirmation for Cleanup All Code 的本地化字符串。 - /// - public static string CleanupAllCodeCommand_OnExecute_CodeMaidConfirmationForCleanupAllCode { - get { - return ResourceManager.GetString("CleanupAllCodeCommand_OnExecute_CodeMaidConfirmationForCleanupAllCode", resourceCulture); + return ResourceManager.GetString("CleanupCannotRunWhileDebugging", resourceCulture); } } @@ -431,32 +403,20 @@ public static string Close { } /// - /// 查找类似 CodeMaid: Cleanup External File 的本地化字符串。 - /// - public static string CodeCleanupAvailabilityLogic_PromptUserAboutCleaningExternalFiles_CodeMaidCleanupExternalFile { - get { - return ResourceManager.GetString("CodeCleanupAvailabilityLogic_PromptUserAboutCleaningExternalFiles_CodeMaidCleanup" + - "ExternalFile", resourceCulture); - } - } - - /// - /// 查找类似 Do you want to perform a partial cleanup? 的本地化字符串。 + /// 查找类似 CodeMaid: Cleanup All Code 的本地化字符串。 /// - public static string CodeCleanupAvailabilityLogic_PromptUserAboutCleaningExternalFiles_DoYouWantToPerformAPartialCleanup { + public static string CodeMaidCleanupAllCode { get { - return ResourceManager.GetString("CodeCleanupAvailabilityLogic_PromptUserAboutCleaningExternalFiles_DoYouWantToPerf" + - "ormAPartialCleanup", resourceCulture); + return ResourceManager.GetString("CodeMaidCleanupAllCode", resourceCulture); } } /// - /// 查找类似 is not in the solution so some cleanup actions may be unavailable. 的本地化字符串。 + /// 查找类似 CodeMaid: Cleanup External File 的本地化字符串。 /// - public static string CodeCleanupAvailabilityLogic_PromptUserAboutCleaningExternalFiles_IsNotInTheSolutionSoSomeCleanupActionsMayBeUnavailable { + public static string CodeMaidCleanupExternalFile { get { - return ResourceManager.GetString("CodeCleanupAvailabilityLogic_PromptUserAboutCleaningExternalFiles_IsNotInTheSolut" + - "ionSoSomeCleanupActionsMayBeUnavailable", resourceCulture); + return ResourceManager.GetString("CodeMaidCleanupExternalFile", resourceCulture); } } @@ -470,515 +430,335 @@ public static string CodeMaidCleanupProgress { } /// - /// 查找类似 CodeMaid Options 的本地化字符串。 - /// - public static string CodeMaidOptions { - get { - return ResourceManager.GetString("CodeMaidOptions", resourceCulture); - } - } - - /// - /// 查找类似 Collapse solutions when they are opened 的本地化字符串。 + /// 查找类似 CodeMaid: Confirmation for Cleanup All Code 的本地化字符串。 /// - public static string CollapseSolutionsWhenTheyAreOpened { + public static string CodeMaidConfirmationForCleanupAllCode { get { - return ResourceManager.GetString("CollapseSolutionsWhenTheyAreOpened", resourceCulture); + return ResourceManager.GetString("CodeMaidConfirmationForCleanupAllCode", resourceCulture); } } /// - /// 查找类似 Collapsing 的本地化字符串。 + /// 查找类似 CodeMaid did not find a non-code comment {0} to reformat. 的本地化字符串。 /// - public static string CollapsingViewModel_Collapsing { + public static string CodeMaidDidNotFindANonCodeComment0ToReformat { get { - return ResourceManager.GetString("CollapsingViewModel_Collapsing", resourceCulture); + return ResourceManager.GetString("CodeMaidDidNotFindANonCodeComment0ToReformat", resourceCulture); } } /// - /// 查找类似 CodeMaid Format Comment 的本地化字符串。 + /// 查找类似 CodeMaid: Export 的本地化字符串。 /// - public static string CommentFormatCommand_CommentFormatCommand_CodeMaidFormatComment { + public static string CodeMaidExport { get { - return ResourceManager.GetString("CommentFormatCommand_CommentFormatCommand_CodeMaidFormatComment", resourceCulture); + return ResourceManager.GetString("CodeMaidExport", resourceCulture); } } /// - /// 查找类似 CodeMaid did not find a non-code comment {0} to reformat. 的本地化字符串。 + /// 查找类似 CodeMaid failed to load theme '{0}'. See output window for more details. 的本地化字符串。 /// - public static string CommentFormatCommand_OnExecute_CodeMaidDidNotFindANonCodeComment0ToReformat { + public static string CodeMaidFailedToLoadTheme0SeeOutputWindowForMoreDetails { get { - return ResourceManager.GetString("CommentFormatCommand_OnExecute_CodeMaidDidNotFindANonCodeComment0ToReformat", resourceCulture); + return ResourceManager.GetString("CodeMaidFailedToLoadTheme0SeeOutputWindowForMoreDetails", resourceCulture); } } /// /// 查找类似 CodeMaid finished formatting the comment. 的本地化字符串。 /// - public static string CommentFormatCommand_OnExecute_CodeMaidFinishedFormattingTheComment { + public static string CodeMaidFinishedFormattingTheComment { get { - return ResourceManager.GetString("CommentFormatCommand_OnExecute_CodeMaidFinishedFormattingTheComment", resourceCulture); + return ResourceManager.GetString("CodeMaidFinishedFormattingTheComment", resourceCulture); } } /// /// 查找类似 CodeMaid finished formatting the comments {0}. 的本地化字符串。 /// - public static string CommentFormatCommand_OnExecute_CodeMaidFinishedFormattingTheComments0 { + public static string CodeMaidFinishedFormattingTheComments0 { get { - return ResourceManager.GetString("CommentFormatCommand_OnExecute_CodeMaidFinishedFormattingTheComments0", resourceCulture); + return ResourceManager.GetString("CodeMaidFinishedFormattingTheComments0", resourceCulture); } } /// - /// 查找类似 in the selection 的本地化字符串。 - /// - public static string CommentFormatCommand_OnExecute_InTheSelection { - get { - return ResourceManager.GetString("CommentFormatCommand_OnExecute_InTheSelection", resourceCulture); - } - } - - /// - /// 查找类似 under the cursor 的本地化字符串。 - /// - public static string CommentFormatCommand_OnExecute_UnderTheCursor { - get { - return ResourceManager.GetString("CommentFormatCommand_OnExecute_UnderTheCursor", resourceCulture); - } - } - - /// - /// 查找类似 Conditions 的本地化字符串。 - /// - public static string Conditions { - get { - return ResourceManager.GetString("Conditions", resourceCulture); - } - } - - /// - /// 查找类似 Diagnostics mode 的本地化字符串。 - /// - public static string DiagnosticsMode { - get { - return ResourceManager.GetString("DiagnosticsMode", resourceCulture); - } - } - - /// - /// 查找类似 Digging (Spade) 的本地化字符串。 - /// - public static string DiggingViewModel_DiggingSpade { - get { - return ResourceManager.GetString("DiggingViewModel_DiggingSpade", resourceCulture); - } - } - - /// - /// 查找类似 Display 的本地化字符串。 - /// - public static string Display { - get { - return ResourceManager.GetString("Display", resourceCulture); - } - } - - /// - /// 查找类似 Drag to reorder, drag over to group, right click to split, double-click to rename 的本地化字符串。 - /// - public static string DragToReorderDragOverToGroupRightClickToSplitDoubleClickToRename { - get { - return ResourceManager.GetString("DragToReorderDragOverToGroupRightClickToSplitDoubleClickToRename", resourceCulture); - } - } - - /// - /// 查找类似 Everything else (ex: .txt, README) 的本地化字符串。 - /// - public static string EverythingElseExTxtREADME { - get { - return ResourceManager.GetString("EverythingElseExTxtREADME", resourceCulture); - } - } - - /// - /// 查找类似 Exclude 的本地化字符串。 - /// - public static string Exclude { - get { - return ResourceManager.GetString("Exclude", resourceCulture); - } - } - - /// - /// 查找类似 Ex: #endregion Methods 的本地化字符串。 - /// - public static string ExEndregionMethods { - get { - return ResourceManager.GetString("ExEndregionMethods", resourceCulture); - } - } - - /// - /// 查找类似 Export 的本地化字符串。 - /// - public static string Export { - get { - return ResourceManager.GetString("Export", resourceCulture); - } - } - - /// - /// 查找类似 Ex: #region Public Methods, #region Private Methods 的本地化字符串。 - /// - public static string ExRegionPublicMethodsRegionPrivateMethods { - get { - return ResourceManager.GetString("ExRegionPublicMethodsRegionPrivateMethods", resourceCulture); - } - } - - /// - /// 查找类似 External 的本地化字符串。 - /// - public static string External { - get { - return ResourceManager.GetString("External", resourceCulture); - } - } - - /// - /// 查找类似 Extra indent for values inside XML comments 的本地化字符串。 - /// - public static string ExtraIndentForValuesInsideXMLComments { - get { - return ResourceManager.GetString("ExtraIndentForValuesInsideXMLComments", resourceCulture); - } - } - - /// - /// 查找类似 File Header 的本地化字符串。 - /// - public static string FileHeader { - get { - return ResourceManager.GetString("FileHeader", resourceCulture); - } - } - - /// - /// 查找类似 file order 的本地化字符串。 - /// - public static string FileOrder { - get { - return ResourceManager.GetString("FileOrder", resourceCulture); - } - } - - /// - /// 查找类似 Finding 的本地化字符串。 - /// - public static string FindingViewModel_Finding { - get { - return ResourceManager.GetString("FindingViewModel_Finding", resourceCulture); - } - } - - /// - /// 查找类似 Font 的本地化字符串。 - /// - public static string Font { - get { - return ResourceManager.GetString("Font", resourceCulture); - } - } - - /// - /// 查找类似 Formatting 的本地化字符串。 - /// - public static string FormattingViewModel_Formatting { - get { - return ResourceManager.GetString("FormattingViewModel_Formatting", resourceCulture); - } - } - - /// - /// 查找类似 General 的本地化字符串。 + /// 查找类似 CodeMaid Format Comment 的本地化字符串。 /// - public static string General { + public static string CodeMaidFormatComment { get { - return ResourceManager.GetString("General", resourceCulture); + return ResourceManager.GetString("CodeMaidFormatComment", resourceCulture); } } /// - /// 查找类似 About CodeMaid... 的本地化字符串。 + /// 查找类似 CodeMaid has successfully exported 的本地化字符串。 /// - public static string GuidCodeMaidCommandAbout { + public static string CodeMaidHasSuccessfullyExported { get { - return ResourceManager.GetString("GuidCodeMaidCommandAbout", resourceCulture); + return ResourceManager.GetString("CodeMaidHasSuccessfullyExported", resourceCulture); } } /// - /// 查找类似 &Build Progress 的本地化字符串。 + /// 查找类似 CodeMaid: Import 的本地化字符串。 /// - public static string GuidCodeMaidCommandBuildProgressToolWindow { + public static string CodeMaidImport { get { - return ResourceManager.GetString("GuidCodeMaidCommandBuildProgressToolWindow", resourceCulture); + return ResourceManager.GetString("CodeMaidImport", resourceCulture); } } /// - /// 查找类似 &Cleanup Active Document 的本地化字符串。 + /// 查找类似 CodeMaid Options 的本地化字符串。 /// - public static string GuidCodeMaidCommandCleanupActiveCode { + public static string CodeMaidOptions { get { - return ResourceManager.GetString("GuidCodeMaidCommandCleanupActiveCode", resourceCulture); + return ResourceManager.GetString("CodeMaidOptions", resourceCulture); } } /// - /// 查找类似 Cleanup &All Code... 的本地化字符串。 + /// 查找类似 CodeMaid Spade 的本地化字符串。 /// - public static string GuidCodeMaidCommandCleanupAllCode { + public static string CodeMaidSpade { get { - return ResourceManager.GetString("GuidCodeMaidCommandCleanupAllCode", resourceCulture); + return ResourceManager.GetString("CodeMaidSpade", resourceCulture); } } /// - /// 查找类似 &Cleanup Open Code 的本地化字符串。 + /// 查找类似 CodeMaid turned automatic cleanup on save 的本地化字符串。 /// - public static string GuidCodeMaidCommandCleanupOpenCode { + public static string CodeMaidTurnedAutomaticCleanupOnSave { get { - return ResourceManager.GetString("GuidCodeMaidCommandCleanupOpenCode", resourceCulture); + return ResourceManager.GetString("CodeMaidTurnedAutomaticCleanupOnSave", resourceCulture); } } /// - /// 查找类似 &Cleanup Selected Code 的本地化字符串。 + /// 查找类似 CodeMaid was unable to export 的本地化字符串。 /// - public static string GuidCodeMaidCommandCleanupSelectedCode { + public static string CodeMaidWasUnableToExport { get { - return ResourceManager.GetString("GuidCodeMaidCommandCleanupSelectedCode", resourceCulture); + return ResourceManager.GetString("CodeMaidWasUnableToExport", resourceCulture); } } /// - /// 查找类似 Close All &Read-Only 的本地化字符串。 + /// 查找类似 Collapse solutions when they are opened 的本地化字符串。 /// - public static string GuidCodeMaidCommandCloseAllReadOnly { + public static string CollapseSolutionsWhenTheyAreOpened { get { - return ResourceManager.GetString("GuidCodeMaidCommandCloseAllReadOnly", resourceCulture); + return ResourceManager.GetString("CollapseSolutionsWhenTheyAreOpened", resourceCulture); } } /// - /// 查找类似 Co&llapse All Recursively 的本地化字符串。 + /// 查找类似 Collapsing 的本地化字符串。 /// - public static string GuidCodeMaidCommandCollapseAllSolutionExplorer { + public static string CollapsingViewModel_Collapsing { get { - return ResourceManager.GetString("GuidCodeMaidCommandCollapseAllSolutionExplorer", resourceCulture); + return ResourceManager.GetString("CollapsingViewModel_Collapsing", resourceCulture); } } /// - /// 查找类似 Co&llapse Recursively 的本地化字符串。 + /// 查找类似 Conditions 的本地化字符串。 /// - public static string GuidCodeMaidCommandCollapseSelectedSolutionExplorer { + public static string Conditions { get { - return ResourceManager.GetString("GuidCodeMaidCommandCollapseSelectedSolutionExplorer", resourceCulture); + return ResourceManager.GetString("Conditions", resourceCulture); } } /// - /// 查找类似 Format Comme&amp;nt 的本地化字符串。 + /// 查找类似 Config files (*.config)|*.config|All Files (*.*)|*.* 的本地化字符串。 /// - public static string GuidCodeMaidCommandCommentFormat { + public static string ConfigFilesConfigConfigAllFiles { get { - return ResourceManager.GetString("GuidCodeMaidCommandCommentFormat", resourceCulture); + return ResourceManager.GetString("ConfigFilesConfigConfigAllFiles", resourceCulture); } } /// - /// 查找类似 &Find In Solution Explorer 的本地化字符串。 + /// 查找类似 Deploying 的本地化字符串。 /// - public static string GuidCodeMaidCommandFindInSolutionExplorer { + public static string Deploying { get { - return ResourceManager.GetString("GuidCodeMaidCommandFindInSolutionExplorer", resourceCulture); + return ResourceManager.GetString("Deploying", resourceCulture); } } /// - /// 查找类似 &Join Lines 的本地化字符串。 + /// 查找类似 Diagnostics 的本地化字符串。 /// - public static string GuidCodeMaidCommandJoinLines { + public static string Diagnostics { get { - return ResourceManager.GetString("GuidCodeMaidCommandJoinLines", resourceCulture); + return ResourceManager.GetString("Diagnostics", resourceCulture); } } /// - /// 查找类似 &Options... 的本地化字符串。 + /// 查找类似 Diagnostics mode 的本地化字符串。 /// - public static string GuidCodeMaidCommandOptions { + public static string DiagnosticsMode { get { - return ResourceManager.GetString("GuidCodeMaidCommandOptions", resourceCulture); + return ResourceManager.GetString("DiagnosticsMode", resourceCulture); } } /// - /// 查找类似 &Read-Only Toggle 的本地化字符串。 + /// 查找类似 Digging (Spade) 的本地化字符串。 /// - public static string GuidCodeMaidCommandReadOnlyToggle { + public static string DiggingViewModel_DiggingSpade { get { - return ResourceManager.GetString("GuidCodeMaidCommandReadOnlyToggle", resourceCulture); + return ResourceManager.GetString("DiggingViewModel_DiggingSpade", resourceCulture); } } /// - /// 查找类似 &Remove All Regions 的本地化字符串。 + /// 查找类似 Display 的本地化字符串。 /// - public static string GuidCodeMaidCommandRemoveRegion { + public static string Display { get { - return ResourceManager.GetString("GuidCodeMaidCommandRemoveRegion", resourceCulture); + return ResourceManager.GetString("Display", resourceCulture); } } /// - /// 查找类似 Reorgani&ze Active Document 的本地化字符串。 + /// 查找类似 Do you want to perform a partial cleanup? 的本地化字符串。 /// - public static string GuidCodeMaidCommandReorganizeActiveCode { + public static string DoYouWantToPerformAPartialCleanup { get { - return ResourceManager.GetString("GuidCodeMaidCommandReorganizeActiveCode", resourceCulture); + return ResourceManager.GetString("DoYouWantToPerformAPartialCleanup", resourceCulture); } } /// - /// 查找类似 &Automatic Cleanup On Save 的本地化字符串。 + /// 查找类似 Drag to reorder, drag over to group, right click to split, double-click to rename 的本地化字符串。 /// - public static string GuidCodeMaidCommandSettingCleanupOnSave { + public static string DragToReorderDragOverToGroupRightClickToSplitDoubleClickToRename { get { - return ResourceManager.GetString("GuidCodeMaidCommandSettingCleanupOnSave", resourceCulture); + return ResourceManager.GetString("DragToReorderDragOverToGroupRightClickToSplitDoubleClickToRename", resourceCulture); } } /// - /// 查找类似 &Sort Lines 的本地化字符串。 + /// 查找类似 Everything else (ex: .txt, README) 的本地化字符串。 /// - public static string GuidCodeMaidCommandSortLines { + public static string EverythingElseExTxtREADME { get { - return ResourceManager.GetString("GuidCodeMaidCommandSortLines", resourceCulture); + return ResourceManager.GetString("EverythingElseExTxtREADME", resourceCulture); } } /// - /// 查找类似 &Delete 的本地化字符串。 + /// 查找类似 Exclude 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeContextDelete { + public static string Exclude { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeContextDelete", resourceCulture); + return ResourceManager.GetString("Exclude", resourceCulture); } } /// - /// 查找类似 &Find References 的本地化字符串。 + /// 查找类似 Ex: #endregion Methods 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeContextFindReferences { + public static string ExEndregionMethods { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeContextFindReferences", resourceCulture); + return ResourceManager.GetString("ExEndregionMethods", resourceCulture); } } /// - /// 查找类似 &Insert Region 的本地化字符串。 + /// 查找类似 Export 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeContextInsertRegion { + public static string Export { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeContextInsertRegion", resourceCulture); + return ResourceManager.GetString("Export", resourceCulture); } } /// - /// 查找类似 &Remove Region 的本地化字符串。 + /// 查找类似 Ex: #region Public Methods, #region Private Methods 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeContextRemoveRegion { + public static string ExRegionPublicMethodsRegionPrivateMethods { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeContextRemoveRegion", resourceCulture); + return ResourceManager.GetString("ExRegionPublicMethodsRegionPrivateMethods", resourceCulture); } } /// - /// 查找类似 &Options... 的本地化字符串。 + /// 查找类似 External 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeOptions { + public static string External { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeOptions", resourceCulture); + return ResourceManager.GetString("External", resourceCulture); } } /// - /// 查找类似 Refresh Spade 的本地化字符串。 + /// 查找类似 Extra indent for values inside XML comments 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeRefresh { + public static string ExtraIndentForValuesInsideXMLComments { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeRefresh", resourceCulture); + return ResourceManager.GetString("ExtraIndentForValuesInsideXMLComments", resourceCulture); } } /// - /// 查找类似 Search Spade 的本地化字符串。 + /// 查找类似 File Header 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeSearch { + public static string FileHeader { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeSearch", resourceCulture); + return ResourceManager.GetString("FileHeader", resourceCulture); } } /// - /// 查找类似 Sort alphabetically 的本地化字符串。 + /// 查找类似 file order 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeSortOrderAlpha { + public static string FileOrder { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeSortOrderAlpha", resourceCulture); + return ResourceManager.GetString("FileOrder", resourceCulture); } } /// - /// 查找类似 Sort by file order 的本地化字符串。 + /// 查找类似 Finding 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeSortOrderFile { + public static string FindingViewModel_Finding { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeSortOrderFile", resourceCulture); + return ResourceManager.GetString("FindingViewModel_Finding", resourceCulture); } } /// - /// 查找类似 Sort by type 的本地化字符串。 + /// 查找类似 Font 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeSortOrderType { + public static string Font { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeSortOrderType", resourceCulture); + return ResourceManager.GetString("Font", resourceCulture); } } /// - /// 查找类似 &Spade 的本地化字符串。 + /// 查找类似 Formatting 的本地化字符串。 /// - public static string GuidCodeMaidCommandSpadeToolWindow { + public static string FormattingViewModel_Formatting { get { - return ResourceManager.GetString("GuidCodeMaidCommandSpadeToolWindow", resourceCulture); + return ResourceManager.GetString("FormattingViewModel_Formatting", resourceCulture); } } /// - /// 查找类似 &Switch File 的本地化字符串。 + /// 查找类似 General 的本地化字符串。 /// - public static string GuidCodeMaidCommandSwitchFile { + public static string General { get { - return ResourceManager.GetString("GuidCodeMaidCommandSwitchFile", resourceCulture); + return ResourceManager.GetString("General", resourceCulture); } } @@ -1118,173 +898,110 @@ public static string InsertNewRegions { } /// - /// 查找类似 Keep members within regions 的本地化字符串。 - /// - public static string KeepMembersWithinRegions { - get { - return ResourceManager.GetString("KeepMembersWithinRegions", resourceCulture); - } - } - - /// - /// 查找类似 Keep XML tags together 的本地化字符串。 - /// - public static string KeepXMLTagsTogether { - get { - return ResourceManager.GetString("KeepXMLTagsTogether", resourceCulture); - } - } - - /// - /// 查找类似 Load models asynchronously 的本地化字符串。 - /// - public static string LoadModelsAsynchronously { - get { - return ResourceManager.GetString("LoadModelsAsynchronously", resourceCulture); - } - } - - /// - /// 查找类似 Member type order, grouping and preferred names 的本地化字符串。 - /// - public static string MemberTypeOrderGroupingAndPreferredNames { - get { - return ResourceManager.GetString("MemberTypeOrderGroupingAndPreferredNames", resourceCulture); - } - } - - /// - /// 查找类似 name only 的本地化字符串。 - /// - public static string NameOnly { - get { - return ResourceManager.GetString("NameOnly", resourceCulture); - } - } - - /// - /// 查找类似 Navigation 的本地化字符串。 - /// - public static string Navigation { - get { - return ResourceManager.GetString("Navigation", resourceCulture); - } - } - - /// - /// 查找类似 Solution-Specific Settings 的本地化字符串。 - /// - public static string OptionsViewModel_GetSettingsName_SolutionSpecificSettings { - get { - return ResourceManager.GetString("OptionsViewModel_GetSettingsName_SolutionSpecificSettings", resourceCulture); - } - } - - /// - /// 查找类似 User Settings 的本地化字符串。 + /// 查找类似 in the selection 的本地化字符串。 /// - public static string OptionsViewModel_GetSettingsName_UserSettings { + public static string InTheSelection { get { - return ResourceManager.GetString("OptionsViewModel_GetSettingsName_UserSettings", resourceCulture); + return ResourceManager.GetString("InTheSelection", resourceCulture); } } /// - /// 查找类似 CodeMaid: Export 的本地化字符串。 + /// 查找类似 is not in the solution so some cleanup actions may be unavailable. 的本地化字符串。 /// - public static string OptionsViewModel_OnExportCommandExecuted_CodeMaidExport { + public static string IsNotInTheSolutionSoSomeCleanupActionsMayBeUnavailable { get { - return ResourceManager.GetString("OptionsViewModel_OnExportCommandExecuted_CodeMaidExport", resourceCulture); + return ResourceManager.GetString("IsNotInTheSolutionSoSomeCleanupActionsMayBeUnavailable", resourceCulture); } } /// - /// 查找类似 CodeMaid has successfully exported 的本地化字符串。 + /// 查找类似 Keep members within regions 的本地化字符串。 /// - public static string OptionsViewModel_OnExportCommandExecuted_CodeMaidHasSuccessfullyExported { + public static string KeepMembersWithinRegions { get { - return ResourceManager.GetString("OptionsViewModel_OnExportCommandExecuted_CodeMaidHasSuccessfullyExported", resourceCulture); + return ResourceManager.GetString("KeepMembersWithinRegions", resourceCulture); } } /// - /// 查找类似 CodeMaid was unable to export 的本地化字符串。 + /// 查找类似 Keep XML tags together 的本地化字符串。 /// - public static string OptionsViewModel_OnExportCommandExecuted_CodeMaidWasUnableToExport { + public static string KeepXMLTagsTogether { get { - return ResourceManager.GetString("OptionsViewModel_OnExportCommandExecuted_CodeMaidWasUnableToExport", resourceCulture); + return ResourceManager.GetString("KeepXMLTagsTogether", resourceCulture); } } /// - /// 查找类似 . See output window for more details. 的本地化字符串。 + /// 查找类似 Load models asynchronously 的本地化字符串。 /// - public static string OptionsViewModel_OnExportCommandExecuted_SeeOutputWindowForMoreDetails { + public static string LoadModelsAsynchronously { get { - return ResourceManager.GetString("OptionsViewModel_OnExportCommandExecuted_SeeOutputWindowForMoreDetails", resourceCulture); + return ResourceManager.GetString("LoadModelsAsynchronously", resourceCulture); } } /// - /// 查找类似 Successful 的本地化字符串。 + /// 查找类似 Member type order, grouping and preferred names 的本地化字符串。 /// - public static string OptionsViewModel_OnExportCommandExecuted_Successful { + public static string MemberTypeOrderGroupingAndPreferredNames { get { - return ResourceManager.GetString("OptionsViewModel_OnExportCommandExecuted_Successful", resourceCulture); + return ResourceManager.GetString("MemberTypeOrderGroupingAndPreferredNames", resourceCulture); } } /// - /// 查找类似 to '{0}'. 的本地化字符串。 + /// 查找类似 Miscellaneous 的本地化字符串。 /// - public static string OptionsViewModel_OnExportCommandExecuted_To0 { + public static string Miscellaneous { get { - return ResourceManager.GetString("OptionsViewModel_OnExportCommandExecuted_To0", resourceCulture); + return ResourceManager.GetString("Miscellaneous", resourceCulture); } } /// - /// 查找类似 Unsuccessful 的本地化字符串。 + /// 查找类似 name only 的本地化字符串。 /// - public static string OptionsViewModel_OnExportCommandExecuted_Unsuccessful { + public static string NameOnly { get { - return ResourceManager.GetString("OptionsViewModel_OnExportCommandExecuted_Unsuccessful", resourceCulture); + return ResourceManager.GetString("NameOnly", resourceCulture); } } /// - /// 查找类似 CodeMaid: Import 的本地化字符串。 + /// 查找类似 Navigation 的本地化字符串。 /// - public static string OptionsViewModel_OnImportCommandExecuted_CodeMaidImport { + public static string Navigation { get { - return ResourceManager.GetString("OptionsViewModel_OnImportCommandExecuted_CodeMaidImport", resourceCulture); + return ResourceManager.GetString("Navigation", resourceCulture); } } /// - /// 查找类似 Config files (*.config)|*.config|All Files (*.*)|*.* 的本地化字符串。 + /// 查找类似 New Region 的本地化字符串。 /// - public static string OptionsViewModel_OnImportCommandExecuted_ConfigFilesConfigConfigAllFiles { + public static string NewRegion { get { - return ResourceManager.GetString("OptionsViewModel_OnImportCommandExecuted_ConfigFilesConfigConfigAllFiles", resourceCulture); + return ResourceManager.GetString("NewRegion", resourceCulture); } } /// - /// 查找类似 Options will be saved to '{0}'. 的本地化字符串。 + /// 查找类似 Other cleaning commands (ex: ReSharper.ReSharper_SilentCleanupCode) 的本地化字符串。 /// - public static string OptionsWillBeSavedTo0 { + public static string OtherCleaningCommandsExReSharperReSharper_SilentCleanupCode { get { - return ResourceManager.GetString("OptionsWillBeSavedTo0", resourceCulture); + return ResourceManager.GetString("OtherCleaningCommandsExReSharperReSharper_SilentCleanupCode", resourceCulture); } } /// - /// 查找类似 Other cleaning commands (ex: ReSharper.ReSharper_SilentCleanupCode) 的本地化字符串。 + /// 查找类似 Performance 的本地化字符串。 /// - public static string OtherCleaningCommandsExReSharperReSharper_SilentCleanupCode { + public static string Performance { get { - return ResourceManager.GetString("OtherCleaningCommandsExReSharperReSharper_SilentCleanupCode", resourceCulture); + return ResourceManager.GetString("Performance", resourceCulture); } } @@ -1379,11 +1096,11 @@ public static string ProgressingViewModel_Progressing { } /// - /// 查找类似 Unable to toggle read only state on 的本地化字符串。 + /// 查找类似 Rebuilding 的本地化字符串。 /// - public static string ReadOnlyToggleCommand_OnExecute_UnableToToggleReadOnlyStateOn { + public static string Rebuilding { get { - return ResourceManager.GetString("ReadOnlyToggleCommand_OnExecute_UnableToToggleReadOnlyStateOn", resourceCulture); + return ResourceManager.GetString("Rebuilding", resourceCulture); } } @@ -1414,6 +1131,15 @@ public static string Remove { } } + /// + /// 查找类似 &Remove All Regions 的本地化字符串。 + /// + public static string RemoveAllRegions { + get { + return ResourceManager.GetString("RemoveAllRegions", resourceCulture); + } + } + /// /// 查找类似 Remove blank lines 的本地化字符串。 /// @@ -1432,6 +1158,15 @@ public static string RemoveBlankSpaces { } } + /// + /// 查找类似 &Remove Current Region 的本地化字符串。 + /// + public static string RemoveCurrentRegion { + get { + return ResourceManager.GetString("RemoveCurrentRegion", resourceCulture); + } + } + /// /// 查找类似 Remove end of file trailing new line 的本地化字符串。 /// @@ -1469,47 +1204,29 @@ public static string RemoveMultipleConsecutiveBlankLines { } /// - /// 查找类似 &Remove All Regions 的本地化字符串。 - /// - public static string RemoveRegionCommand_OnBeforeQueryStatus_RemoveAllRegions { - get { - return ResourceManager.GetString("RemoveRegionCommand_OnBeforeQueryStatus_RemoveAllRegions", resourceCulture); - } - } - - /// - /// 查找类似 &Remove Current Region 的本地化字符串。 + /// 查找类似 Remove regions 的本地化字符串。 /// - public static string RemoveRegionCommand_OnBeforeQueryStatus_RemoveCurrentRegion { + public static string RemoveRegions { get { - return ResourceManager.GetString("RemoveRegionCommand_OnBeforeQueryStatus_RemoveCurrentRegion", resourceCulture); + return ResourceManager.GetString("RemoveRegions", resourceCulture); } } /// /// 查找类似 &Remove Selected Regions 的本地化字符串。 /// - public static string RemoveRegionCommand_OnBeforeQueryStatus_RemoveSelectedRegions { - get { - return ResourceManager.GetString("RemoveRegionCommand_OnBeforeQueryStatus_RemoveSelectedRegions", resourceCulture); - } - } - - /// - /// 查找类似 Remove regions 的本地化字符串。 - /// - public static string RemoveRegions { + public static string RemoveSelectedRegions { get { - return ResourceManager.GetString("RemoveRegions", resourceCulture); + return ResourceManager.GetString("RemoveSelectedRegions", resourceCulture); } } /// /// 查找类似 Reorganizing 的本地化字符串。 /// - public static string ReorganizingParentViewModel_Reorganizing { + public static string Reorganizing { get { - return ResourceManager.GetString("ReorganizingParentViewModel_Reorganizing", resourceCulture); + return ResourceManager.GetString("Reorganizing", resourceCulture); } } @@ -1604,56 +1321,56 @@ public static string Save { } /// - /// 查找类似 Select a sub-category to set options. 的本地化字符串。 + /// 查找类似 Search CodeMaid Spade (Ctrl+M, ;) 的本地化字符串。 /// - public static string SelectASubCategoryToSetOptions { + public static string SearchCodeMaidSpadeCtrlM { get { - return ResourceManager.GetString("SelectASubCategoryToSetOptions", resourceCulture); + return ResourceManager.GetString("SearchCodeMaidSpadeCtrlM", resourceCulture); } } /// - /// 查找类似 Sets of related file extensions (ex: .cpp .h ) 的本地化字符串。 + /// 查找类似 . See output window for more details. 的本地化字符串。 /// - public static string SetsOfRelatedFileExtensionsExCppH { + public static string SeeOutputWindowForMoreDetails { get { - return ResourceManager.GetString("SetsOfRelatedFileExtensionsExCppH", resourceCulture); + return ResourceManager.GetString("SeeOutputWindowForMoreDetails", resourceCulture); } } /// - /// 查找类似 OFF 的本地化字符串。 + /// 查找类似 Select a sub-category to set options. 的本地化字符串。 /// - public static string SettingCleanupOnSaveCommand_OFF { + public static string SelectASubCategoryToSetOptions { get { - return ResourceManager.GetString("SettingCleanupOnSaveCommand_OFF", resourceCulture); + return ResourceManager.GetString("SelectASubCategoryToSetOptions", resourceCulture); } } /// - /// 查找类似 ON 的本地化字符串。 + /// 查找类似 Sets of related file extensions (ex: .cpp .h ) 的本地化字符串。 /// - public static string SettingCleanupOnSaveCommand_ON { + public static string SetsOfRelatedFileExtensionsExCppH { get { - return ResourceManager.GetString("SettingCleanupOnSaveCommand_ON", resourceCulture); + return ResourceManager.GetString("SetsOfRelatedFileExtensionsExCppH", resourceCulture); } } /// - /// 查找类似 Automatic Cleanup On Save - 的本地化字符串。 + /// 查找类似 OFF 的本地化字符串。 /// - public static string SettingCleanupOnSaveCommand_OnBeforeQueryStatus_AutomaticCleanupOnSave { + public static string SettingCleanupOnSaveCommand_OFF { get { - return ResourceManager.GetString("SettingCleanupOnSaveCommand_OnBeforeQueryStatus_AutomaticCleanupOnSave", resourceCulture); + return ResourceManager.GetString("SettingCleanupOnSaveCommand_OFF", resourceCulture); } } /// - /// 查找类似 CodeMaid turned automatic cleanup on save 的本地化字符串。 + /// 查找类似 ON 的本地化字符串。 /// - public static string SettingCleanupOnSaveCommand_OnExecute_CodeMaidTurnedAutomaticCleanupOnSave { + public static string SettingCleanupOnSaveCommand_ON { get { - return ResourceManager.GetString("SettingCleanupOnSaveCommand_OnExecute_CodeMaidTurnedAutomaticCleanupOnSave", resourceCulture); + return ResourceManager.GetString("SettingCleanupOnSaveCommand_ON", resourceCulture); } } @@ -1730,74 +1447,65 @@ public static string SkipWrappingOnTheLastWord { } /// - /// 查找类似 Sort 的本地化字符串。 - /// - public static string Sort { - get { - return ResourceManager.GetString("Sort", resourceCulture); - } - } - - /// - /// 查找类似 New Region 的本地化字符串。 + /// 查找类似 Solution-Specific Settings 的本地化字符串。 /// - public static string SpadeContextInsertRegionCommand_OnExecute_NewRegion { + public static string SolutionSpecificSettings { get { - return ResourceManager.GetString("SpadeContextInsertRegionCommand_OnExecute_NewRegion", resourceCulture); + return ResourceManager.GetString("SolutionSpecificSettings", resourceCulture); } } /// - /// 查找类似 Search CodeMaid Spade (Ctrl+M, ;) 的本地化字符串。 + /// 查找类似 Sort 的本地化字符串。 /// - public static string SpadeToolWindow_ProvideSearchSettings_SearchCodeMaidSpadeCtrlM { + public static string Sort { get { - return ResourceManager.GetString("SpadeToolWindow_ProvideSearchSettings_SearchCodeMaidSpadeCtrlM", resourceCulture); + return ResourceManager.GetString("Sort", resourceCulture); } } /// - /// 查找类似 CodeMaid Spade 的本地化字符串。 + /// 查找类似 Split 的本地化字符串。 /// - public static string SpadeToolWindow_SpadeToolWindow_CodeMaidSpade { + public static string Split { get { - return ResourceManager.GetString("SpadeToolWindow_SpadeToolWindow_CodeMaidSpade", resourceCulture); + return ResourceManager.GetString("Split", resourceCulture); } } /// - /// 查找类似 Split 的本地化字符串。 + /// 查找类似 Successful 的本地化字符串。 /// - public static string Split { + public static string Successful { get { - return ResourceManager.GetString("Split", resourceCulture); + return ResourceManager.GetString("Successful", resourceCulture); } } /// /// 查找类似 S&witch File 的本地化字符串。 /// - public static string SwitchFileCommand_OnBeforeQueryStatus_SWitchFile { + public static string SWitchFile { get { - return ResourceManager.GetString("SwitchFileCommand_OnBeforeQueryStatus_SWitchFile", resourceCulture); + return ResourceManager.GetString("SWitchFile", resourceCulture); } } /// - /// 查找类似 S&witch to 的本地化字符串。 + /// 查找类似 Switching 的本地化字符串。 /// - public static string SwitchFileCommand_OnBeforeQueryStatus_SWitchTo { + public static string SwitchingViewModel_Switching { get { - return ResourceManager.GetString("SwitchFileCommand_OnBeforeQueryStatus_SWitchTo", resourceCulture); + return ResourceManager.GetString("SwitchingViewModel_Switching", resourceCulture); } } /// - /// 查找类似 Switching 的本地化字符串。 + /// 查找类似 S&witch to 的本地化字符串。 /// - public static string SwitchingViewModel_Switching { + public static string SWitchTo { get { - return ResourceManager.GetString("SwitchingViewModel_Switching", resourceCulture); + return ResourceManager.GetString("SWitchTo", resourceCulture); } } @@ -1838,21 +1546,20 @@ public static string Theme { } /// - /// 查找类似 CodeMaid failed to load theme '{0}'. See output window for more details. 的本地化字符串。 + /// 查找类似 Third Party 的本地化字符串。 /// - public static string ThemeManager_LoadResourceDictionary_CodeMaidFailedToLoadTheme0SeeOutputWindowForMoreDetails { + public static string ThirdPartyViewModel_ThirdParty { get { - return ResourceManager.GetString("ThemeManager_LoadResourceDictionary_CodeMaidFailedToLoadTheme0SeeOutputWindowForM" + - "oreDetails", resourceCulture); + return ResourceManager.GetString("ThirdPartyViewModel_ThirdParty", resourceCulture); } } /// - /// 查找类似 Third Party 的本地化字符串。 + /// 查找类似 to '{0}'. 的本地化字符串。 /// - public static string ThirdPartyViewModel_ThirdParty { + public static string To0 { get { - return ResourceManager.GetString("ThirdPartyViewModel_ThirdParty", resourceCulture); + return ResourceManager.GetString("To0", resourceCulture); } } @@ -1874,6 +1581,33 @@ public static string TypeThenAccess { } } + /// + /// 查找类似 Unable to toggle read only state on 的本地化字符串。 + /// + public static string UnableToToggleReadOnlyStateOn { + get { + return ResourceManager.GetString("UnableToToggleReadOnlyStateOn", resourceCulture); + } + } + + /// + /// 查找类似 under the cursor 的本地化字符串。 + /// + public static string UnderTheCursor { + get { + return ResourceManager.GetString("UnderTheCursor", resourceCulture); + } + } + + /// + /// 查找类似 Unsuccessful 的本地化字符串。 + /// + public static string Unsuccessful { + get { + return ResourceManager.GetString("Unsuccessful", resourceCulture); + } + } + /// /// 查找类似 Update accessors to both be single-line or multi-line (SA1504) 的本地化字符串。 /// @@ -1901,6 +1635,15 @@ public static string UpdateSingleLineMethodsByPlacingBracesOnSeparateLinesSA1502 } } + /// + /// 查找类似 User Settings 的本地化字符串。 + /// + public static string UserSettings { + get { + return ResourceManager.GetString("UserSettings", resourceCulture); + } + } + /// /// 查找类似 Use undo transactions 的本地化字符串。 /// @@ -1982,6 +1725,15 @@ public static string WholeItem { } } + /// + /// 查找类似 Windows taskbar 的本地化字符串。 + /// + public static string WindowsTaskbar { + get { + return ResourceManager.GetString("WindowsTaskbar", resourceCulture); + } + } + /// /// 查找类似 Wrap comments at column 的本地化字符串。 /// diff --git a/CodeMaid/Properties/Resources.en-US.resx b/CodeMaid/Properties/Resources.en-US.resx index 454bffe9..24d45970 100644 --- a/CodeMaid/Properties/Resources.en-US.resx +++ b/CodeMaid/Properties/Resources.en-US.resx @@ -1,4 +1,4 @@ - + - + &CodeMaid &CodeMaid - + DefaultDocked CodeMaid Spade Toolbar CodeMaid Spade Toolbar - + CodeMaid Spade Context Menu CodeMaid Spade Context Menu - - + + CodeMaid - - + + CodeMaid - - + + CodeMaid - - + + CodeMaid - - + + CodeMaid - - + + CodeMaid - - + + CodeMaid - - + + CodeMaid - - + + CodeMaid - - + + CodeMaid @@ -123,154 +123,154 @@ group as the part of a menu contained between two lines. The parent of a group must be a menu. --> - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + @@ -286,21 +286,21 @@ DefaultInvisible DynamicVisibility If you do not want an image next to your command, remove the Icon node or set it to --> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - [PackageRegistration(UseManagedResourcesOnly = true)] // Tells Visual Studio utilities that this is a package that needs registered. [InstalledProductRegistration("#110", "#112", Vsix.Version, IconResourceID = 400, LanguageIndependentName = "CodeMaid")] // VS Help/About details (Name, Description, Version, Icon). - [ProvideAutoLoad("ADFC4E64-0397-11D1-9F4E-00A0C911004F")] // Force CodeMaid to load on startup so menu items can determine their state. + [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExistsAndFullyLoaded_string)] // Force CodeMaid to load so menu items can determine their state. [ProvideBindingPath] [ProvideMenuResource(1000, 1)] // This attribute is needed to let the shell know that this package exposes some menus. [ProvideToolWindow(typeof(BuildProgressToolWindow), MultiInstances = false, Height = 40, Width = 500, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Bottom, Window = EnvDTE.Constants.vsWindowKindMainWindow)] [ProvideToolWindow(typeof(SpadeToolWindow), MultiInstances = false, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Left, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)] - [ProvideToolWindowVisibility(typeof(SpadeToolWindow), "{F1536EF8-92EC-443C-9ED7-FDADF150DA82}")] + [ProvideToolWindowVisibility(typeof(SpadeToolWindow), VSConstants.UICONTEXT.SolutionExistsAndFullyLoaded_string)] [Guid(PackageGuids.GuidCodeMaidPackageString)] // Package unique GUID. public sealed class CodeMaidPackage : Package, IVsInstalledProduct { @@ -53,11 +51,6 @@ public sealed class CodeMaidPackage : Package, IVsInstalledProduct /// private BuildProgressToolWindow _buildProgress; - /// - /// An internal collection of the commands registered by this package. - /// - private readonly ICollection _commands = new List(); - /// /// The IComponentModel service. /// @@ -108,6 +101,8 @@ public CodeMaidPackage() Settings.Default.Upgrade(); Settings.Default.Save(); } + + SettingMonitor = new SettingMonitor(Settings.Default); } #endregion Constructors @@ -134,9 +129,15 @@ public Document ActiveDocument } /// - /// Gets the build progress tool window, creating it if necessary. + /// Gets the build progress tool window, if it already exists. /// public BuildProgressToolWindow BuildProgress => + _buildProgress ?? (_buildProgress = (FindToolWindow(typeof(BuildProgressToolWindow), 0, false) as BuildProgressToolWindow)); + + /// + /// Gets the build progress tool window, creating it if necessary. + /// + public BuildProgressToolWindow BuildProgressForceLoad => _buildProgress ?? (_buildProgress = (FindToolWindow(typeof(BuildProgressToolWindow), 0, true) as BuildProgressToolWindow)); /// @@ -168,10 +169,10 @@ public Document ActiveDocument /// /// Gets the service provider. /// - public IServiceProvider ServiceProvider => _serviceProvider ?? (_serviceProvider = new ServiceProvider((Microsoft.VisualStudio.OLE.Interop.IServiceProvider)IDE)); + public IServiceProvider ServiceProvider => this; /// - /// Gets the Spade tool window, iff it already exists. + /// Gets the Spade tool window, if it already exists. /// public SpadeToolWindow Spade => _spade ?? (_spade = (FindToolWindow(typeof(SpadeToolWindow), 0, false) as SpadeToolWindow)); @@ -187,46 +188,9 @@ public Document ActiveDocument /// public ThemeManager ThemeManager => _themeManager ?? (_themeManager = ThemeManager.GetInstance(this)); - #endregion Public Integration Properties - - #region Private Event Listener Properties - - /// - /// Gets or sets the build progress event listener. - /// - private BuildProgressEventListener BuildProgressEventListener { get; set; } + public SettingMonitor SettingMonitor { get; } - /// - /// Gets or sets the document event listener. - /// - private DocumentEventListener DocumentEventListener { get; set; } - - /// - /// Gets or sets the running document table event listener. - /// - private RunningDocumentTableEventListener RunningDocumentTableEventListener { get; set; } - - /// - /// Gets or sets the shell event listener. - /// - private ShellEventListener ShellEventListener { get; set; } - - /// - /// Gets or sets the solution event listener. - /// - private SolutionEventListener SolutionEventListener { get; set; } - - /// - /// Gets or sets the text editor event listener. - /// - private TextEditorEventListener TextEditorEventListener { get; set; } - - /// - /// Gets or sets the window event listener. - /// - private WindowEventListener WindowEventListener { get; set; } - - #endregion Private Event Listener Properties + #endregion Public Integration Properties #region Private Service Properties @@ -250,7 +214,7 @@ protected override void Initialize() base.Initialize(); RegisterCommands(); - RegisterShellEventListener(); + RegisterEventListeners(); } #endregion Package Members @@ -339,114 +303,100 @@ private void OnSolutionClosedShowStartPage() /// private void RegisterCommands() { - var menuCommandService = MenuCommandService; - if (menuCommandService != null) - { - // Create the individual commands, which internally register for command events. - _commands.Add(new AboutCommand(this)); - _commands.Add(new BuildProgressToolWindowCommand(this)); - _commands.Add(new CleanupActiveCodeCommand(this)); - _commands.Add(new CleanupAllCodeCommand(this)); - _commands.Add(new CleanupOpenCodeCommand(this)); - _commands.Add(new CleanupSelectedCodeCommand(this)); - _commands.Add(new CloseAllReadOnlyCommand(this)); - _commands.Add(new CollapseAllSolutionExplorerCommand(this)); - _commands.Add(new CollapseSelectedSolutionExplorerCommand(this)); - _commands.Add(new CommentFormatCommand(this)); - _commands.Add(new FindInSolutionExplorerCommand(this)); - _commands.Add(new JoinLinesCommand(this)); - _commands.Add(new OptionsCommand(this)); - _commands.Add(new ReadOnlyToggleCommand(this)); - _commands.Add(new RemoveRegionCommand(this)); - _commands.Add(new ReorganizeActiveCodeCommand(this)); - _commands.Add(new SettingCleanupOnSaveCommand(this)); - _commands.Add(new SortLinesCommand(this)); - _commands.Add(new SpadeContextDeleteCommand(this)); - _commands.Add(new SpadeContextFindReferencesCommand(this)); - _commands.Add(new SpadeContextInsertRegionCommand(this)); - _commands.Add(new SpadeContextRemoveRegionCommand(this)); - _commands.Add(new SpadeOptionsCommand(this)); - _commands.Add(new SpadeRefreshCommand(this)); - _commands.Add(new SpadeSearchCommand(this)); - _commands.Add(new SpadeSortOrderAlphaCommand(this)); - _commands.Add(new SpadeSortOrderFileCommand(this)); - _commands.Add(new SpadeSortOrderTypeCommand(this)); - _commands.Add(new SpadeToolWindowCommand(this)); - _commands.Add(new SwitchFileCommand(this)); - - // Add all commands to the menu command service. - foreach (var command in _commands) - { - menuCommandService.AddCommand(command); - } - } - } - - /// - /// Registers the shell event listener. - /// - /// - /// This event listener is registered by itself and first to wait for the shell to be ready - /// for other event listeners to be registered. - /// - private void RegisterShellEventListener() - { - ShellEventListener = new ShellEventListener(this, ShellService); - ShellEventListener.EnvironmentColorChanged += () => ThemeManager.ApplyTheme(); - ShellEventListener.ShellAvailable += RegisterNonShellEventListeners; + // Initialize the individual commands, which internally register for command events. + AboutCommand.Initialize(this); + BuildProgressToolWindowCommand.Initialize(this); + CleanupActiveCodeCommand.Initialize(this); + CleanupAllCodeCommand.Initialize(this); + CleanupOpenCodeCommand.Initialize(this); + CleanupSelectedCodeCommand.Initialize(this); + CloseAllReadOnlyCommand.Initialize(this); + CollapseAllSolutionExplorerCommand.Initialize(this); + CollapseSelectedSolutionExplorerCommand.Initialize(this); + CommentFormatCommand.Initialize(this); + FindInSolutionExplorerCommand.Initialize(this); + JoinLinesCommand.Initialize(this); + OptionsCommand.Initialize(this); + ReadOnlyToggleCommand.Initialize(this); + RemoveRegionCommand.Initialize(this); + ReorganizeActiveCodeCommand.Initialize(this); + SettingCleanupOnSaveCommand.Initialize(this); + SortLinesCommand.Initialize(this); + SpadeContextDeleteCommand.Initialize(this); + SpadeContextFindReferencesCommand.Initialize(this); + SpadeContextInsertRegionCommand.Initialize(this); + SpadeContextRemoveRegionCommand.Initialize(this); + SpadeOptionsCommand.Initialize(this); + SpadeRefreshCommand.Initialize(this); + SpadeSearchCommand.Initialize(this); + SpadeSortOrderAlphaCommand.Initialize(this); + SpadeSortOrderFileCommand.Initialize(this); + SpadeSortOrderTypeCommand.Initialize(this); + SpadeToolWindowCommand.Initialize(this); + SwitchFileCommand.Initialize(this); } /// /// Register the package event listeners. /// /// - /// This must occur after the DTE service is available since many of the events are based - /// off of the DTE object. + /// Every event listener registers VS events by itself. /// - private void RegisterNonShellEventListeners() + private void RegisterEventListeners() { - // Create event listeners and register for events. - var menuCommandService = MenuCommandService; - if (menuCommandService != null) - { - var buildProgressToolWindowCommand = _commands.OfType().First(); - var cleanupActiveCodeCommand = _commands.OfType().First(); - var collapseAllSolutionExplorerCommand = _commands.OfType().First(); - var spadeToolWindowCommand = _commands.OfType().First(); - - var codeModelManager = CodeModelManager.GetInstance(this); - var settingsContextHelper = SettingsContextHelper.GetInstance(this); - - BuildProgressEventListener = new BuildProgressEventListener(this); - BuildProgressEventListener.BuildBegin += buildProgressToolWindowCommand.OnBuildBegin; - BuildProgressEventListener.BuildProjConfigBegin += buildProgressToolWindowCommand.OnBuildProjConfigBegin; - BuildProgressEventListener.BuildProjConfigDone += buildProgressToolWindowCommand.OnBuildProjConfigDone; - BuildProgressEventListener.BuildDone += buildProgressToolWindowCommand.OnBuildDone; - - DocumentEventListener = new DocumentEventListener(this); - DocumentEventListener.OnDocumentClosing += codeModelManager.OnDocumentClosing; - - RunningDocumentTableEventListener = new RunningDocumentTableEventListener(this); - RunningDocumentTableEventListener.BeforeSave += cleanupActiveCodeCommand.OnBeforeDocumentSave; - RunningDocumentTableEventListener.AfterSave += spadeToolWindowCommand.OnAfterDocumentSave; - - SolutionEventListener = new SolutionEventListener(this); - SolutionEventListener.OnSolutionOpened += collapseAllSolutionExplorerCommand.OnSolutionOpened; - SolutionEventListener.OnSolutionOpened += settingsContextHelper.OnSolutionOpened; - SolutionEventListener.OnSolutionClosed += settingsContextHelper.OnSolutionClosed; - SolutionEventListener.OnSolutionClosed += OnSolutionClosedShowStartPage; - - // Check if a solution has already been opened before CodeMaid was initialized. - if (IDE.Solution != null && IDE.Solution.IsOpen) - { - collapseAllSolutionExplorerCommand.OnSolutionOpened(); - } + var codeModelManager = CodeModelManager.GetInstance(this); + var settingsContextHelper = SettingsContextHelper.GetInstance(this); - TextEditorEventListener = new TextEditorEventListener(this); - TextEditorEventListener.OnLineChanged += codeModelManager.OnDocumentChanged; + ShellEventListener.Intialize(this, ShellService); + ShellEventListener.Instance.EnvironmentColorChanged += ThemeManager.ApplyTheme; - WindowEventListener = new WindowEventListener(this); - WindowEventListener.OnWindowChange += spadeToolWindowCommand.OnWindowChange; + BuildProgressEventListener.Intialize(this); + BuildProgressEventListener.Instance.BuildBegin += BuildProgressToolWindowCommand.Instance.OnBuildBegin; + BuildProgressEventListener.Instance.BuildProjConfigBegin += BuildProgressToolWindowCommand.Instance.OnBuildProjConfigBegin; + BuildProgressEventListener.Instance.BuildProjConfigDone += BuildProgressToolWindowCommand.Instance.OnBuildProjConfigDone; + BuildProgressEventListener.Instance.BuildDone += BuildProgressToolWindowCommand.Instance.OnBuildDone; + + DocumentEventListener.Intialize(this); + DocumentEventListener.Instance.OnDocumentClosing += codeModelManager.OnDocumentClosing; + + RunningDocumentTableEventListener.Intialize(this); + SettingMonitor.Watch(s => s.Feature_SettingCleanupOnSave, on => + { + if (on) + RunningDocumentTableEventListener.Instance.BeforeSave += CleanupActiveCodeCommand.Instance.OnBeforeDocumentSave; + else + RunningDocumentTableEventListener.Instance.BeforeSave -= CleanupActiveCodeCommand.Instance.OnBeforeDocumentSave; + }); + SettingMonitor.Watch(s => s.Feature_SpadeToolWindow, on => + { + if (on) + RunningDocumentTableEventListener.Instance.AfterSave += SpadeToolWindowCommand.Instance.OnAfterDocumentSave; + else + RunningDocumentTableEventListener.Instance.AfterSave -= SpadeToolWindowCommand.Instance.OnAfterDocumentSave; + }); + + SolutionEventListener.Intialize(this); + SettingMonitor.Watch(s => s.Feature_CollapseAllSolutionExplorer, on => + { + if (on) + SolutionEventListener.Instance.OnSolutionOpened += CollapseAllSolutionExplorerCommand.Instance.OnSolutionOpened; + else + SolutionEventListener.Instance.OnSolutionOpened -= CollapseAllSolutionExplorerCommand.Instance.OnSolutionOpened; + }); + SolutionEventListener.Instance.OnSolutionOpened += settingsContextHelper.OnSolutionOpened; + SolutionEventListener.Instance.OnSolutionClosed += settingsContextHelper.OnSolutionClosed; + SolutionEventListener.Instance.OnSolutionClosed += OnSolutionClosedShowStartPage; + + TextEditorEventListener.Intialize(this); + TextEditorEventListener.Instance.OnLineChanged += codeModelManager.OnDocumentChanged; + + WindowEventListener.Intialize(this); + WindowEventListener.Instance.OnWindowChange += SpadeToolWindowCommand.Instance.OnWindowChange; + + // Check if a solution has already been opened before CodeMaid was initialized. + if (IDE.Solution != null && IDE.Solution.IsOpen) + { + SolutionEventListener.Instance.FireSolutionOpenedEvent(); } } @@ -466,13 +416,13 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); // Dispose of any event listeners. - BuildProgressEventListener?.Dispose(); - DocumentEventListener?.Dispose(); - RunningDocumentTableEventListener?.Dispose(); - ShellEventListener?.Dispose(); - SolutionEventListener?.Dispose(); - TextEditorEventListener?.Dispose(); - WindowEventListener?.Dispose(); + BuildProgressEventListener.Instance.Dispose(); + DocumentEventListener.Instance.Dispose(); + RunningDocumentTableEventListener.Instance.Dispose(); + ShellEventListener.Instance.Dispose(); + SolutionEventListener.Instance.Dispose(); + TextEditorEventListener.Instance.Dispose(); + WindowEventListener.Instance.Dispose(); } #endregion IDisposable Members diff --git a/CodeMaid/Helpers/CodeItemTypeComparer.cs b/CodeMaid/Helpers/CodeItemTypeComparer.cs index 67681d17..7a319193 100644 --- a/CodeMaid/Helpers/CodeItemTypeComparer.cs +++ b/CodeMaid/Helpers/CodeItemTypeComparer.cs @@ -2,7 +2,6 @@ using SteveCadwallader.CodeMaid.Model.CodeItems; using SteveCadwallader.CodeMaid.Properties; using System.Collections.Generic; -using System.Linq; namespace SteveCadwallader.CodeMaid.Helpers { diff --git a/CodeMaid/Helpers/CommandHelper.cs b/CodeMaid/Helpers/CommandHelper.cs index 9127735b..962064e7 100644 --- a/CodeMaid/Helpers/CommandHelper.cs +++ b/CodeMaid/Helpers/CommandHelper.cs @@ -1,5 +1,5 @@ -using System; -using EnvDTE; +using EnvDTE; +using System; using System.Linq; namespace SteveCadwallader.CodeMaid.Helpers diff --git a/CodeMaid/Helpers/SettingMonitor.cs b/CodeMaid/Helpers/SettingMonitor.cs new file mode 100644 index 00000000..96e32dc6 --- /dev/null +++ b/CodeMaid/Helpers/SettingMonitor.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Linq.Expressions; + +namespace SteveCadwallader.CodeMaid.Helpers +{ + public sealed class SettingMonitor where TSetting : ApplicationSettingsBase + { + private readonly Dictionary _monitors = new Dictionary(new StringArrayComparor()); + + public SettingMonitor(TSetting settings) + { + Settings = settings; + Settings.SettingsSaving += (s, e) => NotifySettingsChanged(); + } + + public TSetting Settings { get; } + + internal void NotifySettingsChanged() + { + foreach (var item in _monitors) + { + var monitor = item.Value; + var oldValues = monitor.LastValues; + var newValues = FindValues(item.Key); + if (!Enumerable.SequenceEqual(oldValues, newValues)) + { + monitor.LastValues = newValues; + monitor.Callback.Invoke(newValues); + } + } + } + + private object[] FindValues(string[] settings) => Array.ConvertAll(settings, key => Settings[key]); + + public void Watch(Expression> setting, Action changedCallback) + { + var settingName = (setting.Body as MemberExpression).Member.Name; + Watch(new[] { settingName }, values => changedCallback.Invoke(values[0])); + } + + public void Watch(string[] settings, Action changedCallback) + { + Watch(settings, (object[] values) => + { + var typedValues = Array.ConvertAll(values, v => (TValue)v); + changedCallback.Invoke(typedValues); + }); + } + + public void Watch(string[] settings, Action changedCallback) + { + var values = FindValues(settings); + + changedCallback.Invoke(values); + + if (_monitors.TryGetValue(settings, out var monitor)) + { + monitor.Callback += changedCallback; + } + else + { + monitor = new Monitor { LastValues = values, Callback = changedCallback }; + _monitors.Add(settings, monitor); + } + } + + private class Monitor + { + public object[] LastValues; + public Action Callback; + } + + private class StringArrayComparor : IEqualityComparer + { + private static readonly StringComparer ElementComparer = StringComparer.OrdinalIgnoreCase; + + public bool Equals(string[] x, string[] y) + => Enumerable.SequenceEqual(x, y, ElementComparer); + + public int GetHashCode(string[] strings) + { + int hash = 0; + for (int i = 0; i < strings.Length; i++) + { + hash = unchecked( + hash * 31 ^ ElementComparer.GetHashCode(strings[i]) + ); + } + return hash; + } + } + } +} \ No newline at end of file diff --git a/CodeMaid/Helpers/SettingsContextHelper.cs b/CodeMaid/Helpers/SettingsContextHelper.cs index 5180fa43..becc6374 100644 --- a/CodeMaid/Helpers/SettingsContextHelper.cs +++ b/CodeMaid/Helpers/SettingsContextHelper.cs @@ -82,7 +82,10 @@ internal static string GetSolutionSettingsPath(SettingsContext context) /// internal void OnSolutionOpened() { - LoadSolutionSpecificSettings(Settings.Default); + if (LoadSolutionSpecificSettings(Settings.Default)) + { + _package.SettingMonitor.NotifySettingsChanged(); + } } /// @@ -90,7 +93,10 @@ internal void OnSolutionOpened() /// internal void OnSolutionClosed() { - UnloadSolutionSpecificSettings(Settings.Default); + if (UnloadSolutionSpecificSettings(Settings.Default)) + { + _package.SettingMonitor.NotifySettingsChanged(); + } } /// diff --git a/CodeMaid/Integration/Commands/AboutCommand.cs b/CodeMaid/Integration/Commands/AboutCommand.cs index 97e97022..d9326954 100644 --- a/CodeMaid/Integration/Commands/AboutCommand.cs +++ b/CodeMaid/Integration/Commands/AboutCommand.cs @@ -1,13 +1,24 @@ using SteveCadwallader.CodeMaid.UI.Dialogs.About; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for launching the CodeMaid about window. /// - internal class AboutCommand : BaseCommand + internal sealed class AboutCommand : BaseCommand { + #region Singleton + + public static AboutCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new AboutCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Constructors /// @@ -15,8 +26,7 @@ internal class AboutCommand : BaseCommand /// /// The hosting package. internal AboutCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidAbout)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidAbout) { } diff --git a/CodeMaid/Integration/Commands/BaseCommand.cs b/CodeMaid/Integration/Commands/BaseCommand.cs index 710b6fb9..5dd2d782 100644 --- a/CodeMaid/Integration/Commands/BaseCommand.cs +++ b/CodeMaid/Integration/Commands/BaseCommand.cs @@ -8,7 +8,7 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// The base implementation of a command. /// - internal abstract class BaseCommand : OleMenuCommand + internal abstract class BaseCommand : OleMenuCommand, ISwitchable { #region Constructors @@ -16,13 +16,12 @@ internal abstract class BaseCommand : OleMenuCommand /// Initializes a new instance of the class. /// /// The hosting package. - /// The id for the command. - protected BaseCommand(CodeMaidPackage package, CommandID id) - : base(BaseCommand_Execute, id) + /// The GUID for the command ID. + /// The id for the command ID. + protected BaseCommand(CodeMaidPackage package, Guid menuGroup, int commandID) + : base(BaseCommand_Execute, null, BaseCommand_BeforeQueryStatus, new CommandID(menuGroup, commandID)) { Package = package; - - BeforeQueryStatus += BaseCommand_BeforeQueryStatus; } #endregion Constructors @@ -81,6 +80,18 @@ protected virtual void OnExecute() OutputWindowHelper.DiagnosticWriteLine($"{GetType().Name}.OnExecute invoked"); } + public virtual void Switch(bool on) + { + if (on && Package.MenuCommandService.FindCommand(CommandID) == null) + { + Package.MenuCommandService.AddCommand(this); + } + else if (!on) + { + Package.MenuCommandService.RemoveCommand(this); + } + } + #endregion Methods } } \ No newline at end of file diff --git a/CodeMaid/Integration/Commands/BuildProgressToolWindowCommand.cs b/CodeMaid/Integration/Commands/BuildProgressToolWindowCommand.cs index 3bf147ee..54b7d83c 100644 --- a/CodeMaid/Integration/Commands/BuildProgressToolWindowCommand.cs +++ b/CodeMaid/Integration/Commands/BuildProgressToolWindowCommand.cs @@ -1,15 +1,26 @@ using EnvDTE; using Microsoft.VisualStudio.Shell.Interop; using SteveCadwallader.CodeMaid.Properties; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for launching the build progress tool window. /// - internal class BuildProgressToolWindowCommand : BaseCommand + internal sealed class BuildProgressToolWindowCommand : BaseCommand { + #region Singleton + + public static BuildProgressToolWindowCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new BuildProgressToolWindowCommand(package); + package.SettingMonitor.Watch(s => s.Feature_BuildProgressToolWindow, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -17,8 +28,7 @@ internal class BuildProgressToolWindowCommand : BaseCommand /// /// The hosting package. internal BuildProgressToolWindowCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidBuildProgressToolWindow)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidBuildProgressToolWindow) { } @@ -33,7 +43,7 @@ private IVsWindowFrame BuildProgressWindowFrame { get { - var buildProgress = Package.BuildProgress; + var buildProgress = Package.BuildProgressForceLoad; if (buildProgress != null) { return buildProgress.Frame as IVsWindowFrame; @@ -57,6 +67,16 @@ protected override void OnExecute() ShowBuildProgressToolWindow(); } + public override void Switch(bool on) + { + base.Switch(on); + + if (!on) + { + Package.BuildProgress?.Close(); + } + } + #endregion BaseCommand Methods #region Internal Methods @@ -68,7 +88,7 @@ protected override void OnExecute() /// The action. internal void OnBuildBegin(vsBuildScope scope, vsBuildAction action) { - var buildProgress = Package.BuildProgress; + var buildProgress = Package.BuildProgressForceLoad; if (buildProgress != null) { buildProgress.NotifyBuildBegin(scope, action); @@ -89,7 +109,7 @@ internal void OnBuildBegin(vsBuildScope scope, vsBuildAction action) /// The solution config. internal void OnBuildProjConfigBegin(string project, string projectConfig, string platform, string solutionConfig) { - var buildProgress = Package.BuildProgress; + var buildProgress = Package.BuildProgressForceLoad; if (buildProgress != null) { buildProgress.NotifyBuildProjConfigBegin(project, projectConfig, platform, solutionConfig); @@ -106,7 +126,7 @@ internal void OnBuildProjConfigBegin(string project, string projectConfig, strin /// True if project build was successful, otherwise false. internal void OnBuildProjConfigDone(string project, string projectConfig, string platform, string solutionConfig, bool success) { - var buildProgress = Package.BuildProgress; + var buildProgress = Package.BuildProgressForceLoad; if (buildProgress != null) { buildProgress.NotifyBuildProjConfigDone(project, projectConfig, platform, solutionConfig, success); @@ -120,7 +140,7 @@ internal void OnBuildProjConfigDone(string project, string projectConfig, string /// The action. internal void OnBuildDone(vsBuildScope scope, vsBuildAction action) { - var buildProgress = Package.BuildProgress; + var buildProgress = Package.BuildProgressForceLoad; if (buildProgress != null) { buildProgress.NotifyBuildDone(scope, action); diff --git a/CodeMaid/Integration/Commands/CleanupActiveCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupActiveCodeCommand.cs index 0a89bbf8..508ae1ea 100644 --- a/CodeMaid/Integration/Commands/CleanupActiveCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupActiveCodeCommand.cs @@ -2,15 +2,26 @@ using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Logic.Cleaning; using SteveCadwallader.CodeMaid.Properties; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for cleaning up code in the active document. /// - internal class CleanupActiveCodeCommand : BaseCommand + internal sealed class CleanupActiveCodeCommand : BaseCommand { + #region Singleton + + public static CleanupActiveCodeCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new CleanupActiveCodeCommand(package); + package.SettingMonitor.Watch(s => s.Feature_CleanupActiveCode, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -18,8 +29,7 @@ internal class CleanupActiveCodeCommand : BaseCommand /// /// The hosting package. internal CleanupActiveCodeCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCleanupActiveCode)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCleanupActiveCode) { CodeCleanupAvailabilityLogic = CodeCleanupAvailabilityLogic.GetInstance(Package); CodeCleanupManager = CodeCleanupManager.GetInstance(Package); diff --git a/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs index 64d65975..389e1054 100644 --- a/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs @@ -3,7 +3,6 @@ using SteveCadwallader.CodeMaid.Logic.Cleaning; using SteveCadwallader.CodeMaid.UI.Dialogs.CleanupProgress; using System.Collections.Generic; -using System.ComponentModel.Design; using System.Linq; using System.Windows; @@ -12,8 +11,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for cleaning up code in all documents. /// - internal class CleanupAllCodeCommand : BaseCommand + internal sealed class CleanupAllCodeCommand : BaseCommand { + #region Singleton + + public static CleanupAllCodeCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new CleanupAllCodeCommand(package); + package.SettingMonitor.Watch(s => s.Feature_CleanupAllCode, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -21,8 +32,7 @@ internal class CleanupAllCodeCommand : BaseCommand /// /// The hosting package. internal CleanupAllCodeCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCleanupAllCode)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCleanupAllCode) { CodeCleanupAvailabilityLogic = CodeCleanupAvailabilityLogic.GetInstance(Package); } diff --git a/CodeMaid/Integration/Commands/CleanupOpenCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupOpenCodeCommand.cs index 96b01661..eb3a169d 100644 --- a/CodeMaid/Integration/Commands/CleanupOpenCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupOpenCodeCommand.cs @@ -3,7 +3,6 @@ using SteveCadwallader.CodeMaid.Logic.Cleaning; using SteveCadwallader.CodeMaid.UI.Dialogs.CleanupProgress; using System.Collections.Generic; -using System.ComponentModel.Design; using System.Linq; namespace SteveCadwallader.CodeMaid.Integration.Commands @@ -11,8 +10,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for cleaning up code in the open documents. /// - internal class CleanupOpenCodeCommand : BaseCommand + internal sealed class CleanupOpenCodeCommand : BaseCommand { + #region Singleton + + public static CleanupOpenCodeCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new CleanupOpenCodeCommand(package); + package.SettingMonitor.Watch(s => s.Feature_CleanupOpenCode, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -20,8 +31,7 @@ internal class CleanupOpenCodeCommand : BaseCommand /// /// The hosting package. internal CleanupOpenCodeCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCleanupOpenCode)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCleanupOpenCode) { CodeCleanupAvailabilityLogic = CodeCleanupAvailabilityLogic.GetInstance(Package); } diff --git a/CodeMaid/Integration/Commands/CleanupSelectedCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupSelectedCodeCommand.cs index 17dd8513..fee70730 100644 --- a/CodeMaid/Integration/Commands/CleanupSelectedCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupSelectedCodeCommand.cs @@ -3,7 +3,6 @@ using SteveCadwallader.CodeMaid.Logic.Cleaning; using SteveCadwallader.CodeMaid.UI.Dialogs.CleanupProgress; using System.Collections.Generic; -using System.ComponentModel.Design; using System.Linq; namespace SteveCadwallader.CodeMaid.Integration.Commands @@ -11,8 +10,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for cleaning up code in the selected documents. /// - internal class CleanupSelectedCodeCommand : BaseCommand + internal sealed class CleanupSelectedCodeCommand : BaseCommand { + #region Singleton + + public static CleanupSelectedCodeCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new CleanupSelectedCodeCommand(package); + package.SettingMonitor.Watch(s => s.Feature_CleanupSelectedCode, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -20,8 +31,7 @@ internal class CleanupSelectedCodeCommand : BaseCommand /// /// The hosting package. internal CleanupSelectedCodeCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCleanupSelectedCode)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCleanupSelectedCode) { CodeCleanupAvailabilityLogic = CodeCleanupAvailabilityLogic.GetInstance(Package); } diff --git a/CodeMaid/Integration/Commands/CloseAllReadOnlyCommand.cs b/CodeMaid/Integration/Commands/CloseAllReadOnlyCommand.cs index c84cba50..614a4b89 100644 --- a/CodeMaid/Integration/Commands/CloseAllReadOnlyCommand.cs +++ b/CodeMaid/Integration/Commands/CloseAllReadOnlyCommand.cs @@ -1,5 +1,4 @@ using EnvDTE; -using System.ComponentModel.Design; using System.Linq; namespace SteveCadwallader.CodeMaid.Integration.Commands @@ -7,8 +6,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for closing all read-only files. /// - internal class CloseAllReadOnlyCommand : BaseCommand + internal sealed class CloseAllReadOnlyCommand : BaseCommand { + #region Singleton + + public static CloseAllReadOnlyCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new CloseAllReadOnlyCommand(package); + package.SettingMonitor.Watch(s => s.Feature_CloseAllReadOnly, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -16,8 +27,7 @@ internal class CloseAllReadOnlyCommand : BaseCommand /// /// The hosting package. internal CloseAllReadOnlyCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCloseAllReadOnly)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCloseAllReadOnly) { } diff --git a/CodeMaid/Integration/Commands/CollapseAllSolutionExplorerCommand.cs b/CodeMaid/Integration/Commands/CollapseAllSolutionExplorerCommand.cs index c529a3a0..6987b139 100644 --- a/CodeMaid/Integration/Commands/CollapseAllSolutionExplorerCommand.cs +++ b/CodeMaid/Integration/Commands/CollapseAllSolutionExplorerCommand.cs @@ -1,15 +1,26 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Properties; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for collapsing nodes in the solution explorer tool window. /// - internal class CollapseAllSolutionExplorerCommand : BaseCommand + internal sealed class CollapseAllSolutionExplorerCommand : BaseCommand { + #region Singleton + + public static CollapseAllSolutionExplorerCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new CollapseAllSolutionExplorerCommand(package); + package.SettingMonitor.Watch(s => s.Feature_CollapseAllSolutionExplorer, Instance.Switch); + } + + #endregion Singleton + #region Fields /// @@ -26,8 +37,7 @@ internal class CollapseAllSolutionExplorerCommand : BaseCommand /// /// The hosting package. internal CollapseAllSolutionExplorerCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCollapseAllSolutionExplorer)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCollapseAllSolutionExplorer) { } diff --git a/CodeMaid/Integration/Commands/CollapseSelectedSolutionExplorerCommand.cs b/CodeMaid/Integration/Commands/CollapseSelectedSolutionExplorerCommand.cs index 9c16da19..c41e1f1e 100644 --- a/CodeMaid/Integration/Commands/CollapseSelectedSolutionExplorerCommand.cs +++ b/CodeMaid/Integration/Commands/CollapseSelectedSolutionExplorerCommand.cs @@ -1,7 +1,6 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; using System.Collections.Generic; -using System.ComponentModel.Design; using System.Linq; namespace SteveCadwallader.CodeMaid.Integration.Commands @@ -9,8 +8,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for collapsing selected nodes in the solution explorer tool window. /// - internal class CollapseSelectedSolutionExplorerCommand : BaseCommand + internal sealed class CollapseSelectedSolutionExplorerCommand : BaseCommand { + #region Singleton + + public static CollapseSelectedSolutionExplorerCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new CollapseSelectedSolutionExplorerCommand(package); + package.SettingMonitor.Watch(s => s.Feature_CollapseSelectedSolutionExplorer, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -18,8 +29,7 @@ internal class CollapseSelectedSolutionExplorerCommand : BaseCommand /// /// The hosting package. internal CollapseSelectedSolutionExplorerCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCollapseSelectedSolutionExplorer)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCollapseSelectedSolutionExplorer) { } diff --git a/CodeMaid/Integration/Commands/CommentFormatCommand.cs b/CodeMaid/Integration/Commands/CommentFormatCommand.cs index 4dc527bb..1ef11336 100644 --- a/CodeMaid/Integration/Commands/CommentFormatCommand.cs +++ b/CodeMaid/Integration/Commands/CommentFormatCommand.cs @@ -1,15 +1,26 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Logic.Formatting; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for formatting the current comment. /// - internal class CommentFormatCommand : BaseCommand + internal sealed class CommentFormatCommand : BaseCommand { + #region Singleton + + public static CommentFormatCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new CommentFormatCommand(package); + package.SettingMonitor.Watch(s => s.Feature_CommentFormat, Instance.Switch); + } + + #endregion Singleton + #region Fields private readonly CommentFormatLogic _commentFormatLogic; @@ -24,8 +35,7 @@ internal class CommentFormatCommand : BaseCommand /// /// The hosting package. internal CommentFormatCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCommentFormat)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCommentFormat) { _undoTransactionHelper = new UndoTransactionHelper(package, "CodeMaid Format Comment"); _commentFormatLogic = CommentFormatLogic.GetInstance(package); diff --git a/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs b/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs index 7ba18809..7915be3a 100644 --- a/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs +++ b/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs @@ -5,16 +5,26 @@ using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Properties; using System; -using System.ComponentModel.Design; -using IServiceProvider = Microsoft.VisualStudio.OLE.Interop.IServiceProvider; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for finding a file in the solution explorer. /// - internal class FindInSolutionExplorerCommand : BaseCommand + internal sealed class FindInSolutionExplorerCommand : BaseCommand { + #region Singleton + + public static FindInSolutionExplorerCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new FindInSolutionExplorerCommand(package); + package.SettingMonitor.Watch(s => s.Feature_FindInSolutionExplorer, Instance.Switch); + } + + #endregion Singleton + #region Fields private readonly CommandHelper _commandHelper; @@ -28,8 +38,7 @@ internal class FindInSolutionExplorerCommand : BaseCommand /// /// The hosting package. internal FindInSolutionExplorerCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidFindInSolutionExplorer)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidFindInSolutionExplorer) { _commandHelper = CommandHelper.GetInstance(package); } diff --git a/CodeMaid/Integration/Commands/JoinLinesCommand.cs b/CodeMaid/Integration/Commands/JoinLinesCommand.cs index be326881..c2e89bbb 100644 --- a/CodeMaid/Integration/Commands/JoinLinesCommand.cs +++ b/CodeMaid/Integration/Commands/JoinLinesCommand.cs @@ -1,14 +1,25 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for joining lines together. /// - internal class JoinLinesCommand : BaseCommand + internal sealed class JoinLinesCommand : BaseCommand { + #region Singleton + + public static JoinLinesCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new JoinLinesCommand(package); + package.SettingMonitor.Watch(s => s.Feature_JoinLines, Instance.Switch); + } + + #endregion Singleton + #region Fields private readonly UndoTransactionHelper _undoTransactionHelper; @@ -22,8 +33,7 @@ internal class JoinLinesCommand : BaseCommand /// /// The hosting package. internal JoinLinesCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidJoinLines)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidJoinLines) { _undoTransactionHelper = new UndoTransactionHelper(package, "CodeMaid Join"); } diff --git a/CodeMaid/Integration/Commands/OptionsCommand.cs b/CodeMaid/Integration/Commands/OptionsCommand.cs index 0b90e4b9..589b0e6b 100644 --- a/CodeMaid/Integration/Commands/OptionsCommand.cs +++ b/CodeMaid/Integration/Commands/OptionsCommand.cs @@ -1,13 +1,24 @@ using SteveCadwallader.CodeMaid.UI.Dialogs.Options; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for launching the CodeMaid Options to the general cleanup page. /// - internal class OptionsCommand : BaseCommand + internal sealed class OptionsCommand : BaseCommand { + #region Singleton + + public static OptionsCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new OptionsCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Constructors /// @@ -15,8 +26,7 @@ internal class OptionsCommand : BaseCommand /// /// The hosting package. internal OptionsCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidOptions)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidOptions) { } diff --git a/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs b/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs index 4f6b8472..f4c66217 100644 --- a/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs +++ b/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs @@ -1,7 +1,6 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; using System; -using System.ComponentModel.Design; using System.IO; namespace SteveCadwallader.CodeMaid.Integration.Commands @@ -9,8 +8,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for toggling the read only attribute of a file. /// - internal class ReadOnlyToggleCommand : BaseCommand + internal sealed class ReadOnlyToggleCommand : BaseCommand { + #region Singleton + + public static ReadOnlyToggleCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new ReadOnlyToggleCommand(package); + package.SettingMonitor.Watch(s => s.Feature_ReadOnlyToggle, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -18,8 +29,7 @@ internal class ReadOnlyToggleCommand : BaseCommand /// /// The hosting package. internal ReadOnlyToggleCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidReadOnlyToggle)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidReadOnlyToggle) { } diff --git a/CodeMaid/Integration/Commands/RemoveRegionCommand.cs b/CodeMaid/Integration/Commands/RemoveRegionCommand.cs index 9a43a341..5cc9f3f6 100644 --- a/CodeMaid/Integration/Commands/RemoveRegionCommand.cs +++ b/CodeMaid/Integration/Commands/RemoveRegionCommand.cs @@ -2,15 +2,26 @@ using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Logic.Cleaning; using SteveCadwallader.CodeMaid.Model; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for removing region(s). /// - internal class RemoveRegionCommand : BaseCommand + internal sealed class RemoveRegionCommand : BaseCommand { + #region Singleton + + public static RemoveRegionCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new RemoveRegionCommand(package); + package.SettingMonitor.Watch(s => s.Feature_RemoveRegion, Instance.Switch); + } + + #endregion Singleton + #region Fields private readonly CodeModelHelper _codeModelHelper; @@ -25,8 +36,7 @@ internal class RemoveRegionCommand : BaseCommand /// /// The hosting package. internal RemoveRegionCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidRemoveRegion)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidRemoveRegion) { _codeModelHelper = CodeModelHelper.GetInstance(package); _removeRegionLogic = RemoveRegionLogic.GetInstance(package); diff --git a/CodeMaid/Integration/Commands/ReorganizeActiveCodeCommand.cs b/CodeMaid/Integration/Commands/ReorganizeActiveCodeCommand.cs index 932b3896..a2e47185 100644 --- a/CodeMaid/Integration/Commands/ReorganizeActiveCodeCommand.cs +++ b/CodeMaid/Integration/Commands/ReorganizeActiveCodeCommand.cs @@ -1,13 +1,24 @@ using SteveCadwallader.CodeMaid.Logic.Reorganizing; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for reorganizing code in the active document. /// - internal class ReorganizeActiveCodeCommand : BaseCommand + internal sealed class ReorganizeActiveCodeCommand : BaseCommand { + #region Singleton + + public static ReorganizeActiveCodeCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new ReorganizeActiveCodeCommand(package); + package.SettingMonitor.Watch(s => s.Feature_ReorganizeActiveCode, Instance.Switch); + } + + #endregion Singleton + #region Fields private readonly CodeReorganizationAvailabilityLogic _codeReorganizationAvailabilityLogic; @@ -21,8 +32,7 @@ internal class ReorganizeActiveCodeCommand : BaseCommand /// /// The hosting package. internal ReorganizeActiveCodeCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidReorganizeActiveCode)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidReorganizeActiveCode) { CodeReorganizationManager = CodeReorganizationManager.GetInstance(Package); diff --git a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs index 9721f700..c41e9962 100644 --- a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs +++ b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs @@ -1,13 +1,24 @@ using SteveCadwallader.CodeMaid.Properties; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for changing the setting for cleanup on save. /// - internal class SettingCleanupOnSaveCommand : BaseCommand + internal sealed class SettingCleanupOnSaveCommand : BaseCommand { + #region Singleton + + public static SettingCleanupOnSaveCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SettingCleanupOnSaveCommand(package); + package.SettingMonitor.Watch(s => s.Feature_SettingCleanupOnSave, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -15,8 +26,7 @@ internal class SettingCleanupOnSaveCommand : BaseCommand /// /// The hosting package. internal SettingCleanupOnSaveCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSettingCleanupOnSave)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSettingCleanupOnSave) { } diff --git a/CodeMaid/Integration/Commands/SortLinesCommand.cs b/CodeMaid/Integration/Commands/SortLinesCommand.cs index 912dee39..3ed1259d 100644 --- a/CodeMaid/Integration/Commands/SortLinesCommand.cs +++ b/CodeMaid/Integration/Commands/SortLinesCommand.cs @@ -1,7 +1,6 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; using System; -using System.ComponentModel.Design; using System.Linq; using System.Text; using TextSelection = EnvDTE.TextSelection; @@ -11,8 +10,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for sorting lines. /// - internal class SortLinesCommand : BaseCommand + internal sealed class SortLinesCommand : BaseCommand { + #region Singleton + + public static SortLinesCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SortLinesCommand(package); + package.SettingMonitor.Watch(s => s.Feature_SortLines, Instance.Switch); + } + + #endregion Singleton + #region Fields private readonly UndoTransactionHelper _undoTransactionHelper; @@ -26,8 +37,7 @@ internal class SortLinesCommand : BaseCommand /// /// The hosting package. internal SortLinesCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSortLines)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSortLines) { _undoTransactionHelper = new UndoTransactionHelper(package, "CodeMaid Sort"); } diff --git a/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs b/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs index fecee42a..6e869f7e 100644 --- a/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs @@ -2,7 +2,6 @@ using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Model.CodeItems; using System; -using System.ComponentModel.Design; using System.Linq; namespace SteveCadwallader.CodeMaid.Integration.Commands @@ -10,8 +9,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for deleting a member within Spade. /// - internal class SpadeContextDeleteCommand : BaseCommand + internal sealed class SpadeContextDeleteCommand : BaseCommand { + #region Singleton + + public static SpadeContextDeleteCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeContextDeleteCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Fields private readonly UndoTransactionHelper _undoTransactionHelper; @@ -25,8 +36,7 @@ internal class SpadeContextDeleteCommand : BaseCommand /// /// The hosting package. internal SpadeContextDeleteCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextDelete)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextDelete) { _undoTransactionHelper = new UndoTransactionHelper(package, "CodeMaid Delete Items"); } diff --git a/CodeMaid/Integration/Commands/SpadeContextFindReferencesCommand.cs b/CodeMaid/Integration/Commands/SpadeContextFindReferencesCommand.cs index b067b051..e4bb2d81 100644 --- a/CodeMaid/Integration/Commands/SpadeContextFindReferencesCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeContextFindReferencesCommand.cs @@ -1,6 +1,5 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Model.CodeItems; -using System.ComponentModel.Design; using System.Linq; namespace SteveCadwallader.CodeMaid.Integration.Commands @@ -8,8 +7,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for finding references of a member within Spade. /// - internal class SpadeContextFindReferencesCommand : BaseCommand + internal sealed class SpadeContextFindReferencesCommand : BaseCommand { + #region Singleton + + public static SpadeContextFindReferencesCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeContextFindReferencesCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Constructors /// @@ -17,8 +28,7 @@ internal class SpadeContextFindReferencesCommand : BaseCommand /// /// The hosting package. internal SpadeContextFindReferencesCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextFindReferences)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextFindReferences) { } diff --git a/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs b/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs index ff178295..315c343b 100644 --- a/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs @@ -2,7 +2,6 @@ using SteveCadwallader.CodeMaid.Logic.Reorganizing; using SteveCadwallader.CodeMaid.Model.CodeItems; using SteveCadwallader.CodeMaid.Properties; -using System.ComponentModel.Design; using System.Linq; namespace SteveCadwallader.CodeMaid.Integration.Commands @@ -10,8 +9,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for inserting a region within Spade. /// - internal class SpadeContextInsertRegionCommand : BaseCommand + internal sealed class SpadeContextInsertRegionCommand : BaseCommand { + #region Singleton + + public static SpadeContextInsertRegionCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeContextInsertRegionCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Fields private readonly GenerateRegionLogic _generateRegionLogic; @@ -26,8 +37,7 @@ internal class SpadeContextInsertRegionCommand : BaseCommand /// /// The hosting package. internal SpadeContextInsertRegionCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextInsertRegion)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextInsertRegion) { _generateRegionLogic = GenerateRegionLogic.GetInstance(package); _undoTransactionHelper = new UndoTransactionHelper(package, "CodeMaid Insert Region"); diff --git a/CodeMaid/Integration/Commands/SpadeContextRemoveRegionCommand.cs b/CodeMaid/Integration/Commands/SpadeContextRemoveRegionCommand.cs index 13429d95..932f1521 100644 --- a/CodeMaid/Integration/Commands/SpadeContextRemoveRegionCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeContextRemoveRegionCommand.cs @@ -1,6 +1,5 @@ using SteveCadwallader.CodeMaid.Logic.Cleaning; using SteveCadwallader.CodeMaid.Model.CodeItems; -using System.ComponentModel.Design; using System.Linq; namespace SteveCadwallader.CodeMaid.Integration.Commands @@ -8,8 +7,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for removing a region within Spade. /// - internal class SpadeContextRemoveRegionCommand : BaseCommand + internal sealed class SpadeContextRemoveRegionCommand : BaseCommand { + #region Singleton + + public static SpadeContextRemoveRegionCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeContextRemoveRegionCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Fields private readonly RemoveRegionLogic _removeRegionLogic; @@ -23,8 +34,7 @@ internal class SpadeContextRemoveRegionCommand : BaseCommand /// /// The hosting package. internal SpadeContextRemoveRegionCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextRemoveRegion)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextRemoveRegion) { _removeRegionLogic = RemoveRegionLogic.GetInstance(package); } diff --git a/CodeMaid/Integration/Commands/SpadeOptionsCommand.cs b/CodeMaid/Integration/Commands/SpadeOptionsCommand.cs index 3322fd9d..d5692720 100644 --- a/CodeMaid/Integration/Commands/SpadeOptionsCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeOptionsCommand.cs @@ -1,14 +1,25 @@ using SteveCadwallader.CodeMaid.UI.Dialogs.Options; using SteveCadwallader.CodeMaid.UI.Dialogs.Options.Digging; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for launching the CodeMaid Options to the Spade page. /// - internal class SpadeOptionsCommand : BaseCommand + internal sealed class SpadeOptionsCommand : BaseCommand { + #region Singleton + + public static SpadeOptionsCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeOptionsCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Constructors /// @@ -16,8 +27,7 @@ internal class SpadeOptionsCommand : BaseCommand /// /// The hosting package. internal SpadeOptionsCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeOptions)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeOptions) { } diff --git a/CodeMaid/Integration/Commands/SpadeRefreshCommand.cs b/CodeMaid/Integration/Commands/SpadeRefreshCommand.cs index 773d4547..52b0c04d 100644 --- a/CodeMaid/Integration/Commands/SpadeRefreshCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeRefreshCommand.cs @@ -1,12 +1,22 @@ -using System.ComponentModel.Design; - namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for refreshing the Spade tool window. /// - internal class SpadeRefreshCommand : BaseCommand + internal sealed class SpadeRefreshCommand : BaseCommand { + #region Singleton + + public static SpadeRefreshCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeRefreshCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Constructors /// @@ -14,8 +24,7 @@ internal class SpadeRefreshCommand : BaseCommand /// /// The hosting package. internal SpadeRefreshCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeRefresh)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeRefresh) { } diff --git a/CodeMaid/Integration/Commands/SpadeSearchCommand.cs b/CodeMaid/Integration/Commands/SpadeSearchCommand.cs index 51df8e31..30cd01ce 100644 --- a/CodeMaid/Integration/Commands/SpadeSearchCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeSearchCommand.cs @@ -1,12 +1,22 @@ -using System.ComponentModel.Design; - -namespace SteveCadwallader.CodeMaid.Integration.Commands +namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for setting focus on the search bar in the Spade tool window. /// - internal class SpadeSearchCommand : BaseCommand + internal sealed class SpadeSearchCommand : BaseCommand { + #region Singleton + + public static SpadeSearchCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeSearchCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Constructors /// @@ -14,8 +24,7 @@ internal class SpadeSearchCommand : BaseCommand /// /// The hosting package. internal SpadeSearchCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeSearch)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeSearch) { } diff --git a/CodeMaid/Integration/Commands/SpadeSortOrderAlphaCommand.cs b/CodeMaid/Integration/Commands/SpadeSortOrderAlphaCommand.cs index 18ab2feb..bbcbb249 100644 --- a/CodeMaid/Integration/Commands/SpadeSortOrderAlphaCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeSortOrderAlphaCommand.cs @@ -1,13 +1,24 @@ using SteveCadwallader.CodeMaid.Model.CodeTree; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for setting Spade to alphabetical sort order. /// - internal class SpadeSortOrderAlphaCommand : BaseCommand + internal sealed class SpadeSortOrderAlphaCommand : BaseCommand { + #region Singleton + + public static SpadeSortOrderAlphaCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeSortOrderAlphaCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Constructors /// @@ -15,8 +26,7 @@ internal class SpadeSortOrderAlphaCommand : BaseCommand /// /// The hosting package. internal SpadeSortOrderAlphaCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeSortOrderAlpha)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeSortOrderAlpha) { } diff --git a/CodeMaid/Integration/Commands/SpadeSortOrderFileCommand.cs b/CodeMaid/Integration/Commands/SpadeSortOrderFileCommand.cs index 39c9cd15..23fb149d 100644 --- a/CodeMaid/Integration/Commands/SpadeSortOrderFileCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeSortOrderFileCommand.cs @@ -1,13 +1,24 @@ using SteveCadwallader.CodeMaid.Model.CodeTree; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for setting Spade to file sort order. /// - internal class SpadeSortOrderFileCommand : BaseCommand + internal sealed class SpadeSortOrderFileCommand : BaseCommand { + #region Singleton + + public static SpadeSortOrderFileCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeSortOrderFileCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Constructors /// @@ -15,8 +26,7 @@ internal class SpadeSortOrderFileCommand : BaseCommand /// /// The hosting package. internal SpadeSortOrderFileCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeSortOrderFile)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeSortOrderFile) { } diff --git a/CodeMaid/Integration/Commands/SpadeSortOrderTypeCommand.cs b/CodeMaid/Integration/Commands/SpadeSortOrderTypeCommand.cs index 54b36178..b04af42e 100644 --- a/CodeMaid/Integration/Commands/SpadeSortOrderTypeCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeSortOrderTypeCommand.cs @@ -1,13 +1,24 @@ using SteveCadwallader.CodeMaid.Model.CodeTree; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for setting Spade to type sort order. /// - internal class SpadeSortOrderTypeCommand : BaseCommand + internal sealed class SpadeSortOrderTypeCommand : BaseCommand { + #region Singleton + + public static SpadeSortOrderTypeCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeSortOrderTypeCommand(package); + Instance.Switch(on: true); + } + + #endregion Singleton + #region Constructors /// @@ -15,8 +26,7 @@ internal class SpadeSortOrderTypeCommand : BaseCommand /// /// The hosting package. internal SpadeSortOrderTypeCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeSortOrderType)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeSortOrderType) { } diff --git a/CodeMaid/Integration/Commands/SpadeToolWindowCommand.cs b/CodeMaid/Integration/Commands/SpadeToolWindowCommand.cs index a0038f94..108724d5 100644 --- a/CodeMaid/Integration/Commands/SpadeToolWindowCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeToolWindowCommand.cs @@ -1,14 +1,25 @@ using EnvDTE; using Microsoft.VisualStudio.Shell.Interop; -using System.ComponentModel.Design; namespace SteveCadwallader.CodeMaid.Integration.Commands { /// /// A command that provides for launching the Spade tool window. /// - internal class SpadeToolWindowCommand : BaseCommand + internal sealed class SpadeToolWindowCommand : BaseCommand { + #region Singleton + + public static SpadeToolWindowCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SpadeToolWindowCommand(package); + package.SettingMonitor.Watch(s => s.Feature_SpadeToolWindow, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -16,8 +27,7 @@ internal class SpadeToolWindowCommand : BaseCommand /// /// The hosting package. internal SpadeToolWindowCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeToolWindow)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeToolWindow) { } @@ -43,6 +53,16 @@ protected override void OnExecute() } } + public override void Switch(bool on) + { + base.Switch(on); + + if (!on) + { + Package.Spade?.Close(); + } + } + #endregion BaseCommand Methods #region Internal Methods diff --git a/CodeMaid/Integration/Commands/SwitchFileCommand.cs b/CodeMaid/Integration/Commands/SwitchFileCommand.cs index 620ed257..9cf1f685 100644 --- a/CodeMaid/Integration/Commands/SwitchFileCommand.cs +++ b/CodeMaid/Integration/Commands/SwitchFileCommand.cs @@ -3,7 +3,6 @@ using SteveCadwallader.CodeMaid.Properties; using System; using System.Collections.Generic; -using System.ComponentModel.Design; using System.IO; using System.Linq; @@ -12,8 +11,20 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// A command that provides for switching between files based on their filename. /// - internal class SwitchFileCommand : BaseCommand + internal sealed class SwitchFileCommand : BaseCommand { + #region Singleton + + public static SwitchFileCommand Instance { get; private set; } + + public static void Initialize(CodeMaidPackage package) + { + Instance = new SwitchFileCommand(package); + package.SettingMonitor.Watch(s => s.Feature_SwitchFile, Instance.Switch); + } + + #endregion Singleton + #region Constructors /// @@ -21,8 +32,7 @@ internal class SwitchFileCommand : BaseCommand /// /// The hosting package. internal SwitchFileCommand(CodeMaidPackage package) - : base(package, - new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSwitchFile)) + : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSwitchFile) { } diff --git a/CodeMaid/Integration/Events/BaseEventListener.cs b/CodeMaid/Integration/Events/BaseEventListener.cs index b70f6eaf..1ce0ba30 100644 --- a/CodeMaid/Integration/Events/BaseEventListener.cs +++ b/CodeMaid/Integration/Events/BaseEventListener.cs @@ -5,7 +5,7 @@ namespace SteveCadwallader.CodeMaid.Integration.Events /// /// The base implementation of an event listener. /// - internal abstract class BaseEventListener : IDisposable + internal abstract class BaseEventListener : ISwitchable, IDisposable { #region Constructors @@ -29,6 +29,30 @@ protected BaseEventListener(CodeMaidPackage package) #endregion Properties + #region ISwitchable Members + + protected bool IsListening { get; set; } + + public void Switch(bool on) + { + if (on && !IsListening) + { + IsListening = true; + RegisterListeners(); + } + else if (IsListening && !on) + { + IsListening = false; + UnRegisterListeners(); + } + } + + protected abstract void RegisterListeners(); + + protected abstract void UnRegisterListeners(); + + #endregion ISwitchable Members + #region IDisposable Members /// diff --git a/CodeMaid/Integration/Events/BuildProgressEventListener.cs b/CodeMaid/Integration/Events/BuildProgressEventListener.cs index 745beaeb..80316a08 100644 --- a/CodeMaid/Integration/Events/BuildProgressEventListener.cs +++ b/CodeMaid/Integration/Events/BuildProgressEventListener.cs @@ -6,8 +6,17 @@ namespace SteveCadwallader.CodeMaid.Integration.Events /// /// A class that encapsulates listening for build progress events. /// - internal class BuildProgressEventListener : BaseEventListener + internal sealed class BuildProgressEventListener : BaseEventListener { + #region Singleton + + public static BuildProgressEventListener Instance { get; private set; } + + public static void Intialize(CodeMaidPackage package) + => Instance = new BuildProgressEventListener(package); + + #endregion Singleton + #region Constructors /// @@ -19,10 +28,7 @@ internal BuildProgressEventListener(CodeMaidPackage package) { // Store access to the build events, otherwise events will not register properly via DTE. BuildEvents = Package.IDE.Events.BuildEvents; - BuildEvents.OnBuildBegin += BuildEvents_OnBuildBegin; - BuildEvents.OnBuildProjConfigBegin += BuildEvents_OnBuildProjConfigBegin; - BuildEvents.OnBuildProjConfigDone += BuildEvents_OnBuildProjConfigDone; - BuildEvents.OnBuildDone += BuildEvents_OnBuildDone; + package.SettingMonitor.Watch(s => s.Feature_BuildProgressToolWindow, Switch); } #endregion Constructors @@ -133,6 +139,26 @@ private void BuildEvents_OnBuildDone(vsBuildScope scope, vsBuildAction action) #endregion Private Event Handlers + #region ISwitchable Members + + protected override void RegisterListeners() + { + BuildEvents.OnBuildBegin += BuildEvents_OnBuildBegin; + BuildEvents.OnBuildProjConfigBegin += BuildEvents_OnBuildProjConfigBegin; + BuildEvents.OnBuildProjConfigDone += BuildEvents_OnBuildProjConfigDone; + BuildEvents.OnBuildDone += BuildEvents_OnBuildDone; + } + + protected override void UnRegisterListeners() + { + BuildEvents.OnBuildBegin -= BuildEvents_OnBuildBegin; + BuildEvents.OnBuildProjConfigBegin -= BuildEvents_OnBuildProjConfigBegin; + BuildEvents.OnBuildProjConfigDone -= BuildEvents_OnBuildProjConfigDone; + BuildEvents.OnBuildDone -= BuildEvents_OnBuildDone; + } + + #endregion ISwitchable Members + #region IDisposable Members /// @@ -150,10 +176,7 @@ protected override void Dispose(bool disposing) if (disposing && BuildEvents != null) { - BuildEvents.OnBuildBegin -= BuildEvents_OnBuildBegin; - BuildEvents.OnBuildProjConfigBegin -= BuildEvents_OnBuildProjConfigBegin; - BuildEvents.OnBuildProjConfigDone -= BuildEvents_OnBuildProjConfigDone; - BuildEvents.OnBuildDone -= BuildEvents_OnBuildDone; + Switch(on: false); } } } diff --git a/CodeMaid/Integration/Events/DocumentEventListener.cs b/CodeMaid/Integration/Events/DocumentEventListener.cs index 6aca7f28..726c70e0 100644 --- a/CodeMaid/Integration/Events/DocumentEventListener.cs +++ b/CodeMaid/Integration/Events/DocumentEventListener.cs @@ -7,8 +7,17 @@ namespace SteveCadwallader.CodeMaid.Integration.Events /// /// A class that encapsulates listening for document events. /// - internal class DocumentEventListener : BaseEventListener + internal sealed class DocumentEventListener : BaseEventListener { + #region Singleton + + public static DocumentEventListener Instance { get; private set; } + + public static void Intialize(CodeMaidPackage package) + => Instance = new DocumentEventListener(package); + + #endregion Singleton + #region Constructors /// @@ -20,7 +29,7 @@ internal DocumentEventListener(CodeMaidPackage package) { // Store access to the document events, otherwise events will not register properly via DTE. DocumentEvents = Package.IDE.Events.DocumentEvents; - DocumentEvents.DocumentClosing += DocumentEvents_DocumentClosing; + Switch(on: true); } #endregion Constructors @@ -62,6 +71,20 @@ private void DocumentEvents_DocumentClosing(Document document) #endregion Private Event Handlers + #region ISwitchable Members + + protected override void RegisterListeners() + { + DocumentEvents.DocumentClosing += DocumentEvents_DocumentClosing; + } + + protected override void UnRegisterListeners() + { + DocumentEvents.DocumentClosing -= DocumentEvents_DocumentClosing; + } + + #endregion ISwitchable Members + #region IDisposable Members /// @@ -79,7 +102,7 @@ protected override void Dispose(bool disposing) if (disposing && DocumentEvents != null) { - DocumentEvents.DocumentClosing -= DocumentEvents_DocumentClosing; + Switch(on: false); } } } diff --git a/CodeMaid/Integration/Events/RunningDocumentTableEventListener.cs b/CodeMaid/Integration/Events/RunningDocumentTableEventListener.cs index 9cbc1fbc..6125695c 100644 --- a/CodeMaid/Integration/Events/RunningDocumentTableEventListener.cs +++ b/CodeMaid/Integration/Events/RunningDocumentTableEventListener.cs @@ -3,6 +3,7 @@ using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; using SteveCadwallader.CodeMaid.Helpers; +using SteveCadwallader.CodeMaid.Properties; using System.Linq; namespace SteveCadwallader.CodeMaid.Integration.Events @@ -10,8 +11,17 @@ namespace SteveCadwallader.CodeMaid.Integration.Events /// /// A class that listens for running document table events. /// - internal class RunningDocumentTableEventListener : BaseEventListener, IVsRunningDocTableEvents3 + internal sealed class RunningDocumentTableEventListener : BaseEventListener, IVsRunningDocTableEvents3 { + #region Singleton + + public static RunningDocumentTableEventListener Instance { get; private set; } + + public static void Intialize(CodeMaidPackage package) + => Instance = new RunningDocumentTableEventListener(package); + + #endregion Singleton + #region Constructors /// @@ -24,8 +34,14 @@ internal RunningDocumentTableEventListener(CodeMaidPackage package) // Create and store a reference to the running document table. RunningDocumentTable = new RunningDocumentTable(package); - // Register with the running document table for events. - EventCookie = RunningDocumentTable.Advise(this); + // This listener services multiple features, watching if any of them switched. + package.SettingMonitor.Watch(new[] { + nameof(Settings.Default.Feature_SettingCleanupOnSave), + nameof(Settings.Default.Feature_SpadeToolWindow) + }, values => + { + Switch(values.Any(v => v)); + }); } #endregion Constructors @@ -156,6 +172,22 @@ public int OnBeforeSave(uint docCookie) #endregion IVsRunningDocTableEvents3 Members + #region ISwitchable Members + + protected override void RegisterListeners() + { + // Register with the running document table for events. + EventCookie = RunningDocumentTable.Advise(this); + } + + protected override void UnRegisterListeners() + { + RunningDocumentTable.Unadvise(EventCookie); + EventCookie = 0; + } + + #endregion ISwitchable Members + #region IDisposable Members /// @@ -173,8 +205,7 @@ protected override void Dispose(bool disposing) if (disposing && RunningDocumentTable != null && EventCookie != 0) { - RunningDocumentTable.Unadvise(EventCookie); - EventCookie = 0; + Switch(on: false); } } } diff --git a/CodeMaid/Integration/Events/ShellEventListener.cs b/CodeMaid/Integration/Events/ShellEventListener.cs index 3817ee93..d4e51633 100644 --- a/CodeMaid/Integration/Events/ShellEventListener.cs +++ b/CodeMaid/Integration/Events/ShellEventListener.cs @@ -8,8 +8,17 @@ namespace SteveCadwallader.CodeMaid.Integration.Events /// /// A class that encapsulates listening for shell events. /// - internal class ShellEventListener : BaseEventListener, IVsBroadcastMessageEvents, IVsShellPropertyEvents + internal sealed class ShellEventListener : BaseEventListener, IVsBroadcastMessageEvents { + #region Singleton + + public static ShellEventListener Instance { get; private set; } + + public static void Intialize(CodeMaidPackage package, IVsShell shellService) + => Instance = new ShellEventListener(package, shellService); + + #endregion Singleton + #region Constants private const uint WM_SYSCOLORCHANGE = 0x0015; @@ -27,11 +36,7 @@ internal ShellEventListener(CodeMaidPackage package, IVsShell shellService) : base(package) { _shellService = shellService; - if (_shellService != null) - { - _shellService.AdviseBroadcastMessages(this, out _broadcastEventCookie); - _shellService.AdviseShellPropertyChanges(this, out _propertyEventCookie); - } + Switch(on: true); } #endregion Constructors @@ -43,11 +48,6 @@ internal ShellEventListener(CodeMaidPackage package, IVsShell shellService) /// internal event Action EnvironmentColorChanged; - /// - /// An event raised when the shell is available. - /// - internal event Action ShellAvailable; - #endregion Internal Events #region Private Fields @@ -57,11 +57,6 @@ internal ShellEventListener(CodeMaidPackage package, IVsShell shellService) /// private uint _broadcastEventCookie; - /// - /// An event cookie used as a notification token for property events. - /// - private uint _propertyEventCookie; - /// /// The shell service. /// @@ -96,32 +91,20 @@ public int OnBroadcastMessage(uint msg, IntPtr wParam, IntPtr lParam) #endregion IVsBroadcastMessageEvents Members - #region IVsShellPropertyEvents Members + #region ISwitchable Members - /// - /// Called when a shell property has changed. - /// - /// The id of the property that changed. - /// The new value of the property. - /// S_OK if successful, otherwise an error code. - public int OnShellPropertyChange(int propid, object var) + protected override void RegisterListeners() { - // Check if the zombie state property of the shell has changed to false. - if ((int)__VSSPROPID.VSSPROPID_Zombie == propid && ((bool)var == false)) - { - var shellAvailable = ShellAvailable; - if (shellAvailable != null) - { - OutputWindowHelper.DiagnosticWriteLine("ShellEventListener.ShellAvailable raised"); - - shellAvailable(); - } - } + _shellService.AdviseBroadcastMessages(this, out _broadcastEventCookie); + } - return VSConstants.S_OK; + protected override void UnRegisterListeners() + { + _shellService.UnadviseBroadcastMessages(_broadcastEventCookie); + _broadcastEventCookie = 0; } - #endregion IVsShellPropertyEvents Members + #endregion ISwitchable Members #region IDisposable Members @@ -142,14 +125,7 @@ protected override void Dispose(bool disposing) { if (_broadcastEventCookie != 0) { - _shellService.UnadviseBroadcastMessages(_broadcastEventCookie); - _broadcastEventCookie = 0; - } - - if (_propertyEventCookie != 0) - { - _shellService.UnadviseShellPropertyChanges(_propertyEventCookie); - _propertyEventCookie = 0; + Switch(on: false); } } } diff --git a/CodeMaid/Integration/Events/SolutionEventListener.cs b/CodeMaid/Integration/Events/SolutionEventListener.cs index 9bc1d38d..13d23666 100644 --- a/CodeMaid/Integration/Events/SolutionEventListener.cs +++ b/CodeMaid/Integration/Events/SolutionEventListener.cs @@ -7,8 +7,17 @@ namespace SteveCadwallader.CodeMaid.Integration.Events /// /// A class that encapsulates listening for solution events. /// - internal class SolutionEventListener : BaseEventListener + internal sealed class SolutionEventListener : BaseEventListener { + #region Singleton + + public static SolutionEventListener Instance { get; private set; } + + public static void Intialize(CodeMaidPackage package) + => Instance = new SolutionEventListener(package); + + #endregion Singleton + #region Constructors /// @@ -20,8 +29,7 @@ internal SolutionEventListener(CodeMaidPackage package) { // Store access to the solutions events, otherwise events will not register properly via DTE. SolutionEvents = Package.IDE.Events.SolutionEvents; - SolutionEvents.Opened += SolutionEvents_Opened; - SolutionEvents.AfterClosing += SolutionEvents_AfterClosing; + Switch(on: true); } #endregion Constructors @@ -38,6 +46,8 @@ internal SolutionEventListener(CodeMaidPackage package) /// internal event Action OnSolutionClosed; + internal void FireSolutionOpenedEvent() => SolutionEvents_Opened(); + #endregion Internal Events #region Private Properties @@ -81,6 +91,22 @@ private void SolutionEvents_AfterClosing() #endregion Private Methods + #region ISwitchable Members + + protected override void RegisterListeners() + { + SolutionEvents.Opened += SolutionEvents_Opened; + SolutionEvents.AfterClosing += SolutionEvents_AfterClosing; + } + + protected override void UnRegisterListeners() + { + SolutionEvents.Opened -= SolutionEvents_Opened; + SolutionEvents.AfterClosing -= SolutionEvents_AfterClosing; + } + + #endregion ISwitchable Members + #region IDisposable Members /// @@ -98,8 +124,7 @@ protected override void Dispose(bool disposing) if (disposing && SolutionEvents != null) { - SolutionEvents.Opened -= SolutionEvents_Opened; - SolutionEvents.AfterClosing -= SolutionEvents_AfterClosing; + Switch(on: false); } } } diff --git a/CodeMaid/Integration/Events/TextEditorEventListener.cs b/CodeMaid/Integration/Events/TextEditorEventListener.cs index e85db33a..744936be 100644 --- a/CodeMaid/Integration/Events/TextEditorEventListener.cs +++ b/CodeMaid/Integration/Events/TextEditorEventListener.cs @@ -7,8 +7,17 @@ namespace SteveCadwallader.CodeMaid.Integration.Events /// /// A class that encapsulates listening for text editor events. /// - internal class TextEditorEventListener : BaseEventListener + internal sealed class TextEditorEventListener : BaseEventListener { + #region Singleton + + public static TextEditorEventListener Instance { get; private set; } + + public static void Intialize(CodeMaidPackage package) + => Instance = new TextEditorEventListener(package); + + #endregion Singleton + #region Constructors /// @@ -21,7 +30,7 @@ internal TextEditorEventListener(CodeMaidPackage package) // Store access to the text editor events, otherwise events will not register properly // via DTE. TextEditorEvents = Package.IDE.Events.TextEditorEvents; - TextEditorEvents.LineChanged += TextEditorEvents_LineChanged; + Switch(on: true); } #endregion Constructors @@ -70,6 +79,20 @@ private void TextEditorEvents_LineChanged(TextPoint startPoint, TextPoint endPoi #endregion Private Event Handlers + #region ISwitchable Members + + protected override void RegisterListeners() + { + TextEditorEvents.LineChanged += TextEditorEvents_LineChanged; + } + + protected override void UnRegisterListeners() + { + TextEditorEvents.LineChanged -= TextEditorEvents_LineChanged; + } + + #endregion ISwitchable Members + #region IDisposable Members /// @@ -87,7 +110,7 @@ protected override void Dispose(bool disposing) if (disposing && TextEditorEvents != null) { - TextEditorEvents.LineChanged -= TextEditorEvents_LineChanged; + Switch(on: false); } } } diff --git a/CodeMaid/Integration/Events/WindowEventListener.cs b/CodeMaid/Integration/Events/WindowEventListener.cs index 1b6974cb..75994e3a 100644 --- a/CodeMaid/Integration/Events/WindowEventListener.cs +++ b/CodeMaid/Integration/Events/WindowEventListener.cs @@ -7,8 +7,17 @@ namespace SteveCadwallader.CodeMaid.Integration.Events /// /// A class that encapsulates listening for window events. /// - internal class WindowEventListener : BaseEventListener + internal sealed class WindowEventListener : BaseEventListener { + #region Singleton + + public static WindowEventListener Instance { get; private set; } + + public static void Intialize(CodeMaidPackage package) + => Instance = new WindowEventListener(package); + + #endregion Singleton + #region Constructors /// @@ -19,8 +28,8 @@ internal WindowEventListener(CodeMaidPackage package) : base(package) { // Store access to the window events, otherwise events will not register properly via DTE. - WindowEvents = Package.IDE.Events.get_WindowEvents(null); - WindowEvents.WindowActivated += WindowEvents_WindowActivated; + WindowEvents = Package.IDE.Events.WindowEvents; + package.SettingMonitor.Watch(s => s.Feature_SpadeToolWindow, Switch); } #endregion Constructors @@ -83,6 +92,20 @@ private void RaiseWindowChange(Document document) #endregion Private Methods + #region ISwitchable Members + + protected override void RegisterListeners() + { + WindowEvents.WindowActivated += WindowEvents_WindowActivated; + } + + protected override void UnRegisterListeners() + { + WindowEvents.WindowActivated -= WindowEvents_WindowActivated; + } + + #endregion ISwitchable Members + #region IDisposable Members /// @@ -100,7 +123,7 @@ protected override void Dispose(bool disposing) if (disposing && WindowEvents != null) { - WindowEvents.WindowActivated -= WindowEvents_WindowActivated; + Switch(on: false); } } } diff --git a/CodeMaid/Integration/ISwitchable.cs b/CodeMaid/Integration/ISwitchable.cs new file mode 100644 index 00000000..b6886aa6 --- /dev/null +++ b/CodeMaid/Integration/ISwitchable.cs @@ -0,0 +1,7 @@ +namespace SteveCadwallader.CodeMaid.Integration +{ + internal interface ISwitchable + { + void Switch(bool on); + } +} \ No newline at end of file diff --git a/CodeMaid/Model/CodeItems/IInterfaceItem.cs b/CodeMaid/Model/CodeItems/IInterfaceItem.cs index 7a58cdb1..dfc35e96 100644 --- a/CodeMaid/Model/CodeItems/IInterfaceItem.cs +++ b/CodeMaid/Model/CodeItems/IInterfaceItem.cs @@ -10,4 +10,4 @@ public interface IInterfaceItem /// bool IsExplicitInterfaceImplementation { get; } } -} +} \ No newline at end of file diff --git a/CodeMaid/Properties/Settings.Designer.cs b/CodeMaid/Properties/Settings.Designer.cs index 331cbe4c..dbda784a 100644 --- a/CodeMaid/Properties/Settings.Designer.cs +++ b/CodeMaid/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace SteveCadwallader.CodeMaid.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.1.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.5.0.0")] public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -1991,5 +1991,221 @@ public bool ThirdParty_UseXAMLStylerCleanup { this["ThirdParty_UseXAMLStylerCleanup"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_BuildProgressToolWindow { + get { + return ((bool)(this["Feature_BuildProgressToolWindow"])); + } + set { + this["Feature_BuildProgressToolWindow"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_CleanupActiveCode { + get { + return ((bool)(this["Feature_CleanupActiveCode"])); + } + set { + this["Feature_CleanupActiveCode"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_CleanupAllCode { + get { + return ((bool)(this["Feature_CleanupAllCode"])); + } + set { + this["Feature_CleanupAllCode"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_CleanupOpenCode { + get { + return ((bool)(this["Feature_CleanupOpenCode"])); + } + set { + this["Feature_CleanupOpenCode"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_CleanupSelectedCode { + get { + return ((bool)(this["Feature_CleanupSelectedCode"])); + } + set { + this["Feature_CleanupSelectedCode"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_CloseAllReadOnly { + get { + return ((bool)(this["Feature_CloseAllReadOnly"])); + } + set { + this["Feature_CloseAllReadOnly"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_CollapseAllSolutionExplorer { + get { + return ((bool)(this["Feature_CollapseAllSolutionExplorer"])); + } + set { + this["Feature_CollapseAllSolutionExplorer"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_CollapseSelectedSolutionExplorer { + get { + return ((bool)(this["Feature_CollapseSelectedSolutionExplorer"])); + } + set { + this["Feature_CollapseSelectedSolutionExplorer"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_CommentFormat { + get { + return ((bool)(this["Feature_CommentFormat"])); + } + set { + this["Feature_CommentFormat"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_FindInSolutionExplorer { + get { + return ((bool)(this["Feature_FindInSolutionExplorer"])); + } + set { + this["Feature_FindInSolutionExplorer"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_JoinLines { + get { + return ((bool)(this["Feature_JoinLines"])); + } + set { + this["Feature_JoinLines"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_ReadOnlyToggle { + get { + return ((bool)(this["Feature_ReadOnlyToggle"])); + } + set { + this["Feature_ReadOnlyToggle"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_RemoveRegion { + get { + return ((bool)(this["Feature_RemoveRegion"])); + } + set { + this["Feature_RemoveRegion"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_ReorganizeActiveCode { + get { + return ((bool)(this["Feature_ReorganizeActiveCode"])); + } + set { + this["Feature_ReorganizeActiveCode"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_SettingCleanupOnSave { + get { + return ((bool)(this["Feature_SettingCleanupOnSave"])); + } + set { + this["Feature_SettingCleanupOnSave"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_SortLines { + get { + return ((bool)(this["Feature_SortLines"])); + } + set { + this["Feature_SortLines"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_SpadeToolWindow { + get { + return ((bool)(this["Feature_SpadeToolWindow"])); + } + set { + this["Feature_SpadeToolWindow"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Feature_SwitchFile { + get { + return ((bool)(this["Feature_SwitchFile"])); + } + set { + this["Feature_SwitchFile"] = value; + } + } } } diff --git a/CodeMaid/Properties/Settings.settings b/CodeMaid/Properties/Settings.settings index 2470383f..3e737daf 100644 --- a/CodeMaid/Properties/Settings.settings +++ b/CodeMaid/Properties/Settings.settings @@ -494,5 +494,59 @@ False + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + \ No newline at end of file diff --git a/CodeMaid/UI/Dialogs/Options/General/FeatureDataTemplate.xaml b/CodeMaid/UI/Dialogs/Options/General/FeatureDataTemplate.xaml new file mode 100644 index 00000000..2d26821d --- /dev/null +++ b/CodeMaid/UI/Dialogs/Options/General/FeatureDataTemplate.xaml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CodeMaid/UI/Dialogs/Options/General/FeatureViewModel.cs b/CodeMaid/UI/Dialogs/Options/General/FeatureViewModel.cs new file mode 100644 index 00000000..405b5be7 --- /dev/null +++ b/CodeMaid/UI/Dialogs/Options/General/FeatureViewModel.cs @@ -0,0 +1,152 @@ +using SteveCadwallader.CodeMaid.Properties; +using Mapping = SteveCadwallader.CodeMaid.UI.Dialogs.Options.SettingToOptionMapping; + +namespace SteveCadwallader.CodeMaid.UI.Dialogs.Options.General +{ + public class FeatureViewModel : OptionsPageViewModel + { + public FeatureViewModel(CodeMaidPackage package, Settings activeSettings) + : base(package, activeSettings) + { + Mappings = new SettingsToOptionsList(ActiveSettings, this) + { + new Mapping(x => ActiveSettings.Feature_BuildProgressToolWindow, x => BuildProgressToolWindow), + new Mapping(x => ActiveSettings.Feature_CleanupActiveCode, x => CleanupActiveCode), + new Mapping(x => ActiveSettings.Feature_CleanupAllCode, x => CleanupAllCode), + new Mapping(x => ActiveSettings.Feature_CleanupOpenCode, x => CleanupOpenCode), + new Mapping(x => ActiveSettings.Feature_CleanupSelectedCode, x => CleanupSelectedCode), + new Mapping(x => ActiveSettings.Feature_CloseAllReadOnly, x => CloseAllReadOnly), + new Mapping(x => ActiveSettings.Feature_CollapseAllSolutionExplorer, x => CollapseAllSolutionExplorer), + new Mapping(x => ActiveSettings.Feature_CollapseSelectedSolutionExplorer, x => CollapseSelectedSolutionExplorer), + new Mapping(x => ActiveSettings.Feature_CommentFormat, x => CommentFormat), + new Mapping(x => ActiveSettings.Feature_FindInSolutionExplorer, x => FindInSolutionExplorer), + new Mapping(x => ActiveSettings.Feature_JoinLines, x => JoinLines), + new Mapping(x => ActiveSettings.Feature_ReadOnlyToggle, x => ReadOnlyToggle), + new Mapping(x => ActiveSettings.Feature_RemoveRegion, x => RemoveRegion), + new Mapping(x => ActiveSettings.Feature_ReorganizeActiveCode, x => ReorganizeActiveCode), + new Mapping(x => ActiveSettings.Feature_SettingCleanupOnSave, x => SettingCleanupOnSave), + new Mapping(x => ActiveSettings.Feature_SortLines, x => SortLines), + new Mapping(x => ActiveSettings.Feature_SpadeToolWindow, x => SpadeToolWindow), + new Mapping(x => ActiveSettings.Feature_SwitchFile, x => SwitchFile) + }; + } + + public override string Header => "Feature Switch"; + + public bool BuildProgressToolWindow + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool CleanupActiveCode + { + get => GetPropertyValue(); + set + { + SetPropertyValue(value); + + if (!value) + { + SettingCleanupOnSave = false; + } + } + } + + public bool CleanupAllCode + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool CleanupOpenCode + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool CleanupSelectedCode + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool CloseAllReadOnly + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool CollapseAllSolutionExplorer + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool CollapseSelectedSolutionExplorer + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool CommentFormat + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool FindInSolutionExplorer + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool JoinLines + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool ReadOnlyToggle + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool RemoveRegion + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool ReorganizeActiveCode + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool SettingCleanupOnSave + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool SortLines + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool SpadeToolWindow + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + + public bool SwitchFile + { + get => GetPropertyValue(); + set => SetPropertyValue(value); + } + } +} \ No newline at end of file diff --git a/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs b/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs index 7d3ada0b..246c098d 100644 --- a/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs @@ -48,7 +48,13 @@ public OptionsViewModel(CodeMaidPackage package, Type initiallySelectedPageType Package = package; Pages = new OptionsPageViewModel[] { - new GeneralViewModel(package, ActiveSettings), + new GeneralViewModel(package, ActiveSettings) + { + Children = new OptionsPageViewModel[] + { + new FeatureViewModel(package,ActiveSettings) + } + }, new CleaningParentViewModel(package, ActiveSettings) { Children = new OptionsPageViewModel[] diff --git a/CodeMaid/UI/Dialogs/Options/OptionsWindow.xaml b/CodeMaid/UI/Dialogs/Options/OptionsWindow.xaml index 8010d418..6f21cc28 100644 --- a/CodeMaid/UI/Dialogs/Options/OptionsWindow.xaml +++ b/CodeMaid/UI/Dialogs/Options/OptionsWindow.xaml @@ -98,6 +98,7 @@ + diff --git a/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs b/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs index 371896fd..3e6cfc58 100644 --- a/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs +++ b/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs @@ -1,5 +1,6 @@ using EnvDTE; using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Shell.Interop; using System; using System.Collections.Generic; using System.Globalization; @@ -98,6 +99,8 @@ private double ProgressPercentage #region Methods + public void Close() => (Frame as IVsWindowFrame).CloseFrame((uint)__FRAMECLOSE.FRAMECLOSE_NoSave); + /// /// This method can be overriden by the derived class to execute any code that needs to run /// after the IVsWindowFrame is created. If the toolwindow has a toolbar with a combobox, it diff --git a/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs b/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs index a049ad70..06520f47 100644 --- a/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs +++ b/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs @@ -193,6 +193,8 @@ public void Refresh() ConditionallyUpdateCodeModel(true); } + public void Close() => (Frame as IVsWindowFrame).CloseFrame((uint)__FRAMECLOSE.FRAMECLOSE_NoSave); + #endregion Public Methods #region Private Properties diff --git a/CodeMaid/app.config b/CodeMaid/app.config index 7f8e29ca..d85f60f4 100644 --- a/CodeMaid/app.config +++ b/CodeMaid/app.config @@ -547,6 +547,60 @@ False + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + From e08b3b9350afdda230b18c5716abccb6b4d682f8 Mon Sep 17 00:00:00 2001 From: heku Date: Sun, 4 Feb 2018 12:39:45 +0800 Subject: [PATCH 14/71] Remove ServiceProvider property, use Package itself instead. --- CodeMaid/CodeMaidPackage.cs | 10 ---------- .../Commands/FindInSolutionExplorerCommand.cs | 9 +++------ .../Logic/Digging/OutliningSynchronizationManager.cs | 4 ++-- 3 files changed, 5 insertions(+), 18 deletions(-) diff --git a/CodeMaid/CodeMaidPackage.cs b/CodeMaid/CodeMaidPackage.cs index a141afc4..f78dbf50 100644 --- a/CodeMaid/CodeMaidPackage.cs +++ b/CodeMaid/CodeMaidPackage.cs @@ -61,11 +61,6 @@ public sealed class CodeMaidPackage : Package, IVsInstalledProduct /// private DTE2 _ide; - /// - /// The service provider. - /// - private IServiceProvider _serviceProvider; - /// /// The Spade tool window. /// @@ -166,11 +161,6 @@ public Document ActiveDocument /// public OleMenuCommandService MenuCommandService => GetService(typeof(IMenuCommandService)) as OleMenuCommandService; - /// - /// Gets the service provider. - /// - public IServiceProvider ServiceProvider => this; - /// /// Gets the Spade tool window, if it already exists. /// diff --git a/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs b/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs index 7915be3a..65bb39d9 100644 --- a/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs +++ b/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs @@ -105,12 +105,9 @@ protected override void OnExecute() /// private void ClearSolutionExplorerSearchFilter() { - if (Package.ServiceProvider != null) - { - var solutionExplorer = VsShellUtilities.GetUIHierarchyWindow(Package.ServiceProvider, VSConstants.StandardToolWindows.SolutionExplorer); - var ws = solutionExplorer as IVsWindowSearch; - ws?.ClearSearch(); - } + var solutionExplorer = VsShellUtilities.GetUIHierarchyWindow(Package, VSConstants.StandardToolWindows.SolutionExplorer); + var ws = solutionExplorer as IVsWindowSearch; + ws?.ClearSearch(); } /// diff --git a/CodeMaid/Logic/Digging/OutliningSynchronizationManager.cs b/CodeMaid/Logic/Digging/OutliningSynchronizationManager.cs index 518387d8..e34df8e8 100644 --- a/CodeMaid/Logic/Digging/OutliningSynchronizationManager.cs +++ b/CodeMaid/Logic/Digging/OutliningSynchronizationManager.cs @@ -274,7 +274,7 @@ private IWpfTextView GetWpfTextView(Document document) /// The associated text view, otherwise null. private IVsTextView GetTextView(Document document) { - if (_package.ServiceProvider == null || document == null) + if (document == null) { return null; } @@ -283,7 +283,7 @@ private IVsTextView GetTextView(Document document) uint itemID; IVsWindowFrame windowFrame; - if (VsShellUtilities.IsDocumentOpen(_package.ServiceProvider, document.FullName, Guid.Empty, out hierarchy, out itemID, out windowFrame)) + if (VsShellUtilities.IsDocumentOpen(_package, document.FullName, Guid.Empty, out hierarchy, out itemID, out windowFrame)) { return VsShellUtilities.GetTextView(windowFrame); } From f8c0d65ecca165a29349e17e333bc23deaba954a Mon Sep 17 00:00:00 2001 From: heku Date: Sun, 4 Feb 2018 16:21:41 +0800 Subject: [PATCH 15/71] Use built-in helper class VSColorTheme for theme changed notification. --- CodeMaid/CodeMaid.csproj | 1 - CodeMaid/CodeMaidPackage.cs | 14 +- .../Integration/Events/ShellEventListener.cs | 136 ------------------ 3 files changed, 2 insertions(+), 149 deletions(-) delete mode 100644 CodeMaid/Integration/Events/ShellEventListener.cs diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 5542a7f3..da839271 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -256,7 +256,6 @@ - diff --git a/CodeMaid/CodeMaidPackage.cs b/CodeMaid/CodeMaidPackage.cs index f78dbf50..0166a132 100644 --- a/CodeMaid/CodeMaidPackage.cs +++ b/CodeMaid/CodeMaidPackage.cs @@ -20,6 +20,7 @@ using System.Runtime.InteropServices; using System.Windows; using System.Windows.Threading; +using VSColorTheme = Microsoft.VisualStudio.PlatformUI.VSColorTheme; namespace SteveCadwallader.CodeMaid { @@ -182,15 +183,6 @@ public Document ActiveDocument #endregion Public Integration Properties - #region Private Service Properties - - /// - /// Gets the shell service. - /// - private IVsShell ShellService => GetService(typeof(SVsShell)) as IVsShell; - - #endregion Private Service Properties - #region Package Members /// @@ -337,8 +329,7 @@ private void RegisterEventListeners() var codeModelManager = CodeModelManager.GetInstance(this); var settingsContextHelper = SettingsContextHelper.GetInstance(this); - ShellEventListener.Intialize(this, ShellService); - ShellEventListener.Instance.EnvironmentColorChanged += ThemeManager.ApplyTheme; + VSColorTheme.ThemeChanged += _ => ThemeManager.ApplyTheme(); BuildProgressEventListener.Intialize(this); BuildProgressEventListener.Instance.BuildBegin += BuildProgressToolWindowCommand.Instance.OnBuildBegin; @@ -409,7 +400,6 @@ protected override void Dispose(bool disposing) BuildProgressEventListener.Instance.Dispose(); DocumentEventListener.Instance.Dispose(); RunningDocumentTableEventListener.Instance.Dispose(); - ShellEventListener.Instance.Dispose(); SolutionEventListener.Instance.Dispose(); TextEditorEventListener.Instance.Dispose(); WindowEventListener.Instance.Dispose(); diff --git a/CodeMaid/Integration/Events/ShellEventListener.cs b/CodeMaid/Integration/Events/ShellEventListener.cs deleted file mode 100644 index d4e51633..00000000 --- a/CodeMaid/Integration/Events/ShellEventListener.cs +++ /dev/null @@ -1,136 +0,0 @@ -using Microsoft.VisualStudio; -using Microsoft.VisualStudio.Shell.Interop; -using SteveCadwallader.CodeMaid.Helpers; -using System; - -namespace SteveCadwallader.CodeMaid.Integration.Events -{ - /// - /// A class that encapsulates listening for shell events. - /// - internal sealed class ShellEventListener : BaseEventListener, IVsBroadcastMessageEvents - { - #region Singleton - - public static ShellEventListener Instance { get; private set; } - - public static void Intialize(CodeMaidPackage package, IVsShell shellService) - => Instance = new ShellEventListener(package, shellService); - - #endregion Singleton - - #region Constants - - private const uint WM_SYSCOLORCHANGE = 0x0015; - - #endregion Constants - - #region Constructors - - /// - /// Initializes a new instance of the class. - /// - /// The package hosting the event listener. - /// The shell service. - internal ShellEventListener(CodeMaidPackage package, IVsShell shellService) - : base(package) - { - _shellService = shellService; - Switch(on: true); - } - - #endregion Constructors - - #region Internal Events - - /// - /// An event raised when an environment color has changed. - /// - internal event Action EnvironmentColorChanged; - - #endregion Internal Events - - #region Private Fields - - /// - /// An event cookie used as a notification token for broadcast events. - /// - private uint _broadcastEventCookie; - - /// - /// The shell service. - /// - private readonly IVsShell _shellService; - - #endregion Private Fields - - #region IVsBroadcastMessageEvents Members - - /// - /// Called when a message is broadcast to the environment window. - /// - /// The notification message. - /// The word value parameter. - /// The long integer parameter. - /// S_OK if successful, otherwise an error code. - public int OnBroadcastMessage(uint msg, IntPtr wParam, IntPtr lParam) - { - if (msg == WM_SYSCOLORCHANGE) - { - var environmentColorChanged = EnvironmentColorChanged; - if (environmentColorChanged != null) - { - OutputWindowHelper.DiagnosticWriteLine("ShellEventListener.EnvironmentColorChanged raised"); - - environmentColorChanged(); - } - } - - return VSConstants.S_OK; - } - - #endregion IVsBroadcastMessageEvents Members - - #region ISwitchable Members - - protected override void RegisterListeners() - { - _shellService.AdviseBroadcastMessages(this, out _broadcastEventCookie); - } - - protected override void UnRegisterListeners() - { - _shellService.UnadviseBroadcastMessages(_broadcastEventCookie); - _broadcastEventCookie = 0; - } - - #endregion ISwitchable Members - - #region IDisposable Members - - /// - /// Releases unmanaged and - optionally - managed resources - /// - /// - /// true to release both managed and unmanaged resources; false to release - /// only unmanaged resources. - /// - protected override void Dispose(bool disposing) - { - if (!IsDisposed) - { - IsDisposed = true; - - if (disposing && _shellService != null) - { - if (_broadcastEventCookie != 0) - { - Switch(on: false); - } - } - } - } - - #endregion IDisposable Members - } -} \ No newline at end of file From e555c4c4890ce15894d0660efa37af24bfd3375c Mon Sep 17 00:00:00 2001 From: heku Date: Sun, 4 Feb 2018 17:29:31 +0800 Subject: [PATCH 16/71] Ensure cleanup active code feature always works in current solution. --- CodeMaid.config | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CodeMaid.config b/CodeMaid.config index 7c7e6b73..12830564 100644 --- a/CodeMaid.config +++ b/CodeMaid.config @@ -16,6 +16,12 @@ False + + True + + + True + \ No newline at end of file From 96ac18ede0925efce99eaed450fbc9b61743541f Mon Sep 17 00:00:00 2001 From: heku Date: Tue, 6 Feb 2018 21:12:31 +0800 Subject: [PATCH 17/71] Ensure Spade inside event handlers register only when feature on --- .../UI/ToolWindows/Spade/SpadeToolWindow.cs | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs b/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs index 06520f47..52ea0102 100644 --- a/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs +++ b/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs @@ -62,10 +62,6 @@ public SpadeToolWindow() // Create and set the view. Content = new SpadeView { DataContext = _viewModel }; - - // Register for changes to settings. - Settings.Default.SettingsLoaded += (sender, args) => OnSettingsChange(); - Settings.Default.SettingsSaving += (sender, args) => OnSettingsChange(); } #endregion Constructors @@ -162,7 +158,24 @@ public override void OnToolWindowCreated() { // Get an instance of the code model manager. _codeModelManager = CodeModelManager.GetInstance(Package); - _codeModelManager.CodeModelBuilt += OnCodeModelBuilt; + Package.SettingMonitor.Watch(s => s.Feature_SpadeToolWindow, on => + { + if (on) + { + _codeModelManager.CodeModelBuilt += OnCodeModelBuilt; + + // Register for changes to settings. + Settings.Default.SettingsLoaded += OnSettingsLoaded; + Settings.Default.SettingsSaving += OnSettingsSaving; + } + else + { + _codeModelManager.CodeModelBuilt -= OnCodeModelBuilt; + + Settings.Default.SettingsLoaded -= OnSettingsLoaded; + Settings.Default.SettingsSaving -= OnSettingsSaving; + } + }); // Pass the package over to the view model. _viewModel.Package = Package; @@ -178,7 +191,7 @@ public override void OnToolWindowCreated() { _viewModel.Dispatcher = spadeContent.Dispatcher; - spadeContent.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() => Package.ThemeManager.ApplyTheme())); + spadeContent.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(Package.ThemeManager.ApplyTheme)); } } } @@ -275,6 +288,10 @@ private void OnCodeModelBuilt(CodeModel codeModel) } } + private void OnSettingsSaving(object sender, System.ComponentModel.CancelEventArgs e) => OnSettingsChange(); + + private void OnSettingsLoaded(object sender, System.Configuration.SettingsLoadedEventArgs e) => OnSettingsChange(); + /// /// An event handler called when settings are changed. /// From 7558960cc09a06b540de14f90dbe0c8fab233eaf Mon Sep 17 00:00:00 2001 From: heku Date: Wed, 7 Feb 2018 18:49:05 +0800 Subject: [PATCH 18/71] Disable Spade auto show as sometimes it shows but the feature is off. --- CodeMaid/CodeMaidPackage.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/CodeMaid/CodeMaidPackage.cs b/CodeMaid/CodeMaidPackage.cs index 0166a132..8075dba3 100644 --- a/CodeMaid/CodeMaidPackage.cs +++ b/CodeMaid/CodeMaidPackage.cs @@ -41,7 +41,6 @@ namespace SteveCadwallader.CodeMaid [ProvideMenuResource(1000, 1)] // This attribute is needed to let the shell know that this package exposes some menus. [ProvideToolWindow(typeof(BuildProgressToolWindow), MultiInstances = false, Height = 40, Width = 500, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Bottom, Window = EnvDTE.Constants.vsWindowKindMainWindow)] [ProvideToolWindow(typeof(SpadeToolWindow), MultiInstances = false, Style = VsDockStyle.Tabbed, Orientation = ToolWindowOrientation.Left, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)] - [ProvideToolWindowVisibility(typeof(SpadeToolWindow), VSConstants.UICONTEXT.SolutionExistsAndFullyLoaded_string)] [Guid(PackageGuids.GuidCodeMaidPackageString)] // Package unique GUID. public sealed class CodeMaidPackage : Package, IVsInstalledProduct { From d2463b778d5b8acc10ff179f33168075479c4b94 Mon Sep 17 00:00:00 2001 From: MysticBoy Date: Mon, 12 Mar 2018 15:10:36 +0800 Subject: [PATCH 19/71] Modify for PR #506 ,Removed commented out code, Removed "StringResourceKey",Modify CleanupProgressViewModel --- CodeMaid/CodeMaid.csproj | 2 +- CodeMaid/Integration/Commands/BaseCommand.cs | 4 ---- .../Commands/CleanupAllCodeCommand.cs | 8 ++++---- .../Commands/CommentFormatCommand.cs | 10 +++++----- .../Commands/ReadOnlyToggleCommand.cs | 2 +- .../Commands/RemoveRegionCommand.cs | 6 +++--- .../Commands/SettingCleanupOnSaveCommand.cs | 6 +++--- .../SpadeContextInsertRegionCommand.cs | 2 +- .../Integration/Commands/SwitchFileCommand.cs | 4 ++-- .../Cleaning/CodeCleanupAvailabilityLogic.cs | 6 +++--- CodeMaid/Properties/Resources.Designer.cs | 9 --------- CodeMaid/Properties/Resources.resx | 3 --- CodeMaid/Properties/Resources.zh-Hans.resx | 3 --- CodeMaid/StringResourceKey.cs | 11 ----------- .../CleanupProgressViewModel.cs | 2 +- .../CleanupProgress/CleanupProgressWindow.xaml | 8 ++++++-- .../Cleaning/CleaningFileTypesViewModel.cs | 2 +- .../Cleaning/CleaningGeneralViewModel.cs | 2 +- .../Cleaning/CleaningInsertViewModel.cs | 2 +- .../Cleaning/CleaningParentViewModel.cs | 2 +- .../Cleaning/CleaningRemoveViewModel.cs | 2 +- .../Cleaning/CleaningUpdateViewModel.cs | 2 +- .../Options/Collapsing/CollapsingViewModel.cs | 2 +- .../Options/Digging/DiggingViewModel.cs | 2 +- .../Options/Finding/FindingViewModel.cs | 2 +- .../Options/Formatting/FormattingViewModel.cs | 2 +- .../Options/General/GeneralViewModel.cs | 2 +- .../UI/Dialogs/Options/OptionsViewModel.cs | 18 +++++++++--------- .../Progressing/ProgressingViewModel.cs | 2 +- .../ReorganizingGeneralViewModel.cs | 2 +- .../ReorganizingParentViewModel.cs | 2 +- .../ReorganizingRegionsViewModel.cs | 2 +- .../Reorganizing/ReorganizingTypesViewModel.cs | 2 +- .../Options/Switching/SwitchingViewModel.cs | 2 +- .../Options/ThirdParty/ThirdPartyViewModel.cs | 2 +- CodeMaid/UI/ThemeManager.cs | 2 +- .../BuildProgress/BuildProgressToolWindow.cs | 12 ++++++------ .../UI/ToolWindows/Spade/SpadeToolWindow.cs | 4 ++-- 38 files changed, 66 insertions(+), 92 deletions(-) delete mode 100644 CodeMaid/StringResourceKey.cs diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 86139755..599ac2f0 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -172,8 +172,8 @@ Properties\CodeMaid.snk - + True True CodeMaid.vsct diff --git a/CodeMaid/Integration/Commands/BaseCommand.cs b/CodeMaid/Integration/Commands/BaseCommand.cs index fffe3100..710b6fb9 100644 --- a/CodeMaid/Integration/Commands/BaseCommand.cs +++ b/CodeMaid/Integration/Commands/BaseCommand.cs @@ -46,10 +46,6 @@ protected BaseCommand(CodeMaidPackage package, CommandID id) private static void BaseCommand_BeforeQueryStatus(object sender, EventArgs e) { BaseCommand command = sender as BaseCommand; - //if (string.IsNullOrEmpty(command.Text)) - //{ - // command.Text = StringResourceKey.GetResourceText(command); - //} command?.OnBeforeQueryStatus(); } diff --git a/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs index fa62e8c4..14e876e0 100644 --- a/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs @@ -48,12 +48,12 @@ protected override void OnExecute() if (!CodeCleanupAvailabilityLogic.IsCleanupEnvironmentAvailable()) { - MessageBox.Show(StringResourceKey.CleanupCannotRunWhileDebugging, - StringResourceKey.CodeMaidCleanupAllCode, + MessageBox.Show(CodeMaid.Properties.Resources.CleanupCannotRunWhileDebugging, + CodeMaid.Properties.Resources.CodeMaidCleanupAllCode, MessageBoxButton.OK, MessageBoxImage.Warning); } - else if (MessageBox.Show(StringResourceKey.AreYouReadyForCodeMaidToCleanEverythingInTheSolution, - StringResourceKey.CodeMaidConfirmationForCleanupAllCode, + else if (MessageBox.Show(CodeMaid.Properties.Resources.AreYouReadyForCodeMaidToCleanEverythingInTheSolution, + CodeMaid.Properties.Resources.CodeMaidConfirmationForCleanupAllCode, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes) { diff --git a/CodeMaid/Integration/Commands/CommentFormatCommand.cs b/CodeMaid/Integration/Commands/CommentFormatCommand.cs index f3191d3e..9b78ba1e 100644 --- a/CodeMaid/Integration/Commands/CommentFormatCommand.cs +++ b/CodeMaid/Integration/Commands/CommentFormatCommand.cs @@ -27,7 +27,7 @@ internal CommentFormatCommand(CodeMaidPackage package) : base(package, new CommandID(PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCommentFormat)) { - _undoTransactionHelper = new UndoTransactionHelper(package, StringResourceKey.CodeMaidFormatComment); + _undoTransactionHelper = new UndoTransactionHelper(package, CodeMaid.Properties.Resources.CodeMaidFormatComment); _commentFormatLogic = CommentFormatLogic.GetInstance(package); } @@ -81,15 +81,15 @@ protected override void OnExecute() if (foundComments) { - Package.IDE.StatusBar.Text = StringResourceKey.CodeMaidFinishedFormattingTheComment; + Package.IDE.StatusBar.Text = CodeMaid.Properties.Resources.CodeMaidFinishedFormattingTheComment; } else { Package.IDE.StatusBar.Text = string.Format( foundComments - ? StringResourceKey.CodeMaidFinishedFormattingTheComments0 - : StringResourceKey.CodeMaidDidNotFindANonCodeComment0ToReformat, - selection.IsEmpty ? StringResourceKey.UnderTheCursor : StringResourceKey.InTheSelection + ? CodeMaid.Properties.Resources.CodeMaidFinishedFormattingTheComments0 + : CodeMaid.Properties.Resources.CodeMaidDidNotFindANonCodeComment0ToReformat, + selection.IsEmpty ? CodeMaid.Properties.Resources.UnderTheCursor : CodeMaid.Properties.Resources.InTheSelection ); } } diff --git a/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs b/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs index 1f7c45c3..73dda3a0 100644 --- a/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs +++ b/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs @@ -54,7 +54,7 @@ protected override void OnExecute() } catch (Exception ex) { - OutputWindowHelper.ExceptionWriteLine($"{StringResourceKey.UnableToToggleReadOnlyStateOn}'{document.FullName}'", ex); + OutputWindowHelper.ExceptionWriteLine($"{ CodeMaid.Properties.Resources.UnableToToggleReadOnlyStateOn}'{document.FullName}'", ex); } } } diff --git a/CodeMaid/Integration/Commands/RemoveRegionCommand.cs b/CodeMaid/Integration/Commands/RemoveRegionCommand.cs index 771b57b9..6ecf4cb8 100644 --- a/CodeMaid/Integration/Commands/RemoveRegionCommand.cs +++ b/CodeMaid/Integration/Commands/RemoveRegionCommand.cs @@ -63,15 +63,15 @@ protected override void OnBeforeQueryStatus() switch (regionCommandScope) { case RegionCommandScope.CurrentLine: - Text = StringResourceKey.RemoveCurrentRegion; + Text = CodeMaid.Properties.Resources.RemoveCurrentRegion; break; case RegionCommandScope.Selection: - Text = StringResourceKey.RemoveSelectedRegions; + Text = CodeMaid.Properties.Resources.RemoveSelectedRegions; break; default: - Text = StringResourceKey.RemoveAllRegions; + Text = CodeMaid.Properties.Resources.RemoveAllRegions; break; } } diff --git a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs index fcec6583..667ebc88 100644 --- a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs +++ b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs @@ -36,7 +36,7 @@ public bool CleanupOnSave /// /// Gets an ON/OFF string based on the state. /// - public string CleanupOnSaveStateText => CleanupOnSave ? StringResourceKey.SettingCleanupOnSaveCommand_ON : StringResourceKey.SettingCleanupOnSaveCommand_OFF; + public string CleanupOnSaveStateText => CleanupOnSave ? CodeMaid.Properties.Resources.SettingCleanupOnSaveCommand_ON : CodeMaid.Properties.Resources.SettingCleanupOnSaveCommand_OFF; #endregion Properties @@ -48,7 +48,7 @@ public bool CleanupOnSave protected override void OnBeforeQueryStatus() { Checked = CleanupOnSave; - Text = StringResourceKey.AutomaticCleanupOnSave + CleanupOnSaveStateText; + Text = CodeMaid.Properties.Resources.AutomaticCleanupOnSave + CleanupOnSaveStateText; } /// @@ -61,7 +61,7 @@ protected override void OnExecute() CleanupOnSave = !CleanupOnSave; Settings.Default.Save(); - Package.IDE.StatusBar.Text = $"{StringResourceKey.CodeMaidTurnedAutomaticCleanupOnSave }{CleanupOnSaveStateText}."; + Package.IDE.StatusBar.Text = $"{ CodeMaid.Properties.Resources.CodeMaidTurnedAutomaticCleanupOnSave }{CleanupOnSaveStateText}."; } #endregion BaseCommand Methods diff --git a/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs b/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs index 48a6c06b..ebe29dce 100644 --- a/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs @@ -65,7 +65,7 @@ protected override void OnExecute() var spade = Package.Spade; if (spade != null) { - var region = new CodeItemRegion { Name = StringResourceKey.NewRegion }; + var region = new CodeItemRegion { Name = CodeMaid.Properties.Resources.NewRegion }; var startPoint = spade.SelectedItems.OrderBy(x => x.StartOffset).First().StartPoint; var endPoint = spade.SelectedItems.OrderBy(x => x.EndOffset).Last().EndPoint; diff --git a/CodeMaid/Integration/Commands/SwitchFileCommand.cs b/CodeMaid/Integration/Commands/SwitchFileCommand.cs index e1d24b26..d3cdb30d 100644 --- a/CodeMaid/Integration/Commands/SwitchFileCommand.cs +++ b/CodeMaid/Integration/Commands/SwitchFileCommand.cs @@ -41,11 +41,11 @@ protected override void OnBeforeQueryStatus() Enabled = canAlterate; if (canAlterate) { - Text = StringResourceKey.SWitchTo + Path.GetFileName(alternatePath); + Text = CodeMaid.Properties.Resources.SWitchTo + Path.GetFileName(alternatePath); } else { - Text = StringResourceKey.SWitchFile; + Text = CodeMaid.Properties.Resources.SWitchFile; } } diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs b/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs index 75da89bf..1e6fe502 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs @@ -415,10 +415,10 @@ private static bool PromptUserAboutCleaningExternalFiles(Document document) { var viewModel = new YesNoPromptViewModel { - Title = StringResourceKey.CodeMaidCleanupExternalFile, - Message = document.Name + StringResourceKey.IsNotInTheSolutionSoSomeCleanupActionsMayBeUnavailable + + Title = CodeMaid.Properties.Resources.CodeMaidCleanupExternalFile, + Message = document.Name + CodeMaid.Properties.Resources.IsNotInTheSolutionSoSomeCleanupActionsMayBeUnavailable + Environment.NewLine + Environment.NewLine + - StringResourceKey.DoYouWantToPerformAPartialCleanup, + CodeMaid.Properties.Resources.DoYouWantToPerformAPartialCleanup, CanRemember = true }; diff --git a/CodeMaid/Properties/Resources.Designer.cs b/CodeMaid/Properties/Resources.Designer.cs index 00b4895f..8a6579d3 100644 --- a/CodeMaid/Properties/Resources.Designer.cs +++ b/CodeMaid/Properties/Resources.Designer.cs @@ -339,15 +339,6 @@ public static string Cleaning { } } - /// - /// 查找类似 Cleaning {0}... 的本地化字符串。 - /// - public static string Cleaning0 { - get { - return ResourceManager.GetString("Cleaning0", resourceCulture); - } - } - /// /// 查找类似 File Types 的本地化字符串。 /// diff --git a/CodeMaid/Properties/Resources.resx b/CodeMaid/Properties/Resources.resx index 24d45970..465e1560 100644 --- a/CodeMaid/Properties/Resources.resx +++ b/CodeMaid/Properties/Resources.resx @@ -192,9 +192,6 @@ S&witch to - - Cleaning {0}... - CodeMaid: Cleanup Progress diff --git a/CodeMaid/Properties/Resources.zh-Hans.resx b/CodeMaid/Properties/Resources.zh-Hans.resx index 9b3e63d3..5b61e868 100644 --- a/CodeMaid/Properties/Resources.zh-Hans.resx +++ b/CodeMaid/Properties/Resources.zh-Hans.resx @@ -222,9 +222,6 @@ CodeMaid: 整理进度 - - 正在整理{0}..。 - 切换至(&W) diff --git a/CodeMaid/StringResourceKey.cs b/CodeMaid/StringResourceKey.cs deleted file mode 100644 index 4f9b55d8..00000000 --- a/CodeMaid/StringResourceKey.cs +++ /dev/null @@ -1,11 +0,0 @@ -using SteveCadwallader.CodeMaid.Integration.Commands; -using System; -using System.Collections.Specialized; -using System.Linq; - -namespace SteveCadwallader.CodeMaid -{ - internal class StringResourceKey : Properties.Resources - { - } -} \ No newline at end of file diff --git a/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressViewModel.cs b/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressViewModel.cs index b1155943..496fcb74 100644 --- a/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressViewModel.cs +++ b/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressViewModel.cs @@ -176,7 +176,7 @@ private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEven dynamic currentItem = e.UserState; CountProgress = currentCount; - CurrentFileName = string.Format(StringResourceKey.Cleaning0, currentItem.Name); + CurrentFileName = currentItem.Name; } /// diff --git a/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressWindow.xaml b/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressWindow.xaml index de192853..28022a4e 100644 --- a/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressWindow.xaml +++ b/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressWindow.xaml @@ -28,8 +28,12 @@ - + + + diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningFileTypesViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningFileTypesViewModel.cs index a829ef71..41592beb 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningFileTypesViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningFileTypesViewModel.cs @@ -48,7 +48,7 @@ public CleaningFileTypesViewModel(CodeMaidPackage package, Settings activeSettin /// /// Gets the header. /// - public override string Header => StringResourceKey.CleaningFileTypesViewModel_FileTypes; + public override string Header => CodeMaid.Properties.Resources.CleaningFileTypesViewModel_FileTypes; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralViewModel.cs index e75a2070..ec554ea4 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralViewModel.cs @@ -33,7 +33,7 @@ public CleaningGeneralViewModel(CodeMaidPackage package, Settings activeSettings /// /// Gets the header. /// - public override string Header => StringResourceKey.General; + public override string Header => CodeMaid.Properties.Resources.General; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningInsertViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningInsertViewModel.cs index 28a37147..29a07a0e 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningInsertViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningInsertViewModel.cs @@ -71,7 +71,7 @@ public CleaningInsertViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.Insert; + public override string Header => CodeMaid.Properties.Resources.Insert; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningParentViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningParentViewModel.cs index 1de1b41f..8e64789d 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningParentViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningParentViewModel.cs @@ -26,7 +26,7 @@ public CleaningParentViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.Cleaning; + public override string Header => CodeMaid.Properties.Resources.Cleaning; #endregion Overrides of OptionsPageViewModel } diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveViewModel.cs index 6234ddcd..93f9c485 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveViewModel.cs @@ -42,7 +42,7 @@ public CleaningRemoveViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.Remove; + public override string Header => CodeMaid.Properties.Resources.Remove; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningUpdateViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningUpdateViewModel.cs index bdec9028..37fbb717 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningUpdateViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningUpdateViewModel.cs @@ -48,7 +48,7 @@ public CleaningUpdateViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.CleaningUpdateViewModel_Update; + public override string Header => CodeMaid.Properties.Resources.CleaningUpdateViewModel_Update; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Collapsing/CollapsingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Collapsing/CollapsingViewModel.cs index 27469e2d..1614a904 100644 --- a/CodeMaid/UI/Dialogs/Options/Collapsing/CollapsingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Collapsing/CollapsingViewModel.cs @@ -31,7 +31,7 @@ public CollapsingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.CollapsingViewModel_Collapsing; + public override string Header => CodeMaid.Properties.Resources.CollapsingViewModel_Collapsing; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Digging/DiggingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Digging/DiggingViewModel.cs index 624e9d20..f7850ce1 100644 --- a/CodeMaid/UI/Dialogs/Options/Digging/DiggingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Digging/DiggingViewModel.cs @@ -40,7 +40,7 @@ public DiggingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.DiggingViewModel_DiggingSpade; + public override string Header => CodeMaid.Properties.Resources.DiggingViewModel_DiggingSpade; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Finding/FindingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Finding/FindingViewModel.cs index fb42b92f..857bee4e 100644 --- a/CodeMaid/UI/Dialogs/Options/Finding/FindingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Finding/FindingViewModel.cs @@ -31,7 +31,7 @@ public FindingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.FindingViewModel_Finding; + public override string Header => CodeMaid.Properties.Resources.FindingViewModel_Finding; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Formatting/FormattingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Formatting/FormattingViewModel.cs index e5f64e67..a6b55441 100644 --- a/CodeMaid/UI/Dialogs/Options/Formatting/FormattingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Formatting/FormattingViewModel.cs @@ -63,7 +63,7 @@ public FormattingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.FormattingViewModel_Formatting; + public override string Header => CodeMaid.Properties.Resources.FormattingViewModel_Formatting; /// /// Loads the settings. diff --git a/CodeMaid/UI/Dialogs/Options/General/GeneralViewModel.cs b/CodeMaid/UI/Dialogs/Options/General/GeneralViewModel.cs index 09893e71..a3081554 100644 --- a/CodeMaid/UI/Dialogs/Options/General/GeneralViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/General/GeneralViewModel.cs @@ -39,7 +39,7 @@ public GeneralViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.General; + public override string Header => CodeMaid.Properties.Resources.General; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs b/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs index c4d93b71..9987c5ab 100644 --- a/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs @@ -217,10 +217,10 @@ private void OnExportCommandExecuted(object parameter) var activeSettingsName = ActiveSettingsName; var dialog = new Microsoft.Win32.SaveFileDialog { - Title = StringResourceKey.CodeMaidExport + activeSettingsName, + Title = CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName, FileName = "CodeMaid", DefaultExt = ".config", - Filter = StringResourceKey.ConfigFilesConfigConfigAllFiles + Filter = CodeMaid.Properties.Resources.ConfigFilesConfigConfigAllFiles }; if (dialog.ShowDialog() == true) @@ -229,14 +229,14 @@ private void OnExportCommandExecuted(object parameter) { File.Copy(ActiveSettingsPath, dialog.FileName, true); - MessageBox.Show(string.Format(StringResourceKey.CodeMaidHasSuccessfullyExported + activeSettingsName + StringResourceKey.To0, dialog.FileName), - StringResourceKey.CodeMaidExport + activeSettingsName + StringResourceKey.Successful, MessageBoxButton.OK, MessageBoxImage.Information); + MessageBox.Show(string.Format( CodeMaid.Properties.Resources.CodeMaidHasSuccessfullyExported + activeSettingsName + CodeMaid.Properties.Resources.To0, dialog.FileName), + CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName + CodeMaid.Properties.Resources.Successful, MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { OutputWindowHelper.ExceptionWriteLine("Unable to export " + activeSettingsName, ex); - MessageBox.Show(StringResourceKey.CodeMaidWasUnableToExport + activeSettingsName + StringResourceKey.SeeOutputWindowForMoreDetails, - StringResourceKey.CodeMaidExport + activeSettingsName + StringResourceKey.Unsuccessful, MessageBoxButton.OK, MessageBoxImage.Error); + MessageBox.Show( CodeMaid.Properties.Resources.CodeMaidWasUnableToExport + activeSettingsName + CodeMaid.Properties.Resources.SeeOutputWindowForMoreDetails, + CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName + CodeMaid.Properties.Resources.Unsuccessful, MessageBoxButton.OK, MessageBoxImage.Error); } } } @@ -266,9 +266,9 @@ private void OnImportCommandExecuted(object parameter) var activeSettingsName = ActiveSettingsName; var dialog = new Microsoft.Win32.OpenFileDialog { - Title = StringResourceKey.CodeMaidImport + activeSettingsName, + Title = CodeMaid.Properties.Resources.CodeMaidImport + activeSettingsName, DefaultExt = ".config", - Filter = StringResourceKey.ConfigFilesConfigConfigAllFiles, + Filter = CodeMaid.Properties.Resources.ConfigFilesConfigConfigAllFiles, CheckFileExists = true }; @@ -493,7 +493,7 @@ private bool CheckToSavePendingChangesShouldCancelOperation() /// The active or inactive settings name. private string GetSettingsName(bool inactive) { - return IsActiveSolutionSpecificSettings ^ inactive ? StringResourceKey.SolutionSpecificSettings : StringResourceKey.UserSettings; + return IsActiveSolutionSpecificSettings ^ inactive ? CodeMaid.Properties.Resources.SolutionSpecificSettings : CodeMaid.Properties.Resources.UserSettings; } /// diff --git a/CodeMaid/UI/Dialogs/Options/Progressing/ProgressingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Progressing/ProgressingViewModel.cs index 8d629cca..8644d506 100644 --- a/CodeMaid/UI/Dialogs/Options/Progressing/ProgressingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Progressing/ProgressingViewModel.cs @@ -32,7 +32,7 @@ public ProgressingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.ProgressingViewModel_Progressing; + public override string Header => CodeMaid.Properties.Resources.ProgressingViewModel_Progressing; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralViewModel.cs b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralViewModel.cs index f404f5c8..1c6ccfe2 100644 --- a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralViewModel.cs @@ -37,7 +37,7 @@ public ReorganizingGeneralViewModel(CodeMaidPackage package, Settings activeSett /// /// Gets the header. /// - public override string Header => StringResourceKey.General; + public override string Header => CodeMaid.Properties.Resources.General; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingParentViewModel.cs b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingParentViewModel.cs index 9c035dbf..ee6411f3 100644 --- a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingParentViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingParentViewModel.cs @@ -26,7 +26,7 @@ public ReorganizingParentViewModel(CodeMaidPackage package, Settings activeSetti /// /// Gets the header. /// - public override string Header => StringResourceKey.Reorganizing; + public override string Header => CodeMaid.Properties.Resources.Reorganizing; #endregion Overrides of OptionsPageViewModel } diff --git a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingRegionsViewModel.cs b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingRegionsViewModel.cs index 24a3c21e..6a0b95fd 100644 --- a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingRegionsViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingRegionsViewModel.cs @@ -33,7 +33,7 @@ public ReorganizingRegionsViewModel(CodeMaidPackage package, Settings activeSett /// /// Gets the header. /// - public override string Header => StringResourceKey.Regions; + public override string Header => CodeMaid.Properties.Resources.Regions; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingTypesViewModel.cs b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingTypesViewModel.cs index 6e008ba3..4a505d3f 100644 --- a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingTypesViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingTypesViewModel.cs @@ -47,7 +47,7 @@ public ReorganizingTypesViewModel(CodeMaidPackage package, Settings activeSettin /// /// Gets the header. /// - public override string Header => StringResourceKey.ReorganizingTypesViewModel_Types; + public override string Header => CodeMaid.Properties.Resources.ReorganizingTypesViewModel_Types; /// /// Loads the settings. diff --git a/CodeMaid/UI/Dialogs/Options/Switching/SwitchingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Switching/SwitchingViewModel.cs index 0b7cc648..3da24148 100644 --- a/CodeMaid/UI/Dialogs/Options/Switching/SwitchingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Switching/SwitchingViewModel.cs @@ -30,7 +30,7 @@ public SwitchingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.SwitchingViewModel_Switching; + public override string Header => CodeMaid.Properties.Resources.SwitchingViewModel_Switching; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs b/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs index c3c55609..ae87c213 100644 --- a/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs @@ -42,7 +42,7 @@ public ThirdPartyViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => StringResourceKey.ThirdPartyViewModel_ThirdParty; + public override string Header => CodeMaid.Properties.Resources.ThirdPartyViewModel_ThirdParty; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/ThemeManager.cs b/CodeMaid/UI/ThemeManager.cs index 16607b86..60c5eaa3 100644 --- a/CodeMaid/UI/ThemeManager.cs +++ b/CodeMaid/UI/ThemeManager.cs @@ -194,7 +194,7 @@ private ResourceDictionary LoadResourceDictionary(Uri themeUri) catch (Exception ex) { OutputWindowHelper.ExceptionWriteLine($"Unable to load theme '{themeUri}'", ex); - _package.IDE.StatusBar.Text = string.Format(StringResourceKey.CodeMaidFailedToLoadTheme0SeeOutputWindowForMoreDetails, themeUri); + _package.IDE.StatusBar.Text = string.Format( CodeMaid.Properties.Resources.CodeMaidFailedToLoadTheme0SeeOutputWindowForMoreDetails, themeUri); return null; } diff --git a/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs b/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs index c196806e..c5e4136b 100644 --- a/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs +++ b/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs @@ -17,7 +17,7 @@ public class BuildProgressToolWindow : ToolWindowPane { #region Fields - private string DefaultCaption = StringResourceKey.BuildProgress; + private string DefaultCaption = CodeMaid.Properties.Resources.BuildProgress; private readonly BuildProgressViewModel _viewModel; @@ -216,26 +216,26 @@ private static string GetBuildTypeString(vsBuildScope buildScope, vsBuildAction // First append the word 'Batch ' if this is a batch build event. if (buildScope == vsBuildScope.vsBuildScopeBatch) { - stringBuilder.Append(StringResourceKey.Batch); + stringBuilder.Append( CodeMaid.Properties.Resources.Batch); } // Next append the action-specific build string. switch (buildAction) { case vsBuildAction.vsBuildActionBuild: - stringBuilder.Append(StringResourceKey.Building); + stringBuilder.Append( CodeMaid.Properties.Resources.Building); break; case vsBuildAction.vsBuildActionClean: - stringBuilder.Append(StringResourceKey.Cleaning); + stringBuilder.Append( CodeMaid.Properties.Resources.Cleaning); break; case vsBuildAction.vsBuildActionDeploy: - stringBuilder.Append(StringResourceKey.Deploying); + stringBuilder.Append( CodeMaid.Properties.Resources.Deploying); break; case vsBuildAction.vsBuildActionRebuildAll: - stringBuilder.Append(StringResourceKey.Rebuilding); + stringBuilder.Append( CodeMaid.Properties.Resources.Rebuilding); break; } diff --git a/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs b/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs index adef77f5..dea603a7 100644 --- a/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs +++ b/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs @@ -45,7 +45,7 @@ public SpadeToolWindow() : base(null) { // Set the tool window caption. - Caption = StringResourceKey.CodeMaidSpade; + Caption = CodeMaid.Properties.Resources.CodeMaidSpade; // Set the tool window image from resources. BitmapResourceID = 508; @@ -360,7 +360,7 @@ public override void ProvideSearchSettings(IVsUIDataSource pSearchSettings) Utilities.SetValue(pSearchSettings, SearchSettingsDataSource.PropertyNames.ControlMinWidth, 200U); Utilities.SetValue(pSearchSettings, SearchSettingsDataSource.PropertyNames.ControlMaxWidth, uint.MaxValue); - Utilities.SetValue(pSearchSettings, SearchSettingsDataSource.PropertyNames.SearchWatermark, StringResourceKey.SearchCodeMaidSpadeCtrlM); + Utilities.SetValue(pSearchSettings, SearchSettingsDataSource.PropertyNames.SearchWatermark, CodeMaid.Properties.Resources.SearchCodeMaidSpadeCtrlM); } #endregion IVsWindowSearch Members From c987670a043566e86eb49ac5cccdb00ab03b66bc Mon Sep 17 00:00:00 2001 From: heku Date: Mon, 12 Mar 2018 22:31:48 +0800 Subject: [PATCH 20/71] Fix review problems --- CodeMaid.UnitTests/CodeMaid.UnitTests.csproj | 2 +- ...onitorTests.cs => SettingsMonitorTests.cs} | 12 ++--- CodeMaid/CodeMaid.csproj | 8 +-- CodeMaid/CodeMaidPackage.cs | 10 ++-- CodeMaid/Helpers/SettingsContextHelper.cs | 4 +- .../{SettingMonitor.cs => SettingsMonitor.cs} | 18 +++---- CodeMaid/Integration/Commands/BaseCommand.cs | 2 +- .../BuildProgressToolWindowCommand.cs | 2 +- .../Commands/CleanupActiveCodeCommand.cs | 2 +- .../Commands/CleanupAllCodeCommand.cs | 2 +- .../Commands/CleanupOpenCodeCommand.cs | 2 +- .../Commands/CleanupSelectedCodeCommand.cs | 2 +- .../Commands/CloseAllReadOnlyCommand.cs | 2 +- .../CollapseAllSolutionExplorerCommand.cs | 2 +- ...CollapseSelectedSolutionExplorerCommand.cs | 2 +- .../Commands/CommentFormatCommand.cs | 2 +- .../Commands/FindInSolutionExplorerCommand.cs | 2 +- .../Integration/Commands/JoinLinesCommand.cs | 2 +- .../Commands/ReadOnlyToggleCommand.cs | 2 +- .../Commands/RemoveRegionCommand.cs | 2 +- .../Commands/ReorganizeActiveCodeCommand.cs | 2 +- .../Commands/SettingCleanupOnSaveCommand.cs | 2 +- .../Integration/Commands/SortLinesCommand.cs | 2 +- .../Commands/SpadeToolWindowCommand.cs | 2 +- .../Integration/Commands/SwitchFileCommand.cs | 2 +- .../Integration/Events/BaseEventListener.cs | 2 +- .../Events/BuildProgressEventListener.cs | 2 +- .../RunningDocumentTableEventListener.cs | 2 +- .../Integration/Events/WindowEventListener.cs | 2 +- .../{ISwitchable.cs => ISwitchableFeature.cs} | 2 +- ...emplate.xaml => FeaturesDataTemplate.xaml} | 49 ++++++++++++------- ...atureViewModel.cs => FeaturesViewModel.cs} | 6 +-- .../UI/Dialogs/Options/OptionsViewModel.cs | 2 +- .../UI/Dialogs/Options/OptionsWindow.xaml | 2 +- .../UI/ToolWindows/Spade/SpadeToolWindow.cs | 2 +- 35 files changed, 89 insertions(+), 74 deletions(-) rename CodeMaid.UnitTests/Helpers/{SettingMonitorTests.cs => SettingsMonitorTests.cs} (90%) rename CodeMaid/Helpers/{SettingMonitor.cs => SettingsMonitor.cs} (85%) rename CodeMaid/Integration/{ISwitchable.cs => ISwitchableFeature.cs} (69%) rename CodeMaid/UI/Dialogs/Options/General/{FeatureDataTemplate.xaml => FeaturesDataTemplate.xaml} (80%) rename CodeMaid/UI/Dialogs/Options/General/{FeatureViewModel.cs => FeaturesViewModel.cs} (96%) diff --git a/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj b/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj index 159fe374..c1cb558b 100644 --- a/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj +++ b/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj @@ -118,7 +118,7 @@ - + diff --git a/CodeMaid.UnitTests/Helpers/SettingMonitorTests.cs b/CodeMaid.UnitTests/Helpers/SettingsMonitorTests.cs similarity index 90% rename from CodeMaid.UnitTests/Helpers/SettingMonitorTests.cs rename to CodeMaid.UnitTests/Helpers/SettingsMonitorTests.cs index 55e8bc4b..d6209c64 100644 --- a/CodeMaid.UnitTests/Helpers/SettingMonitorTests.cs +++ b/CodeMaid.UnitTests/Helpers/SettingsMonitorTests.cs @@ -6,7 +6,7 @@ namespace SteveCadwallader.CodeMaid.UnitTests.Helpers { [TestClass] - public class SettingMonitorTests + public class SettingsMonitorTests { [TestInitialize] public void TestInitialize() @@ -17,7 +17,7 @@ public void TestInitialize() [TestMethod] public void CallbackShouldBeCalledAtOnce() { - var monitor = new SettingMonitor(Settings.Default); + var monitor = new SettingsMonitor(Settings.Default); int callbackTimes = 0; monitor.Watch(s => s.Feature_CleanupAllCode, _ => callbackTimes++); @@ -29,7 +29,7 @@ public void CallbackShouldBeCalledAtOnce() public void CallbackShouldNotBeCalledIfSettingNotChanged() { Settings.Default.Feature_CleanupAllCode = false; - var monitor = new SettingMonitor(Settings.Default); + var monitor = new SettingsMonitor(Settings.Default); bool? value = null; int callbackTimes = 0; @@ -50,7 +50,7 @@ public void CallbackShouldNotBeCalledIfSettingNotChanged() public void CallbackShouldBeCalledOnceSettingChanged() { Settings.Default.Feature_CleanupAllCode = false; - var monitor = new SettingMonitor(Settings.Default); + var monitor = new SettingsMonitor(Settings.Default); bool? value = null; int callbackTimes = 0; @@ -71,7 +71,7 @@ public void CallbackShouldBeCalledOnceSettingChanged() public void AllCallbacksShouldBeCalledOnceSettingChanged() { Settings.Default.Feature_CleanupAllCode = false; - var monitor = new SettingMonitor(Settings.Default); + var monitor = new SettingsMonitor(Settings.Default); bool? value1 = null, value2 = null; int callbackTimes1 = 0, callbackTimes2 = 0; @@ -101,7 +101,7 @@ public void CallbackShouldBeCalledOnceAnyWatchedSettingChanged() Settings.Default.Feature_CleanupAllCode = false; Settings.Default.Feature_CleanupOpenCode = false; Settings.Default.Feature_CleanupSelectedCode = true; - var monitor = new SettingMonitor(Settings.Default); + var monitor = new SettingsMonitor(Settings.Default); bool[] values = null; int callbackTimes = 0; diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index da839271..85652690 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -189,7 +189,7 @@ - + @@ -198,7 +198,7 @@ - + @@ -351,7 +351,7 @@ - + @@ -683,7 +683,7 @@ MSBuild:Compile Designer - + MSBuild:Compile Designer diff --git a/CodeMaid/CodeMaidPackage.cs b/CodeMaid/CodeMaidPackage.cs index 8075dba3..7a286c5c 100644 --- a/CodeMaid/CodeMaidPackage.cs +++ b/CodeMaid/CodeMaidPackage.cs @@ -97,7 +97,7 @@ public CodeMaidPackage() Settings.Default.Save(); } - SettingMonitor = new SettingMonitor(Settings.Default); + SettingsMonitor = new SettingsMonitor(Settings.Default); } #endregion Constructors @@ -178,7 +178,7 @@ public Document ActiveDocument /// public ThemeManager ThemeManager => _themeManager ?? (_themeManager = ThemeManager.GetInstance(this)); - public SettingMonitor SettingMonitor { get; } + public SettingsMonitor SettingsMonitor { get; } #endregion Public Integration Properties @@ -340,14 +340,14 @@ private void RegisterEventListeners() DocumentEventListener.Instance.OnDocumentClosing += codeModelManager.OnDocumentClosing; RunningDocumentTableEventListener.Intialize(this); - SettingMonitor.Watch(s => s.Feature_SettingCleanupOnSave, on => + SettingsMonitor.Watch(s => s.Feature_SettingCleanupOnSave, on => { if (on) RunningDocumentTableEventListener.Instance.BeforeSave += CleanupActiveCodeCommand.Instance.OnBeforeDocumentSave; else RunningDocumentTableEventListener.Instance.BeforeSave -= CleanupActiveCodeCommand.Instance.OnBeforeDocumentSave; }); - SettingMonitor.Watch(s => s.Feature_SpadeToolWindow, on => + SettingsMonitor.Watch(s => s.Feature_SpadeToolWindow, on => { if (on) RunningDocumentTableEventListener.Instance.AfterSave += SpadeToolWindowCommand.Instance.OnAfterDocumentSave; @@ -356,7 +356,7 @@ private void RegisterEventListeners() }); SolutionEventListener.Intialize(this); - SettingMonitor.Watch(s => s.Feature_CollapseAllSolutionExplorer, on => + SettingsMonitor.Watch(s => s.Feature_CollapseAllSolutionExplorer, on => { if (on) SolutionEventListener.Instance.OnSolutionOpened += CollapseAllSolutionExplorerCommand.Instance.OnSolutionOpened; diff --git a/CodeMaid/Helpers/SettingsContextHelper.cs b/CodeMaid/Helpers/SettingsContextHelper.cs index becc6374..d8e82306 100644 --- a/CodeMaid/Helpers/SettingsContextHelper.cs +++ b/CodeMaid/Helpers/SettingsContextHelper.cs @@ -84,7 +84,7 @@ internal void OnSolutionOpened() { if (LoadSolutionSpecificSettings(Settings.Default)) { - _package.SettingMonitor.NotifySettingsChanged(); + _package.SettingsMonitor.NotifySettingsChanged(); } } @@ -95,7 +95,7 @@ internal void OnSolutionClosed() { if (UnloadSolutionSpecificSettings(Settings.Default)) { - _package.SettingMonitor.NotifySettingsChanged(); + _package.SettingsMonitor.NotifySettingsChanged(); } } diff --git a/CodeMaid/Helpers/SettingMonitor.cs b/CodeMaid/Helpers/SettingsMonitor.cs similarity index 85% rename from CodeMaid/Helpers/SettingMonitor.cs rename to CodeMaid/Helpers/SettingsMonitor.cs index 96e32dc6..d239e761 100644 --- a/CodeMaid/Helpers/SettingMonitor.cs +++ b/CodeMaid/Helpers/SettingsMonitor.cs @@ -6,18 +6,18 @@ namespace SteveCadwallader.CodeMaid.Helpers { - public sealed class SettingMonitor where TSetting : ApplicationSettingsBase + public sealed class SettingsMonitor + where TSetting : ApplicationSettingsBase { - private readonly Dictionary _monitors = new Dictionary(new StringArrayComparor()); + private readonly Dictionary _monitors = new Dictionary(new StringArrayComparer()); + private readonly TSetting _settings; - public SettingMonitor(TSetting settings) + public SettingsMonitor(TSetting settings) { - Settings = settings; - Settings.SettingsSaving += (s, e) => NotifySettingsChanged(); + _settings = settings; + _settings.SettingsSaving += (s, e) => NotifySettingsChanged(); } - public TSetting Settings { get; } - internal void NotifySettingsChanged() { foreach (var item in _monitors) @@ -33,7 +33,7 @@ internal void NotifySettingsChanged() } } - private object[] FindValues(string[] settings) => Array.ConvertAll(settings, key => Settings[key]); + private object[] FindValues(string[] settings) => Array.ConvertAll(settings, key => _settings[key]); public void Watch(Expression> setting, Action changedCallback) { @@ -73,7 +73,7 @@ private class Monitor public Action Callback; } - private class StringArrayComparor : IEqualityComparer + private class StringArrayComparer : IEqualityComparer { private static readonly StringComparer ElementComparer = StringComparer.OrdinalIgnoreCase; diff --git a/CodeMaid/Integration/Commands/BaseCommand.cs b/CodeMaid/Integration/Commands/BaseCommand.cs index 5dd2d782..aa504049 100644 --- a/CodeMaid/Integration/Commands/BaseCommand.cs +++ b/CodeMaid/Integration/Commands/BaseCommand.cs @@ -8,7 +8,7 @@ namespace SteveCadwallader.CodeMaid.Integration.Commands /// /// The base implementation of a command. /// - internal abstract class BaseCommand : OleMenuCommand, ISwitchable + internal abstract class BaseCommand : OleMenuCommand, ISwitchableFeature { #region Constructors diff --git a/CodeMaid/Integration/Commands/BuildProgressToolWindowCommand.cs b/CodeMaid/Integration/Commands/BuildProgressToolWindowCommand.cs index 54b7d83c..afd6c099 100644 --- a/CodeMaid/Integration/Commands/BuildProgressToolWindowCommand.cs +++ b/CodeMaid/Integration/Commands/BuildProgressToolWindowCommand.cs @@ -16,7 +16,7 @@ internal sealed class BuildProgressToolWindowCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new BuildProgressToolWindowCommand(package); - package.SettingMonitor.Watch(s => s.Feature_BuildProgressToolWindow, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_BuildProgressToolWindow, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/CleanupActiveCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupActiveCodeCommand.cs index 508ae1ea..b7ec1802 100644 --- a/CodeMaid/Integration/Commands/CleanupActiveCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupActiveCodeCommand.cs @@ -17,7 +17,7 @@ internal sealed class CleanupActiveCodeCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new CleanupActiveCodeCommand(package); - package.SettingMonitor.Watch(s => s.Feature_CleanupActiveCode, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_CleanupActiveCode, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs index 389e1054..12fb0134 100644 --- a/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs @@ -20,7 +20,7 @@ internal sealed class CleanupAllCodeCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new CleanupAllCodeCommand(package); - package.SettingMonitor.Watch(s => s.Feature_CleanupAllCode, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_CleanupAllCode, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/CleanupOpenCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupOpenCodeCommand.cs index eb3a169d..cfd9653b 100644 --- a/CodeMaid/Integration/Commands/CleanupOpenCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupOpenCodeCommand.cs @@ -19,7 +19,7 @@ internal sealed class CleanupOpenCodeCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new CleanupOpenCodeCommand(package); - package.SettingMonitor.Watch(s => s.Feature_CleanupOpenCode, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_CleanupOpenCode, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/CleanupSelectedCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupSelectedCodeCommand.cs index fee70730..f0d10c7b 100644 --- a/CodeMaid/Integration/Commands/CleanupSelectedCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupSelectedCodeCommand.cs @@ -19,7 +19,7 @@ internal sealed class CleanupSelectedCodeCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new CleanupSelectedCodeCommand(package); - package.SettingMonitor.Watch(s => s.Feature_CleanupSelectedCode, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_CleanupSelectedCode, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/CloseAllReadOnlyCommand.cs b/CodeMaid/Integration/Commands/CloseAllReadOnlyCommand.cs index 614a4b89..466fa1e5 100644 --- a/CodeMaid/Integration/Commands/CloseAllReadOnlyCommand.cs +++ b/CodeMaid/Integration/Commands/CloseAllReadOnlyCommand.cs @@ -15,7 +15,7 @@ internal sealed class CloseAllReadOnlyCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new CloseAllReadOnlyCommand(package); - package.SettingMonitor.Watch(s => s.Feature_CloseAllReadOnly, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_CloseAllReadOnly, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/CollapseAllSolutionExplorerCommand.cs b/CodeMaid/Integration/Commands/CollapseAllSolutionExplorerCommand.cs index 6987b139..99bf86a6 100644 --- a/CodeMaid/Integration/Commands/CollapseAllSolutionExplorerCommand.cs +++ b/CodeMaid/Integration/Commands/CollapseAllSolutionExplorerCommand.cs @@ -16,7 +16,7 @@ internal sealed class CollapseAllSolutionExplorerCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new CollapseAllSolutionExplorerCommand(package); - package.SettingMonitor.Watch(s => s.Feature_CollapseAllSolutionExplorer, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_CollapseAllSolutionExplorer, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/CollapseSelectedSolutionExplorerCommand.cs b/CodeMaid/Integration/Commands/CollapseSelectedSolutionExplorerCommand.cs index c41e1f1e..bb541939 100644 --- a/CodeMaid/Integration/Commands/CollapseSelectedSolutionExplorerCommand.cs +++ b/CodeMaid/Integration/Commands/CollapseSelectedSolutionExplorerCommand.cs @@ -17,7 +17,7 @@ internal sealed class CollapseSelectedSolutionExplorerCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new CollapseSelectedSolutionExplorerCommand(package); - package.SettingMonitor.Watch(s => s.Feature_CollapseSelectedSolutionExplorer, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_CollapseSelectedSolutionExplorer, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/CommentFormatCommand.cs b/CodeMaid/Integration/Commands/CommentFormatCommand.cs index 1ef11336..5c8693c2 100644 --- a/CodeMaid/Integration/Commands/CommentFormatCommand.cs +++ b/CodeMaid/Integration/Commands/CommentFormatCommand.cs @@ -16,7 +16,7 @@ internal sealed class CommentFormatCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new CommentFormatCommand(package); - package.SettingMonitor.Watch(s => s.Feature_CommentFormat, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_CommentFormat, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs b/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs index 65bb39d9..e44452f3 100644 --- a/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs +++ b/CodeMaid/Integration/Commands/FindInSolutionExplorerCommand.cs @@ -20,7 +20,7 @@ internal sealed class FindInSolutionExplorerCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new FindInSolutionExplorerCommand(package); - package.SettingMonitor.Watch(s => s.Feature_FindInSolutionExplorer, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_FindInSolutionExplorer, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/JoinLinesCommand.cs b/CodeMaid/Integration/Commands/JoinLinesCommand.cs index c2e89bbb..f19f24d1 100644 --- a/CodeMaid/Integration/Commands/JoinLinesCommand.cs +++ b/CodeMaid/Integration/Commands/JoinLinesCommand.cs @@ -15,7 +15,7 @@ internal sealed class JoinLinesCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new JoinLinesCommand(package); - package.SettingMonitor.Watch(s => s.Feature_JoinLines, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_JoinLines, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs b/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs index f4c66217..e50e442b 100644 --- a/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs +++ b/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs @@ -17,7 +17,7 @@ internal sealed class ReadOnlyToggleCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new ReadOnlyToggleCommand(package); - package.SettingMonitor.Watch(s => s.Feature_ReadOnlyToggle, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_ReadOnlyToggle, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/RemoveRegionCommand.cs b/CodeMaid/Integration/Commands/RemoveRegionCommand.cs index 5cc9f3f6..07a1fc3f 100644 --- a/CodeMaid/Integration/Commands/RemoveRegionCommand.cs +++ b/CodeMaid/Integration/Commands/RemoveRegionCommand.cs @@ -17,7 +17,7 @@ internal sealed class RemoveRegionCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new RemoveRegionCommand(package); - package.SettingMonitor.Watch(s => s.Feature_RemoveRegion, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_RemoveRegion, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/ReorganizeActiveCodeCommand.cs b/CodeMaid/Integration/Commands/ReorganizeActiveCodeCommand.cs index a2e47185..a6e4ecac 100644 --- a/CodeMaid/Integration/Commands/ReorganizeActiveCodeCommand.cs +++ b/CodeMaid/Integration/Commands/ReorganizeActiveCodeCommand.cs @@ -14,7 +14,7 @@ internal sealed class ReorganizeActiveCodeCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new ReorganizeActiveCodeCommand(package); - package.SettingMonitor.Watch(s => s.Feature_ReorganizeActiveCode, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_ReorganizeActiveCode, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs index c41e9962..ff7904be 100644 --- a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs +++ b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs @@ -14,7 +14,7 @@ internal sealed class SettingCleanupOnSaveCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new SettingCleanupOnSaveCommand(package); - package.SettingMonitor.Watch(s => s.Feature_SettingCleanupOnSave, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_SettingCleanupOnSave, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/SortLinesCommand.cs b/CodeMaid/Integration/Commands/SortLinesCommand.cs index 3ed1259d..fe8e0dc5 100644 --- a/CodeMaid/Integration/Commands/SortLinesCommand.cs +++ b/CodeMaid/Integration/Commands/SortLinesCommand.cs @@ -19,7 +19,7 @@ internal sealed class SortLinesCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new SortLinesCommand(package); - package.SettingMonitor.Watch(s => s.Feature_SortLines, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_SortLines, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/SpadeToolWindowCommand.cs b/CodeMaid/Integration/Commands/SpadeToolWindowCommand.cs index 108724d5..925eeb08 100644 --- a/CodeMaid/Integration/Commands/SpadeToolWindowCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeToolWindowCommand.cs @@ -15,7 +15,7 @@ internal sealed class SpadeToolWindowCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new SpadeToolWindowCommand(package); - package.SettingMonitor.Watch(s => s.Feature_SpadeToolWindow, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_SpadeToolWindow, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Commands/SwitchFileCommand.cs b/CodeMaid/Integration/Commands/SwitchFileCommand.cs index 9cf1f685..3951f328 100644 --- a/CodeMaid/Integration/Commands/SwitchFileCommand.cs +++ b/CodeMaid/Integration/Commands/SwitchFileCommand.cs @@ -20,7 +20,7 @@ internal sealed class SwitchFileCommand : BaseCommand public static void Initialize(CodeMaidPackage package) { Instance = new SwitchFileCommand(package); - package.SettingMonitor.Watch(s => s.Feature_SwitchFile, Instance.Switch); + package.SettingsMonitor.Watch(s => s.Feature_SwitchFile, Instance.Switch); } #endregion Singleton diff --git a/CodeMaid/Integration/Events/BaseEventListener.cs b/CodeMaid/Integration/Events/BaseEventListener.cs index 1ce0ba30..0ed3fc84 100644 --- a/CodeMaid/Integration/Events/BaseEventListener.cs +++ b/CodeMaid/Integration/Events/BaseEventListener.cs @@ -5,7 +5,7 @@ namespace SteveCadwallader.CodeMaid.Integration.Events /// /// The base implementation of an event listener. /// - internal abstract class BaseEventListener : ISwitchable, IDisposable + internal abstract class BaseEventListener : ISwitchableFeature, IDisposable { #region Constructors diff --git a/CodeMaid/Integration/Events/BuildProgressEventListener.cs b/CodeMaid/Integration/Events/BuildProgressEventListener.cs index 80316a08..54040587 100644 --- a/CodeMaid/Integration/Events/BuildProgressEventListener.cs +++ b/CodeMaid/Integration/Events/BuildProgressEventListener.cs @@ -28,7 +28,7 @@ internal BuildProgressEventListener(CodeMaidPackage package) { // Store access to the build events, otherwise events will not register properly via DTE. BuildEvents = Package.IDE.Events.BuildEvents; - package.SettingMonitor.Watch(s => s.Feature_BuildProgressToolWindow, Switch); + package.SettingsMonitor.Watch(s => s.Feature_BuildProgressToolWindow, Switch); } #endregion Constructors diff --git a/CodeMaid/Integration/Events/RunningDocumentTableEventListener.cs b/CodeMaid/Integration/Events/RunningDocumentTableEventListener.cs index 6125695c..e7687b2e 100644 --- a/CodeMaid/Integration/Events/RunningDocumentTableEventListener.cs +++ b/CodeMaid/Integration/Events/RunningDocumentTableEventListener.cs @@ -35,7 +35,7 @@ internal RunningDocumentTableEventListener(CodeMaidPackage package) RunningDocumentTable = new RunningDocumentTable(package); // This listener services multiple features, watching if any of them switched. - package.SettingMonitor.Watch(new[] { + package.SettingsMonitor.Watch(new[] { nameof(Settings.Default.Feature_SettingCleanupOnSave), nameof(Settings.Default.Feature_SpadeToolWindow) }, values => diff --git a/CodeMaid/Integration/Events/WindowEventListener.cs b/CodeMaid/Integration/Events/WindowEventListener.cs index 75994e3a..b61fbb04 100644 --- a/CodeMaid/Integration/Events/WindowEventListener.cs +++ b/CodeMaid/Integration/Events/WindowEventListener.cs @@ -29,7 +29,7 @@ internal WindowEventListener(CodeMaidPackage package) { // Store access to the window events, otherwise events will not register properly via DTE. WindowEvents = Package.IDE.Events.WindowEvents; - package.SettingMonitor.Watch(s => s.Feature_SpadeToolWindow, Switch); + package.SettingsMonitor.Watch(s => s.Feature_SpadeToolWindow, Switch); } #endregion Constructors diff --git a/CodeMaid/Integration/ISwitchable.cs b/CodeMaid/Integration/ISwitchableFeature.cs similarity index 69% rename from CodeMaid/Integration/ISwitchable.cs rename to CodeMaid/Integration/ISwitchableFeature.cs index b6886aa6..2dd241e4 100644 --- a/CodeMaid/Integration/ISwitchable.cs +++ b/CodeMaid/Integration/ISwitchableFeature.cs @@ -1,6 +1,6 @@ namespace SteveCadwallader.CodeMaid.Integration { - internal interface ISwitchable + internal interface ISwitchableFeature { void Switch(bool on); } diff --git a/CodeMaid/UI/Dialogs/Options/General/FeatureDataTemplate.xaml b/CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml similarity index 80% rename from CodeMaid/UI/Dialogs/Options/General/FeatureDataTemplate.xaml rename to CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml index 2d26821d..bccf9d60 100644 --- a/CodeMaid/UI/Dialogs/Options/General/FeatureDataTemplate.xaml +++ b/CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml @@ -1,9 +1,9 @@  - + - + @@ -13,41 +13,56 @@ - + - - - - - + + - + - - + - - + - - + - + - + + + + + + + + + + + + + + + + + + + + + + diff --git a/CodeMaid/UI/Dialogs/Options/General/FeatureViewModel.cs b/CodeMaid/UI/Dialogs/Options/General/FeaturesViewModel.cs similarity index 96% rename from CodeMaid/UI/Dialogs/Options/General/FeatureViewModel.cs rename to CodeMaid/UI/Dialogs/Options/General/FeaturesViewModel.cs index 405b5be7..655b89f4 100644 --- a/CodeMaid/UI/Dialogs/Options/General/FeatureViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/General/FeaturesViewModel.cs @@ -3,9 +3,9 @@ namespace SteveCadwallader.CodeMaid.UI.Dialogs.Options.General { - public class FeatureViewModel : OptionsPageViewModel + public class FeaturesViewModel : OptionsPageViewModel { - public FeatureViewModel(CodeMaidPackage package, Settings activeSettings) + public FeaturesViewModel(CodeMaidPackage package, Settings activeSettings) : base(package, activeSettings) { Mappings = new SettingsToOptionsList(ActiveSettings, this) @@ -31,7 +31,7 @@ public FeatureViewModel(CodeMaidPackage package, Settings activeSettings) }; } - public override string Header => "Feature Switch"; + public override string Header => "Features Switch"; public bool BuildProgressToolWindow { diff --git a/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs b/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs index 246c098d..4838d2d4 100644 --- a/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs @@ -52,7 +52,7 @@ public OptionsViewModel(CodeMaidPackage package, Type initiallySelectedPageType { Children = new OptionsPageViewModel[] { - new FeatureViewModel(package,ActiveSettings) + new FeaturesViewModel(package, ActiveSettings) } }, new CleaningParentViewModel(package, ActiveSettings) diff --git a/CodeMaid/UI/Dialogs/Options/OptionsWindow.xaml b/CodeMaid/UI/Dialogs/Options/OptionsWindow.xaml index 6f21cc28..b614ee1d 100644 --- a/CodeMaid/UI/Dialogs/Options/OptionsWindow.xaml +++ b/CodeMaid/UI/Dialogs/Options/OptionsWindow.xaml @@ -98,7 +98,7 @@ - + diff --git a/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs b/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs index 52ea0102..551bc4c7 100644 --- a/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs +++ b/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs @@ -158,7 +158,7 @@ public override void OnToolWindowCreated() { // Get an instance of the code model manager. _codeModelManager = CodeModelManager.GetInstance(Package); - Package.SettingMonitor.Watch(s => s.Feature_SpadeToolWindow, on => + Package.SettingsMonitor.Watch(s => s.Feature_SpadeToolWindow, on => { if (on) { From 79a6d09904bebf6be307f5fac1372c06b19879a6 Mon Sep 17 00:00:00 2001 From: MysticBoy Date: Wed, 14 Mar 2018 15:56:34 +0800 Subject: [PATCH 21/71] Fix settings translation errors and omissions --- CodeMaid/Properties/Resources.Designer.cs | 90 +++++++++++++++++++ CodeMaid/Properties/Resources.en-US.resx | 33 ++++++- CodeMaid/Properties/Resources.resx | 30 +++++++ CodeMaid/Properties/Resources.zh-Hans.resx | 36 +++++++- .../Cleaning/CleaningGeneralDataTemplate.xaml | 6 +- .../Cleaning/CleaningRemoveDataTemplate.xaml | 6 +- .../Formatting/FormattingDataTemplate.xaml | 4 +- .../Options/General/GeneralDataTemplate.xaml | 8 +- .../ReorganizingGeneralDataTemplate.xaml | 6 +- 9 files changed, 198 insertions(+), 21 deletions(-) diff --git a/CodeMaid/Properties/Resources.Designer.cs b/CodeMaid/Properties/Resources.Designer.cs index 8a6579d3..5599b837 100644 --- a/CodeMaid/Properties/Resources.Designer.cs +++ b/CodeMaid/Properties/Resources.Designer.cs @@ -132,6 +132,15 @@ public static string AlignXMLLtParamGtTags { } } + /// + /// 查找类似 all 的本地化字符串。 + /// + public static string All { + get { + return ResourceManager.GetString("All", resourceCulture); + } + } + /// /// 查找类似 alphabetical 的本地化字符串。 /// @@ -177,6 +186,15 @@ public static string AreYouReadyForCodeMaidToCleanEverythingInTheSolution { } } + /// + /// 查找类似 ask 的本地化字符串。 + /// + public static string Ask { + get { + return ResourceManager.GetString("Ask", resourceCulture); + } + } + /// /// 查找类似 at bottom of file 的本地化字符串。 /// @@ -195,6 +213,15 @@ public static string AtTopOfFile { } } + /// + /// 查找类似 auto-detect 的本地化字符串。 + /// + public static string AutoDetect { + get { + return ResourceManager.GetString("AutoDetect", resourceCulture); + } + } + /// /// 查找类似 Automatic 的本地化字符串。 /// @@ -573,6 +600,15 @@ public static string ConfigFilesConfigConfigAllFiles { } } + /// + /// 查找类似 dark 的本地化字符串。 + /// + public static string Dark { + get { + return ResourceManager.GetString("Dark", resourceCulture); + } + } + /// /// 查找类似 Deploying 的本地化字符串。 /// @@ -636,6 +672,15 @@ public static string DragToReorderDragOverToGroupRightClickToSplitDoubleClickToR } } + /// + /// 查找类似 empty 的本地化字符串。 + /// + public static string Empty { + get { + return ResourceManager.GetString("Empty", resourceCulture); + } + } + /// /// 查找类似 Everything else (ex: .txt, README) 的本地化字符串。 /// @@ -924,6 +969,15 @@ public static string KeepXMLTagsTogether { } } + /// + /// 查找类似 light 的本地化字符串。 + /// + public static string Light { + get { + return ResourceManager.GetString("Light", resourceCulture); + } + } + /// /// 查找类似 Load models asynchronously 的本地化字符串。 /// @@ -978,6 +1032,24 @@ public static string NewRegion { } } + /// + /// 查找类似 no 的本地化字符串。 + /// + public static string No { + get { + return ResourceManager.GetString("No", resourceCulture); + } + } + + /// + /// 查找类似 none 的本地化字符串。 + /// + public static string None { + get { + return ResourceManager.GetString("None", resourceCulture); + } + } + /// /// 查找类似 Other cleaning commands (ex: ReSharper.ReSharper_SilentCleanupCode) 的本地化字符串。 /// @@ -1059,6 +1131,15 @@ public static string PlaceExplicitInterfaceMembersAtTheEndOfTheirGroup { } } + /// + /// 查找类似 Preview (reopen to refresh) 的本地化字符串。 + /// + public static string PreviewReopenToRefresh { + get { + return ResourceManager.GetString("PreviewReopenToRefresh", resourceCulture); + } + } + /// /// 查找类似 Primary ordering should be by 的本地化字符串。 /// @@ -1733,5 +1814,14 @@ public static string WrapCommentsAtColumn { return ResourceManager.GetString("WrapCommentsAtColumn", resourceCulture); } } + + /// + /// 查找类似 yes 的本地化字符串。 + /// + public static string Yes { + get { + return ResourceManager.GetString("Yes", resourceCulture); + } + } } } diff --git a/CodeMaid/Properties/Resources.en-US.resx b/CodeMaid/Properties/Resources.en-US.resx index 24d45970..4c2ebc1f 100644 --- a/CodeMaid/Properties/Resources.en-US.resx +++ b/CodeMaid/Properties/Resources.en-US.resx @@ -192,9 +192,6 @@ S&witch to - - Cleaning {0}... - CodeMaid: Cleanup Progress @@ -678,4 +675,34 @@ Windows taskbar + + ask + + + yes + + + no + + + auto-detect + + + dark + + + light + + + none + + + empty + + + all + + + Preview (reopen to refresh) + \ No newline at end of file diff --git a/CodeMaid/Properties/Resources.resx b/CodeMaid/Properties/Resources.resx index 465e1560..3d5f7064 100644 --- a/CodeMaid/Properties/Resources.resx +++ b/CodeMaid/Properties/Resources.resx @@ -675,4 +675,34 @@ Windows taskbar + + Preview (reopen to refresh) + + + ask + + + yes + + + no + + + auto-detect + + + dark + + + light + + + none + + + empty + + + all + \ No newline at end of file diff --git a/CodeMaid/Properties/Resources.zh-Hans.resx b/CodeMaid/Properties/Resources.zh-Hans.resx index 5b61e868..cda11f9e 100644 --- a/CodeMaid/Properties/Resources.zh-Hans.resx +++ b/CodeMaid/Properties/Resources.zh-Hans.resx @@ -298,10 +298,10 @@ 将 XML 标记放在一起 - 对齐 XML &lt; 参数 &gt; 标记 + 对齐 XML <param> 标记 - 始终将 &lt; 摘要 &gt; 标签分到多行 + 始终将 <summary> 标签分到多行 始终将所有 XML 标记拆分为多行 @@ -616,7 +616,7 @@ 进度 - 格格式化 + 格式化 折叠 @@ -675,4 +675,34 @@ Windows 任务栏 + + 预览 (重新打开以刷新) + + + 询问 + + + + + + + + + 自动检测 + + + 深色 + + + 浅色 + + + + + + + + + 全部 + \ No newline at end of file diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralDataTemplate.xaml b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralDataTemplate.xaml index 6da06eda..6424e23c 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralDataTemplate.xaml +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralDataTemplate.xaml @@ -15,9 +15,9 @@ - - - + + + diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveDataTemplate.xaml b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveDataTemplate.xaml index 7f8281dc..4fce8e09 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveDataTemplate.xaml +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveDataTemplate.xaml @@ -32,9 +32,9 @@ - - - + + + diff --git a/CodeMaid/UI/Dialogs/Options/Formatting/FormattingDataTemplate.xaml b/CodeMaid/UI/Dialogs/Options/Formatting/FormattingDataTemplate.xaml index 95efc96b..8890aeef 100644 --- a/CodeMaid/UI/Dialogs/Options/Formatting/FormattingDataTemplate.xaml +++ b/CodeMaid/UI/Dialogs/Options/Formatting/FormattingDataTemplate.xaml @@ -27,11 +27,11 @@ - + - + - - - + + + - diff --git a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralDataTemplate.xaml b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralDataTemplate.xaml index bd501664..8ff85f1b 100644 --- a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralDataTemplate.xaml +++ b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralDataTemplate.xaml @@ -31,9 +31,9 @@ - - - + + + From b5cfccb35fafb7ddd02cb4129f813c2c5beaca95 Mon Sep 17 00:00:00 2001 From: MysticBoy Date: Sun, 25 Mar 2018 03:56:12 +0800 Subject: [PATCH 22/71] update for PR #525 --- CodeMaid/CodeMaid.en-US.vsct | 48 ++--- CodeMaid/CodeMaid.zh-Hans.vsct | 46 ++--- CodeMaid/Properties/Resources.Designer.cs | 180 ++++++++++++++++++ CodeMaid/Properties/Resources.en-US.resx | 64 ++++++- CodeMaid/Properties/Resources.resx | 60 ++++++ CodeMaid/Properties/Resources.zh-Hans.resx | 60 ++++++ .../Options/General/FeaturesDataTemplate.xaml | 55 +++--- .../Options/General/FeaturesViewModel.cs | 2 +- 8 files changed, 440 insertions(+), 75 deletions(-) diff --git a/CodeMaid/CodeMaid.en-US.vsct b/CodeMaid/CodeMaid.en-US.vsct index 1720b42b..da800de6 100644 --- a/CodeMaid/CodeMaid.en-US.vsct +++ b/CodeMaid/CodeMaid.en-US.vsct @@ -295,6 +295,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/CodeMaid/CodeMaid.vsct b/CodeMaid/CodeMaid.vsct index da800de6..4d6a1f10 100644 --- a/CodeMaid/CodeMaid.vsct +++ b/CodeMaid/CodeMaid.vsct @@ -34,90 +34,6 @@ group; your package should define its own command set in order to avoid collisions with command ids defined by other packages. --> - - - - - - &CodeMaid - &CodeMaid - - - - DefaultDocked - - CodeMaid Spade Toolbar - CodeMaid Spade Toolbar - - - - - CodeMaid Spade Context Menu - CodeMaid Spade Context Menu - - - - - - CodeMaid - - - - - - CodeMaid - - - - - - CodeMaid - - - - - - CodeMaid - - - - - - CodeMaid - - - - - - CodeMaid - - - - - - CodeMaid - - - - - - CodeMaid - - - - - - CodeMaid - - - - - - CodeMaid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -118,163 +119,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -536,646 +380,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/CodeMaid/Properties/Resources.Designer.cs b/CodeMaid/Properties/Resources.Designer.cs index bb3d8176..28e38629 100644 --- a/CodeMaid/Properties/Resources.Designer.cs +++ b/CodeMaid/Properties/Resources.Designer.cs @@ -1761,6 +1761,15 @@ public static string SWitchFile { } } + /// + /// 查找类似 Switch File 的本地化字符串。 + /// + public static string SwitchFile_no_alt { + get { + return ResourceManager.GetString("SwitchFile_no_alt", resourceCulture); + } + } + /// /// 查找类似 Switching 的本地化字符串。 /// diff --git a/CodeMaid/Properties/Resources.en-US.resx b/CodeMaid/Properties/Resources.en-US.resx index 09bdd71d..6b9d85c7 100644 --- a/CodeMaid/Properties/Resources.en-US.resx +++ b/CodeMaid/Properties/Resources.en-US.resx @@ -771,4 +771,7 @@ Cleaning + + Switch File + \ No newline at end of file diff --git a/CodeMaid/Properties/Resources.resx b/CodeMaid/Properties/Resources.resx index 09bdd71d..6b9d85c7 100644 --- a/CodeMaid/Properties/Resources.resx +++ b/CodeMaid/Properties/Resources.resx @@ -771,4 +771,7 @@ Cleaning + + Switch File + \ No newline at end of file diff --git a/CodeMaid/Properties/Resources.zh-Hans.resx b/CodeMaid/Properties/Resources.zh-Hans.resx index 3c733ca9..04128057 100644 --- a/CodeMaid/Properties/Resources.zh-Hans.resx +++ b/CodeMaid/Properties/Resources.zh-Hans.resx @@ -771,4 +771,7 @@ 清理 + + 切换文件 + \ No newline at end of file diff --git a/CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml b/CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml index 212e07f7..38bc564a 100644 --- a/CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml +++ b/CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml @@ -56,7 +56,7 @@ - + From 5f6f39f0c222ec7a37d1d6dee085d670ba1c7db2 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 7 Apr 2018 11:14:16 +0000 Subject: [PATCH 25/71] Fix for the Framework requirement not being set to v4.6 --- CodeMaid/source.extension.vsixmanifest | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/CodeMaid/source.extension.vsixmanifest b/CodeMaid/source.extension.vsixmanifest index a3ef1d74..e3aa052d 100644 --- a/CodeMaid/source.extension.vsixmanifest +++ b/CodeMaid/source.extension.vsixmanifest @@ -1,30 +1,30 @@  - - - CodeMaid - CodeMaid is an open source Visual Studio extension to cleanup and simplify our C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding. - http://www.codemaid.net/ - LICENSE.txt - CodeMaid.png - CodeMaid_Large.png - build, code, c#, beautify, cleanup, cleaning, digging, reorganizing, formatting - + + + CodeMaid + CodeMaid is an open source Visual Studio extension to cleanup and simplify our C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding. + http://www.codemaid.net/ + LICENSE.txt + CodeMaid.png + CodeMaid_Large.png + build, code, c#, beautify, cleanup, cleaning, digging, reorganizing, formatting + - - - - + + + + - - - - + + + + - - - - - - + + + + + + \ No newline at end of file From 78f5fe53ba75ab24b7ab983c9c91425783cfaf54 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 7 Apr 2018 11:39:07 +0000 Subject: [PATCH 26/71] Update CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b04acd44..58534495 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,14 @@ These changes have not been released to the Visual Studio marketplace, but (if checked) are available in preview within the [CI build](http://vsixgallery.com/extension/4c82e17d-927e-42d2-8460-b473ac7df316/). - [x] Features + - [x] [#477](https://github.com/codecadwallader/codemaid/pull/477) - Digging: New radial progress bar - thanks [Jammer77](https://github.com/Jammer77)! + - [ ] [#506](https://github.com/codecadwallader/codemaid/pull/506) - Enable localization for Chinese - thanks [maikebing](https://github.com/maikebing)! + - [x] [#519](https://github.com/codecadwallader/codemaid/pull/519) - Simplify the code by removing unnecessary guids - thanks [heku](https://github.com/heku)! + - [x] [#525](https://github.com/codecadwallader/codemaid/pull/525) - Make all features switchable - thanks [heku](https://github.com/heku)! - [x] Fixes + - [x] [#479](https://github.com/codecadwallader/codemaid/pull/479) - Update XAML Styler integration mappings - thanks [grochocki](https://github.com/grochocki)! + - [x] [#496](https://github.com/codecadwallader/codemaid/pull/496) - Fix the .NET Framework minimum required version (which is v4.6) ## Previous Releases From 78071b066930a9d72ea73e3aa2bd1b87e2a1a404 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 7 Apr 2018 11:39:49 +0000 Subject: [PATCH 27/71] Update copyright year. --- GlobalAssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GlobalAssemblyInfo.cs b/GlobalAssemblyInfo.cs index 03e11ff8..1473f42d 100644 --- a/GlobalAssemblyInfo.cs +++ b/GlobalAssemblyInfo.cs @@ -5,7 +5,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyCompany(Vsix.Author)] -[assembly: AssemblyCopyright("Copyright 2007-2017 Steve Cadwallader (LGPL v3)")] +[assembly: AssemblyCopyright("Copyright 2007-2018 Steve Cadwallader (LGPL v3)")] [assembly: AssemblyDescription(Vsix.Description)] [assembly: AssemblyFileVersion(Vsix.Version)] [assembly: AssemblyProduct(Vsix.Name)] From 4910d14900a941fc30590ab9d2f47f6d7efb870d Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 7 Apr 2018 12:53:30 +0000 Subject: [PATCH 28/71] Regroup the features to match up with the main menu. --- .../Options/General/FeaturesDataTemplate.xaml | 54 ++++++------------- .../Options/General/FeaturesViewModel.cs | 2 +- 2 files changed, 16 insertions(+), 40 deletions(-) diff --git a/CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml b/CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml index bccf9d60..d695131b 100644 --- a/CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml +++ b/CodeMaid/UI/Dialogs/Options/General/FeaturesDataTemplate.xaml @@ -5,64 +5,40 @@ - - - + + - + - - + + - - - - - - - - - - - - - + - - - - - - - - - - - - - + + - - - - - - - + + + + + + + diff --git a/CodeMaid/UI/Dialogs/Options/General/FeaturesViewModel.cs b/CodeMaid/UI/Dialogs/Options/General/FeaturesViewModel.cs index 655b89f4..9a07cbf2 100644 --- a/CodeMaid/UI/Dialogs/Options/General/FeaturesViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/General/FeaturesViewModel.cs @@ -31,7 +31,7 @@ public FeaturesViewModel(CodeMaidPackage package, Settings activeSettings) }; } - public override string Header => "Features Switch"; + public override string Header => "Features"; public bool BuildProgressToolWindow { From f3cc855c87f85d93005511facb683606af846275 Mon Sep 17 00:00:00 2001 From: heku Date: Sat, 7 Apr 2018 21:52:21 +0800 Subject: [PATCH 29/71] Remove redundant elements --- CodeMaid/CodeMaid.en-US.vsct | 21 --------------------- CodeMaid/CodeMaid.zh-Hans.vsct | 21 --------------------- 2 files changed, 42 deletions(-) diff --git a/CodeMaid/CodeMaid.en-US.vsct b/CodeMaid/CodeMaid.en-US.vsct index 897ac7c3..c820c384 100644 --- a/CodeMaid/CodeMaid.en-US.vsct +++ b/CodeMaid/CodeMaid.en-US.vsct @@ -1,27 +1,6 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - CodeMaid - - - CodeMaid is an open source Visual Studio extension to cleanup and simplify our C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding. - - - - source.extension.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file diff --git a/GlobalAssemblyInfo.cs b/GlobalAssemblyInfo.cs index 1473f42d..620c1a05 100644 --- a/GlobalAssemblyInfo.cs +++ b/GlobalAssemblyInfo.cs @@ -12,4 +12,4 @@ [assembly: AssemblyVersion(Vsix.Version)] [assembly: CLSCompliant(false)] [assembly: ComVisible(false)] -[assembly: NeutralResourcesLanguage("en-US")] \ No newline at end of file +[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] \ No newline at end of file From 2d0af7f9806df0993bd4ba44d151cae449b9220b Mon Sep 17 00:00:00 2001 From: heku Date: Thu, 12 Apr 2018 21:37:29 +0800 Subject: [PATCH 51/71] Project file cleanup --- .../CodeMaid.IntegrationTests.csproj | 1 - CodeMaid.UnitTests/CodeMaid.UnitTests.csproj | 1 - CodeMaid/CodeMaid.csproj | 41 +------------------ 3 files changed, 2 insertions(+), 41 deletions(-) diff --git a/CodeMaid.IntegrationTests/CodeMaid.IntegrationTests.csproj b/CodeMaid.IntegrationTests/CodeMaid.IntegrationTests.csproj index 04c78834..6e927fe3 100644 --- a/CodeMaid.IntegrationTests/CodeMaid.IntegrationTests.csproj +++ b/CodeMaid.IntegrationTests/CodeMaid.IntegrationTests.csproj @@ -16,7 +16,6 @@ $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest - true diff --git a/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj b/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj index c1cb558b..8d90bc24 100644 --- a/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj +++ b/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj @@ -16,7 +16,6 @@ $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest - true diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 85652690..1f8cd0ee 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -1,9 +1,10 @@  - + Debug AnyCPU + true 2.0 {19B1AB9E-4603-4A9C-9284-32AAE57FB7BC} {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} @@ -15,27 +16,6 @@ ..\CodeMaid.snk v4.6.1 15.0 - 12.0 - - - - - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - true @@ -46,7 +26,6 @@ prompt 4 false - True pdbonly @@ -57,7 +36,6 @@ 4 false false - False @@ -784,18 +762,6 @@ Designer - - - False - Microsoft .NET Framework 4.5 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 - false - - True @@ -805,9 +771,6 @@ VSPackage - - true - 10.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) From ca59fc8691ced844d09395f2efb0e61e13ef6870 Mon Sep 17 00:00:00 2001 From: heku Date: Thu, 12 Apr 2018 21:49:05 +0800 Subject: [PATCH 52/71] Move start program settings into .csproj and move .user --- CodeMaid/CodeMaid.csproj | 3 +++ CodeMaid/CodeMaid.csproj.user | 24 ------------------------ 2 files changed, 3 insertions(+), 24 deletions(-) delete mode 100644 CodeMaid/CodeMaid.csproj.user diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 1f8cd0ee..5ca71960 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -16,6 +16,9 @@ ..\CodeMaid.snk v4.6.1 15.0 + Program + $(DevEnvDir)devenv.exe + /rootsuffix Exp true diff --git a/CodeMaid/CodeMaid.csproj.user b/CodeMaid/CodeMaid.csproj.user deleted file mode 100644 index f8b1055c..00000000 --- a/CodeMaid/CodeMaid.csproj.user +++ /dev/null @@ -1,24 +0,0 @@ - - - - Program - C:\Program Files %28x86%29\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.exe - /rootsuffix Exp - - - - - - - - - en-US - false - ProjectFiles - - - Program - C:\Program Files %28x86%29\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe - /rootsuffix Exp - - \ No newline at end of file From 2d3f40154421b99c388357a2e4b004675c8d6b37 Mon Sep 17 00:00:00 2001 From: MysticBoy Date: Fri, 13 Apr 2018 12:01:18 +0800 Subject: [PATCH 53/71] Translate the message --- CodeMaid/Helpers/OutputWindowHelper.cs | 6 +- CodeMaid/Helpers/UndoTransactionHelper.cs | 4 +- .../Integration/Commands/JoinLinesCommand.cs | 2 +- .../Integration/Commands/SortLinesCommand.cs | 2 +- .../Commands/SpadeContextDeleteCommand.cs | 2 +- .../SpadeContextInsertRegionCommand.cs | 4 +- CodeMaid/Logic/Cleaning/CodeCleanupManager.cs | 6 +- CodeMaid/Logic/Cleaning/RemoveRegionLogic.cs | 8 +- .../CodeReorganizationAvailabilityLogic.cs | 6 +- .../Reorganizing/CodeReorganizationManager.cs | 12 +- CodeMaid/Properties/Resources.Designer.cs | 334 ++++++++++++++++++ CodeMaid/Properties/Resources.en-US.resx | 111 ++++++ CodeMaid/Properties/Resources.resx | 111 ++++++ CodeMaid/Properties/Resources.zh-Hans.resx | 111 ++++++ .../UI/Dialogs/Options/OptionsViewModel.cs | 50 +-- 15 files changed, 717 insertions(+), 52 deletions(-) diff --git a/CodeMaid/Helpers/OutputWindowHelper.cs b/CodeMaid/Helpers/OutputWindowHelper.cs index d4c8668d..0505183a 100644 --- a/CodeMaid/Helpers/OutputWindowHelper.cs +++ b/CodeMaid/Helpers/OutputWindowHelper.cs @@ -39,7 +39,7 @@ internal static void DiagnosticWriteLine(string message, Exception ex = null) message += $": {ex}"; } - WriteLine("Diagnostic", message); + WriteLine(Resources.Diagnostic, message); } /// @@ -51,7 +51,7 @@ internal static void ExceptionWriteLine(string message, Exception ex) { var exceptionMessage = $"{message}: {ex}"; - WriteLine("Handled Exception", exceptionMessage); + WriteLine(Resources.HandledException, exceptionMessage); } /// @@ -60,7 +60,7 @@ internal static void ExceptionWriteLine(string message, Exception ex) /// The message. internal static void WarningWriteLine(string message) { - WriteLine("Warning", message); + WriteLine(Resources.Warning, message); } /// diff --git a/CodeMaid/Helpers/UndoTransactionHelper.cs b/CodeMaid/Helpers/UndoTransactionHelper.cs index 1ed64fdf..53f44927 100644 --- a/CodeMaid/Helpers/UndoTransactionHelper.cs +++ b/CodeMaid/Helpers/UndoTransactionHelper.cs @@ -56,9 +56,9 @@ public void Run(Action tryAction, Action catchAction = null) } catch (Exception ex) { - var message = $"{_transactionName} was stopped"; + var message = $"{_transactionName}{Resources.WasStopped}"; OutputWindowHelper.ExceptionWriteLine(message, ex); - _package.IDE.StatusBar.Text = $"{message}. See output window for more details."; + _package.IDE.StatusBar.Text = $"{message}{Resources.SeeOutputWindowForMoreDetails}"; catchAction?.Invoke(ex); diff --git a/CodeMaid/Integration/Commands/JoinLinesCommand.cs b/CodeMaid/Integration/Commands/JoinLinesCommand.cs index f19f24d1..69084b54 100644 --- a/CodeMaid/Integration/Commands/JoinLinesCommand.cs +++ b/CodeMaid/Integration/Commands/JoinLinesCommand.cs @@ -35,7 +35,7 @@ public static void Initialize(CodeMaidPackage package) internal JoinLinesCommand(CodeMaidPackage package) : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidJoinLines) { - _undoTransactionHelper = new UndoTransactionHelper(package, "CodeMaid Join"); + _undoTransactionHelper = new UndoTransactionHelper(package, CodeMaid.Properties.Resources.CodeMaidJoin); } #endregion Constructors diff --git a/CodeMaid/Integration/Commands/SortLinesCommand.cs b/CodeMaid/Integration/Commands/SortLinesCommand.cs index fe8e0dc5..b9156b04 100644 --- a/CodeMaid/Integration/Commands/SortLinesCommand.cs +++ b/CodeMaid/Integration/Commands/SortLinesCommand.cs @@ -39,7 +39,7 @@ public static void Initialize(CodeMaidPackage package) internal SortLinesCommand(CodeMaidPackage package) : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSortLines) { - _undoTransactionHelper = new UndoTransactionHelper(package, "CodeMaid Sort"); + _undoTransactionHelper = new UndoTransactionHelper(package, CodeMaid.Properties.Resources.CodeMaidSort); } #endregion Constructors diff --git a/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs b/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs index 6e869f7e..4fce4883 100644 --- a/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs @@ -38,7 +38,7 @@ public static void Initialize(CodeMaidPackage package) internal SpadeContextDeleteCommand(CodeMaidPackage package) : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextDelete) { - _undoTransactionHelper = new UndoTransactionHelper(package, "CodeMaid Delete Items"); + _undoTransactionHelper = new UndoTransactionHelper(package, CodeMaid.Properties.Resources.CodeMaidDeleteItems); } #endregion Constructors diff --git a/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs b/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs index e5ba2faf..3fd6dfb3 100644 --- a/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs @@ -40,7 +40,7 @@ internal SpadeContextInsertRegionCommand(CodeMaidPackage package) : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextInsertRegion) { _generateRegionLogic = GenerateRegionLogic.GetInstance(package); - _undoTransactionHelper = new UndoTransactionHelper(package, "CodeMaid Insert Region"); + _undoTransactionHelper = new UndoTransactionHelper(package, Resources.CodeMaidInsertRegion); } #endregion Constructors @@ -75,7 +75,7 @@ protected override void OnExecute() var spade = Package.Spade; if (spade != null) { - var region = new CodeItemRegion { Name = CodeMaid.Properties.Resources.NewRegion }; + var region = new CodeItemRegion { Name = CodeMaid.Properties.Resources.NewRegion }; var startPoint = spade.SelectedItems.OrderBy(x => x.StartOffset).First().StartPoint; var endPoint = spade.SelectedItems.OrderBy(x => x.EndOffset).Last().EndPoint; diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs index b44cfa52..7703f1a6 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupManager.cs @@ -157,19 +157,19 @@ internal void Cleanup(Document document) _codeReorganizationManager.Reorganize(document); } - new UndoTransactionHelper(_package, $"CodeMaid Cleanup for '{document.Name}'").Run( + new UndoTransactionHelper(_package, string.Format(Resources.CodeMaidCleanupFor0, document.Name)).Run( delegate { var cleanupMethod = FindCodeCleanupMethod(document); if (cleanupMethod != null) { OutputWindowHelper.DiagnosticWriteLine($"CodeCleanupManager.Cleanup started for '{document.FullName}'"); - _package.IDE.StatusBar.Text = $"CodeMaid is cleaning '{document.Name}'..."; + _package.IDE.StatusBar.Text = string.Format(Resources.CodeMaidIsCleaning0, document.Name); // Perform the set of configured cleanups based on the language. cleanupMethod(document); - _package.IDE.StatusBar.Text = $"CodeMaid cleaned '{document.Name}'."; + _package.IDE.StatusBar.Text = string.Format(Resources.CodeMaidCleaned0, document.Name); OutputWindowHelper.DiagnosticWriteLine($"CodeCleanupManager.Cleanup completed for '{document.FullName}'"); } }); diff --git a/CodeMaid/Logic/Cleaning/RemoveRegionLogic.cs b/CodeMaid/Logic/Cleaning/RemoveRegionLogic.cs index 5c764d83..8bc094f7 100644 --- a/CodeMaid/Logic/Cleaning/RemoveRegionLogic.cs +++ b/CodeMaid/Logic/Cleaning/RemoveRegionLogic.cs @@ -75,7 +75,7 @@ internal void RemoveRegions(TextDocument textDocument) // Retrieve the regions and put them in reverse order (reduces line number updates during removal). var regions = _codeModelHelper.RetrieveCodeRegions(textDocument).OrderByDescending(x => x.StartLine); - new UndoTransactionHelper(_package, "CodeMaid Remove All Regions").Run(() => + new UndoTransactionHelper(_package, Resources.CodeMaidRemoveAllRegions).Run(() => { foreach (var region in regions) { @@ -93,7 +93,7 @@ internal void RemoveRegions(TextSelection textSelection) // Retrieve the regions and put them in reverse order (reduces line number updates during removal). var regions = _codeModelHelper.RetrieveCodeRegions(textSelection).OrderByDescending(x => x.StartLine); - new UndoTransactionHelper(_package, "CodeMaid Remove Selected Regions").Run(() => + new UndoTransactionHelper(_package, Resources.CodeMaidRemoveSelectedRegions).Run(() => { foreach (var region in regions) { @@ -108,7 +108,7 @@ internal void RemoveRegions(TextSelection textSelection) /// The regions to update. internal void RemoveRegions(IEnumerable regions) { - new UndoTransactionHelper(_package, "CodeMaid Remove Regions").Run(() => + new UndoTransactionHelper(_package, Resources.CodeMaidRemoveRegions).Run(() => { // Iterate through regions in reverse order (reduces line number updates during removal). foreach (var region in regions.OrderByDescending(x => x.StartLine)) @@ -151,7 +151,7 @@ internal void RemoveRegion(CodeItemRegion region) return; } - new UndoTransactionHelper(_package, "CodeMaid Remove Region " + region.Name).Run(() => + new UndoTransactionHelper(_package, Resources.CodeMaidRemoveRegion + region.Name).Run(() => { var end = region.EndPoint.CreateEditPoint(); end.StartOfLine(); diff --git a/CodeMaid/Logic/Reorganizing/CodeReorganizationAvailabilityLogic.cs b/CodeMaid/Logic/Reorganizing/CodeReorganizationAvailabilityLogic.cs index acd13cd2..d8cf7c1e 100644 --- a/CodeMaid/Logic/Reorganizing/CodeReorganizationAvailabilityLogic.cs +++ b/CodeMaid/Logic/Reorganizing/CodeReorganizationAvailabilityLogic.cs @@ -168,10 +168,8 @@ private static bool PromptUserAboutReorganizingPreprocessorConditionals(Document { var viewModel = new YesNoPromptViewModel { - Title = @"CodeMaid: Reorganize Preprocessor Conditionals", - Message = document.Name + " contains preprocessor conditionals (e.g. #if, #pragma) which reorganization does not currently support." + - Environment.NewLine + Environment.NewLine + - "Do you want to reorganize anyways (DANGEROUS)?", + Title = @Resources.CodeMaidReorganizePreprocessorConditionals, + Message = string.Format(Resources.ContainsPreprocessorConditionalsEGIfPragmaWhichReorganizationDoesNotCurrentlySupportRNRNDoYouWantToReorganizeAnywaysDANGEROUS, document.Name), CanRemember = true }; diff --git a/CodeMaid/Logic/Reorganizing/CodeReorganizationManager.cs b/CodeMaid/Logic/Reorganizing/CodeReorganizationManager.cs index 8a825a04..367a0c07 100644 --- a/CodeMaid/Logic/Reorganizing/CodeReorganizationManager.cs +++ b/CodeMaid/Logic/Reorganizing/CodeReorganizationManager.cs @@ -73,7 +73,7 @@ private CodeReorganizationManager(CodeMaidPackage package) /// The base item. internal void MoveItemAboveBase(BaseCodeItem itemToMove, BaseCodeItem baseItem) { - new UndoTransactionHelper(_package, "CodeMaid Move Item Above").Run( + new UndoTransactionHelper(_package, Resources.CodeMaidMoveItemAbove).Run( () => RepositionItemAboveBase(itemToMove, baseItem)); } @@ -84,7 +84,7 @@ internal void MoveItemAboveBase(BaseCodeItem itemToMove, BaseCodeItem baseItem) /// The base item. internal void MoveItemBelowBase(BaseCodeItem itemToMove, BaseCodeItem baseItem) { - new UndoTransactionHelper(_package, "CodeMaid Move Item Below").Run( + new UndoTransactionHelper(_package, Resources.CodeMaidMoveItemBelow).Run( () => RepositionItemBelowBase(itemToMove, baseItem)); } @@ -95,7 +95,7 @@ internal void MoveItemBelowBase(BaseCodeItem itemToMove, BaseCodeItem baseItem) /// The base item. internal void MoveItemIntoBase(BaseCodeItem itemToMove, ICodeItemParent baseItem) { - new UndoTransactionHelper(_package, "CodeMaid Move Item Into").Run( + new UndoTransactionHelper(_package, Resources.CodeMaidMoveItemInto).Run( () => RepositionItemIntoBase(itemToMove, baseItem)); } @@ -107,11 +107,11 @@ internal void Reorganize(Document document) { if (!_codeReorganizationAvailabilityLogic.CanReorganize(document, true)) return; - new UndoTransactionHelper(_package, $"CodeMaid Reorganize for '{document.Name}'").Run( + new UndoTransactionHelper(_package, string.Format(Resources.CodeMaidReorganizeFor0, document.Name)).Run( delegate { OutputWindowHelper.DiagnosticWriteLine($"CodeReorganizationManager.Reorganize started for '{document.FullName}'"); - _package.IDE.StatusBar.Text = $"CodeMaid is reorganizing '{document.Name}'..."; + _package.IDE.StatusBar.Text = string.Format(Resources.Reorganize_CodeMaidIsReorganizing0, document.Name); // Retrieve all relevant code items (excluding using statements). var rawCodeItems = _codeModelManager.RetrieveAllCodeItems(document).Where(x => !(x is CodeItemUsingStatement)); @@ -123,7 +123,7 @@ internal void Reorganize(Document document) // Recursively reorganize the code tree. RecursivelyReorganize(codeTree); - _package.IDE.StatusBar.Text = $"CodeMaid reorganized '{document.Name}'."; + _package.IDE.StatusBar.Text = string.Format(Resources.CodeMaidReorganized0, document.Name); OutputWindowHelper.DiagnosticWriteLine($"CodeReorganizationManager.Reorganize completed for '{document.FullName}'"); }); } diff --git a/CodeMaid/Properties/Resources.Designer.cs b/CodeMaid/Properties/Resources.Designer.cs index f8866029..0cc8f7bf 100644 --- a/CodeMaid/Properties/Resources.Designer.cs +++ b/CodeMaid/Properties/Resources.Designer.cs @@ -60,6 +60,15 @@ internal Resources() { } } + /// + /// Looks up a localized string similar to Unable to import . + /// + public static string _UnableToImport { + get { + return ResourceManager.GetString("_UnableToImport", resourceCulture); + } + } + /// /// Looks up a localized string similar to Access levels should be ordered by. /// @@ -186,6 +195,15 @@ public static string AreYouReadyForCodeMaidToCleanEverythingInTheSolution { } } + /// + /// Looks up a localized string similar to Are you sure you want all . + /// + public static string AreYouSureYouWantAll { + get { + return ResourceManager.GetString("AreYouSureYouWantAll", resourceCulture); + } + } + /// /// Looks up a localized string similar to ask. /// @@ -483,6 +501,15 @@ public static string CloseAllReadOnly { } } + /// + /// Looks up a localized string similar to CodeMaid cleaned '{0}'.. + /// + public static string CodeMaidCleaned0 { + get { + return ResourceManager.GetString("CodeMaidCleaned0", resourceCulture); + } + } + /// /// Looks up a localized string similar to CodeMaid: Cleanup All Code. /// @@ -501,6 +528,15 @@ public static string CodeMaidCleanupExternalFile { } } + /// + /// Looks up a localized string similar to CodeMaid Cleanup for '{0}'. + /// + public static string CodeMaidCleanupFor0 { + get { + return ResourceManager.GetString("CodeMaidCleanupFor0", resourceCulture); + } + } + /// /// Looks up a localized string similar to CodeMaid: Cleanup Progress. /// @@ -519,6 +555,33 @@ public static string CodeMaidConfirmationForCleanupAllCode { } } + /// + /// Looks up a localized string similar to CodeMaid: Confirmation for Reset . + /// + public static string CodeMaidConfirmationForReset { + get { + return ResourceManager.GetString("CodeMaidConfirmationForReset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid: Confirmation to Save Pending Changes. + /// + public static string CodeMaidConfirmationToSavePendingChanges { + get { + return ResourceManager.GetString("CodeMaidConfirmationToSavePendingChanges", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid Delete Items. + /// + public static string CodeMaidDeleteItems { + get { + return ResourceManager.GetString("CodeMaidDeleteItems", resourceCulture); + } + } + /// /// Looks up a localized string similar to CodeMaid did not find a non-code comment {0} to reformat.. /// @@ -582,6 +645,24 @@ public static string CodeMaidHasSuccessfullyExported { } } + /// + /// Looks up a localized string similar to CodeMaid has successfully imported {1} from '{0}'.. + /// + public static string CodeMaidHasSuccessfullyImported1From0 { + get { + return ResourceManager.GetString("CodeMaidHasSuccessfullyImported1From0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid has successfully reset . + /// + public static string CodeMaidHasSuccessfullyReset { + get { + return ResourceManager.GetString("CodeMaidHasSuccessfullyReset", resourceCulture); + } + } + /// /// Looks up a localized string similar to CodeMaid: Import . /// @@ -591,6 +672,60 @@ public static string CodeMaidImport { } } + /// + /// Looks up a localized string similar to CodeMaid Insert Region. + /// + public static string CodeMaidInsertRegion { + get { + return ResourceManager.GetString("CodeMaidInsertRegion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid is cleaning '{0}'.... + /// + public static string CodeMaidIsCleaning0 { + get { + return ResourceManager.GetString("CodeMaidIsCleaning0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid Join. + /// + public static string CodeMaidJoin { + get { + return ResourceManager.GetString("CodeMaidJoin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid Move Item Above. + /// + public static string CodeMaidMoveItemAbove { + get { + return ResourceManager.GetString("CodeMaidMoveItemAbove", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid Move Item Below. + /// + public static string CodeMaidMoveItemBelow { + get { + return ResourceManager.GetString("CodeMaidMoveItemBelow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid Move Item Into. + /// + public static string CodeMaidMoveItemInto { + get { + return ResourceManager.GetString("CodeMaidMoveItemInto", resourceCulture); + } + } + /// /// Looks up a localized string similar to CodeMaid Options. /// @@ -600,6 +735,87 @@ public static string CodeMaidOptions { } } + /// + /// Looks up a localized string similar to CodeMaid Remove All Regions. + /// + public static string CodeMaidRemoveAllRegions { + get { + return ResourceManager.GetString("CodeMaidRemoveAllRegions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid Remove Region . + /// + public static string CodeMaidRemoveRegion { + get { + return ResourceManager.GetString("CodeMaidRemoveRegion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid Remove Regions. + /// + public static string CodeMaidRemoveRegions { + get { + return ResourceManager.GetString("CodeMaidRemoveRegions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid Remove Selected Regions. + /// + public static string CodeMaidRemoveSelectedRegions { + get { + return ResourceManager.GetString("CodeMaidRemoveSelectedRegions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid reorganized '{0}'.. + /// + public static string CodeMaidReorganized0 { + get { + return ResourceManager.GetString("CodeMaidReorganized0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid Reorganize for '{0}'. + /// + public static string CodeMaidReorganizeFor0 { + get { + return ResourceManager.GetString("CodeMaidReorganizeFor0", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid: Reorganize Preprocessor Conditionals. + /// + public static string CodeMaidReorganizePreprocessorConditionals { + get { + return ResourceManager.GetString("CodeMaidReorganizePreprocessorConditionals", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid: Reset . + /// + public static string CodeMaidReset { + get { + return ResourceManager.GetString("CodeMaidReset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid Sort. + /// + public static string CodeMaidSort { + get { + return ResourceManager.GetString("CodeMaidSort", resourceCulture); + } + } + /// /// Looks up a localized string similar to CodeMaid Spade. /// @@ -627,6 +843,24 @@ public static string CodeMaidWasUnableToExport { } } + /// + /// Looks up a localized string similar to CodeMaid was unable to import . + /// + public static string CodeMaidWasUnableToImport { + get { + return ResourceManager.GetString("CodeMaidWasUnableToImport", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to CodeMaid was unable to reset . + /// + public static string CodeMaidWasUnableToReset { + get { + return ResourceManager.GetString("CodeMaidWasUnableToReset", resourceCulture); + } + } + /// /// Looks up a localized string similar to Collapse All Solution Explorer. /// @@ -690,6 +924,16 @@ public static string ConfigFilesConfigConfigAllFiles { } } + /// + /// Looks up a localized string similar to {0} contains preprocessor conditionals (e.g. #if, #pragma) which reorganization does not currently support.\r\n\r\nDo you want to reorganize anyways (DANGEROUS)?. + /// + public static string ContainsPreprocessorConditionalsEGIfPragmaWhichReorganizationDoesNotCurrentlySupportRNRNDoYouWantToReorganizeAnywaysDANGEROUS { + get { + return ResourceManager.GetString("ContainsPreprocessorConditionalsEGIfPragmaWhichReorganizationDoesNotCurrentlySupp" + + "ortRNRNDoYouWantToReorganizeAnywaysDANGEROUS", resourceCulture); + } + } + /// /// Looks up a localized string similar to dark. /// @@ -708,6 +952,15 @@ public static string Deploying { } } + /// + /// Looks up a localized string similar to Diagnostic. + /// + public static string Diagnostic { + get { + return ResourceManager.GetString("Diagnostic", resourceCulture); + } + } + /// /// Looks up a localized string similar to Diagnostics. /// @@ -942,6 +1195,15 @@ public static string General { } } + /// + /// Looks up a localized string similar to Handled Exception. + /// + public static string HandledException { + get { + return ResourceManager.GetString("HandledException", resourceCulture); + } + } + /// /// Looks up a localized string similar to Hide build progress window when a build stops. /// @@ -1248,6 +1510,15 @@ public static string None { } } + /// + /// Looks up a localized string similar to to be reset to their defaults?. + /// + public static string OptionsViewModel_OnResetToDefaultsCommandExecuted_ToBeResetToTheirDefaults { + get { + return ResourceManager.GetString("OptionsViewModel_OnResetToDefaultsCommandExecuted_ToBeResetToTheirDefaults", resourceCulture); + } + } + /// /// Looks up a localized string similar to Other. /// @@ -1536,6 +1807,15 @@ public static string RemoveSelectedRegions { } } + /// + /// Looks up a localized string similar to CodeMaid is reorganizing '{0}'.... + /// + public static string Reorganize_CodeMaidIsReorganizing0 { + get { + return ResourceManager.GetString("Reorganize_CodeMaidIsReorganizing0", resourceCulture); + } + } + /// /// Looks up a localized string similar to Reorganize Active Code. /// @@ -1932,6 +2212,15 @@ public static string ThirdPartyViewModel_ThirdParty { } } + /// + /// Looks up a localized string similar to This action cannot be undone.. + /// + public static string ThisActionCannotBeUndone { + get { + return ResourceManager.GetString("ThisActionCannotBeUndone", resourceCulture); + } + } + /// /// Looks up a localized string similar to to '{0}'.. /// @@ -1968,6 +2257,24 @@ public static string TypeThenAccess { } } + /// + /// Looks up a localized string similar to Unable to export . + /// + public static string UnableToExport { + get { + return ResourceManager.GetString("UnableToExport", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to reset . + /// + public static string UnableToReset { + get { + return ResourceManager.GetString("UnableToReset", resourceCulture); + } + } + /// /// Looks up a localized string similar to Unable to toggle read only state on . /// @@ -2058,6 +2365,15 @@ public static string Visuals { } } + /// + /// Looks up a localized string similar to Warning. + /// + public static string Warning { + get { + return ResourceManager.GetString("Warning", resourceCulture); + } + } + /// /// Looks up a localized string similar to Warning threshold. /// @@ -2067,6 +2383,15 @@ public static string WarningThreshold { } } + /// + /// Looks up a localized string similar to was stopped. + /// + public static string WasStopped { + get { + return ResourceManager.GetString("WasStopped", resourceCulture); + } + } + /// /// Looks up a localized string similar to When navigating center on. /// @@ -2138,5 +2463,14 @@ public static string Yes { return ResourceManager.GetString("Yes", resourceCulture); } } + + /// + /// Looks up a localized string similar to You have pending changes. Do you want to save them before continuing?. + /// + public static string YouHavePendingChangesDoYouWantToSaveThemBeforeContinuing { + get { + return ResourceManager.GetString("YouHavePendingChangesDoYouWantToSaveThemBeforeContinuing", resourceCulture); + } + } } } diff --git a/CodeMaid/Properties/Resources.en-US.resx b/CodeMaid/Properties/Resources.en-US.resx index 5c102d40..0c5f2e34 100644 --- a/CodeMaid/Properties/Resources.en-US.resx +++ b/CodeMaid/Properties/Resources.en-US.resx @@ -810,4 +810,115 @@ refreshing... + + You have pending changes. Do you want to save them before continuing? + + + CodeMaid: Confirmation to Save Pending Changes + + + CodeMaid was unable to reset + + + CodeMaid has successfully reset + + + CodeMaid: Reset + + + Unable to reset + + + Unable to export + + + CodeMaid has successfully imported {1} from '{0}'. + + + Unable to import + + + CodeMaid was unable to import + + + CodeMaid: Confirmation for Reset + + + to be reset to their defaults? + + + Are you sure you want all + + + This action cannot be undone. + + + was stopped + + + CodeMaid is cleaning '{0}'... + + + CodeMaid Cleanup for '{0}' + + + CodeMaid cleaned '{0}'. + + + CodeMaid is reorganizing '{0}'... + + + CodeMaid reorganized '{0}'. + + + CodeMaid Insert Region + + + CodeMaid Join + + + CodeMaid Move Item Above + + + CodeMaid Move Item Below + + + CodeMaid Move Item Into + + + CodeMaid Reorganize for '{0}' + + + CodeMaid Sort + + + CodeMaid Delete Items + + + CodeMaid Remove All Regions + + + CodeMaid Remove Selected Regions + + + CodeMaid Remove Regions + + + CodeMaid Remove Region + + + CodeMaid: Reorganize Preprocessor Conditionals + + + {0} contains preprocessor conditionals (e.g. #if, #pragma) which reorganization does not currently support.\r\n\r\nDo you want to reorganize anyways (DANGEROUS)? + + + Warning + + + Handled Exception + + + Diagnostic + \ No newline at end of file diff --git a/CodeMaid/Properties/Resources.resx b/CodeMaid/Properties/Resources.resx index 5c102d40..0c5f2e34 100644 --- a/CodeMaid/Properties/Resources.resx +++ b/CodeMaid/Properties/Resources.resx @@ -810,4 +810,115 @@ refreshing... + + You have pending changes. Do you want to save them before continuing? + + + CodeMaid: Confirmation to Save Pending Changes + + + CodeMaid was unable to reset + + + CodeMaid has successfully reset + + + CodeMaid: Reset + + + Unable to reset + + + Unable to export + + + CodeMaid has successfully imported {1} from '{0}'. + + + Unable to import + + + CodeMaid was unable to import + + + CodeMaid: Confirmation for Reset + + + to be reset to their defaults? + + + Are you sure you want all + + + This action cannot be undone. + + + was stopped + + + CodeMaid is cleaning '{0}'... + + + CodeMaid Cleanup for '{0}' + + + CodeMaid cleaned '{0}'. + + + CodeMaid is reorganizing '{0}'... + + + CodeMaid reorganized '{0}'. + + + CodeMaid Insert Region + + + CodeMaid Join + + + CodeMaid Move Item Above + + + CodeMaid Move Item Below + + + CodeMaid Move Item Into + + + CodeMaid Reorganize for '{0}' + + + CodeMaid Sort + + + CodeMaid Delete Items + + + CodeMaid Remove All Regions + + + CodeMaid Remove Selected Regions + + + CodeMaid Remove Regions + + + CodeMaid Remove Region + + + CodeMaid: Reorganize Preprocessor Conditionals + + + {0} contains preprocessor conditionals (e.g. #if, #pragma) which reorganization does not currently support.\r\n\r\nDo you want to reorganize anyways (DANGEROUS)? + + + Warning + + + Handled Exception + + + Diagnostic + \ No newline at end of file diff --git a/CodeMaid/Properties/Resources.zh-Hans.resx b/CodeMaid/Properties/Resources.zh-Hans.resx index 3f9936d9..34cf576b 100644 --- a/CodeMaid/Properties/Resources.zh-Hans.resx +++ b/CodeMaid/Properties/Resources.zh-Hans.resx @@ -810,4 +810,115 @@ 正在刷新... + + 您有挂起的更改。 是否要在继续之前保存它们? + + + CodeMaid: 确认保存挂起的更改 + + + CodeMaid 无法重置 + + + CodeMaid 已成功重置 + + + CodeMaid: 重置 + + + 无法重置 + + + 无法导出 + + + CodeMaid 已成功从 "{0}" 导入 {1}。 + + + 无法导入 + + + CodeMaid 无法导入 + + + CodeMaid: 确认重置 + + + 重置为默认值? + + + 您确定要所有 + + + 无法撤消此操作。 + + + 被停止 + + + CodeMaid 正在清理 "{0}"..。 + + + 针对"{0}" 的 CodeMaid 清理 + + + CodeMaid 已清理 "{0}"。 + + + CodeMaid 正在整理{0}"... + + + CodeMaid 整理了 "{0}"。 + + + CodeMaid 插入区域 + + + CodeMaid 连接 + + + CodeMaid 条目上移 + + + CodeMaid 条目下移 + + + CodeMaid 将条目移动到 + + + CodeMaid 针对"{0}" 整理 + + + CodeMaid 排序 + + + CodeMaid 删除条目 + + + CodeMaid 删除所有 #region + + + CodeMaid 删除选定 #region + + + CodeMaid 删除 #region + + + CodeMaid 删除 #region + + + CodeMaid: 整理预处理器条件 + + + {0} 包含整理当前不支持的预处理器条件 (例如 #if、#pragma). \n 是否要整理 (危险)? + + + 警告 + + + 处理异常 + + + 诊断 + \ No newline at end of file diff --git a/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs b/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs index ec04dcae..1a9979f7 100644 --- a/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs @@ -223,10 +223,10 @@ private void OnExportCommandExecuted(object parameter) var activeSettingsName = ActiveSettingsName; var dialog = new Microsoft.Win32.SaveFileDialog { - Title = CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName, + Title = CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName, FileName = "CodeMaid", DefaultExt = ".config", - Filter = CodeMaid.Properties.Resources.ConfigFilesConfigConfigAllFiles + Filter = CodeMaid.Properties.Resources.ConfigFilesConfigConfigAllFiles }; if (dialog.ShowDialog() == true) @@ -235,14 +235,14 @@ private void OnExportCommandExecuted(object parameter) { File.Copy(ActiveSettingsPath, dialog.FileName, true); - MessageBox.Show(string.Format( CodeMaid.Properties.Resources.CodeMaidHasSuccessfullyExported + activeSettingsName + CodeMaid.Properties.Resources.To0, dialog.FileName), - CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName + CodeMaid.Properties.Resources.Successful, MessageBoxButton.OK, MessageBoxImage.Information); + MessageBox.Show(string.Format(CodeMaid.Properties.Resources.CodeMaidHasSuccessfullyExported + activeSettingsName + CodeMaid.Properties.Resources.To0, dialog.FileName), + CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName + CodeMaid.Properties.Resources.Successful, MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { - OutputWindowHelper.ExceptionWriteLine("Unable to export " + activeSettingsName, ex); - MessageBox.Show( CodeMaid.Properties.Resources.CodeMaidWasUnableToExport + activeSettingsName + CodeMaid.Properties.Resources.SeeOutputWindowForMoreDetails, - CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName + CodeMaid.Properties.Resources.Unsuccessful, MessageBoxButton.OK, MessageBoxImage.Error); + OutputWindowHelper.ExceptionWriteLine(Resources.UnableToExport + activeSettingsName, ex); + MessageBox.Show(CodeMaid.Properties.Resources.CodeMaidWasUnableToExport + activeSettingsName + CodeMaid.Properties.Resources.SeeOutputWindowForMoreDetails, + CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName + CodeMaid.Properties.Resources.Unsuccessful, MessageBoxButton.OK, MessageBoxImage.Error); } } } @@ -272,9 +272,9 @@ private void OnImportCommandExecuted(object parameter) var activeSettingsName = ActiveSettingsName; var dialog = new Microsoft.Win32.OpenFileDialog { - Title = CodeMaid.Properties.Resources.CodeMaidImport + activeSettingsName, + Title = CodeMaid.Properties.Resources.CodeMaidImport + activeSettingsName, DefaultExt = ".config", - Filter = CodeMaid.Properties.Resources.ConfigFilesConfigConfigAllFiles, + Filter = CodeMaid.Properties.Resources.ConfigFilesConfigConfigAllFiles, CheckFileExists = true }; @@ -289,14 +289,14 @@ private void OnImportCommandExecuted(object parameter) ActiveSettings.Reload(); ReloadPagesFromSettings(); - MessageBox.Show(string.Format("CodeMaid has successfully imported " + activeSettingsName + " from '{0}'.", dialog.FileName), - "CodeMaid: Import " + activeSettingsName + " Successful", MessageBoxButton.OK, MessageBoxImage.Information); + MessageBox.Show(string.Format(Resources.CodeMaidHasSuccessfullyImported1From0, dialog.FileName, activeSettingsName), + Resources.CodeMaidImport + activeSettingsName + Resources.Successful, MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { - OutputWindowHelper.ExceptionWriteLine("Unable to import " + activeSettingsName, ex); - MessageBox.Show("CodeMaid was unable to import " + activeSettingsName + ". See output window for more details.", - "CodeMaid: Import " + activeSettingsName + " Unsuccessful", MessageBoxButton.OK, MessageBoxImage.Error); + OutputWindowHelper.ExceptionWriteLine(Resources._UnableToImport + activeSettingsName, ex); + MessageBox.Show(Resources.CodeMaidWasUnableToImport + activeSettingsName + Resources.SeeOutputWindowForMoreDetails, + Resources.CodeMaidImport + activeSettingsName + Resources.Unsuccessful, MessageBoxButton.OK, MessageBoxImage.Error); } } } @@ -319,9 +319,9 @@ private void OnImportCommandExecuted(object parameter) private void OnResetToDefaultsCommandExecuted(object parameter) { var activeSettingsName = ActiveSettingsName; - var result = MessageBox.Show(@"Are you sure you want all " + activeSettingsName + " to be reset to their defaults?" + Environment.NewLine + Environment.NewLine + - @"This action cannot be undone.", - @"CodeMaid: Confirmation for Reset " + activeSettingsName, + var result = MessageBox.Show(Resources.AreYouSureYouWantAll + activeSettingsName + Resources.OptionsViewModel_OnResetToDefaultsCommandExecuted_ToBeResetToTheirDefaults + Environment.NewLine + Environment.NewLine + + Resources.ThisActionCannotBeUndone, + Resources.CodeMaidConfirmationForReset + activeSettingsName, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No); if (result == MessageBoxResult.Yes) @@ -335,14 +335,14 @@ private void OnResetToDefaultsCommandExecuted(object parameter) ActiveSettings.Reload(); ReloadPagesFromSettings(); - MessageBox.Show(string.Format("CodeMaid has successfully reset " + activeSettingsName + "."), - "CodeMaid: Reset " + activeSettingsName + " Successful", MessageBoxButton.OK, MessageBoxImage.Information); + MessageBox.Show(string.Format(Resources.CodeMaidHasSuccessfullyReset + activeSettingsName + "."), + Resources.CodeMaidReset + activeSettingsName + Resources.Successful, MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { - OutputWindowHelper.ExceptionWriteLine("Unable to reset " + ActiveSettingsName, ex); - MessageBox.Show("CodeMaid was unable to reset " + activeSettingsName + ". See output window for more details.", - "CodeMaid: Reset " + activeSettingsName + " Unsuccessful", MessageBoxButton.OK, MessageBoxImage.Error); + OutputWindowHelper.ExceptionWriteLine(Resources.UnableToReset + ActiveSettingsName, ex); + MessageBox.Show(Resources.CodeMaidWasUnableToReset + activeSettingsName + Resources.SeeOutputWindowForMoreDetails, + Resources.CodeMaidReset + activeSettingsName + Resources.Unsuccessful, MessageBoxButton.OK, MessageBoxImage.Error); } } } @@ -474,8 +474,8 @@ private bool CheckToSavePendingChangesShouldCancelOperation() { if (HasChanges) { - var result = MessageBox.Show(@"You have pending changes. Do you want to save them before continuing?", - @"CodeMaid: Confirmation to Save Pending Changes", + var result = MessageBox.Show(Resources.YouHavePendingChangesDoYouWantToSaveThemBeforeContinuing, + Resources.CodeMaidConfirmationToSavePendingChanges, MessageBoxButton.YesNoCancel, MessageBoxImage.Question, MessageBoxResult.Cancel); switch (result) @@ -499,7 +499,7 @@ private bool CheckToSavePendingChangesShouldCancelOperation() /// The active or inactive settings name. private string GetSettingsName(bool inactive) { - return IsActiveSolutionSpecificSettings ^ inactive ? CodeMaid.Properties.Resources.SolutionSpecificSettings : CodeMaid.Properties.Resources.UserSettings; + return IsActiveSolutionSpecificSettings ^ inactive ? CodeMaid.Properties.Resources.SolutionSpecificSettings : CodeMaid.Properties.Resources.UserSettings; } /// From 0e620ab3b3361a71cacbea5cb996a59ffbe7f05d Mon Sep 17 00:00:00 2001 From: heku Date: Sat, 14 Apr 2018 22:15:17 +0800 Subject: [PATCH 54/71] Correct a few typos --- CodeMaid/Properties/Resources.zh-Hans.resx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CodeMaid/Properties/Resources.zh-Hans.resx b/CodeMaid/Properties/Resources.zh-Hans.resx index 34cf576b..a2fe0ca1 100644 --- a/CodeMaid/Properties/Resources.zh-Hans.resx +++ b/CodeMaid/Properties/Resources.zh-Hans.resx @@ -856,7 +856,7 @@ 被停止 - CodeMaid 正在清理 "{0}"..。 + CodeMaid 正在清理 "{0}"... 针对"{0}" 的 CodeMaid 清理 @@ -865,7 +865,7 @@ CodeMaid 已清理 "{0}"。 - CodeMaid 正在整理{0}"... + CodeMaid 正在整理 "{0}"... CodeMaid 整理了 "{0}"。 @@ -910,7 +910,7 @@ CodeMaid: 整理预处理器条件 - {0} 包含整理当前不支持的预处理器条件 (例如 #if、#pragma). \n 是否要整理 (危险)? + {0} 包含当前整理不支持的预处理器条件 (例如 #if、#pragma)。 \n 是否仍要整理 (危险)? 警告 From ba968610cd4a56e760ca08813fdd6652df1bd6b1 Mon Sep 17 00:00:00 2001 From: heku Date: Sat, 14 Apr 2018 21:20:21 +0800 Subject: [PATCH 55/71] Revert DeployExtension settings --- CodeMaid/CodeMaid.csproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 5ca71960..6593c1eb 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -29,6 +29,7 @@ prompt 4 false + True pdbonly @@ -39,6 +40,7 @@ 4 false false + False From 18d7a74156bbe8049f781a4b6b852ad9665faa3c Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sun, 22 Apr 2018 18:14:59 +0000 Subject: [PATCH 56/71] Update the CHANGELOG with latest accepted PR. --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58534495..2ba2f2e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,10 +9,11 @@ These changes have not been released to the Visual Studio marketplace, but (if c - [ ] [#506](https://github.com/codecadwallader/codemaid/pull/506) - Enable localization for Chinese - thanks [maikebing](https://github.com/maikebing)! - [x] [#519](https://github.com/codecadwallader/codemaid/pull/519) - Simplify the code by removing unnecessary guids - thanks [heku](https://github.com/heku)! - [x] [#525](https://github.com/codecadwallader/codemaid/pull/525) - Make all features switchable - thanks [heku](https://github.com/heku)! - + - [x] Fixes - [x] [#479](https://github.com/codecadwallader/codemaid/pull/479) - Update XAML Styler integration mappings - thanks [grochocki](https://github.com/grochocki)! - [x] [#496](https://github.com/codecadwallader/codemaid/pull/496) - Fix the .NET Framework minimum required version (which is v4.6) + - [x] [#541](https://github.com/codecadwallader/codemaid/pull/541) - Project file (.csproj) cleanup - thanks [heku](https://github.com/heku)! ## Previous Releases From 029fa6ce538d13d594527c520d134b8f371f52bf Mon Sep 17 00:00:00 2001 From: MysticBoy Date: Mon, 23 Apr 2018 10:56:31 +0800 Subject: [PATCH 57/71] restore source.extension.resx --- CodeMaid/CodeMaid.csproj | 8 +- CodeMaid/source.extension.resx | 130 +++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 CodeMaid/source.extension.resx diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index c2e5ca15..7a2b60f2 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -835,13 +835,17 @@ VSPackage.en-US.resources source.extension.vsixmanifest - - VSPackage.zh-Hans.resources True True source.extension.vsixmanifest true + VSPackage + + + true + VSPackage.zh-Hans.resources + source.extension.vsixmanifest diff --git a/CodeMaid/source.extension.resx b/CodeMaid/source.extension.resx new file mode 100644 index 00000000..c0f9b16e --- /dev/null +++ b/CodeMaid/source.extension.resx @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + CodeMaid + + + CodeMaid is an open source Visual Studio extension to cleanup and simplify our C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding. + + + + source.extension.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file From 80a35f071b7e9087e2d1789873e8efe4ed1cd1da Mon Sep 17 00:00:00 2001 From: Willem Date: Thu, 26 Apr 2018 16:04:35 +0200 Subject: [PATCH 58/71] Ignore comment lines starting with certain prefixes Fixes #347, #350. Ignore (ie output literally) any comment line starting with certain prefixes while formatting. The ignored prefixes are configured in the setting file. Updated the comment regex, matching, and formatter. --- CodeMaid.UnitTests/CodeMaid.UnitTests.csproj | 1 + .../Formatting/CommentFormatHelper.cs | 6 +- .../Formatting/IgnorePrefixesTests.cs | 71 +++++++++++++++++++ CodeMaid/CodeMaid.csproj | 2 + CodeMaid/Helpers/CodeCommentHelper.cs | 21 +++++- .../Logic/Formatting/CommentFormatLogic.cs | 18 +++-- CodeMaid/Model/Comments/CodeComment.cs | 36 +++++++--- CodeMaid/Model/Comments/CommentFormatter.cs | 45 ++++++------ CodeMaid/Model/Comments/CommentMatch.cs | 31 ++++++-- CodeMaid/Model/Comments/CommentOptions.cs | 14 ++++ CodeMaid/Model/Comments/FormatterOptions.cs | 15 ++++ CodeMaid/Properties/Settings.Designer.cs | 17 ++++- CodeMaid/Properties/Settings.settings | 7 ++ CodeMaid/app.config | 9 +++ 14 files changed, 244 insertions(+), 49 deletions(-) create mode 100644 CodeMaid.UnitTests/Formatting/IgnorePrefixesTests.cs create mode 100644 CodeMaid/Model/Comments/CommentOptions.cs create mode 100644 CodeMaid/Model/Comments/FormatterOptions.cs diff --git a/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj b/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj index 8d90bc24..817b782c 100644 --- a/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj +++ b/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj @@ -112,6 +112,7 @@ + diff --git a/CodeMaid.UnitTests/Formatting/CommentFormatHelper.cs b/CodeMaid.UnitTests/Formatting/CommentFormatHelper.cs index 27dca280..38d398af 100644 --- a/CodeMaid.UnitTests/Formatting/CommentFormatHelper.cs +++ b/CodeMaid.UnitTests/Formatting/CommentFormatHelper.cs @@ -38,11 +38,7 @@ public static string Format(string text) public static string Format(string text, string prefix) { - var xml = XElement.Parse($"{text}"); - var line = new CommentLineXml(xml); - var regex = CodeCommentHelper.GetCommentRegex(CodeLanguage.CSharp, !string.IsNullOrEmpty(prefix)); - var formatter = new CommentFormatter(line, prefix, 4, regex); - return formatter.ToString(); + return CodeComment.FormatXml(text, prefix); } } } \ No newline at end of file diff --git a/CodeMaid.UnitTests/Formatting/IgnorePrefixesTests.cs b/CodeMaid.UnitTests/Formatting/IgnorePrefixesTests.cs new file mode 100644 index 00000000..79a570f3 --- /dev/null +++ b/CodeMaid.UnitTests/Formatting/IgnorePrefixesTests.cs @@ -0,0 +1,71 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using SteveCadwallader.CodeMaid.Properties; +using System; + +namespace SteveCadwallader.CodeMaid.UnitTests.Formatting +{ + /// + /// Test for the ignoring of comments lines starting with certain prefixes. + /// + [TestClass] + public class IgnorePrefixesTests + { + [TestInitialize] + public void TestInitialize() + { + Settings.Default.Reset(); + } + + [TestMethod] + [TestCategory("Formatting UnitTests")] + public void IgnorePrefixesTests_DoesNotWrapSingleLine() + { + Settings.Default.Formatting_CommentWrapColumn = 30; + CommentFormatHelper.AssertEqualAfterFormat(@"TODO: Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + [TestMethod] + [TestCategory("Formatting UnitTests")] + public void IgnorePrefixesTests_DoesNotWrapLineInsideComment() + { + var input = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + Environment.NewLine + + "TODO: Lorem ipsum dolor sit amet, consectetur adipiscing elit." + Environment.NewLine + + "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; + + // Expect all lines to be wrapped except for the one starting with "TODO". + var expected = + "Lorem ipsum dolor sit amet," + Environment.NewLine + + "consectetur adipiscing elit." + Environment.NewLine + + "TODO: Lorem ipsum dolor sit amet, consectetur adipiscing elit." + Environment.NewLine + + "Lorem ipsum dolor sit amet," + Environment.NewLine + + "consectetur adipiscing elit."; + + Settings.Default.Formatting_CommentWrapColumn = 30; + CommentFormatHelper.AssertEqualAfterFormat(input, expected); + } + + [TestMethod] + [TestCategory("Formatting UnitTests")] + public void IgnorePrefixesTests_DoesNotCombineSubsequentLines() + { + var input = + "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + Environment.NewLine + + "TODO: Lorem ipsum dolor sit amet, consectetur adipiscing elit." + Environment.NewLine + + "TODO: Lorem ipsum dolor sit amet, consectetur adipiscing elit." + Environment.NewLine + + "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; + + // Expect every "ignored" line to stay on it's own. + var expected = + "Lorem ipsum dolor sit amet," + Environment.NewLine + + "consectetur adipiscing elit." + Environment.NewLine + + "TODO: Lorem ipsum dolor sit amet, consectetur adipiscing elit." + Environment.NewLine + + "TODO: Lorem ipsum dolor sit amet, consectetur adipiscing elit." + Environment.NewLine + + "Lorem ipsum dolor sit amet," + Environment.NewLine + + "consectetur adipiscing elit."; + + Settings.Default.Formatting_CommentWrapColumn = 30; + CommentFormatHelper.AssertEqualAfterFormat(input, expected); + } + } +} \ No newline at end of file diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 6593c1eb..2a367e5d 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -189,6 +189,8 @@ + + diff --git a/CodeMaid/Helpers/CodeCommentHelper.cs b/CodeMaid/Helpers/CodeCommentHelper.cs index d65e0018..3587d434 100644 --- a/CodeMaid/Helpers/CodeCommentHelper.cs +++ b/CodeMaid/Helpers/CodeCommentHelper.cs @@ -1,7 +1,9 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Properties; using System; +using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Text.RegularExpressions; namespace SteveCadwallader.CodeMaid.Helpers @@ -140,7 +142,7 @@ internal static Regex GetCommentRegex(CodeLanguage codeLanguage, bool includePre prefix = string.Format(@"(?[\t ]*{0})(?( |\t|\r|\n|$))?", prefix); } - var pattern = string.Format(@"^{0}(?(?[\t ]*)(?[-=\*\+]+[ \t]*|\w+[\):][ \t]+|\d+\.[ \t]+)?((?[^\t\r\n ]+)*[\t ]*)*)[\r]*[\n]?$", prefix); + var pattern = string.Format(@"^{0}(?[\t ]*)(?(?[-=\*\+]+[ \t]*|\w+[\):][ \t]+|\d+\.[ \t]+)?((?[^\t\r\n ]+)*[\t ]*)*)\r*\n?$", prefix); return new Regex(pattern, RegexOptions.ExplicitCapture | RegexOptions.Multiline); } @@ -161,6 +163,23 @@ internal static int GetTabSize(CodeMaidPackage package, TextDocument document) } } + /// + /// Gets the list of tokens defined in Tools > Options > Environment > Task List. + /// + /// + /// + public static IEnumerable GetTaskListTokens(CodeMaidPackage package) + { + var settings = package.IDE.Properties["Environment", "TaskList"]; + var tokens = settings.Item("CommentTokens").Value as string[]; + if (tokens == null || tokens.Length < 1) + return Enumerable.Empty(); + + // Tokens values are written like "NAME:PRIORITY". We want only the names, and require + // that they are followed by a semicolon and a space. + return tokens.Select(t => t.Substring(0, t.LastIndexOf(':') + 1) + " "); + } + internal static bool IsCommentLine(EditPoint point) { return LineMatchesRegex(point, GetCommentRegex(point.GetCodeLanguage())).Success; diff --git a/CodeMaid/Logic/Formatting/CommentFormatLogic.cs b/CodeMaid/Logic/Formatting/CommentFormatLogic.cs index 01b84c23..fda0112a 100644 --- a/CodeMaid/Logic/Formatting/CommentFormatLogic.cs +++ b/CodeMaid/Logic/Formatting/CommentFormatLogic.cs @@ -2,6 +2,7 @@ using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Model.Comments; using SteveCadwallader.CodeMaid.Properties; +using System.Linq; namespace SteveCadwallader.CodeMaid.Logic.Formatting { @@ -57,13 +58,22 @@ public void FormatComments(TextDocument textDocument) public bool FormatComments(TextDocument textDocument, EditPoint start, EditPoint end) { bool foundComments = false; - int tabSize = CodeCommentHelper.GetTabSize(_package, textDocument); + + var options = new FormatterOptions + { + TabSize = CodeCommentHelper.GetTabSize(_package, textDocument), + IgnoreTokens = CodeCommentHelper + .GetTaskListTokens(_package) + .Concat(Settings.Default.Formatting_IgnoreLinesStartingWith.Cast()) + .ToArray() + }; while (start.Line <= end.Line) { if (CodeCommentHelper.IsCommentLine(start)) { - var comment = new CodeComment(start, tabSize); + var comment = new CodeComment(start, options); + if (comment.IsValid) { comment.Format(); @@ -89,10 +99,10 @@ public bool FormatComments(TextDocument textDocument, EditPoint start, EditPoint } /// - /// Gets an instance of the class. + /// Gets an instance of the class. /// /// The hosting package. - /// An instance of the class. + /// An instance of the class. internal static CommentFormatLogic GetInstance(CodeMaidPackage package) { return _instance ?? (_instance = new CommentFormatLogic(package)); diff --git a/CodeMaid/Model/Comments/CodeComment.cs b/CodeMaid/Model/Comments/CodeComment.cs index df84772e..f42dea94 100644 --- a/CodeMaid/Model/Comments/CodeComment.cs +++ b/CodeMaid/Model/Comments/CodeComment.cs @@ -17,7 +17,7 @@ internal class CodeComment private readonly TextDocument _document; private readonly Regex _commentLineRegex; - private readonly int _tabSize; + private readonly FormatterOptions _formatterOptions; private EditPoint _endPoint; private EditPoint _startPoint; @@ -29,7 +29,7 @@ internal class CodeComment /// /// Initializes a new instance of the class. /// - public CodeComment(TextPoint point, int tabSize) + public CodeComment(TextPoint point, FormatterOptions options) { if (point == null) { @@ -38,7 +38,7 @@ public CodeComment(TextPoint point, int tabSize) _document = point.Parent; _commentLineRegex = CodeCommentHelper.GetCommentRegex(_document.GetCodeLanguage()); - _tabSize = tabSize; + _formatterOptions = options; Expand(point); } @@ -60,12 +60,22 @@ public CodeComment(TextPoint point, int tabSize) /// /// Helper function to generate the preview in the options menu. /// - public static string FormatXml(string text) + public static string FormatXml(string text, string prefix = "///") { var xml = XElement.Parse($"{text}"); - var line = new CommentLineXml(xml); - var regex = CodeCommentHelper.GetCommentRegex(CodeLanguage.CSharp, false); - var formatter = new CommentFormatter(line, "///", 4, regex); + + var formatter = new CommentFormatter( + new CommentLineXml(xml), + new FormatterOptions + { + IgnoreTokens = new[] { "TODO: " }, + TabSize = 4 + }, + new CommentOptions + { + Prefix = prefix, + Regex = CodeCommentHelper.GetCommentRegex(CodeLanguage.CSharp, !string.IsNullOrWhiteSpace(prefix)) + }); return formatter.ToString(); } @@ -82,7 +92,12 @@ public TextPoint Format() var originalText = _startPoint.GetText(_endPoint); var matches = _commentLineRegex.Matches(originalText).OfType().ToArray(); - var commentPrefix = matches.First(m => m.Success).Groups["prefix"].Value; + + var commentOptions = new CommentOptions + { + Prefix = matches.First(m => m.Success).Groups["prefix"].Value ?? string.Empty, + Regex = CodeCommentHelper.GetCommentRegex(_document.GetCodeLanguage(), false) + }; // Concatenate the comment lines without comment prefixes and see if the resulting bit // can be parsed as XML. @@ -109,9 +124,8 @@ public TextPoint Format() var formatter = new CommentFormatter( line, - commentPrefix, - _tabSize, - CodeCommentHelper.GetCommentRegex(_document.GetCodeLanguage(), false)); + _formatterOptions, + commentOptions); if (!formatter.Equals(originalText)) { diff --git a/CodeMaid/Model/Comments/CommentFormatter.cs b/CodeMaid/Model/Comments/CommentFormatter.cs index 132b68a6..fa658a5c 100644 --- a/CodeMaid/Model/Comments/CommentFormatter.cs +++ b/CodeMaid/Model/Comments/CommentFormatter.cs @@ -1,6 +1,7 @@ using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Properties; using System; +using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; @@ -14,30 +15,30 @@ internal class CommentFormatter : IEquatable { #region Fields + private readonly FormatterOptions _formatterOptions; + private readonly CommentOptions _commentOptions; + private StringBuilder _builder; - private string _commentPrefix; private int _commentPrefixLength; private int _currentPosition; private bool _isAfterCommentPrefix; private bool _isFirstWord; private bool _isIndented; - private Regex _regex; - private int _tabSize; #endregion Fields #region Constructors - public CommentFormatter(ICommentLine line, string commentPrefix, int tabSize, Regex regex) + public CommentFormatter(ICommentLine line, FormatterOptions formatterOptions, CommentOptions commentOptions) { + _formatterOptions = formatterOptions; + _commentOptions = commentOptions; + _builder = new StringBuilder(); _currentPosition = 0; - _regex = regex; - _tabSize = tabSize; _isFirstWord = true; _isIndented = false; - _commentPrefix = commentPrefix ?? string.Empty; - _commentPrefixLength = WordLength(_commentPrefix); + _commentPrefixLength = WordLength(commentOptions.Prefix); // Special handling for the root XML line, it should not output it's surrounding xml // tags, only it's child lines. @@ -130,7 +131,7 @@ private void NewLine(bool force = false) _currentPosition = 0; } - _builder.Append(_commentPrefix); + _builder.Append(_commentOptions.Prefix); _currentPosition += _commentPrefixLength; _isFirstWord = true; _isIndented = false; @@ -160,7 +161,7 @@ private bool Parse(ICommentLine line, int indentLevel = 0, int xmlTagLength = 0) } else if (line.Content != null) { - var matches = _regex.Matches(line.Content).OfType().Select(x => new CodeCommentMatch(x)).ToList(); + var matches = _commentOptions.Regex.Matches(line.Content).OfType().Select(x => new CodeCommentMatch(x, _formatterOptions)).ToList(); // Remove empty matches from the start and end of the comment. CodeCommentMatch m; @@ -227,7 +228,7 @@ private bool Parse(ICommentLine line, int indentLevel = 0, int xmlTagLength = 0) foreach (var match in matches) { - if (match.IsList) + if (match.IsLiteral || match.IsList) { if (!_isFirstWord) { @@ -235,10 +236,14 @@ private bool Parse(ICommentLine line, int indentLevel = 0, int xmlTagLength = 0) } Indent(indentLevel); + } + + if (match.IsList) + { Append(match.ListPrefix); - // List items include their spacing and do not require additional space, - // thus we are logically still on the first word. + // List items include their spacing and do not require additional space, thus + // we are logically still on the first word. _isFirstWord = true; } @@ -274,8 +279,8 @@ private bool Parse(ICommentLine line, int indentLevel = 0, int xmlTagLength = 0) NewLine(); Indent(indentLevel); - // If linewrap is on a list item, add extra spacing to align the - // text with the previous line. + // If linewrap is on a list item, add extra spacing to align the text + // with the previous line. if (match.IsList) { Append(string.Empty.PadLeft(WordLength(match.ListPrefix), CodeCommentHelper.Spacer)); @@ -355,7 +360,7 @@ private bool ParseXml(CommentLineXml line, int indentLevel = 0) if (isCopyrightTag && Settings.Default.Formatting_CommentXmlValueIndent < 1) { _commentPrefixLength += CodeCommentHelper.CopyrightExtraIndent; - _commentPrefix += string.Empty.PadLeft(CodeCommentHelper.CopyrightExtraIndent); + _commentOptions.Prefix += string.Empty.PadLeft(CodeCommentHelper.CopyrightExtraIndent); } // Increase the indent level. @@ -392,8 +397,8 @@ private bool ParseXml(CommentLineXml line, int indentLevel = 0) { if (needBreakBefore) NewLine(); - // Parse function returns true if it had to wrap lines. If so, we need to force - // a newline before the closing tag. + // Parse function returns true if it had to wrap lines. If so, we need to force a + // newline before the closing tag. needBreakBefore = Parse(l, indentLevel, xmlTagLength); tagOnOwnLine |= needBreakBefore; } @@ -405,7 +410,7 @@ private bool ParseXml(CommentLineXml line, int indentLevel = 0) if (isCopyrightTag && Settings.Default.Formatting_CommentXmlValueIndent < 1) { _commentPrefixLength -= CodeCommentHelper.CopyrightExtraIndent; - _commentPrefix = _commentPrefix.Substring(0, _commentPrefixLength); + _commentOptions.Prefix = _commentOptions.Prefix.Substring(0, _commentPrefixLength); } // If opening tag was on own line, do the same for the closing tag. @@ -458,7 +463,7 @@ private bool TagsOnOwnLine(CommentLineXml line, int indentlevel) /// The length of the string. private int WordLength(string word) { - return word == null ? 0 : word.Length + word.Count(c => c == '\t') * (_tabSize - 1); + return word == null ? 0 : word.Length + word.Count(c => c == '\t') * (_formatterOptions.TabSize - 1); } #endregion Methods diff --git a/CodeMaid/Model/Comments/CommentMatch.cs b/CodeMaid/Model/Comments/CommentMatch.cs index 8f77fc06..b8a650e0 100644 --- a/CodeMaid/Model/Comments/CommentMatch.cs +++ b/CodeMaid/Model/Comments/CommentMatch.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; @@ -8,7 +9,7 @@ internal class CodeCommentMatch { #region Constructors - public CodeCommentMatch(Match match) + public CodeCommentMatch(Match match, FormatterOptions formatterOptions) { if (!match.Success) { @@ -16,12 +17,23 @@ public CodeCommentMatch(Match match) return; } - Indent = match.Groups["indent"].Success ? match.Groups["indent"].Value.Length : 0; - ListPrefix = match.Groups["listprefix"].Success ? match.Groups["listprefix"].Value : null; - Words = match.Groups["words"].Success ? match.Groups["words"].Captures.OfType().Select(c => c.Value).ToList() : null; + if (formatterOptions.IgnoreTokens.Any(p => match.Value.StartsWith(p))) + { + Words = new List { match.Groups["line"].Value }; + IsLiteral = true; + IsEmpty = false; + IsList = false; + } + else + { + Indent = match.Groups["indent"].Success ? match.Groups["indent"].Value.Length : 0; + ListPrefix = match.Groups["listprefix"].Success ? match.Groups["listprefix"].Value : null; + Words = match.Groups["words"].Success ? match.Groups["words"].Captures.OfType().Select(c => c.Value).ToList() : null; - IsEmpty = string.IsNullOrWhiteSpace(match.Value) || Words == null || Words.Count < 1; - IsList = !string.IsNullOrWhiteSpace(ListPrefix); + IsLiteral = false; + IsEmpty = string.IsNullOrWhiteSpace(match.Value) || Words == null || Words.Count < 1; + IsList = !string.IsNullOrWhiteSpace(ListPrefix); + } // In the case of a list prefix but no content (e.g. hyphen line) convert to regular content. if (IsEmpty && IsList) @@ -43,6 +55,8 @@ public CodeCommentMatch(Match match) public bool IsList { get; private set; } + public bool IsLiteral { get; private set; } + public int Length { get @@ -81,6 +95,9 @@ public bool TryAppend(CodeCommentMatch other) if (IsList && other.Indent < 1) return false; + if (IsLiteral || other.IsLiteral) + return false; + foreach (var word in other.Words) Words.Add(word); diff --git a/CodeMaid/Model/Comments/CommentOptions.cs b/CodeMaid/Model/Comments/CommentOptions.cs new file mode 100644 index 00000000..126b415a --- /dev/null +++ b/CodeMaid/Model/Comments/CommentOptions.cs @@ -0,0 +1,14 @@ +using System.Text.RegularExpressions; + +namespace SteveCadwallader.CodeMaid.Model.Comments +{ + /// + /// Comment specific options for the formatter. + /// + internal class CommentOptions + { + public string Prefix { get; internal set; } + + public Regex Regex { get; internal set; } + } +} \ No newline at end of file diff --git a/CodeMaid/Model/Comments/FormatterOptions.cs b/CodeMaid/Model/Comments/FormatterOptions.cs new file mode 100644 index 00000000..2ff24770 --- /dev/null +++ b/CodeMaid/Model/Comments/FormatterOptions.cs @@ -0,0 +1,15 @@ +namespace SteveCadwallader.CodeMaid.Model.Comments +{ + /// + /// Document wide options for the comment formatter. + /// + internal class FormatterOptions + { + public int TabSize { get; internal set; } + + /// + /// The list of comment prefix tokens to ignore while formatting the comment. + /// + public string[] IgnoreTokens { get; internal set; } + } +} \ No newline at end of file diff --git a/CodeMaid/Properties/Settings.Designer.cs b/CodeMaid/Properties/Settings.Designer.cs index dbda784a..050d9c48 100644 --- a/CodeMaid/Properties/Settings.Designer.cs +++ b/CodeMaid/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace SteveCadwallader.CodeMaid.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.5.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.6.0.0")] public sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -2207,5 +2207,20 @@ public bool Feature_SwitchFile { this["Feature_SwitchFile"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("\r\n\r\n ReSharper disable \r\n ReSharper enable \r\n")] + public global::System.Collections.Specialized.StringCollection Formatting_IgnoreLinesStartingWith { + get { + return ((global::System.Collections.Specialized.StringCollection)(this["Formatting_IgnoreLinesStartingWith"])); + } + set { + this["Formatting_IgnoreLinesStartingWith"] = value; + } + } } } diff --git a/CodeMaid/Properties/Settings.settings b/CodeMaid/Properties/Settings.settings index 3e737daf..5642b769 100644 --- a/CodeMaid/Properties/Settings.settings +++ b/CodeMaid/Properties/Settings.settings @@ -548,5 +548,12 @@ True + + <?xml version="1.0" encoding="utf-16"?> +<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <string>ReSharper disable </string> + <string>ReSharper enable </string> +</ArrayOfString> + \ No newline at end of file diff --git a/CodeMaid/app.config b/CodeMaid/app.config index d85f60f4..2a85fa73 100644 --- a/CodeMaid/app.config +++ b/CodeMaid/app.config @@ -601,6 +601,15 @@ True + + + + ReSharper disable + ReSharper enable + + + From 8c1cc893e0323ead28018cb8217780a2e4889be0 Mon Sep 17 00:00:00 2001 From: Willem Date: Thu, 26 Apr 2018 21:33:55 +0200 Subject: [PATCH 59/71] Do not leave trailing white space when formatting comments Fixes #360. Using the setting to add whitespace between XML tags and content would leave a trailing whitespace in cases when the containing XML tags are on their own line. --- .../Formatting/XmlFormattingTests.cs | 47 +++++++++++++++++++ CodeMaid/Model/Comments/CommentFormatter.cs | 20 ++++---- 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/CodeMaid.UnitTests/Formatting/XmlFormattingTests.cs b/CodeMaid.UnitTests/Formatting/XmlFormattingTests.cs index 440b49d5..1876d812 100644 --- a/CodeMaid.UnitTests/Formatting/XmlFormattingTests.cs +++ b/CodeMaid.UnitTests/Formatting/XmlFormattingTests.cs @@ -43,6 +43,53 @@ public void XmlFormattingTests_AddSpaceToTagContent() CommentFormatHelper.AssertEqualAfterFormat(input, expected); } + [TestMethod] + [TestCategory("Formatting UnitTests")] + public void XmlFormattingTests_AddSpaceToTagContentWithSelfClosingTag() + { + var input = ""; + var expected = " "; + + Settings.Default.Formatting_CommentXmlSplitSummaryTagToMultipleLines = false; + Settings.Default.Formatting_CommentXmlSpaceTags = true; + + CommentFormatHelper.AssertEqualAfterFormat(input, expected); + } + + [TestMethod] + [TestCategory("Formatting UnitTests")] + public void XmlFormattingTests_AddSpaceToTagContentWithSelfClosingTagMultiline() + { + var input = ""; + var expected = + "" + Environment.NewLine + + "" + Environment.NewLine + + ""; + + Settings.Default.Formatting_CommentXmlSplitSummaryTagToMultipleLines = true; + Settings.Default.Formatting_CommentXmlSpaceTags = true; + + CommentFormatHelper.AssertEqualAfterFormat(input, expected); + } + + [TestMethod] + [TestCategory("Formatting UnitTests")] + public void XmlFormattingTests_AddSpaceToTagContentShouldLeaveNoTrailingWhitespace() + { + var input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; + var expected = + "" + Environment.NewLine + + "Lorem ipsum dolor sit amet," + Environment.NewLine + + "consectetur adipiscing elit." + Environment.NewLine + + ""; + + Settings.Default.Formatting_CommentWrapColumn = 30; + Settings.Default.Formatting_CommentXmlSplitSummaryTagToMultipleLines = true; + Settings.Default.Formatting_CommentXmlSpaceTags = true; + + CommentFormatHelper.AssertEqualAfterFormat(input, expected); + } + [TestMethod] [TestCategory("Formatting UnitTests")] public void XmlFormattingTests_AllRootLevelTagsOnNewLine() diff --git a/CodeMaid/Model/Comments/CommentFormatter.cs b/CodeMaid/Model/Comments/CommentFormatter.cs index 132b68a6..512da1fb 100644 --- a/CodeMaid/Model/Comments/CommentFormatter.cs +++ b/CodeMaid/Model/Comments/CommentFormatter.cs @@ -216,10 +216,6 @@ private bool Parse(ICommentLine line, int indentLevel = 0, int xmlTagLength = 0) { NewLine(); } - else if (!_isFirstWord && Settings.Default.Formatting_CommentXmlSpaceTags) - { - Append(CodeCommentHelper.Spacer); - } // Always consider the word after the opening tag as the first word to prevent an // extra space before. @@ -305,11 +301,6 @@ private bool Parse(ICommentLine line, int indentLevel = 0, int xmlTagLength = 0) } } - if (!forceBreak && Settings.Default.Formatting_CommentXmlSpaceTags) - { - Append(CodeCommentHelper.Spacer); - } - if (_currentPosition == 0 || _currentPosition > _commentPrefixLength && forceBreak) { // This comment fitted on a single line. @@ -366,6 +357,11 @@ private bool ParseXml(CommentLineXml line, int indentLevel = 0) // If true the tag should be alone on it's own line. tagOnOwnLine |= isLiteralContent; + if (!tagOnOwnLine && Settings.Default.Formatting_CommentXmlSpaceTags) + { + Append(CodeCommentHelper.Spacer); + } + // If the literal content of an XML tag is set, output that content without formatting. if (isLiteralContent) { @@ -412,9 +408,13 @@ private bool ParseXml(CommentLineXml line, int indentLevel = 0) if (tagOnOwnLine && !_isFirstWord) { NewLine(); + Indent(indentLevel); + } + else if (Settings.Default.Formatting_CommentXmlSpaceTags) + { + Append(CodeCommentHelper.Spacer); } - Indent(indentLevel); Append(line.CloseTag); return tagOnOwnLine || CommentLineXml.SingleLineElementNames.Contains(line.TagName, StringComparer.OrdinalIgnoreCase); From 7aac1595cb458359ba68cf296a4b02892809fdc3 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 28 Apr 2018 12:21:29 +0000 Subject: [PATCH 60/71] Update the CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ba2f2e6..1b71c7e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,14 +6,16 @@ These changes have not been released to the Visual Studio marketplace, but (if c - [x] Features - [x] [#477](https://github.com/codecadwallader/codemaid/pull/477) - Digging: New radial progress bar - thanks [Jammer77](https://github.com/Jammer77)! - - [ ] [#506](https://github.com/codecadwallader/codemaid/pull/506) - Enable localization for Chinese - thanks [maikebing](https://github.com/maikebing)! + - [x] [#506](https://github.com/codecadwallader/codemaid/pull/506) - Enable localization for Chinese - thanks [maikebing](https://github.com/maikebing)! - [x] [#519](https://github.com/codecadwallader/codemaid/pull/519) - Simplify the code by removing unnecessary guids - thanks [heku](https://github.com/heku)! - [x] [#525](https://github.com/codecadwallader/codemaid/pull/525) - Make all features switchable - thanks [heku](https://github.com/heku)! + - [x] [#545](https://github.com/codecadwallader/codemaid/pull/545) - Ignore comment lines starting with certain prefixes - thanks [willemduncan](https://github.com/willemduncan)! - [x] Fixes - [x] [#479](https://github.com/codecadwallader/codemaid/pull/479) - Update XAML Styler integration mappings - thanks [grochocki](https://github.com/grochocki)! - [x] [#496](https://github.com/codecadwallader/codemaid/pull/496) - Fix the .NET Framework minimum required version (which is v4.6) - [x] [#541](https://github.com/codecadwallader/codemaid/pull/541) - Project file (.csproj) cleanup - thanks [heku](https://github.com/heku)! + - [x] [#546](https://github.com/codecadwallader/codemaid/pull/546) - Fix a setting that would leave a trailing white space when formatting comments - thanks [willemduncan](https://github.com/willemduncan)! ## Previous Releases From 8ae80483b23ee1b585b050435a1933a7bc267f1f Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 28 Apr 2018 12:36:58 +0000 Subject: [PATCH 61/71] Prefer using statements to fully qualified names. --- .../Commands/CleanupAllCodeCommand.cs | 9 +++++---- .../Commands/CommentFormatCommand.cs | 11 ++++++----- .../Integration/Commands/JoinLinesCommand.cs | 3 ++- .../Commands/ReadOnlyToggleCommand.cs | 3 ++- .../Commands/RemoveRegionCommand.cs | 7 ++++--- .../Commands/SettingCleanupOnSaveCommand.cs | 6 +++--- .../Integration/Commands/SortLinesCommand.cs | 3 ++- .../Commands/SpadeContextDeleteCommand.cs | 3 ++- .../SpadeContextInsertRegionCommand.cs | 2 +- .../Integration/Commands/SwitchFileCommand.cs | 4 ++-- .../Cleaning/CodeCleanupAvailabilityLogic.cs | 6 +++--- .../Cleaning/CleaningFileTypesViewModel.cs | 2 +- .../Cleaning/CleaningGeneralViewModel.cs | 2 +- .../Cleaning/CleaningInsertViewModel.cs | 2 +- .../Cleaning/CleaningRemoveViewModel.cs | 2 +- .../Cleaning/CleaningUpdateViewModel.cs | 2 +- .../Options/Collapsing/CollapsingViewModel.cs | 2 +- .../Options/Digging/DiggingViewModel.cs | 2 +- .../Options/Finding/FindingViewModel.cs | 2 +- .../Options/Formatting/FormattingViewModel.cs | 2 +- .../Options/General/GeneralViewModel.cs | 2 +- .../UI/Dialogs/Options/OptionsViewModel.cs | 18 +++++++++--------- .../Progressing/ProgressingViewModel.cs | 2 +- .../ReorganizingGeneralViewModel.cs | 2 +- .../ReorganizingParentViewModel.cs | 2 +- .../ReorganizingRegionsViewModel.cs | 2 +- .../Reorganizing/ReorganizingTypesViewModel.cs | 2 +- .../Options/Switching/SwitchingViewModel.cs | 2 +- .../Options/ThirdParty/ThirdPartyViewModel.cs | 2 +- CodeMaid/UI/ThemeManager.cs | 2 +- .../BuildProgress/BuildProgressToolWindow.cs | 13 +++++++------ .../UI/ToolWindows/Spade/SpadeToolWindow.cs | 4 ++-- 32 files changed, 68 insertions(+), 60 deletions(-) diff --git a/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs b/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs index b8da7a3a..2e1bddc3 100644 --- a/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs +++ b/CodeMaid/Integration/Commands/CleanupAllCodeCommand.cs @@ -1,6 +1,7 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Logic.Cleaning; +using SteveCadwallader.CodeMaid.Properties; using SteveCadwallader.CodeMaid.UI.Dialogs.CleanupProgress; using System.Collections.Generic; using System.Linq; @@ -58,12 +59,12 @@ protected override void OnExecute() if (!CodeCleanupAvailabilityLogic.IsCleanupEnvironmentAvailable()) { - MessageBox.Show(CodeMaid.Properties.Resources.CleanupCannotRunWhileDebugging, - CodeMaid.Properties.Resources.CodeMaidCleanupAllCode, + MessageBox.Show(Resources.CleanupCannotRunWhileDebugging, + Resources.CodeMaidCleanupAllCode, MessageBoxButton.OK, MessageBoxImage.Warning); } - else if (MessageBox.Show(CodeMaid.Properties.Resources.AreYouReadyForCodeMaidToCleanEverythingInTheSolution, - CodeMaid.Properties.Resources.CodeMaidConfirmationForCleanupAllCode, + else if (MessageBox.Show(Resources.AreYouReadyForCodeMaidToCleanEverythingInTheSolution, + Resources.CodeMaidConfirmationForCleanupAllCode, MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No) == MessageBoxResult.Yes) { diff --git a/CodeMaid/Integration/Commands/CommentFormatCommand.cs b/CodeMaid/Integration/Commands/CommentFormatCommand.cs index 77a3b97f..56112cb9 100644 --- a/CodeMaid/Integration/Commands/CommentFormatCommand.cs +++ b/CodeMaid/Integration/Commands/CommentFormatCommand.cs @@ -1,6 +1,7 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Logic.Formatting; +using SteveCadwallader.CodeMaid.Properties; namespace SteveCadwallader.CodeMaid.Integration.Commands { @@ -37,7 +38,7 @@ public static void Initialize(CodeMaidPackage package) internal CommentFormatCommand(CodeMaidPackage package) : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidCommentFormat) { - _undoTransactionHelper = new UndoTransactionHelper(package, CodeMaid.Properties.Resources.CodeMaidFormatComment); + _undoTransactionHelper = new UndoTransactionHelper(package, Resources.CodeMaidFormatComment); _commentFormatLogic = CommentFormatLogic.GetInstance(package); } @@ -91,15 +92,15 @@ protected override void OnExecute() if (foundComments) { - Package.IDE.StatusBar.Text = CodeMaid.Properties.Resources.CodeMaidFinishedFormattingTheComment; + Package.IDE.StatusBar.Text = Resources.CodeMaidFinishedFormattingTheComment; } else { Package.IDE.StatusBar.Text = string.Format( foundComments - ? CodeMaid.Properties.Resources.CodeMaidFinishedFormattingTheComments0 - : CodeMaid.Properties.Resources.CodeMaidDidNotFindANonCodeComment0ToReformat, - selection.IsEmpty ? CodeMaid.Properties.Resources.UnderTheCursor : CodeMaid.Properties.Resources.InTheSelection + ? Resources.CodeMaidFinishedFormattingTheComments0 + : Resources.CodeMaidDidNotFindANonCodeComment0ToReformat, + selection.IsEmpty ? Resources.UnderTheCursor : Resources.InTheSelection ); } } diff --git a/CodeMaid/Integration/Commands/JoinLinesCommand.cs b/CodeMaid/Integration/Commands/JoinLinesCommand.cs index 69084b54..0609fa3f 100644 --- a/CodeMaid/Integration/Commands/JoinLinesCommand.cs +++ b/CodeMaid/Integration/Commands/JoinLinesCommand.cs @@ -1,5 +1,6 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; +using SteveCadwallader.CodeMaid.Properties; namespace SteveCadwallader.CodeMaid.Integration.Commands { @@ -35,7 +36,7 @@ public static void Initialize(CodeMaidPackage package) internal JoinLinesCommand(CodeMaidPackage package) : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidJoinLines) { - _undoTransactionHelper = new UndoTransactionHelper(package, CodeMaid.Properties.Resources.CodeMaidJoin); + _undoTransactionHelper = new UndoTransactionHelper(package, Resources.CodeMaidJoin); } #endregion Constructors diff --git a/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs b/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs index 43f74a0e..097be179 100644 --- a/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs +++ b/CodeMaid/Integration/Commands/ReadOnlyToggleCommand.cs @@ -1,5 +1,6 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; +using SteveCadwallader.CodeMaid.Properties; using System; using System.IO; @@ -64,7 +65,7 @@ protected override void OnExecute() } catch (Exception ex) { - OutputWindowHelper.ExceptionWriteLine($"{ CodeMaid.Properties.Resources.UnableToToggleReadOnlyStateOn}'{document.FullName}'", ex); + OutputWindowHelper.ExceptionWriteLine($"{ Resources.UnableToToggleReadOnlyStateOn}'{document.FullName}'", ex); } } } diff --git a/CodeMaid/Integration/Commands/RemoveRegionCommand.cs b/CodeMaid/Integration/Commands/RemoveRegionCommand.cs index a0dc23e2..3a9996f5 100644 --- a/CodeMaid/Integration/Commands/RemoveRegionCommand.cs +++ b/CodeMaid/Integration/Commands/RemoveRegionCommand.cs @@ -2,6 +2,7 @@ using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Logic.Cleaning; using SteveCadwallader.CodeMaid.Model; +using SteveCadwallader.CodeMaid.Properties; namespace SteveCadwallader.CodeMaid.Integration.Commands { @@ -73,15 +74,15 @@ protected override void OnBeforeQueryStatus() switch (regionCommandScope) { case RegionCommandScope.CurrentLine: - Text = CodeMaid.Properties.Resources.RemoveCurrentRegion; + Text = Resources.RemoveCurrentRegion; break; case RegionCommandScope.Selection: - Text = CodeMaid.Properties.Resources.RemoveSelectedRegions; + Text = Resources.RemoveSelectedRegions; break; default: - Text = CodeMaid.Properties.Resources.RemoveAllRegions; + Text = Resources.RemoveAllRegions; break; } } diff --git a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs index e052669c..959fbde9 100644 --- a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs +++ b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs @@ -46,7 +46,7 @@ public bool CleanupOnSave /// /// Gets an ON/OFF string based on the state. /// - public string CleanupOnSaveStateText => CleanupOnSave ? CodeMaid.Properties.Resources.SettingCleanupOnSaveCommand_ON : CodeMaid.Properties.Resources.SettingCleanupOnSaveCommand_OFF; + public string CleanupOnSaveStateText => CleanupOnSave ? Resources.SettingCleanupOnSaveCommand_ON : Resources.SettingCleanupOnSaveCommand_OFF; #endregion Properties @@ -58,7 +58,7 @@ public bool CleanupOnSave protected override void OnBeforeQueryStatus() { Checked = CleanupOnSave; - Text = CodeMaid.Properties.Resources.AutomaticCleanupOnSave + CleanupOnSaveStateText; + Text = Resources.AutomaticCleanupOnSave + CleanupOnSaveStateText; } /// @@ -71,7 +71,7 @@ protected override void OnExecute() CleanupOnSave = !CleanupOnSave; Settings.Default.Save(); - Package.IDE.StatusBar.Text = $"{ CodeMaid.Properties.Resources.CodeMaidTurnedAutomaticCleanupOnSave }{CleanupOnSaveStateText}."; + Package.IDE.StatusBar.Text = $"{ Resources.CodeMaidTurnedAutomaticCleanupOnSave }{CleanupOnSaveStateText}."; } #endregion BaseCommand Methods diff --git a/CodeMaid/Integration/Commands/SortLinesCommand.cs b/CodeMaid/Integration/Commands/SortLinesCommand.cs index b9156b04..b5b47a66 100644 --- a/CodeMaid/Integration/Commands/SortLinesCommand.cs +++ b/CodeMaid/Integration/Commands/SortLinesCommand.cs @@ -1,5 +1,6 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; +using SteveCadwallader.CodeMaid.Properties; using System; using System.Linq; using System.Text; @@ -39,7 +40,7 @@ public static void Initialize(CodeMaidPackage package) internal SortLinesCommand(CodeMaidPackage package) : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSortLines) { - _undoTransactionHelper = new UndoTransactionHelper(package, CodeMaid.Properties.Resources.CodeMaidSort); + _undoTransactionHelper = new UndoTransactionHelper(package, Resources.CodeMaidSort); } #endregion Constructors diff --git a/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs b/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs index 4fce4883..19e6f149 100644 --- a/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeContextDeleteCommand.cs @@ -1,6 +1,7 @@ using EnvDTE; using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Model.CodeItems; +using SteveCadwallader.CodeMaid.Properties; using System; using System.Linq; @@ -38,7 +39,7 @@ public static void Initialize(CodeMaidPackage package) internal SpadeContextDeleteCommand(CodeMaidPackage package) : base(package, PackageGuids.GuidCodeMaidMenuSet, PackageIds.CmdIDCodeMaidSpadeContextDelete) { - _undoTransactionHelper = new UndoTransactionHelper(package, CodeMaid.Properties.Resources.CodeMaidDeleteItems); + _undoTransactionHelper = new UndoTransactionHelper(package, Resources.CodeMaidDeleteItems); } #endregion Constructors diff --git a/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs b/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs index 3fd6dfb3..f484d32f 100644 --- a/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs +++ b/CodeMaid/Integration/Commands/SpadeContextInsertRegionCommand.cs @@ -75,7 +75,7 @@ protected override void OnExecute() var spade = Package.Spade; if (spade != null) { - var region = new CodeItemRegion { Name = CodeMaid.Properties.Resources.NewRegion }; + var region = new CodeItemRegion { Name = Resources.NewRegion }; var startPoint = spade.SelectedItems.OrderBy(x => x.StartOffset).First().StartPoint; var endPoint = spade.SelectedItems.OrderBy(x => x.EndOffset).Last().EndPoint; diff --git a/CodeMaid/Integration/Commands/SwitchFileCommand.cs b/CodeMaid/Integration/Commands/SwitchFileCommand.cs index 065178b1..4c2a1a6b 100644 --- a/CodeMaid/Integration/Commands/SwitchFileCommand.cs +++ b/CodeMaid/Integration/Commands/SwitchFileCommand.cs @@ -51,11 +51,11 @@ protected override void OnBeforeQueryStatus() Enabled = canAlterate; if (canAlterate) { - Text = CodeMaid.Properties.Resources.SWitchTo + Path.GetFileName(alternatePath); + Text = Resources.SWitchTo + Path.GetFileName(alternatePath); } else { - Text = CodeMaid.Properties.Resources.SWitchFile; + Text = Resources.SWitchFile; } } diff --git a/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs b/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs index 1e6fe502..ecca7164 100644 --- a/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs +++ b/CodeMaid/Logic/Cleaning/CodeCleanupAvailabilityLogic.cs @@ -415,10 +415,10 @@ private static bool PromptUserAboutCleaningExternalFiles(Document document) { var viewModel = new YesNoPromptViewModel { - Title = CodeMaid.Properties.Resources.CodeMaidCleanupExternalFile, - Message = document.Name + CodeMaid.Properties.Resources.IsNotInTheSolutionSoSomeCleanupActionsMayBeUnavailable + + Title = Resources.CodeMaidCleanupExternalFile, + Message = document.Name + Resources.IsNotInTheSolutionSoSomeCleanupActionsMayBeUnavailable + Environment.NewLine + Environment.NewLine + - CodeMaid.Properties.Resources.DoYouWantToPerformAPartialCleanup, + Resources.DoYouWantToPerformAPartialCleanup, CanRemember = true }; diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningFileTypesViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningFileTypesViewModel.cs index 41592beb..a704a784 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningFileTypesViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningFileTypesViewModel.cs @@ -48,7 +48,7 @@ public CleaningFileTypesViewModel(CodeMaidPackage package, Settings activeSettin /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.CleaningFileTypesViewModel_FileTypes; + public override string Header => Resources.CleaningFileTypesViewModel_FileTypes; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralViewModel.cs index ec554ea4..eddf8a5a 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningGeneralViewModel.cs @@ -33,7 +33,7 @@ public CleaningGeneralViewModel(CodeMaidPackage package, Settings activeSettings /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.General; + public override string Header => Resources.General; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningInsertViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningInsertViewModel.cs index 29a07a0e..bd2b4ba0 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningInsertViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningInsertViewModel.cs @@ -71,7 +71,7 @@ public CleaningInsertViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.Insert; + public override string Header => Resources.Insert; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveViewModel.cs index 93f9c485..c5257921 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningRemoveViewModel.cs @@ -42,7 +42,7 @@ public CleaningRemoveViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.Remove; + public override string Header => Resources.Remove; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningUpdateViewModel.cs b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningUpdateViewModel.cs index 37fbb717..f2fa842a 100644 --- a/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningUpdateViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Cleaning/CleaningUpdateViewModel.cs @@ -48,7 +48,7 @@ public CleaningUpdateViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.CleaningUpdateViewModel_Update; + public override string Header => Resources.CleaningUpdateViewModel_Update; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Collapsing/CollapsingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Collapsing/CollapsingViewModel.cs index 1614a904..1890d625 100644 --- a/CodeMaid/UI/Dialogs/Options/Collapsing/CollapsingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Collapsing/CollapsingViewModel.cs @@ -31,7 +31,7 @@ public CollapsingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.CollapsingViewModel_Collapsing; + public override string Header => Resources.CollapsingViewModel_Collapsing; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Digging/DiggingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Digging/DiggingViewModel.cs index f7850ce1..172bba05 100644 --- a/CodeMaid/UI/Dialogs/Options/Digging/DiggingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Digging/DiggingViewModel.cs @@ -40,7 +40,7 @@ public DiggingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.DiggingViewModel_DiggingSpade; + public override string Header => Resources.DiggingViewModel_DiggingSpade; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Finding/FindingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Finding/FindingViewModel.cs index 857bee4e..30a78c2d 100644 --- a/CodeMaid/UI/Dialogs/Options/Finding/FindingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Finding/FindingViewModel.cs @@ -31,7 +31,7 @@ public FindingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.FindingViewModel_Finding; + public override string Header => Resources.FindingViewModel_Finding; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Formatting/FormattingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Formatting/FormattingViewModel.cs index a6b55441..55e16fe2 100644 --- a/CodeMaid/UI/Dialogs/Options/Formatting/FormattingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Formatting/FormattingViewModel.cs @@ -63,7 +63,7 @@ public FormattingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.FormattingViewModel_Formatting; + public override string Header => Resources.FormattingViewModel_Formatting; /// /// Loads the settings. diff --git a/CodeMaid/UI/Dialogs/Options/General/GeneralViewModel.cs b/CodeMaid/UI/Dialogs/Options/General/GeneralViewModel.cs index a3081554..145b3e45 100644 --- a/CodeMaid/UI/Dialogs/Options/General/GeneralViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/General/GeneralViewModel.cs @@ -39,7 +39,7 @@ public GeneralViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.General; + public override string Header => Resources.General; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs b/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs index 1a9979f7..f4902970 100644 --- a/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/OptionsViewModel.cs @@ -223,10 +223,10 @@ private void OnExportCommandExecuted(object parameter) var activeSettingsName = ActiveSettingsName; var dialog = new Microsoft.Win32.SaveFileDialog { - Title = CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName, + Title = Resources.CodeMaidExport + activeSettingsName, FileName = "CodeMaid", DefaultExt = ".config", - Filter = CodeMaid.Properties.Resources.ConfigFilesConfigConfigAllFiles + Filter = Resources.ConfigFilesConfigConfigAllFiles }; if (dialog.ShowDialog() == true) @@ -235,14 +235,14 @@ private void OnExportCommandExecuted(object parameter) { File.Copy(ActiveSettingsPath, dialog.FileName, true); - MessageBox.Show(string.Format(CodeMaid.Properties.Resources.CodeMaidHasSuccessfullyExported + activeSettingsName + CodeMaid.Properties.Resources.To0, dialog.FileName), - CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName + CodeMaid.Properties.Resources.Successful, MessageBoxButton.OK, MessageBoxImage.Information); + MessageBox.Show(string.Format(Resources.CodeMaidHasSuccessfullyExported + activeSettingsName + Resources.To0, dialog.FileName), + Resources.CodeMaidExport + activeSettingsName + Resources.Successful, MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception ex) { OutputWindowHelper.ExceptionWriteLine(Resources.UnableToExport + activeSettingsName, ex); - MessageBox.Show(CodeMaid.Properties.Resources.CodeMaidWasUnableToExport + activeSettingsName + CodeMaid.Properties.Resources.SeeOutputWindowForMoreDetails, - CodeMaid.Properties.Resources.CodeMaidExport + activeSettingsName + CodeMaid.Properties.Resources.Unsuccessful, MessageBoxButton.OK, MessageBoxImage.Error); + MessageBox.Show(Resources.CodeMaidWasUnableToExport + activeSettingsName + Resources.SeeOutputWindowForMoreDetails, + Resources.CodeMaidExport + activeSettingsName + Resources.Unsuccessful, MessageBoxButton.OK, MessageBoxImage.Error); } } } @@ -272,9 +272,9 @@ private void OnImportCommandExecuted(object parameter) var activeSettingsName = ActiveSettingsName; var dialog = new Microsoft.Win32.OpenFileDialog { - Title = CodeMaid.Properties.Resources.CodeMaidImport + activeSettingsName, + Title = Resources.CodeMaidImport + activeSettingsName, DefaultExt = ".config", - Filter = CodeMaid.Properties.Resources.ConfigFilesConfigConfigAllFiles, + Filter = Resources.ConfigFilesConfigConfigAllFiles, CheckFileExists = true }; @@ -499,7 +499,7 @@ private bool CheckToSavePendingChangesShouldCancelOperation() /// The active or inactive settings name. private string GetSettingsName(bool inactive) { - return IsActiveSolutionSpecificSettings ^ inactive ? CodeMaid.Properties.Resources.SolutionSpecificSettings : CodeMaid.Properties.Resources.UserSettings; + return IsActiveSolutionSpecificSettings ^ inactive ? Resources.SolutionSpecificSettings : Resources.UserSettings; } /// diff --git a/CodeMaid/UI/Dialogs/Options/Progressing/ProgressingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Progressing/ProgressingViewModel.cs index 8644d506..2db6666f 100644 --- a/CodeMaid/UI/Dialogs/Options/Progressing/ProgressingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Progressing/ProgressingViewModel.cs @@ -32,7 +32,7 @@ public ProgressingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.ProgressingViewModel_Progressing; + public override string Header => Resources.ProgressingViewModel_Progressing; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralViewModel.cs b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralViewModel.cs index 1c6ccfe2..198439b9 100644 --- a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingGeneralViewModel.cs @@ -37,7 +37,7 @@ public ReorganizingGeneralViewModel(CodeMaidPackage package, Settings activeSett /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.General; + public override string Header => Resources.General; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingParentViewModel.cs b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingParentViewModel.cs index ee6411f3..748342e4 100644 --- a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingParentViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingParentViewModel.cs @@ -26,7 +26,7 @@ public ReorganizingParentViewModel(CodeMaidPackage package, Settings activeSetti /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.Reorganizing; + public override string Header => Resources.Reorganizing; #endregion Overrides of OptionsPageViewModel } diff --git a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingRegionsViewModel.cs b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingRegionsViewModel.cs index 6a0b95fd..07e88321 100644 --- a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingRegionsViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingRegionsViewModel.cs @@ -33,7 +33,7 @@ public ReorganizingRegionsViewModel(CodeMaidPackage package, Settings activeSett /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.Regions; + public override string Header => Resources.Regions; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingTypesViewModel.cs b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingTypesViewModel.cs index 4a505d3f..82edc9d9 100644 --- a/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingTypesViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Reorganizing/ReorganizingTypesViewModel.cs @@ -47,7 +47,7 @@ public ReorganizingTypesViewModel(CodeMaidPackage package, Settings activeSettin /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.ReorganizingTypesViewModel_Types; + public override string Header => Resources.ReorganizingTypesViewModel_Types; /// /// Loads the settings. diff --git a/CodeMaid/UI/Dialogs/Options/Switching/SwitchingViewModel.cs b/CodeMaid/UI/Dialogs/Options/Switching/SwitchingViewModel.cs index 3da24148..0b427647 100644 --- a/CodeMaid/UI/Dialogs/Options/Switching/SwitchingViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/Switching/SwitchingViewModel.cs @@ -30,7 +30,7 @@ public SwitchingViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.SwitchingViewModel_Switching; + public override string Header => Resources.SwitchingViewModel_Switching; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs b/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs index ae87c213..46c1951f 100644 --- a/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs +++ b/CodeMaid/UI/Dialogs/Options/ThirdParty/ThirdPartyViewModel.cs @@ -42,7 +42,7 @@ public ThirdPartyViewModel(CodeMaidPackage package, Settings activeSettings) /// /// Gets the header. /// - public override string Header => CodeMaid.Properties.Resources.ThirdPartyViewModel_ThirdParty; + public override string Header => Resources.ThirdPartyViewModel_ThirdParty; #endregion Overrides of OptionsPageViewModel diff --git a/CodeMaid/UI/ThemeManager.cs b/CodeMaid/UI/ThemeManager.cs index 60c5eaa3..9ad336f4 100644 --- a/CodeMaid/UI/ThemeManager.cs +++ b/CodeMaid/UI/ThemeManager.cs @@ -194,7 +194,7 @@ private ResourceDictionary LoadResourceDictionary(Uri themeUri) catch (Exception ex) { OutputWindowHelper.ExceptionWriteLine($"Unable to load theme '{themeUri}'", ex); - _package.IDE.StatusBar.Text = string.Format( CodeMaid.Properties.Resources.CodeMaidFailedToLoadTheme0SeeOutputWindowForMoreDetails, themeUri); + _package.IDE.StatusBar.Text = string.Format(Resources.CodeMaidFailedToLoadTheme0SeeOutputWindowForMoreDetails, themeUri); return null; } diff --git a/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs b/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs index ffc30d17..65ae4c1e 100644 --- a/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs +++ b/CodeMaid/UI/ToolWindows/BuildProgress/BuildProgressToolWindow.cs @@ -1,6 +1,7 @@ using EnvDTE; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; +using SteveCadwallader.CodeMaid.Properties; using System; using System.Collections.Generic; using System.Globalization; @@ -18,7 +19,7 @@ public class BuildProgressToolWindow : ToolWindowPane { #region Fields - private string DefaultCaption = CodeMaid.Properties.Resources.BuildProgress; + private string DefaultCaption = Resources.BuildProgress; private readonly BuildProgressViewModel _viewModel; @@ -219,26 +220,26 @@ private static string GetBuildTypeString(vsBuildScope buildScope, vsBuildAction // First append the word 'Batch ' if this is a batch build event. if (buildScope == vsBuildScope.vsBuildScopeBatch) { - stringBuilder.Append( CodeMaid.Properties.Resources.Batch); + stringBuilder.Append(Resources.Batch); } // Next append the action-specific build string. switch (buildAction) { case vsBuildAction.vsBuildActionBuild: - stringBuilder.Append( CodeMaid.Properties.Resources.Building); + stringBuilder.Append(Resources.Building); break; case vsBuildAction.vsBuildActionClean: - stringBuilder.Append( CodeMaid.Properties.Resources.Cleaning); + stringBuilder.Append(Resources.Cleaning); break; case vsBuildAction.vsBuildActionDeploy: - stringBuilder.Append( CodeMaid.Properties.Resources.Deploying); + stringBuilder.Append(Resources.Deploying); break; case vsBuildAction.vsBuildActionRebuildAll: - stringBuilder.Append( CodeMaid.Properties.Resources.Rebuilding); + stringBuilder.Append(Resources.Rebuilding); break; } diff --git a/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs b/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs index 4cbd5e7d..81323d45 100644 --- a/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs +++ b/CodeMaid/UI/ToolWindows/Spade/SpadeToolWindow.cs @@ -45,7 +45,7 @@ public SpadeToolWindow() : base(null) { // Set the tool window caption. - Caption = CodeMaid.Properties.Resources.CodeMaidSpade; + Caption = Resources.CodeMaidSpade; // Set the tool window image from resources. BitmapResourceID = 508; @@ -379,7 +379,7 @@ public override void ProvideSearchSettings(IVsUIDataSource pSearchSettings) Utilities.SetValue(pSearchSettings, SearchSettingsDataSource.PropertyNames.ControlMinWidth, 200U); Utilities.SetValue(pSearchSettings, SearchSettingsDataSource.PropertyNames.ControlMaxWidth, uint.MaxValue); - Utilities.SetValue(pSearchSettings, SearchSettingsDataSource.PropertyNames.SearchWatermark, CodeMaid.Properties.Resources.SearchCodeMaidSpadeCtrlM); + Utilities.SetValue(pSearchSettings, SearchSettingsDataSource.PropertyNames.SearchWatermark, Resources.SearchCodeMaidSpadeCtrlM); } #endregion IVsWindowSearch Members From 9834b2cd736329ffbe6ee08e5b88649f3b691f71 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 28 Apr 2018 12:47:04 +0000 Subject: [PATCH 62/71] Dogfood CodeMaid through CodeMaid. :) --- .../Formatting/CommentFormatHelper.cs | 2 -- CodeMaid/Model/Comments/CommentFormatter.cs | 1 - CodeMaid/Model/Comments/CommentMatch.cs | 3 +-- .../CleanupProgress/CleanupProgressWindow.xaml | 14 ++++++++------ 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/CodeMaid.UnitTests/Formatting/CommentFormatHelper.cs b/CodeMaid.UnitTests/Formatting/CommentFormatHelper.cs index 38d398af..60e553c8 100644 --- a/CodeMaid.UnitTests/Formatting/CommentFormatHelper.cs +++ b/CodeMaid.UnitTests/Formatting/CommentFormatHelper.cs @@ -1,9 +1,7 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Model.Comments; using System; using System.Collections.Generic; -using System.Xml.Linq; namespace SteveCadwallader.CodeMaid.UnitTests.Formatting { diff --git a/CodeMaid/Model/Comments/CommentFormatter.cs b/CodeMaid/Model/Comments/CommentFormatter.cs index c306a16c..68a98edb 100644 --- a/CodeMaid/Model/Comments/CommentFormatter.cs +++ b/CodeMaid/Model/Comments/CommentFormatter.cs @@ -1,7 +1,6 @@ using SteveCadwallader.CodeMaid.Helpers; using SteveCadwallader.CodeMaid.Properties; using System; -using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; diff --git a/CodeMaid/Model/Comments/CommentMatch.cs b/CodeMaid/Model/Comments/CommentMatch.cs index b8a650e0..fbe4af41 100644 --- a/CodeMaid/Model/Comments/CommentMatch.cs +++ b/CodeMaid/Model/Comments/CommentMatch.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; diff --git a/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressWindow.xaml b/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressWindow.xaml index 28022a4e..41c38802 100644 --- a/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressWindow.xaml +++ b/CodeMaid/UI/Dialogs/CleanupProgress/CleanupProgressWindow.xaml @@ -28,12 +28,14 @@ - - - + + + + + + From 72ede8730558837b2d89846151f94d9a230e9d9a Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sun, 29 Apr 2018 17:11:34 +0000 Subject: [PATCH 63/71] Enable compilation with the latest version of the C# language. --- CodeMaid.IntegrationTests/CodeMaid.IntegrationTests.csproj | 1 + CodeMaid.UnitTests/CodeMaid.UnitTests.csproj | 1 + CodeMaid/CodeMaid.csproj | 1 + 3 files changed, 3 insertions(+) diff --git a/CodeMaid.IntegrationTests/CodeMaid.IntegrationTests.csproj b/CodeMaid.IntegrationTests/CodeMaid.IntegrationTests.csproj index 6e927fe3..3ca64c5d 100644 --- a/CodeMaid.IntegrationTests/CodeMaid.IntegrationTests.csproj +++ b/CodeMaid.IntegrationTests/CodeMaid.IntegrationTests.csproj @@ -16,6 +16,7 @@ $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest + latest true diff --git a/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj b/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj index 817b782c..0bb24d65 100644 --- a/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj +++ b/CodeMaid.UnitTests/CodeMaid.UnitTests.csproj @@ -16,6 +16,7 @@ $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages False UnitTest + latest true diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 8be5104e..fb4b5a80 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -41,6 +41,7 @@ Program $(DevEnvDir)devenv.exe /rootsuffix Exp + latest true From b4c11e71e2d03777c94b70f7023cd10b17a8b62b Mon Sep 17 00:00:00 2001 From: heku Date: Thu, 3 May 2018 20:59:41 +0800 Subject: [PATCH 64/71] Project file cleanup --- CodeMaid/CodeMaid.csproj | 35 +---------------------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index 8be5104e..baf59c50 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -15,28 +15,7 @@ True ..\CodeMaid.snk v4.6.1 - 15.0 - 12.0 - - - - - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - + 15.0 en-US Program $(DevEnvDir)devenv.exe @@ -808,18 +787,6 @@ Designer - - - False - Microsoft .NET Framework 4.5 %28x86 and x64%29 - true - - - False - .NET Framework 3.5 SP1 - false - - Resources.resx From 5ce0aa0cabb2d1954c0cc9e0eb880e995670282e Mon Sep 17 00:00:00 2001 From: heku Date: Thu, 3 May 2018 21:15:21 +0800 Subject: [PATCH 65/71] Change build action to 'None' for 'source.extension.resx' due to it is for reference only --- CodeMaid/CodeMaid.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CodeMaid/CodeMaid.csproj b/CodeMaid/CodeMaid.csproj index baf59c50..1782a475 100644 --- a/CodeMaid/CodeMaid.csproj +++ b/CodeMaid/CodeMaid.csproj @@ -15,7 +15,7 @@ True ..\CodeMaid.snk v4.6.1 - 15.0 + 15.0 en-US Program $(DevEnvDir)devenv.exe @@ -804,13 +804,13 @@ VSPackage.en-US.resources source.extension.vsixmanifest - + True True source.extension.vsixmanifest true VSPackage - + true VSPackage.zh-Hans.resources From 0e59a1d6f3a6e008da7755a8b9b346aa2d721c9f Mon Sep 17 00:00:00 2001 From: heku Date: Thu, 3 May 2018 22:24:39 +0800 Subject: [PATCH 66/71] Sort lines in same order so that we can compare them --- CodeMaid/Properties/Resources.en-US.resx | 1070 +++++++++---------- CodeMaid/Properties/Resources.resx | 1070 +++++++++---------- CodeMaid/Properties/Resources.zh-Hans.resx | 1088 ++++++++++---------- 3 files changed, 1614 insertions(+), 1614 deletions(-) diff --git a/CodeMaid/Properties/Resources.en-US.resx b/CodeMaid/Properties/Resources.en-US.resx index 0c5f2e34..c51b4215 100644 --- a/CodeMaid/Properties/Resources.en-US.resx +++ b/CodeMaid/Properties/Resources.en-US.resx @@ -20,13 +20,13 @@ this is my long stringthis is a comment Blue - [base64 mime encoded serialized .NET Framework object] - + [base64 mime encoded serialized .NET Framework object] + - [base64 mime encoded string representing a byte array form of the .NET Framework object] + [base64 mime encoded string representing a byte array form of the .NET Framework object] This is a comment - - + + There are any number of "resheader" rows that contain simple name/value pairs. @@ -117,808 +117,808 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Build Progress + + Unable to import - - Cancel + + Access levels should be ordered by - - Canceling... + + access then type - - Are you ready for CodeMaid to clean everything in the solution? + + Add space inside self closing tags - - Cleanup cannot run while debugging. + + Add spacing around XML tags - - CodeMaid: Cleanup All Code + + after attributes - - CodeMaid: Confirmation for Cleanup All Code + + after opening braces - - CodeMaid: Cleanup External File + + Alert threshold - - Do you want to perform a partial cleanup? + + Align XML &lt;param&gt; tags - - is not in the solution so some cleanup actions may be unavailable. + + all - - CodeMaid Format Comment + + alphabetical - - CodeMaid did not find a non-code comment {0} to reformat. + + Alphabetize members of the same group - - CodeMaid finished formatting the comment. + + Always split all XML tags onto multiple lines - - CodeMaid finished formatting the comments {0}. + + Always split &lt;summary&gt; tags onto multiple lines - - in the selection + + Are you ready for CodeMaid to clean everything in the solution? - - under the cursor + + Are you sure you want all - - Unable to toggle read only state on + + ask - - &Remove All Regions + + at bottom of file - - &Remove Current Region + + at top of file - - &Remove Selected Regions + + auto-detect + + + Automatic + + + Automatically run cleanup on file save + + + Automatically save and close documents opened by cleanup Automatic Cleanup On Save - - - CodeMaid turned automatic cleanup on save + + Batch - - New Region + + before closing angle brackets - - S&witch File + + before closing braces - - S&witch to + + before closing tags - - CodeMaid: Cleanup Progress + + between chained statements - - CodeMaid Spade + + Building - - Search CodeMaid Spade (Ctrl+M, ;) + + Build Progress - - Rebuilding + + Build progress window - - Deploying + + Cache file code models + + + Cancel + + + Canceling... Cleaning - - Building + + Cleaning - - Batch + + File Types - - CodeMaid failed to load theme '{0}'. See output window for more details. + + Update - - Reset to Defaults + + Cleanup - - Export + + Cleanup Active Code - - Import + + Cleanup Active Document - - Save + + Cleanup All Code - - CodeMaid: Import + + Cleanup cannot run while debugging. - - Config files (*.config)|*.config|All Files (*.*)|*.* + + Cleanup Open Code - - CodeMaid Options + + Cleanup Selected Code + + + Clear Solution Explorer search filtering to find filtered items Close - - Theme - - - Font + + Close All Read-Only - - Cache file code models + + CodeMaid cleaned '{0}'. - - Load models asynchronously + + CodeMaid: Cleanup All Code - - Diagnostics mode + + CodeMaid: Cleanup External File - - Show start page when a solution is closed + + CodeMaid Cleanup for '{0}' - - Use undo transactions + + CodeMaid: Cleanup Progress - - Skip during automatic cleanup on save + + CodeMaid: Confirmation for Cleanup All Code - - Icons + + CodeMaid: Confirmation for Reset - - Show build progress window when a build starts + + CodeMaid: Confirmation to Save Pending Changes - - Hide build progress window when a build stops + + CodeMaid Delete Items - - Show build progress on Visual Studio icon in Windows taskbar + + CodeMaid did not find a non-code comment {0} to reformat. - - Build progress window + + CodeMaid: Export - - Wrap comments at column + + CodeMaid failed to load theme '{0}'. See output window for more details. - - General + + CodeMaid finished formatting the comment. - - Skip wrapping on the last word + + CodeMaid finished formatting the comments {0}. - - Extra indent for values inside XML comments + + CodeMaid Format Comment - - Add spacing around XML tags + + CodeMaid has successfully exported - - Add space inside self closing tags + + CodeMaid has successfully imported {1} from '{0}'. - - Keep XML tags together + + CodeMaid has successfully reset - - Align XML &lt;param&gt; tags + + CodeMaid: Import - - Always split &lt;summary&gt; tags onto multiple lines + + CodeMaid Insert Region - - Always split all XML tags onto multiple lines + + CodeMaid is cleaning '{0}'... - - Run format comments during cleanup + + CodeMaid Join - - Clear Solution Explorer search filtering to find filtered items + + CodeMaid Move Item Above - - Temporarily open solution folders to find nested items + + CodeMaid Move Item Below - - Synchronize outlining with the code file + + CodeMaid Move Item Into - - Display + + CodeMaid Options - - Show method parameters + + CodeMaid Remove All Regions - - Show item metadata + + CodeMaid Remove Region - - Show item complexity (McCabe) + + CodeMaid Remove Regions - - Warning threshold + + CodeMaid Remove Selected Regions - - Alert threshold + + CodeMaid reorganized '{0}'. - - Sort + + CodeMaid Reorganize for '{0}' - - Primary sort should be by + + CodeMaid: Reorganize Preprocessor Conditionals - - file order + + CodeMaid: Reset - - type + + CodeMaid Sort - - alphabetical + + CodeMaid Spade - - When sorting by type, secondary sort should be by + + CodeMaid turned automatic cleanup on save - - When navigating center on + + CodeMaid was unable to export - - whole item + + CodeMaid was unable to import - - name only + + CodeMaid was unable to reset - - Indentation margin + + Collapse All Solution Explorer + + + Collapse Selected Solution Explorer Collapse solutions when they are opened - - If there is only one project in a solution, keep it expanded but still collapse its children - - - Everything else (ex: .txt, README) - - - Regular expressions that match path names to exclude (ex: \.resx$ or \\lib\\ ) - - - Place each regular expression on a separate line - - - Automatically run cleanup on file save + + Collapsing - - Automatically save and close documents opened by cleanup + + Complexity - - Perform partial cleanup if file is not in the solution + + Conditions - - Insert blank line padding before + + Config files (*.config)|*.config|All Files (*.*)|*.* - - Insert blank line padding between + + {0} contains preprocessor conditionals (e.g. #if, #pragma) which reorganization does not currently support.\r\n\r\nDo you want to reorganize anyways (DANGEROUS)? - - Insert blank line padding after + + dark - - Insert blank space before + + Deploying - - Insert explicit access modifiers on + + Diagnostic - - Insert end of file trailing new line + + Diagnostics - - Select a sub-category to set options. + + Diagnostics mode - - Whitespace + + Digging - - Remove blank lines + + Digging (Spade) - - Remove blank spaces + + Display - - at top of file + + Do you want to perform a partial cleanup? - - after attributes + + Drag to reorder, drag over to group, right click to split, double-click to rename - - after opening braces + + empty - - before closing braces + + Everything else (ex: .txt, README) - - before closing tags + + Exclude - - between chained statements + + Ex: #endregion Methods - - at bottom of file + + Export - - before closing angle brackets + + Ex: #region Public Methods, #region Private Methods - - Remove end of file trailing new line + + External - - Remove end of line whitespace + + Extra indent for values inside XML comments - - Remove multiple consecutive blank lines + + Automatic Cleanup On Save - - Regions + + Features Switch - - Remove regions + + Features - - Update accessors to both be single-line or multi-line (SA1504) + + File Header - - Update #endregion tags with region name + + file order - - Ex: #endregion Methods + + Finding - - Update single line methods by placing braces on separate lines (SA1502) + + Find In Solution Explorer - - File Header + + Font - - Run format document + + Format Comment - - Run remove and sort using statements + + Formatting - - Using statements to re-insert when removed (ex: using System; ) + + General - - Place each using statement on a separate line + + Handled Exception - - Alphabetize members of the same group + + Hide build progress window when a build stops - - Keep members within regions + + Icons - - Place explicit interface members at the end of their group + + If there is only one project in a solution, keep it expanded but still collapse its children - - Primary ordering should be by + + Import - - type then access + + Include - - access then type + + Include access level in regions - - Access levels should be ordered by + + Indentation margin - - Run reorganize at start of cleanup + + Insert - - Cleanup + + Insert blank line padding after - - Conditions + + Insert blank line padding before - - Perform reorganization when preprocessor conditionals are present + + Insert blank line padding between - - Include access level in regions + + Insert blank space before - - Ex: #region Public Methods, #region Private Methods + + Insert end of file trailing new line + + + Insert explicit access modifiers on Insert/keep regions even if they are empty - - Insert - Insert new regions - - Remove + + in the selection - - Remove existing regions + + is not in the solution so some cleanup actions may be unavailable. - - Member type order, grouping and preferred names + + Join Lines - - Split + + Keep members within regions - - Drag to reorder, drag over to group, right click to split, double-click to rename + + Keep XML tags together - - Sets of related file extensions (ex: .cpp .h ) + + light - - Place each set on a separate line + + loading... - - While Cleaning + + Load models asynchronously - - Run JetBrains ReSharper cleanup + + Member type order, grouping and preferred names - - Run Telerik JustCode cleanup + + Metadata - - Run XAML Styler cleanup + + Miscellaneous - - Other cleaning commands (ex: ReSharper.ReSharper_SilentCleanupCode) + + Most Complex - - Place each command on a separate line + + name only - - CodeMaid: Export + + Namespace - - CodeMaid has successfully exported + + Navigation - - to '{0}'. + + New Region - - Successful + + no - - CodeMaid was unable to export + + none - - . See output window for more details. + + to be reset to their defaults? - - Unsuccessful + + Other - - Third Party + + Other cleaning commands (ex: ReSharper.ReSharper_SilentCleanupCode) - - Switching + + Performance - - Reorganizing + + Perform partial cleanup if file is not in the solution - - Types + + Perform reorganization when preprocessor conditionals are present - - Progressing + + Place each command on a separate line - - Formatting + + Place each regular expression on a separate line - - Finding + + Place each set on a separate line - - Digging (Spade) + + Place each using statement on a separate line - - Collapsing + + Place explicit interface members at the end of their group - - File Types + + Preview (reopen to refresh) - - Update + + Primary ordering should be by - - User Settings + + Primary sort should be by - - Solution-Specific Settings + + Progressing - - Automatic + + Read-Only - - External + + Read-Only Toggle - - Exclude + + Rebuilding - - T4 generated code + + refreshing... - - Navigation + + Regions - - Visuals + + Regular expressions that match path names to exclude (ex: \.resx$ or \\lib\\ ) - - ON + + Remove - - OFF + + &Remove All Regions - - Performance + + Remove blank lines - - Miscellaneous + + Remove blank spaces - - Diagnostics + + &Remove Current Region - - Windows taskbar + + Remove end of file trailing new line - - Preview (reopen to refresh) + + Remove end of line whitespace - - ask + + Remove existing regions - - yes + + Remove multiple consecutive blank lines - - no + + Remove Region - - auto-detect + + Remove regions - - dark + + &Remove Selected Regions - - light + + CodeMaid is reorganizing '{0}'... - - none + + Reorganize Active Code - - empty + + Reorganize Active Document - - all + + Reorganizing - - Features Switch + + Types - - Cleanup All Code + + Reset to Defaults - - Cleanup Active Code + + Run format comments during cleanup - - Cleanup Open Code + + Run format document - - Cleanup Selected Code + + Run JetBrains ReSharper cleanup - - Collapse All Solution Explorer + + Run remove and sort using statements + + + Run reorganize at start of cleanup - - Collapse Selected Solution Explorer + + Run Telerik JustCode cleanup - - Digging + + Run XAML Styler cleanup - - Spade Tool Window + + Save - - Find In Solution Explorer + + Search CodeMaid Spade (Ctrl+M, ;) - - Format Comment + + . See output window for more details. - - Automatic Cleanup On Save + + Select a sub-category to set options. - - Remove Region + + Sets of related file extensions (ex: .cpp .h ) - - Join Lines + + OFF - - Reorganize Active Code + + ON - - Sort Lines + + Show build progress on Visual Studio icon in Windows taskbar - - Read-Only + + Show build progress window when a build starts - - Read-Only Toggle + + Show item complexity (McCabe) - - Close All Read-Only + + Show item metadata - - Include + + Show method parameters - - Cleaning + + Show start page when a solution is closed - - Switch File + + Skip during automatic cleanup on save - - Cleanup Active Document + + Skip wrapping on the last word Solution Explorer - - Reorganize Active Document + + Solution-Specific Settings - - Tool Windows + + Sort + + + Sort Lines Spade - - Features - - - Other - - - Complexity - - - Metadata - - - Namespace + + Spade Tool Window - - Most Complex + + Split - - loading... + + Successful - - refreshing... + + S&witch File - - You have pending changes. Do you want to save them before continuing? + + Switch File - - CodeMaid: Confirmation to Save Pending Changes + + Switching - - CodeMaid was unable to reset + + S&witch to - - CodeMaid has successfully reset + + Synchronize outlining with the code file - - CodeMaid: Reset + + T4 generated code - - Unable to reset + + Temporarily open solution folders to find nested items - - Unable to export + + Theme - - CodeMaid has successfully imported {1} from '{0}'. + + Third Party - - Unable to import + + This action cannot be undone. - - CodeMaid was unable to import + + to '{0}'. - - CodeMaid: Confirmation for Reset + + Tool Windows - - to be reset to their defaults? + + type - - Are you sure you want all + + type then access - - This action cannot be undone. + + Unable to export - - was stopped + + Unable to reset - - CodeMaid is cleaning '{0}'... + + Unable to toggle read only state on - - CodeMaid Cleanup for '{0}' + + under the cursor - - CodeMaid cleaned '{0}'. + + Unsuccessful - - CodeMaid is reorganizing '{0}'... + + Update accessors to both be single-line or multi-line (SA1504) - - CodeMaid reorganized '{0}'. + + Update #endregion tags with region name - - CodeMaid Insert Region + + Update single line methods by placing braces on separate lines (SA1502) - - CodeMaid Join + + User Settings - - CodeMaid Move Item Above + + Use undo transactions - - CodeMaid Move Item Below + + Using statements to re-insert when removed (ex: using System; ) - - CodeMaid Move Item Into + + Visuals - - CodeMaid Reorganize for '{0}' + + Warning - - CodeMaid Sort + + Warning threshold - - CodeMaid Delete Items + + was stopped - - CodeMaid Remove All Regions + + When navigating center on - - CodeMaid Remove Selected Regions + + When sorting by type, secondary sort should be by - - CodeMaid Remove Regions + + While Cleaning - - CodeMaid Remove Region + + Whitespace - - CodeMaid: Reorganize Preprocessor Conditionals + + whole item - - {0} contains preprocessor conditionals (e.g. #if, #pragma) which reorganization does not currently support.\r\n\r\nDo you want to reorganize anyways (DANGEROUS)? + + Windows taskbar - - Warning + + Wrap comments at column - - Handled Exception + + yes - - Diagnostic + + You have pending changes. Do you want to save them before continuing? \ No newline at end of file diff --git a/CodeMaid/Properties/Resources.resx b/CodeMaid/Properties/Resources.resx index 0c5f2e34..c51b4215 100644 --- a/CodeMaid/Properties/Resources.resx +++ b/CodeMaid/Properties/Resources.resx @@ -20,13 +20,13 @@ this is my long stringthis is a comment Blue - [base64 mime encoded serialized .NET Framework object] - + [base64 mime encoded serialized .NET Framework object] + - [base64 mime encoded string representing a byte array form of the .NET Framework object] + [base64 mime encoded string representing a byte array form of the .NET Framework object] This is a comment - - + + There are any number of "resheader" rows that contain simple name/value pairs. @@ -117,808 +117,808 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Build Progress + + Unable to import - - Cancel + + Access levels should be ordered by - - Canceling... + + access then type - - Are you ready for CodeMaid to clean everything in the solution? + + Add space inside self closing tags - - Cleanup cannot run while debugging. + + Add spacing around XML tags - - CodeMaid: Cleanup All Code + + after attributes - - CodeMaid: Confirmation for Cleanup All Code + + after opening braces - - CodeMaid: Cleanup External File + + Alert threshold - - Do you want to perform a partial cleanup? + + Align XML &lt;param&gt; tags - - is not in the solution so some cleanup actions may be unavailable. + + all - - CodeMaid Format Comment + + alphabetical - - CodeMaid did not find a non-code comment {0} to reformat. + + Alphabetize members of the same group - - CodeMaid finished formatting the comment. + + Always split all XML tags onto multiple lines - - CodeMaid finished formatting the comments {0}. + + Always split &lt;summary&gt; tags onto multiple lines - - in the selection + + Are you ready for CodeMaid to clean everything in the solution? - - under the cursor + + Are you sure you want all - - Unable to toggle read only state on + + ask - - &Remove All Regions + + at bottom of file - - &Remove Current Region + + at top of file - - &Remove Selected Regions + + auto-detect + + + Automatic + + + Automatically run cleanup on file save + + + Automatically save and close documents opened by cleanup Automatic Cleanup On Save - - - CodeMaid turned automatic cleanup on save + + Batch - - New Region + + before closing angle brackets - - S&witch File + + before closing braces - - S&witch to + + before closing tags - - CodeMaid: Cleanup Progress + + between chained statements - - CodeMaid Spade + + Building - - Search CodeMaid Spade (Ctrl+M, ;) + + Build Progress - - Rebuilding + + Build progress window - - Deploying + + Cache file code models + + + Cancel + + + Canceling... Cleaning - - Building + + Cleaning - - Batch + + File Types - - CodeMaid failed to load theme '{0}'. See output window for more details. + + Update - - Reset to Defaults + + Cleanup - - Export + + Cleanup Active Code - - Import + + Cleanup Active Document - - Save + + Cleanup All Code - - CodeMaid: Import + + Cleanup cannot run while debugging. - - Config files (*.config)|*.config|All Files (*.*)|*.* + + Cleanup Open Code - - CodeMaid Options + + Cleanup Selected Code + + + Clear Solution Explorer search filtering to find filtered items Close - - Theme - - - Font + + Close All Read-Only - - Cache file code models + + CodeMaid cleaned '{0}'. - - Load models asynchronously + + CodeMaid: Cleanup All Code - - Diagnostics mode + + CodeMaid: Cleanup External File - - Show start page when a solution is closed + + CodeMaid Cleanup for '{0}' - - Use undo transactions + + CodeMaid: Cleanup Progress - - Skip during automatic cleanup on save + + CodeMaid: Confirmation for Cleanup All Code - - Icons + + CodeMaid: Confirmation for Reset - - Show build progress window when a build starts + + CodeMaid: Confirmation to Save Pending Changes - - Hide build progress window when a build stops + + CodeMaid Delete Items - - Show build progress on Visual Studio icon in Windows taskbar + + CodeMaid did not find a non-code comment {0} to reformat. - - Build progress window + + CodeMaid: Export - - Wrap comments at column + + CodeMaid failed to load theme '{0}'. See output window for more details. - - General + + CodeMaid finished formatting the comment. - - Skip wrapping on the last word + + CodeMaid finished formatting the comments {0}. - - Extra indent for values inside XML comments + + CodeMaid Format Comment - - Add spacing around XML tags + + CodeMaid has successfully exported - - Add space inside self closing tags + + CodeMaid has successfully imported {1} from '{0}'. - - Keep XML tags together + + CodeMaid has successfully reset - - Align XML &lt;param&gt; tags + + CodeMaid: Import - - Always split &lt;summary&gt; tags onto multiple lines + + CodeMaid Insert Region - - Always split all XML tags onto multiple lines + + CodeMaid is cleaning '{0}'... - - Run format comments during cleanup + + CodeMaid Join - - Clear Solution Explorer search filtering to find filtered items + + CodeMaid Move Item Above - - Temporarily open solution folders to find nested items + + CodeMaid Move Item Below - - Synchronize outlining with the code file + + CodeMaid Move Item Into - - Display + + CodeMaid Options - - Show method parameters + + CodeMaid Remove All Regions - - Show item metadata + + CodeMaid Remove Region - - Show item complexity (McCabe) + + CodeMaid Remove Regions - - Warning threshold + + CodeMaid Remove Selected Regions - - Alert threshold + + CodeMaid reorganized '{0}'. - - Sort + + CodeMaid Reorganize for '{0}' - - Primary sort should be by + + CodeMaid: Reorganize Preprocessor Conditionals - - file order + + CodeMaid: Reset - - type + + CodeMaid Sort - - alphabetical + + CodeMaid Spade - - When sorting by type, secondary sort should be by + + CodeMaid turned automatic cleanup on save - - When navigating center on + + CodeMaid was unable to export - - whole item + + CodeMaid was unable to import - - name only + + CodeMaid was unable to reset - - Indentation margin + + Collapse All Solution Explorer + + + Collapse Selected Solution Explorer Collapse solutions when they are opened - - If there is only one project in a solution, keep it expanded but still collapse its children - - - Everything else (ex: .txt, README) - - - Regular expressions that match path names to exclude (ex: \.resx$ or \\lib\\ ) - - - Place each regular expression on a separate line - - - Automatically run cleanup on file save + + Collapsing - - Automatically save and close documents opened by cleanup + + Complexity - - Perform partial cleanup if file is not in the solution + + Conditions - - Insert blank line padding before + + Config files (*.config)|*.config|All Files (*.*)|*.* - - Insert blank line padding between + + {0} contains preprocessor conditionals (e.g. #if, #pragma) which reorganization does not currently support.\r\n\r\nDo you want to reorganize anyways (DANGEROUS)? - - Insert blank line padding after + + dark - - Insert blank space before + + Deploying - - Insert explicit access modifiers on + + Diagnostic - - Insert end of file trailing new line + + Diagnostics - - Select a sub-category to set options. + + Diagnostics mode - - Whitespace + + Digging - - Remove blank lines + + Digging (Spade) - - Remove blank spaces + + Display - - at top of file + + Do you want to perform a partial cleanup? - - after attributes + + Drag to reorder, drag over to group, right click to split, double-click to rename - - after opening braces + + empty - - before closing braces + + Everything else (ex: .txt, README) - - before closing tags + + Exclude - - between chained statements + + Ex: #endregion Methods - - at bottom of file + + Export - - before closing angle brackets + + Ex: #region Public Methods, #region Private Methods - - Remove end of file trailing new line + + External - - Remove end of line whitespace + + Extra indent for values inside XML comments - - Remove multiple consecutive blank lines + + Automatic Cleanup On Save - - Regions + + Features Switch - - Remove regions + + Features - - Update accessors to both be single-line or multi-line (SA1504) + + File Header - - Update #endregion tags with region name + + file order - - Ex: #endregion Methods + + Finding - - Update single line methods by placing braces on separate lines (SA1502) + + Find In Solution Explorer - - File Header + + Font - - Run format document + + Format Comment - - Run remove and sort using statements + + Formatting - - Using statements to re-insert when removed (ex: using System; ) + + General - - Place each using statement on a separate line + + Handled Exception - - Alphabetize members of the same group + + Hide build progress window when a build stops - - Keep members within regions + + Icons - - Place explicit interface members at the end of their group + + If there is only one project in a solution, keep it expanded but still collapse its children - - Primary ordering should be by + + Import - - type then access + + Include - - access then type + + Include access level in regions - - Access levels should be ordered by + + Indentation margin - - Run reorganize at start of cleanup + + Insert - - Cleanup + + Insert blank line padding after - - Conditions + + Insert blank line padding before - - Perform reorganization when preprocessor conditionals are present + + Insert blank line padding between - - Include access level in regions + + Insert blank space before - - Ex: #region Public Methods, #region Private Methods + + Insert end of file trailing new line + + + Insert explicit access modifiers on Insert/keep regions even if they are empty - - Insert - Insert new regions - - Remove + + in the selection - - Remove existing regions + + is not in the solution so some cleanup actions may be unavailable. - - Member type order, grouping and preferred names + + Join Lines - - Split + + Keep members within regions - - Drag to reorder, drag over to group, right click to split, double-click to rename + + Keep XML tags together - - Sets of related file extensions (ex: .cpp .h ) + + light - - Place each set on a separate line + + loading... - - While Cleaning + + Load models asynchronously - - Run JetBrains ReSharper cleanup + + Member type order, grouping and preferred names - - Run Telerik JustCode cleanup + + Metadata - - Run XAML Styler cleanup + + Miscellaneous - - Other cleaning commands (ex: ReSharper.ReSharper_SilentCleanupCode) + + Most Complex - - Place each command on a separate line + + name only - - CodeMaid: Export + + Namespace - - CodeMaid has successfully exported + + Navigation - - to '{0}'. + + New Region - - Successful + + no - - CodeMaid was unable to export + + none - - . See output window for more details. + + to be reset to their defaults? - - Unsuccessful + + Other - - Third Party + + Other cleaning commands (ex: ReSharper.ReSharper_SilentCleanupCode) - - Switching + + Performance - - Reorganizing + + Perform partial cleanup if file is not in the solution - - Types + + Perform reorganization when preprocessor conditionals are present - - Progressing + + Place each command on a separate line - - Formatting + + Place each regular expression on a separate line - - Finding + + Place each set on a separate line - - Digging (Spade) + + Place each using statement on a separate line - - Collapsing + + Place explicit interface members at the end of their group - - File Types + + Preview (reopen to refresh) - - Update + + Primary ordering should be by - - User Settings + + Primary sort should be by - - Solution-Specific Settings + + Progressing - - Automatic + + Read-Only - - External + + Read-Only Toggle - - Exclude + + Rebuilding - - T4 generated code + + refreshing... - - Navigation + + Regions - - Visuals + + Regular expressions that match path names to exclude (ex: \.resx$ or \\lib\\ ) - - ON + + Remove - - OFF + + &Remove All Regions - - Performance + + Remove blank lines - - Miscellaneous + + Remove blank spaces - - Diagnostics + + &Remove Current Region - - Windows taskbar + + Remove end of file trailing new line - - Preview (reopen to refresh) + + Remove end of line whitespace - - ask + + Remove existing regions - - yes + + Remove multiple consecutive blank lines - - no + + Remove Region - - auto-detect + + Remove regions - - dark + + &Remove Selected Regions - - light + + CodeMaid is reorganizing '{0}'... - - none + + Reorganize Active Code - - empty + + Reorganize Active Document - - all + + Reorganizing - - Features Switch + + Types - - Cleanup All Code + + Reset to Defaults - - Cleanup Active Code + + Run format comments during cleanup - - Cleanup Open Code + + Run format document - - Cleanup Selected Code + + Run JetBrains ReSharper cleanup - - Collapse All Solution Explorer + + Run remove and sort using statements + + + Run reorganize at start of cleanup - - Collapse Selected Solution Explorer + + Run Telerik JustCode cleanup - - Digging + + Run XAML Styler cleanup - - Spade Tool Window + + Save - - Find In Solution Explorer + + Search CodeMaid Spade (Ctrl+M, ;) - - Format Comment + + . See output window for more details. - - Automatic Cleanup On Save + + Select a sub-category to set options. - - Remove Region + + Sets of related file extensions (ex: .cpp .h ) - - Join Lines + + OFF - - Reorganize Active Code + + ON - - Sort Lines + + Show build progress on Visual Studio icon in Windows taskbar - - Read-Only + + Show build progress window when a build starts - - Read-Only Toggle + + Show item complexity (McCabe) - - Close All Read-Only + + Show item metadata - - Include + + Show method parameters - - Cleaning + + Show start page when a solution is closed - - Switch File + + Skip during automatic cleanup on save - - Cleanup Active Document + + Skip wrapping on the last word Solution Explorer - - Reorganize Active Document + + Solution-Specific Settings - - Tool Windows + + Sort + + + Sort Lines Spade - - Features - - - Other - - - Complexity - - - Metadata - - - Namespace + + Spade Tool Window - - Most Complex + + Split - - loading... + + Successful - - refreshing... + + S&witch File - - You have pending changes. Do you want to save them before continuing? + + Switch File - - CodeMaid: Confirmation to Save Pending Changes + + Switching - - CodeMaid was unable to reset + + S&witch to - - CodeMaid has successfully reset + + Synchronize outlining with the code file - - CodeMaid: Reset + + T4 generated code - - Unable to reset + + Temporarily open solution folders to find nested items - - Unable to export + + Theme - - CodeMaid has successfully imported {1} from '{0}'. + + Third Party - - Unable to import + + This action cannot be undone. - - CodeMaid was unable to import + + to '{0}'. - - CodeMaid: Confirmation for Reset + + Tool Windows - - to be reset to their defaults? + + type - - Are you sure you want all + + type then access - - This action cannot be undone. + + Unable to export - - was stopped + + Unable to reset - - CodeMaid is cleaning '{0}'... + + Unable to toggle read only state on - - CodeMaid Cleanup for '{0}' + + under the cursor - - CodeMaid cleaned '{0}'. + + Unsuccessful - - CodeMaid is reorganizing '{0}'... + + Update accessors to both be single-line or multi-line (SA1504) - - CodeMaid reorganized '{0}'. + + Update #endregion tags with region name - - CodeMaid Insert Region + + Update single line methods by placing braces on separate lines (SA1502) - - CodeMaid Join + + User Settings - - CodeMaid Move Item Above + + Use undo transactions - - CodeMaid Move Item Below + + Using statements to re-insert when removed (ex: using System; ) - - CodeMaid Move Item Into + + Visuals - - CodeMaid Reorganize for '{0}' + + Warning - - CodeMaid Sort + + Warning threshold - - CodeMaid Delete Items + + was stopped - - CodeMaid Remove All Regions + + When navigating center on - - CodeMaid Remove Selected Regions + + When sorting by type, secondary sort should be by - - CodeMaid Remove Regions + + While Cleaning - - CodeMaid Remove Region + + Whitespace - - CodeMaid: Reorganize Preprocessor Conditionals + + whole item - - {0} contains preprocessor conditionals (e.g. #if, #pragma) which reorganization does not currently support.\r\n\r\nDo you want to reorganize anyways (DANGEROUS)? + + Windows taskbar - - Warning + + Wrap comments at column - - Handled Exception + + yes - - Diagnostic + + You have pending changes. Do you want to save them before continuing? \ No newline at end of file diff --git a/CodeMaid/Properties/Resources.zh-Hans.resx b/CodeMaid/Properties/Resources.zh-Hans.resx index a2fe0ca1..c8d9cfd1 100644 --- a/CodeMaid/Properties/Resources.zh-Hans.resx +++ b/CodeMaid/Properties/Resources.zh-Hans.resx @@ -20,12 +20,12 @@ this is my long stringthis is a comment Blue - [base64 mime encoded serialized .NET Framework object] - + [base64 mime encoded serialized .NET Framework object] + - [base64 mime encoded string representing a byte array form of the .NET Framework object] + [base64 mime encoded string representing a byte array form of the .NET Framework object] This is a comment - + There are any number of "resheader" rows that contain simple name/value pairs. @@ -117,263 +117,413 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 生成进度 + + 无法导入 - - 取消 + + 访问级别排序应按 - - 移除全部 #regions(&R) + + 访问级别 优先于 类型 - - 移除当前 #region(&R) + + 在自闭标签中添加空格 - - 移除已选 #regions(&R) + + 在 XML 标记周围添加间距 - - 保存 + + 特性后 - - 导出 + + 打开大括号后 - - 导入 + + 警报阈值 - - 重置为默认 + + 对齐 XML <param> 标记 + + + 全部 + + + 字母 + + + 按字母排序同一组内成员 + + + 始终将所有 XML 标记拆分为多行 + + + 始终将 <summary> 标签分到多行 + + + 你准备好使用CodeMaid 清理解决方案中的所有代码了吗? + + + 您确定要所有 + + + 询问 + + + 在文件底部 + + + 在文件顶部 + + + 自动检测 + + + 自动 + + + 在文件保存时自动清理 + + + 自动保存和关闭执行清理时打开的文档 + + + 保存时自动清理 - 批量 + + 关闭尖括号前 + + + 关闭大括号前 + + + 在结束标记之前 + + + 在链接语句之间 + 正在生成 - - 正在清理 + + 生成进度 - - 正在部署 + + '生成进度'窗口 - - 正在重新生成 + + 缓存文件代码模型 - - CodeMaid 码锹窗口 + + 取消 正在取消... - - 搜索码锹窗口 + + 正在清理 - - 在鼠标下方 + + 清理 - - 所选内容 + + 文件类型 - - 你准备好使用CodeMaid 清理解决方案中的所有代码了吗? + + 更新 + + + 清理 + + + 清理活动代码 + + + 清理活动文档 + + + 清理所有代码 调试时无法运行清理。 + + 清理打开的代码 + + + 清理已选代码 + + + 清除解决方案资源管理器搜索以查找被筛选掉的项目 + + + 关闭 + + + 关闭所有只读 + + + CodeMaid 已清理 "{0}"。 + CodeMaid: 清理所有代码 - - CodeMaid: 确认清理所有代码 - CodeMaid: 清理外部文件 - - 是否要执行部分清理? + + 针对"{0}" 的 CodeMaid 清理 - - 不在解决方案中, 因此某些清理操作可能不可用。 + + CodeMaid: 清理进度 - - CodeMaid 格式化注释 + + CodeMaid: 确认清理所有代码 + + + CodeMaid: 确认重置 + + + CodeMaid: 确认保存挂起的更改 + + + CodeMaid 删除条目 CodeMaid 未找到非代码注释 {0} 以重新格式化。 + + CodeMaid: 导出 + + + CodeMaid 未能加载主题 "{0}"。 有关详细信息, 请参阅输出窗口。 + CodeMaid 完成了此注释的格式化。 CodeMaid 完成了注释 {0} 的格式化。 - - 无法切换只读状态 + + CodeMaid 格式化注释 - - CodeMaid: 导入 + + CodeMaid 已成功导出 - - 配置文件 (*.config)|*.config|所有文件 (*.*)|*.* + + CodeMaid 已成功从 "{0}" 导入 {1}。 - - CodeMaid 未能加载主题 "{0}"。 有关详细信息, 请参阅输出窗口。 + + CodeMaid 已成功重置 - - CodeMaid: 清理进度 + + CodeMaid: 导入 - - 切换至(&W) + + CodeMaid 插入区域 - - 切换文件(&W) + + CodeMaid 正在清理 "{0}"... - - 新建 #region + + CodeMaid 连接 - - CodeMaid 已开启保存时自动清理 + + CodeMaid 条目上移 - - 保存时自动清理 - + + CodeMaid 条目下移 + + + CodeMaid 将条目移动到 CodeMaid 选项 - - 关闭 + + CodeMaid 删除所有 #region - - 主题 + + CodeMaid 删除 #region - - 字体 + + CodeMaid 删除 #region - - 当执行自动清理时跳过 + + CodeMaid 删除选定 #region - - 图标 + + CodeMaid 整理了 "{0}"。 - - 使用撤消事务 + + CodeMaid 针对"{0}" 整理 - - 关闭解决方案时显示起始页 + + CodeMaid: 整理预处理器条件 - - 诊断模式 + + CodeMaid: 重置 - - 异步加载模型 + + CodeMaid 排序 - - 缓存文件代码模型 + + CodeMaid 码锹窗口 - - 在 Windows 任务栏中的 Visual Studio 图标中显示生成进度 + + CodeMaid 已开启保存时自动清理 - - 在生成停止时隐藏'生成进度'窗口 + + CodeMaid 无法导出 - - 在生成开始时显示'生成进度'窗口 + + CodeMaid 无法导入 - - '生成进度'窗口 + + CodeMaid 无法重置 - - 注释最大列长度 (当长度达到时强制换行) + + 折叠所有解决方案资源管理器 - - 常规 + + 折叠选定的解决方案资源管理器 - - 在 XML 标记周围添加间距 + + 在打开解决方案时将其折叠 - - 在自闭标签中添加空格 + + 折叠 - - 将 XML 标记放在一起 + + 复杂度 - - 对齐 XML <param> 标记 + + 条件 - - 始终将 <summary> 标签分到多行 + + 配置文件 (*.config)|*.config|所有文件 (*.*)|*.* - - 始终将所有 XML 标记拆分为多行 + + {0} 包含当前整理不支持的预处理器条件 (例如 #if、#pragma)。 \n 是否仍要整理 (危险)? - - 在清理过程中格式化注释 + + 深色 - - 清除解决方案资源管理器搜索以查找被筛选掉的项目 + + 正在部署 - - 显示项目复杂性 (McCabe) + + 诊断 - - 显示项目元数据 + + 诊断 - - 显示方法参数 + + 诊断模式 + + + 代码视图 + + + 码锹 显示 - - 将大纲与代码文件同步 + + 是否要执行部分清理? - - 临时打开解决方案文件夹以查找嵌套项目 + + 拖动可重新排序, 拖放到另一项上可分组, 右键单击可拆分, 双击可重命名 - - 警告阈值 + + - - 警报阈值 + + 所有其他内容 (比如: .txt, README) - - 排序 + + 排除 - - 主要排序应为 + + 例如: #endregion 方法 + + + 导出 + + + 例如: #region 公共方法, #region 私有方法 + + + 外部 + + + XML 注释内部值的额外缩进 + + + 保存时自动清理 + + + 功能开关 + + + 功能 + + + 文件头 文件顺序 - - 类型 + + 查找 - - 字母 + + 在解决方案资源管理器中查找 - - 按类型排序时, 次要排序应为 + + 字体 - - 当导航中心在 + + 格式化注释 - - 整个项目 + + 格式化 - - 仅名称 + + 常规 + + + 处理异常 + + + 在生成停止时隐藏'生成进度'窗口 + + + 图标 + + + 如果解决方案中只有一个项目, 保持展开但子项任然折叠 + + + 导入 + + + 包含 + + + 在 #regions 中包括访问级别 缩进边距 - - 在文件保存时自动清理 - - - 自动保存和关闭执行清理时打开的文档 + + 插入 - - 如果文件不在解决方案中, 则执行部分清理 + + 在之后插入空行 在前面插入空行 @@ -381,544 +531,394 @@ 在之间插入空行 - - 在之后插入空行 - 在前面插入空格 - - 插入显式访问修饰符 - 在文件结尾插入新行标记(EOF) - - 选择一个子类别进行设置。 + + 插入显式访问修饰符 - - 空白 + + 插入/保留 #regions (即使它们是空的) - - 删除空行 + + 插入新 #regions - - 删除空格 + + 所选内容 - - 在文件顶部 + + 不在解决方案中, 因此某些清理操作可能不可用。 - - 特性后 + + 连接多行 - - 打开大括号后 + + 保留 #regions 内的成员 - - 关闭大括号前 + + 将 XML 标记放在一起 - - 在结束标记之前 + + 浅色 - - 在链接语句之间 + + 正在加载... - - 在文件底部 + + 异步加载模型 - - 关闭尖括号前 + + 成员类型顺序、分组和首选名称 - - 在打开解决方案时将其折叠 + + 元数据 - - 如果解决方案中只有一个项目, 保持展开但子项任然折叠 + + 杂项 - - 所有其他内容 (比如: .txt, README) - - - 排除与以下正则表达式相匹配的路径 (例如: \.resx$ or \\lib\\ ) + + 最复杂 - - 每个正则表达式一行 + + 仅名称 - - XML 注释内部值的额外缩进 + + 命名空间 - - 删除文件结尾新行标记(EOF) + + 导航 - - 删除行尾空白 + + 新建 #region - - 删除多个连续的空行 + + - - #regions + + - - 删除 #regions + + 重置为默认值? - - 将访问器更新为单行或多行 (SA1504) + + 其它 - - 使用 #region 名称更新 #endregion 标记 + + 其他清理命令 (比如: ReSharper ReSharper_SilentCleanupCode) - - 例如: #endregion 方法 + + 性能 - - 通过在单独的行上放置大括号来更新单行方法 (SA1502) + + 如果文件不在解决方案中, 则执行部分清理 - - 文件头 + + 在存在预处理器条件时执行整理 - - 运行 '设置文档的格式' + + 每个命令一行 - - 运行 '对 Using 进行删除和排序' + + 每个正则表达式一行 - - 当被删除时,重新插入以下 Using 语句 (如: using System;) + + 每个设置一行 每个 Using 语句一行 - - 按字母排序同一组内成员 - - - 保留 #regions 内的成员 - 在其组的末尾放置显式接口成员 + + 预览 (重新打开以刷新) + 主要排序应由 - - 类型 优先于 访问级别 + + 主要排序应为 - - 访问级别 优先于 类型 + + 进度 - - 访问级别排序应按 + + 只读 - - 在清理开始时执行整理 + + 只读切换 - - 清理 + + 正在重新生成 - - 条件 + + 正在刷新... - - 在存在预处理器条件时执行整理 + + #regions - - 在 #regions 中包括访问级别 + + 排除与以下正则表达式相匹配的路径 (例如: \.resx$ or \\lib\\ ) - - 例如: #region 公共方法, #region 私有方法 + + 删除 - - 插入/保留 #regions (即使它们是空的) + + 移除全部 #regions(&R) - - 插入新 #regions + + 删除空行 - - 删除 + + 删除空格 + + + 移除当前 #region(&R) + + + 删除文件结尾新行标记(EOF) + + + 删除行尾空白 删除现有 #regions - - 当最后一个词超出注释长度时,不强制换行 + + 删除多个连续的空行 - - 插入 + + 删除 #region(s) - - 成员类型顺序、分组和首选名称 + + 删除 #regions - - 拆分 + + 移除已选 #regions(&R) - - 拖动可重新排序, 拖放到另一项上可分组, 右键单击可拆分, 双击可重命名 + + CodeMaid 正在整理 "{0}"... - - 关联的文件扩展名 (例如: .cpp .h ) + + 整理活动文档 - - 每个设置一行 + + 整理活动文档 - - 清理时 + + 整理 + + + 类型 + + + 重置为默认 + + + 在清理过程中格式化注释 + + + 运行 '设置文档的格式' 运行 JetBrains ReSharper 清理 + + 运行 '对 Using 进行删除和排序' + + + 在清理开始时执行整理 + 运行 Telerik JustCode 清理 运行 XAML Styler清理 - - 其他清理命令 (比如: ReSharper ReSharper_SilentCleanupCode) - - - 每个命令一行 - - - CodeMaid: 导出 - - - CodeMaid 已成功导出 - - - 到 "{0}"。 - - - 成功 + + 保存 - - CodeMaid 无法导出 + + 搜索码锹窗口 . 有关详细信息, 请参阅输出窗口。 - - 未成功 + + 选择一个子类别进行设置。 - - 第三方 + + 关联的文件扩展名 (例如: .cpp .h ) - - 切换 + + - - 整理 + + - - 类型 + + 在 Windows 任务栏中的 Visual Studio 图标中显示生成进度 - - 进度 + + 在生成开始时显示'生成进度'窗口 - - 格式化 + + 显示项目复杂性 (McCabe) - - 折叠 + + 显示项目元数据 - - 码锹 + + 显示方法参数 - - 更新 + + 关闭解决方案时显示起始页 - - 查找 + + 当执行自动清理时跳过 - - 文件类型 + + 当最后一个词超出注释长度时,不强制换行 - - 用户设置 + + 解决方案资源管理器 解决方案特定设置 - - 自动 - - - 外部 - - - 排除 - - - T4 生成的代码 - - - 导航 - - - 视觉 - - - - - - - - - 性能 - - - 杂项 - - - 诊断 - - - Windows 任务栏 - - - 预览 (重新打开以刷新) - - - 询问 - - - - - - - - - 自动检测 - - - 深色 - - - 浅色 - - - - - - - - - 全部 - - - 清理所有代码 - - - 清理活动代码 - - - 清理打开的代码 - - - 清理已选代码 - - - 折叠所有解决方案资源管理器 - - - 折叠选定的解决方案资源管理器 - - - 代码视图 - - - 码锹窗口 - - - 格式化注释 - - - 在解决方案资源管理器中查找 - - - 保存时自动清理 - - - 删除 #region(s) - - - 连接多行 - - - 整理活动文档 + + 排序 排序多行 - - 只读 - - - 只读切换 - - - 关闭所有只读 - - - 功能开关 - - - 包含 - - - 清理 - - - 切换文件 - 码锹窗口 - - 功能 - - - 工具窗口 + + 码锹窗口 - - 整理活动文档 + + 拆分 - - 解决方案资源管理器 + + 成功 - - 清理活动文档 + + 切换文件(&W) - - 其它 + + 切换文件 - - 复杂度 + + 切换 - - 元数据 + + 切换至(&W) - - 命名空间 + + 将大纲与代码文件同步 - - 最复杂 + + T4 生成的代码 - - 正在加载... + + 临时打开解决方案文件夹以查找嵌套项目 - - 正在刷新... + + 主题 - - 您有挂起的更改。 是否要在继续之前保存它们? + + 第三方 - - CodeMaid: 确认保存挂起的更改 + + 无法撤消此操作。 - - CodeMaid 无法重置 + + 到 "{0}"。 - - CodeMaid 已成功重置 + + 工具窗口 - - CodeMaid: 重置 + + 类型 - - 无法重置 + + 类型 优先于 访问级别 无法导出 - - CodeMaid 已成功从 "{0}" 导入 {1}。 - - - 无法导入 - - - CodeMaid 无法导入 - - - CodeMaid: 确认重置 - - - 重置为默认值? - - - 您确定要所有 - - - 无法撤消此操作。 - - - 被停止 + + 无法重置 - - CodeMaid 正在清理 "{0}"... + + 无法切换只读状态 - - 针对"{0}" 的 CodeMaid 清理 + + 在鼠标下方 - - CodeMaid 已清理 "{0}"。 + + 未成功 - - CodeMaid 正在整理 "{0}"... + + 将访问器更新为单行或多行 (SA1504) - - CodeMaid 整理了 "{0}"。 + + 使用 #region 名称更新 #endregion 标记 - - CodeMaid 插入区域 + + 通过在单独的行上放置大括号来更新单行方法 (SA1502) - - CodeMaid 连接 + + 用户设置 - - CodeMaid 条目上移 + + 使用撤消事务 - - CodeMaid 条目下移 + + 当被删除时,重新插入以下 Using 语句 (如: using System;) - - CodeMaid 将条目移动到 + + 视觉 - - CodeMaid 针对"{0}" 整理 + + 警告 - - CodeMaid 排序 + + 警告阈值 - - CodeMaid 删除条目 + + 被停止 - - CodeMaid 删除所有 #region + + 当导航中心在 - - CodeMaid 删除选定 #region + + 按类型排序时, 次要排序应为 - - CodeMaid 删除 #region + + 清理时 - - CodeMaid 删除 #region + + 空白 - - CodeMaid: 整理预处理器条件 + + 整个项目 - - {0} 包含当前整理不支持的预处理器条件 (例如 #if、#pragma)。 \n 是否仍要整理 (危险)? + + Windows 任务栏 - - 警告 + + 注释最大列长度 (当长度达到时强制换行) - - 处理异常 + + - - 诊断 + + 您有挂起的更改。 是否要在继续之前保存它们? \ No newline at end of file From f7b450a3ce156830d556316da18e165788ac85c9 Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 2 Jun 2018 13:26:06 +0000 Subject: [PATCH 67/71] Update about images for v10.5. --- CodeMaid/Integration/Images/about.png | Bin 50210 -> 51097 bytes CodeMaid/Integration/Images/about.xcf | Bin 109056 -> 189516 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/CodeMaid/Integration/Images/about.png b/CodeMaid/Integration/Images/about.png index 921de4ec8d208e1a2610973c7860553d97a07967..f25b8cffc4fb1a0d17e863d8fa8e53b665826633 100644 GIT binary patch literal 51097 zcmb5Wby!tv*EPQBl$P!kq(RuUv~-9_NsEAVNq2XLl$1(Imvn=alyq*SQ>5#6?{l8# zz1}~5-*tW8Ig4}7UT*eY>%QllW6UwfIuYus@{cgdF(DAhBZU_-nh*$*9Rz}aj*be> zu$XALJLulk<@aZ-*5HMA$s@g;^AO-H(U0TE{Y5akt5n7o?voMx@|p$LLdGg}xQhq@In845O)G(TwpPrkk(2(Fx%c>upEunCJthf&;(2UbXrezxuvo zCm@M1w)OqGx^s7Tck;th){)PsPb@ntt3roLU|`^LJY>m#k42AYxq`o0bk6^C#>M_c zBmRH?*u`0Ai>5D*Mva&bJ&^XFV;j}`;qGF>IpdVNp{$I(8s|TsgeN0ND<<~F^N_$% z$?$B&oa#UCrwzCBZ=ZA~Sv$}57)x;d@5j)7N5E<@_aL^rL;Okw`Jd1D5LBW_@ZWEb zcVPIRxBst;`ahh;V_f|Id-wmvX>y@(GXGb`-^9r~B_&rq3_Up{ z@q$lVx=ux*U>zJuiTNN%oH;#KkI`zDVy%y#*naKn#FDca771#!kx<^HiJB|uqy27g z#7qC5TaoEkyiGG9otmCm>xapoj9eu_=hTDt0+HeeA(9Yx96ZPqBJ^Y)9a8)_*^99N z&0-gY5PI}Lha5ARHH(_LpMw0@_G)do@13eEM>H{VOdw%M7NG$d4X}@c;jnk5C%KD! zja+W%)a1hCL1;LP(*Hy(Mnm&V1_6yz6D4m3c19Sk>B0CNbXo_A!7h?N7R|kFN7e~7 zeuzhVCx}EYw!3G1@TVoe1C-KO_gW7<&{DTWh!SVkMnEPsWG%&tFTv%S@t4s^@8cru z$~lBsBy(Q=0Wt%JbPe}4sK8cs|Kg<#dpb7?U1z7c@;`yO=5_&9hjg5Zn)8xvI0-p% z8THNk=+0`pK2CAqmz|+Bm~2m+*0nUp-b9l%vHOAiH!c>no0~gxM4c_gTnFsxI%UKb z6vv{5%(@7ZPwtDczc^8Dwn*%O_t_YhEDjC?t;QhsX$wl}C{1@xm#C**5%FJRQZ9hf{WGJJCnsjhu>!gN^SOm@4ppKnxli&x)`nLU~S`4cg>HF+c zOUYFt>JKwc7;+rej(aNa#&F}r=_?5H#onKZi&lbP$P#6V|G4Bh^C6#!F0r7s{c5?& zUgiF(>c$^!C=|`Op*cz*g@8^pXa+61V>tOlosFn+;lP*_6*EN2sqaNCKJuDEEdr#Q zJAUZ5`V%5!U1G%|&3TH2*;(`ysR$NL&8iL-Y^MxL<4oBpC{E>^1_$)GsEP>d;S|G- zQv5k8Gq{&`?d5p1BJY)pQe#v63byG?4`*te*sxK#~Hlj0(v!Z!gv>)Fc|5?>Y z=Qd4d{0Y(&97LEXVCP;XF{0mg`%+PZ<1}l>l3L#$;*3x$OU0%t4zv1#`7xD>naY3BglpA4G9+ajm&jI8b~i zBU-llVoAtgyYlv^*PgFoHPF~3|>pGANV7WDa z5EdyAAdeHDFcV9g>JnpyAd<(RfyW|Q@n<&J7oWGeW1~F_5 z`}N76cY6-y`GK4C|0ct)8re+6qOJyAiM6^r5p{NF{*)zRrCUMy;^*uv{S)KGq+*Qt zycx;_wx*tp7y^N`!t~2Mt#7PYUmsB2+NpsCo1a)@paS{ zHp{_#at#0T9X|L`@lZ+}5KLK6XVi9yOTrSJJl2WLN2wt+{tuB95mnvtfJCr{C=_cc z2F8@ggH4-TSBc(unxe?M%N!}l(t6@8=n38 zvY^_!3TK*hC);sU0&DtkG2|^)(E|!X<=lzN8a`3KA~z0q z6IV$tFa{x6@rVWHag2lWP|_I4E8AY`#6VhF&hIpvD6#>zo>0b5vjbk%k&ArjVK?-s!_NMy7ZYXE@@#-qP?Erw$ch2|bu6V&AXnQZVoFL1D8f`F--I1jpSPU! zQJ4?A(br=-94ZYuW-+dUYo?}34aQ=r)+jSZXzpH+!GKb_Kip~*#;MAgyCeTMYTa%e zmlxb%eUHk7UD0tQEj^4VhUg=c){3WCHBa!jb`v&!;vuW+=!6$3rRA5EVFRRQOTmOE zp<>iDp1w3^S`v@Qlf{ppOFzpkvZefBYW|d$hX5#vJ7XcueZLNRj!DaxP!VWyjp(n# zTYSH)_V|A>hjH;R8dN%jW;M!Q*3Jp1S`}s_h9nac7sP8>IS_(hr>#lG<+@^M{bBua z1%-t@MUu601p#{Hc4-cKlV5PjY6yEN`W+M9`7%ddQ1KGUU%WQ1=$dz`P|SRk`2+LV z;MHR(X{jf>fCEb6HAFOv$Egw7ntn8wmPQgE6N9zxw}%Jz>NFAK7JgR9S7E4#14@{07sD~Mv5Xzk>=dGbo2y%12YJ71W>sXwXxtzaB z#Y#CAEg?goxY%bb_z$mH2s+KdZC=93P!45yrv^i|w|h3vOyci>!LYWs_f$ygAc7jN zXGzM*i8se%lPowiRIz9yn?$)sifn|&bkIY?;ivETD4~76J8?m-Y06-L#`uf3K6-Y; zk03ZWxsQ#ce0;=4KETt;F|%>+C6nyQrUR4~9g+8Rw43f7L|@5kVdI5GT{@Hv1Hfs) zxH=C(;Bg=*?@C;)!9vcPpGry;ozBHLTn5Z}H-7(KYd&gA>iJ08`+3?C6~! zfa(bSOiX%`W+tc3h=_#L>6kTz>Q5U!+G$bKX(OOys#2^Kc#&EyzgX=Kk{EEH$nSGD z0@$&!o$>if(0<{T3s;ysQCD>JpZBDslezhJ!B|X8Ozw^+rY+yiF?e}-2WVBN^f?B; zdt*p!mwY3vKO?|Sq_|;~O{D$4dCyqo=GBv#&bgDtYgMJg%}!6g8#QBWRr~_O zzh*}9czfiitYIW%Zf?%q{Dv=GXEg;z)L?tA=YNaiJ8NTyVtf3K-z zuwk6BYA8X-aI*s;vQ`E~(N%3jLPA17bToFEQ9JdcN001GM>1rih!q~%Ek?)z#aSI> z$!&SxukGzE%IkL>VOO2mB7S8E|9PDz^{c8i&u{)rO!MZE3%)IVJ9$E2#VB>Z*A4H< zSaqIcDLo<7#^&CMCt*Vi3xFHf}N#C&g|-~}ET+1zL6wA563kc=K49-!sQ_FP(T zS_m4qO#b#oL@U^(El0mDuBP0JEld$}T)tdVPdRJGY{CppdW5aAfjgHO8o2#d-7zr} zU$D7*oX950gT&4kG04HkA!(gyTn%_dySM%m-^u>%UESTHozCXUY`ZjvDFXVi@8iZTVcFW7h=lG`w zV`nSE%IbxR3JL_&Q@UuGdVAOA-sScN1fiV_8Qo8m zKZ&a8xSo-xX}Vj!`aUnMs){4NR6BU!IWalO^X|}~BDeQSczqql^Wo4SOW1>e#^-Os zP}5&eu^hw7PyGiH!-85S?(U4U#Pn;5LQ&&B1qtuVJ`KjeHvwmSbJyz_Pw%PV=)fu# zs&KislM^6$o|*217tJT4xPEo0czPcxP-b<7pkW0wSPg}Rj4cgLOo~cMt&t@Y6PlDF zou)YK&Y(Q3!(cpcCU~})N!^=y>I&aX)m-rdH_jNjps6V>WHdBbZ*LTj#c;a7m-=O^ zvMi+gAHNoqE{mtW3S`&~Jqx+Hf@NZT!P|s|8O13`KlsxkTh=yezmDP>qwe>ispz`7 z5Q`2Ai}@UpN^6IYNs-68&YU(x_x>$k*sTQ{KD;6HEU+ZJIE+jXtkXpCi1JiMO`!#x zZt3v>1@q^kwY`eAKi3aNerJ!tE04Q}tSn0Nw{O={UK?6fHRxMgv*n~q(C7=;+nv_= zwAf`cx{J!@15gxg`_dT4!N&GuuL%Z&<<0DgVYZJlg1SHdG?Nn8_!8oa z)}6C!;<3jxG;tfrL$ zb@@`JOt>)&(2)joC1y(kJH0woJu;-I=&*i6J49m`6_CRi=g|YVr@K^?Gi)k9uEh_w z962WquJ%_8%2Lnl*%pjjIvfpWKpl=hDV5MeD536n7o%Bori>gP~EyggQDp zHae_HWd;vR*S!0nqtn{##FWaZ8wkMidBu!bPdGk$T=;Vx9a0d4dhFH{8T(_Sed{Df zHm4_M{V~##lAUj+R}BU$xkdKNso%k<)N7Xddz%G0@$C<kLFmd;z%r?Dw}=+U15zyL&78P1OrNp9cnBcwf)GgS!4-y;eL ze-S08?@2Gtt1uf})F6b;&Q4o#ad!4H>6>j&ULSsPBGQTm&#dvO@NNH3cFs#CzP^pi z>S}}>K-k@DOj^(S^Hsa}r&@6z({j{l=jm4qX!4s1DIFc1xWzHLdU3ppH;esJ_&vD? z-796BiuETpBwIg%WQOVq`Zd&aw;gjPdjeHZosslP=lN;5FTc&MFcW~tY;1&@zk8>Y zkh8yU1Mr}ZJY!<-Oy|2xv3~8hW?I9v%O*pwJJ;mYRMVMnZ`|QE6jVmHtGdj2jgacR zytQwcW&~1QRadvg+HuV;t&}@RXdg27>}qxLUOm}~gNxF8>6Y*B`MSBcOV1IMmme%= ze`7l-RnU7}hTH9ZC5@3Idi=Q4l0Uzth4Ss&w*Xly^~ymf3Bm}d$kvUe>Q6ptvE@zf ztR5Z3wfWr8KY4;qM@JVP8M*ssWV>OZnDgmVX)CK@^Dn!*)`Q|WVbYQ00O4P;J+9T` zxV^i>fBZNkJ{~VPB!mv|L-qwPI~qwmbxqAcz#z4>v_3U9lGfGLCE7w`gJ{t?-A+zU zBth-WFDSq#CyyK$7;r03z0eYgxJcgV;-nIMe{rAytJ3Eb8ut06e&@D9IpHIwq!~B~=R#4`5x?ZbDmdOi3gg8N*#8vcVH7& zp`&lvp%>fE^|(XTiMHUgy1Kdmjf&XVFlS_Drsw9a>|a9CE`6NF`KBvJ%u8Ke-G6=E zREM1ysLJ5#NCJ+4XmmiIH24Vwz_fLq78~eOqqes#v8hE#&H7_yAMWqGdJQ!6^`jOS z4L}GNeEo`ER8+*Bp}Y!JC0AM(`?aV#Y8Gxn3Is6Fygx}%1poYdut0*3kN-kdRZdE( zi;6}b=uG(C^WTLHY6TFZ)9!4eu@U0wc=?F{W9C3UL}gaXiT3lp%+ne!s9UzBpZucM z4^RGIWxBR(>P{l=x3Al+Uuqd9sql2^Deq<8YUnZ6sv@zgIN<{f<^Ynh~KKpXD!w%9B1^cp|QoEDwHbNXmm8nY8 zsRa9yFr)IH?up7RXA7T@67kIr6Tj!4?uLW$J6E9}PucK%`QH3dE$7|Z+%&y7T!MQ3 zee&bS4`Y6ElZJ)PYIdE}6zv;V;q0i>gTXwP&@B(JwCT#sQ&Ur`6Gci;mu1_;n4^L zA8zs(u+P2XAPuTjoHZ6c+Ln}*IGpe6Qi{6cAs`@-3fPcpYHD%=jJKolc*4Qa8z*re z-W`Su+np}uCdIa^*C?Ilbh8>1aBHR#$b58mcJ_powG&Rix^X3F1q6r(2M57b@wy1V ziOXb&r51|>p|*B;0&DcW6D}z&E&4^5pAGJ@Ps4d_^AXT*LAxFrimIipy}mJ+G%z?Q z`TRMAfRHdDIXT!7*0-ch$A~F#VwC#Uv8oaM6+5Ik?XP2~#{fOk?2Dg){-1#MKx7&im6V%+g1fLpd}>xhu;z4AkVjlvR>+<(SnNG;L9`FlJcBhE|+2r2o|Y z>V^yd(=XHeuT>kagvb~Tu~7o=04C8P1fXxewKV_j-@P{IEMJERbvWer#V2-?|8@sx z@#R_=jl*gO0x32sNG^~LmF!sAsw`sf?6p1Lv;O$?kzs59CmA-X)~i=*!x?Aw;7Z*3-`!jk00oaY z3I)tG3V7X;8;?WY7;`fSq=qk>();G6d~NXsN!CxO-4jCRnq7I8h-fe zXk_vjIh%$0M}Q=D%)9QjEDMg#Os4Mrsi$$c`tw_-$`nPrOef$=uJ8OoBOs#iDgsDR zM3eK@_ts@g{w@HJ`T2--uC4<^LqXc5u7sc0pNSa34oY%7N~2@;<6g6jbZ`mW5&E@l z(Jd0Dp_BRN{^2s#-4t}U{Ub(7GJPJ6)(P|edA&DPhWL=hhx_oMzhTzl4|k4&YH#7a zBl^WzSg%Qc!UX-T>w_x)yv^l))w@ro#njYb%n_=fsF-LsR#sNlycy(7i3aqmsNTTq zYtN~fneH`*)jO({HMBg0%6ZXt_2M3`>tGnoSSw>u;u4ONv-1g13|4>UNq;RVNu2oB zQ!6)~N5o(|!oXAEvouGE)!Pc-6%pn{o(Lzn|NJ+z!lZl3N#3(?So}d}onf%gi zU8k5pQKuIZ9*$lHDC^MqFcqjjnF6+5gGnqJuU;_;&E?xBD;6mg_Pi7}cW#DCTv$+? z7>#p^j&+ZX;qvhCxUUAFar@q0iirOj8XBsyTN2)1Zl!qj>eZ^paxdp-;K<~xRg|r$ z(Eg~~xF!GgLIc-f(-t-0!L{xy`?FO@K&=S`12*l_kctW}pdyAoq6lqR@ogU3ueDzh z_x>};GB7eC>*`u3Pa(8o#)0w7{vzWGEc-}f%dv2B2MMmm*{GKL2Uz>{W8(Hp`tx`1 z7yz{foH{%<)~zWAP`+E=Io=A5rgMY10eCd#jM)glN-NsB08K4CN6wGSpV>S48;D}4 z4=K~FK?PEa<5jj{MgNyvpI^Jr8eCKwe(Xwn0Zqyl?`JiAqGYJxJ5hgGGnP8f(OgVU z(~-_rsO~c3NBLm+_1=@0KpV_knrUz{V*W)rkA={&?wC|%u6d)!zCR!qSDvN{v$W!2 z+uQ5l#YRO5Gqzi|6czHMoGJ?xwF}&)U0(@r)@uX`0f@TN=}1uBt&C>trG?zbbdYCT z&;>&!p`~5l9!^D&mloqDQc8ybh|Jbn5!Tzx1p-1rQuSH0*nm=zC-5tvkXu_}tEn4Ctswg;ATx7kUaDo9Uc9- zu`z8|clR0$#xNK5R(H^&e$FPbl8cKg3{XlHl^Ct?JdeWOIbAThhhye5Yog8Jj3D2; z>!pO=h>G@mawFd>CXh+?-$b4)(c9#c;$M`ZAS1t!)v47hADVS^JMPtLkBr0wpx$9! z=NTg&F;1DS8a7@a59>su`TPC5Pjkq^@1e9R-#bru;RL|VY4!qKB1}F{y>Suk{{9}I zJ1#vvJy;)>gExdnvN>Btt)H2bFaR@t^7LtU427Tr=zB6JBR+UVzy@Y!NEqazJF$andiW@Z=2FfBuMTr- zEEf%E{w@_wU*D3Vf>AdBKN$l9N&*6cPcwT(ihiSk+R>!ptY(z`oofyqHUiz?i;cNg z*L$O&e)pn({`~nlJG)I#?4+6t;IA8y;`p?*urL~5(#g+DZ83A;>Mnu8cRZ;kk(ZYz zNl>+(?hspDJZ+6l3B?OSeFSD1h~VdwX7Q(SO9T4kk%B1Go_QOAg74qS!L{|z)x1kc zOG8T<+^`@4IwL?Y(DH3;Zmw7LQ#)rw`~E_%UPyJj7!h1q&3(9K!NkHUS{GfvW13gK z#RlVh_}wTgV*@sYPf5wnp&WjZ|HW(ABSA(vqU`I}j;qtHgxuV?z(7R6F-W|GBmfC; za&n3X=fHSpwe99`j{v~03IwX7IqO6LX`xdBCYsiX_k+YKs0s~pfu z?fzMI1j8gT3^rA#$zmd<=CH6}TFK8+v5SXdyUb>lzxOfVdp`8-Xo#!5r~Uqni}eSy zaB@C3eyMmY86T>27!JHa06UE&A<>Q_(&8%^g$)7Y9z?)L)s2kes;hak#C^!+V<|g9 zY80Ud*U;8396-GyzuF)KE%aIhOO6Bnc|*Z#129s&zrSdQ zff<^#t!;U2BkjBbr8IW8@y}0^@bUrz5|5l5)5vHA=gVy*{uUs)Kt;{__6-L#;P6m{ zE1MwL8xX-S0aF9$(QW2yF+xH@(k1-bhVJIc@>OiEjLW|DjrUo*+kSrpaY7}_8wYla z)&kj&a8m$Kt=_OL%A5#j)5K*)a&SBXsQ*U0r2~|hwzf9-YE+tZI{*S|y3*z|+vX#psHj+&%)9k9dK-D@ zx6@$Wp7OW_Z$_olZ$+EAY836#>0a^CVq4I~zfe+=2E$BXl>DUSW(ZRQ&W@iy)xlho z9`Mm5W|c0`WmK8<6{;ZlESzF7`no`dP3>t}VP;sfF|NeCW`kG09EY%Y(t`DrobZJB5KY#ik zEHuEgZ%p(wS_?DRgmmX-7gJJQTRRl2z}Rf7SA)ya$PrKKTORWPyl5H;YS8YWV`J}6 z@gPHhTLv6!YisZ(3XVX>tCIVRO@vKNP1G0Dy6nVoJ@4~pR4fwC+hg?|>Ms^&@Tu(h*#HAQ{W6iC`)=`kSa_O|9>RUxc%p9L{U4>d#Sr-Wb_zvy+;+Ms1s1wv{ljjKPEL%+i@Oa2BK z71eY!OUQk{s-N3wdtzcDT$bwUlA8MU z%aa}XrJ-RgxM8?H*+ALpx*WxVjwnDQkP8JK3FjBXztye^hLoSgL2blWv3X+X-g zpB5F0ozI%N{~ebfZ})ppHM+BpQwL-j7fwwPkWk_6J!sE4M~j>#o}M&G>659KYHI;#)Xzbx7HvDFRbVf% zBlCG*I)HYW25h2cgpWq}z;7qOmhymBQy>>31$Y;{vBVJMsrD-EI{1=?;vLH_Zp^u1&AQf_ABqt|#*qLBzkcEVr0Kr28C`e$- zU7)+m-iLe{%9ksILSHwiaxN|r{R4Z==y=jolj-XeY1jU7U@$J)Wx6}Zeh0)dWhp@H z+2hsL$219i>ht^QNusJwU+qHb-p`nx?M?$RNztA#`w;L((VP7mpa^c)`fxNv0_#FY z01^)<)Eiq{1+}$W)j?n6dK%~#%e0@~ABRb-f@%_=qKT#*g%sQJ4+-mpkdCn!h)23?qdjWTr}vA=+q7ZO8v1fY4f znoZ9FkD;lV8INfXI*8cs`w{>r)zu{fD?XXG zU3}WI8n@$m zj|kg~7Qif`fj|gf(Zv@-M?bX%QTE@Ga&bx~huE%&g zIF|h6KujgFtA}r8`605CZ_at1wF|BZq_I;|8u|kotBW9xkoHJVaZR* zXMvsLbtnXgQ>8xim!zcR3q{2)ILp1i^$#7r%D;Wfw7a*Lkd?KV zhw{{M6y`x4Hk#d8|Iw);167?ZKJQV_Z82Zr&3qFcF5Kyf_l9Nh@VdQz1S>iGce|@F z)o0{jq-9EiSotF3{@$l)_B(eKhOLnwmOaqG-EfXG0^6;Tk&)=b?J22rq_CS6jJCD>0-h1Q#`T*E8*M;ID@Ly#mc*&`QPv z4#dFCjR!s&=%@b(@R`?U*?=H{-s5f93hc=5K?Kx_O;ef^xR$n+>({2Aa)Ig(zO3c; z&k)Fp_`axK(}eT(H|@S}6vJG<9nOw>t=jwDP{0#B`(o;P7#iLncWQZ zqp&L*(9~l6{UL)EqcBUrvNfwx&M^hI1Rz(Tis;e93+5Pdc*jw61%(z1Z{FM`!Cisq z@eZfVfLZi7Qcj>gl1x^C5alqu!3mXAJ(L~9u;v12H0F2D$HvBHkfjLL2>50_PB-Z| zILhT`c|aG?es^GB)MiK=C9BuF)q0R(1(1Vtwe?~dY3x+9P$v3?H9t9gQPYK8ts9Q$ zQc_bx1()5CfX589L%>oekf}nzCgQgLTvb)IdCUudGN48ZiYzYQXoWzjYdP-10t(sE z1T#Fc&!%7VxbA8J!AkIi`Ox0kj^QVMKzveCkec{ak1Tqm04B&id*4%v=v_IVT0PVC zo(OkXj3B@qkci!D9eptrpr8Ep%{g)o6=)ftM^}FHtivl~NJl7?mpqzE0O$lk^uQhp z0;ua?G(vD(f#`M8SwO&x3oO(Y3?#|tcCN3&LKcA9Mk|Y$MP(l%6#x`mQ_x?ESwHid zueE}!ay9}K?8H$-_;^?@wO|Gi(0==y>uYgw0&<;mZaq+>$bot%)+Y|?PjB_xAx1P^ zm+wNcK_eF3pH(u|U%#H&Jbfl0uzt|65;|?2(pUDx1`v(oJ);M50IEy#%mD!b?gw=< zc!Y$&n(89+EIcaW_}hz(vLrO3aBuu zfc^5~rgOwaVPmB!H+jN4`@dPt9+UTKeYioYUz&d(h5i#31a?%!cBZ+EJnPJIOU%8@ zv_Jb0oNzy{dnC^*gNX!qaN>Y~MbK`s160hS3%f)2v0RCV*jKUp$Hu0l!$AD|M}byR zOd~3=JE$5{leh~84Ns#tOTG_KuLIzGraz`8gYVsX@s}K@C`BjAupd7Zy-!C3ZN+DR z6cpvWHQE&J>*%-86@oQh0o*etNnq^6u3wLh8PX*i4sFQTeq!Wv_INZ$Y|qie983_> zp^m0;Sru@lN%YSE0~npyVKE8`2|ZzFw@I>eR!u?n|6$Ewhn}^S&sat&{i&crh|n+g+>x82hyYt4aP=L><0)&LA?V<02*%3iO$YCO+;#hc?Q?U`Ffcau zfsmPfXdOs#`}M4Lg`y0T(4|JYB*{Mj4L@>V`&J?UzIFz@J zd6(mXYStH>kY)ES;SWHL_4&H@w$)?serr&C{Su#{4#)y~8UhNcs(pY2F45ODR7-%V zAOelwZIwP36l5Qqi+~1mZ#>`ZWWASE)V*?u-oMfK4`?yJsBAfW`#f|iihbs~O4e87 zU`8rB?-xI1Ax&iapXY#r7pU;OV%rQRCbzUpDL`8Ce*Vl5OpgFVFIH-D z1}gwaGyqlQbnd+V`6~OBHbC$+LsYAtM;KPvI~S}1#c&nu3}?}*tO>8*y*Dy4@?V`B zU@^NrZ)iv9=H>*`bSRMI0IRO^j2#|U1}#-n%rs~j;CmxBkzrVAi~xWa4F8xi!&#HS zWi`7UNa^ZkWI6zIUHfG(mvHOV)j=On2LNYEy{-_7D*!1|_kBjCw)Dv|g2z_@~0{aZY$j}KEq77tMB_@$?iWsnmpxayT zG}LZjqz8ML7e>81PI2$!AW5*J{NUDiszuhH@~{pdO}3XV=5CD#q42v zdAtUUA7Nml>6O>Ti+}_IiinpF2dH(7#ZB9}JZ7jsner-B0p$9)hfwWB(M~VArhL8~ zWxom7Sxy0hiwb5&Mq}WGYBg;GW5Vv^wQiG|xk4UBxg{JL@x|S}?3YX)Ir1LTty@UC zLe$tXaxyyUwH>n4j6l1A_kmQ>$~TUOR7~F{_^^Yf!Yv1c4Cf0UYEa&C>z5yRR)7vk zu(dYBOvv&lZ8Y#2^e_DRoo3YczM?f0^i*&H*nYEg#O=B}CD2+ACR1Njvz?TX%yr>P z-0rhi`*0WsqrKS!x3sC}L7n~#^0DqdOQ5L3$50JbyIWf`YnxL`A-Xjdbc~EWwsGcO zA^IjJbgDU`JK7wnZ*@hFJCMW#Mt)67O@jF7JZ)Kk3WGq3a(hqh2!rAfkFHsn2II2O zn$23G2d++h4EWdk3AU|Zz1)LQx=0i3B6e)F93G4N{$Agbi~Ib#u>e0mEg#>cO6}lp zC*^G6I(>mTJ1#IMhLc%e;J|^w?-69&yn*F!u%ckrZFe3K8QBGlI$k3>QE_qdnwp72 zhR-z$DaAae_V%i4YTlH5iaaM1cCl=zpr0cL)QRuis7sB4SAiWGE_L#`mT(+hm9DqF z>5pVqxXN3jtD%Aa&8U5OcdyqH_>xy!iI~WSt+^|WB#uSZWEKAH()BNh?DNgoL9^Pw zLKCE0-cQeT;Ajf=+3{fhSuttkr8xMa0{OVZXKqAPzdwEYB+w4n^Zr~-KgY)&ZtRJP ziNdMr<*vUwlSQrm`I94#lt9HY=FJdovjFM~WYv_W$sm@;tnV*oCaAGW1O%g9khm4&QqxVg!}CeqBOB0oG>Jytg)!&*qr$iKAf>dlcAagbpa6vmPoGv ztk>Y8fh7}bZIgXI>moM>8{4s>kr`dRI@0aH-dS~shz6(!=#L(?mfHFO2YD9Mu?tkR zm0qyIUQ1h`0*KZg~(95!J%2K3Ys>qEz8JKIjLw4D-R` zmNLLG2kdtV85t2TS=8zq-=%HCbv?%Bt&NR%$#A<75&QO-XfnQdka)`;H@3VlM2rWK z54*~n;0|5UF$S$IEK-lHpuANCn)3P)`~aZBq@5$>^AS-{c+H5&00|0?%;)3bI3IGw zeekHLmiEN$wX}$U?gwNA<_Lik4MW4j^Nb3ErofLM$$?9sfFQ7=qr=dI5ZJE31V1l7 zUy8u~AfoXZKmRA-VpnP8!43kV9ng4K^I39MnyO9JvMQ|KzXyc9P)IhbTQuS!HQ1n1 z6>W;YG=2!{c-oT5#9a`x0o=u+F9``rSWlibJ_SWoVPT=$TjIakGex`jF=hyq z;Sen17ZUCNnvh$TGr2eo+3#*|vABSdu8FfB?o9=AG|11|>EDxM;tV{`yUO213T|o1 zN#Ys9gl5(mdC3reDLVkr~nw5lKF7fC}UK~NrfHXF73E{&XHchf$3^0hzB z{=)sViXD_e4NcAU2{rHl8W9PJ8JPNT_UDRuX*=a)%PQDMO#!+rg@>$QP{*>a4ZIRS zMdgi^89xD_D8-zlFg~JRY%oWKQZXB**#Aqe3n5|lu1=}>Z} zkX`r)@L1m0*EbC-3HTa!a<;$OEVqz7Tpo85$IUgGAo(t~Q7NTy_5yd_b~DrW=(?tN z{)>DN|A=eumUIE69qHDiI6+;GCuJqiAL6+!U+q$#3Tjr&C`CE5sAV0qEk;I08u(HR zyL?^X3B#pI%u!QTDv+ES$E*?gW1s$K};;gwz?gB+<=P2W#`Nzc2EEZlig$7 z1y4WSa&6FR#9cUmh92I6k!wfw3T3@S^IDfKot6SexwaDi9+=(m3kcLVLYc(fbL7AJ z(LA}bNO2}3i!6Dh72h)$;paL?0H3xGva)h^ZM=>X3mqOFR`sd?^H6q!N(dGS`}WkS z8#AzKe!#Z{(=2!J{xZE*a{HDmX5iH`x|RR{044}-3;b;hS4#xhLoz<3_s>pEZe4fT z*(v!ctL8t4EZ>DF+~W|BYENa6yRaEC*M6E-;6wiKuOk8iAb4KT$4=34F*@|*L zU{&~4npSnT`!?%l+wXWTDGHD9);UzsIVGz1r-~jaqf|y!5C=ckF%yG!K1J6M=V>QlKI_V$1TA_ulKH&G}zdX zSQ4@4mQ;v`RN^Hn`6@1KvhqKKoPZC=Q>!7%cJP^a{uLSs^Y} zL|l$ua6_NqSv&{#v(?voGmSFS1O=vr4}R}&r*I)b)MI_p~pURaH;VQXY8=IzQhg7pBT`9s+eAXgn3y#GEtw_SY8;?Nx!#)c)V`@w7R+_hh%tb1K^n-dj9+7^#3BJr zt7RnsVy?g-U364bH$$B0#QF)CGPV0$y)AyxRaGFLkd!pZfNAN{`$1_@JV!M%78n{# z+w%}nKBIbPwGu{sUg5fX$ltkWzFjoL*?80OkR|LQ-&b@h-oS?IBf?cj_c1j$jYW(` z#E$Y2DS@4seA%-&b0R~IzRjSUlci}ygN>0@A?j6>aae#RB!^mTv}j)MJ$N#2I$?KY zy|CO}iR7$yrL+NbxLdFM8<)xq^Q+5?y3hE*|7#)B-To;M=K&!nj_Os}7|oSfVJfd} zh!9W9(`lciAK**@?Uf57x&evL227bh&6RvM<+pFotBj=!It0r_qgWH2P>pp(sYqkSBcy>n4NTbtdbr_J+q!J5NS$*0Q{`_1K9;p}b@sXdl)p$^EBMk41ren}if*d)DY;LjxXA!Y)Qy z=TW2yEktk($HujvTz_T11=h1@U>N=ofY1d{dKMb&`)7=NeiKxAf``MFN;uk1&leJ3 zrU12U#?Wu6y!N7Gx>Q3;D>!bZJgC$7*pu_5wWg*9{^*54Ylik?Dk_eH7?1l9lKI-W zL-2e8=g#YcIYK_bbQKzHm#R^)h}r!I&AVvQxBwXt2Oi7iH%$|=!@_C%Bttp&%PqQ* zL_NLzW`OZ%x+=9A#)Z*%^ptOSy!LAV55E|BpM-!WW#!-~jU!214bV>Q3cU~@rKPPz zxxM-B!U{1y&l1w9wbW=HT_OihtXy8g;+SrbR9L^oiT(+XA~XbKhqur0O|=ZUQF*Jq zg~jKn4wS{AG4PCw>11Eb#F#1hvC;iaJA9@K%D05`HlOuP>JlZNsOpjZbC=-A&i| zTh4#8*zF{AJ~ea{TDcDLsuH-sCdMI;6{Nl{>i>~4=36Z{|Ng_@t0K;uW4$h+v+czroa(nTRrXO;-26raG>YeO9Ox%Az+>MA;BMR?5W_P4cbKe>qgE=p!fR$R0 zN}l>BKq{ZGu_bCI$$Djrc@cvd1^=E12V;aS6DS2>N(EFlZ&zVa2~+mlvE1jM7sqRL z-hNm#=vY@D`r#PL2kUAoK-Vn6cX1Fzy*%$sM{p#iBn?cjbdU)NTS>WbGcz?U+yY1n zwo-EnJl$v38~K=X6!)i=uP;!gISvU=vgnD>BNj022b&!`+I`(hus!+f1vR(b0SznI3SK zhQ>D>v~MmYrz;a578ct$SNao~5=obGvqAqv>oa<>>}TZUoqe#oAK!4c$N@@rP{XqK z?2Wp1(f|0AS8ZApBXjQoPrQ766vCS+h}^s=eW6FN1zbTfy_9L%72h@10pIN`qkD? zspqt8L@dZeK2zos-^`vh)3|^J%`b~_)W$>S_lBQ(Yy_HzpZ%u3Mc&dz0JM_2!191f z#I{vX43xt+eLp9$h+TBeE94&z4o6H?7W?Ui{hD5L!jhIG)~5aZ!oNIR39?`Anzel2 z6KU}ir4S*HX=Kzfi9b=XO3=_ABHazrAR;9tB`ICf z(j}ruh#-Q9beGbh0+P}#h;)Mpd~@IT|IT>h4)421IA`y*=bH0ZE3RYp4RrzsJ9`89 z?FC=@pQR6v4Zr7cKvoJ!Pd1n*C#Md4=UYPfFrRfaJ6bYGpgrfOz|Z)fg4sSG0y}aZ z6ruknrAcH%uWF0F_YoIqaR>{u(B^WjV;tWJG-aC=FK4){UN@FF?EJEOaA~#utv$D{ z;%LrnjoiqKD2Yx#Nl{zdgoMmW&@Eai>w^x5=I69t*4qy_=2!(D-eMO>dHvl*u=kan z+=z?EB1ya(<*}*GbgHS0%+a&_jM<V)0VT{rAH`RtjS)0e-0ZdlG04(D5Je-1pkDDk;_?;iQn(_fUR76!Ax zR9Y*jmi?8Ey)T_?QxuesXQ)9)T>hjJZ|`i{cfZW?m)es}kTHu8^BXrEjv1#(1&ZZs zWhY$vt+7?~0SD6KUBPEEFETxMxr2VRHKkm#-cbG6xH+Hlrdda51iol73$>p)lfS}F z^SXDQ$QSu3Gd|v~1kqU4j4LQR$DxJy-ESBd*{>4t`b0E^N@Prt@t-WU((xJ*m~c06 z5bUXYbd%A&789-@Y9ryaD4;>><4P9GO4z^d-ycsWUNg0-sl2Uml&Pkoz9GP7sy0n; zIn*U`3B=9Glb=F7lNA)-`e{27$s@)~i#j!muCVdTqTetVM8mS$*D@~0<`8&hl(q9J zjX3R=C7C`SHv}t0buJQ+*1}SK66aX(Jj-b3L)*7+_#g`7?O*|^Bc9<`hWqRJW? z*IrAjm-3VwI@T7}BqkC{NJ#WFS#0P5*JfPne2AL?3N%J>@eI;ymcoNx7*GN;MLWie z-o6b^d8QgY)r^Urtb)P8!J)!RlAE{AbAP_@#NuQr*bd|MX|Rgjw~B2k;fyKlk@irM zG}oEj?l)cBc@Mt?6KXNEv}s6Nj(#@%QJd>}$|+MY?DjXSFHMxR+|3Okg5927fz+yI z`7;eVVFG)5`>6QXC7z=)Ozec&_&xscwJl<~(Xr4=sN6!uQu%0x z8j#QL(PMp?qNJeDIB72`ed3trxez+D`RIwL?|}1clk=vL9LCehy5yzl+r(5yp2*ld zbN=eZ3q<0wzdFEykNbzdU&d0Gov!s*_~ydvlLaaY>gYs{X=8J{5n-ku?fB>Srla=F zFJ<mUoF$zHFvnQ>I|lovk?kWJu2gY-H+qV3 z$#Ej6Zfeipe8<7a_k>9GGFgRHL8*yl5Fym7qS9cMfS_7pZ|ylrGzPTptU?x~Q-D7n z)bC4rZBTtOc#N;=CoL^q*U(UN@>zya1|-k1T_eDl**XoC`rW9gr~pn&r0x25$(7%M z6m)dgUaNOSHvnoNc<0XHb#YG)Un^a^i;)hiZq_h*Szg;$Md+BgCK*?E1Xt>~h}W=ONsV{_#m zaE6HlRld47W^BPRulnUtgPEW2vfPu*`otZ~0cTG(UKu9;3-9Rg(oO%UQ_!VkZg#qw?m(WdeUVi)*3@onY%GwDEs7!5|71ZMFZ+ zrt3&GhX7Ai{n3p(+%FZzZ(k^TMsNh+*F(F&OdLdwJx6j-*lwh2p4<%V#jT|u{?{8SG766p$R zXA=4VnO1wjg^q%}eFzvWLc@hciNuP*%iY&~sl;(r*}lz#N0{fvtEX(@%%!~R46qoOAH+@O6+ z5^>Lf4KZOM0jryM{QL2A7FM=vRU^taGb6!>pYNFQaY` z51Ki`?cw6$qJ7fVL_jZbq9S(3k#*Mep0)TipxXebgXnPW_G-QD06hpDYPAnZV>?w; zRqZ_+!ABvNqfNBfHC_O=G+~$7jZq;k9-a+75n znWh^bIO+D=6P2ihtxc~SS5!Ga&mBr6`0W`MEh~P4Qx$m$~s~A~< zgY7h-xocYTj`zk)hGQrdDQOsx7G9kD^E&d`FU~D{2&dd)W2tZ+-uKQUr_8C*K?k6a zI*^pxBcAh?og1zVRb~foDr>R9$b&u+`=NQi)<^$5*4bB{DO>Fh4~trPcIc!F+LL%~ zPAc}Wkv?ef*<}W4D}Br?2O%CGA0Ip`oq(i?Xx6H*w#_#C3q1YjBO)$-{KtJ{{qSTZ z!zJBCCMPLM9w$OhK|x_WFzVLM!GQw6Z%@w;?}JbSuy?tCLGb5D-2!?8L~!rd{3Zz- z?suVwH44%HF|)9MbXQr0CdI4KbKL;cnmX0o8LK3u6TtS>>FI<7ZB0Kz_w?4rWjU~< zH?OKu=c2^DBE^80LSAmbaT5J&$K5-mNSz=$g|z8!J+p)e)zi=C#)695u^%=<7cI4z zxVWN4eyDS^yPIr~6_l0nN7CA8(R3OgU5Gg_uuqQ9$T1WCnKTm#qNnW7UL~4@=Bhf1 zvCPTtZh%pWH9V|@)W$WA3ssG--rn8DF3pE6+YuXo@b;btub)f5>WH?d^#pJM#SC0N0)^8f%~7KU*C{TTcKA>?xR0-+z>A+pv=R*bnQ?j+E`eG zX(JovaiGum)Yx*{+n{yFW%{v}p*=Sqm06){Qc~2xRfOfh;pSe9wPc;9j!KLa%OUqH zTdd6F(J%cupC!64zM+lQ0wSmRU%w)N7D>>v7o^?=siKYVzIRnf2c$rV;Ss27lXFv9W+{KkZ+J z;Og;5<%TV*h~T)~<4kE|OuxOSQt-G;a6)17L_&r&^c61E!g8n~14H=VqewaSNOf*D zyj1n(Ot2pq@@(xl&yE+WWEHFaaR%OM>5G|Pbkw_m-A+nGMfZ{WhNvY9xM(lCAZV1} z&Tu67!kpj!$HnnXJxi$gKJOcmCr+_3F+?E01&0)ZHh@CdtCv3`GxgOgut*T?O{Z(n z&K!p+X?h94emcLj9t)xd0K}zt)&r{Rh`K+1-8TKAsZ`q#O1uyj+!(lC3L@#I&(T$Q zza7(A(T^-$6d$oE^FC4W5S*T#CZeEt24H@slqVi^53D*BW7O_*TKs|Bpm(~MlfG1q zn)*t9gFfa|K6)yU)g{h|dg+AbD%SIl?Mu6iWOzA5Jvm9e3psxxnT&X!y_)IjuRzOm zM|*3VEL>Fm;0Ff#2SuBJdoSaE#5JcSr;p_pdiw+T>GOB3pxp294~6D0a8tQ%O^a$u zoxOVo%IzhPOt*kv7Z#KSKUEaz7x3~R7HH0jZC=D+cmeY4?7uh`P||5f$NJ|%EYdb0eHjOQ zPO@l6p4k?diF9;yqPEPL0w1zEZltT`Xh+?wacMp3;%;$tP#q6msd^&CU@sxc9v;Ec z(@lw2pINmxzw5(FK5fn)+`W{1I{rGMWH!_><3bTs%*@*pYcVqJ=QviRQ!f}r?{=0p zwj9`2ZEZZ@sVEdUHDA+h)MzwrCne<|8LD+!H;9ZfhFaY%)x36ncC7jlt>xPX z?}v$v!4Xnn`oNw`)uP(z`Sk0+N{jWR+Zf3j)Du>oST*~Ho1i`WT{4%Ray)63SLg4| z)iCb&kTx|6m%`qiI!RKx-8{74x^1pP^KDH@iC%w?`+y|2x3~A=G=DN1bUT2% zzs=9j*D`$tegKQnkM~a23bH}f`r{~Xd4Cr~adOPbE!MYM&H2HH0e{FTEX0+*IAO6L zn$7_9b@%6&3v!@b6*?1raU_U>pd_(Dw`hGEcQMG=Als zgolT_ejX@cDCgZsjN5oxpj$A^B*GcRLV-MH_4_Lp=g+RuX(}T-R{_HWl(b2@%NquI zo6z%`rJ#+@R?~e~)2c04{`m)OdS;W)tVt!8VRm-b>&x(9U}cs|jh>V7W8d_9+f(W2 za}3=(RTkVh%K2Hb>g%49ovh?J}jN`#*=F51nx)r93!j~=CDDt34b?v zL=iPU@b*jKg{bdbI-Z@@03Dv%v{909&2RLKIxcWy>vPxD)w!BM&}x9xm-^FBjo2%l z94xau7+WOb5X5|-wEW=OxW@^~Em$n{;{0q0w( zFBaMb{Er-=cV5u}F$tJk8kK9VVUs#p{Zw=QDiO_orIdWA3q3sG`*UB*+27p@Yg?KW z-GBm`n3y2`9DVLywAY)}8!E<;v%!#C0Jf}G!}DTH0?EUxI4Fot5&aY77((lXXXfDG zP%!-R#iz-KM=_0>1?@DYUlM9({qV0}zpkR9-Z2|^R<>7E${%#`Pct4o;9YCVM}0pZ z)~d|{sIfb!%;1)uC_eeFu=+xqaJc%BGJ#VDEsUY_m0HrB(5Ve2`bysKjhN~Xz7QPP$A^EjdYeOPgZ>gT zWJ;(=P4PRK6|f#ph03+{Idgq#3UgZ3wA@X6SbgIBWV~7N^%vVa(&!gt86!+NDPt`Z zj7(3_?qU>FW9CE&QN%R3Z+TE`j4_I3ZRHqK`4IgczT>R^hd_RjYAtZ3^TXctc%|p* z??)X}C8smzTYLHjjbCpQQ{G zyhbCBOWR>n-hrT_i;B!x?Ko}_3v&g8kR8yCOs^}t zh~2(9G0_{u12_R%z;diqVTKw(j%Mq{s6H-GGI@+YHNm<@cZ)H=A-U;LOD%MnR)6@_YZ&ejDKO!%hyx{17lTue4WSXEwAm# zPB-?4AfqrIv6*J6p0uTYpL!SzK z4|v`)0y;d9QqJ)ig@63WtxKvLZOp*x;>gizHvBlBAgu7FmAD5~^5hWNDBikg7PLV3 z$}NhHzVI7HchtUpn_r#!(q8Qh$uZka`vhhIyNaMMgutx?D#XmkND|EtU82F6pJW_p zJx`#VAy{{ASy@sFMNeLV7&Cr}Hs=ncs|ZmJ-M{Dd*ALnbL{bhzBXC7Bz|GUE8N-kJ zx9Jkp4mJ;!QXZu;S>|M!9BuQ#T*aL-9S3&|7~OqVv%Giyu9vz;6$2Cl5gkwe?JDn_ z{u7$Qm*7P1KVp$orFn$^fd81;{if%=Xzlm93rNYF^;xn`J4J>*9gxBq$~wb zd_5^OZmiM6a|Vq1=V`mz@+*BrD`4}bXO+B75>U(H=_XfGbb~RanQwU zPKt_Bw#NQM`w|4LLma$=uu(jp-`Yy(W(aEPE}1F+_$1*3hbAaSqb)OU5a(d$Pjb0r zrfHeO;?<_I$E2bZSa0}v&!1b!TA*U<%HO$~hB#G?&B~$lR=a{ZT}{^hzZPKTUlYfQ zrfutYHk&u4f49WdGo-Ti|K)ZR6Sj|8n3IZtxk`UyJOTU1Ck0%T+qs0Bg6T;5Y8Y10 z_4nReEd#ag1P{S?X%={R5Ah4Kb;OHO0L2AzHkqPPOP~iOb*pA)fO~4Yyx6{6gqx&Y zG|GA}CJSv9(8;neB4XkY5XCGat|mP_QYQAey6<3o17154Y$Z90EK}I=FwD%y-u#R- z!>voZQP-%3R+g6$S+^3?FkJH z|G6t+&{6{9iH`(5{M~p&@?%`{eak(J&dEyG5uf{8hQD$8CjN7k?-Z=z;VB0y`4q`? z8dhKaih*@$0m>KC;2;6MKeA%wbKjK%wgRey7QpAU)H9 zyRB_JydQjfWEnZwK4l6HlbS@|ns^a27 zp&pV(B4^1AZncrE%SBl3q*FD{iqKC&Fb=;2SMOFef{rycH}|4lY3%<~U+=!1fo2oa zDBLz9A;2s`%hHD3+CK5VyF2rF($xrsm}{>&qLwc|M&I5@=u7y)8$&h3YybTF9h;)& z$;Tg|bz4{Y(oym~tERAOUIaW?keM%B@uD0WAFh%`;Yh9`M=ixUjsX0edakf?-5MJPv^=u-`>%Us;+L;JOE}rO&U_`(l}- z%`k8WKr{(TW}|(if5%7SDiuEpEUw6$PLJo0?2Fk!7oxB;i{@Ta=Y9)wG&s(YEt{_Z z0|d6_z&0No}Az=%N6=zpETx*v-#AawpP zd|E?QC0{AW)lMKfWJgCB%l~~^ahVN2m3g%h({k;S{=N_A{hwZIR4`0EJ#L(nEjF2>&#Kw1hic9r?=+rZwE z^Z_G<{p^v5&t6|Tg_MnW>|cdtNmF>^Z*#Fz#N-&=KKnA z$n~Y)5pkVI0WB3Rax1*Aw-@)zX`f3Hm~`M26XqJUx5lG5$`D;cD0PAYYXBEC!J=p6 zco84KpdNIw&j4enIoL!AI}A2+K7PcDBxL9U902LXz`qGdPV#AIiTLB#54Q`Ss~49} z{ut?hSMpls_OXer|Ax-Av`Lds@_yrHTQ*z+jz8^0CH-xEeVfTHX^@!iul~7-<9H^^ zhwAK`Bu`JXo>IKbARA60?$)R|zr9UdTUMuK$e@G0f!<^EYht`^;bQopjs9uoe+_0z zFu%yhzF-NF2?o`P)%o8;BvmI*HHCgz{H9J*>6`bNyu$pk-E9K|21I&>YN?bWO9;5BZHLldF=|ILy&E@f7)ykW zCVu$HjoBI2Qe8o^CpGddk~%z;q;`wh^=kAD-JfV^A%VUdjjjrI?ZhyYB7QbkclUO< zI?>b3ot8|@C}39+TRg~-kWK{*iVDigApAe93xp_4SCGm>VZwqSGdXaNL(&bV^$806{IeZtm;AQ#!1!&3D45f3<&Ii*zP+z6j)hV zTYlzWarVxss2~AHd3y*twkwQZ%rzEw%{wgxz^eg`BrPik$FWMs2>4-^}j73EH|Okf9?#4|(HXC%}A=8xNrS;!0me-U7ez2PGbgcGx2KSNhu11gvmc z1vC0s0~6~BuTS_@8);Cej8}jBzAcyYBgY@CTvuSX$2BN5i-&aJ1Uq6<)sLS(b!^Qv zCa0!Gz(ZsOrfM)Ae0HhM2U(25wSBmLoSd98P*rrY?{Sjl6^h7@!K%#6$`Sw#6k^nw z@$F)Fk(uf!R_#%i^}UXzOb|Zdn4ecn*;2E63{ntL;&Mo+NEmNvPmj@(9i+(_6_#CL z4KbJtztI^n9&jP3({weJi)eXGBVIu^+W5Z8l__G2SzFWP zS12a_Jfz3nD>BIW^eJv+L4cS?DmxL7VDJc_-7hf-iHyWXVt%1j0(=u_Os@%gU@xI` zAzuOZXn^|>uQ6y&^?|L5G|JI-&3*CRA7%weD?*(6;BxEW+9rS@3dt@&20G9(M7Q^i zD>D+wyc?VcYcoUyb;9*REW@A`gy@^aXb7{M_- z%{GN(yg^Px9gr2kSI0qN0WJ2EjW+fpNGnW}^!LKQBLOi^@N_=;9;dAhfo0&v)cm7! zolS$?5<^fqzqz>?Jj-Da%uw~3n+h(C@LT{XcxA`y+*r!VNqwz`48MK->UwtMge-qZ ziKV(_jRQXL-sUknj4pHjw~&_ulPU7GA!$^F+8P7|>g;;4{t1C!1gdS2SSH9KKs*d9 zlD0R7mQ`wkQweFgd%E-z-|G&I-Q5Ann)?XJgd7zlpD5%I*%?HwU$gfiBWuRQB>$E7 zrjLR_D{aiFjg{<0o#gW}PxF%isgDj0uAL(|Ekk3^TwmR2I5h0A6hM;0;I1OB0kCX^ zPB^Y43A1yL|M-D|OewHFKp+}aBp-i&BrFPQZy3y>@QlrGY+S83=~o@NO&xFN=%@gL z6cP|*W~LeS00evRXC&bP!h*oaJw&KgsQ+Y0?fNY)A{>?5_W76UT8CYTyK@Q*AK~E` z$S)rq9c8`MOQ8WZ7a61Ag2VHO1GFvjtHCx_Qc?mXmG#JiSx&}%L>cH`&Rm9rxw;qaw^!G8-T zeLz3Kj;H`q%OWp}f*n9X)tid)Y;UGQV3a$V!t1lj!op~GKK0v9O61A1K*Rxzhy&yr zG=bIjHwXy{K{$v5T4iL-z?`78VSU3Bk$X-~8bM?uB=g7@>LV;VI@VQWzy)k<9wJ-7 zRsuH#WFpLy7D5>yyat`?TZ1C-!ajq)I5IklY~Jvs$ia%LXLxNV?ye<3{K!iPWsEBf zp@G1?B0j_R{W!Wp43xkmF_nO^TYi4#2&b24a!l^(!s@E>3-$@!$r?Fp#M{cet|2Si z+Bp(T)O2)`GBb;l3A=;xn{hkueUfYkj&s!O#Xv*6hacfERdJ4QZSsX^6Zzho|_Gv z=OCM@xKF;u!Yk? z{XPNDS(*E)CK%=|X{Ju!jXEGR9IXFLN&lBAL%)}oFZ4)&%9d zx4rDgai&nO_$}HnuF?pBq4gY-P>J!w9o-g+hs1ahtcwn@z~@xmoeo~1Zh+u!*uR|(L700FVN$wGKB^uZ>~ow-p=QAdZ7y3C5-gXihjIh19ir&u(m)2fPY zq`sFizV%ar{=^3Vh3^gDiy&_*geG6ZP zb>=y*T1%$;e&J4(9#5*8XrIS~97c^~#=n36plgeTXC7YDlx;Ta9m z_#%@H^wWBeyQK()L~m1F{ZLxEIv(l7QR76F+dWG;_1fl060t*4-@$`N$8@W2L1QhbU*6w~>@m{ztwJI6w>dJ+Bhz zHvsbxpU?=(;BH2TMn7qb#(SvMTZ3jwu;&77b(S?;?CQXBImjniYxvtq*=AmYi}fr$|U z7GRMgzMB$=azMTc2!&xKOxu2M?lQwE^WI39etZOOEEnBEG9=IokT$qr3u|k*ptayT zT&`>`h2$5L_fJ~v91I4XSkhlU&<(fUa+cR)d!#Pl^cHl*kn}mpJUT2iG^o=Es~%Y# zfc8N=P*`m2H+k`H2xA88G?+6(AUDYb;(Z=GcmO82ZZQ8gTGMnzQ${Q793LyIsNlfm zRESbi{yVCuth`h?Aho0*AUl@s-xQ`YIc5aFo(k@g?wVTMY{b+~A3N3@f1|E+PDOt5)0?UVYZZe6x17EWAT+z-XY5k|#I zpk0NS2_&NpdaHNPdnxu&`$uFK7Fl$#q^0vdOM>$e^te`V z=<`E(q^z$%wh^YMrzetP1h^UaMIdTz;I;TsZi)J}Oa*3H*iMPy%fk=3b<@A{l_^p!zHGbiUE$m3O{=rutsj z$Iq_~+9NYFGdSyQ`Dx0xUy|%w?Qd4q<3IUJlQ;P?lkI*-8QBL}3bFirt2nqhMMZmE z^_?>qW#I+=8P#6bOY$!!I(S9FKfTJOvLi)qO7ENoEPj}AfqfpiQgGl0Jf^T&!juR5 zB>)QwKHj2|h(m)zb`)@QZoMcYUE~Qx87DglHe=J`27=O^k91*T*+?-gHlfX7wMQW(5 ztlPtLLkBch1tQejye8Vy74{ZK`)}VAlVn28FHy|uL&mgJf9!P5Bee9XLtvFI~3Xq5BF^#1>IU6 zrm^c9s$}*vW{UQY{0eG}0MNquI%DwL}OqoFS620k)82&5qXy@W3viz2ErT{W;AWZ5=gBInHc zzm-&Xns-*ukiMIDqldgMP8suWph@q>H~KdR4rjo>K04qZ&M*H)=I&VtMW7NqTxMl zI(s(8s}zjxUUp~hY_%VV|Now}?hBt4vt?;FDX0=Ycyy+?ys`Y$&@+kpY@I>goXR6)M`r7TJ|2_bGf;Sv48(mYPkKXe~W5^gkkVcb2 zQ`D`iZ_vH&2)9s5b{4J{lZymBA-$R{PTxx}YPSp>yRmnlnli`g|8D_dOH>3-j}Hp{ zcMezR^j`<;CR(Yc4iXVjQQ}3VUgNpfq_87~L0y4~$mskHRC&NbfrAH84~Pcf35TZ< zX(|9Gg1_UrW(Y?!Ba;b$xR5#xT0S_w4E`IUZD?o!K=Ck*7sS`d5BT3?0B^#GxZ}I>}hp0LLKM5Pyp8l%?El@oHWJp2vBZ}?pP(sF0b@q3pQ?iR)3e!N2n2@P) zwkXpLOg3nzjK(O@C%tw@mqo|Yme=*5smT(LCOw^4KDK)p^j*WZNh{OX;ul>&psO%y z9$W`V$5l-TL2PW!2_kEme`}s$nK*sI{;+x zxhuinwQR0-mBT5ZNX}RilRPxXQ%?IkfEWVCsQ?orL|BSS$G$)PY)%`1f;AWw7l*Xo zSROyzqycoRah{1ul=_PUXZbB`0=NeGIkAs_mcUUaWT^YsUk1{l5Woc(c%YL(kX(?` z1j-9`7u4G)UeAOd#)*B-aVlr0cl~@qVKW_=KeWoE=sh1{nj!M#<{$ahvGKfi(BEG{ zt#Bmf99dX^gBpn%1QzYw4w7*wmS)2lifR=^p z5-xZpxYfJ`W?R?g9%2ZPf&RxFROT?rhwF2*X_g|WuN|T#hOY{+xEtutPR`D(Ac6_Z zi%y;?IgtP$=M&;^-x*q2coCwzIR7adzfIfTuqrT##F72}cnj$*2eQuToQy zxM4)1rq4|dj|UMwJptedQJt1@;ov%j=3N`2{=g@{1dt;V@((1cfbX6)h*H`AoB9Ar zZm|;-3y6cPjSfHxVR^&c9R`hT8(d7NF+@g1qj+#&Y_UNsfX{$pqJucR1z2o;`ytji zTG8j42SPZsR?3A6XhF#s!k=tVP9qHuK5-6x5FOCRiz%@j?YJ(IoE^{7dD=7T@OPxX zmra)^hDvT$?`*m~Vt;m1OyR2 z7LenBER2GJf_5w994xrQC*9H)A<&W|DUEcOw!RB!Vvtao4+1|A6&jtV&e4^NbKbJR;5|9bm!?Xq1xf*m# zGof6#y=l*r;t**~z4tr4K+F(&vy+X9)xyC4TKx5^;FcKtI$9l^L`cQ!kh%0pv!^;NE#-kM9Cwn$g1-t zhD#Z!I|wNR&+!<%H(DVS={=#7mynWAM*c@GyTb|`YM{%<1Ud6=;jjX)exRllNdCZbWS=-PTo6_Z1%A9<2zy|#symN1M z_&o#nNHtJ8SU|gud@!^-)EM_ZMMJeHj}o@av1}$3j0)$x&CSfTGPbG_k~$Natkk%_ zIZRx(YUbl3g2L}ug>w=aQK|~E`i$T&($_aYL&2ak@+Y8bW&oxyB=-4-*LM?xpFiJ~ zmHpWAPFsTQyCeR&5EyUB#_pjLh&(}y#jI!~kYIBT9FDFwDmJWjrh{sNoW%pcOz!a6 z{@z~ObiF$h86L7E0W5xg{=T4K2^xAIh%Rq@u`>Q8D2T_f3`+ce5=RJ(0YrRi%L|fL zK^BKpkusm%MS{`v^48UTV&HKRY6@b!1dszl{v8Kh3bT@^zAEho)mS;8NKJcRZ_qL4 z)xb1>2yB^B)j(tG04mv|4|R84FdCIox|d}6DA3c7ZWB@S8jO5cCmO^wsBi=#Ly<{PkPOlcvU!Z3EvTvj8TPd33_56hA*bmm4t7msIGx~wGq!>tBaj0B z>UR^Y;I>dSTC{mfj$aoMow4?KY?zoIL~x;+!xQlp_Do(EbQG}`s!%~qkL`>T26-@5 zAxXk)cVBu$R|x=BjHJ^7Pn-+}bvR~)ibFHA1!N4nW5zC?$Q!=>LO_&@)u0P(P@?)k zF5DEEqD4=k3}eeSJo}m{LPAIi*w-7S^N_9CU1HkE?=)G(w^<5oGo%#1Vn0-M{iCu0O2gX6Mwbu9sfn=3JmFcH{L{LS+iE4+4k7Kja_swoF7&;PN7k5>uL9y{fsY)pFFHnM-#{5>`)#=5yN89wDX z%8SE(CNW99zWtzppNI2mp-wp}IL6O2qub-tM_Tu>fQXdRpmARJ(i=x>Jdk6BaL7Px z!R>nxix~n)&mwXL6KMN3`}^SYpil-tYe&A-$d;n>Ki=w8W(W*Fp7l@M7q;O;Z?VmO z8e>0PF#MbPza1^hK*$#YXzloEe(<@2a(({60xJcvZDg*CEF;ldXk1|9qLTFUsNK8| z?n2O~`ar-nazG1mCrx!t$FX?d#d)j!3i`(co9C3SkQP#Jpj3eunc5?kgFxy|13A@h?{B1=xQf` zA3%@yam)2haUkw@?jYDMeM^VeT;WFp<`^TAgXAR6fB3-Xf{g;;7?86ik?seS>BA@E z2?uL>1whQqu%Kr@^^j)5jb(o3n)m0mzNGOT`M08bok=zDFaa;~Y`ILOCzF*EgrHfJ z1B>v0CW98QR9twearIRd)wWi-YFdgQHSBCZ{$#k`TE)7kSha0zqe(qL8GCsN zA+7DBZ!fFW@a|Cmw^0F5^~X_L+k+(0IvG2KzL(wkkRnCC=$jlqBgqh1(Pzy+*}f~U zojFzj)q=w`yAgE(k{bo_Yco&(0T=}6S9^b!_|(5ysF(|&TLV7O`%FL`77%DR;I8~W zkb(vof^TsVF4Xw3H%g{ZA4!*F9zfw$F*>0b$;Bz$(1WKA|42DywCd<^e$IG_g93R& z=bY3fEl5~7vS;eu3nKg+ZEI=x%~9|jT2CDzbmjzhg`RDYkU(uG7^M|OdlrCHyn#1? zZ&LPF7dDUv<3!Jq1SP}P%wckHckF>&z^$j3ws}gOax1J%*0#NMz2Q5KykF%leq~WC zou3xIww8FEf&tHv;o*i{V|V?kF8g&Ccmh@8V}9kC6X3^pNZa0Q8wp-np6OfF5`KtJ z@!HS!J1Nx$gGxeW^?;)Qa{v)_y2r_0i>6P&ftc^P-=W-@dyjNdli2_6i`?UVwXv_3 z)6gFvbw=n|6s(DkQw^z7j$E7#!ODD#Hg_jcGDX8V{SNkDB56<@AxR@$KcbB1!g{Sk zfiVGxl)v>QjARHu)RPt{2RD5${%!f)Aule;yZwX?G$ z1DUi)PCqn`o`0n3y*8=il&lhak2%=bEMWLrzAiJUn-@Od{pphNlflRxd(nZPpN|}` zUc1JIb`4bqZVC`Ha(Qix%dXggMZ~+A;KOc5Wp&`Bu+pMeJdQ&71C<{d*leh=oN@7 zIOYMNPE}K!4ACBEaZPY}SDkj|ac~O|Tgok^UU17Zp3{y3Qpv@21qC{}stGlQAdz+XbF)r|A8K(es%3!+9ViTj2Ba_TOiHW1in zP!omTBehMUB%N8uJ-|BSH~btR3O@XwTd|>`x%)nOkEf~j#;o~eT!hfklxr}3-sZ9f z`Z{|=YAY9A+L@X%QN;S|(|wzoq6v`79#+Y`c4*2JU8AA{!Wx*hU`z)o6HY6zTCib) z3`8CrdqrpP2Z(qH)+}(Zi$|k@3N5M|u$OfBS$T3W?{a`BvSCP+Oe53Q!j>369^J-c@WXaq75qjT zZie{EcUC+$sd%v&6lT*@1pA$>LUae z$mc|}e}c3Cgjops5BgJdscb?xPXrJ$<|ODYA*2L4p8zQaAdL|=1s=i3w*pS&@LU!2 z12%iCLd~(dz(F?D>wJ6FDM&1a{av|MK^B}Lhk=EOob3h;9&`U1B5eA)9YhG@LF3wJ z)(inEG%VD0aak3#Gfx~M-=v8UBPW1)9dH6!I=bR!Yg!ll>s!V!?wsFxu|bvt)GG#d z>1TwR^c{1RnhWZxOcbp7jG+AqC@?XN%=pEYcl77eD?&8MrX3GQ=8HF;F?oDX)BaHr zFM>?Y%?JaTR--8Vo5Zpx?87YQH;0<+ycP_k4BkkoclDQ)wA8qB5dZlVwmayCBiWR3 z+f2@!Gg>{hXkFXje%QD7ohKJ7Y{*T!8K=5*APeqRjlZ>`d)H|;E}ZJUzwWG$;?oX! zove_<9MTStI&77^er0Yr7EitK(RxO3yvC%CRA!OB0-BP%{QR22CzIp|A^63#3P)8{ z)#;;LMW^5Y#zDalcQU0SOr;cXj!Q{#`1#EpTg8pRXcZ5oPL92igCEYac0&+d*b)Gx zQBhY9hhwb%=c`JN63*xYv9*J7ywE3m!2(0PZH!+$IFs|}vwm%%8L^DS{uDm?M4mxN`1 zVm)!|01ydNY#-Qk!DGq1Jr(nehw2Uir8A|)V;%a0d#OulbeO7GP~=ob9Ls_jh14^Y zU(id7_!5;3Q=2=;;7Fz2`nKgWH`in>>_^6}$9TVpshgBrZ+>~50ci(WJ+)h-t1Scguio_S^N0YyPW!M2jWkk@281 zg1UsV)BLu{RUZhH`LFDt1g)36?eN?hb1J_C!whiqPTX2uV3EAMIOnDQdV9*x-(OEr z4aiG+&x$doMVsoj@2j8`9egc6_?QVs+r>q>l}p4(3VdxxR~K^1j=ZaDnf$Gb!NEbq z)C;|Ox&N{ACzE;-5cw<|n7qTMZGKgE=XKm~l^o-TWNhW8J3uu#4eGfnz&3XA?>5#| zsvpHuP;_%ZT7ysVWE34zG3Rr2Mf2FNQ!;2}9v%Hzu+}8`=YGVj{yE^vnr-5QlVjH6 zRy<}j7i)S4;~j2_NE7`NwslAR=R=c18@p1?G_qDM`>VTJ7W=2eJ&%ZA7PM!u_#$}2 zquuPX-S2}2XWbgta9Y!nRMe?%Rf#U9j_#RAI5`|n{&j>)e)4zTnIHr&m1}2jM*!#e zs59?y&P~cTH#IEapHbWl_4tx^r&J~;Dk!L~vGE;U#uS@s~aGWJv{u~#+1gKU+86q zQ+qZblxobsDRa;w3!FGBiR|DRNKFu1ARHTj32eJuVjP%v!e5#B;esBZ0|dbnELI?& zfZ>x0h}>=f*QWk$A-5Q`t?C&<*I=Lx)-Bu^Nh2pGM-(rhUET#FhJ3NX5^_w@{fB|0 z%xt76L^cAFFBn%4U=xK{gAd0KpTe9D$Hwd)O}R+#xzB;B5tI>dxc9q3fa)yw7tjsO zlJTh~RlUih`7=3MSAJexrBD31RM+oQc$zJ9e_sRLN=Vt%g; z4OlRxw0#wa#I;ekACO#M*_51Nh{0c+?YeP9CxxzE2Y?So*`zyhiW4+cTT@M zfE$Cx2@zyMN_oEVBm+o>kTCBEgCa#p(_?dPKJe|~QMp5PK;Xh*p*Zn7lmf7Cc(FOp zpyewQ@6W=|U0lW>KM7_j>I#r@zIR_2J0kb~5*U~eu>j}{#Mpk$QNxZW;4~=+WZmG| zJId!mD+QgFvafRr>n~N$2=Db^=4#%6Bc=ZLS{&mGv3d%}S#tWKwGaoj<1Npy0j1MS zes;9k9()DekCl$?&K+{(Gyzib-8GH8c;8(g2|O*2?n_|Hqq> zC5pINsn8^LKQ@>kjiD`CEi=;j=rk{aTz6bxt`P(n0)G9hFF`N>$Yow%u|Jc&Rg`gj z1HpTC$@%#^SD$zmfC}cn7sxCU$^>r0ZXHx#X+>kq(_=p*Q*5B83|~4Io=w=hL3Hq^ zTmYu=45Q_`&b?Evf3B`QIJe)#* zw7pgd?&-e!o%&;z{HGgCsO17;QwG5r%zo(@+Rt07g){0N-G70e5cO@xC&@7Qf}UQm zO$|B_ctslzJQsqG7Tbw-lajoH{qEV?bAuaK(WFYq$w?w3Lv!!X9C%aG@=)AOj2|2g zjO|>cmy|+PVGTU166ol&ET8u?t$vq+8^Vkm&}7#EvcCWOi0n@4vdy&_;&KrrGQSN& z&Py`aJ&v>w)I`LE3ot3k$q&b=K$mAaISaTqJhhTavmlTLTK~gathzxV6afESLY2FOF?4#}BNA!T%7r>lKUU*g*M9l+A6;k2kbU_2g;X z^bW+J^tE?(V!pchaI0JZiR5O(hEusQBq}G>!PAjZg;c9j;u` zl#kFJpA{}i(ECu}cVRqx@}}tjmc)xXPjO!>W@lh);NlCIeI`nyQ+Xw5tbGN)-=tZc zjy%Q;8?avR=q~{t2(@qK^CiIjjKas4wce|{_ePE{x*y(lKia?zVRZ}%-XMBe*29cb z5yivTqh&N5TvX+(-x*uo98>)Gv2nFggqe=5;>fSSCxI= zw-bF5a519N8D|6DBzF6{ih%9HpZ#{qw*TjEv==(U^IK!ZGzLYfeHp^SUxg5tK#^AP zEzLXQllkjn`SyFKgD(8*?nZj#=`?uvy|yC;R#V(_h~#jXT8nq(jOTOgsh?RSjZ~2H zdSd=@BcIjRFtFZ8l~no16A!sI5O4>B-O&8HS^X0>`ovY`YMY42$lGwR0pL=~pf3q~ zSz1?@2HOnA04B-gXMCsA0sLs!Q8)e!*N(-gMz^!9MeCOr~%mIThE(KjtZL zT!7U9QS8T$;StYn{UFC2^V1gz6f0EprR|esnqli4(1a(s{?ErE1hNqcY*=vS%uY^j z1vU%LNc}t5jT{Iw=$QqeoZxToOE|4hn=AsHPQb3Fd)VP)2!EM-IMe29&TvYtomd|6 z(c+0y!Pe*iTNN&R29jy&+fA58Q*eL~e2RAdx(0bl=BB@$#xqyLeg_?^`%nG9=1V+VnZ@IVW{Ah~DwBZ0dQWiw~_#pA+d8h^H}vFn2(5!cz`KLYU8ze*G@&HxMUU9M|jfw*zZ>4K%QzN0gaT$jR%Zl zMGyaBRW)daIFz~0a8z(aXTLXV_CrqX)H5{f!N2+cTKn#JF8lc17TS422<<2mvK2~c zA|~LZZ{Hgl4%Xi?j|JJza+iq|RsIjcwZL_WJIslu$j3VVlwJj*EeH-uu7k$5Pl z8;FC*qu)THIqSgASM=B9IN3aRCns9bqxl^wS-c@zqVEmdT+_Wjid- z^S7IBMaK~pMhY723JIz=FnUGXHw^m{py(|pU&6V&-IyOy6BG?Eyki+qow3srhI9hZ zWC8ux)k6&X{NLq3&hM%IoK&vCGK7{4Xy zxCNGI78z&unF>V5#r2OK`Z>PT%M-}x5S{a-!M^xo{q)=mX~h|bmA%jG+r%YVxkN<+ zBB3uYfjYd8$@IW3P=N4>ct;mrzIwH!9$FhI#Q^P{tH>R(D0&bn8NsCwK5y078oH-= zd*=ctGqWoQD|MeGXtBETVLS&9j~7;)K(j13lok{~0Qzj6I`G9dlp#KY!>|>kARSBz z;ckhE?yAF6PJwOCA0zc)=(P!I=P^pvZ%SZ74xio#x_nD?;fr#?G&1HB$!!yct;xZe zw+_cN*|*imO};L4?(E3;fY2kNE7l@UP2raczmF9KChGMhHE^v%d9Dct}T z98HDAH3ze~xh08ZzP-v)rWz3seTu6pnk_HbubgR#btqkdeDVQ+k&1jil`ayyI|0Od z_2!MCS2gEu7n6b|S7c!uA1Mt2n1L$8?2{OeHjTy8yoA}|*YE&?tk%Hq2F<_&RFire z6@oW_Ok2OJU~ONHkz?CLWJJU>V%}?P74O3hl4)@duzasE(i^vY5`5rx=JBsef#6%vJH<+!*ap_rn>*o6-af!k ze1E%v!h=-@QE)GCpvthxdY|Lg7Nxu(@2Xn2=lt>|I_X@65<9t>C4KTGw?AqL9@|~K z-8Ca+*6fh&!X6Ql&{p-XrQBz1I|atyC|q8e;-b>~r;Slw9+iMGK1SPv?4o-QZA1e)~wP6kXuw(Y6?~+Vi`9ic z7V7XH7vCHjx+V7OuCDQub8qb&xGncjC};Y-J@YKUbKByUH~96Lnu? z#^rcdYFyK+<4IB;CaL)OG{3r^zr4*Pa`Led&Qehg^M6-YGToJyN47OR9r zeR7sPKP$`oD(iVySM->_^P~zT1$PMFkuNeXnXL1_=hoX=B|Pj=e^fy0!I88Zv^W07 zzcy`}PJ@g*GFBF+CJ@PzTMU0swR<;mRSpN)`&F}6z1K=rpvb)FC>xz{B!*doRi06* z?V|GFCF5~!#~%CT8=tRjul?x6K5f#yMehEie-2Nzlu$geOe$7!Rpk28w{7j6VJE9;iAEEVu5Ili5P!^W}}9dZO>ML3Tg7 ze{NLEvb5Oro(jBB!kDQXdpWRL!(P6P^GjdY7lWR)uYHDUq0)s+`jV5LU#COz9|+Wj_Xu zM%og#8mVM_)kzIIwewaK6}E#l80@jk^!od9uAAnbDOUM-UZ!$`B0(s(!x;8xnHyYX z)K;4ze!+g$Y>Ab_*M9QOURELXD5h2N;q}p#6EUoU3eST)JPkJtd4;Wv2mUx+rtgdj zHGF*Z+rnNWr=Qoh&<1v{846F?WqV)t{_J&EUZ%oCrKO^Kk(c`U_RvfFiZ4wK>-@fD zD6J_b5p;{?qN$}?ZpS;UBhyUYb~)@B-+zydzH^J(yDimQ*^LjlowTND1qu+L(dLQA zCS6W@*;TmWqW#95W$lz62e`)y9Le zEYB!ucNr~bri$6-tB0&C0rIJNvHoSUru z$yz1xdgpf+I>bO}QEFJ^l;e$0z?ga=V<)it(~=?0AOeplj0@wl4I{Edlq12qjr}Lg<)t z^RS)}OGfd;{2hhcmmY}=c2W0xswiFk&?ONv8TO_A=h?Gf2l$U($uCwpk|nPo@1b`4 zW>EDBg=ETD!B-ir`V0qdXg=otdRgq{?p@!PCalvPFJf(^VbOt%0IK)bo38)+4y*4R zNegD`-r^m6(J{4c!a83avBRP8aAK1iiIl~-_gHbUzHah+L(5W=VLxU$8(})v8!UZ zHrM}Vm48zAn&?^u?tUCxZ^495-Zk}oXs%(Izb5!6%x7*1ZK7vcst9hXXKBy+?%EVu z%|gR`^qcr)mCBYAQpHDNjE>=wiA^eFc~n`#Us~b~oDw>Db<5*z9^E9I`2P0w>TLp2 zb{iN4+7R+pN&-OYPT0hvrl zZ`__|1oTXdpI&+BnwrYN`cv@g->1qv8m$_vc0=fV8d->h?@63<;lg@GUj_5L_#o+j z4KCb?RdwD55w)OtDMF__fT#jbWW6HaZFHw-zu0v>;_O_p|FPYIFpPiy(trO0RSFUG zi7#I_C4TDfmy3wl{P)Y-{#G*o-+lwZ@c;1||F_?`qLoy?Dy^;_V))O0x0w~>qN1l4 z{lEYJefQtshwt{TyyyCVz2-|Hr3Y01K7reTU1LLw>lZ|xKBUNz)@_bIohD`cs>ISp zArx)`jByaL-(WgwoHN3VLgIOenT=0VY;lwL!NZ4AdicAStJHyJv4vwW7jaO&NjIJBkH?GSnyrX_NURFonP*whATjBT{-P_B5CK%qNVKm{( ze(bN&1O$2dFO9F79;PT#dwdI}HPhq_V_H~xiCK#0f5P1&`X$%hT z1q_*d9&JuOP87HR6{hLc_TpzOlgo0BD_9OF3(8yetiMkV6SD7Jdn5VVOgybNVxb&j zuQ&fQ+3;~mGK~bup;%supTgE82a`LSsCv(r{^|>;`t4uy_D9yVgu);=w6j=I?(yNn zB`g83_&`lo$HVnz^y4Rz!8Grt+>Tp#-2TvdgEUa?1Ff#t?K@+x#o0ZoDEshrYQf(q ze08_}gw_?6!^sJeE%qrork)8Ne{DJZXRW=EM!fJ3U$$R@IUKYm-ihi?QVXNQB3lFN zZg%$61y!By9gAG7WCXtn<`9~tbBl|M7pcTN3 zQ~~bud*4xE;b0WY9(YF}m_v|D;%`eX;}$X)>&V-L&CN-nI;;L zvy_qdMgat+H{x@EN5hP+oc!9^3+aX}9-wtYspU!_pV2|SdxLCtX5Xp`F0hrz&+jsH zRT9>JrSB}YHFmjU?DdwOy)MR;Yj5<2jtVA>JPsw|9$`kc5A4&rWp5d?UE!Z!ev!c{ zdf-Lbo(*9iAGKb=X>n!>k@EgUCs~9oYI%=!edeX8S(|%bDsb0b>wox(2|>bBMfEzK znCNK8?rm0uJnZk$1~&{FdQAm30d);9D=|_gN_HTC_yXCR#b;6dg3#^^GT%(Qc{Q(| zO;?NZk4qZIN;Bu&7WdRhnd)_=M>g~~#1=}&no{MKoJf?63CX(RB*SpZ&nrhhBP8jA zhRl`OZPz^8O-}xM-d{2g)W5Q$j!Rdcdt$-k_Bxz(Xpa%U2;aL{2QEstN-<4$h24H$ z6@TQPEDk3!BpV!%q275bM1OjAvL%&8z>@tV#KeH2GRKO_4}N~uRZmci!jdDQKk<9A zBM{BHIRMncNCxpfnP55bTiZy7oW1mlWYlntkExV|fn?1^F3of?rj6W|4UbD8>x%@v?SKsP#VW)vt4}Eb^aeV< z*ISmeyTC>V^ZpLlYNy6TpFA~rxmK85e&!kFhN7TqI@|i>O^ysoHbn4_SjBy5JD>3_ zScMsV`_0Dn*t5)ol}GB+0L{$feA4mASv3j2;}JcVpO+7i<~QIz0ZXnzw-qZKHQ^Fa zd)sGz$)xhg>M-UrZoUWIQ?U;V6q5FGQfhF!hq_2ACqLZ>d6dY3WT3qO8ys@Ro8Ca={by!2x5`;0=}`v`LP2Q<{u z@F#Zy26-#W6O;#Tz=ttM=7`lAH4{CAL!;Vh(5SR365OAxMz_3iXVJFl9}#;as*s%= zRWcOnnY7|A42PJ$H`FD5vb=H`JbL1>H{=0B}1X+byEB@-Iw=0!jGjui3p3+QA0fZHnGxS z-r=bCqUiki9~`7yJkUrqN|Wp(usx_nvP=fI)955&zGrIcq-frFNhKcu)sx~x(! zYd?4}{o}Yh1d(<_m7_B0eld2?I$Q$rGT&FfHk=HI`Se3*gtt4aOjwXdm9j>)P3TOt zrUQW%49%8&g{KRSz~T~*Ycg-{R;T@fnvmuAk3@%gHdfXu(M?aFmrAU&20G0NJ>!`n z(G7pLgsfu%m8SL%w7y@fd#vH+X6C|H)^_J{`HN^hF z*5^VurZERig;WYq<2Ut{=r;kl03L3(LdU0Mr8DnC9-8KqMJP(_Dm)m@sT*DNEkQ^v zfZ>GrNHZ^0W?>G^t+1RYpPTlzr3%|Uy0AqyJ?uvUYf(HGJF*?%@H~TpDs)5bOE2#e z{)Xp9sGFf#*8b=_6Gpp>&J@)J_A7qpt$_9l7N9XshaPBcGZ2fYUkBU zHIpf6XynHTQEx~)K>Z+V*h)Xz41{BIIQ0hh%~gvI;hLYI#e)VOLF@iF5KgoYSB_dbB2H z4CD$&C=sCG2`F(!duzb#ezG#U2|R9ZPjYj6rkE7B;R%{%tNO-8d6E3&7O8)^%ikH` zf3@Q_eeLc0gBShIf9=oMypz04aF6!^ns*22gZ{XFjM?9Y(jy$&2{`}y9XY&-h3i7t zW844X+M)Ysajy~!>g#wgh@=yBxByJ+`6*lVr)w4=K*I{}9_YRG)g?mg&=D$jDW*MN%^O$Ry4HQ90{O_Ak~K?qiY)b0 zmA;{;I`c%W&jRwE6~YVc#oa|NHt6vSLZT(O?-8(RMNkH($1QBE4vEH)NLxtXE9WOW z7#z_-#+_Hw`>8B=2e+yXpqFWbp~nbVBJoX$d9yc>hRRQASLx7^L%XpXfXu6P1shW0 z4%Y=Y6V9pIi9)X}W8(R~$%9+nX~eVjGTY%;0q(68dTJTgRf2?sfO8+e`lcHK)51VH z71{SftXx1h5TD?!@RL8=G|qReJgt}^Sie|YoIR1zMm#Hy!qr*9_%=j^c8GyOHo!3| z#P+ppR6*{@Xm5#|%~*V<0s974Jx^DipW3!DHMca3mNchz(-1d9YQ=m@$k2I*=ak_w z+>brKdX}8A9#-2sB`7w_+mSsdElY1PB*WuY8WU8Px6y9qBa$7!{X)WE?QMR2QRT?v zU%2V+u6IDrBF3Ysk$$&^XOFymvfWC%X0qwM4F}-s97hjbfrpwW$?|S1+-!7As+B*p zrzz~~u0w@lewV|v;>3mq4dN3%@)n#Cm*2V9tu<{0S@J_WxIscf0Rm!wkCpkLB)H4y z62jVFV@LNUJojtZ&>B33G)@Ph3%Sx*cxWcZBZF1JJ!Dg~2v`Z}|-@_}NaKx(7dqLWyOu6+^UFFJE?J<*SH^ zL>*EW8=xGrq5Z3rZ_A6|*#l31UN;+xc%FfQfS_*lx*v;YpAJAb`$o1tR4^6F?i`qt+m6IGpCb`rfRuDeF<+ zB0Mk_t?xw(5E^Y~4wMUqB}HO<=C?FAl&V)7uB^t*@jI6Yue)f^_5)O+jU8d_kL#q` z&C1z{bg@BRai)~Pq~74Rh*|%3jBkpPooQ`1+yxH-iZs%he;y#_P#X{ffJsPqZYDk; zaOBxz3AqH_1nNKBIHtDKL)eveAAfaG><0`jfLRX&jOEl{QORLU*-YEJOGHwW%T>E3 zltTLyw;v5)6fe?DH#OBdAmOlaR9m-9zvc9y++x?JiJoF#h1A}b`9+C6V#mZ5Pp?cU z#W!}BG-Eh`s`2by(L2;+g$c5tx7!t#Xl6fPHx3|8SJFTK#kw_D{?g|hwg=vcwvsBJ z6DQ9p+O9E{B~BWghF>AcM%^Mf_GsT|CfD1aJeqVlG%B5$GXqjK<6jletvU==hgJjT zG18IC5BxSX-yh-4gQ?Y{T$e{8m8I#|={3gDW5$E!-QLK#Q-IU*@bDO}kCBaM`;9>p z1W*Ojb3T@omY&nA`8em(#<_d_ca-Q%vzB{p{u3*xHlP6AiWe%R+v4X(hf;#tFgUO8 z-FfHDMQEly7IGSG@fxk$a~A88pp`@DDUeGW9CCkw%n)1RF*P$Kk6b=uo2fv<~IM?u-3r)pC+R{lVHtsB(x(_?+1h(m%GW zhL#fez`xoI=f?1Xe_{Kz=)3l_yLM9WAnXpOK0!$8`XS_31DPPooUq(ePLd{ohOv6 zG_|4RzWfgX^-BuLOm3^$9+(a*((>#n=ER5)Dug@oaPo*GYhgtY#cFoWhe1@$Q_SDQbzo?AId=R;P$NB0bZ|a(IB7R z*ajV?T|QB1X`cf4?%V`1RPe*XAz z1Pu?AO*2UPRFfEv$ypWWZLF`fB;DT%#G57r6^le>EGDer`cYZsHZIsB$e=nuK_bnT zYpi>urKR0V!bZq{6xD6C^E)>#yT7=&y%Xx3@D>m7@71QKYqT)!t4$WLAp*Vzoas=9 zDAQgF*l{lqp+#T(kvPGbI`?hkH)@rOou3j5RXQx1Q8C{ULi;yvoIbaQDz@Y6y!)H` zy+O6s!s zs`r-AYQ))ZG5BcKcn!F7xcNci@xHbP`8*r%R4L2!Xf^T?@uu1wi-*L`&q7GtGa#T0 z4}Vl7`A&!S@A1iCr^Xo#%@GSgtUK ze>o91m&Ek=MIfgU@EX##k#$5~hiD#XW}7dIiSL-?yg6fe#e2^=CDL1krS zSF@kC*<>beIaF8r{l%()ANA@PT@TK$e5{t3dU7mJ@q3&CA+E_dW%+07*tv5aU_=1C;oQNpbzg4BUOB6B20-tL zQx2&{RjUq*^go_%`5P}7_u=Vj7CDnu_;I0pJZmoS z{ZPeihC@S*(2|16@c}1-c=zEVw}0Pp;nW{$)N&JDM)KMlgO{^nNzIw3U7DusUj$3k z)vg{evkZPvd;GBJgAFd~BSJ@Cf2ezL&#LulO84MnA;JNn)+BI1fX<$SP&>gS21>xO zdZ?IlH{)IkB0YeO?^U11fp{>IqCH>WZt7yFL484pI#+%@*tpMIO5_%`ZPK<;nl2GT z1#iyWpUe4VXO@4xzHc6`8UEw#CPeiNtR=!jA__OlPVIM$f?|L}0O%nyb&ja3P$aio zwiyA*Vm98)1*Y5$Y3U)fB2bR+2e<>#-UcNDXy5w)fj~Bte6MJW?eF1BknMCH+aLFmTPVYFf3ICh}hRCMj5o5qnd!Ykvc&}S5A_U6VPx|gG=k{2N%hz1pj z<|RjDSeepcK(?To@WNNa!5>n#z-u;Vo3j99JcKkoZcZ483806)A>QfX>-!zi7*bVR zISLk!p{*V>X9XbC5(3PR!|T%&p!{A#rxVQn2YA)#%=|=a=e*_kJv4?NBi~ivjH_NL zoSNx2%ig|Y$9=dQNH%!-`~O7l<}#MlVt4^}TeOx64AJl3zm=)nw|)JE<}G1I=xuE! zsl=ALAFf6Mq4-eK{XhG8`UCd!l9{2=K-DWlncXhgnqnhs$fz?Q^G#eDl>pPN@i0Es z`)A*c{}`y;Smzg{aQ~#w8bAue2KxI7)%|*zA^Edc*>fZHi3A_5%i0)Omew@=Vk+qi zMTDxkS?{-3-Mc*jLjpOU;)ybn8g=aBL_u+Iez0v5i4=CK!AX+KBIlc&nXI%+?u*u} z3`M#}x8IG@C$h61we-FobyHjX+zh=O$k`{3ucF zg^RlpifDKl(WILYWr6_|kIkR67_Hxx0Es&Csf`TF31uRmLO~2OffB+w>y!3?wt&Ju zgI7h6ng}PpzC7kHXs#1)d8fq`(~_(bOQ*heuRltb=l#o*RIW>f}E|nyzig=`@bUH(-?c8f)Isb0P1wY zL-~ZK-zWT=auYzn{b(2TfkxPiDn`=(-1EZK0gm*Xw+*`V(IHZ%$Z?Aj-p<#)ABd~o zv4(j9oEV3gKn1Y1o{#Xpm8=npg4y zK%lWcON+GU3iuH8=PeE6cU-}7Dnb`D8^qY^?5~QU3s1ZHiU!P*?Uu|AoVj~ZM~9iX zmu$fQh+5fY%pa=67vtB=Av;Vc+sDt_U^B%7Fp4hBRd5$Ifg=A69qpx#DF;QiezkFK zjtG&dL}~xO&gy04P5#Gn;^LPs-3}xDkXQ~#td;YwnWmJ9{hoiC_1UxRMV<272ZU!i zjGtQWG&-MIsxnYKLRxQA_0mwykBbavHOT+YxA8tnKY%$>zt=3A$aiquba5|)xE@po z@3}aIp8_nfyQC*P{Mh>XLg8Ey#o>CA?5WqkPHAQ`qIw7At$VXGkW*H|;oc?p%=Ee&=$_N%l=VG}ODY$|am4m#m}+9N7AA)AUW7 z$U6yL0MpcMIe%Wc%B!naL1g1cRTZ)@AiIZAO9p#d@I<2bM@dWj9U#fGcIWCW&}lso z;;=ko&U|^1izwbu$Y6WUbAVpGgXXd$s|d6G|hcyE`%eT9Q{FN#iEa%>ZO(9b{KK|ZlkG~n zv2MiF_uFTl$#);(Y_yKEaL?{Ye%_n*LQeXSI7c(??@{l>Nk}$mUhnDG@K9hy-8UW+aXCqq zyc`!<-SK;)dUBaJN25PR>jk)$-xhXdqim)A3`kV$ih%hjo$joAtx$bAQ?W8%%bJ37 z;C3{(q18!9YT(h&d9o9KAxyEB zsq@7gr`gYxYVRx3j48-cZTfcnHK}{2#f((z?cI`cvf>TYt0W3H3GIG%myxGxhxg}Z z8c)x5VwcwAiB@k|U@E44K-&C;^WB7IKDL;kEOG~X_THM*ZE92}E^2HL1aiGkKx}e5 zPB1f{vmC#RH8>sJ1Nj9ejEdi$Cuvrn7HRhtzooP}xw4It-p7%2cY4fcbjCz3Gy1** z|BV~-0(_j*0o;6X-)p&4tyVi1(Lp=pinHsVMp3Yyxt&UY2m=Pd&s@M zrhVvPfynh6Hk-L><9C=}38VWMIArN2CwIzYk6>u@|Q^+eh_9(o8JVK$51)*`;Y z6}ZR-MEDM$9(2i%Y6*#=qCX^^`rexH0Iicvr}sVX!&uOn08Sn9Xt)uzo^`W<*| z-8|Y)Ye3=H<=$5*{MRmpHG4|m*FH3JYoDi(IH%C**Y7HWq#Q#32SIR!Ns`KJA+)z9 z=gcofd#M`^^dBkrPegpTP^{5@{A7R5_b>zB?{CB04~tge)GVPl__M6+t7goh9Rmw1 z`YkCZiHs5{)*d0*MfcW%i_0-L8xNh*PtSKrePA#N zWom!$=07A#*BxrT&ZFd3$uDH-v8D0gN6HY&n{5s|(z1^IN!ekvDPB2UbF@ANRy>Eb zp?0ga*H8}=g$oq=FJbM$!;ZQImac+}-{~ky3OM&tKM_=(1OmU8@xYz^Ux(`}PKQlg z_}^#@mxlXC^{+E{xTY<&cnNZGefX7f?oU({dS*Akv&2jwCr(Vou{iu(nmpa*!0Fw< z;QlqMXL`<1p~p^ xluO1lnC|*J^#&w%^}6C;_#^-*SruzfDK1%s-(_7l-h@9l#BW_m5WDC6zW|x8>u3M~ literal 50210 zcmb5Vby!wi*FAdE-5t{1AOh0eEh5q(igb4)-L29kB@)uzh?I19cbC*}-Ou}c-|zkB zT<4t2EneKh-g~Vz*PLUFIaav3svHI?DJld4!BCKw)`URdY#|UBWMo9}38Psd3it=n zR7p-6@&x^p-BOqcK0&dUf9nK+py5IP!a%;J6N3+toE21LkX8}!(I{R9$hv^vq=G0& zOK7>z9b|a8t$yfC!Bd+Ya zSQ+XD20nkw__yye&olGnm6h@BGveZ~vEe2Dz3M1`&a#Po_(lG|pDdE$+Wy~f$h9B4 z4BQrF2&s_+ss6ck5by7npHebeH@p_As;Yho{@)+=ude3ZZP4px|F}un|KFdB&pPq1 zUX?TYDop*?eb{CaHVx`8v2tA@|MwmkB`ga6`+A+x|9K|#>#FSk+sASCwEy#x|NYbd zA3m0^$N8T(`0tnR!sKij;QZIl>J`%LiWW#E-p^&6tjL22T}AN1f?fRyPe=N`6lW~It4KNI<5S@VuJkg9o@eoZPzyGEi7kP;KpP_d~*T3y> z&7q>4MQ9Mv)(=~sR<1x6CiNg9hm9?xzpeM$vG10ai9baSJb77uB8-)+82sHV^fVMr zZnbJI#|-~Zki`8pjC=%Xm;#(Bx9uva;3&+aUkJD_MPYb+z)pSU--Og_dNp$zwmTggB@c}eFw3KrxKHN9h?f|bH%B)b z-Y!RUs(e#xB`dJ_sN&d=OgMN53qc?OI-zv0*(w}~dg-KXu{!w8vzM~?wwR%C51n^w zhh9g0d+BV}KVJuYAa36bOg1sz%&0fzUcZ?oy=T2fKZ<=85-J*Lg_||HWj+3*P>Wj(FsC}B~b(l;$-}nTWBt>QQyVYB6JZ=wtTxY>&`W!?$ zDXoNoRJufV9I0sF*&04~Ysnv<$GiWfn@ZkTOVEW8NQd;npdyeaqYpQIXA<-yPdgtr zQN6bx%;H5b$;o-A{Lju@b=?+FhqRvyxAVCk`yZBtY5UJX%Km`9A zO`Qq65OE01K$X1!d4+D-iU-95Eo~)NJ7q}F^14!Kg9jyhUnC3Gioi^gBDoXq%2>R} zFOI>U@(;rP9S?Vj4k%zEa?_*;xNOy{!|#-JQhI6{t!^HAYuwjYI5y5)>jj8boINA> zqDf7JgQk(9dj~g~vbBp>oCQ0$(6v~SH=^P#XpuY9EZ`s^CfQmnIhw`oRcsTMHP!sJ z#l-SynvV@F4sR74xsLbr?%TrA0`iUkQJ z3b^p2CGL1c?%o2WGzl~a)xJ;=w*ZLtv5d7Gxnl}x9N-26Bwwa{E!-23Kf)Og26DOVanL;5jnktM8 z$8OD#U!(bBjjlp72|D7<-JOy~{lqG5C6xdoB8-2zD=i0+Kq{Wmr1r`t=XBopwFq9M zeLS! zll{A@SDh*xb38xW`usKzq+fKwxfUK1m1u=+5H|}t(#SHRC(_smW?)*@=+2GH=7OOO zW7|2xFv?!`gmxIml}xFUa3eZBbY_2oJ$a2BZbxVrdVt|>elDy3B2A(BpE`(AcND4f zse98=qCj)C`^)p2p^l8A_rY88X`DKQFp$URw&)B|q!<#|`S=Vqy6h-?B@_zS(jOxE zxf9B@OACt9n3lScpT2V|xW{3@Yq70Zt%eanLgAXe4&EFRkr}%QSj30_XPI2=pxa(u z<8Aoz(O**fh^TzW7EK+5q|_tdEl(EC7kGnHI*Hn}=xdfpFwi+N5*sxmamtXjuKO);-kNVg z#1x-n>vLsBB_u{0mGfo#FU^USp9VrF6W@_QxZ(8NT>vJ@_9Wjmd(o?h0B>d0DXuAA$U2D+fiovS( zEKmtscX_(EDr^hioy9yt%Ujw|B!QeX5E2m)QSq)HHz_q$3ItN#sCeF}yvD~$Qd2!9 zfT*@GQ0umKOB!(MWb+&bI4rEKr7h%2*KL>SK)H<5sDvti;LM$~-l=GLr5w4b+Uy%FkEKRbjhR1H0arj)q1O7t6E*Jy{U} zT>nY&HM)y?Qc+_#{ESQg6k7FSEzMYk%D-ib1)b?Lt0!(}Wkf8i9ur)!d3d!}&wIs6{Bk$YP|3FxPdh zycPv8dlZo{GhPOhFc&9r{6jgw1~jY=XHEd|c8P%@p!ES3U*F0QiwY9k7aP)H>`#TP z74?Z~u6<+#3k3y5US8hfTqmf*UnPyNK_*zf-sOiqobSSMuLF6tE_=EvBe)P{WlT&T zUwRi-RJTs6#J>(6m&wLU(BCD1>i3lQjp8|6N zdRN@KBzA`X_^$M;S9l;atog{mJq2QDyPT`s@m?|XXxTY%Qg?CH3t2*lW2_8|&Jg-m zvx{N*nlgAWkg>pToSmH+^QH9@m#tU~E&oHJwm9abR~e9DIg*k)dulZt^^3cs{xHEK zAt|Y1B{MUIsXD(S$5g0(Nsd{s&vDYKc@>sMXva1nS*9&jItkq_*zoAlB>pDNs1`P& z8}9fo%b3dRX@-j7sWo+VBZvsuJ5Sg9`ia@?8}(4-Y9F{GeKez`;9-KRQNKAonLX*4 zfQmp&6v}+s1rd*^4OhjMz~+y2SK~paCE%de_~X)9W}d8;Vs64k%*D)wFQ!wXnNy!D@4}57YvZ=Xwc>r`+v@fpeq+^n^adc0e z7gmZ~BTdZO7?U9A-$xJG93RXF*m0!yj1@oUu6&|mf~5ao>(Xm_j1HntJ=sR0XeoP~ zq`b10+X^I#Z{2#@8DIpvCF6Nz7{MXDgt*x&TF0_W$n@{uqFq$l#a(|Sf(oJ^l4umL z4V?TEbedkQsSJ|G6)MkJ^F>8P1zdF!%;>Ue!mb=7YYKZl2<_WAnYg<0Eg4jHu3!Ir z&QoE(Dp|Meb2a;6rqMjIud)Ba*wckjWQ`Lnlm=|aJe5*@^3 zBvMAgfK%@4Z>#H%mbYk!Iu<@FlU>lE*Zlj5nu!S+gy!pGC<7jS6`Xd19h|0E5IFQ+ zDt|OgT{S>6xwFn54_-?zE&sNRy*kY3=x7R4mEq1{w1Ow27S9&|@SJQU zsx4KTv5JaPd=YXRQ*q6hE?fu&f8EBni)(mS>%Qp4H>}X}k22sEO|E8%`QT!G*9%6% zll2n$#_G_huM?jU9v#b(&6z>f=r80L3(8I6)BK+aWHf>7*V|I<6&01b&d=#$obRu5Q*JodqqIcu5vdoYY$~SG1J$@QR4k5m= zLcqpHEfRpKjMu=156A^T?}Bu7s;V>phWH&aWbX4Co2y>AnoV>>grvT{eiNziuJbo~MlprjV#WGgjm)<`$RNO zpYy^-@82`D&NUL;-rm}_Wo5(%AW?c(sH~=b`4XPUs46d}rm7;NsE7)o;^f5A<$Lur%LCs$9__oI_f1aUG1%caj*gBe z{k_o?(}^i5AyF@#ynP98UAlYv%!bon3b>rniQb<`)j5$w%L1Q{BZXeAuHvj?Zyl>8viuXjqgzK_C)jf={KHHuScr%%hK`P)nt7(V z<6SqM3df3wU3iw`ZGN zUz9(K`ZTJoew*Ge*vE-CdLtKSG*V&GMd!7>xw-l$N6Ot~lqTy6r+j@Q9Pii2fD~97 zQQfAg!=G=i6tl*;_-}#Xs zk`|&VrW{_r7MGHgi~}o0D;INvZwoM-gs$#aH3vAz)Ai#W#NY47+x1ZfC{HyeeqKkemH4#dg) z!a}ole;6>-+^HwgJ!gthRuAclyj+{x2m%V%nAli3Z*O5lEQ+Y*w#$?^rwnZ|Zg0M~ z?~WIW3>S>=#w8>K{`sTcTw#IJ8%w!-G%+A%_iB$2 zP*TR`Z@fzv^UGuiNXy>P#i&9(=Mp>R;6a3jxF@`X|5rfRnRFM!IRDb)+t7kk7b&38 z>_CoXINC@xUOeG8=q+&M$+7~%Rpe3aezBf#H_-9w!w0jYW{)!24e9qoUxUAYXG=;> zuGyap3=EvZ7cL90s|2llgazo=@k=pd)2fI#q_>S-uSNl^57ScC9?HOXdvVQ?%3Bu>9dw}?5wP4 zpx7-Om4tv)Dd6|$-SlZt>gR{$iVEFUQ-l;Y!>BU7T99%~!ApgOMM*EW`fwY!`)fyj zb!NEx`Ll8-m}t)D{!=)fhPt}F+zWv>%t;l38Gj6xYgf^l1`sgDFFBSPN?7aNYfwum zJ<}P~fZFW3|0yl2!=Eb{^+gokNeU4MauE_%XqQB=0vJPbph}Epv2;d{V@qrrmc}@(@^2x@dYJa^aJ$FjbJN;hGB{Hnf*^7JD@s5X@xBB6s?eEp0m(<;kCy#`n$Y6@B zGy-CcXZq||n5dvns?iALwRh;#SHVQWYLviFdecJ8XGwBpvO$lQ>>OvJ=~$U^7+pE{ zmM_3f=4r2;!pg9^t%$BG|9ra3^SRldl^h(0HE{h1Kjol-cbNl6a z-@l_bxgGZ&FMFa5q;ejgS=BjbqnewUtv}=MLr05k-;Jo^3!ZP-V3shgZ_~9=Cu7!yw2Ups|z`(e6#r3!s_;U7uQbVB^+DplZ8Msy5oRi9IvHwor~7s z`{x`+t>_?cMns?jBG+YE(`j4Rwd>ru=@_u>QM~#CU=rOj0NKTjjj8@#?uUY`@+ml& zT2QcYfIn~9vaqqancUpmJR!r<(vt2DAYEolDn6Pi3to_nkkQelot=3*J3If>*%?X8 z$pszC+};OLWmi|@7Zel}eg7`);K04Nw?{W`PY#sJg@d*2ZRiuaySu4`g~>HEG@j|Q z9~Zmg92%XqL1T+b+?WE#l-?nSJrg|wo3pv zbSA2ahJ(ATbzzBhmrRy64gdJ~v0h7S!uF0_$QAw7H|2)B`_zkilbP4{Fh4_LtS{>a zo6$b=6z#v#k4(AGQ5ki;Y+ItYOM^~(vpe3Ku4F}eAWPFczy-~BXciO}a@YbLRjr)Eo;VopB~ z8VDDM^F&}iPgc8d$jKMhk6@Y>V2YxmP%_5{0|&!^VEYmET7^yVBccIC%si4AHzAi*EeFKl26jhqu>lOjsZ%JAOq zz1?s$d82~B!orH7*oU-(esIrJWxR z>>p1nx0dO3^zn5R0Y1L*<=*74k&#fK zAIwymot7Fsp!)p1XfVHe>9U6pvQDU3UrbI(3F`ZwB;a>w4);rv}7OBVu8JRbJTQfe{*7zl$6x|j>lt0wsf*_w&2CQK!&OS zIVLYJFLXcl#ZvawE&E2!%;?b3)31WJ3g|H2ad7G$&67KQxL#fddP}|MB@5W*`BT)n z8DNmT8cM5MXh5wk91rj9l?8iqb)!G=SAV~Rx;l0U7G(^;fy(Iurzxn^8WrJBRcw)H zJ*gT)u=aoDDL)W@dQMu*vYdhMfQEu1q3Os2Mu-HFS5&o4#g2@P?K_AY=Y?HFUerme^jnIyD*fPX`}2SHHRaUvM;t3fIB zz0^C4gQov$TpPz#M2Lw*2l6I?g=sQqybL+XMWYIwbbY+9wp*TeJnV~k)&-p~I3!Fk zs~xNM;su%k=5LA75qDpDwT$UmY1Gz|zig2D!1D!kj-#J{7&g8>S|sMTB|mDtvyByb zCOopf=(gPR!=Q<-uomQd**u&Pu_y1;xsYv-gXK2LFJHb0IBtZcQQ^=^IXXDzUB%D$ zg1iB`Ct#QY_A3xvTwEwbQ%GcxD4ldIb?|$<_wc?utea``6NAR%&sk_2fGO@q-^a{lkM@u{$2ZLckc!i85~+8=9%LA>;dQ6#K$T z4N+X+f4l(Gf1B+#rpGh)&uS>`cgG5JYOP69*!4mRvwY{)>(kT8zw0*O0xT5%(rL@R zdC8iu%bG8*stOl8>DRzOkYV{X_P4bc1LddMuSc5SQjqc?_6;aioRq4atmS{)S!RT{ z43W?%LwQR3N%jB>d-|)Wn=A{>odWb|USTAD{>&7d0vh>8pRtA=$brBF(kUq^>7PG; zAgKev*RI|{cEPgkM<XEMym2ikFIX_2vFkHn#v&m>)3YLZ;(zrBdS zEFk`9MM8~}7vwm)s`97yzRtV@Rsy@-ft)x*!rq=MAu*BL>&hCac8Y$yg=$%tO^X~d zwm>hV0gXP_!#R%m=WYix+|~>AIE-qU(%`-u?;>k8Kz}wK*KRkC{gB4*Xn=36E!V(3 zQ%+nQ0?kKR_Zy7$`#6U!&4mo~~UoZQ`LWkJU&`?xd zd}>L1D>C&}{oEzXL&(rK_IF=AKo|fj9JM|9Du3ZAP}(NVwEOYds%{=cv3)@muG+m9 z-VYXmLks&vG`{nadnKg9JpW{)M8K42o z0BjTrJ5c@!b{Ce|S=dNY$Kc?g>zl%Kz`ldgi2mL`_4z$Iv3af{9E=P@3HRFC8a5u@ zx~m8P$Tve|b~jPKT{b+Wr@kBPpL>JAH1a-00CC4z!-(yJpEnv-xIJ<`3kyx&P%UZx z7?f+#+3MmUE8D}bf7{Z4aD5=uf-7B z3Xec>nr&TPWu?X(QSG5R=F$rzL~_wjWL;E&lg8J6_oUR**LlvHEKUF@@YybevFp`l z*VoUeeE-Nx${(s3MMa8^2oDcW#mkGIlaupj*Lkc`jBjd_?$okwesp329>7A-PnejV z&dbT^Fl&ps(WhVrV)Db^ODSDlQVRDK7*PIAroO)gge1X!8~{FKD?PQ3+ zaTw86SC7;BBvU@!6#c9ri1XXu*V@{-wY7whjOKOS!96~6v!d6_a#E>;#O=pcLqAI>9>X_v1XeEj$f`-NZy(nVA5 z@&9nM@r~S*$kNftqbX?FRIjgbUa!e$8MUxH9BE&vSSh@HOA-+oIZ9W0AYeUH!C}{Y zhz1q_;4{T(JVMe4YN=3H9XgPbF9=s%<*pqPh0YWUa9x|8(dPc8t>447Bt|?*;b=cE z!cG@ROpW~Lrm{D-m#{sY(dBjA5{k#D+73!o>7?RtzP<(M&j5&RywV;3q<3*;WptqB z<*#q%%5d;Vf6&Eu;7h{*mx_u?QBhGlme{?2XQ!loqce(X;W+ykRjh!1gCjzg-{VUl zibE?}Yr53Mv zpy`1CBOd>z(qwMd1d^2B!@g0a)3z!vAD<$PHaXrIQ<`>Z&q_xS_q$)%baZr7Y;5SH z(TIW>!|al?JdI4U-^;XF0f>P-Bm`39)%x5$)+E#!z#Gw zn0S9_2>Qq^;-lB5iv&Q|ylVgM{(R&#*6&^_qADD-fJwQ#Bo>HbePKAX0JDqV+}=`C zQLThLTk_wRL4;6IQ^WN4_gh$4h0Rd)qbF%uG+YFI~m9-#{EI2rr z;*JB*Er41?A8*X`TfIrZ{JY>?)#bj?2Rh!8-;hi5GJZ=4AUGMn zt+a*)&el-cwriVfhy|XW=w~ZS`|4su(KK5){{#t7cXTK+vWjQ;w~ZT$3Oo@iT(VS! zwe>GH{nO_Z0rYnET!mzApI)~;J+qqnE+HiqgijwYmk9JDF7w~``QN_L@bFX(L=XY; z)di9a;7-t@3IM&R_tV4mOskI&0AvM8JRVxI&Vk8_1si`{zFGX#VbiHJMX0r&g>70q zdQa(LsRwjE%~!ADlaf9GdR;WRr}{HeHc!IcT>y+bJ}%C`>9~~)N&#Y?2`#{JdG5Dw5=PF0m=gz)dfJk4TkQqqXxSA{e$Uc6Q; zI79~ypLeMMVA8O&V}LyXhzt@73(EqkH%K{Pi<;hD9fJDb@q9#>Ho5ZyvFzX0MoDZS zJgj5+-N0QP%+eaT4R}SFzeOkGLw8$rAxcO{zy@5k*bEs0d@JArRfEfMLq5NtU=?ig znHno1M<=J2qtc(V)<8G}wS%3IO^51`z2)sF!*Y|SpcqyG`gYUTd`Xy;b#9v-YoFy?a@$}&5h+=LTt0r~}i+75QxVS%lIIsqQtef~1BT}`N znEB(|FY0C5>#cW3O~s0lmzS4-(J(_-CT6{Pj!{5>7!)@5gUUXx_k+Zs7CV0=CFA&2Xa+JMie;mS zVL%-dIw=3s%pJW2Ev}eP^Rc7{eLhUN=ca#l)irb@yhD%#j)x<& zHK`4AI&Mt5gjDL;jatbmeJ*g)RSWSEfYzj`IA<0s5+X zU-87e7T7>2LH;>=u%-X|?rr$UYnDkBl)AY&-TNcAwys*6c{*yQ2wd)H=gvvEv=RCrlCUuQ?@d)>4QZ87Dl zlus*NpGCXmgQK(Loc&;9*=W+>063)F>}+wCN={Uq0?lv$m7wVg znuq|w0??fvg`d01>u2ZTSb>sGvpctHy1?q|8B1Q$!Oz@qY9g2TfZO}M`q;-G0owEc zx0+E^Zlp=FR`#Y7YL<*`+IL7gDbe6OoiRN|CF|9+h^x@rw65` z33$tz)#mTst(^8z_W8rW*?wUdGN;-)I$;j$y^GF~ zpB5JMo6ml;7L}AFz_;ngp+6JE2SizzLHV=&d`Ts6nRWN}LiK7U78Xebh49eq7NAoA z0*pgU90n?%(x@)CITtVQMM$uoxjDU|--8Qi6)vb$hsS~?hQ5g$z-=I}*m}M70?Pqf z9#Iq`x}Z48y}*2B;&UT>;`PFpQC?#-;?KZ!!-#h$twN;WJd-UTM_X zwca8gH=ko3xHhF(Kmjx=YG)*8Ygm6G!d%%F!V{fD=KuGBGntI69tT z6teNXc(J;fY6OtZ4>^2=!f_KYx|>Z-zwnMABsa7^K{`5kQ2y#&4@p7o+ooOu8C+dc z6E$60WYbydlzeVQ93R%_p!xugm1vfA0Qsor#Z+5ZcfJ z6>VNWPm4w4_3Pk}5JWJV#Xo_`0^6W(C?%HOQ9Fm4^#xJAH0}phZ*%eU{5xI4uu!PI zBJ2mAt=qlPd+R+ z$U^Jj`CUMrY`nB|ZS#FN=_RwHqM?BW!4EF*#vG|iC0cHI-k|e;b1|+~a4ZY7*1K8X z(?}yK5s?20C_Dm@cOSC64ivFI(6wAR zpcTc%!#iDY8gVH-TY_NY-~^-^`I3N5G3H)5Yd!W@SNf)0akt`ZFNWU}3)B$54j}mC zJ4IZL?m9!U4OngWE}T-m7ct*dGa?FiqjvelB`pLmz9}-cX-d4YVHlU59nkRza?rY(UabLgA(H;=v;RU4{dMfPgoBy26f9<_AZTN)`G=+qh ze69_E)kj9LJ1k$du*+#gBox$m*EHM*OigE`W5V)*P;yTmRJ>9aC0UoM}ag7#Y^ls>DvG z-UnnNO*-)-_fjnuOch&r$oRqF; z(`PQz_wUF2{QL{zJLS(@Fm}zSAsbYYs{DNp0OHToJJ9a!@6Y?Rg0N|RxS9uk$+6D_ z!8Y&S(ft!)Y;524=IKDqFK@Xb1$qlrIKRVS*slMX^L)(MpFjQttlIUn@=K&99f1e{ z=DmykS_-Y<{7ddqmZ+RDw3*uu083jhH8(77;~pzGnDo5kqaB&u5K%d6e8`HTL<#D! zA72J$QjmjylR~FH+$W(sEREQuNr(@o0~1r-lbc{9Z_p$F^avz#cH#sYz!ujo)1_~5 zQ|j|tYWAorbKJndVhHK@{`M!Za)ZUqcUIuuo5Hy}SZKgQ!X&r9Q%ni404#|94Il(7g2AUyC12x^q7 z`(M$+WS8_tS;20%Frk!ob6Ie)J2d0lAJ<(3BnQKb97LBIbSY1#-9QCcJ+5M>tWT1*yAZyzv$Wx z4s8u!+6NkZ3ZT!@>~StkQ^WsL4C*cfSS4PLQ=mpSS|SK>wX%<5e>B%@G*^aL(79-y z#=qY9tlaOR)L=XA&G@DV#kUa86ZCb1dTw-zX9CieKdB@5{yqEBc~~39Z>Pa8fo;DW zx4N^w(jvRKXMp+H(o*Qc5U2rJ-e=)@4NkzLm}1TipqcVl-r~NwN}$yNK~6JRwNgBM z)WX^=Z{?Yg>k6P`wgoFPCOmda!te+PmpXSqC277GQ!*y*RRO(kq_m-s@87@kjl=_o z3g|<6MNI;3Cw%scR%Gl;rkJ0oshOEc-8_9-7;_>&&64Z!QuNuGBi3qf6`Swh@hn%* z^K(5FfCmZLb?GjR5@YiK#;IwTR;ey!T7qOZ|CsX9t=9~HY{nh$dm%Spw95A%$8po) zui&)Lo`?_)AKJKlUI_cZDH<#}gp^Gs;rRpwu(AXJgi(js1x)^I18X^<6nmp&j}H$I z+#rUETLM4xcmQrxC!~0_TbSjk^;fG{i&(_dIX05P!)&5R1EhD*Buk=EUK1?>f{Nt--- zypz9vjR08=i2w3t@==Y?M7`^WrUzcpdt}PVm<3(Ky``r>kCk}0+&TtJ^ctA)|6>8g z;69XF5>nJJ_&|)v9M7%p*j%mfB!|XgTr&^W5MW6=-;Zd0j=$ol|9S1Y%>mA~sA)ql zjE^5bLK&|wkUY%xCW;R|Z6qXMR5JuO;}L&Vu>k|Zq*ckx!&z$EC(yDT-*r~P;QgWu z?IDazXNdVxKsOq3DGUq@|3Z3W6Bn2)(8={Uh(9Q@XJujO1eimlqz80qpqN#JZ)j>> zay$?Lt^K^YPe2e*u2NSk5(hwT_=Y!aOg~XFQu%BMAP25YeGT~ZubsZBY^}_kPU>H4 zV}t}Uqx<20uYsHU+`2IzA0N&0=i^e<%*l!%=ho=)%^ooUQ5Fhkeb3XDR{$XC1!-r_ zz+w|LC_y5pxC)Pn=>-G!9MSOR^)bNVrX<>&j_n z34!Vive89_f?S?0C__nCTEF|^X4qQ!xdD*|YM1-W!P({jXkl5Vl@sOJkoN^#Yb3p6 zD(zZ%d;sTc2~Zvf9Pb%`XijlbpN5nORx8l3Cy6n=-B40UZkn zi9e=iG@O%we`oFi9L=h5J2s59!0qCaS5ZmUeB*^SUZ|FO1sega4A8zpkLl^(uOQgq z{L_5Ei6Urkj@25P@)YEM1?$Oq!eom2%pHmnQs&7<@41-C7igONPGYw8QZ(Qo0!;+f zOySwB2ZqP}SH#cJ89qq^-|PsxOv3-n`#vG`7{kWhNH2V-hqgW*e9_z2p;vYN<2*fb zp!NWYe{3;t1l-(=s_FK4HEV9%mJ>yW*B*?@pCQmg2mBiO6B85A-XOVMrH;C~`UIcseInYsYqbW~e-BoB0uUXMhna=M^L)uc$1^fnOj7-vNo8AH(}ovoHU?ric$ zJ_lToJU)~04=!hpp9WG^msR8&;p_ALm@boccz@5vM} znw*@JC>&RCiVz6(zDYDU^P9<6?A6M!;QN_32eg5A4o`Zt}vr8^Y+}fHA z;6kCKw}13xx>APHe6)KqgzPAwd-U*NBCT~EWYhIU0#*nFZ0Z)*9L0@NGo(|>`L>Ij zhd}B)E*>7zQy*GxQCExd`vcJL)8X=Ky*Mw8B%&1&S=?^91-6*6kr9z6Vc<_&cO7hW z*{?8p@PrKM8Gz6G8$LrHqId>{O1Tg3V6enf`;f^o1u;EZCWw0wt-+Ef`4&VbAH2Tw-nXpb0SgN z2X*r-+bqY>E2ThkDU9!h*1dBjV$@U>!x46D@BBVH%}Zmip!3B&aG=RhJjn0D+g6#4o@cdn4X-1%yMT8)(KEK?V- z?DN>c%RqYeK2GS$B28(d=?|wZ5UhC)QITUKE(NnR=#vAWp$g51>gwB#Duta z&mI-C-J|6Nq;GY3Q^tMRGFZE`WqrFS9FLJkRMb#+kq@+p>+G`V41wz#7Aj%_tY`PP z1vvJUM)dSF+TPmomH^`|bHSVNPPs>@jW8aFK2QTQXypmGw&)&}B(sjT`90YZ$uuV~ zvyV1(hkjbkp}T%ee=C;WS=fhVY^6Y5n}WXb_|2AhOq%1H+#w@kBefxvoD*l1Hdj|&F6KQym1~@XQ6x46KN~P$iVQQc^nGG zqZ5n*ht7aKfHJf-G#sY=G#3fEMXB8l7n!p%D*Ky zUl1hXzB<;K({k5n7EYQvsvC(j-~C)!I|(X9IeyrGUc#^&4D>^&xzuXvNARcx{2%h1 z-Kd>GJg4nW3tn)og*P}gZTwvZIh?uV8jx*ynjh>S=|hdQg%*i;1O&lQM$5sW>d5n^ z+|WnPuTFY8kc``vqk8$>Px=BFYg=oUR4+jCA+6k!`1YC0En` z@d7wiT8>~IR7}I3A=a=EFj)OHwy-7#G;+eyrHRJ&YzOA0#8QUB?FcvuPTqGpH*&!G zb;HKm{imAM_6`Q$$KxeF9B`DgK$E#ZECR^a#gI7n;iZbYp?PvzBJ;9KHT>XACgVd_ zAqMoAKE_Zb^*k-u>0_a#p4F}hZ)CEmwbbW+ffd-aD%ytK{p07`N9eB zi084k>a9(kI`26j47T|{d{e~NAwAW&;$TaE^uKsQD->I~a*}%)=SK15wfDz{B=yY4 zcGB>#tD&_VFS{70ny0AAnlvdF-GXO~julBi6AN?iR?yw4iUJJBiS`LO)=A*bsW>}C zEjDdO+op`2IOKF!{_?%Un4xz;r04wcq#o#sTr-Oc+iFv4%+`*rdXm2XIV;s%M->LY5d*t0d+DEj{rLGf2ETVt-b1lXIOonp(GWjLx*ba6ojdG zeyk&XtCvq$SQwN+NV4=aYnXOMV+r821F(OWRvWzob5izga&vQ2qI`O}HmL*fG8*QW zBuc3q2oT|mm7v36+Z)?E*WFv-W0fi#uetpSY?gHNj7rRjz!q`Dos1=Pwy0aCos^P7 z18gMYJq91r!Rb3-{GbH};{9ue)=+t1J%Bjx_<&ObK-LhxdbLQ{CYjfRR{XrePsvI5 zI1TA~CH}M+83Xy?)M*%059`G$1pjO2J9Xg8N950qd4^)&SL4^n(tQXY$L+YcWK3=gUpMtFrf@C7; zlanj1ROG=B#rnjmjgU+I&UTM_aV4{sEg&r;U2Sz*Qg{C6U{>?pR@33UNV*qTyTkdq z^#RUS`$!!TZ~}p1k`TJ>`-?&UsmrRo?MP$JYqR7v)CCB3KOsY6|8_(7_3-d;Z$BQR zx}!)L3j;X6Om+^eS#?&Fi@-&_I94uL#rPiJ+ywjiMsqaa3<4k`aGBj80?<3+XjwL+ z%1)KR-%3}J<|F)eOKdWzYisM=ABM?`8w-GEwkuY6P2;S&v`r7R$wx%*lpXVXj<5Lb znyGy<|26tZNJ!YW5gj&yQ;Lvw;3xwIl?thC+eonUye~%O5*`A!@TcV{Ji3QaIKf#$ zGBesO)=tmv^6{up;|>j%m2Poa>`iBYX9iGd9277tyF5unro{I(zS`o5eXYH52~H$#q;uH)~pBjn(FDJ9VexQ ztJRti;mc9IfCNCK6-HWQ#?Ri3@& zeOrZB7;(om@dH9tM!HPqSBD7k#xl}6Qjdv+Ju%`%w79c$ z_p=5&H*l_D%n3Mrz*;iz0VT2$sN($FNERGoZSVRMw6DW&bIp%=PxaG8A0}*)8-c-2 ziI6iT{TMicfDw`k7~w&G($GujwpmP%4d3P63w>KkhsP%G+p3M7G-ZbS-B`cw627bU zO(V7QB%w%C931d4fJtGX8{a-GLlHi)Y;FKPnjX{;^nf>u}J@E^8D+g zxVr0wviQWrAn4JGzT+M~jIxaNyc(<1lS{1`aGQXORzHJ=vBRd+YuLo|IxJCfGqXJ2 zT6V(7c{l$5*jST9mn(t!@^ad!31xbCQ~&ol(|ek2aI{S!jvYcbipYDM ze0P~?^I16G$4{yI{CmGhP`q54Om=$drAvZEn)SiF?I>dXv6I!?>}~+shF%aD-oty8 z`U6y1u2CHmlX10_w#1b-WNWswdwbr*RyCdXAfgk@u%JZhk@6F(1t25=n>jRQ?eXIml)21auCmxWaT&0080;2{_o7{E*8HvfT6^m@wP8#MGOdX(KW`zA}@ zv=Bbu4F{MQ7*F^|r$)bx0CTG=D;M37Io{n0PTZ$Tof+wW4pJ(vv(oUQkI)sY5Cv!; zqMi!0Mi$@;A3!kn;Q@krF(yopqO-?t3 zdcU#1>e`4I1qM`lx!>UE12{h9{%Q-`MyGAb4B`Lq^c~<>zU}`{va(n9-eg8L31x(c z$jB}udvD6#D2#it+pcO!#|P-`k<})*XXUGI?Bbm$gX z*DZ+2$WqYTDb)<$YB~(PC*=@*=A4w)&6+l)Y-WFxojoaSYSt<--AYb)_E*Gx;STBQ zoydifO*FJGqQcXEF3zrQRD7_`(bLD6T|HPMR2zKcFkDm>c~HNavHD5B;f-P4n>W>XkI6)s>uGXs}GjNk}7m0^BoM@bu}-%kH-84V)h@?Q(> z86(7M>W{nVuY2#D(sA)_4pgT6ykF)r^Kjr93iZao)pM1KihbPg0snT>l0fhf2(^WL(}xT04lS~*BrWaj7$gzFoNKi|u6uGjq5I$FBxiai!$>mm zWwWlYXXNloOlb}tyJ6MuvZ@-)v{C-K^Fgdq&x51KUjsz{Y;hXO-~j8F;cxl%S>HWh zIkbCm^lBNVsIKnr%>n;G4pmu1mPSe<7A0-l@*>Y8PYTb}LQ;OP;6an9$bGhbe{&$c zGiK}LYC*axU_HRv#=$zbJbS)9BQvpPIyTu=88rmZA<908hxF`%jfe zEKUg#Qy#iCxNp6gK2J$bW@2Hvic7)AihIq5!;(>uD=BtvGCgHibwMc_JFX)vX`5F- zc*B5bb2;b*w|$$Jm5G4YcSF|H*RLXl9~kc+C3zXP#HS}8mH4#g^z&uo8Z2bfRaDs3 z;|G4#Fp<2p&6{r!^r&@qn7B9TExDi)VZgv>59mI7(lxnUBCOtw*4fWlcS`QYNqjsh z`DSY4CWhBBa((GA7$;axm5g&Yr7S6)NIE$GQi+v>nPn!~su@g#6AG%JOI_*Y7$Q z-TJMBY3K1)=w1HEM8(8}sIo6AOv8`W*VjLd$@EUD7c5EyI4K@PJx@idWGF~mS$0?Y ziLpg-QMow{VfGs?LngL8Is(+D*ReI8-&(A#!C+X-wiv?)!GMdKkU-}T4pbJPiOGu(=4T^gIu_CDvciLa_6FSUvYRtnmtQl>`RGcR!bSDcn_cE)xf_L26hyDTCN}I zu1FTY_WNvH>a~KJlBfo&Xz$BdX{NN9RLR(x^i8Wt0KEp}M^_U_L^+Z~D!&zg=uWmI zaNq~lv2U}A)aw!5!Yuq8vdH=6c_5WAbai#%E`=*Ft9z&Cg@=a+e*Ac&bFcC-4}8)9 z{I0XyW&(lJeP*^ztMB7qEzcg+0!q{d5@)5MAhm~PW@Zz`gw!C=533gZ3;^y?lHgg8l4+P2)CgS~1rmJ`XvgAnTXzdVpaNtplFo64+ ze)5C7TFmW(OPcTD!j(a^#mSvUA1m4;HqCEhP5kKs*GG-~C_X=vTHckpcX#IF-N|f^ z^Q`j^JMq6~Usf;K(=pWb#;A3VMWJ>3nk$Zt=}8VF1D`g$ZyRb<)r@f}~sd9g@O_JPSBg0rive8qha z=^4y!5Z=KDOVaBG0}qFP;%fWzR2WT? z2~WOycc}lRG$B6KYE*nP!p}DE#^FF^EgB(VoDsz>tDUj&U+e{$av}zX9tapr%D^fU2f2_EVL$EVaR=P1o`GTZZPF4Y( z=@}?JSc}VYasqujjm+&Wd+2>w{mM5)894ETVE zOG--oPHF#oOE;dbe;lFF;ACAOf*K62GZirPoAPQUcP8pA{&oD}(;mO`?fi z&X9vu@nHAUXev8qY+ITMlI%m)ak}ZFpbqE&#JBjQq^0)&8k5@fVXCT(tY=vAzl?jj z-jDv4{(Cu#NtZ>n>YV|>x~uNDs|FHDdNZig5?@-4WYoHz+(b5Q%`YYKHkLt}wSYIg z=HC%&pyzVhz~BfzAG8&b|2+Cltw_OEffY;#Oz0ARxYX(C3A&oGKkWF6=rx}K{6B9>_N5HWIoqi6^W zN~kdxriOu-K}%rkdz0!o#~jpn3>RyL+fdip+(-`FzS`O-6zv~;3JJ3GnOXEU^( zW63ck$+IVugs2o4sY9p=5BbrVk;A5T{`Ls#UlEY+?`88hD70xJ4ZlB#@;TNTV`n!8@qzH@>kUb2?ZjJi-(dM_H7cmyiGmvh1-^J8C-S~Hu z`-gz$teifEtEgJy6`!)I54CUd$i;a?$m!|nVVgpdcGR;aLSRcu;?(nrsoCL3l}QE& z_;U90f}hF$qi(S`=L#X4{ZT@_ppA9(qJsdX(g%XL&L9oWU^&JxIrgv=8&s%u1*M)7 zO&xcnV=qQv*4>#;BRY3TQ*+4E_U_*0YyEm?s^fhxyx%;bV$C<(!? zmNClg%>~nqb>^QtE z+9YOX;)PYh5JPo+uU${6L>zko%I3wrF5k^wIbGvBC2E&%xwH!6k2YQJ=2Z9xmqpmA z#Am!)7&S2QF8BMpoFe9N$n$z^D7C)Iw`RIvdTT!7d(ySF$ws?$`L^OupQ6pP8~@<# z{GPZ;AlUz5U@e?C{~_0S$=mvj{L%>#=t3U{?HFZhv17Y|9as`4GU z<-lY*zN)}B{VaHN{zmd}JBmukGSR2Fpa2uRZ*i{VZ>0a!EkE$NMMDySelrcvxrP?L z;12*-KP)0+PQaFZ{-QDcVMJRvCr^xW2WwRME&Q&mY*T?dmN(}e#5pu(`}=tf43R`d~RGkiTP5P*8*&R=BP`gj*svMR^7|tJ$|u ze7_%jh|~rI<@cE5p^pu2cH>Y>Jby4ZtZN)HY-4B60h1JXu@oDnQ3fwkIv1H%e_a3f z@le>plz-)DNnd7@6Nvf! zqZyW_!ootAhrVDn7n`*ljT<9BR8%}_)G8WWBcdj0CB}uvtoa`XZmH>F2VWtJTH4K! z!8lteX_>K?7$1w=q36w3ezCqeLGbil;iT67bB` zVCb#@1g0SJcBl0rF7^DFh{_l$p@REdv7mKHz4e^j@B+*`XPh96xCsgfRi&^sTzudb$?1+xXqWN1)CW!ZB!QOj(FsK8MI>%}W_ zGAmv6WhR@8yN7>Rqs&2?YHx23*=ZWw$rdlV5B1&O70VmTf{Y(p8@`VuLX<2@lBlML|#$Dg$ChZ#ZyHByL4I@Lrs@E8O$N>!jAdl zp-tL&LQ>XdI==hoM#%KopN1wpmQx|}YHt-U7cQh4z+l(e(&W61vnpv&W#0}Dl_O|q z&%Dojmu8#OZ~Mm`snfG&+hvsH7$lz2-C>%4Rz;>e+j8i_QTFGIf5KPv*22u&?pYW8 z>?;A`57rXTbSE&u|%m|nJdC)i!CJrWcm`}cqogDa*!n>= z2I~5@E8T$Pi_ZGWGrJJh1^okAr#V=zgUglm++@L8;CXSfTBq>PQ;OcmYxz2o#00_& ziwgnG7^;2@Cy?bKLM>$2sl9*czJng2Rh0pO}1yVWN1*E9p4@mp`)COQ^Tpv zb=`5XCTGuXBEKSgo8%RUgJTa`#STGTt)8y^v|#V%*MW0Dr8GFny1pv6q&tbeE0Z)K zeF5+>@^%sTp0zdCs#ss9bW}1!fU5ryZ0rF2r3@y3$w5O;Px&Ex)9LFG{u`%gE=8`2k58~@eKRuuJoVT+4C=(FGaS86l~ql?Q!YEiq1U|6T^fo z!^c`fV`#)D1wXv9B_=eebM=_DjiwU9Oq=yn>^K20Njw;IdUz%a3Ja@z&I8W>>Uw&5 zHh=pTw5ZT$TpBpGa68L~V29tB05w)`O^S5Efq^K%nn-dJPjJb_cz?VxFbLuIKgXzA z*N?!EZ0%sTTNB)CkU1>PA?n>}nyn{D*2jmsRIj7o%@lc);@SmKwww|TDjIt&Q}|mi zIog<;{igV|rrzBLtLh#mb)UO;8oz-Wiz(^*ZaUk24J|Esn*~m%jj*MdE!MH;-aSL6 z0)L;{hJi1TNkR;L@2;qmLXLyo$aH9Rn&aJ%_q?8Bp#8&guNhI}OIa+23@1=K1AvCr zVAMx!K332op)3YP)2v_IO47A?@tBOc-rxl;fj zjrkLl5M6sS^c9GBQoy8H-WnH-15M{!4v7ACEx8?A1V8{VBl75dK{panv5Rf~`4iWn z;V(I&{3j^8j*Sk2j5b(?givEmeO_RN0EmcK@!72NY?*LZj4Za_WpNXK(B}S+T$|zY zSP|R|PS}`Qy0xGlLrl(y!{lpUJs8a9p$Y?rtq4x4XMI`t3=G)>5i|$?z=6fd&3pIV z@Koc{?Lf<`Eb}`XSV`Z9*zpt9hQ|7gSH51LDpRp&KwFhL!Z^+%VGBKpR~#*)!PDxa z6n+FzCZ?i_xP7tqfEKG;r{gm0??&Cbxk|{bgDZ391J`1PFpmhO+Z~?@SLh;@9z5Xa zY~S1gM7C)1=HH`(iHno1DrJjp_;+QNNA?6<=}jhgXq;_)iYGswZ1gtTQQ*s*{L%Un z=VICCY-__G+0{{*?av$;vibab$$|Ns8<(a2(jZMKwScWcdH2tsw#B&H+vU$aJ{2Ug z$h3AaENBVvKjnGZ;G1!?GUX%9h-y{{g}VcLXKV9hak24DW>z#4Vo`Up5{}ZCkqHBA zll3Xe()4Ue^KDm(ZbP$`lQ#~HEzxO0;(h!oQ>TKqbeJM9zUmh%w8w6FqKZ{sq2dLa zX%vUpw!CDlzP!=&UnM~MSGT$gE(k~tFm8tqQ&(;()x1ocJP8d|aZ6J;WX`Av2 zfxI`k{1KHK7=)xwmXZi#p14C(`{4FDD3`C>DWyLwYU@g1aRLbqL5(Fke{B>DugI@& zx;)?cH8rIgPJ@y|cBe96u0$?T4DR3zG+FG38T;}S7qDXJaUJ2`f*;njJ@UGHHqE9L zO_G^`_LK36$pKsAcm=acMlPPje8rm;;hR>}XT!5FNfX=-2*8VqaeF*wKHnNbNlp_5 zF?7s8du3&1d7AB8AU6BXANH_#JRMG)KN(fv$UYDF+|{L&s9$ciXJ#lCKu?^I0Ob;a zDaQ}DxvP6J#7PAO1&^&aM%>S8dyGqS23;&@Wjpu)ckY1Xk4d7bu)PUzl+R^<)G_T5 zoduFDiuA5Qxu;WIew>=lxV2qFnZu;tr}IMt+llgPg%2|2pbrMv9weHt)GsM6_Z|ea z9@b2nnB_*{Cc}| zpT5S)^wPKWv?{u~Qs;jL!M@HIyd4*CN=pB97fe;^^|>V?gPVjVg=*lG2Yr*UsHl9N z_153lev8x>XCv=)lx=;8qIRGBAWfC9mr5Ai=7wDv1oa_c50_(4N}$O5z(IsfL_-sW zflL0UTCnIV*oI532ia}MzhJ?|X*cy1HvpH2!|6$H1jIOEAy!osQLnkm;{1!KHdejd9rg=%kY3%bl*P?CJ$H_MVg$n`l@D(zC$rBMqJNs ze1c4Jh&sVO$rKxwqURp|D=mQu+sf?4VHJQ52vT9$uFpe$6$RQ=B)SEJ(V)7_^u5UW z1ttyX2RCOLXj1r|ywv%~))vg$%tVF*F#&jqcAebxBa&(8W0r!pqwJsq;z&}AKG~#F1aYDdQ*9sNL0jVoM0TH(8Wah&3 z8Aiy^0Y)$<$SQ*92YFVKgp>9X$&K*$LPd$H#h)ko2fpW(B+CjN8G86^YEIoYtoKYf zsM~5ahNhTf{TorqHmFb*6C6@+B&%ey8*g{}9kJ7QTsRZr?(b-8uxR|jma}>3a|@ga zRC$h;;36v5*B>5|kWEs*Pn)|f2c1I2s8LW<6fQ(ojIl2(F%r$eECA~JtDyP*kC?l& z^R_@?5fWMi89ZR8($LmM2g3uXPMJgS^h`I!eUBZHluYT&hpA2ih#00^O z(lj=XLm)=DeXUTk5Fzwg<%Fd$H4WOCfe z&I6WgB-hCK3=wOeJR?!gyLTAS1qWA`v3zWJ(Mj)v2b0hZolmmRges>$V|G9=@i_W+ zNV*h+t3lvX$N(VxL-q7#n&a}1>lspBBygkd0m2LsVbDg^tlFm6K>swjHL^K==pdBd zBcLbY>91F8^(FO}SwGyyzcghD7qRR#?L&~bCeml}m*v9;l{T`I>j{tc@-TCA z+KQ{NY2_DGhW-Z1nizwlo|bsR5go95{-%F7rKF@vp>8mHfJi(XTh_%zs5kp|9GHe7 zg9iNH*C7D_208Vr2jD1%yAlfc-yHbpV41yy5)vGfSPTQiujC-Xh_69o)m80;zgna0GLFg z1VD8n*Ct|n?GxYv+1U(G;lcoqDpXJfq3$kt3e0rsr%LVs0^4@Bkq%0y zlDhgm8=DVW0}i0>aYWLLAOi%b1y=m9ak*P&Wt2!c1OqiV*%Yx0#%a9hS^4;PUL5kFfRN8gAu3hrA!KoZjXemSJjADpL_>g3-S6YA z;-VrZn^X`%B7SR#*^W5oeT%zClKZ7K)!NjuaJn>RS9-`UOAaa?i&Ka z-U1+~WV7=_RmL>M(MkV^2wz@Vac;w;AJO*3iEP9!Zp45_zWkKjkc+qD^+938!qaNi z7eo%mHmo=*Q{HkoW3ku=GF3&5@&TAA!!|xz#V;HLF~E$0DF;0uAOHXWOsFaO1aT22 zdndlIE6hXQLN&~`fak|UGyt?p;1g+?o^I$o1e5^4VtKd(B>DrkX;9(aDb~pY7Eo*m zC*&pRJBt~Rw}Lz06f&K#2?*HLy&M=J3jkcyk0Gp>fI&u;*1kgq?F9-#Ibh$o&c2(t5M;1ri(L zMvVjLW@cu_>b-=Z4NOZ>RZASVy$A0Q=vgH7tgW-te0Qz|d{$O*wpzNnVTkg6p*>2> z_gKJwwh_Nr=Vuvi`k11kqB%g`c0;=m)dnqLm!Oc`9S|KJL$&!rSN9;L#i_wYo@EFWAj%SB<8R9OO;L%6S<4_R4 zH;mArcL2xI*hmlfGI+;3iw&xjs4bp6p@U4bbe~wiCc%nlaB+}FPzWu<W4C-%w zJ#S?tdsQu+Sn6hS>?>olzV6sQgx5UqD|GkO4e!5?+sp(Jw`pmq03^*^fuPCIaod%6 zQFiVzNc{ne+S|9xFlK<}_4xFZnUN876%#KoEDQ@gQFH6-I5md7%6&rAF;@2W_aIpV z7PBUd$KiUWrcCf>2o4H{J{ZFO1_&P%X*&<7P~GGr!d4QpE`VqcZ*y<~FFx35MnA>*ogsZfp+^4^JN-(lY^Krkq>r5Nz5HHVxP^ zwISUHHY+6e5PZ#QYWU#1G`*QNAvS0mrk|@ZS5%nQdc3!|V=$cw@7&0D?=BK40nuil z#$eOD9xA-&DFs|E(&QsSn=q@x5jAs*i$O5hSJ%~jgJgPOMgWz9Euc-$!P@!`a;YCa zfD!s7;Ga;~^GZugpVXCV9Rm)^KKp3kYswEuLl?(++kHMhFwiPaQIIB*7uf~I7!&}B zfTlOYz#vf${3OL|9=(^r!RSa63|knB`48!eDB6FWM!SWHV-*@n!gR_X4%FN9AJy;H7yRas1= z=j~mqWzoRJ$yuFBPZl~#AMj(XBLgL4v{FF z`ooFm;W07oFh@be&4aFMq{JpRY9MHU4GM0K=Htgo8ItV#-%2Xb^z*2JZK93|9U=qY zHp%zWDLd}o=v)oX@WHO_!j2(&Fp06UvzsB=4N{)Fe#+B-4i7uvfkIkognokjW&oqx z_MS0tpcaH-EL+?h|Jo*Fn~UeJpQZD0xgNG~_);!<8q7F`{#yDOKPw9 zOR~xyJVq=K4TLaWkhlN`&dA%EO9ns%p{AkH)Yc9LC5!Vz>L-SVj7i_Sq~8wPe6P2* zv3Uv34d}DZ%*cetm$J(4YipCStGx*ZYl&=bY13Q_HhP63&e*~Y&vHrwE(2_$TcBhn>;+_&u`pogCvxQsprwooGh5F|14|{Qcs2k2IN+VT|PrXH#`u~ zq^jrH)EKJId_BAWB@TFS6KI1VHCq8}PH_(tAe2X& z19;EDd}KCN?Q{&y5`eWBP%_ku>CU9amb#%%mX#%#GgM}dRhov=`xx6=z8OD?XOc(K zMj+McPqnDl13{~PMr2w?{QA&^IsH3!GNYL+IOyI12^Xv{=&#!NDi6Zw?1-_^;YrS* z)-@ZoOPx8wymg%HL507^e>n9l%m1e*o}mjvR`JKUOmfd2~@`*6SIhh=tQ zXiiRBPg;JAQziUDr?Mh~Qhf_^J@@tQXJ55^s6v8+5dQMT8uIe?P7Lo3YK7bl0snuVkjD$IJyfB3 zCSv{6G%%QCUyf0$9#gO2H7!-N9VZYu^MGSYU~MBIQSn-P8t&73R_350TsAZiepfOOu-r5tYR!Afw>7CfT%VQQW!lXU((p02yur2Ot7lGg-p z1Ssd=swz?FN4MWjq0lZr z@1r|}AIL$<8aRuIh=@?4qE%t;v5-9gtqBX5%OL>>X}6GR6GBgb$2sZ}i6-R-f)xTx zV2_5Y4kn5z`STG}V(s8J7uW1A`GcngL3#uPp`SlH#BEnVZ3%`20U!Zb^^gR!5~GGl zBrjP?N-@Qas%ib<-RE<51GVn#%Ax4_&Guk39 zMJ+9@x}p+LS0Jxf)#AzJf@|t{PIX4!xN2zr8#t~$0BUe2$n&L0@;>?^^fD1p>(f&t zBN&v`IS^3`$ukhLAOdT5a_Cc;?r~Zz^*yPVMdN1J5zwcDBo5xl{WeN^SBoCa>e|}Y z;o<9G*`$Q{Fr@mz=_lZ;fR8X~#>Mspu85$?<~L#5*GjAaMj^aBoIL_lmLP>;2qM(%fK6%zpJV(yvq}n7k_XvmO1v zt*G4)t1P_Qwp!vvD?c4Ce{g<`Q6C%i_e6^I7(K9Wl~i%dU!FMuIU5Js$MD$LP~hUh z(0wlt5_uV0S-PWu13G|9k9hM|fte|riwq|=(Zm=7>J9L`pf(|V*KP zu`YIYY(hX$J-xh`SXqPfwP7r}83(&99;Q6a!q1^^g6HR{ zp_{53cn~61r0s3IWtl$mL7P)h0VHehs06BJs|I+MSPD5A!sR$e%N*KMG_Wh-%W{{+IbKNXaghKFpSJ%e4b#C!&BqMoULt$C7B2Jc(QK5I- zT@Y9*n~I|+-JvmX*>6)Po-E{Pa7s+g7~#)+D}UcI^zCLsmE$`cE8A_?$*=F)JqgNt zWB&7d7aC8?hS2B28Bwx&PuXyKcmu}=5>ldwUZCf`xTBDo|5;36=-1mruYUJ&2%Nn* z9c_ZN@r4(eeE`6eg7NZ9E|y+rpks*drkU`(Q6mvePca(XR*UT&b#p|mr_5FG-`frM zyD?tGJ%$El*x-lDo|_~8^cME9lG_o}TJX?#VU8m$44nW#R_~l|jr})`dyhq}ZM=aR zc6qc0zqzOLZc~`;w)bA#iTV=hd^+{tWmFyKxunIGHX%~*IR#=+->v_M)y*&vRWNI2 zjJ>LmNr{8gi5xHi=`2_uRJ()=0)~`n1}_sj7h4_`wV9OBR^>i#>g}<)8x0KQAX2iLvuZm}g2- zQd(G-JPc<$R$0csVL8`i6evH`(D6b2@_8 zIdlJeC)#>WOqlIeFGYYhigJ4-YuQlFOCF7f$MkXdRXH4M@aOJAM{G5m(6xKw+qLYB ze(gzM?3*73SERG!?%%~&(o+Ff5%P*i*NUJawFA}y;gi%dF-ub=_uUx<(ukLq&oz#$ zAmS^>@m2l!NDan!L%N9z!*O041!%_Lr81TAU}CHo1^6zGLrQL<<#u&r3_QO57&G+6 z_$6s8705mCORg^4m_jkS1}b*;-9ZT$I5y@|^Lk7BVZy~CuZ0!g{SN#3OkGWaBqfyV ztG_IBERR`3!s;ZGTj0b0O|cXMKCT0U_VRr@n(h%mR#q=6!hfzj^Q z%re;-LuUto5n#1l4xikbf6jkXHBmoAor>Rry~Q zu%r1x3LeBew8O|K9`Nzgr#8@QK|&cmfTXaniCX~`V}v<(=w;t33nXa4c|GA#Q7mhg znUI!9V%eL~0$3hg93jfW|E9S>Y=s6Vn5a0RjD#K^9~-5Ijea&(ghQ%ed4Te!>qL*I z_y}Wh?rNYRpCZ^3p?4N|9~FCcaegQ1!MiGfjcuW18A2}atNfcY z-6wv^wAyh5R9h=y*yK+K4Qn%kDMEA$l0`K< zEU1YD`yoKUy}V!Z=2Bk!td$P41YrFItP+nwh88}|_@B$c{oo-5!~l9zP&h3BHi+=e zaKcj*XwFPvWN>}!Av;GYslrBr9?4p5dh6=%oRJ>0yAk(#yb2y_{2_bJ-q#w@YDmk) ztI()3__^W< zkXQ0|3nCl?hbVYxkhKUvMmwaVAZeHY)40E3P6e10X`BE!1y=ePv_XP?r>=mu=Jt3z z2k8r(@t2dIj}Cl`A}kDOq3Gz50RXwfNPZE*J|OWUr?-FNQj|ixD>gbB!ivEJE&#o( zgqjd7M2`Xl;t0$D!ZD4OJo$E?zabdLIQNUWn&;+<+YI0ng-vlD*v|ijCL;YN05~4i ze&BsUpd#q*02MWd@MI)a0y2_nGqc9CS7qu()Humn@AF*w)00{3o>P4{2nY`dLVt8y|X<*rN9ftF>>kJvrN z*7AS*9Ka#~rK~xC!AMj3n(s*@U@u`CBaq#Qbl8wy45N@ad4B%X#=W_EMa7P%vETw^B!Qjn1??N)-U z$vSH#$U{SGMal-5G7SK`rK6F2n+1Pe+qZp2{G34fYS#VcTCW?kE(uAMEke9ck zzj@BRssWU%|0J)YP$3GDrgsodb;Gruv}SZ7dKnw3mn`##li+0%=4`ueIfK6UuA z$+h$+9^5(cN(uC&gn&Yy@f)L1$3>VX3ZCWDdjLq2J$jVrvT4dciyO!QNgAq*?*fgJgR{B4E<_ z(`U~X4ja7~6aP;Our=uk@nt@*R)9m0<iI4ZkUCSv?>I=m`m7V(>p^0s;Gte@6kAqO2s!ai2RI{mx3^Xs7>BxXk&LP?wR! zT&83dgl2^UAtfJ8z2krRB=7s;9wSB66}43=>>lzP>qGe18(|_v#l?5w?6JtGNFoqY z!eI_fGE6PoXkDNxPe@J2V?~D;Cpg<6ZF=$4dP4`s zE))tDwvET-lMtQRm)&_y3k^wFTNlzjgA|=M+rmy(O_@7OC z99y;H;Kf8BX~R(TW%SF?ShOA@@;vvWGPeyK+nMrf4^*@85R(51oE(Cf$0m6M1YD?4 z@S!+j2c~DfI-_{a_m1loa=;TSfS(8rVQar#UXPDbkh+pj!ljnHSx6Msj+{LLiL-Fv z!wAbj2lN!CK#oJ5L_T2T=(`L!*9|fOK#gDj3;71V6eNP}IQ#O1!2(tZz|xxs6`4f*ba;;K?u&A`I^rMC8QTdW$>dDy@0LHWhyW621U zS?e6!>#~alJ=@3C(M0LJ9cPt6WX+#$h^L+np1NOVeIA|*nND}A%dNz3vB-u}cP_n3 zb}v|gQJS3|r7`?|dp9+9Sleu-mfvyz?~%{b?Z0g@aANH}Oc1`s!xD_s`DFE#QNU~8 z0_i%${Qp%?*VMrKK{Zb}G%XXAgX_%=#k~@wU9o%DrGT*k32OyB5CSz1C;TCB12GeL%y?k| zt=$avtpDM9sc~D*Ub?aXkp}En^$w+uMn(` zPh>ZL+8-SmNjw4xKJufX#)p%7L#GFecx}%eMFiQ%kii`5lHrnjD<*DBDO<)3C+_x) z;pp#)4kG$37!y z@&37ulKUR~`y#S<&Lo3z@UVk<>?fAKAFle!bhGi{g@vwXUah8@5{(eOB;A4P1-`G# zKU8Hh8FJ4P$Y^7qk`|a5YU6cSUL@I8t&F#0?;W=1Jh-Tv?i(w5+hQd1SjbCf!^7?& zOI5aH1SqubHR_m)CcmP}zT!d~YZO;9R#>$Qwmti#89)^FHaEvXmghjT@EVRJ0SwFp z^hR5Wa&R0wG;rXj2$G;7Bb#nx(OYWCSNsxTkk`J{zy75kEj(Db{X-0Ah?$t@r zxP=tlOwd<8KG-y?>#R9?C_?4%t@Wu=T*PX=Ni29*FMFT7T)R{Jz0ROF+rELE=jPv$ zY7PNmfmB*cpX_ln?Ij}Nir>2@FP`k4&bjTMF0Y65u4;h2)$OmhYr9NC$l*%zr_A|6`=u;_Jx>uo@`YTsCuA@?gF+2ZQX>gB1ovA`=z{PL#FAmsfNHh07@c{ z9ulPMmW_-S&>36rpM%E=kzsgYYLs8+nm?f1xQz||Fkb!MgNi0;ns48}MaW)7+0Itt z@9-MOW=eV_ioZ!oM{Es;KipxzLhKhO=RnFK@-yvMDJ-k47;PM^$mvr+dp0=x+s;Q@ zl1v(Rdzl(yh8|;>zz4KHKI@`>1!Y7pUh-r>NKoWTHBE7y=SQNRPf9vIi}?6>9bk$R zDS8Qp@+;*9^6UYBl?zu7w|eeB9>*2oE@=$%+Gs4LSzhOC7}6WflRlH;gkQV}s>rpV zS1((?ds;jl2EJF%ZnWZezlEUWD{|Jk1KAV(OLluu_Y;WrY;(7^>g&E(Tv*6hnd<25 z1QY{~f#}+vg@ziGd(o!fLdAPx;dp?%pu_+Gtf~^C`8XoudjnzG0Xe@lmYiu^vv_07 zh}rh&ub{RB((9~W&=;T(viKtYWiE)XfKo4g_mmLtu{Nl-LCeE2Y4B+7xDJHRU#A_NLzLhb^4yihdB!xAWGZ1Oet+|o6KIEXEwq-Q5&aN+Y!U$z>9hH&od!LM+<{MEN+#7?A3b?*ly)#aU;`oW@TeV z>yH~78^L##ac{x){SJ<@s{*9BM*_zWb2@&ex*~QgxQz_?!hlVMhIV2a`2&o3t`eEw z?8wG|g$x7>#^AQl3t1F^gD@vD**~eXMiu{R*2CLyz{bOCYmcJ1g7P`qZikRv6bk(3 zoiI5dd^QW0c+F_#)xhvBrC4EaU_+qNlz9(xBgs>6R4!%mn~58%6bpVkG8f{jwuR1@ z$?KTR6MJFDWdC3%)5(^JE`Oiv{^+_;+=a?aCq7PyXw-3qsFBlOx;ix4JUNy?A_^H-GAgK z2aH}_L&uDwdKMKzBD!Afo-P3P;=t=Z_!10gZxy|Hvrm zE5iV~J3z=37}eNG;d6q{2aqc$fQY05R4N2_%qO@ZN!vaXoQ)nT)Eukx9ApFE?S)qD z0wf~I^U911GgaO_L=Ox8&q?=OTui-dFo*B`*zw0g94TwV)6)bfIe9t9g(YRk&vUT} z%Sx4^0(Fa+`yWo^)Y^HcRYWZ)W39&FyBH%n;r8JvA4z@oDdmi$7g0c;c! zLLC`y?`NvGUA5PFoiOq7tBgM~TMh1gKlbV6N~}GG)=?om@8NW_H8J9AV$$E-qjuG| zz>5g_Y_RcmJj4J(sB&#ZMCi^lKs^b{gJJ=cj?b7#pD!0tD-h5PKFMC&>jxQx; z0kQSNO{*8+3mU}QQZVIPn_cO$v@JcWTAnRx=GWzSRGOSm*NqP-L?bmPWpqg>Uu)@L z3J$5U!)DZC8GCXz#^QAY4v|8P9uFSuXe^g=PzpW6^Z#mb4W1VX?GTHozyHC-M(og5 zIiq!OquE*5?9YAG#e8Ou%%czIV6K8KLY}>jLje35PRJYwdpr~$Py~fGHQfey0;E(4 z;iAxDQsN={26(CwDg|5&2HhZZs-h0KE9h$$8882Ww{qE3)B@N2Lc)m z(Y0n|J$HSPw?k4zo<#hF%XK5}Eo&t%J&b2|-Z-%;YV9CdZ_T+A1VVgfwDsMo&7U`|iuj%sO-}eq-5{adUSXgF>%UGfije2zEi(tvi`S zulx6kPlo1~SK<5A$L-wfADjH=wV*ZTd?CEA7reaIHKJrxnnLJrbc$sw;Zi<*;WQZ3 zD!|7>ofL}i5aYRAE=}Q(uHO(VGg<0L)hJaRCZEsKOwnU>k_T=3~P(Tu({t7W35 zKoRpQtixmJGD6EMi~>Y}_=5!C1+X@7RL&$_z;vyff(fhnfH8_5d?F%3lGBS$ADvl%BpI9bk?n^zgc=Yal zhQVVk@{p;d%=+@}4qzvX039j7kzYoh^B9HE2$+V5h5@kafD=>KUI{{RLtquKxtQ%Q zeW&yH0Bi%%u0QKeeSsWLSfuU#yc?h?MDPL?3K@TLbv`18crAh>#40KA8VWq8&EPMc zJU@do(NQSG8=T?ZFbhHSfWgKMp60d@}lFy?%Wk}3Lug_oIM7pXw` zJ;~(f^8n1aP8V-(fxDy4;W@4qcCv1H)Q{GE+`cf)G}5Uoe{Ffs>|KZN__!;-`jh~o zXX5YYKPfRVuf*st-l}^}q4@6H=c;sBoO+==q!pwqy%uVT{>~%k$|jxIuyro=3}}z* zKvhHHdUClw6A2E}%3f~Bb-Ixny<&lVul{w{{LrwMZ$B@96cM?8#34^5^z4t4^5Eno z4RUA&d{PK_00OyR)L&!>ihs>Hw#D$7NZ0?i&lcs^t+M~9=pNSpC)jqH@I~TG>HP=& zNiLALqOKh0I+9Ab;K{{#ibH>LSqa$3!w7Vo#(pM_cJ4X(;^Bcb`Co;m0+fgi0U#== zgKnXQfeTqsLWwq=;DfFO!d<|*lh-Hz?9PYpIUb&p*KYi{M^TP|-|%wUxGo?anR*02 zmxO}ieKQuV-mR4br;n9yBsj_Zs8{>46(MUH@#^r_TpZ4UI0>#RCpY)S41-^Mx!`TU zbh+_(i_afO1iY8yBXToHNc<1I_VOi3mHIW>11(U&ekVo69@FUL%<(zp<^2AL=t!VN zUwY;G3c~&%6f9L$yRDEvL1d+Uaj*Z=@LSo>Yt<_$QmR)x%G#{eHb9Pqyy%@4I^sp> z<3>Mx;UE*&=`*c(YdG2Ftf^R<7zR&D=fJ74}MNTncWX7n5ByxcWL*H6v<9y4wd zKAfklhEEIzU*10`XJ;2zc?5?LJ$jTp*p>dvO5xF?>(_@+q7#^?;fjjtx1%U_ zEM_Y?rqHfOj*qyNU%g5M1`m0G;xw}!WTe2I?RrYVqs!WbDKGr&)xjUfOw%g_#-A+5@msNNWtE$&k%omIqT~zeK){-%50Hp|>_S0;~wYT+^#p1^T0ZBPF$6#P~|R8+fIRil~)G z4o%tWPF?Nr@DsO7qG9{37+zCi>1-EYo{IeSst>dF>$*D!jmeQu^%B-Gn1YGqlpHq( z=bnX$!jU%L=4Br}B3W2W+fYN34kcA*=^mNDQTf5ARFhx50{Q5%>Grh|5F+KF{pjyB z{xU8uF5s8Az&%_J>_osMKuQqiwN){C>N91_7a>KILkoZg5g{f%SgOwIoUsyd#+3mBdh7y*Fz@zwauGwxJgT+)~|dp#Q^6xv+8p*lLXq?#UUN|`XnKCgz& z6dXS{^0}pF-Z5uGBJ!;OJ8z7`Z~11bZ~rnh!bgAfIyTm;-kWZ_#lgiD0cLC$VaDAD5S~_)X8voX3*%ya^37X9}tFq`~L9uEcX`L5iA+m^^C>vDl03$02||fHaY7I zyW;-e&jEfKvmQL&cSwB7?G7#)XgRPOLi8|%ap|)%)O-yM>jqr@ce9S>R$L{1xzYXn zQf)UN9E$O+VKz{Nwm|>Z$!9eNr3WOV`B24ogBbn=0-A=LWwyVP?(h(_(+9KJ;x3`! zV%mq3ZIA>EfA}sirz$WK{Z2Zxe$xTIpdP!b=?+ln_w~U6s=$NM9K7ZBZ_0*5n6F?0 z0&QX3oEDy)8ijye5;gS9QwLGHxWA5VL-Pi^AS26MaUu)kPkL4To|7*!g zLLw`B?=35ZWM(GWd+)u9$cm7JkiD|UZI8$%y6xM{-WehDIqu*1Ja7Ilo)>?w`p`YD z>pIWlJjQplN+S8NY^5-%+caiLzTBr2`wov5ymOUuVkPfMK3{X#q7q5;w-%bI`f8%g z$on8Lo-@U;CHkR{?{RNuLquDpCl47e#!015zhC4z?u~=TPre*VCh?e}Jv**KpJNeH zlsO3i1V4#G7hd z-81YO&gylQ9BQ7GnP35U*k-CW4u$}4p*i^m0JX5c(GJR+ZW;M3*_H&DS96PsvNJPZ zgPhsGuWQ`4{H_bDx!@kJO7Tg`>B*9;m3W(Aor(v<>%QiO@>!(iN& zMJLyqw*WumQ>0~Qw;k|Z8b8!!EzX_ggjOitb3cns!}HIVt6xlRDlO$nAI|M~fbK7N z47upWYtRSbONID3fxD8tL%4V}08mJRU(Iai+@KYrn>Uw zgnhRAzy0WWjeljUyq~Y{v4ypb)z7Y(^F;SEetf=KPAn}Vhq`B<+xOgYwoQ&o)YUcU z0i61#m73P>@7;!N7kI9ZT9JMNo6QbE2JkUJ1@S2|m_{xZw<{RE!2eZUJM+$x0GCYk zZ2ZCWSf#F40=|)CkiZE|T(;%WnV;Xmo0(lZc|}xTRUM9PKDH7g&XC7Bga4&G=GGE6 zR-POcBp<0IA$(X7L5+f!aQ!&F0Y^M5!K5hVO)#f%o%A@jI#o9#y<0tH%gC#X6;xwV zv5VBD+Fg^?S!l+l#!$C#u6e;Hz+busMEJtSFSdF*?%`uX}r{p~mTTfW8Es{@B1_hfI6U$EjhWF5o5H>Rd&Q3VcAQtZ5qWx3V z(fTnq=!^B2%>GTQqyZ{jvrHy~*SRCNQ^b5<$2Jw2d@BqmNlM|ku8rw9d^xEBKeTAw zBC-9A_hHG>Jo^TYK-Jr_pju4ZM2y- zJA^c>G81WvPv~I9!ew7!sh5tbA7^AdmJ9Xk1(TBM@u#|12}*H;mj2&dC~UTzQ) zoxJ|07tKzB8}mWrQ(Z8w>G3zG1AQh#Eo+Kp*9P_q(zL3AiEOOGLiKe#y(X6wF&&nK za(lsW^W}FEzQlG29lTonpYqoPkbF-yZfj^TH+e+6M^Y}dD&O46Yf6#7YwJ87;eawH ze3?;5M?l-=BEP&e#BCCl-2CxrhNDO_Q&<3OA~+A$y)q|NrO?5Qy2Vy9Sg?+q>Dc=u z-x-7;@iD=-9K9ZmgQHB`q)Fefb|3K#G-J^#49o|-!0za9u-L;s;YiW zOoX8pjn=BM6iE0J>nB9|HT4%HZErJLWIy6=$w0(01)*f-o=^~HDQb|TYF{5n1H4QC!N5$LAiEF~c6ACqVGo`R9``Ding;5X}V2h_$WhZttxu(J` zd!&%or?(_Qj<< ocmM%F{tpWvOdWMairT>#DM-F+mIoFI!x6 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 JfH^V<_#duIEH3~6 diff --git a/CodeMaid/Integration/Images/about.xcf b/CodeMaid/Integration/Images/about.xcf index c64e4c83205f674aafd3840bae20860f9a860880..1df5a61c8734aab0b3cacbf70a6f65ae21c3db24 100644 GIT binary patch literal 189516 zcmeFa2V7J~)Hl486?=*rEU4HkP1ptLMU9{_y+KT3XuDvi?SjSemdc=weNC~i2m@eGycr=*EjU{l&%ZX zTjBa@IEuEBPni@RY7;(F9s-gG@g}0dQPIlDq1I8;Cd)&Hv>hB49z1RGw3*g}`Nd{t z_*avx?QQM(zZcv%=%a=p>sK$xYKXUf`3+@NL`|O*ET0-~?O>=2MCFT!dYVnlRC%PG>Y<13k!=1jc#Zl<$j(dP?~0?elYrHvPB5IV#BW{k?$Bq>TgYk2ay zq>#{=eZje~X;YEo{m}4fq1GSz8z?qW^7v3|2dP2egmj!LaCEv{5jvTKVbauS`J~D6 zNm15HE*z65O%0EM+*|hzooW*kMFoB}DJs+^L_RY#I9fh!s`cdPnIJY7{03=y{)S{W zA|@(Y9;URO92yo)MNU)LOqmuEY8|4SI%$eLSWn_|+R!wa9BqS`^M+9$8T~US+0g%M z5HUTE&0U3vS4cMS?-lerzmg2;|25=6*qk!};&xPsY%@r>w);f5b_f@)BGDXiTH~L| zNm2cdBr{R9$!Gh2|NUS>`!=E)pWljV?*G!(T2!xEX)4mTQB4t>it64x-p@i*y->3* zz~$4!mIFl3e)euR?{?MAzTJ+u6N~D;tQ|8{^wjlR(Xk`;uX*+q`76bu`rPHMMde>! zsjk>L>%FrD&7u5~Wxm$=bYkKdS3-BBd6)pQjd%#VR2Q?B1khE=yguHTW%Q`e`JsIJY^DW;;L z*B?z19n3UCSKN;^dpJ=fTD%7tu9}G$<=SO#a&F&{HY4$xQAS7I2xN59^)nM`{#+_L z_>-CF$$<@`#Qh?Zys^l(NuO=Do9MOW`ITp_MHZB;b!7swIqUi$+aD`M2UjCo+EP)! zs*Y}Xc<~ReG!xZQZM{?$qWY+h&_634+2FTBwaiph`zo6#I(WuZRQ39kAd%?Q#Fev6 zMfH>iKe(GZ2PxnD)kG}HZFlzZH{NcaAGZ`Ocofn{dg2;-_Q&-W79zDp%;n0*8Q)llOs3tcE!qI(ad7pL@~6M|0xMe=g9U~P%|*36 z<9F^|;?#pk7NRbk;q-F)8)3KM6E>i4mqtv50-`uu=~9Lu=VkikNPaG9@2Qz z#%yrikepaU>an`EqMFxrz9P}hS?IxkRtPus|ExfJ0t+lmMdc=OdDZ7X)LEnVr{q80 z_l9VPnNDYJA*yMs^Aq*d*&tiuW#Ohi@iLfbeka^aR6LV?ZapEJvfW!Vz(>77^vb8Y zu3cM;YC=ofi~MwLkS(-SxTy~J8G3B(0dqu~7EML;h1nv0Q-1+sSZ7uoA{ISME_}!O^Q-!N)s%0j?vwVYs+Hyo zv%zJ(M53tj3D%1WAy)buWW`&AtnGhdPgK6To?run^AiRH`QdSynW;!;E!I_?hLV{5 zuHQy#>iEsQSMZ8`qS=dXdB){W6q`S;*Ca?`gFFdxL{-$9 z{jAf~e_$bcEKRN3)|F%dLx?A1(ZzYDx|$FSB8>zJas>I~P1}0W#qv}3UTaaM_m#q4 zJew2Ly_uA&QF8R@t6N>Z9$-7UYM!~Mtlg2XoIU1g-{rz4T3YdiwF`Q% ziP)f9`J-5_%dfmK-PBxE)9Of}rs9vcfu%=2FinQ;G4*X^+sx&VN6>$!}&sCa*sN7+H;p5}|z~`9Un)Hu!);o8Z zitb2z zCZci0rlJ{9dsd4}pc1yN6Zl!b2a1K1TRTzhyOkzl7GWxS49t05>nxh`Q>mk9`Ojve zXS&0p<@-f#pE`=10I-LV16s{ORQYP${+pG$)`JKg?h)$z@wMpq_-#tjjSnzgrZKGFh&pdRmi$syS*00n7a~=}r4AjVWi#kFJ@##v*g`B{r5wqqni>`3=^Rbzi?}F*D_% zGp#3t#ut5F|96;Bulb{!^#2-U zL*MPME#wg;4~1)Asc;>H zQ7Qc!mM&a}|14Z>`U+QDz3F9(@gDuNBev7^W8pdih)@4qpfl*-gtvt2#ACvBs*iA; zKS#JO?7XKHo)*0O()VKf<+Ox^OKi7Ov&x!u81+el;-_-YpYTeYiuW zK(|^dT>A;8r-@y(5Oxy!!Nl#l5cZuUT*nB!Fd6fyJ}eim{!@hO_!+|Wt#9?$efsMy z;W~ldY4GK3;dxBnep4TwroUojg?}b*r|Pe2;X2V>xQ6BlSJ{2xD%aEHpXuLQ};HOChxkylc#8CZpy#5LmgnuRx%k@|N^G9UxFn&xO-NzXH&A~mxUw`~v)!$S2 zzv!PE(^Z%{HvE?J`!Z8US5{w9!Y}2;{8CmZT-2tHBUxQV$wNHzi~3~&=(+!O`@_J; zh8_`m=YPImV$ml#|DF3~&Z{Eb98uaBuQ^`KtH0OPIpRE~EiHOj;>1iUOj%9E>10L7 z%0dSosye&mqki2wSaiN-$EqsI87tcIY5z{<;<_+(`EaDDEob@b$8{HrYb})pWn~pZ zSan5t8DpxkU0aE3+_&8;Eh?)RLrx%0dW znOQjxi^~V131uZLZ(4T?ab=J1)308;onKg5F@V*SmldpY>aD=`zUblJbgv zNM2rA%u?)Hi=PclzI6GcV3^LF>OS zGmA|sH1g)P(G$=K5Y z!R3VyOA&04%>`b$TsF%}ipmVKnZEDm)w>O{d2z?LN=0mpBEybVkZcyGAgoX-l(T;n zq_e!775u&sgt(Y!W&9dJK#RG69$lbRDq^CdVij|KYY@^Z2Y_nbt4LPwt%z5~nnyj0k6qs=uGJ*27Z=7W#8FR`3J7L{z~V)M zz@{cBV-b}Qx6MdqDXNGaP{zlIQJi9Xqu2^Dd*b4w5u=P#HA*hMMTKmiBEA)}AfiEb zYe;qv#DZR_h}+sAy+khiBc8}{ik}+fw;JT48?zHoeq~JDj}0PR%|&=2r$;LnHi$9k z5aW&UF|DGi;uFpq1i6L;IaL`4sv<7MAj&mdl;_O?HAeB1L6}hlgn5@Tx>Zzl`~rhG z*Kl!8P_&9NiK|I92sA{s;QnSbx++?++91+YS#DN>68V)02BEGYp+=$NsOo6NR=rr) zl2|W9{WXeNdcm%RU|))jqhxWLjbwXoEKP1|0_r{4B@US+1i6G>fI~n_8(4^Y!wmZ1InWd#gian~kOXYt&y8KGRsrBf=?J_%B9MzB>%5!X_I@`46a|M!wic z%4dVAH6da98>IZgH1M(}Y?_gj%fP}~`N9S%|2-5HtoB&&_%{Q_x1FGyF`QLhw(rul_rPJccCGDo?;`wDr#Gwy+Bv(r zwRYD{8qTUyI$8D_;^gk#+PB_MhWMgb+unmmxO#e-dux1r{YFRFu$ud4_if#_W2dRA zde=f1S9kAGau-%}Xt3lU0r((9N|uPJ3DvpXYa=EI(2*5U8kmf z^I!cLh@byepP{)7ipw#G)w1HEQfG$IKw0^nrL)!^E0nM&GyquldPmDXZziOu9cXx2 zQdoG#$xN*2*n8A`K5i~6dXRhX#CsOzV(n{o%5yd-p{%eV`$pE^3kQkC+Kz*iw}-K3 z(6a^E*DhX4-#($0xUR#3RZN*{-p``p=FQz3>bT zAVSK%kHk*w8ET^7kwZI2NmwO?vM!^JU!<%GfqPk({ycoxnN_3Uyv&Pfhwv_xmpsh9 zdHxjc_~TtaHxfhG@}m3MS6rC}J(Hj1#O6N=hv&y{MR}nI4B=8wrYpx^#T*k+ z(^o~$p3;&sJ$vr%+_v{m1AA0+_+4J*}i=Iyq@k+3!ky(cp#KoCK)kiCaQ7<~Lb7!aQm?@A(FfEsj%|McELok!9b-Doms7 z(EdiAEsl$eifYQVMX_;FO_?@7E~W|7_9w&}Gi_I#G1IpGA7dIH^$72j5!1G9+VzKl zY1^mEBPPdhNCnd{?7=&AK6Z+!OcOpOVUrQlW{1f_!elb}j15LiJF{x4JS3Rt(>F9_ znle1pG*}ZR3y;~|glR_;WT9rkbz!o|rc9eF3o{Sag*WBdq50wA=E2Q)won#s7TkDCdbe~l?Gc$2r>kn?aFu>cG3|1jwt;AZ7o24c42J6t9h}fcT=yfZ zuw&ZehquBe)%HT!woG&S$Wf(5YjNF79=eov_~0l+THa!?HfwL5KXG*R>xiArgE`m! zK63Oel-a+)meu6nx|n)&T^GdeVlZ86)VUdFj~zpFos7Z5QC(bc>(U=5zO%3p*V`4^ zu;f{I$mP1hO5hAM*Nd{DiT@H`eAUBloj5+{`bkXuxab2@IuOq^0U%U z?(Yl2$E*ycR+K)-zWm3j(bN|eWfeo4f|;RzzrTw9RepWcooQm?6Sks%O<;U#m+=lZ zjnc-&f0yOL%%W;z;}>L7ADc(j#>CIdqF#oj5fh)7L;b9S*`bY2SX_)wh9OfI6Ti}l z)kni<(!|cfQ=@0s$G~3GDB>?umurtKj)PHG7r&s$foTsNR8q?5gl*LCn&XFmjfQ2W ziHk>#wyYLCzl2h26ISpr^*vdlni$1x>h2oq{hwkeMLfC(1m6G31XK{401i}h4kYsw z$`s;3wZH=G==?>sk{XcZGMno)ZgrMir4r&k`?C zJo-Rin4TLmVX$eHi-;dpdVVOCC`~cHDMtvY3>;ZV9FfmF1dfEtrfedPV5}RlSl~#o zHay}R;z)39XhZ^p9UQ@}JWk+9aBWD$Y=I*fB5Ok;<`G9Q=&pky0**xDRueX5C+EmI zIcy7n-9G|H62oDD)X8TF9EqZoArYGm9N}rhrl3ZFBa11uHgZ`5N2XJT(1=EkY~U&6 zs~b5&7ExW;)JBf*6tV+G9HDBp@+C$bSrLXOsSBH7#F0pt8k!IpBnhvAo+ER4#vM&K z5(c|LEB}rcrsqgFvT9{>jX5$yj?!fD0!NzTP=~P?W)()RQh%8UM}^{o1tUMkyscrQx?pN^0G|r)=JW4!xMR;OCE~c3`!8d|rFaZx@`V zdCT8yCl-I%o>eDWOuLpnw{-#>uL`So7N>stWjj`P%;E<#R<}lcWDu*L2tvKPub9>Q zj^e?#tnQNdH!-W*F235T=_628MQ1kcLRFVm#K*6?h^h)tu8E6|-ioS@#_Y~}kP@>W zRqdPm)6tv1Y(-VqV@{%~KccUr?9Cw5|F{xWtz5-}s46G=A5?WdI@hQw&LLD)n6`2= zsyeqgGV*fdvO~_Js?#AksOq^+e4XhgV#ppQp&r5L)%a&vvtB^j%@)zR?MS8Z7Am5{;z&+15aP{{Fq-Giutww4$nWQ-CUi17WTeyEiT~Ka>KPK zUkLw?uKM&9hHJ?Kp}f+E4U@f?2-Z*imKO>0!NRm~MX6z`7*nOf^k~CGvSAYSf5p{> zCaA%92|NI%tiI@isUz7a)tKx%|6_>%a8pNar}+g=B9UgbZpC`pJIaGUe>iMM^`VLGlkMq3V0IEo%`$5(G)$Q=zdPd#WR1L zI(C$be^y?qF1T~^>cw+s{^Vh@67T2Txs`PT05pQ!G$qA_5AWyaK_1~*FRv{tEh#F* z#JLOH3*}|#xc^AU@LBf%e*C@M$lrf{TRJ~p-^1YV_E}1}Q}i4tV!zFbSHwg|=~+~) zRv$~46&Di|ZD3+ScIM7`v9VDKfgrH?c=C#+iG~y{Y$o5<|2MC(5t}dVTBMxT$mUMDGv_~32tQbQJRzr4KXkgY~CIp5gr=egv}d&{O%h=ivJ(5nMOz2+t;>W z!GWgjL3Lp{JPBD>li^0ybiJf5CdWe7<&6{^kcIhs1T+6hMq;gPPGK1=)orT4-Y{0jjW;vV<%?1^zYSg&@g)^ zOjCGzd7JrY@~)rx^KB&fgq3$=56(x7u^izmGDjU zx>Hf{2Fov4?A*0yzajP#%!2rg51h7O>B@B*Hm+ZD|JH>+wqYW_ZZE6o!tVY3o^^NY zLAFTc^TphqXRl}HKP)URDJ>~}cn7`?Z={>ZDmt@A>!p@f{f3Tk@qBOb!5jA~+Opch z-0Oe;5eFAb--1qXa4#CrwdVjEiQD+^&lhxLHAVTE=TB|zjHk9Z!YW>4&*t>Pw2Gb7 zW5!?iUu88V53>JBJwcDOfR(?>D&wsXYwt38UH0p&x(r31KD87qtP3bFe}z>p>t>1A zk#FrS>IBzK(Y?&`Cl3;%tnaak4y-x5W`O>yRgsxOM3&C1)c%Ce6;ck46E+4GkQ#FiHoWL-RUDipCFv9flo zY76F-20OaXDeg+{hKD)VP9NW53GbLImYK9+Re3I*yZ5(q{pe12XYd#Kd&U=QRid2r{-pT{?K!DK?azgb0VOi{UX>E7Sob!s_9mlxuhjvx0I zi|dZC^46^SI8A6tJWuxIdEs_Cxu7)`@chOjXLjn=$980BX)o%kyc_3E?1qA_+s(=> zSoQtkU92#B^=ohPals9idcqHJdwATr*HNf+OcvrQ%G7tSolc8F+<^+px4u)?KEp?T zSz!%Ne{p{1xj&bfLG)A05LXk8X)rst1${6aD8aIlvkMSql~GJl6T9>nIKpEaMU_6x zzLfqUqP*3G6!lgYt3ghlhxAc54|PLSR9RtpE7b1!M$aJ}XX~Sy1=T9DK1y^WQ zz`@Jcu>7Z#xPGj2_W}0qZ|C zOZv|0&P6Re;#uNRnACghiEgas2 zj{WvQXP{_lQNiuYf1O-{=&h{0J$qI%$7-OxtGC~ns4MjLmKEN+dH&C3i2k0HcVJH+ zOz$YS?=A`w5EmA%3q z=PwyFc*ICAKR@3O;t%A#inUYfoNE`zg}VT=MXz98##Zk^_RgNZqkO$51g|`Pw>_8S zoQ%Ve5A9l{d5x8voeE%cM*tGd-Q8TI zPLB9wnlbXLU2;Ui*VBtj0nwGk|7-}AIJtOu`u}9%5OABv#5k0o2yh*2$eb)Wk$!PKCe?BL8qQgRALpSa_$S2>f>wcu*i{G zwEsD+T3&SZ_hqvZ;t?Gi|NV1{wfeYfL42GdKF$VV%&_)QvGV+L z3bsy3b46A0%I(ib}o-gAhc3^y{DPtt>TJzi&BYIr`nnE zv-6rN-zq`*?&4T6>zC&0w^FZu*T$mlTE+b43b@jsfa8>?Jz9b3qh>0&(x8GD6B@!oU0&RID5a+6J{8j+Hc;u$Y&sz89$FE4#m)5hTp@)jO6Fk@}A9$qr&Bo6-`KZ#MGqc)$+0_azd-{$yiDP6S~nJuI6fa^GtftWz%1x zlqVAsMkK#XDX$^m)yfnvRm#)ls5?Y{@k!lFzuknkO@(O}A+3zn`%B%Srj7=|B z$}6$lo1owY_OV_mf5QQB#lI-!nFPatvwv601i>2Fum3TnydJCOHR1dILrQrr(6lxr z^!R^3DNjX*)`rS1yj&^s*>zJ9rouc~b!cSl!k-VEe>ehbO0OT@y1>rP-qGE6>}PSw z*Wsn9&&-BXt>F0V&%B&R3^8}D8tLNf5}+q>Uj8wZJttEsn%kBP6&&(ycV$J@i} z-Nc*l9{1@Ef9abKyRe%lCfRrI-G8W^#Kqmq$0zB#xl=wG>qeemUq4?TZ?C|OMYjj^ z=|5aLDz_8MxIM=ae%+z=QdduJ-_ak*3Lju$@!7rezwm%J*vr?~&-=}|{Z7Me9Nos{ zzRoHRj_ujqdN3RfUOwZdt~hZevlS~TxOx2hj~t!dyx=?be$QPhb@iG6-v}%F-ma@v z|6%062;K14?ZWn~yf9<+TlNw+D%Zyg#lM{gr^>?_*4=syw1rC~Y)fYGYmAj%oo#C` zB@f9cKflrM~?i8 zR(Z{%AC~R=qEaZnb(WUoEqZHjnKi50O-^5LzjyN5vdS|9x>yac9qE@+(FZ=L4|@)D zaPxUP4<6jox8VLAF7?{dpH=@%PB5>xazWk>_v;`>j|C+lpTnmHBRt0C!Dsu>gZq0w z%^d(C>C+AVye~@Ntlb1hFWi}j@bTZ|H+m0t+6l|`%`Whn!n+IFouyw**;b5n7cJlD z30LCLA*`-6I|n|&Rh_z8+l&kN{&r*3`i+@|C1n@-*PIkVtzLpcbj?a zWEWO_f`7*_5eu%XufEZ(kDY5k7H$h2yIKz)>2nxKr@jH7wf8(E-A(>mkMY@vzc-k^ ze(>E0YNRE33O~*V^{-w%2ReHAEq6wjhIQ*>!k6}#v`}gY$ELhd0K0ODG@bLTU z_Fz_XM`7R3_KQ29&PQ*9DX|X+vg$K$cgNI&%}*Ar^8VXaV2Q8ayuyBPByDu2xdum< z^{rXudB@&EoIHH}=H&Ka&#pxd>E3%Fd~xsIXu~QG4D2%;BI7shdN1}=o#fSxraN3b z#vOqqZ0X;hoQ{599qIum;l>XJTJ;%Zx^CAHqB>P?|y@Zk8pAK{&eH**VvPT{sU|wb$-4R zrfk01j+K_)KDu(6&xqcA2M)7yM5=(q3niV{qkn??4=2Z=uaAG=(v&-};R6h_cNpO$aUKcOz=Y7}%l^#k2|4;b#F3h8 z>RSiYF?EC2&;y|2W9qB*MJj5OLU=3j3I z%r5NdF55S(`VDh*_4;7dwb$9x%vHX&POdb*mt}QgPqz(4EUW{cuP+pKW=~7cO&g5W zQ7Bw?6|1H84MD7p)boR#d0pAF+@-cC2j+En&MWNMdHXIs$mk6_Q{Ekx@*XLyXiq=C znGdlP>cN|xyZ0F;@r=&s#i|atl1=UBx4Z+ZiiN2;#L;8M9azRkZ3fu7c>4OMz!!YD z2aHVzx5(RlVfFUoc28hFEZ_%TSoCA-^5Ioj!1H@z@s+pV3YfKPXibyE=kNfec%PO= z`Hs5@v+kiIEKGaX`LsRIpVrpHq+Wh2u&C%~z5?pq%)zWWxJN&`kv<=*#V}vI`O2r& zLs)fspI(EVJpJ~8db$&gW2dpVhq9Uv$aMCdC1y2?I>YF7iN*(eYpGtZj~<${nsJ?b zU^$8k#LGQ#=RWG18LNIcs0(Gk3u>ujS1gb6ISPNw={Lw+{Tv^#jemny*{la`%^PI6 z$AC5kStMTHfi~Nc4BTa)EynUGM~{V|MOk)7;hR8PjtWP3%mr;mSGwB@+A>a?2ii=~ z96dIJHkZ>DgBHta8$kO4%Y+;~mV>qkGzX7F(0pN8OFXxMw$qZ#_R08su3!*fo%9zT zC8IYQHxoVP;d7Ei`@K9560RvckXP6zQ0u{L#1B7 zgK>X%w}Sg)^s#}g>g*7d>)`f95gZtwcI#_1(&tNce{g&}8e!w&bp%3js(VkQ_FD$q zy)>e8H|wEJ9<#7Ss;XitPd`=#OS58@Ww+i#Mz{xNL+G*{k-^>f-Tl2;Wl>B|?&%qO z0#drG7dd16-apurRo)8g2G5m)tIy6?SXDxg0d{x+KKQi-+Jl+pn_6*_$RhSaC;y*C+dm@dDqB=rh!j78i~AYE66gDCfY! z@ix8s4jS$Nqk7u8uIzTs+~Gse4gkWK!&mOAOG}ILt{qBVA|K~GuxuQDgN6*Z9U*n~@b-;ARos*1UHxXH4M7B74CG+1 zx9g=YKqa5i({|@r!_Sc#J>jQUCsPj49g6BeZ0>d!QJX^SV=w*YVp z0Ji|Jqelw>w*YVp0Jn^QTSmYbb+(LvTSmbDeMZ1=Ltv|boiE?E4Rf9U$yh7y)F{Jx zaYN27*oNv_%Eqs!g?;fExj5pM>`2YV*G>9@JF%ia=1ugJ+7B8qXy`C}2xez5@f!W! z^tG2e7^QjYEUYCMK@JeHYc(7o9usE%`k<{*nrD6SIT#iaxO;hfTliFYdwIIMjtTua z7oVpz)Kvp}gT4n793wg(bKe?F`;D2jgRH!URQE<=9&yaaQx^WPdc(#ItCr1=eBam2 z1G9qgj(7#kf}z-$HqXa@@`@AKne<^1eG#V4zkM}zWw;M_k|6bmdtiX7UyPChj^K+6d?qX{!rsKY@c9*zyvFM8$EZ7FH@54`{qb2E))b6NxXaic zD=XNgvR7H%jlgb}thD%_SX<0)di(lJ&1S##?K9B9UG@soULDt^dpA~oZ^xT_9f9xE zyc5F)4|DX8b!3`w_d%X+9|Pxd%BqVF&mg0$Ge$4`!^csMQwk8tnBp4<)Y%WcF_expZ6 zw8Kt=@Rtm*cYU`vdwScq&rk_gC1A}$1U}>`@a7h=&jD-p>;$H!rJl6bfnt_%r-{e+ zSbR|VO^^QYgN#B14CMQ^U3v_#cl+XgUrd2}kxlG3nj)$Y*L~o`>kw7rR)(`Qe!Y?~4L6`7Yk0iMoPT7r4A%1nOV3qQJus z)S3{^uz7>9V~-vGj7Sc9zubr19-b#KSO1YE6#(MX{Qle}v3BS7t-s)1n#sSAk|83a zJ6h-B{m#4N$9f}T5!?;n10pWL-2w-}=+S=OZix7a95p=R!W*>E!DsZC(W8720il80 zgK}K3q*V<(!VeKUsBt{vT6fAZN**DXg(6~=AxCviZ>nST8PiPNO+>&KBGdr~h-L5L zE1G8K@`Gr)N*v7W>fPX=H1R9&!2$|j z|93u~H0jHa0(>R51K^Xf<35@2z4yiJ$u6wpp==ObPj_=S><+^U01|)-4_AD$H3D85 zT72OMaE6oS^K~~Y*t4CTyO9GEdHlq_^*+%S>^@(u1wRqFZQR}6+}z#yQVie8o30i^ zB6mRIhD$xnyiL4Jz3coYU$kJ5?f;~H`ge`iqP<$QSBv&)(Oxaut3`XYXfM8-H>QAE zY_AsEtHt&j)na?K*j_ERSA*>(d@UlKJr^vlnJKA#jmRq_3f z55Sb{alt&=A_`$<(gO0dAl1;qy}N_GOQb&km6E>qFlO!MEo;(!#K~ zX?{wX6{}G1_{zz;cYomvAzJ3t#;1}Tdv31&Q+E_}V~_X0KfJs30Qmhz!tDolo{5i{ zw+`+-6TfO&?(}BJ-tsQ&#-(ZYwBi9KD}68Y-dD4hB(42vKM8@cy|?Vi;4b8n>YU-XqH`4F)L%Gc||UtedB z2Y2g*1yJ~SNVe|JTMzM#(1XkqKYohO7Wft?;}+(>%AVmnAM(0IZp|uwgFPjs-JWUP-#rG`S7p&}&V%h~$SA_X4}J!KiRCW-tc|D0mGfWW^js|i=A`L za9c-LpTJ^sd>f=5=^(9jar5$ z3LQf@-yORs`o-nD!I$mp7k2~Ou%C$k za=|Tp-d2XMY(mapc~RbCiB-=bUpz2}sZc`e$3ESH#dwt^nz@4(>>&hFmJ z@POE~Dy-jdoYrFMs|{Ruy&W}GT%#m<+iS<#W;LBdyPKAygB1x{U>y!Y(Q ze5~&)%D;Jb@5ZIdz_A{70|sEw^ygU8E96 z@(Bq}A^u4Ymgo5R`pZ`Sg}sH4NsMQ>ymf}V6TQ`ZQKGk(2Yf>GeU6Doy{DHcJ{7DT z7qc$)Mqx)1pE;&2K-2<6EkM))L@hwnG9qdj5w(nn{@ag;u(-nnn=KS#FW0}YAFtM{ zyp)as!cOeilQ13xDfZ$dLdk<$muR<0tpoN4g%yCkr0!ffy9Rp&Yh4OU=wKThHFNFU zrgk8B6&DMH+>G>}X#3!?B}AyDo#8GmM;RZL@o+i9SFqWyHk=vaGp-WTAe8ZCaUsl;T5M%^D-}m6 zYnPQ4!g|4(!s@%(N!SyzxCj2=@J~ZFl&-x{Qj&-dkDA zTcMB%x%ovn6&U9V-^z+a3X5MJAP)%GbnmhU2##6zkc9}jna8oGvgXGE z_FApAyPgXs;N;-@w{I**{K5hpER4;X3$kv+AiDqgT%0?M@V%SYKSOvXjZj%IguoVw{68JyU~^Fr#$ zt>apWtJ_%Fy}RhQ%cXfoH z+le);y4rqU)DN5K(@A{)oIZNw*v26p#Pywy6Ah=((X0Z90gxJO3s-Ms-MW)kK<9M#Wtx(QdFSy8 zuwln9Ud*_alb3)0VPR2884d#17T&wN1C5w>``P4bti&}}Fbx6s| z&c|0;W#tt^NOrQqa7KCeb2$Y?rI1IQQhohnNMDbO_t8EGS8m3Y_aR&zPZyPt@IY7) z)VA7EfiKTUHr~h9u)&Nr0?)Z}5igL|2HZx%oGTaP2z5Bm4=RJ4%)`-O*pHjaxOxs} za@R#LNT&%Fl5p6eT~0NM1P(ma0`M%QW36JpE)tN2L(eMgkEe;9&%uW_kOuht9Lu*2 zoQ?Lu@4(?l*!NU1ivtktew~rNMMyP|Ll8g;5cCt3rCi8C2-pV@O5!``ea~Tt(qvry zmRc2`%z+3L08s+A3B)F`$2k5g7eUJKHJZ1vCPV0*&afWKI0H z9FI`ly<308&=!0NKXXK)jdt&5Z$blVqhnJ!Ch@&_Z_h`z+Bl_vN;QN^XXDWD+V~#@ zTml3Gmo_WW31}8J$pbP`&g|QZX(PTkwFFTK*tWDr5w8a+Y+jyuA{HA_BGu0VPSpaZR5ARd zaE%_RG(f72acF4#IsvORz^Y}~UbH4waX~;Upv3k0M2Y`Fk5?Mt)g0^-S`!_2LO?9w z%%!i1qDatVmIjzbl-l@Z0%~a>nUtwkxmmz15H8SuqMEo}9JvrazlL@`Rj4?2Jpp$8 z8XX-Kg`HRlyq*BOPAIVFXWVR#UbTc?-zJzw)hlss+!KPY-7&POXTr*y5$qAiulci( zKTbJ!*DZU7&0T?D`<1ikboKbS*_#gB0EkrzAhu(+0>@ZZ#>Gb|;}`8bejPyeOb=xH z7SVRA&teoxZ0$K~!G_E z_=GfyXaKftF>%<_GddP_WEQo@v(DO>^W?Nb#zLlx@2hr*jy14m$2br zQ@q2$(>NGifj6c+I&R*<=8y-O%zyBG!b~$nE9Rv(hrL?B-i0`1Hc>n}*&O(wIq&Yp zEA>dRsu}b_WoEB~2%E%I9x(zxh-20wkgH>2&+Fk2XP94~N5UQxcS!(14FGTsDCpR; z90E!D=HR8&Dt;pj6eNwd^;||Mr~wL6tR`+2$3cYomYtgD*o*w2I>_A$?54@LT()Di zz`~!R>1aYamd^+d=g@v(vYEzkxC9$>X~Lq6;cx|ZCewt*8pC077~igKrV$)&<0M&> zF&y$8Fl9<3I9yL<$!8nE;c}`_o@fMz3-~T(8;syEN=BP=%8cQV4hzM3f5vdQiS`r= zpKc6?U-P2AF@i%nLt7)?XatAJlr2PN42QFktu}nBF&svs;kEMbjfZK!@QmR{jL`5K z+5s(msxcb!ozCRn8KWWXM^_UPZj6Q-s4SV%2n`otQ#vG48KL1!bVE(}bYnE64Iq(f zV5G~6B&9&Q?3872>ooHl3c zF=I6R{Tmsc{#mFD+bK?-K6}OPE5>NJicVRq!~wT*`BxD$wl_t?Un0U<)0TJP@+qlJ z&~R%+xCM4g3=IvBoO;0+4Y$mZ(~I&nEJ7X@7CvR(QDZb*FhwQ@Lmy*f#~HJ}TfOnO ztHx;fbtG-E$U@|D#gDt6N5jPtU~@%ic=Y-gqM;nI<)LA-pF=~~5BU!gvC(LGNcgN5 zgCXUu2%mi7gfA9QU$eP+Klvc>>pO2k^U+O5uip0QD)Nm#0(1@dughyO2MjirBoV#jmPMi zOPoxIBQM45nK~jsmBUz?Qkv3=Jx)`pf>bO;nv}zm19C7epiIWpQnIoYj+%|YH}!QX z()89$qf{jYq?n;HEX1!*2|$v76dsA=FYA+(t(jIC5RlOYM^y%-;f%zz0A#IKCbi~O zz6p=BRMjS3cpjw+$3~<}vB9!hn%;`F$2pxSQmN|3YSA#J3PLC# zt&^UV9Kl#bGDwL@22zeR2met=x-UvFssO1{86gcwR-2gJ@AYQ<_T6P-C^~1<8}pOrdxrM^oz1hUb!3 zHnau>>ae$>z?K?35k2E`>1*`q(WBH28EFCsz*^+j;-yRyo*@T~N@-}6As56k*-R>A z(Tj-ElsAt032ij$Cqo|8q{iDU)$GkDi4x|R5nELO^dw?w zoiZs6r#hjD0ZBNUw?R_r)p(i`5RlB$RVrn&D%qJos7~dI^LnY5aYZY1DY&B3bV^(^ z%ut*v$%R13T#B>!)G0}($~mIB4EPwxK``*;_!wv=G2o+u} zF;yWUd`wlT0)dYb!bg9?M+L`61@KWJ;G=}_QK3rmZ^TD`fS*6dM>-z3K1l(5RQUUI zeDqHRKBoE;J}NjqN&wh(iomA$C?S00&!gb@C?Tnr5I*7rVic($d_=>TDi9(6RDdBT zHN{6x%8}&YKjEW<@KNzRKBn>l2_FLk1$+z?@G;Q;d3=;eI6nGI6p9FmzaAfPJTl>9 zY6Ct>w1EOXN*eJ|BH$w)fbdZwA$*jO5D-2}I6i_O3V}+(?~gQukLWpp$njCqfRD%w zd<>LGn&6{ARe`e{A5lmky1bT(2GB@=kN%)=d{hJm;#K1r&<=?nAJG)Zvmw1sVU8L> zpynv_=>c~Vj*qA%H3jz&dP9cCfvQxriSUsg0B;v6pbQ)zB^)0ml8D9(gpWKkqecUe z8q=d_dY{lXy!VC*o){|QlqTuXj{-hQs#E_pJ;z50@KIqZ0X|BAkIxsMgk}oGb9|Hl zAD>T7_$agpN~`?Cf#ddBC9C)A?!=+R^($w(DA!0}Nc;3I#A95gDWp;3lh93Le@ z7QKj|BmfZaCtQsB$&d#%sqr>T^t|Kv2+j!jh#TOe@BsW5Pr>mK>A^uTlJF6tt56Vn z=-r{MUA;skv3H<#$~QPF~rE%?|le&nyGwgn#> zu;oQ~+JcY&-SClC=3-4`PI`JyZ+?NLTL(Lvj9!e4wLxi#7#-?z%$2$nEVoOc(Xx_0 zYR^$BlUZ7jsq}FG2KU^yrtvqTbZRpd2FWldLC%00Pm-pXvq!MYlqyQ6PGLEe4wh>= zhObJD73z`#Xe62<#pqG1lJWqIW7vNI89WKB+H@(67*zons^gdL0}=(xw+-3F_z6;B zp{5Fh^lBJ&0m>v*dIu^VF##Cg!3^io_)IuWl?bCC0NeEm(b9B8tCT#NMqWu$jNJ86 zX^2V|qFzIyAVY*Q84(dejTlH$gX+_zhQ_7@zyv4LoR^6xDGgtfpj7$unndU@60XY# zpi#9-i4SMVpvL)|IZ4tCnBHo0!8S*4s3Ri4jJlM7By(1qlb#fjj=|{@H48{lN`uH) z4?@rBRPCfXT&vVccyL%8D$o*PlfzinsldyO6pT?ZoUF}BQK{0@bIijGx6Wv`QcTr5 z!3cwS6OcB78y=bMw_#|4RmvrcLO462>TAz+vT@WR#5iDI;kvedKya!YhnSNyIVhjq?st&?v zDt#)XRHmUB7@$JjqybHnqP-X*3fW+Z)uzEwB!xGHKL}+pDi$_53U5ej3Q?9OzBs9n z2*0&L3&55f>K=M>w7K!IPjuHaT5C0AJ{i1d zNTb6u=~6lxq^lY<%Nl)x2<_3Zx}Gln8kETv8zse(};$3k-NjPmVSN5A~15 z@lf9ceOkgpZrbV${RAVJ<6-l3C=4R2?_)C0IUY7og`VViD3qB2%a`L}^JIEFL{ABL z2>x=cYnqPZAy~ulkYuAF4I10<0I+`rJe0trm7bd9kCqB}DB*b6n35tm9+EHu4;5f4 zTpkT2Y0w^jj)#Ka5*|Y4frpK0fQKkWkB6yh;32w#;~_2_54mMc{X}>OP;0@%7Ccn7 z;30PzwBTV29ya13+04CJ{lqU}xUT9_ijiA!2k3j9s+T~lpYDedj#ng^ugN|2v@a)u z_UUJsK!G7^r6+!hExYQ&Kg3UjstHX-H08h1Ouj&huc*+*WYfkW`1X`0w6#4E9F$~C ztGgjSgGOHwpKqjM=r<}D#^}_M_<~PgB0dH^+V&3^pMSMK0xh2&k(Azp8s45^$Mki1 z_kMcgo7RjBt}d*8VJi!9eXGRQtag{rtFLV zO~UEtkD-)=6f`z(m_NqK)kdm*a!}RZm`L_7vgBaxYhy}Gk-!K{!gH$AF;z{!7*A3> zNIB`S75Fp?2(Xdsb6_4;2f;o}2?&C^)~3O3q81p)ln=?$X&M=`FJwN@v`GeLTabt~AW|M^{uB#jp^4(lh>IY5EQ5Y%iV|ZCOh}@fMlxl>Od=wa(rFfu z=ft=RmQ*RG=TH%^25FE7%NgK*(UXOou#+$h;!j6)VvIo3y_gH&IYBppu~UQW0{JnK zg`DUuG}lliMun&VQ#3i~AXD}L>C(||5E{usMye}W$S8D7eL70P_>=quh^R#IY3R>1 zvXUR`$wF2#!c+}eVbRv-AdLy0yFL-qxRuDILT>b|K&?ttzaS$$S_CE0z#pQ5xln`E z3`vPn?iUbfcz%?_7YZ0EgwUY+8nA$T1#PhGLJDUJrog!G07EFA0miA};q;=1KGK3| zO5{kC1|X|G+=@RaI<~PNji;nB86vI0gJdXGG^++5msCpQLXaQp$-F{7+nhtDxbfU{ zC5bX$V1UfjZe4&mD{3SPSxKZKk^}e@bt_gyD;omv2O9+$;KF*`K;gXz`OXMv!{@1C z)8$aFli!HE8@O;nbpT|R3a51=NkP(x&h#Q>@YgA0j_GR*Ft~XuU@&b~IbN$W#VI`u z60v^wD&WhCU1YTq4077m&7l3VnP5;tFvy9&YzJ`%t#9El*ht$>GzG!n%V;KBkYXDZ z+L&zjIs`ZDZbJKW9)gLdjA?cG(fGW)E;l;6kqQ`G^(!8J*K)w1zC^%aMrdX^;coxU$YMb24S;wVY(x2qIE|Bf)`iB$FI0(41&VcFo7UU9X?McfFKXi zOdEk9X1NFi^)v$r!ptNPY@q6A067RY5IG3KWF!!5AOZwo`8@}Mh}VOl@vI1;ouoRD zK+r#sKrj`?k^q7NnaUMFkY_{l_}p;@rrgT?GsuPuBoKr_0XYY;21LrkL6Dn&rVUx2%`5ACEOVx&MeIArK@70U#|<0uKs-AcYA8DFf!D4G-5i z`K$%g6a<12u!(~p!UTepgNoDlqw%~mO;~dfR0tqQSp^W3a1aDp$PUvVv+j^D;|b_W z6iOf{kq96NZw^4Pktk#(k%~z6=kw46f(ZKKk3bM}#RP%|ie5JBGyL1|$!G#W>UDA! zaqE~s5QJ)f0zo_w2f;wei$HMgdVt`uDFlM0@*{c>Bx3#6Z-Fk0el~z0r>$QL+Um6p zAjpZUH-VVE5 z5R%nM1qgoo6CQpuhIfXP0Kv=Qn0ctXA;TUYhOyw<^#H-$Q%LQCa~35!s=erTe+W?Q@6Wm5a(syo6q~b`H%Xc@2#p+b?eqS^{uK~r_RC8k&gJ;{WN}5!!gsD^YqhU z&u~`VE6d;D_zX8O59_@aU9aUvGT!s|0eZwCge6dw zi<>AG_tD~rD}}|JIRe27oNKfPD?G*G2q1f0Rl#r(#f;g2POKl>=!eW&`Zep$Q zAbA7ng^#DoQ6bIbo?u;DrK_x~;_V!Bl7p8iB5`9PRdsT6ZEUevswo`Wp* zNANM7#5RQ%>ISs!fJjs9+ zrwXYL3x_{;lmkL++ku`=KMmVrQa48^=5EacLL7*Q%PgxcJfu1Ygh*H31kIKh{G6MI zpKHPRxunL=!JmK-N7U-WK!}?8Cx8XF-GcZ62yM-R6NC_kpO@CyV{ZW=vQ{iTRam1- z|7mFn5aN(peFz9~DQ1yUy)vF zA+VHd!rXiuTP?7@CXkz0D?CWvu!W}oR5>aH2w^8D*0oi-(uokwEKB)4YLGL9jHgAYImEOVL>qPZ$S zi1cWY9I}NKtpy7&l*bT)u?^d_kQ}U|?T-dR;B^=8jgD@QED&gDyCF+Qta${4@Myww zki}jrKB<%3wmsj85D?l)9+L!wfY6zhf><(yKrgZ^j!r6J2!RT^AOu3qJB-2`KP+rV zhz-%`>GadEVg0#PO6jaMH-Hek6gx9YY6@ayr+^R_r8%Hky&gZOX5%N_7e6Th_}RS> z2(dRHU@s7&S{@H9xaH=<--OUs2OnVwu{Mklg2e(MwDZG`71UH-To6_Sgoq6YfT~7g z$~uLAz`VoN3?UNQds`#-r2-)mI(pkQ$v}t%Z*NV)zQ{lvfs7~yLLeN822GCe_72Pg zLQoh8u>(OJ5W*hRX}rC6w1E(mjOb*Mx256#vf=f|--;G=oM=Y#^|YSnM;swIZdWFVpG5CJ*fiHDab)F;VPUf$y%E z8;{3_9lBtw#T1WEfqH0)@i{HI~i$s!o3u3jYP7BTO;nXhLgaGN{U1*slbD<($GRF z1@ky;K3Qa#&IuWsQaGB~u7Q;tE$CS-*MK4)^E#;bpe`1C=%gJNJcv^73K=AcSV^R4 zF~1b0*eXy(9yT~FaboeBu3Qu9N;6_?)X`KInJ@>%tP(R^5F~P-MvX8-#w^oOo>!(#4?Z z`oLcn>Yj}1tis0CDo)l0E$X4DKrKKEx>%ye1blMk(AKnY^MxW4Q3a6V@hVK8E7=OB zEmAZlB&GredZB#Gnj;?V*P=|U5v|&oiC|p?)~|}En2xRmEsc|dEh+P{n)K`=P64Tc z762e6ZqUb4T2D5YiunfS=6pT~Q92Kc!c1ZzR_yR#Ga>YGX@MI9UZVjd&p4!=WcVe{ zl7b{?M^ZcDf)~M}y`h4uNQ6B0sldnw0zM8$6;mLa6H|t9X02pRj5hqS?OeFf6R~%} zdLo<4TJ@QF^hC_Hu+xB^=s`VEA1Pm~r=Ey82K7W-@IIJI@tNp}nbE8#VhaORL`Ld~ zd*yr46HB(s<*X+{l?(4hpQEWKV(y8a2uh(RBBL{szD-k4#QY2y@PvDr+>z+$Bis>r z*by$egWQ}MEsxgYL736!Q%^))s3&6DBxGpHWd&5i;1nC^8 zQ6tPmF`KhsZIMYmk!Hi_iBR5h&4Qk|SH9hz19Q5)=!s$SFzShH<_{Gy))VmzlTb0L zyI#mpPcOl7`N&2+5wA|;33TIdjc?9@o`@QuC!&o?I6NdBJrS=^fE<%Z1CU$wATceS zlF)Qv)DuC2>a4=<33_51w5Z2+J!(Nc5${R#nCMQb^k_|so`@pTQ3dLWctcE6(G!uU zEmAZlBu0;(2(?$%9Pwzs7G+{BX3bB+;K=LUUj2vIt(XFXBSI9=6(5IvC=l1bn-8Xy`y5tW3rgTo%^iJ3@3 z7o>K?1uv3`o~Y;a>5#`TJ$hoM7}Y>e%!F)4W}+wNM;}Sbe`rtCX>||uL|ufpM)yEZ z#FT~Cq9ba zjr5Mxp)D|T&U>IIB14mwqnX-1H*Z@W=xJib?}IcKW1jM0PekfnAwy&;X2#k)%$G!3 zn+~<%b?8>f-roBj=!wXLITdC}n6ZH%l>;?ugc%=ZO%}}IwGZ?}XBPCt9o`%5IWTwH zfu0!X9r!>`LPQpltp({un$WiDiOsa=iI{8h#UMoKyslMGY$ilcqy<|7c#Q^#Y~2&JNJ1B+ zcEklQqD4>Cak^BO6P<3sOyCuE&|>`a z&JgAi5%v(QThMe4r`;JTg7{F%7dV4#Hu-`hk!V&qLm*7X9wL;Pe#g;C56r;uahflH z9s+%&!@&S3Ea8*ts!BJm+IfsdFup+3nDLd*vN@=XrtdfcL%|yXqvKEfo#@` zkK8mNbmQvrv61wWKmsERbP-O`Fj5pK>&|8sX=r$-9+CxfPpFpE35RHilFG!fe;h%9 z5({bDpfIXFzEOct#MR*h4bh>%Ezc7f35Q+FsGfaRX0Jfi!Lg5_^i8vp(a}7BUL3p8 zH2H5Qv>N6gu=N4+2?gw#&;ol15%jd;pTkM5$!LzYim9VYar8)PI2-BJuvGzV@3U{k ztXeo4$LR141>Z@DE*Wzj;VtcIJe2+*84iR|t*z`^cN3;dt;x)o2vnv$&G9m9v)grj zSmQCt!9yqmeQY<4FF>-2`Uf_3NgWLbxB+BBfp#*Q9^xdQXeh|iuvN>{dvGqrK}GT+ zq61~Bh%5+8Y`Ew%%=GAd0!CDlXiOU*rS=fUW0GhJF^R?utvQGfdrYE*R5mMv4BJDv zkVFe15T15QG)1{eG-geLMB{JQGLN~#f)Xna>>5{=JVB+-X<%Osl3ly4n}Gd$~uJPW5{4{XdNI z^c?eH`!S6iVNLFjIFV)f4EB{@gA&LUMrm&5$CO`BK0D01qMVeTpzd^Brz1}psK9p0{Za<=G-4^w&z*zEk0^nE z4md6-&Al-RnLkHnxGgBkNgaTY1g}R<3~n6$9YTw1$$^IT){U*5#g^?gRq$_M&C6bl zLOL9*sishF7Q8f=JD;c_#~Rjb?Wf4~1N{3@)4%eEN(6h7Hx|`i!Iz0&YOF61c+PRUqm$3WG7e2weeZrCN25Wk% z41wOo1`5D$3j$qJIRq>jDL;2bo-G`;&h?aI0}zB*q&ew`!NCPmp7PHz4^QfISZY2M{iNnarOg)9!@(Ns}z z?c9l(E^5x&kq^`qI3sXA_PsdmAy`qx-`1M-AlWa&kh#%Attrv9>SF z=T}wS&Q3dZG$H!qj__9T!UEXazegtUZ)c^QKANyo@+@MX{w9OP>dOnV(~^%JJ23A9 z_^5bqEj%^eHP-0MZfB>TJAO1_i#L42SYG&gzws^Z4&uvi=U%;VGU3?4$ZsI4mN)+X ztL{zCh{7w1^R8bybNtxx11rCGhdUf=ufH64lQS4=t97NfZd|=^`q;4(hqr`Hcpcs} z-dxQY-{5KtD6Z&cX8MIw#}iK`?Tb=P8u~Ikq&z#{_$F6D8Ov_xWu{+DPCAi%?#%JM zn^fQZd1$XGhPRMtsHv(fEy&BfntDF@ zS{TkZsh10Q1CJKKo4IOw{I3jg$g4(9Y6uk<9Foc~2d{BEceesXwNqLI)PWCy{F^JO zO6p|{cT9vkVJOK4_sN? zSimZ?fFY2%DCd$=!Jfh}$Xs~iXiyMUb_+ux%dH!`f;!@v`xp*c^0GIeCE@(z7(*gU zZq^c%h8mn^SY*l8vMRz00ils4GhIzJ4i33O5M;TQsw6%H2VE0_rxhU-R4^E_TuTTJ zrl2Z^IRw%koXvtthD(-={Xr}kl1<2Dxw?;n?Sie>2#zdQ;#ex&7qDRZUOA-(SuYSi zSuP(43hpSk1fL{OvZNgg2|-ACn1wE#4pAbc{+WQul6Fp^LP)iOg)U#vsOjYwFrc!e zr$$gPM8lxUa^>PWc&so7g`^Q!nKM#$%F$F76^14R0apqtShbi10a)``X60>yEE6DW zgM!FW4GIIZ4hNw)i+U*w6Kc%~Me)I^8w6BMgj?HK#ntGCh+xR2A(9YP4q;Uz!>%16 zRElO5#WV=$6`>@K25Zg|fHl|wEQE5Z=9CeH)!QL#TZjg_rJA4m!L^Vb#5ROL2Cc#B z?TB;0*xKMw#3|++=?mAs4j|j0(4ZSyRmy{X$xo~u%eIQ(fW z81v(NjY_ErojYesTS#}}z|P3U3+9IX_zB#*7igQ7_ zT@qH*3>TzZ#%jH&8R>#4Lh?&9()puS?R+dr&RN!OKRnzwpc&{^B8y29)C_c?tk6&= z(9Mug(=2iVov#mtqa8r^i*H9%eXj%P)`A)y1QHxTHy@>;0;e26r=Ze(Bo3gPg|;yJ z`lZ`}ZaO{7*UtfT0lpNJ*@5n;lm!EXp!R^T5VQl`K2|SZsU7IzgrJ{R0J^;_=p%6e zoe#Z)k8g?{==|^!7T+X0(8>G|k{q%F-83me{+sPU7sx_O>_8XfPcN@=0Ns2F`UN_G zZVk#Y`}jG4ZikN#N|MGpfNmOmRam6+96%RFnSBGCK(}5(}H^oP{n0GHUnJ#kWgdzPD^$Lx*3#H8q^Z#0uX7FEpq|7 z^#SM=R^Nc1U4U+ljN<$P54Zx|y6FMvg;uF7j$$1^w`H~j&Q;7)CDWo?BHgYzQW^Yp zSftYywnDlUGo(_uS~2@c<$GHJT}+tFU+ROscwbq-!V|55Zi8Cp@9&FLiFC&Nga?3b zeOREMOzJZgem-V|C$$E;!`qiDruq5%OMIoWnQ?6a-OtNHX9Y-P0f953+6KBEKhDzx z&072rpu2SG?3ru-U7(}2W2Z5uF9KKY)0V!)Rh3-a6!@tJIj8sh#{5Ol&nd;dx$4TR z+x|Fu1Y6X8IR3BShHgH5H6M$|yXTS)?%uI&_raudm#-JrV6Wa7E;@;?b}8`8-cWq) z^x^%-Qu9bfsOZ|M!~2h4%BzM^gR1W~xN&!Kw`*hpQa>Mwf57w~Pt|rt%r=coCP55X z7kL_9)AhQsP@t;XI_0~tohQy;xR{cBBy##BMS2I$P`P!=l(1ig$ipkAeHE7RJGlM& zY#CRm`uwMhg&jGQKJ#GU*L%r0n0(^eOBAEKzTf}bqff%e;a?*4^1mO`L)9j4>8Ja# zd08-R%862cL!o z45@$ZVXq`uoGhM071VOy2cuEl((zGk#%Fk)YcoE@E4$73i(Z*+ z#%Fs$$FFsD@Lc`GB@f1!Z>2 z(dhbUbj6tYPmiuNA+DeO7hxJd=EII-8a>C1^;vu{r?v~%l)Y)o&pUpN?X<^sEEmTd zZ(lvQA^7u;$Bg*HNYSW^TS~rz^<5RLL0RA)FxVsnE%nHDg$yXwi1#iBFQ=@U;6m{Y5lfOwjO2P`^R z4h7a39GA0Tl5E+*(V*Rw#sult!CQ`Vr`oE(oC^$(wwBMO=DyJ#Z37+OmII<^K0`D6D837F^= zPT2H&&bHMHqArnIj5+JGjno`~pK zW1SDTCXBs~wb2bPJ*t}b$%N*Fl0U6S!UnJXNLcRWcr);5@n1`^4lDZ1>&tw+^~G`i zj`u@a&ZkSC;Y`c_`puWKaGK1N{mq=+j%Pu(;=J}e#Wn8oIvRB5i=b<0<}<#M!gxm= zA+xpXKHXgPICo$F^CzphSzOB0?>6UxS63sy2)fbCD_Vy}{cU!lz7tninK1Kjn{^yI z*!7?Mrp}3qKYi}p$pew9DFIvaIc_%-6ZEo9TvhdP#gyrbcOE~3{imIar%h2EtK~Q> zt?pD^jt&p-g;P~;pTPOMprUV$|AM42?n~;-1;>{uB;G#0K0XrVij%jYuL^5~b;iQ0 z=T0Uioj!lP7;jy2sTTCbmus=u)#Y6}BTBNIxpY$xUDwQTw`A@S$~{84M<@q)Wr+3& z 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�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

{$bBDZpcDE)qYpItER8-(1GB)#YyvR!SsMSG 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 From 8a9fb9c5aa5fbe7400121b8ec29fcad3956c47fe Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Mon, 4 Jun 2018 12:18:07 +0000 Subject: [PATCH 68/71] Spacing fix. --- CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs index 959fbde9..904514bb 100644 --- a/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs +++ b/CodeMaid/Integration/Commands/SettingCleanupOnSaveCommand.cs @@ -71,7 +71,7 @@ protected override void OnExecute() CleanupOnSave = !CleanupOnSave; Settings.Default.Save(); - Package.IDE.StatusBar.Text = $"{ Resources.CodeMaidTurnedAutomaticCleanupOnSave }{CleanupOnSaveStateText}."; + Package.IDE.StatusBar.Text = $"{Resources.CodeMaidTurnedAutomaticCleanupOnSave} {CleanupOnSaveStateText}."; } #endregion BaseCommand Methods From 291791e05a8b981edf3f89e19293d1913e58865c Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 9 Jun 2018 18:37:53 +0000 Subject: [PATCH 69/71] Reduce the maximum wait time for building a code model from 30 seconds to 3 seconds when blocking the UI thread. Related to Issue #556 --- CodeMaid/Model/CodeModelManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeMaid/Model/CodeModelManager.cs b/CodeMaid/Model/CodeModelManager.cs index a7bf58bc..f9aaa225 100644 --- a/CodeMaid/Model/CodeModelManager.cs +++ b/CodeMaid/Model/CodeModelManager.cs @@ -112,7 +112,7 @@ internal SetCodeItems RetrieveAllCodeItems(Document document, bool loadLazyIniti var codeModel = _codeModelCache.GetCodeModel(document); if (codeModel.IsBuilding) { - if (!codeModel.IsBuiltWaitHandle.WaitOne(TimeSpan.FromSeconds(30))) + if (!codeModel.IsBuiltWaitHandle.WaitOne(TimeSpan.FromSeconds(3))) { OutputWindowHelper.WarningWriteLine( $"Timed out waiting for code model to be built for '{codeModel.Document.FullName}'"); From ce68c3c89792fddcd0e127e07316d125dcfa49ac Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 9 Jun 2018 18:43:53 +0000 Subject: [PATCH 70/71] Update CHANGELOG. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b71c7e2..9e97bfb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ These changes have not been released to the Visual Studio marketplace, but (if c - [x] [#496](https://github.com/codecadwallader/codemaid/pull/496) - Fix the .NET Framework minimum required version (which is v4.6) - [x] [#541](https://github.com/codecadwallader/codemaid/pull/541) - Project file (.csproj) cleanup - thanks [heku](https://github.com/heku)! - [x] [#546](https://github.com/codecadwallader/codemaid/pull/546) - Fix a setting that would leave a trailing white space when formatting comments - thanks [willemduncan](https://github.com/willemduncan)! + - [x] [#556](https://github.com/codecadwallader/codemaid/issues/556) - Partial fix reducing how long we will block waiting for a code model to be built. ## Previous Releases From 7c604330e6f6098568c7b804150abbc69f76b80a Mon Sep 17 00:00:00 2001 From: Steve Cadwallader Date: Sat, 9 Jun 2018 18:49:10 +0000 Subject: [PATCH 71/71] Update to v10.5 label. --- CHANGELOG.md | 17 ++++++--- CodeMaid/source.extension.cs | 2 +- CodeMaid/source.extension.vsixmanifest | 48 +++++++++++++------------- README.md | 2 +- appveyor.yml | 2 +- 5 files changed, 39 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e97bfb4..56f4ccb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,20 @@ # Changelog -## vNext (10.5) +## vNext (10.6) These changes have not been released to the Visual Studio marketplace, but (if checked) are available in preview within the [CI build](http://vsixgallery.com/extension/4c82e17d-927e-42d2-8460-b473ac7df316/). +- [ ] Features +- [ ] Fixes + +## Previous Releases + +These are the changes to each version that has been released to the Visual Studio marketplace. + +## 10.5 + +**2018-06-09** + - [x] Features - [x] [#477](https://github.com/codecadwallader/codemaid/pull/477) - Digging: New radial progress bar - thanks [Jammer77](https://github.com/Jammer77)! - [x] [#506](https://github.com/codecadwallader/codemaid/pull/506) - Enable localization for Chinese - thanks [maikebing](https://github.com/maikebing)! @@ -18,10 +29,6 @@ These changes have not been released to the Visual Studio marketplace, but (if c - [x] [#546](https://github.com/codecadwallader/codemaid/pull/546) - Fix a setting that would leave a trailing white space when formatting comments - thanks [willemduncan](https://github.com/willemduncan)! - [x] [#556](https://github.com/codecadwallader/codemaid/issues/556) - Partial fix reducing how long we will block waiting for a code model to be built. -## Previous Releases - -These are the changes to each version that has been released to the Visual Studio marketplace. - ## 10.4 **2017-03-26** diff --git a/CodeMaid/source.extension.cs b/CodeMaid/source.extension.cs index b2640377..b9050770 100644 --- a/CodeMaid/source.extension.cs +++ b/CodeMaid/source.extension.cs @@ -6,7 +6,7 @@ static class Vsix public const string Name = "CodeMaid"; public const string Description = "CodeMaid is an open source Visual Studio extension to cleanup and simplify our C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding."; public const string Language = "en-US"; - public const string Version = "10.4"; + public const string Version = "10.5"; public const string Author = "Steve Cadwallader"; public const string Tags = "build, code, c#, beautify, cleanup, cleaning, digging, reorganizing, formatting"; } diff --git a/CodeMaid/source.extension.vsixmanifest b/CodeMaid/source.extension.vsixmanifest index e3aa052d..1cab3d91 100644 --- a/CodeMaid/source.extension.vsixmanifest +++ b/CodeMaid/source.extension.vsixmanifest @@ -1,30 +1,30 @@  - - - CodeMaid - CodeMaid is an open source Visual Studio extension to cleanup and simplify our C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding. - http://www.codemaid.net/ - LICENSE.txt - CodeMaid.png - CodeMaid_Large.png - build, code, c#, beautify, cleanup, cleaning, digging, reorganizing, formatting - + + + CodeMaid + CodeMaid is an open source Visual Studio extension to cleanup and simplify our C#, C++, F#, VB, PHP, PowerShell, R, JSON, XAML, XML, ASP, HTML, CSS, LESS, SCSS, JavaScript and TypeScript coding. + http://www.codemaid.net/ + LICENSE.txt + CodeMaid.png + CodeMaid_Large.png + build, code, c#, beautify, cleanup, cleaning, digging, reorganizing, formatting + - - - - + + + + - - - - + + + + - - - - - - + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index e976b058..eb2f4e43 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -

codemaid.net
+
codemaid.net
For more details, please visit: http://www.codemaid.net

Currently supports VS2012, VS2013, VS2015 and VS2017.

For Visual Studio 2010, the last supported version is v0.8.1.

diff --git a/appveyor.yml b/appveyor.yml index 85db7a76..f532cfb6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 10.4.{build} +version: 10.5.{build} image: Visual Studio 2017 install: