From ef8aec25b7f7d6a128e74fd06399649eec0a2b78 Mon Sep 17 00:00:00 2001 From: Tiberiu Chibici Date: Fri, 15 Aug 2014 15:31:33 +0300 Subject: [PATCH] Work on resource and settings managers, added some documentation. --- Docs/RainmeterStudio Plugin Documentation.odt | Bin 0 -> 56809 bytes .../Documents/DocumentTemplate.cs | 16 +- .../RainmeterStudio.Core.csproj | 3 + RainmeterStudio.Core/Utils/BitmapHelper.cs | 43 ++ RainmeterStudio.Core/Utils/InputHelper.cs | 80 +++ .../RainmeterStudio.SkinDesignerPlugin.csproj | 6 +- .../Resources/Graphics.Designer.cs | 7 +- .../Resources/Graphics.resx | 5 +- .../SkinDocumentTemplate.cs | 2 +- .../RainmeterStudio.TextEditorPlugin.csproj | 27 + .../Resources/Icons.Designer.cs | 83 +++ .../Resources/Icons.resx | 127 +++++ .../Resources/Icons/16/text_generic.png | Bin .../Resources/Icons/32/text_generic.png | Bin .../Resources/Strings.Designer.cs | 81 +++ .../Resources/Strings.resx | 126 +++++ .../TextDocumentTemplate.cs | 2 +- .../ResourceProvider.cs | 16 +- .../SettingsProvider.cs | 20 +- RainmeterStudio/MainClass.cs | 3 + .../Properties/Settings.Designer.cs | 60 +++ RainmeterStudio/Properties/Settings.settings | 15 + RainmeterStudio/RainmeterStudio.csproj | 43 +- RainmeterStudio/Resources/Icons.Designer.cs | 102 ++-- RainmeterStudio/Resources/Icons.resx | 55 +- RainmeterStudio/Resources/Strings.Designer.cs | 489 +++++++++--------- RainmeterStudio/Resources/Strings.resx | 71 ++- RainmeterStudio/UI/Command.cs | 132 +---- .../UI/Controller/DocumentController.cs | 4 +- RainmeterStudio/UI/Controller/IconProvider.cs | 6 +- .../UI/Dialogs/CreateDocumentDialog.xaml | 31 +- .../UI/Dialogs/CreateDocumentDialog.xaml.cs | 48 +- .../UI/Dialogs/CreateProjectDialog.xaml | 12 +- RainmeterStudio/UI/MainWindow.xaml | 10 +- .../UI/ViewModel/DocumentTemplateViewModel.cs | 79 +-- RainmeterStudio/app.config | 15 + 36 files changed, 1148 insertions(+), 671 deletions(-) create mode 100644 Docs/RainmeterStudio Plugin Documentation.odt create mode 100644 RainmeterStudio.Core/Utils/BitmapHelper.cs create mode 100644 RainmeterStudio.Core/Utils/InputHelper.cs create mode 100644 RainmeterStudio.TextEditor/Resources/Icons.Designer.cs create mode 100644 RainmeterStudio.TextEditor/Resources/Icons.resx rename {RainmeterStudio => RainmeterStudio.TextEditor}/Resources/Icons/16/text_generic.png (100%) rename {RainmeterStudio => RainmeterStudio.TextEditor}/Resources/Icons/32/text_generic.png (100%) create mode 100644 RainmeterStudio.TextEditor/Resources/Strings.Designer.cs create mode 100644 RainmeterStudio.TextEditor/Resources/Strings.resx rename RainmeterStudio/{Resources => Business}/ResourceProvider.cs (88%) rename RainmeterStudio/{UI/Controller => Business}/SettingsProvider.cs (76%) diff --git a/Docs/RainmeterStudio Plugin Documentation.odt b/Docs/RainmeterStudio Plugin Documentation.odt new file mode 100644 index 0000000000000000000000000000000000000000..d86306b14d571c969ea4488f49405293e73ae939 GIT binary patch literal 56809 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 public string DefaultExtension { get; private set; } + ///

+ /// Gets or sets the properties of this template + /// + /// Properties are used to display a form dialog after the "New item" dialog closes. + public virtual IEnumerable Properties + { + get + { + return Enumerable.Empty(); + } + } + /// /// Initializes the document template /// diff --git a/RainmeterStudio.Core/RainmeterStudio.Core.csproj b/RainmeterStudio.Core/RainmeterStudio.Core.csproj index 654404fe..75f0bd28 100644 --- a/RainmeterStudio.Core/RainmeterStudio.Core.csproj +++ b/RainmeterStudio.Core/RainmeterStudio.Core.csproj @@ -35,6 +35,7 @@ + @@ -62,7 +63,9 @@ + + diff --git a/RainmeterStudio.Core/Utils/BitmapHelper.cs b/RainmeterStudio.Core/Utils/BitmapHelper.cs new file mode 100644 index 00000000..b6818d06 --- /dev/null +++ b/RainmeterStudio.Core/Utils/BitmapHelper.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Data; +using System.Windows.Media; +using System.Windows.Media.Imaging; + +namespace RainmeterStudio.Core.Utils +{ + public static class BitmapHelper + { + public static ImageSource GetImageSource(this System.Drawing.Bitmap image) + { + BitmapSource destination; + IntPtr bitmapHandle = image.GetHbitmap(); + BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions(); + destination = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bitmapHandle, IntPtr.Zero, Int32Rect.Empty, sizeOptions); + destination.Freeze(); + return destination; + } + } + + public class BitmapToImageSourceConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + var bitmap = value as System.Drawing.Bitmap; + if (bitmap != null) + { + return bitmap.GetImageSource(); + } + + return null; + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotSupportedException(); + } + } +} diff --git a/RainmeterStudio.Core/Utils/InputHelper.cs b/RainmeterStudio.Core/Utils/InputHelper.cs new file mode 100644 index 00000000..30677bcf --- /dev/null +++ b/RainmeterStudio.Core/Utils/InputHelper.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Input; + +namespace RainmeterStudio.Core.Utils +{ + /// + /// Helper methods for key gestures + /// + public static class InputHelper + { + /// + /// Converts a key gesture into its string representation + /// + /// Key gesture + /// The string representation + public static string ConvertToString(this KeyGesture gesture) + { + // Safety check + if (gesture == null) + return null; + + // Build string + string text = String.Empty; + + if ((gesture.Modifiers & ModifierKeys.Windows) != 0) + text += "Win+"; + + if ((gesture.Modifiers & ModifierKeys.Control) != 0) + text += "Ctrl+"; + + if ((gesture.Modifiers & ModifierKeys.Alt) != 0) + text += "Alt+"; + + if ((gesture.Modifiers & ModifierKeys.Shift) != 0) + text += "Shift+"; + + text += Enum.GetName(typeof(Key), gesture.Key); + return text; + } + + /// + /// Obtains a key gesture from a string representation + /// + /// The key gesture string + /// A key gesture object + public static KeyGesture GetKeyGesture(string keyGesture) + { + // Safety check + if (keyGesture == null) + return null; + + // Variables + ModifierKeys mods = ModifierKeys.None; + Key key = Key.None; + + // Parse each field + foreach (var field in keyGesture.Split('+')) + { + // Trim surrounding white space + string trimmed = field.Trim(); + + // Parse + if (trimmed.Equals("Win", StringComparison.InvariantCultureIgnoreCase)) + mods |= ModifierKeys.Windows; + if (trimmed.Equals("Ctrl", StringComparison.InvariantCultureIgnoreCase)) + mods |= ModifierKeys.Control; + if (trimmed.Equals("Alt", StringComparison.InvariantCultureIgnoreCase)) + mods |= ModifierKeys.Alt; + if (trimmed.Equals("Shift", StringComparison.InvariantCultureIgnoreCase)) + mods |= ModifierKeys.Shift; + else Enum.TryParse(field, out key); + } + + return new KeyGesture(key, mods); + } + } +} diff --git a/RainmeterStudio.SkinDesigner/RainmeterStudio.SkinDesignerPlugin.csproj b/RainmeterStudio.SkinDesigner/RainmeterStudio.SkinDesignerPlugin.csproj index b2948dbf..32179032 100644 --- a/RainmeterStudio.SkinDesigner/RainmeterStudio.SkinDesignerPlugin.csproj +++ b/RainmeterStudio.SkinDesigner/RainmeterStudio.SkinDesignerPlugin.csproj @@ -35,6 +35,7 @@ + @@ -84,7 +85,7 @@ - + @@ -100,6 +101,9 @@ Strings.Designer.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + icons\16\text_generic.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + icons\32\text_generic.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/RainmeterStudio/Resources/Icons/16/text_generic.png b/RainmeterStudio.TextEditor/Resources/Icons/16/text_generic.png similarity index 100% rename from RainmeterStudio/Resources/Icons/16/text_generic.png rename to RainmeterStudio.TextEditor/Resources/Icons/16/text_generic.png diff --git a/RainmeterStudio/Resources/Icons/32/text_generic.png b/RainmeterStudio.TextEditor/Resources/Icons/32/text_generic.png similarity index 100% rename from RainmeterStudio/Resources/Icons/32/text_generic.png rename to RainmeterStudio.TextEditor/Resources/Icons/32/text_generic.png diff --git a/RainmeterStudio.TextEditor/Resources/Strings.Designer.cs b/RainmeterStudio.TextEditor/Resources/Strings.Designer.cs new file mode 100644 index 00000000..518d074d --- /dev/null +++ b/RainmeterStudio.TextEditor/Resources/Strings.Designer.cs @@ -0,0 +1,81 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34014 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace RainmeterStudio.TextEditorPlugin.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RainmeterStudio.TextEditorPlugin.Resources.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Blank text file. + /// + public static string Template_Text_Description { + get { + return ResourceManager.GetString("Template_Text_Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Text file. + /// + public static string Template_Text_DisplayText { + get { + return ResourceManager.GetString("Template_Text_DisplayText", resourceCulture); + } + } + } +} diff --git a/RainmeterStudio.TextEditor/Resources/Strings.resx b/RainmeterStudio.TextEditor/Resources/Strings.resx new file mode 100644 index 00000000..0c7b5470 --- /dev/null +++ b/RainmeterStudio.TextEditor/Resources/Strings.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Blank text file + + + Text file + + \ No newline at end of file diff --git a/RainmeterStudio.TextEditor/TextDocumentTemplate.cs b/RainmeterStudio.TextEditor/TextDocumentTemplate.cs index 721ecbe0..21ea3dca 100644 --- a/RainmeterStudio.TextEditor/TextDocumentTemplate.cs +++ b/RainmeterStudio.TextEditor/TextDocumentTemplate.cs @@ -15,7 +15,7 @@ namespace RainmeterStudio.TextEditorPlugin public class TextDocumentTemplate : DocumentTemplate { public TextDocumentTemplate() - : base("TextDocument", "txt") + : base("Text", "txt") { } diff --git a/RainmeterStudio/Resources/ResourceProvider.cs b/RainmeterStudio/Business/ResourceProvider.cs similarity index 88% rename from RainmeterStudio/Resources/ResourceProvider.cs rename to RainmeterStudio/Business/ResourceProvider.cs index 8b29904c..37d39d5d 100644 --- a/RainmeterStudio/Resources/ResourceProvider.cs +++ b/RainmeterStudio/Business/ResourceProvider.cs @@ -3,9 +3,9 @@ using System.Collections.Generic; using System.Reflection; using System.Resources; using System.Windows.Media; -using System.Windows.Media.Imaging; +using RainmeterStudio.Core.Utils; -namespace RainmeterStudio.Resources +namespace RainmeterStudio.Business { /// /// Manages and provides resources @@ -19,6 +19,11 @@ namespace RainmeterStudio.Resources { public ResourceManager Manager; public Assembly Assembly; + + public override string ToString() + { + return String.Format("{{{0}; {1}}}", Manager, Assembly); + } } private static List _resourceManagers = new List(); @@ -94,13 +99,12 @@ namespace RainmeterStudio.Resources foreach (var info in _resourceManagers) { // Try to get resource - var path = info.Manager.GetString(key); + var bitmap = info.Manager.GetObject(key) as System.Drawing.Bitmap; // Found - if (path != null) + if (bitmap != null) { - Uri fullPath = new Uri("/" + info.Assembly.GetName().Name + ";component" + path, UriKind.Relative); - image = new BitmapImage(fullPath); + image = bitmap.GetImageSource(); if (keepInCache) _cacheImages[key] = image; diff --git a/RainmeterStudio/UI/Controller/SettingsProvider.cs b/RainmeterStudio/Business/SettingsProvider.cs similarity index 76% rename from RainmeterStudio/UI/Controller/SettingsProvider.cs rename to RainmeterStudio/Business/SettingsProvider.cs index e6902f77..461ea424 100644 --- a/RainmeterStudio/UI/Controller/SettingsProvider.cs +++ b/RainmeterStudio/Business/SettingsProvider.cs @@ -1,10 +1,8 @@ using System; -using System.Collections.Generic; using System.Configuration; using System.Linq; -using System.Text; -namespace RainmeterStudio.UI.Controller +namespace RainmeterStudio.Business { public static class SettingsProvider { @@ -45,5 +43,21 @@ namespace RainmeterStudio.UI.Controller return false; } } + + /// + /// Saves the settings + /// + public static void SaveSettings() + { + Properties.Settings.Default.Save(); + } + + /// + /// Resets settings to default + /// + public static void ResetSettings() + { + Properties.Settings.Default.Reset(); + } } } diff --git a/RainmeterStudio/MainClass.cs b/RainmeterStudio/MainClass.cs index f0717720..1e8d825b 100644 --- a/RainmeterStudio/MainClass.cs +++ b/RainmeterStudio/MainClass.cs @@ -39,6 +39,9 @@ namespace RainmeterStudio // Create & run app var uiManager = new UIManager(projectManager, documentManager); uiManager.Run(); + + // Run finished, persist settings + SettingsProvider.SaveSettings(); } } } diff --git a/RainmeterStudio/Properties/Settings.Designer.cs b/RainmeterStudio/Properties/Settings.Designer.cs index 287a887e..b0da8675 100644 --- a/RainmeterStudio/Properties/Settings.Designer.cs +++ b/RainmeterStudio/Properties/Settings.Designer.cs @@ -87,5 +87,65 @@ namespace RainmeterStudio.Properties { this["DocumentCloseCommand_Shortcut"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("800")] + public double MainWindow_Width { + get { + return ((double)(this["MainWindow_Width"])); + } + set { + this["MainWindow_Width"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("600")] + public double MainWindow_Height { + get { + return ((double)(this["MainWindow_Height"])); + } + set { + this["MainWindow_Height"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Normal")] + public global::System.Windows.WindowState MainWindow_WindowState { + get { + return ((global::System.Windows.WindowState)(this["MainWindow_WindowState"])); + } + set { + this["MainWindow_WindowState"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("10")] + public double MainWindow_Left { + get { + return ((double)(this["MainWindow_Left"])); + } + set { + this["MainWindow_Left"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("10")] + public double MainWindow_Top { + get { + return ((double)(this["MainWindow_Top"])); + } + set { + this["MainWindow_Top"] = value; + } + } } } diff --git a/RainmeterStudio/Properties/Settings.settings b/RainmeterStudio/Properties/Settings.settings index 83ff4d8d..5eea773c 100644 --- a/RainmeterStudio/Properties/Settings.settings +++ b/RainmeterStudio/Properties/Settings.settings @@ -17,5 +17,20 @@ Ctrl+W + + 800 + + + 600 + + + Normal + + + 10 + + + 10 + \ No newline at end of file diff --git a/RainmeterStudio/RainmeterStudio.csproj b/RainmeterStudio/RainmeterStudio.csproj index 2ebca134..d0764069 100644 --- a/RainmeterStudio/RainmeterStudio.csproj +++ b/RainmeterStudio/RainmeterStudio.csproj @@ -78,7 +78,7 @@ True Icons.resx - + True True @@ -88,7 +88,7 @@ - + CreateDocumentDialog.xaml @@ -156,6 +156,7 @@ ResXFileCodeGenerator Icons.Designer.cs + Designer PublicResXFileCodeGenerator @@ -169,56 +170,50 @@ - - - - + - + - - + + - + - - + + - + - + - + - + - + + - - + - + - - - - + diff --git a/RainmeterStudio/Resources/Icons.Designer.cs b/RainmeterStudio/Resources/Icons.Designer.cs index 14e5332a..e554dee6 100644 --- a/RainmeterStudio/Resources/Icons.Designer.cs +++ b/RainmeterStudio/Resources/Icons.Designer.cs @@ -61,128 +61,122 @@ namespace RainmeterStudio.Resources { } /// - /// Looks up a localized string similar to /Resources/Icons/16/page_white_star.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string DocumentCreateCommand { + internal static System.Drawing.Bitmap Command_DocumentCreateCommand_Icon { get { - return ResourceManager.GetString("DocumentCreateCommand", resourceCulture); + object obj = ResourceManager.GetObject("Command_DocumentCreateCommand_Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/32/text_generic.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string DocumentTemplate_Text { + internal static System.Drawing.Bitmap Command_ProjectCreateCommand_Icon { get { - return ResourceManager.GetString("DocumentTemplate_Text", resourceCulture); + object obj = ResourceManager.GetObject("Command_ProjectCreateCommand_Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/16/project_star.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string ProjectCreateCommand { + internal static System.Drawing.Bitmap Command_ProjectOpenCommand_Icon { get { - return ResourceManager.GetString("ProjectCreateCommand", resourceCulture); + object obj = ResourceManager.GetObject("Command_ProjectOpenCommand_Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/16/project.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string ProjectItem_rsproj { + internal static System.Drawing.Bitmap Command_ProjectPanel_CollapseAllCommand_Icon { get { - return ResourceManager.GetString("ProjectItem_rsproj", resourceCulture); + object obj = ResourceManager.GetObject("Command_ProjectPanel_CollapseAllCommand_Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/16/text_generic.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string ProjectItem_txt { + internal static System.Drawing.Bitmap Command_ProjectPanel_ExpandAllCommand_Icon { get { - return ResourceManager.GetString("ProjectItem_txt", resourceCulture); + object obj = ResourceManager.GetObject("Command_ProjectPanel_ExpandAllCommand_Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/16/folder.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string ProjectItemDirectory { + internal static System.Drawing.Bitmap Command_ProjectPanel_RefreshCommand_Icon { get { - return ResourceManager.GetString("ProjectItemDirectory", resourceCulture); + object obj = ResourceManager.GetObject("Command_ProjectPanel_RefreshCommand_Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/16/page_white_delete.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string ProjectItemNone { + internal static System.Drawing.Bitmap Command_ProjectPanel_ShowAllFilesCommand_Icon { get { - return ResourceManager.GetString("ProjectItemNone", resourceCulture); + object obj = ResourceManager.GetObject("Command_ProjectPanel_ShowAllFilesCommand_Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/16/file_generic.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string ProjectItemUnknown { + internal static System.Drawing.Bitmap Command_ProjectPanel_SyncWithActiveViewCommand_Icon { get { - return ResourceManager.GetString("ProjectItemUnknown", resourceCulture); + object obj = ResourceManager.GetObject("Command_ProjectPanel_SyncWithActiveViewCommand_Icon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/16/folder_project.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string ProjectOpenCommand { + internal static System.Drawing.Bitmap ProjectItem_rsproj { get { - return ResourceManager.GetString("ProjectOpenCommand", resourceCulture); + object obj = ResourceManager.GetObject("ProjectItem_rsproj", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/16/minus.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string ProjectPanel_CollapseAllCommand { + internal static System.Drawing.Bitmap ProjectItemDirectory { get { - return ResourceManager.GetString("ProjectPanel_CollapseAllCommand", resourceCulture); + object obj = ResourceManager.GetObject("ProjectItemDirectory", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/16/plus.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string ProjectPanel_ExpandAllCommand { + internal static System.Drawing.Bitmap ProjectItemNone { get { - return ResourceManager.GetString("ProjectPanel_ExpandAllCommand", resourceCulture); + object obj = ResourceManager.GetObject("ProjectItemNone", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } /// - /// Looks up a localized string similar to /Resources/Icons/16/view-refresh.png. + /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static string ProjectPanel_RefreshCommand { + internal static System.Drawing.Bitmap ProjectItemUnknown { get { - return ResourceManager.GetString("ProjectPanel_RefreshCommand", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to /Resources/Icons/16/folder_explore.png. - /// - internal static string ProjectPanel_ShowAllFilesCommand { - get { - return ResourceManager.GetString("ProjectPanel_ShowAllFilesCommand", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to /Resources/Icons/16/arrow_refresh_small.png. - /// - internal static string ProjectPanel_SyncWithActiveViewCommand { - get { - return ResourceManager.GetString("ProjectPanel_SyncWithActiveViewCommand", resourceCulture); + object obj = ResourceManager.GetObject("ProjectItemUnknown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); } } } diff --git a/RainmeterStudio/Resources/Icons.resx b/RainmeterStudio/Resources/Icons.resx index 5ca75648..a8540d9a 100644 --- a/RainmeterStudio/Resources/Icons.resx +++ b/RainmeterStudio/Resources/Icons.resx @@ -117,46 +117,41 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - /Resources/Icons/16/page_white_star.png + + + icons\16\page_white_star.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/32/text_generic.png + + icons\16\project_star.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/16/project_star.png + + icons\16\folder_project.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/16/folder.png + + icons\16\minus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/16/page_white_delete.png + + icons\16\plus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/16/file_generic.png + + icons\16\view-refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/16/project.png + + icons\16\folder_explore.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/16/text_generic.png + + icons\16\arrow_refresh_small.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/16/folder_project.png + + icons\16\folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/16/minus.png + + icons\16\file_generic.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/16/plus.png + + icons\16\page_white_delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - /Resources/Icons/16/view-refresh.png - - - /Resources/Icons/16/folder_explore.png - - - /Resources/Icons/16/arrow_refresh_small.png + + icons\16\project.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/RainmeterStudio/Resources/Strings.Designer.cs b/RainmeterStudio/Resources/Strings.Designer.cs index 3e273e9d..ab9b89c1 100644 --- a/RainmeterStudio/Resources/Strings.Designer.cs +++ b/RainmeterStudio/Resources/Strings.Designer.cs @@ -61,11 +61,245 @@ namespace RainmeterStudio.Resources { } /// - /// Looks up a localized string similar to Utility. + /// Looks up a localized string similar to _Close. /// - public static string Category_Utility { + public static string Command_DocumentCloseCommand_DisplayText { get { - return ResourceManager.GetString("Category_Utility", resourceCulture); + return ResourceManager.GetString("Command_DocumentCloseCommand_DisplayText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close active document. + /// + public static string Command_DocumentCloseCommand_ToolTip { + get { + return ResourceManager.GetString("Command_DocumentCloseCommand_ToolTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to _File.... + /// + public static string Command_DocumentCreateCommand_DisplayText { + get { + return ResourceManager.GetString("Command_DocumentCreateCommand_DisplayText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create a new file. + /// + public static string Command_DocumentCreateCommand_ToolTip { + get { + return ResourceManager.GetString("Command_DocumentCreateCommand_ToolTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to _Project.... + /// + public static string Command_ProjectCreateCommand_DisplayText { + get { + return ResourceManager.GetString("Command_ProjectCreateCommand_DisplayText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create a new project. + /// + public static string Command_ProjectCreateCommand_ToolTip { + get { + return ResourceManager.GetString("Command_ProjectCreateCommand_ToolTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to _Project.... + /// + public static string Command_ProjectOpenCommand_DisplayText { + get { + return ResourceManager.GetString("Command_ProjectOpenCommand_DisplayText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open existing project. + /// + public static string Command_ProjectOpenCommand_ToolTip { + get { + return ResourceManager.GetString("Command_ProjectOpenCommand_ToolTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collapse all. + /// + public static string Command_ProjectPanel_CollapseAllCommand_DisplayText { + get { + return ResourceManager.GetString("Command_ProjectPanel_CollapseAllCommand_DisplayText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collapse all. + /// + public static string Command_ProjectPanel_CollapseAllCommand_ToolTip { + get { + return ResourceManager.GetString("Command_ProjectPanel_CollapseAllCommand_ToolTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expand all. + /// + public static string Command_ProjectPanel_ExpandAllCommand_DisplayText { + get { + return ResourceManager.GetString("Command_ProjectPanel_ExpandAllCommand_DisplayText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expand all. + /// + public static string Command_ProjectPanel_ExpandAllCommand_ToolTip { + get { + return ResourceManager.GetString("Command_ProjectPanel_ExpandAllCommand_ToolTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Refresh. + /// + public static string Command_ProjectPanel_RefreshCommand_DisplayText { + get { + return ResourceManager.GetString("Command_ProjectPanel_RefreshCommand_DisplayText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Refresh. + /// + public static string Command_ProjectPanel_RefreshCommand_ToolTip { + get { + return ResourceManager.GetString("Command_ProjectPanel_RefreshCommand_ToolTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show all files. + /// + public static string Command_ProjectPanel_ShowAllFilesCommand_DisplayText { + get { + return ResourceManager.GetString("Command_ProjectPanel_ShowAllFilesCommand_DisplayText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show all files. + /// + public static string Command_ProjectPanel_ShowAllFilesCommand_ToolTip { + get { + return ResourceManager.GetString("Command_ProjectPanel_ShowAllFilesCommand_ToolTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sync with active view. + /// + public static string Command_ProjectPanel_SyncWithActiveViewCommand_DisplayText { + get { + return ResourceManager.GetString("Command_ProjectPanel_SyncWithActiveViewCommand_DisplayText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sync with active view. + /// + public static string Command_ProjectPanel_SyncWithActiveViewCommand_ToolTip { + get { + return ResourceManager.GetString("Command_ProjectPanel_SyncWithActiveViewCommand_ToolTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name:. + /// + public static string CreateDocumentDialog_Name { + get { + return ResourceManager.GetString("CreateDocumentDialog_Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Path:. + /// + public static string CreateDocumentDialog_Path { + get { + return ResourceManager.GetString("CreateDocumentDialog_Path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New item. + /// + public static string CreateDocumentDialog_Title { + get { + return ResourceManager.GetString("CreateDocumentDialog_Title", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Location:. + /// + public static string CreateProjectDialog_Location { + get { + return ResourceManager.GetString("CreateProjectDialog_Location", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set location as default. + /// + public static string CreateProjectDialog_LocationDefault { + get { + return ResourceManager.GetString("CreateProjectDialog_LocationDefault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name:. + /// + public static string CreateProjectDialog_Name { + get { + return ResourceManager.GetString("CreateProjectDialog_Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Path:. + /// + public static string CreateProjectDialog_Path { + get { + return ResourceManager.GetString("CreateProjectDialog_Path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create directory for project. + /// + public static string CreateProjectDialog_PathCreateFolder { + get { + return ResourceManager.GetString("CreateProjectDialog_PathCreateFolder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create project. + /// + public static string CreateProjectDialog_Title { + get { + return ResourceManager.GetString("CreateProjectDialog_Title", resourceCulture); } } @@ -132,69 +366,6 @@ namespace RainmeterStudio.Resources { } } - /// - /// Looks up a localized string similar to _Close. - /// - public static string DocumentCloseCommand_DisplayText { - get { - return ResourceManager.GetString("DocumentCloseCommand_DisplayText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Close active document. - /// - public static string DocumentCloseCommand_ToolTip { - get { - return ResourceManager.GetString("DocumentCloseCommand_ToolTip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to _File.... - /// - public static string DocumentCreateCommand_DisplayText { - get { - return ResourceManager.GetString("DocumentCreateCommand_DisplayText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Create a new file. - /// - public static string DocumentCreateCommand_ToolTip { - get { - return ResourceManager.GetString("DocumentCreateCommand_ToolTip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Text Editor. - /// - public static string DocumentEditor_Text_Name { - get { - return ResourceManager.GetString("DocumentEditor_Text_Name", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Blank text file. - /// - public static string DocumentFormat_TextFile_Description { - get { - return ResourceManager.GetString("DocumentFormat_TextFile_Description", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Text file. - /// - public static string DocumentFormat_TextFile_Name { - get { - return ResourceManager.GetString("DocumentFormat_TextFile_Name", resourceCulture); - } - } - /// /// Looks up a localized string similar to _File. /// @@ -223,191 +394,11 @@ namespace RainmeterStudio.Resources { } /// - /// Looks up a localized string similar to _Project.... + /// Looks up a localized string similar to Rainmeter Studio. /// - public static string ProjectCreateCommand_DisplayText { + public static string MainWindow_Title { get { - return ResourceManager.GetString("ProjectCreateCommand_DisplayText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Create a new project. - /// - public static string ProjectCreateCommand_ToolTip { - get { - return ResourceManager.GetString("ProjectCreateCommand_ToolTip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Location:. - /// - public static string ProjectCreateDialog_Location { - get { - return ResourceManager.GetString("ProjectCreateDialog_Location", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Set location as default. - /// - public static string ProjectCreateDialog_LocationDefault { - get { - return ResourceManager.GetString("ProjectCreateDialog_LocationDefault", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Name:. - /// - public static string ProjectCreateDialog_Name { - get { - return ResourceManager.GetString("ProjectCreateDialog_Name", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Path:. - /// - public static string ProjectCreateDialog_Path { - get { - return ResourceManager.GetString("ProjectCreateDialog_Path", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Create directory for project. - /// - public static string ProjectCreateDialog_PathCreateFolder { - get { - return ResourceManager.GetString("ProjectCreateDialog_PathCreateFolder", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Create project. - /// - public static string ProjectCreateDialog_Title { - get { - return ResourceManager.GetString("ProjectCreateDialog_Title", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to _Project.... - /// - public static string ProjectOpenCommand_DisplayText { - get { - return ResourceManager.GetString("ProjectOpenCommand_DisplayText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Open existing project. - /// - public static string ProjectOpenCommand_ToolTip { - get { - return ResourceManager.GetString("ProjectOpenCommand_ToolTip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collapse all. - /// - public static string ProjectPanel_CollapseAllCommand_DisplayText { - get { - return ResourceManager.GetString("ProjectPanel_CollapseAllCommand_DisplayText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collapse all. - /// - public static string ProjectPanel_CollapseAllCommand_ToolTip { - get { - return ResourceManager.GetString("ProjectPanel_CollapseAllCommand_ToolTip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Expand all. - /// - public static string ProjectPanel_ExpandAllCommand_DisplayText { - get { - return ResourceManager.GetString("ProjectPanel_ExpandAllCommand_DisplayText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Expand all. - /// - public static string ProjectPanel_ExpandAllCommand_ToolTip { - get { - return ResourceManager.GetString("ProjectPanel_ExpandAllCommand_ToolTip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Refresh. - /// - public static string ProjectPanel_RefreshCommand_DisplayText { - get { - return ResourceManager.GetString("ProjectPanel_RefreshCommand_DisplayText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Refresh. - /// - public static string ProjectPanel_RefreshCommand_ToolTip { - get { - return ResourceManager.GetString("ProjectPanel_RefreshCommand_ToolTip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show all files. - /// - public static string ProjectPanel_ShowAllFilesCommand_DisplayText { - get { - return ResourceManager.GetString("ProjectPanel_ShowAllFilesCommand_DisplayText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Show all files. - /// - public static string ProjectPanel_ShowAllFilesCommand_ToolTip { - get { - return ResourceManager.GetString("ProjectPanel_ShowAllFilesCommand_ToolTip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sync with active view. - /// - public static string ProjectPanel_SyncWithActiveViewCommand_DisplayText { - get { - return ResourceManager.GetString("ProjectPanel_SyncWithActiveViewCommand_DisplayText", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Sync with active view. - /// - public static string ProjectPanel_SyncWithActiveViewCommand_ToolTip { - get { - return ResourceManager.GetString("ProjectPanel_SyncWithActiveViewCommand_ToolTip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Utility. - /// - public static string TemplateCategory_Utility { - get { - return ResourceManager.GetString("TemplateCategory_Utility", resourceCulture); + return ResourceManager.GetString("MainWindow_Title", resourceCulture); } } } diff --git a/RainmeterStudio/Resources/Strings.resx b/RainmeterStudio/Resources/Strings.resx index f483277d..5153e4a8 100644 --- a/RainmeterStudio/Resources/Strings.resx +++ b/RainmeterStudio/Resources/Strings.resx @@ -117,8 +117,14 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Utility + + Name: + + + Path: + + + New item Browse @@ -141,27 +147,18 @@ Open project... - + _Close - + Close active document - + _File... - + Create a new file - - Text Editor - - - Blank text file - - - Text file - _File @@ -171,67 +168,67 @@ _Open - + _Project... - + Create a new project - + Location: - + Set location as default - + Name: - + Path: - + Create directory for project - + Create project - + _Project... - + Open existing project - + Collapse all - + Collapse all - + Expand all - + Expand all - + Refresh - + Refresh - + Show all files - + Show all files - + Sync with active view - + Sync with active view - - Utility + + Rainmeter Studio \ No newline at end of file diff --git a/RainmeterStudio/UI/Command.cs b/RainmeterStudio/UI/Command.cs index 451cee07..913bb3d9 100644 --- a/RainmeterStudio/UI/Command.cs +++ b/RainmeterStudio/UI/Command.cs @@ -1,10 +1,8 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Windows.Input; using System.Windows.Media; -using RainmeterStudio.UI.Controller; +using RainmeterStudio.Business; +using RainmeterStudio.Core.Utils; namespace RainmeterStudio.UI { @@ -26,9 +24,6 @@ namespace RainmeterStudio.UI /// public string Name { get; set; } - #region Display text property - private string _displayText = null; - /// /// Gets or sets the display text of the command /// @@ -36,22 +31,10 @@ namespace RainmeterStudio.UI { get { - if (_displayText == null) - return Resources.Strings.ResourceManager.GetString(Name + "_DisplayText"); - - return _displayText; - } - set - { - _displayText = value; + return ResourceProvider.GetString("Command_" + Name + "_DisplayText"); } } - #endregion - - #region ToolTip property - private string _toolTip = null; - /// /// Gets or sets the tooltip /// @@ -59,20 +42,9 @@ namespace RainmeterStudio.UI { get { - if (_toolTip == null) - return Resources.Strings.ResourceManager.GetString(Name + "_ToolTip"); - - return _toolTip; - } - set - { - _toolTip = value; + return ResourceProvider.GetString("Command_" + Name + "_ToolTip"); } } - #endregion - - #region Icon property - private ImageSource _icon = null; /// /// Gets or sets the command's icon @@ -81,21 +53,9 @@ namespace RainmeterStudio.UI { get { - if (_icon == null) - return IconProvider.GetIcon(Name); - - return _icon; - } - set - { - _icon = value; + return ResourceProvider.GetImage("Command_" + Name + "_Icon"); } } - #endregion - - #region Keyboard shortcut property - - private KeyGesture _shortcut; /// /// Gets or sets the keyboard shortcut of this command @@ -104,17 +64,8 @@ namespace RainmeterStudio.UI { get { - if (_shortcut == null) - { - string str = SettingsProvider.GetSetting(Name + "_Shortcut"); - return GetKeyGestureFromString(str); - } - - return _shortcut; - } - set - { - _shortcut = value; + string str = SettingsProvider.GetSetting("Command_" + Name + "_Shortcut"); + return InputHelper.GetKeyGesture(str); } } @@ -125,73 +76,20 @@ namespace RainmeterStudio.UI { get { - // Safety check - if (Shortcut == null) - return null; - - // Build string - string text = String.Empty; - - if ((Shortcut.Modifiers & ModifierKeys.Windows) != 0) - text += "Win+"; - - if ((Shortcut.Modifiers & ModifierKeys.Control) != 0) - text += "Ctrl+"; - - if ((Shortcut.Modifiers & ModifierKeys.Alt) != 0) - text += "Alt+"; - - if ((Shortcut.Modifiers & ModifierKeys.Shift) != 0) - text += "Shift+"; - - text += Enum.GetName(typeof(Key), Shortcut.Key); - return text; + return SettingsProvider.GetSetting("Command_" + Name + "_Shortcut"); } - set - { - Shortcut = GetKeyGestureFromString(value); - } - } - - private KeyGesture GetKeyGestureFromString(string k) - { - // Safety check - if (k == null) - return null; - - // Variables - ModifierKeys mods = ModifierKeys.None; - Key key = Key.None; - - // Parse each field - foreach (var field in k.Split('+')) - { - // Trim surrounding white space - string trimmed = field.Trim(); - - // Parse - if (trimmed.Equals("Win", StringComparison.InvariantCultureIgnoreCase)) - mods |= ModifierKeys.Windows; - if (trimmed.Equals("Ctrl", StringComparison.InvariantCultureIgnoreCase)) - mods |= ModifierKeys.Control; - if (trimmed.Equals("Alt", StringComparison.InvariantCultureIgnoreCase)) - mods |= ModifierKeys.Alt; - if (trimmed.Equals("Shift", StringComparison.InvariantCultureIgnoreCase)) - mods |= ModifierKeys.Shift; - else Enum.TryParse(field, out key); - } - - return new KeyGesture(key, mods); } #endregion - #endregion - - - + /// + /// Event triggered when the command execution status changes + /// public event EventHandler CanExecuteChanged; + /// + /// Triggers the can execute changed event + /// public void NotifyCanExecuteChanged() { if (CanExecuteChanged != null) @@ -252,7 +150,7 @@ namespace RainmeterStudio.UI } } - public static class UIElementExtensions + public static partial class UIElementExtensions { /// /// Adds a keyboard shortcut to an UI element diff --git a/RainmeterStudio/UI/Controller/DocumentController.cs b/RainmeterStudio/UI/Controller/DocumentController.cs index 1bc347ea..27af9194 100644 --- a/RainmeterStudio/UI/Controller/DocumentController.cs +++ b/RainmeterStudio/UI/Controller/DocumentController.cs @@ -66,7 +66,7 @@ namespace RainmeterStudio.UI.Controller var dialog = new CreateDocumentDialog(this) { Owner = OwnerWindow, - SelectedTemplate = defaultFormat, + SelectedTemplate = new DocumentTemplateViewModel(defaultFormat), SelectedPath = defaultPath }; bool? res = dialog.ShowDialog(); @@ -78,7 +78,7 @@ namespace RainmeterStudio.UI.Controller var path = dialog.SelectedPath; // Call manager - DocumentManager.Create(format); + DocumentManager.Create(format.Template); } public void Create(DocumentTemplate format) diff --git a/RainmeterStudio/UI/Controller/IconProvider.cs b/RainmeterStudio/UI/Controller/IconProvider.cs index 5004ff4e..a0fbf2b6 100644 --- a/RainmeterStudio/UI/Controller/IconProvider.cs +++ b/RainmeterStudio/UI/Controller/IconProvider.cs @@ -1,13 +1,9 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; using System.Windows.Data; using System.Windows.Media; -using System.Windows.Media.Imaging; +using RainmeterStudio.Business; using RainmeterStudio.Core.Model; -using RainmeterStudio.Resources; namespace RainmeterStudio.UI.Controller { diff --git a/RainmeterStudio/UI/Dialogs/CreateDocumentDialog.xaml b/RainmeterStudio/UI/Dialogs/CreateDocumentDialog.xaml index 6cd39e2a..20b821d0 100644 --- a/RainmeterStudio/UI/Dialogs/CreateDocumentDialog.xaml +++ b/RainmeterStudio/UI/Dialogs/CreateDocumentDialog.xaml @@ -1,31 +1,21 @@  - - - - - - - + - - - - - + @@ -41,7 +31,7 @@ - + @@ -52,13 +42,16 @@ - Path: + - + Path: + + + - diff --git a/RainmeterStudio/UI/Dialogs/CreateDocumentDialog.xaml.cs b/RainmeterStudio/UI/Dialogs/CreateDocumentDialog.xaml.cs index 2787fcae..d17819cb 100644 --- a/RainmeterStudio/UI/Dialogs/CreateDocumentDialog.xaml.cs +++ b/RainmeterStudio/UI/Dialogs/CreateDocumentDialog.xaml.cs @@ -1,19 +1,9 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; using System.Linq; -using System.Text; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Shapes; -using RainmeterStudio.Business; -using RainmeterStudio.Core.Documents; using RainmeterStudio.UI.Controller; +using RainmeterStudio.UI.ViewModel; namespace RainmeterStudio.UI.Dialogs { @@ -27,15 +17,15 @@ namespace RainmeterStudio.UI.Dialogs /// /// Gets or sets the currently selected file format /// - public DocumentTemplate SelectedTemplate + public DocumentTemplateViewModel SelectedTemplate { get { - return listFormats.SelectedItem as DocumentTemplate; + return listTemplates.SelectedItem as DocumentTemplateViewModel; } set { - listFormats.SelectedItem = value; + listTemplates.SelectedItem = value; } } @@ -62,29 +52,13 @@ namespace RainmeterStudio.UI.Dialogs InitializeComponent(); _documentController = docCtrl; - PopulateCategories(); - RepopulateFormats(); + PopulateFormats(); Validate(); } - private void PopulateCategories() + private void PopulateFormats() { - listCategories.ItemsSource = _documentController.DocumentTemplates - .Select(template => template.Category) - .Where(cat => cat != null) - .Distinct() - .Concat(new[] { "All" }); - - listCategories.SelectedIndex = listCategories.Items.Count - 1; - } - - private void RepopulateFormats() - { - if (Object.Equals(listCategories.SelectedItem, "All")) - listFormats.ItemsSource = _documentController.DocumentTemplates; - - else - listFormats.ItemsSource = _documentController.DocumentTemplates.Where(x => Object.Equals(x.Category, listCategories.SelectedItem)); + listTemplates.ItemsSource = _documentController.DocumentTemplates; } private void buttonCreate_Click(object sender, RoutedEventArgs e) @@ -102,15 +76,17 @@ namespace RainmeterStudio.UI.Dialogs private void Validate() { bool res = true; + res &= !String.IsNullOrWhiteSpace(textPath.Text); - res &= (listFormats.SelectedItem != null); + res &= !textPath.Text.Intersect(System.IO.Path.GetInvalidFileNameChars()).Any(); + res &= (listTemplates.SelectedItem != null); buttonCreate.IsEnabled = res; } - private void listCategories_SelectionChanged(object sender, SelectionChangedEventArgs e) + private void listFormats_SelectionChanged(object sender, SelectionChangedEventArgs e) { - RepopulateFormats(); + Validate(); } } } diff --git a/RainmeterStudio/UI/Dialogs/CreateProjectDialog.xaml b/RainmeterStudio/UI/Dialogs/CreateProjectDialog.xaml index b968b28c..fe3c0635 100644 --- a/RainmeterStudio/UI/Dialogs/CreateProjectDialog.xaml +++ b/RainmeterStudio/UI/Dialogs/CreateProjectDialog.xaml @@ -2,7 +2,7 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:r="clr-namespace:RainmeterStudio.Resources" - Title="{x:Static r:Strings.ProjectCreateDialog_Title}" Height="320" Width="480" + Title="{x:Static r:Strings.CreateProjectDialog_Title}" Height="320" Width="480" WindowStartupLocation="CenterOwner" WindowStyle="ToolWindow" ShowInTaskbar="False"> @@ -55,31 +55,31 @@ - + - + public string Name { get { return Template.Name; } } - #region Icon property - - private ImageSource _icon = null; - /// /// Gets or sets the icon of this document template /// - public virtual ImageSource Icon + public ImageSource Icon { get { - if (_icon == null) - return IconProvider.GetIcon("Template_" + Name); - - return _icon; - } - set - { - _icon = value; + return ResourceProvider.GetImage("Template_" + Name + "_Icon"); } } - #endregion - - #region Display text property - - private string _displayText = null; - /// /// Gets or sets the display text /// @@ -55,23 +34,10 @@ namespace RainmeterStudio.UI.ViewModel { get { - if (_displayText == null) - return Resources.Strings.ResourceManager.GetString("Template_" + Name + "_DisplayText"); - - return _displayText; - } - set - { - _displayText = value; + return ResourceProvider.GetString("Template_" + Name + "_DisplayText"); } } - #endregion - - #region Description property - - private string _description = null; - /// /// Gets or sets the description of this document template /// @@ -79,43 +45,10 @@ namespace RainmeterStudio.UI.ViewModel { get { - if (_description == null) - return Resources.Strings.ResourceManager.GetString("Template_" + Name + "_Description"); - - return _description; - } - set - { - _description = value; + return ResourceProvider.GetString("Template_" + Name + "_Description"); } } - #endregion - - #region Category property - - private string _category = null; - - /// - /// Gets or sets the category of this template - /// - public string Category - { - get - { - if (_category == null) - return Resources.Strings.ResourceManager.GetString("Template_" + Name + "_Category"); - - return _category; - } - set - { - _category = value; - } - } - - #endregion - /// /// Initializes the document template view model /// diff --git a/RainmeterStudio/app.config b/RainmeterStudio/app.config index 8ed0c457..8ac1aab4 100644 --- a/RainmeterStudio/app.config +++ b/RainmeterStudio/app.config @@ -22,6 +22,21 @@ Ctrl+W + + 800 + + + 600 + + + Normal + + + 10 + + + 10 +